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-05-19 10:33:21 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-05-19 10:33:21 +0300
commit36a59d088eca61b834191dacea009677a96c052f (patch)
treee4f33972dab5d8ef79e3944a9f403035fceea43f
parenta1761f15ec2cae7c7f7bbda39a75494add0dfd6f (diff)
Add latest changes from gitlab-org/gitlab@15-0-stable-eev15.0.0-rc42
-rw-r--r--.eslintrc.yml14
-rw-r--r--.gitlab-ci.yml2
-rw-r--r--.gitlab/CODEOWNERS466
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml39
-rw-r--r--.gitlab/ci/qa.gitlab-ci.yml17
-rw-r--r--.gitlab/ci/rails.gitlab-ci.yml213
-rw-r--r--.gitlab/ci/reports.gitlab-ci.yml11
-rw-r--r--.gitlab/ci/review-apps/main.gitlab-ci.yml1
-rw-r--r--.gitlab/ci/review-apps/qa.gitlab-ci.yml94
-rw-r--r--.gitlab/ci/rules.gitlab-ci.yml47
-rw-r--r--.gitlab/ci/static-analysis.gitlab-ci.yml6
-rw-r--r--.gitlab/ci/test-metadata.gitlab-ci.yml3
-rw-r--r--.gitlab/issue_templates/Default.md2
-rw-r--r--.gitlab/issue_templates/Feature Flag Cleanup.md3
-rw-r--r--.gitlab/issue_templates/Feature Flag Roll Out.md7
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new Git repository type.md62
-rw-r--r--.gitlab/issue_templates/Geo Replicate a new blob type.md64
-rw-r--r--.gitlab/issue_templates/Security developer workflow.md1
-rw-r--r--.gitlab/merge_request_templates/Default.md2
-rw-r--r--.gitlab/merge_request_templates/Documentation.md2
-rw-r--r--.gitlab/merge_request_templates/Removals.md9
-rw-r--r--.gitpod.yml2
-rw-r--r--.haml-lint.yml3
-rw-r--r--.projections.json.example77
-rw-r--r--.rubocop.yml42
-rw-r--r--.rubocop_todo.yml414
-rw-r--r--.rubocop_todo/database/multiple_databases.yml55
-rw-r--r--.rubocop_todo/gitlab/namespaced_class.yml2518
-rw-r--r--.rubocop_todo/gitlab/policy_rule_boolean.yml4
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml2
-rw-r--r--.rubocop_todo/layout/first_hash_element_indentation.yml1
-rw-r--r--.rubocop_todo/layout/hash_alignment.yml6
-rw-r--r--.rubocop_todo/layout/line_length.yml17
-rw-r--r--.rubocop_todo/layout/space_in_lambda_literal.yml1
-rw-r--r--.rubocop_todo/layout/space_inside_block_braces.yml4
-rw-r--r--.rubocop_todo/layout/space_inside_parens.yml1
-rw-r--r--.rubocop_todo/lint/missing_cop_enable_directive.yml1
-rw-r--r--.rubocop_todo/lint/mixed_regexp_capture_types.yml16
-rw-r--r--.rubocop_todo/lint/redundant_cop_disable_directive.yml211
-rw-r--r--.rubocop_todo/migration/background_migration_base_class.yml92
-rw-r--r--.rubocop_todo/migration/background_migration_record.yml55
-rw-r--r--.rubocop_todo/naming/heredoc_delimiter_naming.yml141
-rw-r--r--.rubocop_todo/naming/rescued_exceptions_variable_name.yml222
-rw-r--r--.rubocop_todo/performance/block_given_with_explicit_block.yml44
-rw-r--r--.rubocop_todo/performance/collection_literal_in_loop.yml38
-rw-r--r--.rubocop_todo/performance/constant_regexp.yml32
-rw-r--r--.rubocop_todo/performance/method_object_as_block.yml99
-rw-r--r--.rubocop_todo/rails/active_record_callbacks_order.yml28
-rw-r--r--.rubocop_todo/rails/application_controller.yml13
-rw-r--r--.rubocop_todo/rails/content_tag.yml63
-rw-r--r--.rubocop_todo/rails/create_table_with_timestamps.yml69
-rw-r--r--.rubocop_todo/rails/file_path.yml145
-rw-r--r--.rubocop_todo/rails/has_many_or_has_one_dependent.yml154
-rw-r--r--.rubocop_todo/rails/helper_instance_variable.yml85
-rw-r--r--.rubocop_todo/rails/index_with.yml52
-rw-r--r--.rubocop_todo/rails/inverse_of.yml115
-rw-r--r--.rubocop_todo/rails/lexically_scoped_action_filter.yml48
-rw-r--r--.rubocop_todo/rails/mailer_name.yml5
-rw-r--r--.rubocop_todo/rails/negate_include.yml58
-rw-r--r--.rubocop_todo/rails/pick.yml43
-rw-r--r--.rubocop_todo/rails/pluck.yml109
-rw-r--r--.rubocop_todo/rails/rake_environment.yml25
-rw-r--r--.rubocop_todo/rails/redundant_foreign_key.yml66
-rw-r--r--.rubocop_todo/rails/skips_model_validations.yml748
-rw-r--r--.rubocop_todo/rails/squished_sql_heredocs.yml217
-rw-r--r--.rubocop_todo/rails/time_zone.yml2
-rw-r--r--.rubocop_todo/rails/where_exists.yml45
-rw-r--r--.rubocop_todo/rspec/any_instance_of.yml6
-rw-r--r--.rubocop_todo/rspec/context_wording.yml3925
-rw-r--r--.rubocop_todo/rspec/expect_change.yml635
-rw-r--r--.rubocop_todo/rspec/expect_in_hook.yml544
-rw-r--r--.rubocop_todo/rspec/predicate_matcher.yml516
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_body.yml68
-rw-r--r--.rubocop_todo/rspec/repeated_example_group_description.yml115
-rw-r--r--.rubocop_todo/rspec/return_from_stub.yml319
-rw-r--r--.rubocop_todo/rspec/scattered_let.yml285
-rw-r--r--.rubocop_todo/rspec/timecop_travel.yml6
-rw-r--r--.rubocop_todo/rspec/verified_doubles.yml24
-rw-r--r--.rubocop_todo/style/accessor_grouping.yml78
-rw-r--r--.rubocop_todo/style/bare_percent_literals.yml115
-rw-r--r--.rubocop_todo/style/case_like_if.yml63
-rw-r--r--.rubocop_todo/style/class_and_module_children.yml587
-rw-r--r--.rubocop_todo/style/empty_else.yml60
-rw-r--r--.rubocop_todo/style/empty_method.yml196
-rw-r--r--.rubocop_todo/style/explicit_block_argument.yml114
-rw-r--r--.rubocop_todo/style/format_string.yml360
-rw-r--r--.rubocop_todo/style/guard_clause.yml719
-rw-r--r--.rubocop_todo/style/hash_as_last_array_item.yml62
-rw-r--r--.rubocop_todo/style/hash_each_methods.yml91
-rw-r--r--.rubocop_todo/style/if_inside_else.yml49
-rw-r--r--.rubocop_todo/style/if_unless_modifier.yml1276
-rw-r--r--.rubocop_todo/style/keyword_parameters_order.yml72
-rw-r--r--.rubocop_todo/style/lambda.yml274
-rw-r--r--.rubocop_todo/style/missing_respond_to_missing.yml27
-rw-r--r--.rubocop_todo/style/next.yml46
-rw-r--r--.rubocop_todo/style/numeric_literal_prefix.yml79
-rw-r--r--.rubocop_todo/style/percent_literal_delimiters.yml1231
-rw-r--r--.rubocop_todo/style/redundant_interpolation.yml164
-rw-r--r--.rubocop_todo/style/redundant_regexp_escape.yml114
-rw-r--r--.rubocop_todo/style/redundant_self.yml426
-rw-r--r--.rubocop_todo/style/rescue_modifier.yml51
-rw-r--r--.rubocop_todo/style/single_argument_dig.yml64
-rw-r--r--.rubocop_todo/style/sole_nested_conditional.yml64
-rw-r--r--.rubocop_todo/style/string_concatenation.yml336
-rw-r--r--.rubocop_todo/style/string_literals_in_interpolation.yml69
-rw-r--r--.rubocop_todo/style/symbol_proc.yml280
-rw-r--r--.solargraph.yml.example15
-rw-r--r--CHANGELOG.md39
-rw-r--r--CONTRIBUTING.md13
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_ELASTICSEARCH_INDEXER_VERSION2
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--GITLAB_METRICS_EXPORTER_VERSION1
-rw-r--r--GITLAB_PAGES_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--Gemfile15
-rw-r--r--Gemfile.lock72
-rw-r--r--README.md6
-rw-r--r--app/assets/images/apple-touch-icon.pngbin0 -> 7455 bytes
-rw-r--r--app/assets/images/ext_snippet_icons/logo.svg13
-rw-r--r--app/assets/images/favicon-blue.pngbin1522 -> 390 bytes
-rw-r--r--app/assets/images/favicon-yellow.pngbin1481 -> 373 bytes
-rw-r--r--app/assets/images/favicon.pngbin1611 -> 591 bytes
-rw-r--r--app/assets/images/file_icons.svg2
-rw-r--r--app/assets/images/gitlab_logo.pngbin3616 -> 1528 bytes
-rw-r--r--app/assets/images/logo.svg34
-rw-r--r--app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gifbin3654 -> 0 bytes
-rw-r--r--app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo.gifbin3040 -> 0 bytes
-rw-r--r--app/assets/images/mailers/gitlab_footer_logo.gifbin3654 -> 0 bytes
-rw-r--r--app/assets/images/mailers/gitlab_header_logo.gifbin3040 -> 0 bytes
-rw-r--r--app/assets/images/mailers/gitlab_header_logo.pngbin7096 -> 0 bytes
-rw-r--r--app/assets/images/mailers/gitlab_logo.pngbin0 -> 1528 bytes
-rw-r--r--app/assets/images/mailers/gitlab_logo_black_text.pngbin0 -> 1961 bytes
-rw-r--r--app/assets/images/mailers/gitlab_tanuki_2x.pngbin2545 -> 0 bytes
-rw-r--r--app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.pngbin42439 -> 0 bytes
-rw-r--r--app/assets/images/msapplication-tile.pngbin4328 -> 0 bytes
-rw-r--r--app/assets/images/touch-icon-ipad-retina.pngbin5662 -> 0 bytes
-rw-r--r--app/assets/images/touch-icon-ipad.pngbin2465 -> 0 bytes
-rw-r--r--app/assets/images/touch-icon-iphone-retina.pngbin3460 -> 0 bytes
-rw-r--r--app/assets/images/touch-icon-iphone.pngbin1949 -> 0 bytes
-rw-r--r--app/assets/images/twitter_card.jpgbin0 -> 133437 bytes
-rw-r--r--app/assets/javascripts/access_tokens/components/projects_token_selector.vue2
-rw-r--r--app/assets/javascripts/admin/background_migrations/components/database_listbox.vue51
-rw-r--r--app/assets/javascripts/admin/background_migrations/index.js38
-rw-r--r--app/assets/javascripts/admin/statistics_panel/components/app.vue2
-rw-r--r--app/assets/javascripts/alert_management/components/alert_management_table.vue18
-rw-r--r--app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue2
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql2
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql4
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql4
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql2
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql8
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql6
-rw-r--r--app/assets/javascripts/alerts_settings/graphql/queries/get_http_integration.query.graphql2
-rw-r--r--app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue33
-rw-r--r--app/assets/javascripts/analytics/shared/components/value_stream_metrics.vue72
-rw-r--r--app/assets/javascripts/analytics/shared/constants.js36
-rw-r--r--app/assets/javascripts/analytics/usage_trends/components/users_chart.vue6
-rw-r--r--app/assets/javascripts/api.js25
-rw-r--r--app/assets/javascripts/api/integrations_api.js21
-rw-r--r--app/assets/javascripts/api/tags_api.js12
-rw-r--r--app/assets/javascripts/api/user_api.js18
-rw-r--r--app/assets/javascripts/behaviors/copy_to_clipboard.js2
-rw-r--r--app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js15
-rw-r--r--app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js2
-rw-r--r--app/assets/javascripts/blob/components/blob_content.vue2
-rw-r--r--app/assets/javascripts/blob/components/blob_header.vue2
-rw-r--r--app/assets/javascripts/blob/file_template_selector.js43
-rw-r--r--app/assets/javascripts/blob/openapi/index.js1
-rw-r--r--app/assets/javascripts/blob/pipeline_tour_success_modal.vue2
-rw-r--r--app/assets/javascripts/blob/sketch/index.js2
-rw-r--r--app/assets/javascripts/blob_edit/edit_blob.js29
-rw-r--r--app/assets/javascripts/boards/components/board_add_new_column_form.vue26
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue21
-rw-r--r--app/assets/javascripts/boards/components/board_content.vue5
-rw-r--r--app/assets/javascripts/boards/components/board_filtered_search.vue15
-rw-r--r--app/assets/javascripts/boards/components/board_form.vue1
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue2
-rw-r--r--app/assets/javascripts/boards/components/board_list_header.vue27
-rw-r--r--app/assets/javascripts/boards/components/board_settings_sidebar.vue8
-rw-r--r--app/assets/javascripts/boards/components/board_top_bar.vue4
-rw-r--r--app/assets/javascripts/boards/components/config_toggle.vue4
-rw-r--r--app/assets/javascripts/boards/components/project_select.vue7
-rw-r--r--app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue2
-rw-r--r--app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql2
-rw-r--r--app/assets/javascripts/boards/graphql/board_list_destroy.mutation.graphql2
-rw-r--r--app/assets/javascripts/boards/graphql/board_list_update.mutation.graphql4
-rw-r--r--app/assets/javascripts/boards/graphql/board_lists.query.graphql6
-rw-r--r--app/assets/javascripts/boards/graphql/board_lists_deferred.query.graphql2
-rw-r--r--app/assets/javascripts/boards/graphql/group_board.query.graphql2
-rw-r--r--app/assets/javascripts/boards/graphql/issue_move_list.mutation.graphql2
-rw-r--r--app/assets/javascripts/boards/graphql/lists_issues.query.graphql4
-rw-r--r--app/assets/javascripts/boards/graphql/project_board.query.graphql2
-rw-r--r--app/assets/javascripts/boards/index.js1
-rw-r--r--app/assets/javascripts/boards/stores/actions.js5
-rw-r--r--app/assets/javascripts/boards/stores/getters.js14
-rw-r--r--app/assets/javascripts/branches/components/delete_branch_modal.vue37
-rw-r--r--app/assets/javascripts/captcha/captcha_modal.vue4
-rw-r--r--app/assets/javascripts/ci_secure_files/components/secure_files_list.vue202
-rw-r--r--app/assets/javascripts/ci_secure_files/index.js5
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue23
-rw-r--r--app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue5
-rw-r--r--app/assets/javascripts/ci_variable_list/constants.js2
-rw-r--r--app/assets/javascripts/ci_variable_list/index.js2
-rw-r--r--app/assets/javascripts/clone_panel.js7
-rw-r--r--app/assets/javascripts/clusters/agents/components/activity_events_list.vue16
-rw-r--r--app/assets/javascripts/clusters/agents/components/revoke_token_button.vue201
-rw-r--r--app/assets/javascripts/clusters/agents/components/show.vue2
-rw-r--r--app/assets/javascripts/clusters/agents/components/token_table.vue11
-rw-r--r--app/assets/javascripts/clusters/agents/constants.js2
-rw-r--r--app/assets/javascripts/clusters/agents/graphql/cache_update.js22
-rw-r--r--app/assets/javascripts/clusters/agents/graphql/mutations/revoke_token.mutation.graphql5
-rw-r--r--app/assets/javascripts/clusters/components/new_cluster.vue8
-rw-r--r--app/assets/javascripts/clusters/components/remove_cluster_confirmation.vue2
-rw-r--r--app/assets/javascripts/clusters/forms/components/integration_form.vue2
-rw-r--r--app/assets/javascripts/clusters/gke_cluster_namespace/index.js (renamed from app/assets/javascripts/create_cluster/gke_cluster_namespace/index.js)0
-rw-r--r--app/assets/javascripts/clusters/new_cluster.js8
-rw-r--r--app/assets/javascripts/clusters/stores/new_cluster/index.js12
-rw-r--r--app/assets/javascripts/clusters/stores/new_cluster/state.js3
-rw-r--r--app/assets/javascripts/clusters_list/components/agent_table.vue17
-rw-r--r--app/assets/javascripts/clusters_list/components/agents.vue2
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters.vue4
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_actions.vue79
-rw-r--r--app/assets/javascripts/clusters_list/components/clusters_view_all.vue2
-rw-r--r--app/assets/javascripts/clusters_list/constants.js4
-rw-r--r--app/assets/javascripts/clusters_list/index.js4
-rw-r--r--app/assets/javascripts/commit/pipelines/pipelines_table.vue1
-rw-r--r--app/assets/javascripts/confidential_merge_request/components/project_form_group.vue6
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/code_block.vue160
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue108
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/link.vue189
-rw-r--r--app/assets/javascripts/content_editor/components/bubble_menus/media.vue288
-rw-r--r--app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue146
-rw-r--r--app/assets/javascripts/content_editor/components/content_editor.vue10
-rw-r--r--app/assets/javascripts/content_editor/components/divider.vue3
-rw-r--r--app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue84
-rw-r--r--app/assets/javascripts/content_editor/components/loading_indicator.vue2
-rw-r--r--app/assets/javascripts/content_editor/components/toolbar_button.vue9
-rw-r--r--app/assets/javascripts/content_editor/components/top_toolbar.vue7
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/code_block.vue44
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue32
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/media.vue51
-rw-r--r--app/assets/javascripts/content_editor/components/wrappers/table_cell_base.vue4
-rw-r--r--app/assets/javascripts/content_editor/constants/code_block_languages.js210
-rw-r--r--app/assets/javascripts/content_editor/constants/index.js (renamed from app/assets/javascripts/content_editor/constants.js)0
-rw-r--r--app/assets/javascripts/content_editor/extensions/blockquote.js2
-rw-r--r--app/assets/javascripts/content_editor/extensions/code_block_highlight.js17
-rw-r--r--app/assets/javascripts/content_editor/extensions/diagram.js3
-rw-r--r--app/assets/javascripts/content_editor/extensions/frontmatter.js15
-rw-r--r--app/assets/javascripts/content_editor/extensions/image.js5
-rw-r--r--app/assets/javascripts/content_editor/extensions/paste_markdown.js11
-rw-r--r--app/assets/javascripts/content_editor/extensions/playable.js6
-rw-r--r--app/assets/javascripts/content_editor/extensions/sourcemap.js48
-rw-r--r--app/assets/javascripts/content_editor/services/asset_resolver.js13
-rw-r--r--app/assets/javascripts/content_editor/services/code_block_language_loader.js246
-rw-r--r--app/assets/javascripts/content_editor/services/content_editor.js46
-rw-r--r--app/assets/javascripts/content_editor/services/create_content_editor.js24
-rw-r--r--app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js33
-rw-r--r--app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js475
-rw-r--r--app/assets/javascripts/content_editor/services/highlight_js_language_loader.js248
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_deserializer.js33
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_serializer.js115
-rw-r--r--app/assets/javascripts/content_editor/services/markdown_sourcemap.js2
-rw-r--r--app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js87
-rw-r--r--app/assets/javascripts/content_editor/services/serialization_helpers.js131
-rw-r--r--app/assets/javascripts/content_editor/services/upload_helpers.js4
-rw-r--r--app/assets/javascripts/content_editor/services/utils.js2
-rw-r--r--app/assets/javascripts/create_cluster/components/cluster_form_dropdown.vue246
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/components/create_eks_cluster.vue58
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue530
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/components/service_credentials_form.vue182
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/constants.js9
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/index.js55
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/services/aws_services_facade.js79
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/actions.js148
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/getters.js2
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/index.js49
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/mutation_types.js19
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/mutations.js66
-rw-r--r--app/assets/javascripts/create_cluster/eks_cluster/store/state.js34
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_dropdown_mixin.js70
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue112
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue53
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue194
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_submit_button.vue18
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue44
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue101
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/constants.js11
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/gapi_loader.js24
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/index.js95
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/actions.js99
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/getters.js5
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/index.js18
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/mutation_types.js8
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/mutations.js28
-rw-r--r--app/assets/javascripts/create_cluster/gke_cluster/store/state.js13
-rw-r--r--app/assets/javascripts/create_cluster/init_create_cluster.js35
-rw-r--r--app/assets/javascripts/create_cluster/store/cluster_dropdown/actions.js14
-rw-r--r--app/assets/javascripts/create_cluster/store/cluster_dropdown/index.js13
-rw-r--r--app/assets/javascripts/create_cluster/store/cluster_dropdown/mutation_types.js3
-rw-r--r--app/assets/javascripts/create_cluster/store/cluster_dropdown/mutations.js16
-rw-r--r--app/assets/javascripts/create_cluster/store/cluster_dropdown/state.js5
-rw-r--r--app/assets/javascripts/crm/components/form.vue39
-rw-r--r--app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue58
-rw-r--r--app/assets/javascripts/crm/contacts/components/contacts_root.vue2
-rw-r--r--app/assets/javascripts/crm/organizations/components/organizations_root.vue2
-rw-r--r--app/assets/javascripts/cycle_analytics/components/base.vue21
-rw-r--r--app/assets/javascripts/cycle_analytics/components/stage_table.vue2
-rw-r--r--app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue57
-rw-r--r--app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue4
-rw-r--r--app/assets/javascripts/design_management/graphql/mutations/toggle_resolve_discussion.mutation.graphql2
-rw-r--r--app/assets/javascripts/design_management/graphql/mutations/upload_design.mutation.graphql1
-rw-r--r--app/assets/javascripts/design_management/graphql/queries/get_design.query.graphql1
-rw-r--r--app/assets/javascripts/design_management/pages/design/index.vue4
-rw-r--r--app/assets/javascripts/diffs/components/app.vue13
-rw-r--r--app/assets/javascripts/diffs/components/compare_dropdown_layout.vue7
-rw-r--r--app/assets/javascripts/diffs/components/compare_versions.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_content.vue2
-rw-r--r--app/assets/javascripts/diffs/components/diff_expansion_cell.vue158
-rw-r--r--app/assets/javascripts/diffs/components/diff_file.vue106
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue4
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue7
-rw-r--r--app/assets/javascripts/diffs/components/diff_row.vue8
-rw-r--r--app/assets/javascripts/diffs/components/diff_row_utils.js7
-rw-r--r--app/assets/javascripts/diffs/components/diff_view.vue85
-rw-r--r--app/assets/javascripts/diffs/components/hidden_files_warning.vue2
-rw-r--r--app/assets/javascripts/diffs/components/image_diff_overlay.vue4
-rw-r--r--app/assets/javascripts/diffs/constants.js3
-rw-r--r--app/assets/javascripts/diffs/store/mutations.js2
-rw-r--r--app/assets/javascripts/diffs/store/utils.js10
-rw-r--r--app/assets/javascripts/diffs/utils/diff_file.js27
-rw-r--r--app/assets/javascripts/diffs/utils/queue_events.js26
-rw-r--r--app/assets/javascripts/editor/components/source_editor_toolbar.vue6
-rw-r--r--app/assets/javascripts/editor/components/source_editor_toolbar_button.vue74
-rw-r--r--app/assets/javascripts/editor/components/source_editor_toolbar_graphql.js53
-rw-r--r--app/assets/javascripts/editor/constants.js5
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_extension_base.js4
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js108
-rw-r--r--app/assets/javascripts/editor/extensions/source_editor_toolbar_ext.js98
-rw-r--r--app/assets/javascripts/editor/graphql/add_items.mutation.graphql3
-rw-r--r--app/assets/javascripts/editor/graphql/get_item.query.graphql9
-rw-r--r--app/assets/javascripts/editor/graphql/remove_items.mutation.graphql3
-rw-r--r--app/assets/javascripts/editor/graphql/typedefs.graphql23
-rw-r--r--app/assets/javascripts/editor/graphql/update_item.mutation.graphql2
-rw-r--r--app/assets/javascripts/editor/schema/ci.json21
-rw-r--r--app/assets/javascripts/environments/components/enable_review_app_modal.vue13
-rw-r--r--app/assets/javascripts/environments/components/environment_folder.vue8
-rw-r--r--app/assets/javascripts/environments/components/environments_table.vue2
-rw-r--r--app/assets/javascripts/environments/folder/environments_folder_view.vue4
-rw-r--r--app/assets/javascripts/error_tracking/components/error_tracking_list.vue2
-rw-r--r--app/assets/javascripts/error_tracking/queries/details.query.graphql2
-rw-r--r--app/assets/javascripts/error_tracking_settings/components/app.vue2
-rw-r--r--app/assets/javascripts/filtered_search/available_dropdown_mappings.js27
-rw-r--r--app/assets/javascripts/filtered_search/constants.js2
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js2
-rw-r--r--app/assets/javascripts/filtered_search/filtered_search_manager.js4
-rw-r--r--app/assets/javascripts/filtered_search/group_runners_filtered_search_token_keys.js27
-rw-r--r--app/assets/javascripts/filtered_search/null_dropdown.js9
-rw-r--r--app/assets/javascripts/flash.js86
-rw-r--r--app/assets/javascripts/frequent_items/constants.js2
-rw-r--r--app/assets/javascripts/frequent_items/utils.js5
-rw-r--r--app/assets/javascripts/gfm_auto_complete.js2
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql1
-rw-r--r--app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql1
-rw-r--r--app/assets/javascripts/graphql_shared/mutations/todo_mark_done.mutation.graphql2
-rw-r--r--app/assets/javascripts/graphql_shared/possible_types.json4
-rw-r--r--app/assets/javascripts/group.js37
-rw-r--r--app/assets/javascripts/group_settings/components/shared_runners_form.vue128
-rw-r--r--app/assets/javascripts/group_settings/constants.js3
-rw-r--r--app/assets/javascripts/group_settings/mount_shared_runners.js20
-rw-r--r--app/assets/javascripts/header_search/components/app.vue4
-rw-r--r--app/assets/javascripts/header_search/index.js16
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/form.vue4
-rw-r--r--app/assets/javascripts/ide/components/ide_status_bar.vue2
-rw-r--r--app/assets/javascripts/import_entities/components/import_status.vue5
-rw-r--r--app/assets/javascripts/import_entities/constants.js1
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_table.vue23
-rw-r--r--app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue1
-rw-r--r--app/assets/javascripts/import_entities/import_groups/constants.js2
-rw-r--r--app/assets/javascripts/import_entities/import_groups/index.js2
-rw-r--r--app/assets/javascripts/import_entities/import_groups/utils.js2
-rw-r--r--app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue16
-rw-r--r--app/assets/javascripts/incidents/components/incidents_list.vue9
-rw-r--r--app/assets/javascripts/incidents/graphql/fragments/incident_fields.fragment.graphql1
-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/jira_issues_fields.vue104
-rw-r--r--app/assets/javascripts/integrations/edit/index.js2
-rw-r--r--app/assets/javascripts/invite_members/components/import_a_project_modal.vue2
-rw-r--r--app/assets/javascripts/invite_members/components/invite_members_modal.vue26
-rw-r--r--app/assets/javascripts/invite_members/components/invite_modal_base.vue171
-rw-r--r--app/assets/javascripts/invite_members/components/members_token_select.vue4
-rw-r--r--app/assets/javascripts/invite_members/components/user_limit_notification.vue75
-rw-r--r--app/assets/javascripts/invite_members/constants.js32
-rw-r--r--app/assets/javascripts/invite_members/init_invite_members_modal.js9
-rw-r--r--app/assets/javascripts/issuable/components/issuable_header_warnings.vue27
-rw-r--r--app/assets/javascripts/issuable/components/related_issuable_item.vue2
-rw-r--r--app/assets/javascripts/issuable/components/status_box.vue91
-rw-r--r--app/assets/javascripts/issuable/issuable_form.js3
-rw-r--r--app/assets/javascripts/issues/create_merge_request_dropdown.js9
-rw-r--r--app/assets/javascripts/issues/issue.js4
-rw-r--r--app/assets/javascripts/issues/list/components/issues_list_app.vue109
-rw-r--r--app/assets/javascripts/issues/list/constants.js29
-rw-r--r--app/assets/javascripts/issues/list/index.js18
-rw-r--r--app/assets/javascripts/issues/list/queries/get_issues.query.graphql7
-rw-r--r--app/assets/javascripts/issues/list/queries/get_issues_counts.query.graphql14
-rw-r--r--app/assets/javascripts/issues/list/queries/get_issues_counts_without_crm.query.graphql136
-rw-r--r--app/assets/javascripts/issues/list/queries/get_issues_without_crm.query.graphql94
-rw-r--r--app/assets/javascripts/issues/list/queries/issue.fragment.graphql4
-rw-r--r--app/assets/javascripts/issues/list/utils.js25
-rw-r--r--app/assets/javascripts/issues/show/components/app.vue90
-rw-r--r--app/assets/javascripts/issues/show/components/description.vue156
-rw-r--r--app/assets/javascripts/issues/show/index.js2
-rw-r--r--app/assets/javascripts/issues/show/utils.js99
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/api.js10
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue52
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/app.vue48
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue21
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue10
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/constants.js17
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/index.js7
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in.vue65
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue68
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue72
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue88
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue35
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions.vue43
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions_page.vue54
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/store/actions.js73
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/store/index.js11
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/store/mutation_types.js12
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/store/mutations.js40
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/store/state.js20
-rw-r--r--app/assets/javascripts/jira_import/components/jira_import_form.vue5
-rw-r--r--app/assets/javascripts/jobs/components/job_app.vue4
-rw-r--r--app/assets/javascripts/jobs/components/sidebar.vue1
-rw-r--r--app/assets/javascripts/jobs/components/sidebar_job_details_container.vue27
-rw-r--r--app/assets/javascripts/jobs/components/stuck_block.vue4
-rw-r--r--app/assets/javascripts/jobs/components/table/cells/actions_cell.vue13
-rw-r--r--app/assets/javascripts/jobs/components/table/graphql/fragments/job.fragment.graphql4
-rw-r--r--app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue4
-rw-r--r--app/assets/javascripts/jobs/store/getters.js12
-rw-r--r--app/assets/javascripts/lib/dompurify.js1
-rw-r--r--app/assets/javascripts/lib/gfm/index.js4
-rw-r--r--app/assets/javascripts/lib/utils/common_utils.js58
-rw-r--r--app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue20
-rw-r--r--app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js4
-rw-r--r--app/assets/javascripts/lib/utils/cookies.js8
-rw-r--r--app/assets/javascripts/lib/utils/datetime/timeago_utility.js2
-rw-r--r--app/assets/javascripts/lib/utils/dom_utils.js14
-rw-r--r--app/assets/javascripts/lib/utils/http_status.js1
-rw-r--r--app/assets/javascripts/lib/utils/text_markdown.js17
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js4
-rw-r--r--app/assets/javascripts/lib/utils/url_utility.js13
-rw-r--r--app/assets/javascripts/lib/utils/users_cache.js11
-rw-r--r--app/assets/javascripts/main.js10
-rw-r--r--app/assets/javascripts/members/components/table/members_table.vue2
-rw-r--r--app/assets/javascripts/merge_request.js31
-rw-r--r--app/assets/javascripts/merge_request_tabs.js47
-rw-r--r--app/assets/javascripts/milestones/components/milestone_combobox.vue2
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard.vue4
-rw-r--r--app/assets/javascripts/monitoring/components/dashboard_panel.vue5
-rw-r--r--app/assets/javascripts/mr_notes/index.js8
-rw-r--r--app/assets/javascripts/notes/components/comment_form.vue22
-rw-r--r--app/assets/javascripts/notes/components/comment_type_dropdown.vue48
-rw-r--r--app/assets/javascripts/notes/components/diff_discussion_header.vue5
-rw-r--r--app/assets/javascripts/notes/components/discussion_counter.vue113
-rw-r--r--app/assets/javascripts/notes/components/note_body.vue5
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue9
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue25
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue20
-rw-r--r--app/assets/javascripts/notes/components/noteable_note.vue20
-rw-r--r--app/assets/javascripts/notes/i18n.js14
-rw-r--r--app/assets/javascripts/notes/stores/actions.js17
-rw-r--r--app/assets/javascripts/notes/stores/getters.js33
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/delete_modal.vue8
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue4
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue64
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list.vue6
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list_row.vue17
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue10
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/details.js2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/list.js3
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_details.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue6
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/utils.js8
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue90
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifest_row.vue24
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql1
-rw-r--r--app/assets/javascripts/packages_and_registries/dependency_proxy/index.js4
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue5
-rw-r--r--app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/infrastructure_search.vue2
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/details/package_title.vue4
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue82
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_title.vue8
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue40
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql1
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_details.query.graphql2
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/bundle.js1
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/dependency_proxy_settings.vue15
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue3
-rw-r--r--app/assets/javascripts/packages_and_registries/settings/group/constants.js5
-rw-r--r--app/assets/javascripts/pages/admin/application_settings/general/components/signup_form.vue76
-rw-r--r--app/assets/javascripts/pages/admin/background_migrations/index.js3
-rw-r--r--app/assets/javascripts/pages/admin/clusters/index.js3
-rw-r--r--app/assets/javascripts/pages/groups/clusters/index.js2
-rw-r--r--app/assets/javascripts/pages/groups/new/components/app.vue4
-rw-r--r--app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js15
-rw-r--r--app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue16
-rw-r--r--app/assets/javascripts/pages/projects/clusters/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/clusters/show/index.js2
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue41
-rw-r--r--app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/merge_requests/init_merge_request_show.js28
-rw-r--r--app/assets/javascripts/pages/projects/project.js20
-rw-r--r--app/assets/javascripts/pages/projects/serverless/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/services/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/show/index.js55
-rw-r--r--app/assets/javascripts/pages/projects/wikis/edit/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/wikis/index.js3
-rw-r--r--app/assets/javascripts/pages/projects/wikis/show/index.js2
-rw-r--r--app/assets/javascripts/pages/registrations/new/index.js5
-rw-r--r--app/assets/javascripts/persistent_user_callouts.js1
-rw-r--r--app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue26
-rw-r--r--app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue13
-rw-r--r--app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue4
-rw-r--r--app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue48
-rw-r--r--app/assets/javascripts/pipeline_editor/components/file_tree/container.vue78
-rw-r--r--app/assets/javascripts/pipeline_editor/components/file_tree/file_item.vue45
-rw-r--r--app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue22
-rw-r--r--app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue2
-rw-r--r--app/assets/javascripts/pipeline_editor/components/popovers/file_tree_popover.vue59
-rw-r--r--app/assets/javascripts/pipeline_editor/components/popovers/walkthrough_popover.vue83
-rw-r--r--app/assets/javascripts/pipeline_editor/components/walkthrough_popover.vue83
-rw-r--r--app/assets/javascripts/pipeline_editor/constants.js4
-rw-r--r--app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.query.graphql6
-rw-r--r--app/assets/javascripts/pipeline_editor/index.js4
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue3
-rw-r--r--app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue67
-rw-r--r--app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue2
-rw-r--r--app/assets/javascripts/pipeline_new/index.js2
-rw-r--r--app/assets/javascripts/pipelines/components/dag/dag.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/constants.js4
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component.vue1
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue60
-rw-r--r--app/assets/javascripts/pipelines/components/graph/job_item.vue22
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue151
-rw-r--r--app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue10
-rw-r--r--app/assets/javascripts/pipelines/components/header_component.vue17
-rw-r--r--app/assets/javascripts/pipelines/components/jobs/failed_jobs_app.vue73
-rw-r--r--app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue111
-rw-r--r--app/assets/javascripts/pipelines/components/jobs/utils.js33
-rw-r--r--app/assets/javascripts/pipelines/components/pipeline_tabs.vue40
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue24
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue37
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ios_templates.vue220
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue14
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue2
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue29
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue10
-rw-r--r--app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue5
-rw-r--r--app/assets/javascripts/pipelines/components/test_reports/test_suite_table.vue16
-rw-r--r--app/assets/javascripts/pipelines/constants.js47
-rw-r--r--app/assets/javascripts/pipelines/graphql/mutations/retry_failed_job.mutation.graphql12
-rw-r--r--app/assets/javascripts/pipelines/graphql/provider.js9
-rw-r--r--app/assets/javascripts/pipelines/graphql/queries/get_failed_jobs.query.graphql41
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_bundle.js14
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_dag.js2
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_failed_jobs.js36
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_header.js2
-rw-r--r--app/assets/javascripts/pipelines/pipeline_details_notification.js2
-rw-r--r--app/assets/javascripts/pipelines/pipeline_tabs.js27
-rw-r--r--app/assets/javascripts/pipelines/pipelines_index.js8
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/actions.js6
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/constants.js1
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/getters.js4
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/mutation_types.js1
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/mutations.js14
-rw-r--r--app/assets/javascripts/pipelines/stores/test_reports/state.js1
-rw-r--r--app/assets/javascripts/pipelines/utils.js19
-rw-r--r--app/assets/javascripts/project_select_combo_button.js3
-rw-r--r--app/assets/javascripts/projects/commit_box/info/components/commit_box_pipeline_mini_graph.vue14
-rw-r--r--app/assets/javascripts/projects/project_new.js5
-rw-r--r--app/assets/javascripts/projects/settings/init_access_dropdown.js2
-rw-r--r--app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue2
-rw-r--r--app/assets/javascripts/projects/settings/topics/queries/project_topics_search.query.graphql1
-rw-r--r--app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue24
-rw-r--r--app/assets/javascripts/prometheus_alerts/components/reset_key.vue149
-rw-r--r--app/assets/javascripts/prometheus_alerts/index.js28
-rw-r--r--app/assets/javascripts/related_issues/components/add_issuable_form.vue5
-rw-r--r--app/assets/javascripts/related_issues/components/related_issues_root.vue3
-rw-r--r--app/assets/javascripts/releases/components/app_edit_new.vue38
-rw-r--r--app/assets/javascripts/releases/components/tag_field_new.vue15
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/actions.js22
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/getters.js22
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutation_types.js6
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/mutations.js18
-rw-r--r--app/assets/javascripts/releases/stores/modules/edit_new/state.js6
-rw-r--r--app/assets/javascripts/reports/codequality_report/store/getters.js14
-rw-r--r--app/assets/javascripts/repository/components/blob_content_viewer.vue19
-rw-r--r--app/assets/javascripts/repository/components/breadcrumbs.vue5
-rw-r--r--app/assets/javascripts/repository/components/last_commit.vue29
-rw-r--r--app/assets/javascripts/repository/constants.js21
-rw-r--r--app/assets/javascripts/repository/index.js8
-rw-r--r--app/assets/javascripts/rest_api.js1
-rw-r--r--app/assets/javascripts/right_sidebar.js27
-rw-r--r--app/assets/javascripts/runner/admin_runner_edit/admin_runner_edit_app.vue21
-rw-r--r--app/assets/javascripts/runner/admin_runner_edit/index.js3
-rw-r--r--app/assets/javascripts/runner/admin_runner_show/admin_runner_show_app.vue20
-rw-r--r--app/assets/javascripts/runner/admin_runner_show/index.js6
-rw-r--r--app/assets/javascripts/runner/admin_runners/admin_runners_app.vue104
-rw-r--r--app/assets/javascripts/runner/admin_runners/index.js3
-rw-r--r--app/assets/javascripts/runner/components/registration/registration_dropdown.vue2
-rw-r--r--app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue8
-rw-r--r--app/assets/javascripts/runner/components/runner_delete_button.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_details.vue3
-rw-r--r--app/assets/javascripts/runner/components/runner_jobs.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_pagination.vue4
-rw-r--r--app/assets/javascripts/runner/components/runner_projects.vue2
-rw-r--r--app/assets/javascripts/runner/components/runner_update_form.vue210
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner.query.graphql9
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner_details.fragment.graphql5
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner_details_shared.fragment.graphql35
-rw-r--r--app/assets/javascripts/runner/graphql/details/runner_update.mutation.graphql15
-rw-r--r--app/assets/javascripts/runner/graphql/edit/runner_fields.fragment.graphql5
-rw-r--r--app/assets/javascripts/runner/graphql/edit/runner_fields_shared.fragment.graphql15
-rw-r--r--app/assets/javascripts/runner/graphql/edit/runner_form.query.graphql7
-rw-r--r--app/assets/javascripts/runner/graphql/edit/runner_update.mutation.graphql13
-rw-r--r--app/assets/javascripts/runner/graphql/show/runner.query.graphql41
-rw-r--r--app/assets/javascripts/runner/graphql/show/runner_jobs.query.graphql (renamed from app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql)0
-rw-r--r--app/assets/javascripts/runner/graphql/show/runner_projects.query.graphql (renamed from app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql)0
-rw-r--r--app/assets/javascripts/runner/group_runners/group_runners_app.vue111
-rw-r--r--app/assets/javascripts/runner/local_storage_alert/constants.js1
-rw-r--r--app/assets/javascripts/runner/local_storage_alert/save_alert_to_local_storage.js8
-rw-r--r--app/assets/javascripts/runner/local_storage_alert/show_alert_from_local_storage.js18
-rw-r--r--app/assets/javascripts/runner/runner_search_utils.js6
-rw-r--r--app/assets/javascripts/runner/utils.js3
-rw-r--r--app/assets/javascripts/security_configuration/components/app.vue30
-rw-r--r--app/assets/javascripts/security_configuration/components/constants.js8
-rw-r--r--app/assets/javascripts/security_configuration/components/feature_card.vue6
-rw-r--r--app/assets/javascripts/security_configuration/components/section_layout.vue23
-rw-r--r--app/assets/javascripts/security_configuration/graphql/current_license.query.graphql6
-rw-r--r--app/assets/javascripts/security_configuration/graphql/security_training_vulnerability.query.graphql1
-rw-r--r--app/assets/javascripts/security_configuration/index.js1
-rw-r--r--app/assets/javascripts/serverless/components/area.vue145
-rw-r--r--app/assets/javascripts/serverless/components/empty_state.vue39
-rw-r--r--app/assets/javascripts/serverless/components/environment_row.vue65
-rw-r--r--app/assets/javascripts/serverless/components/function_details.vue94
-rw-r--r--app/assets/javascripts/serverless/components/function_row.vue77
-rw-r--r--app/assets/javascripts/serverless/components/functions.vue139
-rw-r--r--app/assets/javascripts/serverless/components/missing_prometheus.vue57
-rw-r--r--app/assets/javascripts/serverless/components/pod_box.vue36
-rw-r--r--app/assets/javascripts/serverless/components/url.vue28
-rw-r--r--app/assets/javascripts/serverless/constants.js10
-rw-r--r--app/assets/javascripts/serverless/event_hub.js3
-rw-r--r--app/assets/javascripts/serverless/serverless_bundle.js67
-rw-r--r--app/assets/javascripts/serverless/store/actions.js131
-rw-r--r--app/assets/javascripts/serverless/store/getters.js7
-rw-r--r--app/assets/javascripts/serverless/store/index.js18
-rw-r--r--app/assets/javascripts/serverless/store/mutation_types.js11
-rw-r--r--app/assets/javascripts/serverless/store/mutations.js49
-rw-r--r--app/assets/javascripts/serverless/store/state.js22
-rw-r--r--app/assets/javascripts/serverless/utils.js20
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue7
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignee_title.vue5
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue20
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue32
-rw-r--r--app/assets/javascripts/sidebar/components/attention_requested_toggle.vue33
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue31
-rw-r--r--app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue16
-rw-r--r--app/assets/javascripts/sidebar/components/date/sidebar_formatted_date.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue55
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue5
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue9
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue7
-rw-r--r--app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue15
-rw-r--r--app/assets/javascripts/sidebar/components/sidebar_editable_item.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue18
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/report.vue4
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue6
-rw-r--r--app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue8
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js10
-rw-r--r--app/assets/javascripts/sidebar/queries/remove_attention_request.mutation.graphql7
-rw-r--r--app/assets/javascripts/sidebar/queries/request_attention.mutation.graphql5
-rw-r--r--app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql2
-rw-r--r--app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql7
-rw-r--r--app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql2
-rw-r--r--app/assets/javascripts/sidebar/services/sidebar_service.js17
-rw-r--r--app/assets/javascripts/sidebar/sidebar_mediator.js33
-rw-r--r--app/assets/javascripts/sidebar/stores/sidebar_store.js35
-rw-r--r--app/assets/javascripts/snippets/components/edit.vue57
-rw-r--r--app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue38
-rw-r--r--app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql2
-rw-r--r--app/assets/javascripts/sortable/constants.js4
-rw-r--r--app/assets/javascripts/sortable/utils.js10
-rw-r--r--app/assets/javascripts/static_site_editor/components/edit_area.vue4
-rw-r--r--app/assets/javascripts/tracking/dispatch_snowplow_event.js9
-rw-r--r--app/assets/javascripts/tracking/tracker.js267
-rw-r--r--app/assets/javascripts/tracking/tracking.js275
-rw-r--r--app/assets/javascripts/user_popovers.js16
-rw-r--r--app/assets/javascripts/users_select/index.js18
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/added_commit_message.vue43
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue17
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/base.vue22
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue14
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/index.js1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/status_icon.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js22
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue77
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue8
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue5
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_related_links.vue27
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue2
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue4
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue7
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue8
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue4
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue57
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js13
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/constants.js30
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/index.js84
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/extensions/test_report/utils.js45
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue25
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/queries/states/ready_to_merge.fragment.graphql1
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js6
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue33
-rw-r--r--app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/commit.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/confidentiality_badge.vue39
-rw-r--r--app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.stories.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue14
-rw-r--r--app/assets/javascripts/vue_shared/components/confirm_danger/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/deployment_instance.vue7
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown/dropdown_hidden_input.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown/dropdown_search_input.vue49
-rw-r--r--app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue52
-rw-r--r--app/assets/javascripts/vue_shared/components/file_finder/index.vue10
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue54
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue16
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/release_token.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/field.vue15
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/header.vue31
-rw-r--r--app/assets/javascripts/vue_shared/components/markdown/toolbar.vue26
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue8
-rw-r--r--app/assets/javascripts/vue_shared/components/navigation_tabs.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/paginated_list.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/list_item.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/registry/registry_search.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue23
-rw-r--r--app/assets/javascripts/vue_shared/components/segmented_control_button_group.vue35
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue4
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/source_viewer.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue2
-rw-r--r--app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue68
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue90
-rw-r--r--app/assets/javascripts/vue_shared/components/user_select/user_select.vue2
-rw-r--r--app/assets/javascripts/vue_shared/constants.js14
-rw-r--r--app/assets/javascripts/vue_shared/issuable/create/components/issuable_form.vue19
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/components/issuable_item.vue15
-rw-r--r--app/assets/javascripts/vue_shared/issuable/list/components/issuable_list_root.vue6
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_header.vue42
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_show_root.vue8
-rw-r--r--app/assets/javascripts/vue_shared/issuable/show/components/issuable_title.vue2
-rw-r--r--app/assets/javascripts/vue_shared/mixins/timeago.js4
-rw-r--r--app/assets/javascripts/vue_shared/security_configuration/components/section_layout.vue34
-rw-r--r--app/assets/javascripts/vue_shared/security_configuration/components/section_loader.vue35
-rw-r--r--app/assets/javascripts/vue_shared/security_reports/store/utils.js2
-rw-r--r--app/assets/javascripts/whats_new/components/feature.vue8
-rw-r--r--app/assets/javascripts/work_items/components/item_state.vue62
-rw-r--r--app/assets/javascripts/work_items/components/work_item_actions.vue48
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue53
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail_modal.vue103
-rw-r--r--app/assets/javascripts/work_items/components/work_item_state.vue98
-rw-r--r--app/assets/javascripts/work_items/components/work_item_title.vue11
-rw-r--r--app/assets/javascripts/work_items/constants.js8
-rw-r--r--app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql9
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.fragment.graphql6
-rw-r--r--app/assets/javascripts/work_items/graphql/work_item.query.graphql2
-rw-r--r--app/assets/javascripts/work_items/index.js3
-rw-r--r--app/assets/javascripts/work_items/pages/create_work_item.vue23
-rw-r--r--app/assets/javascripts/work_items/pages/work_item_root.vue46
-rw-r--r--app/assets/javascripts/work_items/router/index.js2
-rw-r--r--app/assets/javascripts/work_items_hierarchy/components/app.vue2
-rw-r--r--app/assets/stylesheets/bootstrap_migration_components.scss11
-rw-r--r--app/assets/stylesheets/components/content_editor.scss9
-rw-r--r--app/assets/stylesheets/components/dashboard_skeleton.scss3
-rw-r--r--app/assets/stylesheets/components/design_management/design.scss2
-rw-r--r--app/assets/stylesheets/components/whats_new.scss6
-rw-r--r--app/assets/stylesheets/errors.scss8
-rw-r--r--app/assets/stylesheets/framework/broadcast_messages.scss7
-rw-r--r--app/assets/stylesheets/framework/buttons.scss10
-rw-r--r--app/assets/stylesheets/framework/diffs.scss40
-rw-r--r--app/assets/stylesheets/framework/files.scss13
-rw-r--r--app/assets/stylesheets/framework/filters.scss2
-rw-r--r--app/assets/stylesheets/framework/forms.scss1
-rw-r--r--app/assets/stylesheets/framework/header.scss46
-rw-r--r--app/assets/stylesheets/framework/icons.scss72
-rw-r--r--app/assets/stylesheets/framework/logo.scss101
-rw-r--r--app/assets/stylesheets/framework/secondary_navigation_elements.scss6
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss60
-rw-r--r--app/assets/stylesheets/framework/tables.scss24
-rw-r--r--app/assets/stylesheets/framework/variables.scss4
-rw-r--r--app/assets/stylesheets/framework/wells.scss2
-rw-r--r--app/assets/stylesheets/highlight/common.scss22
-rw-r--r--app/assets/stylesheets/highlight/themes/dark.scss12
-rw-r--r--app/assets/stylesheets/highlight/themes/monokai.scss13
-rw-r--r--app/assets/stylesheets/highlight/themes/none.scss9
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-dark.scss13
-rw-r--r--app/assets/stylesheets/highlight/themes/solarized-light.scss13
-rw-r--r--app/assets/stylesheets/highlight/white_base.scss28
-rw-r--r--app/assets/stylesheets/mailer.scss1
-rw-r--r--app/assets/stylesheets/page_bundles/_pipeline_mixins.scss92
-rw-r--r--app/assets/stylesheets/page_bundles/boards.scss37
-rw-r--r--app/assets/stylesheets/page_bundles/dashboard_projects.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/issues_show.scss67
-rw-r--r--app/assets/stylesheets/page_bundles/jira_connect.scss11
-rw-r--r--app/assets/stylesheets/page_bundles/merge_requests.scss62
-rw-r--r--app/assets/stylesheets/page_bundles/milestone.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/pipeline.scss2
-rw-r--r--app/assets/stylesheets/page_bundles/pipeline_editor.scss22
-rw-r--r--app/assets/stylesheets/page_bundles/pipelines.scss65
-rw-r--r--app/assets/stylesheets/page_bundles/terms.scss8
-rw-r--r--app/assets/stylesheets/pages/commits.scss5
-rw-r--r--app/assets/stylesheets/pages/detail_page.scss23
-rw-r--r--app/assets/stylesheets/pages/issuable.scss107
-rw-r--r--app/assets/stylesheets/pages/issues.scss29
-rw-r--r--app/assets/stylesheets/pages/login.scss1
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss6
-rw-r--r--app/assets/stylesheets/pages/notes.scss29
-rw-r--r--app/assets/stylesheets/pages/projects.scss25
-rw-r--r--app/assets/stylesheets/pages/search.scss46
-rw-r--r--app/assets/stylesheets/pages/tree.scss6
-rw-r--r--app/assets/stylesheets/startup/startup-dark.scss112
-rw-r--r--app/assets/stylesheets/startup/startup-general.scss105
-rw-r--r--app/assets/stylesheets/startup/startup-signin.scss34
-rw-r--r--app/assets/stylesheets/themes/_dark.scss2
-rw-r--r--app/assets/stylesheets/themes/dark_mode_overrides.scss7
-rw-r--r--app/assets/stylesheets/themes/theme_helper.scss1
-rw-r--r--app/assets/stylesheets/themes/theme_light.scss5
-rw-r--r--app/assets/stylesheets/utilities.scss27
-rw-r--r--app/components/diffs/overflow_warning_component.html.haml6
-rw-r--r--app/components/pajamas/alert_component.html.haml12
-rw-r--r--app/components/pajamas/alert_component.rb15
-rw-r--r--app/controllers/admin/application_settings_controller.rb16
-rw-r--r--app/controllers/admin/applications_controller.rb5
-rw-r--r--app/controllers/admin/background_migrations_controller.rb22
-rw-r--r--app/controllers/admin/batched_jobs_controller.rb28
-rw-r--r--app/controllers/admin/deploy_keys_controller.rb1
-rw-r--r--app/controllers/admin/groups_controller.rb2
-rw-r--r--app/controllers/admin/jobs_controller.rb1
-rw-r--r--app/controllers/admin/labels_controller.rb1
-rw-r--r--app/controllers/admin/requests_profiles_controller.rb21
-rw-r--r--app/controllers/admin/runner_projects_controller.rb1
-rw-r--r--app/controllers/admin/runners_controller.rb19
-rw-r--r--app/controllers/admin/sessions_controller.rb2
-rw-r--r--app/controllers/admin/topics_controller.rb3
-rw-r--r--app/controllers/admin/users_controller.rb2
-rw-r--r--app/controllers/application_controller.rb7
-rw-r--r--app/controllers/autocomplete_controller.rb5
-rw-r--r--app/controllers/boards/issues_controller.rb1
-rw-r--r--app/controllers/boards/lists_controller.rb1
-rw-r--r--app/controllers/clusters/base_controller.rb4
-rw-r--r--app/controllers/clusters/clusters_controller.rb67
-rw-r--r--app/controllers/concerns/authenticates_with_two_factor.rb4
-rw-r--r--app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb2
-rw-r--r--app/controllers/concerns/dependency_proxy/group_access.rb4
-rw-r--r--app/controllers/concerns/issuable_actions.rb2
-rw-r--r--app/controllers/concerns/notes_actions.rb2
-rw-r--r--app/controllers/concerns/oauth_applications.rb2
-rw-r--r--app/controllers/concerns/product_analytics_tracking.rb2
-rw-r--r--app/controllers/concerns/send_file_upload.rb2
-rw-r--r--app/controllers/concerns/uploads_actions.rb14
-rw-r--r--app/controllers/concerns/wiki_actions.rb4
-rw-r--r--app/controllers/dashboard/groups_controller.rb2
-rw-r--r--app/controllers/dashboard/labels_controller.rb1
-rw-r--r--app/controllers/dashboard/milestones_controller.rb1
-rw-r--r--app/controllers/dashboard/projects_controller.rb1
-rw-r--r--app/controllers/dashboard/todos_controller.rb11
-rw-r--r--app/controllers/dashboard_controller.rb3
-rw-r--r--app/controllers/explore/groups_controller.rb1
-rw-r--r--app/controllers/explore/projects_controller.rb4
-rw-r--r--app/controllers/google_api/authorizations_controller.rb1
-rw-r--r--app/controllers/graphql_controller.rb5
-rw-r--r--app/controllers/groups/autocomplete_sources_controller.rb1
-rw-r--r--app/controllers/groups/boards_controller.rb5
-rw-r--r--app/controllers/groups/crm/contacts_controller.rb1
-rw-r--r--app/controllers/groups/crm/organizations_controller.rb1
-rw-r--r--app/controllers/groups/dependency_proxies_controller.rb4
-rw-r--r--app/controllers/groups/dependency_proxy/application_controller.rb6
-rw-r--r--app/controllers/groups/dependency_proxy_auth_controller.rb1
-rw-r--r--app/controllers/groups/dependency_proxy_for_containers_controller.rb1
-rw-r--r--app/controllers/groups/deploy_tokens_controller.rb1
-rw-r--r--app/controllers/groups/group_members_controller.rb1
-rw-r--r--app/controllers/groups/imports_controller.rb1
-rw-r--r--app/controllers/groups/labels_controller.rb1
-rw-r--r--app/controllers/groups/milestones_controller.rb1
-rw-r--r--app/controllers/groups/packages_controller.rb1
-rw-r--r--app/controllers/groups/registry/repositories_controller.rb3
-rw-r--r--app/controllers/groups/releases_controller.rb19
-rw-r--r--app/controllers/groups/runners_controller.rb32
-rw-r--r--app/controllers/groups/settings/applications_controller.rb6
-rw-r--r--app/controllers/groups/settings/ci_cd_controller.rb22
-rw-r--r--app/controllers/groups/settings/packages_and_registries_controller.rb1
-rw-r--r--app/controllers/groups/settings/repository_controller.rb1
-rw-r--r--app/controllers/groups/shared_projects_controller.rb1
-rw-r--r--app/controllers/groups/uploads_controller.rb1
-rw-r--r--app/controllers/groups_controller.rb11
-rw-r--r--app/controllers/ide_controller.rb2
-rw-r--r--app/controllers/import/available_namespaces_controller.rb1
-rw-r--r--app/controllers/import/base_controller.rb1
-rw-r--r--app/controllers/import/bitbucket_controller.rb7
-rw-r--r--app/controllers/import/bitbucket_server_controller.rb7
-rw-r--r--app/controllers/import/bulk_imports_controller.rb3
-rw-r--r--app/controllers/import/fogbugz_controller.rb4
-rw-r--r--app/controllers/import/gitea_controller.rb6
-rw-r--r--app/controllers/import/gitlab_controller.rb3
-rw-r--r--app/controllers/import/gitlab_groups_controller.rb1
-rw-r--r--app/controllers/import/history_controller.rb1
-rw-r--r--app/controllers/import/manifest_controller.rb7
-rw-r--r--app/controllers/import/url_controller.rb1
-rw-r--r--app/controllers/jira_connect/application_controller.rb40
-rw-r--r--app/controllers/jira_connect/events_controller.rb2
-rw-r--r--app/controllers/jira_connect/subscriptions_controller.rb3
-rw-r--r--app/controllers/oauth/applications_controller.rb6
-rw-r--r--app/controllers/oauth/authorizations_controller.rb17
-rw-r--r--app/controllers/omniauth_callbacks_controller.rb2
-rw-r--r--app/controllers/profiles/accounts_controller.rb1
-rw-r--r--app/controllers/profiles/emails_controller.rb1
-rw-r--r--app/controllers/profiles/gpg_keys_controller.rb2
-rw-r--r--app/controllers/profiles/keys_controller.rb1
-rw-r--r--app/controllers/profiles/notifications_controller.rb1
-rw-r--r--app/controllers/profiles/personal_access_tokens_controller.rb2
-rw-r--r--app/controllers/profiles/preferences_controller.rb3
-rw-r--r--app/controllers/profiles/two_factor_auths_controller.rb8
-rw-r--r--app/controllers/profiles_controller.rb3
-rw-r--r--app/controllers/projects/alert_management_controller.rb1
-rw-r--r--app/controllers/projects/alerting/notifications_controller.rb3
-rw-r--r--app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb1
-rw-r--r--app/controllers/projects/autocomplete_sources_controller.rb3
-rw-r--r--app/controllers/projects/avatars_controller.rb2
-rw-r--r--app/controllers/projects/blame_controller.rb7
-rw-r--r--app/controllers/projects/blob_controller.rb4
-rw-r--r--app/controllers/projects/boards_controller.rb5
-rw-r--r--app/controllers/projects/branches_controller.rb2
-rw-r--r--app/controllers/projects/builds_controller.rb3
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb3
-rw-r--r--app/controllers/projects/ci/secure_files_controller.rb1
-rw-r--r--app/controllers/projects/cluster_agents_controller.rb1
-rw-r--r--app/controllers/projects/clusters_controller.rb2
-rw-r--r--app/controllers/projects/cycle_analytics/events_controller.rb1
-rw-r--r--app/controllers/projects/cycle_analytics_controller.rb1
-rw-r--r--app/controllers/projects/deploy_keys_controller.rb1
-rw-r--r--app/controllers/projects/deploy_tokens_controller.rb1
-rw-r--r--app/controllers/projects/deployments_controller.rb1
-rw-r--r--app/controllers/projects/discussions_controller.rb1
-rw-r--r--app/controllers/projects/environments_controller.rb10
-rw-r--r--app/controllers/projects/feature_flags_clients_controller.rb1
-rw-r--r--app/controllers/projects/feature_flags_controller.rb1
-rw-r--r--app/controllers/projects/feature_flags_user_lists_controller.rb1
-rw-r--r--app/controllers/projects/graphs_controller.rb1
-rw-r--r--app/controllers/projects/imports_controller.rb1
-rw-r--r--app/controllers/projects/incident_management/pager_duty_incidents_controller.rb1
-rw-r--r--app/controllers/projects/incidents_controller.rb5
-rw-r--r--app/controllers/projects/issue_links_controller.rb1
-rw-r--r--app/controllers/projects/issues_controller.rb24
-rw-r--r--app/controllers/projects/jobs_controller.rb11
-rw-r--r--app/controllers/projects/labels_controller.rb1
-rw-r--r--app/controllers/projects/learn_gitlab_controller.rb1
-rw-r--r--app/controllers/projects/logs_controller.rb3
-rw-r--r--app/controllers/projects/merge_requests_controller.rb33
-rw-r--r--app/controllers/projects/metrics_dashboard_controller.rb1
-rw-r--r--app/controllers/projects/milestones_controller.rb1
-rw-r--r--app/controllers/projects/notes_controller.rb1
-rw-r--r--app/controllers/projects/packages/infrastructure_registry_controller.rb1
-rw-r--r--app/controllers/projects/packages/packages_controller.rb1
-rw-r--r--app/controllers/projects/pipeline_schedules_controller.rb1
-rw-r--r--app/controllers/projects/pipelines/application_controller.rb1
-rw-r--r--app/controllers/projects/pipelines/tests_controller.rb2
-rw-r--r--app/controllers/projects/pipelines_controller.rb54
-rw-r--r--app/controllers/projects/pipelines_settings_controller.rb1
-rw-r--r--app/controllers/projects/product_analytics_controller.rb2
-rw-r--r--app/controllers/projects/project_members_controller.rb1
-rw-r--r--app/controllers/projects/prometheus/alerts_controller.rb66
-rw-r--r--app/controllers/projects/prometheus/metrics_controller.rb4
-rw-r--r--app/controllers/projects/registry/application_controller.rb1
-rw-r--r--app/controllers/projects/releases/evidences_controller.rb1
-rw-r--r--app/controllers/projects/releases_controller.rb9
-rw-r--r--app/controllers/projects/runner_projects_controller.rb1
-rw-r--r--app/controllers/projects/runners_controller.rb1
-rw-r--r--app/controllers/projects/security/configuration_controller.rb2
-rw-r--r--app/controllers/projects/serverless/functions_controller.rb79
-rw-r--r--app/controllers/projects/service_ping_controller.rb3
-rw-r--r--app/controllers/projects/services_controller.rb14
-rw-r--r--app/controllers/projects/settings/ci_cd_controller.rb3
-rw-r--r--app/controllers/projects/settings/operations_controller.rb9
-rw-r--r--app/controllers/projects/settings/packages_and_registries_controller.rb1
-rw-r--r--app/controllers/projects/settings/repository_controller.rb2
-rw-r--r--app/controllers/projects/starrers_controller.rb2
-rw-r--r--app/controllers/projects/tags/releases_controller.rb1
-rw-r--r--app/controllers/projects/terraform_controller.rb1
-rw-r--r--app/controllers/projects/todos_controller.rb1
-rw-r--r--app/controllers/projects/tracings_controller.rb1
-rw-r--r--app/controllers/projects/tree_controller.rb6
-rw-r--r--app/controllers/projects/triggers_controller.rb1
-rw-r--r--app/controllers/projects/uploads_controller.rb4
-rw-r--r--app/controllers/projects/work_items_controller.rb1
-rw-r--r--app/controllers/projects_controller.rb26
-rw-r--r--app/controllers/pwa_controller.rb12
-rw-r--r--app/controllers/registrations/welcome_controller.rb2
-rw-r--r--app/controllers/repositories/lfs_storage_controller.rb14
-rw-r--r--app/controllers/runner_setup_controller.rb1
-rw-r--r--app/controllers/search_controller.rb15
-rw-r--r--app/controllers/sent_notifications_controller.rb1
-rw-r--r--app/controllers/sessions_controller.rb9
-rw-r--r--app/controllers/users_controller.rb4
-rw-r--r--app/experiments/build_ios_app_guide_email_experiment.rb6
-rw-r--r--app/finders/alert_management/alerts_finder.rb2
-rw-r--r--app/finders/error_tracking/errors_finder.rb46
-rw-r--r--app/finders/group_descendants_finder.rb2
-rw-r--r--app/finders/group_members_finder.rb4
-rw-r--r--app/finders/groups/projects_requiring_authorizations_refresh/base.rb35
-rw-r--r--app/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder.rb36
-rw-r--r--app/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder.rb17
-rw-r--r--app/finders/groups_finder.rb4
-rw-r--r--app/finders/incident_management/timeline_events_finder.rb37
-rw-r--r--app/finders/issuable_finder.rb4
-rw-r--r--app/finders/issues_finder.rb7
-rw-r--r--app/finders/issues_finder/params.rb4
-rw-r--r--app/finders/packages/build_infos_finder.rb46
-rw-r--r--app/finders/packages/build_infos_for_many_packages_finder.rb92
-rw-r--r--app/finders/personal_access_tokens_finder.rb2
-rw-r--r--app/finders/projects/serverless/functions_finder.rb153
-rw-r--r--app/finders/releases_finder.rb14
-rw-r--r--app/finders/tags_finder.rb4
-rw-r--r--app/finders/user_recent_events_finder.rb7
-rw-r--r--app/graphql/mutations/award_emojis/base.rb6
-rw-r--r--app/graphql/mutations/base_mutation.rb1
-rw-r--r--app/graphql/mutations/boards/update.rb3
-rw-r--r--app/graphql/mutations/ci/ci_cd_settings_update.rb37
-rw-r--r--app/graphql/mutations/ci/job/base.rb3
-rw-r--r--app/graphql/mutations/ci/pipeline/base.rb3
-rw-r--r--app/graphql/mutations/ci/project_ci_cd_settings_update.rb43
-rw-r--r--app/graphql/mutations/ci/runner/delete.rb4
-rw-r--r--app/graphql/mutations/ci/runner/update.rb4
-rw-r--r--app/graphql/mutations/ci/runners_registration_token/reset.rb32
-rw-r--r--app/graphql/mutations/clusters/agent_tokens/create.rb3
-rw-r--r--app/graphql/mutations/clusters/agent_tokens/delete.rb35
-rw-r--r--app/graphql/mutations/clusters/agent_tokens/revoke.rb3
-rw-r--r--app/graphql/mutations/clusters/agents/delete.rb3
-rw-r--r--app/graphql/mutations/container_expiration_policies/update.rb2
-rw-r--r--app/graphql/mutations/container_repositories/destroy_base.rb3
-rw-r--r--app/graphql/mutations/customer_relations/contacts/base.rb25
-rw-r--r--app/graphql/mutations/customer_relations/contacts/create.rb16
-rw-r--r--app/graphql/mutations/customer_relations/contacts/update.rb16
-rw-r--r--app/graphql/mutations/customer_relations/organizations/update.rb4
-rw-r--r--app/graphql/mutations/design_management/move.rb3
-rw-r--r--app/graphql/mutations/discussions/toggle_resolve.rb3
-rw-r--r--app/graphql/mutations/environments/canary_ingress/update.rb9
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/base.rb29
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/create.rb37
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/destroy.rb24
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb46
-rw-r--r--app/graphql/mutations/incident_management/timeline_event/update.rb33
-rw-r--r--app/graphql/mutations/issues/set_crm_contacts.rb2
-rw-r--r--app/graphql/mutations/merge_requests/remove_attention_request.rb40
-rw-r--r--app/graphql/mutations/merge_requests/request_attention.rb40
-rw-r--r--app/graphql/mutations/merge_requests/set_labels.rb3
-rw-r--r--app/graphql/mutations/merge_requests/toggle_attention_requested.rb2
-rw-r--r--app/graphql/mutations/metrics/dashboard/annotations/create.rb11
-rw-r--r--app/graphql/mutations/namespace/package_settings/update.rb2
-rw-r--r--app/graphql/mutations/notes/base.rb3
-rw-r--r--app/graphql/mutations/notes/create/base.rb3
-rw-r--r--app/graphql/mutations/notes/create/note.rb7
-rw-r--r--app/graphql/mutations/notes/reposition_image_diff_note.rb3
-rw-r--r--app/graphql/mutations/notes/update/image_diff_note.rb2
-rw-r--r--app/graphql/mutations/packages/destroy.rb3
-rw-r--r--app/graphql/mutations/packages/destroy_file.rb3
-rw-r--r--app/graphql/mutations/release_asset_links/delete.rb4
-rw-r--r--app/graphql/mutations/release_asset_links/update.rb4
-rw-r--r--app/graphql/mutations/saved_replies/base.rb6
-rw-r--r--app/graphql/mutations/timelogs/delete.rb33
-rw-r--r--app/graphql/mutations/todos/base.rb3
-rw-r--r--app/graphql/mutations/todos/create.rb3
-rw-r--r--app/graphql/mutations/todos/mark_all_done.rb2
-rw-r--r--app/graphql/mutations/todos/restore_many.rb3
-rw-r--r--app/graphql/mutations/user_preferences/update.rb2
-rw-r--r--app/graphql/mutations/work_items/create.rb3
-rw-r--r--app/graphql/mutations/work_items/create_from_task.rb2
-rw-r--r--app/graphql/mutations/work_items/delete.rb2
-rw-r--r--app/graphql/mutations/work_items/delete_task.rb69
-rw-r--r--app/graphql/mutations/work_items/update.rb2
-rw-r--r--app/graphql/queries/burndown_chart/burnup.iteration.query.graphql40
-rw-r--r--app/graphql/queries/burndown_chart/burnup.milestone.query.graphql36
-rw-r--r--app/graphql/queries/burndown_chart/burnup.query.graphql75
-rw-r--r--app/graphql/queries/design_management/get_design_list.query.graphql2
-rw-r--r--app/graphql/queries/pipelines/get_pipeline_details.query.graphql6
-rw-r--r--app/graphql/queries/snippet/snippet_blob_content.query.graphql2
-rw-r--r--app/graphql/resolvers/alert_management/http_integrations_resolver.rb3
-rw-r--r--app/graphql/resolvers/base_issues_resolver.rb2
-rw-r--r--app/graphql/resolvers/base_resolver.rb1
-rw-r--r--app/graphql/resolvers/boards_resolver.rb3
-rw-r--r--app/graphql/resolvers/ci/config_resolver.rb30
-rw-r--r--app/graphql/resolvers/ci/runner_status_resolver.rb9
-rw-r--r--app/graphql/resolvers/concerns/issue_resolver_arguments.rb6
-rw-r--r--app/graphql/resolvers/concerns/resolves_ids.rb5
-rw-r--r--app/graphql/resolvers/concerns/resolves_snippets.rb2
-rw-r--r--app/graphql/resolvers/concerns/time_frame_arguments.rb9
-rw-r--r--app/graphql/resolvers/design_management/design_at_version_resolver.rb3
-rw-r--r--app/graphql/resolvers/design_management/design_resolver.rb4
-rw-r--r--app/graphql/resolvers/design_management/designs_resolver.rb27
-rw-r--r--app/graphql/resolvers/design_management/version/design_at_version_resolver.rb5
-rw-r--r--app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb3
-rw-r--r--app/graphql/resolvers/design_management/version_in_collection_resolver.rb4
-rw-r--r--app/graphql/resolvers/design_management/version_resolver.rb4
-rw-r--r--app/graphql/resolvers/design_management/versions_resolver.rb29
-rw-r--r--app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb4
-rw-r--r--app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb4
-rw-r--r--app/graphql/resolvers/group_members_resolver.rb4
-rw-r--r--app/graphql/resolvers/group_packages_resolver.rb5
-rw-r--r--app/graphql/resolvers/incident_management/timeline_events_resolver.rb32
-rw-r--r--app/graphql/resolvers/package_details_resolver.rb3
-rw-r--r--app/graphql/resolvers/package_pipelines_resolver.rb54
-rw-r--r--app/graphql/resolvers/project_packages_resolver.rb5
-rw-r--r--app/graphql/resolvers/project_pipeline_resolver.rb5
-rw-r--r--app/graphql/resolvers/snippets_resolver.rb6
-rw-r--r--app/graphql/resolvers/timelog_resolver.rb6
-rw-r--r--app/graphql/resolvers/user_merge_requests_resolver_base.rb3
-rw-r--r--app/graphql/resolvers/work_item_resolver.rb3
-rw-r--r--app/graphql/subscriptions/issuable_updated.rb4
-rw-r--r--app/graphql/types/alert_management/domain_filter_enum.rb6
-rw-r--r--app/graphql/types/base_field.rb2
-rw-r--r--app/graphql/types/boards/board_issue_input_type.rb1
-rw-r--r--app/graphql/types/ci/config/config_type.rb2
-rw-r--r--app/graphql/types/ci/config/include_type.rb53
-rw-r--r--app/graphql/types/ci/config/include_type_enum.rb17
-rw-r--r--app/graphql/types/ci/pipeline_type.rb1
-rw-r--r--app/graphql/types/ci/runner_status_enum.rb14
-rw-r--r--app/graphql/types/ci/runner_type.rb13
-rw-r--r--app/graphql/types/ci/runner_upgrade_status_type_enum.rb14
-rw-r--r--app/graphql/types/color_type.rb25
-rw-r--r--app/graphql/types/concerns/gitlab_style_deprecations.rb4
-rw-r--r--app/graphql/types/container_expiration_policy_type.rb2
-rw-r--r--app/graphql/types/container_repository_type.rb1
-rw-r--r--app/graphql/types/current_user_todos.rb19
-rw-r--r--app/graphql/types/customer_relations/contact_type.rb5
-rw-r--r--app/graphql/types/customer_relations/organization_type.rb5
-rw-r--r--app/graphql/types/dependency_proxy/group_setting_type.rb2
-rw-r--r--app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb2
-rw-r--r--app/graphql/types/deprecated_mutations.rb3
-rw-r--r--app/graphql/types/design_management/design_fields.rb30
-rw-r--r--app/graphql/types/design_management/design_type.rb5
-rw-r--r--app/graphql/types/global_id_type.rb16
-rw-r--r--app/graphql/types/incident_management/timeline_event_type.rb72
-rw-r--r--app/graphql/types/issue_type.rb2
-rw-r--r--app/graphql/types/merge_request_type.rb8
-rw-r--r--app/graphql/types/mutation_type.rb17
-rw-r--r--app/graphql/types/namespace/package_settings_type.rb2
-rw-r--r--app/graphql/types/notes/update_diff_image_position_input_type.rb2
-rw-r--r--app/graphql/types/packages/package_base_type.rb60
-rw-r--r--app/graphql/types/packages/package_details_type.rb11
-rw-r--r--app/graphql/types/packages/package_type.rb64
-rw-r--r--app/graphql/types/permission_types/timelog.rb11
-rw-r--r--app/graphql/types/permission_types/work_item.rb12
-rw-r--r--app/graphql/types/project_statistics_type.rb2
-rw-r--r--app/graphql/types/project_type.rb13
-rw-r--r--app/graphql/types/projects/topic_type.rb4
-rw-r--r--app/graphql/types/query_type.rb23
-rw-r--r--app/graphql/types/range_input_type.rb2
-rw-r--r--app/graphql/types/root_storage_statistics_type.rb1
-rw-r--r--app/graphql/types/timelog_type.rb7
-rw-r--r--app/graphql/types/work_item_type.rb2
-rw-r--r--app/graphql/types/work_items/convert_task_input_type.rb4
-rw-r--r--app/graphql/types/work_items/deleted_task_input_type.rb19
-rw-r--r--app/helpers/appearances_helper.rb18
-rw-r--r--app/helpers/application_helper.rb4
-rw-r--r--app/helpers/application_settings_helper.rb34
-rw-r--r--app/helpers/auth_helper.rb4
-rw-r--r--app/helpers/badges_helper.rb2
-rw-r--r--app/helpers/boards_helper.rb1
-rw-r--r--app/helpers/broadcast_messages_helper.rb2
-rw-r--r--app/helpers/ci/builds_helper.rb10
-rw-r--r--app/helpers/ci/pipeline_editor_helper.rb1
-rw-r--r--app/helpers/ci/pipelines_helper.rb4
-rw-r--r--app/helpers/ci/runners_helper.rb12
-rw-r--r--app/helpers/ci/secure_files_helper.rb10
-rw-r--r--app/helpers/clusters_helper.rb14
-rw-r--r--app/helpers/container_registry_helper.rb4
-rw-r--r--app/helpers/emails_helper.rb4
-rw-r--r--app/helpers/groups/group_members_helper.rb2
-rw-r--r--app/helpers/instance_configuration_helper.rb4
-rw-r--r--app/helpers/integrations_helper.rb1
-rw-r--r--app/helpers/invite_members_helper.rb25
-rw-r--r--app/helpers/issuables_helper.rb23
-rw-r--r--app/helpers/issues_helper.rb14
-rw-r--r--app/helpers/jira_connect_helper.rb3
-rw-r--r--app/helpers/lazy_image_tag_helper.rb26
-rw-r--r--app/helpers/learn_gitlab_helper.rb3
-rw-r--r--app/helpers/merge_requests_helper.rb43
-rw-r--r--app/helpers/namespaces_helper.rb3
-rw-r--r--app/helpers/nav_helper.rb8
-rw-r--r--app/helpers/page_layout_helper.rb2
-rw-r--r--app/helpers/personal_access_tokens_helper.rb7
-rw-r--r--app/helpers/profiles_helper.rb4
-rw-r--r--app/helpers/projects/pipeline_helper.rb1
-rw-r--r--app/helpers/projects_helper.rb5
-rw-r--r--app/helpers/releases_helper.rb9
-rw-r--r--app/helpers/routing/projects_helper.rb16
-rw-r--r--app/helpers/routing/pseudonymization_helper.rb2
-rw-r--r--app/helpers/search_helper.rb6
-rw-r--r--app/helpers/sorting_helper.rb45
-rw-r--r--app/helpers/storage_helper.rb5
-rw-r--r--app/helpers/system_note_helper.rb3
-rw-r--r--app/helpers/todos_helper.rb6
-rw-r--r--app/helpers/tracking_helper.rb9
-rw-r--r--app/helpers/users/group_callouts_helper.rb2
-rw-r--r--app/helpers/users_helper.rb2
-rw-r--r--app/helpers/workhorse_helper.rb2
-rw-r--r--app/mailers/emails/in_product_marketing.rb6
-rw-r--r--app/mailers/emails/merge_requests.rb14
-rw-r--r--app/mailers/emails/projects.rb14
-rw-r--r--app/mailers/previews/notify_preview.rb4
-rw-r--r--app/models/alert_management/alert.rb9
-rw-r--r--app/models/alert_management/metric_image.rb4
-rw-r--r--app/models/analytics/cycle_analytics/aggregation.rb8
-rw-r--r--app/models/application_setting.rb18
-rw-r--r--app/models/application_setting_implementation.rb3
-rw-r--r--app/models/broadcast_message.rb2
-rw-r--r--app/models/ci/bridge.rb17
-rw-r--r--app/models/ci/build.rb21
-rw-r--r--app/models/ci/build_metadata.rb2
-rw-r--r--app/models/ci/job_artifact.rb9
-rw-r--r--app/models/ci/namespace_settings.rb19
-rw-r--r--app/models/ci/pending_build.rb2
-rw-r--r--app/models/ci/pipeline.rb34
-rw-r--r--app/models/ci/processable.rb15
-rw-r--r--app/models/ci/runner.rb19
-rw-r--r--app/models/ci/secure_file.rb7
-rw-r--r--app/models/clusters/applications/prometheus.rb1
-rw-r--r--app/models/clusters/cluster.rb1
-rw-r--r--app/models/clusters/instance.rb6
-rw-r--r--app/models/clusters/platforms/kubernetes.rb46
-rw-r--r--app/models/concerns/bulk_member_access_load.rb5
-rw-r--r--app/models/concerns/ci/has_deployment_name.rb2
-rw-r--r--app/models/concerns/ci/has_status.rb19
-rw-r--r--app/models/concerns/cross_database_modification.rb2
-rw-r--r--app/models/concerns/deployment_platform.rb2
-rw-r--r--app/models/concerns/integrations/loggable.rb37
-rw-r--r--app/models/concerns/integrations/reset_secret_fields.rb41
-rw-r--r--app/models/concerns/integrations/slack_mattermost_notifier.rb12
-rw-r--r--app/models/concerns/issuable.rb4
-rw-r--r--app/models/concerns/limitable.rb4
-rw-r--r--app/models/concerns/merge_request_reviewer_state.rb2
-rw-r--r--app/models/concerns/packages/destructible.rb2
-rw-r--r--app/models/concerns/pg_full_text_searchable.rb14
-rw-r--r--app/models/concerns/project_services_loggable.rb28
-rw-r--r--app/models/concerns/routable.rb4
-rw-r--r--app/models/concerns/sha256_attribute.rb45
-rw-r--r--app/models/concerns/sha_attribute.rb64
-rw-r--r--app/models/container_registry/event.rb25
-rw-r--r--app/models/container_repository.rb25
-rw-r--r--app/models/deploy_token.rb10
-rw-r--r--app/models/deployment.rb9
-rw-r--r--app/models/design_management/action.rb1
-rw-r--r--app/models/environment.rb12
-rw-r--r--app/models/event.rb6
-rw-r--r--app/models/event_collection.rb47
-rw-r--r--app/models/group.rb4
-rw-r--r--app/models/group_group_link.rb2
-rw-r--r--app/models/incident_management/timeline_event.rb25
-rw-r--r--app/models/instance_configuration.rb19
-rw-r--r--app/models/integration.rb9
-rw-r--r--app/models/integrations/bamboo.rb54
-rw-r--r--app/models/integrations/base_chat_notification.rb4
-rw-r--r--app/models/integrations/base_ci.rb10
-rw-r--r--app/models/integrations/buildkite.rb31
-rw-r--r--app/models/integrations/drone_ci.rb32
-rw-r--r--app/models/integrations/field.rb1
-rw-r--r--app/models/integrations/jenkins.rb53
-rw-r--r--app/models/integrations/jira.rb41
-rw-r--r--app/models/integrations/mock_ci.rb18
-rw-r--r--app/models/integrations/packagist.rb3
-rw-r--r--app/models/integrations/prometheus.rb9
-rw-r--r--app/models/integrations/teamcity.rb46
-rw-r--r--app/models/issue.rb7
-rw-r--r--app/models/key.rb15
-rw-r--r--app/models/label.rb5
-rw-r--r--app/models/loose_foreign_keys/deleted_record.rb4
-rw-r--r--app/models/member.rb7
-rw-r--r--app/models/members_preloader.rb2
-rw-r--r--app/models/merge_request.rb30
-rw-r--r--app/models/merge_request_assignee.rb6
-rw-r--r--app/models/merge_request_reviewer.rb6
-rw-r--r--app/models/namespace.rb26
-rw-r--r--app/models/namespace_ci_cd_setting.rb9
-rw-r--r--app/models/namespaces/traversal/linear.rb12
-rw-r--r--app/models/namespaces/traversal/linear_scopes.rb14
-rw-r--r--app/models/packages/build_info.rb4
-rw-r--r--app/models/packages/cleanup.rb8
-rw-r--r--app/models/packages/cleanup/policy.rb32
-rw-r--r--app/models/pages_domain.rb5
-rw-r--r--app/models/personal_access_token.rb4
-rw-r--r--app/models/preloaders/group_root_ancestor_preloader.rb2
-rw-r--r--app/models/preloaders/user_max_access_level_in_groups_preloader.rb2
-rw-r--r--app/models/preloaders/user_max_access_level_in_projects_preloader.rb51
-rw-r--r--app/models/project.rb43
-rw-r--r--app/models/project_ci_cd_setting.rb3
-rw-r--r--app/models/project_import_state.rb4
-rw-r--r--app/models/project_pages_metadatum.rb2
-rw-r--r--app/models/project_setting.rb13
-rw-r--r--app/models/project_statistics.rb8
-rw-r--r--app/models/project_team.rb4
-rw-r--r--app/models/projects/topic.rb7
-rw-r--r--app/models/protected_branch.rb4
-rw-r--r--app/models/raw_usage_data.rb7
-rw-r--r--app/models/system_note_metadata.rb2
-rw-r--r--app/models/user.rb20
-rw-r--r--app/models/user_custom_attribute.rb33
-rw-r--r--app/models/users/callout.rb4
-rw-r--r--app/models/users/in_product_marketing_email.rb71
-rw-r--r--app/models/wiki.rb126
-rw-r--r--app/models/work_items/type.rb4
-rw-r--r--app/policies/group_policy.rb34
-rw-r--r--app/policies/incident_management/timeline_event_policy.rb7
-rw-r--r--app/policies/issuable_policy.rb8
-rw-r--r--app/policies/issue_policy.rb11
-rw-r--r--app/policies/namespace_ci_cd_setting_policy.rb5
-rw-r--r--app/policies/namespaces/user_namespace_policy.rb3
-rw-r--r--app/policies/project_policy.rb4
-rw-r--r--app/policies/timelog_policy.rb7
-rw-r--r--app/policies/work_item_policy.rb4
-rw-r--r--app/presenters/clusterable_presenter.rb16
-rw-r--r--app/presenters/clusters/cluster_presenter.rb2
-rw-r--r--app/presenters/dev_ops_report/metric_presenter.rb2
-rw-r--r--app/presenters/instance_clusterable_presenter.rb20
-rw-r--r--app/presenters/issue_presenter.rb16
-rw-r--r--app/presenters/project_presenter.rb3
-rw-r--r--app/presenters/projects/security/configuration_presenter.rb2
-rw-r--r--app/presenters/user_presenter.rb2
-rw-r--r--app/serializers/award_emoji_entity.rb1
-rw-r--r--app/serializers/build_details_entity.rb8
-rw-r--r--app/serializers/ci/job_entity.rb1
-rw-r--r--app/serializers/cluster_entity.rb10
-rw-r--r--app/serializers/environment_entity.rb3
-rw-r--r--app/serializers/environment_serializer.rb5
-rw-r--r--app/serializers/issue_board_entity.rb2
-rw-r--r--app/serializers/issue_entity.rb2
-rw-r--r--app/serializers/issue_sidebar_basic_entity.rb2
-rw-r--r--app/serializers/linked_issue_entity.rb2
-rw-r--r--app/serializers/merge_request_user_entity.rb2
-rw-r--r--app/serializers/merge_request_widget_entity.rb2
-rw-r--r--app/serializers/release_entity.rb9
-rw-r--r--app/services/alert_management/alerts/update_service.rb20
-rw-r--r--app/services/alert_management/metric_images/upload_service.rb2
-rw-r--r--app/services/authorized_project_update/project_access_changed_service.rb2
-rw-r--r--app/services/authorized_project_update/project_create_service.rb34
-rw-r--r--app/services/authorized_project_update/project_group_link_create_service.rb72
-rw-r--r--app/services/bulk_imports/file_decompression_service.rb2
-rw-r--r--app/services/ci/create_downstream_pipeline_service.rb3
-rw-r--r--app/services/ci/expire_pipeline_cache_service.rb2
-rw-r--r--app/services/ci/generate_kubeconfig_service.rb11
-rw-r--r--app/services/ci/job_artifacts/create_service.rb2
-rw-r--r--app/services/ci/job_artifacts/destroy_batch_service.rb17
-rw-r--r--app/services/ci/pipeline_creation/start_pipeline_service.rb5
-rw-r--r--app/services/ci/pipeline_trigger_service.rb2
-rw-r--r--app/services/ci/queue/build_queue_service.rb2
-rw-r--r--app/services/ci/queue/builds_table_strategy.rb2
-rw-r--r--app/services/ci/queue/pending_builds_strategy.rb4
-rw-r--r--app/services/ci/register_job_service.rb16
-rw-r--r--app/services/ci/retry_job_service.rb29
-rw-r--r--app/services/ci/runners/register_runner_service.rb2
-rw-r--r--app/services/ci/runners/reset_registration_token_service.rb2
-rw-r--r--app/services/ci/stuck_builds/drop_running_service.rb2
-rw-r--r--app/services/ci/update_build_state_service.rb4
-rw-r--r--app/services/clusters/kubernetes.rb2
-rw-r--r--app/services/clusters/kubernetes/create_or_update_service_account_service.rb32
-rw-r--r--app/services/concerns/alert_management/alert_processing.rb2
-rw-r--r--app/services/concerns/ci/downstream_pipeline_helpers.rb24
-rw-r--r--app/services/concerns/group_linkable.rb38
-rw-r--r--app/services/container_expiration_policies/cleanup_service.rb3
-rw-r--r--app/services/container_expiration_policies/update_service.rb2
-rw-r--r--app/services/container_expiration_policy_service.rb18
-rw-r--r--app/services/customer_relations/contacts/base_service.rb17
-rw-r--r--app/services/customer_relations/contacts/create_service.rb18
-rw-r--r--app/services/customer_relations/contacts/update_service.rb10
-rw-r--r--app/services/customer_relations/organizations/update_service.rb9
-rw-r--r--app/services/database/consistency_fix_service.rb48
-rw-r--r--app/services/deployments/update_environment_service.rb2
-rw-r--r--app/services/environments/stop_service.rb4
-rw-r--r--app/services/error_tracking/base_service.rb10
-rw-r--r--app/services/error_tracking/collect_error_service.rb26
-rw-r--r--app/services/error_tracking/issue_details_service.rb11
-rw-r--r--app/services/error_tracking/issue_latest_event_service.rb13
-rw-r--r--app/services/error_tracking/issue_update_service.rb6
-rw-r--r--app/services/error_tracking/list_issues_service.rb16
-rw-r--r--app/services/event_create_service.rb2
-rw-r--r--app/services/git/base_hooks_service.rb2
-rw-r--r--app/services/groups/group_links/create_service.rb51
-rw-r--r--app/services/groups/import_export/export_service.rb2
-rw-r--r--app/services/groups/import_export/import_service.rb2
-rw-r--r--app/services/groups/open_issues_count_service.rb27
-rw-r--r--app/services/groups/transfer_service.rb13
-rw-r--r--app/services/import/bitbucket_server_service.rb2
-rw-r--r--app/services/import/github_service.rb2
-rw-r--r--app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb2
-rw-r--r--app/services/incident_management/timeline_events/base_service.rb27
-rw-r--r--app/services/incident_management/timeline_events/create_service.rb51
-rw-r--r--app/services/incident_management/timeline_events/destroy_service.rb38
-rw-r--r--app/services/incident_management/timeline_events/update_service.rb61
-rw-r--r--app/services/issuable/destroy_service.rb10
-rw-r--r--app/services/jira/requests/base.rb16
-rw-r--r--app/services/jira_connect/sync_service.rb2
-rw-r--r--app/services/jira_import/start_import_service.rb2
-rw-r--r--app/services/loose_foreign_keys/batch_cleaner_service.rb2
-rw-r--r--app/services/members/create_service.rb6
-rw-r--r--app/services/members/creator_service.rb8
-rw-r--r--app/services/members/projects/creator_service.rb15
-rw-r--r--app/services/merge_requests/approval_service.rb2
-rw-r--r--app/services/merge_requests/base_service.rb53
-rw-r--r--app/services/merge_requests/build_service.rb8
-rw-r--r--app/services/merge_requests/create_service.rb4
-rw-r--r--app/services/merge_requests/handle_assignees_change_service.rb2
-rw-r--r--app/services/merge_requests/mergeability/run_checks_service.rb2
-rw-r--r--app/services/merge_requests/post_merge_service.rb14
-rw-r--r--app/services/merge_requests/push_options_handler_service.rb5
-rw-r--r--app/services/merge_requests/remove_approval_service.rb1
-rw-r--r--app/services/merge_requests/remove_attention_requested_service.rb18
-rw-r--r--app/services/merge_requests/request_attention_service.rb60
-rw-r--r--app/services/merge_requests/update_assignees_service.rb2
-rw-r--r--app/services/merge_requests/update_service.rb4
-rw-r--r--app/services/namespaces/in_product_marketing_email_records.rb26
-rw-r--r--app/services/namespaces/in_product_marketing_emails_service.rb4
-rw-r--r--app/services/namespaces/package_settings/update_service.rb2
-rw-r--r--app/services/notes/create_service.rb18
-rw-r--r--app/services/notification_service.rb30
-rw-r--r--app/services/projects/after_import_service.rb43
-rw-r--r--app/services/projects/android_target_platform_detector_service.rb35
-rw-r--r--app/services/projects/blame_service.rb65
-rw-r--r--app/services/projects/branches_by_mode_service.rb2
-rw-r--r--app/services/projects/container_repository/cleanup_tags_service.rb5
-rw-r--r--app/services/projects/container_repository/delete_tags_service.rb18
-rw-r--r--app/services/projects/container_repository/gitlab/delete_tags_service.rb7
-rw-r--r--app/services/projects/create_service.rb33
-rw-r--r--app/services/projects/group_links/create_service.rb35
-rw-r--r--app/services/projects/in_product_marketing_campaign_emails_service.rb57
-rw-r--r--app/services/projects/lfs_pointers/lfs_download_service.rb2
-rw-r--r--app/services/projects/open_issues_count_service.rb93
-rw-r--r--app/services/projects/overwrite_project_service.rb2
-rw-r--r--app/services/projects/participants_service.rb10
-rw-r--r--app/services/projects/prometheus/alerts/alert_params.rb17
-rw-r--r--app/services/projects/prometheus/alerts/create_service.rb15
-rw-r--r--app/services/projects/prometheus/alerts/destroy_service.rb13
-rw-r--r--app/services/projects/prometheus/alerts/update_service.rb15
-rw-r--r--app/services/projects/prometheus/metrics/base_service.rb30
-rw-r--r--app/services/projects/prometheus/metrics/destroy_service.rb1
-rw-r--r--app/services/projects/prometheus/metrics/update_service.rb29
-rw-r--r--app/services/projects/record_target_platforms_service.rb34
-rw-r--r--app/services/projects/update_pages_service.rb5
-rw-r--r--app/services/projects/update_remote_mirror_service.rb2
-rw-r--r--app/services/prometheus/create_default_alerts_service.rb105
-rw-r--r--app/services/quick_actions/interpret_service.rb17
-rw-r--r--app/services/service_ping/build_payload_service.rb27
-rw-r--r--app/services/service_ping/devops_report_service.rb26
-rw-r--r--app/services/service_ping/permit_data_categories_service.rb24
-rw-r--r--app/services/service_ping/submit_service.rb49
-rw-r--r--app/services/system_note_service.rb31
-rw-r--r--app/services/system_notes/incidents_service.rb40
-rw-r--r--app/services/system_notes/time_tracking_service.rb12
-rw-r--r--app/services/timelogs/base_service.rb15
-rw-r--r--app/services/timelogs/delete_service.rb26
-rw-r--r--app/services/users/destroy_service.rb5
-rw-r--r--app/services/users/in_product_marketing_email_records.rb27
-rw-r--r--app/services/users/validate_manual_otp_service.rb29
-rw-r--r--app/services/users/validate_otp_service.rb29
-rw-r--r--app/services/users/validate_push_otp_service.rb25
-rw-r--r--app/services/work_items/delete_task_service.rb45
-rw-r--r--app/services/work_items/task_list_reference_removal_service.rb63
-rw-r--r--app/views/admin/application_settings/_account_and_limit.html.haml6
-rw-r--r--app/views/admin/application_settings/_issue_limits.html.haml4
-rw-r--r--app/views/admin/application_settings/_note_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_pipeline_limits.html.haml9
-rw-r--r--app/views/admin/application_settings/_prometheus.html.haml21
-rw-r--r--app/views/admin/application_settings/_registry.html.haml1
-rw-r--r--app/views/admin/application_settings/_repository_storage.html.haml14
-rw-r--r--app/views/admin/application_settings/_runner_registrars_form.html.haml18
-rw-r--r--app/views/admin/application_settings/_signin.html.haml61
-rw-r--r--app/views/admin/application_settings/_usage.html.haml4
-rw-r--r--app/views/admin/application_settings/_users_api_limits.html.haml2
-rw-r--r--app/views/admin/application_settings/_visibility_and_access.html.haml19
-rw-r--r--app/views/admin/application_settings/ci/_header.html.haml2
-rw-r--r--app/views/admin/application_settings/ci_cd.html.haml4
-rw-r--r--app/views/admin/application_settings/general.html.haml4
-rw-r--r--app/views/admin/application_settings/metrics_and_profiling.html.haml4
-rw-r--r--app/views/admin/application_settings/network.html.haml12
-rw-r--r--app/views/admin/application_settings/service_usage_data.html.haml4
-rw-r--r--app/views/admin/applications/_form.html.haml16
-rw-r--r--app/views/admin/background_migrations/_job.html.haml10
-rw-r--r--app/views/admin/background_migrations/_migration.html.haml10
-rw-r--r--app/views/admin/background_migrations/_migration_full_information.html.haml21
-rw-r--r--app/views/admin/background_migrations/index.html.haml29
-rw-r--r--app/views/admin/background_migrations/show.html.haml39
-rw-r--r--app/views/admin/batched_jobs/_job.html.haml17
-rw-r--r--app/views/admin/batched_jobs/_transition_log.html.haml13
-rw-r--r--app/views/admin/batched_jobs/show.html.haml36
-rw-r--r--app/views/admin/broadcast_messages/_form.html.haml2
-rw-r--r--app/views/admin/broadcast_messages/index.html.haml2
-rw-r--r--app/views/admin/dashboard/_security_newsletter_callout.html.haml6
-rw-r--r--app/views/admin/groups/_form.html.haml4
-rw-r--r--app/views/admin/groups/show.html.haml2
-rw-r--r--app/views/admin/projects/show.html.haml4
-rw-r--r--app/views/admin/requests_profiles/index.html.haml22
-rw-r--r--app/views/admin/runners/edit.html.haml130
-rw-r--r--app/views/admin/runners/show.html.haml2
-rw-r--r--app/views/admin/sessions/_new_base.html.haml2
-rw-r--r--app/views/admin/sessions/_signin_box.html.haml2
-rw-r--r--app/views/admin/sessions/_two_factor_otp.html.haml2
-rw-r--r--app/views/admin/sessions/new.html.haml2
-rw-r--r--app/views/admin/sessions/two_factor.html.haml4
-rw-r--r--app/views/admin/topics/_form.html.haml11
-rw-r--r--app/views/admin/topics/_topic.html.haml5
-rw-r--r--app/views/admin/users/_users.html.haml4
-rw-r--r--app/views/ci/runner/_how_to_setup_runner.html.haml4
-rw-r--r--app/views/ci/runner/_setup_runner_in_aws.html.haml2
-rw-r--r--app/views/ci/variables/_content.html.haml2
-rw-r--r--app/views/ci/variables/_index.html.haml6
-rw-r--r--app/views/clusters/clusters/_banner.html.haml8
-rw-r--r--app/views/clusters/clusters/_deprecation_alert.html.haml4
-rw-r--r--app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml6
-rw-r--r--app/views/clusters/clusters/_integrations.html.haml23
-rw-r--r--app/views/clusters/clusters/_sidebar.html.haml3
-rw-r--r--app/views/clusters/clusters/aws/_new.html.haml17
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_button.html.haml8
-rw-r--r--app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml5
-rw-r--r--app/views/clusters/clusters/connect.html.haml2
-rw-r--r--app/views/clusters/clusters/gcp/_form.html.haml87
-rw-r--r--app/views/clusters/clusters/gcp/_gcp_not_configured.html.haml3
-rw-r--r--app/views/clusters/clusters/gcp/_header.html.haml14
-rw-r--r--app/views/clusters/clusters/gcp/_new.html.haml5
-rw-r--r--app/views/clusters/clusters/new.html.haml19
-rw-r--r--app/views/clusters/clusters/new_cluster_docs.html.haml5
-rw-r--r--app/views/clusters/clusters/show.html.haml8
-rw-r--r--app/views/clusters/clusters/user/_form.html.haml6
-rw-r--r--app/views/dashboard/todos/index.html.haml2
-rw-r--r--app/views/devise/passwords/new.html.haml8
-rw-r--r--app/views/devise/sessions/_new_base.html.haml13
-rw-r--r--app/views/devise/sessions/_new_base_user_login_label.html.haml1
-rw-r--r--app/views/devise/sessions/_new_crowd.html.haml8
-rw-r--r--app/views/devise/sessions/_new_ldap.html.haml8
-rw-r--r--app/views/devise/sessions/two_factor.html.haml2
-rw-r--r--app/views/devise/shared/_omniauth_box.html.haml2
-rw-r--r--app/views/devise/shared/_tab_single.html.haml2
-rw-r--r--app/views/devise/shared/_tabs_normal.html.haml9
-rw-r--r--app/views/doorkeeper/authorizations/redirect.html.haml14
-rw-r--r--app/views/errors/request_conflict.html.haml18
-rw-r--r--app/views/events/event/_note.html.haml2
-rw-r--r--app/views/explore/projects/topic.html.haml12
-rw-r--r--app/views/groups/_home_panel.html.haml3
-rw-r--r--app/views/groups/_import_group_from_another_instance_panel.html.haml4
-rw-r--r--app/views/groups/_import_group_from_file_panel.html.haml4
-rw-r--r--app/views/groups/_invite_groups_modal.html.haml2
-rw-r--r--app/views/groups/dependency_proxies/show.html.haml2
-rw-r--r--app/views/groups/issues.html.haml2
-rw-r--r--app/views/groups/milestones/index.html.haml2
-rw-r--r--app/views/groups/new.html.haml2
-rw-r--r--app/views/groups/runners/_group_runners.html.haml29
-rw-r--r--app/views/groups/runners/_runner.html.haml80
-rw-r--r--app/views/groups/runners/_settings.html.haml133
-rw-r--r--app/views/groups/runners/_shared_runners.html.haml3
-rw-r--r--app/views/groups/runners/_sort_dropdown.html.haml3
-rw-r--r--app/views/groups/runners/edit.html.haml6
-rw-r--r--app/views/groups/runners/show.html.haml5
-rw-r--r--app/views/groups/settings/_export.html.haml8
-rw-r--r--app/views/groups/settings/_permissions.html.haml2
-rw-r--r--app/views/groups/settings/_remove_button.html.haml4
-rw-r--r--app/views/groups/settings/_transfer.html.haml4
-rw-r--r--app/views/groups/settings/packages_and_registries/show.html.haml2
-rw-r--r--app/views/help/instance_configuration.html.haml1
-rw-r--r--app/views/help/instance_configuration/_ci_cd_limits.html.haml52
-rw-r--r--app/views/help/instance_configuration/_size_limits.html.haml3
-rw-r--r--app/views/import/bulk_imports/status.html.haml1
-rw-r--r--app/views/import/shared/_errors.html.haml4
-rw-r--r--app/views/jira_connect/users/show.html.haml2
-rw-r--r--app/views/layouts/_head.html.haml57
-rw-r--r--app/views/layouts/_header_search.html.haml2
-rw-r--r--app/views/layouts/_loading_hints.html.haml2
-rw-r--r--app/views/layouts/devise.html.haml4
-rw-r--r--app/views/layouts/header/_default.html.haml37
-rw-r--r--app/views/layouts/header/_logo_with_title.html.haml7
-rw-r--r--app/views/layouts/header/_new_dropdown.html.haml4
-rw-r--r--app/views/layouts/header/_registration_enabled_callout.html.haml6
-rw-r--r--app/views/layouts/header/_storage_enforcement_banner.html.haml4
-rw-r--r--app/views/layouts/in_product_marketing_mailer.html.haml2
-rw-r--r--app/views/layouts/mailer.html.haml2
-rw-r--r--app/views/layouts/nav/_breadcrumbs.html.haml5
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml4
-rw-r--r--app/views/layouts/terms.html.haml9
-rw-r--r--app/views/layouts/unknown_user_mailer.html.haml2
-rw-r--r--app/views/notify/approved_merge_request_email.html.haml157
-rw-r--r--app/views/notify/approved_merge_request_email.text.haml9
-rw-r--r--app/views/notify/build_ios_app_guide_email.html.haml13
-rw-r--r--app/views/notify/build_ios_app_guide_email.text.erb13
-rw-r--r--app/views/notify/inactive_project_deletion_warning_email.html.haml28
-rw-r--r--app/views/notify/inactive_project_deletion_warning_email.text.erb17
-rw-r--r--app/views/notify/merge_request_unmergeable_email.html.haml8
-rw-r--r--app/views/notify/merge_when_pipeline_succeeds_email.html.haml4
-rw-r--r--app/views/notify/merged_merge_request_email.html.haml14
-rw-r--r--app/views/notify/merged_merge_request_email.text.haml8
-rw-r--r--app/views/notify/unapproved_merge_request_email.html.haml156
-rw-r--r--app/views/notify/unapproved_merge_request_email.text.haml9
-rw-r--r--app/views/profiles/_email_settings.html.haml43
-rw-r--r--app/views/profiles/_name.html.haml10
-rw-r--r--app/views/profiles/accounts/show.html.haml8
-rw-r--r--app/views/profiles/notifications/show.html.haml4
-rw-r--r--app/views/profiles/preferences/show.html.haml7
-rw-r--r--app/views/profiles/show.html.haml120
-rw-r--r--app/views/profiles/two_factor_auths/show.html.haml6
-rw-r--r--app/views/projects/_deletion_failed.html.haml4
-rw-r--r--app/views/projects/_files.html.haml2
-rw-r--r--app/views/projects/_home_panel.html.haml5
-rw-r--r--app/views/projects/_last_push.html.haml6
-rw-r--r--app/views/projects/_merge_request_merge_checks_settings.html.haml29
-rw-r--r--app/views/projects/_merge_request_merge_method_settings.html.haml2
-rw-r--r--app/views/projects/_merge_request_merge_options_settings.html.haml21
-rw-r--r--app/views/projects/_new_project_fields.html.haml4
-rw-r--r--app/views/projects/blame/show.html.haml3
-rw-r--r--app/views/projects/blob/_blob.html.haml2
-rw-r--r--app/views/projects/blob/_breadcrumb.html.haml2
-rw-r--r--app/views/projects/blob/_editor.html.haml2
-rw-r--r--app/views/projects/blob/edit.html.haml5
-rw-r--r--app/views/projects/branches/index.html.haml2
-rw-r--r--app/views/projects/branches/new.html.haml4
-rw-r--r--app/views/projects/buttons/_clone.html.haml14
-rw-r--r--app/views/projects/ci/pipeline_editor/show.html.haml1
-rw-r--r--app/views/projects/ci/secure_files/show.html.haml4
-rw-r--r--app/views/projects/commits/_commits.html.haml8
-rw-r--r--app/views/projects/default_branch/_show.html.haml14
-rw-r--r--app/views/projects/deployments/_deployment.html.haml1
-rw-r--r--app/views/projects/diffs/_diffs.html.haml3
-rw-r--r--app/views/projects/diffs/_text_file.html.haml2
-rw-r--r--app/views/projects/feature_flags/edit.html.haml2
-rw-r--r--app/views/projects/forks/error.html.haml8
-rw-r--r--app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml5
-rw-r--r--app/views/projects/graphs/charts.html.haml2
-rw-r--r--app/views/projects/issues/_alert_moved_from_service_desk.html.haml4
-rw-r--r--app/views/projects/issues/_discussion.html.haml2
-rw-r--r--app/views/projects/issues/index.html.haml2
-rw-r--r--app/views/projects/issues/show.html.haml1
-rw-r--r--app/views/projects/jobs/index.html.haml2
-rw-r--r--app/views/projects/mattermosts/_no_teams.html.haml6
-rw-r--r--app/views/projects/mattermosts/new.html.haml26
-rw-r--r--app/views/projects/merge_requests/_close_reopen_draft_report_toggle.html.haml76
-rw-r--r--app/views/projects/merge_requests/_code_dropdown.html.haml39
-rw-r--r--app/views/projects/merge_requests/_mr_box.html.haml8
-rw-r--r--app/views/projects/merge_requests/_mr_title.html.haml61
-rw-r--r--app/views/projects/merge_requests/creations/_new_compare.html.haml4
-rw-r--r--app/views/projects/merge_requests/invalid.html.haml4
-rw-r--r--app/views/projects/merge_requests/show.html.haml16
-rw-r--r--app/views/projects/milestones/index.html.haml2
-rw-r--r--app/views/projects/milestones/show.html.haml4
-rw-r--r--app/views/projects/mirrors/_mirror_repos.html.haml4
-rw-r--r--app/views/projects/pages/_access.html.haml2
-rw-r--r--app/views/projects/pages/_destroy.haml2
-rw-r--r--app/views/projects/pages/_list.html.haml2
-rw-r--r--app/views/projects/pages_domains/_certificate.html.haml3
-rw-r--r--app/views/projects/pages_domains/_form.html.haml7
-rw-r--r--app/views/projects/pipelines/_with_tabs.html.haml71
-rw-r--r--app/views/projects/pipelines/show.html.haml2
-rw-r--r--app/views/projects/runners/_group_runners.html.haml5
-rw-r--r--app/views/projects/serverless/functions/index.html.haml17
-rw-r--r--app/views/projects/serverless/functions/show.html.haml19
-rw-r--r--app/views/projects/services/_form.html.haml12
-rw-r--r--app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml98
-rw-r--r--app/views/projects/services/mattermost_slash_commands/_help.html.haml17
-rw-r--r--app/views/projects/services/prometheus/_external_alerts.html.haml8
-rw-r--r--app/views/projects/services/prometheus/_metrics.html.haml38
-rw-r--r--app/views/projects/services/prometheus/_show.html.haml9
-rw-r--r--app/views/projects/services/prometheus/_top.html.haml9
-rw-r--r--app/views/projects/settings/ci_cd/_form.html.haml22
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml16
-rw-r--r--app/views/projects/settings/operations/_prometheus.html.haml17
-rw-r--r--app/views/projects/settings/operations/show.html.haml7
-rw-r--r--app/views/projects/tree/_tree_header.html.haml6
-rw-r--r--app/views/projects/work_items/index.html.haml2
-rw-r--r--app/views/pwa/offline.html.haml31
-rw-r--r--app/views/registrations/welcome/show.html.haml4
-rw-r--r--app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml6
-rw-r--r--app/views/shared/_import_form.html.haml34
-rw-r--r--app/views/shared/_integration_settings.html.haml4
-rw-r--r--app/views/shared/_logo.svg17
-rw-r--r--app/views/shared/_logo_type.svg1
-rw-r--r--app/views/shared/_logo_ukraine.svg5
-rw-r--r--app/views/shared/_logo_with_black_text.svg12
-rw-r--r--app/views/shared/_logo_with_white_text.svg12
-rw-r--r--app/views/shared/_milestones_sort_dropdown.html.haml2
-rw-r--r--app/views/shared/_new_project_item_select.html.haml7
-rw-r--r--app/views/shared/_no_password.html.haml6
-rw-r--r--app/views/shared/_no_ssh.html.haml6
-rw-r--r--app/views/shared/_outdated_browser.html.haml4
-rw-r--r--app/views/shared/_project_limit.html.haml6
-rw-r--r--app/views/shared/_registration_features_discovery_message.html.haml2
-rw-r--r--app/views/shared/_service_ping_consent.html.haml6
-rw-r--r--app/views/shared/_two_factor_auth_recovery_settings_check.html.haml6
-rw-r--r--app/views/shared/access_tokens/_table.html.haml15
-rw-r--r--app/views/shared/deploy_tokens/_form.html.haml30
-rw-r--r--app/views/shared/doorkeeper/applications/_form.html.haml6
-rw-r--r--app/views/shared/empty_states/_merge_requests.html.haml4
-rw-r--r--app/views/shared/errors/_gitaly_unavailable.html.haml4
-rw-r--r--app/views/shared/hook_logs/_content.html.haml4
-rw-r--r--app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml98
-rw-r--r--app/views/shared/integrations/mattermost_slash_commands/_help.html.haml17
-rw-r--r--app/views/shared/integrations/mattermost_slash_commands/_installation_info.html.haml (renamed from app/views/projects/services/mattermost_slash_commands/_installation_info.html.haml)0
-rw-r--r--app/views/shared/integrations/prometheus/_custom_metrics.html.haml (renamed from app/views/projects/services/prometheus/_custom_metrics.html.haml)0
-rw-r--r--app/views/shared/integrations/prometheus/_help.html.haml (renamed from app/views/projects/services/prometheus/_help.html.haml)0
-rw-r--r--app/views/shared/integrations/prometheus/_metrics.html.haml38
-rw-r--r--app/views/shared/integrations/prometheus/_show.html.haml7
-rw-r--r--app/views/shared/integrations/slack/_help.haml (renamed from app/views/projects/services/slack/_help.haml)0
-rw-r--r--app/views/shared/integrations/slack_slash_commands/_help.html.haml (renamed from app/views/projects/services/slack_slash_commands/_help.html.haml)0
-rw-r--r--app/views/shared/issuable/_assignees.html.haml2
-rw-r--r--app/views/shared/issuable/_form.html.haml4
-rw-r--r--app/views/shared/issuable/_reviewers.html.haml2
-rw-r--r--app/views/shared/issuable/_search_bar.html.haml2
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml51
-rw-r--r--app/views/shared/issuable/_sort_dropdown.html.haml27
-rw-r--r--app/views/shared/issuable/_status_box.html.haml14
-rw-r--r--app/views/shared/issue_type/_details_header.html.haml19
-rw-r--r--app/views/shared/milestones/_milestone.html.haml10
-rw-r--r--app/views/shared/milestones/_milestone_complete_alert.html.haml6
-rw-r--r--app/views/shared/milestones/_sidebar.html.haml6
-rw-r--r--app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml11
-rw-r--r--app/views/shared/notes/_hints.html.haml11
-rw-r--r--app/views/shared/projects/_topics.html.haml20
-rw-r--r--app/views/shared/runners/_form.html.haml18
-rw-r--r--app/views/shared/runners/_runner_type_alert.html.haml8
-rw-r--r--app/views/shared/snippets/_snippet.html.haml27
-rw-r--r--app/views/shared/topics/_topic.html.haml10
-rw-r--r--app/views/shared/web_hooks/_hook_errors.html.haml12
-rw-r--r--app/workers/all_queues.yml74
-rw-r--r--app/workers/authorized_project_update/project_create_worker.rb23
-rw-r--r--app/workers/authorized_project_update/project_group_link_create_worker.rb26
-rw-r--r--app/workers/bulk_imports/pipeline_worker.rb16
-rw-r--r--app/workers/ci/build_finished_worker.rb2
-rw-r--r--app/workers/cleanup_container_repository_worker.rb16
-rw-r--r--app/workers/concerns/git_garbage_collect_methods.rb20
-rw-r--r--app/workers/concerns/reenqueuer.rb2
-rw-r--r--app/workers/concerns/worker_attributes.rb4
-rw-r--r--app/workers/container_expiration_policies/cleanup_container_repository_worker.rb7
-rw-r--r--app/workers/container_expiration_policy_worker.rb56
-rw-r--r--app/workers/container_registry/migration/enqueuer_worker.rb91
-rw-r--r--app/workers/container_registry/migration/guard_worker.rb30
-rw-r--r--app/workers/database/batched_background_migration/ci_database_worker.rb2
-rw-r--r--app/workers/database/batched_background_migration_worker.rb2
-rw-r--r--app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb12
-rw-r--r--app/workers/database/ci_project_mirrors_consistency_check_worker.rb12
-rw-r--r--app/workers/deployments/hooks_worker.rb3
-rw-r--r--app/workers/expire_build_instance_artifacts_worker.rb25
-rw-r--r--app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb2
-rw-r--r--app/workers/gitlab/github_import/stage/import_notes_worker.rb2
-rw-r--r--app/workers/merge_request_cleanup_refs_worker.rb2
-rw-r--r--app/workers/merge_requests/close_issue_worker.rb52
-rw-r--r--app/workers/packages/cleanup_package_file_worker.rb2
-rw-r--r--app/workers/project_service_worker.rb13
-rw-r--r--app/workers/projects/after_import_worker.rb48
-rw-r--r--app/workers/projects/git_garbage_collect_worker.rb8
-rw-r--r--app/workers/projects/inactive_projects_deletion_cron_worker.rb73
-rw-r--r--app/workers/projects/inactive_projects_deletion_notification_worker.rb31
-rw-r--r--app/workers/projects/record_target_platforms_worker.rb28
-rw-r--r--app/workers/prometheus/create_default_alerts_worker.rb14
-rw-r--r--app/workers/requests_profiles_worker.rb18
-rw-r--r--app/workers/schedule_merge_request_cleanup_refs_worker.rb2
-rw-r--r--app/workers/web_hooks/destroy_worker.rb2
-rw-r--r--app/workers/wikis/git_garbage_collect_worker.rb8
-rw-r--r--config/application.rb35
-rw-r--r--config/database.yml.env17
-rw-r--r--config/events/1651052988_gitlab__usage_data_counters__ci_template_unique_counter_ci_templates_unique.yml23
-rw-r--r--config/events/1651053267_event_create_service_action_active_users_project_repo.yml23
-rw-r--r--config/events/1651580551_groups_controller_show_render.yml21
-rw-r--r--config/events/1651581659_projects_controller_show_render.yml21
-rw-r--r--config/feature_categories.yml10
-rw-r--r--config/feature_flags/development/async_mr_close_issue.yml8
-rw-r--r--config/feature_flags/development/automated_email_provision.yml2
-rw-r--r--config/feature_flags/development/blame_page_pagination.yml8
-rw-r--r--config/feature_flags/development/ci_expand_environment_name_and_url.yml2
-rw-r--r--config/feature_flags/development/ci_fix_rules_if_comparison_with_regexp_variable.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_namespace_mirrors_consistency_check.yml2
-rw-r--r--config/feature_flags/development/ci_pending_builds_table_resiliency.yml8
-rw-r--r--config/feature_flags/development/ci_project_mirrors_consistency_check.yml2
-rw-r--r--config/feature_flags/development/ci_recreate_downstream_pipeline.yml8
-rw-r--r--config/feature_flags/development/ci_variables_builder_config_variables.yml8
-rw-r--r--config/feature_flags/development/confidential_notes.yml2
-rw-r--r--config/feature_flags/development/contacts_autocomplete.yml2
-rw-r--r--config/feature_flags/development/container_registry_expiration_policies_throttling.yml8
-rw-r--r--config/feature_flags/development/container_registry_follow_redirects_middleware.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase2_capacity_2.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase2_capacity_5.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase2_enqueue_twice.yml8
-rw-r--r--config/feature_flags/development/container_registry_migration_phase2_enqueuer_loop.yml8
-rw-r--r--config/feature_flags/development/container_registry_project_statistics.yml8
-rw-r--r--config/feature_flags/development/create_project_settings.yml8
-rw-r--r--config/feature_flags/development/customer_relations.yml2
-rw-r--r--config/feature_flags/development/delayed_project_import_schedule_worker.yml8
-rw-r--r--config/feature_flags/development/dependency_proxy_for_private_groups.yml8
-rw-r--r--config/feature_flags/development/deployment_approval_rules.yml8
-rw-r--r--config/feature_flags/development/detect_android_projects.yml8
-rw-r--r--config/feature_flags/development/distribute_github_parallel_import.yml8
-rw-r--r--config/feature_flags/development/downstream_retry_action.yml8
-rw-r--r--config/feature_flags/development/enforce_security_report_validation.yml2
-rw-r--r--config/feature_flags/development/enhanced_notify_css.yml4
-rw-r--r--config/feature_flags/development/env_last_deployment_by_finished_at.yml8
-rw-r--r--config/feature_flags/development/environment_multiple_stop_actions.yml8
-rw-r--r--config/feature_flags/development/failed_jobs_tab_vue.yml8
-rw-r--r--config/feature_flags/development/filter_quarantined_commits.yml8
-rw-r--r--config/feature_flags/development/fix_related_environments_for_merge_requests.yml8
-rw-r--r--config/feature_flags/development/geo_use_clone_on_first_sync.yml2
-rw-r--r--config/feature_flags/development/gitaly_enforce_requests_limits.yml8
-rw-r--r--config/feature_flags/development/gitaly_go_user_merge_branch.yml8
-rw-r--r--config/feature_flags/development/gitaly_mep_mep.yml8
-rw-r--r--config/feature_flags/development/gitaly_pack_objects_hook_with_sidechannel.yml8
-rw-r--r--config/feature_flags/development/gitaly_replace_wiki_update_page.yml8
-rw-r--r--config/feature_flags/development/gitaly_upload_pack_gitaly_hooks.yml8
-rw-r--r--config/feature_flags/development/gitaly_user_merge_branch_access_error.yml8
-rw-r--r--config/feature_flags/development/gitlab_shell_upload_pack_sidechannel.yml8
-rw-r--r--config/feature_flags/development/graphql_ci_runner_executor.yml8
-rw-r--r--config/feature_flags/development/group_releases_finder_inoperator.yml8
-rw-r--r--config/feature_flags/development/group_wiki_settings_toggle.yml8
-rw-r--r--config/feature_flags/development/inactive_projects_deletion.yml8
-rw-r--r--config/feature_flags/development/ipynbdiff_notes_tracker.yml8
-rw-r--r--config/feature_flags/development/jira_connect_oauth_self_managed.yml8
-rw-r--r--config/feature_flags/development/job_deployment_count.yml8
-rw-r--r--config/feature_flags/development/lfk_fair_queueing.yml8
-rw-r--r--config/feature_flags/development/markdown_continue_lists.yml8
-rw-r--r--config/feature_flags/development/measure_service_ping_metric_collection.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/moved_mr_sidebar.yml8
-rw-r--r--config/feature_flags/development/namespace_storage_limit_bypass_date_check.yml8
-rw-r--r--config/feature_flags/development/new_vulnerability_form.yml8
-rw-r--r--config/feature_flags/development/nullify_in_batches_on_user_deletion.yml8
-rw-r--r--config/feature_flags/development/omit_epic_subscribed.yml8
-rw-r--r--config/feature_flags/development/omniauth_initializer_fullhost_proc.yml4
-rw-r--r--config/feature_flags/development/optimized_followed_users_queries.yml4
-rw-r--r--config/feature_flags/development/optimized_project_and_group_activity_queries.yml8
-rw-r--r--config/feature_flags/development/pipeline_editor_file_tree.yml8
-rw-r--r--config/feature_flags/development/preserve_unchanged_markdown.yml8
-rw-r--r--config/feature_flags/development/push_rules_supersede_code_owners.yml8
-rw-r--r--config/feature_flags/development/refactor_mr_widget_test_summary.yml8
-rw-r--r--config/feature_flags/development/registry_migration_guard_thresholds.yml8
-rw-r--r--config/feature_flags/development/remove_diff_header_icons.yml8
-rw-r--r--config/feature_flags/development/remove_sha_from_releases_json.yml8
-rw-r--r--config/feature_flags/development/rendered_diffs_viewer.yml4
-rw-r--r--config/feature_flags/development/replace_order_by_created_at_with_id.yml8
-rw-r--r--config/feature_flags/development/route_hll_to_snowplow.yml2
-rw-r--r--config/feature_flags/development/runner_list_group_view_vue_ui.yml8
-rw-r--r--config/feature_flags/development/runner_read_only_admin_view.yml8
-rw-r--r--config/feature_flags/development/secure_vulnerability_training.yml8
-rw-r--r--config/feature_flags/development/settings_operations_prometheus_service.yml8
-rw-r--r--config/feature_flags/development/slack_app_use_v2_flow.yml8
-rw-r--r--config/feature_flags/development/ukraine_support_tanuki.yml8
-rw-r--r--config/feature_flags/development/updated_diff_expansion_buttons.yml8
-rw-r--r--config/feature_flags/development/updated_mr_header.yml8
-rw-r--r--config/feature_flags/development/usage_data_diff_searches.yml7
-rw-r--r--config/feature_flags/development/usage_data_static_site_editor_commits.yml8
-rw-r--r--config/feature_flags/development/usage_data_static_site_editor_merge_requests.yml8
-rw-r--r--config/feature_flags/development/use_vsa_aggregated_tables.yml2
-rw-r--r--config/feature_flags/development/vsa_reaggregation_worker.yml2
-rw-r--r--config/feature_flags/development/vulnerability_reads_table.yml8
-rw-r--r--config/feature_flags/development/vulnerability_report_pagination.yml8
-rw-r--r--config/feature_flags/development/workhorse_use_sidechannel.yml8
-rw-r--r--config/feature_flags/experiment/build_ios_app_guide_email.yml8
-rw-r--r--config/feature_flags/ops/certificate_based_clusters.yml2
-rw-r--r--config/feature_flags/ops/ci_runner_separation_by_plan.yml8
-rw-r--r--config/feature_flags/ops/deprecated_serverless.yml8
-rw-r--r--config/feature_flags/ops/jira_raise_timeouts.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_enforce_requests_limits.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_go_user_merge_branch.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_mep_mep.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_pack_objects_hook_with_sidechannel.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_replace_wiki_create_page.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_upload_pack_gitaly_hooks.yml8
-rw-r--r--config/feature_flags/undefined/gitaly_user_merge_branch_access_error.yml8
-rw-r--r--config/gitlab.yml.example54
-rw-r--r--config/gitlab_loose_foreign_keys.yml2
-rw-r--r--config/initializers/00_connection_logger.rb26
-rw-r--r--config/initializers/0_marginalia.rb9
-rw-r--r--config/initializers/1_settings.rb63
-rw-r--r--config/initializers/7_prometheus_metrics.rb18
-rw-r--r--config/initializers/active_record_lifecycle.rb8
-rw-r--r--config/initializers/active_record_transaction_observer.rb2
-rw-r--r--config/initializers/attr_encrypted_no_db_connection.rb19
-rw-r--r--config/initializers/carrierwave_patch.rb2
-rw-r--r--config/initializers/content_security_policy.rb2
-rw-r--r--config/initializers/doorkeeper.rb10
-rw-r--r--config/initializers/elastic_client_setup.rb26
-rw-r--r--config/initializers/omniauth.rb2
-rw-r--r--config/initializers/request_profiler.rb1
-rw-r--r--config/initializers/sidekiq.rb17
-rw-r--r--config/initializers/validate_database_config.rb6
-rw-r--r--config/initializers_before_autoloader/004_zeitwerk.rb1
-rw-r--r--config/metrics/aggregates/code_review.yml12
-rw-r--r--config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml2
-rw-r--r--config/metrics/counts_28d/20210216180814_events.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/20210216181937_failed_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216181941_successful_deployments.yml2
-rw-r--r--config/metrics/counts_28d/20210216182051_protected_branches.yml2
-rw-r--r--config/metrics/counts_28d/20210216183644_gitlab_project.yml3
-rw-r--r--config/metrics/counts_28d/20210216183646_gitlab.yml3
-rw-r--r--config/metrics/counts_28d/20210216183648_github.yml3
-rw-r--r--config/metrics/counts_28d/20210216183650_bitbucket.yml3
-rw-r--r--config/metrics/counts_28d/20210216183652_bitbucket_server.yml3
-rw-r--r--config/metrics/counts_28d/20210216183653_gitea.yml3
-rw-r--r--config/metrics/counts_28d/20210216183655_git.yml3
-rw-r--r--config/metrics/counts_28d/20210216183657_manifest.yml3
-rw-r--r--config/metrics/counts_28d/20210216183659_gitlab_migration.yml3
-rw-r--r--config/metrics/counts_28d/20210216183703_fogbugz.yml3
-rw-r--r--config/metrics/counts_28d/20210216183705_phabricator.yml3
-rw-r--r--config/metrics/counts_28d/20210216183711_gitlab_migration.yml3
-rw-r--r--config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml2
-rwxr-xr-xconfig/metrics/counts_28d/20210216184559_ci_templates_total_unique_counts_monthly.yml2
-rw-r--r--config/metrics/counts_28d/20210715094458_releases_with_milestones.yml2
-rw-r--r--config/metrics/counts_28d/20210901221659_p_ci_templates_security_cluster_image_scanning_monthly.yml4
-rw-r--r--config/metrics/counts_28d/20210901221849_p_ci_templates_managed_cluster_applications_monthly.yml4
-rw-r--r--config/metrics/counts_28d/20210901221932_p_ci_templates_serverless_monthly.yml4
-rw-r--r--config/metrics/counts_28d/20210901223916_p_ci_templates_implicit_security_cluster_image_scanning_monthly.yml4
-rw-r--r--config/metrics/counts_28d/20210910132229_user_auth_by_provider.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/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml25
-rw-r--r--config/metrics/counts_28d/20220428154012_live_preview.yml26
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml26
-rw-r--r--config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml26
-rwxr-xr-xconfig/metrics/counts_7d/20210216184557_ci_templates_total_unique_counts_weekly.yml2
-rw-r--r--config/metrics/counts_7d/20210901221654_p_ci_templates_security_cluster_image_scanning_weekly.yml4
-rw-r--r--config/metrics/counts_7d/20210901221844_p_ci_templates_managed_cluster_applications_weekly.yml4
-rw-r--r--config/metrics/counts_7d/20210901221928_p_ci_templates_serverless_weekly.yml4
-rw-r--r--config/metrics/counts_7d/20210901223912_p_ci_templates_implicit_security_cluster_image_scanning_weekly.yml4
-rw-r--r--config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml25
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml26
-rw-r--r--config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml26
-rw-r--r--config/metrics/counts_all/20210216175446_network_policy_forwards.yml4
-rw-r--r--config/metrics/counts_all/20210216175448_network_policy_drops.yml4
-rw-r--r--config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml2
-rw-r--r--config/metrics/counts_all/20210216175525_ci_builds.yml2
-rw-r--r--config/metrics/counts_all/20210216180638_gitlab_project.yml3
-rw-r--r--config/metrics/counts_all/20210216180639_gitlab.yml3
-rw-r--r--config/metrics/counts_all/20210216180641_github.yml3
-rw-r--r--config/metrics/counts_all/20210216180643_bitbucket.yml3
-rw-r--r--config/metrics/counts_all/20210216180645_bitbucket_server.yml3
-rw-r--r--config/metrics/counts_all/20210216180647_gitea.yml3
-rw-r--r--config/metrics/counts_all/20210216180649_git.yml3
-rw-r--r--config/metrics/counts_all/20210216180650_manifest.yml3
-rw-r--r--config/metrics/counts_all/20210216180652_gitlab_migration.yml3
-rw-r--r--config/metrics/counts_all/20210216180656_fogbugz.yml3
-rw-r--r--config/metrics/counts_all/20210216180658_phabricator.yml3
-rw-r--r--config/metrics/counts_all/20210216180703_gitlab_migration.yml3
-rw-r--r--config/metrics/counts_all/20210216180754_events.yml2
-rw-r--r--config/metrics/counts_all/20210216180931_projects_prometheus_active.yml2
-rw-r--r--config/metrics/counts_all/20210216181249_feature_flags.yml2
-rw-r--r--config/metrics/counts_all/20210216181914_environments.yml2
-rw-r--r--config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.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/20210514141520_project_imports_total.yml2
-rw-r--r--config/metrics/license/20210204124829_active_user_count.yml2
-rw-r--r--config/metrics/schema.json3
-rw-r--r--config/metrics/settings/20210204124912_prometheus_enabled.yml2
-rw-r--r--config/object_store_settings.rb21
-rw-r--r--config/pseudonymizer.yml472
-rw-r--r--config/routes.rb5
-rw-r--r--config/routes/admin.rb5
-rw-r--r--config/routes/project.rb11
-rw-r--r--config/routes/user.rb2
-rw-r--r--config/settings.rb6
-rw-r--r--config/sidekiq_queues.yml12
-rw-r--r--danger/roulette/Dangerfile4
-rw-r--r--data/deprecations/14-0-nfs-fot-git-repository-storage.yml2
-rw-r--r--data/deprecations/14-10-dependency-scanning-default-java-version.yml16
-rw-r--r--data/deprecations/14-3-repository-push-audit-events.yml4
-rw-r--r--data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml19
-rw-r--r--data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml22
-rw-r--r--data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml8
-rw-r--r--data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml3
-rw-r--r--data/deprecations/14-5-deprecate-sles-12sp2.yml2
-rw-r--r--data/deprecations/14-5-remove-package-pipelines-api.yml6
-rw-r--r--data/deprecations/14-6-deprecate-types.yml3
-rw-r--r--data/deprecations/14-6-job_char_limit.yml3
-rw-r--r--data/deprecations/14-6-pipeline-fields-package-deprecation.yml13
-rw-r--r--data/deprecations/14-6-runner-api-status-renames-not_connected.yml15
-rw-r--r--data/deprecations/14-6-runner_api_new_stale_status_breaking_change.yml14
-rw-r--r--data/deprecations/14-7-deprecate-static-site-editor.yml4
-rw-r--r--data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml2
-rw-r--r--data/deprecations/14-8-enforce-pat-expiration.yml1
-rw-r--r--data/deprecations/14-8-enforce-ssh-expiration.yml1
-rw-r--r--data/deprecations/14-8-graphql-ids.yml2
-rw-r--r--data/deprecations/14-8-grpc-proxy.yml2
-rw-r--r--data/deprecations/14-8-protect-cns-chs.yml2
-rw-r--r--data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml4
-rw-r--r--data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml2
-rw-r--r--data/deprecations/14-8-sast-analyzer-removals.yml11
-rw-r--r--data/deprecations/14-9-deprecate-composer-download-permissions.yml5
-rw-r--r--data/deprecations/14-9-deprecate-permissions-change-package-settings.yml1
-rw-r--r--data/deprecations/14-9-deprecate-testcoveragesetting.yml3
-rw-r--r--data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml12
-rw-r--r--data/deprecations/15-0-JTW_v2_update.yml28
-rw-r--r--data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml19
-rw-r--r--data/deprecations/15-0-deprecate-postgresql-12.yml19
-rw-r--r--data/deprecations/15-0-oauth-noexpiry.yml3
-rw-r--r--data/deprecations/15-0-oauth.yml3
-rw-r--r--data/deprecations/15-0-runner-status-legacy-mode.yml18
-rw-r--r--data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml19
-rw-r--r--data/deprecations/distribution_deprecations_14-4.yml1
-rw-r--r--data/deprecations/templates/14-9-deprecation-htpassword-authentication-container-registry.yml11
-rw-r--r--data/deprecations/templates/_deprecation_template.md.erb11
-rw-r--r--data/deprecations/templates/example.yml20
-rw-r--r--data/removals/14_0/removal_enablement_pg11.yml4
-rw-r--r--data/removals/14_10/14-10-package-permissions-composer-change.yml12
-rw-r--r--data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml11
-rw-r--r--data/removals/15_0/15-0-Pseudonymizer.yml13
-rw-r--r--data/removals/15_0/15-0-Retire-js-analyzer.yml13
-rw-r--r--data/removals/15_0/15-0-SLES-12-SP2.yml10
-rw-r--r--data/removals/15_0/15-0-advanced-search-elasticsearch-6-8.yml16
-rw-r--r--data/removals/15_0/15-0-bundler-audit.yml13
-rw-r--r--data/removals/15_0/15-0-container-registry-htpasswd.yml11
-rw-r--r--data/removals/15_0/15-0-custom_hooks_dir.yml12
-rw-r--r--data/removals/15_0/15-0-database-deprecate-legacy-database-conf.yml17
-rw-r--r--data/removals/15_0/15-0-dependency-scanning-default-java-version.yml15
-rw-r--r--data/removals/15_0/15-0-dependency-scanning-python-image.yml11
-rw-r--r--data/removals/15_0/15-0-ds-default-analyzers.yml12
-rw-r--r--data/removals/15_0/15-0-geo-remove-db-rake-tasks.yml31
-rw-r--r--data/removals/15_0/15-0-geo-remove-promote-db.yml13
-rw-r--r--data/removals/15_0/15-0-geo-remove-promote-to-primary-node.yml13
-rw-r--r--data/removals/15_0/15-0-gitaly-internal-socket-dir.yml13
-rw-r--r--data/removals/15_0/15-0-managed-cluster-applications.yml12
-rw-r--r--data/removals/15_0/15-0-oauth-implicit-grant.yml16
-rw-r--r--data/removals/15_0/15-0-oauth-tokens-no-expiry.yml18
-rw-r--r--data/removals/15_0/15-0-omniauth-kerberos-gem.yml21
-rw-r--r--data/removals/15_0/15-0-package-container-registry-group-api.yml14
-rw-r--r--data/removals/15_0/15-0-package-settings-permissions.yml18
-rw-r--r--data/removals/15_0/15-0-praefect-database-no-proxy.yml11
-rw-r--r--data/removals/15_0/15-0-praefect-virtual-storage.yml9
-rw-r--r--data/removals/15_0/15-0-protect-cns-chs.yml21
-rw-r--r--data/removals/15_0/15-0-protect-vulnerability-check.yml18
-rw-r--r--data/removals/15_0/15-0-removal-artifacts-keyword.yml16
-rw-r--r--data/removals/15_0/15-0-removal-testcoveragesetting.yml14
-rw-r--r--data/removals/15_0/15-0-remove-background-upload-object-storage.yml20
-rw-r--r--data/removals/15_0/15-0-remove-dependency-proxy-feature-flag.yml13
-rw-r--r--data/removals/15_0/15-0-remove-replicaiton-detail-routes.yml12
-rw-r--r--data/removals/15_0/15-0-remove-versions-packagetype.yml13
-rw-r--r--data/removals/15_0/15-0-remove_ff_push_rules_supersede_code_owners.yml16
-rw-r--r--data/removals/15_0/15-0-request-profiling.yml18
-rw-r--r--data/removals/15_0/15-0-runner-api-status-renames-not_connected.yml16
-rw-r--r--data/removals/15_0/15-0-runner-disable-strict-host-key-check.yml14
-rw-r--r--data/removals/15_0/15-0-runner_api_new_stale_status_breaking_change.yml17
-rw-r--r--data/removals/15_0/15-0-sast-dotnet-21.yml33
-rw-r--r--data/removals/15_0/15-0-sast-spotbugs-java-8.yml28
-rw-r--r--data/removals/15_0/15-0-secret-detection-configurations.yml30
-rw-r--r--data/removals/15_0/15-0-serverless.yml17
-rw-r--r--data/removals/15_0/15-0-sidekiq-metrics-health-check-config.yml24
-rw-r--r--data/removals/15_0/15-0-static-site-editor.yml17
-rw-r--r--data/removals/15_0/15-0-tracing.yml16
-rw-r--r--data/removals/15_0/15-0-type.yml10
-rw-r--r--data/removals/15_0/15_0-logging.yml16
-rw-r--r--data/removals/15_0/15_0-remove-pipelines-from-version-field.yml16
-rw-r--r--data/removals/15_0/removal-manage-premium-required-pipelines.yml18
-rw-r--r--data/removals/15_0/removal_manage_ repository_push_audit_event.yml17
-rw-r--r--data/removals/15_0/removal_manage_optional_pat_expiration.yml13
-rw-r--r--data/removals/15_0/removal_manage_ssh_expiration.yml13
-rw-r--r--data/removals/15_0/removal_manage_status_check_passed_status.yml25
-rw-r--r--data/removals/templates/example.yml20
-rw-r--r--data/whats_new/202107220001_14_1.yml12
-rw-r--r--data/whats_new/202109200001_14_03.yml2
-rw-r--r--data/whats_new/2021111800001_14_05.yml2
-rw-r--r--db/docs/abuse_reports.yml4
-rw-r--r--db/docs/alert_management_alert_assignees.yml4
-rw-r--r--db/docs/alert_management_alert_metric_images.yml2
-rw-r--r--db/docs/alert_management_alert_user_mentions.yml4
-rw-r--r--db/docs/alert_management_alerts.yml4
-rw-r--r--db/docs/alert_management_http_integrations.yml4
-rw-r--r--db/docs/allowed_email_domains.yml4
-rw-r--r--db/docs/analytics_cycle_analytics_group_value_streams.yml2
-rw-r--r--db/docs/analytics_cycle_analytics_project_value_streams.yml4
-rw-r--r--db/docs/application_settings.yml1
-rw-r--r--db/docs/approval_merge_request_rules_approved_approvers.yml2
-rw-r--r--db/docs/approvers.yml4
-rw-r--r--db/docs/ar_internal_metadata.yml7
-rw-r--r--db/docs/atlassian_identities.yml6
-rw-r--r--db/docs/authentication_events.yml2
-rw-r--r--db/docs/award_emoji.yml6
-rw-r--r--db/docs/background_migration_jobs.yml6
-rw-r--r--db/docs/badges.yml4
-rw-r--r--db/docs/batched_background_migration_job_transition_logs.yml4
-rw-r--r--db/docs/batched_background_migration_jobs.yml3
-rw-r--r--db/docs/batched_background_migrations.yml4
-rw-r--r--db/docs/board_assignees.yml2
-rw-r--r--db/docs/board_group_recent_visits.yml2
-rw-r--r--db/docs/board_labels.yml2
-rw-r--r--db/docs/board_project_recent_visits.yml2
-rw-r--r--db/docs/board_user_preferences.yml4
-rw-r--r--db/docs/boards.yml4
-rw-r--r--db/docs/boards_epic_board_labels.yml4
-rw-r--r--db/docs/boards_epic_board_positions.yml4
-rw-r--r--db/docs/boards_epic_board_recent_visits.yml4
-rw-r--r--db/docs/boards_epic_boards.yml2
-rw-r--r--db/docs/boards_epic_list_user_preferences.yml4
-rw-r--r--db/docs/boards_epic_lists.yml4
-rw-r--r--db/docs/boards_epic_user_preferences.yml6
-rw-r--r--db/docs/bulk_import_configurations.yml2
-rw-r--r--db/docs/bulk_import_entities.yml2
-rw-r--r--db/docs/bulk_import_export_uploads.yml2
-rw-r--r--db/docs/bulk_import_exports.yml2
-rw-r--r--db/docs/bulk_import_failures.yml2
-rw-r--r--db/docs/bulk_import_trackers.yml2
-rw-r--r--db/docs/bulk_imports.yml2
-rw-r--r--db/docs/chat_names.yml7
-rw-r--r--db/docs/chat_teams.yml7
-rw-r--r--db/docs/ci_build_needs.yml4
-rw-r--r--db/docs/ci_build_pending_states.yml2
-rw-r--r--db/docs/ci_build_report_results.yml2
-rw-r--r--db/docs/ci_daily_build_group_report_results.yml2
-rw-r--r--db/docs/ci_deleted_objects.yml2
-rw-r--r--db/docs/ci_freeze_periods.yml2
-rw-r--r--db/docs/ci_instance_variables.yml2
-rw-r--r--db/docs/ci_job_artifact_states.yml2
-rw-r--r--db/docs/ci_pipeline_artifacts.yml2
-rw-r--r--db/docs/ci_pipeline_messages.yml2
-rw-r--r--db/docs/ci_platform_metrics.yml2
-rw-r--r--db/docs/ci_runner_namespaces.yml4
-rw-r--r--db/docs/ci_runner_projects.yml2
-rw-r--r--db/docs/ci_runners.yml4
-rw-r--r--db/docs/ci_sources_pipelines.yml4
-rw-r--r--db/docs/ci_unit_tests.yml2
-rw-r--r--db/docs/cluster_agent_tokens.yml2
-rw-r--r--db/docs/cluster_agents.yml2
-rw-r--r--db/docs/clusters.yml6
-rw-r--r--db/docs/clusters_applications_cilium.yml6
-rw-r--r--db/docs/clusters_applications_prometheus.yml4
-rw-r--r--db/docs/clusters_integration_elasticstack.yml2
-rw-r--r--db/docs/clusters_integration_prometheus.yml2
-rw-r--r--db/docs/commit_user_mentions.yml4
-rw-r--r--db/docs/container_expiration_policies.yml2
-rw-r--r--db/docs/container_repositories.yml4
-rw-r--r--db/docs/coverage_fuzzing_corpuses.yml4
-rw-r--r--db/docs/csv_issue_imports.yml2
-rw-r--r--db/docs/custom_emoji.yml4
-rw-r--r--db/docs/customer_relations_contacts.yml4
-rw-r--r--db/docs/customer_relations_organizations.yml4
-rw-r--r--db/docs/dast_scanner_profiles.yml2
-rw-r--r--db/docs/dast_site_profiles.yml2
-rw-r--r--db/docs/dast_site_tokens.yml2
-rw-r--r--db/docs/dast_site_validations.yml2
-rw-r--r--db/docs/dast_sites.yml2
-rw-r--r--db/docs/dependency_proxy_blobs.yml2
-rw-r--r--db/docs/dependency_proxy_group_settings.yml2
-rw-r--r--db/docs/dependency_proxy_image_ttl_group_policies.yml2
-rw-r--r--db/docs/dependency_proxy_manifests.yml4
-rw-r--r--db/docs/description_versions.yml4
-rw-r--r--db/docs/design_management_designs.yml2
-rw-r--r--db/docs/design_management_designs_versions.yml2
-rw-r--r--db/docs/design_management_versions.yml2
-rw-r--r--db/docs/design_user_mentions.yml4
-rw-r--r--db/docs/diff_note_positions.yml2
-rw-r--r--db/docs/draft_notes.yml5
-rw-r--r--db/docs/elastic_reindexing_tasks.yml2
-rw-r--r--db/docs/emails.yml2
-rw-r--r--db/docs/epic_issues.yml2
-rw-r--r--db/docs/epic_user_mentions.yml4
-rw-r--r--db/docs/epics.yml2
-rw-r--r--db/docs/error_tracking_client_keys.yml2
-rw-r--r--db/docs/error_tracking_error_events.yml4
-rw-r--r--db/docs/error_tracking_errors.yml4
-rw-r--r--db/docs/experiment_users.yml2
-rw-r--r--db/docs/experiments.yml4
-rw-r--r--db/docs/geo_cache_invalidation_events.yml2
-rw-r--r--db/docs/geo_container_repository_updated_events.yml2
-rw-r--r--db/docs/geo_event_log.yml2
-rw-r--r--db/docs/geo_events.yml2
-rw-r--r--db/docs/geo_hashed_storage_attachments_events.yml2
-rw-r--r--db/docs/geo_hashed_storage_migrated_events.yml2
-rw-r--r--db/docs/geo_job_artifact_deleted_events.yml9
-rw-r--r--db/docs/geo_lfs_object_deleted_events.yml2
-rw-r--r--db/docs/geo_node_namespace_links.yml2
-rw-r--r--db/docs/geo_node_statuses.yml2
-rw-r--r--db/docs/geo_nodes.yml2
-rw-r--r--db/docs/geo_repositories_changed_events.yml2
-rw-r--r--db/docs/geo_repository_created_events.yml2
-rw-r--r--db/docs/geo_repository_deleted_events.yml2
-rw-r--r--db/docs/geo_repository_renamed_events.yml2
-rw-r--r--db/docs/geo_repository_updated_events.yml2
-rw-r--r--db/docs/geo_reset_checksum_events.yml2
-rw-r--r--db/docs/gitlab_subscription_histories.yml2
-rw-r--r--db/docs/gitlab_subscriptions.yml2
-rw-r--r--db/docs/group_crm_settings.yml4
-rw-r--r--db/docs/group_custom_attributes.yml4
-rw-r--r--db/docs/group_deploy_keys.yml2
-rw-r--r--db/docs/group_deploy_keys_groups.yml2
-rw-r--r--db/docs/group_features.yml9
-rw-r--r--db/docs/group_import_states.yml4
-rw-r--r--db/docs/group_wiki_repositories.yml4
-rw-r--r--db/docs/import_export_uploads.yml2
-rw-r--r--db/docs/import_failures.yml2
-rw-r--r--db/docs/incident_management_escalation_policies.yml2
-rw-r--r--db/docs/incident_management_escalation_rules.yml2
-rw-r--r--db/docs/incident_management_issuable_escalation_statuses.yml2
-rw-r--r--db/docs/incident_management_oncall_participants.yml3
-rw-r--r--db/docs/incident_management_oncall_rotations.yml3
-rw-r--r--db/docs/incident_management_oncall_schedules.yml3
-rw-r--r--db/docs/incident_management_oncall_shifts.yml3
-rw-r--r--db/docs/incident_management_pending_alert_escalations.yml4
-rw-r--r--db/docs/incident_management_pending_issue_escalations.yml2
-rw-r--r--db/docs/incident_management_timeline_events.yml2
-rw-r--r--db/docs/integrations.yml4
-rw-r--r--db/docs/internal_ids.yml7
-rw-r--r--db/docs/issuable_severities.yml4
-rw-r--r--db/docs/issuable_slas.yml4
-rw-r--r--db/docs/issue_assignees.yml4
-rw-r--r--db/docs/issue_customer_relations_contacts.yml4
-rw-r--r--db/docs/issue_email_participants.yml2
-rw-r--r--db/docs/issue_emails.yml3
-rw-r--r--db/docs/issue_links.yml4
-rw-r--r--db/docs/issue_tracker_data.yml4
-rw-r--r--db/docs/issue_user_mentions.yml2
-rw-r--r--db/docs/issues.yml2
-rw-r--r--db/docs/issues_prometheus_alert_events.yml2
-rw-r--r--db/docs/issues_self_managed_prometheus_alert_events.yml2
-rw-r--r--db/docs/iterations_cadences.yml4
-rw-r--r--db/docs/jira_connect_installations.yml2
-rw-r--r--db/docs/jira_connect_subscriptions.yml2
-rw-r--r--db/docs/jira_imports.yml6
-rw-r--r--db/docs/jira_tracker_data.yml2
-rw-r--r--db/docs/keys.yml5
-rw-r--r--db/docs/label_links.yml2
-rw-r--r--db/docs/label_priorities.yml4
-rw-r--r--db/docs/labels.yml2
-rw-r--r--db/docs/lfs_file_locks.yml2
-rw-r--r--db/docs/lfs_object_states.yml2
-rw-r--r--db/docs/lfs_objects.yml4
-rw-r--r--db/docs/lfs_objects_projects.yml4
-rw-r--r--db/docs/licenses.yml2
-rw-r--r--db/docs/list_user_preferences.yml4
-rw-r--r--db/docs/lists.yml4
-rw-r--r--db/docs/member_tasks.yml2
-rw-r--r--db/docs/members.yml2
-rw-r--r--db/docs/merge_request_assignees.yml4
-rw-r--r--db/docs/merge_request_cleanup_schedules.yml2
-rw-r--r--db/docs/merge_request_context_commits.yml2
-rw-r--r--db/docs/merge_request_diff_commit_users.yml2
-rw-r--r--db/docs/merge_request_diff_commits.yml4
-rw-r--r--db/docs/merge_request_diff_details.yml6
-rw-r--r--db/docs/merge_request_diff_files.yml4
-rw-r--r--db/docs/merge_request_diffs.yml2
-rw-r--r--db/docs/merge_request_metrics.yml4
-rw-r--r--db/docs/merge_request_reviewers.yml4
-rw-r--r--db/docs/merge_request_user_mentions.yml4
-rw-r--r--db/docs/merge_requests.yml2
-rw-r--r--db/docs/merge_requests_closing_issues.yml4
-rw-r--r--db/docs/metrics_dashboard_annotations.yml2
-rw-r--r--db/docs/metrics_users_starred_dashboards.yml2
-rw-r--r--db/docs/milestones.yml2
-rw-r--r--db/docs/namespace_admin_notes.yml3
-rw-r--r--db/docs/namespace_ci_cd_settings.yml10
-rw-r--r--db/docs/namespace_limits.yml6
-rw-r--r--db/docs/namespace_package_settings.yml2
-rw-r--r--db/docs/namespace_settings.yml4
-rw-r--r--db/docs/namespaces.yml4
-rw-r--r--db/docs/note_diff_files.yml4
-rw-r--r--db/docs/notes.yml6
-rw-r--r--db/docs/notification_settings.yml2
-rw-r--r--db/docs/operations_feature_flags.yml2
-rw-r--r--db/docs/operations_feature_flags_issues.yml2
-rw-r--r--db/docs/operations_strategies_user_lists.yml2
-rw-r--r--db/docs/operations_user_lists.yml2
-rw-r--r--db/docs/packages_build_infos.yml2
-rw-r--r--db/docs/packages_cleanup_policies.yml9
-rw-r--r--db/docs/packages_composer_cache_files.yml2
-rw-r--r--db/docs/packages_composer_metadata.yml4
-rw-r--r--db/docs/packages_conan_file_metadata.yml2
-rw-r--r--db/docs/packages_conan_metadata.yml2
-rw-r--r--db/docs/packages_debian_file_metadata.yml2
-rw-r--r--db/docs/packages_debian_group_architectures.yml2
-rw-r--r--db/docs/packages_debian_group_component_files.yml2
-rw-r--r--db/docs/packages_debian_group_components.yml2
-rw-r--r--db/docs/packages_debian_group_distribution_keys.yml2
-rw-r--r--db/docs/packages_debian_group_distributions.yml2
-rw-r--r--db/docs/packages_debian_project_architectures.yml2
-rw-r--r--db/docs/packages_debian_project_component_files.yml2
-rw-r--r--db/docs/packages_debian_project_components.yml2
-rw-r--r--db/docs/packages_debian_project_distribution_keys.yml2
-rw-r--r--db/docs/packages_debian_project_distributions.yml2
-rw-r--r--db/docs/packages_debian_publications.yml2
-rw-r--r--db/docs/packages_dependencies.yml2
-rw-r--r--db/docs/packages_dependency_links.yml2
-rw-r--r--db/docs/packages_events.yml2
-rw-r--r--db/docs/packages_helm_file_metadata.yml2
-rw-r--r--db/docs/packages_maven_metadata.yml2
-rw-r--r--db/docs/packages_npm_metadata.yml2
-rw-r--r--db/docs/packages_nuget_dependency_link_metadata.yml4
-rw-r--r--db/docs/packages_nuget_metadata.yml6
-rw-r--r--db/docs/packages_package_file_build_infos.yml2
-rw-r--r--db/docs/packages_package_files.yml2
-rw-r--r--db/docs/packages_packages.yml2
-rw-r--r--db/docs/packages_pypi_metadata.yml4
-rw-r--r--db/docs/packages_rubygems_metadata.yml2
-rw-r--r--db/docs/packages_tags.yml2
-rw-r--r--db/docs/pages_deployment_states.yml2
-rw-r--r--db/docs/pages_deployments.yml4
-rw-r--r--db/docs/pages_domain_acme_orders.yml2
-rw-r--r--db/docs/pages_domains.yml4
-rw-r--r--db/docs/plan_limits.yml2
-rw-r--r--db/docs/plans.yml2
-rw-r--r--db/docs/programming_languages.yml6
-rw-r--r--db/docs/project_access_tokens.yml2
-rw-r--r--db/docs/project_alerting_settings.yml4
-rw-r--r--db/docs/project_authorizations.yml5
-rw-r--r--db/docs/project_build_artifacts_size_refreshes.yml9
-rw-r--r--db/docs/project_ci_feature_usages.yml5
-rw-r--r--db/docs/project_compliance_framework_settings.yml2
-rw-r--r--db/docs/project_custom_attributes.yml4
-rw-r--r--db/docs/project_error_tracking_settings.yml4
-rw-r--r--db/docs/project_export_jobs.yml2
-rw-r--r--db/docs/project_feature_usages.yml4
-rw-r--r--db/docs/project_features.yml6
-rw-r--r--db/docs/project_import_data.yml2
-rw-r--r--db/docs/project_incident_management_settings.yml2
-rw-r--r--db/docs/project_mirror_data.yml2
-rw-r--r--db/docs/project_pages_metadata.yml2
-rw-r--r--db/docs/project_repository_storage_moves.yml2
-rw-r--r--db/docs/project_security_settings.yml7
-rw-r--r--db/docs/project_settings.yml4
-rw-r--r--db/docs/project_topics.yml2
-rw-r--r--db/docs/project_tracing_settings.yml2
-rw-r--r--db/docs/projects.yml2
-rw-r--r--db/docs/prometheus_alerts.yml2
-rw-r--r--db/docs/protected_environment_approval_rules.yml9
-rw-r--r--db/docs/raw_usage_data.yml2
-rw-r--r--db/docs/redirect_routes.yml4
-rw-r--r--db/docs/related_epic_links.yml2
-rw-r--r--db/docs/requirements.yml2
-rw-r--r--db/docs/requirements_management_test_reports.yml6
-rw-r--r--db/docs/resource_iteration_events.yml4
-rw-r--r--db/docs/resource_label_events.yml2
-rw-r--r--db/docs/resource_milestone_events.yml4
-rw-r--r--db/docs/resource_state_events.yml6
-rw-r--r--db/docs/resource_weight_events.yml4
-rw-r--r--db/docs/reviews.yml2
-rw-r--r--db/docs/routes.yml5
-rw-r--r--db/docs/saved_replies.yml4
-rw-r--r--db/docs/schema_migrations.yml7
-rw-r--r--db/docs/security_findings.yml4
-rw-r--r--db/docs/security_orchestration_policy_configurations.yml4
-rw-r--r--db/docs/security_orchestration_policy_rule_schedules.yml3
-rw-r--r--db/docs/security_scans.yml2
-rw-r--r--db/docs/security_training_providers.yml2
-rw-r--r--db/docs/security_trainings.yml2
-rw-r--r--db/docs/sent_notifications.yml6
-rw-r--r--db/docs/sentry_issues.yml2
-rw-r--r--db/docs/service_desk_settings.yml2
-rw-r--r--db/docs/slack_integrations.yml2
-rw-r--r--db/docs/snippet_repositories.yml2
-rw-r--r--db/docs/snippet_statistics.yml4
-rw-r--r--db/docs/snippet_user_mentions.yml2
-rw-r--r--db/docs/snippets.yml4
-rw-r--r--db/docs/software_license_policies.yml2
-rw-r--r--db/docs/software_licenses.yml2
-rw-r--r--db/docs/sprints.yml4
-rw-r--r--db/docs/status_page_published_incidents.yml4
-rw-r--r--db/docs/status_page_settings.yml2
-rw-r--r--db/docs/suggestions.yml4
-rw-r--r--db/docs/system_note_metadata.yml4
-rw-r--r--db/docs/taggings.yml5
-rw-r--r--db/docs/tags.yml3
-rw-r--r--db/docs/terraform_state_versions.yml2
-rw-r--r--db/docs/terraform_states.yml2
-rw-r--r--db/docs/timelogs.yml4
-rw-r--r--db/docs/todos.yml2
-rw-r--r--db/docs/topics.yml2
-rw-r--r--db/docs/upcoming_reconciliations.yml2
-rw-r--r--db/docs/upload_states.yml2
-rw-r--r--db/docs/user_agent_details.yml6
-rw-r--r--db/docs/user_callouts.yml4
-rw-r--r--db/docs/user_canonical_emails.yml6
-rw-r--r--db/docs/user_credit_card_validations.yml4
-rw-r--r--db/docs/user_custom_attributes.yml4
-rw-r--r--db/docs/user_details.yml2
-rw-r--r--db/docs/user_follow_users.yml2
-rw-r--r--db/docs/user_group_callouts.yml2
-rw-r--r--db/docs/user_interacted_projects.yml6
-rw-r--r--db/docs/user_preferences.yml4
-rw-r--r--db/docs/user_statuses.yml4
-rw-r--r--db/docs/users_security_dashboard_projects.yml2
-rw-r--r--db/docs/users_star_projects.yml4
-rw-r--r--db/docs/users_statistics.yml4
-rw-r--r--db/docs/verification_codes.yml2
-rw-r--r--db/docs/vulnerabilities.yml2
-rw-r--r--db/docs/vulnerability_exports.yml2
-rw-r--r--db/docs/vulnerability_external_issue_links.yml2
-rw-r--r--db/docs/vulnerability_feedback.yml2
-rw-r--r--db/docs/vulnerability_finding_evidences.yml2
-rw-r--r--db/docs/vulnerability_finding_links.yml4
-rw-r--r--db/docs/vulnerability_finding_signatures.yml2
-rw-r--r--db/docs/vulnerability_findings_remediations.yml2
-rw-r--r--db/docs/vulnerability_flags.yml2
-rw-r--r--db/docs/vulnerability_historical_statistics.yml4
-rw-r--r--db/docs/vulnerability_identifiers.yml2
-rw-r--r--db/docs/vulnerability_issue_links.yml2
-rw-r--r--db/docs/vulnerability_occurrence_identifiers.yml2
-rw-r--r--db/docs/vulnerability_occurrence_pipelines.yml4
-rw-r--r--db/docs/vulnerability_occurrences.yml2
-rw-r--r--db/docs/vulnerability_reads.yml2
-rw-r--r--db/docs/vulnerability_remediations.yml2
-rw-r--r--db/docs/vulnerability_scanners.yml2
-rw-r--r--db/docs/vulnerability_statistics.yml4
-rw-r--r--db/docs/vulnerability_user_mentions.yml4
-rw-r--r--db/docs/web_hook_logs.yml2
-rw-r--r--db/docs/web_hooks.yml2
-rw-r--r--db/docs/webauthn_registrations.yml2
-rw-r--r--db/docs/wiki_page_meta.yml2
-rw-r--r--db/docs/wiki_page_slugs.yml2
-rw-r--r--db/docs/work_item_types.yml2
-rw-r--r--db/docs/zentao_tracker_data.yml2
-rw-r--r--db/docs/zoom_meetings.yml2
-rw-r--r--db/fixtures/development/001_create_base_work_item_types.rb2
-rw-r--r--db/fixtures/development/04_labels.rb4
-rw-r--r--db/fixtures/development/33_triage_ops.rb36
-rw-r--r--db/fixtures/development/34_uploads.rb54
-rw-r--r--db/fixtures/production/003_create_base_work_item_types.rb2
-rw-r--r--db/migrate/20220213100000_remove_integration_type_triggers.rb32
-rw-r--r--db/migrate/20220324091224_add_enforce_auth_checks_on_uploads_to_project_settings.rb9
-rw-r--r--db/migrate/20220331125725_add_title_to_topic.rb10
-rw-r--r--db/migrate/20220331130726_add_text_limit_to_topics_title.rb13
-rw-r--r--db/migrate/20220401071609_add_campaign_to_in_product_marketing_email.rb35
-rw-r--r--db/migrate/20220401151123_add_last_repository_updated_at_to_project_repository_state.rb8
-rw-r--r--db/migrate/20220406133049_add_delayed_group_deletion_to_application_settings.rb11
-rw-r--r--db/migrate/20220412060931_add_nullify_build_data_trigger_on_merge_request_metrics.rb28
-rw-r--r--db/migrate/20220412135446_add_unique_fingerprint_sha256_index_to_key.rb18
-rw-r--r--db/migrate/20220412140446_add_unique_fingerprint_sha256_index_to_group_deploy_key.rb18
-rw-r--r--db/migrate/20220412140755_drop_unique_fingerprint_md5_index_from_key.rb17
-rw-r--r--db/migrate/20220412141020_drop_unique_fingerprint_md5_index_from_group_deploy_key.rb17
-rw-r--r--db/migrate/20220413054910_backfill_delayed_group_deletion.rb21
-rw-r--r--db/migrate/20220413124200_add_view_for_per_table_autovacuum_status.rb45
-rw-r--r--db/migrate/20220413164146_remove_max_seats_used_indices.rb24
-rw-r--r--db/migrate/20220413235818_add_max_seats_used_changed_at_to_gitlab_subscriptions.rb7
-rw-r--r--db/migrate/20220414203622_add_index_for_columns_user_custom_attribute.rb14
-rw-r--r--db/migrate/20220415015143_replace_iterations_cadence_date_range_constraint.rb35
-rw-r--r--db/migrate/20220419223906_add_arkose_namespace_to_application_settings.rb23
-rw-r--r--db/migrate/20220420034519_add_text_limit_to_in_product_marketing_email_campaign.rb13
-rw-r--r--db/migrate/20220420135245_fix_batched_background_migration_default_arguments.rb7
-rw-r--r--db/migrate/20220420173247_add_group_inheritance_type_to_pe_authorizable.rb14
-rw-r--r--db/migrate/20220420192542_add_id_for_cleanup_index_packages_package_files.rb19
-rw-r--r--db/migrate/20220421114418_make_fingerprint_nullable_for_group_deploy_key.rb11
-rw-r--r--db/migrate/20220421141342_add_allowed_plans_to_ci_runners.rb9
-rw-r--r--db/migrate/20220421144758_change_dotenv_plan_limits_for_old_plans.rb19
-rw-r--r--db/migrate/20220421180321_add_last_cleanup_deleted_tags_count_to_container_repository.rb7
-rw-r--r--db/migrate/20220422200633_fix_view_for_per_table_autovacuum_status.rb73
-rw-r--r--db/migrate/20220422220507_remove_tmp_index_supporting_leaky_regex_cleanup.rb25
-rw-r--r--db/migrate/20220425120604_create_packages_cleanup_policies.rb22
-rw-r--r--db/migrate/20220426130217_add_max_export_size_to_application_settings.rb7
-rw-r--r--db/migrate/20220502125053_recreate_index_for_project_group_link_with_group_id_and_project_id.rb18
-rw-r--r--db/migrate/20220502150408_add_slack_integrations_bot_columns.rb11
-rw-r--r--db/migrate/20220502152633_add_slack_integrations_bot_user_id_text_limit.rb13
-rw-r--r--db/migrate/20220503073401_recreate_index_for_group_group_link_with_both_group_ids.rb18
-rw-r--r--db/migrate/20220503102855_add_namespace_ci_cd_settings_table.rb16
-rw-r--r--db/migrate/20220504042847_add_slack_signing_key_to_application_settings.rb8
-rw-r--r--db/migrate/20220504140036_add_container_registry_size_to_namespace_root_storage_statistics.rb9
-rw-r--r--db/migrate/20220505092254_add_allow_stale_runner_pruning_index_to_namespace_ci_cd_settings.rb18
-rw-r--r--db/migrate/20220506180411_add_index_to_vulnerability_feedback_finding_uuid.rb17
-rw-r--r--db/migrate/20220507204024_add_separated_caches_option_to_project_ci_settings.rb9
-rw-r--r--db/migrate/20220511090324_add_last_consistency_check_cursors_to_vsa_aggregations.rb28
-rw-r--r--db/migrate/20220511151646_add_exclude_from_free_user_cap_to_namespace_settings.rb13
-rw-r--r--db/migrate/20220511191502_add_registry_migration_guard_thresholds_to_application_settings.rb15
-rw-r--r--db/migrate/20220511191503_add_pipeline_create_limit_per_project_user_sha_to_application_settings.rb7
-rw-r--r--db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb38
-rw-r--r--db/post_migrate/20211103184303_drop_runner_features_from_ci_builds_metadata.rb13
-rw-r--r--db/post_migrate/20220213103859_remove_integrations_type.rb132
-rw-r--r--db/post_migrate/20220314154235_migrate_vulnerability_approval_rules.rb17
-rw-r--r--db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb35
-rw-r--r--db/post_migrate/20220324165436_schedule_backfill_project_settings.rb25
-rw-r--r--db/post_migrate/20220328095848_delete_failed_reset_duplicate_ci_runners_token_migration_records.rb17
-rw-r--r--db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb31
-rw-r--r--db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb31
-rw-r--r--db/post_migrate/20220331133802_schedule_backfill_topics_title.rb21
-rw-r--r--db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb16
-rw-r--r--db/post_migrate/20220405092619_toggle_vsa_aggregations_enable.rb19
-rw-r--r--db/post_migrate/20220411173544_cleanup_orphans_approval_project_rules.rb38
-rw-r--r--db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb2
-rw-r--r--db/post_migrate/20220415124802_remove_job_artifact_deprecated_geo_fields.rb29
-rw-r--r--db/post_migrate/20220415124804_remove_job_artifact_deleted_event_table.rb16
-rw-r--r--db/post_migrate/20220420061439_add_notes_null_discussion_id_temp_index.rb16
-rw-r--r--db/post_migrate/20220420061450_backfill_null_note_discussion_ids.rb31
-rw-r--r--db/post_migrate/20220420135946_update_batched_background_migration_arguments.rb19
-rw-r--r--db/post_migrate/20220420214703_schedule_backfill_draft_status_on_merge_requests_corrected_regex.rb33
-rw-r--r--db/post_migrate/20220422121443_add_async_index_for_group_activity_events.rb13
-rw-r--r--db/post_migrate/20220425111114_add_async_index_for_project_activity_events.rb13
-rw-r--r--db/post_migrate/20220425111453_add_async_index_to_events_on_group_id_and_id.rb13
-rw-r--r--db/post_migrate/20220425121410_add_temporary_index_for_backfill_integrations_enable_ssl_verification.rb18
-rw-r--r--db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb57
-rw-r--r--db/post_migrate/20220426185933_backfill_deployments_finished_at.rb20
-rw-r--r--db/post_migrate/20220428133724_schedule_expire_o_auth_tokens.rb11
-rw-r--r--db/post_migrate/20220502015011_clean_up_fix_merge_request_diff_commit_users.rb15
-rw-r--r--db/post_migrate/20220502173045_reset_too_many_tags_skipped_registry_imports.rb27
-rw-r--r--db/post_migrate/20220503114353_prepare_confidential_note_index.rb13
-rw-r--r--db/post_migrate/20220503134610_remove_requirements_management_test_reports_requirement_id.rb28
-rw-r--r--db/post_migrate/20220504083348_add_indexes_for_primary_email_post_regression_cleanup_migration.rb28
-rw-r--r--db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb59
-rw-r--r--db/post_migrate/20220504084136_drop_temporary_indexes_for_primary_email_post_regression_cleanup.rb28
-rw-r--r--db/post_migrate/20220505022001_add_index_to_deployments_on_created_at_cluster_id_and_project_id.rb29
-rw-r--r--db/post_migrate/20220505044348_fix_automatic_iterations_cadences_start_date.rb28
-rw-r--r--db/post_migrate/20220505053504_remove_namespaces_id_parent_id_inverse_partial_index.rb15
-rw-r--r--db/post_migrate/20220505060011_remove_namespaces_id_parent_id_partial_index.rb15
-rw-r--r--db/post_migrate/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints.rb28
-rw-r--r--db/post_migrate/20220505193512_add_not_null_constraint_to_issues_work_item_type.rb13
-rw-r--r--db/post_migrate/20220506201639_remove_devops_adoption_security_scan_succeeded_column.rb11
-rw-r--r--db/post_migrate/20220510003916_remove_tmp_empty_traversal_ids_root_namespace_index.rb16
-rw-r--r--db/post_migrate/20220510004501_remove_tmp_empty_traversal_ids_child_namespace_index.rb16
-rw-r--r--db/post_migrate/20220511152439_remove_not_null_constraint_from_work_item_type.rb16
-rw-r--r--db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb31
-rw-r--r--db/post_migrate/20220517144749_remove_vulnerability_approval_rules.rb29
-rw-r--r--db/schema_migrations/202111031843031
-rw-r--r--db/schema_migrations/202202131000001
-rw-r--r--db/schema_migrations/202202131038591
-rw-r--r--db/schema_migrations/202203141542351
-rw-r--r--db/schema_migrations/202203240912241
-rw-r--r--db/schema_migrations/202203241654361
-rw-r--r--db/schema_migrations/202203280958481
-rw-r--r--db/schema_migrations/202203281004561
-rw-r--r--db/schema_migrations/202203281004571
-rw-r--r--db/schema_migrations/202203311257251
-rw-r--r--db/schema_migrations/202203311307261
-rw-r--r--db/schema_migrations/202203311338021
-rw-r--r--db/schema_migrations/202204010716091
-rw-r--r--db/schema_migrations/202204011511231
-rw-r--r--db/schema_migrations/202204050926191
-rw-r--r--db/schema_migrations/202204061330491
-rw-r--r--db/schema_migrations/202204111735441
-rw-r--r--db/schema_migrations/202204120609311
-rw-r--r--db/schema_migrations/202204121354461
-rw-r--r--db/schema_migrations/202204121404461
-rw-r--r--db/schema_migrations/202204121407551
-rw-r--r--db/schema_migrations/202204121410201
-rw-r--r--db/schema_migrations/202204130549101
-rw-r--r--db/schema_migrations/202204131242001
-rw-r--r--db/schema_migrations/202204131641461
-rw-r--r--db/schema_migrations/202204132358181
-rw-r--r--db/schema_migrations/202204142036221
-rw-r--r--db/schema_migrations/202204150151431
-rw-r--r--db/schema_migrations/202204151248021
-rw-r--r--db/schema_migrations/202204151248041
-rw-r--r--db/schema_migrations/202204192239061
-rw-r--r--db/schema_migrations/202204200345191
-rw-r--r--db/schema_migrations/202204200614391
-rw-r--r--db/schema_migrations/202204200614501
-rw-r--r--db/schema_migrations/202204201352451
-rw-r--r--db/schema_migrations/202204201359461
-rw-r--r--db/schema_migrations/202204201732471
-rw-r--r--db/schema_migrations/202204201925421
-rw-r--r--db/schema_migrations/202204202147031
-rw-r--r--db/schema_migrations/202204211144181
-rw-r--r--db/schema_migrations/202204211413421
-rw-r--r--db/schema_migrations/202204211447581
-rw-r--r--db/schema_migrations/202204211803211
-rw-r--r--db/schema_migrations/202204221214431
-rw-r--r--db/schema_migrations/202204222006331
-rw-r--r--db/schema_migrations/202204222205071
-rw-r--r--db/schema_migrations/202204251111141
-rw-r--r--db/schema_migrations/202204251114531
-rw-r--r--db/schema_migrations/202204251206041
-rw-r--r--db/schema_migrations/202204251214101
-rw-r--r--db/schema_migrations/202204251214351
-rw-r--r--db/schema_migrations/202204261302171
-rw-r--r--db/schema_migrations/202204261859331
-rw-r--r--db/schema_migrations/202204281337241
-rw-r--r--db/schema_migrations/202205020150111
-rw-r--r--db/schema_migrations/202205021250531
-rw-r--r--db/schema_migrations/202205021504081
-rw-r--r--db/schema_migrations/202205021526331
-rw-r--r--db/schema_migrations/202205021730451
-rw-r--r--db/schema_migrations/202205030734011
-rw-r--r--db/schema_migrations/202205031028551
-rw-r--r--db/schema_migrations/202205031143531
-rw-r--r--db/schema_migrations/202205031346101
-rw-r--r--db/schema_migrations/202205040428471
-rw-r--r--db/schema_migrations/202205040833481
-rw-r--r--db/schema_migrations/202205040838361
-rw-r--r--db/schema_migrations/202205040841361
-rw-r--r--db/schema_migrations/202205041400361
-rw-r--r--db/schema_migrations/202205050220011
-rw-r--r--db/schema_migrations/202205050443481
-rw-r--r--db/schema_migrations/202205050535041
-rw-r--r--db/schema_migrations/202205050600111
-rw-r--r--db/schema_migrations/202205050922541
-rw-r--r--db/schema_migrations/202205051746581
-rw-r--r--db/schema_migrations/202205051935121
-rw-r--r--db/schema_migrations/202205061804111
-rw-r--r--db/schema_migrations/202205062016391
-rw-r--r--db/schema_migrations/202205072040241
-rw-r--r--db/schema_migrations/202205100039161
-rw-r--r--db/schema_migrations/202205100045011
-rw-r--r--db/schema_migrations/202205110903241
-rw-r--r--db/schema_migrations/202205111516461
-rw-r--r--db/schema_migrations/202205111524391
-rw-r--r--db/schema_migrations/202205111915021
-rw-r--r--db/schema_migrations/202205111915031
-rw-r--r--db/schema_migrations/202205130433441
-rw-r--r--db/schema_migrations/202205171447491
-rw-r--r--db/structure.sql230
-rw-r--r--doc/.vale/gitlab/Admin.yml2
-rw-r--r--doc/.vale/gitlab/BadPlurals.yml2
-rw-r--r--doc/.vale/gitlab/CIConfigFile.yml17
-rw-r--r--doc/.vale/gitlab/SubstitutionSuggestions.yml4
-rw-r--r--doc/.vale/gitlab/SubstitutionWarning.yml3
-rw-r--r--doc/.vale/gitlab/VersionText.yml2
-rw-r--r--doc/.vale/gitlab/spelling-exceptions.txt29
-rw-r--r--doc/administration/audit_event_streaming.md9
-rw-r--r--doc/administration/audit_events.md43
-rw-r--r--doc/administration/auditor_users.md106
-rw-r--r--doc/administration/auth/ldap/index.md13
-rw-r--r--doc/administration/auth/ldap/ldap_synchronization.md4
-rw-r--r--doc/administration/configure.md6
-rw-r--r--doc/administration/encrypted_configuration.md2
-rw-r--r--doc/administration/environment_variables.md25
-rw-r--r--doc/administration/geo/disaster_recovery/bring_primary_back.md2
-rw-r--r--doc/administration/geo/disaster_recovery/index.md64
-rw-r--r--doc/administration/geo/disaster_recovery/planned_failover.md76
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md32
-rw-r--r--doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md26
-rw-r--r--doc/administration/geo/glossary.md4
-rw-r--r--doc/administration/geo/index.md4
-rw-r--r--doc/administration/geo/replication/configuration.md61
-rw-r--r--doc/administration/geo/replication/multiple_servers.md4
-rw-r--r--doc/administration/geo/replication/troubleshooting.md85
-rw-r--r--doc/administration/geo/replication/version_specific_updates.md4
-rw-r--r--doc/administration/geo/setup/database.md36
-rw-r--r--doc/administration/geo/setup/external_database.md4
-rw-r--r--doc/administration/git_protocol.md2
-rw-r--r--doc/administration/gitaly/configure_gitaly.md118
-rw-r--r--doc/administration/gitaly/faq.md1
-rw-r--r--doc/administration/gitaly/index.md307
-rw-r--r--doc/administration/gitaly/monitoring.md202
-rw-r--r--doc/administration/gitaly/praefect.md138
-rw-r--r--doc/administration/gitaly/recovery.md13
-rw-r--r--doc/administration/gitaly/reference.md3
-rw-r--r--doc/administration/gitaly/troubleshooting.md17
-rw-r--r--doc/administration/inactive_project_deletion.md60
-rw-r--r--doc/administration/incoming_email.md38
-rw-r--r--doc/administration/index.md5
-rw-r--r--doc/administration/instance_limits.md14
-rw-r--r--doc/administration/integration/terminal.md6
-rw-r--r--doc/administration/job_artifacts.md65
-rw-r--r--doc/administration/job_logs.md2
-rw-r--r--doc/administration/lfs/index.md2
-rw-r--r--doc/administration/logs.md4
-rw-r--r--doc/administration/maintenance_mode/index.md8
-rw-r--r--doc/administration/merge_request_diffs.md2
-rw-r--r--doc/administration/monitoring/performance/img/request_profile_result.pngbin11451 -> 0 bytes
-rw-r--r--doc/administration/monitoring/performance/index.md1
-rw-r--r--doc/administration/monitoring/performance/request_profiling.md42
-rw-r--r--doc/administration/monitoring/prometheus/gitlab_metrics.md2
-rw-r--r--doc/administration/nfs.md19
-rw-r--r--doc/administration/object_storage.md96
-rw-r--r--doc/administration/operations/extra_sidekiq_processes.md2
-rw-r--r--doc/administration/operations/extra_sidekiq_routing.md4
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md69
-rw-r--r--doc/administration/operations/puma.md40
-rw-r--r--doc/administration/package_information/licensing.md2
-rw-r--r--doc/administration/package_information/postgresql_versions.md1
-rw-r--r--doc/administration/package_information/signed_packages.md2
-rw-r--r--doc/administration/packages/container_registry.md6
-rw-r--r--doc/administration/packages/dependency_proxy.md23
-rw-r--r--doc/administration/packages/index.md4
-rw-r--r--doc/administration/pages/index.md38
-rw-r--r--doc/administration/postgresql/pgbouncer.md6
-rw-r--r--doc/administration/postgresql/replication_and_failover.md37
-rw-r--r--doc/administration/pseudonymizer.md123
-rw-r--r--doc/administration/raketasks/ldap.md2
-rw-r--r--doc/administration/raketasks/storage.md100
-rw-r--r--doc/administration/reference_architectures/10k_users.md40
-rw-r--r--doc/administration/reference_architectures/1k_users.md2
-rw-r--r--doc/administration/reference_architectures/25k_users.md40
-rw-r--r--doc/administration/reference_architectures/2k_users.md36
-rw-r--r--doc/administration/reference_architectures/3k_users.md40
-rw-r--r--doc/administration/reference_architectures/50k_users.md46
-rw-r--r--doc/administration/reference_architectures/5k_users.md40
-rw-r--r--doc/administration/reference_architectures/index.md16
-rw-r--r--doc/administration/repository_storage_types.md16
-rw-r--r--doc/administration/sidekiq.md95
-rw-r--r--doc/administration/sidekiq_health_check.md6
-rw-r--r--doc/administration/terraform_state.md6
-rw-r--r--doc/administration/troubleshooting/diagnostics_tools.md2
-rw-r--r--doc/administration/troubleshooting/elasticsearch.md2
-rw-r--r--doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md56
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.pngbin69719 -> 39027 bytes
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.pngbin54548 -> 30571 bytes
-rw-r--r--doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.pngbin77766 -> 50479 bytes
-rw-r--r--doc/administration/troubleshooting/index.md1
-rw-r--r--doc/administration/troubleshooting/log_parsing.md14
-rw-r--r--doc/administration/troubleshooting/sidekiq.md2
-rw-r--r--doc/administration/troubleshooting/test_environments.md2
-rw-r--r--doc/administration/uploads.md59
-rw-r--r--doc/api/api_resources.md4
-rw-r--r--doc/api/cluster_agents.md216
-rw-r--r--doc/api/container_registry.md34
-rw-r--r--doc/api/dora4_project_analytics.md2
-rw-r--r--doc/api/environments.md6
-rw-r--r--doc/api/features.md3
-rw-r--r--doc/api/graphql/index.md2
-rw-r--r--doc/api/graphql/reference/index.md476
-rw-r--r--doc/api/graphql/removed_items.md26
-rw-r--r--doc/api/groups.md2
-rw-r--r--doc/api/index.md2
-rw-r--r--doc/api/integrations.md21
-rw-r--r--doc/api/issues.md2
-rw-r--r--doc/api/job_artifacts.md3
-rw-r--r--doc/api/linked_epics.md6
-rw-r--r--doc/api/lint.md2
-rw-r--r--doc/api/managed_licenses.md16
-rw-r--r--doc/api/members.md32
-rw-r--r--doc/api/merge_request_approvals.md24
-rw-r--r--doc/api/merge_requests.md8
-rw-r--r--doc/api/milestones.md8
-rw-r--r--doc/api/oauth2.md15
-rw-r--r--doc/api/packages.md8
-rw-r--r--doc/api/pages_domains.md2
-rw-r--r--doc/api/personal_access_tokens.md32
-rw-r--r--doc/api/plan_limits.md28
-rw-r--r--doc/api/project_clusters.md2
-rw-r--r--doc/api/project_import_export.md8
-rw-r--r--doc/api/projects.md80
-rw-r--r--doc/api/protected_environments.md28
-rw-r--r--doc/api/repository_files.md48
-rw-r--r--doc/api/resource_access_tokens.md11
-rw-r--r--doc/api/resource_groups.md28
-rw-r--r--doc/api/runners.md20
-rw-r--r--doc/api/secure_files.md7
-rw-r--r--doc/api/settings.md31
-rw-r--r--doc/api/status_checks.md23
-rw-r--r--doc/api/topics.md22
-rw-r--r--doc/api/users.md21
-rw-r--r--doc/api/wikis.md2
-rw-r--r--doc/architecture/blueprints/consolidating_groups_and_projects/index.md4
-rw-r--r--doc/architecture/blueprints/container_registry_metadata_database/index.md2
-rw-r--r--doc/architecture/blueprints/database/scalability/patterns/time_decay.md6
-rw-r--r--doc/architecture/blueprints/database_scaling/size-limits.md2
-rw-r--r--doc/architecture/blueprints/database_testing/index.md2
-rw-r--r--doc/ci/caching/index.md33
-rw-r--r--doc/ci/chatops/index.md4
-rw-r--r--doc/ci/cloud_deployment/index.md2
-rw-r--r--doc/ci/cloud_services/aws/index.md1
-rw-r--r--doc/ci/enable_or_disable_ci.md2
-rw-r--r--doc/ci/environments/deployment_approvals.md7
-rw-r--r--doc/ci/environments/deployment_safety.md19
-rw-r--r--doc/ci/environments/incremental_rollouts.md2
-rw-r--r--doc/ci/environments/index.md22
-rw-r--r--doc/ci/examples/semantic-release.md2
-rw-r--r--doc/ci/git_submodules.md2
-rw-r--r--doc/ci/jobs/index.md2
-rw-r--r--doc/ci/jobs/job_control.md42
-rw-r--r--doc/ci/migration/circleci.md6
-rw-r--r--doc/ci/migration/jenkins.md2
-rw-r--r--doc/ci/pipeline_editor/index.md15
-rw-r--r--doc/ci/pipelines/cicd_minutes.md36
-rw-r--r--doc/ci/pipelines/img/downstream_pipeline_actions.pngbin0 -> 13406 bytes
-rw-r--r--doc/ci/pipelines/img/multi_pipeline_mini_graph.gifbin11466 -> 0 bytes
-rw-r--r--doc/ci/pipelines/index.md16
-rw-r--r--doc/ci/pipelines/merge_request_pipelines.md22
-rw-r--r--doc/ci/pipelines/merge_trains.md6
-rw-r--r--doc/ci/pipelines/merged_results_pipelines.md5
-rw-r--r--doc/ci/pipelines/multi_project_pipelines.md9
-rw-r--r--doc/ci/pipelines/parent_child_pipelines.md7
-rw-r--r--doc/ci/pipelines/pipeline_artifacts.md2
-rw-r--r--doc/ci/pipelines/settings.md56
-rw-r--r--doc/ci/quick_start/index.md6
-rw-r--r--doc/ci/resource_groups/index.md20
-rw-r--r--doc/ci/runners/configure_runners.md5
-rw-r--r--doc/ci/runners/saas/macos/codesigning.md121
-rw-r--r--doc/ci/runners/saas/macos/environment.md53
-rw-r--r--doc/ci/runners/saas/macos_saas_runner.md32
-rw-r--r--doc/ci/secure_files/index.md2
-rw-r--r--doc/ci/services/index.md2
-rw-r--r--doc/ci/troubleshooting.md8
-rw-r--r--doc/ci/variables/index.md25
-rw-r--r--doc/ci/variables/predefined_variables.md2
-rw-r--r--doc/ci/yaml/artifacts_reports.md30
-rw-r--r--doc/ci/yaml/includes.md2
-rw-r--r--doc/ci/yaml/index.md36
-rw-r--r--doc/ci/yaml/workflow.md22
-rw-r--r--doc/development/adding_database_indexes.md9
-rw-r--r--doc/development/api_graphql_styleguide.md45
-rw-r--r--doc/development/application_slis/index.md45
-rw-r--r--doc/development/application_slis/rails_request_apdex.md15
-rw-r--r--doc/development/architecture.md2
-rw-r--r--doc/development/audit_event_guide/index.md2
-rw-r--r--doc/development/backend/create_source_code_be/gitaly_touch_points.md27
-rw-r--r--doc/development/backend/create_source_code_be/index.md112
-rw-r--r--doc/development/backend/create_source_code_be/rest_endpoints.md112
-rw-r--r--doc/development/backend/ruby_style_guide.md2
-rw-r--r--doc/development/batched_background_migrations.md322
-rw-r--r--doc/development/changelog.md2
-rw-r--r--doc/development/chatops_on_gitlabcom.md6
-rw-r--r--doc/development/cicd/cicd_reference_documentation_guide.md2
-rw-r--r--doc/development/cicd/templates.md26
-rw-r--r--doc/development/code_intelligence/index.md2
-rw-r--r--doc/development/code_review.md47
-rw-r--r--doc/development/contributing/design.md4
-rw-r--r--doc/development/contributing/index.md5
-rw-r--r--doc/development/contributing/issue_workflow.md2
-rw-r--r--doc/development/contributing/merge_request_workflow.md5
-rw-r--r--doc/development/contributing/verify/index.md4
-rw-r--r--doc/development/dangerbot.md19
-rw-r--r--doc/development/database/avoiding_downtime_in_migrations.md66
-rw-r--r--doc/development/database/background_migrations.md14
-rw-r--r--doc/development/database/batched_background_migrations.md371
-rw-r--r--doc/development/database/loose_foreign_keys.md10
-rw-r--r--doc/development/database/migrations_for_multiple_databases.md35
-rw-r--r--doc/development/database/multiple_databases.md63
-rw-r--r--doc/development/database/pagination_guidelines.md2
-rw-r--r--doc/development/database/strings_and_the_text_data_type.md2
-rw-r--r--doc/development/database/table_partitioning.md2
-rw-r--r--doc/development/deprecation_guidelines/index.md51
-rw-r--r--doc/development/distributed_tracing.md4
-rw-r--r--doc/development/documentation/feature_flags.md13
-rw-r--r--doc/development/documentation/restful_api_styleguide.md62
-rw-r--r--doc/development/documentation/site_architecture/index.md75
-rw-r--r--doc/development/documentation/structure.md4
-rw-r--r--doc/development/documentation/styleguide/index.md349
-rw-r--r--doc/development/documentation/styleguide/word_list.md74
-rw-r--r--doc/development/documentation/testing.md37
-rw-r--r--doc/development/documentation/versions.md232
-rw-r--r--doc/development/documentation/workflow.md2
-rw-r--r--doc/development/ee_features.md24
-rw-r--r--doc/development/emails.md2
-rw-r--r--doc/development/event_store.md8
-rw-r--r--doc/development/experiment_guide/experiment_code_reviews.md25
-rw-r--r--doc/development/experiment_guide/experiment_rollout.md77
-rw-r--r--doc/development/experiment_guide/experimentation.md11
-rw-r--r--doc/development/experiment_guide/gitlab_experiment.md589
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md369
-rw-r--r--doc/development/experiment_guide/index.md83
-rw-r--r--doc/development/experiment_guide/testing_experiments.md150
-rw-r--r--doc/development/fe_guide/content_editor.md2
-rw-r--r--doc/development/fe_guide/design_anti_patterns.md2
-rw-r--r--doc/development/fe_guide/development_process.md2
-rw-r--r--doc/development/fe_guide/graphql.md4
-rw-r--r--doc/development/fe_guide/registry_architecture.md2
-rw-r--r--doc/development/fe_guide/style/html.md6
-rw-r--r--doc/development/fe_guide/tooling.md7
-rw-r--r--doc/development/fe_guide/vue3_migration.md2
-rw-r--r--doc/development/feature_flags/controls.md2
-rw-r--r--doc/development/feature_flags/index.md84
-rw-r--r--doc/development/features_inside_dot_gitlab.md1
-rw-r--r--doc/development/fips_compliance.md411
-rw-r--r--doc/development/foreign_keys.md4
-rw-r--r--doc/development/geo.md17
-rw-r--r--doc/development/geo/framework.md6
-rw-r--r--doc/development/gitaly.md20
-rw-r--r--doc/development/gitlab_flavored_markdown/index.md7
-rw-r--r--doc/development/gitlab_flavored_markdown/specification_guide/index.md301
-rw-r--r--doc/development/go_guide/dependencies.md2
-rw-r--r--doc/development/go_guide/go_upgrade.md2
-rw-r--r--doc/development/index.md4
-rw-r--r--doc/development/integrations/index.md4
-rw-r--r--doc/development/integrations/secure.md5
-rw-r--r--doc/development/internal_api/index.md22
-rw-r--r--doc/development/kubernetes.md2
-rw-r--r--doc/development/maintenance_mode.md4
-rw-r--r--doc/development/merge_request_application_and_rate_limit_guidelines.md2
-rw-r--r--doc/development/merge_request_performance_guidelines.md8
-rw-r--r--doc/development/migration_style_guide.md27
-rw-r--r--doc/development/new_fe_guide/development/performance.md14
-rw-r--r--doc/development/new_fe_guide/modules/widget_extensions.md9
-rw-r--r--doc/development/packages.md4
-rw-r--r--doc/development/performance.md3
-rw-r--r--doc/development/permissions.md4
-rw-r--r--doc/development/pipelines.md29
-rw-r--r--doc/development/product_qualified_lead_guide/index.md4
-rw-r--r--doc/development/python_guide/index.md12
-rw-r--r--doc/development/rails_initializers.md18
-rw-r--r--doc/development/rails_update.md2
-rw-r--r--doc/development/rake_tasks.md4
-rw-r--r--doc/development/redis.md11
-rw-r--r--doc/development/redis/new_redis_instance.md4
-rw-r--r--doc/development/routing.md10
-rw-r--r--doc/development/ruby_upgrade.md4
-rw-r--r--doc/development/secure_coding_guidelines.md83
-rw-r--r--doc/development/service_ping/implement.md12
-rw-r--r--doc/development/service_ping/index.md318
-rw-r--r--doc/development/service_ping/metrics_dictionary.md5
-rw-r--r--doc/development/service_ping/metrics_instrumentation.md68
-rw-r--r--doc/development/service_ping/metrics_lifecycle.md1
-rw-r--r--doc/development/service_ping/troubleshooting.md85
-rw-r--r--doc/development/sidekiq/idempotent_jobs.md2
-rw-r--r--doc/development/sidekiq_style_guide.md11
-rw-r--r--doc/development/snowplow/implementation.md12
-rw-r--r--doc/development/snowplow/troubleshooting.md26
-rw-r--r--doc/development/testing_guide/end_to_end/beginners_guide.md2
-rw-r--r--doc/development/testing_guide/end_to_end/feature_flags.md22
-rw-r--r--doc/development/testing_guide/end_to_end/index.md6
-rw-r--r--doc/development/testing_guide/end_to_end/rspec_metadata_tests.md4
-rw-r--r--doc/development/testing_guide/frontend_testing.md35
-rw-r--r--doc/development/testing_guide/img/k9s.pngbin117900 -> 0 bytes
-rw-r--r--doc/development/testing_guide/review_apps.md3
-rw-r--r--doc/development/testing_guide/testing_migrations_guide.md12
-rw-r--r--doc/development/uploads/background.md157
-rw-r--r--doc/development/uploads/implementation.md193
-rw-r--r--doc/development/uploads/index.md160
-rw-r--r--doc/development/uploads/working_with_uploads.md82
-rw-r--r--doc/development/workhorse/configuration.md19
-rw-r--r--doc/development/workhorse/index.md2
-rw-r--r--doc/install/aws/gitlab_hybrid_on_aws.md37
-rw-r--r--doc/install/aws/index.md2
-rw-r--r--doc/install/docker.md8
-rw-r--r--doc/install/index.md6
-rw-r--r--doc/install/installation.md21
-rw-r--r--doc/install/requirements.md4
-rw-r--r--doc/integration/akismet.md2
-rw-r--r--doc/integration/alicloud.md6
-rw-r--r--doc/integration/auth0.md4
-rw-r--r--doc/integration/azure.md4
-rw-r--r--doc/integration/bitbucket.md6
-rw-r--r--doc/integration/cas.md4
-rw-r--r--doc/integration/ding_talk.md4
-rw-r--r--doc/integration/elasticsearch.md13
-rw-r--r--doc/integration/facebook.md4
-rw-r--r--doc/integration/github.md4
-rw-r--r--doc/integration/gitlab.md4
-rw-r--r--doc/integration/gitpod.md12
-rw-r--r--doc/integration/google.md4
-rw-r--r--doc/integration/img/gitpod-button_v14_2.pngbin8742 -> 0 bytes
-rw-r--r--doc/integration/img/limit_namespaces_projects_options.pngbin7850 -> 24863 bytes
-rw-r--r--doc/integration/index.md2
-rw-r--r--doc/integration/jenkins.md4
-rw-r--r--doc/integration/jira/issues.md4
-rw-r--r--doc/integration/kerberos.md8
-rw-r--r--doc/integration/mattermost/index.md1
-rw-r--r--doc/integration/oauth2_generic.md4
-rw-r--r--doc/integration/oauth_provider.md8
-rw-r--r--doc/integration/omniauth.md4
-rw-r--r--doc/integration/openid_connect_provider.md4
-rw-r--r--doc/integration/salesforce.md4
-rw-r--r--doc/integration/saml.md4
-rw-r--r--doc/integration/sourcegraph.md2
-rw-r--r--doc/integration/twitter.md4
-rw-r--r--doc/operations/error_tracking.md4
-rw-r--r--doc/operations/feature_flags.md4
-rw-r--r--doc/operations/incident_management/alerts.md2
-rw-r--r--doc/operations/incident_management/paging.md2
-rw-r--r--doc/operations/index.md19
-rw-r--r--doc/operations/metrics/embed.md6
-rw-r--r--doc/operations/metrics/index.md8
-rw-r--r--doc/operations/tracing.md11
-rw-r--r--doc/policy/alpha-beta-support.md10
-rw-r--r--doc/policy/maintenance.md3
-rw-r--r--doc/raketasks/backup_restore.md89
-rw-r--r--doc/security/asset_proxy.md6
-rw-r--r--doc/security/rate_limits.md20
-rw-r--r--doc/security/ssh_keys_restrictions.md2
-rw-r--r--doc/security/unlock_user.md2
-rw-r--r--doc/security/webhooks.md2
-rw-r--r--doc/subscriptions/bronze_starter.md2
-rw-r--r--doc/subscriptions/gitlab_dedicated/index.md79
-rw-r--r--doc/subscriptions/img/support_diagram_c.pngbin161323 -> 55374 bytes
-rw-r--r--doc/subscriptions/index.md1
-rw-r--r--doc/subscriptions/quarterly_reconciliation.md2
-rw-r--r--doc/subscriptions/self_managed/index.md2
-rw-r--r--doc/topics/autodevops/customize.md6
-rw-r--r--doc/topics/autodevops/prepare_deployment.md2
-rw-r--r--doc/topics/autodevops/quick_start_guide.md3
-rw-r--r--doc/topics/autodevops/requirements.md2
-rw-r--r--doc/topics/autodevops/stages.md127
-rw-r--r--doc/topics/git/feature_branching.md2
-rw-r--r--doc/topics/git/git_rebase.md27
-rw-r--r--doc/topics/git/lfs/index.md12
-rw-r--r--doc/topics/git/merge_conflicts.md18
-rw-r--r--doc/topics/git/partial_clone.md9
-rw-r--r--doc/topics/git/stash.md8
-rw-r--r--doc/topics/git/tags.md2
-rw-r--r--doc/topics/git/terminology.md6
-rw-r--r--doc/topics/git/troubleshooting_git.md2
-rw-r--r--doc/topics/git/useful_git_commands.md4
-rw-r--r--doc/topics/release_your_application.md4
-rw-r--r--doc/tutorials/img/branches_dropdown_v14_10.pngbin56137 -> 20781 bytes
-rw-r--r--doc/tutorials/index.md4
-rw-r--r--doc/tutorials/make_your_first_git_commit.md2
-rw-r--r--doc/update/deprecations.md717
-rw-r--r--doc/update/index.md99
-rw-r--r--doc/update/package/convert_to_ee.md2
-rw-r--r--doc/update/package/index.md14
-rw-r--r--doc/update/plan_your_upgrade.md2
-rw-r--r--doc/update/removals.md692
-rw-r--r--doc/update/upgrading_from_source.md45
-rw-r--r--doc/update/zero_downtime.md6
-rw-r--r--doc/user/admin_area/broadcast_messages.md9
-rw-r--r--doc/user/admin_area/credentials_inventory.md13
-rw-r--r--doc/user/admin_area/geo_nodes.md2
-rw-r--r--doc/user/admin_area/img/broadcast_messages_banner_v12_10.pngbin9740 -> 0 bytes
-rw-r--r--doc/user/admin_area/img/broadcast_messages_banner_v15_0.pngbin0 -> 13690 bytes
-rw-r--r--doc/user/admin_area/index.md10
-rw-r--r--doc/user/admin_area/license_file.md3
-rw-r--r--doc/user/admin_area/moderate_users.md2
-rw-r--r--doc/user/admin_area/monitoring/background_migrations.md2
-rw-r--r--doc/user/admin_area/reporting/spamcheck.md2
-rw-r--r--doc/user/admin_area/settings/account_and_limit_settings.md111
-rw-r--r--doc/user/admin_area/settings/continuous_integration.md12
-rw-r--r--doc/user/admin_area/settings/files_api_rate_limits.md2
-rw-r--r--doc/user/admin_area/settings/index.md6
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_issues_creation.md2
-rw-r--r--doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md33
-rw-r--r--doc/user/admin_area/settings/sign_in_restrictions.md2
-rw-r--r--doc/user/admin_area/settings/sign_up_restrictions.md2
-rw-r--r--doc/user/admin_area/settings/usage_statistics.md131
-rw-r--r--doc/user/admin_area/settings/user_and_ip_rate_limits.md2
-rw-r--r--doc/user/analytics/index.md11
-rw-r--r--doc/user/analytics/merge_request_analytics.md8
-rw-r--r--doc/user/analytics/value_stream_analytics.md6
-rw-r--r--doc/user/application_security/api_fuzzing/index.md44
-rw-r--r--doc/user/application_security/cluster_image_scanning/index.md19
-rw-r--r--doc/user/application_security/container_scanning/index.md117
-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/359.1.md34
-rw-r--r--doc/user/application_security/dast/checks/359.2.md34
-rw-r--r--doc/user/application_security/dast/checks/index.md2
-rw-r--r--doc/user/application_security/dast/index.md94
-rw-r--r--doc/user/application_security/dast_api/index.md42
-rw-r--r--doc/user/application_security/dependency_scanning/analyzers.md56
-rw-r--r--doc/user/application_security/dependency_scanning/index.md252
-rw-r--r--doc/user/application_security/index.md72
-rw-r--r--doc/user/application_security/policies/img/policies_list_v14_3.pngbin34232 -> 0 bytes
-rw-r--r--doc/user/application_security/policies/img/policies_list_v15_0.pngbin0 -> 29041 bytes
-rw-r--r--doc/user/application_security/policies/index.md128
-rw-r--r--doc/user/application_security/policies/scan-execution-policies.md33
-rw-r--r--doc/user/application_security/policies/scan-result-policies.md16
-rw-r--r--doc/user/application_security/sast/analyzers.md233
-rw-r--r--doc/user/application_security/sast/index.md47
-rw-r--r--doc/user/application_security/secret_detection/index.md11
-rw-r--r--doc/user/application_security/secret_detection/post_processing.md2
-rw-r--r--doc/user/application_security/security_dashboard/index.md1
-rw-r--r--doc/user/application_security/threat_monitoring/img/threat_monitoring_policy_alert_list_v14_3.pngbin17296 -> 0 bytes
-rw-r--r--doc/user/application_security/threat_monitoring/index.md52
-rw-r--r--doc/user/application_security/vulnerabilities/index.md2
-rw-r--r--doc/user/application_security/vulnerabilities/severities.md2
-rw-r--r--doc/user/application_security/vulnerability_report/index.md98
-rw-r--r--doc/user/clusters/agent/ci_cd_tunnel.md264
-rw-r--r--doc/user/clusters/agent/ci_cd_workflow.md263
-rw-r--r--doc/user/clusters/agent/gitops.md2
-rw-r--r--doc/user/clusters/agent/index.md5
-rw-r--r--doc/user/clusters/agent/install/index.md53
-rw-r--r--doc/user/clusters/agent/repository.md213
-rw-r--r--doc/user/clusters/agent/troubleshooting.md8
-rw-r--r--doc/user/clusters/agent/vulnerabilities.md78
-rw-r--r--doc/user/clusters/agent/work_with_agent.md163
-rw-r--r--doc/user/clusters/applications.md1134
-rw-r--r--doc/user/clusters/cost_management.md4
-rw-r--r--doc/user/clusters/crossplane.md289
-rw-r--r--doc/user/clusters/environments.md4
-rw-r--r--doc/user/clusters/img/applications_tab_v13_12.pngbin79656 -> 0 bytes
-rw-r--r--doc/user/clusters/integrations.md24
-rw-r--r--doc/user/clusters/management_project.md4
-rw-r--r--doc/user/clusters/management_project_template.md9
-rw-r--r--doc/user/clusters/migrating_from_gma_to_project_template.md9
-rw-r--r--doc/user/compliance/license_compliance/index.md8
-rw-r--r--doc/user/crm/index.md18
-rw-r--r--doc/user/discussions/img/add_internal_note_v15_0.pngbin0 -> 18963 bytes
-rw-r--r--doc/user/discussions/img/confidential_comments_v13_9.pngbin8311 -> 0 bytes
-rw-r--r--doc/user/discussions/img/create-new-issue_v14_3.pngbin4358 -> 0 bytes
-rw-r--r--doc/user/discussions/img/create-new-issue_v15.pngbin0 -> 5672 bytes
-rw-r--r--doc/user/discussions/img/unresolved_threads_v14_1.pngbin1540 -> 0 bytes
-rw-r--r--doc/user/discussions/img/unresolved_threads_v15.pngbin0 -> 2793 bytes
-rw-r--r--doc/user/discussions/index.md48
-rw-r--r--doc/user/free_user_limit.md60
-rw-r--r--doc/user/gitlab_com/index.md12
-rw-r--r--doc/user/group/epics/linked_epics.md14
-rw-r--r--doc/user/group/import/index.md2
-rw-r--r--doc/user/group/index.md34
-rw-r--r--doc/user/group/iterations/index.md124
-rw-r--r--doc/user/group/roadmap/index.md64
-rw-r--r--doc/user/group/saml_sso/group_managed_accounts.md4
-rw-r--r--doc/user/group/saml_sso/index.md4
-rw-r--r--doc/user/group/saml_sso/scim_setup.md2
-rw-r--r--doc/user/group/settings/group_access_tokens.md4
-rw-r--r--doc/user/group/settings/import_export.md2
-rw-r--r--doc/user/group/value_stream_analytics/img/new_value_stream_v13_12.pngbin19993 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.pngbin145830 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.pngbin14209 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.pngbin14519 -> 0 bytes
-rw-r--r--doc/user/group/value_stream_analytics/index.md130
-rw-r--r--doc/user/infrastructure/clusters/connect/new_gke_cluster.md2
-rw-r--r--doc/user/infrastructure/clusters/index.md10
-rw-r--r--doc/user/infrastructure/clusters/manage/clusters_health.md7
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md30
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md2
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md122
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md27
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/falco.md95
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md30
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md2
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md2
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/runner.md4
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md2
-rw-r--r--doc/user/infrastructure/clusters/manage/management_project_applications/vault.md2
-rw-r--r--doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md62
-rw-r--r--doc/user/infrastructure/iac/img/terraform_list_view_v13_8.pngbin74877 -> 0 bytes
-rw-r--r--doc/user/infrastructure/iac/index.md12
-rw-r--r--doc/user/infrastructure/iac/terraform_state.md351
-rw-r--r--doc/user/infrastructure/iac/troubleshooting.md40
-rw-r--r--doc/user/markdown.md5
-rw-r--r--doc/user/packages/container_registry/index.md10
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_data_transfer.md13
-rw-r--r--doc/user/packages/container_registry/reduce_container_registry_storage.md9
-rw-r--r--doc/user/packages/dependency_proxy/index.md24
-rw-r--r--doc/user/packages/dependency_proxy/reduce_dependency_proxy_storage.md2
-rw-r--r--doc/user/packages/generic_packages/index.md3
-rw-r--r--doc/user/packages/go_proxy/index.md5
-rw-r--r--doc/user/packages/maven_repository/index.md5
-rw-r--r--doc/user/packages/pypi_repository/index.md3
-rw-r--r--doc/user/permissions.md17
-rw-r--r--doc/user/profile/index.md28
-rw-r--r--doc/user/profile/notifications.md6
-rw-r--r--doc/user/profile/personal_access_tokens.md6
-rw-r--r--doc/user/profile/preferences.md4
-rw-r--r--doc/user/project/canary_deployments.md79
-rw-r--r--doc/user/project/clusters/add_eks_clusters.md2
-rw-r--r--doc/user/project/clusters/add_existing_cluster.md21
-rw-r--r--doc/user/project/clusters/add_remove_clusters.md76
-rw-r--r--doc/user/project/clusters/cluster_access.md2
-rw-r--r--doc/user/project/clusters/deploy_to_cluster.md2
-rw-r--r--doc/user/project/clusters/gitlab_managed_clusters.md6
-rw-r--r--doc/user/project/clusters/kubernetes_pod_logs.md11
-rw-r--r--doc/user/project/clusters/protect/container_host_security/index.md66
-rw-r--r--doc/user/project/clusters/protect/container_host_security/quick_start_guide.md72
-rw-r--r--doc/user/project/clusters/protect/container_network_security/index.md76
-rw-r--r--doc/user/project/clusters/protect/container_network_security/quick_start_guide.md230
-rw-r--r--doc/user/project/clusters/protect/index.md35
-rw-r--r--doc/user/project/clusters/runbooks/index.md4
-rw-r--r--doc/user/project/clusters/serverless/aws.md504
-rw-r--r--doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.pngbin21864 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/function-endpoint.pngbin14641 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/function-execution.pngbin73788 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/function-list_v12_7.pngbin18551 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/sam-api-endpoint.pngbin29991 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/sam-complete-raw.pngbin38847 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/img/serverless-page_v14_0.pngbin18188 -> 0 bytes
-rw-r--r--doc/user/project/clusters/serverless/index.md816
-rw-r--r--doc/user/project/deploy_boards.md4
-rw-r--r--doc/user/project/import/cvs.md4
-rw-r--r--doc/user/project/import/github.md174
-rw-r--r--doc/user/project/import/img/gitlab_import_history_page_v14_10.pngbin103923 -> 28219 bytes
-rw-r--r--doc/user/project/integrations/bamboo.md4
-rw-r--r--doc/user/project/integrations/bugzilla.md2
-rw-r--r--doc/user/project/integrations/gitlab_slack_application.md22
-rw-r--r--doc/user/project/integrations/index.md120
-rw-r--r--doc/user/project/integrations/overview.md120
-rw-r--r--doc/user/project/integrations/webhooks.md4
-rw-r--r--doc/user/project/issues/confidential_issues.md4
-rw-r--r--doc/user/project/issues/csv_import.md45
-rw-r--r--doc/user/project/issues/img/confidential_issues_issue_page.pngbin25354 -> 24484 bytes
-rw-r--r--doc/user/project/issues/img/design_management_v14_10.pngbin139386 -> 54706 bytes
-rw-r--r--doc/user/project/issues/img/sidebar_confidential_issue.pngbin4648 -> 5404 bytes
-rw-r--r--doc/user/project/issues/img/turn_off_confidentiality.pngbin10851 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/turn_off_confidentiality_v15_0.pngbin0 -> 10137 bytes
-rw-r--r--doc/user/project/issues/img/turn_on_confidentiality.pngbin13513 -> 0 bytes
-rw-r--r--doc/user/project/issues/img/turn_on_confidentiality_v15_0.pngbin0 -> 7550 bytes
-rw-r--r--doc/user/project/issues/managing_issues.md10
-rw-r--r--doc/user/project/members/index.md4
-rw-r--r--doc/user/project/merge_requests/allow_collaboration.md6
-rw-r--r--doc/user/project/merge_requests/approvals/img/security_approvals_v15_0.pngbin0 -> 13285 bytes
-rw-r--r--doc/user/project/merge_requests/approvals/index.md4
-rw-r--r--doc/user/project/merge_requests/approvals/rules.md11
-rw-r--r--doc/user/project/merge_requests/approvals/settings.md9
-rw-r--r--doc/user/project/merge_requests/changes.md2
-rw-r--r--doc/user/project/merge_requests/code_quality.md22
-rw-r--r--doc/user/project/merge_requests/confidential.md2
-rw-r--r--doc/user/project/merge_requests/fast_forward_merge.md77
-rw-r--r--doc/user/project/merge_requests/getting_started.md38
-rw-r--r--doc/user/project/merge_requests/img/merge_method_ff_v15_0.pngbin0 -> 4744 bytes
-rw-r--r--doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.pngbin0 -> 14531 bytes
-rw-r--r--doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.pngbin0 -> 14867 bytes
-rw-r--r--doc/user/project/merge_requests/img/mr-diff-example_v14_8.pngbin17683 -> 0 bytes
-rw-r--r--doc/user/project/merge_requests/img/mr-diff-example_v15.pngbin0 -> 28658 bytes
-rw-r--r--doc/user/project/merge_requests/index.md95
-rw-r--r--doc/user/project/merge_requests/load_performance_testing.md4
-rw-r--r--doc/user/project/merge_requests/merge_when_pipeline_succeeds.md6
-rw-r--r--doc/user/project/merge_requests/methods/index.md116
-rw-r--r--doc/user/project/merge_requests/revert_changes.md2
-rw-r--r--doc/user/project/merge_requests/reviews/index.md21
-rw-r--r--doc/user/project/merge_requests/squash_and_merge.md6
-rw-r--r--doc/user/project/merge_requests/test_coverage_visualization.md33
-rw-r--r--doc/user/project/milestones/index.md14
-rw-r--r--doc/user/project/pages/getting_started/pages_from_scratch.md28
-rw-r--r--doc/user/project/pages/introduction.md2
-rw-r--r--doc/user/project/protected_branches.md51
-rw-r--r--doc/user/project/push_options.md1
-rw-r--r--doc/user/project/releases/index.md10
-rw-r--r--doc/user/project/repository/gpg_signed_commits/index.md2
-rw-r--r--doc/user/project/repository/index.md5
-rw-r--r--doc/user/project/repository/jupyter_notebooks/index.md10
-rw-r--r--doc/user/project/repository/managing_large_repositories.md51
-rw-r--r--doc/user/project/repository/mirror/index.md63
-rw-r--r--doc/user/project/repository/mirror/pull.md18
-rw-r--r--doc/user/project/repository/mirror/push.md4
-rw-r--r--doc/user/project/repository/push_rules.md299
-rw-r--r--doc/user/project/repository/web_editor.md2
-rw-r--r--doc/user/project/settings/import_export.md3
-rw-r--r--doc/user/project/settings/index.md36
-rw-r--r--doc/user/project/settings/project_access_tokens.md4
-rw-r--r--doc/user/project/static_site_editor/img/edit_this_page_button_v12_10.pngbin28949 -> 0 bytes
-rw-r--r--doc/user/project/static_site_editor/img/front_matter_ui_v13_4.pngbin36431 -> 0 bytes
-rw-r--r--doc/user/project/static_site_editor/img/wysiwyg_editor_v13_3.pngbin57177 -> 0 bytes
-rw-r--r--doc/user/project/static_site_editor/index.md264
-rw-r--r--doc/user/project/time_tracking.md12
-rw-r--r--doc/user/project/web_ide/img/command_palette_v13_6.pngbin26660 -> 0 bytes
-rw-r--r--doc/user/project/web_ide/index.md12
-rw-r--r--doc/user/project/wiki/group.md21
-rw-r--r--doc/user/project/wiki/index.md2
-rw-r--r--doc/user/project/working_with_projects.md12
-rw-r--r--doc/user/report_abuse.md6
-rw-r--r--doc/user/reserved_names.md1
-rw-r--r--doc/user/search/global_search/advanced_search_syntax.md58
-rw-r--r--doc/user/search/img/issue_search_by_id.pngbin20577 -> 0 bytes
-rw-r--r--doc/user/search/img/issue_search_by_id_v15_0.pngbin0 -> 15461 bytes
-rw-r--r--doc/user/search/index.md2
-rw-r--r--doc/user/shortcuts.md195
-rw-r--r--doc/user/ssh.md99
-rw-r--r--doc/user/todos.md23
-rw-r--r--doc/user/usage_quotas.md13
-rw-r--r--glfm_specification/README.md5
-rw-r--r--glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt10227
-rw-r--r--glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt23
-rw-r--r--glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml17
-rw-r--r--glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt3
-rw-r--r--glfm_specification/output/spec.html1
-rw-r--r--glfm_specification/output/spec.txt9965
-rw-r--r--haml_lint/inline_javascript.rb25
-rw-r--r--haml_lint/linter/inline_javascript.rb23
-rw-r--r--lefthook.yml6
-rw-r--r--lib/api/admin/instance_clusters.rb3
-rw-r--r--lib/api/admin/plan_limits.rb9
-rw-r--r--lib/api/alert_management_alerts.rb5
-rw-r--r--lib/api/api.rb74
-rw-r--r--lib/api/avatar.rb1
-rw-r--r--lib/api/badges.rb9
-rw-r--r--lib/api/boards.rb1
-rw-r--r--lib/api/branches.rb2
-rw-r--r--lib/api/bulk_imports.rb1
-rw-r--r--lib/api/ci/helpers/runner.rb41
-rw-r--r--lib/api/ci/jobs.rb2
-rw-r--r--lib/api/ci/pipeline_schedules.rb1
-rw-r--r--lib/api/ci/pipelines.rb14
-rw-r--r--lib/api/ci/resource_groups.rb15
-rw-r--r--lib/api/ci/runner.rb19
-rw-r--r--lib/api/ci/runners.rb1
-rw-r--r--lib/api/ci/secure_files.rb8
-rw-r--r--lib/api/ci/triggers.rb1
-rw-r--r--lib/api/ci/variables.rb2
-rw-r--r--lib/api/clusters/agent_tokens.rb98
-rw-r--r--lib/api/clusters/agents.rb1
-rw-r--r--lib/api/commit_statuses.rb1
-rw-r--r--lib/api/composer_packages.rb12
-rw-r--r--lib/api/concerns/packages/conan_endpoints.rb38
-rw-r--r--lib/api/concerns/packages/debian_distribution_endpoints.rb1
-rw-r--r--lib/api/concerns/packages/debian_package_endpoints.rb1
-rw-r--r--lib/api/concerns/packages/nuget_endpoints.rb8
-rw-r--r--lib/api/container_registry_event.rb3
-rw-r--r--lib/api/container_repositories.rb1
-rw-r--r--lib/api/dependency_proxy.rb1
-rw-r--r--lib/api/deploy_keys.rb1
-rw-r--r--lib/api/deploy_tokens.rb1
-rw-r--r--lib/api/deployments.rb1
-rw-r--r--lib/api/entities/ci/job_request/dependency.rb7
-rw-r--r--lib/api/entities/ci/job_request/response.rb4
-rw-r--r--lib/api/entities/ci/lint/result.rb1
-rw-r--r--lib/api/entities/ci/secure_file.rb1
-rw-r--r--lib/api/entities/clusters/agent_token.rb11
-rw-r--r--lib/api/entities/clusters/agent_token_basic.rb17
-rw-r--r--lib/api/entities/clusters/agent_token_with_token.rb11
-rw-r--r--lib/api/entities/environment.rb1
-rw-r--r--lib/api/entities/plan_limit.rb9
-rw-r--r--lib/api/entities/project.rb6
-rw-r--r--lib/api/entities/projects/topic.rb1
-rw-r--r--lib/api/entities/user.rb3
-rw-r--r--lib/api/environments.rb7
-rw-r--r--lib/api/error_tracking/client_keys.rb2
-rw-r--r--lib/api/error_tracking/collector.rb2
-rw-r--r--lib/api/events.rb1
-rw-r--r--lib/api/feature_flags.rb1
-rw-r--r--lib/api/feature_flags_user_lists.rb1
-rw-r--r--lib/api/features.rb3
-rw-r--r--lib/api/files.rb18
-rw-r--r--lib/api/freeze_periods.rb1
-rw-r--r--lib/api/generic_packages.rb1
-rw-r--r--lib/api/geo.rb1
-rwxr-xr-xlib/api/go_proxy.rb1
-rw-r--r--lib/api/group_boards.rb1
-rw-r--r--lib/api/group_clusters.rb3
-rw-r--r--lib/api/group_container_repositories.rb7
-rw-r--r--lib/api/group_export.rb1
-rw-r--r--lib/api/group_import.rb1
-rw-r--r--lib/api/group_labels.rb1
-rw-r--r--lib/api/group_milestones.rb1
-rw-r--r--lib/api/group_packages.rb1
-rw-r--r--lib/api/group_variables.rb2
-rw-r--r--lib/api/groups.rb15
-rw-r--r--lib/api/helm_packages.rb1
-rw-r--r--lib/api/helpers.rb33
-rw-r--r--lib/api/helpers/internal_helpers.rb3
-rw-r--r--lib/api/helpers/members_helpers.rb2
-rw-r--r--lib/api/helpers/projects_helpers.rb10
-rw-r--r--lib/api/import_bitbucket_server.rb5
-rw-r--r--lib/api/import_github.rb7
-rw-r--r--lib/api/integrations/jira_connect/subscriptions.rb51
-rw-r--r--lib/api/internal/base.rb26
-rw-r--r--lib/api/internal/container_registry/migration.rb31
-rw-r--r--lib/api/internal/kubernetes.rb7
-rw-r--r--lib/api/invitations.rb4
-rw-r--r--lib/api/issue_links.rb1
-rw-r--r--lib/api/issues.rb1
-rw-r--r--lib/api/labels.rb1
-rw-r--r--lib/api/maven_packages.rb1
-rw-r--r--lib/api/members.rb27
-rw-r--r--lib/api/merge_requests.rb4
-rw-r--r--lib/api/namespaces.rb6
-rw-r--r--lib/api/notes.rb2
-rw-r--r--lib/api/notification_settings.rb1
-rw-r--r--lib/api/npm_instance_packages.rb1
-rw-r--r--lib/api/npm_project_packages.rb1
-rw-r--r--lib/api/nuget_project_packages.rb12
-rw-r--r--lib/api/package_files.rb1
-rw-r--r--lib/api/personal_access_tokens.rb17
-rw-r--r--lib/api/project_clusters.rb5
-rw-r--r--lib/api/project_container_repositories.rb3
-rw-r--r--lib/api/project_export.rb13
-rw-r--r--lib/api/project_import.rb3
-rw-r--r--lib/api/project_milestones.rb1
-rw-r--r--lib/api/project_packages.rb1
-rw-r--r--lib/api/projects.rb51
-rw-r--r--lib/api/pypi_packages.rb1
-rw-r--r--lib/api/release/links.rb1
-rw-r--r--lib/api/releases.rb3
-rw-r--r--lib/api/rubygem_packages.rb1
-rw-r--r--lib/api/search.rb1
-rw-r--r--lib/api/settings.rb2
-rw-r--r--lib/api/sidekiq_metrics.rb3
-rw-r--r--lib/api/terraform/modules/v1/packages.rb1
-rw-r--r--lib/api/terraform/state.rb1
-rw-r--r--lib/api/terraform/state_version.rb1
-rw-r--r--lib/api/todos.rb1
-rw-r--r--lib/api/topics.rb6
-rw-r--r--lib/api/unleash.rb2
-rw-r--r--lib/api/usage_data.rb4
-rw-r--r--lib/api/usage_data_non_sql_metrics.rb3
-rw-r--r--lib/api/usage_data_queries.rb3
-rw-r--r--lib/api/user_counts.rb2
-rw-r--r--lib/api/users.rb10
-rw-r--r--lib/atlassian/jira_connect/asymmetric_jwt.rb68
-rw-r--r--lib/atlassian/jira_connect/jwt/asymmetric.rb80
-rw-r--r--lib/atlassian/jira_connect/jwt/symmetric.rb55
-rw-r--r--lib/backup/gitaly_backup.rb2
-rw-r--r--lib/backup/manager.rb105
-rw-r--r--lib/backup/repositories.rb19
-rw-r--r--lib/banzai/filter/image_lazy_load_filter.rb4
-rw-r--r--lib/banzai/filter/references/abstract_reference_filter.rb5
-rw-r--r--lib/banzai/filter/references/issue_reference_filter.rb4
-rw-r--r--lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb33
-rw-r--r--lib/bitbucket/representation/repo.rb4
-rw-r--r--lib/bitbucket_server/representation/repo.rb4
-rw-r--r--lib/bulk_imports/common/extractors/json_extractor.rb52
-rw-r--r--lib/bulk_imports/common/pipelines/entity_finisher.rb2
-rw-r--r--lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb35
-rw-r--r--lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb43
-rw-r--r--lib/bulk_imports/groups/stage.rb12
-rw-r--r--lib/bulk_imports/groups/transformers/group_attributes_transformer.rb6
-rw-r--r--lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb2
-rw-r--r--lib/bulk_imports/ndjson_pipeline.rb2
-rw-r--r--lib/bulk_imports/pipeline.rb8
-rw-r--r--lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb8
-rw-r--r--lib/bulk_imports/projects/pipelines/releases_pipeline.rb15
-rw-r--r--lib/bulk_imports/projects/stage.rb12
-rw-r--r--lib/constraints/feature_constrainer.rb15
-rw-r--r--lib/container_registry/base_client.rb30
-rw-r--r--lib/container_registry/client.rb6
-rw-r--r--lib/container_registry/migration.rb14
-rw-r--r--lib/event_filter.rb58
-rw-r--r--lib/feature.rb99
-rw-r--r--lib/feature/definition.rb16
-rw-r--r--lib/feature/gitaly.rb2
-rw-r--r--lib/feature/shared.rb12
-rw-r--r--lib/gitlab/alert_management/payload.rb5
-rw-r--r--lib/gitlab/analytics/cycle_analytics/request_params.rb2
-rw-r--r--lib/gitlab/application_context.rb11
-rw-r--r--lib/gitlab/application_rate_limiter.rb2
-rw-r--r--lib/gitlab/audit/deploy_token_author.rb17
-rw-r--r--lib/gitlab/audit/null_author.rb6
-rw-r--r--lib/gitlab/auth/otp/strategies/forti_authenticator.rb44
-rw-r--r--lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb50
-rw-r--r--lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp.rb47
-rw-r--r--lib/gitlab/auth/saml/config.rb4
-rw-r--r--lib/gitlab/auth/saml/identity_linker.rb2
-rw-r--r--lib/gitlab/background_migration/.rubocop.yml9
-rw-r--r--lib/gitlab/background_migration/backfill_artifact_expiry_date.rb58
-rw-r--r--lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex.rb44
-rw-r--r--lib/gitlab/background_migration/backfill_group_features.rb31
-rw-r--r--lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb104
-rw-r--r--lib/gitlab/background_migration/backfill_integrations_type_new.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_issue_search_data.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb4
-rw-r--r--lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_note_discussion_id.rb44
-rw-r--r--lib/gitlab/background_migration/backfill_project_settings.rb41
-rw-r--r--lib/gitlab/background_migration/backfill_topics_title.rb28
-rw-r--r--lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb2
-rw-r--r--lib/gitlab/background_migration/backfill_user_namespace.rb2
-rw-r--r--lib/gitlab/background_migration/batched_migration_job.rb57
-rw-r--r--lib/gitlab/background_migration/copy_column_using_background_migration_job.rb49
-rw-r--r--lib/gitlab/background_migration/delete_orphaned_deployments.rb2
-rw-r--r--lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb2
-rw-r--r--lib/gitlab/background_migration/expire_o_auth_tokens.rb23
-rw-r--r--lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb2
-rw-r--r--lib/gitlab/background_migration/fix_projects_without_project_feature.rb2
-rw-r--r--lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb4
-rw-r--r--lib/gitlab/background_migration/job_coordinator.rb2
-rw-r--r--lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb2
-rw-r--r--lib/gitlab/background_migration/migrate_stage_status.rb81
-rw-r--r--lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb2
-rw-r--r--lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb2
-rw-r--r--lib/gitlab/background_migration/populate_container_repository_migration_plan.rb2
-rw-r--r--lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb2
-rw-r--r--lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb2
-rw-r--r--lib/gitlab/background_migration/populate_vulnerability_reads.rb2
-rw-r--r--lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb8
-rw-r--r--lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb2
-rw-r--r--lib/gitlab/background_migration/remove_vulnerability_finding_links.rb2
-rw-r--r--lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb17
-rw-r--r--lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb17
-rw-r--r--lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports.rb45
-rw-r--r--lib/gitlab/background_migration/update_timelogs_null_spent_at.rb2
-rw-r--r--lib/gitlab/background_migration/update_timelogs_project_id.rb2
-rw-r--r--lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb2
-rw-r--r--lib/gitlab/backtrace_cleaner.rb1
-rw-r--r--lib/gitlab/chat.rb2
-rw-r--r--lib/gitlab/checks/changes_access.rb44
-rw-r--r--lib/gitlab/checks/lfs_check.rb2
-rw-r--r--lib/gitlab/checks/single_change_access.rb3
-rw-r--r--lib/gitlab/ci/badge/coverage/template.rb4
-rw-r--r--lib/gitlab/ci/badge/pipeline/template.rb4
-rw-r--r--lib/gitlab/ci/badge/release/template.rb4
-rw-r--r--lib/gitlab/ci/badge/template.rb3
-rw-r--r--lib/gitlab/ci/config.rb55
-rw-r--r--lib/gitlab/ci/config/entry/environment.rb2
-rw-r--r--lib/gitlab/ci/config/entry/job.rb20
-rw-r--r--lib/gitlab/ci/config/entry/reports.rb6
-rw-r--r--lib/gitlab/ci/config/entry/root.rb23
-rw-r--r--lib/gitlab/ci/config/extendable/entry.rb2
-rw-r--r--lib/gitlab/ci/config/external/file/local.rb20
-rw-r--r--lib/gitlab/ci/config/external/file/project.rb24
-rw-r--r--lib/gitlab/ci/config/external/file/remote.rb2
-rw-r--r--lib/gitlab/ci/config/external/file/template.rb11
-rw-r--r--lib/gitlab/ci/jwt.rb2
-rw-r--r--lib/gitlab/ci/lint.rb19
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schema_validator.rb46
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/cluster-image-scanning-report-format.json977
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/container-scanning-report-format.json911
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/coverage-fuzzing-report-format.json874
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dast-report-format.json1287
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dependency-scanning-report-format.json968
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/sast-report-format.json869
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/secret-detection-report-format.json892
l---------lib/gitlab/ci/parsers/security/validators/schemas/dependency-scanning-report-format.json1
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/sast-report-format.json706
-rw-r--r--lib/gitlab/ci/parsers/security/validators/schemas/secret-detection-report-format.json729
-rw-r--r--lib/gitlab/ci/pipeline/chain/command.rb2
-rw-r--r--lib/gitlab/ci/pipeline/chain/config/process.rb2
-rw-r--r--lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb6
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/matches.rb7
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb7
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb12
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/string.rb4
-rw-r--r--lib/gitlab/ci/pipeline/expression/lexeme/value.rb2
-rw-r--r--lib/gitlab/ci/pipeline/logger.rb2
-rw-r--r--lib/gitlab/ci/pipeline/metrics.rb2
-rw-r--r--lib/gitlab/ci/queue/metrics.rb10
-rw-r--r--lib/gitlab/ci/runner_instructions.rb2
-rw-r--r--lib/gitlab/ci/runner_upgrade_check.rb9
-rw-r--r--lib/gitlab/ci/status/bridge/common.rb2
-rw-r--r--lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml1
-rw-r--r--lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Build.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/DAST-Default-Branch-Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml125
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/License-Scanning.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml41
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml30
-rw-r--r--lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml407
-rw-r--r--lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml35
-rw-r--r--lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml36
-rw-r--r--lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml28
-rw-r--r--lib/gitlab/ci/templates/Managed-Cluster-Applications.gitlab-ci.yml32
-rw-r--r--lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml3
-rw-r--r--lib/gitlab/ci/templates/Ruby.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml29
-rw-r--r--lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml4
-rw-r--r--lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml34
-rw-r--r--lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml13
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml6
-rw-r--r--lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml41
-rw-r--r--lib/gitlab/ci/templates/Serverless.gitlab-ci.yml35
-rw-r--r--lib/gitlab/ci/templates/Terraform.gitlab-ci.yml21
-rw-r--r--lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml32
-rw-r--r--lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml10
-rw-r--r--lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml2
-rw-r--r--lib/gitlab/ci/trace.rb14
-rw-r--r--lib/gitlab/ci/variables/builder.rb2
-rw-r--r--lib/gitlab/ci/yaml_processor/result.rb8
-rw-r--r--lib/gitlab/color.rb5
-rw-r--r--lib/gitlab/config/entry/validator.rb4
-rw-r--r--lib/gitlab/config/loader/yaml.rb2
-rw-r--r--lib/gitlab/content_security_policy/config_loader.rb9
-rw-r--r--lib/gitlab/cycle_analytics/summary/deployment_frequency.rb2
-rw-r--r--lib/gitlab/data_builder/issuable.rb64
-rw-r--r--lib/gitlab/database.rb17
-rw-r--r--lib/gitlab/database/background_migration/batch_optimizer.rb2
-rw-r--r--lib/gitlab/database/background_migration/batched_migration.rb2
-rw-r--r--lib/gitlab/database/background_migration/batched_migration_wrapper.rb47
-rw-r--r--lib/gitlab/database/gitlab_schemas.yml4
-rw-r--r--lib/gitlab/database/load_balancing/configuration.rb2
-rw-r--r--lib/gitlab/database/load_balancing/load_balancer.rb2
-rw-r--r--lib/gitlab/database/migration.rb9
-rw-r--r--lib/gitlab/database/migration_helpers.rb15
-rw-r--r--lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb6
-rw-r--r--lib/gitlab/database/migrations/background_migration_helpers.rb80
-rw-r--r--lib/gitlab/database/migrations/base_background_runner.rb56
-rw-r--r--lib/gitlab/database/migrations/batched_background_migration_helpers.rb16
-rw-r--r--lib/gitlab/database/migrations/observers/query_log.rb2
-rw-r--r--lib/gitlab/database/migrations/observers/query_statistics.rb1
-rw-r--r--lib/gitlab/database/migrations/reestablished_connection_stack.rb56
-rw-r--r--lib/gitlab/database/migrations/runner.rb12
-rw-r--r--lib/gitlab/database/migrations/test_background_runner.rb35
-rw-r--r--lib/gitlab/database/migrations/test_batched_background_runner.rb49
-rw-r--r--lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb1
-rw-r--r--lib/gitlab/database/query_analyzer.rb76
-rw-r--r--lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb37
-rw-r--r--lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb2
-rw-r--r--lib/gitlab/database/reindexing.rb2
-rw-r--r--lib/gitlab/database/shared_model.rb6
-rw-r--r--lib/gitlab/database_importers/work_items/base_type_importer.rb14
-rw-r--r--lib/gitlab/default_branch.rb2
-rw-r--r--lib/gitlab/diff/file.rb12
-rw-r--r--lib/gitlab/diff/highlight.rb6
-rw-r--r--lib/gitlab/diff/highlight_cache.rb4
-rw-r--r--lib/gitlab/diff/rendered/notebook/diff_file.rb12
-rw-r--r--lib/gitlab/doctor/secrets.rb53
-rw-r--r--lib/gitlab/email/message/build_ios_app_guide.rb57
-rw-r--r--lib/gitlab/email/message/in_product_marketing/base.rb30
-rw-r--r--lib/gitlab/email/message/in_product_marketing/helper.rb31
-rw-r--r--lib/gitlab/email/receiver.rb2
-rw-r--r--lib/gitlab/encrypted_ldap_command.rb2
-rw-r--r--lib/gitlab/error_tracking.rb4
-rw-r--r--lib/gitlab/error_tracking/error_repository.rb113
-rw-r--r--lib/gitlab/error_tracking/error_repository/active_record_strategy.rb98
-rw-r--r--lib/gitlab/experiment/rollout/feature.rb4
-rw-r--r--lib/gitlab/experimentation/controller_concern.rb4
-rw-r--r--lib/gitlab/experimentation/experiment.rb2
-rw-r--r--lib/gitlab/git/branch.rb4
-rw-r--r--lib/gitlab/git/diff.rb8
-rw-r--r--lib/gitlab/git_access.rb4
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb60
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb2
-rw-r--r--lib/gitlab/github_import.rb2
-rw-r--r--lib/gitlab/github_import/issuable_finder.rb2
-rw-r--r--lib/gitlab/github_import/parallel_scheduling.rb7
-rw-r--r--lib/gitlab/gon_helper.rb17
-rw-r--r--lib/gitlab/graphql/find_argument_in_parent.rb32
-rw-r--r--lib/gitlab/graphql/global_id_compatibility.rb20
-rw-r--r--lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb2
-rw-r--r--lib/gitlab/graphql/queries.rb5
-rw-r--r--lib/gitlab/health_checks/middleware.rb33
-rw-r--r--lib/gitlab/health_checks/server.rb62
-rw-r--r--lib/gitlab/hook_data/issuable_builder.rb60
-rw-r--r--lib/gitlab/hotlinking_detector.rb2
-rw-r--r--lib/gitlab/i18n.rb12
-rw-r--r--lib/gitlab/i18n/po_linter.rb14
-rw-r--r--lib/gitlab/import_export/file_importer.rb2
-rw-r--r--lib/gitlab/import_export/group/import_export.yml4
-rw-r--r--lib/gitlab/import_export/group/relation_factory.rb4
-rw-r--r--lib/gitlab/import_export/group/relation_tree_restorer.rb2
-rw-r--r--lib/gitlab/import_export/project/import_export.yml6
-rw-r--r--lib/gitlab/import_export/project/tree_restorer.rb2
-rw-r--r--lib/gitlab/import_export/project/tree_saver.rb2
-rw-r--r--lib/gitlab/inactive_projects_deletion_warning_tracker.rb47
-rw-r--r--lib/gitlab/instrumentation/rate_limiting_gates.rb33
-rw-r--r--lib/gitlab/instrumentation_helper.rb5
-rw-r--r--lib/gitlab/integrations/sti_type.rb66
-rw-r--r--lib/gitlab/integrations_logger.rb9
-rw-r--r--lib/gitlab/jira/http_client.rb6
-rw-r--r--lib/gitlab/json.rb2
-rw-r--r--lib/gitlab/kas.rb4
-rw-r--r--lib/gitlab/kubernetes/cilium_network_policy.rb141
-rw-r--r--lib/gitlab/kubernetes/kube_client.rb18
-rw-r--r--lib/gitlab/kubernetes/network_policy.rb98
-rw-r--r--lib/gitlab/kubernetes/network_policy_common.rb63
-rw-r--r--lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb31
-rw-r--r--lib/gitlab/metrics/exporter/base_exporter.rb11
-rw-r--r--lib/gitlab/metrics/exporter/health_checks_middleware.rb35
-rw-r--r--lib/gitlab/metrics/methods.rb3
-rw-r--r--lib/gitlab/metrics/rails_slis.rb8
-rw-r--r--lib/gitlab/metrics/sli.rb59
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb8
-rw-r--r--lib/gitlab/metrics/subscribers/rack_attack.rb28
-rw-r--r--lib/gitlab/middleware/go.rb1
-rw-r--r--lib/gitlab/omniauth_initializer.rb2
-rw-r--r--lib/gitlab/pagination/gitaly_keyset_pager.rb12
-rw-r--r--lib/gitlab/patch/database_config.rb21
-rw-r--r--lib/gitlab/path_regex.rb1
-rw-r--r--lib/gitlab/phabricator_import.rb2
-rw-r--r--lib/gitlab/process_supervisor.rb20
-rw-r--r--lib/gitlab/profiler.rb1
-rw-r--r--lib/gitlab/project_service_logger.rb9
-rw-r--r--lib/gitlab/push_options.rb1
-rw-r--r--lib/gitlab/query_limiting/active_support_subscriber.rb2
-rw-r--r--lib/gitlab/query_limiting/transaction.rb22
-rw-r--r--lib/gitlab/quick_actions/merge_request_actions.rb4
-rw-r--r--lib/gitlab/reactive_cache_set_cache.rb4
-rw-r--r--lib/gitlab/repository_archive_rate_limiter.rb2
-rw-r--r--lib/gitlab/request_profiler.rb36
-rw-r--r--lib/gitlab/request_profiler/middleware.rb107
-rw-r--r--lib/gitlab/request_profiler/profile.rb43
-rw-r--r--lib/gitlab/safe_request_purger.rb37
-rw-r--r--lib/gitlab/setup_helper.rb35
-rw-r--r--lib/gitlab/sidekiq_config.rb14
-rw-r--r--lib/gitlab/sidekiq_config/dummy_worker.rb4
-rw-r--r--lib/gitlab/sidekiq_config/worker.rb2
-rw-r--r--lib/gitlab/sidekiq_middleware/server_metrics.rb2
-rw-r--r--lib/gitlab/snippet_search_results.rb4
-rw-r--r--lib/gitlab/sourcegraph.rb2
-rw-r--r--lib/gitlab/subscription_portal.rb7
-rw-r--r--lib/gitlab/template/gitlab_ci_yml_template.rb30
-rw-r--r--lib/gitlab/testing/clear_process_memory_cache_middleware.rb2
-rw-r--r--lib/gitlab/tracking/event_definition.rb1
-rw-r--r--lib/gitlab/untrusted_regexp.rb4
-rw-r--r--lib/gitlab/url_builder.rb2
-rw-r--r--lib/gitlab/usage/metric.rb16
-rw-r--r--lib/gitlab/usage/metric_definition.rb20
-rw-r--r--lib/gitlab/usage/metrics/aggregates/aggregate.rb2
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/base_metric.rb16
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/cert_based_clusters_ff_metric.rb2
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb2
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric.rb39
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric.rb57
-rw-r--r--lib/gitlab/usage/metrics/instrumentations/database_metric.rb29
-rw-r--r--lib/gitlab/usage/metrics/query.rb24
-rw-r--r--lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb18
-rw-r--r--lib/gitlab/usage/service_ping_report.rb4
-rw-r--r--lib/gitlab/usage_counters/common.rb30
-rw-r--r--lib/gitlab/usage_counters/pod_logs.rb11
-rw-r--r--lib/gitlab/usage_data.rb69
-rw-r--r--lib/gitlab/usage_data_counters/ci_template_unique_counter.rb2
-rw-r--r--lib/gitlab/usage_data_counters/editor_unique_counter.rb5
-rw-r--r--lib/gitlab/usage_data_counters/hll_redis_counter.rb2
-rw-r--r--lib/gitlab/usage_data_counters/ipynb_diff_activity_counter.rb36
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_templates.yml64
-rw-r--r--lib/gitlab/usage_data_counters/known_events/ci_users.yml2
-rw-r--r--lib/gitlab/usage_data_counters/known_events/code_review_events.yml25
-rw-r--r--lib/gitlab/usage_data_counters/known_events/common.yml5
-rw-r--r--lib/gitlab/usage_data_counters/known_events/epic_events.yml7
-rw-r--r--lib/gitlab/usage_data_non_sql_metrics.rb4
-rw-r--r--lib/gitlab/usage_data_queries.rb4
-rw-r--r--lib/gitlab/user_access.rb4
-rw-r--r--lib/gitlab/utils.rb4
-rw-r--r--lib/gitlab/utils/usage_data.rb280
-rw-r--r--lib/gitlab/workhorse.rb10
-rw-r--r--lib/gitlab/zentao/client.rb2
-rw-r--r--lib/product_analytics/collector_app.rb2
-rw-r--r--lib/service_ping/build_payload.rb63
-rw-r--r--lib/service_ping/devops_report.rb30
-rw-r--r--lib/service_ping/permit_data_categories.rb24
-rw-r--r--lib/service_ping/service_ping_settings.rb (renamed from app/services/service_ping/service_ping_settings.rb)0
-rw-r--r--lib/sidebars/groups/menus/ci_cd_menu.rb3
-rw-r--r--lib/sidebars/groups/menus/kubernetes_menu.rb2
-rw-r--r--lib/sidebars/groups/menus/settings_menu.rb8
-rw-r--r--lib/sidebars/projects/menus/infrastructure_menu.rb14
-rw-r--r--lib/sidebars/projects/menus/monitor_menu.rb6
-rw-r--r--lib/sidebars/projects/menus/settings_menu.rb34
-rw-r--r--lib/sidebars/projects/panel.rb4
-rw-r--r--lib/support/systemd/gitlab-sidekiq.service3
-rw-r--r--lib/tasks/dev.rake15
-rw-r--r--lib/tasks/gitlab/db.rake11
-rw-r--r--lib/tasks/gitlab/db/validate_config.rake4
-rw-r--r--lib/tasks/gitlab/metrics_exporter.rake26
-rw-r--r--lib/tasks/gitlab/seed/group_seed.rake2
-rw-r--r--lib/tasks/gitlab/shell.rake1
-rw-r--r--lib/tasks/gitlab/tw/codeowners.rake23
-rw-r--r--lib/tasks/gitlab/update_templates.rake2
-rw-r--r--lib/tasks/haml-lint.rake1
-rw-r--r--locale/am_ET/gitlab.po1772
-rw-r--r--locale/ar_SA/gitlab.po1808
-rw-r--r--locale/as_IN/gitlab.po1772
-rw-r--r--locale/az_AZ/gitlab.po1772
-rw-r--r--locale/ba_RU/gitlab.po1763
-rw-r--r--locale/bg/gitlab.po1772
-rw-r--r--locale/bn_BD/gitlab.po1772
-rw-r--r--locale/bn_IN/gitlab.po1772
-rw-r--r--locale/br_FR/gitlab.po1799
-rw-r--r--locale/bs_BA/gitlab.po1781
-rw-r--r--locale/ca_ES/gitlab.po1772
-rw-r--r--locale/cs_CZ/gitlab.po1790
-rw-r--r--locale/cy_GB/gitlab.po1808
-rw-r--r--locale/da_DK/gitlab.po1812
-rw-r--r--locale/de/gitlab.po1780
-rw-r--r--locale/el_GR/gitlab.po1772
-rw-r--r--locale/eo/gitlab.po1772
-rw-r--r--locale/es/gitlab.po1824
-rw-r--r--locale/et_EE/gitlab.po1772
-rw-r--r--locale/fa_IR/gitlab.po1772
-rw-r--r--locale/fi_FI/gitlab.po1772
-rw-r--r--locale/fil_PH/gitlab.po1772
-rw-r--r--locale/fr/gitlab.po1782
-rw-r--r--locale/gitlab.pot2944
-rw-r--r--locale/gl_ES/gitlab.po1772
-rw-r--r--locale/he_IL/gitlab.po1790
-rw-r--r--locale/hi_IN/gitlab.po1772
-rw-r--r--locale/hr_HR/gitlab.po1781
-rw-r--r--locale/hu_HU/gitlab.po1772
-rw-r--r--locale/hy_AM/gitlab.po1772
-rw-r--r--locale/id_ID/gitlab.po1763
-rw-r--r--locale/ig_NG/gitlab.po1763
-rw-r--r--locale/is_IS/gitlab.po1772
-rw-r--r--locale/it/gitlab.po1774
-rw-r--r--locale/ja/gitlab.po1777
-rw-r--r--locale/ka_GE/gitlab.po1772
-rw-r--r--locale/kab/gitlab.po1772
-rw-r--r--locale/ko/gitlab.po1927
-rw-r--r--locale/ku_TR/gitlab.po1772
-rw-r--r--locale/ky_KG/gitlab.po1772
-rw-r--r--locale/lt_LT/gitlab.po1790
-rw-r--r--locale/mk_MK/gitlab.po1772
-rw-r--r--locale/ml_IN/gitlab.po1772
-rw-r--r--locale/mn_MN/gitlab.po1772
-rw-r--r--locale/nb_NO/gitlab.po2024
-rw-r--r--locale/nl_NL/gitlab.po1772
-rw-r--r--locale/or_IN/gitlab.po1772
-rw-r--r--locale/pa_IN/gitlab.po1772
-rw-r--r--locale/pl_PL/gitlab.po1798
-rw-r--r--locale/pt_BR/gitlab.po2346
-rw-r--r--locale/pt_PT/gitlab.po1774
-rw-r--r--locale/ro_RO/gitlab.po8569
-rw-r--r--locale/ru/gitlab.po1806
-rw-r--r--locale/si_LK/gitlab.po1774
-rw-r--r--locale/sk_SK/gitlab.po1790
-rw-r--r--locale/sl_SI/gitlab.po1790
-rw-r--r--locale/sq_AL/gitlab.po1772
-rw-r--r--locale/sr_CS/gitlab.po1781
-rw-r--r--locale/sr_SP/gitlab.po1781
-rw-r--r--locale/sv_SE/gitlab.po1772
-rw-r--r--locale/sw_KE/gitlab.po1772
-rw-r--r--locale/ta_IN/gitlab.po1772
-rw-r--r--locale/tr_TR/gitlab.po1782
-rw-r--r--locale/uk/gitlab.po2316
-rw-r--r--locale/ur_PK/gitlab.po1772
-rw-r--r--locale/uz_UZ/gitlab.po1772
-rw-r--r--locale/vi_VN/gitlab.po1763
-rw-r--r--locale/zh_CN/gitlab.po2485
-rw-r--r--locale/zh_HK/gitlab.po1765
-rw-r--r--locale/zh_TW/gitlab.po1765
-rw-r--r--metrics_server/dependencies.rb1
-rw-r--r--metrics_server/metrics_server.rb58
-rw-r--r--package.json46
-rw-r--r--public/404.html3
-rw-r--r--public/422.html3
-rw-r--r--public/500.html3
-rw-r--r--public/502.html3
-rw-r--r--public/503.html3
-rw-r--r--public/apple-touch-icon-precomposed.pngbin9509 -> 0 bytes
-rw-r--r--public/apple-touch-icon.pngbin9509 -> 7455 bytes
-rw-r--r--public/slash-command-logo.pngbin9509 -> 1528 bytes
-rw-r--r--qa/.rspec4
-rw-r--r--qa/.rspec_internal2
-rw-r--r--qa/Dockerfile62
-rw-r--r--qa/README.md2
-rw-r--r--qa/Rakefile5
-rw-r--r--qa/lib/gitlab/page/group/settings/billing.rb27
-rw-r--r--qa/lib/gitlab/page/group/settings/billing.stub.rb216
-rw-r--r--qa/lib/gitlab/page/group/settings/usage_quotas.rb2
-rw-r--r--qa/qa.rb6
-rw-r--r--qa/qa/ce/strategy.rb1
-rw-r--r--qa/qa/fixtures/package_managers/maven/build_install.gradle.erb1
-rw-r--r--qa/qa/fixtures/web_ide/logo_sample.svg29
-rw-r--r--qa/qa/flow/merge_request.rb20
-rw-r--r--qa/qa/git/repository.rb34
-rw-r--r--qa/qa/page/base.rb19
-rw-r--r--qa/qa/page/component/blob_content.rb11
-rw-r--r--qa/qa/page/component/new_snippet.rb3
-rw-r--r--qa/qa/page/component/snippet.rb4
-rw-r--r--qa/qa/page/dashboard/snippet/edit.rb3
-rw-r--r--qa/qa/page/file/form.rb3
-rw-r--r--qa/qa/page/group/settings/group_deploy_tokens.rb8
-rw-r--r--qa/qa/page/main/login.rb12
-rw-r--r--qa/qa/page/merge_request/index.rb17
-rw-r--r--qa/qa/page/merge_request/new.rb15
-rw-r--r--qa/qa/page/merge_request/show.rb9
-rw-r--r--qa/qa/page/project/pipeline/new.rb4
-rw-r--r--qa/qa/page/project/pipeline/show.rb6
-rw-r--r--qa/qa/page/project/pipeline_editor/show.rb30
-rw-r--r--qa/qa/page/project/settings/ci_cd.rb7
-rw-r--r--qa/qa/page/project/settings/deploy_tokens.rb24
-rw-r--r--qa/qa/page/project/settings/general_pipelines.rb23
-rw-r--r--qa/qa/page/project/settings/merge_request.rb2
-rw-r--r--qa/qa/page/project/settings/services/prometheus.rb2
-rw-r--r--qa/qa/page/project/show.rb6
-rw-r--r--qa/qa/resource/group_base.rb4
-rw-r--r--qa/qa/resource/group_deploy_token.rb4
-rw-r--r--qa/qa/resource/job.rb35
-rw-r--r--qa/qa/resource/members.rb3
-rw-r--r--qa/qa/resource/merge_request.rb12
-rw-r--r--qa/qa/resource/pipeline.rb50
-rw-r--r--qa/qa/resource/project.rb38
-rw-r--r--qa/qa/resource/project_access_token.rb4
-rw-r--r--qa/qa/resource/project_deploy_token.rb4
-rw-r--r--qa/qa/resource/project_imported_from_github.rb2
-rw-r--r--qa/qa/resource/repository/commit.rb6
-rw-r--r--qa/qa/runtime/browser.rb31
-rw-r--r--qa/qa/runtime/env.rb6
-rw-r--r--qa/qa/runtime/feature.rb2
-rw-r--r--qa/qa/runtime/ip_address.rb2
-rw-r--r--qa/qa/scenario/template.rb63
-rw-r--r--qa/qa/scenario/test/integration/mattermost.rb7
-rw-r--r--qa/qa/service/cluster_provider/k3s_cilium.rb93
-rw-r--r--qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb71
-rw-r--r--qa/qa/specs/features/api/1_manage/project_access_token_spec.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb2
-rw-r--r--qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb5
-rw-r--r--qa/qa/specs/features/api/3_create/repository/files_spec.rb166
-rw-r--r--qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb120
-rw-r--r--qa/qa/specs/features/api/5_package/container_registry_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb24
-rw-r--r--qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb24
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb64
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb40
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb46
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb88
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb3
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb6
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb14
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb23
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb4
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb17
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb1
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb266
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb240
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb9
-rw-r--r--qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb7
-rw-r--r--qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb (renamed from qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb)0
-rw-r--r--qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb (renamed from qa/spec/support/shared_contexts/packages_registry_shared_context.rb)0
-rw-r--r--qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb152
-rw-r--r--qa/qa/specs/features/shared_examples/merge_with_code_owner_shared_examples.rb (renamed from qa/spec/support/shared_examples/merge_with_code_owner_shared_examples.rb)0
-rw-r--r--qa/qa/specs/knapsack_runner.rb21
-rw-r--r--qa/qa/specs/qa_deprecation_toolkit_env.rb24
-rw-r--r--qa/qa/specs/runner.rb98
-rw-r--r--qa/qa/specs/spec_helper.rb136
-rw-r--r--qa/qa/support/formatters/allure_metadata_formatter.rb35
-rw-r--r--qa/qa/support/gitlab_address.rb48
-rw-r--r--qa/qa/support/knapsack_report.rb167
-rw-r--r--qa/qa/support/matchers/have_matcher.rb1
-rw-r--r--qa/qa/support/page/logging.rb6
-rw-r--r--qa/qa/tools/delete_test_snippets.rb78
-rw-r--r--qa/qa/tools/knapsack_report.rb150
-rw-r--r--qa/spec/README.md7
-rw-r--r--qa/spec/git/repository_spec.rb6
-rw-r--r--qa/spec/qa_deprecation_toolkit_env.rb22
-rw-r--r--qa/spec/scenario/template_spec.rb72
-rw-r--r--qa/spec/scenario/test/integration/mattermost_spec.rb18
-rw-r--r--qa/spec/scenario_shared_examples.rb71
-rw-r--r--qa/spec/spec_helper.rb132
-rw-r--r--qa/spec/specs/scenario_shared_examples.rb76
-rw-r--r--qa/spec/specs/spec_helper.rb5
-rw-r--r--qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb150
-rw-r--r--qa/tasks/knapsack.rake22
-rw-r--r--qa/tasks/vulnerabilities.rake29
-rw-r--r--rubocop/cop/database/multiple_databases.rb3
-rw-r--r--rubocop/cop/gitlab/avoid_feature_get.rb4
-rw-r--r--rubocop/cop/gitlab/mark_used_feature_flags.rb14
-rw-r--r--rubocop/cop/gitlab/namespaced_class.rb59
-rw-r--r--rubocop/cop/migration/background_migration_base_class.rb33
-rw-r--r--rubocop/cop/migration/background_migration_record.rb41
-rw-r--r--rubocop/cop/migration/hash_index.rb53
-rw-r--r--rubocop/cop/migration/migration_record.rb37
-rw-r--r--rubocop/migration_helpers.rb11
-rwxr-xr-xscripts/changed-feature-flags75
-rwxr-xr-xscripts/dump_graphql_schema25
-rw-r--r--scripts/frontend/eslint.js22
-rwxr-xr-xscripts/gitaly-test-spawn3
-rwxr-xr-xscripts/glfm/update-example-snapshots.rb5
-rwxr-xr-xscripts/glfm/update-specification.rb5
-rw-r--r--scripts/lib/glfm/constants.rb43
-rw-r--r--scripts/lib/glfm/parse_examples.rb169
-rw-r--r--scripts/lib/glfm/render_static_html.rb50
-rw-r--r--scripts/lib/glfm/render_wysiwyg_html_and_json.js152
-rw-r--r--scripts/lib/glfm/shared.rb43
-rw-r--r--scripts/lib/glfm/update_example_snapshots.rb245
-rw-r--r--scripts/lib/glfm/update_specification.rb127
-rwxr-xr-xscripts/qa/quarantine-types-check62
-rwxr-xr-xscripts/review_apps/review-apps.sh4
-rwxr-xr-xscripts/setup-test-env1
-rwxr-xr-xscripts/trigger-build.rb136
-rwxr-xr-xscripts/used-feature-flags7
-rw-r--r--scripts/utils.sh15
-rw-r--r--sidekiq_cluster/cli.rb33
-rw-r--r--spec/commands/metrics_server/metrics_server_spec.rb89
-rw-r--r--spec/commands/sidekiq_cluster/cli_spec.rb102
-rw-r--r--spec/components/pajamas/alert_component_spec.rb100
-rw-r--r--spec/config/object_store_settings_spec.rb87
-rw-r--r--spec/config/settings_spec.rb2
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb64
-rw-r--r--spec/controllers/admin/clusters_controller_spec.rb239
-rw-r--r--spec/controllers/admin/groups_controller_spec.rb6
-rw-r--r--spec/controllers/admin/requests_profiles_controller_spec.rb72
-rw-r--r--spec/controllers/admin/runners_controller_spec.rb64
-rw-r--r--spec/controllers/admin/topics_controller_spec.rb17
-rw-r--r--spec/controllers/dashboard/todos_controller_spec.rb13
-rw-r--r--spec/controllers/graphql_controller_spec.rb24
-rw-r--r--spec/controllers/groups/clusters_controller_spec.rb188
-rw-r--r--spec/controllers/groups/dependency_proxy_auth_controller_spec.rb12
-rw-r--r--spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb26
-rw-r--r--spec/controllers/groups/releases_controller_spec.rb26
-rw-r--r--spec/controllers/groups/runners_controller_spec.rb201
-rw-r--r--spec/controllers/groups/settings/ci_cd_controller_spec.rb75
-rw-r--r--spec/controllers/groups/shared_projects_controller_spec.rb3
-rw-r--r--spec/controllers/groups/uploads_controller_spec.rb163
-rw-r--r--spec/controllers/groups_controller_spec.rb68
-rw-r--r--spec/controllers/jira_connect/events_controller_spec.rb4
-rw-r--r--spec/controllers/oauth/authorizations_controller_spec.rb20
-rw-r--r--spec/controllers/profiles/emails_controller_spec.rb6
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb1
-rw-r--r--spec/controllers/projects/branches_controller_spec.rb35
-rw-r--r--spec/controllers/projects/ci/secure_files_controller_spec.rb34
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb198
-rw-r--r--spec/controllers/projects/environments_controller_spec.rb11
-rw-r--r--spec/controllers/projects/error_tracking/projects_controller_spec.rb31
-rw-r--r--spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb37
-rw-r--r--spec/controllers/projects/error_tracking_controller_spec.rb69
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb159
-rw-r--r--spec/controllers/projects/jobs_controller_spec.rb13
-rw-r--r--spec/controllers/projects/logs_controller_spec.rb22
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb76
-rw-r--r--spec/controllers/projects/prometheus/alerts_controller_spec.rb131
-rw-r--r--spec/controllers/projects/releases_controller_spec.rb25
-rw-r--r--spec/controllers/projects/serverless/functions_controller_spec.rb341
-rw-r--r--spec/controllers/projects/service_ping_controller_spec.rb12
-rw-r--r--spec/controllers/projects/services_controller_spec.rb82
-rw-r--r--spec/controllers/projects/settings/operations_controller_spec.rb31
-rw-r--r--spec/controllers/projects/tracings_controller_spec.rb10
-rw-r--r--spec/controllers/projects/uploads_controller_spec.rb235
-rw-r--r--spec/controllers/projects_controller_spec.rb68
-rw-r--r--spec/controllers/repositories/lfs_storage_controller_spec.rb13
-rw-r--r--spec/controllers/uploads_controller_spec.rb13
-rw-r--r--spec/db/docs_spec.rb131
-rw-r--r--spec/db/schema_spec.rb5
-rw-r--r--spec/experiments/application_experiment_spec.rb8
-rw-r--r--spec/experiments/concerns/project_commit_count_spec.rb2
-rw-r--r--spec/factories/alert_management/alerts.rb14
-rw-r--r--spec/factories/ci/pipelines.rb4
-rw-r--r--spec/factories/ci/secure_files.rb2
-rw-r--r--spec/factories/clusters/agent_tokens.rb1
-rw-r--r--spec/factories/deploy_tokens.rb1
-rw-r--r--spec/factories/incident_management/timeline_events.rb14
-rw-r--r--spec/factories/keys.rb10
-rw-r--r--spec/factories/namespace_ci_cd_settings.rb7
-rw-r--r--spec/factories/packages/cleanup/policies.rb16
-rw-r--r--spec/factories/projects.rb6
-rw-r--r--spec/factories/topics.rb1
-rw-r--r--spec/factories/users/in_product_marketing_email.rb6
-rw-r--r--spec/features/admin/admin_groups_spec.rb2
-rw-r--r--spec/features/admin/admin_projects_spec.rb4
-rw-r--r--spec/features/admin/admin_requests_profiles_spec.rb136
-rw-r--r--spec/features/admin/admin_runners_spec.rb59
-rw-r--r--spec/features/admin/admin_sees_background_migrations_spec.rb142
-rw-r--r--spec/features/admin/admin_settings_spec.rb55
-rw-r--r--spec/features/admin/clusters/eks_spec.rb32
-rw-r--r--spec/features/admin/users/users_spec.rb2
-rw-r--r--spec/features/dashboard/issuables_counter_spec.rb5
-rw-r--r--spec/features/dashboard/issues_filter_spec.rb4
-rw-r--r--spec/features/dashboard/merge_requests_spec.rb15
-rw-r--r--spec/features/dashboard/todos/todos_sorting_spec.rb22
-rw-r--r--spec/features/dashboard/todos/todos_spec.rb4
-rw-r--r--spec/features/explore/topics_spec.rb4
-rw-r--r--spec/features/frequently_visited_projects_and_groups_spec.rb2
-rw-r--r--spec/features/groups/clusters/eks_spec.rb37
-rw-r--r--spec/features/groups/crm/contacts/create_spec.rb28
-rw-r--r--spec/features/groups/dependency_proxy_spec.rb16
-rw-r--r--spec/features/groups/empty_states_spec.rb18
-rw-r--r--spec/features/groups/group_settings_spec.rb2
-rw-r--r--spec/features/groups/issues_spec.rb65
-rw-r--r--spec/features/groups/members/manage_groups_spec.rb138
-rw-r--r--spec/features/groups/settings/ci_cd_spec.rb65
-rw-r--r--spec/features/groups_spec.rb18
-rw-r--r--spec/features/ide/user_opens_merge_request_spec.rb1
-rw-r--r--spec/features/issuables/issuable_list_spec.rb12
-rw-r--r--spec/features/issuables/sorting_list_spec.rb4
-rw-r--r--spec/features/issue_rebalancing_spec.rb12
-rw-r--r--spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb8
-rw-r--r--spec/features/issues/filtered_search/dropdown_assignee_spec.rb30
-rw-r--r--spec/features/issues/filtered_search/dropdown_author_spec.rb24
-rw-r--r--spec/features/issues/filtered_search/dropdown_base_spec.rb22
-rw-r--r--spec/features/issues/filtered_search/dropdown_emoji_spec.rb32
-rw-r--r--spec/features/issues/filtered_search/dropdown_hint_spec.rb62
-rw-r--r--spec/features/issues/filtered_search/dropdown_label_spec.rb10
-rw-r--r--spec/features/issues/filtered_search/dropdown_milestone_spec.rb14
-rw-r--r--spec/features/issues/filtered_search/dropdown_release_spec.rb16
-rw-r--r--spec/features/issues/filtered_search/filter_issues_spec.rb344
-rw-r--r--spec/features/issues/filtered_search/recent_searches_spec.rb97
-rw-r--r--spec/features/issues/filtered_search/search_bar_spec.rb86
-rw-r--r--spec/features/issues/filtered_search/visual_tokens_spec.rb128
-rw-r--r--spec/features/issues/gfm_autocomplete_spec.rb2
-rw-r--r--spec/features/issues/rss_spec.rb16
-rw-r--r--spec/features/issues/user_bulk_edits_issues_labels_spec.rb8
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb14
-rw-r--r--spec/features/issues/user_creates_issue_spec.rb6
-rw-r--r--spec/features/issues/user_filters_issues_spec.rb4
-rw-r--r--spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb1
-rw-r--r--spec/features/issues/user_sees_breadcrumb_links_spec.rb6
-rw-r--r--spec/features/issues/user_sorts_issues_spec.rb17
-rw-r--r--spec/features/labels_hierarchy_spec.rb64
-rw-r--r--spec/features/markdown/mermaid_spec.rb45
-rw-r--r--spec/features/merge_request/batch_comments_spec.rb13
-rw-r--r--spec/features/merge_request/close_reopen_report_toggle_spec.rb20
-rw-r--r--spec/features/merge_request/merge_request_discussion_lock_spec.rb93
-rw-r--r--spec/features/merge_request/user_accepts_merge_request_spec.rb18
-rw-r--r--spec/features/merge_request/user_assigns_themselves_spec.rb6
-rw-r--r--spec/features/merge_request/user_awards_emoji_spec.rb4
-rw-r--r--spec/features/merge_request/user_comments_on_diff_spec.rb13
-rw-r--r--spec/features/merge_request/user_creates_image_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_creates_merge_request_spec.rb42
-rw-r--r--spec/features/merge_request/user_customizes_merge_commit_message_spec.rb8
-rw-r--r--spec/features/merge_request/user_edits_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb1
-rw-r--r--spec/features/merge_request/user_manages_subscription_spec.rb45
-rw-r--r--spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb3
-rw-r--r--spec/features/merge_request/user_merges_immediately_spec.rb10
-rw-r--r--spec/features/merge_request/user_merges_merge_request_spec.rb5
-rw-r--r--spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb2
-rw-r--r--spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb13
-rw-r--r--spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb39
-rw-r--r--spec/features/merge_request/user_posts_diff_notes_spec.rb2
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb86
-rw-r--r--spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb9
-rw-r--r--spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb43
-rw-r--r--spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb1
-rw-r--r--spec/features/merge_request/user_squashes_merge_request_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_diffs_spec.rb2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb16
-rw-r--r--spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb4
-rw-r--r--spec/features/merge_requests/user_lists_merge_requests_spec.rb14
-rw-r--r--spec/features/merge_requests/user_mass_updates_spec.rb6
-rw-r--r--spec/features/merge_requests/user_sorts_merge_requests_spec.rb33
-rw-r--r--spec/features/monitor_sidebar_link_spec.rb5
-rw-r--r--spec/features/oauth_login_spec.rb55
-rw-r--r--spec/features/profiles/keys_spec.rb2
-rw-r--r--spec/features/profiles/oauth_applications_spec.rb2
-rw-r--r--spec/features/projects/active_tabs_spec.rb2
-rw-r--r--spec/features/projects/blobs/blame_spec.rb67
-rw-r--r--spec/features/projects/ci/editor_spec.rb34
-rw-r--r--spec/features/projects/ci/secure_files_spec.rb44
-rw-r--r--spec/features/projects/clusters/eks_spec.rb36
-rw-r--r--spec/features/projects/clusters/gcp_spec.rb95
-rw-r--r--spec/features/projects/clusters_spec.rb97
-rw-r--r--spec/features/projects/commit/mini_pipeline_graph_spec.rb2
-rw-r--r--spec/features/projects/graph_spec.rb17
-rw-r--r--spec/features/projects/integrations/prometheus_external_alerts_spec.rb34
-rw-r--r--spec/features/projects/integrations/user_activates_prometheus_spec.rb5
-rw-r--r--spec/features/projects/issues/design_management/user_uploads_designs_spec.rb3
-rw-r--r--spec/features/projects/jobs/user_browses_jobs_spec.rb2
-rw-r--r--spec/features/projects/jobs_spec.rb2
-rw-r--r--spec/features/projects/members/groups_with_access_list_spec.rb2
-rw-r--r--spec/features/projects/members/invite_group_spec.rb296
-rw-r--r--spec/features/projects/members/manage_groups_spec.rb233
-rw-r--r--spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb2
-rw-r--r--spec/features/projects/members/master_manages_access_requests_spec.rb2
-rw-r--r--spec/features/projects/members/member_leaves_project_spec.rb2
-rw-r--r--spec/features/projects/navbar_spec.rb6
-rw-r--r--spec/features/projects/packages_spec.rb3
-rw-r--r--spec/features/projects/pipelines/legacy_pipeline_spec.rb1073
-rw-r--r--spec/features/projects/pipelines/legacy_pipelines_spec.rb847
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb288
-rw-r--r--spec/features/projects/pipelines/pipelines_spec.rb26
-rw-r--r--spec/features/projects/serverless/functions_spec.rb88
-rw-r--r--spec/features/projects/settings/pipelines_settings_spec.rb18
-rw-r--r--spec/features/projects/settings/secure_files_settings_spec.rb46
-rw-r--r--spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb12
-rw-r--r--spec/features/projects/settings/user_manages_project_members_spec.rb2
-rw-r--r--spec/features/projects/show/user_uploads_files_spec.rb12
-rw-r--r--spec/features/projects/snippets/create_snippet_spec.rb9
-rw-r--r--spec/features/projects/tags/user_views_tags_spec.rb30
-rw-r--r--spec/features/projects/tree/tree_show_spec.rb16
-rw-r--r--spec/features/runners_spec.rb202
-rw-r--r--spec/features/security/project/internal_access_spec.rb2
-rw-r--r--spec/features/security/project/private_access_spec.rb4
-rw-r--r--spec/features/security/project/public_access_spec.rb4
-rw-r--r--spec/features/snippets/user_creates_snippet_spec.rb17
-rw-r--r--spec/features/topic_show_spec.rb7
-rw-r--r--spec/features/user_sorts_things_spec.rb15
-rw-r--r--spec/features/users/login_spec.rb2
-rw-r--r--spec/finders/error_tracking/errors_finder_spec.rb53
-rw-r--r--spec/finders/group_members_finder_spec.rb33
-rw-r--r--spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb73
-rw-r--r--spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb59
-rw-r--r--spec/finders/incident_management/timeline_events_finder_spec.rb56
-rw-r--r--spec/finders/issues_finder/params_spec.rb49
-rw-r--r--spec/finders/issues_finder_spec.rb234
-rw-r--r--spec/finders/merge_requests_finder_spec.rb3
-rw-r--r--spec/finders/packages/build_infos_finder_spec.rb120
-rw-r--r--spec/finders/packages/build_infos_for_many_packages_finder_spec.rb136
-rw-r--r--spec/finders/personal_access_tokens_finder_spec.rb18
-rw-r--r--spec/finders/projects/serverless/functions_finder_spec.rb185
-rw-r--r--spec/finders/releases_finder_spec.rb126
-rw-r--r--spec/fixtures/api/schemas/graphql/container_repository.json5
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agent_token.json24
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agent_token_basic.json22
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agent_token_with_token.json26
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/agent_tokens.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/environment.json2
-rw-r--r--spec/fixtures/glfm/example_snapshots/examples_index.yml2020
-rw-r--r--spec/fixtures/glfm/example_snapshots/html.yml6097
-rw-r--r--spec/fixtures/glfm/example_snapshots/markdown.yml2203
-rw-r--r--spec/fixtures/glfm/example_snapshots/prosemirror_json.yml16739
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json17
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/releases.ndjson2
-rw-r--r--spec/fixtures/lib/gitlab/import_export/designs/project.json1
-rw-r--r--spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/project.json1
-rw-r--r--spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/tree/project.json2
-rw-r--r--spec/fixtures/logo_sample.svg40
-rw-r--r--spec/fixtures/markdown/markdown_golden_master_examples.yml18
-rw-r--r--spec/fixtures/security_reports/master/gl-common-scanning-report.json700
-rw-r--r--spec/frontend/.eslintrc.yml5
-rw-r--r--spec/frontend/__helpers__/dom_shims/clipboard.js5
-rw-r--r--spec/frontend/__helpers__/dom_shims/index.js1
-rw-r--r--spec/frontend/__helpers__/fixtures.js15
-rw-r--r--spec/frontend/__helpers__/flush_promises.js4
-rw-r--r--spec/frontend/__helpers__/shared_test_setup.js7
-rw-r--r--spec/frontend/__helpers__/user_mock_data_helper.js2
-rw-r--r--spec/frontend/__helpers__/vuex_action_helper.js35
-rw-r--r--spec/frontend/__helpers__/vuex_action_helper_spec.js61
-rw-r--r--spec/frontend/__helpers__/wait_for_promises.js5
-rw-r--r--spec/frontend/activities_spec.js7
-rw-r--r--spec/frontend/add_context_commits_modal/components/__snapshots__/add_context_commits_modal_spec.js.snap1
-rw-r--r--spec/frontend/admin/applications/components/delete_application_spec.js4
-rw-r--r--spec/frontend/admin/background_migrations/components/database_listbox_spec.js57
-rw-r--r--spec/frontend/admin/background_migrations/mock_data.js6
-rw-r--r--spec/frontend/admin/users/new_spec.js7
-rw-r--r--spec/frontend/alert_handler_spec.js18
-rw-r--r--spec/frontend/analytics/shared/components/metric_popover_spec.js2
-rw-r--r--spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js15
-rw-r--r--spec/frontend/api/tags_api_spec.js37
-rw-r--r--spec/frontend/api/user_api_spec.js50
-rw-r--r--spec/frontend/api_spec.js32
-rw-r--r--spec/frontend/attention_requests/components/navigation_popover_spec.js4
-rw-r--r--spec/frontend/authentication/u2f/authenticate_spec.js7
-rw-r--r--spec/frontend/authentication/u2f/register_spec.js7
-rw-r--r--spec/frontend/authentication/webauthn/authenticate_spec.js7
-rw-r--r--spec/frontend/authentication/webauthn/register_spec.js7
-rw-r--r--spec/frontend/awards_handler_spec.js7
-rw-r--r--spec/frontend/badges/components/badge_form_spec.js4
-rw-r--r--spec/frontend/badges/components/badge_list_row_spec.js4
-rw-r--r--spec/frontend/badges/components/badge_list_spec.js4
-rw-r--r--spec/frontend/badges/components/badge_spec.js7
-rw-r--r--spec/frontend/badges/store/actions_spec.js6
-rw-r--r--spec/frontend/behaviors/autosize_spec.js20
-rw-r--r--spec/frontend/behaviors/copy_as_gfm_spec.js3
-rw-r--r--spec/frontend/behaviors/date_picker_spec.js7
-rw-r--r--spec/frontend/behaviors/load_startup_css_spec.js6
-rw-r--r--spec/frontend/behaviors/markdown/highlight_current_user_spec.js7
-rw-r--r--spec/frontend/behaviors/markdown/render_sandboxed_mermaid_spec.js34
-rw-r--r--spec/frontend/behaviors/quick_submit_spec.js7
-rw-r--r--spec/frontend/behaviors/requires_input_spec.js7
-rw-r--r--spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js57
-rw-r--r--spec/frontend/blob/blob_file_dropzone_spec.js7
-rw-r--r--spec/frontend/blob/components/__snapshots__/blob_header_spec.js.snap2
-rw-r--r--spec/frontend/blob/components/table_contents_spec.js4
-rw-r--r--spec/frontend/blob/file_template_mediator_spec.js7
-rw-r--r--spec/frontend/blob/file_template_selector_spec.js29
-rw-r--r--spec/frontend/blob/line_highlighter_spec.js8
-rw-r--r--spec/frontend/blob/openapi/index_spec.js28
-rw-r--r--spec/frontend/blob/pipeline_tour_success_modal_spec.js2
-rw-r--r--spec/frontend/blob/sketch/index_spec.js50
-rw-r--r--spec/frontend/blob/viewer/index_spec.js5
-rw-r--r--spec/frontend/blob_edit/blob_bundle_spec.js14
-rw-r--r--spec/frontend/blob_edit/edit_blob_spec.js41
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js88
-rw-r--r--spec/frontend/boards/components/board_list_header_spec.js4
-rw-r--r--spec/frontend/boards/mock_data.js5
-rw-r--r--spec/frontend/boards/project_select_spec.js21
-rw-r--r--spec/frontend/boards/stores/getters_spec.js29
-rw-r--r--spec/frontend/bootstrap_jquery_spec.js13
-rw-r--r--spec/frontend/bootstrap_linked_tabs_spec.js7
-rw-r--r--spec/frontend/branches/components/delete_branch_modal_spec.js4
-rw-r--r--spec/frontend/broadcast_notification_spec.js9
-rw-r--r--spec/frontend/ci_secure_files/components/secure_files_list_spec.js56
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js19
-rw-r--r--spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js7
-rw-r--r--spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js22
-rw-r--r--spec/frontend/clusters/agents/components/revoke_token_button_spec.js239
-rw-r--r--spec/frontend/clusters/clusters_bundle_spec.js8
-rw-r--r--spec/frontend/clusters/components/__snapshots__/new_cluster_spec.js.snap2
-rw-r--r--spec/frontend/clusters/components/new_cluster_spec.js10
-rw-r--r--spec/frontend/clusters/forms/components/integration_form_spec.js2
-rw-r--r--spec/frontend/clusters/gke_cluster_namespace/gke_cluster_namespace_spec.js66
-rw-r--r--spec/frontend/clusters/mock_data.js12
-rw-r--r--spec/frontend/clusters_list/components/agent_table_spec.js3
-rw-r--r--spec/frontend/clusters_list/components/clusters_actions_spec.js86
-rw-r--r--spec/frontend/code_navigation/components/app_spec.js6
-rw-r--r--spec/frontend/code_navigation/store/actions_spec.js7
-rw-r--r--spec/frontend/code_navigation/utils/index_spec.js9
-rw-r--r--spec/frontend/commits_spec.js7
-rw-r--r--spec/frontend/commons/nav/user_merge_requests_spec.js7
-rw-r--r--spec/frontend/content_editor/components/__snapshots__/toolbar_button_spec.js.snap4
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/code_block_spec.js156
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/formatting_spec.js81
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/link_spec.js227
-rw-r--r--spec/frontend/content_editor/components/bubble_menus/media_spec.js234
-rw-r--r--spec/frontend/content_editor/components/code_block_bubble_menu_spec.js142
-rw-r--r--spec/frontend/content_editor/components/content_editor_spec.js2
-rw-r--r--spec/frontend/content_editor/components/formatting_bubble_menu_spec.js80
-rw-r--r--spec/frontend/content_editor/components/toolbar_button_spec.js2
-rw-r--r--spec/frontend/content_editor/components/wrappers/code_block_spec.js71
-rw-r--r--spec/frontend/content_editor/components/wrappers/frontmatter_spec.js48
-rw-r--r--spec/frontend/content_editor/components/wrappers/media_spec.js69
-rw-r--r--spec/frontend/content_editor/extensions/attachment_spec.js32
-rw-r--r--spec/frontend/content_editor/extensions/code_block_highlight_spec.js13
-rw-r--r--spec/frontend/content_editor/extensions/diagram_spec.js16
-rw-r--r--spec/frontend/content_editor/extensions/frontmatter_spec.js12
-rw-r--r--spec/frontend/content_editor/extensions/paste_markdown_spec.js51
-rw-r--r--spec/frontend/content_editor/remark_markdown_processing_spec.js248
-rw-r--r--spec/frontend/content_editor/services/asset_resolver_spec.js23
-rw-r--r--spec/frontend/content_editor/services/code_block_language_loader_spec.js36
-rw-r--r--spec/frontend/content_editor/services/content_editor_spec.js15
-rw-r--r--spec/frontend/content_editor/services/create_content_editor_spec.js48
-rw-r--r--spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js60
-rw-r--r--spec/frontend/content_editor/services/markdown_deserializer_spec.js62
-rw-r--r--spec/frontend/content_editor/services/markdown_serializer_spec.js44
-rw-r--r--spec/frontend/content_editor/services/markdown_sourcemap_spec.js2
-rw-r--r--spec/frontend/content_editor/test_constants.js25
-rw-r--r--spec/frontend/content_editor/test_utils.js2
-rw-r--r--spec/frontend/create_cluster/components/cluster_form_dropdown_spec.js214
-rw-r--r--spec/frontend/create_cluster/eks_cluster/components/create_eks_cluster_spec.js98
-rw-r--r--spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js562
-rw-r--r--spec/frontend/create_cluster/eks_cluster/components/service_credentials_form_spec.js124
-rw-r--r--spec/frontend/create_cluster/eks_cluster/services/aws_services_facade_spec.js178
-rw-r--r--spec/frontend/create_cluster/eks_cluster/store/actions_spec.js366
-rw-r--r--spec/frontend/create_cluster/eks_cluster/store/getters_spec.js13
-rw-r--r--spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js161
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js129
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js137
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js137
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js51
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js111
-rw-r--r--spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js103
-rw-r--r--spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js47
-rw-r--r--spec/frontend/create_cluster/gke_cluster/helpers.js64
-rw-r--r--spec/frontend/create_cluster/gke_cluster/mock_data.js75
-rw-r--r--spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js141
-rw-r--r--spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js103
-rw-r--r--spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js32
-rw-r--r--spec/frontend/create_cluster/gke_cluster_namespace/gke_cluster_namespace_spec.js61
-rw-r--r--spec/frontend/create_cluster/init_create_cluster_spec.js77
-rw-r--r--spec/frontend/create_cluster/store/cluster_dropdown/actions_spec.js95
-rw-r--r--spec/frontend/create_cluster/store/cluster_dropdown/mutations_spec.js36
-rw-r--r--spec/frontend/create_item_dropdown_spec.js4
-rw-r--r--spec/frontend/crm/contact_form_wrapper_spec.js112
-rw-r--r--spec/frontend/crm/contacts_root_spec.js2
-rw-r--r--spec/frontend/crm/form_spec.js57
-rw-r--r--spec/frontend/crm/organizations_root_spec.js4
-rw-r--r--spec/frontend/cycle_analytics/base_spec.js3
-rw-r--r--spec/frontend/cycle_analytics/mock_data.js4
-rw-r--r--spec/frontend/cycle_analytics/stage_table_spec.js2
-rw-r--r--spec/frontend/cycle_analytics/value_stream_filters_spec.js54
-rw-r--r--spec/frontend/cycle_analytics/value_stream_metrics_spec.js46
-rw-r--r--spec/frontend/deprecated_jquery_dropdown_spec.js5
-rw-r--r--spec/frontend/design_management/components/design_notes/design_reply_form_spec.js4
-rw-r--r--spec/frontend/design_management/components/design_sidebar_spec.js2
-rw-r--r--spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap1
-rw-r--r--spec/frontend/design_management/pages/design/__snapshots__/index_spec.js.snap1
-rw-r--r--spec/frontend/diffs/components/diff_expansion_cell_spec.js21
-rw-r--r--spec/frontend/diffs/store/actions_spec.js2
-rw-r--r--spec/frontend/diffs/store/mutations_spec.js9
-rw-r--r--spec/frontend/diffs/store/utils_spec.js24
-rw-r--r--spec/frontend/diffs/utils/diff_file_spec.js71
-rw-r--r--spec/frontend/diffs/utils/queue_events_spec.js37
-rw-r--r--spec/frontend/dropzone_input_spec.js5
-rw-r--r--spec/frontend/editor/components/helpers.js18
-rw-r--r--spec/frontend/editor/components/source_editor_toolbar_button_spec.js116
-rw-r--r--spec/frontend/editor/components/source_editor_toolbar_graphql_spec.js112
-rw-r--r--spec/frontend/editor/extensions/source_editor_toolbar_ext_spec.js156
-rw-r--r--spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json10
-rw-r--r--spec/frontend/editor/source_editor_ci_schema_ext_spec.js5
-rw-r--r--spec/frontend/editor/source_editor_extension_base_spec.js6
-rw-r--r--spec/frontend/editor/source_editor_markdown_ext_spec.js5
-rw-r--r--spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js115
-rw-r--r--spec/frontend/editor/source_editor_spec.js8
-rw-r--r--spec/frontend/editor/source_editor_yaml_ext_spec.js9
-rw-r--r--spec/frontend/editor/utils_spec.js13
-rw-r--r--spec/frontend/emoji/components/utils_spec.js4
-rw-r--r--spec/frontend/environments/environment_folder_spec.js19
-rw-r--r--spec/frontend/filterable_list_spec.js6
-rw-r--r--spec/frontend/filtered_search/dropdown_user_spec.js7
-rw-r--r--spec/frontend/filtered_search/dropdown_utils_spec.js11
-rw-r--r--spec/frontend/filtered_search/filtered_search_dropdown_manager_spec.js7
-rw-r--r--spec/frontend/filtered_search/filtered_search_manager_spec.js8
-rw-r--r--spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js9
-rw-r--r--spec/frontend/filtered_search/visual_token_value_spec.js7
-rw-r--r--spec/frontend/fixtures/api_merge_requests.rb6
-rw-r--r--spec/frontend/fixtures/runner.rb22
-rw-r--r--spec/frontend/flash_spec.js6
-rw-r--r--spec/frontend/frequent_items/components/app_spec.js12
-rw-r--r--spec/frontend/frequent_items/utils_spec.js14
-rw-r--r--spec/frontend/gfm_auto_complete_spec.js4
-rw-r--r--spec/frontend/gl_field_errors_spec.js7
-rw-r--r--spec/frontend/google_tag_manager/index_spec.js10
-rw-r--r--spec/frontend/gpg_badges_spec.js10
-rw-r--r--spec/frontend/group_settings/components/shared_runners_form_spec.js167
-rw-r--r--spec/frontend/groups/landing_spec.js2
-rw-r--r--spec/frontend/header_spec.js10
-rw-r--r--spec/frontend/helpers/startup_css_helper_spec.js9
-rw-r--r--spec/frontend/ide/components/commit_sidebar/message_field_spec.js5
-rw-r--r--spec/frontend/ide/components/new_dropdown/upload_spec.js4
-rw-r--r--spec/frontend/image_diff/image_diff_spec.js7
-rw-r--r--spec/frontend/image_diff/init_discussion_tab_spec.js7
-rw-r--r--spec/frontend/image_diff/replaced_image_diff_spec.js7
-rw-r--r--spec/frontend/import_entities/import_groups/components/import_table_spec.js31
-rw-r--r--spec/frontend/import_entities/import_groups/utils_spec.js56
-rw-r--r--spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js4
-rw-r--r--spec/frontend/incidents_settings/components/__snapshots__/pagerduty_form_spec.js.snap1
-rw-r--r--spec/frontend/integrations/edit/components/integration_form_spec.js24
-rw-r--r--spec/frontend/integrations/edit/components/jira_issues_fields_spec.js49
-rw-r--r--spec/frontend/integrations/edit/mock_data.js8
-rw-r--r--spec/frontend/invite_members/components/invite_members_modal_spec.js80
-rw-r--r--spec/frontend/invite_members/components/invite_modal_base_spec.js120
-rw-r--r--spec/frontend/invite_members/components/user_limit_notification_spec.js59
-rw-r--r--spec/frontend/invite_members/mock_data/member_modal.js2
-rw-r--r--spec/frontend/invite_members/mock_data/modal_base.js3
-rw-r--r--spec/frontend/issuable/components/issuable_header_warnings_spec.js10
-rw-r--r--spec/frontend/issuable/components/status_box_spec.js76
-rw-r--r--spec/frontend/issuable/issuable_form_spec.js10
-rw-r--r--spec/frontend/issuable/related_issues/components/related_issues_root_spec.js27
-rw-r--r--spec/frontend/issues/issue_spec.js13
-rw-r--r--spec/frontend/issues/list/components/issues_list_app_spec.js175
-rw-r--r--spec/frontend/issues/list/mock_data.js14
-rw-r--r--spec/frontend/issues/list/utils_spec.js29
-rw-r--r--spec/frontend/issues/show/components/app_spec.js53
-rw-r--r--spec/frontend/issues/show/components/description_spec.js91
-rw-r--r--spec/frontend/issues/show/components/fields/description_spec.js1
-rw-r--r--spec/frontend/issues/show/components/title_spec.js7
-rw-r--r--spec/frontend/issues/show/mock_data/mock_data.js17
-rw-r--r--spec/frontend/issues/show/utils_spec.js40
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js116
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/app_spec.js67
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js35
-rw-r--r--spec/frontend/jira_connect/subscriptions/components/subscriptions_list_spec.js7
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com_spec.js121
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index_spec.js83
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form_spec.js69
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_page_spec.js82
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js121
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/subscriptions_page_spec.js71
-rw-r--r--spec/frontend/jira_connect/subscriptions/pages/subscriptions_spec.js56
-rw-r--r--spec/frontend/jira_connect/subscriptions/store/actions_spec.js172
-rw-r--r--spec/frontend/jira_connect/subscriptions/store/mutations_spec.js67
-rw-r--r--spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js1
-rw-r--r--spec/frontend/jobs/components/job_app_spec.js4
-rw-r--r--spec/frontend/jobs/components/stuck_block_spec.js6
-rw-r--r--spec/frontend/jobs/components/table/cells/actions_cell_spec.js105
-rw-r--r--spec/frontend/jobs/mock_data.js72
-rw-r--r--spec/frontend/jobs/store/getters_spec.js20
-rw-r--r--spec/frontend/lib/dompurify_spec.js10
-rw-r--r--spec/frontend/lib/gfm/index_spec.js6
-rw-r--r--spec/frontend/lib/utils/common_utils_spec.js69
-rw-r--r--spec/frontend/lib/utils/datetime_utility_spec.js4
-rw-r--r--spec/frontend/lib/utils/dom_utils_spec.js29
-rw-r--r--spec/frontend/lib/utils/file_upload_spec.js7
-rw-r--r--spec/frontend/lib/utils/mock_data.js42
-rw-r--r--spec/frontend/lib/utils/navigation_utility_spec.js5
-rw-r--r--spec/frontend/lib/utils/resize_observer_spec.js4
-rw-r--r--spec/frontend/lib/utils/text_markdown_spec.js33
-rw-r--r--spec/frontend/lib/utils/url_utility_spec.js53
-rw-r--r--spec/frontend/lib/utils/users_cache_spec.js25
-rw-r--r--spec/frontend/listbox/index_spec.js6
-rw-r--r--spec/frontend/logs/components/tokens/token_with_loading_state_spec.js5
-rw-r--r--spec/frontend/members/components/table/role_dropdown_spec.js27
-rw-r--r--spec/frontend/merge_conflicts/store/actions_spec.js4
-rw-r--r--spec/frontend/merge_request_spec.js6
-rw-r--r--spec/frontend/merge_request_tabs_spec.js7
-rw-r--r--spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap1
-rw-r--r--spec/frontend/monitoring/components/dashboard_panel_spec.js26
-rw-r--r--spec/frontend/new_branch_spec.js7
-rw-r--r--spec/frontend/notes/components/comment_form_spec.js34
-rw-r--r--spec/frontend/notes/components/comment_type_dropdown_spec.js32
-rw-r--r--spec/frontend/notes/components/discussion_counter_spec.js42
-rw-r--r--spec/frontend/notes/components/note_body_spec.js90
-rw-r--r--spec/frontend/notes/components/note_form_spec.js21
-rw-r--r--spec/frontend/notes/components/note_header_spec.js4
-rw-r--r--spec/frontend/notes/components/notes_app_spec.js32
-rw-r--r--spec/frontend/notes/deprecated_notes_spec.js11
-rw-r--r--spec/frontend/notes/mixins/discussion_navigation_spec.js1
-rw-r--r--spec/frontend/notes/mock_data.js14
-rw-r--r--spec/frontend/notes/stores/actions_spec.js8
-rw-r--r--spec/frontend/notes/stores/getters_spec.js86
-rw-r--r--spec/frontend/oauth_remember_me_spec.js7
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/details_page/details_header_spec.js27
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status_spec.js38
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js5
-rw-r--r--spec/frontend/packages_and_registries/container_registry/explorer/utils_spec.js21
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/app_spec.js83
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/components/manifest_row_spec.js66
-rw-r--r--spec/frontend/packages_and_registries/dependency_proxy/mock_data.js14
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/package_title_spec.js.snap12
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/details/package_title_spec.js9
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap39
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js29
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js41
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/packages_title_spec.js2
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/tokens/package_type_token_spec.js5
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js23
-rw-r--r--spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js12
-rw-r--r--spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js19
-rw-r--r--spec/frontend/pager_spec.js31
-rw-r--r--spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js8
-rw-r--r--spec/frontend/pages/admin/application_settings/account_and_limits_spec.js7
-rw-r--r--spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js7
-rw-r--r--spec/frontend/pages/admin/projects/components/namespace_select_spec.js7
-rw-r--r--spec/frontend/pages/dashboard/todos/index/todos_spec.js7
-rw-r--r--spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js17
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/__snapshots__/learn_gitlab_spec.js.snap9
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_section_link_spec.js47
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_spec.js2
-rw-r--r--spec/frontend/pages/projects/learn_gitlab/components/mock_data.js9
-rw-r--r--spec/frontend/pages/projects/merge_requests/edit/check_form_state_spec.js5
-rw-r--r--spec/frontend/pages/projects/pages_domains/form_spec.js7
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js2
-rw-r--r--spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js9
-rw-r--r--spec/frontend/pages/search/show/refresh_counts_spec.js7
-rw-r--r--spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js7
-rw-r--r--spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js7
-rw-r--r--spec/frontend/pdf/index_spec.js18
-rw-r--r--spec/frontend/performance_bar/index_spec.js4
-rw-r--r--spec/frontend/pipeline_editor/components/commit/commit_form_spec.js4
-rw-r--r--spec/frontend/pipeline_editor/components/file-nav/pipeline_editor_file_nav_spec.js133
-rw-r--r--spec/frontend/pipeline_editor/components/file-tree/container_spec.js138
-rw-r--r--spec/frontend/pipeline_editor/components/file-tree/file_item_spec.js52
-rw-r--r--spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js2
-rw-r--r--spec/frontend/pipeline_editor/components/popovers/file_tree_popover_spec.js56
-rw-r--r--spec/frontend/pipeline_editor/components/popovers/walkthrough_popover_spec.js29
-rw-r--r--spec/frontend/pipeline_editor/components/walkthrough_popover_spec.js29
-rw-r--r--spec/frontend/pipeline_editor/mock_data.js35
-rw-r--r--spec/frontend/pipeline_editor/pipeline_editor_home_spec.js97
-rw-r--r--spec/frontend/pipeline_wizard/components/commit_spec.js18
-rw-r--r--spec/frontend/pipelines/__snapshots__/utils_spec.js.snap11
-rw-r--r--spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js87
-rw-r--r--spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js117
-rw-r--r--spec/frontend/pipelines/components/jobs/utils_spec.js14
-rw-r--r--spec/frontend/pipelines/components/pipeline_tabs_spec.js9
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js112
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js138
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js161
-rw-r--r--spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js6
-rw-r--r--spec/frontend/pipelines/empty_state/ci_templates_spec.js85
-rw-r--r--spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js158
-rw-r--r--spec/frontend/pipelines/empty_state_spec.js60
-rw-r--r--spec/frontend/pipelines/graph/graph_component_wrapper_spec.js27
-rw-r--r--spec/frontend/pipelines/graph/job_item_spec.js184
-rw-r--r--spec/frontend/pipelines/graph/linked_pipeline_spec.js336
-rw-r--r--spec/frontend/pipelines/graph/linked_pipelines_column_spec.js1
-rw-r--r--spec/frontend/pipelines/graph/linked_pipelines_mock_data.js5
-rw-r--r--spec/frontend/pipelines/graph/mock_data.js122
-rw-r--r--spec/frontend/pipelines/graph_shared/links_inner_spec.js15
-rw-r--r--spec/frontend/pipelines/header_component_spec.js51
-rw-r--r--spec/frontend/pipelines/mock_data.js215
-rw-r--r--spec/frontend/pipelines/pipeline_graph/utils_spec.js20
-rw-r--r--spec/frontend/pipelines/pipelines_spec.js2
-rw-r--r--spec/frontend/pipelines/test_reports/stores/actions_spec.js7
-rw-r--r--spec/frontend/pipelines/test_reports/stores/mutations_spec.js21
-rw-r--r--spec/frontend/pipelines/test_reports/test_suite_table_spec.js57
-rw-r--r--spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js1
-rw-r--r--spec/frontend/pipelines/tokens/pipeline_source_token_spec.js1
-rw-r--r--spec/frontend/pipelines/tokens/pipeline_status_token_spec.js1
-rw-r--r--spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js1
-rw-r--r--spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js1
-rw-r--r--spec/frontend/project_select_combo_button_spec.js31
-rw-r--r--spec/frontend/projects/commits/components/author_select_spec.js4
-rw-r--r--spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap2
-rw-r--r--spec/frontend/projects/components/shared/__snapshots__/delete_button_spec.js.snap1
-rw-r--r--spec/frontend/projects/new/components/deployment_target_select_spec.js4
-rw-r--r--spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js4
-rw-r--r--spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js6
-rw-r--r--spec/frontend/projects/project_import_gitlab_project_spec.js4
-rw-r--r--spec/frontend/projects/project_new_spec.js7
-rw-r--r--spec/frontend/projects/projects_filterable_list_spec.js6
-rw-r--r--spec/frontend/projects/settings/access_dropdown_spec.js7
-rw-r--r--spec/frontend/projects/settings/topics/components/topics_token_selector_spec.js15
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js6
-rw-r--r--spec/frontend/prometheus_alerts/components/reset_key_spec.js99
-rw-r--r--spec/frontend/prometheus_metrics/custom_metrics_spec.js4
-rw-r--r--spec/frontend/prometheus_metrics/prometheus_metrics_spec.js7
-rw-r--r--spec/frontend/protected_branches/protected_branch_create_spec.js7
-rw-r--r--spec/frontend/protected_branches/protected_branch_edit_spec.js10
-rw-r--r--spec/frontend/read_more_spec.js7
-rw-r--r--spec/frontend/releases/components/app_edit_new_spec.js12
-rw-r--r--spec/frontend/releases/components/tag_field_new_spec.js28
-rw-r--r--spec/frontend/releases/stores/modules/detail/actions_spec.js46
-rw-r--r--spec/frontend/releases/stores/modules/detail/getters_spec.js32
-rw-r--r--spec/frontend/releases/stores/modules/detail/mutations_spec.js37
-rw-r--r--spec/frontend/reports/codequality_report/store/getters_spec.js4
-rw-r--r--spec/frontend/reports/components/report_link_spec.js81
-rw-r--r--spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap14
-rw-r--r--spec/frontend/repository/components/blob_content_viewer_spec.js9
-rw-r--r--spec/frontend/repository/components/breadcrumbs_spec.js3
-rw-r--r--spec/frontend/right_sidebar_spec.js6
-rw-r--r--spec/frontend/runner/admin_runner_edit/admin_runner_edit_app_spec.js35
-rw-r--r--spec/frontend/runner/admin_runner_show/admin_runner_show_app_spec.js52
-rw-r--r--spec/frontend/runner/admin_runners/admin_runners_app_spec.js82
-rw-r--r--spec/frontend/runner/components/registration/registration_dropdown_spec.js89
-rw-r--r--spec/frontend/runner/components/runner_delete_button_spec.js6
-rw-r--r--spec/frontend/runner/components/runner_details_spec.js3
-rw-r--r--spec/frontend/runner/components/runner_jobs_spec.js2
-rw-r--r--spec/frontend/runner/components/runner_projects_spec.js2
-rw-r--r--spec/frontend/runner/components/runner_update_form_spec.js61
-rw-r--r--spec/frontend/runner/group_runners/group_runners_app_spec.js82
-rw-r--r--spec/frontend/runner/local_storage_alert/save_alert_to_local_storage_spec.js24
-rw-r--r--spec/frontend/runner/local_storage_alert/show_alert_from_local_storage_spec.js40
-rw-r--r--spec/frontend/runner/mock_data.js24
-rw-r--r--spec/frontend/runner/runner_search_utils_spec.js12
-rw-r--r--spec/frontend/search/highlight_blob_search_result_spec.js7
-rw-r--r--spec/frontend/search_autocomplete_spec.js5
-rw-r--r--spec/frontend/security_configuration/components/app_spec.js75
-rw-r--r--spec/frontend/security_configuration/components/section_layout_spec.js49
-rw-r--r--spec/frontend/security_configuration/mock_data.js9
-rw-r--r--spec/frontend/self_monitor/components/__snapshots__/self_monitor_form_spec.js.snap1
-rw-r--r--spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap22
-rw-r--r--spec/frontend/serverless/components/area_spec.js121
-rw-r--r--spec/frontend/serverless/components/empty_state_spec.js25
-rw-r--r--spec/frontend/serverless/components/environment_row_spec.js68
-rw-r--r--spec/frontend/serverless/components/function_details_spec.js100
-rw-r--r--spec/frontend/serverless/components/function_row_spec.js34
-rw-r--r--spec/frontend/serverless/components/functions_spec.js86
-rw-r--r--spec/frontend/serverless/components/missing_prometheus_spec.js38
-rw-r--r--spec/frontend/serverless/components/pod_box_spec.js22
-rw-r--r--spec/frontend/serverless/components/url_spec.js26
-rw-r--r--spec/frontend/serverless/mock_data.js145
-rw-r--r--spec/frontend/serverless/store/actions_spec.js80
-rw-r--r--spec/frontend/serverless/store/getters_spec.js43
-rw-r--r--spec/frontend/serverless/store/mutations_spec.js86
-rw-r--r--spec/frontend/serverless/utils.js17
-rw-r--r--spec/frontend/settings_panels_spec.js7
-rw-r--r--spec/frontend/shortcuts_spec.js7
-rw-r--r--spec/frontend/sidebar/components/assignees/uncollapsed_assignee_list_spec.js2
-rw-r--r--spec/frontend/sidebar/components/attention_requested_toggle_spec.js7
-rw-r--r--spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js18
-rw-r--r--spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js2
-rw-r--r--spec/frontend/sidebar/components/crm_contacts_spec.js11
-rw-r--r--spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js7
-rw-r--r--spec/frontend/sidebar/components/time_tracking/mock_data.js6
-rw-r--r--spec/frontend/sidebar/lock/issuable_lock_form_spec.js3
-rw-r--r--spec/frontend/sidebar/reviewers_spec.js1
-rw-r--r--spec/frontend/sidebar/sidebar_mediator_spec.js62
-rw-r--r--spec/frontend/single_file_diff_spec.js3
-rw-r--r--spec/frontend/smart_interval_spec.js7
-rw-r--r--spec/frontend/snippet/collapsible_input_spec.js6
-rw-r--r--spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap3
-rw-r--r--spec/frontend/snippets/components/edit_spec.js209
-rw-r--r--spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js36
-rw-r--r--spec/frontend/syntax_highlight_spec.js16
-rw-r--r--spec/frontend/tabs/index_spec.js8
-rw-r--r--spec/frontend/task_list_spec.js7
-rw-r--r--spec/frontend/tracking/tracking_spec.js12
-rw-r--r--spec/frontend/user_lists/components/user_lists_table_spec.js3
-rw-r--r--spec/frontend/user_popovers_spec.js45
-rw-r--r--spec/frontend/vue_alerts_spec.js6
-rw-r--r--spec/frontend/vue_mr_widget/components/added_commit_message_spec.js31
-rw-r--r--spec/frontend/vue_mr_widget/components/extensions/utils_spec.js22
-rw-r--r--spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js144
-rw-r--r--spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js4
-rw-r--r--spec/frontend/vue_mr_widget/extensions/test_report/index_spec.js48
-rw-r--r--spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/color_picker/color_picker_spec.js41
-rw-r--r--spec/frontend/vue_shared/components/confidentiality_badge_spec.js52
-rw-r--r--spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js15
-rw-r--r--spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/deployment_instance/deployment_instance_spec.js25
-rw-r--r--spec/frontend/vue_shared/components/dropdown/dropdown_hidden_input_spec.js36
-rw-r--r--spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js51
-rw-r--r--spec/frontend/vue_shared/components/file_finder/index_spec.js27
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js51
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/base_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js1
-rw-r--r--spec/frontend/vue_shared/components/gitlab_version_check_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/markdown/field_spec.js31
-rw-r--r--spec/frontend/vue_shared/components/markdown/header_spec.js22
-rw-r--r--spec/frontend/vue_shared/components/markdown/toolbar_spec.js14
-rw-r--r--spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap2
-rw-r--r--spec/frontend/vue_shared/components/registry/list_item_spec.js14
-rw-r--r--spec/frontend/vue_shared/components/runner_aws_deployments/__snapshots__/runner_aws_deployments_modal_spec.js.snap1
-rw-r--r--spec/frontend/vue_shared/components/runner_instructions/runner_instructions_modal_spec.js34
-rw-r--r--spec/frontend/vue_shared/components/segmented_control_button_group_spec.js104
-rw-r--r--spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/usage_quotas/usage_banner_spec.js62
-rw-r--r--spec/frontend/vue_shared/components/user_popover/user_popover_spec.js140
-rw-r--r--spec/frontend/vue_shared/directives/autofocusonshow_spec.js7
-rw-r--r--spec/frontend/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar_spec.js4
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js1
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js77
-rw-r--r--spec/frontend/vue_shared/issuable/show/components/issuable_show_root_spec.js7
-rw-r--r--spec/frontend/vue_shared/issuable/show/mock_data.js5
-rw-r--r--spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js6
-rw-r--r--spec/frontend/vue_shared/security_configuration/components/section_layout_spec.js58
-rw-r--r--spec/frontend/vue_shared/security_reports/mock_data.js6
-rw-r--r--spec/frontend/whats_new/components/feature_spec.js25
-rw-r--r--spec/frontend/whats_new/utils/notification_spec.js4
-rw-r--r--spec/frontend/wikis_spec.js6
-rw-r--r--spec/frontend/work_items/components/item_state_spec.js54
-rw-r--r--spec/frontend/work_items/components/work_item_actions_spec.js55
-rw-r--r--spec/frontend/work_items/components/work_item_detail_modal_spec.js100
-rw-r--r--spec/frontend/work_items/components/work_item_state_spec.js117
-rw-r--r--spec/frontend/work_items/components/work_item_title_spec.js42
-rw-r--r--spec/frontend/work_items/mock_data.js23
-rw-r--r--spec/frontend/work_items/pages/create_work_item_spec.js7
-rw-r--r--spec/frontend/work_items/pages/work_item_detail_spec.js32
-rw-r--r--spec/frontend/work_items/pages/work_item_root_spec.js60
-rw-r--r--spec/frontend/work_items/router_spec.js1
-rw-r--r--spec/frontend/zen_mode_spec.js7
-rw-r--r--spec/frontend_integration/fly_out_nav_browser_spec.js21
-rw-r--r--spec/frontend_integration/ide/helpers/ide_helper.js12
-rw-r--r--spec/frontend_integration/ide/ide_integration_spec.js4
-rw-r--r--spec/frontend_integration/ide/user_opens_file_spec.js4
-rw-r--r--spec/frontend_integration/ide/user_opens_ide_spec.js4
-rw-r--r--spec/frontend_integration/ide/user_opens_mr_spec.js4
-rw-r--r--spec/frontend_integration/lib/utils/browser_spec.js9
-rw-r--r--spec/graphql/mutations/base_mutation_spec.rb2
-rw-r--r--spec/graphql/mutations/boards/update_spec.rb8
-rw-r--r--spec/graphql/mutations/ci/runner/delete_spec.rb8
-rw-r--r--spec/graphql/mutations/ci/runner/update_spec.rb8
-rw-r--r--spec/graphql/mutations/clusters/agent_tokens/create_spec.rb8
-rw-r--r--spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb52
-rw-r--r--spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb10
-rw-r--r--spec/graphql/mutations/clusters/agents/delete_spec.rb9
-rw-r--r--spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb2
-rw-r--r--spec/graphql/mutations/container_expiration_policies/update_spec.rb6
-rw-r--r--spec/graphql/mutations/container_repositories/destroy_spec.rb8
-rw-r--r--spec/graphql/mutations/container_repositories/destroy_tags_spec.rb8
-rw-r--r--spec/graphql/mutations/customer_relations/contacts/create_spec.rb6
-rw-r--r--spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb2
-rw-r--r--spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb4
-rw-r--r--spec/graphql/mutations/discussions/toggle_resolve_spec.rb17
-rw-r--r--spec/graphql/mutations/environments/canary_ingress/update_spec.rb10
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/create_spec.rb51
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb66
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb85
-rw-r--r--spec/graphql/mutations/incident_management/timeline_event/update_spec.rb100
-rw-r--r--spec/graphql/mutations/issues/set_due_date_spec.rb2
-rw-r--r--spec/graphql/mutations/merge_requests/accept_spec.rb3
-rw-r--r--spec/graphql/mutations/merge_requests/create_spec.rb4
-rw-r--r--spec/graphql/mutations/namespace/package_settings/update_spec.rb6
-rw-r--r--spec/graphql/mutations/release_asset_links/delete_spec.rb12
-rw-r--r--spec/graphql/mutations/release_asset_links/update_spec.rb12
-rw-r--r--spec/graphql/mutations/timelogs/delete_spec.rb93
-rw-r--r--spec/graphql/mutations/todos/create_spec.rb15
-rw-r--r--spec/graphql/mutations/todos/mark_done_spec.rb9
-rw-r--r--spec/graphql/mutations/todos/restore_many_spec.rb7
-rw-r--r--spec/graphql/mutations/todos/restore_spec.rb9
-rw-r--r--spec/graphql/resolvers/alert_management/alert_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/ci/config_resolver_spec.rb7
-rw-r--r--spec/graphql/resolvers/concerns/resolves_ids_spec.rb19
-rw-r--r--spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/design_management/design_resolver_spec.rb13
-rw-r--r--spec/graphql/resolvers/design_management/designs_resolver_spec.rb4
-rw-r--r--spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb9
-rw-r--r--spec/graphql/resolvers/design_management/versions_resolver_spec.rb11
-rw-r--r--spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb50
-rw-r--r--spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb17
-rw-r--r--spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb31
-rw-r--r--spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb70
-rw-r--r--spec/graphql/resolvers/issues_resolver_spec.rb34
-rw-r--r--spec/graphql/resolvers/package_pipelines_resolver_spec.rb147
-rw-r--r--spec/graphql/resolvers/projects/snippets_resolver_spec.rb6
-rw-r--r--spec/graphql/resolvers/snippets_resolver_spec.rb22
-rw-r--r--spec/graphql/resolvers/timelog_resolver_spec.rb2
-rw-r--r--spec/graphql/resolvers/users/snippets_resolver_spec.rb10
-rw-r--r--spec/graphql/resolvers/work_item_resolver_spec.rb2
-rw-r--r--spec/graphql/subscriptions/issuable_updated_spec.rb8
-rw-r--r--spec/graphql/types/alert_management/domain_filter_enum_spec.rb2
-rw-r--r--spec/graphql/types/ci/config/config_type_spec.rb1
-rw-r--r--spec/graphql/types/ci/config/include_type_enum_spec.rb11
-rw-r--r--spec/graphql/types/ci/config/include_type_spec.rb21
-rw-r--r--spec/graphql/types/ci/runner_type_spec.rb4
-rw-r--r--spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb13
-rw-r--r--spec/graphql/types/color_type_spec.rb38
-rw-r--r--spec/graphql/types/container_expiration_policy_type_spec.rb2
-rw-r--r--spec/graphql/types/container_repository_details_type_spec.rb2
-rw-r--r--spec/graphql/types/container_repository_type_spec.rb2
-rw-r--r--spec/graphql/types/current_user_todos_type_spec.rb207
-rw-r--r--spec/graphql/types/customer_relations/contact_type_spec.rb15
-rw-r--r--spec/graphql/types/customer_relations/organization_type_spec.rb2
-rw-r--r--spec/graphql/types/dependency_proxy/group_setting_type_spec.rb6
-rw-r--r--spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb2
-rw-r--r--spec/graphql/types/duration_type_spec.rb5
-rw-r--r--spec/graphql/types/global_id_type_spec.rb125
-rw-r--r--spec/graphql/types/incident_management/timeline_event_type_spec.rb28
-rw-r--r--spec/graphql/types/merge_request_type_spec.rb2
-rw-r--r--spec/graphql/types/mutation_type_spec.rb8
-rw-r--r--spec/graphql/types/namespace/package_settings_type_spec.rb2
-rw-r--r--spec/graphql/types/packages/package_base_type_spec.rb21
-rw-r--r--spec/graphql/types/packages/package_details_type_spec.rb13
-rw-r--r--spec/graphql/types/packages/package_type_spec.rb8
-rw-r--r--spec/graphql/types/permission_types/work_item_spec.rb15
-rw-r--r--spec/graphql/types/project_statistics_type_spec.rb3
-rw-r--r--spec/graphql/types/project_type_spec.rb1
-rw-r--r--spec/graphql/types/projects/topic_type_spec.rb1
-rw-r--r--spec/graphql/types/range_input_type_spec.rb4
-rw-r--r--spec/graphql/types/root_storage_statistics_type_spec.rb3
-rw-r--r--spec/graphql/types/terraform/state_version_type_spec.rb4
-rw-r--r--spec/graphql/types/timeframe_type_spec.rb4
-rw-r--r--spec/graphql/types/timelog_type_spec.rb3
-rw-r--r--spec/graphql/types/user_merge_request_interaction_type_spec.rb1
-rw-r--r--spec/graphql/types/work_item_type_spec.rb4
-rw-r--r--spec/haml_lint/linter/documentation_links_spec.rb5
-rw-r--r--spec/haml_lint/linter/inline_javascript_spec.rb31
-rw-r--r--spec/haml_lint/linter/no_plain_nodes_spec.rb5
-rw-r--r--spec/helpers/appearances_helper_spec.rb44
-rw-r--r--spec/helpers/application_settings_helper_spec.rb2
-rw-r--r--spec/helpers/auth_helper_spec.rb10
-rw-r--r--spec/helpers/badges_helper_spec.rb6
-rw-r--r--spec/helpers/ci/builds_helper_spec.rb14
-rw-r--r--spec/helpers/ci/pipeline_editor_helper_spec.rb2
-rw-r--r--spec/helpers/ci/pipelines_helper_spec.rb52
-rw-r--r--spec/helpers/ci/runners_helper_spec.rb14
-rw-r--r--spec/helpers/ci/secure_files_helper_spec.rb76
-rw-r--r--spec/helpers/clusters_helper_spec.rb16
-rw-r--r--spec/helpers/container_registry_helper_spec.rb14
-rw-r--r--spec/helpers/cookies_helper_spec.rb6
-rw-r--r--spec/helpers/emails_helper_spec.rb4
-rw-r--r--spec/helpers/instance_configuration_helper_spec.rb10
-rw-r--r--spec/helpers/integrations_helper_spec.rb1
-rw-r--r--spec/helpers/invite_members_helper_spec.rb46
-rw-r--r--spec/helpers/issuables_helper_spec.rb36
-rw-r--r--spec/helpers/issues_helper_spec.rb1
-rw-r--r--spec/helpers/jira_connect_helper_spec.rb1
-rw-r--r--spec/helpers/lazy_image_tag_helper_spec.rb109
-rw-r--r--spec/helpers/merge_requests_helper_spec.rb31
-rw-r--r--spec/helpers/namespaces_helper_spec.rb5
-rw-r--r--spec/helpers/page_layout_helper_spec.rb6
-rw-r--r--spec/helpers/profiles_helper_spec.rb9
-rw-r--r--spec/helpers/projects/pipeline_helper_spec.rb1
-rw-r--r--spec/helpers/projects_helper_spec.rb4
-rw-r--r--spec/helpers/releases_helper_spec.rb10
-rw-r--r--spec/helpers/search_helper_spec.rb3
-rw-r--r--spec/helpers/sidebars_helper_spec.rb2
-rw-r--r--spec/helpers/storage_helper_spec.rb28
-rw-r--r--spec/helpers/tracking_helper_spec.rb31
-rw-r--r--spec/helpers/users_helper_spec.rb2
-rw-r--r--spec/initializers/00_connection_logger_spec.rb39
-rw-r--r--spec/initializers/validate_database_config_spec.rb40
-rw-r--r--spec/lib/api/ci/helpers/runner_helpers_spec.rb12
-rw-r--r--spec/lib/api/entities/ci/job_request/dependency_spec.rb7
-rw-r--r--spec/lib/api/entities/plan_limit_spec.rb11
-rw-r--r--spec/lib/api/entities/projects/topic_spec.rb1
-rw-r--r--spec/lib/api/entities/user_spec.rb45
-rw-r--r--spec/lib/api/helpers_spec.rb249
-rw-r--r--spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb99
-rw-r--r--spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb104
-rw-r--r--spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb97
-rw-r--r--spec/lib/backup/manager_spec.rb794
-rw-r--r--spec/lib/backup/repositories_spec.rb76
-rw-r--r--spec/lib/banzai/filter/image_lazy_load_filter_spec.rb5
-rw-r--r--spec/lib/banzai/filter/references/issue_reference_filter_spec.rb22
-rw-r--r--spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb86
-rw-r--r--spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb58
-rw-r--r--spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb29
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb80
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb75
-rw-r--r--spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb12
-rw-r--r--spec/lib/bulk_imports/groups/stage_spec.rb2
-rw-r--r--spec/lib/bulk_imports/groups/transformers/group_attributes_transformer_spec.rb26
-rw-r--r--spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb8
-rw-r--r--spec/lib/bulk_imports/ndjson_pipeline_spec.rb2
-rw-r--r--spec/lib/bulk_imports/pipeline_spec.rb4
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb5
-rw-r--r--spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb122
-rw-r--r--spec/lib/bulk_imports/projects/stage_spec.rb3
-rw-r--r--spec/lib/constraints/feature_constrainer_spec.rb16
-rw-r--r--spec/lib/container_registry/client_spec.rb53
-rw-r--r--spec/lib/container_registry/migration_spec.rb74
-rw-r--r--spec/lib/error_tracking/collector/dsn_spec.rb26
-rw-r--r--spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb6
-rw-r--r--spec/lib/error_tracking/collector/sentry_request_parser_spec.rb6
-rw-r--r--spec/lib/feature/definition_spec.rb93
-rw-r--r--spec/lib/feature_spec.rb182
-rw-r--r--spec/lib/gitlab/application_rate_limiter_spec.rb14
-rw-r--r--spec/lib/gitlab/asciidoc_spec.rb12
-rw-r--r--spec/lib/gitlab/audit/deploy_token_author_spec.rb17
-rw-r--r--spec/lib/gitlab/audit/null_author_spec.rb9
-rw-r--r--spec/lib/gitlab/auth/ldap/adapter_spec.rb10
-rw-r--r--spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb68
-rw-r--r--spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb65
-rw-r--r--spec/lib/gitlab/auth/otp/strategies/forti_authenticator_spec.rb68
-rw-r--r--spec/lib/gitlab/auth/saml/config_spec.rb19
-rw-r--r--spec/lib/gitlab/background_migration/backfill_artifact_expiry_date_spec.rb82
-rw-r--r--spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb75
-rw-r--r--spec/lib/gitlab/background_migration/backfill_group_features_spec.rb12
-rw-r--r--spec/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification_spec.rb73
-rw-r--r--spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb13
-rw-r--r--spec/lib/gitlab/background_migration/backfill_note_discussion_id_spec.rb29
-rw-r--r--spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb41
-rw-r--r--spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb21
-rw-r--r--spec/lib/gitlab/background_migration/batched_migration_job_spec.rb96
-rw-r--r--spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb169
-rw-r--r--spec/lib/gitlab/background_migration/expire_o_auth_tokens_spec.rb35
-rw-r--r--spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/job_coordinator_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb25
-rw-r--r--spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb8
-rw-r--r--spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb39
-rw-r--r--spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb39
-rw-r--r--spec/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports_spec.rb85
-rw-r--r--spec/lib/gitlab/backtrace_cleaner_spec.rb1
-rw-r--r--spec/lib/gitlab/checks/branch_check_spec.rb6
-rw-r--r--spec/lib/gitlab/checks/changes_access_spec.rb39
-rw-r--r--spec/lib/gitlab/checks/single_change_access_spec.rb15
-rw-r--r--spec/lib/gitlab/ci/ansi2json_spec.rb11
-rw-r--r--spec/lib/gitlab/ci/build/rules/rule/clause/if_spec.rb74
-rw-r--r--spec/lib/gitlab/ci/build/rules_spec.rb13
-rw-r--r--spec/lib/gitlab/ci/config/entry/environment_spec.rb26
-rw-r--r--spec/lib/gitlab/ci/config/entry/job_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports_spec.rb14
-rw-r--r--spec/lib/gitlab/ci/config/entry/root_spec.rb37
-rw-r--r--spec/lib/gitlab/ci/config/external/file/local_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/external/file/project_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/config/external/file/remote_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/external/file/template_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/config/external/processor_spec.rb72
-rw-r--r--spec/lib/gitlab/ci/config_spec.rb12
-rw-r--r--spec/lib/gitlab/ci/lint_spec.rb20
-rw-r--r--spec/lib/gitlab/ci/parsers/security/common_spec.rb29
-rw-r--r--spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb278
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb28
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb28
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/lexeme/pattern_spec.rb49
-rw-r--r--spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb45
-rw-r--r--spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb33
-rw-r--r--spec/lib/gitlab/ci/reports/security/scanner_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/runner_upgrade_check_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb65
-rw-r--r--spec/lib/gitlab/ci/templates/MATLAB_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb1
-rw-r--r--spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb40
-rw-r--r--spec/lib/gitlab/ci/templates/templates_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb5
-rw-r--r--spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb4
-rw-r--r--spec/lib/gitlab/ci/variables/builder_spec.rb2
-rw-r--r--spec/lib/gitlab/ci/yaml_processor/result_spec.rb18
-rw-r--r--spec/lib/gitlab/ci/yaml_processor_spec.rb10
-rw-r--r--spec/lib/gitlab/color_spec.rb42
-rw-r--r--spec/lib/gitlab/content_security_policy/config_loader_spec.rb20
-rw-r--r--spec/lib/gitlab/data_builder/issuable_spec.rb130
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_spec.rb9
-rw-r--r--spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb96
-rw-r--r--spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb47
-rw-r--r--spec/lib/gitlab/database/migration_helpers_spec.rb133
-rw-r--r--spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb141
-rw-r--r--spec/lib/gitlab/database/migrations/base_background_runner_spec.rb23
-rw-r--r--spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb41
-rw-r--r--spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb1
-rw-r--r--spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb57
-rw-r--r--spec/lib/gitlab/database/migrations/runner_spec.rb33
-rw-r--r--spec/lib/gitlab/database/migrations/test_background_runner_spec.rb37
-rw-r--r--spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb87
-rw-r--r--spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb10
-rw-r--r--spec/lib/gitlab/database/query_analyzer_spec.rb34
-rw-r--r--spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb2
-rw-r--r--spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb70
-rw-r--r--spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb2
-rw-r--r--spec/lib/gitlab/database/shared_model_spec.rb2
-rw-r--r--spec/lib/gitlab/database_importers/work_items/base_type_importer_spec.rb2
-rw-r--r--spec/lib/gitlab/database_spec.rb34
-rw-r--r--spec/lib/gitlab/diff/file_spec.rb16
-rw-r--r--spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb22
-rw-r--r--spec/lib/gitlab/doctor/secrets_spec.rb34
-rw-r--r--spec/lib/gitlab/email/handler/create_note_handler_spec.rb4
-rw-r--r--spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb23
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb2
-rw-r--r--spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb79
-rw-r--r--spec/lib/gitlab/experiment/rollout/feature_spec.rb3
-rw-r--r--spec/lib/gitlab/experimentation/controller_concern_spec.rb4
-rw-r--r--spec/lib/gitlab/git/diff_spec.rb8
-rw-r--r--spec/lib/gitlab/git_access_spec.rb9
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb129
-rw-r--r--spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb12
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/github_import/milestone_finder_spec.rb2
-rw-r--r--spec/lib/gitlab/github_import/parallel_scheduling_spec.rb71
-rw-r--r--spec/lib/gitlab/gon_helper_spec.rb1
-rw-r--r--spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb45
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb4
-rw-r--r--spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb4
-rw-r--r--spec/lib/gitlab/graphql/queries_spec.rb10
-rw-r--r--spec/lib/gitlab/health_checks/middleware_spec.rb52
-rw-r--r--spec/lib/gitlab/health_checks/server_spec.rb64
-rw-r--r--spec/lib/gitlab/hook_data/issuable_builder_spec.rb130
-rw-r--r--spec/lib/gitlab/http_spec.rb4
-rw-r--r--spec/lib/gitlab/import/import_failure_service_spec.rb40
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml1
-rw-r--r--spec/lib/gitlab/import_export/group/relation_factory_spec.rb15
-rw-r--r--spec/lib/gitlab/import_export/project/tree_restorer_spec.rb4
-rw-r--r--spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb67
-rw-r--r--spec/lib/gitlab/instrumentation/rate_limiting_gates_spec.rb39
-rw-r--r--spec/lib/gitlab/instrumentation_helper_spec.rb21
-rw-r--r--spec/lib/gitlab/jira/middleware_spec.rb4
-rw-r--r--spec/lib/gitlab/json_cache_spec.rb4
-rw-r--r--spec/lib/gitlab/json_spec.rb2
-rw-r--r--spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb274
-rw-r--r--spec/lib/gitlab/kubernetes/kube_client_spec.rb64
-rw-r--r--spec/lib/gitlab/kubernetes/network_policy_spec.rb235
-rw-r--r--spec/lib/gitlab/legacy_github_import/importer_spec.rb3
-rw-r--r--spec/lib/gitlab/lograge/custom_options_spec.rb12
-rw-r--r--spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb4
-rw-r--r--spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb44
-rw-r--r--spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb2
-rw-r--r--spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb52
-rw-r--r--spec/lib/gitlab/metrics/methods_spec.rb2
-rw-r--r--spec/lib/gitlab/metrics/rails_slis_spec.rb14
-rw-r--r--spec/lib/gitlab/metrics/sli_spec.rb183
-rw-r--r--spec/lib/gitlab/metrics/subscribers/active_record_spec.rb122
-rw-r--r--spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb55
-rw-r--r--spec/lib/gitlab/patch/database_config_spec.rb59
-rw-r--r--spec/lib/gitlab/path_regex_spec.rb2
-rw-r--r--spec/lib/gitlab/popen_spec.rb2
-rw-r--r--spec/lib/gitlab/process_supervisor_spec.rb76
-rw-r--r--spec/lib/gitlab/query_limiting/transaction_spec.rb15
-rw-r--r--spec/lib/gitlab/request_profiler/profile_spec.rb61
-rw-r--r--spec/lib/gitlab/request_profiler_spec.rb56
-rw-r--r--spec/lib/gitlab/saas_spec.rb6
-rw-r--r--spec/lib/gitlab/safe_request_purger_spec.rb73
-rw-r--r--spec/lib/gitlab/setup_helper/praefect_spec.rb79
-rw-r--r--spec/lib/gitlab/sidekiq_config_spec.rb40
-rw-r--r--spec/lib/gitlab/sidekiq_death_handler_spec.rb8
-rw-r--r--spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb3
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb16
-rw-r--r--spec/lib/gitlab/subscription_portal_spec.rb1
-rw-r--r--spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb49
-rw-r--r--spec/lib/gitlab/tracking/event_definition_spec.rb2
-rw-r--r--spec/lib/gitlab/url_builder_spec.rb16
-rw-r--r--spec/lib/gitlab/usage/metric_definition_spec.rb22
-rw-r--r--spec/lib/gitlab/usage/metric_spec.rb27
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb2
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb106
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb70
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb40
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb24
-rw-r--r--spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb24
-rw-r--r--spec/lib/gitlab/usage/metrics/query_spec.rb32
-rw-r--r--spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb35
-rw-r--r--spec/lib/gitlab/usage/service_ping_report_spec.rb64
-rw-r--r--spec/lib/gitlab/usage_counters/pod_logs_spec.rb7
-rw-r--r--spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb3
-rw-r--r--spec/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter_spec.rb107
-rw-r--r--spec/lib/gitlab/usage_data_queries_spec.rb6
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb29
-rw-r--r--spec/lib/gitlab/user_access_spec.rb11
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb65
-rw-r--r--spec/lib/gitlab/utils_spec.rb8
-rw-r--r--spec/lib/gitlab/workhorse_spec.rb52
-rw-r--r--spec/lib/gitlab/zentao/client_spec.rb32
-rw-r--r--spec/lib/service_ping/build_payload_spec.rb48
-rw-r--r--spec/lib/service_ping/devops_report_spec.rb35
-rw-r--r--spec/lib/service_ping/permit_data_categories_spec.rb45
-rw-r--r--spec/lib/service_ping/service_ping_settings_spec.rb47
-rw-r--r--spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb8
-rw-r--r--spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb2
-rw-r--r--spec/lib/sidebars/groups/menus/settings_menu_spec.rb12
-rw-r--r--spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb36
-rw-r--r--spec/lib/sidebars/projects/menus/monitor_menu_spec.rb16
-rw-r--r--spec/lib/tasks/gitlab/metrics_exporter_task_spec.rb81
-rw-r--r--spec/mailers/emails/in_product_marketing_spec.rb24
-rw-r--r--spec/mailers/emails/merge_requests_spec.rb32
-rw-r--r--spec/mailers/emails/projects_spec.rb28
-rw-r--r--spec/metrics_server/metrics_server_spec.rb175
-rw-r--r--spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb38
-rw-r--r--spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb3
-rw-r--r--spec/migrations/20220124130028_dedup_runner_projects_spec.rb2
-rw-r--r--spec/migrations/20220213103859_remove_integrations_type_spec.rb31
-rw-r--r--spec/migrations/20220324165436_schedule_backfill_project_settings_spec.rb22
-rw-r--r--spec/migrations/20220331133802_schedule_backfill_topics_title_spec.rb26
-rw-r--r--spec/migrations/20220420135946_update_batched_background_migration_arguments_spec.rb44
-rw-r--r--spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb73
-rw-r--r--spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb35
-rw-r--r--spec/migrations/20220502173045_reset_too_many_tags_skipped_registry_imports_spec.rb68
-rw-r--r--spec/migrations/20220505044348_fix_automatic_iterations_cadences_start_date_spec.rb64
-rw-r--r--spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb24
-rw-r--r--spec/migrations/20220513043344_reschedule_expire_o_auth_tokens_spec.rb31
-rw-r--r--spec/migrations/associate_existing_dast_builds_with_variables_spec.rb2
-rw-r--r--spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb1
-rw-r--r--spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb32
-rw-r--r--spec/migrations/backfill_work_item_type_id_on_issues_spec.rb52
-rw-r--r--spec/migrations/cleanup_after_fixing_regression_with_new_users_emails_spec.rb42
-rw-r--r--spec/migrations/finalize_project_namespaces_backfill_spec.rb12
-rw-r--r--spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb2
-rw-r--r--spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb2
-rw-r--r--spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb55
-rw-r--r--spec/migrations/retry_backfill_traversal_ids_spec.rb2
-rw-r--r--spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb68
-rw-r--r--spec/migrations/toggle_vsa_aggregations_enable_spec.rb25
-rw-r--r--spec/models/abuse_report_spec.rb2
-rw-r--r--spec/models/alert_management/alert_spec.rb11
-rw-r--r--spec/models/alert_management/metric_image_spec.rb8
-rw-r--r--spec/models/analytics/cycle_analytics/aggregation_spec.rb31
-rw-r--r--spec/models/application_setting_spec.rb30
-rw-r--r--spec/models/ci/bridge_spec.rb30
-rw-r--r--spec/models/ci/build_spec.rb124
-rw-r--r--spec/models/ci/job_artifact_spec.rb13
-rw-r--r--spec/models/ci/pipeline_spec.rb87
-rw-r--r--spec/models/ci/processable_spec.rb223
-rw-r--r--spec/models/ci/runner_spec.rb32
-rw-r--r--spec/models/ci/secure_file_spec.rb7
-rw-r--r--spec/models/clusters/platforms/kubernetes_spec.rb52
-rw-r--r--spec/models/commit_status_spec.rb50
-rw-r--r--spec/models/concerns/cache_markdown_field_spec.rb2
-rw-r--r--spec/models/concerns/integrations/reset_secret_fields_spec.rb19
-rw-r--r--spec/models/concerns/issuable_spec.rb28
-rw-r--r--spec/models/concerns/pg_full_text_searchable_spec.rb13
-rw-r--r--spec/models/concerns/reactive_caching_spec.rb2
-rw-r--r--spec/models/concerns/schedulable_spec.rb10
-rw-r--r--spec/models/concerns/sha256_attribute_spec.rb91
-rw-r--r--spec/models/concerns/sha_attribute_spec.rb135
-rw-r--r--spec/models/container_registry/event_spec.rb60
-rw-r--r--spec/models/container_repository_spec.rb68
-rw-r--r--spec/models/deploy_token_spec.rb10
-rw-r--r--spec/models/deployment_spec.rb38
-rw-r--r--spec/models/design_management/action_spec.rb9
-rw-r--r--spec/models/environment_spec.rb35
-rw-r--r--spec/models/event_collection_spec.rb248
-rw-r--r--spec/models/event_spec.rb49
-rw-r--r--spec/models/incident_management/timeline_event_spec.rb84
-rw-r--r--spec/models/instance_configuration_spec.rb64
-rw-r--r--spec/models/integration_spec.rb72
-rw-r--r--spec/models/integrations/bamboo_spec.rb2
-rw-r--r--spec/models/integrations/base_chat_notification_spec.rb19
-rw-r--r--spec/models/integrations/buildkite_spec.rb2
-rw-r--r--spec/models/integrations/drone_ci_spec.rb2
-rw-r--r--spec/models/integrations/jenkins_spec.rb15
-rw-r--r--spec/models/integrations/jira_spec.rb192
-rw-r--r--spec/models/integrations/microsoft_teams_spec.rb2
-rw-r--r--spec/models/integrations/prometheus_spec.rb28
-rw-r--r--spec/models/integrations/teamcity_spec.rb4
-rw-r--r--spec/models/issue_spec.rb19
-rw-r--r--spec/models/key_spec.rb40
-rw-r--r--spec/models/member_spec.rb78
-rw-r--r--spec/models/merge_request/metrics_spec.rb39
-rw-r--r--spec/models/merge_request_assignee_spec.rb13
-rw-r--r--spec/models/merge_request_reviewer_spec.rb13
-rw-r--r--spec/models/merge_request_spec.rb46
-rw-r--r--spec/models/namespace_ci_cd_setting_spec.rb9
-rw-r--r--spec/models/namespace_spec.rb49
-rw-r--r--spec/models/packages/cleanup/policy_spec.rb28
-rw-r--r--spec/models/packages/package_spec.rb2
-rw-r--r--spec/models/pages_domain_spec.rb2
-rw-r--r--spec/models/performance_monitoring/prometheus_dashboard_spec.rb2
-rw-r--r--spec/models/personal_access_token_spec.rb8
-rw-r--r--spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb42
-rw-r--r--spec/models/project_import_state_spec.rb39
-rw-r--r--spec/models/project_setting_spec.rb18
-rw-r--r--spec/models/project_spec.rb61
-rw-r--r--spec/models/project_statistics_spec.rb61
-rw-r--r--spec/models/project_team_spec.rb16
-rw-r--r--spec/models/projects/topic_spec.rb14
-rw-r--r--spec/models/protected_branch/push_access_level_spec.rb2
-rw-r--r--spec/models/protected_branch_spec.rb6
-rw-r--r--spec/models/raw_usage_data_spec.rb25
-rw-r--r--spec/models/release_spec.rb5
-rw-r--r--spec/models/shard_spec.rb4
-rw-r--r--spec/models/system_note_metadata_spec.rb12
-rw-r--r--spec/models/user_custom_attribute_spec.rb57
-rw-r--r--spec/models/user_spec.rb35
-rw-r--r--spec/models/users/in_product_marketing_email_spec.rb53
-rw-r--r--spec/models/users/merge_request_interaction_spec.rb1
-rw-r--r--spec/policies/container_expiration_policy_policy_spec.rb33
-rw-r--r--spec/policies/group_policy_spec.rb45
-rw-r--r--spec/policies/issuable_policy_spec.rb50
-rw-r--r--spec/policies/issue_policy_spec.rb27
-rw-r--r--spec/policies/namespaces/project_namespace_policy_spec.rb4
-rw-r--r--spec/policies/namespaces/user_namespace_policy_spec.rb2
-rw-r--r--spec/policies/timelog_policy_spec.rb57
-rw-r--r--spec/policies/work_item_policy_spec.rb40
-rw-r--r--spec/presenters/clusters/cluster_presenter_spec.rb2
-rw-r--r--spec/presenters/group_clusterable_presenter_spec.rb18
-rw-r--r--spec/presenters/instance_clusterable_presenter_spec.rb12
-rw-r--r--spec/presenters/project_clusterable_presenter_spec.rb18
-rw-r--r--spec/presenters/projects/security/configuration_presenter_spec.rb2
-rw-r--r--spec/requests/admin/background_migrations_controller_spec.rb84
-rw-r--r--spec/requests/admin/batched_jobs_controller_spec.rb74
-rw-r--r--spec/requests/api/admin/plan_limits_spec.rb60
-rw-r--r--spec/requests/api/ci/job_artifacts_spec.rb15
-rw-r--r--spec/requests/api/ci/jobs_spec.rb24
-rw-r--r--spec/requests/api/ci/resource_groups_spec.rb30
-rw-r--r--spec/requests/api/ci/runner/jobs_artifacts_spec.rb160
-rw-r--r--spec/requests/api/ci/runner/jobs_request_post_spec.rb14
-rw-r--r--spec/requests/api/ci/runner/jobs_trace_spec.rb2
-rw-r--r--spec/requests/api/ci/runners_spec.rb11
-rw-r--r--spec/requests/api/ci/secure_files_spec.rb22
-rw-r--r--spec/requests/api/clusters/agent_tokens_spec.rb179
-rw-r--r--spec/requests/api/container_registry_event_spec.rb36
-rw-r--r--spec/requests/api/environments_spec.rb20
-rw-r--r--spec/requests/api/error_tracking/client_keys_spec.rb4
-rw-r--r--spec/requests/api/error_tracking/collector_spec.rb12
-rw-r--r--spec/requests/api/features_spec.rb50
-rw-r--r--spec/requests/api/files_spec.rb60
-rw-r--r--spec/requests/api/graphql/boards/board_lists_query_spec.rb6
-rw-r--r--spec/requests/api/graphql/ci/config_spec.rb144
-rw-r--r--spec/requests/api/graphql/ci/job_spec.rb15
-rw-r--r--spec/requests/api/graphql/ci/runner_spec.rb18
-rw-r--r--spec/requests/api/graphql/ci/runners_spec.rb4
-rw-r--r--spec/requests/api/graphql/container_repository/container_repository_details_spec.rb8
-rw-r--r--spec/requests/api/graphql/current_user_todos_spec.rb8
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb12
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb12
-rw-r--r--spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb4
-rw-r--r--spec/requests/api/graphql/group/group_members_spec.rb50
-rw-r--r--spec/requests/api/graphql/group/merge_requests_spec.rb2
-rw-r--r--spec/requests/api/graphql/group/milestones_spec.rb8
-rw-r--r--spec/requests/api/graphql/issue/issue_spec.rb5
-rw-r--r--spec/requests/api/graphql/merge_request/merge_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb89
-rw-r--r--spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb89
-rw-r--r--spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb14
-rw-r--r--spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb60
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb67
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb62
-rw-r--r--spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb80
-rw-r--r--spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb22
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb79
-rw-r--r--spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/notes/create/note_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb4
-rw-r--r--spec/requests/api/graphql/mutations/remove_attention_request_spec.rb79
-rw-r--r--spec/requests/api/graphql/mutations/timelogs/delete_spec.rb38
-rw-r--r--spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb8
-rw-r--r--spec/requests/api/graphql/mutations/todos/restore_many_spec.rb8
-rw-r--r--spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb93
-rw-r--r--spec/requests/api/graphql/packages/conan_spec.rb21
-rw-r--r--spec/requests/api/graphql/packages/maven_spec.rb8
-rw-r--r--spec/requests/api/graphql/packages/nuget_spec.rb17
-rw-r--r--spec/requests/api/graphql/packages/package_spec.rb26
-rw-r--r--spec/requests/api/graphql/packages/pypi_spec.rb5
-rw-r--r--spec/requests/api/graphql/project/alert_management/integrations_spec.rb57
-rw-r--r--spec/requests/api/graphql/project/cluster_agents_spec.rb8
-rw-r--r--spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb127
-rw-r--r--spec/requests/api/graphql/project/issue/design_collection/version_spec.rb29
-rw-r--r--spec/requests/api/graphql/project/issue/designs/designs_spec.rb22
-rw-r--r--spec/requests/api/graphql/project/issue/designs/notes_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/issue_spec.rb7
-rw-r--r--spec/requests/api/graphql/project/merge_request_spec.rb6
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb41
-rw-r--r--spec/requests/api/graphql/project/milestones_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/pipeline_spec.rb19
-rw-r--r--spec/requests/api/graphql/project/project_members_spec.rb9
-rw-r--r--spec/requests/api/graphql/project/release_spec.rb40
-rw-r--r--spec/requests/api/graphql/project/terraform/state_spec.rb18
-rw-r--r--spec/requests/api/graphql/project/terraform/states_spec.rb17
-rw-r--r--spec/requests/api/graphql/query_spec.rb16
-rw-r--r--spec/requests/api/graphql/user/starred_projects_query_spec.rb18
-rw-r--r--spec/requests/api/graphql/user_query_spec.rb72
-rw-r--r--spec/requests/api/graphql/users_spec.rb26
-rw-r--r--spec/requests/api/graphql/work_item_spec.rb3
-rw-r--r--spec/requests/api/group_container_repositories_spec.rb5
-rw-r--r--spec/requests/api/group_milestones_spec.rb2
-rw-r--r--spec/requests/api/import_bitbucket_server_spec.rb12
-rw-r--r--spec/requests/api/import_github_spec.rb6
-rw-r--r--spec/requests/api/integrations/jira_connect/subscriptions_spec.rb86
-rw-r--r--spec/requests/api/internal/base_spec.rb115
-rw-r--r--spec/requests/api/internal/container_registry/migration_spec.rb19
-rw-r--r--spec/requests/api/lint_spec.rb41
-rw-r--r--spec/requests/api/members_spec.rb4
-rw-r--r--spec/requests/api/merge_requests_spec.rb63
-rw-r--r--spec/requests/api/personal_access_tokens_spec.rb48
-rw-r--r--spec/requests/api/project_attributes.yml1
-rw-r--r--spec/requests/api/project_container_repositories_spec.rb10
-rw-r--r--spec/requests/api/project_export_spec.rb21
-rw-r--r--spec/requests/api/project_milestones_spec.rb4
-rw-r--r--spec/requests/api/projects_spec.rb86
-rw-r--r--spec/requests/api/releases_spec.rb8
-rw-r--r--spec/requests/api/settings_spec.rb38
-rw-r--r--spec/requests/api/sidekiq_metrics_spec.rb13
-rw-r--r--spec/requests/api/topics_spec.rb19
-rw-r--r--spec/requests/api/usage_data_spec.rb24
-rw-r--r--spec/requests/api/user_counts_spec.rb2
-rw-r--r--spec/requests/api/users_spec.rb8
-rw-r--r--spec/requests/lfs_http_spec.rb63
-rw-r--r--spec/requests/oauth_tokens_spec.rb25
-rw-r--r--spec/requests/projects/issue_links_controller_spec.rb11
-rw-r--r--spec/requests/pwa_controller_spec.rb14
-rw-r--r--spec/requests/request_profiler_spec.rb56
-rw-r--r--spec/rubocop/cop/database/multiple_databases_spec.rb7
-rw-r--r--spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb1
-rw-r--r--spec/rubocop/cop/gitlab/namespaced_class_spec.rb143
-rw-r--r--spec/rubocop/cop/migration/background_migration_base_class_spec.rb104
-rw-r--r--spec/rubocop/cop/migration/background_migration_record_spec.rb59
-rw-r--r--spec/rubocop/cop/migration/hash_index_spec.rb47
-rw-r--r--spec/rubocop/cop/migration/migration_record_spec.rb59
-rw-r--r--spec/scripts/changed-feature-flags_spec.rb118
-rw-r--r--spec/scripts/lib/glfm/shared_spec.rb36
-rw-r--r--spec/scripts/lib/glfm/update_example_snapshots_spec.rb316
-rw-r--r--spec/scripts/lib/glfm/update_specification_spec.rb196
-rw-r--r--spec/scripts/trigger-build_spec.rb970
-rw-r--r--spec/serializers/build_details_entity_spec.rb47
-rw-r--r--spec/serializers/ci/job_entity_spec.rb16
-rw-r--r--spec/serializers/cluster_entity_spec.rb16
-rw-r--r--spec/serializers/discussion_entity_spec.rb18
-rw-r--r--spec/serializers/environment_entity_spec.rb12
-rw-r--r--spec/serializers/issue_board_entity_spec.rb16
-rw-r--r--spec/serializers/issue_entity_spec.rb13
-rw-r--r--spec/serializers/issue_sidebar_basic_entity_spec.rb32
-rw-r--r--spec/serializers/linked_project_issue_entity_spec.rb22
-rw-r--r--spec/serializers/merge_request_user_entity_spec.rb4
-rw-r--r--spec/serializers/release_serializer_spec.rb4
-rw-r--r--spec/services/alert_management/alerts/update_service_spec.rb45
-rw-r--r--spec/services/audit_event_service_spec.rb12
-rw-r--r--spec/services/authorized_project_update/project_create_service_spec.rb185
-rw-r--r--spec/services/authorized_project_update/project_group_link_create_service_spec.rb222
-rw-r--r--spec/services/ci/create_downstream_pipeline_service_spec.rb118
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb2
-rw-r--r--spec/services/ci/generate_kubeconfig_service_spec.rb5
-rw-r--r--spec/services/ci/job_artifacts/create_service_spec.rb11
-rw-r--r--spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb2
-rw-r--r--spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb6
-rw-r--r--spec/services/ci/pipeline_trigger_service_spec.rb8
-rw-r--r--spec/services/ci/retry_job_service_spec.rb442
-rw-r--r--spec/services/clusters/agents/delete_service_spec.rb2
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb2
-rw-r--r--spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb43
-rw-r--r--spec/services/container_expiration_policies/cleanup_service_spec.rb6
-rw-r--r--spec/services/container_expiration_policies/update_service_spec.rb4
-rw-r--r--spec/services/container_expiration_policy_service_spec.rb32
-rw-r--r--spec/services/customer_relations/contacts/create_service_spec.rb2
-rw-r--r--spec/services/customer_relations/contacts/update_service_spec.rb27
-rw-r--r--spec/services/customer_relations/organizations/update_service_spec.rb25
-rw-r--r--spec/services/database/consistency_fix_service_spec.rb153
-rw-r--r--spec/services/dependency_proxy/group_settings/update_service_spec.rb2
-rw-r--r--spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb6
-rw-r--r--spec/services/environments/stop_service_spec.rb29
-rw-r--r--spec/services/error_tracking/base_service_spec.rb11
-rw-r--r--spec/services/error_tracking/collect_error_service_spec.rb15
-rw-r--r--spec/services/error_tracking/issue_details_service_spec.rb16
-rw-r--r--spec/services/error_tracking/issue_latest_event_service_spec.rb16
-rw-r--r--spec/services/error_tracking/issue_update_service_spec.rb21
-rw-r--r--spec/services/groups/group_links/create_service_spec.rb210
-rw-r--r--spec/services/groups/group_links/destroy_service_spec.rb85
-rw-r--r--spec/services/groups/open_issues_count_service_spec.rb64
-rw-r--r--spec/services/groups/transfer_service_spec.rb2
-rw-r--r--spec/services/import/bitbucket_server_service_spec.rb17
-rw-r--r--spec/services/import/github_service_spec.rb27
-rw-r--r--spec/services/incident_management/timeline_events/create_service_spec.rb117
-rw-r--r--spec/services/incident_management/timeline_events/destroy_service_spec.rb80
-rw-r--r--spec/services/incident_management/timeline_events/update_service_spec.rb148
-rw-r--r--spec/services/issues/close_service_spec.rb2
-rw-r--r--spec/services/issues/create_service_spec.rb8
-rw-r--r--spec/services/issues/set_crm_contacts_service_spec.rb16
-rw-r--r--spec/services/jira_connect/sync_service_spec.rb14
-rw-r--r--spec/services/keys/expiry_notification_service_spec.rb2
-rw-r--r--spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb10
-rw-r--r--spec/services/members/create_service_spec.rb32
-rw-r--r--spec/services/members/groups/creator_service_spec.rb24
-rw-r--r--spec/services/members/invite_service_spec.rb70
-rw-r--r--spec/services/members/projects/creator_service_spec.rb24
-rw-r--r--spec/services/merge_requests/approval_service_spec.rb15
-rw-r--r--spec/services/merge_requests/close_service_spec.rb2
-rw-r--r--spec/services/merge_requests/handle_assignees_change_service_spec.rb8
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb2
-rw-r--r--spec/services/merge_requests/post_merge_service_spec.rb78
-rw-r--r--spec/services/merge_requests/push_options_handler_service_spec.rb98
-rw-r--r--spec/services/merge_requests/rebase_service_spec.rb12
-rw-r--r--spec/services/merge_requests/remove_approval_service_spec.rb8
-rw-r--r--spec/services/merge_requests/remove_attention_requested_service_spec.rb135
-rw-r--r--spec/services/merge_requests/request_attention_service_spec.rb220
-rw-r--r--spec/services/merge_requests/squash_service_spec.rb12
-rw-r--r--spec/services/merge_requests/toggle_attention_requested_service_spec.rb4
-rw-r--r--spec/services/merge_requests/update_assignees_service_spec.rb43
-rw-r--r--spec/services/merge_requests/update_service_spec.rb90
-rw-r--r--spec/services/namespaces/in_product_marketing_email_records_spec.rb55
-rw-r--r--spec/services/namespaces/package_settings/update_service_spec.rb4
-rw-r--r--spec/services/notes/create_service_spec.rb34
-rw-r--r--spec/services/notification_service_spec.rb75
-rw-r--r--spec/services/projects/after_import_service_spec.rb131
-rw-r--r--spec/services/projects/android_target_platform_detector_service_spec.rb30
-rw-r--r--spec/services/projects/batch_open_issues_count_service_spec.rb34
-rw-r--r--spec/services/projects/blame_service_spec.rb129
-rw-r--r--spec/services/projects/container_repository/cleanup_tags_service_spec.rb31
-rw-r--r--spec/services/projects/container_repository/delete_tags_service_spec.rb51
-rw-r--r--spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb77
-rw-r--r--spec/services/projects/create_service_spec.rb53
-rw-r--r--spec/services/projects/group_links/create_service_spec.rb121
-rw-r--r--spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb130
-rw-r--r--spec/services/projects/open_issues_count_service_spec.rb109
-rw-r--r--spec/services/projects/prometheus/alerts/create_service_spec.rb52
-rw-r--r--spec/services/projects/prometheus/alerts/destroy_service_spec.rb21
-rw-r--r--spec/services/projects/prometheus/alerts/update_service_spec.rb53
-rw-r--r--spec/services/projects/prometheus/metrics/destroy_service_spec.rb13
-rw-r--r--spec/services/projects/prometheus/metrics/update_service_spec.rb44
-rw-r--r--spec/services/projects/record_target_platforms_service_spec.rb104
-rw-r--r--spec/services/projects/update_pages_service_spec.rb12
-rw-r--r--spec/services/prometheus/create_default_alerts_service_spec.rb92
-rw-r--r--spec/services/quick_actions/interpret_service_spec.rb15
-rw-r--r--spec/services/service_ping/build_payload_service_spec.rb47
-rw-r--r--spec/services/service_ping/permit_data_categories_service_spec.rb42
-rw-r--r--spec/services/service_ping/service_ping_settings_spec.rb46
-rw-r--r--spec/services/service_ping/submit_service_ping_service_spec.rb110
-rw-r--r--spec/services/system_note_service_spec.rb47
-rw-r--r--spec/services/system_notes/incidents_service_spec.rb88
-rw-r--r--spec/services/system_notes/time_tracking_service_spec.rb24
-rw-r--r--spec/services/timelogs/delete_service_spec.rb65
-rw-r--r--spec/services/users/destroy_service_spec.rb41
-rw-r--r--spec/services/users/in_product_marketing_email_records_spec.rb66
-rw-r--r--spec/services/users/validate_manual_otp_service_spec.rb72
-rw-r--r--spec/services/users/validate_otp_service_spec.rb51
-rw-r--r--spec/services/users/validate_push_otp_service_spec.rb45
-rw-r--r--spec/services/work_items/delete_task_service_spec.rb88
-rw-r--r--spec/services/work_items/task_list_reference_removal_service_spec.rb151
-rw-r--r--spec/spec_helper.rb4
-rw-r--r--spec/support/database/query_analyzer.rb8
-rw-r--r--spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb4
-rw-r--r--spec/support/graphql/arguments.rb4
-rw-r--r--spec/support/helpers/database/migration_testing_helpers.rb43
-rw-r--r--spec/support/helpers/features/snippet_helpers.rb9
-rw-r--r--spec/support/helpers/features/sorting_helpers.rb8
-rw-r--r--spec/support/helpers/filtered_search_helpers.rb112
-rw-r--r--spec/support/helpers/gitaly_setup.rb66
-rw-r--r--spec/support/helpers/graphql_helpers.rb119
-rw-r--r--spec/support/helpers/migrations_helpers.rb21
-rw-r--r--spec/support/helpers/namespaces_test_helper.rb13
-rw-r--r--spec/support/helpers/navbar_structure_helper.rb8
-rw-r--r--spec/support/helpers/next_instance_of.rb8
-rw-r--r--spec/support/helpers/project_helpers.rb16
-rw-r--r--spec/support/helpers/query_recorder.rb10
-rw-r--r--spec/support/helpers/rendered_helpers.rb12
-rw-r--r--spec/support/helpers/saas_test_helper.rb9
-rw-r--r--spec/support/helpers/stub_feature_flags.rb14
-rw-r--r--spec/support/helpers/stub_object_storage.rb5
-rw-r--r--spec/support/helpers/test_env.rb2
-rw-r--r--spec/support/helpers/trial_status_widget_test_helper.rb9
-rw-r--r--spec/support/helpers/workhorse_helpers.rb6
-rw-r--r--spec/support/helpers/workhorse_lfs_helpers.rb45
-rw-r--r--spec/support/import_export/common_util.rb2
-rw-r--r--spec/support/matchers/background_migrations_matchers.rb19
-rw-r--r--spec/support/matchers/graphql_matchers.rb9
-rw-r--r--spec/support/matchers/make_queries.rb31
-rw-r--r--spec/support/rspec.rb2
-rw-r--r--spec/support/shared_contexts/email_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/graphql/requests/packages_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb3
-rw-r--r--spec/support/shared_contexts/models/concerns/integrations/enable_ssl_verification_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/navbar_structure_context.rb24
-rw-r--r--spec/support/shared_contexts/policies/group_policy_shared_context.rb5
-rw-r--r--spec/support/shared_contexts/policies/project_policy_shared_context.rb4
-rw-r--r--spec/support/shared_contexts/sentry_error_tracking_shared_context.rb2
-rw-r--r--spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb4
-rw-r--r--spec/support/shared_examples/ci/log_downstream_pipeline_shared_examples.rb34
-rw-r--r--spec/support/shared_examples/controllers/environments_controller_shared_examples.rb17
-rw-r--r--spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/content_editor_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/dependency_proxy_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/editable_merge_request_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/inviting_groups_shared_examples.rb144
-rw-r--r--spec/support/shared_examples/features/manage_applications_shared_examples.rb4
-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/multiple_reviewers_mr_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/features/packages_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/features/sidebar_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb17
-rw-r--r--spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb48
-rw-r--r--spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb4
-rw-r--r--spec/support/shared_examples/lib/gitlab/database/reestablished_connection_stack_shared_examples.rb32
-rw-r--r--spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb162
-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.rb2
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb110
-rw-r--r--spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb27
-rw-r--r--spec/support/shared_examples/models/member_shared_examples.rb403
-rw-r--r--spec/support/shared_examples/models/reviewer_state_shared_examples.rb15
-rw-r--r--spec/support/shared_examples/models/wiki_shared_examples.rb233
-rw-r--r--spec/support/shared_examples/nav_sidebar_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb27
-rw-r--r--spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb8
-rw-r--r--spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb18
-rw-r--r--spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb89
-rw-r--r--spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb12
-rw-r--r--spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/requests/api/milestones_shared_examples.rb10
-rw-r--r--spec/support/shared_examples/requests/rack_attack_shared_examples.rb19
-rw-r--r--spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb26
-rw-r--r--spec/support/shared_examples/services/jira/requests/base_shared_examples.rb16
-rw-r--r--spec/support/shared_examples/work_item_base_types_importer.rb42
-rw-r--r--spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb119
-rw-r--r--spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb8
-rw-r--r--spec/support_specs/helpers/active_record/query_recorder_spec.rb10
-rw-r--r--spec/support_specs/helpers/graphql_helpers_spec.rb75
-rw-r--r--spec/support_specs/helpers/migrations_helpers_spec.rb74
-rw-r--r--spec/support_specs/helpers/stub_feature_flags_spec.rb12
-rw-r--r--spec/tasks/dev_rake_spec.rb6
-rw-r--r--spec/tasks/gitlab/artifacts/migrate_rake_spec.rb14
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb77
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb28
-rw-r--r--spec/tooling/danger/project_helper_spec.rb9
-rw-r--r--spec/tooling/danger/specs_spec.rb5
-rw-r--r--spec/tooling/fixtures/find_codeowners/dir0/dir1/dir2/file2 (renamed from app/assets/javascripts/create_cluster/store/cluster_dropdown/getters.js)0
-rw-r--r--spec/tooling/fixtures/find_codeowners/dir0/dir1/file10
-rw-r--r--spec/tooling/fixtures/find_codeowners/dir0/file00
-rw-r--r--spec/tooling/fixtures/find_codeowners/file0
-rw-r--r--spec/tooling/lib/tooling/find_codeowners_spec.rb199
-rw-r--r--spec/tooling/quality/test_level_spec.rb14
-rw-r--r--spec/views/admin/application_settings/general.html.haml_spec.rb22
-rw-r--r--spec/views/devise/shared/_signin_box.html.haml_spec.rb14
-rw-r--r--spec/views/devise/shared/_signup_box.html.haml_spec.rb37
-rw-r--r--spec/views/groups/runners/_group_runners.html.haml_spec.rb42
-rw-r--r--spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb26
-rw-r--r--spec/views/help/instance_configuration.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb2
-rw-r--r--spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb18
-rw-r--r--spec/views/profiles/keys/_form.html.haml_spec.rb4
-rw-r--r--spec/views/profiles/keys/_key.html.haml_spec.rb8
-rw-r--r--spec/views/projects/clusters/clusters/gcp/_form.html.haml_spec.rb26
-rw-r--r--spec/views/projects/issues/show.html.haml_spec.rb16
-rw-r--r--spec/views/projects/merge_requests/show.html.haml_spec.rb5
-rw-r--r--spec/views/projects/project_members/index.html.haml_spec.rb3
-rw-r--r--spec/views/projects/settings/operations/show.html.haml_spec.rb24
-rw-r--r--spec/views/shared/access_tokens/_table.html.haml_spec.rb41
-rw-r--r--spec/views/shared/notes/_form.html.haml_spec.rb2
-rw-r--r--spec/workers/authorized_project_update/project_create_worker_spec.rb50
-rw-r--r--spec/workers/authorized_project_update/project_group_link_create_worker_spec.rb52
-rw-r--r--spec/workers/build_finished_worker_spec.rb2
-rw-r--r--spec/workers/bulk_imports/pipeline_worker_spec.rb14
-rw-r--r--spec/workers/ci/build_finished_worker_spec.rb2
-rw-r--r--spec/workers/cleanup_container_repository_worker_spec.rb39
-rw-r--r--spec/workers/clusters/applications/activate_service_worker_spec.rb2
-rw-r--r--spec/workers/concerns/gitlab/github_import/object_importer_spec.rb30
-rw-r--r--spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb42
-rw-r--r--spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb8
-rw-r--r--spec/workers/container_expiration_policy_worker_spec.rb84
-rw-r--r--spec/workers/container_registry/migration/enqueuer_worker_spec.rb738
-rw-r--r--spec/workers/container_registry/migration/guard_worker_spec.rb114
-rw-r--r--spec/workers/create_commit_signature_worker_spec.rb4
-rw-r--r--spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb9
-rw-r--r--spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb11
-rw-r--r--spec/workers/delete_diff_files_worker_spec.rb6
-rw-r--r--spec/workers/delete_user_worker_spec.rb4
-rw-r--r--spec/workers/deployments/hooks_worker_spec.rb10
-rw-r--r--spec/workers/every_sidekiq_worker_spec.rb10
-rw-r--r--spec/workers/expire_build_instance_artifacts_worker_spec.rb75
-rw-r--r--spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb18
-rw-r--r--spec/workers/merge_requests/close_issue_worker_spec.rb63
-rw-r--r--spec/workers/post_receive_spec.rb2
-rw-r--r--spec/workers/project_service_worker_spec.rb32
-rw-r--r--spec/workers/projects/after_import_worker_spec.rb131
-rw-r--r--spec/workers/projects/inactive_projects_deletion_cron_worker_spec.rb139
-rw-r--r--spec/workers/projects/inactive_projects_deletion_notification_worker_spec.rb41
-rw-r--r--spec/workers/projects/record_target_platforms_worker_spec.rb79
-rw-r--r--spec/workers/prometheus/create_default_alerts_worker_spec.rb58
-rw-r--r--spec/workers/ssh_keys/expired_notification_worker_spec.rb10
-rw-r--r--spec/workers/ssh_keys/expiring_soon_notification_worker_spec.rb2
-rwxr-xr-xtooling/bin/find_change_diffs6
-rwxr-xr-xtooling/bin/find_codeowners6
-rw-r--r--tooling/config/CODEOWNERS.yml58
-rw-r--r--tooling/danger/project_helper.rb3
-rw-r--r--tooling/danger/specs.rb2
-rw-r--r--tooling/lib/tooling/find_codeowners.rb103
-rw-r--r--tooling/quality/test_level.rb6
-rw-r--r--vendor/project_templates/cluster_management.tar.gzbin17708 -> 14169 bytes
-rw-r--r--workhorse/.tool-versions2
-rw-r--r--workhorse/Makefile10
-rw-r--r--workhorse/config.toml.example10
-rw-r--r--workhorse/config_test.go17
-rw-r--r--workhorse/gitaly_integration_test.go32
-rw-r--r--workhorse/gitaly_test.go63
-rw-r--r--workhorse/go.mod17
-rw-r--r--workhorse/go.sum183
-rw-r--r--workhorse/internal/api/api.go9
-rw-r--r--workhorse/internal/config/config.go14
-rw-r--r--workhorse/internal/git/archive.go10
-rw-r--r--workhorse/internal/git/blob.go10
-rw-r--r--workhorse/internal/git/diff.go9
-rw-r--r--workhorse/internal/git/error.go96
-rw-r--r--workhorse/internal/git/error_test.go80
-rw-r--r--workhorse/internal/git/format-patch.go10
-rw-r--r--workhorse/internal/git/git-http.go14
-rw-r--r--workhorse/internal/git/info-refs.go8
-rw-r--r--workhorse/internal/git/info-refs_test.go3
-rw-r--r--workhorse/internal/git/receive-pack.go10
-rw-r--r--workhorse/internal/git/snapshot.go10
-rw-r--r--workhorse/internal/git/testhelper_test.go15
-rw-r--r--workhorse/internal/git/upload-pack.go12
-rw-r--r--workhorse/internal/git/upload-pack_test.go43
-rw-r--r--workhorse/internal/gitaly/gitaly.go88
-rw-r--r--workhorse/internal/gitaly/gitaly_test.go73
-rw-r--r--workhorse/internal/gitaly/smarthttp.go65
-rw-r--r--workhorse/internal/helper/writeafterreader.go6
-rw-r--r--workhorse/internal/redis/keywatcher.go5
-rw-r--r--workhorse/internal/redis/keywatcher_test.go227
-rw-r--r--workhorse/internal/testhelper/gitaly.go94
-rw-r--r--workhorse/internal/upload/artifacts_uploader.go10
-rw-r--r--workhorse/internal/upload/body_uploader.go9
-rw-r--r--workhorse/internal/upload/body_uploader_test.go37
-rw-r--r--workhorse/internal/upload/lfs_preparer.go47
-rw-r--r--workhorse/internal/upload/lfs_preparer_test.go59
-rw-r--r--workhorse/internal/upload/multipart_uploader.go2
-rw-r--r--workhorse/internal/upload/object_storage_preparer.go6
-rw-r--r--workhorse/internal/upload/object_storage_preparer_test.go6
-rw-r--r--workhorse/internal/upload/preparer.go25
-rw-r--r--workhorse/internal/upload/uploads_test.go20
-rw-r--r--workhorse/internal/upstream/routes.go75
-rw-r--r--workhorse/listener.go41
-rw-r--r--workhorse/listener_test.go94
-rw-r--r--workhorse/main.go34
-rw-r--r--workhorse/main_test.go18
-rw-r--r--workhorse/testdata/localhost.crt27
-rw-r--r--workhorse/testdata/localhost.key28
-rw-r--r--yarn.lock855
5603 files changed, 235302 insertions, 116758 deletions
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 7f45fd912a9..1dec5db472a 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -38,6 +38,15 @@ rules:
promise/always-return: off
promise/no-callback-in-promise: off
'@gitlab/no-global-event-off': error
+ '@gitlab/vue-no-new-non-primitive-in-template':
+ - error
+ - allowNames:
+ - 'class(es)?$'
+ - '^style$'
+ - '^to$'
+ - '^$'
+ - '^variables$'
+ - 'attrs?$'
no-param-reassign:
- error
- props: true
@@ -97,6 +106,8 @@ rules:
- error
- selector: ImportSpecifier[imported.name='GlSkeletonLoading']
message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/360551
+ vue/multi-word-component-names: off
overrides:
- files:
- '{,ee/,jh/}spec/frontend*/**/*'
@@ -139,8 +150,7 @@ overrides:
parser: '@graphql-eslint/eslint-plugin'
operations:
- '{,ee/,jh/}app/**/*.graphql'
- # You can run `bundle exec rake gitlab:graphql:schema:dump` and then uncomment this line
- # schema: './tmp/tests/graphql/gitlab_schema.graphql'
+ schema: './tmp/tests/graphql/gitlab_schema_apollo.graphql'
rules:
filenames/match-regex: off
spaced-comment: off
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ae2e054d714..7b2918b7050 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -138,4 +138,4 @@ variables:
include:
- local: .gitlab/ci/*.gitlab-ci.yml
- - remote: 'https://gitlab.com/gitlab-org/frontend/untamper-my-lockfile/-/raw/main/.gitlab-ci-template.yml'
+ - remote: 'https://gitlab.com/gitlab-org/frontend/untamper-my-lockfile/-/raw/main/templates/merge_request_pipelines.yml'
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 2aee22dbb9e..8b64c81f0f7 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -106,26 +106,10 @@ Dangerfile @gl-quality/eng-prod
/ee/spec/requests/projects/security/policies_controller_spec.rb @gitlab-org/protect/container-security-backend
/ee/app/models/security/orchestration_policy_configuration.rb @gitlab-org/protect/container-security-backend
/ee/spec/models/security/orchestration_policy_configuration_spec.rb @gitlab-org/protect/container-security-backend
-/lib/gitlab/kubernetes/cilium_network_policy.rb @gitlab-org/protect/container-security-backend
-/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb @gitlab-org/protect/container-security-backend
-/lib/gitlab/kubernetes/network_policy_common.rb @gitlab-org/protect/container-security-backend
-/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb @gitlab-org/protect/container-security-backend
-/lib/gitlab/kubernetes/network_policy.rb @gitlab-org/protect/container-security-backend
-/spec/lib/gitlab/kubernetes/network_policy_spec.rb @gitlab-org/protect/container-security-backend
-/ee/app/services/network_policies/** @gitlab-org/protect/container-security-backend
-/ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend
/app/models/clusters/applications/cilium.rb @gitlab-org/protect/container-security-backend
/spec/models/clusters/applications/cilium_spec.rb @gitlab-org/protect/container-security-backend
-/ee/app/controllers/projects/security/network_policies_controller.rb @gitlab-org/protect/container-security-backend
-/ee/spec/controllers/projects/security/network_policies_controller_spec.rb @gitlab-org/protect/container-security-backend
-/ee/app/workers/network_policy_metrics_worker.rb @gitlab-org/protect/container-security-backend
-/ee/spec/workers/network_policy_metrics_worker_spec.rb @gitlab-org/protect/container-security-backend
-/ee/app/services/network_policies/** @gitlab-org/protect/container-security-backend
-/ee/spec/services/network_policies/** @gitlab-org/protect/container-security-backend
/ee/app/services/security/orchestration/** @gitlab-org/protect/container-security-backend
/ee/spec/services/security/orchestration/** @gitlab-org/protect/container-security-backend
-/ee/lib/gitlab/usage_data_counters/network_policy_counter.rb @gitlab-org/protect/container-security-backend
-/ee/spec/lib/gitlab/usage_data_counters/network_policy_counter_spec.rb @gitlab-org/protect/container-security-backend
^[Code Owners]
/ee/lib/gitlab/code_owners.rb @reprazent @kerrizor @garyh
@@ -209,14 +193,14 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/.vale/ @marcel.amirault @eread @aqualls @dianalogan
^[Documentation Pages]
-/doc/administration/application_settings_cache.md @marcia
+/doc/administration/application_settings_cache.md @sselhorn
/doc/administration/audit_event_streaming.md @eread
/doc/administration/audit_events.md @eread
/doc/administration/audit_reports.md @eread
/doc/administration/auditor_users.md @eread
/doc/administration/auth/ @eread
/doc/administration/cicd.md @marcel.amirault
-/doc/administration/clusters/kas.md @marcia
+/doc/administration/clusters/kas.md @sselhorn
/doc/administration/compliance.md @eread
/doc/administration/configure.md @axil
/doc/administration/consul.md @axil
@@ -254,15 +238,17 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/object_storage.md @axil
/doc/administration/operations/ @axil
/doc/administration/operations/moving_repositories.md @eread
-/doc/administration/operations/sidekiq_memory_killer.md @marcia
+/doc/administration/operations/fast_ssh_key_lookup.md @aqualls
+/doc/administration/operations/sidekiq_memory_killer.md @sselhorn
/doc/administration/package_information/ @axil
/doc/administration/packages/ @claytoncornell
/doc/administration/pages/index.md @aqualls
/doc/administration/pages/source.md @aqualls
/doc/administration/polling.md @axil
-/doc/administration/postgresql/ @marcia
+/doc/administration/postgresql/ @aqualls
/doc/administration/pseudonymizer.md @axil
/doc/administration/raketasks/ @axil
+/doc/administration/raketasks/ldap.md @eread
/doc/administration/raketasks/praefect.md @eread
/doc/administration/read_only_gitlab.md @axil
/doc/administration/redis/ @axil
@@ -280,11 +266,12 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/administration/snippets/index.md @aqualls
/doc/administration/static_objects_external_storage.md @aqualls
/doc/administration/system_hooks.md @kpaizee
-/doc/administration/terraform_state.md @marcia
+/doc/administration/terraform_state.md @sselhorn
/doc/administration/timezone.md @axil
/doc/administration/troubleshooting/ @axil
-/doc/administration/troubleshooting/elasticsearch.md @rdickenson
-/doc/administration/troubleshooting/postgresql.md @marcia
+/doc/administration/troubleshooting/elasticsearch.md @sselhorn
+/doc/administration/troubleshooting/group_saml_scim.md @eread
+/doc/administration/troubleshooting/postgresql.md @aqualls
/doc/administration/uploads.md @axil
/doc/administration/user_settings.md @eread
/doc/administration/whats-new.md @kpaizee
@@ -302,7 +289,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/branches.md @aqualls
/doc/api/broadcast_messages.md @kpaizee
/doc/api/bulk_imports.md @eread
-/doc/api/cluster_agents.md @marcia
+/doc/api/cluster_agents.md @sselhorn
/doc/api/commits.md @aqualls
/doc/api/container_registry.md @claytoncornell
/doc/api/custom_attributes.md @kpaizee
@@ -334,7 +321,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/group_activity_analytics.md @fneill
/doc/api/group_badges.md @fneill
/doc/api/group_boards.md @msedlakjakubowski
-/doc/api/group_clusters.md @marcia
+/doc/api/group_clusters.md @sselhorn
/doc/api/group_import_export.md @eread
/doc/api/group_iterations.md @msedlakjakubowski
/doc/api/group_labels.md @msedlakjakubowski
@@ -348,7 +335,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/groups.md @fneill
/doc/api/import.md @eread
/doc/api/index.md @kpaizee
-/doc/api/instance_clusters.md @marcia
+/doc/api/instance_clusters.md @sselhorn
/doc/api/instance_level_ci_variables.md @marcel.amirault
/doc/api/integrations.md @kpaizee
/doc/api/invitations.md @kpaizee
@@ -390,7 +377,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/project_access_tokens.md @eread
/doc/api/project_aliases.md @aqualls
/doc/api/project_badges.md @aqualls
-/doc/api/project_clusters.md @marcia
+/doc/api/project_clusters.md @sselhorn
/doc/api/project_import_export.md @aqualls
/doc/api/project_level_variables.md @marcel.amirault
/doc/api/project_relations_export.md @eread
@@ -443,10 +430,10 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/api/vulnerability_findings.md @claytoncornell
/doc/api/wikis.md @aqualls
/doc/architecture/blueprints/container_registry_metadata_database/index.md @claytoncornell
-/doc/architecture/blueprints/database/scalability/patterns/ @marcia
-/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @marcia
+/doc/architecture/blueprints/database/scalability/patterns/ @aqualls
+/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @sselhorn
/doc/ci/caching/index.md @marcel.amirault
-/doc/ci/chatops/index.md @marcia
+/doc/ci/chatops/index.md @sselhorn
/doc/ci/ci_cd_for_external_repos/ @marcel.amirault
/doc/ci/cloud_deployment/ecs/quick_start_guide.md @rdickenson
/doc/ci/cloud_deployment/index.md @rdickenson
@@ -485,6 +472,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/ci/review_apps/index.md @marcel.amirault
/doc/ci/runners/ @sselhorn
/doc/ci/secrets/index.md @marcel.amirault
+/doc/ci/secure_files/index.md @marcel.amirault
/doc/ci/services/ @sselhorn
/doc/ci/ssh_keys/index.md @marcel.amirault
/doc/ci/test_cases/index.md @msedlakjakubowski
@@ -493,120 +481,117 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/ci/unit_test_reports.md @marcel.amirault
/doc/ci/variables/ @marcel.amirault
/doc/ci/yaml/ @marcel.amirault
-/doc/development/adding_database_indexes.md @marcia
+/doc/development/adding_database_indexes.md @aqualls
/doc/development/application_limits.md @axil
/doc/development/approval_rules.md @aqualls
/doc/development/audit_event_guide/index.md @eread
-/doc/development/auto_devops.md @marcia
-/doc/development/backend/create_source_code_be/index.md @aqualls
-/doc/development/backend/ruby_style_guide.md @marcia
-/doc/development/batched_background_migrations.md @marcia
+/doc/development/auto_devops.md @sselhorn
+/doc/development/backend/create_source_code_be/ @aqualls
+/doc/development/backend/ruby_style_guide.md @sselhorn
/doc/development/build_test_package.md @axil
/doc/development/bulk_import.md @eread
-/doc/development/cached_queries.md @marcia
+/doc/development/cached_queries.md @sselhorn
/doc/development/cascading_settings.md @eread
-/doc/development/chatops_on_gitlabcom.md @marcia
+/doc/development/chatops_on_gitlabcom.md @sselhorn
/doc/development/cicd/cicd_reference_documentation_guide.md @marcel.amirault
/doc/development/cicd/index.md @marcel.amirault
/doc/development/cicd/schema.md @marcel.amirault
/doc/development/cicd/templates.md @marcel.amirault
/doc/development/code_intelligence/index.md @aqualls
-/doc/development/contributing/ @marcia
+/doc/development/contributing/ @sselhorn
/doc/development/contributing/merge_request_workflow.md @aqualls
-/doc/development/creating_enums.md @marcia
-/doc/development/database_debugging.md @marcia
-/doc/development/database_query_comments.md @marcia
-/doc/development/database_review.md @marcia
-/doc/development/database/ @marcia
-/doc/development/database/multiple_databases.md @marcia
-/doc/development/db_dump.md @marcia
+/doc/development/creating_enums.md @aqualls
+/doc/development/database_debugging.md @aqualls
+/doc/development/database_query_comments.md @aqualls
+/doc/development/database_review.md @aqualls
+/doc/development/database/ @aqualls
+/doc/development/db_dump.md @aqualls
/doc/development/developing_with_solargraph.md @aqualls
/doc/development/diffs.md @aqualls
/doc/development/distributed_tracing.md @msedlakjakubowski
-/doc/development/documentation/feature_flags.md @sselhorn
-/doc/development/documentation/graphql_styleguide.md @sselhorn
+/doc/development/documentation/ @sselhorn
/doc/development/documentation/index.md @dianalogan
/doc/development/documentation/redirects.md @dianalogan
/doc/development/documentation/review_apps.md @dianalogan
-/doc/development/documentation/structure.md @sselhorn
-/doc/development/documentation/styleguide/ @sselhorn
/doc/development/documentation/testing.md @dianalogan
-/doc/development/elasticsearch.md @marcia
+/doc/development/elasticsearch.md @sselhorn
/doc/development/experiment_guide/gitlab_experiment.md @kpaizee
/doc/development/experiment_guide/index.md @kpaizee
/doc/development/export_csv.md @eread
/doc/development/fe_guide/content_editor.md @aqualls
-/doc/development/fe_guide/dark_mode.md @marcia
-/doc/development/fe_guide/graphql.md @marcia
+/doc/development/fe_guide/dark_mode.md @sselhorn
+/doc/development/fe_guide/graphql.md @sselhorn
/doc/development/fe_guide/source_editor.md @aqualls
-/doc/development/feature_categorization/index.md @marcia
-/doc/development/feature_flags/controls.md @marcia
-/doc/development/feature_flags/index.md @marcia
+/doc/development/feature_categorization/index.md @sselhorn
+/doc/development/feature_flags/controls.md @sselhorn
+/doc/development/feature_flags/index.md @sselhorn
/doc/development/filtering_by_label.md @msedlakjakubowski
-/doc/development/foreign_keys.md @marcia
+/doc/development/foreign_keys.md @aqualls
/doc/development/geo.md @axil
/doc/development/geo/framework.md @axil
/doc/development/git_object_deduplication.md @eread
/doc/development/gitaly.md @eread
+/doc/development/gitlab_flavored_markdown/index.md @aqualls
+/doc/development/gitlab_flavored_markdown/specification_guide/index.md @aqualls
/doc/development/graphql_guide/ @kpaizee
-/doc/development/graphql_guide/batchloader.md @marcia
-/doc/development/hash_indexes.md @marcia
+/doc/development/graphql_guide/batchloader.md @aqualls
+/doc/development/hash_indexes.md @aqualls
/doc/development/i18n/ @eread
-/doc/development/image_scaling.md @marcia
+/doc/development/image_scaling.md @sselhorn
/doc/development/import_export.md @eread
-/doc/development/index.md @marcia
-/doc/development/insert_into_tables_in_batches.md @marcia
+/doc/development/index.md @sselhorn
+/doc/development/insert_into_tables_in_batches.md @aqualls
/doc/development/integrations/ @kpaizee
-/doc/development/integrations/codesandbox.md @marcia
+/doc/development/integrations/codesandbox.md @sselhorn
/doc/development/integrations/secure_partner_integration.md @rdickenson
/doc/development/integrations/secure.md @claytoncornell
/doc/development/internal_api/ @aqualls
-/doc/development/internal_users.md @marcia
+/doc/development/internal_users.md @sselhorn
/doc/development/issuable-like-models.md @msedlakjakubowski
/doc/development/issue_types.md @msedlakjakubowski
-/doc/development/iterating_tables_in_batches.md @marcia
-/doc/development/kubernetes.md @marcia
+/doc/development/iterating_tables_in_batches.md @aqualls
+/doc/development/kubernetes.md @sselhorn
/doc/development/lfs.md @aqualls
/doc/development/licensed_feature_availability.md @sselhorn
/doc/development/logging.md @msedlakjakubowski
/doc/development/maintenance_mode.md @axil
/doc/development/new_fe_guide/modules/widget_extensions.md @aqualls
-/doc/development/new_fe_guide/tips.md @marcia
+/doc/development/new_fe_guide/tips.md @sselhorn
/doc/development/omnibus.md @axil
-/doc/development/ordering_table_columns.md @marcia
+/doc/development/ordering_table_columns.md @aqualls
/doc/development/packages.md @claytoncornell
/doc/development/permissions.md @eread
/doc/development/policies.md @eread
/doc/development/product_qualified_lead_guide/index.md @kpaizee
/doc/development/project_templates.md @fneill
/doc/development/prometheus_metrics.md @msedlakjakubowski
-/doc/development/query_performance.md @marcia
-/doc/development/query_recorder.md @marcia
+/doc/development/query_performance.md @aqualls
+/doc/development/query_recorder.md @aqualls
/doc/development/real_time.md @msedlakjakubowski
-/doc/development/secure_coding_guidelines.md @marcia
-/doc/development/serializing_data.md @marcia
+/doc/development/secure_coding_guidelines.md @sselhorn
+/doc/development/serializing_data.md @aqualls
/doc/development/service_ping/ @claytoncornell
-/doc/development/single_table_inheritance.md @marcia
+/doc/development/single_table_inheritance.md @aqualls
/doc/development/snowplow/ @claytoncornell
/doc/development/spam_protection_and_captcha/ @eread
-/doc/development/sql.md @marcia
-/doc/development/swapping_tables.md @marcia
-/doc/development/testing_guide/best_practices.md @marcia
-/doc/development/testing_guide/end_to_end/best_practices.md @marcia
-/doc/development/understanding_explain_plans.md @marcia
+/doc/development/sql.md @aqualls
+/doc/development/swapping_tables.md @aqualls
+/doc/development/testing_guide/best_practices.md @sselhorn
+/doc/development/testing_guide/end_to_end/best_practices.md @sselhorn
+/doc/development/understanding_explain_plans.md @aqualls
/doc/development/value_stream_analytics.md @fneill
/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md @fneill
-/doc/development/verifying_database_capabilities.md @marcia
+/doc/development/verifying_database_capabilities.md @aqualls
/doc/development/wikis.md @aqualls
/doc/development/work_items_widgets.md @msedlakjakubowski
/doc/development/work_items.md @msedlakjakubowski
/doc/development/workhorse/ @aqualls
-/doc/development/workspace/index.md @marcia
+/doc/development/workspace/index.md @sselhorn
/doc/downgrade_ee_to_ce/index.md @axil
/doc/gitlab-basics/ @aqualls
/doc/install/ @axil
/doc/integration/ @kpaizee
-/doc/integration/elasticsearch.md @marcia
+/doc/integration/elasticsearch.md @sselhorn
/doc/integration/gitpod.md @aqualls
/doc/integration/kerberos.md @eread
/doc/integration/mattermost/index.md @axil
@@ -614,11 +599,12 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/integration/saml.md @eread
/doc/integration/security_partners/index.md @rdickenson
/doc/integration/sourcegraph.md @aqualls
-/doc/integration/vault.md @marcia
+/doc/integration/vault.md @sselhorn
/doc/operations/ @msedlakjakubowski
/doc/operations/feature_flags.md @rdickenson
/doc/operations/product_analytics.md @claytoncornell
-/doc/policy/ @axil
+/doc/policy/alpha-beta-support.md @axil
+/doc/policy/maintenance.md @axil
/doc/raketasks/ @axil
/doc/raketasks/generate_sample_prometheus_data.md @msedlakjakubowski
/doc/raketasks/migrate_snippets.md @aqualls
@@ -627,14 +613,15 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/security/ @eread
/doc/subscriptions/ @sselhorn
/doc/topics/authentication/index.md @eread
-/doc/topics/autodevops/ @marcia
+/doc/topics/autodevops/ @sselhorn
/doc/topics/git/ @aqualls
/doc/topics/gitlab_flow.md @aqualls
-/doc/topics/offline/ @axil
+/doc/topics/offline/index.md @axil
+/doc/topics/offline/quick_start_guide.md @axil
/doc/topics/plan_and_track.md @msedlakjakubowski
/doc/update/ @axil
-/doc/update/mysql_to_postgresql.md @marcia
-/doc/update/upgrading_postgresql_using_slony.md @marcia
+/doc/update/mysql_to_postgresql.md @aqualls
+/doc/update/upgrading_postgresql_using_slony.md @aqualls
/doc/user/admin_area/analytics/ @fneill
/doc/user/admin_area/broadcast_messages.md @kpaizee
/doc/user/admin_area/credentials_inventory.md @eread
@@ -643,10 +630,10 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/admin_area/geo_nodes.md @axil
/doc/user/admin_area/labels.md @msedlakjakubowski
/doc/user/admin_area/license_file.md @sselhorn
-/doc/user/admin_area/license.md @kpaizee
+/doc/user/admin_area/license.md @sselhorn
/doc/user/admin_area/merge_requests_approvals.md @aqualls
/doc/user/admin_area/moderate_users.md @eread
-/doc/user/admin_area/monitoring/background_migrations.md @marcia
+/doc/user/admin_area/monitoring/background_migrations.md @aqualls
/doc/user/admin_area/monitoring/health_check.md @msedlakjakubowski
/doc/user/admin_area/reporting/spamcheck.md @axil
/doc/user/admin_area/review_abuse_reports.md @eread
@@ -666,32 +653,30 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls
/doc/user/admin_area/settings/rate_limit_on_issues_creation.md @msedlakjakubowski
/doc/user/admin_area/settings/rate_limit_on_notes_creation.md @msedlakjakubowski
-/doc/user/admin_area/settings/rate_limit_on_users_api.md @eread
/doc/user/admin_area/settings/third_party_offers.md @fneill
+/doc/user/admin_area/settings/usage_statistics.md @claytoncornell
/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
/doc/user/analytics/ @fneill
/doc/user/analytics/ci_cd_analytics.md @rdickenson
/doc/user/application_security/ @rdickenson
/doc/user/application_security/cluster_image_scanning/index.md @claytoncornell
/doc/user/application_security/container_scanning/index.md @claytoncornell
-/doc/user/application_security/coverage_fuzzing/index.md @rdickenson
/doc/user/application_security/cve_id_request.md @claytoncornell
/doc/user/application_security/policies/ @claytoncornell
/doc/user/application_security/security_dashboard/index.md @claytoncornell
-/doc/user/application_security/threat_monitoring/index.md @claytoncornell
/doc/user/application_security/vulnerabilities/index.md @claytoncornell
/doc/user/application_security/vulnerabilities/severities.md @claytoncornell
/doc/user/application_security/vulnerability_report/index.md @claytoncornell
/doc/user/asciidoc.md @aqualls
/doc/user/award_emojis.md @msedlakjakubowski
-/doc/user/clusters/ @marcia
+/doc/user/clusters/ @sselhorn
/doc/user/compliance/compliance_report/index.md @eread
/doc/user/compliance/index.md @eread
/doc/user/compliance/license_compliance/index.md @rdickenson
/doc/user/crm/index.md @msedlakjakubowski
/doc/user/discussions/index.md @aqualls
-/doc/user/feature_flags.md @marcia
-/doc/user/group/clusters/index.md @marcia
+/doc/user/feature_flags.md @sselhorn
+/doc/user/group/clusters/index.md @sselhorn
/doc/user/group/contribution_analytics/index.md @fneill
/doc/user/group/custom_project_templates.md @eread
/doc/user/group/devops_adoption/index.md @fneill
@@ -714,27 +699,28 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/group/settings/import_export.md @eread
/doc/user/group/subgroups/index.md @fneill
/doc/user/group/value_stream_analytics/index.md @fneill
-/doc/user/infrastructure/clusters/ @marcia
+/doc/user/infrastructure/clusters/ @sselhorn
/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md @claytoncornell
/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md @claytoncornell
/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md @msedlakjakubowski
/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md @claytoncornell
/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md @claytoncornell
/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md @msedlakjakubowski
-/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @marcia
+/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @sselhorn
/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md @msedlakjakubowski
-/doc/user/infrastructure/iac/ @marcia
-/doc/user/infrastructure/index.md @marcia
+/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md @sselhorn
+/doc/user/infrastructure/iac/ @sselhorn
+/doc/user/infrastructure/index.md @sselhorn
/doc/user/markdown.md @aqualls
/doc/user/packages/ @claytoncornell
-/doc/user/packages/infrastructure_registry/index.md @marcia
-/doc/user/packages/terraform_module_registry/index.md @marcia
+/doc/user/packages/infrastructure_registry/index.md @sselhorn
+/doc/user/packages/terraform_module_registry/index.md @sselhorn
/doc/user/permissions.md @eread
/doc/user/profile/ @eread
/doc/user/profile/notifications.md @msedlakjakubowski
/doc/user/project/autocomplete_characters.md @aqualls
/doc/user/project/badges.md @aqualls
-/doc/user/project/clusters/ @marcia
+/doc/user/project/clusters/ @sselhorn
/doc/user/project/clusters/kubernetes_pod_logs.md @msedlakjakubowski
/doc/user/project/clusters/protect/ @claytoncornell
/doc/user/project/code_intelligence.md @aqualls
@@ -765,12 +751,15 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/merge_requests/csv_export.md @eread
/doc/user/project/merge_requests/fail_fast_testing.md @marcel.amirault
/doc/user/project/merge_requests/load_performance_testing.md @marcel.amirault
-/doc/user/project/merge_requests/reviews/index.md @aqualls
/doc/user/project/merge_requests/status_checks.md @eread
/doc/user/project/merge_requests/test_coverage_visualization.md @marcel.amirault
/doc/user/project/merge_requests/testing_and_reports_in_merge_requests.md @marcel.amirault
-/doc/user/project/milestones/ @msedlakjakubowski
+/doc/user/project/milestones/burndown_and_burnup_charts.md @msedlakjakubowski
+/doc/user/project/milestones/index.md @msedlakjakubowski
/doc/user/project/pages/ @aqualls
+/doc/user/project/protected_branches.md @aqualls
+/doc/user/project/protected_tags.md @aqualls
+/doc/user/project/push_options.md @aqualls
/doc/user/project/quick_actions.md @msedlakjakubowski
/doc/user/project/releases/index.md @rdickenson
/doc/user/project/releases/release_cli.md @rdickenson
@@ -789,7 +778,8 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/project/working_with_projects.md @fneill
/doc/user/public_access.md @fneill
/doc/user/reserved_names.md @fneill
-/doc/user/search/advanced_search.md @marcia
+/doc/user/search/advanced_search.md @sselhorn
+/doc/user/search/global_search/advanced_search_syntax.md @sselhorn
/doc/user/search/index.md @aqualls
/doc/user/shortcuts.md @aqualls
/doc/user/snippets.md @aqualls
@@ -800,29 +790,245 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab
/doc/user/workspace/index.md @fneill
[Authentication and Authorization]
-/app/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*password* @gitlab-org/manage/authentication-and-authorization
-/config/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*password* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*password* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*password* @gitlab-org/manage/authentication-and-authorization
-
-/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*auth* @gitlab-org/manage/authentication-and-authorization
-
-/app/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/app/**/*token* @gitlab-org/manage/authentication-and-authorization
-/config/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/config/**/*token* @gitlab-org/manage/authentication-and-authorization
-/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/lib/**/*token* @gitlab-org/manage/authentication-and-authorization
-/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
-/ee/app/controllers/**/*token* @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql @gitlab-org/manage/authentication-and-authorization
+/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
+/app/assets/javascripts/pages/ldap @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/oauth @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/omniauth_callbacks @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/password_prompt @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/profiles/two_factor_auths @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/projects/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pages/sessions/new/oauth_remember_me.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/constants.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_branch_name_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_source_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_status_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/pipelines/components/pipelines_list/tokens/pipeline_tag_name_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/projects/settings/topics/components @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/related_issues/components/issue_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/registration/registration_token.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/registration/registration_token_reset_dropdown_item.vue @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/runner/components/search_tokens @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/static_site_editor/rich_content_editor/services/renderers/build_uneditable_token.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/token_access/components @gitlab-org/manage/authentication-and-authorization
+/app/assets/javascripts/token_access/index.js @gitlab-org/manage/authentication-and-authorization
+/app/assets/stylesheets/page_bundles/profile_two_factor_auth.scss @gitlab-org/manage/authentication-and-authorization
+/app/controllers/admin/impersonation_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/access_tokens_actions.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/authenticates_with_two_factor.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/enforces_admin_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/enforces_two_factor_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/oauth_applications.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/project_unauthorized.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/sessionless_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/snippet_authorizations.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/concerns/workhorse_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/groups/settings/access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/ldap @gitlab-org/manage/authentication-and-authorization
+/app/controllers/oauth @gitlab-org/manage/authentication-and-authorization
+/app/controllers/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/personal_access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/two_factor_auths_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/profiles/webauthn_registrations_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/controllers/projects/settings/access_tokens_controller.rb @gitlab-org/manage/authentication-and-authorization
+/app/finders/groups/projects_requiring_authorizations_refresh @gitlab-org/manage/authentication-and-authorization
+/app/finders/personal_access_tokens_finder.rb @gitlab-org/manage/authentication-and-authorization
+/app/helpers/access_tokens_helper.rb @gitlab-org/manage/authentication-and-authorization
+/app/helpers/auth_helper.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/authentication_event.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/admin_changed_password_notifier.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/mirror_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/select_for_project_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/token_authenticatable.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/concerns/token_authenticatable_strategies @gitlab-org/manage/authentication-and-authorization
+/app/models/oauth_access_grant.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/oauth_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/personal_access_token.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/project_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/token_with_iv.rb @gitlab-org/manage/authentication-and-authorization
+/app/models/webauthn_registration.rb @gitlab-org/manage/authentication-and-authorization
+/app/policies/personal_access_token_policy.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/access_token_validation_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/auth @gitlab-org/manage/authentication-and-authorization
+/app/services/authorized_project_update @gitlab-org/manage/authentication-and-authorization
+/app/services/chat_names/authorize_user_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/services/projects/move_project_authorizations_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/resource_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/services/todos/destroy/unauthorized_features_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/authorized_build_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/authorized_create_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/users/refresh_authorized_projects_service.rb @gitlab-org/manage/authentication-and-authorization
+/app/services/webauthn @gitlab-org/manage/authentication-and-authorization
+/app/validators/json_schemas/cluster_agent_authorization_configuration.json @gitlab-org/manage/authentication-and-authorization
+/app/views/admin/application_settings/_external_authorization_service_form.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/admin/impersonation_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/authentication @gitlab-org/manage/authentication-and-authorization
+/app/views/ci/token_access @gitlab-org/manage/authentication-and-authorization
+/app/views/dashboard/projects/_zero_authorized_projects.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change_by_admin.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/password_change_by_admin.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/reset_password_instructions.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/mailer/reset_password_instructions.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/passwords @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_omniauth_box.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_provider_list.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_providers.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/devise/shared/_signup_omniauth_providers_top.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/doorkeeper/authorizations @gitlab-org/manage/authentication-and-authorization
+/app/views/doorkeeper/authorized_applications @gitlab-org/manage/authentication-and-authorization
+/app/views/errors/omniauth_error.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/_resource_access_token_creation.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/_two_factor_auth.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/groups/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/layouts/oauth_error.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_about_to_expire_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_about_to_expire_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_created_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_created_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_expired_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/notify/access_token_expired_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/passwords @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/profiles/two_factor_auths @gitlab-org/manage/authentication-and-authorization
+/app/views/projects/mirrors/_authentication_method.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/projects/settings/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/_no_password.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/access_tokens @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/members/_two_factor_auth_badge.html.haml @gitlab-org/manage/authentication-and-authorization
+/app/views/shared/tokens @gitlab-org/manage/authentication-and-authorization
+/app/workers/authorized_keys_worker.rb @gitlab-org/manage/authentication-and-authorization
+/app/workers/authorized_project_update @gitlab-org/manage/authentication-and-authorization
+/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/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/specialized_worker_for_group_lock_update_auth_recalculation.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
+/config/initializers/devise_dynamic_password_length_validation.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/devise_password_length.rb.example @gitlab-org/manage/authentication-and-authorization
+/config/initializers/gitlab_shell_secret_token.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/omniauth.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/rails_host_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/rails_host_authorization_gitpod.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers/webauthn.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers_before_autoloader/100_patch_omniauth_oauth2.rb @gitlab-org/manage/authentication-and-authorization
+/config/initializers_before_autoloader/100_patch_omniauth_saml.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/access_tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/audit_events/components/tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/audit_events/token_utils.js @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/groups/settings/components @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/pages/groups/omniauth_callbacks @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/pipelines/components/pipelines_list @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/requirements/components/tokens @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/saml_providers/scim_token_service.js @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/saml_sso/components @gitlab-org/manage/authentication-and-authorization
+/ee/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals_auth.vue @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/ee/authenticates_with_two_factor.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/ee/enforces_two_factor_authentication.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/concerns/saml_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/ldap @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/ee/passwords_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/groups/omniauth_callbacks_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/groups/scim_oauth_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/app/controllers/omniauth_kerberos_spnego_controller.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/finders/auth @gitlab-org/manage/authentication-and-authorization
+/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/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
+/ee/app/serializers/scim_oauth_access_token_entity.rb @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/ee/auth @gitlab-org/manage/authentication-and-authorization
+/ee/app/services/ee/personal_access_tokens @gitlab-org/manage/authentication-and-authorization
+/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/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
+/ee/app/views/groups/_personal_access_token_expiration_policy.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/groups/sso/_authorize_pane.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/notify/policy_revoked_personal_access_tokens_email.html.haml @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/notify/policy_revoked_personal_access_tokens_email.text.erb @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/app/views/shared/credentials_inventory/_personal_access_tokens.html.haml @gitlab-org/manage/authentication-and-authorization
+/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/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
+/ee/lib/ee/gitlab/auth.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/ee/gitlab/omniauth_initializer.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/auth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/auth_logger.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/authority_analyzer.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/geo/oauth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/gitlab/kerberos @gitlab-org/manage/authentication-and-authorization
+/ee/lib/omni_auth @gitlab-org/manage/authentication-and-authorization
+/ee/lib/system_check/geo/authorized_keys_check.rb @gitlab-org/manage/authentication-and-authorization
+/ee/lib/system_check/geo/authorized_keys_flag_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/entities/ci/reset_token_result.rb @gitlab-org/manage/authentication-and-authorization
+/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_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
+/lib/api/helpers/authentication.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/helpers/packages/basic_auth_helpers.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/personal_access_tokens.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/resource_access_tokens.rb @gitlab-org/manage/authentication-and-authorization
+/lib/api/support/token_with_expiration.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/api_authentication @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/auth_logger.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/authorized_keys.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/encrypt_static_object_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/migrate_u2f_webauthn.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/chat_name_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/ci/pipeline/expression/token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/external_authorization @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/external_authorization.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/graphql/authorize @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/jwt_authenticatable.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/jwt_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/lfs_token.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/mail_room @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/omniauth_initializer.rb @gitlab-org/manage/authentication-and-authorization
+/lib/gitlab/project_authorizations.rb @gitlab-org/manage/authentication-and-authorization
+/lib/json_web_token @gitlab-org/manage/authentication-and-authorization
+/lib/omni_auth @gitlab-org/manage/authentication-and-authorization
+/lib/system_check/app/authorized_keys_permission_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/system_check/incoming_email/imap_authentication_check.rb @gitlab-org/manage/authentication-and-authorization
+/lib/tasks/gitlab/password.rake @gitlab-org/manage/authentication-and-authorization
+/lib/tasks/tokens.rake @gitlab-org/manage/authentication-and-authorization
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 4069dfe9a2b..7e06a4a71bd 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -53,6 +53,7 @@
- ${TMP_TEST_FOLDER}/gitaly/run2/
- ${TMP_TEST_FOLDER}/gitaly/Makefile
- ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml
+ - ${TMP_TEST_FOLDER}/gitaly/praefect-db.config.toml
- ${TMP_TEST_FOLDER}/gitaly/ruby/
policy: pull
@@ -114,14 +115,16 @@
policy: push
.qa-ruby-gems-cache: &qa-ruby-gems-cache
- key: "qa-ruby-gems-${DEBIAN_VERSION}"
+ key:
+ files:
+ - qa/Gemfile.lock
paths:
- - qa/vendor/ruby/
+ - qa/vendor/ruby
policy: pull
.qa-ruby-gems-cache-push: &qa-ruby-gems-cache-push
<<: *qa-ruby-gems-cache
- policy: push # We want to rebuild the cache from scratch to ensure stale dependencies are cleaned up.
+ policy: pull-push
.setup-test-env-cache:
cache:
@@ -246,7 +249,7 @@
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
- name: elasticsearch:7.17.0
- command: ["elasticsearch", "-E", "discovery.type=single-node"]
+ command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "11"
@@ -257,7 +260,7 @@
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:6.0-alpine
- name: elasticsearch:7.17.0
- command: ["elasticsearch", "-E", "discovery.type=single-node"]
+ command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "12"
@@ -268,11 +271,35 @@
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
- name: redis:5.0-alpine
- name: elasticsearch:7.17.0
- command: ["elasticsearch", "-E", "discovery.type=single-node"]
+ command: ["elasticsearch", "-E", "discovery.type=single-node", "-E", "xpack.security.enabled=false"]
variables:
POSTGRES_HOST_AUTH_METHOD: trust
PG_VERSION: "13"
+.use-pg12-es8-ee:
+ services:
+ - name: postgres:12
+ command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
+ - name: redis:6.0-alpine
+ - name: elasticsearch:8.1.1
+ variables:
+ POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "12"
+ ES_SETTING_DISCOVERY_TYPE: "single-node"
+ ES_SETTING_XPACK_SECURITY_ENABLED: "false"
+
+.use-pg12-opensearch1-ee:
+ services:
+ - name: postgres:12
+ command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
+ - name: redis:6.0-alpine
+ - name: opensearchproject/opensearch:1.2.4
+ alias: elasticsearch
+ command: ["bin/opensearch", "-E", "discovery.type=single-node", "-E", "plugins.security.disabled=true"]
+ variables:
+ POSTGRES_HOST_AUTH_METHOD: trust
+ PG_VERSION: "12"
+
.use-kaniko:
image:
name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:kaniko
diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml
index 8881a4c486d..1ebc408e0d4 100644
--- a/.gitlab/ci/qa.gitlab-ci.yml
+++ b/.gitlab/ci/qa.gitlab-ci.yml
@@ -1,4 +1,5 @@
.qa-job-base:
+ image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-chrome-99
extends:
- .default-retry
- .qa-cache
@@ -114,13 +115,13 @@ update-qa-cache:
.package-and-qa-ff-base:
script:
- |
- feature_flags=$(scripts/changed-feature-flags --files $(cat $CHANGES_FILE | tr ' ' ',') --state $QA_FF_STATE)
+ feature_flags=$(scripts/changed-feature-flags --files $CHANGES_DIFFS_DIR --state $QA_FF_STATE)
if [[ $feature_flags ]]; then
export GITLAB_QA_OPTIONS="--set-feature-flags $feature_flags"
echo $GITLAB_QA_OPTIONS
./scripts/trigger-build.rb omnibus
else
- echo "No changed feature flag found to test. The tests are skipped if the flag was removed."
+ echo "No changed feature flag found to test as $QA_FF_STATE."
fi
package-and-qa:
@@ -134,7 +135,7 @@ package-and-qa-ff-enabled:
- .package-and-qa-ff-base
- .qa:rules:package-and-qa:feature-flags
variables:
- QA_FF_STATE: "enable"
+ QA_FF_STATE: "enabled"
package-and-qa-ff-disabled:
extends:
@@ -142,4 +143,12 @@ package-and-qa-ff-disabled:
- .package-and-qa-ff-base
- .qa:rules:package-and-qa:feature-flags
variables:
- QA_FF_STATE: "disable"
+ QA_FF_STATE: "disabled"
+
+package-and-qa-ff-deleted:
+ extends:
+ - .package-and-qa-base
+ - .package-and-qa-ff-base
+ - .qa:rules:package-and-qa:feature-flags
+ variables:
+ QA_FF_STATE: "deleted"
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 24b6c6d2773..77bdfda3eac 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -25,6 +25,10 @@
.single-db-rspec:
extends: .single-db
+.praefect-with-db:
+ variables:
+ GITALY_PRAEFECT_WITH_DB: '1'
+
.rspec-base:
extends:
- .rails-job-base
@@ -38,7 +42,7 @@
needs: ["setup-test-env", "retrieve-tests-metadata", "compile-test-assets", "detect-tests"]
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration"
+ - rspec_paralellized_job "--tag ~quarantine --tag ~level:migration"
.base-artifacts:
artifacts:
@@ -61,7 +65,7 @@
- .rails:rules:ee-and-foss-migration
script:
- !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration"
+ - rspec_paralellized_job "--tag ~quarantine --tag level:migration"
.rspec-base-pg11:
extends:
@@ -101,41 +105,26 @@
- .rspec-base
- .use-pg12-ee
-.rspec-jh-base-pg12:
- extends:
- - .rspec-base-pg12-as-if-jh
- - .use-pg12-ee
-
-.rspec-ee-base-pg13:
+.rspec-ee-base-pg12-es8:
extends:
- .rspec-base
- - .use-pg13-ee
+ - .use-pg12-es8-ee
+ - .rails:rules:run-search-tests
-.rspec-ee-base-geo:
- extends: .rspec-base
- script:
- - !reference [.base-script, script]
- - rspec_paralellized_job "--tag ~quarantine --tag geo"
-
-.rspec-ee-base-geo-pg11:
+.rspec-ee-base-pg12-opensearch1:
extends:
- - .rspec-ee-base-geo
- - .use-pg11-ee
+ - .rspec-base
+ - .use-pg12-opensearch1-ee
+ - .rails:rules:run-search-tests
-.rspec-ee-base-geo-pg12:
+.rspec-jh-base-pg12:
extends:
- - .rspec-ee-base-geo
+ - .rspec-base-pg12-as-if-jh
- .use-pg12-ee
-.rspec-jh-base-geo-pg12:
- extends:
- - .rspec-jh-base-pg12
- script:
- - !reference [.rspec-ee-base-geo, script]
-
-.rspec-ee-base-geo-pg13:
+.rspec-ee-base-pg13:
extends:
- - .rspec-ee-base-geo
+ - .rspec-base
- .use-pg13-ee
.db-job-base:
@@ -160,10 +149,7 @@
parallel: 22
.rspec-ee-unit-parallel:
- parallel: 14
-
-.rspec-ee-unit-geo-parallel:
- parallel: 2
+ parallel: 16
.rspec-integration-parallel:
parallel: 10
@@ -210,6 +196,7 @@ setup-test-env:
- ${TMP_TEST_FOLDER}/gitaly/run2/
- ${TMP_TEST_FOLDER}/gitaly/Makefile
- ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml
+ - ${TMP_TEST_FOLDER}/gitaly/praefect-db.config.toml
- ${TMP_TEST_FOLDER}/gitaly/ruby/
- ${TMP_TEST_FOLDER}/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer
- ${TMP_TEST_FOLDER}/gitlab-shell/
@@ -280,6 +267,12 @@ rspec migration pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec migration pg12 praefect:
+ extends:
+ - rspec migration pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
rspec unit pg12:
extends:
- .rspec-base-pg12
@@ -298,6 +291,12 @@ rspec unit pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec unit pg12 praefect:
+ extends:
+ - rspec unit pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
rspec integration pg12:
extends:
- .rspec-base-pg12
@@ -316,6 +315,12 @@ rspec integration pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec integration pg12 praefect:
+ extends:
+ - rspec integration pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
rspec system pg12:
extends:
- .rspec-base-pg12
@@ -336,6 +341,12 @@ rspec system pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
+rspec system pg12 praefect:
+ extends:
+ - rspec system pg12
+ - .praefect-with-db
+ - .rails:rules:praefect-with-db
+
# Dedicated job to test DB library code against PG11.
# Note that these are already tested against PG12 in the `rspec unit pg12` / `rspec-ee unit pg12` jobs.
rspec db-library-code pg11:
@@ -510,9 +521,6 @@ rspec:deprecations:
- rspec-ee unit pg12
- rspec-ee integration pg12
- rspec-ee system pg12
- - rspec-ee unit pg12 geo
- - rspec-ee integration pg12 geo
- - rspec-ee system pg12 geo
variables:
SETUP_DB: "false"
script:
@@ -564,14 +572,6 @@ rspec:coverage:
- rspec-ee unit pg12 single-db
- rspec-ee integration pg12 single-db
- rspec-ee system pg12 single-db
- # Geo jobs
- - rspec-ee unit pg12 geo
- - rspec-ee integration pg12 geo
- - rspec-ee system pg12 geo
- # Geo minimal jobs
- - rspec-ee unit pg12 geo minimal
- - rspec-ee integration pg12 geo minimal
- - rspec-ee system pg12 geo minimal
# Memory jobs
- memory-on-boot
# As-if-FOSS jobs
@@ -788,6 +788,16 @@ rspec-ee unit pg12:
- .rails:rules:ee-only-unit
- .rspec-ee-unit-parallel
+rspec-ee unit pg12 es8:
+ extends:
+ - .rspec-ee-base-pg12-es8
+ - .rspec-ee-unit-parallel
+
+rspec-ee unit pg12 opensearch1:
+ extends:
+ - .rspec-ee-base-pg12-opensearch1
+ - .rspec-ee-unit-parallel
+
rspec-ee unit pg12 minimal:
extends:
- rspec-ee unit pg12
@@ -806,6 +816,16 @@ rspec-ee integration pg12:
- .rails:rules:ee-only-integration
- .rspec-ee-integration-parallel
+rspec-ee integration pg12 es8:
+ extends:
+ - .rspec-ee-base-pg12-es8
+ - .rspec-ee-integration-parallel
+
+rspec-ee integration pg12 opensearch1:
+ extends:
+ - .rspec-ee-base-pg12-opensearch1
+ - .rspec-ee-integration-parallel
+
rspec-ee integration pg12 minimal:
extends:
- rspec-ee integration pg12
@@ -824,6 +844,16 @@ rspec-ee system pg12:
- .rails:rules:ee-only-system
- .rspec-ee-system-parallel
+rspec-ee system pg12 es8:
+ extends:
+ - .rspec-ee-base-pg12-es8
+ - .rspec-ee-system-parallel
+
+rspec-ee system pg12 opensearch1:
+ extends:
+ - .rspec-ee-base-pg12-opensearch1
+ - .rspec-ee-system-parallel
+
rspec-ee system pg12 minimal:
extends:
- rspec-ee system pg12
@@ -836,40 +866,6 @@ rspec-ee system pg12 single-db:
- .single-db-rspec
- .rails:rules:single-db
-rspec-ee unit pg12 geo:
- extends:
- - .rspec-ee-base-geo-pg12
- - .rails:rules:ee-only-unit
- - .rspec-ee-unit-geo-parallel
-
-rspec-ee unit pg12 geo minimal:
- extends:
- - rspec-ee unit pg12 geo
- - .minimal-rspec-tests
- - .rails:rules:ee-only-unit:minimal
-
-rspec-ee integration pg12 geo:
- extends:
- - .rspec-ee-base-geo-pg12
- - .rails:rules:ee-only-integration
-
-rspec-ee integration pg12 geo minimal:
- extends:
- - rspec-ee integration pg12 geo
- - .minimal-rspec-tests
- - .rails:rules:ee-only-integration:minimal
-
-rspec-ee system pg12 geo:
- extends:
- - .rspec-ee-base-geo-pg12
- - .rails:rules:ee-only-system
-
-rspec-ee system pg12 geo minimal:
- extends:
- - rspec-ee system pg12 geo
- - .minimal-rspec-tests
- - .rails:rules:ee-only-system:minimal
-
rspec-ee migration pg12-as-if-jh:
extends:
- .rspec-jh-base-pg12
@@ -895,22 +891,6 @@ rspec-ee system pg12-as-if-jh:
- .rails:rules:as-if-jh-rspec
- .rspec-ee-system-parallel
-rspec-ee unit pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
- - .rspec-ee-unit-geo-parallel
-
-rspec-ee integration pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
-
-rspec-ee system pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
-
rspec-jh migration pg12-as-if-jh:
extends:
- .rspec-jh-base-pg12
@@ -932,21 +912,6 @@ rspec-jh system pg12-as-if-jh:
- .rspec-jh-base-pg12
- .rails:rules:as-if-jh-rspec
-rspec-jh unit pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
-
-rspec-jh integration pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
-
-rspec-jh system pg12-as-if-jh geo:
- extends:
- - .rspec-jh-base-geo-pg12
- - .rails:rules:as-if-jh-rspec
-
db:rollback geo:
extends:
- db:rollback
@@ -1044,22 +1009,6 @@ rspec-ee system pg11:
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-system-parallel
-rspec-ee unit pg11 geo:
- extends:
- - .rspec-ee-base-geo-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- - .rspec-ee-unit-geo-parallel
-
-rspec-ee integration pg11 geo:
- extends:
- - .rspec-ee-base-geo-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
-rspec-ee system pg11 geo:
- extends:
- - .rspec-ee-base-geo-pg11
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
# PG13
rspec-ee migration pg13:
extends:
@@ -1085,22 +1034,6 @@ rspec-ee system pg13:
- .rspec-ee-base-pg13
- .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- .rspec-ee-system-parallel
-
-rspec-ee unit pg13 geo:
- extends:
- - .rspec-ee-base-geo-pg13
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
- - .rspec-ee-unit-geo-parallel
-
-rspec-ee integration pg13 geo:
- extends:
- - .rspec-ee-base-geo-pg13
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
-
-rspec-ee system pg13 geo:
- extends:
- - .rspec-ee-base-geo-pg13
- - .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only
# EE: default branch nightly scheduled jobs #
#####################################
diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml
index 3628013fc9b..107f37ed47d 100644
--- a/.gitlab/ci/reports.gitlab-ci.yml
+++ b/.gitlab/ci/reports.gitlab-ci.yml
@@ -2,8 +2,8 @@ include:
- template: Jobs/Code-Quality.gitlab-ci.yml
- template: Jobs/SAST.gitlab-ci.yml
- template: Jobs/Secret-Detection.gitlab-ci.yml
- - template: Security/Dependency-Scanning.gitlab-ci.yml
- - template: Security/License-Scanning.gitlab-ci.yml
+ - template: Jobs/Dependency-Scanning.gitlab-ci.yml
+ - template: Jobs/License-Scanning.gitlab-ci.yml
code_quality:
extends:
@@ -82,9 +82,8 @@ secret_detection:
expire_in: 1 week # GitLab-specific
gemnasium-dependency_scanning:
- before_script:
- # git-lfs is needed for auto-remediation
- - apk add git-lfs
+ variables:
+ DS_REMEDIATE: "false"
rules: !reference [".reports:rules:gemnasium-dependency_scanning", rules]
gemnasium-python-dependency_scanning:
@@ -103,7 +102,7 @@ yarn-audit-dependency_scanning:
extends: .default-retry
stage: test
image:
- name: registry.gitlab.com/gitlab-com/gl-security/security-research/package-hunter-cli:1.1.0
+ name: registry.gitlab.com/gitlab-org/security-products/package-hunter-cli:v1.3.2@sha256:7529deaef9ea21aab56bfb74ae1abbc121311affdb6ece49ce7b1c360f997ca2
entrypoint: [""]
variables:
HTR_user: '$PACKAGE_HUNTER_USER'
diff --git a/.gitlab/ci/review-apps/main.gitlab-ci.yml b/.gitlab/ci/review-apps/main.gitlab-ci.yml
index b528a2c7427..dde08b15bc3 100644
--- a/.gitlab/ci/review-apps/main.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/main.gitlab-ci.yml
@@ -111,7 +111,6 @@ review-deploy:
artifacts:
paths:
- environment_url.txt
- - curl_output.txt
expire_in: 7 days
when: always
diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
index d2192a7511a..47e756eb230 100644
--- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml
+++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml
@@ -1,21 +1,19 @@
include:
- project: gitlab-org/quality/pipeline-common
- ref: 0.3.6
+ ref: 0.6.0
file:
- /ci/allure-report.yml
- /ci/knapsack-report.yml
-.review-qa-base:
- extends:
- - .use-docker-in-docker
- image:
- name: ${QA_IMAGE}
- entrypoint: [""]
- stage: qa
- needs: ["review-deploy"]
+.bundler_variables:
+ variables:
+ BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES: "true"
+ BUNDLE_SILENCE_ROOT_WARNING: "true"
+ BUNDLE_PATH: vendor
+
+.test_variables:
variables:
QA_DEBUG: "true"
- QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
QA_GENERATE_ALLURE_REPORT: "true"
GITLAB_USERNAME: "root"
GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
@@ -23,19 +21,40 @@ include:
GITLAB_ADMIN_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
GITLAB_QA_ADMIN_ACCESS_TOKEN: "${REVIEW_APPS_ROOT_TOKEN}"
GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
- SIGNUP_DISABLED: "true"
+
+.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-99-docker-20.10.14-gcloud-383-kubectl-1.23
+ stage: qa
+ needs:
+ - review-deploy
+ - download-knapsack-report
+ variables:
+ DOCKER_HOST: tcp://docker:2376
+ DOCKER_TLS_CERTDIR: /certs
+ DOCKER_CERT_PATH: /certs/client
+ DOCKER_TLS_VERIFY: 1
before_script:
- # Use $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA so that GitLab image built in omnibus-gitlab-mirror and QA image are in sync.
- export EE_LICENSE="$(cat $REVIEW_APPS_EE_LICENSE_FILE)"
- - if [ -n "$CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" ]; then
- git checkout -f ${CI_MERGE_REQUEST_SOURCE_BRANCH_SHA};
- fi
- - export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
- - echo "${CI_ENVIRONMENT_URL}"
- - cd qa
+ - export QA_GITLAB_URL="$(cat environment_url.txt)"
+ - cd qa && bundle install
script:
- qa_run_status=0
- - bin/test "${QA_SCENARIO}" "${CI_ENVIRONMENT_URL}" -- --color --format documentation --format RspecJunitFormatter --out tmp/rspec.xml || qa_run_status=$?
+ - |
+ bundle exec rake "knapsack:rspec[\
+ ${RSPEC_TAGS} \
+ --tag ~orchestrated \
+ --tag ~transient \
+ --tag ~skip_signup_disabled \
+ --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/.";
@@ -58,25 +77,41 @@ include:
ALLURE_MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID
ALLURE_RESULTS_GLOB: qa/tmp/allure-results/*
+# 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-99
+ extends:
+ - .qa-cache
+ - .bundler_variables
+ - .review:rules:review-qa-reliable
+ stage: prepare
+ before_script:
+ - cd qa && bundle install
+ script:
+ - QA_KNAPSACK_REPORT_NAME=review-qa-reliable bundle exec rake "knapsack:download"
+ - QA_KNAPSACK_REPORT_NAME=review-qa-all bundle exec rake "knapsack:download"
+ allow_failure: true
+ artifacts:
+ paths:
+ - qa/knapsack/review-qa-*.json
+ expire_in: 1 day
+
review-qa-smoke:
extends:
- .review-qa-base
- .review:rules:review-qa-smoke
- retry: 1 # This is confusing but this means "2 runs at max".
variables:
QA_RUN_TYPE: review-qa-smoke
- QA_SCENARIO: Test::Instance::Smoke
-
+ RSPEC_TAGS: --tag smoke
review-qa-reliable:
extends:
- .review-qa-base
- .review:rules:review-qa-reliable
- parallel: 8
- retry: 1
+ parallel: 10
variables:
QA_RUN_TYPE: review-qa-reliable
- QA_SCENARIO: Test::Instance::Reliable
+ RSPEC_TAGS: --tag reliable
review-qa-all:
extends:
@@ -85,8 +120,7 @@ review-qa-all:
parallel: 5
variables:
QA_RUN_TYPE: review-qa-all
- QA_SCENARIO: Test::Instance::All
- QA_SKIP_SMOKE_RELIABLE: "true"
+ RSPEC_TAGS: --tag ~reliable --tag ~smoke
review-performance:
extends:
@@ -136,9 +170,11 @@ allure-report-qa-all:
variables:
ALLURE_JOB_NAME: review-qa-all
-knapsack-report:
+upload-knapsack-report:
extends:
- .generate-knapsack-report-base
stage: post-qa
variables:
- QA_KNAPSACK_REPORT_FILE_PATTERN: $CI_PROJECT_DIR/tmp/knapsack/*/*.json
+ # 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
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index 142341e5741..37593ffd2fc 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -76,6 +76,9 @@
.if-merge-request-labels-jh-contribution: &if-merge-request-labels-jh-contribution
if: '$CI_MERGE_REQUEST_LABELS =~ /JiHu contribution/'
+.if-merge-request-labels-group-global-search: &if-merge-request-labels-group-global-search
+ if: '$CI_MERGE_REQUEST_LABELS =~ /group::global search/'
+
.if-security-merge-request: &if-security-merge-request
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_MERGE_REQUEST_IID'
@@ -247,6 +250,9 @@
.models-patterns: &models-patterns
- "{,ee/,jh/}{app/models}/**/*"
+.lib-gitlab-patterns: &lib-gitlab-patterns
+ - "{,ee/,jh/}lib/{,ee/,jh/}gitlab/**/*"
+
.startup-css-patterns: &startup-css-patterns
- "{,ee/,jh/}app/assets/stylesheets/startup/**/*"
@@ -257,7 +263,7 @@
- "config.ru"
# List explicitly all the app/ dirs that are backend (i.e. all except app/assets).
- "{,ee/,jh/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*"
- - "{,ee/,jh/}{bin,cable,config,db,generator_templates,lib}/**/*"
+ - "{,ee/,jh/}{bin,config,db,generator_templates,lib}/**/*"
- "{,ee/,jh/}spec/**/*"
# CI changes
- ".gitlab-ci.yml"
@@ -267,6 +273,14 @@
# Mapped patterns (see tests.yml)
- "data/whats_new/*.yml"
+.search-backend-patterns: &search-backend-patterns
+ - "{,jh/}Gemfile.lock"
+ - "GITLAB_ELASTICSEARCH_INDEXER_VERSION"
+ # List explicitly all the app/ dirs that are backend (i.e. all except app/assets).
+ - "{,ee/,jh/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*"
+ - "{,ee/,jh/}{bin,config,db,generator_templates,lib}/**/*"
+ - "{,ee/,jh/}spec/**/*"
+
# DB patterns + .ci-patterns
.db-patterns: &db-patterns
- "{,ee/,jh/}{,spec/}{db,migrations}/**/*"
@@ -513,6 +527,10 @@
- <<: *if-security-merge-request
when: never
+.rails:rules:run-search-tests:
+ rules:
+ - <<: *if-merge-request-labels-group-global-search
+ changes: *search-backend-patterns
.rails:rules:ee-and-foss-default-rules:
rules:
@@ -604,6 +622,7 @@
rules:
- <<: *if-not-ee
when: never
+ - <<: *if-merge-request-targeting-stable-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *ci-build-images-patterns
@@ -618,6 +637,7 @@
rules:
- <<: *if-not-canonical-namespace
when: never
+ - <<: *if-merge-request-targeting-stable-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-auto-deploy-branches
- changes: *ci-build-images-patterns
@@ -692,6 +712,7 @@
rules:
- <<: *if-not-canonical-namespace
when: never
+ - <<: *if-merge-request-targeting-stable-branch
- <<: *if-merge-request-labels-run-review-app
- <<: *if-auto-deploy-branches
- changes: *code-qa-patterns
@@ -879,9 +900,8 @@
rules:
- <<: *if-not-ee
when: never
- - <<: *if-dot-com-gitlab-org-and-security-merge-request
- changes: *feature-flag-development-config-patterns
- when: never
+ - <<: *if-merge-request-targeting-stable-branch
+ allow_failure: true
- <<: *if-dot-com-gitlab-org-and-security-merge-request
changes: *nodejs-patterns
allow_failure: true
@@ -938,6 +958,11 @@
changes: *db-patterns
- <<: *if-default-branch-schedule-nightly
+.rails:rules:praefect-with-db:
+ rules:
+ - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-praefect-with-db/'
+ allow_failure: true
+
.rails:rules:ee-and-foss-migration:
rules:
- <<: *if-fork-merge-request
@@ -1470,24 +1495,32 @@
rules:
- if: '$SECRET_DETECTION_DISABLED'
when: never
+ # Scan each commit on master to feed the Vulnerability Reports with detected secrets
+ - <<: *if-default-branch-refs
- changes: *code-backstage-qa-patterns
.reports:rules:gemnasium-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/ || $DS_DEFAULT_ANALYZERS !~ /gemnasium([^-]|$)/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium([^-]|$)/'
when: never
+ # Run Dependency Scanning on master until https://gitlab.com/gitlab-org/gitlab/-/issues/361657 is resolved
+ - <<: *if-default-branch-refs
- changes: *dependency-patterns
.reports:rules:gemnasium-python-dependency_scanning:
rules:
- - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/ || $DS_DEFAULT_ANALYZERS !~ /gemnasium-python/'
+ - if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/ || $DS_EXCLUDED_ANALYZERS =~ /gemnasium-python/'
when: never
+ # Run Dependency Scanning on master until https://gitlab.com/gitlab-org/gitlab/-/issues/361657 is resolved
+ - <<: *if-default-branch-refs
- changes: *python-patterns
.reports:rules:yarn-audit-dependency_scanning:
rules:
- if: '$DEPENDENCY_SCANNING_DISABLED || $GITLAB_FEATURES !~ /\bdependency_scanning\b/'
when: never
+ # Run Dependency Scanning on master until https://gitlab.com/gitlab-org/gitlab/-/issues/361657 is resolved
+ - <<: *if-default-branch-refs
- changes: *nodejs-patterns
.reports:rules:schedule-dast:
@@ -1535,6 +1568,8 @@
- <<: *if-dot-com-gitlab-org-merge-request
changes: *models-patterns
- <<: *if-dot-com-gitlab-org-merge-request
+ changes: *lib-gitlab-patterns
+ - <<: *if-dot-com-gitlab-org-merge-request
changes: *qa-patterns
- <<: *if-dot-com-gitlab-org-merge-request
changes: *code-patterns
diff --git a/.gitlab/ci/static-analysis.gitlab-ci.yml b/.gitlab/ci/static-analysis.gitlab-ci.yml
index f5f0dcfe7f8..e1257e778bd 100644
--- a/.gitlab/ci/static-analysis.gitlab-ci.yml
+++ b/.gitlab/ci/static-analysis.gitlab-ci.yml
@@ -7,6 +7,7 @@
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"
@@ -75,7 +76,7 @@ eslint:
USE_BUNDLE_INSTALL: "false"
script:
- run_timed_command "retry yarn install --frozen-lockfile"
- - run_timed_command "yarn run lint:eslint:all --parser-options=schema:${GRAPHQL_SCHEMA_APOLLO_FILE}"
+ - run_timed_command "yarn run lint:eslint:all"
eslint as-if-foss:
extends:
@@ -111,7 +112,7 @@ rubocop:
script:
- run_timed_command "bundle exec rubocop --parallel"
-qa:testcases:
+qa:metadata-lint:
extends:
- .static-analysis-base
- .static-analysis:rules:ee-and-foss-qa
@@ -123,6 +124,7 @@ qa:testcases:
- run_timed_command "bundle exec bin/qa Test::Instance::All http://localhost:3000 --test-metadata-only"
- cd ..
- run_timed_command "./scripts/qa/testcases-check qa/tmp/test-metadata.json"
+ - run_timed_command "./scripts/qa/quarantine-types-check qa/tmp/test-metadata.json"
variables:
USE_BUNDLE_INSTALL: "false"
SETUP_DB: "false"
diff --git a/.gitlab/ci/test-metadata.gitlab-ci.yml b/.gitlab/ci/test-metadata.gitlab-ci.yml
index 20cbd759ac6..79fea15690c 100644
--- a/.gitlab/ci/test-metadata.gitlab-ci.yml
+++ b/.gitlab/ci/test-metadata.gitlab-ci.yml
@@ -38,9 +38,6 @@ update-tests-metadata:
- rspec-ee unit pg12
- rspec-ee integration pg12
- rspec-ee system pg12
- - rspec-ee unit pg12 geo
- - rspec-ee integration pg12 geo
- - rspec-ee system pg12 geo
script:
- run_timed_command "retry gem install fog-aws mime-types activesupport rspec_profiling postgres-copy --no-document"
- source ./scripts/rspec_helpers.sh
diff --git a/.gitlab/issue_templates/Default.md b/.gitlab/issue_templates/Default.md
index f87b82e341b..ab97a24cce7 100644
--- a/.gitlab/issue_templates/Default.md
+++ b/.gitlab/issue_templates/Default.md
@@ -9,3 +9,5 @@ If you are experiencing an issue when using GitLab.com, your first port of call
If you feel that your issue can be categorized as a reproducible bug or a feature proposal, please use one of the issue templates provided and include as much information as possible.
Thank you for helping to make GitLab a better product.
+
+<!-- template sourced from https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/issue_templates/Default.md -->
diff --git a/.gitlab/issue_templates/Feature Flag Cleanup.md b/.gitlab/issue_templates/Feature Flag Cleanup.md
index eedb35a4b5f..d32b0c874d4 100644
--- a/.gitlab/issue_templates/Feature Flag Cleanup.md
+++ b/.gitlab/issue_templates/Feature Flag Cleanup.md
@@ -41,7 +41,7 @@ Are there any other stages or teams involved that need to be kept in the loop?
the feature can be officially announced in a release blog post.
- [ ] `/chatops run auto_deploy status <merge-commit-of-cleanup-mr>`
- [ ] Close [the feature issue](ISSUE LINK) to indicate the feature will be released in the current milestone.
-- [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
+- [ ] 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`
- [ ] `/chatops run feature delete <feature-flag-name> --staging`
- [ ] `/chatops run feature delete <feature-flag-name>`
@@ -49,4 +49,3 @@ Are there any other stages or teams involved that need to be kept in the loop?
/label ~"feature flag" ~"type::feature" ~"feature::addition"
-/assign DRI
diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md
index 0462742513c..52f189f09f0 100644
--- a/.gitlab/issue_templates/Feature Flag Roll Out.md
+++ b/.gitlab/issue_templates/Feature Flag Roll Out.md
@@ -123,6 +123,10 @@ To do so, follow these steps:
If the merge request was deployed before [the monthly release was tagged](https://about.gitlab.com/handbook/engineering/releases/#self-managed-releases-1),
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`
+ - [ ] `/chatops run feature delete <feature-flag-name> --staging`
+ - [ ] `/chatops run feature delete <feature-flag-name>`
- [ ] 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).
@@ -157,7 +161,7 @@ You can either [create a follow-up issue for Feature Flag Cleanup](https://gitla
the feature can be officially announced in a release blog post.
- [ ] `/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.
-- [ ] Clean up the feature flag from all environments by running these chatops command in `#production` channel:
+- [ ] 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`
- [ ] `/chatops run feature delete <feature-flag-name> --staging`
- [ ] `/chatops run feature delete <feature-flag-name>`
@@ -172,4 +176,3 @@ You can either [create a follow-up issue for Feature Flag Cleanup](https://gitla
```
/label ~"feature flag" ~"type::feature" ~"feature::addition"
-/assign DRI
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 e858f80ffaa..bfcf7aca7b5 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
@@ -104,7 +104,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
- [ ] Run Geo tracking database migrations:
```shell
- bin/rake geo:db:migrate
+ bin/rake db:migrate:geo
```
- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
@@ -303,12 +303,6 @@ That's all of the required database changes.
git_access_class.error_message(:no_repo)
end
- # The feature flag follows the format `geo_#{replicable_name}_replication`,
- # so here it would be `geo_cool_widget_replication`
- def self.replication_enabled_by_default?
- false
- end
-
override :verification_feature_flag_enabled?
def self.verification_feature_flag_enabled?
# We are adding verification at the same time as replication, so we
@@ -673,34 +667,48 @@ The GraphQL API is used by `Admin > Geo > Replication Details` views, and is dir
Individual Cool Widget replication and verification data should now be available via the GraphQL API.
-### Release Geo support of Cool Widgets
+#### Step 4. Handle batch destroy
-- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
- - [ ] Cross out any steps related to testing on production GitLab.com, because Geo is not running on production GitLab.com at the moment.
- - [ ] Add a step to `Test replication and verification of Cool Widgets on a non-GDK-deployment. For example, using GitLab Environment Toolkit`.
- - [ ] Add a step to `Ping the Geo PM and EM to coordinate testing`. For example, you might add steps to generate Cool Widgets, and then a Geo engineer may take it from there.
-- [ ] In `ee/config/feature_flags/development/geo_cool_widget_replication.yml`, set `default_enabled: true`
+If batch destroy logic is implemented for a replicable, then that logic must be "replicated" by Geo secondaries. The easiest way to do this is use `Geo::BatchEventCreateWorker` to bulk insert a delete event for each replicable.
-- [ ] In `ee/app/replicators/geo/cool_widget_replicator.rb`, delete the `self.replication_enabled_by_default?` method:
+For example, if `FastDestroyAll` is used, then you may be able to [use `begin_fast_destroy` and `finalize_fast_destroy` hooks, like we did for uploads](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69763).
- ```ruby
- module Geo
- class CoolWidgetReplicator < Gitlab::Geo::Replicator
- ...
- # REMOVE THIS LINE IF IT IS NO LONGER NEEDED
- extend ::Gitlab::Utils::Override
+Or if a special service is used to batch delete records and their associated data, then you probably need to [hook into that service, like we did for job artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79530).
- # REMOVE THIS METHOD
- def self.replication_enabled_by_default?
- false
- end
- # REMOVE THIS METHOD
+As illustrated by the above two examples, batch destroy logic cannot be handled automatically by Geo secondaries without restricting the way other teams perform batch destroys. It is up to you to produce `Geo::BatchEventCreateWorker` attributes before the records are deleted, and then enqueue `Geo::BatchEventCreateWorker` after the records are deleted.
- ...
+- [ ] Ensure that any batch destroy of this replicable is replicated to secondary sites
+- [ ] Regardless of implementation details, please verify in specs that when the parent object is removed, the new `Geo::Event` records are created:
+
+```ruby
+ describe '#destroy' do
+ subject { create(:cool_widget) }
+
+ context 'when running in a Geo primary node' do
+ let_it_be(:primary) { create(:geo_node, :primary) }
+ let_it_be(:secondary) { create(:geo_node) }
+
+ it 'logs an event to the Geo event log when bulk removal is used', :sidekiq_inline do
+ stub_current_geo_node(primary)
+
+ expect { subject.project.destroy! }.to change(Geo::Event.where(replicable_name: :cool_widget, event_name: :deleted), :count).by(1)
+
+ payload = Geo::Event.where(replicable_name: :cool_widget, event_name: :deleted).last.payload
+
+ expect(payload['model_record_id']).to eq(subject.id)
+ expect(payload['blob_path']).to eq(subject.relative_path)
+ expect(payload['uploader_class']).to eq('CoolWidgetUploader')
+ end
end
end
- ```
+```
+### Release Geo support of Cool Widgets
+- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
+ - [ ] Cross out any steps related to testing on production GitLab.com, because Geo is not running on production GitLab.com at the moment.
+ - [ ] Add a step to `Test replication and verification of Cool Widgets on a non-GDK-deployment. For example, using GitLab Environment Toolkit`.
+ - [ ] Add a step to `Ping the Geo PM and EM to coordinate testing`. For example, you might add steps to generate Cool Widgets, and then a Geo engineer may take it from there.
+- [ ] In `ee/config/feature_flags/development/geo_cool_widget_replication.yml`, set `default_enabled: true`
- [ ] In `ee/app/graphql/types/geo/geo_node_type.rb`, remove the `feature_flag` option for the released type:
```ruby
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 0cbfd79c958..ff678666191 100644
--- a/.gitlab/issue_templates/Geo Replicate a new blob type.md
+++ b/.gitlab/issue_templates/Geo Replicate a new blob type.md
@@ -104,7 +104,7 @@ Geo secondary sites have a [Geo tracking database](https://gitlab.com/gitlab-org
- [ ] Run Geo tracking database migrations:
```shell
- bin/rake geo:db:migrate
+ bin/rake db:migrate:geo
```
- [ ] Be sure to commit the relevant changes in `ee/db/geo/structure.sql`
@@ -291,12 +291,6 @@ That's all of the required database changes.
model_record.file
end
- # The feature flag follows the format `geo_#{replicable_name}_replication`,
- # so here it would be `geo_cool_widget_replication`
- def self.replication_enabled_by_default?
- false
- end
-
override :verification_feature_flag_enabled?
def self.verification_feature_flag_enabled?
# We are adding verification at the same time as replication, so we
@@ -637,35 +631,49 @@ The GraphQL API is used by `Admin > Geo > Replication Details` views, and is dir
Individual Cool Widget replication and verification data should now be available via the GraphQL API.
-### Release Geo support of Cool Widgets
+#### Step 4. Handle batch destroy
-- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
- - [ ] Cross out any steps related to testing on production GitLab.com, because Geo is not running on production GitLab.com at the moment.
- - [ ] Add a step to `Test replication and verification of Cool Widgets on a non-GDK-deployment. For example, using GitLab Environment Toolkit`.
- - [ ] Add a step to `Ping the Geo PM and EM to coordinate testing`. For example, you might add steps to generate Cool Widgets, and then a Geo engineer may take it from there.
-- [ ] In `ee/config/feature_flags/development/geo_cool_widget_replication.yml`, set `default_enabled: true`
+If batch destroy logic is implemented for a replicable, then that logic must be "replicated" by Geo secondaries. The easiest way to do this is use `Geo::BatchEventCreateWorker` to bulk insert a delete event for each replicable.
-- [ ] In `ee/app/replicators/geo/cool_widget_replicator.rb`, delete the `self.replication_enabled_by_default?` method:
+For example, if `FastDestroyAll` is used, then you may be able to [use `begin_fast_destroy` and `finalize_fast_destroy` hooks, like we did for uploads](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69763).
- ```ruby
- module Geo
- class CoolWidgetReplicator < Gitlab::Geo::Replicator
- ...
- # REMOVE THIS LINE IF IT IS NO LONGER NEEDED
- extend ::Gitlab::Utils::Override
+Or if a special service is used to batch delete records and their associated data, then you probably need to [hook into that service, like we did for job artifacts](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79530).
- ...
- # REMOVE THIS METHOD
- def self.replication_enabled_by_default?
- false
- end
- # REMOVE THIS METHOD
+As illustrated by the above two examples, batch destroy logic cannot be handled automatically by Geo secondaries without restricting the way other teams perform batch destroys. It is up to you to produce `Geo::BatchEventCreateWorker` attributes before the records are deleted, and then enqueue `Geo::BatchEventCreateWorker` after the records are deleted.
- ...
+- [ ] Ensure that any batch destroy of this replicable is replicated to secondary sites
+- [ ] Regardless of implementation details, please verify in specs that when the parent object is removed, the new `Geo::Event` records are created:
+
+```ruby
+ describe '#destroy' do
+ subject { create(:cool_widget) }
+
+ context 'when running in a Geo primary node' do
+ let_it_be(:primary) { create(:geo_node, :primary) }
+ let_it_be(:secondary) { create(:geo_node) }
+
+ it 'logs an event to the Geo event log when bulk removal is used', :sidekiq_inline do
+ stub_current_geo_node(primary)
+
+ expect { subject.project.destroy! }.to change(Geo::Event.where(replicable_name: :cool_widget, event_name: :deleted), :count).by(1)
+
+ payload = Geo::Event.where(replicable_name: :cool_widget, event_name: :deleted).last.payload
+
+ expect(payload['model_record_id']).to eq(subject.id)
+ expect(payload['blob_path']).to eq(subject.relative_path)
+ expect(payload['uploader_class']).to eq('CoolWidgetUploader')
+ end
end
end
- ```
+```
+### Release Geo support of Cool Widgets
+
+- [ ] In the rollout issue you created when creating the feature flag, modify the Roll Out Steps:
+ - [ ] Cross out any steps related to testing on production GitLab.com, because Geo is not running on production GitLab.com at the moment.
+ - [ ] Add a step to `Test replication and verification of Cool Widgets on a non-GDK-deployment. For example, using GitLab Environment Toolkit`.
+ - [ ] Add a step to `Ping the Geo PM and EM to coordinate testing`. For example, you might add steps to generate Cool Widgets, and then a Geo engineer may take it from there.
+- [ ] In `ee/config/feature_flags/development/geo_cool_widget_replication.yml`, set `default_enabled: true`
- [ ] In `ee/app/graphql/types/geo/geo_node_type.rb`, remove the `feature_flag` option for the released type:
```ruby
diff --git a/.gitlab/issue_templates/Security developer workflow.md b/.gitlab/issue_templates/Security developer workflow.md
index 5c1b669a88f..4cced5a25fe 100644
--- a/.gitlab/issue_templates/Security developer workflow.md
+++ b/.gitlab/issue_templates/Security developer workflow.md
@@ -44,6 +44,7 @@ After your merge request has been approved according to our [approval guidelines
- [ ] Fill in any upgrade notes that users may need to take into account in the [details section](#details)
- [ ] Add Yes/No and further details if needed to the migration and settings columns in the [details section](#details)
- [ ] Add the nickname of the external user who found the issue (and/or HackerOne profile) to the Thanks row in the [details section](#details)
+- [ ] If this includes a breaking change, make sure it is mentioned for the relevant versions in [`doc/update/index.md`](https://gitlab.com/gitlab-org/security/gitlab/-/blob/master/doc/update/index.md#version-specific-upgrading-instructions)
## Summary
diff --git a/.gitlab/merge_request_templates/Default.md b/.gitlab/merge_request_templates/Default.md
index 9d5ab41afbe..90d3c37d6c0 100644
--- a/.gitlab/merge_request_templates/Default.md
+++ b/.gitlab/merge_request_templates/Default.md
@@ -42,3 +42,5 @@ Example below:
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.
+
+<!-- template sourced from https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Default.md -->
diff --git a/.gitlab/merge_request_templates/Documentation.md b/.gitlab/merge_request_templates/Documentation.md
index 49d1d0f79bf..cdc33b8aacb 100644
--- a/.gitlab/merge_request_templates/Documentation.md
+++ b/.gitlab/merge_request_templates/Documentation.md
@@ -8,7 +8,7 @@
## Author's checklist
-- [ ] Optional. Consider taking [the GitLab Technical Writing Fundamentals course](https://gitlab.edcast.com/pathways/ECL-02528ee2-c334-4e16-abf3-e9d8b8260de4).
+- [ ] Optional. Consider taking [the GitLab Technical Writing Fundamentals course](https://about.gitlab.com/handbook/engineering/ux/technical-writing/fundamentals/).
- [ ] Follow the:
- [Documentation process](https://docs.gitlab.com/ee/development/documentation/workflow.html).
- [Documentation guidelines](https://docs.gitlab.com/ee/development/documentation/).
diff --git a/.gitlab/merge_request_templates/Removals.md b/.gitlab/merge_request_templates/Removals.md
index 9d3738f63b5..0b7f1efe006 100644
--- a/.gitlab/merge_request_templates/Removals.md
+++ b/.gitlab/merge_request_templates/Removals.md
@@ -5,11 +5,11 @@
/milestone %
/assign `@EM/PM` (choose the DRI; remove backticks here, and below)
-**Be sure to link this MR to the relevant issue(s).**
+**Be sure to link this MR to the relevant issues.**
- Deprecation issue:
- Removal issue:
-- MR that removes the feature (optional):
+- MR that removed (or _will_ remove) the feature:
If there is no relevant deprecation issue, hit pause and:
@@ -45,6 +45,7 @@ Please review the [guidelines for removals](https://about.gitlab.com/handbook/ma
- [ ] Follow the process to [create a removal YAML file](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-removal-entry).
- [ ] Add reviewers by the 10th.
- [ ] When ready to be merged and not later than the 15th, add the ~ready label and @ message the TW for final review and merge.
+ - Removal notices should not be merged before the code is removed from the product. Do not mark ~ready until the removal is complete, or you are certain it will be completed within the current milestone and released. If PMs are not sure, they should confirm with their Engineering Manager.
## Reviewers
@@ -66,13 +67,15 @@ with the same process as regular docs MRs. Add suggestions as needed, @ message
the PM to inform them the first review is complete, and remove
yourself as a reviewer if it's not yet ready for merge.
+**Removal notices should not be merged before the code is removed from the product.**
+
<details>
<summary>Expand for Details</summary>
- [ ] Title:
- Length limit: 7 words (not including articles or prepositions).
- Capitalization: ensure the title is [sentence cased](https://design.gitlab.com/content/punctuation#case).
- - No Markdown `` `code` `` formatting in the title, as it doesn't render correctly in the release post.
+ - Rewrite to exclude the words `removal` and `remove` if necessary.
- [ ] Consistency:
- Ensure that all resources (docs, removal, etc.) refer to the feature with the same term / feature name.
- [ ] Content:
diff --git a/.gitpod.yml b/.gitpod.yml
index 6ddd090f924..639fe4352e0 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -22,8 +22,6 @@ tasks:
gdk config set webpack.host 127.0.0.1
gdk config set webpack.static false
gdk config set webpack.live_reload false
- # make documentation builds available
- gdk config set gitlab_docs.enabled true
# reconfigure GDK
echo "$(date) – Reconfiguring GDK" | tee -a /workspace/startup.log
gdk reconfigure
diff --git a/.haml-lint.yml b/.haml-lint.yml
index 75139cb43dd..c0c0e57e0f2 100644
--- a/.haml-lint.yml
+++ b/.haml-lint.yml
@@ -8,8 +8,9 @@ exclude:
- 'spec/**/*'
- 'ee/spec/**/*'
require:
- - './haml_lint/linter/no_plain_nodes.rb'
- './haml_lint/linter/documentation_links.rb'
+ - './haml_lint/linter/inline_javascript.rb'
+ - './haml_lint/linter/no_plain_nodes.rb'
linters:
AltText:
diff --git a/.projections.json.example b/.projections.json.example
index eff09c73140..dc1b42b917a 100644
--- a/.projections.json.example
+++ b/.projections.json.example
@@ -1,4 +1,5 @@
{
+ "ee/*": { "type": "ee" },
"config/initializers/*.rb": {
"alternate": "spec/initializers/{}_spec.rb",
"type": "source"
@@ -7,6 +8,82 @@
"alternate": "config/initializers/{}.rb",
"type": "test"
},
+ "app/channels/*.rb": {
+ "related": "ee/app/channels/ee/{}.rb",
+ "type": "source"
+ },
+ "app/components/*.rb": {
+ "related": "ee/app/components/ee/{}.rb",
+ "type": "source"
+ },
+ "app/controllers/*.rb": {
+ "related": "ee/app/controllers/ee/{}.rb",
+ "type": "source"
+ },
+ "app/enums/*.rb": {
+ "related": "ee/app/enums/ee/{}.rb",
+ "type": "source"
+ },
+ "app/events/*.rb": {
+ "related": "ee/app/events/ee/{}.rb",
+ "type": "source"
+ },
+ "app/experiments/*.rb": {
+ "related": "ee/app/experiments/ee/{}.rb",
+ "type": "source"
+ },
+ "app/finders/*.rb": {
+ "related": "ee/app/finders/ee/{}.rb",
+ "type": "source"
+ },
+ "app/graphql/*.rb": {
+ "related": "ee/app/graphql/ee/{}.rb",
+ "type": "source"
+ },
+ "app/helpers/*.rb": {
+ "related": "ee/app/helpers/ee/{}.rb",
+ "type": "source"
+ },
+ "app/mailers/*.rb": {
+ "related": "ee/app/mailers/ee/{}.rb",
+ "type": "source"
+ },
+ "app/models/*.rb": {
+ "related": "ee/app/models/ee/{}.rb",
+ "type": "source"
+ },
+ "app/policies/*.rb": {
+ "related": "ee/app/policies/ee/{}.rb",
+ "type": "source"
+ },
+ "app/presenters/*.rb": {
+ "related": "ee/app/presenters/ee/{}.rb",
+ "type": "source"
+ },
+ "app/serializers/*.rb": {
+ "related": "ee/app/serializers/ee/{}.rb",
+ "type": "source"
+ },
+ "app/services/*.rb": {
+ "related": "ee/app/services/ee/{}.rb",
+ "type": "source"
+ },
+ "app/uploaders/*.rb": {
+ "related": "ee/app/uploaders/ee/{}.rb",
+ "type": "source"
+ },
+ "app/validators/*.rb": {
+ "related": "ee/app/validators/ee/{}.rb",
+ "type": "source"
+ },
+ "app/views/*.rb": {
+ "related": "ee/app/views/ee/{}.rb",
+ "type": "source"
+ },
+ "app/workers/*.rb": {
+ "related": "ee/app/workers/ee/{}.rb",
+ "type": "source"
+ },
"app/*.rb": {
"alternate": "spec/{}_spec.rb",
"type": "source"
diff --git a/.rubocop.yml b/.rubocop.yml
index 50729efd1ce..cb70ff168be 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -72,6 +72,11 @@ Lint/LastKeywordArgument:
Enabled: true
Safe: false
+Lint/EmptyFile:
+ Exclude:
+ - 'db/seeds.rb'
+ - 'ee/db/geo/seeds.rb'
+
# This cop checks whether some constant value isn't a
# mutable literal (e.g. array or hash).
Style/MutableConstant:
@@ -238,6 +243,11 @@ Rails/ApplicationRecord:
- ee/db/**/*.rb
- ee/spec/**/*.rb
+Rails/ActiveRecordCallbacksOrder:
+ Include:
+ - app/models/**/*.rb
+ - ee/app/models/**/*.rb
+
Cop/DefaultScope:
Enabled: true
@@ -253,6 +263,11 @@ Rails/IndexBy:
Exclude:
- 'tooling/danger/**/*.rb'
+Rails/InverseOf:
+ Include:
+ - app/models/**/*.rb
+ - ee/app/models/**/*.rb
+
# This is currently exiting with a rubocop exception error and should be
# resolved hopefully a future update
# An error occurred while Rails/UniqueValidationWithoutIndex cop was inspecting
@@ -261,6 +276,16 @@ Rails/IndexBy:
Rails/UniqueValidationWithoutIndex:
Enabled: false
+Rails/HasManyOrHasOneDependent:
+ Include:
+ - app/models/**/*.rb
+ - ee/app/models/**/*.rb
+
+Rails/HelperInstanceVariable:
+ Include:
+ - app/helpers/**/*.rb
+ - ee/app/helpers/**/*.rb
+
# GitLab ###################################################################
Gitlab/ModuleWithInstanceVariables:
@@ -329,17 +354,11 @@ GitlabSecurity/PublicSend:
Database/MultipleDatabases:
Enabled: true
- Include:
- - 'app/**/*.rb'
- - 'ee/app/**/*.rb'
- - 'lib/**/*.rb'
- - 'ee/lib/**/*.rb'
- - 'spec/**/*.rb'
- - 'ee/spec/**/*.rb'
Exclude:
- 'ee/db/**/*.rb'
- 'spec/migrations/**/*.rb'
- - 'lib/gitlab/background_migration/**/*.rb'
+ - 'lib/tasks/gitlab/db.rake'
+ - 'ee/lib/ee/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/background_migration/**/*.rb'
- 'spec/lib/gitlab/database/**/*.rb'
@@ -691,6 +710,7 @@ Gitlab/NamespacedClass:
- 'scripts/**/*'
- 'spec/migrations/**/*.rb'
- 'app/experiments/**/*_experiment.rb'
+ - 'ee/app/experiments/**/*_experiment.rb'
Lint/HashCompareByIdentity:
Enabled: true
@@ -747,3 +767,9 @@ Performance/ActiveRecordSubtransactionMethods:
Exclude:
- 'spec/**/*.rb'
- 'ee/spec/**/*.rb'
+
+Migration/BackgroundMigrationBaseClass:
+ Enabled: false
+
+Style/ClassAndModuleChildren:
+ Enabled: true
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 78e462cdc7a..72ce67b08da 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,407 +1,7 @@
-# This configuration was generated by
-# `rubocop --auto-gen-config`
-# on 2021-02-24 14:52:20 UTC using RuboCop version 0.93.1.
-# The point is for the user to remove these configuration records
-# one by one as the offenses are removed from the code base.
-# Note that changes in the inspected code, or installation of new
-# versions of RuboCop, may require this file to be generated again.
-
-# Offense count: 1
-Gitlab/PolicyRuleBoolean:
- Exclude:
- - 'ee/app/policies/ee/identity_provider_policy.rb'
-
-# Offense count: 2
-# Configuration parameters: AllowComments.
-Lint/EmptyFile:
- Exclude:
- - 'db/seeds.rb'
- - 'ee/db/geo/seeds.rb'
-
-# Offense count: 13
-Lint/MixedRegexpCaptureTypes:
- Exclude:
- - 'app/models/alert_management/alert.rb'
- - 'app/models/integrations/ewm.rb'
- - 'app/uploaders/file_uploader.rb'
- - 'ee/lib/gitlab/code_owners/reference_extractor.rb'
- - 'lib/gitlab/ci/pipeline/expression/lexeme/string.rb'
- - 'lib/gitlab/dependency_linker/gemfile_linker.rb'
- - 'lib/gitlab/diff/suggestions_parser.rb'
- - 'lib/gitlab/github_import/representation/note.rb'
- - 'lib/gitlab/metrics/system.rb'
- - 'lib/gitlab/request_profiler/profile.rb'
- - 'lib/gitlab/slash_commands/issue_move.rb'
- - 'lib/gitlab/slash_commands/issue_new.rb'
- - 'lib/gitlab/slash_commands/run.rb'
-
-# Offense count: 200
-# Cop supports --auto-correct.
-Lint/RedundantCopDisableDirective:
- Enabled: false
-
-# Offense count: 22
-# Cop supports --auto-correct.
-# Configuration parameters: AllowComments.
-Lint/UselessMethodDefinition:
- Enabled: false
-
-# Offense count: 321
-# Configuration parameters: ForbiddenDelimiters.
-# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
-Naming/HeredocDelimiterNaming:
- Enabled: false
-
-# Offense count: 218
-# Cop supports --auto-correct.
-# Configuration parameters: PreferredName.
-Naming/RescuedExceptionsVariableName:
- Enabled: false
-
-# Offense count: 1
-# Cop supports --auto-correct.
-Performance/AncestorsInclude:
- Exclude:
- - 'lib/gitlab/ci/config/extendable/entry.rb'
-
-# Offense count: 40
-# Cop supports --auto-correct.
-Performance/BlockGivenWithExplicitBlock:
- Enabled: false
-
-# Offense count: 29
-# Configuration parameters: MinSize.
-Performance/CollectionLiteralInLoop:
- Enabled: false
-
-# Offense count: 41
-# Cop supports --auto-correct.
-Performance/ConstantRegexp:
- Enabled: false
-
-# Offense count: 121
-Performance/MethodObjectAsBlock:
- Enabled: false
-
-# Offense count: 15209
-# Configuration parameters: Prefixes.
-# Prefixes: when, with, without
-RSpec/ContextWording:
- Enabled: false
-
-# Offense count: 1428
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: method_call, block
-RSpec/ExpectChange:
- Enabled: false
-
-# Offense count: 930
-RSpec/ExpectInHook:
- Enabled: false
-
-# Offense count: 2352
-# Cop supports --auto-correct.
-# Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers.
-# SupportedStyles: inflected, explicit
-RSpec/PredicateMatcher:
- Enabled: false
-
-# Offense count: 118
-RSpec/RepeatedExampleGroupBody:
- Enabled: false
-
-# Offense count: 225
-RSpec/RepeatedExampleGroupDescription:
- Enabled: false
-
-# Offense count: 667
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: and_return, block
-RSpec/ReturnFromStub:
- Enabled: false
-
-# Offense count: 610
-# Cop supports --auto-correct.
-RSpec/ScatteredLet:
- Enabled: false
-
-# Offense count: 26
-# Cop supports --auto-correct.
-# Configuration parameters: Include.
-# Include: app/models/**/*.rb
-Rails/ActiveRecordCallbacksOrder:
- Enabled: false
-
-# Offense count: 10
-# Cop supports --auto-correct.
-Rails/ApplicationController:
- Exclude:
- - 'app/controllers/acme_challenges_controller.rb'
- - 'app/controllers/chaos_controller.rb'
- - 'app/controllers/health_controller.rb'
- - 'app/controllers/metrics_controller.rb'
- - 'ee/app/controllers/oauth/geo_auth_controller.rb'
- - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
- - 'lib/gitlab/base_doorkeeper_controller.rb'
- - 'lib/gitlab/request_forgery_protection.rb'
- - 'spec/controllers/concerns/continue_params_spec.rb'
- - 'spec/lib/marginalia_spec.rb'
-
-# Offense count: 155
-# Cop supports --auto-correct.
-Rails/ContentTag:
- Enabled: false
-
-# Offense count: 313
-# Configuration parameters: Include.
-# Include: db/migrate/*.rb
-Rails/CreateTableWithTimestamps:
- Enabled: false
-
-# Offense count: 361
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: slashes, arguments
-Rails/FilePath:
- Enabled: false
-
-# Offense count: 354
-# Configuration parameters: Include.
-# Include: app/models/**/*.rb
-Rails/HasManyOrHasOneDependent:
- Enabled: false
-
-# Offense count: 537
-# Configuration parameters: Include.
-# Include: app/helpers/**/*.rb
-Rails/HelperInstanceVariable:
- Enabled: false
-
-# Offense count: 47
-# Cop supports --auto-correct.
-Rails/IndexWith:
- Enabled: false
-
-# Offense count: 118
-# Configuration parameters: Include.
-# Include: app/models/**/*.rb
-Rails/InverseOf:
- Enabled: false
-
-# Offense count: 62
-# Configuration parameters: Include.
-# Include: app/controllers/**/*.rb
-Rails/LexicallyScopedActionFilter:
- Enabled: false
-
-
-# Offense count: 1
-# Cop supports --auto-correct.
-# Configuration parameters: Include.
-# Include: app/mailers/**/*.rb
-Rails/MailerName:
- Exclude:
- - 'app/mailers/notify.rb'
-
-# Offense count: 51
-# Cop supports --auto-correct.
-Rails/NegateInclude:
- Enabled: false
-
-# Offense count: 46
-# Cop supports --auto-correct.
-Rails/Pick:
- Enabled: false
-
-# Offense count: 123
-# Cop supports --auto-correct.
-Rails/Pluck:
- Enabled: false
-
-# Offense count: 39
-# Cop supports --auto-correct.
-# Configuration parameters: Include.
-# Include: **/Rakefile, **/*.rake
-Rails/RakeEnvironment:
- Enabled: false
-
-# Offense count: 62
-# Cop supports --auto-correct.
-Rails/RedundantForeignKey:
- Enabled: false
-
-# Offense count: 1144
-# Configuration parameters: ForbiddenMethods, AllowedMethods.
-# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
-Rails/SkipsModelValidations:
- Enabled: false
-
-# Offense count: 278
-# Cop supports --auto-correct.
-Rails/SquishedSQLHeredocs:
- Enabled: false
-
-# Offense count: 44
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: exists, where
-Rails/WhereExists:
- Enabled: false
-
-# Offense count: 240
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: separated, grouped
-Style/AccessorGrouping:
- Enabled: false
-
-# Offense count: 188
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: percent_q, bare_percent
-Style/BarePercentLiterals:
- Enabled: false
-
-# Offense count: 42
-# Cop supports --auto-correct.
-Style/CaseLikeIf:
- Enabled: false
-
-# Offense count: 55
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: empty, nil, both
-Style/EmptyElse:
- Enabled: false
-
-# Offense count: 205
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: compact, expanded
-Style/EmptyMethod:
- Enabled: false
-
-# Offense count: 118
-# Cop supports --auto-correct.
-Style/ExplicitBlockArgument:
- Enabled: false
-
-# Offense count: 581
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: format, sprintf, percent
-Style/FormatString:
- Enabled: false
-
-# Offense count: 897
-# Configuration parameters: MinBodyLength.
-Style/GuardClause:
- Enabled: false
-
-# Offense count: 59
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: braces, no_braces
-Style/HashAsLastArrayItem:
- Enabled: false
-
-# Offense count: 70
-# Cop supports --auto-correct.
-Style/HashEachMethods:
- Enabled: false
-
-# Offense count: 34
-# Configuration parameters: AllowIfModifier.
-Style/IfInsideElse:
- Enabled: false
-
-# Offense count: 1934
-# Cop supports --auto-correct.
-Style/IfUnlessModifier:
- Enabled: false
-
-# Offense count: 64
-# Cop supports --auto-correct.
-Style/KeywordParametersOrder:
- Enabled: false
-
-# Offense count: 458
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: line_count_dependent, lambda, literal
-Style/Lambda:
- Enabled: false
-
-# Offense count: 21
-Style/MissingRespondToMissing:
- Enabled: false
-
-# Offense count: 35
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle, MinBodyLength.
-# SupportedStyles: skip_modifier_ifs, always
-Style/Next:
- Enabled: false
-
-# Offense count: 101
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedOctalStyle.
-# SupportedOctalStyles: zero_with_o, zero_only
-Style/NumericLiteralPrefix:
- Enabled: false
-
-# Offense count: 2698
-# Cop supports --auto-correct.
-# Configuration parameters: PreferredDelimiters.
-Style/PercentLiteralDelimiters:
- Enabled: false
-
-# Offense count: 206
-# Cop supports --auto-correct.
-Style/RedundantInterpolation:
- Enabled: false
-
-# Offense count: 279
-# Cop supports --auto-correct.
-Style/RedundantRegexpEscape:
- Enabled: false
-
-# Offense count: 968
-# Cop supports --auto-correct.
-Style/RedundantSelf:
- Enabled: false
-
-# Offense count: 53
-# Cop supports --auto-correct.
-Style/RescueModifier:
- Enabled: false
-
-# Offense count: 123
-# Cop supports --auto-correct.
-Style/SingleArgumentDig:
- Enabled: false
-
-# Offense count: 63
-# Configuration parameters: AllowModifier.
-Style/SoleNestedConditional:
- Enabled: false
-
-# Offense count: 562
-# Cop supports --auto-correct.
-Style/StringConcatenation:
- Enabled: false
-
-# Offense count: 109
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: single_quotes, double_quotes
-Style/StringLiteralsInInterpolation:
- Enabled: false
-
-# Offense count: 293
-# Cop supports --auto-correct.
-# Configuration parameters: IgnoredMethods.
-# IgnoredMethods: respond_to, define_method
-Style/SymbolProc:
- Enabled: false
+# This configuration is no longer used.
+#
+# The RuboCop TODO lists are located in `.rubocop_todo/**/*.yml`.
+#
+# Please use `rake rubocop:todo:generate` to generate TODOs.
+#
+# See https://docs.gitlab.com/ee/development/rake_tasks.html#generate-initial-rubocop-todo-list
diff --git a/.rubocop_todo/database/multiple_databases.yml b/.rubocop_todo/database/multiple_databases.yml
index 27e28128a98..1d0085e1ba6 100644
--- a/.rubocop_todo/database/multiple_databases.yml
+++ b/.rubocop_todo/database/multiple_databases.yml
@@ -1,33 +1,28 @@
---
Database/MultipleDatabases:
Exclude:
- - ee/spec/services/ee/merge_requests/update_service_spec.rb
- - lib/backup/database.rb
- - lib/backup/manager.rb
- - lib/gitlab/database/load_balancing/load_balancer.rb
- - lib/gitlab/database/load_balancing.rb
- - lib/gitlab/database/load_balancing/sticking.rb
- - lib/gitlab/database/migrations/observers/migration_observer.rb
- - lib/gitlab/database/migrations/observers/query_log.rb
- - lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb
- - lib/gitlab/database.rb
- - lib/gitlab/health_checks/db_check.rb
- - lib/gitlab/seeder.rb
- - spec/db/schema_spec.rb
- - spec/initializers/database_config_spec.rb
- - spec/lib/backup/manager_spec.rb
- - spec/lib/gitlab/database_spec.rb
- - spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
- - spec/lib/gitlab/profiler_spec.rb
- - spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb
- - spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb
- - spec/support/caching.rb
- - spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb
- - spec/support/helpers/database_connection_helpers.rb
- - spec/support/helpers/database/database_helpers.rb
- - spec/support/helpers/database/table_schema_helpers.rb
- - spec/support/helpers/migrations_helpers.rb
- - spec/support/helpers/query_recorder.rb
- - spec/support/helpers/usage_data_helpers.rb
- - spec/tasks/gitlab/backup_rake_spec.rb
- - spec/tasks/gitlab/db_rake_spec.rb
+ - 'config/initializers/active_record_data_types.rb'
+ - 'db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb'
+ - 'db/post_migrate/20210811122206_update_external_project_bots.rb'
+ - 'db/post_migrate/20210812013042_remove_duplicate_project_authorizations.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/gitlab/background_migration/backfill_projects_with_coverage.rb'
+ - 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/initializers/database_config_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/profiler_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb'
+ - 'spec/support/caching.rb'
+ - 'spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb'
+ - 'spec/support/helpers/database/database_helpers.rb'
+ - 'spec/support/helpers/database/table_schema_helpers.rb'
+ - 'spec/support/helpers/migrations_helpers.rb'
+ - 'spec/support/helpers/query_recorder.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index 73f4a5deec0..0f974bc5002 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -1,1198 +1,1326 @@
---
Gitlab/NamespacedClass:
Exclude:
- - app/channels/issues_channel.rb
- - app/controllers/abuse_reports_controller.rb
- - app/controllers/acme_challenges_controller.rb
- - app/controllers/application_controller.rb
- - app/controllers/autocomplete_controller.rb
- - app/controllers/chaos_controller.rb
- - app/controllers/confirmations_controller.rb
- - app/controllers/dashboard_controller.rb
- - app/controllers/graphql_controller.rb
- - app/controllers/groups_controller.rb
- - app/controllers/health_check_controller.rb
- - app/controllers/health_controller.rb
- - app/controllers/help_controller.rb
- - app/controllers/ide_controller.rb
- - app/controllers/invites_controller.rb
- - app/controllers/jwks_controller.rb
- - app/controllers/jwt_controller.rb
- - app/controllers/metrics_controller.rb
- - app/controllers/notification_settings_controller.rb
- - app/controllers/omniauth_callbacks_controller.rb
- - app/controllers/passwords_controller.rb
- - app/controllers/profiles_controller.rb
- - app/controllers/projects_controller.rb
- - app/controllers/registrations_controller.rb
- - app/controllers/root_controller.rb
- - app/controllers/runner_setup_controller.rb
- - app/controllers/search_controller.rb
- - app/controllers/sent_notifications_controller.rb
- - app/controllers/sessions_controller.rb
- - app/controllers/snippets_controller.rb
- - app/controllers/uploads_controller.rb
- - app/controllers/users_controller.rb
- - app/controllers/whats_new_controller.rb
- - app/finders/abuse_reports_finder.rb
- - app/finders/access_requests_finder.rb
- - app/finders/admin/projects_finder.rb
- - app/finders/applications_finder.rb
- - app/finders/award_emojis_finder.rb
- - app/finders/branches_finder.rb
- - app/finders/cluster_ancestors_finder.rb
- - app/finders/clusters_finder.rb
- - app/finders/container_repositories_finder.rb
- - app/finders/context_commits_finder.rb
- - app/finders/contributed_projects_finder.rb
- - app/finders/deployments_finder.rb
- - app/finders/events_finder.rb
- - app/finders/feature_flags_finder.rb
- - app/finders/feature_flags_user_lists_finder.rb
- - app/finders/fork_projects_finder.rb
- - app/finders/fork_targets_finder.rb
- - app/finders/freeze_periods_finder.rb
- - app/finders/git_refs_finder.rb
- - app/finders/group_descendants_finder.rb
- - app/finders/group_finder.rb
- - app/finders/group_members_finder.rb
- - app/finders/group_projects_finder.rb
- - app/finders/groups_finder.rb
- - app/finders/issuable_finder.rb
- - app/finders/issuable_finder/params.rb
- - app/finders/issues_finder.rb
- - app/finders/issues_finder/params.rb
- - app/finders/joined_groups_finder.rb
- - app/finders/keys_finder.rb
- - app/finders/labels_finder.rb
- - app/finders/lfs_pointers_finder.rb
- - app/finders/license_template_finder.rb
- - app/finders/members_finder.rb
- - app/finders/merge_request_target_project_finder.rb
- - app/finders/merge_requests_finder.rb
- - app/finders/merge_requests_finder/params.rb
- - app/finders/milestones_finder.rb
- - app/finders/notes_finder.rb
- - app/finders/pending_todos_finder.rb
- - app/finders/personal_access_tokens_finder.rb
- - app/finders/personal_projects_finder.rb
- - app/finders/projects_finder.rb
- - app/finders/prometheus_metrics_finder.rb
- - app/finders/protected_branches_finder.rb
- - app/finders/releases_finder.rb
- - app/finders/resource_milestone_event_finder.rb
- - app/finders/resource_state_event_finder.rb
- - app/finders/sentry_issue_finder.rb
- - app/finders/serverless_domain_finder.rb
- - app/finders/snippets_finder.rb
- - app/finders/starred_projects_finder.rb
- - app/finders/tags_finder.rb
- - app/finders/template_finder.rb
- - app/finders/todos_finder.rb
- - app/finders/union_finder.rb
- - app/finders/uploader_finder.rb
- - app/finders/user_finder.rb
- - app/finders/user_group_notification_settings_finder.rb
- - app/finders/user_groups_counter.rb
- - app/finders/user_recent_events_finder.rb
- - app/finders/users_finder.rb
- - app/finders/users_star_projects_finder.rb
- - app/finders/users_with_pending_todos_finder.rb
- - app/graphql/gitlab_schema.rb
- - app/mailers/abuse_report_mailer.rb
- - app/mailers/application_mailer.rb
- - app/mailers/devise_mailer.rb
- - app/mailers/email_rejection_mailer.rb
- - app/mailers/notify.rb
- - app/mailers/previews/devise_mailer_preview.rb
- - app/mailers/previews/email_rejection_mailer_preview.rb
- - app/mailers/previews/notify_preview.rb
- - app/mailers/previews/repository_check_mailer_preview.rb
- - app/mailers/repository_check_mailer.rb
- - app/models/ability.rb
- - app/models/abuse_report.rb
- - app/models/active_session.rb
- - app/models/appearance.rb
- - app/models/application_record.rb
- - app/models/application_setting.rb
- - app/models/application_setting/term.rb
- - app/models/approval.rb
- - app/models/audit_event.rb
- - app/models/authentication_event.rb
- - app/models/award_emoji.rb
- - app/models/badge.rb
- - app/models/badges/group_badge.rb
- - app/models/badges/project_badge.rb
- - app/models/blob.rb
- - app/models/board.rb
- - app/models/board_group_recent_visit.rb
- - app/models/board_project_recent_visit.rb
- - app/models/broadcast_message.rb
- - app/models/bulk_import.rb
- - app/models/chat_name.rb
- - app/models/chat_team.rb
- - app/models/ci_platform_metric.rb
- - app/models/commit.rb
- - app/models/commit_collection.rb
- - app/models/commit_range.rb
- - app/models/commit_status.rb
- - app/models/commit_user_mention.rb
- - app/models/commit_with_pipeline.rb
- - app/models/compare.rb
- - app/models/concerns/uniquify.rb
- - app/models/container_expiration_policy.rb
- - app/models/container_repository.rb
- - app/models/context_commits_diff.rb
- - app/models/custom_emoji.rb
- - app/models/data_list.rb
- - app/models/deploy_key.rb
- - app/models/deploy_keys_project.rb
- - app/models/deploy_token.rb
- - app/models/deployment.rb
- - app/models/deployment_cluster.rb
- - app/models/deployment_merge_request.rb
- - app/models/deployment_metrics.rb
- - app/models/description_version.rb
- - app/models/design_user_mention.rb
- - app/models/diff_discussion.rb
- - app/models/diff_note.rb
- - app/models/diff_note_position.rb
- - app/models/directly_addressed_user.rb
- - app/models/discussion.rb
- - app/models/discussion_note.rb
- - app/models/draft_note.rb
- - app/models/email.rb
- - app/models/environment.rb
- - app/models/environment_status.rb
- - app/models/epic.rb
- - app/models/event.rb
- - app/models/event_collection.rb
- - app/models/experiment.rb
- - app/models/experiment_subject.rb
- - app/models/experiment_user.rb
- - app/models/exported_protected_branch.rb
- - app/models/external_issue.rb
- - app/models/external_pull_request.rb
- - app/models/fork_network.rb
- - app/models/fork_network_member.rb
- - app/models/generic_commit_status.rb
- - app/models/gpg_key.rb
- - app/models/gpg_key_subkey.rb
- - app/models/gpg_signature.rb
- - app/models/grafana_integration.rb
- - app/models/group.rb
- - app/models/group_custom_attribute.rb
- - app/models/group_deploy_key.rb
- - app/models/group_deploy_keys_group.rb
- - app/models/group_deploy_token.rb
- - app/models/group_group_link.rb
- - app/models/group_import_state.rb
- - app/models/group_label.rb
- - app/models/guest.rb
- - app/models/hooks/active_hook_filter.rb
- - app/models/hooks/project_hook.rb
- - app/models/hooks/service_hook.rb
- - app/models/hooks/system_hook.rb
- - app/models/hooks/web_hook.rb
- - app/models/hooks/web_hook_log.rb
- - app/models/identity.rb
- - app/models/identity/uniqueness_scopes.rb
- - app/models/import_export_upload.rb
- - app/models/import_failure.rb
- - app/models/individual_note_discussion.rb
- - app/models/instance_configuration.rb
- - app/models/instance_metadata.rb
- - app/models/integration.rb
- - app/models/internal_id.rb
- - app/models/issuable_severity.rb
- - app/models/issue.rb
- - app/models/issue/metrics.rb
- - app/models/issue_assignee.rb
- - app/models/issue_collection.rb
- - app/models/issue_email_participant.rb
- - app/models/issue_link.rb
- - app/models/issue_user_mention.rb
- - app/models/iteration.rb
- - app/models/jira_connect_installation.rb
- - app/models/jira_connect_subscription.rb
- - app/models/jira_import_state.rb
- - app/models/key.rb
- - app/models/label.rb
- - app/models/label_link.rb
- - app/models/label_note.rb
- - app/models/label_priority.rb
- - app/models/legacy_diff_discussion.rb
- - app/models/legacy_diff_note.rb
- - app/models/lfs_download_object.rb
- - app/models/lfs_file_lock.rb
- - app/models/lfs_object.rb
- - app/models/lfs_objects_project.rb
- - app/models/license_template.rb
- - app/models/list.rb
- - app/models/list_user_preference.rb
- - app/models/member.rb
- - app/models/members/group_member.rb
- - app/models/members/last_group_owner_assigner.rb
- - app/models/members/project_member.rb
- - app/models/members/member_task.rb
- - app/models/members_preloader.rb
- - app/models/merge_request.rb
- - app/models/merge_request_assignee.rb
- - app/models/merge_request_context_commit.rb
- - app/models/merge_request_context_commit_diff_file.rb
- - app/models/merge_request_diff.rb
- - app/models/merge_request_diff_commit.rb
- - app/models/merge_request_diff_file.rb
- - app/models/merge_request_reviewer.rb
- - app/models/merge_request_user_mention.rb
- - app/models/merge_requests_closing_issues.rb
- - app/models/milestone.rb
- - app/models/milestone_note.rb
- - app/models/milestone_release.rb
- - app/models/namespace.rb
- - app/models/namespace/traversal_hierarchy.rb
- - app/models/namespace_onboarding_action.rb
- - app/models/namespace_setting.rb
- - app/models/note.rb
- - app/models/note_diff_file.rb
- - app/models/notification_reason.rb
- - app/models/notification_recipient.rb
- - app/models/notification_setting.rb
- - app/models/oauth_access_grant.rb
- - app/models/oauth_access_token.rb
- - app/models/out_of_context_discussion.rb
- - app/models/onboarding_progress.rb
- - app/models/pages_deployment.rb
- - app/models/pages_domain.rb
- - app/models/pages_domain_acme_order.rb
- - app/models/personal_access_token.rb
- - app/models/personal_snippet.rb
- - app/models/plan.rb
- - app/models/plan_limits.rb
- - app/models/pool_repository.rb
- - app/models/product_analytics_event.rb
- - app/models/programming_language.rb
- - app/models/project.rb
- - app/models/project_authorization.rb
- - app/models/project_auto_devops.rb
- - app/models/project_ci_cd_setting.rb
- - app/models/project_custom_attribute.rb
- - app/models/project_daily_statistic.rb
- - app/models/project_deploy_token.rb
- - app/models/project_export_job.rb
- - app/models/project_feature.rb
- - app/models/project_feature_usage.rb
- - app/models/project_group_link.rb
- - app/models/project_import_data.rb
- - app/models/project_import_state.rb
- - app/models/project_label.rb
- - app/models/project_metrics_setting.rb
- - app/models/project_pages_metadatum.rb
- - app/models/project_repository.rb
- - app/models/project_repository_storage_move.rb
- - app/models/project_setting.rb
- - 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
- - app/models/prometheus_metric.rb
- - app/models/protectable_dropdown.rb
- - app/models/protected_branch.rb
- - app/models/protected_tag.rb
- - app/models/push_event.rb
- - app/models/push_event_payload.rb
- - app/models/raw_usage_data.rb
- - app/models/readme_blob.rb
- - app/models/redirect_route.rb
- - app/models/ref_matcher.rb
- - app/models/release.rb
- - app/models/release_highlight.rb
- - app/models/remote_mirror.rb
- - app/models/repository.rb
- - app/models/repository_language.rb
- - app/models/resource_event.rb
- - app/models/resource_label_event.rb
- - app/models/resource_milestone_event.rb
- - app/models/resource_state_event.rb
- - app/models/resource_timebox_event.rb
- - app/models/review.rb
- - app/models/route.rb
- - app/models/self_managed_prometheus_alert_event.rb
- - app/models/sent_notification.rb
- - app/models/sentry_issue.rb
- - app/models/service_desk_setting.rb
- - app/models/service_list.rb
- - app/models/shard.rb
- - app/models/snippet.rb
- - app/models/snippet_blob.rb
- - app/models/snippet_input_action.rb
- - app/models/snippet_input_action_collection.rb
- - app/models/snippet_repository.rb
- - app/models/snippet_repository_storage_move.rb
- - app/models/snippet_statistics.rb
- - app/models/snippet_user_mention.rb
- - app/models/spam_log.rb
- - app/models/ssh_host_key.rb
- - app/models/state_note.rb
- - app/models/subscription.rb
- - app/models/suggestion.rb
- - app/models/synthetic_note.rb
- - app/models/system_note_metadata.rb
- - app/models/term_agreement.rb
- - app/models/timelog.rb
- - app/models/todo.rb
- - app/models/tree.rb
- - app/models/trending_project.rb
- - app/models/u2f_registration.rb
- - app/models/upload.rb
- - app/models/user.rb
- - app/models/user_agent_detail.rb
- - app/models/user_canonical_email.rb
- - app/models/user_custom_attribute.rb
- - app/models/user_detail.rb
- - app/models/user_highest_role.rb
- - app/models/user_interacted_project.rb
- - app/models/user_mention.rb
- - app/models/user_preference.rb
- - app/models/user_status.rb
- - app/models/user_synced_attributes_metadata.rb
- - app/models/users_star_project.rb
- - app/models/users_statistics.rb
- - app/models/vulnerability.rb
- - app/models/web_ide_terminal.rb
- - app/models/webauthn_registration.rb
- - app/models/wiki.rb
- - app/models/wiki_directory.rb
- - app/models/wiki_page.rb
- - app/models/wiki_page/meta.rb
- - app/models/wiki_page/slug.rb
- - app/models/work_item.rb
- - app/models/x509_certificate.rb
- - app/models/x509_commit_signature.rb
- - app/models/x509_issuer.rb
- - app/models/zoom_meeting.rb
- - app/policies/application_setting/term_policy.rb
- - app/policies/award_emoji_policy.rb
- - app/policies/base_policy.rb
- - app/policies/blob_policy.rb
- - app/policies/board_policy.rb
- - app/policies/commit_policy.rb
- - app/policies/commit_status_policy.rb
- - app/policies/container_expiration_policy_policy.rb
- - app/policies/container_repository_policy.rb
- - app/policies/custom_emoji_policy.rb
- - app/policies/deploy_key_policy.rb
- - app/policies/deploy_keys_project_policy.rb
- - app/policies/deploy_token_policy.rb
- - app/policies/deployment_policy.rb
- - app/policies/draft_note_policy.rb
- - app/policies/environment_policy.rb
- - app/policies/external_issue_policy.rb
- - app/policies/global_policy.rb
- - app/policies/grafana_integration_policy.rb
- - app/policies/group_deploy_key_policy.rb
- - app/policies/group_deploy_keys_group_policy.rb
- - app/policies/group_label_policy.rb
- - app/policies/group_member_policy.rb
- - app/policies/group_policy.rb
- - app/policies/identity_provider_policy.rb
- - app/policies/instance_metadata_policy.rb
- - app/policies/integration_policy.rb
- - app/policies/issuable_policy.rb
- - app/policies/issue_policy.rb
- - app/policies/merge_request_policy.rb
- - app/policies/milestone_policy.rb
- - app/policies/namespace_policy.rb
- - app/policies/nil_policy.rb
- - app/policies/note_policy.rb
- - app/policies/personal_access_token_policy.rb
- - app/policies/personal_snippet_policy.rb
- - app/policies/project_ci_cd_setting_policy.rb
- - app/policies/project_label_policy.rb
- - app/policies/project_member_policy.rb
- - app/policies/project_policy.rb
- - app/policies/project_snippet_policy.rb
- - app/policies/project_statistics_policy.rb
- - app/policies/prometheus_alert_policy.rb
- - app/policies/protected_branch_policy.rb
- - app/policies/release_policy.rb
- - app/policies/repository_policy.rb
- - app/policies/resource_label_event_policy.rb
- - app/policies/suggestion_policy.rb
- - app/policies/timebox_policy.rb
- - app/policies/timelog_policy.rb
- - app/policies/todo_policy.rb
- - app/policies/user_policy.rb
- - app/policies/wiki_page_policy.rb
- - app/policies/wiki_policy.rb
- - app/policies/work_item_policy.rb
- - app/presenters/award_emoji_presenter.rb
- - app/presenters/blob_presenter.rb
- - app/presenters/board_presenter.rb
- - app/presenters/clusterable_presenter.rb
- - app/presenters/commit_presenter.rb
- - app/presenters/commit_status_presenter.rb
- - app/presenters/environment_presenter.rb
- - app/presenters/event_presenter.rb
- - app/presenters/generic_commit_status_presenter.rb
- - 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
- - app/presenters/members_presenter.rb
- - app/presenters/merge_request_presenter.rb
- - app/presenters/milestone_presenter.rb
- - app/presenters/pages_domain_presenter.rb
- - app/presenters/project_clusterable_presenter.rb
- - app/presenters/project_hook_presenter.rb
- - app/presenters/project_member_presenter.rb
- - app/presenters/project_presenter.rb
- - app/presenters/prometheus_alert_presenter.rb
- - app/presenters/release_presenter.rb
- - app/presenters/search_service_presenter.rb
- - app/presenters/sentry_error_presenter.rb
- - app/presenters/service_hook_presenter.rb
- - app/presenters/snippet_blob_presenter.rb
- - app/presenters/snippet_presenter.rb
- - app/presenters/todo_presenter.rb
- - app/presenters/tree_entry_presenter.rb
- - app/presenters/user_presenter.rb
- - app/presenters/web_hook_log_presenter.rb
- - app/serializers/accessibility_error_entity.rb
- - app/serializers/accessibility_reports_comparer_entity.rb
- - app/serializers/accessibility_reports_comparer_serializer.rb
- - app/serializers/analytics_build_entity.rb
- - app/serializers/analytics_build_serializer.rb
- - app/serializers/analytics_commit_entity.rb
- - app/serializers/analytics_commit_serializer.rb
- - app/serializers/analytics_generic_serializer.rb
- - app/serializers/analytics_issue_entity.rb
- - app/serializers/analytics_issue_serializer.rb
- - app/serializers/analytics_merge_request_entity.rb
- - app/serializers/analytics_merge_request_serializer.rb
- - app/serializers/analytics_stage_entity.rb
- - app/serializers/analytics_stage_serializer.rb
- - app/serializers/analytics_summary_entity.rb
- - app/serializers/analytics_summary_serializer.rb
- - app/serializers/award_emoji_entity.rb
- - app/serializers/base_discussion_entity.rb
- - app/serializers/base_serializer.rb
- - app/serializers/blob_entity.rb
- - app/serializers/board_serializer.rb
- - app/serializers/board_simple_entity.rb
- - app/serializers/build_action_entity.rb
- - app/serializers/build_artifact_entity.rb
- - app/serializers/build_coverage_entity.rb
- - app/serializers/build_details_entity.rb
- - app/serializers/build_metadata_entity.rb
- - app/serializers/build_serializer.rb
- - app/serializers/build_trace_entity.rb
- - app/serializers/build_trace_serializer.rb
- - app/serializers/cluster_application_entity.rb
- - app/serializers/cluster_entity.rb
- - app/serializers/cluster_serializer.rb
- - app/serializers/codequality_degradation_entity.rb
- - app/serializers/codequality_reports_comparer_entity.rb
- - app/serializers/codequality_reports_comparer_serializer.rb
- - app/serializers/cohort_activity_month_entity.rb
- - app/serializers/cohort_entity.rb
- - app/serializers/cohorts_entity.rb
- - app/serializers/cohorts_serializer.rb
- - app/serializers/commit_entity.rb
- - app/serializers/container_repositories_serializer.rb
- - app/serializers/container_repository_entity.rb
- - app/serializers/container_tag_entity.rb
- - app/serializers/container_tags_serializer.rb
- - app/serializers/context_commits_diff_entity.rb
- - app/serializers/current_board_entity.rb
- - app/serializers/current_board_serializer.rb
- - app/serializers/current_user_entity.rb
- - app/serializers/deploy_key_entity.rb
- - app/serializers/deploy_key_serializer.rb
- - app/serializers/deploy_keys_project_entity.rb
- - app/serializers/deployment_cluster_entity.rb
- - app/serializers/deployment_entity.rb
- - app/serializers/deployment_serializer.rb
- - app/serializers/detailed_status_entity.rb
- - app/serializers/diff_file_base_entity.rb
- - app/serializers/diff_file_entity.rb
- - app/serializers/diff_file_metadata_entity.rb
- - app/serializers/diff_line_entity.rb
- - app/serializers/diff_line_parallel_entity.rb
- - app/serializers/diff_line_serializer.rb
- - app/serializers/diff_viewer_entity.rb
- - app/serializers/diffs_entity.rb
- - app/serializers/diffs_metadata_entity.rb
- - app/serializers/diffs_metadata_serializer.rb
- - app/serializers/diffs_serializer.rb
- - app/serializers/discussion_diff_file_entity.rb
- - app/serializers/discussion_entity.rb
- - app/serializers/discussion_serializer.rb
- - app/serializers/draft_note_entity.rb
- - app/serializers/draft_note_serializer.rb
- - app/serializers/entity_request.rb
- - app/serializers/environment_entity.rb
- - app/serializers/environment_serializer.rb
- - app/serializers/environment_status_entity.rb
- - app/serializers/environment_status_serializer.rb
- - app/serializers/feature_flag_entity.rb
- - app/serializers/feature_flag_scope_entity.rb
- - app/serializers/feature_flag_serializer.rb
- - app/serializers/feature_flag_summary_entity.rb
- - app/serializers/feature_flag_summary_serializer.rb
- - app/serializers/feature_flags_client_entity.rb
- - app/serializers/feature_flags_client_serializer.rb
- - app/serializers/fork_namespace_entity.rb
- - app/serializers/fork_namespace_serializer.rb
- - app/serializers/group_analytics_stage_entity.rb
- - app/serializers/group_analytics_stage_serializer.rb
- - app/serializers/group_basic_entity.rb
- - app/serializers/group_child_entity.rb
- - app/serializers/group_child_serializer.rb
- - app/serializers/group_deploy_key_entity.rb
- - app/serializers/group_deploy_key_serializer.rb
- - app/serializers/group_deploy_keys_group_entity.rb
- - app/serializers/group_entity.rb
- - app/serializers/group_group_link_entity.rb
- - app/serializers/group_group_link_serializer.rb
- - app/serializers/group_issuable_autocomplete_entity.rb
- - app/serializers/group_issuable_autocomplete_serializer.rb
- - app/serializers/group_serializer.rb
- - app/serializers/issuable_entity.rb
- - app/serializers/issuable_sidebar_basic_entity.rb
- - app/serializers/issuable_sidebar_extras_entity.rb
- - app/serializers/issuable_sidebar_todo_entity.rb
- - app/serializers/issue_board_entity.rb
- - app/serializers/issue_entity.rb
- - app/serializers/issue_serializer.rb
- - app/serializers/issue_sidebar_basic_entity.rb
- - app/serializers/issue_sidebar_extras_entity.rb
- - app/serializers/job_artifact_report_entity.rb
- - app/serializers/job_entity.rb
- - app/serializers/job_group_entity.rb
- - app/serializers/label_entity.rb
- - app/serializers/label_serializer.rb
- - app/serializers/lfs_file_lock_entity.rb
- - app/serializers/lfs_file_lock_serializer.rb
- - app/serializers/linked_issue_entity.rb
- - app/serializers/linked_project_issue_entity.rb
- - app/serializers/linked_project_issue_serializer.rb
- - app/serializers/member_entity.rb
- - app/serializers/member_serializer.rb
- - app/serializers/member_user_entity.rb
- - app/serializers/merge_request_basic_entity.rb
- - app/serializers/merge_request_create_entity.rb
- - app/serializers/merge_request_create_serializer.rb
- - app/serializers/merge_request_current_user_entity.rb
- - app/serializers/merge_request_diff_entity.rb
- - app/serializers/merge_request_for_pipeline_entity.rb
- - app/serializers/merge_request_metrics_entity.rb
- - app/serializers/merge_request_noteable_entity.rb
- - app/serializers/merge_request_poll_cached_widget_entity.rb
- - app/serializers/merge_request_poll_widget_entity.rb
- - app/serializers/merge_request_serializer.rb
- - app/serializers/merge_request_sidebar_basic_entity.rb
- - app/serializers/merge_request_sidebar_extras_entity.rb
- - app/serializers/merge_request_user_entity.rb
- - app/serializers/merge_request_widget_commit_entity.rb
- - app/serializers/merge_request_widget_entity.rb
- - app/serializers/move_to_project_entity.rb
- - app/serializers/move_to_project_serializer.rb
- - app/serializers/namespace_basic_entity.rb
- - app/serializers/namespace_serializer.rb
- - app/serializers/note_attachment_entity.rb
- - app/serializers/note_entity.rb
- - app/serializers/note_user_entity.rb
- - app/serializers/paginated_diff_entity.rb
- - app/serializers/paginated_diff_serializer.rb
- - app/serializers/pipeline_details_entity.rb
- - app/serializers/pipeline_entity.rb
- - app/serializers/pipeline_serializer.rb
- - app/serializers/project_entity.rb
- - app/serializers/project_import_entity.rb
- - app/serializers/project_mirror_entity.rb
- - app/serializers/project_mirror_serializer.rb
- - app/serializers/project_note_entity.rb
- - app/serializers/project_note_serializer.rb
- - app/serializers/project_serializer.rb
- - app/serializers/prometheus_alert_entity.rb
- - app/serializers/prometheus_alert_serializer.rb
- - app/serializers/prometheus_metric_entity.rb
- - app/serializers/prometheus_metric_serializer.rb
- - app/serializers/release_entity.rb
- - app/serializers/release_serializer.rb
- - app/serializers/remote_mirror_entity.rb
- - app/serializers/review_app_setup_entity.rb
- - app/serializers/review_app_setup_serializer.rb
- - app/serializers/rollout_status_entity.rb
- - app/serializers/route_entity.rb
- - app/serializers/route_serializer.rb
- - app/serializers/runner_entity.rb
- - app/serializers/service_event_entity.rb
- - app/serializers/service_event_serializer.rb
- - app/serializers/service_field_entity.rb
- - app/serializers/service_field_serializer.rb
- - app/serializers/stage_entity.rb
- - app/serializers/stage_serializer.rb
- - app/serializers/suggestion_entity.rb
- - app/serializers/suggestion_serializer.rb
- - app/serializers/test_case_entity.rb
- - app/serializers/test_report_entity.rb
- - app/serializers/test_report_serializer.rb
- - app/serializers/test_report_summary_entity.rb
- - app/serializers/test_report_summary_serializer.rb
- - app/serializers/test_reports_comparer_entity.rb
- - app/serializers/test_reports_comparer_serializer.rb
- - app/serializers/test_suite_comparer_entity.rb
- - app/serializers/test_suite_entity.rb
- - app/serializers/test_suite_serializer.rb
- - app/serializers/test_suite_summary_entity.rb
- - app/serializers/trigger_variable_entity.rb
- - app/serializers/triggered_pipeline_entity.rb
- - app/serializers/user_entity.rb
- - app/serializers/user_preference_entity.rb
- - app/serializers/user_serializer.rb
- - app/serializers/web_ide_terminal_entity.rb
- - app/serializers/web_ide_terminal_serializer.rb
- - app/services/access_token_validation_service.rb
- - app/services/audit_event_service.rb
- - app/services/auto_merge_service.rb
- - app/services/base_container_service.rb
- - app/services/base_count_service.rb
- - app/services/base_project_service.rb
- - app/services/base_renderer.rb
- - app/services/base_service.rb
- - app/services/bulk_create_integration_service.rb
- - app/services/bulk_import_service.rb
- - app/services/bulk_push_event_payload_service.rb
- - app/services/bulk_update_integration_service.rb
- - app/services/cohorts_service.rb
- - app/services/compare_service.rb
- - app/services/container_expiration_policy_service.rb
- - app/services/event_create_service.rb
- - app/services/gravatar_service.rb
- - app/services/import_export_clean_up_service.rb
- - app/services/issuable_base_service.rb
- - app/services/issue_rebalancing_service.rb
- - app/services/markdown_content_rewriter_service.rb
- - app/services/merge_request_metrics_service.rb
- - app/services/metrics_service.rb
- - app/services/note_summary.rb
- - app/services/notification_service.rb
- - app/services/onboarding_progress_service.rb
- - app/services/post_receive_service.rb
- - app/services/preview_markdown_service.rb
- - app/services/push_event_payload_service.rb
- - app/services/repository_archive_clean_up_service.rb
- - app/services/reset_project_cache_service.rb
- - app/services/search_service.rb
- - app/services/service_response.rb
- - app/services/service_ping/submit_service.rb
- - app/services/system_hooks_service.rb
- - app/services/task_list_toggle_service.rb
- - app/services/todo_service.rb
- - app/services/update_container_registry_info_service.rb
- - app/services/upload_service.rb
- - app/services/user_agent_detail_service.rb
- - app/services/user_project_access_changed_service.rb
- - app/services/verify_pages_domain_service.rb
- - app/services/web_hook_service.rb
- - app/services/x509_certificate_revoke_service.rb
- - app/uploaders/attachment_uploader.rb
- - app/uploaders/avatar_uploader.rb
- - app/uploaders/deleted_object_uploader.rb
- - app/uploaders/dependency_proxy/file_uploader.rb
- - app/uploaders/external_diff_uploader.rb
- - app/uploaders/favicon_uploader.rb
- - app/uploaders/file_mover.rb
- - app/uploaders/file_uploader.rb
- - app/uploaders/gitlab_uploader.rb
- - app/uploaders/import_export_uploader.rb
- - app/uploaders/job_artifact_uploader.rb
- - app/uploaders/lfs_object_uploader.rb
- - app/uploaders/namespace_file_uploader.rb
- - app/uploaders/personal_file_uploader.rb
- - app/validators/abstract_path_validator.rb
- - app/validators/addressable_url_validator.rb
- - app/validators/any_field_validator.rb
- - app/validators/array_members_validator.rb
- - app/validators/branch_filter_validator.rb
- - app/validators/certificate_fingerprint_validator.rb
- - app/validators/certificate_key_validator.rb
- - app/validators/certificate_validator.rb
- - app/validators/cluster_name_validator.rb
- - app/validators/color_validator.rb
- - app/validators/cron_freeze_period_timezone_validator.rb
- - app/validators/cron_timezone_validator.rb
- - app/validators/cron_validator.rb
- - app/validators/devise_email_validator.rb
- - app/validators/duration_validator.rb
- - app/validators/feature_flag_strategies_validator.rb
- - app/validators/feature_flag_user_xids_validator.rb
- - app/validators/future_date_validator.rb
- - app/validators/html_safety_validator.rb
- - app/validators/ip_address_validator.rb
- - app/validators/js_regex_validator.rb
- - app/validators/json_schema_validator.rb
- - app/validators/key_restriction_validator.rb
- - app/validators/line_code_validator.rb
- - app/validators/named_ecdsa_key_validator.rb
- - app/validators/namespace_path_validator.rb
- - app/validators/project_path_validator.rb
- - app/validators/public_url_validator.rb
- - app/validators/qualified_domain_array_validator.rb
- - app/validators/rsa_key_validator.rb
- - app/validators/same_project_association_validator.rb
- - app/validators/sha_validator.rb
- - app/validators/system_hook_url_validator.rb
- - app/validators/top_level_group_validator.rb
- - app/validators/untrusted_regexp_validator.rb
- - app/validators/nested_attributes_duplicates_validator.rb
- - app/validators/x509_certificate_credentials_validator.rb
- - app/workers/admin_email_worker.rb
- - app/workers/approve_blocked_pending_approval_users_worker.rb
- - app/workers/archive_trace_worker.rb
- - app/workers/authorized_keys_worker.rb
- - app/workers/authorized_projects_worker.rb
- - app/workers/auto_merge_process_worker.rb
- - app/workers/background_migration_worker.rb
- - app/workers/build_coverage_worker.rb
- - app/workers/build_finished_worker.rb
- - app/workers/build_hooks_worker.rb
- - app/workers/build_queue_worker.rb
- - app/workers/build_success_worker.rb
- - app/workers/build_trace_sections_worker.rb
- - app/workers/bulk_import_worker.rb
- - app/workers/chat_notification_worker.rb
- - app/workers/ci_platform_metrics_update_cron_worker.rb
- - app/workers/cleanup_container_repository_worker.rb
- - app/workers/cluster_configure_istio_worker.rb
- - app/workers/cluster_install_app_worker.rb
- - app/workers/cluster_patch_app_worker.rb
- - app/workers/cluster_provision_worker.rb
- - app/workers/cluster_update_app_worker.rb
- - app/workers/cluster_upgrade_app_worker.rb
- - app/workers/cluster_wait_for_app_installation_worker.rb
- - app/workers/cluster_wait_for_app_update_worker.rb
- - app/workers/cluster_wait_for_ingress_ip_address_worker.rb
- - app/workers/container_expiration_policy_worker.rb
- - app/workers/create_commit_signature_worker.rb
- - app/workers/create_note_diff_file_worker.rb
- - app/workers/create_pipeline_worker.rb
- - app/workers/delete_container_repository_worker.rb
- - app/workers/delete_diff_files_worker.rb
- - app/workers/delete_merged_branches_worker.rb
- - app/workers/delete_stored_files_worker.rb
- - app/workers/delete_user_worker.rb
- - app/workers/destroy_pages_deployments_worker.rb
- - app/workers/detect_repository_languages_worker.rb
- - app/workers/disallow_two_factor_for_group_worker.rb
- - app/workers/disallow_two_factor_for_subgroups_worker.rb
- - app/workers/email_receiver_worker.rb
- - app/workers/emails_on_push_worker.rb
- - app/workers/error_tracking_issue_link_worker.rb
- - app/workers/expire_build_artifacts_worker.rb
- - app/workers/expire_build_instance_artifacts_worker.rb
- - app/workers/expire_job_cache_worker.rb
- - app/workers/expire_pipeline_cache_worker.rb
- - app/workers/export_csv_worker.rb
- - app/workers/external_service_reactive_caching_worker.rb
- - app/workers/file_hook_worker.rb
- - app/workers/flush_counter_increments_worker.rb
- - app/workers/git_garbage_collect_worker.rb
- - app/workers/gitlab_performance_bar_stats_worker.rb
- - app/workers/gitlab_shell_worker.rb
- - app/workers/gitlab_service_ping_worker.rb
- - app/workers/gitlab_usage_ping_worker.rb
- - app/workers/group_destroy_worker.rb
- - app/workers/group_export_worker.rb
- - app/workers/group_import_worker.rb
- - app/workers/import_export_project_cleanup_worker.rb
- - app/workers/import_issues_csv_worker.rb
- - app/workers/invalid_gpg_signature_update_worker.rb
- - app/workers/irker_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
- - app/workers/merge_worker.rb
- - app/workers/migrate_external_diffs_worker.rb
- - app/workers/namespaceless_project_destroy_worker.rb
- - app/workers/new_issue_worker.rb
- - app/workers/new_merge_request_worker.rb
- - app/workers/new_note_worker.rb
- - app/workers/pages_domain_removal_cron_worker.rb
- - app/workers/pages_domain_ssl_renewal_cron_worker.rb
- - app/workers/pages_domain_ssl_renewal_worker.rb
- - app/workers/pages_domain_verification_cron_worker.rb
- - app/workers/pages_domain_verification_worker.rb
- - app/workers/pages_transfer_worker.rb
- - app/workers/pages_worker.rb
- - app/workers/partition_creation_worker.rb
- - app/workers/pipeline_hooks_worker.rb
- - app/workers/pipeline_metrics_worker.rb
- - app/workers/pipeline_notification_worker.rb
- - app/workers/pipeline_process_worker.rb
- - app/workers/pipeline_schedule_worker.rb
- - app/workers/pipeline_update_worker.rb
- - app/workers/post_receive.rb
- - app/workers/process_commit_worker.rb
- - app/workers/project_cache_worker.rb
- - app/workers/project_daily_statistics_worker.rb
- - app/workers/project_destroy_worker.rb
- - app/workers/project_export_worker.rb
- - app/workers/project_schedule_bulk_repository_shard_moves_worker.rb
- - app/workers/project_service_worker.rb
- - app/workers/project_update_repository_storage_worker.rb
- - app/workers/propagate_integration_group_worker.rb
- - app/workers/propagate_integration_inherit_descendant_worker.rb
- - app/workers/propagate_integration_inherit_worker.rb
- - app/workers/propagate_integration_project_worker.rb
- - app/workers/propagate_integration_worker.rb
- - app/workers/propagate_service_template_worker.rb
- - app/workers/prune_old_events_worker.rb
- - app/workers/prune_web_hook_logs_worker.rb
- - app/workers/purge_dependency_proxy_cache_worker.rb
- - app/workers/reactive_caching_worker.rb
- - app/workers/rebase_worker.rb
- - app/workers/remote_mirror_notification_worker.rb
- - app/workers/remove_expired_group_links_worker.rb
- - app/workers/remove_expired_members_worker.rb
- - app/workers/remove_unaccepted_member_invites_worker.rb
- - app/workers/remove_unreferenced_lfs_objects_worker.rb
- - app/workers/repository_archive_cache_worker.rb
- - app/workers/repository_cleanup_worker.rb
- - app/workers/repository_fork_worker.rb
- - app/workers/repository_import_worker.rb
- - app/workers/repository_remove_remote_worker.rb
- - app/workers/repository_update_remote_mirror_worker.rb
- - app/workers/requests_profiles_worker.rb
- - app/workers/run_pipeline_schedule_worker.rb
- - app/workers/schedule_merge_request_cleanup_refs_worker.rb
- - app/workers/schedule_migrate_external_diffs_worker.rb
- - app/workers/self_monitoring_project_create_worker.rb
- - app/workers/self_monitoring_project_delete_worker.rb
- - app/workers/service_desk_email_receiver_worker.rb
- - app/workers/snippet_schedule_bulk_repository_shard_moves_worker.rb
- - app/workers/snippet_update_repository_storage_worker.rb
- - app/workers/stage_update_worker.rb
- - app/workers/stuck_ci_jobs_worker.rb
- - app/workers/stuck_export_jobs_worker.rb
- - app/workers/stuck_merge_jobs_worker.rb
- - app/workers/system_hook_push_worker.rb
- - app/workers/trending_projects_worker.rb
- - app/workers/update_container_registry_info_worker.rb
- - app/workers/update_external_pull_requests_worker.rb
- - app/workers/update_head_pipeline_for_merge_request_worker.rb
- - app/workers/update_highest_role_worker.rb
- - app/workers/update_merge_requests_worker.rb
- - app/workers/update_project_statistics_worker.rb
- - app/workers/upload_checksum_worker.rb
- - app/workers/wait_for_cluster_creation_worker.rb
- - app/workers/web_hook_worker.rb
- - app/workers/x509_certificate_revoke_worker.rb
- - app/workers/x509_issuer_crl_check_worker.rb
- - ee/app/controllers/countries_controller.rb
- - ee/app/controllers/country_states_controller.rb
- - ee/app/controllers/omniauth_kerberos_spnego_controller.rb
- - ee/app/controllers/operations_controller.rb
- - 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/controllers/unsubscribes_controller.rb
- - ee/app/controllers/usernames_controller.rb
- - ee/app/finders/audit_log_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
- - ee/app/finders/dast_site_profiles_finder.rb
- - ee/app/finders/dast_site_validations_finder.rb
- - ee/app/finders/epics_finder.rb
- - ee/app/finders/geo_node_finder.rb
- - ee/app/finders/gpg_keys_finder.rb
- - ee/app/finders/group_saml_identity_finder.rb
- - ee/app/finders/groups_with_templates_finder.rb
- - ee/app/finders/iterations_finder.rb
- - ee/app/finders/licenses_finder.rb
- - ee/app/finders/merge_requests_compliance_finder.rb
- - ee/app/finders/merge_trains_finder.rb
- - ee/app/finders/productivity_analytics_finder.rb
- - ee/app/finders/scim_finder.rb
- - ee/app/finders/software_license_policies_finder.rb
- - ee/app/mailers/ci_minutes_usage_mailer.rb
- - ee/app/mailers/credentials_inventory_mailer.rb
- - ee/app/mailers/license_mailer.rb
- - ee/app/mailers/previews/ci_minutes_usage_mailer_preview.rb
- - ee/app/mailers/previews/license_mailer_preview.rb
- - ee/app/models/allowed_email_domain.rb
- - ee/app/models/approval_merge_request_rule.rb
- - ee/app/models/approval_merge_request_rule_source.rb
- - ee/app/models/approval_project_rule.rb
- - ee/app/models/approval_project_rules_protected_branch.rb
- - ee/app/models/approval_state.rb
- - ee/app/models/approval_wrapped_any_approver_rule.rb
- - ee/app/models/approval_wrapped_code_owner_rule.rb
- - ee/app/models/approval_wrapped_rule.rb
- - ee/app/models/approver.rb
- - ee/app/models/approver_group.rb
- - ee/app/models/board_assignee.rb
- - ee/app/models/board_label.rb
- - ee/app/models/board_user_preference.rb
- - ee/app/models/burndown.rb
- - ee/app/models/dast_scanner_profile.rb
- - ee/app/models/dast_site.rb
- - ee/app/models/dast_site_profile.rb
- - ee/app/models/dast_site_token.rb
- - ee/app/models/dast_site_validation.rb
- - ee/app/models/elasticsearch_indexed_namespace.rb
- - ee/app/models/elasticsearch_indexed_project.rb
- - ee/app/models/epic_issue.rb
- - ee/app/models/epic_user_mention.rb
- - ee/app/models/feature_flag_issue.rb
- - ee/app/models/geo_node.rb
- - ee/app/models/geo_node_namespace_link.rb
- - ee/app/models/geo_node_status.rb
- - ee/app/models/gitlab_subscription.rb
- - ee/app/models/gitlab_subscription_history.rb
- - ee/app/models/group_deletion_schedule.rb
- - ee/app/models/group_merge_request_approval_setting.rb
- - ee/app/models/group_wiki.rb
- - ee/app/models/group_wiki_repository.rb
- - ee/app/models/historical_data.rb
- - ee/app/models/hooks/group_hook.rb
- - ee/app/models/index_status.rb
- - ee/app/models/insight.rb
- - ee/app/models/instance_security_dashboard.rb
- - ee/app/models/ip_restriction.rb
- - ee/app/models/issuable_metric_image.rb
- - ee/app/models/issuable_sla.rb
- - ee/app/models/issuables_analytics.rb
- - ee/app/models/iteration_note.rb
- - ee/app/models/ldap_group_link.rb
- - ee/app/models/ldap_key.rb
- - ee/app/models/license.rb
- - ee/app/models/merge_request_block.rb
- - ee/app/models/merge_request_diff_detail.rb
- - ee/app/models/merge_train.rb
- - ee/app/models/namespace_limit.rb
- - ee/app/models/namespace_statistics.rb
- - ee/app/models/path_lock.rb
- - ee/app/models/pg_replication_slot.rb
- - ee/app/models/productivity_analytics.rb
- - ee/app/models/project_alias.rb
- - ee/app/models/project_repository_state.rb
- - ee/app/models/project_security_setting.rb
- - ee/app/models/protected_environment.rb
- - ee/app/models/push_rule.rb
- - ee/app/models/resource_iteration_event.rb
- - ee/app/models/resource_weight_event.rb
- - ee/app/models/saml_group_link.rb
- - ee/app/models/saml_provider.rb
- - ee/app/models/scim_identity.rb
- - ee/app/models/scim_oauth_access_token.rb
- - ee/app/models/scoped_label_set.rb
- - ee/app/models/slack_integration.rb
- - ee/app/models/smartcard_identity.rb
- - ee/app/models/software_license.rb
- - ee/app/models/software_license_policy.rb
- - ee/app/models/storage_shard.rb
- - ee/app/models/user_permission_export_upload.rb
- - ee/app/models/users_ops_dashboard_project.rb
- - ee/app/models/users_security_dashboard_project.rb
- - ee/app/models/vulnerability_user_mention.rb
- - ee/app/models/weight_note.rb
- - ee/app/policies/approval_merge_request_rule_policy.rb
- - ee/app/policies/approval_project_rule_policy.rb
- - ee/app/policies/approval_state_policy.rb
- - ee/app/policies/dast_scanner_profile_policy.rb
- - ee/app/policies/dast_site_profile_policy.rb
- - ee/app/policies/dast_site_validation_policy.rb
- - ee/app/policies/epic_policy.rb
- - ee/app/policies/geo_node_policy.rb
- - ee/app/policies/instance_security_dashboard_policy.rb
- - ee/app/policies/issuable_metric_image_policy.rb
- - ee/app/policies/iteration_policy.rb
- - ee/app/policies/push_rule_policy.rb
- - ee/app/policies/saml_provider_policy.rb
- - ee/app/policies/vulnerability_policy.rb
- - ee/app/presenters/approval_rule_presenter.rb
- - ee/app/presenters/audit_event_presenter.rb
- - ee/app/presenters/epic_issue_presenter.rb
- - ee/app/presenters/epic_presenter.rb
- - ee/app/presenters/iteration_presenter.rb
- - ee/app/presenters/merge_request_approver_presenter.rb
- - ee/app/presenters/subscription_presenter.rb
- - ee/app/presenters/vulnerability_presenter.rb
- - ee/app/serializers/audit_event_entity.rb
- - ee/app/serializers/audit_event_serializer.rb
- - ee/app/serializers/blocking_merge_request_entity.rb
- - ee/app/serializers/board_assignee_entity.rb
- - ee/app/serializers/board_label_entity.rb
- - ee/app/serializers/board_milestone_entity.rb
- - ee/app/serializers/dashboard_environment_entity.rb
- - ee/app/serializers/dashboard_environments_project_entity.rb
- - ee/app/serializers/dashboard_environments_serializer.rb
- - ee/app/serializers/dashboard_operations_project_entity.rb
- - ee/app/serializers/dashboard_operations_serializer.rb
- - ee/app/serializers/dependency_entity.rb
- - ee/app/serializers/dependency_list_entity.rb
- - ee/app/serializers/dependency_list_serializer.rb
- - ee/app/serializers/epic_base_entity.rb
- - ee/app/serializers/epic_entity.rb
- - ee/app/serializers/epic_note_entity.rb
- - ee/app/serializers/epic_note_serializer.rb
- - ee/app/serializers/epic_serializer.rb
- - ee/app/serializers/file_lock_entity.rb
- - ee/app/serializers/geo_design_registry_entity.rb
- - ee/app/serializers/geo_design_registry_serializer.rb
- - ee/app/serializers/geo_node_serializer.rb
- - ee/app/serializers/geo_node_status_serializer.rb
- - ee/app/serializers/geo_project_registry_entity.rb
- - ee/app/serializers/geo_project_registry_serializer.rb
- - 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_entity.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_comparer_entity.rb
- - ee/app/serializers/license_scanning_reports_comparer_serializer.rb
- - ee/app/serializers/license_scanning_reports_serializer.rb
- - ee/app/serializers/licenses_list_entity.rb
- - ee/app/serializers/licenses_list_serializer.rb
- - ee/app/serializers/linked_epic_entity.rb
- - ee/app/serializers/linked_epic_issue_entity.rb
- - ee/app/serializers/linked_epic_issue_serializer.rb
- - ee/app/serializers/linked_epic_serializer.rb
- - ee/app/serializers/linked_feature_flag_issue_entity.rb
- - ee/app/serializers/linked_feature_flag_issue_serializer.rb
- - ee/app/serializers/managed_license_entity.rb
- - ee/app/serializers/managed_license_serializer.rb
- - ee/app/serializers/merge_request_compliance_entity.rb
- - ee/app/serializers/metrics_report_metric_entity.rb
- - ee/app/serializers/metrics_reports_comparer_entity.rb
- - ee/app/serializers/metrics_reports_comparer_serializer.rb
- - ee/app/serializers/milestone_serializer.rb
- - ee/app/serializers/namespace_entity.rb
- - ee/app/serializers/productivity_analytics_merge_request_entity.rb
- - ee/app/serializers/report_list_entity.rb
- - ee/app/serializers/scim_oauth_access_token_entity.rb
- - ee/app/serializers/storage_shard_entity.rb
- - ee/app/serializers/storage_shard_serializer.rb
- - ee/app/serializers/user_analytics_entity.rb
- - ee/app/serializers/vulnerability_entity.rb
- - ee/app/serializers/vulnerability_note_entity.rb
- - ee/app/serializers/vulnerability_note_serializer.rb
- - ee/app/serializers/vulnerability_serializer.rb
- - ee/app/services/clear_namespace_shared_runners_minutes_service.rb
- - ee/app/services/ldap_group_reset_service.rb
- - ee/app/services/start_pull_mirroring_service.rb
- - ee/app/services/timebox_report_service.rb
- - ee/app/uploaders/issuable_metric_image_uploader.rb
- - ee/app/validators/host_validator.rb
- - ee/app/validators/ldap_filter_validator.rb
- - ee/app/workers/active_user_count_threshold_worker.rb
- - ee/app/workers/adjourned_group_deletion_worker.rb
- - ee/app/workers/adjourned_project_deletion_worker.rb
- - ee/app/workers/adjourned_projects_deletion_cron_worker.rb
- - ee/app/workers/admin_emails_worker.rb
- - ee/app/workers/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
- - ee/app/workers/elastic_delete_project_worker.rb
- - ee/app/workers/elastic_full_index_worker.rb
- - ee/app/workers/elastic_index_bulk_cron_worker.rb
- - ee/app/workers/elastic_index_initial_bulk_cron_worker.rb
- - ee/app/workers/elastic_indexing_control_worker.rb
- - ee/app/workers/elastic_namespace_indexer_worker.rb
- - ee/app/workers/elastic_namespace_rollout_worker.rb
- - ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb
- - ee/app/workers/geo_repository_destroy_worker.rb
- - ee/app/workers/group_saml_group_sync_worker.rb
- - ee/app/workers/historical_data_worker.rb
- - ee/app/workers/import_software_licenses_worker.rb
- - ee/app/workers/ingress_modsecurity_counter_metrics_worker.rb
- - ee/app/workers/iterations_update_status_worker.rb
- - ee/app/workers/ldap_all_groups_sync_worker.rb
- - ee/app/workers/ldap_group_sync_worker.rb
- - ee/app/workers/ldap_sync_worker.rb
- - ee/app/workers/merge_request_reset_approvals_worker.rb
- - ee/app/workers/network_policy_metrics_worker.rb
- - ee/app/workers/new_epic_worker.rb
- - ee/app/workers/project_import_schedule_worker.rb
- - ee/app/workers/project_template_export_worker.rb
- - ee/app/workers/pseudonymizer_worker.rb
- - ee/app/workers/refresh_license_compliance_checks_worker.rb
- - ee/app/workers/repository_push_audit_event_worker.rb
- - ee/app/workers/repository_update_mirror_worker.rb
- - ee/app/workers/scan_security_report_secrets_worker.rb
- - ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb
- - ee/app/workers/store_security_reports_worker.rb
- - ee/app/workers/store_security_scans_worker.rb
- - ee/app/workers/sync_seat_link_request_worker.rb
- - ee/app/workers/sync_seat_link_worker.rb
- - ee/app/workers/sync_security_reports_to_report_approval_rules_worker.rb
- - ee/app/workers/update_all_mirrors_worker.rb
- - ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb
- - ee/lib/gitlab/path_locks_finder.rb
- - ee/spec/support/elastic_query_name_inspector.rb
- - ee/spec/support/ssh_keygen.rb
- - ee/spec/support/test_license.rb
- - 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/gitlab_danger.rb
- - lib/learn_gitlab.rb
- - lib/tasks/gitlab/graphql.rake
- - lib/tasks/gitlab/seed/group_seed.rake
- - lib/tasks/import.rake
- - lib/tasks/tokens.rake
- - lib/uploaded_file.rb
- - lib/version_check.rb
- - qa/spec/specs/helpers/quarantine_spec.rb
- - spec/controllers/concerns/page_limiter_spec.rb
- - spec/lib/bitbucket/collection_spec.rb
- - spec/lib/gitlab/database/bulk_update_spec.rb
- - spec/lib/gitlab/multi_destination_logger_spec.rb
- - spec/lib/marginalia_spec.rb
- - spec/mailers/notify_spec.rb
- - spec/models/concerns/batch_destroy_dependent_associations_spec.rb
- - spec/models/concerns/bulk_insertable_associations_spec.rb
- - spec/models/concerns/triggerable_hooks_spec.rb
- - spec/support/helpers/bare_repo_operations.rb
- - spec/support/helpers/ci_artifact_metadata_generator.rb
- - spec/support/helpers/fake_migration_classes.rb
- - spec/support/helpers/fake_u2f_device.rb
- - spec/support/helpers/fake_webauthn_device.rb
- - spec/support/helpers/markdown_feature.rb
- - spec/support/helpers/redis_without_keys.rb
- - spec/support/helpers/require_migration.rb
- - spec/support/inspect_squelch.rb
- - spec/support/models/merge_request_without_merge_request_diff.rb
- - spec/support/renameable_upload.rb
- - spec/support/sidekiq_middleware.rb
- - spec/tasks/gitlab/task_helpers_spec.rb
- - spec/uploaders/object_storage_spec.rb
+ - 'app/controllers/abuse_reports_controller.rb'
+ - 'app/controllers/acme_challenges_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/autocomplete_controller.rb'
+ - 'app/controllers/chaos_controller.rb'
+ - 'app/controllers/confirmations_controller.rb'
+ - 'app/controllers/dashboard_controller.rb'
+ - 'app/controllers/graphql_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/health_check_controller.rb'
+ - 'app/controllers/health_controller.rb'
+ - 'app/controllers/help_controller.rb'
+ - 'app/controllers/ide_controller.rb'
+ - 'app/controllers/invites_controller.rb'
+ - 'app/controllers/jwks_controller.rb'
+ - 'app/controllers/jwt_controller.rb'
+ - 'app/controllers/metrics_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/root_controller.rb'
+ - 'app/controllers/runner_setup_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/controllers/sent_notifications_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/controllers/snippets_controller.rb'
+ - 'app/controllers/uploads_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/controllers/whats_new_controller.rb'
+ - 'app/finders/abuse_reports_finder.rb'
+ - 'app/finders/access_requests_finder.rb'
+ - 'app/finders/applications_finder.rb'
+ - 'app/finders/award_emojis_finder.rb'
+ - 'app/finders/branches_finder.rb'
+ - 'app/finders/cluster_ancestors_finder.rb'
+ - 'app/finders/clusters_finder.rb'
+ - 'app/finders/container_repositories_finder.rb'
+ - 'app/finders/context_commits_finder.rb'
+ - 'app/finders/contributed_projects_finder.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/finders/events_finder.rb'
+ - 'app/finders/feature_flags_finder.rb'
+ - 'app/finders/feature_flags_user_lists_finder.rb'
+ - 'app/finders/fork_projects_finder.rb'
+ - 'app/finders/fork_targets_finder.rb'
+ - 'app/finders/freeze_periods_finder.rb'
+ - 'app/finders/git_refs_finder.rb'
+ - 'app/finders/group_descendants_finder.rb'
+ - 'app/finders/group_finder.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/group_projects_finder.rb'
+ - 'app/finders/groups_finder.rb'
+ - 'app/finders/issuable_finder.rb'
+ - 'app/finders/issuable_finder/params.rb'
+ - 'app/finders/issues_finder.rb'
+ - 'app/finders/issues_finder/params.rb'
+ - 'app/finders/joined_groups_finder.rb'
+ - 'app/finders/keys_finder.rb'
+ - 'app/finders/labels_finder.rb'
+ - 'app/finders/lfs_pointers_finder.rb'
+ - 'app/finders/license_template_finder.rb'
+ - 'app/finders/members_finder.rb'
+ - 'app/finders/merge_request_target_project_finder.rb'
+ - 'app/finders/merge_requests_finder.rb'
+ - 'app/finders/merge_requests_finder/params.rb'
+ - 'app/finders/milestones_finder.rb'
+ - 'app/finders/notes_finder.rb'
+ - 'app/finders/pending_todos_finder.rb'
+ - 'app/finders/personal_access_tokens_finder.rb'
+ - 'app/finders/personal_projects_finder.rb'
+ - 'app/finders/projects_finder.rb'
+ - 'app/finders/prometheus_metrics_finder.rb'
+ - 'app/finders/protected_branches_finder.rb'
+ - 'app/finders/releases_finder.rb'
+ - 'app/finders/resource_milestone_event_finder.rb'
+ - 'app/finders/resource_state_event_finder.rb'
+ - 'app/finders/sentry_issue_finder.rb'
+ - 'app/finders/serverless_domain_finder.rb'
+ - 'app/finders/snippets_finder.rb'
+ - 'app/finders/starred_projects_finder.rb'
+ - 'app/finders/tags_finder.rb'
+ - 'app/finders/template_finder.rb'
+ - 'app/finders/todos_finder.rb'
+ - 'app/finders/union_finder.rb'
+ - 'app/finders/uploader_finder.rb'
+ - 'app/finders/user_finder.rb'
+ - 'app/finders/user_group_notification_settings_finder.rb'
+ - 'app/finders/user_groups_counter.rb'
+ - 'app/finders/user_recent_events_finder.rb'
+ - 'app/finders/users_finder.rb'
+ - 'app/finders/users_star_projects_finder.rb'
+ - 'app/graphql/gitlab_schema.rb'
+ - 'app/mailers/abuse_report_mailer.rb'
+ - 'app/mailers/application_mailer.rb'
+ - 'app/mailers/devise_mailer.rb'
+ - 'app/mailers/email_rejection_mailer.rb'
+ - 'app/mailers/notify.rb'
+ - 'app/mailers/previews/devise_mailer_preview.rb'
+ - 'app/mailers/previews/email_rejection_mailer_preview.rb'
+ - 'app/mailers/previews/notify_preview.rb'
+ - 'app/mailers/previews/repository_check_mailer_preview.rb'
+ - 'app/mailers/repository_check_mailer.rb'
+ - 'app/models/ability.rb'
+ - 'app/models/abuse_report.rb'
+ - 'app/models/active_session.rb'
+ - 'app/models/appearance.rb'
+ - 'app/models/application_record.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting/term.rb'
+ - 'app/models/approval.rb'
+ - 'app/models/audit_event.rb'
+ - 'app/models/authentication_event.rb'
+ - 'app/models/award_emoji.rb'
+ - 'app/models/badge.rb'
+ - 'app/models/badges/group_badge.rb'
+ - 'app/models/badges/project_badge.rb'
+ - 'app/models/blob.rb'
+ - 'app/models/board.rb'
+ - 'app/models/board_group_recent_visit.rb'
+ - 'app/models/board_project_recent_visit.rb'
+ - 'app/models/broadcast_message.rb'
+ - 'app/models/bulk_import.rb'
+ - 'app/models/chat_name.rb'
+ - 'app/models/chat_team.rb'
+ - 'app/models/ci_platform_metric.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/commit_collection.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/commit_user_mention.rb'
+ - 'app/models/compare.rb'
+ - 'app/models/concerns/uniquify.rb'
+ - 'app/models/container_expiration_policy.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/context_commits_diff.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/data_list.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deploy_keys_project.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/deployment_cluster.rb'
+ - 'app/models/deployment_merge_request.rb'
+ - 'app/models/deployment_metrics.rb'
+ - 'app/models/description_version.rb'
+ - 'app/models/design_user_mention.rb'
+ - 'app/models/diff_discussion.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/diff_note_position.rb'
+ - 'app/models/directly_addressed_user.rb'
+ - 'app/models/discussion.rb'
+ - 'app/models/discussion_note.rb'
+ - 'app/models/draft_note.rb'
+ - 'app/models/email.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/environment_status.rb'
+ - 'app/models/epic.rb'
+ - 'app/models/event.rb'
+ - 'app/models/event_collection.rb'
+ - 'app/models/experiment.rb'
+ - 'app/models/experiment_subject.rb'
+ - 'app/models/experiment_user.rb'
+ - 'app/models/exported_protected_branch.rb'
+ - 'app/models/external_issue.rb'
+ - 'app/models/external_pull_request.rb'
+ - 'app/models/fork_network.rb'
+ - 'app/models/fork_network_member.rb'
+ - 'app/models/generic_commit_status.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/gpg_key_subkey.rb'
+ - 'app/models/grafana_integration.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_custom_attribute.rb'
+ - 'app/models/group_deploy_key.rb'
+ - 'app/models/group_deploy_keys_group.rb'
+ - 'app/models/group_deploy_token.rb'
+ - 'app/models/group_group_link.rb'
+ - 'app/models/group_import_state.rb'
+ - 'app/models/group_label.rb'
+ - 'app/models/guest.rb'
+ - 'app/models/hooks/active_hook_filter.rb'
+ - 'app/models/hooks/project_hook.rb'
+ - 'app/models/hooks/service_hook.rb'
+ - 'app/models/hooks/system_hook.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/hooks/web_hook_log.rb'
+ - 'app/models/identity.rb'
+ - 'app/models/identity/uniqueness_scopes.rb'
+ - 'app/models/import_export_upload.rb'
+ - 'app/models/import_failure.rb'
+ - 'app/models/individual_note_discussion.rb'
+ - 'app/models/instance_configuration.rb'
+ - 'app/models/instance_metadata.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issuable_severity.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/issue_assignee.rb'
+ - 'app/models/issue_collection.rb'
+ - 'app/models/issue_email_participant.rb'
+ - 'app/models/issue_link.rb'
+ - 'app/models/issue_user_mention.rb'
+ - 'app/models/iteration.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/jira_connect_subscription.rb'
+ - 'app/models/jira_import_state.rb'
+ - 'app/models/key.rb'
+ - 'app/models/label.rb'
+ - 'app/models/label_link.rb'
+ - 'app/models/label_note.rb'
+ - 'app/models/label_priority.rb'
+ - 'app/models/legacy_diff_discussion.rb'
+ - 'app/models/legacy_diff_note.rb'
+ - 'app/models/lfs_download_object.rb'
+ - 'app/models/lfs_file_lock.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/lfs_objects_project.rb'
+ - 'app/models/license_template.rb'
+ - 'app/models/list.rb'
+ - 'app/models/list_user_preference.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/group_member.rb'
+ - 'app/models/members/last_group_owner_assigner.rb'
+ - 'app/models/members/member_task.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/members_preloader.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_assignee.rb'
+ - 'app/models/merge_request_context_commit.rb'
+ - 'app/models/merge_request_context_commit_diff_file.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_diff_commit.rb'
+ - 'app/models/merge_request_diff_file.rb'
+ - 'app/models/merge_request_reviewer.rb'
+ - 'app/models/merge_request_user_mention.rb'
+ - 'app/models/merge_requests_closing_issues.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/milestone_note.rb'
+ - 'app/models/milestone_release.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace/traversal_hierarchy.rb'
+ - 'app/models/namespace_setting.rb'
+ - 'app/models/note.rb'
+ - 'app/models/note_diff_file.rb'
+ - 'app/models/notification_reason.rb'
+ - 'app/models/notification_recipient.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/oauth_access_grant.rb'
+ - 'app/models/oauth_access_token.rb'
+ - 'app/models/onboarding_progress.rb'
+ - 'app/models/out_of_context_discussion.rb'
+ - 'app/models/pages_deployment.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/pages_domain_acme_order.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/personal_snippet.rb'
+ - 'app/models/plan.rb'
+ - 'app/models/plan_limits.rb'
+ - 'app/models/pool_repository.rb'
+ - 'app/models/product_analytics_event.rb'
+ - 'app/models/programming_language.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_authorization.rb'
+ - 'app/models/project_auto_devops.rb'
+ - 'app/models/project_ci_cd_setting.rb'
+ - 'app/models/project_custom_attribute.rb'
+ - 'app/models/project_daily_statistic.rb'
+ - 'app/models/project_deploy_token.rb'
+ - 'app/models/project_export_job.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_feature_usage.rb'
+ - 'app/models/project_group_link.rb'
+ - 'app/models/project_import_data.rb'
+ - 'app/models/project_import_state.rb'
+ - 'app/models/project_label.rb'
+ - 'app/models/project_metrics_setting.rb'
+ - 'app/models/project_pages_metadatum.rb'
+ - 'app/models/project_repository.rb'
+ - 'app/models/project_setting.rb'
+ - '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'
+ - 'app/models/prometheus_metric.rb'
+ - 'app/models/protectable_dropdown.rb'
+ - 'app/models/protected_branch.rb'
+ - 'app/models/protected_tag.rb'
+ - 'app/models/push_event.rb'
+ - 'app/models/push_event_payload.rb'
+ - 'app/models/raw_usage_data.rb'
+ - 'app/models/redirect_route.rb'
+ - 'app/models/ref_matcher.rb'
+ - 'app/models/release.rb'
+ - 'app/models/release_highlight.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/repository_language.rb'
+ - 'app/models/resource_event.rb'
+ - 'app/models/resource_label_event.rb'
+ - 'app/models/resource_milestone_event.rb'
+ - 'app/models/resource_state_event.rb'
+ - 'app/models/resource_timebox_event.rb'
+ - 'app/models/review.rb'
+ - 'app/models/route.rb'
+ - 'app/models/self_managed_prometheus_alert_event.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/sentry_issue.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/service_list.rb'
+ - 'app/models/shard.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/snippet_blob.rb'
+ - 'app/models/snippet_input_action.rb'
+ - 'app/models/snippet_input_action_collection.rb'
+ - 'app/models/snippet_repository.rb'
+ - 'app/models/snippet_statistics.rb'
+ - 'app/models/snippet_user_mention.rb'
+ - 'app/models/spam_log.rb'
+ - 'app/models/ssh_host_key.rb'
+ - 'app/models/state_note.rb'
+ - 'app/models/subscription.rb'
+ - 'app/models/suggestion.rb'
+ - 'app/models/synthetic_note.rb'
+ - 'app/models/system_note_metadata.rb'
+ - 'app/models/term_agreement.rb'
+ - 'app/models/timelog.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/tree.rb'
+ - 'app/models/trending_project.rb'
+ - 'app/models/u2f_registration.rb'
+ - 'app/models/upload.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_agent_detail.rb'
+ - 'app/models/user_canonical_email.rb'
+ - 'app/models/user_custom_attribute.rb'
+ - 'app/models/user_detail.rb'
+ - 'app/models/user_highest_role.rb'
+ - 'app/models/user_interacted_project.rb'
+ - 'app/models/user_mention.rb'
+ - 'app/models/user_preference.rb'
+ - 'app/models/user_status.rb'
+ - 'app/models/user_synced_attributes_metadata.rb'
+ - 'app/models/users_star_project.rb'
+ - 'app/models/users_statistics.rb'
+ - 'app/models/vulnerability.rb'
+ - 'app/models/web_ide_terminal.rb'
+ - 'app/models/webauthn_registration.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/wiki_directory.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/models/wiki_page/meta.rb'
+ - 'app/models/wiki_page/slug.rb'
+ - 'app/models/work_item.rb'
+ - 'app/models/x509_certificate.rb'
+ - 'app/models/x509_issuer.rb'
+ - 'app/models/zoom_meeting.rb'
+ - 'app/policies/application_setting/term_policy.rb'
+ - 'app/policies/award_emoji_policy.rb'
+ - 'app/policies/base_policy.rb'
+ - 'app/policies/blob_policy.rb'
+ - 'app/policies/board_policy.rb'
+ - 'app/policies/commit_policy.rb'
+ - 'app/policies/commit_status_policy.rb'
+ - 'app/policies/container_expiration_policy_policy.rb'
+ - 'app/policies/container_repository_policy.rb'
+ - 'app/policies/custom_emoji_policy.rb'
+ - 'app/policies/deploy_key_policy.rb'
+ - 'app/policies/deploy_keys_project_policy.rb'
+ - 'app/policies/deploy_token_policy.rb'
+ - 'app/policies/deployment_policy.rb'
+ - 'app/policies/draft_note_policy.rb'
+ - 'app/policies/environment_policy.rb'
+ - 'app/policies/external_issue_policy.rb'
+ - 'app/policies/global_policy.rb'
+ - 'app/policies/grafana_integration_policy.rb'
+ - 'app/policies/group_deploy_key_policy.rb'
+ - 'app/policies/group_deploy_keys_group_policy.rb'
+ - 'app/policies/group_label_policy.rb'
+ - 'app/policies/group_member_policy.rb'
+ - 'app/policies/group_policy.rb'
+ - 'app/policies/identity_provider_policy.rb'
+ - 'app/policies/instance_metadata_policy.rb'
+ - 'app/policies/integration_policy.rb'
+ - 'app/policies/issuable_policy.rb'
+ - 'app/policies/issue_policy.rb'
+ - 'app/policies/merge_request_policy.rb'
+ - 'app/policies/milestone_policy.rb'
+ - 'app/policies/namespace_policy.rb'
+ - 'app/policies/note_policy.rb'
+ - 'app/policies/personal_access_token_policy.rb'
+ - 'app/policies/personal_snippet_policy.rb'
+ - 'app/policies/project_ci_cd_setting_policy.rb'
+ - 'app/policies/project_label_policy.rb'
+ - 'app/policies/project_member_policy.rb'
+ - 'app/policies/project_policy.rb'
+ - 'app/policies/project_snippet_policy.rb'
+ - 'app/policies/project_statistics_policy.rb'
+ - 'app/policies/prometheus_alert_policy.rb'
+ - 'app/policies/protected_branch_policy.rb'
+ - 'app/policies/release_policy.rb'
+ - 'app/policies/repository_policy.rb'
+ - 'app/policies/resource_label_event_policy.rb'
+ - 'app/policies/suggestion_policy.rb'
+ - 'app/policies/timebox_policy.rb'
+ - 'app/policies/timelog_policy.rb'
+ - 'app/policies/todo_policy.rb'
+ - 'app/policies/user_policy.rb'
+ - 'app/policies/wiki_page_policy.rb'
+ - 'app/policies/wiki_policy.rb'
+ - 'app/policies/work_item_policy.rb'
+ - 'app/presenters/award_emoji_presenter.rb'
+ - 'app/presenters/blob_presenter.rb'
+ - 'app/presenters/board_presenter.rb'
+ - 'app/presenters/clusterable_presenter.rb'
+ - 'app/presenters/commit_presenter.rb'
+ - 'app/presenters/commit_status_presenter.rb'
+ - 'app/presenters/environment_presenter.rb'
+ - 'app/presenters/event_presenter.rb'
+ - 'app/presenters/generic_commit_status_presenter.rb'
+ - 'app/presenters/gitlab/blame_presenter.rb'
+ - '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'
+ - 'app/presenters/members_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/milestone_presenter.rb'
+ - 'app/presenters/pages_domain_presenter.rb'
+ - 'app/presenters/project_clusterable_presenter.rb'
+ - 'app/presenters/project_hook_presenter.rb'
+ - 'app/presenters/project_member_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/presenters/prometheus_alert_presenter.rb'
+ - 'app/presenters/release_presenter.rb'
+ - 'app/presenters/search_service_presenter.rb'
+ - 'app/presenters/sentry_error_presenter.rb'
+ - 'app/presenters/service_hook_presenter.rb'
+ - 'app/presenters/snippet_blob_presenter.rb'
+ - 'app/presenters/snippet_presenter.rb'
+ - 'app/presenters/todo_presenter.rb'
+ - 'app/presenters/tree_entry_presenter.rb'
+ - 'app/presenters/user_presenter.rb'
+ - 'app/presenters/web_hook_log_presenter.rb'
+ - 'app/serializers/accessibility_error_entity.rb'
+ - 'app/serializers/accessibility_reports_comparer_entity.rb'
+ - 'app/serializers/accessibility_reports_comparer_serializer.rb'
+ - 'app/serializers/analytics_build_entity.rb'
+ - 'app/serializers/analytics_build_serializer.rb'
+ - 'app/serializers/analytics_commit_entity.rb'
+ - 'app/serializers/analytics_commit_serializer.rb'
+ - 'app/serializers/analytics_generic_serializer.rb'
+ - 'app/serializers/analytics_issue_entity.rb'
+ - 'app/serializers/analytics_issue_serializer.rb'
+ - 'app/serializers/analytics_merge_request_entity.rb'
+ - 'app/serializers/analytics_merge_request_serializer.rb'
+ - 'app/serializers/analytics_stage_entity.rb'
+ - 'app/serializers/analytics_stage_serializer.rb'
+ - 'app/serializers/analytics_summary_entity.rb'
+ - 'app/serializers/analytics_summary_serializer.rb'
+ - 'app/serializers/award_emoji_entity.rb'
+ - 'app/serializers/base_discussion_entity.rb'
+ - 'app/serializers/base_serializer.rb'
+ - 'app/serializers/blob_entity.rb'
+ - 'app/serializers/board_serializer.rb'
+ - 'app/serializers/board_simple_entity.rb'
+ - 'app/serializers/build_action_entity.rb'
+ - 'app/serializers/build_artifact_entity.rb'
+ - 'app/serializers/build_coverage_entity.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/build_metadata_entity.rb'
+ - 'app/serializers/build_trace_entity.rb'
+ - 'app/serializers/build_trace_serializer.rb'
+ - 'app/serializers/cluster_application_entity.rb'
+ - 'app/serializers/cluster_entity.rb'
+ - 'app/serializers/cluster_serializer.rb'
+ - 'app/serializers/codequality_degradation_entity.rb'
+ - 'app/serializers/codequality_reports_comparer_entity.rb'
+ - 'app/serializers/codequality_reports_comparer_serializer.rb'
+ - 'app/serializers/cohort_activity_month_entity.rb'
+ - 'app/serializers/cohort_entity.rb'
+ - 'app/serializers/cohorts_entity.rb'
+ - 'app/serializers/cohorts_serializer.rb'
+ - 'app/serializers/commit_entity.rb'
+ - 'app/serializers/container_repositories_serializer.rb'
+ - 'app/serializers/container_repository_entity.rb'
+ - 'app/serializers/container_tag_entity.rb'
+ - 'app/serializers/container_tags_serializer.rb'
+ - 'app/serializers/context_commits_diff_entity.rb'
+ - 'app/serializers/current_board_entity.rb'
+ - 'app/serializers/current_board_serializer.rb'
+ - 'app/serializers/current_user_entity.rb'
+ - 'app/serializers/deploy_key_entity.rb'
+ - 'app/serializers/deploy_key_serializer.rb'
+ - 'app/serializers/deploy_keys_project_entity.rb'
+ - 'app/serializers/deployment_cluster_entity.rb'
+ - 'app/serializers/deployment_entity.rb'
+ - 'app/serializers/deployment_serializer.rb'
+ - 'app/serializers/detailed_status_entity.rb'
+ - 'app/serializers/diff_file_base_entity.rb'
+ - 'app/serializers/diff_file_entity.rb'
+ - 'app/serializers/diff_file_metadata_entity.rb'
+ - 'app/serializers/diff_line_entity.rb'
+ - 'app/serializers/diff_line_parallel_entity.rb'
+ - 'app/serializers/diff_line_serializer.rb'
+ - 'app/serializers/diff_viewer_entity.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/diffs_metadata_entity.rb'
+ - 'app/serializers/diffs_metadata_serializer.rb'
+ - 'app/serializers/diffs_serializer.rb'
+ - 'app/serializers/discussion_diff_file_entity.rb'
+ - 'app/serializers/discussion_entity.rb'
+ - 'app/serializers/discussion_serializer.rb'
+ - 'app/serializers/draft_note_entity.rb'
+ - 'app/serializers/draft_note_serializer.rb'
+ - 'app/serializers/entity_request.rb'
+ - 'app/serializers/environment_entity.rb'
+ - 'app/serializers/environment_serializer.rb'
+ - 'app/serializers/environment_status_entity.rb'
+ - 'app/serializers/environment_status_serializer.rb'
+ - 'app/serializers/feature_flag_entity.rb'
+ - 'app/serializers/feature_flag_serializer.rb'
+ - 'app/serializers/feature_flag_summary_entity.rb'
+ - 'app/serializers/feature_flag_summary_serializer.rb'
+ - 'app/serializers/feature_flags_client_entity.rb'
+ - 'app/serializers/feature_flags_client_serializer.rb'
+ - 'app/serializers/fork_namespace_entity.rb'
+ - 'app/serializers/fork_namespace_serializer.rb'
+ - 'app/serializers/group_basic_entity.rb'
+ - 'app/serializers/group_child_entity.rb'
+ - 'app/serializers/group_child_serializer.rb'
+ - 'app/serializers/group_deploy_key_entity.rb'
+ - 'app/serializers/group_deploy_key_serializer.rb'
+ - 'app/serializers/group_deploy_keys_group_entity.rb'
+ - 'app/serializers/group_entity.rb'
+ - 'app/serializers/group_issuable_autocomplete_entity.rb'
+ - 'app/serializers/group_issuable_autocomplete_serializer.rb'
+ - 'app/serializers/group_serializer.rb'
+ - 'app/serializers/issuable_entity.rb'
+ - 'app/serializers/issuable_sidebar_basic_entity.rb'
+ - 'app/serializers/issuable_sidebar_extras_entity.rb'
+ - 'app/serializers/issuable_sidebar_todo_entity.rb'
+ - 'app/serializers/issue_board_entity.rb'
+ - 'app/serializers/issue_entity.rb'
+ - 'app/serializers/issue_serializer.rb'
+ - 'app/serializers/issue_sidebar_basic_entity.rb'
+ - 'app/serializers/issue_sidebar_extras_entity.rb'
+ - 'app/serializers/job_artifact_report_entity.rb'
+ - 'app/serializers/job_group_entity.rb'
+ - 'app/serializers/label_entity.rb'
+ - 'app/serializers/label_serializer.rb'
+ - 'app/serializers/lfs_file_lock_entity.rb'
+ - 'app/serializers/lfs_file_lock_serializer.rb'
+ - 'app/serializers/linked_issue_entity.rb'
+ - 'app/serializers/linked_project_issue_entity.rb'
+ - 'app/serializers/linked_project_issue_serializer.rb'
+ - 'app/serializers/member_entity.rb'
+ - 'app/serializers/member_serializer.rb'
+ - 'app/serializers/member_user_entity.rb'
+ - 'app/serializers/merge_request_basic_entity.rb'
+ - 'app/serializers/merge_request_create_entity.rb'
+ - 'app/serializers/merge_request_create_serializer.rb'
+ - 'app/serializers/merge_request_current_user_entity.rb'
+ - 'app/serializers/merge_request_diff_entity.rb'
+ - 'app/serializers/merge_request_for_pipeline_entity.rb'
+ - 'app/serializers/merge_request_metrics_entity.rb'
+ - 'app/serializers/merge_request_noteable_entity.rb'
+ - 'app/serializers/merge_request_poll_cached_widget_entity.rb'
+ - 'app/serializers/merge_request_poll_widget_entity.rb'
+ - 'app/serializers/merge_request_serializer.rb'
+ - 'app/serializers/merge_request_sidebar_basic_entity.rb'
+ - 'app/serializers/merge_request_sidebar_extras_entity.rb'
+ - 'app/serializers/merge_request_user_entity.rb'
+ - 'app/serializers/merge_request_widget_commit_entity.rb'
+ - 'app/serializers/merge_request_widget_entity.rb'
+ - 'app/serializers/move_to_project_entity.rb'
+ - 'app/serializers/move_to_project_serializer.rb'
+ - 'app/serializers/namespace_basic_entity.rb'
+ - 'app/serializers/namespace_serializer.rb'
+ - 'app/serializers/note_attachment_entity.rb'
+ - 'app/serializers/note_entity.rb'
+ - 'app/serializers/note_user_entity.rb'
+ - 'app/serializers/paginated_diff_entity.rb'
+ - 'app/serializers/paginated_diff_serializer.rb'
+ - 'app/serializers/pipeline_details_entity.rb'
+ - 'app/serializers/pipeline_serializer.rb'
+ - 'app/serializers/project_entity.rb'
+ - 'app/serializers/project_import_entity.rb'
+ - 'app/serializers/project_mirror_entity.rb'
+ - 'app/serializers/project_mirror_serializer.rb'
+ - 'app/serializers/project_note_entity.rb'
+ - 'app/serializers/project_note_serializer.rb'
+ - 'app/serializers/project_serializer.rb'
+ - 'app/serializers/prometheus_alert_entity.rb'
+ - 'app/serializers/prometheus_alert_serializer.rb'
+ - 'app/serializers/prometheus_metric_entity.rb'
+ - 'app/serializers/prometheus_metric_serializer.rb'
+ - 'app/serializers/release_entity.rb'
+ - 'app/serializers/release_serializer.rb'
+ - 'app/serializers/remote_mirror_entity.rb'
+ - 'app/serializers/review_app_setup_entity.rb'
+ - 'app/serializers/review_app_setup_serializer.rb'
+ - 'app/serializers/rollout_status_entity.rb'
+ - 'app/serializers/route_entity.rb'
+ - 'app/serializers/route_serializer.rb'
+ - 'app/serializers/runner_entity.rb'
+ - 'app/serializers/service_event_entity.rb'
+ - 'app/serializers/service_event_serializer.rb'
+ - 'app/serializers/service_field_entity.rb'
+ - 'app/serializers/service_field_serializer.rb'
+ - 'app/serializers/stage_entity.rb'
+ - 'app/serializers/stage_serializer.rb'
+ - 'app/serializers/suggestion_entity.rb'
+ - 'app/serializers/suggestion_serializer.rb'
+ - 'app/serializers/test_case_entity.rb'
+ - 'app/serializers/test_report_entity.rb'
+ - 'app/serializers/test_report_serializer.rb'
+ - 'app/serializers/test_report_summary_entity.rb'
+ - 'app/serializers/test_report_summary_serializer.rb'
+ - 'app/serializers/test_reports_comparer_entity.rb'
+ - 'app/serializers/test_reports_comparer_serializer.rb'
+ - 'app/serializers/test_suite_comparer_entity.rb'
+ - 'app/serializers/test_suite_entity.rb'
+ - 'app/serializers/test_suite_serializer.rb'
+ - 'app/serializers/test_suite_summary_entity.rb'
+ - 'app/serializers/trigger_variable_entity.rb'
+ - 'app/serializers/triggered_pipeline_entity.rb'
+ - 'app/serializers/user_entity.rb'
+ - 'app/serializers/user_preference_entity.rb'
+ - 'app/serializers/user_serializer.rb'
+ - 'app/serializers/web_ide_terminal_entity.rb'
+ - 'app/serializers/web_ide_terminal_serializer.rb'
+ - 'app/services/access_token_validation_service.rb'
+ - 'app/services/audit_event_service.rb'
+ - 'app/services/auto_merge_service.rb'
+ - 'app/services/base_container_service.rb'
+ - 'app/services/base_count_service.rb'
+ - 'app/services/base_project_service.rb'
+ - 'app/services/base_renderer.rb'
+ - 'app/services/base_service.rb'
+ - 'app/services/bulk_create_integration_service.rb'
+ - 'app/services/bulk_push_event_payload_service.rb'
+ - 'app/services/bulk_update_integration_service.rb'
+ - 'app/services/cohorts_service.rb'
+ - 'app/services/compare_service.rb'
+ - 'app/services/event_create_service.rb'
+ - 'app/services/gravatar_service.rb'
+ - 'app/services/import_export_clean_up_service.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/markdown_content_rewriter_service.rb'
+ - 'app/services/merge_request_metrics_service.rb'
+ - 'app/services/metrics_service.rb'
+ - 'app/services/note_summary.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/onboarding_progress_service.rb'
+ - 'app/services/post_receive_service.rb'
+ - 'app/services/preview_markdown_service.rb'
+ - 'app/services/push_event_payload_service.rb'
+ - 'app/services/repository_archive_clean_up_service.rb'
+ - 'app/services/reset_project_cache_service.rb'
+ - 'app/services/search_service.rb'
+ - 'app/services/service_response.rb'
+ - 'app/services/system_hooks_service.rb'
+ - 'app/services/task_list_toggle_service.rb'
+ - 'app/services/todo_service.rb'
+ - 'app/services/update_container_registry_info_service.rb'
+ - 'app/services/upload_service.rb'
+ - 'app/services/user_agent_detail_service.rb'
+ - 'app/services/user_project_access_changed_service.rb'
+ - 'app/services/verify_pages_domain_service.rb'
+ - 'app/services/web_hook_service.rb'
+ - 'app/services/x509_certificate_revoke_service.rb'
+ - 'app/uploaders/attachment_uploader.rb'
+ - 'app/uploaders/avatar_uploader.rb'
+ - 'app/uploaders/deleted_object_uploader.rb'
+ - 'app/uploaders/external_diff_uploader.rb'
+ - 'app/uploaders/favicon_uploader.rb'
+ - 'app/uploaders/file_mover.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/uploaders/import_export_uploader.rb'
+ - 'app/uploaders/job_artifact_uploader.rb'
+ - 'app/uploaders/lfs_object_uploader.rb'
+ - 'app/uploaders/namespace_file_uploader.rb'
+ - 'app/uploaders/personal_file_uploader.rb'
+ - 'app/validators/abstract_path_validator.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/any_field_validator.rb'
+ - 'app/validators/array_members_validator.rb'
+ - 'app/validators/branch_filter_validator.rb'
+ - 'app/validators/certificate_fingerprint_validator.rb'
+ - 'app/validators/certificate_key_validator.rb'
+ - 'app/validators/certificate_validator.rb'
+ - 'app/validators/cluster_name_validator.rb'
+ - 'app/validators/color_validator.rb'
+ - 'app/validators/cron_freeze_period_timezone_validator.rb'
+ - 'app/validators/cron_timezone_validator.rb'
+ - 'app/validators/cron_validator.rb'
+ - 'app/validators/devise_email_validator.rb'
+ - 'app/validators/duration_validator.rb'
+ - 'app/validators/feature_flag_strategies_validator.rb'
+ - 'app/validators/feature_flag_user_xids_validator.rb'
+ - 'app/validators/future_date_validator.rb'
+ - 'app/validators/gitlab/emoji_name_validator.rb'
+ - 'app/validators/gitlab/zoom_url_validator.rb'
+ - 'app/validators/html_safety_validator.rb'
+ - 'app/validators/ip_address_validator.rb'
+ - 'app/validators/js_regex_validator.rb'
+ - 'app/validators/json_schema_validator.rb'
+ - 'app/validators/key_restriction_validator.rb'
+ - 'app/validators/line_code_validator.rb'
+ - 'app/validators/named_ecdsa_key_validator.rb'
+ - 'app/validators/namespace_path_validator.rb'
+ - 'app/validators/nested_attributes_duplicates_validator.rb'
+ - 'app/validators/project_path_validator.rb'
+ - 'app/validators/public_url_validator.rb'
+ - 'app/validators/qualified_domain_array_validator.rb'
+ - 'app/validators/rsa_key_validator.rb'
+ - 'app/validators/same_project_association_validator.rb'
+ - 'app/validators/sha_validator.rb'
+ - 'app/validators/system_hook_url_validator.rb'
+ - 'app/validators/top_level_group_validator.rb'
+ - 'app/validators/untrusted_regexp_validator.rb'
+ - 'app/validators/x509_certificate_credentials_validator.rb'
+ - 'app/workers/admin_email_worker.rb'
+ - 'app/workers/approve_blocked_pending_approval_users_worker.rb'
+ - 'app/workers/archive_trace_worker.rb'
+ - 'app/workers/authorized_keys_worker.rb'
+ - 'app/workers/authorized_projects_worker.rb'
+ - 'app/workers/auto_merge_process_worker.rb'
+ - 'app/workers/background_migration_worker.rb'
+ - 'app/workers/build_finished_worker.rb'
+ - 'app/workers/build_hooks_worker.rb'
+ - 'app/workers/build_queue_worker.rb'
+ - 'app/workers/build_success_worker.rb'
+ - 'app/workers/bulk_import_worker.rb'
+ - 'app/workers/chat_notification_worker.rb'
+ - 'app/workers/ci_platform_metrics_update_cron_worker.rb'
+ - 'app/workers/cleanup_container_repository_worker.rb'
+ - 'app/workers/cluster_configure_istio_worker.rb'
+ - 'app/workers/cluster_install_app_worker.rb'
+ - 'app/workers/cluster_patch_app_worker.rb'
+ - 'app/workers/cluster_provision_worker.rb'
+ - 'app/workers/cluster_update_app_worker.rb'
+ - 'app/workers/cluster_upgrade_app_worker.rb'
+ - 'app/workers/cluster_wait_for_app_installation_worker.rb'
+ - 'app/workers/cluster_wait_for_app_update_worker.rb'
+ - 'app/workers/cluster_wait_for_ingress_ip_address_worker.rb'
+ - 'app/workers/container_expiration_policy_worker.rb'
+ - 'app/workers/create_commit_signature_worker.rb'
+ - 'app/workers/create_note_diff_file_worker.rb'
+ - 'app/workers/create_pipeline_worker.rb'
+ - 'app/workers/delete_container_repository_worker.rb'
+ - 'app/workers/delete_diff_files_worker.rb'
+ - 'app/workers/delete_merged_branches_worker.rb'
+ - 'app/workers/delete_stored_files_worker.rb'
+ - 'app/workers/delete_user_worker.rb'
+ - 'app/workers/destroy_pages_deployments_worker.rb'
+ - 'app/workers/detect_repository_languages_worker.rb'
+ - 'app/workers/disallow_two_factor_for_group_worker.rb'
+ - 'app/workers/disallow_two_factor_for_subgroups_worker.rb'
+ - 'app/workers/email_receiver_worker.rb'
+ - 'app/workers/emails_on_push_worker.rb'
+ - 'app/workers/error_tracking_issue_link_worker.rb'
+ - 'app/workers/expire_build_artifacts_worker.rb'
+ - 'app/workers/expire_job_cache_worker.rb'
+ - 'app/workers/expire_pipeline_cache_worker.rb'
+ - 'app/workers/export_csv_worker.rb'
+ - 'app/workers/external_service_reactive_caching_worker.rb'
+ - 'app/workers/file_hook_worker.rb'
+ - 'app/workers/flush_counter_increments_worker.rb'
+ - 'app/workers/gitlab_performance_bar_stats_worker.rb'
+ - 'app/workers/gitlab_service_ping_worker.rb'
+ - 'app/workers/gitlab_shell_worker.rb'
+ - 'app/workers/group_destroy_worker.rb'
+ - 'app/workers/group_export_worker.rb'
+ - 'app/workers/group_import_worker.rb'
+ - 'app/workers/import_export_project_cleanup_worker.rb'
+ - 'app/workers/import_issues_csv_worker.rb'
+ - 'app/workers/invalid_gpg_signature_update_worker.rb'
+ - 'app/workers/irker_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'
+ - 'app/workers/merge_worker.rb'
+ - 'app/workers/migrate_external_diffs_worker.rb'
+ - 'app/workers/namespaceless_project_destroy_worker.rb'
+ - 'app/workers/new_issue_worker.rb'
+ - 'app/workers/new_merge_request_worker.rb'
+ - 'app/workers/new_note_worker.rb'
+ - 'app/workers/pages_domain_removal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_worker.rb'
+ - 'app/workers/pages_domain_verification_cron_worker.rb'
+ - 'app/workers/pages_domain_verification_worker.rb'
+ - 'app/workers/pages_transfer_worker.rb'
+ - 'app/workers/pages_worker.rb'
+ - 'app/workers/partition_creation_worker.rb'
+ - 'app/workers/pipeline_hooks_worker.rb'
+ - 'app/workers/pipeline_metrics_worker.rb'
+ - 'app/workers/pipeline_notification_worker.rb'
+ - 'app/workers/pipeline_process_worker.rb'
+ - 'app/workers/pipeline_schedule_worker.rb'
+ - 'app/workers/post_receive.rb'
+ - 'app/workers/process_commit_worker.rb'
+ - 'app/workers/project_cache_worker.rb'
+ - 'app/workers/project_daily_statistics_worker.rb'
+ - 'app/workers/project_destroy_worker.rb'
+ - 'app/workers/project_export_worker.rb'
+ - 'app/workers/project_service_worker.rb'
+ - 'app/workers/propagate_integration_group_worker.rb'
+ - 'app/workers/propagate_integration_inherit_descendant_worker.rb'
+ - 'app/workers/propagate_integration_inherit_worker.rb'
+ - 'app/workers/propagate_integration_project_worker.rb'
+ - 'app/workers/propagate_integration_worker.rb'
+ - 'app/workers/prune_old_events_worker.rb'
+ - 'app/workers/purge_dependency_proxy_cache_worker.rb'
+ - 'app/workers/reactive_caching_worker.rb'
+ - 'app/workers/rebase_worker.rb'
+ - 'app/workers/remote_mirror_notification_worker.rb'
+ - 'app/workers/remove_expired_group_links_worker.rb'
+ - 'app/workers/remove_expired_members_worker.rb'
+ - 'app/workers/remove_unaccepted_member_invites_worker.rb'
+ - 'app/workers/remove_unreferenced_lfs_objects_worker.rb'
+ - 'app/workers/repository_archive_cache_worker.rb'
+ - 'app/workers/repository_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'
+ - 'app/workers/schedule_migrate_external_diffs_worker.rb'
+ - 'app/workers/self_monitoring_project_create_worker.rb'
+ - 'app/workers/self_monitoring_project_delete_worker.rb'
+ - 'app/workers/service_desk_email_receiver_worker.rb'
+ - 'app/workers/stage_update_worker.rb'
+ - 'app/workers/stuck_ci_jobs_worker.rb'
+ - 'app/workers/stuck_export_jobs_worker.rb'
+ - 'app/workers/stuck_merge_jobs_worker.rb'
+ - 'app/workers/system_hook_push_worker.rb'
+ - 'app/workers/trending_projects_worker.rb'
+ - 'app/workers/update_container_registry_info_worker.rb'
+ - 'app/workers/update_external_pull_requests_worker.rb'
+ - 'app/workers/update_head_pipeline_for_merge_request_worker.rb'
+ - 'app/workers/update_highest_role_worker.rb'
+ - 'app/workers/update_merge_requests_worker.rb'
+ - 'app/workers/update_project_statistics_worker.rb'
+ - 'app/workers/upload_checksum_worker.rb'
+ - 'app/workers/wait_for_cluster_creation_worker.rb'
+ - 'app/workers/web_hook_worker.rb'
+ - 'app/workers/x509_certificate_revoke_worker.rb'
+ - 'app/workers/x509_issuer_crl_check_worker.rb'
+ - 'ee/app/controllers/countries_controller.rb'
+ - 'ee/app/controllers/country_states_controller.rb'
+ - 'ee/app/controllers/omniauth_kerberos_spnego_controller.rb'
+ - 'ee/app/controllers/operations_controller.rb'
+ - '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/billed_users_finder.rb'
+ - 'ee/app/finders/custom_project_templates_finder.rb'
+ - 'ee/app/finders/dast_scanner_profiles_finder.rb'
+ - 'ee/app/finders/dast_site_profiles_finder.rb'
+ - 'ee/app/finders/dast_site_validations_finder.rb'
+ - 'ee/app/finders/epics_finder.rb'
+ - 'ee/app/finders/geo_node_finder.rb'
+ - 'ee/app/finders/gpg_keys_finder.rb'
+ - 'ee/app/finders/group_saml_identity_finder.rb'
+ - 'ee/app/finders/groups_with_templates_finder.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/finders/licenses_finder.rb'
+ - 'ee/app/finders/merge_trains_finder.rb'
+ - 'ee/app/finders/productivity_analytics_finder.rb'
+ - 'ee/app/finders/scim_finder.rb'
+ - 'ee/app/finders/software_license_policies_finder.rb'
+ - 'ee/app/mailers/ci_minutes_usage_mailer.rb'
+ - 'ee/app/mailers/credentials_inventory_mailer.rb'
+ - 'ee/app/mailers/license_mailer.rb'
+ - 'ee/app/mailers/previews/ci_minutes_usage_mailer_preview.rb'
+ - 'ee/app/mailers/previews/license_mailer_preview.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/approval_merge_request_rule_source.rb'
+ - 'ee/app/models/approval_project_rule.rb'
+ - 'ee/app/models/approval_project_rules_protected_branch.rb'
+ - 'ee/app/models/approval_state.rb'
+ - 'ee/app/models/approval_wrapped_any_approver_rule.rb'
+ - 'ee/app/models/approval_wrapped_code_owner_rule.rb'
+ - 'ee/app/models/approval_wrapped_rule.rb'
+ - 'ee/app/models/approver.rb'
+ - 'ee/app/models/approver_group.rb'
+ - 'ee/app/models/board_assignee.rb'
+ - 'ee/app/models/board_label.rb'
+ - 'ee/app/models/board_user_preference.rb'
+ - 'ee/app/models/burndown.rb'
+ - 'ee/app/models/dast_scanner_profile.rb'
+ - 'ee/app/models/dast_site.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/dast_site_token.rb'
+ - 'ee/app/models/dast_site_validation.rb'
+ - 'ee/app/models/elasticsearch_indexed_namespace.rb'
+ - 'ee/app/models/elasticsearch_indexed_project.rb'
+ - 'ee/app/models/epic_issue.rb'
+ - 'ee/app/models/epic_user_mention.rb'
+ - 'ee/app/models/feature_flag_issue.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/geo_node_namespace_link.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/gitlab/seat_link_data.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/gitlab_subscription_history.rb'
+ - 'ee/app/models/group_deletion_schedule.rb'
+ - 'ee/app/models/group_merge_request_approval_setting.rb'
+ - 'ee/app/models/group_wiki.rb'
+ - 'ee/app/models/group_wiki_repository.rb'
+ - 'ee/app/models/historical_data.rb'
+ - 'ee/app/models/hooks/group_hook.rb'
+ - 'ee/app/models/index_status.rb'
+ - 'ee/app/models/insight.rb'
+ - 'ee/app/models/instance_security_dashboard.rb'
+ - 'ee/app/models/ip_restriction.rb'
+ - 'ee/app/models/issuable_metric_image.rb'
+ - 'ee/app/models/issuable_sla.rb'
+ - 'ee/app/models/issuables_analytics.rb'
+ - 'ee/app/models/iteration_note.rb'
+ - 'ee/app/models/ldap_group_link.rb'
+ - 'ee/app/models/ldap_key.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/merge_request_block.rb'
+ - 'ee/app/models/merge_request_diff_detail.rb'
+ - 'ee/app/models/merge_train.rb'
+ - 'ee/app/models/namespace_limit.rb'
+ - 'ee/app/models/path_lock.rb'
+ - 'ee/app/models/productivity_analytics.rb'
+ - 'ee/app/models/project_alias.rb'
+ - 'ee/app/models/project_repository_state.rb'
+ - 'ee/app/models/project_security_setting.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/push_rule.rb'
+ - 'ee/app/models/resource_iteration_event.rb'
+ - 'ee/app/models/resource_weight_event.rb'
+ - 'ee/app/models/saml_group_link.rb'
+ - 'ee/app/models/saml_provider.rb'
+ - 'ee/app/models/scim_identity.rb'
+ - 'ee/app/models/scim_oauth_access_token.rb'
+ - 'ee/app/models/scoped_label_set.rb'
+ - 'ee/app/models/slack_integration.rb'
+ - 'ee/app/models/smartcard_identity.rb'
+ - 'ee/app/models/software_license.rb'
+ - 'ee/app/models/software_license_policy.rb'
+ - 'ee/app/models/storage_shard.rb'
+ - 'ee/app/models/user_permission_export_upload.rb'
+ - 'ee/app/models/users_ops_dashboard_project.rb'
+ - 'ee/app/models/users_security_dashboard_project.rb'
+ - 'ee/app/models/vulnerability_user_mention.rb'
+ - 'ee/app/models/weight_note.rb'
+ - 'ee/app/policies/approval_merge_request_rule_policy.rb'
+ - 'ee/app/policies/approval_project_rule_policy.rb'
+ - 'ee/app/policies/approval_state_policy.rb'
+ - 'ee/app/policies/dast_scanner_profile_policy.rb'
+ - 'ee/app/policies/dast_site_profile_policy.rb'
+ - 'ee/app/policies/dast_site_validation_policy.rb'
+ - 'ee/app/policies/epic_policy.rb'
+ - 'ee/app/policies/geo_node_policy.rb'
+ - 'ee/app/policies/instance_security_dashboard_policy.rb'
+ - 'ee/app/policies/issuable_metric_image_policy.rb'
+ - 'ee/app/policies/iteration_policy.rb'
+ - 'ee/app/policies/push_rule_policy.rb'
+ - 'ee/app/policies/saml_provider_policy.rb'
+ - 'ee/app/policies/vulnerability_policy.rb'
+ - 'ee/app/presenters/approval_rule_presenter.rb'
+ - 'ee/app/presenters/audit_event_presenter.rb'
+ - 'ee/app/presenters/epic_issue_presenter.rb'
+ - 'ee/app/presenters/epic_presenter.rb'
+ - 'ee/app/presenters/iteration_presenter.rb'
+ - 'ee/app/presenters/merge_request_approver_presenter.rb'
+ - 'ee/app/presenters/subscription_presenter.rb'
+ - 'ee/app/presenters/vulnerability_presenter.rb'
+ - 'ee/app/serializers/audit_event_entity.rb'
+ - 'ee/app/serializers/audit_event_serializer.rb'
+ - 'ee/app/serializers/blocking_merge_request_entity.rb'
+ - 'ee/app/serializers/board_assignee_entity.rb'
+ - 'ee/app/serializers/board_label_entity.rb'
+ - 'ee/app/serializers/board_milestone_entity.rb'
+ - 'ee/app/serializers/dashboard_environment_entity.rb'
+ - 'ee/app/serializers/dashboard_environments_project_entity.rb'
+ - 'ee/app/serializers/dashboard_environments_serializer.rb'
+ - 'ee/app/serializers/dashboard_operations_project_entity.rb'
+ - 'ee/app/serializers/dashboard_operations_serializer.rb'
+ - 'ee/app/serializers/dependency_entity.rb'
+ - 'ee/app/serializers/dependency_list_entity.rb'
+ - 'ee/app/serializers/dependency_list_serializer.rb'
+ - 'ee/app/serializers/epic_base_entity.rb'
+ - 'ee/app/serializers/epic_entity.rb'
+ - 'ee/app/serializers/epic_note_entity.rb'
+ - 'ee/app/serializers/epic_note_serializer.rb'
+ - 'ee/app/serializers/epic_serializer.rb'
+ - 'ee/app/serializers/file_lock_entity.rb'
+ - 'ee/app/serializers/geo_design_registry_entity.rb'
+ - 'ee/app/serializers/geo_design_registry_serializer.rb'
+ - 'ee/app/serializers/geo_node_serializer.rb'
+ - 'ee/app/serializers/geo_node_status_serializer.rb'
+ - 'ee/app/serializers/geo_project_registry_entity.rb'
+ - 'ee/app/serializers/geo_project_registry_serializer.rb'
+ - '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_entity.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'
+ - 'ee/app/serializers/licenses_list_entity.rb'
+ - 'ee/app/serializers/licenses_list_serializer.rb'
+ - 'ee/app/serializers/linked_epic_entity.rb'
+ - 'ee/app/serializers/linked_epic_issue_entity.rb'
+ - 'ee/app/serializers/linked_epic_issue_serializer.rb'
+ - 'ee/app/serializers/linked_epic_serializer.rb'
+ - 'ee/app/serializers/linked_feature_flag_issue_entity.rb'
+ - 'ee/app/serializers/linked_feature_flag_issue_serializer.rb'
+ - 'ee/app/serializers/metrics_report_metric_entity.rb'
+ - 'ee/app/serializers/metrics_reports_comparer_entity.rb'
+ - 'ee/app/serializers/metrics_reports_comparer_serializer.rb'
+ - 'ee/app/serializers/milestone_serializer.rb'
+ - 'ee/app/serializers/namespace_entity.rb'
+ - 'ee/app/serializers/productivity_analytics_merge_request_entity.rb'
+ - 'ee/app/serializers/report_list_entity.rb'
+ - 'ee/app/serializers/scim_oauth_access_token_entity.rb'
+ - 'ee/app/serializers/storage_shard_entity.rb'
+ - 'ee/app/serializers/storage_shard_serializer.rb'
+ - 'ee/app/serializers/user_analytics_entity.rb'
+ - 'ee/app/serializers/vulnerability_entity.rb'
+ - 'ee/app/serializers/vulnerability_note_entity.rb'
+ - 'ee/app/serializers/vulnerability_note_serializer.rb'
+ - 'ee/app/serializers/vulnerability_serializer.rb'
+ - 'ee/app/services/ldap_group_reset_service.rb'
+ - 'ee/app/services/start_pull_mirroring_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/validators/host_validator.rb'
+ - 'ee/app/validators/ldap_filter_validator.rb'
+ - 'ee/app/workers/active_user_count_threshold_worker.rb'
+ - 'ee/app/workers/adjourned_group_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_project_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_projects_deletion_cron_worker.rb'
+ - 'ee/app/workers/admin_emails_worker.rb'
+ - 'ee/app/workers/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'
+ - 'ee/app/workers/elastic_delete_project_worker.rb'
+ - 'ee/app/workers/elastic_full_index_worker.rb'
+ - 'ee/app/workers/elastic_index_bulk_cron_worker.rb'
+ - 'ee/app/workers/elastic_index_initial_bulk_cron_worker.rb'
+ - 'ee/app/workers/elastic_indexing_control_worker.rb'
+ - 'ee/app/workers/elastic_namespace_indexer_worker.rb'
+ - 'ee/app/workers/elastic_namespace_rollout_worker.rb'
+ - 'ee/app/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker.rb'
+ - 'ee/app/workers/geo_repository_destroy_worker.rb'
+ - 'ee/app/workers/group_saml_group_sync_worker.rb'
+ - 'ee/app/workers/historical_data_worker.rb'
+ - 'ee/app/workers/import_software_licenses_worker.rb'
+ - 'ee/app/workers/iterations_update_status_worker.rb'
+ - 'ee/app/workers/ldap_all_groups_sync_worker.rb'
+ - 'ee/app/workers/ldap_group_sync_worker.rb'
+ - 'ee/app/workers/ldap_sync_worker.rb'
+ - 'ee/app/workers/merge_request_reset_approvals_worker.rb'
+ - 'ee/app/workers/new_epic_worker.rb'
+ - 'ee/app/workers/project_import_schedule_worker.rb'
+ - 'ee/app/workers/project_template_export_worker.rb'
+ - 'ee/app/workers/refresh_license_compliance_checks_worker.rb'
+ - 'ee/app/workers/repository_push_audit_event_worker.rb'
+ - 'ee/app/workers/repository_update_mirror_worker.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb'
+ - 'ee/app/workers/store_security_reports_worker.rb'
+ - 'ee/app/workers/sync_seat_link_request_worker.rb'
+ - 'ee/app/workers/sync_seat_link_worker.rb'
+ - 'ee/app/workers/update_all_mirrors_worker.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'ee/lib/gitlab/auth_logger.rb'
+ - 'ee/lib/gitlab/authority_analyzer.rb'
+ - 'ee/lib/gitlab/cidr.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/lib/gitlab/expiring_subscription_message.rb'
+ - 'ee/lib/gitlab/geo_logger.rb'
+ - '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/manual_renewal_banner.rb'
+ - 'ee/lib/gitlab/pagination_delegate.rb'
+ - 'ee/lib/gitlab/path_locks_finder.rb'
+ - 'ee/lib/gitlab/proxy.rb'
+ - 'ee/lib/gitlab/return_to_location.rb'
+ - 'ee/lib/gitlab/update_mirror_service_json_logger.rb'
+ - 'ee/spec/support/elastic_query_name_inspector.rb'
+ - 'ee/spec/support/test_license.rb'
+ - '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'
+ - 'lib/generators/gitlab/usage_metric_definition_generator.rb'
+ - 'lib/generators/gitlab/usage_metric_generator.rb'
+ - 'lib/gitlab/anonymous_session.rb'
+ - 'lib/gitlab/app_json_logger.rb'
+ - 'lib/gitlab/app_logger.rb'
+ - 'lib/gitlab/app_text_logger.rb'
+ - 'lib/gitlab/application_context.rb'
+ - 'lib/gitlab/audit_json_logger.rb'
+ - 'lib/gitlab/auth_logger.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/avatar_cache.rb'
+ - 'lib/gitlab/backup_logger.rb'
+ - 'lib/gitlab/base_doorkeeper_controller.rb'
+ - 'lib/gitlab/batch_pop_queueing.rb'
+ - 'lib/gitlab/batch_worker_context.rb'
+ - 'lib/gitlab/blame.rb'
+ - 'lib/gitlab/branch_push_merge_commit_analyzer.rb'
+ - 'lib/gitlab/buffered_io.rb'
+ - 'lib/gitlab/build_access.rb'
+ - 'lib/gitlab/changes_list.rb'
+ - 'lib/gitlab/chaos.rb'
+ - 'lib/gitlab/chat_name_token.rb'
+ - 'lib/gitlab/ci_access.rb'
+ - 'lib/gitlab/closing_issue_extractor.rb'
+ - 'lib/gitlab/code_navigation_path.rb'
+ - 'lib/gitlab/color.rb'
+ - 'lib/gitlab/conan_token.rb'
+ - 'lib/gitlab/contributions_calendar.rb'
+ - 'lib/gitlab/contributor.rb'
+ - 'lib/gitlab/cross_project_access.rb'
+ - 'lib/gitlab/cross_project_access/check_collection.rb'
+ - 'lib/gitlab/cross_project_access/check_info.rb'
+ - 'lib/gitlab/cross_project_access/class_methods.rb'
+ - 'lib/gitlab/daemon.rb'
+ - 'lib/gitlab/deploy_key_access.rb'
+ - 'lib/gitlab/deprecation_json_logger.rb'
+ - 'lib/gitlab/devise_failure.rb'
+ - 'lib/gitlab/empty_search_results.rb'
+ - 'lib/gitlab/encrypted_command_base.rb'
+ - 'lib/gitlab/encrypted_configuration.rb'
+ - 'lib/gitlab/encrypted_ldap_command.rb'
+ - 'lib/gitlab/encrypted_smtp_command.rb'
+ - 'lib/gitlab/environment_logger.rb'
+ - 'lib/gitlab/exceptions_app.rb'
+ - 'lib/gitlab/exclusive_lease.rb'
+ - 'lib/gitlab/experiment/rollout/feature.rb'
+ - 'lib/gitlab/experimentation_logger.rb'
+ - 'lib/gitlab/fake_application_settings.rb'
+ - 'lib/gitlab/favicon.rb'
+ - 'lib/gitlab/feature_categories.rb'
+ - 'lib/gitlab/file_finder.rb'
+ - 'lib/gitlab/file_hook_logger.rb'
+ - 'lib/gitlab/fips.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/git_access_design.rb'
+ - 'lib/gitlab/git_access_project.rb'
+ - 'lib/gitlab/git_access_snippet.rb'
+ - 'lib/gitlab/git_access_wiki.rb'
+ - 'lib/gitlab/git_logger.rb'
+ - 'lib/gitlab/git_post_receive.rb'
+ - 'lib/gitlab/gl_repository.rb'
+ - 'lib/gitlab/gl_repository/identifier.rb'
+ - 'lib/gitlab/gl_repository/repo_type.rb'
+ - 'lib/gitlab/graphql_logger.rb'
+ - 'lib/gitlab/group_search_results.rb'
+ - 'lib/gitlab/hashed_path.rb'
+ - 'lib/gitlab/highlight.rb'
+ - 'lib/gitlab/hotlinking_detector.rb'
+ - 'lib/gitlab/http.rb'
+ - 'lib/gitlab/http_connection_adapter.rb'
+ - 'lib/gitlab/http_io.rb'
+ - 'lib/gitlab/import_formatter.rb'
+ - 'lib/gitlab/inactive_projects_deletion_warning_tracker.rb'
+ - 'lib/gitlab/insecure_key_fingerprint.rb'
+ - 'lib/gitlab/integrations_logger.rb'
+ - 'lib/gitlab/issuable_metadata.rb'
+ - 'lib/gitlab/issuables_count_for_state.rb'
+ - 'lib/gitlab/issues_labels.rb'
+ - 'lib/gitlab/job_waiter.rb'
+ - 'lib/gitlab/json_cache.rb'
+ - 'lib/gitlab/json_logger.rb'
+ - 'lib/gitlab/jwt_token.rb'
+ - 'lib/gitlab/language_detection.rb'
+ - 'lib/gitlab/lazy.rb'
+ - 'lib/gitlab/lfs_token.rb'
+ - 'lib/gitlab/log_timestamp_formatter.rb'
+ - 'lib/gitlab/logger.rb'
+ - 'lib/gitlab/marker_range.rb'
+ - 'lib/gitlab/multi_collection_paginator.rb'
+ - 'lib/gitlab/multi_destination_logger.rb'
+ - 'lib/gitlab/namespace_sanitizer.rb'
+ - 'lib/gitlab/namespaced_session_store.rb'
+ - 'lib/gitlab/net_http_adapter.rb'
+ - 'lib/gitlab/null_request_store.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/omniauth_initializer.rb'
+ - 'lib/gitlab/otp_key_rotator.rb'
+ - 'lib/gitlab/pages_transfer.rb'
+ - 'lib/gitlab/pipeline_scope_counts.rb'
+ - 'lib/gitlab/polling_interval.rb'
+ - 'lib/gitlab/process_memory_cache.rb'
+ - 'lib/gitlab/process_memory_cache/helper.rb'
+ - 'lib/gitlab/process_supervisor.rb'
+ - 'lib/gitlab/project_authorizations.rb'
+ - 'lib/gitlab/project_search_results.rb'
+ - 'lib/gitlab/project_template.rb'
+ - 'lib/gitlab/project_transfer.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/push_options.rb'
+ - 'lib/gitlab/reactive_cache_set_cache.rb'
+ - 'lib/gitlab/redacted_search_results_logger.rb'
+ - 'lib/gitlab/reference_counter.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/repository_cache.rb'
+ - 'lib/gitlab/repository_cache/preloader.rb'
+ - 'lib/gitlab/repository_check_logger.rb'
+ - 'lib/gitlab/repository_hash_cache.rb'
+ - 'lib/gitlab/repository_set_cache.rb'
+ - 'lib/gitlab/repository_size_checker.rb'
+ - 'lib/gitlab/repository_size_error_message.rb'
+ - 'lib/gitlab/request_context.rb'
+ - 'lib/gitlab/route_map.rb'
+ - 'lib/gitlab/safe_request_loader.rb'
+ - 'lib/gitlab/safe_request_purger.rb'
+ - 'lib/gitlab/sample_data_template.rb'
+ - 'lib/gitlab/search_context.rb'
+ - 'lib/gitlab/search_results.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/gitlab/session.rb'
+ - 'lib/gitlab/set_cache.rb'
+ - 'lib/gitlab/shard_health_cache.rb'
+ - 'lib/gitlab/shell.rb'
+ - 'lib/gitlab/sidekiq_migrate_jobs.rb'
+ - 'lib/gitlab/sidekiq_queue.rb'
+ - 'lib/gitlab/signed_commit.rb'
+ - 'lib/gitlab/signed_tag.rb'
+ - 'lib/gitlab/snippet_search_results.rb'
+ - 'lib/gitlab/sourcegraph.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/stack_prof.rb'
+ - 'lib/gitlab/string_placeholder_replacer.rb'
+ - 'lib/gitlab/string_range_marker.rb'
+ - 'lib/gitlab/string_regex_marker.rb'
+ - 'lib/gitlab/submodule_links.rb'
+ - 'lib/gitlab/tcp_checker.rb'
+ - 'lib/gitlab/terraform_registry_token.rb'
+ - 'lib/gitlab/throttle.rb'
+ - 'lib/gitlab/tree_summary.rb'
+ - 'lib/gitlab/unicode.rb'
+ - 'lib/gitlab/untrusted_regexp.rb'
+ - 'lib/gitlab/untrusted_regexp/ruby_syntax.rb'
+ - 'lib/gitlab/updated_notes_paginator.rb'
+ - 'lib/gitlab/uploads_transfer.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/url_builder.rb'
+ - 'lib/gitlab/url_helpers.rb'
+ - 'lib/gitlab/url_sanitizer.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/usage_data/topology.rb'
+ - 'lib/gitlab/usage_data_metrics.rb'
+ - 'lib/gitlab/usage_data_non_sql_metrics.rb'
+ - 'lib/gitlab/usage_data_queries.rb'
+ - 'lib/gitlab/user_access.rb'
+ - 'lib/gitlab/user_access_snippet.rb'
+ - 'lib/gitlab/uuid.rb'
+ - 'lib/gitlab/version_info.rb'
+ - 'lib/gitlab/visibility_level_checker.rb'
+ - 'lib/gitlab/wiki_file_finder.rb'
+ - 'lib/gitlab/workhorse.rb'
+ - 'lib/gitlab/zoom_link_extractor.rb'
+ - 'lib/tasks/gitlab/graphql.rake'
+ - 'lib/tasks/gitlab/seed/group_seed.rake'
+ - 'lib/tasks/import.rake'
+ - 'lib/tasks/tokens.rake'
+ - 'lib/uploaded_file.rb'
+ - 'lib/version_check.rb'
+ - 'spec/controllers/concerns/page_limiter_spec.rb'
+ - 'spec/lib/bitbucket/collection_spec.rb'
+ - 'spec/lib/gitlab/multi_destination_logger_spec.rb'
+ - 'spec/lib/marginalia_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/models/concerns/batch_destroy_dependent_associations_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/triggerable_hooks_spec.rb'
+ - 'spec/support/helpers/bare_repo_operations.rb'
+ - 'spec/support/helpers/ci_artifact_metadata_generator.rb'
+ - 'spec/support/helpers/fake_migration_classes.rb'
+ - 'spec/support/helpers/fake_u2f_device.rb'
+ - 'spec/support/helpers/fake_webauthn_device.rb'
+ - 'spec/support/helpers/markdown_feature.rb'
+ - 'spec/support/helpers/redis_without_keys.rb'
+ - 'spec/support/helpers/require_migration.rb'
+ - 'spec/support/models/merge_request_without_merge_request_diff.rb'
+ - 'spec/support/renameable_upload.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
diff --git a/.rubocop_todo/gitlab/policy_rule_boolean.yml b/.rubocop_todo/gitlab/policy_rule_boolean.yml
new file mode 100644
index 00000000000..64689eb8fa0
--- /dev/null
+++ b/.rubocop_todo/gitlab/policy_rule_boolean.yml
@@ -0,0 +1,4 @@
+---
+Gitlab/PolicyRuleBoolean:
+ Exclude:
+ - 'ee/app/policies/ee/identity_provider_policy.rb'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index acb8e8157cc..7ac7915b325 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -475,7 +475,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
- 'ee/spec/services/ee/protected_branches/create_service_spec.rb'
- 'ee/spec/services/epics/update_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/repository_verification_primary_service_spec.rb'
- 'ee/spec/services/groups/recent_merge_requests_count_service_spec.rb'
@@ -688,7 +687,6 @@ Layout/ArgumentAlignment:
- 'spec/finders/keys_finder_spec.rb'
- 'spec/finders/merge_requests_finder_spec.rb'
- 'spec/finders/personal_access_tokens_finder_spec.rb'
- - 'spec/finders/projects/serverless/functions_finder_spec.rb'
- 'spec/frontend/fixtures/issues.rb'
- 'spec/frontend/fixtures/merge_requests.rb'
- 'spec/frontend/fixtures/merge_requests_diffs.rb'
diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml
index 6d6d99ab869..6000d3ea1af 100644
--- a/.rubocop_todo/layout/first_hash_element_indentation.yml
+++ b/.rubocop_todo/layout/first_hash_element_indentation.yml
@@ -208,7 +208,6 @@ Layout/FirstHashElementIndentation:
- 'ee/spec/serializers/issues/linked_issue_feature_flag_entity_spec.rb'
- 'ee/spec/serializers/license_entity_spec.rb'
- 'ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb'
- - 'ee/spec/services/alert_management/network_alert_service_spec.rb'
- 'ee/spec/services/analytics/cycle_analytics/data_loader_service_spec.rb'
- 'ee/spec/services/app_sec/dast/profile_schedules/audit/update_service_spec.rb'
- 'ee/spec/services/app_sec/dast/profiles/audit/update_service_spec.rb'
diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml
index afcaab17ae1..32c4ddbced4 100644
--- a/.rubocop_todo/layout/hash_alignment.yml
+++ b/.rubocop_todo/layout/hash_alignment.yml
@@ -337,7 +337,7 @@ Layout/HashAlignment:
- 'ee/app/helpers/ee/feature_flags_helper.rb'
- 'ee/app/helpers/ee/sorting_helper.rb'
- 'ee/app/models/allowed_email_domain.rb'
- - 'ee/app/models/ci/minutes/quota.rb'
+ - 'ee/app/models/ci/minutes/usage.rb'
- 'ee/app/models/ee/application_setting.rb'
- 'ee/app/models/elastic/reindexing_task.rb'
- 'ee/app/models/gitlab_subscriptions/features.rb'
@@ -348,7 +348,6 @@ Layout/HashAlignment:
- 'ee/app/models/scim_identity.rb'
- 'ee/app/models/status_page/project_setting.rb'
- 'ee/app/serializers/ee/evidences/release_entity.rb'
- - 'ee/app/services/audit_events/repository_push_audit_event_service.rb'
- 'ee/app/services/ci/external_pull_requests/process_github_event_service.rb'
- 'ee/app/services/ci_cd/setup_project.rb'
- 'ee/app/services/ee/issues/base_service.rb'
@@ -384,11 +383,9 @@ Layout/HashAlignment:
- 'ee/lib/gitlab/elastic/helper.rb'
- 'ee/lib/gitlab/elastic/indexer.rb'
- 'ee/lib/gitlab/geo/replication/base_transfer.rb'
- - 'ee/lib/gitlab/prometheus/queries/packet_flow_query.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'
- - 'ee/spec/controllers/projects/security/network_policies_controller_spec.rb'
- 'ee/spec/controllers/projects/settings/operations_controller_spec.rb'
- 'ee/spec/controllers/trials_controller_spec.rb'
- 'ee/spec/factories/dependencies.rb'
@@ -429,7 +426,6 @@ Layout/HashAlignment:
- 'ee/spec/requests/projects/security/dast_site_profiles_controller_spec.rb'
- 'ee/spec/requests/rack_attack_global_spec.rb'
- 'ee/spec/serializers/integrations/zentao_serializers/issue_entity_spec.rb'
- - 'ee/spec/services/alert_management/network_alert_service_spec.rb'
- 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
- 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
- 'ee/spec/services/ci/create_pipeline_service/cross_needs_artifacts_spec.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index 8a922a1f163..a9200ee9fba 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -1179,7 +1179,6 @@ Layout/LineLength:
- 'ee/app/controllers/projects/licenses_controller.rb'
- 'ee/app/controllers/projects/protected_environments_controller.rb'
- 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
- - 'ee/app/controllers/projects/security/network_policies_controller.rb'
- 'ee/app/controllers/projects/security/policies_controller.rb'
- 'ee/app/controllers/projects/security/vulnerabilities/notes_controller.rb'
- 'ee/app/controllers/projects/threat_monitoring_controller.rb'
@@ -1573,8 +1572,6 @@ Layout/LineLength:
- '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/network_policies/resources_service.rb'
- - 'ee/app/services/network_policies/types.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'
@@ -1849,7 +1846,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/pseudonymizer/filter.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'
@@ -1905,7 +1901,6 @@ Layout/LineLength:
- 'ee/spec/controllers/projects/push_rules_controller_spec.rb'
- 'ee/spec/controllers/projects/runners_controller_spec.rb'
- 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
- - 'ee/spec/controllers/projects/security/network_policies_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'
@@ -2348,6 +2343,7 @@ Layout/LineLength:
- 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_latest_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
- 'ee/spec/lib/gitlab/code_owners/loader_spec.rb'
- 'ee/spec/lib/gitlab/code_owners_spec.rb'
@@ -2778,7 +2774,6 @@ Layout/LineLength:
- '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/network_alert_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'
@@ -2892,7 +2887,6 @@ Layout/LineLength:
- 'ee/spec/services/geo/blob_download_service_spec.rb'
- 'ee/spec/services/geo/blob_upload_service_spec.rb'
- 'ee/spec/services/geo/container_repository_sync_spec.rb'
- - 'ee/spec/services/geo/file_download_service_spec.rb'
- 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
- 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
- 'ee/spec/services/geo/hashed_storage_migration_service_spec.rb'
@@ -2945,10 +2939,6 @@ Layout/LineLength:
- '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/network_policies/delete_resource_service_spec.rb'
- - 'ee/spec/services/network_policies/deploy_resource_service_spec.rb'
- - 'ee/spec/services/network_policies/find_resource_service_spec.rb'
- - 'ee/spec/services/network_policies/resources_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'
@@ -3085,7 +3075,6 @@ Layout/LineLength:
- 'ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/group_saml/saml_provider/base_service_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/issue_epic_shared_examples.rb'
- - 'ee/spec/support/shared_examples/services/network_policies/kubeclient_error_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/scoped_label_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
- 'ee/spec/support/shared_examples/services/sync_issue_and_requirement_state_shared_examples.rb'
@@ -3141,7 +3130,6 @@ Layout/LineLength:
- 'ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb'
- 'ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/destroy_worker_spec.rb'
- - 'ee/spec/workers/geo/file_download_dispatch_worker_spec.rb'
- 'ee/spec/workers/geo/project_sync_worker_spec.rb'
- 'ee/spec/workers/geo/prune_event_log_worker_spec.rb'
- 'ee/spec/workers/geo/registry_sync_worker_spec.rb'
@@ -4424,7 +4412,6 @@ Layout/LineLength:
- 'spec/features/projects/files/user_browses_files_spec.rb'
- 'spec/features/projects/files/user_edits_files_spec.rb'
- 'spec/features/projects/infrastructure_registry_spec.rb'
- - 'spec/features/projects/integrations/prometheus_external_alerts_spec.rb'
- 'spec/features/projects/integrations/user_activates_issue_tracker_spec.rb'
- 'spec/features/projects/integrations/user_activates_jira_spec.rb'
- 'spec/features/projects/integrations/user_uses_inherited_settings_spec.rb'
@@ -5861,7 +5848,6 @@ Layout/LineLength:
- 'spec/requests/projects_controller_spec.rb'
- 'spec/requests/rack_attack_global_spec.rb'
- 'spec/requests/recursive_webhook_detection_spec.rb'
- - 'spec/requests/request_profiler_spec.rb'
- 'spec/requests/users_controller_spec.rb'
- 'spec/routing/admin_routing_spec.rb'
- 'spec/routing/group_routing_spec.rb'
@@ -5991,7 +5977,6 @@ Layout/LineLength:
- 'spec/services/environments/reset_auto_stop_service_spec.rb'
- 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
- 'spec/services/environments/stop_service_spec.rb'
- - 'spec/services/error_tracking/base_service_spec.rb'
- 'spec/services/events/destroy_service_spec.rb'
- 'spec/services/feature_flags/create_service_spec.rb'
- 'spec/services/feature_flags/update_service_spec.rb'
diff --git a/.rubocop_todo/layout/space_in_lambda_literal.yml b/.rubocop_todo/layout/space_in_lambda_literal.yml
index 7a2bd752b6e..2377553ccdb 100644
--- a/.rubocop_todo/layout/space_in_lambda_literal.yml
+++ b/.rubocop_todo/layout/space_in_lambda_literal.yml
@@ -351,7 +351,6 @@ Layout/SpaceInLambdaLiteral:
- 'lib/container_registry/base_client.rb'
- 'lib/container_registry/client.rb'
- 'lib/file_size_validator.rb'
- - 'lib/gitlab/background_migration/backfill_artifact_expiry_date.rb'
- 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
- 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
- 'lib/gitlab/cache/helpers.rb'
diff --git a/.rubocop_todo/layout/space_inside_block_braces.yml b/.rubocop_todo/layout/space_inside_block_braces.yml
index fc838ccadd8..b3830147692 100644
--- a/.rubocop_todo/layout/space_inside_block_braces.yml
+++ b/.rubocop_todo/layout/space_inside_block_braces.yml
@@ -51,7 +51,6 @@ Layout/SpaceInsideBlockBraces:
- 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
- 'ee/lib/elastic/latest/git_class_proxy.rb'
- 'ee/lib/gitlab/auth/smartcard/san_extension.rb'
- - 'ee/lib/pseudonymizer/dumper.rb'
- 'ee/lib/world.rb'
- 'ee/spec/controllers/autocomplete_controller_spec.rb'
- 'ee/spec/controllers/countries_controller_spec.rb'
@@ -134,8 +133,6 @@ Layout/SpaceInsideBlockBraces:
- 'ee/spec/lib/gitlab/search_context/builder_spec.rb'
- 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
- 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
- - 'ee/spec/lib/pseudonymizer/pager_spec.rb'
- - 'ee/spec/lib/pseudonymizer/uploader_spec.rb'
- 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
- 'ee/spec/migrations/geo/migrate_job_artifact_registry_spec.rb'
- 'ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb'
@@ -300,7 +297,6 @@ Layout/SpaceInsideBlockBraces:
- 'spec/controllers/import/manifest_controller_spec.rb'
- 'spec/controllers/projects/blame_controller_spec.rb'
- 'spec/controllers/projects/deploy_keys_controller_spec.rb'
- - 'spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb'
- 'spec/controllers/projects/feature_flags_controller_spec.rb'
- 'spec/controllers/projects/jobs_controller_spec.rb'
- 'spec/controllers/projects/labels_controller_spec.rb'
diff --git a/.rubocop_todo/layout/space_inside_parens.yml b/.rubocop_todo/layout/space_inside_parens.yml
index 62d33391a25..9022d41aeeb 100644
--- a/.rubocop_todo/layout/space_inside_parens.yml
+++ b/.rubocop_todo/layout/space_inside_parens.yml
@@ -90,7 +90,6 @@ Layout/SpaceInsideParens:
- '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/cluster_image_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_api_gitlab_ci_yaml_spec.rb'
- 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
diff --git a/.rubocop_todo/lint/missing_cop_enable_directive.yml b/.rubocop_todo/lint/missing_cop_enable_directive.yml
index a8edf6c85dc..589f98c9e02 100644
--- a/.rubocop_todo/lint/missing_cop_enable_directive.yml
+++ b/.rubocop_todo/lint/missing_cop_enable_directive.yml
@@ -6,7 +6,6 @@ Lint/MissingCopEnableDirective:
Exclude:
- 'app/controllers/admin/users_controller.rb'
- 'app/controllers/projects/forks_controller.rb'
- - 'app/finders/projects/serverless/functions_finder.rb'
- 'app/graphql/resolvers/group_issues_resolver.rb'
- 'app/graphql/resolvers/issues_resolver.rb'
- 'app/graphql/resolvers/project_members_resolver.rb'
diff --git a/.rubocop_todo/lint/mixed_regexp_capture_types.yml b/.rubocop_todo/lint/mixed_regexp_capture_types.yml
new file mode 100644
index 00000000000..f9872fdbd7f
--- /dev/null
+++ b/.rubocop_todo/lint/mixed_regexp_capture_types.yml
@@ -0,0 +1,16 @@
+---
+Lint/MixedRegexpCaptureTypes:
+ Exclude:
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/integrations/ewm.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'ee/lib/gitlab/code_owners/reference_extractor.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/string.rb'
+ - 'lib/gitlab/dependency_linker/gemfile_linker.rb'
+ - 'lib/gitlab/diff/suggestions_parser.rb'
+ - 'lib/gitlab/github_import/representation/note.rb'
+ - 'lib/gitlab/metrics/system.rb'
+ - 'lib/gitlab/request_profiler/profile.rb'
+ - 'lib/gitlab/slash_commands/issue_move.rb'
+ - 'lib/gitlab/slash_commands/issue_new.rb'
+ - 'lib/gitlab/slash_commands/run.rb'
diff --git a/.rubocop_todo/lint/redundant_cop_disable_directive.yml b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
new file mode 100644
index 00000000000..83901a6843e
--- /dev/null
+++ b/.rubocop_todo/lint/redundant_cop_disable_directive.yml
@@ -0,0 +1,211 @@
+---
+# Cop supports --auto-correct.
+Lint/RedundantCopDisableDirective:
+ # This cop can only be enabled after enabling all cops which are currently
+ # disabled. Otherwise we'll see RuboCop complaining depending on
+ # REVEAL_RUBOCOP_TODO environment variable.
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/dashboard_controller.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/issues_calendar.rb'
+ - 'app/controllers/concerns/snippets_actions.rb'
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/controllers/groups/autocomplete_sources_controller.rb'
+ - 'app/controllers/groups/labels_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/jobs_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/pipelines/tests_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb'
+ - 'app/finders/autocomplete/move_to_project_finder.rb'
+ - 'app/finders/autocomplete/routes_finder.rb'
+ - 'app/finders/autocomplete/users_finder.rb'
+ - 'app/finders/ci/daily_build_group_report_results_finder.rb'
+ - 'app/finders/groups_finder.rb'
+ - 'app/finders/users_finder.rb'
+ - 'app/graphql/resolvers/concerns/caching_array_resolver.rb'
+ - 'app/graphql/resolvers/project_milestones_resolver.rb'
+ - 'app/graphql/types/base_enum.rb'
+ - 'app/graphql/types/ci/runner_web_url_edge.rb'
+ - 'app/graphql/types/packages/helm/dependency_type.rb'
+ - 'app/graphql/types/projects/service_type_enum.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/concerns/cascading_namespace_setting_attribute.rb'
+ - 'app/models/concerns/from_except.rb'
+ - 'app/models/concerns/from_intersect.rb'
+ - 'app/models/concerns/from_union.rb'
+ - 'app/models/user.rb'
+ - 'app/presenters/dev_ops_report/metric_presenter.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/fork_namespace_entity.rb'
+ - 'app/services/ci/job_artifacts/destroy_batch_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/ci/retry_job_service.rb'
+ - 'app/services/database/consistency_check_service.rb'
+ - 'app/services/issues/export_csv_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/projects/auto_devops/disable_service.rb'
+ - 'app/services/projects/open_issues_count_service.rb'
+ - 'app/services/spam/spam_action_service.rb'
+ - 'app/services/users/migrate_to_ghost_user_service.rb'
+ - 'app/services/web_hooks/destroy_service.rb'
+ - 'app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb'
+ - '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'
+ - 'app/workers/remove_unaccepted_member_invites_worker.rb'
+ - 'config/initializers/warden.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/routes/api.rb'
+ - 'db/migrate/20210303193544_add_concurrent_fields_to_bulk_imports_trackers.rb'
+ - 'db/migrate/20210917134321_remove_temporary_index_for_project_topics_on_taggings.rb'
+ - 'db/migrate/20211013014228_add_content_validation_endpoint_to_application_settings.rb'
+ - 'db/post_migrate/20210610042700_remove_clusters_applications_fluentd_table.rb'
+ - 'db/post_migrate/20210708011426_finalize_ci_builds_metadata_bigint_conversion.rb'
+ - 'db/post_migrate/20210730104800_schedule_extract_project_topics_into_separate_table.rb'
+ - 'db/post_migrate/20210806131706_finalize_taggins_bigint_conversion.rb'
+ - 'db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb'
+ - 'db/post_migrate/20211028100303_tmp_index_for_delete_issue_merge_request_taggings_records.rb'
+ - 'db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'ee/app/controllers/ee/groups/group_members_controller.rb'
+ - 'ee/app/controllers/groups/todos_controller.rb'
+ - 'ee/app/finders/geo/file_registry_finder.rb'
+ - 'ee/app/finders/geo/project_registry_finder.rb'
+ - 'ee/app/finders/geo/registry_finder.rb'
+ - 'ee/app/finders/status_page/incident_comments_finder.rb'
+ - 'ee/app/finders/status_page/incidents_finder.rb'
+ - 'ee/app/graphql/types/ci/minutes/namespace_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_active_period_input_type.rb'
+ - 'ee/app/graphql/types/scan_type.rb'
+ - 'ee/app/helpers/ee/boards_helper.rb'
+ - 'ee/app/helpers/ee/namespaces_helper.rb'
+ - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/ee/boards/issues/list_service.rb'
+ - 'ee/app/services/ee/search_service.rb'
+ - 'ee/app/services/ee/users/migrate_to_ghost_user_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/workers/ee/issuable_export_csv_worker.rb'
+ - 'ee/app/workers/ee/namespaces/in_product_marketing_emails_worker.rb'
+ - 'ee/app/workers/geo/design_repository_shard_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_shard_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb'
+ - 'ee/db/geo/migrate/20210504143244_add_verification_to_merge_request_diff_registry.rb'
+ - 'ee/lib/analytics/merge_request_metrics_calculator.rb'
+ - 'ee/lib/api/audit_events.rb'
+ - 'ee/lib/ee/api/entities/analytics/code_review/merge_request.rb'
+ - 'ee/lib/ee/api/settings.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
+ - 'ee/spec/helpers/ee/releases_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/issuable_metadata_spec.rb'
+ - 'ee/spec/lib/elastic/latest/project_instance_proxy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/support/shared_examples/models/elasticsearch_indexed_container_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'lib/api/api.rb'
+ - 'lib/api/ci/variables.rb'
+ - 'lib/api/entities/environment.rb'
+ - 'lib/api/entities/issuable_time_stats.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/bulk_imports/common/transformers/user_reference_transformer.rb'
+ - 'lib/bulk_imports/pipeline/runner.rb'
+ - 'lib/container_registry/tag.rb'
+ - 'lib/event_filter.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/records_fetcher.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/fix_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/cache/request_cache.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/pipeline/duration.rb'
+ - 'lib/gitlab/ci/reports/accessibility_reports.rb'
+ - 'lib/gitlab/ci/reports/test_reports.rb'
+ - 'lib/gitlab/ci/reports/test_reports_comparer.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/reports/test_suite_summary.rb'
+ - 'lib/gitlab/composer/cache.rb'
+ - 'lib/gitlab/database/consistency_checker.rb'
+ - 'lib/gitlab/database/migration.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/file_collection/merge_request_diff_batch.rb'
+ - 'lib/gitlab/diff/pair_selector.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/encrypted_ldap_command.rb'
+ - 'lib/gitlab/encrypted_smtp_command.rb'
+ - 'lib/gitlab/git/patches/collection.rb'
+ - 'lib/gitlab/github_import/user_finder.rb'
+ - 'lib/gitlab/gitlab_import/importer.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/connection.rb'
+ - 'lib/gitlab/legacy_github_import/user_formatter.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/pagination/keyset/pager.rb'
+ - 'lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb'
+ - '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'
+ - 'lib/gitlab/utils/usage_data.rb'
+ - 'lib/tasks/gitlab/cleanup.rake'
+ - 'scripts/security-harness'
+ - 'sidekiq_cluster/cli.rb'
+ - 'sidekiq_cluster/sidekiq_cluster.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/lib/gitlab/avatar_cache_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb'
+ - 'spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb'
+ - 'spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/iterator_spec.rb'
+ - 'spec/lib/gitlab/shard_health_cache_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/server_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/rubocop/cop/ruby_interpolation_in_translation_spec.rb'
+ - 'spec/services/alert_management/metric_images/upload_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/support/helpers/snowplow_helpers.rb'
+ - 'spec/support/helpers/wait_for_requests.rb'
+ - 'spec/support/shared_examples/models/boards/listable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_key_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'tooling/danger/product_intelligence.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
+ - 'tooling/lib/tooling/kubernetes_client.rb'
+ - 'tooling/rspec_flaky/listener.rb'
diff --git a/.rubocop_todo/migration/background_migration_base_class.yml b/.rubocop_todo/migration/background_migration_base_class.yml
new file mode 100644
index 00000000000..f026ec19c7b
--- /dev/null
+++ b/.rubocop_todo/migration/background_migration_base_class.yml
@@ -0,0 +1,92 @@
+---
+Migration/BackgroundMigrationBaseClass:
+ Exclude:
+ - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_project_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
+ - 'lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb'
+ - 'lib/gitlab/background_migration/backfill_integrations_type_new.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2.rb'
+ - 'lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots.rb'
+ - 'lib/gitlab/background_migration/backfill_note_discussion_id.rb'
+ - 'lib/gitlab/background_migration/backfill_projects_with_coverage.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/background_migration/backfill_project_settings.rb'
+ - 'lib/gitlab/background_migration/backfill_snippet_repositories.rb'
+ - 'lib/gitlab/background_migration/backfill_topics_title.rb'
+ - 'lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb'
+ - 'lib/gitlab/background_migration/backfill_user_namespace.rb'
+ - 'lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb'
+ - 'lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb'
+ - 'lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects.rb'
+ - 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
+ - 'lib/gitlab/background_migration/create_security_setting.rb'
+ - 'lib/gitlab/background_migration/delete_orphaned_deployments.rb'
+ - 'lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_security_findings.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/encrypt_integration_properties.rb'
+ - 'lib/gitlab/background_migration/encrypt_static_object_token.rb'
+ - 'lib/gitlab/background_migration/extract_project_topics_into_separate_table.rb'
+ - 'lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb'
+ - 'lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb'
+ - 'lib/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'lib/gitlab/background_migration/fix_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_project_feature.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb'
+ - 'lib/gitlab/background_migration/legacy_uploads_migrator.rb'
+ - 'lib/gitlab/background_migration/legacy_upload_mover.rb'
+ - 'lib/gitlab/background_migration/merge_topics_with_same_name.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb'
+ - 'lib/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/migrate_null_private_profile_to_false.rb'
+ - 'lib/gitlab/background_migration/migrate_pages_to_zip_storage.rb'
+ - 'lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner.rb'
+ - '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'
+ - 'lib/gitlab/background_migration/populate_container_repository_migration_plan.rb'
+ - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'lib/gitlab/background_migration/populate_namespace_statistics.rb'
+ - 'lib/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'lib/gitlab/background_migration/populate_status_column_of_security_scans.rb'
+ - 'lib/gitlab/background_migration/populate_test_reports_issue_id.rb'
+ - 'lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb'
+ - 'lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb'
+ - 'lib/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'lib/gitlab/background_migration/populate_vulnerability_reads.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/remove_vulnerability_finding_links.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'lib/gitlab/background_migration/steal_migrate_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/background_migration/update_timelogs_null_spent_at.rb'
+ - 'lib/gitlab/background_migration/update_timelogs_project_id.rb'
+ - 'lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb'
+ - 'lib/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
+ - 'lib/gitlab/background_migration/mailers/unconfirm_mailer.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/models/project.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/models/namespace.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb'
diff --git a/.rubocop_todo/migration/background_migration_record.yml b/.rubocop_todo/migration/background_migration_record.yml
new file mode 100644
index 00000000000..cbf39285a7d
--- /dev/null
+++ b/.rubocop_todo/migration/background_migration_record.yml
@@ -0,0 +1,55 @@
+---
+Migration/BackgroundMigrationRecord:
+ Exclude:
+ - lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb
+ - lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb
+ - lib/gitlab/background_migration/backfill_ci_project_mirrors.rb
+ - lib/gitlab/background_migration/backfill_ci_queuing_tables.rb
+ - lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb
+ - lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb
+ - lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots.rb
+ - lib/gitlab/background_migration/backfill_project_repositories.rb
+ - lib/gitlab/background_migration/backfill_projects_with_coverage.rb
+ - lib/gitlab/background_migration/backfill_topics_title.rb
+ - lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb
+ - lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects.rb
+ - lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb
+ - lib/gitlab/background_migration/drop_invalid_security_findings.rb
+ - lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb
+ - lib/gitlab/background_migration/encrypt_integration_properties.rb
+ - lib/gitlab/background_migration/encrypt_static_object_token.rb
+ - lib/gitlab/background_migration/extract_project_topics_into_separate_table.rb
+ - lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
+ - lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb
+ - lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
+ - lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb
+ - lib/gitlab/background_migration/merge_topics_with_same_name.rb
+ - lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb
+ - lib/gitlab/background_migration/migrate_null_private_profile_to_false.rb
+ - lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics.rb
+ - lib/gitlab/background_migration/migrate_u2f_webauthn.rb
+ - lib/gitlab/background_migration/populate_latest_pipeline_ids.rb
+ - lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb
+ - lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
+ - lib/gitlab/background_migration/project_namespaces/models/namespace.rb
+ - lib/gitlab/background_migration/project_namespaces/models/project.rb
+ - lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
+ - lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb
+ - lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings.rb
+ - lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb
+ - lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
+ - lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb
+ - lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb
+ - 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
+ - ee/lib/ee/gitlab/background_migration/migrate_requirements_to_work_items.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/populate_status_column_of_security_scans.rb
+ - ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb
+ - ee/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location.rb
diff --git a/.rubocop_todo/naming/heredoc_delimiter_naming.yml b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
new file mode 100644
index 00000000000..86d9ae2f24d
--- /dev/null
+++ b/.rubocop_todo/naming/heredoc_delimiter_naming.yml
@@ -0,0 +1,141 @@
+---
+Naming/HeredocDelimiterNaming:
+ # Offense count: 388
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/ci/build_trace_chunks/redis_base.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/legacy_bulk_insert.rb'
+ - 'app/models/trending_project.rb'
+ - 'app/services/ci/ensure_stage_service.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'app/workers/concerns/limited_capacity/job_tracker.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'ee/app/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker.rb'
+ - 'ee/db/geo/migrate/20180322062741_migrate_ci_job_artifacts_to_separate_registry.rb'
+ - 'ee/db/geo/migrate/20191010204941_migrate_lfs_objects_to_separate_registry.rb'
+ - 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/templates/templates_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/sitemap_file_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/compliance_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/needs_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service/runnable_builds_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/support/helpers/ee/ldap_helpers.rb'
+ - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
+ - 'lib/api/version.rb'
+ - 'lib/backup/helper.rb'
+ - 'lib/feature/shared.rb'
+ - 'lib/gitlab/cache/import/caching.rb'
+ - 'lib/gitlab/conflict/file_collection.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/exclusive_lease.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
+ - 'lib/gitlab/sql/set_operator.rb'
+ - 'lib/gitlab/utils/delegator_override/validator.rb'
+ - 'lib/tasks/gitlab/docs/compile_deprecations.rake'
+ - 'lib/tasks/gitlab/password.rake'
+ - 'qa/qa/scenario/test/sanity/selectors.rb'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
+ - 'rubocop/cop/database/multiple_databases.rb'
+ - 'rubocop/cop/default_scope.rb'
+ - 'rubocop/cop/file_decompression.rb'
+ - 'rubocop/cop/gitlab/httparty.rb'
+ - 'rubocop/cop/gitlab/json.rb'
+ - 'rubocop/cop/gitlab/module_with_instance_variables.rb'
+ - 'rubocop/cop/gitlab/predicate_memoization.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/deprecation_toolkit_env.rb'
+ - 'spec/factories/packages/debian/distribution.rb'
+ - 'spec/factories/packages/debian/file_metadatum.rb'
+ - 'spec/features/projects/commit/user_comments_on_commit_spec.rb'
+ - 'spec/features/task_lists_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/initializers/100_patch_omniauth_oauth2_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
+ - 'spec/initializers/secret_token_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/lib/banzai/filter/footnote_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/full_pipeline_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/templates_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_collection_spec.rb'
+ - 'spec/lib/gitlab/diff/file_spec.rb'
+ - 'spec/lib/gitlab/diff/pair_selector_spec.rb'
+ - 'spec/lib/gitlab/diff/parser_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/file_hook_spec.rb'
+ - 'spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git_post_receive_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
+ - 'spec/lib/gitlab/import_export/config_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/delete_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/init_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/install_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/patch_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/reset_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v3/delete_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v3/install_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v3/patch_command_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb'
+ - 'spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/substitution_definition_spec.rb'
+ - 'spec/lib/gitlab/static_site_editor/config/file_config_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config_spec.rb'
+ - 'spec/lib/gitlab/webpack/file_loader_spec.rb'
+ - 'spec/lib/gitlab/webpack/graphql_known_operations_spec.rb'
+ - 'spec/lib/gitlab/webpack/manifest_spec.rb'
+ - 'spec/lib/gitlab/word_diff/parser_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/concerns/ci/maskable_spec.rb'
+ - 'spec/models/integrations/asana_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/services/ci/after_requeue_job_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/cache_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/evaluate_runner_tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/include_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/merge_requests_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parallel_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parameter_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
+ - 'spec/services/ci/parse_dotenv_artifact_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/google_cloud/generate_pipeline_service_spec.rb'
+ - 'spec/services/task_list_toggle_service_spec.rb'
+ - 'spec/support/helpers/seed_helper.rb'
+ - 'spec/support/helpers/stub_object_storage.rb'
+ - 'spec/support/shared_examples/helm_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/models/taskable_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
+ - 'spec/support/test_reports/test_reports_helper.rb'
+ - 'spec/workers/post_receive_spec.rb'
diff --git a/.rubocop_todo/naming/rescued_exceptions_variable_name.yml b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml
new file mode 100644
index 00000000000..8d4d2da29ac
--- /dev/null
+++ b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml
@@ -0,0 +1,222 @@
+---
+# Cop supports --auto-correct.
+Naming/RescuedExceptionsVariableName:
+ # Offense count: 269
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/projects/google_cloud/deployments_controller.rb'
+ - 'app/controllers/projects/google_cloud/service_accounts_controller.rb'
+ - 'app/controllers/projects/merge_requests/drafts_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/mirrors_controller.rb'
+ - 'app/controllers/projects/repositories_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/finders/repositories/changelog_tag_finder.rb'
+ - 'app/graphql/mutations/issues/move.rb'
+ - 'app/graphql/resolvers/ci/config_resolver.rb'
+ - 'app/graphql/resolvers/environments_resolver.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/models/application_setting.rb'
+ - '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'
+ - 'app/models/integrations/base_issue_tracker.rb'
+ - 'app/models/integrations/discord.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/packagist.rb'
+ - 'app/models/integrations/pipelines_email.rb'
+ - 'app/models/integrations/prometheus.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/project.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/snippet_repository.rb'
+ - 'app/models/u2f_registration.rb'
+ - 'app/models/wiki.rb'
+ - 'app/services/branches/delete_service.rb'
+ - 'app/services/branches/validate_new_service.rb'
+ - 'app/services/ci/job_artifacts/create_service.rb'
+ - 'app/services/ci/parse_dotenv_artifact_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/ci/stuck_builds/drop_helpers.rb'
+ - 'app/services/clusters/applications/prometheus_update_service.rb'
+ - 'app/services/commits/change_service.rb'
+ - 'app/services/commits/create_service.rb'
+ - 'app/services/dependency_proxy/head_manifest_service.rb'
+ - 'app/services/dependency_proxy/request_token_service.rb'
+ - 'app/services/design_management/copy_design_collection/copy_service.rb'
+ - 'app/services/git/base_hooks_service.rb'
+ - 'app/services/grafana/proxy_service.rb'
+ - 'app/services/groups/update_shared_runners_service.rb'
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/jira_import/start_import_service.rb'
+ - 'app/services/jira_import/users_importer.rb'
+ - 'app/services/lfs/lock_file_service.rb'
+ - 'app/services/lfs/locks_finder_service.rb'
+ - 'app/services/lfs/push_service.rb'
+ - 'app/services/lfs/unlock_file_service.rb'
+ - 'app/services/merge_requests/merge_to_ref_service.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/metrics/dashboard/base_service.rb'
+ - 'app/services/metrics/dashboard/panel_preview_service.rb'
+ - 'app/services/projects/cleanup_service.rb'
+ - 'app/services/projects/destroy_service.rb'
+ - 'app/services/projects/hashed_storage/base_repository_service.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/services/prometheus/proxy_service.rb'
+ - 'app/services/resource_access_tokens/revoke_service.rb'
+ - 'app/services/tags/create_service.rb'
+ - 'app/services/tags/destroy_service.rb'
+ - 'app/services/users/validate_manual_otp_service.rb'
+ - 'app/services/users/validate_push_otp_service.rb'
+ - 'app/services/verify_pages_domain_service.rb'
+ - 'app/validators/js_regex_validator.rb'
+ - 'app/workers/concerns/limited_capacity/worker.rb'
+ - 'app/workers/gitlab/jira_import/import_issue_worker.rb'
+ - 'app/workers/issuable_export_csv_worker.rb'
+ - 'app/workers/namespaces/root_statistics_worker.rb'
+ - 'app/workers/namespaces/schedule_aggregation_worker.rb'
+ - 'app/workers/packages/go/sync_packages_worker.rb'
+ - 'app/workers/project_destroy_worker.rb'
+ - 'app/workers/project_service_worker.rb'
+ - 'app/workers/projects/git_garbage_collect_worker.rb'
+ - 'app/workers/remove_expired_members_worker.rb'
+ - 'app/workers/users/create_statistics_worker.rb'
+ - 'config/initializers/rspec_profiling.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'db/post_migrate/20210606143426_add_index_for_container_registry_access_level.rb'
+ - 'db/post_migrate/20211206162601_cleanup_after_add_primary_email_to_emails_if_user_confirmed.rb'
+ - 'db/post_migrate/20220318111729_cleanup_after_fixing_issue_when_admin_changed_primary_email.rb'
+ - 'db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb'
+ - 'ee/app/finders/projects/integrations/jira/by_ids_finder.rb'
+ - 'ee/app/graphql/mutations/issues/promote_to_epic.rb'
+ - 'ee/app/graphql/mutations/issues/set_epic.rb'
+ - 'ee/app/helpers/ee/kerberos_spnego_helper.rb'
+ - 'ee/app/models/concerns/geo/replicable_model.rb'
+ - 'ee/app/models/integrations/github.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/scans/create_service.rb'
+ - 'ee/app/services/app_sec/dast/site_validations/find_or_create_service.rb'
+ - 'ee/app/services/app_sec/dast/site_validations/revoke_service.rb'
+ - 'ee/app/services/app_sec/fuzzing/coverage/corpuses/create_service.rb'
+ - 'ee/app/services/arkose/user_verification_service.rb'
+ - 'ee/app/services/ci/sync_reports_to_approval_rules_service.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/app/services/geo/file_registry_removal_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/move_repository_service.rb'
+ - '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'
+ - 'ee/app/services/security/orchestration/assign_service.rb'
+ - 'ee/app/services/security/store_grouped_scans_service.rb'
+ - 'ee/app/services/security/store_scan_service.rb'
+ - 'ee/app/services/security/token_revocation_service.rb'
+ - 'ee/app/services/software_license_policies/create_service.rb'
+ - 'ee/app/services/software_license_policies/update_service.rb'
+ - 'ee/app/workers/adjourned_project_deletion_worker.rb'
+ - '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'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/elastic/instance_proxy_util.rb'
+ - 'ee/lib/gitlab/audit/auditor.rb'
+ - 'ee/lib/gitlab/auth/smartcard/base.rb'
+ - 'ee/lib/gitlab/ci/parsers/license_compliance/license_scanning.rb'
+ - 'ee/lib/gitlab/elastic/bulk_indexer.rb'
+ - 'ee/lib/gitlab/spdx/catalogue_gateway.rb'
+ - 'ee/lib/tasks/gitlab/seed/metrics.rake'
+ - 'lib/api/environments.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/label_helpers.rb'
+ - 'lib/api/issues.rb'
+ - 'lib/api/project_milestones.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/v3/github.rb'
+ - 'lib/gitaly/server.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb'
+ - 'lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp.rb'
+ - 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/ci/config/external/file/artifact.rb'
+ - 'lib/gitlab/ci/pipeline/chain/config/process.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/external.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_wrapper.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/load_balancing/service_discovery.rb'
+ - 'lib/gitlab/database/reindexing/grafana_notifier.rb'
+ - 'lib/gitlab/git/keep_around.rb'
+ - 'lib/gitlab/gitaly_client/call.rb'
+ - 'lib/gitlab/gitaly_client/commit_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/ref_service.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/hashed_storage/migrator.rb'
+ - 'lib/gitlab/health_checks/base_abstract_check.rb'
+ - 'lib/gitlab/import_export/merge_request_parser.rb'
+ - 'lib/gitlab/instrumentation/redis_interceptor.rb'
+ - 'lib/gitlab/issuables_count_for_state.rb'
+ - 'lib/gitlab/jira_import/issues_importer.rb'
+ - 'lib/gitlab/json.rb'
+ - 'lib/gitlab/jwt_token.rb'
+ - 'lib/gitlab/kubernetes/namespace.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/panel_ids_inserter.rb'
+ - 'lib/gitlab/metrics/rack_middleware.rb'
+ - 'lib/gitlab/middleware/handle_ip_spoof_attack_error.rb'
+ - 'lib/gitlab/prometheus/queries/validate_query.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/sidekiq_logging/structured_logger.rb'
+ - 'lib/gitlab/tcp_checker.rb'
+ - 'lib/gitlab/template_parser/parser.rb'
+ - 'lib/gitlab/tracking.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/usage/metrics/aggregates/aggregate.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/utils/usage_data.rb'
+ - 'lib/gitlab/verify/batch_verifier.rb'
+ - 'lib/gitlab/wiki_pages/front_matter_parser.rb'
+ - 'lib/microsoft_teams/notifier.rb'
+ - 'lib/system_check/incoming_email/imap_authentication_check.rb'
+ - 'lib/tasks/gitlab/db/validate_config.rake'
+ - 'lib/tasks/gitlab/setup.rake'
+ - 'lib/tasks/gitlab/storage.rake'
+ - 'lib/tasks/lint.rake'
+ - 'qa/qa/resource/user_gpg.rb'
+ - 'scripts/review_apps/automated_cleanup.rb'
+ - 'scripts/trigger-build.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/lib/bulk_imports/network_error_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/host_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/exception_message_spec.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/helpers/capybara_helpers.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
+ - 'tooling/lib/tooling/kubernetes_client.rb'
diff --git a/.rubocop_todo/performance/block_given_with_explicit_block.yml b/.rubocop_todo/performance/block_given_with_explicit_block.yml
new file mode 100644
index 00000000000..ae61c5a86e6
--- /dev/null
+++ b/.rubocop_todo/performance/block_given_with_explicit_block.yml
@@ -0,0 +1,44 @@
+---
+# 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'
+ - 'app/helpers/instance_configuration_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/tab_helper.rb'
+ - 'app/services/base_count_service.rb'
+ - 'app/services/error_tracking/base_service.rb'
+ - 'app/services/projects/open_issues_count_service.rb'
+ - 'app/services/users/update_service.rb'
+ - 'ee/lib/elastic/latest/query_context.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/gitlab/batch_pop_queueing.rb'
+ - 'lib/gitlab/cache/request_cache.rb'
+ - 'lib/gitlab/ci/trace/chunked_io.rb'
+ - 'lib/gitlab/database/bulk_update.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/metrics/methods/metric_options.rb'
+ - 'lib/gitlab/null_request_store.rb'
+ - 'lib/gitlab/quick_actions/dsl.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/database_metric.rb'
+ - 'lib/gitlab/usage_data_queries.rb'
+ - 'lib/gitlab/utils/usage_data.rb'
+ - 'qa/qa/page/view.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'spec/lib/api/helpers/authentication_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/query_recorder.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
new file mode 100644
index 00000000000..4b012bf6645
--- /dev/null
+++ b/.rubocop_todo/performance/collection_literal_in_loop.yml
@@ -0,0 +1,38 @@
+---
+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'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
+ - 'lib/gitlab/fake_application_settings.rb'
+ - 'lib/gitlab/otp_key_rotator.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'lib/gitlab/tracking/incident_management.rb'
+ - 'lib/quality/seeders/issues.rb'
+ - 'lib/tasks/gitlab/seed/group_seed.rake'
+ - 'spec/bin/sidekiq_cluster_spec.rb'
+ - 'spec/controllers/groups_controller_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/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/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'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/support/shared_examples/models/email_format_shared_examples.rb'
diff --git a/.rubocop_todo/performance/constant_regexp.yml b/.rubocop_todo/performance/constant_regexp.yml
new file mode 100644
index 00000000000..fb2b7d6ef49
--- /dev/null
+++ b/.rubocop_todo/performance/constant_regexp.yml
@@ -0,0 +1,32 @@
+---
+# 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/project.rb'
+ - 'app/models/wiki.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'lib/banzai/filter/custom_emoji_filter.rb'
+ - 'lib/gitlab/cleanup/project_uploads.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/dependency_linker/composer_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/godeps_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/podspec_linker.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/job_waiter.rb'
+ - 'lib/gitlab/metrics/dashboard/url.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/validate_migration_schema'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/scripts/lib/glfm/update_specification_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
new file mode 100644
index 00000000000..265e03073db
--- /dev/null
+++ b/.rubocop_todo/performance/method_object_as_block.yml
@@ -0,0 +1,99 @@
+---
+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'
+ - 'app/controllers/projects/merge_requests/drafts_controller.rb'
+ - 'app/finders/bulk_imports/entities_finder.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/concerns/prometheus_adapter.rb'
+ - 'app/models/concerns/token_authenticatable.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/programming_language.rb'
+ - 'app/presenters/packages/detail/package_presenter.rb'
+ - 'app/services/bulk_imports/file_download_service.rb'
+ - 'app/services/ci/pipeline_processing/atomic_processing_service.rb'
+ - 'app/services/ci/prometheus_metrics/observe_histograms_service.rb'
+ - 'app/services/concerns/users/participable_service.rb'
+ - 'app/services/discussions/resolve_service.rb'
+ - 'app/services/jira/requests/projects/list_service.rb'
+ - 'app/services/merge_requests/refresh_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/projects/container_repository/delete_tags_service.rb'
+ - 'app/workers/gitlab/import/stuck_import_job.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'config/initializers/0_inject_enterprise_edition_module.rb'
+ - 'ee/app/finders/security/findings_finder.rb'
+ - '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'
+ - 'ee/app/services/security/store_grouped_scans_service.rb'
+ - '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/spec/services/groups/participants_service_spec.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/bulk_imports/pipeline.rb'
+ - 'lib/container_registry/base_client.rb'
+ - 'lib/container_registry/gitlab_api_client.rb'
+ - 'lib/gitlab/ci/build/rules/rule.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause/exists.rb'
+ - 'lib/gitlab/ci/config/external/mapper.rb'
+ - 'lib/gitlab/ci/config/yaml/tags/resolver.rb'
+ - 'lib/gitlab/ci/pipeline/chain/create_deployments.rb'
+ - 'lib/gitlab/ci/pipeline/chain/ensure_environments.rb'
+ - 'lib/gitlab/ci/pipeline/chain/ensure_resource_groups.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/external.rb'
+ - 'lib/gitlab/ci/status/composite.rb'
+ - 'lib/gitlab/config/entry/legacy_validation_helpers.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/container_repository/tags/cache.rb'
+ - 'lib/gitlab/daemon.rb'
+ - 'lib/gitlab/data_builder/pipeline.rb'
+ - 'lib/gitlab/dependency_linker/cartfile_linker.rb'
+ - 'lib/gitlab/dependency_linker/gemfile_linker.rb'
+ - 'lib/gitlab/dependency_linker/gemspec_linker.rb'
+ - 'lib/gitlab/dependency_linker/package_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/podspec_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/podspec_linker.rb'
+ - 'lib/gitlab/etag_caching/router/graphql.rb'
+ - 'lib/gitlab/etag_caching/router/rails.rb'
+ - 'lib/gitlab/health_checks/simple_abstract_check.rb'
+ - 'lib/gitlab/import_export/attributes_finder.rb'
+ - 'lib/gitlab/import_export/config.rb'
+ - 'lib/gitlab/import_export/fast_hash_serializer.rb'
+ - 'lib/gitlab/import_export/group/tree_restorer.rb'
+ - 'lib/gitlab/middleware/basic_health_check.rb'
+ - 'lib/gitlab/prometheus/additional_metrics_parser.rb'
+ - 'lib/gitlab/prometheus/queries/matched_metric_query.rb'
+ - 'lib/gitlab/prometheus/queries/query_additional_metrics.rb'
+ - 'lib/gitlab/search_context.rb'
+ - 'lib/gitlab/sidekiq_queue.rb'
+ - 'lib/gitlab/uploads/migration_helper.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/peek/views/detailed_view.rb'
+ - 'lib/tasks/gitlab/assets.rake'
+ - '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'
+ - 'rubocop/rubocop.rb'
+ - 'scripts/api/download_job_artifact.rb'
+ - 'spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb'
+ - 'spec/lib/api/entities/merge_request_basic_spec.rb'
+ - 'spec/lib/gitlab/import_export/import_test_coverage_spec.rb'
+ - 'spec/lib/gitlab/search_context/builder_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
+ - '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/test_map_packer.rb'
+ - 'tooling/quality/test_level.rb'
diff --git a/.rubocop_todo/rails/active_record_callbacks_order.yml b/.rubocop_todo/rails/active_record_callbacks_order.yml
new file mode 100644
index 00000000000..9585a720c6a
--- /dev/null
+++ b/.rubocop_todo/rails/active_record_callbacks_order.yml
@@ -0,0 +1,28 @@
+---
+# Cop supports --auto-correct.
+Rails/ActiveRecordCallbacksOrder:
+ # Offense count: 30
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/award_emoji.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/group.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/key.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace_statistics.rb'
+ - 'app/models/note.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/project.rb'
+ - 'app/models/prometheus_alert.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/resource_label_event.rb'
+ - 'app/models/snippet_statistics.rb'
+ - 'app/models/upload.rb'
+ - 'app/models/user.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/geo_node.rb'
diff --git a/.rubocop_todo/rails/application_controller.yml b/.rubocop_todo/rails/application_controller.yml
new file mode 100644
index 00000000000..d53fd3411d3
--- /dev/null
+++ b/.rubocop_todo/rails/application_controller.yml
@@ -0,0 +1,13 @@
+---
+# Cop supports --auto-correct.
+Rails/ApplicationController:
+ Exclude:
+ - 'app/controllers/acme_challenges_controller.rb'
+ - 'app/controllers/chaos_controller.rb'
+ - 'app/controllers/health_controller.rb'
+ - 'app/controllers/metrics_controller.rb'
+ - 'ee/app/controllers/oauth/geo_auth_controller.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'lib/gitlab/base_doorkeeper_controller.rb'
+ - 'lib/gitlab/request_forgery_protection.rb'
+ - 'spec/controllers/concerns/continue_params_spec.rb'
diff --git a/.rubocop_todo/rails/content_tag.yml b/.rubocop_todo/rails/content_tag.yml
new file mode 100644
index 00000000000..33f6dd36008
--- /dev/null
+++ b/.rubocop_todo/rails/content_tag.yml
@@ -0,0 +1,63 @@
+---
+# Cop supports --auto-correct.
+Rails/ContentTag:
+ # Offense count: 163
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/helpers/appearances_helper.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/avatars_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/breadcrumbs_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/ci/pipelines_helper.rb'
+ - 'app/helpers/ci/runners_helper.rb'
+ - 'app/helpers/ci/status_helper.rb'
+ - 'app/helpers/clusters_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/environment_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/hooks_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/listbox_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/notes_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/repository_languages_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/tab_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/helpers/version_check_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/analytics/cycle_analytics/stage_entity.rb'
+ - 'app/serializers/entity_date_helper.rb'
+ - 'app/services/system_notes/base_service.rb'
+ - 'app/services/system_notes/commit_service.rb'
+ - 'ee/app/helpers/ee/button_helper.rb'
+ - 'ee/app/helpers/ee/geo_helper.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/app/helpers/ee/issuables_helper.rb'
+ - 'ee/app/helpers/ee/lock_helper.rb'
+ - 'ee/app/helpers/ee/namespaces_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/lib/gitlab/expiring_subscription_message.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/gollum_tags_filter.rb'
+ - 'lib/gitlab/emoji.rb'
+ - 'lib/gitlab/form_builders/gitlab_ui_form_builder.rb'
+ - 'lib/gitlab/middleware/go.rb'
+ - 'spec/frontend/fixtures/tabs.rb'
diff --git a/.rubocop_todo/rails/create_table_with_timestamps.yml b/.rubocop_todo/rails/create_table_with_timestamps.yml
new file mode 100644
index 00000000000..6e60fa3e1d5
--- /dev/null
+++ b/.rubocop_todo/rails/create_table_with_timestamps.yml
@@ -0,0 +1,69 @@
+---
+Rails/CreateTableWithTimestamps:
+ # Offense count: 63
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'db/migrate/20210305180331_create_ci_unit_tests.rb'
+ - 'db/migrate/20210305182855_create_ci_unit_test_failures.rb'
+ - 'db/migrate/20210317035357_create_dast_profiles_pipelines.rb'
+ - 'db/migrate/20210317104301_create_in_product_marketing_emails.rb'
+ - 'db/migrate/20210323125809_create_status_check_responses_table.rb'
+ - 'db/migrate/20210329191850_add_finding_signature_table.rb'
+ - 'db/migrate/20210411212813_add_clusters_integrations_prometheus.rb'
+ - 'db/migrate/20210423054022_create_dast_site_profiles_pipelines.rb'
+ - 'db/migrate/20210429032320_add_escalation_rules.rb'
+ - 'db/migrate/20210429131525_create_user_credit_card_validations.rb'
+ - 'db/migrate/20210511104929_add_epic_board_recent_visits_table.rb'
+ - 'db/migrate/20210512120122_add_pending_builds_table.rb'
+ - 'db/migrate/20210527194558_create_ci_job_token_project_scope_links.rb'
+ - 'db/migrate/20210601123341_add_running_builds_table.rb'
+ - 'db/migrate/20210602122213_add_upcoming_reconciliations.rb'
+ - 'db/migrate/20210604032738_create_dast_site_profiles_builds.rb'
+ - 'db/migrate/20210604051330_create_dast_scanner_profiles_builds.rb'
+ - 'db/migrate/20210604082145_create_external_status_checks_table.rb'
+ - 'db/migrate/20210713211008_create_banned_users.rb'
+ - 'db/migrate/20210729081739_create_project_topics.rb'
+ - 'db/migrate/20210729202143_create_incident_management_issuable_escalation_statuses.rb'
+ - 'db/migrate/20210730101609_create_analytics_cycle_analytics_stage_event_hashes.rb'
+ - 'db/migrate/20210809014850_create_agent_group_authorizations.rb'
+ - 'db/migrate/20210812171704_create_project_ci_feature_usages.rb'
+ - 'db/migrate/20210813101742_create_zentao_tracker_data.rb'
+ - 'db/migrate/20210813111909_create_ci_build_trace_metadata.rb'
+ - 'db/migrate/20210819185500_create_external_audit_event_destinations_table.rb'
+ - 'db/migrate/20210823172643_create_user_group_callout.rb'
+ - 'db/migrate/20210823213417_create_dependency_proxy_image_ttl_group_policies.rb'
+ - 'db/migrate/20210913010411_create_agent_project_authorizations.rb'
+ - 'db/migrate/20210922215740_create_issue_customer_relations_contacts.rb'
+ - 'db/migrate/20211004062942_create_coverage_fuzzing_corpuses.rb'
+ - 'db/migrate/20211004122540_create_member_tasks.rb'
+ - 'db/migrate/20211011004242_create_content_blocked_states.rb'
+ - 'db/migrate/20211011140930_create_ci_namespace_mirrors.rb'
+ - 'db/migrate/20211011140931_create_ci_project_mirrors.rb'
+ - 'db/migrate/20211011140932_create_namespaces_sync_events.rb'
+ - 'db/migrate/20211011141239_create_projects_sync_events.rb'
+ - 'db/migrate/20211028132247_create_packages_npm_metadata.rb'
+ - 'db/migrate/20211101132310_add_reindexing_queue.rb'
+ - 'db/migrate/20211101165656_create_upload_states.rb'
+ - 'db/migrate/20211110014701_create_agent_activity_events.rb'
+ - 'db/migrate/20211110092710_create_issue_emails.rb'
+ - 'db/migrate/20211111112425_create_merge_requests_compliance_violations.rb'
+ - 'db/migrate/20211115132613_create_incident_management_timeline_events.rb'
+ - 'db/migrate/20211117174209_create_vulnerability_reads.rb'
+ - 'db/migrate/20211119111006_create_job_artifact_states.rb'
+ - 'db/migrate/20211119154221_create_pages_deployment_states.rb'
+ - 'db/migrate/20211119195201_create_deployment_approvals.rb'
+ - 'db/migrate/20211201143042_create_lfs_object_states.rb'
+ - 'db/migrate/20211216220939_add_group_crm_settings.rb'
+ - 'db/migrate/20220110170953_create_ci_secure_files.rb'
+ - 'db/migrate/20220112205111_create_security_training_providers.rb'
+ - 'db/migrate/20220113125401_create_security_trainings.rb'
+ - 'db/migrate/20220120033115_create_alert_management_alert_metric_images.rb'
+ - 'db/migrate/20220204093120_create_analytics_cycle_analytics_aggregations.rb'
+ - 'db/migrate/20220211125954_create_related_epic_links.rb'
+ - 'db/migrate/20220216110023_create_saved_replies.rb'
+ - 'db/migrate/20220301175426_create_project_build_artifacts_size_refresh.rb'
+ - 'db/migrate/20220302110724_add_group_features_table.rb'
+ - 'db/migrate/20220314184009_create_protected_environment_approval_rules.rb'
+ - 'db/migrate/20220425120604_create_packages_cleanup_policies.rb'
+ - 'db/migrate/20220503102855_add_namespace_ci_cd_settings_table.rb'
diff --git a/.rubocop_todo/rails/file_path.yml b/.rubocop_todo/rails/file_path.yml
new file mode 100644
index 00000000000..58fa6d6255d
--- /dev/null
+++ b/.rubocop_todo/rails/file_path.yml
@@ -0,0 +1,145 @@
+---
+Rails/FilePath:
+ # Offense count: 212
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - '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'
+ - 'app/serializers/review_app_setup_entity.rb'
+ - 'app/services/clusters/aws/fetch_credentials_service.rb'
+ - 'app/services/clusters/aws/provision_service.rb'
+ - 'app/services/metrics/sample_metrics_service.rb'
+ - 'app/services/projects/readme_renderer_service.rb'
+ - 'config/environments/development.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/7_prometheus_metrics.rb'
+ - 'config/initializers/lograge.rb'
+ - 'config/initializers_before_autoloader/001_fast_gettext.rb'
+ - 'db/migrate/20210517144856_require_snapshot_namespace.rb'
+ - 'db/post_migrate/20210630025020_migrate_push_event_payloads_event_id_back_to_integer_for_gitlab_com.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
+ - 'ee/db/fixtures/development/20_vulnerabilities.rb'
+ - 'ee/db/fixtures/development/21_dast_profiles.rb'
+ - 'ee/db/fixtures/development/32_compliance_report_violations.rb'
+ - 'ee/lib/ee/feature/definition.rb'
+ - 'ee/lib/ee/gitlab/usage/metric_definition.rb'
+ - 'ee/lib/generators/geo_migration/geo_migration_generator.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'ee/lib/tasks/gitlab/seed/metrics.rake'
+ - 'ee/spec/db/production/license_spec.rb'
+ - 'ee/spec/factories/spdx_catalogue.rb'
+ - 'ee/spec/factories/vulnerabilities/findings.rb'
+ - 'ee/spec/features/epics/update_epic_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/file_spec.rb'
+ - 'ee/spec/lib/gitlab/spdx/catalogue_gateway_spec.rb'
+ - 'ee/spec/lib/gitlab/spdx/catalogue_spec.rb'
+ - 'ee/spec/models/geo/every_geo_event_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
+ - 'ee/spec/support/factory_bot.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/validators/json_schema_validator_spec.rb'
+ - 'lib/api/api.rb'
+ - 'lib/error_tracking/collector/payload_validator.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/database/migrations/runner.rb'
+ - 'lib/gitlab/favicon.rb'
+ - 'lib/gitlab/feature_categories.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/language_data.rb'
+ - 'lib/gitlab/metrics/exporter/base_exporter.rb'
+ - 'lib/gitlab/middleware/multipart.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/robots_txt.rb'
+ - 'lib/gitlab/setup_helper.rb'
+ - 'lib/gitlab/sidekiq_config.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/pager_duty/webhook_payload_parser.rb'
+ - 'lib/system_check/app/database_config_exists_check.rb'
+ - 'lib/system_check/app/gitlab_config_exists_check.rb'
+ - 'lib/system_check/app/gitlab_config_up_to_date_check.rb'
+ - 'lib/system_check/app/systemd_unit_files_or_init_script_up_to_date_check.rb'
+ - 'lib/system_check/app/uploads_directory_exists_check.rb'
+ - 'lib/system_check/incoming_email/imap_authentication_check.rb'
+ - 'lib/tasks/gitlab/metrics_exporter.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'metrics_server/metrics_server.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
+ - 'spec/config/object_store_settings_spec.rb'
+ - 'spec/controllers/help_controller_spec.rb'
+ - 'spec/db/development/create_base_work_item_types_spec.rb'
+ - 'spec/db/development/import_common_metrics_spec.rb'
+ - 'spec/db/production/create_base_work_item_types_spec.rb'
+ - 'spec/db/production/import_common_metrics_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/factories/design_management/designs.rb'
+ - 'spec/factories/design_management/versions.rb'
+ - 'spec/factories/error_tracking/error_event.rb'
+ - 'spec/factories/file_uploaders.rb'
+ - 'spec/factories/packages/debian/distribution_key.rb'
+ - 'spec/factories/pages_domains.rb'
+ - 'spec/factories/serverless/domain_cluster.rb'
+ - 'spec/features/admin/admin_appearance_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/groups/import_export/import_file_spec.rb'
+ - 'spec/features/help_pages_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/projects/files/user_replaces_files_spec.rb'
+ - 'spec/features/projects/import_export/import_file_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_uploads_designs_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb'
+ - 'spec/features/projects/settings/repository_settings_spec.rb'
+ - 'spec/features/projects/settings/user_changes_avatar_spec.rb'
+ - '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'
+ - 'spec/features/uploads/user_uploads_avatar_to_profile_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/startupjs_helper_spec.rb'
+ - 'spec/lib/backup/database_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_first_mentioned_in_commit_at_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/context_spec.rb'
+ - 'spec/lib/gitlab/feature_categories_spec.rb'
+ - 'spec/lib/gitlab/file_hook_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/mail_room/mail_room_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart/handler_spec.rb'
+ - 'spec/lib/gitlab/project_transfer_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/requests/api/internal/mail_room_spec.rb'
+ - 'spec/serializers/review_app_setup_entity_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/aws/provision_service_spec.rb'
+ - 'spec/services/metrics/sample_metrics_service_spec.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/upload_helpers.rb'
+ - 'spec/support/shared_examples/features/project_upload_files_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/generate_sample_prometheus_data_spec.rb'
diff --git a/.rubocop_todo/rails/has_many_or_has_one_dependent.yml b/.rubocop_todo/rails/has_many_or_has_one_dependent.yml
new file mode 100644
index 00000000000..92ba718bfff
--- /dev/null
+++ b/.rubocop_todo/rails/has_many_or_has_one_dependent.yml
@@ -0,0 +1,154 @@
+---
+Rails/HasManyOrHasOneDependent:
+ # Offense count: 593
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/analytics/cycle_analytics/project_value_stream.rb'
+ - 'app/models/analytics/cycle_analytics/stage_event_hash.rb'
+ - 'app/models/application_setting/term.rb'
+ - 'app/models/bulk_import.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/bulk_imports/export.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/pipeline_schedule.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/ref.rb'
+ - 'app/models/ci/resource_group.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/stage.rb'
+ - 'app/models/ci/trigger.rb'
+ - 'app/models/ci/trigger_request.rb'
+ - 'app/models/ci/unit_test.rb'
+ - 'app/models/clusters/agent.rb'
+ - 'app/models/clusters/applications/knative.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/project.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/ci/metadatable.rb'
+ - 'app/models/concerns/integrations/has_data_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/label_eventable.rb'
+ - 'app/models/concerns/milestone_eventable.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/protected_ref.rb'
+ - 'app/models/concerns/state_eventable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/versioned_description.rb'
+ - 'app/models/concerns/with_uploads.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/version.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/error.rb'
+ - 'app/models/event.rb'
+ - 'app/models/experiment.rb'
+ - 'app/models/fork_network.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/group.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/label.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/list.rb'
+ - 'app/models/member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_context_commit.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespaces/project_namespace.rb'
+ - 'app/models/note.rb'
+ - 'app/models/operations/feature_flag.rb'
+ - 'app/models/operations/feature_flags/strategy.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/debian/project_distribution.rb'
+ - 'app/models/packages/dependency.rb'
+ - 'app/models/packages/dependency_link.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/package_file.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/plan.rb'
+ - 'app/models/pool_repository.rb'
+ - 'app/models/project.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/prometheus_alert.rb'
+ - 'app/models/prometheus_metric.rb'
+ - 'app/models/release.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/user.rb'
+ - 'app/models/wiki_page/meta.rb'
+ - 'app/models/work_items/type.rb'
+ - 'app/models/x509_certificate.rb'
+ - 'app/models/x509_issuer.rb'
+ - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
+ - 'ee/app/models/analytics/devops_adoption/snapshot.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/approval_project_rule.rb'
+ - 'ee/app/models/boards/epic_board.rb'
+ - 'ee/app/models/boards/epic_list.rb'
+ - 'ee/app/models/compliance_management/framework.rb'
+ - 'ee/app/models/concerns/ee/iteration_eventable.rb'
+ - 'ee/app/models/concerns/ee/protected_branch.rb'
+ - 'ee/app/models/concerns/ee/protected_ref.rb'
+ - 'ee/app/models/concerns/ee/weight_eventable.rb'
+ - 'ee/app/models/concerns/geo/eventable.rb'
+ - 'ee/app/models/concerns/issue_widgets/acts_like_requirement.rb'
+ - 'ee/app/models/concerns/security/scan_execution_policy.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast_site.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/dast_site_validation.rb'
+ - 'ee/app/models/ee/alert_management/alert.rb'
+ - 'ee/app/models/ee/analytics/cycle_analytics/stage_event_hash.rb'
+ - 'ee/app/models/ee/board.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/ci/pipeline.rb'
+ - 'ee/app/models/ee/deployment.rb'
+ - 'ee/app/models/ee/environment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/label.rb'
+ - 'ee/app/models/ee/lfs_object.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/merge_request_diff.rb'
+ - 'ee/app/models/ee/milestone.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/pages_deployment.rb'
+ - 'ee/app/models/ee/plan.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/upload.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/elastic/reindexing_subtask.rb'
+ - 'ee/app/models/elastic/reindexing_task.rb'
+ - 'ee/app/models/geo/event.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/incident_management/escalation_policy.rb'
+ - 'ee/app/models/incident_management/oncall_participant.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/incident_management/oncall_schedule.rb'
+ - 'ee/app/models/integrations/gitlab_slack_application.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/protected_environments/approval_rule.rb'
+ - 'ee/app/models/push_rule.rb'
+ - 'ee/app/models/saml_provider.rb'
+ - 'ee/app/models/security/finding.rb'
+ - 'ee/app/models/security/scan.rb'
+ - 'ee/app/models/security/training_provider.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/models/vulnerabilities/identifier.rb'
+ - 'ee/app/models/vulnerabilities/remediation.rb'
+ - 'ee/app/models/vulnerabilities/scanner.rb'
diff --git a/.rubocop_todo/rails/helper_instance_variable.yml b/.rubocop_todo/rails/helper_instance_variable.yml
new file mode 100644
index 00000000000..8a1a6093c3d
--- /dev/null
+++ b/.rubocop_todo/rails/helper_instance_variable.yml
@@ -0,0 +1,85 @@
+---
+Rails/HelperInstanceVariable:
+ # Offense count: 671
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/helpers/admin/user_actions_helper.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/award_emoji_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/boards_helper.rb'
+ - 'app/helpers/branches_helper.rb'
+ - 'app/helpers/breadcrumbs_helper.rb'
+ - 'app/helpers/broadcast_messages_helper.rb'
+ - 'app/helpers/ci/builds_helper.rb'
+ - 'app/helpers/ci/jobs_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/compare_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/environments_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/explore_helper.rb'
+ - 'app/helpers/feature_flags_helper.rb'
+ - 'app/helpers/form_helper.rb'
+ - 'app/helpers/graph_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/ide_helper.rb'
+ - 'app/helpers/import_helper.rb'
+ - 'app/helpers/integrations_helper.rb'
+ - 'app/helpers/issuables_description_templates_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/mirror_helper.rb'
+ - 'app/helpers/nav_helper.rb'
+ - 'app/helpers/notes_helper.rb'
+ - 'app/helpers/operations_helper.rb'
+ - 'app/helpers/page_layout_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/releases_helper.rb'
+ - 'app/helpers/routing/projects_helper.rb'
+ - 'app/helpers/routing/pseudonymization_helper.rb'
+ - 'app/helpers/routing/snippets_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/selects_helper.rb'
+ - 'app/helpers/startupjs_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/tab_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/helpers/web_ide_button_helper.rb'
+ - 'app/helpers/webpack_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/boards_helper.rb'
+ - 'ee/app/helpers/ee/feature_flags_helper.rb'
+ - 'ee/app/helpers/ee/form_helper.rb'
+ - 'ee/app/helpers/ee/graph_helper.rb'
+ - 'ee/app/helpers/ee/groups/group_members_helper.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/app/helpers/ee/integrations_helper.rb'
+ - 'ee/app/helpers/ee/kerberos_spnego_helper.rb'
+ - 'ee/app/helpers/ee/labels_helper.rb'
+ - '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'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/app/helpers/ee/selects_helper.rb'
+ - 'ee/app/helpers/ee/subscribable_banner_helper.rb'
+ - '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/index_with.yml b/.rubocop_todo/rails/index_with.yml
new file mode 100644
index 00000000000..09339d3fd56
--- /dev/null
+++ b/.rubocop_todo/rails/index_with.yml
@@ -0,0 +1,52 @@
+---
+# Cop supports --auto-correct.
+Rails/IndexWith:
+ # Offense count: 54
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/helpers/ci/jobs_helper.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/concerns/cached_commit.rb'
+ - 'app/models/environment.rb'
+ - 'app/services/concerns/rate_limited_service.rb'
+ - 'db/post_migrate/20210731132939_backfill_stage_event_hash.rb'
+ - 'ee/app/models/vulnerabilities/projects_grade.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/gitlab/auth/group_saml/auth_hash.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_label_reducer.rb'
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'lib/api/entities/project_integration.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/banzai/filter/repository_link_filter.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/security/identifier.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/database/count/exact_count_strategy.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/obsolete_ignored_columns.rb'
+ - 'lib/gitlab/issuable_metadata.rb'
+ - 'lib/gitlab/template/base_template.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/google_api/cloud_platform/client.rb'
+ - 'qa/qa/resource/reusable.rb'
+ - 'scripts/trigger-build.rb'
+ - 'spec/lib/gitlab/api_authentication/sent_through_builder_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/model_configuration_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/google_api/cloud_platform/client_spec.rb'
+ - 'spec/lib/learn_gitlab/onboarding_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/presenters/projects/security/configuration_presenter_spec.rb'
+ - 'spec/support/database/multiple_databases.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_examples/models/concerns/sanitizable_shared_examples.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
diff --git a/.rubocop_todo/rails/inverse_of.yml b/.rubocop_todo/rails/inverse_of.yml
new file mode 100644
index 00000000000..7a757ec8a9d
--- /dev/null
+++ b/.rubocop_todo/rails/inverse_of.yml
@@ -0,0 +1,115 @@
+---
+Rails/InverseOf:
+ # Offense count: 210
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/alert_management/alert_assignee.rb'
+ - 'app/models/analytics/cycle_analytics/project_stage.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/audit_event.rb'
+ - 'app/models/board.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/bulk_imports/tracker.rb'
+ - 'app/models/chat_name.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_pending_state.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/daily_build_group_report_result.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/job_variable.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/pipeline_schedule.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/runner_namespace.rb'
+ - 'app/models/ci/sources/pipeline.rb'
+ - 'app/models/ci/stage.rb'
+ - 'app/models/ci/trigger_request.rb'
+ - 'app/models/ci/unit_test_failure.rb'
+ - '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'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
+ - 'app/models/concerns/awardable.rb'
+ - 'app/models/concerns/commit_signature.rb'
+ - 'app/models/concerns/merge_request_reviewer_state.rb'
+ - 'app/models/concerns/with_uploads.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/error.rb'
+ - 'app/models/exported_protected_branch.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group/crm_settings.rb'
+ - 'app/models/group_group_link.rb'
+ - 'app/models/hooks/service_hook.rb'
+ - 'app/models/incident_management/timeline_event.rb'
+ - 'app/models/integrations/base_slash_commands.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/jira_connect_subscription.rb'
+ - 'app/models/members/group_member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/packages/composer/cache_file.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/project.rb'
+ - 'app/models/resource_state_event.rb'
+ - 'app/models/serverless/domain_cluster.rb'
+ - 'app/models/terraform/state_version.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/user.rb'
+ - 'app/models/x509_certificate.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/analytics/cycle_analytics/group_stage.rb'
+ - 'ee/app/models/analytics/cycle_analytics/group_value_stream.rb'
+ - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
+ - 'ee/app/models/analytics/devops_adoption/snapshot.rb'
+ - 'ee/app/models/audit_events/external_audit_event_destination.rb'
+ - 'ee/app/models/ci/sources/project.rb'
+ - 'ee/app/models/compliance_management/compliance_framework/project_settings.rb'
+ - 'ee/app/models/concerns/incident_management/base_pending_escalation.rb'
+ - 'ee/app/models/dast/profile_schedule.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/ci/pipeline.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/plan.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/service_desk_setting.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/elastic/reindexing_subtask.rb'
+ - 'ee/app/models/elastic/reindexing_task.rb'
+ - 'ee/app/models/geo/event.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/models/geo/job_artifact_registry.rb'
+ - 'ee/app/models/geo/upload_registry.rb'
+ - 'ee/app/models/group_deletion_schedule.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/incident_management/oncall_participant.rb'
+ - 'ee/app/models/insight.rb'
+ - 'ee/app/models/integrations/gitlab_slack_application.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/requirements_management/test_report.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/security/orchestration_policy_rule_schedule.rb'
+ - 'ee/app/models/slack_integration.rb'
+ - 'ee/app/models/software_license_policy.rb'
+ - 'ee/app/models/user_permission_export_upload.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/models/vulnerabilities/statistic.rb'
diff --git a/.rubocop_todo/rails/lexically_scoped_action_filter.yml b/.rubocop_todo/rails/lexically_scoped_action_filter.yml
new file mode 100644
index 00000000000..84b85f76c68
--- /dev/null
+++ b/.rubocop_todo/rails/lexically_scoped_action_filter.yml
@@ -0,0 +1,48 @@
+---
+Rails/LexicallyScopedActionFilter:
+ # Offense count: 73
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/clusters/base_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/multiple_boards_actions.rb'
+ - 'app/controllers/concerns/oauth_applications.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb'
+ - 'app/controllers/confirmations_controller.rb'
+ - 'app/controllers/dashboard_controller.rb'
+ - 'app/controllers/groups/group_members_controller.rb'
+ - 'app/controllers/groups/milestones_controller.rb'
+ - 'app/controllers/groups/runners_controller.rb'
+ - 'app/controllers/groups/uploads_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/controllers/oauth/applications_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/projects/badges_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/incidents_controller.rb'
+ - 'app/controllers/projects/issue_links_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/notes_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects/project_members_controller.rb'
+ - 'app/controllers/projects/prometheus/alerts_controller.rb'
+ - 'app/controllers/projects/releases_controller.rb'
+ - 'app/controllers/projects/service_hook_logs_controller.rb'
+ - 'app/controllers/projects/snippets_controller.rb'
+ - 'app/controllers/projects/tags_controller.rb'
+ - 'app/controllers/projects/todos_controller.rb'
+ - 'app/controllers/projects/tree_controller.rb'
+ - 'app/controllers/projects/uploads_controller.rb'
+ - 'app/controllers/snippets/blobs_controller.rb'
+ - 'app/controllers/snippets/notes_controller.rb'
+ - 'app/controllers/snippets_controller.rb'
+ - 'app/controllers/uploads_controller.rb'
diff --git a/.rubocop_todo/rails/mailer_name.yml b/.rubocop_todo/rails/mailer_name.yml
new file mode 100644
index 00000000000..17e55c178f7
--- /dev/null
+++ b/.rubocop_todo/rails/mailer_name.yml
@@ -0,0 +1,5 @@
+---
+# Cop supports --auto-correct.
+Rails/MailerName:
+ Exclude:
+ - 'app/mailers/notify.rb'
diff --git a/.rubocop_todo/rails/negate_include.yml b/.rubocop_todo/rails/negate_include.yml
new file mode 100644
index 00000000000..7bf78b82b60
--- /dev/null
+++ b/.rubocop_todo/rails/negate_include.yml
@@ -0,0 +1,58 @@
+---
+# Cop supports --auto-correct.
+Rails/NegateInclude:
+ # Offense count: 65
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/projects_finder.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - 'app/models/label.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/services/todo_service.rb'
+ - 'config/application.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'danger/roulette/Dangerfile'
+ - 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/services/epic_issues/create_service.rb'
+ - 'ee/app/services/security/ingestion/tasks/ingest_remediations.rb'
+ - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/generators/gitlab/usage_metric_generator.rb'
+ - 'lib/gitlab/background_migration/legacy_upload_mover.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause/exists.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/queue/metrics.rb'
+ - 'lib/gitlab/database/each_database.rb'
+ - 'lib/gitlab/email/handler/create_issue_handler.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/import_export/attributes_permitter.rb'
+ - 'lib/gitlab/search_results.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab_edition.rb'
+ - 'qa/qa/runtime/ip_address.rb'
+ - 'qa/qa/support/run.rb'
+ - 'qa/qa/tools/delete_test_users.rb'
+ - 'qa/qa/vendor/jenkins/page/configure_job.rb'
+ - 'qa/qa/vendor/jenkins/page/last_job_console.rb'
+ - 'rubocop/cop/gitlab/feature_available_usage.rb'
+ - 'rubocop/cop/graphql/id_type.rb'
+ - 'rubocop/cop/migration/add_reference.rb'
+ - 'rubocop/cop/rspec/factory_bot/inline_association.rb'
+ - 'scripts/lib/gitlab.rb'
+ - 'scripts/static-analysis'
+ - 'spec/lib/container_registry/blob_spec.rb'
+ - 'spec/lib/container_registry/client_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/support/matchers/pushed_frontend_feature_flags_matcher.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
diff --git a/.rubocop_todo/rails/pick.yml b/.rubocop_todo/rails/pick.yml
new file mode 100644
index 00000000000..95ed3e61cb5
--- /dev/null
+++ b/.rubocop_todo/rails/pick.yml
@@ -0,0 +1,43 @@
+---
+# Cop supports --auto-correct.
+Rails/Pick:
+ # Offense count: 42
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'db/post_migrate/20210825193652_backfill_cadence_id_for_boards_scoped_to_iteration.rb'
+ - 'db/post_migrate/20220213103859_remove_integrations_type.rb'
+ - 'db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb'
+ - 'ee/app/models/concerns/epic_tree_sorting.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/lib/analytics/merge_request_metrics_calculator.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_status_column_of_security_scans.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_project_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_integrations_type_new.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots.rb'
+ - 'lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_security_findings.rb'
+ - 'lib/gitlab/background_migration/encrypt_static_object_token.rb'
+ - 'lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb'
+ - 'lib/gitlab/background_migration/populate_vulnerability_reads.rb'
+ - 'lib/gitlab/background_migration/update_timelogs_null_spent_at.rb'
+ - 'lib/gitlab/database/dynamic_model_helpers.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb'
+ - 'lib/gitlab/github_import/user_finder.rb'
+ - 'lib/gitlab/relative_positioning/item_context.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
+ - 'spec/requests/projects/cycle_analytics_events_spec.rb'
diff --git a/.rubocop_todo/rails/pluck.yml b/.rubocop_todo/rails/pluck.yml
new file mode 100644
index 00000000000..608801085d4
--- /dev/null
+++ b/.rubocop_todo/rails/pluck.yml
@@ -0,0 +1,109 @@
+---
+# Cop supports --auto-correct.
+Rails/Pluck:
+ # Offense count: 155
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/merge_requests/oldest_per_commit_finder.rb'
+ - 'app/helpers/issuables_description_templates_helper.rb'
+ - 'app/models/ci/unit_test.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/concerns/sensitive_serializable_hash.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - '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'
+ - 'app/services/prometheus/create_default_alerts_service.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
+ - 'ee/app/models/boards/epic_list.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
+ - 'ee/app/workers/geo/container_repository_sync_dispatch_worker.rb'
+ - 'ee/app/workers/geo/file_download_dispatch_worker.rb'
+ - 'ee/app/workers/geo/registry_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_shard_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/lib/ee/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/person.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'
+ - 'ee/lib/gitlab/ci/reports/license_scanning/report.rb'
+ - 'ee/spec/controllers/groups/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/projects/audit_events_controller_spec.rb'
+ - 'ee/spec/helpers/ee/geo_helper_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/spdx/catalogue_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/integrations/chat_message/vulnerability_message_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/update_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/create_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/gitlab/access.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/default_stages.rb'
+ - 'lib/gitlab/checks/lfs_check.rb'
+ - 'lib/gitlab/ci/pipeline/chain/build/associations.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/external.rb'
+ - 'lib/gitlab/ci/variables/collection/sort.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/custom_metrics_details_inserter.rb'
+ - 'lib/gitlab/sidekiq_config/cli_methods.rb'
+ - 'lib/gitlab/usage/metrics/name_suggestion.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/jira/jira_basic_integration_spec.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'spec/config/mail_room_spec.rb'
+ - 'spec/config/metrics/aggregates/aggregated_metrics_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/graphql/resolvers/ci/test_suite_resolver_spec.rb'
+ - 'spec/helpers/groups/group_members_helper_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/pull_request_entity_spec.rb'
+ - 'spec/lib/banzai/reference_redactor_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/line_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/git/blame_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/language_detection_spec.rb'
+ - 'spec/lib/gitlab/lograge/custom_options_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/processor_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/conduit/tasks_response_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/item_context_spec.rb'
+ - 'spec/lib/gitlab/search/query_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_matcher_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/peek/views/rugged_spec.rb'
+ - 'spec/migrations/20210713042000_fix_ci_sources_pipelines_index_names_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/instance_configuration_spec.rb'
+ - 'spec/models/integrations/chat_message/alert_message_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/project_auto_devops_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/presenters/packages/detail/package_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/service_index_presenter_spec.rb'
+ - 'spec/serializers/ci/dag_pipeline_entity_spec.rb'
+ - 'spec/serializers/ci/pipeline_entity_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/serializers/stage_entity_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service/status_collection_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
+ - 'spec/services/projects/participants_service_spec.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'tooling/danger/sidekiq_queues.rb'
diff --git a/.rubocop_todo/rails/rake_environment.yml b/.rubocop_todo/rails/rake_environment.yml
new file mode 100644
index 00000000000..d248db022ce
--- /dev/null
+++ b/.rubocop_todo/rails/rake_environment.yml
@@ -0,0 +1,25 @@
+---
+# Cop supports --auto-correct.
+Rails/RakeEnvironment:
+ # Offense count: 31
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/lib/tasks/gitlab/elastic/test.rake'
+ - 'lib/tasks/config_lint.rake'
+ - 'lib/tasks/dev.rake'
+ - 'lib/tasks/gettext.rake'
+ - 'lib/tasks/gitlab/assets.rake'
+ - 'lib/tasks/gitlab/db.rake'
+ - 'lib/tasks/gitlab/docs/compile_deprecations.rake'
+ - 'lib/tasks/gitlab/docs/redirect.rake'
+ - 'lib/tasks/gitlab/helpers.rake'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/gitlab/tw/codeowners.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'lib/tasks/lint.rake'
+ - 'lib/tasks/migrate/setup_postgresql.rake'
+ - 'lib/tasks/setup.rake'
+ - 'lib/tasks/test.rake'
+ - 'lib/tasks/yarn.rake'
+ - 'qa/qa/fixtures/auto_devops_rack/Rakefile'
diff --git a/.rubocop_todo/rails/redundant_foreign_key.yml b/.rubocop_todo/rails/redundant_foreign_key.yml
new file mode 100644
index 00000000000..6b2300ba792
--- /dev/null
+++ b/.rubocop_todo/rails/redundant_foreign_key.yml
@@ -0,0 +1,66 @@
+---
+# Cop supports --auto-correct.
+Rails/RedundantForeignKey:
+ # Offense count: 90
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/alert_management/metric_image.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_need.rb'
+ - 'app/models/ci/build_pending_state.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/daily_build_group_report_result.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/job_variable.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/sources/pipeline.rb'
+ - 'app/models/ci/stage.rb'
+ - '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'
+ - 'app/models/concerns/commit_signature.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_group_link.rb'
+ - 'app/models/integrations/zentao_tracker_data.rb'
+ - 'app/models/member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespaces/project_namespace.rb'
+ - 'app/models/packages/debian/publication.rb'
+ - 'app/models/project.rb'
+ - 'app/models/resource_state_event.rb'
+ - 'app/models/review.rb'
+ - 'app/models/user.rb'
+ - 'app/models/x509_certificate.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/boards/epic_board.rb'
+ - 'ee/app/models/boards/epic_list_user_preference.rb'
+ - 'ee/app/models/ci/sources/project.rb'
+ - 'ee/app/models/concerns/incident_management/base_pending_escalation.rb'
+ - 'ee/app/models/deployments/approval.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/service_desk_setting.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/incident_management/oncall_participant.rb'
+ - 'ee/app/models/incident_management/oncall_shift.rb'
+ - 'ee/app/models/incident_management/pending_escalations/alert.rb'
+ - 'ee/app/models/incident_management/pending_escalations/issue.rb'
+ - 'ee/app/models/incident_management/timeline_event.rb'
+ - 'ee/app/models/issuable_metric_image.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/security/orchestration_policy_rule_schedule.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/models/vulnerabilities/finding_signature.rb'
+ - 'ee/app/models/vulnerabilities/identifier.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
diff --git a/.rubocop_todo/rails/skips_model_validations.yml b/.rubocop_todo/rails/skips_model_validations.yml
new file mode 100644
index 00000000000..e6402ef27f2
--- /dev/null
+++ b/.rubocop_todo/rails/skips_model_validations.yml
@@ -0,0 +1,748 @@
+---
+Rails/SkipsModelValidations:
+ # Offense count: 1424
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/notes_controller.rb'
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/analytics/cycle_analytics/aggregation.rb'
+ - 'app/models/chat_name.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_trace_chunks/database.rb'
+ - 'app/models/ci/build_trace_metadata.rb'
+ - 'app/models/ci/daily_build_group_report_result.rb'
+ - 'app/models/ci/deleted_object.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pending_build.rb'
+ - 'app/models/ci/pipeline_schedule.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/project_mirror.rb'
+ - 'app/models/ci/resource_group.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/running_build.rb'
+ - 'app/models/ci/unit_test.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/batch_nullify_dependent_associations.rb'
+ - 'app/models/concerns/board_recent_visit.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/can_move_repository_storage.rb'
+ - 'app/models/concerns/cascading_namespace_setting_attribute.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/deprecated_assignee.rb'
+ - 'app/models/concerns/file_store_mounter.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/relative_positioning.rb'
+ - 'app/models/concerns/repository_storage_movable.rb'
+ - 'app/models/concerns/resolvable_note.rb'
+ - 'app/models/concerns/schedulable.rb'
+ - 'app/models/concerns/subscribable.rb'
+ - 'app/models/container_expiration_policy.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/diff_note_position.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_import_state.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/jira_import_state.rb'
+ - 'app/models/loose_foreign_keys/deleted_record.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/diff_commit_user.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/note.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_authorization.rb'
+ - 'app/models/project_import_state.rb'
+ - 'app/models/project_statistics.rb'
+ - 'app/models/project_wiki.rb'
+ - 'app/models/projects/ci_feature_usage.rb'
+ - 'app/models/projects/repository_storage_move.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/raw_usage_data.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/route.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/u2f_registration.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_custom_attribute.rb'
+ - 'app/models/user_interacted_project.rb'
+ - 'app/services/boards/lists/base_destroy_service.rb'
+ - 'app/services/boards/lists/move_service.rb'
+ - 'app/services/bulk_create_integration_service.rb'
+ - 'app/services/bulk_update_integration_service.rb'
+ - 'app/services/ci/abort_pipelines_service.rb'
+ - 'app/services/ci/disable_user_pipeline_schedules_service.rb'
+ - 'app/services/ci/expire_pipeline_cache_service.rb'
+ - 'app/services/ci/job_artifacts/create_service.rb'
+ - 'app/services/ci/job_artifacts/destroy_batch_service.rb'
+ - 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb'
+ - 'app/services/ci/job_artifacts/update_unknown_locked_status_service.rb'
+ - 'app/services/ci/test_failure_history_service.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'app/services/ci/update_pending_build_service.rb'
+ - 'app/services/clusters/agent_tokens/track_usage_service.rb'
+ - 'app/services/clusters/agents/refresh_authorization_service.rb'
+ - 'app/services/clusters/integrations/prometheus_health_check_service.rb'
+ - 'app/services/deployments/archive_in_project_service.rb'
+ - 'app/services/event_create_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issues/move_service.rb'
+ - 'app/services/issues/set_crm_contacts_service.rb'
+ - 'app/services/keys/expiry_notification_service.rb'
+ - 'app/services/keys/last_used_service.rb'
+ - 'app/services/labels/promote_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/bulk_remove_attention_requested_service.rb'
+ - 'app/services/merge_requests/cleanup_refs_service.rb'
+ - 'app/services/merge_requests/ff_merge_service.rb'
+ - 'app/services/merge_requests/handle_assignees_change_service.rb'
+ - 'app/services/merge_requests/merge_service.rb'
+ - 'app/services/merge_requests/rebase_service.rb'
+ - 'app/services/merge_requests/reopen_service.rb'
+ - 'app/services/milestones/promote_service.rb'
+ - 'app/services/milestones/transfer_service.rb'
+ - 'app/services/packages/composer/create_package_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/packages/generic/create_package_file_service.rb'
+ - 'app/services/packages/mark_package_files_for_destruction_service.rb'
+ - 'app/services/packages/npm/create_tag_service.rb'
+ - 'app/services/packages/pypi/create_package_service.rb'
+ - 'app/services/packages/rubygems/create_dependencies_service.rb'
+ - 'app/services/personal_access_tokens/last_used_service.rb'
+ - 'app/services/projects/destroy_service.rb'
+ - 'app/services/projects/detect_repository_languages_service.rb'
+ - 'app/services/projects/move_deploy_keys_projects_service.rb'
+ - 'app/services/projects/move_forks_service.rb'
+ - 'app/services/projects/move_lfs_objects_projects_service.rb'
+ - 'app/services/projects/move_notification_settings_service.rb'
+ - 'app/services/projects/move_project_authorizations_service.rb'
+ - 'app/services/projects/move_project_group_links_service.rb'
+ - 'app/services/projects/move_project_members_service.rb'
+ - 'app/services/projects/move_users_star_projects_service.rb'
+ - 'app/services/projects/repository_languages_service.rb'
+ - 'app/services/projects/unlink_fork_service.rb'
+ - 'app/services/reset_project_cache_service.rb'
+ - 'app/services/spam/akismet_mark_as_spam_service.rb'
+ - 'app/services/spam/ham_service.rb'
+ - 'app/services/suggestions/apply_service.rb'
+ - 'app/services/suggestions/outdate_service.rb'
+ - 'app/services/users/activity_service.rb'
+ - 'app/services/users/migrate_to_ghost_user_service.rb'
+ - 'app/services/users/respond_to_terms_service.rb'
+ - 'app/services/users/set_status_service.rb'
+ - 'app/services/users/upsert_credit_card_validation_service.rb'
+ - 'app/services/x509_certificate_revoke_service.rb'
+ - 'app/uploaders/file_mover.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'app/workers/analytics/usage_trends/counter_job_worker.rb'
+ - 'app/workers/concerns/dependency_proxy/expireable.rb'
+ - 'app/workers/concerns/packages/cleanup_artifact_worker.rb'
+ - 'app/workers/container_expiration_policy_worker.rb'
+ - 'app/workers/namespaceless_project_destroy_worker.rb'
+ - 'app/workers/packages/helm/extraction_worker.rb'
+ - 'app/workers/packages/nuget/extraction_worker.rb'
+ - 'app/workers/packages/rubygems/extraction_worker.rb'
+ - 'app/workers/personal_access_tokens/expired_notification_worker.rb'
+ - 'app/workers/personal_access_tokens/expiring_worker.rb'
+ - 'app/workers/pipeline_metrics_worker.rb'
+ - 'app/workers/process_commit_worker.rb'
+ - 'app/workers/repository_check/clear_worker.rb'
+ - 'app/workers/repository_check/single_repository_worker.rb'
+ - 'app/workers/stuck_merge_jobs_worker.rb'
+ - 'app/workers/x509_issuer_crl_check_worker.rb'
+ - 'db/migrate/20210428151144_update_invalid_web_hooks.rb'
+ - 'db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb'
+ - 'db/migrate/20210630224625_generate_customers_dot_jwt_signing_key.rb'
+ - 'db/migrate/20210729123101_confirm_security_bot.rb'
+ - 'db/migrate/20220413054910_backfill_delayed_group_deletion.rb'
+ - 'db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb'
+ - 'db/post_migrate/20210303165302_cleanup_cluster_tokens_with_null_name.rb'
+ - 'db/post_migrate/20210406144743_backfill_total_tuple_count_for_batched_migrations.rb'
+ - 'db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb'
+ - 'db/post_migrate/20210601073400_fix_total_stage_in_vsa.rb'
+ - 'db/post_migrate/20210615234935_fix_batched_migrations_old_format_job_arguments.rb'
+ - 'db/post_migrate/20210722042939_update_issuable_slas_where_issue_closed.rb'
+ - 'db/post_migrate/20210731132939_backfill_stage_event_hash.rb'
+ - 'db/post_migrate/20210809123658_orphaned_invite_tokens_cleanup.rb'
+ - 'db/post_migrate/20210811122206_update_external_project_bots.rb'
+ - 'db/post_migrate/20210825150212_cleanup_remaining_orphan_invites.rb'
+ - 'db/post_migrate/20210826171758_initialize_throttle_unauthenticated_api_columns.rb'
+ - 'db/post_migrate/20210901153324_slice_merge_request_diff_commit_migrations.rb'
+ - 'db/post_migrate/20210908132335_disable_job_token_scope_when_unused.rb'
+ - 'db/post_migrate/20210914095310_cleanup_orphan_project_access_tokens.rb'
+ - 'db/post_migrate/20211217174331_mark_recalculate_finding_signatures_as_completed.rb'
+ - 'db/post_migrate/20211220123956_update_invalid_member_states.rb'
+ - 'db/post_migrate/20220305223212_add_security_training_providers.rb'
+ - 'db/post_migrate/20220307203459_rename_user_email_lookup_limit_setting_to_search_settings_cleanup.rb'
+ - 'db/post_migrate/20220322132242_update_pages_onboarding_state.rb'
+ - 'ee/app/controllers/ee/clusters/clusters_controller.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/ci/minutes/namespace_monthly_usage.rb'
+ - 'ee/app/models/ci/minutes/project_monthly_usage.rb'
+ - 'ee/app/models/concerns/deprecated_approvals_before_merge.rb'
+ - 'ee/app/models/concerns/epic_tree_sorting.rb'
+ - 'ee/app/models/concerns/geo/replicable_registry.rb'
+ - 'ee/app/models/concerns/geo/verification_state.rb'
+ - 'ee/app/models/ee/description_version.rb'
+ - 'ee/app/models/ee/environment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/event.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/namespace_setting.rb'
+ - 'ee/app/models/ee/project_wiki.rb'
+ - 'ee/app/models/geo/container_repository_registry.rb'
+ - 'ee/app/models/geo/design_registry.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/ci/minutes/additional_packs/change_namespace_service.rb'
+ - 'ee/app/services/ci/minutes/batch_reset_service.rb'
+ - 'ee/app/services/ci/minutes/refresh_cached_data_service.rb'
+ - 'ee/app/services/ci/minutes/reset_usage_service.rb'
+ - 'ee/app/services/ci/minutes/update_project_and_namespace_usage_service.rb'
+ - 'ee/app/services/ci/sync_reports_to_approval_rules_service.rb'
+ - 'ee/app/services/ee/issues/move_service.rb'
+ - 'ee/app/services/ee/labels/promote_service.rb'
+ - 'ee/app/services/ee/milestones/promote_service.rb'
+ - 'ee/app/services/ee/projects/transfer_service.rb'
+ - 'ee/app/services/ee/users/migrate_to_ghost_user_service.rb'
+ - 'ee/app/services/epics/strategies/due_date_inherited_strategy.rb'
+ - 'ee/app/services/epics/strategies/start_date_inherited_strategy.rb'
+ - 'ee/app/services/geo/job_artifact_deleted_event_store.rb'
+ - 'ee/app/services/geo/repository_verification_reset.rb'
+ - 'ee/app/services/incident_management/oncall_rotations/edit_service.rb'
+ - 'ee/app/services/incident_management/oncall_rotations/remove_participant_service.rb'
+ - 'ee/app/services/iterations/cadences/create_iterations_in_advance_service.rb'
+ - 'ee/app/services/iterations/cadences/destroy_service.rb'
+ - 'ee/app/services/iterations/delete_service.rb'
+ - 'ee/app/services/iterations/roll_over_issues_service.rb'
+ - 'ee/app/services/ldap_group_reset_service.rb'
+ - 'ee/app/services/personal_access_tokens/revoke_invalid_tokens.rb'
+ - 'ee/app/services/security/findings/cleanup_service.rb'
+ - 'ee/app/services/security/ingestion/mark_as_resolved_service.rb'
+ - 'ee/app/services/security/store_findings_metadata_service.rb'
+ - 'ee/app/services/security/store_scan_service.rb'
+ - 'ee/app/services/security/update_training_service.rb'
+ - 'ee/app/services/vulnerabilities/starboard_vulnerability_resolve_service.rb'
+ - 'ee/app/workers/import_software_licenses_worker.rb'
+ - 'ee/app/workers/iterations_update_status_worker.rb'
+ - 'ee/app/workers/sync_seat_link_request_worker.rb'
+ - 'ee/lib/api/geo_replication.rb'
+ - 'ee/lib/ee/api/protected_branches.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_requirements_to_work_items.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/tasks/migrate/ldap.rake'
+ - 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
+ - 'ee/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/ldaps_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/factories/import_states.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/features/projects/settings/issues_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/protected_environments_spec.rb'
+ - 'ee/spec/features/projects/user_applies_custom_file_template_spec.rb'
+ - 'ee/spec/features/trials/select_namespace_spec.rb'
+ - 'ee/spec/finders/geo/repository_verification_finder_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/training_urls_finder_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_escalation_policy_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/set_iteration_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/epic_lists_resolvers_spec.rb'
+ - 'ee/spec/helpers/ee/blob_helper_spec.rb'
+ - 'ee/spec/helpers/push_rules_helper_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers_spec.rb'
+ - 'ee/spec/lib/ee/audit/group_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_ci_cd_setting_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_feature_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/geo_tasks_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_downloader_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/signed_data_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/dast/profile_schedule_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/groups/feature_setting_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/models/ee/key_spec.rb'
+ - 'ee/spec/models/ee/namespace_limit_spec.rb'
+ - 'ee/spec/models/ee/vulnerability_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/geo_node_status_spec.rb'
+ - 'ee/spec/models/group_wiki_repository_spec.rb'
+ - 'ee/spec/models/instance_security_dashboard_spec.rb'
+ - 'ee/spec/models/merge_request/blocking_spec.rb'
+ - 'ee/spec/models/merge_train_spec.rb'
+ - 'ee/spec/models/packages/package_file_spec.rb'
+ - 'ee/spec/models/project_feature_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/project_team_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/models/requirements_management/requirement_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - 'ee/spec/models/snippet_repository_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/models/vulnerabilities/stat_diff_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/requests/api/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/set_epic_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/internal/app_sec/dast/site_validations_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/requests/api/namespaces_spec.rb'
+ - 'ee/spec/requests/api/project_approvals_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/email_notification_service_spec.rb'
+ - 'ee/spec/services/ci/register_job_service_spec.rb'
+ - 'ee/spec/services/ci_cd/setup_project_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/releases/create_evidence_service_spec.rb'
+ - 'ee/spec/services/epic_issues/update_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/epics/update_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/hashed_storage_migration_service_spec.rb'
+ - 'ee/spec/services/groups/create_service_spec.rb'
+ - 'ee/spec/services/groups/update_service_spec.rb'
+ - 'ee/spec/services/merge_trains/check_status_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/projects/setup_ci_cd_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_report_slice_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/starboard_vulnerability_resolve_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/statistics/adjustment_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/statistics/update_service_spec.rb'
+ - 'ee/spec/support/helpers/ee/geo_helpers.rb'
+ - 'ee/spec/support/shared_examples/models/requirement_issues_examples.rb'
+ - 'ee/spec/support/shared_examples/policies/protected_environments_shared_examples.rb'
+ - 'ee/spec/workers/app_sec/dast/profile_schedule_worker_spec.rb'
+ - 'ee/spec/workers/ee/repository_check/batch_worker_spec.rb'
+ - 'ee/spec/workers/geo/repositories_clean_up_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_shard_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_sync_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_state_backfill_service_spec.rb'
+ - 'ee/spec/workers/import_software_licenses_worker_spec.rb'
+ - 'ee/spec/workers/iterations/roll_over_issues_worker_spec.rb'
+ - 'ee/spec/workers/iterations_update_status_worker_spec.rb'
+ - 'ee/spec/workers/network_policy_metrics_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb'
+ - 'ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb'
+ - 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
+ - 'lib/api/commit_statuses.rb'
+ - 'lib/api/usage_data.rb'
+ - 'lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
+ - 'lib/gitlab/background_migration/backfill_draft_status_on_merge_requests.rb'
+ - 'lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2.rb'
+ - 'lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_roots.rb'
+ - 'lib/gitlab/background_migration/backfill_projects_with_coverage.rb'
+ - 'lib/gitlab/background_migration/backfill_topics_title.rb'
+ - 'lib/gitlab/background_migration/backfill_user_namespace.rb'
+ - 'lib/gitlab/background_migration/backfill_work_item_type_id_for_issues.rb'
+ - 'lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex.rb'
+ - 'lib/gitlab/background_migration/copy_column_using_background_migration_job.rb'
+ - 'lib/gitlab/background_migration/legacy_upload_mover.rb'
+ - 'lib/gitlab/background_migration/merge_topics_with_same_name.rb'
+ - 'lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/migrate_null_private_profile_to_false.rb'
+ - 'lib/gitlab/background_migration/migrate_personal_namespace_project_maintainer_to_owner.rb'
+ - 'lib/gitlab/background_migration/migrate_project_taggings_context_from_tags_to_topics.rb'
+ - 'lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb'
+ - 'lib/gitlab/background_migration/migrate_u2f_webauthn.rb'
+ - 'lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/bitbucket_server_import/importer.rb'
+ - 'lib/gitlab/ci/tags/bulk_insert.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/composer/cache.rb'
+ - 'lib/gitlab/database/background_migration_job.rb'
+ - 'lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb'
+ - 'lib/gitlab/database/schema_migrations.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_review_importer.rb'
+ - 'lib/gitlab/import/set_async_jid.rb'
+ - 'lib/gitlab/jira_import/handle_labels_service.rb'
+ - 'lib/gitlab/job_waiter.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/markdown_cache/active_record/extension.rb'
+ - 'lib/gitlab/otp_key_rotator.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/tasks/ci/cleanup.rake'
+ - 'lib/tasks/gitlab/external_diffs.rake'
+ - 'lib/tasks/gitlab/ldap.rake'
+ - 'lib/tasks/gitlab/user_management.rake'
+ - 'lib/tasks/migrate/migrate_iids.rake'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/controllers/import/gitlab_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/projects/forks_controller_spec.rb'
+ - 'spec/controllers/projects/graphs_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/content_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines/tests_controller_spec.rb'
+ - 'spec/controllers/projects/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/starrers_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/uploads_controller_spec.rb'
+ - 'spec/factories/alert_management/alerts.rb'
+ - 'spec/factories/container_expiration_policies.rb'
+ - 'spec/factories/design_management/versions.rb'
+ - 'spec/factories/environments.rb'
+ - 'spec/factories/import_states.rb'
+ - 'spec/factories/projects.rb'
+ - 'spec/factories/usage_data.rb'
+ - 'spec/features/admin/admin_settings_spec.rb'
+ - 'spec/features/admin/admin_uses_repository_checks_spec.rb'
+ - 'spec/features/dashboard/projects_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
+ - 'spec/features/issues/discussion_lock_spec.rb'
+ - 'spec/features/merge_request/merge_request_discussion_lock_spec.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_locks_discussion_spec.rb'
+ - 'spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_sees_diff_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_pipelines_spec.rb'
+ - 'spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb'
+ - 'spec/features/monitor_sidebar_link_spec.rb'
+ - 'spec/features/password_reset_spec.rb'
+ - 'spec/features/profiles/emails_spec.rb'
+ - 'spec/features/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/projects/diffs/diff_show_spec.rb'
+ - 'spec/features/projects/features_visibility_spec.rb'
+ - 'spec/features/projects/fork_spec.rb'
+ - 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/members/invite_group_spec.rb'
+ - 'spec/features/projects/milestones/milestone_spec.rb'
+ - 'spec/features/projects/pipeline_schedules_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - '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'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/notes_finder_spec.rb'
+ - 'spec/finders/packages/go/package_finder_spec.rb'
+ - 'spec/finders/packages/maven/package_finder_spec.rb'
+ - 'spec/finders/packages/npm/package_finder_spec.rb'
+ - 'spec/finders/packages/nuget/package_finder_spec.rb'
+ - 'spec/finders/packages/package_finder_spec.rb'
+ - 'spec/finders/projects_finder_spec.rb'
+ - 'spec/finders/releases/group_releases_finder_spec.rb'
+ - 'spec/finders/releases_finder_spec.rb'
+ - 'spec/finders/user_group_notification_settings_finder_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/graphql/mutations/issues/set_escalation_status_spec.rb'
+ - 'spec/graphql/mutations/issues/update_spec.rb'
+ - 'spec/graphql/resolvers/ci/test_suite_resolver_spec.rb'
+ - 'spec/graphql/types/project_type_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/import_helper_spec.rb'
+ - 'spec/helpers/members_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/initializers/active_record_locking_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batched_migration_job_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_timelogs_null_spent_at_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/project_spec.rb'
+ - 'spec/lib/gitlab/contributions_calendar_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/permissions_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/consistency_checker_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/migrations_spec.rb'
+ - 'spec/lib/gitlab/discussions_diff/file_collection_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_note_on_issuable_handler_spec.rb'
+ - 'spec/lib/gitlab/etag_caching/store_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb'
+ - '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'
+ - 'spec/migrations/20211126115449_encrypt_static_objects_external_storage_auth_token_spec.rb'
+ - 'spec/migrations/remove_duplicate_dast_site_tokens_spec.rb'
+ - 'spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - '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'
+ - 'spec/models/ci/resource_group_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/ci/stage_spec.rb'
+ - 'spec/models/commit_signatures/gpg_signature_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/concerns/cache_markdown_field_spec.rb'
+ - 'spec/models/concerns/deployment_platform_spec.rb'
+ - 'spec/models/concerns/deprecated_assignee_spec.rb'
+ - 'spec/models/concerns/each_batch_spec.rb'
+ - 'spec/models/concerns/pg_full_text_searchable_spec.rb'
+ - 'spec/models/concerns/project_features_compatibility_spec.rb'
+ - 'spec/models/concerns/spammable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/deploy_keys_project_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/diff_discussion_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/guest_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/loose_foreign_keys/deleted_record_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/group_member_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace/traversal_hierarchy_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/project_authorization_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_statistics_spec.rb'
+ - 'spec/models/projects/build_artifacts_size_refresh_spec.rb'
+ - 'spec/models/projects/topic_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/custom_emoji_policy_spec.rb'
+ - 'spec/policies/note_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/container_repository/container_repository_details_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_group_setting_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_image_ttl_policy_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb'
+ - 'spec/requests/api/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/update_spec.rb'
+ - 'spec/requests/api/helm_packages_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/projects/merge_requests_spec.rb'
+ - 'spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'spec/services/alert_management/create_alert_issue_service_spec.rb'
+ - 'spec/services/ci/compare_reports_base_service_spec.rb'
+ - 'spec/services/ci/compare_test_reports_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/update_unknown_locked_status_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_job_service_spec.rb'
+ - 'spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'spec/services/ci/test_failure_history_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/incident_management/pager_duty/process_webhook_service_spec.rb'
+ - 'spec/services/issuable/common_system_notes_service_spec.rb'
+ - 'spec/services/issues/clone_service_spec.rb'
+ - 'spec/services/issues/close_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/merge_requests/get_urls_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/reopen_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/notes/update_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/nuget/search_service_spec.rb'
+ - 'spec/services/projects/container_repository/delete_tags_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/fork_service_spec.rb'
+ - 'spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/spam/ham_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/system_notes/time_tracking_service_spec.rb'
+ - 'spec/services/users/repair_ldap_blocked_service_spec.rb'
+ - 'spec/services/work_items/task_list_reference_replacement_service_spec.rb'
+ - 'spec/support/helpers/access_matchers_helpers.rb'
+ - 'spec/support/matchers/access_matchers_for_controller.rb'
+ - 'spec/support/shared_contexts/email_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb'
+ - 'spec/support/shared_contexts/mailers/notify_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb'
+ - 'spec/support/shared_examples/ci/stuck_builds_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/features/2fa_shared_examples.rb'
+ - 'spec/support/shared_examples/features/access_tokens_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/banzai/reference_parser_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/featurable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/members_notifications_shared_example.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/models/throttled_touch_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/resource_access_token_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/members_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/user_activity_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/lists_list_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/notification_service_shared_examples.rb'
+ - 'spec/support/shared_examples/views/pipeline_status_changes_email.rb'
+ - 'spec/support/trace/trace_helpers.rb'
+ - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/tasks/gitlab/artifacts/check_rake_spec.rb'
+ - 'spec/tasks/gitlab/external_diffs_rake_spec.rb'
+ - 'spec/tasks/gitlab/uploads/check_rake_spec.rb'
+ - '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'
+ - 'spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/container_expiration_policy_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/guard_worker_spec.rb'
+ - 'spec/workers/gitlab/github_import/advance_stage_worker_spec.rb'
+ - 'spec/workers/packages/cleanup_package_file_worker_spec.rb'
+ - 'spec/workers/packages/cleanup_package_registry_worker_spec.rb'
+ - 'spec/workers/packages/composer/cache_cleanup_worker_spec.rb'
+ - 'spec/workers/pipeline_schedule_worker_spec.rb'
+ - 'spec/workers/remote_mirror_notification_worker_spec.rb'
+ - 'spec/workers/repository_check/batch_worker_spec.rb'
+ - 'spec/workers/repository_check/clear_worker_spec.rb'
diff --git a/.rubocop_todo/rails/squished_sql_heredocs.yml b/.rubocop_todo/rails/squished_sql_heredocs.yml
new file mode 100644
index 00000000000..dc71b7b32ce
--- /dev/null
+++ b/.rubocop_todo/rails/squished_sql_heredocs.yml
@@ -0,0 +1,217 @@
+---
+# Cop supports --auto-correct.
+Rails/SquishedSQLHeredocs:
+ # Offense count: 356
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/members_finder.rb'
+ - 'app/models/analytics/cycle_analytics/stage_event_hash.rb'
+ - 'app/models/ci/resource_group.rb'
+ - 'app/models/clusters/clusters_hierarchy.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
+ - 'app/models/concerns/has_environment_scope.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/issue/metrics.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/namespace/traversal_hierarchy.rb'
+ - 'app/models/namespaces/traversal/linear.rb'
+ - 'app/models/project.rb'
+ - 'app/models/user.rb'
+ - 'app/services/issuable/destroy_label_links_service.rb'
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'app/services/projects/fetch_statistics_increment_service.rb'
+ - 'app/services/todos/destroy/destroyed_issuable_service.rb'
+ - 'app/workers/users/deactivate_dormant_users_worker.rb'
+ - 'db/migrate/20210323155010_populate_dismissal_information_for_vulnerabilities.rb'
+ - 'db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb'
+ - 'db/migrate/20210611100359_rebuild_index_for_cadence_iterations_automation.rb'
+ - 'db/migrate/20210617022324_create_incident_management_pending_alert_escalations.rb'
+ - 'db/migrate/20210621043337_rename_services_to_integrations.rb'
+ - 'db/migrate/20210621044000_rename_services_indexes_to_integrations.rb'
+ - 'db/migrate/20210706152139_add_index_type_to_postgres_indexes_view.rb'
+ - 'db/migrate/20210719145532_add_foreign_keys_view.rb'
+ - 'db/migrate/20210721135638_add_triggers_to_integrations_type_new.rb'
+ - 'db/migrate/20210721174453_remove_schedule_and_status_null_constraints_from_pending_escalations_alert.rb'
+ - 'db/migrate/20210722150102_operations_feature_flags_correct_flexible_rollout_values.rb'
+ - 'db/migrate/20210730194555_create_incident_management_pending_issue_escalations.rb'
+ - 'db/migrate/20210818175949_update_integrations_trigger_type_new_on_insert.rb'
+ - 'db/migrate/20210825104656_create_analytics_cycle_analytics_merge_request_stage_events.rb'
+ - 'db/migrate/20210825110016_create_analytics_cycle_analytics_issue_stage_events.rb'
+ - 'db/migrate/20210826122748_create_loose_foreign_keys_deleted_records.rb'
+ - 'db/migrate/20210826145509_add_function_for_inserting_deleted_records.rb'
+ - 'db/migrate/20210903054158_recreate_stage_issue_events_table_with_bigints.rb'
+ - 'db/migrate/20210906100021_delete_project_namespace_trigger.rb'
+ - 'db/migrate/20210929032555_create_verification_codes.rb'
+ - 'db/migrate/20211005092428_drop_time_range_partitioned_loose_fk.rb'
+ - 'db/migrate/20211005093558_add_range_partitioned_loose_fk_table.rb'
+ - 'db/migrate/20211005100112_recreate_loose_fk_insert_function.rb'
+ - 'db/migrate/20211007090229_create_issue_search_table.rb'
+ - 'db/migrate/20211011141242_create_namespaces_sync_trigger.rb'
+ - 'db/migrate/20211011141243_create_projects_sync_trigger.rb'
+ - 'db/migrate/20211012015903_next_traversal_ids_sibling_function.rb'
+ - 'db/migrate/20211018161447_fix_double_entries_in_postgres_index_view.rb'
+ - 'db/migrate/20211112155416_populate_default_value_for_personal_access_tokens_prefix.rb'
+ - 'db/migrate/20211118103439_remove_hardcoded_partition_from_loose_fk_trigger_function.rb'
+ - 'db/migrate/20211123135255_create_batched_background_migration_job_transition_logs.rb'
+ - 'db/migrate/20220106111958_add_insert_or_update_vulnerability_reads_trigger.rb'
+ - 'db/migrate/20220106112043_add_update_vulnerability_reads_trigger.rb'
+ - 'db/migrate/20220106112085_add_update_vulnerability_reads_location_trigger.rb'
+ - 'db/migrate/20220106163326_add_has_issues_on_vulnerability_reads_trigger.rb'
+ - 'db/migrate/20220208171826_update_default_scan_method_of_dast_site_profile.rb'
+ - 'db/migrate/20220211214605_update_integrations_trigger_type_new_on_insert_null_safe.rb'
+ - 'db/migrate/20220213100000_remove_integration_type_triggers.rb'
+ - 'db/migrate/20220304052335_remove_not_null_contraint_on_title_from_sprints.rb'
+ - 'db/migrate/20220321234317_remove_all_issuable_escalation_statuses.rb'
+ - 'db/migrate/20220329110630_add_ci_namespace_mirrors_unnest_index_on_traversal_ids.rb'
+ - 'db/migrate/20220412060931_add_nullify_build_data_trigger_on_merge_request_metrics.rb'
+ - 'db/migrate/20220413124200_add_view_for_per_table_autovacuum_status.rb'
+ - 'db/migrate/20220415015143_replace_iterations_cadence_date_range_constraint.rb'
+ - 'db/migrate/20220422200633_fix_view_for_per_table_autovacuum_status.rb'
+ - 'db/migrate/20220422220507_remove_tmp_index_supporting_leaky_regex_cleanup.rb'
+ - 'db/post_migrate/20210302074524_backfill_namespace_statistics_with_wiki_size.rb'
+ - 'db/post_migrate/20210311045138_set_traversal_ids_for_gitlab_org_group_staging.rb'
+ - 'db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb'
+ - 'db/post_migrate/20210311093723_add_partial_index_on_ci_pipelines_by_cancelable_status_and_users.rb'
+ - 'db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb'
+ - 'db/post_migrate/20210331105335_drop_non_partitioned_audit_events.rb'
+ - 'db/post_migrate/20210430134202_copy_adoption_snapshot_namespace.rb'
+ - 'db/post_migrate/20210430135954_copy_adoption_segments_namespace.rb'
+ - 'db/post_migrate/20210525075724_clean_up_pending_builds_table.rb'
+ - 'db/post_migrate/20210609125005_drop_non_partitioned_web_hook_logs.rb'
+ - 'db/post_migrate/20210610102413_migrate_protected_attribute_to_pending_builds.rb'
+ - 'db/post_migrate/20210610141711_disable_expiration_policies_linked_to_no_container_images.rb'
+ - 'db/post_migrate/20210708011426_finalize_ci_builds_metadata_bigint_conversion.rb'
+ - 'db/post_migrate/20210721174521_add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations.rb'
+ - 'db/post_migrate/20210812013042_remove_duplicate_project_authorizations.rb'
+ - 'db/post_migrate/20210907211557_finalize_ci_builds_bigint_conversion.rb'
+ - 'db/post_migrate/20210910194952_update_report_type_for_existing_approval_project_rules.rb'
+ - 'db/post_migrate/20211105135157_drop_ci_build_trace_sections.rb'
+ - 'db/post_migrate/20211112113300_remove_ci_pipeline_chat_data_fk_on_chat_names.rb'
+ - 'db/post_migrate/20211130165043_backfill_sequence_column_for_sprints_table.rb'
+ - 'db/post_migrate/20211206161271_add_indexes_for_primary_email_cleanup_migration.rb'
+ - 'db/post_migrate/20211220064757_drop_temporary_indexes_for_primary_email_migration.rb'
+ - 'db/post_migrate/20220128155251_remove_dangling_running_builds.rb'
+ - 'db/post_migrate/20220204095121_backfill_namespace_statistics_with_dependency_proxy_size.rb'
+ - 'db/post_migrate/20220204110725_backfill_cycle_analytics_aggregations.rb'
+ - 'db/post_migrate/20220213103859_remove_integrations_type.rb'
+ - 'db/post_migrate/20220309084954_remove_leftover_external_pull_request_deletions.rb'
+ - 'db/post_migrate/20220318111040_add_indexes_for_primary_email_second_cleanup_migration.rb'
+ - 'db/post_migrate/20220318111949_drop_temporary_indexes_for_primary_email_migration_second_cleanup.rb'
+ - 'db/post_migrate/20220329175119_remove_leftover_ci_job_artifact_deletions.rb'
+ - 'db/post_migrate/20220420135946_update_batched_background_migration_arguments.rb'
+ - 'ee/app/models/dora/daily_metrics.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - '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'
+ - 'ee/app/services/vulnerabilities/statistics/update_service.rb'
+ - 'ee/db/geo/migrate/20170906174622_remove_duplicates_from_project_registry.rb'
+ - 'ee/db/geo/migrate/20180510223634_set_resync_flag_for_retried_projects.rb'
+ - 'ee/db/geo/post_migrate/20210217020154_add_unique_index_on_container_repository_registry.rb'
+ - 'ee/db/geo/post_migrate/20210217020156_add_unique_index_on_terraform_state_version_registry.rb'
+ - '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/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_status_column_of_security_scans.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_test_reports_issue_id.rb'
+ - 'ee/lib/ee/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/gitlab/geo/base_batcher.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_project_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_group_features.rb'
+ - 'lib/gitlab/background_migration/backfill_integrations_type_new.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb'
+ - 'lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb'
+ - 'lib/gitlab/background_migration/backfill_project_settings.rb'
+ - 'lib/gitlab/background_migration/backfill_projects_with_coverage.rb'
+ - 'lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb'
+ - 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
+ - 'lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb'
+ - 'lib/gitlab/background_migration/encrypt_static_object_token.rb'
+ - 'lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb'
+ - 'lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_project_feature.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb'
+ - 'lib/gitlab/background_migration/populate_container_repository_migration_plan.rb'
+ - 'lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb'
+ - 'lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb'
+ - 'lib/gitlab/background_migration/populate_vulnerability_reads.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/update_timelogs_null_spent_at.rb'
+ - 'lib/gitlab/background_migration/update_timelogs_project_id.rb'
+ - 'lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb'
+ - 'lib/gitlab/database/bulk_update.rb'
+ - 'lib/gitlab/database/count/tablesample_count_strategy.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/loose_foreign_key_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/migrations/batched_background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/observers/query_statistics.rb'
+ - 'lib/gitlab/database/partitioning/replace_table.rb'
+ - 'lib/gitlab/database/partitioning/single_numeric_list_partition.rb'
+ - 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
+ - 'lib/gitlab/database/partitioning/time_partition.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
+ - 'lib/gitlab/database/schema_helpers.rb'
+ - 'lib/gitlab/database/schema_migrations/migrations.rb'
+ - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb'
+ - 'lib/gitlab/sql/glob.rb'
+ - 'lib/tasks/dev.rake'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/initializers/00_rails_disable_joins_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/replace_table_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/time_partition_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_foreign_key_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_index_bloat_estimate_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_index_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_partition_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_partitioned_table_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/migrations_spec.rb'
+ - 'spec/lib/gitlab/database/similarity_score_spec.rb'
+ - 'spec/lib/gitlab/database/unidirectional_copy_trigger_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/conditions/null_condition_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/models/application_record_spec.rb'
+ - 'spec/models/concerns/after_commit_queue_spec.rb'
+ - 'spec/support/db_cleaner.rb'
+ - 'spec/support/helpers/database/partitioning_helpers.rb'
+ - 'spec/support/helpers/database/table_schema_helpers.rb'
+ - 'spec/support/helpers/database/trigger_helpers.rb'
+ - 'spec/support/shared_examples/loose_foreign_keys/have_loose_foreign_key.rb'
diff --git a/.rubocop_todo/rails/time_zone.yml b/.rubocop_todo/rails/time_zone.yml
index 86d0632ac47..ff97dfeb444 100644
--- a/.rubocop_todo/rails/time_zone.yml
+++ b/.rubocop_todo/rails/time_zone.yml
@@ -13,7 +13,6 @@ Rails/TimeZone:
- ee/lib/gitlab/geo/log_cursor/logger.rb
- ee/lib/gitlab/geo/oauth/login_state.rb
- ee/lib/gitlab/prometheus/queries/cluster_query.rb
- - ee/lib/gitlab/prometheus/queries/packet_flow_query.rb
- ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb
- ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb
- ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb
@@ -44,7 +43,6 @@ Rails/TimeZone:
- ee/spec/lib/gitlab/git_access_spec.rb
- ee/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb
- ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb
- - ee/spec/lib/gitlab/prometheus/queries/packet_flow_query_spec.rb
- lib/api/helpers.rb
- lib/api/sidekiq_metrics.rb
- lib/backup/manager.rb
diff --git a/.rubocop_todo/rails/where_exists.yml b/.rubocop_todo/rails/where_exists.yml
new file mode 100644
index 00000000000..00ff82d137e
--- /dev/null
+++ b/.rubocop_todo/rails/where_exists.yml
@@ -0,0 +1,45 @@
+---
+# Cop supports --auto-correct.
+Rails/WhereExists:
+ # Offense count: 48
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/application_setting/term.rb'
+ - 'app/models/ci/pipeline_artifact.rb'
+ - 'app/models/ci/ref.rb'
+ - 'app/models/clusters/agent.rb'
+ - 'app/models/concerns/has_wiki.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_deploy_token.rb'
+ - 'app/models/label.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/onboarding_progress.rb'
+ - 'app/models/project.rb'
+ - 'app/models/protected_branch/push_access_level.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/services/todos/destroy/unauthorized_features_service.rb'
+ - 'db/migrate/20210422195929_create_elastic_reindexing_slices.rb'
+ - 'ee/app/models/approval_merge_request_rule_source.rb'
+ - 'ee/app/models/concerns/ee/protected_ref_access.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group_member.rb'
+ - 'ee/app/models/ee/milestone_release.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/merge_requests/external_status_check.rb'
+ - 'ee/app/models/merge_train.rb'
+ - 'ee/app/workers/concerns/elastic/indexing_control.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/checks/matching_merge_request.rb'
+ - 'lib/gitlab/database/partitioning/detached_partition_dropper.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/services/clusters/cleanup/service_account_service_spec.rb'
+ - 'spec/services/clusters/destroy_service_spec.rb'
diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml
index 1809dd74dc9..32bf03b18ad 100644
--- a/.rubocop_todo/rspec/any_instance_of.yml
+++ b/.rubocop_todo/rspec/any_instance_of.yml
@@ -85,7 +85,6 @@ RSpec/AnyInstanceOf:
- 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/alert_management/network_alert_service_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
@@ -108,7 +107,6 @@ RSpec/AnyInstanceOf:
- ee/spec/services/groups/destroy_service_spec.rb
- ee/spec/services/groups/update_service_spec.rb
- ee/spec/services/merge_trains/check_status_service_spec.rb
- - ee/spec/services/network_policies/resources_service_spec.rb
- ee/spec/services/projects/destroy_service_spec.rb
- ee/spec/services/projects/group_links/destroy_service_spec.rb
- ee/spec/services/projects/update_service_spec.rb
@@ -124,7 +122,6 @@ RSpec/AnyInstanceOf:
- 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
- - ee/spec/workers/geo/file_download_dispatch_worker_spec.rb
- ee/spec/workers/geo/registry_sync_worker_spec.rb
- ee/spec/workers/geo/repository_cleanup_worker_spec.rb
- ee/spec/workers/geo/repository_shard_sync_worker_spec.rb
@@ -164,7 +161,6 @@ RSpec/AnyInstanceOf:
- spec/controllers/snippets/notes_controller_spec.rb
- spec/controllers/snippets_controller_spec.rb
- spec/features/admin/admin_mode/login_spec.rb
- - spec/features/groups/clusters/eks_spec.rb
- spec/features/groups/members/tabs_spec.rb
- spec/features/ide/static_object_external_storage_csp_spec.rb
- spec/features/issuables/issuable_list_spec.rb
@@ -231,11 +227,9 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb
- - spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb
- spec/lib/gitlab/ci/templates/npm_spec.rb
- - spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_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
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
new file mode 100644
index 00000000000..8734fca753f
--- /dev/null
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -0,0 +1,3925 @@
+---
+RSpec/ContextWording:
+ # Offense count: 18360
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'ee/spec/controllers/admin/audit_logs_controller_spec.rb'
+ - 'ee/spec/controllers/admin/dev_ops_report_controller_spec.rb'
+ - 'ee/spec/controllers/admin/emails_controller_spec.rb'
+ - 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/admin/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/admin/users_controller_spec.rb'
+ - 'ee/spec/controllers/autocomplete_controller_spec.rb'
+ - 'ee/spec/controllers/boards/lists_controller_spec.rb'
+ - 'ee/spec/controllers/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/ee/dashboard/projects_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups/variables_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/profiles/preferences_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/jobs_controller_spec.rb'
+ - 'ee/spec/controllers/ee/projects/merge_requests/content_controller_spec.rb'
+ - 'ee/spec/controllers/ee/registrations_controller_spec.rb'
+ - 'ee/spec/controllers/ee/root_controller_spec.rb'
+ - 'ee/spec/controllers/ee/search_controller_spec.rb'
+ - 'ee/spec/controllers/ee/sent_notifications_controller_spec.rb'
+ - 'ee/spec/controllers/ee/sessions_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/cycle_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/groups/billings_controller_spec.rb'
+ - 'ee/spec/controllers/groups/boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_boards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics/notes_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'
+ - 'ee/spec/controllers/groups/hooks_controller_spec.rb'
+ - 'ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/groups/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_providers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/scim_oauth_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/compliance_dashboards_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/merge_commit_reports_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/groups/sso_controller_spec.rb'
+ - 'ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/applications_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/geo_auth_controller_spec.rb'
+ - 'ee/spec/controllers/operations_controller_spec.rb'
+ - 'ee/spec/controllers/profiles_controller_spec.rb'
+ - 'ee/spec/controllers/projects/approver_groups_controller_spec.rb'
+ - 'ee/spec/controllers/projects/approvers_controller_spec.rb'
+ - 'ee/spec/controllers/projects/audit_events_controller_spec.rb'
+ - 'ee/spec/controllers/projects/boards_controller_spec.rb'
+ - 'ee/spec/controllers/projects/branches_controller_spec.rb'
+ - 'ee/spec/controllers/projects/environments_controller_spec.rb'
+ - 'ee/spec/controllers/projects/imports_controller_spec.rb'
+ - 'ee/spec/controllers/projects/incident_management/escalation_policies_controller_spec.rb'
+ - 'ee/spec/controllers/projects/incident_management/oncall_schedules_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/integrations/zentao/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/push_rules_controller_spec.rb'
+ - 'ee/spec/controllers/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/integrations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/repository_controller_spec.rb'
+ - 'ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/company_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'ee/spec/controllers/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/controllers/security/dashboard_controller_spec.rb'
+ - 'ee/spec/controllers/security/projects_controller_spec.rb'
+ - 'ee/spec/controllers/security/vulnerabilities_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/controllers/trial_registrations_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/controllers/users_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/migration_shared_examples.rb'
+ - 'ee/spec/elastic_integration/global_search_spec.rb'
+ - 'ee/spec/features/admin/admin_audit_logs_spec.rb'
+ - 'ee/spec/features/admin/admin_credentials_inventory_spec.rb'
+ - 'ee/spec/features/admin/admin_dashboard_spec.rb'
+ - 'ee/spec/features/admin/admin_dev_ops_reports_spec.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_nodes_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_sidebar_spec.rb'
+ - 'ee/spec/features/admin/groups/admin_subscription_alerts_spec.rb'
+ - 'ee/spec/features/admin/licenses/admin_adds_license_spec.rb'
+ - 'ee/spec/features/admin/licenses/show_user_count_threshold_spec.rb'
+ - 'ee/spec/features/analytics/code_analytics_spec.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/features/boards/boards_licensed_features_spec.rb'
+ - 'ee/spec/features/boards/boards_spec.rb'
+ - 'ee/spec/features/boards/new_issue_spec.rb'
+ - 'ee/spec/features/boards/scoped_issue_board_spec.rb'
+ - 'ee/spec/features/boards/sidebar_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_drag_drop_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_labels_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_spec.rb'
+ - 'ee/spec/features/boards/swimlanes/epics_swimlanes_spec.rb'
+ - 'ee/spec/features/boards/user_visits_board_spec.rb'
+ - 'ee/spec/features/discussion_comments/epic_quick_actions_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
+ - 'ee/spec/features/epic_boards/epic_boards_spec.rb'
+ - 'ee/spec/features/epic_boards/multiple_epic_boards_spec.rb'
+ - 'ee/spec/features/epic_boards/new_epic_spec.rb'
+ - 'ee/spec/features/epics/epic_issues_spec.rb'
+ - 'ee/spec/features/epics/epics_list_spec.rb'
+ - 'ee/spec/features/epics/gfm_autocomplete_spec.rb'
+ - 'ee/spec/features/epics/issue_promotion_spec.rb'
+ - 'ee/spec/features/epics/referencing_epics_spec.rb'
+ - 'ee/spec/features/epics/update_epic_spec.rb'
+ - 'ee/spec/features/epics/user_uses_quick_actions_spec.rb'
+ - 'ee/spec/features/geo_node_spec.rb'
+ - 'ee/spec/features/google_analytics_datalayer_spec.rb'
+ - 'ee/spec/features/groups/active_tabs_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb'
+ - 'ee/spec/features/groups/audit_events_spec.rb'
+ - 'ee/spec/features/groups/group_overview_spec.rb'
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/features/groups/group_settings_spec.rb'
+ - 'ee/spec/features/groups/groups_security_credentials_spec.rb'
+ - 'ee/spec/features/groups/issues_spec.rb'
+ - 'ee/spec/features/groups/iteration_spec.rb'
+ - 'ee/spec/features/groups/iterations/iterations_list_spec.rb'
+ - 'ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb'
+ - 'ee/spec/features/groups/iterations/user_edits_iteration_spec.rb'
+ - 'ee/spec/features/groups/ldap_group_links_spec.rb'
+ - 'ee/spec/features/groups/members/manage_groups_spec.rb'
+ - 'ee/spec/features/groups/members/manage_members_spec.rb'
+ - 'ee/spec/features/groups/push_rules_spec.rb'
+ - 'ee/spec/features/groups/saml_enforcement_spec.rb'
+ - 'ee/spec/features/groups/saml_providers_spec.rb'
+ - 'ee/spec/features/groups/seat_usage/seat_usage_spec.rb'
+ - 'ee/spec/features/groups/security/compliance_dashboards_spec.rb'
+ - 'ee/spec/features/groups/settings/user_searches_in_settings_spec.rb'
+ - 'ee/spec/features/groups/sso_spec.rb'
+ - 'ee/spec/features/groups/usage_quotas_spec.rb'
+ - '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'
+ - 'ee/spec/features/issues/form_spec.rb'
+ - 'ee/spec/features/issues/gfm_autocomplete_ee_spec.rb'
+ - 'ee/spec/features/issues/issue_sidebar_spec.rb'
+ - 'ee/spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'ee/spec/features/labels_hierarchy_spec.rb'
+ - 'ee/spec/features/markdown/markdown_spec.rb'
+ - 'ee/spec/features/markdown/metrics_spec.rb'
+ - 'ee/spec/features/merge_request/merge_request_widget_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_approves_spec.rb'
+ - 'ee/spec/features/merge_request/user_creates_merge_request_with_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_approval_rules_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_merge_request_blocking_mrs_spec.rb'
+ - 'ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_approval_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
+ - 'ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb'
+ - 'ee/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb'
+ - 'ee/spec/features/merge_request/user_sets_approvers_spec.rb'
+ - 'ee/spec/features/merge_request/user_views_blocked_merge_request_spec.rb'
+ - 'ee/spec/features/merge_requests/user_filters_by_approvers_spec.rb'
+ - 'ee/spec/features/oncall_schedules/user_creates_schedule_spec.rb'
+ - 'ee/spec/features/profiles/account_spec.rb'
+ - 'ee/spec/features/projects/active_tabs_spec.rb'
+ - 'ee/spec/features/projects/audit_events_spec.rb'
+ - 'ee/spec/features/projects/custom_projects_template_spec.rb'
+ - 'ee/spec/features/projects/issues/user_creates_issue_spec.rb'
+ - 'ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb'
+ - 'ee/spec/features/projects/iterations/iterations_list_spec.rb'
+ - 'ee/spec/features/projects/iterations/user_views_iteration_spec.rb'
+ - 'ee/spec/features/projects/jobs_spec.rb'
+ - 'ee/spec/features/projects/kerberos_clone_instructions_spec.rb'
+ - 'ee/spec/features/projects/members/invite_group_and_members_spec.rb'
+ - 'ee/spec/features/projects/members/member_leaves_project_spec.rb'
+ - 'ee/spec/features/projects/milestones/milestone_spec.rb'
+ - 'ee/spec/features/projects/new_project_from_template_spec.rb'
+ - 'ee/spec/features/projects/new_project_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/features/projects/push_rules_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_create_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_list_spec.rb'
+ - 'ee/spec/features/projects/quality/test_case_show_spec.rb'
+ - 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
+ - 'ee/spec/features/projects/security/user_views_security_configuration_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/issues_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/merge_requests_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/protected_environments_spec.rb'
+ - 'ee/spec/features/projects/settings/push_rules_settings_spec.rb'
+ - 'ee/spec/features/projects/settings/user_manages_members_spec.rb'
+ - 'ee/spec/features/projects/show_project_spec.rb'
+ - 'ee/spec/features/promotion_spec.rb'
+ - 'ee/spec/features/protected_branches_spec.rb'
+ - 'ee/spec/features/registrations/saas_user_registration_spec.rb'
+ - 'ee/spec/features/registrations/welcome_spec.rb'
+ - 'ee/spec/features/search/elastic/global_search_spec.rb'
+ - 'ee/spec/features/search/elastic/snippet_search_spec.rb'
+ - 'ee/spec/features/security/project/snippet/internal_access_spec.rb'
+ - 'ee/spec/features/security/project/snippet/public_access_spec.rb'
+ - 'ee/spec/features/signup_spec.rb'
+ - 'ee/spec/features/subscriptions/expiring_subscription_message_spec.rb'
+ - 'ee/spec/features/trial_registrations/company_information_spec.rb'
+ - '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/autocomplete/vulnerabilities_autocomplete_finder_spec.rb'
+ - 'ee/spec/finders/billed_users_finder_spec.rb'
+ - 'ee/spec/finders/clusters/environments_finder_spec.rb'
+ - 'ee/spec/finders/compliance_management/merge_requests/compliance_violations_finder_spec.rb'
+ - 'ee/spec/finders/custom_project_templates_finder_spec.rb'
+ - 'ee/spec/finders/dast/profiles_finder_spec.rb'
+ - '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'
+ - 'ee/spec/finders/ee/namespaces/projects_finder_spec.rb'
+ - 'ee/spec/finders/ee/projects_finder_spec.rb'
+ - 'ee/spec/finders/ee/user_recent_events_finder_spec.rb'
+ - 'ee/spec/finders/epics_finder_spec.rb'
+ - 'ee/spec/finders/geo_node_finder_spec.rb'
+ - 'ee/spec/finders/group_projects_finder_spec.rb'
+ - '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/issues_finder_spec.rb'
+ - 'ee/spec/finders/iterations/cadences_finder_spec.rb'
+ - 'ee/spec/finders/iterations_finder_spec.rb'
+ - 'ee/spec/finders/license_template_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests/by_approvers_finder_spec.rb'
+ - 'ee/spec/finders/merge_requests_finder_spec.rb'
+ - 'ee/spec/finders/productivity_analytics_finder_spec.rb'
+ - 'ee/spec/finders/scim_finder_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/training_providers/base_url_finder_spec.rb'
+ - 'ee/spec/finders/security/training_urls_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'ee/spec/finders/software_license_policies_finder_spec.rb'
+ - 'ee/spec/finders/status_page/incidents_finder_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/dast_profiles.rb'
+ - 'ee/spec/frontend/fixtures/on_demand_dast_scans.rb'
+ - 'ee/spec/frontend/fixtures/projects.rb'
+ - 'ee/spec/frontend/fixtures/search.rb'
+ - 'ee/spec/graphql/ee/resolvers/board_list_issues_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/types/projects/service_type_enum_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/create_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/update_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_lists/update_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/escalation_policy/update_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_rotation/destroy_spec.rb'
+ - '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/destroy_spec.rb'
+ - 'ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/create_spec.rb'
+ - 'ee/spec/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/graphql/mutations/projects/set_compliance_framework_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/graphql/resolvers/admin/cloud_licenses/subscription_future_entries_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/analytics/devops_adoption/enabled_namespaces_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/boards/board_list_epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/compliance_management/merge_requests/compliance_violation_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/incident_management/oncall_schedule_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/instance_security_dashboard/projects_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations/cadences_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/iterations_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/path_locks_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/requirements_management/requirements_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_report_summary_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb'
+ - 'ee/spec/graphql/types/global_id_type_spec.rb'
+ - 'ee/spec/graphql/types/incident_management/escalation_rule_input_type_spec.rb'
+ - 'ee/spec/graphql/types/issue_type_spec.rb'
+ - 'ee/spec/graphql/types/project_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_request_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_response_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerability_type_spec.rb'
+ - 'ee/spec/helpers/application_helper_spec.rb'
+ - 'ee/spec/helpers/boards_helper_spec.rb'
+ - 'ee/spec/helpers/compliance_management/compliance_framework/group_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/application_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/auth_helper_spec.rb'
+ - 'ee/spec/helpers/ee/dashboard_helper_spec.rb'
+ - 'ee/spec/helpers/ee/environments_helper_spec.rb'
+ - 'ee/spec/helpers/ee/events_helper_spec.rb'
+ - 'ee/spec/helpers/ee/gitlab_routing_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issuables_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issues_helper_spec.rb'
+ - 'ee/spec/helpers/ee/learn_gitlab_helper_spec.rb'
+ - 'ee/spec/helpers/ee/lock_helper_spec.rb'
+ - 'ee/spec/helpers/ee/namespaces_helper_spec.rb'
+ - 'ee/spec/helpers/ee/operations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb'
+ - 'ee/spec/helpers/ee/projects/security/api_fuzzing_configuration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/system_note_helper_spec.rb'
+ - 'ee/spec/helpers/ee/version_check_helper_spec.rb'
+ - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
+ - 'ee/spec/helpers/groups/security_features_helper_spec.rb'
+ - 'ee/spec/helpers/license_helper_spec.rb'
+ - 'ee/spec/helpers/license_monitoring_helper_spec.rb'
+ - 'ee/spec/helpers/notes_helper_spec.rb'
+ - 'ee/spec/helpers/paid_feature_callout_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/helpers/roadmaps_helper_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/helpers/timeboxes_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/initializers/1_settings_spec.rb'
+ - 'ee/spec/initializers/database_config_spec.rb'
+ - 'ee/spec/initializers/session_store_spec.rb'
+ - 'ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb'
+ - 'ee/spec/lib/analytics/refresh_comments_data_spec.rb'
+ - 'ee/spec/lib/audit/details_spec.rb'
+ - 'ee/spec/lib/audit/group_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
+ - 'ee/spec/lib/banzai/reference_parser/iteration_parser_spec.rb'
+ - 'ee/spec/lib/container_registry/client_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/analytics/group_activity_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/billable_member_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/geo_node_status_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/project_spec.rb'
+ - 'ee/spec/lib/ee/api/entities/user_with_admin_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers/variables_helpers_spec.rb'
+ - 'ee/spec/lib/ee/api/helpers_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/groups_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rule_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/commit_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config/entry/needs_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/templates/templates_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/cleanup/orphan_job_artifact_files_batch_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/cleanup/orphan_job_artifact_files_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/database_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/gon_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/group_search_results_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/group_member_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ip_restriction/enforcer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/issuable_metadata_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/metrics/samplers/database_sampler_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/omniauth_initializer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/prometheus/metric_group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/repo_path_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage/service_ping_report_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_class_proxy_spec.rb'
+ - 'ee/spec/lib/elastic/multi_version_instance_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/lead_time_for_changes_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/summary/lead_time_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/gma_membership_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/group_lookup_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/identity_linker_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/sso_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/token_actor_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/adapter_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/ldap_certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/san_extension_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'ee/spec/lib/gitlab/cache_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/runners_availability_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/pipeline/chain/create_cross_database_associations_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/dependency_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/browser_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb'
+ - '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_security_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_latest_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_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/license_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_iac_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'ee/spec/lib/gitlab/cidr_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/entry_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/file_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/groups_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/loader_spec.rb'
+ - 'ee/spec/lib/gitlab/code_owners/users_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/com_spec.rb'
+ - 'ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/custom_file_templates_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/client_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/group_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/project_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/snippet_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/expiring_subscription_message_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/cron_manager_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/geo_node_status_check_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/jwt_request_decoder_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
+ - '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'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'ee/spec/lib/gitlab/gl_repository/identifier_spec.rb'
+ - '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/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'
+ - 'ee/spec/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/group_and_descendants_repo_restorer_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/group_and_descendants_repo_saver_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/project_insights_config_spec.rb'
+ - 'ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb'
+ - 'ee/spec/lib/gitlab/pagination_delegate_spec.rb'
+ - 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'ee/spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/search/aggregation_parser_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/url_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/slash_commands/presenters/issue_show_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_client_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_multipart_upload_spec.rb'
+ - 'ee/spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb'
+ - 'ee/spec/lib/gitlab/tracking/standard_context_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/build_type_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/distribution_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/lucene_version_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/version_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage_data_counters/epic_activity_unique_counter_spec.rb'
+ - 'ee/spec/lib/incident_management/oncall_shift_generator_spec.rb'
+ - 'ee/spec/lib/omni_auth/strategies/group_saml_spec.rb'
+ - 'ee/spec/lib/system_check/app/search_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/lib/system_check/rake_task/geo_task_spec.rb'
+ - 'ee/spec/mailers/ee/emails/issues_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/migrations/schedule_requirements_migration_spec.rb'
+ - 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
+ - 'ee/spec/models/alert_management/alert_payload_field_spec.rb'
+ - 'ee/spec/models/allowed_email_domain_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_merge_request_rule_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/board_spec.rb'
+ - 'ee/spec/models/boards/epic_board_position_spec.rb'
+ - 'ee/spec/models/broadcast_message_spec.rb'
+ - 'ee/spec/models/ci/build_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/pipeline_spec.rb'
+ - 'ee/spec/models/ci/sources/project_spec.rb'
+ - 'ee/spec/models/ci/subscriptions/project_spec.rb'
+ - 'ee/spec/models/compliance_management/framework_spec.rb'
+ - 'ee/spec/models/concerns/approval_rule_like_spec.rb'
+ - 'ee/spec/models/concerns/approver_migrate_hook_spec.rb'
+ - 'ee/spec/models/concerns/deprecated_approvals_before_merge_spec.rb'
+ - 'ee/spec/models/concerns/ee/issuable_spec.rb'
+ - 'ee/spec/models/concerns/ee/milestoneable_spec.rb'
+ - 'ee/spec/models/concerns/ee/participable_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/concerns/elastic/project_spec.rb'
+ - 'ee/spec/models/concerns/elastic/repository_spec.rb'
+ - 'ee/spec/models/concerns/epic_tree_sorting_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/container_registry/event_spec.rb'
+ - 'ee/spec/models/container_repository_spec.rb'
+ - 'ee/spec/models/dast/profiles_pipeline_spec.rb'
+ - 'ee/spec/models/dast_scanner_profile_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/dast_site_validation_spec.rb'
+ - 'ee/spec/models/deployment_spec.rb'
+ - 'ee/spec/models/dora/change_failure_rate_metric_spec.rb'
+ - 'ee/spec/models/dora/time_to_restore_service_metric_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/ee/award_emoji_spec.rb'
+ - 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
+ - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
+ - 'ee/spec/models/ee/ci/runner_spec.rb'
+ - 'ee/spec/models/ee/event_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/incident_management/project_incident_management_setting_spec.rb'
+ - 'ee/spec/models/ee/integrations/jira_spec.rb'
+ - 'ee/spec/models/ee/iteration_spec.rb'
+ - 'ee/spec/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/models/ee/key_spec.rb'
+ - 'ee/spec/models/ee/merge_request_diff_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
+ - 'ee/spec/models/ee/namespace_ci_cd_setting_spec.rb'
+ - 'ee/spec/models/ee/namespace_limit_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/notification_setting_spec.rb'
+ - 'ee/spec/models/ee/personal_access_token_spec.rb'
+ - 'ee/spec/models/ee/project_group_link_spec.rb'
+ - 'ee/spec/models/ee/protected_branch_spec.rb'
+ - 'ee/spec/models/ee/protected_ref_spec.rb'
+ - 'ee/spec/models/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/environment_spec.rb'
+ - 'ee/spec/models/epic_issue_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/geo/container_repository_registry_spec.rb'
+ - 'ee/spec/models/geo/design_registry_spec.rb'
+ - 'ee/spec/models/geo/job_artifact_registry_spec.rb'
+ - 'ee/spec/models/geo/project_registry_spec.rb'
+ - 'ee/spec/models/geo/secondary_usage_data_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/geo_node_status_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/gitlab_subscriptions/features_spec.rb'
+ - 'ee/spec/models/group_member_spec.rb'
+ - 'ee/spec/models/group_wiki_repository_spec.rb'
+ - 'ee/spec/models/group_wiki_spec.rb'
+ - 'ee/spec/models/incident_management/escalation_rule_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/pending_escalations/alert_spec.rb'
+ - 'ee/spec/models/incident_management/pending_escalations/issue_spec.rb'
+ - 'ee/spec/models/integrations/github/remote_project_spec.rb'
+ - 'ee/spec/models/integrations/github_spec.rb'
+ - 'ee/spec/models/ip_restriction_spec.rb'
+ - 'ee/spec/models/issuable_metric_image_spec.rb'
+ - 'ee/spec/models/issuable_sla_spec.rb'
+ - 'ee/spec/models/issue_link_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/member_spec.rb'
+ - 'ee/spec/models/merge_request/blocking_spec.rb'
+ - 'ee/spec/models/merge_request_spec.rb'
+ - 'ee/spec/models/merge_train_spec.rb'
+ - 'ee/spec/models/namespace_setting_spec.rb'
+ - 'ee/spec/models/note_spec.rb'
+ - 'ee/spec/models/packages/package_file_spec.rb'
+ - 'ee/spec/models/path_lock_spec.rb'
+ - 'ee/spec/models/productivity_analytics_spec.rb'
+ - 'ee/spec/models/project_import_data_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_member_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/project_team_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/protected_environments/approval_summary_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/models/remote_mirror_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/requirements_management/requirement_spec.rb'
+ - 'ee/spec/models/requirements_management/test_report_spec.rb'
+ - 'ee/spec/models/saml_group_link_spec.rb'
+ - 'ee/spec/models/saml_provider_spec.rb'
+ - 'ee/spec/models/status_page/project_setting_spec.rb'
+ - 'ee/spec/models/uploads/local_spec.rb'
+ - 'ee/spec/models/vulnerabilities/export_spec.rb'
+ - 'ee/spec/models/vulnerabilities/feedback_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_pipeline_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/models/vulnerabilities/read_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/policies/app_sec/fuzzing/coverage/corpus_policy_spec.rb'
+ - 'ee/spec/policies/compliance_management/framework_policy_spec.rb'
+ - 'ee/spec/policies/ee/namespaces/user_namespace_policy_spec.rb'
+ - 'ee/spec/policies/epic_policy_spec.rb'
+ - 'ee/spec/policies/global_policy_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/identity_provider_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_rotation_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_schedule_policy_spec.rb'
+ - 'ee/spec/policies/incident_management/oncall_shift_policy_spec.rb'
+ - 'ee/spec/policies/issuable_policy_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/policies/note_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/policies/project_snippet_policy_spec.rb'
+ - 'ee/spec/policies/protected_branch_policy_spec.rb'
+ - 'ee/spec/policies/saml_provider_policy_spec.rb'
+ - 'ee/spec/policies/user_policy_spec.rb'
+ - 'ee/spec/presenters/approval_rule_presenter_spec.rb'
+ - 'ee/spec/presenters/audit_event_presenter_spec.rb'
+ - 'ee/spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'ee/spec/presenters/ee/issue_presenter_spec.rb'
+ - 'ee/spec/presenters/group_clusterable_presenter_spec.rb'
+ - 'ee/spec/presenters/merge_request_approver_presenter_spec.rb'
+ - 'ee/spec/presenters/subscription_presenter_spec.rb'
+ - 'ee/spec/requests/admin/credentials_controller_spec.rb'
+ - 'ee/spec/requests/admin/geo/replicables_controller_spec.rb'
+ - 'ee/spec/requests/api/analytics/group_activity_analytics_spec.rb'
+ - 'ee/spec/requests/api/audit_events_spec.rb'
+ - 'ee/spec/requests/api/award_emoji_spec.rb'
+ - 'ee/spec/requests/api/boards_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/requests/api/ci/pipelines_spec.rb'
+ - 'ee/spec/requests/api/ci/runner_spec.rb'
+ - 'ee/spec/requests/api/ci/triggers_spec.rb'
+ - 'ee/spec/requests/api/commits_spec.rb'
+ - 'ee/spec/requests/api/deployments_spec.rb'
+ - 'ee/spec/requests/api/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/epic_links_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/experiments_spec.rb'
+ - 'ee/spec/requests/api/geo_nodes_spec.rb'
+ - 'ee/spec/requests/api/geo_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/epic_boards_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/epics/epic_resolver_spec.rb'
+ - 'ee/spec/requests/api/graphql/geo/geo_node_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_aggregate_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/instance_security_dashboard_spec.rb'
+ - 'ee/spec/requests/api/graphql/iteration_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/cadences_spec.rb'
+ - 'ee/spec/requests/api/graphql/iterations/iterations_spec.rb'
+ - 'ee/spec/requests/api/graphql/milestone_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/escalation_policy/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/assign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/unassign_security_policy_project_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/code_coverage_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/escalation_policies_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_participants_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/incident_management/oncall_shifts_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/issues_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/path_locks_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
+ - 'ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb'
+ - 'ee/spec/requests/api/graphql/vulnerabilities/sort_spec.rb'
+ - 'ee/spec/requests/api/group_clusters_spec.rb'
+ - 'ee/spec/requests/api/group_hooks_spec.rb'
+ - 'ee/spec/requests/api/group_push_rule_spec.rb'
+ - 'ee/spec/requests/api/group_variables_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/iterations_spec.rb'
+ - 'ee/spec/requests/api/ldap_group_links_spec.rb'
+ - 'ee/spec/requests/api/managed_licenses_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_rules_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approval_settings_spec.rb'
+ - 'ee/spec/requests/api/merge_request_approvals_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/namespaces_spec.rb'
+ - 'ee/spec/requests/api/project_aliases_spec.rb'
+ - 'ee/spec/requests/api/project_approval_rules_spec.rb'
+ - 'ee/spec/requests/api/project_approval_settings_spec.rb'
+ - 'ee/spec/requests/api/project_approvals_spec.rb'
+ - 'ee/spec/requests/api/project_clusters_spec.rb'
+ - 'ee/spec/requests/api/project_import_spec.rb'
+ - 'ee/spec/requests/api/project_mirror_spec.rb'
+ - 'ee/spec/requests/api/project_push_rule_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/protected_branches_spec.rb'
+ - 'ee/spec/requests/api/releases_spec.rb'
+ - 'ee/spec/requests/api/scim_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/requests/api/settings_spec.rb'
+ - 'ee/spec/requests/api/status_checks_spec.rb'
+ - 'ee/spec/requests/api/users_spec.rb'
+ - 'ee/spec/requests/api/v3/github_spec.rb'
+ - 'ee/spec/requests/api/visual_review_discussions_spec.rb'
+ - 'ee/spec/requests/api/vulnerabilities_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_exports_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/groups/group_members_controller_spec.rb'
+ - 'ee/spec/requests/groups/roadmap_controller_spec.rb'
+ - 'ee/spec/requests/groups/security/credentials_controller_spec.rb'
+ - 'ee/spec/requests/groups/usage_quotas_spec.rb'
+ - 'ee/spec/requests/groups_controller_spec.rb'
+ - 'ee/spec/requests/jwt_controller_spec.rb'
+ - 'ee/spec/requests/lfs_http_spec.rb'
+ - 'ee/spec/requests/projects/analytics/code_reviews_controller_spec.rb'
+ - 'ee/spec/requests/projects/on_demand_scans_controller_spec.rb'
+ - 'ee/spec/requests/projects/requirements_management/requirements_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/corpus_management_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_configuration_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_scanner_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/dast_site_profiles_controller_spec.rb'
+ - 'ee/spec/requests/projects/security/scanned_resources_controller_spec.rb'
+ - 'ee/spec/requests/rack_attack_spec.rb'
+ - 'ee/spec/requests/repositories/git_http_controller_spec.rb'
+ - 'ee/spec/requests/search_controller_spec.rb'
+ - 'ee/spec/requests/smartcard_controller_spec.rb'
+ - 'ee/spec/routing/user_routing_spec.rb'
+ - 'ee/spec/serializers/analytics/cycle_analytics/value_stream_errors_serializer_spec.rb'
+ - 'ee/spec/serializers/blocking_merge_request_entity_spec.rb'
+ - 'ee/spec/serializers/board_serializer_spec.rb'
+ - 'ee/spec/serializers/clusters/environment_entity_spec.rb'
+ - 'ee/spec/serializers/dashboard_operations_project_entity_spec.rb'
+ - 'ee/spec/serializers/ee/blob_entity_spec.rb'
+ - 'ee/spec/serializers/ee/group_child_entity_spec.rb'
+ - 'ee/spec/serializers/ee/issue_sidebar_basic_entity_spec.rb'
+ - 'ee/spec/serializers/ee/issue_sidebar_extras_entity_spec.rb'
+ - 'ee/spec/serializers/ee/merge_request_poll_cached_widget_entity_spec.rb'
+ - 'ee/spec/serializers/ee/user_serializer_spec.rb'
+ - 'ee/spec/serializers/environment_entity_spec.rb'
+ - 'ee/spec/serializers/epic_note_entity_spec.rb'
+ - 'ee/spec/serializers/issue_serializer_spec.rb'
+ - 'ee/spec/serializers/member_entity_spec.rb'
+ - 'ee/spec/serializers/member_user_entity_spec.rb'
+ - 'ee/spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'ee/spec/serializers/project_mirror_entity_spec.rb'
+ - 'ee/spec/serializers/service_field_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/finding_entity_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/stages/delete_service_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/value_streams/update_service_spec.rb'
+ - 'ee/spec/services/analytics/devops_adoption/enabled_namespaces/create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/builds/associate_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/create_associations_service_spec.rb'
+ - 'ee/spec/services/application_settings/update_service_spec.rb'
+ - 'ee/spec/services/approval_rules/create_service_spec.rb'
+ - 'ee/spec/services/approval_rules/merge_request_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/approval_rules/params_filtering_service_spec.rb'
+ - 'ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/approval_rules/update_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
+ - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/runners_token_audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/unregister_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/award_emojis/add_service_spec.rb'
+ - 'ee/spec/services/boards/create_service_spec.rb'
+ - 'ee/spec/services/boards/epic_boards/create_service_spec.rb'
+ - 'ee/spec/services/boards/epics/move_service_spec.rb'
+ - 'ee/spec/services/boards/epics/position_create_service_spec.rb'
+ - 'ee/spec/services/boards/lists/update_service_spec.rb'
+ - 'ee/spec/services/ci/copy_cross_database_associations_service_spec.rb'
+ - 'ee/spec/services/ci/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/update_project_and_namespace_usage_service_spec.rb'
+ - 'ee/spec/services/ci/process_build_service_spec.rb'
+ - 'ee/spec/services/ci/register_job_service_spec.rb'
+ - 'ee/spec/services/ci/retry_job_service_spec.rb'
+ - 'ee/spec/services/ci/runners/unregister_runner_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/ci_cd/setup_project_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/create_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/update_service_spec.rb'
+ - 'ee/spec/services/compliance_management/merge_requests/create_compliance_violations_service_spec.rb'
+ - 'ee/spec/services/dashboard/projects/list_service_spec.rb'
+ - 'ee/spec/services/deployments/approval_service_spec.rb'
+ - 'ee/spec/services/dora/aggregate_metrics_service_spec.rb'
+ - 'ee/spec/services/ee/alert_management/alerts/update_service_spec.rb'
+ - 'ee/spec/services/ee/allowed_email_domains/update_service_spec.rb'
+ - 'ee/spec/services/ee/auth/container_registry_authentication_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/list_service_spec.rb'
+ - 'ee/spec/services/ee/boards/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/boards/lists/create_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/ee/issues/create_service_spec.rb'
+ - 'ee/spec/services/ee/issues/move_service_spec.rb'
+ - 'ee/spec/services/ee/issues/reopen_service_spec.rb'
+ - 'ee/spec/services/ee/issues/update_service_spec.rb'
+ - 'ee/spec/services/ee/labels/create_service_spec.rb'
+ - 'ee/spec/services/ee/members/create_service_spec.rb'
+ - 'ee/spec/services/ee/members/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/members/invite_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/base_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/create_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/post_merge_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/refresh_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_assignees_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'ee/spec/services/ee/namespace_settings/update_service_spec.rb'
+ - 'ee/spec/services/ee/notes/create_service_spec.rb'
+ - 'ee/spec/services/ee/notes/post_process_service_spec.rb'
+ - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
+ - 'ee/spec/services/ee/notes/update_service_spec.rb'
+ - 'ee/spec/services/ee/notification_service_spec.rb'
+ - 'ee/spec/services/ee/personal_access_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/ee/preview_markdown_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb'
+ - 'ee/spec/services/ee/users/reject_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb'
+ - 'ee/spec/services/elastic/cluster_reindexing_service_spec.rb'
+ - 'ee/spec/services/elastic/data_migration_service_spec.rb'
+ - 'ee/spec/services/elastic/indexing_control_service_spec.rb'
+ - 'ee/spec/services/elastic/process_bookkeeping_service_spec.rb'
+ - 'ee/spec/services/epic_issues/destroy_service_spec.rb'
+ - 'ee/spec/services/epic_issues/list_service_spec.rb'
+ - 'ee/spec/services/epic_issues/update_service_spec.rb'
+ - 'ee/spec/services/epics/create_service_spec.rb'
+ - 'ee/spec/services/epics/epic_links/list_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/related_epic_links/destroy_service_spec.rb'
+ - 'ee/spec/services/epics/update_dates_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/create_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/dispatch_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/geo/node_update_service_spec.rb'
+ - 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
+ - 'ee/spec/services/geo/prune_event_log_service_spec.rb'
+ - 'ee/spec/services/geo/rename_repository_service_spec.rb'
+ - 'ee/spec/services/geo/repository_created_event_store_spec.rb'
+ - 'ee/spec/services/geo/repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_reset_spec.rb'
+ - 'ee/spec/services/geo/repository_verification_secondary_service_spec.rb'
+ - 'ee/spec/services/geo/wiki_sync_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/extend_reactivate_trial_service_spec.rb'
+ - 'ee/spec/services/group_saml/group_managed_accounts/clean_up_members_service_spec.rb'
+ - 'ee/spec/services/group_saml/group_managed_accounts/transfer_membership_service_spec.rb'
+ - 'ee/spec/services/groups/create_service_spec.rb'
+ - 'ee/spec/services/groups/destroy_service_spec.rb'
+ - 'ee/spec/services/groups/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/groups/restore_service_spec.rb'
+ - 'ee/spec/services/groups/sync_service_spec.rb'
+ - 'ee/spec/services/groups/update_service_spec.rb'
+ - 'ee/spec/services/historical_user_data/csv_service_spec.rb'
+ - 'ee/spec/services/ide/schemas_config_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/incidents/create_sla_service_spec.rb'
+ - 'ee/spec/services/incident_management/incidents/upload_metric_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/remove_participant_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/pending_escalations/process_service_spec.rb'
+ - 'ee/spec/services/issues/build_service_spec.rb'
+ - 'ee/spec/services/issues/export_csv_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_service_spec.rb'
+ - 'ee/spec/services/iterations/create_service_spec.rb'
+ - 'ee/spec/services/iterations/update_service_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/ldap_group_reset_service_spec.rb'
+ - 'ee/spec/services/members/activate_service_spec.rb'
+ - 'ee/spec/services/merge_commits/export_csv_service_spec.rb'
+ - 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
+ - 'ee/spec/services/merge_requests/approval_service_spec.rb'
+ - 'ee/spec/services/merge_requests/build_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
+ - 'ee/spec/services/projects/alerting/notify_service_spec.rb'
+ - 'ee/spec/services/projects/create_from_template_service_spec.rb'
+ - 'ee/spec/services/projects/create_service_spec.rb'
+ - 'ee/spec/services/projects/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/gitlab_projects_import_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/create_service_spec.rb'
+ - 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
+ - 'ee/spec/services/projects/import_export/export_service_spec.rb'
+ - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/projects/operations/update_service_spec.rb'
+ - 'ee/spec/services/projects/protect_default_branch_service_spec.rb'
+ - 'ee/spec/services/projects/restore_service_spec.rb'
+ - 'ee/spec/services/projects/slack_application_install_service_spec.rb'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/projects/update_mirror_service_spec.rb'
+ - 'ee/spec/services/projects/update_service_spec.rb'
+ - 'ee/spec/services/protected_environments/create_service_spec.rb'
+ - 'ee/spec/services/protected_environments/update_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/export_csv_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/search/global_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/search/snippet_service_spec.rb'
+ - 'ee/spec/services/search_service_spec.rb'
+ - 'ee/spec/services/security/dependency_list_service_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/assign_service_spec.rb'
+ - 'ee/spec/services/security/orchestration/unassign_service_spec.rb'
+ - 'ee/spec/services/security/report_summary_service_spec.rb'
+ - 'ee/spec/services/security/scanned_resources_counting_service_spec.rb'
+ - 'ee/spec/services/security/scanned_resources_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/create_pipeline_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_commit_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/process_policy_service_spec.rb'
+ - 'ee/spec/services/security/store_grouped_scans_service_spec.rb'
+ - 'ee/spec/services/security/track_scan_service_spec.rb'
+ - 'ee/spec/services/security/vulnerability_counting_service_spec.rb'
+ - 'ee/spec/services/slash_commands/global_slack_handler_spec.rb'
+ - 'ee/spec/services/software_license_policies/update_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_attachments_service_spec.rb'
+ - 'ee/spec/services/status_page/publish_details_service_spec.rb'
+ - 'ee/spec/services/status_page/trigger_publish_service_spec.rb'
+ - 'ee/spec/services/system_notes/epics_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/services/upcoming_reconciliations/update_service_spec.rb'
+ - 'ee/spec/services/user_permissions/export_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/create_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/historical_statistics/deletion_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/export_service_spec.rb'
+ - 'ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb'
+ - 'ee/spec/support/features/manual_quarterly_co_term_banner_examples.rb'
+ - 'ee/spec/support/features/manual_renewal_banner_examples.rb'
+ - 'ee/spec/support/protected_tags/access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_contexts/audit_event_not_licensed_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/audit_event_queue_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/epic_aggregate_constants.rb'
+ - 'ee/spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/gitlab_team_member_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/graphql/resolvers/security_orchestration/resolves_orchestration_policy_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/lib/gitlab/insights/reducers/reducers_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/push_rules_checks_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/requests/api/members_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/status_page/status_page_enabled_context.rb'
+ - 'ee/spec/support/shared_contexts/status_page/status_page_list_objects.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/analytics/issues_analytics/shared_issues_analytics_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/boards_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/cluster_metrics_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/concerns/description_diff_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/groups_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/controllers/security/application_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/credentials_inventory_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/insights_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/ultimate_trial_callout_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/epics/permission_check_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/update_health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/git_access_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/allowlisted_admin_geo_requests_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/maintenance_mode_gitlab_ee_instance_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_ee_instance_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/smartcard_certificate_store_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/issuable_links_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_batcher_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_framework_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/protected_environments/authorizable_examples.rb'
+ - 'ee/spec/support/shared_examples/quick_actions/issue/status_page_quick_actions_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/credentials_inventory_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/security/security_dashboard_json_endpoint_shared_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'
+ - 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/merge_merge_requests_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/scoped_label_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_notes_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/search_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/update_issuable_health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/views/registration_features_prompt_settings_link_shared_examples.rb'
+ - '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'
+ - 'ee/spec/views/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/views/groups/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_push_rules_link.html.haml_spec.rb'
+ - 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb'
+ - 'ee/spec/views/projects/edit.html.haml_spec.rb'
+ - 'ee/spec/views/projects/issues/show.html.haml_spec.rb'
+ - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/groups/new.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/projects/new.html.haml_spec.rb'
+ - 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
+ - 'ee/spec/views/search/_category.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_mirror_update_button.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/gpg_keys/_gpg_key.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/ssh_keys/_ssh_key.html.haml_spec.rb'
+ - 'ee/spec/views/shared/issuable/_sidebar.html.haml_spec.rb'
+ - 'ee/spec/views/shared/labels/_create_label_help_text.html.haml_spec.rb'
+ - 'ee/spec/views/shared/promotions/_promotion_link_project.html.haml_spec.rb'
+ - 'ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/workers/active_user_count_threshold_worker_spec.rb'
+ - 'ee/spec/workers/adjourned_projects_deletion_cron_worker_spec.rb'
+ - 'ee/spec/workers/admin_emails_worker_spec.rb'
+ - 'ee/spec/workers/analytics/code_review_metrics_worker_spec.rb'
+ - 'ee/spec/workers/audit_events/audit_event_streaming_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/refresh_cached_data_worker_spec.rb'
+ - 'ee/spec/workers/ci/minutes/update_project_and_namespace_usage_worker_spec.rb'
+ - 'ee/spec/workers/ci/runners/stale_group_runners_prune_cron_worker_spec.rb'
+ - 'ee/spec/workers/ci/upstream_projects_subscriptions_cleanup_worker_spec.rb'
+ - 'ee/spec/workers/compliance_management/merge_requests/compliance_violations_worker_spec.rb'
+ - 'ee/spec/workers/ee/repository_check/batch_worker_spec.rb'
+ - 'ee/spec/workers/ee/repository_check/single_repository_worker_spec.rb'
+ - 'ee/spec/workers/elastic/migration_worker_spec.rb'
+ - 'ee/spec/workers/elastic_association_indexer_worker_spec.rb'
+ - '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'
+ - 'ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_timeout_worker_spec.rb'
+ - 'ee/spec/workers/incident_management/apply_incident_sla_exceeded_label_worker_spec.rb'
+ - 'ee/spec/workers/incident_management/oncall_rotations/persist_shifts_job_spec.rb'
+ - 'ee/spec/workers/iterations/cadences/schedule_create_iterations_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/new_epic_worker_spec.rb'
+ - 'ee/spec/workers/personal_access_tokens/groups/policy_worker_spec.rb'
+ - 'ee/spec/workers/personal_access_tokens/instance/policy_worker_spec.rb'
+ - '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'
+ - 'ee/spec/workers/sync_seat_link_worker_spec.rb'
+ - 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
+ - 'ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/project_access_token_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/automatic_failover_and_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/backend_node_recovery_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/gitaly_mtls_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_connectivity_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_dataloss_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/2fa_ssh_recovery_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_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/user/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/add_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/archive_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/design_management/modify_design_content_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_creation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_content_manipulation_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_directory_management_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_list_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/wiki/project_based_page_deletion_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/mr_event_rule_pipeline_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_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/purchase_ci_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/purchase_storage_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/security_reports_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_2_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/insights/default_insights_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_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/wiki/create_group_wiki_page_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/4_verify/new_discussion_not_dropping_merge_trains_mr_spec.rb'
+ - 'qa/spec/git/repository_spec.rb'
+ - 'qa/spec/page/element_spec.rb'
+ - 'qa/spec/service/docker_run/gitlab_runner_spec.rb'
+ - 'qa/spec/service/docker_run/k3s_spec.rb'
+ - 'qa/spec/specs/helpers/context_selector_spec.rb'
+ - 'qa/spec/specs/helpers/feature_flag_spec.rb'
+ - 'qa/spec/specs/helpers/quarantine_spec.rb'
+ - 'qa/spec/specs/runner_spec.rb'
+ - 'qa/spec/support/loglinking_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/bin/feature_flag_spec.rb'
+ - 'spec/commands/sidekiq_cluster/cli_spec.rb'
+ - 'spec/components/diffs/overflow_warning_component_spec.rb'
+ - 'spec/components/pajamas/alert_component_spec.rb'
+ - 'spec/config/object_store_settings_spec.rb'
+ - 'spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'spec/controllers/admin/clusters_controller_spec.rb'
+ - 'spec/controllers/admin/dev_ops_report_controller_spec.rb'
+ - 'spec/controllers/admin/impersonations_controller_spec.rb'
+ - 'spec/controllers/admin/instance_review_controller_spec.rb'
+ - 'spec/controllers/admin/integrations_controller_spec.rb'
+ - 'spec/controllers/admin/runner_projects_controller_spec.rb'
+ - 'spec/controllers/admin/sessions_controller_spec.rb'
+ - 'spec/controllers/admin/topics_controller_spec.rb'
+ - 'spec/controllers/admin/users_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/autocomplete_controller_spec.rb'
+ - 'spec/controllers/boards/issues_controller_spec.rb'
+ - 'spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb'
+ - 'spec/controllers/concerns/enforces_admin_authentication_spec.rb'
+ - 'spec/controllers/concerns/graceful_timeout_handling_spec.rb'
+ - 'spec/controllers/concerns/group_tree_spec.rb'
+ - 'spec/controllers/concerns/import_url_params_spec.rb'
+ - 'spec/controllers/concerns/issuable_collections_spec.rb'
+ - 'spec/controllers/concerns/metrics_dashboard_spec.rb'
+ - 'spec/controllers/concerns/renders_commits_spec.rb'
+ - 'spec/controllers/concerns/send_file_upload_spec.rb'
+ - 'spec/controllers/confirmations_controller_spec.rb'
+ - 'spec/controllers/dashboard/milestones_controller_spec.rb'
+ - 'spec/controllers/dashboard/projects_controller_spec.rb'
+ - 'spec/controllers/dashboard/todos_controller_spec.rb'
+ - 'spec/controllers/dashboard_controller_spec.rb'
+ - 'spec/controllers/every_controller_spec.rb'
+ - 'spec/controllers/explore/groups_controller_spec.rb'
+ - 'spec/controllers/explore/projects_controller_spec.rb'
+ - 'spec/controllers/google_api/authorizations_controller_spec.rb'
+ - 'spec/controllers/groups/children_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_auth_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/groups/group_members_controller_spec.rb'
+ - 'spec/controllers/groups/labels_controller_spec.rb'
+ - 'spec/controllers/groups/milestones_controller_spec.rb'
+ - 'spec/controllers/groups/packages_controller_spec.rb'
+ - 'spec/controllers/groups/registry/repositories_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/groups/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/groups/settings/integrations_controller_spec.rb'
+ - 'spec/controllers/groups/settings/repository_controller_spec.rb'
+ - 'spec/controllers/groups/uploads_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/help_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/controllers/import/bulk_imports_controller_spec.rb'
+ - 'spec/controllers/import/fogbugz_controller_spec.rb'
+ - 'spec/controllers/import/github_controller_spec.rb'
+ - 'spec/controllers/import/gitlab_controller_spec.rb'
+ - 'spec/controllers/jira_connect/events_controller_spec.rb'
+ - 'spec/controllers/jira_connect/subscriptions_controller_spec.rb'
+ - 'spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/metrics_controller_spec.rb'
+ - 'spec/controllers/oauth/applications_controller_spec.rb'
+ - 'spec/controllers/oauth/authorizations_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/passwords_controller_spec.rb'
+ - 'spec/controllers/profiles/emails_controller_spec.rb'
+ - 'spec/controllers/profiles/notifications_controller_spec.rb'
+ - 'spec/controllers/profiles/preferences_controller_spec.rb'
+ - 'spec/controllers/profiles/two_factor_auths_controller_spec.rb'
+ - 'spec/controllers/projects/alerting/notifications_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/badges_controller_spec.rb'
+ - 'spec/controllers/projects/blame_controller_spec.rb'
+ - 'spec/controllers/projects/blob_controller_spec.rb'
+ - 'spec/controllers/projects/boards_controller_spec.rb'
+ - 'spec/controllers/projects/branches_controller_spec.rb'
+ - 'spec/controllers/projects/ci/lints_controller_spec.rb'
+ - 'spec/controllers/projects/ci/secure_files_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/commit_controller_spec.rb'
+ - 'spec/controllers/projects/commits_controller_spec.rb'
+ - 'spec/controllers/projects/cycle_analytics_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/deployments_controller_spec.rb'
+ - 'spec/controllers/projects/discussions_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_clients_controller_spec.rb'
+ - 'spec/controllers/projects/feature_flags_controller_spec.rb'
+ - 'spec/controllers/projects/find_file_controller_spec.rb'
+ - 'spec/controllers/projects/forks_controller_spec.rb'
+ - 'spec/controllers/projects/import/jira_controller_spec.rb'
+ - 'spec/controllers/projects/incidents_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/learn_gitlab_controller_spec.rb'
+ - 'spec/controllers/projects/mattermosts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/content_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/diffs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/milestones_controller_spec.rb'
+ - 'spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/packages/packages_controller_spec.rb'
+ - 'spec/controllers/projects/pages_controller_spec.rb'
+ - 'spec/controllers/projects/pages_domains_controller_spec.rb'
+ - 'spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/product_analytics_controller_spec.rb'
+ - 'spec/controllers/projects/project_members_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/alerts_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/metrics_controller_spec.rb'
+ - 'spec/controllers/projects/raw_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/controllers/projects/repositories_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'spec/controllers/projects/settings/repository_controller_spec.rb'
+ - 'spec/controllers/projects/snippets_controller_spec.rb'
+ - 'spec/controllers/projects/starrers_controller_spec.rb'
+ - 'spec/controllers/projects/static_site_editor_controller_spec.rb'
+ - 'spec/controllers/projects/tags_controller_spec.rb'
+ - 'spec/controllers/projects/todos_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/projects/uploads_controller_spec.rb'
+ - 'spec/controllers/projects/web_ide_terminals_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'spec/controllers/registrations_controller_spec.rb'
+ - 'spec/controllers/repositories/git_http_controller_spec.rb'
+ - 'spec/controllers/root_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/controllers/sent_notifications_controller_spec.rb'
+ - 'spec/controllers/sessions_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/controllers/snippets_controller_spec.rb'
+ - 'spec/controllers/uploads_controller_spec.rb'
+ - 'spec/controllers/users/terms_controller_spec.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/db/production/settings_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/docs_screenshots/container_registry_docs.rb'
+ - 'spec/docs_screenshots/wiki_docs.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/experiments/ios_specific_templates_experiment_spec.rb'
+ - 'spec/features/admin/admin_abuse_reports_spec.rb'
+ - 'spec/features/admin/admin_appearance_spec.rb'
+ - 'spec/features/admin/admin_disables_git_access_protocol_spec.rb'
+ - 'spec/features/admin/admin_hooks_spec.rb'
+ - 'spec/features/admin/admin_jobs_spec.rb'
+ - 'spec/features/admin/admin_mode/login_spec.rb'
+ - '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'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/atom/dashboard_issues_spec.rb'
+ - 'spec/features/atom/dashboard_spec.rb'
+ - 'spec/features/atom/issues_spec.rb'
+ - 'spec/features/atom/merge_requests_spec.rb'
+ - 'spec/features/atom/users_spec.rb'
+ - 'spec/features/boards/boards_spec.rb'
+ - 'spec/features/boards/issue_ordering_spec.rb'
+ - 'spec/features/boards/keyboard_shortcut_spec.rb'
+ - 'spec/features/boards/new_issue_spec.rb'
+ - 'spec/features/boards/reload_boards_on_browser_back_spec.rb'
+ - 'spec/features/boards/sidebar_assignee_spec.rb'
+ - 'spec/features/boards/sidebar_labels_in_namespaces_spec.rb'
+ - 'spec/features/boards/sidebar_labels_spec.rb'
+ - 'spec/features/boards/user_visits_board_spec.rb'
+ - 'spec/features/calendar_spec.rb'
+ - 'spec/features/clusters/cluster_detail_page_spec.rb'
+ - 'spec/features/clusters/cluster_health_dashboard_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/cycle_analytics_spec.rb'
+ - 'spec/features/dashboard/activity_spec.rb'
+ - 'spec/features/dashboard/datetime_on_tooltips_spec.rb'
+ - 'spec/features/dashboard/groups_list_spec.rb'
+ - 'spec/features/dashboard/issues_filter_spec.rb'
+ - 'spec/features/dashboard/label_filter_spec.rb'
+ - 'spec/features/dashboard/merge_requests_spec.rb'
+ - 'spec/features/dashboard/projects_spec.rb'
+ - 'spec/features/dashboard/shortcuts_spec.rb'
+ - 'spec/features/dashboard/snippets_spec.rb'
+ - 'spec/features/dashboard/todos/todos_filtering_spec.rb'
+ - 'spec/features/dashboard/todos/todos_sorting_spec.rb'
+ - 'spec/features/dashboard/todos/todos_spec.rb'
+ - 'spec/features/dashboard/user_filters_projects_spec.rb'
+ - 'spec/features/expand_collapse_diffs_spec.rb'
+ - 'spec/features/file_uploads/multipart_invalid_uploads_spec.rb'
+ - 'spec/features/frequently_visited_projects_and_groups_spec.rb'
+ - 'spec/features/groups/board_sidebar_spec.rb'
+ - 'spec/features/groups/board_spec.rb'
+ - 'spec/features/groups/clusters/user_spec.rb'
+ - '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'
+ - 'spec/features/groups/members/tabs_spec.rb'
+ - 'spec/features/groups/merge_requests_spec.rb'
+ - 'spec/features/groups/milestone_spec.rb'
+ - 'spec/features/groups/packages_spec.rb'
+ - 'spec/features/groups/settings/ci_cd_spec.rb'
+ - 'spec/features/groups/settings/group_badges_spec.rb'
+ - 'spec/features/groups/settings/packages_and_registries_spec.rb'
+ - 'spec/features/groups/settings/repository_spec.rb'
+ - 'spec/features/groups/settings/user_searches_in_settings_spec.rb'
+ - 'spec/features/groups/share_lock_spec.rb'
+ - 'spec/features/groups/show_spec.rb'
+ - 'spec/features/groups/user_sees_package_sidebar_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/help_pages_spec.rb'
+ - 'spec/features/ics/dashboard_issues_spec.rb'
+ - 'spec/features/ics/group_issues_spec.rb'
+ - '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'
+ - 'spec/features/issuables/sorting_list_spec.rb'
+ - 'spec/features/issuables/user_sees_sidebar_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_assignee_spec.rb'
+ - 'spec/features/issues/filtered_search/filter_issues_spec.rb'
+ - 'spec/features/issues/form_spec.rb'
+ - 'spec/features/issues/gfm_autocomplete_spec.rb'
+ - 'spec/features/issues/issue_detail_spec.rb'
+ - 'spec/features/issues/issue_header_spec.rb'
+ - 'spec/features/issues/issue_sidebar_spec.rb'
+ - 'spec/features/issues/keyboard_shortcut_spec.rb'
+ - 'spec/features/issues/move_spec.rb'
+ - 'spec/features/issues/note_polling_spec.rb'
+ - 'spec/features/issues/notes_on_issues_spec.rb'
+ - 'spec/features/issues/related_issues_spec.rb'
+ - 'spec/features/issues/service_desk_spec.rb'
+ - 'spec/features/issues/spam_akismet_issue_creation_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_labels_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - 'spec/features/issues/user_creates_confidential_merge_request_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/issues/user_interacts_with_awards_spec.rb'
+ - 'spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb'
+ - 'spec/features/issues/user_sorts_issue_comments_spec.rb'
+ - 'spec/features/issues/user_toggles_subscription_spec.rb'
+ - 'spec/features/issues/user_uses_quick_actions_spec.rb'
+ - 'spec/features/issues/user_views_issues_spec.rb'
+ - 'spec/features/labels_hierarchy_spec.rb'
+ - 'spec/features/markdown/copy_as_gfm_spec.rb'
+ - 'spec/features/markdown/keyboard_shortcuts_spec.rb'
+ - 'spec/features/markdown/markdown_spec.rb'
+ - 'spec/features/markdown/metrics_spec.rb'
+ - 'spec/features/merge_request/batch_comments_spec.rb'
+ - 'spec/features/merge_request/close_reopen_report_toggle_spec.rb'
+ - 'spec/features/merge_request/user_accepts_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_assigns_themselves_spec.rb'
+ - 'spec/features/merge_request/user_comments_on_diff_spec.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_creates_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_creates_mr_spec.rb'
+ - 'spec/features/merge_request/user_edits_mr_spec.rb'
+ - 'spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb'
+ - 'spec/features/merge_request/user_merges_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_posts_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_resolves_conflicts_spec.rb'
+ - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb'
+ - 'spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb'
+ - 'spec/features/merge_request/user_sees_closing_issues_message_spec.rb'
+ - 'spec/features/merge_request/user_sees_deployment_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_diff_spec.rb'
+ - 'spec/features/merge_request/user_sees_discussions_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_widget_spec.rb'
+ - 'spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb'
+ - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
+ - 'spec/features/merge_request/user_uses_quick_actions_spec.rb'
+ - 'spec/features/merge_request/user_views_open_merge_request_spec.rb'
+ - 'spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb'
+ - 'spec/features/merge_requests/filters_generic_behavior_spec.rb'
+ - 'spec/features/merge_requests/user_exports_as_csv_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_approvals_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_assignees_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_labels_spec.rb'
+ - 'spec/features/merge_requests/user_filters_by_target_branch_spec.rb'
+ - 'spec/features/merge_requests/user_lists_merge_requests_spec.rb'
+ - 'spec/features/merge_requests/user_mass_updates_spec.rb'
+ - 'spec/features/merge_requests/user_sees_empty_state_spec.rb'
+ - 'spec/features/milestones/user_views_milestone_spec.rb'
+ - 'spec/features/monitor_sidebar_link_spec.rb'
+ - 'spec/features/nav/top_nav_responsive_spec.rb'
+ - 'spec/features/oauth_login_spec.rb'
+ - 'spec/features/one_trust_spec.rb'
+ - 'spec/features/participants_autocomplete_spec.rb'
+ - 'spec/features/profiles/chat_names_spec.rb'
+ - 'spec/features/profiles/keys_spec.rb'
+ - 'spec/features/profiles/password_spec.rb'
+ - 'spec/features/profiles/user_edit_profile_spec.rb'
+ - 'spec/features/profiles/user_search_settings_spec.rb'
+ - 'spec/features/projects/active_tabs_spec.rb'
+ - 'spec/features/projects/activity/user_sees_design_activity_spec.rb'
+ - 'spec/features/projects/artifacts/file_spec.rb'
+ - 'spec/features/projects/artifacts/user_downloads_artifacts_spec.rb'
+ - 'spec/features/projects/blobs/blob_show_spec.rb'
+ - 'spec/features/projects/blobs/edit_spec.rb'
+ - 'spec/features/projects/branches/user_views_branches_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/features/projects/ci/lint_spec.rb'
+ - 'spec/features/projects/clusters_spec.rb'
+ - 'spec/features/projects/commit/comments/user_adds_comment_spec.rb'
+ - 'spec/features/projects/commits/multi_view_diff_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/compare_spec.rb'
+ - 'spec/features/projects/diffs/diff_show_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/environments/environments_spec.rb'
+ - 'spec/features/projects/features_visibility_spec.rb'
+ - 'spec/features/projects/files/template_selector_menu_spec.rb'
+ - 'spec/features/projects/files/template_type_dropdown_spec.rb'
+ - 'spec/features/projects/files/undo_template_spec.rb'
+ - 'spec/features/projects/files/user_creates_directory_spec.rb'
+ - 'spec/features/projects/fork_spec.rb'
+ - 'spec/features/projects/graph_spec.rb'
+ - 'spec/features/projects/import_export/export_file_spec.rb'
+ - 'spec/features/projects/infrastructure_registry_spec.rb'
+ - 'spec/features/projects/integrations/disable_triggers_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_links_to_designs_in_issue_spec.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_spec.rb'
+ - 'spec/features/projects/issues/email_participants_spec.rb'
+ - 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/labels/search_labels_spec.rb'
+ - 'spec/features/projects/labels/update_prioritization_spec.rb'
+ - 'spec/features/projects/labels/user_creates_labels_spec.rb'
+ - 'spec/features/projects/members/group_members_spec.rb'
+ - 'spec/features/projects/members/groups_with_access_list_spec.rb'
+ - 'spec/features/projects/members/manage_groups_spec.rb'
+ - 'spec/features/projects/members/manage_members_spec.rb'
+ - 'spec/features/projects/members/tabs_spec.rb'
+ - 'spec/features/projects/members/user_requests_access_spec.rb'
+ - 'spec/features/projects/merge_request_button_spec.rb'
+ - 'spec/features/projects/new_project_from_template_spec.rb'
+ - 'spec/features/projects/new_project_spec.rb'
+ - 'spec/features/projects/package_files_spec.rb'
+ - 'spec/features/projects/packages_spec.rb'
+ - 'spec/features/projects/pages/user_edits_settings_spec.rb'
+ - 'spec/features/projects/pipeline_schedules_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/projects/releases/user_views_releases_spec.rb'
+ - 'spec/features/projects/settings/lfs_settings_spec.rb'
+ - 'spec/features/projects/settings/packages_settings_spec.rb'
+ - 'spec/features/projects/settings/pipelines_settings_spec.rb'
+ - 'spec/features/projects/settings/project_badges_spec.rb'
+ - 'spec/features/projects/settings/project_settings_spec.rb'
+ - 'spec/features/projects/settings/registry_settings_spec.rb'
+ - 'spec/features/projects/settings/repository_settings_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb'
+ - 'spec/features/projects/settings/user_renames_a_project_spec.rb'
+ - 'spec/features/projects/settings/user_searches_in_settings_spec.rb'
+ - 'spec/features/projects/settings/user_transfers_a_project_spec.rb'
+ - 'spec/features/projects/settings/visibility_settings_spec.rb'
+ - 'spec/features/projects/settings/webhooks_settings_spec.rb'
+ - 'spec/features/projects/show/user_manages_notifications_spec.rb'
+ - 'spec/features/projects/show/user_sees_collaboration_links_spec.rb'
+ - 'spec/features/projects/show/user_sees_git_instructions_spec.rb'
+ - 'spec/features/projects/show/user_sees_readme_spec.rb'
+ - 'spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb'
+ - 'spec/features/projects/snippets/user_views_snippets_spec.rb'
+ - 'spec/features/projects/sourcegraph_csp_spec.rb'
+ - 'spec/features/projects/tags/user_edits_tags_spec.rb'
+ - 'spec/features/projects/tags/user_views_tags_spec.rb'
+ - 'spec/features/projects/tree/tree_show_spec.rb'
+ - 'spec/features/projects/user_creates_project_spec.rb'
+ - 'spec/features/projects/user_sees_sidebar_spec.rb'
+ - 'spec/features/projects/user_sorts_projects_spec.rb'
+ - 'spec/features/projects/user_uses_shortcuts_spec.rb'
+ - 'spec/features/projects/view_on_env_spec.rb'
+ - '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'
+ - 'spec/features/search/user_searches_for_code_spec.rb'
+ - 'spec/features/search/user_uses_header_search_field_spec.rb'
+ - 'spec/features/security/project/snippet/internal_access_spec.rb'
+ - 'spec/features/security/project/snippet/public_access_spec.rb'
+ - 'spec/features/signed_commits_spec.rb'
+ - 'spec/features/snippets/explore_spec.rb'
+ - 'spec/features/tags/developer_creates_tag_spec.rb'
+ - 'spec/features/tags/developer_deletes_tag_spec.rb'
+ - 'spec/features/tags/developer_updates_tag_spec.rb'
+ - 'spec/features/uploads/user_uploads_file_to_note_spec.rb'
+ - 'spec/features/user_can_display_performance_bar_spec.rb'
+ - 'spec/features/user_opens_link_to_comment_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/features/users/logout_spec.rb'
+ - 'spec/features/users/overview_spec.rb'
+ - 'spec/features/users/show_spec.rb'
+ - 'spec/features/users/snippets_spec.rb'
+ - 'spec/features/users/terms_spec.rb'
+ - 'spec/finders/abuse_reports_finder_spec.rb'
+ - 'spec/finders/admin/projects_finder_spec.rb'
+ - 'spec/finders/alert_management/alerts_finder_spec.rb'
+ - 'spec/finders/alert_management/http_integrations_finder_spec.rb'
+ - 'spec/finders/applications_finder_spec.rb'
+ - 'spec/finders/autocomplete/acts_as_taggable_on/tags_finder_spec.rb'
+ - 'spec/finders/autocomplete/move_to_project_finder_spec.rb'
+ - 'spec/finders/autocomplete/routes_finder_spec.rb'
+ - 'spec/finders/autocomplete/users_finder_spec.rb'
+ - 'spec/finders/branches_finder_spec.rb'
+ - 'spec/finders/ci/commit_statuses_finder_spec.rb'
+ - 'spec/finders/ci/jobs_finder_spec.rb'
+ - 'spec/finders/ci/pipelines_finder_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
+ - 'spec/finders/ci/variables_finder_spec.rb'
+ - 'spec/finders/cluster_ancestors_finder_spec.rb'
+ - 'spec/finders/clusters/agent_authorizations_finder_spec.rb'
+ - 'spec/finders/clusters/agents_finder_spec.rb'
+ - 'spec/finders/clusters/kubernetes_namespace_finder_spec.rb'
+ - 'spec/finders/contributed_projects_finder_spec.rb'
+ - 'spec/finders/deploy_tokens/tokens_finder_spec.rb'
+ - 'spec/finders/deployments_finder_spec.rb'
+ - 'spec/finders/design_management/designs_finder_spec.rb'
+ - 'spec/finders/environments/environment_names_finder_spec.rb'
+ - 'spec/finders/environments/environments_by_deployments_finder_spec.rb'
+ - 'spec/finders/environments/environments_finder_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/group_members_finder_spec.rb'
+ - 'spec/finders/group_projects_finder_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/issues_finder_spec.rb'
+ - 'spec/finders/joined_groups_finder_spec.rb'
+ - 'spec/finders/keys_finder_spec.rb'
+ - 'spec/finders/labels_finder_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/finders/merge_request_target_project_finder_spec.rb'
+ - 'spec/finders/merge_requests/by_approvals_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder/params_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/metrics/dashboards/annotations_finder_spec.rb'
+ - 'spec/finders/metrics/users_starred_dashboards_finder_spec.rb'
+ - 'spec/finders/milestones_finder_spec.rb'
+ - 'spec/finders/notes_finder_spec.rb'
+ - 'spec/finders/packages/conan/package_finder_spec.rb'
+ - 'spec/finders/packages/go/version_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/finders/packages/helm/packages_finder_spec.rb'
+ - 'spec/finders/packages/maven/package_finder_spec.rb'
+ - 'spec/finders/packages/npm/package_finder_spec.rb'
+ - 'spec/finders/packages/package_finder_spec.rb'
+ - 'spec/finders/packages/packages_finder_spec.rb'
+ - 'spec/finders/packages/pypi/package_finder_spec.rb'
+ - 'spec/finders/packages/pypi/packages_finder_spec.rb'
+ - 'spec/finders/personal_access_tokens_finder_spec.rb'
+ - 'spec/finders/personal_projects_finder_spec.rb'
+ - 'spec/finders/projects/groups_finder_spec.rb'
+ - 'spec/finders/projects/members/effective_access_level_finder_spec.rb'
+ - 'spec/finders/projects/members/effective_access_level_per_user_finder_spec.rb'
+ - 'spec/finders/projects/topics_finder_spec.rb'
+ - 'spec/finders/projects_finder_spec.rb'
+ - 'spec/finders/releases/evidence_pipeline_finder_spec.rb'
+ - 'spec/finders/releases/group_releases_finder_spec.rb'
+ - 'spec/finders/releases_finder_spec.rb'
+ - 'spec/finders/repositories/tree_finder_spec.rb'
+ - 'spec/finders/snippets_finder_spec.rb'
+ - 'spec/finders/starred_projects_finder_spec.rb'
+ - 'spec/finders/tags_finder_spec.rb'
+ - 'spec/finders/template_finder_spec.rb'
+ - 'spec/finders/terraform/states_finder_spec.rb'
+ - 'spec/finders/todos_finder_spec.rb'
+ - 'spec/finders/user_group_notification_settings_finder_spec.rb'
+ - 'spec/finders/user_recent_events_finder_spec.rb'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/frontend/fixtures/projects.rb'
+ - 'spec/frontend/fixtures/search.rb'
+ - 'spec/frontend/fixtures/u2f.rb'
+ - 'spec/frontend/fixtures/webauthn.rb'
+ - 'spec/graphql/features/feature_flag_spec.rb'
+ - 'spec/graphql/mutations/alert_management/alerts/set_assignees_spec.rb'
+ - 'spec/graphql/mutations/alert_management/create_alert_issue_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/create_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/destroy_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/reset_token_spec.rb'
+ - 'spec/graphql/mutations/alert_management/http_integration/update_spec.rb'
+ - '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/graphql/mutations/alert_management/update_alert_status_spec.rb'
+ - 'spec/graphql/mutations/boards/lists/update_spec.rb'
+ - 'spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb'
+ - 'spec/graphql/mutations/clusters/agents/create_spec.rb'
+ - 'spec/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/graphql/mutations/design_management/move_spec.rb'
+ - 'spec/graphql/mutations/groups/update_spec.rb'
+ - 'spec/graphql/mutations/issues/set_severity_spec.rb'
+ - 'spec/graphql/mutations/merge_requests/update_spec.rb'
+ - 'spec/graphql/mutations/release_asset_links/update_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/releases/update_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/delete_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/lock_spec.rb'
+ - 'spec/graphql/mutations/terraform/state/unlock_spec.rb'
+ - 'spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/alert_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/http_integrations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/alert_management/integrations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/base_resolver_spec.rb'
+ - 'spec/graphql/resolvers/blobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/runner_status_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agent_activity_events_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agent_tokens_resolver_spec.rb'
+ - 'spec/graphql/resolvers/clusters/agents_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/caching_array_resolver_spec.rb'
+ - 'spec/graphql/resolvers/concerns/resolves_pipelines_spec.rb'
+ - 'spec/graphql/resolvers/container_repository_tags_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/design_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/designs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version/design_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version/designs_at_version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/versions_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_labels_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_milestones_resolver_spec.rb'
+ - 'spec/graphql/resolvers/group_packages_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issue_status_counts_resolver_spec.rb'
+ - 'spec/graphql/resolvers/issues_resolver_spec.rb'
+ - 'spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb'
+ - 'spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb'
+ - 'spec/graphql/resolvers/last_commit_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboard_resolver_spec.rb'
+ - 'spec/graphql/resolvers/metrics/dashboards/annotation_resolver_spec.rb'
+ - 'spec/graphql/resolvers/namespace_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_merge_requests_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_milestones_resolver_spec.rb'
+ - 'spec/graphql/resolvers/project_pipeline_statistics_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets/blobs_resolver_spec.rb'
+ - 'spec/graphql/resolvers/snippets_resolver_spec.rb'
+ - 'spec/graphql/resolvers/terraform/states_resolver_spec.rb'
+ - 'spec/graphql/resolvers/timelog_resolver_spec.rb'
+ - 'spec/graphql/resolvers/user_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/group_count_resolver_spec.rb'
+ - 'spec/graphql/resolvers/users/participants_resolver_spec.rb'
+ - 'spec/graphql/subscriptions/issuable_updated_spec.rb'
+ - 'spec/graphql/types/base_field_spec.rb'
+ - 'spec/graphql/types/global_id_type_spec.rb'
+ - 'spec/graphql/types/invitation_interface_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/graphql/types/member_interface_spec.rb'
+ - 'spec/graphql/types/range_input_type_spec.rb'
+ - 'spec/graphql/types/release_links_type_spec.rb'
+ - 'spec/graphql/types/user_type_spec.rb'
+ - 'spec/haml_lint/linter/documentation_links_spec.rb'
+ - 'spec/haml_lint/linter/no_plain_nodes_spec.rb'
+ - 'spec/helpers/admin/user_actions_helper_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/auto_devops_helper_spec.rb'
+ - 'spec/helpers/avatars_helper_spec.rb'
+ - 'spec/helpers/award_emoji_helper_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/boards_helper_spec.rb'
+ - 'spec/helpers/ci/runners_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/colors_helper_spec.rb'
+ - 'spec/helpers/commits_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/emails_helper_spec.rb'
+ - 'spec/helpers/environment_helper_spec.rb'
+ - 'spec/helpers/environments_helper_spec.rb'
+ - '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'
+ - 'spec/helpers/integrations_helper_spec.rb'
+ - 'spec/helpers/invite_members_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/jira_connect_helper_spec.rb'
+ - 'spec/helpers/labels_helper_spec.rb'
+ - 'spec/helpers/listbox_helper_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/helpers/members_helper_spec.rb'
+ - 'spec/helpers/nav/top_nav_helper_spec.rb'
+ - 'spec/helpers/nav_helper_spec.rb'
+ - 'spec/helpers/notes_helper_spec.rb'
+ - 'spec/helpers/operations_helper_spec.rb'
+ - 'spec/helpers/projects/cluster_agents_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/routing/pseudonymization_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/snippets_helper_spec.rb'
+ - 'spec/helpers/sorting_helper_spec.rb'
+ - 'spec/helpers/storage_helper_spec.rb'
+ - 'spec/helpers/submodule_helper_spec.rb'
+ - 'spec/helpers/timeboxes_helper_spec.rb'
+ - 'spec/helpers/timeboxes_routing_helper_spec.rb'
+ - 'spec/helpers/todos_helper_spec.rb'
+ - 'spec/helpers/tree_helper_spec.rb'
+ - 'spec/helpers/users/group_callouts_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/helpers/whats_new_helper_spec.rb'
+ - 'spec/helpers/wiki_helper_spec.rb'
+ - 'spec/initializers/00_rails_disable_joins_spec.rb'
+ - 'spec/initializers/0_log_deprecations_spec.rb'
+ - 'spec/initializers/carrierwave_patch_spec.rb'
+ - 'spec/initializers/lograge_spec.rb'
+ - 'spec/initializers/mail_encoding_patch_spec.rb'
+ - 'spec/initializers/net_http_patch_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
+ - 'spec/initializers/secret_token_spec.rb'
+ - 'spec/initializers/settings_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/initializers/validate_puma_spec.rb'
+ - 'spec/lib/api/entities/application_setting_spec.rb'
+ - 'spec/lib/api/entities/basic_project_details_spec.rb'
+ - 'spec/lib/api/entities/clusters/agent_authorization_spec.rb'
+ - 'spec/lib/api/entities/merge_request_basic_spec.rb'
+ - 'spec/lib/api/entities/nuget/dependency_group_spec.rb'
+ - 'spec/lib/api/entities/user_spec.rb'
+ - 'spec/lib/api/every_api_endpoint_spec.rb'
+ - 'spec/lib/api/helpers/caching_spec.rb'
+ - 'spec/lib/api/helpers/pagination_strategies_spec.rb'
+ - 'spec/lib/api/helpers/related_resources_helpers_spec.rb'
+ - 'spec/lib/api/helpers/variables_helpers_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/api/support/git_access_actor_spec.rb'
+ - 'spec/lib/api/validations/validators/absence_spec.rb'
+ - 'spec/lib/api/validations/validators/array_none_any_spec.rb'
+ - 'spec/lib/api/validations/validators/email_or_email_list_spec.rb'
+ - 'spec/lib/api/validations/validators/file_path_spec.rb'
+ - 'spec/lib/api/validations/validators/git_ref_spec.rb'
+ - 'spec/lib/api/validations/validators/git_sha_spec.rb'
+ - 'spec/lib/api/validations/validators/integer_none_any_spec.rb'
+ - 'spec/lib/api/validations/validators/integer_or_custom_value_spec.rb'
+ - 'spec/lib/api/validations/validators/limit_spec.rb'
+ - 'spec/lib/api/validations/validators/project_portable_spec.rb'
+ - 'spec/lib/api/validations/validators/untrusted_regexp_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/deployment_entity_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/serializers/feature_flag_entity_spec.rb'
+ - 'spec/lib/atlassian/jira_connect_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/banzai/color_parser_spec.rb'
+ - 'spec/lib/banzai/filter/absolute_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/asset_proxy_filter_spec.rb'
+ - 'spec/lib/banzai/filter/audio_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_placeholders_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb'
+ - 'spec/lib/banzai/filter/commit_trailers_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/front_matter_filter_spec.rb'
+ - 'spec/lib/banzai/filter/gollum_tags_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_metrics_redactor_filter_spec.rb'
+ - 'spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/markdown_filter_spec.rb'
+ - 'spec/lib/banzai/filter/reference_redactor_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/abstract_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/design_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/suggestion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/banzai/filter/table_of_contents_filter_spec.rb'
+ - 'spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb'
+ - 'spec/lib/banzai/filter/upload_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/video_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/wiki_link_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/broadcast_message_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/alert_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/base_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_range_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/design_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/feature_flag_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/label_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_group_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/mentioned_user_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/milestone_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/user_parser_spec.rb'
+ - 'spec/lib/bitbucket_server/connection_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/pull_request_spec.rb'
+ - 'spec/lib/bulk_imports/clients/http_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/lfs_objects_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/milestones_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/groups/transformers/member_attributes_transformer_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/ci_pipelines_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/merge_requests_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/pipeline_schedules_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/repository_pipeline_spec.rb'
+ - 'spec/lib/constraints/admin_constrainer_spec.rb'
+ - 'spec/lib/constraints/group_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/user_url_constrainer_spec.rb'
+ - 'spec/lib/container_registry/blob_spec.rb'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/container_registry/migration_spec.rb'
+ - 'spec/lib/container_registry/registry_spec.rb'
+ - 'spec/lib/container_registry/tag_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/event_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/issue_link_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/projects_spec.rb'
+ - 'spec/lib/error_tracking/sentry_client/repo_spec.rb'
+ - 'spec/lib/expand_variables_spec.rb'
+ - 'spec/lib/extracts_path_spec.rb'
+ - 'spec/lib/extracts_ref_spec.rb'
+ - 'spec/lib/feature/definition_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/generators/gitlab/snowplow_event_definition_generator_spec.rb'
+ - 'spec/lib/generators/gitlab/usage_metric_generator_spec.rb'
+ - 'spec/lib/gitlab/alert_management/alert_status_counts_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_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/average_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb'
+ - 'spec/lib/gitlab/analytics/cycle_analytics/sorting_spec.rb'
+ - 'spec/lib/gitlab/application_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/asciidoc_spec.rb'
+ - 'spec/lib/gitlab/asset_proxy_spec.rb'
+ - 'spec/lib/gitlab/auth/atlassian/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/atlassian/user_spec.rb'
+ - 'spec/lib/gitlab/auth/auth_finders_spec.rb'
+ - 'spec/lib/gitlab/auth/current_user_mode_spec.rb'
+ - 'spec/lib/gitlab/auth/key_status_checker_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/adapter_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/dn_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/provider_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/auth/unique_ips_limiter_spec.rb'
+ - 'spec/lib/gitlab/auth/user_access_denied_reason_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/authorized_keys_spec.rb'
+ - 'spec/lib/gitlab/avatar_cache_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_ci_queuing_tables_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_draft_data_from_faulty_regex_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb'
+ - 'spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb'
+ - 'spec/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/repository_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/blame_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/cache/helpers_spec.rb'
+ - 'spec/lib/gitlab/chat/responder_spec.rb'
+ - 'spec/lib/gitlab/chat_name_token_spec.rb'
+ - 'spec/lib/gitlab/checks/branch_check_spec.rb'
+ - 'spec/lib/gitlab/checks/lfs_integrity_spec.rb'
+ - 'spec/lib/gitlab/checks/matching_merge_request_spec.rb'
+ - 'spec/lib/gitlab/checks/push_file_count_check_spec.rb'
+ - 'spec/lib/gitlab/checks/snippet_check_spec.rb'
+ - 'spec/lib/gitlab/checks/tag_check_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/style_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/coverage/report_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/pipeline/status_spec.rb'
+ - 'spec/lib/gitlab/ci/badge/release/template_spec.rb'
+ - 'spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
+ - 'spec/lib/gitlab/ci/build/policy/refs_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb'
+ - 'spec/lib/gitlab/ci/build/releaser_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules/rule/clause/exists_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules_spec.rb'
+ - 'spec/lib/gitlab/ci/charts_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/default_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/include/rules/rule_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/include_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/inherit/default_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/inherit/variables_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/jobs_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/kubernetes_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/port_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/ports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/release_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/retry_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/rules/rule_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/trigger/forward_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/local_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/jwt_spec.rb'
+ - 'spec/lib/gitlab/ci/lint_spec.rb'
+ - 'spec/lib/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/coverage/sax_document_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/command_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/create_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/helpers_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/validate/abilities_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/duration_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/parser_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline_object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/aggregated_report_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/runner_instructions_spec.rb'
+ - 'spec/lib/gitlab/ci/status/bridge/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/ci/status/composite_spec.rb'
+ - 'spec/lib/gitlab/ci/status/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/play_manual_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/build_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/code_quality_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/npm_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/templates_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'
+ - 'spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/archive_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/section_parser_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/stream_spec.rb'
+ - 'spec/lib/gitlab/ci/trace_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection/item_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection/sort_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/collection_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_job_artifact_files_batch_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb'
+ - 'spec/lib/gitlab/cleanup/project_uploads_spec.rb'
+ - 'spec/lib/gitlab/cluster/lifecycle_events_spec.rb'
+ - 'spec/lib/gitlab/composer/cache_spec.rb'
+ - 'spec/lib/gitlab/config/entry/composable_array_spec.rb'
+ - 'spec/lib/gitlab/config/entry/composable_hash_spec.rb'
+ - 'spec/lib/gitlab/config_checker/puma_rugged_checker_spec.rb'
+ - 'spec/lib/gitlab/console_spec.rb'
+ - 'spec/lib/gitlab/consul/internal_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/permissions_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/issuable_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batch_optimizer_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/bulk_update_spec.rb'
+ - 'spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/count_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/host_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/setup_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/database/loose_foreign_keys_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/v2_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/base_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/single_numeric_list_partition_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_hll/batch_distinct_counter_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzer_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/prevent_cross_database_modification_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb'
+ - 'spec/lib/gitlab/database/reflection_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/coordinator_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_action_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces_spec.rb'
+ - 'spec/lib/gitlab/database/schema_migrations/context_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb'
+ - '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/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'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/diff/lines_unfolder_spec.rb'
+ - 'spec/lib/gitlab/diff/position_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer_spec.rb'
+ - 'spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb'
+ - 'spec/lib/gitlab/diff/suggestions_parser_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'
+ - 'spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/experience_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
+ - 'spec/lib/gitlab/email/message/repository_push_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/context_payload_generator_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/exceptions_app_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb'
+ - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/experimentation_spec.rb'
+ - 'spec/lib/gitlab/external_authorization/access_spec.rb'
+ - 'spec/lib/gitlab/favicon_spec.rb'
+ - 'spec/lib/gitlab/file_hook_spec.rb'
+ - 'spec/lib/gitlab/fips_spec.rb'
+ - 'spec/lib/gitlab/fogbugz_import/importer_spec.rb'
+ - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb'
+ - 'spec/lib/gitlab/gfm/uploads_rewriter_spec.rb'
+ - 'spec/lib/gitlab/git/attributes_parser_spec.rb'
+ - 'spec/lib/gitlab/git/blame_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git/changes_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/compare_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/git/cross_repo_comparer_spec.rb'
+ - 'spec/lib/gitlab/git/diff_collection_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/keep_around_spec.rb'
+ - 'spec/lib/gitlab/git/merge_base_spec.rb'
+ - 'spec/lib/gitlab/git/raw_diff_change_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb'
+ - 'spec/lib/gitlab/git/tag_spec.rb'
+ - 'spec/lib/gitlab/git/wiki_page_version_spec.rb'
+ - 'spec/lib/gitlab/git_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/call_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/labels_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/releases_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/diff_note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/user_spec.rb'
+ - 'spec/lib/gitlab/github_import_spec.rb'
+ - 'spec/lib/gitlab/gpg/commit_spec.rb'
+ - 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/exception_logger_spec.rb'
+ - 'spec/lib/gitlab/graphql/batch_key_spec.rb'
+ - 'spec/lib/gitlab/graphql/loaders/issuable_loader_spec.rb'
+ - 'spec/lib/gitlab/graphql/markdown_field_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/externally_paginated_array_connection_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb'
+ - 'spec/lib/gitlab/graphql/pagination/keyset/order_info_spec.rb'
+ - 'spec/lib/gitlab/graphql/queries_spec.rb'
+ - 'spec/lib/gitlab/graphql_logger_spec.rb'
+ - 'spec/lib/gitlab/health_checks/gitaly_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/middleware_spec.rb'
+ - 'spec/lib/gitlab/health_checks/puma_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/simple_check_shared.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/hook_data/group_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/group_member_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/issue_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/key_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/project_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/project_member_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/subgroup_builder_spec.rb'
+ - 'spec/lib/gitlab/hook_data/user_builder_spec.rb'
+ - 'spec/lib/gitlab/hotlinking_detector_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/i18n/po_linter_spec.rb'
+ - 'spec/lib/gitlab/import/merge_request_creator_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_finder_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/file_importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/importer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/hash_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/shared_example.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_reader_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/streaming_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/import_export/merge_request_parser_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/version_checker_spec.rb'
+ - 'spec/lib/gitlab/incoming_email_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_base_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb'
+ - 'spec/lib/gitlab/internal_post_receive/response_spec.rb'
+ - 'spec/lib/gitlab/issuable_metadata_spec.rb'
+ - 'spec/lib/gitlab/issuable_sorter_spec.rb'
+ - 'spec/lib/gitlab/issuables_count_for_state_spec.rb'
+ - 'spec/lib/gitlab/issues/rebalancing/state_spec.rb'
+ - 'spec/lib/gitlab/jira/dvcs_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/json_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/kas/client_spec.rb'
+ - 'spec/lib/gitlab/kas_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/default_namespace_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/api_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/certificate_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/v2/init_command_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/rollout_status_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/client_spec.rb'
+ - 'spec/lib/gitlab/lfs/client_spec.rb'
+ - 'spec/lib/gitlab/lfs_token_spec.rb'
+ - 'spec/lib/gitlab/logger_spec.rb'
+ - 'spec/lib/gitlab/lograge/custom_options_spec.rb'
+ - 'spec/lib/gitlab/mail_room/authenticator_spec.rb'
+ - 'spec/lib/gitlab/mail_room/mail_room_spec.rb'
+ - 'spec/lib/gitlab/manifest_import/manifest_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb'
+ - 'spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb'
+ - 'spec/lib/gitlab/metrics/boot_time_tracker_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/cache_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/finder_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importer_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/processor_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/url_validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/transformers/yml/v1/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/url_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/errors_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/post_schema_validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator_spec.rb'
+ - 'spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb'
+ - 'spec/lib/gitlab/metrics/method_call_spec.rb'
+ - 'spec/lib/gitlab/metrics/methods_spec.rb'
+ - 'spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/threads_sampler_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/active_record_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb'
+ - 'spec/lib/gitlab/metrics_spec.rb'
+ - 'spec/lib/gitlab/middleware/basic_health_check_spec.rb'
+ - 'spec/lib/gitlab/middleware/compressed_json_spec.rb'
+ - 'spec/lib/gitlab/middleware/go_spec.rb'
+ - 'spec/lib/gitlab/middleware/handle_malformed_strings_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart_spec.rb'
+ - 'spec/lib/gitlab/middleware/rack_multipart_tempfile_factory_spec.rb'
+ - 'spec/lib/gitlab/middleware/request_context_spec.rb'
+ - 'spec/lib/gitlab/middleware/same_site_cookies_spec.rb'
+ - 'spec/lib/gitlab/namespaced_session_store_spec.rb'
+ - 'spec/lib/gitlab/noteable_metadata_spec.rb'
+ - 'spec/lib/gitlab/object_hierarchy_spec.rb'
+ - 'spec/lib/gitlab/other_markup_spec.rb'
+ - 'spec/lib/gitlab/otp_key_rotator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/column_order_definition_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/paginator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_header_builder_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/patch/prependable_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/performance_bar_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/issues/importer_spec.rb'
+ - 'spec/lib/gitlab/phabricator_import/user_finder_spec.rb'
+ - 'spec/lib/gitlab/popen_spec.rb'
+ - 'spec/lib/gitlab/process_supervisor_spec.rb'
+ - 'spec/lib/gitlab/profiler_spec.rb'
+ - 'spec/lib/gitlab/project_authorizations_spec.rb'
+ - 'spec/lib/gitlab/project_search_results_spec.rb'
+ - 'spec/lib/gitlab/prometheus/adapter_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/validate_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/query_limiting/middleware_spec.rb'
+ - 'spec/lib/gitlab/query_limiting_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/spend_time_and_date_separator_spec.rb'
+ - 'spec/lib/gitlab/rack_attack_spec.rb'
+ - 'spec/lib/gitlab/reactive_cache_set_cache_spec.rb'
+ - 'spec/lib/gitlab/redis/boolean_spec.rb'
+ - 'spec/lib/gitlab/redis/hll_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/item_context_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/mover_spec.rb'
+ - 'spec/lib/gitlab/repo_path_spec.rb'
+ - 'spec/lib/gitlab/repository_cache_adapter_spec.rb'
+ - 'spec/lib/gitlab/repository_hash_cache_spec.rb'
+ - 'spec/lib/gitlab/repository_set_cache_spec.rb'
+ - 'spec/lib/gitlab/robots_txt/parser_spec.rb'
+ - 'spec/lib/gitlab/route_map_spec.rb'
+ - 'spec/lib/gitlab/routing_spec.rb'
+ - 'spec/lib/gitlab/runtime_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/exif_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/lib/gitlab/search/params_spec.rb'
+ - 'spec/lib/gitlab/search/sort_options_spec.rb'
+ - 'spec/lib/gitlab/search_context/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/search_results_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_router_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/admin_mode/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/admin_mode/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/compressor_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_signals_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/command_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_close_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_new_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_search_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_show_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_close_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/presenters/issue_show_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/run_spec.rb'
+ - 'spec/lib/gitlab/sourcegraph_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/sql/pattern_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/static_site_editor/config/file_config/entry/mount_spec.rb'
+ - 'spec/lib/gitlab/submodule_links_spec.rb'
+ - 'spec/lib/gitlab/subscription_portal_spec.rb'
+ - 'spec/lib/gitlab/suggestions/commit_message_spec.rb'
+ - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
+ - 'spec/lib/gitlab/time_tracking_formatter_spec.rb'
+ - 'spec/lib/gitlab/tracking/destinations/snowplow_spec.rb'
+ - 'spec/lib/gitlab/tracking/incident_management_spec.rb'
+ - 'spec/lib/gitlab/tracking/snowplow_schema_validation_spec.rb'
+ - 'spec/lib/gitlab/tracking/standard_context_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/untrusted_regexp/ruby_syntax_spec.rb'
+ - 'spec/lib/gitlab/untrusted_regexp_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/url_builder_spec.rb'
+ - 'spec/lib/gitlab/url_sanitizer_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_users_creating_issues_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/snowplow_configured_to_gitlab_collector_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/snowplow_enabled_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/ci_template_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/editor_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/issue_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/kubernetes_agent_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/quick_action_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/search_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/track_unique_events_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils/lazy_attributes_spec.rb'
+ - 'spec/lib/gitlab/utils/mime_type_spec.rb'
+ - 'spec/lib/gitlab/utils/strong_memoize_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/uuid_spec.rb'
+ - 'spec/lib/gitlab/version_info_spec.rb'
+ - 'spec/lib/gitlab/view/presenter/base_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_checker_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_spec.rb'
+ - 'spec/lib/gitlab/web_ide/config/entry/terminal_spec.rb'
+ - 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/gitlab/x509/certificate_spec.rb'
+ - 'spec/lib/gitlab/x509/commit_spec.rb'
+ - 'spec/lib/gitlab/x509/signature_spec.rb'
+ - 'spec/lib/gitlab/zentao/client_spec.rb'
+ - 'spec/lib/google_api/cloud_platform/client_spec.rb'
+ - 'spec/lib/json_web_token/hmac_token_spec.rb'
+ - 'spec/lib/json_web_token/rsa_token_spec.rb'
+ - 'spec/lib/json_web_token/token_spec.rb'
+ - 'spec/lib/kramdown/parser/atlassian_document_format_spec.rb'
+ - 'spec/lib/mattermost/client_spec.rb'
+ - 'spec/lib/mattermost/command_spec.rb'
+ - 'spec/lib/mattermost/session_spec.rb'
+ - 'spec/lib/mattermost/team_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/lib/peek/views/bullet_detailed_spec.rb'
+ - 'spec/lib/product_analytics/event_params_spec.rb'
+ - 'spec/lib/prometheus/pid_provider_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/security/ci_configuration/container_scanning_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb'
+ - 'spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/analytics_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/monitor_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/panel_spec.rb'
+ - 'spec/lib/system_check/app/authorized_keys_permission_check_spec.rb'
+ - 'spec/lib/system_check/base_check_spec.rb'
+ - 'spec/lib/system_check/incoming_email/imap_authentication_check_spec.rb'
+ - 'spec/lib/system_check/orphans/namespace_check_spec.rb'
+ - 'spec/lib/system_check/orphans/repository_check_spec.rb'
+ - 'spec/lib/uploaded_file_spec.rb'
+ - 'spec/lib/version_check_spec.rb'
+ - 'spec/mailers/emails/profile_spec.rb'
+ - 'spec/mailers/emails/projects_spec.rb'
+ - 'spec/mailers/emails/releases_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
+ - 'spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb'
+ - 'spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb'
+ - 'spec/migrations/finalize_traversal_ids_background_migrations_spec.rb'
+ - 'spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb'
+ - 'spec/migrations/rename_services_to_integrations_spec.rb'
+ - 'spec/migrations/schedule_security_setting_creation_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/alert_management/alert_spec.rb'
+ - 'spec/models/alert_management/http_integration_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/project_stage_spec.rb'
+ - 'spec/models/appearance_spec.rb'
+ - 'spec/models/application_record_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/approval_spec.rb'
+ - 'spec/models/audit_event_spec.rb'
+ - 'spec/models/award_emoji_spec.rb'
+ - 'spec/models/aws/role_spec.rb'
+ - 'spec/models/badge_spec.rb'
+ - 'spec/models/badges/project_badge_spec.rb'
+ - 'spec/models/blob_spec.rb'
+ - 'spec/models/blob_viewer/package_json_spec.rb'
+ - 'spec/models/board_spec.rb'
+ - 'spec/models/bulk_imports/entity_spec.rb'
+ - 'spec/models/ci/artifact_blob_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/build_metadata_spec.rb'
+ - 'spec/models/ci/build_runner_session_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - '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'
+ - 'spec/models/ci/pipeline_schedule_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/ci/project_mirror_spec.rb'
+ - 'spec/models/ci/ref_spec.rb'
+ - 'spec/models/ci/resource_spec.rb'
+ - 'spec/models/ci/runner_project_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/ci/running_build_spec.rb'
+ - 'spec/models/ci/secure_file_spec.rb'
+ - 'spec/models/ci/sources/pipeline_spec.rb'
+ - 'spec/models/ci/stage_spec.rb'
+ - 'spec/models/ci/trigger_spec.rb'
+ - 'spec/models/ci/variable_spec.rb'
+ - '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'
+ - 'spec/models/clusters/applications/knative_spec.rb'
+ - 'spec/models/clusters/applications/prometheus_spec.rb'
+ - 'spec/models/clusters/applications/runner_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/clusters/clusters_hierarchy_spec.rb'
+ - 'spec/models/clusters/kubernetes_namespace_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/clusters/providers/aws_spec.rb'
+ - 'spec/models/commit_signatures/x509_commit_signature_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/compare_spec.rb'
+ - 'spec/models/concerns/after_commit_queue_spec.rb'
+ - 'spec/models/concerns/awardable_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/cache_markdown_field_spec.rb'
+ - 'spec/models/concerns/cacheable_attributes_spec.rb'
+ - 'spec/models/concerns/cascading_namespace_setting_attribute_spec.rb'
+ - 'spec/models/concerns/ci/artifactable_spec.rb'
+ - 'spec/models/concerns/ci/has_ref_spec.rb'
+ - 'spec/models/concerns/ci/has_status_spec.rb'
+ - 'spec/models/concerns/cron_schedulable_spec.rb'
+ - 'spec/models/concerns/cross_database_modification_spec.rb'
+ - 'spec/models/concerns/deployment_platform_spec.rb'
+ - 'spec/models/concerns/group_descendant_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/mentionable_spec.rb'
+ - 'spec/models/concerns/milestoneable_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/concerns/nullify_if_blank_spec.rb'
+ - 'spec/models/concerns/participable_spec.rb'
+ - 'spec/models/concerns/protected_ref_access_spec.rb'
+ - 'spec/models/concerns/reactive_caching_spec.rb'
+ - 'spec/models/concerns/resolvable_note_spec.rb'
+ - 'spec/models/concerns/routable_spec.rb'
+ - 'spec/models/concerns/schedulable_spec.rb'
+ - 'spec/models/concerns/sensitive_serializable_hash_spec.rb'
+ - 'spec/models/concerns/spammable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/concerns/triggerable_hooks_spec.rb'
+ - 'spec/models/concerns/usage_statistics_spec.rb'
+ - 'spec/models/container_expiration_policy_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/customer_relations/issue_contact_spec.rb'
+ - 'spec/models/dependency_proxy/manifest_spec.rb'
+ - 'spec/models/dependency_proxy/registry_spec.rb'
+ - 'spec/models/deploy_key_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/deployment_metrics_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/design_management/action_spec.rb'
+ - 'spec/models/design_management/design_action_spec.rb'
+ - 'spec/models/design_management/design_at_version_spec.rb'
+ - 'spec/models/design_management/design_collection_spec.rb'
+ - 'spec/models/design_management/design_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/diff_note_position_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/environment_status_spec.rb'
+ - 'spec/models/error_tracking/error_event_spec.rb'
+ - 'spec/models/error_tracking/error_spec.rb'
+ - 'spec/models/event_collection_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/external_issue_spec.rb'
+ - 'spec/models/external_pull_request_spec.rb'
+ - 'spec/models/fork_network_spec.rb'
+ - 'spec/models/gpg_key_spec.rb'
+ - 'spec/models/grafana_integration_spec.rb'
+ - 'spec/models/group_deploy_token_spec.rb'
+ - 'spec/models/group_label_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/hooks/active_hook_filter_spec.rb'
+ - 'spec/models/hooks/system_hook_spec.rb'
+ - 'spec/models/identity_spec.rb'
+ - 'spec/models/import_export_upload_spec.rb'
+ - 'spec/models/import_failure_spec.rb'
+ - 'spec/models/incident_management/timeline_event_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/asana_spec.rb'
+ - 'spec/models/integrations/bamboo_spec.rb'
+ - 'spec/models/integrations/base_chat_notification_spec.rb'
+ - 'spec/models/integrations/chat_message/issue_message_spec.rb'
+ - 'spec/models/integrations/chat_message/merge_message_spec.rb'
+ - 'spec/models/integrations/chat_message/note_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/datadog_spec.rb'
+ - 'spec/models/integrations/discord_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/integrations/emails_on_push_spec.rb'
+ - 'spec/models/integrations/every_integration_spec.rb'
+ - 'spec/models/integrations/external_wiki_spec.rb'
+ - 'spec/models/integrations/harbor_spec.rb'
+ - 'spec/models/integrations/jenkins_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/integrations/microsoft_teams_spec.rb'
+ - 'spec/models/integrations/pipelines_email_spec.rb'
+ - 'spec/models/integrations/prometheus_spec.rb'
+ - 'spec/models/integrations/slack_spec.rb'
+ - 'spec/models/integrations/teamcity_spec.rb'
+ - 'spec/models/internal_id_spec.rb'
+ - 'spec/models/issue/metrics_spec.rb'
+ - 'spec/models/issue_assignee_spec.rb'
+ - 'spec/models/issue_collection_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/jira_import_state_spec.rb'
+ - 'spec/models/key_spec.rb'
+ - 'spec/models/lfs_download_object_spec.rb'
+ - 'spec/models/lfs_object_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/members/group_member_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/merge_request_assignee_spec.rb'
+ - 'spec/models/merge_request_diff_file_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_reviewer_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/metrics/dashboard/annotation_spec.rb'
+ - 'spec/models/metrics/users_starred_dashboard_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
+ - 'spec/models/namespace_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/namespace_statistics_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/notification_recipient_spec.rb'
+ - 'spec/models/notification_setting_spec.rb'
+ - 'spec/models/onboarding_progress_spec.rb'
+ - 'spec/models/operations/feature_flag_spec.rb'
+ - 'spec/models/packages/conan/file_metadatum_spec.rb'
+ - 'spec/models/packages/debian/file_metadatum_spec.rb'
+ - 'spec/models/packages/dependency_link_spec.rb'
+ - 'spec/models/packages/dependency_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_dashboard_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_metric_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_panel_group_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_panel_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/plan_limits_spec.rb'
+ - 'spec/models/preloaders/labels_preloader_spec.rb'
+ - 'spec/models/preloaders/users_max_access_level_in_projects_preloader_spec.rb'
+ - 'spec/models/project_authorization_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_feature_usage_spec.rb'
+ - 'spec/models/project_import_state_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - 'spec/models/project_metrics_setting_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_team_spec.rb'
+ - 'spec/models/projects/repository_storage_move_spec.rb'
+ - 'spec/models/prometheus_alert_event_spec.rb'
+ - 'spec/models/protectable_dropdown_spec.rb'
+ - 'spec/models/protected_branch_spec.rb'
+ - 'spec/models/raw_usage_data_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/models/release_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/resource_label_event_spec.rb'
+ - 'spec/models/resource_state_event_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/sent_notification_spec.rb'
+ - 'spec/models/sentry_issue_spec.rb'
+ - 'spec/models/snippet_input_action_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/spam_log_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/suggestion_spec.rb'
+ - 'spec/models/terraform/state_spec.rb'
+ - 'spec/models/terraform/state_version_spec.rb'
+ - 'spec/models/todo_spec.rb'
+ - 'spec/models/upload_spec.rb'
+ - 'spec/models/uploads/fog_spec.rb'
+ - 'spec/models/uploads/local_spec.rb'
+ - 'spec/models/user_interacted_project_spec.rb'
+ - 'spec/models/user_preference_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/in_product_marketing_email_spec.rb'
+ - 'spec/models/wiki_page/meta_spec.rb'
+ - 'spec/models/wiki_page/slug_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/models/x509_certificate_spec.rb'
+ - 'spec/models/zoom_meeting_spec.rb'
+ - 'spec/policies/application_setting/term_policy_spec.rb'
+ - 'spec/policies/application_setting_policy_spec.rb'
+ - 'spec/policies/base_policy_spec.rb'
+ - 'spec/policies/board_policy_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/clusters/agents/activity_event_policy_spec.rb'
+ - 'spec/policies/clusters/cluster_policy_spec.rb'
+ - 'spec/policies/custom_emoji_policy_spec.rb'
+ - 'spec/policies/deploy_key_policy_spec.rb'
+ - 'spec/policies/deploy_keys_project_policy_spec.rb'
+ - 'spec/policies/design_management/design_policy_spec.rb'
+ - 'spec/policies/global_policy_spec.rb'
+ - 'spec/policies/group_member_policy_spec.rb'
+ - 'spec/policies/group_policy_spec.rb'
+ - 'spec/policies/instance_metadata_policy_spec.rb'
+ - 'spec/policies/issuable_policy_spec.rb'
+ - 'spec/policies/issue_policy_spec.rb'
+ - 'spec/policies/merge_request_policy_spec.rb'
+ - 'spec/policies/metrics/dashboard/annotation_policy_spec.rb'
+ - 'spec/policies/namespaces/project_namespace_policy_spec.rb'
+ - 'spec/policies/namespaces/user_namespace_policy_spec.rb'
+ - 'spec/policies/note_policy_spec.rb'
+ - 'spec/policies/personal_access_token_policy_spec.rb'
+ - 'spec/policies/personal_snippet_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/policies/project_snippet_policy_spec.rb'
+ - 'spec/policies/terraform/state_policy_spec.rb'
+ - 'spec/policies/terraform/state_version_policy_spec.rb'
+ - 'spec/policies/user_policy_spec.rb'
+ - 'spec/presenters/blob_presenter_spec.rb'
+ - 'spec/presenters/blobs/unfold_presenter_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/clusters/cluster_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/gitlab/blame_presenter_spec.rb'
+ - 'spec/presenters/group_member_presenter_spec.rb'
+ - 'spec/presenters/merge_request_presenter_spec.rb'
+ - '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'
+ - 'spec/presenters/projects/security/configuration_presenter_spec.rb'
+ - 'spec/presenters/projects/settings/deploy_keys_presenter_spec.rb'
+ - 'spec/presenters/search_service_presenter_spec.rb'
+ - 'spec/presenters/user_presenter_spec.rb'
+ - 'spec/presenters/web_hook_log_presenter_spec.rb'
+ - 'spec/requests/admin/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/admin/integrations_controller_spec.rb'
+ - 'spec/requests/api/access_requests_spec.rb'
+ - 'spec/requests/api/admin/ci/variables_spec.rb'
+ - 'spec/requests/api/admin/instance_clusters_spec.rb'
+ - 'spec/requests/api/admin/plan_limits_spec.rb'
+ - 'spec/requests/api/admin/sidekiq_spec.rb'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/requests/api/api_spec.rb'
+ - 'spec/requests/api/appearance_spec.rb'
+ - 'spec/requests/api/applications_spec.rb'
+ - 'spec/requests/api/avatar_spec.rb'
+ - 'spec/requests/api/award_emoji_spec.rb'
+ - 'spec/requests/api/badges_spec.rb'
+ - 'spec/requests/api/branches_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/bulk_imports_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_reset_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/ci/secure_files_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/ci/variables_spec.rb'
+ - 'spec/requests/api/clusters/agents_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/commits_spec.rb'
+ - 'spec/requests/api/composer_packages_spec.rb'
+ - 'spec/requests/api/conan_instance_packages_spec.rb'
+ - 'spec/requests/api/conan_project_packages_spec.rb'
+ - 'spec/requests/api/container_repositories_spec.rb'
+ - 'spec/requests/api/dependency_proxy_spec.rb'
+ - 'spec/requests/api/deploy_keys_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/error_tracking/collector_spec.rb'
+ - 'spec/requests/api/error_tracking/project_settings_spec.rb'
+ - 'spec/requests/api/events_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/generic_packages_spec.rb'
+ - 'spec/requests/api/go_proxy_spec.rb'
+ - 'spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
+ - 'spec/requests/api/graphql/container_repository/container_repository_details_spec.rb'
+ - 'spec/requests/api/graphql/gitlab_schema_spec.rb'
+ - 'spec/requests/api/graphql/group/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_blobs_spec.rb'
+ - 'spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb'
+ - 'spec/requests/api/graphql/group/group_members_spec.rb'
+ - 'spec/requests/api/graphql/group/issues_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/metadata_query_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/graphql/metrics/dashboard_query_spec.rb'
+ - 'spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb'
+ - 'spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/boards/issues/issue_move_list_spec.rb'
+ - 'spec/requests/api/graphql/mutations/branches/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb'
+ - 'spec/requests/api/graphql/mutations/commits/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/custom_emoji/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/design_management/move_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb'
+ - 'spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/create/note_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/update_spec.rb'
+ - 'spec/requests/api/graphql/mutations/remove_attention_request_spec.rb'
+ - 'spec/requests/api/graphql/mutations/todos/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/create_from_task_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb'
+ - 'spec/requests/api/graphql/mutations/work_items/update_spec.rb'
+ - 'spec/requests/api/graphql/namespace_query_spec.rb'
+ - 'spec/requests/api/graphql/packages/maven_spec.rb'
+ - 'spec/requests/api/graphql/packages/package_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alert/notes_spec.rb'
+ - 'spec/requests/api/graphql/project/alert_management/alerts_spec.rb'
+ - 'spec/requests/api/graphql/project/cluster_agents_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/designs/designs_spec.rb'
+ - 'spec/requests/api/graphql/project/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/issues_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/graphql/project/merge_request/diff_notes_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/project/project_members_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/project/repository_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/state_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/graphql/project_query_spec.rb'
+ - 'spec/requests/api/graphql/query_spec.rb'
+ - 'spec/requests/api/graphql/user/starred_projects_query_spec.rb'
+ - 'spec/requests/api/graphql/user_query_spec.rb'
+ - 'spec/requests/api/graphql/users_spec.rb'
+ - 'spec/requests/api/graphql_spec.rb'
+ - 'spec/requests/api/group_avatar_spec.rb'
+ - 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/group_labels_spec.rb'
+ - 'spec/requests/api/group_packages_spec.rb'
+ - 'spec/requests/api/group_variables_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/helm_packages_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/internal/container_registry/migration_spec.rb'
+ - 'spec/requests/api/internal/kubernetes_spec.rb'
+ - 'spec/requests/api/internal/lfs_spec.rb'
+ - 'spec/requests/api/internal/mail_room_spec.rb'
+ - 'spec/requests/api/internal/pages_spec.rb'
+ - 'spec/requests/api/invitations_spec.rb'
+ - 'spec/requests/api/issue_links_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/requests/api/labels_spec.rb'
+ - 'spec/requests/api/lint_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/requests/api/merge_request_approvals_spec.rb'
+ - 'spec/requests/api/merge_request_diffs_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/metrics/user_starred_dashboards_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/npm_project_packages_spec.rb'
+ - 'spec/requests/api/nuget_group_packages_spec.rb'
+ - 'spec/requests/api/oauth_tokens_spec.rb'
+ - 'spec/requests/api/package_files_spec.rb'
+ - 'spec/requests/api/pages/internal_access_spec.rb'
+ - 'spec/requests/api/pages/private_access_spec.rb'
+ - 'spec/requests/api/pages/public_access_spec.rb'
+ - 'spec/requests/api/personal_access_tokens_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/requests/api/project_events_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/project_import_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/remote_mirrors_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/search_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/requests/api/task_completion_status_spec.rb'
+ - 'spec/requests/api/templates_spec.rb'
+ - 'spec/requests/api/terraform/modules/v1/packages_spec.rb'
+ - 'spec/requests/api/terraform/state_spec.rb'
+ - 'spec/requests/api/terraform/state_version_spec.rb'
+ - 'spec/requests/api/todos_spec.rb'
+ - 'spec/requests/api/topics_spec.rb'
+ - 'spec/requests/api/usage_data_spec.rb'
+ - 'spec/requests/api/user_counts_spec.rb'
+ - 'spec/requests/api/users_preferences_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/api/v3/github_spec.rb'
+ - 'spec/requests/content_security_policy_spec.rb'
+ - 'spec/requests/dashboard/projects_controller_spec.rb'
+ - 'spec/requests/dashboard_controller_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/groups/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/groups/crm/contacts_controller_spec.rb'
+ - 'spec/requests/groups/crm/organizations_controller_spec.rb'
+ - 'spec/requests/groups/email_campaigns_controller_spec.rb'
+ - 'spec/requests/groups/milestones_controller_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/groups_controller_spec.rb'
+ - 'spec/requests/health_controller_spec.rb'
+ - 'spec/requests/ide_controller_spec.rb'
+ - 'spec/requests/jira_connect/installations_controller_spec.rb'
+ - 'spec/requests/jira_routing_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/oauth_tokens_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/product_analytics/collector_app_attack_spec.rb'
+ - 'spec/requests/product_analytics/collector_app_spec.rb'
+ - 'spec/requests/projects/clusters/integrations_controller_spec.rb'
+ - 'spec/requests/projects/commits_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/deployments_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/gcp_regions_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/service_accounts_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud_controller_spec.rb'
+ - 'spec/requests/projects/issues/discussions_spec.rb'
+ - 'spec/requests/projects/issues_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests_controller_spec.rb'
+ - 'spec/requests/projects/merge_requests_discussions_spec.rb'
+ - 'spec/requests/projects/merge_requests_spec.rb'
+ - 'spec/requests/projects/metrics/dashboards/builder_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/projects/tags_controller_spec.rb'
+ - 'spec/requests/projects/usage_quotas_spec.rb'
+ - 'spec/requests/projects_controller_spec.rb'
+ - 'spec/requests/rack_attack_global_spec.rb'
+ - 'spec/requests/search_controller_spec.rb'
+ - 'spec/requests/sessions_spec.rb'
+ - 'spec/requests/users_controller_spec.rb'
+ - 'spec/routing/git_http_routing_spec.rb'
+ - 'spec/routing/group_routing_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/rubocop/cop/gitlab/avoid_feature_category_not_owned_spec.rb'
+ - 'spec/rubocop/cop/gitlab/change_timezone_spec.rb'
+ - 'spec/rubocop/cop/gitlab/const_get_inherit_false_spec.rb'
+ - 'spec/rubocop/cop/gitlab/duplicate_spec_location_spec.rb'
+ - 'spec/rubocop/cop/gitlab/event_store_subscriber_spec.rb'
+ - 'spec/rubocop/cop/gitlab/feature_available_usage_spec.rb'
+ - 'spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb'
+ - 'spec/rubocop/cop/graphql/id_type_spec.rb'
+ - 'spec/rubocop/cop/graphql/json_type_spec.rb'
+ - 'spec/rubocop/cop/graphql/old_types_spec.rb'
+ - 'spec/rubocop/cop/lint/last_keyword_argument_spec.rb'
+ - 'spec/rubocop/cop/migration/add_index_spec.rb'
+ - 'spec/rubocop/cop/migration/add_limit_to_text_columns_spec.rb'
+ - 'spec/rubocop/cop/migration/background_migration_record_spec.rb'
+ - 'spec/rubocop/cop/migration/create_table_with_foreign_keys_spec.rb'
+ - 'spec/rubocop/cop/migration/migration_record_spec.rb'
+ - 'spec/rubocop/cop/migration/remove_concurrent_index_spec.rb'
+ - 'spec/rubocop/cop/migration/safer_boolean_column_spec.rb'
+ - 'spec/rubocop/cop/migration/schedule_async_spec.rb'
+ - 'spec/rubocop/cop/migration/timestamps_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/rubocop/cop/migration/versioned_migration_class_spec.rb'
+ - 'spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb'
+ - 'spec/rubocop/cop/performance/readlines_each_spec.rb'
+ - 'spec/rubocop/cop/qa/ambiguous_page_object_name_spec.rb'
+ - 'spec/rubocop/cop/qa/element_with_pattern_spec.rb'
+ - 'spec/rubocop/cop/qa/selector_usage_spec.rb'
+ - 'spec/rubocop/cop/rspec/factory_bot/inline_association_spec.rb'
+ - 'spec/scripts/pipeline_test_report_builder_spec.rb'
+ - 'spec/serializers/analytics_build_entity_spec.rb'
+ - 'spec/serializers/blob_entity_spec.rb'
+ - 'spec/serializers/board_serializer_spec.rb'
+ - 'spec/serializers/ci/job_serializer_spec.rb'
+ - 'spec/serializers/ci/pipeline_entity_spec.rb'
+ - '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'
+ - 'spec/serializers/diffs_entity_spec.rb'
+ - 'spec/serializers/diffs_metadata_entity_spec.rb'
+ - 'spec/serializers/environment_entity_spec.rb'
+ - 'spec/serializers/environment_serializer_spec.rb'
+ - 'spec/serializers/group_child_entity_spec.rb'
+ - 'spec/serializers/group_child_serializer_spec.rb'
+ - 'spec/serializers/group_link/group_group_link_entity_spec.rb'
+ - 'spec/serializers/integrations/project_entity_spec.rb'
+ - 'spec/serializers/issue_serializer_spec.rb'
+ - 'spec/serializers/issue_sidebar_basic_entity_spec.rb'
+ - 'spec/serializers/member_entity_spec.rb'
+ - 'spec/serializers/member_serializer_spec.rb'
+ - 'spec/serializers/merge_request_current_user_entity_spec.rb'
+ - 'spec/serializers/merge_request_diff_entity_spec.rb'
+ - 'spec/serializers/merge_request_for_pipeline_entity_spec.rb'
+ - 'spec/serializers/merge_request_serializer_spec.rb'
+ - 'spec/serializers/merge_request_user_entity_spec.rb'
+ - 'spec/serializers/merge_request_widget_commit_entity_spec.rb'
+ - 'spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'spec/serializers/paginated_diff_entity_spec.rb'
+ - 'spec/serializers/pipeline_details_entity_spec.rb'
+ - 'spec/serializers/service_event_entity_spec.rb'
+ - 'spec/serializers/service_field_entity_spec.rb'
+ - 'spec/serializers/stage_entity_spec.rb'
+ - 'spec/serializers/user_serializer_spec.rb'
+ - 'spec/services/access_token_validation_service_spec.rb'
+ - 'spec/services/alert_management/alerts/update_service_spec.rb'
+ - 'spec/services/alert_management/metric_images/upload_service_spec.rb'
+ - 'spec/services/alert_management/process_prometheus_alert_service_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/audit_event_service_spec.rb'
+ - 'spec/services/auth/dependency_proxy_authentication_service_spec.rb'
+ - 'spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/boards/issues/list_service_spec.rb'
+ - 'spec/services/boards/issues/move_service_spec.rb'
+ - 'spec/services/boards/lists/update_service_spec.rb'
+ - 'spec/services/branches/delete_merged_service_spec.rb'
+ - 'spec/services/branches/validate_new_service_spec.rb'
+ - 'spec/services/bulk_create_integration_service_spec.rb'
+ - 'spec/services/chat_names/find_user_service_spec.rb'
+ - 'spec/services/ci/after_requeue_job_service_spec.rb'
+ - 'spec/services/ci/append_build_trace_service_spec.rb'
+ - 'spec/services/ci/archive_trace_service_spec.rb'
+ - 'spec/services/ci/build_report_result_service_spec.rb'
+ - 'spec/services/ci/compare_test_reports_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/cache_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/custom_config_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/include_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/merge_requests_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/needs_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parallel_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parameter_content_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/tags_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/destroy_secure_file_service_spec.rb'
+ - 'spec/services/ci/expire_pipeline_cache_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/pipelines/add_job_service_spec.rb'
+ - 'spec/services/ci/play_build_service_spec.rb'
+ - 'spec/services/ci/prepare_build_service_spec.rb'
+ - 'spec/services/ci/process_sync_events_service_spec.rb'
+ - 'spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - 'spec/services/ci/retry_job_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb'
+ - 'spec/services/ci/update_build_queue_service_spec.rb'
+ - 'spec/services/ci/update_pending_build_service_spec.rb'
+ - 'spec/services/clusters/agent_tokens/track_usage_service_spec.rb'
+ - 'spec/services/clusters/agents/delete_expired_events_service_spec.rb'
+ - 'spec/services/clusters/agents/refresh_authorization_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/destroy_service_spec.rb'
+ - 'spec/services/clusters/applications/install_service_spec.rb'
+ - 'spec/services/clusters/applications/patch_service_spec.rb'
+ - 'spec/services/clusters/applications/uninstall_service_spec.rb'
+ - 'spec/services/clusters/applications/update_service_spec.rb'
+ - 'spec/services/clusters/applications/upgrade_service_spec.rb'
+ - 'spec/services/clusters/aws/authorize_role_service_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/aws/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/aws/provision_service_spec.rb'
+ - 'spec/services/clusters/aws/verify_provision_status_service_spec.rb'
+ - 'spec/services/clusters/build_kubernetes_namespace_service_spec.rb'
+ - 'spec/services/clusters/create_service_spec.rb'
+ - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/clusters/management/validate_management_project_permissions_service_spec.rb'
+ - 'spec/services/clusters/update_service_spec.rb'
+ - 'spec/services/commits/tag_service_spec.rb'
+ - 'spec/services/compare_service_spec.rb'
+ - 'spec/services/concerns/merge_requests/assigns_merge_params_spec.rb'
+ - 'spec/services/concerns/rate_limited_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/database/consistency_check_service_spec.rb'
+ - 'spec/services/database/consistency_fix_service_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/deployments/older_deployments_drop_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/generate_image_versions_service_spec.rb'
+ - 'spec/services/design_management/move_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_position_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/discussions/resolve_service_spec.rb'
+ - 'spec/services/draft_notes/create_service_spec.rb'
+ - 'spec/services/draft_notes/destroy_service_spec.rb'
+ - 'spec/services/draft_notes/publish_service_spec.rb'
+ - 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
+ - 'spec/services/error_tracking/collect_error_service_spec.rb'
+ - 'spec/services/error_tracking/list_issues_service_spec.rb'
+ - 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/events/destroy_service_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/files/create_service_spec.rb'
+ - 'spec/services/git/base_hooks_service_spec.rb'
+ - 'spec/services/git/branch_hooks_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/git/tag_hooks_service_spec.rb'
+ - 'spec/services/git/tag_push_service_spec.rb'
+ - 'spec/services/git/wiki_push_service/change_spec.rb'
+ - 'spec/services/git/wiki_push_service_spec.rb'
+ - 'spec/services/google_cloud/generate_pipeline_service_spec.rb'
+ - 'spec/services/gpg_keys/create_service_spec.rb'
+ - 'spec/services/grafana/proxy_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/deploy_tokens/revoke_service_spec.rb'
+ - 'spec/services/groups/destroy_service_spec.rb'
+ - 'spec/services/groups/group_links/create_service_spec.rb'
+ - 'spec/services/groups/group_links/destroy_service_spec.rb'
+ - 'spec/services/groups/nested_create_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/groups/update_shared_runners_service_spec.rb'
+ - 'spec/services/ide/base_config_service_spec.rb'
+ - 'spec/services/ide/schemas_config_service_spec.rb'
+ - 'spec/services/ide/terminal_config_service_spec.rb'
+ - 'spec/services/import/bitbucket_server_service_spec.rb'
+ - 'spec/services/import/github_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
+ - 'spec/services/incident_management/incidents/create_service_spec.rb'
+ - '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'
+ - 'spec/services/issues/clone_service_spec.rb'
+ - 'spec/services/issues/close_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/issues/export_csv_service_spec.rb'
+ - 'spec/services/issues/move_service_spec.rb'
+ - 'spec/services/issues/referenced_merge_requests_service_spec.rb'
+ - 'spec/services/issues/related_branches_service_spec.rb'
+ - 'spec/services/issues/relative_position_rebalancing_service_spec.rb'
+ - 'spec/services/issues/reopen_service_spec.rb'
+ - 'spec/services/issues/set_crm_contacts_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/issues/zoom_link_service_spec.rb'
+ - 'spec/services/jira_connect_installations/destroy_service_spec.rb'
+ - 'spec/services/jira_connect_subscriptions/create_service_spec.rb'
+ - 'spec/services/keys/create_service_spec.rb'
+ - 'spec/services/keys/expiry_notification_service_spec.rb'
+ - 'spec/services/labels/create_service_spec.rb'
+ - 'spec/services/lfs/file_transformer_spec.rb'
+ - 'spec/services/lfs/locks_finder_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/lfs/unlock_file_service_spec.rb'
+ - 'spec/services/members/approve_access_request_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb'
+ - 'spec/services/merge_requests/after_create_service_spec.rb'
+ - 'spec/services/merge_requests/approval_service_spec.rb'
+ - 'spec/services/merge_requests/base_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
+ - 'spec/services/merge_requests/close_service_spec.rb'
+ - 'spec/services/merge_requests/create_from_issue_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/export_csv_service_spec.rb'
+ - 'spec/services/merge_requests/ff_merge_service_spec.rb'
+ - 'spec/services/merge_requests/get_urls_service_spec.rb'
+ - 'spec/services/merge_requests/link_lfs_objects_service_spec.rb'
+ - 'spec/services/merge_requests/merge_orchestration_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability_check_service_spec.rb'
+ - 'spec/services/merge_requests/push_options_handler_service_spec.rb'
+ - 'spec/services/merge_requests/rebase_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/merge_requests/reload_diffs_service_spec.rb'
+ - 'spec/services/merge_requests/reopen_service_spec.rb'
+ - 'spec/services/merge_requests/retarget_chain_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/toggle_attention_requested_service_spec.rb'
+ - 'spec/services/merge_requests/update_assignees_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/metrics/dashboard/annotations/create_service_spec.rb'
+ - 'spec/services/metrics/dashboard/annotations/delete_service_spec.rb'
+ - 'spec/services/metrics/dashboard/clone_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/cluster_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/default_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/panel_preview_service_spec.rb'
+ - 'spec/services/metrics/dashboard/pod_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/self_monitoring_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/system_dashboard_service_spec.rb'
+ - 'spec/services/metrics/dashboard/transient_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/update_dashboard_service_spec.rb'
+ - 'spec/services/metrics/users_starred_dashboards/create_service_spec.rb'
+ - 'spec/services/milestones/create_service_spec.rb'
+ - 'spec/services/milestones/destroy_service_spec.rb'
+ - 'spec/services/milestones/promote_service_spec.rb'
+ - 'spec/services/milestones/update_service_spec.rb'
+ - 'spec/services/namespace_settings/update_service_spec.rb'
+ - 'spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
+ - 'spec/services/note_summary_spec.rb'
+ - 'spec/services/notes/build_service_spec.rb'
+ - 'spec/services/notes/copy_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/notes/update_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/notification_recipients/builder/new_note_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_service_spec.rb'
+ - 'spec/services/packages/create_event_service_spec.rb'
+ - 'spec/services/packages/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_distribution_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/extract_metadata_service_spec.rb'
+ - 'spec/services/packages/debian/find_or_create_incoming_service_spec.rb'
+ - 'spec/services/packages/debian/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/debian/process_changes_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/maven/create_package_service_spec.rb'
+ - 'spec/services/packages/maven/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/create_plugins_xml_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/create_versions_xml_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/npm/create_package_service_spec.rb'
+ - 'spec/services/packages/npm/create_tag_service_spec.rb'
+ - 'spec/services/packages/nuget/metadata_extraction_service_spec.rb'
+ - 'spec/services/packages/nuget/search_service_spec.rb'
+ - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
+ - 'spec/services/packages/rubygems/dependency_resolver_service_spec.rb'
+ - 'spec/services/packages/rubygems/process_gem_service_spec.rb'
+ - 'spec/services/packages/terraform_module/create_package_service_spec.rb'
+ - 'spec/services/packages/update_tags_service_spec.rb'
+ - 'spec/services/pages/zip_directory_service_spec.rb'
+ - 'spec/services/personal_access_tokens/create_service_spec.rb'
+ - 'spec/services/personal_access_tokens/revoke_service_spec.rb'
+ - 'spec/services/post_receive_service_spec.rb'
+ - 'spec/services/preview_markdown_service_spec.rb'
+ - 'spec/services/projects/after_rename_service_spec.rb'
+ - 'spec/services/projects/autocomplete_service_spec.rb'
+ - 'spec/services/projects/branches_by_mode_service_spec.rb'
+ - 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
+ - '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/create_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/download_service_spec.rb'
+ - 'spec/services/projects/enable_deploy_key_service_spec.rb'
+ - 'spec/services/projects/fork_service_spec.rb'
+ - 'spec/services/projects/git_deduplication_service_spec.rb'
+ - 'spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'spec/services/projects/group_links/update_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migration_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_service_spec.rb'
+ - 'spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/overwrite_project_service_spec.rb'
+ - 'spec/services/projects/participants_service_spec.rb'
+ - 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
+ - 'spec/services/projects/record_target_platforms_service_spec.rb'
+ - 'spec/services/projects/transfer_service_spec.rb'
+ - 'spec/services/projects/unlink_fork_service_spec.rb'
+ - 'spec/services/projects/update_pages_service_spec.rb'
+ - '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'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/quick_actions/target_service_spec.rb'
+ - 'spec/services/releases/create_service_spec.rb'
+ - 'spec/services/releases/update_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'spec/services/search/global_service_spec.rb'
+ - 'spec/services/search/group_service_spec.rb'
+ - 'spec/services/search/snippet_service_spec.rb'
+ - 'spec/services/search_service_spec.rb'
+ - 'spec/services/security/ci_configuration/sast_parser_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/service_ping/submit_service_ping_service_spec.rb'
+ - 'spec/services/snippets/destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/spam/akismet_mark_as_spam_service_spec.rb'
+ - 'spec/services/spam/akismet_service_spec.rb'
+ - 'spec/services/spam/ham_service_spec.rb'
+ - 'spec/services/spam/spam_action_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/services/static_site_editor/config_service_spec.rb'
+ - 'spec/services/submodules/update_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/system_notes/commit_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/tasks_to_be_done/base_service_spec.rb'
+ - 'spec/services/terraform/remote_state_handler_spec.rb'
+ - 'spec/services/test_hooks/project_service_spec.rb'
+ - 'spec/services/test_hooks/system_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/two_factor/destroy_service_spec.rb'
+ - 'spec/services/upload_service_spec.rb'
+ - 'spec/services/user_preferences/update_service_spec.rb'
+ - 'spec/services/users/activity_service_spec.rb'
+ - 'spec/services/users/approve_service_spec.rb'
+ - 'spec/services/users/ban_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/services/users/migrate_to_ghost_user_service_spec.rb'
+ - 'spec/services/users/refresh_authorized_projects_service_spec.rb'
+ - 'spec/services/users/reject_service_spec.rb'
+ - 'spec/services/users/set_status_service_spec.rb'
+ - 'spec/services/users/unban_service_spec.rb'
+ - 'spec/services/users/update_canonical_email_service_spec.rb'
+ - 'spec/services/users/update_service_spec.rb'
+ - 'spec/services/users/upsert_credit_card_validation_service_spec.rb'
+ - 'spec/services/users/validate_manual_otp_service_spec.rb'
+ - 'spec/services/users/validate_push_otp_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/services/web_hook_service_spec.rb'
+ - 'spec/services/web_hooks/log_execution_service_spec.rb'
+ - 'spec/services/wiki_pages/base_service_spec.rb'
+ - 'spec/services/wiki_pages/event_create_service_spec.rb'
+ - 'spec/services/wikis/create_attachment_service_spec.rb'
+ - 'spec/services/work_items/create_service_spec.rb'
+ - 'spec/services/x509_certificate_revoke_service_spec.rb'
+ - 'spec/support/banzai/reference_filter_shared_examples.rb'
+ - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'spec/support/redis/redis_new_instance_shared_examples.rb'
+ - 'spec/support/redis/redis_shared_examples.rb'
+ - 'spec/support/services/clusters/create_service_shared.rb'
+ - 'spec/support/services/deploy_token_shared_examples.rb'
+ - 'spec/support/services/issuable_import_csv_service_shared_examples.rb'
+ - 'spec/support/services/issuable_update_service_shared_examples.rb'
+ - 'spec/support/services/migrate_to_ghost_user_service_shared_examples.rb'
+ - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
+ - 'spec/support/shared_contexts/changes_access_checks_shared_context.rb'
+ - 'spec/support/shared_contexts/container_repositories_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/githubish_import_controller_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb'
+ - 'spec/support/shared_contexts/controllers/logging_shared_context.rb'
+ - 'spec/support/shared_contexts/csv_response_shared_context.rb'
+ - 'spec/support/shared_contexts/design_management_shared_contexts.rb'
+ - 'spec/support/shared_contexts/email_shared_context.rb'
+ - 'spec/support/shared_contexts/features/error_tracking_shared_context.rb'
+ - 'spec/support/shared_contexts/features/file_uploads_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/group_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/instance_and_group_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/instance_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/project_integrations_jira_context.rb'
+ - 'spec/support/shared_contexts/features/integrations/project_integrations_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/group_projects_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/issues_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/finders/packages/npm/package_finder_shared_context.rb'
+ - 'spec/support/shared_contexts/finders/users_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/fixtures/analytics_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/requests/packages_shared_context.rb'
+ - 'spec/support/shared_contexts/graphql/resolvers/runners_resolver_shared_context.rb'
+ - 'spec/support/shared_contexts/issuable/merge_request_shared_context.rb'
+ - 'spec/support/shared_contexts/issuable/project_shared_context.rb'
+ - 'spec/support/shared_contexts/json_response_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/api/helpers/packages/dependency_proxy_helpers_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/client_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/client_stubs_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/container_registry/tags_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/import_export/project/rake_task_object_storage_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/import_export/relation_tree_restorer_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb'
+ - 'spec/support/shared_contexts/mailers/notify_shared_context.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'spec/support/shared_contexts/merge_request_create_shared_context.rb'
+ - 'spec/support/shared_contexts/merge_request_edit_shared_context.rb'
+ - 'spec/support/shared_contexts/merge_requests_allowing_collaboration_shared_context.rb'
+ - 'spec/support/shared_contexts/navbar_structure_context.rb'
+ - 'spec/support/shared_contexts/policies/group_policy_shared_context.rb'
+ - 'spec/support/shared_contexts/policies/project_policy_shared_context.rb'
+ - 'spec/support/shared_contexts/policies/project_policy_table_shared_context.rb'
+ - 'spec/support/shared_contexts/prometheus/alert_shared_context.rb'
+ - 'spec/support/shared_contexts/rack_attack_shared_context.rb'
+ - 'spec/support/shared_contexts/read_ci_configuration_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/debian_repository_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/go_modules_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/graphql/group_and_project_boards_query_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/graphql/jira_import/jira_projects_context.rb'
+ - 'spec/support/shared_contexts/requests/api/helm_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/npm_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/nuget_packages_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/workhorse_shared_context.rb'
+ - 'spec/support/shared_contexts/security_and_compliance_permissions_shared_context.rb'
+ - 'spec/support/shared_contexts/sentry_error_tracking_shared_context.rb'
+ - 'spec/support/shared_contexts/serializers/group_group_link_shared_context.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb'
+ - 'spec/support/shared_contexts/session_shared_context.rb'
+ - 'spec/support/shared_contexts/single_change_access_checks_shared_context.rb'
+ - 'spec/support/shared_contexts/spam_constants.rb'
+ - 'spec/support/shared_contexts/unique_ip_check_shared_context.rb'
+ - 'spec/support/shared_contexts/upload_type_check_shared_context.rb'
+ - 'spec/support/shared_contexts/url_shared_context.rb'
+ - 'spec/support/shared_examples/banzai/filters/inline_embeds_shared_examples.rb'
+ - 'spec/support/shared_examples/banzai/filters/inline_metrics_redactor_shared_examples.rb'
+ - 'spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/clusters_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/hotlink_interceptor_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/milestone_tabs_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/uploads_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/variables_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/csp.rb'
+ - 'spec/support/shared_examples/features/access_tokens_shared_examples.rb'
+ - 'spec/support/shared_examples/features/archive_download_buttons_shared_examples.rb'
+ - 'spec/support/shared_examples/features/board_sidebar_labels_examples.rb'
+ - 'spec/support/shared_examples/features/project_features_apply_to_issuables_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_due_date_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_labels_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar/sidebar_milestone_shared_examples.rb'
+ - 'spec/support/shared_examples/features/sidebar_shared_examples.rb'
+ - 'spec/support/shared_examples/features/snippets_shared_examples.rb'
+ - 'spec/support/shared_examples/features/variable_list_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_asciidoc_page_with_includes_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_pages_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/assignees_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages/debian/distributions_finder_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/snippet_visibility_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/connection_redaction_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/label_fields.rb'
+ - 'spec/support/shared_examples/graphql/mutations/issues/permission_check_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/merge_requests/permission_check_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/notes_on_noteables_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/resolves_issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/spam_protection_shared_examples.rb'
+ - 'spec/support/shared_examples/helm_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/api/internal_base_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/cache_helpers_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/import_export/relation_factory_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/multipart_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_confidential_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_results_sorted_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/search_state_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/metrics_middleware_with_worker_attribution_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/chat_integration_shared_examples.rb'
+ - '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'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/timebox_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_positionable_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
+ - 'spec/support/shared_examples/models/project_latest_successful_build_for_shared_examples.rb'
+ - 'spec/support/shared_examples/models/relative_positioning_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/namespaces/traversal_scope_examples.rb'
+ - 'spec/support/shared_examples/path_extraction_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/project_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/policies/resource_access_token_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/commit/tag_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/clone_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/create_merge_request_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/move_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/award_emoji_todo_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_common_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/discussions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/boards/update_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/create_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/read_only_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/issues_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/multiple_and_scoped_issue_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/read_user_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repositories_shared_context.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/status_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/clusters/certificate_based_clusters_feature_flag_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/lfs_http_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/releases_shared_examples.rb'
+ - 'spec/support/shared_examples/routing/git_http_routing_shared_examples.rb'
+ - 'spec/support/shared_examples/sends_git_audit_streaming_event_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/diff_file_entity_shared_examples.rb'
+ - 'spec/support/shared_examples/serializers/note_entity_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/alert_management_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/update_boards_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_shared_examples.rb'
+ - 'spec/support/shared_examples/services/jira_import/user_mapper_services_shared_examples.rb'
+ - 'spec/support/shared_examples/services/merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/services/metrics/dashboard_shared_examples.rb'
+ - 'spec/support/shared_examples/services/notification_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb'
+ - 'spec/support/shared_examples/services/schedule_bulk_repository_shard_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/updating_mentions_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb'
+ - 'spec/support/shared_examples/snippet_blob_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/validators/url_validator_shared_examples.rb'
+ - 'spec/support/shared_examples/views/pipeline_status_changes_email.rb'
+ - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/project_export_shared_examples.rb'
+ - 'spec/support_specs/database/multiple_databases_spec.rb'
+ - 'spec/support_specs/helpers/migrations_helpers_spec.rb'
+ - 'spec/support_specs/helpers/stub_feature_flags_spec.rb'
+ - 'spec/tasks/cache/clear/redis_spec.rb'
+ - 'spec/tasks/dev_rake_spec.rb'
+ - 'spec/tasks/gettext_rake_spec.rb'
+ - 'spec/tasks/gitlab/artifacts/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/cleanup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db/validate_config_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/dependency_proxy/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/gitaly_rake_spec.rb'
+ - 'spec/tasks/gitlab/lfs/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/packages/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/pages_rake_spec.rb'
+ - 'spec/tasks/gitlab/storage_rake_spec.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/tasks/gitlab/terraform/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
+ - 'spec/tasks/gitlab/user_management_rake_spec.rb'
+ - 'spec/tasks/gitlab/workhorse_rake_spec.rb'
+ - 'spec/tooling/danger/feature_flag_spec.rb'
+ - 'spec/tooling/danger/project_helper_spec.rb'
+ - 'spec/tooling/lib/tooling/parallel_rspec_runner_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
+ - 'spec/uploaders/attachment_uploader_spec.rb'
+ - 'spec/uploaders/avatar_uploader_spec.rb'
+ - 'spec/uploaders/content_type_whitelist_spec.rb'
+ - 'spec/uploaders/dependency_proxy/file_uploader_spec.rb'
+ - 'spec/uploaders/design_management/design_v432x230_uploader_spec.rb'
+ - 'spec/uploaders/external_diff_uploader_spec.rb'
+ - 'spec/uploaders/favicon_uploader_spec.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/import_export_uploader_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/uploaders/lfs_object_uploader_spec.rb'
+ - 'spec/uploaders/namespace_file_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/component_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/distribution_release_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/package_file_uploader_spec.rb'
+ - 'spec/uploaders/personal_file_uploader_spec.rb'
+ - 'spec/uploaders/terraform/state_uploader_spec.rb'
+ - 'spec/uploaders/workers/object_storage/background_move_worker_spec.rb'
+ - 'spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb'
+ - 'spec/validators/addressable_url_validator_spec.rb'
+ - 'spec/validators/array_members_validator_spec.rb'
+ - 'spec/validators/cron_validator_spec.rb'
+ - 'spec/validators/devise_email_validator_spec.rb'
+ - 'spec/validators/future_date_validator_spec.rb'
+ - 'spec/validators/import/gitlab_projects/remote_file_validator_spec.rb'
+ - 'spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/_package_registry.html.haml_spec.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'spec/views/admin/sessions/new.html.haml_spec.rb'
+ - 'spec/views/admin/sessions/two_factor.html.haml_spec.rb'
+ - 'spec/views/ci/status/_badge.html.haml_spec.rb'
+ - 'spec/views/ci/status/_icon.html.haml_spec.rb'
+ - 'spec/views/devise/shared/_signup_box.html.haml_spec.rb'
+ - 'spec/views/events/event/_push.html.haml_spec.rb'
+ - 'spec/views/groups/_home_panel.html.haml_spec.rb'
+ - 'spec/views/groups/edit.html.haml_spec.rb'
+ - 'spec/views/layouts/_header_search.html.haml_spec.rb'
+ - 'spec/views/layouts/application.html.haml_spec.rb'
+ - 'spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/views/notify/changed_milestone_email.html.haml_spec.rb'
+ - 'spec/views/profiles/keys/_key.html.haml_spec.rb'
+ - 'spec/views/profiles/preferences/show.html.haml_spec.rb'
+ - 'spec/views/projects/_home_panel.html.haml_spec.rb'
+ - 'spec/views/projects/commit/show.html.haml_spec.rb'
+ - 'spec/views/projects/commits/show.html.haml_spec.rb'
+ - 'spec/views/projects/edit.html.haml_spec.rb'
+ - 'spec/views/projects/empty.html.haml_spec.rb'
+ - 'spec/views/projects/hooks/edit.html.haml_spec.rb'
+ - 'spec/views/projects/hooks/index.html.haml_spec.rb'
+ - 'spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb'
+ - 'spec/views/projects/services/edit.html.haml_spec.rb'
+ - 'spec/views/projects/settings/operations/show.html.haml_spec.rb'
+ - 'spec/views/projects/tags/index.html.haml_spec.rb'
+ - 'spec/views/projects/tree/show.html.haml_spec.rb'
+ - 'spec/views/search/_results.html.haml_spec.rb'
+ - 'spec/views/search/show.html.haml_spec.rb'
+ - 'spec/views/shared/access_tokens/_table.html.haml_spec.rb'
+ - 'spec/views/shared/issuable/_sidebar.html.haml_spec.rb'
+ - 'spec/views/shared/milestones/_issuable.html.haml_spec.rb'
+ - 'spec/views/shared/projects/_list.html.haml_spec.rb'
+ - 'spec/views/shared/snippets/_snippet.html.haml_spec.rb'
+ - 'spec/views/shared/wikis/_sidebar.html.haml_spec.rb'
+ - 'spec/workers/admin_email_worker_spec.rb'
+ - 'spec/workers/analytics/usage_trends/count_job_trigger_worker_spec.rb'
+ - 'spec/workers/authorized_keys_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/project_recalculate_per_user_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/project_recalculate_worker_spec.rb'
+ - 'spec/workers/authorized_project_update/user_refresh_over_user_range_worker_spec.rb'
+ - 'spec/workers/bulk_imports/entity_worker_spec.rb'
+ - 'spec/workers/ci/build_prepare_worker_spec.rb'
+ - 'spec/workers/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/cluster_update_app_worker_spec.rb'
+ - 'spec/workers/clusters/agents/delete_expired_events_worker_spec.rb'
+ - 'spec/workers/clusters/applications/activate_service_worker_spec.rb'
+ - 'spec/workers/clusters/applications/deactivate_service_worker_spec.rb'
+ - 'spec/workers/clusters/applications/wait_for_uninstall_app_worker_spec.rb'
+ - 'spec/workers/concerns/application_worker_spec.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
+ - 'spec/workers/container_expiration_policy_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/enqueuer_worker_spec.rb'
+ - 'spec/workers/container_registry/migration/guard_worker_spec.rb'
+ - 'spec/workers/create_commit_signature_worker_spec.rb'
+ - 'spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb'
+ - 'spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb'
+ - 'spec/workers/dependency_proxy/image_ttl_group_policy_worker_spec.rb'
+ - 'spec/workers/deployments/link_merge_request_worker_spec.rb'
+ - '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/irker_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'
+ - 'spec/workers/namespaceless_project_destroy_worker_spec.rb'
+ - 'spec/workers/packages/composer/cache_update_worker_spec.rb'
+ - 'spec/workers/packages/go/sync_packages_worker_spec.rb'
+ - 'spec/workers/packages/maven/metadata/sync_worker_spec.rb'
+ - 'spec/workers/packages/nuget/extraction_worker_spec.rb'
+ - 'spec/workers/packages/rubygems/extraction_worker_spec.rb'
+ - 'spec/workers/pages_domain_removal_cron_worker_spec.rb'
+ - 'spec/workers/post_receive_spec.rb'
+ - 'spec/workers/project_export_worker_spec.rb'
+ - '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'
+ - 'spec/workers/remove_unaccepted_member_invites_worker_spec.rb'
+ - 'spec/workers/repository_fork_worker_spec.rb'
+ - 'spec/workers/stuck_merge_jobs_worker_spec.rb'
+ - 'spec/workers/x509_issuer_crl_check_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml
new file mode 100644
index 00000000000..3b4d463ad69
--- /dev/null
+++ b/.rubocop_todo/rspec/expect_change.yml
@@ -0,0 +1,635 @@
+---
+# Cop supports --auto-correct.
+RSpec/ExpectChange:
+ # Offense count: 1707
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/admin/applications_controller_spec.rb'
+ - 'ee/spec/controllers/ee/groups_controller_spec.rb'
+ - 'ee/spec/controllers/ee/omniauth_callbacks_controller_spec.rb'
+ - 'ee/spec/controllers/ee/registrations_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epic_issues_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics/notes_controller_spec.rb'
+ - 'ee/spec/controllers/groups/epics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/issues_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_providers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/scim_oauth_controller_spec.rb'
+ - 'ee/spec/controllers/oauth/applications_controller_spec.rb'
+ - 'ee/spec/controllers/passwords_controller_spec.rb'
+ - 'ee/spec/controllers/profiles/keys_controller_spec.rb'
+ - 'ee/spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'ee/spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'ee/spec/controllers/projects/path_locks_controller_spec.rb'
+ - 'ee/spec/controllers/projects/protected_environments_controller_spec.rb'
+ - 'ee/spec/controllers/projects/repositories_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/vulnerabilities/notes_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/features/groups/group_settings_spec.rb'
+ - 'ee/spec/features/projects_spec.rb'
+ - 'ee/spec/features/users/login_spec.rb'
+ - 'ee/spec/graphql/ee/mutations/ci/runner/update_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_scanner_profiles/delete_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/delete_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_validations/revoke_spec.rb'
+ - 'ee/spec/helpers/paid_feature_callout_helper_spec.rb'
+ - 'ee/spec/lib/analytics/group_activity_calculator_spec.rb'
+ - 'ee/spec/lib/audit/changes_spec.rb'
+ - 'ee/spec/lib/audit/external_status_check_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/group_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/issues_pipeline_spec.rb'
+ - 'ee/spec/lib/bulk_imports/projects/pipelines/push_rule_pipeline_spec.rb'
+ - 'ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/group_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_ci_cd_setting_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_feature_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/project_setting_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/create_security_setting_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/repo_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/scim/deprovision_service_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/identity_linker_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/ldap_certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/migrate_requirements_to_work_items_spec.rb'
+ - 'ee/spec/lib/gitlab/mirror_spec.rb'
+ - 'ee/spec/migrations/20220411173544_cleanup_orphans_approval_project_rules_spec.rb'
+ - 'ee/spec/models/ci/bridge_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/concerns/geo/replicable_model_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/dast/profile_schedule_spec.rb'
+ - 'ee/spec/models/dast_site_spec.rb'
+ - 'ee/spec/models/ee/event_spec.rb'
+ - 'ee/spec/models/ee/lfs_object_spec.rb'
+ - 'ee/spec/models/ee/merge_request_diff_spec.rb'
+ - 'ee/spec/models/ee/pages_deployment_spec.rb'
+ - 'ee/spec/models/elastic/index_setting_spec.rb'
+ - 'ee/spec/models/elastic/migration_record_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/geo/project_registry_spec.rb'
+ - 'ee/spec/models/geo/secondary_usage_data_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/status_page/published_incident_spec.rb'
+ - 'ee/spec/models/vulnerabilities/export_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/requests/api/ci/pipelines_spec.rb'
+ - 'ee/spec/requests/api/epic_issues_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/geo_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/external_audit_event_destinations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/external_audit_event_destinations/destroy_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/audit_events/external_audit_event_destinations/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_scanner_profiles/delete_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_tokens/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_validations/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/dast_site_validations/revoke_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/requirements_management/update_requirement_spec.rb'
+ - 'ee/spec/requests/api/group_push_rule_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/invitations_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/project_mirror_spec.rb'
+ - 'ee/spec/requests/api/project_push_rule_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/releases_spec.rb'
+ - 'ee/spec/requests/api/repositories_spec.rb'
+ - 'ee/spec/requests/api/todos_spec.rb'
+ - 'ee/spec/requests/api/users_spec.rb'
+ - 'ee/spec/requests/ee/projects/deploy_tokens_controller_spec.rb'
+ - 'ee/spec/requests/groups_controller_spec.rb'
+ - 'ee/spec/requests/smartcard_controller_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/audit/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_profiles/destroy_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_tokens/find_or_create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/find_or_create_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/revoke_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/site_validations/runner_service_spec.rb'
+ - 'ee/spec/services/application_settings/update_service_spec.rb'
+ - 'ee/spec/services/approval_rules/finalize_service_spec.rb'
+ - 'ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb'
+ - 'ee/spec/services/approval_rules/update_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/user_impersonation_group_audit_event_service_spec.rb'
+ - 'ee/spec/services/auto_merge/merge_train_service_spec.rb'
+ - 'ee/spec/services/boards/epics/create_service_spec.rb'
+ - 'ee/spec/services/boards/epics/move_service_spec.rb'
+ - 'ee/spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'ee/spec/services/ci/external_pull_requests/process_github_event_service_spec.rb'
+ - 'ee/spec/services/ci/process_build_service_spec.rb'
+ - 'ee/spec/services/ci/subscribe_bridge_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/create_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/destroy_service_spec.rb'
+ - 'ee/spec/services/compliance_management/frameworks/update_service_spec.rb'
+ - 'ee/spec/services/deployments/approval_service_spec.rb'
+ - 'ee/spec/services/deployments/auto_rollback_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/ee/members/create_service_spec.rb'
+ - 'ee/spec/services/ee/members/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/members/invite_service_spec.rb'
+ - 'ee/spec/services/ee/members/update_service_spec.rb'
+ - 'ee/spec/services/ee/merge_requests/update_service_spec.rb'
+ - 'ee/spec/services/ee/notes/quick_actions_service_spec.rb'
+ - 'ee/spec/services/ee/projects/deploy_tokens/create_service_spec.rb'
+ - 'ee/spec/services/ee/projects/deploy_tokens/destroy_service_spec.rb'
+ - 'ee/spec/services/ee/todos/destroy/entity_leave_service_spec.rb'
+ - 'ee/spec/services/ee/users/approve_service_spec.rb'
+ - 'ee/spec/services/ee/users/block_service_spec.rb'
+ - 'ee/spec/services/ee/users/reject_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/elastic/indexing_control_service_spec.rb'
+ - 'ee/spec/services/emails/create_service_spec.rb'
+ - 'ee/spec/services/emails/destroy_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epic_issues/destroy_service_spec.rb'
+ - 'ee/spec/services/epics/close_service_spec.rb'
+ - 'ee/spec/services/epics/create_service_spec.rb'
+ - 'ee/spec/services/epics/reopen_service_spec.rb'
+ - 'ee/spec/services/epics/update_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/create_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/destroy_service_spec.rb'
+ - 'ee/spec/services/external_status_checks/update_service_spec.rb'
+ - 'ee/spec/services/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'
+ - 'ee/spec/services/geo/repository_sync_service_spec.rb'
+ - 'ee/spec/services/group_saml/group_managed_accounts/transfer_membership_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/incident_management/pending_escalations/create_service_spec.rb'
+ - 'ee/spec/services/iterations/update_service_spec.rb'
+ - 'ee/spec/services/keys/create_service_spec.rb'
+ - 'ee/spec/services/lfs/lock_file_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/projects/transfer_service_spec.rb'
+ - 'ee/spec/services/projects/update_service_spec.rb'
+ - 'ee/spec/services/protected_environments/destroy_service_spec.rb'
+ - 'ee/spec/services/push_rules/create_or_update_service_spec.rb'
+ - 'ee/spec/services/requirements_management/create_requirement_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'ee/spec/services/resource_access_tokens/revoke_service_spec.rb'
+ - 'ee/spec/services/resource_events/change_weight_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/finding_map_spec.rb'
+ - 'ee/spec/services/security/ingestion/ingest_report_service_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_identifiers_spec.rb'
+ - 'ee/spec/services/security/ingestion/tasks/ingest_vulnerabilities_spec.rb'
+ - 'ee/spec/services/security/orchestration/assign_service_spec.rb'
+ - 'ee/spec/services/security/override_uuids_service_spec.rb'
+ - 'ee/spec/services/security/store_scan_service_spec.rb'
+ - 'ee/spec/services/start_pull_mirroring_service_spec.rb'
+ - 'ee/spec/services/system_notes/epics_service_spec.rb'
+ - 'ee/spec/services/system_notes/merge_train_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/services/todos/destroy/confidential_epic_service_spec.rb'
+ - 'ee/spec/services/users_ops_dashboard_projects/destroy_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/statistics/update_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/export_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_feedback/destroy_service_spec.rb'
+ - 'ee/spec/support/shared_contexts/audit_event_not_licensed_shared_context.rb'
+ - 'ee/spec/support/shared_examples/controllers/registrations/projects_controller_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/update_health_status_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/replicable_model_with_separate_table_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/group_saml/saml_provider/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/update_issuable_health_status_shared_examples.rb'
+ - 'ee/spec/tasks/geo/git_rake_spec.rb'
+ - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
+ - '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'
+ - 'spec/controllers/admin/runners_controller_spec.rb'
+ - 'spec/controllers/admin/spam_logs_controller_spec.rb'
+ - 'spec/controllers/admin/users_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/runners_controller_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/import/bitbucket_controller_spec.rb'
+ - 'spec/controllers/import/gitlab_controller_spec.rb'
+ - 'spec/controllers/jira_connect/events_controller_spec.rb'
+ - 'spec/controllers/ldap/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/profiles/gpg_keys_controller_spec.rb'
+ - 'spec/controllers/profiles/keys_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/mirrors_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/pages_domains_controller_spec.rb'
+ - 'spec/controllers/projects/runners_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/repositories/lfs_storage_controller_spec.rb'
+ - 'spec/controllers/sessions_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/controllers/uploads_controller_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/file_uploads/attachment_spec.rb'
+ - 'spec/features/file_uploads/git_lfs_spec.rb'
+ - 'spec/features/file_uploads/group_import_spec.rb'
+ - 'spec/features/file_uploads/project_import_spec.rb'
+ - 'spec/features/groups/import_export/import_file_spec.rb'
+ - 'spec/features/groups_spec.rb'
+ - 'spec/features/invites_spec.rb'
+ - 'spec/features/profiles/personal_access_tokens_spec.rb'
+ - 'spec/features/projects/import_export/import_file_spec.rb'
+ - 'spec/features/projects_spec.rb'
+ - 'spec/features/users/signup_spec.rb'
+ - 'spec/graphql/mutations/issues/set_severity_spec.rb'
+ - 'spec/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/graphql/mutations/timelogs/delete_spec.rb'
+ - 'spec/initializers/active_record_locking_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_pipeline_spec.rb'
+ - 'spec/lib/declarative_enum_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/identity_linker_spec.rb'
+ - 'spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_group_features_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_projects_with_coverage_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_u2f_webauthn_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_vulnerability_finding_links_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/checks/matching_merge_request_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/line_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/context_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/create_deployments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/ensure_environments_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/report_spec.rb'
+ - 'spec/lib/gitlab/ci/status/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/chunked_io_spec.rb'
+ - 'spec/lib/gitlab/config/entry/validatable_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/database/async_indexes/index_creator_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/reindex_action_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/fogbugz_import/importer_spec.rb'
+ - 'spec/lib/gitlab/git_access_project_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/releases_importer_spec.rb'
+ - 'spec/lib/gitlab/hashed_storage/migrator_spec.rb'
+ - 'spec/lib/gitlab/import/merge_request_creator_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/object_builder_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/issues/rebalancing/state_spec.rb'
+ - 'spec/lib/gitlab/jira_import/handle_labels_service_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/manifest_import/project_creator_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importer_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb'
+ - 'spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb'
+ - 'spec/lib/gitlab/middleware/request_context_spec.rb'
+ - 'spec/lib/gitlab/process_memory_cache/helper_spec.rb'
+ - 'spec/lib/gitlab/process_supervisor_spec.rb'
+ - 'spec/lib/gitlab/query_limiting_spec.rb'
+ - 'spec/lib/gitlab/reference_counter_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/issue_move_spec.rb'
+ - 'spec/lib/gitlab/word_diff/positions_counter_spec.rb'
+ - 'spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb'
+ - 'spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb'
+ - 'spec/migrations/20211117084814_migrate_remaining_u2f_registrations_spec.rb'
+ - 'spec/migrations/20220106111958_add_insert_or_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220106112043_add_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220124130028_dedup_runner_projects_spec.rb'
+ - 'spec/migrations/20220202105733_delete_service_template_records_spec.rb'
+ - 'spec/migrations/20220222192525_remove_null_releases_spec.rb'
+ - 'spec/migrations/backfill_cycle_analytics_aggregations_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_after_fixing_regression_with_new_users_emails_spec.rb'
+ - 'spec/migrations/populate_audit_event_streaming_verification_token_spec.rb'
+ - 'spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb'
+ - 'spec/migrations/remove_wiki_notes_spec.rb'
+ - 'spec/models/alert_management/alert_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/aggregation_spec.rb'
+ - 'spec/models/analytics/cycle_analytics/stage_event_hash_spec.rb'
+ - 'spec/models/broadcast_message_spec.rb'
+ - 'spec/models/chat_name_spec.rb'
+ - 'spec/models/ci/bridge_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/deleted_object_spec.rb'
+ - 'spec/models/ci/namespace_mirror_spec.rb'
+ - 'spec/models/ci/pipeline_schedule_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/ci/project_mirror_spec.rb'
+ - 'spec/models/ci/ref_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/commit_signatures/gpg_signature_spec.rb'
+ - 'spec/models/commit_signatures/x509_commit_signature_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/concerns/atomic_internal_id_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/delete_with_limit_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/resolvable_discussion_spec.rb'
+ - 'spec/models/concerns/resolvable_note_spec.rb'
+ - 'spec/models/concerns/routable_spec.rb'
+ - 'spec/models/concerns/schedulable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/customer_relations/issue_contact_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/experiment_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/hooks/web_hook_spec.rb'
+ - 'spec/models/incident_management/timeline_event_spec.rb'
+ - 'spec/models/integrations/prometheus_spec.rb'
+ - 'spec/models/internal_id_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/jira_import_state_spec.rb'
+ - 'spec/models/lfs_objects_project_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/plan_spec.rb'
+ - 'spec/models/project_auto_devops_spec.rb'
+ - 'spec/models/project_import_state_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/projects/build_artifacts_size_refresh_spec.rb'
+ - 'spec/models/projects/ci_feature_usage_spec.rb'
+ - 'spec/models/release_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/sent_notification_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/upload_spec.rb'
+ - 'spec/models/user_interacted_project_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/user_status_spec.rb'
+ - 'spec/models/x509_certificate_spec.rb'
+ - 'spec/models/x509_issuer_spec.rb'
+ - 'spec/requests/abuse_reports_controller_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_trace_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/deploy_keys_spec.rb'
+ - 'spec/requests/api/deploy_tokens_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/remove_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb'
+ - 'spec/requests/api/graphql/mutations/boards/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/labels/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/releases/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/destroy_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/update_spec.rb'
+ - 'spec/requests/api/group_import_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/system_hooks_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/groups/settings/access_tokens_controller_spec.rb'
+ - 'spec/requests/import/gitlab_groups_controller_spec.rb'
+ - 'spec/requests/product_analytics/collector_app_spec.rb'
+ - 'spec/requests/projects/issue_links_controller_spec.rb'
+ - 'spec/requests/projects/settings/access_tokens_controller_spec.rb'
+ - 'spec/services/alert_management/alerts/todo/create_service_spec.rb'
+ - 'spec/services/alert_management/alerts/update_service_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/authorized_project_update/project_recalculate_per_user_service_spec.rb'
+ - 'spec/services/authorized_project_update/project_recalculate_service_spec.rb'
+ - 'spec/services/award_emojis/add_service_spec.rb'
+ - 'spec/services/award_emojis/copy_service_spec.rb'
+ - 'spec/services/award_emojis/destroy_service_spec.rb'
+ - 'spec/services/award_emojis/toggle_service_spec.rb'
+ - 'spec/services/bulk_imports/create_service_spec.rb'
+ - 'spec/services/bulk_imports/relation_export_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/update_unknown_locked_status_service_spec.rb'
+ - 'spec/services/ci/play_build_service_spec.rb'
+ - 'spec/services/ci/process_build_service_spec.rb'
+ - 'spec/services/ci/retry_job_service_spec.rb'
+ - 'spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'spec/services/ci/run_scheduled_build_service_spec.rb'
+ - 'spec/services/ci/update_build_queue_service_spec.rb'
+ - 'spec/services/ci/update_build_state_service_spec.rb'
+ - 'spec/services/clusters/destroy_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/deployments/create_for_build_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/design_management/copy_design_collection/copy_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/design_user_notes_count_service_spec.rb'
+ - 'spec/services/design_management/save_designs_service_spec.rb'
+ - 'spec/services/draft_notes/destroy_service_spec.rb'
+ - 'spec/services/draft_notes/publish_service_spec.rb'
+ - 'spec/services/emails/create_service_spec.rb'
+ - 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/event_create_service_spec.rb'
+ - 'spec/services/feature_flags/create_service_spec.rb'
+ - 'spec/services/feature_flags/destroy_service_spec.rb'
+ - 'spec/services/feature_flags/update_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/import_export/import_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/groups/update_statistics_service_spec.rb'
+ - 'spec/services/incident_management/timeline_events/update_service_spec.rb'
+ - 'spec/services/issuable/common_system_notes_service_spec.rb'
+ - 'spec/services/issues/close_service_spec.rb'
+ - 'spec/services/issues/create_service_spec.rb'
+ - 'spec/services/issues/move_service_spec.rb'
+ - 'spec/services/issues/reopen_service_spec.rb'
+ - 'spec/services/issues/update_service_spec.rb'
+ - 'spec/services/jira_import/start_import_service_spec.rb'
+ - 'spec/services/labels/promote_service_spec.rb'
+ - 'spec/services/lfs/lock_file_service_spec.rb'
+ - 'spec/services/merge_requests/add_spent_time_service_spec.rb'
+ - 'spec/services/merge_requests/close_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/ff_merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'spec/services/merge_requests/post_merge_service_spec.rb'
+ - 'spec/services/merge_requests/push_options_handler_service_spec.rb'
+ - 'spec/services/merge_requests/reopen_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/milestones/destroy_service_spec.rb'
+ - 'spec/services/namespace_settings/update_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/mark_package_for_destruction_service_spec.rb'
+ - 'spec/services/packages/update_package_file_service_spec.rb'
+ - 'spec/services/pages/delete_service_spec.rb'
+ - 'spec/services/pages/destroy_deployments_service_spec.rb'
+ - 'spec/services/pages_domains/retry_acme_order_service_spec.rb'
+ - 'spec/services/personal_access_tokens/last_used_service_spec.rb'
+ - 'spec/services/projects/auto_devops/disable_service_spec.rb'
+ - 'spec/services/projects/destroy_service_spec.rb'
+ - 'spec/services/projects/fetch_statistics_increment_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migration_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/record_target_platforms_service_spec.rb'
+ - 'spec/services/projects/update_pages_service_spec.rb'
+ - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/releases/create_service_spec.rb'
+ - 'spec/services/releases/destroy_service_spec.rb'
+ - 'spec/services/resource_access_tokens/create_service_spec.rb'
+ - 'spec/services/serverless/associate_domain_service_spec.rb'
+ - 'spec/services/service_ping/submit_service_ping_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/snippets/destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/spam/ham_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/timelogs/delete_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/confidential_issue_service_spec.rb'
+ - 'spec/services/todos/destroy/design_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/todos/destroy/group_private_service_spec.rb'
+ - 'spec/services/todos/destroy/project_private_service_spec.rb'
+ - 'spec/services/todos/destroy/unauthorized_features_service_spec.rb'
+ - 'spec/services/users/approve_service_spec.rb'
+ - 'spec/services/users/ban_service_spec.rb'
+ - 'spec/services/users/batch_status_cleaner_service_spec.rb'
+ - 'spec/services/users/block_service_spec.rb'
+ - 'spec/services/users/set_status_service_spec.rb'
+ - 'spec/services/users/unban_service_spec.rb'
+ - 'spec/services/users/update_highest_member_role_service_spec.rb'
+ - 'spec/services/users/update_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/services/web_hooks/destroy_service_spec.rb'
+ - 'spec/support/services/deploy_token_shared_examples.rb'
+ - 'spec/support/services/issuable_import_csv_service_shared_examples.rb'
+ - 'spec/support/shared_contexts/email_shared_context.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/variables_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/mutations/boards_create_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/notes_creation_shared_examples.rb'
+ - 'spec/support/shared_examples/incident_management/issuable_escalation_statuses/build_examples.rb'
+ - 'spec/support/shared_examples/loose_foreign_keys/have_loose_foreign_key.rb'
+ - 'spec/support/shared_examples/models/concerns/bulk_insert_safe_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/cron_schedulable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/incident_management/escalatable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/limitable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/repository_storage_movable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
+ - 'spec/support/shared_examples/models/with_uploads_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/access_tokens_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/mutations/destroy_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/read_only_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/services/common_system_notes_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_expiration_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb'
+ - 'spec/support/shared_examples/services/merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/services/rate_limited_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb'
+ - 'spec/support/shared_examples/services/updating_mentions_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/destroy_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/upload_type_shared_examples.rb'
+ - 'spec/tasks/cache/clear/redis_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/records_uploads_spec.rb'
+ - 'spec/workers/destroy_pages_deployments_worker_spec.rb'
+ - 'spec/workers/environments/auto_delete_cron_worker_spec.rb'
+ - 'spec/workers/gitlab/phabricator_import/base_worker_spec.rb'
+ - 'spec/workers/group_import_worker_spec.rb'
+ - 'spec/workers/incident_management/process_alert_worker_v2_spec.rb'
+ - 'spec/workers/new_issue_worker_spec.rb'
+ - 'spec/workers/new_merge_request_worker_spec.rb'
+ - 'spec/workers/pages_domain_removal_cron_worker_spec.rb'
+ - 'spec/workers/projects/post_creation_worker_spec.rb'
+ - 'spec/workers/prune_old_events_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'
+ - 'spec/workers/remove_unaccepted_member_invites_worker_spec.rb'
+ - '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
new file mode 100644
index 00000000000..a015db8ae36
--- /dev/null
+++ b/.rubocop_todo/rspec/expect_in_hook.yml
@@ -0,0 +1,544 @@
+---
+RSpec/ExpectInHook:
+ # Offense count: 1074
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/ee/projects/merge_requests/content_controller_spec.rb'
+ - 'ee/spec/controllers/groups/analytics/productivity_analytics_controller_spec.rb'
+ - 'ee/spec/controllers/groups/seat_usage_controller_spec.rb'
+ - 'ee/spec/controllers/projects/boards_controller_spec.rb'
+ - 'ee/spec/controllers/projects/settings/slacks_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_controller_spec.rb'
+ - 'ee/spec/controllers/registrations/groups_projects_controller_spec.rb'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/controllers/trials_controller_spec.rb'
+ - 'ee/spec/features/boards/new_issue_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb'
+ - 'ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
+ - 'ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb'
+ - 'ee/spec/features/registrations/combined_registration_spec.rb'
+ - 'ee/spec/features/registrations/trial_during_signup_flow_spec.rb'
+ - 'ee/spec/features/signup_spec.rb'
+ - 'ee/spec/features/trial_registrations/company_information_spec.rb'
+ - 'ee/spec/features/trials/capture_lead_spec.rb'
+ - 'ee/spec/features/trials/select_namespace_spec.rb'
+ - 'ee/spec/finders/license_template_finder_spec.rb'
+ - 'ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/graphql/mutations/gitlab_subscriptions/activate_spec.rb'
+ - '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'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/gon_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/smartcard/certificate_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - '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/mirror_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/generator_spec.rb'
+ - 'ee/spec/lib/gitlab/subscription_portal/clients/graphql_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/build_type_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/distribution_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/lucene_version_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/version_metric_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/concerns/ee/issuable_spec.rb'
+ - 'ee/spec/models/concerns/geo/replicable_model_spec.rb'
+ - 'ee/spec/models/container_repository_spec.rb'
+ - 'ee/spec/models/dora/daily_metrics_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/presenters/group_member_presenter_spec.rb'
+ - 'ee/spec/requests/api/geo_spec.rb'
+ - 'ee/spec/requests/api/graphql/ci/runner_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/groups/analytics/devops_adoption_controller_spec.rb'
+ - 'ee/spec/requests/omniauth_kerberos_spnego_spec.rb'
+ - 'ee/spec/services/analytics/cycle_analytics/stages/update_service_spec.rb'
+ - 'ee/spec/services/app_sec/dast/profiles/update_service_spec.rb'
+ - 'ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb'
+ - 'ee/spec/services/ci/minutes/batch_reset_service_spec.rb'
+ - 'ee/spec/services/ci/runners/assign_runner_service_spec.rb'
+ - 'ee/spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'ee/spec/services/ci/runners/unassign_runner_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'ee/spec/services/ee/issues/update_service_spec.rb'
+ - 'ee/spec/services/ee/post_receive_service_spec.rb'
+ - 'ee/spec/services/ee/protected_branches/destroy_service_spec.rb'
+ - 'ee/spec/services/geo/blob_download_service_spec.rb'
+ - 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
+ - 'ee/spec/services/geo/registry_consistency_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/fetch_subscription_plans_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/plan_upgrade_service_spec.rb'
+ - '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'
+ - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/status_page/reference_links_examples.rb'
+ - 'ee/spec/tasks/gitlab/license_rake_spec.rb'
+ - 'ee/spec/tasks/gitlab/spdx_rake_spec.rb'
+ - 'ee/spec/workers/analytics/cycle_analytics/consistency_worker_spec.rb'
+ - 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
+ - 'ee/spec/workers/elastic_index_bulk_cron_worker_spec.rb'
+ - 'ee/spec/workers/elastic_indexing_control_worker_spec.rb'
+ - 'ee/spec/workers/elastic_remove_expired_namespace_subscriptions_from_index_cron_worker_spec.rb'
+ - 'ee/spec/workers/geo/secondary/registry_consistency_worker_spec.rb'
+ - 'ee/spec/workers/geo/verification_state_backfill_worker_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/jira/jira_basic_integration_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_to_secondary_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'spec/commands/metrics_server/metrics_server_spec.rb'
+ - 'spec/controllers/autocomplete_controller_spec.rb'
+ - 'spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/json_format_actions_support_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/rest_api_actions_support_spec.rb'
+ - 'spec/controllers/groups/boards_controller_spec.rb'
+ - 'spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb'
+ - 'spec/controllers/profiles/two_factor_auths_controller_spec.rb'
+ - 'spec/controllers/projects/blob_controller_spec.rb'
+ - 'spec/controllers/projects/boards_controller_spec.rb'
+ - 'spec/controllers/projects/commits_controller_spec.rb'
+ - 'spec/controllers/projects/compare_controller_spec.rb'
+ - 'spec/controllers/projects/deployments_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/content_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/notes_controller_spec.rb'
+ - 'spec/controllers/projects/prometheus/alerts_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/settings/operations_controller_spec.rb'
+ - 'spec/controllers/projects/tree_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/features/admin/admin_mode/login_spec.rb'
+ - 'spec/features/admin/admin_projects_spec.rb'
+ - 'spec/features/boards/issue_ordering_spec.rb'
+ - 'spec/features/boards/new_issue_spec.rb'
+ - 'spec/features/boards/reload_boards_on_browser_back_spec.rb'
+ - 'spec/features/dashboard/groups_list_spec.rb'
+ - 'spec/features/expand_collapse_diffs_spec.rb'
+ - 'spec/features/file_uploads/maven_package_spec.rb'
+ - 'spec/features/groups/container_registry_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/issues/filtered_search/dropdown_hint_spec.rb'
+ - 'spec/features/markdown/markdown_spec.rb'
+ - 'spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb'
+ - 'spec/features/merge_request/user_sees_versions_spec.rb'
+ - 'spec/features/oauth_login_spec.rb'
+ - 'spec/features/profiles/password_spec.rb'
+ - 'spec/features/projects/clusters/gcp_spec.rb'
+ - 'spec/features/projects/container_registry_spec.rb'
+ - 'spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb'
+ - 'spec/features/projects/files/user_creates_files_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/show/user_sees_git_instructions_spec.rb'
+ - 'spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb'
+ - 'spec/features/projects/user_sees_sidebar_spec.rb'
+ - 'spec/features/protected_branches_spec.rb'
+ - 'spec/features/snippets/spam_snippets_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/graphql/mutations/design_management/move_spec.rb'
+ - 'spec/helpers/commits_helper_spec.rb'
+ - 'spec/helpers/invite_members_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/initializers/omniauth_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/lib/api/entities/merge_request_changes_spec.rb'
+ - 'spec/lib/api/helpers/variables_helpers_spec.rb'
+ - 'spec/lib/api/helpers_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/banzai/reference_redactor_spec.rb'
+ - 'spec/lib/bulk_imports/ndjson_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/file_size_validator_spec.rb'
+ - 'spec/lib/gitlab/alert_management/fingerprint_spec.rb'
+ - 'spec/lib/gitlab/auth/request_authenticator_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_server_import/importer_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/checks/changes_access_spec.rb'
+ - 'spec/lib/gitlab/checks/matching_merge_request_spec.rb'
+ - 'spec/lib/gitlab/checks/single_change_access_spec.rb'
+ - 'spec/lib/gitlab/ci/artifact_file_reader_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules/rule/clause/exists_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/ports_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/command_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/archive_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/remote_checksum_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb'
+ - 'spec/lib/gitlab/cleanup/project_uploads_spec.rb'
+ - 'spec/lib/gitlab/cleanup/remote_uploads_spec.rb'
+ - 'spec/lib/gitlab/contributions_calendar_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/host_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzer_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb'
+ - 'spec/lib/gitlab/database/with_lock_retries_spec.rb'
+ - 'spec/lib/gitlab/database_importers/common_metrics/importer_spec.rb'
+ - 'spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb'
+ - 'spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_cache_spec.rb'
+ - 'spec/lib/gitlab/email/service_desk_receiver_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/faraday/error_callback_spec.rb'
+ - 'spec/lib/gitlab/fips_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/operation_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/github_import/user_finder_spec.rb'
+ - 'spec/lib/gitlab/gpg_spec.rb'
+ - 'spec/lib/gitlab/graphql/generic_tracing_spec.rb'
+ - 'spec/lib/gitlab/health_checks/gitaly_check_spec.rb'
+ - 'spec/lib/gitlab/health_checks/probes/collection_spec.rb'
+ - 'spec/lib/gitlab/health_checks/puma_check_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/relation_object_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/import_failure_service_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_reader/shared_example.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_reader_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/reader_spec.rb'
+ - 'spec/lib/gitlab/import_export/saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/jira_import/labels_importer_spec.rb'
+ - 'spec/lib/gitlab/kas/client_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/helm/api_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb'
+ - 'spec/lib/gitlab/memory/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/metrics/boot_time_tracker_spec.rb'
+ - 'spec/lib/gitlab/metrics/exporter/metrics_middleware_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb'
+ - 'spec/lib/gitlab/middleware/memory_report_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart_spec.rb'
+ - 'spec/lib/gitlab/omniauth_initializer_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'spec/lib/gitlab/project_search_results_spec.rb'
+ - 'spec/lib/gitlab/redis/queues_spec.rb'
+ - 'spec/lib/gitlab/repository_cache_adapter_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb'
+ - 'spec/lib/gitlab/tracking/destinations/snowplow_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/generic_metric_spec.rb'
+ - 'spec/lib/gitlab/usage_data/topology_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils/usage_data_spec.rb'
+ - 'spec/lib/gitlab/verify/job_artifacts_spec.rb'
+ - 'spec/lib/gitlab/verify/lfs_objects_spec.rb'
+ - 'spec/lib/gitlab/verify/uploads_spec.rb'
+ - 'spec/lib/gitlab/zentao/query_spec.rb'
+ - 'spec/lib/gitlab_spec.rb'
+ - 'spec/lib/learn_gitlab/onboarding_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/lib/prometheus/pid_provider_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/learn_gitlab_menu_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/namespace_mirror_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/clusters/applications/cert_manager_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/clusters/providers/aws_spec.rb'
+ - 'spec/models/clusters/providers/gcp_spec.rb'
+ - 'spec/models/commit_range_spec.rb'
+ - 'spec/models/concerns/cacheable_attributes_spec.rb'
+ - 'spec/models/concerns/featurable_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/deployment_metrics_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/integrations/emails_on_push_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/postgresql/replication_slot_spec.rb'
+ - 'spec/models/project_import_state_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/snippet_repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/policies/ci/bridge_policy_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/commit_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/group_member_presenter_spec.rb'
+ - 'spec/presenters/project_member_presenter_spec.rb'
+ - 'spec/requests/api/avatar_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/add_spec.rb'
+ - 'spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb'
+ - 'spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb'
+ - 'spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb'
+ - 'spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb'
+ - 'spec/requests/api/graphql/terraform/state/lock_spec.rb'
+ - 'spec/requests/api/graphql/terraform/state/unlock_spec.rb'
+ - 'spec/requests/api/group_export_spec.rb'
+ - 'spec/requests/api/group_import_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/helpers_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/npm_project_packages_spec.rb'
+ - 'spec/requests/api/project_debian_distributions_spec.rb'
+ - 'spec/requests/api/project_packages_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/protected_branches_spec.rb'
+ - 'spec/requests/api/v3/github_spec.rb'
+ - 'spec/requests/health_controller_spec.rb'
+ - 'spec/requests/import/gitlab_groups_controller_spec.rb'
+ - 'spec/requests/openid_connect_spec.rb'
+ - 'spec/requests/projects/merge_requests/diffs_spec.rb'
+ - 'spec/rubocop/cop/performance/ar_count_each_spec.rb'
+ - 'spec/rubocop/cop/performance/ar_exists_and_present_blank_spec.rb'
+ - 'spec/scripts/setup/find_jh_branch_spec.rb'
+ - 'spec/serializers/diffs_metadata_entity_spec.rb'
+ - 'spec/serializers/merge_request_diff_entity_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/award_emojis/add_service_spec.rb'
+ - 'spec/services/captcha/captcha_verification_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/delete_objects_service_spec.rb'
+ - 'spec/services/ci/generate_kubeconfig_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_batch_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - '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/install_service_spec.rb'
+ - 'spec/services/clusters/applications/patch_service_spec.rb'
+ - 'spec/services/clusters/applications/prometheus_update_service_spec.rb'
+ - 'spec/services/clusters/applications/uninstall_service_spec.rb'
+ - 'spec/services/clusters/applications/upgrade_service_spec.rb'
+ - 'spec/services/clusters/aws/fetch_credentials_service_spec.rb'
+ - 'spec/services/clusters/integrations/prometheus_health_check_service_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/database/consistency_check_service_spec.rb'
+ - 'spec/services/dependency_proxy/find_cached_manifest_service_spec.rb'
+ - 'spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb'
+ - 'spec/services/design_management/copy_design_collection/copy_service_spec.rb'
+ - 'spec/services/design_management/generate_image_versions_service_spec.rb'
+ - 'spec/services/design_management/save_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_position_service_spec.rb'
+ - 'spec/services/environments/reset_auto_stop_service_spec.rb'
+ - 'spec/services/git/base_hooks_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/git/wiki_push_service/change_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/import/github_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/create_project_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3_spec.rb'
+ - 'spec/services/issues/relative_position_rebalancing_service_spec.rb'
+ - 'spec/services/issues/zoom_link_service_spec.rb'
+ - 'spec/services/jira_import/start_import_service_spec.rb'
+ - 'spec/services/labels/update_service_spec.rb'
+ - 'spec/services/lfs/file_transformer_spec.rb'
+ - 'spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/merge_requests/cleanup_refs_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_broken_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_ci_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_discussions_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_draft_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_open_status_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/run_checks_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability_check_service_spec.rb'
+ - 'spec/services/merge_requests/squash_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/notification_recipients/builder/new_note_spec.rb'
+ - 'spec/services/packages/debian/process_changes_service_spec.rb'
+ - 'spec/services/packages/generic/create_package_file_service_spec.rb'
+ - 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_service_spec.rb'
+ - 'spec/services/packages/mark_package_files_for_destruction_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/packages/rubygems/process_gem_service_spec.rb'
+ - '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'
+ - 'spec/services/projects/container_repository/delete_tags_service_spec.rb'
+ - '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'
+ - 'spec/services/projects/lfs_pointers/lfs_download_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb'
+ - 'spec/services/projects/overwrite_project_service_spec.rb'
+ - 'spec/services/projects/refresh_build_artifacts_size_statistics_service_spec.rb'
+ - 'spec/services/projects/transfer_service_spec.rb'
+ - 'spec/services/projects/update_pages_service_spec.rb'
+ - 'spec/services/projects/update_remote_mirror_service_spec.rb'
+ - 'spec/services/projects/update_repository_storage_service_spec.rb'
+ - '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'
+ - 'spec/services/snippets/update_repository_storage_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/system_notes/commit_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/user_project_access_changed_service_spec.rb'
+ - 'spec/support/services/issuable_update_service_shared_examples.rb'
+ - 'spec/support/services/migrate_to_ghost_user_service_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/csp.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/notes_creation_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/wikis_api_examples.rb'
+ - 'spec/support/shared_examples/metrics/sampler_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/has_wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/update_namespace_statistics_shared_examples.rb'
+ - 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/repositories_shared_context.rb'
+ - 'spec/support/shared_examples/serializers/note_entity_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/boards_recent_visit_shared_examples.rb'
+ - 'spec/support/shared_examples/services/error_tracking_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/destroy_service_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/background_migration_worker_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/cleanup_rake_spec.rb'
+ - 'spec/tasks/gitlab/gitaly_rake_spec.rb'
+ - 'spec/tasks/gitlab/praefect_rake_spec.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/tooling/danger/feature_flag_spec.rb'
+ - 'spec/tooling/danger/specs_spec.rb'
+ - 'spec/tooling/rspec_flaky/listener_spec.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/uploaders/gitlab_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/workers/object_storage/migrate_uploads_worker_spec.rb'
+ - 'spec/views/shared/runners/_runner_details.html.haml_spec.rb'
+ - 'spec/workers/build_finished_worker_spec.rb'
+ - 'spec/workers/ci/build_finished_worker_spec.rb'
+ - 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
+ - 'spec/workers/concerns/limited_capacity/job_tracker_spec.rb'
+ - 'spec/workers/concerns/limited_capacity/worker_spec.rb'
+ - 'spec/workers/create_commit_signature_worker_spec.rb'
+ - 'spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb'
+ - 'spec/workers/gitlab/jira_import/import_issue_worker_spec.rb'
+ - 'spec/workers/gitlab/jira_import/stage/finish_import_worker_spec.rb'
+ - 'spec/workers/gitlab_performance_bar_stats_worker_spec.rb'
+ - 'spec/workers/group_import_worker_spec.rb'
+ - 'spec/workers/integrations/create_external_cross_reference_worker_spec.rb'
+ - 'spec/workers/packages/helm/extraction_worker_spec.rb'
+ - 'spec/workers/packages/nuget/extraction_worker_spec.rb'
+ - 'spec/workers/post_receive_spec.rb'
+ - 'spec/workers/projects/git_garbage_collect_worker_spec.rb'
+ - 'spec/workers/projects/refresh_build_artifacts_size_statistics_worker_spec.rb'
+ - 'spec/workers/run_pipeline_schedule_worker_spec.rb'
+ - 'spec/workers/service_desk_email_receiver_worker_spec.rb'
+ - 'spec/workers/upload_checksum_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/predicate_matcher.yml b/.rubocop_todo/rspec/predicate_matcher.yml
new file mode 100644
index 00000000000..0d55c9b858e
--- /dev/null
+++ b/.rubocop_todo/rspec/predicate_matcher.yml
@@ -0,0 +1,516 @@
+---
+# Cop supports --auto-correct.
+RSpec/PredicateMatcher:
+ # Offense count: 2480
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/admin/elasticsearch_controller_spec.rb'
+ - 'ee/spec/controllers/admin/geo/projects_controller_spec.rb'
+ - 'ee/spec/controllers/ee/sent_notifications_controller_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/groups/ldaps_controller_spec.rb'
+ - 'ee/spec/controllers/projects_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/migration_shared_examples.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'ee/spec/features/projects/members/member_is_removed_from_project_spec.rb'
+ - 'ee/spec/features/projects/mirror_spec.rb'
+ - 'ee/spec/features/signup_spec.rb'
+ - 'ee/spec/graphql/resolvers/path_locks_resolver_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issues_helper_spec.rb'
+ - 'ee/spec/helpers/projects_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/after_config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/database_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/gma_membership_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/membership_enforcer_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'ee/spec/lib/gitlab/checks/diff_check_spec.rb'
+ - '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'
+ - 'ee/spec/lib/gitlab/user_access_spec.rb'
+ - 'ee/spec/lib/system_check/geo/authorized_keys_flag_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/current_node_check_spec.rb'
+ - 'ee/spec/lib/system_check/geo/http_connection_check_spec.rb'
+ - 'ee/spec/models/allowed_email_domain_spec.rb'
+ - 'ee/spec/models/application_setting_spec.rb'
+ - 'ee/spec/models/approval_state_spec.rb'
+ - 'ee/spec/models/ci/minutes/notification_spec.rb'
+ - 'ee/spec/models/concerns/approval_rule_like_spec.rb'
+ - 'ee/spec/models/concerns/elastic/issue_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/concerns/elastic/project_spec.rb'
+ - 'ee/spec/models/concerns/geo/verification_state_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/ee/ci/runner_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/ee/label_spec.rb'
+ - 'ee/spec/models/ee/list_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/epic_spec.rb'
+ - 'ee/spec/models/geo/container_repository_registry_spec.rb'
+ - 'ee/spec/models/geo/project_registry_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/ip_restriction_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/namespace_setting_spec.rb'
+ - 'ee/spec/models/note_spec.rb'
+ - 'ee/spec/models/path_lock_spec.rb'
+ - 'ee/spec/models/preloaders/environments/protected_environment_preloader_spec.rb'
+ - 'ee/spec/models/project_import_state_spec.rb'
+ - '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'
+ - 'ee/spec/requests/api/members_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/services/approval_rules/params_filtering_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/register_runner_audit_event_service_spec.rb'
+ - 'ee/spec/services/ci/process_build_service_spec.rb'
+ - 'ee/spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'ee/spec/services/ee/allowed_email_domains/update_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/geo/container_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/event_service_spec.rb'
+ - 'ee/spec/services/geo/files_expire_service_spec.rb'
+ - 'ee/spec/services/geo/hashed_storage_attachments_migration_service_spec.rb'
+ - 'ee/spec/services/geo/move_repository_service_spec.rb'
+ - 'ee/spec/services/geo/repository_destroy_service_spec.rb'
+ - 'ee/spec/services/groups/mark_for_deletion_service_spec.rb'
+ - 'ee/spec/services/groups/restore_service_spec.rb'
+ - 'ee/spec/services/iterations/cadences/create_service_spec.rb'
+ - 'ee/spec/services/iterations/create_service_spec.rb'
+ - 'ee/spec/services/jira/requests/issues/list_service_spec.rb'
+ - 'ee/spec/services/milestones/promote_service_spec.rb'
+ - 'ee/spec/services/protected_environments/create_service_spec.rb'
+ - 'ee/spec/services/vulnerabilities/manually_create_service_spec.rb'
+ - 'ee/spec/services/vulnerability_exports/export_service_spec.rb'
+ - 'ee/spec/support/shared_examples/graphql/mutations/dast_on_demand_scans_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/geo/geo_log_cursor_event_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/elastic/limited_indexing_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'ee/spec/tasks/geo_rake_spec.rb'
+ - 'ee/spec/workers/concerns/elastic/indexing_control_spec.rb'
+ - 'ee/spec/workers/elastic/migration_worker_spec.rb'
+ - 'ee/spec/workers/geo/batch/project_registry_worker_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/database_delete_replication_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb'
+ - 'qa/spec/runtime/env_spec.rb'
+ - 'qa/spec/runtime/feature_spec.rb'
+ - 'qa/spec/specs/helpers/context_selector_spec.rb'
+ - 'spec/components/diffs/overflow_warning_component_spec.rb'
+ - 'spec/controllers/admin/dev_ops_report_controller_spec.rb'
+ - 'spec/controllers/admin/topics/avatars_controller_spec.rb'
+ - 'spec/controllers/admin/users_controller_spec.rb'
+ - 'spec/controllers/application_controller_spec.rb'
+ - 'spec/controllers/concerns/checks_collaboration_spec.rb'
+ - 'spec/controllers/groups/avatars_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/group_members_controller_spec.rb'
+ - 'spec/controllers/groups/settings/applications_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/profiles/avatars_controller_spec.rb'
+ - 'spec/controllers/profiles_controller_spec.rb'
+ - 'spec/controllers/projects/avatars_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/project_members_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/sent_notifications_controller_spec.rb'
+ - 'spec/controllers/sessions_controller_spec.rb'
+ - 'spec/controllers/snippets/notes_controller_spec.rb'
+ - 'spec/features/admin/admin_settings_spec.rb'
+ - 'spec/features/admin/users/user_spec.rb'
+ - 'spec/features/admin/users/users_spec.rb'
+ - 'spec/features/groups/members/request_access_spec.rb'
+ - 'spec/features/groups/share_lock_spec.rb'
+ - 'spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb'
+ - 'spec/features/password_reset_spec.rb'
+ - 'spec/features/profile_spec.rb'
+ - 'spec/features/profiles/emails_spec.rb'
+ - 'spec/features/projects/integrations/user_activates_mattermost_slash_command_spec.rb'
+ - 'spec/features/projects/jobs/user_browses_job_spec.rb'
+ - 'spec/features/projects/members/member_leaves_project_spec.rb'
+ - 'spec/features/projects/members/user_requests_access_spec.rb'
+ - 'spec/features/projects/pages/user_edits_settings_spec.rb'
+ - 'spec/features/projects/settings/forked_project_settings_spec.rb'
+ - 'spec/features/unsubscribe_links_spec.rb'
+ - 'spec/features/users/signup_spec.rb'
+ - 'spec/finders/group_descendants_finder_spec.rb'
+ - 'spec/finders/issues_finder_spec.rb'
+ - 'spec/finders/merge_request_target_project_finder_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/blob_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/recaptcha_helper_spec.rb'
+ - 'spec/helpers/sessions_helper_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/bitbucket/connection_spec.rb'
+ - 'spec/lib/bitbucket/page_spec.rb'
+ - 'spec/lib/bitbucket/representation/pull_request_comment_spec.rb'
+ - 'spec/lib/bitbucket/representation/repo_spec.rb'
+ - 'spec/lib/bitbucket_server/page_spec.rb'
+ - 'spec/lib/bitbucket_server/paginator_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/activity_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/pull_request_comment_spec.rb'
+ - 'spec/lib/bitbucket_server/representation/pull_request_spec.rb'
+ - 'spec/lib/constraints/group_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/constraints/user_url_constrainer_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/gitlab/auth/ip_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/access_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/provider_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/result_spec.rb'
+ - 'spec/lib/gitlab/auth/two_factor_auth_verifier_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/authorized_keys_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_uploads_migrator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb'
+ - 'spec/lib/gitlab/blob_helper_spec.rb'
+ - 'spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb'
+ - 'spec/lib/gitlab/checks/lfs_integrity_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/line_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/parser_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/lint_spec.rb'
+ - 'spec/lib/gitlab/ci/matching/build_matcher_spec.rb'
+ - 'spec/lib/gitlab/ci/matching/runner_matcher_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/test/junit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/limit/rate_limit_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/pipeline/process_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_case_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/waiting_for_approval_spec.rb'
+ - 'spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/archive_spec.rb'
+ - 'spec/lib/gitlab/ci/trace_spec.rb'
+ - 'spec/lib/gitlab/ci_access_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_job_artifact_files_batch_spec.rb'
+ - 'spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb'
+ - 'spec/lib/gitlab/cleanup/project_uploads_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/cross_project_access/check_collection_spec.rb'
+ - 'spec/lib/gitlab/cross_project_access/check_info_spec.rb'
+ - 'spec/lib/gitlab/current_settings_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/time_partition_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb'
+ - 'spec/lib/gitlab/database/reflection_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects_spec.rb'
+ - 'spec/lib/gitlab/database_importers/self_monitoring/project/create_service_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/cargo_toml_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/cartfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/go_mod_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/go_sum_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/godeps_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/podspec_json_linker_spec.rb'
+ - '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'
+ - 'spec/lib/gitlab/email/handler/create_issue_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler/create_merge_request_handler_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/handler/unsubscribe_handler_spec.rb'
+ - 'spec/lib/gitlab/experimentation/group_types_spec.rb'
+ - 'spec/lib/gitlab/external_authorization_spec.rb'
+ - 'spec/lib/gitlab/fake_application_settings_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git/branch_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/keep_around_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb'
+ - 'spec/lib/gitlab/git/tag_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/git_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/git_post_receive_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/storage_settings_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb'
+ - 'spec/lib/gitlab/gl_repository/repo_type_spec.rb'
+ - 'spec/lib/gitlab/gpg/commit_spec.rb'
+ - 'spec/lib/gitlab/hashed_storage/migrator_spec.rb'
+ - 'spec/lib/gitlab/i18n/translation_entry_spec.rb'
+ - 'spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb'
+ - 'spec/lib/gitlab/import_export/fork_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/deployment_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/namespace_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/pull_request_formatter_spec.rb'
+ - 'spec/lib/gitlab/mail_room/mail_room_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/field_data_spec.rb'
+ - 'spec/lib/gitlab/markup_helper_spec.rb'
+ - 'spec/lib/gitlab/metrics/prometheus_spec.rb'
+ - 'spec/lib/gitlab/null_request_store_spec.rb'
+ - 'spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset_spec.rb'
+ - 'spec/lib/gitlab/performance_bar_spec.rb'
+ - 'spec/lib/gitlab/project_transfer_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/request_forgery_protection_spec.rb'
+ - 'spec/lib/gitlab/sanitizers/svg_spec.rb'
+ - 'spec/lib/gitlab/search/found_blob_spec.rb'
+ - 'spec/lib/gitlab/search/found_wiki_page_spec.rb'
+ - 'spec/lib/gitlab/service_desk_email_spec.rb'
+ - 'spec/lib/gitlab/shard_health_cache_spec.rb'
+ - 'spec/lib/gitlab/uploads_transfer_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb'
+ - 'spec/lib/gitlab/user_access_snippet_spec.rb'
+ - 'spec/lib/gitlab/user_access_spec.rb'
+ - 'spec/lib/gitlab/utils/sanitize_node_link_spec.rb'
+ - 'spec/lib/gitlab/view/presenter/base_spec.rb'
+ - 'spec/lib/gitlab/visibility_level_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/shimo_menu_spec.rb'
+ - 'spec/lib/system_check/app/hashed_storage_all_projects_check_spec.rb'
+ - 'spec/lib/system_check/app/hashed_storage_enabled_check_spec.rb'
+ - 'spec/migrations/20210713042000_fix_ci_sources_pipelines_index_names_spec.rb'
+ - 'spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb'
+ - 'spec/migrations/20220128155814_fix_approval_rules_code_owners_rule_type_index_spec.rb'
+ - 'spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb'
+ - 'spec/models/blob_spec.rb'
+ - 'spec/models/blob_viewer/base_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/clusters/agent_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/concerns/access_requestable_spec.rb'
+ - 'spec/models/concerns/awardable_spec.rb'
+ - 'spec/models/concerns/chronic_duration_attribute_spec.rb'
+ - 'spec/models/concerns/ci/has_deployment_name_spec.rb'
+ - 'spec/models/concerns/featurable_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/integrations/has_data_fields_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/mentionable_spec.rb'
+ - 'spec/models/concerns/milestoneable_spec.rb'
+ - 'spec/models/concerns/resolvable_discussion_spec.rb'
+ - 'spec/models/concerns/resolvable_note_spec.rb'
+ - 'spec/models/concerns/routable_spec.rb'
+ - 'spec/models/concerns/spammable_spec.rb'
+ - 'spec/models/concerns/subscribable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/customer_relations/contact_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/diff_viewer/base_spec.rb'
+ - 'spec/models/email_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/models/gpg_key_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/hooks/web_hook_log_spec.rb'
+ - 'spec/models/identity_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/base_issue_tracker_spec.rb'
+ - 'spec/models/integrations/base_third_party_wiki_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/members/project_member_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/namespace/aggregation_schedule_spec.rb'
+ - 'spec/models/namespace_setting_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/note_spec.rb'
+ - 'spec/models/postgresql/replication_slot_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_statistics_spec.rb'
+ - 'spec/models/project_team_spec.rb'
+ - 'spec/models/remote_mirror_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/route_spec.rb'
+ - 'spec/models/sent_notification_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/todo_spec.rb'
+ - 'spec/models/upload_spec.rb'
+ - 'spec/models/uploads/local_spec.rb'
+ - 'spec/models/user_agent_detail_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/presenters/blob_presenter_spec.rb'
+ - 'spec/presenters/ci/build_presenter_spec.rb'
+ - 'spec/presenters/label_presenter_spec.rb'
+ - 'spec/requests/api/admin/instance_clusters_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runners_spec.rb'
+ - 'spec/requests/api/features_spec.rb'
+ - 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/project_hooks_spec.rb'
+ - 'spec/requests/api/project_snippets_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/resource_access_tokens_spec.rb'
+ - 'spec/requests/api/snippets_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/serializers/pipeline_serializer_spec.rb'
+ - 'spec/services/branches/create_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/needs_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rate_limit_spec.rb'
+ - 'spec/services/ci/delete_objects_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/expire_pipeline_cache_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/destroy_all_expired_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/expire_project_build_artifacts_service_spec.rb'
+ - 'spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'spec/services/clusters/destroy_service_spec.rb'
+ - 'spec/services/concerns/exclusive_lease_guard_spec.rb'
+ - 'spec/services/concerns/merge_requests/assigns_merge_params_spec.rb'
+ - 'spec/services/container_expiration_policies/cleanup_service_spec.rb'
+ - 'spec/services/container_expiration_policies/update_service_spec.rb'
+ - 'spec/services/customer_relations/contacts/update_service_spec.rb'
+ - 'spec/services/customer_relations/organizations/update_service_spec.rb'
+ - 'spec/services/deployments/older_deployments_drop_service_spec.rb'
+ - 'spec/services/draft_notes/publish_service_spec.rb'
+ - 'spec/services/environments/schedule_to_delete_review_apps_service_spec.rb'
+ - 'spec/services/groups/destroy_service_spec.rb'
+ - 'spec/services/groups/group_links/create_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/groups/update_service_spec.rb'
+ - 'spec/services/issuable/bulk_update_service_spec.rb'
+ - 'spec/services/jira/requests/projects/list_service_spec.rb'
+ - 'spec/services/jira_import/users_importer_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/merge_requests/conflicts/list_service_spec.rb'
+ - 'spec/services/merge_requests/create_from_issue_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/metrics/dashboard/cluster_metrics_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/panel_preview_service_spec.rb'
+ - 'spec/services/metrics/users_starred_dashboards/delete_service_spec.rb'
+ - 'spec/services/milestones/promote_service_spec.rb'
+ - 'spec/services/milestones/transfer_service_spec.rb'
+ - 'spec/services/namespaces/package_settings/update_service_spec.rb'
+ - 'spec/services/note_summary_spec.rb'
+ - 'spec/services/notes/build_service_spec.rb'
+ - 'spec/services/notes/quick_actions_service_spec.rb'
+ - 'spec/services/packages/debian/find_or_create_incoming_service_spec.rb'
+ - 'spec/services/packages/nuget/update_package_from_metadata_service_spec.rb'
+ - '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'
+ - 'spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_object_download_list_service_spec.rb'
+ - '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'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/snippets/destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/spam/akismet_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/support/shared_contexts/email_shared_context.rb'
+ - 'spec/support/shared_examples/ci/auto_merge_merge_requests_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_core_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/timebox_shared_examples.rb'
+ - 'spec/support/shared_examples/models/integrations/base_slash_commands_shared_examples.rb'
+ - 'spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'spec/support/shared_examples/models/note_access_check_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/access_tokens_controller_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/cleanup_rake_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/validators/any_field_validator_spec.rb'
+ - 'spec/validators/array_members_validator_spec.rb'
+ - 'spec/validators/cron_validator_spec.rb'
+ - 'spec/validators/namespace_path_validator_spec.rb'
+ - 'spec/validators/project_path_validator_spec.rb'
+ - 'spec/workers/bulk_imports/entity_worker_spec.rb'
+ - 'spec/workers/bulk_imports/pipeline_worker_spec.rb'
+ - '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'
+ - 'spec/workers/project_destroy_worker_spec.rb'
+ - 'spec/workers/remote_mirror_notification_worker_spec.rb'
+ - 'spec/workers/x509_issuer_crl_check_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_body.yml b/.rubocop_todo/rspec/repeated_example_group_body.yml
new file mode 100644
index 00000000000..87148442b08
--- /dev/null
+++ b/.rubocop_todo/rspec/repeated_example_group_body.yml
@@ -0,0 +1,68 @@
+---
+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'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/geo_spec.rb'
+ - 'ee/spec/models/geo/deleted_project_spec.rb'
+ - 'ee/spec/models/gitlab_subscriptions/upcoming_reconciliation_spec.rb'
+ - 'ee/spec/models/merge_requests/external_status_check_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - '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/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'
+ - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
+ - 'spec/features/security/project/private_access_spec.rb'
+ - 'spec/finders/packages/nuget/package_finder_spec.rb'
+ - 'spec/helpers/gitlab_routing_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'
+ - 'spec/lib/bitbucket_server/representation/comment_spec.rb'
+ - 'spec/lib/gitlab/blob_helper_spec.rb'
+ - '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/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'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/deploy_token_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/presenters/project_hook_presenter_spec.rb'
+ - 'spec/requests/api/graphql/ci/runners_spec.rb'
+ - 'spec/services/boards/lists/update_service_spec.rb'
+ - 'spec/services/ci/create_web_ide_terminal_service_spec.rb'
+ - 'spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/mark_reviewer_reviewed_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability/check_base_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/projects/group_links/destroy_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/support/shared_examples/requests/api/repository_storage_moves_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/lists_create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
diff --git a/.rubocop_todo/rspec/repeated_example_group_description.yml b/.rubocop_todo/rspec/repeated_example_group_description.yml
new file mode 100644
index 00000000000..562f5602d58
--- /dev/null
+++ b/.rubocop_todo/rspec/repeated_example_group_description.yml
@@ -0,0 +1,115 @@
+---
+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/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'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/approval_project_rules_with_user_metric_spec.rb'
+ - 'ee/spec/models/approval_merge_request_rule_spec.rb'
+ - 'ee/spec/models/ci/build_spec.rb'
+ - 'ee/spec/models/dast/profile_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/geo/deleted_project_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/integrations/github_spec.rb'
+ - 'ee/spec/models/merge_requests/external_status_check_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - '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/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/services/scoped_label_shared_examples.rb'
+ - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/controllers/profiles/notifications_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/drafts_controller_spec.rb'
+ - 'spec/controllers/projects/pages_domains_controller_spec.rb'
+ - 'spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb'
+ - '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/security/project/private_access_spec.rb'
+ - 'spec/finders/ci/pipelines_for_merge_request_finder_spec.rb'
+ - 'spec/frontend/fixtures/runner.rb'
+ - 'spec/frontend/fixtures/startup_css.rb'
+ - 'spec/helpers/admin/user_actions_helper_spec.rb'
+ - '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'
+ - 'spec/lib/gitlab/auth/blocked_user_tracker_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/dn_spec.rb'
+ - 'spec/lib/gitlab/ci/config/edge_stages_injector_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/jobs_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/needs_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/policy_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/release_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/common_spec.rb'
+ - '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_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/sanitizers/exif_spec.rb'
+ - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/concerns/ci/has_ref_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/merge_request_assignee_spec.rb'
+ - 'spec/models/merge_request_reviewer_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/group_clusters_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notification_settings_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - '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/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'
+ - 'spec/support_specs/database/prevent_cross_joins_spec.rb'
diff --git a/.rubocop_todo/rspec/return_from_stub.yml b/.rubocop_todo/rspec/return_from_stub.yml
new file mode 100644
index 00000000000..da5ed01cafa
--- /dev/null
+++ b/.rubocop_todo/rspec/return_from_stub.yml
@@ -0,0 +1,319 @@
+---
+# Cop supports --auto-correct.
+RSpec/ReturnFromStub:
+ # Offense count: 703
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/controllers/admin/geo/nodes_controller_spec.rb'
+ - 'ee/spec/controllers/groups/billings_controller_spec.rb'
+ - 'ee/spec/controllers/groups/group_members_controller_spec.rb'
+ - 'ee/spec/controllers/profiles/billings_controller_spec.rb'
+ - 'ee/spec/controllers/projects/branches_controller_spec.rb'
+ - 'ee/spec/features/account_recovery_regular_check_spec.rb'
+ - 'ee/spec/features/admin/groups/admin_changes_plan_spec.rb'
+ - 'ee/spec/features/burndown_charts_spec.rb'
+ - 'ee/spec/features/groups/group_settings_spec.rb'
+ - 'ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb'
+ - 'ee/spec/features/projects/integrations/user_activates_jira_spec.rb'
+ - 'ee/spec/features/projects/milestones/milestone_spec.rb'
+ - 'ee/spec/features/projects/new_project_spec.rb'
+ - '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'
+ - 'ee/spec/helpers/ee/auth_helper_spec.rb'
+ - 'ee/spec/helpers/ee/ci/pipelines_helper_spec.rb'
+ - 'ee/spec/helpers/ee/groups_helper_spec.rb'
+ - 'ee/spec/helpers/ee/issues_helper_spec.rb'
+ - 'ee/spec/helpers/ee/lock_helper_spec.rb'
+ - 'ee/spec/helpers/ee/operations_helper_spec.rb'
+ - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
+ - 'ee/spec/helpers/nav/new_dropdown_helper_spec.rb'
+ - 'ee/spec/helpers/nav/top_nav_helper_spec.rb'
+ - 'ee/spec/helpers/preferences_helper_spec.rb'
+ - 'ee/spec/lib/banzai/filter/cross_project_issuable_information_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'ee/spec/lib/ee/feature_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/checks/push_rules/branch_check_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/database_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/build_consumption_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/minutes/cost_factor_spec.rb'
+ - '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'
+ - 'ee/spec/lib/omni_auth/strategies/group_saml_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/models/ci/build_spec.rb'
+ - 'ee/spec/models/concerns/ee/project_security_scanners_information_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/ee/user_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/merge_request/blocking_spec.rb'
+ - 'ee/spec/models/project_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/presenters/ci/build_presenter_spec.rb'
+ - 'ee/spec/presenters/merge_request_presenter_spec.rb'
+ - 'ee/spec/requests/admin/credentials_controller_spec.rb'
+ - 'ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb'
+ - 'ee/spec/services/auto_merge/merge_train_service_spec.rb'
+ - 'ee/spec/services/deployments/auto_rollback_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/geo/repository_verification_primary_service_spec.rb'
+ - 'ee/spec/services/groups/destroy_service_spec.rb'
+ - 'ee/spec/services/ide/schemas_config_service_spec.rb'
+ - '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'
+ - 'ee/spec/services/wiki_pages/create_service_spec.rb'
+ - 'ee/spec/services/wiki_pages/destroy_service_spec.rb'
+ - 'ee/spec/services/wiki_pages/update_service_spec.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/elastic/cannot_read_cross_project_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/geo_event_store_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/merge_merge_requests_shared_examples.rb'
+ - 'ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb'
+ - 'ee/spec/views/admin/groups/_form.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/application.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_mirror_update_button.html.haml_spec.rb'
+ - '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'
+ - 'ee/spec/workers/geo/repository_verification/secondary/shard_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb'
+ - 'ee/spec/workers/post_receive_spec.rb'
+ - 'ee/spec/workers/store_security_reports_worker_spec.rb'
+ - 'ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb'
+ - 'qa/spec/specs/runner_spec.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/bin/feature_flag_spec.rb'
+ - 'spec/config/settings_spec.rb'
+ - 'spec/controllers/admin/application_settings_controller_spec.rb'
+ - 'spec/controllers/admin/integrations_controller_spec.rb'
+ - 'spec/controllers/concerns/page_limiter_spec.rb'
+ - 'spec/controllers/concerns/send_file_upload_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/akismet_mark_as_spam_action_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/json_format_actions_support_spec.rb'
+ - 'spec/controllers/concerns/spammable_actions/captcha_check/rest_api_actions_support_spec.rb'
+ - 'spec/controllers/groups_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/jobs_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/service_desk_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/features/groups/clusters/user_spec.rb'
+ - 'spec/features/groups/container_registry_spec.rb'
+ - 'spec/features/markdown/markdown_spec.rb'
+ - 'spec/features/projects/clusters/gcp_spec.rb'
+ - 'spec/features/projects/clusters/user_spec.rb'
+ - 'spec/features/projects/container_registry_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb'
+ - 'spec/features/projects/settings/service_desk_setting_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/projects/groups_finder_spec.rb'
+ - 'spec/finders/snippets_finder_spec.rb'
+ - 'spec/finders/user_recent_events_finder_spec.rb'
+ - 'spec/graphql/mutations/environments/canary_ingress/update_spec.rb'
+ - 'spec/graphql/types/project_type_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/broadcast_messages_helper_spec.rb'
+ - 'spec/helpers/dashboard_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/explore_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/nav/new_dropdown_helper_spec.rb'
+ - 'spec/helpers/nav/top_nav_helper_spec.rb'
+ - 'spec/helpers/nav_helper_spec.rb'
+ - 'spec/helpers/operations_helper_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/helpers/users/callouts_helper_spec.rb'
+ - 'spec/helpers/users_helper_spec.rb'
+ - 'spec/helpers/visibility_level_helper_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_redactor_spec.rb'
+ - 'spec/lib/file_size_validator_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/auth_spec.rb'
+ - 'spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb'
+ - 'spec/lib/gitlab/batch_pop_queueing_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/ci/build/policy/changes_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/processor_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/remote_checksum_spec.rb'
+ - 'spec/lib/gitlab/contributions_calendar_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb'
+ - 'spec/lib/gitlab/diff/file_spec.rb'
+ - 'spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb'
+ - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb'
+ - 'spec/lib/gitlab/exclusive_lease_helpers_spec.rb'
+ - 'spec/lib/gitlab/experimentation/controller_concern_spec.rb'
+ - 'spec/lib/gitlab/external_authorization_spec.rb'
+ - 'spec/lib/gitlab/git/blob_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/git_access_wiki_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/call_spec.rb'
+ - 'spec/lib/gitlab/health_checks/puma_check_spec.rb'
+ - 'spec/lib/gitlab/import_export/config_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_base_spec.rb'
+ - 'spec/lib/gitlab/legacy_github_import/importer_spec.rb'
+ - 'spec/lib/gitlab/memory/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/metrics/rails_slis_spec.rb'
+ - 'spec/lib/gitlab/metrics/system_spec.rb'
+ - 'spec/lib/gitlab/middleware/read_only_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/prometheus_client_spec.rb'
+ - 'spec/lib/gitlab/redis/cache_spec.rb'
+ - 'spec/lib/gitlab/redis/shared_state_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/range_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executed_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/system_check/simple_executor_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/blob_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/processable_spec.rb'
+ - 'spec/models/concerns/deprecated_assignee_spec.rb'
+ - 'spec/models/concerns/discussion_on_diff_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/diff_viewer/image_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/internal_id_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/project_statistics_spec.rb'
+ - 'spec/models/snippet_statistics_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/policies/issue_policy_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/merge_request_presenter_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/graphql/read_only_spec.rb'
+ - 'spec/requests/api/groups_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/requests/git_http_spec.rb'
+ - 'spec/requests/health_controller_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/users_controller_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/serializers/merge_request_poll_cached_widget_entity_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/auto_merge/base_service_spec.rb'
+ - 'spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb'
+ - 'spec/services/captcha/captcha_verification_service_spec.rb'
+ - 'spec/services/ci/archive_trace_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/list_config_variables_service_spec.rb'
+ - 'spec/services/ci/pipeline_artifacts/destroy_all_expired_service_spec.rb'
+ - 'spec/services/ci/pipeline_trigger_service_spec.rb'
+ - 'spec/services/ci/process_build_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/environments/auto_stop_service_spec.rb'
+ - 'spec/services/environments/canary_ingress/update_service_spec.rb'
+ - 'spec/services/environments/reset_auto_stop_service_spec.rb'
+ - 'spec/services/git/branch_hooks_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/groups/create_service_spec.rb'
+ - 'spec/services/groups/nested_create_service_spec.rb'
+ - 'spec/services/merge_requests/merge_orchestration_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/merge_to_ref_service_spec.rb'
+ - 'spec/services/merge_requests/mergeability_check_service_spec.rb'
+ - 'spec/services/merge_requests/update_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/notes/destroy_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/projects/after_rename_service_spec.rb'
+ - 'spec/services/projects/apple_target_platform_detector_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_attachments_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/rollback_repository_service_spec.rb'
+ - 'spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb'
+ - 'spec/services/projects/update_remote_mirror_service_spec.rb'
+ - 'spec/services/projects/update_service_spec.rb'
+ - 'spec/services/static_site_editor/config_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/support/redis/redis_shared_examples.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_examples/features/container_registry_shared_examples.rb'
+ - 'spec/support/shared_examples/finders/snippet_visibility_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/sidekiq_middleware/strategy_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/path_extraction_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/boards_create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/create_service_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb'
+ - 'spec/uploaders/file_mover_spec.rb'
+ - 'spec/uploaders/gitlab_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/workers/object_storage/background_move_worker_spec.rb'
+ - 'spec/views/admin/application_settings/_ci_cd.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/_eks.html.haml_spec.rb'
+ - 'spec/views/admin/application_settings/_package_registry.html.haml_spec.rb'
+ - 'spec/views/projects/settings/ci_cd/_autodevops_form.html.haml_spec.rb'
+ - 'spec/views/shared/milestones/_top.html.haml_spec.rb'
+ - 'spec/views/shared/projects/_project.html.haml_spec.rb'
+ - 'spec/views/shared/snippets/_snippet.html.haml_spec.rb'
+ - 'spec/workers/environments/auto_delete_cron_worker_spec.rb'
+ - 'spec/workers/projects/git_garbage_collect_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/scattered_let.yml b/.rubocop_todo/rspec/scattered_let.yml
new file mode 100644
index 00000000000..52f19bf0768
--- /dev/null
+++ b/.rubocop_todo/rspec/scattered_let.yml
@@ -0,0 +1,285 @@
+---
+# Cop supports --auto-correct.
+RSpec/ScatteredLet:
+ # Offense count: 720
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/create_spec.rb'
+ - 'ee/spec/graphql/mutations/merge_requests/accept_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_orchestration/scan_execution_policy_resolver_spec.rb'
+ - 'ee/spec/graphql/types/boards/board_epic_type_spec.rb'
+ - 'ee/spec/graphql/types/instance_security_dashboard_type_spec.rb'
+ - 'ee/spec/helpers/ee/subscribable_banner_helper_spec.rb'
+ - 'ee/spec/helpers/trial_status_widget_helper_spec.rb'
+ - 'ee/spec/lib/banzai/reference_parser/iteration_parser_spec.rb'
+ - 'ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/formatters/dependency_list_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'
+ - 'ee/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/count_per_label_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/label_count_per_period_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
+ - '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'
+ - 'ee/spec/models/label_note_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/ci_cd_settings_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/notes_spec.rb'
+ - 'ee/spec/requests/api/graphql/group_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/http_integrations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/serializers/status_page/incident_serializer_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/update_service_spec.rb'
+ - 'ee/spec/services/arkose/blocked_users_report_service_spec.rb'
+ - 'ee/spec/services/arkose/user_verification_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
+ - 'ee/spec/services/ee/issue_links/create_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/activate_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_provider/create_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_provider/update_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/remove_participant_service_spec.rb'
+ - 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_service_spec.rb'
+ - 'ee/spec/services/projects/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/prometheus/alerts/notify_service_spec.rb'
+ - 'ee/spec/services/quality_management/test_cases/create_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/views/shared/_mirror_update_button.html.haml_spec.rb'
+ - 'ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/workers/compliance_management/merge_requests/compliance_violations_worker_spec.rb'
+ - 'ee/spec/workers/concerns/update_orchestration_policy_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/releases/evidences_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/finders/ci/daily_build_group_report_results_finder_spec.rb'
+ - 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
+ - 'spec/finders/concerns/finder_with_group_hierarchy_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/group_projects_finder_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/frontend/fixtures/pipelines.rb'
+ - 'spec/graphql/resolvers/commit_pipelines_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/versions_resolver_spec.rb'
+ - 'spec/graphql/types/ci/job_token_scope_type_spec.rb'
+ - 'spec/helpers/merge_requests_helper_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/upload_link_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/alert_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_range_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/external_issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/label_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/milestone_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/user_parser_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb'
+ - 'spec/lib/gitlab/asciidoc/include_processor_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans_spec.rb'
+ - 'spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_uploads_migrator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/artifact_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/helpers_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/project_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb'
+ - 'spec/lib/gitlab/diff/formatters/text_formatter_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/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'
+ - 'spec/lib/gitlab/git/blame_spec.rb'
+ - 'spec/lib/gitlab/git/diff_collection_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/export_task_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/lets_encrypt/client_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/grafana_formatter_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/external_http_spec.rb'
+ - 'spec/lib/gitlab/middleware/memory_report_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/page_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/serializer/pagination_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/extra_done_log_metadata_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'spec/lib/gitlab/utils/measuring_spec.rb'
+ - 'spec/lib/gitlab/zentao/client_spec.rb'
+ - 'spec/lib/peek/views/external_http_spec.rb'
+ - 'spec/mailers/emails/in_product_marketing_spec.rb'
+ - 'spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb'
+ - 'spec/models/application_record_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/manual_inverse_association_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/deploy_keys_project_spec.rb'
+ - 'spec/models/design_management/design_at_version_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/push_event_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/credit_card_validation_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/design_management/design_policy_spec.rb'
+ - 'spec/policies/group_member_policy_spec.rb'
+ - 'spec/requests/admin/background_migrations_controller_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/graphql/ci/groups_spec.rb'
+ - 'spec/requests/api/graphql/ci/pipelines_spec.rb'
+ - 'spec/requests/api/graphql/mutations/boards/create_spec.rb'
+ - 'spec/requests/api/graphql/namespace/projects_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/versions_spec.rb'
+ - 'spec/requests/api/graphql/project/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/user/starred_projects_query_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/scripts/pipeline_test_report_builder_spec.rb'
+ - 'spec/serializers/build_details_entity_spec.rb'
+ - 'spec/serializers/ci/job_entity_spec.rb'
+ - 'spec/serializers/merge_requests/pipeline_entity_spec.rb'
+ - 'spec/services/ci/change_variable_service_spec.rb'
+ - 'spec/services/ci/change_variables_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/ci/pipeline_bridge_status_service_spec.rb'
+ - 'spec/services/commits/cherry_pick_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/save_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/events/destroy_service_spec.rb'
+ - 'spec/services/git/base_hooks_service_spec.rb'
+ - 'spec/services/groups/group_links/update_service_spec.rb'
+ - 'spec/services/jira_import/cloud_users_mapper_service_spec.rb'
+ - 'spec/services/jira_import/server_users_mapper_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/generate_distribution_key_service_spec.rb'
+ - 'spec/services/packages/debian/update_distribution_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb'
+ - 'spec/tasks/gitlab/artifacts/migrate_rake_spec.rb'
+ - 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
+ - 'spec/workers/packages/debian/generate_distribution_worker_spec.rb'
diff --git a/.rubocop_todo/rspec/timecop_travel.yml b/.rubocop_todo/rspec/timecop_travel.yml
index 32133f6e55c..a8ca3a5fad5 100644
--- a/.rubocop_todo/rspec/timecop_travel.yml
+++ b/.rubocop_todo/rspec/timecop_travel.yml
@@ -1,11 +1,5 @@
---
RSpec/TimecopTravel:
Exclude:
- - ee/spec/lib/gitlab/geo/event_gap_tracking_spec.rb
- - ee/spec/lib/gitlab/geo/git_push_http_spec.rb
- - ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb
- - ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
- - ee/spec/models/broadcast_message_spec.rb
- - ee/spec/models/burndown_spec.rb
- spec/workers/concerns/reenqueuer_spec.rb
- qa/spec/support/repeater_spec.rb
diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml
index 9df856ea4a7..26b82a3f473 100644
--- a/.rubocop_todo/rspec/verified_doubles.yml
+++ b/.rubocop_todo/rspec/verified_doubles.yml
@@ -7,7 +7,6 @@ RSpec/VerifiedDoubles:
- ee/spec/controllers/groups/sso_controller_spec.rb
- ee/spec/controllers/oauth/geo_auth_controller_spec.rb
- ee/spec/controllers/projects/clusters_controller_spec.rb
- - ee/spec/controllers/projects/security/network_policies_controller_spec.rb
- ee/spec/db/production/license_spec.rb
- ee/spec/elastic/migrate/20210510113500_delete_merge_requests_from_original_index_spec.rb
- ee/spec/elastic/migrate/20210510143200_delete_notes_from_original_index_spec.rb
@@ -90,8 +89,6 @@ RSpec/VerifiedDoubles:
- 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/prometheus/queries/packet_flow_metrics_query_spec.rb
- - ee/spec/lib/gitlab/prometheus/queries/packet_flow_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/app/elasticsearch_check_spec.rb
@@ -181,7 +178,6 @@ RSpec/VerifiedDoubles:
- ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb
- ee/spec/services/ee/service_ping/service_ping_settings_spec.rb
- ee/spec/services/geo/blob_download_service_spec.rb
- - ee/spec/services/geo/file_download_service_spec.rb
- ee/spec/services/geo/graphql_request_service_spec.rb
- ee/spec/services/geo/node_status_request_service_spec.rb
- ee/spec/services/geo/replication_toggle_request_service_spec.rb
@@ -197,10 +193,6 @@ RSpec/VerifiedDoubles:
- ee/spec/services/merge_requests/build_service_spec.rb
- ee/spec/services/merge_requests/reset_approvals_service_spec.rb
- ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb
- - ee/spec/services/network_policies/delete_resource_service_spec.rb
- - ee/spec/services/network_policies/deploy_resource_service_spec.rb
- - ee/spec/services/network_policies/find_resource_service_spec.rb
- - ee/spec/services/network_policies/resources_service_spec.rb
- ee/spec/services/projects/update_mirror_service_spec.rb
- ee/spec/services/projects/update_pages_service_spec.rb
- ee/spec/services/security/ingestion/ingest_report_slice_service_spec.rb
@@ -232,8 +224,6 @@ RSpec/VerifiedDoubles:
- ee/spec/workers/geo/design_repository_sync_worker_spec.rb
- ee/spec/workers/geo/destroy_worker_spec.rb
- ee/spec/workers/geo/event_worker_spec.rb
- - ee/spec/workers/geo/file_download_dispatch_worker_spec.rb
- - ee/spec/workers/geo/file_download_worker_spec.rb
- ee/spec/workers/geo/metrics_update_worker_spec.rb
- ee/spec/workers/geo/prune_event_log_worker_spec.rb
- ee/spec/workers/geo/registry_sync_worker_spec.rb
@@ -301,9 +291,6 @@ RSpec/VerifiedDoubles:
- spec/controllers/projects/blob_controller_spec.rb
- spec/controllers/projects/branches_controller_spec.rb
- spec/controllers/projects/clusters_controller_spec.rb
- - spec/controllers/projects/error_tracking/projects_controller_spec.rb
- - spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb
- - spec/controllers/projects/error_tracking_controller_spec.rb
- spec/controllers/projects/import/jira_controller_spec.rb
- spec/controllers/projects/jobs_controller_spec.rb
- spec/controllers/projects/merge_requests/diffs_controller_spec.rb
@@ -335,7 +322,6 @@ RSpec/VerifiedDoubles:
- spec/features/projects/integrations/user_activates_jira_spec.rb
- spec/finders/ci/auth_job_finder_spec.rb
- spec/finders/merge_requests/oldest_per_commit_finder_spec.rb
- - spec/finders/projects/serverless/functions_finder_spec.rb
- spec/finders/repositories/changelog_commits_finder_spec.rb
- spec/finders/repositories/changelog_tag_finder_spec.rb
- spec/graphql/features/authorization_spec.rb
@@ -351,9 +337,6 @@ RSpec/VerifiedDoubles:
- spec/graphql/mutations/merge_requests/accept_spec.rb
- spec/graphql/mutations/merge_requests/create_spec.rb
- spec/graphql/resolvers/design_management/versions_resolver_spec.rb
- - spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb
- - spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb
- - spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
- spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb
- spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb
- spec/graphql/types/ci/detailed_status_type_spec.rb
@@ -434,9 +417,6 @@ RSpec/VerifiedDoubles:
- spec/lib/constraints/user_url_constrainer_spec.rb
- spec/lib/csv_builder_spec.rb
- spec/lib/csv_builders/stream_spec.rb
- - spec/lib/error_tracking/collector/dsn_spec.rb
- - spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb
- - spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
- spec/lib/extracts_path_spec.rb
- spec/lib/feature_spec.rb
- spec/lib/gitaly/server_spec.rb
@@ -1015,8 +995,6 @@ RSpec/VerifiedDoubles:
- spec/services/container_expiration_policies/cleanup_service_spec.rb
- spec/services/deployments/create_service_spec.rb
- spec/services/discussions/capture_diff_note_position_service_spec.rb
- - spec/services/error_tracking/base_service_spec.rb
- - spec/services/error_tracking/issue_update_service_spec.rb
- spec/services/event_create_service_spec.rb
- spec/services/git/base_hooks_service_spec.rb
- spec/services/git/process_ref_changes_service_spec.rb
@@ -1053,7 +1031,7 @@ RSpec/VerifiedDoubles:
- spec/services/packages/nuget/metadata_extraction_service_spec.rb
- spec/services/pages/zip_directory_service_spec.rb
- spec/services/post_receive_service_spec.rb
- - spec/services/projects/after_import_service_spec.rb
+ - spec/workers/projects/after_import_worker_spec.rb
- spec/services/projects/branches_by_mode_service_spec.rb
- spec/services/projects/create_service_spec.rb
- spec/services/projects/destroy_service_spec.rb
diff --git a/.rubocop_todo/style/accessor_grouping.yml b/.rubocop_todo/style/accessor_grouping.yml
new file mode 100644
index 00000000000..821e3398301
--- /dev/null
+++ b/.rubocop_todo/style/accessor_grouping.yml
@@ -0,0 +1,78 @@
+---
+# Cop supports --auto-correct.
+Style/AccessorGrouping:
+ # Offense count: 254
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/template_finder.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/concerns/importable.rb'
+ - 'app/models/design_management/design_at_version.rb'
+ - 'app/models/draft_note.rb'
+ - 'app/models/integrations/chat_message/alert_message.rb'
+ - 'app/models/integrations/chat_message/base_message.rb'
+ - 'app/models/integrations/chat_message/deployment_message.rb'
+ - 'app/models/integrations/chat_message/issue_message.rb'
+ - 'app/models/integrations/chat_message/merge_message.rb'
+ - 'app/models/integrations/chat_message/note_message.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - 'app/models/integrations/chat_message/push_message.rb'
+ - 'app/models/integrations/chat_message/wiki_page_message.rb'
+ - 'app/models/project.rb'
+ - 'app/services/deployments/update_environment_service.rb'
+ - 'app/services/issues/clone_service.rb'
+ - 'app/services/merge_requests/bulk_remove_attention_requested_service.rb'
+ - 'app/services/note_summary.rb'
+ - 'app/services/notification_recipients/builder/default.rb'
+ - 'app/services/task_list_toggle_service.rb'
+ - 'ee/app/models/approval_wrapped_rule.rb'
+ - 'ee/app/models/integrations/chat_message/vulnerability_message.rb'
+ - 'ee/app/services/ci/pipeline_creation/drop_not_runnable_builds_service.rb'
+ - 'ee/app/services/geo/project_housekeeping_service.rb'
+ - 'ee/lib/gitlab/ci/reports/coverage_fuzzing/crash.rb'
+ - 'ee/lib/gitlab/ci/reports/coverage_fuzzing/report.rb'
+ - 'ee/lib/gitlab/ci/reports/security/locations/container_scanning.rb'
+ - 'ee/lib/gitlab/ci/reports/security/locations/coverage_fuzzing.rb'
+ - 'ee/lib/gitlab/ci/reports/security/locations/dast.rb'
+ - 'ee/lib/gitlab/ci/reports/security/locations/dependency_scanning.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/bitbucket_server_import/importer.rb'
+ - 'lib/gitlab/ci/config/external/context.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/security/identifier.rb'
+ - 'lib/gitlab/ci/reports/security/locations/sast.rb'
+ - 'lib/gitlab/ci/reports/security/locations/secret_detection.rb'
+ - 'lib/gitlab/ci/reports/security/scanned_resource.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/trace/chunked_io.rb'
+ - 'lib/gitlab/ci/variables/builder.rb'
+ - 'lib/gitlab/contributions_calendar.rb'
+ - 'lib/gitlab/database/background_migration/batch_metrics.rb'
+ - 'lib/gitlab/diff/diff_refs.rb'
+ - 'lib/gitlab/diff/formatters/base_formatter.rb'
+ - 'lib/gitlab/diff/formatters/image_formatter.rb'
+ - 'lib/gitlab/diff/formatters/text_formatter.rb'
+ - 'lib/gitlab/diff/position_tracer.rb'
+ - 'lib/gitlab/git/commit.rb'
+ - 'lib/gitlab/graphql/connection_redaction.rb'
+ - 'lib/gitlab/http_io.rb'
+ - 'lib/gitlab/import_export/group/legacy_tree_restorer.rb'
+ - 'lib/gitlab/import_export/project/tree_restorer.rb'
+ - 'lib/gitlab/merge_requests/commit_message_generator.rb'
+ - 'lib/gitlab/sidekiq_daemon/monitor.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
+ - 'lib/gitlab/suggestions/file_suggestion.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/gitlab/tree_summary.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/base_metric.rb'
+ - 'lib/gitlab/usage/service_ping/instrumented_payload.rb'
+ - 'lib/json_web_token/token.rb'
+ - 'lib/object_storage/direct_upload.rb'
+ - 'lib/safe_zip/entry.rb'
+ - 'lib/system_check/simple_executor.rb'
+ - 'lib/uploaded_file.rb'
+ - 'qa/qa/ee/resource/geo/node.rb'
+ - 'qa/qa/ee/resource/settings/elasticsearch.rb'
diff --git a/.rubocop_todo/style/bare_percent_literals.yml b/.rubocop_todo/style/bare_percent_literals.yml
new file mode 100644
index 00000000000..658c6c22baa
--- /dev/null
+++ b/.rubocop_todo/style/bare_percent_literals.yml
@@ -0,0 +1,115 @@
+---
+# Cop supports --auto-correct.
+Style/BarePercentLiterals:
+ # Offense count: 220
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/commit.rb'
+ - 'app/models/concerns/storage/legacy_namespace.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/services/feature_flags/base_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/repositories/destroy_rollback_service.rb'
+ - 'app/services/repositories/destroy_service.rb'
+ - 'ee/app/services/jira/jql_builder_service.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'
+ - 'ee/spec/features/projects/environments/environments_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/banzai/filter/table_of_contents_filter.rb'
+ - 'lib/banzai/issuable_extractor.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/etag_caching/router/rails.rb'
+ - 'lib/gitlab/gl_repository/identifier.rb'
+ - 'lib/gitlab/import_export/repo_restorer.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/ee/page/dashboard/projects.rb'
+ - 'qa/qa/ee/page/group/settings/general.rb'
+ - 'qa/qa/ee/page/project/issue/show.rb'
+ - 'qa/qa/ee/page/project/job/show.rb'
+ - 'qa/qa/ee/page/project/packages/index.rb'
+ - 'qa/qa/ee/page/project/pipeline/show.rb'
+ - 'qa/qa/ee/page/project/show.rb'
+ - 'qa/qa/ee/page/project/snippet/index.rb'
+ - 'qa/qa/ee/page/project/wiki/show.rb'
+ - 'qa/qa/page/component/design_management.rb'
+ - 'qa/qa/page/component/select2.rb'
+ - 'qa/qa/page/element.rb'
+ - 'qa/qa/page/file/form.rb'
+ - 'qa/qa/page/project/web_ide/edit.rb'
+ - 'qa/qa/resource/events/project.rb'
+ - 'qa/qa/resource/members.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_new_account_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/qa/support/page/logging.rb'
+ - 'qa/spec/runtime/feature_spec.rb'
+ - 'scripts/regenerate-schema'
+ - 'scripts/trigger-build.rb'
+ - 'spec/controllers/import/fogbugz_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/projects/artifacts/user_downloads_artifacts_spec.rb'
+ - 'spec/features/projects/badges/coverage_spec.rb'
+ - 'spec/features/projects/badges/pipeline_badge_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_group_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_profile_spec.rb'
+ - 'spec/graphql/resolvers/echo_resolver_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/image_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/full_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/url_sanitizer_spec.rb'
+ - 'spec/mailers/emails/releases_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/integrations/teamcity_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - 'spec/presenters/snippet_blob_presenter_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/destroy_spec.rb'
+ - 'spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb'
+ - 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
+ - 'spec/support/banzai/reference_filter_shared_examples.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb'
+ - 'spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/label_fields.rb'
+ - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
+ - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/views/layouts/_head.html.haml_spec.rb'
diff --git a/.rubocop_todo/style/case_like_if.yml b/.rubocop_todo/style/case_like_if.yml
new file mode 100644
index 00000000000..f1e349fe836
--- /dev/null
+++ b/.rubocop_todo/style/case_like_if.yml
@@ -0,0 +1,63 @@
+---
+# Cop supports --auto-correct.
+Style/CaseLikeIf:
+ # Offense count: 60
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/groups/dependency_proxy/application_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/graphql/types/ci/job_need_union.rb'
+ - 'app/helpers/avatars_helper.rb'
+ - 'app/helpers/broadcast_messages_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/routing/pseudonymization_helper.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/members/member_task.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/packages/go/module_version.rb'
+ - 'app/serializers/group_child_serializer.rb'
+ - 'app/services/google_cloud/generate_pipeline_service.rb'
+ - 'app/services/issuable/bulk_update_service.rb'
+ - 'app/services/todo_service.rb'
+ - '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'
+ - 'ee/spec/config/metrics/every_metric_definition_spec.rb'
+ - 'ee/spec/features/boards/user_adds_lists_to_board_spec.rb'
+ - 'ee/spec/features/issues/user_bulk_edits_issues_spec.rb'
+ - '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'
+ - 'lib/gitlab/identifier.rb'
+ - 'lib/gitlab/issues/rebalancing/state.rb'
+ - 'lib/gitlab/pagination/gitaly_keyset_pager.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/gitlab/utils/strong_memoize.rb'
+ - 'qa/qa/git/repository.rb'
+ - 'qa/qa/scenario/bootable.rb'
+ - 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
+ - 'spec/features/boards/user_adds_lists_to_board_spec.rb'
+ - 'spec/lib/gitlab/auth/auth_finders_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/models/concerns/sha_attribute_spec.rb'
+ - 'spec/models/preloaders/labels_preloader_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/api/terraform/modules/v1/packages_spec.rb'
+ - 'spec/services/resource_events/change_state_service_spec.rb'
+ - 'spec/support/helpers/filter_spec_helper.rb'
+ - 'spec/support/matchers/abort_matcher.rb'
+ - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/uploaders/object_storage_shared_examples.rb'
+ - 'spec/workers/loose_foreign_keys/cleanup_worker_spec.rb'
diff --git a/.rubocop_todo/style/class_and_module_children.yml b/.rubocop_todo/style/class_and_module_children.yml
new file mode 100644
index 00000000000..9d89acfb394
--- /dev/null
+++ b/.rubocop_todo/style/class_and_module_children.yml
@@ -0,0 +1,587 @@
+---
+# Cop supports --auto-correct.
+Style/ClassAndModuleChildren:
+ Exclude:
+ - 'app/components/pajamas/toggle_component.rb'
+ - 'app/controllers/admin/abuse_reports_controller.rb'
+ - 'app/controllers/admin/application_controller.rb'
+ - 'app/controllers/admin/application_settings/appearances_controller.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/applications_controller.rb'
+ - 'app/controllers/admin/background_jobs_controller.rb'
+ - 'app/controllers/admin/background_migrations_controller.rb'
+ - 'app/controllers/admin/batched_jobs_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/ci/variables_controller.rb'
+ - 'app/controllers/admin/clusters/integrations_controller.rb'
+ - 'app/controllers/admin/clusters_controller.rb'
+ - 'app/controllers/admin/cohorts_controller.rb'
+ - 'app/controllers/admin/dashboard_controller.rb'
+ - 'app/controllers/admin/deploy_keys_controller.rb'
+ - 'app/controllers/admin/dev_ops_report_controller.rb'
+ - 'app/controllers/admin/gitaly_servers_controller.rb'
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/admin/health_check_controller.rb'
+ - 'app/controllers/admin/hook_logs_controller.rb'
+ - 'app/controllers/admin/hooks_controller.rb'
+ - 'app/controllers/admin/identities_controller.rb'
+ - 'app/controllers/admin/impersonation_tokens_controller.rb'
+ - 'app/controllers/admin/impersonations_controller.rb'
+ - 'app/controllers/admin/instance_review_controller.rb'
+ - 'app/controllers/admin/integrations_controller.rb'
+ - 'app/controllers/admin/jobs_controller.rb'
+ - 'app/controllers/admin/keys_controller.rb'
+ - 'app/controllers/admin/labels_controller.rb'
+ - 'app/controllers/admin/plan_limits_controller.rb'
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/admin/runner_projects_controller.rb'
+ - 'app/controllers/admin/runners_controller.rb'
+ - 'app/controllers/admin/sessions_controller.rb'
+ - 'app/controllers/admin/spam_logs_controller.rb'
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/admin/topics/avatars_controller.rb'
+ - 'app/controllers/admin/topics_controller.rb'
+ - 'app/controllers/admin/usage_trends_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/admin/version_check_controller.rb'
+ - 'app/controllers/clusters/base_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/integrations/hooks_execution.rb'
+ - 'app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb'
+ - 'app/controllers/concerns/snippets/blobs_actions.rb'
+ - 'app/controllers/concerns/snippets/send_blob.rb'
+ - 'app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/json_format_actions_support.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/rest_api_actions_support.rb'
+ - 'app/controllers/dashboard/application_controller.rb'
+ - 'app/controllers/dashboard/groups_controller.rb'
+ - 'app/controllers/dashboard/labels_controller.rb'
+ - 'app/controllers/dashboard/milestones_controller.rb'
+ - 'app/controllers/dashboard/projects_controller.rb'
+ - 'app/controllers/dashboard/snippets_controller.rb'
+ - 'app/controllers/dashboard/todos_controller.rb'
+ - 'app/controllers/explore/application_controller.rb'
+ - 'app/controllers/explore/groups_controller.rb'
+ - 'app/controllers/explore/projects_controller.rb'
+ - 'app/controllers/explore/snippets_controller.rb'
+ - 'app/controllers/groups/application_controller.rb'
+ - 'app/controllers/groups/autocomplete_sources_controller.rb'
+ - 'app/controllers/groups/avatars_controller.rb'
+ - 'app/controllers/groups/boards_controller.rb'
+ - 'app/controllers/groups/clusters/integrations_controller.rb'
+ - 'app/controllers/groups/clusters_controller.rb'
+ - 'app/controllers/groups/crm/contacts_controller.rb'
+ - 'app/controllers/groups/crm/organizations_controller.rb'
+ - 'app/controllers/groups/dependency_proxy_auth_controller.rb'
+ - 'app/controllers/groups/dependency_proxy_for_containers_controller.rb'
+ - 'app/controllers/groups/deploy_tokens_controller.rb'
+ - 'app/controllers/groups/email_campaigns_controller.rb'
+ - 'app/controllers/groups/group_links_controller.rb'
+ - 'app/controllers/groups/group_members_controller.rb'
+ - 'app/controllers/groups/imports_controller.rb'
+ - 'app/controllers/groups/labels_controller.rb'
+ - 'app/controllers/groups/milestones_controller.rb'
+ - 'app/controllers/groups/runners_controller.rb'
+ - 'app/controllers/groups/uploads_controller.rb'
+ - 'app/controllers/import/available_namespaces_controller.rb'
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/controllers/import/bitbucket_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/import/bulk_imports_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/import/gitlab_controller.rb'
+ - 'app/controllers/import/gitlab_groups_controller.rb'
+ - 'app/controllers/import/gitlab_projects_controller.rb'
+ - 'app/controllers/import/history_controller.rb'
+ - 'app/controllers/import/manifest_controller.rb'
+ - 'app/controllers/import/phabricator_controller.rb'
+ - 'app/controllers/import/url_controller.rb'
+ - 'app/controllers/jira_connect/app_descriptor_controller.rb'
+ - 'app/controllers/jira_connect/application_controller.rb'
+ - 'app/controllers/jira_connect/branches_controller.rb'
+ - 'app/controllers/jira_connect/events_controller.rb'
+ - 'app/controllers/jira_connect/installations_controller.rb'
+ - 'app/controllers/jira_connect/oauth_callbacks_controller.rb'
+ - 'app/controllers/jira_connect/subscriptions_controller.rb'
+ - 'app/controllers/jira_connect/users_controller.rb'
+ - 'app/controllers/ldap/omniauth_callbacks_controller.rb'
+ - 'app/controllers/oauth/applications_controller.rb'
+ - 'app/controllers/oauth/authorizations_controller.rb'
+ - 'app/controllers/oauth/authorized_applications_controller.rb'
+ - 'app/controllers/oauth/jira_dvcs/authorizations_controller.rb'
+ - 'app/controllers/oauth/token_info_controller.rb'
+ - 'app/controllers/oauth/tokens_controller.rb'
+ - 'app/controllers/profiles/accounts_controller.rb'
+ - 'app/controllers/profiles/active_sessions_controller.rb'
+ - 'app/controllers/profiles/application_controller.rb'
+ - 'app/controllers/profiles/avatars_controller.rb'
+ - 'app/controllers/profiles/chat_names_controller.rb'
+ - 'app/controllers/profiles/emails_controller.rb'
+ - 'app/controllers/profiles/gpg_keys_controller.rb'
+ - 'app/controllers/profiles/groups_controller.rb'
+ - 'app/controllers/profiles/keys_controller.rb'
+ - 'app/controllers/profiles/notifications_controller.rb'
+ - 'app/controllers/profiles/passwords_controller.rb'
+ - 'app/controllers/profiles/personal_access_tokens_controller.rb'
+ - 'app/controllers/profiles/preferences_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/profiles/u2f_registrations_controller.rb'
+ - 'app/controllers/profiles/webauthn_registrations_controller.rb'
+ - 'app/controllers/projects/alert_management_controller.rb'
+ - 'app/controllers/projects/analytics/cycle_analytics/stages_controller.rb'
+ - 'app/controllers/projects/analytics/cycle_analytics/summary_controller.rb'
+ - 'app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb'
+ - 'app/controllers/projects/application_controller.rb'
+ - 'app/controllers/projects/artifacts_controller.rb'
+ - 'app/controllers/projects/autocomplete_sources_controller.rb'
+ - 'app/controllers/projects/avatars_controller.rb'
+ - 'app/controllers/projects/badges_controller.rb'
+ - 'app/controllers/projects/blame_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/boards_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/build_artifacts_controller.rb'
+ - 'app/controllers/projects/builds_controller.rb'
+ - 'app/controllers/projects/ci/daily_build_group_report_results_controller.rb'
+ - 'app/controllers/projects/ci/lints_controller.rb'
+ - 'app/controllers/projects/ci/pipeline_editor_controller.rb'
+ - 'app/controllers/projects/ci/secure_files_controller.rb'
+ - 'app/controllers/projects/cluster_agents_controller.rb'
+ - 'app/controllers/projects/clusters/integrations_controller.rb'
+ - 'app/controllers/projects/clusters_controller.rb'
+ - 'app/controllers/projects/commit_controller.rb'
+ - 'app/controllers/projects/commits_controller.rb'
+ - 'app/controllers/projects/compare_controller.rb'
+ - 'app/controllers/projects/confluences_controller.rb'
+ - 'app/controllers/projects/cycle_analytics_controller.rb'
+ - 'app/controllers/projects/deploy_keys_controller.rb'
+ - 'app/controllers/projects/deploy_tokens_controller.rb'
+ - 'app/controllers/projects/deployments_controller.rb'
+ - 'app/controllers/projects/design_management/designs_controller.rb'
+ - 'app/controllers/projects/discussions_controller.rb'
+ - 'app/controllers/projects/environments/prometheus_api_controller.rb'
+ - 'app/controllers/projects/environments/sample_metrics_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/error_tracking/base_controller.rb'
+ - 'app/controllers/projects/error_tracking_controller.rb'
+ - 'app/controllers/projects/feature_flags_clients_controller.rb'
+ - 'app/controllers/projects/feature_flags_controller.rb'
+ - 'app/controllers/projects/feature_flags_user_lists_controller.rb'
+ - 'app/controllers/projects/find_file_controller.rb'
+ - 'app/controllers/projects/forks_controller.rb'
+ - 'app/controllers/projects/google_cloud/base_controller.rb'
+ - 'app/controllers/projects/google_cloud/deployments_controller.rb'
+ - 'app/controllers/projects/google_cloud/gcp_regions_controller.rb'
+ - 'app/controllers/projects/google_cloud/revoke_oauth_controller.rb'
+ - 'app/controllers/projects/google_cloud/service_accounts_controller.rb'
+ - 'app/controllers/projects/google_cloud_controller.rb'
+ - 'app/controllers/projects/grafana_api_controller.rb'
+ - 'app/controllers/projects/graphs_controller.rb'
+ - 'app/controllers/projects/group_links_controller.rb'
+ - 'app/controllers/projects/hook_logs_controller.rb'
+ - 'app/controllers/projects/hooks_controller.rb'
+ - 'app/controllers/projects/imports_controller.rb'
+ - 'app/controllers/projects/incidents_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/jobs_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/learn_gitlab_controller.rb'
+ - 'app/controllers/projects/mattermosts_controller.rb'
+ - 'app/controllers/projects/merge_requests/application_controller.rb'
+ - 'app/controllers/projects/merge_requests/conflicts_controller.rb'
+ - 'app/controllers/projects/merge_requests/content_controller.rb'
+ - 'app/controllers/projects/merge_requests/creations_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/merge_requests/drafts_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/mirrors_controller.rb'
+ - 'app/controllers/projects/network_controller.rb'
+ - 'app/controllers/projects/notes_controller.rb'
+ - 'app/controllers/projects/pages_controller.rb'
+ - 'app/controllers/projects/pages_domains_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects/pipelines_settings_controller.rb'
+ - 'app/controllers/projects/product_analytics_controller.rb'
+ - 'app/controllers/projects/project_members_controller.rb'
+ - 'app/controllers/projects/protected_branches_controller.rb'
+ - 'app/controllers/projects/protected_refs_controller.rb'
+ - 'app/controllers/projects/protected_tags_controller.rb'
+ - 'app/controllers/projects/raw_controller.rb'
+ - 'app/controllers/projects/redirect_controller.rb'
+ - 'app/controllers/projects/refs_controller.rb'
+ - 'app/controllers/projects/releases_controller.rb'
+ - 'app/controllers/projects/repositories_controller.rb'
+ - 'app/controllers/projects/runner_projects_controller.rb'
+ - 'app/controllers/projects/runners_controller.rb'
+ - 'app/controllers/projects/service_desk_controller.rb'
+ - 'app/controllers/projects/service_hook_logs_controller.rb'
+ - 'app/controllers/projects/service_ping_controller.rb'
+ - 'app/controllers/projects/services_controller.rb'
+ - 'app/controllers/projects/snippets/application_controller.rb'
+ - 'app/controllers/projects/snippets/blobs_controller.rb'
+ - 'app/controllers/projects/snippets_controller.rb'
+ - 'app/controllers/projects/starrers_controller.rb'
+ - 'app/controllers/projects/static_site_editor_controller.rb'
+ - 'app/controllers/projects/tags/releases_controller.rb'
+ - 'app/controllers/projects/tags_controller.rb'
+ - 'app/controllers/projects/templates_controller.rb'
+ - 'app/controllers/projects/terraform_controller.rb'
+ - 'app/controllers/projects/todos_controller.rb'
+ - 'app/controllers/projects/tree_controller.rb'
+ - 'app/controllers/projects/triggers_controller.rb'
+ - 'app/controllers/projects/uploads_controller.rb'
+ - 'app/controllers/projects/usage_quotas_controller.rb'
+ - 'app/controllers/projects/variables_controller.rb'
+ - 'app/controllers/projects/web_ide_schemas_controller.rb'
+ - 'app/controllers/projects/web_ide_terminals_controller.rb'
+ - 'app/controllers/projects/wikis_controller.rb'
+ - 'app/controllers/projects/work_items_controller.rb'
+ - 'app/controllers/snippets/application_controller.rb'
+ - 'app/controllers/snippets/blobs_controller.rb'
+ - 'app/controllers/snippets/notes_controller.rb'
+ - 'app/controllers/terraform/services_controller.rb'
+ - 'app/finders/admin/projects_finder.rb'
+ - 'app/finders/merge_request/metrics_finder.rb'
+ - 'app/finders/packages/package_file_finder.rb'
+ - 'app/finders/packages/tags_finder.rb'
+ - 'app/graphql/types/dependency_proxy/blob_type.rb'
+ - 'app/graphql/types/dependency_proxy/group_setting_type.rb'
+ - 'app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb'
+ - 'app/graphql/types/dependency_proxy/manifest_type.rb'
+ - 'app/graphql/types/dependency_proxy/manifest_type_enum.rb'
+ - 'app/graphql/types/namespace/package_settings_type.rb'
+ - 'app/graphql/types/namespace/shared_runners_setting_enum.rb'
+ - 'app/helpers/ci/triggers_helper.rb'
+ - 'app/helpers/groups/group_members_helper.rb'
+ - 'app/helpers/projects/alert_management_helper.rb'
+ - 'app/helpers/projects/cluster_agents_helper.rb'
+ - 'app/helpers/projects/error_tracking_helper.rb'
+ - 'app/helpers/projects/incidents_helper.rb'
+ - 'app/helpers/projects/project_members_helper.rb'
+ - 'app/helpers/projects/terraform_helper.rb'
+ - 'app/models/analytics/cycle_analytics/aggregation.rb'
+ - 'app/models/analytics/cycle_analytics/project_value_stream.rb'
+ - 'app/models/bulk_imports/configuration.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/bulk_imports/failure.rb'
+ - 'app/models/bulk_imports/tracker.rb'
+ - 'app/models/ci/build_pending_state.rb'
+ - 'app/models/ci/commit_with_pipeline.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/issue_contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/dependency_proxy/blob.rb'
+ - 'app/models/dependency_proxy/group_setting.rb'
+ - 'app/models/dependency_proxy/image_ttl_group_policy.rb'
+ - 'app/models/dependency_proxy/manifest.rb'
+ - 'app/models/dependency_proxy/registry.rb'
+ - 'app/models/error_tracking/client_key.rb'
+ - 'app/models/error_tracking/error.rb'
+ - 'app/models/error_tracking/error_event.rb'
+ - 'app/models/group/crm_settings.rb'
+ - 'app/models/instance_metadata/kas.rb'
+ - 'app/models/issue/email.rb'
+ - 'app/models/issue/metrics.rb'
+ - 'app/models/issues/csv_import.rb'
+ - 'app/models/loose_foreign_keys/deleted_record.rb'
+ - 'app/models/merge_request/cleanup_schedule.rb'
+ - 'app/models/merge_request/diff_commit_user.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/namespace/admin_note.rb'
+ - 'app/models/namespace/aggregation_schedule.rb'
+ - 'app/models/namespace/package_setting.rb'
+ - 'app/models/namespace/root_storage_statistics.rb'
+ - 'app/models/namespaces/sync_event.rb'
+ - 'app/models/packages/build_info.rb'
+ - 'app/models/packages/conan/file_metadatum.rb'
+ - 'app/models/packages/conan/metadatum.rb'
+ - 'app/models/packages/debian/file_metadatum.rb'
+ - 'app/models/packages/debian/group_architecture.rb'
+ - 'app/models/packages/debian/group_component.rb'
+ - 'app/models/packages/debian/group_component_file.rb'
+ - 'app/models/packages/debian/group_distribution.rb'
+ - 'app/models/packages/debian/group_distribution_key.rb'
+ - 'app/models/packages/debian/project_architecture.rb'
+ - 'app/models/packages/debian/project_component.rb'
+ - 'app/models/packages/debian/project_component_file.rb'
+ - 'app/models/packages/debian/project_distribution.rb'
+ - 'app/models/packages/debian/project_distribution_key.rb'
+ - 'app/models/packages/debian/publication.rb'
+ - 'app/models/packages/dependency.rb'
+ - 'app/models/packages/dependency_link.rb'
+ - 'app/models/packages/event.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/packages/npm/metadatum.rb'
+ - 'app/models/packages/nuget/dependency_link_metadatum.rb'
+ - 'app/models/packages/nuget/metadatum.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/package_file.rb'
+ - 'app/models/packages/package_file_build_info.rb'
+ - 'app/models/packages/pypi/metadatum.rb'
+ - 'app/models/packages/sem_ver.rb'
+ - 'app/models/packages/tag.rb'
+ - 'app/models/projects/sync_event.rb'
+ - 'app/models/protected_branch/merge_access_level.rb'
+ - 'app/models/protected_branch/push_access_level.rb'
+ - 'app/models/protected_tag/create_access_level.rb'
+ - 'app/policies/namespace/package_setting_policy.rb'
+ - 'app/policies/namespace/root_storage_statistics_policy.rb'
+ - 'app/policies/wiki_page/meta_policy.rb'
+ - 'app/serializers/acts_as_taggable_on/tag_entity.rb'
+ - 'app/serializers/acts_as_taggable_on/tag_serializer.rb'
+ - 'app/serializers/ci/lint/job_entity.rb'
+ - 'app/serializers/ci/lint/result_entity.rb'
+ - 'app/serializers/ci/lint/result_serializer.rb'
+ - 'app/serializers/ci/pipeline_entity.rb'
+ - 'app/serializers/import/base_provider_repo_entity.rb'
+ - 'app/serializers/import/bitbucket_provider_repo_entity.rb'
+ - 'app/serializers/import/bitbucket_server_provider_repo_entity.rb'
+ - 'app/serializers/import/bulk_import_entity.rb'
+ - 'app/serializers/import/fogbugz_provider_repo_entity.rb'
+ - 'app/serializers/import/githubish_provider_repo_entity.rb'
+ - 'app/serializers/import/gitlab_provider_repo_entity.rb'
+ - 'app/serializers/import/manifest_provider_repo_entity.rb'
+ - 'app/serializers/import/provider_repo_serializer.rb'
+ - 'app/serializers/jira_connect/app_data_serializer.rb'
+ - 'app/serializers/jira_connect/group_entity.rb'
+ - 'app/serializers/jira_connect/subscription_entity.rb'
+ - 'app/serializers/merge_requests/pipeline_entity.rb'
+ - 'app/services/projects/branches_by_mode_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/repositories/destroy_rollback_service.rb'
+ - 'app/services/repositories/destroy_service.rb'
+ - 'app/services/repositories/shell_destroy_service.rb'
+ - 'app/uploaders/dependency_proxy/file_uploader.rb'
+ - 'app/uploaders/packages/composer/cache_uploader.rb'
+ - 'app/uploaders/packages/debian/component_file_uploader.rb'
+ - 'app/uploaders/packages/debian/distribution_release_file_uploader.rb'
+ - 'app/uploaders/packages/package_file_uploader.rb'
+ - 'app/workers/merge_requests/delete_source_branch_worker.rb'
+ - 'app/workers/merge_requests/handle_assignees_change_worker.rb'
+ - 'app/workers/merge_requests/resolve_todos_worker.rb'
+ - 'config/initializers/active_record_data_types.rb'
+ - 'config/initializers/http_hostname_override.rb'
+ - 'config/initializers/httpclient_patch.rb'
+ - 'config/initializers/omniauth.rb'
+ - 'config/initializers/postgres_cte_as_materialized.rb'
+ - 'config/initializers/postgresql_cte.rb'
+ - 'config/initializers/rdoc_segfault_patch.rb'
+ - 'config/initializers/zz_metrics.rb'
+ - 'ee/app/controllers/admin/audit_log_reports_controller.rb'
+ - 'ee/app/controllers/admin/audit_logs_controller.rb'
+ - 'ee/app/controllers/admin/credentials_controller.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/controllers/admin/emails_controller.rb'
+ - 'ee/app/controllers/admin/geo/application_controller.rb'
+ - 'ee/app/controllers/admin/geo/designs_controller.rb'
+ - 'ee/app/controllers/admin/geo/nodes_controller.rb'
+ - 'ee/app/controllers/admin/geo/projects_controller.rb'
+ - 'ee/app/controllers/admin/geo/replicables_controller.rb'
+ - 'ee/app/controllers/admin/geo/settings_controller.rb'
+ - 'ee/app/controllers/admin/licenses_controller.rb'
+ - 'ee/app/controllers/admin/push_rules_controller.rb'
+ - 'ee/app/controllers/admin/subscriptions_controller.rb'
+ - 'ee/app/controllers/admin/user_permission_exports_controller.rb'
+ - 'ee/app/controllers/concerns/registrations/apply_trial.rb'
+ - 'ee/app/controllers/concerns/registrations/create_group.rb'
+ - 'ee/app/controllers/concerns/registrations/create_project.rb'
+ - 'ee/app/controllers/concerns/registrations/verification.rb'
+ - 'ee/app/controllers/ee/profiles/accounts_controller.rb'
+ - 'ee/app/controllers/ee/profiles/preferences_controller.rb'
+ - 'ee/app/controllers/ee/projects/analytics/cycle_analytics/summary_controller.rb'
+ - 'ee/app/controllers/ee/projects/incidents_controller.rb'
+ - 'ee/app/controllers/groups/analytics/application_controller.rb'
+ - 'ee/app/controllers/groups/analytics/ci_cd_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/coverage_reports_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics/value_streams_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/devops_adoption_controller.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/repository_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/tasks_by_type_controller.rb'
+ - 'ee/app/controllers/groups/audit_events_controller.rb'
+ - 'ee/app/controllers/groups/billings_controller.rb'
+ - 'ee/app/controllers/groups/bulk_update_controller.rb'
+ - 'ee/app/controllers/groups/compliance_frameworks_controller.rb'
+ - 'ee/app/controllers/groups/contribution_analytics_controller.rb'
+ - 'ee/app/controllers/groups/epic_boards_controller.rb'
+ - 'ee/app/controllers/groups/epic_issues_controller.rb'
+ - 'ee/app/controllers/groups/epics/notes_controller.rb'
+ - 'ee/app/controllers/groups/epics_controller.rb'
+ - 'ee/app/controllers/groups/hooks_controller.rb'
+ - 'ee/app/controllers/groups/insights_controller.rb'
+ - 'ee/app/controllers/groups/issues_analytics_controller.rb'
+ - 'ee/app/controllers/groups/issues_controller.rb'
+ - 'ee/app/controllers/groups/iteration_cadences_controller.rb'
+ - 'ee/app/controllers/groups/iterations_controller.rb'
+ - 'ee/app/controllers/groups/ldap_group_links_controller.rb'
+ - 'ee/app/controllers/groups/ldap_settings_controller.rb'
+ - 'ee/app/controllers/groups/ldaps_controller.rb'
+ - 'ee/app/controllers/groups/merge_requests_controller.rb'
+ - 'ee/app/controllers/groups/omniauth_callbacks_controller.rb'
+ - 'ee/app/controllers/groups/push_rules_controller.rb'
+ - 'ee/app/controllers/groups/saml_providers_controller.rb'
+ - 'ee/app/controllers/groups/scim_oauth_controller.rb'
+ - 'ee/app/controllers/groups/seat_usage_controller.rb'
+ - 'ee/app/controllers/groups/security/compliance_dashboards_controller.rb'
+ - 'ee/app/controllers/groups/security/credentials_controller.rb'
+ - 'ee/app/controllers/groups/security/dashboard_controller.rb'
+ - 'ee/app/controllers/groups/security/discover_controller.rb'
+ - 'ee/app/controllers/groups/security/merge_commit_reports_controller.rb'
+ - 'ee/app/controllers/groups/sso_controller.rb'
+ - 'ee/app/controllers/groups/todos_controller.rb'
+ - 'ee/app/controllers/groups/usage_quotas_controller.rb'
+ - 'ee/app/controllers/groups/wikis_controller.rb'
+ - 'ee/app/controllers/oauth/geo_auth_controller.rb'
+ - 'ee/app/controllers/profiles/billings_controller.rb'
+ - 'ee/app/controllers/profiles/slacks_controller.rb'
+ - 'ee/app/controllers/profiles/usage_quotas_controller.rb'
+ - 'ee/app/controllers/projects/analytics/issues_analytics_controller.rb'
+ - 'ee/app/controllers/projects/analytics/merge_request_analytics_controller.rb'
+ - 'ee/app/controllers/projects/approver_groups_controller.rb'
+ - 'ee/app/controllers/projects/approvers_controller.rb'
+ - 'ee/app/controllers/projects/audit_events_controller.rb'
+ - 'ee/app/controllers/projects/insights_controller.rb'
+ - 'ee/app/controllers/projects/iteration_cadences_controller.rb'
+ - 'ee/app/controllers/projects/iterations_controller.rb'
+ - 'ee/app/controllers/projects/path_locks_controller.rb'
+ - 'ee/app/controllers/projects/protected_environments_controller.rb'
+ - 'ee/app/controllers/projects/push_rules_controller.rb'
+ - 'ee/app/controllers/projects/quality/test_cases_controller.rb'
+ - 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
+ - 'ee/app/controllers/projects/subscriptions_controller.rb'
+ - 'ee/app/controllers/projects/vulnerability_feedback_controller.rb'
+ - 'ee/app/finders/ee/group_members_finder.rb'
+ - 'ee/app/graphql/mutations/app_sec/fuzzing/coverage/corpus/create.rb'
+ - 'ee/app/helpers/ee/groups/analytics/cycle_analytics_helper.rb'
+ - 'ee/app/helpers/ee/groups/group_members_helper.rb'
+ - 'ee/app/helpers/ee/security_orchestration_helper.rb'
+ - 'ee/app/helpers/groups/ldap_sync_helper.rb'
+ - 'ee/app/helpers/groups/security_features_helper.rb'
+ - 'ee/app/helpers/groups/sso_helper.rb'
+ - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
+ - 'ee/app/helpers/projects/security/api_fuzzing_configuration_helper.rb'
+ - 'ee/app/helpers/projects/security/dast_configuration_helper.rb'
+ - 'ee/app/helpers/projects/security/dast_profiles_helper.rb'
+ - 'ee/app/helpers/projects/security/discover_helper.rb'
+ - 'ee/app/helpers/projects/security/sast_configuration_helper.rb'
+ - 'ee/app/models/analytics/cycle_analytics/group_value_stream.rb'
+ - 'ee/app/models/analytics/devops_adoption.rb'
+ - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
+ - 'ee/app/models/analytics/devops_adoption/snapshot.rb'
+ - 'ee/app/models/analytics/issues_analytics.rb'
+ - 'ee/app/models/analytics/language_trend.rb'
+ - 'ee/app/models/analytics/language_trend/repository_language.rb'
+ - 'ee/app/models/concerns/geo/replicable_registry.rb'
+ - 'ee/app/models/concerns/geo/selective_sync.rb'
+ - 'ee/app/models/concerns/geo/syncable.rb'
+ - 'ee/app/models/dast/profile_schedule.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/namespace/root_excess_storage_size.rb'
+ - 'ee/app/models/ee/namespace/root_storage_size.rb'
+ - 'ee/app/models/elastic/reindexing_slice.rb'
+ - 'ee/app/models/elastic/reindexing_subtask.rb'
+ - 'ee/app/models/elastic/reindexing_task.rb'
+ - 'ee/app/models/epic/metrics.rb'
+ - 'ee/app/models/epic/related_epic_link.rb'
+ - 'ee/app/models/geo/base_registry.rb'
+ - 'ee/app/models/geo/container_repository_registry.rb'
+ - 'ee/app/models/geo/deleted_project.rb'
+ - 'ee/app/models/geo/design_registry.rb'
+ - 'ee/app/models/geo/event_log_state.rb'
+ - 'ee/app/models/geo/group_wiki_repository_registry.rb'
+ - 'ee/app/models/geo/job_artifact_registry.rb'
+ - 'ee/app/models/geo/lfs_object_registry.rb'
+ - 'ee/app/models/geo/merge_request_diff_registry.rb'
+ - 'ee/app/models/geo/package_file_registry.rb'
+ - 'ee/app/models/geo/pages_deployment_registry.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo/push_user.rb'
+ - 'ee/app/models/geo/secondary_usage_data.rb'
+ - 'ee/app/models/geo/snippet_repository_registry.rb'
+ - 'ee/app/models/geo/terraform_state_version_registry.rb'
+ - 'ee/app/models/geo/upload_registry.rb'
+ - 'ee/app/models/protected_branch/required_code_owners_section.rb'
+ - 'ee/app/models/protected_branch/unprotect_access_level.rb'
+ - 'ee/app/models/protected_environment/deploy_access_level.rb'
+ - 'ee/app/serializers/vulnerabilities/feedback_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/feedback_serializer.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_diff_serializer.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_reports_comparer_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_serializer.rb'
+ - 'ee/app/serializers/vulnerabilities/identifier_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/request_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/response_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/scanner_entity.rb'
+ - 'ee/app/services/concerns/epics/related_epic_links/usage_data_helper.rb'
+ - 'ee/app/services/ee/projects/after_rename_service.rb'
+ - 'ee/app/services/ee/projects/disable_deploy_key_service.rb'
+ - 'ee/app/services/ee/projects/enable_deploy_key_service.rb'
+ - 'ee/app/services/ee/projects/update_pages_service.rb'
+ - 'ee/db/fixtures/development/20_burndown.rb'
+ - 'ee/db/fixtures/development/20_vulnerabilities.rb'
+ - 'ee/db/fixtures/development/21_dast_profiles.rb'
+ - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
+ - 'ee/db/fixtures/development/32_compliance_report_violations.rb'
+ - 'ee/db/fixtures/development/90_productivity_analytics.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/base_query_builder.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/records_fetcher.rb'
+ - 'ee/lib/ee/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'ee/lib/ee/gitlab/throttle.rb'
+ - 'ee/lib/gitlab/path_locks_finder.rb'
+ - 'lib/api/error_tracking/client_keys.rb'
+ - 'lib/api/error_tracking/collector.rb'
+ - 'lib/api/error_tracking/project_settings.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/ci/badge/base.rb'
+ - 'lib/gitlab/ci/badge/coverage/metadata.rb'
+ - 'lib/gitlab/ci/badge/coverage/report.rb'
+ - 'lib/gitlab/ci/badge/coverage/template.rb'
+ - 'lib/gitlab/ci/badge/metadata.rb'
+ - 'lib/gitlab/ci/badge/pipeline/metadata.rb'
+ - 'lib/gitlab/ci/badge/pipeline/status.rb'
+ - 'lib/gitlab/ci/badge/pipeline/template.rb'
+ - 'lib/gitlab/ci/badge/release/latest_release.rb'
+ - 'lib/gitlab/ci/badge/release/metadata.rb'
+ - 'lib/gitlab/ci/badge/release/template.rb'
+ - 'lib/gitlab/ci/badge/template.rb'
+ - 'lib/gitlab/ci/build/auto_retry.rb'
+ - 'lib/gitlab/ci/build/rules/rule.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause/changes.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause/exists.rb'
+ - 'lib/gitlab/ci/build/rules/rule/clause/if.rb'
+ - 'lib/gitlab/ci/config/entry/include/rules/rule.rb'
+ - 'lib/gitlab/ci/config/entry/rules/rule.rb'
+ - 'lib/gitlab/ci/mask_secret.rb'
+ - 'lib/gitlab/ci/warnings.rb'
+ - 'lib/gitlab/config_helper.rb'
+ - 'lib/gitlab/instrumentation/elasticsearch_transport.rb'
+ - 'lib/gitlab/serverless/service.rb'
+ - 'lib/gitlab/usage_data_counters/base_counter.rb'
+ - 'lib/gitlab/usage_data_counters/ci_template_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/cycle_analytics_counter.rb'
+ - 'lib/gitlab/usage_data_counters/designs_counter.rb'
+ - 'lib/gitlab/usage_data_counters/note_counter.rb'
+ - 'lib/gitlab/usage_data_counters/productivity_analytics_counter.rb'
+ - 'lib/gitlab/usage_data_counters/service_usage_data_counter.rb'
+ - 'lib/gitlab/usage_data_counters/snippet_counter.rb'
+ - 'lib/gitlab/usage_data_counters/source_code_counter.rb'
+ - 'lib/gitlab/usage_data_counters/wiki_page_counter.rb'
+ - 'lib/release_highlights/validator/entry.rb'
+ - 'qa/qa/page/component/project/templates.rb'
+ - 'scripts/perf/gc/print_gc_stats.rb'
+ - 'spec/support/inspect_squelch.rb'
+ - 'spec/support/matchers/markdown_matchers.rb'
diff --git a/.rubocop_todo/style/empty_else.yml b/.rubocop_todo/style/empty_else.yml
new file mode 100644
index 00000000000..ed840856e19
--- /dev/null
+++ b/.rubocop_todo/style/empty_else.yml
@@ -0,0 +1,60 @@
+---
+# Cop supports --auto-correct.
+Style/EmptyElse:
+ # Offense count: 59
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/issuable_collections_action.rb'
+ - 'app/controllers/concerns/sends_blob.rb'
+ - 'app/controllers/google_api/authorizations_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/finders/group_finder.rb'
+ - 'app/finders/merge_requests_finder/params.rb'
+ - 'app/finders/snippets_finder.rb'
+ - 'app/graphql/mutations/concerns/mutations/spam_protection.rb'
+ - 'app/graphql/resolvers/group_milestones_resolver.rb'
+ - 'app/graphql/types/ci/detailed_status_type.rb'
+ - 'app/graphql/types/packages/package_file_type.rb'
+ - 'app/graphql/types/packages/package_type.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/legacy_diff_discussion.rb'
+ - 'app/models/note.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/resource_state_event.rb'
+ - 'app/models/resource_timebox_event.rb'
+ - 'app/services/award_emojis/add_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/workers/post_receive.rb'
+ - 'config/initializers/doorkeeper_openid_connect.rb'
+ - 'ee/app/controllers/admin/audit_logs_controller.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/helpers/ee/kerberos_spnego_helper.rb'
+ - 'ee/app/helpers/ee/trial_helper.rb'
+ - 'ee/app/models/ee/audit_event.rb'
+ - 'ee/app/services/ee/users/update_service.rb'
+ - 'ee/app/services/epics/tree_reorder_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/check_future_renewal_service.rb'
+ - 'ee/app/services/projects/update_mirror_service.rb'
+ - 'ee/app/workers/audit_events/audit_event_streaming_worker.rb'
+ - 'ee/app/workers/gitlab_subscriptions/notify_seats_exceeded_worker.rb'
+ - 'ee/db/fixtures/development/20_vulnerabilities.rb'
+ - 'ee/lib/elastic/latest/note_instance_proxy.rb'
+ - 'ee/lib/gitlab/geo/oauth/logout_token.rb'
+ - 'lib/api/subscriptions.rb'
+ - 'lib/gitlab/auth/o_auth/provider.rb'
+ - 'lib/gitlab/database/load_balancing/sidekiq_server_middleware.rb'
+ - 'lib/gitlab/database/sha256_attribute.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/git/ref.rb'
+ - 'lib/gitlab/git/tag.rb'
+ - 'lib/gitlab/pagination/keyset/paginator.rb'
+ - 'lib/gitlab/sidekiq_daemon/monitor.rb'
+ - 'lib/gitlab/x509/signature.rb'
+ - 'lib/peek/views/external_http.rb'
+ - 'qa/qa/support/loglinking.rb'
+ - 'spec/support/helpers/api_internal_base_helpers.rb'
+ - 'spec/support/shared_examples/requests/api/snippets_shared_examples.rb'
diff --git a/.rubocop_todo/style/empty_method.yml b/.rubocop_todo/style/empty_method.yml
new file mode 100644
index 00000000000..9bca01015aa
--- /dev/null
+++ b/.rubocop_todo/style/empty_method.yml
@@ -0,0 +1,196 @@
+---
+# Cop supports --auto-correct.
+Style/EmptyMethod:
+ # Offense count: 240
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/application_settings/appearances_controller.rb'
+ - 'app/controllers/admin/applications_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/deploy_keys_controller.rb'
+ - 'app/controllers/admin/hook_logs_controller.rb'
+ - 'app/controllers/admin/hooks_controller.rb'
+ - 'app/controllers/admin/identities_controller.rb'
+ - 'app/controllers/admin/labels_controller.rb'
+ - 'app/controllers/admin/runners_controller.rb'
+ - 'app/controllers/admin/topics_controller.rb'
+ - 'app/controllers/admin/usage_trends_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/concerns/boards_actions.rb'
+ - 'app/controllers/groups/milestones_controller.rb'
+ - 'app/controllers/groups/runners_controller.rb'
+ - 'app/controllers/groups/settings/applications_controller.rb'
+ - 'app/controllers/groups/settings/ci_cd_controller.rb'
+ - 'app/controllers/groups/settings/packages_and_registries_controller.rb'
+ - 'app/controllers/help_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/manifest_controller.rb'
+ - 'app/controllers/import/phabricator_controller.rb'
+ - 'app/controllers/profiles/chat_names_controller.rb'
+ - 'app/controllers/profiles/passwords_controller.rb'
+ - 'app/controllers/profiles/preferences_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/alert_management_controller.rb'
+ - 'app/controllers/projects/ci/lints_controller.rb'
+ - 'app/controllers/projects/ci/pipeline_editor_controller.rb'
+ - 'app/controllers/projects/ci/secure_files_controller.rb'
+ - 'app/controllers/projects/confluences_controller.rb'
+ - 'app/controllers/projects/deploy_keys_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/feature_flags_controller.rb'
+ - 'app/controllers/projects/feature_flags_user_lists_controller.rb'
+ - 'app/controllers/projects/hook_logs_controller.rb'
+ - 'app/controllers/projects/import/jira_controller.rb'
+ - 'app/controllers/projects/imports_controller.rb'
+ - 'app/controllers/projects/incidents_controller.rb'
+ - 'app/controllers/projects/jobs_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/learn_gitlab_controller.rb'
+ - 'app/controllers/projects/mattermosts_controller.rb'
+ - 'app/controllers/projects/pages_domains_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/product_analytics_controller.rb'
+ - 'app/controllers/projects/runners_controller.rb'
+ - 'app/controllers/projects/services_controller.rb'
+ - 'app/controllers/projects/settings/packages_and_registries_controller.rb'
+ - 'app/controllers/projects/tags/releases_controller.rb'
+ - 'app/controllers/projects/terraform_controller.rb'
+ - 'app/controllers/projects/triggers_controller.rb'
+ - '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'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/concerns/reactive_caching.rb'
+ - 'app/models/concerns/relative_positioning.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/microsoft_teams.rb'
+ - 'app/models/integrations/unify_circuit.rb'
+ - 'app/models/integrations/webex_teams.rb'
+ - 'app/models/wiki.rb'
+ - 'app/services/auto_merge/base_service.rb'
+ - 'app/services/award_emojis/destroy_service.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issues/reopen_service.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/workers/authorized_projects_worker.rb'
+ - 'app/workers/namespaces/root_statistics_worker.rb'
+ - 'db/migrate/20210420012444_change_web_hook_events_default.rb'
+ - 'db/migrate/20210507191949_add_remove_on_issue_close_to_labels.rb'
+ - 'db/migrate/20210729123101_confirm_security_bot.rb'
+ - 'db/migrate/20211012134316_clean_up_migrate_merge_request_diff_commit_users.rb'
+ - 'db/post_migrate/20210511095658_schedule_migrate_project_taggings_context_from_tags_to_topics.rb'
+ - 'db/post_migrate/20210730170823_schedule_security_setting_creation.rb'
+ - 'db/post_migrate/20210823132600_remove_duplicate_dast_site_tokens.rb'
+ - 'db/post_migrate/20210826171758_initialize_throttle_unauthenticated_api_columns.rb'
+ - 'db/post_migrate/20211028100843_delete_issue_merge_request_taggings_records.rb'
+ - 'db/post_migrate/20220324032250_migrate_shimo_confluence_service_category.rb'
+ - 'db/post_migrate/20220412143552_consume_remaining_encrypt_integration_property_jobs.rb'
+ - 'db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb'
+ - 'ee/app/controllers/admin/emails_controller.rb'
+ - 'ee/app/controllers/admin/geo/designs_controller.rb'
+ - 'ee/app/controllers/admin/geo/settings_controller.rb'
+ - 'ee/app/controllers/admin/push_rules_controller.rb'
+ - 'ee/app/controllers/groups/analytics/ci_cd_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics_controller.rb'
+ - 'ee/app/controllers/groups/analytics/devops_adoption_controller.rb'
+ - 'ee/app/controllers/groups/compliance_frameworks_controller.rb'
+ - 'ee/app/controllers/groups/feature_discovery_moments_controller.rb'
+ - 'ee/app/controllers/groups/hooks_controller.rb'
+ - 'ee/app/controllers/groups/ldap_group_links_controller.rb'
+ - 'ee/app/controllers/groups/push_rules_controller.rb'
+ - 'ee/app/controllers/projects/analytics/code_reviews_controller.rb'
+ - 'ee/app/controllers/projects/analytics/merge_request_analytics_controller.rb'
+ - 'ee/app/controllers/projects/incident_management/escalation_policies_controller.rb'
+ - 'ee/app/controllers/projects/incident_management/oncall_schedules_controller.rb'
+ - 'ee/app/controllers/projects/on_demand_scans_controller.rb'
+ - 'ee/app/controllers/projects/security/api_fuzzing_configuration_controller.rb'
+ - 'ee/app/controllers/projects/security/corpus_management_controller.rb'
+ - 'ee/app/controllers/projects/security/dast_configuration_controller.rb'
+ - 'ee/app/controllers/projects/security/dast_profiles_controller.rb'
+ - 'ee/app/controllers/projects/security/dast_scanner_profiles_controller.rb'
+ - 'ee/app/controllers/projects/security/dast_site_profiles_controller.rb'
+ - 'ee/app/controllers/projects/security/sast_configuration_controller.rb'
+ - 'ee/app/controllers/projects/settings/slacks_controller.rb'
+ - 'ee/app/controllers/registrations/company_controller.rb'
+ - 'ee/app/controllers/registrations/verification_controller.rb'
+ - 'ee/app/controllers/subscriptions/groups_controller.rb'
+ - 'ee/app/controllers/trial_registrations_controller.rb'
+ - 'ee/app/controllers/trials_controller.rb'
+ - 'ee/app/experiments/cart_abandonment_modal_experiment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/services/feature_flag_issues/destroy_service.rb'
+ - 'ee/db/geo/migrate/20170906174622_remove_duplicates_from_project_registry.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/helpers/projects_helpers.rb'
+ - 'lib/api/projects_relation_builder.rb'
+ - 'lib/backup/task.rb'
+ - 'lib/banzai/filter/inline_embeds_filter.rb'
+ - 'lib/feature.rb'
+ - 'lib/gitlab/alert_management/payload/base.rb'
+ - 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'lib/gitlab/background_migration/create_security_setting.rb'
+ - 'lib/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'lib/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb'
+ - 'lib/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'lib/gitlab/background_migration/migrate_requirements_to_work_items.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerability_finding_signatures_for_findings.rb'
+ - 'lib/gitlab/background_migration/update_vulnerability_occurrences_location.rb'
+ - 'lib/gitlab/ci/config/entry/need.rb'
+ - 'lib/gitlab/ci/config/entry/rules/rule.rb'
+ - 'lib/gitlab/ci/limit.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/after_config.rb'
+ - 'lib/gitlab/config/entry/node.rb'
+ - 'lib/gitlab/config/entry/simplifiable.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/experience.rb'
+ - 'lib/gitlab/empty_search_results.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/import_export/json/ndjson_writer.rb'
+ - 'lib/gitlab/null_request_store.rb'
+ - 'lib/gitlab/usage_data_non_sql_metrics.rb'
+ - 'lib/mattermost/session.rb'
+ - 'qa/qa/resource/clusters/agent.rb'
+ - 'qa/qa/resource/clusters/agent_token.rb'
+ - 'qa/qa/resource/job.rb'
+ - 'qa/qa/resource/package.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/resource/runner.rb'
+ - 'qa/qa/service/cluster_provider/k3d.rb'
+ - 'qa/qa/service/cluster_provider/k3s.rb'
+ - 'qa/qa/service/cluster_provider/minikube.rb'
+ - 'spec/controllers/concerns/check_rate_limit_spec.rb'
+ - 'spec/controllers/concerns/issuable_actions_spec.rb'
+ - 'spec/initializers/forbid_sidekiq_in_transactions_spec.rb'
+ - 'spec/lib/api/helpers/rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_client_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb'
+ - 'spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb'
+ - 'spec/lib/gitlab/repository_archive_rate_limiter_spec.rb'
+ - 'spec/lib/gitlab/repository_cache_adapter_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/server_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/instrumentation_logger_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/query_analyzer_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/server_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/utils/delegator_override/validator_spec.rb'
+ - 'spec/lib/gitlab/utils/delegator_override_spec.rb'
+ - 'spec/lib/gitlab/utils/override_spec.rb'
+ - 'spec/workers/concerns/waitable_worker_spec.rb'
diff --git a/.rubocop_todo/style/explicit_block_argument.yml b/.rubocop_todo/style/explicit_block_argument.yml
new file mode 100644
index 00000000000..f6bff468c76
--- /dev/null
+++ b/.rubocop_todo/style/explicit_block_argument.yml
@@ -0,0 +1,114 @@
+---
+# Cop supports --auto-correct.
+Style/ExplicitBlockArgument:
+ # Offense count: 143
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/background_migrations_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/models/application_record.rb'
+ - 'app/models/broadcast_message.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_trace_chunks/redis.rb'
+ - 'app/models/ci/build_trace_chunks/redis_trace_chunks.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - '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'
+ - 'ee/app/services/gitlab_subscriptions/fetch_subscription_plans_service.rb'
+ - 'ee/app/services/group_saml/identity/destroy_service.rb'
+ - 'ee/lib/ee/backup/repositories.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'ee/lib/gitlab/audit/events/preloader.rb'
+ - 'ee/lib/gitlab/ci/config/security_orchestration_policies/processor.rb'
+ - 'ee/lib/gitlab/ci/parsers/license_compliance/v1.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/event_gap_tracking.rb'
+ - 'ee/lib/gitlab/items_collection.rb'
+ - 'ee/spec/features/epic_boards/multiple_epic_boards_spec.rb'
+ - 'ee/spec/features/projects/security/user_views_security_configuration_spec.rb'
+ - 'ee/spec/support/helpers/ee/migrations_helpers.rb'
+ - 'lib/api/helpers/caching.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/banzai/request_store_reference_cache.rb'
+ - 'lib/gitlab/application_context.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/cache.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/variables/collection.rb'
+ - 'lib/gitlab/cleanup/remote_uploads.rb'
+ - 'lib/gitlab/database/dynamic_model_helpers.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/git/changes.rb'
+ - 'lib/gitlab/gitaly_client/list_blobs_adapter.rb'
+ - 'lib/gitlab/gitaly_client/namespace_service.rb'
+ - 'lib/gitlab/gitaly_client/ref_service.rb'
+ - 'lib/gitlab/gitaly_client/storage_settings.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/graphql/tracers/application_context_tracer.rb'
+ - 'lib/gitlab/import_export/import_failure_service.rb'
+ - 'lib/gitlab/import_export/json/ndjson_writer.rb'
+ - 'lib/gitlab/import_export/json/streaming_serializer.rb'
+ - 'lib/gitlab/import_export/project/base_task.rb'
+ - 'lib/gitlab/import_export/project/export_task.rb'
+ - 'lib/gitlab/import_export/project/import_task.rb'
+ - 'lib/gitlab/metrics/dashboard/cache.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/base_stage.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/redis/wrapper.rb'
+ - 'lib/gitlab/reference_counter.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/gitlab/sidekiq_middleware/monitor.rb'
+ - 'lib/gitlab/sidekiq_middleware/query_analyzer.rb'
+ - 'lib/gitlab/sidekiq_middleware/request_store_middleware.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'lib/gitlab/utils/measuring.rb'
+ - 'lib/tasks/config_lint.rake'
+ - 'qa/qa/ee/page/insights/show.rb'
+ - 'qa/qa/ee/page/operations_dashboard.rb'
+ - 'qa/qa/ee/page/project/issue/show.rb'
+ - 'qa/qa/ee/page/project/show.rb'
+ - 'qa/qa/ee/page/project/wiki/show.rb'
+ - 'qa/qa/flow/login.rb'
+ - 'qa/qa/page/admin/menu.rb'
+ - 'qa/qa/page/base.rb'
+ - 'qa/qa/page/component/blob_content.rb'
+ - 'qa/qa/page/group/settings/group_deploy_tokens.rb'
+ - 'qa/qa/page/profile/menu.rb'
+ - 'qa/qa/page/project/settings/deploy_keys.rb'
+ - 'qa/qa/page/project/settings/deploy_tokens.rb'
+ - 'qa/qa/page/sub_menus/common.rb'
+ - 'qa/qa/resource/events/base.rb'
+ - 'qa/qa/runtime/api/repository_storage_moves.rb'
+ - 'qa/qa/runtime/search.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb'
+ - 'rubocop/code_reuse_helpers.rb'
+ - 'spec/features/merge_request/user_sees_wip_help_message_spec.rb'
+ - 'spec/features/projects/features_visibility_spec.rb'
+ - 'spec/lib/banzai/filter/repository_link_filter_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/project_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/services/pages/zip_directory_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/support/helpers/feature_flag_helpers.rb'
+ - 'spec/support/helpers/features/runner_helpers.rb'
+ - 'spec/support/helpers/features/top_nav_spec_helpers.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/modal_helpers.rb'
+ - 'spec/support/helpers/next_found_instance_of.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/shared_contexts/finders/merge_requests_finder_shared_contexts.rb'
+ - 'spec/support/shared_contexts/lib/gitlab/sidekiq_logging/structured_logger_shared_context.rb'
+ - 'spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
new file mode 100644
index 00000000000..82ece4dd3bd
--- /dev/null
+++ b/.rubocop_todo/style/format_string.yml
@@ -0,0 +1,360 @@
+---
+# Cop supports --auto-correct.
+Style/FormatString:
+ # Offense count: 769
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/components/diffs/overflow_warning_component.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/admin/impersonation_tokens_controller.rb'
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/admin/spam_logs_controller.rb'
+ - 'app/controllers/admin/topics_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/concerns/access_tokens_actions.rb'
+ - 'app/controllers/concerns/confirm_email_warning.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/integrations/hooks_execution.rb'
+ - 'app/controllers/concerns/membership_actions.rb'
+ - 'app/controllers/concerns/redirects_for_missing_path_on_tree.rb'
+ - 'app/controllers/concerns/spammable_actions/akismet_mark_as_spam_action.rb'
+ - 'app/controllers/groups/settings/ci_cd_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/import/bulk_imports_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/import/gitlab_groups_controller.rb'
+ - 'app/controllers/import/gitlab_projects_controller.rb'
+ - 'app/controllers/invites_controller.rb'
+ - 'app/controllers/jwt_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/profiles/chat_names_controller.rb'
+ - 'app/controllers/profiles/emails_controller.rb'
+ - 'app/controllers/profiles/preferences_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/services_controller.rb'
+ - 'app/controllers/projects/settings/ci_cd_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/finders/todos_finder.rb'
+ - 'app/graphql/mutations/release_asset_links/create.rb'
+ - 'app/helpers/auth_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/ci/builds_helper.rb'
+ - 'app/helpers/ci/pipelines_helper.rb'
+ - 'app/helpers/ci/runners_helper.rb'
+ - 'app/helpers/colors_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/form_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/import_helper.rb'
+ - 'app/helpers/invite_members_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/mirror_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/profiles_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/registrations_helper.rb'
+ - 'app/helpers/reminder_emails_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/ssh_keys_helper.rb'
+ - 'app/helpers/storage_helper.rb'
+ - 'app/helpers/tags_helper.rb'
+ - 'app/helpers/time_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/helpers/whats_new_helper.rb'
+ - 'app/helpers/wiki_page_version_helper.rb'
+ - 'app/mailers/emails/members.rb'
+ - 'app/mailers/emails/pages_domains.rb'
+ - 'app/mailers/emails/profile.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/concerns/limitable.rb'
+ - 'app/models/concerns/metric_image_uploading.rb'
+ - 'app/models/concerns/spammable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encrypted.rb'
+ - 'app/models/container_expiration_policy.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/description_version.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/diff_viewer/base.rb'
+ - 'app/models/integrations/asana.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/bugzilla.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/chat_message/pipeline_message.rb'
+ - 'app/models/integrations/confluence.rb'
+ - 'app/models/integrations/custom_issue_tracker.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/discord.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/ewm.rb'
+ - 'app/models/integrations/external_wiki.rb'
+ - 'app/models/integrations/flowdock.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/mattermost.rb'
+ - 'app/models/integrations/pipelines_email.rb'
+ - 'app/models/integrations/pivotaltracker.rb'
+ - 'app/models/integrations/pushover.rb'
+ - 'app/models/integrations/redmine.rb'
+ - 'app/models/integrations/unify_circuit.rb'
+ - 'app/models/integrations/webex_teams.rb'
+ - 'app/models/integrations/youtrack.rb'
+ - 'app/models/integrations/zentao.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/project.rb'
+ - 'app/models/resource_event.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/serverless/domain.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/user.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/services/alert_management/alerts/update_service.rb'
+ - 'app/services/boards/lists/base_create_service.rb'
+ - 'app/services/bulk_imports/file_download_service.rb'
+ - 'app/services/clusters/applications/check_progress_service.rb'
+ - 'app/services/clusters/applications/check_uninstall_progress_service.rb'
+ - 'app/services/clusters/applications/install_service.rb'
+ - 'app/services/clusters/applications/patch_service.rb'
+ - 'app/services/clusters/applications/upgrade_service.rb'
+ - 'app/services/clusters/aws/authorize_role_service.rb'
+ - 'app/services/clusters/aws/finalize_creation_service.rb'
+ - 'app/services/clusters/aws/verify_provision_status_service.rb'
+ - 'app/services/clusters/gcp/finalize_creation_service.rb'
+ - 'app/services/clusters/gcp/verify_provision_status_service.rb'
+ - 'app/services/clusters/kubernetes/configure_istio_ingress_service.rb'
+ - 'app/services/concerns/update_repository_storage_methods.rb'
+ - 'app/services/concerns/validates_classification_label.rb'
+ - 'app/services/gravatar_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/import/bitbucket_server_service.rb'
+ - 'app/services/import/github_service.rb'
+ - 'app/services/issuable_links/create_service.rb'
+ - 'app/services/issues/clone_service.rb'
+ - 'app/services/issues/close_service.rb'
+ - 'app/services/issues/move_service.rb'
+ - 'app/services/issues/set_crm_contacts_service.rb'
+ - 'app/services/jira/requests/base.rb'
+ - 'app/services/lfs/unlock_file_service.rb'
+ - 'app/services/metrics/dashboard/clone_dashboard_service.rb'
+ - 'app/services/metrics/dashboard/transient_embed_service.rb'
+ - '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'
+ - 'app/services/system_notes/design_management_service.rb'
+ - 'app/services/users/banned_user_base_service.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/any_field_validator.rb'
+ - 'app/validators/array_members_validator.rb'
+ - 'app/validators/import/gitlab_projects/remote_file_validator.rb'
+ - 'app/workers/concerns/project_import_options.rb'
+ - 'app/workers/gitlab/import/stuck_import_job.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'config/initializers/rack_lineprof.rb'
+ - 'danger/roulette/Dangerfile'
+ - 'ee/app/components/billing/plan_component.rb'
+ - 'ee/app/components/namespaces/preview_free_user_cap_alert_component.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - '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/date_range.rb'
+ - 'ee/app/controllers/ee/projects/issues_controller.rb'
+ - 'ee/app/controllers/ee/projects_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_client_controller.rb'
+ - 'ee/app/controllers/ee/repositories/lfs_api_controller.rb'
+ - 'ee/app/controllers/groups/saml_group_links_controller.rb'
+ - 'ee/app/controllers/groups/sso_controller.rb'
+ - 'ee/app/controllers/projects/requirements_management/requirements_controller.rb'
+ - 'ee/app/controllers/subscriptions/groups_controller.rb'
+ - 'ee/app/helpers/admin/emails_helper.rb'
+ - 'ee/app/helpers/billing_plans_helper.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/geo_helper.rb'
+ - 'ee/app/helpers/ee/groups/settings_helper.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/app/helpers/ee/import_helper.rb'
+ - 'ee/app/helpers/ee/profiles_helper.rb'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/helpers/ee/timeboxes_helper.rb'
+ - 'ee/app/helpers/ee/users/callouts_helper.rb'
+ - 'ee/app/helpers/groups/sso_helper.rb'
+ - 'ee/app/helpers/trial_registrations/reassurances_helper.rb'
+ - 'ee/app/helpers/vulnerabilities_helper.rb'
+ - 'ee/app/mailers/emails/namespace_storage_usage_mailer.rb'
+ - 'ee/app/models/ci/minutes/notification.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast/site_profile_secret_variable.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/dast_site_validation.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/geo/upload_registry.rb'
+ - 'ee/app/models/integrations/github.rb'
+ - 'ee/app/models/namespace_limit.rb'
+ - 'ee/app/models/users_security_dashboard_project.rb'
+ - 'ee/app/services/app_sec/dast/profiles/build_config_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'
+ - 'ee/app/services/dora/aggregate_metrics_service.rb'
+ - 'ee/app/services/ee/projects/create_from_template_service.rb'
+ - '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/network_policies/responses.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'
+ - 'ee/app/services/vulnerabilities/destroy_dismissal_feedback_service.rb'
+ - 'ee/app/services/vulnerabilities/dismiss_service.rb'
+ - 'ee/app/services/vulnerabilities/finding_dismiss_service.rb'
+ - 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerability_external_issue_links/create_service.rb'
+ - 'ee/lib/audit/details.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/audit/project_setting_changes_auditor.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/branch_check.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/commit_check.rb'
+ - 'ee/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/epic_actions.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_and_merge_request_actions.rb'
+ - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_added.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/issue_label_removed.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_added.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_label_removed.rb'
+ - 'ee/lib/gitlab/auth/group_saml/response_check.rb'
+ - 'ee/lib/gitlab/expiring_subscription_message.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
+ - 'ee/lib/gitlab/manual_renewal_banner.rb'
+ - 'ee/lib/gitlab/vulnerabilities/container_scanning_vulnerability.rb'
+ - 'ee/lib/tasks/gitlab/elastic.rake'
+ - 'ee/spec/controllers/admin/licenses_controller_spec.rb'
+ - 'ee/spec/controllers/groups/security/policies_controller_spec.rb'
+ - 'ee/spec/features/admin/admin_users_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
+ - 'ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/bulk_imports/network_error.rb'
+ - 'lib/bulk_imports/users_mapper.rb'
+ - 'lib/flowdock/git/builder.rb'
+ - 'lib/gitlab/bitbucket_server_import/importer.rb'
+ - 'lib/gitlab/checks/push_file_count_check.rb'
+ - 'lib/gitlab/ci/ansi2json/line.rb'
+ - 'lib/gitlab/ci/badge/coverage/template.rb'
+ - 'lib/gitlab/ci/config/entry/tags.rb'
+ - 'lib/gitlab/ci/status/build/waiting_for_approval.rb'
+ - 'lib/gitlab/config_checker/external_database_checker.rb'
+ - 'lib/gitlab/config_checker/puma_rugged_checker.rb'
+ - 'lib/gitlab/console.rb'
+ - 'lib/gitlab/database/async_indexes/index_creator.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/partitioning/single_numeric_list_partition.rb'
+ - 'lib/gitlab/database/partitioning/time_partition.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
+ - 'lib/gitlab/database_importers/self_monitoring/project/create_service.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/base.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/create.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
+ - 'lib/gitlab/exceptions_app.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
+ - 'lib/gitlab/github_import/issuable_finder.rb'
+ - 'lib/gitlab/github_import/label_finder.rb'
+ - 'lib/gitlab/github_import/milestone_finder.rb'
+ - 'lib/gitlab/github_import/object_counter.rb'
+ - 'lib/gitlab/github_import/page_counter.rb'
+ - 'lib/gitlab/github_import/parallel_scheduling.rb'
+ - 'lib/gitlab/github_import/representation/diff_note.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/error.rb'
+ - 'lib/gitlab/import_export/snippet_repo_restorer.rb'
+ - 'lib/gitlab/jira_import.rb'
+ - 'lib/gitlab/log_timestamp_formatter.rb'
+ - 'lib/gitlab/metrics/dashboard/errors.rb'
+ - 'lib/gitlab/metrics/dashboard/validator/errors.rb'
+ - 'lib/gitlab/quick_actions/command_definition.rb'
+ - 'lib/gitlab/quick_actions/commit_actions.rb'
+ - 'lib/gitlab/quick_actions/issuable_actions.rb'
+ - 'lib/gitlab/quick_actions/issue_actions.rb'
+ - 'lib/gitlab/quick_actions/issue_and_merge_request_actions.rb'
+ - 'lib/gitlab/quick_actions/merge_request_actions.rb'
+ - 'lib/gitlab/quick_actions/relate_actions.rb'
+ - 'lib/gitlab/usage/metrics/name_suggestion.rb'
+ - 'lib/gitlab/version_info.rb'
+ - 'lib/peek/views/detailed_view.rb'
+ - 'lib/tasks/test.rake'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/factories/lfs_objects.rb'
+ - 'spec/features/admin/admin_users_spec.rb'
+ - 'spec/features/groups/import_export/connect_instance_spec.rb'
+ - 'spec/finders/serverless_domain_finder_spec.rb'
+ - 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
+ - 'spec/helpers/profiles_helper_spec.rb'
+ - 'spec/lib/api/entities/release_spec.rb'
+ - 'spec/lib/gitlab/config_checker/external_database_checker_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/models/integrations/bamboo_spec.rb'
+ - 'spec/models/integrations/datadog_spec.rb'
+ - 'spec/models/serverless/domain_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_projects_spec.rb'
+ - 'spec/services/clusters/applications/patch_service_spec.rb'
+ - 'spec/services/clusters/applications/upgrade_service_spec.rb'
+ - 'spec/services/groups/import_export/export_service_spec.rb'
+ - 'spec/services/projects/import_export/export_service_spec.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/shared_contexts/bulk_imports_requests_shared_context.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/jira/requests/base_shared_examples.rb'
+ - 'spec/support/shared_examples/views/registration_features_prompt_shared_examples.rb'
+ - 'spec/validators/any_field_validator_spec.rb'
+ - 'spec/views/groups/edit.html.haml_spec.rb'
+ - 'spec/views/profiles/keys/_form.html.haml_spec.rb'
+ - 'spec/views/profiles/notifications/show.html.haml_spec.rb'
+ - 'tooling/lib/tooling/find_codeowners.rb'
diff --git a/.rubocop_todo/style/guard_clause.yml b/.rubocop_todo/style/guard_clause.yml
new file mode 100644
index 00000000000..12eda8abf13
--- /dev/null
+++ b/.rubocop_todo/style/guard_clause.yml
@@ -0,0 +1,719 @@
+---
+Style/GuardClause:
+ # Offense count: 1014
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/chaos_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/accepts_pending_invitations.rb'
+ - 'app/controllers/concerns/authenticates_with_two_factor.rb'
+ - 'app/controllers/concerns/controller_with_cross_project_access_check.rb'
+ - 'app/controllers/concerns/creates_commit.rb'
+ - 'app/controllers/concerns/cycle_analytics_params.rb'
+ - 'app/controllers/concerns/enforces_admin_authentication.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/impersonation.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/issuable_collections.rb'
+ - 'app/controllers/concerns/oauth_applications.rb'
+ - 'app/controllers/concerns/page_limiter.rb'
+ - 'app/controllers/concerns/product_analytics_tracking.rb'
+ - 'app/controllers/concerns/record_user_last_activity.rb'
+ - 'app/controllers/concerns/routable_actions.rb'
+ - 'app/controllers/concerns/snippets/blobs_actions.rb'
+ - 'app/controllers/concerns/uploads_actions.rb'
+ - 'app/controllers/dashboard/todos_controller.rb'
+ - 'app/controllers/groups/application_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/import/gitlab_controller.rb'
+ - 'app/controllers/import/manifest_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/application_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/commit_controller.rb'
+ - 'app/controllers/projects/compare_controller.rb'
+ - 'app/controllers/projects/design_management/designs/resized_image_controller.rb'
+ - 'app/controllers/projects/design_management/designs_controller.rb'
+ - 'app/controllers/projects/error_tracking_controller.rb'
+ - 'app/controllers/projects/google_cloud/base_controller.rb'
+ - 'app/controllers/projects/imports_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/repositories_controller.rb'
+ - 'app/controllers/projects/settings/operations_controller.rb'
+ - 'app/controllers/projects/tree_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/repositories/git_http_controller.rb'
+ - 'app/controllers/repositories/lfs_api_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/controllers/users/terms_controller.rb'
+ - 'app/finders/award_emojis_finder.rb'
+ - 'app/finders/ci/auth_job_finder.rb'
+ - 'app/finders/ci/runners_finder.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/projects/serverless/functions_finder.rb'
+ - 'app/finders/snippets_finder.rb'
+ - 'app/graphql/mutations/concerns/mutations/spam_protection.rb'
+ - 'app/graphql/mutations/design_management/delete.rb'
+ - 'app/graphql/mutations/notes/create/note.rb'
+ - 'app/graphql/mutations/notes/reposition_image_diff_note.rb'
+ - 'app/graphql/resolvers/blobs_resolver.rb'
+ - 'app/graphql/resolvers/board_list_issues_resolver.rb'
+ - 'app/graphql/resolvers/concerns/board_item_filterable.rb'
+ - 'app/graphql/resolvers/concerns/issue_resolver_arguments.rb'
+ - 'app/graphql/resolvers/concerns/time_frame_arguments.rb'
+ - 'app/graphql/resolvers/projects/jira_projects_resolver.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/graphql/types/concerns/find_closest.rb'
+ - 'app/helpers/admin/user_actions_helper.rb'
+ - 'app/helpers/appearances_helper.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/notes_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/profiles_helper.rb'
+ - 'app/helpers/snippets_helper.rb'
+ - 'app/helpers/tree_helper.rb'
+ - 'app/helpers/visibility_level_helper.rb'
+ - 'app/mailers/emails/notes.rb'
+ - 'app/models/alert_management/http_integration.rb'
+ - 'app/models/appearance.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_trace.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/job_token/project_scope_link.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/platforms/kubernetes.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage.rb'
+ - 'app/models/concerns/avatarable.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/cacheable_attributes.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/deprecated_assignee.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/issuable_link.rb'
+ - 'app/models/concerns/metric_image_uploading.rb'
+ - 'app/models/concerns/milestoneish.rb'
+ - 'app/models/concerns/packages/debian/distribution_key.rb'
+ - 'app/models/concerns/time_trackable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/base.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encrypted.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/description_version.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/design_collection.rb'
+ - 'app/models/diff_viewer/base.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/error_event.rb'
+ - 'app/models/error_tracking/project_error_tracking_setting.rb'
+ - 'app/models/experiment_subject.rb'
+ - 'app/models/external_pull_request.rb'
+ - 'app/models/generic_commit_status.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/base_issue_tracker.rb'
+ - 'app/models/integrations/base_third_party_wiki.rb'
+ - 'app/models/integrations/confluence.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/harbor.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/pipelines_email.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request_assignee.rb'
+ - 'app/models/merge_request_reviewer.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace_setting.rb'
+ - 'app/models/operations/feature_flags/strategy.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/conan/file_metadatum.rb'
+ - 'app/models/packages/conan/metadatum.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/pypi/metadatum.rb'
+ - 'app/models/packages/rubygems/metadatum.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_group_link.rb'
+ - 'app/models/project_import_state.rb'
+ - 'app/models/project_label.rb'
+ - 'app/models/project_setting.rb'
+ - 'app/models/protected_branch/push_access_level.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/sentry_issue.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/snippet_input_action.rb'
+ - 'app/models/user.rb'
+ - 'app/models/users/in_product_marketing_email.rb'
+ - 'app/models/wiki.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/services/boards/issues/list_service.rb'
+ - 'app/services/bulk_imports/file_download_service.rb'
+ - 'app/services/ci/create_web_ide_terminal_service.rb'
+ - 'app/services/ci/daily_build_group_report_result_service.rb'
+ - 'app/services/ci/parse_dotenv_artifact_service.rb'
+ - 'app/services/ci/pipelines/add_job_service.rb'
+ - 'app/services/ci/play_build_service.rb'
+ - 'app/services/ci/retry_job_service.rb'
+ - 'app/services/ci/update_build_queue_service.rb'
+ - 'app/services/clusters/agent_tokens/track_usage_service.rb'
+ - 'app/services/clusters/aws/fetch_credentials_service.rb'
+ - 'app/services/commits/commit_patch_service.rb'
+ - 'app/services/commits/create_service.rb'
+ - 'app/services/concerns/ci/job_token_scope/edit_scope_validations.rb'
+ - 'app/services/concerns/rate_limited_service.rb'
+ - 'app/services/concerns/update_repository_storage_methods.rb'
+ - 'app/services/concerns/validates_classification_label.rb'
+ - 'app/services/deployments/update_environment_service.rb'
+ - 'app/services/draft_notes/destroy_service.rb'
+ - 'app/services/files/delete_service.rb'
+ - 'app/services/files/multi_service.rb'
+ - 'app/services/files/update_service.rb'
+ - 'app/services/git/branch_hooks_service.rb'
+ - 'app/services/groups/group_links/update_service.rb'
+ - 'app/services/groups/import_export/export_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/groups/update_service.rb'
+ - 'app/services/groups/update_shared_runners_service.rb'
+ - 'app/services/ide/base_config_service.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb'
+ - 'app/services/import/validate_remote_git_endpoint_service.rb'
+ - 'app/services/issuable/bulk_update_service.rb'
+ - 'app/services/issuable/clone/base_service.rb'
+ - 'app/services/issuable/common_system_notes_service.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issues/clone_service.rb'
+ - 'app/services/issues/move_service.rb'
+ - 'app/services/issues/update_service.rb'
+ - 'app/services/merge_requests/add_spent_time_service.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/build_service.rb'
+ - 'app/services/merge_requests/handle_assignees_change_service.rb'
+ - 'app/services/merge_requests/merge_base_service.rb'
+ - 'app/services/merge_requests/merge_service.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/merge_requests/outdated_discussion_diff_lines_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/merge_requests/refresh_service.rb'
+ - 'app/services/metrics/dashboard/base_service.rb'
+ - 'app/services/namespace_settings/update_service.rb'
+ - 'app/services/notes/create_service.rb'
+ - 'app/services/notes/post_process_service.rb'
+ - 'app/services/notification_recipients/builder/default.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/packages/create_event_service.rb'
+ - 'app/services/packages/create_package_service.rb'
+ - 'app/services/packages/nuget/search_service.rb'
+ - 'app/services/post_receive_service.rb'
+ - 'app/services/projects/after_rename_service.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'app/services/projects/destroy_rollback_service.rb'
+ - 'app/services/projects/destroy_service.rb'
+ - 'app/services/projects/hashed_storage/rollback_service.rb'
+ - 'app/services/projects/import_export/export_service.rb'
+ - 'app/services/projects/import_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_object_download_list_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/projects/update_repository_storage_service.rb'
+ - 'app/services/projects/update_service.rb'
+ - 'app/services/protected_branches/legacy_api_update_service.rb'
+ - 'app/services/snippets/repository_validation_service.rb'
+ - 'app/services/static_site_editor/config_service.rb'
+ - 'app/services/todo_service.rb'
+ - 'app/services/users/build_service.rb'
+ - 'app/services/users/update_service.rb'
+ - 'app/services/wiki_pages/update_service.rb'
+ - 'app/services/wikis/create_attachment_service.rb'
+ - 'app/uploaders/content_type_whitelist.rb'
+ - 'app/uploaders/file_mover.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'app/validators/abstract_path_validator.rb'
+ - 'app/validators/any_field_validator.rb'
+ - 'app/validators/array_members_validator.rb'
+ - 'app/validators/branch_filter_validator.rb'
+ - 'app/validators/certificate_fingerprint_validator.rb'
+ - 'app/validators/certificate_key_validator.rb'
+ - 'app/validators/certificate_validator.rb'
+ - 'app/validators/cron_validator.rb'
+ - 'app/validators/feature_flag_strategies_validator.rb'
+ - 'app/validators/feature_flag_user_xids_validator.rb'
+ - 'app/validators/json_schema_validator.rb'
+ - 'app/validators/key_restriction_validator.rb'
+ - 'app/validators/line_code_validator.rb'
+ - 'app/validators/named_ecdsa_key_validator.rb'
+ - 'app/validators/rsa_key_validator.rb'
+ - 'app/validators/top_level_group_validator.rb'
+ - 'app/validators/x509_certificate_credentials_validator.rb'
+ - 'app/workers/cleanup_container_repository_worker.rb'
+ - 'app/workers/clusters/agents/delete_expired_events_worker.rb'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'app/workers/container_registry/migration/guard_worker.rb'
+ - 'app/workers/deployments/hooks_worker.rb'
+ - 'app/workers/deployments/link_merge_request_worker.rb'
+ - 'app/workers/gitlab/github_import/refresh_import_jid_worker.rb'
+ - 'app/workers/packages/maven/metadata/sync_worker.rb'
+ - 'app/workers/repository_update_remote_mirror_worker.rb'
+ - 'config/initializers/0_inject_enterprise_edition_module.rb'
+ - 'config/initializers/carrierwave_patch.rb'
+ - 'config/initializers/devise_dynamic_password_length_validation.rb'
+ - 'config/initializers/google_api_client_patch.rb'
+ - 'config/initializers/postgresql_cte.rb'
+ - 'config/object_store_settings.rb'
+ - 'danger/feature_flag/Dangerfile'
+ - 'db/migrate/20210302212623_rename_vuln_fingerprints_indexes.rb'
+ - 'db/migrate/20210707095545_add_status_to_merge_request_cleanup_schedules.rb'
+ - 'db/migrate/20210816095826_add_unique_index_on_dast_profile_to_dast_profile_schedules.rb'
+ - 'db/migrate/20210816192041_add_invites_email_success_to_member.rb'
+ - 'db/migrate/20210818061156_remove_project_profile_compound_index_from_dast_profile_schedules.rb'
+ - 'db/migrate/20210830140524_add_state_to_member.rb'
+ - 'db/migrate/20211202094944_move_loose_fk_deleted_records_to_dynamic_schema.rb'
+ - 'db/migrate/20220215164709_update_application_settings_container_registry_exp_pol_worker_capacity_default.rb'
+ - 'db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb'
+ - 'db/post_migrate/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers.rb'
+ - 'db/post_migrate/20210907211557_finalize_ci_builds_bigint_conversion.rb'
+ - 'ee/app/controllers/admin/emails_controller.rb'
+ - 'ee/app/controllers/admin/geo/application_controller.rb'
+ - 'ee/app/controllers/admin/geo/replicables_controller.rb'
+ - 'ee/app/controllers/admin/geo/settings_controller.rb'
+ - 'ee/app/controllers/concerns/audit_events/enforces_valid_date_params.rb'
+ - 'ee/app/controllers/concerns/ee/membership_actions.rb'
+ - 'ee/app/controllers/ee/groups/group_members_controller.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/controllers/ee/registrations_controller.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/controllers/groups/billings_controller.rb'
+ - 'ee/app/controllers/profiles/billings_controller.rb'
+ - 'ee/app/controllers/projects/path_locks_controller.rb'
+ - 'ee/app/controllers/projects/security/policies_controller.rb'
+ - 'ee/app/controllers/projects/settings/slacks_controller.rb'
+ - 'ee/app/controllers/smartcard_controller.rb'
+ - 'ee/app/finders/ee/notes_finder.rb'
+ - 'ee/app/finders/ee/template_finder.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/finders/security/vulnerabilities_finder.rb'
+ - 'ee/app/graphql/mutations/iterations/create.rb'
+ - 'ee/app/graphql/mutations/iterations/update.rb'
+ - 'ee/app/graphql/mutations/projects/set_locked.rb'
+ - 'ee/app/graphql/resolvers/analytics/devops_adoption/enabled_namespaces_resolver.rb'
+ - 'ee/app/graphql/resolvers/epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations_resolver.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/award_emoji_helper.rb'
+ - 'ee/app/helpers/ee/nav/new_dropdown_helper.rb'
+ - 'ee/app/helpers/ee/nav/top_nav_helper.rb'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb'
+ - 'ee/app/models/approval_merge_request_rule_source.rb'
+ - 'ee/app/models/concerns/app_sec/dast/buildable.rb'
+ - 'ee/app/models/concerns/ee/protected_ref_access.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/geo/verifiable_replicator.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast_site.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group_member.rb'
+ - 'ee/app/models/ee/incident_management/issuable_escalation_status.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/issue_assignee.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/project_member.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/elasticsearch_indexed_project.rb'
+ - 'ee/app/models/epic/related_epic_link.rb'
+ - 'ee/app/models/epic_issue.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/ip_restriction.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/namespace_limit.rb'
+ - 'ee/app/models/preloaders/environments/protected_environment_preloader.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/users_security_dashboard_project.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/presenters/ee/merge_request_presenter.rb'
+ - 'ee/app/services/analytics/cycle_analytics/validations.rb'
+ - 'ee/app/services/analytics/cycle_analytics/value_streams/create_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/common_methods.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/update_service.rb'
+ - 'ee/app/services/approval_rules/create_service.rb'
+ - 'ee/app/services/approval_rules/params_filtering_service.rb'
+ - 'ee/app/services/approval_rules/update_service.rb'
+ - 'ee/app/services/billable_members/destroy_service.rb'
+ - 'ee/app/services/ci/minutes/update_project_and_namespace_usage_service.rb'
+ - 'ee/app/services/dora/aggregate_metrics_service.rb'
+ - 'ee/app/services/ee/alert_management/alerts/update_service.rb'
+ - 'ee/app/services/ee/audit_event_service.rb'
+ - 'ee/app/services/ee/ci/play_bridge_service.rb'
+ - 'ee/app/services/ee/ci/play_build_service.rb'
+ - 'ee/app/services/ee/ci/retry_job_service.rb'
+ - 'ee/app/services/ee/commits/create_service.rb'
+ - 'ee/app/services/ee/groups/update_service.rb'
+ - 'ee/app/services/ee/issuable/common_system_notes_service.rb'
+ - 'ee/app/services/ee/issues/base_service.rb'
+ - 'ee/app/services/ee/merge_requests/merge_base_service.rb'
+ - 'ee/app/services/ee/merge_requests/post_merge_service.rb'
+ - 'ee/app/services/ee/merge_requests/refresh_service.rb'
+ - 'ee/app/services/ee/namespace_settings/update_service.rb'
+ - 'ee/app/services/ee/projects/create_service.rb'
+ - 'ee/app/services/ee/projects/gitlab_projects_import_service.rb'
+ - 'ee/app/services/ee/projects/update_service.rb'
+ - 'ee/app/services/ee/protected_branches/loggable.rb'
+ - 'ee/app/services/ee/wiki_pages/base_service.rb'
+ - 'ee/app/services/epics/close_service.rb'
+ - 'ee/app/services/epics/create_service.rb'
+ - 'ee/app/services/epics/reopen_service.rb'
+ - 'ee/app/services/epics/tree_reorder_service.rb'
+ - 'ee/app/services/epics/update_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/metrics_update_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/group_saml/group_managed_accounts/transfer_membership_service.rb'
+ - 'ee/app/services/groups/update_repository_storage_service.rb'
+ - 'ee/app/services/incident_management/oncall_rotations/remove_participant_service.rb'
+ - 'ee/app/services/iterations/delete_service.rb'
+ - 'ee/app/services/merge_trains/check_status_service.rb'
+ - 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
+ - 'ee/app/services/merge_trains/refresh_service.rb'
+ - 'ee/app/services/namespaces/storage/email_notification_service.rb'
+ - 'ee/app/services/projects/slack_application_install_service.rb'
+ - 'ee/app/services/projects/update_mirror_service.rb'
+ - 'ee/app/services/security/override_uuids_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/validators/host_validator.rb'
+ - 'ee/app/workers/ee/ci/build_finished_worker.rb'
+ - 'ee/app/workers/ee/post_receive.rb'
+ - 'ee/app/workers/elastic/migration_worker.rb'
+ - 'ee/app/workers/elastic_namespace_rollout_worker.rb'
+ - 'ee/app/workers/epics/new_epic_issue_worker.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/app/workers/sync_seat_link_request_worker.rb'
+ - 'ee/db/geo/migrate/20180314175612_add_partial_index_to_project_registy_verification_failure_columns.rb'
+ - 'ee/db/geo/migrate/20180315222132_add_partial_index_to_project_registy_checksum_columns.rb'
+ - 'ee/db/geo/migrate/20180412213305_add_index_to_artifact_id_on_job_artifact_registry.rb'
+ - 'ee/lib/ee/api/ci/job_artifacts.rb'
+ - 'ee/lib/ee/api/features.rb'
+ - 'ee/lib/ee/api/helpers/projects_helpers.rb'
+ - 'ee/lib/ee/api/projects.rb'
+ - 'ee/lib/ee/api/search.rb'
+ - 'ee/lib/ee/audit/project_ci_cd_setting_changes_auditor.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/auth/o_auth/user.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/commit_check.rb'
+ - 'ee/lib/ee/gitlab/cleanup/orphan_job_artifact_files.rb'
+ - 'ee/lib/ee/gitlab/git_access.rb'
+ - 'ee/lib/ee/gitlab/gon_helper.rb'
+ - 'ee/lib/ee/gitlab/omniauth_initializer.rb'
+ - 'ee/lib/ee/sidebars/projects/panel.rb'
+ - 'ee/lib/elastic/latest/application_class_proxy.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
+ - 'ee/lib/gitlab/ci/config/security_orchestration_policies/processor.rb'
+ - 'ee/lib/gitlab/ci/minutes/cost_factor.rb'
+ - 'ee/lib/gitlab/compliance_management/violations/approved_by_insufficient_users.rb'
+ - 'ee/lib/gitlab/compliance_management/violations/approved_by_merge_request_author.rb'
+ - 'ee/lib/gitlab/geo/geo_node_status_check.rb'
+ - 'ee/lib/gitlab/geo/git_push_http.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/daemon.rb'
+ - 'ee/lib/gitlab/geo/oauth/logout_token.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/epics/lazy_epic_aggregate.rb'
+ - 'ee/lib/gitlab/insights/project_insights_config.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_label_reducer.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_period_reducer.rb'
+ - 'ee/lib/gitlab/insights/serializers/chartjs/bar_serializer.rb'
+ - 'ee/lib/gitlab/insights/serializers/chartjs/multi_series_serializer.rb'
+ - 'ee/lib/gitlab/insights/validators/params_validator.rb'
+ - 'ee/lib/omni_auth/strategies/group_saml.rb'
+ - 'ee/lib/pseudonymizer/dumper.rb'
+ - 'ee/spec/features/billings/billing_plans_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb'
+ - 'haml_lint/linter/documentation_links.rb'
+ - 'lib/api/commits.rb'
+ - 'lib/api/error_tracking/collector.rb'
+ - 'lib/api/feature_flags.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/helpers/projects_helpers.rb'
+ - 'lib/api/helpers/snippets_helpers.rb'
+ - 'lib/api/helpers/version.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/banzai/filter/external_link_filter.rb'
+ - 'lib/banzai/filter/gollum_tags_filter.rb'
+ - 'lib/banzai/filter/references/merge_request_reference_filter.rb'
+ - 'lib/banzai/filter/wiki_link_filter/rewriter.rb'
+ - 'lib/bulk_imports/clients/graphql.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/bulk_imports/projects/pipelines/project_pipeline.rb'
+ - 'lib/container_registry/client.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gem_extensions/active_record/association.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/o_auth/user.rb'
+ - 'lib/gitlab/auth/unique_ips_limiter.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_project_feature.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/bitbucket_server_import/importer.rb'
+ - 'lib/gitlab/blob_helper.rb'
+ - 'lib/gitlab/cache/ci/project_pipeline_status.rb'
+ - 'lib/gitlab/changelog/config.rb'
+ - 'lib/gitlab/chat/responder.rb'
+ - 'lib/gitlab/checks/branch_check.rb'
+ - 'lib/gitlab/checks/matching_merge_request.rb'
+ - 'lib/gitlab/checks/push_file_count_check.rb'
+ - 'lib/gitlab/ci/ansi2json/parser.rb'
+ - 'lib/gitlab/ci/ansi2json/state.rb'
+ - 'lib/gitlab/ci/artifact_file_reader.rb'
+ - 'lib/gitlab/ci/build/policy/kubernetes.rb'
+ - 'lib/gitlab/ci/build/policy/refs.rb'
+ - 'lib/gitlab/ci/config.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/extendable/entry.rb'
+ - 'lib/gitlab/ci/config/external/file/base.rb'
+ - 'lib/gitlab/ci/config/external/file/remote.rb'
+ - 'lib/gitlab/ci/config/external/file/template.rb'
+ - 'lib/gitlab/ci/config/external/mapper.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/parsers/security/common.rb'
+ - 'lib/gitlab/ci/pipeline/chain/command.rb'
+ - 'lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb'
+ - 'lib/gitlab/ci/pipeline/chain/skip.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/abilities.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/repository.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/base.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports_comparer.rb'
+ - 'lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb'
+ - 'lib/gitlab/ci/runner/backoff.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/ci/trace/archive.rb'
+ - 'lib/gitlab/ci/trace/stream.rb'
+ - 'lib/gitlab/ci/yaml_processor.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/database/background_migration/batch_optimizer.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_wrapper.rb'
+ - 'lib/gitlab/database/consistency_checker.rb'
+ - 'lib/gitlab/database/load_balancing/configuration.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/partitioning/partition_manager.rb'
+ - 'lib/gitlab/database/partitioning/sliding_list_strategy.rb'
+ - 'lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin.rb'
+ - 'lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb'
+ - 'lib/gitlab/diff/custom_diff.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/highlight.rb'
+ - 'lib/gitlab/diff/highlight_cache.rb'
+ - 'lib/gitlab/email/handler/create_merge_request_handler.rb'
+ - 'lib/gitlab/email/handler/create_note_on_issuable_handler.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/email/hook/email_template_interceptor.rb'
+ - 'lib/gitlab/email/receiver.rb'
+ - 'lib/gitlab/endpoint_attributes/config.rb'
+ - 'lib/gitlab/error_tracking.rb'
+ - 'lib/gitlab/event_store/event.rb'
+ - 'lib/gitlab/event_store/store.rb'
+ - 'lib/gitlab/exception_log_formatter.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/git/tag.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/git_access_design.rb'
+ - 'lib/gitlab/git_access_snippet.rb'
+ - 'lib/gitlab/gitaly_client/blobs_stitcher.rb'
+ - 'lib/gitlab/gitaly_client/conflicts_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/wiki_service.rb'
+ - 'lib/gitlab/github_import.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_review_importer.rb'
+ - 'lib/gitlab/github_import/object_counter.rb'
+ - 'lib/gitlab/gitlab_import/client.rb'
+ - 'lib/gitlab/gitlab_import/importer.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/null_condition.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/order_info.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/query_builder.rb'
+ - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
+ - 'lib/gitlab/i18n/metadata_entry.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb'
+ - 'lib/gitlab/import_export/base/object_builder.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/command_line_util.rb'
+ - 'lib/gitlab/import_export/group/tree_restorer.rb'
+ - 'lib/gitlab/import_export/importer.rb'
+ - 'lib/gitlab/import_export/repo_restorer.rb'
+ - 'lib/gitlab/import_export/snippet_repo_restorer.rb'
+ - 'lib/gitlab/import_export/version_checker.rb'
+ - 'lib/gitlab/instrumentation/redis_cluster_validator.rb'
+ - 'lib/gitlab/instrumentation/uploads.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/legacy_github_import/issuable_formatter.rb'
+ - 'lib/gitlab/marginalia.rb'
+ - 'lib/gitlab/metrics/samplers/ruby_sampler.rb'
+ - 'lib/gitlab/metrics/subscribers/action_cable.rb'
+ - 'lib/gitlab/metrics/subscribers/active_record.rb'
+ - 'lib/gitlab/metrics/subscribers/external_http.rb'
+ - 'lib/gitlab/metrics/subscribers/rails_cache.rb'
+ - 'lib/gitlab/metrics/web_transaction.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/pagination/gitaly_keyset_pager.rb'
+ - 'lib/gitlab/pagination/keyset/column_order_definition.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/array_scope_columns.rb'
+ - 'lib/gitlab/pagination/keyset/order.rb'
+ - 'lib/gitlab/pagination/keyset/pager.rb'
+ - 'lib/gitlab/pagination/keyset/paginator.rb'
+ - 'lib/gitlab/pagination/keyset/simple_order_builder.rb'
+ - 'lib/gitlab/patch/global_id.rb'
+ - 'lib/gitlab/patch/sprockets_base_file_digest_key.rb'
+ - 'lib/gitlab/process_supervisor.rb'
+ - 'lib/gitlab/prometheus/query_variables.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/recaptcha.rb'
+ - 'lib/gitlab/relative_positioning/mover.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/search/abuse_validators/no_abusive_coercion_from_string_validator.rb'
+ - 'lib/gitlab/search/abuse_validators/no_abusive_term_length_validator.rb'
+ - 'lib/gitlab/search/params.rb'
+ - 'lib/gitlab/serializer/pagination.rb'
+ - 'lib/gitlab/serverless/service.rb'
+ - 'lib/gitlab/shell.rb'
+ - 'lib/gitlab/sidekiq_config/cli_methods.rb'
+ - 'lib/gitlab/sidekiq_middleware/extra_done_log_metadata.rb'
+ - 'lib/gitlab/sidekiq_middleware/size_limiter/compressor.rb'
+ - 'lib/gitlab/sql/set_operator.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/gitlab/usage_data_counters/ci_template_unique_counter.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/gitlab/utils/override.rb'
+ - 'lib/gitlab/webpack/manifest.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/release_highlights/validator/entry.rb'
+ - 'lib/safe_zip/entry.rb'
+ - 'lib/system_check/app/systemd_unit_files_or_init_script_up_to_date_check.rb'
+ - 'lib/system_check/incoming_email/mail_room_running_check.rb'
+ - 'lib/tasks/config_lint.rake'
+ - 'lib/tasks/gettext.rake'
+ - 'qa/qa/ee/page/file/show.rb'
+ - 'qa/qa/ee/resource/license.rb'
+ - 'qa/qa/mobile/page/main/menu.rb'
+ - 'qa/qa/mobile/page/sub_menus/common.rb'
+ - 'qa/qa/page/base.rb'
+ - 'qa/qa/page/component/invite_members_modal.rb'
+ - 'qa/qa/page/component/select2.rb'
+ - 'qa/qa/page/component/snippet.rb'
+ - 'qa/qa/page/mattermost/login.rb'
+ - 'qa/qa/page/page_concern.rb'
+ - 'qa/qa/resource/api_fabricator.rb'
+ - 'qa/qa/resource/package.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/resource/reusable.rb'
+ - 'qa/qa/resource/user_gpg.rb'
+ - 'qa/qa/runtime/feature.rb'
+ - 'qa/qa/runtime/search.rb'
+ - 'qa/qa/service/cluster_provider/gcloud.rb'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/11_fulfillment/purchase/free_trial_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_file_template_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/helpers/feature_flag.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'rubocop/cop/api/grape_array_missing_coerce.rb'
+ - 'rubocop/cop/gitlab/duplicate_spec_location.rb'
+ - 'rubocop/cop/gitlab/event_store_subscriber.rb'
+ - 'rubocop/cop/gitlab/finder_with_find_by.rb'
+ - 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
+ - 'rubocop/cop/gitlab/policy_rule_boolean.rb'
+ - 'rubocop/cop/ignored_columns.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'rubocop/cop/migration/update_column_in_batches.rb'
+ - 'rubocop/cop/rspec/web_mock_enable.rb'
+ - 'rubocop/cop/usage_data/histogram_with_large_table.rb'
+ - 'rubocop/cop/usage_data/large_table.rb'
+ - 'rubocop/routes_under_scope.rb'
+ - 'scripts/lint_templates_bash.rb'
+ - 'scripts/setup/find-jh-branch.rb'
+ - 'scripts/trigger-build.rb'
+ - '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'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/database/prevent_cross_joins.rb'
+ - 'spec/support/helpers/access_matchers_helpers.rb'
+ - 'spec/support/helpers/bare_repo_operations.rb'
+ - 'spec/support/helpers/capybara_helpers.rb'
+ - 'spec/support/helpers/dropzone_helper.rb'
+ - 'spec/support/helpers/fake_blob_helpers.rb'
+ - 'spec/support/helpers/filtered_search_helpers.rb'
+ - 'spec/support/helpers/gitaly_setup.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/helpers/stub_gitlab_calls.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/wait_helpers.rb'
+ - 'spec/support/import_export/export_file_helper.rb'
+ - 'spec/support/shared_examples/features/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
+ - 'tooling/lib/tooling/image.rb'
+ - 'tooling/lib/tooling/kubernetes_client.rb'
+ - 'tooling/rspec_flaky/flaky_example.rb'
+ - 'tooling/rspec_flaky/listener.rb'
diff --git a/.rubocop_todo/style/hash_as_last_array_item.yml b/.rubocop_todo/style/hash_as_last_array_item.yml
new file mode 100644
index 00000000000..eec2e77eafd
--- /dev/null
+++ b/.rubocop_todo/style/hash_as_last_array_item.yml
@@ -0,0 +1,62 @@
+---
+# Cop supports --auto-correct.
+Style/HashAsLastArrayItem:
+ # Offense count: 79
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/boards/issues_controller.rb'
+ - 'app/controllers/clusters/clusters_controller.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/issuable_collections.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/feature_flags_controller.rb'
+ - 'app/controllers/projects/merge_requests/application_controller.rb'
+ - 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
+ - 'app/controllers/projects/protected_branches_controller.rb'
+ - 'app/controllers/projects/settings/ci_cd_controller.rb'
+ - 'app/controllers/projects/settings/operations_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/graphql/resolvers/clusters/agents_resolver.rb'
+ - 'app/graphql/resolvers/concerns/issue_resolver_arguments.rb'
+ - 'app/graphql/types/boards/board_issuable_input_base_type.rb'
+ - 'app/graphql/types/boards/board_issue_input_base_type.rb'
+ - 'app/helpers/learn_gitlab_helper.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/preloaders/labels_preloader.rb'
+ - 'app/models/user.rb'
+ - 'app/serializers/deployment_serializer.rb'
+ - 'app/services/ci/delete_objects_service.rb'
+ - 'ee/app/controllers/ee/admin/groups_controller.rb'
+ - 'ee/app/controllers/ee/admin/users_controller.rb'
+ - 'ee/app/controllers/groups/epics_controller.rb'
+ - 'ee/app/graphql/ee/resolvers/base_issues_resolver.rb'
+ - 'ee/app/graphql/types/epics/negated_epic_filter_input_type.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/vulnerabilities/read.rb'
+ - 'ee/app/serializers/dashboard_environments_serializer.rb'
+ - 'ee/spec/finders/projects/integrations/jira/by_ids_finder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config/entry/needs_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/container_repository_updated_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb'
+ - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/v2_spec.rb'
+ - 'spec/migrations/20210914095310_cleanup_orphan_project_access_tokens_spec.rb'
+ - 'spec/requests/rack_attack_global_spec.rb'
+ - 'spec/services/git/branch_hooks_service_spec.rb'
+ - 'spec/services/metrics/dashboard/panel_preview_service_spec.rb'
+ - 'spec/support/helpers/rack_attack_spec_helpers.rb'
+ - 'spec/workers/merge_worker_spec.rb'
diff --git a/.rubocop_todo/style/hash_each_methods.yml b/.rubocop_todo/style/hash_each_methods.yml
new file mode 100644
index 00000000000..648b6fbbe08
--- /dev/null
+++ b/.rubocop_todo/style/hash_each_methods.yml
@@ -0,0 +1,91 @@
+---
+# Cop supports --auto-correct.
+Style/HashEachMethods:
+ # Offense count: 95
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/graphql/resolvers/concerns/caching_array_resolver.rb'
+ - 'app/graphql/types/alert_management/severity_enum.rb'
+ - 'app/graphql/types/availability_enum.rb'
+ - 'app/graphql/types/ci/code_quality_degradation_severity_enum.rb'
+ - 'app/graphql/types/ci/job_artifact_file_type_enum.rb'
+ - 'app/graphql/types/ci/pipeline_config_source_enum.rb'
+ - 'app/graphql/types/ci/runner_access_level_enum.rb'
+ - 'app/graphql/types/clusters/agent_token_status_enum.rb'
+ - 'app/graphql/types/container_repository_status_enum.rb'
+ - 'app/graphql/types/data_visualization_palette/color_enum.rb'
+ - 'app/graphql/types/data_visualization_palette/weight_enum.rb'
+ - 'app/graphql/types/dependency_proxy/manifest_type_enum.rb'
+ - 'app/graphql/types/design_management/design_collection_copy_state_enum.rb'
+ - 'app/graphql/types/design_management/design_version_event_enum.rb'
+ - 'app/graphql/types/event_action_enum.rb'
+ - 'app/graphql/types/issuable_severity_enum.rb'
+ - 'app/graphql/types/packages/conan/metadatum_file_type_enum.rb'
+ - 'app/graphql/types/packages/package_dependency_type_enum.rb'
+ - 'app/graphql/types/packages/package_status_enum.rb'
+ - 'app/graphql/types/packages/package_type_enum.rb'
+ - 'app/graphql/types/release_asset_link_type_enum.rb'
+ - 'app/graphql/types/user_callout_feature_name_enum.rb'
+ - 'app/helpers/routing/pseudonymization_helper.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/services/security/merge_reports_service.rb'
+ - 'config/initializers/6_validations.rb'
+ - 'config/initializers/8_gitaly.rb'
+ - 'ee/app/graphql/types/compliance_management/merge_requests/compliance_violation_reason_enum.rb'
+ - 'ee/app/graphql/types/compliance_management/merge_requests/compliance_violation_severity_enum.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_length_unit_enum.rb'
+ - 'ee/app/graphql/types/security_report_summary_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities_count_by_day_type.rb'
+ - 'ee/app/graphql/types/vulnerability/external_issue_link_external_tracker_enum.rb'
+ - 'ee/app/graphql/types/vulnerability/external_issue_link_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability/issue_link_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_confidence_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_grade_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_report_type_enum.rb'
+ - 'ee/app/graphql/types/vulnerability_severities_count_type.rb'
+ - 'ee/app/graphql/types/vulnerability_severity_enum.rb'
+ - 'ee/app/models/geo/secondary_usage_data.rb'
+ - 'ee/db/fixtures/development/32_compliance_report_violations.rb'
+ - 'ee/lib/gitlab/ci/reports/license_scanning/report.rb'
+ - 'ee/spec/factories/vulnerabilities.rb'
+ - 'ee/spec/factories/vulnerabilities/findings.rb'
+ - 'ee/spec/helpers/application_helper_spec.rb'
+ - 'ee/spec/lib/gitlab/geo_spec.rb'
+ - 'lib/api/todos.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/gitlab/changelog/release.rb'
+ - 'lib/gitlab/ci/parsers.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/metrics/samplers/ruby_sampler.rb'
+ - 'lib/gitlab/metrics/subscribers/active_record.rb'
+ - 'lib/gitlab/metrics/subscribers/load_balancing.rb'
+ - 'lib/gitlab/middleware/multipart.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/factories/ci/reports/codequality_degradations.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/lib/gitlab/ci/status/build/failed_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb'
+ - 'spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/resource_group_spec.rb'
+ - 'spec/models/clusters/cluster_spec.rb'
+ - 'spec/models/concerns/has_user_type_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/presenters/ci/pipeline_presenter_spec.rb'
+ - 'spec/presenters/commit_status_presenter_spec.rb'
+ - 'spec/presenters/packages/npm/package_presenter_spec.rb'
+ - 'spec/services/system_notes/incident_service_spec.rb'
+ - 'spec/support/helpers/multipart_helpers.rb'
+ - 'spec/support/helpers/reactive_caching_helpers.rb'
+ - 'spec/support/import_export/project_tree_expectations.rb'
+ - 'spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages_shared_examples.rb'
+ - 'spec/tasks/gitlab/packages/events_rake_spec.rb'
+ - 'tooling/graphql/docs/helper.rb'
diff --git a/.rubocop_todo/style/if_inside_else.yml b/.rubocop_todo/style/if_inside_else.yml
new file mode 100644
index 00000000000..fcddbae74fc
--- /dev/null
+++ b/.rubocop_todo/style/if_inside_else.yml
@@ -0,0 +1,49 @@
+---
+Style/IfInsideElse:
+ # Offense count: 43
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/finders/projects_finder.rb'
+ - 'app/finders/user_recent_events_finder.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/members_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/namespace.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/services/service_ping/build_payload_service.rb'
+ - 'app/services/system_notes/commit_service.rb'
+ - 'app/services/task_list_toggle_service.rb'
+ - 'app/services/user_project_access_changed_service.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'config/settings.rb'
+ - 'ee/app/controllers/ee/registrations/welcome_controller.rb'
+ - 'ee/app/controllers/groups/omniauth_callbacks_controller.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/protected_environments/authorizable.rb'
+ - 'ee/app/policies/ee/group_policy.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/audit/update_service.rb'
+ - 'ee/app/services/deployments/approval_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/fetch_subscription_plans_service.rb'
+ - 'ee/app/services/vulnerability_external_issue_links/create_service.rb'
+ - 'ee/lib/gitlab/geo/base_batcher.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/sql/pattern.rb'
+ - 'lib/gitlab/usage/service_ping/payload_keys_processor.rb'
+ - 'lib/tasks/gitlab/cleanup.rake'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'qa/qa/resource/protected_branch.rb'
+ - 'qa/qa/specs/helpers/feature_flag.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'scripts/review_apps/automated_cleanup.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/support/import_export/export_file_helper.rb'
+ - 'spec/support/shared_examples/finders/snippet_visibility_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml
new file mode 100644
index 00000000000..7bbc62d4c27
--- /dev/null
+++ b/.rubocop_todo/style/if_unless_modifier.yml
@@ -0,0 +1,1276 @@
+---
+# Cop supports --auto-correct.
+Style/IfUnlessModifier:
+ # Offense count: 1937
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/channels/graphql_channel.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/admin/requests_profiles_controller.rb'
+ - 'app/controllers/admin/runners_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/concerns/controller_with_cross_project_access_check.rb'
+ - 'app/controllers/concerns/cycle_analytics_params.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/issuable_collections.rb'
+ - 'app/controllers/concerns/issues_calendar.rb'
+ - 'app/controllers/concerns/labels_as_hash.rb'
+ - 'app/controllers/concerns/metrics/dashboard/prometheus_api_proxy.rb'
+ - 'app/controllers/concerns/metrics_dashboard.rb'
+ - 'app/controllers/concerns/notes_actions.rb'
+ - 'app/controllers/concerns/oauth_applications.rb'
+ - 'app/controllers/concerns/paginated_collection.rb'
+ - 'app/controllers/concerns/record_user_last_activity.rb'
+ - 'app/controllers/concerns/sorting_preference.rb'
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/controllers/concerns/with_performance_bar.rb'
+ - 'app/controllers/explore/projects_controller.rb'
+ - 'app/controllers/groups/application_controller.rb'
+ - 'app/controllers/groups/group_members_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - 'app/controllers/import/gitlab_controller.rb'
+ - 'app/controllers/import/manifest_controller.rb'
+ - 'app/controllers/jira_connect/application_controller.rb'
+ - 'app/controllers/jwt_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/profiles/emails_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/projects/application_controller.rb'
+ - 'app/controllers/projects/blame_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/commits_controller.rb'
+ - 'app/controllers/projects/cycle_analytics_controller.rb'
+ - 'app/controllers/projects/deploy_keys_controller.rb'
+ - 'app/controllers/projects/design_management/designs_controller.rb'
+ - 'app/controllers/projects/imports_controller.rb'
+ - 'app/controllers/projects/integrations/shimos_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/protected_refs_controller.rb'
+ - 'app/controllers/projects/releases_controller.rb'
+ - 'app/controllers/projects/runners_controller.rb'
+ - 'app/controllers/projects/services_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/repositories/git_http_controller.rb'
+ - 'app/controllers/repositories/lfs_api_controller.rb'
+ - 'app/controllers/sessions_controller.rb'
+ - 'app/controllers/users/terms_controller.rb'
+ - 'app/finders/autocomplete/users_finder.rb'
+ - 'app/finders/ci/auth_job_finder.rb'
+ - 'app/finders/ci/pipelines_finder.rb'
+ - 'app/finders/ci/runners_finder.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/finders/design_management/versions_finder.rb'
+ - 'app/finders/feature_flags_finder.rb'
+ - 'app/finders/feature_flags_user_lists_finder.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/group_projects_finder.rb'
+ - 'app/finders/labels_finder.rb'
+ - 'app/finders/members_finder.rb'
+ - 'app/finders/metrics/users_starred_dashboards_finder.rb'
+ - 'app/finders/namespaces/projects_finder.rb'
+ - 'app/finders/notes_finder.rb'
+ - 'app/finders/packages/helm/packages_finder.rb'
+ - 'app/finders/personal_access_tokens_finder.rb'
+ - 'app/finders/projects/export_job_finder.rb'
+ - 'app/finders/projects/members/effective_access_level_finder.rb'
+ - 'app/finders/projects_finder.rb'
+ - 'app/finders/prometheus_metrics_finder.rb'
+ - 'app/finders/todos_finder.rb'
+ - 'app/finders/union_finder.rb'
+ - 'app/graphql/mutations/admin/sidekiq_queues/delete_jobs.rb'
+ - 'app/graphql/mutations/boards/lists/base_update.rb'
+ - 'app/graphql/mutations/issues/set_crm_contacts.rb'
+ - 'app/graphql/mutations/packages/destroy_file.rb'
+ - 'app/graphql/mutations/release_asset_links/create.rb'
+ - 'app/graphql/mutations/release_asset_links/delete.rb'
+ - 'app/graphql/mutations/release_asset_links/update.rb'
+ - 'app/graphql/mutations/todos/mark_all_done.rb'
+ - 'app/graphql/mutations/work_items/create.rb'
+ - 'app/graphql/resolvers/blobs_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_jobs_resolver.rb'
+ - 'app/graphql/resolvers/concerns/board_item_filterable.rb'
+ - 'app/graphql/resolvers/concerns/issue_resolver_arguments.rb'
+ - 'app/graphql/resolvers/concerns/time_frame_arguments.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
+ - 'app/graphql/resolvers/package_details_resolver.rb'
+ - 'app/graphql/resolvers/project_jobs_resolver.rb'
+ - 'app/graphql/resolvers/project_pipeline_resolver.rb'
+ - 'app/graphql/resolvers/timelog_resolver.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/helpers/admin/user_actions_helper.rb'
+ - 'app/helpers/appearances_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/button_helper.rb'
+ - 'app/helpers/ci/status_helper.rb'
+ - 'app/helpers/dashboard_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/form_helper.rb'
+ - 'app/helpers/groups_helper.rb'
+ - 'app/helpers/issuables_description_templates_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/issues_helper.rb'
+ - 'app/helpers/lazy_image_tag_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/merge_requests_helper.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/nav_helper.rb'
+ - 'app/helpers/page_layout_helper.rb'
+ - 'app/helpers/preferences_helper.rb'
+ - 'app/helpers/projects_helper.rb'
+ - 'app/helpers/releases_helper.rb'
+ - 'app/helpers/reminder_emails_helper.rb'
+ - 'app/helpers/routing/artifacts_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/selects_helper.rb'
+ - 'app/helpers/snippets_helper.rb'
+ - 'app/helpers/sorting_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/tab_helper.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/helpers/webpack_helper.rb'
+ - 'app/helpers/wiki_helper.rb'
+ - 'app/helpers/x509_helper.rb'
+ - 'app/mailers/emails/members.rb'
+ - 'app/mailers/emails/merge_requests.rb'
+ - 'app/mailers/notify.rb'
+ - 'app/models/ability.rb'
+ - 'app/models/appearance.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/broadcast_message.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/ci/application_record.rb'
+ - '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'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/clusters_hierarchy.rb'
+ - 'app/models/clusters/platforms/kubernetes.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/concerns/atomic_internal_id.rb'
+ - 'app/models/concerns/avatarable.rb'
+ - 'app/models/concerns/bulk_insert_safe.rb'
+ - 'app/models/concerns/bulk_insertable_associations.rb'
+ - 'app/models/concerns/bulk_users_by_email_load.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/ci/artifactable.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/deprecated_assignee.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/concerns/group_descendant.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/id_in_ordered.rb'
+ - 'app/models/concerns/ignorable_columns.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/issuable_link.rb'
+ - 'app/models/concerns/issue_available_features.rb'
+ - 'app/models/concerns/limitable.rb'
+ - 'app/models/concerns/mentionable.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/base.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/digest.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encrypted.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/encryption_helper.rb'
+ - 'app/models/container_registry/event.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/diff_viewer/base.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/error_tracking/project_error_tracking_setting.rb'
+ - 'app/models/external_pull_request.rb'
+ - 'app/models/generic_commit_status.rb'
+ - 'app/models/group.rb'
+ - 'app/models/integrations/asana.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/models/integrations/base_chat_notification.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/harbor.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/pushover.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/issue_email_participant.rb'
+ - 'app/models/label_note.rb'
+ - 'app/models/list.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/group_member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/members_preloader.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace_setting.rb'
+ - 'app/models/namespaces/traversal/linear.rb'
+ - 'app/models/namespaces/traversal/linear_scopes.rb'
+ - 'app/models/network/graph.rb'
+ - 'app/models/note.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/operations/feature_flags/strategy.rb'
+ - 'app/models/packages/conan/file_metadatum.rb'
+ - 'app/models/packages/conan/metadatum.rb'
+ - 'app/models/packages/dependency.rb'
+ - 'app/models/packages/go/module.rb'
+ - 'app/models/packages/maven/metadatum.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/pypi/metadatum.rb'
+ - 'app/models/packages/rubygems/metadatum.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_team.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/releases/link.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/route.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/snippet_input_action.rb'
+ - 'app/models/state_note.rb'
+ - 'app/models/suggestion.rb'
+ - 'app/models/synthetic_note.rb'
+ - 'app/models/user.rb'
+ - 'app/models/wiki.rb'
+ - 'app/presenters/blob_presenter.rb'
+ - 'app/presenters/ci/pipeline_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/serializers/base_discussion_entity.rb'
+ - 'app/serializers/ci/pipeline_entity.rb'
+ - 'app/serializers/issue_entity.rb'
+ - 'app/serializers/merge_request_diff_entity.rb'
+ - 'app/serializers/pipeline_serializer.rb'
+ - 'app/services/application_settings/update_service.rb'
+ - 'app/services/authorized_project_update/find_records_due_for_refresh_service.rb'
+ - 'app/services/auto_merge/merge_when_pipeline_succeeds_service.rb'
+ - 'app/services/award_emojis/add_service.rb'
+ - 'app/services/award_emojis/destroy_service.rb'
+ - 'app/services/badges/update_service.rb'
+ - 'app/services/boards/issues/list_service.rb'
+ - 'app/services/boards/issues/move_service.rb'
+ - 'app/services/boards/lists/base_create_service.rb'
+ - 'app/services/boards/lists/list_service.rb'
+ - 'app/services/branches/validate_new_service.rb'
+ - 'app/services/bulk_imports/file_decompression_service.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/ci/create_web_ide_terminal_service.rb'
+ - 'app/services/ci/job_token_scope/remove_project_service.rb'
+ - 'app/services/ci/parse_dotenv_artifact_service.rb'
+ - 'app/services/ci/pipeline_processing/atomic_processing_service.rb'
+ - 'app/services/ci/pipelines/add_job_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/ci/retry_job_service.rb'
+ - 'app/services/ci/run_scheduled_build_service.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'app/services/clusters/applications/base_service.rb'
+ - 'app/services/clusters/applications/prometheus_update_service.rb'
+ - 'app/services/clusters/aws/fetch_credentials_service.rb'
+ - 'app/services/clusters/gcp/provision_service.rb'
+ - 'app/services/clusters/update_service.rb'
+ - 'app/services/commits/commit_patch_service.rb'
+ - 'app/services/commits/create_service.rb'
+ - 'app/services/commits/tag_service.rb'
+ - 'app/services/concerns/merge_requests/assigns_merge_params.rb'
+ - 'app/services/dependency_proxy/group_settings/update_service.rb'
+ - 'app/services/dependency_proxy/image_ttl_group_policies/update_service.rb'
+ - 'app/services/design_management/copy_design_collection/queue_service.rb'
+ - 'app/services/discussions/resolve_service.rb'
+ - 'app/services/discussions/update_diff_position_service.rb'
+ - 'app/services/draft_notes/create_service.rb'
+ - 'app/services/draft_notes/destroy_service.rb'
+ - 'app/services/emails/create_service.rb'
+ - 'app/services/environments/canary_ingress/update_service.rb'
+ - 'app/services/environments/reset_auto_stop_service.rb'
+ - 'app/services/error_tracking/collect_error_service.rb'
+ - 'app/services/git/process_ref_changes_service.rb'
+ - 'app/services/google_cloud/generate_pipeline_service.rb'
+ - 'app/services/groups/create_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/groups/update_statistics_service.rb'
+ - 'app/services/ide/base_config_service.rb'
+ - 'app/services/import/bitbucket_server_service.rb'
+ - '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'
+ - 'app/services/issues/move_service.rb'
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'app/services/issues/update_service.rb'
+ - 'app/services/lfs/lock_file_service.rb'
+ - 'app/services/members/approve_access_request_service.rb'
+ - 'app/services/members/destroy_service.rb'
+ - 'app/services/members/update_service.rb'
+ - 'app/services/merge_requests/add_context_service.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/build_service.rb'
+ - 'app/services/merge_requests/handle_assignees_change_service.rb'
+ - 'app/services/merge_requests/merge_base_service.rb'
+ - 'app/services/merge_requests/mergeability/run_checks_service.rb'
+ - 'app/services/merge_requests/mergeability_check_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/merge_requests/refresh_service.rb'
+ - 'app/services/merge_requests/request_attention_service.rb'
+ - 'app/services/merge_requests/squash_service.rb'
+ - 'app/services/merge_requests/toggle_attention_requested_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/services/metrics/dashboard/clone_dashboard_service.rb'
+ - 'app/services/metrics/dashboard/update_dashboard_service.rb'
+ - 'app/services/milestones/close_service.rb'
+ - 'app/services/milestones/create_service.rb'
+ - 'app/services/milestones/promote_service.rb'
+ - 'app/services/milestones/reopen_service.rb'
+ - 'app/services/milestones/update_service.rb'
+ - 'app/services/notes/quick_actions_service.rb'
+ - 'app/services/notes/update_service.rb'
+ - 'app/services/notification_recipients/builder/base.rb'
+ - 'app/services/notification_recipients/builder/default.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/packages/create_dependency_service.rb'
+ - 'app/services/packages/create_package_service.rb'
+ - 'app/services/packages/debian/create_distribution_service.rb'
+ - 'app/services/packages/debian/extract_changes_metadata_service.rb'
+ - 'app/services/packages/debian/parse_debian822_service.rb'
+ - 'app/services/packages/debian/update_distribution_service.rb'
+ - 'app/services/packages/go/create_package_service.rb'
+ - 'app/services/packages/go/sync_packages_service.rb'
+ - 'app/services/packages/maven/find_or_create_package_service.rb'
+ - 'app/services/packages/nuget/update_package_from_metadata_service.rb'
+ - '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'
+ - 'app/services/projects/create_service.rb'
+ - 'app/services/projects/enable_deploy_key_service.rb'
+ - 'app/services/projects/fork_service.rb'
+ - 'app/services/projects/git_deduplication_service.rb'
+ - 'app/services/projects/hashed_storage/rollback_service.rb'
+ - 'app/services/projects/import_export/export_service.rb'
+ - 'app/services/projects/import_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_download_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_link_service.rb'
+ - 'app/services/projects/operations/update_service.rb'
+ - 'app/services/projects/overwrite_project_service.rb'
+ - 'app/services/projects/participants_service.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/projects/update_repository_storage_service.rb'
+ - 'app/services/resource_access_tokens/create_service.rb'
+ - 'app/services/resource_events/change_labels_service.rb'
+ - 'app/services/service_ping/devops_report_service.rb'
+ - 'app/services/snippets/create_service.rb'
+ - 'app/services/snippets/destroy_service.rb'
+ - 'app/services/snippets/repository_validation_service.rb'
+ - 'app/services/spam/spam_action_service.rb'
+ - 'app/services/spam/spam_verdict_service.rb'
+ - 'app/services/static_site_editor/config_service.rb'
+ - 'app/services/system_notes/issuables_service.rb'
+ - 'app/services/tags/destroy_service.rb'
+ - 'app/services/two_factor/destroy_service.rb'
+ - 'app/services/users/approve_service.rb'
+ - 'app/services/users/build_service.rb'
+ - 'app/services/users/respond_to_terms_service.rb'
+ - 'app/services/wikis/create_attachment_service.rb'
+ - 'app/services/work_items/create_service.rb'
+ - 'app/services/work_items/task_list_reference_replacement_service.rb'
+ - 'app/uploaders/file_mover.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'app/validators/abstract_path_validator.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/any_field_validator.rb'
+ - 'app/validators/branch_filter_validator.rb'
+ - 'app/validators/certificate_key_validator.rb'
+ - 'app/validators/certificate_validator.rb'
+ - 'app/validators/cluster_name_validator.rb'
+ - 'app/validators/cron_freeze_period_timezone_validator.rb'
+ - 'app/validators/json_schema_validator.rb'
+ - 'app/validators/key_restriction_validator.rb'
+ - 'app/validators/line_code_validator.rb'
+ - 'app/validators/named_ecdsa_key_validator.rb'
+ - 'app/validators/rsa_key_validator.rb'
+ - 'app/validators/top_level_group_validator.rb'
+ - 'app/views/projects/merge_requests/index.atom.builder'
+ - 'app/workers/authorized_project_update/user_refresh_from_replica_worker.rb'
+ - 'app/workers/auto_devops/disable_worker.rb'
+ - 'app/workers/bulk_imports/pipeline_worker.rb'
+ - 'app/workers/cleanup_container_repository_worker.rb'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'app/workers/concerns/packages/cleanup_artifact_worker.rb'
+ - 'app/workers/concerns/project_start_import.rb'
+ - 'app/workers/concerns/worker_attributes.rb'
+ - 'app/workers/database/batched_background_migration/single_database_worker.rb'
+ - 'app/workers/file_hook_worker.rb'
+ - 'app/workers/issue_rebalancing_worker.rb'
+ - 'app/workers/issues/rebalancing_worker.rb'
+ - 'app/workers/merge_request_mergeability_check_worker.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'app/workers/process_commit_worker.rb'
+ - 'app/workers/remove_expired_members_worker.rb'
+ - 'app/workers/repository_fork_worker.rb'
+ - 'app/workers/repository_update_remote_mirror_worker.rb'
+ - 'config/application.rb'
+ - 'config/initializers/01_active_record_database_tasks_configuration_flag.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/0_inject_enterprise_edition_module.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/6_validations.rb'
+ - 'config/initializers/8_devise.rb'
+ - 'config/initializers/active_record_data_types.rb'
+ - 'config/initializers/active_record_transaction_patches.rb'
+ - 'config/initializers/content_security_policy.rb'
+ - 'config/initializers/default_url_options.rb'
+ - 'config/initializers/direct_upload_support.rb'
+ - 'config/initializers/geo.rb'
+ - 'config/initializers/google_api_client.rb'
+ - 'config/initializers/google_api_client_patch.rb'
+ - 'config/initializers/jira.rb'
+ - 'config/initializers/kaminari_active_record_relation_methods_with_limit.rb'
+ - 'config/initializers/load_balancing.rb'
+ - 'config/initializers/remove_active_job_execute_callback.rb'
+ - 'config/initializers/seed_fu.rb'
+ - 'config/initializers/sidekiq.rb'
+ - 'config/initializers/stackprof.rb'
+ - 'config/initializers/validate_database_config.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/initializers/zz_metrics.rb'
+ - 'config/initializers_before_autoloader/002_sidekiq.rb'
+ - 'config/routes.rb'
+ - 'config/settings.rb'
+ - 'danger/database/Dangerfile'
+ - 'danger/pipeline/Dangerfile'
+ - 'danger/specs/Dangerfile'
+ - 'danger/z_metadata/Dangerfile'
+ - 'db/migrate/20210709221659_add_work_item_type_id_to_issue.rb'
+ - 'db/migrate/20210816095826_add_unique_index_on_dast_profile_to_dast_profile_schedules.rb'
+ - 'db/migrate/20210818061156_remove_project_profile_compound_index_from_dast_profile_schedules.rb'
+ - 'db/migrate/20210909184349_add_index_package_id_id_on_package_files.rb'
+ - 'db/migrate/20220324175325_add_key_data_to_secure_files.rb'
+ - 'db/post_migrate/20210505092746_create_partial_covering_index_for_pending_builds.rb'
+ - 'db/post_migrate/20210629101712_remove_deprecated_modsecurity_columns.rb'
+ - 'db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb'
+ - 'db/post_migrate/20211021140426_remove_geo_upload_deprecated_fields.rb'
+ - 'db/post_migrate/20220128155814_fix_approval_rules_code_owners_rule_type_index.rb'
+ - 'db/post_migrate/20220131000001_schedule_trace_expiry_removal.rb'
+ - 'ee/app/controllers/admin/audit_logs_controller.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/controllers/admin/emails_controller.rb'
+ - 'ee/app/controllers/admin/geo/application_controller.rb'
+ - 'ee/app/controllers/admin/geo/projects_controller.rb'
+ - 'ee/app/controllers/admin/geo/settings_controller.rb'
+ - 'ee/app/controllers/admin/push_rules_controller.rb'
+ - 'ee/app/controllers/concerns/credentials_inventory_actions.rb'
+ - 'ee/app/controllers/concerns/ee/membership_actions.rb'
+ - 'ee/app/controllers/concerns/group_invite_members.rb'
+ - 'ee/app/controllers/ee/admin/application_settings_controller.rb'
+ - 'ee/app/controllers/ee/groups/group_members_controller.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/controllers/ee/projects/issues_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/operations_controller.rb'
+ - 'ee/app/controllers/ee/projects_controller.rb'
+ - 'ee/app/controllers/ee/root_controller.rb'
+ - 'ee/app/controllers/groups/billings_controller.rb'
+ - 'ee/app/controllers/groups/hooks_controller.rb'
+ - 'ee/app/controllers/groups/push_rules_controller.rb'
+ - 'ee/app/controllers/profiles/billings_controller.rb'
+ - 'ee/app/controllers/projects/integrations/zentao/issues_controller.rb'
+ - 'ee/app/controllers/projects/path_locks_controller.rb'
+ - 'ee/app/controllers/projects/push_rules_controller.rb'
+ - 'ee/app/controllers/projects/settings/slacks_controller.rb'
+ - 'ee/app/controllers/trials_controller.rb'
+ - 'ee/app/finders/ee/alert_management/alerts_finder.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/finders/merge_trains_finder.rb'
+ - 'ee/app/finders/security/pipeline_vulnerabilities_finder.rb'
+ - 'ee/app/finders/security/vulnerabilities_finder.rb'
+ - 'ee/app/graphql/ee/mutations/issues/create.rb'
+ - 'ee/app/graphql/ee/resolvers/base_issues_resolver.rb'
+ - 'ee/app/graphql/mutations/audit_events/external_audit_event_destinations/create.rb'
+ - 'ee/app/graphql/mutations/audit_events/external_audit_event_destinations/destroy.rb'
+ - 'ee/app/graphql/mutations/iterations/update.rb'
+ - 'ee/app/graphql/mutations/projects/set_locked.rb'
+ - 'ee/app/graphql/resolvers/analytics/devops_adoption/enabled_namespaces_resolver.rb'
+ - 'ee/app/graphql/resolvers/app_sec/dast/profile_resolver.rb'
+ - 'ee/app/graphql/resolvers/boards/epic_lists_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations/cadences_resolver.rb'
+ - 'ee/app/helpers/billing_plans_helper.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/dashboard_helper.rb'
+ - 'ee/app/helpers/ee/environments_helper.rb'
+ - 'ee/app/helpers/ee/integrations_helper.rb'
+ - 'ee/app/helpers/ee/issues_helper.rb'
+ - 'ee/app/helpers/ee/labels_helper.rb'
+ - 'ee/app/helpers/ee/merge_requests_helper.rb'
+ - 'ee/app/helpers/ee/notes_helper.rb'
+ - 'ee/app/helpers/ee/personal_access_tokens_helper.rb'
+ - 'ee/app/helpers/ee/projects_helper.rb'
+ - 'ee/app/models/allowed_email_domain.rb'
+ - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb'
+ - 'ee/app/models/concerns/ee/protected_ref_access.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/geo/replicable_model.rb'
+ - 'ee/app/models/concerns/geo/verifiable_replicator.rb'
+ - 'ee/app/models/concerns/security/scan_execution_policy.rb'
+ - 'ee/app/models/dast_site_profile.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/group_member.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/key.rb'
+ - 'ee/app/models/ee/list.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/milestone_release.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/namespace/root_storage_size.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/project_feature.rb'
+ - 'ee/app/models/ee/project_team.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo/tracking_base.rb'
+ - 'ee/app/models/incident_management/escalation_rule.rb'
+ - 'ee/app/models/ip_restriction.rb'
+ - 'ee/app/models/merge_requests/external_status_check.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/requirements_management/test_report.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/presenters/dast/site_profile_presenter.rb'
+ - 'ee/app/presenters/ee/merge_request_presenter.rb'
+ - 'ee/app/serializers/ee/blob_entity.rb'
+ - 'ee/app/serializers/linked_epic_issue_entity.rb'
+ - 'ee/app/serializers/vulnerabilities/finding_serializer.rb'
+ - 'ee/app/services/analytics/cycle_analytics/aggregator_service.rb'
+ - 'ee/app/services/analytics/cycle_analytics/validations.rb'
+ - 'ee/app/services/app_sec/dast/profiles/build_config_service.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/app_sec/dast/scan_configs/build_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/scanner_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profile_secret_variables/create_or_update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profile_secret_variables/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/destroy_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/fuzzing/api/ci_configuration_create_service.rb'
+ - 'ee/app/services/audit_events/runner_audit_event_service.rb'
+ - 'ee/app/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service.rb'
+ - 'ee/app/services/billable_members/destroy_service.rb'
+ - 'ee/app/services/boards/epic_boards/create_service.rb'
+ - 'ee/app/services/boards/epic_boards/update_service.rb'
+ - 'ee/app/services/boards/epics/create_service.rb'
+ - 'ee/app/services/ci/minutes/update_project_and_namespace_usage_service.rb'
+ - 'ee/app/services/ci/subscribe_bridge_service.rb'
+ - 'ee/app/services/compliance_management/frameworks/create_service.rb'
+ - 'ee/app/services/compliance_management/merge_requests/create_compliance_violations_service.rb'
+ - 'ee/app/services/deployments/auto_rollback_service.rb'
+ - 'ee/app/services/dora/aggregate_metrics_service.rb'
+ - 'ee/app/services/ee/alert_management/alerts/update_service.rb'
+ - 'ee/app/services/ee/allowed_email_domains/update_service.rb'
+ - 'ee/app/services/ee/audit_event_service.rb'
+ - 'ee/app/services/ee/boards/base_service.rb'
+ - 'ee/app/services/ee/boards/issues/move_service.rb'
+ - 'ee/app/services/ee/commits/create_service.rb'
+ - 'ee/app/services/ee/deploy_keys/create_service.rb'
+ - 'ee/app/services/ee/groups/update_service.rb'
+ - 'ee/app/services/ee/ip_restrictions/update_service.rb'
+ - 'ee/app/services/ee/issuable_base_service.rb'
+ - 'ee/app/services/ee/issues/base_service.rb'
+ - 'ee/app/services/ee/issues/clone_service.rb'
+ - 'ee/app/services/ee/issues/move_service.rb'
+ - 'ee/app/services/ee/merge_requests/base_service.rb'
+ - 'ee/app/services/ee/merge_requests/refresh_service.rb'
+ - 'ee/app/services/ee/merge_requests/update_service.rb'
+ - 'ee/app/services/ee/milestones/update_service.rb'
+ - 'ee/app/services/ee/notes/update_service.rb'
+ - 'ee/app/services/ee/projects/create_service.rb'
+ - 'ee/app/services/ee/projects/destroy_service.rb'
+ - 'ee/app/services/ee/projects/gitlab_projects_import_service.rb'
+ - 'ee/app/services/ee/protected_branches/create_service.rb'
+ - 'ee/app/services/ee/resource_events/change_labels_service.rb'
+ - 'ee/app/services/ee/todo_service.rb'
+ - 'ee/app/services/ee/users/update_service.rb'
+ - 'ee/app/services/elastic/indexing_control_service.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/app/services/epic_links/create_service.rb'
+ - 'ee/app/services/epic_links/update_service.rb'
+ - 'ee/app/services/epics/base_service.rb'
+ - 'ee/app/services/epics/create_service.rb'
+ - 'ee/app/services/epics/update_dates_service.rb'
+ - 'ee/app/services/epics/update_service.rb'
+ - 'ee/app/services/external_status_checks/create_service.rb'
+ - 'ee/app/services/geo/metrics_update_service.rb'
+ - 'ee/app/services/geo/move_repository_service.rb'
+ - 'ee/app/services/geo/prune_event_log_service.rb'
+ - 'ee/app/services/geo/repository_verification_primary_service.rb'
+ - 'ee/app/services/geo/repository_verification_secondary_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/plan_upgrade_service.rb'
+ - 'ee/app/services/groups/memberships/export_service.rb'
+ - 'ee/app/services/groups/update_repository_storage_service.rb'
+ - 'ee/app/services/incident_management/incidents/upload_metric_service.rb'
+ - 'ee/app/services/iterations/cadences/create_iterations_in_advance_service.rb'
+ - 'ee/app/services/iterations/cadences/create_service.rb'
+ - 'ee/app/services/iterations/cadences/destroy_service.rb'
+ - 'ee/app/services/iterations/cadences/update_service.rb'
+ - 'ee/app/services/iterations/delete_service.rb'
+ - 'ee/app/services/merge_requests/update_blocks_service.rb'
+ - 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
+ - 'ee/app/services/projects/mark_for_deletion_service.rb'
+ - 'ee/app/services/projects/slack_application_install_service.rb'
+ - 'ee/app/services/projects/update_mirror_service.rb'
+ - 'ee/app/services/resource_events/change_weight_service.rb'
+ - 'ee/app/services/security/dependency_list_service.rb'
+ - 'ee/app/services/security/orchestration/assign_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/process_policy_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/project_create_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
+ - 'ee/app/services/slash_commands/global_slack_handler.rb'
+ - 'ee/app/services/start_pull_mirroring_service.rb'
+ - 'ee/app/services/system_notes/epics_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/services/users/captcha_challenge_service.rb'
+ - 'ee/app/services/vulnerabilities/base_service.rb'
+ - 'ee/app/services/vulnerabilities/create_service.rb'
+ - 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'
+ - 'ee/app/services/vulnerability_external_issue_links/create_service.rb'
+ - 'ee/app/services/vulnerability_feedback/create_service.rb'
+ - 'ee/app/services/vulnerability_feedback/destroy_service.rb'
+ - 'ee/app/services/vulnerability_feedback_module/update_service.rb'
+ - 'ee/app/validators/host_validator.rb'
+ - 'ee/app/workers/app_sec/dast/profile_schedule_worker.rb'
+ - 'ee/app/workers/audit_events/audit_event_streaming_worker.rb'
+ - 'ee/app/workers/concerns/elastic/migration_helper.rb'
+ - 'ee/app/workers/ee/ci/build_finished_worker.rb'
+ - 'ee/app/workers/ee/post_receive.rb'
+ - 'ee/app/workers/epics/new_epic_issue_worker.rb'
+ - 'ee/app/workers/geo/secondary/registry_consistency_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_namespace_worker.rb'
+ - 'ee/db/geo/migrate/20170627195211_add_index_to_project_registry.rb'
+ - 'ee/db/geo/migrate/20180402170913_add_missing_on_primary_to_job_artifact_registry..rb'
+ - 'ee/lib/analytics/devops_adoption/snapshot_calculator.rb'
+ - 'ee/lib/api/epics.rb'
+ - 'ee/lib/api/merge_request_approval_rules.rb'
+ - 'ee/lib/api/protected_environments.rb'
+ - 'ee/lib/audit/details.rb'
+ - 'ee/lib/ee/api/entities/epic.rb'
+ - 'ee/lib/ee/api/entities/experiment.rb'
+ - 'ee/lib/ee/api/geo.rb'
+ - 'ee/lib/ee/api/groups.rb'
+ - 'ee/lib/ee/api/helpers/award_emoji.rb'
+ - 'ee/lib/ee/api/helpers/variables_helpers.rb'
+ - 'ee/lib/ee/api/internal/base.rb'
+ - 'ee/lib/ee/api/merge_request_approvals.rb'
+ - 'ee/lib/ee/api/protected_branches.rb'
+ - 'ee/lib/ee/api/settings.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/ee/container_registry/client.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/group.rb'
+ - 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'ee/lib/ee/gitlab/checks/diff_check.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/tag_check.rb'
+ - 'ee/lib/ee/gitlab/ci/reports/security/reports.rb'
+ - 'ee/lib/ee/gitlab/cleanup/orphan_job_artifact_files.rb'
+ - 'ee/lib/ee/gitlab/git_access_wiki.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/epic_actions.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/issue_actions.rb'
+ - 'ee/lib/ee/gitlab/repository_size_checker.rb'
+ - 'ee/lib/ee/gitlab/scim/deprovision_service.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/ee/sidebars/groups/menus/settings_menu.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/analytics_menu.rb'
+ - 'ee/lib/ee/sidebars/projects/menus/security_compliance_menu.rb'
+ - 'ee/lib/elastic/latest/custom_language_analyzers.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/elastic/latest/git_instance_proxy.rb'
+ - 'ee/lib/gitlab/auth/group_saml/session_enforcer.rb'
+ - 'ee/lib/gitlab/authority_analyzer.rb'
+ - 'ee/lib/gitlab/ci/reports/dependency_list/dependency.rb'
+ - 'ee/lib/gitlab/ci/reports/dependency_list/report.rb'
+ - 'ee/lib/gitlab/code_owners/file.rb'
+ - 'ee/lib/gitlab/code_owners/groups_loader.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/lib/gitlab/elastic/indexer.rb'
+ - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/daemon.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/events/repository_deleted_event.rb'
+ - 'ee/lib/gitlab/geo/oauth/logout_token.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/lazy_epic_aggregate.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/issues/lazy_block_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'
+ - 'ee/lib/gitlab/graphql/loaders/bulk_epic_aggregate_loader.rb'
+ - 'ee/lib/gitlab/ip_restriction/enforcer.rb'
+ - 'ee/lib/gitlab/path_locks_finder.rb'
+ - 'ee/lib/gitlab/sitemaps/generator.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/count_ci_builds_metric.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/count_users_creating_ci_builds_metric.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
+ - 'ee/lib/omni_auth/strategies/group_saml.rb'
+ - 'ee/lib/pseudonymizer/dumper.rb'
+ - 'ee/lib/pseudonymizer/uploader.rb'
+ - 'ee/lib/sidebars/groups/menus/administration_menu.rb'
+ - 'ee/lib/sidebars/groups/menus/analytics_menu.rb'
+ - 'ee/lib/sidebars/groups/menus/security_compliance_menu.rb'
+ - 'ee/lib/tasks/geo.rake'
+ - 'ee/lib/tasks/gitlab/db.rake'
+ - 'ee/lib/tasks/gitlab/geo.rake'
+ - 'ee/lib/tasks/gitlab/seed/insights.rake'
+ - 'ee/spec/controllers/subscriptions_controller_spec.rb'
+ - 'ee/spec/factories/iterations.rb'
+ - 'ee/spec/factories/vulnerabilities/external_issue_links.rb'
+ - 'ee/spec/features/boards/user_visits_board_spec.rb'
+ - 'ee/spec/finders/custom_project_templates_finder_spec.rb'
+ - 'ee/spec/finders/security/findings_finder_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/graphql/types/pipeline_security_report_finding_type_spec.rb'
+ - 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/data_collector_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/project_search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/search_results_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/geo_node_status_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/services/licenses/destroy_service_spec.rb'
+ - 'ee/spec/services/merge_requests/merge_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/support/helpers/ee/ldap_helpers.rb'
+ - 'ee/spec/support/helpers/feature_approval_helper.rb'
+ - 'ee/spec/support/helpers/search_results_helpers.rb'
+ - 'ee/spec/support/http_io/http_io_helpers.rb'
+ - 'ee/spec/support/shared_examples/requests/api/graphql/geo/registries_shared_examples.rb'
+ - 'ee/spec/views/layouts/header/help_dropdown/_cross_stage_fdm.html.haml_spec.rb'
+ - 'ee/spec/views/shared/access_tokens/_table.html.haml_spec.rb'
+ - 'ee/spec/workers/elastic/migration_worker_spec.rb'
+ - 'lib/api/api_guard.rb'
+ - 'lib/api/boards_responses.rb'
+ - 'lib/api/branches.rb'
+ - 'lib/api/ci/helpers/runner.rb'
+ - 'lib/api/ci/pipeline_schedules.rb'
+ - 'lib/api/ci/runner.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/ci/secure_files.rb'
+ - 'lib/api/commits.rb'
+ - 'lib/api/debian_project_packages.rb'
+ - 'lib/api/deployments.rb'
+ - 'lib/api/discussions.rb'
+ - 'lib/api/entities/feature.rb'
+ - 'lib/api/entities/member_access.rb'
+ - 'lib/api/entities/project_import_status.rb'
+ - 'lib/api/feature_flags.rb'
+ - 'lib/api/feature_flags_user_lists.rb'
+ - 'lib/api/files.rb'
+ - 'lib/api/groups.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/common_helpers.rb'
+ - 'lib/api/helpers/file_upload_helpers.rb'
+ - 'lib/api/helpers/headers_helpers.rb'
+ - 'lib/api/helpers/label_helpers.rb'
+ - 'lib/api/helpers/members_helpers.rb'
+ - 'lib/api/helpers/packages/basic_auth_helpers.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/helpers/packages/dependency_proxy_helpers.rb'
+ - 'lib/api/helpers/projects_helpers.rb'
+ - 'lib/api/helpers/users_helpers.rb'
+ - 'lib/api/helpers/version.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/api/internal/container_registry/migration.rb'
+ - 'lib/api/invitations.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/api/merge_requests.rb'
+ - 'lib/api/nuget_project_packages.rb'
+ - 'lib/api/pages_domains.rb'
+ - 'lib/api/project_clusters.rb'
+ - 'lib/api/project_snippets.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/api/projects_relation_builder.rb'
+ - 'lib/api/protected_branches.rb'
+ - 'lib/api/pypi_packages.rb'
+ - 'lib/api/remote_mirrors.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/rubygem_packages.rb'
+ - 'lib/api/settings.rb'
+ - 'lib/api/snippets.rb'
+ - 'lib/api/tags.rb'
+ - 'lib/api/terraform/modules/v1/packages.rb'
+ - 'lib/api/users.rb'
+ - 'lib/backup/gitaly_backup.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/base_sanitization_filter.rb'
+ - 'lib/banzai/filter/external_link_filter.rb'
+ - 'lib/banzai/filter/gollum_tags_filter.rb'
+ - 'lib/banzai/filter/markdown_post_escape_filter.rb'
+ - 'lib/banzai/filter/playable_link_filter.rb'
+ - 'lib/banzai/filter/references/commit_reference_filter.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/milestone_reference_filter.rb'
+ - 'lib/banzai/filter/repository_link_filter.rb'
+ - 'lib/banzai/filter/upload_link_filter.rb'
+ - 'lib/banzai/filter/wiki_link_filter.rb'
+ - 'lib/banzai/object_renderer.rb'
+ - 'lib/banzai/reference_parser/base_parser.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/bitbucket_server/representation/pull_request_comment.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/bulk_imports/common/pipelines/uploads_pipeline.rb'
+ - 'lib/bulk_imports/groups/loaders/group_loader.rb'
+ - 'lib/bulk_imports/projects/transformers/project_attributes_transformer.rb'
+ - 'lib/container_registry/base_client.rb'
+ - 'lib/container_registry/client.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/file_size_validator.rb'
+ - 'lib/generators/gitlab/usage_metric_generator.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/auth/auth_finders.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/ldap/authentication.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/background_migration/fix_vulnerability_occurrences_with_hashes_as_raw_metadata.rb'
+ - 'lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'lib/gitlab/bare_repository_import/importer.rb'
+ - 'lib/gitlab/bare_repository_import/repository.rb'
+ - 'lib/gitlab/bullet/exclusions.rb'
+ - 'lib/gitlab/cache/ci/project_pipeline_status.rb'
+ - 'lib/gitlab/changelog/config.rb'
+ - 'lib/gitlab/checks/branch_check.rb'
+ - 'lib/gitlab/checks/diff_check.rb'
+ - 'lib/gitlab/checks/lfs_check.rb'
+ - 'lib/gitlab/checks/matching_merge_request.rb'
+ - 'lib/gitlab/checks/push_check.rb'
+ - 'lib/gitlab/checks/push_file_count_check.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/ansi2json/converter.rb'
+ - 'lib/gitlab/ci/ansi2json/style.rb'
+ - 'lib/gitlab/ci/artifact_file_reader.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata.rb'
+ - 'lib/gitlab/ci/build/artifacts/path.rb'
+ - 'lib/gitlab/ci/build/policy/kubernetes.rb'
+ - 'lib/gitlab/ci/config.rb'
+ - 'lib/gitlab/ci/config/entry/caches.rb'
+ - 'lib/gitlab/ci/config/entry/environment.rb'
+ - 'lib/gitlab/ci/config/entry/includes.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/jobs.rb'
+ - 'lib/gitlab/ci/config/entry/needs.rb'
+ - 'lib/gitlab/ci/config/entry/policy.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/entry/product/matrix.rb'
+ - 'lib/gitlab/ci/config/extendable/entry.rb'
+ - 'lib/gitlab/ci/config/external/file/base.rb'
+ - 'lib/gitlab/ci/config/external/file/template.rb'
+ - 'lib/gitlab/ci/config/external/mapper.rb'
+ - 'lib/gitlab/ci/config/normalizer.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/parsers/security/common.rb'
+ - 'lib/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'lib/gitlab/ci/pipeline/chain/populate.rb'
+ - 'lib/gitlab/ci/pipeline/chain/seed.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/abilities.rb'
+ - 'lib/gitlab/ci/pipeline/chain/validate/repository.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/base.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexer.rb'
+ - 'lib/gitlab/ci/pipeline/seed/build.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/runner/backoff.rb'
+ - 'lib/gitlab/ci/runner_instructions.rb'
+ - 'lib/gitlab/ci/runner_releases.rb'
+ - 'lib/gitlab/ci/runner_upgrade_check.rb'
+ - 'lib/gitlab/ci/status/composite.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/ci/trace/chunked_io.rb'
+ - 'lib/gitlab/ci/trace/metrics.rb'
+ - 'lib/gitlab/ci/variables/builder.rb'
+ - 'lib/gitlab/ci/yaml_processor.rb'
+ - 'lib/gitlab/config/entry/attributable.rb'
+ - 'lib/gitlab/config/entry/simplifiable.rb'
+ - 'lib/gitlab/config/entry/validatable.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/content_security_policy/config_loader.rb'
+ - 'lib/gitlab/cross_project_access/check_info.rb'
+ - 'lib/gitlab/data_builder/deployment.rb'
+ - 'lib/gitlab/database/as_with_materialized.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_wrapper.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/cascading_namespace_settings.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/batched_background_migration_helpers.rb'
+ - 'lib/gitlab/database/partitioning/detached_partition_dropper.rb'
+ - 'lib/gitlab/database/partitioning/monthly_strategy.rb'
+ - 'lib/gitlab/database/partitioning/time_partition.rb'
+ - 'lib/gitlab/database/postgres_foreign_key.rb'
+ - 'lib/gitlab/database/postgres_index.rb'
+ - 'lib/gitlab/database/postgres_partition.rb'
+ - 'lib/gitlab/database/postgres_partitioned_table.rb'
+ - 'lib/gitlab/database/reindexing.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/database/transaction/observer.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/diff/custom_diff.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'
+ - 'lib/gitlab/email/receiver.rb'
+ - 'lib/gitlab/email/reply_parser.rb'
+ - 'lib/gitlab/encrypted_command_base.rb'
+ - 'lib/gitlab/encrypted_configuration.rb'
+ - 'lib/gitlab/endpoint_attributes/config.rb'
+ - 'lib/gitlab/error_tracking.rb'
+ - 'lib/gitlab/error_tracking/context_payload_generator.rb'
+ - 'lib/gitlab/error_tracking/processor/sidekiq_processor.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/event_store/event.rb'
+ - 'lib/gitlab/exception_log_formatter.rb'
+ - 'lib/gitlab/external_authorization/client.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/gfm/reference_rewriter.rb'
+ - 'lib/gitlab/git/compare.rb'
+ - 'lib/gitlab/git/diff_collection.rb'
+ - 'lib/gitlab/git/merge_base.rb'
+ - 'lib/gitlab/git/push.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/git/rugged_impl/tree.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/git_access_project.rb'
+ - 'lib/gitlab/git_access_snippet.rb'
+ - 'lib/gitlab/git_access_wiki.rb'
+ - 'lib/gitlab/gitaly_client.rb'
+ - 'lib/gitlab/gitaly_client/blob_service.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/github_import/importer/pull_request_review_importer.rb'
+ - 'lib/gitlab/github_import/representation/issue.rb'
+ - 'lib/gitlab/gitlab_import/client.rb'
+ - 'lib/gitlab/gitlab_import/importer.rb'
+ - 'lib/gitlab/golang.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/base_condition.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/connection.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/order_info.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/query_builder.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/hashed_storage/rake_helper.rb'
+ - 'lib/gitlab/hotlinking_detector.rb'
+ - 'lib/gitlab/http_io.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/import/import_failure_service.rb'
+ - 'lib/gitlab/import/merge_request_creator.rb'
+ - 'lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb'
+ - 'lib/gitlab/import_export/base/relation_factory.rb'
+ - 'lib/gitlab/import_export/fast_hash_serializer.rb'
+ - 'lib/gitlab/import_export/file_importer.rb'
+ - 'lib/gitlab/import_export/group/tree_restorer.rb'
+ - 'lib/gitlab/import_export/json/legacy_writer.rb'
+ - 'lib/gitlab/import_export/merge_request_parser.rb'
+ - 'lib/gitlab/import_export/project/export_task.rb'
+ - 'lib/gitlab/import_export/project/tree_restorer.rb'
+ - 'lib/gitlab/instrumentation/redis_interceptor.rb'
+ - 'lib/gitlab/jira_import.rb'
+ - 'lib/gitlab/jira_import/base_importer.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/legacy_github_import/issuable_formatter.rb'
+ - 'lib/gitlab/legacy_github_import/project_creator.rb'
+ - 'lib/gitlab/mail_room.rb'
+ - 'lib/gitlab/mail_room/authenticator.rb'
+ - 'lib/gitlab/manifest_import/manifest.rb'
+ - 'lib/gitlab/marginalia.rb'
+ - 'lib/gitlab/markdown_cache/field_data.rb'
+ - 'lib/gitlab/metrics/dashboard/finder.rb'
+ - 'lib/gitlab/metrics/dashboard/importer.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/cluster_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/metric_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/variable_endpoint_inserter.rb'
+ - 'lib/gitlab/metrics/methods.rb'
+ - 'lib/gitlab/metrics/rails_slis.rb'
+ - 'lib/gitlab/metrics/web_transaction.rb'
+ - 'lib/gitlab/middleware/compressed_json.rb'
+ - 'lib/gitlab/middleware/multipart.rb'
+ - 'lib/gitlab/middleware/same_site_cookies.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/omniauth_initializer.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb'
+ - 'lib/gitlab/patch/database_config.rb'
+ - 'lib/gitlab/patch/prependable.rb'
+ - 'lib/gitlab/popen.rb'
+ - 'lib/gitlab/query_limiting/active_support_subscriber.rb'
+ - 'lib/gitlab/quick_actions/command_definition.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/quick_actions/issuable_actions.rb'
+ - 'lib/gitlab/quick_actions/issue_and_merge_request_actions.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'lib/gitlab/redis/wrapper.rb'
+ - 'lib/gitlab/runtime.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/sanitizers/svg.rb'
+ - 'lib/gitlab/search/params.rb'
+ - 'lib/gitlab/search_context.rb'
+ - 'lib/gitlab/search_results.rb'
+ - 'lib/gitlab/shell.rb'
+ - 'lib/gitlab/sidekiq_config.rb'
+ - 'lib/gitlab/sidekiq_config/cli_methods.rb'
+ - 'lib/gitlab/sidekiq_config/worker_router.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/deduplicates_when_scheduling.rb'
+ - 'lib/gitlab/sidekiq_middleware/extra_done_log_metadata.rb'
+ - 'lib/gitlab/sidekiq_middleware/server_metrics.rb'
+ - 'lib/gitlab/slash_commands/presenters/issue_show.rb'
+ - 'lib/gitlab/suggestions/suggestion_set.rb'
+ - 'lib/gitlab/template/gitlab_ci_yml_template.rb'
+ - 'lib/gitlab/template_parser/eval_state.rb'
+ - 'lib/gitlab/untrusted_regexp.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/usage/metrics/aggregates/aggregate.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/usage_data_counters/base_counter.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/gitlab/utils/delegator_override.rb'
+ - 'lib/gitlab/utils/override.rb'
+ - 'lib/gitlab/view/presenter/delegated.rb'
+ - 'lib/google_api/auth.rb'
+ - 'lib/mattermost/client.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/microsoft_teams/notifier.rb'
+ - 'lib/sidebars/groups/menus/packages_registries_menu.rb'
+ - 'lib/sidebars/menu.rb'
+ - 'lib/sidebars/projects/menus/ci_cd_menu.rb'
+ - 'lib/sidebars/projects/menus/packages_registries_menu.rb'
+ - 'lib/sidebars/projects/menus/security_compliance_menu.rb'
+ - 'lib/sidebars/projects/menus/settings_menu.rb'
+ - 'lib/sidebars/projects/panel.rb'
+ - 'lib/system_check/app/systemd_unit_files_or_init_script_up_to_date_check.rb'
+ - 'lib/system_check/init_helpers.rb'
+ - 'lib/tasks/cleanup.rake'
+ - 'lib/tasks/eslint.rake'
+ - 'lib/tasks/gitlab/assets.rake'
+ - 'lib/tasks/gitlab/cleanup.rake'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'lib/tasks/gitlab/packages/migrate.rake'
+ - 'lib/tasks/gitlab/seed.rake'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/gitlab/snippets.rake'
+ - 'lib/tasks/gitlab/storage.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'qa/qa/ee/page/merge_request/show.rb'
+ - 'qa/qa/ee/resource/settings/elasticsearch.rb'
+ - 'qa/qa/flow/sign_up.rb'
+ - 'qa/qa/git/repository.rb'
+ - 'qa/qa/page/component/design_management.rb'
+ - 'qa/qa/page/component/select2.rb'
+ - 'qa/qa/page/component/snippet.rb'
+ - 'qa/qa/page/element.rb'
+ - 'qa/qa/page/mattermost/login.rb'
+ - 'qa/qa/page/page_concern.rb'
+ - 'qa/qa/page/project/web_ide/edit.rb'
+ - 'qa/qa/page/view.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/resource/repository/push.rb'
+ - 'qa/qa/resource/reusable_collection.rb'
+ - 'qa/qa/resource/runner.rb'
+ - 'qa/qa/resource/snippet.rb'
+ - 'qa/qa/runtime/application_settings.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/runtime/gpg.rb'
+ - 'qa/qa/runtime/ip_address.rb'
+ - 'qa/qa/scenario/bootable.rb'
+ - 'qa/qa/scenario/template.rb'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'qa/qa/service/docker_run/jenkins.rb'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/distributed_reads_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/advanced_global_advanced_syntax_search_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/elasticsearch_api_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/issues_index/issue_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/main_index/blob_index_spec.rb'
+ - 'qa/qa/specs/features/ee/api/9_enablement/elasticsearch/index_tests/merge_request_index/merge_request_index_spec.rb'
+ - '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/12_geo/geo_replication_maven_package_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/helpers/context_selector.rb'
+ - 'qa/qa/specs/parallel_runner.rb'
+ - 'qa/qa/support/loglinking.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/support/wait_for_requests.rb'
+ - 'qa/qa/tools/delete_projects.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'qa/qa/tools/test_resources_handler.rb'
+ - 'rubocop/cop/api/grape_array_missing_coerce.rb'
+ - 'rubocop/cop/avoid_keyword_arguments_in_sidekiq_workers.rb'
+ - 'rubocop/cop/gitlab/event_store_subscriber.rb'
+ - 'rubocop/cop/gitlab/keys_first_and_values_first.rb'
+ - 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
+ - 'rubocop/cop/gitlab/policy_rule_boolean.rb'
+ - 'rubocop/cop/ignored_columns.rb'
+ - 'rubocop/cop/migration/add_limit_to_text_columns.rb'
+ - 'rubocop/cop/migration/add_reference.rb'
+ - 'rubocop/cop/migration/hash_index.rb'
+ - 'rubocop/cop/migration/remove_column.rb'
+ - 'rubocop/cop/migration/sidekiq_queue_migrate.rb'
+ - 'rubocop/cop/performance/ar_exists_and_present_blank.rb'
+ - 'rubocop/cop/rspec/web_mock_enable.rb'
+ - 'rubocop/routes_under_scope.rb'
+ - 'scripts/pipeline_test_report_builder.rb'
+ - 'scripts/review_apps/automated_cleanup.rb'
+ - 'scripts/setup/find-jh-branch.rb'
+ - 'scripts/static-analysis'
+ - 'sidekiq_cluster/cli.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/factories/ci/runners.rb'
+ - 'spec/factories/container_repositories.rb'
+ - 'spec/factories/deployments.rb'
+ - 'spec/factories/labels.rb'
+ - 'spec/factories/merge_requests.rb'
+ - 'spec/factories/namespaces.rb'
+ - 'spec/factories/packages/packages.rb'
+ - 'spec/factories/projects.rb'
+ - 'spec/factories/protected_tags.rb'
+ - 'spec/factories/users.rb'
+ - 'spec/factories_spec.rb'
+ - 'spec/features/admin/admin_users_spec.rb'
+ - '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'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb'
+ - 'spec/lib/gitlab/config/entry/validators/nested_array_helpers_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/rack_attack/user_allowlist_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_router_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_migrate_jobs_spec.rb'
+ - 'spec/lib/mattermost/session_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/models/concerns/limitable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/snippet_input_action_spec.rb'
+ - 'spec/policies/project_statistics_policy_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/integrations_spec.rb'
+ - 'spec/routing/import_routing_spec.rb'
+ - 'spec/serializers/issue_sidebar_basic_entity_spec.rb'
+ - 'spec/services/application_settings/update_service_spec.rb'
+ - 'spec/services/clusters/applications/create_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/members/destroy_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/packages/debian/update_distribution_service_spec.rb'
+ - 'spec/services/packages/maven/find_or_create_package_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/append_package_file_service_spec.rb'
+ - 'spec/services/packages/maven/metadata/sync_service_spec.rb'
+ - 'spec/services/projects/container_repository/cleanup_tags_service_spec.rb'
+ - 'spec/services/projects/create_service_spec.rb'
+ - 'spec/spec_helper.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/database/multiple_databases.rb'
+ - 'spec/support/external_authorization_service_helpers.rb'
+ - 'spec/support/flaky_tests.rb'
+ - 'spec/support/generate-seed-repo-rb'
+ - 'spec/support/helpers/cycle_analytics_helpers.rb'
+ - 'spec/support/helpers/filter_spec_helper.rb'
+ - 'spec/support/helpers/filtered_search_helpers.rb'
+ - 'spec/support/helpers/gitaly_setup.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/lets_encrypt_helpers.rb'
+ - 'spec/support/helpers/live_debugger.rb'
+ - 'spec/support/helpers/modal_helpers.rb'
+ - 'spec/support/helpers/seed_helper.rb'
+ - 'spec/support/helpers/stub_gitlab_calls.rb'
+ - 'spec/support/helpers/stubbed_feature.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/http_io/http_io_helpers.rb'
+ - 'spec/support/import_export/project_tree_expectations.rb'
+ - 'spec/support/matchers/abort_matcher.rb'
+ - 'spec/support/services/service_response_shared_examples.rb'
+ - 'spec/support/shared_contexts/requests/api/debian_repository_shared_context.rb'
+ - 'spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb'
+ - 'spec/support/shared_examples/features/discussion_comments_shared_example.rb'
+ - 'spec/support/shared_examples/helpers/issuable_description_templates_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/import_export/project/tree_restorer_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_distributions_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/debian_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/status_shared_examples.rb'
+ - 'spec/support/shared_examples/sends_git_audit_streaming_event_shared_examples.rb'
+ - 'spec/support/shared_examples/views/pipeline_status_changes_email.rb'
+ - 'spec/support/shared_examples/views/registration_features_prompt_shared_examples.rb'
+ - 'spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb'
+ - 'spec/support/webmock.rb'
+ - 'spec/views/admin/application_settings/general.html.haml_spec.rb'
+ - 'spec/views/groups/edit.html.haml_spec.rb'
+ - 'spec/views/profiles/keys/_key.html.haml_spec.rb'
+ - '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'
+ - 'tooling/rspec_flaky/flaky_example.rb'
+ - 'tooling/rspec_flaky/flaky_examples_collection.rb'
diff --git a/.rubocop_todo/style/keyword_parameters_order.yml b/.rubocop_todo/style/keyword_parameters_order.yml
new file mode 100644
index 00000000000..0bb499cebb0
--- /dev/null
+++ b/.rubocop_todo/style/keyword_parameters_order.yml
@@ -0,0 +1,72 @@
+---
+# Cop supports --auto-correct.
+Style/KeywordParametersOrder:
+ # Offense count: 110
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/group_descendants_finder.rb'
+ - 'app/finders/merge_request_target_project_finder.rb'
+ - 'app/graphql/resolvers/package_pipelines_resolver.rb'
+ - 'app/helpers/timeboxes_helper.rb'
+ - 'app/models/concerns/sortable.rb'
+ - 'app/services/clusters/kubernetes/create_or_update_service_account_service.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/file_upload.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3.rb'
+ - 'app/services/issues/create_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/snippets/create_service.rb'
+ - 'app/services/work_items/create_and_link_service.rb'
+ - 'app/services/work_items/create_from_task_service.rb'
+ - 'app/services/work_items/create_service.rb'
+ - 'app/services/work_items/delete_task_service.rb'
+ - 'ee/app/graphql/mutations/dast/profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast_scanner_profiles/create.rb'
+ - 'ee/app/graphql/mutations/dast_site_profiles/update.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/requirements_management/test_report.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/bulk_find_or_create_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/create_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/find_or_create_service.rb'
+ - 'ee/app/services/audit_events/user_impersonation_group_audit_event_service.rb'
+ - 'ee/app/services/members/activate_service.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/drop_invalid_remediations_spec.rb'
+ - 'ee/spec/requests/api/deployments_spec.rb'
+ - 'lib/gitlab/checks/timed_logger.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/database/partitioning/monthly_strategy.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/diff/diff_refs.rb'
+ - 'lib/gitlab/email/smime/signer.rb'
+ - 'lib/gitlab/error_tracking.rb'
+ - 'lib/gitlab/exclusive_lease.rb'
+ - 'lib/gitlab/import_export/import_failure_service.rb'
+ - 'lib/gitlab/merge_requests/mergeability/results_store.rb'
+ - 'lib/microsoft_teams/notifier.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/spec/runtime/env_spec.rb'
+ - 'spec/features/projects/branches_spec.rb'
+ - 'spec/graphql/types/ci/pipeline_counts_type_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb'
+ - 'spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb'
+ - 'spec/migrations/20211018152654_schedule_remove_duplicate_vulnerabilities_findings3_spec.rb'
+ - 'spec/migrations/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings_spec.rb'
+ - 'spec/migrations/20220106111958_add_insert_or_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220106112043_add_update_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220106112085_add_update_vulnerability_reads_location_trigger_spec.rb'
+ - 'spec/migrations/20220106163326_add_has_issues_on_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20220107064845_populate_vulnerability_reads_spec.rb'
+ - 'spec/migrations/confirm_support_bot_user_spec.rb'
+ - 'spec/services/service_ping/submit_service_ping_service_spec.rb'
+ - 'spec/support/helpers/smime_helper.rb'
+ - 'spec/support/helpers/workhorse_helpers.rb'
+ - 'spec/support/shared_examples/services/container_expiration_policy_shared_examples.rb'
+ - 'spec/support/shared_examples/services/dependency_proxy_ttl_policies_shared_examples.rb'
+ - 'spec/support/shared_examples/services/namespace_package_settings_shared_examples.rb'
+ - 'spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb'
diff --git a/.rubocop_todo/style/lambda.yml b/.rubocop_todo/style/lambda.yml
new file mode 100644
index 00000000000..5b898417d96
--- /dev/null
+++ b/.rubocop_todo/style/lambda.yml
@@ -0,0 +1,274 @@
+---
+# Cop supports --auto-correct.
+Style/Lambda:
+ # Offense count: 653
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/notes_actions.rb'
+ - 'app/controllers/concerns/spammable_actions/captcha_check/rest_api_actions_support.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/search_controller.rb'
+ - 'app/graphql/mutations/container_repositories/destroy_tags.rb'
+ - 'app/graphql/mutations/design_management/delete.rb'
+ - 'app/graphql/types/permission_types/base_permission_type.rb'
+ - 'app/models/analytics/cycle_analytics/issue_stage_event.rb'
+ - 'app/models/analytics/cycle_analytics/merge_request_stage_event.rb'
+ - 'app/models/bulk_imports/tracker.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/deleted_object.rb'
+ - 'app/models/ci/instance_variable.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pending_build.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/concerns/application_status.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb'
+ - 'app/models/concerns/approvable_base.rb'
+ - 'app/models/concerns/atomic_internal_id.rb'
+ - 'app/models/concerns/ci/has_status.rb'
+ - 'app/models/concerns/clusters/agents/authorization_config_scopes.rb'
+ - 'app/models/concerns/has_environment_scope.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/id_in_ordered.rb'
+ - 'app/models/concerns/integrations/has_issue_tracker_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/issue_resource_event.rb'
+ - 'app/models/concerns/milestoneable.rb'
+ - 'app/models/concerns/mirror_authentication.rb'
+ - 'app/models/concerns/packages/debian/component_file.rb'
+ - 'app/models/concerns/reactive_caching.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/action.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/version.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/event.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_deploy_key.rb'
+ - 'app/models/group_group_link.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/identity.rb'
+ - 'app/models/import_failure.rb'
+ - 'app/models/integrations/zentao_tracker_data.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/issue/metrics.rb'
+ - 'app/models/jira_connect_installation.rb'
+ - 'app/models/label.rb'
+ - 'app/models/label_link.rb'
+ - 'app/models/loose_foreign_keys/deleted_record.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/cleanup_schedule.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_diff_file.rb'
+ - 'app/models/merge_requests_closing_issues.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/note.rb'
+ - 'app/models/note_diff_file.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/onboarding_progress.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/packages/package_file.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/product_analytics_event.rb'
+ - 'app/models/programming_language.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_feature_usage.rb'
+ - 'app/models/projects/topic.rb'
+ - 'app/models/prometheus_alert_event.rb'
+ - 'app/models/raw_usage_data.rb'
+ - 'app/models/redirect_route.rb'
+ - 'app/models/release.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository_language.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/timelog.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/user.rb'
+ - 'app/models/users/in_product_marketing_email.rb'
+ - 'app/serializers/ci/daily_build_group_report_result_entity.rb'
+ - 'app/serializers/group_child_entity.rb'
+ - 'app/serializers/issuable_sidebar_basic_entity.rb'
+ - 'app/serializers/merge_request_sidebar_basic_entity.rb'
+ - 'app/services/issues/referenced_merge_requests_service.rb'
+ - 'config/initializers/deprecations.rb'
+ - 'config/initializers/rspec_profiling.rb'
+ - 'config/routes/dashboard.rb'
+ - 'config/routes/group.rb'
+ - 'config/routes/issues.rb'
+ - 'db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb'
+ - 'db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb'
+ - 'db/post_migrate/20210823132600_remove_duplicate_dast_site_tokens.rb'
+ - 'db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb'
+ - 'ee/app/models/analytics/devops_adoption/snapshot.rb'
+ - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb'
+ - 'ee/app/models/approval_merge_request_rule.rb'
+ - 'ee/app/models/boards/epic_board_position.rb'
+ - 'ee/app/models/boards/epic_user_preference.rb'
+ - 'ee/app/models/ci/minutes/project_monthly_usage.rb'
+ - 'ee/app/models/concerns/ee/protected_ref.rb'
+ - 'ee/app/models/concerns/geo/replicable_model.rb'
+ - 'ee/app/models/concerns/issue_widgets/acts_like_requirement.rb'
+ - 'ee/app/models/dast/profile.rb'
+ - 'ee/app/models/dast_site_validation.rb'
+ - 'ee/app/models/dora/daily_metrics.rb'
+ - 'ee/app/models/ee/ci/build.rb'
+ - 'ee/app/models/ee/ci/daily_build_group_report_result.rb'
+ - 'ee/app/models/ee/ci/job_artifact.rb'
+ - 'ee/app/models/ee/ci/pipeline.rb'
+ - 'ee/app/models/ee/environment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/group_member.rb'
+ - 'ee/app/models/ee/identity.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/label.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/namespace_ci_cd_setting.rb'
+ - 'ee/app/models/ee/note.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/incident_management/oncall_shift.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/merge_request_block.rb'
+ - 'ee/app/models/merge_requests/external_status_check.rb'
+ - 'ee/app/models/merge_train.rb'
+ - 'ee/app/models/protected_environment.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/security/finding.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/security/orchestration_policy_rule_schedule.rb'
+ - 'ee/app/models/security/scan.rb'
+ - 'ee/app/models/security/training_provider.rb'
+ - 'ee/app/models/software_license_policy.rb'
+ - 'ee/app/models/vulnerabilities/feedback.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/models/vulnerabilities/historical_statistic.rb'
+ - 'ee/app/models/vulnerabilities/read.rb'
+ - 'ee/app/models/vulnerabilities/scanner.rb'
+ - 'ee/app/serializers/ee/group_child_entity.rb'
+ - 'ee/lib/ee/api/entities/application_setting.rb'
+ - 'ee/lib/ee/api/entities/geo_node_status.rb'
+ - 'ee/lib/ee/api/entities/group.rb'
+ - 'ee/lib/ee/api/entities/group_push_rule.rb'
+ - 'ee/lib/ee/api/entities/project.rb'
+ - 'ee/lib/ee/api/entities/vulnerability_issue_link.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/adapter/active_record/importing.rb'
+ - 'ee/spec/migrations/backfill_delayed_group_deletion_spec.rb'
+ - 'ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/notes/create_service_spec.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/maintenance_mode_gitlab_ee_instance_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_ee_instance_shared_examples.rb'
+ - 'lib/api/ci/jobs.rb'
+ - 'lib/api/ci/pipelines.rb'
+ - 'lib/api/entities/group_detail.rb'
+ - 'lib/api/entities/issue.rb'
+ - 'lib/api/entities/label.rb'
+ - 'lib/api/entities/merge_request.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/entities/project_export_status.rb'
+ - 'lib/api/feature_flags_user_lists.rb'
+ - 'lib/container_registry/base_client.rb'
+ - 'lib/container_registry/client.rb'
+ - 'lib/csv_builder.rb'
+ - 'lib/event_filter.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_project_mirrors.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'lib/gitlab/ci/config/entry/includes.rb'
+ - 'lib/gitlab/ci/config/entry/trigger.rb'
+ - 'lib/gitlab/config/entry/validatable.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration.rb'
+ - 'lib/gitlab/database/background_migration_job.rb'
+ - 'lib/gitlab/database/postgres_foreign_key.rb'
+ - 'lib/gitlab/database/postgres_index.rb'
+ - 'lib/gitlab/database/postgres_partition.rb'
+ - 'lib/gitlab/database/postgres_partitioned_table.rb'
+ - 'lib/gitlab/gl_repository.rb'
+ - 'lib/gitlab/import_export/import_failure_service.rb'
+ - 'lib/gitlab/merge_requests/commit_message_generator.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/gitlab/sidekiq_config/worker_matcher.rb'
+ - 'lib/gitlab/sidekiq_signals.rb'
+ - 'lib/gitlab/utils/measuring.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'qa/qa/fixtures/auto_devops_rack/config.ru'
+ - 'rubocop/cop/rspec/modify_sidekiq_middleware.rb'
+ - 'rubocop/cop/rspec/timecop_freeze.rb'
+ - 'rubocop/cop/rspec/timecop_travel.rb'
+ - 'spec/controllers/concerns/routable_actions_spec.rb'
+ - 'spec/deprecation_toolkit_env.rb'
+ - 'spec/factories/design_management/designs.rb'
+ - 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb'
+ - 'spec/graphql/resolvers/concerns/resolves_groups_spec.rb'
+ - 'spec/lib/gitlab/cross_project_access/class_methods_spec.rb'
+ - 'spec/lib/gitlab/database/consistency_spec.rb'
+ - 'spec/lib/gitlab/database/dynamic_model_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb'
+ - 'spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb'
+ - 'spec/lib/gitlab/import_export/members_mapper_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb'
+ - 'spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb'
+ - 'spec/migrations/20210804150320_create_base_work_item_types_spec.rb'
+ - 'spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb'
+ - 'spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb'
+ - 'spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb'
+ - 'spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb'
+ - 'spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb'
+ - 'spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb'
+ - 'spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb'
+ - 'spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb'
+ - 'spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb'
+ - 'spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb'
+ - 'spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb'
+ - 'spec/migrations/20211126115449_encrypt_static_objects_external_storage_auth_token_spec.rb'
+ - 'spec/migrations/20211203091642_add_index_to_projects_on_marked_for_deletion_at_spec.rb'
+ - 'spec/migrations/20220120094340_drop_position_from_security_findings_spec.rb'
+ - 'spec/migrations/20220128155814_fix_approval_rules_code_owners_rule_type_index_spec.rb'
+ - 'spec/migrations/20220305223212_add_security_training_providers_spec.rb'
+ - 'spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb'
+ - 'spec/migrations/generate_customers_dot_jwt_signing_key_spec.rb'
+ - 'spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb'
+ - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb'
+ - 'spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb'
+ - 'spec/models/ability_spec.rb'
+ - 'spec/models/broadcast_message_spec.rb'
+ - 'spec/models/concerns/participable_spec.rb'
+ - 'spec/services/groups/autocomplete_service_spec.rb'
+ - 'spec/services/notes/create_service_spec.rb'
+ - 'spec/services/projects/autocomplete_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/support/helpers/email_helpers.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb'
+ - 'spec/workers/process_commit_worker_spec.rb'
diff --git a/.rubocop_todo/style/missing_respond_to_missing.yml b/.rubocop_todo/style/missing_respond_to_missing.yml
new file mode 100644
index 00000000000..4d602586342
--- /dev/null
+++ b/.rubocop_todo/style/missing_respond_to_missing.yml
@@ -0,0 +1,27 @@
+---
+Style/MissingRespondToMissing:
+ # Offense count: 21
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/projects/application_controller.rb'
+ - 'app/models/network/commit.rb'
+ - 'app/services/notification_service.rb'
+ - 'ee/app/controllers/ee/groups/application_controller.rb'
+ - 'ee/app/models/elastic/migration_record.rb'
+ - 'ee/app/services/ee/audit_event_service.rb'
+ - 'lib/declarative_enum.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/fake_application_settings.rb'
+ - 'lib/gitlab/gitaly_client/storage_settings.rb'
+ - 'lib/gitlab/graphql/batch_key.rb'
+ - 'lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/metrics/null_metric.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/uploaded_file.rb'
+ - 'qa/qa/runtime/release.rb'
+ - 'qa/qa/runtime/scenario.rb'
+ - 'spec/support/helpers/next_found_instance_of.rb'
diff --git a/.rubocop_todo/style/next.yml b/.rubocop_todo/style/next.yml
new file mode 100644
index 00000000000..e1f9b927db6
--- /dev/null
+++ b/.rubocop_todo/style/next.yml
@@ -0,0 +1,46 @@
+---
+# Cop supports --auto-correct.
+Style/Next:
+ # Offense count: 41
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/finders/projects/serverless/functions_finder.rb'
+ - 'app/models/preloaders/environments/deployment_preloader.rb'
+ - 'app/models/route.rb'
+ - 'app/services/authorized_project_update/find_records_due_for_refresh_service.rb'
+ - 'app/validators/nested_attributes_duplicates_validator.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/sidekiq_cluster.rb'
+ - 'ee/app/controllers/groups/analytics/cycle_analytics/value_streams_controller.rb'
+ - 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/fetch_purchase_eligible_namespaces_service.rb'
+ - 'ee/app/services/security/auto_fix_service.rb'
+ - 'ee/db/fixtures/development/20_vulnerabilities.rb'
+ - 'ee/lib/ee/audit/protected_branches_changes_auditor.rb'
+ - 'ee/lib/gitlab/elastic/search_results.rb'
+ - 'ee/lib/system_check/geo/authorized_keys_check.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/external_link_filter.rb'
+ - 'lib/banzai/filter/footnote_filter.rb'
+ - 'lib/banzai/filter/kroki_filter.rb'
+ - 'lib/banzai/filter/math_filter.rb'
+ - 'lib/banzai/filter/plantuml_filter.rb'
+ - 'lib/banzai/filter/table_of_contents_filter.rb'
+ - 'lib/gitlab/background_migration/encrypt_static_object_token.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/import_export/attributes_permitter.rb'
+ - 'lib/gitlab/import_export/base/relation_object_saver.rb'
+ - 'lib/gitlab/metrics/samplers/base_sampler.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/tree_summary.rb'
+ - 'lib/tasks/gitlab/assets.rake'
+ - 'lib/tasks/gitlab/db/validate_config.rake'
+ - 'rubocop/cop/static_translation_definition.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'spec/lib/gitlab/import_export/import_test_coverage_spec.rb'
+ - 'spec/presenters/packages/npm/package_presenter_spec.rb'
diff --git a/.rubocop_todo/style/numeric_literal_prefix.yml b/.rubocop_todo/style/numeric_literal_prefix.yml
new file mode 100644
index 00000000000..b469a68ff5a
--- /dev/null
+++ b/.rubocop_todo/style/numeric_literal_prefix.yml
@@ -0,0 +1,79 @@
+---
+# Cop supports --auto-correct.
+Style/NumericLiteralPrefix:
+ # Offense count: 148
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/container_repository.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'db/post_migrate/20220131000001_schedule_trace_expiry_removal.rb'
+ - 'ee/lib/gitlab/geo/replication/base_transfer.rb'
+ - 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
+ - 'ee/spec/lib/bulk_imports/groups/pipelines/iterations_pipeline_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb'
+ - 'ee/spec/migrations/schedule_trace_expiry_removal_spec.rb'
+ - 'ee/spec/models/analytics/devops_adoption/snapshot_spec.rb'
+ - 'ee/spec/models/ci/minutes/quota_spec.rb'
+ - 'ee/spec/models/ee/group_spec.rb'
+ - 'ee/spec/models/gitlab/seat_link_data_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb'
+ - 'ee/spec/workers/sync_seat_link_worker_spec.rb'
+ - 'lib/backup/database.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/gitlab/background_migration/remove_all_trace_expiration_dates.rb'
+ - 'lib/gitlab/import_export/command_line_util.rb'
+ - 'lib/gitlab/jwt_authenticatable.rb'
+ - 'lib/system_check/app/uploads_path_permission_check.rb'
+ - 'lib/system_check/app/uploads_path_tmp_permission_check.rb'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'metrics_server/metrics_server.rb'
+ - 'qa/qa/support/ssh.rb'
+ - 'qa/spec/support/ssh_spec.rb'
+ - 'scripts/security-harness'
+ - 'spec/lib/gitlab/background_migration/remove_all_trace_expiration_dates_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/git/diff_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blobs_stitcher_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/conflict_files_stitcher_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/diff_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/diff_stitcher_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/issue_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/issues_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/note_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/releases_importer_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/diff_note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/issue_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/note_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb'
+ - 'spec/lib/gitlab/github_import/representation/pull_request_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/cloudflare_logger_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/queue_duration_logger_spec.rb'
+ - 'spec/lib/gitlab/import_export/command_line_util_spec.rb'
+ - 'spec/lib/gitlab/import_export/file_importer_spec.rb'
+ - 'spec/lib/gitlab/jwt_authenticatable_spec.rb'
+ - 'spec/lib/gitlab/puma_logging/json_formatter_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/range_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/support/helpers/repo_helpers.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/import_export/export_file_helper.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/packages/debian/generate_distribution_shared_examples.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
diff --git a/.rubocop_todo/style/percent_literal_delimiters.yml b/.rubocop_todo/style/percent_literal_delimiters.yml
new file mode 100644
index 00000000000..bf50c4c1922
--- /dev/null
+++ b/.rubocop_todo/style/percent_literal_delimiters.yml
@@ -0,0 +1,1231 @@
+---
+# Cop supports --auto-correct.
+Style/PercentLiteralDelimiters:
+ # Offense count: 3136
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'Guardfile'
+ - 'app/controllers/abuse_reports_controller.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/application_controller.rb'
+ - 'app/controllers/concerns/impersonation.rb'
+ - 'app/controllers/concerns/oauth_applications.rb'
+ - 'app/controllers/concerns/uploads_actions.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/import/bulk_imports_controller.rb'
+ - 'app/controllers/import/fogbugz_controller.rb'
+ - 'app/controllers/import/gitea_controller.rb'
+ - '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'
+ - 'app/controllers/repositories/lfs_locks_api_controller.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/members_finder.rb'
+ - 'app/finders/notes_finder.rb'
+ - 'app/finders/todos_finder.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/auth_helper.rb'
+ - 'app/helpers/ci/variables_helper.rb'
+ - 'app/helpers/clusters_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/external_link_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/labels_helper.rb'
+ - 'app/helpers/markup_helper.rb'
+ - 'app/helpers/nav_helper.rb'
+ - 'app/helpers/profiles_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/stat_anchors_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/blob_viewer/binary_stl.rb'
+ - 'app/models/blob_viewer/cargo_toml.rb'
+ - 'app/models/blob_viewer/cartfile.rb'
+ - 'app/models/blob_viewer/changelog.rb'
+ - 'app/models/blob_viewer/composer_json.rb'
+ - 'app/models/blob_viewer/contributing.rb'
+ - 'app/models/blob_viewer/csv.rb'
+ - 'app/models/blob_viewer/gemfile.rb'
+ - 'app/models/blob_viewer/gemspec.rb'
+ - 'app/models/blob_viewer/gitlab_ci_yml.rb'
+ - 'app/models/blob_viewer/go_mod.rb'
+ - 'app/models/blob_viewer/godeps_json.rb'
+ - 'app/models/blob_viewer/license.rb'
+ - 'app/models/blob_viewer/markup.rb'
+ - 'app/models/blob_viewer/metrics_dashboard_yml.rb'
+ - 'app/models/blob_viewer/notebook.rb'
+ - 'app/models/blob_viewer/open_api.rb'
+ - 'app/models/blob_viewer/package_json.rb'
+ - 'app/models/blob_viewer/pdf.rb'
+ - 'app/models/blob_viewer/podfile.rb'
+ - 'app/models/blob_viewer/podspec.rb'
+ - 'app/models/blob_viewer/podspec_json.rb'
+ - 'app/models/blob_viewer/readme.rb'
+ - 'app/models/blob_viewer/requirements_txt.rb'
+ - 'app/models/blob_viewer/route_map.rb'
+ - 'app/models/blob_viewer/sketch.rb'
+ - 'app/models/blob_viewer/svg.rb'
+ - 'app/models/blob_viewer/yarn_lock.rb'
+ - 'app/models/bulk_imports/file_transfer/group_config.rb'
+ - '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'
+ - 'app/models/commit.rb'
+ - 'app/models/concerns/clusters/agents/authorization_config_scopes.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/concerns/enums/prometheus_metric.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/issue_available_features.rb'
+ - 'app/models/concerns/mentionable/reference_regexes.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/resolvable_note.rb'
+ - 'app/models/concerns/with_uploads.rb'
+ - 'app/models/container_registry/event.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/description_version.rb'
+ - 'app/models/design_management.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/discussion_note.rb'
+ - 'app/models/draft_note.rb'
+ - 'app/models/event.rb'
+ - 'app/models/instance_configuration.rb'
+ - 'app/models/integrations/asana.rb'
+ - 'app/models/integrations/assembla.rb'
+ - 'app/models/integrations/base_ci.rb'
+ - 'app/models/integrations/base_issue_tracker.rb'
+ - 'app/models/integrations/base_monitoring.rb'
+ - 'app/models/integrations/base_slash_commands.rb'
+ - 'app/models/integrations/base_third_party_wiki.rb'
+ - 'app/models/integrations/buildkite.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/drone_ci.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/external_wiki.rb'
+ - 'app/models/integrations/field.rb'
+ - 'app/models/integrations/flowdock.rb'
+ - 'app/models/integrations/irker.rb'
+ - 'app/models/integrations/jenkins.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/packagist.rb'
+ - 'app/models/integrations/pivotaltracker.rb'
+ - 'app/models/integrations/pushover.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/integrations/zentao.rb'
+ - 'app/models/issuable_severity.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/lfs_download_object.rb'
+ - 'app/models/namespace/root_storage_statistics.rb'
+ - 'app/models/note.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_setting.rb'
+ - 'app/models/releases/link.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/resource_label_event.rb'
+ - 'app/models/resource_state_event.rb'
+ - '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'
+ - 'app/serializers/pipeline_serializer.rb'
+ - 'app/services/application_settings/update_service.rb'
+ - 'app/services/auth/container_registry_authentication_service.rb'
+ - 'app/services/boards/update_service.rb'
+ - 'app/services/bulk_imports/file_download_service.rb'
+ - 'app/services/ci/update_instance_variables_service.rb'
+ - 'app/services/clusters/kubernetes/create_or_update_service_account_service.rb'
+ - 'app/services/feature_flags/base_service.rb'
+ - 'app/services/files/multi_service.rb'
+ - 'app/services/import/bitbucket_server_service.rb'
+ - 'app/services/import/github_service.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb'
+ - 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file_s3.rb'
+ - 'app/services/import_export_clean_up_service.rb'
+ - 'app/services/incident_management/pager_duty/process_webhook_service.rb'
+ - 'app/services/issuable/bulk_update_service.rb'
+ - 'app/services/issues/export_csv_service.rb'
+ - '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'
+ - 'app/services/projects/download_service.rb'
+ - 'app/services/projects/hashed_storage/migrate_attachments_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_object_download_list_service.rb'
+ - 'app/services/projects/update_service.rb'
+ - 'app/services/prometheus/proxy_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/repositories/destroy_rollback_service.rb'
+ - 'app/services/repositories/destroy_service.rb'
+ - 'app/services/repository_archive_clean_up_service.rb'
+ - 'app/services/resource_access_tokens/create_service.rb'
+ - 'app/services/resource_access_tokens/revoke_service.rb'
+ - 'app/services/search/global_service.rb'
+ - 'app/services/search/project_service.rb'
+ - 'app/services/snippets/update_service.rb'
+ - 'app/services/todos/destroy/entity_leave_service.rb'
+ - 'app/uploaders/design_management/design_v432x230_uploader.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/gitlab/zoom_url_validator.rb'
+ - 'app/validators/json_schema_validator.rb'
+ - 'app/workers/irker_worker.rb'
+ - 'app/workers/members_destroyer/unassign_issuables_worker.rb'
+ - 'app/workers/projects/record_target_platforms_worker.rb'
+ - 'config/application.rb'
+ - 'config/boot.rb'
+ - 'config/environments/production.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/content_security_policy.rb'
+ - 'config/initializers/countries.rb'
+ - 'config/initializers/doorkeeper.rb'
+ - 'config/initializers/fog_core_patch.rb'
+ - 'config/initializers/forbid_sidekiq_in_transactions.rb'
+ - 'config/initializers/health_check.rb'
+ - 'config/initializers/invisible_captcha.rb'
+ - 'config/initializers/lograge.rb'
+ - 'config/initializers/rspec_profiling.rb'
+ - 'config/initializers/sidekiq.rb'
+ - 'config/initializers_before_autoloader/000_inflections.rb'
+ - 'config/object_store_settings.rb'
+ - 'config/spring.rb'
+ - 'db/migrate/20210317210338_add_valid_runner_registrars.rb'
+ - 'db/migrate/20210420120734_initialize_conversion_of_ci_job_artifacts_to_bigint.rb'
+ - 'db/migrate/20210426094524_initialize_conversion_of_ci_builds_to_bigint.rb'
+ - 'db/migrate/20210427045604_initialize_conversion_of_ci_build_trace_chunks_to_bigint.rb'
+ - 'db/migrate/20210427084924_initialize_conversion_of_ci_builds_runner_session_to_bigint.rb'
+ - 'db/migrate/20210427094931_add_execution_order_index_to_batched_background_migration_jobs.rb'
+ - 'db/migrate/20210520133032_initialize_conversion_of_taggings_to_bigint.rb'
+ - 'db/migrate/20210520133440_backfill_taggings_for_bigint_conversion.rb'
+ - 'db/migrate/20210525085158_initialize_conversion_of_deployments_to_bigint.rb'
+ - 'db/migrate/20210525085325_backfill_deployments_for_bigint_conversion.rb'
+ - 'db/migrate/20210525100539_initialize_conversion_of_geo_job_artifact_deleted_events_to_bigint.rb'
+ - 'db/migrate/20210525100603_backfill_geo_job_artifact_deleted_events_for_bigint_conversion.rb'
+ - 'db/migrate/20210608072312_initialize_conversion_of_ci_stages_to_bigint.rb'
+ - 'db/migrate/20210608072346_backfill_ci_stages_for_bigint_conversion.rb'
+ - 'db/migrate/20210621044000_rename_services_indexes_to_integrations.rb'
+ - 'db/migrate/20210709085759_index_batched_migration_jobs_by_max_value.rb'
+ - 'db/migrate/20210928155022_improve_index_for_error_tracking.rb'
+ - 'db/optional_migrations/composite_primary_keys.rb'
+ - 'db/post_migrate/20210329102724_add_new_trail_plans.rb'
+ - 'db/post_migrate/20210420121149_backfill_conversion_of_ci_job_artifacts.rb'
+ - 'db/post_migrate/20210426094549_backfill_ci_builds_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210427045711_backfill_ci_build_trace_chunks_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210427085020_backfill_ci_builds_runner_session_for_bigint_conversion.rb'
+ - 'db/post_migrate/20210520012430_backfill_pk_conversion_for_self_managed.rb'
+ - 'db/post_migrate/20210823142036_drop_temporary_trigger_for_ci_job_artifacts.rb'
+ - 'db/post_migrate/20210826171758_initialize_throttle_unauthenticated_api_columns.rb'
+ - 'db/post_migrate/20210906130643_drop_temporary_columns_and_triggers_for_taggings.rb'
+ - 'db/post_migrate/20211028100843_delete_issue_merge_request_taggings_records.rb'
+ - 'ee/app/controllers/ee/admin/application_settings_controller.rb'
+ - 'ee/app/controllers/ee/projects/service_desk_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_client_controller.rb'
+ - 'ee/app/controllers/projects/protected_environments_controller.rb'
+ - 'ee/app/controllers/trials_controller.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_date_input_type.rb'
+ - 'ee/app/helpers/credentials_inventory_helper.rb'
+ - 'ee/app/helpers/ee/auth_helper.rb'
+ - 'ee/app/helpers/ee/dashboard_helper.rb'
+ - 'ee/app/helpers/ee/issues_helper.rb'
+ - 'ee/app/helpers/ee/labels_helper.rb'
+ - 'ee/app/helpers/ee/nav_helper.rb'
+ - 'ee/app/helpers/ee/trial_helper.rb'
+ - 'ee/app/mailers/previews/ci_minutes_usage_mailer_preview.rb'
+ - 'ee/app/mailers/previews/emails/namespace_storage_usage_mailer_preview.rb'
+ - 'ee/app/mailers/previews/license_mailer_preview.rb'
+ - 'ee/app/models/app_sec/fuzzing/api/scan_profile.rb'
+ - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb'
+ - 'ee/app/models/concerns/approvable.rb'
+ - 'ee/app/models/concerns/ee/issue_available_features.rb'
+ - 'ee/app/models/ee/audit_event.rb'
+ - 'ee/app/models/ee/description_version.rb'
+ - 'ee/app/models/ee/groups/feature_setting.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/project_feature.rb'
+ - 'ee/app/models/ee/resource_label_event.rb'
+ - 'ee/app/models/ee/resource_state_event.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo/secondary_usage_data.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/integrations/github.rb'
+ - 'ee/app/models/integrations/gitlab_slack_application.rb'
+ - 'ee/app/models/merge_requests/status_check_response.rb'
+ - 'ee/app/models/saml_provider.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/storage_shard.rb'
+ - 'ee/app/services/approval_rules/create_service.rb'
+ - 'ee/app/services/boards/epic_boards/update_service.rb'
+ - 'ee/app/services/ci/sync_reports_to_approval_rules_service.rb'
+ - 'ee/app/services/concerns/search/elasticsearchable.rb'
+ - 'ee/app/services/ee/boards/update_service.rb'
+ - 'ee/app/services/ee/search/group_service.rb'
+ - 'ee/app/services/ee/search/project_service.rb'
+ - 'ee/app/services/epics/tree_reorder_service.rb'
+ - 'ee/app/services/iterations/update_service.rb'
+ - 'ee/app/services/jira/jql_builder_service.rb'
+ - 'ee/app/services/requirements_management/export_csv_service.rb'
+ - 'ee/app/services/security/configuration/save_auto_fix_service.rb'
+ - 'ee/app/services/security/dependency_list_service.rb'
+ - 'ee/lib/api/managed_licenses.rb'
+ - 'ee/lib/api/status_checks.rb'
+ - 'ee/lib/api/visual_review_discussions.rb'
+ - 'ee/lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb'
+ - 'ee/lib/ee/api/helpers/members_helpers.rb'
+ - 'ee/lib/ee/api/helpers/projects_helpers.rb'
+ - 'ee/lib/ee/api/search.rb'
+ - 'ee/lib/ee/audit/group_changes_auditor.rb'
+ - 'ee/lib/ee/gitlab/alert_management/payload/generic.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/adapter.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/checks/push_rules/file_size_check.rb'
+ - 'ee/lib/ee/gitlab/ci/parsers/security/validators/schema_validator.rb'
+ - 'ee/lib/ee/gitlab/etag_caching/router/rails.rb'
+ - 'ee/lib/ee/gitlab/integrations/sti_type.rb'
+ - 'ee/lib/ee/gitlab/middleware/read_only/controller.rb'
+ - 'ee/lib/ee/gitlab/path_regex.rb'
+ - 'ee/lib/ee/gitlab/uploads/migration_helper.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/elastic/class_proxy_util.rb'
+ - 'ee/lib/elastic/latest/config.rb'
+ - 'ee/lib/elastic/latest/custom_language_analyzers.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/elastic/latest/project_instance_proxy.rb'
+ - 'ee/lib/elastic/latest/snippet_class_proxy.rb'
+ - 'ee/lib/gitlab/alert_management/payload/cilium.rb'
+ - 'ee/lib/gitlab/auth/group_saml/auth_hash.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/formatters/dast.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
+ - 'ee/lib/tasks/gitlab/elastic/test.rake'
+ - 'ee/spec/config/metrics/every_metric_definition_spec.rb'
+ - 'ee/spec/controllers/ee/sessions_controller_spec.rb'
+ - 'ee/spec/controllers/groups/saml_providers_controller_spec.rb'
+ - 'ee/spec/controllers/groups/scim_oauth_controller_spec.rb'
+ - 'ee/spec/controllers/groups/sso_controller_spec.rb'
+ - 'ee/spec/controllers/projects/issues_controller_spec.rb'
+ - 'ee/spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'ee/spec/controllers/projects/security/configuration_controller_spec.rb'
+ - 'ee/spec/elastic_integration/global_search_spec.rb'
+ - 'ee/spec/factories/dast/profile_schedule_input_type.rb'
+ - 'ee/spec/factories/dast/profile_schedules.rb'
+ - 'ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb'
+ - 'ee/spec/features/admin/geo/admin_geo_nodes_spec.rb'
+ - 'ee/spec/features/groups/sso_spec.rb'
+ - 'ee/spec/features/profiles/account_spec.rb'
+ - 'ee/spec/features/projects/environments/environments_spec.rb'
+ - 'ee/spec/features/projects/integrations/user_activates_jira_spec.rb'
+ - 'ee/spec/features/projects/settings/protected_environments_spec.rb'
+ - 'ee/spec/features/protected_branches_spec.rb'
+ - 'ee/spec/features/users/login_spec.rb'
+ - 'ee/spec/finders/template_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/saml_providers.rb'
+ - 'ee/spec/graphql/ee/resolvers/board_lists_resolver_spec.rb'
+ - 'ee/spec/graphql/ee/types/boards/board_issue_input_type_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/update_spec.rb'
+ - 'ee/spec/graphql/resolvers/board_groupings/epics_resolvers_spec.rb'
+ - 'ee/spec/graphql/resolvers/epics_resolver_spec.rb'
+ - 'ee/spec/graphql/resolvers/pipeline_security_report_findings_resolver_spec.rb'
+ - 'ee/spec/graphql/types/dast/profile_cadence_enum_spec.rb'
+ - 'ee/spec/graphql/types/dast/scan_method_type_enum_spec.rb'
+ - 'ee/spec/graphql/types/incident_management/escalation_rule_input_type_spec.rb'
+ - 'ee/spec/graphql/types/scan_type_spec.rb'
+ - 'ee/spec/graphql/types/vulnerable_projects_by_grade_type_spec.rb'
+ - 'ee/spec/helpers/ee/application_settings_helper_spec.rb'
+ - 'ee/spec/helpers/ee/auth_helper_spec.rb'
+ - 'ee/spec/helpers/ee/geo_helper_spec.rb'
+ - 'ee/spec/helpers/ee/labels_helper_spec.rb'
+ - 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
+ - 'ee/spec/helpers/ee/welcome_helper_spec.rb'
+ - 'ee/spec/helpers/merge_requests_helper_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/epic_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/vulnerability_reference_filters_spec.rb'
+ - 'ee/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/access_levels_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/external_users_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/groups_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/elastic/helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/git_access_design_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/security/scan_configuration_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_spec.rb'
+ - 'ee/spec/lib/elastic/latest/custom_language_analyzers_spec.rb'
+ - 'ee/spec/lib/gitlab/alert_management/alert_payload_field_extractor_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/auth_hash_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/membership_updater_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/group_saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/adapter_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/authority_analyzer_spec.rb'
+ - 'ee/spec/lib/gitlab/cache_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/security/finding_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_iac_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/sast_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/secret_detection_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/expiring_subscription_message_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/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/mention_anonymization_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_client_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/storage/s3_multipart_upload_spec.rb'
+ - 'ee/spec/lib/gitlab/vulnerabilities/parser_spec.rb'
+ - 'ee/spec/mailers/ci_minutes_usage_mailer_spec.rb'
+ - 'ee/spec/mailers/credentials_inventory_mailer_spec.rb'
+ - 'ee/spec/mailers/ee/emails/profile_spec.rb'
+ - 'ee/spec/mailers/emails/namespace_storage_usage_mailer_spec.rb'
+ - 'ee/spec/mailers/license_mailer_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/ci/build_spec.rb'
+ - 'ee/spec/models/ci/pipeline_spec.rb'
+ - 'ee/spec/models/concerns/ee/issuable_spec.rb'
+ - 'ee/spec/models/concerns/ee/project_security_scanners_information_spec.rb'
+ - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
+ - 'ee/spec/models/ee/groups/feature_setting_spec.rb'
+ - 'ee/spec/models/ee/integration_spec.rb'
+ - 'ee/spec/models/ee/integrations/jira_spec.rb'
+ - 'ee/spec/models/ee/personal_access_token_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/instance_security_dashboard_spec.rb'
+ - 'ee/spec/models/issue_spec.rb'
+ - 'ee/spec/models/project_feature_spec.rb'
+ - 'ee/spec/models/protected_environment_spec.rb'
+ - 'ee/spec/models/push_rule_spec.rb'
+ - 'ee/spec/models/repository_spec.rb'
+ - 'ee/spec/models/saml_provider_spec.rb'
+ - 'ee/spec/models/security/orchestration_policy_configuration_spec.rb'
+ - 'ee/spec/models/security/scan_spec.rb'
+ - 'ee/spec/models/vulnerabilities/historical_statistic_spec.rb'
+ - 'ee/spec/models/vulnerabilities/stat_diff_spec.rb'
+ - 'ee/spec/models/vulnerabilities/statistic_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/policies/project_policy_spec.rb'
+ - 'ee/spec/presenters/merge_request_approver_presenter_spec.rb'
+ - 'ee/spec/presenters/merge_request_presenter_spec.rb'
+ - 'ee/spec/requests/admin/user_permission_exports_controller_spec.rb'
+ - 'ee/spec/requests/api/dependencies_spec.rb'
+ - 'ee/spec/requests/api/epics_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/alert_management/http_integration/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/http_integrations_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/markdown_golden_master_spec.rb'
+ - 'ee/spec/requests/api/merge_requests_spec.rb'
+ - 'ee/spec/requests/api/scim_spec.rb'
+ - 'ee/spec/requests/api/wikis_spec.rb'
+ - 'ee/spec/serializers/merge_request_widget_entity_spec.rb'
+ - 'ee/spec/services/admin/email_service_spec.rb'
+ - 'ee/spec/services/base_count_service_spec.rb'
+ - 'ee/spec/services/ci/compare_security_reports_service_spec.rb'
+ - 'ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb'
+ - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb'
+ - 'ee/spec/services/ee/members/create_service_spec.rb'
+ - 'ee/spec/services/ee/protected_branches/create_service_spec.rb'
+ - 'ee/spec/services/ee/users/update_service_spec.rb'
+ - 'ee/spec/services/elastic/data_migration_service_spec.rb'
+ - 'ee/spec/services/geo/cache_invalidation_event_store_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
+ - 'ee/spec/services/protected_environments/search_service_spec.rb'
+ - 'ee/spec/services/security/dependency_list_service_spec.rb'
+ - 'ee/spec/services/security/token_revocation_service_spec.rb'
+ - 'ee/spec/services/system_notes/vulnerabilities_service_spec.rb'
+ - 'ee/spec/support/helpers/ee/login_helpers.rb'
+ - 'ee/spec/support/license_scanning_reports/license_scanning_report_helper.rb'
+ - 'ee/spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'ee/spec/support/protected_tags/access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/file_registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/git_access_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/graphql/incident_management/escalation_policies_shared_examples.rb'
+ - 'ee/spec/validators/json_schema_validator_spec.rb'
+ - 'ee/spec/views/operations/index.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb'
+ - 'ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb'
+ - 'ee/spec/workers/ee/issuable_export_csv_worker_spec.rb'
+ - 'ee/spec/workers/project_cache_worker_spec.rb'
+ - 'ee/spec/workers/repository_import_worker_spec.rb'
+ - 'lib/api/ci/helpers/runner.rb'
+ - 'lib/api/commit_statuses.rb'
+ - 'lib/api/discussions.rb'
+ - 'lib/api/entities/note.rb'
+ - 'lib/api/helpers/common_helpers.rb'
+ - 'lib/api/helpers/notes_helpers.rb'
+ - 'lib/api/helpers/projects_helpers.rb'
+ - 'lib/api/helpers/search_helpers.rb'
+ - 'lib/api/maven_packages.rb'
+ - 'lib/api/repositories.rb'
+ - 'lib/api/search.rb'
+ - 'lib/api/users.rb'
+ - 'lib/backup/database.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/ascii_doc_sanitization_filter.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/base_sanitization_filter.rb'
+ - 'lib/banzai/filter/broadcast_message_sanitization_filter.rb'
+ - 'lib/banzai/filter/custom_emoji_filter.rb'
+ - 'lib/banzai/filter/emoji_filter.rb'
+ - 'lib/banzai/filter/gollum_tags_filter.rb'
+ - 'lib/banzai/filter/inline_diff_filter.rb'
+ - 'lib/banzai/filter/issuable_reference_expansion_filter.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/banzai/filter/repository_link_filter.rb'
+ - 'lib/banzai/filter/sanitization_filter.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/banzai/filter/syntax_highlight_filter.rb'
+ - 'lib/banzai/filter/table_of_contents_filter.rb'
+ - 'lib/banzai/pipeline/base_pipeline.rb'
+ - 'lib/banzai/pipeline/description_pipeline.rb'
+ - 'lib/bitbucket/page.rb'
+ - 'lib/bitbucket/representation/issue.rb'
+ - 'lib/container_registry/path.rb'
+ - 'lib/feature.rb'
+ - 'lib/flowdock/git/builder.rb'
+ - 'lib/generators/gitlab/usage_metric_definition_generator.rb'
+ - 'lib/generators/gitlab/usage_metric_generator.rb'
+ - 'lib/gitlab.rb'
+ - 'lib/gitlab/alert_management/payload/managed_prometheus.rb'
+ - 'lib/gitlab/alert_management/payload/prometheus.rb'
+ - 'lib/gitlab/asciidoc/syntax_highlighter/html_pipeline_adapter.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/ldap/config.rb'
+ - 'lib/gitlab/bare_repository_import/importer.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/config/entry/bridge.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/ci/reports/test_reports_comparer.rb'
+ - 'lib/gitlab/cleanup/orphan_job_artifact_files.rb'
+ - 'lib/gitlab/cluster/rack_timeout_observer.rb'
+ - 'lib/gitlab/content_security_policy/config_loader.rb'
+ - 'lib/gitlab/database/load_balancing/connection_proxy.rb'
+ - 'lib/gitlab/database/migration_helpers/cascading_namespace_settings.rb'
+ - 'lib/gitlab/database/reindexing.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/diff/char_diff.rb'
+ - 'lib/gitlab/diff/inline_diff_marker.rb'
+ - 'lib/gitlab/diff/line.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/etag_caching/router/graphql.rb'
+ - 'lib/gitlab/etag_caching/router/rails.rb'
+ - 'lib/gitlab/fips.rb'
+ - 'lib/gitlab/git/blob.rb'
+ - 'lib/gitlab/git/diff.rb'
+ - 'lib/gitlab/git/rugged_impl/repository.rb'
+ - 'lib/gitlab/git/tree.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/gitaly_client.rb'
+ - 'lib/gitlab/gitaly_client/diff.rb'
+ - 'lib/gitlab/gitaly_client/wiki_page.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/order_info.rb'
+ - 'lib/gitlab/graphql/query_analyzers/recursion_analyzer.rb'
+ - 'lib/gitlab/hotlinking_detector.rb'
+ - 'lib/gitlab/import_export/command_line_util.rb'
+ - 'lib/gitlab/import_export/file_importer.rb'
+ - 'lib/gitlab/import_export/repo_restorer.rb'
+ - 'lib/gitlab/jira_import/metadata_collector.rb'
+ - 'lib/gitlab/kas.rb'
+ - 'lib/gitlab/kroki.rb'
+ - 'lib/gitlab/kubernetes/helm/pod.rb'
+ - 'lib/gitlab/kubernetes/kubectl_cmd.rb'
+ - 'lib/gitlab/logger.rb'
+ - 'lib/gitlab/lograge/custom_options.rb'
+ - 'lib/gitlab/metrics/background_transaction.rb'
+ - 'lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/dashboard/stages/url_validator.rb'
+ - 'lib/gitlab/metrics/requests_rack_middleware.rb'
+ - 'lib/gitlab/metrics/subscribers/action_view.rb'
+ - 'lib/gitlab/metrics/subscribers/active_record.rb'
+ - 'lib/gitlab/metrics/transaction.rb'
+ - 'lib/gitlab/metrics/web_transaction.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/process_supervisor.rb'
+ - 'lib/gitlab/project_search_results.rb'
+ - 'lib/gitlab/prometheus/query_variables.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'lib/gitlab/sanitizers/exception_message.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/search/abuse_detection.rb'
+ - 'lib/gitlab/search_context.rb'
+ - 'lib/gitlab/sidekiq_daemon/memory_killer.rb'
+ - 'lib/gitlab/sidekiq_middleware/memory_killer.rb'
+ - 'lib/gitlab/slash_commands/presenters/base.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/uploads/migration_helper.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/database_metric.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/usage_data/topology.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'lib/gitlab/utils/sanitize_node_link.rb'
+ - 'lib/gitlab/workhorse.rb'
+ - 'lib/grafana/validator.rb'
+ - 'lib/omni_auth/strategies/jwt.rb'
+ - 'lib/release_highlights/validator/entry.rb'
+ - 'lib/security/ci_configuration/sast_build_action.rb'
+ - 'lib/sidebars/projects/menus/repository_menu.rb'
+ - 'lib/system_check/app/migrations_are_up_check.rb'
+ - 'lib/system_check/incoming_email/mail_room_running_check.rb'
+ - 'lib/system_check/sidekiq_check.rb'
+ - 'lib/tasks/cleanup.rake'
+ - 'lib/tasks/gettext.rake'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'lib/tasks/gitlab/shell.rake'
+ - 'lib/tasks/gitlab/update_templates.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'metrics_server/metrics_server.rb'
+ - 'qa/qa/ee/page/dashboard/projects.rb'
+ - 'qa/qa/ee/page/group/settings/general.rb'
+ - 'qa/qa/ee/page/project/issue/show.rb'
+ - 'qa/qa/ee/page/project/job/show.rb'
+ - 'qa/qa/ee/page/project/packages/index.rb'
+ - 'qa/qa/ee/page/project/pipeline/show.rb'
+ - 'qa/qa/ee/page/project/show.rb'
+ - 'qa/qa/ee/page/project/snippet/index.rb'
+ - 'qa/qa/ee/page/project/wiki/show.rb'
+ - 'qa/qa/git/repository.rb'
+ - 'qa/qa/resource/events/project.rb'
+ - 'qa/qa/resource/members.rb'
+ - 'qa/qa/resource/visibility.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/service/cluster_provider/gcloud.rb'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'qa/qa/specs/features/api/3_create/gitaly/praefect_repo_sync_spec.rb'
+ - 'qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_new_account_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/spec/git/repository_spec.rb'
+ - 'qa/spec/page/view_spec.rb'
+ - 'qa/spec/support/page_error_checker_spec.rb'
+ - 'rubocop/cop/rspec/httparty_basic_auth.rb'
+ - 'rubocop/migration_helpers.rb'
+ - 'scripts/qa/testcases-check'
+ - 'scripts/regenerate-schema'
+ - 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/57/files/67/package.gemspec'
+ - 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/6/files/5/package.gemspec'
+ - 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/7/files/7/package.gemspec'
+ - 'shared/packages/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b/packages/88/files/91/package.gemspec'
+ - 'sidekiq_cluster/cli.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/commands/sidekiq_cluster/cli_spec.rb'
+ - 'spec/config/mail_room_spec.rb'
+ - 'spec/controllers/admin/clusters_controller_spec.rb'
+ - 'spec/controllers/concerns/continue_params_spec.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/controllers/groups/clusters_controller_spec.rb'
+ - 'spec/controllers/groups/releases_controller_spec.rb'
+ - 'spec/controllers/jira_connect/app_descriptor_controller_spec.rb'
+ - 'spec/controllers/oauth/applications_controller_spec.rb'
+ - 'spec/controllers/profiles/two_factor_auths_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/clusters_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/environments/prometheus_api_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests/creations_controller_spec.rb'
+ - 'spec/controllers/projects/merge_requests_controller_spec.rb'
+ - 'spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb'
+ - 'spec/controllers/projects/pipelines_controller_spec.rb'
+ - 'spec/controllers/projects/settings/ci_cd_controller_spec.rb'
+ - 'spec/controllers/projects/static_site_editor_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/registrations/welcome_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/controllers/snippets_controller_spec.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/db/schema_spec.rb'
+ - 'spec/experiments/ios_specific_templates_experiment_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - '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'
+ - 'spec/features/expand_collapse_diffs_spec.rb'
+ - 'spec/features/issuables/issuable_list_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/issues/move_spec.rb'
+ - 'spec/features/issues/resource_label_events_spec.rb'
+ - 'spec/features/issues/user_bulk_edits_issues_labels_spec.rb'
+ - 'spec/features/issues/user_creates_issue_spec.rb'
+ - 'spec/features/markdown/markdown_spec.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/projects/active_tabs_spec.rb'
+ - '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'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/protected_branches_spec.rb'
+ - 'spec/features/tags/developer_views_tags_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/finders/alert_management/alerts_finder_spec.rb'
+ - 'spec/finders/branches_finder_spec.rb'
+ - 'spec/finders/ci/jobs_finder_spec.rb'
+ - 'spec/finders/ci/runners_finder_spec.rb'
+ - 'spec/finders/environments/environments_finder_spec.rb'
+ - 'spec/finders/groups_finder_spec.rb'
+ - 'spec/finders/issues_finder_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/finders/merge_requests_finder_spec.rb'
+ - 'spec/finders/tags_finder_spec.rb'
+ - 'spec/finders/template_finder_spec.rb'
+ - 'spec/graphql/mutations/alert_management/update_alert_status_spec.rb'
+ - 'spec/graphql/mutations/ci/runner/update_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/resolvers/board_lists_resolver_spec.rb'
+ - 'spec/graphql/resolvers/container_repository_tags_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb'
+ - 'spec/graphql/resolvers/projects_resolver_spec.rb'
+ - 'spec/graphql/types/boards/board_issue_input_type_spec.rb'
+ - 'spec/graphql/types/design_management/design_collection_copy_state_enum_spec.rb'
+ - 'spec/graphql/types/issue_type_spec.rb'
+ - 'spec/haml_lint/linter/no_plain_nodes_spec.rb'
+ - 'spec/helpers/appearances_helper_spec.rb'
+ - 'spec/helpers/application_settings_helper_spec.rb'
+ - 'spec/helpers/auth_helper_spec.rb'
+ - 'spec/helpers/breadcrumbs_helper_spec.rb'
+ - 'spec/helpers/ci/pipelines_helper_spec.rb'
+ - 'spec/helpers/clusters_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/emails_helper_spec.rb'
+ - 'spec/helpers/issues_helper_spec.rb'
+ - 'spec/helpers/nav_helper_spec.rb'
+ - 'spec/helpers/page_layout_helper_spec.rb'
+ - 'spec/helpers/profiles_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/tracking_helper_spec.rb'
+ - 'spec/initializers/direct_upload_support_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
+ - 'spec/lib/api/ci/helpers/runner_helpers_spec.rb'
+ - 'spec/lib/api/helpers/common_helpers_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/backup/files_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/banzai/filter/asset_proxy_filter_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/broadcast_message_sanitization_filter_spec.rb'
+ - 'spec/lib/banzai/filter/image_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/inline_metrics_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/design_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/feature_flag_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/snippet_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/banzai/filter_array_spec.rb'
+ - 'spec/lib/banzai/pipeline/description_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/full_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/gfm_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/base_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/bitbucket/collection_spec.rb'
+ - 'spec/lib/bitbucket/representation/repo_spec.rb'
+ - 'spec/lib/bulk_imports/common/pipelines/boards_pipeline_spec.rb'
+ - 'spec/lib/bulk_imports/common/transformers/prohibited_attributes_transformer_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
+ - 'spec/lib/gitlab/asset_proxy_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/config_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/batch_worker_context_spec.rb'
+ - 'spec/lib/gitlab/bitbucket_import/importer_spec.rb'
+ - 'spec/lib/gitlab/cache_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2html_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/bridge_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/commands_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/image_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/root_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/service_spec.rb'
+ - 'spec/lib/gitlab/ci/config/extendable/entry_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/base_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/secret_detection_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/expression/lexeme/equals_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/seed/build_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/accessibility_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/accessibility_reports_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/reports_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_spec.rb'
+ - 'spec/lib/gitlab/ci/status/composite_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/factory_spec.rb'
+ - '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/variables/collection/item_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor/dag_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/config/entry/factory_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/data_builder/build_spec.rb'
+ - 'spec/lib/gitlab/data_builder/pipeline_spec.rb'
+ - 'spec/lib/gitlab/data_builder/push_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_job_transition_log_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/cascading_namespace_settings_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/postgres_index_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing_spec.rb'
+ - 'spec/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base_spec.rb'
+ - 'spec/lib/gitlab/database/transaction/observer_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/base_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/cargo_toml_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/cartfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/composer_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/gemfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/gemspec_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/go_mod_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/go_sum_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/godeps_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/package_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/podfile_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/podspec_json_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/podspec_linker_spec.rb'
+ - 'spec/lib/gitlab/dependency_linker/requirements_txt_linker_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_spec.rb'
+ - 'spec/lib/gitlab/diff/inline_diff_marker_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/email/handler_spec.rb'
+ - 'spec/lib/gitlab/email/receiver_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/endpoint_attributes_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/external_authorization/client_spec.rb'
+ - 'spec/lib/gitlab/favicon_spec.rb'
+ - 'spec/lib/gitlab/feature_categories_spec.rb'
+ - 'spec/lib/gitlab/file_detector_spec.rb'
+ - 'spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb'
+ - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb'
+ - 'spec/lib/gitlab/git/merge_base_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/operation_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/ref_service_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/note_importer_spec.rb'
+ - 'spec/lib/gitlab/graphql/known_operations_spec.rb'
+ - 'spec/lib/gitlab/graphql/tracers/metrics_tracer_spec.rb'
+ - 'spec/lib/gitlab/hashed_path_spec.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/http_spec.rb'
+ - 'spec/lib/gitlab/i18n/translation_entry_spec.rb'
+ - 'spec/lib/gitlab/import_export/after_export_strategies/base_after_export_strategy_spec.rb'
+ - 'spec/lib/gitlab/import_export/after_export_strategies/web_upload_strategy_spec.rb'
+ - 'spec/lib/gitlab/import_export/attribute_cleaner_spec.rb'
+ - 'spec/lib/gitlab/import_export/attributes_permitter_spec.rb'
+ - 'spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/legacy_writer_spec.rb'
+ - 'spec/lib/gitlab/import_export/json/ndjson_writer_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_sources_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_cluster_validator_spec.rb'
+ - 'spec/lib/gitlab/issues/rebalancing/state_spec.rb'
+ - 'spec/lib/gitlab/jira_import/handle_labels_service_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/jira_import/labels_importer_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kubectl_cmd_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/network_policy_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/role_spec.rb'
+ - 'spec/lib/gitlab/language_data_spec.rb'
+ - 'spec/lib/gitlab/markup_helper_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/processor_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/validator/errors_spec.rb'
+ - 'spec/lib/gitlab/metrics/rails_slis_spec.rb'
+ - 'spec/lib/gitlab/metrics/samplers/threads_sampler_spec.rb'
+ - 'spec/lib/gitlab/middleware/go_spec.rb'
+ - 'spec/lib/gitlab/middleware/multipart_spec.rb'
+ - 'spec/lib/gitlab/omniauth_initializer_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_header_builder_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/popen_spec.rb'
+ - 'spec/lib/gitlab/process_management_spec.rb'
+ - 'spec/lib/gitlab/process_supervisor_spec.rb'
+ - 'spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/repository_cache_adapter_spec.rb'
+ - 'spec/lib/gitlab/repository_hash_cache_spec.rb'
+ - 'spec/lib/gitlab/repository_set_cache_spec.rb'
+ - 'spec/lib/gitlab/search/abuse_detection_spec.rb'
+ - 'spec/lib/gitlab/search_results_spec.rb'
+ - 'spec/lib/gitlab/security/scan_configuration_spec.rb'
+ - 'spec/lib/gitlab/shard_health_cache_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/cli_methods_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_config/worker_matcher_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/worker_context/client_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_status_spec.rb'
+ - 'spec/lib/gitlab/ssh_public_key_spec.rb'
+ - 'spec/lib/gitlab/string_range_marker_spec.rb'
+ - 'spec/lib/gitlab/string_regex_marker_spec.rb'
+ - 'spec/lib/gitlab/suggestions/suggestion_set_spec.rb'
+ - 'spec/lib/gitlab/tracking/event_definition_spec.rb'
+ - 'spec/lib/gitlab/url_sanitizer_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_definition_spec.rb'
+ - 'spec/lib/gitlab/usage/metric_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_spec.rb'
+ - 'spec/lib/gitlab/utils/log_limited_array_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/webpack/graphql_known_operations_spec.rb'
+ - 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
+ - 'spec/lib/object_storage/config_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/lib/rouge/formatters/html_gitlab_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/safe_zip/extract_params_spec.rb'
+ - 'spec/lib/safe_zip/extract_spec.rb'
+ - 'spec/lib/security/ci_configuration/container_scanning_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb'
+ - 'spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb'
+ - 'spec/lib/sidebars/menu_spec.rb'
+ - 'spec/lib/system_check/orphans/namespace_check_spec.rb'
+ - 'spec/lib/system_check/orphans/repository_check_spec.rb'
+ - 'spec/lib/system_check/sidekiq_check_spec.rb'
+ - 'spec/lib/tasks/gitlab/metrics_exporter_task_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/migrations/add_new_trail_plans_spec.rb'
+ - 'spec/migrations/change_web_hook_events_default_spec.rb'
+ - 'spec/migrations/reset_severity_levels_to_new_default_spec.rb'
+ - 'spec/models/alert_management/http_integration_spec.rb'
+ - 'spec/models/appearance_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/authentication_event_spec.rb'
+ - 'spec/models/blob_viewer/base_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/ci/job_artifact_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/runner_spec.rb'
+ - 'spec/models/clusters/agent_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/commit_range_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/commit_status_spec.rb'
+ - 'spec/models/compare_spec.rb'
+ - 'spec/models/concerns/awardable_spec.rb'
+ - 'spec/models/concerns/case_sensitivity_spec.rb'
+ - 'spec/models/concerns/featurable_spec.rb'
+ - 'spec/models/concerns/ignorable_columns_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/pg_full_text_searchable_spec.rb'
+ - 'spec/models/concerns/project_features_compatibility_spec.rb'
+ - 'spec/models/concerns/reactive_caching_spec.rb'
+ - 'spec/models/concerns/sortable_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/design_management/repository_spec.rb'
+ - 'spec/models/diff_viewer/base_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/group_label_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/instance_configuration_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/integrations/bamboo_spec.rb'
+ - 'spec/models/integrations/buildkite_spec.rb'
+ - 'spec/models/integrations/campfire_spec.rb'
+ - 'spec/models/integrations/irker_spec.rb'
+ - 'spec/models/integrations/jira_spec.rb'
+ - 'spec/models/integrations/teamcity_spec.rb'
+ - 'spec/models/issue_spec.rb'
+ - 'spec/models/members/member_task_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/namespace_statistics_spec.rb'
+ - 'spec/models/packages/package_spec.rb'
+ - 'spec/models/packages/tag_spec.rb'
+ - 'spec/models/pages_domain_spec.rb'
+ - 'spec/models/performance_monitoring/prometheus_dashboard_spec.rb'
+ - 'spec/models/personal_access_token_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - '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'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/terraform/state_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/web_ide_terminal_spec.rb'
+ - 'spec/models/zoom_meeting_spec.rb'
+ - 'spec/policies/group_policy_spec.rb'
+ - 'spec/policies/project_policy_spec.rb'
+ - 'spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb'
+ - 'spec/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/packages_metadata_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/search_results_presenter_spec.rb'
+ - 'spec/requests/api/badges_spec.rb'
+ - 'spec/requests/api/broadcast_messages_spec.rb'
+ - 'spec/requests/api/ci/jobs_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/ci/runner/runners_post_spec.rb'
+ - 'spec/requests/api/ci/triggers_spec.rb'
+ - 'spec/requests/api/container_repositories_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/graphql/gitlab_schema_spec.rb'
+ - 'spec/requests/api/graphql/group/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/group/milestones_spec.rb'
+ - 'spec/requests/api/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/create_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/destroy_spec.rb'
+ - 'spec/requests/api/graphql/project/base_service_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/versions_spec.rb'
+ - 'spec/requests/api/graphql/project/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_projects_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/project/releases_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/state_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/invitations_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/project_container_repositories_spec.rb'
+ - 'spec/requests/api/project_templates_spec.rb'
+ - 'spec/requests/api/projects_spec.rb'
+ - 'spec/requests/api/releases_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/requests/api/search_spec.rb'
+ - 'spec/requests/api/settings_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/requests/api/task_completion_status_spec.rb'
+ - 'spec/requests/api/unleash_spec.rb'
+ - 'spec/requests/api/users_spec.rb'
+ - 'spec/requests/api/version_spec.rb'
+ - 'spec/requests/api/wikis_spec.rb'
+ - 'spec/requests/ide_controller_spec.rb'
+ - 'spec/requests/jwt_controller_spec.rb'
+ - 'spec/requests/lfs_locks_api_spec.rb'
+ - 'spec/requests/users_controller_spec.rb'
+ - 'spec/routing/uploads_routing_spec.rb'
+ - 'spec/rubocop/cop/migration/prevent_index_creation_spec.rb'
+ - 'spec/rubocop/cop/migration/sidekiq_queue_migrate_spec.rb'
+ - 'spec/rubocop/cop/performance/readlines_each_spec.rb'
+ - 'spec/serializers/build_details_entity_spec.rb'
+ - 'spec/serializers/container_repositories_serializer_spec.rb'
+ - 'spec/serializers/diff_file_entity_spec.rb'
+ - 'spec/serializers/group_child_entity_spec.rb'
+ - 'spec/services/award_emojis/copy_service_spec.rb'
+ - 'spec/services/bulk_imports/file_download_service_spec.rb'
+ - 'spec/services/bulk_imports/lfs_objects_export_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/pre_post_stages_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb'
+ - 'spec/services/ci/register_job_service_spec.rb'
+ - 'spec/services/ci/retry_pipeline_service_spec.rb'
+ - 'spec/services/ci/runners/register_runner_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_pending_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_running_service_spec.rb'
+ - 'spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb'
+ - 'spec/services/clusters/applications/create_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/deployments/update_environment_service_spec.rb'
+ - 'spec/services/design_management/copy_design_collection/copy_service_spec.rb'
+ - 'spec/services/git/branch_push_service_spec.rb'
+ - 'spec/services/git/process_ref_changes_service_spec.rb'
+ - 'spec/services/groups/update_statistics_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/create_project_service_spec.rb'
+ - 'spec/services/issuable/process_assignees_spec.rb'
+ - 'spec/services/issues/export_csv_service_spec.rb'
+ - 'spec/services/jira/requests/projects/list_service_spec.rb'
+ - 'spec/services/lfs/file_transformer_spec.rb'
+ - 'spec/services/members/create_service_spec.rb'
+ - 'spec/services/members/invite_service_spec.rb'
+ - 'spec/services/merge_requests/conflicts/resolve_service_spec.rb'
+ - 'spec/services/merge_requests/merge_service_spec.rb'
+ - 'spec/services/merge_requests/pushed_branches_service_spec.rb'
+ - 'spec/services/merge_requests/refresh_service_spec.rb'
+ - 'spec/services/packages/create_dependency_service_spec.rb'
+ - 'spec/services/packages/nuget/create_dependency_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/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'
+ - 'spec/services/projects/lfs_pointers/lfs_link_service_spec.rb'
+ - 'spec/services/projects/operations/update_service_spec.rb'
+ - 'spec/services/projects/record_target_platforms_service_spec.rb'
+ - 'spec/services/projects/update_statistics_service_spec.rb'
+ - 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
+ - 'spec/services/quick_actions/interpret_service_spec.rb'
+ - 'spec/services/upload_service_spec.rb'
+ - 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
+ - 'spec/support/atlassian/jira_connect/schemata.rb'
+ - 'spec/support/banzai/reference_filter_shared_examples.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/helpers/gpg_helpers.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/helpers/prometheus_helpers.rb'
+ - 'spec/support/helpers/repo_helpers.rb'
+ - 'spec/support/helpers/seed_helper.rb'
+ - 'spec/support/helpers/seed_repo.rb'
+ - 'spec/support/helpers/test_env.rb'
+ - 'spec/support/helpers/usage_data_helpers.rb'
+ - 'spec/support/import_export/configuration_helper.rb'
+ - 'spec/support/import_export/export_file_helper.rb'
+ - 'spec/support/matchers/markdown_matchers.rb'
+ - 'spec/support/prometheus/additional_metrics_shared_examples.rb'
+ - 'spec/support/prometheus/metric_builders.rb'
+ - 'spec/support/shared_contexts/graphql/resolvers/runners_resolver_shared_context.rb'
+ - 'spec/support/shared_contexts/markdown_golden_master_shared_examples.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_examples/controllers/metrics_dashboard_shared_examples.rb'
+ - 'spec/support/shared_examples/controllers/wiki_actions_shared_examples.rb'
+ - 'spec/support/shared_examples/features/page_description_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/middleware/multipart_shared_examples.rb'
+ - 'spec/support/shared_examples/metrics/transaction_metrics_with_labels_shared_examples.rb'
+ - 'spec/support/shared_examples/models/application_setting_shared_examples.rb'
+ - 'spec/support/shared_examples/models/diff_positionable_note_shared_examples.rb'
+ - 'spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/path_extraction_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/commit/tag_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/quick_actions/issue/create_merge_request_quick_action_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb'
+ - 'spec/support/shared_examples/validators/url_validator_shared_examples.rb'
+ - 'spec/support_specs/graphql/arguments_spec.rb'
+ - 'spec/support_specs/helpers/active_record/query_recorder_spec.rb'
+ - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tasks/gitlab/db_rake_spec.rb'
+ - 'spec/tasks/gitlab/task_helpers_spec.rb'
+ - 'spec/tasks/gitlab/uploads/migrate_rake_spec.rb'
+ - 'spec/tooling/danger/datateam_spec.rb'
+ - 'spec/tooling/danger/sidekiq_queues_spec.rb'
+ - 'spec/tooling/lib/tooling/test_map_generator_spec.rb'
+ - 'spec/uploaders/attachment_uploader_spec.rb'
+ - 'spec/uploaders/avatar_uploader_spec.rb'
+ - 'spec/uploaders/ci/pipeline_artifact_uploader_spec.rb'
+ - 'spec/uploaders/dependency_proxy/file_uploader_spec.rb'
+ - 'spec/uploaders/design_management/design_v432x230_uploader_spec.rb'
+ - 'spec/uploaders/external_diff_uploader_spec.rb'
+ - 'spec/uploaders/import_export_uploader_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/uploaders/lfs_object_uploader_spec.rb'
+ - 'spec/uploaders/namespace_file_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/component_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/distribution_release_file_uploader_spec.rb'
+ - 'spec/uploaders/packages/package_file_uploader_spec.rb'
+ - 'spec/uploaders/pages/deployment_uploader_spec.rb'
+ - 'spec/uploaders/personal_file_uploader_spec.rb'
+ - 'spec/validators/any_field_validator_spec.rb'
+ - 'spec/views/layouts/_flash.html.haml_spec.rb'
+ - 'spec/views/layouts/_head.html.haml_spec.rb'
+ - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
+ - 'spec/views/projects/commit/branches.html.haml_spec.rb'
+ - 'spec/views/shared/runners/_runner_details.html.haml_spec.rb'
+ - 'spec/workers/concerns/worker_context_spec.rb'
+ - 'spec/workers/container_registry/migration/enqueuer_worker_spec.rb'
+ - 'spec/workers/gitlab/github_import/advance_stage_worker_spec.rb'
+ - 'spec/workers/groups/update_statistics_worker_spec.rb'
+ - 'spec/workers/jira_connect/sync_branch_worker_spec.rb'
+ - 'spec/workers/post_receive_spec.rb'
+ - 'spec/workers/project_cache_worker_spec.rb'
+ - 'spec/workers/projects/record_target_platforms_worker_spec.rb'
+ - 'spec/workers/repository_import_worker_spec.rb'
+ - 'spec/workers/stuck_merge_jobs_worker_spec.rb'
+ - 'spec/workers/update_project_statistics_worker_spec.rb'
+ - 'tooling/danger/datateam.rb'
diff --git a/.rubocop_todo/style/redundant_interpolation.yml b/.rubocop_todo/style/redundant_interpolation.yml
new file mode 100644
index 00000000000..fb190ff2100
--- /dev/null
+++ b/.rubocop_todo/style/redundant_interpolation.yml
@@ -0,0 +1,164 @@
+---
+# Cop supports --auto-correct.
+Style/RedundantInterpolation:
+ # Offense count: 285
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/components/diffs/stats_component.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/ci/runners_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/environments_helper.rb'
+ - 'app/helpers/icons_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/integrations/base_chat_notification.rb'
+ - 'app/models/integrations/hangouts_chat.rb'
+ - 'app/models/integrations/microsoft_teams.rb'
+ - 'app/models/integrations/pushover.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/services/jira_import/start_import_service.rb'
+ - 'app/services/users/approve_service.rb'
+ - 'app/services/users/banned_user_base_service.rb'
+ - 'app/services/users/reject_service.rb'
+ - 'ee/app/graphql/types/compliance_management/merge_requests/compliance_violation_reason_enum.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_length_unit_enum.rb'
+ - 'ee/app/helpers/ee/ci/runners_helper.rb'
+ - 'ee/app/helpers/ee/geo_helper.rb'
+ - 'ee/app/services/geo/event_store.rb'
+ - 'ee/app/services/geo/repository_updated_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/create_pipeline_service.rb'
+ - 'ee/db/fixtures/development/31_devops_adoption.rb'
+ - 'ee/spec/features/epics/epic_issues_spec.rb'
+ - 'ee/spec/features/projects/requirements_management/requirements_list_spec.rb'
+ - 'ee/spec/features/registrations/one_trust_spec.rb'
+ - 'ee/spec/graphql/ee/mutations/boards/lists/create_spec.rb'
+ - 'ee/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'ee/spec/mailers/ci_minutes_usage_mailer_spec.rb'
+ - 'ee/spec/mailers/emails/namespace_storage_usage_mailer_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/models/incident_management/issuable_escalation_status_spec.rb'
+ - 'ee/spec/requests/api/issues_spec.rb'
+ - 'ee/spec/requests/api/search_spec.rb'
+ - 'ee/spec/services/search_service_spec.rb'
+ - 'ee/spec/services/timebox_report_service_spec.rb'
+ - 'ee/spec/support/shared_examples/lib/gitlab/elastic/standalone_indices_shared_examples.rb'
+ - 'ee/spec/tasks/gitlab/elastic_rake_spec.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/backup/task.rb'
+ - 'lib/gitlab/application_rate_limiter.rb'
+ - 'lib/gitlab/chat/responder/mattermost.rb'
+ - 'lib/gitlab/ci/build/releaser.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/runner_instructions.rb'
+ - 'lib/gitlab/console.rb'
+ - 'lib/gitlab/metrics/web_transaction.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/strategies/record_loader_strategy.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/repository_cache.rb'
+ - 'lib/gitlab/repository_cache_adapter.rb'
+ - 'lib/gitlab/repository_hash_cache.rb'
+ - 'lib/gitlab/repository_set_cache.rb'
+ - 'lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints.rb'
+ - 'lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins.rb'
+ - 'lib/gitlab/usage_data_counters/hll_redis_counter.rb'
+ - 'lib/gitlab/usage_data_counters/search_counter.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/tasks/gettext.rake'
+ - 'qa/qa/ee/page/merge_request/new.rb'
+ - 'qa/qa/ee/page/project/issue/show.rb'
+ - 'qa/qa/resource/events/base.rb'
+ - 'qa/qa/service/praefect_manager.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/container_registry_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'scripts/changed-feature-flags'
+ - 'scripts/perf/gc/print_gc_stats.rb'
+ - 'scripts/qa/testcases-check'
+ - 'spec/controllers/admin/integrations_controller_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb'
+ - 'spec/features/merge_request/user_sees_deployment_widget_spec.rb'
+ - 'spec/features/one_trust_spec.rb'
+ - 'spec/features/projects/issues/viewing_issues_with_external_authorization_enabled_spec.rb'
+ - 'spec/features/projects/jobs/user_browses_jobs_spec.rb'
+ - 'spec/graphql/resolvers/container_repositories_resolver_spec.rb'
+ - 'spec/helpers/environments_helper_spec.rb'
+ - 'spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb'
+ - 'spec/lib/api/validations/validators/git_ref_spec.rb'
+ - 'spec/lib/api/validations/validators/limit_spec.rb'
+ - 'spec/lib/backup/database_backup_error_spec.rb'
+ - 'spec/lib/backup/file_backup_error_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/alert_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/feature_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_vulnerability_reads_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/job_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/processable_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/test_suite_spec.rb'
+ - 'spec/lib/gitlab/database/batch_count_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/url_spec.rb'
+ - 'spec/lib/grafana/client_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/migrations/20220107064845_populate_vulnerability_reads_spec.rb'
+ - 'spec/models/active_session_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/diff_discussion_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/presenters/project_presenter_spec.rb'
+ - 'spec/rack_servers/configs/config.ru'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/requests/api/markdown_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/metrics/dashboard/annotations_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/requests/api/terraform/state_spec.rb'
+ - 'spec/requests/projects/google_cloud/deployments_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud/service_accounts_controller_spec.rb'
+ - 'spec/requests/projects/google_cloud_controller_spec.rb'
+ - 'spec/routing/project_routing_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/members/invite_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/todos/destroy/entity_leave_service_spec.rb'
+ - 'spec/services/users/approve_service_spec.rb'
+ - 'spec/services/users/ban_service_spec.rb'
+ - 'spec/services/users/reject_service_spec.rb'
+ - 'spec/services/users/unban_service_spec.rb'
+ - 'spec/support/google_api/cloud_platform_helpers.rb'
+ - 'spec/support/helpers/features/releases_helpers.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/matchers/exceed_query_limit.rb'
+ - 'spec/support/shared_examples/graphql/notes_creation_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/sentry/client_shared_examples.rb'
+ - 'spec/support/shared_examples/mailers/notify_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/issues_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/notes_shared_examples.rb'
+ - 'spec/support/shared_examples/services/users/dismiss_user_callout_service_shared_examples.rb'
+ - 'spec/support_specs/graphql/arguments_spec.rb'
+ - 'spec/views/projects/commit/_commit_box.html.haml_spec.rb'
+ - 'tooling/rspec_flaky/flaky_example.rb'
diff --git a/.rubocop_todo/style/redundant_regexp_escape.yml b/.rubocop_todo/style/redundant_regexp_escape.yml
new file mode 100644
index 00000000000..1a88f62ab64
--- /dev/null
+++ b/.rubocop_todo/style/redundant_regexp_escape.yml
@@ -0,0 +1,114 @@
+---
+# Cop supports --auto-correct.
+Style/RedundantRegexpEscape:
+ # Offense count: 325
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/help_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/sidekiq_helper.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/referable.rb'
+ - 'app/models/deploy_token.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/integrations/chat_message/base_message.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/models/integrations/teamcity.rb'
+ - 'app/models/label.rb'
+ - 'app/models/license_template.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/operations/feature_flag.rb'
+ - 'app/models/releases/link.rb'
+ - 'app/models/snippet.rb'
+ - 'app/services/metrics/dashboard/grafana_metric_embed_service.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'config/routes/project.rb'
+ - 'config/routes/uploads.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/lib/ee/gitlab/path_regex.rb'
+ - 'ee/lib/elastic/latest/merge_request_class_proxy.rb'
+ - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
+ - 'ee/lib/gitlab/return_to_location.rb'
+ - 'ee/spec/features/read_only_spec.rb'
+ - 'ee/spec/helpers/seats_count_alert_helper_spec.rb'
+ - 'ee/spec/helpers/vulnerabilities_helper_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'ee/spec/mailers/notify_spec.rb'
+ - 'ee/spec/models/release_highlight_spec.rb'
+ - 'ee/spec/support/shared_examples/services/group_saml/saml_provider/base_service_shared_examples.rb'
+ - 'lib/api/templates.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/inline_diff_filter.rb'
+ - 'lib/bulk_imports/common/pipelines/uploads_pipeline.rb'
+ - 'lib/csv_builder.rb'
+ - 'lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/diff/suggestions_parser.rb'
+ - 'lib/gitlab/email/handler/create_issue_handler.rb'
+ - 'lib/gitlab/email/handler/create_merge_request_handler.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/email/receiver.rb'
+ - 'lib/gitlab/email/reply_parser.rb'
+ - 'lib/gitlab/git/diff.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/incoming_email.rb'
+ - 'lib/gitlab/jira/dvcs.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/private_commit_email.rb'
+ - 'lib/gitlab/push_options.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'lib/gitlab/search/abuse_detection.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/url_sanitizer.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/gitlab/utils/sanitize_node_link.rb'
+ - 'lib/gitlab/word_diff/segments/diff_hunk.rb'
+ - 'lib/product_analytics/tracker.rb'
+ - 'lib/tasks/gettext.rake'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/security_reports_spec.rb'
+ - 'qa/spec/runtime/key/ecdsa_spec.rb'
+ - 'qa/spec/runtime/key/ed25519_spec.rb'
+ - 'qa/spec/runtime/key/rsa_spec.rb'
+ - 'rubocop/cop/gitlab/finder_with_find_by.rb'
+ - 'scripts/qa/testcases-check'
+ - 'scripts/setup/find-jh-branch.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/features/read_only_spec.rb'
+ - 'spec/helpers/tab_helper_spec.rb'
+ - 'spec/lib/banzai/filter/references/reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/syntax_highlight_filter_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb'
+ - 'spec/lib/gitlab/ci/config_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/import_export/saver_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/sql/pattern_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb'
+ - 'spec/models/release_highlight_spec.rb'
+ - 'spec/requests/api/graphql/mutations/merge_requests/set_draft_spec.rb'
+ - 'spec/requests/api/graphql_spec.rb'
+ - 'spec/requests/api/project_debian_distributions_spec.rb'
+ - 'spec/requests/api/repositories_spec.rb'
+ - 'spec/services/projects/download_service_spec.rb'
+ - 'spec/support/matchers/exceed_query_limit.rb'
+ - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb'
+ - 'spec/support/shared_examples/mailers/notify_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb'
+ - '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
new file mode 100644
index 00000000000..e363f83761b
--- /dev/null
+++ b/.rubocop_todo/style/redundant_self.yml
@@ -0,0 +1,426 @@
+---
+# Cop supports --auto-correct.
+Style/RedundantSelf:
+ # Offense count: 1222
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/application_controller.rb'
+ - 'app/finders/security/jobs_finder.rb'
+ - 'app/models/abuse_report.rb'
+ - 'app/models/analytics/usage_trends/measurement.rb'
+ - 'app/models/application_record.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/audit_event.rb'
+ - 'app/models/award_emoji.rb'
+ - 'app/models/board.rb'
+ - 'app/models/ci/application_record.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_metadata.rb'
+ - 'app/models/ci/build_runner_session.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/deleted_object.rb'
+ - 'app/models/ci/group.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/job_token/project_scope_link.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pending_build.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/pipeline_artifact.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/ref.rb'
+ - 'app/models/ci/resource_group.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/running_build.rb'
+ - 'app/models/ci/stage.rb'
+ - 'app/models/ci/trigger.rb'
+ - 'app/models/ci_platform_metric.rb'
+ - 'app/models/clusters/applications/cert_manager.rb'
+ - 'app/models/clusters/applications/crossplane.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/clusters/concerns/application_core.rb'
+ - 'app/models/clusters/concerns/application_status.rb'
+ - 'app/models/clusters/platforms/kubernetes.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/compare.rb'
+ - 'app/models/concerns/after_commit_queue.rb'
+ - 'app/models/concerns/approvable_base.rb'
+ - 'app/models/concerns/atomic_internal_id.rb'
+ - 'app/models/concerns/avatarable.rb'
+ - 'app/models/concerns/awardable.rb'
+ - 'app/models/concerns/bulk_member_access_load.rb'
+ - 'app/models/concerns/bulk_users_by_email_load.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/ci/metadatable.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/concerns/deployment_platform.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/concerns/featurable.rb'
+ - 'app/models/concerns/has_user_type.rb'
+ - 'app/models/concerns/has_wiki.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/ignorable_columns.rb'
+ - 'app/models/concerns/integrations/base_data_fields.rb'
+ - 'app/models/concerns/integrations/has_data_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/issue_resource_event.rb'
+ - 'app/models/concerns/limitable.rb'
+ - 'app/models/concerns/mentionable.rb'
+ - 'app/models/concerns/merge_request_reviewer_state.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/pg_full_text_searchable.rb'
+ - 'app/models/concerns/protected_ref.rb'
+ - 'app/models/concerns/protected_ref_access.rb'
+ - 'app/models/concerns/reactive_caching.rb'
+ - 'app/models/concerns/redis_cacheable.rb'
+ - 'app/models/concerns/resolvable_discussion.rb'
+ - 'app/models/concerns/resolvable_note.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/concerns/sortable.rb'
+ - 'app/models/concerns/spammable.rb'
+ - 'app/models/concerns/timebox.rb'
+ - 'app/models/concerns/ttl_expirable.rb'
+ - 'app/models/concerns/valid_attribute.rb'
+ - 'app/models/container_expiration_policy.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/customer_relations/contact.rb'
+ - 'app/models/customer_relations/organization.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deploy_keys_project.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/diff_note.rb'
+ - 'app/models/discussion.rb'
+ - 'app/models/email.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_group_link.rb'
+ - 'app/models/identity.rb'
+ - 'app/models/integration.rb'
+ - 'app/models/integrations/base_chat_notification.rb'
+ - 'app/models/integrations/base_ci.rb'
+ - 'app/models/integrations/base_issue_tracker.rb'
+ - 'app/models/integrations/base_slash_commands.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/emails_on_push.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/integrations/pipelines_email.rb'
+ - 'app/models/integrations/zentao.rb'
+ - 'app/models/internal_id.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/issue/metrics.rb'
+ - 'app/models/issue_email_participant.rb'
+ - 'app/models/key.rb'
+ - 'app/models/label.rb'
+ - 'app/models/legacy_diff_note.rb'
+ - 'app/models/lfs_object.rb'
+ - 'app/models/lfs_objects_project.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/metrics.rb'
+ - 'app/models/merge_request_assignee.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_diff_commit.rb'
+ - 'app/models/merge_request_reviewer.rb'
+ - 'app/models/namespaces/traversal/linear.rb'
+ - 'app/models/note.rb'
+ - 'app/models/packages/dependency.rb'
+ - 'app/models/packages/sem_ver.rb'
+ - 'app/models/pages_domain.rb'
+ - 'app/models/performance_monitoring/prometheus_dashboard.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/plan.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_feature.rb'
+ - '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'
+ - 'app/models/protected_tag.rb'
+ - 'app/models/raw_usage_data.rb'
+ - 'app/models/release.rb'
+ - 'app/models/release_highlight.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/serverless/function.rb'
+ - 'app/models/service_desk_setting.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/terraform/state.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/u2f_registration.rb'
+ - 'app/models/upload.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_highest_role.rb'
+ - 'app/models/x509_certificate.rb'
+ - 'app/presenters/ci/build_runner_presenter.rb'
+ - 'app/presenters/ci/pipeline_artifacts/code_coverage_presenter.rb'
+ - 'app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb'
+ - 'app/presenters/projects/import_export/project_export_presenter.rb'
+ - 'app/services/access_token_validation_service.rb'
+ - 'app/services/clusters/kubernetes/create_or_update_service_account_service.rb'
+ - 'app/services/dependency_proxy/auth_token_service.rb'
+ - 'app/services/merge_requests/merge_service.rb'
+ - 'app/services/projects/container_repository/delete_tags_service.rb'
+ - 'app/services/projects/move_access_service.rb'
+ - 'app/services/snippets/base_service.rb'
+ - 'app/services/spam/spam_params.rb'
+ - 'app/uploaders/file_uploader.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'app/workers/background_migration/single_database_worker.rb'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'app/workers/concerns/limited_capacity/worker.rb'
+ - 'app/workers/concerns/project_start_import.rb'
+ - 'app/workers/concerns/waitable_worker.rb'
+ - 'app/workers/database/batched_background_migration/single_database_worker.rb'
+ - 'app/workers/group_import_worker.rb'
+ - 'app/workers/project_export_worker.rb'
+ - 'config/initializers/active_record_keyset_pagination.rb'
+ - 'config/initializers/forbid_sidekiq_in_transactions.rb'
+ - 'config/initializers/mail_encoding_patch.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'db/post_migrate/20210329102724_add_new_trail_plans.rb'
+ - 'db/post_migrate/20211029102822_add_open_source_plan.rb'
+ - 'ee/app/graphql/resolvers/geo/registries_resolver.rb'
+ - 'ee/app/models/approval_project_rule.rb'
+ - 'ee/app/models/concerns/approval_rule_like.rb'
+ - 'ee/app/models/concerns/custom_model_naming.rb'
+ - 'ee/app/models/concerns/ee/issuable_link.rb'
+ - 'ee/app/models/concerns/ee/participable.rb'
+ - 'ee/app/models/concerns/ee/protected_ref.rb'
+ - 'ee/app/models/concerns/ee/protected_ref_access.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/elastic/projects_search.rb'
+ - 'ee/app/models/concerns/elasticsearch_indexed_container.rb'
+ - 'ee/app/models/concerns/geo/replicable_model.rb'
+ - 'ee/app/models/concerns/geo/repository_replicator_strategy.rb'
+ - 'ee/app/models/concerns/geo/verifiable_model.rb'
+ - 'ee/app/models/concerns/geo/verifiable_registry.rb'
+ - 'ee/app/models/concerns/geo/verifiable_replicator.rb'
+ - 'ee/app/models/concerns/geo/verification_state.rb'
+ - 'ee/app/models/concerns/geo/verification_state_definition.rb'
+ - 'ee/app/models/ee/application_setting.rb'
+ - 'ee/app/models/ee/audit_event.rb'
+ - 'ee/app/models/ee/ci/bridge.rb'
+ - 'ee/app/models/ee/description_version.rb'
+ - 'ee/app/models/ee/environment.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group_member.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/models/ee/iteration.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/packages/package_file.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/project_feature.rb'
+ - 'ee/app/models/ee/project_import_state.rb'
+ - 'ee/app/models/ee/snippet_repository.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/epic/metrics.rb'
+ - 'ee/app/models/geo/base_registry.rb'
+ - 'ee/app/models/geo/design_registry.rb'
+ - 'ee/app/models/geo/project_registry.rb'
+ - 'ee/app/models/geo/upload_registry.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/gitlab_subscription.rb'
+ - 'ee/app/models/gitlab_subscriptions/upcoming_reconciliation.rb'
+ - 'ee/app/models/group_wiki_repository.rb'
+ - 'ee/app/models/iterations/cadence.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/merge_requests/external_status_check.rb'
+ - 'ee/app/models/push_rule.rb'
+ - 'ee/app/models/security/orchestration_policy_configuration.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/lib/api/dependencies.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/groups.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/proxy.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/users.rb'
+ - 'ee/lib/ee/gitlab/background_migration/fix_incorrect_max_seats_used.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/ee/gitlab/tracking.rb'
+ - 'ee/lib/ee/legacy_model.rb'
+ - 'ee/lib/ee/model.rb'
+ - 'ee/lib/elastic/instance_proxy_util.rb'
+ - 'ee/lib/elastic/latest/application_class_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_config.rb'
+ - 'ee/lib/elastic/latest/merge_request_config.rb'
+ - 'ee/lib/elastic/latest/note_config.rb'
+ - 'ee/lib/elastic/migration.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
+ - 'ee/lib/gitlab/alert_management/payload/cilium.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
+ - 'ee/lib/gitlab/auth/group_saml/response_check.rb'
+ - 'ee/lib/gitlab/auth/group_saml/user.rb'
+ - 'ee/lib/gitlab/auth/smartcard.rb'
+ - 'ee/lib/gitlab/ci/reports/dependency_list/dependency.rb'
+ - 'ee/lib/gitlab/ci/reports/dependency_list/vulnerability.rb'
+ - 'ee/lib/gitlab/ci/reports/license_scanning/dependency.rb'
+ - 'ee/lib/gitlab/ci/reports/license_scanning/report.rb'
+ - 'ee/lib/gitlab/elastic/client.rb'
+ - 'ee/lib/gitlab/elastic/document_reference.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/oauth/login_state.rb'
+ - 'ee/lib/gitlab/geo/oauth/logout_state.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/gitlab/template/custom_template.rb'
+ - 'ee/lib/system_check/app/elasticsearch_check.rb'
+ - 'ee/spec/helpers/ee/feature_flags_helper_spec.rb'
+ - 'ee/spec/helpers/ee/graph_helper_spec.rb'
+ - 'ee/spec/models/geo/deleted_project_spec.rb'
+ - 'lib/api/entities/wiki_attachment.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/packages_helpers.rb'
+ - 'lib/api/scope.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/bulk_imports/error.rb'
+ - 'lib/bulk_imports/pipeline.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/request_params.rb'
+ - 'lib/gitlab/auth/ldap/access.rb'
+ - 'lib/gitlab/auth/ldap/adapter.rb'
+ - 'lib/gitlab/auth/ldap/auth_hash.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/auth/o_auth/provider.rb'
+ - 'lib/gitlab/auth/result.rb'
+ - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/background_migration/job_coordinator.rb'
+ - 'lib/gitlab/background_migration/migrate_merge_request_diff_commit_users.rb'
+ - 'lib/gitlab/cache/ci/project_pipeline_status.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/ansi2json/parser.rb'
+ - 'lib/gitlab/ci/ansi2json/style.rb'
+ - 'lib/gitlab/ci/build/policy.rb'
+ - 'lib/gitlab/ci/build/step.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/config/entry/jobs.rb'
+ - 'lib/gitlab/ci/config/entry/root.rb'
+ - 'lib/gitlab/ci/jwt.rb'
+ - 'lib/gitlab/ci/parsers/coverage/sax_document.rb'
+ - 'lib/gitlab/ci/pipeline/expression/lexeme/null.rb'
+ - 'lib/gitlab/ci/pipeline/preloader.rb'
+ - 'lib/gitlab/ci/queue/metrics.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/trace/stream.rb'
+ - 'lib/gitlab/ci/variables/collection.rb'
+ - 'lib/gitlab/ci/variables/collection/item.rb'
+ - 'lib/gitlab/config/entry/configurable.rb'
+ - 'lib/gitlab/config/entry/node.rb'
+ - 'lib/gitlab/config/entry/simplifiable.rb'
+ - 'lib/gitlab/cycle_analytics/summary/defaults.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/database/background_migration/batched_job.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration.rb'
+ - 'lib/gitlab/database/background_migration_job.rb'
+ - 'lib/gitlab/database/gitlab_schema.rb'
+ - 'lib/gitlab/database/load_balancing/service_discovery.rb'
+ - 'lib/gitlab/database/loose_foreign_keys.rb'
+ - 'lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/query_analyzers/base.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/database/query_analyzers/restrict_allowed_schemas.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/migration_classes.rb'
+ - 'lib/gitlab/database/shared_model.rb'
+ - 'lib/gitlab/database/similarity_score.rb'
+ - 'lib/gitlab/database/transaction/observer.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
+ - 'lib/gitlab/email/smtp_config.rb'
+ - 'lib/gitlab/feature_categories.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/git/blob.rb'
+ - 'lib/gitlab/git/branch.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/git/tree.rb'
+ - 'lib/gitlab/git_access.rb'
+ - 'lib/gitlab/github_import.rb'
+ - 'lib/gitlab/graphql/known_operations.rb'
+ - 'lib/gitlab/graphql/lazy.rb'
+ - 'lib/gitlab/graphql/representation/submodule_tree_entry.rb'
+ - 'lib/gitlab/graphql/representation/tree_entry.rb'
+ - 'lib/gitlab/graphql/tracers/application_context_tracer.rb'
+ - 'lib/gitlab/graphql/tracers/logger_tracer.rb'
+ - 'lib/gitlab/graphql/tracers/metrics_tracer.rb'
+ - 'lib/gitlab/graphql/tracers/timer_tracer.rb'
+ - 'lib/gitlab/highlight.rb'
+ - 'lib/gitlab/http.rb'
+ - 'lib/gitlab/import_export/error.rb'
+ - 'lib/gitlab/import_export/hash_util.rb'
+ - 'lib/gitlab/instrumentation/redis_base.rb'
+ - 'lib/gitlab/jira_import.rb'
+ - 'lib/gitlab/jwt_token.rb'
+ - 'lib/gitlab/kubernetes/cilium_network_policy.rb'
+ - 'lib/gitlab/kubernetes/network_policy.rb'
+ - 'lib/gitlab/logger.rb'
+ - 'lib/gitlab/marker_range.rb'
+ - 'lib/gitlab/memory/instrumentation.rb'
+ - 'lib/gitlab/patch/sprockets_base_file_digest_key.rb'
+ - 'lib/gitlab/quick_actions/dsl.rb'
+ - 'lib/gitlab/redis/hll.rb'
+ - 'lib/gitlab/routing.rb'
+ - 'lib/gitlab/rugged_instrumentation.rb'
+ - 'lib/gitlab/search/query.rb'
+ - 'lib/gitlab/session.rb'
+ - 'lib/gitlab/sidekiq_config/cli_methods.rb'
+ - 'lib/gitlab/sidekiq_status.rb'
+ - 'lib/gitlab/sourcegraph.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/subscription_portal.rb'
+ - 'lib/gitlab/template/base_template.rb'
+ - 'lib/gitlab/template/dockerfile_template.rb'
+ - 'lib/gitlab/template/gitignore_template.rb'
+ - 'lib/gitlab/template/gitlab_ci_yml_template.rb'
+ - 'lib/gitlab/template/issue_template.rb'
+ - 'lib/gitlab/template/merge_request_template.rb'
+ - 'lib/gitlab/template/metrics_dashboard_template.rb'
+ - 'lib/gitlab/template/service_desk_template.rb'
+ - 'lib/gitlab/throttle.rb'
+ - 'lib/gitlab/tracking/event_definition.rb'
+ - 'lib/gitlab/untrusted_regexp.rb'
+ - 'lib/gitlab/untrusted_regexp/ruby_syntax.rb'
+ - 'lib/gitlab/usage/metric.rb'
+ - 'lib/gitlab/usage/metric_definition.rb'
+ - 'lib/gitlab/visibility_level.rb'
+ - 'lib/gitlab/webpack/file_loader.rb'
+ - 'lib/release_highlights/validator.rb'
+ - 'lib/system_check/app/ruby_version_check.rb'
+ - 'lib/system_check/base_check.rb'
+ - 'lib/system_check/rake_task/rake_task_helpers.rb'
+ - 'lib/uploaded_file.rb'
+ - 'qa/lib/gitlab/page/main/sign_up.rb'
+ - 'qa/qa/git/repository.rb'
+ - 'qa/qa/page/validatable.rb'
+ - 'qa/qa/resource/base.rb'
+ - 'qa/qa/resource/events/project.rb'
+ - 'qa/qa/resource/protected_branch.rb'
+ - 'qa/qa/resource/reusable.rb'
+ - 'qa/qa/resource/user_gpg.rb'
+ - 'qa/qa/runtime/release.rb'
+ - 'qa/qa/scenario/bootable.rb'
+ - 'qa/qa/scenario/test/instance.rb'
+ - 'sidekiq_cluster/sidekiq_cluster.rb'
+ - 'spec/graphql/resolvers/group_labels_resolver_spec.rb'
+ - 'spec/helpers/emails_helper_spec.rb'
+ - 'spec/helpers/feature_flags_helper_spec.rb'
+ - 'spec/helpers/graph_helper_spec.rb'
+ - 'spec/helpers/ide_helper_spec.rb'
+ - 'spec/helpers/submodule_helper_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing_spec.rb'
+ - 'spec/support/before_all_adapter.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
diff --git a/.rubocop_todo/style/rescue_modifier.yml b/.rubocop_todo/style/rescue_modifier.yml
new file mode 100644
index 00000000000..298ef3aece9
--- /dev/null
+++ b/.rubocop_todo/style/rescue_modifier.yml
@@ -0,0 +1,51 @@
+---
+# Cop supports --auto-correct.
+Style/RescueModifier:
+ # Offense count: 59
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/finders/ci/daily_build_group_report_results_finder.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/todo.rb'
+ - 'app/services/security/ci_configuration/sast_parser_service.rb'
+ - 'config/initializers/active_record_data_types.rb'
+ - 'config/settings.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/feature.rb'
+ - 'lib/gitlab/current_settings.rb'
+ - 'lib/gitlab/dependency_linker/cargo_toml_linker.rb'
+ - 'lib/gitlab/dependency_linker/json_linker.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/import_export/after_export_strategy_builder.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/process_management.rb'
+ - 'lib/gitlab/query_limiting/middleware.rb'
+ - 'lib/gitlab/quick_actions/command_definition.rb'
+ - 'lib/gitlab/quick_actions/spend_time_and_date_separator.rb'
+ - 'lib/gitlab/word_diff/segments/diff_hunk.rb'
+ - 'lib/gitlab/zentao/client.rb'
+ - 'lib/tasks/gitlab/praefect.rake'
+ - 'qa/qa/page/component/access_tokens.rb'
+ - 'qa/qa/page/profile/ssh_keys.rb'
+ - 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/session_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/monitor_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/namespace/traversal_hierarchy_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb'
diff --git a/.rubocop_todo/style/single_argument_dig.yml b/.rubocop_todo/style/single_argument_dig.yml
new file mode 100644
index 00000000000..860183426e9
--- /dev/null
+++ b/.rubocop_todo/style/single_argument_dig.yml
@@ -0,0 +1,64 @@
+---
+# Cop supports --auto-correct.
+Style/SingleArgumentDig:
+ # Offense count: 150
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/graphql/resolvers/namespace_projects_resolver.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_report_result.rb'
+ - 'app/models/error_tracking/error_event.rb'
+ - 'app/models/integrations/bamboo.rb'
+ - 'app/serializers/codequality_degradation_entity.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'ee/app/controllers/subscriptions_controller.rb'
+ - 'ee/app/graphql/ee/resolvers/namespace_projects_resolver.rb'
+ - 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
+ - 'ee/app/graphql/resolvers/ci/code_coverage_activities_resolver.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/presenters/vulnerability_presenter.rb'
+ - 'ee/app/services/elastic/cluster_reindexing_service.rb'
+ - 'ee/app/workers/concerns/elastic/migration_helper.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/dependency_list.rb'
+ - 'ee/lib/gitlab/subscription_portal/clients/graphql.rb'
+ - 'ee/spec/graphql/mutations/vulnerabilities/create_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/parsers/security/common_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/external_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/reports/dependency_list/report_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/client_spec.rb'
+ - 'ee/spec/models/vulnerabilities/finding_spec.rb'
+ - 'ee/spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/code_coverage_summary_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_scanner_profiles_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_site_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_site_profiles_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb'
+ - 'ee/spec/requests/api/internal/upcoming_reconciliations_spec.rb'
+ - 'ee/spec/services/vulnerabilities/manually_create_service_spec.rb'
+ - 'lib/gitlab/ci/badge/coverage/template.rb'
+ - 'lib/gitlab/ci/badge/pipeline/template.rb'
+ - 'lib/gitlab/ci/badge/release/template.rb'
+ - 'lib/gitlab/ci/lint.rb'
+ - 'lib/gitlab/ci/parsers/accessibility/pa11y.rb'
+ - 'lib/gitlab/ci/parsers/security/common.rb'
+ - 'lib/gitlab/ci/reports/codequality_reports.rb'
+ - 'lib/gitlab/ci/reports/security/finding_signature.rb'
+ - 'lib/gitlab/ci/reports/security/scan.rb'
+ - 'lib/gitlab/ci/variables/builder.rb'
+ - 'lib/gitlab/config/entry/simplifiable.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/database/transaction/observer.rb'
+ - 'lib/gitlab/serverless/service.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
+ - 'spec/controllers/graphql_controller_spec.rb'
+ - 'spec/graphql/types/release_links_type_spec.rb'
+ - 'spec/helpers/projects_helper_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_request_post_spec.rb'
+ - 'spec/requests/api/graphql/container_repository/container_repository_details_spec.rb'
+ - 'spec/requests/api/graphql/project/container_repositories_spec.rb'
+ - 'spec/requests/api/graphql/project/jira_import_spec.rb'
+ - 'spec/requests/api/graphql/project/terraform/states_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/rules_spec.rb'
+ - 'spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb'
diff --git a/.rubocop_todo/style/sole_nested_conditional.yml b/.rubocop_todo/style/sole_nested_conditional.yml
new file mode 100644
index 00000000000..620d66a272c
--- /dev/null
+++ b/.rubocop_todo/style/sole_nested_conditional.yml
@@ -0,0 +1,64 @@
+---
+Style/SoleNestedConditional:
+ # Offense count: 64
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/ldap/omniauth_callbacks_controller.rb'
+ - 'app/controllers/omniauth_callbacks_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/helpers/nav_helper.rb'
+ - 'app/helpers/selects_helper.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/external_pull_request.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/network/graph.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/protected_branch.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/concerns/update_visibility_level.rb'
+ - 'app/services/incident_management/incidents/create_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/services/packages/generic/create_package_file_service.rb'
+ - 'app/services/packages/maven/find_or_create_package_service.rb'
+ - 'app/services/projects/container_repository/delete_tags_service.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'app/services/projects/hashed_storage/migration_service.rb'
+ - 'app/services/projects/hashed_storage/rollback_service.rb'
+ - 'ee/app/finders/ee/snippets_finder.rb'
+ - 'ee/app/services/ee/issue_links/create_service.rb'
+ - 'ee/app/services/ee/lfs/unlock_file_service.rb'
+ - 'ee/app/services/epics/tree_reorder_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/vulnerability_feedback/create_service.rb'
+ - 'ee/app/workers/ee/post_receive.rb'
+ - 'ee/lib/ee/gitlab/auth/o_auth/auth_hash.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/commit_check.rb'
+ - 'ee/lib/elastic/latest/application_class_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/lib/gitlab/code_owners/groups_loader.rb'
+ - 'lib/api/ci/helpers/runner.rb'
+ - 'lib/api/deploy_keys.rb'
+ - 'lib/api/helpers/label_helpers.rb'
+ - 'lib/api/users.rb'
+ - 'lib/banzai/filter/ascii_doc_sanitization_filter.rb'
+ - 'lib/banzai/filter/base_sanitization_filter.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/auth/saml/user.rb'
+ - 'lib/gitlab/ci/pipeline/chain/skip.rb'
+ - 'lib/gitlab/config/entry/configurable.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/database/each_database.rb'
+ - 'lib/gitlab/email/handler/reply_processing.rb'
+ - 'lib/gitlab/user_access.rb'
+ - 'lib/gitlab/utils.rb'
+ - 'lib/gitlab/x509/signature.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/object_storage/direct_upload.rb'
+ - 'qa/qa/flow/login.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'spec/spec_helper.rb'
diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml
new file mode 100644
index 00000000000..23a16f928f5
--- /dev/null
+++ b/.rubocop_todo/style/string_concatenation.yml
@@ -0,0 +1,336 @@
+---
+# Cop supports --auto-correct.
+Style/StringConcatenation:
+ # Offense count: 611
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/concerns/creates_commit.rb'
+ - 'app/controllers/groups/dependency_proxy_for_containers_controller.rb'
+ - 'app/controllers/jira_connect/app_descriptor_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/graphql/types/global_id_type.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/emails_helper.rb'
+ - 'app/helpers/events_helper.rb'
+ - 'app/helpers/numbers_helper.rb'
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/concerns/counter_attribute.rb'
+ - 'app/models/concerns/cross_database_modification.rb'
+ - 'app/models/concerns/from_set_operator.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/integrations/chat_message/merge_message.rb'
+ - 'app/models/integrations/chat_message/note_message.rb'
+ - 'app/models/integrations/discord.rb'
+ - 'app/models/integrations/mock_monitoring.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/packages/go/module_version.rb'
+ - 'app/models/pages/lookup_path.rb'
+ - 'app/models/pool_repository.rb'
+ - 'app/models/project_wiki.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/serverless/function.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/presenters/snippet_blob_presenter.rb'
+ - 'app/services/clusters/gcp/finalize_creation_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/packages/composer/version_parser_service.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/pages/zip_directory_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/verify_pages_domain_service.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/settings.rb'
+ - 'config/spring.rb'
+ - 'db/migrate/20210412111213_create_security_orchestration_policy_rule_schedule.rb'
+ - 'ee/app/controllers/admin/elasticsearch_controller.rb'
+ - 'ee/app/finders/ee/issuables/label_filter.rb'
+ - 'ee/app/helpers/ee/gitlab_routing_helper.rb'
+ - 'ee/app/helpers/ee/mirror_helper.rb'
+ - 'ee/app/helpers/ee/search_helper.rb'
+ - 'ee/app/models/group_wiki.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/ee/issues/build_service.rb'
+ - 'ee/app/services/geo/framework_repository_sync_service.rb'
+ - 'ee/app/services/geo/repository_base_sync_service.rb'
+ - 'ee/app/services/merge_requests/update_blocks_service.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/lib/api/project_mirror.rb'
+ - 'ee/lib/ee/audit/project_changes_auditor.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/person.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/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/gitlab/elastic/search_results.rb'
+ - 'ee/lib/gitlab/geo/git_ssh_proxy.rb'
+ - 'ee/lib/omni_auth/strategies/kerberos_spnego.rb'
+ - 'ee/lib/tasks/gitlab/elastic.rake'
+ - 'ee/lib/tasks/gitlab/license.rake'
+ - 'ee/spec/controllers/trial_registrations_controller_spec.rb'
+ - 'ee/spec/features/boards/boards_spec.rb'
+ - 'ee/spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'ee/spec/helpers/ee/integrations_helper_spec.rb'
+ - 'ee/spec/helpers/search_helper_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/api_security_latest_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'
+ - 'ee/spec/models/concerns/elastic/repository_spec.rb'
+ - 'ee/spec/models/dast_site_profile_spec.rb'
+ - 'ee/spec/models/dast_site_validation_spec.rb'
+ - 'ee/spec/models/ee/audit_event_spec.rb'
+ - 'ee/spec/models/geo_node_spec.rb'
+ - 'ee/spec/models/status_page/project_setting_spec.rb'
+ - 'ee/spec/requests/api/internal/kubernetes_spec.rb'
+ - 'ee/spec/services/jira/jql_builder_service_spec.rb'
+ - 'ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/support/shared_examples/models/geo_framework_registry_shared_examples.rb'
+ - 'ee/spec/tasks/gitlab/license_rake_spec.rb'
+ - 'lib/api/entities/tree_object.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/internal/kubernetes.rb'
+ - 'lib/backup/files.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/blockquote_fence_filter.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/references/user_reference_filter.rb'
+ - 'lib/bulk_imports/common/pipelines/wiki_pipeline.rb'
+ - 'lib/extracts_ref.rb'
+ - 'lib/feature/definition.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/bare_repository_import/importer.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/status/build/retried.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/console.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/rename_reserved_paths_migration/v1/migration_classes.rb'
+ - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
+ - 'lib/gitlab/email/handler/service_desk_handler.rb'
+ - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/git/branch.rb'
+ - 'lib/gitlab/git/tag.rb'
+ - 'lib/gitlab/git/wiki.rb'
+ - 'lib/gitlab/github_import/importer/labels_importer.rb'
+ - 'lib/gitlab/graphql/negatable_arguments.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/i18n/po_linter.rb'
+ - 'lib/gitlab/jira/http_client.rb'
+ - 'lib/gitlab/json_logger.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/kubernetes/kubectl_cmd.rb'
+ - 'lib/gitlab/lfs/client.rb'
+ - 'lib/gitlab/logger.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/prometheus/internal.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/route_map.rb'
+ - 'lib/gitlab/sanitizers/exception_message.rb'
+ - 'lib/gitlab/sidekiq_logging/json_formatter.rb'
+ - 'lib/gitlab/slug/environment.rb'
+ - 'lib/gitlab/sql/set_operator.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/throttle.rb'
+ - 'lib/gitlab/time_tracking_formatter.rb'
+ - 'lib/gitlab/untrusted_regexp.rb'
+ - 'lib/gitlab/usage_data_counters/quick_action_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_queries.rb'
+ - 'lib/google_api/cloud_platform/client.rb'
+ - 'lib/kramdown/converter/commonmark.rb'
+ - 'lib/mattermost/session.rb'
+ - 'lib/product_analytics/tracker.rb'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/page/component/snippet.rb'
+ - 'qa/qa/page/group/settings/group_deploy_tokens.rb'
+ - 'qa/qa/page/milestone/new.rb'
+ - 'qa/qa/page/project/milestone/new.rb'
+ - 'qa/qa/page/project/settings/deploy_tokens.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'scripts/perf/gc/print_gc_stats.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/used-feature-flags'
+ - 'spec/config/settings_spec.rb'
+ - 'spec/controllers/concerns/redirects_for_missing_path_on_tree_spec.rb'
+ - 'spec/controllers/groups/uploads_controller_spec.rb'
+ - 'spec/controllers/projects/labels_controller_spec.rb'
+ - 'spec/controllers/projects/uploads_controller_spec.rb'
+ - 'spec/controllers/projects_controller_spec.rb'
+ - 'spec/controllers/search_controller_spec.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/factories/ci/daily_build_group_report_results.rb'
+ - 'spec/factories/gitaly/commit.rb'
+ - 'spec/features/canonical_link_spec.rb'
+ - 'spec/features/groups/group_settings_spec.rb'
+ - 'spec/features/merge_request/user_resolves_conflicts_spec.rb'
+ - 'spec/features/projects/commits/user_browses_commits_spec.rb'
+ - 'spec/features/projects/files/files_sort_submodules_with_folders_spec.rb'
+ - 'spec/features/projects/import_export/import_file_spec.rb'
+ - 'spec/features/search/user_searches_for_code_spec.rb'
+ - 'spec/finders/packages/go/module_finder_spec.rb'
+ - 'spec/graphql/mutations/issues/create_spec.rb'
+ - 'spec/helpers/application_helper_spec.rb'
+ - 'spec/helpers/diff_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/search_helper_spec.rb'
+ - 'spec/lib/api/helpers/related_resources_helpers_spec.rb'
+ - 'spec/lib/atlassian/jira_connect/client_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/backup/repositories_spec.rb'
+ - 'spec/lib/banzai/filter/color_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/front_matter_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_range_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/merge_request_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/constraints/project_url_constrainer_spec.rb'
+ - 'spec/lib/container_registry/tag_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb'
+ - 'spec/lib/gitlab/bare_repository_import/importer_spec.rb'
+ - 'spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb'
+ - 'spec/lib/gitlab/ci/config/entry/artifacts_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/mapper_spec.rb'
+ - 'spec/lib/gitlab/ci/trace/stream_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/crypto_helper_spec.rb'
+ - 'spec/lib/gitlab/emoji_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/git/conflict/parser_spec.rb'
+ - 'spec/lib/gitlab/git/tag_spec.rb'
+ - 'spec/lib/gitlab/git/user_spec.rb'
+ - 'spec/lib/gitlab/git_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/blob_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/cleanup_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/commit_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/ref_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/remote_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/wiki_service_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/kubernetes/kube_client_spec.rb'
+ - 'spec/lib/gitlab/lfs/client_spec.rb'
+ - 'spec/lib/gitlab/other_markup_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/extractor_spec.rb'
+ - 'spec/lib/gitlab/regex_spec.rb'
+ - 'spec/lib/gitlab/repo_path_spec.rb'
+ - 'spec/lib/gitlab/search/abuse_validators/no_abusive_term_length_validator_spec.rb'
+ - 'spec/lib/gitlab/search/params_spec.rb'
+ - 'spec/lib/gitlab/shell_spec.rb'
+ - 'spec/lib/gitlab/slash_commands/deploy_spec.rb'
+ - 'spec/lib/gitlab/themes_spec.rb'
+ - 'spec/lib/gitlab/throttle_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/url_blocker_spec.rb'
+ - 'spec/lib/gitlab/utils_spec.rb'
+ - 'spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb'
+ - 'spec/lib/gitlab/workhorse_spec.rb'
+ - 'spec/lib/kramdown/kramdown_spec.rb'
+ - 'spec/lib/safe_zip/entry_spec.rb'
+ - 'spec/lib/safe_zip/extract_params_spec.rb'
+ - 'spec/models/application_setting_spec.rb'
+ - 'spec/models/ci/build_spec.rb'
+ - 'spec/models/clusters/platforms/kubernetes_spec.rb'
+ - 'spec/models/commit_range_spec.rb'
+ - 'spec/models/commit_spec.rb'
+ - 'spec/models/concerns/avatarable_spec.rb'
+ - 'spec/models/concerns/pg_full_text_searchable_spec.rb'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/models/container_repository_spec.rb'
+ - 'spec/models/custom_emoji_spec.rb'
+ - 'spec/models/grafana_integration_spec.rb'
+ - 'spec/models/integrations/campfire_spec.rb'
+ - 'spec/models/integrations/chat_message/pipeline_message_spec.rb'
+ - 'spec/models/integrations/chat_message/push_message_spec.rb'
+ - 'spec/models/integrations/jenkins_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace_spec.rb'
+ - 'spec/models/packages/package_file_spec.rb'
+ - 'spec/models/packages/sem_ver_spec.rb'
+ - 'spec/models/pages/lookup_path_spec.rb'
+ - 'spec/models/project_metrics_setting_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/prometheus_alert_spec.rb'
+ - 'spec/models/releases/link_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/snippet_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/requests/api/environments_spec.rb'
+ - 'spec/requests/api/files_spec.rb'
+ - 'spec/requests/api/internal/kubernetes_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/requests/api/maven_packages_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/pypi_packages_spec.rb'
+ - 'spec/routing/git_http_routing_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/clusters/gcp/finalize_creation_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb'
+ - 'spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb'
+ - 'spec/services/error_tracking/list_projects_service_spec.rb'
+ - 'spec/services/merge_requests/build_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/helm/extract_file_metadata_service_spec.rb'
+ - 'spec/services/packages/helm/process_file_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/download_service_spec.rb'
+ - 'spec/services/push_event_payload_service_spec.rb'
+ - 'spec/services/repositories/destroy_rollback_service_spec.rb'
+ - 'spec/services/repositories/destroy_service_spec.rb'
+ - 'spec/services/snippets/bulk_destroy_service_spec.rb'
+ - 'spec/services/snippets/update_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/services/users/destroy_service_spec.rb'
+ - 'spec/services/verify_pages_domain_service_spec.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/helpers/ci_artifact_metadata_generator.rb'
+ - 'spec/support/helpers/git_helpers.rb'
+ - 'spec/support/helpers/gitaly_setup.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/jira_service_helper.rb'
+ - 'spec/support/helpers/kubernetes_helpers.rb'
+ - 'spec/support/helpers/stub_configuration.rb'
+ - 'spec/support/helpers/workhorse_helpers.rb'
+ - 'spec/support/helpers/workhorse_lfs_helpers.rb'
+ - 'spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/banzai/reference_parser_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_shared_examples.rb'
+ - 'spec/support/shared_examples/models/wiki_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/snippet_shared_examples.rb'
+ - 'spec/support/unpack-gitlab-git-test'
+ - 'spec/tasks/gitlab/backup_rake_spec.rb'
+ - 'spec/tooling/lib/tooling/kubernetes_client_spec.rb'
+ - 'spec/uploaders/job_artifact_uploader_spec.rb'
+ - 'spec/validators/addressable_url_validator_spec.rb'
+ - 'spec/validators/color_validator_spec.rb'
+ - 'spec/workers/packages/go/sync_packages_worker_spec.rb'
diff --git a/.rubocop_todo/style/string_literals_in_interpolation.yml b/.rubocop_todo/style/string_literals_in_interpolation.yml
new file mode 100644
index 00000000000..3f3cb007306
--- /dev/null
+++ b/.rubocop_todo/style/string_literals_in_interpolation.yml
@@ -0,0 +1,69 @@
+---
+# Cop supports --auto-correct.
+Style/StringLiteralsInInterpolation:
+ # Offense count: 119
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/graphql/mutations/base_mutation.rb'
+ - 'app/helpers/colors_helper.rb'
+ - 'app/helpers/todos_helper.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/integrations/campfire.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/serverless/domain.rb'
+ - 'app/services/draft_notes/publish_service.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'app/validators/nested_attributes_duplicates_validator.rb'
+ - 'app/views/events/_event.atom.builder'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'config/initializers/validate_database_config.rb'
+ - 'db/post_migrate/20210809123658_orphaned_invite_tokens_cleanup.rb'
+ - 'ee/app/helpers/ee/merge_requests_helper.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/services/epics/tree_reorder_service.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/lib/pseudonymizer/pager.rb'
+ - 'ee/spec/features/admin/admin_settings_spec.rb'
+ - 'lib/api/helpers/snippets_helpers.rb'
+ - 'lib/api/validations/validators/check_assignees_count.rb'
+ - 'lib/banzai/filter/references/abstract_reference_filter.rb'
+ - 'lib/generators/gitlab/usage_metric_definition_generator.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/ci/config/entry/job.rb'
+ - 'lib/gitlab/ci/yaml_processor.rb'
+ - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/doctor/secrets.rb'
+ - 'lib/gitlab/endpoint_attributes/config.rb'
+ - 'lib/gitlab/graphql/queries.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/sidekiq_signals.rb'
+ - 'lib/gitlab/tracking/destinations/snowplow.rb'
+ - 'lib/tasks/gitlab/info.rake'
+ - 'lib/tasks/gitlab/sidekiq.rake'
+ - 'lib/tasks/gitlab/tw/codeowners.rake'
+ - 'qa/qa/ee/page/component/secure_report.rb'
+ - 'qa/qa/ee/page/group/secure/show.rb'
+ - 'qa/qa/resource/events/base.rb'
+ - 'qa/qa/service/cluster_provider/base.rb'
+ - 'qa/qa/service/cluster_provider/gcloud.rb'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'qa/qa/specs/helpers/context_selector.rb'
+ - 'qa/qa/tools/generate_perf_testdata.rb'
+ - 'rubocop/cop/migration/prevent_index_creation.rb'
+ - 'spec/controllers/projects/serverless/functions_controller_spec.rb'
+ - 'spec/features/commits_spec.rb'
+ - 'spec/features/dashboard/merge_requests_spec.rb'
+ - 'spec/features/users/login_spec.rb'
+ - 'spec/finders/serverless_domain_finder_spec.rb'
+ - 'spec/lib/banzai/filter/references/commit_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/issue_reference_filter_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/object_storage/direct_upload_spec.rb'
+ - 'spec/models/serverless/domain_spec.rb'
+ - 'spec/requests/api/keys_spec.rb'
+ - 'spec/support/database/prevent_cross_joins.rb'
diff --git a/.rubocop_todo/style/symbol_proc.yml b/.rubocop_todo/style/symbol_proc.yml
new file mode 100644
index 00000000000..12e20553e1a
--- /dev/null
+++ b/.rubocop_todo/style/symbol_proc.yml
@@ -0,0 +1,280 @@
+---
+# Cop supports --auto-correct.
+Style/SymbolProc:
+ # Offense count: 341
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/concerns/renders_blob.rb'
+ - 'app/controllers/import/bitbucket_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/profiles/avatars_controller.rb'
+ - 'app/controllers/profiles/two_factor_auths_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/finders/packages/go/version_finder.rb'
+ - 'app/graphql/mutations/commits/create.rb'
+ - 'app/graphql/mutations/jira_import/start.rb'
+ - 'app/helpers/graph_helper.rb'
+ - 'app/models/ci/build_metadata.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/clusters/concerns/provider_status.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/concerns/board_recent_visit.rb'
+ - 'app/models/concerns/resolvable_discussion.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/discussion.rb'
+ - 'app/models/environment.rb'
+ - 'app/models/integrations/prometheus.rb'
+ - 'app/models/label_note.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/preloaders/merge_request_diff_preloader.rb'
+ - 'app/models/project_team.rb'
+ - 'app/models/release.rb'
+ - 'app/models/remote_mirror.rb'
+ - 'app/models/snippet_input_action_collection.rb'
+ - 'app/models/user.rb'
+ - 'app/policies/group_policy.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/serializers/analytics/cycle_analytics/value_stream_entity.rb'
+ - 'app/serializers/build_action_entity.rb'
+ - 'app/serializers/build_details_entity.rb'
+ - 'app/serializers/ci/pipeline_entity.rb'
+ - 'app/serializers/ci/trigger_entity.rb'
+ - 'app/serializers/cluster_entity.rb'
+ - 'app/serializers/deployment_cluster_entity.rb'
+ - 'app/serializers/deployment_entity.rb'
+ - 'app/serializers/draft_note_entity.rb'
+ - 'app/serializers/environment_entity.rb'
+ - 'app/serializers/import/bitbucket_provider_repo_entity.rb'
+ - 'app/serializers/import/fogbugz_provider_repo_entity.rb'
+ - 'app/serializers/issuable_sidebar_basic_entity.rb'
+ - 'app/serializers/issue_board_entity.rb'
+ - 'app/serializers/linked_project_issue_entity.rb'
+ - 'app/serializers/member_entity.rb'
+ - 'app/serializers/member_user_entity.rb'
+ - 'app/serializers/merge_request_widget_entity.rb'
+ - 'app/serializers/project_entity.rb'
+ - 'app/serializers/project_mirror_entity.rb'
+ - 'app/serializers/project_note_entity.rb'
+ - 'app/serializers/prometheus_alert_entity.rb'
+ - 'app/serializers/review_app_setup_entity.rb'
+ - 'app/serializers/test_suite_summary_entity.rb'
+ - 'app/services/badges/create_service.rb'
+ - 'app/services/ci/change_variable_service.rb'
+ - 'app/services/ci/find_exposed_artifacts_service.rb'
+ - 'app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'app/services/clusters/agents/delete_expired_events_service.rb'
+ - 'app/services/feature_flags/update_service.rb'
+ - 'app/services/google_cloud/enable_cloud_run_service.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/bulk_remove_attention_requested_service.rb'
+ - 'app/services/merge_requests/reopen_service.rb'
+ - 'app/services/notes/destroy_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/resource_events/synthetic_label_notes_builder_service.rb'
+ - 'app/services/two_factor/destroy_service.rb'
+ - 'app/workers/bulk_import_worker.rb'
+ - 'app/workers/bulk_imports/stuck_import_worker.rb'
+ - 'app/workers/ci/build_trace_chunk_flush_worker.rb'
+ - 'app/workers/gitlab/import/stuck_import_job.rb'
+ - 'app/workers/namespaces/prune_aggregation_schedules_worker.rb'
+ - 'app/workers/stuck_export_jobs_worker.rb'
+ - 'app/workers/update_head_pipeline_for_merge_request_worker.rb'
+ - 'config/initializers/01_active_record_database_tasks_configuration_flag.rb'
+ - 'config/initializers/doorkeeper_openid_connect.rb'
+ - 'config/initializers/mail_encoding_patch.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/settings.rb'
+ - 'db/migrate/20210318134427_delete_security_findings_without_uuid.rb'
+ - 'db/migrate/20210503105845_add_project_value_stream_id_to_project_stages.rb'
+ - 'db/post_migrate/20220119094503_populate_audit_event_streaming_verification_token.rb'
+ - 'ee/app/helpers/ee/mirror_helper.rb'
+ - 'ee/app/helpers/ee/registrations_helper.rb'
+ - 'ee/app/models/concerns/epic_tree_sorting.rb'
+ - 'ee/app/models/ee/integrations/jira.rb'
+ - 'ee/app/models/ee/issue.rb'
+ - 'ee/app/serializers/ee/fork_namespace_entity.rb'
+ - 'ee/app/serializers/ee/group_child_entity.rb'
+ - 'ee/app/serializers/ee/issue_sidebar_basic_entity.rb'
+ - 'ee/app/serializers/ee/member_entity.rb'
+ - 'ee/app/serializers/ee/merge_request_widget_entity.rb'
+ - 'ee/app/serializers/epics/related_epic_entity.rb'
+ - 'ee/app/serializers/integrations/jira_serializers/issue_entity.rb'
+ - 'ee/app/serializers/linked_epic_entity.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/geo/verification_state_backfill_service.rb'
+ - 'ee/app/services/security/scanned_resources_counting_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/services/vulnerabilities/historical_statistics/deletion_service.rb'
+ - 'ee/app/workers/geo/batch/project_registry_worker.rb'
+ - 'ee/app/workers/geo/sync_timeout_cron_worker.rb'
+ - 'ee/app/workers/geo/verification_cron_worker.rb'
+ - 'ee/app/workers/repository_push_audit_event_worker.rb'
+ - 'ee/lib/api/entities/pending_member.rb'
+ - 'ee/lib/api/related_epic_links.rb'
+ - 'ee/lib/ee/api/entities/audit_event.rb'
+ - 'ee/lib/ee/api/entities/geo_node.rb'
+ - 'ee/lib/ee/api/entities/merge_request_approval_state.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.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/populate_uuids_for_security_findings.rb'
+ - 'ee/lib/gitlab/ci/parsers/security/formatters/dependency_list.rb'
+ - 'ee/lib/gitlab/contribution_analytics/data_collector.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/lib/gitlab/geo/oauth/logout_state.rb'
+ - 'ee/spec/factories/issues.rb'
+ - 'ee/spec/features/billings/extend_reactivate_trial_spec.rb'
+ - 'ee/spec/features/billings/qrtly_reconciliation_alert_spec.rb'
+ - 'ee/spec/helpers/ee/geo_helper_spec.rb'
+ - '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/models/ee/iterations/cadence_spec.rb'
+ - 'ee/spec/services/groups/participants_service_spec.rb'
+ - 'ee/spec/support/helpers/subscription_portal_helpers.rb'
+ - 'lib/api/api_guard.rb'
+ - 'lib/api/entities/board.rb'
+ - 'lib/api/entities/environment.rb'
+ - 'lib/api/entities/issuable_references.rb'
+ - 'lib/api/entities/merge_request_approvals.rb'
+ - 'lib/api/entities/package.rb'
+ - 'lib/api/entities/protected_ref_access.rb'
+ - 'lib/api/github/entities.rb'
+ - 'lib/api/go_proxy.rb'
+ - 'lib/api/helpers/internal_helpers.rb'
+ - 'lib/api/package_files.rb'
+ - 'lib/api/terraform/state.rb'
+ - 'lib/atlassian/jira_connect/serializers/base_entity.rb'
+ - 'lib/banzai/filter/inline_cluster_metrics_filter.rb'
+ - 'lib/banzai/filter/inline_embeds_filter.rb'
+ - 'lib/bulk_imports/common/pipelines/entity_finisher.rb'
+ - 'lib/bulk_imports/ndjson_pipeline.rb'
+ - 'lib/container_registry/client.rb'
+ - 'lib/container_registry/gitlab_api_client.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events.rb'
+ - 'lib/gitlab/background_migration/cleanup_orphaned_lfs_objects_projects.rb'
+ - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb'
+ - 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/blob_helper.rb'
+ - 'lib/gitlab/cache/ci/project_pipeline_status.rb'
+ - 'lib/gitlab/checks/changes_access.rb'
+ - 'lib/gitlab/ci/pipeline/preloader.rb'
+ - 'lib/gitlab/ci/runner_upgrade_check.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/config/entry/node.rb'
+ - 'lib/gitlab/database/async_indexes/migration_helpers.rb'
+ - 'lib/gitlab/database/consistency_checker.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/instrumentation.rb'
+ - 'lib/gitlab/diff/file_collection/base.rb'
+ - 'lib/gitlab/git/diff_stats_collection.rb'
+ - 'lib/gitlab/gitaly_client/commit_service.rb'
+ - 'lib/gitlab/gitaly_client/wiki_service.rb'
+ - 'lib/gitlab/import_export/attributes_finder.rb'
+ - 'lib/gitlab/import_export/base/relation_object_saver.rb'
+ - 'lib/gitlab/import_export/fast_hash_serializer.rb'
+ - 'lib/gitlab/import_export/group/relation_tree_restorer.rb'
+ - 'lib/gitlab/manifest_import/manifest.rb'
+ - 'lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb'
+ - 'lib/gitlab/metrics/dashboard/url.rb'
+ - 'lib/gitlab/quick_actions/extractor.rb'
+ - 'lib/gitlab/quick_actions/merge_request_actions.rb'
+ - 'lib/gitlab/search/found_blob.rb'
+ - 'lib/gitlab/seeder.rb'
+ - 'lib/gitlab/sidekiq_config.rb'
+ - 'lib/gitlab/slash_commands/deploy.rb'
+ - 'lib/gitlab/ssh_public_key.rb'
+ - 'lib/gitlab/suggestions/suggestion_set.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/tasks/gitlab/praefect.rake'
+ - 'qa/qa/ee/page/group/settings/general.rb'
+ - 'qa/qa/ee/page/operations_dashboard.rb'
+ - 'qa/qa/page/group/settings/package_registries.rb'
+ - 'qa/qa/page/profile/two_factor_auth.rb'
+ - 'qa/qa/resource/project_snippet.rb'
+ - 'qa/qa/runtime/ip_address.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/5_package/container_registry/online_garbage_collection_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/attachment_replication_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/rename_replication_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/ssh_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/12_geo/wiki_http_push_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_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'
+ - 'rubocop/cop/gitlab/mark_used_feature_flags.rb'
+ - 'scripts/qa/testcases-check'
+ - 'scripts/static-analysis'
+ - 'spec/controllers/concerns/product_analytics_tracking_spec.rb'
+ - 'spec/controllers/concerns/redis_tracking_spec.rb'
+ - 'spec/controllers/projects/merge_requests/conflicts_controller_spec.rb'
+ - 'spec/factories/ci/builds.rb'
+ - 'spec/factories/clusters/providers/aws.rb'
+ - 'spec/factories/oauth_openid_requests.rb'
+ - 'spec/factories/personal_access_tokens.rb'
+ - 'spec/factories/pool_repositories.rb'
+ - 'spec/features/merge_request/user_creates_image_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_resolves_conflicts_spec.rb'
+ - 'spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb'
+ - 'spec/features/merge_request/user_sees_pipelines_spec.rb'
+ - 'spec/features/projects/commit/user_comments_on_commit_spec.rb'
+ - 'spec/features/projects/environments/environment_spec.rb'
+ - 'spec/features/projects/labels/update_prioritization_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/finders/packages/go/version_finder_spec.rb'
+ - 'spec/graphql/mutations/releases/create_spec.rb'
+ - 'spec/helpers/instance_configuration_helper_spec.rb'
+ - 'spec/helpers/learn_gitlab_helper_spec.rb'
+ - 'spec/helpers/members_helper_spec.rb'
+ - 'spec/lib/backup/gitaly_backup_spec.rb'
+ - 'spec/lib/gitlab/database/dynamic_model_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/loose_foreign_key_helpers_spec.rb'
+ - 'spec/lib/gitlab/git/commit_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb'
+ - 'spec/lib/gitlab/graphql/lazy_spec.rb'
+ - 'spec/lib/gitlab/instrumentation/redis_spec.rb'
+ - 'spec/lib/gitlab/optimistic_locking_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/dsl_spec.rb'
+ - 'spec/lib/gitlab/relative_positioning/item_context_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
+ - 'spec/models/operations/feature_flags/strategy_spec.rb'
+ - 'spec/models/project_statistics_spec.rb'
+ - 'spec/models/repository_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/presenters/projects/import_export/project_export_presenter_spec.rb'
+ - 'spec/requests/api/snippet_repository_storage_moves_spec.rb'
+ - 'spec/requests/api/tags_spec.rb'
+ - 'spec/services/ci/pipelines/add_job_service_spec.rb'
+ - 'spec/services/groups/transfer_service_spec.rb'
+ - 'spec/services/merge_requests/conflicts/list_service_spec.rb'
+ - 'spec/services/notification_recipients/builder/default_spec.rb'
+ - 'spec/services/packages/go/create_package_service_spec.rb'
+ - 'spec/services/suggestions/apply_service_spec.rb'
+ - 'spec/support/generate-seed-repo-rb'
+ - 'spec/support/helpers/filter_spec_helper.rb'
+ - 'spec/support/helpers/migrations_helpers.rb'
+ - 'spec/support/shared_contexts/finders/users_finder_shared_contexts.rb'
+ - 'spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/import_export/attributes_permitter_shared_examples.rb'
+ - 'spec/support/shared_examples/models/label_note_shared_examples.rb'
+ - 'spec/views/layouts/_published_experiments.html.haml_spec.rb'
+ - 'spec/workers/snippets/schedule_bulk_repository_shard_moves_worker_spec.rb'
+ - 'tooling/lib/tooling/test_map_generator.rb'
+ - 'tooling/rspec_flaky/flaky_examples_collection.rb'
diff --git a/.solargraph.yml.example b/.solargraph.yml.example
index ff8225eb73c..c226b038af9 100644
--- a/.solargraph.yml.example
+++ b/.solargraph.yml.example
@@ -6,11 +6,22 @@ exclude:
- qa/qa/specs/features/**/*
- vendor/**/*
- ".bundle/**/*"
-require: []
+require:
+- actioncable
+- actionmailer
+- actionpack
+- actionview
+- activejob
+- activemodel
+- activerecord
+- activestorage
+- activesupport
domains: []
reporters:
-- rubocop
+- rubocop # diagnostics
- require_not_found
+formatter:
+ rubocop: # formatting
require_paths: []
plugins: []
max_files: 15000
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1de770f136f..d3adbbe049e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -703,6 +703,26 @@ entry.
- [Convert ci_builds-runner_id FK to LFK](gitlab-org/gitlab@5e114952616994acb802e5ded373fc07e53a3aaa) ([merge request](gitlab-org/gitlab!83129))
- [Fix related epic links and issue links specs fixtures](gitlab-org/gitlab@ffc7df0cdbdda91fec15d2c4437e64dd7d073d50) ([merge request](gitlab-org/gitlab!82623))
+## 14.9.4 (2022-04-29)
+
+### Security (15 changes)
+
+- [Fixes infinite loop when rendering Ipynb Diffs](gitlab-org/security/gitlab@9836b8e3873e1390e1f6746a1039749c312739b5) ([merge request](gitlab-org/security/gitlab!2401))
+- [Update Import/Export merge/push access levels & exclude ci config path](gitlab-org/security/gitlab@8a27e1e56e965d6b69545a2efb4f55f20cc57b2e) ([merge request](gitlab-org/security/gitlab!2371))
+- [Prevent maintainers from editing PipelineSchedule](gitlab-org/security/gitlab@ee86557a26d0c3f8a983a6f20384f6b778d4ab0b) ([merge request](gitlab-org/security/gitlab!2422))
+- [Add validation to pypi file sha256 values](gitlab-org/security/gitlab@7f78a6b9060745d9fea7f7dc71d4cf090b8e9ab5) ([merge request](gitlab-org/security/gitlab!2416))
+- [Conan Token uses PAT rather than ID in payload](gitlab-org/security/gitlab@574b7397e4b32630276cf1e5896ad4a72e82f02b) ([merge request](gitlab-org/security/gitlab!2345))
+- [[security] Fix markdown API disclosing issue titles of limited projects](gitlab-org/security/gitlab@ff61b763d040ece83387eb7c0f70d0d97aafbd66) ([merge request](gitlab-org/security/gitlab!2406))
+- [Verify that mentioned user can read TODO's note](gitlab-org/security/gitlab@7771534e395f9f433cafa9984cbeeebf86a2d797) ([merge request](gitlab-org/security/gitlab!2396))
+- [Invalidate markdown cache to clear up stored XSS](gitlab-org/security/gitlab@0768d53609d530bee4ef118a929bdd7ac6cbd5de) ([merge request](gitlab-org/security/gitlab!2419))
+- [Allow rate limiting of deploy tokens](gitlab-org/security/gitlab@8738e74dbecece0e0fcdaf5df1323437db77b947) ([merge request](gitlab-org/security/gitlab!2384))
+- [Add suffix to cache name to add isolation](gitlab-org/security/gitlab@d722e72125ded23ea4fd0eeeb775576f7cdd7181) ([merge request](gitlab-org/security/gitlab!2374))
+- [Disable wiki access with CI_JOB_TOKEN when improper access level](gitlab-org/security/gitlab@13524db78a32d13e4081a30cc0db9215c404b435) ([merge request](gitlab-org/security/gitlab!2390))
+- [Sanitize error input to prevent HTML/CSS injection in messages](gitlab-org/security/gitlab@a83683c13f7a0a8af94a88562f5904bfcb1b58e0) ([merge request](gitlab-org/security/gitlab!2377))
+- [Secure debug trace artifact download](gitlab-org/security/gitlab@811ce49adeddb56de0a1ca26652017197fe1b97a) ([merge request](gitlab-org/security/gitlab!2366))
+- [Use password type for all secret integration properties](gitlab-org/security/gitlab@f38cec8b26fa0e33da9247af9e8c53c01e6ec0c6) ([merge request](gitlab-org/security/gitlab!2410))
+- [Limit CI job group_name regexp](gitlab-org/security/gitlab@5a08c0b9dff4518dff91990eecae0ab76c5cf4ed) ([merge request](gitlab-org/security/gitlab!2380))
+
## 14.9.3 (2022-04-12)
### Fixed (4 changes)
@@ -1339,6 +1359,25 @@ entry.
- [Clean up issue_boards_filtered_search feature flag](gitlab-org/gitlab@a97ed09ffb0d88007b21a314ab48b2e50d7c4bfa) ([merge request](gitlab-org/gitlab!80771))
- [Add table for storing issue tsvector](gitlab-org/gitlab@ceabf5a8ad0d67768b05a58a84b242495645a57c) ([merge request](gitlab-org/gitlab!71913))
+## 14.8.6 (2022-04-29)
+
+### Security (14 changes)
+
+- [Update Import/Export merge/push access levels & exclude ci config path](gitlab-org/security/gitlab@abfa8d4c128316b1ba095ff8eda7e86018e47caf) ([merge request](gitlab-org/security/gitlab!2372))
+- [Prevent maintainers from editing PipelineSchedule](gitlab-org/security/gitlab@761a7777cb480d02b9c3418aa7317eba7c0eaff1) ([merge request](gitlab-org/security/gitlab!2423))
+- [Add validation to pypi file sha256 values](gitlab-org/security/gitlab@712cc01aee2be4b6a9847746a080f190041367d5) ([merge request](gitlab-org/security/gitlab!2417))
+- [Conan Token uses PAT rather than ID in payload](gitlab-org/security/gitlab@ba3070c90dd1b575982df22c256b0e3f97a9e919) ([merge request](gitlab-org/security/gitlab!2346))
+- [[security] Fix markdown API disclosing issue titles of limited projects](gitlab-org/security/gitlab@fd3cb263e8f165a4a1a7894c08ddf254f9cf1e92) ([merge request](gitlab-org/security/gitlab!2405))
+- [Verify that mentioned user can read TODO's note](gitlab-org/security/gitlab@e54be58cc79011d7c79dae94b993774ab36ef232) ([merge request](gitlab-org/security/gitlab!2398))
+- [Invalidate markdown cache to clear up stored XSS](gitlab-org/security/gitlab@160cdda98c80e052abbb4bec226ad63fe9c9e403) ([merge request](gitlab-org/security/gitlab!2420))
+- [Allow rate limiting of deploy tokens](gitlab-org/security/gitlab@78f7ee3d7e1258375ddcea3a20e3798092e89d41) ([merge request](gitlab-org/security/gitlab!2385))
+- [Add suffix to cache name to add isolation](gitlab-org/security/gitlab@184d49640f5dcc4ac1522c874a7b5e0c16d2e05f) ([merge request](gitlab-org/security/gitlab!2373))
+- [Disable wiki access with CI_JOB_TOKEN when improper access level](gitlab-org/security/gitlab@db93d134394675a4335c92557a55ac4381ed303f) ([merge request](gitlab-org/security/gitlab!2391))
+- [Sanitize error input to prevent HTML/CSS injection in messages](gitlab-org/security/gitlab@333dd602091810639912702c80034468ff6f8aa0) ([merge request](gitlab-org/security/gitlab!2378))
+- [Secure debug trace artifact download](gitlab-org/security/gitlab@266d812ba2e8e9936269323465c867983e3a2ebf) ([merge request](gitlab-org/security/gitlab!2367))
+- [Use password type for all secret integration properties](gitlab-org/security/gitlab@eda2b8f02b34ead354ef07b9e41be006cf90f51b) ([merge request](gitlab-org/security/gitlab!2411))
+- [Limit CI job group_name regexp](gitlab-org/security/gitlab@03ab6e9f312fb6fe50a6361f7bc78d527b223b96) ([merge request](gitlab-org/security/gitlab!2381))
+
## 14.8.5 (2022-03-31)
### Security (21 changes)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1818bca1e46..ac3fbaddf8f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,9 +1,12 @@
-## Contributor license agreement
+## Contributor License Agreement and Developer Certificate of Origin
-By submitting code as an individual you agree to the
-[individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md).
-By submitting code as an entity you agree to the
-[corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md).
+Contributions to this repository are subject to the [Developer Certificate of Origin](https://docs.gitlab.com/ee/legal/developer_certificate_of_origin.html#developer-certificate-of-origin-version-11), or the [Individual](https://docs.gitlab.com/ee/legal/individual_contributor_license_agreement.html) or [Corporate](https://docs.gitlab.com/ee/legal/corporate_contributor_license_agreement.html) Contributor License Agreement, depending on where the contribution is made and on whose behalf:
+
+- By submitting code contributions as an individual to the [`/ee` subdirectory](/ee) of this repository, you agree to the [Individual Contributor License Agreement](https://docs.gitlab.com/ee/legal/individual_contributor_license_agreement.html).
+
+- By submitting code contributions on behalf of a corporation to the [`/ee` subdirectory](/ee) of this repository, you agree to the [Corporate Contributor License Agreement](https://docs.gitlab.com/ee/legal/corporate_contributor_license_agreement.html).
+
+- By submitting code contributions as an individual or on behalf of a corporation to any directory in this repository outside of the [`/ee` subdirectory](/ee), you agree to the [Developer Certificate of Origin](https://docs.gitlab.com/ee/legal/developer_certificate_of_origin.html#developer-certificate-of-origin-version-11).
All Documentation content that resides under the [`doc/` directory](/doc) of this
repository is licensed under Creative Commons:
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 11079fff985..8aa8a81ede5 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-14.10.2 \ No newline at end of file
+2106629e3af3e8949b23f20825d6bfee62c10992
diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
index d76bd2ba3ef..4a36342fcab 100644
--- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION
+++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION
@@ -1 +1 @@
-2.17.0
+3.0.0
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index 6242bb49da0..94188a74831 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-14.10.0
+15.0.0
diff --git a/GITLAB_METRICS_EXPORTER_VERSION b/GITLAB_METRICS_EXPORTER_VERSION
new file mode 100644
index 00000000000..ba2906d0666
--- /dev/null
+++ b/GITLAB_METRICS_EXPORTER_VERSION
@@ -0,0 +1 @@
+main
diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION
index 43c989b5531..79f82f6b8e0 100644
--- a/GITLAB_PAGES_VERSION
+++ b/GITLAB_PAGES_VERSION
@@ -1 +1 @@
-1.56.1
+1.58.0
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index 5dd2f9ec06b..32f02f10ebe 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-13.25.1
+14.3.0
diff --git a/Gemfile b/Gemfile
index 6f9340ebd7d..2486104e7af 100644
--- a/Gemfile
+++ b/Gemfile
@@ -4,7 +4,7 @@ source 'https://rubygems.org'
gem 'rails', '~> 6.1.4.7'
-gem 'bootsnap', '~> 1.9.1', require: false
+gem 'bootsnap', '~> 1.9.4', require: false
# Responders respond_to and respond_with
gem 'responders', '~> 3.0'
@@ -46,7 +46,6 @@ gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-github', '~> 1.4'
gem 'omniauth-gitlab', '~> 1.0.2'
gem 'omniauth-google-oauth2', '~> 0.6.0'
-gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos
gem 'omniauth-oauth2-generic', '~> 0.2.2'
gem 'omniauth-saml', '~> 1.10'
gem 'omniauth-shibboleth', '~> 1.3.0'
@@ -61,6 +60,7 @@ gem 'jwt', '~> 2.1.0'
# Kerberos authentication. EE-only
gem 'gssapi', group: :kerberos
+gem 'timfel-krb5-auth', '~> 0.8', group: :kerberos
# Spam and anti-bot protection
gem 'recaptcha', '~> 4.11', require: 'recaptcha/rails'
@@ -104,7 +104,7 @@ gem 'graphql', '~> 1.11.10'
gem 'graphiql-rails', '~> 1.8'
gem 'apollo_upload_server', '~> 2.1.0'
gem 'graphql-docs', '~> 1.6.0', group: [:development, :test]
-gem 'graphlient', '~> 0.4.0' # Used by BulkImport feature (group::import)
+gem 'graphlient', '~> 0.5.0' # Used by BulkImport feature (group::import)
gem 'hashie'
# Disable strong_params so that Mash does not respond to :permitted?
@@ -142,9 +142,9 @@ gem 'unf', '~> 0.1.4'
gem 'seed-fu', '~> 2.3.7'
# Search
-gem 'elasticsearch-model', '~> 6.1'
-gem 'elasticsearch-rails', '~> 6.1', require: 'elasticsearch/rails/instrumentation'
-gem 'elasticsearch-api', '~> 6.8.2'
+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-cloudformation', '~> 1'
gem 'aws-sdk-s3', '~> 1'
@@ -345,6 +345,7 @@ gem 'warning', '~> 1.2.0'
group :development do
gem 'lefthook', '~> 0.7.0', require: false
+ gem 'rubocop'
gem 'solargraph', '~> 0.44.3', require: false
gem 'letter_opener_web', '~> 2.0.0'
@@ -543,4 +544,4 @@ gem 'ipaddress', '~> 0.8.3'
gem 'parslet', '~> 1.8'
-gem 'ipynbdiff', '0.4.5'
+gem 'ipynbdiff', '0.4.7'
diff --git a/Gemfile.lock b/Gemfile.lock
index 9a67aa1b017..87bb6167b65 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -150,7 +150,7 @@ GEM
rack (>= 0.9.0)
bindata (2.4.10)
binding_ninja (0.2.3)
- bootsnap (1.9.1)
+ bootsnap (1.9.4)
msgpack (~> 1.0)
bootstrap_form (4.2.0)
actionpack (>= 5.0)
@@ -313,17 +313,17 @@ GEM
e2mmap (0.1.0)
ecma-re-validator (0.3.0)
regexp_parser (~> 2.0)
- elasticsearch (6.8.2)
- elasticsearch-api (= 6.8.2)
- elasticsearch-transport (= 6.8.2)
- elasticsearch-api (6.8.2)
+ elasticsearch (7.13.3)
+ elasticsearch-api (= 7.13.3)
+ elasticsearch-transport (= 7.13.3)
+ elasticsearch-api (7.13.3)
multi_json
- elasticsearch-model (6.1.1)
+ elasticsearch-model (7.2.0)
activesupport (> 3)
- elasticsearch (~> 6)
+ elasticsearch (~> 7)
hashie
- elasticsearch-rails (6.1.1)
- elasticsearch-transport (6.8.2)
+ elasticsearch-rails (7.2.1)
+ elasticsearch-transport (7.13.3)
faraday (~> 1)
multi_json
email_reply_trimmer (0.1.6)
@@ -349,13 +349,17 @@ GEM
factory_bot_rails (6.2.0)
factory_bot (~> 6.2.0)
railties (>= 5.0.0)
- faraday (1.4.2)
+ faraday (1.10.0)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
- faraday-net_http_persistent (~> 1.1)
- multipart-post (>= 1.2, < 3)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
@@ -365,9 +369,15 @@ GEM
faraday-excon (1.1.0)
faraday-http-cache (2.2.0)
faraday (>= 0.8)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.3)
+ multipart-post (>= 1.2, < 3)
faraday-net_http (1.0.1)
- faraday-net_http_persistent (1.1.0)
- faraday_middleware (1.0.0)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
faraday (~> 1.0)
faraday_middleware-aws-sigv4 (0.3.0)
aws-sigv4 (~> 1.0)
@@ -567,14 +577,14 @@ GEM
graphiql-rails (1.8.0)
railties
sprockets-rails
- graphlient (0.4.0)
+ graphlient (0.5.0)
faraday (>= 1.0)
faraday_middleware
graphql-client
graphql (1.11.10)
- graphql-client (0.16.0)
+ graphql-client (0.17.0)
activesupport (>= 3.0)
- graphql (~> 1.8)
+ graphql (~> 1.10)
graphql-docs (1.6.0)
commonmarker (~> 0.16)
escape_utils (~> 1.2)
@@ -655,7 +665,7 @@ GEM
invisible_captcha (1.1.0)
rails (>= 4.2)
ipaddress (0.8.3)
- ipynbdiff (0.4.5)
+ ipynbdiff (0.4.7)
diffy (~> 3.3)
json (~> 2.5, >= 2.5.1)
jaeger-client (1.1.0)
@@ -774,7 +784,7 @@ GEM
faraday (>= 0.9, < 2.0.0)
faraday-cookie_jar (~> 0.0.6)
ms_rest (~> 0.7.6)
- msgpack (1.3.3)
+ msgpack (1.5.1)
multi_json (1.14.1)
multi_xml (0.6.0)
multipart-post (2.1.1)
@@ -863,11 +873,6 @@ GEM
jwt (>= 2.0)
omniauth (>= 1.1.1)
omniauth-oauth2 (>= 1.5)
- omniauth-kerberos (0.3.0)
- omniauth-multipassword
- timfel-krb5-auth (~> 0.8)
- omniauth-multipassword (0.4.2)
- omniauth (~> 1.0)
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
@@ -1078,7 +1083,7 @@ GEM
rspec-expectations (3.10.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
- rspec-mocks (3.10.2)
+ rspec-mocks (3.10.3)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-parameterized (0.5.0)
@@ -1140,7 +1145,7 @@ GEM
nokogiri (>= 1.10.5)
rexml
ruby-statistics (3.0.0)
- ruby2_keywords (0.0.4)
+ ruby2_keywords (0.0.5)
ruby_parser (3.15.0)
sexp_processor (~> 4.9)
rubyntlm (0.6.2)
@@ -1437,7 +1442,7 @@ DEPENDENCIES
benchmark-ips (~> 2.3.0)
benchmark-memory (~> 0.1)
better_errors (~> 2.9.0)
- bootsnap (~> 1.9.1)
+ bootsnap (~> 1.9.4)
bootstrap_form (~> 4.2.0)
browser (~> 4.2)
bullet (~> 6.1.3)
@@ -1466,9 +1471,9 @@ DEPENDENCIES
discordrb-webhooks (~> 3.4)
doorkeeper (~> 5.5.0.rc2)
doorkeeper-openid_connect (~> 1.7.5)
- elasticsearch-api (~> 6.8.2)
- elasticsearch-model (~> 6.1)
- elasticsearch-rails (~> 6.1)
+ elasticsearch-api (= 7.13.3)
+ elasticsearch-model (~> 7.2)
+ elasticsearch-rails (~> 7.2)
email_reply_trimmer (~> 0.1)
email_spec (~> 2.2.0)
erubi (~> 1.9.0)
@@ -1520,7 +1525,7 @@ DEPENDENCIES
grape-path-helpers (~> 1.7.0)
grape_logging (~> 1.7)
graphiql-rails (~> 1.8)
- graphlient (~> 0.4.0)
+ graphlient (~> 0.5.0)
graphql (~> 1.11.10)
graphql-docs (~> 1.6.0)
grpc (~> 1.42.0)
@@ -1538,7 +1543,7 @@ DEPENDENCIES
icalendar
invisible_captcha (~> 1.1.0)
ipaddress (~> 0.8.3)
- ipynbdiff (= 0.4.5)
+ ipynbdiff (= 0.4.7)
jira-ruby (~> 2.1.4)
js_regex (~> 3.7)
json (~> 2.5.1)
@@ -1584,7 +1589,6 @@ DEPENDENCIES
omniauth-github (~> 1.4)
omniauth-gitlab (~> 1.0.2)
omniauth-google-oauth2 (~> 0.6.0)
- omniauth-kerberos (~> 0.3.0)
omniauth-oauth2-generic (~> 0.2.2)
omniauth-salesforce (~> 1.0.5)
omniauth-saml (~> 1.10)
@@ -1634,6 +1638,7 @@ DEPENDENCIES
rspec-retry (~> 0.6.1)
rspec_junit_formatter
rspec_profiling (~> 0.0.6)
+ rubocop
ruby-fogbugz (~> 0.2.1)
ruby-magic (~> 0.5)
ruby-prof (~> 1.3.0)
@@ -1679,6 +1684,7 @@ DEPENDENCIES
thin (~> 1.8.0)
thrift (>= 0.14.0)
timecop (~> 0.9.1)
+ timfel-krb5-auth (~> 0.8)
toml-rb (~> 2.0)
truncato (~> 0.7.11)
typhoeus (~> 1.4.0)
diff --git a/README.md b/README.md
index cff7a413e0b..4bc63759aba 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,9 @@ To work on GitLab itself, we recommend setting up your development environment w
If you do not use the GitLab Development Kit you need to install and configure all the dependencies yourself, this is a lot of work and error prone.
One small thing you also have to do when installing it yourself is to copy the example development Puma configuration file:
- cp config/puma.example.development.rb config/puma.rb
+```shell
+cp config/puma.example.development.rb config/puma.rb
+```
Instructions on how to start GitLab and how to run the tests can be found in the [getting started section of the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit#getting-started).
@@ -80,7 +82,7 @@ Instructions on how to start GitLab and how to run the tests can be found in the
GitLab is a Ruby on Rails application that runs on the following software:
- Ubuntu/Debian/CentOS/RHEL/OpenSUSE
-- Ruby (MRI) 2.7.4
+- Ruby (MRI) 2.7.5
- Git 2.33+
- Redis 5.0+
- PostgreSQL 12+
diff --git a/app/assets/images/apple-touch-icon.png b/app/assets/images/apple-touch-icon.png
new file mode 100644
index 00000000000..90507f61099
--- /dev/null
+++ b/app/assets/images/apple-touch-icon.png
Binary files differ
diff --git a/app/assets/images/ext_snippet_icons/logo.svg b/app/assets/images/ext_snippet_icons/logo.svg
index 9cb3042213a..d76e9cb3e5c 100644
--- a/app/assets/images/ext_snippet_icons/logo.svg
+++ b/app/assets/images/ext_snippet_icons/logo.svg
@@ -1 +1,12 @@
-<svg width="100" height="32" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><path fill="#8C929D" d="M67.67 8.11h-2.06l.009 15.364h8.348v-1.9H67.68l-.01-13.465zM81.913 20.778a3.517 3.517 0 01-2.553 1.078c-1.57 0-2.203-.775-2.203-1.787 0-1.522 1.059-2.25 3.309-2.25.487.002.974.04 1.456.113v2.846h-.01zm-2.137-9.313a6.826 6.826 0 00-4.387 1.579l.728 1.267c.841-.492 1.872-.983 3.356-.983 1.693 0 2.44.87 2.44 2.326v.747a9.4 9.4 0 00-1.428-.114c-3.612 0-5.446 1.267-5.446 3.914 0 2.374 1.456 3.565 3.659 3.565 1.484 0 2.912-.68 3.404-1.787l.378 1.503h1.456v-7.866c-.01-2.487-1.087-4.151-4.16-4.151zM90.587 21.926c-.776 0-1.456-.094-1.967-.33v-7.102c.7-.586 1.57-1.011 2.676-1.011 1.995 0 2.76 1.408 2.76 3.687 0 3.234-1.238 4.756-3.47 4.756m.87-10.457a3.775 3.775 0 00-2.836 1.257V10.74l-.01-2.629h-2.013l.01 14.987c1.01.425 2.391.652 3.895.652 3.848 0 5.701-2.458 5.701-6.704-.01-3.356-1.72-5.578-4.746-5.578M45.228 9.776c1.825 0 3.006.605 3.772 1.22l.889-1.541c-1.2-1.06-2.827-1.627-4.567-1.627-4.387 0-7.46 2.676-7.46 8.075 0 5.654 3.319 7.857 7.11 7.857a12.083 12.083 0 004.577-.888L49.5 16.83v-1.9h-5.63v1.9h3.594l.047 4.586c-.473.236-1.286.425-2.392.425-3.045 0-5.087-1.92-5.087-5.957-.01-4.113 2.1-6.108 5.19-6.108M59.744 8.107H57.73l.01 2.582v8.916c0 2.487 1.078 4.15 4.15 4.15.416.002.83-.036 1.24-.113v-1.806c-.31.047-.624.07-.937.066-1.692 0-2.44-.87-2.44-2.326v-6.145h3.376v-1.683h-3.373l-.009-3.64h-.003zM52.608 23.474h2.014V11.75h-2.014zM52.608 10.133h2.014V8.119h-2.014z"/><path d="M31.864 17.907l-1.788-5.496-3.538-10.9a.612.612 0 00-1.16 0L21.84 12.406H10.085L6.547 1.512a.612.612 0 00-1.16 0L1.855 12.405.066 17.907c-.162.5.015 1.05.44 1.36L15.963 30.5l15.456-11.233a1.22 1.22 0 00.446-1.36" fill="#FC6D26"/><path d="M15.966 30.49l5.875-18.086H10.09z" fill="#E24329"/><path d="M15.962 30.49l-5.877-18.086H1.859z" fill="#FC6D26"/><path d="M1.852 12.41L.063 17.906c-.162.5.015 1.05.441 1.36L15.959 30.5 1.852 12.41z" fill="#FCA326"/><path d="M1.854 12.41h8.237L6.546 1.517a.612.612 0 00-1.16 0L1.854 12.41z" fill="#E24329"/><path d="M15.966 30.49l5.875-18.086h8.236z" fill="#FC6D26"/><path d="M30.074 12.41l1.79 5.496a1.219 1.219 0 01-.44 1.36L15.966 30.49l14.107-18.08z" fill="#FCA326"/><path d="M30.079 12.41H21.84L25.38 1.517a.612.612 0 011.16 0l3.539 10.893z" fill="#E24329"/></g></svg> \ No newline at end of file
+<svg width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
+ fill="#171321"/>
+ <path d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#E24329"/>
+ <path d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#FC6D26"/>
+ <path d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
+ fill="#FCA326"/>
+ <path d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
+ fill="#FC6D26"/>
+</svg>
diff --git a/app/assets/images/favicon-blue.png b/app/assets/images/favicon-blue.png
index 2229fe79462..4829a48a0ea 100644
--- a/app/assets/images/favicon-blue.png
+++ b/app/assets/images/favicon-blue.png
Binary files differ
diff --git a/app/assets/images/favicon-yellow.png b/app/assets/images/favicon-yellow.png
index a80827808fc..fa0a23d54e5 100644
--- a/app/assets/images/favicon-yellow.png
+++ b/app/assets/images/favicon-yellow.png
Binary files differ
diff --git a/app/assets/images/favicon.png b/app/assets/images/favicon.png
index 845e0ec34a5..feeff619345 100644
--- a/app/assets/images/favicon.png
+++ b/app/assets/images/favicon.png
Binary files differ
diff --git a/app/assets/images/file_icons.svg b/app/assets/images/file_icons.svg
index def87dd9163..8b19f411c7b 100644
--- a/app/assets/images/file_icons.svg
+++ b/app/assets/images/file_icons.svg
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol viewBox="0 0 24 24" id="actionscript" xmlns="http://www.w3.org/2000/svg"><text style="line-height:113.99999857%" x="5.605" y="15.892" transform="scale(.91325 1.095)" font-weight="400" font-size="42.822" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#f44336"/><path style="line-height:125%" d="M4.744 2.031c-1.157 0-1.994.31-2.51.93-.515.612-.771 1.678-.771 3.197v2.467c0 1.408-.402 2.111-1.201 2.111v2.035c.8 0 1.2.679 1.2 2.036v2.654c0 1.512.26 2.562.78 3.152.52.59 1.355.885 2.502.885V19.43c-.447 0-.77-.151-.97-.453-.195-.303-.292-.815-.292-1.538v-2.267c0-1.807-.404-2.937-1.214-3.395v-.045c.81-.464 1.214-1.581 1.214-3.351V6.025c0-1.283.42-1.925 1.262-1.925V2.03zm14.66 0V4.1c.842 0 1.262.642 1.262 1.925v2.268c0 1.843.402 2.996 1.207 3.46v.046c-.805.442-1.207 1.544-1.207 3.306v2.356c0 .715-.099 1.22-.299 1.516-.2.302-.52.453-.963.453v2.068c1.152 0 1.984-.295 2.494-.885.516-.59.772-1.663.772-3.218V14.84c0-1.379.404-2.069 1.209-2.069v-2.035c-.805 0-1.21-.696-1.21-2.09V6.113c0-1.49-.255-2.54-.77-3.152-.516-.62-1.348-.93-2.495-.93zm-3.054 4.46c-.455 0-.886.057-1.293.173a3.056 3.056 0 0 0-1.078.527c-.308.241-.551.549-.731.924-.18.37-.27.817-.27 1.336 0 .663.165 1.227.493 1.695.33.468.831.864 1.502 1.188.263.125.509.249.736.37.227.12.422.244.586.374.168.13.299.271.394.424a.963.963 0 0 1 .145.521c0 .144-.03.28-.09.405a.9.9 0 0 1-.275.318c-.12.088-.272.158-.455.21a2.34 2.34 0 0 1-.635.075c-.415 0-.825-.083-1.233-.25a3.644 3.644 0 0 1-1.13-.763v2.222a3.68 3.68 0 0 0 1.101.418c.427.093.875.139 1.346.139.459 0 .894-.05 1.305-.152a3.002 3.002 0 0 0 1.09-.5c.31-.237.556-.543.736-.918.183-.38.275-.849.275-1.405 0-.403-.052-.755-.156-1.056a2.542 2.542 0 0 0-.45-.813 3.295 3.295 0 0 0-.704-.633 6.754 6.754 0 0 0-.922-.535 12.4 12.4 0 0 1-.676-.348c-.2-.115-.37-.231-.51-.347a1.502 1.502 0 0 1-.322-.375.91.91 0 0 1-.115-.453c0-.153.033-.288.101-.408a.948.948 0 0 1 .29-.32c.123-.089.275-.156.454-.202a2.18 2.18 0 0 1 .598-.078c.16 0 .326.015.502.043.18.028.36.07.539.13.18.056.354.13.522.218.171.088.329.188.472.304V6.871a4.039 4.039 0 0 0-.957-.285 6.448 6.448 0 0 0-1.185-.096zm-8.774.165l-3.123 9.967h2.094l.605-2.217h3.053l.61 2.217h2.107L9.869 6.656H7.576zm1.072 1.78h.047c.028.347.077.646.145.896l.922 3.35H7.564l.934-3.377c.08-.288.13-.578.15-.87z" font-weight="400" font-size="51.019" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="android" xmlns="http://www.w3.org/2000/svg"><path d="M15 5h-1V4h1m-5 1H9V4h1m5.53-1.84L16.84.85c.19-.19.19-.51 0-.71a.513.513 0 0 0-.71 0l-1.48 1.48C13.85 1.23 12.95 1 12 1c-.96 0-1.86.23-2.66.63L7.85.14a.501.501 0 0 0-.7 0c-.2.2-.2.52 0 .71l1.31 1.31C6.97 3.26 6 5 6 7h12c0-2-1-3.75-2.47-4.84M20.5 8A1.5 1.5 0 0 0 19 9.5v7a1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 20.5 8m-17 0A1.5 1.5 0 0 0 2 9.5v7A1.5 1.5 0 0 0 3.5 18 1.5 1.5 0 0 0 5 16.5v-7A1.5 1.5 0 0 0 3.5 8M6 18a1 1 0 0 0 1 1h1v3.5A1.5 1.5 0 0 0 9.5 24a1.5 1.5 0 0 0 1.5-1.5V19h2v3.5a1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5V19h1a1 1 0 0 0 1-1V8H6v10z" fill="#c0ca33"/></symbol><symbol viewBox="0 0 24 24" id="angular" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#e53935"/></symbol><symbol viewBox="0 0 24 24" id="angular-component" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#0288d1"/></symbol><symbol viewBox="0 0 24 24" id="angular-directive" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#ab47bc"/></symbol><symbol viewBox="0 0 24 24" id="angular-guard" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-pipe" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#00897b"/></symbol><symbol viewBox="0 0 24 24" id="angular-resolver" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-routing" xmlns="http://www.w3.org/2000/svg"><path d="M11 10H5L3 8l2-2h6V3l1-1 1 1v1h6l2 2-2 2h-6v2h6l2 2-2 2h-6v6a2 2 0 0 1 2 2H9a2 2 0 0 1 2-2V10z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-service" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#ffca28"/></symbol><symbol viewBox="0 0 100 100" id="apiblueprint" xmlns="http://www.w3.org/2000/svg"><title>api-blueprint</title><path d="M50.133 7.521A16.998 16.998 0 0 0 33.135 24.52a16.998 16.998 0 0 0 4.945 11.974L24.861 57.398a16.998 16.998 0 0 0-3.175-.308A16.998 16.998 0 0 0 4.688 74.088a16.998 16.998 0 0 0 16.998 16.998 16.998 16.998 0 0 0 16.998-16.998 16.998 16.998 0 0 0-7.063-13.773l12.576-19.89a16.998 16.998 0 0 0 5.936 1.093 16.998 16.998 0 0 0 6.154-1.155l12.537 19.83a16.998 16.998 0 0 0-7.244 13.895 16.998 16.998 0 0 0 16.998 17 16.998 16.998 0 0 0 16.998-17A16.998 16.998 0 0 0 78.578 57.09a16.998 16.998 0 0 0-2.95.262L62.337 36.327A16.998 16.998 0 0 0 67.13 24.52 16.998 16.998 0 0 0 50.132 7.522z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="applescript" xmlns="http://www.w3.org/2000/svg"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z" fill="#78909c"/></symbol><symbol viewBox="0 0 24 24" id="appveyor" xmlns="http://www.w3.org/2000/svg"><path d="M12 2c-.084 0-.165.008-.248.01a10 10 0 0 0-.266.01 9.952 9.952 0 0 0-.754.066 10 10 0 0 0-.148.018 9.855 9.855 0 0 0-.93.177 10 10 0 0 0-.07.02c-.196.049-.392.1-.584.16v.012a10 10 0 0 0-2 .875V3.34c-.02.012-.038.027-.059.039a10 10 0 0 0-.953.635c-.09.067-.172.142-.26.213a10 10 0 0 0-.628.546c-.109.104-.211.211-.315.319a10 10 0 0 0-.476.539c-.1.12-.201.237-.295.361a10 10 0 0 0-.52.766c-.088.143-.17.288-.252.435a10 10 0 0 0-.363.723c-.072.161-.136.327-.2.492a10 10 0 0 0-.269.778c-.02.067-.044.131-.062.199a10 10 0 0 0-.008.027c-.098.364-.166.728-.22 1.09-.012.077-.024.153-.034.23a9.85 9.85 0 0 0-.08 1.182c0 .03-.006.057-.006.086a10 10 0 0 0 .008.148c.001.094-.002.188.002.282l.011.004a10 10 0 0 0 .333 2.158l-.012-.004c.012.047.033.091.047.139a10 10 0 0 0 .322.955c.02.052.037.106.059.158a10 10 0 0 0 .503 1.035c.065.116.14.226.21.34a10 10 0 0 0 .423.64c.092.128.187.252.285.375a10 10 0 0 0 .448.52c.112.123.222.248.341.365a10 10 0 0 0 .803.719 10 10 0 0 0 .01.006c.099.078.207.146.309.22a10 10 0 0 0 .648.442c.138.085.28.163.424.242a10 10 0 0 0 .715.358c.114.051.226.106.343.154a10 10 0 0 0 1.133.389c.016.004.031.01.047.015a10 10 0 0 0 .461.098 10 10 0 0 0 .482.103 10 10 0 0 0 .418.051 10 10 0 0 0 .575.065 10 10 0 0 0 .144.005A10 10 0 0 0 12 22a10 10 0 0 0 .197-.01 10 10 0 0 0 .496-.025 10 10 0 0 0 .49-.043 10 10 0 0 0 .489-.074 10 10 0 0 0 .51-.098 10 10 0 0 0 .47-.12 10 10 0 0 0 .477-.14 10 10 0 0 0 .47-.172 10 10 0 0 0 .481-.197 10 10 0 0 0 .414-.201 10 10 0 0 0 .475-.252 10 10 0 0 0 .39-.238 10 10 0 0 0 .452-.301 10 10 0 0 0 .38-.291 10 10 0 0 0 .385-.315 10 10 0 0 0 .375-.347 10 10 0 0 0 .36-.363 10 10 0 0 0 .293-.334 10 10 0 0 0 .353-.434 10 10 0 0 0 .28-.393 10 10 0 0 0 .263-.4 10 10 0 0 0 .264-.461 10 10 0 0 0 .228-.436 10 10 0 0 0 .195-.437 10 10 0 0 0 .196-.48 10 10 0 0 0 .228-.69 10 10 0 0 0 .028-.094 10 10 0 0 0 .021-.066 10 10 0 0 0 .098-.461 10 10 0 0 0 .103-.482 10 10 0 0 0 .051-.418 10 10 0 0 0 .065-.575 10 10 0 0 0 .005-.144A10 10 0 0 0 22 12a10 10 0 0 0-.01-.197 10 10 0 0 0-.025-.496 10 10 0 0 0-.043-.49 10 10 0 0 0-.074-.489 10 10 0 0 0-.098-.51 10 10 0 0 0-.12-.47 10 10 0 0 0-.14-.477 10 10 0 0 0-.172-.47 10 10 0 0 0-.197-.481 10 10 0 0 0-.201-.414 10 10 0 0 0-.252-.475 10 10 0 0 0-.238-.39 10 10 0 0 0-.301-.452 10 10 0 0 0-.291-.38 10 10 0 0 0-.315-.385 10 10 0 0 0-.347-.375 10 10 0 0 0-.363-.36 10 10 0 0 0-.334-.293 10 10 0 0 0-.434-.353 10 10 0 0 0-.393-.28 10 10 0 0 0-.4-.263 10 10 0 0 0-.461-.264 10 10 0 0 0-.436-.228 10 10 0 0 0-.437-.196 10 10 0 0 0-.48-.195 10 10 0 0 0-.69-.228 10 10 0 0 0-.094-.028 10 10 0 0 0-.066-.021 10 10 0 0 0-.461-.098 10 10 0 0 0-.482-.103 10 10 0 0 0-.418-.051 10 10 0 0 0-.575-.065 10 10 0 0 0-.144-.005A10 10 0 0 0 12 2zm-.016 5.002a5 5 0 0 1 .262.01 5 5 0 0 1 .227.011 5 5 0 0 1 .341.05 5 5 0 0 1 .135.019 5 5 0 0 1 .014.004 5 5 0 0 1 .115.025 5 5 0 0 1 .303.076 5 5 0 0 1 .265.086 5 5 0 0 1 .2.074 5 5 0 0 1 .242.106 5 5 0 0 1 .228.11 5 5 0 0 1 .196.109 5 5 0 0 1 .244.15 5 5 0 0 1 .17.12 5 5 0 0 1 .224.171 5 5 0 0 1 .186.16 5 5 0 0 1 .176.164 5 5 0 0 1 .172.18 5 5 0 0 1 .177.203 5 5 0 0 1 .133.172 5 5 0 0 1 .16.223 5 5 0 0 1 .133.214 5 5 0 0 1 .12.21 5 5 0 0 1 .107.216 5 5 0 0 1 .109.24 5 5 0 0 1 .084.223 5 5 0 0 1 .08.242 5 5 0 0 1 .07.264 5 5 0 0 1 .047.207 5 5 0 0 1 .045.277 5 5 0 0 1 .028.227 5 5 0 0 1 .02.351 5 5 0 0 1 .003.079 5 5 0 0 1-.012.271 5 5 0 0 1-.011.227 5 5 0 0 1-.05.341 5 5 0 0 1-.019.135 5 5 0 0 1-.004.014 5 5 0 0 1-.025.115 5 5 0 0 1-.076.303 5 5 0 0 1-.086.265 5 5 0 0 1-.074.2 5 5 0 0 1-.106.242 5 5 0 0 1-.11.228 5 5 0 0 1-.109.196 5 5 0 0 1-.15.244 5 5 0 0 1-.12.17 5 5 0 0 1-.171.224 5 5 0 0 1-.16.186 5 5 0 0 1-.164.176 5 5 0 0 1-.18.172 5 5 0 0 1-.203.177l-.002.002c-.018.019-.028.035-.047.053l-3.959 5.09-3.05-.979a141.684 141.684 0 0 0 3.177-3.084 5 5 0 0 1-.103-.015 5 5 0 0 1-.149-.024 5 5 0 0 1-.115-.025 5 5 0 0 1-3.57-3.04 5.072 5.072 0 0 1-.206-.661 5 5 0 0 1-.033-.147c-.025-.118-.036-.24-.054-.36-.987.993-1.964 1.993-2.954 3.05l-.98-3.053 5.092-3.957c.043-.044.082-.07.125-.11a5 5 0 0 1 .71-.634c.18-.13.367-.25.561-.356a5 5 0 0 1 .16-.08 4.94 4.94 0 0 1 .516-.222 5 5 0 0 1 .147-.057c.211-.07.43-.123.654-.164a5 5 0 0 1 .172-.027c.236-.035.476-.058.722-.059zM12 9a3 3 0 0 0-.053.002 3 3 0 0 0-.166.01 3 3 0 0 0-.133.011 3 3 0 0 0-.17.026 3 3 0 0 0-.113.021 3 3 0 0 0-.19.05 3 3 0 0 0-.103.03 3 3 0 0 0-.16.057 3 3 0 0 0-.129.053 3 3 0 0 0-.146.072 3 3 0 0 0-.12.063 3 3 0 0 0-.132.082 3 3 0 0 0-.123.08 3 3 0 0 0-.116.088 3 3 0 0 0-.126.105 3 3 0 0 0-.1.094 3 3 0 0 0-.111.111 3 3 0 0 0-.096.107 3 3 0 0 0-.094.116 3 3 0 0 0-.098.136 3 3 0 0 0-.072.11 3 3 0 0 0-.076.133 3 3 0 0 0-.07.132 3 3 0 0 0-.063.14 3 3 0 0 0-.054.14 3 3 0 0 0-.077.228 3 3 0 0 0-.007.026 3 3 0 0 0-.03.138 3 3 0 0 0-.031.149 3 3 0 0 0-.014.11 3 3 0 0 0-.02.183 3 3 0 0 0-.001.052A3 3 0 0 0 9 12a3 3 0 0 0 .002.053 3 3 0 0 0 .01.166 3 3 0 0 0 .011.133 3 3 0 0 0 .026.17 3 3 0 0 0 .021.113 3 3 0 0 0 .05.19 3 3 0 0 0 .03.103 3 3 0 0 0 .057.16 3 3 0 0 0 .053.129 3 3 0 0 0 .072.146 3 3 0 0 0 .063.12 3 3 0 0 0 .082.132 3 3 0 0 0 .08.123 3 3 0 0 0 .088.116 3 3 0 0 0 .105.126 3 3 0 0 0 .094.1 3 3 0 0 0 .111.111 3 3 0 0 0 .107.096 3 3 0 0 0 .116.094 3 3 0 0 0 .136.098 3 3 0 0 0 .11.072 3 3 0 0 0 .133.076 3 3 0 0 0 .132.07 3 3 0 0 0 .135.06 3 3 0 0 0 .153.061 3 3 0 0 0 .216.07 3 3 0 0 0 .004.003 3 3 0 0 0 .026.007 3 3 0 0 0 .138.03 3 3 0 0 0 .149.031 3 3 0 0 0 .11.014 3 3 0 0 0 .183.02 3 3 0 0 0 .011.001 3 3 0 0 0 .041 0A3 3 0 0 0 12 15a3 3 0 0 0 .053-.002 3 3 0 0 0 .166-.01 3 3 0 0 0 .133-.011 3 3 0 0 0 .17-.026 3 3 0 0 0 .113-.021 3 3 0 0 0 .19-.05 3 3 0 0 0 .103-.03 3 3 0 0 0 .16-.057 3 3 0 0 0 .129-.053 3 3 0 0 0 .146-.072 3 3 0 0 0 .12-.063 3 3 0 0 0 .132-.082 3 3 0 0 0 .123-.08 3 3 0 0 0 .116-.088 3 3 0 0 0 .126-.105 3 3 0 0 0 .1-.094 3 3 0 0 0 .111-.111 3 3 0 0 0 .096-.107 3 3 0 0 0 .094-.116 3 3 0 0 0 .098-.136 3 3 0 0 0 .072-.11 3 3 0 0 0 .076-.133 3 3 0 0 0 .07-.132 3 3 0 0 0 .06-.135 3 3 0 0 0 .061-.153 3 3 0 0 0 .07-.216 3 3 0 0 0 .003-.004 3 3 0 0 0 .007-.026 3 3 0 0 0 .03-.138 3 3 0 0 0 .031-.149 3 3 0 0 0 .002-.008 3 3 0 0 0 .012-.101 3 3 0 0 0 .02-.184 3 3 0 0 0 .001-.011 3 3 0 0 0 0-.041A3 3 0 0 0 15 12a3 3 0 0 0-.002-.053 3 3 0 0 0-.01-.166 3 3 0 0 0-.011-.133 3 3 0 0 0-.026-.17 3 3 0 0 0-.021-.113 3 3 0 0 0-.05-.19 3 3 0 0 0-.03-.103 3 3 0 0 0-.057-.16 3 3 0 0 0-.053-.129 3 3 0 0 0-.072-.146 3 3 0 0 0-.063-.12 3 3 0 0 0-.082-.132 3 3 0 0 0-.08-.123 3 3 0 0 0-.088-.116 3 3 0 0 0-.105-.126 3 3 0 0 0-.094-.1 3 3 0 0 0-.111-.111 3 3 0 0 0-.107-.096 3 3 0 0 0-.116-.094 3 3 0 0 0-.136-.098 3 3 0 0 0-.11-.072 3 3 0 0 0-.133-.076 3 3 0 0 0-.132-.07 3 3 0 0 0-.14-.063 3 3 0 0 0-.14-.054 3 3 0 0 0-.228-.077 3 3 0 0 0-.026-.007 3 3 0 0 0-.138-.03 3 3 0 0 0-.149-.031 3 3 0 0 0-.008-.002 3 3 0 0 0-.101-.012 3 3 0 0 0-.184-.02 3 3 0 0 0-.011-.001 3 3 0 0 0-.041 0A3 3 0 0 0 12 9z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 720 720" id="arduino" xmlns="http://www.w3.org/2000/svg"><defs><symbol id="ana" preserveAspectRatio="xMinYMin meet" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke-opacity="100%" stroke-width="60" stroke="#00979c" d="M174 30a10.5 10.1 0 0 0 0 280C364 320 344 30 544 30a10.5 10.1 0 0 1 0 280C354 320 374 30 174 30"/><path d="M528 205v-32.8h-32.5v-13.7H528V126h13.9v32.5h32.5v13.7h-32.5V205H528z" text-anchor="middle" fill="#00979c" stroke-width="20" stroke="#00979c" font-family="sans-serif" font-size="167"/><path fill="#00979c" stroke="#00979c" stroke-width="23.6" transform="matrix(1.56 0 0 .64 -366 .528)" d="M321 266v-17.4h53.3V266H321z"/></symbol></defs><title>Layer 1</title><use x="20.063" y="360.85" transform="matrix(.997 0 0 .997 -18.596 -159.19)" xlink:href="#ana"/></symbol><symbol viewBox="0 0 24 24" id="assembly" xmlns="http://www.w3.org/2000/svg"><path d="M1.746 1.566v20.905H5.13v-2.088H3.438V3.656h1.69v-2.09H1.747zm17.219 0v2.09h1.693v16.727h-1.693v2.09h3.383V1.566h-3.383zM15.196 3.988c-.5 0-.93.076-1.29.225-.359.15-.652.372-.877.671-.226.302-.39.673-.494 1.108a6.715 6.715 0 0 0-.155 1.54c0 .573.049 1.083.15 1.528.1.442.264.811.49 1.11.222.298.512.524.872.676.36.153.795.23 1.304.23.518 0 .954-.075 1.308-.224.353-.153.643-.376.869-.671.219-.29.38-.661.484-1.112.104-.454.156-.967.156-1.54 0-.573-.052-1.079-.152-1.515a2.92 2.92 0 0 0-.485-1.106 2.09 2.09 0 0 0-.868-.686c-.354-.155-.79-.234-1.312-.234zm-6.814.12a.941.941 0 0 1-.138.458.849.849 0 0 1-.356.296A1.71 1.71 0 0 1 7.385 5a5.244 5.244 0 0 1-.631.037v1.11H8.19v3.6H6.754v1.188h4.545V9.745H9.894V4.11H8.382zm6.814 1.138c.375 0 .643.176.805.527.161.348.241.933.241 1.756 0 .814-.082 1.399-.247 1.756-.164.356-.43.534-.799.534-.369 0-.636-.178-.8-.534-.165-.357-.248-.941-.248-1.749 0-.829.082-1.415.243-1.763.162-.35.43-.527.805-.527zm-6.33 7.64c-.5 0-.93.073-1.29.223-.359.15-.651.374-.877.673-.225.302-.39.67-.494 1.106a6.715 6.715 0 0 0-.155 1.54c0 .573.05 1.082.15 1.527.1.442.264.814.49 1.112.222.3.514.525.874.677.36.152.793.229 1.302.229.519 0 .954-.076 1.308-.225.354-.153.643-.376.869-.672.22-.29.38-.66.484-1.111.104-.455.156-.967.156-1.54 0-.573-.05-1.079-.15-1.515a2.923 2.923 0 0 0-.487-1.106 2.084 2.084 0 0 0-.867-.686c-.353-.156-.791-.232-1.313-.232zm5.846.119a.941.941 0 0 1-.138.457.85.85 0 0 1-.356.296 1.71 1.71 0 0 1-.503.137 5.245 5.245 0 0 1-.631.037v1.112h1.435v3.597h-1.435v1.189h4.545v-1.189h-1.405v-5.636h-1.512zm-5.846 1.137c.375 0 .643.176.805.527.162.347.241.933.241 1.756 0 .813-.08 1.399-.245 1.755-.164.357-.432.534-.8.534-.37 0-.637-.177-.802-.534-.164-.356-.245-.939-.245-1.746 0-.83.08-1.418.242-1.765.161-.35.43-.527.804-.527z" fill="#ff6e40"/></symbol><symbol viewBox="0 0 24 24" id="aurelia" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="api" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#apa"/><linearGradient id="apa" x1="-3.881" x2="2.377" y1="-1.442" y2="4.304"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#apb"/><linearGradient id="apb" x1=".729" x2="-.971" y1=".844" y2="-1.477"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="apk" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#apc"/><linearGradient id="apc" x1="-2.839" x2="2.875" y1="-6.936" y2="1.017"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apl" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#apd"/><linearGradient id="apd" x1="-8.212" x2="1.02" y1="-4.691" y2="2.882"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apm" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#ape"/><linearGradient id="ape" x1="-1.404" x2="4.19" y1="-2.309" y2="2.62"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apn" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#apf"/><linearGradient id="apf" x1="1.911" x2=".204" y1="2.539" y2=".204"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="apo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#apg"/><linearGradient id="apg" x1="-3.881" x2="2.377" y1="-1.738" y2="5.19"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="app" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#aph"/><linearGradient id="aph" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><g transform="rotate(11.282 -1.694 21.569) scale(.47102)" clip-rule="evenodd" fill="none" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#api)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#apj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#apk)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#apl)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#apm)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#apn)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#apo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#app)"/></g></symbol><symbol viewBox="0 0 24 24" id="autohotkey" xmlns="http://www.w3.org/2000/svg"><path d="M5 3c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H5zm3.668 3.447a.9.9 0 0 1 .652.256.84.84 0 0 1 .262.625c0 .34-.014.852-.041 1.537-.022.68-.033 1.19-.033 1.53 0 .111-.016.326-.047.644a6.149 6.149 0 0 0-.033.68l2.578-.485c1.007-.179 1.874-.281 2.603-.308.018-.3.048-1.105.088-2.416.01-.345.115-.742.317-1.19.25-.55.533-.826.851-.826.237 0 .448.08.631.236.197.17.295.382.295.637a.775.775 0 0 1-.025.201c-.09.327-.135.612-.135.854 0 .125-.014.32-.041.584-.023.26-.033.453-.033.578 0 .425-.022 1.056-.067 1.893a38.963 38.963 0 0 0-.068 1.892c0 .327.025.816.074 1.465.05.649.074 1.136.074 1.463a.84.84 0 0 1-.261.625.893.893 0 0 1-.65.254 1 1 0 0 1-.686-.254.777.777 0 0 1-.29-.611c0-.327-.015-.818-.046-1.471a39.552 39.552 0 0 1-.041-1.47c0-.256.004-.482.013-.679-.702.032-1.57.142-2.603.33-.86.157-1.719.316-2.578.477-.01.304-.042.812-.096 1.523a22.354 22.354 0 0 0-.066 1.538.84.84 0 0 1-.262.625.893.893 0 0 1-.65.253.898.898 0 0 1-.653-.253.84.84 0 0 1-.262-.625c0-.452.038-1.128.114-2.028.08-.9.12-1.575.12-2.027 0-.573.015-1.436.042-2.586.027-1.155.04-2.017.04-2.59a.84.84 0 0 1 .263-.625.895.895 0 0 1 .65-.256z" fill="#4caf50"/></symbol><symbol viewBox="0 0 24 24" id="autoit" xmlns="http://www.w3.org/2000/svg"><defs id="ardefs8"><style id="arstyle4482">.cls-1{fill:#5d83ac}.cls-2{fill:#f0f0f0;fill-rule:evenodd}</style><style id="arstyle4510">.cls-1{fill:#5d83ac}.cls-2{fill:#f0f0f0;fill-rule:evenodd}</style></defs><g id="arg4522" transform="translate(-59.538 -26.404) scale(.0555)"><path d="M12.8 2.133A10.666 10.666 0 0 0 2.136 12.799 10.666 10.666 0 0 0 12.8 23.465a10.666 10.666 0 0 0 10.668-10.666A10.666 10.666 0 0 0 12.8 2.133zm.15 4.713c.456 0 .836.105 1.142.314.306.21.565.469.78.78l6.089 8.812H9.627l1.82-2.506h3.36c.315 0 .589.01.822.03a11.93 11.93 0 0 1-.473-.663 39.13 39.13 0 0 0-.517-.75l-1.748-2.578-4.577 6.467H4.746l6.25-8.813c.204-.281.46-.534.772-.757.31-.224.705-.336 1.181-.336z" transform="matrix(16.89188 0 0 16.89188 1072.761 475.745)" id="arcircle4514" fill="#1976d2" stroke-width=".026"/></g></symbol><symbol viewBox="0 0 213.33333 213.33333" id="babel" xmlns="http://www.w3.org/2000/svg"><path d="M50.22 199.659c-.875-.406-1.261-1.6-.857-2.652.404-1.053.12-1.914-.63-1.914s-1.615.748-1.92 1.663c-.328.983-1.27.302-2.304-1.667-.962-1.831-3.718-5.533-6.126-8.226-9.418-10.535-7.71-27.444 5.432-53.77 12.459-24.96 23.117-39.033 45.966-60.696 30.229-28.66 52.679-46.223 70.587-55.22 10.98-5.518 13.025-5.059 2.778.624-11.004 6.102-11.378 6.359-10.512 7.226.33.33 7.306-2.67 15.504-6.667 15.87-7.737 16.34-7.912 16.34-6.082 0 .652-4.95 3.738-11 6.858-13.062 6.736-12.722 6.48-10.472 7.872 1.117.69 5.428-.582 11.54-3.406 5.367-2.48 10.397-4.508 11.179-4.508 2.755 0-3.928 5.302-11.541 9.157-20.437 10.35-68.937 46.043-68.07 50.097.166.777-5.792 7.639-13.241 15.248-15.257 15.587-26.14 30.002-33.748 44.706-6.379 12.326-7.457 17.734-5.385 26.996 3.482 15.56 11.592 18.366 31.482 10.895 28.228-10.603 45.758-28.704 47.022-48.556.602-9.442-1.317-13.479-8.52-17.93-4.01-2.48-5.268-2.621-12.065-1.365-4.173.771-10.153 2.906-13.289 4.744s-6.455 3.34-7.377 3.34c-.922 0-3.216 1.336-5.096 2.968-1.88 1.633.48-1.13 5.247-6.14 6.82-7.167 7.956-8.9 5.333-8.132-5.208 1.525-10.194 4.33-15.649 8.803-2.76 2.264-.923.175 4.08-4.641 11.565-11.131 21.183-15.97 33.088-16.641 17.097-.966 27.254 5.805 31.964 21.31 2.435 8.017 2.609 10.24 1.353 17.37-1.65 9.361-7.034 21.553-15.593 35.307-4.398 7.067-8.434 11.427-15.588 16.844-9.166 6.94-15.654 11.02-15.654 9.845 0-.295 2.455-2.161 5.455-4.147 8.818-5.835 5.075-5.377-8.326 1.02-6.854 3.27-15.199 6.593-18.542 7.38-7.106 1.675-30.527 3.164-32.846 2.089zm-8.408-19.899c0-1.1-.6-2-1.333-2-.734 0-1.334.9-1.334 2s.6 2 1.333 2c.734 0 1.334-.9 1.334-2zm89.255-8.204c1.53-1.945 2.473-3.845 2.097-4.222-.377-.377-.836-.435-1.02-.13-.182.306-1.787 2.206-3.565 4.223-1.778 2.016-2.571 3.666-1.763 3.666s2.72-1.591 4.25-3.536zm-77.644-1.745c-.82-2.172-1.74-3.7-2.045-3.396-.951.952 1.088 7.345 2.343 7.345.656 0 .522-1.777-.298-3.95zm82.303-27.915c-.837-.837-3.217 2.55-3.184 4.53.012.734.896.178 1.965-1.235 1.07-1.413 1.618-2.896 1.219-3.295zm-66.238-36.904c-1.312-1.312-3.676.702-3.676 3.133 0 2.035.175 2.031 2.254-.047 1.24-1.24 1.88-2.628 1.422-3.086zm39.657.768c4.403-2.196 6.8-3.986 5.333-3.982-2.838.01-16.667 6.028-16.667 7.254 0 1.6 3.717.527 11.333-3.272zm16.667-5.333c0-.733-.9-1.333-2-1.333s-2 .6-2 1.333.9 1.333 2 1.333 2-.6 2-1.333zm-3.334-3.923l5.334-1.104-7.334-.133c-4.033-.073-8.233.45-9.333 1.16-2.539 1.64 3.572 1.682 11.333.077zm35.738-63.976c2.788-1.69 4.765-3.376 4.393-3.748-.947-.947-11.942 5.654-14.237 8.548-1.792 2.258-1.714 2.276 1.44.329a1452.76 1452.76 0 0 1 8.403-5.13z" fill="#ffca28" stroke-width="1.333"/></symbol><symbol viewBox="0 0 400 400" fill-opacity=".05" id="bithound" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.88 0 0 .88 24.121 2.895)" fill="#e53935" fill-opacity="1"><path d="M370.5 207c-1.5-14.8-4.8-29.9-9.5-44-13.5-40.3-38.6-81.6-70.3-110.1-1.4-1.2-6.7-4.4-8.7-3.3-5.2 2.9 4.6 22.8 5.8 26.4 7.4 22 12.1 45.3 6.8 68.3-7.1 30.4-30.4 51.7-61.5 54.3-17.1 1.4-34.3-.5-51.4 1.5-25.6 3-51.7 11.8-68 32.8-1.9 2.4-3.6 5.1-5.2 7.9h-.4c-6.3.7-12.6-2-15.7-3.7-.8-.5-1.6-.9-2.2-1.2-19-10.5-33-34-41.6-53.4-3.9-9-7.2-18.4-9.3-27.9-1-4.3-1.1-8.8-1.3-13.2-.1-2.7.3-6.5-1.2-8.9-3.3-5.2-7.5-.2-8.2 4-1.1 6.9-2.1 13.7-1.8 20.7.5 11.8 3.8 23.5 8 34.5 6.2 16.2 14.9 31.1 26.2 44.4 4.7 5.5 9.7 10.6 15.1 15.3 4.8 4.3 10.9 7.7 14.5 13.2 4.2 6.3 4.9 14.1 4.5 21.4-1 19.3-1.6 37.4 3.9 56.2 4.8 16.7 10.8 33.8 20.8 48.1 5 7.1 11.2 14.6 18 19.9 4.6 3.6 13.3 4 8.3-9.2-11.1-29.3-12.1-59.7 5.2-87.1 14.5-22.8 40.1-43.1 69-39.5 42.5 5.3 72.1 44.3 70 86-.6 11.7-1 21.7-4.7 32.7-1.5 4.4-2.6 10-1.5 14.6 1.8 7.8 10.5 4.9 14.3-.2 10.3-14 21.1-27.6 30.8-42 31.6-47.2 47-101.8 41.3-158.5z"/><path d="M132.4 92.1c.7 2.3 1.4 4.8 1.9 7.5.1 1.1.4 2.3 1 3.4 2.6 6.8 8.9 10.5 14.8 14 3.6 2.2 10.1 4.3 14.1 5.9 5.2 2.1 16.4-.6 21.7-1 12.2-1 23.5-5.3 34.7 1.2-57.4 67.3-3.2 82.3 38.8 49.9 48-37 2.8-124.3 2.8-124.3s-1-6.8-19.2-10.8c-1.7-.9-3.4-1.7-5.1-2.4-18-8.3-34.2 5.3-47.2 16.4-3.8 3.2-7.5 6.4-11.5 9.4-5.4 4-11.2 7.3-17.3 10.2-6.4 3-14 6.4-21.1 6.7-1 0-2.9.2-4.9.6-3.1.3-4.7 1.1-5.4 2.5-1.2 1-2 2.4-1.8 4.2.2 2.5 1.4 4.6 2.7 6.2.4.1.7.3 1 .4z"/></g></symbol><symbol viewBox="0 0 400.00001 399.99999" id="bower" xmlns="http://www.w3.org/2000/svg"><g transform="translate(12.061 33.203) scale(.81733)"><path d="M447.61 200.08c-23.139-22.234-138.85-36.114-175.36-40.154a107.137 107.137 0 0 0 4.517-12.944 146.107 146.107 0 0 1 15.905-5.901c.677 1.997 3.865 9.648 5.682 13.279 73.415 2.025 77.184-54.557 80.17-70.058 2.92-15.157 2.771-29.802 27.953-56.575-37.516-10.933-91.467 16.945-109.54 58.437-6.79-2.545-13.597-4.424-20.328-5.586-4.824-19.46-29.944-73.672-95.863-73.672-83.46 0-174.43 68.853-174.43 185.41 0 97.976 66.891 183.84 104.68 183.84 16.505 0 30.703-12.36 34.036-23.44 2.795 7.597 11.368 31.213 14.184 37.225 4.162 8.89 23.41 16.583 31.833 7.357 10.83 6.017 30.703 9.641 41.534-6.405 20.86 4.412 39.3-8.026 39.702-22.868 10.235-.546 15.256-14.918 13.021-26.363-1.647-8.426-19.248-38.66-26.113-49.098 13.59 11.054 48.013 14.183 52.194.007 21.911 17.198 56.057 8.171 58.765-5.815 26.624 6.917 57.16-8.276 52.146-26.676 42.771-2.958 37.296-48.464 25.296-59.996z" fill="#543729" stroke-width=".973"/><path d="M328.514 103.025c9.212-18.277 20.788-38.234 35.409-50.58-16.093 6.485-31.981 25.873-41.375 46.595a144.914 144.914 0 0 0-14.552-8.132c13.105-27.972 43.555-51.332 77.112-53.157-22.477 20.385-14.498 62.754-32.979 85.183-5.288-5.311-17.43-15.562-23.615-19.909zm-14.53 29.762c.01-.7.272-6.094.763-8.557-1.288-.304-9.3-1.87-13.476-1.772-.304 5.245 2.204 14.17 4.684 19.541 17.075-.358 29.408-5.471 36.667-10.172-6.18-2.88-16.726-5.442-24.745-6.974-.894 1.851-3.097 6.568-3.892 7.934z" fill="#00acee"/><g stroke-width=".973"><path d="M250.54 277.39c.004.024.015.057.018.082-2.165-4.657-4.463-10.314-7.208-17.708 10.688 15.557 44.184 7.533 42.427-6.407 16.395 12.336 50.143-2.055 42.471-19.353 16.423 7.653 35.168-7.745 30.964-14.455 28 5.4 54.832 10.783 63.256 12.938-5.595 9.123-18.339 15.566-37.549 11.089 10.38 14.14-9.773 31.105-37.844 21.76 6.18 13.883-18.814 26.38-47.22 11.91.361 13.889-35.24 15.488-49.315.143zm55.543-70.194c32.497 2.495 86.238 7.34 119.51 11.997-2.102-10.828-7.844-13.921-25.905-18.772-19.425 2.072-68.706 6.913-93.604 6.776z" fill="#2baf2b"/><path d="M285.78 253.36c16.395 12.336 50.143-2.055 42.471-19.353 16.423 7.653 35.168-7.745 30.964-14.455-33.103-6.383-67.84-12.788-75.719-13.908 4.78.254 12.702.797 22.59 1.556 24.899.137 74.18-4.704 93.604-6.775-31.452-7.975-95.666-19.613-140.01-22.48-2.055 3.003-5.833 8.097-12.413 13.51-19.403 41.053-54.557 68.34-93.454 68.34-11.335 0-24.018-1.912-38.233-6.456-8.865 9.497-46.661 16.694-77.329 1.641 24.326 56.961 80.74 94.984 143.19 94.984 52.591 0 75.912-53.704 70.808-67.914-1.238-3.45-6.145-14.889-8.891-22.283 10.689 15.556 44.185 7.532 42.429-6.408z" fill="#ffcc2f"/><path d="M253.91 145.27c4.644-2.526 20.69-12.253 35.981-15.908a67.843 67.843 0 0 1-.536-5.12c-10.032 2.403-28.945 10.51-39.784-.661 22.866 6.9 34.283-6.149 51.09-6.149 10.014 0 24.305 2.798 35.57 7.22-9.061-8.37-38.772-33.63-75.558-33.717-8.213 9.957-17.09 31.526-6.764 54.334z" fill="#cecece"/><path d="M115.58 253.33c14.215 4.544 26.898 6.457 38.233 6.457 38.896 0 74.05-27.29 93.454-68.341-14.351 11.978-39.291 22.228-78.241 22.228 34.694-7.866 64.56-25.156 79.753-50.427-10.68-16.998-22.263-54.603 7.07-84.33-4.512-14.497-26.475-52.766-75.095-52.766-84.85 0-155.17 71.001-155.17 166.15 0 22.525 4.547 43.65 12.67 62.664 30.666 15.054 68.462 7.858 77.327-1.64z" fill="#ef5734"/><path d="M141.03 108.45c0 21.644 17.546 39.191 39.19 39.191s39.192-17.548 39.192-39.191c0-21.644-17.548-39.191-39.192-39.191-21.644 0-39.19 17.547-39.19 39.191z" fill="#ffcc2f"/><path d="M156.76 108.45c0 12.958 10.507 23.463 23.463 23.463 12.96 0 23.464-10.506 23.464-23.463 0-12.959-10.504-23.464-23.464-23.464-12.957 0-23.463 10.506-23.463 23.464z" fill="#543729"/><ellipse cx="180.22" cy="98.044" rx="13.673" ry="8.501" fill="#fff"/></g></g></symbol><symbol viewBox="0 0 140 140" id="browserlist" xmlns="http://www.w3.org/2000/svg"><title>Browserslist logo</title><path d="M70.314 10.066a59.828 59.828 0 0 0-59.828 59.828 59.828 59.828 0 0 0 59.828 59.828 59.828 59.828 0 0 0 59.828-59.828 59.828 59.828 0 0 0-59.828-59.828zm-4.836 8.785c.496 4.043 1.352 7.322 2.572 10.223 4.779-4.287 10.265-7.546 16.041-9.02-.981 3.938-1.357 7.295-1.261 10.43 6.026-2.314 12.349-3.404 18.3-2.706-3.182 2.413-5.482 4.717-7.128 7.015-2.201 12.074 6.858 20.43 14.779 24.551a5.128 5.128 0 0 1 5.183-3.888 5.128 5.128 0 0 1 3.7 8.435v.002c-.487 1.055-2.002 2.343-3.497 3.219-4.075 2.39-11.172 5.736-20.914 7.39.045 1.214.077 2.453.077 3.747 0 4.817-.485 8.291-1.385 10.699-3.3 13.313-12.648 26.76-24.695 31.95.357-4.083.197-7.485-.402-10.591-5.582 3.218-11.646 5.278-17.623 5.52h-.002c1.785-3.662 2.855-6.878 3.412-9.976-6.347.996-12.727.742-18.377-1.17 2.93-2.732 5.054-5.314 6.673-7.96-6.292-1.344-12.169-3.87-16.766-7.686 3.822-1.544 6.795-3.239 9.3-5.197-5.426-3.517-10.034-7.998-12.972-13.23 4.012-.07 7.321-.568 10.3-1.453-3.786-5.215-6.468-11.032-7.333-16.951 3.861 1.405 7.196 2.133 10.36 2.355-1.662-6.22-2.081-12.605-.768-18.436 3.03 2.634 5.824 4.48 8.63 5.815.678-6.406 2.576-12.52 5.893-17.496 1.926 3.622 3.914 6.391 6.111 8.672 2.93-5.754 6.9-10.798 11.791-14.262zm26.465 19.557c-2.395 5.514-1.665 11.297-.555 18.732a2.138 2.138 0 0 0 .28-4.178 3.419 3.419 0 1 1 .092 6.704c.574 3.882 1.157 8.18 1.421 13.125a67.143 67.143 0 0 0 3.25-.649c6.616-1.487 12.258-3.801 16.871-6.506.45-.264.884-.563 1.276-.867.366-.557.333-.957.035-1.285-4.831-1.245-10.891-4.53-15.258-8.795-4.764-4.653-7.428-10.164-7.412-16.281z" fill="#ffca28" stroke-width=".855"/></symbol><symbol viewBox="0 0 140 140" id="browserlist_light" xmlns="http://www.w3.org/2000/svg"><title>Browserslist logo</title><g transform="translate(10.823 10.1)" stroke-width=".855"><circle cx="59.492" cy="59.795" r="59.828" fill="#ffca28"/><path d="M54.656 8.752c-4.89 3.464-8.862 8.508-11.791 14.262-2.198-2.28-4.185-5.05-6.111-8.672-3.318 4.976-5.216 11.09-5.893 17.496-2.807-1.335-5.6-3.18-8.63-5.814-1.314 5.83-.895 12.216.767 18.436-3.164-.223-6.498-.95-10.36-2.356.865 5.92 3.548 11.737 7.333 16.951-2.978.885-6.287 1.383-10.3 1.453 2.939 5.233 7.547 9.714 12.972 13.23-2.505 1.959-5.478 3.654-9.299 5.198 4.596 3.815 10.474 6.341 16.766 7.685-1.62 2.647-3.743 5.228-6.674 7.96 5.65 1.912 12.03 2.166 18.377 1.17-.556 3.098-1.626 6.314-3.412 9.975h.002c5.977-.24 12.042-2.3 17.623-5.52.6 3.108.76 6.51.402 10.593 12.047-5.19 21.395-18.638 24.695-31.951.9-2.408 1.385-5.881 1.385-10.7 0-1.293-.031-2.531-.076-3.745 9.742-1.655 16.839-5.001 20.914-7.39 1.494-.877 3.01-2.165 3.496-3.22v-.002a5.128 5.128 0 0 0-3.7-8.435 5.128 5.128 0 0 0-5.183 3.889c-7.92-4.122-16.98-12.477-14.779-24.551 1.646-2.299 3.947-4.603 7.13-7.016-5.952-.698-12.276.392-18.302 2.707-.095-3.135.28-6.492 1.262-10.43-5.776 1.473-11.262 4.733-16.041 9.02-1.22-2.902-2.076-6.18-2.572-10.223zm26.465 19.557c-.015 6.117 2.648 11.628 7.412 16.281 4.366 4.265 10.426 7.55 15.258 8.795.298.328.331.728-.035 1.285-.392.304-.825.603-1.275.867-4.613 2.704-10.256 5.019-16.871 6.506-1.071.24-2.154.458-3.25.649-.265-4.945-.848-9.243-1.422-13.125a3.419 3.419 0 1 0-.092-6.703 2.138 2.138 0 0 1-.28 4.177c-1.11-7.435-1.84-13.218.555-18.732z" fill="#37474f"/></g></symbol><symbol viewBox="0 0 24 24" id="bucklescript" xmlns="http://www.w3.org/2000/svg"><path d="M3 3v18h18V3H3zm14.1 8.858a5.5 5.5 0 0 1 1.26.145c.417.093.778.213 1.082.357v1.723h-.18a3.281 3.281 0 0 0-.959-.603 2.867 2.867 0 0 0-1.155-.247c-.14 0-.277.011-.416.035a1.4 1.4 0 0 0-.395.12.756.756 0 0 0-.291.231.54.54 0 0 0-.123.348c0 .198.065.35.196.456.13.104.376.2.738.288.237.057.466.11.683.164.22.054.455.128.706.222.496.188.86.444 1.095.77.238.32.357.738.357 1.253 0 .737-.271 1.336-.813 1.798-.538.46-1.27.689-2.197.689a5.447 5.447 0 0 1-1.402-.161 6.725 6.725 0 0 1-1.117-.416v-1.794h.183c.344.318.73.563 1.155.734.429.17.839.256 1.233.256.1 0 .235-.01.4-.03.166-.02.3-.055.403-.102a.97.97 0 0 0 .313-.225c.084-.09.127-.223.127-.4a.568.568 0 0 0-.183-.424c-.119-.12-.294-.213-.526-.276-.243-.067-.5-.128-.773-.185a5.523 5.523 0 0 1-.76-.227c-.544-.204-.936-.48-1.177-.828-.237-.351-.357-.786-.357-1.305 0-.697.27-1.265.81-1.703.54-.442 1.235-.663 2.083-.663zm-8.981.135h2.51c.521 0 .903.02 1.143.06.243.041.484.13.721.266.246.144.43.338.548.583.121.24.181.518.181.83 0 .36-.082.68-.247.959a1.697 1.697 0 0 1-.7.642v.04c.423.098.758.298 1.004.603.249.305.373.706.373 1.205 0 .361-.063.686-.19.97-.125.285-.296.52-.516.707a2.31 2.31 0 0 1-.845.472c-.304.094-.69.141-1.159.141H8.12v-7.478zm1.659 1.372v1.582h.262c.263 0 .486-.007.672-.017.185-.01.332-.043.44-.1.15-.077.248-.175.294-.295.046-.124.07-.266.07-.427a.91.91 0 0 0-.083-.371.518.518 0 0 0-.282-.277 1.187 1.187 0 0 0-.456-.086c-.18-.007-.433-.01-.76-.01h-.157zm0 2.873V18.1H9.9c.469 0 .804-.002 1.007-.006.202-.003.39-.046.56-.13a.712.712 0 0 0 .357-.33c.067-.142.099-.302.099-.483 0-.237-.04-.42-.121-.547-.078-.13-.214-.228-.405-.291a1.842 1.842 0 0 0-.538-.072 49.47 49.47 0 0 0-.716-.003h-.366z" fill="#26a69a" stroke-width="1.067"/></symbol><symbol viewBox="0 0 24 24" id="c" xmlns="http://www.w3.org/2000/svg"><path d="M15.45 15.97l.42 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.14-1.27-1.68-2.88-1.68-4.83C6 9.9 6.68 8.13 8 6.89 9.28 5.64 10.92 5 12.9 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.6 2.49-1.04-.34c-.4-.1-.87-.15-1.4-.15-1.15-.01-2.11.36-2.86 1.1-.76.73-1.14 1.85-1.18 3.34.01 1.36.37 2.42 1.08 3.2.71.77 1.7 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.09-.32z" fill="#0277bd"/></symbol><symbol viewBox="0 0 300 300" id="cabal" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -822.52)" fill-rule="evenodd" color="#000"><rect transform="matrix(-.98339 .18149 .60192 .79856 0 0)" x="405.55" y="967.22" width="107.25" height="156.59" rx="12.306" ry="12.31" fill="#2d9bbd"/><rect transform="matrix(-.98528 .17093 -.59175 .80612 0 0)" x="-1156.5" y="1461.9" width="108.34" height="123.15" rx="10.69" ry="12.31" fill="#4a4bcd"/><path d="M52.112 965.158c-1.343 3.515-26.292 23.248-25.744 27.277.548 4.03 29.812 16.023 32.04 19.027s10.545 41.668 13.603 42.5 18.828-31.274 21.548-32.932c2.72-1.658 32.808 2.503 34.15-1.01 1.343-3.515-18.174-35.352-18.721-39.381-.548-4.03 9.732-40.12 7.502-43.125-2.229-3.005-30.06 9.427-33.118 8.594-3.059-.833-26.793-27.3-29.514-25.643-2.72 1.657-.405 41.177-1.747 44.693z" fill="#2e5bc1"/></g></symbol><symbol viewBox="0 0 24 24" id="cake" xmlns="http://www.w3.org/2000/svg"><path d="M12.254 6.621a1.807 1.807 0 0 0 1.808-1.807c0-.344-.09-.66-.262-.932l-1.546-2.684-1.546 2.684a1.72 1.72 0 0 0-.262.932 1.808 1.808 0 0 0 1.808 1.807m4.158 9.04l-.967-.976-.976.976c-1.175 1.166-3.236 1.175-4.42 0l-.959-.976-.994.976a3.134 3.134 0 0 1-3.977.353v4.167a.904.904 0 0 0 .904.904h14.463a.904.904 0 0 0 .904-.904v-4.167a3.134 3.134 0 0 1-3.977-.353m1.265-6.328h-4.52V7.525H11.35v1.808H6.83a2.712 2.712 0 0 0-2.711 2.712v1.392c0 .977.795 1.772 1.771 1.772.489 0 .94-.18 1.248-.515l1.952-1.926 1.908 1.926c.669.669 1.835.669 2.504 0l1.916-1.926 1.944 1.926c.316.334.768.515 1.247.515.976 0 1.78-.795 1.78-1.772v-1.392a2.712 2.712 0 0 0-2.711-2.712z" fill="#ff7043" stroke-width=".904"/></symbol><symbol viewBox="0 0 24 24" id="certificate" xmlns="http://www.w3.org/2000/svg"><path d="M4 3c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H4m8 2l3 2 3-2v3.5l3 1.5-3 1.5V15l-3-2-3 2v-3.5L9 10l3-1.5V5M4 5h5v2H4V5m0 4h3v2H4V9m0 4h5v2H4v-2z" fill="#ff5722"/></symbol><symbol viewBox="0 0 24 24" id="changelog" xmlns="http://www.w3.org/2000/svg"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 24 24" id="clojure" xmlns="http://www.w3.org/2000/svg"><path d="M3.355 1.78c-.845 0-1.525.68-1.525 1.525v17.441c0 .845.68 1.525 1.525 1.525h17.442c.845 0 1.525-.68 1.525-1.525V3.305c0-.845-.68-1.526-1.525-1.526H3.355zm6.168 2.572h1.963l6.368 14.931H15.93l-3.38-8.086-3.349 8.086H7.21l4.346-10.38-2.032-4.551z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="cmake" xmlns="http://www.w3.org/2000/svg"><path d="M11.99 2.965L2.977 20.999l9.874-8.47-.863-9.564z" fill="#1e88e5"/><path d="M12.007 2.963l.002.29 1.312 14.498-.001.006.023.26 7.362 2.979h.416l-.158-.311-.114-.228h-.002l-8.84-17.494z" fill="#e53935"/><path d="M8.607 16.11L2.98 20.995h17.743v-.016L8.607 16.11z" fill="#7cb342"/></symbol><symbol class="bfmain_logo__svg" viewBox="0 0 300 300.00001" id="code-climate" xmlns="http://www.w3.org/2000/svg"><path class="bfsymbol" d="M196.19 75.562l-51.846 51.561 30.766 30.766 21.08-21.08 59.252 59.537 30.481-30.766zm-61.246 60.961l-30.481-30.481-78.053 78.053-11.964 11.964 30.766 30.766 11.964-12.249 39.596-39.312 7.691-7.691 30.481 30.48 28.772 28.773 30.766-30.766-28.772-28.772z" fill="#eee" stroke-width="2.849"/></symbol><symbol class="bgmain_logo__svg" viewBox="0 0 300 300.00001" id="code-climate_light" xmlns="http://www.w3.org/2000/svg"><path class="bgsymbol" d="M196.19 75.562l-51.846 51.561 30.766 30.766 21.08-21.08 59.252 59.537 30.481-30.766zm-61.246 60.961l-30.481-30.481-78.053 78.053-11.964 11.964 30.766 30.766 11.964-12.249 39.596-39.312 7.691-7.691 30.481 30.48 28.772 28.773 30.766-30.766-28.772-28.772z" fill="#455a64" stroke-width="2.849"/></symbol><symbol viewBox="0 0 24 24" id="coffee" xmlns="http://www.w3.org/2000/svg"><path d="M2 21h18v-2H2M20 8h-2V5h2m0-2H4v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4v-3h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="coldfusion" xmlns="http://www.w3.org/2000/svg"><rect transform="rotate(90)" x="2.283" y="-21.86" width="19.487" height="19.487" ry="0" fill="#0d3858" stroke="#4dd0e1" stroke-width=".7"/><text x="6.653" y="16.426" fill="#4dd0e1" font-family="Calibri" font-size="29.001" font-weight="bold" letter-spacing="0" stroke-width=".725" word-spacing="0" style="line-height:1.25"><tspan x="6.653" y="16.426" font-family="'Segoe UI'" font-size="10.634" font-weight="normal">C<tspan font-size="11.844">f</tspan></tspan></text></symbol><symbol viewBox="0 0 24 24" id="conduct" xmlns="http://www.w3.org/2000/svg"><path d="M10 17l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9m-6-6a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#cddc39"/></symbol><symbol viewBox="0 0 24 24" id="console" xmlns="http://www.w3.org/2000/svg"><path d="M20 19V7H4v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16m-7 14v-2h5v2h-5m-3.42-4L5.57 9H8.4l3.3 3.3c.39.39.39 1.03 0 1.42L8.42 17H5.59z" fill="#ff7043"/></symbol><symbol viewBox="0 0 24 24" id="contributing" xmlns="http://www.w3.org/2000/svg"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="cpp" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96C1.56 15.77 1 14.16 1 12.21c.05-2.31.72-4.08 2-5.32C4.32 5.64 5.96 5 7.94 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32M11 11h2V9h2v2h2v2h-2v2h-2v-2h-2v-2m7 0h2V9h2v2h2v2h-2v2h-2v-2h-2v-2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="credits" xmlns="http://www.w3.org/2000/svg"><path d="M3 3h18v2H3V3m4 4h10v2H7V7m-4 4h18v2H3v-2m4 4h10v2H7v-2m-4 4h18v2H3v-2z" fill="#9ccc65"/></symbol><symbol viewBox="0 0 200 200" id="crystal" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:none}</style><path d="M179.363 121.67l-57.623 57.507c-.23.23-.576.346-.806.23l-78.713-21.09c-.346-.115-.577-.345-.577-.576L20.44 79.144c-.115-.345 0-.576.23-.806L78.294 20.83c.23-.23.576-.346.807-.23l78.713 21.09c.345.114.576.345.576.575l21.09 78.597c.23.346.115.577-.115.807zM102.148 59.09l-77.33 20.63c-.115 0-.23.23-.115.345l56.586 56.47c.115.115.346.115.346-.115l20.744-77.215c.115 0-.115-.23-.23-.116z" stroke-width="1.153" fill="#cfd8dc"/></symbol><symbol viewBox="0 0 200 200" id="crystal_light" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:none}</style><path d="M179.363 121.67l-57.623 57.507c-.23.23-.576.346-.806.23l-78.713-21.09c-.346-.115-.577-.345-.577-.576L20.44 79.144c-.115-.345 0-.576.23-.806L78.294 20.83c.23-.23.576-.346.807-.23l78.713 21.09c.345.114.576.345.576.575l21.09 78.597c.23.346.115.577-.115.807zM102.148 59.09l-77.33 20.63c-.115 0-.23.23-.115.345l56.586 56.47c.115.115.346.115.346-.115l20.744-77.215c.115 0-.115-.23-.23-.116z" fill="#37474f" stroke-width="1.153"/></symbol><symbol viewBox="0 0 24 24" id="csharp" xmlns="http://www.w3.org/2000/svg"><path d="M11.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96C2.56 15.77 2 14.16 2 12.21c.05-2.31.72-4.08 2-5.32C5.32 5.64 6.96 5 8.94 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32M13.89 19l.61-4H13l.34-2h1.5l.32-2h-1.5L14 9h1.5l.61-4h2l-.61 4h1l.61-4h2l-.61 4H22l-.34 2h-1.5l-.32 2h1.5L21 15h-1.5l-.61 4h-2l.61-4h-1l-.61 4h-2m2.95-6h1l.32-2h-1l-.32 2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="css" xmlns="http://www.w3.org/2000/svg"><path d="M5 3l-.65 3.34h13.59L17.5 8.5H3.92l-.66 3.33h13.59l-.76 3.81-5.48 1.81-4.75-1.81.33-1.64H2.85l-.79 4 7.85 3 9.05-3 1.2-6.03.24-1.21L21.94 3H5z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="css-map" xmlns="http://www.w3.org/2000/svg"><path d="M18 8v2h2v10H10v-2H8v4h14V8h-4z" fill="#42a5f5"/><path d="M4.676 3l-.488 2.51h10.211l-.33 1.623H3.864l-.496 2.502H13.58l-.57 2.863-4.119 1.36-3.569-1.36.248-1.232H3.06l-.593 3.005 5.898 2.254 6.8-2.254.902-4.53.18-.91L17.406 3H4.675z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 33 33" id="cucumber" xmlns="http://www.w3.org/2000/svg"><title>cucumber-mark-transparent-pips</title><g transform="translate(0 -5)" fill="none" fill-rule="evenodd"><path d="M-4-1h40v40H-4z"/><path d="M16.641 7.092c-7.028 0-12.714 5.686-12.714 12.714 0 6.187 4.435 11.327 10.288 12.471v3.64C21.824 34.77 28.561 28.73 29.063 20.8c.303-4.772-2.076-9.644-6.09-12.01a10.575 10.575 0 0 0-1.455-.728l-.243-.097c-.223-.082-.448-.175-.68-.242a12.614 12.614 0 0 0-3.954-.632zm2.62 4.707a1.387 1.387 0 0 0-1.213.485c-.233.31-.379.611-.534.923-.466 1.087-.31 2.251.388 3.105 1.087-.233 2.01-.927 2.475-2.014a2.45 2.45 0 0 0 .243-1.02c.048-.824-.634-1.404-1.359-1.479zm-5.654.073c-.708.068-1.382.63-1.382 1.407 0 .31.087.709.243 1.02.466 1.086 1.46 1.78 2.546 2.013.621-.854.782-2.018.316-3.105-.155-.311-.3-.617-.534-.85a1.364 1.364 0 0 0-1.188-.485zm-3.809 3.735c-1.224.063-1.77 1.602-.752 2.402.31.233.612.403.922.559 1.087.466 2.344.306 3.275-.316-.233-1.009-1.023-1.936-2.11-2.402-.388-.155-.703-.243-1.092-.243-.087-.009-.161-.004-.243 0zm11.961 4.708a3.551 3.551 0 0 0-2.013.582c.233 1.01 1.023 1.936 2.11 2.401.389.156.705.244 1.093.244 1.397.077 2.08-1.65.994-2.427-.31-.233-.611-.379-.922-.534a3.354 3.354 0 0 0-1.262-.266zm-10.603.072a3.376 3.376 0 0 0-1.261.267c-.389.155-.69.325-.923.558-1.009.854-.33 2.48 1.068 2.402.388 0 .782-.087 1.092-.243 1.087-.465 1.859-1.392 2.014-2.401a3.474 3.474 0 0 0-1.99-.582zm3.931 2.378c-1.087.233-2.009.927-2.475 2.014-.155.31-.243.684-.243.995-.077 1.32 1.724 2.028 2.5 1.02.233-.312.378-.613.534-.923.466-1.01.306-2.174-.316-3.106zm2.887.073c-.621.854-.781 2.019-.315 3.106.155.31.3.615.534.848.854.932 2.65.243 2.572-.921 0-.31-.088-.71-.243-1.02-.466-1.087-1.46-1.78-2.547-2.013z" fill="#4caf50" stroke-width=".776"/></g></symbol><symbol id="cuda" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><style>.bust0{fill:#76b900}</style><title>NVIDIA-Logo</title><path id="buEye_Mark" class="bust0" d="M76.362 75.199V64.116c1.095-.068 2.19-.137 3.284-.137 30.377-.958 50.286 26.135 50.286 26.135s-21.483 29.83-44.539 29.83c-3.079 0-6.089-.48-8.962-1.438v-33.66c11.836 1.436 14.23 6.636 21.277 18.471l15.804-13.273s-11.562-15.12-30.992-15.12c-2.053-.068-4.105.069-6.158.274m0-36.67v16.556l3.284-.205c42.213-1.437 69.784 34.618 69.784 34.618s-31.608 38.45-64.516 38.45c-2.873 0-5.678-.274-8.483-.753v10.262c2.326.274 4.72.48 7.046.48 30.65 0 52.817-15.668 74.3-34.14 3.558 2.874 18.13 9.784 21.14 12.794-20.388 17.104-67.937 30.856-94.893 30.856-2.6 0-5.062-.137-7.525-.41v14.436h116.44V38.532zm0 79.977v8.757C48.038 122.2 40.17 92.712 40.17 92.712s13.615-15.05 36.192-17.514v9.579h-.068c-11.836-1.437-21.14 9.646-21.14 9.646s5.268 18.678 21.209 24.082M26.077 91.481S42.839 66.714 76.43 64.115v-9.03C39.213 58.094 7.057 89.565 7.057 89.565s18.199 52.68 69.305 57.47v-9.579c-37.492-4.652-50.286-45.975-50.286-45.975z" fill="#8bc34a" stroke-width=".684"/></symbol><symbol viewBox="0 0 24 24" id="dart" xmlns="http://www.w3.org/2000/svg"><title>Dart</title><path d="M12.486 1.385a.978.978 0 0 0-.682.281l-.01.007-6.387 3.692 6.371 6.372v.004l7.659 7.659 1.46-2.63-5.265-12.64-2.456-2.457a.972.972 0 0 0-.69-.288z" fill="#00ca94"/><path d="M5.422 5.35L1.73 11.733l-.007.01a.967.967 0 0 0 .006 1.371l3.059 3.061 11.963 4.706 2.704-1.502-.073-.073-.018.002-7.5-7.512h-.01L5.423 5.35z" fill="#1565c0"/><path d="M5.405 5.353l6.518 6.525h.01l7.502 7.51 2.855-.544.005-8.449-3.016-2.955c-.66-.647-1.675-1.064-2.695-1.202l.002-.032-11.181-.853z" fill="#1565c0"/><path d="M5.414 5.361l6.521 6.522v.009l7.506 7.506-.546 2.855h-8.448l-2.954-3.017c-.647-.66-1.064-1.676-1.2-2.696l-.033.003L5.414 5.36z" fill="#00ee94"/></symbol><symbol viewBox="0 0 24 24" id="database" xmlns="http://www.w3.org/2000/svg"><path d="M12 3C7.58 3 4 4.79 4 7s3.58 4 8 4 8-1.79 8-4-3.58-4-8-4M4 9v3c0 2.21 3.58 4 8 4s8-1.79 8-4V9c0 2.21-3.58 4-8 4s-8-1.79-8-4m0 5v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="diff" xmlns="http://www.w3.org/2000/svg"><path d="M3 1c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h2v-2H3V3h11v2h2V3c0-1.11-.89-2-2-2H3m6 6c-1.11 0-2 .89-2 2v2h2V9h2V7H9m4 0v2h1v1h2V7h-3m5 0v2h2v11H9v-2H7v2c0 1.11.89 2 2 2h11c1.11 0 2-.89 2-2V9c0-1.11-.89-2-2-2h-2m-4 5v2h-2v2h2c1.11 0 2-.89 2-2v-2h-2m-7 1v3h3v-2H9v-1H7z" fill="#42a5f5"/></symbol><symbol id="docker" viewBox="0 0 41 34.5" xmlns="http://www.w3.org/2000/svg"><style id="bystyle2">.byst0{fill:#fff}.byst1{clip-path:url(#bySVGID_4_)}</style><g id="byg34" transform="translate(.292 1.9)" fill="#0087c9"><g id="byg32"><g id="byg30"><g id="byg28"><g id="byg26"><g id="byg9"><path id="bySVGID_1_" class="byst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2c1.2 0 2.1.9 2.1 2s-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></g></g></g></g></g></g></symbol><symbol viewBox="0 0 24 24" id="document" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z" fill="#42a5f5"/></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 200 200" id="drone" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(9.063 22.346) scale(.71044)"><path d="M128.22.723C32.095.723.39 84.566.39 115.222h77.928S89.36 75.275 128.22 75.275s49.906 39.947 49.906 39.947h77.476c0-30.66-31.257-114.5-127.38-114.5m98.82 134.45h-48.914s-8.55 39.946-49.906 39.946c-41.355 0-49.902-39.948-49.902-39.948H30.255c0 10.25 37.727 82.708 98.443 82.708 60.714 0 98.344-59.604 98.344-82.708"/><circle cx="128" cy="126.08" r="32.768"/></g></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 200 200" id="drone_light" xmlns="http://www.w3.org/2000/svg"><g fill="#424242" transform="translate(9.063 22.346) scale(.71044)"><path d="M128.22.723C32.095.723.39 84.566.39 115.222h77.928S89.36 75.275 128.22 75.275s49.906 39.947 49.906 39.947h77.476c0-30.66-31.257-114.5-127.38-114.5m98.82 134.45h-48.914s-8.55 39.946-49.906 39.946c-41.355 0-49.902-39.948-49.902-39.948H30.255c0 10.25 37.727 82.708 98.443 82.708 60.714 0 98.344-59.604 98.344-82.708"/><circle cx="128" cy="126.08" r="32.768"/></g></symbol><symbol viewBox="0 0 3473 3473" id="editorconfig" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" xmlns="http://www.w3.org/2000/svg"><defs id="ccdefs4"><style id="ccstyle2">.ccfil2{fill:#020202}.ccfil0{fill:#e3e3f8}.ccfil5{fill:#efefef}.ccfil6{fill:#faf1f1}.ccfil3{fill:#fdf2f2}.ccfil1{fill:#fdfdfd}.ccfil4{fill:#fef3f3}</style></defs><g id="ccLayer_x0020_1" transform="matrix(.8945 0 0 .8945 138.649 275.985)"><g id="cc_631799120"><g id="ccg11"><path class="ccfil0" d="M967 1895c46-30 84-105 61-158-63 27-60 89-61 158z" id="ccpath7" fill="#e3e3f8"/><path class="ccfil0" d="M1679 2067c50-16 98-72 71-130-39 27-64 64-71 130z" id="ccpath9" fill="#e3e3f8"/></g><g id="ccg21"><path class="ccfil1" d="M280 2895c0 63 16 131 60 155 162 91 730 20 923-23 101-23 183-98 278-139 214-93 369-168 540-293 124-91 321-347 342-500l-169-38c-4 172-43 211-196 251-103 28-304 34-409 16-139-23-202-96-265-179-122-162 27-275-166-286-203 249-561 70-718 45-67 97-224 727-222 871 97-33 158 3 245 37 308 119 39 224-84 193-84-20-110-75-159-110z" id="ccpath13" fill="#fdfdfd"/><path class="ccfil1" d="M683 1458c125 24 236 76 342 129 173 86 204 74 220 194 2 22-2 34 61 54 106 33-61-26 223-25 169 1 556 69 681 148 52 33 42 75 218 70-2-207-57-516-138-706-99-230-230-265-497-351-156-50-614-105-756-17-133 83-158 182-282 356-36 51-49 90-72 148z" id="ccpath15" fill="#fdfdfd"/><path class="ccfil1" d="M1784 1883c100 41-5 306-144 242-45-127 62-199 91-256-60-9-231-36-282-17-66 25-81 166-47 232 160 314 867 247 792 3-30-99-58-115-159-149-81-27-162-55-251-55z" id="ccpath17" fill="#fdfdfd"/><path class="ccfil1" d="M527 1848c80 77 261 89 378 95 15-155 28-271 152-262 61 83 29 181-35 244 109-1 172-83 156-202-92-66-371-198-511-217-39 42-135 272-140 342z" id="ccpath19" fill="#fdfdfd"/></g><path class="ccfil2" d="M339 2838c66-6 238 44 252 100-107 13-243 3-252-100zm-59 57c49 35 75 90 159 110 123 31 392-74 84-193-87-34-148-70-245-37-2-144 155-774 222-871 157 25 515 204 718-45 193 11 44 124 166 286 63 83 126 156 265 179 105 18 306 12 409-16 153-40 192-79 196-251l169 38c-21 153-218 409-342 500-171 125-326 200-540 293-95 41-177 116-278 139-193 43-761 114-923 23-44-24-60-92-60-155zm1399-828c7-66 32-103 71-130 27 58-21 114-71 130zm105-184c89 0 170 28 251 55 101 34 129 50 159 149 75 244-632 311-792-3-34-66-19-207 47-232 51-19 222 8 282 17-29 57-136 129-91 256 139 64 244-201 144-242zm-817 12c1-69-2-131 61-158 23 53-15 128-61 158zm-440-47c5-70 101-300 140-342 140 19 419 151 511 217 16 119-47 201-156 202 64-63 96-161 35-244-124-9-137 107-152 262-117-6-298-18-378-95zm-100-80c-37-102-37-261 120-274l-80 223c-21 48-21 37-40 51zm256-310c23-58 36-97 72-148 124-174 149-273 282-356 142-88 600-33 756 17 267 86 398 121 497 351 81 190 136 499 138 706-176 5-166-37-218-70-125-79-512-147-681-148-284-1-117 58-223 25-63-20-59-32-61-54-16-120-47-108-220-194-106-53-217-105-342-129zm1770-49c-19-63 16-59 77-102 35-25 63-51 106-75 161-90 461-105 589 2 52 43 137 127 124 237-27 219-177 339-300 439-125 102-333 207-548 137-18-44-4-323-25-426-19-92-9-102 44-157 156-162 494-280 686-141 81 60 58 83 100 129 52-56-45-244-403-232-243 8-348 198-450 189zM997 840c5-139 133-427 261-527 155-120 317-233 555-98 59 33 56 50 62 132 5 79-2 108-22 172-158 510-290 217-796 338 19-166 163-314 243-391 137-133 236-219 442-191 57 95 63 155-6 266-92 148-115 139-101 240 72-18 94-88 127-158 201-420-91-471-270-394-120 51-334 287-404 429-14 28-29 64-42 95zm792 21c21-125 145-156 145-541 0-166-204-315-471-204-229 94-264 166-386 350-115 174-111 365-210 526-29 46-55 62-87 108-23 34-40 77-63 117-47 77-95 133-133 225-120 3-221 5-233 129-16 170 64 212 64 276-1 69-281 765-203 1180 22 114 97 115 217 129 289 35 664 23 923-81l470-225c119-67 319-194 408-287 63-65 96-120 150-197 74-108 76-106 92-253 98 18 281 61 342 114-7 69-41 36-41 98 39 1 104-48 120-102-41-60-84-50-143-98 47-37 132-54 197-81 140-58 379-234 438-394 47-129 12-344-64-428-80-88-266-133-418-133-181 0-368 130-514 186-56-49-60-105-101-159-47-64-353-224-499-255z" id="ccpath23" fill="#020202"/><path class="ccfil3" d="M2453 1409c102 9 207-181 450-189 358-12 455 176 403 232-42-46-19-69-100-129-192-139-530-21-686 141-53 55-63 65-44 157 21 103 7 382 25 426 215 70 423-35 548-137 123-100 273-220 300-439 13-110-72-194-124-237-128-107-428-92-589-2-43 24-71 50-106 75-61 43-96 39-77 102z" id="ccpath25" fill="#fdf2f2"/><path class="ccfil4" d="M997 840l49-87c13-31 28-67 42-95 70-142 284-378 404-429 179-77 471-26 270 394-33 70-55 140-127 158-14-101 9-92 101-240 69-111 63-171 6-266-206-28-305 58-442 191-80 77-224 225-243 391 506-121 638 172 796-338 20-64 27-93 22-172-6-82-3-99-62-132-238-135-400-22-555 98-128 100-256 388-261 527z" id="ccpath27" fill="#fef3f3"/><path class="ccfil5" d="M427 1768c19-14 19-3 40-51l80-223c-157 13-157 172-120 274z" id="ccpath29" fill="#efefef"/><path class="ccfil6" d="M591 2938c-14-56-186-106-252-100 9 103 145 113 252 100z" id="ccpath31" fill="#faf1f1"/></g></g></symbol><symbol viewBox="0 0 24 24" id="elixir" xmlns="http://www.w3.org/2000/svg"><path d="M12.431 22.383c-3.86 0-6.99-3.64-6.99-8.13 0-3.678 2.774-8.172 4.916-10.91 1.014-1.295 2.931-2.321 2.931-2.321s-.982 5.238 1.683 7.318c2.365 1.847 4.105 4.25 4.105 6.363 0 4.232-2.784 7.68-6.645 7.68z" fill="#9575cd" stroke-width="1.256"/></symbol><symbol viewBox="0 0 323.00001 322.99999" id="elm" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.8053 0 0 .8053 30.106 31.524)"><path fill="#f0ad00" d="M160.8 153.865l68.028-68.03H92.77z"/><path fill="#7fd13b" d="M160.983 5.098H12.033l68.524 68.525H229.51z"/><path fill="#7fd13b" stroke-width=".974" d="M243.906 88.021l74.136 74.137-74.474 74.475-74.137-74.137z"/><path fill="#60b5cc" d="M318.2 145.045V5.098H178.252z"/><path fill="#5a6378" d="M152.164 162.499L3.4 13.733v297.533z"/><path fill="#f0ad00" d="M252.205 245.27l65.995 65.996v-131.99z"/><path fill="#60b5cc" d="M160.8 171.134L12.034 319.899h297.53z"/></g></symbol><symbol viewBox="0 0 24 24" id="email" xmlns="http://www.w3.org/2000/svg"><path d="M20 8l-8 5-8-5V6l8 5 8-5m0-2H4c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 30 30" id="erlang" xmlns="http://www.w3.org/2000/svg"><path style="line-height:1.25;-inkscape-font-specification:'Wide Latin'" d="M5.217 4.367c-.048.052-.097.1-.144.153C2.697 7.182 1.51 10.798 1.51 15.366c0 4.418 1.156 7.862 3.46 10.34h19.414c2.553-1.152 4.127-3.43 4.127-3.43l-3.147-2.52-1.454 1.381c-.866.773-.845.931-2.314 1.78-1.496.674-3.04.966-4.634.966-2.516 0-4.423-.909-5.723-2.059-1.286-1.15-1.985-4.511-2.097-6.68l17.458.067-.182-1.472s-.847-7.129-2.542-9.372zm8.76.846c1.565 0 3.22.535 3.96 1.471.742.937.932 1.667.974 3.524H9.12c.111-1.955.436-2.81 1.372-3.697.937-.888 2.03-1.298 3.484-1.298z" font-weight="400" font-size="48" font-family="Wide Latin" letter-spacing="0" word-spacing="0" fill="#f44336" stroke-width=".97"/></symbol><symbol viewBox="0 0 299.99999 300.00001" id="eslint" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-2.88 18.438) scale(1.0344)"><path d="M97.021 99.016l48.432-27.962c1.212-.7 2.706-.7 3.918 0l48.433 27.962a3.92 3.92 0 0 1 1.959 3.393v55.924a3.924 3.924 0 0 1-1.959 3.394l-48.433 27.962c-1.212.7-2.706.7-3.918 0l-48.432-27.962a3.92 3.92 0 0 1-1.959-3.394v-55.924a3.922 3.922 0 0 1 1.959-3.393" fill="#7986cb"/><path d="M273.34 124.49L215.473 23.82c-2.102-3.64-5.985-6.325-10.188-6.325H89.545c-4.204 0-8.088 2.685-10.19 6.325L21.488 124.27c-2.102 3.641-2.102 8.236 0 11.877l57.867 99.847c2.102 3.64 5.986 5.501 10.19 5.501h115.74c4.203 0 8.087-1.805 10.188-5.446l57.867-100.01c2.104-3.639 2.104-7.907.001-11.547m-47.917 48.41c0 1.48-.891 2.849-2.174 3.59l-73.71 42.527a4.194 4.194 0 0 1-4.17 0l-73.767-42.527c-1.282-.741-2.179-2.109-2.179-3.59V87.847c0-1.481.884-2.849 2.167-3.59l73.707-42.527a4.185 4.185 0 0 1 4.168 0l73.772 42.527c1.283.741 2.186 2.109 2.186 3.59z" fill="#3f51b5"/></g></symbol><symbol viewBox="0 0 24 24" id="exe" xmlns="http://www.w3.org/2000/svg"><path d="M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14m0 14V8H5v10h14z" fill="#e64a19"/></symbol><symbol viewBox="0 0 24 24" id="favicon" xmlns="http://www.w3.org/2000/svg"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.62L12 2 9.19 8.62 2 9.24l5.45 4.73L5.82 21 12 17.27z" fill="#ffd54f"/></symbol><symbol viewBox="0 0 24 24" id="file" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m5 2H6v16h12v-9h-7V4z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 400 400" id="firebase" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 103)"><path d="M72.55 208.77l44.456-292.29 56.209 90.445L195.49-37.57 330.6 209.28z" fill="#ffa712"/><path d="M195.7 276.73l134.9-67.45-46.5-224.83L72.55 208.77z" fill="#fcca3f"/><path d="M173.22 6.932L72.56 208.772l136.35-144.58z" fill="#f6820c"/></g></symbol><symbol viewBox="0 0 24 24" id="flash" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="cma"><stop offset="0" stop-color="#d92f3c"/><stop offset="1" stop-color="#791223"/></linearGradient><linearGradient xlink:href="#cma" id="cmb" x1="2.373" y1="12.027" x2="21.86" y2="12.027" gradientUnits="userSpaceOnUse" gradientTransform="translate(-.09 -24.144)"/></defs><rect width="19.487" height="19.487" x="2.283" y="-21.86" transform="rotate(90)" ry="0" fill="url(#cmb)"/><path style="line-height:125%" d="M16.802 5.768l-.013.002a6.43 6.43 0 0 0-1.182.192 5.062 5.062 0 0 0-1.494.718c-.428.323-.817.72-1.17 1.191-.34.48-.682 1.032-1.022 1.66-.12.228-.233.424-.35.636v.002h-.004l-1.34 2.394-.005-.002c-.238.443-.461.847-.665 1.198a4.358 4.358 0 0 1-.716.94 2.79 2.79 0 0 1-.907.594c-.072.027-.161.042-.242.063h-.989v2.414h.989v-.002a6.427 6.427 0 0 0 1.185-.192 5.062 5.062 0 0 0 1.494-.718 5.94 5.94 0 0 0 1.171-1.191c.34-.48.681-1.033 1.021-1.66.12-.228.235-.425.353-.637l.006.002.003-.005.037-.066h2.53v.002h1.124v-2.408h-.33v-.001h-1.98c.22-.407.432-.789.621-1.115.214-.37.452-.682.717-.94a2.79 2.79 0 0 1 .906-.594c.07-.027.16-.041.239-.061h.992V8.18h-.002V5.77h-.977v-.002z" font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#fff"/></symbol><symbol class="cnflow-logo" viewBox="0 0 299.99999 300" id="flow" xmlns="http://www.w3.org/2000/svg"><title>Flow logo</title><path d="M38.75 33.427l77.461 77.47H54.436l61.145 61.16H38.437l93.462 93.478v-77.158l.01-.01v-77.47h-.01V66.982h46.691l20.394 20.393H153.57v76.531h22.05l24.474 24.473h-15.806l-.01-.01v.01h-31.665l-.01-.01v.01h-.313l.313.313v77.148h109.149l-39.2-39.2v-15.806l8.465 8.466v-77.37h-15.682l.017-38.191 30.09 30.086V56.362h-64.874l-22.94-22.934H113.71z" fill="#fbc02d" fill-opacity=".976" stroke-width=".955" class="cnflow-logo-mark"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-aurelia" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="coa" x1="-388.15%" x2="237.68%" y1="-144.18%" y2="430.41%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cob" x1="72.945%" x2="-97.052%" y1="84.424%" y2="-147.7%"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="coc" x1="-283.88%" x2="287.54%" y1="-693.6%" y2="101.71%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cod" x1="-821.19%" x2="101.99%" y1="-469.05%" y2="288.24%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="coe" x1="-140.36%" x2="419.01%" y1="-230.93%" y2="261.98%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cof" x1="191.08%" x2="20.358%" y1="253.95%" y2="20.403%"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cog" x1="-388.09%" x2="237.67%" y1="-173.85%" y2="518.99%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="coi" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#coa"/><linearGradient id="coj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#cob"/><linearGradient id="cok" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#coc"/><linearGradient id="col" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#cod"/><linearGradient id="com" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#coe"/><linearGradient id="con" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#cof"/><linearGradient id="coo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cog"/><linearGradient id="cop" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#coh"/><linearGradient id="coh" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#f06292" fill-rule="nonzero"/><g transform="matrix(.31022 .0619 -.0619 .31022 11.807 7.546)" fill="none"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#coi)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#coj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#cok)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#col)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#com)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#con)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#coo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#cop)"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-aurelia-open" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="cpi" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cpa"/><linearGradient id="cpa" x1="-3.881" x2="2.377" y1="-1.442" y2="4.304"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#cpb"/><linearGradient id="cpb" x1=".729" x2="-.971" y1=".844" y2="-1.477"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cpk" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#cpc"/><linearGradient id="cpc" x1="-2.839" x2="2.875" y1="-6.936" y2="1.017"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpl" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#cpd"/><linearGradient id="cpd" x1="-8.212" x2="1.02" y1="-4.691" y2="2.882"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpm" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#cpe"/><linearGradient id="cpe" x1="-1.404" x2="4.19" y1="-2.309" y2="2.62"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpn" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#cpf"/><linearGradient id="cpf" x1="1.911" x2=".204" y1="2.539" y2=".204"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cpo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cpg"/><linearGradient id="cpg" x1="-3.881" x2="2.377" y1="-1.738" y2="5.19"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpp" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#cph"/><linearGradient id="cph" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#f06292" fill-rule="nonzero"/><g transform="matrix(.31022 .0619 -.0619 .31022 11.807 7.546)" fill="none"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#cpi)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#cpj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#cpk)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#cpl)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#cpm)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#cpn)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#cpo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#cpp)"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-components" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#cddc39" fill-rule="nonzero"/><path d="M11.185 9.613h5.346v2.9l3.782-3.775 3.775 3.775-3.775 3.782h2.9v5.346h-5.346v-5.346h2.446l-3.782-3.782v2.446h-5.346V9.613m0 6.682h5.346v5.346h-5.346z" fill="#f0f4c3" stroke-width=".668"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-components-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#cddc39"/><path d="M11.185 9.613h5.346v2.9l3.782-3.775 3.775 3.775-3.775 3.782h2.9v5.346h-5.346v-5.346h2.446l-3.782-3.782v2.446h-5.346V9.613m0 6.682h5.346v5.346h-5.346z" fill="#f0f4c3" stroke-width=".668"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-config" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00acc1" fill-rule="nonzero"/><path d="M17.293 17.786a2.308 2.308 0 0 1-2.308-2.308 2.308 2.308 0 0 1 2.308-2.307 2.308 2.308 0 0 1 2.308 2.307 2.308 2.308 0 0 1-2.308 2.308m4.899-1.668c.026-.211.046-.422.046-.64 0-.217-.02-.435-.046-.659l1.391-1.075a.333.333 0 0 0 .08-.422l-1.32-2.28c-.079-.146-.257-.205-.402-.146l-1.641.66a4.779 4.779 0 0 0-1.115-.647l-.244-1.747a.333.333 0 0 0-.33-.277h-2.637a.333.333 0 0 0-.33.277l-.243 1.747a4.78 4.78 0 0 0-1.114.646l-1.642-.659a.324.324 0 0 0-.402.145l-1.319 2.281a.325.325 0 0 0 .08.422l1.39 1.075c-.026.224-.046.442-.046.66s.02.428.046.639l-1.39 1.094a.325.325 0 0 0-.08.422l1.319 2.282c.079.145.257.197.402.145l1.642-.666c.342.264.698.488 1.114.653l.244 1.747a.333.333 0 0 0 .33.277h2.637a.333.333 0 0 0 .33-.277l.243-1.747a4.802 4.802 0 0 0 1.115-.653l1.641.666c.145.052.323 0 .403-.145l1.318-2.282a.333.333 0 0 0-.079-.422z" fill="#80deea" stroke-width=".659"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-config-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00acc1"/><path d="M17.293 17.786a2.308 2.308 0 0 1-2.308-2.308 2.308 2.308 0 0 1 2.308-2.307 2.308 2.308 0 0 1 2.308 2.307 2.308 2.308 0 0 1-2.308 2.308m4.899-1.668c.026-.211.046-.422.046-.64 0-.217-.02-.435-.046-.659l1.391-1.075a.333.333 0 0 0 .08-.422l-1.32-2.28c-.079-.146-.257-.205-.402-.146l-1.641.66a4.779 4.779 0 0 0-1.115-.647l-.244-1.747a.333.333 0 0 0-.33-.277h-2.637a.333.333 0 0 0-.33.277l-.243 1.747a4.78 4.78 0 0 0-1.114.646l-1.642-.659a.324.324 0 0 0-.402.145l-1.319 2.281a.325.325 0 0 0 .08.422l1.39 1.075c-.026.224-.046.442-.046.66s.02.428.046.639l-1.39 1.094a.325.325 0 0 0-.08.422l1.319 2.282c.079.145.257.197.402.145l1.642-.666c.342.264.698.488 1.114.653l.244 1.747a.333.333 0 0 0 .33.277h2.637a.333.333 0 0 0 .33-.277l.243-1.747a4.802 4.802 0 0 0 1.115-.653l1.641.666c.145.052.323 0 .403-.145l1.318-2.282a.333.333 0 0 0-.079-.422z" fill="#80deea" stroke-width=".659"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-css" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#42a5f5" fill-rule="nonzero"/><path d="M12.488 9.415l-.44 2.259h9.188l-.298 1.46h-9.18l-.447 2.251H20.5l-.514 2.576-3.705 1.224-3.211-1.224.223-1.109h-2.258l-.534 2.704 5.307 2.029 6.118-2.029.812-4.076.162-.818 1.041-5.247H12.488z" fill-rule="nonzero" fill="#bbdefb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-css-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#42a5f5" fill-rule="nonzero"/><path d="M12.488 9.415l-.44 2.259h9.188l-.298 1.46h-9.18l-.447 2.251H20.5l-.514 2.576-3.705 1.224-3.211-1.224.223-1.109h-2.258l-.534 2.704 5.307 2.029 6.118-2.029.812-4.076.162-.818 1.041-5.247H12.488z" fill-rule="nonzero" fill="#bbdefb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-dist" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#e57373" fill-rule="nonzero"/><path d="M18.575 11.113h-2.576V9.825h2.576m3.864 1.288h-2.576V9.825l-1.288-1.288h-2.576L14.71 9.825v1.288h-2.577c-.715 0-1.288.573-1.288 1.288v7.085a1.288 1.288 0 0 0 1.288 1.288H22.44a1.288 1.288 0 0 0 1.288-1.288V12.4c0-.715-.58-1.288-1.288-1.288z" fill="#ffcdd2" stroke-width=".644"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-dist-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#e57373"/><path d="M18.575 11.113h-2.576V9.825h2.576m3.864 1.288h-2.576V9.825l-1.288-1.288h-2.576L14.71 9.825v1.288h-2.577c-.715 0-1.288.573-1.288 1.288v7.085a1.288 1.288 0 0 0 1.288 1.288H22.44a1.288 1.288 0 0 0 1.288-1.288V12.4c0-.715-.58-1.288-1.288-1.288z" fill="#ffcdd2" fill-rule="evenodd" stroke-width=".644"/></symbol><symbol id="folder-docker" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><defs id="cydefs10"><path id="cySVGID_2_" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></defs><path id="cypath2" d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><style id="cystyle2">.cyst0{fill:#fff}.cyst1{clip-path:url(#cySVGID_4_)}</style><g id="cyg34" transform="translate(8.319 9.626) scale(.39491)" fill="#b3e5fc"><g id="cyg32"><g id="cyg30"><title id="cytitle4">Group 3</title><g id="cyg28"><g id="cyg26"><g id="cyg9"><path id="cySVGID_1_" class="cyst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></g><g id="cyg24"><clipPath id="cySVGID_4_"><use id="cyuse14" width="100%" height="100%" xlink:href="#cySVGID_2_"/></clipPath><g id="cyg22" class="cyst1" clip-path="url(#cySVGID_4_)"><g id="cyg20"><g id="cyg18"><path id="cySVGID_3_" class="cyst0" d="M-48.8-21H1226v151.4H-48.8z"/></g></g></g></g></g></g></g></g></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docker-open" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="cza"><use width="100%" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#SVGID_2_"/></clipPath></defs><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><g transform="matrix(.3949 0 0 .39489 8.319 9.626)" fill="#b3e5fc"><title>Group 3</title><path class="czst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/><g class="czst1" clip-path="url(#cza)"><path class="czst0" d="M-48.8-21H1226v151.4H-48.8z"/></g></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docs" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#0277bd" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m6.075 10.8v-1.35H13.85v1.35h6.075m2.025-2.7v-1.35h-8.1v1.35h8.1z" fill-rule="nonzero" fill="#b3e5fc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docs-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#0277bd" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m6.075 10.8v-1.35H13.85v1.35h6.075m2.025-2.7v-1.35h-8.1v1.35h8.1z" fill-rule="nonzero" fill="#b3e5fc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-expo" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#01579b" fill-rule="nonzero"/><style>.dcst0{fill:#1173b6}.st1{fill:#585d67}</style><path class="dcst0" d="M18.575 9.82c-.489-.745-.605-.844-1.6-.844h-.024c-.996 0-1.106.099-1.601.844-.46.699-5.024 9.058-5.024 9.291 0 .338.087.658.402 1.112.32.46.873.716 1.275.309.273-.274 3.201-5.321 4.616-7.23a.425.425 0 0 1 .693 0c1.414 1.909 4.343 6.956 4.616 7.23.402.407.955.15 1.275-.309.314-.454.402-.774.402-1.112-.006-.233-4.57-8.598-5.03-9.291z" fill="#1173b6" stroke-width=".058"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-expo-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#01579b"/><path class="ddst0" d="M18.575 9.82c-.489-.745-.605-.844-1.6-.844h-.024c-.996 0-1.106.099-1.601.844-.46.699-5.024 9.058-5.024 9.291 0 .338.087.658.402 1.112.32.46.873.716 1.275.309.273-.274 3.201-5.321 4.616-7.23a.425.425 0 0 1 .693 0c1.414 1.909 4.343 6.956 4.616 7.23.402.407.955.15 1.275-.309.314-.454.402-.774.402-1.112-.006-.233-4.57-8.598-5.03-9.291z" fill="#1173b6" stroke-width=".058" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-font" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef9a9a" fill-rule="nonzero"/><path d="M14.62 17.403l2.38-6.33 2.37 6.33m-3.37-9l-5.5 14h2.25l1.12-3h6.25l1.13 3h2.25l-5.5-14h-2z" fill="#f44336" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-font-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef9a9a" fill-rule="nonzero"/><path d="M14.62 17.403l2.38-6.33 2.37 6.33m-3.37-9l-5.5 14h2.25l1.12-3h6.25l1.13 3h2.25l-5.5-14h-2z" fill="#f44336" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-git" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ff8a65" fill-rule="nonzero"/><path d="M10.43 14.14l4.044-4.052 1.183 1.19a1.387 1.387 0 0 0 .65 1.56v3.877c-.42.238-.699.693-.699 1.21 0 .768.632 1.4 1.4 1.4.767 0 1.4-.632 1.4-1.4 0-.517-.28-.972-.7-1.21v-3.4l1.448 1.462c-.05.105-.05.224-.05.35 0 .767.633 1.399 1.4 1.399.768 0 1.4-.632 1.4-1.4 0-.767-.632-1.4-1.4-1.4-.126 0-.245 0-.35.05l-1.798-1.799a1.385 1.385 0 0 0-.805-1.637c-.3-.112-.615-.14-.895-.063l-1.19-1.183.553-.545a1.381 1.381 0 0 1 1.973 0l5.591 5.59a1.381 1.381 0 0 1 0 1.974l-5.59 5.591a1.381 1.381 0 0 1-1.974 0l-5.591-5.59a1.381 1.381 0 0 1 0-1.974z" fill="#e64a19" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-git-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ff8a65" fill-rule="nonzero"/><path d="M10.43 14.14l4.044-4.052 1.183 1.19a1.387 1.387 0 0 0 .65 1.56v3.877c-.42.238-.699.693-.699 1.21 0 .768.632 1.4 1.4 1.4.767 0 1.4-.632 1.4-1.4 0-.517-.28-.972-.7-1.21v-3.4l1.448 1.462c-.05.105-.05.224-.05.35 0 .767.633 1.399 1.4 1.399.768 0 1.4-.632 1.4-1.4 0-.767-.632-1.4-1.4-1.4-.126 0-.245 0-.35.05l-1.798-1.799a1.385 1.385 0 0 0-.805-1.637c-.3-.112-.615-.14-.895-.063l-1.19-1.183.553-.545a1.381 1.381 0 0 1 1.973 0l5.591 5.59a1.381 1.381 0 0 1 0 1.974l-5.59 5.591a1.381 1.381 0 0 1-1.974 0l-5.591-5.59a1.381 1.381 0 0 1 0-1.974z" fill="#e64a19" fill-rule="nonzero"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-global" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#5c6bc0" fill-rule="nonzero"/><path d="M21.132 18.585a1.22 1.22 0 0 0-1.156-.846h-.609v-1.825a.608.608 0 0 0-.608-.609h-3.65v-1.217h1.216a.608.608 0 0 0 .609-.608v-1.217h1.217a1.217 1.217 0 0 0 1.216-1.217v-.25a4.858 4.858 0 0 1 1.765 7.79m-4.198 1.545a4.86 4.86 0 0 1-4.26-4.826c0-.377.049-.742.128-1.089l2.915 2.915v.608a1.217 1.217 0 0 0 1.217 1.217m.608-9.735a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.085-6.085 6.085 6.085 0 0 0-6.085-6.084z" fill="#c5cae9" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-global-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#5c6bc0"/><path d="M21.133 18.585a1.22 1.22 0 0 0-1.156-.846h-.609v-1.825a.608.608 0 0 0-.608-.609h-3.65v-1.217h1.216a.608.608 0 0 0 .609-.608v-1.217h1.217a1.217 1.217 0 0 0 1.216-1.217v-.25a4.858 4.858 0 0 1 1.765 7.79m-4.198 1.545a4.86 4.86 0 0 1-4.26-4.826c0-.377.049-.742.128-1.089l2.915 2.915v.608a1.217 1.217 0 0 0 1.216 1.217m.609-9.735a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.085-6.085 6.085 6.085 0 0 0-6.085-6.084z" fill="#c5cae9" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-i18n" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#5c6bc0" fill-rule="nonzero"/><path d="M17.293 17.786l-1.53-1.512.018-.018a10.555 10.555 0 0 0 2.235-3.934h1.765v-1.205h-4.217V9.912h-1.205v1.205h-4.217v1.205h6.73a9.5 9.5 0 0 1-1.91 3.223 9.424 9.424 0 0 1-1.392-2.018h-1.205c.44.982 1.042 1.91 1.795 2.747l-3.067 3.024.856.856 3.012-3.013 1.874 1.874.458-1.229m3.392-3.054H19.48l-2.711 7.23h1.205l.674-1.808h2.862l.68 1.807h1.206l-2.711-7.23m-1.579 4.218l.976-2.609.976 2.609z" fill="#c5cae9" stroke-width=".602"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-i18n-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#5c6bc0"/><path d="M17.293 17.786l-1.53-1.512.018-.018a10.555 10.555 0 0 0 2.235-3.934h1.765v-1.205h-4.217V9.912h-1.205v1.205h-4.217v1.205h6.73a9.5 9.5 0 0 1-1.91 3.223 9.424 9.424 0 0 1-1.392-2.018h-1.205c.44.982 1.042 1.91 1.795 2.747l-3.067 3.024.856.856 3.012-3.013 1.874 1.874.458-1.229m3.392-3.054H19.48l-2.711 7.23h1.205l.674-1.808h2.862l.68 1.807h1.206l-2.711-7.23m-1.579 4.218l.976-2.609.976 2.609z" fill="#c5cae9" stroke-width=".602"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-images" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#009688" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m0 12.15h8.1v-5.4l-2.7 2.7-1.35-1.35-4.05 4.05m1.35-7.425c-.74 0-1.35.61-1.35 1.35s.61 1.35 1.35 1.35 1.35-.61 1.35-1.35-.61-1.35-1.35-1.35z" fill-rule="nonzero" fill="#b2dfdb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-images-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#009688" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m0 12.15h8.1v-5.4l-2.7 2.7-1.35-1.35-4.05 4.05m1.35-7.425c-.74 0-1.35.61-1.35 1.35s.61 1.35 1.35 1.35 1.35-.61 1.35-1.35-.61-1.35-1.35-1.35z" fill-rule="nonzero" fill="#b2dfdb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-include" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><path d="M20.788 15.981h-2.434v2.434h-1.217V15.98h-2.434v-1.217h2.434V12.33h1.217v2.434h2.434m-3.042-5.476a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.084-6.085 6.085 6.085 0 0 0-6.084-6.084z" fill="#b3e5fc" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-include-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><path d="M20.788 15.981h-2.434v2.434h-1.217V15.98h-2.434v-1.217h2.434V12.33h1.217v2.434h2.434m-3.042-5.476a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.084-6.085 6.085 6.085 0 0 0-6.084-6.084z" fill="#b3e5fc" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-javascript" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ffca28" fill-rule="nonzero"/><path d="M17.935 18.374a2.18 2.18 0 0 0 1.972 1.213c.829 0 1.354-.415 1.354-.987 0-.682-.542-.927-1.452-1.324l-.502-.216c-1.435-.613-2.404-1.378-2.404-3.005 0-1.5 1.167-2.638 2.917-2.638a2.957 2.957 0 0 1 2.842 1.599l-1.552.999a1.362 1.362 0 0 0-1.29-.858.873.873 0 0 0-.957.858c0 .583.374.84 1.226 1.213l.502.216c1.697.733 2.654 1.47 2.654 3.139 0 1.798-1.411 2.783-3.308 2.783a3.839 3.839 0 0 1-3.618-2.046zm-7.048.175c.315.583.583 1.027 1.283 1.027s1.066-.256 1.066-1.255v-6.774h1.998v6.804c0 2.064-1.214 3.01-2.982 3.01a3.104 3.104 0 0 1-2.993-1.826z" fill-rule="nonzero" fill="#ffecb3"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-javascript-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ffca28"/><path d="M17.935 18.374a2.18 2.18 0 0 0 1.972 1.213c.829 0 1.354-.415 1.354-.987 0-.682-.542-.927-1.452-1.324l-.502-.216c-1.435-.613-2.404-1.378-2.404-3.005 0-1.5 1.167-2.638 2.917-2.638a2.957 2.957 0 0 1 2.842 1.599l-1.552.999a1.362 1.362 0 0 0-1.29-.858.873.873 0 0 0-.957.858c0 .583.374.84 1.226 1.213l.502.216c1.697.733 2.654 1.47 2.654 3.139 0 1.798-1.412 2.783-3.308 2.783a3.839 3.839 0 0 1-3.618-2.046zm-7.048.175c.315.583.583 1.027 1.283 1.027s1.066-.256 1.066-1.255v-6.774h1.998v6.804c0 2.064-1.214 3.01-2.982 3.01a3.104 3.104 0 0 1-2.993-1.826z" fill="#ffecb3"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-lib" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#c0ca33" fill-rule="nonzero"/><path d="M17.39 12.544a2.05 2.05 0 0 0 2.05-2.05 2.05 2.05 0 0 0-2.05-2.052 2.05 2.05 0 0 0-2.05 2.051 2.05 2.05 0 0 0 2.05 2.051m0 2.42a8.992 8.992 0 0 0-6.152-2.42v7.52c2.392 0 4.539.923 6.152 2.42a8.992 8.992 0 0 1 6.152-2.42v-7.52c-2.392 0-4.539.923-6.152 2.42z" fill="#f0f4c3" stroke-width=".684"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-lib-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#c0ca33"/><path d="M17.391 12.543a2.05 2.05 0 0 0 2.05-2.05 2.05 2.05 0 0 0-2.05-2.052 2.05 2.05 0 0 0-2.05 2.051 2.05 2.05 0 0 0 2.05 2.051m0 2.42a8.992 8.992 0 0 0-6.152-2.42v7.52c2.392 0 4.539.923 6.152 2.42a8.992 8.992 0 0 1 6.152-2.42v-7.52c-2.392 0-4.539.923-6.152 2.42z" fill="#f0f4c3" stroke-width=".684"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-actions" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ab47bc" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#e1bee7" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-actions-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ab47bc"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#e1bee7" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-effects" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00bcd4" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#b2ebf2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-effects-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00bcd4"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#b2ebf2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef5350" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#ffcdd2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-reducer-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef5350"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#ffcdd2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-state" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#dcedc8" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-state-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#dcedc8" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-node" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.25 8.403c-.188 0-.382.048-.542.139l-5.166 2.986a1.096 1.096 0 0 0-.542.944v5.959c0 .388.208.75.542.944l1.354.778c.66.32.882.326 1.187.326.973 0 1.535-.59 1.535-1.618V12.98a.154.154 0 0 0-.153-.153h-.646c-.09 0-.16.07-.16.153v5.882c0 .458-.472.91-1.228.528l-1.424-.813a.181.181 0 0 1-.076-.145v-5.959c0-.062.027-.118.076-.146l5.167-2.979a.15.15 0 0 1 .152 0l5.167 2.98a.164.164 0 0 1 .076.145v5.959a.181.181 0 0 1-.076.145l-5.167 2.98c-.041.027-.11.027-.16 0l-1.305-.792c-.055-.021-.111-.028-.146-.007-.368.208-.437.25-.778.354-.083.028-.215.076.05.222l1.721 1.021c.167.097.348.146.542.146s.375-.049.542-.146l5.166-2.979c.334-.194.542-.556.542-.944v-5.959c0-.389-.208-.75-.542-.944l-5.166-2.986a1.103 1.103 0 0 0-.542-.14m1.389 4.272c-1.472 0-2.354.618-2.354 1.66 0 1.117.875 1.444 2.291 1.583 1.688.166 1.82.416 1.82.75 0 .576-.465.82-1.549.82-1.375 0-1.666-.341-1.77-1.022a.157.157 0 0 0-.153-.125h-.667c-.083 0-.146.063-.146.153 0 .861.472 1.903 2.736 1.903 1.632 0 2.57-.646 2.57-1.771 0-1.118-.75-1.41-2.34-1.625-1.605-.208-1.765-.32-1.765-.694 0-.313.14-.73 1.327-.73 1.042 0 1.451.23 1.611.945.014.07.076.118.146.118h.673a.134.134 0 0 0 .105-.049c.027-.028.048-.07.034-.11-.097-1.237-.916-1.806-2.57-1.806z" fill-rule="nonzero" fill="#f1f8e9"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-node-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.25 8.403c-.188 0-.382.048-.542.139l-5.166 2.986a1.096 1.096 0 0 0-.542.944v5.959c0 .388.208.75.542.944l1.354.778c.66.32.882.326 1.187.326.973 0 1.535-.59 1.535-1.618V12.98a.154.154 0 0 0-.153-.153h-.646c-.09 0-.16.07-.16.153v5.882c0 .458-.472.91-1.228.528l-1.424-.813a.181.181 0 0 1-.076-.145v-5.959c0-.062.027-.118.076-.146l5.167-2.979a.15.15 0 0 1 .152 0l5.167 2.98a.164.164 0 0 1 .076.145v5.959a.181.181 0 0 1-.076.145l-5.167 2.98c-.041.027-.11.027-.16 0l-1.305-.792c-.055-.021-.111-.028-.146-.007-.368.208-.437.25-.778.354-.083.028-.215.076.05.222l1.721 1.021c.167.097.348.146.542.146s.375-.049.542-.146l5.166-2.979c.334-.194.542-.556.542-.944v-5.959c0-.389-.208-.75-.542-.944l-5.166-2.986a1.103 1.103 0 0 0-.542-.14m1.389 4.272c-1.472 0-2.354.618-2.354 1.66 0 1.117.875 1.444 2.291 1.583 1.688.166 1.82.416 1.82.75 0 .576-.465.82-1.549.82-1.375 0-1.666-.341-1.77-1.022a.157.157 0 0 0-.153-.125h-.667c-.083 0-.146.063-.146.153 0 .861.472 1.903 2.736 1.903 1.632 0 2.57-.646 2.57-1.771 0-1.118-.75-1.41-2.34-1.625-1.605-.208-1.765-.32-1.765-.694 0-.313.14-.73 1.327-.73 1.042 0 1.451.23 1.611.945.014.07.076.118.146.118h.673a.134.134 0 0 0 .105-.049c.027-.028.048-.07.034-.11-.097-1.237-.916-1.806-2.57-1.806z" fill-rule="nonzero" fill="#f1f8e9"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-public" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><path d="M20.036 16.746c.05-.408.087-.817.087-1.237s-.037-.83-.087-1.238h2.091c.099.396.16.81.16 1.238a5.1 5.1 0 0 1-.16 1.237m-3.186 3.44c.371-.687.656-1.43.854-2.203h1.825a4.968 4.968 0 0 1-2.679 2.203m-.155-3.44h-2.895c-.062-.408-.099-.817-.099-1.237s.037-.835.1-1.238h2.894c.056.403.1.817.1 1.238s-.044.829-.1 1.237m-1.447 3.687a8.39 8.39 0 0 1-1.182-2.45h2.363a8.39 8.39 0 0 1-1.181 2.45m-2.475-7.399h-1.806a4.902 4.902 0 0 1 2.672-2.202c-.37.686-.65 1.429-.866 2.202m-1.806 4.95h1.806c.217.773.495 1.515.866 2.202a4.954 4.954 0 0 1-2.672-2.203m-.508-1.237a5.099 5.099 0 0 1-.16-1.237 5.1 5.1 0 0 1 .16-1.238h2.091c-.049.409-.086.817-.086 1.238s.037.829.086 1.237m2.698-6.168a8.425 8.425 0 0 1 1.181 2.456h-2.363a8.426 8.426 0 0 1 1.182-2.456m4.28 2.456h-1.824a9.682 9.682 0 0 0-.854-2.202 4.94 4.94 0 0 1 2.679 2.202m-4.281-3.712a6.193 6.193 0 0 0-6.187 6.187 6.186 6.186 0 0 0 6.187 6.186 6.186 6.186 0 0 0 6.186-6.186 6.186 6.186 0 0 0-6.186-6.187z" fill="#b3e5fc" stroke-width=".619"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-public-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><path d="M20.037 16.746c.05-.408.087-.817.087-1.237s-.037-.83-.087-1.238h2.091c.099.396.16.81.16 1.238a5.1 5.1 0 0 1-.16 1.237m-3.186 3.44c.371-.687.656-1.43.854-2.203h1.825a4.967 4.967 0 0 1-2.68 2.203m-.154-3.44h-2.895c-.062-.408-.099-.817-.099-1.237s.037-.835.099-1.238h2.895c.056.403.1.817.1 1.238s-.044.829-.1 1.237m-1.447 3.687a8.39 8.39 0 0 1-1.182-2.45h2.363a8.39 8.39 0 0 1-1.181 2.45m-2.475-7.399H13.06a4.902 4.902 0 0 1 2.672-2.202c-.371.686-.65 1.429-.866 2.202m-1.806 4.95h1.806c.217.773.495 1.515.866 2.202a4.954 4.954 0 0 1-2.672-2.203m-.508-1.237a5.099 5.099 0 0 1-.16-1.237 5.1 5.1 0 0 1 .16-1.238h2.091c-.05.409-.086.817-.086 1.238s.037.829.086 1.237m2.698-6.168a8.425 8.425 0 0 1 1.181 2.456h-2.363a8.426 8.426 0 0 1 1.182-2.456m4.28 2.456h-1.824a9.682 9.682 0 0 0-.854-2.202 4.941 4.941 0 0 1 2.679 2.202M17.34 9.322a6.193 6.193 0 0 0-6.187 6.187 6.186 6.186 0 0 0 6.187 6.186 6.186 6.186 0 0 0 6.186-6.186 6.186 6.186 0 0 0-6.186-6.187z" fill="#b3e5fc" stroke-width=".619"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-react-components" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00bcd4" fill-rule="nonzero"/><path d="M16.473 13.927c.723 0 1.313.59 1.313 1.327 0 .703-.59 1.3-1.313 1.3a1.318 1.318 0 0 1-1.313-1.3c0-.737.59-1.327 1.313-1.327m-3.252 6.946c.443.267 1.412-.14 2.529-1.194a17.015 17.015 0 0 1-1.06-1.335 15.945 15.945 0 0 1-1.686-.252c-.358 1.502-.225 2.535.217 2.78m.499-4.03l-.204-.359a5.558 5.558 0 0 0-.203.604c.19.042.4.078.618.113l-.211-.359m4.593-.533l.569-1.054-.569-1.053c-.21-.372-.435-.702-.639-1.032-.38-.022-.78-.022-1.2-.022-.422 0-.823 0-1.202.022-.204.33-.428.66-.639 1.032l-.569 1.053.57 1.054c.21.372.434.702.638 1.032.38.021.78.021 1.201.021.421 0 .822 0 1.201-.02.204-.331.428-.661.639-1.033m-1.84-4.72c-.133.155-.274.316-.414.506h.828c-.14-.19-.28-.351-.414-.506m0 7.332c.133-.154.274-.316.414-.505h-.828c.14.19.28.35.414.505m3.245-9.284c-.436-.267-1.405.14-2.522 1.194.366.414.724.864 1.06 1.334.577.057 1.146.14 1.686.253.359-1.503.225-2.535-.224-2.78m-.492 4.03l.204.358c.077-.203.154-.407.203-.604-.19-.042-.4-.077-.618-.112l.211.358m1.018-4.95c1.033.589 1.145 2.141.71 3.953 1.784.527 3.069 1.398 3.069 2.584 0 1.187-1.285 2.058-3.07 2.585.436 1.812.324 3.364-.709 3.954-1.025.59-2.423-.085-3.77-1.37-1.35 1.285-2.747 1.96-3.78 1.37-1.025-.59-1.137-2.142-.702-3.954-1.783-.527-3.069-1.398-3.069-2.585s1.286-2.057 3.07-2.584c-.436-1.812-.324-3.364.702-3.954 1.032-.59 2.43.084 3.778 1.37 1.348-1.286 2.746-1.96 3.771-1.37m-.203 6.538c.239.527.45 1.054.625 1.588 1.475-.443 2.303-1.075 2.303-1.588 0-.512-.828-1.144-2.303-1.587a15.81 15.81 0 0 1-.625 1.587m-7.136 0a15.806 15.806 0 0 1-.625-1.587c-1.474.443-2.303 1.075-2.303 1.587 0 .513.829 1.145 2.303 1.588.176-.534.387-1.06.625-1.588m6.321 1.588l-.21.358c.217-.035.428-.07.617-.113-.049-.196-.126-.4-.203-.604l-.204.359m-2.03 2.837c1.117 1.053 2.086 1.46 2.522 1.194.45-.246.583-1.278.224-2.781-.54.112-1.11.196-1.685.253-.337.47-.695.92-1.06 1.334m-3.477-6.012l.21-.358c-.217.035-.428.07-.617.113.049.196.126.4.203.604l.204-.359m2.03-2.837c-1.117-1.053-2.086-1.46-2.529-1.194-.442.246-.576 1.278-.217 2.781.54-.112 1.11-.196 1.685-.253.337-.47.695-.92 1.06-1.334z" fill="#b2ebf2" stroke-width=".702"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-react-components-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00bcd4"/><path d="M16.473 13.928c.723 0 1.313.59 1.313 1.327 0 .703-.59 1.3-1.313 1.3a1.318 1.318 0 0 1-1.313-1.3c0-.737.59-1.327 1.313-1.327m-3.252 6.946c.443.267 1.412-.14 2.529-1.194a16.997 16.997 0 0 1-1.06-1.335 15.945 15.945 0 0 1-1.686-.252c-.358 1.502-.225 2.535.217 2.78m.499-4.03l-.204-.359c-.077.204-.154.408-.203.604.19.042.4.078.618.113l-.211-.359m4.593-.533l.569-1.054-.57-1.053c-.21-.372-.434-.702-.638-1.032-.38-.022-.78-.022-1.201-.022-.421 0-.822 0-1.2.022-.205.33-.43.66-.64 1.032l-.569 1.053.569 1.054c.21.372.435.702.64 1.032.378.021.779.021 1.2.021.421 0 .822 0 1.2-.02.205-.33.43-.661.64-1.033m-1.84-4.72c-.133.155-.274.316-.414.506h.828c-.14-.19-.28-.351-.414-.506m0 7.332c.133-.154.274-.316.414-.505h-.828c.14.19.28.35.414.505m3.244-9.284c-.435-.267-1.404.14-2.52 1.194.364.414.723.864 1.06 1.334.575.057 1.144.14 1.685.253.358-1.503.225-2.535-.225-2.78m-.491 4.03l.203.358c.078-.203.155-.407.204-.604-.19-.042-.4-.077-.618-.112l.21.358m1.02-4.95c1.032.589 1.144 2.141.708 3.953 1.784.527 3.07 1.398 3.07 2.584 0 1.187-1.286 2.058-3.07 2.585.436 1.812.323 3.364-.709 3.954-1.025.59-2.423-.085-3.771-1.37-1.348 1.285-2.746 1.96-3.778 1.37-1.026-.59-1.138-2.142-.703-3.954-1.783-.527-3.069-1.398-3.069-2.585s1.286-2.057 3.07-2.584c-.436-1.812-.324-3.364.702-3.954 1.032-.59 2.43.084 3.778 1.37 1.348-1.286 2.746-1.96 3.771-1.37m-.204 6.538c.24.527.45 1.054.625 1.588 1.475-.443 2.304-1.075 2.304-1.588 0-.512-.829-1.144-2.304-1.587a15.81 15.81 0 0 1-.625 1.587m-7.135 0a15.808 15.808 0 0 1-.625-1.587c-1.475.443-2.303 1.075-2.303 1.587 0 .513.828 1.145 2.303 1.588.176-.534.386-1.06.625-1.588m6.32 1.588l-.21.358c.218-.035.428-.07.618-.113a5.56 5.56 0 0 0-.204-.604l-.203.359m-2.03 2.837c1.117 1.053 2.086 1.46 2.521 1.194.45-.246.583-1.278.225-2.781-.54.112-1.11.196-1.685.253-.338.47-.696.92-1.06 1.334m-3.477-6.012l.21-.358c-.217.035-.428.07-.617.112.049.197.126.4.203.604l.204-.358m2.03-2.837c-1.117-1.053-2.086-1.46-2.529-1.194-.442.246-.576 1.278-.217 2.781.54-.112 1.11-.196 1.685-.253.337-.47.695-.92 1.06-1.334z" fill="#b2ebf2" stroke-width=".702"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-actions" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ab47bc" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#e1bee7" stroke="#e1bee7" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-actions-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ab47bc"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#e1bee7" stroke="#e1bee7" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef5350" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#ffcdd2" stroke="#ffcdd2" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-reducer-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef5350"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#ffcdd2" stroke="#ffcdd2" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-store" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#dcedc8" stroke="#dcedc8" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-store-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#dcedc8" stroke="#dcedc8" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-resource" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#fbc02d" fill-rule="nonzero"/><path d="M21.598 12.059h-6.085v-1.217h6.085m-2.434 6.085h-3.65V15.71h3.65m2.434-1.217h-6.085v-1.217h6.085m.608-4.26h-7.301a1.217 1.217 0 0 0-1.217 1.218v7.301a1.217 1.217 0 0 0 1.217 1.217h7.301a1.217 1.217 0 0 0 1.217-1.217v-7.301a1.217 1.217 0 0 0-1.217-1.217m-9.735 2.434h-1.217v8.518a1.217 1.217 0 0 0 1.217 1.217h8.519v-1.217H12.47z" fill="#fff9c4" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-resource-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#fbc02d"/><path d="M21.598 12.059h-6.085v-1.217h6.085m-2.434 6.085h-3.65V15.71h3.65m2.434-1.217h-6.085v-1.217h6.085m.608-4.26h-7.301a1.217 1.217 0 0 0-1.217 1.218v7.301a1.217 1.217 0 0 0 1.217 1.217h7.301a1.217 1.217 0 0 0 1.217-1.217v-7.301a1.217 1.217 0 0 0-1.217-1.217m-9.735 2.433h-1.217v8.519a1.217 1.217 0 0 0 1.217 1.217h8.519v-1.217H12.47z" fill="#fff9c4" stroke-width=".608"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" id="folder-sass" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#f8bbd0" fill-rule="nonzero"/><path d="M23.36 10.506c-.39-1.527-2.922-2.03-5.319-1.178-1.426.507-2.97 1.302-4.08 2.34-1.32 1.235-1.53 2.31-1.444 2.759.306 1.584 2.477 2.62 3.37 3.388v.005c-.264.13-2.19 1.104-2.64 2.1-.476 1.052.075 1.806.44 1.908 1.131.315 2.292-.251 2.916-1.182.602-.897.551-2.056.29-2.633.36-.095.781-.138 1.316-.076 1.508.177 1.804 1.118 1.748 1.513-.057.394-.373.61-.48.676-.105.065-.137.088-.129.137.013.07.062.068.152.053.125-.021.792-.321.821-1.048.037-.924-.849-1.958-2.416-1.93-.646.01-1.052.072-1.345.181-.022-.024-.044-.05-.067-.073-.969-1.034-2.76-1.765-2.684-3.156.027-.505.203-1.835 3.442-3.45 2.653-1.322 4.777-.957 5.145-.151.524 1.152-1.136 3.293-3.891 3.601-1.05.118-1.603-.289-1.74-.44-.145-.16-.166-.167-.22-.137-.088.049-.033.19 0 .274.082.214.42.594.995.782.506.166 1.739.258 3.23-.319 1.669-.646 2.972-2.443 2.59-3.944zm-7.103 7.783a2.2 2.2 0 0 1-.065 1.413 2.405 2.405 0 0 1-.453.704c-.5.546-1.198.752-1.497.579-.323-.188-.161-.956.418-1.568.623-.66 1.52-1.083 1.52-1.083l-.002-.002.079-.043z" fill="#ec407a" fill-rule="nonzero" stroke="#ec407a" stroke-width=".5199012000000001"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" id="folder-sass-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#f8bbd0" fill-rule="nonzero"/><path d="M23.36 10.506c-.39-1.527-2.922-2.03-5.319-1.178-1.426.507-2.97 1.302-4.08 2.34-1.32 1.235-1.53 2.31-1.444 2.759.306 1.584 2.477 2.62 3.37 3.388v.005c-.264.13-2.19 1.104-2.64 2.1-.476 1.052.075 1.806.44 1.908 1.131.315 2.292-.251 2.916-1.182.602-.897.551-2.056.29-2.633.36-.095.781-.138 1.316-.076 1.508.177 1.804 1.118 1.748 1.513-.057.394-.373.61-.48.676-.105.065-.137.088-.129.137.013.07.062.068.152.053.125-.021.792-.321.821-1.048.037-.924-.849-1.958-2.416-1.93-.646.01-1.052.072-1.345.181-.022-.024-.044-.05-.067-.073-.969-1.034-2.76-1.765-2.684-3.156.027-.505.203-1.835 3.442-3.45 2.653-1.322 4.777-.957 5.145-.151.524 1.152-1.136 3.293-3.891 3.601-1.05.118-1.603-.289-1.74-.44-.145-.16-.166-.167-.22-.137-.088.049-.033.19 0 .274.082.214.42.594.995.782.506.166 1.739.258 3.23-.319 1.669-.646 2.972-2.443 2.59-3.944zm-7.103 7.783a2.2 2.2 0 0 1-.065 1.413 2.405 2.405 0 0 1-.453.704c-.5.546-1.198.752-1.497.579-.323-.188-.161-.956.418-1.568.623-.66 1.52-1.083 1.52-1.083l-.002-.002.079-.043z" fill="#ec407a" fill-rule="nonzero" stroke="#ec407a" stroke-width=".5199012000000001"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-scripts" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#546e7a" fill-rule="nonzero"/><path d="M18.466 20.241c.69 0 1.259-.568 1.259-1.258v-8.18H15.32a.632.632 0 0 0-.63.63v6.292h-1.887v-6.922c0-1.036.852-1.888 1.888-1.888h6.921c1.036 0 1.888.852 1.888 1.888v.63h-2.517v8.18a1.896 1.896 0 0 1-1.888 1.887h-6.292a1.896 1.896 0 0 1-1.888-1.888v-.629h6.293c0 .69.568 1.258 1.258 1.258z" fill-rule="nonzero" fill="#cfd8dc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-scripts-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#546e7a" fill-rule="nonzero"/><path d="M18.466 20.241c.69 0 1.259-.568 1.259-1.258v-8.18H15.32a.632.632 0 0 0-.63.63v6.292h-1.887v-6.922c0-1.036.852-1.888 1.888-1.888h6.921c1.036 0 1.888.852 1.888 1.888v.63h-2.517v8.18a1.896 1.896 0 0 1-1.888 1.887h-6.292a1.896 1.896 0 0 1-1.888-1.888v-.629h6.293c0 .69.568 1.258 1.258 1.258z" fill-rule="nonzero" fill="#cfd8dc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-src" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#4caf50" fill-rule="nonzero"/><g fill="#c8e6c9" transform="translate(2.065 -.225) scale(.70678)"><path d="M19.146 30.989a.902.902 0 0 1-.207-.025 1.045 1.045 0 0 1-.726-1.213l2.709-14.431c.049-.279.209-.525.444-.683a.891.891 0 0 1 .7-.122c.519.152.837.684.727 1.213L20.077 30.16a1.032 1.032 0 0 1-.442.681.895.895 0 0 1-.489.148zM24.578 28.944h-.068a.932.932 0 0 1-.668-.377 1.104 1.104 0 0 1 .1-1.419l4.658-4.553-4.638-4.239a1.105 1.105 0 0 1-.141-1.416.938.938 0 0 1 .661-.4.9.9 0 0 1 .709.237l5.47 5c.386.372.448.974.144 1.416a1.05 1.05 0 0 1-.142.163l-5.447 5.324a.913.913 0 0 1-.638.264zM16.423 28.947a.917.917 0 0 1-.639-.267l-5.452-5.327a.874.874 0 0 1-.132-.153 1.097 1.097 0 0 1 .141-1.414l5.471-5a.882.882 0 0 1 .7-.238.939.939 0 0 1 .665.4 1.104 1.104 0 0 1-.14 1.417L12.4 22.6l4.659 4.551c.377.382.42.988.1 1.419a.928.928 0 0 1-.669.377z" fill-rule="nonzero"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-src-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#4caf50"/><g fill="#c8e6c9" fill-rule="evenodd" transform="translate(2.064 -.224) scale(.70678)"><path d="M19.146 30.989a.902.902 0 0 1-.207-.025 1.045 1.045 0 0 1-.726-1.213l2.709-14.431c.049-.279.209-.525.444-.683a.891.891 0 0 1 .7-.122c.519.152.837.684.727 1.213L20.077 30.16a1.032 1.032 0 0 1-.442.681.895.895 0 0 1-.489.148zM24.578 28.944h-.068a.932.932 0 0 1-.668-.377 1.104 1.104 0 0 1 .1-1.419l4.658-4.553-4.638-4.239a1.105 1.105 0 0 1-.141-1.416.938.938 0 0 1 .661-.4.9.9 0 0 1 .709.237l5.47 5c.386.372.448.974.144 1.416a1.05 1.05 0 0 1-.142.163l-5.447 5.324a.913.913 0 0 1-.638.264zM16.423 28.947a.917.917 0 0 1-.639-.267l-5.452-5.327a.874.874 0 0 1-.132-.153 1.097 1.097 0 0 1 .141-1.414l5.471-5a.882.882 0 0 1 .7-.238.939.939 0 0 1 .665.4 1.104 1.104 0 0 1-.14 1.417L12.4 22.6l4.659 4.551c.377.382.42.988.1 1.419a.928.928 0 0 1-.669.377z" fill-rule="nonzero"/></g></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-test" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#1de9b6" fill-rule="nonzero"/><path d="M14 8.097v1.39h.695v9.732A2.794 2.794 0 0 0 17.475 22a2.794 2.794 0 0 0 2.781-2.78V9.486h.695v-1.39H14m2.78 9.732c-.417 0-.695-.278-.695-.695 0-.417.278-.695.696-.695.417 0 .695.278.695.695 0 .417-.278.695-.695.695m1.39-2.78c-.417 0-.695-.278-.695-.696 0-.417.278-.695.695-.695.417 0 .695.278.695.695 0 .418-.278.696-.695.696m.695-3.476h-2.78V9.487h2.78v2.086z" fill="#00897b" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-test-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#1de9b6" fill-rule="nonzero"/><path d="M14 8.097v1.39h.695v9.732A2.794 2.794 0 0 0 17.475 22a2.794 2.794 0 0 0 2.781-2.78V9.486h.695v-1.39H14m2.78 9.732c-.417 0-.695-.278-.695-.695 0-.417.278-.695.696-.695.417 0 .695.278.695.695 0 .417-.278.695-.695.695m1.39-2.78c-.417 0-.695-.278-.695-.696 0-.417.278-.695.695-.695.417 0 .695.278.695.695 0 .418-.278.696-.695.696m.695-3.476h-2.78V9.487h2.78v2.086z" fill="#00897b" fill-rule="nonzero"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-tools" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#1e88e5" fill-rule="nonzero"/><path d="M21.043 15.266a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141-2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-3.569 0a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141 2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m3.925-6.424a6.424 6.424 0 0 0-6.423 6.424 6.424 6.424 0 0 0 6.423 6.424 1.07 1.07 0 0 0 1.071-1.07c0-.28-.107-.53-.278-.715a1.105 1.105 0 0 1-.271-.713 1.07 1.07 0 0 1 1.07-1.071h1.263a3.569 3.569 0 0 0 3.57-3.569c0-3.154-2.877-5.71-6.425-5.71z" fill="#bbdefb" stroke-width=".714"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-tools-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#1e88e5"/><path d="M21.043 15.266a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141-2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-3.569 0a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141 2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m3.925-6.424a6.424 6.424 0 0 0-6.423 6.424 6.424 6.424 0 0 0 6.423 6.424 1.07 1.07 0 0 0 1.071-1.07c0-.28-.107-.53-.278-.715a1.105 1.105 0 0 1-.271-.713 1.07 1.07 0 0 1 1.07-1.071h1.263a3.569 3.569 0 0 0 3.57-3.569c0-3.154-2.877-5.71-6.425-5.71z" fill="#bbdefb" stroke-width=".714"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-views" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ff8a65" fill-rule="nonzero"/><path d="M12.487 21.868L11.384 9.5H23.5l-1.104 12.366-4.961 1.375-4.948-1.373zm4.464-3.2l-3.926-2.36v-.855l3.926-2.361v1.323l-2.504 1.465 2.504 1.465v1.323zm.982-.001v-1.323l2.522-1.464-2.522-1.464v-1.323l3.926 2.35v.874l-3.926 2.35z" fill="#e44d26"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-views-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ff8a65" fill-rule="nonzero"/><path d="M12.487 21.868L11.384 9.5H23.5l-1.104 12.366-4.961 1.375-4.948-1.373zm4.464-3.2l-3.926-2.36v-.855l3.926-2.361v1.323l-2.504 1.465 2.504 1.465v1.323zm.982-.001v-1.323l2.522-1.464-2.522-1.464v-1.323l3.926 2.35v.874l-3.926 2.35z" fill="#e44d26"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vscode" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#42a5f5" fill-rule="nonzero"/><path d="M20.811 8.52l-5.988 5.506-3.346-2.522-1.383.805 3.298 3.03-3.298 3.032 1.383.807 3.346-2.522 5.988 5.503 2.921-1.419V9.94zm0 3.622v6.396l-4.245-3.198z" fill="#bbdefb" stroke-width=".974"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vscode-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#42a5f5" fill-rule="nonzero"/><path d="M20.81 8.52l-5.988 5.506-3.346-2.522-1.384.805 3.3 3.03-3.3 3.032 1.384.807 3.346-2.522 5.988 5.503 2.921-1.419V9.94zm0 3.621v6.397l-4.245-3.198z" fill="#bbdefb" stroke-width=".974"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vue" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#009688" fill-rule="nonzero"/><g transform="translate(8.459 6.362) scale(.69572)"><path d="M1.821 4.15l10.21 17.618L22.239 4.235v-.084h-7.692l-2.434 4.178-2.422-4.178z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179z" fill="#35495e"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vue-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#009688"/><g transform="translate(8.458 6.362) scale(.69572)"><path d="M1.821 4.15l10.21 17.618L22.239 4.235v-.084h-7.692l-2.434 4.178-2.422-4.178z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179z" fill="#35495e"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-webpack" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#03a9f4" fill-rule="nonzero"/><g transform="translate(9.192 7.48) scale(.66328)"><path d="M19.376 15.988l-7.708 4.45-7.709-4.45v-8.9l7.709-4.451 7.708 4.45z" fill="#fff" fill-opacity=".785"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18s.41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.94v2.103h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#1c78c0"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-webpack-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#03a9f4"/><g transform="translate(9.193 7.48) scale(.66328)"><path d="M19.376 15.988l-7.708 4.45-7.709-4.45v-8.9l7.709-4.451 7.708 4.45z" fill="#fff" fill-opacity=".785"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18s.41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.94v2.103h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#1c78c0"/></g></symbol><symbol viewBox="0 0 24 24" id="font" xmlns="http://www.w3.org/2000/svg"><path d="M9.62 12L12 5.67 14.37 12M11 3L5.5 17h2.25l1.12-3h6.25l1.13 3h2.25L13 3h-2z" fill="#f44336"/></symbol><symbol viewBox="0 0 500 500" id="fsharp" xmlns="http://www.w3.org/2000/svg"><path d="M235.906 36.66L21.963 250.601l213.943 213.943v-84.36L106.209 250.487l129.697-129.696z" fill="#378bba" stroke-width="14.706"/><path d="M235.906 156.614l-93.622 93.62 93.622 93.622z" fill="#378bba" stroke-width="15.006"/><path d="M263.417 36.64L477.36 250.583 263.417 464.526v-84.36l129.696-129.697-129.696-129.696z" fill="#30b9db" stroke-width="14.706"/></symbol><symbol viewBox="0 0 152.99 160.01" id="fusebox" xmlns="http://www.w3.org/2000/svg"><defs id="fkdefs4"><style id="fkstyle2">.fkcls-1{fill:#fff}.fkcls-2{fill:#515151}.fkcls-3{fill:#1d79bf}.fkcls-4{fill:#383838}</style></defs><title id="fktitle6">Asset 3</title><g id="fkLayer_2" data-name="Layer 2" transform="matrix(.87285 0 0 .87285 10.17 10.175)"><g id="fkFuse_Box" data-name="Fuse Box"><g id="fkLOGO"><path class="fkcls-1" id="fkpolygon8" fill="#fff" d="M76.56 2.19l74.22 24.93-7.7 87.77-65.41 42.66-69.79-43.93-5.7-86.13z"/><path class="fkcls-2" d="M77.69 160L5.87 114.81 0 26 76.55 0 153 25.67l-7.94 90.4zM9.88 112.43l67.77 42.66 63.45-41.39 7.47-85.13-72-24.18L4.36 28.95z" id="fkpath10" fill="#515151"/><path class="fkcls-3" id="fkpolygon12" fill="#1d79bf" d="M76.4 148.8V61.68l66.93-29.82-5.99 78.77z"/><path id="fkF" class="fkcls-4" fill="#383838" d="M76.4 148.8l-60.35-37.39L9.63 31.8 76.4 61.68z"/><path class="fkcls-1" d="M25.58 52.73l.54 15.93 37.35 18.18.12 14.69-37-18.21 1.64 37.1-14.56-9-5.05-80.55 67.79 30.82v15.46z" id="fkpath15" fill="#fff"/><path class="fkcls-1" d="M135.91 90.77c-.08 13.12-6.33 26.59-16.77 33.12l-42.8 27.93V61.71l42.27-18.84c5.16-2.41 9.51-1.43 12.4 3.11 1.9 3 2.89 7.23 2.86 12.21A35.69 35.69 0 0 1 129.34 76c4.29 2 6.66 6.55 6.57 14.77zM123 63.76c0-4.64-2-6.93-4.92-5.45l-29 14.48L89 90l29.44-15.59c2.5-1.32 4.56-5.91 4.56-10.65zM125.15 96c0-5.71-2.42-8.24-6.55-5.93L89 106.64v19.58l29.34-17.46c4.43-2.64 6.79-7.27 6.81-12.76z" id="fkpath17" fill="#fff"/><path id="fkTOP" class="fkcls-4" fill="#383838" d="M76.4 8.82L9.71 31.77l109.77 2.38-84.02 9.21L76.4 61.68l20.76-9.25-27.73-1.37 49.78-8.46 24.12-10.74z"/></g></g></g></symbol><symbol viewBox="0 0 24 24" id="git" xmlns="http://www.w3.org/2000/svg"><path d="M2.6 10.59L8.38 4.8l1.69 1.7c-.24.85.15 1.78.93 2.23v5.54c-.6.34-1 .99-1 1.73a2 2 0 0 0 2 2 2 2 0 0 0 2-2c0-.74-.4-1.39-1-1.73V9.41l2.07 2.09c-.07.15-.07.32-.07.5a2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.18 0-.35 0-.5.07L13.93 7.5a1.98 1.98 0 0 0-1.15-2.34c-.43-.16-.88-.2-1.28-.09L9.8 3.38l.79-.78c.78-.79 2.04-.79 2.82 0l7.99 7.99c.79.78.79 2.04 0 2.82l-7.99 7.99c-.78.79-2.04.79-2.82 0L2.6 13.41c-.79-.78-.79-2.04 0-2.82z" fill="#e64a19"/></symbol><symbol viewBox="0 0 494 455" id="gitlab" xmlns="http://www.w3.org/2000/svg"><title>logo</title><defs><path id="fma" d="M0 1173.3h2000V0H0v1173.3z"/></defs><g transform="matrix(.88256 0 0 -.88256 -286.767 742.766)" fill="none" fill-rule="evenodd"><mask id="fmb" fill="#fff"><use width="100%" height="100%" xlink:href="#fma"/></mask><g><g transform="translate(358.67 358.67)"><path d="M492.532 195.445l-27.559 84.815-54.617 168.1c-2.81 8.648-15.045 8.648-17.856 0l-54.619-168.1h-181.37l-54.62 168.1c-2.81 8.648-15.045 8.648-17.856 0l-54.617-168.1-27.557-84.815a18.775 18.775 0 0 1 6.82-20.992l238.51-173.29 238.51 173.29a18.777 18.777 0 0 1 6.82 20.992" fill="#fc6d26"/><path d="M247.2 1.16l90.684 279.1h-181.37z" fill="#e24329"/><path d="M247.201 1.16l-90.684 279.09H29.427z" fill="#fc6d26"/><path d="M29.422 280.256L1.862 195.44a18.774 18.774 0 0 1 6.822-20.991L247.194 1.16z" fill="#fca326"/><path d="M29.422 280.26h127.09l-54.619 168.1c-2.81 8.65-15.047 8.65-17.856 0z" fill="#e24329"/><path d="M247.2 1.16l90.684 279.09h127.09z" fill="#fc6d26"/><path d="M464.98 280.256l27.559-84.815a18.774 18.774 0 0 0-6.821-20.991L247.208 1.16z" fill="#fca326"/><path d="M464.97 280.26H337.88l54.619 168.1c2.81 8.65 15.047 8.65 17.856 0z" fill="#e24329"/></g></g></g></symbol><symbol viewBox="0 0 24 24" id="go" xmlns="http://www.w3.org/2000/svg"><path d="M10.575 1.695c-2.634 0-4.756 2.453-4.756 5.502v4.6l-.027-.003v4.71c0 3.05 2.123 5.502 4.757 5.502h2.286c2.634 0 4.757-2.453 4.757-5.502v-4.6a5.1 5.1 0 0 0 .026.003v-4.71c0-3.049-2.122-5.502-4.756-5.502h-2.287z" fill="#73cddc"/><rect width="2.289" height="3.335" x="-1.178" y="6.092" ry="1.125" transform="matrix(.4849 -.87457 .85979 .51065 0 0)" fill="#73cddc"/><rect width="2.297" height="3.39" x="10.261" y="-15.076" ry="1.143" transform="matrix(.44646 .8948 -.89204 .45195 0 0)" fill="#73cddc"/><circle cx="9.267" cy="5.13" r="2.054" fill="#fff" stroke="#5e5d5b" stroke-width=".1"/><circle cx="14.214" cy="5.116" r="2.054" fill="#fff" stroke="#5e5d5b" stroke-width=".1"/><ellipse cx="8.039" cy="5.051" rx=".792" ry=".901" fill="#030d18"/><path d="M11.792 9.556l.763.138a.403.689 0 0 1 .008.138.403.689 0 0 1-.402.69.403.689 0 0 1-.404-.69.403.689 0 0 1 .035-.276z" fill="#fff" stroke="#fff" stroke-width=".155"/><ellipse cx="8.51" cy="5.365" rx=".138" ry=".166" fill="#fff"/><ellipse cx="12.945" cy="5.189" rx=".792" ry=".901" fill="#030d18"/><ellipse cx="13.414" cy="5.446" rx=".138" ry=".166" fill="#fff"/><ellipse cx="-12.982" cy="-3.409" rx=".708" ry="1.026" transform="rotate(-129.403)" fill="#f6d2a1" stroke-width=".4"/><path d="M11.772 9.553l-.757.135a.4.672 0 0 0-.008.135.4.672 0 0 0 .4.672.4.672 0 0 0 .4-.672.4.672 0 0 0-.035-.27z" fill="#fff" stroke="#fff" stroke-width=".153"/><ellipse cx="1.841" cy="-21.563" rx=".707" ry="1.026" transform="scale(1 -1) rotate(50.597)" fill="#f6d2a1" stroke-width=".4"/><ellipse cx="-17.281" cy="-21.784" rx=".864" ry="1.27" transform="matrix(.3054 -.95222 -.97065 -.2405 0 0)" fill="#f6d2a1" stroke-width=".4"/><ellipse cx="22.885" cy="2.587" rx=".864" ry="1.27" transform="matrix(.22652 .974 .95652 -.29167 0 0)" fill="#f6d2a1" stroke-width=".4"/><path d="M10.708 8.392a.594.594 0 0 0-.594.597v.115c0 .331.264.598.594.598h.386a.973.772 0 0 1 .697-.235.973.772 0 0 1 .698.235h.334c.33 0 .594-.267.594-.598V8.99a.595.595 0 0 0-.594-.597h-2.115z" fill="#f6d2a1" stroke="#657075" stroke-width=".1"/><ellipse cx="11.734" cy="8.203" rx="1.208" ry=".68" fill="#030d18" stroke="#fff" stroke-width=".162"/></symbol><symbol viewBox="0 0 24 24" id="gradle" xmlns="http://www.w3.org/2000/svg"><path d="M21.718 5.503c-.731-1.315-2.04-1.708-2.963-1.727-1.133-.023-2.065.605-1.888 1.017.037.088.25.55.38.741.19.275.527.064.646 0 .353-.187.73-.248 1.16-.198.409.048.954.3 1.319 1.001.859 1.652-1.794 5.05-5.114 2.697-3.32-2.353-6.548-1.574-8.01-1.1-1.462.475-2.135.952-1.556 2.055.785 1.498.524 1.038 1.285 2.28 1.21 1.97 3.856-.908 3.856-.908-1.972 2.906-3.662 2.204-4.31 1.188a15.864 15.864 0 0 1-1.038-1.97c-4.993 1.76-3.642 9.534-3.642 9.534h2.48c.632-2.862 2.892-2.757 3.28 0h1.892c1.673-5.59 5.914 0 5.914 0h2.466c-.69-3.812 1.388-5.01 2.697-7.246 1.31-2.235 2.551-4.969 1.146-7.364zm-6.362 7.362c-1.304-.426-.837-1.723-.837-1.723s1.139.368 2.68.87c-.09.403-.856 1.175-1.843.853z" fill="#0097a7" stroke-width=".47"/></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 300 300" id="graphcool" xmlns="http://www.w3.org/2000/svg"><path d="M246.886 107.727c-12.237-6.892-27.616 2.1-30.081 3.646l-52.834 29.965c-7.8-6.196-18.914-5.933-26.412.625-7.499 6.558-9.24 17.537-4.14 26.094 5.102 8.556 15.588 12.246 24.923 8.768 9.335-3.478 14.852-13.129 13.111-22.937l52.688-29.9.321-.196c3.464-2.188 11.5-5.462 15.256-3.34 2.706 1.524 4.252 6.629 4.376 14.148h-.066v66.092a17.313 17.313 0 0 1-8.635 14.95l-75.739 43.755a17.312 17.312 0 0 1-17.261 0l-75.74-43.756a17.312 17.312 0 0 1-8.634-14.95V113.22c.01-6.165 3.3-11.86 8.634-14.95l68.549-39.562c6.522 7.482 17.451 9.25 26 4.206s12.283-15.468 8.886-24.794c-3.397-9.327-12.962-14.904-22.751-13.27-9.79 1.636-17.022 10.02-17.204 19.944L59.397 85.632a31.932 31.932 0 0 0-15.978 27.588v87.454a31.933 31.933 0 0 0 15.927 27.602l75.74 43.755a31.934 31.934 0 0 0 31.846 0l75.74-43.755a31.933 31.933 0 0 0 15.927-27.58V137.12h.05c.373-14.913-3.616-24.794-11.762-29.389z" fill="#27ae60" stroke="#27ae60" stroke-width="7.883622079999999"/></symbol><symbol viewBox="0 0 400 400" id="graphql" xmlns="http://www.w3.org/2000/svg"><path d="M67.008 293.022l-13.143-7.588L200.282 31.839l13.143 7.588z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M50.855 265.174H343.69v15.177H50.855z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M203.122 358.269L56.649 273.7l7.589-13.143 146.472 84.568zm127.24-220.407L183.889 53.293l7.589-13.143 146.472 84.568z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M64.278 137.803l-7.588-13.142 146.472-84.568 7.588 13.143z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M327.661 293.025L181.244 39.43l13.143-7.589 146.417 253.596zM62.466 114.597h15.176v169.136H62.466zm254.528 0h15.176v169.136h-15.176z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M200.538 351.845l-6.628-11.481L321.3 266.812l6.629 11.48z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M352.284 288.67c-8.777 15.268-28.342 20.48-43.61 11.703-15.268-8.777-20.48-28.342-11.703-43.61 8.777-15.268 28.342-20.48 43.61-11.703 15.36 8.869 20.57 28.342 11.703 43.61M97.574 141.567c-8.778 15.268-28.343 20.48-43.61 11.703-15.269-8.777-20.48-28.342-11.703-43.61 8.777-15.268 28.342-20.48 43.61-11.703 15.268 8.869 20.479 28.342 11.702 43.61M42.353 288.67c-8.777-15.268-3.566-34.741 11.702-43.61 15.268-8.776 34.741-3.565 43.61 11.703 8.776 15.268 3.565 34.741-11.703 43.61-15.36 8.776-34.833 3.565-43.61-11.703m254.71-147.103c-8.776-15.268-3.565-34.741 11.703-43.61 15.268-8.776 34.742-3.565 43.61 11.703 8.777 15.268 3.566 34.741-11.702 43.61-15.268 8.776-34.833 3.565-43.61-11.703m-99.745 236.608c-17.645 0-31.907-14.262-31.907-31.907s14.262-31.907 31.907-31.907 31.907 14.262 31.907 31.907c0 17.554-14.262 31.907-31.907 31.907m0-294.206c-17.645 0-31.907-14.262-31.907-31.907s14.262-31.907 31.907-31.907 31.907 14.262 31.907 31.907-14.262 31.907-31.907 31.907" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/></symbol><symbol viewBox="0 0 24 24" id="groovy" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.982a10.119 10.119 0 0 0-10.12 10.12A10.119 10.119 0 0 0 12 22.22 10.119 10.119 0 0 0 22.12 12.1 10.119 10.119 0 0 0 12 1.983zm1.254 2.422c.91 0 1.647.261 2.213.78.571.518.857 1.188.857 2.013 0 .889-.319 1.673-.959 2.35-.64.677-1.376 1.015-2.207 1.015-.486 0-.89-.119-1.213-.357-.317-.238-.476-.532-.476-.88 0-.212.06-.4.181-.563.127-.164.274-.246.438-.246.159 0 .238.092.238.277 0 .164.06.29.182.38.121.09.261.136.42.136.423 0 .828-.29 1.215-.866.391-.582.587-1.202.587-1.863 0-.465-.151-.844-.453-1.135-.301-.296-.69-.445-1.166-.445-.714 0-1.406.318-2.078.953-.666.635-1.211 1.47-1.635 2.506-.417 1.031-.627 2.014-.627 2.945 0 .857.185 1.54.555 2.047.37.503.863.754 1.477.754 1.037 0 2.027-.734 2.974-2.2l1.493-.212c.185-.026.277.018.277.135 0 .053-.072.28-.215.681-.143.402-.337 1.074-.586 2.016.82-.476 1.455-1.003 1.904-1.58v.914c-.36.418-1.046.888-2.062 1.412-.212 1.407-.682 2.493-1.406 3.26-.725.772-1.54 1.16-2.444 1.16-.433 0-.775-.102-1.023-.303-.243-.2-.365-.477-.365-.832 0-.984.955-1.94 2.865-2.865.2-.714.395-1.356.586-1.928-.333.482-.817.907-1.451 1.278-.635.37-1.225.554-1.77.554-.889 0-1.628-.383-2.22-1.15-.588-.772-.881-1.748-.881-2.928 0-1.243.333-2.42 1-3.531a7.747 7.747 0 0 1 2.625-2.674c1.084-.672 2.134-1.008 3.15-1.008zM12.03 16.592c-1.375.687-2.062 1.365-2.062 2.031 0 .354.169.533.508.533.666 0 1.184-.856 1.554-2.564z" fill="#26c6da"/></symbol><symbol viewBox="0 0 24 24" id="gulp" xmlns="http://www.w3.org/2000/svg"><path d="M8.37 15.94a596.238 596.238 0 0 1-.482-4.982c.002-.042-.225-.077-.505-.077h-.508V8.95h3.966V5.198l1.871-1.124c1.14-.685 1.978-1.125 2.144-1.125.4 0 .866.506.866.939 0 .19-.057.422-.127.517-.07.095-.722.53-1.45.966l-1.321.792-.029 1.393-.028 1.393h3.972v1.932h-.98l-.495 4.983-.495 4.983H8.854l-.485-4.906z" fill="#e53935"/></symbol><symbol viewBox="0 0 24 24" id="h" xmlns="http://www.w3.org/2000/svg"><path d="M16.745 19.818h-3.007v-5.882q0-2.381-1.736-2.381-.869 0-1.438.663-.56.662-.56 1.718v5.882H6.988V4.533h3.016v6.508h.037q1.186-1.802 3.193-1.802 3.511 0 3.511 4.239z" stroke-width=".478" fill="#0277bd"/></symbol><symbol viewBox="0 0 253.6 253.6" id="hack" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-29.243 -29.515) scale(1.2301)"><path fill="#607d8b" d="M69.496 159.551v52.576l51.77-52.576zM123.507 41.523l-54.01 52.755v55.084l54.01-54.009z"/><path fill="#eceff1" d="M130.023 95.663v51.501l52.128-51.5z"/><path fill="#607d8b" d="M185.465 101.867l-55.442 55.174v55.083l55.442-55.262z"/><path fill="#ffa000" d="M73.068 154.283l50.427.09v-50.248z"/></g></symbol><symbol viewBox="0 0 300 300.00001" id="haml" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 165.6)"><path d="M78.42-132.307c-12.047-.302-26.924 5.998-26.924 5.998l49.195 99.791L74.605 85.005c23.81 20.134 50.07 10.504 50.07 10.504L136.76 9.212c1.526 1.446 3.146 2.77 4.777 3.995 5.244 3.714 10.925 6.553 16.606 8.738 5.68 2.185 11.583 3.933 17.482 5.244 3.933.874 7.645 1.53 11.578 1.967-1.748 3.933-2.84 8.083-2.621 12.672 0 .437.22.873.656 1.092h.217c4.152 2.185 8.521 3.934 13.328 5.027 4.589.874 9.615 1.312 14.422.656 5.026-.655 10.051-2.623 13.984-5.9 3.933-3.278 6.774-7.648 8.522-12.237l.219-.218v-.217l.656-5.899v-.22c2.185-1.311 4.37-2.621 6.555-4.37 2.622-2.184 5.025-4.589 6.773-7.648 1.748-3.059 2.84-6.774 2.621-10.488-.218-3.496-1.53-6.99-3.06-10.049-1.53-3.059-3.495-5.901-5.68-8.523-4.37-5.026-9.614-9.176-15.295-12.454-5.462-3.496-11.581-6.338-17.7-8.304l-2.404-.656-1.962-.655c-1.311-.437-2.406-1.092-3.498-1.53-2.185-1.31-3.717-2.622-4.809-4.37-2.185-3.278-2.403-8.301-1.31-13.545.218-1.311.656-2.623 1.093-3.934a96.064 96.064 0 0 0 1.31-4.152c.314-1.412.51-2.829.598-4.402l29.203-25.553c-2.275-8.404-27.488-17.158-27.488-17.158l-74.931 63.726-43.243-81.584c-1.553-.35-3.218-.527-4.94-.57zm107.682 73.14c-.449 2.336-.647 4.795-.647 7.258.219 3.715 1.311 7.87 3.715 11.366 2.403 3.496 5.68 6.117 8.957 7.646a29.663 29.663 0 0 0 5.027 1.967l2.623.654 2.184.438c5.68 1.53 11.142 3.714 16.168 6.554 5.025 2.84 9.833 6.337 13.766 10.27s6.992 8.959 7.43 13.984c.218 3.496-.22 6.118-1.313 8.303-1.093 2.404-2.84 4.588-4.807 6.555-.874.874-1.966 1.747-2.84 2.402a27.11 27.11 0 0 0-.654-5.898c-.219-1.093-.438-1.966-.875-3.059-.437-.874-.872-1.966-1.965-2.621-.218 0-.44-.001-.44.217-1.31 3.277-3.494 6.12-5.898 8.086-2.403 1.966-5.462 2.84-8.521 3.058-3.06.219-6.338-.436-9.616-1.31-3.277-.874-6.552-1.968-9.83-3.06l-.439-.22c-.656-.218-1.526.002-1.963.44-1.748 2.185-3.06 4.149-4.59 6.334a58.435 58.435 0 0 0-2.84 5.027c-3.933-1.53-7.649-2.841-11.582-4.37-5.462-2.186-10.925-4.37-15.95-6.991-5.245-2.404-10.268-5.246-14.638-8.524-3.15-2.363-6.062-4.845-8.185-7.681l2.404-17.172z" fill="#f4511e" stroke-width="0" stroke-linejoin="round"/></g></symbol><symbol viewBox="0 0 24 24" id="handlebars" xmlns="http://www.w3.org/2000/svg"><path d="M8.55 10.32c-2.753 0-4.202 3.48-5.793 3.48-.98 0-1.126-.677-1.126-.915 0-.332.236-.706.564-.706.59 0 .414.77.414.77s.798-.555.272-1.298c-.42-.595-1.31-.623-1.92-.17-.617.458-1.057 1.146-.853 2.287.1.551.468 1.35 1.233 1.805.764.455 1.925.566 2.335.566 2.194 0 4.342-1.633 6.639-2.322a5.513 5.513 0 0 1 1.497-.222 6.19 6.19 0 0 1 1.92.226c2.296.689 4.444 2.323 6.638 2.323.41 0 1.57-.11 2.335-.566.765-.455 1.132-1.256 1.231-1.807.204-1.14-.235-1.829-.853-2.287-.61-.453-1.497-.423-1.918.172-.526.743.27 1.297.27 1.297s-.176-.77.414-.77c.329 0 .565.373.565.705 0 .238-.147.914-1.126.914-1.592 0-3.04-3.478-5.794-3.478-2.565 0-3.076 1.177-3.462 1.718-.004.005-.005.011-.008.016-.005-.006-.007-.013-.012-.02-.386-.54-.896-1.717-3.461-1.717z" fill="#ff7043" fill-rule="evenodd" stroke-width=".3"/></symbol><symbol viewBox="0 0 300.00001 300" id="haskell" xmlns="http://www.w3.org/2000/svg"><g stroke-width="2.422"><path d="M23.928 240.5l59.94-89.852-59.94-89.855h44.955l59.94 89.855-59.94 89.852z" fill="#ef5350"/><path d="M83.869 240.5l59.94-89.852-59.94-89.855h44.955l119.88 179.71h-44.95l-37.46-56.156-37.468 56.156z" fill="#ffa726"/><path d="M228.72 188.08l-19.98-29.953h69.93v29.956h-49.95zm-29.97-44.924l-19.98-29.953h99.901v29.953z" fill="#ffee58"/></g></symbol><symbol viewBox="0 0 210 210" id="haxe" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -87)"><path fill="#f68712" stroke-width=".221" d="M42.78 191.545l63.431-63.43 63.431 63.43-63.431 63.431z"/><path d="M42.8 191.592L31.193 148.28 19.59 104.97 62.9 116.575l43.311 11.605-31.706 31.706z" fill="#fab20b" stroke-width=".266"/><path d="M105.956 128.111l-43.19-11.544-43.177-11.597 22.927.185 23.228.294 20.264 11.36z" fill="#fbc707" stroke-width=".265"/><path d="M19.59 104.97l11.596 43.176 11.545 43.19-11.303-19.948-11.36-20.263-.294-23.228z" fill="#fff200" stroke-width=".265"/><path d="M106.23 128.133l43.312-11.605 43.311-11.605-11.605 43.31-11.605 43.312-31.706-31.706z" fill="#f47216" stroke-width=".266"/><path d="M169.711 191.289l11.545-43.19 11.597-43.176-.185 22.927-.294 23.228-11.36 20.263z" fill="#f1471d" stroke-width=".265"/><path d="M192.853 104.923l-43.176 11.597-43.19 11.544 19.947-11.303 20.264-11.36 23.228-.293z" fill="#fbc707" stroke-width=".265"/><path d="M169.643 191.545l11.605 43.31 11.605 43.312-43.311-11.605-43.311-11.606 31.706-31.705z" fill="#f25c19" stroke-width=".266"/><path d="M106.487 255.025l43.19 11.544 43.176 11.598-22.927-.185-23.228-.294-20.264-11.36z" fill="#f68712" stroke-width=".265"/><path d="M192.853 278.167l-11.597-43.176-11.545-43.19 11.303 19.947 11.36 20.264.294 23.228z" fill="#f1471d" stroke-width=".265"/><path d="M106.211 254.976l-43.31 11.605-43.312 11.605 11.605-43.31L42.8 191.563l31.706 31.706z" fill="#f89c0e" stroke-width=".266"/><path d="M42.731 191.82l-11.545 43.19-11.597 43.176.185-22.927.294-23.228 11.36-20.263z" fill="#fff200" stroke-width=".265"/><path d="M19.59 278.186l43.175-11.597 43.19-11.544-19.947 11.303-20.264 11.36-23.228.293z" fill="#f25c19" stroke-width=".265"/></g></symbol><symbol viewBox="0 0 144 152" id="heroku" xmlns="http://www.w3.org/2000/svg"><path d="M118.68 13.279H26.865c-6.337 0-11.476 5.139-11.476 11.476V129.32c0 6.338 5.139 11.477 11.476 11.477h91.813c6.338 0 11.477-5.14 11.477-11.477V24.755c0-6.337-5.139-11.476-11.477-11.476zM44.08 121.669V96.165l14.346 12.752zm44.632 0v-38.08c-.063-2.976-1.496-6.551-7.97-6.551-12.966 0-27.51 6.52-27.654 6.586l-9.008 4.08V32.407h12.752v36.201c6.366-2.072 15.266-4.321 23.91-4.321 7.882 0 12.6 3.099 15.17 5.698 5.484 5.547 5.56 12.613 5.551 13.43v38.255zm3.188-68.54H79.149c5.011-6.576 8.158-13.496 9.564-20.723h12.751c-.86 7.243-3.796 14.187-9.563 20.722z" fill="#6963b9"/></symbol><symbol viewBox="0 0 24 24" id="hpp" xmlns="http://www.w3.org/2000/svg"><path d="M9.757 19.818H6.751v-5.882q0-2.381-1.737-2.381-.868 0-1.438.663-.56.662-.56 1.718v5.882H0V4.533h3.016v6.508h.037Q4.24 9.239 6.247 9.239q3.51 0 3.51 4.239z" stroke-width=".478" fill="#0277bd"/><path d="M13.073 11.448v2h-2v2h2v2h2v-2h2v-2h-2v-2zm7 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="html" xmlns="http://www.w3.org/2000/svg"><path d="M12 17.56l4.07-1.13.55-6.1H9.38L9.2 8.3h7.6l.2-1.99H7l.56 6.01h6.89l-.23 2.58-2.22.6-2.22-.6-.14-1.66h-2l.29 3.19L12 17.56M4.07 3h15.86L18.5 19.2 12 21l-6.5-1.8L4.07 3z" fill="#e44d26"/></symbol><symbol viewBox="0 0 24 24" id="http" xmlns="http://www.w3.org/2000/svg"><path d="M16.046 13.784c.074-.613.13-1.225.13-1.856s-.056-1.244-.13-1.856h3.137c.148.594.241 1.215.241 1.856a7.65 7.65 0 0 1-.241 1.856m-4.78 5.16c.557-1.03.984-2.144 1.281-3.304h2.738a7.452 7.452 0 0 1-4.019 3.304m-.232-5.16H9.828a12.314 12.314 0 0 1-.149-1.856c0-.631.056-1.253.149-1.856h4.343c.084.603.149 1.225.149 1.856 0 .63-.065 1.243-.149 1.856M12 19.315c-.77-1.113-1.393-2.348-1.773-3.675h3.545c-.38 1.327-1.002 2.562-1.773 3.675m-3.712-11.1h-2.71a7.353 7.353 0 0 1 4.01-3.304c-.557 1.03-.975 2.144-1.3 3.304m-2.71 7.425h2.71c.325 1.16.743 2.274 1.3 3.304a7.433 7.433 0 0 1-4.01-3.304m-.761-1.856a7.65 7.65 0 0 1-.241-1.856c0-.64.093-1.262.241-1.856h3.137c-.074.612-.13 1.225-.13 1.856 0 .63.056 1.243.13 1.856m4.046-9.253c.77 1.114 1.393 2.357 1.773 3.684h-3.545c.38-1.327 1.002-2.57 1.773-3.684m6.422 3.684h-2.738a14.523 14.523 0 0 0-1.28-3.304 7.412 7.412 0 0 1 4.018 3.304m-6.423-5.568c-5.132 0-9.28 4.176-9.28 9.28a9.28 9.28 0 0 0 9.28 9.282 9.28 9.28 0 0 0 9.281-9.281A9.28 9.28 0 0 0 12 2.647z" fill="#e53935" stroke-width=".928"/></symbol><symbol viewBox="0 0 24 24" id="image" xmlns="http://www.w3.org/2000/svg"><path d="M13.009 9.202h5.368l-5.368-5.368v5.368M6.177 2.37h7.808l5.856 5.856v11.711a1.952 1.952 0 0 1-1.952 1.952H6.178a1.951 1.951 0 0 1-1.952-1.952V4.322c0-1.083.868-1.952 1.952-1.952m0 17.567h11.71V12.13l-3.903 3.903-1.952-1.951-5.856 5.855M8.13 9.202a1.952 1.952 0 0 0-1.952 1.952 1.952 1.952 0 0 0 1.952 1.952 1.952 1.952 0 0 0 1.952-1.952A1.952 1.952 0 0 0 8.13 9.202z" fill="#26a69a" stroke-width=".976"/></symbol><symbol viewBox="0 0 512 512" id="ionic" xmlns="http://www.w3.org/2000/svg"><g fill="#4f8ff7"><path d="M423.592 132.804A31.855 31.855 0 0 0 429 115c0-17.675-14.33-32-32-32a31.853 31.853 0 0 0-17.805 5.409C344.709 63.015 302.11 48 256 48 141.125 48 48 141.125 48 256c0 114.877 93.125 208 208 208 114.873 0 208-93.123 208-208 0-46.111-15.016-88.71-40.408-123.196zM391.83 391.832c-17.646 17.646-38.191 31.499-61.064 41.174-23.672 10.012-48.826 15.089-74.766 15.089-25.94 0-51.095-5.077-74.767-15.089-22.873-9.675-43.417-23.527-61.064-41.174s-31.5-38.191-41.174-61.064C68.982 307.096 63.905 281.94 63.905 256c0-25.94 5.077-51.095 15.089-74.767 9.674-22.873 23.527-43.417 41.174-61.064s38.191-31.5 61.064-41.174c23.673-10.013 48.828-15.09 74.768-15.09 25.939 0 51.094 5.077 74.766 15.089a191.221 191.221 0 0 1 37.802 21.327A31.853 31.853 0 0 0 365 115c0 17.675 14.327 32 32 32 5.293 0 10.28-1.293 14.678-3.568a191.085 191.085 0 0 1 21.327 37.801c10.013 23.672 15.09 48.827 15.09 74.767 0 25.939-5.077 51.096-15.09 74.768-9.675 22.873-23.527 43.418-41.175 61.064z"/><circle cx="256.003" cy="256" r="96"/></g></symbol><symbol viewBox="0 0 24 24" id="java" xmlns="http://www.w3.org/2000/svg"><path d="M2 21h18v-2H2M20 8h-2V5h2m0-2H4v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4v-3h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="javascript" xmlns="http://www.w3.org/2000/svg"><path d="M3 3h18v18H3V3m4.73 15.04c.4.85 1.19 1.55 2.54 1.55 1.5 0 2.53-.8 2.53-2.55v-5.78h-1.7V17c0 .86-.35 1.08-.9 1.08-.58 0-.82-.4-1.09-.87l-1.38.83m5.98-.18c.5.98 1.51 1.73 3.09 1.73 1.6 0 2.8-.83 2.8-2.36 0-1.41-.81-2.04-2.25-2.66l-.42-.18c-.73-.31-1.04-.52-1.04-1.02 0-.41.31-.73.81-.73.48 0 .8.21 1.09.73l1.31-.87c-.55-.96-1.33-1.33-2.4-1.33-1.51 0-2.48.96-2.48 2.23 0 1.38.81 2.03 2.03 2.55l.42.18c.78.34 1.24.55 1.24 1.13 0 .48-.45.83-1.15.83-.83 0-1.31-.43-1.67-1.03l-1.38.8z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="javascript-map" xmlns="http://www.w3.org/2000/svg"><path d="M18 8v2h2v10H10v-2H8v4h14V8h-4z" fill="#ffca28"/><path d="M2.444 2.506h14.135v14.136H2.444V2.506m3.714 11.811c.315.668.935 1.218 1.995 1.218 1.178 0 1.987-.629 1.987-2.003V8.993H8.805v4.508c0 .675-.275.848-.707.848-.455 0-.644-.314-.856-.683l-1.084.651m4.697-.14c.392.769 1.185 1.358 2.426 1.358 1.257 0 2.199-.652 2.199-1.854 0-1.107-.636-1.602-1.767-2.089l-.33-.141c-.573-.243-.816-.408-.816-.801 0-.322.243-.573.636-.573.377 0 .628.165.856.573l1.028-.683c-.432-.754-1.044-1.045-1.884-1.045-1.186 0-1.948.754-1.948 1.752 0 1.083.636 1.594 1.594 2.002l.33.141c.613.267.974.432.974.888 0 .377-.354.652-.903.652-.652 0-1.029-.338-1.312-.81l-1.083.63z" fill="#ffca28"/></symbol><symbol viewBox="0 0 180 180" id="jenkins" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="gia"><path transform="scale(1 -1)" fill="#37474f" d="M.899-144.42h144.42V0H.899z"/></clipPath></defs><g transform="matrix(1.0691 0 0 -1.0691 9.4 166.143)" clip-path="url(#gia)"><g fill-rule="evenodd"><path d="M107.96 30.661l-12.506-1.876-16.883-1.876-10.943-.312-10.629.312-8.13 2.502-7.19 7.815-5.628 15.945-1.25 3.44-7.504 2.5-4.377 7.191-3.126 10.317 3.44 9.067 8.128 2.814 6.565-3.127 3.127-6.878 3.752.626 1.25 1.563-1.25 7.19-.313 9.068 1.876 12.505-.074 7.143 5.701 9.114 10.005 7.19 17.508 7.504 19.383-2.814 16.883-12.193 7.817-12.505 5.002-9.067 1.25-22.51-3.752-19.384-6.877-17.195-6.566-9.066" fill="#f0d6b7"/><path d="M97.334-23.425l-44.709-1.876v-7.503l3.752-26.262-1.876-2.19-31.264 10.63-2.19 3.752-3.126 35.328-7.19 21.26-1.563 5.002 25.01 17.195 7.818 3.127 6.877-8.441 5.94-5.315 6.88-2.188 3.125-.938L68.57 1.899l2.814-3.44 7.19 2.502-5.002-9.693 27.2-12.818-3.439-1.876" fill="#335061"/><path d="M23.238 85.687l8.128 2.814 6.566-3.127 3.127-6.878 3.751.626.938 3.751-1.876 7.19 1.876 17.197-1.563 9.379 5.627 6.565 12.193 9.692-3.44 4.69-17.194-8.442-7.191-5.627-4.064-8.754-6.253-8.442-1.876-10.005 1.251-10.63" fill="#6d6b6d"/><path d="M36.055 115.07s4.69 11.567 23.448 17.195c18.759 5.628.938 4.065.938 4.065l-20.321-7.817-7.817-7.816-3.438-6.253 7.19.626M26.676 87.875s-6.566 21.886 18.446 25.012l-.938 3.752-17.195-4.065-5.003-16.257 1.251-10.63 3.439 2.188" fill="#dcd9d8"/></g><g fill="#f7e4cd"><path d="M36.681 58.799l4.094 3.966s1.847-.214 2.16-2.402c.312-2.19 1.25-21.886 14.693-32.516 1.227-.97-10.004 1.564-10.004 1.564L37.62 45.042M94.209 64.739s.729 9.477 3.28 8.748c2.553-.729 2.553-3.28 2.553-3.28s-6.198-4.01-5.833-5.468" fill-rule="evenodd"/><path d="M120.16 99.442s-5.153-1.088-5.628-5.628c-.474-4.54 5.628-.938 6.566-.625M82.327 99.129s-6.879-.938-6.879-5.314c0-4.378 7.817-4.065 10.005-2.19"/><g fill-rule="evenodd"><path d="M39.807 78.808s-11.881 7.191-13.131.312c-1.25-6.877-4.065-11.88 1.876-19.07l-4.064 1.25-3.752 9.691-1.25 9.38 7.19 7.504 8.129-.626 4.69-3.751.312-4.69M45.435 98.504s5.315 27.512 32.203 32.827c22.136 4.375 33.765-.938 38.142-5.94 0 0-19.696 23.447-38.455 16.257-18.759-7.191-32.514-20.322-32.202-28.762.532-14.377.313-14.382.313-14.382M117.97 122.27s-9.066.312-9.38-7.817c0 0 0-1.25.625-2.5 0 0 7.192 8.129 11.568 3.751"/><path d="M78.268 111.1s-1.56 12.477-12.199 5.223c-6.878-4.69-6.252-11.255-5.002-12.505s.91-3.77 1.862-2.04c.952 1.728.638 7.356 4.078 8.918 3.439 1.564 9.077 3.31 11.26.404"/></g></g><g fill="#49728b" fill-rule="evenodd"><path d="M48.874 26.597L19.486 13.466s12.193-48.46 5.94-63.467l-4.377 1.563-.313 18.446-8.128 35.015-3.44 9.692 30.639 20.633 9.067-8.753M51.896-.206l4.17-5.087v-18.76h-5.003s-.625 13.132-.625 14.696c0 1.563.624 7.19.624 7.19M52-26.866l-14.069-.625 4.065-2.813L52-31.868"/></g><g fill-rule="evenodd"><path d="M100.15-23.739l11.567.313 2.814-28.764-11.881-1.563-2.5 30.014" fill="#335061"/><path d="M103.27-23.739l17.508.938s7.19 18.133 7.19 19.07c0 .939 6.253 26.263 6.253 26.263l-14.069 14.694-2.813 2.501-7.504-7.503V3.148l-6.565-26.887" fill="#335061"/><path d="M111.09-21.55l-10.942-2.188 1.563-8.755c4.064-1.876 10.943 3.127 10.943 3.127M111.4 33.162l21.885-16.257.626 7.503-16.57 15.32-5.94-6.566" fill="#49728b"/><path d="M62.85-85.332l-6.473 26.266-3.22 19.38-.531 14.385 29.296 1.56 18.226.003-1.658-32.83 2.814-25.324-.312-4.69-23.76-1.876-14.382 3.126" fill="#fff"/><path d="M96.083-23.426s-1.563-32.515 3.127-55.65c0 0-9.38-5.94-23.136-7.503l26.262.938 3.126 1.875-3.752 51.273-.938 10.944" fill="#dcd9d8"/><path d="M115.06-49.691l12.193 3.44 23.135 1.25 3.44 10.629-6.254 18.446-7.19.938-10.005-3.127-9.599-4.686-5.095.935-3.972-1.56" fill="#fff"/><path d="M114.84-43.435s8.128 3.751 9.38 3.438L120.78-22.8l4.065 1.563s2.814-16.257 2.814-18.133c0 0 17.507-.938 19.07-.938 0 0 3.752 7.191 2.814 14.694l3.44-10.005.312-5.628-5.002-7.503-5.627-1.25-9.38.312-3.126 4.064-10.943-1.563-3.44-1.25" fill="#dcd9d8"/></g><path d="M102.56-21.241L95.682-3.733l-7.19 10.317s1.562 4.377 3.75 4.377h7.192l6.878-2.501-.625-11.568-3.127-18.134" fill="#fff"/><path d="M103.9-15.297S95.145 1.585 95.145 4.086c0 0 1.563 3.752 3.752 2.814 2.19-.938 6.879-3.439 6.879-3.439v5.94l-10.63 2.19-7.19-.939 12.193-28.763 2.5-.313" fill="#dcd9d8" fill-rule="evenodd"/><path d="M65.664 25.968l-8.661.942-8.13 2.501v-2.814l3.972-4.38 12.506-5.627" fill="#fff"/><path d="M51.689 25.031s9.693-4.065 12.819-3.127l.311-3.748-8.752 1.872-5.316 3.752.938 1.251" fill="#dcd9d8" fill-rule="evenodd"/><path d="M115.03 9.897c-5.305.156-10.098.786-14.294 1.97.285 1.72-.249 3.408.18 4.647 1.17.843 3.13.83 4.898 1.027-1.529.752-3.677 1.049-5.44.615-.042 1.194-.578 1.934-.902 2.868 2.982 1.064 10.024 8.044 13.984 5.732 1.887-1.099 2.689-7.377 2.835-10.43.122-2.533-.23-5.088-1.261-6.43" fill="#d33833" fill-rule="evenodd"/><path d="M115.03 9.897c-5.305.156-10.098.786-14.294 1.97.285 1.72-.249 3.408.18 4.647 1.17.843 3.13.83 4.898 1.027-1.529.752-3.677 1.049-5.44.615-.042 1.194-.578 1.934-.902 2.868 2.982 1.064 10.024 8.044 13.984 5.732 1.887-1.099 2.689-7.377 2.835-10.43.122-2.533-.23-5.088-1.261-6.43z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M89.66 18.569c-.014-.401-.03-.806-.047-1.21-1.656-1.089-4.33-1.076-6.148-1.99 2.68-.117 4.79-.763 6.614-1.672l-.118-3.033c-3.036-2.078-5.81-5.173-9.384-7.122-1.69-.922-7.622-3.294-9.42-2.875-1.017.236-1.109 1.499-1.516 2.689-.866 2.548-2.861 6.605-3.035 10.44-.222 4.846-.71 12.967 4.51 11.969 4.213-.804 9.113-2.745 12.375-4.527 1.993-1.09 3.146-2.436 6.17-2.669" fill="#d33833" fill-rule="evenodd"/><path d="M89.66 18.569c-.014-.401-.03-.806-.047-1.21-1.656-1.089-4.33-1.076-6.148-1.99 2.68-.117 4.79-.763 6.614-1.672l-.118-3.033c-3.036-2.078-5.81-5.173-9.384-7.122-1.69-.922-7.622-3.294-9.42-2.875-1.017.236-1.109 1.499-1.516 2.689-.866 2.548-2.861 6.605-3.035 10.44-.222 4.846-.71 12.967 4.51 11.969 4.213-.804 9.113-2.745 12.375-4.527 1.993-1.09 3.146-2.436 6.17-2.669z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M92.675 12.788c-.463 2.64-.999 3.393-.792 5.695 7.04 4.693 8.361-8.061.792-5.695" fill="#d33833" fill-rule="evenodd"/><path d="M92.675 12.788c-.463 2.64-.999 3.393-.792 5.695 7.04 4.693 8.361-8.061.792-5.695z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M102.87 10.649s-2.19 3.127-.626 4.065c1.564.938 3.127 0 4.065 1.563s0 2.501.313 4.377 1.877 2.189 3.44 2.501c1.562.313 5.94.938 6.565-.625l-1.876 5.627-3.752 1.25-11.88-6.877-.626-3.44v-6.877M70.041.331c-.376 4.88-.773 9.752-1.215 14.626-.662 7.279 1.748 6.009 8.057 6.009.964 0 5.933-1.15 6.289-1.876 1.705-3.483-2.851-2.709 1.964-5.335 4.065-2.216 11.246 1.346 9.603 6.273-.919 1.095-4.789.341-6.176 1.06l-7.327 3.8c-3.108 1.612-10.29 3.962-13.603 1.709-8.395-5.71.53-19.974 3.524-25.93" fill="#ef3d3a" fill-rule="evenodd"/><g fill="#231f20" fill-rule="evenodd"><path d="M78.268 111.1c-8.521 1.985-12.755-3.566-15.338-9.323-2.306.559-1.389 3.695-.806 5.294 1.525 4.194 7.672 9.778 12.694 9.02 2.161-.325 5.086-2.301 3.45-4.99M119.79 101.4l.404-.016c1.926-4 3.593-8.238 6.022-11.769-1.628-3.79-12.322-7.144-12.157-.338 2.313 1.01 6.305.206 8.356 1.497-1.186 3.254-2.897 6.024-2.625 10.626M82.63 101.29c1.827-3.35 2.422-6.868 5.019-9.4 1.17-1.14 3.444-2.529 2.316-5.698-.263-.747-2.189-2.414-3.3-2.741-4.06-1.2-13.521-.248-10.317 4.814 3.358-.157 7.871-2.18 10.38.257-1.927 3.081-5.363 9.177-4.098 12.768M118.26 67.253c-6.113-3.927-12.93-8.197-22.947-7.207-2.14 1.86-2.956 6.002-.877 8.737 1.082-1.861.402-5.284 3.419-5.799 5.684-.972 12.299 3.477 16.387 5.032 2.535 4.275-.219 5.847-2.503 8.597-4.675 5.636-10.947 12.622-10.72 21.06 1.89 1.37 2.053-2.092 2.325-2.722 2.44-5.714 8.585-13.021 13.07-17.912 1.1-1.205 2.914-2.36 3.115-3.157.582-2.315-1.513-5.09-1.27-6.63M37.668 71.387c-1.916 1.094-2.372 5.91-4.622 6.048-3.215.195-2.629-6.25-2.616-10.018-2.213 2.009-2.602 8.194-.976 11.37-1.853.91-2.68-1.003-3.708-1.677 1.32 9.595 14.036 4.45 11.922-5.723M122.15 63.257c-2.846-5.417-6.871-11.382-15.222-11.555-.17 1.75-.3 4.411.009 5.464 6.384.614 10.325 3.863 15.212 6.091M82.149 59.745c5.326-2.8 15.114-3.102 22.353-2.89.388-1.586.379-3.545.394-5.48-9.305-.463-20.307 1.84-22.747 8.37M81.136 54.523c3.683-9.247 16.341-8.182 27.016-7.927-.47-1.2-1.489-2.62-2.755-3.132-3.42-1.392-12.855-2.448-17.604.074-3.011 1.601-4.946 5.219-6.596 7.34-.797 1.024-4.765 3.64-.06 3.645"/></g><path d="M117.82 3.516c-4.322-7.402-8.457-15.005-13.585-21.534 2.15 6.32 3.07 16.9 3.394 24.965 4.498 2.105 8.349-.474 10.191-3.43" fill="#81b0c4" fill-rule="evenodd"/><g fill="#231f20" fill-rule="evenodd"><path d="M141.07-23.089c-4.839-.969-8.239-5.671-12.959-5.37 2.594 3.658 7.14 5.2 12.959 5.37M143.21-30.661c-3.944-.417-8.576-1.055-12.577-.726 1.894 2.892 9.19 1.894 12.577.726M144.58-37.19c-4.433-.096-9.942-.008-14.155.346 2.492 2.677 11.28.993 14.155-.346"/></g><g fill-rule="evenodd"><path d="M109.48-55.057c.636-5.567 2.843-11.207 2.566-17.304-2.45-.827-3.858-1.55-7.142-1.545-.232 5.181-.925 13.102-.718 18.041 1.615-.107 3.997 1.154 5.294.808" fill="#dcd9d8"/><path d="M102.33 26.985c-2.226-1.453-4.121-3.267-6.259-4.818-4.74-.235-7.327.328-10.81 3.05.057.219.407.121.42.39 5.075-2.262 11.524.92 16.648 1.378" fill="#f0d6b7"/><path d="M75.694-7.603c1.394 6.04 6.857 9.17 11.817 12.497 5.12-6.498 8.234-14.855 11.663-22.92-8.102 2.443-16.38 6.406-23.481 10.423" fill="#81b0c4"/><path d="M104.18-55.865c-.207-4.94.486-12.86.718-18.041 3.283-.004 4.691.718 7.142 1.545.276 6.096-1.93 11.737-2.566 17.304-1.298.346-3.679-.914-5.294-.808zm-51.13 28.09c2.165-19.906 5.301-36.639 11.054-54.266 12.766-3.876 28.157-4.214 39.441-.716-2.072 9.948-1.167 22.06-2.378 32.677-.912 7.98-.447 16.009-1.698 24.15-13.673 2.844-33 .665-46.418-1.845zm49.651 1.72c-.115-8.549.383-16.982 1.036-25.542 3.282.493 5.51.822 8.56 1.49-.99 8.241-.869 17.514-2.886 24.804-2.332-.023-4.385.027-6.71-.752zm16.653 1.378c-1.558.357-3.372.014-4.86-.015.7-6.969 2.397-14.659 2.995-21.974 2.342-.073 3.593 1.032 5.52 1.403.102 6.421-.562 15.268-3.655 20.586zm25.215-23.038c4.882 1.186 7.952 7.165 6.586 13.305-.916 4.127-2.548 11.898-4.295 14.538-1.29 1.953-4.79 4.51-7.584 2.72-4.545-2.91-12.552-3.755-15.867-7.278 1.662-5.534 2.178-13.135 2.864-20.146 5.678-.354 12.665 1.562 17.387-.471-3.297-1.068-7.575-1.077-10.423-2.633 2.328-1.125 7.778-.897 11.332-.035zM99.17-18.025c-3.43 8.063-6.543 16.42-11.663 22.918-4.96-3.327-10.423-6.456-11.817-12.497 7.1-4.017 15.379-7.98 23.481-10.422zm8.453 24.971c-.325-8.065-1.245-18.644-3.395-24.965 5.128 6.53 9.263 14.132 13.585 21.534-1.842 2.957-5.693 5.536-10.19 3.431zm-9.582 3.405c-1.943.21-3.592-2.233-6.117-1.177-.58-.64-1.105-1.333-1.695-1.958 5.579-6.723 8.114-16.262 12.423-24.163 2.312 7.59 2.045 15.904 2.555 24.188-3.177-.201-4.94 2.873-7.166 3.11zm-6.161 8.132c-.208-2.303.328-3.056.791-5.695 7.57-2.367 6.248 10.388-.791 5.695zm-8.394 2.755c-3.261 1.782-8.161 3.723-12.374 4.527-5.222.999-4.732-7.123-4.51-11.968.173-3.836 2.168-7.893 3.035-10.441.406-1.19.498-2.453 1.515-2.69 1.798-.418 7.73 1.954 9.42 2.875 3.575 1.95 6.348 5.045 9.384 7.123.04 1.011.078 2.021.119 3.032-1.826.91-3.935 1.555-6.615 1.673 1.818.914 4.492.901 6.148 1.989.016.405.033.81.047 1.21-3.024.234-4.176 1.58-6.17 2.67zm-31.152 5.659c-2.707-2.748 7.592-6.494 10.871-6.696-.018 1.739.991 3.378.788 4.626-3.895.684-9.013.232-11.66 2.07zm33.345-1.29c-.013-.27-.363-.172-.42-.39 3.482-2.722 6.07-3.285 10.81-3.05 2.137 1.551 4.033 3.365 6.259 4.818-5.124-.458-11.574-3.64-16.648-1.379zm30.606-9.282c-.146 3.053-.948 9.332-2.835 10.431-3.961 2.312-11.002-4.668-13.984-5.732.324-.934.86-1.674.901-2.868 1.764.434 3.912.137 5.44-.615-1.767-.198-3.727-.185-4.897-1.027-.429-1.239.105-2.927-.18-4.647 4.196-1.184 8.989-1.814 14.294-1.97 1.032 1.341 1.383 3.896 1.261 6.429zM47.777 24.24c-.85.606-6.6 8.087-7.388 7.777-10.405-4.103-20.134-11.199-28.828-17.91 8.29-17.787 11.635-39.579 12.227-60.582 9.496-4.441 17.836-10.844 30.722-11.512-1.491 10.55-2.852 19.962-3.699 29.895-3.237 1.365-7.882-.062-10.913.423-.025 3.651 4.628 1.6 5.015 4.054.292 1.858-2.56 1.998-1.631 4.923 2.368-.861 3.612-2.763 6.138-3.477 2.309 5.05-.032 13.985.3 18.205.064.792.397 4.39 2.172 3.759 1.57-.559-.09-9.569.082-13.563.157-3.68-.444-7.242 1.046-9.552a355.817 355.817 0 0 0 38.576 3.16c-2.964 1.272-6.485 2.475-10.345 4.651-2.093 1.18-8.69 3.635-9.293 5.622-.964 3.167 2.528 4.855 3.125 7.57-6.285-3.428-7.511 3.286-8.998 8.042-1.347 4.308-2.114 7.526-2.445 10.01-5.414 2.581-11.203 5.195-15.863 8.505zm63.009 6.872c8.67 4.204 10.232-15.711 6.834-22.127.525-1.914 2.331-2.646 3.069-4.366-4.838-8.667-10.211-16.756-15.148-25.32 3.672 2.286 8.917.409 13.238 2.12 1.58.624 2.722 4.24 3.918 7.133 3.29 7.958 6.743 17.99 8.28 25.586.346 1.73 1.292 5.5 1.08 7.04-.378 2.758-4.12 4.803-6.022 6.508-3.506 3.15-5.714 5.921-9.371 8.866-1.483-2.189-4.666-3.66-5.878-5.44zM27.95 107.99c-4.13-4.545-3.266-13.062-2.766-19.121 7.467 4.697 17.377-.372 17.284-8.36 3.565.094 1.332 4.452.687 7.259-2.107 9.169 3.55 19.13.256 27.516-6.395-.485-11.649-3.097-15.46-7.294zm29.558 26.38c-9.352-2.65-21.337-9.446-25.18-17.847 2.976.432 5.041 1.933 7.977 2.119 1.11.072 2.563-.466 3.838-.148 2.54.63 4.685 6.327 6.602 8.447 1.868 2.07 4.114 2.954 5.651 4.841.988.477 2.448.444 2.504 1.927-.428.457-.879.806-1.392.66zm48.681-2.493c-9.707 5.477-26.136 9.596-36.462 4.449-8.331-4.155-19.593-11.027-23.433-19.737 3.587-8.405-1.062-16.106-1.36-24.64-.157-4.54 2.139-8.504 2.315-13.446-1.228-2.025-4.978-2.275-7.574-2.136-.873 4.372-2.403 9.287-6.906 9.78-6.371.697-11.03-4.576-11.319-10.085-.342-6.48 4.978-17.22 12.517-16.475 2.913.287 3.629 3.207 6.802 3.177 1.72-3.432-2.653-4.51-3.103-6.964-.117-.634.363-3.112.642-4.274 1.37-5.658 4.422-12.982 7.427-17.29 3.814-5.464 11.307-6.288 19.37-6.823 1.44 3.101 6.743 2.846 10.2 2.035-4.143 1.64-7.993 5.617-11.185 9.137-3.665 4.039-7.378 8.371-7.566 13.65 6.927-9.61 12.65-18.003 25.246-22.23 9.53-3.196 20.662 1.465 27.986 6.608 3.039 2.137 4.853 5.529 7.013 8.634 8.082 11.626 11.854 28.219 11.024 44.303-.342 6.633-.327 13.244-2.552 17.706-2.326 4.666-10.193 8.84-14.8 4.62-.853 4.537 3.83 7.344 9.331 5.71-3.922 5.063-8.039 11.145-13.614 14.29zm18.084-149.66c7.585 3.77 21.757 10.149 26.512-.014 1.755-3.746 3.814-10.079 4.723-13.946 1.284-5.456-1.392-16.923-7-18.754-4.953-1.617-10.733-1.518-16.7-.32-.702.585-1.484 1.603-2.03 2.665-4.261.165-8.25-.229-11.615-1.98.319-3.15-1.812-3.656-3.81-4.305-1.48-5.872 2.963-13.541 1.9-18.896-.76-3.815-5.453-4.405-8.902-5.118-.113-2.12.15-3.89.386-5.683-.789-2.907-4.327-4.561-7.679-4.967-11.029-1.326-27.775-1.922-38.384 1.893-2.96 7.261-5.292 16.093-7.758 24.384-10.346-1.105-18.715 4.464-26.603 8.113-2.731 1.266-6.51 1.964-7.53 4.138-.99 2.105-.584 6.14-.83 9.95-.625 9.733-1.16 19.12-3.73 29.086-1.154 4.472-3.165 8.418-4.568 12.727C9.358 5.184 7.092 10.12 6.5 14.1c-.877 5.903 4.681 6.232 8.235 8.79 5.494 3.954 9.806 6.142 15.756 9.711 1.762 1.057 7.077 3.733 7.681 4.966 1.202 2.443-2.062 5.888-2.935 7.803-1.38 3.03-2.1 5.602-2.298 8.59-4.992.789-8.775 3.76-11.06 7.109-3.781 5.543-6.403 15.798-3.132 23.599.257.614 1.536 1.822 1.725 2.765.372 1.858-.7 4.329-.768 6.305-.343 10.14 1.716 18.875 8.541 21.932 2.771 11.038 12.688 14.71 22.032 20.195 3.493 2.05 7.343 3.36 11.32 4.824 14.263 5.25 36.15 4.261 47.987-4.692 5.02-3.797 13.044-11.813 15.914-17.617 7.58-15.323 7.042-40.931 1.74-59.571-.712-2.503-1.746-6.181-3.19-9.187-1.006-2.1-4.134-6.3-3.754-8.153.391-1.916 7.132-7.034 8.577-8.428 2.603-2.51 7.548-5.843 7.948-9.012.43-3.372-1.485-7.984-2.456-11.238-3.245-10.858-6.412-20.895-10.091-30.576" fill="#231f20"/><path d="M73.674 57.38c.411.548 2.674 1.38 5.84-.144 0 0-3.752-.626-3.44-6.881l-1.564.313s-1.615 5.672-.836 6.712" fill="#f7e4cd"/><path d="M101.09 3.617a1.72 1.72 0 1 0-3.44.001 1.72 1.72 0 0 0 3.44-.001M102.81-4.355a1.72 1.72 0 1 0-3.44 0 1.72 1.72 0 0 0 3.44 0" fill="#1d1919"/></g><g><rect transform="matrix(.8 0 0 -.8 0 144)" x="16.854" y="177.38" width="70.412" height="4.12" rx=".983" ry=".983"/><rect transform="scale(1 -1)" x="78.502" y="-2.097" width="50.037" height="3.296" rx=".786" ry=".786"/><rect transform="scale(1 -1)" x="13.483" y="-3.697" width="54.831" height="3.296" rx=".786" ry=".786"/><rect transform="scale(1 -1)" x="83.296" y="-3.697" width="45.243" height="3.296" rx=".786" ry=".786"/></g></g></symbol><symbol viewBox="0 0 24 24" id="json" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#fbc02d"/></symbol><symbol viewBox="0 0 50 50" id="julia" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -247)" stroke-width="5.673"><circle cx="13.497" cy="281.632" r="9.555" fill="#bc342d"/><circle cx="36.081" cy="281.632" r="9.555" fill="#864e9f"/><circle cx="24.722" cy="262.389" r="9.555" fill="#328a22"/></g></symbol><symbol viewBox="0 0 64 64" id="karma" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -233)"><path d="M38.556 288.413l-20.29-26.687 9.532-7.246 20.29 26.686h-.001.002l5.527 7.247z" fill="#359b8b" stroke-width=".173"/><path d="M35.681 241.172L24.92 255.327v-14.13H12.947v13.817l7.84 33.235h4.132v-13.147l.003.003 20.29-26.686-.008-.006 5.504-7.24H35.84v.12z" fill="#3cbeae" stroke-width=".206"/></g></symbol><symbol viewBox="0 0 24 24" id="key" xmlns="http://www.w3.org/2000/svg"><path d="M7 14a2 2 0 0 1-2-2 2 2 0 0 1 2-2 2 2 0 0 1 2 2 2 2 0 0 1-2 2m5.65-4A5.99 5.99 0 0 0 7 6a6 6 0 0 0-6 6 6 6 0 0 0 6 6 5.99 5.99 0 0 0 5.65-4H17v4h4v-4h2v-4H12.65z" fill="#26a69a"/></symbol><symbol viewBox="0 0 24 24" id="kivy" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.89 0 0 1.89 -12.157 -11.429)" fill="#90a4ae"><path d="M7.026 8.63v4.474l1.928-1.928a.437.437 0 0 0 0-.619zM9.38 16.072v-4.474l-1.927 1.927a.437.437 0 0 0 0 .62zM18.576 10.412l-5.346.564-.017.018 2.39 2.39zM9.922 8.502s.023 3.304-.003 4.452c-.02.856.371 1.114.746 1.507.538.564 1.599 1.57 1.599 1.57a.53.53 0 0 0 .75 0l1.843-1.844a.53.53 0 0 0 0-.75z"/></g></symbol><symbol viewBox="0 0 24 24" id="kl" xmlns="http://www.w3.org/2000/svg"><defs><style>.a{fill:#3aaae1}.b{fill:#fdfeff}</style></defs><title>kl</title><path d="M12.033 1.737c-.25-.003-.5.11-.729.337C8.225 5.15 5.15 8.227 2.078 11.31c-.144.144-.229.346-.341.521v.41c.16.223.294.474.485.666a3259.51 3259.51 0 0 0 8.936 8.937c.193.192.443.325.666.486h.41c.205-.142.436-.256.609-.428 3.046-3.041 6.09-6.083 9.133-9.127.47-.47.472-1.005.006-1.472l-9.218-9.217c-.23-.23-.48-.347-.731-.35zm-1.062 4.545l1.386.832c.702.422 1.403.846 2.109 1.262a.544.544 0 0 1 .04.026l.016.013.017.013c.061.056.089.123.088.224a510.281 510.281 0 0 0 0 3.794.463.463 0 0 1-.007.094c-.015.069-.054.103-.142.109a.464.464 0 0 1-.044.002c-.045-.002-.09-.002-.136-.003-.323-.006-.648-.001-.998-.001v-.527-1.34-.671-.003l.004-.668c0-.147-.039-.231-.17-.308-.893-.528-1.78-1.066-2.67-1.6-.051-.03-.101-.065-.173-.111l.001-.003h-.001zm.362 3.39c.068-.003.119.043.173.138.085.148.174.293.264.44l.015.025c.096.154.194.31.292.47l-1.915 1.176c-.337.207-.673.417-1.014.617-.113.067-.154.143-.154.277.01.977.01 1.955.014 2.932V16H7.7V16h-.002c-.004-.053-.014-.112-.014-.17-.005-1.25-.006-2.501-.015-3.751 0-.142.045-.222.164-.294a467.13 467.13 0 0 0 3.353-2.054l.016-.01a.606.606 0 0 1 .032-.017l.016-.008a.308.308 0 0 1 .033-.013l.012-.004a.157.157 0 0 1 .028-.005l.01-.001zm5.677 3.126l.314.54.346.594v.001c-.158.094-.298.178-.438.259l-3.097 1.798c-.106.062-.189.071-.3.01l-.893-.496-1.524-.843-.895-.493c-.035-.02-.068-.044-.129-.085h.001l.137-.25.495-.902 1.446.795c.442.243.886.483 1.323.734.121.07.212.072.334 0 .894-.525 1.792-1.043 2.689-1.563.057-.034.118-.061.191-.1z" fill="#29b6f6" stroke-width=".041"/></symbol><symbol viewBox="0 0 500 500" id="kotlin" xmlns="http://www.w3.org/2000/svg"><path d="M500 500H0V0h500L250 250z" fill="#7F52FF"></path></symbol><symbol viewBox="0 0 240 240" id="laravel" xmlns="http://www.w3.org/2000/svg"><path d="M216.05 119.036c-1.433.343-24.945 6.673-24.945 6.673l-19.227-28.622c-.537-.828-.99-1.656.359-1.849 1.345-.196 23.195-4.477 24.182-4.723.99-.245 1.837-.536 3.053 1.267 1.21 1.8 17.836 24.626 18.464 25.506.627.877-.447 1.41-1.883 1.748m-4.101 49.326c.588 1.003 1.176 1.64-.67 2.367-1.843.73-62.243 22.847-63.418 23.39-1.173.546-2.092.73-3.607-1.637-1.51-2.362-21.16-39.264-21.16-39.264l64.03-18.075c1.876-.644 2.317-.405 3.103.822 1.074 1.68 21.143 31.403 21.726 32.4m-103.7-21.087c-.78.202-37.566 9.733-39.525 10.22-1.965.485-1.965.246-2.188-.49-.226-.727-43.728-98.053-44.333-99.271-.605-1.214-.574-2.177 0-2.177.571 0 34.734-3.313 35.944-3.383 1.207-.07 1.08.205 1.526 1.033l49.025 91.818c.84 1.58 1.239 1.81-.452 2.248m94.588-59.77c-3.5-4.58-5.2-3.751-7.357-3.41-2.154.336-27.277 4.915-30.194 5.449-2.918.536-4.758 1.803-2.963 4.53 1.597 2.422 18.113 27.824 21.751 33.42l-65.663 17.066L66.18 49.832c-2.075-3.342-2.507-4.514-7.236-4.28-4.735.23-40.969 3.495-43.55 3.731-2.58.233-5.416 1.479-2.835 8.09 2.583 6.612 43.734 102.82 44.88 105.62 1.149 2.803 4.128 7.345 11.11 5.527 7.157-1.871 31.969-8.894 45.52-12.742 7.163 14.07 21.77 42.619 24.473 46.707 3.607 5.459 6.089 4.56 11.626 2.738 4.325-1.42 67.65-26.129 70.502-27.4 2.855-1.273 4.613-2.184 2.685-5.275-1.419-2.28-18.124-26.558-26.876-39.26 5.993-1.733 27.305-7.888 29.575-8.557 2.646-.779 3.008-2.19 1.572-3.94-1.436-1.755-21.293-28.72-24.79-33.296z" fill="#ff5722" stroke="#ff5722" stroke-width="8.852" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" id="less" xmlns="http://www.w3.org/2000/svg"><path d="M13.696 2.999V5h2.002v5a2 2 0 0 0 1.999 2 2 2 0 0 0-2 2v5h-2v2h2a2 2 0 0 0 2-2v-4a2 2 0 0 1 2-2h1V11h-1a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2.001zm-.03 12.766v.47a1 1 0 0 0 .03-.236 1 1 0 0 0-.03-.234zM10.566 21v-2.001H8.565v-5a2 2 0 0 0-2-2 2 2 0 0 0 2-2V5h2.001v-2H8.565a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-.999V13h1a2 2 0 0 1 2 2v3.999A2 2 0 0 0 8.564 21zm.03-12.766v-.47a1 1 0 0 0-.03.236 1 1 0 0 0 .03.234z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="lib" xmlns="http://www.w3.org/2000/svg"><path d="M19 7H9V5h10m-4 10H9v-2h6m4-2H9V9h10m1-7H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2M4 6H2v14a2 2 0 0 0 2 2h14v-2H4V6z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 40 40" id="livescript" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -257)" fill="#317eac"><path stroke-width="3.299" d="M5.419 260.18h3.685v34.207H5.419z"/><path stroke-width="3.299" d="M37.074 288.197v3.685H2.867v-3.685z"/><path stroke-width="2.894" d="M29.612 265.658l2.004 2.005L7.428 291.85l-2.004-2.005z"/><path stroke-width="2.325" d="M10.73 262.471h2.835v22.08H10.73z"/><path stroke-width="2.063" d="M15.36 262.519h2.835v17.382H15.36z"/><path stroke-width="1.77" d="M19.99 262.471h2.835v12.802H19.99z"/><path stroke-width="1.422" d="M24.526 262.491h2.835v8.254h-2.835z"/><path stroke-width="1.128" d="M28.783 262.463h2.835v5.197h-2.835z"/><path stroke-width="2.325" d="M34.801 286.545v-2.835h-22.08v2.835z"/><path stroke-width="2.063" d="M34.753 281.914v-2.835H17.371v2.835z"/><path stroke-width="1.77" d="M34.801 277.284v-2.835H21.999v2.835z"/><path stroke-width="1.422" d="M34.781 272.749v-2.835h-8.254v2.835z"/><path stroke-width="1.128" d="M34.809 268.492v-2.835h-5.197v2.835z"/></g></symbol><symbol viewBox="0 0 24 24" id="lock" xmlns="http://www.w3.org/2000/svg"><path d="M12 17a2 2 0 0 0 2-2 2 2 0 0 0-2-2 2 2 0 0 0-2 2 2 2 0 0 0 2 2m6-9a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h1V6a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h1m-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3z" fill="#ffd54f"/></symbol><symbol viewBox="0 0 24 24" id="lua" xmlns="http://www.w3.org/2000/svg"><circle cx="12.203" cy="12.102" r="10.322" fill="none" stroke="#42a5f5"/><path d="M12.33 5.746a6.483 6.381 0 0 0-6.482 6.381 6.483 6.381 0 0 0 6.482 6.38 6.483 6.381 0 0 0 6.484-6.38 6.483 6.381 0 0 0-6.484-6.38zm1.86 1.916a2.329 2.292 0 0 1 2.33 2.293 2.329 2.292 0 0 1-2.33 2.291 2.329 2.292 0 0 1-2.329-2.29 2.329 2.292 0 0 1 2.328-2.294z" fill="#42a5f5" fill-rule="evenodd"/><ellipse cy="4.615" cx="19.631" rx="2.329" ry="2.292" fill="#42a5f5" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" id="markdown" xmlns="http://www.w3.org/2000/svg"><path d="M2 16V8h2l3 3 3-3h2v8h-2v-5.17l-3 3-3-3V16H2m14-8h3v4h2.5l-4 4.5-4-4.5H16V8z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" preserveAspectRatio="xMidYMid" id="markojs" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -120.96)" stroke-width=".984"><path d="M4.002 126.482c-.655 1.07-1.32 2.14-1.976 3.21-.655 1.06-1.308 2.142-1.963 3.212l.002.002-.002.002c.655 1.07 1.308 2.15 1.963 3.211.655 1.07 1.32 2.141 1.976 3.211h3.33c-.664-1.07-1.318-2.14-1.974-3.21-.653-1.069-1.307-2.145-1.961-3.214.654-1.068 1.308-2.146 1.961-3.215a601.93 601.93 0 0 1 1.974-3.209z" fill="#2196f3"/><path d="M3.999 126.482l-.002.002c.655 1.07 1.31 2.15 1.964 3.212.655 1.07 1.32 2.14 1.974 3.21h3.331c-.664-1.07-1.319-2.14-1.974-3.21-.653-1.068-1.306-2.146-1.96-3.214z" fill="#26a69a"/><path d="M15.203 126.482l.002.002c-.655 1.07-1.31 2.15-1.965 3.212-.655 1.07-1.319 2.14-1.974 3.21h-3.33c.664-1.07 1.318-2.14 1.973-3.21.654-1.069 1.307-2.146 1.961-3.214z" fill="#8bc34a"/><path d="M11.874 126.484c.664 1.07 1.318 2.14 1.974 3.21.653 1.068 1.307 2.146 1.961 3.214-.654 1.069-1.308 2.145-1.961 3.213-.656 1.07-1.31 2.14-1.974 3.21h3.33c.655-1.07 1.319-2.14 1.974-3.21.655-1.06 1.31-2.14 1.966-3.21l-.002-.003.002-.002c-.656-1.07-1.311-2.152-1.966-3.213-.655-1.07-1.319-2.138-1.974-3.209z" fill="#ffc107"/><path d="M16.74 126.482c.665 1.07 1.319 2.14 1.974 3.21.654 1.068 1.306 2.146 1.96 3.214-.654 1.069-1.306 2.145-1.96 3.213-.655 1.07-1.31 2.141-1.974 3.211h3.33c.656-1.07 1.32-2.14 1.974-3.21.655-1.062 1.31-2.141 1.966-3.212l-.002-.002.002-.002c-.655-1.07-1.31-2.152-1.966-3.213-.655-1.07-1.318-2.138-1.973-3.209z" fill="#f44336"/></g></symbol><symbol viewBox="0 0 23 24" id="mathematica" xmlns="http://www.w3.org/2000/svg"><path d="M11.512 1.523l-.073.025-.46.794-.454.763-1.217 2.09H9.29L5.435 3.5l-.1-.047h-.018v.092l.025.163v.086l.132 1.226v.082l.032.252v.082l.22 2.137v.075l.018.082v.06l-2.348.507-.04.015-.457.1-.025.01h-.042l-1.096.244-.04.007-.17.036v.082l.018.01 1.859 2.086.053.052.114.132.804.909v.005l-.053.05-.22.257-2.564 2.875-.01.007v.082l.071.006.295.075 1.697.366v.006l2.139.472h.015v.047l-.036.252v.08l-.046.412v.082l-.036.244v.082l-.045.412v.08l-.05.41v.08l-.036.244v.082l-.046.412v.082l-.05.407v.082l-.032.248V20l-.05.407v.104h.037l3.642-1.6.294-.134h.018l.177.312.539.911.015.032.854 1.465.16.262.404.695.007.022h.092l.005-.022.017-.025.56-.947.014-.042.6-1.033.316-.539.644-1.091.05.013 3.906 1.721h.035v-.085l-.138-1.32v-.082l-.032-.244v-.082l-.035-.245v-.085l-.033-.244v-.081l-.032-.245v-.082l-.032-.244v-.085l-.035-.245v-.082l-.032-.245v-.082l-.033-.244v-.085l-.025-.17v-.053l1.632-.354.043-.008.458-.107h.028v-.01l.23-.05.03-.01h.042l.382-.09.025-.01h.043l.194-.05h.033l1.015-.23.07-.007v-.064l-.015-.013-1.19-1.342-.028-.028-.197-.22-1.428-1.604v-.006l.295-.323.4-.457 2.148-2.408.015-.01v-.065l-.035-.008-1.288-.28-.372-.084-.047-.01-2.481-.544v-.045l.432-4.265v-.02h-.042l-.302.135-.01.014h-.025l-3.307 1.45-.297.135h-.015l-2.028-3.483-.099-.145-.014-.045zm-.001 1.114l1.365 2.323.34.592-.008.025-1.18 1.511-.517.66-.012-.01-.258-.335-.04-.05-1.397-1.787.03-.063 1.378-2.365.287-.491zm4.908 2.039l-.007.025-.168.225-.538.066zm-9.817.004l.053.02.677.3h-.499l-.224-.3zM16.947 5l-.123 1.248-.113-.928.226-.307zm-9.26.156l.053.024.705.309-.757-.175zm7.388.116l.02.168-1.318.403.003-.003.16-.071 1.015-.444zM9.669 6.388l.944 1.204v.01L9.483 7.2zm3.55.172l.21.682-.234.084-.089.022-.702.255.008-.022.776-.982zm-5 .836l.986.356.898.312.048.02 1.054.373.011 3.086-.362-.117-.67-.224-.081-.038-.735-.245-.77-.256-.29-.1-.011-.255-.032-1.195-.01-.287-.015-.894-.013-.297zm6.583 0l-.011.227-.028.9-.008.303-.032 1.475-.01.262-.337.117-.734.245-.77.256-.712.245-.355.117.01-3.086 1.632-.578zm.585.437l.09.735.79-.097-.915 1.302-.018.006.01-.183.018-.877zm-9.451.536l.152.22 1.447 2.049-2.607.968-.05.015-1.972-2.214-.28-.312.003-.01.115-.018.424-.1.14-.021.337-.078.042-.01zm11.146.003l3.284.713.029.01-.022.025-1.954 2.192-.277.312-.092-.036-2.564-.95.475-.681.152-.216zM6.787 8.52h.86l.036 1.258-.013-.006-.763-1.078zm1.358 2.625l.152.06.77.252.712.245.746.247.49.167-.065.092-1.723 2.334-1.015-.302-.082-.017-.035-.015-1.902-.56.938-1.22.981-1.277zm6.73 0l.033.006 1.787 2.327.132.17-.128.036-.032.014-2.196.642-.105.032-.564.17-.018-.003-1.053-1.44-.174-.239-.547-.726-.007-.018.469-.16.769-.254.713-.245.77-.252zm-7.766.305l-.007.02-.405.523-.291-.291.657-.245zm8.802 0l.043.007.578.212.714.27-.661.394-.375-.479-.03-.042-.262-.342zm-10.843.75l-.67.668.355-.397.207-.23zm12.911.016l.068.025.045.042.554.627.042.043.204.228-.255.135zm-6.473.265l.022.015 1.38 1.872.032.05.343.465.008.031-.088.117-.422.629-.047.074-.245.343-.97 1.43-.013.007-1.18-1.72-.096-.16-.493-.708-.008-.037 1.618-2.191.007-.01zm7.827 1.194l.565.633.063.082-.272-.093-.037-.013zm-15.785.148l.297.299-.637.218-.152.05.038-.058zm13.224.47l-.855.448.346.66-.185-.058-.27-.088-1.092-.348.012-.01zm-9.687.255l1.222.356-.006.007-.458.145-.443.135-.032.01-.49.157zm-2.765.048l.318.32 2.007.517-.567.18-.055.004-2.103-.469-.744-.156.007-.006zm14.966.205l.548.188v.003l-.457.1-.043.014-1.069.23zm-10.23.507l.007.227.01.347.025 1.363.025.691-.007.255-.24.107-2.863 1.255.032-.372.033-.255.017-.227.031-.256.037-.407.045-.42.018-.23.032-.251.032-.412.05-.414.013-.14 1.455-.457.003-.014.301-.098zm4.908 0l1.245.39v.014l.312.1 1.146.362.022.23.03.255.043.408.04.42.017.23.033.251.032.412.042.325.078.848-.078-.04-3.025-1.322-.004-.305.06-2.368zm-4.295.617l.015.007.067.107.6.875-.64.531-.034-1.438zm3.671 0h.008l-.005.06-.02.678-.005.214-.479-.223zm-2.888 3.605l.763.915.001.37-.017-.006-.025-.05-.464-.791-.012-.018zm1.53.61l.184.083-.343.586-.018.007.002-.532z" fill="#f44336" fill-rule="evenodd" stroke="#f44336" stroke-width=".7747499999999999" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 720 720" id="matlab" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><path d="M209.247 329.98L52.368 387.638l121.325 85.822 96.752-95.804-61.198-47.674z" fill="#4db6ac" fill-rule="evenodd" stroke-width=".3"/><path d="M480.193 71.446c-13.123 1.784-9.565 1.013-28.4 16.09-18.008 14.418-69.925 100.347-97.673 129.256-24.688 25.722-34.46 12.199-60.102 33.661-25.68 21.494-65.273 64.464-65.273 64.464l63.978 47.32L394.15 222.754c23.948-32.932 23.694-37.266 36.744-71.82 6.384-16.907 17.76-29.9 27.756-45.809 12.488-19.874 30.186-34.855 21.543-33.68z" fill="#00897b" fill-rule="evenodd" stroke-width=".3"/><path d="M478.206 69.796c-31.268-.189-62.068 137.245-115.56 242.691-54.543 107.519-162.235 176.82-162.235 176.82 18.156 8.243 34.681 4.91 54.236 23.394 13.375 16.164 52.09 95.976 75.174 146.117 0 0 18.964-10.297 42.994-27.695 24.03-17.397 53.124-41.896 73.384-70.3 26.883-37.692 47.897-61.043 65.703-75.271 17.806-14.23 32.404-19.336 46.458-20.54 50.238-4.305 124.582 85.792 124.582 85.792S527.267 70.09 478.206 69.796z" fill="#ffb74d" fill-rule="evenodd" stroke-width=".3"/></symbol><symbol viewBox="0 0 24 24" id="merlin" xmlns="http://www.w3.org/2000/svg"><text style="line-height:1.25;-inkscape-font-specification:'Century Gothic Bold'" x="1.953" y="21.178" transform="scale(.99582 1.0042)" font-weight="700" font-size="30.255" font-family="Century Gothic" letter-spacing="0" word-spacing="0" fill="#42a5f5" stroke-width=".756"><tspan x="1.953" y="21.178" style="-inkscape-font-specification:'Century Gothic Bold'" font-size="22.745">M</tspan></text></symbol><symbol viewBox="0 0 192 191.99999" id="mocha" xmlns="http://www.w3.org/2000/svg"><title>Mocha Logo</title><g transform="translate(-354.75 -262.42) scale(4.835)" fill="#a1887f"><path d="M103.6 69.6c0-.5-.4-1-1-1H83.8c-.5 0-1 .4-1 1 0 3.4.5 15.1 5.5 20.8.2.2.4.3.7.3h8.4c.3 0 .5-.1.7-.3 5-5.6 5.5-17.3 5.5-20.8zm-7.4 18.2h-5.9c-.3 0-.5-.1-.7-.3-3.4-4-3.8-12-3.9-14.8 0-.5.4-1 1-1h13.2c.5 0 1 .4 1 1 0 2.8-.5 10.7-3.9 14.8-.3.2-.5.3-.8.3zM95.1 66.6s3.6-2.1 1.4-5.9c-1.3-2-1.9-3.7-1.4-4.4-1.3 1.6-3.5 3.3-1.1 6.9.8.9 1.2 2.8 1.1 3.4zM91.1 66.9s2.4-1.4.9-4c-.9-1.3-1.3-2.5-.9-2.9-.9 1.1-2.3 2.2-.7 4.7.5.5.7 1.8.7 2.2z"/><path d="M99.3 78.5c-.4 2.7-1.2 5.8-2.9 7.8-.2.2-.4.3-.6.3h-5c-.2 0-.5-.1-.6-.3-1.2-1.5-2-3.5-2.5-5.6 0 0 5.8.8 9.1-.4 2.4-.9 2.5-1.8 2.5-1.8z"/></g></symbol><symbol viewBox="0 0 24 24" id="movie" xmlns="http://www.w3.org/2000/svg"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V4h-4z" fill="#ff9800"/></symbol><symbol viewBox="0 0 24 24" id="music" xmlns="http://www.w3.org/2000/svg"><path d="M16 9V7h-4v5.5c-.42-.31-.93-.5-1.5-.5A2.5 2.5 0 0 0 8 14.5a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5V9h3m-4-7a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2z" fill="#ef5350"/></symbol><symbol viewBox="0 0 24 24" id="mxml" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m.12 13.5l3.74 3.74 1.42-1.41-2.33-2.33 2.33-2.33-1.42-1.41-3.74 3.74m11.16 0l-3.74-3.74-1.42 1.41 2.33 2.33-2.33 2.33 1.42 1.41 3.74-3.74z" fill="#ffa726"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-actions" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#ab47bc" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-effects" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#26c6da" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#e53935" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-state" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#9ccc65" stroke-width="12.914"/></symbol><symbol viewBox="0 0 24 24" id="nim" xmlns="http://www.w3.org/2000/svg"><path d="M4.464 15.75L2.288 3.78l5.985 7.617L12.08 3.78l3.809 7.617 5.985-7.617-2.177 11.97H4.464m15.234 3.264a1.088 1.088 0 0 1-1.088 1.088H5.553a1.088 1.088 0 0 1-1.089-1.088v-1.089h15.234z" stroke-width="1.088" fill="#ffca28"/></symbol><symbol viewBox="0 0 500 500" id="nix" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-1.965 36.302)" stroke-width=".395"><path d="M135.59 415.7c0-.295-2.752-5.283-6.116-11.084-3.364-5.801-6.116-10.776-6.116-11.055s9.514-16.889 21.143-36.912c11.629-20.022 21.323-36.798 21.542-37.279.346-.76-1.608-4.363-14.896-27.466-8.412-14.625-15.294-26.785-15.294-27.023 0-.5 24.46-43.501 25.206-44.31.414-.45.592-.384 1.078.395.32.513 16.876 29.256 36.791 63.87 62.62 108.85 74.852 130.01 75.41 130.46.3.242.544.554.544.694 0 .14-11.836.21-26.302.154-23.023-.09-26.313-.175-26.393-.694-.11-.714-27.662-48.825-28.86-50.392-.746-.978-.906-1.035-1.426-.51-.688.696-28.954 49.323-29.49 50.733l-.365.96h-13.229c-10.896 0-13.229-.095-13.229-.538zm167.58-125.61c-.134-.216 1.188-2.863 2.938-5.882 6.924-11.944 84.291-145.75 96.491-166.88 7.143-12.371 13.142-22.465 13.333-22.433.363.062 25.861 43.105 25.861 43.655 0 .174-6.761 11.952-15.026 26.173-8.46 14.557-14.932 26.104-14.81 26.421.185.483 4.564.564 30.213.564h29.996l.958 1.48c.526.814 3.296 5.547 6.155 10.518 2.859 4.971 5.45 9.29 5.756 9.597.706.705.704.724-.16 1.572-.395.388-3.36 5.323-6.587 10.965-3.228 5.643-6.056 10.387-6.285 10.543-.23.156-19.695.171-43.256.034l-42.84-.249-.804 1.15c-.441.632-7.504 12.736-15.696 26.897l-14.892 25.747H339.03c-8.517 0-20.015.116-25.55.259-6.55.168-10.15.121-10.309-.135zM169.42 132.23c-56.373-.055-102.5-.182-102.5-.282 0-.1 5.617-10.132 12.481-22.294l12.481-22.112h30.332c27.113 0 30.332-.065 30.332-.611 0-.336-6.659-12.228-14.797-26.427-8.139-14.199-14.797-25.917-14.797-26.04 0-.123 2.682-4.853 5.96-10.51s6.003-10.578 6.055-10.934c.086-.586 1.376-.648 13.572-.648 7.413 0 13.463.143 13.446.317-.017.174.222.707.531 1.184.31.476 9.763 16.937 21.007 36.578 11.244 19.64 20.71 36.022 21.036 36.4.554.647 2.549.691 31.428.691h30.837l12.896 22.145c7.093 12.18 12.8 22.301 12.682 22.492-.118.19-4.776.303-10.352.249-5.575-.054-56.26-.143-112.63-.198z" fill="#5075c1"/><path d="M25.289 203.14c-6.098 10.563-6.69 11.711-6.225 12.078.283.224 3.18 5.044 6.44 10.712 3.261 5.668 6.017 10.355 6.124 10.417.106.061 13.585.153 29.95.204 16.367.052 29.994.23 30.285.399.472.273-1.08 3.094-14.637 26.574L62.06 289.793l12.907 21.865c7.1 12.026 12.982 21.906 13.068 21.956.086.05 23.257-39.831 51.492-88.624 11.352-19.617 21.214-36.64 30.37-52.442 23.308-40.452 30.68-53.468 30.73-54.132-1.097-.11-6.141-.187-13.006-.216-3.945-.01-7.82-.02-12.75-.002l-25.341.092-15.42 26.706c-14.256 24.693-15.445 26.663-16.278 26.86l-.024.037c-.011.003-1.62-.001-1.825 0-4.29.062-20.453.063-40.226-.01-22.632-.082-41.615-.125-42.183-.096-.568.03-1.147-.03-1.29-.132-.142-.102-3.29 5.066-6.996 11.485zm205.16-190.3c-.123.149 5.62 10.392 12.761 22.763 12.199 21.131 89.393 155.03 96.276 167 1.502 2.613 2.92 4.803 3.443 5.348.9-1.249 3.531-5.63 7.954-13.219a1342.88 1342.88 0 0 1 10.049-17.76l6.606-11.443c.692-1.403.754-1.818.653-2.117-.162-.48-6.904-12.332-14.982-26.337-8.078-14.005-14.824-25.849-14.991-26.32a.73.73 0 0 1-.009-.366l-.426-.913L359.42 72.5c3.69-6.307 6.425-11.042 9.47-16.29 9.159-15.948 12.037-21.189 11.896-21.55-.126-.324-2.7-4.83-5.72-10.017-3.021-5.185-5.845-10.148-6.275-11.026-.483-.987-.734-1.364-1.1-1.456-.054.014-.083.018-.145.035-.42.112-5.454.195-11.189.185-5.734-.01-11.22.024-12.188.073l-1.76.089-14.997 25.978c-12.824 22.212-15.084 25.964-15.595 25.883-.024-.004-.15-.189-.235-.301-.109.066-.2.09-.272.05-.255-.148-7.143-11.902-15.306-26.119l-14.36-25.016c-.115-.186-.444-.744-.457-.752-.477-.275-50.502.287-50.737.57zm-18.646 283.09c-.047.109-.026.262.042.48.329 1.05 25.338 43.735 25.772 43.985.207.119 14.178.239 31.05.266 26.651.044 30.75.152 31.234.832.308.43 9.988 17.214 21.513 37.296s21.152 36.627 21.394 36.767c.242.14 5.927.243 12.633.23 6.706-.013 12.401.099 12.657.246.132.076.382-.141.852-.795l6.008-10.406c5.234-9.065 6.62-11.684 6.294-11.888-.575-.36-15.597-26.643-23.859-41.482-3.09-5.45-5.37-9.516-5.441-9.774-.195-.712-.065-.822 1.156-.98 1.956-.252 57.397-.057 58.07.205.238.092.79-.569 2.594-3.497 1.866-3.067 5.03-8.524 11-18.866 7.22-12.505 13.044-22.784 12.942-22.843-.102-.059-.771-.051-1.489.016l-.046.001c-4.452.204-33.918.203-149.74.025-38.96-.06-69.786-.09-71.912-.072-1.121.01-2.095.076-2.66.172a.25.25 0 0 0-.062.083z" fill="#7db7e1"/></g></symbol><symbol viewBox="0 0 24 24" id="nodejs" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.85c-.27 0-.55.07-.78.2l-7.44 4.3c-.48.28-.78.8-.78 1.36v8.58c0 .56.3 1.08.78 1.36l1.95 1.12c.95.46 1.27.47 1.71.47 1.4 0 2.21-.85 2.21-2.33V8.44c0-.12-.1-.22-.22-.22H8.5c-.13 0-.23.1-.23.22v8.47c0 .66-.68 1.31-1.77.76L4.45 16.5a.26.26 0 0 1-.11-.21V7.71c0-.09.04-.17.11-.21l7.44-4.29c.06-.04.16-.04.22 0l7.44 4.29c.07.04.11.12.11.21v8.58c0 .08-.04.16-.11.21l-7.44 4.29c-.06.04-.16.04-.23 0L10 19.65c-.08-.03-.16-.04-.21-.01-.53.3-.63.36-1.12.51-.12.04-.31.11.07.32l2.48 1.47c.24.14.5.21.78.21s.54-.07.78-.21l7.44-4.29c.48-.28.78-.8.78-1.36V7.71c0-.56-.3-1.08-.78-1.36l-7.44-4.3c-.23-.13-.5-.2-.78-.2M14 8c-2.12 0-3.39.89-3.39 2.39 0 1.61 1.26 2.08 3.3 2.28 2.43.24 2.62.6 2.62 1.08 0 .83-.67 1.18-2.23 1.18-1.98 0-2.4-.49-2.55-1.47a.226.226 0 0 0-.22-.18h-.96c-.12 0-.21.09-.21.22 0 1.24.68 2.74 3.94 2.74 2.35 0 3.7-.93 3.7-2.55 0-1.61-1.08-2.03-3.37-2.34-2.31-.3-2.54-.46-2.54-1 0-.45.2-1.05 1.91-1.05 1.5 0 2.09.33 2.32 1.36.02.1.11.17.21.17h.97c.05 0 .11-.02.15-.07.04-.04.07-.1.05-.16C17.56 8.82 16.38 8 14 8z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 300 300" id="nodemon" xmlns="http://www.w3.org/2000/svg"><title>nodemon</title><path d="M149.868 20.62c-2.124 0-4.25.55-6.154 1.648L41.899 81.083a12.306 12.306 0 0 0-6.15 10.652v117.633a12.29 12.29 0 0 0 6.152 10.646l101.815 58.766h.001a12.282 12.282 0 0 0 12.291 0l101.84-58.766a12.29 12.29 0 0 0 6.153-10.652V91.738a12.31 12.31 0 0 0-6.146-10.652L156.015 22.27a12.302 12.302 0 0 0-6.153-1.648zM83.303 70.93s11.789 33.031 35.477 31.934l27.74-15.961a7.348 7.348 0 0 1 3.414-.99h.641a7.233 7.233 0 0 1 3.404.99l27.738 15.961c23.69 1.094 35.475-31.934 35.475-31.934 5.233 23.154 1.06 38.641-5.924 48.942l4.541 2.614h.002c2.321 1.327 3.734 3.795 3.737 6.49l-.12 95.811a3.724 3.724 0 0 1-1.855 3.227 3.624 3.624 0 0 1-3.735 0L177.1 206.971c-2.311-1.363-3.742-3.818-3.742-6.48v-44.763a7.44 7.44 0 0 0-3.737-6.465l-15.642-9.01a7.28 7.28 0 0 0-3.715-1.01 7.378 7.378 0 0 0-3.742 1.01l-15.648 9.01c-2.316 1.323-3.729 3.798-3.729 6.467v44.762c0 2.663-1.413 5.1-3.738 6.48l-36.748 21.041a3.571 3.571 0 0 1-3.71 0c-1.173-.65-1.864-1.887-1.864-3.224l-.137-95.812a7.483 7.483 0 0 1 3.74-6.49l4.541-2.615c-6.982-10.302-11.16-25.79-5.925-48.942z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 990 990" id="npm" xmlns="http://www.w3.org/2000/svg"><defs><style>.hncls-1{fill:#cb3837}.cls-2{fill:#fff}</style></defs><title>n</title><path class="hncls-1" d="M113.26 876.74V113.27h763.47v763.47zm143.59-620.4v476.18h240.61V355.63h140.21v376.96h95.457V256.34z" fill="#e53935" stroke-width=".771"/></symbol><symbol id="nunjucks" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.host0{fill:#388e3c}</style><path class="host0" d="M11.2 21.1H8.1l-2.3-7.9v7.9H2.7V2.9h3.1l2.3 7.4V2.9h3.1zM21.3 19.2c0 1-.8 1.9-1.9 1.9h-4.8c-1 0-1.9-.8-1.9-1.9v-3.8l3.2-.7V18h2.3V7.2h3.1v12z"/></symbol><symbol viewBox="0 0 150 150.00001" id="ocaml" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.76136 0 0 .76136 11.616 19.98)"><path d="M83.02 101.645l.023-.062c-.035-.159-.047-.195-.024.062z" fill="none" stroke-width="1.028"/><linearGradient id="hpa" gradientUnits="userSpaceOnUse" x1="-696.735" y1="97.7" x2="-696.735" y2="142.997" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M82.313 138.79c-.471-1.004-1.904-3.621-2.624-4.46-1.562-1.828-1.927-1.966-2.386-4.275-.799-4.02-2.913-11.31-5.405-16.341-1.286-2.596-3.426-4.777-5.385-6.66-1.71-1.652-5.565-4.431-6.237-4.294-6.296 1.257-8.249 7.432-11.21 12.323-1.638 2.705-3.374 5.007-4.665 7.885-1.192 2.646-1.087 5.577-3.128 7.849-2.093 2.333-3.454 4.814-4.48 7.829-.194.574-.747 6.596-1.348 8.015l9.357-.659c8.719.594 6.2 3.936 19.81 3.208l21.487-.665c-.666-1.97-1.584-4.25-1.938-4.991-.599-1.248-1.352-3.69-1.848-4.763z" fill="url(#hpa)" stroke-width="1.028"/><linearGradient id="hpb" gradientUnits="userSpaceOnUse" x1="-666.972" y1="142.12" x2="-666.972" y2="142.12" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><linearGradient id="hpc" gradientUnits="userSpaceOnUse" x1="-675.228" y1="-1.28" x2="-675.228" y2="142.967" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M109.553 94.296c-1.652 1.193-4.88 4.06-11.902 5.145-3.152.487-6.1.527-9.335.365-1.584-.076-3.077-.157-4.665-.177-.936-.008-4.074-.107-3.919.193l-.349.871c.054.287.169 1.004.2 1.177.129.704.165 1.265.192 1.912.048 1.331-.11 2.719-.043 4.062.141 2.787 1.175 5.326 1.306 8.137.143 3.13 1.69 6.442 3.188 8.998.569.973 1.434 1.084 1.811 2.283.442 1.373.024 2.83.239 4.293.842 5.675 2.477 11.606 5.032 16.728.018.043.038.09.06.128 3.156-.53 6.318-1.665 10.418-2.271 7.517-1.115 17.972-.54 24.688-1.17 16.993-1.597 26.216 6.97 41.478 3.459V22.459c0-11.84-9.594-21.438-21.435-21.438H19.239C7.4 1.021-2.197 10.62-2.197 22.458v46.774c3.067-1.11 7.479-7.635 8.861-9.222 2.419-2.775 2.858-6.315 4.062-8.544 2.743-5.078 3.215-8.57 9.451-8.57 2.907 0 4.061.67 6.027 3.31 1.368 1.834 3.731 5.224 4.837 7.49 1.277 2.615 3.357 6.153 4.272 6.867.677.53 1.35.928 1.976 1.163 1.012.38 1.848-.316 2.525-.855.863-.687 1.235-2.088 2.035-3.957 1.152-2.696 2.408-5.926 3.122-7.054 1.237-1.949 1.658-4.261 2.993-5.381 1.97-1.652 4.54-1.768 5.246-1.908 3.957-.781 5.755 1.906 7.704 3.645 1.276 1.138 3.019 3.432 4.256 6.507.967 2.4 2.199 4.622 2.714 6.008.497 1.339 1.725 3.484 2.453 6.055.661 2.336 2.43 4.125 3.102 5.235 0 0 1.029 2.882 7.285 5.516 1.357.572 4.1 1.501 5.736 2.096 2.718.988 5.351.86 8.704.458 2.391 0 3.686-3.462 4.772-6.234.643-1.639 1.259-6.334 1.678-7.667.406-1.297-.544-2.3.265-3.437.946-1.327 1.508-1.399 2.054-3.129 1.172-3.704 7.95-3.89 11.761-3.89 3.176 0 2.772 3.083 8.16 2.028 3.086-.605 6.059.398 9.335 1.265 2.758.732 5.352 1.566 6.906 3.385 1.005 1.178 3.5 7.08.958 7.331.244.3.423.84.88 1.135-.566 2.226-3.03.64-4.4.355-1.845-.383-3.147.057-4.952.856-3.085 1.374-7.598 1.214-10.286 3.452-2.281 1.898-2.277 6.133-3.34 8.507-.002-.001-2.955 7.6-9.402 12.248z" fill="url(#hpc)" stroke-width="1.028"/><linearGradient id="hpd" gradientUnits="userSpaceOnUse" x1="-735.137" y1="90.833" x2="-735.137" y2="141.967" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M38.247 105.09c-1.467-.15-2.83-.317-4.256-.605-2.662-.536-5.57-1.06-8.193-1.688-1.592-.385-6.895-2.263-8.048-2.792-2.702-1.246-4.496-4.63-6.609-4.282-1.348.22-2.662.682-3.5 2.042-.685 1.11-.917 3.016-1.391 4.294-.55 1.485-1.5 2.87-2.331 4.284-1.53 2.595-4.282 4.941-5.468 7.469-.239.52-.45 1.101-.649 1.708V144.415a48.57 48.57 0 0 1 4.45.96c11.955 3.19 14.872 3.46 26.598 2.119l1.1-.146c.897-1.867 1.59-8.227 2.171-10.195.454-1.51 1.077-2.712 1.313-4.253.223-1.463-.02-2.858-.146-4.188-.329-3.332 2.427-4.522 3.742-7.384 1.186-2.589 1.871-5.535 2.853-8.181.941-2.54 2.41-6.13 4.918-7.408-.305-.355-5.237-.518-6.554-.65z" fill="url(#hpd)" stroke-width="1.028"/></g></symbol><symbol viewBox="0 0 24 24" id="pdf" xmlns="http://www.w3.org/2000/svg"><path d="M14 9h5.5L14 3.5V9M7 2h8l6 6v12a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m4.93 10.44c.41.9.93 1.64 1.53 2.15l.41.32c-.87.16-2.07.44-3.34.93l-.11.04.5-1.04c.45-.87.78-1.66 1.01-2.4m6.48 3.81c.18-.18.27-.41.28-.66.03-.2-.02-.39-.12-.55-.29-.47-1.04-.69-2.28-.69l-1.29.07-.87-.58c-.63-.52-1.2-1.43-1.6-2.56l.04-.14c.33-1.33.64-2.94-.02-3.6a.853.853 0 0 0-.61-.24h-.24c-.37 0-.7.39-.79.77-.37 1.33-.15 2.06.22 3.27v.01c-.25.88-.57 1.9-1.08 2.93l-.96 1.8-.89.49c-1.2.75-1.77 1.59-1.88 2.12-.04.19-.02.36.05.54l.03.05.48.31.44.11c.81 0 1.73-.95 2.97-3.07l.18-.07c1.03-.33 2.31-.56 4.03-.75 1.03.51 2.24.74 3 .74.44 0 .74-.11.91-.3m-.41-.71l.09.11c-.01.1-.04.11-.09.13h-.04l-.19.02c-.46 0-1.17-.19-1.9-.51.09-.1.13-.1.23-.1 1.4 0 1.8.25 1.9.35M8.83 17c-.65 1.19-1.24 1.85-1.69 2 .05-.38.5-1.04 1.21-1.69l.48-.31m3.02-6.91c-.23-.9-.24-1.63-.07-2.05l.07-.12.15.05c.17.24.19.56.09 1.1l-.03.16-.16.82-.05.04z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="perl" xmlns="http://www.w3.org/2000/svg"><path d="M12 14c-1 0-3 1-3 2 0 2 3 2 3 2v-1a1 1 0 0 1-1-1 1 1 0 0 1 1-1v-1m0 5s-4-.5-4-2.5c0-3 3-3.75 4-3.75V11.5c-1 0-5 1.5-5 4.5 0 4 5 4 5 4v-1M10.07 7.03l1.19.53c.43-2.44 1.58-4.06 1.58-4.06-.43 1.03-.71 1.88-.89 2.55C13.16 3.55 15.61 2 15.61 2a15.916 15.916 0 0 0-2.64 3.53c1.58-1.68 3.77-2.78 3.77-2.78-2.69 1.72-3.9 4.45-4.2 5.21l.55.08c0 .52 0 1 .25 1.38C14.1 11.31 18 11.47 18 16s-4.03 6-6.17 6C9.69 22 5 21.03 5 16s4.95-5.07 5.83-7.08c.12-.38-.76-1.89-.76-1.89z" fill="#9575cd"/></symbol><symbol viewBox="0 0 24 24" id="php" xmlns="http://www.w3.org/2000/svg"><path d="M12 18.08c-6.63 0-12-2.72-12-6.08s5.37-6.08 12-6.08S24 8.64 24 12s-5.37 6.08-12 6.08m-5.19-7.95c.54 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.58 1.09-.28.22-.71.33-1.29.33h-.87l.53-2.76h.99m-3.5 5.55h1.44l.34-1.75h1.23c.54 0 .98-.06 1.33-.17.35-.12.67-.31.96-.58.24-.22.43-.46.58-.73.15-.26.26-.56.31-.88.16-.78.05-1.39-.33-1.82-.39-.44-.99-.65-1.82-.65H4.59l-1.28 6.58m7.25-8.33l-1.28 6.58h1.42l.74-3.77h1.14c.36 0 .6.06.71.18.11.12.13.34.07.66l-.57 2.93h1.45l.59-3.07c.13-.62.03-1.07-.27-1.36-.3-.27-.85-.4-1.65-.4h-1.27L12 7.35h-1.44M18 10.13c.55 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.57 1.09-.29.22-.72.33-1.3.33h-.85l.5-2.76h1m-3.5 5.55h1.44l.34-1.75h1.22c.55 0 1-.06 1.35-.17.35-.12.65-.31.95-.58.24-.22.44-.46.58-.73.15-.26.26-.56.32-.88.15-.78.04-1.39-.34-1.82-.36-.44-.99-.65-1.82-.65h-2.75l-1.29 6.58z" fill="#1E88E5"/></symbol><symbol viewBox="0 0 79 78" id="postcss" xmlns="http://www.w3.org/2000/svg"><title>postcss-logo-symbol</title><g transform="translate(5.48 5.52) scale(.85425)" fill="#e53935" fill-rule="evenodd" stroke="#e53935" stroke-width="1.519"><path d="M15.447 32.623c.106.08.29.132.106.29-.132.184-.29.342-.395.553-.105.185-.184.237-.342.106.21-.343.42-.66.63-.95zM68.342 60.24c0 .078.026.13.026.21.053-.105.053-.158.08-.21zm0 .236v-.026zm-5.368 10.277l-4.58-25.402c-.078-.025-.183-.077-.368-.13.053.105.08.184.106.263.13-.026.184-.026.236-.052 0-.026 0-.052.027-.08l4.58 25.404zm-4.737-31.12c-.026.078-.026.158-.026.237 0-.08 0-.16.028-.238zm.026.526c-.026 0-.026 0-.052-.028v.026c.028.026.028.026.054 0zm-.052.21v-.185c-.077.026-.156.026-.262.053.132.05.264.078.264.13z"/><path d="M78.71 33.967c-.052-1.028-.078-2.056-.184-3.083-.184-1.397-.368-2.82-.684-4.19-.237-1.133-.63-2.214-1.026-3.294-.5-1.265-1-2.556-1.632-3.768-1.026-1.95-2.368-3.69-3.605-5.508-.818-1.16-1.87-2.108-2.66-3.294-.447-.685-1.105-1.264-1.763-1.79-1.053-.845-2.158-1.61-3.263-2.347a32.525 32.525 0 0 0-2.58-1.634c-.71-.397-1.473-.713-2.21-1.056-.842-.395-1.658-.87-2.605-1.054-.238-.05-.448-.13-.685-.21-.605-.21-1.184-.447-1.79-.632-.92-.29-1.815-.632-2.763-.87C50.342 1 49.394.843 48.446.71 47.394.555 46.316.5 45.262.397a26.83 26.83 0 0 0-2.026-.184C42.236.16 41.21.16 40.21.134c-.5-.027-1.026-.08-1.526-.053-.763.026-1.526.105-2.29.21-.736.08-1.473.21-2.183.317-.867.105-1.735.158-2.604.264-.816.106-1.658.264-2.473.396-.29.053-.58.158-.87.21-.63.132-1.288.185-1.92.396-1.13.344-2.263.74-3.368 1.16-1.027.422-2.027.87-3 1.397-1 .552-1.948 1.21-2.895 1.844a45.325 45.325 0 0 0-2.66 1.923c-.84.66-1.63 1.397-2.394 2.135-.42.42-.763.922-1.158 1.396-.657.765-1.315 1.502-1.947 2.293-.524.66-1 1.344-1.5 2.03-.893 1.21-1.656 2.502-2.366 3.794-.29.527-.553 1.054-.816 1.58-.395.79-.816 1.555-1.184 2.372-.264.554-.474 1.16-.632 1.766-.367 1.292-.736 2.61-1.078 3.9-.316 1.16-.395 2.372-.42 3.558-.027 1.054.078 2.082.183 3.136.027.264-.13.58.184.79-.105.29-.026.45.13.5-.182.29.08.476-.024.74-.027.052.08.157.13.236 0 .08-.025.185 0 .264.028.237.133.474.133.738 0 .184.157.395.21.58.026.078 0 .21-.053.263-.158.184-.132.342.105.448.133.342.08.5.054.66.052.236-.027.315 0 .368.21.422.29.896.315 1.37 0 .106.053.212.106.343.026 0 0 .5 0 .5.13-.078.237-.104.368-.157.08.342.158.66.263.95.132.21.132.314.08.34.105.474.157.922.34 1.37 0-.5-.05-1-.13-1.475.368.132.684.263.895.263.027-.08.053-.184.08-.237-.158-.157-.29-.394-.448-.552.053.21 0 .29 0 .37-.105-.054-.237-.107-.368-.16.105-.13.21-.263.368-.42 0-.238-.13-.45-.5-.423.158-.052.316-.13.5-.184.29-.157-.026-.447-.026-.816.026-.447-.237-.895-.316-1.37-.132-.737-.105-1.844-.184-2.582-.158-.132-.29.21-.316.237.08.632.158 1.264.21 1.897-.157-.527-.263-1.107-.394-1.74-.027.185-.053.264-.053.37-.13.13-.026.29.053.474-.184-.08-.395-.052-.395-.052v.738c-.262-.264-.34-.474-.473-.66-.052-.21-.08-.42-.13-.63.05-.133 0-.212 0-.29a15.968 15.968 0 0 1-.08-.634c.026-.026-.026-.42-.026-.42.21.025.343.05.474.05-.263-.34-.08-.552.027-.763.053-.106.237-.13.29-.238.21-.395.553-.71.553-1.212 0-.237.08-.5.105-.738.053-.448.105-.896.13-1.344.054-.58 0-1.16.133-1.713.212-.92.475-1.843.764-2.766.21-.66.448-1.29.71-1.95.395-1.028.764-2.056 1.264-3.03.71-1.424 1.526-2.794 2.316-4.19.5-.87 1.026-1.687 1.58-2.53.525-.817 1.05-1.66 1.657-2.425a21.452 21.452 0 0 1 2.79-2.978c1.053-.948 2.053-1.923 3.184-2.793a32.218 32.218 0 0 1 4.685-3.005c1.343-.71 2.737-1.266 4.132-1.793.895-.342 1.868-.5 2.79-.79 1.052-.343 2.105-.5 3.21-.527.71-.027 1.395-.106 2.105-.185.632-.05 1.263-.104 1.948-.183-.08.105-.106.158-.132.21-.288.422-.604.844-.894 1.265-.237.343-.5.712-.737 1.054-.422.555-.87 1.108-1.264 1.688-.605.87-1.158 1.766-1.79 2.635-.63.843-1.315 1.634-1.973 2.45-.868 1.134-1.684 2.293-2.552 3.426-.79 1.08-1.63 2.11-2.394 3.19-.684.947-1.29 1.95-1.948 2.923-.973 1.45-1.947 2.872-2.92 4.322a271.93 271.93 0 0 1-2.316 3.294c-.053.08-.132.104-.21.157-.21.342-.21.527-.29.685-.21.395-.42.79-.658 1.16-.132.21-.316.394-.474.605-.026-.316.42-.474.21-.87-.13.212-.263.396-.394.607l-.316.63c.105.08.29.133.105.29-.08.133-.158.29-.237.423a.954.954 0 0 0 .29-.264c0 .29-.158.526-.29.763-.105.21-.368.37-.552.527.026.027.21.106.237.132.237-.08.316-.21.343-.132.08-.105.158-.184.184-.263.104-.264.262-.474.525-.58.106-.053.184-.132.263-.21.79-.818 1.606-1.608 2.316-2.478 1.106-1.345 2.106-2.74 3.16-4.11.446-.58.973-1.16 1.446-1.714.078.606.026 1.185 0 1.74-.08.974-.132 1.95-.21 2.95-.027.395 0 .79-.027 1.186 0 .105-.08.184-.08.29 0 .263.08.553.08.817-.08.975-.186 1.923-.265 2.898-.027.21.078.422.13.607-.13 1.422.16 2.925-.078 4.427.184-.29.237-.474.237-.658.025-.158 0-.316 0-.5v-.264c.025-.475.13-.975.078-1.45-.053-.527-.053-1.027.053-1.528.053-.21-.026-.474.106-.738v.395c-.026 1.5.027 3.003-.183 4.505-.027.132.08.37-.21.343-.238.474.052.817-.21 1.08-.054.053.05.29.077.448-.106.317-.106.317.052.343.026.58.08 1.106.105 1.66.42-1 .21-2.03.396-3.058.026.422.053.844.026 1.29 0 .687-.026 1.345-.052 2.03 0 .132-.027.264-.053.396-.08.37-.105.738-.237 1.08-.105.264-.052.66-.052.975v1.003c.105.448-.027.685.052.948-.08.265-.105.344-.08.423l.08.395c.527-.053.29.343.5.553-.158.212-.105.29-.105.397 0 .237-.025.448-.052.685 0 .606-.026 1.212-.026 1.792 0 .08.026.157.026.236 0 .054-.026.74-.026.74.053.078 0 .157-.08.236-.025 0-.104-3.347-.104-3.347h-.395c-.052 1.58.08 3.003-.21 4.48-.316.025-.42.078-.764.078-.816 0-1.632 0-2.448.026-.974 0-1.92.026-2.895.026-.472 0-.972.054-1.446.054-.632 0-1.29-.08-1.92-.08-.975 0-1.922.08-2.896.106-.71.026-1.42.026-2.13.053-.475.025-.95.05-1.422.104-.21.026-.395.105-.658.184-.08 0-.263-.026-.42 0-.265.053-.5.21-.765.264-.395.08-.5.184-.448.58v.263c-.026.052.58-.08.58-.08-.054 0-.08.158-.16.29.212-.08.343-.132.475-.184.395.185.737.08 1.052.16 1.026.262 2.078.37 3.13.473.685.053 1.343.08 2.027.105.973.053 1.947.106 2.92.106.816 0 1.606-.08 2.42-.08 1.13 0 2.264.052 3.395.08.237 0 .5-.028.763-.028h1.92c1.712-.052 3.422-.08 5.133-.13.975-.028 1.975-.08 2.948-.107l3-.08c1.158-.026 2.316-.026 3.448-.05.868 0 1.71-.03 2.58-.055.972-.026 1.972-.105 2.946-.157.527-.027 1.054-.08 1.58-.132.632-.052 1.29-.13 1.92-.157.948-.054 1.922-.08 2.87-.133 1.184-.078 2.368-.183 3.578-.21 1.106-.052 2.237-.026 3.343-.052.974-.027 1.948-.08 2.948-.106l1.66-.08s1.104-.026 1.657-.08c.947-.052 1.894-.157 2.842-.183.604-.027 1.21 0 1.815-.027.973-.026 1.973-.08 2.947-.08.367 0 .762.054 1.236.08-.21.185-.342.29-.5.422.105.026.21.08.316.132a.71.71 0 0 1-.42.13c-.054.133-.107.186-.16.45h.474c-.184 0-.342.237-.526.395-.21-.054-.395 0-.5.29.184.104.158.183.132.29-.316.104-.553.21-.42.552-.107.052-.238.105-.37.184-.13.21-.368.263-.316.553.106.025.21.08.29.104-.132.053-.263.132-.395.184-.473.29-.262.422-.157.554-.08.053-.158.105-.237.132.052.237.13.29.157.29a9.3 9.3 0 0 0-.395.316c-.08.237-.185.342-.29.5s-.158.37-.29.527c-.552.607-.947 1.32-1.657 1.793-.264.185-.5.422-.737.66-.474.447-.895.948-1.395 1.37a29.595 29.595 0 0 1-2.052 1.554 151.56 151.56 0 0 1-2.604 1.792c-.474.315-1 .552-1.5.842s-.974.554-1.474.843c-.316.21-.606.5-.948.66-.868.37-1.79.685-2.684 1.028-.87.37-1.5.685-2.158.922-.605.21-1.237.37-1.868.5-.21.054-.448 0-.685.027-.448.08-.895.186-1.343.238-1.158.158-2.316.264-3.473.422-.685.08-1.343.21-2.027.29-.473.026-.973-.026-1.447-.026-.342 0-.71.08-1.053.027-.552-.08-1.105-.21-1.658-.316-.13-.026-.316-.08-.42-.026-.21.106-.396-.052-.607 0-.13.027-.262-.08-.394-.08-.106-.025-.238.028-.37 0-.29-.078-.552-.183-.87-.157-.313.026-.63-.132-.97-.21-.475-.106-.92-.21-1.396-.317a2.38 2.38 0 0 1-.525-.237c-.685 0-1.133-.026-1.554-.185-.368-.13-.71-.315-1.105-.262-.104.026-.183-.026-.29-.026-.08-.106-.157-.317-.235-.317-.526.027-.842-.42-1.29-.553-.236-.08-.42-.343-.657-.422-.58-.237-1.052-.737-1.71-.816-.21-.027-.42-.132-.658-.21.08.104.13.183.21.262-.763-.37-1.473-.79-2.184-1.186-.104-.026-.183-.13-.262-.184l-.71-.474c-.395.08-.553-.08-.66-.132-.71-.5-1.525-.817-2.21-1.37-.29-.238-.63-.396-.84-.686-.37-.448-.817-.764-1.317-1.027-.394-.21-.762-.448-1.13-.685-.185-.132-.37-.29-.37-.58 0-.185-.078-.37-.315-.264-.105-.158-.21-.342-.342-.395-.316-.13-.526-.37-.763-.58s-.42-.5-.71-.605c-.527-.21-.843-.658-1.158-1.027-.738-.87-1.396-1.82-2.08-2.74-.053-.08-.158-.133-.237-.212.105.29.237.527.368.79-.262-.105-.446-.29-.604-.474-.027.027 1.815 3.057 1.815 3.057.16.237.29.475.448.712a.813.813 0 0 1-.79-.422c-.236-.42-.5-.684-1.026-.63a4.588 4.588 0 0 1-.13-.58c-.107 0-.185 0-.37-.027.37.58.685 1.08 1.027 1.66-.133-.08-.21-.132-.265-.158.473.5.815 1.133 1.42 1.45.132.605.816.895.974 1.475-.13-.027-.238-.053-.37-.08-.21-.263-.447-.526-.683-.816.052.184.13.342.236.474.316.395.606.79.974 1.133.132.134.316.187.316.424.21.105.29.13.368.13.054.16-.025.397.29.344.21.395.42.395.71.264.343.343.528.37.764.16 0 .13.026.262.026.368.105-.053.08-.132.08-.264.13.105.21.158.262.21.263.37.5.712.868 1.002.5.422.948.87 1.42 1.265.922.765 1.95 1.398 2.975 1.977 1.264.712 2.475 1.476 3.764 2.16 1.552.818 3.21 1.372 4.92 1.767.632.132 1.237.263 1.87.42.55.16 1.104.397 1.657.528.842.185 1.71.343 2.552.5.183.027.37.054.58.08.235.053.524-.053.577.027.132.21.237.104.395.078.184-.053.395-.053.605-.053.737.026 1.447.184 2.184.132.16 0 .396-.133.528.13.236-.105.368-.105.473-.13.028.236 0 .236-.05.262-.054.026-.133.053-.238.132.947.184 1.842.21 2.63 0 1.37.105 2.554-.053 3.686-.448.105.132.184.316.342.053.052-.08.184-.107.29-.133.236-.053.526-.158.736-.08.238.08.317-.13.5-.13.317 0 .606-.027.896-.08.158-.026.316-.105.5-.158a1.285 1.285 0 0 0-.58-.133c.317-.158.606-.29.896-.42-.053.078-.106.183-.21.183h.367c-.08 0-.185.237-.316.395.946-.237 1.814-.448 2.657-.66-.29-.552.315-.367.526-.684-.263.08-.526.158-.79.21.895-.447 1.816-.842 2.71-1.237-.13.158-.29.237-.525.37.158.025.263.025.342.05.42.133.316-.262.447-.5.5 0 .71-.078.947-.158.263-.08.526-.158.79-.263.42-.184.815-.42 1.236-.63.08-.028.21 0 .316 0 .29-.186.394-.344.473-.318.37.053.63-.08.736-.42.184-.133.316-.238.447-.318.578-.316 1.13-.632 1.71-.948.21 0 .316 0 .368-.027.344-.16.66-.342.975-.527a2.258 2.258 0 0 1-.263-.13c.262-.054.34-.08.5-.133.63-.74 1.5-1.24 2.157-1.82.29-.026.29-.105.29-.157.104-.132.21-.29.34-.396.58-.527 1.21-.975 1.737-1.528a37.16 37.16 0 0 0 2.184-2.374c.63-.738 1.264-1.475 1.79-2.292.737-1.133 1.368-2.293 2.026-3.48.474-.842.895-1.685 1.37-2.528.05-.08.157-.185.236-.185.71-.08 1.422-.13 2.106-.21.158-.026.342-.13.5-.21-.08-.132-.132-.29-.21-.422-.106-.16-.264-.29-.37-.45-.104-.13-.183-.29-.262-.447-.08-.13-.158-.236-.237-.37a9.7 9.7 0 0 1-.45-.894c-.026-.08-.08-.21-.052-.29.474-1.027.658-2.134 1.105-3.162.447-1.054.58-2.24.79-3.373.184-1.08.29-2.16.42-3.24.08-.764.185-1.502.21-2.266.16-1.212.106-2.346.08-3.48-.026-1-.08-2.028-.13-3.03zM12.685 66.405c-.184-.21-.342-.448-.526-.658l.08-.08c.287.317.577.633.866.976-.158-.08-.342-.132-.42-.238zm.42.238c.08-.027.16-.027.238-.053.08.132.132.29.21.448-.368-.027-.552-.185-.447-.395zm27.37 10.883v-.08c.5-.052.973-.105 1.473-.157v.077c-.5.08-.973.13-1.473.158zm6.63-.685c-.367.08-.762.133-1.13.186-.132.026-.29.158-.342-.08-.053.027-.106.027-.158.054.13.394.447.078.71.236-.58.08-1.13.132-1.684.21v-.052c.16-.026.343-.053.5-.08v-.078a7.743 7.743 0 0 0-.79-.053c-.077 0-.183.106-.262.132-.105.026-.21.053-.342.053-.447.026-.894.026-1.316.052-.027 0-.08-.026-.106-.026v-.08c1.763-.236 3.5-.473 5.263-.71.027.052.027.105.053.157-.158 0-.263.055-.395.08zm.396-.262c.606-.08 1.16-.132 1.738-.21-1.21.342-1.605.394-1.737.21zM24.58 23.374c.84-1.16 1.71-2.32 2.552-3.505.263-.345.473-.714.736-1.056.08-.106.185-.158.316-.264l-.026-.05c.105-.133.21-.24.263-.344.134-.21.213-.448.318-.685a.385.385 0 0 1 .105-.103c.37.184.37-.21.5-.343.237-.264.474-.553.684-.817.158-.21.316-.395.448-.632.026-.08-.053-.21-.08-.317h-.078c.08-.052.158-.13.237-.184.026 0 .026 0 .052-.026.158-.238.316-.475.474-.686.315-.42.657-.842 1.025-1.21-.052.13-.105.263-.158.368.027 0 .027.027.053.027.316-.422.658-.817.974-1.24-.027-.025-.053-.052-.08-.052-.13.132-.236.264-.368.396-.026-.027-.052-.053-.08-.053.265-.343.528-.685.79-1.08.053.08.106.184.21.395.107-.263.212-.447.29-.632-.078.08-.183.158-.262.238l-.08-.08.474-.71c.5-.712 1-1.45 1.5-2.162.185-.263.42-.474.58-.738.5-1 1.29-1.792 1.894-2.714.132-.184.316-.342.474-.5.13-.16.237-.106.342.026.71.896 1.42 1.818 2.13 2.714.528.66 1.054 1.29 1.554 1.976.605.844 1.184 1.687 1.79 2.53.684.975 1.368 1.95 2.026 2.95 1 1.477 1.947 2.953 2.947 4.428.737 1.08 1.474 2.135 2.184 3.215h-1.344c-1.236-.025-2.5-.13-3.736-.078-1.684.08-3.394.264-5.078.396-2.132.185-4.29.21-6.42.21-.765 0-1.528.107-2.29.16-.922.052-1.817.105-2.738.13-1.08.054-2.13.08-3.21.107-.606.026-1.237 0-1.895 0zm30.183 12.12v.238c-.026 0-.052.027-.105.027-.105-.37-.21-.766-.342-1.135-.263-.765-.553-1.53-1.027-2.214-.528-.737-1-1.5-1.528-2.265-.13-.185-.316-.343-.474-.5-.553-.607-1.106-1.24-1.816-1.687a21.485 21.485 0 0 0-3.29-1.688 7.374 7.374 0 0 1-.92-.474h.63l4.5-.08c.974-.025 1.922-.025 2.895-.078.236 0 .368.08.5.29.236.395.473.79.736 1.186.027.052.08.13.08.21 0 .58 0 1.186.026 1.766.025.606.08 1.186.104 1.792 0 .606-.053 1.238-.026 1.87.027.897.053 1.82.053 2.74zM26.447 26.67c1.237-.053 2.42-.132 3.632-.185.945-.053 1.92-.08 2.866-.132.395-.025.764-.05 1.158 0-.42.212-.842.423-1.21.686-.474.316-.92.737-1.395 1.08-.475.342-.896.764-1.29 1.212-.5.605-1.053 1.132-1.58 1.712-.37.422-.79.817-1.105 1.265-.447.58-.842 1.21-1.263 1.87.132-2.504.29-4.98.184-7.51zm17.185 25.35c-.843.21-1.71.448-2.58.553-.736.106-1.5.08-2.263.08a25.42 25.42 0 0 1-2.028-.08c-.763-.078-1.526-.157-2.263-.5-.633-.29-1.29-.553-1.92-.87-.634-.316-1.265-.684-1.74-1.264-.34-.423-.815-.765-1.236-1.134.08.316.263.58.553.764-.132.158-.316.08-.58-.343-.078.053-.157.08-.21.106.08-.185.158-.37.237-.527-.105-.21-.237-.448-.342-.66-.21-.342-.42-.71-.605-1.053-.053-.08-.053-.158-.105-.237a5.893 5.893 0 0 1-.37-.475c-.21-.315-.394-.657-.657-.974 0 .08.027.158.027.264-.027 0-.053.026-.053.026l-.554-1.344c-.026 0-.026 0-.052.026l.473 1.74c-.026 0-.052.025-.08.025-.077-.104-.156-.21-.21-.34-.052-.212-.21-.212-.34-.133-.08.053-.133.237-.106.316.185.448.395.896.606 1.344.052.158.105.29.184.448.027.053.106.105.106.184.106.21.185.42.316.606.237.316.5.632.737.948.235.316.445.66.656.975.026.053.105.053.13.08.133.395.58.684.896.526.08.606.737.817 1 1.397a11.957 11.957 0 0 1-.763-.343c-.027.026-.027.052-.054.105.316.158.632.316.92.5.265.16.528.317.765.5.316.29.685.45 1.13.554a.282.282 0 0 0-.05-.107c.736.343 1.5.712 2.078 1-2.737.054-5.658.107-8.685.16 0-.5-.026-.975-.026-1.476 0-.21.052-.395.025-.606-.08-1.21-.08-2.424-.237-3.61-.157-1.264-.157-2.503-.13-3.77.025-.683-.027-1.394-.054-2.08 0-.922 0-1.82.028-2.74 0-.132.053-.237.106-.37h.08c.025.054 0 .133.05.16.08.08.212.21.265.184.157-.106.394-.21.447-.37.13-.315.184-.658.184-.974 0-.236.106-.394.21-.553.054-.08.08-.158.133-.263-.105-.08-.21-.132-.342-.237.106-.29.08-.633.475-.79.052-.027.052-.16.08-.238.025-.213.05-.45.078-.66.052.08.08.105.13.157a.42.42 0 0 1 .054-.08c0-.104-.026-.315 0-.315.316-.053.184-.395.342-.553.025-.028-.027-.107-.027-.16 0-.052 0-.13.026-.13.367-.08.315-.475.552-.66.08-.053.105-.13.21-.263.21.368-.158.553-.184.816.446-.263.578-.895.315-1.08.105-.08.21-.184.29-.29.29-.316.604-.606.868-.922.185-.236.29-.526.474-.763.106-.132.316-.237.474-.317.474-.262.92-.552 1.21-1 .053-.053.132-.105.21-.158.08-.053.238-.053.264-.132.027-.052-.052-.184-.105-.263.104-.053.21-.158.42-.264-.08.158-.105.264-.158.37l.13.13c.238-.184.606-.394.843-.552 0-.025-.132-.13-.132-.13-.157.08-.394.21-.63.316.05-.08.05-.132.08-.158.367-.237.735-.474 1.13-.66.92-.42 1.842-.842 2.763-1.237.158-.08.37-.026.553-.026.078 0 .13 0 .21-.026.42-.132.842-.264 1.263-.37.183-.052.393-.078.58-.078.787.025 1.577.025 2.366.078.342.026.658.105.974.21a9.88 9.88 0 0 1 1.184.5c.447.24.868.502 1.29.792.763.5 1.473 1.054 2.236 1.502.737.448 1.316 1.054 1.79 1.74.58.816 1.237 1.554 1.5 2.555l.394 1.74c.08.316.264.632.185 1-.133.66-.238 1.345-.343 2.004-.052.265-.105.53-.078.79.05.82-.265 1.53-.58 2.268-.106.237-.264.475-.395.738a.798.798 0 0 0 .21.106l.237-.474c.027 0 .027 0 .053.027-.132.368-.237.764-.37 1.133-.314.817-.63 1.66-1.025 2.45-.21.448-.58.817-.842 1.24-.262.368-.473.763-.736 1.106-.237.29-.473.58-.79.79-.71.527-1.447 1.054-2.21 1.476-.473.29-1.026.448-1.552.58zm-14.027-1.4l-.026.027c-.055-.026-.134-.052-.186-.105l-.632-.95c-.052-.078-.08-.157-.052-.262.29.448.58.87.895 1.29zm16.37 3.61c1.183-.5 2.157-1.21 3.05-2.028.133-.132.264-.263.422-.37 1.106-.684 1.92-1.633 2.658-2.687.842-1.212 1.395-2.582 2.08-3.873a2.73 2.73 0 0 1 .157-.29c-.053 3.004.29 5.955.684 8.933-2.973.105-6 .21-9.052.316zm26.683-.79c-.026.053-.08.106-.105.16-.027-.054-.027-.133-.053-.24-.158.423-.5.212-.737.212-1.42.027-2.868.027-4.29.027-1.368 0-2.762 0-4.13.024-.448 0-.922.105-1.37.132-1.078.052-2.157.08-3.236.105-.08 0-.158-.13-.29-.236a1.81 1.81 0 0 1-.158.237c-.028-.052-.08-.104-.133-.183-.026.08-.053.158-.08.21H58c-.053-.368-.158-.71-.158-1.08 0-.79.08-1.58.105-2.372.027-.368 0-.71 0-1.054.106.08.185.133.29.21.052-.103.105-.182.158-.26 0 0-.053-.028-.106-.08.05-.027.104-.08.104-.106.026-.08.08-.158.08-.21 0-.185-.054-.343-.08-.5.026 0 .052 0 .08-.028l.157.79h.08c-.106-.183.236-.342-.053-.552-.026-.027.026-.185.026-.264-.08-.157-.13-.315-.21-.526.026-.026.105-.053.184-.08-.105-.052-.184-.104-.263-.13.263-.238.263-.37.026-.633.054-.025.106-.025.106-.05 0-.238 0-.475-.052-.71-.053-.266.08-.58-.316-.74a.79.79 0 0 0 .105.21s-.08.027-.158.08c-.342-.317-.13-.74-.21-1.213.184.053.316.106.447.16-.053-.186-.184-.397-.263-.634h-.107v-1.74c0 .027.184.027.29.054 0-.027.025-.053.025-.08-.08-.105-.185-.21-.29-.342l.053-.053c-.21-.262-.105-.63-.105-.71V39.4c.264.264-.13.606.264.764v-.263h-.027c-.026-.395-.026-.79-.052-1.186h-.052c-.027.054-.027.08-.054.133h-.052l.158-6.298c.263.342.552.66.736 1 .606 1.108 1.395 2.057 2.132 3.058.632.87 1.21 1.818 1.79 2.714.71 1.08 1.394 2.16 2.105 3.24a81.41 81.41 0 0 0 1.63 2.426c.5.71 1.028 1.396 1.554 2.082.446.606.92 1.212 1.367 1.818.527.738 1.053 1.475 1.58 2.187.262.368.552.737.84 1.106.16.21.396.37.554.5-.025 0-.052 0-.104-.026.08.105.13.184.184.237.29.158.316.316.158.554zM74 46.854v-.185c0 .052.026.13 0 .184zm.895-11.62c-.027 0-.184-.16-.21-.186-.027.08 0 .158-.053.264-.027-.078-.21-.052-.21-.13-.027.368.157.737.13 1.106.08-.053.395-.08.474-.158.027.026.08.052.106.052-.527.396-.395.79-.158 1.24.052.104.21.315.052.526-.052.053.027.21.053.343h.077v.05l-.237.08c-.052-.08-.367-.236-.367-.37v1.346c.263.08.263.448.368.633a.768.768 0 0 0 .107-.21l.027.024c-.027.158-.053.316-.106.475-.052.236-.105.447-.13.684 0 .026.05.08.05.105-.288.66-.13 1.396-.235 2.08-.08.5 0 1.03-.053 1.556-.054.448-.16.922-.264 1.37-.027.08-.08.105-.21.158.052-.316.026-.527-.027-.817-.028 0-.37-.184-.397-.184 0 .37.21.87.29 1.29-.08-.026-.395-.21-.42-.21-.054.316-.054.738-.08 1.08-.027.264-.263.5-.29.79 0 .16.184.264.158.528h.21c0-.526.238-1 .238-1.554h.078c.027.053.106.106.08.132-.053.29-.16.606-.132.896 0 .158.13.316.08.5-.054.16-.08.317-.107.554-.027-.132-.053-.184-.053-.263-.026 0-.263-.027-.29-.027-.026.158.185.316.158.448-.026.026-.052.026-.105.053l-.868-1.266c-.686-1-1.37-2.003-2.054-3.03a6.312 6.312 0 0 1-.475-.79 37.09 37.09 0 0 0-2.71-4.033c-.762-.974-1.37-2.03-2.08-3.055-.656-.975-1.314-1.924-1.972-2.9-.237-.315-.526-.605-.737-.948-.683-1.08-1.29-2.187-1.972-3.267-.58-.897-1.21-1.767-1.816-2.636-.21-.29-.42-.607-.632-.923a.37.37 0 0 1-.052-.182c-.053-.58-.106-1.16-.132-1.713 0-.527.053-1.054.053-1.608v-.474c0-.132.025-.237.025-.37.025-.025.052-.078.078-.104-.763 0-1.553-.028-2.316 0-.5.025-.763-.186-1.105-.555-1-1.133-1.737-2.424-2.605-3.636a162.42 162.42 0 0 0-2.5-3.427c-.685-.922-1.37-1.818-2.053-2.74-.764-1.054-1.5-2.108-2.29-3.162a381.983 381.983 0 0 0-2.895-3.794c-.45-.58-.95-1.133-1.45-1.74.343.054.66.106.975.133l1.264.08c.947.077 1.894.13 2.84.26.79.107 1.58.265 2.396.396 1.738.29 3.448.765 5.106 1.318.974.316 1.92.738 2.87 1.133 2.13.87 4.157 1.924 6.157 3.03.63.343 1 .896 1.472 1.397.685.712 1.37 1.423 2.027 2.16.762.87 1.472 1.766 2.21 2.662.657.79 1.34 1.58 2 2.372.21.237.37.527.552.79.42.633.895 1.24 1.263 1.924.262.502.42 1.082.604 1.635.262.817.526 1.607.79 2.424.183.606.34 1.24.472 1.87.106.423.08.87.21 1.29.16.556 0 1.16.16 1.715.025.053.05.132.078.185.105.104.184.21.026.368-.025.026-.025.13 0 .21.054-.052.08-.105.133-.184 0 .053.025.08.025.105 0 .104-.027.21 0 .315 0 .052.052.13.078.184.053-.054.105-.08.21-.16.237.897.264 1.793.264 2.715 0 .87.157 1.74-.21 2.583.078-.29-.106-.555-.027-.818z"/><path d="M58.08 45.482c.025 0 .052.027.052.027l-.027-.03c0-.025 0-.025-.026 0zm4.157 26.036c-.29.21-.58.395-.948.474-.028-.026-.028-.053-.054-.08.29-.184.605-.368.895-.553.027.05.08.104.106.157zM12.895 35.81c.29-.367.58-.736.894-1.105.025.026.235.08.262.105-.29.37-.685.87-.974 1.265-.054-.053-.133-.237-.185-.264zM5.42 48.725c-.21-.448-.42-.923-.63-1.37a.91.91 0 0 1 .236-.106c.29.42.42.92.632 1.37 0 0-.21.105-.237.105zm6.712-12.65c-.158.238-.316.502-.474.74-.026-.028-.316.104-.342.078.158-.237.552-.66.71-.896.027.026.053.053.106.08zM59.422 72.6c.025 0 .025-.026.052-.026.184.026.394.052.605.052-.344.237-.555.21-.66-.026zm-47.24-35.418c.028-.08.08-.158.133-.237.052 0 .13-.027.13-.027.107-.184.107-.316.212-.474-.026-.026-.053-.026-.08-.053-.157.108-.315.24-.473.345.053.052.053.08.053.132-.21-.027-.29.08-.395.368-.026.08-.158.106-.29.21-.026.054-.052.186-.105.317l.027.028c-.053.053-.132.08-.132.08-.158.157-.342.29-.5.447-.026.08-.052.158-.052.237.185-.184.5-.527.737-.738l.027.027c.105-.158.184-.316.29-.474.025.026.025.052.052.08-.08.21-.158.446-.237.657-.055.026-.134.08-.134.053-.105.08-.184.184-.29.263l-.473.316c-.263.237-.526.447-.816.685-.184.29-.368.553-.58.896.317-.08.396.053.37.317.368.052.395-.237.5-.448.026-.054.053-.16.105-.186.237-.21.5-.394.763-.605.053-.053.053-.16.053-.238 0-.026-.133-.026-.212-.053.237-.264.58-.71.816-1 .132-.08.263-.186.263-.265-.026-.29.158-.368.37-.474-.106-.08-.133-.157-.133-.183z"/><path d="M12.71 36.892c-.105.184-.21.342-.315.527l-.158-.08c-.105.605-.474 1.132-.842 1.237.105.053.21.106.29.08.078-.027.13-.16.183-.238l.71-1.028.238-.396-.105-.105zM3.948 48.46c.132 0 .264.026.42.026 0-.105.133-.08.133-.184h.08c0 .132.026.237.026.37h-.552c-.027-.027-.132-.186-.106-.212zm-.21-1.212c-.08-.08-.21-.158-.21-.237-.027-.104.052-.235.13-.367.054.184.08.342.132.527-.027.025-.053.052-.053.078zm.658-1.687c.105.266.21.556.316.82a.798.798 0 0 0-.21.105c-.105-.264-.237-.554-.342-.817a.652.652 0 0 1 .237-.106zm58.58 25.194c.13-.052.288-.08.5-.13-.238.183-.422.315-.58.473-.027-.026-.053-.053-.08-.053.053-.105.106-.184.16-.29zM30.63 15.074c.157-.106.29-.185.447-.29l.052.052c-.16.21-.29.42-.475.685-.026-.183-.026-.29-.053-.42-.026 0 0 0 .027-.026zm7.71 13.333c.237-.106.474-.21.763-.343-.026.158-.026.264-.026.37a.927.927 0 0 0-.264-.054c-.158.027-.448.238-.58.264-.025 0 .106-.21.106-.237zm19.74 22.346c.052.263.552.395.052.658.08.055.157.08.236.134a.2.2 0 0 1-.052.106c-.053.025-.158.078-.21.05-.027 0-.08-.104-.08-.157 0-.237.027-.474.053-.79z"/></g></symbol><symbol viewBox="0 0 24 24" id="powerpoint" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5M8 11v2h1v6H8v1h4v-1h-1v-2h2a3 3 0 0 0 3-3 3 3 0 0 0-3-3H8m5 2a1 1 0 0 1 1 1 1 1 0 0 1-1 1h-2v-2h2z" fill="#d14524"/></symbol><symbol viewBox="0 0 67.47 70" id="powershell" xmlns="http://www.w3.org/2000/svg"><path d="M18.545 12.4c-3.014 0-6.08 2.34-6.873 5.248L1.91 53.438c-.793 2.908.996 5.248 4.01 5.248h42.887c3.014 0 6.08-2.34 6.873-5.248l9.761-35.79c.794-2.908-.993-5.248-4.007-5.248h-42.89zm4.848 6.243c.652.04 1.29.33 1.76.86l7.96 9.013-3.957 3.246 3.957-3.244 4.832 5.47c.037.042.06.088.094.131.026.034.057.06.082.096.02.028.032.057.05.086.057.087.105.176.15.267.028.06.055.117.08.178a2.546 2.546 0 0 1 .171.764c.005.073.01.146.008.219-.002.09-.01.178-.021.267a2.53 2.53 0 0 1-.036.217 2.56 2.56 0 0 1-.07.252c-.024.076-.048.15-.08.224a2.547 2.547 0 0 1-.111.22 2.503 2.503 0 0 1-.133.218 2.546 2.546 0 0 1-.147.187c-.058.07-.118.137-.185.202-.027.026-.048.057-.076.082-.037.032-.077.054-.116.084-.038.03-.07.065-.11.093L16.8 52.271a2.552 2.552 0 0 1-3.563-.626 2.553 2.553 0 0 1 .63-3.563l18.349-12.853-3.06-3.467-7.839-8.873a2.549 2.549 0 0 1 .225-3.608 2.546 2.546 0 0 1 1.85-.638zm22.441 28.214c1.377 0 2.255 1.083 1.969 2.43-.287 1.347-1.627 2.433-3.004 2.434l-9.957.006c-1.378 0-2.256-1.083-1.969-2.43.287-1.347 1.626-2.433 3.004-2.434l9.957-.006z" fill="#03a9f4" stroke-width="5.342" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 210 210" id="prettier" xmlns="http://www.w3.org/2000/svg"><title>prettier-icon-dark</title><g transform="matrix(.9 0 0 .9 10.5 10.5)" fill="none" fill-rule="evenodd"><rect fill="#56B3B4" x="165" y="40" width="20" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="200" width="60" height="10" rx="5"/><rect fill="#BF85BF" x="135" y="120" width="40" height="10" rx="5"/><rect fill="#EA5E5E" x="75" y="120" width="50" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="120" width="50" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="160" width="60" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="80" width="60" height="10" rx="5"/><rect fill="#F7BA3E" x="65" y="20" width="110" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="20" width="40" height="10" rx="5"/><rect fill="#F7BA3E" x="55" y="180" width="20" height="10" rx="5"/><rect fill="#56B3B4" x="55" y="60" width="20" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="180" width="30" height="10" rx="5"/><rect fill="#F7BA3E" x="15" y="60" width="30" height="10" rx="5"/><rect fill="#56B3B4" x="95" y="100" width="90" height="10" rx="5"/><rect fill="#F7BA3E" x="45" y="100" width="40" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="100" width="20" height="10" rx="5"/><rect fill="#BF85BF" x="105" y="40" width="50" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="40" width="80" height="10" rx="5"/><rect fill="#F7BA3E" x="45" y="140" width="100" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="140" width="20" height="10" rx="5"/><rect fill="#EA5E5E" x="135" y="60" width="60" height="10" rx="5"/><rect fill="#F7BA3E" x="135" y="80" width="60" height="10" rx="5"/><rect fill="#56B3B4" x="15" width="130" height="10" rx="5"/></g></symbol><symbol viewBox="0 0 80 80" id="protractor" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="hxa"><path transform="scale(1 -1)" fill="#564b55" stroke-width="27.224" d="M-2.983-69.251h69.412v67.108H-2.983z"/></clipPath></defs><g transform="matrix(1.13039 0 0 -1.13039 5.714 82.137)" clip-path="url(#hxa)"><g transform="scale(.1)"><path d="M1180.54 92.324c-5.53 0-9.93-1.797-13.23-5.39-3.29-3.614-5.22-8.594-5.81-14.97h36.02c0 6.583-1.47 11.622-4.4 15.126-2.93 3.496-7.12 5.234-12.58 5.234zm2.84-62.656c-10.19 0-18.22 3.086-24.11 9.297-5.88 6.21-8.83 14.824-8.83 25.84 0 11.101 2.73 19.922 8.21 26.464 5.45 6.524 12.81 9.805 22.02 9.805 8.63 0 15.46-2.851 20.48-8.523 5.03-5.676 7.55-13.157 7.55-22.461v-6.613h-47.45c.21-8.086 2.26-14.22 6.12-18.418 3.89-4.18 9.34-6.29 16.38-6.29 7.42 0 14.76 1.563 22 4.669V34.14c-3.68-1.602-7.18-2.746-10.48-3.438-3.28-.684-7.24-1.035-11.89-1.035M1272.34 30.918v44.57c0 5.606-1.28 9.805-3.82 12.559-2.56 2.773-6.56 4.16-12.02 4.16-7.2 0-12.49-1.953-15.84-5.851-3.34-3.895-5.03-10.32-5.03-19.286V30.918h-10.42v68.887h8.47l1.71-9.422h.5c2.14 3.387 5.14 6.023 8.99 7.887 3.85 1.867 8.15 2.804 12.88 2.804 8.29 0 14.54-2.011 18.73-6.015 4.19-3.985 6.28-10.391 6.28-19.192V30.918h-10.43M1328.96 38.406c7.1 0 12.27 1.938 15.48 5.813 3.22 3.879 4.81 10.129 4.81 18.758v2.199c0 9.765-1.62 16.726-4.87 20.898-3.25 4.18-8.44 6.25-15.56 6.25-6.11 0-10.79-2.383-14.04-7.129-3.26-4.746-4.88-11.472-4.88-20.136 0-8.797 1.61-15.45 4.84-19.93 3.23-4.484 7.97-6.723 14.22-6.723zm20.85 1.762h-.56c-4.83-7.004-12.02-10.5-21.62-10.5-9.01 0-16.03 3.066-21.04 9.238-5 6.153-7.5 14.922-7.5 26.27 0 11.355 2.51 20.176 7.54 26.465 5.03 6.289 12.03 9.433 21 9.433 9.34 0 16.5-3.398 21.49-10.195h.81l-.43 4.96-.25 4.845v28.039h10.43V30.918h-8.49l-1.38 9.25M1434.91 38.27c1.85 0 3.63.136 5.34.421 1.72.274 3.09.547 4.1.84v-7.976c-1.15-.559-2.81-.996-5.01-1.36-2.18-.351-4.17-.527-5.94-.527-13.32 0-19.97 7.012-19.97 21.055V91.71h-9.88v5.027l9.88 4.336 4.38 14.707h6.04V99.805h20V91.71h-20V51.16c0-4.15.98-7.333 2.96-9.56 1.97-2.206 4.67-3.331 8.1-3.331M1463.81 65.43c0-8.809 1.76-15.508 5.27-20.118 3.53-4.609 8.69-6.906 15.53-6.906s12.01 2.297 15.56 6.875c3.53 4.602 5.3 11.301 5.3 20.149 0 8.75-1.77 15.41-5.3 19.953-3.55 4.539-8.77 6.824-15.69 6.824-6.82 0-11.99-2.246-15.47-6.73-3.46-4.48-5.2-11.16-5.2-20.047zm52.47 0c0-11.23-2.83-20-8.48-26.309-5.66-6.309-13.47-9.453-23.44-9.453-6.17 0-11.64 1.445-16.42 4.336-4.78 2.89-8.46 7.031-11.06 12.45-2.59 5.401-3.88 11.73-3.88 18.976 0 11.23 2.8 19.968 8.41 26.242 5.61 6.258 13.4 9.402 23.38 9.402 9.64 0 17.3-3.222 22.97-9.62 5.69-6.415 8.52-15.087 8.52-26.024M1591.71 92.324c-5.54 0-9.94-1.797-13.23-5.39-3.3-3.614-5.24-8.594-5.81-14.97h36c0 6.583-1.46 11.622-4.39 15.126-2.93 3.496-7.13 5.234-12.57 5.234zm2.83-62.656c-10.19 0-18.22 3.086-24.11 9.297-5.89 6.21-8.83 14.824-8.83 25.84 0 11.101 2.74 19.922 8.2 26.464 5.46 6.524 12.81 9.805 22.04 9.805 8.62 0 15.45-2.851 20.48-8.523 5.03-5.676 7.54-13.157 7.54-22.461v-6.613h-47.45c.21-8.086 2.25-14.22 6.13-18.418 3.87-4.18 9.33-6.29 16.36-6.29 7.43 0 14.77 1.563 22.01 4.669V34.14c-3.69-1.602-7.17-2.746-10.46-3.438-3.3-.684-7.27-1.035-11.91-1.035M1683.5 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12.01 4.16-7.2 0-12.48-1.953-15.83-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.48l1.69-9.422h.51c2.14 3.387 5.14 6.023 8.99 7.887 3.84 1.867 8.15 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M1740.11 38.406c7.12 0 12.28 1.938 15.49 5.813 3.21 3.879 4.81 10.129 4.81 18.758v2.199c0 9.765-1.62 16.726-4.87 20.898-3.25 4.18-8.43 6.25-15.56 6.25-6.12 0-10.8-2.383-14.05-7.129-3.24-4.746-4.88-11.472-4.88-20.136 0-8.797 1.64-15.45 4.85-19.93 3.22-4.484 7.96-6.723 14.21-6.723zm20.87 1.762h-.57c-4.82-7.004-12.03-10.5-21.62-10.5-9.01 0-16.02 3.066-21.03 9.238-5 6.153-7.52 14.922-7.52 26.27 0 11.355 2.52 20.176 7.55 26.465 5.02 6.289 12.02 9.433 21 9.433 9.34 0 16.5-3.398 21.48-10.195h.83l-.44 4.96-.25 4.845v28.039h10.43V30.918h-8.49l-1.37 9.25M1846.07 38.27c1.85 0 3.64.136 5.36.421 1.7.274 3.07.547 4.08.84v-7.976c-1.13-.559-2.8-.996-5-1.36-2.2-.351-4.18-.527-5.94-.527-13.33 0-19.99 7.012-19.99 21.055V91.71h-9.86v5.027l9.86 4.336 4.4 14.707h6.04V99.805H1855V91.71h-19.98V51.16c0-4.15.98-7.333 2.95-9.56 1.97-2.206 4.68-3.331 8.1-3.331M1894.26 92.324c-5.53 0-9.94-1.797-13.22-5.39-3.31-3.614-5.25-8.594-5.83-14.97h36.01c0 6.583-1.45 11.622-4.38 15.126-2.95 3.496-7.13 5.234-12.58 5.234zm2.83-62.656c-10.19 0-18.22 3.086-24.1 9.297-5.9 6.21-8.84 14.824-8.84 25.84 0 11.101 2.73 19.922 8.2 26.464 5.47 6.524 12.81 9.805 22.03 9.805 8.63 0 15.46-2.851 20.49-8.523 5.03-5.676 7.55-13.157 7.55-22.461v-6.613h-47.46c.22-8.086 2.26-14.22 6.13-18.418 3.87-4.18 9.33-6.29 16.37-6.29 7.42 0 14.75 1.563 22 4.669V34.14c-3.7-1.602-7.17-2.746-10.47-3.438-3.28-.684-7.25-1.035-11.9-1.035M1983.36 49.727c0-6.426-2.4-11.368-7.18-14.844-4.77-3.477-11.47-5.215-20.11-5.215-9.13 0-16.26 1.445-21.37 4.336v9.687a51.32 51.32 0 0 1 10.65-3.964c3.79-.977 7.45-1.457 10.97-1.457 5.46 0 9.64.87 12.57 2.609 2.95 1.738 4.41 4.394 4.41 7.95 0 2.694-1.17 4.98-3.5 6.894-2.32 1.914-6.85 4.152-13.6 6.757-6.41 2.383-10.97 4.473-13.67 6.25-2.71 1.778-4.72 3.81-6.04 6.067-1.31 2.254-1.98 4.96-1.98 8.113 0 5.606 2.29 10.04 6.86 13.281 4.57 3.25 10.84 4.883 18.79 4.883 7.42 0 14.66-1.515 21.74-4.531l-3.71-8.496c-6.9 2.851-13.17 4.277-18.79 4.277-4.94 0-8.67-.77-11.18-2.324-2.52-1.543-3.78-3.691-3.78-6.406 0-1.844.48-3.418 1.42-4.707.95-1.309 2.46-2.54 4.56-3.711 2.09-1.184 6.11-2.871 12.07-5.086 8.16-2.98 13.69-5.98 16.55-8.996 2.87-3.02 4.32-6.809 4.32-11.367M2021.28 38.27c1.85 0 3.64.136 5.35.421 1.71.274 3.09.547 4.09.84v-7.976c-1.14-.559-2.81-.996-5.01-1.36-2.18-.351-4.18-.527-5.93-.527-13.33 0-19.99 7.012-19.99 21.055V91.71h-9.87v5.027l9.87 4.336 4.4 14.707h6.02V99.805h20V91.71h-20V51.16c0-4.15 1-7.333 2.97-9.56 1.98-2.206 4.67-3.331 8.1-3.331M2053.61 30.918h-10.42v68.887h10.42zm-11.31 87.559c0 2.39.59 4.14 1.76 5.253 1.18 1.106 2.65 1.661 4.42 1.661 1.67 0 3.1-.567 4.32-1.7 1.22-1.132 1.82-2.871 1.82-5.214 0-2.344-.6-4.09-1.82-5.247-1.22-1.16-2.65-1.726-4.32-1.726-1.77 0-3.24.566-4.42 1.726-1.17 1.157-1.76 2.903-1.76 5.247M2121.59 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12 4.16-7.21 0-12.49-1.953-15.84-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.49l1.69-9.422h.5c2.15 3.387 5.14 6.023 8.99 7.887 3.85 1.867 8.16 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M2159.29 77.742c0-4.812 1.35-8.465 4.08-10.926 2.72-2.48 6.51-3.71 11.37-3.71 10.19 0 15.28 4.953 15.28 14.831 0 10.344-5.16 15.532-15.47 15.532-4.9 0-8.67-1.32-11.31-3.965-2.63-2.649-3.95-6.555-3.95-11.762zm-5.67-58.387c0-3.73 1.58-6.55 4.72-8.488 3.14-1.922 7.65-2.879 13.52-2.879 8.75 0 15.24 1.309 19.45 3.926 4.21 2.617 6.31 6.172 6.31 10.652 0 3.723-1.15 6.32-3.45 7.754-2.31 1.457-6.65 2.168-13.01 2.168h-12.51c-4.74 0-8.43-1.12-11.06-3.386-2.65-2.266-3.97-5.508-3.97-9.747zm54.94 80.45v-6.582l-12.76-1.512c1.18-1.477 2.23-3.39 3.15-5.754.91-2.371 1.37-5.039 1.37-8.02 0-6.746-2.29-12.128-6.91-16.152-4.61-4.012-10.93-6.023-18.98-6.023-2.05 0-3.98.156-5.78.5-4.45-2.356-6.67-5.305-6.67-8.871 0-1.883.77-3.282 2.34-4.176 1.54-.902 4.21-1.36 7.97-1.36h12.2c7.46 0 13.19-1.574 17.19-4.707 4-3.144 6-7.714 6-13.71 0-7.618-3.06-13.426-9.17-17.43C2192.38 2.004 2183.46 0 2171.72 0c-9 0-15.95 1.68-20.82 5.027-4.88 3.352-7.34 8.079-7.34 14.211 0 4.18 1.35 7.813 4.03 10.88 2.68 3.046 6.45 5.116 11.32 6.21-1.77.8-3.24 2.031-4.44 3.711-1.19 1.68-1.78 3.633-1.78 5.84 0 2.52.66 4.707 2.01 6.602 1.34 1.882 3.44 3.71 6.34 5.468-3.56 1.465-6.46 3.953-8.71 7.48-2.23 3.516-3.35 7.54-3.35 12.06 0 7.55 2.26 13.37 6.79 17.452 4.52 4.082 10.93 6.133 19.22 6.133 3.6 0 6.86-.429 9.75-1.27h23.82M2284.61 91.71h-17.54V30.919h-10.43v60.793h-12.31v4.707l12.31 3.766v3.839c0 16.922 7.4 25.391 22.19 25.391 3.65 0 7.93-.73 12.82-2.195l-2.7-8.364c-4.03 1.301-7.46 1.946-10.31 1.946-3.93 0-6.85-1.309-8.73-3.926-1.89-2.617-2.84-6.816-2.84-12.598v-4.472h17.54V91.71M2302.87 65.43c0-8.809 1.76-15.508 5.28-20.118 3.52-4.609 8.7-6.906 15.52-6.906 6.84 0 12.02 2.297 15.57 6.875 3.54 4.602 5.3 11.301 5.3 20.149 0 8.75-1.76 15.41-5.3 19.953-3.55 4.539-8.78 6.824-15.69 6.824-6.83 0-11.99-2.246-15.46-6.73-3.48-4.48-5.22-11.16-5.22-20.047zm52.48 0c0-11.23-2.82-20-8.47-26.309-5.67-6.309-13.48-9.453-23.46-9.453-6.15 0-11.62 1.445-16.4 4.336-4.77 2.89-8.47 7.031-11.06 12.45-2.59 5.401-3.9 11.73-3.9 18.976 0 11.23 2.81 19.968 8.43 26.242 5.6 6.258 13.4 9.402 23.38 9.402 9.63 0 17.28-3.222 22.97-9.62 5.68-6.415 8.51-15.087 8.51-26.024M2403.79 101.074c3.07 0 5.8-.254 8.22-.761l-1.43-9.676c-2.86.633-5.37.933-7.55.933-5.58 0-10.33-2.261-14.3-6.785-3.95-4.531-5.94-10.156-5.94-16.902V30.918h-10.43v68.887h8.62l1.19-12.754h.5c2.56 4.48 5.63 7.949 9.23 10.37 3.61 2.423 7.56 3.653 11.89 3.653M2500.33 69.766l-10.68 28.476c-1.39 3.594-2.81 8.028-4.28 13.262-.93-4.024-2.24-8.438-3.96-13.262l-10.81-28.476zm14.77-38.848l-11.44 29.227h-36.83l-11.32-29.227h-10.81l36.34 92.273h8.98l36.13-92.273h-11.05M2583.07 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12 4.16-7.21 0-12.49-1.953-15.84-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.48l1.69-9.422h.51c2.14 3.387 5.14 6.023 8.99 7.887 3.84 1.867 8.15 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M2620.76 77.742c0-4.812 1.36-8.465 4.08-10.926 2.73-2.48 6.53-3.71 11.37-3.71 10.2 0 15.28 4.953 15.28 14.831 0 10.344-5.15 15.532-15.45 15.532-4.91 0-8.68-1.32-11.32-3.965-2.64-2.649-3.96-6.555-3.96-11.762zm-5.66-58.387c0-3.73 1.57-6.55 4.71-8.488 3.15-1.922 7.65-2.879 13.53-2.879 8.75 0 15.23 1.309 19.44 3.926 4.21 2.617 6.31 6.172 6.31 10.652 0 3.723-1.14 6.32-3.45 7.754-2.31 1.457-6.64 2.168-13 2.168h-12.51c-4.74 0-8.43-1.12-11.07-3.386-2.63-2.266-3.96-5.508-3.96-9.747zm54.94 80.45v-6.582l-12.76-1.512c1.18-1.477 2.22-3.39 3.14-5.754.92-2.371 1.38-5.039 1.38-8.02 0-6.746-2.3-12.128-6.92-16.152-4.61-4.012-10.92-6.023-18.97-6.023-2.05 0-3.99.156-5.78.5-4.46-2.356-6.67-5.305-6.67-8.871 0-1.883.78-3.282 2.33-4.176 1.55-.902 4.21-1.36 7.98-1.36h12.2c7.46 0 13.18-1.574 17.18-4.707 4.01-3.144 6-7.714 6-13.71 0-7.618-3.06-13.426-9.17-17.43C2653.87 2.004 2644.94 0 2633.2 0c-9 0-15.95 1.68-20.83 5.027-4.88 3.352-7.33 8.079-7.33 14.211 0 4.18 1.35 7.813 4.02 10.88 2.69 3.046 6.47 5.116 11.32 6.21-1.77.8-3.23 2.031-4.43 3.711-1.19 1.68-1.79 3.633-1.79 5.84 0 2.52.66 4.707 2.01 6.602 1.35 1.882 3.45 3.71 6.35 5.468-3.56 1.465-6.47 3.953-8.71 7.48-2.23 3.516-3.35 7.54-3.35 12.06 0 7.55 2.25 13.37 6.79 17.452 4.52 4.082 10.92 6.133 19.21 6.133 3.62 0 6.86-.429 9.75-1.27h23.83M2692.7 99.805V55.117c0-5.605 1.27-9.805 3.83-12.566 2.56-2.766 6.57-4.145 12.01-4.145 7.2 0 12.47 1.965 15.81 5.903 3.33 3.945 4.99 10.379 4.99 19.304v36.192h10.44V30.918h-8.62l-1.5 9.25h-.58c-2.13-3.41-5.1-5.988-8.88-7.793-3.8-1.809-8.13-2.707-12.99-2.707-8.37 0-14.65 1.992-18.81 5.977-4.18 3.964-6.26 10.351-6.26 19.101v45.059h10.56M2760.61 30.918h10.43v97.805h-10.43zM2810.67 38.27c6.5 0 11.6 1.789 15.31 5.343 3.71 3.575 5.56 8.555 5.56 14.961v6.23l-10.44-.448c-8.3-.286-14.27-1.583-17.94-3.868-3.66-2.273-5.5-5.82-5.5-10.644 0-3.781 1.14-6.64 3.42-8.613 2.29-1.973 5.48-2.961 9.59-2.961zm23.57-7.352l-2.07 9.805h-.51c-3.44-4.305-6.86-7.227-10.27-8.77-3.42-1.523-7.68-2.285-12.8-2.285-6.83 0-12.17 1.758-16.05 5.273-3.87 3.528-5.81 8.536-5.81 15.032 0 13.906 11.12 21.199 33.37 21.875l11.7.359v4.277c0 5.418-1.17 9.395-3.5 11.985-2.32 2.566-6.03 3.855-11.15 3.855-5.74 0-12.24-1.758-19.49-5.273l-3.21 7.988c3.4 1.836 7.11 3.281 11.16 4.324a47.81 47.81 0 0 0 12.16 1.575c8.23 0 14.3-1.817 18.27-5.461 3.96-3.66 5.93-9.5 5.93-17.54V30.919h-7.73M2893.6 101.074c3.07 0 5.8-.254 8.25-.761l-1.46-9.676c-2.84.633-5.35.933-7.54.933-5.56 0-10.33-2.261-14.3-6.785-3.96-4.531-5.93-10.156-5.93-16.902V30.918h-10.44v68.887h8.61l1.19-12.754h.5c2.57 4.48 5.65 7.949 9.25 10.37 3.6 2.423 7.56 3.653 11.87 3.653M2901.63 6.727c-3.94 0-7.04.558-9.31 1.691v9.121c2.97-.84 6.08-1.25 9.31-1.25 4.14 0 7.3 1.25 9.45 3.77 2.16 2.507 3.24 6.132 3.24 10.859v91.895h10.69V31.797c0-7.95-2.01-14.121-6.04-18.496-4.02-4.383-9.8-6.574-17.34-6.574M2999.96 55.371c0-8.086-2.93-14.394-8.8-18.918-5.87-4.52-13.83-6.785-23.88-6.785-10.9 0-19.27 1.406-25.14 4.219v10.3c3.77-1.59 7.88-2.847 12.31-3.765 4.45-.93 8.85-1.399 13.21-1.399 7.12 0 12.49 1.36 16.09 4.063 3.59 2.695 5.4 6.465 5.4 11.277 0 3.196-.63 5.805-1.91 7.832-1.29 2.024-3.42 3.907-6.42 5.625-2.99 1.711-7.56 3.664-13.67 5.84-8.55 3.059-14.66 6.692-18.32 10.871-3.66 4.2-5.51 9.668-5.51 16.407 0 7.089 2.68 12.714 7.99 16.914 5.32 4.191 12.36 6.289 21.12 6.289 9.13 0 17.54-1.68 25.2-5.032l-3.32-9.304c-7.59 3.183-14.96 4.785-22.13 4.785-5.66 0-10.07-1.223-13.26-3.652-3.19-2.43-4.78-5.809-4.78-10.118 0-3.191.59-5.8 1.76-7.832 1.17-2.031 3.14-3.886 5.95-5.597 2.78-1.688 7.04-3.563 12.79-5.625 9.63-3.426 16.26-7.118 19.89-11.063 3.62-3.937 5.43-9.043 5.43-15.332M741.648 375.406h30c28.965 0 50.227 5.039 63.774 15.117 13.531 10.079 20.32 25.821 20.32 47.247 0 19.832-6.074 34.628-18.191 44.402-12.141 9.758-31.028 14.641-56.692 14.641h-39.211zm172.192 64.246c0-36.062-11.809-63.691-35.434-82.898-23.621-19.219-57.234-28.82-100.847-28.82h-35.911V198.73h-56.445v345.329h99.438c43.14 0 75.457-8.829 96.961-26.465 21.496-17.637 32.238-43.614 32.238-77.942M1099.26 464.691c11.17 0 20.39-.789 27.63-2.371l-5.43-51.718c-7.88 1.894-16.07 2.832-24.57 2.832-22.2 0-40.19-7.246-53.97-21.731-13.78-14.48-20.66-33.301-20.66-56.453V198.73h-55.514v261.227h43.464l7.32-46.055h2.83c8.66 15.594 19.96 27.95 33.9 37.09 13.93 9.141 28.93 13.699 45 13.699M1206.88 329.82c0-60.308 22.28-90.465 66.85-90.465 44.08 0 66.13 30.157 66.13 90.465 0 59.688-22.21 89.512-66.61 89.512-23.31 0-40.2-7.707-50.67-23.144-10.47-15.43-15.7-37.54-15.7-66.368zm190.13 0c0-42.672-10.95-75.972-32.83-99.898-21.89-23.945-52.35-35.918-91.41-35.918-24.41 0-45.97 5.508-64.7 16.543-18.75 11.016-33.16 26.836-43.23 47.48-10.08 20.625-15.11 44.551-15.11 71.793 0 42.364 10.86 75.43 32.58 99.2 21.73 23.777 52.36 35.671 91.89 35.671 37.79 0 67.7-12.156 89.75-36.492 22.05-24.328 33.06-57.121 33.06-98.379M1558.11 238.887c13.54 0 27.07 2.129 40.62 6.386v-41.816c-6.13-2.676-14.05-4.922-23.73-6.738-9.69-1.797-19.73-2.715-30.12-2.715-52.59 0-78.88 27.715-78.88 83.144v140.778h-35.68v24.558l38.26 20.325 18.9 55.261h34.26v-58.113h74.39v-42.031h-74.39v-139.84c0-13.379 3.34-23.242 10.03-29.629 6.69-6.387 15.48-9.57 26.34-9.57M1783.44 464.691c11.17 0 20.38-.789 27.62-2.371l-5.43-51.718c-7.88 1.894-16.06 2.832-24.56 2.832-22.2 0-40.2-7.246-53.97-21.731-13.78-14.48-20.66-33.301-20.66-56.453V198.73h-55.52v261.227h43.46l7.34-46.055h2.82c8.66 15.594 19.95 27.95 33.9 37.09 13.92 9.141 28.93 13.699 45 13.699M1925.05 236.523c20.15 0 36.32 5.625 48.52 16.895 12.21 11.25 18.31 27.051 18.31 47.344v22.676l-33.54-1.407c-26.13-.937-45.16-5.312-57.04-13.105-11.89-7.793-17.82-19.727-17.82-35.781 0-11.661 3.45-20.665 10.39-27.051 6.91-6.387 17.32-9.571 31.18-9.571zm82.66-37.793l-11.11 36.387h-1.87c-12.62-15.918-25.29-26.738-38.04-32.48-12.74-5.742-29.13-8.633-49.13-8.633-25.67 0-45.7 6.934-60.1 20.801-14.41 13.847-21.62 33.457-21.62 58.808 0 26.934 10 47.246 30 60.934 19.99 13.691 50.45 21.172 91.41 22.441l45.09 1.414v13.938c0 16.699-3.88 29.16-11.68 37.441-7.79 8.262-19.88 12.383-36.25 12.383-13.39 0-26.23-1.953-38.5-5.891a294.638 294.638 0 0 1-35.44-13.933l-17.94 39.668c14.17 7.41 29.68 13.035 46.52 16.894 16.85 3.868 32.77 5.789 47.72 5.789 33.22 0 58.31-7.246 75.22-21.726 16.94-14.492 25.4-37.246 25.4-68.262V198.73h-39.68M2220.04 194.004c-39.52 0-69.55 11.543-90.1 34.609-20.55 23.067-30.82 56.172-30.82 99.321 0 43.925 10.74 77.707 32.23 101.339 21.5 23.614 52.56 35.418 93.18 35.418 27.56 0 52.35-5.117 74.41-15.359l-16.78-44.641c-23.46 9.133-42.82 13.704-58.1 13.704-45.19 0-67.79-29.993-67.79-89.981 0-29.293 5.63-51.305 16.89-66.031 11.26-14.707 27.76-22.09 49.48-22.09 24.72 0 48.11 6.152 70.15 18.437v-48.417c-9.92-5.84-20.5-10-31.76-12.52-11.26-2.52-24.93-3.789-40.99-3.789M2451.52 238.887c13.54 0 27.08 2.129 40.63 6.386v-41.816c-6.15-2.676-14.05-4.922-23.73-6.738-9.69-1.797-19.73-2.715-30.12-2.715-52.6 0-78.9 27.715-78.9 83.144v140.778h-35.66v24.558l38.26 20.325 18.9 55.261h34.26v-58.113h74.39v-42.031h-74.39v-139.84c0-13.379 3.34-23.242 10.03-29.629 6.69-6.387 15.47-9.57 26.33-9.57M2585.92 329.82c0-60.308 22.28-90.465 66.84-90.465 44.09 0 66.15 30.157 66.15 90.465 0 59.688-22.22 89.512-66.62 89.512-23.31 0-40.2-7.707-50.67-23.144-10.47-15.43-15.7-37.54-15.7-66.368zm190.13 0c0-42.672-10.94-75.972-32.83-99.898-21.89-23.945-52.36-35.918-91.4-35.918-24.42 0-45.98 5.508-64.72 16.543-18.74 11.016-33.14 26.836-43.22 47.48-10.07 20.625-15.12 44.551-15.12 71.793 0 42.364 10.87 75.43 32.59 99.2 21.74 23.777 52.36 35.671 91.89 35.671 37.79 0 67.7-12.156 89.75-36.492 22.04-24.328 33.06-57.121 33.06-98.379M2972.33 464.691c11.18 0 20.38-.789 27.63-2.371l-5.43-51.718c-7.87 1.894-16.05 2.832-24.57 2.832-22.2 0-40.19-7.246-53.96-21.731-13.78-14.48-20.67-33.301-20.67-56.453V198.73h-55.51v261.227h43.46l7.33-46.055h2.83c8.66 15.594 19.96 27.95 33.89 37.09 13.94 9.141 28.94 13.699 45 13.699" fill="#100f0d"/><path d="M610.11 372.83c0-170.584-138.257-308.862-308.846-308.862-170.602 0-308.846 138.278-308.846 308.863 0 170.576 138.244 308.846 308.846 308.846 170.59 0 308.846-138.27 308.846-308.846" fill="#e53935" stroke-width="1.029"/><path d="M460.694 521.792l-105.04.958-61.415 61.415-72.096-47.883 12.445-12.438-29.207.26-99.129-166.817H67.357l24.39-24.402-24.57-41.363L294.66 64.049c2.192-.04 4.399-.08 6.603-.08 170.416 0 308.585 138.055 308.846 308.408L460.694 521.792" fill="#d51c2f" stroke-width="1.029"/><path d="M149.093 350.258c0 84.048 68.13 152.151 152.171 152.151 84.028 0 152.139-68.103 152.139-152.151zm342.063-7.017v14.046h44.015c-1.75 59.337-25.556 113.104-63.54 153.419L438.75 477.81l-9.925 9.94 32.875 32.887c-40.314 37.983-94.081 61.79-153.41 63.527l-.015-44.003h-14.035v44.003c-59.34-1.737-113.096-25.556-153.41-63.527l32.887-32.887-9.945-9.92-32.883 32.875c-37.975-40.315-61.781-94.082-63.53-153.419h44.002l-.008-14.034H67.176v-51.511h468.176v51.5h-44.196" fill="#f5f5f5" stroke-width="1.029"/></g></g></symbol><symbol id="pug" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#c1272d}.hyst1{fill:#efcca3}.st2{fill:#ed1c24}.hyst3{fill:#ccac8d}.hyst4{fill:#fff}.st5{fill:#ff931e}.st6{fill:#ffb81e}.hyst7{fill:#56332b}.hyst8{fill:#442823}.hyst9{fill:#7f4a41}.hyst10{fill:#331712}.st11{fill:#fc6}.st12{fill:#ccc}.st13{fill:#b3b3b3}.st14{fill:#989898}.st15{fill:#323232}.st16{fill:#1e1e1e}.st17{fill:#4c4c4c}.st18{fill:#e6e6e6}.st19{fill:#606060}</style><path class="hyst1" d="M107.4 50.9c-.2-4.4.4-8.3-1.6-11.6-4.8-8.2-16.8-13-40.8-13v.7h-.5.5v-.7c-24 0-36.6 4.8-41.4 13.1-1.9 3.4-1.7 7.2-2 11.6-.2 3.5-1.8 7.2-1.1 11.2.8 5.2 1.1 10.4 1.9 15.2.6 3.9 6 7.2 6.5 10.9 1.4 10.2 12 14.9 36 14.9v.8h-.6.7v-.8c24 0 34.2-4.7 35.5-14.9.5-3.8 5.5-7 6.1-10.9.8-4.8 1.1-10 1.9-15.2.7-4-.9-7.8-1.1-11.3z"/><path class="hyst3" d="M64.6 54.5c4.3.1 7.3 2.8 10.1 5.3 3.3 2.9 8.9 4.9 11.2 7.4 2.3 2.5 5.3 5 6.4 8.9 1.1 3.9 1.4 8.9 1.4 10.2 0 1.3.7 1 2.7 0 4.7-2.3 9.9-8.5 9.9-8.5-.6 3.9-5.7 7.4-6.2 11.1C98.9 99.1 89 104 64.5 104h-.1.6"/><path class="hyst3" d="M80.4 46.7c.9 3.1 4.1 13.6-2.1 10.1 0 0 2.6 1.5 4.2 7.2 1.7 5.7 5.8 6.4 5.8 6.4s6.7 1.3 11.7-3c4.2-3.6 4.9-10 3.1-14.9-1.8-4.8-5-6.3-9.7-7.3-4.7-1.1-14.1-2-13 1.5z"/><circle cx="92.3" cy="58.1" r="8.8"/><circle class="hyst4" cx="90" cy="54.2" r="2.3"/><path class="hyst1" d="M78.9 57.7s7.9 5.4 12.2 10.7c4.3 5.3 4.2 6.3 4.2 6.3l-3.1 1.4s-4.4-8.3-9.8-11.4c-5.5-3.1-6.1-5.7-6.1-5.7l2.6-1.3z"/><path class="hyst3" d="M64.9 54.5c-4.3.1-7.5 2.8-10.4 5.3-3.3 2.9-9.1 4.9-11.4 7.4-2.3 2.5-5.4 5-6.5 8.9-1.1 3.9-1.5 8.9-1.5 10.2 0 1.3.2 1.4-2.7 0-4.7-2.2-9.9-8.5-9.9-8.5.6 3.9 5.7 7.4 6.2 11.1C30.1 99.1 40 104 64.5 104h.5"/><path class="hyst7" d="M88.1 71.4C83.3 65.5 75.6 60 64.9 60h-.1c-10.7 0-18.4 5.5-23.2 11.4-5 6.1-4.6 8.5-4.6 14.3 0 21 7.4 15 12.3 17.6 5 2.5 10.2 1.7 15.5 1.7h.1c5.4 0 10.5.7 15.5-1.8 4.9-2.5 12.3 3.7 12.3-17.3.1-5.8.4-8.4-4.6-14.5z"/><path class="hyst8" d="M64.4 65.2s-.7 9.7-2.1 11.6l2.6-.6-.5-11z"/><path class="hyst8" d="M65.1 65.2s.7 9.7 2.1 11.6l-2.6-.6.5-11z"/><path class="hyst7" d="M56.7 62.9c-1-2.3 2.6-6 8.3-6.1 5.7 0 9.3 3.7 8.3 6.1-1 2.4-4.6 3.1-8.3 3.2-3.6-.1-7.3-.8-8.3-3.2z"/><path d="M65 65.2c0-.4 3.4-.5 5.2-1.7 0 0-3.7 1.2-4.5.7-.8-.4-1-1.6-1-1.6s-.3 1.2-.9 1.6c-.7.4-4.9-.7-4.9-.7s5.6 1.4 5.6 1.7c0 .3-.1 1.3-.1 2 0 2.5 0 8.7.4 9.2.6.9.4-6.7.4-9.2-.1-.8-.1-1.6-.2-2z"/><path class="hyst9" d="M65.2 78.6c1.7 0 4.7 1.2 7.4 3.1-2.6-2.9-5.7-4.9-7.4-4.9-1.8 0-5.6 2.2-8.3 5.4 2.8-2.2 6.4-3.6 8.3-3.6z"/><path class="hyst8" d="M64.5 96.3c-3.8 0-7.5-1.2-10.9-2.1-.7-.2-1.4.3-2.1.1-6.3-2-11.4-5.4-14.5-9.7v1c0 21 7.4 15.1 12.3 17.6 5 2.5 10.2 1.7 15.5 1.7h.1c5.4 0 10.5.7 15.5-1.8 4.9-2.5 12.3 3.6 12.3-17.4 0-.8 0-1.6.1-2.3-2.9 4.7-8.2 8.4-14.8 10.6-.6.2-2-.3-2.6-.2-3.6 1.2-6.8 2.5-10.9 2.5z"/><path class="hyst8" d="M55 85s-2.5 7.5-.8 10.8l-2.3-1s1.7-7.6 3.1-9.8zM74.8 85s2.5 7.5.8 10.8l2.3-1s-1.8-7.6-3.1-9.8z"/><path class="hyst3" d="M48.6 46.7c-.9 3.1-4.1 13.6 2.1 10.1 0 0-2.6 1.5-4.2 7.2s-5.8 6.4-5.8 6.4-6.7 1.3-11.7-3c-4.2-3.6-4.9-10-3.1-14.9s5-6.3 9.7-7.3c4.7-1.1 14-2 13 1.5z"/><path d="M64.9 76.8c2.7 0 11.1 5.8 11.2 12.9v-.4c0-7.4-6.8-13.3-11.2-13.3-4.4 0-11.2 6-11.2 13.3v.4c.1-7.1 8.5-12.9 11.2-12.9z"/><ellipse transform="rotate(-14.465 66.712 61.468)" class="hyst10" cx="66.7" cy="61.5" rx=".8" ry="1.5"/><ellipse transform="rotate(17.235 62.371 61.462)" class="hyst10" cx="62.4" cy="61.5" rx=".8" ry="1.5"/><circle cx="37.2" cy="58.1" r="8.8"/><circle class="hyst4" cx="39.5" cy="54.2" r="2.3"/><path class="hyst9" d="M67.5 58.2c0-.1-2.3 1-2.9 1.1-.6-.1-2.9-1.2-2.9-1.1h5.8z"/><path class="hyst1" d="M50 57.7s-7.9 5.4-12.2 10.7c-4.3 5.3-4.2 6.3-4.2 6.3l3.1 1.4s4.4-8.3 9.8-11.4 6.1-5.7 6.1-5.7L50 57.7z"/><path class="hyst3" d="M32.7 41.7S30 49.1 24 52.2c0 0 9.4-1.1 8.7-10.5zM95.8 41.7s2.7 7.4 8.7 10.5c0 0-9.4-1.1-8.7-10.5zM78.7 55.5s-5.9-6.2-13.8-6.4h.1.1c-8 .2-13.8 6.4-13.8 6.4 6.9-4.8 12.8-4.7 13.8-4.7-.1 0 6.7-.1 13.6 4.7zM71.8 42.5s-3-4.2-7-4.3h.2c-3 .1-6.9 4.3-6.9 4.3 3.4-3.3 6.9-3.2 6.9-3.2s3.3-.1 6.8 3.2zM37.2 73.2s-4.7 2.3-8.1.9H29c-3-1.7-4.5-6.8-4.5-6.8s3 9 12.7 5.9zM92 73.2s4.7 2.3 8.1.9c4-1.7 4.6-6.8 4.6-6.8s-3 9-12.7 5.9z"/><path class="hyst3" d="M42.6 41.2c2.6-.5 6.9-.6 10.3.5 4.3 1.5.8 7 1.7 7.3.9.3 2.1-3.8 10.1-3.4 8.1.4 9 4 10.1 3.4s-1.1-10 11-7.8c0 0-12.7-3.4-12.1 5.8 0 0-7.3-5.6-17.5-.6.1 0 2.7-8.6-13.6-5.2zM86.9 41.2c.2 0 .3.1.4.1.1 0-.1-.1-.4-.1zM86.9 41.2zM39.1 28.9S28.3 42.5 26.7 47.7c-1.6 5.3-2.8 27-4.2 30.1l-5-21.4 9.2-22.3 12.4-5.2zM89.9 28.9s10.8 13.6 12.4 18.8c1.6 5.3 2.8 27 4.2 30.1l5-21.4-9.2-22.3-12.4-5.2z"/><path class="hyst7" d="M89.4 28.9s11.6 9.7 15 20.9c3.4 11.2 2 24.8 4.6 26.5 3.7 2.4 7.9-11.9 9.3-13.4 2.2-2.4 9.5-8.5 10-9.6.5-1.1-14.8-17.8-21.5-21.1-8.1-3.8-18.1-4.1-17.4-3.3z"/><path class="hyst8" d="M99.3 34.9s13.7 17.5 13.5 39.3l5.5-11.2c-.1 0-4.9-14.3-19-28.1z"/><path class="hyst7" d="M39.1 28.9s-11.6 9.7-15 20.9-2 24.8-4.6 26.5c-3.7 2.4-7.9-11.9-9.3-13.4C8 60.5.7 54.4.2 53.3-.3 52.2 15 35.5 21.7 32.2c8.1-3.8 18.1-4.1 17.4-3.3z"/><path class="hyst8" d="M29.2 34.9S15.5 52.4 15.7 74.2L10.3 63s4.8-14.3 18.9-28.1z"/><path class="hyst3" d="M21.8 74.6s1 5.4 2.6 7.1.5-1.3.5-1.3-1.7-.9-1.4-7.8-1.7 2-1.7 2zM107.1 74.6s-1 5.4-2.6 7.1-.5-1.3-.5-1.3 1.7-.9 1.4-7.8 1.7 2 1.7 2z"/><g><circle class="hyst8" cx="54.5" cy="70.5" r=".8"/><circle class="hyst8" cx="49.9" cy="75.3" r=".8"/><circle class="hyst8" cx="48.4" cy="70.5" r=".8"/></g><g><circle class="hyst8" cx="74" cy="70.5" r=".8"/><circle class="hyst8" cx="78.6" cy="75.3" r=".8"/><circle class="hyst8" cx="80.1" cy="70.5" r=".8"/></g></symbol><symbol viewBox="0 0 50 50" id="puppet" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -247)" fill="#fbc02d"><path stroke-width=".283" d="M11.559 249.467h13.587v13.587H11.559zM27.435 265.056h13.587v13.587H27.435zM11.559 281.074h13.587v13.587H11.559z"/><path stroke-width=".256" d="M16.62 251.615l18.305 18.305-3.236 3.236-18.305-18.305z"/><path stroke-width=".256" d="M37.834 271.331L19.53 289.636l-3.237-3.237 18.305-18.304z"/></g></symbol><symbol viewBox="0 0 100 99.999997" id="purescript" xmlns="http://www.w3.org/2000/svg"><path clip-path="url(#SVGID_2_)" d="M98.079 38.548L79.22 19.68l-5.087 5.088L90.447 41.09 74.134 57.41l5.087 5.087 18.858-18.86a3.59 3.59 0 0 0 1.055-2.55 3.578 3.578 0 0 0-1.055-2.54M25.483 42.794l-5.09-5.089L1.53 56.568a3.566 3.566 0 0 0-1.05 2.545c0 .961.373 1.863 1.05 2.542L20.394 80.52l5.089-5.086L9.162 59.113z" fill="#42a5f5" stroke-width="1.192"/><path clip-path="url(#SVGID_2_)" transform="matrix(1.19175 0 0 1.19175 -306.84 -629.047)" fill="#42a5f5" d="M281.841 551.736l6.461 6.037h28.379l-6.461-6.037zM288.302 566.861l-6.463 6.035h28.381l6.463-6.035zM281.838 581.982l6.464 6.035h28.381l-6.463-6.035z"/></symbol><symbol viewBox="0 0 24 24" id="python" xmlns="http://www.w3.org/2000/svg"><path d="M19.14 7.5A2.86 2.86 0 0 1 22 10.36v3.78A2.86 2.86 0 0 1 19.14 17H12c0 .39.32.96.71.96H17v1.68a2.86 2.86 0 0 1-2.86 2.86H9.86A2.86 2.86 0 0 1 7 19.64v-3.75a2.85 2.85 0 0 1 2.86-2.85h5.25a2.85 2.85 0 0 0 2.85-2.86V7.5h1.18m-4.28 11.79c-.4 0-.72.3-.72.89 0 .59.32.71.72.71a.71.71 0 0 0 .71-.71c0-.59-.32-.89-.71-.89m-10-1.79A2.86 2.86 0 0 1 2 14.64v-3.78A2.86 2.86 0 0 1 4.86 8H12c0-.39-.32-.96-.71-.96H7V5.36A2.86 2.86 0 0 1 9.86 2.5h4.28A2.86 2.86 0 0 1 17 5.36v3.75a2.85 2.85 0 0 1-2.86 2.85H8.89a2.85 2.85 0 0 0-2.85 2.86v2.68H4.86M9.14 5.71c.4 0 .72-.3.72-.89 0-.59-.32-.71-.72-.71-.39 0-.71.12-.71.71s.32.89.71.89z"/><path d="M9.264 22.379c-.895-.24-1.581-.799-1.947-1.582-.228-.489-.237-.606-.238-2.957-.001-2.745.057-3.074.666-3.785.193-.226.568-.517.833-.648.47-.23.579-.239 3.839-.288 3.131-.048 3.386-.065 3.814-.264.626-.291 1.07-.687 1.4-1.247.27-.46.278-.522.311-2.29l.034-1.82.932.051c1.075.058 1.504.211 2.098.748.853.77.869.841.869 3.957 0 2.434-.02 2.783-.18 3.075a3.365 3.365 0 0 1-1.337 1.33l-.517.273-3.95.031-3.951.031.068.274c.037.151.164.377.282.503.209.224.262.229 2.433.229h2.22v1.05c0 1.653-.394 2.437-1.54 3.072l-.545.302-2.644.018c-1.455.01-2.782-.018-2.95-.063zm6.12-1.692c.22-.222.253-.325.206-.675-.07-.523-.278-.73-.732-.73-.467 0-.672.217-.735.78-.042.372-.012.496.163.672.3.3.77.28 1.097-.047z" fill="#fc0" stroke="#fc0" stroke-width=".102"/><path d="M9.349 22.38c-.911-.15-1.936-1.074-2.176-1.963-.073-.273-.101-1.279-.079-2.868.033-2.317.047-2.473.27-2.926.13-.263.401-.623.603-.8.674-.592.87-.63 3.484-.675 4.399-.076 4.927-.166 5.705-.967.642-.662.706-.9.774-2.883l.061-1.784.951.055c.523.031 1.11.122 1.304.204.54.225 1.358 1.042 1.472 1.47.153.572.243 3.18.16 4.617-.071 1.23-.093 1.327-.395 1.78-.193.288-.577.647-.966.903l-.647.425-3.922.008c-2.157.004-3.942.028-3.966.052-.115.115.354.82.587.883.14.038 1.181.073 2.314.079l2.06.01v.91c0 1.739-.326 2.446-1.454 3.162l-.631.4-2.543-.011c-1.398-.007-2.733-.043-2.966-.081zm5.98-1.718c.285-.256.313-.328.251-.658-.09-.483-.301-.682-.722-.682-.436 0-.625.193-.715.73-.065.384-.044.453.2.663.358.308.595.295.985-.053z" fill="#fdd835" stroke-width=".102"/><path d="M4.281 17.396c-.88-.215-1.714-.935-2.024-1.747-.149-.389-.168-.804-.142-3.041.027-2.26.054-2.638.215-2.962.259-.519.851-1.092 1.392-1.346.437-.206.632-.217 4.408-.245l3.95-.03-.067-.275a1.367 1.367 0 0 0-.282-.504c-.21-.224-.263-.23-2.433-.23h-2.22l.002-1.143c.003-1.338.157-1.795.84-2.493.746-.763 1.103-.838 4.025-.838 2.961 0 3.28.06 4.067.768.37.333.572.621.728 1.037.201.539.213.735.183 3.072-.035 2.777-.045 2.824-.78 3.598-.787.829-.76.824-4.59.883-3.812.06-3.797.057-4.61.806-.765.706-.917 1.2-.964 3.133l-.04 1.653-.677-.01c-.371-.007-.813-.045-.98-.086zM9.59 5.551c.237-.204.286-.326.286-.72 0-.547-.201-.763-.71-.763-.502 0-.765.248-.765.724 0 .492.141.782.439.902.345.14.444.12.75-.143z" fill="#3c78aa"/></symbol><symbol viewBox="0 0 24 24" id="r" xmlns="http://www.w3.org/2000/svg"><path d="M11.956 4.05c-5.694 0-10.354 3.106-10.354 6.947 0 3.396 3.686 6.212 8.531 6.813v2.205h3.53V17.82c.88-.093 1.699-.259 2.475-.497l1.43 2.692h3.996l-2.402-4.048c1.936-1.263 3.147-3.034 3.147-4.97 0-3.841-4.659-6.947-10.354-6.947m1.584 2.712c4.349 0 7.558 1.45 7.558 4.753 0 1.77-.952 3.013-2.505 3.779a1.081 1.081 0 0 1-.228-.156c-.373-.165-.994-.352-.994-.352s3.085-.227 3.085-3.302-3.23-3.127-3.23-3.127h-7.092v7.413c-2.64-.766-4.462-2.392-4.462-4.255 0-2.63 3.52-4.753 7.868-4.753m.156 4.12h2.143s.983-.05.983.974c0 1.004-.983 1.004-.983 1.004h-2.143v-1.977m-.031 4.566h.952c.186 0 .28.052.445.207.135.103.28.3.404.476-.57.073-1.17.104-1.801.104z" fill="#1976d2" stroke-width="1.035"/></symbol><symbol viewBox="0 0 24 24" id="raml" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="razor" xmlns="http://www.w3.org/2000/svg"><path d="M15.45 11.91c-.11-2.21-1.75-3.54-3.73-3.54h-.08c-2.29 0-3.55 1.8-3.55 3.84 0 2.29 1.53 3.74 3.54 3.74 2.25 0 3.72-1.65 3.83-3.59m-3.81-5.97c1.53 0 2.97.68 4.02 1.74 0-.51.33-.89.83-.89h.11c.74 0 .89.7.89.92v7.9c-.04.52.54.78.87.44 1.27-1.29 2.78-6.69-.79-9.81-3.33-2.92-7.8-2.44-10.18-.8-2.52 1.74-4.14 5.61-2.57 9.22 1.71 3.95 6.61 5.13 9.52 3.95 1.48-.59 2.15 1.4.65 2.05-2.34.99-8.77.89-11.78-4.32-2.03-3.52-1.93-9.71 3.46-12.92C10.81 1.42 16.24 2.1 19.5 5.5c3.45 3.6 3.25 10.3-.1 12.91-1.51 1.18-3.76.03-3.74-1.7l-.02-.56a5.611 5.611 0 0 1-3.99 1.66C8.63 17.81 6 15.15 6 12.13c0-3.05 2.63-5.74 5.65-5.74z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="react" xmlns="http://www.w3.org/2000/svg"><path d="M12 10.11c1.03 0 1.87.84 1.87 1.89 0 1-.84 1.85-1.87 1.85-1.03 0-1.87-.85-1.87-1.85 0-1.05.84-1.89 1.87-1.89M7.37 20c.63.38 2.01-.2 3.6-1.7-.52-.59-1.03-1.23-1.51-1.9a22.7 22.7 0 0 1-2.4-.36c-.51 2.14-.32 3.61.31 3.96m.71-5.74l-.29-.51c-.11.29-.22.58-.29.86.27.06.57.11.88.16l-.3-.51m6.54-.76l.81-1.5-.81-1.5c-.3-.53-.62-1-.91-1.47C13.17 9 12.6 9 12 9c-.6 0-1.17 0-1.71.03-.29.47-.61.94-.91 1.47L8.57 12l.81 1.5c.3.53.62 1 .91 1.47.54.03 1.11.03 1.71.03.6 0 1.17 0 1.71-.03.29-.47.61-.94.91-1.47M12 6.78c-.19.22-.39.45-.59.72h1.18c-.2-.27-.4-.5-.59-.72m0 10.44c.19-.22.39-.45.59-.72h-1.18c.2.27.4.5.59.72M16.62 4c-.62-.38-2 .2-3.59 1.7.52.59 1.03 1.23 1.51 1.9.82.08 1.63.2 2.4.36.51-2.14.32-3.61-.32-3.96m-.7 5.74l.29.51c.11-.29.22-.58.29-.86-.27-.06-.57-.11-.88-.16l.3.51m1.45-7.05c1.47.84 1.63 3.05 1.01 5.63 2.54.75 4.37 1.99 4.37 3.68 0 1.69-1.83 2.93-4.37 3.68.62 2.58.46 4.79-1.01 5.63-1.46.84-3.45-.12-5.37-1.95-1.92 1.83-3.91 2.79-5.38 1.95-1.46-.84-1.62-3.05-1-5.63-2.54-.75-4.37-1.99-4.37-3.68 0-1.69 1.83-2.93 4.37-3.68-.62-2.58-.46-4.79 1-5.63 1.47-.84 3.46.12 5.38 1.95 1.92-1.83 3.91-2.79 5.37-1.95M17.08 12c.34.75.64 1.5.89 2.26 2.1-.63 3.28-1.53 3.28-2.26 0-.73-1.18-1.63-3.28-2.26-.25.76-.55 1.51-.89 2.26M6.92 12c-.34-.75-.64-1.5-.89-2.26-2.1.63-3.28 1.53-3.28 2.26 0 .73 1.18 1.63 3.28 2.26.25-.76.55-1.51.89-2.26m9 2.26l-.3.51c.31-.05.61-.1.88-.16-.07-.28-.18-.57-.29-.86l-.29.51m-2.89 4.04c1.59 1.5 2.97 2.08 3.59 1.7.64-.35.83-1.82.32-3.96-.77.16-1.58.28-2.4.36-.48.67-.99 1.31-1.51 1.9M8.08 9.74l.3-.51c-.31.05-.61.1-.88.16.07.28.18.57.29.86l.29-.51m2.89-4.04C9.38 4.2 8 3.62 7.37 4c-.63.35-.82 1.82-.31 3.96a22.7 22.7 0 0 1 2.4-.36c.48-.67.99-1.31 1.51-1.9z" fill="#00bcd4"/></symbol><symbol viewBox="0 0 24 24" id="readme" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="reason" xmlns="http://www.w3.org/2000/svg"><path d="M3 3v18h18V3H3zm5.119 8.993h2.798c.382 0 .71.025.985.075.275.05.534.159.774.326.244.168.435.386.577.654.145.265.218.598.218 1 0 .552-.112 1.001-.335 1.35-.22.348-.536.638-.947.87l2.16 3.203H12.31l-1.763-2.742h-.77v2.742H8.12v-7.478zm6.594 0h4.676v1.447h-3.018v1.29h2.802v1.447h-2.802v1.848h3.018v1.446h-4.676v-7.478zM9.778 13.37v2.014h.513c.266 0 .49-.014.67-.044.18-.03.329-.1.45-.207a.96.96 0 0 0 .253-.34c.055-.128.082-.297.082-.508 0-.187-.034-.35-.1-.483a.698.698 0 0 0-.343-.317 1.086 1.086 0 0 0-.395-.095 6.012 6.012 0 0 0-.526-.02h-.604z" fill="#f44336" stroke-width="1.067"/></symbol><symbol viewBox="0 0 172 193" id="restql" xmlns="http://www.w3.org/2000/svg"><title>Group</title><g transform="translate(14.767 16.713) scale(.82795)" fill="none"><path d="M171.39 55.799c-.975-6.147-4.673-11.642-10.15-14.805L96.381 3.546C93.217 1.72 89.615.756 85.964.756s-7.253.964-10.415 2.788L10.69 40.992A20.896 20.896 0 0 0 .272 59.035v74.89a20.894 20.894 0 0 0 10.416 18.042l64.859 37.446c3.165 1.827 6.767 2.791 10.417 2.791s7.252-.964 10.415-2.79l64.859-37.445c5.479-3.166 9.178-8.66 10.152-14.808zm-16.516 85.147L90.017 178.39a8.104 8.104 0 0 1-8.108 0l-64.857-37.444a8.109 8.109 0 0 1-4.053-7.021v-74.89a8.109 8.109 0 0 1 4.053-7.021l64.857-37.446c1.254-.725 2.654-1.086 4.054-1.086s2.8.361 4.054 1.086l64.857 37.446a8.106 8.106 0 0 1 4.053 7.021v74.89a8.109 8.109 0 0 1-4.053 7.021z" fill="#83e8c2"/><path d="M158.93 59.035a8.109 8.109 0 0 0-4.053-7.021L90.02 14.568c-1.254-.725-2.654-1.086-4.054-1.086s-2.8.361-4.054 1.086L17.055 52.014a8.106 8.106 0 0 0-4.053 7.021v74.89a8.109 8.109 0 0 0 4.053 7.021l64.857 37.444a8.104 8.104 0 0 0 8.108 0l64.857-37.444a8.109 8.109 0 0 0 4.053-7.021zm-46.766 31.681c.119-.069.242-.118.365-.149.044-.012.088-.01.131-.018.076-.012.152-.029.228-.029l.015.001c.02.001.038.005.059.006.093.005.184.019.273.04l.1.03c.077.025.15.057.223.095.028.014.057.027.084.043.094.057.184.122.263.199.007.008.013.017.021.024.07.071.133.15.188.235.018.029.033.059.05.09.04.072.072.148.099.229a1.512 1.512 0 0 1 .081.46v16.209l-3.278 1.893a1.548 1.548 0 0 0-.678.83 1.533 1.533 0 0 0-.098.514v3.785l-14.038 8.104-.01.004a1.55 1.55 0 0 1-.354.146c-.045.012-.09.011-.135.018-.074.012-.15.029-.225.029l-.014-.001c-.02-.001-.039-.005-.059-.006a1.463 1.463 0 0 1-.273-.041c-.034-.008-.066-.019-.1-.03a1.318 1.318 0 0 1-.223-.094c-.029-.015-.057-.027-.084-.044a1.45 1.45 0 0 1-.263-.198c-.009-.008-.015-.019-.023-.027a1.495 1.495 0 0 1-.185-.232c-.019-.029-.034-.06-.051-.09a1.422 1.422 0 0 1-.098-.229 1.702 1.702 0 0 1-.033-.101 1.487 1.487 0 0 1-.048-.358l-.001-.002v-20.053a1.446 1.446 0 0 1 .727-1.255zM85.24 31.369a1.449 1.449 0 0 1 1.452 0l45.741 26.41a1.45 1.45 0 0 1 0 2.512l-17.366 10.027a1.457 1.457 0 0 1-1.452 0l-15.49-8.943 1.727-.996a1.552 1.552 0 0 0 0-2.688l-13.111-7.57c-.239-.139-.508-.207-.775-.207s-.535.068-.775.207l-3.278 1.893-14.038-8.104a1.451 1.451 0 0 1 0-2.513zM57.59 47.558c.251 0 .501.065.726.194l15.489 8.942-1.727.997a1.552 1.552 0 0 0 0 2.688l1.727.996-15.488 8.943a1.457 1.457 0 0 1-1.452 0L39.499 60.291a1.45 1.45 0 0 1 0-2.512l17.366-10.027c.225-.129.475-.194.725-.194zm-9.56 92.328c-.241 0-.489-.062-.724-.196l-17.365-10.026a1.45 1.45 0 0 1-.726-1.256V75.59c0-.847.694-1.453 1.452-1.453.242 0 .49.062.724.197l17.366 10.025c.449.26.726.738.726 1.257v17.886l-1.727-.997a1.552 1.552 0 0 0-2.327 1.344v15.139c0 .555.295 1.067.775 1.344l3.278 1.894v16.209a1.45 1.45 0 0 1-1.452 1.451zm29.828 14.929a1.452 1.452 0 0 1-2.177 1.257l-17.365-10.026a1.452 1.452 0 0 1-.726-1.257v-17.885l1.726.996c.25.145.515.211.773.211.811 0 1.554-.648 1.554-1.555v-1.993l15.489 8.942c.449.26.726.738.726 1.257zm0-32.768c0 .127-.02.246-.049.36-.009.035-.021.067-.032.101-.026.08-.059.157-.099.229-.017.03-.032.061-.05.09a1.48 1.48 0 0 1-.188.235l-.021.025a1.51 1.51 0 0 1-.264.199c-.026.016-.055.028-.082.043a1.597 1.597 0 0 1-.324.124 1.362 1.362 0 0 1-.278.041c-.018.001-.036.006-.055.006l-.015.001c-.077 0-.155-.018-.233-.03-.043-.007-.084-.005-.125-.017a1.484 1.484 0 0 1-.366-.149l-14.035-8.104v-3.784a1.545 1.545 0 0 0-.776-1.343l-3.276-1.892V91.976c0-.127.02-.246.049-.361.009-.034.021-.066.032-.1a1.33 1.33 0 0 1 .099-.229c.017-.03.032-.062.051-.091.054-.084.116-.163.187-.234l.021-.025c.079-.076.168-.142.263-.199.027-.016.056-.029.084-.043a1.476 1.476 0 0 1 .601-.166c.019 0 .036-.005.055-.005l.015-.001c.078 0 .157.018.236.03.04.007.081.005.122.017.124.031.246.08.366.149l17.361 10.023a1.456 1.456 0 0 1 .726 1.259zm-9.984-45.373a1.448 1.448 0 0 1-.544-.55 1.466 1.466 0 0 1 0-1.413c.121-.219.303-.41.544-.55l14.038-8.104 3.277 1.892c.48.276 1.071.276 1.551 0l3.278-1.893 14.038 8.105a1.45 1.45 0 0 1 0 2.513L86.691 86.7a1.447 1.447 0 0 1-1.452 0zm74.842 51.733c0 .518-.276.997-.726 1.256l-45.741 26.409a1.452 1.452 0 0 1-2.177-1.257v-20.053c0-.519.277-.997.727-1.257l15.488-8.941v1.992c0 .906.743 1.555 1.553 1.555.26 0 .523-.066.774-.21l13.11-7.57a1.55 1.55 0 0 0 .776-1.344v-3.784l14.038-8.105a1.452 1.452 0 0 1 2.177 1.257v20.052zm0-32.764c0 .519-.276.997-.726 1.256l-15.489 8.943v-1.993c0-.906-.744-1.554-1.554-1.554a1.519 1.519 0 0 0-.773.21l-1.727.996V85.616c0-.519.277-.997.727-1.257l17.365-10.025c.234-.135.482-.197.724-.197.758 0 1.453.606 1.453 1.453z" fill="#111d5a"/><g fill="#83e8c2"><path d="M59.402 90.568zM94.485 123.06zM94.771 123.29zM77.775 122.51zM77.072 123.33zM77.418 123.09zM77.856 122.05zM76.749 123.45zM94.119 122.41zM77.131 133.51l-15.489-8.942v1.993c0 .906-.743 1.555-1.554 1.555a1.53 1.53 0 0 1-.773-.211l-1.726-.996v17.885c0 .519.276.997.726 1.257l17.365 10.026a1.452 1.452 0 0 0 2.177-1.257v-20.053a1.454 1.454 0 0 0-.726-1.257zM94.25 122.74zM110.28 111.42zM94.494 100.98c.088-.089.189-.168.303-.232l17.365-10.026-17.365 10.026a1.392 1.392 0 0 0-.303.232zM77.627 122.83zM58.027 90.936zM58.374 90.693zM59.044 90.521l-.015.001c.083-.001.167.015.251.029-.079-.012-.158-.03-.236-.03zM57.819 91.195zM58.696 90.568zM57.589 91.977zM76.043 123.46zM57.67 91.516zM75.677 123.31l-14.035-8.11zM76.401 123.5l.015-.001c-.082.001-.166-.016-.248-.029.078.012.156.03.233.03zM112.16 90.716zM77.662 101.27zM113.64 90.734zM96.237 123.31zM113.33 90.597zM112.89 90.52c-.075 0-.151.018-.228.029.081-.014.162-.029.242-.028l-.014-.001zM141.26 74.137c-.241 0-.489.062-.724.197l-17.365 10.025c-.449.26-.727.738-.727 1.257v17.885l1.727-.996c.25-.145.515-.211.773-.21.81 0 1.554.647 1.554 1.554v1.993l15.489-8.943a1.45 1.45 0 0 0 .726-1.256V75.59c0-.847-.695-1.453-1.453-1.453zM112.96 90.526zM95.523 123.5c.074 0 .15-.018.225-.029-.08.013-.159.028-.238.028l.013.001zM95.451 123.5zM85.238 86.7zM95.078 123.43zM141.26 106.9c-.241 0-.489.062-.724.196l-14.038 8.105v3.784c0 .555-.296 1.067-.776 1.344l-13.11 7.57c-.251.144-.515.21-.774.21-.81 0-1.553-.648-1.553-1.555v-1.992l-15.488 8.941c-.449.26-.727.738-.727 1.257v20.053a1.452 1.452 0 0 0 2.177 1.257l45.741-26.409a1.45 1.45 0 0 0 .726-1.256v-20.053a1.454 1.454 0 0 0-1.454-1.452zM67.871 41.396a1.451 1.451 0 0 0 0 2.513l14.038 8.104 3.278-1.893c.24-.139.508-.207.775-.207s.536.068.775.207l13.111 7.57a1.552 1.552 0 0 1 0 2.688l-1.727.996 15.49 8.943a1.457 1.457 0 0 0 1.452 0l17.366-10.027a1.45 1.45 0 0 0 0-2.512l-45.741-26.41a1.449 1.449 0 0 0-1.452 0zM39.497 57.779a1.45 1.45 0 0 0 0 2.512l17.366 10.027a1.457 1.457 0 0 0 1.452 0l15.488-8.943-1.727-.996a1.552 1.552 0 0 1 0-2.688l1.727-.997-15.489-8.942a1.458 1.458 0 0 0-1.451 0zM49.481 138.43v-16.209l-3.278-1.894a1.55 1.55 0 0 1-.775-1.344v-15.139c0-.906.743-1.555 1.554-1.554.259 0 .523.065.773.21l1.727.997V85.611a1.45 1.45 0 0 0-.726-1.257L31.39 74.33a1.436 1.436 0 0 0-.724-.197c-.758 0-1.452.606-1.452 1.453v52.817c0 .518.276.997.726 1.256l17.365 10.026a1.45 1.45 0 0 0 2.176-1.255zM114.34 108.18l-3.278 1.893 3.278-1.893V91.971zM114.11 91.193zM114.16 91.283z"/></g><g fill="#de5941"><path d="M94.494 100.98a1.45 1.45 0 0 0-.424 1.023v20.053l.001.002c0 .126.02.244.048.358.01.034.021.066.033.101.026.08.059.156.098.229.017.03.032.061.051.09.055.084.115.162.185.232.009.009.015.02.023.027.079.077.169.142.263.198.027.017.055.029.084.044a1.46 1.46 0 0 0 .596.165c.02.001.039.005.059.006.079 0 .158-.016.238-.028.045-.007.09-.006.135-.018.119-.031.238-.08.354-.146l.01-.004 14.038-8.104v-3.785c0-.18.04-.35.098-.514.122-.343.353-.643.678-.83l3.278-1.893V91.977c0-.127-.021-.246-.049-.361-.009-.033-.021-.065-.032-.099a1.266 1.266 0 0 0-.099-.229c-.017-.031-.032-.061-.05-.09a1.425 1.425 0 0 0-.188-.235l-.021-.024a1.41 1.41 0 0 0-.263-.199c-.027-.016-.056-.029-.084-.043a1.509 1.509 0 0 0-.323-.125 1.591 1.591 0 0 0-.273-.04c-.021-.001-.039-.005-.059-.006-.08-.001-.161.015-.242.028-.043.008-.087.006-.131.018-.123.031-.246.08-.365.149l-17.365 10.026a1.447 1.447 0 0 0-.302.233zM77.13 100.74L59.769 90.717a1.424 1.424 0 0 0-.366-.149c-.041-.012-.082-.01-.122-.017-.084-.015-.168-.03-.251-.029-.019 0-.036.005-.055.005-.095.005-.188.02-.278.041-.034.009-.065.02-.099.03a1.406 1.406 0 0 0-.224.095c-.028.014-.057.027-.084.043a1.515 1.515 0 0 0-.263.199l-.021.025c-.07.071-.133.15-.187.234-.019.029-.034.061-.051.091-.04.073-.072.149-.099.229a1.463 1.463 0 0 0-.081.461v16.206l3.276 1.892a1.547 1.547 0 0 1 .776 1.343v3.784l14.035 8.104c.119.068.242.117.366.149.041.012.082.01.125.017.082.014.166.03.248.029.019 0 .037-.005.055-.006.095-.004.188-.019.278-.041.034-.008.065-.019.099-.029.077-.025.152-.058.225-.095.027-.015.056-.027.082-.043.095-.058.185-.123.264-.199l.021-.025c.07-.071.133-.15.188-.235.018-.029.033-.06.05-.09.04-.072.072-.149.099-.229a1.448 1.448 0 0 0 .081-.461v-20.047a1.456 1.456 0 0 0-.726-1.259zM86.689 86.7l17.365-10.026a1.45 1.45 0 0 0 0-2.513l-14.038-8.105-3.278 1.893a1.556 1.556 0 0 1-1.551 0l-3.277-1.892-14.038 8.104c-.241.14-.423.331-.544.55a1.466 1.466 0 0 0 0 1.413c.121.218.303.41.544.55L85.238 86.7a1.447 1.447 0 0 0 1.451 0z"/></g></g></symbol><symbol viewBox="0 0 24 24" id="riot" xmlns="http://www.w3.org/2000/svg"><defs><path d="M13.26 3.04l.58.05.54.07.52.09.49.11.46.13.44.14.41.16.39.17.36.19.33.21.32.22.29.23.26.25.22.22.2.22.19.24.17.24.15.25.15.26.12.27.12.28.1.29.08.31.07.31.05.32.04.34.02.35.01.37v.05l-.02.51-.05.49-.09.48-.13.45-.15.43-.19.4-.22.39-.26.37-.28.34-.31.33-.33.3-.37.28-.39.27-.41.24-.44.22L21 21h-7.04l-3.48-5.14H9.17V21H3V3h9.01l.64.01.61.03zm-4.09 8.52h2.66l.99-.11.75-.35.47-.55.16-.74v-.05l-.17-.75-.47-.54-.74-.32-.96-.11H9.17v3.52z" id="ija"/></defs><use xlink:href="#ija" fill="#ff1744"/><use xlink:href="#ija" fill-opacity="0" stroke="#000" stroke-opacity="0"/></symbol><symbol viewBox="0 0 24 24" id="robot" xmlns="http://www.w3.org/2000/svg"><path d="M12.05 2.804a1.787 1.787 0 0 1 1.788 1.788c0 .661-.357 1.242-.893 1.546v1.135h.893a6.256 6.256 0 0 1 6.256 6.256h.894a.894.894 0 0 1 .893.893v2.681a.894.894 0 0 1-.893.894h-.894v.894a1.787 1.787 0 0 1-1.787 1.787H5.795a1.787 1.787 0 0 1-1.787-1.787v-.894h-.894a.894.894 0 0 1-.894-.894v-2.68a.894.894 0 0 1 .894-.894h.894a6.256 6.256 0 0 1 6.255-6.256h.894V6.138a1.773 1.773 0 0 1-.894-1.546 1.787 1.787 0 0 1 1.788-1.788m-4.022 9.83a2.234 2.234 0 0 0-2.234 2.235 2.234 2.234 0 0 0 2.234 2.234 2.234 2.234 0 0 0 2.234-2.234 2.234 2.234 0 0 0-2.234-2.234m8.043 0a2.234 2.234 0 0 0-2.234 2.234 2.234 2.234 0 0 0 2.234 2.234 2.234 2.234 0 0 0 2.235-2.234 2.234 2.234 0 0 0-2.235-2.234z" fill="#ff5722" stroke-width=".894"/></symbol><symbol viewBox="100 100 800 800" id="rollup" xmlns="http://www.w3.org/2000/svg"><style>.ilst0{fill:url(#ilXMLID_4_)}.ilst1{fill:url(#ilXMLID_5_)}.ilst2{fill:url(#ilXMLID_8_)}.ilst3{fill:url(#ilXMLID_9_)}.ilst4{fill:url(#ilXMLID_11_)}.ilst5{opacity:.3;fill:url(#ilXMLID_16_)}</style><g id="ilXMLID_14_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_4_" x1="444.47" x2="598.47" y1="526.05" y2="562.05" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_15_" class="ilst0" d="M721 410c0-33.6-8.8-65.1-24.3-92.4-41.1-42.3-130.5-52.1-152.7-.2-22.8 53.2 38.3 112.4 65 107.7 34-6-6-84-6-84 52 98 40 68-54 158S359 779 345 787c-.6.4-1.2.7-1.9 1h368.7c6.5 0 10.7-6.9 7.8-12.7l-96.4-190.8c-2.1-4.1-.6-9.2 3.4-11.5C683 540.6 721 479.8 721 410z" fill="url(#ilXMLID_4_)"/></g><g id="ilXMLID_2_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_5_" x1="420.38" x2="696.38" y1="475" y2="689" gradientUnits="userSpaceOnUse"><stop stop-color="#BF3338" offset="0"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_10_" class="ilst1" d="M721 410c0-33.6-8.8-65.1-24.3-92.4-41.1-42.3-130.5-52.1-152.7-.2-22.8 53.2 38.3 112.4 65 107.7 34-6-6-84-6-84 52 98 40 68-54 158S359 779 345 787c-.6.4-1.2.7-1.9 1h368.7c6.5 0 10.7-6.9 7.8-12.7l-96.4-190.8c-2.1-4.1-.6-9.2 3.4-11.5C683 540.6 721 479.8 721 410z" fill="url(#ilXMLID_5_)"/></g><linearGradient id="ilXMLID_8_" x1="429.39" x2="469.39" y1="517.16" y2="559.16" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_3_" class="ilst2" d="M329.82 813.46c15.58-8.903 122.41-220.34 227.02-320.5s117.96-66.771 60.094-175.83c0 0-221.46 310.49-301.58 464.06" fill="url(#ilXMLID_8_)" stroke-width="1.113"/><g id="ilXMLID_7_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_9_" x1="502.11" x2="490.11" y1="589.46" y2="417.46" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_12_" class="ilst3" d="M373 537c134.4-247.1 152-272 222-272 36.8 0 73.9 16.6 97.9 46.1-32.7-52.7-90.6-88-156.9-89H307.7c-4.8 0-8.7 3.9-8.7 8.7V691c13.6-35.1 36.7-85.3 74-154z" fill="url(#ilXMLID_9_)"/></g><linearGradient id="ilXMLID_11_" x1="450.12" x2="506.94" y1="514.21" y2="552.85" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FBB040" offset="0"/><stop stop-color="#FB8840" offset="1"/></linearGradient><path id="ilXMLID_6_" class="ilst4" d="M556.84 492.96c-104.61 100.16-211.44 311.6-227.02 320.5s-41.732 10.016-55.643-5.564c-14.801-16.582-37.837-43.401 86.802-272.65 149.57-274.99 169.15-302.7 247.05-302.7 40.953 0 82.24 18.473 108.95 51.302 1.447 2.337 2.893 4.785 4.34 7.233-45.738-47.074-145.23-57.98-169.93-.222-25.373 59.204 42.622 125.08 72.335 119.85 37.837-6.677-6.677-93.48-6.677-93.48 57.757 108.95 44.403 75.563-60.205 175.72z" fill="url(#ilXMLID_11_)" stroke-width="1.113"/><linearGradient id="ilXMLID_16_" x1="508.33" x2="450.33" y1="295.76" y2="933.76" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FFF" offset="0"/><stop stop-color="#FFF" stop-opacity="0" offset="1"/></linearGradient><path id="ilXMLID_13_" class="ilst5" d="M373.22 547.49c149.57-274.99 169.15-302.7 247.05-302.7 33.719 0 67.661 12.575 93.48 35.277-26.708-30.492-66.326-47.519-105.72-47.519-77.9 0-97.486 27.71-247.05 302.7-124.64 229.25-101.6 256.07-86.802 272.65 2.114 2.337 4.563 4.34 7.122 6.01-13.02-18.919-18.807-62.877 91.922-266.42z" fill="url(#ilXMLID_16_)" opacity=".3" stroke-width="1.113"/></symbol><symbol viewBox="0 0 24 24" id="ruby" xmlns="http://www.w3.org/2000/svg"><path d="M16 9h3l-5 7m-4-7h4l-2 8M5 9h3l2 7m5-12h2l2 3h-3m-5-3h2l1 3h-4M7 4h2L8 7H5m1-5L2 8l10 14L22 8l-4-6H6z" fill="#f44336"/></symbol><symbol viewBox="0 0 144 144" id="rust" xmlns="http://www.w3.org/2000/svg"><path d="M68.252 26.206a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0M25.766 58.451a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m84.97.166a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m-74.661 4.88a3.252 3.252 0 0 0 1.651-4.29l-1.58-3.574h6.214v28.01H29.823a43.847 43.847 0 0 1-1.42-16.738zm25.994.688v-8.256h14.798c.764 0 5.397.883 5.397 4.347 0 2.877-3.553 3.908-6.475 3.908zm-20.203 44.452a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m52.769.166a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m1.101-8.076a3.246 3.246 0 0 0-3.856 2.498l-1.787 8.342a43.847 43.847 0 0 1-36.566-.175l-1.787-8.342a3.246 3.246 0 0 0-3.854-2.497l-7.365 1.581a43.847 43.847 0 0 1-3.808-4.488h35.834c.406 0 .676-.074.676-.443V84.527c0-.369-.27-.442-.676-.442h-10.48V76.05h11.335c1.035 0 5.532.296 6.97 6.045.45 1.768 1.44 7.519 2.116 9.36.674 2.065 3.417 6.19 6.34 6.19h18.501a43.847 43.847 0 0 1-4.06 4.7zm19.898-33.468a43.847 43.847 0 0 1 .093 7.612h-4.499c-.45 0-.631.296-.631.737v2.066c0 4.863-2.742 5.92-5.145 6.19-2.288.258-4.825-.958-5.138-2.358-1.35-7.593-3.6-9.214-7.152-12.016 4.409-2.8 8.996-6.93 8.996-12.457 0-5.97-4.092-9.729-6.881-11.572-3.914-2.58-8.246-3.096-9.415-3.096H39.336A43.847 43.847 0 0 1 63.867 28.52l5.484 5.753a3.243 3.243 0 0 0 4.59.105l6.137-5.869a43.847 43.847 0 0 1 30.017 21.38l-4.201 9.487a3.256 3.256 0 0 0 1.652 4.29zm10.477.154l-.143-1.467 4.327-4.036c.88-.82.55-2.472-.574-2.891l-5.532-2.068-.433-1.428 3.45-4.792c.704-.974.058-2.53-1.127-2.724l-5.833-.949-.7-1.31 2.45-5.38c.502-1.095-.43-2.496-1.636-2.45l-5.92.206-.935-1.135 1.36-5.766c.275-1.17-.913-2.36-2.084-2.085l-5.765 1.359-1.136-.935.207-5.92c.046-1.198-1.357-2.135-2.45-1.637l-5.379 2.452-1.31-.703-.95-5.833c-.193-1.183-1.75-1.83-2.723-1.128l-4.796 3.45-1.425-.432-2.068-5.532c-.42-1.127-2.072-1.452-2.89-.576l-4.036 4.33-1.467-.143-3.117-5.036c-.63-1.02-2.318-1.02-2.946 0l-3.117 5.036-1.467.143-4.037-4.33c-.819-.876-2.47-.551-2.89.576l-2.069 5.532-1.426.432-4.795-3.45c-.974-.703-2.53-.055-2.723 1.128l-.951 5.833-1.31.703-5.379-2.452c-1.093-.5-2.496.439-2.45 1.637l.206 5.92-1.136.935-5.765-1.36c-1.171-.272-2.36.915-2.086 2.086l1.358 5.766-.933 1.135-5.92-.206c-1.193-.035-2.134 1.355-1.637 2.45l2.453 5.38-.703 1.31-5.832.949c-1.185.192-1.827 1.75-1.128 2.724l3.45 4.792-.433 1.428-5.532 2.068c-1.123.42-1.452 2.07-.574 2.891l4.328 4.036-.143 1.467-5.035 3.116c-1.02.63-1.02 2.318 0 2.946l5.035 3.117.143 1.467-4.328 4.037c-.878.818-.549 2.468.574 2.89l5.532 2.068.433 1.428-3.45 4.793c-.701.976-.056 2.532 1.129 2.723l5.831.948.703 1.312-2.453 5.378c-.5 1.093.444 2.5 1.638 2.451l5.917-.207.935 1.136-1.358 5.768c-.275 1.168.915 2.355 2.086 2.08l5.765-1.357 1.137.932-.207 5.921c-.046 1.199 1.357 2.136 2.45 1.636l5.379-2.45 1.31.702.95 5.83c.193 1.187 1.75 1.829 2.725 1.13l4.792-3.453 1.427.435 2.069 5.53c.42 1.123 2.072 1.454 2.89.574l4.037-4.328 1.467.146 3.117 5.035c.628 1.016 2.316 1.018 2.946 0l3.117-5.035 1.467-.146 4.036 4.328c.818.88 2.47.549 2.89-.574l2.068-5.53 1.428-.435 4.793 3.453c.974.699 2.53.055 2.722-1.13l.952-5.83 1.31-.703 5.378 2.451c1.093.5 2.493-.435 2.45-1.636l-.206-5.92 1.135-.933 5.765 1.357c1.171.275 2.36-.912 2.085-2.08l-1.358-5.768.932-1.136 5.92.207c1.194.048 2.138-1.358 1.636-2.451l-2.45-5.378.7-1.312 5.833-.948c1.187-.19 1.831-1.747 1.127-2.723l-3.45-4.793.433-1.428 5.532-2.068c1.125-.422 1.454-2.072.574-2.89l-4.327-4.037.143-1.467 5.035-3.117c1.02-.628 1.021-2.315.001-2.946z" fill="#ff7043" stroke-width="1.146"/></symbol><symbol viewBox="0 0 500 500" id="sass" xmlns="http://www.w3.org/2000/svg"><path d="M422.676 96.573c-12.192-47.839-91.508-63.557-166.575-36.892-44.68 15.877-93.029 40.786-127.81 73.311-41.349 38.675-47.943 72.328-45.216 86.395 9.583 49.622 77.585 82.069 105.535 106.126v.144c-8.246 4.05-68.565 34.584-82.684 65.799-14.893 32.932 2.372 56.556 13.804 59.742 35.424 9.859 71.764-7.866 91.311-37.01 18.853-28.12 17.28-64.422 9.086-82.487 11.3-2.976 24.476-4.314 41.218-2.36 47.248 5.52 56.517 35.017 54.747 47.366-1.77 12.35-11.681 19.14-14.998 21.186-3.317 2.045-4.326 2.766-4.05 4.287.405 2.215 1.94 2.137 4.758 1.652 3.894-.656 24.804-10.042 25.709-32.828 1.14-28.933-26.587-61.302-75.684-60.45-20.216.354-32.933 2.268-42.123 5.69-.681-.774-1.363-1.547-2.084-2.307-30.35-32.382-86.46-55.285-84.088-98.824.866-15.823 6.372-57.5 107.817-108.052 83.104-41.415 149.637-30.009 161.135-4.76 16.427 36.08-35.554 103.137-121.858 112.812-32.88 3.684-50.198-9.059-54.498-13.804-4.536-4.995-5.204-5.218-6.909-4.287-2.753 1.533-1.01 5.938 0 8.574 2.583 6.712 13.15 18.603 31.176 24.515 15.863 5.205 54.459 8.063 101.156-9.99 52.283-20.255 93.12-76.523 81.125-123.548zM200.213 340.34c3.92 14.5 3.487 28.016-.564 40.248a65.289 65.289 0 0 1-3.225 7.97c-3.12 6.477-7.316 12.534-12.442 18.132-15.653 17.069-37.507 23.532-46.88 18.092-10.122-5.874-5.048-29.944 13.083-49.11 19.52-20.636 47.602-33.903 47.602-33.903l-.039-.079 2.465-1.35z" fill="#ec407a" stroke="#ec407a" stroke-width="16.286552999999998"/></symbol><symbol viewBox="0 0 300 300" id="sbt" xmlns="http://www.w3.org/2000/svg"><path d="M105.46 209.517c-7.875 0-13.452-7.521-13.452-15.37v-.327c0-7.848 5.578-13.735 13.452-13.735h164.05c1.476-4.905 2.625-11.446 3.281-17.986h-137.81c-7.875 0-14.273-6.05-14.273-13.898s6.398-13.898 14.273-13.898h137.31c-.82-6.54-1.969-13.081-3.773-17.986h-104.01c-7.875 0-14.273-6.05-14.273-13.898s6.398-13.898 14.273-13.898h91.87c-21.327-37.607-60.864-61.315-106.14-61.315-67.918 0-123.04 54.448-123.04 122.3 0 67.856 55.122 123.28 123.04 123.28 46.59 0 87.112-25.507 107.95-63.114h-152.73z" fill="#0277bd" stroke-width="1.638"/></symbol><symbol viewBox="0 0 256 256" id="scala" xmlns="http://www.w3.org/2000/svg"><path fill="#f44336" fill-rule="evenodd" stroke-width=".3" d="M59.607 50.647l149.097-21.982v49.488L59.607 100.135zM59.593 114.08L208.69 92.098v49.488L59.593 163.568zM59.587 177.358l149.097-21.982v49.488L59.587 226.846z"/><path fill="#f44336" fill-rule="evenodd" stroke-width=".3" d="M62.425 91.414l95.605 30.923-2.832 8.757-95.605-30.922zM113.084 61.13l95.604 30.922-2.832 8.757-95.605-30.922zM62.425 154.79l95.605 30.922-2.833 8.758-95.604-30.923zM113.097 124.408l95.604 30.923-2.832 8.757-95.605-30.922z"/></symbol><symbol viewBox="0 0 24 24" id="settings" xmlns="http://www.w3.org/2000/svg"><path d="M12 15.5A3.5 3.5 0 0 1 8.5 12 3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5 3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97 0-.33-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65A.506.506 0 0 0 14 2h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 11c-.04.34-.07.67-.07 1 0 .33.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.66z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="shaderlab" xmlns="http://www.w3.org/2000/svg"><path d="M9.11 17H6.5l-4.91-5L6.5 7h2.61l1.31-2.26L17.21 3l1.87 6.74L17.77 12l1.31 2.26L17.21 21l-6.79-1.74L9.11 17m.14-.25l5.13 1.38L11.42 13H5.5l3.75 3.75m6.87.38L17.5 12l-1.38-5.13L13.15 12l2.97 5.13M9.25 7.25L5.5 11h5.92l2.96-5.13-5.13 1.38z" fill="#1976d2"/></symbol><symbol viewBox="0 0 24 24" id="slim" xmlns="http://www.w3.org/2000/svg"><path d="M6.959 2.5a4.605 4.605 0 0 0-4.615 4.615v9.957a4.605 4.605 0 0 0 4.615 4.615h9.957a4.605 4.605 0 0 0 4.615-4.615V7.115A4.605 4.605 0 0 0 16.916 2.5zm4.938 2.691a6.811 6.811 0 0 1 6.81 6.813H13.43L9.938 7.287l.699 4.717H5.086a6.811 6.811 0 0 1 6.81-6.813z" fill="#f57f17"/></symbol><symbol id="smarty" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.iust0{fill:#ffce00}</style><path class="iust0" d="M9.14 20.606c0 .556.398.953.954.953h3.812c.556 0 .953-.397.953-.953v-.953H9.141zM12 2.5c-3.653 0-6.671 3.018-6.671 6.671 0 2.303 1.112 4.289 2.859 5.48v2.144c0 .556.397.953.953.953h5.718c.556 0 .953-.397.953-.953V14.65c1.747-1.191 2.86-3.177 2.86-5.48 0-3.653-3.019-6.671-6.672-6.671zm2.7 10.563l-.794.555v2.224h-3.812v-2.224l-.794-.555A4.712 4.712 0 0 1 7.235 9.17 4.78 4.78 0 0 1 12 4.405a4.78 4.78 0 0 1 4.765 4.765 4.712 4.712 0 0 1-2.065 3.892z"/></symbol><symbol viewBox="0 0 200 200" id="snyk" xmlns="http://www.w3.org/2000/svg"><title>Group 2</title><g transform="translate(15.255 18.22) scale(1.8477)" fill="none" fill-rule="evenodd"><path d="M65.161 24.997c-1.656 5.974-5.255 23.587-5.255 23.587s-6.618-2.464-14.148-2.476h-.055c-.413.002-.822.012-1.23.026v41.649h6.677v.003h5.815v-.003h20.858c.111-8.177-2.036-27.066-2.036-27.066-1.088-2.279.46-7.668.46-7.668-8.869-9.092-11.086-28.051-11.086-28.051zm-3.357 43.958c5.476 0 1.381 4.64.9 5.168H52.35c.944-1.18 4.504-5.168 9.453-5.168z" fill="#607d8b" stroke-width="1.6"/><path d="M26.366 24.995s-2.217 18.961-11.087 28.053c0 0 1.548 5.391.46 7.669 0 0-2.15 18.895-2.038 27.066h19.273v.003h7.079v-.003h5.744V46.107h-.025c-7.532.013-14.151 2.478-14.151 2.478s-3.6-17.615-5.255-23.59zm3.264 43.96c4.95 0 8.51 3.987 9.452 5.168H28.73c-.479-.528-4.573-5.168.9-5.168z" fill="#90a4ae" stroke-width="1.6"/><g transform="translate(23.76 77.45) scale(1.5998)"><g transform="translate(17.526)"><path d="M7.357.06H.177v.075C.177 2.64 2.345 4.67 4.89 4.67 7.431 4.67 9.6 2.64 9.6.135V.059z" fill="#455a64"/><path d="M1.972.06v.075a2.692 2.692 0 1 0 5.386 0V.059z" fill="#fff"/><path d="M5.496.06H4.234c-.012 0-.023.005-.034.007.157.033.243.388.21.624a.721.721 0 0 1-.71.617c.102.471.487.85.997.922a1.188 1.188 0 0 0 1.35-1.007C6.112.743 5.881.06 5.495.06z" fill="#37474f"/></g><path d="M7.552.06H.372v.075c0 2.505 2.17 4.535 4.712 4.535 2.544 0 4.712-2.03 4.712-4.535V.059z" fill="#455a64"/><path d="M2.168.06v.075a2.692 2.692 0 1 0 5.385 0V.059z" fill="#fff"/><path d="M5.692.06H4.428c-.01 0-.022.005-.032.007.156.033.242.388.21.624a.72.72 0 0 1-.712.617c.104.471.488.85.999.922A1.187 1.187 0 0 0 6.24 1.223C6.308.743 6.078.06 5.69.06z" fill="#37474f"/></g><path d="M25.514-.27l-4.202 7.697C19.838 10.17 6.858 34.465 6.858 43.243v.516L12.8 59.573c-.8 7.258-2.203 21.643-1.78 28.21h5.73c-.354-3.787.648-17.008 1.903-28.25l.076-.677-1.075-2.892c3.694-3.868 6.285-9.193 8.073-14.261l.174 1.235 5.869 9.629 2.291-.983c.058-.024 5.935-2.523 11.643-2.523 5.672 0 11.646 2.5 11.702 2.525l2.29.976 5.86-9.626.23-1.608c1.769 5.117 4.358 10.536 8.07 14.49l-1.127 3.035.076.678c1.259 11.286 2.266 24.564 1.916 28.252h5.677c.406-6.567-1.05-20.952-1.848-28.208l5.838-15.817v-.514c0-8.779-12.876-33.074-14.347-35.816L65.923-.27l-5.897 41.229-2.723 4.478c-2.628-.882-7.1-2.11-11.603-2.11-4.498 0-8.94 1.225-11.557 2.108l-2.722-4.476-2.07-14.452a.832.832 0 0 0 .006-.071l-.016-.004zm-3.166 18.39l1.206 8.407c-.46 3.143-2.561 15.47-8.198 23.24l-2.598-6.99c.325-4.554 5.067-15.462 9.59-24.656zm46.763 0c4.523 9.194 9.267 20.104 9.592 24.657L76.166 49.6c-6.09-8.553-8-22.459-8.166-23.73z" fill="#607d8b" stroke-width="1.6"/></g></symbol><symbol viewBox="0 0 24 24" id="solidity" xmlns="http://www.w3.org/2000/svg"><path d="M5.8 14.05l6.253 8.61 6.252-8.61-6.254 3.807z" fill="#0288d1" stroke-width="4.553" stroke-linejoin="round"/><path d="M12.051 1.347L5.8 11.833l6.252 3.807 6.254-3.807z" fill="#0288d1" stroke-width="5.025" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 120 120" id="sonar" xmlns="http://www.w3.org/2000/svg"><style>.a,.b{fill:#fff}.b{stroke:#fff;stroke-miterlimit:10}</style><path d="M115.45 23.033S97.961 33.27 97.534 33.412c-.427.284-.852.57-1.137.854-1.422 1.421-1.848 3.41-1.422 5.26.285.852.711 1.849 1.422 2.56.711.71 1.564 1.137 2.559 1.422 1.848.426 3.84 0 5.262-1.422.426-.427.709-.853.851-1.28l.143-.427 2.56-4.692zm-39.102 9.242c-27.441 0-31.99 13.08-31.99 29.29 0 3.838.569 7.962-1.99 11.942-3.84 5.972-8.957 5.828-10.236 5.828-1.706 0-7.962-.993-8.246-2.841h.994c6.682 0 11.658-5.404 11.658-12.655v-2.56h-5.686c-4.123 0-7.82 1.849-10.238 5.12-2.417-3.271-6.113-5.12-10.236-5.12h-5.83v2.56c0 7.11 5.688 12.795 12.797 12.795h1.848c0 4.124 5.687 20.332 47.63 20.332 16.352 0 40.665-2.843 40.665-33.697 0-5.829-1.848-11.23-4.691-15.78-.996.284-1.992.568-3.13.568a8.92 8.92 0 0 1-8.956-8.957c0-.995.141-1.991.425-2.986-4.265-2.702-8.53-3.838-14.787-3.838z" fill="#1e88e5" stroke-width="1.422"/></symbol><symbol viewBox="0 0 412 395" id="stylelint" xmlns="http://www.w3.org/2000/svg"><title>stylelint-icon-white</title><g transform="translate(31.478 29.499) scale(.84775)" fill="#cfd8dc" fill-rule="evenodd"><path d="M208.8 393.05c45.057-161.12 43.75-161.85 76.32-276.73l7.832 4.523c4.255 2.458 7.738.448 7.738-4.455V61.602c8.643-30.27 15.416-53.66 17.4-60.693h35.287l58.618 54.304-38.498 33.27 29.11 31.473-191.86 273.09c-.938 1.542-2.244 1.19-1.947 0zm20.96-347.28c1.733 0 3.148.958 3.148 2.147v28.077c0 1.186-1.415 2.15-3.147 2.15h-47.396c-1.742 0-3.153-.96-3.153-2.15V47.917c0-1.185 1.41-2.147 3.153-2.147h47.396z"/><path d="M288.26 14.688l-52.14 30.1c.605.92.973 1.98.973 3.136v28.078c0 1.457-.565 2.77-1.496 3.83l52.663 30.402c3.59 2.073 6.535.377 6.535-3.764V18.456c0-4.145-2.944-5.836-6.535-3.768zM175.02 76V47.923c0-1.15.368-2.21.966-3.13l-52.14-30.105c-3.588-2.068-6.53-.376-6.53 3.768v88.013c0 4.14 2.938 5.84 6.53 3.76l52.66-30.405c-.926-1.06-1.487-2.37-1.487-3.827z"/><path d="M201.25 393.05h1.947c-45.05-161.12-43.753-161.85-76.32-276.73l-7.833 4.523c-4.253 2.458-7.737.448-7.737-4.455V61.602C102.662 31.332 95.892 7.942 93.902.909H58.619L.002 55.213l38.494 33.27-29.11 31.473z"/><circle cx="204.57" cy="122.54" r="14.231"/><circle cx="204.57" cy="207.16" r="14.231"/><circle cx="204.57" cy="291.78" r="14.23"/></g></symbol><symbol viewBox="0 0 412 395" id="stylelint_light" xmlns="http://www.w3.org/2000/svg"><title>stylelint-icon-black</title><g transform="translate(31.478 29.499) scale(.84775)" fill="#546e7a" fill-rule="evenodd"><path d="M208.8 393.05c45.057-161.12 43.75-161.85 76.32-276.73l7.832 4.523c4.255 2.458 7.738.448 7.738-4.455V61.602c8.643-30.27 15.416-53.66 17.4-60.693h35.287l58.618 54.304-38.498 33.27 29.11 31.473-191.86 273.09c-.938 1.542-2.244 1.19-1.947 0zm20.96-347.28c1.733 0 3.148.958 3.148 2.147v28.077c0 1.186-1.415 2.15-3.147 2.15h-47.396c-1.742 0-3.153-.96-3.153-2.15V47.917c0-1.185 1.41-2.147 3.153-2.147h47.396z"/><path d="M288.26 14.688l-52.14 30.1c.605.92.973 1.98.973 3.136v28.078c0 1.457-.565 2.77-1.496 3.83l52.663 30.402c3.59 2.073 6.535.377 6.535-3.764V18.456c0-4.145-2.944-5.836-6.535-3.768zM175.02 76V47.923c0-1.15.368-2.21.966-3.13l-52.14-30.105c-3.588-2.068-6.53-.376-6.53 3.768v88.013c0 4.14 2.938 5.84 6.53 3.76l52.66-30.405c-.926-1.06-1.487-2.37-1.487-3.827z"/><path d="M201.25 393.05h1.947c-45.05-161.12-43.753-161.85-76.32-276.73l-7.833 4.523c-4.253 2.458-7.737.448-7.737-4.455V61.602C102.662 31.332 95.892 7.942 93.902.909H58.619L.002 55.213l38.494 33.27-29.11 31.473z"/><circle cx="204.57" cy="122.54" r="14.231"/><circle cx="204.57" cy="207.16" r="14.231"/><circle cx="204.57" cy="291.78" r="14.23"/></g></symbol><symbol viewBox="0 0 200.00001 200.00001" id="stylus" xmlns="http://www.w3.org/2000/svg"><path d="M126.814 155.9c14.64-17.51 16.362-35.595 5.024-69.18-7.177-21.24-19.09-37.602-10.334-50.807 9.329-14.065 29.135-.43 12.63 18.371l3.301 2.297c19.806 2.296 29.566-24.83 14.783-32.58C113.179 3.621 79.02 42.803 94.09 88.156c6.458 19.232 15.5 39.613 8.18 55.83-6.314 13.923-18.514 22.103-26.695 22.39-17.079.862-5.74-38.32 13.922-48.08 1.722-.861 4.162-2.01 1.866-4.88-24.256-2.727-38.464 8.468-46.645 24.112-23.825 45.497 45.21 62.29 82.095 18.371z" fill="#c0ca33" stroke-width="1.435"/></symbol><symbol viewBox="0 0 24 24" id="swc" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="jba"><stop offset="0" stop-color="#791223"/><stop offset="1" stop-color="#d92f3c"/></linearGradient><linearGradient xlink:href="#jba" id="jbb" x1="12.356" y1="21.559" x2="12.356" y2="2.949" gradientUnits="userSpaceOnUse"/></defs><path d="M6 3c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6 3 6.5V19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.5c0-.5-.17-.93-.46-1.27l-1.39-1.68C18.88 3.21 18.47 3 18 3H6zm-.07 1h12l.94 1H5.12l.81-1z" fill="url(#jbb)"/><path style="line-height:125%" d="M11.053 11.918h-.008c-.244.022-.475.054-.676.11a2.9 2.9 0 0 0-.856.412 3.399 3.399 0 0 0-.67.683 9.36 9.36 0 0 0-.586.95c-.07.131-.134.244-.201.365v.001h-.002l-.768 1.372-.003-.001c-.136.253-.264.485-.38.686-.123.212-.26.39-.411.539a1.599 1.599 0 0 1-.52.34c-.04.016-.092.024-.138.036h-.567v1.383H5.834v-.001c.245-.02.477-.053.679-.11a2.9 2.9 0 0 0 .856-.411c.245-.185.469-.413.67-.683.195-.275.39-.591.585-.95.07-.131.135-.244.202-.366l.004.001.002-.002.02-.038H10.948v-1.378h-.19v-.001H9.624c.125-.234.246-.452.355-.64.123-.21.259-.39.41-.538.152-.148.325-.26.52-.34.04-.015.091-.024.136-.035h.57V13.3h-.002v-1.381h-.56v-.001z" font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#fff"/></symbol><symbol viewBox="0 0 24 24" id="swift" xmlns="http://www.w3.org/2000/svg"><path d="M17.09 19.72c-2.36 1.36-5.59 1.5-8.86.1A13.807 13.807 0 0 1 2 14.5c.67.55 1.46 1 2.3 1.4 3.37 1.57 6.73 1.46 9.1 0-3.37-2.59-6.24-5.96-8.37-8.71-.45-.45-.78-1.01-1.12-1.51 8.28 6.05 7.92 7.59 2.41-1.01 4.89 4.94 9.43 7.74 9.43 7.74.16.09.25.16.36.22.1-.25.19-.51.26-.78.79-2.85-.11-6.12-2.08-8.81 4.55 2.75 7.25 7.91 6.12 12.24-.03.11-.06.22-.05.39 2.24 2.83 1.64 5.78 1.35 5.22-1.21-2.39-3.48-1.65-4.62-1.17z" fill="#fe5e2f"/></symbol><symbol viewBox="0 0 24 24" id="table" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5m4 7.5h-4v2h1l-2 1.67L10 13h1v-2H7v2h1l3 2.5L8 18H7v2h4v-2h-1l2-1.67L14 18h-1v2h4v-2h-1l-3-2.5 3-2.5h1v-2z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 200 200" id="terraform" xmlns="http://www.w3.org/2000/svg"><g transform="translate(177.03 -58.705) scale(.92881)" fill="#5c6bc0" stroke="#b0aff5" stroke-linejoin="round"><g stroke-width=".288"><path transform="skewY(26.439) scale(.89541 1)" d="M-203.8 170.95h64.714v51.88H-203.8zM-124.37 171.04h64.714v51.88h-64.714zM-124.37 236.09h64.714v51.88h-64.714z"/></g><path transform="skewY(-22.59) scale(-.92328 1)" stroke-width=".284" d="M-19.172 128.27h62.76v51.88h-62.76z"/></g></symbol><symbol viewBox="0 0 24 24" id="test-js" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="test-jsx" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#00bcd4"/></symbol><symbol viewBox="0 0 24 24" id="test-ts" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#0288d1"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="tex" xmlns="http://www.w3.org/2000/svg"><g font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#42a5f5" stroke-linejoin="miter"><text style="line-height:125%" x="9.914" y="364.919"><tspan x="9.914" y="364.919" font-size="287.5">T</tspan></text><text style="line-height:125%" x="136.374" y="435.558"><tspan x="136.374" y="435.558" font-size="287.5">E</tspan></text><text style="line-height:125%" x="307.819" y="361.201"><tspan x="307.819" y="361.201" font-size="287.5">X</tspan></text></g></symbol><symbol viewBox="0 0 24 24" id="todo" xmlns="http://www.w3.org/2000/svg"><path d="M3 5h6v6H3V5m2 2v2h2V7H5m6 0h10v2H11V7m0 8h10v2H11v-2m-6 5l-3.5-3.5 1.41-1.41L5 17.17l4.59-4.58L11 14l-6 6z" fill="#42a5f5"/></symbol><symbol id="travis" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><style id="jkstyle2">.jkst0{fill:#cb3349}.jkst1{fill:#f4edae}.jkst2{fill:#e6ccad}.jkst3{fill:#656c67}.jkst4{fill:#e5caa3}.jkst5{fill:#c7b39a}.jkst6{fill:#ebd599}.jkst7{fill:#2d3136}.jkst8{fill:#edf6fa}.jkst9{opacity:.8}.jkst10{opacity:.75;fill:#ebd599}</style><g id="jkg99" transform="translate(11.017 12.484) scale(.8858)"><g id="jkg10"><path class="jkst0" d="M47.781 86.572s-31.118 21.903-32.335 30.247l2.335-.48S55.045 91.64 84.584 88.628l.669-3.749z" id="jkpath4" fill="#cb3349"/><path class="jkst0" d="M96.629 83.442l-24.511 17.385 1.325 1.063c.999-.806 43.539-13.798 43.539-13.798l8.969-5.623c-6.018.749-29.322.973-29.322.973z" id="jkpath6" fill="#cb3349"/><path class="jkst0" d="M117.932 104.469c17.405 0 43.495-17.046 43.495-17.046l-8.434-1.605c-.417.417-13.6-.462-13.6-.462l-6.258-1.738-14.951 17.036-1.217 2.956c1.075-.437.965.859.965.859z" id="jkpath8" fill="#cb3349"/></g><path class="jkst0" d="M174.728 158.832l-5.377 1.514-24.843-.537-15.541-12.085-18.784 4.7-21.726-1.88-12.166 13.294-22.828 6.819-11.398-3.534-.574-.494 5.116 12.527s11.588 12.424 18.061 13.885c6.472 1.461 18.165-.105 26.935-1.463 8.769-1.357 15.764-4.489 18.582-9.603 2.818-5.117 3.236-6.578 3.236-6.578s8.353 11.797 15.556 13.155c7.203 1.357 28.605-5.952 28.605-5.952s13.051-3.549 15.346-8.038c2.297-4.489 8.353-19.209 8.353-19.209zM44.456 169.038l-.361-.166-2.013-1.736z" id="jkpath12" fill="#cb3349"/><g id="jkg97"><path class="jkst1" d="M195.832 70.085a48.125 48.125 0 0 0-.21-2.009 26.472 26.472 0 0 0-.215-1.424c-1.793-1.509-3.831-2.851-5.952-4.071-2.299-1.343-4.704-2.546-7.159-3.663-2.438-1.15-4.942-2.191-7.461-3.207a134.313 134.313 0 0 0-3.798-1.477c-1.269-.495-2.55-.956-3.835-1.424 2.697.447 5.366 1.059 8.015 1.741 1.723.446 3.437.945 5.14 1.477-12.112-31.655-41.07-52.27-72.687-52.27-31.622 0-60.577 20.615-72.686 52.27a109.044 109.044 0 0 1 5.137-1.477c2.653-.682 5.323-1.294 8.018-1.741-1.289.468-2.567.929-3.84 1.424-1.267.472-2.536.967-3.798 1.477-2.519 1.016-5.016 2.057-7.46 3.207-2.45 1.117-4.857 2.32-7.156 3.663-2.121 1.219-4.157 2.562-5.957 4.071-.075.457-.151.951-.21 1.424a51.768 51.768 0 0 0-.21 2.009 51.354 51.354 0 0 0-.177 4.061 59.216 59.216 0 0 0 .5 8.11c.37 2.692.864 5.366 1.595 7.951.36 1.295.768 2.572 1.24 3.808.237.617.495 1.225.764 1.816.134.294.274.585.413.864l.172.328c.199.101.408.204.607.3l1.204.575c.671.305 1.6.746 2.368 1.09.043-.037.086-.075.123-.114l-2.235-8.513c.474-.13 4.718-1.225 12.032-2.617a38.816 38.816 0 0 1-1.772-.381c-1.665-.414-3.309-.919-4.899-1.564a22.415 22.415 0 0 1-2.309-1.115c-.742-.426-1.472-.908-2.037-1.548 8.036 2.622 24.64 1.434 39.399-.091 13.499-1.391 27.029-2.293 40.63-2.32 13.602.027 27.137.929 40.63 2.32 14.766 1.525 31.37 2.713 39.405.091-.564.64-1.293 1.123-2.035 1.548a22.5 22.5 0 0 1-2.308 1.115c-1.592.645-3.234 1.15-4.899 1.564-.247.059-.496.113-.743.166 8.02 1.488 12.689 2.697 13.188 2.831l-2.138 8.11c.43-.194.864-.381 1.29-.574l1.202-.575c.2-.097.403-.199.607-.3l.166-.328c.146-.279.286-.57.419-.864.27-.591.528-1.199.764-1.816a42.235 42.235 0 0 0 1.241-3.808c.731-2.585 1.225-5.259 1.595-7.951.345-2.685.526-5.398.501-8.11a50.874 50.874 0 0 0-.179-4.059z" id="jkpath14" fill="#f4edae"/><path class="jkst2" d="M116.787 182.661c-1.064.16-2.128.295-3.186.375-.682.033-1.404.102-2.059.102l-.242.005c.822-1.837 1.446-3.26 1.919-4.339.963 1.08 2.188 2.417 3.568 3.857z" id="jkpath16" fill="#e6ccad"/><path class="jkst2" d="M119.101 185.018c3.304 3.272 7.398 5.146 11.904 5.479-7.569 3.074-14.702 4.26-20.197 4.63-5.478.367-11.032-.279-16.474-1.771.456-.082.79-.14 1.193-.189.447-.054 10.206-1.327 14.605-7.868l.413.009 1.08-.009c.731 0 1.395-.06 2.094-.087a43.69 43.69 0 0 0 4.878-.703c.167.171.333.338.504.509z" id="jkpath18" fill="#e6ccad"/><path class="jkst3" d="M128.464 87.071a98.82 98.82 0 0 1-1.048 1.343c-1.933 2.444-4.614 5.57-7.794 8.627a369.585 369.585 0 0 0-11.404-.177c-6.46 0-12.655.171-18.537.457 8.311-3.449 18.296-6.818 29.109-8.842a113.323 113.323 0 0 1 9.674-1.408z" id="jkpath20" fill="#656c67"/><path class="jkst3" d="M79.821 90.792c-2.966 2.084-6.317 4.744-9.566 7.971a360.155 360.155 0 0 0-21.567 2.81c9.207-4.232 19.713-8.127 31.133-10.781z" id="jkpath22" fill="#656c67"/><path class="jkst3" d="M181.48 107.969l-3.384 23.679-16.212 11.355-42.283-4.807-6.365-20.961a1.383 1.383 0 0 0-1.108-.971c-1.567-.253-2.953-.382-4.108-.382-1.16 0-2.541.129-4.115.382-.522.086-.95.461-1.106.971l-6.209 20.45-42.047 9.357-16.662-11.672-3.283-26.572c.715-.404 1.441-.806 2.176-1.209 1.031-.222 2.191-.457 3.475-.704l3.094 25.073c.048.392.264.741.586.967l11.462 8.032a1.425 1.425 0 0 0 1.101.213l34.57-7.692c.119-.027.237-.069.344-.124a1.39 1.39 0 0 0 .682-.827l6.225-20.498c1.67-.43 5.947-1.429 9.706-1.429 3.749 0 8.03.999 9.701 1.429l6.225 20.498c.161.532.624.912 1.176.977l34.57 3.927c.335.037.677-.05.952-.242l11.469-8.025c.31-.22.52-.566.573-.946l3.062-21.421c2.301.444 4.224.846 5.733 1.172z" id="jkpath24" fill="#656c67"/><path class="jkst3" d="M185.751 93.119l-2.976 11.29c-6.086-1.342-19.456-3.975-37.654-5.747 5.946-2.535 12-5.715 17.531-9.69 10.829 1.53 18.78 3.169 23.099 4.147z" id="jkpath26" fill="#656c67"/><g id="jkg32"><path class="jkst4" d="M63.841 128.441c2.357-1.274 5.021-1.085 9.19-1.079.447.011.908.005 1.39-.005.41-.005.822-.011 1.258-.022 4.296-.042 7.869.366 7.806-6.381-.065-6.746-3.062-12.198-7.354-12.155-4.297.037-8.454 5.564-8.197 12.306.07 1.756.328 3.023.742 3.937-3.745.938-4.777 3.254-4.835 3.399zm51.657-27.749a46.634 46.634 0 0 1-5.249 3.712l-6.097 3.68a52.065 52.065 0 0 0-7.331 1.467 1.216 1.216 0 0 0-.317.14 1.406 1.406 0 0 0-.629.794l-6.209 20.46-33.185 7.38-10.452-7.321-3.041-24.634c5.936-1.09 13.874-2.352 23.41-3.42a56.802 56.802 0 0 0-2.955 3.855l-5.677 8.149 8.266-5.511c.123-.086 5.387-3.549 13.998-7.761a377.407 377.407 0 0 1 35.468-.99z" id="jkpath28" fill="#e5caa3"/><path class="jkst4" d="M151.835 125.675c-.042-.16-.945-2.873-4.942-2.397.461-1.003.666-2.356.521-4.21-.528-6.731-4.443-12.08-8.735-11.931-4.292.152-7.042 5.731-6.805 12.478.236 6.741 3.84 6.694 8.132 6.543 5.77-.107 8.939-1.88 11.829-.483zm21.18-19.385l-2.992 20.944-10.539 7.379-33.141-3.766-6.183-20.363a1.41 1.41 0 0 0-.945-.934c-.205-.06-4.308-1.23-8.659-1.607l.795-.053c.687-.049 12.118-1.451 25.767-6.157 15.115 1.161 27.458 3.02 35.897 4.557z" id="jkpath30" fill="#e5caa3"/></g><g id="jkg38"><path class="jkst5" d="M63.841 128.441c2.357-1.274 5.021-1.085 9.19-1.079.447.011.908.005 1.39-.005.41-.005.822-.011 1.258-.022 4.296-.042 7.869.366 7.806-6.381-.065-6.746-3.062-12.198-7.354-12.155-4.297.037-8.454 5.564-8.197 12.306.07 1.756.328 3.023.742 3.937-3.745.938-4.777 3.254-4.835 3.399zm51.657-27.749a46.634 46.634 0 0 1-5.249 3.712l-6.097 3.68a52.065 52.065 0 0 0-7.331 1.467 1.216 1.216 0 0 0-.317.14 1.406 1.406 0 0 0-.629.794l-6.209 20.46-33.185 7.38-10.452-7.321-3.041-24.634c5.936-1.09 13.874-2.352 23.41-3.42a56.802 56.802 0 0 0-2.955 3.855l-5.677 8.149 8.266-5.511c.123-.086 5.387-3.549 13.998-7.761a377.407 377.407 0 0 1 35.468-.99z" id="jkpath34" fill="#c7b39a"/><path class="jkst5" d="M151.835 125.675c-.042-.16-.945-2.873-4.942-2.397.461-1.003.666-2.356.521-4.21-.528-6.731-4.443-12.08-8.735-11.931-4.292.152-7.042 5.731-6.805 12.478.236 6.741 3.84 6.694 8.132 6.543 5.77-.107 8.939-1.88 11.829-.483zm21.18-19.385l-2.992 20.944-10.539 7.379-33.141-3.766-6.183-20.363a1.41 1.41 0 0 0-.945-.934c-.205-.06-4.308-1.23-8.659-1.607l.795-.053c.687-.049 12.118-1.451 25.767-6.157 15.115 1.161 27.458 3.02 35.897 4.557z" id="jkpath36" fill="#c7b39a"/></g><path class="jkst2" d="M187.481 115.502c.508.419.911 1.504.456 6.558-.559 6.188-3.16 17.049-4.771 18.8-1.778.344-5.505-.064-7.778-.595.393-1.559.505-2.306.822-3.9l3.975-2.781c.317-.22.526-.566.58-.941l2.778-19.466c1.686.912 3.421 1.899 3.938 2.325z" id="jkpath40" fill="#e6ccad"/><path class="jkst2" d="M40.937 140.908c.199.704.408 1.407.624 2.1-2.139.628-6.495 1.23-8.465.886-1.633-1.645-4.679-12.966-5.345-18.978-.543-4.871-.162-5.924.333-6.334.575-.483 2.728-1.708 4.593-2.707l2.519 20.449c.048.393.257.741.586.967z" id="jkpath42" fill="#e6ccad"/><path class="jkst2" d="M121.347 141.194l-.151 1.305s-4.581 4.248-11.956 5.199c-7.375.95-13.171-3.582-13.171-3.582.242.788.586 2.567 2.256 4.086a53.184 53.184 0 0 0-6.313-.393c-.804 0-1.616.023-2.401.061-4.539.237-10.924 7.1-15.414 14.014-2.203.697-9.089 2.883-17.06 5.237-7.44-10.309-11.098-20.842-11.469-21.932l.005-.006c-.15-.419-.301-.839-.441-1.268l1.913 1.338v.005l4.726 3.309 1.58 1.101c.236.167.515.253.794.253.102 0 .204-.011.305-.031l43.435-9.67a1.385 1.385 0 0 0 1.025-.95l6.194-20.39c1.069-.145 2.008-.22 2.814-.22.801 0 1.746.075 2.815.22l6.374 20.997c.162.532.624.919 1.171.977z" id="jkpath44" fill="#e6ccad"/><path class="jkst2" d="M170.926 140.066l1.402-.984c-.232.973-.484 1.94-.747 2.896-1.949 6.248-4.25 11.774-6.805 16.656-.565.039-1.161.061-1.8.061-1.972 0-3.986-.167-6.215-.371-3.868-.355-10.007-1.058-11.946-1.283-1.67-1.332-7.385-5.873-12.14-9.615-.187-.151-.348-.291-.505-.42-.837-.708-1.789-1.513-3.717-1.513-1.751 0-4.308.638-10.489 2.508 3.212-2.401 3.233-5.5 3.233-5.5l.151-1.305 40.748 4.629a1.41 1.41 0 0 0 .955-.241l4.094-2.868z" id="jkpath46" fill="#e6ccad"/><path class="jkst6" d="M140.937 54.337c.124 3.625.033 10.194-1.655 16.345a1.335 1.335 0 0 0 0 .704 259.298 259.298 0 0 0-6.446-.591c2.412-5.054 2.938-10.436 3.052-12.332 1.852-1.317 3.696-2.896 5.049-4.126z" id="jkpath48" fill="#ebd599"/><path class="jkst6" d="M79.456 58.462c.112 1.896.638 7.267 3.046 12.317-2.149.171-4.297.37-6.441.596a1.328 1.328 0 0 0 0-.694c-1.686-6.139-1.772-12.714-1.654-16.345 1.353 1.231 3.19 2.81 5.049 4.126z" id="jkpath50" fill="#ebd599"/><path class="jkst7" d="M151.835 125.675c-2.89-1.396-6.059.377-11.828.484-4.292.151-7.896.198-8.132-6.543-.237-6.747 2.513-12.326 6.805-12.478 4.292-.15 8.207 5.2 8.735 11.931.145 1.854-.06 3.207-.521 4.21 3.996-.477 4.899 2.235 4.941 2.396zm-13.488-9.878a2.203 2.203 0 0 0 2.154-2.235 2.186 2.186 0 0 0-2.235-2.153 2.194 2.194 0 0 0 .081 4.388z" id="jkpath52" fill="#2d3136"/><circle transform="rotate(-1.049 138.093 113.428)" class="jkst8" cx="138.307" cy="113.602" id="jkellipse54" r="2.194" fill="#edf6fa"/><path class="jkst7" d="M83.484 120.953c.063 6.747-3.509 6.339-7.806 6.381-.435.011-.848.016-1.258.022-.482.011-.944.016-1.39.005-4.168-.005-6.833-.194-9.19 1.079.058-.145 1.09-2.461 4.835-3.4-.414-.914-.673-2.181-.742-3.937-.257-6.741 3.9-12.269 8.197-12.306 4.292-.042 7.289 5.411 7.354 12.156zm-6.634-3.529a2.195 2.195 0 1 0-.122-4.388 2.195 2.195 0 0 0 .122 4.388z" id="jkpath56" fill="#2d3136"/><circle transform="rotate(-1.473 76.78 115.216)" class="jkst8" cx="76.79" cy="115.23" id="jkellipse58" r="2.195" fill="#edf6fa"/><g class="jkst9" id="jkg64" opacity=".8"><path class="jkst6" d="M50.691 75.155s.667-8.692 2.03-12.023c.702-1.717 4.996-2.81 8.276-3.591 3.278-.78 8.508-2.342 9.524 2.264 1.015 4.606 2.653 7.963 3.746 9.446l-1.404-18.97-22.562 5.464-1.484 16.786.703 1.327 1.171-.703" id="jkpath60" fill="#ebd599"/><path class="jkst6" d="M164.855 75.155s-.666-8.692-2.029-12.023c-.703-1.717-4.997-2.81-8.275-3.591-3.28-.78-8.51-2.342-9.526 2.264-1.013 4.606-2.654 7.963-3.748 9.446l1.407-18.97 22.562 5.464 1.483 16.786-.703 1.327-1.171-.703" id="jkpath62" fill="#ebd599"/></g><path class="jkst10" d="M132.965 18.378s-.598 45.49-11.224 45.49h-14.875-12.752c-10.626 0-11.484-45.47-11.484-45.47l-5.22 15.438.085 21.183 3.707 2.947 1.685 9.096 2.357 5.307 45.482.084 2.105-3.791 1.769-6.4.254-4.043 5.023-14.341z" id="jkpath66" opacity=".75" fill="#ebd599"/><path class="jkst10" d="M166.429 60.794s2.187 15.692 7.974 18.522c5.788 2.829 0 0 0 0l-8.103-2.444z" id="jkpath68" opacity=".75" fill="#ebd599"/><path class="jkst10" d="M48.908 60.794s-2.187 15.692-7.975 18.522c-5.788 2.829 0 0 0 0l8.104-2.444z" id="jkpath70" opacity=".75" fill="#ebd599"/><path class="jkst7" d="M167.987 76.8c2.755.902 5.526 1.858 8.036 3.325-1.343-.532-2.729-.913-4.126-1.257a70.385 70.385 0 0 0-4.201-.924c-2.82-.531-5.65-.982-8.498-1.327-2.841-.37-5.687-.682-8.546-.924-2.858-.241-5.709-.483-8.573-.65-11.446-.704-22.924-.88-34.41-.892-11.483.006-22.962.221-34.409.897-2.862.166-5.715.409-8.572.651-2.857.241-5.71.548-8.546.923-2.847.345-5.678.796-8.498 1.327-1.407.264-2.81.57-4.206.919-1.391.344-2.783.725-4.126 1.257 2.509-1.466 5.28-2.427 8.041-3.331.232-.075.467-.139.703-.214-.015-.059-.032-.113-.043-.177-.048-.317-1.069-7.859.709-18.645.086-.516.456-.935.962-1.075l2.917-.831c.634-22.625 9.952-33.266 10.243-33.594-8.326 13.397-8.25 29.286-8.106 32.986l18.128-5.152c.016-.005.026-.005.042-.01.076-.016.151-.027.226-.032.021 0 .049-.006.075-.006a1.19 1.19 0 0 1 .297.027c.015 0 .031.011.053.016.075.016.145.042.224.075.033.016.054.033.086.049.058.033.119.07.177.112.016.011.034.016.049.033l.032.032c.016.016.037.027.054.044.012.016.494.493 1.262 1.209-.182-5.973.102-23.108 8.262-37.31-.172.498-6.646 19.428-4.415 40.645.724.58 1.486 1.149 2.229 1.649.359.247.58.655.585 1.09.006.07.161 6.833 3.148 12.586.042.086.074.177.102.268 7.429-.505 14.878-.709 22.312-.714 7.436.005 14.88.22 22.307.731.027-.097.06-.193.109-.285 2.986-5.753 3.142-12.516 3.142-12.586.01-.436.231-.843.591-1.09.741-.5 1.493-1.069 2.224-1.649 2.234-21.217-4.24-40.147-4.411-40.645 8.153 14.201 8.444 31.336 8.262 37.31a62.536 62.536 0 0 0 1.261-1.209c.016-.016.039-.027.053-.044.012-.01.018-.021.033-.032.016-.016.033-.022.049-.033.06-.042.119-.079.177-.118.028-.01.054-.027.081-.043.081-.033.155-.059.236-.08.016 0 .033-.011.049-.011.096-.021.2-.032.296-.027.027 0 .049.006.07.006.075.005.156.016.231.032.012.006.028.006.042.01l18.129 5.152c.146-3.7.221-19.59-8.104-32.986.289.328 9.609 10.969 10.237 33.594l2.922.831c.499.14.875.559.962 1.075 1.777 10.786.752 18.328.708 18.645-.01.065-.026.124-.042.182.239.07.47.139.707.215zm-3.297-.968c.14-1.207.789-7.809-.591-16.801l-20.52-5.833c.184 3.475.265 11.012-1.707 18.199a1.619 1.619 0 0 1-.101.258c.203.021.408.037.606.064 5.769.661 11.511 1.584 17.189 2.83 1.712.398 3.426.823 5.124 1.283zm-25.409-5.151c1.688-6.15 1.779-12.72 1.655-16.345-1.353 1.23-3.197 2.809-5.049 4.125-.114 1.896-.64 7.278-3.052 12.332 2.149.173 4.298.366 6.446.591a1.33 1.33 0 0 1 0-.703zm-56.78.098c-2.408-5.05-2.934-10.422-3.046-12.317-1.858-1.316-3.696-2.895-5.049-4.125-.119 3.631-.032 10.206 1.654 16.345.065.237.058.473 0 .694 2.145-.227 4.292-.425 6.441-.597zm-8.933.864a1.65 1.65 0 0 1-.098-.247c-1.975-7.187-1.889-14.723-1.712-18.199L51.244 59.03c-1.38 8.982-.736 15.583-.597 16.797 1.703-.462 3.411-.887 5.131-1.284 2.835-.628 5.693-1.154 8.556-1.638 2.869-.478 5.747-.843 8.626-1.192.205-.027.404-.042.608-.07z" id="jkpath72" fill="#2d3136"/><g id="jkXMLID_1_"><g id="jkg78"><path class="jkst7" d="M129.293 18.973v17.025h-12.068v-4.974h-2.72v22.981h4.109v12.85H97.505v-12.85h4.092v-22.98h-2.711v4.974h-12.06V18.973zm-3.626 13.408v-9.789H90.443v9.789h4.816v-4.974h9.964v30.225h-4.1v5.606h13.865v-5.606h-4.1V27.407h9.964v4.974z" id="jkpath74" fill="#2d3136"/><path class="jkst0" id="jkpolygon76" fill="#cb3349" d="M101.123 57.632h4.1V27.407h-9.964v4.974h-4.816v-9.79h35.224v9.79h-4.816v-4.974h-9.964v30.225h4.1v5.606h-13.864z"/></g></g><path class="jkst3" d="M30.694 93.119c1.759-.399 4.136-.907 7.051-1.47a104.37 104.37 0 0 0-6.222 4.597z" id="jkpath83" fill="#656c67"/><path class="jkst5" d="M95.111 139.78s.492 3.165-3.938 4.519c-4.428 1.355-32.482 9.716-35.682 9.263-3.199-.451-11.319-5.874-11.319-5.874l-1.969-7.004 12.016 7.492z" id="jkpath85" fill="#c7b39a"/><path class="jkst5" d="M120.242 139.167s-.354 3.182 4.131 4.345c4.484 1.161 32.875 8.295 36.05 7.704 3.176-.591 11.053-6.361 11.053-6.361l1.663-7.084-11.045 6.588z" id="jkpath87" fill="#c7b39a"/><path class="jkst5" d="M28.412 133.956s3.887 7.775 10.166 5.083l4.485 1.645-.448 3.29-9.419 1.195-2.541-1.494z" id="jkpath89" fill="#c7b39a"/><path class="jkst5" d="M187.551 131.822s-6.353 8.115-12.632 5.424l-2.019 1.302.448 3.289 9.419 1.196 2.54-1.495z" id="jkpath91" fill="#c7b39a"/><path class="jkst5" d="M89.279 192.904s23.03 11.611 49.106-4.188l-8.374-.571s-18.272 7.232-32.738 3.235z" id="jkpath93" fill="#c7b39a"/><path class="jkst7" d="M112.626 171.509l1.594 1.899c.036.046 3.577 4.26 7.906 8.552 2.879 2.853 6.357 4.297 10.343 4.297 1.361 0 2.791-.175 4.235-.523 1.34-.326 2.796-.673 4.287-1.03 5.384-1.287 11.482-2.749 14.438-3.577.585-.166 1.238-.315 1.925-.472 3.935-.909 9.329-2.163 12.187-7.889 2.149-4.297 5.047-9.874 7.197-13.961-1.863.859-3.816 1.79-5.203 2.52-2.138 1.123-4.938 1.667-8.558 1.667-2.152 0-4.266-.181-6.605-.389-4.675-.43-12.586-1.361-12.667-1.372l-.606-.067-.478-.383c-.071-.052-7.003-5.575-12.606-9.981-.227-.186-.434-.358-.621-.513-.59-.503-.59-.503-.942-.503-1.797 0-7.02 1.62-18.462 5.167l-.703.223-.689-.26c-.078-.026-7.585-2.81-16.581-2.81-.736 0-1.47.019-2.185.056-.901.046-5.958 2.448-12.425 12.68l-.419.657-.741.238c-.107.037-11.238 3.63-23.042 7.005l-.766.218-.725-.337c-.077-.031-4.696-2.174-9.091-4.194 2.397 3.541 5.462 7.958 8.159 11.422 4.711 6.067 10.649 11.674 22.034 11.674 1.428 0 2.945-.088 4.503-.265 11.581-1.309 14.563-1.837 16.168-2.117.543-.092.973-.171 1.522-.238.088-.011 9.571-1.237 12.232-7.206 2.744-6.134 3.298-7.595 3.319-7.651l.968-2.583s.12-.669.317-.877c0 .005 0 .005.005.005l.019.016c.305.219.757.902.757.902zM40.499 55.71c-2.516 1.014-5.016 2.06-7.46 3.209-2.449 1.119-4.856 2.32-7.155 3.66-2.121 1.222-4.157 2.563-5.954 4.076-.077.455-.149.952-.211 1.423a51.357 51.357 0 0 0-.388 6.068c-.026 2.713.16 5.426.502 8.112.372 2.692.864 5.369 1.594 7.952a41.963 41.963 0 0 0 1.243 3.804c.233.623.492 1.228.762 1.818.134.294.274.585.413.864l.172.326c.201.104.409.207.605.3l1.206.574c.673.311 1.6.751 2.366 1.093.046-.037.088-.078.124-.114l-2.231-8.511c.471-.129 4.717-1.227 12.032-2.619a33.744 33.744 0 0 1-1.775-.379 36.704 36.704 0 0 1-4.898-1.563 22.857 22.857 0 0 1-2.309-1.119c-.741-.425-1.471-.905-2.035-1.547 8.035 2.624 24.637 1.433 39.398-.088 13.501-1.393 27.028-2.293 40.628-2.325 13.6.031 27.138.931 40.63 2.325 14.77 1.522 31.374 2.713 39.406.088-.564.642-1.293 1.122-2.034 1.547-.739.42-1.522.782-2.309 1.119a36.965 36.965 0 0 1-4.903 1.563c-.244.056-.492.114-.741.166 8.02 1.486 12.689 2.697 13.186 2.832l-2.138 8.107c.43-.192.864-.377 1.288-.574l1.207-.574c.196-.094.404-.196.606-.3l.166-.326c.144-.279.284-.57.419-.864.27-.591.528-1.196.767-1.818.471-1.231.879-2.51 1.236-3.804.731-2.583 1.228-5.26 1.595-7.952.346-2.686.528-5.4.502-8.112a52.755 52.755 0 0 0-.176-4.059 51.573 51.573 0 0 0-.213-2.009 29.83 29.83 0 0 0-.213-1.423c-1.797-1.513-3.831-2.853-5.954-4.076-2.299-1.34-4.704-2.541-7.159-3.66-2.438-1.149-4.943-2.195-7.46-3.209a140.105 140.105 0 0 0-3.801-1.476c-1.267-.491-2.552-.956-3.835-1.423 2.696.445 5.369 1.06 8.013 1.739 1.724.446 3.444.948 5.141 1.481-12.11-31.658-41.07-52.272-72.685-52.272-31.622 0-60.576 20.614-72.684 52.272a107.832 107.832 0 0 1 5.135-1.481c2.651-.678 5.322-1.294 8.02-1.739-1.29.466-2.568.931-3.842 1.423-1.268.47-2.535.967-3.799 1.475zm159.43 18.316a53.972 53.972 0 0 1-.258 8.733 55.462 55.462 0 0 1-1.619 8.605c-.4 1.414-.86 2.811-1.404 4.198a38.295 38.295 0 0 1-.89 2.071c-.161.341-.331.678-.523 1.025l-.284.512a8.975 8.975 0 0 1-.348.574l-.294.457-.461.237c-.492.254-.895.445-1.342.653l-1.298.585a88.22 88.22 0 0 1-2.62 1.065c-.611.239-1.15.457-1.662.674l-1.444 5.487c-.036-.009-.471-.12-1.283-.315l-.078.574c1.594.833 4.726 2.522 5.793 3.403 2.148 1.775 2.299 4.587 1.823 9.841-.244 2.697-1.139 7.946-2.381 12.767-2.144 8.298-3.283 9.273-4.753 9.649-.746.192-1.894.383-3.008.383-2.266 0-5.353.063-7.429-.439-.533 1.888-2.055 6.812-5.068 12.962.151-.073.3-.135.435-.207 3.717-1.952 10.861-5.064 11.162-5.199l5.643-2.452-2.89 5.435c-.067.118-6.264 11.773-10.059 19.383-3.769 7.538-10.835 9.179-15.065 10.151-.637.151-1.241.291-1.733.425-3.035.854-9.18 2.319-14.599 3.623-.064.016-.13.033-.197.042a64.057 64.057 0 0 1-10.955 5.411c-14.568 5.518-29.923 5.208-43.844.092a647.05 647.05 0 0 1-9.193 1.097 45.12 45.12 0 0 1-4.985.291c-13.264 0-20.294-6.736-25.425-13.331-5.493-7.062-12.212-17.546-12.497-17.985L31 158.426l6.585 2.961c3.152 1.419 12.524 5.757 15.205 7 .217-.061.43-.124.642-.186-4.457-6.357-8.112-13.605-10.695-21.634-2.195.662-5.576 1.175-8.206 1.175-.961 0-1.822-.072-2.484-.228-1.471-.336-3.148-1.754-5.431-9.795-1.325-4.668-2.314-9.764-2.603-12.387-.57-5.121-.466-7.864 1.662-9.636 1.283-1.071 5.611-3.344 6.507-3.809l-.192-1.58c-13.75 8.08-21.991 15.22-22.157 15.366L0 134.302l7.005-11.047c5.544-8.755 11.948-15.832 17.84-21.284-.244-.098-.471-.196-.71-.294l-1.299-.585a34.907 34.907 0 0 1-1.34-.653l-.461-.237-.295-.457c-.166-.249-.238-.388-.347-.574l-.29-.512c-.181-.347-.358-.684-.518-1.025a30.878 30.878 0 0 1-.89-2.071 44.74 44.74 0 0 1-1.404-4.198 54.745 54.745 0 0 1-1.62-8.605 54.664 54.664 0 0 1-.259-8.733c.078-1.455.218-2.909.419-4.354.104-.725.213-1.45.358-2.17.15-.734.296-1.418.518-2.221l.155-.564.404-.317c2.294-1.802 4.768-3.163 7.284-4.369a78.87 78.87 0 0 1 6.311-2.616c5.943-16.493 16.162-31.118 29.591-41.311C74.337 5.57 90.664 0 107.671 0s33.334 5.57 47.218 16.106c13.43 10.193 23.649 24.819 29.588 41.307a78.282 78.282 0 0 1 6.316 2.62c2.515 1.206 4.99 2.567 7.283 4.369l.404.317.156.564c.227.803.372 1.487.517 2.221.146.72.26 1.445.357 2.17.203 1.443.348 2.897.419 4.352zm-11.995 48.031c.456-5.052.058-6.139-.455-6.554-.513-.43-2.247-1.412-3.935-2.329l-2.779 19.464a1.39 1.39 0 0 1-.58.942l-3.977 2.781c-.315 1.593-.429 2.345-.817 3.903 2.273.528 5.999.938 7.775.595 1.612-1.748 4.214-12.61 4.768-18.802zm-5.161-17.648l2.977-11.29c-4.318-.978-12.27-2.615-23.1-4.148-5.53 3.976-11.582 7.155-17.53 9.691 18.199 1.771 31.57 4.406 37.653 5.747zm-4.68 27.237l3.385-23.676a240.127 240.127 0 0 0-5.731-1.169l-3.059 21.422a1.415 1.415 0 0 1-.575.943l-11.472 8.023c-.27.192-.616.28-.947.243l-34.572-3.929a1.391 1.391 0 0 1-1.176-.973l-6.227-20.5c-1.668-.431-5.949-1.43-9.696-1.43-3.764 0-8.041.999-9.708 1.43l-6.228 20.5a1.388 1.388 0 0 1-1.025.947l-34.572 7.692a1.483 1.483 0 0 1-.306.033 1.36 1.36 0 0 1-.792-.25l-11.467-8.029a1.396 1.396 0 0 1-.585-.968l-3.091-25.072c-1.284.249-2.443.487-3.479.703-.734.405-1.46.809-2.174 1.213l3.281 26.568 16.666 11.675 42.047-9.354 6.207-20.449a1.389 1.389 0 0 1 1.108-.975c1.574-.253 2.95-.382 4.116-.382 1.153 0 2.536.129 4.105.382.528.083.957.461 1.108.975l6.366 20.956 42.282 4.808zm-8.07-4.411l2.992-20.948c-8.439-1.536-20.78-3.394-35.897-4.554-13.647 4.707-25.077 6.108-25.766 6.155l-.797.057c4.353.374 8.454 1.544 8.66 1.605.452.135.804.481.944.933l6.186 20.366 33.138 3.764zm2.303 11.845l-1.404.983-3.779 2.651-4.095 2.868c-.279.192-.621.28-.954.243l-40.746-4.633-2.966-.337a1.39 1.39 0 0 1-1.171-.977l-6.377-20.998c-1.066-.145-2.014-.219-2.81-.219-.809 0-1.751.073-2.817.219l-6.192 20.392a1.383 1.383 0 0 1-1.025.946l-43.435 9.672c-.103.02-.206.03-.305.03-.279 0-.559-.083-.798-.253l-1.578-1.098-4.726-3.307v-.011l-1.91-1.335c.135.43.289.85.441 1.268l-.006.006c.368 1.092 4.028 11.622 11.467 21.929a873.96 873.96 0 0 0 17.057-5.234c4.488-6.917 10.877-13.777 15.418-14.014a51.12 51.12 0 0 1 2.402-.061c2.221 0 4.344.16 6.31.393-1.671-1.517-2.013-3.298-2.256-4.085 0 0 5.793 4.53 13.17 3.584 7.378-.953 11.959-5.204 11.959-5.204s-.021 3.102-3.236 5.503c6.182-1.869 8.739-2.511 10.489-2.511 1.931 0 2.883.808 3.717 1.519.161.129.322.268.507.419a3519.302 3519.302 0 0 1 12.141 9.614c1.936.227 8.075.926 11.943 1.283 2.23.201 4.245.372 6.217.372.637 0 1.233-.026 1.797-.063 2.558-4.88 4.857-10.411 6.808-16.653.261-.96.516-1.928.743-2.901zm-15.034-51.593c-.01-.006-.02-.012-.031-.012a551.624 551.624 0 0 0-9.826-.651 905.6 905.6 0 0 0-13.667-.668 72.95 72.95 0 0 1-1.574 2.225c-2.479 3.355-7.398 9.51-13.704 14.729 8.926-1.6 24.409-5.56 37.803-14.905.336-.238.668-.486.999-.718zm-29.876.926c.377-.471.729-.926 1.044-1.34-3.281.331-6.512.808-9.67 1.408-10.814 2.024-20.801 5.389-29.11 8.837a383.259 383.259 0 0 1 18.54-.455c3.908 0 7.708.067 11.404.176 3.179-3.056 5.861-6.182 7.792-8.626zm3.587 102.085c-4.503-.332-8.598-2.205-11.903-5.477a271.86 271.86 0 0 0-.502-.512 44.25 44.25 0 0 1-4.881.704c-.698.026-1.361.087-2.091.087l-1.083.011-.413-.011c-4.396 6.539-14.159 7.813-14.605 7.87-.403.046-.734.103-1.191.186 5.442 1.491 10.996 2.138 16.474 1.77 5.492-.367 12.627-1.558 20.195-4.628zm-17.4-7.461a45.604 45.604 0 0 0 3.184-.378 138.958 138.958 0 0 1-3.568-3.857 398.441 398.441 0 0 1-1.92 4.339h.243c.658.001 1.378-.071 2.061-.104zm-3.354-78.632c1.827-1.103 3.582-2.366 5.249-3.712a422.33 422.33 0 0 0-7.278-.072c-10.137 0-19.606.415-28.189 1.061-8.61 4.209-13.875 7.672-13.998 7.76l-8.268 5.514 5.679-8.149a52.452 52.452 0 0 1 2.956-3.857c-9.536 1.066-17.477 2.329-23.41 3.422l3.038 24.632 10.453 7.321 33.184-7.378 6.212-20.464c.104-.337.331-.621.627-.793.098-.063.202-.109.315-.14.192-.052 3.51-.999 7.336-1.465zm3.816-18.788c-2.31-.036-4.623-.057-6.933-.062h-.005c-3.39.005-6.787.041-10.189.109l-6.269 2.971c-.005.005-.041.021-.088.048-.942.46-9.174 4.613-16.919 12.021 6.943-3.65 17.146-8.418 29.153-12.115a144.186 144.186 0 0 1 11.25-2.972zM70.251 98.761c3.251-3.225 6.605-5.886 9.567-7.967-11.415 2.651-21.923 6.543-31.128 10.778a360.846 360.846 0 0 1 21.561-2.811zm2.159-9.949a150.122 150.122 0 0 1 11.813-2.796c-5.798.212-11.6.481-17.393.808-3.366.186-6.715.414-10.065.667-1.678.129-3.345.263-5.007.445-.476.046-.942.098-1.418.16-4.369 2.614-21.127 13.134-32.631 26.889 11.179-7.769 30.654-19.443 54.701-26.173zm-30.85 54.197a68.861 68.861 0 0 1-.621-2.102l-5.162-3.612a1.391 1.391 0 0 1-.586-.969l-2.516-20.449c-1.864.999-4.017 2.225-4.592 2.707-.497.409-.875 1.46-.336 6.332.668 6.01 3.712 17.333 5.348 18.979 1.968.347 6.327-.258 8.465-.886zm-3.815-51.36a229.005 229.005 0 0 0-7.051 1.47l.829 3.127a103.93 103.93 0 0 1 6.222-4.597z" id="jkpath95" fill="#2d3136"/></g></g></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="tune" xmlns="http://www.w3.org/2000/svg"><path d="M6.85 2.852h-2v6h2v-6m12 0h-2v10h2v-10m-16 10h2v8h2v-8h2v-2h-6v2m12-6h-2v-4h-2v4h-2v2h6v-2m-4 14h2v-10h-2v10m4-6v2h2v4h2v-4h2v-2h-6z" fill="#fbc02d" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 50 50" id="twig" xmlns="http://www.w3.org/2000/svg"><path d="M9.727 47.556c-.125-.223-.297-2.168-.183-2.087.034.025.171.267.304.537.132.27.282.487.332.482.123-.011.075-1.196-.1-2.454-.331-2.398-1.176-4.435-2.358-5.69-.2-.212-.344-.4-.319-.419.093-.067 1.327.843 1.842 1.359.293.293.735.825.981 1.181.328.474.465.618.51.534.078-.147-.21-9.903-.376-12.701-.074-1.255.063-1.023.61 1.035 1.064 4.006 1.858 7.922 2.342 11.55.086.637.173 1.172.195 1.19.022.016.092.001.157-.034.888-.483 1.524-.667 2.55-.736.727-.048.945.062.35.178-1.15.222-1.99 1.013-2.344 2.201-.315 1.061-.327 2.707-.024 3.434.152.366.037.426-1.067.56-.716.088-.977.096-1.202.037-.356-.092-1.118-.098-1.195-.008-.031.036-.243.066-.47.066-.38 0-.423-.017-.535-.215zm1.974-3.233c.152-.205.072-.41-.204-.522-.225-.09-.263-.088-.437.025-.21.137-.252.43-.08.554.18.13.607.096.72-.057zm1.248.086a.763.763 0 0 0 .214-.203c.241-.33-.352-.622-.745-.366-.406.265.08.785.531.569zm2.288 3.094c-.033-.039.117-.387.334-.775.216-.387.411-.665.433-.618.07.152-.201 1.28-.33 1.372-.15.108-.354.117-.437.02zM8.2 47.092c-.29-.343-.221-.434.14-.182.176.123.321.263.321.31 0 .165-.279.087-.46-.128zm8.649-.145c0-.053.102-.18.227-.282.25-.204.312-.113.143.207-.095.18-.37.236-.37.075zm8.065-.827c-.243-.025-.48-.088-.527-.141-.11-.125-.114-3.043-.004-3.043.045 0 .132.149.193.331.127.38.228.42.31.124.094-.337.065-3.472-.039-4.297-.449-3.55-1.865-6.124-4.342-7.89-1.086-.774-2.653-1.436-4.047-1.711-.764-.15-.522-.224.598-.182 2.364.089 4.167.706 5.847 2.001a11.046 11.046 0 0 1 2.32 2.502c.453.682.64.854.64.584 0-.07.063-.882.139-1.805.679-8.26 2.396-15.1 4.984-19.86 1.86-3.422 5.108-6.817 7.885-8.244 1.397-.718 2.539-.988 4.02-.952.933.023 1.01.036 1.77.307a6.822 6.822 0 0 1 1.363.662c.612.407 1.309 1.004 1.235 1.058-.026.018-.343-.165-.705-.407-2.657-1.771-5.062-1.52-7.12.742-1.108 1.22-2.651 3.53-3.634 5.443-2.828 5.503-4.541 11.464-5.291 18.413-.163 1.509-.282 3.76-.195 3.703.032-.022.266-.52.518-1.108 1.597-3.723 3.578-6.428 5.79-7.908.672-.449 1.612-.904 1.715-.83.022.016-.172.22-.432.454-1.957 1.754-3.248 3.76-4.232 6.572-.938 2.68-1.366 5.588-1.368 9.3-.002 1.741.188 4.385.366 5.101.125.505.08.546-.585.546-.55 0-2.306.138-3.416.27-.414.05-.817.04-1.609-.036-.58-.056-1.129-.119-1.218-.14-.165-.037-.18-.014-.2.302-.01.186-.098.203-.728.139zm2.507-6.725c.294-.11.375-.22.375-.517 0-.63-1.309-.706-1.524-.088-.074.211.13.51.42.616.297.108.413.106.73-.011zm2.369-.052c.277-.222.318-.364.174-.611-.4-.691-1.755-.307-1.428.404.121.266.299.35.738.354.227 0 .387-.045.516-.147zm3.011 6.681c-.027-.05.088-.268.256-.484.879-1.135 1.22-1.544 1.284-1.544.04 0 .056.037.036.082l-.423.964c-.212.485-.445.924-.519.977-.169.122-.57.125-.634.005zm2.446-.596c0-.121.853-.683.896-.59.018.04-.056.209-.166.376-.168.259-.238.305-.464.305-.164 0-.266-.035-.266-.091zm-13.04-.124c-.177-.159-.493-.656-.462-.725.018-.038.248.1.512.309.264.207.457.405.428.438-.075.088-.371.074-.478-.022z" fill="#9bb92f" stroke-width=".078"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="typescript" xmlns="http://www.w3.org/2000/svg"><path d="M49 51h408v408H49V51zm246.669 314.879l19.463-1.702c.922 7.8 3.067 14.199 6.435 19.198 3.368 4.998 8.597 9.04 15.688 12.124 7.09 3.085 15.067 4.627 23.93 4.627 7.87 0 14.819-1.17 20.845-3.51 6.027-2.34 10.512-5.548 13.455-9.625 2.942-4.077 4.413-8.526 4.413-13.348 0-4.892-1.418-9.164-4.254-12.816-2.836-3.651-7.516-6.718-14.039-9.2-4.183-1.63-13.436-4.165-27.759-7.604s-24.355-6.683-30.099-9.732c-7.445-3.899-12.993-8.739-16.644-14.517-3.652-5.779-5.478-12.249-5.478-19.41 0-7.871 2.234-15.227 6.701-22.069 4.467-6.842 10.99-12.036 19.569-15.581 8.58-3.546 18.116-5.318 28.61-5.318 11.557 0 21.75 1.861 30.577 5.584 8.828 3.722 15.617 9.199 20.368 16.432 4.75 7.232 7.303 15.421 7.657 24.568l-19.782 1.489c-1.064-9.856-4.662-17.301-10.795-22.335-6.133-5.034-15.191-7.551-27.174-7.551-12.479 0-21.573 2.286-27.281 6.86-5.707 4.573-8.561 10.086-8.561 16.538 0 5.602 2.021 10.21 6.062 13.826 3.971 3.617 14.34 7.321 31.109 11.115 16.769 3.793 28.273 7.108 34.513 9.944 9.076 4.183 15.776 9.483 20.101 15.9 4.325 6.417 6.488 13.809 6.488 22.175 0 8.296-2.375 16.113-7.126 23.452-4.751 7.338-11.575 13.046-20.474 17.123-8.898 4.077-18.913 6.116-30.045 6.116-14.11 0-25.933-2.056-35.47-6.169-9.537-4.112-17.017-10.299-22.441-18.559-5.424-8.26-8.278-17.602-8.562-28.025zm-65.728 50.094V278.454h51.583v-18.399H157.938v18.399h51.37v137.519h20.633z" fill="#0288d1"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="typescript-def" xmlns="http://www.w3.org/2000/svg"><path d="M457 459H49V51h408v408zM69 71v368h368V71H69z" fill="#0288d1"/><text x="342.219" y="344.544" font-family="ArialMT" font-size="12" fill="#0288d1" transform="translate(-6058.94 -5838) scale(18.1514)"><tspan style="-inkscape-font-specification:sans-serif" font-family="sans-serif" font-weight="400">TS</tspan></text></symbol><symbol viewBox="0 0 24 24" id="url" xmlns="http://www.w3.org/2000/svg"><path d="M16 6h-3v1.9h3a4.1 4.1 0 0 1 4.1 4.1 4.1 4.1 0 0 1-4.1 4.1h-3V18h3a6 6 0 0 0 6-6c0-3.32-2.69-6-6-6M3.9 12A4.1 4.1 0 0 1 8 7.9h3V6H8a6 6 0 0 0-6 6 6 6 0 0 0 6 6h3v-1.9H8c-2.26 0-4.1-1.84-4.1-4.1M8 13h8v-2H8v2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="verilog" xmlns="http://www.w3.org/2000/svg"><path d="M17.282 17.08H6.718V6.513h10.564m4.226 4.226V8.627h-2.113V6.514c0-1.173-.95-2.113-2.113-2.113H15.17V2.288h-2.113v2.113h-2.112V2.288H8.83v2.113H6.718c-1.173 0-2.113.94-2.113 2.113v2.113H2.492v2.113h2.113v2.113H2.492v2.113h2.113v2.113a2.113 2.113 0 0 0 2.113 2.113H8.83v2.113h2.113v-2.113h2.112v2.113h2.113v-2.113h2.113a2.113 2.113 0 0 0 2.113-2.113v-2.113h2.113v-2.113h-2.113V10.74m-6.339 2.113h-2.112V10.74h2.112m2.113-2.113H8.831v6.34h6.338z" fill="#ff7043" stroke-width="1.056"/></symbol><symbol viewBox="0 0 24 23.999999" id="vfl" xmlns="http://www.w3.org/2000/svg"><defs><style>.jra{fill:#f05223}.jrb{fill:url(#jra)}</style><radialGradient id="jra" cx="205.45" cy="208.29" r="225.35" gradientTransform="matrix(.04556 0 0 .0456 2.888 2.88)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffd104" offset="0"/><stop stop-color="#faa60e" offset=".35"/><stop stop-color="#f05023" offset="1"/></radialGradient></defs><title>houdinibadge</title><g stroke-width=".046"><path class="jra" d="M19.97 3H4.03A1.03 1.031 0 0 0 3 4.031v4.135C4.548 6.977 6.563 6.21 8.948 6.21c5.107.003 8.35 3.574 8.348 8.081 0 3.13-1.46 5.485-3.746 6.71h6.42A1.03 1.031 0 0 0 21 19.968V4.031a1.03 1.031 0 0 0-1.03-1.03z" fill="#f4511e"/><path class="jrb" d="M3 17.722v2.247A1.03 1.031 0 0 0 4.03 21h1.837C4.474 20.21 3.49 19 3 17.722z" fill="url(#jra)"/><path class="jra" d="M8.948 8.231c-2.586-.09-4.598.86-5.948 2.264v3.163c.918-2.654 3.447-3.87 5.565-3.85 2.647.027 4.689 2.025 4.7 4.284.012 2.159-.892 3.748-3.33 4.14-1.33.213-3.411-.567-3.318-2.578.046-1.037.854-1.622 1.777-1.58-.905 1.213.293 2.102 1.139 1.921 1.048-.224 1.475-1.156 1.475-1.878 0-.762-.718-1.994-2.498-1.951-2.204.052-3.591 1.639-3.638 3.602-.056 2.468 2.253 4.091 4.622 4.121 3.48.046 5.543-2.24 5.539-5.586-.005-3.029-2.434-5.946-6.085-6.072z" fill="#f05223"/></g></symbol><symbol viewBox="0 0 24 24" id="virtual" xmlns="http://www.w3.org/2000/svg"><path d="M21 14H3V4h18m0-2H3c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h7l-2 3v1h8v-1l-2-3h7a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 281.25 281.25" id="visualstudio" xmlns="http://www.w3.org/2000/svg"><path d="M196.18 101.74l-52.778 42.444 52.778 40.889V101.74m-136.67 110l-30-18.889v-100L62.843 81.74l47.778 37 96.666-89.222 44.444 27.778v172.22l-55.555 22.222-85.111-81.555-51.555 41.555m3.333-48.889l20.667-19.111-20.667-19.778z" fill="#ab47bc" stroke-width="11.111"/></symbol><symbol viewBox="0 0 300 300" id="vscode" xmlns="http://www.w3.org/2000/svg"><defs><style>.icon-canvas-transparent{fill:#f6f6f6;opacity:0}.icon-white{fill:#fff}</style></defs><title>BrandVisualStudioCode</title><path d="M218.62 29.953l-105.41 96.92L54.301 82.47 29.955 96.64l58.068 53.359-58.068 53.359 24.346 14.212 58.909-44.402 105.41 96.878 51.424-24.976V54.93zm0 63.744v112.6l-74.719-56.302z" fill="#2196f3" stroke-width="17.15"/></symbol><symbol viewBox="0 0 24 24" id="vue" xmlns="http://www.w3.org/2000/svg"><path d="M1.821 4.15l10.21 17.618L22.24 4.235V4.15h-7.692L12.113 8.33 9.691 4.15H1.82z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179H5.937z" fill="#35495e"/></symbol><symbol viewBox="0 0 420 419" id="watchman" xmlns="http://www.w3.org/2000/svg"><g stroke="#fff" stroke-linecap="round" stroke-linejoin="bevel"><path d="M166.95 145.32a93.935 123.23 0 0 1 92.934 3.263" fill="none" stroke-width="18.467"/><path d="M162.92 137.96L44.63 256.25a174.07 173.93 0 0 0 5.705 16.486l123.68-123.68-11.096-11.096zM266.54 144.04l-11.096 11.096 117.16 117.16a174.07 173.93 0 0 0 5.691-16.5l-111.76-111.76zm170.65 170.65v22.193l17.1 17.1 11.096-11.098-28.195-28.195z" fill="#fff" stroke-width="1.963"/><path d="M167.52 273.36a93.935 123.23 0 0 1 92.934-3.263" fill="none" stroke-width="18.467"/><path d="M49.516 144.56a174.07 173.93 0 0 0-.809 2.213 174.07 173.93 0 0 0-4.757 14.344 174.07 173.93 0 0 0-.016.055l119.56 119.56 11.098-11.096-125.07-125.07zM454.87 64.703l-17.668 17.668v22.191l28.764-28.764-11.096-11.096zm-80.984 80.984l-117.86 117.86 11.098 11.096 112.18-112.18a174.07 173.93 0 0 0-5.416-16.777z" fill="#fff" stroke-width="1.963"/></g><image x="21.229" y="20.262" width="378" height="377.1" preserveAspectRatio="none" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAGjCAYAAABjSWGNAAAgAElEQVR4AeydB3hUVdrH/+fOpNMF JAFUmivFXtZuIBRRQUUTil1RV3et6Lr6rSu6rg3B1dXVtXeBCCioCASIimLDhkFsgAIJSAkhPZmZ 8z3vjReGMJlMueeWmfc88MzMLaf8zp3855zznvcV4MQEkoxA7sVr01PrUrv4pdZNBNA1AHQRkJ0g ZAcJrYOA7Aipv8/Q6JgUKdBkG0iZISDSDVwSaAfAY3z+/bVSAD56L+mfwA5INAqgSkrUCKA2IOQO IcQOIUU5pNwhNZQLia2Q2OyH3OJBxqaiwk4VzfLlj0wg4QmIhG8hNzDJCEgxJH9DjgfevgGBAyCx vxSyh5DoAWA/CHQH0MEFUOoBbJbAeiHEBiED6wMSv0DgF02In1J2Vq+ZP78fXcOJCSQMARakhOnK 5GrICaO3tE3P8B0kERgkgP6Qop8E+gqgL4Bdo5gEphKAwHpIrIHAjxL4DpCrAo1yVfHsHhsSuN3c tAQmwIKUwJ2bGE2TYsjY33qLQOBwCHk4JA6HhgE08kmM9ilpRQUgvwPE1xD4MiC0r2R67dfFz/eq U1IaZ8oETCLAgmQSSM7GHAIj8td38sN7HAROkpDHATgMTWs15hSQvLn4JLBaQHwqEPgQQiwvmpHz XfLi4JY7kQALkhN7JYnqlDd2w4GQnuMk5AkCOBHAQQD4ubTgGZDAFg1ieQCBj6Dhg7SKmhW8LmUB eC6iRQL8xW8RDZ8wn4AUQ8eVHib9YjCELj4nAOhqfjmcY4wE6iGxAkIsCwDvSel5v7iwa1WMefFt TCBqAixIUSPjG6IhkDtmQw/N4xkKTQ4TEkNZgKKhZ/u1DZD4CAKLIMSik/p3WzF5sgjYXiuuQMIS YEFK2K61p2GTJ0tt2Xebj5EyMArAab+vAdlTGS7VVAI0xSeAd6QQb2uBtIW8V8pUvJwZz9XzM2AG AdpoKqpTh3uEdlYA8gwBdDEjX87D0QQaALlMCLzha5Rz2NTc0X3lmsrxCMk1XeWsig6/YFOWr0Ge JoBzICWNhNo6q4ZcGwsJkFOKT4TUZiOgzSqate8aC8vmohKIAAtSAnWm6qaMHPljWl2bzBGapk2A lKMBZKguk/N3JYHPpMCrHuGbuWj6fqWubAFX2hYCLEi2YHdToVIMKSg7SQAXABgDoJObas91tZWA H5DvCeCV2rrUwg/ndqm0tTZcuOMJsCA5vovsqeDwszd19af4LwbEZQAOtKcWXGoCEaiCwAwB7emi Gd0+TqB2cVNMJMCCZCJMt2dFFnIflJQNh8BEgKbkRIrb28T1dySBlULIpzyBwCsLCntud2QNuVK2 EGBBsgW7swqlvUIer+cSQE7UPWI7q3pcm8QlUAtgtibFU4sKu70PCJm4TeWWRUKABSkSSgl5DTkt 3XSqJuVfJDAiRFyfhGw1N8qxBH4AxJP+hrpnit/otcOxteSKKSXAgqQUr/My18216wMXCOB6AH9w Xg25RklOoEoI8bzw+R5ZNKvnj0nOIumaz4KUJF0+YsyWbL/Xdx0gr5BAxyRpNjfTvQQCkPIdDdqD iwqz33NvM7jm0RBgQYqGlguvbfKmrd2MJrPtNBc2gauc5ASElJ8EIO4/eWD2m+xLL7EfBhakBO3f wfmlR2oCtwI4G4CWoM3kZiURASmwGpAPVLTPeXnFk6IxiZqeNE1lQUqwrs4bW3Y0AoF/QIjT2Vdh gnUuN8cgsFYK3LNPoPzFwsKBDcZBfnU/ARYk9/eh3oIh+WXHaELeIZs8bCdIq7gZTCAsgXUQuK9T oPw5FqawnFxzkgXJNV0VuqJD8zcdDCHvlvpG1tDX8FEmkOAE1gohJp/Yv9vLvMbk7p5mQXJp/w0Z u7mPkP7JACbwGpFLO5GrbS4BiRII/H3xzOw3eZOtuWityo0FySrSJpWTO760s8cv7wQEeVVINSlb zoYJJBAB+bGQ4uaiwpxlCdSopGgKC5JLuvm4/PUZmcJ7NSD/DqCDS6rN1WQCdhKY45f+vxYX9vzJ zkpw2ZETYEGKnJVNV1L4h9JxAuI+9jNnUxdwsW4mQFZ4//E31N/NLomc340sSA7uo2H5Gw7zC+3f AjjFwdXkqjEBNxDYKgVuPbl/9rNs+ODc7mJBcmDf5J61toMnNfVfgLgCgNeBVeQqMQF3EpD4XGja NRyTyZndx4LkqH6RYkj+pouEkFMAdHZU1bgyTCBxCEgIPFvvabx52av7lydOs9zfEhYkh/Th0HM2 95Ye//8ADHVIlbgaTCDRCWwWENcWzcyemegNdUv7WJBs7qncXOnVum66XoBMuZFpc3W4eCaQdAQE xFyfz//n4tk9NiRd4x3WYBYkGzuEjBak0J6WwJE2VoOLZgJMANgJIW49qX+3J9jowb7HgQXJBva0 pyhLeO+QkJPYaMGGDuAimUDLBJYJgSuKZuR81/IlfEYVARYkVWRbyHfouLJcBPCUhOzbwiV8mAkw AXsJ1EOKe3Z07HYvh7mwtiNYkCzinXvx2nRvTdq9EriOw0JYBJ2LYQLxEfgCUlywuDB7VXzZ8N2R EmBBipRUHNcNGVt6hJB4CcCAOLLhW5kAE7CeQB1tqF0yI/thdtiqHj4LkkLG+fnSUy7KbpWQ/wBE isKiOGsmwASUEpBLPBouXji9+3qlxSR55ixIih6A3DEbemhe7WV2+6MIMGfLBKwnsA3AxMUzc96w vujkKJEFSUE/D87fOFoT4lkA+yjInrNkAkzAVgLyv/7MhknFz/eqs7UaCVg4C5KJnTpy5I9p9W3b TBGQf2HDBRPBclZMwHkEVnr8KFg4K2e186rm3hqxIJnUd0PGlO4vPHgdAkeZlCVnwwSYgLMJVEHI yxfP6D7d2dV0T+1YkEzoq6H5ZadLIV/gKToTYHIWTMBlBIQQj6bsrLpp/vx+9S6ruuOqy4IUR5fo VnRa2Z1S4jaeoosDJN/KBNxP4DMhcW5RYc6v7m+KfS1gQYqRvR6zKCXtVQiMjDELvo0JMIEEIiCB LR4p8hcVZr+XQM2ytCmapaUlSGF5+WUDvKnpn7EYJUiHcjOYgAkEBNAlIAKLho7deI0J2SVlFjxC irLbh+SXni0EXgTQJspb+XImwASShICAeC6lsuoqXleKrsNZkKLglVdQeiuAf/F6URTQ+FImkLwE lnkatXMWzun2W/IiiK7lLEgR8KL9RQ1tsyia60URXM6XMAEmwAQMAmsDHjFq6WvZJcYBfm2ZAAtS y2z0M7njSzt7/JgD4MRWLuXTTIAJMIFQBCqkkAVLZnRfGOokH9tNgI0adrPY611u/vq+Xr9YzmK0 Fxo+wASYQOQE2gsp3h4ytnRi5Lck55UsSC30+5D8smM8wvMhB9JrARAfZgJMIBoCXiHxVN7YjXcC kmemWiDHYEKAyRu76QzIALkDyQpxmg8xASbABGImQBZ4vt+6XVFcLHwxZ5KgN7IgNevYvPyNl0EI MmDwNDvFH5kAE2AC5hCQmJ9Zh3PnzcupMSfDxMiFp+yC+nFIQdlNEOIpFqMgKPyWCTAB8wkIjKxJ xyLy+GJ+5u7NkUdIet9JkVdQRvuLaJ8RJybABJiAVQS+9kvvqcWFXTdZVaCTy0l6QZo8WWrLVpU9 JoE/ObmjuG5MgAkkJgEB8ZNPw7Di6dnrErOFkbcqqQWJvHVvF2UU2fXCyJHxlUyACTAB0wn86pf+ vOLCnj+ZnrOLMkzaNaTcXOndLja9zGLkoqeVq8oEEpfAfh7hfW/4OaUHJW4TW29ZUo6Q8vNLUreh 42tCYEzriPgKJsAEmIBlBDZDiiGLC7NXWVaigwpKOkEiMSoXnQol5GgH9QNXhQkwASagE6C4SprU 8ooKu61MNiRJNWVH03Q0MmIxSrbHnNvLBNxDgOIqSREoGjq2tL97am1OTZNmhEQGDNtE6asCosAc dJwLE2ACTEAlAVkGIXMXz+jxg8pSnJR3UoyQfreme57FyEmPHteFCTCB8ARENqS2mJw8h78ucc4m gSBJUS7KHgVwfuJ0G7eECTCBJCHQwyM8i3LHbOiRDO1NeEEaMrbsHt70mgyPMreRCSQsgQM8Hu3d kfllXRK2hb83LKEFaUjBxluExN8SvRO5fUyACSQ4AYGBjQjMG5q/vX0itzRhBSlvbOmVAuLeRO48 bhsTYALJQ0AK8UcpamfT1pVEbXVCCtLg/I2jIfEYgKSxIkzUB5TbxQSYQDABMWS76Phsogb5SzhB Gjxu0x81IV7jEBLBDzG/ZwJMIIEInJc3tuyhBGrPrqYklCCReaQIBOYByNzVQn7DBJgAE0g0AhLX Dc0vTbj18YSZ0iILlEaBjyRk0tjsJ9p3jNvDBJhAVAQkpBy/uLD7jKjucvDFCTFCokW+Bsg3WIwc /KRx1ZgAEzCbgIAQz9IyhdkZ25VfAgiSFPoin8DxdkHkcpkAE2ACNhHI1AKBuYmycdb1gjS0oOz/ AJxn08PAxTIBJsAE7CbQ1ePV3kmEPUquFqS8/LJzJXCX3U8Dl88EmAATsJnAwVLUv+R2c3CPzRBj Ln5o/qaDIeRbABJ2k1jMcPhGJsAEkpHAH3oPrNTWlkxb6tbGu9LKLu/sDfsgRfsEQB+3gud6MwEm wAQUEJBC4NyiGTmzFeStPEvXTdlRKAmkaLTxlcVI+ePBBTABJuAyAkJKvKDPILms4lRd1wlSudj0 LwDDXMiaq8wEmAATsIJAG6kFZrnRyMFVgkQ+6iTkX63oUS6DCTABJuBaAhL9Aqhznc871wjS0HM2 99aEeIEdprr2K8IVZwJMwEICQmBMXsGmGy0sMu6iXGHUkHvx2nRPddpHEDg87hZzBkyACTCBpCEg G4UUQ4oKc5a5ocmuGCF5a9IeYjFyw+PEdWQCTMBZBESKFGKGbpnsrIqFrI3jBWno2NIxHII8ZN/x QSbABJhABARkDlI8z7lh06yjBWnImNL9IfF0BMT5EibABJgAE2iRgByVl192bYunHXLCsWtItN9o O8reBztNdcijwtVgAkzA5QTqhSaPK5re/UuntsOxI6RyUXo7i5FTHxuuFxNgAi4kkBaQ4tVRo0od G8DUkYI0JL/sGAlBXrw5MQEmwASYgEkEhMRBtZnifpOyMz0bx03ZDb9gU5a/PvAFgANNby1nyASY ABNgAlIKeeqSGd0XOg2F40ZI/nr/AyxGTntMuD5MgAkkEAEhpHh2RP76Tk5rk6MEacjYjcMBcZXT IHF9mAATYAIJRqC7X3gedVqbHDNld8LoLW3T0xu/BbCf0yBxfZgAE2ACiUhASoxZUpgzxyltc8wI KT29cQqLkVMeC64HE2ACyUBACPnYiRN+6eiUtjpCkIbll50C4AqnQOF6MAEmwASSg4DITvN7pzml rbZP2ZFNfE0GvuGAe055JLgeTIAJJB0BiZGLC3Petbvdto+QajPEP1iM7H4MuHwmwASSmoDA407Y MGurIOWNX3+IRMBV8TqS+qHlxjMBJpCoBA6oyRB32N042wRp8mSpwe99AhApdkPg8pkAE2ACTEDe OHjshkPt5GCbIC0r2XQlII+zs/FcNhNgAkyACewi4NWkeEIfLOw6ZO0bWwRpZH5ZFynkPdY2lUtj AkyACTCB8ATEse9/V3Zp+GvUnbVFkBqaxKiDumZxzkyACTABJhATAYl7cs9aa8vfZ8sFadi40qMA 2KbAMXUQ38QEmAATSBICAuiipabfZUdzLRYkKQIB+R8AFpdrB1oukwkwASbgTgIC8uph+RsOs7r2 lgrDkPxNFwHiWKsbyeUxASbABJhAVAQ8AWgPRXWHCRdb5qnhd48MPwDobkK9OQsmwASYABNQTEAI eVbRjO5vKi5mV/aWjZBq0sVNLEa7uPMbJsAEmIDjCUgpHjjyCmnZXlFLBGnEmC3ZEPJmx9PnCjIB JsAEmEAwgQM7lJddHXxA5XtLBMmX0vhPAG1UNoTzZgJMgAkwAQUEBG63KkSFckEafk7pQZC4SAEm zpIJMAEmwATUE9gn1Z/yV/XFWGB+7feARkdeKxrDZTABJsAEmID5BITENXnjN+9rfs575qh0hPT7 Jthz9iySPzEBJsAEmIDLCGSJQODvquusVJACAZC/OstMy1XD4vyZABNgAslKQEp5xfD8Tb1Utl+Z IA0pKD0ZwDCVlee8mQATYAJMwDICqX7NTwFVlSVlgiQgbQ/2pIwaZ8wEmAATSEYCUpw/ZOzmPqqa rkSQ8saVngSIIaoqzfkyASbABJiALQS8Aj5la0lKBAkBOdkWVFwoE2ACTIAJqCUgxflDz9ncW0Uh pgvS0PzSE3l0pKKrOE8mwASYgCMIeOFRY3FnuiBB4FZHIONKMAEmwASYgBICEvK84eM29jQ7c1MF KW/8+kMkMNLsSnJ+TIAJMAEm4CgCqb6AuMHsGpkqSPB7yL0E7zsyu5c4PybABJiAwwgI4PIR+es7 mVkt0wQpd1zZAQDGmlk5zosJMAEmwAQcS6CNT3j/bGbtTBMkLYAb2WedmV3DeTEBJsAEnE5AXntc /voMs2ppitPT3LPWdhCQl5hVKc6HCdhNwOsVaN9WQ1amQFaGQEaGhox0gdQUAaEBaali19x0Q6PU j1OdG30S/gDQ0CDh9wPVtQFUVUlUVgdQXRNATa20u2lcPhMwk0DnLOE5H8BTZmRqiiBpqekTAcnx jszoEc7DUgIkLL3396JvrxT03T8FPXK8yNnXgy77eJTUo7pG4tdSH9Zv9OGXDT78vK4Rq39uRFV1 QEl5nCkTUE1AAtcD8mlAxP1rK24DhNxc6fV0LfsZwH6qG875M4F4CXTqoOHQAWk4dGAqBv0hFQf0 NOU3WbzV0gXqu58asXJ1A75YWY/NW/xx58kZMAGrCAjg1KKZOQviLS/ub6O3a9mZksUo3n7g+xUR SEkROKR/Kv54eJr+v3t23I+8kpr27O4F/R9+StN0/MZNPnzxTQM++7oeK76pR31D3D8+ldSbM2UC REBKXAUgbkGKe4SUl1+6FAK53C1MwCkEaK3n2CPSMfiEdBx/VLpTqhVXPZZ9WocPP6vDxyvq9fWo uDLjm5mA+QQCwu/pVzRr3zXxZB2XIOXllw2AkCXxVIDvZQJmEKCR0PFHpWHw8Rk48ZjEEKGWuJAw LXq/Fp98WY/GRh45tcSJj1tLQEDcXzQz+2/xlBqfIBVsfBQQptqhx9MYvjf5CPQ5IAUjB2fgrFOz kq/xAN4qqsE7i2vww5rGpGw/N9pRBLZ2kuXdCwsHNsRaq5gFadSo0syaDGwE0CHWwvk+JhALAbKM yzsxA6OGZ6Jfr5RYski4e0iQ5i2qwdIPa1FXz6OmhOtglzRISHleUWH3V2OtbsyCNLRg46US4plY C+b7mEC0BPbt4sGoYZkYdybvMAjHbtbb1Zi7qAYby3zhLuNzTMB8AhIfLC7MoWjhMaWYBElKeeCM udULXp1TeQDtq+DEBFQSGHRQKkYPy8SQE03bEK6yuo7J+73ldZi7sBpfr4p5BsUxbeGKuIOApkE+ PLnTjQMOSv93LDWOWpBIjAB8T4XNW1iDp1/bCRalWNDzPa0ROO7IdH1a7pjD0lq7lM+HIfDNqgZ9 xFT8UW2Yq/gUE4iPAE2fP35fZyOTvwsh/mV8iPQ1FkG6F8AuSwoWpUhR83WREsg9PkMfER0yIDXS W/i6CAjQxtt5C6t1Cz3JExsREONLIiXQe78UPDlllxgZt3mFEFHt8I5KkKSU5E9lr4lpFiWDP7/G Q+CUY2lElIXDBrIQxcMxknsfeqoCbxfVRHIpX8MEwhJoQYzontOEEPPD3tzsZLSCdCqAkAWQKP3v 5Z1s4dMMMH9snQBNyZHFHE3RcbKOwKofGnTLPNrTxIkJxEIgjBhRdjOFEFGFJIpWkF4EcEFLFSdR eviZipZO83EmsAeBA3unYPTwTJw6OHOP4/zBWgLkmohMxskbBCcmECkB8gP59INdWru8vRBiZ2sX GecjFiQpJf3VqDZubOmVRaklMnzcINCxvaabbp9zuns3s1IYCWMdJjNDoLau6XNKCnaFojDa65ZX GimRVd53P/ImW7f0mV31pC0Y40a30Wc2WqnDJUKI51u5ZtfpaASJhl7Td90Z5g2LUhg4SXxKCGD8 WW1w6bi2jqZAISHWl/qwcZMf5OR0yzY/tu8IoKIygIqdgV1CFK4RXg/QsYMHnTtq6NTRg25dPdi/ hxf75XhBZuxOTrSPqfCtamzdHtV6tJObxHUzkUAUYkSlLhJCDI+0+GgE6U0AoyPNmEUpUlLJcR15 Vrj1Guc59aA/urRP59vVDbr7nTW/+pT7hyNh7pHtxYADU3BQ31TdiKNnjvO8kD8/sxKvzK6KSICT 4ynmVkYpRgawbCHEJuNDuNeIBElK2RHA9nAZhTrHohSKSnIdoz+8Z52a6Shfcx9/UY9PvqjDFysb 9BGQE3qka2cPjjg4DUcflgayNnRSuu/RHSj6gA0fnNQndtQlRjGiql4jhHg0kjpHKkgUnvzZSDJs fg2LUnMiyfP5vDFtcMlYZ0zP0R/UpR/V4qtvGxwfW4g8lx91SBpOOCYNp+Y6w+CDnLjSd/nnX3h9 KXm+wbtb2r6thosL2kayZrT7pt3vioUQg3d/bPldpIL0NtmUt5xN+DMsSuH5JNpZp3hYIKuxhe/V 6kHu3BqmgcSJggtS4D4nxHZ66fUqvPh6JU/jJdqXNkx7sjIFJo5vF6sYGTnvK4T4zfjQ0murgiSl bA9gR0sZRHqcRSlSUu69zuMBLhvXDgWj7bOeW7fBh/lLavQpJjJASKTUrq2GYSdl4KqL2tnerH8+ VI73PmYzcds7QnEFTBIjquWVQognW6tuJII0HkDM7sSDK8CiFEwjsd4POzkDt/zZPqMFGg3NXViD L1bWJxbYEK0ho4hDB6TqXi3sXG+a/U41XplTpVsehqgmH3I5ARPFiEgsFEKMaA1JJII0E0B+axlF ep5FKVJS7riOwoVfPLYtzjnNnlHRzHnVmLeoGmWbk9NEOWdfjy5M+WfYw5+e0keeqdB/DLjjieVa RkKA9tZdPiHuabrmRXUQQoT1nNCqIAUCcqYQ5gkS1ZBFqXk/ufOznaOiFwsrMXt+DaqqE2taLtYn gf6AnD0yyzYjkjcX1GD2/GqOwRRrBzrsvusuax/vmlGoFh0phPgi1AnjWKuCNOutquvHnJ71kHGD Wa8sSmaRtD4fWiuiX0/n2vCr/IXCSsycW+14Sznre6WpRK9XYMxpmbjiPHvWmZ54aSdef6tVhy52 4eFyIyCgSIyoZE0IEdbPPHnvDpu2+f5y7uqfGo/PO8nc4Gh/6JOCju09+OTLxJ/zDwvYZSfJ0uvZ aV0w4EBrvQ2QEP3ffeX63iF/cs7ORfSkBAJAyfeN+tpOba3EkYdYG0vqqEPT0KG9B6Wb/dhZyaPX iDrNQRepEqM/3bK14sWnMqesWnVnfILUa9Ckh0s3+Tuv/qkRLEoOenJsqArtKbpuIhldWpdmzK3C P6aU47Ov6sFCFDl38rNX8kMjXn2jGo0+icMHWSdM9GPzrFOzUF0r2S9e5F1m+5WqxOiav28lLyjp dahatGbV1F/DNTTsCGnI2M19hJR3UQbk14tFKRzKxD3X94AUfVOclc5Q58yvxgOPV2Dph3U8PRfH o0UjppXfNWDGvGpoAjjYQj96Rx+ahvbtPPh5nU93PhtHM/hWxQRUidH1d2zDqh9+30wtsGltydQl 4ZoSVpB6DbxxrADOMDIgUfplgw+nHMfTdwaTRH+lX7p33dwR/XqnWNLU5Svq8PgLO/HGuzU85WMi cRpdfvltAxYva9o71L+fNVOuB/VNAVkA/rYtgJ/WsZcHE7vUtKyuubQ9Ro8w3yMIiRH5iAxKaWtL pj4d9Hmvt2GNGobkl84SAmOa30V7H26/gdzbmZvY0MFcnvHmRhswrTTnfvQ5EiJnLoiTFdthA9NA 01H7dfcip5sHbTI1tMnSdMwNjVIfBZBn8A2lPtAG3a9K6rH2170CLMfbLabcT/uYRg/PwinHWec3 j4wdyOiBk3MIkBidaY0YUaP9XunvuqCwZ4t+UVsUpPx86dkuyrYCCLnbUZUokfnof54Na6runN5M 0JrQegMFzjvpj9b8saJ1ohdmVoH+qDsppaUKDD4hA8NPzsAhA2IbUWwvD+CDT+vwzmJn+oEbNSzT 0nXBjz6v04MB0pogJ3sJqBKjG+7YhpV7jox2N1SK/MWF2a/vPrDnuxYFKS9/w3EQ2kd7Xr7nJxal PXkkwieaXrnyAmtMht9bTt4VqvXwD05iRzvUzz29DS44t42p1fr863p9Ayn9UXZS0jToa4QTzja3 veHa+NyMptAW4a7hc+oIqBKj2+7djk/D/dgQeHLxjJwrW2pZi2tIvQbedJEQGNLSjXSc1pNUrCnR vDMthn7KJuHh8Jt+jqboLjjXGu/cT76yU18r2rzFOTbcNCKiP8r33baP7prHbMA53bz6iOsPfVJR XRvAxjJntJ0s8mh9icJy0B6zvr3UrxfSKJy+4zSlSdF3OVlH4M8Xt1MSDqZVMWpqYoe1JVMfaam1 LY6QhuaXLpACEUX645FSS3jdcZz2FNHUDXleUJ30Hf3vVDsmDhG1lzaTjh1tvZcDGimR/z0aOTkp 0ZoC/YK2Kt37nx1YvIzjLVnBm8SIPHqYnSIUI71YKf09lhT23BiqDiFHSLm50ivaVP0XQEQT5zxS CoXWHcdGDc/EnZM6os/+6n8VP/x0BV6aVYXKKmdsmKTRwLgz22DaHftYuk/HeDIoSuzQkzJ0I4kd lQE4ZbT4/c+NmPVONVJThCUboGmt0uMR+KpkD4ssAxO/mkTACWJETdEgVqxZNW1lqGaFFKRex151 tJDy6lA3tHSMRaklMs49ftn4tpg4Qf16EVnO0eZWChXuhETesmmt7N93ddajtNpdpwN6pmBEbia6 dfVie7kfW7fbL9iNjdBHbr+W+nGyBRFsDx63vWsAACAASURBVOmfqntuIevE6hqewjP7mVQlRpOn lmP5iihH+EJsXVsy9a1QbQwpSH37T5oAgWGhbgh3jEUpHB3nnOvYXsOV57eDFRtdyWKSgrrV1tn/ R4aEiPZVPfqvziAXN05LfQ5IwWl5mejU0YMt2wIor7BfmNat9+mjWlpfG/SHiCZMYsZKJvW0zWB9 qR9ULidzCKgSI4qJ9cEnMRnoZK0tmfpYqNaFXEPKKyibC8hRoW6I5BivKUVCyZ5rjjksDffc2kl5 4bQ2MnNuFTY5wGiBhIj+0N9wuXXrImYApvW2eQur9T1NZuQXbx4nHJ2OO28yf/9hqHqRN/cXX68K dYqPRUHgTxeocYIcb4DGVCm6zi/M3tK8KSFHSL0GTnpYADGvfPFIqTlmZ3ymxcxbrwm5rczUCj79 WiWeea0SVQ6YeqHQ3/+7vwsorLrbElmbjh6RpW++JWG321np+tKm0VJ6qoaBikdLhw5MA0XI/ea7 BvicYYzotscHThUjAtkoRPG6kqk/Noe6lyANz9/USwp5W/MLo/3MohQtMbXXTxzfFpeOU2vSvWRZ LR5+Zifo1e405MQMkH8uFRZFVreN3PzQVGN6uoYNZfavsaxYWY9fNvpwyrFqrTIP6puqm+GvXN2I Tb+xKkXz3CkTo3+bE7peCPnz2pJpxc3btJcgHXDwDacC4tzmF8bymUUpFmrm3pOWJnD1Re2Vxy4i bwsPP70Tv2219w8HucK59rL2utFC1857Pd7mwrU4NxqV0BoLWb+tXe9DXb1963L03SaHrRlpAqr9 4tEot6IyALL+49Q6AVViNOVxMs+Pac0oRKVFw9qSqS81P7HXN7b3oJsmAji2+YWxfmZRipVc/PfR lM+F57bF6UPNd5wYXLsHn6jQg+YFH7P6PcVposXb8We1Qbcuez3WVldHaXmDDkpFwag2ujB9v6YR ZBFnRyKHrZ99XY/ynQEce4TaKdE/Hp6u7xejDbycWiYwcUJbFIw23+MGidGCYlNnPjpflP/gA8XF e8ZH2suoIa9g43JAmCZIBjo2dDBIWPOad2KG8vUicoY7Y16VrdMpZC1HfvdIkJI1vTK7Cq+9UWXr iClnXw/yz2ijIuz1Ht1Khh5Pv7rTEVabe1TMAR9IjGhfndlJgRjpVfT40X/hrJzVwfXd46ckOVSt FVX/BmD6LkkeKQVjV/ueHkrVgfTojyB5bq6qtmfaiJydXj6haR8VbTBN5kR7eMjlEfXEdz82gmIg WZ0qq6Ue/ZnqQF7RVSUa9Xfr6sGOioDt08Oq2hhLvm4TI72NQi5vvkF2D0HKOfjKgwBcHwuQSO5h UYqEUnzXkPHChflqjRfuf2yHvpM/vprGdnf/vim4dFw7XH1RO9CGUjsTTR9R8Luff/FhQ5kfASn1 zZ121YmE4PwxbdDogx5M0w5h+mZVA35c68OQE9QZPPTaLwWnDs7E9h0BikRqF27HlKtKjMizyjtL TJ2m24OZEFi7pmTaouCDe0zZ5Y0tPQ8SLwdfoOL9iNwM3HyV+ebHyR66QtUGOOMZoCm619+2xw9d v14p+nTQaUPUrocZbW3p1fDYTYEEySlp89Q2S9MNSM4bY/7USfOyWvtMDmxnvV1tS+j3lBShj2DH nBbz7pHWmqeff3lWFZ6fWRnRtYl4kSoxeuSZCt3PokpmUorFSwqzhwaXsccIqffASRcBOD74AhXv KaTx5q1+0EY7M1Oyegnvso8Hl09ohzNPVfflnzm3Gv99YaflfugO6OnVR3yTrmwPEiW7Erk9euqV nfr+KtqP01KimE7kk418wdEIhabT7EpHHpKGC85pq6+30FSelYnaTgYPZAlI9VCVaOqW9iuFDXmg qnCb8724oK0+VWt2NawQI6qzEGi/tmTqA8H133OEVFBKw6c9FCv4YrPf80gpfqL0B2/a5H3izyhM DnZEcqV1IfJArvoXdphm66dKvm/QfynG6o2a3DSRqfa4s+wfMVE/vrmgOuTIrjUO8Zy3IuAjjd4L 36pC6WZ7tx3Ewymae0mMzj/H/GfKKjEy2iok9i8qzPl112fjDb3mFWwsBUR28DHV71WJ0pz51Xjs +cQOl2yFJd3N/9ymx8pR/RwY+dOUF5luF4xWN9ozymrt9YH/7sDC98yZQ9+3iwdnjshCwSj72/XQ UxV4u6imteabep6CAF51oZrQB8EVjSYMQvB9bnqfKGKkM5cYubgw512D/64puxMn/NLRG/DcbZyw 6lXV9B1t1mvbRkOihkomx6g3XKHONxv5orvlX9vx68aWp6fMfkbox8kjd3dW7pamtXrTH2zyTk7P plmJPFiv+KYeRR/U6lN5FIPKrkRulAb8IVWfygs3/Whm/Wi9jb6LZHBxxMHqpvDyTsrAth0B/Jig xg6qxOh/L+3EnPnW/kjRny8hvlpbMnW58aztEqQDD/rrURC41Dhh5SuLUnS06aGk0BGqEnldePyF naD1EKsSmS3/5RJ1AhtJO2hK6//u367UcovMo8kwYulHTUYRqr0ctNTunH29GHx8Bsj4wMrNpt+u brJKpLJVJRJcenLJ4i+REhnKXKTAgpbEqPCtaptQiQ1rS6bONQrfJUi9Dp40EsAZxgmrX1mUIiNO bkFUrkfQw0lB9KxMNNq74jz1cZlaahO1+dZ7t+um0i1dY/ZxcpRKI4YPP6unxV0c2Nseg42DD0rV nbeSAYJViUZlbxXVIC1NA4WcUJHIBD4zQ8Pn31jXLhXtMPIkMbpkrPk/Qu0VI2qdrF9bMu0Zo527 BKn3oEkXmOkyyCggmlcWpfC0/nJJO6WL/HdOK8f8peasmYRvye6zfQ9IsSykwe5Sm96RR3ISom+/ t9YCLbgeFPPo4y/qdXGiUOoUE8nqRKO01FSBL1ZaN6Kg+FiffFkP8rWoKs4STYt2bO9ByQ+Nlo72 ze6/xBUjIiXarS2Zep/BbJcg9Rk46RoA/YwTdr2yKO1Nnhb6aUGYFsVVJLJQuu/RHVi52ro/SEY7 aPqxn8Wjg+dmkBCV61M6ofYSGXWz8pWixH74WR2+WtUACoZn9aZf8o9nbFy3st0kghSm5OjD1Kwr 0QisXRtND3hIG2ndllSJ0bPTKzFjrl3TdHv0QlrvQ/76xNpvH9Qrs0uQeg2c9A8Anfe41KYPLEq7 we/X3YsJZ6nzETb7nWrQ2okdsXbItFvFBund9PZ890JhJf7vvnJ9zcQOLwZ71ib0p81b/Hj/kzpQ yIWMdIH9e1jnFql9O49pVoWhWxf6KO2RIiexZDWqItEPnjOGZeplbCxzj1m4KjGiH2SvzrF2Wj5c v2oy8Maakmnr6RpdkJp82FVOBcQugQqXgRXnWJSAwwel4rF7OiubZ6fQ4k+/at8ud/rCDein3tqM /O7d/sB2fP51gy1eC2L5vlD8n/eW12HVj43IzBCwwl8f+Yhb9UOjLXt5SCjeXlyL9FSh7Hknwftt WwA/rbNvijbSZyH/jCxMnGD+uiqJEX0fHJWE9t6akqlfU510Aeox8KoDpMCNjqokoJvdqvDo4AaT 8NzjM3D3X9WFGievC9PftPfBJFdH7dtqyh676W9UYfK0cny8ot62EA3xNo42epJF3k/rfPo2hpxu akdM6ekCxcvNinkTXeuNdSUKRKgqIi15hSfvEbSu5NREYnTlBUkiRmTWAJSsLZm6lPpDf7r98PcF 9nDa4Ji+MmJwmD21Y0QSdeLmWfJQoNJb9z8p6qNNf3SMB8vrgbJf/TPnVYOmIrdud8/0jMGlpdeP Pq8D/acfKqOHZYJc5qhIJx6Trlv92bm29uTLO1G+w6/kjzIxu+L8droFnhN94CWbGFF/aEAf41nW BUlqYn9h3ZYTo+yIX5NJlFQ9kAbsa2/fhlU/WG+8YJRvvHbsYP7sMDkSJQ8dm7YkjhAZvIzX4o9q Qf8piuqo4Vkg7+dmp306emwXc9oXQ/14x40dzW6enh+53UlPE3oIFSUFxJCpqu8+OaB13DRdEB8p sb/xUf+r0HvQjWcC4hTjoBNfk2FNidZUVMwbU3+SJR25VdlQZp73gXieE/pjkD/KHF9cNBp64L8V IH9zZLGVDIlCXsxfUqOviZgdnHDRB7Uod4BFGnkJ+fDzemiK9mmRWTgZcnz6pf17lc4ckYmrLzZ/ Y7grvKELYG3J1Ifoe6uPkITUekp9b7Ozv8qJPFJS5RKEetSJfv0aTJjCp82VJLQ//2JCZs5+9Fus 3btLa7CguAan5WXihsvN/4PWYsEWnfh5XaPuZd7nB+iPttmJ8iTBe+H1Sj3on9n5R5IfRTy+5lLz +84VYtQEKCc3V3qLi4VPHyEdMOCma4RA70jg2X1NIo6UKKYJuc5RkWio/uQr9lnStdQm2ogZT7hl cm1EFkO0sZQTdN9t5GFjZ6XEMYfHt6eHhN4JIySjX/1+6KMYVcYOtFcpI03Tpwgrdlr7PJEYXXtZ UosRdbOW0rby6Z+/nbZTN3ESQvY0Ot8NrzRSomiGZicydCDLLyuT7groTDVi9NQrlfofbSvbw2XZ R4AMEd54txpTHt9hXyUUlkzGDuRdQ0UaNTwTz0ztAnKlZFVSJUZkPetEg41wXGUA+9F5w+a2R7iL nXhu3qIaUOwOs5OVokTid+4Zarwv/PupCpCTVE5MIJEIvPZGFR58wvzvvcHooTv3gdlrckbewa8q xcjOvYXBbYzmfUBqetgjbdSoUpqYNX9yNpraxHgthUhwqyjRnLFheh5j81u87Z8PlevOK1u8gE8w ARcToHUzitOlKt11c0cMO1mN1wiqM4VZUTFNRyMjN4oRMZEIdKNXrTrTY2lAPrMfIpWiRNNpZidy B3PdZe2VLNBSXW+6axve+9iejY1ms+L8mEBLBChkxgXX/qYbtbR0TTzHb/lzB9AoxuykKiCpm8WI GAsNXejVK4Xs7OQ9SJE8ECRKlMz+1WFMpz3xkjmRZ7MyBSaObwearzY7kbXZ7Hersd7CgHpmt4Hz YwLRECjb7Mdjz1cgINVY4NHfE/JcMdMkJ6QsRmF6V4ocOuvVAgFXj5CMJjpdlLp29mD8mWqcpJIY Pf3aTlBUUk5MIF4CNbXWWprFU18yB//PsxXw+SQorpbZieJ0kfd18vsYT1IlRq+/Ve3aabpmPHXH 3l4BdEmUP2NOFaVuXTwYO1qNGJFVFXnr5sQEzCIg3aNHu5r8+Is7dR91tLnc7ERRWj2aiNlyjdw9 me36jNpIYmTW7I3ZzKLPT+xL93ghRQe4fc4uqPVOE6Xe+6XgySlqonok1gMZ1In8lgnEQID2pdXU Slx+nvmRVcnVkNeLqEcjpxybjr9f1yGG1oS/JfG++1KHpEnR9CZ88911lkRJhfUdrSlFY+jQr5c6 MaJFzMT5deSu54tr61wCtNVh2pNqzMJpI3c0338So9tvMN8XX+KJkf486aA0IPEEiZpntyhRBM7H 71MzMiKXIG4173TunzKuWaIQeGdxDf4xpVxJcyL9UapKjMgNWIL+EG0aIQkI8yVcyaMQfaZ2iRIF 1vv3nftEX+EI7qBpCbftwo6gWXwJEzCVAIXquO4favYqkSiF8+hysqKRkRN9UprYaem5F69NJ08N 5jtSMrGW8WZltSgdc1gaptyuRoz+99JOR7uRj7ev+H4mYCaBku8bcOmNW5TsVaJN7aEcotL3/x8K pukSXIyaur06q4NXAubv/jTzqTIhLxIlSqr3KdHDeM+taqK8PvxMhZIvlgl4OQsm4FgCFMLi+cIm /3dm7/8zPIXTd5OSqu9/UogRgFQEMryQSHdosFhTH3LVovTFynplYnT/Yzuw6P1aU3lwZkwgWQiQ B+9HnlWzgdYQueUr6pR8/5NFjOhZDABtvBCIz1e9i55qlaJkeHUwG8fkqeVY9im7AjKbK+eXXATI EzptoA0EpOk+JEmUDGEyk+qbC2rw2PPJs8fQ70EmBehL6DWk5g+IKlFqXo4ZnynC66df2R/N0oy2 cB5MwAkE6A88xVdS9QPSrDaSGJGAJlMSgUAaCVLSjJCMznWDKN04eRu++a7BqDK/MgEmYBIBMpuu b5BQ4dXBjComoxgRN02KtmRll24GRLflQaLk1OHw9XewGLnteeL6uosAbZ+g/XxOS8kqRkY/0Agp aRMtGHo9wJUKwkzECvWKm7diza+Nsd7O9zEBJhAhAdrP1+iTuGSs+a6GIqzCHpeRk+Rkm6YLBiAR aJPUgkQwCt+q1pnYLUr0ML65sBrr1vuC+4jfMwEmoJDAK7Or0NAgbf9RSt9/w3xcYXMdnbUAPCRI zvh5YCMqu0WJHsbpc6uweYvfRgpcNBNITgL0/acwFuG8L6gkw2K0my4JEq0jJX2yS5ToYXx5dhW2 lbMYJf1DyABsI0DT936/NH3zfGsNYjHak1DST9kF47BalOhh5MB6wT3A75mAfQTI0Ims71TELgrV Khajvanw6KgZExIl8hmnOrEYqSbM+TOB6AksKK7FPx9S4yk8uDb0/f/fy+r/zgSX6Yb3JEgujA+p Fq1qUWIxUtt/nDsTiIfAex/XKRUl4/tfV58osbrjob3nvSRITZ4H9zye1J+yMgVy9lU3m0luRkYO yUxqxtx4JuBkAocMUOcvgL7/+WeYH2rdyTwjrZu6v7qR1sBh15EYTRzfTolvquCmUuRJEWR2Hnwu Gd5npFPrOTEB5xG47rL2yr//FBKdEsc2293/EvCzIO3mAavEyCiS9j4JAcyc17QXyjieDK8eXr1M hm52VRszMwQun6D+x6gBhUXJINH0KqBV0Z8FdiUNWC5GRldccX47x/rUMurIr0wg0Ql0bK9ZKkYG TxKliwuSfiuogQM0Qkp6d9JWj4x20f/9DbkuSfEKHr43BxPmcy0vCIehw6eiIdCtiwdjR7dRPk3X Up14pNREJiBkJQlScvk4b/ZU0DDdijWjZsXu9ZEeSq8XePpVtjHZC06IA7SJkRMTiJdA7/1S8OSU zvFmE/f99P0nv3rkyihZk9S0eg0yuUdIVs4Zt/agjTuzDSZO4OF7a5z4PBMwg0D/fs4QI6MtNFPi 1JAYRh1Vvnr8qNEgkncNyQprmmg7kESJLPA4MQG7CGRkJL4F5CEDUvGfu+0fGTXv42QWJQ2o0gSQ lNuFnShGxsNJ0SztcvRo1IFf3UugPs64jhr9VUjgdPxR6Zh2xz6ObWGyilIDtNqkXENyshgZ35Kz R2aB/jAkc3wUgwW/RkegsZHX11oiNuzkDNzy5w4tnXbMcRIlSkm1ppRVvUOTkOodNzmmmwFVYvT6 73GVzGzqmSMy9fqmpyX2L1YzmXFeTKAlAqOHZyoTI4pAa3YiUco/I8vsbJ2aX13x873qvIDY4dQa ml0vVWJ0273b8elXTdbzNN1mZiI3I5QK36pC6WYOUWEmW84reQgUjMoC7flTkcgZK/m/o2SMbMwq xwgcakQiMCtfB+aj65AmZHIIkhVi9MRLO6FipESi9OIjXXFQ3xQHPkdcJSbgbAIXntvGEjGi6bWX Z5lvtk2ilAQjJX2mToOQCT9CskKMjK8kiZIqV0CP/qszjj5MndNHow38ygQShQBto7gwX81Witsf 2D0yMniRbzoWJYNGNK9NAyNNAluiuc1t11opRgabJ1/eielvmv9LifK/99ZOGHJChlEUvzIBJtAC Ado+QdsoVKS/3bMdy1eE9rqmUpTMXhJQwSa2POVmuk8LaFpZbBk4/y47xMigQh4XVPxSovxvu7YD Rg3j8BUGa35lAs0JXHNpe6j64339Hdvw+dfhPa6pEiUSWTLOSMC0ldrkFVLobxKtgXaKkcGSHkpy B2L2Qiflf93E9qANjDPnJp+ncIMvvzKB5gQ6ddBwwTltlfmlu/KWrfh5XWPzYkN+pu8/JcNXXciL Yjh47WXt9bso5HrCJCFLqS3erBp/WU2CzQA5QYyMB4UWOn0+4PLzzJ/HvuK8dsjK0KDC5NSoP78y AbcQ+EOfFDx2jxrvCxTldfa71Vi/0RcVDhIl8lFp9tRhoomSDDQtHWnz5uWQzCaM1DpJjIwnd8bc KvzvJTUOMcj31VUXqjFnNerPr0zA6QTI+4JKMZo+typqMTKY0fS9ijVlEqVEmb4T0DYRLyNM2gYD nptfad7Y2LdjZjuC9xnFmi/tI3jkGTWO1c85PQvU9pQU3kAba//wfe4lcFpeJu66uaOSBtDI6OnX dmLzlvj2AKoUpTOGun9NSRMB3ZZBjxgrpVgvhDxQSY9alCn9QSbPBmanux4q37XpNd68ac63vkHi 5qvMd11CbScXZLPnV2N9aXTTCvG2i+9nAnYRoDhGKqbDqT1vLqjBo89VQJrkickILWP29N31l7fX 16oXFNfa1Q1xlys0/EqZ6CMkoQXWx52jjRmoEiPagf3+7zuwzWoePTQkcioSjQ6fe6gLDh/Ee5VU 8OU8nUWAjIVUidGc+dW6H0mzxMggp2qkRD9yR+S61hjA37ApRx8hNU3ZSbhWkFSKkeEOxHiYzHol kbv5n9vNym6vfKbc3glDT3Ltw7lXe/gAE2hO4OqL2imLHUTeVh57Xs2aL7WDREmFRxcXi1JpcbHQ p3V0QZJC6MOl5p3u9M9uFCOD6Zff1uNPt2zFO4vV2JP87S8dcM5p5vrVM+ruhFdaxD7qEB4JOqEv rKxD504e3eHwGEXP9qtzqkDeVlQnVW7GXClKQQMifQ0JkL8C7loQd7MYGQ/7T+sa8eLrVfD7ocQY 46qL2qFDew3PvGa+J2KjDXa9nnB0Ouh/8Ue1mLuoBt+sijMIkF0NMbFcjwf6jxBVTkRNrGpMWR06 IBVTFcYxou0TVoZ7MITP7A28JEqNPmDJMpesKQUNiHRB8gY8P/pFIKaHxI6bEkGMDG5bt/vx3xeb fpGpsBAcf1YbZKQLPPqc+l99RpusfM09PgP0f+F7tZi3sBrf/RTZpkUr66i6LCEAGjEksvk/rY/Q H1pVibZl2OFRW5Uo3XZNB/h9cpcXclXczMlXrjHy8dCbIwZOqawVlbcCQv9snHTiayKJkcE3EAA+ +bIebdto6N8v1Ths2utBfVPRsb0Hm7b4UbHTGT88AhIgsTQr9TkgBWT+26mjB1u2BVBe4Yx2mtW+ UPmQEJ11ahZ0p7uHmjd9+eaCauxwyHNC7R53Vhtcc0mTd4JQHOI99u+nKvDGu2qmziOp2+ff1CMz Q8OAA8397p9yXAZ+2eDT/0dSD7uuEZDPrymZ9iWVrwvQqlV3yt4DbzofgHPj+gL6XhsVpt3B8Uzs 6hQq97Ov1DyYlDftYj9zRBbW/OrDr1HuNlfBhKYUzj2jjel7pw7snaL7+WvXVmsS4MrEFKbTh2bi v/d2xjGHmydERj/TNHJdvUm2zkamMb6SN5ILzjXvh0vzakyeWo6iD+yf2iJRUvGD1BWipImpa7+d qtsx7BoR9Rk4aSSAfs07zCmfE3FkFIotPZgej8Ah/c39tWSURdNbldUSqx0wtdW/Xwp65vy+jGlU 0KRXGhWSAGdladj0mx87qxJDmIafkoHrr1DnXLeqOoDnZ6rxVB9N12ZmCPzpwvagTd+q0rW3b8OK b8I7SVVVdqh86QdpMoqSP+C9bd2qKfpDt0uQeg2adAyAY0OBsvtYsoiRwfmrkgb9F+qRiqzIjjks TRc9KsfOJCFw8rHpSqswoF+qPq2Vnq5hQ5kP1TXO+OUfbaPph8S1l7bX14q6dNr1tY02m1avX/5F vel771ottNkFBx+UiosK2mLkYPM3ulNR5H2BRkY0neW0pFKUflzr078DDmvzzqWF3f5u1GnXk917 0KT9AZxhnHDKa7KJkcG95IdG/LY1gOOPVvMHm0ZgNK21YmW9aTvRjbpH+kpThxeca77T2VDlD/xD qm6BlpoisHa9zzFTUqHqGnzsxGPS8eeLm+L67Ntl19c1+BJT39Pifumm+NzkxFMhcoMzeVJH9NpP TXRk8r7wyLMVqKl17g8TVaJEcdRoZmSjjf0b4tn4Zm3J1KeM47ue8D4DJmVA4FLjhBNek1WMDPZk Fk4PUJ6iTa40rUW/trduD2BbufVTWrQLnkYsVkbBHXRQKgpGNa1d/bCmEY0ONcr74xFpuPrC9nro gpx91UxrGs+Z8frdj436pk3js9Wv5HlBpck6bUb97wvusDZVJUr0t8RhorR4bcnUN4xnbZcg9Rt4 fVVAaLcYJ+x+/csl7fSpFrPr4RQDhkjbRb9mPvi0DgJCN0yI9L5Ir+vbKwW0QL55qx8/r7N+CoP+ CLZv58FBfdX8Im6JA00LkZUfrddRHWgvmBPSUYem4U8XtsPFBW3RI9saITLa/ez0Sqz5xfpngJwC k+cF+qGgKlGwzKddth+PREnFd8NJoiQhX1tbMu1Do993CdLPqx6q7T3wxisBYc0cilGDEK80RXH2 SPMXM+9/bAeWfBg67HCIajjm0I6KAFaubkCbTE2JKFFDaZMppa9t2GBK0Tc7tPMoa1u4jqSpSwrh QRM4q35oBJng25EOGZCKyye0xcQJ7ZQZeoRr18x51SicZ32wx4EHpuLisW11k/1w9Yvn3JMv78Qr c+w31IilDZ9+mdiipEnt32tWTf3RYLNLkOhArwE3jxQCvY2TdryqEqMpj+/QN0/a0SYzyiQzaZV7 laiOhw5M09eVSJSsHDHQ1N2n9GuwrfUjJaNvDhuYpk+PEWea0rBKmPr3TcGl49rpI4QDelo7SjTa To5En/h9c7ZxzIrXkUOawkb03l9du+/9zw68VWTfHiMzOKoUpa9WNcQdWiOeNgrg1jWrpu6Ky7OH IPUeNOkQAMfHU0A896oUIze7Zg9mSsN4r1fgYEVm4bSuRCOGb75r0PfxBJet+j198eoaJFRZF0ZS /yMObhKm2jqJ739uVGbw0Wf/FN2SjEIH0KZeuxK5ynnyFetdS106ri2uPF9tYMnrbt+m/4izi62Z 5aoSpRG5mfji2wb8ttWWOettiwtzCjVkfQAAIABJREFU/i+Y056CNHBSVwBjgi+w6j2LUeSkv/y2 AVWKjQGGn5Jpy36lku8b8frb1boQqBLdSEjTWs4F57RFTZ3U15giuSeSa2jf1QXntMHNV3cAbeK1 Ky1fUYfHX9iJtxU5922pXZ06aLj8vHYw239bcHlk1v23e7Y70cQ5uJpRv1clSqcOtkeUpBTL166a +mIwiD0Eqc+gSWRz9OfgC6x4z2IUPWVaiCevC7Q/RVWi/UoZGZrlmwdp2oxEd96iGgT8AFnG2ZVI mC48ty12VjWNmGKtR86+Hpx/Tlvcek0HJe6hIq0X+fp7bnqlbk1ntfkvmbBTmHHyGqIqGaEjGhqc a9YdT9tJlMgNmNkM7RAlTcjZa0qmLQrmsYcgHTngwfJaUXUTAHVPTHDppH6KDBhozShRpumaIdv1 kfbxqLTAo4Jo0blrZ3tMw8l9DU0nLHivVl/Tor1EdiVy0UPCtG1HAD+uidxWvMs+TUL09+s7mu6r LFoW0/5XgUeeqcDPNljSnX9OG9D0pMr0YmElnplu/fSjyjaFypvWkhNBlITEY2tWTVsZ3Ma9Yk7k FWxcDghLPDawGAV3RezvyckmsSRHmyoT/TGjMOx2pe7ZXowelqnUnUwkbaNRBnkWX/R+bYtrTB3b a/pGXHIManci56E0NWd29NNI2kWbry/KbwsVPiiDy3/46Qp9RB18LNHfX3dZeyVha668ZSt+Xhf5 j65YOQuBAUUzcr4Lvn9vQRpb+m9IXBd8kYr3LEbmU504vq3uGdn8nHfnSFMihsv83Uetfdeze5Mw qdgaEG1LSJRopEpGEB4N6NhBQ98DUkBTfXYnCjlCnrvtECJqO7mF+scNHZVj+L/7tieM8UK0sFSJ 0hU3b8WaX5WKUsVJA7I7TZ68Z9yjEIK0cRykeC1aMNFcz2IUDa3orqXF4j9doNZ6iUK70wjBbl94 ZKlGMaTI3Qyn3QTI/Y9hGLL7qLXvaGMvTdOpTGS88PLsKmwrt8VCTGXTosrbpaK0aPHMnOHNG7rH GhKd7HPQLTXQpLIREotR8y4w9zNt7ly3wQdyO68qHdDDC7LCa2gEvv3ePgetFPPo4y/q9bAdZApv p/m0KtbR5EuRgW+9dzu+/V7pL9uwVdqvu1f3MpE/Su30MW3kJTdANDJN9kTfQRWb5unH3rJP69XE FhPylbUl04qb991eIyS6YEhB6W8C6NL84ng/sxjFSzDy+7t38+Lc07OUzDEH14KcVU5/swpbttn/ K5W8HdAak0rLw+C2O+X9C4WVeO2Navh89v5xpj9g9GtddbIruqvqdsWTf1amwMTx7ZR835VM3wlt 1OIZ3d5q3ua9Rkh0Qe+BN51EMd2aXxzPZxajeOhFf29lVUCfV8/KND8SZXBtyAcdCd9v2wIgZ7B2 ps1b/Hj/kzqQp3QK206/1hM5kX82GhF9sbLBMs8SoXimpQndKSo5R1Wd/jGlPOGtZ2NhSE6CVY6U Fr5Xq+99jKVuoe5Jlbj+p1VT97KQakGQbuwJiGGhMorlGDlOHHOa+UP4ZDDtjoV38D3kJ67BB5AH ApXp+KPS9TDMX5XUg8KT25nKNvtRvLwOZA1Hgd5UBQG0q43kXeH2B7brU5VWungK1V4ajf7v/s6g uFMqE60X3fVQue7WSWU5bs5bpSileIW+FGBSPLHvFhbmTAnFOqQg9Rn0Vz8gJ4a6IdpjtMCuIuoj mbLOX2J/6OFoedhx/berG/S9J4MVbqKldg04MFXf/PnLRp8jgp9RXJ+lH9Xhp3U+PRJnTjd3j5im v1GFO6eVY/mKekeEzZg4oa3ug0/1M134VjUee36na4MrquYTnD+JEq0jZ2WY64iZNuKmmidKs9eW TN1ruo7aEVKQ9usyZZOWVTUJQFw/e0iMVLgIof0wtIufU+QE1pf68M6SWqSlqgljEVyTU47NAE3j kLcFJyRqe9EHtfi11I8O7TRYEejOzHbTAv49/9mBDz6pc0RgwWOPSMNVF7XHqbnqrRtpi8FLr7vT U7eZz0A0eTU0Sn00QwJipkcHs0RJSPlQ8w2xRvtCCtK6dXcG+gyYdAoE+hgXRvuqUozs3JwZLQcn XU9RMmmXN8WfoXhAKtOgP6Tqng0oTLRTQkWvW+/TvT5s2uJHp44ePTihSgbx5j3r7Wrc/98KFH9U 65jRAe11u3Zie0tiNd3yr+1Y/AHPgsTyHNHUGlnbOlGU/H55/brvpoWMlBhSkAjAAQMn7S8EhsQC g8UoFmrW3UMjF4oSe9xRasKjB7eEzM8zMzR8/Z29C+/BdSLXOfOX1FjGILjsSN6/8W41pjxeoY/q yDjFCYnWCGktmLxDq07U/kl3bQeNbDnFTkC1KJERRdQRlwXWLH29+90ttapFQeo98AYfhLispRtb Os5i1BIZZx3/cW2jbpGmKhJtcGv1taUxbWyLShtcl+D3xOClWbSxMoDjjlQvzsFlh3pPcXumPlGh W5FV7HSGENH+LgoaSBGcaSuB6vTcjErQfiq7jTVUt9Oq/FWKEu19ilqUBApbWj8iJi0K0lEDp5bV iqprAUT8TWUxsuoxM6ecHTubTMPT0zRY4biUotKSb7MNZT49tIU5rYg/F3KWSsK0s1KCnKhancik lox0SJBos69T0ojcDDx+b2dLng1qM5l0v2NxOAynsFZZDxKlX0t9GGNyFG5aU4pWlATEA2tKppa0 1N6QG2ONi/MKSmcDONv4HO6VxSgcHeefOy0vEzdeoX5To0Hi6dcqQVZjTkvkqJb2VV2p2P0StZvW huYuqsE3NoSND8edfAWeOTxTubNeow40RUcjI/rDyUkdgd77peDJKZ1NL4BM8p9+LSIryIBX+rss KOy5vaVKtDhCohv6DLipEwROb+lm4ziLkUHCva80fbXkwzp4NHMtc1oiQvuiaCqPDC2ctlZAZrOv zKlCQ4Oa/VsffV6nmzFPf7Pa1vDRofrmgnPb4I4bO4IiB1uR6IfJs9Mro1+LsKJyCVYGjb7JFRB5 1DAzGSOllasbQLHMwqTPFxX2eCTMeYQdIeXmr+/rEZ4fw2XAYhSOjjvP0Y57CmNuVZozv1p3Bkqe FpyWPB6A9m+dPjQzbstEmpKjX5M//2KvR4tQjIeckKH/oVJtfWmU7RQHvUZ9kulV5Ujp4WcqwqG8 Z/HMPUOWN784rCDRxXkFpd8DOLD5jfSZxSgUlcQ4RtE9J09SHzogmBYFWCPvzQHnLKMEVw8d2ms4 8uA0HH5wKg7okYIe2R60ydL2uMb4QKbltFb2/U+NesTdVT80wOc8vdVDZYwengmasrUq0b6qJ18O afVrVRWSvhw7RElInFRUmLMsHPxIBOlBALRJdo/EYrQHjoT8QPuVaDf+OQrcPoUDZncgwHB1a36O XBNlpGtITxfw+yRq6qTugbqx0dnrISSk487MwrgzrRsJE7up/yMPK7ypvflzZMfnfr1S8Ph9ataU QoyUtneS2V0LC0XYn2Vh15AIUu+BN9H8wkXBwFiMgmkk7nsaqZAvvPKdARx7RMTGlnED+eMR6Ti4 f6rulYCC3zk50Zw5hUCg/UJVNRL1DdKxIzziqGnAhLPb4P7/64RBijdHB/cbGS7c8eAOfPOdM7x3 BNctWd9v3xHAF9824NTB5o6OaU2JQqzTJvygNOutwnazgj6HfNuqIHU64cGN6XW7zb9ZjEJyTOiD P/zciIXv18LjESDv3lak7K5e5B6Xgb69UnQT8dLNYX9YWVElV5dB1oMU4v4/d3fG4YOsNW0n9z/P z6zi2EUOfIJ+2+q3RJSkEHevLZm6qjUErU7ZUQZDC0pnSiCfpm9UDPEp0Nbsd6pbqyufdwABKyLS hmqmU02kQ9XVScdIiGh96IbLrTPpN9pPBhxvLqwGuWzi5GwCNFr+9537mF5Jipf2n2d3NAqZ0aWo sFNYiwcqPCJByhu7cdzE8e1eUyFGHGzL9GdAeYb79/DirBHqg/+FasiyT+t0x7orvtljOiDUpUl9 jIRoxCmZuOkq64WIwD/1SiVmzHXePrOkfihaabwqUVr6Ue36ISdk7tdK8frpiASp9LfGU7O7eOdH kmE017AYRUPLeddSWJGrLmxnS8U+/6ZeN6H+8LM6W8p3aqFkpj5qWJbu6seOOvKoyA7q5pV5+KBU TLnd/JESgH5CiJ9aq2lEgiSlfA3AuNYyi+Y8i1E0tJx7bbcuHj3ECK1P2JHW/NqoC9O7xbVwumWb Sj5tszR9H9Gl49RHbW2pHbRW9PpbPPXeEh+3HD/msDTcc2sns6vbTQixubVMIxWkCwG80FpmkZ5n MYqUlHuus9r1UCgy09+swluLakB7gJIl0X4S2nk/api5llLR8CMLOgqi58SNzdG0g6/dTcBkUSoW QgzenXvL7yIVpA4AylvOJvIzLEaRs3LblakpAhcXtEXBaHtGSwavT76ox4L3an6PrOrs/UBGnaN5 peCHucel47QhmZY5Pm2pfryvqCUy7j9uoihdI4R4NBIiEQkSZSSlfBPA6EgybekaFqOWyCTW8aMO SdN/tZN3b7sTWfkUfVCD1T81QrpYm8hI4ZD+qcg7McNSrwot9R+NRskHnVO9arRUbz4eHQGTRClb CLEpkpKjEaSxAKZHkmmoa1iMQlFJ7GMFo7Jwxfn2GD2EIkvrGxQGfNWPDa4QJxKhAf1SccIx6SCW TkhLljV5KP92NW9wdUJ/WFEH+mF5500xuxFbJIQYHmk9oxEkmqSOacWSxSjS7ki869q20XDe2W10 wwcnta7og1p8+mU9Vqysh1OC4RGfrEyBwwam4Y9HpOlTck5i9uhzO0HrRZySj8Apx6bj9htiEqVL hBDPR0osYkGiDKWULwK4INLM6ToWo2hoJe61hw5IxejhWTjlOPun8ZpTXrfBh5XfNej/v1/TiNJN PstGUB3bayBXKxQgkTwoWOUJozmDcJ9fnVOFFwo5ims4RslwLkZRai+EiNiTbrSCdCqAiPcjsRgl w2MaXRuHnZyBW/5MNjLOTuRzjTwMbNzkQ+kmP0o3+0ARdmMZTZGT2k4dNHTu6EGPHA96ZnuxXw+v 7mm7a+dWvXfZBmreoqZwGWRaz4kJEIEoRalQCFEQDbloBYm+PRH5AWExiqYbkutaWhspGNUGl59n 356ZWIn7/UBFZUDf80SOVBt9TZYSXo8Atcv4nJmu6Y5MMzMFaI+QmxJZKc5dVA165cQEmhOIQpRO F0K80/z+cJ+jEiTKSEp5L4C/hcuUxSgcHT5nEKCRw4Sz2oCilHJyBoEHn6jAu0s5PIQzesO5tYhw psMrRPhwE81bGIsg/QHA6uYZGZ/Zh5VBgl8jJdC+rYb8M7Iw7iwWpkiZmX0dGSy8uaDasrUzs+vP +VlPYERuBm6+qsXp9/uEELdGW6uoBYkKkFJ+AODE5oU9N6MSr8xmh4rNufDnyAjQesroYZksTJHh MuUqms14/W0WIlNgJmEmYUTpICEERRuPKsUqSJcCeCa4JBajYBr8Ph4CZHlGUWp5xBQPxfD3khDN nl8NWhPjxATiIRBClJYJIU6KJc9YBYl26e0aCrEYxYKe72mNAIXZPuvUTN0dUWvX8vnICDz8dAXe XlzDHhYiw8VXRUigmSidJ4R4NcJb97gsJkGiHKSU1wJ4+LHnd2LOfN4stwdV/mAqAa9X4PS8DFxz qT2xfUxtjA2Zfb2qAXMXVuP9j+t4jcgG/slSZJssbdurj+57aVaWmBtrm2MWJCrw7oe3n7j0wzpa T+LEBJQTILPqIw9Jw+jhmTj+KOdtsFUOIMoCFhTXYt6iat2PX5S38uVMIGoCAuL+opnZYS2wW8s0 LkGizPPyS5dCILe1gvg8EzCTABlAnDE0ExPOZsu85lzJ6ek7S2qwoyLQ/BR/ZgKqCASE39OvaNa+ a+IpwARBKjsXQhbGUwm+lwnESsDrAY45PB3DT8nAicck76jpvY/r9FhQX5XU87RcrA8T3xczAQEx t2hm9pkxZ/D7jXELUm6u9Hq6lv0MIKKY6fFWmO9nAi0RoP1Mg0/I0GMFDTootaXLEub4N6sasPjD Wn1tqLKKR0MJ07EubIgATi2ambMg3qrHLUhUgSEFZTcJyCnxVobvZwJmEdinowcn/TEdJx+brscR Mitfu/MhH3sffV6H95bXYcs2ttm2uz+4fJ3AqsUzswcBIu6IY6YIUu5Zazt4UtPWA+AJfX5CHUeA zMePPCQVfzw8HUcflgba5+SmRNNxH6+ow8df1INHQm7queSoqwCuKJqZ85QZrTVFkKgiQwrKHhGQ 15hRKc6DCagk0LO7F4f2T8XB/VP10VOXfZzjcZsct67+sRG0FvTFtw1Y84u7I92q7EfO2xEEttZI /37LC3vWmlEb0wRpeP6mXn4R+AGA14yKcR5MwCoC7dtpOLB3CvockIJ+vVLQM8eD7vt6kZZm2tcj ZFPKNvvx60Yfftnow/c/NYBiMW36jafhQsLig84kIMUdiwuz7zKrcqZ+4/IKSl8GcJ5ZleN8mICd BMhIonMnD9q1FaBpP4p+2yZT6EKV4hWgDbspv//8CgRoszjg+X2wVVsndW8IdQ0S9fUSOysD+nTb zqqAbo69dbsfPtYeO7uXy46fQJVX+vdfUNhze/xZNeVg7mjG438Afs8EAKYKnVmN5XyYQDQEaPqM /nNiAkxgbwISeMpMMaISTF3dXfxaz29EFBFl924iH2ECTIAJMAEXEGjwavIhs+tpqiBR5aSG+8yu JOfHBJgAE2ACziEgIF5ZOL07WVabmkwXpMXTcz4A5BJTa8mZMQEmwASYgFMI+ODX7lZRGdMFiSop Ie5UUVnOkwkwASbABGwmIOTL8fqsa6kFSgRpycyc9wEsbalQPs4EmAATYAKuJODzBwL/UlVzJYJE lZXAZFWV5nyZABNgAkzAFgKvFBf2/ElVycoE6fdR0iJVFed8mQATYAJMwFICDR6pKV2OUSZIhEnT cFvTYMlSaFwYE2ACTIAJmE5APrWwsNta07MNylCpIC2anvM5gFlB5fFbJsAEmAATcB+BGq8vVdna kYFDqSBRIR4/bgfgMwrkVybABJgAE3AXASnwyILZXcpU11q5IC2clbMaAi+obgjnzwSYABNgAkoI bGvwND6gJOdmmSoXJCrP25hCo6TqZmXzRybABJgAE3A4ASlw97JX9y+3opqWCBIN9SQER5S1oke5 DCbABJiAWQQEfqxon/2YWdm1lo8lgkSVyKqlEOeitLUK8XkmwASYABNwBgEZwC0rnhSNVtXGMkGa Ny+nRorA361qGJfDBJgAE2ACsROQwHtLCnPmxJ5D9HdaJkhUtZP757wACTIF58QEmAATYALOJeD3 yMD1VlfP8kB6eWPLjoaUH5sdi8lqcFweE2ACTCBRCUghH18yo/vVVrfP0hESNW7xjOzPADxrdUO5 PCbABJgAE2idgAS2BOobyMuO5clyQaIWpkpBjd1heWu5QCbABJgAEwhPQOC24jd62fL32RZBml+Y vQVC/F94KnyWCTABJsAErCQgpPzk5P7Zts1g2SJIBPik/t2eAPS1JCt5c1lMgAkwASYQmoDPr8kr J08WgdCn1R+13KghuEmDx244VJMaWd15g4/zeybABJgAE7CYgJBTFs/o/leLS92jONtGSFSLpTN6 fA2IaXvUiD8wASbABJiA1QTWeVI9SmMdRdIgWwWJKphZKwmC0hgbkYDga5gAE2ACyUpACnH1wpe6 2e5v1HZBIg8Omha4nAP5JetXgdvNBJiAzQReXjIje77NddCLt12QqBaLpvdYDOBJJwDhOjABJsAE kojAJq/0X+eU9jpCkAhGXV3KzQB+dQoYrgcTYAJMINEJSImrFxT23O6UdjpGkD6c26VSCslTd055 MrgeTIAJJDgBMd1q56mtAXWMIFFFl8zovhCQj7dWaT7PBJgAE2AC8RAQpV7p+3M8Oai411GCRA30 pHnIDv4HFY3lPJkAE2ACTABSQF7qpKk6o08cJ0hkehjQtAsB+IxK8isTYAJMgAmYRUD+t2hmzgKz cjMzH8cJEjVu6fRun0DIe8xsKOfFBJgAE0h2AlJgdWatsNUbQ7g+cKQgUYX9m3P+CYmPwlWezzEB JsAEmEDEBBoAnEd7PyO+w+ILHStIxcXCJ/2YIIByi5lwcUyACTCBxCMg8dclM3K+cHLDHCtIBG3J 7JxfpBRXOBkg140JMAEm4AICby8uzH7E6fV0tCARvMWF2a8L4Amng+T6MQEmwAScSUCU+j24GBDS mfXbXSvHCxJVtVr6b4TEl7urze+YABNgAkwgAgI+aHJc8Ws5WyO41vZLXCFIywt71krNkw+gwnZi XAEmwASYgEsISIhbF0/P+cAl1YUrBIlgLpmx789CyIvYK7hbHi2uJxNgAjYTmLNkZrepNtchquJd I0jUqqIZ3d+EkA9G1UK+mAkwASaQbAQEfhQy/RI3rBsFd42rBIkq3imQc6uUgsJVcGICTIAJMIG9 CVSLgHZOUWEn1y1xuE6QCguFPw0YD4Ff9u4HPsIEmAATSGoCUgAXFRV2W+lGCq4TJII8vzB7SwCB MwE4dsexGx8GrjMTYALuJiCBfxXNzJnl1la4UpAI9tIZPb6WQlzMRg5uffS43kyACZhKQMq3Th6Q fYepeVqcmbC4PNOLyysoux2Qd5meMWfIBJgAE3APgZVCpp/kxnWjYMSuFyRAiryCspfIaWBww/g9 E2ACTCAZCEhgS8AXOKJ4do8Nbm+va6fsdoMXspMsvxSQH+8+xu+YABNgAklBoEZq2qhEECPqrQQY ITU9dCPzy7o0CnwkIfsmxWPIjWQCTCDZCUgJed6Smd1fSxQQCTBCauoKsrzzSd9IGr4mSudwO5gA E2ACLREQErclkhhROxNmhGR02uBxm/6oBQJLAGQax/iVCTABJpBIBKSQjy+Z0f3qRGoTtSVhRkhG x1D484CU4ynorHGMX5kAE2ACCUTglX0COdckUHt2NSXhBIlatrSw+1wJ/IX3KO3qZ37DBJhAQhCQ S8iIizzWJERzmjUi4absgts3NL/0b1Lg3uBj/J4JMAEm4FICnwqZPtzte43CsU/IEZLR4KLCnPsE xP3GZ35lAkyACbiUwKpUKc5IZDGifknoEVLTg6dvnH0cwJUufRC52kyACSQzAYFf/I2BExNlr1G4 rkzoEVJTw2njbPafAbwSDgSfYwJMgAk4kMAGf8A/NBnEiNgnwQip6RHLz5eebaL0VQFR4MCHjqvE BJgAE2hGQJZByNzFM3r80OxEwn5MGkGiHjzyCpnSvrxsuhAYk7A9yg1jAkzA9QRog78mcErRjJzv XN+YKBqQBFN2u2mseFI07oPy8QJi7u6j/I4JMAEm4BwCuhhJLS/ZxIh6IKkEiRpcWDiwoaPcni8l ZjvnEeSaMAEmwAR0ApulRwx2a8TXePswqabsgmHl5kqvZ99NL0PKscHH+T0TYAJMwB4CotTjl3kL Z+Wstqd8+0tNuhGSgby4WPg6BbpRDKWXjWP8ygSYABOwicB6v/SdksxiRNyTVpCo8eR+o5PMpjDo /7PpIeRimQATSHICAuInvyZOLi7s+VOSo0ges+/wHS3FkLFl9wiJv4W/js8yASbABEwkIMU3fnhG FBd23WRirq7NKqlHSLt7TcglM3JuFVL8lR2y7qbC75gAE1BIQOKj+pSGXBaj3YyT1qhhN4I93w0Z WzpRSDwBwLPnGf7EBJgAEzCNwLuZtThn3rycGtNyTICMWJBCdOKQgo2jBASFBc4KcZoPMQEmwARi JiAgnivv0O1K2hcZcyYJeiMLUgsdS5FnRSAwTwBdWriEDzMBJsAEoiQg/7l4Zs4dgJBR3pgUl7Mg henm3Pz1fb3CO19C9g1zGZ9iAkyACbRGwC+Aq4pm5jzV2oXJfJ4FqZXezx1f2tnjxxwAJ7ZyKZ9m AkyACYQiUCGAsUUzcxaEOsnHdhNgK7vdLEK+K34tZ2tqZfVQ3kAbEg8fZAJMIDyBtQGPOIHFKDwk 4yyPkAwSEbzmFZTeCuBfyRS2IwIsfAkTYAIhCYjlnkZx1sI53X4LeZoP7kWABWkvJOEPDMkvPVsI vAigTfgr+SwTYAJJS0DI51N31vxp/vx+9UnLIIaGsyDFAG342E2DAlLOYWOHGODxLUwgsQn4hJA3 Fs3o/p/Ebqaa1rEgxcj1xAm/dEzzpbwK4NQYs+DbmAATSCACehwjTRQUTc8uTqBmWdoUNmqIEfey V/cv7ySzzwBwL7sbihEi38YEEoWAxOfw4WgWo/g6lEdI8fHT7x6aX3a6FPIFAPuYkB1nwQSYgIsI CCEeTdlZdROvF8XfaSxI8TPUcxiev6mXH4GZEDjKpCw5GybABJxNoAoCf1o8I+cVZ1fTPbXjKTuT +mphYbe1qVXVJ9KvJZ7CMwkqZ8MEnEtgpcePo1mMzO0gHiGZy1PPbejYjWdKKZ7hKTwFcDlLJmAz ASnk44GMhhuLn+9VZ3NVEq54FiRFXZo7ZkMPzau9LIBTFBXB2TIBJmAtge1SYuKSwhxyJcZJAQGe slMAlbIsnt1jwz4yOw8Q/wAku5lXxJmzZQIWEVgqJA5nMVJLm0dIavnquQ8bV3pUIACywhtgQXFc BBNgAuYRqBPAbScOyH548mQRMC9bzikUARakUFQUHDsuf31Gpua5FxLXsi88BYA5SyZgNgGJLwFx /uLC7FVmZ835hSbAghSai7KjeQVlgwXw5P+3d26xVVRRGP7/PbW2oqYgSIGC8a6QoPLgJYKppYL1 Fi+p0AcUrw/6oDHxHhU1XuOLiYmJqVGjRvAIGjERQ9GCGNEgmGgUlYhSORRRqQhKy5lZZho1EUs9 9zMz5386ObPXWnutb03yZ86Zvbe2HSoZYgUWgUIJDBj48K8NjQ/rVNdCUebmL0HKjVdRrAeflliz ALBbANQUJaiCiIAIFEzAgA/DPS8CAAAGbElEQVRovF5PRQWjzCuABCkvbMVxap275RQL2AlgWnEi KooIiECeBHYCvGvG5Man9V9RngSL4CZBKgLEQkI0N1uNO7z3ZsIeAFBfSCz5ioAI5EOAS/2Mf0P4 Zmw+3vIpHgEJUvFYFhSp9bJtRwUueIa0mQUFkrMIiEC2BLbB7KYVqQmLsnWQXWkJSJBKyzfH6MaW Oen5ND4OYHSOzjIXARHIjoABfK7GMre+k5r4S3YusioHAQlSOSjnOMfs9p5RGboHAV6vlx5yhCdz ERiewDrS3di1qHHN8GYarQQBCVIlqGc55+BLDz6fBDEjSxeZiYAIDE3gJxrunj5lXKdeWhgaUBSu SpCi0IVhczC2XJ6eS/BRAJOGNdWgCIjAvgQGQDzl9/c/2P3GkX37Dup7tAhIkKLVj/1mE65dGgHv JiNuB9CwX0MNiIAI/E3gdd/827pTEzf+fUGf0SYgQYp2f/6TXXNHerTn2/0ArgN4wH8MdEEEqpwA zT6C5+7QceLxuxEkSPHr2WDGze09x3j0FgDoAKBd22PaR6VdVAJfkLina9G41wFaUSMrWFkISJDK grl0k8zs6JmKjHsI5AWlm0WRRSDCBIjvYbxvlDW+lErRj3CmSu1/CEiQ/gdQXIZb5/SebkFwL4i2 uOSsPEWgQAKbaXx0JH55NpWaMlBgLLlHgIAEKQJNKGYKLe1bTyXtXgDnFzOuYolAhAh8R8MjI7Hj eQlRhLpShFQkSEWAGMUQ4aGAvo87SVys/5ii2CHllAeBrwh7fEfD+Bd1LEQe9GLgIkGKQZMKSfHs 9i3HO8dbYZgHoLaQWPIVgQoR+JjEY9NPHPeGFrVWqANlmlaCVCbQlZ7mnLmbxwfm3QzjdVrHVOlu aP4sCAQElhn4xIpXx72Xhb1MEkBAgpSAJuZSwqx5vSP8Absy3OUYwHG5+MpWBMpAYDdgL4D25IpF TV+XYT5NESECEqQINaOcqSxYYG7lF73nerAbDZgNwCvn/JpLBP5FgPjGjM8EA3s6tcXPv8hU1RcJ UlW1e+hiW9vTkwLyKsKu1n55QzPS1ZIQ6AfwGh07uxY2rtRi1pIwjlVQCVKs2lXaZMOnplVf9s5G YNeSdqG2Jiot7yqO/hkMz9bAf1HnEVXxXTBE6RKkIaDoEjCzY9tY8zPzSV4Dw7FiIgIFEtgF8FWY 37ki1fRhgbHknlACEqSENrZ4ZYXHX2ydQeIKGi41YGTxYitSwgkEAFbC7OXa2rrU2y8ftjPh9aq8 AglIkAoEWE3ubW3fHDhwyIg2g3UQvBBAfTXVr1qzJGBYC+AV52UWLl84KZ2ll8xEABIk3QR5ETjz ou2H1B04cB7Jyww4D8CIvALJKQkEDLCPaG4JAre4a/HYb5NQlGooPwEJUvmZJ27G8PDAg+iFr45f YkAbgTGJK1IF7UsgA9gqI5cGe4PXupc0/bCvgb6LQK4EJEi5EpP9sATa28372UufxoAXwHg+aFOH ddBgnAj8BGAZzN4i6pd1pUb9GqfklWv0CUiQot+jWGfYfOkPTTU1nGVw5xhspp6eYtXO8EiHNQSW +84tH+2PXavzhmLVv9glK0GKXcvim3C4zmn1hvRJ8F2rITgL5HTtqxepfvowrIfDKgZ8NwNvZXfq 8F2RylDJJJqABCnR7Y12ceHPezu89FTzeRaIGQBOBzAh2lknKrvdMKwDsdrI9/v/qFn9wZtjfktU hSomVgQkSLFqV/KTbWnvmeCcdxrMzjDwVAAnAzg0+ZWXvMKMARsIfGLAGs+CNXu3T/i8u5uZks+s CUQgSwISpCxByaxSBIwtc348CgimATaNNihQk7Xn3rD92EmzL438FMT6gO7Tg3cHny1dOv73Yb00 KAIVJiBBqnADNH1+BMJ1ULUH+ZO9wJ9ixAk0d7yZHQ3iaAB1+UWNlZcBCF+13mjARho2mLPPXcAN Xanxm2NViZIVgb8ISJB0KySMgHHW3HSTH7hjBp+iDEcYrYmGpsHvxMSY/AQY7oS9zYAewLYQDD83 G7DJkRsz9f2bup8/ck/CmqdyqpyABKnKb4BqLL95/qa62j21Y3xzjQDHGvwxNDfKYA2ObDCzBpg1 GFy9ozWY8QA4Oxhm9QT/efraz75+vxMIxQTh9gUg+mDYS2CXGcKxPwJaH8k+GnfArC8g+hyw3Rx+ 9PZie+DqtmqNTzXemar5T7boKrYfCqI6AAAAAElFTkSuQmCC"/></symbol><symbol viewBox="0 0 24 24" id="webpack" xmlns="http://www.w3.org/2000/svg"><path d="M19.376 15.988l-7.709 4.45-7.708-4.45V7.087l7.708-4.45 7.709 4.45z" fill="#fff" fill-opacity=".785" stroke-width="0"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18.21 0 .41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.939v2.104h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07l7-3.94zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83-4.9-2.83zm-5 5.08v3.58l4 2.308v-3.58l-4-2.308zm10 0l-4 2.308v3.58l4-2.308v-3.58z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83-4.9-2.83zm-5 5.08v3.58l4 2.308v-3.58l-4-2.308zm10 0l-4 2.308v3.58l4-2.308v-3.58z" fill="#1c78c0"/></symbol><symbol viewBox="0 0 24 24" id="wolframlanguage" xmlns="http://www.w3.org/2000/svg"><title>wolframLanguage</title><g transform="scale(.12121)" fill="none" fill-rule="evenodd"><circle cx="99.197" cy="98.946" r="83.28" fill="#212121" stroke-width=".841"/><path d="M182.529 98.828a83.406 83.406 0 0 1-39.14 70.721.064.064 0 0 1-.038.019l-28.62-35.665 23.71 2.612s11.385 1.177 13.978 0c2.373-.938 15.175-18.963 15.175-18.963s-36.75-23.23-49.312-36.032c1.434-21.575-1.656-50.269-1.656-50.03-9.251 9.234-10.429 10.669-19.68 19.203-4.028-13.04-5.923-17.547-9.95-30.588-12.104 9.95-21.337 26.799-27.977 46.48a78.68 78.68 0 0 0-4.23 5.094 109.774 109.774 0 0 0-2.667 3.66 114.558 114.558 0 0 0-5.132 8.002 172.555 172.555 0 0 0-3.403 6.051c-7.706 14.475-14.034 31.066-19.515 46.001a.858.858 0 0 1-.092-.184c-14.988-30.912-9.502-67.85 13.822-93.072 23.325-25.223 59.723-33.575 91.71-21.045 31.988 12.53 53.029 43.382 53.017 77.736z" fill="#e53935"/><path d="M101.452 69.178s-1.416-8.295-2.373-11.367c6.401-6.18 7.357-7.118 13.52-13.04.477 11.845.238 18.006-.479 32.481-3.55-3.568-10.668-8.074-10.668-8.074zm-27.737 40.778s-6.64-4.029-11.624-4.728c1.435-3.329 5.223-7.596 6.18-8.773-1.913.699-15.653 6.86-17.087 12.084a74.804 74.804 0 0 1 11.385 3.79 35.993 35.993 0 0 0-8.774 20.158s21.815-3.33 38.185-1.196c.283.168.609.251.938.24l8.534.239 27.111 45.136.221.35c-.037.018-.055.037-.073.037-51.133 18.485-88.085-15.543-95.976-27.443.034-.102.058-.206.074-.313 7.1-30.017 15.855-65.939 30-76.552 7.356-12.82 9.49-31.783 22.751-41.734 3.33 9.951 8.553 30.588 12.103 40.539 15.653 15.652 39.361 35.094 55.234 43.15 1.656.956 3.79 7.596 3.79 7.596l-6.401 8.056-68.276-6.879a54.462 54.462 0 0 0-4.58-.183 86.848 86.848 0 0 0-14.144 1.36c3.311-8.295 10.43-14.935 10.43-14.935zm22.054-8.774c3.789-.46 7.817.956 12.323 3.568 4.267-1.195 4.745-1.434 9.013-2.612-5.463-4.028-11.386-8.295-19.442-7.118a47.249 47.249 0 0 0-1.894 6.162z" fill="#fff" stroke-width=".936"/></g></symbol><symbol viewBox="0 0 24 24" id="word" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5M7 13l1.5 7h2l1.5-3 1.5 3h2l1.5-7h1v-2h-4v2h1l-.9 4.2L13 15h-2l-1.1 2.2L9 13h1v-2H6v2h1z" fill="#01579b"/></symbol><symbol viewBox="0 0 24 24" id="xaml" xmlns="http://www.w3.org/2000/svg"><path d="M18.93 12l-3.47 6H8.54l-3.47-6 3.47-6h6.92l3.47 6m4.84 0l-4.04 7L18 18l3.46-6L18 6l1.73-1 4.04 7M.23 12l4.04-7L6 6l-3.46 6L6 18l-1.73 1-4.04-7z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="xml" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m.12 13.5l3.74 3.74 1.42-1.41-2.33-2.33 2.33-2.33-1.42-1.41-3.74 3.74m11.16 0l-3.74-3.74-1.42 1.41 2.33 2.33-2.33 2.33 1.42 1.41 3.74-3.74z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 24 24" id="yaml" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="yang" xmlns="http://www.w3.org/2000/svg"><path d="M12 2a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2m0 2a8 8 0 0 0-8 8 8 8 0 0 0 8 8 4 4 0 0 1-4-4 4 4 0 0 1 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 2.5A1.5 1.5 0 0 1 13.5 8 1.5 1.5 0 0 1 12 9.5 1.5 1.5 0 0 1 10.5 8 1.5 1.5 0 0 1 12 6.5m0 8a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 289.99999 290.00001" id="yarn" xmlns="http://www.w3.org/2000/svg"><path d="M250.733 218.418c-12.39 2.943-18.661 5.653-33.993 15.641-24.004 15.487-50.176 22.688-50.176 22.688s-2.168 3.252-8.44 4.723c-10.84 2.633-51.647 4.878-55.364 4.956-9.988.077-16.105-2.555-17.809-6.66-5.188-12.388 7.434-17.809 7.434-17.809s-2.788-1.703-4.414-3.252c-1.471-1.47-3.02-4.413-3.484-3.33-1.936 4.724-2.943 16.261-8.13 21.45-7.125 7.2-20.598 4.8-28.573.619-8.75-4.646.62-15.564.62-15.564s-4.724 2.788-8.518-2.942c-3.407-5.266-6.582-14.248-5.73-25.32 1.084-12.777 15.176-25.011 15.176-25.011s-2.477-18.661 5.653-37.787c7.356-17.422 27.179-31.437 27.179-31.437s-16.648-18.352-10.454-35c4.027-10.84 5.653-10.763 6.97-11.227 4.645-1.781 9.136-3.717 12.466-7.356 16.648-17.964 37.864-14.557 37.864-14.557s9.911-30.431 19.203-24.469c2.865 1.859 13.163 24.778 13.163 24.778s10.996-6.426 12.235-4.026c6.659 12.931 7.433 37.632 4.49 52.654-4.955 24.778-17.344 38.096-22.3 46.459-1.161 1.936 13.319 8.053 22.456 33.373 8.44 23.152.929 42.587 2.245 44.756.232.387.31.542.31.542s9.679.774 29.114-11.228c10.376-6.427 22.688-13.628 36.703-13.783 13.55-.232 14.247 15.719 4.104 18.12z" fill="#2c8ebb" stroke-width=".774"/></symbol><symbol viewBox="0 0 24 24" id="zip" xmlns="http://www.w3.org/2000/svg"><path d="M14 17h-2v-2h-2v-2h2v2h2m0-6h-2v2h2v2h-2v-2h-2V9h2V7h-2V5h2v2h2m5-4H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#afb42b"/></symbol></svg>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol viewBox="0 0 24 24" id="actionscript" xmlns="http://www.w3.org/2000/svg"><text style="line-height:113.99999857%" x="5.605" y="15.892" transform="scale(.91325 1.095)" font-weight="400" font-size="42.822" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#f44336"/><path style="line-height:125%" d="M4.744 2.031c-1.157 0-1.994.31-2.51.93-.515.612-.771 1.678-.771 3.197v2.467c0 1.408-.402 2.111-1.201 2.111v2.035c.8 0 1.2.679 1.2 2.036v2.654c0 1.512.26 2.562.78 3.152.52.59 1.355.885 2.502.885V19.43c-.447 0-.77-.151-.97-.453-.195-.303-.292-.815-.292-1.538v-2.267c0-1.807-.404-2.937-1.214-3.395v-.045c.81-.464 1.214-1.581 1.214-3.351V6.025c0-1.283.42-1.925 1.262-1.925V2.03zm14.66 0V4.1c.842 0 1.262.642 1.262 1.925v2.268c0 1.843.402 2.996 1.207 3.46v.046c-.805.442-1.207 1.544-1.207 3.306v2.356c0 .715-.099 1.22-.299 1.516-.2.302-.52.453-.963.453v2.068c1.152 0 1.984-.295 2.494-.885.516-.59.772-1.663.772-3.218V14.84c0-1.379.404-2.069 1.209-2.069v-2.035c-.805 0-1.21-.696-1.21-2.09V6.113c0-1.49-.255-2.54-.77-3.152-.516-.62-1.348-.93-2.495-.93zm-3.054 4.46c-.455 0-.886.057-1.293.173a3.056 3.056 0 0 0-1.078.527c-.308.241-.551.549-.731.924-.18.37-.27.817-.27 1.336 0 .663.165 1.227.493 1.695.33.468.831.864 1.502 1.188.263.125.509.249.736.37.227.12.422.244.586.374.168.13.299.271.394.424a.963.963 0 0 1 .145.521c0 .144-.03.28-.09.405a.9.9 0 0 1-.275.318c-.12.088-.272.158-.455.21a2.34 2.34 0 0 1-.635.075c-.415 0-.825-.083-1.233-.25a3.644 3.644 0 0 1-1.13-.763v2.222a3.68 3.68 0 0 0 1.101.418c.427.093.875.139 1.346.139.459 0 .894-.05 1.305-.152a3.002 3.002 0 0 0 1.09-.5c.31-.237.556-.543.736-.918.183-.38.275-.849.275-1.405 0-.403-.052-.755-.156-1.056a2.542 2.542 0 0 0-.45-.813 3.295 3.295 0 0 0-.704-.633 6.754 6.754 0 0 0-.922-.535 12.4 12.4 0 0 1-.676-.348c-.2-.115-.37-.231-.51-.347a1.502 1.502 0 0 1-.322-.375.91.91 0 0 1-.115-.453c0-.153.033-.288.101-.408a.948.948 0 0 1 .29-.32c.123-.089.275-.156.454-.202a2.18 2.18 0 0 1 .598-.078c.16 0 .326.015.502.043.18.028.36.07.539.13.18.056.354.13.522.218.171.088.329.188.472.304V6.871a4.039 4.039 0 0 0-.957-.285 6.448 6.448 0 0 0-1.185-.096zm-8.774.165l-3.123 9.967h2.094l.605-2.217h3.053l.61 2.217h2.107L9.869 6.656H7.576zm1.072 1.78h.047c.028.347.077.646.145.896l.922 3.35H7.564l.934-3.377c.08-.288.13-.578.15-.87z" font-weight="400" font-size="51.019" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="android" xmlns="http://www.w3.org/2000/svg"><path d="M15 5h-1V4h1m-5 1H9V4h1m5.53-1.84L16.84.85c.19-.19.19-.51 0-.71a.513.513 0 0 0-.71 0l-1.48 1.48C13.85 1.23 12.95 1 12 1c-.96 0-1.86.23-2.66.63L7.85.14a.501.501 0 0 0-.7 0c-.2.2-.2.52 0 .71l1.31 1.31C6.97 3.26 6 5 6 7h12c0-2-1-3.75-2.47-4.84M20.5 8A1.5 1.5 0 0 0 19 9.5v7a1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5v-7A1.5 1.5 0 0 0 20.5 8m-17 0A1.5 1.5 0 0 0 2 9.5v7A1.5 1.5 0 0 0 3.5 18 1.5 1.5 0 0 0 5 16.5v-7A1.5 1.5 0 0 0 3.5 8M6 18a1 1 0 0 0 1 1h1v3.5A1.5 1.5 0 0 0 9.5 24a1.5 1.5 0 0 0 1.5-1.5V19h2v3.5a1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5V19h1a1 1 0 0 0 1-1V8H6v10z" fill="#c0ca33"/></symbol><symbol viewBox="0 0 24 24" id="angular" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#e53935"/></symbol><symbol viewBox="0 0 24 24" id="angular-component" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#0288d1"/></symbol><symbol viewBox="0 0 24 24" id="angular-directive" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#ab47bc"/></symbol><symbol viewBox="0 0 24 24" id="angular-guard" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-pipe" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#00897b"/></symbol><symbol viewBox="0 0 24 24" id="angular-resolver" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-routing" xmlns="http://www.w3.org/2000/svg"><path d="M11 10H5L3 8l2-2h6V3l1-1 1 1v1h6l2 2-2 2h-6v2h6l2 2-2 2h-6v6a2 2 0 0 1 2 2H9a2 2 0 0 1 2-2V10z" fill="#43a047"/></symbol><symbol viewBox="0 0 24 24" id="angular-service" xmlns="http://www.w3.org/2000/svg"><path d="M12.102 2.625l8.84 3.15-1.34 11.7-7.5 4.15-7.5-4.15-1.34-11.7 8.84-3.15m0 2.1l-5.53 12.4h2.06l1.11-2.78h4.7l1.11 2.78h2.05l-5.5-12.4m1.62 7.9h-3.23l1.61-3.87z" fill="#ffca28"/></symbol><symbol viewBox="0 0 100 100" id="apiblueprint" xmlns="http://www.w3.org/2000/svg"><title>api-blueprint</title><path d="M50.133 7.521A16.998 16.998 0 0 0 33.135 24.52a16.998 16.998 0 0 0 4.945 11.974L24.861 57.398a16.998 16.998 0 0 0-3.175-.308A16.998 16.998 0 0 0 4.688 74.088a16.998 16.998 0 0 0 16.998 16.998 16.998 16.998 0 0 0 16.998-16.998 16.998 16.998 0 0 0-7.063-13.773l12.576-19.89a16.998 16.998 0 0 0 5.936 1.093 16.998 16.998 0 0 0 6.154-1.155l12.537 19.83a16.998 16.998 0 0 0-7.244 13.895 16.998 16.998 0 0 0 16.998 17 16.998 16.998 0 0 0 16.998-17A16.998 16.998 0 0 0 78.578 57.09a16.998 16.998 0 0 0-2.95.262L62.337 36.327A16.998 16.998 0 0 0 67.13 24.52 16.998 16.998 0 0 0 50.132 7.522z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="applescript" xmlns="http://www.w3.org/2000/svg"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z" fill="#78909c"/></symbol><symbol viewBox="0 0 24 24" id="appveyor" xmlns="http://www.w3.org/2000/svg"><path d="M12 2c-.084 0-.165.008-.248.01a10 10 0 0 0-.266.01 9.952 9.952 0 0 0-.754.066 10 10 0 0 0-.148.018 9.855 9.855 0 0 0-.93.177 10 10 0 0 0-.07.02c-.196.049-.392.1-.584.16v.012a10 10 0 0 0-2 .875V3.34c-.02.012-.038.027-.059.039a10 10 0 0 0-.953.635c-.09.067-.172.142-.26.213a10 10 0 0 0-.628.546c-.109.104-.211.211-.315.319a10 10 0 0 0-.476.539c-.1.12-.201.237-.295.361a10 10 0 0 0-.52.766c-.088.143-.17.288-.252.435a10 10 0 0 0-.363.723c-.072.161-.136.327-.2.492a10 10 0 0 0-.269.778c-.02.067-.044.131-.062.199a10 10 0 0 0-.008.027c-.098.364-.166.728-.22 1.09-.012.077-.024.153-.034.23a9.85 9.85 0 0 0-.08 1.182c0 .03-.006.057-.006.086a10 10 0 0 0 .008.148c.001.094-.002.188.002.282l.011.004a10 10 0 0 0 .333 2.158l-.012-.004c.012.047.033.091.047.139a10 10 0 0 0 .322.955c.02.052.037.106.059.158a10 10 0 0 0 .503 1.035c.065.116.14.226.21.34a10 10 0 0 0 .423.64c.092.128.187.252.285.375a10 10 0 0 0 .448.52c.112.123.222.248.341.365a10 10 0 0 0 .803.719 10 10 0 0 0 .01.006c.099.078.207.146.309.22a10 10 0 0 0 .648.442c.138.085.28.163.424.242a10 10 0 0 0 .715.358c.114.051.226.106.343.154a10 10 0 0 0 1.133.389c.016.004.031.01.047.015a10 10 0 0 0 .461.098 10 10 0 0 0 .482.103 10 10 0 0 0 .418.051 10 10 0 0 0 .575.065 10 10 0 0 0 .144.005A10 10 0 0 0 12 22a10 10 0 0 0 .197-.01 10 10 0 0 0 .496-.025 10 10 0 0 0 .49-.043 10 10 0 0 0 .489-.074 10 10 0 0 0 .51-.098 10 10 0 0 0 .47-.12 10 10 0 0 0 .477-.14 10 10 0 0 0 .47-.172 10 10 0 0 0 .481-.197 10 10 0 0 0 .414-.201 10 10 0 0 0 .475-.252 10 10 0 0 0 .39-.238 10 10 0 0 0 .452-.301 10 10 0 0 0 .38-.291 10 10 0 0 0 .385-.315 10 10 0 0 0 .375-.347 10 10 0 0 0 .36-.363 10 10 0 0 0 .293-.334 10 10 0 0 0 .353-.434 10 10 0 0 0 .28-.393 10 10 0 0 0 .263-.4 10 10 0 0 0 .264-.461 10 10 0 0 0 .228-.436 10 10 0 0 0 .195-.437 10 10 0 0 0 .196-.48 10 10 0 0 0 .228-.69 10 10 0 0 0 .028-.094 10 10 0 0 0 .021-.066 10 10 0 0 0 .098-.461 10 10 0 0 0 .103-.482 10 10 0 0 0 .051-.418 10 10 0 0 0 .065-.575 10 10 0 0 0 .005-.144A10 10 0 0 0 22 12a10 10 0 0 0-.01-.197 10 10 0 0 0-.025-.496 10 10 0 0 0-.043-.49 10 10 0 0 0-.074-.489 10 10 0 0 0-.098-.51 10 10 0 0 0-.12-.47 10 10 0 0 0-.14-.477 10 10 0 0 0-.172-.47 10 10 0 0 0-.197-.481 10 10 0 0 0-.201-.414 10 10 0 0 0-.252-.475 10 10 0 0 0-.238-.39 10 10 0 0 0-.301-.452 10 10 0 0 0-.291-.38 10 10 0 0 0-.315-.385 10 10 0 0 0-.347-.375 10 10 0 0 0-.363-.36 10 10 0 0 0-.334-.293 10 10 0 0 0-.434-.353 10 10 0 0 0-.393-.28 10 10 0 0 0-.4-.263 10 10 0 0 0-.461-.264 10 10 0 0 0-.436-.228 10 10 0 0 0-.437-.196 10 10 0 0 0-.48-.195 10 10 0 0 0-.69-.228 10 10 0 0 0-.094-.028 10 10 0 0 0-.066-.021 10 10 0 0 0-.461-.098 10 10 0 0 0-.482-.103 10 10 0 0 0-.418-.051 10 10 0 0 0-.575-.065 10 10 0 0 0-.144-.005A10 10 0 0 0 12 2zm-.016 5.002a5 5 0 0 1 .262.01 5 5 0 0 1 .227.011 5 5 0 0 1 .341.05 5 5 0 0 1 .135.019 5 5 0 0 1 .014.004 5 5 0 0 1 .115.025 5 5 0 0 1 .303.076 5 5 0 0 1 .265.086 5 5 0 0 1 .2.074 5 5 0 0 1 .242.106 5 5 0 0 1 .228.11 5 5 0 0 1 .196.109 5 5 0 0 1 .244.15 5 5 0 0 1 .17.12 5 5 0 0 1 .224.171 5 5 0 0 1 .186.16 5 5 0 0 1 .176.164 5 5 0 0 1 .172.18 5 5 0 0 1 .177.203 5 5 0 0 1 .133.172 5 5 0 0 1 .16.223 5 5 0 0 1 .133.214 5 5 0 0 1 .12.21 5 5 0 0 1 .107.216 5 5 0 0 1 .109.24 5 5 0 0 1 .084.223 5 5 0 0 1 .08.242 5 5 0 0 1 .07.264 5 5 0 0 1 .047.207 5 5 0 0 1 .045.277 5 5 0 0 1 .028.227 5 5 0 0 1 .02.351 5 5 0 0 1 .003.079 5 5 0 0 1-.012.271 5 5 0 0 1-.011.227 5 5 0 0 1-.05.341 5 5 0 0 1-.019.135 5 5 0 0 1-.004.014 5 5 0 0 1-.025.115 5 5 0 0 1-.076.303 5 5 0 0 1-.086.265 5 5 0 0 1-.074.2 5 5 0 0 1-.106.242 5 5 0 0 1-.11.228 5 5 0 0 1-.109.196 5 5 0 0 1-.15.244 5 5 0 0 1-.12.17 5 5 0 0 1-.171.224 5 5 0 0 1-.16.186 5 5 0 0 1-.164.176 5 5 0 0 1-.18.172 5 5 0 0 1-.203.177l-.002.002c-.018.019-.028.035-.047.053l-3.959 5.09-3.05-.979a141.684 141.684 0 0 0 3.177-3.084 5 5 0 0 1-.103-.015 5 5 0 0 1-.149-.024 5 5 0 0 1-.115-.025 5 5 0 0 1-3.57-3.04 5.072 5.072 0 0 1-.206-.661 5 5 0 0 1-.033-.147c-.025-.118-.036-.24-.054-.36-.987.993-1.964 1.993-2.954 3.05l-.98-3.053 5.092-3.957c.043-.044.082-.07.125-.11a5 5 0 0 1 .71-.634c.18-.13.367-.25.561-.356a5 5 0 0 1 .16-.08 4.94 4.94 0 0 1 .516-.222 5 5 0 0 1 .147-.057c.211-.07.43-.123.654-.164a5 5 0 0 1 .172-.027c.236-.035.476-.058.722-.059zM12 9a3 3 0 0 0-.053.002 3 3 0 0 0-.166.01 3 3 0 0 0-.133.011 3 3 0 0 0-.17.026 3 3 0 0 0-.113.021 3 3 0 0 0-.19.05 3 3 0 0 0-.103.03 3 3 0 0 0-.16.057 3 3 0 0 0-.129.053 3 3 0 0 0-.146.072 3 3 0 0 0-.12.063 3 3 0 0 0-.132.082 3 3 0 0 0-.123.08 3 3 0 0 0-.116.088 3 3 0 0 0-.126.105 3 3 0 0 0-.1.094 3 3 0 0 0-.111.111 3 3 0 0 0-.096.107 3 3 0 0 0-.094.116 3 3 0 0 0-.098.136 3 3 0 0 0-.072.11 3 3 0 0 0-.076.133 3 3 0 0 0-.07.132 3 3 0 0 0-.063.14 3 3 0 0 0-.054.14 3 3 0 0 0-.077.228 3 3 0 0 0-.007.026 3 3 0 0 0-.03.138 3 3 0 0 0-.031.149 3 3 0 0 0-.014.11 3 3 0 0 0-.02.183 3 3 0 0 0-.001.052A3 3 0 0 0 9 12a3 3 0 0 0 .002.053 3 3 0 0 0 .01.166 3 3 0 0 0 .011.133 3 3 0 0 0 .026.17 3 3 0 0 0 .021.113 3 3 0 0 0 .05.19 3 3 0 0 0 .03.103 3 3 0 0 0 .057.16 3 3 0 0 0 .053.129 3 3 0 0 0 .072.146 3 3 0 0 0 .063.12 3 3 0 0 0 .082.132 3 3 0 0 0 .08.123 3 3 0 0 0 .088.116 3 3 0 0 0 .105.126 3 3 0 0 0 .094.1 3 3 0 0 0 .111.111 3 3 0 0 0 .107.096 3 3 0 0 0 .116.094 3 3 0 0 0 .136.098 3 3 0 0 0 .11.072 3 3 0 0 0 .133.076 3 3 0 0 0 .132.07 3 3 0 0 0 .135.06 3 3 0 0 0 .153.061 3 3 0 0 0 .216.07 3 3 0 0 0 .004.003 3 3 0 0 0 .026.007 3 3 0 0 0 .138.03 3 3 0 0 0 .149.031 3 3 0 0 0 .11.014 3 3 0 0 0 .183.02 3 3 0 0 0 .011.001 3 3 0 0 0 .041 0A3 3 0 0 0 12 15a3 3 0 0 0 .053-.002 3 3 0 0 0 .166-.01 3 3 0 0 0 .133-.011 3 3 0 0 0 .17-.026 3 3 0 0 0 .113-.021 3 3 0 0 0 .19-.05 3 3 0 0 0 .103-.03 3 3 0 0 0 .16-.057 3 3 0 0 0 .129-.053 3 3 0 0 0 .146-.072 3 3 0 0 0 .12-.063 3 3 0 0 0 .132-.082 3 3 0 0 0 .123-.08 3 3 0 0 0 .116-.088 3 3 0 0 0 .126-.105 3 3 0 0 0 .1-.094 3 3 0 0 0 .111-.111 3 3 0 0 0 .096-.107 3 3 0 0 0 .094-.116 3 3 0 0 0 .098-.136 3 3 0 0 0 .072-.11 3 3 0 0 0 .076-.133 3 3 0 0 0 .07-.132 3 3 0 0 0 .06-.135 3 3 0 0 0 .061-.153 3 3 0 0 0 .07-.216 3 3 0 0 0 .003-.004 3 3 0 0 0 .007-.026 3 3 0 0 0 .03-.138 3 3 0 0 0 .031-.149 3 3 0 0 0 .002-.008 3 3 0 0 0 .012-.101 3 3 0 0 0 .02-.184 3 3 0 0 0 .001-.011 3 3 0 0 0 0-.041A3 3 0 0 0 15 12a3 3 0 0 0-.002-.053 3 3 0 0 0-.01-.166 3 3 0 0 0-.011-.133 3 3 0 0 0-.026-.17 3 3 0 0 0-.021-.113 3 3 0 0 0-.05-.19 3 3 0 0 0-.03-.103 3 3 0 0 0-.057-.16 3 3 0 0 0-.053-.129 3 3 0 0 0-.072-.146 3 3 0 0 0-.063-.12 3 3 0 0 0-.082-.132 3 3 0 0 0-.08-.123 3 3 0 0 0-.088-.116 3 3 0 0 0-.105-.126 3 3 0 0 0-.094-.1 3 3 0 0 0-.111-.111 3 3 0 0 0-.107-.096 3 3 0 0 0-.116-.094 3 3 0 0 0-.136-.098 3 3 0 0 0-.11-.072 3 3 0 0 0-.133-.076 3 3 0 0 0-.132-.07 3 3 0 0 0-.14-.063 3 3 0 0 0-.14-.054 3 3 0 0 0-.228-.077 3 3 0 0 0-.026-.007 3 3 0 0 0-.138-.03 3 3 0 0 0-.149-.031 3 3 0 0 0-.008-.002 3 3 0 0 0-.101-.012 3 3 0 0 0-.184-.02 3 3 0 0 0-.011-.001 3 3 0 0 0-.041 0A3 3 0 0 0 12 9z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 720 720" id="arduino" xmlns="http://www.w3.org/2000/svg"><defs><symbol id="ana" preserveAspectRatio="xMinYMin meet" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke-opacity="100%" stroke-width="60" stroke="#00979c" d="M174 30a10.5 10.1 0 0 0 0 280C364 320 344 30 544 30a10.5 10.1 0 0 1 0 280C354 320 374 30 174 30"/><path d="M528 205v-32.8h-32.5v-13.7H528V126h13.9v32.5h32.5v13.7h-32.5V205H528z" text-anchor="middle" fill="#00979c" stroke-width="20" stroke="#00979c" font-family="sans-serif" font-size="167"/><path fill="#00979c" stroke="#00979c" stroke-width="23.6" transform="matrix(1.56 0 0 .64 -366 .528)" d="M321 266v-17.4h53.3V266H321z"/></symbol></defs><title>Layer 1</title><use x="20.063" y="360.85" transform="matrix(.997 0 0 .997 -18.596 -159.19)" xlink:href="#ana"/></symbol><symbol viewBox="0 0 24 24" id="assembly" xmlns="http://www.w3.org/2000/svg"><path d="M1.746 1.566v20.905H5.13v-2.088H3.438V3.656h1.69v-2.09H1.747zm17.219 0v2.09h1.693v16.727h-1.693v2.09h3.383V1.566h-3.383zM15.196 3.988c-.5 0-.93.076-1.29.225-.359.15-.652.372-.877.671-.226.302-.39.673-.494 1.108a6.715 6.715 0 0 0-.155 1.54c0 .573.049 1.083.15 1.528.1.442.264.811.49 1.11.222.298.512.524.872.676.36.153.795.23 1.304.23.518 0 .954-.075 1.308-.224.353-.153.643-.376.869-.671.219-.29.38-.661.484-1.112.104-.454.156-.967.156-1.54 0-.573-.052-1.079-.152-1.515a2.92 2.92 0 0 0-.485-1.106 2.09 2.09 0 0 0-.868-.686c-.354-.155-.79-.234-1.312-.234zm-6.814.12a.941.941 0 0 1-.138.458.849.849 0 0 1-.356.296A1.71 1.71 0 0 1 7.385 5a5.244 5.244 0 0 1-.631.037v1.11H8.19v3.6H6.754v1.188h4.545V9.745H9.894V4.11H8.382zm6.814 1.138c.375 0 .643.176.805.527.161.348.241.933.241 1.756 0 .814-.082 1.399-.247 1.756-.164.356-.43.534-.799.534-.369 0-.636-.178-.8-.534-.165-.357-.248-.941-.248-1.749 0-.829.082-1.415.243-1.763.162-.35.43-.527.805-.527zm-6.33 7.64c-.5 0-.93.073-1.29.223-.359.15-.651.374-.877.673-.225.302-.39.67-.494 1.106a6.715 6.715 0 0 0-.155 1.54c0 .573.05 1.082.15 1.527.1.442.264.814.49 1.112.222.3.514.525.874.677.36.152.793.229 1.302.229.519 0 .954-.076 1.308-.225.354-.153.643-.376.869-.672.22-.29.38-.66.484-1.111.104-.455.156-.967.156-1.54 0-.573-.05-1.079-.15-1.515a2.923 2.923 0 0 0-.487-1.106 2.084 2.084 0 0 0-.867-.686c-.353-.156-.791-.232-1.313-.232zm5.846.119a.941.941 0 0 1-.138.457.85.85 0 0 1-.356.296 1.71 1.71 0 0 1-.503.137 5.245 5.245 0 0 1-.631.037v1.112h1.435v3.597h-1.435v1.189h4.545v-1.189h-1.405v-5.636h-1.512zm-5.846 1.137c.375 0 .643.176.805.527.162.347.241.933.241 1.756 0 .813-.08 1.399-.245 1.755-.164.357-.432.534-.8.534-.37 0-.637-.177-.802-.534-.164-.356-.245-.939-.245-1.746 0-.83.08-1.418.242-1.765.161-.35.43-.527.804-.527z" fill="#ff6e40"/></symbol><symbol viewBox="0 0 24 24" id="aurelia" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="api" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#apa"/><linearGradient id="apa" x1="-3.881" x2="2.377" y1="-1.442" y2="4.304"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#apb"/><linearGradient id="apb" x1=".729" x2="-.971" y1=".844" y2="-1.477"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="apk" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#apc"/><linearGradient id="apc" x1="-2.839" x2="2.875" y1="-6.936" y2="1.017"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apl" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#apd"/><linearGradient id="apd" x1="-8.212" x2="1.02" y1="-4.691" y2="2.882"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apm" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#ape"/><linearGradient id="ape" x1="-1.404" x2="4.19" y1="-2.309" y2="2.62"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="apn" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#apf"/><linearGradient id="apf" x1="1.911" x2=".204" y1="2.539" y2=".204"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="apo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#apg"/><linearGradient id="apg" x1="-3.881" x2="2.377" y1="-1.738" y2="5.19"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="app" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#aph"/><linearGradient id="aph" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><g transform="rotate(11.282 -1.694 21.569) scale(.47102)" clip-rule="evenodd" fill="none" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#api)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#apj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#apk)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#apl)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#apm)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#apn)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#apo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#app)"/></g></symbol><symbol viewBox="0 0 24 24" id="autohotkey" xmlns="http://www.w3.org/2000/svg"><path d="M5 3c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H5zm3.668 3.447a.9.9 0 0 1 .652.256.84.84 0 0 1 .262.625c0 .34-.014.852-.041 1.537-.022.68-.033 1.19-.033 1.53 0 .111-.016.326-.047.644a6.149 6.149 0 0 0-.033.68l2.578-.485c1.007-.179 1.874-.281 2.603-.308.018-.3.048-1.105.088-2.416.01-.345.115-.742.317-1.19.25-.55.533-.826.851-.826.237 0 .448.08.631.236.197.17.295.382.295.637a.775.775 0 0 1-.025.201c-.09.327-.135.612-.135.854 0 .125-.014.32-.041.584-.023.26-.033.453-.033.578 0 .425-.022 1.056-.067 1.893a38.963 38.963 0 0 0-.068 1.892c0 .327.025.816.074 1.465.05.649.074 1.136.074 1.463a.84.84 0 0 1-.261.625.893.893 0 0 1-.65.254 1 1 0 0 1-.686-.254.777.777 0 0 1-.29-.611c0-.327-.015-.818-.046-1.471a39.552 39.552 0 0 1-.041-1.47c0-.256.004-.482.013-.679-.702.032-1.57.142-2.603.33-.86.157-1.719.316-2.578.477-.01.304-.042.812-.096 1.523a22.354 22.354 0 0 0-.066 1.538.84.84 0 0 1-.262.625.893.893 0 0 1-.65.253.898.898 0 0 1-.653-.253.84.84 0 0 1-.262-.625c0-.452.038-1.128.114-2.028.08-.9.12-1.575.12-2.027 0-.573.015-1.436.042-2.586.027-1.155.04-2.017.04-2.59a.84.84 0 0 1 .263-.625.895.895 0 0 1 .65-.256z" fill="#4caf50"/></symbol><symbol viewBox="0 0 24 24" id="autoit" xmlns="http://www.w3.org/2000/svg"><defs id="ardefs8"><style id="arstyle4482">.cls-1{fill:#5d83ac}.cls-2{fill:#f0f0f0;fill-rule:evenodd}</style><style id="arstyle4510">.cls-1{fill:#5d83ac}.cls-2{fill:#f0f0f0;fill-rule:evenodd}</style></defs><g id="arg4522" transform="translate(-59.538 -26.404) scale(.0555)"><path d="M12.8 2.133A10.666 10.666 0 0 0 2.136 12.799 10.666 10.666 0 0 0 12.8 23.465a10.666 10.666 0 0 0 10.668-10.666A10.666 10.666 0 0 0 12.8 2.133zm.15 4.713c.456 0 .836.105 1.142.314.306.21.565.469.78.78l6.089 8.812H9.627l1.82-2.506h3.36c.315 0 .589.01.822.03a11.93 11.93 0 0 1-.473-.663 39.13 39.13 0 0 0-.517-.75l-1.748-2.578-4.577 6.467H4.746l6.25-8.813c.204-.281.46-.534.772-.757.31-.224.705-.336 1.181-.336z" transform="matrix(16.89188 0 0 16.89188 1072.761 475.745)" id="arcircle4514" fill="#1976d2" stroke-width=".026"/></g></symbol><symbol viewBox="0 0 213.33333 213.33333" id="babel" xmlns="http://www.w3.org/2000/svg"><path d="M50.22 199.659c-.875-.406-1.261-1.6-.857-2.652.404-1.053.12-1.914-.63-1.914s-1.615.748-1.92 1.663c-.328.983-1.27.302-2.304-1.667-.962-1.831-3.718-5.533-6.126-8.226-9.418-10.535-7.71-27.444 5.432-53.77 12.459-24.96 23.117-39.033 45.966-60.696 30.229-28.66 52.679-46.223 70.587-55.22 10.98-5.518 13.025-5.059 2.778.624-11.004 6.102-11.378 6.359-10.512 7.226.33.33 7.306-2.67 15.504-6.667 15.87-7.737 16.34-7.912 16.34-6.082 0 .652-4.95 3.738-11 6.858-13.062 6.736-12.722 6.48-10.472 7.872 1.117.69 5.428-.582 11.54-3.406 5.367-2.48 10.397-4.508 11.179-4.508 2.755 0-3.928 5.302-11.541 9.157-20.437 10.35-68.937 46.043-68.07 50.097.166.777-5.792 7.639-13.241 15.248-15.257 15.587-26.14 30.002-33.748 44.706-6.379 12.326-7.457 17.734-5.385 26.996 3.482 15.56 11.592 18.366 31.482 10.895 28.228-10.603 45.758-28.704 47.022-48.556.602-9.442-1.317-13.479-8.52-17.93-4.01-2.48-5.268-2.621-12.065-1.365-4.173.771-10.153 2.906-13.289 4.744s-6.455 3.34-7.377 3.34c-.922 0-3.216 1.336-5.096 2.968-1.88 1.633.48-1.13 5.247-6.14 6.82-7.167 7.956-8.9 5.333-8.132-5.208 1.525-10.194 4.33-15.649 8.803-2.76 2.264-.923.175 4.08-4.641 11.565-11.131 21.183-15.97 33.088-16.641 17.097-.966 27.254 5.805 31.964 21.31 2.435 8.017 2.609 10.24 1.353 17.37-1.65 9.361-7.034 21.553-15.593 35.307-4.398 7.067-8.434 11.427-15.588 16.844-9.166 6.94-15.654 11.02-15.654 9.845 0-.295 2.455-2.161 5.455-4.147 8.818-5.835 5.075-5.377-8.326 1.02-6.854 3.27-15.199 6.593-18.542 7.38-7.106 1.675-30.527 3.164-32.846 2.089zm-8.408-19.899c0-1.1-.6-2-1.333-2-.734 0-1.334.9-1.334 2s.6 2 1.333 2c.734 0 1.334-.9 1.334-2zm89.255-8.204c1.53-1.945 2.473-3.845 2.097-4.222-.377-.377-.836-.435-1.02-.13-.182.306-1.787 2.206-3.565 4.223-1.778 2.016-2.571 3.666-1.763 3.666s2.72-1.591 4.25-3.536zm-77.644-1.745c-.82-2.172-1.74-3.7-2.045-3.396-.951.952 1.088 7.345 2.343 7.345.656 0 .522-1.777-.298-3.95zm82.303-27.915c-.837-.837-3.217 2.55-3.184 4.53.012.734.896.178 1.965-1.235 1.07-1.413 1.618-2.896 1.219-3.295zm-66.238-36.904c-1.312-1.312-3.676.702-3.676 3.133 0 2.035.175 2.031 2.254-.047 1.24-1.24 1.88-2.628 1.422-3.086zm39.657.768c4.403-2.196 6.8-3.986 5.333-3.982-2.838.01-16.667 6.028-16.667 7.254 0 1.6 3.717.527 11.333-3.272zm16.667-5.333c0-.733-.9-1.333-2-1.333s-2 .6-2 1.333.9 1.333 2 1.333 2-.6 2-1.333zm-3.334-3.923l5.334-1.104-7.334-.133c-4.033-.073-8.233.45-9.333 1.16-2.539 1.64 3.572 1.682 11.333.077zm35.738-63.976c2.788-1.69 4.765-3.376 4.393-3.748-.947-.947-11.942 5.654-14.237 8.548-1.792 2.258-1.714 2.276 1.44.329a1452.76 1452.76 0 0 1 8.403-5.13z" fill="#ffca28" stroke-width="1.333"/></symbol><symbol viewBox="0 0 400 400" fill-opacity=".05" id="bithound" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.88 0 0 .88 24.121 2.895)" fill="#e53935" fill-opacity="1"><path d="M370.5 207c-1.5-14.8-4.8-29.9-9.5-44-13.5-40.3-38.6-81.6-70.3-110.1-1.4-1.2-6.7-4.4-8.7-3.3-5.2 2.9 4.6 22.8 5.8 26.4 7.4 22 12.1 45.3 6.8 68.3-7.1 30.4-30.4 51.7-61.5 54.3-17.1 1.4-34.3-.5-51.4 1.5-25.6 3-51.7 11.8-68 32.8-1.9 2.4-3.6 5.1-5.2 7.9h-.4c-6.3.7-12.6-2-15.7-3.7-.8-.5-1.6-.9-2.2-1.2-19-10.5-33-34-41.6-53.4-3.9-9-7.2-18.4-9.3-27.9-1-4.3-1.1-8.8-1.3-13.2-.1-2.7.3-6.5-1.2-8.9-3.3-5.2-7.5-.2-8.2 4-1.1 6.9-2.1 13.7-1.8 20.7.5 11.8 3.8 23.5 8 34.5 6.2 16.2 14.9 31.1 26.2 44.4 4.7 5.5 9.7 10.6 15.1 15.3 4.8 4.3 10.9 7.7 14.5 13.2 4.2 6.3 4.9 14.1 4.5 21.4-1 19.3-1.6 37.4 3.9 56.2 4.8 16.7 10.8 33.8 20.8 48.1 5 7.1 11.2 14.6 18 19.9 4.6 3.6 13.3 4 8.3-9.2-11.1-29.3-12.1-59.7 5.2-87.1 14.5-22.8 40.1-43.1 69-39.5 42.5 5.3 72.1 44.3 70 86-.6 11.7-1 21.7-4.7 32.7-1.5 4.4-2.6 10-1.5 14.6 1.8 7.8 10.5 4.9 14.3-.2 10.3-14 21.1-27.6 30.8-42 31.6-47.2 47-101.8 41.3-158.5z"/><path d="M132.4 92.1c.7 2.3 1.4 4.8 1.9 7.5.1 1.1.4 2.3 1 3.4 2.6 6.8 8.9 10.5 14.8 14 3.6 2.2 10.1 4.3 14.1 5.9 5.2 2.1 16.4-.6 21.7-1 12.2-1 23.5-5.3 34.7 1.2-57.4 67.3-3.2 82.3 38.8 49.9 48-37 2.8-124.3 2.8-124.3s-1-6.8-19.2-10.8c-1.7-.9-3.4-1.7-5.1-2.4-18-8.3-34.2 5.3-47.2 16.4-3.8 3.2-7.5 6.4-11.5 9.4-5.4 4-11.2 7.3-17.3 10.2-6.4 3-14 6.4-21.1 6.7-1 0-2.9.2-4.9.6-3.1.3-4.7 1.1-5.4 2.5-1.2 1-2 2.4-1.8 4.2.2 2.5 1.4 4.6 2.7 6.2.4.1.7.3 1 .4z"/></g></symbol><symbol viewBox="0 0 400.00001 399.99999" id="bower" xmlns="http://www.w3.org/2000/svg"><g transform="translate(12.061 33.203) scale(.81733)"><path d="M447.61 200.08c-23.139-22.234-138.85-36.114-175.36-40.154a107.137 107.137 0 0 0 4.517-12.944 146.107 146.107 0 0 1 15.905-5.901c.677 1.997 3.865 9.648 5.682 13.279 73.415 2.025 77.184-54.557 80.17-70.058 2.92-15.157 2.771-29.802 27.953-56.575-37.516-10.933-91.467 16.945-109.54 58.437-6.79-2.545-13.597-4.424-20.328-5.586-4.824-19.46-29.944-73.672-95.863-73.672-83.46 0-174.43 68.853-174.43 185.41 0 97.976 66.891 183.84 104.68 183.84 16.505 0 30.703-12.36 34.036-23.44 2.795 7.597 11.368 31.213 14.184 37.225 4.162 8.89 23.41 16.583 31.833 7.357 10.83 6.017 30.703 9.641 41.534-6.405 20.86 4.412 39.3-8.026 39.702-22.868 10.235-.546 15.256-14.918 13.021-26.363-1.647-8.426-19.248-38.66-26.113-49.098 13.59 11.054 48.013 14.183 52.194.007 21.911 17.198 56.057 8.171 58.765-5.815 26.624 6.917 57.16-8.276 52.146-26.676 42.771-2.958 37.296-48.464 25.296-59.996z" fill="#543729" stroke-width=".973"/><path d="M328.514 103.025c9.212-18.277 20.788-38.234 35.409-50.58-16.093 6.485-31.981 25.873-41.375 46.595a144.914 144.914 0 0 0-14.552-8.132c13.105-27.972 43.555-51.332 77.112-53.157-22.477 20.385-14.498 62.754-32.979 85.183-5.288-5.311-17.43-15.562-23.615-19.909zm-14.53 29.762c.01-.7.272-6.094.763-8.557-1.288-.304-9.3-1.87-13.476-1.772-.304 5.245 2.204 14.17 4.684 19.541 17.075-.358 29.408-5.471 36.667-10.172-6.18-2.88-16.726-5.442-24.745-6.974-.894 1.851-3.097 6.568-3.892 7.934z" fill="#00acee"/><g stroke-width=".973"><path d="M250.54 277.39c.004.024.015.057.018.082-2.165-4.657-4.463-10.314-7.208-17.708 10.688 15.557 44.184 7.533 42.427-6.407 16.395 12.336 50.143-2.055 42.471-19.353 16.423 7.653 35.168-7.745 30.964-14.455 28 5.4 54.832 10.783 63.256 12.938-5.595 9.123-18.339 15.566-37.549 11.089 10.38 14.14-9.773 31.105-37.844 21.76 6.18 13.883-18.814 26.38-47.22 11.91.361 13.889-35.24 15.488-49.315.143zm55.543-70.194c32.497 2.495 86.238 7.34 119.51 11.997-2.102-10.828-7.844-13.921-25.905-18.772-19.425 2.072-68.706 6.913-93.604 6.776z" fill="#2baf2b"/><path d="M285.78 253.36c16.395 12.336 50.143-2.055 42.471-19.353 16.423 7.653 35.168-7.745 30.964-14.455-33.103-6.383-67.84-12.788-75.719-13.908 4.78.254 12.702.797 22.59 1.556 24.899.137 74.18-4.704 93.604-6.775-31.452-7.975-95.666-19.613-140.01-22.48-2.055 3.003-5.833 8.097-12.413 13.51-19.403 41.053-54.557 68.34-93.454 68.34-11.335 0-24.018-1.912-38.233-6.456-8.865 9.497-46.661 16.694-77.329 1.641 24.326 56.961 80.74 94.984 143.19 94.984 52.591 0 75.912-53.704 70.808-67.914-1.238-3.45-6.145-14.889-8.891-22.283 10.689 15.556 44.185 7.532 42.429-6.408z" fill="#ffcc2f"/><path d="M253.91 145.27c4.644-2.526 20.69-12.253 35.981-15.908a67.843 67.843 0 0 1-.536-5.12c-10.032 2.403-28.945 10.51-39.784-.661 22.866 6.9 34.283-6.149 51.09-6.149 10.014 0 24.305 2.798 35.57 7.22-9.061-8.37-38.772-33.63-75.558-33.717-8.213 9.957-17.09 31.526-6.764 54.334z" fill="#cecece"/><path d="M115.58 253.33c14.215 4.544 26.898 6.457 38.233 6.457 38.896 0 74.05-27.29 93.454-68.341-14.351 11.978-39.291 22.228-78.241 22.228 34.694-7.866 64.56-25.156 79.753-50.427-10.68-16.998-22.263-54.603 7.07-84.33-4.512-14.497-26.475-52.766-75.095-52.766-84.85 0-155.17 71.001-155.17 166.15 0 22.525 4.547 43.65 12.67 62.664 30.666 15.054 68.462 7.858 77.327-1.64z" fill="#ef5734"/><path d="M141.03 108.45c0 21.644 17.546 39.191 39.19 39.191s39.192-17.548 39.192-39.191c0-21.644-17.548-39.191-39.192-39.191-21.644 0-39.19 17.547-39.19 39.191z" fill="#ffcc2f"/><path d="M156.76 108.45c0 12.958 10.507 23.463 23.463 23.463 12.96 0 23.464-10.506 23.464-23.463 0-12.959-10.504-23.464-23.464-23.464-12.957 0-23.463 10.506-23.463 23.464z" fill="#543729"/><ellipse cx="180.22" cy="98.044" rx="13.673" ry="8.501" fill="#fff"/></g></g></symbol><symbol viewBox="0 0 140 140" id="browserlist" xmlns="http://www.w3.org/2000/svg"><title>Browserslist logo</title><path d="M70.314 10.066a59.828 59.828 0 0 0-59.828 59.828 59.828 59.828 0 0 0 59.828 59.828 59.828 59.828 0 0 0 59.828-59.828 59.828 59.828 0 0 0-59.828-59.828zm-4.836 8.785c.496 4.043 1.352 7.322 2.572 10.223 4.779-4.287 10.265-7.546 16.041-9.02-.981 3.938-1.357 7.295-1.261 10.43 6.026-2.314 12.349-3.404 18.3-2.706-3.182 2.413-5.482 4.717-7.128 7.015-2.201 12.074 6.858 20.43 14.779 24.551a5.128 5.128 0 0 1 5.183-3.888 5.128 5.128 0 0 1 3.7 8.435v.002c-.487 1.055-2.002 2.343-3.497 3.219-4.075 2.39-11.172 5.736-20.914 7.39.045 1.214.077 2.453.077 3.747 0 4.817-.485 8.291-1.385 10.699-3.3 13.313-12.648 26.76-24.695 31.95.357-4.083.197-7.485-.402-10.591-5.582 3.218-11.646 5.278-17.623 5.52h-.002c1.785-3.662 2.855-6.878 3.412-9.976-6.347.996-12.727.742-18.377-1.17 2.93-2.732 5.054-5.314 6.673-7.96-6.292-1.344-12.169-3.87-16.766-7.686 3.822-1.544 6.795-3.239 9.3-5.197-5.426-3.517-10.034-7.998-12.972-13.23 4.012-.07 7.321-.568 10.3-1.453-3.786-5.215-6.468-11.032-7.333-16.951 3.861 1.405 7.196 2.133 10.36 2.355-1.662-6.22-2.081-12.605-.768-18.436 3.03 2.634 5.824 4.48 8.63 5.815.678-6.406 2.576-12.52 5.893-17.496 1.926 3.622 3.914 6.391 6.111 8.672 2.93-5.754 6.9-10.798 11.791-14.262zm26.465 19.557c-2.395 5.514-1.665 11.297-.555 18.732a2.138 2.138 0 0 0 .28-4.178 3.419 3.419 0 1 1 .092 6.704c.574 3.882 1.157 8.18 1.421 13.125a67.143 67.143 0 0 0 3.25-.649c6.616-1.487 12.258-3.801 16.871-6.506.45-.264.884-.563 1.276-.867.366-.557.333-.957.035-1.285-4.831-1.245-10.891-4.53-15.258-8.795-4.764-4.653-7.428-10.164-7.412-16.281z" fill="#ffca28" stroke-width=".855"/></symbol><symbol viewBox="0 0 140 140" id="browserlist_light" xmlns="http://www.w3.org/2000/svg"><title>Browserslist logo</title><g transform="translate(10.823 10.1)" stroke-width=".855"><circle cx="59.492" cy="59.795" r="59.828" fill="#ffca28"/><path d="M54.656 8.752c-4.89 3.464-8.862 8.508-11.791 14.262-2.198-2.28-4.185-5.05-6.111-8.672-3.318 4.976-5.216 11.09-5.893 17.496-2.807-1.335-5.6-3.18-8.63-5.814-1.314 5.83-.895 12.216.767 18.436-3.164-.223-6.498-.95-10.36-2.356.865 5.92 3.548 11.737 7.333 16.951-2.978.885-6.287 1.383-10.3 1.453 2.939 5.233 7.547 9.714 12.972 13.23-2.505 1.959-5.478 3.654-9.299 5.198 4.596 3.815 10.474 6.341 16.766 7.685-1.62 2.647-3.743 5.228-6.674 7.96 5.65 1.912 12.03 2.166 18.377 1.17-.556 3.098-1.626 6.314-3.412 9.975h.002c5.977-.24 12.042-2.3 17.623-5.52.6 3.108.76 6.51.402 10.593 12.047-5.19 21.395-18.638 24.695-31.951.9-2.408 1.385-5.881 1.385-10.7 0-1.293-.031-2.531-.076-3.745 9.742-1.655 16.839-5.001 20.914-7.39 1.494-.877 3.01-2.165 3.496-3.22v-.002a5.128 5.128 0 0 0-3.7-8.435 5.128 5.128 0 0 0-5.183 3.889c-7.92-4.122-16.98-12.477-14.779-24.551 1.646-2.299 3.947-4.603 7.13-7.016-5.952-.698-12.276.392-18.302 2.707-.095-3.135.28-6.492 1.262-10.43-5.776 1.473-11.262 4.733-16.041 9.02-1.22-2.902-2.076-6.18-2.572-10.223zm26.465 19.557c-.015 6.117 2.648 11.628 7.412 16.281 4.366 4.265 10.426 7.55 15.258 8.795.298.328.331.728-.035 1.285-.392.304-.825.603-1.275.867-4.613 2.704-10.256 5.019-16.871 6.506-1.071.24-2.154.458-3.25.649-.265-4.945-.848-9.243-1.422-13.125a3.419 3.419 0 1 0-.092-6.703 2.138 2.138 0 0 1-.28 4.177c-1.11-7.435-1.84-13.218.555-18.732z" fill="#37474f"/></g></symbol><symbol viewBox="0 0 24 24" id="bucklescript" xmlns="http://www.w3.org/2000/svg"><path d="M3 3v18h18V3H3zm14.1 8.858a5.5 5.5 0 0 1 1.26.145c.417.093.778.213 1.082.357v1.723h-.18a3.281 3.281 0 0 0-.959-.603 2.867 2.867 0 0 0-1.155-.247c-.14 0-.277.011-.416.035a1.4 1.4 0 0 0-.395.12.756.756 0 0 0-.291.231.54.54 0 0 0-.123.348c0 .198.065.35.196.456.13.104.376.2.738.288.237.057.466.11.683.164.22.054.455.128.706.222.496.188.86.444 1.095.77.238.32.357.738.357 1.253 0 .737-.271 1.336-.813 1.798-.538.46-1.27.689-2.197.689a5.447 5.447 0 0 1-1.402-.161 6.725 6.725 0 0 1-1.117-.416v-1.794h.183c.344.318.73.563 1.155.734.429.17.839.256 1.233.256.1 0 .235-.01.4-.03.166-.02.3-.055.403-.102a.97.97 0 0 0 .313-.225c.084-.09.127-.223.127-.4a.568.568 0 0 0-.183-.424c-.119-.12-.294-.213-.526-.276-.243-.067-.5-.128-.773-.185a5.523 5.523 0 0 1-.76-.227c-.544-.204-.936-.48-1.177-.828-.237-.351-.357-.786-.357-1.305 0-.697.27-1.265.81-1.703.54-.442 1.235-.663 2.083-.663zm-8.981.135h2.51c.521 0 .903.02 1.143.06.243.041.484.13.721.266.246.144.43.338.548.583.121.24.181.518.181.83 0 .36-.082.68-.247.959a1.697 1.697 0 0 1-.7.642v.04c.423.098.758.298 1.004.603.249.305.373.706.373 1.205 0 .361-.063.686-.19.97-.125.285-.296.52-.516.707a2.31 2.31 0 0 1-.845.472c-.304.094-.69.141-1.159.141H8.12v-7.478zm1.659 1.372v1.582h.262c.263 0 .486-.007.672-.017.185-.01.332-.043.44-.1.15-.077.248-.175.294-.295.046-.124.07-.266.07-.427a.91.91 0 0 0-.083-.371.518.518 0 0 0-.282-.277 1.187 1.187 0 0 0-.456-.086c-.18-.007-.433-.01-.76-.01h-.157zm0 2.873V18.1H9.9c.469 0 .804-.002 1.007-.006.202-.003.39-.046.56-.13a.712.712 0 0 0 .357-.33c.067-.142.099-.302.099-.483 0-.237-.04-.42-.121-.547-.078-.13-.214-.228-.405-.291a1.842 1.842 0 0 0-.538-.072 49.47 49.47 0 0 0-.716-.003h-.366z" fill="#26a69a" stroke-width="1.067"/></symbol><symbol viewBox="0 0 24 24" id="c" xmlns="http://www.w3.org/2000/svg"><path d="M15.45 15.97l.42 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96-1.14-1.27-1.68-2.88-1.68-4.83C6 9.9 6.68 8.13 8 6.89 9.28 5.64 10.92 5 12.9 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.6 2.49-1.04-.34c-.4-.1-.87-.15-1.4-.15-1.15-.01-2.11.36-2.86 1.1-.76.73-1.14 1.85-1.18 3.34.01 1.36.37 2.42 1.08 3.2.71.77 1.7 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.09-.32z" fill="#0277bd"/></symbol><symbol viewBox="0 0 300 300" id="cabal" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -822.52)" fill-rule="evenodd" color="#000"><rect transform="matrix(-.98339 .18149 .60192 .79856 0 0)" x="405.55" y="967.22" width="107.25" height="156.59" rx="12.306" ry="12.31" fill="#2d9bbd"/><rect transform="matrix(-.98528 .17093 -.59175 .80612 0 0)" x="-1156.5" y="1461.9" width="108.34" height="123.15" rx="10.69" ry="12.31" fill="#4a4bcd"/><path d="M52.112 965.158c-1.343 3.515-26.292 23.248-25.744 27.277.548 4.03 29.812 16.023 32.04 19.027s10.545 41.668 13.603 42.5 18.828-31.274 21.548-32.932c2.72-1.658 32.808 2.503 34.15-1.01 1.343-3.515-18.174-35.352-18.721-39.381-.548-4.03 9.732-40.12 7.502-43.125-2.229-3.005-30.06 9.427-33.118 8.594-3.059-.833-26.793-27.3-29.514-25.643-2.72 1.657-.405 41.177-1.747 44.693z" fill="#2e5bc1"/></g></symbol><symbol viewBox="0 0 24 24" id="cake" xmlns="http://www.w3.org/2000/svg"><path d="M12.254 6.621a1.807 1.807 0 0 0 1.808-1.807c0-.344-.09-.66-.262-.932l-1.546-2.684-1.546 2.684a1.72 1.72 0 0 0-.262.932 1.808 1.808 0 0 0 1.808 1.807m4.158 9.04l-.967-.976-.976.976c-1.175 1.166-3.236 1.175-4.42 0l-.959-.976-.994.976a3.134 3.134 0 0 1-3.977.353v4.167a.904.904 0 0 0 .904.904h14.463a.904.904 0 0 0 .904-.904v-4.167a3.134 3.134 0 0 1-3.977-.353m1.265-6.328h-4.52V7.525H11.35v1.808H6.83a2.712 2.712 0 0 0-2.711 2.712v1.392c0 .977.795 1.772 1.771 1.772.489 0 .94-.18 1.248-.515l1.952-1.926 1.908 1.926c.669.669 1.835.669 2.504 0l1.916-1.926 1.944 1.926c.316.334.768.515 1.247.515.976 0 1.78-.795 1.78-1.772v-1.392a2.712 2.712 0 0 0-2.711-2.712z" fill="#ff7043" stroke-width=".904"/></symbol><symbol viewBox="0 0 24 24" id="certificate" xmlns="http://www.w3.org/2000/svg"><path d="M4 3c-1.11 0-2 .89-2 2v10a2 2 0 0 0 2 2h8v5l3-3 3 3v-5h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H4m8 2l3 2 3-2v3.5l3 1.5-3 1.5V15l-3-2-3 2v-3.5L9 10l3-1.5V5M4 5h5v2H4V5m0 4h3v2H4V9m0 4h5v2H4v-2z" fill="#ff5722"/></symbol><symbol viewBox="0 0 24 24" id="changelog" xmlns="http://www.w3.org/2000/svg"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 24 24" id="clojure" xmlns="http://www.w3.org/2000/svg"><path d="M3.355 1.78c-.845 0-1.525.68-1.525 1.525v17.441c0 .845.68 1.525 1.525 1.525h17.442c.845 0 1.525-.68 1.525-1.525V3.305c0-.845-.68-1.526-1.525-1.526H3.355zm6.168 2.572h1.963l6.368 14.931H15.93l-3.38-8.086-3.349 8.086H7.21l4.346-10.38-2.032-4.551z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="cmake" xmlns="http://www.w3.org/2000/svg"><path d="M11.99 2.965L2.977 20.999l9.874-8.47-.863-9.564z" fill="#1e88e5"/><path d="M12.007 2.963l.002.29 1.312 14.498-.001.006.023.26 7.362 2.979h.416l-.158-.311-.114-.228h-.002l-8.84-17.494z" fill="#e53935"/><path d="M8.607 16.11L2.98 20.995h17.743v-.016L8.607 16.11z" fill="#7cb342"/></symbol><symbol class="bfmain_logo__svg" viewBox="0 0 300 300.00001" id="code-climate" xmlns="http://www.w3.org/2000/svg"><path class="bfsymbol" d="M196.19 75.562l-51.846 51.561 30.766 30.766 21.08-21.08 59.252 59.537 30.481-30.766zm-61.246 60.961l-30.481-30.481-78.053 78.053-11.964 11.964 30.766 30.766 11.964-12.249 39.596-39.312 7.691-7.691 30.481 30.48 28.772 28.773 30.766-30.766-28.772-28.772z" fill="#eee" stroke-width="2.849"/></symbol><symbol class="bgmain_logo__svg" viewBox="0 0 300 300.00001" id="code-climate_light" xmlns="http://www.w3.org/2000/svg"><path class="bgsymbol" d="M196.19 75.562l-51.846 51.561 30.766 30.766 21.08-21.08 59.252 59.537 30.481-30.766zm-61.246 60.961l-30.481-30.481-78.053 78.053-11.964 11.964 30.766 30.766 11.964-12.249 39.596-39.312 7.691-7.691 30.481 30.48 28.772 28.773 30.766-30.766-28.772-28.772z" fill="#455a64" stroke-width="2.849"/></symbol><symbol viewBox="0 0 24 24" id="coffee" xmlns="http://www.w3.org/2000/svg"><path d="M2 21h18v-2H2M20 8h-2V5h2m0-2H4v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4v-3h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="coldfusion" xmlns="http://www.w3.org/2000/svg"><rect transform="rotate(90)" x="2.283" y="-21.86" width="19.487" height="19.487" ry="0" fill="#0d3858" stroke="#4dd0e1" stroke-width=".7"/><text x="6.653" y="16.426" fill="#4dd0e1" font-family="Calibri" font-size="29.001" font-weight="bold" letter-spacing="0" stroke-width=".725" word-spacing="0" style="line-height:1.25"><tspan x="6.653" y="16.426" font-family="'Segoe UI'" font-size="10.634" font-weight="normal">C<tspan font-size="11.844">f</tspan></tspan></text></symbol><symbol viewBox="0 0 24 24" id="conduct" xmlns="http://www.w3.org/2000/svg"><path d="M10 17l-4-4 1.41-1.41L10 14.17l6.59-6.59L18 9m-6-6a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#cddc39"/></symbol><symbol viewBox="0 0 24 24" id="console" xmlns="http://www.w3.org/2000/svg"><path d="M20 19V7H4v12h16m0-16a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16m-7 14v-2h5v2h-5m-3.42-4L5.57 9H8.4l3.3 3.3c.39.39.39 1.03 0 1.42L8.42 17H5.59z" fill="#ff7043"/></symbol><symbol viewBox="0 0 24 24" id="contributing" xmlns="http://www.w3.org/2000/svg"><path d="M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="cpp" xmlns="http://www.w3.org/2000/svg"><path d="M10.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96C1.56 15.77 1 14.16 1 12.21c.05-2.31.72-4.08 2-5.32C4.32 5.64 5.96 5 7.94 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32M11 11h2V9h2v2h2v2h-2v2h-2v-2h-2v-2m7 0h2V9h2v2h2v2h-2v2h-2v-2h-2v-2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="credits" xmlns="http://www.w3.org/2000/svg"><path d="M3 3h18v2H3V3m4 4h10v2H7V7m-4 4h18v2H3v-2m4 4h10v2H7v-2m-4 4h18v2H3v-2z" fill="#9ccc65"/></symbol><symbol viewBox="0 0 200 200" id="crystal" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:none}</style><path d="M179.363 121.67l-57.623 57.507c-.23.23-.576.346-.806.23l-78.713-21.09c-.346-.115-.577-.345-.577-.576L20.44 79.144c-.115-.345 0-.576.23-.806L78.294 20.83c.23-.23.576-.346.807-.23l78.713 21.09c.345.114.576.345.576.575l21.09 78.597c.23.346.115.577-.115.807zM102.148 59.09l-77.33 20.63c-.115 0-.23.23-.115.345l56.586 56.47c.115.115.346.115.346-.115l20.744-77.215c.115 0-.115-.23-.23-.116z" stroke-width="1.153" fill="#cfd8dc"/></symbol><symbol viewBox="0 0 200 200" id="crystal_light" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:none}</style><path d="M179.363 121.67l-57.623 57.507c-.23.23-.576.346-.806.23l-78.713-21.09c-.346-.115-.577-.345-.577-.576L20.44 79.144c-.115-.345 0-.576.23-.806L78.294 20.83c.23-.23.576-.346.807-.23l78.713 21.09c.345.114.576.345.576.575l21.09 78.597c.23.346.115.577-.115.807zM102.148 59.09l-77.33 20.63c-.115 0-.23.23-.115.345l56.586 56.47c.115.115.346.115.346-.115l20.744-77.215c.115 0-.115-.23-.23-.116z" fill="#37474f" stroke-width="1.153"/></symbol><symbol viewBox="0 0 24 24" id="csharp" xmlns="http://www.w3.org/2000/svg"><path d="M11.5 15.97l.41 2.44c-.26.14-.68.27-1.24.39-.57.13-1.24.2-2.01.2-2.21-.04-3.87-.7-4.98-1.96C2.56 15.77 2 14.16 2 12.21c.05-2.31.72-4.08 2-5.32C5.32 5.64 6.96 5 8.94 5c.75 0 1.4.07 1.94.19s.94.25 1.2.4l-.58 2.49-1.06-.34c-.4-.1-.86-.15-1.39-.15-1.16-.01-2.12.36-2.87 1.1-.76.73-1.15 1.85-1.18 3.34 0 1.36.37 2.42 1.08 3.2.71.77 1.71 1.17 2.99 1.18l1.33-.12c.43-.08.79-.19 1.1-.32M13.89 19l.61-4H13l.34-2h1.5l.32-2h-1.5L14 9h1.5l.61-4h2l-.61 4h1l.61-4h2l-.61 4H22l-.34 2h-1.5l-.32 2h1.5L21 15h-1.5l-.61 4h-2l.61-4h-1l-.61 4h-2m2.95-6h1l.32-2h-1l-.32 2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="css" xmlns="http://www.w3.org/2000/svg"><path d="M5 3l-.65 3.34h13.59L17.5 8.5H3.92l-.66 3.33h13.59l-.76 3.81-5.48 1.81-4.75-1.81.33-1.64H2.85l-.79 4 7.85 3 9.05-3 1.2-6.03.24-1.21L21.94 3H5z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="css-map" xmlns="http://www.w3.org/2000/svg"><path d="M18 8v2h2v10H10v-2H8v4h14V8h-4z" fill="#42a5f5"/><path d="M4.676 3l-.488 2.51h10.211l-.33 1.623H3.864l-.496 2.502H13.58l-.57 2.863-4.119 1.36-3.569-1.36.248-1.232H3.06l-.593 3.005 5.898 2.254 6.8-2.254.902-4.53.18-.91L17.406 3H4.675z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 33 33" id="cucumber" xmlns="http://www.w3.org/2000/svg"><title>cucumber-mark-transparent-pips</title><g transform="translate(0 -5)" fill="none" fill-rule="evenodd"><path d="M-4-1h40v40H-4z"/><path d="M16.641 7.092c-7.028 0-12.714 5.686-12.714 12.714 0 6.187 4.435 11.327 10.288 12.471v3.64C21.824 34.77 28.561 28.73 29.063 20.8c.303-4.772-2.076-9.644-6.09-12.01a10.575 10.575 0 0 0-1.455-.728l-.243-.097c-.223-.082-.448-.175-.68-.242a12.614 12.614 0 0 0-3.954-.632zm2.62 4.707a1.387 1.387 0 0 0-1.213.485c-.233.31-.379.611-.534.923-.466 1.087-.31 2.251.388 3.105 1.087-.233 2.01-.927 2.475-2.014a2.45 2.45 0 0 0 .243-1.02c.048-.824-.634-1.404-1.359-1.479zm-5.654.073c-.708.068-1.382.63-1.382 1.407 0 .31.087.709.243 1.02.466 1.086 1.46 1.78 2.546 2.013.621-.854.782-2.018.316-3.105-.155-.311-.3-.617-.534-.85a1.364 1.364 0 0 0-1.188-.485zm-3.809 3.735c-1.224.063-1.77 1.602-.752 2.402.31.233.612.403.922.559 1.087.466 2.344.306 3.275-.316-.233-1.009-1.023-1.936-2.11-2.402-.388-.155-.703-.243-1.092-.243-.087-.009-.161-.004-.243 0zm11.961 4.708a3.551 3.551 0 0 0-2.013.582c.233 1.01 1.023 1.936 2.11 2.401.389.156.705.244 1.093.244 1.397.077 2.08-1.65.994-2.427-.31-.233-.611-.379-.922-.534a3.354 3.354 0 0 0-1.262-.266zm-10.603.072a3.376 3.376 0 0 0-1.261.267c-.389.155-.69.325-.923.558-1.009.854-.33 2.48 1.068 2.402.388 0 .782-.087 1.092-.243 1.087-.465 1.859-1.392 2.014-2.401a3.474 3.474 0 0 0-1.99-.582zm3.931 2.378c-1.087.233-2.009.927-2.475 2.014-.155.31-.243.684-.243.995-.077 1.32 1.724 2.028 2.5 1.02.233-.312.378-.613.534-.923.466-1.01.306-2.174-.316-3.106zm2.887.073c-.621.854-.781 2.019-.315 3.106.155.31.3.615.534.848.854.932 2.65.243 2.572-.921 0-.31-.088-.71-.243-1.02-.466-1.087-1.46-1.78-2.547-2.013z" fill="#4caf50" stroke-width=".776"/></g></symbol><symbol id="cuda" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><style>.bust0{fill:#76b900}</style><title>NVIDIA-Logo</title><path id="buEye_Mark" class="bust0" d="M76.362 75.199V64.116c1.095-.068 2.19-.137 3.284-.137 30.377-.958 50.286 26.135 50.286 26.135s-21.483 29.83-44.539 29.83c-3.079 0-6.089-.48-8.962-1.438v-33.66c11.836 1.436 14.23 6.636 21.277 18.471l15.804-13.273s-11.562-15.12-30.992-15.12c-2.053-.068-4.105.069-6.158.274m0-36.67v16.556l3.284-.205c42.213-1.437 69.784 34.618 69.784 34.618s-31.608 38.45-64.516 38.45c-2.873 0-5.678-.274-8.483-.753v10.262c2.326.274 4.72.48 7.046.48 30.65 0 52.817-15.668 74.3-34.14 3.558 2.874 18.13 9.784 21.14 12.794-20.388 17.104-67.937 30.856-94.893 30.856-2.6 0-5.062-.137-7.525-.41v14.436h116.44V38.532zm0 79.977v8.757C48.038 122.2 40.17 92.712 40.17 92.712s13.615-15.05 36.192-17.514v9.579h-.068c-11.836-1.437-21.14 9.646-21.14 9.646s5.268 18.678 21.209 24.082M26.077 91.481S42.839 66.714 76.43 64.115v-9.03C39.213 58.094 7.057 89.565 7.057 89.565s18.199 52.68 69.305 57.47v-9.579c-37.492-4.652-50.286-45.975-50.286-45.975z" fill="#8bc34a" stroke-width=".684"/></symbol><symbol viewBox="0 0 24 24" id="dart" xmlns="http://www.w3.org/2000/svg"><title>Dart</title><path d="M12.486 1.385a.978.978 0 0 0-.682.281l-.01.007-6.387 3.692 6.371 6.372v.004l7.659 7.659 1.46-2.63-5.265-12.64-2.456-2.457a.972.972 0 0 0-.69-.288z" fill="#00ca94"/><path d="M5.422 5.35L1.73 11.733l-.007.01a.967.967 0 0 0 .006 1.371l3.059 3.061 11.963 4.706 2.704-1.502-.073-.073-.018.002-7.5-7.512h-.01L5.423 5.35z" fill="#1565c0"/><path d="M5.405 5.353l6.518 6.525h.01l7.502 7.51 2.855-.544.005-8.449-3.016-2.955c-.66-.647-1.675-1.064-2.695-1.202l.002-.032-11.181-.853z" fill="#1565c0"/><path d="M5.414 5.361l6.521 6.522v.009l7.506 7.506-.546 2.855h-8.448l-2.954-3.017c-.647-.66-1.064-1.676-1.2-2.696l-.033.003L5.414 5.36z" fill="#00ee94"/></symbol><symbol viewBox="0 0 24 24" id="database" xmlns="http://www.w3.org/2000/svg"><path d="M12 3C7.58 3 4 4.79 4 7s3.58 4 8 4 8-1.79 8-4-3.58-4-8-4M4 9v3c0 2.21 3.58 4 8 4s8-1.79 8-4V9c0 2.21-3.58 4-8 4s-8-1.79-8-4m0 5v3c0 2.21 3.58 4 8 4s8-1.79 8-4v-3c0 2.21-3.58 4-8 4s-8-1.79-8-4z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="diff" xmlns="http://www.w3.org/2000/svg"><path d="M3 1c-1.11 0-2 .89-2 2v11c0 1.11.89 2 2 2h2v-2H3V3h11v2h2V3c0-1.11-.89-2-2-2H3m6 6c-1.11 0-2 .89-2 2v2h2V9h2V7H9m4 0v2h1v1h2V7h-3m5 0v2h2v11H9v-2H7v2c0 1.11.89 2 2 2h11c1.11 0 2-.89 2-2V9c0-1.11-.89-2-2-2h-2m-4 5v2h-2v2h2c1.11 0 2-.89 2-2v-2h-2m-7 1v3h3v-2H9v-1H7z" fill="#42a5f5"/></symbol><symbol id="docker" viewBox="0 0 41 34.5" xmlns="http://www.w3.org/2000/svg"><style id="bystyle2">.byst0{fill:#fff}.byst1{clip-path:url(#bySVGID_4_)}</style><g id="byg34" transform="translate(.292 1.9)" fill="#0087c9"><g id="byg32"><g id="byg30"><g id="byg28"><g id="byg26"><g id="byg9"><path id="bySVGID_1_" class="byst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2c1.2 0 2.1.9 2.1 2s-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></g></g></g></g></g></g></symbol><symbol viewBox="0 0 24 24" id="document" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z" fill="#42a5f5"/></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 200 200" id="drone" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="translate(9.063 22.346) scale(.71044)"><path d="M128.22.723C32.095.723.39 84.566.39 115.222h77.928S89.36 75.275 128.22 75.275s49.906 39.947 49.906 39.947h77.476c0-30.66-31.257-114.5-127.38-114.5m98.82 134.45h-48.914s-8.55 39.946-49.906 39.946c-41.355 0-49.902-39.948-49.902-39.948H30.255c0 10.25 37.727 82.708 98.443 82.708 60.714 0 98.344-59.604 98.344-82.708"/><circle cx="128" cy="126.08" r="32.768"/></g></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 200 200" id="drone_light" xmlns="http://www.w3.org/2000/svg"><g fill="#424242" transform="translate(9.063 22.346) scale(.71044)"><path d="M128.22.723C32.095.723.39 84.566.39 115.222h77.928S89.36 75.275 128.22 75.275s49.906 39.947 49.906 39.947h77.476c0-30.66-31.257-114.5-127.38-114.5m98.82 134.45h-48.914s-8.55 39.946-49.906 39.946c-41.355 0-49.902-39.948-49.902-39.948H30.255c0 10.25 37.727 82.708 98.443 82.708 60.714 0 98.344-59.604 98.344-82.708"/><circle cx="128" cy="126.08" r="32.768"/></g></symbol><symbol viewBox="0 0 3473 3473" id="editorconfig" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" xmlns="http://www.w3.org/2000/svg"><defs id="ccdefs4"><style id="ccstyle2">.ccfil2{fill:#020202}.ccfil0{fill:#e3e3f8}.ccfil5{fill:#efefef}.ccfil6{fill:#faf1f1}.ccfil3{fill:#fdf2f2}.ccfil1{fill:#fdfdfd}.ccfil4{fill:#fef3f3}</style></defs><g id="ccLayer_x0020_1" transform="matrix(.8945 0 0 .8945 138.649 275.985)"><g id="cc_631799120"><g id="ccg11"><path class="ccfil0" d="M967 1895c46-30 84-105 61-158-63 27-60 89-61 158z" id="ccpath7" fill="#e3e3f8"/><path class="ccfil0" d="M1679 2067c50-16 98-72 71-130-39 27-64 64-71 130z" id="ccpath9" fill="#e3e3f8"/></g><g id="ccg21"><path class="ccfil1" d="M280 2895c0 63 16 131 60 155 162 91 730 20 923-23 101-23 183-98 278-139 214-93 369-168 540-293 124-91 321-347 342-500l-169-38c-4 172-43 211-196 251-103 28-304 34-409 16-139-23-202-96-265-179-122-162 27-275-166-286-203 249-561 70-718 45-67 97-224 727-222 871 97-33 158 3 245 37 308 119 39 224-84 193-84-20-110-75-159-110z" id="ccpath13" fill="#fdfdfd"/><path class="ccfil1" d="M683 1458c125 24 236 76 342 129 173 86 204 74 220 194 2 22-2 34 61 54 106 33-61-26 223-25 169 1 556 69 681 148 52 33 42 75 218 70-2-207-57-516-138-706-99-230-230-265-497-351-156-50-614-105-756-17-133 83-158 182-282 356-36 51-49 90-72 148z" id="ccpath15" fill="#fdfdfd"/><path class="ccfil1" d="M1784 1883c100 41-5 306-144 242-45-127 62-199 91-256-60-9-231-36-282-17-66 25-81 166-47 232 160 314 867 247 792 3-30-99-58-115-159-149-81-27-162-55-251-55z" id="ccpath17" fill="#fdfdfd"/><path class="ccfil1" d="M527 1848c80 77 261 89 378 95 15-155 28-271 152-262 61 83 29 181-35 244 109-1 172-83 156-202-92-66-371-198-511-217-39 42-135 272-140 342z" id="ccpath19" fill="#fdfdfd"/></g><path class="ccfil2" d="M339 2838c66-6 238 44 252 100-107 13-243 3-252-100zm-59 57c49 35 75 90 159 110 123 31 392-74 84-193-87-34-148-70-245-37-2-144 155-774 222-871 157 25 515 204 718-45 193 11 44 124 166 286 63 83 126 156 265 179 105 18 306 12 409-16 153-40 192-79 196-251l169 38c-21 153-218 409-342 500-171 125-326 200-540 293-95 41-177 116-278 139-193 43-761 114-923 23-44-24-60-92-60-155zm1399-828c7-66 32-103 71-130 27 58-21 114-71 130zm105-184c89 0 170 28 251 55 101 34 129 50 159 149 75 244-632 311-792-3-34-66-19-207 47-232 51-19 222 8 282 17-29 57-136 129-91 256 139 64 244-201 144-242zm-817 12c1-69-2-131 61-158 23 53-15 128-61 158zm-440-47c5-70 101-300 140-342 140 19 419 151 511 217 16 119-47 201-156 202 64-63 96-161 35-244-124-9-137 107-152 262-117-6-298-18-378-95zm-100-80c-37-102-37-261 120-274l-80 223c-21 48-21 37-40 51zm256-310c23-58 36-97 72-148 124-174 149-273 282-356 142-88 600-33 756 17 267 86 398 121 497 351 81 190 136 499 138 706-176 5-166-37-218-70-125-79-512-147-681-148-284-1-117 58-223 25-63-20-59-32-61-54-16-120-47-108-220-194-106-53-217-105-342-129zm1770-49c-19-63 16-59 77-102 35-25 63-51 106-75 161-90 461-105 589 2 52 43 137 127 124 237-27 219-177 339-300 439-125 102-333 207-548 137-18-44-4-323-25-426-19-92-9-102 44-157 156-162 494-280 686-141 81 60 58 83 100 129 52-56-45-244-403-232-243 8-348 198-450 189zM997 840c5-139 133-427 261-527 155-120 317-233 555-98 59 33 56 50 62 132 5 79-2 108-22 172-158 510-290 217-796 338 19-166 163-314 243-391 137-133 236-219 442-191 57 95 63 155-6 266-92 148-115 139-101 240 72-18 94-88 127-158 201-420-91-471-270-394-120 51-334 287-404 429-14 28-29 64-42 95zm792 21c21-125 145-156 145-541 0-166-204-315-471-204-229 94-264 166-386 350-115 174-111 365-210 526-29 46-55 62-87 108-23 34-40 77-63 117-47 77-95 133-133 225-120 3-221 5-233 129-16 170 64 212 64 276-1 69-281 765-203 1180 22 114 97 115 217 129 289 35 664 23 923-81l470-225c119-67 319-194 408-287 63-65 96-120 150-197 74-108 76-106 92-253 98 18 281 61 342 114-7 69-41 36-41 98 39 1 104-48 120-102-41-60-84-50-143-98 47-37 132-54 197-81 140-58 379-234 438-394 47-129 12-344-64-428-80-88-266-133-418-133-181 0-368 130-514 186-56-49-60-105-101-159-47-64-353-224-499-255z" id="ccpath23" fill="#020202"/><path class="ccfil3" d="M2453 1409c102 9 207-181 450-189 358-12 455 176 403 232-42-46-19-69-100-129-192-139-530-21-686 141-53 55-63 65-44 157 21 103 7 382 25 426 215 70 423-35 548-137 123-100 273-220 300-439 13-110-72-194-124-237-128-107-428-92-589-2-43 24-71 50-106 75-61 43-96 39-77 102z" id="ccpath25" fill="#fdf2f2"/><path class="ccfil4" d="M997 840l49-87c13-31 28-67 42-95 70-142 284-378 404-429 179-77 471-26 270 394-33 70-55 140-127 158-14-101 9-92 101-240 69-111 63-171 6-266-206-28-305 58-442 191-80 77-224 225-243 391 506-121 638 172 796-338 20-64 27-93 22-172-6-82-3-99-62-132-238-135-400-22-555 98-128 100-256 388-261 527z" id="ccpath27" fill="#fef3f3"/><path class="ccfil5" d="M427 1768c19-14 19-3 40-51l80-223c-157 13-157 172-120 274z" id="ccpath29" fill="#efefef"/><path class="ccfil6" d="M591 2938c-14-56-186-106-252-100 9 103 145 113 252 100z" id="ccpath31" fill="#faf1f1"/></g></g></symbol><symbol viewBox="0 0 24 24" id="elixir" xmlns="http://www.w3.org/2000/svg"><path d="M12.431 22.383c-3.86 0-6.99-3.64-6.99-8.13 0-3.678 2.774-8.172 4.916-10.91 1.014-1.295 2.931-2.321 2.931-2.321s-.982 5.238 1.683 7.318c2.365 1.847 4.105 4.25 4.105 6.363 0 4.232-2.784 7.68-6.645 7.68z" fill="#9575cd" stroke-width="1.256"/></symbol><symbol viewBox="0 0 323.00001 322.99999" id="elm" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.8053 0 0 .8053 30.106 31.524)"><path fill="#f0ad00" d="M160.8 153.865l68.028-68.03H92.77z"/><path fill="#7fd13b" d="M160.983 5.098H12.033l68.524 68.525H229.51z"/><path fill="#7fd13b" stroke-width=".974" d="M243.906 88.021l74.136 74.137-74.474 74.475-74.137-74.137z"/><path fill="#60b5cc" d="M318.2 145.045V5.098H178.252z"/><path fill="#5a6378" d="M152.164 162.499L3.4 13.733v297.533z"/><path fill="#f0ad00" d="M252.205 245.27l65.995 65.996v-131.99z"/><path fill="#60b5cc" d="M160.8 171.134L12.034 319.899h297.53z"/></g></symbol><symbol viewBox="0 0 24 24" id="email" xmlns="http://www.w3.org/2000/svg"><path d="M20 8l-8 5-8-5V6l8 5 8-5m0-2H4c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 30 30" id="erlang" xmlns="http://www.w3.org/2000/svg"><path style="line-height:1.25;-inkscape-font-specification:'Wide Latin'" d="M5.217 4.367c-.048.052-.097.1-.144.153C2.697 7.182 1.51 10.798 1.51 15.366c0 4.418 1.156 7.862 3.46 10.34h19.414c2.553-1.152 4.127-3.43 4.127-3.43l-3.147-2.52-1.454 1.381c-.866.773-.845.931-2.314 1.78-1.496.674-3.04.966-4.634.966-2.516 0-4.423-.909-5.723-2.059-1.286-1.15-1.985-4.511-2.097-6.68l17.458.067-.182-1.472s-.847-7.129-2.542-9.372zm8.76.846c1.565 0 3.22.535 3.96 1.471.742.937.932 1.667.974 3.524H9.12c.111-1.955.436-2.81 1.372-3.697.937-.888 2.03-1.298 3.484-1.298z" font-weight="400" font-size="48" font-family="Wide Latin" letter-spacing="0" word-spacing="0" fill="#f44336" stroke-width=".97"/></symbol><symbol viewBox="0 0 299.99999 300.00001" id="eslint" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-2.88 18.438) scale(1.0344)"><path d="M97.021 99.016l48.432-27.962c1.212-.7 2.706-.7 3.918 0l48.433 27.962a3.92 3.92 0 0 1 1.959 3.393v55.924a3.924 3.924 0 0 1-1.959 3.394l-48.433 27.962c-1.212.7-2.706.7-3.918 0l-48.432-27.962a3.92 3.92 0 0 1-1.959-3.394v-55.924a3.922 3.922 0 0 1 1.959-3.393" fill="#7986cb"/><path d="M273.34 124.49L215.473 23.82c-2.102-3.64-5.985-6.325-10.188-6.325H89.545c-4.204 0-8.088 2.685-10.19 6.325L21.488 124.27c-2.102 3.641-2.102 8.236 0 11.877l57.867 99.847c2.102 3.64 5.986 5.501 10.19 5.501h115.74c4.203 0 8.087-1.805 10.188-5.446l57.867-100.01c2.104-3.639 2.104-7.907.001-11.547m-47.917 48.41c0 1.48-.891 2.849-2.174 3.59l-73.71 42.527a4.194 4.194 0 0 1-4.17 0l-73.767-42.527c-1.282-.741-2.179-2.109-2.179-3.59V87.847c0-1.481.884-2.849 2.167-3.59l73.707-42.527a4.185 4.185 0 0 1 4.168 0l73.772 42.527c1.283.741 2.186 2.109 2.186 3.59z" fill="#3f51b5"/></g></symbol><symbol viewBox="0 0 24 24" id="exe" xmlns="http://www.w3.org/2000/svg"><path d="M19 4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h14m0 14V8H5v10h14z" fill="#e64a19"/></symbol><symbol viewBox="0 0 24 24" id="favicon" xmlns="http://www.w3.org/2000/svg"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.62L12 2 9.19 8.62 2 9.24l5.45 4.73L5.82 21 12 17.27z" fill="#ffd54f"/></symbol><symbol viewBox="0 0 24 24" id="file" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m5 2H6v16h12v-9h-7V4z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 400 400" id="firebase" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 103)"><path d="M72.55 208.77l44.456-292.29 56.209 90.445L195.49-37.57 330.6 209.28z" fill="#ffa712"/><path d="M195.7 276.73l134.9-67.45-46.5-224.83L72.55 208.77z" fill="#fcca3f"/><path d="M173.22 6.932L72.56 208.772l136.35-144.58z" fill="#f6820c"/></g></symbol><symbol viewBox="0 0 24 24" id="flash" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="cma"><stop offset="0" stop-color="#d92f3c"/><stop offset="1" stop-color="#791223"/></linearGradient><linearGradient xlink:href="#cma" id="cmb" x1="2.373" y1="12.027" x2="21.86" y2="12.027" gradientUnits="userSpaceOnUse" gradientTransform="translate(-.09 -24.144)"/></defs><rect width="19.487" height="19.487" x="2.283" y="-21.86" transform="rotate(90)" ry="0" fill="url(#cmb)"/><path style="line-height:125%" d="M16.802 5.768l-.013.002a6.43 6.43 0 0 0-1.182.192 5.062 5.062 0 0 0-1.494.718c-.428.323-.817.72-1.17 1.191-.34.48-.682 1.032-1.022 1.66-.12.228-.233.424-.35.636v.002h-.004l-1.34 2.394-.005-.002c-.238.443-.461.847-.665 1.198a4.358 4.358 0 0 1-.716.94 2.79 2.79 0 0 1-.907.594c-.072.027-.161.042-.242.063h-.989v2.414h.989v-.002a6.427 6.427 0 0 0 1.185-.192 5.062 5.062 0 0 0 1.494-.718 5.94 5.94 0 0 0 1.171-1.191c.34-.48.681-1.033 1.021-1.66.12-.228.235-.425.353-.637l.006.002.003-.005.037-.066h2.53v.002h1.124v-2.408h-.33v-.001h-1.98c.22-.407.432-.789.621-1.115.214-.37.452-.682.717-.94a2.79 2.79 0 0 1 .906-.594c.07-.027.16-.041.239-.061h.992V8.18h-.002V5.77h-.977v-.002z" font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#fff"/></symbol><symbol class="cnflow-logo" viewBox="0 0 299.99999 300" id="flow" xmlns="http://www.w3.org/2000/svg"><title>Flow logo</title><path d="M38.75 33.427l77.461 77.47H54.436l61.145 61.16H38.437l93.462 93.478v-77.158l.01-.01v-77.47h-.01V66.982h46.691l20.394 20.393H153.57v76.531h22.05l24.474 24.473h-15.806l-.01-.01v.01h-31.665l-.01-.01v.01h-.313l.313.313v77.148h109.149l-39.2-39.2v-15.806l8.465 8.466v-77.37h-15.682l.017-38.191 30.09 30.086V56.362h-64.874l-22.94-22.934H113.71z" fill="#fbc02d" fill-opacity=".976" stroke-width=".955" class="cnflow-logo-mark"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-aurelia" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="coa" x1="-388.15%" x2="237.68%" y1="-144.18%" y2="430.41%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cob" x1="72.945%" x2="-97.052%" y1="84.424%" y2="-147.7%"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="coc" x1="-283.88%" x2="287.54%" y1="-693.6%" y2="101.71%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cod" x1="-821.19%" x2="101.99%" y1="-469.05%" y2="288.24%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="coe" x1="-140.36%" x2="419.01%" y1="-230.93%" y2="261.98%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cof" x1="191.08%" x2="20.358%" y1="253.95%" y2="20.403%"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cog" x1="-388.09%" x2="237.67%" y1="-173.85%" y2="518.99%"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="coi" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#coa"/><linearGradient id="coj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#cob"/><linearGradient id="cok" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#coc"/><linearGradient id="col" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#cod"/><linearGradient id="com" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#coe"/><linearGradient id="con" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#cof"/><linearGradient id="coo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cog"/><linearGradient id="cop" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#coh"/><linearGradient id="coh" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#f06292" fill-rule="nonzero"/><g transform="matrix(.31022 .0619 -.0619 .31022 11.807 7.546)" fill="none"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#coi)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#coj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#cok)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#col)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#com)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#con)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#coo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#cop)"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-aurelia-open" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="cpi" x1="-31.824" x2="19.682" y1="-11.741" y2="35.548" gradientTransform="scale(.95818 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cpa"/><linearGradient id="cpa" x1="-3.881" x2="2.377" y1="-1.442" y2="4.304"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpj" x1="12.022" x2="-15.716" y1="13.922" y2="-23.952" gradientTransform="scale(.96226 1.0392)" gradientUnits="userSpaceOnUse" xlink:href="#cpb"/><linearGradient id="cpb" x1=".729" x2="-.971" y1=".844" y2="-1.477"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cpk" x1="-23.39" x2="23.931" y1="-57.289" y2="8.573" gradientTransform="scale(1.0429 .95884)" gradientUnits="userSpaceOnUse" xlink:href="#cpc"/><linearGradient id="cpc" x1="-2.839" x2="2.875" y1="-6.936" y2="1.017"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpl" x1="-53.331" x2="6.771" y1="-30.517" y2="18.785" gradientTransform="scale(.99898 1.001)" gradientUnits="userSpaceOnUse" xlink:href="#cpd"/><linearGradient id="cpd" x1="-8.212" x2="1.02" y1="-4.691" y2="2.882"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpm" x1="-14.029" x2="41.998" y1="-23.111" y2="26.259" gradientTransform="scale(1.0003 .99965)" gradientUnits="userSpaceOnUse" xlink:href="#cpe"/><linearGradient id="cpe" x1="-1.404" x2="4.19" y1="-2.309" y2="2.62"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpn" x1="31.177" x2="3.37" y1="41.442" y2="3.402" gradientTransform="scale(.96254 1.0389)" gradientUnits="userSpaceOnUse" xlink:href="#cpf"/><linearGradient id="cpf" x1="1.911" x2=".204" y1="2.539" y2=".204"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".29"/><stop stop-color="#CD0F7E" offset=".84"/><stop stop-color="#ED2C89" offset="1"/></linearGradient><linearGradient id="cpo" x1="-31.905" x2="19.599" y1="-14.258" y2="42.767" gradientTransform="scale(.95823 1.0436)" gradientUnits="userSpaceOnUse" xlink:href="#cpg"/><linearGradient id="cpg" x1="-3.881" x2="2.377" y1="-1.738" y2="5.19"><stop stop-color="#C06FBB" offset="0"/><stop stop-color="#6E4D9B" offset="1"/></linearGradient><linearGradient id="cpp" x1="4.301" x2="34.534" y1="34.41" y2="4.514" gradientTransform="scale(1.002 .99796)" gradientUnits="userSpaceOnUse" xlink:href="#cph"/><linearGradient id="cph" x1=".112" x2=".901" y1=".897" y2=".116"><stop stop-color="#6E4D9B" offset="0"/><stop stop-color="#77327A" offset=".14"/><stop stop-color="#B31777" offset=".53"/><stop stop-color="#CD0F7E" offset=".79"/><stop stop-color="#ED2C89" offset="1"/></linearGradient></defs><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#f06292" fill-rule="nonzero"/><g transform="matrix(.31022 .0619 -.0619 .31022 11.807 7.546)" fill="none"><path d="M8.002 6.127L4.117 8.719.116 2.723 4 .13z" transform="rotate(-11.284 17.839 -78.732)" fill="url(#cpi)"/><path d="M9.179 1.887l6.637 9.946-7.906 5.276-6.637-9.946L.115 5.43 8.02.153z" transform="rotate(-11.284 129.49 -99.884)" fill="url(#cpj)"/><path d="M7.3 1.88l1.462 2.189-6.018 4.015L.124 4.16l1.315-.877L6.143.144z" transform="rotate(-11.284 167.2 -62.32)" fill="url(#cpk)"/><path d="M2.328 1.146L4.016.02l2.619 3.925L2.75 6.537 1.29 4.347l2.197-1.466zm-1.04 3.201L.132 2.612l2.197-1.466 1.158 1.735z" transform="rotate(-11.284 104.37 -149.22)" fill="url(#cpl)"/><path d="M5.346 9.155l-1.315.877L.03 4.035 6.047.019l2.805 4.204L4.15 7.36l4.703-3.138 1.197 1.793z" transform="rotate(-11.284 81.819 7.645)" fill="url(#cpm)"/><path d="M14.533 9.934l1.197 1.793-7.907 5.276-1.196-1.793L.052 5.358 7.958.082z" transform="rotate(-11.284 17.141 -7.825)" fill="url(#cpn)"/><path d="M6.235 7.177L4.038 8.643 2.84 6.849.036 2.646 3.92.053 7.923 6.05z" transform="rotate(-11.284 18.188 -79.174)" fill="url(#cpo)"/><path d="M18.955 35.925L17.48 34.45l3.998-3.998 1.475 1.475z" fill="#714896"/><path d="M33.33 21.55l-1.475-1.474 1.867-1.868 1.475 1.475z" fill="#6f4795"/><path d="M7.12 24.09l-1.525-1.525 3.998-3.998 1.525 1.525z" fill="#88519f"/><path d="M21.495 9.714L19.97 8.19l1.868-1.868 1.524 1.525z" fill="#85509e"/><path d="M31.418 23.462l-6.72 6.72-1.475-1.474 6.72-6.721z" fill="#8d166a"/><path d="M18.058 10.101l1.525 1.525-6.721 6.72-1.525-1.524z" fill="#a70d6f"/><path d="M2.375 11.769l1.9 1.9-1.9 1.901-1.901-1.9z" fill="#9e61ad"/><path d="M15.523 36.482l1.9 1.9-1.9 1.901-1.9-1.9z" fill="#8053a3"/><path d="M8.372 38.294L.017 29.876 29.749.08l8.636 8.201z" transform="translate(1.823 1.548)" fill="url(#cpp)"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-components" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#cddc39" fill-rule="nonzero"/><path d="M11.185 9.613h5.346v2.9l3.782-3.775 3.775 3.775-3.775 3.782h2.9v5.346h-5.346v-5.346h2.446l-3.782-3.782v2.446h-5.346V9.613m0 6.682h5.346v5.346h-5.346z" fill="#f0f4c3" stroke-width=".668"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-components-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#cddc39"/><path d="M11.185 9.613h5.346v2.9l3.782-3.775 3.775 3.775-3.775 3.782h2.9v5.346h-5.346v-5.346h2.446l-3.782-3.782v2.446h-5.346V9.613m0 6.682h5.346v5.346h-5.346z" fill="#f0f4c3" stroke-width=".668"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-config" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00acc1" fill-rule="nonzero"/><path d="M17.293 17.786a2.308 2.308 0 0 1-2.308-2.308 2.308 2.308 0 0 1 2.308-2.307 2.308 2.308 0 0 1 2.308 2.307 2.308 2.308 0 0 1-2.308 2.308m4.899-1.668c.026-.211.046-.422.046-.64 0-.217-.02-.435-.046-.659l1.391-1.075a.333.333 0 0 0 .08-.422l-1.32-2.28c-.079-.146-.257-.205-.402-.146l-1.641.66a4.779 4.779 0 0 0-1.115-.647l-.244-1.747a.333.333 0 0 0-.33-.277h-2.637a.333.333 0 0 0-.33.277l-.243 1.747a4.78 4.78 0 0 0-1.114.646l-1.642-.659a.324.324 0 0 0-.402.145l-1.319 2.281a.325.325 0 0 0 .08.422l1.39 1.075c-.026.224-.046.442-.046.66s.02.428.046.639l-1.39 1.094a.325.325 0 0 0-.08.422l1.319 2.282c.079.145.257.197.402.145l1.642-.666c.342.264.698.488 1.114.653l.244 1.747a.333.333 0 0 0 .33.277h2.637a.333.333 0 0 0 .33-.277l.243-1.747a4.802 4.802 0 0 0 1.115-.653l1.641.666c.145.052.323 0 .403-.145l1.318-2.282a.333.333 0 0 0-.079-.422z" fill="#80deea" stroke-width=".659"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-config-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00acc1"/><path d="M17.293 17.786a2.308 2.308 0 0 1-2.308-2.308 2.308 2.308 0 0 1 2.308-2.307 2.308 2.308 0 0 1 2.308 2.307 2.308 2.308 0 0 1-2.308 2.308m4.899-1.668c.026-.211.046-.422.046-.64 0-.217-.02-.435-.046-.659l1.391-1.075a.333.333 0 0 0 .08-.422l-1.32-2.28c-.079-.146-.257-.205-.402-.146l-1.641.66a4.779 4.779 0 0 0-1.115-.647l-.244-1.747a.333.333 0 0 0-.33-.277h-2.637a.333.333 0 0 0-.33.277l-.243 1.747a4.78 4.78 0 0 0-1.114.646l-1.642-.659a.324.324 0 0 0-.402.145l-1.319 2.281a.325.325 0 0 0 .08.422l1.39 1.075c-.026.224-.046.442-.046.66s.02.428.046.639l-1.39 1.094a.325.325 0 0 0-.08.422l1.319 2.282c.079.145.257.197.402.145l1.642-.666c.342.264.698.488 1.114.653l.244 1.747a.333.333 0 0 0 .33.277h2.637a.333.333 0 0 0 .33-.277l.243-1.747a4.802 4.802 0 0 0 1.115-.653l1.641.666c.145.052.323 0 .403-.145l1.318-2.282a.333.333 0 0 0-.079-.422z" fill="#80deea" stroke-width=".659"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-css" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#42a5f5" fill-rule="nonzero"/><path d="M12.488 9.415l-.44 2.259h9.188l-.298 1.46h-9.18l-.447 2.251H20.5l-.514 2.576-3.705 1.224-3.211-1.224.223-1.109h-2.258l-.534 2.704 5.307 2.029 6.118-2.029.812-4.076.162-.818 1.041-5.247H12.488z" fill-rule="nonzero" fill="#bbdefb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-css-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#42a5f5" fill-rule="nonzero"/><path d="M12.488 9.415l-.44 2.259h9.188l-.298 1.46h-9.18l-.447 2.251H20.5l-.514 2.576-3.705 1.224-3.211-1.224.223-1.109h-2.258l-.534 2.704 5.307 2.029 6.118-2.029.812-4.076.162-.818 1.041-5.247H12.488z" fill-rule="nonzero" fill="#bbdefb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-dist" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#e57373" fill-rule="nonzero"/><path d="M18.575 11.113h-2.576V9.825h2.576m3.864 1.288h-2.576V9.825l-1.288-1.288h-2.576L14.71 9.825v1.288h-2.577c-.715 0-1.288.573-1.288 1.288v7.085a1.288 1.288 0 0 0 1.288 1.288H22.44a1.288 1.288 0 0 0 1.288-1.288V12.4c0-.715-.58-1.288-1.288-1.288z" fill="#ffcdd2" stroke-width=".644"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-dist-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#e57373"/><path d="M18.575 11.113h-2.576V9.825h2.576m3.864 1.288h-2.576V9.825l-1.288-1.288h-2.576L14.71 9.825v1.288h-2.577c-.715 0-1.288.573-1.288 1.288v7.085a1.288 1.288 0 0 0 1.288 1.288H22.44a1.288 1.288 0 0 0 1.288-1.288V12.4c0-.715-.58-1.288-1.288-1.288z" fill="#ffcdd2" fill-rule="evenodd" stroke-width=".644"/></symbol><symbol id="folder-docker" clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><defs id="cydefs10"><path id="cySVGID_2_" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></defs><path id="cypath2" d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><style id="cystyle2">.cyst0{fill:#fff}.cyst1{clip-path:url(#cySVGID_4_)}</style><g id="cyg34" transform="translate(8.319 9.626) scale(.39491)" fill="#b3e5fc"><g id="cyg32"><g id="cyg30"><title id="cytitle4">Group 3</title><g id="cyg28"><g id="cyg26"><g id="cyg9"><path id="cySVGID_1_" class="cyst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/></g><g id="cyg24"><clipPath id="cySVGID_4_"><use id="cyuse14" width="100%" height="100%" xlink:href="#cySVGID_2_"/></clipPath><g id="cyg22" class="cyst1" clip-path="url(#cySVGID_4_)"><g id="cyg20"><g id="cyg18"><path id="cySVGID_3_" class="cyst0" d="M-48.8-21H1226v151.4H-48.8z"/></g></g></g></g></g></g></g></g></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docker-open" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="cza"><use width="100%" height="100%" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#SVGID_2_"/></clipPath></defs><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><g transform="matrix(.3949 0 0 .39489 8.319 9.626)" fill="#b3e5fc"><title>Group 3</title><path class="czst0" d="M8.7 24c-1.1 0-2.1-.9-2.1-2s.9-2 2.1-2 2.1.9 2.1 2-1 2-2.1 2zm25.8-10.9c-.2-1.6-1.2-2.9-2.5-3.9l-.5-.4-.4.5c-.8.9-1.1 2.5-1 3.7.1.9.4 1.8.9 2.5-.4.2-.9.4-1.3.6-.9.3-1.8.4-2.7.4H1.1l-.1.6c-.2 1.9.1 3.9.9 5.7l.4.7v.1c2.4 4 6.7 5.8 11.4 5.8 9 0 16.4-3.9 19.9-12.3 2.3.1 4.6-.5 5.7-2.7l.3-.5-.5-.3c-1.3-.8-3.1-.9-4.6-.5zm-12.9-1.6h-3.9v3.9h3.9zm0-4.9h-3.9v3.9h3.9zm0-5h-3.9v3.9h3.9zm4.8 9.9h-3.9v3.9h3.9zm-14.5 0H8v3.9h3.9zm4.9 0h-3.9v3.9h3.9zm-9.7 0H3.2v3.9h3.9zm9.7-4.9h-3.9v3.9h3.9zm-4.9 0H8v3.9h3.9z"/><g class="czst1" clip-path="url(#cza)"><path class="czst0" d="M-48.8-21H1226v151.4H-48.8z"/></g></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docs" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#0277bd" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m6.075 10.8v-1.35H13.85v1.35h6.075m2.025-2.7v-1.35h-8.1v1.35h8.1z" fill-rule="nonzero" fill="#b3e5fc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-docs-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#0277bd" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m6.075 10.8v-1.35H13.85v1.35h6.075m2.025-2.7v-1.35h-8.1v1.35h8.1z" fill-rule="nonzero" fill="#b3e5fc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-expo" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#01579b" fill-rule="nonzero"/><style>.dcst0{fill:#1173b6}.st1{fill:#585d67}</style><path class="dcst0" d="M18.575 9.82c-.489-.745-.605-.844-1.6-.844h-.024c-.996 0-1.106.099-1.601.844-.46.699-5.024 9.058-5.024 9.291 0 .338.087.658.402 1.112.32.46.873.716 1.275.309.273-.274 3.201-5.321 4.616-7.23a.425.425 0 0 1 .693 0c1.414 1.909 4.343 6.956 4.616 7.23.402.407.955.15 1.275-.309.314-.454.402-.774.402-1.112-.006-.233-4.57-8.598-5.03-9.291z" fill="#1173b6" stroke-width=".058"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-expo-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#01579b"/><path class="ddst0" d="M18.575 9.82c-.489-.745-.605-.844-1.6-.844h-.024c-.996 0-1.106.099-1.601.844-.46.699-5.024 9.058-5.024 9.291 0 .338.087.658.402 1.112.32.46.873.716 1.275.309.273-.274 3.201-5.321 4.616-7.23a.425.425 0 0 1 .693 0c1.414 1.909 4.343 6.956 4.616 7.23.402.407.955.15 1.275-.309.314-.454.402-.774.402-1.112-.006-.233-4.57-8.598-5.03-9.291z" fill="#1173b6" stroke-width=".058" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-font" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef9a9a" fill-rule="nonzero"/><path d="M14.62 17.403l2.38-6.33 2.37 6.33m-3.37-9l-5.5 14h2.25l1.12-3h6.25l1.13 3h2.25l-5.5-14h-2z" fill="#f44336" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-font-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef9a9a" fill-rule="nonzero"/><path d="M14.62 17.403l2.38-6.33 2.37 6.33m-3.37-9l-5.5 14h2.25l1.12-3h6.25l1.13 3h2.25l-5.5-14h-2z" fill="#f44336" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-git" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ff8a65" fill-rule="nonzero"/><path d="M10.43 14.14l4.044-4.052 1.183 1.19a1.387 1.387 0 0 0 .65 1.56v3.877c-.42.238-.699.693-.699 1.21 0 .768.632 1.4 1.4 1.4.767 0 1.4-.632 1.4-1.4 0-.517-.28-.972-.7-1.21v-3.4l1.448 1.462c-.05.105-.05.224-.05.35 0 .767.633 1.399 1.4 1.399.768 0 1.4-.632 1.4-1.4 0-.767-.632-1.4-1.4-1.4-.126 0-.245 0-.35.05l-1.798-1.799a1.385 1.385 0 0 0-.805-1.637c-.3-.112-.615-.14-.895-.063l-1.19-1.183.553-.545a1.381 1.381 0 0 1 1.973 0l5.591 5.59a1.381 1.381 0 0 1 0 1.974l-5.59 5.591a1.381 1.381 0 0 1-1.974 0l-5.591-5.59a1.381 1.381 0 0 1 0-1.974z" fill="#e64a19" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-git-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ff8a65" fill-rule="nonzero"/><path d="M10.43 14.14l4.044-4.052 1.183 1.19a1.387 1.387 0 0 0 .65 1.56v3.877c-.42.238-.699.693-.699 1.21 0 .768.632 1.4 1.4 1.4.767 0 1.4-.632 1.4-1.4 0-.517-.28-.972-.7-1.21v-3.4l1.448 1.462c-.05.105-.05.224-.05.35 0 .767.633 1.399 1.4 1.399.768 0 1.4-.632 1.4-1.4 0-.767-.632-1.4-1.4-1.4-.126 0-.245 0-.35.05l-1.798-1.799a1.385 1.385 0 0 0-.805-1.637c-.3-.112-.615-.14-.895-.063l-1.19-1.183.553-.545a1.381 1.381 0 0 1 1.973 0l5.591 5.59a1.381 1.381 0 0 1 0 1.974l-5.59 5.591a1.381 1.381 0 0 1-1.974 0l-5.591-5.59a1.381 1.381 0 0 1 0-1.974z" fill="#e64a19" fill-rule="nonzero"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-global" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#5c6bc0" fill-rule="nonzero"/><path d="M21.132 18.585a1.22 1.22 0 0 0-1.156-.846h-.609v-1.825a.608.608 0 0 0-.608-.609h-3.65v-1.217h1.216a.608.608 0 0 0 .609-.608v-1.217h1.217a1.217 1.217 0 0 0 1.216-1.217v-.25a4.858 4.858 0 0 1 1.765 7.79m-4.198 1.545a4.86 4.86 0 0 1-4.26-4.826c0-.377.049-.742.128-1.089l2.915 2.915v.608a1.217 1.217 0 0 0 1.217 1.217m.608-9.735a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.085-6.085 6.085 6.085 0 0 0-6.085-6.084z" fill="#c5cae9" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-global-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#5c6bc0"/><path d="M21.133 18.585a1.22 1.22 0 0 0-1.156-.846h-.609v-1.825a.608.608 0 0 0-.608-.609h-3.65v-1.217h1.216a.608.608 0 0 0 .609-.608v-1.217h1.217a1.217 1.217 0 0 0 1.216-1.217v-.25a4.858 4.858 0 0 1 1.765 7.79m-4.198 1.545a4.86 4.86 0 0 1-4.26-4.826c0-.377.049-.742.128-1.089l2.915 2.915v.608a1.217 1.217 0 0 0 1.216 1.217m.609-9.735a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.085-6.085 6.085 6.085 0 0 0-6.085-6.084z" fill="#c5cae9" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-i18n" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#5c6bc0" fill-rule="nonzero"/><path d="M17.293 17.786l-1.53-1.512.018-.018a10.555 10.555 0 0 0 2.235-3.934h1.765v-1.205h-4.217V9.912h-1.205v1.205h-4.217v1.205h6.73a9.5 9.5 0 0 1-1.91 3.223 9.424 9.424 0 0 1-1.392-2.018h-1.205c.44.982 1.042 1.91 1.795 2.747l-3.067 3.024.856.856 3.012-3.013 1.874 1.874.458-1.229m3.392-3.054H19.48l-2.711 7.23h1.205l.674-1.808h2.862l.68 1.807h1.206l-2.711-7.23m-1.579 4.218l.976-2.609.976 2.609z" fill="#c5cae9" stroke-width=".602"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-i18n-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#5c6bc0"/><path d="M17.293 17.786l-1.53-1.512.018-.018a10.555 10.555 0 0 0 2.235-3.934h1.765v-1.205h-4.217V9.912h-1.205v1.205h-4.217v1.205h6.73a9.5 9.5 0 0 1-1.91 3.223 9.424 9.424 0 0 1-1.392-2.018h-1.205c.44.982 1.042 1.91 1.795 2.747l-3.067 3.024.856.856 3.012-3.013 1.874 1.874.458-1.229m3.392-3.054H19.48l-2.711 7.23h1.205l.674-1.808h2.862l.68 1.807h1.206l-2.711-7.23m-1.579 4.218l.976-2.609.976 2.609z" fill="#c5cae9" stroke-width=".602"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-images" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#009688" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m0 12.15h8.1v-5.4l-2.7 2.7-1.35-1.35-4.05 4.05m1.35-7.425c-.74 0-1.35.61-1.35 1.35s.61 1.35 1.35 1.35 1.35-.61 1.35-1.35-.61-1.35-1.35-1.35z" fill-rule="nonzero" fill="#b2dfdb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-images-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#009688" fill-rule="nonzero"/><path d="M18.575 12.859h3.713l-3.713-3.713v3.713M13.85 8.134h5.4l4.05 4.05v8.1c0 .74-.61 1.35-1.35 1.35h-8.1a1.35 1.35 0 0 1-1.35-1.35v-10.8c0-.75.6-1.35 1.35-1.35m0 12.15h8.1v-5.4l-2.7 2.7-1.35-1.35-4.05 4.05m1.35-7.425c-.74 0-1.35.61-1.35 1.35s.61 1.35 1.35 1.35 1.35-.61 1.35-1.35-.61-1.35-1.35-1.35z" fill-rule="nonzero" fill="#b2dfdb"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-include" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><path d="M20.788 15.981h-2.434v2.434h-1.217V15.98h-2.434v-1.217h2.434V12.33h1.217v2.434h2.434m-3.042-5.476a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.084-6.085 6.085 6.085 0 0 0-6.084-6.084z" fill="#b3e5fc" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-include-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><path d="M20.788 15.981h-2.434v2.434h-1.217V15.98h-2.434v-1.217h2.434V12.33h1.217v2.434h2.434m-3.042-5.476a6.085 6.085 0 0 0-6.085 6.084 6.085 6.085 0 0 0 6.085 6.085 6.085 6.085 0 0 0 6.084-6.085 6.085 6.085 0 0 0-6.084-6.084z" fill="#b3e5fc" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-javascript" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ffca28" fill-rule="nonzero"/><path d="M17.935 18.374a2.18 2.18 0 0 0 1.972 1.213c.829 0 1.354-.415 1.354-.987 0-.682-.542-.927-1.452-1.324l-.502-.216c-1.435-.613-2.404-1.378-2.404-3.005 0-1.5 1.167-2.638 2.917-2.638a2.957 2.957 0 0 1 2.842 1.599l-1.552.999a1.362 1.362 0 0 0-1.29-.858.873.873 0 0 0-.957.858c0 .583.374.84 1.226 1.213l.502.216c1.697.733 2.654 1.47 2.654 3.139 0 1.798-1.411 2.783-3.308 2.783a3.839 3.839 0 0 1-3.618-2.046zm-7.048.175c.315.583.583 1.027 1.283 1.027s1.066-.256 1.066-1.255v-6.774h1.998v6.804c0 2.064-1.214 3.01-2.982 3.01a3.104 3.104 0 0 1-2.993-1.826z" fill-rule="nonzero" fill="#ffecb3"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-javascript-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ffca28"/><path d="M17.935 18.374a2.18 2.18 0 0 0 1.972 1.213c.829 0 1.354-.415 1.354-.987 0-.682-.542-.927-1.452-1.324l-.502-.216c-1.435-.613-2.404-1.378-2.404-3.005 0-1.5 1.167-2.638 2.917-2.638a2.957 2.957 0 0 1 2.842 1.599l-1.552.999a1.362 1.362 0 0 0-1.29-.858.873.873 0 0 0-.957.858c0 .583.374.84 1.226 1.213l.502.216c1.697.733 2.654 1.47 2.654 3.139 0 1.798-1.412 2.783-3.308 2.783a3.839 3.839 0 0 1-3.618-2.046zm-7.048.175c.315.583.583 1.027 1.283 1.027s1.066-.256 1.066-1.255v-6.774h1.998v6.804c0 2.064-1.214 3.01-2.982 3.01a3.104 3.104 0 0 1-2.993-1.826z" fill="#ffecb3"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-lib" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#c0ca33" fill-rule="nonzero"/><path d="M17.39 12.544a2.05 2.05 0 0 0 2.05-2.05 2.05 2.05 0 0 0-2.05-2.052 2.05 2.05 0 0 0-2.05 2.051 2.05 2.05 0 0 0 2.05 2.051m0 2.42a8.992 8.992 0 0 0-6.152-2.42v7.52c2.392 0 4.539.923 6.152 2.42a8.992 8.992 0 0 1 6.152-2.42v-7.52c-2.392 0-4.539.923-6.152 2.42z" fill="#f0f4c3" stroke-width=".684"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-lib-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#c0ca33"/><path d="M17.391 12.543a2.05 2.05 0 0 0 2.05-2.05 2.05 2.05 0 0 0-2.05-2.052 2.05 2.05 0 0 0-2.05 2.051 2.05 2.05 0 0 0 2.05 2.051m0 2.42a8.992 8.992 0 0 0-6.152-2.42v7.52c2.392 0 4.539.923 6.152 2.42a8.992 8.992 0 0 1 6.152-2.42v-7.52c-2.392 0-4.539.923-6.152 2.42z" fill="#f0f4c3" stroke-width=".684"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-actions" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ab47bc" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#e1bee7" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-actions-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ab47bc"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#e1bee7" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-effects" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00bcd4" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#b2ebf2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-effects-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00bcd4"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#b2ebf2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef5350" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#ffcdd2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-reducer-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef5350"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#ffcdd2" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-state" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.655 8.39l-6.152 2.193.933 8.142 5.219 2.888 5.219-2.888.932-8.142zm-1.278 2.067c.234-.004.487.07.768.223.124.066.498.16.83.21 1.183.17 2.586 1.073 3.03 1.95.306.602.243.927-.225 1.169-.404.209-1.23.108-2.43-.297l-1.012-.342-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.518 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.004-.363-.046 0-.04.164-.243.363-.451.748-.781 1.004-1.365 1.083-2.474l.055-.767.176.365c.194.401.23.98.091 1.478-.115.416-.038.462.173.104.261-.443.345-.373.299.251-.05.678-.283 1.187-.808 1.762-.429.468-.377.552.141.233.5-.308.567-.26.31.224-.487.914-1.516 1.69-2.585 1.948-.647.158-1.106.187-1.7.11-1.55-.204-3.018-1.249-3.718-2.648a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.141.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.108.282-.199.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#dcedc8" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-ngrx-state-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a"/><path d="M17.655 8.39l-6.152 2.192.933 8.143 5.219 2.888 5.219-2.888.932-8.143zm-1.278 2.067c.234-.004.487.07.768.222.124.067.498.162.83.21 1.183.171 2.586 1.074 3.03 1.95.306.603.243.928-.225 1.17-.404.208-1.23.107-2.43-.298l-1.012-.341-.36.137c-.522.2-1.044.694-1.258 1.19-.154.359-.177.527-.149 1.116.028.59.071.761.28 1.132.239.422.786.96.88.866.026-.026-.03-.197-.124-.38-.093-.183-.148-.368-.122-.41.026-.042.273.114.548.347.611.517 1.326.848 1.981.917.538.056.661-.044.258-.211a1.238 1.238 0 0 1-.374-.25c-.157-.173-.166-.168.504-.318.417-.094 1.24-.531 1.29-.685.016-.05-.118-.07-.338-.053-.2.016-.363-.005-.363-.046 0-.04.164-.243.363-.452.748-.78 1.004-1.364 1.083-2.474l.055-.766.176.364c.194.402.23.981.091 1.479-.115.416-.038.462.173.103.261-.442.345-.372.299.252-.05.678-.283 1.186-.808 1.761-.429.47-.377.553.141.234.5-.308.567-.26.31.224-.487.914-1.516 1.689-2.585 1.948-.647.158-1.106.187-1.7.109-1.55-.203-3.018-1.248-3.718-2.647a8.736 8.736 0 0 0-.572-.989c-.275-.373-.298-.54-.113-.823.093-.142.114-.286.076-.502-.176-.999-.17-1.03.23-1.437.35-.353.371-.4.371-.813 0-.358.036-.475.198-.637.109-.109.282-.2.384-.2.296-.003.807-.277 1.11-.595.252-.265.52-.4.822-.404z" fill="#dcedc8" stroke-width=".696"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-node" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.25 8.403c-.188 0-.382.048-.542.139l-5.166 2.986a1.096 1.096 0 0 0-.542.944v5.959c0 .388.208.75.542.944l1.354.778c.66.32.882.326 1.187.326.973 0 1.535-.59 1.535-1.618V12.98a.154.154 0 0 0-.153-.153h-.646c-.09 0-.16.07-.16.153v5.882c0 .458-.472.91-1.228.528l-1.424-.813a.181.181 0 0 1-.076-.145v-5.959c0-.062.027-.118.076-.146l5.167-2.979a.15.15 0 0 1 .152 0l5.167 2.98a.164.164 0 0 1 .076.145v5.959a.181.181 0 0 1-.076.145l-5.167 2.98c-.041.027-.11.027-.16 0l-1.305-.792c-.055-.021-.111-.028-.146-.007-.368.208-.437.25-.778.354-.083.028-.215.076.05.222l1.721 1.021c.167.097.348.146.542.146s.375-.049.542-.146l5.166-2.979c.334-.194.542-.556.542-.944v-5.959c0-.389-.208-.75-.542-.944l-5.166-2.986a1.103 1.103 0 0 0-.542-.14m1.389 4.272c-1.472 0-2.354.618-2.354 1.66 0 1.117.875 1.444 2.291 1.583 1.688.166 1.82.416 1.82.75 0 .576-.465.82-1.549.82-1.375 0-1.666-.341-1.77-1.022a.157.157 0 0 0-.153-.125h-.667c-.083 0-.146.063-.146.153 0 .861.472 1.903 2.736 1.903 1.632 0 2.57-.646 2.57-1.771 0-1.118-.75-1.41-2.34-1.625-1.605-.208-1.765-.32-1.765-.694 0-.313.14-.73 1.327-.73 1.042 0 1.451.23 1.611.945.014.07.076.118.146.118h.673a.134.134 0 0 0 .105-.049c.027-.028.048-.07.034-.11-.097-1.237-.916-1.806-2.57-1.806z" fill-rule="nonzero" fill="#f1f8e9"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-node-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a" fill-rule="nonzero"/><path d="M17.25 8.403c-.188 0-.382.048-.542.139l-5.166 2.986a1.096 1.096 0 0 0-.542.944v5.959c0 .388.208.75.542.944l1.354.778c.66.32.882.326 1.187.326.973 0 1.535-.59 1.535-1.618V12.98a.154.154 0 0 0-.153-.153h-.646c-.09 0-.16.07-.16.153v5.882c0 .458-.472.91-1.228.528l-1.424-.813a.181.181 0 0 1-.076-.145v-5.959c0-.062.027-.118.076-.146l5.167-2.979a.15.15 0 0 1 .152 0l5.167 2.98a.164.164 0 0 1 .076.145v5.959a.181.181 0 0 1-.076.145l-5.167 2.98c-.041.027-.11.027-.16 0l-1.305-.792c-.055-.021-.111-.028-.146-.007-.368.208-.437.25-.778.354-.083.028-.215.076.05.222l1.721 1.021c.167.097.348.146.542.146s.375-.049.542-.146l5.166-2.979c.334-.194.542-.556.542-.944v-5.959c0-.389-.208-.75-.542-.944l-5.166-2.986a1.103 1.103 0 0 0-.542-.14m1.389 4.272c-1.472 0-2.354.618-2.354 1.66 0 1.117.875 1.444 2.291 1.583 1.688.166 1.82.416 1.82.75 0 .576-.465.82-1.549.82-1.375 0-1.666-.341-1.77-1.022a.157.157 0 0 0-.153-.125h-.667c-.083 0-.146.063-.146.153 0 .861.472 1.903 2.736 1.903 1.632 0 2.57-.646 2.57-1.771 0-1.118-.75-1.41-2.34-1.625-1.605-.208-1.765-.32-1.765-.694 0-.313.14-.73 1.327-.73 1.042 0 1.451.23 1.611.945.014.07.076.118.146.118h.673a.134.134 0 0 0 .105-.049c.027-.028.048-.07.034-.11-.097-1.237-.916-1.806-2.57-1.806z" fill-rule="nonzero" fill="#f1f8e9"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-public" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#039be5" fill-rule="nonzero"/><path d="M20.036 16.746c.05-.408.087-.817.087-1.237s-.037-.83-.087-1.238h2.091c.099.396.16.81.16 1.238a5.1 5.1 0 0 1-.16 1.237m-3.186 3.44c.371-.687.656-1.43.854-2.203h1.825a4.968 4.968 0 0 1-2.679 2.203m-.155-3.44h-2.895c-.062-.408-.099-.817-.099-1.237s.037-.835.1-1.238h2.894c.056.403.1.817.1 1.238s-.044.829-.1 1.237m-1.447 3.687a8.39 8.39 0 0 1-1.182-2.45h2.363a8.39 8.39 0 0 1-1.181 2.45m-2.475-7.399h-1.806a4.902 4.902 0 0 1 2.672-2.202c-.37.686-.65 1.429-.866 2.202m-1.806 4.95h1.806c.217.773.495 1.515.866 2.202a4.954 4.954 0 0 1-2.672-2.203m-.508-1.237a5.099 5.099 0 0 1-.16-1.237 5.1 5.1 0 0 1 .16-1.238h2.091c-.049.409-.086.817-.086 1.238s.037.829.086 1.237m2.698-6.168a8.425 8.425 0 0 1 1.181 2.456h-2.363a8.426 8.426 0 0 1 1.182-2.456m4.28 2.456h-1.824a9.682 9.682 0 0 0-.854-2.202 4.94 4.94 0 0 1 2.679 2.202m-4.281-3.712a6.193 6.193 0 0 0-6.187 6.187 6.186 6.186 0 0 0 6.187 6.186 6.186 6.186 0 0 0 6.186-6.186 6.186 6.186 0 0 0-6.186-6.187z" fill="#b3e5fc" stroke-width=".619"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-public-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#039be5"/><path d="M20.037 16.746c.05-.408.087-.817.087-1.237s-.037-.83-.087-1.238h2.091c.099.396.16.81.16 1.238a5.1 5.1 0 0 1-.16 1.237m-3.186 3.44c.371-.687.656-1.43.854-2.203h1.825a4.967 4.967 0 0 1-2.68 2.203m-.154-3.44h-2.895c-.062-.408-.099-.817-.099-1.237s.037-.835.099-1.238h2.895c.056.403.1.817.1 1.238s-.044.829-.1 1.237m-1.447 3.687a8.39 8.39 0 0 1-1.182-2.45h2.363a8.39 8.39 0 0 1-1.181 2.45m-2.475-7.399H13.06a4.902 4.902 0 0 1 2.672-2.202c-.371.686-.65 1.429-.866 2.202m-1.806 4.95h1.806c.217.773.495 1.515.866 2.202a4.954 4.954 0 0 1-2.672-2.203m-.508-1.237a5.099 5.099 0 0 1-.16-1.237 5.1 5.1 0 0 1 .16-1.238h2.091c-.05.409-.086.817-.086 1.238s.037.829.086 1.237m2.698-6.168a8.425 8.425 0 0 1 1.181 2.456h-2.363a8.426 8.426 0 0 1 1.182-2.456m4.28 2.456h-1.824a9.682 9.682 0 0 0-.854-2.202 4.941 4.941 0 0 1 2.679 2.202M17.34 9.322a6.193 6.193 0 0 0-6.187 6.187 6.186 6.186 0 0 0 6.187 6.186 6.186 6.186 0 0 0 6.186-6.186 6.186 6.186 0 0 0-6.186-6.187z" fill="#b3e5fc" stroke-width=".619"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-react-components" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#00bcd4" fill-rule="nonzero"/><path d="M16.473 13.927c.723 0 1.313.59 1.313 1.327 0 .703-.59 1.3-1.313 1.3a1.318 1.318 0 0 1-1.313-1.3c0-.737.59-1.327 1.313-1.327m-3.252 6.946c.443.267 1.412-.14 2.529-1.194a17.015 17.015 0 0 1-1.06-1.335 15.945 15.945 0 0 1-1.686-.252c-.358 1.502-.225 2.535.217 2.78m.499-4.03l-.204-.359a5.558 5.558 0 0 0-.203.604c.19.042.4.078.618.113l-.211-.359m4.593-.533l.569-1.054-.569-1.053c-.21-.372-.435-.702-.639-1.032-.38-.022-.78-.022-1.2-.022-.422 0-.823 0-1.202.022-.204.33-.428.66-.639 1.032l-.569 1.053.57 1.054c.21.372.434.702.638 1.032.38.021.78.021 1.201.021.421 0 .822 0 1.201-.02.204-.331.428-.661.639-1.033m-1.84-4.72c-.133.155-.274.316-.414.506h.828c-.14-.19-.28-.351-.414-.506m0 7.332c.133-.154.274-.316.414-.505h-.828c.14.19.28.35.414.505m3.245-9.284c-.436-.267-1.405.14-2.522 1.194.366.414.724.864 1.06 1.334.577.057 1.146.14 1.686.253.359-1.503.225-2.535-.224-2.78m-.492 4.03l.204.358c.077-.203.154-.407.203-.604-.19-.042-.4-.077-.618-.112l.211.358m1.018-4.95c1.033.589 1.145 2.141.71 3.953 1.784.527 3.069 1.398 3.069 2.584 0 1.187-1.285 2.058-3.07 2.585.436 1.812.324 3.364-.709 3.954-1.025.59-2.423-.085-3.77-1.37-1.35 1.285-2.747 1.96-3.78 1.37-1.025-.59-1.137-2.142-.702-3.954-1.783-.527-3.069-1.398-3.069-2.585s1.286-2.057 3.07-2.584c-.436-1.812-.324-3.364.702-3.954 1.032-.59 2.43.084 3.778 1.37 1.348-1.286 2.746-1.96 3.771-1.37m-.203 6.538c.239.527.45 1.054.625 1.588 1.475-.443 2.303-1.075 2.303-1.588 0-.512-.828-1.144-2.303-1.587a15.81 15.81 0 0 1-.625 1.587m-7.136 0a15.806 15.806 0 0 1-.625-1.587c-1.474.443-2.303 1.075-2.303 1.587 0 .513.829 1.145 2.303 1.588.176-.534.387-1.06.625-1.588m6.321 1.588l-.21.358c.217-.035.428-.07.617-.113-.049-.196-.126-.4-.203-.604l-.204.359m-2.03 2.837c1.117 1.053 2.086 1.46 2.522 1.194.45-.246.583-1.278.224-2.781-.54.112-1.11.196-1.685.253-.337.47-.695.92-1.06 1.334m-3.477-6.012l.21-.358c-.217.035-.428.07-.617.113.049.196.126.4.203.604l.204-.359m2.03-2.837c-1.117-1.053-2.086-1.46-2.529-1.194-.442.246-.576 1.278-.217 2.781.54-.112 1.11-.196 1.685-.253.337-.47.695-.92 1.06-1.334z" fill="#b2ebf2" stroke-width=".702"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-react-components-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#00bcd4"/><path d="M16.473 13.928c.723 0 1.313.59 1.313 1.327 0 .703-.59 1.3-1.313 1.3a1.318 1.318 0 0 1-1.313-1.3c0-.737.59-1.327 1.313-1.327m-3.252 6.946c.443.267 1.412-.14 2.529-1.194a16.997 16.997 0 0 1-1.06-1.335 15.945 15.945 0 0 1-1.686-.252c-.358 1.502-.225 2.535.217 2.78m.499-4.03l-.204-.359c-.077.204-.154.408-.203.604.19.042.4.078.618.113l-.211-.359m4.593-.533l.569-1.054-.57-1.053c-.21-.372-.434-.702-.638-1.032-.38-.022-.78-.022-1.201-.022-.421 0-.822 0-1.2.022-.205.33-.43.66-.64 1.032l-.569 1.053.569 1.054c.21.372.435.702.64 1.032.378.021.779.021 1.2.021.421 0 .822 0 1.2-.02.205-.33.43-.661.64-1.033m-1.84-4.72c-.133.155-.274.316-.414.506h.828c-.14-.19-.28-.351-.414-.506m0 7.332c.133-.154.274-.316.414-.505h-.828c.14.19.28.35.414.505m3.244-9.284c-.435-.267-1.404.14-2.52 1.194.364.414.723.864 1.06 1.334.575.057 1.144.14 1.685.253.358-1.503.225-2.535-.225-2.78m-.491 4.03l.203.358c.078-.203.155-.407.204-.604-.19-.042-.4-.077-.618-.112l.21.358m1.02-4.95c1.032.589 1.144 2.141.708 3.953 1.784.527 3.07 1.398 3.07 2.584 0 1.187-1.286 2.058-3.07 2.585.436 1.812.323 3.364-.709 3.954-1.025.59-2.423-.085-3.771-1.37-1.348 1.285-2.746 1.96-3.778 1.37-1.026-.59-1.138-2.142-.703-3.954-1.783-.527-3.069-1.398-3.069-2.585s1.286-2.057 3.07-2.584c-.436-1.812-.324-3.364.702-3.954 1.032-.59 2.43.084 3.778 1.37 1.348-1.286 2.746-1.96 3.771-1.37m-.204 6.538c.24.527.45 1.054.625 1.588 1.475-.443 2.304-1.075 2.304-1.588 0-.512-.829-1.144-2.304-1.587a15.81 15.81 0 0 1-.625 1.587m-7.135 0a15.808 15.808 0 0 1-.625-1.587c-1.475.443-2.303 1.075-2.303 1.587 0 .513.828 1.145 2.303 1.588.176-.534.386-1.06.625-1.588m6.32 1.588l-.21.358c.218-.035.428-.07.618-.113a5.56 5.56 0 0 0-.204-.604l-.203.359m-2.03 2.837c1.117 1.053 2.086 1.46 2.521 1.194.45-.246.583-1.278.225-2.781-.54.112-1.11.196-1.685.253-.338.47-.696.92-1.06 1.334m-3.477-6.012l.21-.358c-.217.035-.428.07-.617.112.049.197.126.4.203.604l.204-.358m2.03-2.837c-1.117-1.053-2.086-1.46-2.529-1.194-.442.246-.576 1.278-.217 2.781.54-.112 1.11-.196 1.685-.253.337-.47.695-.92 1.06-1.334z" fill="#b2ebf2" stroke-width=".702"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-actions" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ab47bc" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#e1bee7" stroke="#e1bee7" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-actions-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ab47bc"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#e1bee7" stroke="#e1bee7" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ef5350" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#ffcdd2" stroke="#ffcdd2" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-reducer-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ef5350"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#ffcdd2" stroke="#ffcdd2" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-store" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#8bc34a" fill-rule="nonzero"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#dcedc8" stroke="#dcedc8" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-redux-store-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#8bc34a"/><g transform="translate(8.378 6.436) scale(.17228)" fill="#dcedc8" stroke="#dcedc8" stroke-miterlimit="4" stroke-width="1.702"><path d="M65.6 65.4c2.9-.3 5.1-2.8 5-5.8S68 54.2 65 54.2h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 1.5.7 2.8 1.6 3.7-3.4 6.7-8.6 11.6-16.4 15.7-5.3 2.8-10.8 3.8-16.3 3.1-4.5-.6-8-2.6-10.2-5.9-3.2-4.9-3.5-10.2-.8-15.5 1.9-3.8 4.9-6.6 6.8-8-.4-1.3-1-3.5-1.3-5.1-14.5 10.5-13 24.7-8.6 31.4 3.3 5 10 8.1 17.4 8.1 2 0 4-.2 6-.7 12.8-2.5 22.5-10.1 28-21.4z"/><path d="M83.2 53c-7.6-8.9-18.8-13.8-31.6-13.8H50c-.9-1.8-2.8-3-4.9-3h-.2c-3.1.1-5.5 2.7-5.4 5.8.1 3 2.6 5.4 5.6 5.4h.2c2.2-.1 4.1-1.5 4.9-3.4H52c7.6 0 14.8 2.2 21.3 6.5 5 3.3 8.6 7.6 10.6 12.8 1.7 4.2 1.6 8.3-.2 11.8-2.8 5.3-7.5 8.2-13.7 8.2-4 0-7.8-1.2-9.8-2.1-1.1 1-3.1 2.6-4.5 3.6 4.3 2 8.7 3.1 12.9 3.1 9.6 0 16.7-5.3 19.4-10.6 2.9-5.8 2.7-15.8-4.8-24.3z"/><path d="M32.4 67.1c.1 3 2.6 5.4 5.6 5.4h.2c3.1-.1 5.5-2.7 5.4-5.8-.1-3-2.6-5.4-5.6-5.4h-.2c-.2 0-.5 0-.7.1-4.1-6.8-5.8-14.2-5.2-22.2.4-6 2.4-11.2 5.9-15.5 2.9-3.7 8.5-5.5 12.3-5.6 10.6-.2 15.1 13 15.4 18.3 1.3.3 3.5 1 5 1.5-1.2-16.2-11.2-24.6-20.8-24.6-9 0-17.3 6.5-20.6 16.1-4.6 12.8-1.6 25.1 4 34.8-.5.7-.8 1.8-.7 2.9z"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-resource" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#fbc02d" fill-rule="nonzero"/><path d="M21.598 12.059h-6.085v-1.217h6.085m-2.434 6.085h-3.65V15.71h3.65m2.434-1.217h-6.085v-1.217h6.085m.608-4.26h-7.301a1.217 1.217 0 0 0-1.217 1.218v7.301a1.217 1.217 0 0 0 1.217 1.217h7.301a1.217 1.217 0 0 0 1.217-1.217v-7.301a1.217 1.217 0 0 0-1.217-1.217m-9.735 2.434h-1.217v8.518a1.217 1.217 0 0 0 1.217 1.217h8.519v-1.217H12.47z" fill="#fff9c4" stroke-width=".608"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-resource-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#fbc02d"/><path d="M21.598 12.059h-6.085v-1.217h6.085m-2.434 6.085h-3.65V15.71h3.65m2.434-1.217h-6.085v-1.217h6.085m.608-4.26h-7.301a1.217 1.217 0 0 0-1.217 1.218v7.301a1.217 1.217 0 0 0 1.217 1.217h7.301a1.217 1.217 0 0 0 1.217-1.217v-7.301a1.217 1.217 0 0 0-1.217-1.217m-9.735 2.433h-1.217v8.519a1.217 1.217 0 0 0 1.217 1.217h8.519v-1.217H12.47z" fill="#fff9c4" stroke-width=".608"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" id="folder-sass" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#f8bbd0" fill-rule="nonzero"/><path d="M23.36 10.506c-.39-1.527-2.922-2.03-5.319-1.178-1.426.507-2.97 1.302-4.08 2.34-1.32 1.235-1.53 2.31-1.444 2.759.306 1.584 2.477 2.62 3.37 3.388v.005c-.264.13-2.19 1.104-2.64 2.1-.476 1.052.075 1.806.44 1.908 1.131.315 2.292-.251 2.916-1.182.602-.897.551-2.056.29-2.633.36-.095.781-.138 1.316-.076 1.508.177 1.804 1.118 1.748 1.513-.057.394-.373.61-.48.676-.105.065-.137.088-.129.137.013.07.062.068.152.053.125-.021.792-.321.821-1.048.037-.924-.849-1.958-2.416-1.93-.646.01-1.052.072-1.345.181-.022-.024-.044-.05-.067-.073-.969-1.034-2.76-1.765-2.684-3.156.027-.505.203-1.835 3.442-3.45 2.653-1.322 4.777-.957 5.145-.151.524 1.152-1.136 3.293-3.891 3.601-1.05.118-1.603-.289-1.74-.44-.145-.16-.166-.167-.22-.137-.088.049-.033.19 0 .274.082.214.42.594.995.782.506.166 1.739.258 3.23-.319 1.669-.646 2.972-2.443 2.59-3.944zm-7.103 7.783a2.2 2.2 0 0 1-.065 1.413 2.405 2.405 0 0 1-.453.704c-.5.546-1.198.752-1.497.579-.323-.188-.161-.956.418-1.568.623-.66 1.52-1.083 1.52-1.083l-.002-.002.079-.043z" fill="#ec407a" fill-rule="nonzero" stroke="#ec407a" stroke-width=".5199012000000001"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" id="folder-sass-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#f8bbd0" fill-rule="nonzero"/><path d="M23.36 10.506c-.39-1.527-2.922-2.03-5.319-1.178-1.426.507-2.97 1.302-4.08 2.34-1.32 1.235-1.53 2.31-1.444 2.759.306 1.584 2.477 2.62 3.37 3.388v.005c-.264.13-2.19 1.104-2.64 2.1-.476 1.052.075 1.806.44 1.908 1.131.315 2.292-.251 2.916-1.182.602-.897.551-2.056.29-2.633.36-.095.781-.138 1.316-.076 1.508.177 1.804 1.118 1.748 1.513-.057.394-.373.61-.48.676-.105.065-.137.088-.129.137.013.07.062.068.152.053.125-.021.792-.321.821-1.048.037-.924-.849-1.958-2.416-1.93-.646.01-1.052.072-1.345.181-.022-.024-.044-.05-.067-.073-.969-1.034-2.76-1.765-2.684-3.156.027-.505.203-1.835 3.442-3.45 2.653-1.322 4.777-.957 5.145-.151.524 1.152-1.136 3.293-3.891 3.601-1.05.118-1.603-.289-1.74-.44-.145-.16-.166-.167-.22-.137-.088.049-.033.19 0 .274.082.214.42.594.995.782.506.166 1.739.258 3.23-.319 1.669-.646 2.972-2.443 2.59-3.944zm-7.103 7.783a2.2 2.2 0 0 1-.065 1.413 2.405 2.405 0 0 1-.453.704c-.5.546-1.198.752-1.497.579-.323-.188-.161-.956.418-1.568.623-.66 1.52-1.083 1.52-1.083l-.002-.002.079-.043z" fill="#ec407a" fill-rule="nonzero" stroke="#ec407a" stroke-width=".5199012000000001"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-scripts" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#546e7a" fill-rule="nonzero"/><path d="M18.466 20.241c.69 0 1.259-.568 1.259-1.258v-8.18H15.32a.632.632 0 0 0-.63.63v6.292h-1.887v-6.922c0-1.036.852-1.888 1.888-1.888h6.921c1.036 0 1.888.852 1.888 1.888v.63h-2.517v8.18a1.896 1.896 0 0 1-1.888 1.887h-6.292a1.896 1.896 0 0 1-1.888-1.888v-.629h6.293c0 .69.568 1.258 1.258 1.258z" fill-rule="nonzero" fill="#cfd8dc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-scripts-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#546e7a" fill-rule="nonzero"/><path d="M18.466 20.241c.69 0 1.259-.568 1.259-1.258v-8.18H15.32a.632.632 0 0 0-.63.63v6.292h-1.887v-6.922c0-1.036.852-1.888 1.888-1.888h6.921c1.036 0 1.888.852 1.888 1.888v.63h-2.517v8.18a1.896 1.896 0 0 1-1.888 1.887h-6.292a1.896 1.896 0 0 1-1.888-1.888v-.629h6.293c0 .69.568 1.258 1.258 1.258z" fill-rule="nonzero" fill="#cfd8dc"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-src" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#4caf50" fill-rule="nonzero"/><g fill="#c8e6c9" transform="translate(2.065 -.225) scale(.70678)"><path d="M19.146 30.989a.902.902 0 0 1-.207-.025 1.045 1.045 0 0 1-.726-1.213l2.709-14.431c.049-.279.209-.525.444-.683a.891.891 0 0 1 .7-.122c.519.152.837.684.727 1.213L20.077 30.16a1.032 1.032 0 0 1-.442.681.895.895 0 0 1-.489.148zM24.578 28.944h-.068a.932.932 0 0 1-.668-.377 1.104 1.104 0 0 1 .1-1.419l4.658-4.553-4.638-4.239a1.105 1.105 0 0 1-.141-1.416.938.938 0 0 1 .661-.4.9.9 0 0 1 .709.237l5.47 5c.386.372.448.974.144 1.416a1.05 1.05 0 0 1-.142.163l-5.447 5.324a.913.913 0 0 1-.638.264zM16.423 28.947a.917.917 0 0 1-.639-.267l-5.452-5.327a.874.874 0 0 1-.132-.153 1.097 1.097 0 0 1 .141-1.414l5.471-5a.882.882 0 0 1 .7-.238.939.939 0 0 1 .665.4 1.104 1.104 0 0 1-.14 1.417L12.4 22.6l4.659 4.551c.377.382.42.988.1 1.419a.928.928 0 0 1-.669.377z" fill-rule="nonzero"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-src-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#4caf50"/><g fill="#c8e6c9" fill-rule="evenodd" transform="translate(2.064 -.224) scale(.70678)"><path d="M19.146 30.989a.902.902 0 0 1-.207-.025 1.045 1.045 0 0 1-.726-1.213l2.709-14.431c.049-.279.209-.525.444-.683a.891.891 0 0 1 .7-.122c.519.152.837.684.727 1.213L20.077 30.16a1.032 1.032 0 0 1-.442.681.895.895 0 0 1-.489.148zM24.578 28.944h-.068a.932.932 0 0 1-.668-.377 1.104 1.104 0 0 1 .1-1.419l4.658-4.553-4.638-4.239a1.105 1.105 0 0 1-.141-1.416.938.938 0 0 1 .661-.4.9.9 0 0 1 .709.237l5.47 5c.386.372.448.974.144 1.416a1.05 1.05 0 0 1-.142.163l-5.447 5.324a.913.913 0 0 1-.638.264zM16.423 28.947a.917.917 0 0 1-.639-.267l-5.452-5.327a.874.874 0 0 1-.132-.153 1.097 1.097 0 0 1 .141-1.414l5.471-5a.882.882 0 0 1 .7-.238.939.939 0 0 1 .665.4 1.104 1.104 0 0 1-.14 1.417L12.4 22.6l4.659 4.551c.377.382.42.988.1 1.419a.928.928 0 0 1-.669.377z" fill-rule="nonzero"/></g></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-test" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#1de9b6" fill-rule="nonzero"/><path d="M14 8.097v1.39h.695v9.732A2.794 2.794 0 0 0 17.475 22a2.794 2.794 0 0 0 2.781-2.78V9.486h.695v-1.39H14m2.78 9.732c-.417 0-.695-.278-.695-.695 0-.417.278-.695.696-.695.417 0 .695.278.695.695 0 .417-.278.695-.695.695m1.39-2.78c-.417 0-.695-.278-.695-.696 0-.417.278-.695.695-.695.417 0 .695.278.695.695 0 .418-.278.696-.695.696m.695-3.476h-2.78V9.487h2.78v2.086z" fill="#00897b" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-test-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#1de9b6" fill-rule="nonzero"/><path d="M14 8.097v1.39h.695v9.732A2.794 2.794 0 0 0 17.475 22a2.794 2.794 0 0 0 2.781-2.78V9.486h.695v-1.39H14m2.78 9.732c-.417 0-.695-.278-.695-.695 0-.417.278-.695.696-.695.417 0 .695.278.695.695 0 .417-.278.695-.695.695m1.39-2.78c-.417 0-.695-.278-.695-.696 0-.417.278-.695.695-.695.417 0 .695.278.695.695 0 .418-.278.696-.695.696m.695-3.476h-2.78V9.487h2.78v2.086z" fill="#00897b" fill-rule="nonzero"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-tools" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#1e88e5" fill-rule="nonzero"/><path d="M21.043 15.266a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141-2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-3.569 0a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141 2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m3.925-6.424a6.424 6.424 0 0 0-6.423 6.424 6.424 6.424 0 0 0 6.423 6.424 1.07 1.07 0 0 0 1.071-1.07c0-.28-.107-.53-.278-.715a1.105 1.105 0 0 1-.271-.713 1.07 1.07 0 0 1 1.07-1.071h1.263a3.569 3.569 0 0 0 3.57-3.569c0-3.154-2.877-5.71-6.425-5.71z" fill="#bbdefb" stroke-width=".714"/></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-tools-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#1e88e5"/><path d="M21.043 15.266a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141-2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-3.569 0a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m-2.141 2.855a1.07 1.07 0 0 1-1.07-1.07 1.07 1.07 0 0 1 1.07-1.071 1.07 1.07 0 0 1 1.07 1.07 1.07 1.07 0 0 1-1.07 1.071m3.925-6.424a6.424 6.424 0 0 0-6.423 6.424 6.424 6.424 0 0 0 6.423 6.424 1.07 1.07 0 0 0 1.071-1.07c0-.28-.107-.53-.278-.715a1.105 1.105 0 0 1-.271-.713 1.07 1.07 0 0 1 1.07-1.071h1.263a3.569 3.569 0 0 0 3.57-3.569c0-3.154-2.877-5.71-6.425-5.71z" fill="#bbdefb" stroke-width=".714"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-views" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#ff8a65" fill-rule="nonzero"/><path d="M12.487 21.868L11.384 9.5H23.5l-1.104 12.366-4.961 1.375-4.948-1.373zm4.464-3.2l-3.926-2.36v-.855l3.926-2.361v1.323l-2.504 1.465 2.504 1.465v1.323zm.982-.001v-1.323l2.522-1.464-2.522-1.464v-1.323l3.926 2.35v.874l-3.926 2.35z" fill="#e44d26"/></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="folder-views-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#ff8a65" fill-rule="nonzero"/><path d="M12.487 21.868L11.384 9.5H23.5l-1.104 12.366-4.961 1.375-4.948-1.373zm4.464-3.2l-3.926-2.36v-.855l3.926-2.361v1.323l-2.504 1.465 2.504 1.465v1.323zm.982-.001v-1.323l2.522-1.464-2.522-1.464v-1.323l3.926 2.35v.874l-3.926 2.35z" fill="#e44d26"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vscode" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#42a5f5" fill-rule="nonzero"/><path d="M20.811 8.52l-5.988 5.506-3.346-2.522-1.383.805 3.298 3.03-3.298 3.032 1.383.807 3.346-2.522 5.988 5.503 2.921-1.419V9.94zm0 3.622v6.396l-4.245-3.198z" fill="#bbdefb" stroke-width=".974"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vscode-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#42a5f5" fill-rule="nonzero"/><path d="M20.81 8.52l-5.988 5.506-3.346-2.522-1.384.805 3.3 3.03-3.3 3.032 1.384.807 3.346-2.522 5.988 5.503 2.921-1.419V9.94zm0 3.621v6.397l-4.245-3.198z" fill="#bbdefb" stroke-width=".974"/></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vue" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#009688" fill-rule="nonzero"/><g transform="translate(8.459 6.362) scale(.69572)"><path d="M1.821 4.15l10.21 17.618L22.239 4.235v-.084h-7.692l-2.434 4.178-2.422-4.178z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179z" fill="#35495e"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-vue-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#009688"/><g transform="translate(8.458 6.362) scale(.69572)"><path d="M1.821 4.15l10.21 17.618L22.239 4.235v-.084h-7.692l-2.434 4.178-2.422-4.178z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179z" fill="#35495e"/></g></symbol><symbol clip-rule="evenodd" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-webpack" xmlns="http://www.w3.org/2000/svg"><path d="M10 4H4c-1.11 0-2 .89-2 2v12c0 1.097.903 2 2 2h16c1.097 0 2-.903 2-2V8a2 2 0 0 0-2-2h-8l-2-2z" fill="#03a9f4" fill-rule="nonzero"/><g transform="translate(9.192 7.48) scale(.66328)"><path d="M19.376 15.988l-7.708 4.45-7.709-4.45v-8.9l7.709-4.451 7.708 4.45z" fill="#fff" fill-opacity=".785"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18s.41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.94v2.103h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#1c78c0"/></g></symbol><symbol clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" viewBox="0 0 24 24" id="folder-webpack-open" xmlns="http://www.w3.org/2000/svg"><path d="M19 20H4a2 2 0 0 1-2-2V6c0-1.11.89-2 2-2h6l2 2h7c1.097 0 2 .903 2 2H4v10l2.14-8h17.07l-2.28 8.5c-.23.87-1.01 1.5-1.93 1.5z" fill="#03a9f4"/><g transform="translate(9.193 7.48) scale(.66328)"><path d="M19.376 15.988l-7.708 4.45-7.709-4.45v-8.9l7.709-4.451 7.708 4.45z" fill="#fff" fill-opacity=".785"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18s.41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.94v2.103h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83zm-5 5.08v3.58l4 2.309v-3.58zm10 0l-4 2.308v3.58l4-2.308z" fill="#1c78c0"/></g></symbol><symbol viewBox="0 0 24 24" id="font" xmlns="http://www.w3.org/2000/svg"><path d="M9.62 12L12 5.67 14.37 12M11 3L5.5 17h2.25l1.12-3h6.25l1.13 3h2.25L13 3h-2z" fill="#f44336"/></symbol><symbol viewBox="0 0 500 500" id="fsharp" xmlns="http://www.w3.org/2000/svg"><path d="M235.906 36.66L21.963 250.601l213.943 213.943v-84.36L106.209 250.487l129.697-129.696z" fill="#378bba" stroke-width="14.706"/><path d="M235.906 156.614l-93.622 93.62 93.622 93.622z" fill="#378bba" stroke-width="15.006"/><path d="M263.417 36.64L477.36 250.583 263.417 464.526v-84.36l129.696-129.697-129.696-129.696z" fill="#30b9db" stroke-width="14.706"/></symbol><symbol viewBox="0 0 152.99 160.01" id="fusebox" xmlns="http://www.w3.org/2000/svg"><defs id="fkdefs4"><style id="fkstyle2">.fkcls-1{fill:#fff}.fkcls-2{fill:#515151}.fkcls-3{fill:#1d79bf}.fkcls-4{fill:#383838}</style></defs><title id="fktitle6">Asset 3</title><g id="fkLayer_2" data-name="Layer 2" transform="matrix(.87285 0 0 .87285 10.17 10.175)"><g id="fkFuse_Box" data-name="Fuse Box"><g id="fkLOGO"><path class="fkcls-1" id="fkpolygon8" fill="#fff" d="M76.56 2.19l74.22 24.93-7.7 87.77-65.41 42.66-69.79-43.93-5.7-86.13z"/><path class="fkcls-2" d="M77.69 160L5.87 114.81 0 26 76.55 0 153 25.67l-7.94 90.4zM9.88 112.43l67.77 42.66 63.45-41.39 7.47-85.13-72-24.18L4.36 28.95z" id="fkpath10" fill="#515151"/><path class="fkcls-3" id="fkpolygon12" fill="#1d79bf" d="M76.4 148.8V61.68l66.93-29.82-5.99 78.77z"/><path id="fkF" class="fkcls-4" fill="#383838" d="M76.4 148.8l-60.35-37.39L9.63 31.8 76.4 61.68z"/><path class="fkcls-1" d="M25.58 52.73l.54 15.93 37.35 18.18.12 14.69-37-18.21 1.64 37.1-14.56-9-5.05-80.55 67.79 30.82v15.46z" id="fkpath15" fill="#fff"/><path class="fkcls-1" d="M135.91 90.77c-.08 13.12-6.33 26.59-16.77 33.12l-42.8 27.93V61.71l42.27-18.84c5.16-2.41 9.51-1.43 12.4 3.11 1.9 3 2.89 7.23 2.86 12.21A35.69 35.69 0 0 1 129.34 76c4.29 2 6.66 6.55 6.57 14.77zM123 63.76c0-4.64-2-6.93-4.92-5.45l-29 14.48L89 90l29.44-15.59c2.5-1.32 4.56-5.91 4.56-10.65zM125.15 96c0-5.71-2.42-8.24-6.55-5.93L89 106.64v19.58l29.34-17.46c4.43-2.64 6.79-7.27 6.81-12.76z" id="fkpath17" fill="#fff"/><path id="fkTOP" class="fkcls-4" fill="#383838" d="M76.4 8.82L9.71 31.77l109.77 2.38-84.02 9.21L76.4 61.68l20.76-9.25-27.73-1.37 49.78-8.46 24.12-10.74z"/></g></g></g></symbol><symbol viewBox="0 0 24 24" id="git" xmlns="http://www.w3.org/2000/svg"><path d="M2.6 10.59L8.38 4.8l1.69 1.7c-.24.85.15 1.78.93 2.23v5.54c-.6.34-1 .99-1 1.73a2 2 0 0 0 2 2 2 2 0 0 0 2-2c0-.74-.4-1.39-1-1.73V9.41l2.07 2.09c-.07.15-.07.32-.07.5a2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0-2-2c-.18 0-.35 0-.5.07L13.93 7.5a1.98 1.98 0 0 0-1.15-2.34c-.43-.16-.88-.2-1.28-.09L9.8 3.38l.79-.78c.78-.79 2.04-.79 2.82 0l7.99 7.99c.79.78.79 2.04 0 2.82l-7.99 7.99c-.78.79-2.04.79-2.82 0L2.6 13.41c-.79-.78-.79-2.04 0-2.82z" fill="#e64a19"/></symbol><symbol viewBox="0 0 164 158" id="gitlab" xmlns="http://www.w3.org/2000/svg"><path d="M161.26 62.6545L161.031 62.0689L138.845 4.16909C138.394 3.03428 137.595 2.07162 136.562 1.41923C135.529 0.777924 134.324 0.46905 133.11 0.534313C131.896 0.599576 130.731 1.03583 129.773 1.78418C128.825 2.55402 128.137 3.59717 127.804 4.77168L112.824 50.6027H52.1654L37.1855 4.77168C36.8606 3.59077 36.1716 2.54239 35.2164 1.77569C34.2581 1.02734 33.0931 0.591087 31.8789 0.525824C30.6647 0.460561 29.4597 0.769435 28.4267 1.41074C27.3965 2.06577 26.598 3.02759 26.1436 4.1606L3.91558 62.035L3.69492 62.6206C0.501198 70.9653 0.106986 80.1221 2.57171 88.7104C5.03644 97.2986 10.2265 104.853 17.3593 110.234L17.4357 110.293L17.6394 110.438L51.4355 135.747L68.1553 148.401L78.34 156.09C79.5313 156.995 80.986 157.485 82.4818 157.485C83.9775 157.485 85.4322 156.995 86.6235 156.09L96.8082 148.401L113.528 135.747L147.528 110.285L147.613 110.217C154.73 104.835 159.907 97.2884 162.368 88.7117C164.829 80.135 164.44 70.9913 161.26 62.6545V62.6545Z" fill="#e24329"/><path d="M161.26 62.6545L161.031 62.0688C150.221 64.2878 140.034 68.8667 131.198 75.4787L82.4733 112.322C99.0658 124.874 113.511 135.78 113.511 135.78L147.511 110.319L147.596 110.251C154.723 104.869 159.909 97.3176 162.373 88.7336C164.837 80.1496 164.447 70.9973 161.26 62.6545Z" fill="#fc6d26"/><path d="M51.4355 135.78L68.1553 148.435L78.34 156.124C79.5313 157.029 80.9859 157.518 82.4817 157.518C83.9775 157.518 85.4322 157.029 86.6235 156.124L96.8081 148.435L113.528 135.78C113.528 135.78 99.0657 124.84 82.4732 112.322C65.8807 124.84 51.4355 135.78 51.4355 135.78Z" fill="#fca326"/><path d="M33.7397 75.4787C24.9112 68.8531 14.7266 64.2622 3.91558 62.0349L3.69492 62.6205C0.501198 70.9652 0.106986 80.122 2.57171 88.7103C5.03644 97.2985 10.2265 104.853 17.3593 110.234L17.4357 110.293L17.6394 110.437L51.4355 135.746C51.4355 135.746 65.8638 124.84 82.4733 112.288L33.7397 75.4787Z" fill="#fc6d26"/></symbol><symbol viewBox="0 0 24 24" id="go" xmlns="http://www.w3.org/2000/svg"><path d="M10.575 1.695c-2.634 0-4.756 2.453-4.756 5.502v4.6l-.027-.003v4.71c0 3.05 2.123 5.502 4.757 5.502h2.286c2.634 0 4.757-2.453 4.757-5.502v-4.6a5.1 5.1 0 0 0 .026.003v-4.71c0-3.049-2.122-5.502-4.756-5.502h-2.287z" fill="#73cddc"/><rect width="2.289" height="3.335" x="-1.178" y="6.092" ry="1.125" transform="matrix(.4849 -.87457 .85979 .51065 0 0)" fill="#73cddc"/><rect width="2.297" height="3.39" x="10.261" y="-15.076" ry="1.143" transform="matrix(.44646 .8948 -.89204 .45195 0 0)" fill="#73cddc"/><circle cx="9.267" cy="5.13" r="2.054" fill="#fff" stroke="#5e5d5b" stroke-width=".1"/><circle cx="14.214" cy="5.116" r="2.054" fill="#fff" stroke="#5e5d5b" stroke-width=".1"/><ellipse cx="8.039" cy="5.051" rx=".792" ry=".901" fill="#030d18"/><path d="M11.792 9.556l.763.138a.403.689 0 0 1 .008.138.403.689 0 0 1-.402.69.403.689 0 0 1-.404-.69.403.689 0 0 1 .035-.276z" fill="#fff" stroke="#fff" stroke-width=".155"/><ellipse cx="8.51" cy="5.365" rx=".138" ry=".166" fill="#fff"/><ellipse cx="12.945" cy="5.189" rx=".792" ry=".901" fill="#030d18"/><ellipse cx="13.414" cy="5.446" rx=".138" ry=".166" fill="#fff"/><ellipse cx="-12.982" cy="-3.409" rx=".708" ry="1.026" transform="rotate(-129.403)" fill="#f6d2a1" stroke-width=".4"/><path d="M11.772 9.553l-.757.135a.4.672 0 0 0-.008.135.4.672 0 0 0 .4.672.4.672 0 0 0 .4-.672.4.672 0 0 0-.035-.27z" fill="#fff" stroke="#fff" stroke-width=".153"/><ellipse cx="1.841" cy="-21.563" rx=".707" ry="1.026" transform="scale(1 -1) rotate(50.597)" fill="#f6d2a1" stroke-width=".4"/><ellipse cx="-17.281" cy="-21.784" rx=".864" ry="1.27" transform="matrix(.3054 -.95222 -.97065 -.2405 0 0)" fill="#f6d2a1" stroke-width=".4"/><ellipse cx="22.885" cy="2.587" rx=".864" ry="1.27" transform="matrix(.22652 .974 .95652 -.29167 0 0)" fill="#f6d2a1" stroke-width=".4"/><path d="M10.708 8.392a.594.594 0 0 0-.594.597v.115c0 .331.264.598.594.598h.386a.973.772 0 0 1 .697-.235.973.772 0 0 1 .698.235h.334c.33 0 .594-.267.594-.598V8.99a.595.595 0 0 0-.594-.597h-2.115z" fill="#f6d2a1" stroke="#657075" stroke-width=".1"/><ellipse cx="11.734" cy="8.203" rx="1.208" ry=".68" fill="#030d18" stroke="#fff" stroke-width=".162"/></symbol><symbol viewBox="0 0 24 24" id="gradle" xmlns="http://www.w3.org/2000/svg"><path d="M21.718 5.503c-.731-1.315-2.04-1.708-2.963-1.727-1.133-.023-2.065.605-1.888 1.017.037.088.25.55.38.741.19.275.527.064.646 0 .353-.187.73-.248 1.16-.198.409.048.954.3 1.319 1.001.859 1.652-1.794 5.05-5.114 2.697-3.32-2.353-6.548-1.574-8.01-1.1-1.462.475-2.135.952-1.556 2.055.785 1.498.524 1.038 1.285 2.28 1.21 1.97 3.856-.908 3.856-.908-1.972 2.906-3.662 2.204-4.31 1.188a15.864 15.864 0 0 1-1.038-1.97c-4.993 1.76-3.642 9.534-3.642 9.534h2.48c.632-2.862 2.892-2.757 3.28 0h1.892c1.673-5.59 5.914 0 5.914 0h2.466c-.69-3.812 1.388-5.01 2.697-7.246 1.31-2.235 2.551-4.969 1.146-7.364zm-6.362 7.362c-1.304-.426-.837-1.723-.837-1.723s1.139.368 2.68.87c-.09.403-.856 1.175-1.843.853z" fill="#0097a7" stroke-width=".47"/></symbol><symbol preserveAspectRatio="xMidYMid" viewBox="0 0 300 300" id="graphcool" xmlns="http://www.w3.org/2000/svg"><path d="M246.886 107.727c-12.237-6.892-27.616 2.1-30.081 3.646l-52.834 29.965c-7.8-6.196-18.914-5.933-26.412.625-7.499 6.558-9.24 17.537-4.14 26.094 5.102 8.556 15.588 12.246 24.923 8.768 9.335-3.478 14.852-13.129 13.111-22.937l52.688-29.9.321-.196c3.464-2.188 11.5-5.462 15.256-3.34 2.706 1.524 4.252 6.629 4.376 14.148h-.066v66.092a17.313 17.313 0 0 1-8.635 14.95l-75.739 43.755a17.312 17.312 0 0 1-17.261 0l-75.74-43.756a17.312 17.312 0 0 1-8.634-14.95V113.22c.01-6.165 3.3-11.86 8.634-14.95l68.549-39.562c6.522 7.482 17.451 9.25 26 4.206s12.283-15.468 8.886-24.794c-3.397-9.327-12.962-14.904-22.751-13.27-9.79 1.636-17.022 10.02-17.204 19.944L59.397 85.632a31.932 31.932 0 0 0-15.978 27.588v87.454a31.933 31.933 0 0 0 15.927 27.602l75.74 43.755a31.934 31.934 0 0 0 31.846 0l75.74-43.755a31.933 31.933 0 0 0 15.927-27.58V137.12h.05c.373-14.913-3.616-24.794-11.762-29.389z" fill="#27ae60" stroke="#27ae60" stroke-width="7.883622079999999"/></symbol><symbol viewBox="0 0 400 400" id="graphql" xmlns="http://www.w3.org/2000/svg"><path d="M67.008 293.022l-13.143-7.588L200.282 31.839l13.143 7.588z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M50.855 265.174H343.69v15.177H50.855z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M203.122 358.269L56.649 273.7l7.589-13.143 146.472 84.568zm127.24-220.407L183.889 53.293l7.589-13.143 146.472 84.568z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M64.278 137.803l-7.588-13.142 146.472-84.568 7.588 13.143z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M327.661 293.025L181.244 39.43l13.143-7.589 146.417 253.596zM62.466 114.597h15.176v169.136H62.466zm254.528 0h15.176v169.136h-15.176z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M200.538 351.845l-6.628-11.481L321.3 266.812l6.629 11.48z" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/><path d="M352.284 288.67c-8.777 15.268-28.342 20.48-43.61 11.703-15.268-8.777-20.48-28.342-11.703-43.61 8.777-15.268 28.342-20.48 43.61-11.703 15.36 8.869 20.57 28.342 11.703 43.61M97.574 141.567c-8.778 15.268-28.343 20.48-43.61 11.703-15.269-8.777-20.48-28.342-11.703-43.61 8.777-15.268 28.342-20.48 43.61-11.703 15.268 8.869 20.479 28.342 11.702 43.61M42.353 288.67c-8.777-15.268-3.566-34.741 11.702-43.61 15.268-8.776 34.741-3.565 43.61 11.703 8.776 15.268 3.565 34.741-11.703 43.61-15.36 8.776-34.833 3.565-43.61-11.703m254.71-147.103c-8.776-15.268-3.565-34.741 11.703-43.61 15.268-8.776 34.742-3.565 43.61 11.703 8.777 15.268 3.566 34.741-11.702 43.61-15.268 8.776-34.833 3.565-43.61-11.703m-99.745 236.608c-17.645 0-31.907-14.262-31.907-31.907s14.262-31.907 31.907-31.907 31.907 14.262 31.907 31.907c0 17.554-14.262 31.907-31.907 31.907m0-294.206c-17.645 0-31.907-14.262-31.907-31.907s14.262-31.907 31.907-31.907 31.907 14.262 31.907 31.907-14.262 31.907-31.907 31.907" fill="#ec407a" stroke-width="6.803" stroke="#ec407a"/></symbol><symbol viewBox="0 0 24 24" id="groovy" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.982a10.119 10.119 0 0 0-10.12 10.12A10.119 10.119 0 0 0 12 22.22 10.119 10.119 0 0 0 22.12 12.1 10.119 10.119 0 0 0 12 1.983zm1.254 2.422c.91 0 1.647.261 2.213.78.571.518.857 1.188.857 2.013 0 .889-.319 1.673-.959 2.35-.64.677-1.376 1.015-2.207 1.015-.486 0-.89-.119-1.213-.357-.317-.238-.476-.532-.476-.88 0-.212.06-.4.181-.563.127-.164.274-.246.438-.246.159 0 .238.092.238.277 0 .164.06.29.182.38.121.09.261.136.42.136.423 0 .828-.29 1.215-.866.391-.582.587-1.202.587-1.863 0-.465-.151-.844-.453-1.135-.301-.296-.69-.445-1.166-.445-.714 0-1.406.318-2.078.953-.666.635-1.211 1.47-1.635 2.506-.417 1.031-.627 2.014-.627 2.945 0 .857.185 1.54.555 2.047.37.503.863.754 1.477.754 1.037 0 2.027-.734 2.974-2.2l1.493-.212c.185-.026.277.018.277.135 0 .053-.072.28-.215.681-.143.402-.337 1.074-.586 2.016.82-.476 1.455-1.003 1.904-1.58v.914c-.36.418-1.046.888-2.062 1.412-.212 1.407-.682 2.493-1.406 3.26-.725.772-1.54 1.16-2.444 1.16-.433 0-.775-.102-1.023-.303-.243-.2-.365-.477-.365-.832 0-.984.955-1.94 2.865-2.865.2-.714.395-1.356.586-1.928-.333.482-.817.907-1.451 1.278-.635.37-1.225.554-1.77.554-.889 0-1.628-.383-2.22-1.15-.588-.772-.881-1.748-.881-2.928 0-1.243.333-2.42 1-3.531a7.747 7.747 0 0 1 2.625-2.674c1.084-.672 2.134-1.008 3.15-1.008zM12.03 16.592c-1.375.687-2.062 1.365-2.062 2.031 0 .354.169.533.508.533.666 0 1.184-.856 1.554-2.564z" fill="#26c6da"/></symbol><symbol viewBox="0 0 24 24" id="gulp" xmlns="http://www.w3.org/2000/svg"><path d="M8.37 15.94a596.238 596.238 0 0 1-.482-4.982c.002-.042-.225-.077-.505-.077h-.508V8.95h3.966V5.198l1.871-1.124c1.14-.685 1.978-1.125 2.144-1.125.4 0 .866.506.866.939 0 .19-.057.422-.127.517-.07.095-.722.53-1.45.966l-1.321.792-.029 1.393-.028 1.393h3.972v1.932h-.98l-.495 4.983-.495 4.983H8.854l-.485-4.906z" fill="#e53935"/></symbol><symbol viewBox="0 0 24 24" id="h" xmlns="http://www.w3.org/2000/svg"><path d="M16.745 19.818h-3.007v-5.882q0-2.381-1.736-2.381-.869 0-1.438.663-.56.662-.56 1.718v5.882H6.988V4.533h3.016v6.508h.037q1.186-1.802 3.193-1.802 3.511 0 3.511 4.239z" stroke-width=".478" fill="#0277bd"/></symbol><symbol viewBox="0 0 253.6 253.6" id="hack" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-29.243 -29.515) scale(1.2301)"><path fill="#607d8b" d="M69.496 159.551v52.576l51.77-52.576zM123.507 41.523l-54.01 52.755v55.084l54.01-54.009z"/><path fill="#eceff1" d="M130.023 95.663v51.501l52.128-51.5z"/><path fill="#607d8b" d="M185.465 101.867l-55.442 55.174v55.083l55.442-55.262z"/><path fill="#ffa000" d="M73.068 154.283l50.427.09v-50.248z"/></g></symbol><symbol viewBox="0 0 300 300.00001" id="haml" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 165.6)"><path d="M78.42-132.307c-12.047-.302-26.924 5.998-26.924 5.998l49.195 99.791L74.605 85.005c23.81 20.134 50.07 10.504 50.07 10.504L136.76 9.212c1.526 1.446 3.146 2.77 4.777 3.995 5.244 3.714 10.925 6.553 16.606 8.738 5.68 2.185 11.583 3.933 17.482 5.244 3.933.874 7.645 1.53 11.578 1.967-1.748 3.933-2.84 8.083-2.621 12.672 0 .437.22.873.656 1.092h.217c4.152 2.185 8.521 3.934 13.328 5.027 4.589.874 9.615 1.312 14.422.656 5.026-.655 10.051-2.623 13.984-5.9 3.933-3.278 6.774-7.648 8.522-12.237l.219-.218v-.217l.656-5.899v-.22c2.185-1.311 4.37-2.621 6.555-4.37 2.622-2.184 5.025-4.589 6.773-7.648 1.748-3.059 2.84-6.774 2.621-10.488-.218-3.496-1.53-6.99-3.06-10.049-1.53-3.059-3.495-5.901-5.68-8.523-4.37-5.026-9.614-9.176-15.295-12.454-5.462-3.496-11.581-6.338-17.7-8.304l-2.404-.656-1.962-.655c-1.311-.437-2.406-1.092-3.498-1.53-2.185-1.31-3.717-2.622-4.809-4.37-2.185-3.278-2.403-8.301-1.31-13.545.218-1.311.656-2.623 1.093-3.934a96.064 96.064 0 0 0 1.31-4.152c.314-1.412.51-2.829.598-4.402l29.203-25.553c-2.275-8.404-27.488-17.158-27.488-17.158l-74.931 63.726-43.243-81.584c-1.553-.35-3.218-.527-4.94-.57zm107.682 73.14c-.449 2.336-.647 4.795-.647 7.258.219 3.715 1.311 7.87 3.715 11.366 2.403 3.496 5.68 6.117 8.957 7.646a29.663 29.663 0 0 0 5.027 1.967l2.623.654 2.184.438c5.68 1.53 11.142 3.714 16.168 6.554 5.025 2.84 9.833 6.337 13.766 10.27s6.992 8.959 7.43 13.984c.218 3.496-.22 6.118-1.313 8.303-1.093 2.404-2.84 4.588-4.807 6.555-.874.874-1.966 1.747-2.84 2.402a27.11 27.11 0 0 0-.654-5.898c-.219-1.093-.438-1.966-.875-3.059-.437-.874-.872-1.966-1.965-2.621-.218 0-.44-.001-.44.217-1.31 3.277-3.494 6.12-5.898 8.086-2.403 1.966-5.462 2.84-8.521 3.058-3.06.219-6.338-.436-9.616-1.31-3.277-.874-6.552-1.968-9.83-3.06l-.439-.22c-.656-.218-1.526.002-1.963.44-1.748 2.185-3.06 4.149-4.59 6.334a58.435 58.435 0 0 0-2.84 5.027c-3.933-1.53-7.649-2.841-11.582-4.37-5.462-2.186-10.925-4.37-15.95-6.991-5.245-2.404-10.268-5.246-14.638-8.524-3.15-2.363-6.062-4.845-8.185-7.681l2.404-17.172z" fill="#f4511e" stroke-width="0" stroke-linejoin="round"/></g></symbol><symbol viewBox="0 0 24 24" id="handlebars" xmlns="http://www.w3.org/2000/svg"><path d="M8.55 10.32c-2.753 0-4.202 3.48-5.793 3.48-.98 0-1.126-.677-1.126-.915 0-.332.236-.706.564-.706.59 0 .414.77.414.77s.798-.555.272-1.298c-.42-.595-1.31-.623-1.92-.17-.617.458-1.057 1.146-.853 2.287.1.551.468 1.35 1.233 1.805.764.455 1.925.566 2.335.566 2.194 0 4.342-1.633 6.639-2.322a5.513 5.513 0 0 1 1.497-.222 6.19 6.19 0 0 1 1.92.226c2.296.689 4.444 2.323 6.638 2.323.41 0 1.57-.11 2.335-.566.765-.455 1.132-1.256 1.231-1.807.204-1.14-.235-1.829-.853-2.287-.61-.453-1.497-.423-1.918.172-.526.743.27 1.297.27 1.297s-.176-.77.414-.77c.329 0 .565.373.565.705 0 .238-.147.914-1.126.914-1.592 0-3.04-3.478-5.794-3.478-2.565 0-3.076 1.177-3.462 1.718-.004.005-.005.011-.008.016-.005-.006-.007-.013-.012-.02-.386-.54-.896-1.717-3.461-1.717z" fill="#ff7043" fill-rule="evenodd" stroke-width=".3"/></symbol><symbol viewBox="0 0 300.00001 300" id="haskell" xmlns="http://www.w3.org/2000/svg"><g stroke-width="2.422"><path d="M23.928 240.5l59.94-89.852-59.94-89.855h44.955l59.94 89.855-59.94 89.852z" fill="#ef5350"/><path d="M83.869 240.5l59.94-89.852-59.94-89.855h44.955l119.88 179.71h-44.95l-37.46-56.156-37.468 56.156z" fill="#ffa726"/><path d="M228.72 188.08l-19.98-29.953h69.93v29.956h-49.95zm-29.97-44.924l-19.98-29.953h99.901v29.953z" fill="#ffee58"/></g></symbol><symbol viewBox="0 0 210 210" id="haxe" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -87)"><path fill="#f68712" stroke-width=".221" d="M42.78 191.545l63.431-63.43 63.431 63.43-63.431 63.431z"/><path d="M42.8 191.592L31.193 148.28 19.59 104.97 62.9 116.575l43.311 11.605-31.706 31.706z" fill="#fab20b" stroke-width=".266"/><path d="M105.956 128.111l-43.19-11.544-43.177-11.597 22.927.185 23.228.294 20.264 11.36z" fill="#fbc707" stroke-width=".265"/><path d="M19.59 104.97l11.596 43.176 11.545 43.19-11.303-19.948-11.36-20.263-.294-23.228z" fill="#fff200" stroke-width=".265"/><path d="M106.23 128.133l43.312-11.605 43.311-11.605-11.605 43.31-11.605 43.312-31.706-31.706z" fill="#f47216" stroke-width=".266"/><path d="M169.711 191.289l11.545-43.19 11.597-43.176-.185 22.927-.294 23.228-11.36 20.263z" fill="#f1471d" stroke-width=".265"/><path d="M192.853 104.923l-43.176 11.597-43.19 11.544 19.947-11.303 20.264-11.36 23.228-.293z" fill="#fbc707" stroke-width=".265"/><path d="M169.643 191.545l11.605 43.31 11.605 43.312-43.311-11.605-43.311-11.606 31.706-31.705z" fill="#f25c19" stroke-width=".266"/><path d="M106.487 255.025l43.19 11.544 43.176 11.598-22.927-.185-23.228-.294-20.264-11.36z" fill="#f68712" stroke-width=".265"/><path d="M192.853 278.167l-11.597-43.176-11.545-43.19 11.303 19.947 11.36 20.264.294 23.228z" fill="#f1471d" stroke-width=".265"/><path d="M106.211 254.976l-43.31 11.605-43.312 11.605 11.605-43.31L42.8 191.563l31.706 31.706z" fill="#f89c0e" stroke-width=".266"/><path d="M42.731 191.82l-11.545 43.19-11.597 43.176.185-22.927.294-23.228 11.36-20.263z" fill="#fff200" stroke-width=".265"/><path d="M19.59 278.186l43.175-11.597 43.19-11.544-19.947 11.303-20.264 11.36-23.228.293z" fill="#f25c19" stroke-width=".265"/></g></symbol><symbol viewBox="0 0 144 152" id="heroku" xmlns="http://www.w3.org/2000/svg"><path d="M118.68 13.279H26.865c-6.337 0-11.476 5.139-11.476 11.476V129.32c0 6.338 5.139 11.477 11.476 11.477h91.813c6.338 0 11.477-5.14 11.477-11.477V24.755c0-6.337-5.139-11.476-11.477-11.476zM44.08 121.669V96.165l14.346 12.752zm44.632 0v-38.08c-.063-2.976-1.496-6.551-7.97-6.551-12.966 0-27.51 6.52-27.654 6.586l-9.008 4.08V32.407h12.752v36.201c6.366-2.072 15.266-4.321 23.91-4.321 7.882 0 12.6 3.099 15.17 5.698 5.484 5.547 5.56 12.613 5.551 13.43v38.255zm3.188-68.54H79.149c5.011-6.576 8.158-13.496 9.564-20.723h12.751c-.86 7.243-3.796 14.187-9.563 20.722z" fill="#6963b9"/></symbol><symbol viewBox="0 0 24 24" id="hpp" xmlns="http://www.w3.org/2000/svg"><path d="M9.757 19.818H6.751v-5.882q0-2.381-1.737-2.381-.868 0-1.438.663-.56.662-.56 1.718v5.882H0V4.533h3.016v6.508h.037Q4.24 9.239 6.247 9.239q3.51 0 3.51 4.239z" stroke-width=".478" fill="#0277bd"/><path d="M13.073 11.448v2h-2v2h2v2h2v-2h2v-2h-2v-2zm7 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#0277bd"/></symbol><symbol viewBox="0 0 24 24" id="html" xmlns="http://www.w3.org/2000/svg"><path d="M12 17.56l4.07-1.13.55-6.1H9.38L9.2 8.3h7.6l.2-1.99H7l.56 6.01h6.89l-.23 2.58-2.22.6-2.22-.6-.14-1.66h-2l.29 3.19L12 17.56M4.07 3h15.86L18.5 19.2 12 21l-6.5-1.8L4.07 3z" fill="#e44d26"/></symbol><symbol viewBox="0 0 24 24" id="http" xmlns="http://www.w3.org/2000/svg"><path d="M16.046 13.784c.074-.613.13-1.225.13-1.856s-.056-1.244-.13-1.856h3.137c.148.594.241 1.215.241 1.856a7.65 7.65 0 0 1-.241 1.856m-4.78 5.16c.557-1.03.984-2.144 1.281-3.304h2.738a7.452 7.452 0 0 1-4.019 3.304m-.232-5.16H9.828a12.314 12.314 0 0 1-.149-1.856c0-.631.056-1.253.149-1.856h4.343c.084.603.149 1.225.149 1.856 0 .63-.065 1.243-.149 1.856M12 19.315c-.77-1.113-1.393-2.348-1.773-3.675h3.545c-.38 1.327-1.002 2.562-1.773 3.675m-3.712-11.1h-2.71a7.353 7.353 0 0 1 4.01-3.304c-.557 1.03-.975 2.144-1.3 3.304m-2.71 7.425h2.71c.325 1.16.743 2.274 1.3 3.304a7.433 7.433 0 0 1-4.01-3.304m-.761-1.856a7.65 7.65 0 0 1-.241-1.856c0-.64.093-1.262.241-1.856h3.137c-.074.612-.13 1.225-.13 1.856 0 .63.056 1.243.13 1.856m4.046-9.253c.77 1.114 1.393 2.357 1.773 3.684h-3.545c.38-1.327 1.002-2.57 1.773-3.684m6.422 3.684h-2.738a14.523 14.523 0 0 0-1.28-3.304 7.412 7.412 0 0 1 4.018 3.304m-6.423-5.568c-5.132 0-9.28 4.176-9.28 9.28a9.28 9.28 0 0 0 9.28 9.282 9.28 9.28 0 0 0 9.281-9.281A9.28 9.28 0 0 0 12 2.647z" fill="#e53935" stroke-width=".928"/></symbol><symbol viewBox="0 0 24 24" id="image" xmlns="http://www.w3.org/2000/svg"><path d="M13.009 9.202h5.368l-5.368-5.368v5.368M6.177 2.37h7.808l5.856 5.856v11.711a1.952 1.952 0 0 1-1.952 1.952H6.178a1.951 1.951 0 0 1-1.952-1.952V4.322c0-1.083.868-1.952 1.952-1.952m0 17.567h11.71V12.13l-3.903 3.903-1.952-1.951-5.856 5.855M8.13 9.202a1.952 1.952 0 0 0-1.952 1.952 1.952 1.952 0 0 0 1.952 1.952 1.952 1.952 0 0 0 1.952-1.952A1.952 1.952 0 0 0 8.13 9.202z" fill="#26a69a" stroke-width=".976"/></symbol><symbol viewBox="0 0 512 512" id="ionic" xmlns="http://www.w3.org/2000/svg"><g fill="#4f8ff7"><path d="M423.592 132.804A31.855 31.855 0 0 0 429 115c0-17.675-14.33-32-32-32a31.853 31.853 0 0 0-17.805 5.409C344.709 63.015 302.11 48 256 48 141.125 48 48 141.125 48 256c0 114.877 93.125 208 208 208 114.873 0 208-93.123 208-208 0-46.111-15.016-88.71-40.408-123.196zM391.83 391.832c-17.646 17.646-38.191 31.499-61.064 41.174-23.672 10.012-48.826 15.089-74.766 15.089-25.94 0-51.095-5.077-74.767-15.089-22.873-9.675-43.417-23.527-61.064-41.174s-31.5-38.191-41.174-61.064C68.982 307.096 63.905 281.94 63.905 256c0-25.94 5.077-51.095 15.089-74.767 9.674-22.873 23.527-43.417 41.174-61.064s38.191-31.5 61.064-41.174c23.673-10.013 48.828-15.09 74.768-15.09 25.939 0 51.094 5.077 74.766 15.089a191.221 191.221 0 0 1 37.802 21.327A31.853 31.853 0 0 0 365 115c0 17.675 14.327 32 32 32 5.293 0 10.28-1.293 14.678-3.568a191.085 191.085 0 0 1 21.327 37.801c10.013 23.672 15.09 48.827 15.09 74.767 0 25.939-5.077 51.096-15.09 74.768-9.675 22.873-23.527 43.418-41.175 61.064z"/><circle cx="256.003" cy="256" r="96"/></g></symbol><symbol viewBox="0 0 24 24" id="java" xmlns="http://www.w3.org/2000/svg"><path d="M2 21h18v-2H2M20 8h-2V5h2m0-2H4v10a4 4 0 0 0 4 4h6a4 4 0 0 0 4-4v-3h2a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="javascript" xmlns="http://www.w3.org/2000/svg"><path d="M3 3h18v18H3V3m4.73 15.04c.4.85 1.19 1.55 2.54 1.55 1.5 0 2.53-.8 2.53-2.55v-5.78h-1.7V17c0 .86-.35 1.08-.9 1.08-.58 0-.82-.4-1.09-.87l-1.38.83m5.98-.18c.5.98 1.51 1.73 3.09 1.73 1.6 0 2.8-.83 2.8-2.36 0-1.41-.81-2.04-2.25-2.66l-.42-.18c-.73-.31-1.04-.52-1.04-1.02 0-.41.31-.73.81-.73.48 0 .8.21 1.09.73l1.31-.87c-.55-.96-1.33-1.33-2.4-1.33-1.51 0-2.48.96-2.48 2.23 0 1.38.81 2.03 2.03 2.55l.42.18c.78.34 1.24.55 1.24 1.13 0 .48-.45.83-1.15.83-.83 0-1.31-.43-1.67-1.03l-1.38.8z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="javascript-map" xmlns="http://www.w3.org/2000/svg"><path d="M18 8v2h2v10H10v-2H8v4h14V8h-4z" fill="#ffca28"/><path d="M2.444 2.506h14.135v14.136H2.444V2.506m3.714 11.811c.315.668.935 1.218 1.995 1.218 1.178 0 1.987-.629 1.987-2.003V8.993H8.805v4.508c0 .675-.275.848-.707.848-.455 0-.644-.314-.856-.683l-1.084.651m4.697-.14c.392.769 1.185 1.358 2.426 1.358 1.257 0 2.199-.652 2.199-1.854 0-1.107-.636-1.602-1.767-2.089l-.33-.141c-.573-.243-.816-.408-.816-.801 0-.322.243-.573.636-.573.377 0 .628.165.856.573l1.028-.683c-.432-.754-1.044-1.045-1.884-1.045-1.186 0-1.948.754-1.948 1.752 0 1.083.636 1.594 1.594 2.002l.33.141c.613.267.974.432.974.888 0 .377-.354.652-.903.652-.652 0-1.029-.338-1.312-.81l-1.083.63z" fill="#ffca28"/></symbol><symbol viewBox="0 0 180 180" id="jenkins" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="gia"><path transform="scale(1 -1)" fill="#37474f" d="M.899-144.42h144.42V0H.899z"/></clipPath></defs><g transform="matrix(1.0691 0 0 -1.0691 9.4 166.143)" clip-path="url(#gia)"><g fill-rule="evenodd"><path d="M107.96 30.661l-12.506-1.876-16.883-1.876-10.943-.312-10.629.312-8.13 2.502-7.19 7.815-5.628 15.945-1.25 3.44-7.504 2.5-4.377 7.191-3.126 10.317 3.44 9.067 8.128 2.814 6.565-3.127 3.127-6.878 3.752.626 1.25 1.563-1.25 7.19-.313 9.068 1.876 12.505-.074 7.143 5.701 9.114 10.005 7.19 17.508 7.504 19.383-2.814 16.883-12.193 7.817-12.505 5.002-9.067 1.25-22.51-3.752-19.384-6.877-17.195-6.566-9.066" fill="#f0d6b7"/><path d="M97.334-23.425l-44.709-1.876v-7.503l3.752-26.262-1.876-2.19-31.264 10.63-2.19 3.752-3.126 35.328-7.19 21.26-1.563 5.002 25.01 17.195 7.818 3.127 6.877-8.441 5.94-5.315 6.88-2.188 3.125-.938L68.57 1.899l2.814-3.44 7.19 2.502-5.002-9.693 27.2-12.818-3.439-1.876" fill="#335061"/><path d="M23.238 85.687l8.128 2.814 6.566-3.127 3.127-6.878 3.751.626.938 3.751-1.876 7.19 1.876 17.197-1.563 9.379 5.627 6.565 12.193 9.692-3.44 4.69-17.194-8.442-7.191-5.627-4.064-8.754-6.253-8.442-1.876-10.005 1.251-10.63" fill="#6d6b6d"/><path d="M36.055 115.07s4.69 11.567 23.448 17.195c18.759 5.628.938 4.065.938 4.065l-20.321-7.817-7.817-7.816-3.438-6.253 7.19.626M26.676 87.875s-6.566 21.886 18.446 25.012l-.938 3.752-17.195-4.065-5.003-16.257 1.251-10.63 3.439 2.188" fill="#dcd9d8"/></g><g fill="#f7e4cd"><path d="M36.681 58.799l4.094 3.966s1.847-.214 2.16-2.402c.312-2.19 1.25-21.886 14.693-32.516 1.227-.97-10.004 1.564-10.004 1.564L37.62 45.042M94.209 64.739s.729 9.477 3.28 8.748c2.553-.729 2.553-3.28 2.553-3.28s-6.198-4.01-5.833-5.468" fill-rule="evenodd"/><path d="M120.16 99.442s-5.153-1.088-5.628-5.628c-.474-4.54 5.628-.938 6.566-.625M82.327 99.129s-6.879-.938-6.879-5.314c0-4.378 7.817-4.065 10.005-2.19"/><g fill-rule="evenodd"><path d="M39.807 78.808s-11.881 7.191-13.131.312c-1.25-6.877-4.065-11.88 1.876-19.07l-4.064 1.25-3.752 9.691-1.25 9.38 7.19 7.504 8.129-.626 4.69-3.751.312-4.69M45.435 98.504s5.315 27.512 32.203 32.827c22.136 4.375 33.765-.938 38.142-5.94 0 0-19.696 23.447-38.455 16.257-18.759-7.191-32.514-20.322-32.202-28.762.532-14.377.313-14.382.313-14.382M117.97 122.27s-9.066.312-9.38-7.817c0 0 0-1.25.625-2.5 0 0 7.192 8.129 11.568 3.751"/><path d="M78.268 111.1s-1.56 12.477-12.199 5.223c-6.878-4.69-6.252-11.255-5.002-12.505s.91-3.77 1.862-2.04c.952 1.728.638 7.356 4.078 8.918 3.439 1.564 9.077 3.31 11.26.404"/></g></g><g fill="#49728b" fill-rule="evenodd"><path d="M48.874 26.597L19.486 13.466s12.193-48.46 5.94-63.467l-4.377 1.563-.313 18.446-8.128 35.015-3.44 9.692 30.639 20.633 9.067-8.753M51.896-.206l4.17-5.087v-18.76h-5.003s-.625 13.132-.625 14.696c0 1.563.624 7.19.624 7.19M52-26.866l-14.069-.625 4.065-2.813L52-31.868"/></g><g fill-rule="evenodd"><path d="M100.15-23.739l11.567.313 2.814-28.764-11.881-1.563-2.5 30.014" fill="#335061"/><path d="M103.27-23.739l17.508.938s7.19 18.133 7.19 19.07c0 .939 6.253 26.263 6.253 26.263l-14.069 14.694-2.813 2.501-7.504-7.503V3.148l-6.565-26.887" fill="#335061"/><path d="M111.09-21.55l-10.942-2.188 1.563-8.755c4.064-1.876 10.943 3.127 10.943 3.127M111.4 33.162l21.885-16.257.626 7.503-16.57 15.32-5.94-6.566" fill="#49728b"/><path d="M62.85-85.332l-6.473 26.266-3.22 19.38-.531 14.385 29.296 1.56 18.226.003-1.658-32.83 2.814-25.324-.312-4.69-23.76-1.876-14.382 3.126" fill="#fff"/><path d="M96.083-23.426s-1.563-32.515 3.127-55.65c0 0-9.38-5.94-23.136-7.503l26.262.938 3.126 1.875-3.752 51.273-.938 10.944" fill="#dcd9d8"/><path d="M115.06-49.691l12.193 3.44 23.135 1.25 3.44 10.629-6.254 18.446-7.19.938-10.005-3.127-9.599-4.686-5.095.935-3.972-1.56" fill="#fff"/><path d="M114.84-43.435s8.128 3.751 9.38 3.438L120.78-22.8l4.065 1.563s2.814-16.257 2.814-18.133c0 0 17.507-.938 19.07-.938 0 0 3.752 7.191 2.814 14.694l3.44-10.005.312-5.628-5.002-7.503-5.627-1.25-9.38.312-3.126 4.064-10.943-1.563-3.44-1.25" fill="#dcd9d8"/></g><path d="M102.56-21.241L95.682-3.733l-7.19 10.317s1.562 4.377 3.75 4.377h7.192l6.878-2.501-.625-11.568-3.127-18.134" fill="#fff"/><path d="M103.9-15.297S95.145 1.585 95.145 4.086c0 0 1.563 3.752 3.752 2.814 2.19-.938 6.879-3.439 6.879-3.439v5.94l-10.63 2.19-7.19-.939 12.193-28.763 2.5-.313" fill="#dcd9d8" fill-rule="evenodd"/><path d="M65.664 25.968l-8.661.942-8.13 2.501v-2.814l3.972-4.38 12.506-5.627" fill="#fff"/><path d="M51.689 25.031s9.693-4.065 12.819-3.127l.311-3.748-8.752 1.872-5.316 3.752.938 1.251" fill="#dcd9d8" fill-rule="evenodd"/><path d="M115.03 9.897c-5.305.156-10.098.786-14.294 1.97.285 1.72-.249 3.408.18 4.647 1.17.843 3.13.83 4.898 1.027-1.529.752-3.677 1.049-5.44.615-.042 1.194-.578 1.934-.902 2.868 2.982 1.064 10.024 8.044 13.984 5.732 1.887-1.099 2.689-7.377 2.835-10.43.122-2.533-.23-5.088-1.261-6.43" fill="#d33833" fill-rule="evenodd"/><path d="M115.03 9.897c-5.305.156-10.098.786-14.294 1.97.285 1.72-.249 3.408.18 4.647 1.17.843 3.13.83 4.898 1.027-1.529.752-3.677 1.049-5.44.615-.042 1.194-.578 1.934-.902 2.868 2.982 1.064 10.024 8.044 13.984 5.732 1.887-1.099 2.689-7.377 2.835-10.43.122-2.533-.23-5.088-1.261-6.43z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M89.66 18.569c-.014-.401-.03-.806-.047-1.21-1.656-1.089-4.33-1.076-6.148-1.99 2.68-.117 4.79-.763 6.614-1.672l-.118-3.033c-3.036-2.078-5.81-5.173-9.384-7.122-1.69-.922-7.622-3.294-9.42-2.875-1.017.236-1.109 1.499-1.516 2.689-.866 2.548-2.861 6.605-3.035 10.44-.222 4.846-.71 12.967 4.51 11.969 4.213-.804 9.113-2.745 12.375-4.527 1.993-1.09 3.146-2.436 6.17-2.669" fill="#d33833" fill-rule="evenodd"/><path d="M89.66 18.569c-.014-.401-.03-.806-.047-1.21-1.656-1.089-4.33-1.076-6.148-1.99 2.68-.117 4.79-.763 6.614-1.672l-.118-3.033c-3.036-2.078-5.81-5.173-9.384-7.122-1.69-.922-7.622-3.294-9.42-2.875-1.017.236-1.109 1.499-1.516 2.689-.866 2.548-2.861 6.605-3.035 10.44-.222 4.846-.71 12.967 4.51 11.969 4.213-.804 9.113-2.745 12.375-4.527 1.993-1.09 3.146-2.436 6.17-2.669z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M92.675 12.788c-.463 2.64-.999 3.393-.792 5.695 7.04 4.693 8.361-8.061.792-5.695" fill="#d33833" fill-rule="evenodd"/><path d="M92.675 12.788c-.463 2.64-.999 3.393-.792 5.695 7.04 4.693 8.361-8.061.792-5.695z" fill="none" stroke="#d33833" stroke-width="2"/><path d="M102.87 10.649s-2.19 3.127-.626 4.065c1.564.938 3.127 0 4.065 1.563s0 2.501.313 4.377 1.877 2.189 3.44 2.501c1.562.313 5.94.938 6.565-.625l-1.876 5.627-3.752 1.25-11.88-6.877-.626-3.44v-6.877M70.041.331c-.376 4.88-.773 9.752-1.215 14.626-.662 7.279 1.748 6.009 8.057 6.009.964 0 5.933-1.15 6.289-1.876 1.705-3.483-2.851-2.709 1.964-5.335 4.065-2.216 11.246 1.346 9.603 6.273-.919 1.095-4.789.341-6.176 1.06l-7.327 3.8c-3.108 1.612-10.29 3.962-13.603 1.709-8.395-5.71.53-19.974 3.524-25.93" fill="#ef3d3a" fill-rule="evenodd"/><g fill="#231f20" fill-rule="evenodd"><path d="M78.268 111.1c-8.521 1.985-12.755-3.566-15.338-9.323-2.306.559-1.389 3.695-.806 5.294 1.525 4.194 7.672 9.778 12.694 9.02 2.161-.325 5.086-2.301 3.45-4.99M119.79 101.4l.404-.016c1.926-4 3.593-8.238 6.022-11.769-1.628-3.79-12.322-7.144-12.157-.338 2.313 1.01 6.305.206 8.356 1.497-1.186 3.254-2.897 6.024-2.625 10.626M82.63 101.29c1.827-3.35 2.422-6.868 5.019-9.4 1.17-1.14 3.444-2.529 2.316-5.698-.263-.747-2.189-2.414-3.3-2.741-4.06-1.2-13.521-.248-10.317 4.814 3.358-.157 7.871-2.18 10.38.257-1.927 3.081-5.363 9.177-4.098 12.768M118.26 67.253c-6.113-3.927-12.93-8.197-22.947-7.207-2.14 1.86-2.956 6.002-.877 8.737 1.082-1.861.402-5.284 3.419-5.799 5.684-.972 12.299 3.477 16.387 5.032 2.535 4.275-.219 5.847-2.503 8.597-4.675 5.636-10.947 12.622-10.72 21.06 1.89 1.37 2.053-2.092 2.325-2.722 2.44-5.714 8.585-13.021 13.07-17.912 1.1-1.205 2.914-2.36 3.115-3.157.582-2.315-1.513-5.09-1.27-6.63M37.668 71.387c-1.916 1.094-2.372 5.91-4.622 6.048-3.215.195-2.629-6.25-2.616-10.018-2.213 2.009-2.602 8.194-.976 11.37-1.853.91-2.68-1.003-3.708-1.677 1.32 9.595 14.036 4.45 11.922-5.723M122.15 63.257c-2.846-5.417-6.871-11.382-15.222-11.555-.17 1.75-.3 4.411.009 5.464 6.384.614 10.325 3.863 15.212 6.091M82.149 59.745c5.326-2.8 15.114-3.102 22.353-2.89.388-1.586.379-3.545.394-5.48-9.305-.463-20.307 1.84-22.747 8.37M81.136 54.523c3.683-9.247 16.341-8.182 27.016-7.927-.47-1.2-1.489-2.62-2.755-3.132-3.42-1.392-12.855-2.448-17.604.074-3.011 1.601-4.946 5.219-6.596 7.34-.797 1.024-4.765 3.64-.06 3.645"/></g><path d="M117.82 3.516c-4.322-7.402-8.457-15.005-13.585-21.534 2.15 6.32 3.07 16.9 3.394 24.965 4.498 2.105 8.349-.474 10.191-3.43" fill="#81b0c4" fill-rule="evenodd"/><g fill="#231f20" fill-rule="evenodd"><path d="M141.07-23.089c-4.839-.969-8.239-5.671-12.959-5.37 2.594 3.658 7.14 5.2 12.959 5.37M143.21-30.661c-3.944-.417-8.576-1.055-12.577-.726 1.894 2.892 9.19 1.894 12.577.726M144.58-37.19c-4.433-.096-9.942-.008-14.155.346 2.492 2.677 11.28.993 14.155-.346"/></g><g fill-rule="evenodd"><path d="M109.48-55.057c.636-5.567 2.843-11.207 2.566-17.304-2.45-.827-3.858-1.55-7.142-1.545-.232 5.181-.925 13.102-.718 18.041 1.615-.107 3.997 1.154 5.294.808" fill="#dcd9d8"/><path d="M102.33 26.985c-2.226-1.453-4.121-3.267-6.259-4.818-4.74-.235-7.327.328-10.81 3.05.057.219.407.121.42.39 5.075-2.262 11.524.92 16.648 1.378" fill="#f0d6b7"/><path d="M75.694-7.603c1.394 6.04 6.857 9.17 11.817 12.497 5.12-6.498 8.234-14.855 11.663-22.92-8.102 2.443-16.38 6.406-23.481 10.423" fill="#81b0c4"/><path d="M104.18-55.865c-.207-4.94.486-12.86.718-18.041 3.283-.004 4.691.718 7.142 1.545.276 6.096-1.93 11.737-2.566 17.304-1.298.346-3.679-.914-5.294-.808zm-51.13 28.09c2.165-19.906 5.301-36.639 11.054-54.266 12.766-3.876 28.157-4.214 39.441-.716-2.072 9.948-1.167 22.06-2.378 32.677-.912 7.98-.447 16.009-1.698 24.15-13.673 2.844-33 .665-46.418-1.845zm49.651 1.72c-.115-8.549.383-16.982 1.036-25.542 3.282.493 5.51.822 8.56 1.49-.99 8.241-.869 17.514-2.886 24.804-2.332-.023-4.385.027-6.71-.752zm16.653 1.378c-1.558.357-3.372.014-4.86-.015.7-6.969 2.397-14.659 2.995-21.974 2.342-.073 3.593 1.032 5.52 1.403.102 6.421-.562 15.268-3.655 20.586zm25.215-23.038c4.882 1.186 7.952 7.165 6.586 13.305-.916 4.127-2.548 11.898-4.295 14.538-1.29 1.953-4.79 4.51-7.584 2.72-4.545-2.91-12.552-3.755-15.867-7.278 1.662-5.534 2.178-13.135 2.864-20.146 5.678-.354 12.665 1.562 17.387-.471-3.297-1.068-7.575-1.077-10.423-2.633 2.328-1.125 7.778-.897 11.332-.035zM99.17-18.025c-3.43 8.063-6.543 16.42-11.663 22.918-4.96-3.327-10.423-6.456-11.817-12.497 7.1-4.017 15.379-7.98 23.481-10.422zm8.453 24.971c-.325-8.065-1.245-18.644-3.395-24.965 5.128 6.53 9.263 14.132 13.585 21.534-1.842 2.957-5.693 5.536-10.19 3.431zm-9.582 3.405c-1.943.21-3.592-2.233-6.117-1.177-.58-.64-1.105-1.333-1.695-1.958 5.579-6.723 8.114-16.262 12.423-24.163 2.312 7.59 2.045 15.904 2.555 24.188-3.177-.201-4.94 2.873-7.166 3.11zm-6.161 8.132c-.208-2.303.328-3.056.791-5.695 7.57-2.367 6.248 10.388-.791 5.695zm-8.394 2.755c-3.261 1.782-8.161 3.723-12.374 4.527-5.222.999-4.732-7.123-4.51-11.968.173-3.836 2.168-7.893 3.035-10.441.406-1.19.498-2.453 1.515-2.69 1.798-.418 7.73 1.954 9.42 2.875 3.575 1.95 6.348 5.045 9.384 7.123.04 1.011.078 2.021.119 3.032-1.826.91-3.935 1.555-6.615 1.673 1.818.914 4.492.901 6.148 1.989.016.405.033.81.047 1.21-3.024.234-4.176 1.58-6.17 2.67zm-31.152 5.659c-2.707-2.748 7.592-6.494 10.871-6.696-.018 1.739.991 3.378.788 4.626-3.895.684-9.013.232-11.66 2.07zm33.345-1.29c-.013-.27-.363-.172-.42-.39 3.482-2.722 6.07-3.285 10.81-3.05 2.137 1.551 4.033 3.365 6.259 4.818-5.124-.458-11.574-3.64-16.648-1.379zm30.606-9.282c-.146 3.053-.948 9.332-2.835 10.431-3.961 2.312-11.002-4.668-13.984-5.732.324-.934.86-1.674.901-2.868 1.764.434 3.912.137 5.44-.615-1.767-.198-3.727-.185-4.897-1.027-.429-1.239.105-2.927-.18-4.647 4.196-1.184 8.989-1.814 14.294-1.97 1.032 1.341 1.383 3.896 1.261 6.429zM47.777 24.24c-.85.606-6.6 8.087-7.388 7.777-10.405-4.103-20.134-11.199-28.828-17.91 8.29-17.787 11.635-39.579 12.227-60.582 9.496-4.441 17.836-10.844 30.722-11.512-1.491 10.55-2.852 19.962-3.699 29.895-3.237 1.365-7.882-.062-10.913.423-.025 3.651 4.628 1.6 5.015 4.054.292 1.858-2.56 1.998-1.631 4.923 2.368-.861 3.612-2.763 6.138-3.477 2.309 5.05-.032 13.985.3 18.205.064.792.397 4.39 2.172 3.759 1.57-.559-.09-9.569.082-13.563.157-3.68-.444-7.242 1.046-9.552a355.817 355.817 0 0 0 38.576 3.16c-2.964 1.272-6.485 2.475-10.345 4.651-2.093 1.18-8.69 3.635-9.293 5.622-.964 3.167 2.528 4.855 3.125 7.57-6.285-3.428-7.511 3.286-8.998 8.042-1.347 4.308-2.114 7.526-2.445 10.01-5.414 2.581-11.203 5.195-15.863 8.505zm63.009 6.872c8.67 4.204 10.232-15.711 6.834-22.127.525-1.914 2.331-2.646 3.069-4.366-4.838-8.667-10.211-16.756-15.148-25.32 3.672 2.286 8.917.409 13.238 2.12 1.58.624 2.722 4.24 3.918 7.133 3.29 7.958 6.743 17.99 8.28 25.586.346 1.73 1.292 5.5 1.08 7.04-.378 2.758-4.12 4.803-6.022 6.508-3.506 3.15-5.714 5.921-9.371 8.866-1.483-2.189-4.666-3.66-5.878-5.44zM27.95 107.99c-4.13-4.545-3.266-13.062-2.766-19.121 7.467 4.697 17.377-.372 17.284-8.36 3.565.094 1.332 4.452.687 7.259-2.107 9.169 3.55 19.13.256 27.516-6.395-.485-11.649-3.097-15.46-7.294zm29.558 26.38c-9.352-2.65-21.337-9.446-25.18-17.847 2.976.432 5.041 1.933 7.977 2.119 1.11.072 2.563-.466 3.838-.148 2.54.63 4.685 6.327 6.602 8.447 1.868 2.07 4.114 2.954 5.651 4.841.988.477 2.448.444 2.504 1.927-.428.457-.879.806-1.392.66zm48.681-2.493c-9.707 5.477-26.136 9.596-36.462 4.449-8.331-4.155-19.593-11.027-23.433-19.737 3.587-8.405-1.062-16.106-1.36-24.64-.157-4.54 2.139-8.504 2.315-13.446-1.228-2.025-4.978-2.275-7.574-2.136-.873 4.372-2.403 9.287-6.906 9.78-6.371.697-11.03-4.576-11.319-10.085-.342-6.48 4.978-17.22 12.517-16.475 2.913.287 3.629 3.207 6.802 3.177 1.72-3.432-2.653-4.51-3.103-6.964-.117-.634.363-3.112.642-4.274 1.37-5.658 4.422-12.982 7.427-17.29 3.814-5.464 11.307-6.288 19.37-6.823 1.44 3.101 6.743 2.846 10.2 2.035-4.143 1.64-7.993 5.617-11.185 9.137-3.665 4.039-7.378 8.371-7.566 13.65 6.927-9.61 12.65-18.003 25.246-22.23 9.53-3.196 20.662 1.465 27.986 6.608 3.039 2.137 4.853 5.529 7.013 8.634 8.082 11.626 11.854 28.219 11.024 44.303-.342 6.633-.327 13.244-2.552 17.706-2.326 4.666-10.193 8.84-14.8 4.62-.853 4.537 3.83 7.344 9.331 5.71-3.922 5.063-8.039 11.145-13.614 14.29zm18.084-149.66c7.585 3.77 21.757 10.149 26.512-.014 1.755-3.746 3.814-10.079 4.723-13.946 1.284-5.456-1.392-16.923-7-18.754-4.953-1.617-10.733-1.518-16.7-.32-.702.585-1.484 1.603-2.03 2.665-4.261.165-8.25-.229-11.615-1.98.319-3.15-1.812-3.656-3.81-4.305-1.48-5.872 2.963-13.541 1.9-18.896-.76-3.815-5.453-4.405-8.902-5.118-.113-2.12.15-3.89.386-5.683-.789-2.907-4.327-4.561-7.679-4.967-11.029-1.326-27.775-1.922-38.384 1.893-2.96 7.261-5.292 16.093-7.758 24.384-10.346-1.105-18.715 4.464-26.603 8.113-2.731 1.266-6.51 1.964-7.53 4.138-.99 2.105-.584 6.14-.83 9.95-.625 9.733-1.16 19.12-3.73 29.086-1.154 4.472-3.165 8.418-4.568 12.727C9.358 5.184 7.092 10.12 6.5 14.1c-.877 5.903 4.681 6.232 8.235 8.79 5.494 3.954 9.806 6.142 15.756 9.711 1.762 1.057 7.077 3.733 7.681 4.966 1.202 2.443-2.062 5.888-2.935 7.803-1.38 3.03-2.1 5.602-2.298 8.59-4.992.789-8.775 3.76-11.06 7.109-3.781 5.543-6.403 15.798-3.132 23.599.257.614 1.536 1.822 1.725 2.765.372 1.858-.7 4.329-.768 6.305-.343 10.14 1.716 18.875 8.541 21.932 2.771 11.038 12.688 14.71 22.032 20.195 3.493 2.05 7.343 3.36 11.32 4.824 14.263 5.25 36.15 4.261 47.987-4.692 5.02-3.797 13.044-11.813 15.914-17.617 7.58-15.323 7.042-40.931 1.74-59.571-.712-2.503-1.746-6.181-3.19-9.187-1.006-2.1-4.134-6.3-3.754-8.153.391-1.916 7.132-7.034 8.577-8.428 2.603-2.51 7.548-5.843 7.948-9.012.43-3.372-1.485-7.984-2.456-11.238-3.245-10.858-6.412-20.895-10.091-30.576" fill="#231f20"/><path d="M73.674 57.38c.411.548 2.674 1.38 5.84-.144 0 0-3.752-.626-3.44-6.881l-1.564.313s-1.615 5.672-.836 6.712" fill="#f7e4cd"/><path d="M101.09 3.617a1.72 1.72 0 1 0-3.44.001 1.72 1.72 0 0 0 3.44-.001M102.81-4.355a1.72 1.72 0 1 0-3.44 0 1.72 1.72 0 0 0 3.44 0" fill="#1d1919"/></g><g><rect transform="matrix(.8 0 0 -.8 0 144)" x="16.854" y="177.38" width="70.412" height="4.12" rx=".983" ry=".983"/><rect transform="scale(1 -1)" x="78.502" y="-2.097" width="50.037" height="3.296" rx=".786" ry=".786"/><rect transform="scale(1 -1)" x="13.483" y="-3.697" width="54.831" height="3.296" rx=".786" ry=".786"/><rect transform="scale(1 -1)" x="83.296" y="-3.697" width="45.243" height="3.296" rx=".786" ry=".786"/></g></g></symbol><symbol viewBox="0 0 24 24" id="json" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#fbc02d"/></symbol><symbol viewBox="0 0 50 50" id="julia" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -247)" stroke-width="5.673"><circle cx="13.497" cy="281.632" r="9.555" fill="#bc342d"/><circle cx="36.081" cy="281.632" r="9.555" fill="#864e9f"/><circle cx="24.722" cy="262.389" r="9.555" fill="#328a22"/></g></symbol><symbol viewBox="0 0 64 64" id="karma" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -233)"><path d="M38.556 288.413l-20.29-26.687 9.532-7.246 20.29 26.686h-.001.002l5.527 7.247z" fill="#359b8b" stroke-width=".173"/><path d="M35.681 241.172L24.92 255.327v-14.13H12.947v13.817l7.84 33.235h4.132v-13.147l.003.003 20.29-26.686-.008-.006 5.504-7.24H35.84v.12z" fill="#3cbeae" stroke-width=".206"/></g></symbol><symbol viewBox="0 0 24 24" id="key" xmlns="http://www.w3.org/2000/svg"><path d="M7 14a2 2 0 0 1-2-2 2 2 0 0 1 2-2 2 2 0 0 1 2 2 2 2 0 0 1-2 2m5.65-4A5.99 5.99 0 0 0 7 6a6 6 0 0 0-6 6 6 6 0 0 0 6 6 5.99 5.99 0 0 0 5.65-4H17v4h4v-4h2v-4H12.65z" fill="#26a69a"/></symbol><symbol viewBox="0 0 24 24" id="kivy" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(1.89 0 0 1.89 -12.157 -11.429)" fill="#90a4ae"><path d="M7.026 8.63v4.474l1.928-1.928a.437.437 0 0 0 0-.619zM9.38 16.072v-4.474l-1.927 1.927a.437.437 0 0 0 0 .62zM18.576 10.412l-5.346.564-.017.018 2.39 2.39zM9.922 8.502s.023 3.304-.003 4.452c-.02.856.371 1.114.746 1.507.538.564 1.599 1.57 1.599 1.57a.53.53 0 0 0 .75 0l1.843-1.844a.53.53 0 0 0 0-.75z"/></g></symbol><symbol viewBox="0 0 24 24" id="kl" xmlns="http://www.w3.org/2000/svg"><defs><style>.a{fill:#3aaae1}.b{fill:#fdfeff}</style></defs><title>kl</title><path d="M12.033 1.737c-.25-.003-.5.11-.729.337C8.225 5.15 5.15 8.227 2.078 11.31c-.144.144-.229.346-.341.521v.41c.16.223.294.474.485.666a3259.51 3259.51 0 0 0 8.936 8.937c.193.192.443.325.666.486h.41c.205-.142.436-.256.609-.428 3.046-3.041 6.09-6.083 9.133-9.127.47-.47.472-1.005.006-1.472l-9.218-9.217c-.23-.23-.48-.347-.731-.35zm-1.062 4.545l1.386.832c.702.422 1.403.846 2.109 1.262a.544.544 0 0 1 .04.026l.016.013.017.013c.061.056.089.123.088.224a510.281 510.281 0 0 0 0 3.794.463.463 0 0 1-.007.094c-.015.069-.054.103-.142.109a.464.464 0 0 1-.044.002c-.045-.002-.09-.002-.136-.003-.323-.006-.648-.001-.998-.001v-.527-1.34-.671-.003l.004-.668c0-.147-.039-.231-.17-.308-.893-.528-1.78-1.066-2.67-1.6-.051-.03-.101-.065-.173-.111l.001-.003h-.001zm.362 3.39c.068-.003.119.043.173.138.085.148.174.293.264.44l.015.025c.096.154.194.31.292.47l-1.915 1.176c-.337.207-.673.417-1.014.617-.113.067-.154.143-.154.277.01.977.01 1.955.014 2.932V16H7.7V16h-.002c-.004-.053-.014-.112-.014-.17-.005-1.25-.006-2.501-.015-3.751 0-.142.045-.222.164-.294a467.13 467.13 0 0 0 3.353-2.054l.016-.01a.606.606 0 0 1 .032-.017l.016-.008a.308.308 0 0 1 .033-.013l.012-.004a.157.157 0 0 1 .028-.005l.01-.001zm5.677 3.126l.314.54.346.594v.001c-.158.094-.298.178-.438.259l-3.097 1.798c-.106.062-.189.071-.3.01l-.893-.496-1.524-.843-.895-.493c-.035-.02-.068-.044-.129-.085h.001l.137-.25.495-.902 1.446.795c.442.243.886.483 1.323.734.121.07.212.072.334 0 .894-.525 1.792-1.043 2.689-1.563.057-.034.118-.061.191-.1z" fill="#29b6f6" stroke-width=".041"/></symbol><symbol viewBox="0 0 500 500" id="kotlin" xmlns="http://www.w3.org/2000/svg"><path d="M500 500H0V0h500L250 250z" fill="#7F52FF"></path></symbol><symbol viewBox="0 0 240 240" id="laravel" xmlns="http://www.w3.org/2000/svg"><path d="M216.05 119.036c-1.433.343-24.945 6.673-24.945 6.673l-19.227-28.622c-.537-.828-.99-1.656.359-1.849 1.345-.196 23.195-4.477 24.182-4.723.99-.245 1.837-.536 3.053 1.267 1.21 1.8 17.836 24.626 18.464 25.506.627.877-.447 1.41-1.883 1.748m-4.101 49.326c.588 1.003 1.176 1.64-.67 2.367-1.843.73-62.243 22.847-63.418 23.39-1.173.546-2.092.73-3.607-1.637-1.51-2.362-21.16-39.264-21.16-39.264l64.03-18.075c1.876-.644 2.317-.405 3.103.822 1.074 1.68 21.143 31.403 21.726 32.4m-103.7-21.087c-.78.202-37.566 9.733-39.525 10.22-1.965.485-1.965.246-2.188-.49-.226-.727-43.728-98.053-44.333-99.271-.605-1.214-.574-2.177 0-2.177.571 0 34.734-3.313 35.944-3.383 1.207-.07 1.08.205 1.526 1.033l49.025 91.818c.84 1.58 1.239 1.81-.452 2.248m94.588-59.77c-3.5-4.58-5.2-3.751-7.357-3.41-2.154.336-27.277 4.915-30.194 5.449-2.918.536-4.758 1.803-2.963 4.53 1.597 2.422 18.113 27.824 21.751 33.42l-65.663 17.066L66.18 49.832c-2.075-3.342-2.507-4.514-7.236-4.28-4.735.23-40.969 3.495-43.55 3.731-2.58.233-5.416 1.479-2.835 8.09 2.583 6.612 43.734 102.82 44.88 105.62 1.149 2.803 4.128 7.345 11.11 5.527 7.157-1.871 31.969-8.894 45.52-12.742 7.163 14.07 21.77 42.619 24.473 46.707 3.607 5.459 6.089 4.56 11.626 2.738 4.325-1.42 67.65-26.129 70.502-27.4 2.855-1.273 4.613-2.184 2.685-5.275-1.419-2.28-18.124-26.558-26.876-39.26 5.993-1.733 27.305-7.888 29.575-8.557 2.646-.779 3.008-2.19 1.572-3.94-1.436-1.755-21.293-28.72-24.79-33.296z" fill="#ff5722" stroke="#ff5722" stroke-width="8.852" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" id="less" xmlns="http://www.w3.org/2000/svg"><path d="M13.696 2.999V5h2.002v5a2 2 0 0 0 1.999 2 2 2 0 0 0-2 2v5h-2v2h2a2 2 0 0 0 2-2v-4a2 2 0 0 1 2-2h1V11h-1a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2.001zm-.03 12.766v.47a1 1 0 0 0 .03-.236 1 1 0 0 0-.03-.234zM10.566 21v-2.001H8.565v-5a2 2 0 0 0-2-2 2 2 0 0 0 2-2V5h2.001v-2H8.565a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-.999V13h1a2 2 0 0 1 2 2v3.999A2 2 0 0 0 8.564 21zm.03-12.766v-.47a1 1 0 0 0-.03.236 1 1 0 0 0 .03.234z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="lib" xmlns="http://www.w3.org/2000/svg"><path d="M19 7H9V5h10m-4 10H9v-2h6m4-2H9V9h10m1-7H8a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2M4 6H2v14a2 2 0 0 0 2 2h14v-2H4V6z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 40 40" id="livescript" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -257)" fill="#317eac"><path stroke-width="3.299" d="M5.419 260.18h3.685v34.207H5.419z"/><path stroke-width="3.299" d="M37.074 288.197v3.685H2.867v-3.685z"/><path stroke-width="2.894" d="M29.612 265.658l2.004 2.005L7.428 291.85l-2.004-2.005z"/><path stroke-width="2.325" d="M10.73 262.471h2.835v22.08H10.73z"/><path stroke-width="2.063" d="M15.36 262.519h2.835v17.382H15.36z"/><path stroke-width="1.77" d="M19.99 262.471h2.835v12.802H19.99z"/><path stroke-width="1.422" d="M24.526 262.491h2.835v8.254h-2.835z"/><path stroke-width="1.128" d="M28.783 262.463h2.835v5.197h-2.835z"/><path stroke-width="2.325" d="M34.801 286.545v-2.835h-22.08v2.835z"/><path stroke-width="2.063" d="M34.753 281.914v-2.835H17.371v2.835z"/><path stroke-width="1.77" d="M34.801 277.284v-2.835H21.999v2.835z"/><path stroke-width="1.422" d="M34.781 272.749v-2.835h-8.254v2.835z"/><path stroke-width="1.128" d="M34.809 268.492v-2.835h-5.197v2.835z"/></g></symbol><symbol viewBox="0 0 24 24" id="lock" xmlns="http://www.w3.org/2000/svg"><path d="M12 17a2 2 0 0 0 2-2 2 2 0 0 0-2-2 2 2 0 0 0-2 2 2 2 0 0 0 2 2m6-9a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h1V6a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h1m-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3z" fill="#ffd54f"/></symbol><symbol viewBox="0 0 24 24" id="lua" xmlns="http://www.w3.org/2000/svg"><circle cx="12.203" cy="12.102" r="10.322" fill="none" stroke="#42a5f5"/><path d="M12.33 5.746a6.483 6.381 0 0 0-6.482 6.381 6.483 6.381 0 0 0 6.482 6.38 6.483 6.381 0 0 0 6.484-6.38 6.483 6.381 0 0 0-6.484-6.38zm1.86 1.916a2.329 2.292 0 0 1 2.33 2.293 2.329 2.292 0 0 1-2.33 2.291 2.329 2.292 0 0 1-2.329-2.29 2.329 2.292 0 0 1 2.328-2.294z" fill="#42a5f5" fill-rule="evenodd"/><ellipse cy="4.615" cx="19.631" rx="2.329" ry="2.292" fill="#42a5f5" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 24 24" id="markdown" xmlns="http://www.w3.org/2000/svg"><path d="M2 16V8h2l3 3 3-3h2v8h-2v-5.17l-3 3-3-3V16H2m14-8h3v4h2.5l-4 4.5-4-4.5H16V8z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" preserveAspectRatio="xMidYMid" id="markojs" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -120.96)" stroke-width=".984"><path d="M4.002 126.482c-.655 1.07-1.32 2.14-1.976 3.21-.655 1.06-1.308 2.142-1.963 3.212l.002.002-.002.002c.655 1.07 1.308 2.15 1.963 3.211.655 1.07 1.32 2.141 1.976 3.211h3.33c-.664-1.07-1.318-2.14-1.974-3.21-.653-1.069-1.307-2.145-1.961-3.214.654-1.068 1.308-2.146 1.961-3.215a601.93 601.93 0 0 1 1.974-3.209z" fill="#2196f3"/><path d="M3.999 126.482l-.002.002c.655 1.07 1.31 2.15 1.964 3.212.655 1.07 1.32 2.14 1.974 3.21h3.331c-.664-1.07-1.319-2.14-1.974-3.21-.653-1.068-1.306-2.146-1.96-3.214z" fill="#26a69a"/><path d="M15.203 126.482l.002.002c-.655 1.07-1.31 2.15-1.965 3.212-.655 1.07-1.319 2.14-1.974 3.21h-3.33c.664-1.07 1.318-2.14 1.973-3.21.654-1.069 1.307-2.146 1.961-3.214z" fill="#8bc34a"/><path d="M11.874 126.484c.664 1.07 1.318 2.14 1.974 3.21.653 1.068 1.307 2.146 1.961 3.214-.654 1.069-1.308 2.145-1.961 3.213-.656 1.07-1.31 2.14-1.974 3.21h3.33c.655-1.07 1.319-2.14 1.974-3.21.655-1.06 1.31-2.14 1.966-3.21l-.002-.003.002-.002c-.656-1.07-1.311-2.152-1.966-3.213-.655-1.07-1.319-2.138-1.974-3.209z" fill="#ffc107"/><path d="M16.74 126.482c.665 1.07 1.319 2.14 1.974 3.21.654 1.068 1.306 2.146 1.96 3.214-.654 1.069-1.306 2.145-1.96 3.213-.655 1.07-1.31 2.141-1.974 3.211h3.33c.656-1.07 1.32-2.14 1.974-3.21.655-1.062 1.31-2.141 1.966-3.212l-.002-.002.002-.002c-.655-1.07-1.31-2.152-1.966-3.213-.655-1.07-1.318-2.138-1.973-3.209z" fill="#f44336"/></g></symbol><symbol viewBox="0 0 23 24" id="mathematica" xmlns="http://www.w3.org/2000/svg"><path d="M11.512 1.523l-.073.025-.46.794-.454.763-1.217 2.09H9.29L5.435 3.5l-.1-.047h-.018v.092l.025.163v.086l.132 1.226v.082l.032.252v.082l.22 2.137v.075l.018.082v.06l-2.348.507-.04.015-.457.1-.025.01h-.042l-1.096.244-.04.007-.17.036v.082l.018.01 1.859 2.086.053.052.114.132.804.909v.005l-.053.05-.22.257-2.564 2.875-.01.007v.082l.071.006.295.075 1.697.366v.006l2.139.472h.015v.047l-.036.252v.08l-.046.412v.082l-.036.244v.082l-.045.412v.08l-.05.41v.08l-.036.244v.082l-.046.412v.082l-.05.407v.082l-.032.248V20l-.05.407v.104h.037l3.642-1.6.294-.134h.018l.177.312.539.911.015.032.854 1.465.16.262.404.695.007.022h.092l.005-.022.017-.025.56-.947.014-.042.6-1.033.316-.539.644-1.091.05.013 3.906 1.721h.035v-.085l-.138-1.32v-.082l-.032-.244v-.082l-.035-.245v-.085l-.033-.244v-.081l-.032-.245v-.082l-.032-.244v-.085l-.035-.245v-.082l-.032-.245v-.082l-.033-.244v-.085l-.025-.17v-.053l1.632-.354.043-.008.458-.107h.028v-.01l.23-.05.03-.01h.042l.382-.09.025-.01h.043l.194-.05h.033l1.015-.23.07-.007v-.064l-.015-.013-1.19-1.342-.028-.028-.197-.22-1.428-1.604v-.006l.295-.323.4-.457 2.148-2.408.015-.01v-.065l-.035-.008-1.288-.28-.372-.084-.047-.01-2.481-.544v-.045l.432-4.265v-.02h-.042l-.302.135-.01.014h-.025l-3.307 1.45-.297.135h-.015l-2.028-3.483-.099-.145-.014-.045zm-.001 1.114l1.365 2.323.34.592-.008.025-1.18 1.511-.517.66-.012-.01-.258-.335-.04-.05-1.397-1.787.03-.063 1.378-2.365.287-.491zm4.908 2.039l-.007.025-.168.225-.538.066zm-9.817.004l.053.02.677.3h-.499l-.224-.3zM16.947 5l-.123 1.248-.113-.928.226-.307zm-9.26.156l.053.024.705.309-.757-.175zm7.388.116l.02.168-1.318.403.003-.003.16-.071 1.015-.444zM9.669 6.388l.944 1.204v.01L9.483 7.2zm3.55.172l.21.682-.234.084-.089.022-.702.255.008-.022.776-.982zm-5 .836l.986.356.898.312.048.02 1.054.373.011 3.086-.362-.117-.67-.224-.081-.038-.735-.245-.77-.256-.29-.1-.011-.255-.032-1.195-.01-.287-.015-.894-.013-.297zm6.583 0l-.011.227-.028.9-.008.303-.032 1.475-.01.262-.337.117-.734.245-.77.256-.712.245-.355.117.01-3.086 1.632-.578zm.585.437l.09.735.79-.097-.915 1.302-.018.006.01-.183.018-.877zm-9.451.536l.152.22 1.447 2.049-2.607.968-.05.015-1.972-2.214-.28-.312.003-.01.115-.018.424-.1.14-.021.337-.078.042-.01zm11.146.003l3.284.713.029.01-.022.025-1.954 2.192-.277.312-.092-.036-2.564-.95.475-.681.152-.216zM6.787 8.52h.86l.036 1.258-.013-.006-.763-1.078zm1.358 2.625l.152.06.77.252.712.245.746.247.49.167-.065.092-1.723 2.334-1.015-.302-.082-.017-.035-.015-1.902-.56.938-1.22.981-1.277zm6.73 0l.033.006 1.787 2.327.132.17-.128.036-.032.014-2.196.642-.105.032-.564.17-.018-.003-1.053-1.44-.174-.239-.547-.726-.007-.018.469-.16.769-.254.713-.245.77-.252zm-7.766.305l-.007.02-.405.523-.291-.291.657-.245zm8.802 0l.043.007.578.212.714.27-.661.394-.375-.479-.03-.042-.262-.342zm-10.843.75l-.67.668.355-.397.207-.23zm12.911.016l.068.025.045.042.554.627.042.043.204.228-.255.135zm-6.473.265l.022.015 1.38 1.872.032.05.343.465.008.031-.088.117-.422.629-.047.074-.245.343-.97 1.43-.013.007-1.18-1.72-.096-.16-.493-.708-.008-.037 1.618-2.191.007-.01zm7.827 1.194l.565.633.063.082-.272-.093-.037-.013zm-15.785.148l.297.299-.637.218-.152.05.038-.058zm13.224.47l-.855.448.346.66-.185-.058-.27-.088-1.092-.348.012-.01zm-9.687.255l1.222.356-.006.007-.458.145-.443.135-.032.01-.49.157zm-2.765.048l.318.32 2.007.517-.567.18-.055.004-2.103-.469-.744-.156.007-.006zm14.966.205l.548.188v.003l-.457.1-.043.014-1.069.23zm-10.23.507l.007.227.01.347.025 1.363.025.691-.007.255-.24.107-2.863 1.255.032-.372.033-.255.017-.227.031-.256.037-.407.045-.42.018-.23.032-.251.032-.412.05-.414.013-.14 1.455-.457.003-.014.301-.098zm4.908 0l1.245.39v.014l.312.1 1.146.362.022.23.03.255.043.408.04.42.017.23.033.251.032.412.042.325.078.848-.078-.04-3.025-1.322-.004-.305.06-2.368zm-4.295.617l.015.007.067.107.6.875-.64.531-.034-1.438zm3.671 0h.008l-.005.06-.02.678-.005.214-.479-.223zm-2.888 3.605l.763.915.001.37-.017-.006-.025-.05-.464-.791-.012-.018zm1.53.61l.184.083-.343.586-.018.007.002-.532z" fill="#f44336" fill-rule="evenodd" stroke="#f44336" stroke-width=".7747499999999999" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 720 720" id="matlab" xmlns="http://www.w3.org/2000/svg"><title>Layer 1</title><path d="M209.247 329.98L52.368 387.638l121.325 85.822 96.752-95.804-61.198-47.674z" fill="#4db6ac" fill-rule="evenodd" stroke-width=".3"/><path d="M480.193 71.446c-13.123 1.784-9.565 1.013-28.4 16.09-18.008 14.418-69.925 100.347-97.673 129.256-24.688 25.722-34.46 12.199-60.102 33.661-25.68 21.494-65.273 64.464-65.273 64.464l63.978 47.32L394.15 222.754c23.948-32.932 23.694-37.266 36.744-71.82 6.384-16.907 17.76-29.9 27.756-45.809 12.488-19.874 30.186-34.855 21.543-33.68z" fill="#00897b" fill-rule="evenodd" stroke-width=".3"/><path d="M478.206 69.796c-31.268-.189-62.068 137.245-115.56 242.691-54.543 107.519-162.235 176.82-162.235 176.82 18.156 8.243 34.681 4.91 54.236 23.394 13.375 16.164 52.09 95.976 75.174 146.117 0 0 18.964-10.297 42.994-27.695 24.03-17.397 53.124-41.896 73.384-70.3 26.883-37.692 47.897-61.043 65.703-75.271 17.806-14.23 32.404-19.336 46.458-20.54 50.238-4.305 124.582 85.792 124.582 85.792S527.267 70.09 478.206 69.796z" fill="#ffb74d" fill-rule="evenodd" stroke-width=".3"/></symbol><symbol viewBox="0 0 24 24" id="merlin" xmlns="http://www.w3.org/2000/svg"><text style="line-height:1.25;-inkscape-font-specification:'Century Gothic Bold'" x="1.953" y="21.178" transform="scale(.99582 1.0042)" font-weight="700" font-size="30.255" font-family="Century Gothic" letter-spacing="0" word-spacing="0" fill="#42a5f5" stroke-width=".756"><tspan x="1.953" y="21.178" style="-inkscape-font-specification:'Century Gothic Bold'" font-size="22.745">M</tspan></text></symbol><symbol viewBox="0 0 192 191.99999" id="mocha" xmlns="http://www.w3.org/2000/svg"><title>Mocha Logo</title><g transform="translate(-354.75 -262.42) scale(4.835)" fill="#a1887f"><path d="M103.6 69.6c0-.5-.4-1-1-1H83.8c-.5 0-1 .4-1 1 0 3.4.5 15.1 5.5 20.8.2.2.4.3.7.3h8.4c.3 0 .5-.1.7-.3 5-5.6 5.5-17.3 5.5-20.8zm-7.4 18.2h-5.9c-.3 0-.5-.1-.7-.3-3.4-4-3.8-12-3.9-14.8 0-.5.4-1 1-1h13.2c.5 0 1 .4 1 1 0 2.8-.5 10.7-3.9 14.8-.3.2-.5.3-.8.3zM95.1 66.6s3.6-2.1 1.4-5.9c-1.3-2-1.9-3.7-1.4-4.4-1.3 1.6-3.5 3.3-1.1 6.9.8.9 1.2 2.8 1.1 3.4zM91.1 66.9s2.4-1.4.9-4c-.9-1.3-1.3-2.5-.9-2.9-.9 1.1-2.3 2.2-.7 4.7.5.5.7 1.8.7 2.2z"/><path d="M99.3 78.5c-.4 2.7-1.2 5.8-2.9 7.8-.2.2-.4.3-.6.3h-5c-.2 0-.5-.1-.6-.3-1.2-1.5-2-3.5-2.5-5.6 0 0 5.8.8 9.1-.4 2.4-.9 2.5-1.8 2.5-1.8z"/></g></symbol><symbol viewBox="0 0 24 24" id="movie" xmlns="http://www.w3.org/2000/svg"><path d="M18 4l2 4h-3l-2-4h-2l2 4h-3l-2-4H8l2 4H7L5 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V4h-4z" fill="#ff9800"/></symbol><symbol viewBox="0 0 24 24" id="music" xmlns="http://www.w3.org/2000/svg"><path d="M16 9V7h-4v5.5c-.42-.31-.93-.5-1.5-.5A2.5 2.5 0 0 0 8 14.5a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5V9h3m-4-7a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2z" fill="#ef5350"/></symbol><symbol viewBox="0 0 24 24" id="mxml" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m.12 13.5l3.74 3.74 1.42-1.41-2.33-2.33 2.33-2.33-1.42-1.41-3.74 3.74m11.16 0l-3.74-3.74-1.42 1.41 2.33 2.33-2.33 2.33 1.42 1.41 3.74-3.74z" fill="#ffa726"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-actions" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#ab47bc" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-effects" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#26c6da" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-reducer" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#e53935" stroke-width="12.914"/></symbol><symbol viewBox="0 0 300 300" id="ngrx-state" xmlns="http://www.w3.org/2000/svg"><path d="M150 27.324L35.85 68.006l17.303 151.09 96.843 53.586 96.843-53.586 17.303-151.09zm-23.719 38.349c4.346-.075 9.04 1.316 14.265 4.131 2.3 1.24 9.235 2.994 15.407 3.889 21.936 3.18 47.975 19.934 56.21 36.186 5.667 11.183 4.508 17.209-4.18 21.702-7.492 3.874-22.822 2-45.08-5.517l-18.785-6.343-6.683 2.552c-9.683 3.698-19.366 12.877-23.33 22.09-2.858 6.645-3.293 9.768-2.77 20.705.523 10.955 1.315 14.12 5.2 20.997 4.423 7.829 14.576 17.818 16.331 16.064.473-.473-.574-3.648-2.308-7.048-1.735-3.4-2.744-6.825-2.26-7.606.482-.781 5.054 2.123 10.157 6.44 11.35 9.6 24.608 15.74 36.77 17.01 9.985 1.045 12.266-.814 4.787-3.912-2.41-.998-5.544-3.088-6.95-4.641-2.907-3.212-3.072-3.12 9.356-5.906 7.736-1.733 23.026-9.849 23.937-12.71.29-.91-2.195-1.296-6.27-.972-3.706.295-6.732-.087-6.732-.85 0-.76 3.032-4.523 6.732-8.385 13.883-14.489 18.62-25.32 20.098-45.906l1.02-14.217 3.257 6.756c3.601 7.452 4.265 18.202 1.701 27.437-2.141 7.711-.712 8.564 3.208 1.92 4.845-8.212 6.39-6.905 5.54 4.666-.924 12.587-5.243 22.017-14.993 32.686-7.95 8.699-7.001 10.254 2.624 4.326 9.273-5.711 10.511-4.815 5.736 4.155-9.031 16.964-28.122 31.35-47.948 36.161-12.016 2.917-20.537 3.461-31.544 2.018-28.78-3.775-56.001-23.157-68.993-49.114-3.378-6.748-8.154-14.994-10.62-18.348-5.092-6.924-5.529-10.038-2.09-15.286 1.715-2.618 2.116-5.307 1.41-9.308-3.273-18.531-3.167-19.11 4.276-26.659 6.468-6.56 6.878-7.44 6.878-15.092 0-6.637.671-8.813 3.67-11.811 2.02-2.02 5.23-3.7 7.12-3.718 5.49-.05 14.97-5.135 20.584-11.033 4.687-4.927 9.674-7.417 15.262-7.51z" fill="#9ccc65" stroke-width="12.914"/></symbol><symbol viewBox="0 0 24 24" id="nim" xmlns="http://www.w3.org/2000/svg"><path d="M4.464 15.75L2.288 3.78l5.985 7.617L12.08 3.78l3.809 7.617 5.985-7.617-2.177 11.97H4.464m15.234 3.264a1.088 1.088 0 0 1-1.088 1.088H5.553a1.088 1.088 0 0 1-1.089-1.088v-1.089h15.234z" stroke-width="1.088" fill="#ffca28"/></symbol><symbol viewBox="0 0 500 500" id="nix" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-1.965 36.302)" stroke-width=".395"><path d="M135.59 415.7c0-.295-2.752-5.283-6.116-11.084-3.364-5.801-6.116-10.776-6.116-11.055s9.514-16.889 21.143-36.912c11.629-20.022 21.323-36.798 21.542-37.279.346-.76-1.608-4.363-14.896-27.466-8.412-14.625-15.294-26.785-15.294-27.023 0-.5 24.46-43.501 25.206-44.31.414-.45.592-.384 1.078.395.32.513 16.876 29.256 36.791 63.87 62.62 108.85 74.852 130.01 75.41 130.46.3.242.544.554.544.694 0 .14-11.836.21-26.302.154-23.023-.09-26.313-.175-26.393-.694-.11-.714-27.662-48.825-28.86-50.392-.746-.978-.906-1.035-1.426-.51-.688.696-28.954 49.323-29.49 50.733l-.365.96h-13.229c-10.896 0-13.229-.095-13.229-.538zm167.58-125.61c-.134-.216 1.188-2.863 2.938-5.882 6.924-11.944 84.291-145.75 96.491-166.88 7.143-12.371 13.142-22.465 13.333-22.433.363.062 25.861 43.105 25.861 43.655 0 .174-6.761 11.952-15.026 26.173-8.46 14.557-14.932 26.104-14.81 26.421.185.483 4.564.564 30.213.564h29.996l.958 1.48c.526.814 3.296 5.547 6.155 10.518 2.859 4.971 5.45 9.29 5.756 9.597.706.705.704.724-.16 1.572-.395.388-3.36 5.323-6.587 10.965-3.228 5.643-6.056 10.387-6.285 10.543-.23.156-19.695.171-43.256.034l-42.84-.249-.804 1.15c-.441.632-7.504 12.736-15.696 26.897l-14.892 25.747H339.03c-8.517 0-20.015.116-25.55.259-6.55.168-10.15.121-10.309-.135zM169.42 132.23c-56.373-.055-102.5-.182-102.5-.282 0-.1 5.617-10.132 12.481-22.294l12.481-22.112h30.332c27.113 0 30.332-.065 30.332-.611 0-.336-6.659-12.228-14.797-26.427-8.139-14.199-14.797-25.917-14.797-26.04 0-.123 2.682-4.853 5.96-10.51s6.003-10.578 6.055-10.934c.086-.586 1.376-.648 13.572-.648 7.413 0 13.463.143 13.446.317-.017.174.222.707.531 1.184.31.476 9.763 16.937 21.007 36.578 11.244 19.64 20.71 36.022 21.036 36.4.554.647 2.549.691 31.428.691h30.837l12.896 22.145c7.093 12.18 12.8 22.301 12.682 22.492-.118.19-4.776.303-10.352.249-5.575-.054-56.26-.143-112.63-.198z" fill="#5075c1"/><path d="M25.289 203.14c-6.098 10.563-6.69 11.711-6.225 12.078.283.224 3.18 5.044 6.44 10.712 3.261 5.668 6.017 10.355 6.124 10.417.106.061 13.585.153 29.95.204 16.367.052 29.994.23 30.285.399.472.273-1.08 3.094-14.637 26.574L62.06 289.793l12.907 21.865c7.1 12.026 12.982 21.906 13.068 21.956.086.05 23.257-39.831 51.492-88.624 11.352-19.617 21.214-36.64 30.37-52.442 23.308-40.452 30.68-53.468 30.73-54.132-1.097-.11-6.141-.187-13.006-.216-3.945-.01-7.82-.02-12.75-.002l-25.341.092-15.42 26.706c-14.256 24.693-15.445 26.663-16.278 26.86l-.024.037c-.011.003-1.62-.001-1.825 0-4.29.062-20.453.063-40.226-.01-22.632-.082-41.615-.125-42.183-.096-.568.03-1.147-.03-1.29-.132-.142-.102-3.29 5.066-6.996 11.485zm205.16-190.3c-.123.149 5.62 10.392 12.761 22.763 12.199 21.131 89.393 155.03 96.276 167 1.502 2.613 2.92 4.803 3.443 5.348.9-1.249 3.531-5.63 7.954-13.219a1342.88 1342.88 0 0 1 10.049-17.76l6.606-11.443c.692-1.403.754-1.818.653-2.117-.162-.48-6.904-12.332-14.982-26.337-8.078-14.005-14.824-25.849-14.991-26.32a.73.73 0 0 1-.009-.366l-.426-.913L359.42 72.5c3.69-6.307 6.425-11.042 9.47-16.29 9.159-15.948 12.037-21.189 11.896-21.55-.126-.324-2.7-4.83-5.72-10.017-3.021-5.185-5.845-10.148-6.275-11.026-.483-.987-.734-1.364-1.1-1.456-.054.014-.083.018-.145.035-.42.112-5.454.195-11.189.185-5.734-.01-11.22.024-12.188.073l-1.76.089-14.997 25.978c-12.824 22.212-15.084 25.964-15.595 25.883-.024-.004-.15-.189-.235-.301-.109.066-.2.09-.272.05-.255-.148-7.143-11.902-15.306-26.119l-14.36-25.016c-.115-.186-.444-.744-.457-.752-.477-.275-50.502.287-50.737.57zm-18.646 283.09c-.047.109-.026.262.042.48.329 1.05 25.338 43.735 25.772 43.985.207.119 14.178.239 31.05.266 26.651.044 30.75.152 31.234.832.308.43 9.988 17.214 21.513 37.296s21.152 36.627 21.394 36.767c.242.14 5.927.243 12.633.23 6.706-.013 12.401.099 12.657.246.132.076.382-.141.852-.795l6.008-10.406c5.234-9.065 6.62-11.684 6.294-11.888-.575-.36-15.597-26.643-23.859-41.482-3.09-5.45-5.37-9.516-5.441-9.774-.195-.712-.065-.822 1.156-.98 1.956-.252 57.397-.057 58.07.205.238.092.79-.569 2.594-3.497 1.866-3.067 5.03-8.524 11-18.866 7.22-12.505 13.044-22.784 12.942-22.843-.102-.059-.771-.051-1.489.016l-.046.001c-4.452.204-33.918.203-149.74.025-38.96-.06-69.786-.09-71.912-.072-1.121.01-2.095.076-2.66.172a.25.25 0 0 0-.062.083z" fill="#7db7e1"/></g></symbol><symbol viewBox="0 0 24 24" id="nodejs" xmlns="http://www.w3.org/2000/svg"><path d="M12 1.85c-.27 0-.55.07-.78.2l-7.44 4.3c-.48.28-.78.8-.78 1.36v8.58c0 .56.3 1.08.78 1.36l1.95 1.12c.95.46 1.27.47 1.71.47 1.4 0 2.21-.85 2.21-2.33V8.44c0-.12-.1-.22-.22-.22H8.5c-.13 0-.23.1-.23.22v8.47c0 .66-.68 1.31-1.77.76L4.45 16.5a.26.26 0 0 1-.11-.21V7.71c0-.09.04-.17.11-.21l7.44-4.29c.06-.04.16-.04.22 0l7.44 4.29c.07.04.11.12.11.21v8.58c0 .08-.04.16-.11.21l-7.44 4.29c-.06.04-.16.04-.23 0L10 19.65c-.08-.03-.16-.04-.21-.01-.53.3-.63.36-1.12.51-.12.04-.31.11.07.32l2.48 1.47c.24.14.5.21.78.21s.54-.07.78-.21l7.44-4.29c.48-.28.78-.8.78-1.36V7.71c0-.56-.3-1.08-.78-1.36l-7.44-4.3c-.23-.13-.5-.2-.78-.2M14 8c-2.12 0-3.39.89-3.39 2.39 0 1.61 1.26 2.08 3.3 2.28 2.43.24 2.62.6 2.62 1.08 0 .83-.67 1.18-2.23 1.18-1.98 0-2.4-.49-2.55-1.47a.226.226 0 0 0-.22-.18h-.96c-.12 0-.21.09-.21.22 0 1.24.68 2.74 3.94 2.74 2.35 0 3.7-.93 3.7-2.55 0-1.61-1.08-2.03-3.37-2.34-2.31-.3-2.54-.46-2.54-1 0-.45.2-1.05 1.91-1.05 1.5 0 2.09.33 2.32 1.36.02.1.11.17.21.17h.97c.05 0 .11-.02.15-.07.04-.04.07-.1.05-.16C17.56 8.82 16.38 8 14 8z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 300 300" id="nodemon" xmlns="http://www.w3.org/2000/svg"><title>nodemon</title><path d="M149.868 20.62c-2.124 0-4.25.55-6.154 1.648L41.899 81.083a12.306 12.306 0 0 0-6.15 10.652v117.633a12.29 12.29 0 0 0 6.152 10.646l101.815 58.766h.001a12.282 12.282 0 0 0 12.291 0l101.84-58.766a12.29 12.29 0 0 0 6.153-10.652V91.738a12.31 12.31 0 0 0-6.146-10.652L156.015 22.27a12.302 12.302 0 0 0-6.153-1.648zM83.303 70.93s11.789 33.031 35.477 31.934l27.74-15.961a7.348 7.348 0 0 1 3.414-.99h.641a7.233 7.233 0 0 1 3.404.99l27.738 15.961c23.69 1.094 35.475-31.934 35.475-31.934 5.233 23.154 1.06 38.641-5.924 48.942l4.541 2.614h.002c2.321 1.327 3.734 3.795 3.737 6.49l-.12 95.811a3.724 3.724 0 0 1-1.855 3.227 3.624 3.624 0 0 1-3.735 0L177.1 206.971c-2.311-1.363-3.742-3.818-3.742-6.48v-44.763a7.44 7.44 0 0 0-3.737-6.465l-15.642-9.01a7.28 7.28 0 0 0-3.715-1.01 7.378 7.378 0 0 0-3.742 1.01l-15.648 9.01c-2.316 1.323-3.729 3.798-3.729 6.467v44.762c0 2.663-1.413 5.1-3.738 6.48l-36.748 21.041a3.571 3.571 0 0 1-3.71 0c-1.173-.65-1.864-1.887-1.864-3.224l-.137-95.812a7.483 7.483 0 0 1 3.74-6.49l4.541-2.615c-6.982-10.302-11.16-25.79-5.925-48.942z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 990 990" id="npm" xmlns="http://www.w3.org/2000/svg"><defs><style>.hncls-1{fill:#cb3837}.cls-2{fill:#fff}</style></defs><title>n</title><path class="hncls-1" d="M113.26 876.74V113.27h763.47v763.47zm143.59-620.4v476.18h240.61V355.63h140.21v376.96h95.457V256.34z" fill="#e53935" stroke-width=".771"/></symbol><symbol id="nunjucks" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.host0{fill:#388e3c}</style><path class="host0" d="M11.2 21.1H8.1l-2.3-7.9v7.9H2.7V2.9h3.1l2.3 7.4V2.9h3.1zM21.3 19.2c0 1-.8 1.9-1.9 1.9h-4.8c-1 0-1.9-.8-1.9-1.9v-3.8l3.2-.7V18h2.3V7.2h3.1v12z"/></symbol><symbol viewBox="0 0 150 150.00001" id="ocaml" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.76136 0 0 .76136 11.616 19.98)"><path d="M83.02 101.645l.023-.062c-.035-.159-.047-.195-.024.062z" fill="none" stroke-width="1.028"/><linearGradient id="hpa" gradientUnits="userSpaceOnUse" x1="-696.735" y1="97.7" x2="-696.735" y2="142.997" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M82.313 138.79c-.471-1.004-1.904-3.621-2.624-4.46-1.562-1.828-1.927-1.966-2.386-4.275-.799-4.02-2.913-11.31-5.405-16.341-1.286-2.596-3.426-4.777-5.385-6.66-1.71-1.652-5.565-4.431-6.237-4.294-6.296 1.257-8.249 7.432-11.21 12.323-1.638 2.705-3.374 5.007-4.665 7.885-1.192 2.646-1.087 5.577-3.128 7.849-2.093 2.333-3.454 4.814-4.48 7.829-.194.574-.747 6.596-1.348 8.015l9.357-.659c8.719.594 6.2 3.936 19.81 3.208l21.487-.665c-.666-1.97-1.584-4.25-1.938-4.991-.599-1.248-1.352-3.69-1.848-4.763z" fill="url(#hpa)" stroke-width="1.028"/><linearGradient id="hpb" gradientUnits="userSpaceOnUse" x1="-666.972" y1="142.12" x2="-666.972" y2="142.12" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><linearGradient id="hpc" gradientUnits="userSpaceOnUse" x1="-675.228" y1="-1.28" x2="-675.228" y2="142.967" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M109.553 94.296c-1.652 1.193-4.88 4.06-11.902 5.145-3.152.487-6.1.527-9.335.365-1.584-.076-3.077-.157-4.665-.177-.936-.008-4.074-.107-3.919.193l-.349.871c.054.287.169 1.004.2 1.177.129.704.165 1.265.192 1.912.048 1.331-.11 2.719-.043 4.062.141 2.787 1.175 5.326 1.306 8.137.143 3.13 1.69 6.442 3.188 8.998.569.973 1.434 1.084 1.811 2.283.442 1.373.024 2.83.239 4.293.842 5.675 2.477 11.606 5.032 16.728.018.043.038.09.06.128 3.156-.53 6.318-1.665 10.418-2.271 7.517-1.115 17.972-.54 24.688-1.17 16.993-1.597 26.216 6.97 41.478 3.459V22.459c0-11.84-9.594-21.438-21.435-21.438H19.239C7.4 1.021-2.197 10.62-2.197 22.458v46.774c3.067-1.11 7.479-7.635 8.861-9.222 2.419-2.775 2.858-6.315 4.062-8.544 2.743-5.078 3.215-8.57 9.451-8.57 2.907 0 4.061.67 6.027 3.31 1.368 1.834 3.731 5.224 4.837 7.49 1.277 2.615 3.357 6.153 4.272 6.867.677.53 1.35.928 1.976 1.163 1.012.38 1.848-.316 2.525-.855.863-.687 1.235-2.088 2.035-3.957 1.152-2.696 2.408-5.926 3.122-7.054 1.237-1.949 1.658-4.261 2.993-5.381 1.97-1.652 4.54-1.768 5.246-1.908 3.957-.781 5.755 1.906 7.704 3.645 1.276 1.138 3.019 3.432 4.256 6.507.967 2.4 2.199 4.622 2.714 6.008.497 1.339 1.725 3.484 2.453 6.055.661 2.336 2.43 4.125 3.102 5.235 0 0 1.029 2.882 7.285 5.516 1.357.572 4.1 1.501 5.736 2.096 2.718.988 5.351.86 8.704.458 2.391 0 3.686-3.462 4.772-6.234.643-1.639 1.259-6.334 1.678-7.667.406-1.297-.544-2.3.265-3.437.946-1.327 1.508-1.399 2.054-3.129 1.172-3.704 7.95-3.89 11.761-3.89 3.176 0 2.772 3.083 8.16 2.028 3.086-.605 6.059.398 9.335 1.265 2.758.732 5.352 1.566 6.906 3.385 1.005 1.178 3.5 7.08.958 7.331.244.3.423.84.88 1.135-.566 2.226-3.03.64-4.4.355-1.845-.383-3.147.057-4.952.856-3.085 1.374-7.598 1.214-10.286 3.452-2.281 1.898-2.277 6.133-3.34 8.507-.002-.001-2.955 7.6-9.402 12.248z" fill="url(#hpc)" stroke-width="1.028"/><linearGradient id="hpd" gradientUnits="userSpaceOnUse" x1="-735.137" y1="90.833" x2="-735.137" y2="141.967" gradientTransform="matrix(1.02783 0 0 1.02783 776.895 2.337)"><stop offset="0" stop-color="#f29100"/><stop offset="1" stop-color="#ec670f"/></linearGradient><path d="M38.247 105.09c-1.467-.15-2.83-.317-4.256-.605-2.662-.536-5.57-1.06-8.193-1.688-1.592-.385-6.895-2.263-8.048-2.792-2.702-1.246-4.496-4.63-6.609-4.282-1.348.22-2.662.682-3.5 2.042-.685 1.11-.917 3.016-1.391 4.294-.55 1.485-1.5 2.87-2.331 4.284-1.53 2.595-4.282 4.941-5.468 7.469-.239.52-.45 1.101-.649 1.708V144.415a48.57 48.57 0 0 1 4.45.96c11.955 3.19 14.872 3.46 26.598 2.119l1.1-.146c.897-1.867 1.59-8.227 2.171-10.195.454-1.51 1.077-2.712 1.313-4.253.223-1.463-.02-2.858-.146-4.188-.329-3.332 2.427-4.522 3.742-7.384 1.186-2.589 1.871-5.535 2.853-8.181.941-2.54 2.41-6.13 4.918-7.408-.305-.355-5.237-.518-6.554-.65z" fill="url(#hpd)" stroke-width="1.028"/></g></symbol><symbol viewBox="0 0 24 24" id="pdf" xmlns="http://www.w3.org/2000/svg"><path d="M14 9h5.5L14 3.5V9M7 2h8l6 6v12a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m4.93 10.44c.41.9.93 1.64 1.53 2.15l.41.32c-.87.16-2.07.44-3.34.93l-.11.04.5-1.04c.45-.87.78-1.66 1.01-2.4m6.48 3.81c.18-.18.27-.41.28-.66.03-.2-.02-.39-.12-.55-.29-.47-1.04-.69-2.28-.69l-1.29.07-.87-.58c-.63-.52-1.2-1.43-1.6-2.56l.04-.14c.33-1.33.64-2.94-.02-3.6a.853.853 0 0 0-.61-.24h-.24c-.37 0-.7.39-.79.77-.37 1.33-.15 2.06.22 3.27v.01c-.25.88-.57 1.9-1.08 2.93l-.96 1.8-.89.49c-1.2.75-1.77 1.59-1.88 2.12-.04.19-.02.36.05.54l.03.05.48.31.44.11c.81 0 1.73-.95 2.97-3.07l.18-.07c1.03-.33 2.31-.56 4.03-.75 1.03.51 2.24.74 3 .74.44 0 .74-.11.91-.3m-.41-.71l.09.11c-.01.1-.04.11-.09.13h-.04l-.19.02c-.46 0-1.17-.19-1.9-.51.09-.1.13-.1.23-.1 1.4 0 1.8.25 1.9.35M8.83 17c-.65 1.19-1.24 1.85-1.69 2 .05-.38.5-1.04 1.21-1.69l.48-.31m3.02-6.91c-.23-.9-.24-1.63-.07-2.05l.07-.12.15.05c.17.24.19.56.09 1.1l-.03.16-.16.82-.05.04z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="perl" xmlns="http://www.w3.org/2000/svg"><path d="M12 14c-1 0-3 1-3 2 0 2 3 2 3 2v-1a1 1 0 0 1-1-1 1 1 0 0 1 1-1v-1m0 5s-4-.5-4-2.5c0-3 3-3.75 4-3.75V11.5c-1 0-5 1.5-5 4.5 0 4 5 4 5 4v-1M10.07 7.03l1.19.53c.43-2.44 1.58-4.06 1.58-4.06-.43 1.03-.71 1.88-.89 2.55C13.16 3.55 15.61 2 15.61 2a15.916 15.916 0 0 0-2.64 3.53c1.58-1.68 3.77-2.78 3.77-2.78-2.69 1.72-3.9 4.45-4.2 5.21l.55.08c0 .52 0 1 .25 1.38C14.1 11.31 18 11.47 18 16s-4.03 6-6.17 6C9.69 22 5 21.03 5 16s4.95-5.07 5.83-7.08c.12-.38-.76-1.89-.76-1.89z" fill="#9575cd"/></symbol><symbol viewBox="0 0 24 24" id="php" xmlns="http://www.w3.org/2000/svg"><path d="M12 18.08c-6.63 0-12-2.72-12-6.08s5.37-6.08 12-6.08S24 8.64 24 12s-5.37 6.08-12 6.08m-5.19-7.95c.54 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.58 1.09-.28.22-.71.33-1.29.33h-.87l.53-2.76h.99m-3.5 5.55h1.44l.34-1.75h1.23c.54 0 .98-.06 1.33-.17.35-.12.67-.31.96-.58.24-.22.43-.46.58-.73.15-.26.26-.56.31-.88.16-.78.05-1.39-.33-1.82-.39-.44-.99-.65-1.82-.65H4.59l-1.28 6.58m7.25-8.33l-1.28 6.58h1.42l.74-3.77h1.14c.36 0 .6.06.71.18.11.12.13.34.07.66l-.57 2.93h1.45l.59-3.07c.13-.62.03-1.07-.27-1.36-.3-.27-.85-.4-1.65-.4h-1.27L12 7.35h-1.44M18 10.13c.55 0 .91.1 1.09.31.18.2.22.56.13 1.03-.1.53-.29.87-.57 1.09-.29.22-.72.33-1.3.33h-.85l.5-2.76h1m-3.5 5.55h1.44l.34-1.75h1.22c.55 0 1-.06 1.35-.17.35-.12.65-.31.95-.58.24-.22.44-.46.58-.73.15-.26.26-.56.32-.88.15-.78.04-1.39-.34-1.82-.36-.44-.99-.65-1.82-.65h-2.75l-1.29 6.58z" fill="#1E88E5"/></symbol><symbol viewBox="0 0 79 78" id="postcss" xmlns="http://www.w3.org/2000/svg"><title>postcss-logo-symbol</title><g transform="translate(5.48 5.52) scale(.85425)" fill="#e53935" fill-rule="evenodd" stroke="#e53935" stroke-width="1.519"><path d="M15.447 32.623c.106.08.29.132.106.29-.132.184-.29.342-.395.553-.105.185-.184.237-.342.106.21-.343.42-.66.63-.95zM68.342 60.24c0 .078.026.13.026.21.053-.105.053-.158.08-.21zm0 .236v-.026zm-5.368 10.277l-4.58-25.402c-.078-.025-.183-.077-.368-.13.053.105.08.184.106.263.13-.026.184-.026.236-.052 0-.026 0-.052.027-.08l4.58 25.404zm-4.737-31.12c-.026.078-.026.158-.026.237 0-.08 0-.16.028-.238zm.026.526c-.026 0-.026 0-.052-.028v.026c.028.026.028.026.054 0zm-.052.21v-.185c-.077.026-.156.026-.262.053.132.05.264.078.264.13z"/><path d="M78.71 33.967c-.052-1.028-.078-2.056-.184-3.083-.184-1.397-.368-2.82-.684-4.19-.237-1.133-.63-2.214-1.026-3.294-.5-1.265-1-2.556-1.632-3.768-1.026-1.95-2.368-3.69-3.605-5.508-.818-1.16-1.87-2.108-2.66-3.294-.447-.685-1.105-1.264-1.763-1.79-1.053-.845-2.158-1.61-3.263-2.347a32.525 32.525 0 0 0-2.58-1.634c-.71-.397-1.473-.713-2.21-1.056-.842-.395-1.658-.87-2.605-1.054-.238-.05-.448-.13-.685-.21-.605-.21-1.184-.447-1.79-.632-.92-.29-1.815-.632-2.763-.87C50.342 1 49.394.843 48.446.71 47.394.555 46.316.5 45.262.397a26.83 26.83 0 0 0-2.026-.184C42.236.16 41.21.16 40.21.134c-.5-.027-1.026-.08-1.526-.053-.763.026-1.526.105-2.29.21-.736.08-1.473.21-2.183.317-.867.105-1.735.158-2.604.264-.816.106-1.658.264-2.473.396-.29.053-.58.158-.87.21-.63.132-1.288.185-1.92.396-1.13.344-2.263.74-3.368 1.16-1.027.422-2.027.87-3 1.397-1 .552-1.948 1.21-2.895 1.844a45.325 45.325 0 0 0-2.66 1.923c-.84.66-1.63 1.397-2.394 2.135-.42.42-.763.922-1.158 1.396-.657.765-1.315 1.502-1.947 2.293-.524.66-1 1.344-1.5 2.03-.893 1.21-1.656 2.502-2.366 3.794-.29.527-.553 1.054-.816 1.58-.395.79-.816 1.555-1.184 2.372-.264.554-.474 1.16-.632 1.766-.367 1.292-.736 2.61-1.078 3.9-.316 1.16-.395 2.372-.42 3.558-.027 1.054.078 2.082.183 3.136.027.264-.13.58.184.79-.105.29-.026.45.13.5-.182.29.08.476-.024.74-.027.052.08.157.13.236 0 .08-.025.185 0 .264.028.237.133.474.133.738 0 .184.157.395.21.58.026.078 0 .21-.053.263-.158.184-.132.342.105.448.133.342.08.5.054.66.052.236-.027.315 0 .368.21.422.29.896.315 1.37 0 .106.053.212.106.343.026 0 0 .5 0 .5.13-.078.237-.104.368-.157.08.342.158.66.263.95.132.21.132.314.08.34.105.474.157.922.34 1.37 0-.5-.05-1-.13-1.475.368.132.684.263.895.263.027-.08.053-.184.08-.237-.158-.157-.29-.394-.448-.552.053.21 0 .29 0 .37-.105-.054-.237-.107-.368-.16.105-.13.21-.263.368-.42 0-.238-.13-.45-.5-.423.158-.052.316-.13.5-.184.29-.157-.026-.447-.026-.816.026-.447-.237-.895-.316-1.37-.132-.737-.105-1.844-.184-2.582-.158-.132-.29.21-.316.237.08.632.158 1.264.21 1.897-.157-.527-.263-1.107-.394-1.74-.027.185-.053.264-.053.37-.13.13-.026.29.053.474-.184-.08-.395-.052-.395-.052v.738c-.262-.264-.34-.474-.473-.66-.052-.21-.08-.42-.13-.63.05-.133 0-.212 0-.29a15.968 15.968 0 0 1-.08-.634c.026-.026-.026-.42-.026-.42.21.025.343.05.474.05-.263-.34-.08-.552.027-.763.053-.106.237-.13.29-.238.21-.395.553-.71.553-1.212 0-.237.08-.5.105-.738.053-.448.105-.896.13-1.344.054-.58 0-1.16.133-1.713.212-.92.475-1.843.764-2.766.21-.66.448-1.29.71-1.95.395-1.028.764-2.056 1.264-3.03.71-1.424 1.526-2.794 2.316-4.19.5-.87 1.026-1.687 1.58-2.53.525-.817 1.05-1.66 1.657-2.425a21.452 21.452 0 0 1 2.79-2.978c1.053-.948 2.053-1.923 3.184-2.793a32.218 32.218 0 0 1 4.685-3.005c1.343-.71 2.737-1.266 4.132-1.793.895-.342 1.868-.5 2.79-.79 1.052-.343 2.105-.5 3.21-.527.71-.027 1.395-.106 2.105-.185.632-.05 1.263-.104 1.948-.183-.08.105-.106.158-.132.21-.288.422-.604.844-.894 1.265-.237.343-.5.712-.737 1.054-.422.555-.87 1.108-1.264 1.688-.605.87-1.158 1.766-1.79 2.635-.63.843-1.315 1.634-1.973 2.45-.868 1.134-1.684 2.293-2.552 3.426-.79 1.08-1.63 2.11-2.394 3.19-.684.947-1.29 1.95-1.948 2.923-.973 1.45-1.947 2.872-2.92 4.322a271.93 271.93 0 0 1-2.316 3.294c-.053.08-.132.104-.21.157-.21.342-.21.527-.29.685-.21.395-.42.79-.658 1.16-.132.21-.316.394-.474.605-.026-.316.42-.474.21-.87-.13.212-.263.396-.394.607l-.316.63c.105.08.29.133.105.29-.08.133-.158.29-.237.423a.954.954 0 0 0 .29-.264c0 .29-.158.526-.29.763-.105.21-.368.37-.552.527.026.027.21.106.237.132.237-.08.316-.21.343-.132.08-.105.158-.184.184-.263.104-.264.262-.474.525-.58.106-.053.184-.132.263-.21.79-.818 1.606-1.608 2.316-2.478 1.106-1.345 2.106-2.74 3.16-4.11.446-.58.973-1.16 1.446-1.714.078.606.026 1.185 0 1.74-.08.974-.132 1.95-.21 2.95-.027.395 0 .79-.027 1.186 0 .105-.08.184-.08.29 0 .263.08.553.08.817-.08.975-.186 1.923-.265 2.898-.027.21.078.422.13.607-.13 1.422.16 2.925-.078 4.427.184-.29.237-.474.237-.658.025-.158 0-.316 0-.5v-.264c.025-.475.13-.975.078-1.45-.053-.527-.053-1.027.053-1.528.053-.21-.026-.474.106-.738v.395c-.026 1.5.027 3.003-.183 4.505-.027.132.08.37-.21.343-.238.474.052.817-.21 1.08-.054.053.05.29.077.448-.106.317-.106.317.052.343.026.58.08 1.106.105 1.66.42-1 .21-2.03.396-3.058.026.422.053.844.026 1.29 0 .687-.026 1.345-.052 2.03 0 .132-.027.264-.053.396-.08.37-.105.738-.237 1.08-.105.264-.052.66-.052.975v1.003c.105.448-.027.685.052.948-.08.265-.105.344-.08.423l.08.395c.527-.053.29.343.5.553-.158.212-.105.29-.105.397 0 .237-.025.448-.052.685 0 .606-.026 1.212-.026 1.792 0 .08.026.157.026.236 0 .054-.026.74-.026.74.053.078 0 .157-.08.236-.025 0-.104-3.347-.104-3.347h-.395c-.052 1.58.08 3.003-.21 4.48-.316.025-.42.078-.764.078-.816 0-1.632 0-2.448.026-.974 0-1.92.026-2.895.026-.472 0-.972.054-1.446.054-.632 0-1.29-.08-1.92-.08-.975 0-1.922.08-2.896.106-.71.026-1.42.026-2.13.053-.475.025-.95.05-1.422.104-.21.026-.395.105-.658.184-.08 0-.263-.026-.42 0-.265.053-.5.21-.765.264-.395.08-.5.184-.448.58v.263c-.026.052.58-.08.58-.08-.054 0-.08.158-.16.29.212-.08.343-.132.475-.184.395.185.737.08 1.052.16 1.026.262 2.078.37 3.13.473.685.053 1.343.08 2.027.105.973.053 1.947.106 2.92.106.816 0 1.606-.08 2.42-.08 1.13 0 2.264.052 3.395.08.237 0 .5-.028.763-.028h1.92c1.712-.052 3.422-.08 5.133-.13.975-.028 1.975-.08 2.948-.107l3-.08c1.158-.026 2.316-.026 3.448-.05.868 0 1.71-.03 2.58-.055.972-.026 1.972-.105 2.946-.157.527-.027 1.054-.08 1.58-.132.632-.052 1.29-.13 1.92-.157.948-.054 1.922-.08 2.87-.133 1.184-.078 2.368-.183 3.578-.21 1.106-.052 2.237-.026 3.343-.052.974-.027 1.948-.08 2.948-.106l1.66-.08s1.104-.026 1.657-.08c.947-.052 1.894-.157 2.842-.183.604-.027 1.21 0 1.815-.027.973-.026 1.973-.08 2.947-.08.367 0 .762.054 1.236.08-.21.185-.342.29-.5.422.105.026.21.08.316.132a.71.71 0 0 1-.42.13c-.054.133-.107.186-.16.45h.474c-.184 0-.342.237-.526.395-.21-.054-.395 0-.5.29.184.104.158.183.132.29-.316.104-.553.21-.42.552-.107.052-.238.105-.37.184-.13.21-.368.263-.316.553.106.025.21.08.29.104-.132.053-.263.132-.395.184-.473.29-.262.422-.157.554-.08.053-.158.105-.237.132.052.237.13.29.157.29a9.3 9.3 0 0 0-.395.316c-.08.237-.185.342-.29.5s-.158.37-.29.527c-.552.607-.947 1.32-1.657 1.793-.264.185-.5.422-.737.66-.474.447-.895.948-1.395 1.37a29.595 29.595 0 0 1-2.052 1.554 151.56 151.56 0 0 1-2.604 1.792c-.474.315-1 .552-1.5.842s-.974.554-1.474.843c-.316.21-.606.5-.948.66-.868.37-1.79.685-2.684 1.028-.87.37-1.5.685-2.158.922-.605.21-1.237.37-1.868.5-.21.054-.448 0-.685.027-.448.08-.895.186-1.343.238-1.158.158-2.316.264-3.473.422-.685.08-1.343.21-2.027.29-.473.026-.973-.026-1.447-.026-.342 0-.71.08-1.053.027-.552-.08-1.105-.21-1.658-.316-.13-.026-.316-.08-.42-.026-.21.106-.396-.052-.607 0-.13.027-.262-.08-.394-.08-.106-.025-.238.028-.37 0-.29-.078-.552-.183-.87-.157-.313.026-.63-.132-.97-.21-.475-.106-.92-.21-1.396-.317a2.38 2.38 0 0 1-.525-.237c-.685 0-1.133-.026-1.554-.185-.368-.13-.71-.315-1.105-.262-.104.026-.183-.026-.29-.026-.08-.106-.157-.317-.235-.317-.526.027-.842-.42-1.29-.553-.236-.08-.42-.343-.657-.422-.58-.237-1.052-.737-1.71-.816-.21-.027-.42-.132-.658-.21.08.104.13.183.21.262-.763-.37-1.473-.79-2.184-1.186-.104-.026-.183-.13-.262-.184l-.71-.474c-.395.08-.553-.08-.66-.132-.71-.5-1.525-.817-2.21-1.37-.29-.238-.63-.396-.84-.686-.37-.448-.817-.764-1.317-1.027-.394-.21-.762-.448-1.13-.685-.185-.132-.37-.29-.37-.58 0-.185-.078-.37-.315-.264-.105-.158-.21-.342-.342-.395-.316-.13-.526-.37-.763-.58s-.42-.5-.71-.605c-.527-.21-.843-.658-1.158-1.027-.738-.87-1.396-1.82-2.08-2.74-.053-.08-.158-.133-.237-.212.105.29.237.527.368.79-.262-.105-.446-.29-.604-.474-.027.027 1.815 3.057 1.815 3.057.16.237.29.475.448.712a.813.813 0 0 1-.79-.422c-.236-.42-.5-.684-1.026-.63a4.588 4.588 0 0 1-.13-.58c-.107 0-.185 0-.37-.027.37.58.685 1.08 1.027 1.66-.133-.08-.21-.132-.265-.158.473.5.815 1.133 1.42 1.45.132.605.816.895.974 1.475-.13-.027-.238-.053-.37-.08-.21-.263-.447-.526-.683-.816.052.184.13.342.236.474.316.395.606.79.974 1.133.132.134.316.187.316.424.21.105.29.13.368.13.054.16-.025.397.29.344.21.395.42.395.71.264.343.343.528.37.764.16 0 .13.026.262.026.368.105-.053.08-.132.08-.264.13.105.21.158.262.21.263.37.5.712.868 1.002.5.422.948.87 1.42 1.265.922.765 1.95 1.398 2.975 1.977 1.264.712 2.475 1.476 3.764 2.16 1.552.818 3.21 1.372 4.92 1.767.632.132 1.237.263 1.87.42.55.16 1.104.397 1.657.528.842.185 1.71.343 2.552.5.183.027.37.054.58.08.235.053.524-.053.577.027.132.21.237.104.395.078.184-.053.395-.053.605-.053.737.026 1.447.184 2.184.132.16 0 .396-.133.528.13.236-.105.368-.105.473-.13.028.236 0 .236-.05.262-.054.026-.133.053-.238.132.947.184 1.842.21 2.63 0 1.37.105 2.554-.053 3.686-.448.105.132.184.316.342.053.052-.08.184-.107.29-.133.236-.053.526-.158.736-.08.238.08.317-.13.5-.13.317 0 .606-.027.896-.08.158-.026.316-.105.5-.158a1.285 1.285 0 0 0-.58-.133c.317-.158.606-.29.896-.42-.053.078-.106.183-.21.183h.367c-.08 0-.185.237-.316.395.946-.237 1.814-.448 2.657-.66-.29-.552.315-.367.526-.684-.263.08-.526.158-.79.21.895-.447 1.816-.842 2.71-1.237-.13.158-.29.237-.525.37.158.025.263.025.342.05.42.133.316-.262.447-.5.5 0 .71-.078.947-.158.263-.08.526-.158.79-.263.42-.184.815-.42 1.236-.63.08-.028.21 0 .316 0 .29-.186.394-.344.473-.318.37.053.63-.08.736-.42.184-.133.316-.238.447-.318.578-.316 1.13-.632 1.71-.948.21 0 .316 0 .368-.027.344-.16.66-.342.975-.527a2.258 2.258 0 0 1-.263-.13c.262-.054.34-.08.5-.133.63-.74 1.5-1.24 2.157-1.82.29-.026.29-.105.29-.157.104-.132.21-.29.34-.396.58-.527 1.21-.975 1.737-1.528a37.16 37.16 0 0 0 2.184-2.374c.63-.738 1.264-1.475 1.79-2.292.737-1.133 1.368-2.293 2.026-3.48.474-.842.895-1.685 1.37-2.528.05-.08.157-.185.236-.185.71-.08 1.422-.13 2.106-.21.158-.026.342-.13.5-.21-.08-.132-.132-.29-.21-.422-.106-.16-.264-.29-.37-.45-.104-.13-.183-.29-.262-.447-.08-.13-.158-.236-.237-.37a9.7 9.7 0 0 1-.45-.894c-.026-.08-.08-.21-.052-.29.474-1.027.658-2.134 1.105-3.162.447-1.054.58-2.24.79-3.373.184-1.08.29-2.16.42-3.24.08-.764.185-1.502.21-2.266.16-1.212.106-2.346.08-3.48-.026-1-.08-2.028-.13-3.03zM12.685 66.405c-.184-.21-.342-.448-.526-.658l.08-.08c.287.317.577.633.866.976-.158-.08-.342-.132-.42-.238zm.42.238c.08-.027.16-.027.238-.053.08.132.132.29.21.448-.368-.027-.552-.185-.447-.395zm27.37 10.883v-.08c.5-.052.973-.105 1.473-.157v.077c-.5.08-.973.13-1.473.158zm6.63-.685c-.367.08-.762.133-1.13.186-.132.026-.29.158-.342-.08-.053.027-.106.027-.158.054.13.394.447.078.71.236-.58.08-1.13.132-1.684.21v-.052c.16-.026.343-.053.5-.08v-.078a7.743 7.743 0 0 0-.79-.053c-.077 0-.183.106-.262.132-.105.026-.21.053-.342.053-.447.026-.894.026-1.316.052-.027 0-.08-.026-.106-.026v-.08c1.763-.236 3.5-.473 5.263-.71.027.052.027.105.053.157-.158 0-.263.055-.395.08zm.396-.262c.606-.08 1.16-.132 1.738-.21-1.21.342-1.605.394-1.737.21zM24.58 23.374c.84-1.16 1.71-2.32 2.552-3.505.263-.345.473-.714.736-1.056.08-.106.185-.158.316-.264l-.026-.05c.105-.133.21-.24.263-.344.134-.21.213-.448.318-.685a.385.385 0 0 1 .105-.103c.37.184.37-.21.5-.343.237-.264.474-.553.684-.817.158-.21.316-.395.448-.632.026-.08-.053-.21-.08-.317h-.078c.08-.052.158-.13.237-.184.026 0 .026 0 .052-.026.158-.238.316-.475.474-.686.315-.42.657-.842 1.025-1.21-.052.13-.105.263-.158.368.027 0 .027.027.053.027.316-.422.658-.817.974-1.24-.027-.025-.053-.052-.08-.052-.13.132-.236.264-.368.396-.026-.027-.052-.053-.08-.053.265-.343.528-.685.79-1.08.053.08.106.184.21.395.107-.263.212-.447.29-.632-.078.08-.183.158-.262.238l-.08-.08.474-.71c.5-.712 1-1.45 1.5-2.162.185-.263.42-.474.58-.738.5-1 1.29-1.792 1.894-2.714.132-.184.316-.342.474-.5.13-.16.237-.106.342.026.71.896 1.42 1.818 2.13 2.714.528.66 1.054 1.29 1.554 1.976.605.844 1.184 1.687 1.79 2.53.684.975 1.368 1.95 2.026 2.95 1 1.477 1.947 2.953 2.947 4.428.737 1.08 1.474 2.135 2.184 3.215h-1.344c-1.236-.025-2.5-.13-3.736-.078-1.684.08-3.394.264-5.078.396-2.132.185-4.29.21-6.42.21-.765 0-1.528.107-2.29.16-.922.052-1.817.105-2.738.13-1.08.054-2.13.08-3.21.107-.606.026-1.237 0-1.895 0zm30.183 12.12v.238c-.026 0-.052.027-.105.027-.105-.37-.21-.766-.342-1.135-.263-.765-.553-1.53-1.027-2.214-.528-.737-1-1.5-1.528-2.265-.13-.185-.316-.343-.474-.5-.553-.607-1.106-1.24-1.816-1.687a21.485 21.485 0 0 0-3.29-1.688 7.374 7.374 0 0 1-.92-.474h.63l4.5-.08c.974-.025 1.922-.025 2.895-.078.236 0 .368.08.5.29.236.395.473.79.736 1.186.027.052.08.13.08.21 0 .58 0 1.186.026 1.766.025.606.08 1.186.104 1.792 0 .606-.053 1.238-.026 1.87.027.897.053 1.82.053 2.74zM26.447 26.67c1.237-.053 2.42-.132 3.632-.185.945-.053 1.92-.08 2.866-.132.395-.025.764-.05 1.158 0-.42.212-.842.423-1.21.686-.474.316-.92.737-1.395 1.08-.475.342-.896.764-1.29 1.212-.5.605-1.053 1.132-1.58 1.712-.37.422-.79.817-1.105 1.265-.447.58-.842 1.21-1.263 1.87.132-2.504.29-4.98.184-7.51zm17.185 25.35c-.843.21-1.71.448-2.58.553-.736.106-1.5.08-2.263.08a25.42 25.42 0 0 1-2.028-.08c-.763-.078-1.526-.157-2.263-.5-.633-.29-1.29-.553-1.92-.87-.634-.316-1.265-.684-1.74-1.264-.34-.423-.815-.765-1.236-1.134.08.316.263.58.553.764-.132.158-.316.08-.58-.343-.078.053-.157.08-.21.106.08-.185.158-.37.237-.527-.105-.21-.237-.448-.342-.66-.21-.342-.42-.71-.605-1.053-.053-.08-.053-.158-.105-.237a5.893 5.893 0 0 1-.37-.475c-.21-.315-.394-.657-.657-.974 0 .08.027.158.027.264-.027 0-.053.026-.053.026l-.554-1.344c-.026 0-.026 0-.052.026l.473 1.74c-.026 0-.052.025-.08.025-.077-.104-.156-.21-.21-.34-.052-.212-.21-.212-.34-.133-.08.053-.133.237-.106.316.185.448.395.896.606 1.344.052.158.105.29.184.448.027.053.106.105.106.184.106.21.185.42.316.606.237.316.5.632.737.948.235.316.445.66.656.975.026.053.105.053.13.08.133.395.58.684.896.526.08.606.737.817 1 1.397a11.957 11.957 0 0 1-.763-.343c-.027.026-.027.052-.054.105.316.158.632.316.92.5.265.16.528.317.765.5.316.29.685.45 1.13.554a.282.282 0 0 0-.05-.107c.736.343 1.5.712 2.078 1-2.737.054-5.658.107-8.685.16 0-.5-.026-.975-.026-1.476 0-.21.052-.395.025-.606-.08-1.21-.08-2.424-.237-3.61-.157-1.264-.157-2.503-.13-3.77.025-.683-.027-1.394-.054-2.08 0-.922 0-1.82.028-2.74 0-.132.053-.237.106-.37h.08c.025.054 0 .133.05.16.08.08.212.21.265.184.157-.106.394-.21.447-.37.13-.315.184-.658.184-.974 0-.236.106-.394.21-.553.054-.08.08-.158.133-.263-.105-.08-.21-.132-.342-.237.106-.29.08-.633.475-.79.052-.027.052-.16.08-.238.025-.213.05-.45.078-.66.052.08.08.105.13.157a.42.42 0 0 1 .054-.08c0-.104-.026-.315 0-.315.316-.053.184-.395.342-.553.025-.028-.027-.107-.027-.16 0-.052 0-.13.026-.13.367-.08.315-.475.552-.66.08-.053.105-.13.21-.263.21.368-.158.553-.184.816.446-.263.578-.895.315-1.08.105-.08.21-.184.29-.29.29-.316.604-.606.868-.922.185-.236.29-.526.474-.763.106-.132.316-.237.474-.317.474-.262.92-.552 1.21-1 .053-.053.132-.105.21-.158.08-.053.238-.053.264-.132.027-.052-.052-.184-.105-.263.104-.053.21-.158.42-.264-.08.158-.105.264-.158.37l.13.13c.238-.184.606-.394.843-.552 0-.025-.132-.13-.132-.13-.157.08-.394.21-.63.316.05-.08.05-.132.08-.158.367-.237.735-.474 1.13-.66.92-.42 1.842-.842 2.763-1.237.158-.08.37-.026.553-.026.078 0 .13 0 .21-.026.42-.132.842-.264 1.263-.37.183-.052.393-.078.58-.078.787.025 1.577.025 2.366.078.342.026.658.105.974.21a9.88 9.88 0 0 1 1.184.5c.447.24.868.502 1.29.792.763.5 1.473 1.054 2.236 1.502.737.448 1.316 1.054 1.79 1.74.58.816 1.237 1.554 1.5 2.555l.394 1.74c.08.316.264.632.185 1-.133.66-.238 1.345-.343 2.004-.052.265-.105.53-.078.79.05.82-.265 1.53-.58 2.268-.106.237-.264.475-.395.738a.798.798 0 0 0 .21.106l.237-.474c.027 0 .027 0 .053.027-.132.368-.237.764-.37 1.133-.314.817-.63 1.66-1.025 2.45-.21.448-.58.817-.842 1.24-.262.368-.473.763-.736 1.106-.237.29-.473.58-.79.79-.71.527-1.447 1.054-2.21 1.476-.473.29-1.026.448-1.552.58zm-14.027-1.4l-.026.027c-.055-.026-.134-.052-.186-.105l-.632-.95c-.052-.078-.08-.157-.052-.262.29.448.58.87.895 1.29zm16.37 3.61c1.183-.5 2.157-1.21 3.05-2.028.133-.132.264-.263.422-.37 1.106-.684 1.92-1.633 2.658-2.687.842-1.212 1.395-2.582 2.08-3.873a2.73 2.73 0 0 1 .157-.29c-.053 3.004.29 5.955.684 8.933-2.973.105-6 .21-9.052.316zm26.683-.79c-.026.053-.08.106-.105.16-.027-.054-.027-.133-.053-.24-.158.423-.5.212-.737.212-1.42.027-2.868.027-4.29.027-1.368 0-2.762 0-4.13.024-.448 0-.922.105-1.37.132-1.078.052-2.157.08-3.236.105-.08 0-.158-.13-.29-.236a1.81 1.81 0 0 1-.158.237c-.028-.052-.08-.104-.133-.183-.026.08-.053.158-.08.21H58c-.053-.368-.158-.71-.158-1.08 0-.79.08-1.58.105-2.372.027-.368 0-.71 0-1.054.106.08.185.133.29.21.052-.103.105-.182.158-.26 0 0-.053-.028-.106-.08.05-.027.104-.08.104-.106.026-.08.08-.158.08-.21 0-.185-.054-.343-.08-.5.026 0 .052 0 .08-.028l.157.79h.08c-.106-.183.236-.342-.053-.552-.026-.027.026-.185.026-.264-.08-.157-.13-.315-.21-.526.026-.026.105-.053.184-.08-.105-.052-.184-.104-.263-.13.263-.238.263-.37.026-.633.054-.025.106-.025.106-.05 0-.238 0-.475-.052-.71-.053-.266.08-.58-.316-.74a.79.79 0 0 0 .105.21s-.08.027-.158.08c-.342-.317-.13-.74-.21-1.213.184.053.316.106.447.16-.053-.186-.184-.397-.263-.634h-.107v-1.74c0 .027.184.027.29.054 0-.027.025-.053.025-.08-.08-.105-.185-.21-.29-.342l.053-.053c-.21-.262-.105-.63-.105-.71V39.4c.264.264-.13.606.264.764v-.263h-.027c-.026-.395-.026-.79-.052-1.186h-.052c-.027.054-.027.08-.054.133h-.052l.158-6.298c.263.342.552.66.736 1 .606 1.108 1.395 2.057 2.132 3.058.632.87 1.21 1.818 1.79 2.714.71 1.08 1.394 2.16 2.105 3.24a81.41 81.41 0 0 0 1.63 2.426c.5.71 1.028 1.396 1.554 2.082.446.606.92 1.212 1.367 1.818.527.738 1.053 1.475 1.58 2.187.262.368.552.737.84 1.106.16.21.396.37.554.5-.025 0-.052 0-.104-.026.08.105.13.184.184.237.29.158.316.316.158.554zM74 46.854v-.185c0 .052.026.13 0 .184zm.895-11.62c-.027 0-.184-.16-.21-.186-.027.08 0 .158-.053.264-.027-.078-.21-.052-.21-.13-.027.368.157.737.13 1.106.08-.053.395-.08.474-.158.027.026.08.052.106.052-.527.396-.395.79-.158 1.24.052.104.21.315.052.526-.052.053.027.21.053.343h.077v.05l-.237.08c-.052-.08-.367-.236-.367-.37v1.346c.263.08.263.448.368.633a.768.768 0 0 0 .107-.21l.027.024c-.027.158-.053.316-.106.475-.052.236-.105.447-.13.684 0 .026.05.08.05.105-.288.66-.13 1.396-.235 2.08-.08.5 0 1.03-.053 1.556-.054.448-.16.922-.264 1.37-.027.08-.08.105-.21.158.052-.316.026-.527-.027-.817-.028 0-.37-.184-.397-.184 0 .37.21.87.29 1.29-.08-.026-.395-.21-.42-.21-.054.316-.054.738-.08 1.08-.027.264-.263.5-.29.79 0 .16.184.264.158.528h.21c0-.526.238-1 .238-1.554h.078c.027.053.106.106.08.132-.053.29-.16.606-.132.896 0 .158.13.316.08.5-.054.16-.08.317-.107.554-.027-.132-.053-.184-.053-.263-.026 0-.263-.027-.29-.027-.026.158.185.316.158.448-.026.026-.052.026-.105.053l-.868-1.266c-.686-1-1.37-2.003-2.054-3.03a6.312 6.312 0 0 1-.475-.79 37.09 37.09 0 0 0-2.71-4.033c-.762-.974-1.37-2.03-2.08-3.055-.656-.975-1.314-1.924-1.972-2.9-.237-.315-.526-.605-.737-.948-.683-1.08-1.29-2.187-1.972-3.267-.58-.897-1.21-1.767-1.816-2.636-.21-.29-.42-.607-.632-.923a.37.37 0 0 1-.052-.182c-.053-.58-.106-1.16-.132-1.713 0-.527.053-1.054.053-1.608v-.474c0-.132.025-.237.025-.37.025-.025.052-.078.078-.104-.763 0-1.553-.028-2.316 0-.5.025-.763-.186-1.105-.555-1-1.133-1.737-2.424-2.605-3.636a162.42 162.42 0 0 0-2.5-3.427c-.685-.922-1.37-1.818-2.053-2.74-.764-1.054-1.5-2.108-2.29-3.162a381.983 381.983 0 0 0-2.895-3.794c-.45-.58-.95-1.133-1.45-1.74.343.054.66.106.975.133l1.264.08c.947.077 1.894.13 2.84.26.79.107 1.58.265 2.396.396 1.738.29 3.448.765 5.106 1.318.974.316 1.92.738 2.87 1.133 2.13.87 4.157 1.924 6.157 3.03.63.343 1 .896 1.472 1.397.685.712 1.37 1.423 2.027 2.16.762.87 1.472 1.766 2.21 2.662.657.79 1.34 1.58 2 2.372.21.237.37.527.552.79.42.633.895 1.24 1.263 1.924.262.502.42 1.082.604 1.635.262.817.526 1.607.79 2.424.183.606.34 1.24.472 1.87.106.423.08.87.21 1.29.16.556 0 1.16.16 1.715.025.053.05.132.078.185.105.104.184.21.026.368-.025.026-.025.13 0 .21.054-.052.08-.105.133-.184 0 .053.025.08.025.105 0 .104-.027.21 0 .315 0 .052.052.13.078.184.053-.054.105-.08.21-.16.237.897.264 1.793.264 2.715 0 .87.157 1.74-.21 2.583.078-.29-.106-.555-.027-.818z"/><path d="M58.08 45.482c.025 0 .052.027.052.027l-.027-.03c0-.025 0-.025-.026 0zm4.157 26.036c-.29.21-.58.395-.948.474-.028-.026-.028-.053-.054-.08.29-.184.605-.368.895-.553.027.05.08.104.106.157zM12.895 35.81c.29-.367.58-.736.894-1.105.025.026.235.08.262.105-.29.37-.685.87-.974 1.265-.054-.053-.133-.237-.185-.264zM5.42 48.725c-.21-.448-.42-.923-.63-1.37a.91.91 0 0 1 .236-.106c.29.42.42.92.632 1.37 0 0-.21.105-.237.105zm6.712-12.65c-.158.238-.316.502-.474.74-.026-.028-.316.104-.342.078.158-.237.552-.66.71-.896.027.026.053.053.106.08zM59.422 72.6c.025 0 .025-.026.052-.026.184.026.394.052.605.052-.344.237-.555.21-.66-.026zm-47.24-35.418c.028-.08.08-.158.133-.237.052 0 .13-.027.13-.027.107-.184.107-.316.212-.474-.026-.026-.053-.026-.08-.053-.157.108-.315.24-.473.345.053.052.053.08.053.132-.21-.027-.29.08-.395.368-.026.08-.158.106-.29.21-.026.054-.052.186-.105.317l.027.028c-.053.053-.132.08-.132.08-.158.157-.342.29-.5.447-.026.08-.052.158-.052.237.185-.184.5-.527.737-.738l.027.027c.105-.158.184-.316.29-.474.025.026.025.052.052.08-.08.21-.158.446-.237.657-.055.026-.134.08-.134.053-.105.08-.184.184-.29.263l-.473.316c-.263.237-.526.447-.816.685-.184.29-.368.553-.58.896.317-.08.396.053.37.317.368.052.395-.237.5-.448.026-.054.053-.16.105-.186.237-.21.5-.394.763-.605.053-.053.053-.16.053-.238 0-.026-.133-.026-.212-.053.237-.264.58-.71.816-1 .132-.08.263-.186.263-.265-.026-.29.158-.368.37-.474-.106-.08-.133-.157-.133-.183z"/><path d="M12.71 36.892c-.105.184-.21.342-.315.527l-.158-.08c-.105.605-.474 1.132-.842 1.237.105.053.21.106.29.08.078-.027.13-.16.183-.238l.71-1.028.238-.396-.105-.105zM3.948 48.46c.132 0 .264.026.42.026 0-.105.133-.08.133-.184h.08c0 .132.026.237.026.37h-.552c-.027-.027-.132-.186-.106-.212zm-.21-1.212c-.08-.08-.21-.158-.21-.237-.027-.104.052-.235.13-.367.054.184.08.342.132.527-.027.025-.053.052-.053.078zm.658-1.687c.105.266.21.556.316.82a.798.798 0 0 0-.21.105c-.105-.264-.237-.554-.342-.817a.652.652 0 0 1 .237-.106zm58.58 25.194c.13-.052.288-.08.5-.13-.238.183-.422.315-.58.473-.027-.026-.053-.053-.08-.053.053-.105.106-.184.16-.29zM30.63 15.074c.157-.106.29-.185.447-.29l.052.052c-.16.21-.29.42-.475.685-.026-.183-.026-.29-.053-.42-.026 0 0 0 .027-.026zm7.71 13.333c.237-.106.474-.21.763-.343-.026.158-.026.264-.026.37a.927.927 0 0 0-.264-.054c-.158.027-.448.238-.58.264-.025 0 .106-.21.106-.237zm19.74 22.346c.052.263.552.395.052.658.08.055.157.08.236.134a.2.2 0 0 1-.052.106c-.053.025-.158.078-.21.05-.027 0-.08-.104-.08-.157 0-.237.027-.474.053-.79z"/></g></symbol><symbol viewBox="0 0 24 24" id="powerpoint" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5M8 11v2h1v6H8v1h4v-1h-1v-2h2a3 3 0 0 0 3-3 3 3 0 0 0-3-3H8m5 2a1 1 0 0 1 1 1 1 1 0 0 1-1 1h-2v-2h2z" fill="#d14524"/></symbol><symbol viewBox="0 0 67.47 70" id="powershell" xmlns="http://www.w3.org/2000/svg"><path d="M18.545 12.4c-3.014 0-6.08 2.34-6.873 5.248L1.91 53.438c-.793 2.908.996 5.248 4.01 5.248h42.887c3.014 0 6.08-2.34 6.873-5.248l9.761-35.79c.794-2.908-.993-5.248-4.007-5.248h-42.89zm4.848 6.243c.652.04 1.29.33 1.76.86l7.96 9.013-3.957 3.246 3.957-3.244 4.832 5.47c.037.042.06.088.094.131.026.034.057.06.082.096.02.028.032.057.05.086.057.087.105.176.15.267.028.06.055.117.08.178a2.546 2.546 0 0 1 .171.764c.005.073.01.146.008.219-.002.09-.01.178-.021.267a2.53 2.53 0 0 1-.036.217 2.56 2.56 0 0 1-.07.252c-.024.076-.048.15-.08.224a2.547 2.547 0 0 1-.111.22 2.503 2.503 0 0 1-.133.218 2.546 2.546 0 0 1-.147.187c-.058.07-.118.137-.185.202-.027.026-.048.057-.076.082-.037.032-.077.054-.116.084-.038.03-.07.065-.11.093L16.8 52.271a2.552 2.552 0 0 1-3.563-.626 2.553 2.553 0 0 1 .63-3.563l18.349-12.853-3.06-3.467-7.839-8.873a2.549 2.549 0 0 1 .225-3.608 2.546 2.546 0 0 1 1.85-.638zm22.441 28.214c1.377 0 2.255 1.083 1.969 2.43-.287 1.347-1.627 2.433-3.004 2.434l-9.957.006c-1.378 0-2.256-1.083-1.969-2.43.287-1.347 1.626-2.433 3.004-2.434l9.957-.006z" fill="#03a9f4" stroke-width="5.342" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 210 210" id="prettier" xmlns="http://www.w3.org/2000/svg"><title>prettier-icon-dark</title><g transform="matrix(.9 0 0 .9 10.5 10.5)" fill="none" fill-rule="evenodd"><rect fill="#56B3B4" x="165" y="40" width="20" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="200" width="60" height="10" rx="5"/><rect fill="#BF85BF" x="135" y="120" width="40" height="10" rx="5"/><rect fill="#EA5E5E" x="75" y="120" width="50" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="120" width="50" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="160" width="60" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="80" width="60" height="10" rx="5"/><rect fill="#F7BA3E" x="65" y="20" width="110" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="20" width="40" height="10" rx="5"/><rect fill="#F7BA3E" x="55" y="180" width="20" height="10" rx="5"/><rect fill="#56B3B4" x="55" y="60" width="20" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="180" width="30" height="10" rx="5"/><rect fill="#F7BA3E" x="15" y="60" width="30" height="10" rx="5"/><rect fill="#56B3B4" x="95" y="100" width="90" height="10" rx="5"/><rect fill="#F7BA3E" x="45" y="100" width="40" height="10" rx="5"/><rect fill="#EA5E5E" x="15" y="100" width="20" height="10" rx="5"/><rect fill="#BF85BF" x="105" y="40" width="50" height="10" rx="5"/><rect fill="#56B3B4" x="15" y="40" width="80" height="10" rx="5"/><rect fill="#F7BA3E" x="45" y="140" width="100" height="10" rx="5"/><rect fill="#BF85BF" x="15" y="140" width="20" height="10" rx="5"/><rect fill="#EA5E5E" x="135" y="60" width="60" height="10" rx="5"/><rect fill="#F7BA3E" x="135" y="80" width="60" height="10" rx="5"/><rect fill="#56B3B4" x="15" width="130" height="10" rx="5"/></g></symbol><symbol viewBox="0 0 80 80" id="protractor" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="hxa"><path transform="scale(1 -1)" fill="#564b55" stroke-width="27.224" d="M-2.983-69.251h69.412v67.108H-2.983z"/></clipPath></defs><g transform="matrix(1.13039 0 0 -1.13039 5.714 82.137)" clip-path="url(#hxa)"><g transform="scale(.1)"><path d="M1180.54 92.324c-5.53 0-9.93-1.797-13.23-5.39-3.29-3.614-5.22-8.594-5.81-14.97h36.02c0 6.583-1.47 11.622-4.4 15.126-2.93 3.496-7.12 5.234-12.58 5.234zm2.84-62.656c-10.19 0-18.22 3.086-24.11 9.297-5.88 6.21-8.83 14.824-8.83 25.84 0 11.101 2.73 19.922 8.21 26.464 5.45 6.524 12.81 9.805 22.02 9.805 8.63 0 15.46-2.851 20.48-8.523 5.03-5.676 7.55-13.157 7.55-22.461v-6.613h-47.45c.21-8.086 2.26-14.22 6.12-18.418 3.89-4.18 9.34-6.29 16.38-6.29 7.42 0 14.76 1.563 22 4.669V34.14c-3.68-1.602-7.18-2.746-10.48-3.438-3.28-.684-7.24-1.035-11.89-1.035M1272.34 30.918v44.57c0 5.606-1.28 9.805-3.82 12.559-2.56 2.773-6.56 4.16-12.02 4.16-7.2 0-12.49-1.953-15.84-5.851-3.34-3.895-5.03-10.32-5.03-19.286V30.918h-10.42v68.887h8.47l1.71-9.422h.5c2.14 3.387 5.14 6.023 8.99 7.887 3.85 1.867 8.15 2.804 12.88 2.804 8.29 0 14.54-2.011 18.73-6.015 4.19-3.985 6.28-10.391 6.28-19.192V30.918h-10.43M1328.96 38.406c7.1 0 12.27 1.938 15.48 5.813 3.22 3.879 4.81 10.129 4.81 18.758v2.199c0 9.765-1.62 16.726-4.87 20.898-3.25 4.18-8.44 6.25-15.56 6.25-6.11 0-10.79-2.383-14.04-7.129-3.26-4.746-4.88-11.472-4.88-20.136 0-8.797 1.61-15.45 4.84-19.93 3.23-4.484 7.97-6.723 14.22-6.723zm20.85 1.762h-.56c-4.83-7.004-12.02-10.5-21.62-10.5-9.01 0-16.03 3.066-21.04 9.238-5 6.153-7.5 14.922-7.5 26.27 0 11.355 2.51 20.176 7.54 26.465 5.03 6.289 12.03 9.433 21 9.433 9.34 0 16.5-3.398 21.49-10.195h.81l-.43 4.96-.25 4.845v28.039h10.43V30.918h-8.49l-1.38 9.25M1434.91 38.27c1.85 0 3.63.136 5.34.421 1.72.274 3.09.547 4.1.84v-7.976c-1.15-.559-2.81-.996-5.01-1.36-2.18-.351-4.17-.527-5.94-.527-13.32 0-19.97 7.012-19.97 21.055V91.71h-9.88v5.027l9.88 4.336 4.38 14.707h6.04V99.805h20V91.71h-20V51.16c0-4.15.98-7.333 2.96-9.56 1.97-2.206 4.67-3.331 8.1-3.331M1463.81 65.43c0-8.809 1.76-15.508 5.27-20.118 3.53-4.609 8.69-6.906 15.53-6.906s12.01 2.297 15.56 6.875c3.53 4.602 5.3 11.301 5.3 20.149 0 8.75-1.77 15.41-5.3 19.953-3.55 4.539-8.77 6.824-15.69 6.824-6.82 0-11.99-2.246-15.47-6.73-3.46-4.48-5.2-11.16-5.2-20.047zm52.47 0c0-11.23-2.83-20-8.48-26.309-5.66-6.309-13.47-9.453-23.44-9.453-6.17 0-11.64 1.445-16.42 4.336-4.78 2.89-8.46 7.031-11.06 12.45-2.59 5.401-3.88 11.73-3.88 18.976 0 11.23 2.8 19.968 8.41 26.242 5.61 6.258 13.4 9.402 23.38 9.402 9.64 0 17.3-3.222 22.97-9.62 5.69-6.415 8.52-15.087 8.52-26.024M1591.71 92.324c-5.54 0-9.94-1.797-13.23-5.39-3.3-3.614-5.24-8.594-5.81-14.97h36c0 6.583-1.46 11.622-4.39 15.126-2.93 3.496-7.13 5.234-12.57 5.234zm2.83-62.656c-10.19 0-18.22 3.086-24.11 9.297-5.89 6.21-8.83 14.824-8.83 25.84 0 11.101 2.74 19.922 8.2 26.464 5.46 6.524 12.81 9.805 22.04 9.805 8.62 0 15.45-2.851 20.48-8.523 5.03-5.676 7.54-13.157 7.54-22.461v-6.613h-47.45c.21-8.086 2.25-14.22 6.13-18.418 3.87-4.18 9.33-6.29 16.36-6.29 7.43 0 14.77 1.563 22.01 4.669V34.14c-3.69-1.602-7.17-2.746-10.46-3.438-3.3-.684-7.27-1.035-11.91-1.035M1683.5 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12.01 4.16-7.2 0-12.48-1.953-15.83-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.48l1.69-9.422h.51c2.14 3.387 5.14 6.023 8.99 7.887 3.84 1.867 8.15 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M1740.11 38.406c7.12 0 12.28 1.938 15.49 5.813 3.21 3.879 4.81 10.129 4.81 18.758v2.199c0 9.765-1.62 16.726-4.87 20.898-3.25 4.18-8.43 6.25-15.56 6.25-6.12 0-10.8-2.383-14.05-7.129-3.24-4.746-4.88-11.472-4.88-20.136 0-8.797 1.64-15.45 4.85-19.93 3.22-4.484 7.96-6.723 14.21-6.723zm20.87 1.762h-.57c-4.82-7.004-12.03-10.5-21.62-10.5-9.01 0-16.02 3.066-21.03 9.238-5 6.153-7.52 14.922-7.52 26.27 0 11.355 2.52 20.176 7.55 26.465 5.02 6.289 12.02 9.433 21 9.433 9.34 0 16.5-3.398 21.48-10.195h.83l-.44 4.96-.25 4.845v28.039h10.43V30.918h-8.49l-1.37 9.25M1846.07 38.27c1.85 0 3.64.136 5.36.421 1.7.274 3.07.547 4.08.84v-7.976c-1.13-.559-2.8-.996-5-1.36-2.2-.351-4.18-.527-5.94-.527-13.33 0-19.99 7.012-19.99 21.055V91.71h-9.86v5.027l9.86 4.336 4.4 14.707h6.04V99.805H1855V91.71h-19.98V51.16c0-4.15.98-7.333 2.95-9.56 1.97-2.206 4.68-3.331 8.1-3.331M1894.26 92.324c-5.53 0-9.94-1.797-13.22-5.39-3.31-3.614-5.25-8.594-5.83-14.97h36.01c0 6.583-1.45 11.622-4.38 15.126-2.95 3.496-7.13 5.234-12.58 5.234zm2.83-62.656c-10.19 0-18.22 3.086-24.1 9.297-5.9 6.21-8.84 14.824-8.84 25.84 0 11.101 2.73 19.922 8.2 26.464 5.47 6.524 12.81 9.805 22.03 9.805 8.63 0 15.46-2.851 20.49-8.523 5.03-5.676 7.55-13.157 7.55-22.461v-6.613h-47.46c.22-8.086 2.26-14.22 6.13-18.418 3.87-4.18 9.33-6.29 16.37-6.29 7.42 0 14.75 1.563 22 4.669V34.14c-3.7-1.602-7.17-2.746-10.47-3.438-3.28-.684-7.25-1.035-11.9-1.035M1983.36 49.727c0-6.426-2.4-11.368-7.18-14.844-4.77-3.477-11.47-5.215-20.11-5.215-9.13 0-16.26 1.445-21.37 4.336v9.687a51.32 51.32 0 0 1 10.65-3.964c3.79-.977 7.45-1.457 10.97-1.457 5.46 0 9.64.87 12.57 2.609 2.95 1.738 4.41 4.394 4.41 7.95 0 2.694-1.17 4.98-3.5 6.894-2.32 1.914-6.85 4.152-13.6 6.757-6.41 2.383-10.97 4.473-13.67 6.25-2.71 1.778-4.72 3.81-6.04 6.067-1.31 2.254-1.98 4.96-1.98 8.113 0 5.606 2.29 10.04 6.86 13.281 4.57 3.25 10.84 4.883 18.79 4.883 7.42 0 14.66-1.515 21.74-4.531l-3.71-8.496c-6.9 2.851-13.17 4.277-18.79 4.277-4.94 0-8.67-.77-11.18-2.324-2.52-1.543-3.78-3.691-3.78-6.406 0-1.844.48-3.418 1.42-4.707.95-1.309 2.46-2.54 4.56-3.711 2.09-1.184 6.11-2.871 12.07-5.086 8.16-2.98 13.69-5.98 16.55-8.996 2.87-3.02 4.32-6.809 4.32-11.367M2021.28 38.27c1.85 0 3.64.136 5.35.421 1.71.274 3.09.547 4.09.84v-7.976c-1.14-.559-2.81-.996-5.01-1.36-2.18-.351-4.18-.527-5.93-.527-13.33 0-19.99 7.012-19.99 21.055V91.71h-9.87v5.027l9.87 4.336 4.4 14.707h6.02V99.805h20V91.71h-20V51.16c0-4.15 1-7.333 2.97-9.56 1.98-2.206 4.67-3.331 8.1-3.331M2053.61 30.918h-10.42v68.887h10.42zm-11.31 87.559c0 2.39.59 4.14 1.76 5.253 1.18 1.106 2.65 1.661 4.42 1.661 1.67 0 3.1-.567 4.32-1.7 1.22-1.132 1.82-2.871 1.82-5.214 0-2.344-.6-4.09-1.82-5.247-1.22-1.16-2.65-1.726-4.32-1.726-1.77 0-3.24.566-4.42 1.726-1.17 1.157-1.76 2.903-1.76 5.247M2121.59 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12 4.16-7.21 0-12.49-1.953-15.84-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.49l1.69-9.422h.5c2.15 3.387 5.14 6.023 8.99 7.887 3.85 1.867 8.16 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M2159.29 77.742c0-4.812 1.35-8.465 4.08-10.926 2.72-2.48 6.51-3.71 11.37-3.71 10.19 0 15.28 4.953 15.28 14.831 0 10.344-5.16 15.532-15.47 15.532-4.9 0-8.67-1.32-11.31-3.965-2.63-2.649-3.95-6.555-3.95-11.762zm-5.67-58.387c0-3.73 1.58-6.55 4.72-8.488 3.14-1.922 7.65-2.879 13.52-2.879 8.75 0 15.24 1.309 19.45 3.926 4.21 2.617 6.31 6.172 6.31 10.652 0 3.723-1.15 6.32-3.45 7.754-2.31 1.457-6.65 2.168-13.01 2.168h-12.51c-4.74 0-8.43-1.12-11.06-3.386-2.65-2.266-3.97-5.508-3.97-9.747zm54.94 80.45v-6.582l-12.76-1.512c1.18-1.477 2.23-3.39 3.15-5.754.91-2.371 1.37-5.039 1.37-8.02 0-6.746-2.29-12.128-6.91-16.152-4.61-4.012-10.93-6.023-18.98-6.023-2.05 0-3.98.156-5.78.5-4.45-2.356-6.67-5.305-6.67-8.871 0-1.883.77-3.282 2.34-4.176 1.54-.902 4.21-1.36 7.97-1.36h12.2c7.46 0 13.19-1.574 17.19-4.707 4-3.144 6-7.714 6-13.71 0-7.618-3.06-13.426-9.17-17.43C2192.38 2.004 2183.46 0 2171.72 0c-9 0-15.95 1.68-20.82 5.027-4.88 3.352-7.34 8.079-7.34 14.211 0 4.18 1.35 7.813 4.03 10.88 2.68 3.046 6.45 5.116 11.32 6.21-1.77.8-3.24 2.031-4.44 3.711-1.19 1.68-1.78 3.633-1.78 5.84 0 2.52.66 4.707 2.01 6.602 1.34 1.882 3.44 3.71 6.34 5.468-3.56 1.465-6.46 3.953-8.71 7.48-2.23 3.516-3.35 7.54-3.35 12.06 0 7.55 2.26 13.37 6.79 17.452 4.52 4.082 10.93 6.133 19.22 6.133 3.6 0 6.86-.429 9.75-1.27h23.82M2284.61 91.71h-17.54V30.919h-10.43v60.793h-12.31v4.707l12.31 3.766v3.839c0 16.922 7.4 25.391 22.19 25.391 3.65 0 7.93-.73 12.82-2.195l-2.7-8.364c-4.03 1.301-7.46 1.946-10.31 1.946-3.93 0-6.85-1.309-8.73-3.926-1.89-2.617-2.84-6.816-2.84-12.598v-4.472h17.54V91.71M2302.87 65.43c0-8.809 1.76-15.508 5.28-20.118 3.52-4.609 8.7-6.906 15.52-6.906 6.84 0 12.02 2.297 15.57 6.875 3.54 4.602 5.3 11.301 5.3 20.149 0 8.75-1.76 15.41-5.3 19.953-3.55 4.539-8.78 6.824-15.69 6.824-6.83 0-11.99-2.246-15.46-6.73-3.48-4.48-5.22-11.16-5.22-20.047zm52.48 0c0-11.23-2.82-20-8.47-26.309-5.67-6.309-13.48-9.453-23.46-9.453-6.15 0-11.62 1.445-16.4 4.336-4.77 2.89-8.47 7.031-11.06 12.45-2.59 5.401-3.9 11.73-3.9 18.976 0 11.23 2.81 19.968 8.43 26.242 5.6 6.258 13.4 9.402 23.38 9.402 9.63 0 17.28-3.222 22.97-9.62 5.68-6.415 8.51-15.087 8.51-26.024M2403.79 101.074c3.07 0 5.8-.254 8.22-.761l-1.43-9.676c-2.86.633-5.37.933-7.55.933-5.58 0-10.33-2.261-14.3-6.785-3.95-4.531-5.94-10.156-5.94-16.902V30.918h-10.43v68.887h8.62l1.19-12.754h.5c2.56 4.48 5.63 7.949 9.23 10.37 3.61 2.423 7.56 3.653 11.89 3.653M2500.33 69.766l-10.68 28.476c-1.39 3.594-2.81 8.028-4.28 13.262-.93-4.024-2.24-8.438-3.96-13.262l-10.81-28.476zm14.77-38.848l-11.44 29.227h-36.83l-11.32-29.227h-10.81l36.34 92.273h8.98l36.13-92.273h-11.05M2583.07 30.918v44.57c0 5.606-1.27 9.805-3.83 12.559-2.55 2.773-6.55 4.16-12 4.16-7.21 0-12.49-1.953-15.84-5.851-3.35-3.895-5.03-10.32-5.03-19.286V30.918h-10.43v68.887h8.48l1.69-9.422h.51c2.14 3.387 5.14 6.023 8.99 7.887 3.84 1.867 8.15 2.804 12.88 2.804 8.3 0 14.54-2.011 18.74-6.015 4.19-3.985 6.29-10.391 6.29-19.192V30.918h-10.45M2620.76 77.742c0-4.812 1.36-8.465 4.08-10.926 2.73-2.48 6.53-3.71 11.37-3.71 10.2 0 15.28 4.953 15.28 14.831 0 10.344-5.15 15.532-15.45 15.532-4.91 0-8.68-1.32-11.32-3.965-2.64-2.649-3.96-6.555-3.96-11.762zm-5.66-58.387c0-3.73 1.57-6.55 4.71-8.488 3.15-1.922 7.65-2.879 13.53-2.879 8.75 0 15.23 1.309 19.44 3.926 4.21 2.617 6.31 6.172 6.31 10.652 0 3.723-1.14 6.32-3.45 7.754-2.31 1.457-6.64 2.168-13 2.168h-12.51c-4.74 0-8.43-1.12-11.07-3.386-2.63-2.266-3.96-5.508-3.96-9.747zm54.94 80.45v-6.582l-12.76-1.512c1.18-1.477 2.22-3.39 3.14-5.754.92-2.371 1.38-5.039 1.38-8.02 0-6.746-2.3-12.128-6.92-16.152-4.61-4.012-10.92-6.023-18.97-6.023-2.05 0-3.99.156-5.78.5-4.46-2.356-6.67-5.305-6.67-8.871 0-1.883.78-3.282 2.33-4.176 1.55-.902 4.21-1.36 7.98-1.36h12.2c7.46 0 13.18-1.574 17.18-4.707 4.01-3.144 6-7.714 6-13.71 0-7.618-3.06-13.426-9.17-17.43C2653.87 2.004 2644.94 0 2633.2 0c-9 0-15.95 1.68-20.83 5.027-4.88 3.352-7.33 8.079-7.33 14.211 0 4.18 1.35 7.813 4.02 10.88 2.69 3.046 6.47 5.116 11.32 6.21-1.77.8-3.23 2.031-4.43 3.711-1.19 1.68-1.79 3.633-1.79 5.84 0 2.52.66 4.707 2.01 6.602 1.35 1.882 3.45 3.71 6.35 5.468-3.56 1.465-6.47 3.953-8.71 7.48-2.23 3.516-3.35 7.54-3.35 12.06 0 7.55 2.25 13.37 6.79 17.452 4.52 4.082 10.92 6.133 19.21 6.133 3.62 0 6.86-.429 9.75-1.27h23.83M2692.7 99.805V55.117c0-5.605 1.27-9.805 3.83-12.566 2.56-2.766 6.57-4.145 12.01-4.145 7.2 0 12.47 1.965 15.81 5.903 3.33 3.945 4.99 10.379 4.99 19.304v36.192h10.44V30.918h-8.62l-1.5 9.25h-.58c-2.13-3.41-5.1-5.988-8.88-7.793-3.8-1.809-8.13-2.707-12.99-2.707-8.37 0-14.65 1.992-18.81 5.977-4.18 3.964-6.26 10.351-6.26 19.101v45.059h10.56M2760.61 30.918h10.43v97.805h-10.43zM2810.67 38.27c6.5 0 11.6 1.789 15.31 5.343 3.71 3.575 5.56 8.555 5.56 14.961v6.23l-10.44-.448c-8.3-.286-14.27-1.583-17.94-3.868-3.66-2.273-5.5-5.82-5.5-10.644 0-3.781 1.14-6.64 3.42-8.613 2.29-1.973 5.48-2.961 9.59-2.961zm23.57-7.352l-2.07 9.805h-.51c-3.44-4.305-6.86-7.227-10.27-8.77-3.42-1.523-7.68-2.285-12.8-2.285-6.83 0-12.17 1.758-16.05 5.273-3.87 3.528-5.81 8.536-5.81 15.032 0 13.906 11.12 21.199 33.37 21.875l11.7.359v4.277c0 5.418-1.17 9.395-3.5 11.985-2.32 2.566-6.03 3.855-11.15 3.855-5.74 0-12.24-1.758-19.49-5.273l-3.21 7.988c3.4 1.836 7.11 3.281 11.16 4.324a47.81 47.81 0 0 0 12.16 1.575c8.23 0 14.3-1.817 18.27-5.461 3.96-3.66 5.93-9.5 5.93-17.54V30.919h-7.73M2893.6 101.074c3.07 0 5.8-.254 8.25-.761l-1.46-9.676c-2.84.633-5.35.933-7.54.933-5.56 0-10.33-2.261-14.3-6.785-3.96-4.531-5.93-10.156-5.93-16.902V30.918h-10.44v68.887h8.61l1.19-12.754h.5c2.57 4.48 5.65 7.949 9.25 10.37 3.6 2.423 7.56 3.653 11.87 3.653M2901.63 6.727c-3.94 0-7.04.558-9.31 1.691v9.121c2.97-.84 6.08-1.25 9.31-1.25 4.14 0 7.3 1.25 9.45 3.77 2.16 2.507 3.24 6.132 3.24 10.859v91.895h10.69V31.797c0-7.95-2.01-14.121-6.04-18.496-4.02-4.383-9.8-6.574-17.34-6.574M2999.96 55.371c0-8.086-2.93-14.394-8.8-18.918-5.87-4.52-13.83-6.785-23.88-6.785-10.9 0-19.27 1.406-25.14 4.219v10.3c3.77-1.59 7.88-2.847 12.31-3.765 4.45-.93 8.85-1.399 13.21-1.399 7.12 0 12.49 1.36 16.09 4.063 3.59 2.695 5.4 6.465 5.4 11.277 0 3.196-.63 5.805-1.91 7.832-1.29 2.024-3.42 3.907-6.42 5.625-2.99 1.711-7.56 3.664-13.67 5.84-8.55 3.059-14.66 6.692-18.32 10.871-3.66 4.2-5.51 9.668-5.51 16.407 0 7.089 2.68 12.714 7.99 16.914 5.32 4.191 12.36 6.289 21.12 6.289 9.13 0 17.54-1.68 25.2-5.032l-3.32-9.304c-7.59 3.183-14.96 4.785-22.13 4.785-5.66 0-10.07-1.223-13.26-3.652-3.19-2.43-4.78-5.809-4.78-10.118 0-3.191.59-5.8 1.76-7.832 1.17-2.031 3.14-3.886 5.95-5.597 2.78-1.688 7.04-3.563 12.79-5.625 9.63-3.426 16.26-7.118 19.89-11.063 3.62-3.937 5.43-9.043 5.43-15.332M741.648 375.406h30c28.965 0 50.227 5.039 63.774 15.117 13.531 10.079 20.32 25.821 20.32 47.247 0 19.832-6.074 34.628-18.191 44.402-12.141 9.758-31.028 14.641-56.692 14.641h-39.211zm172.192 64.246c0-36.062-11.809-63.691-35.434-82.898-23.621-19.219-57.234-28.82-100.847-28.82h-35.911V198.73h-56.445v345.329h99.438c43.14 0 75.457-8.829 96.961-26.465 21.496-17.637 32.238-43.614 32.238-77.942M1099.26 464.691c11.17 0 20.39-.789 27.63-2.371l-5.43-51.718c-7.88 1.894-16.07 2.832-24.57 2.832-22.2 0-40.19-7.246-53.97-21.731-13.78-14.48-20.66-33.301-20.66-56.453V198.73h-55.514v261.227h43.464l7.32-46.055h2.83c8.66 15.594 19.96 27.95 33.9 37.09 13.93 9.141 28.93 13.699 45 13.699M1206.88 329.82c0-60.308 22.28-90.465 66.85-90.465 44.08 0 66.13 30.157 66.13 90.465 0 59.688-22.21 89.512-66.61 89.512-23.31 0-40.2-7.707-50.67-23.144-10.47-15.43-15.7-37.54-15.7-66.368zm190.13 0c0-42.672-10.95-75.972-32.83-99.898-21.89-23.945-52.35-35.918-91.41-35.918-24.41 0-45.97 5.508-64.7 16.543-18.75 11.016-33.16 26.836-43.23 47.48-10.08 20.625-15.11 44.551-15.11 71.793 0 42.364 10.86 75.43 32.58 99.2 21.73 23.777 52.36 35.671 91.89 35.671 37.79 0 67.7-12.156 89.75-36.492 22.05-24.328 33.06-57.121 33.06-98.379M1558.11 238.887c13.54 0 27.07 2.129 40.62 6.386v-41.816c-6.13-2.676-14.05-4.922-23.73-6.738-9.69-1.797-19.73-2.715-30.12-2.715-52.59 0-78.88 27.715-78.88 83.144v140.778h-35.68v24.558l38.26 20.325 18.9 55.261h34.26v-58.113h74.39v-42.031h-74.39v-139.84c0-13.379 3.34-23.242 10.03-29.629 6.69-6.387 15.48-9.57 26.34-9.57M1783.44 464.691c11.17 0 20.38-.789 27.62-2.371l-5.43-51.718c-7.88 1.894-16.06 2.832-24.56 2.832-22.2 0-40.2-7.246-53.97-21.731-13.78-14.48-20.66-33.301-20.66-56.453V198.73h-55.52v261.227h43.46l7.34-46.055h2.82c8.66 15.594 19.95 27.95 33.9 37.09 13.92 9.141 28.93 13.699 45 13.699M1925.05 236.523c20.15 0 36.32 5.625 48.52 16.895 12.21 11.25 18.31 27.051 18.31 47.344v22.676l-33.54-1.407c-26.13-.937-45.16-5.312-57.04-13.105-11.89-7.793-17.82-19.727-17.82-35.781 0-11.661 3.45-20.665 10.39-27.051 6.91-6.387 17.32-9.571 31.18-9.571zm82.66-37.793l-11.11 36.387h-1.87c-12.62-15.918-25.29-26.738-38.04-32.48-12.74-5.742-29.13-8.633-49.13-8.633-25.67 0-45.7 6.934-60.1 20.801-14.41 13.847-21.62 33.457-21.62 58.808 0 26.934 10 47.246 30 60.934 19.99 13.691 50.45 21.172 91.41 22.441l45.09 1.414v13.938c0 16.699-3.88 29.16-11.68 37.441-7.79 8.262-19.88 12.383-36.25 12.383-13.39 0-26.23-1.953-38.5-5.891a294.638 294.638 0 0 1-35.44-13.933l-17.94 39.668c14.17 7.41 29.68 13.035 46.52 16.894 16.85 3.868 32.77 5.789 47.72 5.789 33.22 0 58.31-7.246 75.22-21.726 16.94-14.492 25.4-37.246 25.4-68.262V198.73h-39.68M2220.04 194.004c-39.52 0-69.55 11.543-90.1 34.609-20.55 23.067-30.82 56.172-30.82 99.321 0 43.925 10.74 77.707 32.23 101.339 21.5 23.614 52.56 35.418 93.18 35.418 27.56 0 52.35-5.117 74.41-15.359l-16.78-44.641c-23.46 9.133-42.82 13.704-58.1 13.704-45.19 0-67.79-29.993-67.79-89.981 0-29.293 5.63-51.305 16.89-66.031 11.26-14.707 27.76-22.09 49.48-22.09 24.72 0 48.11 6.152 70.15 18.437v-48.417c-9.92-5.84-20.5-10-31.76-12.52-11.26-2.52-24.93-3.789-40.99-3.789M2451.52 238.887c13.54 0 27.08 2.129 40.63 6.386v-41.816c-6.15-2.676-14.05-4.922-23.73-6.738-9.69-1.797-19.73-2.715-30.12-2.715-52.6 0-78.9 27.715-78.9 83.144v140.778h-35.66v24.558l38.26 20.325 18.9 55.261h34.26v-58.113h74.39v-42.031h-74.39v-139.84c0-13.379 3.34-23.242 10.03-29.629 6.69-6.387 15.47-9.57 26.33-9.57M2585.92 329.82c0-60.308 22.28-90.465 66.84-90.465 44.09 0 66.15 30.157 66.15 90.465 0 59.688-22.22 89.512-66.62 89.512-23.31 0-40.2-7.707-50.67-23.144-10.47-15.43-15.7-37.54-15.7-66.368zm190.13 0c0-42.672-10.94-75.972-32.83-99.898-21.89-23.945-52.36-35.918-91.4-35.918-24.42 0-45.98 5.508-64.72 16.543-18.74 11.016-33.14 26.836-43.22 47.48-10.07 20.625-15.12 44.551-15.12 71.793 0 42.364 10.87 75.43 32.59 99.2 21.74 23.777 52.36 35.671 91.89 35.671 37.79 0 67.7-12.156 89.75-36.492 22.04-24.328 33.06-57.121 33.06-98.379M2972.33 464.691c11.18 0 20.38-.789 27.63-2.371l-5.43-51.718c-7.87 1.894-16.05 2.832-24.57 2.832-22.2 0-40.19-7.246-53.96-21.731-13.78-14.48-20.67-33.301-20.67-56.453V198.73h-55.51v261.227h43.46l7.33-46.055h2.83c8.66 15.594 19.96 27.95 33.89 37.09 13.94 9.141 28.94 13.699 45 13.699" fill="#100f0d"/><path d="M610.11 372.83c0-170.584-138.257-308.862-308.846-308.862-170.602 0-308.846 138.278-308.846 308.863 0 170.576 138.244 308.846 308.846 308.846 170.59 0 308.846-138.27 308.846-308.846" fill="#e53935" stroke-width="1.029"/><path d="M460.694 521.792l-105.04.958-61.415 61.415-72.096-47.883 12.445-12.438-29.207.26-99.129-166.817H67.357l24.39-24.402-24.57-41.363L294.66 64.049c2.192-.04 4.399-.08 6.603-.08 170.416 0 308.585 138.055 308.846 308.408L460.694 521.792" fill="#d51c2f" stroke-width="1.029"/><path d="M149.093 350.258c0 84.048 68.13 152.151 152.171 152.151 84.028 0 152.139-68.103 152.139-152.151zm342.063-7.017v14.046h44.015c-1.75 59.337-25.556 113.104-63.54 153.419L438.75 477.81l-9.925 9.94 32.875 32.887c-40.314 37.983-94.081 61.79-153.41 63.527l-.015-44.003h-14.035v44.003c-59.34-1.737-113.096-25.556-153.41-63.527l32.887-32.887-9.945-9.92-32.883 32.875c-37.975-40.315-61.781-94.082-63.53-153.419h44.002l-.008-14.034H67.176v-51.511h468.176v51.5h-44.196" fill="#f5f5f5" stroke-width="1.029"/></g></g></symbol><symbol id="pug" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#c1272d}.hyst1{fill:#efcca3}.st2{fill:#ed1c24}.hyst3{fill:#ccac8d}.hyst4{fill:#fff}.st5{fill:#ff931e}.st6{fill:#ffb81e}.hyst7{fill:#56332b}.hyst8{fill:#442823}.hyst9{fill:#7f4a41}.hyst10{fill:#331712}.st11{fill:#fc6}.st12{fill:#ccc}.st13{fill:#b3b3b3}.st14{fill:#989898}.st15{fill:#323232}.st16{fill:#1e1e1e}.st17{fill:#4c4c4c}.st18{fill:#e6e6e6}.st19{fill:#606060}</style><path class="hyst1" d="M107.4 50.9c-.2-4.4.4-8.3-1.6-11.6-4.8-8.2-16.8-13-40.8-13v.7h-.5.5v-.7c-24 0-36.6 4.8-41.4 13.1-1.9 3.4-1.7 7.2-2 11.6-.2 3.5-1.8 7.2-1.1 11.2.8 5.2 1.1 10.4 1.9 15.2.6 3.9 6 7.2 6.5 10.9 1.4 10.2 12 14.9 36 14.9v.8h-.6.7v-.8c24 0 34.2-4.7 35.5-14.9.5-3.8 5.5-7 6.1-10.9.8-4.8 1.1-10 1.9-15.2.7-4-.9-7.8-1.1-11.3z"/><path class="hyst3" d="M64.6 54.5c4.3.1 7.3 2.8 10.1 5.3 3.3 2.9 8.9 4.9 11.2 7.4 2.3 2.5 5.3 5 6.4 8.9 1.1 3.9 1.4 8.9 1.4 10.2 0 1.3.7 1 2.7 0 4.7-2.3 9.9-8.5 9.9-8.5-.6 3.9-5.7 7.4-6.2 11.1C98.9 99.1 89 104 64.5 104h-.1.6"/><path class="hyst3" d="M80.4 46.7c.9 3.1 4.1 13.6-2.1 10.1 0 0 2.6 1.5 4.2 7.2 1.7 5.7 5.8 6.4 5.8 6.4s6.7 1.3 11.7-3c4.2-3.6 4.9-10 3.1-14.9-1.8-4.8-5-6.3-9.7-7.3-4.7-1.1-14.1-2-13 1.5z"/><circle cx="92.3" cy="58.1" r="8.8"/><circle class="hyst4" cx="90" cy="54.2" r="2.3"/><path class="hyst1" d="M78.9 57.7s7.9 5.4 12.2 10.7c4.3 5.3 4.2 6.3 4.2 6.3l-3.1 1.4s-4.4-8.3-9.8-11.4c-5.5-3.1-6.1-5.7-6.1-5.7l2.6-1.3z"/><path class="hyst3" d="M64.9 54.5c-4.3.1-7.5 2.8-10.4 5.3-3.3 2.9-9.1 4.9-11.4 7.4-2.3 2.5-5.4 5-6.5 8.9-1.1 3.9-1.5 8.9-1.5 10.2 0 1.3.2 1.4-2.7 0-4.7-2.2-9.9-8.5-9.9-8.5.6 3.9 5.7 7.4 6.2 11.1C30.1 99.1 40 104 64.5 104h.5"/><path class="hyst7" d="M88.1 71.4C83.3 65.5 75.6 60 64.9 60h-.1c-10.7 0-18.4 5.5-23.2 11.4-5 6.1-4.6 8.5-4.6 14.3 0 21 7.4 15 12.3 17.6 5 2.5 10.2 1.7 15.5 1.7h.1c5.4 0 10.5.7 15.5-1.8 4.9-2.5 12.3 3.7 12.3-17.3.1-5.8.4-8.4-4.6-14.5z"/><path class="hyst8" d="M64.4 65.2s-.7 9.7-2.1 11.6l2.6-.6-.5-11z"/><path class="hyst8" d="M65.1 65.2s.7 9.7 2.1 11.6l-2.6-.6.5-11z"/><path class="hyst7" d="M56.7 62.9c-1-2.3 2.6-6 8.3-6.1 5.7 0 9.3 3.7 8.3 6.1-1 2.4-4.6 3.1-8.3 3.2-3.6-.1-7.3-.8-8.3-3.2z"/><path d="M65 65.2c0-.4 3.4-.5 5.2-1.7 0 0-3.7 1.2-4.5.7-.8-.4-1-1.6-1-1.6s-.3 1.2-.9 1.6c-.7.4-4.9-.7-4.9-.7s5.6 1.4 5.6 1.7c0 .3-.1 1.3-.1 2 0 2.5 0 8.7.4 9.2.6.9.4-6.7.4-9.2-.1-.8-.1-1.6-.2-2z"/><path class="hyst9" d="M65.2 78.6c1.7 0 4.7 1.2 7.4 3.1-2.6-2.9-5.7-4.9-7.4-4.9-1.8 0-5.6 2.2-8.3 5.4 2.8-2.2 6.4-3.6 8.3-3.6z"/><path class="hyst8" d="M64.5 96.3c-3.8 0-7.5-1.2-10.9-2.1-.7-.2-1.4.3-2.1.1-6.3-2-11.4-5.4-14.5-9.7v1c0 21 7.4 15.1 12.3 17.6 5 2.5 10.2 1.7 15.5 1.7h.1c5.4 0 10.5.7 15.5-1.8 4.9-2.5 12.3 3.6 12.3-17.4 0-.8 0-1.6.1-2.3-2.9 4.7-8.2 8.4-14.8 10.6-.6.2-2-.3-2.6-.2-3.6 1.2-6.8 2.5-10.9 2.5z"/><path class="hyst8" d="M55 85s-2.5 7.5-.8 10.8l-2.3-1s1.7-7.6 3.1-9.8zM74.8 85s2.5 7.5.8 10.8l2.3-1s-1.8-7.6-3.1-9.8z"/><path class="hyst3" d="M48.6 46.7c-.9 3.1-4.1 13.6 2.1 10.1 0 0-2.6 1.5-4.2 7.2s-5.8 6.4-5.8 6.4-6.7 1.3-11.7-3c-4.2-3.6-4.9-10-3.1-14.9s5-6.3 9.7-7.3c4.7-1.1 14-2 13 1.5z"/><path d="M64.9 76.8c2.7 0 11.1 5.8 11.2 12.9v-.4c0-7.4-6.8-13.3-11.2-13.3-4.4 0-11.2 6-11.2 13.3v.4c.1-7.1 8.5-12.9 11.2-12.9z"/><ellipse transform="rotate(-14.465 66.712 61.468)" class="hyst10" cx="66.7" cy="61.5" rx=".8" ry="1.5"/><ellipse transform="rotate(17.235 62.371 61.462)" class="hyst10" cx="62.4" cy="61.5" rx=".8" ry="1.5"/><circle cx="37.2" cy="58.1" r="8.8"/><circle class="hyst4" cx="39.5" cy="54.2" r="2.3"/><path class="hyst9" d="M67.5 58.2c0-.1-2.3 1-2.9 1.1-.6-.1-2.9-1.2-2.9-1.1h5.8z"/><path class="hyst1" d="M50 57.7s-7.9 5.4-12.2 10.7c-4.3 5.3-4.2 6.3-4.2 6.3l3.1 1.4s4.4-8.3 9.8-11.4 6.1-5.7 6.1-5.7L50 57.7z"/><path class="hyst3" d="M32.7 41.7S30 49.1 24 52.2c0 0 9.4-1.1 8.7-10.5zM95.8 41.7s2.7 7.4 8.7 10.5c0 0-9.4-1.1-8.7-10.5zM78.7 55.5s-5.9-6.2-13.8-6.4h.1.1c-8 .2-13.8 6.4-13.8 6.4 6.9-4.8 12.8-4.7 13.8-4.7-.1 0 6.7-.1 13.6 4.7zM71.8 42.5s-3-4.2-7-4.3h.2c-3 .1-6.9 4.3-6.9 4.3 3.4-3.3 6.9-3.2 6.9-3.2s3.3-.1 6.8 3.2zM37.2 73.2s-4.7 2.3-8.1.9H29c-3-1.7-4.5-6.8-4.5-6.8s3 9 12.7 5.9zM92 73.2s4.7 2.3 8.1.9c4-1.7 4.6-6.8 4.6-6.8s-3 9-12.7 5.9z"/><path class="hyst3" d="M42.6 41.2c2.6-.5 6.9-.6 10.3.5 4.3 1.5.8 7 1.7 7.3.9.3 2.1-3.8 10.1-3.4 8.1.4 9 4 10.1 3.4s-1.1-10 11-7.8c0 0-12.7-3.4-12.1 5.8 0 0-7.3-5.6-17.5-.6.1 0 2.7-8.6-13.6-5.2zM86.9 41.2c.2 0 .3.1.4.1.1 0-.1-.1-.4-.1zM86.9 41.2zM39.1 28.9S28.3 42.5 26.7 47.7c-1.6 5.3-2.8 27-4.2 30.1l-5-21.4 9.2-22.3 12.4-5.2zM89.9 28.9s10.8 13.6 12.4 18.8c1.6 5.3 2.8 27 4.2 30.1l5-21.4-9.2-22.3-12.4-5.2z"/><path class="hyst7" d="M89.4 28.9s11.6 9.7 15 20.9c3.4 11.2 2 24.8 4.6 26.5 3.7 2.4 7.9-11.9 9.3-13.4 2.2-2.4 9.5-8.5 10-9.6.5-1.1-14.8-17.8-21.5-21.1-8.1-3.8-18.1-4.1-17.4-3.3z"/><path class="hyst8" d="M99.3 34.9s13.7 17.5 13.5 39.3l5.5-11.2c-.1 0-4.9-14.3-19-28.1z"/><path class="hyst7" d="M39.1 28.9s-11.6 9.7-15 20.9-2 24.8-4.6 26.5c-3.7 2.4-7.9-11.9-9.3-13.4C8 60.5.7 54.4.2 53.3-.3 52.2 15 35.5 21.7 32.2c8.1-3.8 18.1-4.1 17.4-3.3z"/><path class="hyst8" d="M29.2 34.9S15.5 52.4 15.7 74.2L10.3 63s4.8-14.3 18.9-28.1z"/><path class="hyst3" d="M21.8 74.6s1 5.4 2.6 7.1.5-1.3.5-1.3-1.7-.9-1.4-7.8-1.7 2-1.7 2zM107.1 74.6s-1 5.4-2.6 7.1-.5-1.3-.5-1.3 1.7-.9 1.4-7.8 1.7 2 1.7 2z"/><g><circle class="hyst8" cx="54.5" cy="70.5" r=".8"/><circle class="hyst8" cx="49.9" cy="75.3" r=".8"/><circle class="hyst8" cx="48.4" cy="70.5" r=".8"/></g><g><circle class="hyst8" cx="74" cy="70.5" r=".8"/><circle class="hyst8" cx="78.6" cy="75.3" r=".8"/><circle class="hyst8" cx="80.1" cy="70.5" r=".8"/></g></symbol><symbol viewBox="0 0 50 50" id="puppet" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -247)" fill="#fbc02d"><path stroke-width=".283" d="M11.559 249.467h13.587v13.587H11.559zM27.435 265.056h13.587v13.587H27.435zM11.559 281.074h13.587v13.587H11.559z"/><path stroke-width=".256" d="M16.62 251.615l18.305 18.305-3.236 3.236-18.305-18.305z"/><path stroke-width=".256" d="M37.834 271.331L19.53 289.636l-3.237-3.237 18.305-18.304z"/></g></symbol><symbol viewBox="0 0 100 99.999997" id="purescript" xmlns="http://www.w3.org/2000/svg"><path clip-path="url(#SVGID_2_)" d="M98.079 38.548L79.22 19.68l-5.087 5.088L90.447 41.09 74.134 57.41l5.087 5.087 18.858-18.86a3.59 3.59 0 0 0 1.055-2.55 3.578 3.578 0 0 0-1.055-2.54M25.483 42.794l-5.09-5.089L1.53 56.568a3.566 3.566 0 0 0-1.05 2.545c0 .961.373 1.863 1.05 2.542L20.394 80.52l5.089-5.086L9.162 59.113z" fill="#42a5f5" stroke-width="1.192"/><path clip-path="url(#SVGID_2_)" transform="matrix(1.19175 0 0 1.19175 -306.84 -629.047)" fill="#42a5f5" d="M281.841 551.736l6.461 6.037h28.379l-6.461-6.037zM288.302 566.861l-6.463 6.035h28.381l6.463-6.035zM281.838 581.982l6.464 6.035h28.381l-6.463-6.035z"/></symbol><symbol viewBox="0 0 24 24" id="python" xmlns="http://www.w3.org/2000/svg"><path d="M19.14 7.5A2.86 2.86 0 0 1 22 10.36v3.78A2.86 2.86 0 0 1 19.14 17H12c0 .39.32.96.71.96H17v1.68a2.86 2.86 0 0 1-2.86 2.86H9.86A2.86 2.86 0 0 1 7 19.64v-3.75a2.85 2.85 0 0 1 2.86-2.85h5.25a2.85 2.85 0 0 0 2.85-2.86V7.5h1.18m-4.28 11.79c-.4 0-.72.3-.72.89 0 .59.32.71.72.71a.71.71 0 0 0 .71-.71c0-.59-.32-.89-.71-.89m-10-1.79A2.86 2.86 0 0 1 2 14.64v-3.78A2.86 2.86 0 0 1 4.86 8H12c0-.39-.32-.96-.71-.96H7V5.36A2.86 2.86 0 0 1 9.86 2.5h4.28A2.86 2.86 0 0 1 17 5.36v3.75a2.85 2.85 0 0 1-2.86 2.85H8.89a2.85 2.85 0 0 0-2.85 2.86v2.68H4.86M9.14 5.71c.4 0 .72-.3.72-.89 0-.59-.32-.71-.72-.71-.39 0-.71.12-.71.71s.32.89.71.89z"/><path d="M9.264 22.379c-.895-.24-1.581-.799-1.947-1.582-.228-.489-.237-.606-.238-2.957-.001-2.745.057-3.074.666-3.785.193-.226.568-.517.833-.648.47-.23.579-.239 3.839-.288 3.131-.048 3.386-.065 3.814-.264.626-.291 1.07-.687 1.4-1.247.27-.46.278-.522.311-2.29l.034-1.82.932.051c1.075.058 1.504.211 2.098.748.853.77.869.841.869 3.957 0 2.434-.02 2.783-.18 3.075a3.365 3.365 0 0 1-1.337 1.33l-.517.273-3.95.031-3.951.031.068.274c.037.151.164.377.282.503.209.224.262.229 2.433.229h2.22v1.05c0 1.653-.394 2.437-1.54 3.072l-.545.302-2.644.018c-1.455.01-2.782-.018-2.95-.063zm6.12-1.692c.22-.222.253-.325.206-.675-.07-.523-.278-.73-.732-.73-.467 0-.672.217-.735.78-.042.372-.012.496.163.672.3.3.77.28 1.097-.047z" fill="#fc0" stroke="#fc0" stroke-width=".102"/><path d="M9.349 22.38c-.911-.15-1.936-1.074-2.176-1.963-.073-.273-.101-1.279-.079-2.868.033-2.317.047-2.473.27-2.926.13-.263.401-.623.603-.8.674-.592.87-.63 3.484-.675 4.399-.076 4.927-.166 5.705-.967.642-.662.706-.9.774-2.883l.061-1.784.951.055c.523.031 1.11.122 1.304.204.54.225 1.358 1.042 1.472 1.47.153.572.243 3.18.16 4.617-.071 1.23-.093 1.327-.395 1.78-.193.288-.577.647-.966.903l-.647.425-3.922.008c-2.157.004-3.942.028-3.966.052-.115.115.354.82.587.883.14.038 1.181.073 2.314.079l2.06.01v.91c0 1.739-.326 2.446-1.454 3.162l-.631.4-2.543-.011c-1.398-.007-2.733-.043-2.966-.081zm5.98-1.718c.285-.256.313-.328.251-.658-.09-.483-.301-.682-.722-.682-.436 0-.625.193-.715.73-.065.384-.044.453.2.663.358.308.595.295.985-.053z" fill="#fdd835" stroke-width=".102"/><path d="M4.281 17.396c-.88-.215-1.714-.935-2.024-1.747-.149-.389-.168-.804-.142-3.041.027-2.26.054-2.638.215-2.962.259-.519.851-1.092 1.392-1.346.437-.206.632-.217 4.408-.245l3.95-.03-.067-.275a1.367 1.367 0 0 0-.282-.504c-.21-.224-.263-.23-2.433-.23h-2.22l.002-1.143c.003-1.338.157-1.795.84-2.493.746-.763 1.103-.838 4.025-.838 2.961 0 3.28.06 4.067.768.37.333.572.621.728 1.037.201.539.213.735.183 3.072-.035 2.777-.045 2.824-.78 3.598-.787.829-.76.824-4.59.883-3.812.06-3.797.057-4.61.806-.765.706-.917 1.2-.964 3.133l-.04 1.653-.677-.01c-.371-.007-.813-.045-.98-.086zM9.59 5.551c.237-.204.286-.326.286-.72 0-.547-.201-.763-.71-.763-.502 0-.765.248-.765.724 0 .492.141.782.439.902.345.14.444.12.75-.143z" fill="#3c78aa"/></symbol><symbol viewBox="0 0 24 24" id="r" xmlns="http://www.w3.org/2000/svg"><path d="M11.956 4.05c-5.694 0-10.354 3.106-10.354 6.947 0 3.396 3.686 6.212 8.531 6.813v2.205h3.53V17.82c.88-.093 1.699-.259 2.475-.497l1.43 2.692h3.996l-2.402-4.048c1.936-1.263 3.147-3.034 3.147-4.97 0-3.841-4.659-6.947-10.354-6.947m1.584 2.712c4.349 0 7.558 1.45 7.558 4.753 0 1.77-.952 3.013-2.505 3.779a1.081 1.081 0 0 1-.228-.156c-.373-.165-.994-.352-.994-.352s3.085-.227 3.085-3.302-3.23-3.127-3.23-3.127h-7.092v7.413c-2.64-.766-4.462-2.392-4.462-4.255 0-2.63 3.52-4.753 7.868-4.753m.156 4.12h2.143s.983-.05.983.974c0 1.004-.983 1.004-.983 1.004h-2.143v-1.977m-.031 4.566h.952c.186 0 .28.052.445.207.135.103.28.3.404.476-.57.073-1.17.104-1.801.104z" fill="#1976d2" stroke-width="1.035"/></symbol><symbol viewBox="0 0 24 24" id="raml" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="razor" xmlns="http://www.w3.org/2000/svg"><path d="M15.45 11.91c-.11-2.21-1.75-3.54-3.73-3.54h-.08c-2.29 0-3.55 1.8-3.55 3.84 0 2.29 1.53 3.74 3.54 3.74 2.25 0 3.72-1.65 3.83-3.59m-3.81-5.97c1.53 0 2.97.68 4.02 1.74 0-.51.33-.89.83-.89h.11c.74 0 .89.7.89.92v7.9c-.04.52.54.78.87.44 1.27-1.29 2.78-6.69-.79-9.81-3.33-2.92-7.8-2.44-10.18-.8-2.52 1.74-4.14 5.61-2.57 9.22 1.71 3.95 6.61 5.13 9.52 3.95 1.48-.59 2.15 1.4.65 2.05-2.34.99-8.77.89-11.78-4.32-2.03-3.52-1.93-9.71 3.46-12.92C10.81 1.42 16.24 2.1 19.5 5.5c3.45 3.6 3.25 10.3-.1 12.91-1.51 1.18-3.76.03-3.74-1.7l-.02-.56a5.611 5.611 0 0 1-3.99 1.66C8.63 17.81 6 15.15 6 12.13c0-3.05 2.63-5.74 5.65-5.74z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="react" xmlns="http://www.w3.org/2000/svg"><path d="M12 10.11c1.03 0 1.87.84 1.87 1.89 0 1-.84 1.85-1.87 1.85-1.03 0-1.87-.85-1.87-1.85 0-1.05.84-1.89 1.87-1.89M7.37 20c.63.38 2.01-.2 3.6-1.7-.52-.59-1.03-1.23-1.51-1.9a22.7 22.7 0 0 1-2.4-.36c-.51 2.14-.32 3.61.31 3.96m.71-5.74l-.29-.51c-.11.29-.22.58-.29.86.27.06.57.11.88.16l-.3-.51m6.54-.76l.81-1.5-.81-1.5c-.3-.53-.62-1-.91-1.47C13.17 9 12.6 9 12 9c-.6 0-1.17 0-1.71.03-.29.47-.61.94-.91 1.47L8.57 12l.81 1.5c.3.53.62 1 .91 1.47.54.03 1.11.03 1.71.03.6 0 1.17 0 1.71-.03.29-.47.61-.94.91-1.47M12 6.78c-.19.22-.39.45-.59.72h1.18c-.2-.27-.4-.5-.59-.72m0 10.44c.19-.22.39-.45.59-.72h-1.18c.2.27.4.5.59.72M16.62 4c-.62-.38-2 .2-3.59 1.7.52.59 1.03 1.23 1.51 1.9.82.08 1.63.2 2.4.36.51-2.14.32-3.61-.32-3.96m-.7 5.74l.29.51c.11-.29.22-.58.29-.86-.27-.06-.57-.11-.88-.16l.3.51m1.45-7.05c1.47.84 1.63 3.05 1.01 5.63 2.54.75 4.37 1.99 4.37 3.68 0 1.69-1.83 2.93-4.37 3.68.62 2.58.46 4.79-1.01 5.63-1.46.84-3.45-.12-5.37-1.95-1.92 1.83-3.91 2.79-5.38 1.95-1.46-.84-1.62-3.05-1-5.63-2.54-.75-4.37-1.99-4.37-3.68 0-1.69 1.83-2.93 4.37-3.68-.62-2.58-.46-4.79 1-5.63 1.47-.84 3.46.12 5.38 1.95 1.92-1.83 3.91-2.79 5.37-1.95M17.08 12c.34.75.64 1.5.89 2.26 2.1-.63 3.28-1.53 3.28-2.26 0-.73-1.18-1.63-3.28-2.26-.25.76-.55 1.51-.89 2.26M6.92 12c-.34-.75-.64-1.5-.89-2.26-2.1.63-3.28 1.53-3.28 2.26 0 .73 1.18 1.63 3.28 2.26.25-.76.55-1.51.89-2.26m9 2.26l-.3.51c.31-.05.61-.1.88-.16-.07-.28-.18-.57-.29-.86l-.29.51m-2.89 4.04c1.59 1.5 2.97 2.08 3.59 1.7.64-.35.83-1.82.32-3.96-.77.16-1.58.28-2.4.36-.48.67-.99 1.31-1.51 1.9M8.08 9.74l.3-.51c-.31.05-.61.1-.88.16.07.28.18.57.29.86l.29-.51m2.89-4.04C9.38 4.2 8 3.62 7.37 4c-.63.35-.82 1.82-.31 3.96a22.7 22.7 0 0 1 2.4-.36c.48-.67.99-1.31 1.51-1.9z" fill="#00bcd4"/></symbol><symbol viewBox="0 0 24 24" id="readme" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="reason" xmlns="http://www.w3.org/2000/svg"><path d="M3 3v18h18V3H3zm5.119 8.993h2.798c.382 0 .71.025.985.075.275.05.534.159.774.326.244.168.435.386.577.654.145.265.218.598.218 1 0 .552-.112 1.001-.335 1.35-.22.348-.536.638-.947.87l2.16 3.203H12.31l-1.763-2.742h-.77v2.742H8.12v-7.478zm6.594 0h4.676v1.447h-3.018v1.29h2.802v1.447h-2.802v1.848h3.018v1.446h-4.676v-7.478zM9.778 13.37v2.014h.513c.266 0 .49-.014.67-.044.18-.03.329-.1.45-.207a.96.96 0 0 0 .253-.34c.055-.128.082-.297.082-.508 0-.187-.034-.35-.1-.483a.698.698 0 0 0-.343-.317 1.086 1.086 0 0 0-.395-.095 6.012 6.012 0 0 0-.526-.02h-.604z" fill="#f44336" stroke-width="1.067"/></symbol><symbol viewBox="0 0 172 193" id="restql" xmlns="http://www.w3.org/2000/svg"><title>Group</title><g transform="translate(14.767 16.713) scale(.82795)" fill="none"><path d="M171.39 55.799c-.975-6.147-4.673-11.642-10.15-14.805L96.381 3.546C93.217 1.72 89.615.756 85.964.756s-7.253.964-10.415 2.788L10.69 40.992A20.896 20.896 0 0 0 .272 59.035v74.89a20.894 20.894 0 0 0 10.416 18.042l64.859 37.446c3.165 1.827 6.767 2.791 10.417 2.791s7.252-.964 10.415-2.79l64.859-37.445c5.479-3.166 9.178-8.66 10.152-14.808zm-16.516 85.147L90.017 178.39a8.104 8.104 0 0 1-8.108 0l-64.857-37.444a8.109 8.109 0 0 1-4.053-7.021v-74.89a8.109 8.109 0 0 1 4.053-7.021l64.857-37.446c1.254-.725 2.654-1.086 4.054-1.086s2.8.361 4.054 1.086l64.857 37.446a8.106 8.106 0 0 1 4.053 7.021v74.89a8.109 8.109 0 0 1-4.053 7.021z" fill="#83e8c2"/><path d="M158.93 59.035a8.109 8.109 0 0 0-4.053-7.021L90.02 14.568c-1.254-.725-2.654-1.086-4.054-1.086s-2.8.361-4.054 1.086L17.055 52.014a8.106 8.106 0 0 0-4.053 7.021v74.89a8.109 8.109 0 0 0 4.053 7.021l64.857 37.444a8.104 8.104 0 0 0 8.108 0l64.857-37.444a8.109 8.109 0 0 0 4.053-7.021zm-46.766 31.681c.119-.069.242-.118.365-.149.044-.012.088-.01.131-.018.076-.012.152-.029.228-.029l.015.001c.02.001.038.005.059.006.093.005.184.019.273.04l.1.03c.077.025.15.057.223.095.028.014.057.027.084.043.094.057.184.122.263.199.007.008.013.017.021.024.07.071.133.15.188.235.018.029.033.059.05.09.04.072.072.148.099.229a1.512 1.512 0 0 1 .081.46v16.209l-3.278 1.893a1.548 1.548 0 0 0-.678.83 1.533 1.533 0 0 0-.098.514v3.785l-14.038 8.104-.01.004a1.55 1.55 0 0 1-.354.146c-.045.012-.09.011-.135.018-.074.012-.15.029-.225.029l-.014-.001c-.02-.001-.039-.005-.059-.006a1.463 1.463 0 0 1-.273-.041c-.034-.008-.066-.019-.1-.03a1.318 1.318 0 0 1-.223-.094c-.029-.015-.057-.027-.084-.044a1.45 1.45 0 0 1-.263-.198c-.009-.008-.015-.019-.023-.027a1.495 1.495 0 0 1-.185-.232c-.019-.029-.034-.06-.051-.09a1.422 1.422 0 0 1-.098-.229 1.702 1.702 0 0 1-.033-.101 1.487 1.487 0 0 1-.048-.358l-.001-.002v-20.053a1.446 1.446 0 0 1 .727-1.255zM85.24 31.369a1.449 1.449 0 0 1 1.452 0l45.741 26.41a1.45 1.45 0 0 1 0 2.512l-17.366 10.027a1.457 1.457 0 0 1-1.452 0l-15.49-8.943 1.727-.996a1.552 1.552 0 0 0 0-2.688l-13.111-7.57c-.239-.139-.508-.207-.775-.207s-.535.068-.775.207l-3.278 1.893-14.038-8.104a1.451 1.451 0 0 1 0-2.513zM57.59 47.558c.251 0 .501.065.726.194l15.489 8.942-1.727.997a1.552 1.552 0 0 0 0 2.688l1.727.996-15.488 8.943a1.457 1.457 0 0 1-1.452 0L39.499 60.291a1.45 1.45 0 0 1 0-2.512l17.366-10.027c.225-.129.475-.194.725-.194zm-9.56 92.328c-.241 0-.489-.062-.724-.196l-17.365-10.026a1.45 1.45 0 0 1-.726-1.256V75.59c0-.847.694-1.453 1.452-1.453.242 0 .49.062.724.197l17.366 10.025c.449.26.726.738.726 1.257v17.886l-1.727-.997a1.552 1.552 0 0 0-2.327 1.344v15.139c0 .555.295 1.067.775 1.344l3.278 1.894v16.209a1.45 1.45 0 0 1-1.452 1.451zm29.828 14.929a1.452 1.452 0 0 1-2.177 1.257l-17.365-10.026a1.452 1.452 0 0 1-.726-1.257v-17.885l1.726.996c.25.145.515.211.773.211.811 0 1.554-.648 1.554-1.555v-1.993l15.489 8.942c.449.26.726.738.726 1.257zm0-32.768c0 .127-.02.246-.049.36-.009.035-.021.067-.032.101-.026.08-.059.157-.099.229-.017.03-.032.061-.05.09a1.48 1.48 0 0 1-.188.235l-.021.025a1.51 1.51 0 0 1-.264.199c-.026.016-.055.028-.082.043a1.597 1.597 0 0 1-.324.124 1.362 1.362 0 0 1-.278.041c-.018.001-.036.006-.055.006l-.015.001c-.077 0-.155-.018-.233-.03-.043-.007-.084-.005-.125-.017a1.484 1.484 0 0 1-.366-.149l-14.035-8.104v-3.784a1.545 1.545 0 0 0-.776-1.343l-3.276-1.892V91.976c0-.127.02-.246.049-.361.009-.034.021-.066.032-.1a1.33 1.33 0 0 1 .099-.229c.017-.03.032-.062.051-.091.054-.084.116-.163.187-.234l.021-.025c.079-.076.168-.142.263-.199.027-.016.056-.029.084-.043a1.476 1.476 0 0 1 .601-.166c.019 0 .036-.005.055-.005l.015-.001c.078 0 .157.018.236.03.04.007.081.005.122.017.124.031.246.08.366.149l17.361 10.023a1.456 1.456 0 0 1 .726 1.259zm-9.984-45.373a1.448 1.448 0 0 1-.544-.55 1.466 1.466 0 0 1 0-1.413c.121-.219.303-.41.544-.55l14.038-8.104 3.277 1.892c.48.276 1.071.276 1.551 0l3.278-1.893 14.038 8.105a1.45 1.45 0 0 1 0 2.513L86.691 86.7a1.447 1.447 0 0 1-1.452 0zm74.842 51.733c0 .518-.276.997-.726 1.256l-45.741 26.409a1.452 1.452 0 0 1-2.177-1.257v-20.053c0-.519.277-.997.727-1.257l15.488-8.941v1.992c0 .906.743 1.555 1.553 1.555.26 0 .523-.066.774-.21l13.11-7.57a1.55 1.55 0 0 0 .776-1.344v-3.784l14.038-8.105a1.452 1.452 0 0 1 2.177 1.257v20.052zm0-32.764c0 .519-.276.997-.726 1.256l-15.489 8.943v-1.993c0-.906-.744-1.554-1.554-1.554a1.519 1.519 0 0 0-.773.21l-1.727.996V85.616c0-.519.277-.997.727-1.257l17.365-10.025c.234-.135.482-.197.724-.197.758 0 1.453.606 1.453 1.453z" fill="#111d5a"/><g fill="#83e8c2"><path d="M59.402 90.568zM94.485 123.06zM94.771 123.29zM77.775 122.51zM77.072 123.33zM77.418 123.09zM77.856 122.05zM76.749 123.45zM94.119 122.41zM77.131 133.51l-15.489-8.942v1.993c0 .906-.743 1.555-1.554 1.555a1.53 1.53 0 0 1-.773-.211l-1.726-.996v17.885c0 .519.276.997.726 1.257l17.365 10.026a1.452 1.452 0 0 0 2.177-1.257v-20.053a1.454 1.454 0 0 0-.726-1.257zM94.25 122.74zM110.28 111.42zM94.494 100.98c.088-.089.189-.168.303-.232l17.365-10.026-17.365 10.026a1.392 1.392 0 0 0-.303.232zM77.627 122.83zM58.027 90.936zM58.374 90.693zM59.044 90.521l-.015.001c.083-.001.167.015.251.029-.079-.012-.158-.03-.236-.03zM57.819 91.195zM58.696 90.568zM57.589 91.977zM76.043 123.46zM57.67 91.516zM75.677 123.31l-14.035-8.11zM76.401 123.5l.015-.001c-.082.001-.166-.016-.248-.029.078.012.156.03.233.03zM112.16 90.716zM77.662 101.27zM113.64 90.734zM96.237 123.31zM113.33 90.597zM112.89 90.52c-.075 0-.151.018-.228.029.081-.014.162-.029.242-.028l-.014-.001zM141.26 74.137c-.241 0-.489.062-.724.197l-17.365 10.025c-.449.26-.727.738-.727 1.257v17.885l1.727-.996c.25-.145.515-.211.773-.21.81 0 1.554.647 1.554 1.554v1.993l15.489-8.943a1.45 1.45 0 0 0 .726-1.256V75.59c0-.847-.695-1.453-1.453-1.453zM112.96 90.526zM95.523 123.5c.074 0 .15-.018.225-.029-.08.013-.159.028-.238.028l.013.001zM95.451 123.5zM85.238 86.7zM95.078 123.43zM141.26 106.9c-.241 0-.489.062-.724.196l-14.038 8.105v3.784c0 .555-.296 1.067-.776 1.344l-13.11 7.57c-.251.144-.515.21-.774.21-.81 0-1.553-.648-1.553-1.555v-1.992l-15.488 8.941c-.449.26-.727.738-.727 1.257v20.053a1.452 1.452 0 0 0 2.177 1.257l45.741-26.409a1.45 1.45 0 0 0 .726-1.256v-20.053a1.454 1.454 0 0 0-1.454-1.452zM67.871 41.396a1.451 1.451 0 0 0 0 2.513l14.038 8.104 3.278-1.893c.24-.139.508-.207.775-.207s.536.068.775.207l13.111 7.57a1.552 1.552 0 0 1 0 2.688l-1.727.996 15.49 8.943a1.457 1.457 0 0 0 1.452 0l17.366-10.027a1.45 1.45 0 0 0 0-2.512l-45.741-26.41a1.449 1.449 0 0 0-1.452 0zM39.497 57.779a1.45 1.45 0 0 0 0 2.512l17.366 10.027a1.457 1.457 0 0 0 1.452 0l15.488-8.943-1.727-.996a1.552 1.552 0 0 1 0-2.688l1.727-.997-15.489-8.942a1.458 1.458 0 0 0-1.451 0zM49.481 138.43v-16.209l-3.278-1.894a1.55 1.55 0 0 1-.775-1.344v-15.139c0-.906.743-1.555 1.554-1.554.259 0 .523.065.773.21l1.727.997V85.611a1.45 1.45 0 0 0-.726-1.257L31.39 74.33a1.436 1.436 0 0 0-.724-.197c-.758 0-1.452.606-1.452 1.453v52.817c0 .518.276.997.726 1.256l17.365 10.026a1.45 1.45 0 0 0 2.176-1.255zM114.34 108.18l-3.278 1.893 3.278-1.893V91.971zM114.11 91.193zM114.16 91.283z"/></g><g fill="#de5941"><path d="M94.494 100.98a1.45 1.45 0 0 0-.424 1.023v20.053l.001.002c0 .126.02.244.048.358.01.034.021.066.033.101.026.08.059.156.098.229.017.03.032.061.051.09.055.084.115.162.185.232.009.009.015.02.023.027.079.077.169.142.263.198.027.017.055.029.084.044a1.46 1.46 0 0 0 .596.165c.02.001.039.005.059.006.079 0 .158-.016.238-.028.045-.007.09-.006.135-.018.119-.031.238-.08.354-.146l.01-.004 14.038-8.104v-3.785c0-.18.04-.35.098-.514.122-.343.353-.643.678-.83l3.278-1.893V91.977c0-.127-.021-.246-.049-.361-.009-.033-.021-.065-.032-.099a1.266 1.266 0 0 0-.099-.229c-.017-.031-.032-.061-.05-.09a1.425 1.425 0 0 0-.188-.235l-.021-.024a1.41 1.41 0 0 0-.263-.199c-.027-.016-.056-.029-.084-.043a1.509 1.509 0 0 0-.323-.125 1.591 1.591 0 0 0-.273-.04c-.021-.001-.039-.005-.059-.006-.08-.001-.161.015-.242.028-.043.008-.087.006-.131.018-.123.031-.246.08-.365.149l-17.365 10.026a1.447 1.447 0 0 0-.302.233zM77.13 100.74L59.769 90.717a1.424 1.424 0 0 0-.366-.149c-.041-.012-.082-.01-.122-.017-.084-.015-.168-.03-.251-.029-.019 0-.036.005-.055.005-.095.005-.188.02-.278.041-.034.009-.065.02-.099.03a1.406 1.406 0 0 0-.224.095c-.028.014-.057.027-.084.043a1.515 1.515 0 0 0-.263.199l-.021.025c-.07.071-.133.15-.187.234-.019.029-.034.061-.051.091-.04.073-.072.149-.099.229a1.463 1.463 0 0 0-.081.461v16.206l3.276 1.892a1.547 1.547 0 0 1 .776 1.343v3.784l14.035 8.104c.119.068.242.117.366.149.041.012.082.01.125.017.082.014.166.03.248.029.019 0 .037-.005.055-.006.095-.004.188-.019.278-.041.034-.008.065-.019.099-.029.077-.025.152-.058.225-.095.027-.015.056-.027.082-.043.095-.058.185-.123.264-.199l.021-.025c.07-.071.133-.15.188-.235.018-.029.033-.06.05-.09.04-.072.072-.149.099-.229a1.448 1.448 0 0 0 .081-.461v-20.047a1.456 1.456 0 0 0-.726-1.259zM86.689 86.7l17.365-10.026a1.45 1.45 0 0 0 0-2.513l-14.038-8.105-3.278 1.893a1.556 1.556 0 0 1-1.551 0l-3.277-1.892-14.038 8.104c-.241.14-.423.331-.544.55a1.466 1.466 0 0 0 0 1.413c.121.218.303.41.544.55L85.238 86.7a1.447 1.447 0 0 0 1.451 0z"/></g></g></symbol><symbol viewBox="0 0 24 24" id="riot" xmlns="http://www.w3.org/2000/svg"><defs><path d="M13.26 3.04l.58.05.54.07.52.09.49.11.46.13.44.14.41.16.39.17.36.19.33.21.32.22.29.23.26.25.22.22.2.22.19.24.17.24.15.25.15.26.12.27.12.28.1.29.08.31.07.31.05.32.04.34.02.35.01.37v.05l-.02.51-.05.49-.09.48-.13.45-.15.43-.19.4-.22.39-.26.37-.28.34-.31.33-.33.3-.37.28-.39.27-.41.24-.44.22L21 21h-7.04l-3.48-5.14H9.17V21H3V3h9.01l.64.01.61.03zm-4.09 8.52h2.66l.99-.11.75-.35.47-.55.16-.74v-.05l-.17-.75-.47-.54-.74-.32-.96-.11H9.17v3.52z" id="ija"/></defs><use xlink:href="#ija" fill="#ff1744"/><use xlink:href="#ija" fill-opacity="0" stroke="#000" stroke-opacity="0"/></symbol><symbol viewBox="0 0 24 24" id="robot" xmlns="http://www.w3.org/2000/svg"><path d="M12.05 2.804a1.787 1.787 0 0 1 1.788 1.788c0 .661-.357 1.242-.893 1.546v1.135h.893a6.256 6.256 0 0 1 6.256 6.256h.894a.894.894 0 0 1 .893.893v2.681a.894.894 0 0 1-.893.894h-.894v.894a1.787 1.787 0 0 1-1.787 1.787H5.795a1.787 1.787 0 0 1-1.787-1.787v-.894h-.894a.894.894 0 0 1-.894-.894v-2.68a.894.894 0 0 1 .894-.894h.894a6.256 6.256 0 0 1 6.255-6.256h.894V6.138a1.773 1.773 0 0 1-.894-1.546 1.787 1.787 0 0 1 1.788-1.788m-4.022 9.83a2.234 2.234 0 0 0-2.234 2.235 2.234 2.234 0 0 0 2.234 2.234 2.234 2.234 0 0 0 2.234-2.234 2.234 2.234 0 0 0-2.234-2.234m8.043 0a2.234 2.234 0 0 0-2.234 2.234 2.234 2.234 0 0 0 2.234 2.234 2.234 2.234 0 0 0 2.235-2.234 2.234 2.234 0 0 0-2.235-2.234z" fill="#ff5722" stroke-width=".894"/></symbol><symbol viewBox="100 100 800 800" id="rollup" xmlns="http://www.w3.org/2000/svg"><style>.ilst0{fill:url(#ilXMLID_4_)}.ilst1{fill:url(#ilXMLID_5_)}.ilst2{fill:url(#ilXMLID_8_)}.ilst3{fill:url(#ilXMLID_9_)}.ilst4{fill:url(#ilXMLID_11_)}.ilst5{opacity:.3;fill:url(#ilXMLID_16_)}</style><g id="ilXMLID_14_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_4_" x1="444.47" x2="598.47" y1="526.05" y2="562.05" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_15_" class="ilst0" d="M721 410c0-33.6-8.8-65.1-24.3-92.4-41.1-42.3-130.5-52.1-152.7-.2-22.8 53.2 38.3 112.4 65 107.7 34-6-6-84-6-84 52 98 40 68-54 158S359 779 345 787c-.6.4-1.2.7-1.9 1h368.7c6.5 0 10.7-6.9 7.8-12.7l-96.4-190.8c-2.1-4.1-.6-9.2 3.4-11.5C683 540.6 721 479.8 721 410z" fill="url(#ilXMLID_4_)"/></g><g id="ilXMLID_2_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_5_" x1="420.38" x2="696.38" y1="475" y2="689" gradientUnits="userSpaceOnUse"><stop stop-color="#BF3338" offset="0"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_10_" class="ilst1" d="M721 410c0-33.6-8.8-65.1-24.3-92.4-41.1-42.3-130.5-52.1-152.7-.2-22.8 53.2 38.3 112.4 65 107.7 34-6-6-84-6-84 52 98 40 68-54 158S359 779 345 787c-.6.4-1.2.7-1.9 1h368.7c6.5 0 10.7-6.9 7.8-12.7l-96.4-190.8c-2.1-4.1-.6-9.2 3.4-11.5C683 540.6 721 479.8 721 410z" fill="url(#ilXMLID_5_)"/></g><linearGradient id="ilXMLID_8_" x1="429.39" x2="469.39" y1="517.16" y2="559.16" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_3_" class="ilst2" d="M329.82 813.46c15.58-8.903 122.41-220.34 227.02-320.5s117.96-66.771 60.094-175.83c0 0-221.46 310.49-301.58 464.06" fill="url(#ilXMLID_8_)" stroke-width="1.113"/><g id="ilXMLID_7_" transform="translate(-54.117 -62.353) scale(1.1129)"><linearGradient id="ilXMLID_9_" x1="502.11" x2="490.11" y1="589.46" y2="417.46" gradientUnits="userSpaceOnUse"><stop stop-color="#FF6533" offset="0"/><stop stop-color="#FF5633" offset=".157"/><stop stop-color="#FF4333" offset=".434"/><stop stop-color="#FF3733" offset=".714"/><stop stop-color="#F33" offset="1"/></linearGradient><path id="ilXMLID_12_" class="ilst3" d="M373 537c134.4-247.1 152-272 222-272 36.8 0 73.9 16.6 97.9 46.1-32.7-52.7-90.6-88-156.9-89H307.7c-4.8 0-8.7 3.9-8.7 8.7V691c13.6-35.1 36.7-85.3 74-154z" fill="url(#ilXMLID_9_)"/></g><linearGradient id="ilXMLID_11_" x1="450.12" x2="506.94" y1="514.21" y2="552.85" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FBB040" offset="0"/><stop stop-color="#FB8840" offset="1"/></linearGradient><path id="ilXMLID_6_" class="ilst4" d="M556.84 492.96c-104.61 100.16-211.44 311.6-227.02 320.5s-41.732 10.016-55.643-5.564c-14.801-16.582-37.837-43.401 86.802-272.65 149.57-274.99 169.15-302.7 247.05-302.7 40.953 0 82.24 18.473 108.95 51.302 1.447 2.337 2.893 4.785 4.34 7.233-45.738-47.074-145.23-57.98-169.93-.222-25.373 59.204 42.622 125.08 72.335 119.85 37.837-6.677-6.677-93.48-6.677-93.48 57.757 108.95 44.403 75.563-60.205 175.72z" fill="url(#ilXMLID_11_)" stroke-width="1.113"/><linearGradient id="ilXMLID_16_" x1="508.33" x2="450.33" y1="295.76" y2="933.76" gradientTransform="translate(-54.117 -62.353) scale(1.1129)" gradientUnits="userSpaceOnUse"><stop stop-color="#FFF" offset="0"/><stop stop-color="#FFF" stop-opacity="0" offset="1"/></linearGradient><path id="ilXMLID_13_" class="ilst5" d="M373.22 547.49c149.57-274.99 169.15-302.7 247.05-302.7 33.719 0 67.661 12.575 93.48 35.277-26.708-30.492-66.326-47.519-105.72-47.519-77.9 0-97.486 27.71-247.05 302.7-124.64 229.25-101.6 256.07-86.802 272.65 2.114 2.337 4.563 4.34 7.122 6.01-13.02-18.919-18.807-62.877 91.922-266.42z" fill="url(#ilXMLID_16_)" opacity=".3" stroke-width="1.113"/></symbol><symbol viewBox="0 0 24 24" id="ruby" xmlns="http://www.w3.org/2000/svg"><path d="M16 9h3l-5 7m-4-7h4l-2 8M5 9h3l2 7m5-12h2l2 3h-3m-5-3h2l1 3h-4M7 4h2L8 7H5m1-5L2 8l10 14L22 8l-4-6H6z" fill="#f44336"/></symbol><symbol viewBox="0 0 144 144" id="rust" xmlns="http://www.w3.org/2000/svg"><path d="M68.252 26.206a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0M25.766 58.451a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m84.97.166a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m-74.661 4.88a3.252 3.252 0 0 0 1.651-4.29l-1.58-3.574h6.214v28.01H29.823a43.847 43.847 0 0 1-1.42-16.738zm25.994.688v-8.256h14.798c.764 0 5.397.883 5.397 4.347 0 2.877-3.553 3.908-6.475 3.908zm-20.203 44.452a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m52.769.166a3.561 3.561 0 0 1 7.123 0 3.561 3.561 0 0 1-7.123 0m1.101-8.076a3.246 3.246 0 0 0-3.856 2.498l-1.787 8.342a43.847 43.847 0 0 1-36.566-.175l-1.787-8.342a3.246 3.246 0 0 0-3.854-2.497l-7.365 1.581a43.847 43.847 0 0 1-3.808-4.488h35.834c.406 0 .676-.074.676-.443V84.527c0-.369-.27-.442-.676-.442h-10.48V76.05h11.335c1.035 0 5.532.296 6.97 6.045.45 1.768 1.44 7.519 2.116 9.36.674 2.065 3.417 6.19 6.34 6.19h18.501a43.847 43.847 0 0 1-4.06 4.7zm19.898-33.468a43.847 43.847 0 0 1 .093 7.612h-4.499c-.45 0-.631.296-.631.737v2.066c0 4.863-2.742 5.92-5.145 6.19-2.288.258-4.825-.958-5.138-2.358-1.35-7.593-3.6-9.214-7.152-12.016 4.409-2.8 8.996-6.93 8.996-12.457 0-5.97-4.092-9.729-6.881-11.572-3.914-2.58-8.246-3.096-9.415-3.096H39.336A43.847 43.847 0 0 1 63.867 28.52l5.484 5.753a3.243 3.243 0 0 0 4.59.105l6.137-5.869a43.847 43.847 0 0 1 30.017 21.38l-4.201 9.487a3.256 3.256 0 0 0 1.652 4.29zm10.477.154l-.143-1.467 4.327-4.036c.88-.82.55-2.472-.574-2.891l-5.532-2.068-.433-1.428 3.45-4.792c.704-.974.058-2.53-1.127-2.724l-5.833-.949-.7-1.31 2.45-5.38c.502-1.095-.43-2.496-1.636-2.45l-5.92.206-.935-1.135 1.36-5.766c.275-1.17-.913-2.36-2.084-2.085l-5.765 1.359-1.136-.935.207-5.92c.046-1.198-1.357-2.135-2.45-1.637l-5.379 2.452-1.31-.703-.95-5.833c-.193-1.183-1.75-1.83-2.723-1.128l-4.796 3.45-1.425-.432-2.068-5.532c-.42-1.127-2.072-1.452-2.89-.576l-4.036 4.33-1.467-.143-3.117-5.036c-.63-1.02-2.318-1.02-2.946 0l-3.117 5.036-1.467.143-4.037-4.33c-.819-.876-2.47-.551-2.89.576l-2.069 5.532-1.426.432-4.795-3.45c-.974-.703-2.53-.055-2.723 1.128l-.951 5.833-1.31.703-5.379-2.452c-1.093-.5-2.496.439-2.45 1.637l.206 5.92-1.136.935-5.765-1.36c-1.171-.272-2.36.915-2.086 2.086l1.358 5.766-.933 1.135-5.92-.206c-1.193-.035-2.134 1.355-1.637 2.45l2.453 5.38-.703 1.31-5.832.949c-1.185.192-1.827 1.75-1.128 2.724l3.45 4.792-.433 1.428-5.532 2.068c-1.123.42-1.452 2.07-.574 2.891l4.328 4.036-.143 1.467-5.035 3.116c-1.02.63-1.02 2.318 0 2.946l5.035 3.117.143 1.467-4.328 4.037c-.878.818-.549 2.468.574 2.89l5.532 2.068.433 1.428-3.45 4.793c-.701.976-.056 2.532 1.129 2.723l5.831.948.703 1.312-2.453 5.378c-.5 1.093.444 2.5 1.638 2.451l5.917-.207.935 1.136-1.358 5.768c-.275 1.168.915 2.355 2.086 2.08l5.765-1.357 1.137.932-.207 5.921c-.046 1.199 1.357 2.136 2.45 1.636l5.379-2.45 1.31.702.95 5.83c.193 1.187 1.75 1.829 2.725 1.13l4.792-3.453 1.427.435 2.069 5.53c.42 1.123 2.072 1.454 2.89.574l4.037-4.328 1.467.146 3.117 5.035c.628 1.016 2.316 1.018 2.946 0l3.117-5.035 1.467-.146 4.036 4.328c.818.88 2.47.549 2.89-.574l2.068-5.53 1.428-.435 4.793 3.453c.974.699 2.53.055 2.722-1.13l.952-5.83 1.31-.703 5.378 2.451c1.093.5 2.493-.435 2.45-1.636l-.206-5.92 1.135-.933 5.765 1.357c1.171.275 2.36-.912 2.085-2.08l-1.358-5.768.932-1.136 5.92.207c1.194.048 2.138-1.358 1.636-2.451l-2.45-5.378.7-1.312 5.833-.948c1.187-.19 1.831-1.747 1.127-2.723l-3.45-4.793.433-1.428 5.532-2.068c1.125-.422 1.454-2.072.574-2.89l-4.327-4.037.143-1.467 5.035-3.117c1.02-.628 1.021-2.315.001-2.946z" fill="#ff7043" stroke-width="1.146"/></symbol><symbol viewBox="0 0 500 500" id="sass" xmlns="http://www.w3.org/2000/svg"><path d="M422.676 96.573c-12.192-47.839-91.508-63.557-166.575-36.892-44.68 15.877-93.029 40.786-127.81 73.311-41.349 38.675-47.943 72.328-45.216 86.395 9.583 49.622 77.585 82.069 105.535 106.126v.144c-8.246 4.05-68.565 34.584-82.684 65.799-14.893 32.932 2.372 56.556 13.804 59.742 35.424 9.859 71.764-7.866 91.311-37.01 18.853-28.12 17.28-64.422 9.086-82.487 11.3-2.976 24.476-4.314 41.218-2.36 47.248 5.52 56.517 35.017 54.747 47.366-1.77 12.35-11.681 19.14-14.998 21.186-3.317 2.045-4.326 2.766-4.05 4.287.405 2.215 1.94 2.137 4.758 1.652 3.894-.656 24.804-10.042 25.709-32.828 1.14-28.933-26.587-61.302-75.684-60.45-20.216.354-32.933 2.268-42.123 5.69-.681-.774-1.363-1.547-2.084-2.307-30.35-32.382-86.46-55.285-84.088-98.824.866-15.823 6.372-57.5 107.817-108.052 83.104-41.415 149.637-30.009 161.135-4.76 16.427 36.08-35.554 103.137-121.858 112.812-32.88 3.684-50.198-9.059-54.498-13.804-4.536-4.995-5.204-5.218-6.909-4.287-2.753 1.533-1.01 5.938 0 8.574 2.583 6.712 13.15 18.603 31.176 24.515 15.863 5.205 54.459 8.063 101.156-9.99 52.283-20.255 93.12-76.523 81.125-123.548zM200.213 340.34c3.92 14.5 3.487 28.016-.564 40.248a65.289 65.289 0 0 1-3.225 7.97c-3.12 6.477-7.316 12.534-12.442 18.132-15.653 17.069-37.507 23.532-46.88 18.092-10.122-5.874-5.048-29.944 13.083-49.11 19.52-20.636 47.602-33.903 47.602-33.903l-.039-.079 2.465-1.35z" fill="#ec407a" stroke="#ec407a" stroke-width="16.286552999999998"/></symbol><symbol viewBox="0 0 300 300" id="sbt" xmlns="http://www.w3.org/2000/svg"><path d="M105.46 209.517c-7.875 0-13.452-7.521-13.452-15.37v-.327c0-7.848 5.578-13.735 13.452-13.735h164.05c1.476-4.905 2.625-11.446 3.281-17.986h-137.81c-7.875 0-14.273-6.05-14.273-13.898s6.398-13.898 14.273-13.898h137.31c-.82-6.54-1.969-13.081-3.773-17.986h-104.01c-7.875 0-14.273-6.05-14.273-13.898s6.398-13.898 14.273-13.898h91.87c-21.327-37.607-60.864-61.315-106.14-61.315-67.918 0-123.04 54.448-123.04 122.3 0 67.856 55.122 123.28 123.04 123.28 46.59 0 87.112-25.507 107.95-63.114h-152.73z" fill="#0277bd" stroke-width="1.638"/></symbol><symbol viewBox="0 0 256 256" id="scala" xmlns="http://www.w3.org/2000/svg"><path fill="#f44336" fill-rule="evenodd" stroke-width=".3" d="M59.607 50.647l149.097-21.982v49.488L59.607 100.135zM59.593 114.08L208.69 92.098v49.488L59.593 163.568zM59.587 177.358l149.097-21.982v49.488L59.587 226.846z"/><path fill="#f44336" fill-rule="evenodd" stroke-width=".3" d="M62.425 91.414l95.605 30.923-2.832 8.757-95.605-30.922zM113.084 61.13l95.604 30.922-2.832 8.757-95.605-30.922zM62.425 154.79l95.605 30.922-2.833 8.758-95.604-30.923zM113.097 124.408l95.604 30.923-2.832 8.757-95.605-30.922z"/></symbol><symbol viewBox="0 0 24 24" id="settings" xmlns="http://www.w3.org/2000/svg"><path d="M12 15.5A3.5 3.5 0 0 1 8.5 12 3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5 3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.64.07-.97 0-.33-.03-.66-.07-1l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65A.506.506 0 0 0 14 2h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 11c-.04.34-.07.67-.07 1 0 .33.03.65.07.97l-2.11 1.66c-.19.15-.25.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1.01c.52.4 1.06.74 1.69.99l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.26 1.17-.59 1.69-.99l2.49 1.01c.22.08.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.66z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="shaderlab" xmlns="http://www.w3.org/2000/svg"><path d="M9.11 17H6.5l-4.91-5L6.5 7h2.61l1.31-2.26L17.21 3l1.87 6.74L17.77 12l1.31 2.26L17.21 21l-6.79-1.74L9.11 17m.14-.25l5.13 1.38L11.42 13H5.5l3.75 3.75m6.87.38L17.5 12l-1.38-5.13L13.15 12l2.97 5.13M9.25 7.25L5.5 11h5.92l2.96-5.13-5.13 1.38z" fill="#1976d2"/></symbol><symbol viewBox="0 0 24 24" id="slim" xmlns="http://www.w3.org/2000/svg"><path d="M6.959 2.5a4.605 4.605 0 0 0-4.615 4.615v9.957a4.605 4.605 0 0 0 4.615 4.615h9.957a4.605 4.605 0 0 0 4.615-4.615V7.115A4.605 4.605 0 0 0 16.916 2.5zm4.938 2.691a6.811 6.811 0 0 1 6.81 6.813H13.43L9.938 7.287l.699 4.717H5.086a6.811 6.811 0 0 1 6.81-6.813z" fill="#f57f17"/></symbol><symbol id="smarty" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><style>.iust0{fill:#ffce00}</style><path class="iust0" d="M9.14 20.606c0 .556.398.953.954.953h3.812c.556 0 .953-.397.953-.953v-.953H9.141zM12 2.5c-3.653 0-6.671 3.018-6.671 6.671 0 2.303 1.112 4.289 2.859 5.48v2.144c0 .556.397.953.953.953h5.718c.556 0 .953-.397.953-.953V14.65c1.747-1.191 2.86-3.177 2.86-5.48 0-3.653-3.019-6.671-6.672-6.671zm2.7 10.563l-.794.555v2.224h-3.812v-2.224l-.794-.555A4.712 4.712 0 0 1 7.235 9.17 4.78 4.78 0 0 1 12 4.405a4.78 4.78 0 0 1 4.765 4.765 4.712 4.712 0 0 1-2.065 3.892z"/></symbol><symbol viewBox="0 0 200 200" id="snyk" xmlns="http://www.w3.org/2000/svg"><title>Group 2</title><g transform="translate(15.255 18.22) scale(1.8477)" fill="none" fill-rule="evenodd"><path d="M65.161 24.997c-1.656 5.974-5.255 23.587-5.255 23.587s-6.618-2.464-14.148-2.476h-.055c-.413.002-.822.012-1.23.026v41.649h6.677v.003h5.815v-.003h20.858c.111-8.177-2.036-27.066-2.036-27.066-1.088-2.279.46-7.668.46-7.668-8.869-9.092-11.086-28.051-11.086-28.051zm-3.357 43.958c5.476 0 1.381 4.64.9 5.168H52.35c.944-1.18 4.504-5.168 9.453-5.168z" fill="#607d8b" stroke-width="1.6"/><path d="M26.366 24.995s-2.217 18.961-11.087 28.053c0 0 1.548 5.391.46 7.669 0 0-2.15 18.895-2.038 27.066h19.273v.003h7.079v-.003h5.744V46.107h-.025c-7.532.013-14.151 2.478-14.151 2.478s-3.6-17.615-5.255-23.59zm3.264 43.96c4.95 0 8.51 3.987 9.452 5.168H28.73c-.479-.528-4.573-5.168.9-5.168z" fill="#90a4ae" stroke-width="1.6"/><g transform="translate(23.76 77.45) scale(1.5998)"><g transform="translate(17.526)"><path d="M7.357.06H.177v.075C.177 2.64 2.345 4.67 4.89 4.67 7.431 4.67 9.6 2.64 9.6.135V.059z" fill="#455a64"/><path d="M1.972.06v.075a2.692 2.692 0 1 0 5.386 0V.059z" fill="#fff"/><path d="M5.496.06H4.234c-.012 0-.023.005-.034.007.157.033.243.388.21.624a.721.721 0 0 1-.71.617c.102.471.487.85.997.922a1.188 1.188 0 0 0 1.35-1.007C6.112.743 5.881.06 5.495.06z" fill="#37474f"/></g><path d="M7.552.06H.372v.075c0 2.505 2.17 4.535 4.712 4.535 2.544 0 4.712-2.03 4.712-4.535V.059z" fill="#455a64"/><path d="M2.168.06v.075a2.692 2.692 0 1 0 5.385 0V.059z" fill="#fff"/><path d="M5.692.06H4.428c-.01 0-.022.005-.032.007.156.033.242.388.21.624a.72.72 0 0 1-.712.617c.104.471.488.85.999.922A1.187 1.187 0 0 0 6.24 1.223C6.308.743 6.078.06 5.69.06z" fill="#37474f"/></g><path d="M25.514-.27l-4.202 7.697C19.838 10.17 6.858 34.465 6.858 43.243v.516L12.8 59.573c-.8 7.258-2.203 21.643-1.78 28.21h5.73c-.354-3.787.648-17.008 1.903-28.25l.076-.677-1.075-2.892c3.694-3.868 6.285-9.193 8.073-14.261l.174 1.235 5.869 9.629 2.291-.983c.058-.024 5.935-2.523 11.643-2.523 5.672 0 11.646 2.5 11.702 2.525l2.29.976 5.86-9.626.23-1.608c1.769 5.117 4.358 10.536 8.07 14.49l-1.127 3.035.076.678c1.259 11.286 2.266 24.564 1.916 28.252h5.677c.406-6.567-1.05-20.952-1.848-28.208l5.838-15.817v-.514c0-8.779-12.876-33.074-14.347-35.816L65.923-.27l-5.897 41.229-2.723 4.478c-2.628-.882-7.1-2.11-11.603-2.11-4.498 0-8.94 1.225-11.557 2.108l-2.722-4.476-2.07-14.452a.832.832 0 0 0 .006-.071l-.016-.004zm-3.166 18.39l1.206 8.407c-.46 3.143-2.561 15.47-8.198 23.24l-2.598-6.99c.325-4.554 5.067-15.462 9.59-24.656zm46.763 0c4.523 9.194 9.267 20.104 9.592 24.657L76.166 49.6c-6.09-8.553-8-22.459-8.166-23.73z" fill="#607d8b" stroke-width="1.6"/></g></symbol><symbol viewBox="0 0 24 24" id="solidity" xmlns="http://www.w3.org/2000/svg"><path d="M5.8 14.05l6.253 8.61 6.252-8.61-6.254 3.807z" fill="#0288d1" stroke-width="4.553" stroke-linejoin="round"/><path d="M12.051 1.347L5.8 11.833l6.252 3.807 6.254-3.807z" fill="#0288d1" stroke-width="5.025" stroke-linejoin="round"/></symbol><symbol viewBox="0 0 120 120" id="sonar" xmlns="http://www.w3.org/2000/svg"><style>.a,.b{fill:#fff}.b{stroke:#fff;stroke-miterlimit:10}</style><path d="M115.45 23.033S97.961 33.27 97.534 33.412c-.427.284-.852.57-1.137.854-1.422 1.421-1.848 3.41-1.422 5.26.285.852.711 1.849 1.422 2.56.711.71 1.564 1.137 2.559 1.422 1.848.426 3.84 0 5.262-1.422.426-.427.709-.853.851-1.28l.143-.427 2.56-4.692zm-39.102 9.242c-27.441 0-31.99 13.08-31.99 29.29 0 3.838.569 7.962-1.99 11.942-3.84 5.972-8.957 5.828-10.236 5.828-1.706 0-7.962-.993-8.246-2.841h.994c6.682 0 11.658-5.404 11.658-12.655v-2.56h-5.686c-4.123 0-7.82 1.849-10.238 5.12-2.417-3.271-6.113-5.12-10.236-5.12h-5.83v2.56c0 7.11 5.688 12.795 12.797 12.795h1.848c0 4.124 5.687 20.332 47.63 20.332 16.352 0 40.665-2.843 40.665-33.697 0-5.829-1.848-11.23-4.691-15.78-.996.284-1.992.568-3.13.568a8.92 8.92 0 0 1-8.956-8.957c0-.995.141-1.991.425-2.986-4.265-2.702-8.53-3.838-14.787-3.838z" fill="#1e88e5" stroke-width="1.422"/></symbol><symbol viewBox="0 0 412 395" id="stylelint" xmlns="http://www.w3.org/2000/svg"><title>stylelint-icon-white</title><g transform="translate(31.478 29.499) scale(.84775)" fill="#cfd8dc" fill-rule="evenodd"><path d="M208.8 393.05c45.057-161.12 43.75-161.85 76.32-276.73l7.832 4.523c4.255 2.458 7.738.448 7.738-4.455V61.602c8.643-30.27 15.416-53.66 17.4-60.693h35.287l58.618 54.304-38.498 33.27 29.11 31.473-191.86 273.09c-.938 1.542-2.244 1.19-1.947 0zm20.96-347.28c1.733 0 3.148.958 3.148 2.147v28.077c0 1.186-1.415 2.15-3.147 2.15h-47.396c-1.742 0-3.153-.96-3.153-2.15V47.917c0-1.185 1.41-2.147 3.153-2.147h47.396z"/><path d="M288.26 14.688l-52.14 30.1c.605.92.973 1.98.973 3.136v28.078c0 1.457-.565 2.77-1.496 3.83l52.663 30.402c3.59 2.073 6.535.377 6.535-3.764V18.456c0-4.145-2.944-5.836-6.535-3.768zM175.02 76V47.923c0-1.15.368-2.21.966-3.13l-52.14-30.105c-3.588-2.068-6.53-.376-6.53 3.768v88.013c0 4.14 2.938 5.84 6.53 3.76l52.66-30.405c-.926-1.06-1.487-2.37-1.487-3.827z"/><path d="M201.25 393.05h1.947c-45.05-161.12-43.753-161.85-76.32-276.73l-7.833 4.523c-4.253 2.458-7.737.448-7.737-4.455V61.602C102.662 31.332 95.892 7.942 93.902.909H58.619L.002 55.213l38.494 33.27-29.11 31.473z"/><circle cx="204.57" cy="122.54" r="14.231"/><circle cx="204.57" cy="207.16" r="14.231"/><circle cx="204.57" cy="291.78" r="14.23"/></g></symbol><symbol viewBox="0 0 412 395" id="stylelint_light" xmlns="http://www.w3.org/2000/svg"><title>stylelint-icon-black</title><g transform="translate(31.478 29.499) scale(.84775)" fill="#546e7a" fill-rule="evenodd"><path d="M208.8 393.05c45.057-161.12 43.75-161.85 76.32-276.73l7.832 4.523c4.255 2.458 7.738.448 7.738-4.455V61.602c8.643-30.27 15.416-53.66 17.4-60.693h35.287l58.618 54.304-38.498 33.27 29.11 31.473-191.86 273.09c-.938 1.542-2.244 1.19-1.947 0zm20.96-347.28c1.733 0 3.148.958 3.148 2.147v28.077c0 1.186-1.415 2.15-3.147 2.15h-47.396c-1.742 0-3.153-.96-3.153-2.15V47.917c0-1.185 1.41-2.147 3.153-2.147h47.396z"/><path d="M288.26 14.688l-52.14 30.1c.605.92.973 1.98.973 3.136v28.078c0 1.457-.565 2.77-1.496 3.83l52.663 30.402c3.59 2.073 6.535.377 6.535-3.764V18.456c0-4.145-2.944-5.836-6.535-3.768zM175.02 76V47.923c0-1.15.368-2.21.966-3.13l-52.14-30.105c-3.588-2.068-6.53-.376-6.53 3.768v88.013c0 4.14 2.938 5.84 6.53 3.76l52.66-30.405c-.926-1.06-1.487-2.37-1.487-3.827z"/><path d="M201.25 393.05h1.947c-45.05-161.12-43.753-161.85-76.32-276.73l-7.833 4.523c-4.253 2.458-7.737.448-7.737-4.455V61.602C102.662 31.332 95.892 7.942 93.902.909H58.619L.002 55.213l38.494 33.27-29.11 31.473z"/><circle cx="204.57" cy="122.54" r="14.231"/><circle cx="204.57" cy="207.16" r="14.231"/><circle cx="204.57" cy="291.78" r="14.23"/></g></symbol><symbol viewBox="0 0 200.00001 200.00001" id="stylus" xmlns="http://www.w3.org/2000/svg"><path d="M126.814 155.9c14.64-17.51 16.362-35.595 5.024-69.18-7.177-21.24-19.09-37.602-10.334-50.807 9.329-14.065 29.135-.43 12.63 18.371l3.301 2.297c19.806 2.296 29.566-24.83 14.783-32.58C113.179 3.621 79.02 42.803 94.09 88.156c6.458 19.232 15.5 39.613 8.18 55.83-6.314 13.923-18.514 22.103-26.695 22.39-17.079.862-5.74-38.32 13.922-48.08 1.722-.861 4.162-2.01 1.866-4.88-24.256-2.727-38.464 8.468-46.645 24.112-23.825 45.497 45.21 62.29 82.095 18.371z" fill="#c0ca33" stroke-width="1.435"/></symbol><symbol viewBox="0 0 24 24" id="swc" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="jba"><stop offset="0" stop-color="#791223"/><stop offset="1" stop-color="#d92f3c"/></linearGradient><linearGradient xlink:href="#jba" id="jbb" x1="12.356" y1="21.559" x2="12.356" y2="2.949" gradientUnits="userSpaceOnUse"/></defs><path d="M6 3c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6 3 6.5V19a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.5c0-.5-.17-.93-.46-1.27l-1.39-1.68C18.88 3.21 18.47 3 18 3H6zm-.07 1h12l.94 1H5.12l.81-1z" fill="url(#jbb)"/><path style="line-height:125%" d="M11.053 11.918h-.008c-.244.022-.475.054-.676.11a2.9 2.9 0 0 0-.856.412 3.399 3.399 0 0 0-.67.683 9.36 9.36 0 0 0-.586.95c-.07.131-.134.244-.201.365v.001h-.002l-.768 1.372-.003-.001c-.136.253-.264.485-.38.686-.123.212-.26.39-.411.539a1.599 1.599 0 0 1-.52.34c-.04.016-.092.024-.138.036h-.567v1.383H5.834v-.001c.245-.02.477-.053.679-.11a2.9 2.9 0 0 0 .856-.411c.245-.185.469-.413.67-.683.195-.275.39-.591.585-.95.07-.131.135-.244.202-.366l.004.001.002-.002.02-.038H10.948v-1.378h-.19v-.001H9.624c.125-.234.246-.452.355-.64.123-.21.259-.39.41-.538.152-.148.325-.26.52-.34.04-.015.091-.024.136-.035h.57V13.3h-.002v-1.381h-.56v-.001z" font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#fff"/></symbol><symbol viewBox="0 0 24 24" id="swift" xmlns="http://www.w3.org/2000/svg"><path d="M17.09 19.72c-2.36 1.36-5.59 1.5-8.86.1A13.807 13.807 0 0 1 2 14.5c.67.55 1.46 1 2.3 1.4 3.37 1.57 6.73 1.46 9.1 0-3.37-2.59-6.24-5.96-8.37-8.71-.45-.45-.78-1.01-1.12-1.51 8.28 6.05 7.92 7.59 2.41-1.01 4.89 4.94 9.43 7.74 9.43 7.74.16.09.25.16.36.22.1-.25.19-.51.26-.78.79-2.85-.11-6.12-2.08-8.81 4.55 2.75 7.25 7.91 6.12 12.24-.03.11-.06.22-.05.39 2.24 2.83 1.64 5.78 1.35 5.22-1.21-2.39-3.48-1.65-4.62-1.17z" fill="#fe5e2f"/></symbol><symbol viewBox="0 0 24 24" id="table" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5m4 7.5h-4v2h1l-2 1.67L10 13h1v-2H7v2h1l3 2.5L8 18H7v2h4v-2h-1l2-1.67L14 18h-1v2h4v-2h-1l-3-2.5 3-2.5h1v-2z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 200 200" id="terraform" xmlns="http://www.w3.org/2000/svg"><g transform="translate(177.03 -58.705) scale(.92881)" fill="#5c6bc0" stroke="#b0aff5" stroke-linejoin="round"><g stroke-width=".288"><path transform="skewY(26.439) scale(.89541 1)" d="M-203.8 170.95h64.714v51.88H-203.8zM-124.37 171.04h64.714v51.88h-64.714zM-124.37 236.09h64.714v51.88h-64.714z"/></g><path transform="skewY(-22.59) scale(-.92328 1)" stroke-width=".284" d="M-19.172 128.27h62.76v51.88h-62.76z"/></g></symbol><symbol viewBox="0 0 24 24" id="test-js" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#ffca28"/></symbol><symbol viewBox="0 0 24 24" id="test-jsx" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#00bcd4"/></symbol><symbol viewBox="0 0 24 24" id="test-ts" xmlns="http://www.w3.org/2000/svg"><path d="M5 19a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1c0-.21-.07-.41-.18-.57L13 8.35V4h-2v4.35L5.18 18.43c-.11.16-.18.36-.18.57m1 3a3 3 0 0 1-3-3c0-.6.18-1.16.5-1.63L9 7.81V6a1 1 0 0 1-1-1V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1a1 1 0 0 1-1 1v1.81l5.5 9.56c.32.47.5 1.03.5 1.63a3 3 0 0 1-3 3H6m7-6l1.34-1.34L16.27 18H7.73l2.66-4.61L13 16m-.5-4a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#0288d1"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="tex" xmlns="http://www.w3.org/2000/svg"><g font-weight="400" font-size="40" font-family="sans-serif" letter-spacing="0" word-spacing="0" fill="#42a5f5" stroke-linejoin="miter"><text style="line-height:125%" x="9.914" y="364.919"><tspan x="9.914" y="364.919" font-size="287.5">T</tspan></text><text style="line-height:125%" x="136.374" y="435.558"><tspan x="136.374" y="435.558" font-size="287.5">E</tspan></text><text style="line-height:125%" x="307.819" y="361.201"><tspan x="307.819" y="361.201" font-size="287.5">X</tspan></text></g></symbol><symbol viewBox="0 0 24 24" id="todo" xmlns="http://www.w3.org/2000/svg"><path d="M3 5h6v6H3V5m2 2v2h2V7H5m6 0h10v2H11V7m0 8h10v2H11v-2m-6 5l-3.5-3.5 1.41-1.41L5 17.17l4.59-4.58L11 14l-6 6z" fill="#42a5f5"/></symbol><symbol id="travis" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><style id="jkstyle2">.jkst0{fill:#cb3349}.jkst1{fill:#f4edae}.jkst2{fill:#e6ccad}.jkst3{fill:#656c67}.jkst4{fill:#e5caa3}.jkst5{fill:#c7b39a}.jkst6{fill:#ebd599}.jkst7{fill:#2d3136}.jkst8{fill:#edf6fa}.jkst9{opacity:.8}.jkst10{opacity:.75;fill:#ebd599}</style><g id="jkg99" transform="translate(11.017 12.484) scale(.8858)"><g id="jkg10"><path class="jkst0" d="M47.781 86.572s-31.118 21.903-32.335 30.247l2.335-.48S55.045 91.64 84.584 88.628l.669-3.749z" id="jkpath4" fill="#cb3349"/><path class="jkst0" d="M96.629 83.442l-24.511 17.385 1.325 1.063c.999-.806 43.539-13.798 43.539-13.798l8.969-5.623c-6.018.749-29.322.973-29.322.973z" id="jkpath6" fill="#cb3349"/><path class="jkst0" d="M117.932 104.469c17.405 0 43.495-17.046 43.495-17.046l-8.434-1.605c-.417.417-13.6-.462-13.6-.462l-6.258-1.738-14.951 17.036-1.217 2.956c1.075-.437.965.859.965.859z" id="jkpath8" fill="#cb3349"/></g><path class="jkst0" d="M174.728 158.832l-5.377 1.514-24.843-.537-15.541-12.085-18.784 4.7-21.726-1.88-12.166 13.294-22.828 6.819-11.398-3.534-.574-.494 5.116 12.527s11.588 12.424 18.061 13.885c6.472 1.461 18.165-.105 26.935-1.463 8.769-1.357 15.764-4.489 18.582-9.603 2.818-5.117 3.236-6.578 3.236-6.578s8.353 11.797 15.556 13.155c7.203 1.357 28.605-5.952 28.605-5.952s13.051-3.549 15.346-8.038c2.297-4.489 8.353-19.209 8.353-19.209zM44.456 169.038l-.361-.166-2.013-1.736z" id="jkpath12" fill="#cb3349"/><g id="jkg97"><path class="jkst1" d="M195.832 70.085a48.125 48.125 0 0 0-.21-2.009 26.472 26.472 0 0 0-.215-1.424c-1.793-1.509-3.831-2.851-5.952-4.071-2.299-1.343-4.704-2.546-7.159-3.663-2.438-1.15-4.942-2.191-7.461-3.207a134.313 134.313 0 0 0-3.798-1.477c-1.269-.495-2.55-.956-3.835-1.424 2.697.447 5.366 1.059 8.015 1.741 1.723.446 3.437.945 5.14 1.477-12.112-31.655-41.07-52.27-72.687-52.27-31.622 0-60.577 20.615-72.686 52.27a109.044 109.044 0 0 1 5.137-1.477c2.653-.682 5.323-1.294 8.018-1.741-1.289.468-2.567.929-3.84 1.424-1.267.472-2.536.967-3.798 1.477-2.519 1.016-5.016 2.057-7.46 3.207-2.45 1.117-4.857 2.32-7.156 3.663-2.121 1.219-4.157 2.562-5.957 4.071-.075.457-.151.951-.21 1.424a51.768 51.768 0 0 0-.21 2.009 51.354 51.354 0 0 0-.177 4.061 59.216 59.216 0 0 0 .5 8.11c.37 2.692.864 5.366 1.595 7.951.36 1.295.768 2.572 1.24 3.808.237.617.495 1.225.764 1.816.134.294.274.585.413.864l.172.328c.199.101.408.204.607.3l1.204.575c.671.305 1.6.746 2.368 1.09.043-.037.086-.075.123-.114l-2.235-8.513c.474-.13 4.718-1.225 12.032-2.617a38.816 38.816 0 0 1-1.772-.381c-1.665-.414-3.309-.919-4.899-1.564a22.415 22.415 0 0 1-2.309-1.115c-.742-.426-1.472-.908-2.037-1.548 8.036 2.622 24.64 1.434 39.399-.091 13.499-1.391 27.029-2.293 40.63-2.32 13.602.027 27.137.929 40.63 2.32 14.766 1.525 31.37 2.713 39.405.091-.564.64-1.293 1.123-2.035 1.548a22.5 22.5 0 0 1-2.308 1.115c-1.592.645-3.234 1.15-4.899 1.564-.247.059-.496.113-.743.166 8.02 1.488 12.689 2.697 13.188 2.831l-2.138 8.11c.43-.194.864-.381 1.29-.574l1.202-.575c.2-.097.403-.199.607-.3l.166-.328c.146-.279.286-.57.419-.864.27-.591.528-1.199.764-1.816a42.235 42.235 0 0 0 1.241-3.808c.731-2.585 1.225-5.259 1.595-7.951.345-2.685.526-5.398.501-8.11a50.874 50.874 0 0 0-.179-4.059z" id="jkpath14" fill="#f4edae"/><path class="jkst2" d="M116.787 182.661c-1.064.16-2.128.295-3.186.375-.682.033-1.404.102-2.059.102l-.242.005c.822-1.837 1.446-3.26 1.919-4.339.963 1.08 2.188 2.417 3.568 3.857z" id="jkpath16" fill="#e6ccad"/><path class="jkst2" d="M119.101 185.018c3.304 3.272 7.398 5.146 11.904 5.479-7.569 3.074-14.702 4.26-20.197 4.63-5.478.367-11.032-.279-16.474-1.771.456-.082.79-.14 1.193-.189.447-.054 10.206-1.327 14.605-7.868l.413.009 1.08-.009c.731 0 1.395-.06 2.094-.087a43.69 43.69 0 0 0 4.878-.703c.167.171.333.338.504.509z" id="jkpath18" fill="#e6ccad"/><path class="jkst3" d="M128.464 87.071a98.82 98.82 0 0 1-1.048 1.343c-1.933 2.444-4.614 5.57-7.794 8.627a369.585 369.585 0 0 0-11.404-.177c-6.46 0-12.655.171-18.537.457 8.311-3.449 18.296-6.818 29.109-8.842a113.323 113.323 0 0 1 9.674-1.408z" id="jkpath20" fill="#656c67"/><path class="jkst3" d="M79.821 90.792c-2.966 2.084-6.317 4.744-9.566 7.971a360.155 360.155 0 0 0-21.567 2.81c9.207-4.232 19.713-8.127 31.133-10.781z" id="jkpath22" fill="#656c67"/><path class="jkst3" d="M181.48 107.969l-3.384 23.679-16.212 11.355-42.283-4.807-6.365-20.961a1.383 1.383 0 0 0-1.108-.971c-1.567-.253-2.953-.382-4.108-.382-1.16 0-2.541.129-4.115.382-.522.086-.95.461-1.106.971l-6.209 20.45-42.047 9.357-16.662-11.672-3.283-26.572c.715-.404 1.441-.806 2.176-1.209 1.031-.222 2.191-.457 3.475-.704l3.094 25.073c.048.392.264.741.586.967l11.462 8.032a1.425 1.425 0 0 0 1.101.213l34.57-7.692c.119-.027.237-.069.344-.124a1.39 1.39 0 0 0 .682-.827l6.225-20.498c1.67-.43 5.947-1.429 9.706-1.429 3.749 0 8.03.999 9.701 1.429l6.225 20.498c.161.532.624.912 1.176.977l34.57 3.927c.335.037.677-.05.952-.242l11.469-8.025c.31-.22.52-.566.573-.946l3.062-21.421c2.301.444 4.224.846 5.733 1.172z" id="jkpath24" fill="#656c67"/><path class="jkst3" d="M185.751 93.119l-2.976 11.29c-6.086-1.342-19.456-3.975-37.654-5.747 5.946-2.535 12-5.715 17.531-9.69 10.829 1.53 18.78 3.169 23.099 4.147z" id="jkpath26" fill="#656c67"/><g id="jkg32"><path class="jkst4" d="M63.841 128.441c2.357-1.274 5.021-1.085 9.19-1.079.447.011.908.005 1.39-.005.41-.005.822-.011 1.258-.022 4.296-.042 7.869.366 7.806-6.381-.065-6.746-3.062-12.198-7.354-12.155-4.297.037-8.454 5.564-8.197 12.306.07 1.756.328 3.023.742 3.937-3.745.938-4.777 3.254-4.835 3.399zm51.657-27.749a46.634 46.634 0 0 1-5.249 3.712l-6.097 3.68a52.065 52.065 0 0 0-7.331 1.467 1.216 1.216 0 0 0-.317.14 1.406 1.406 0 0 0-.629.794l-6.209 20.46-33.185 7.38-10.452-7.321-3.041-24.634c5.936-1.09 13.874-2.352 23.41-3.42a56.802 56.802 0 0 0-2.955 3.855l-5.677 8.149 8.266-5.511c.123-.086 5.387-3.549 13.998-7.761a377.407 377.407 0 0 1 35.468-.99z" id="jkpath28" fill="#e5caa3"/><path class="jkst4" d="M151.835 125.675c-.042-.16-.945-2.873-4.942-2.397.461-1.003.666-2.356.521-4.21-.528-6.731-4.443-12.08-8.735-11.931-4.292.152-7.042 5.731-6.805 12.478.236 6.741 3.84 6.694 8.132 6.543 5.77-.107 8.939-1.88 11.829-.483zm21.18-19.385l-2.992 20.944-10.539 7.379-33.141-3.766-6.183-20.363a1.41 1.41 0 0 0-.945-.934c-.205-.06-4.308-1.23-8.659-1.607l.795-.053c.687-.049 12.118-1.451 25.767-6.157 15.115 1.161 27.458 3.02 35.897 4.557z" id="jkpath30" fill="#e5caa3"/></g><g id="jkg38"><path class="jkst5" d="M63.841 128.441c2.357-1.274 5.021-1.085 9.19-1.079.447.011.908.005 1.39-.005.41-.005.822-.011 1.258-.022 4.296-.042 7.869.366 7.806-6.381-.065-6.746-3.062-12.198-7.354-12.155-4.297.037-8.454 5.564-8.197 12.306.07 1.756.328 3.023.742 3.937-3.745.938-4.777 3.254-4.835 3.399zm51.657-27.749a46.634 46.634 0 0 1-5.249 3.712l-6.097 3.68a52.065 52.065 0 0 0-7.331 1.467 1.216 1.216 0 0 0-.317.14 1.406 1.406 0 0 0-.629.794l-6.209 20.46-33.185 7.38-10.452-7.321-3.041-24.634c5.936-1.09 13.874-2.352 23.41-3.42a56.802 56.802 0 0 0-2.955 3.855l-5.677 8.149 8.266-5.511c.123-.086 5.387-3.549 13.998-7.761a377.407 377.407 0 0 1 35.468-.99z" id="jkpath34" fill="#c7b39a"/><path class="jkst5" d="M151.835 125.675c-.042-.16-.945-2.873-4.942-2.397.461-1.003.666-2.356.521-4.21-.528-6.731-4.443-12.08-8.735-11.931-4.292.152-7.042 5.731-6.805 12.478.236 6.741 3.84 6.694 8.132 6.543 5.77-.107 8.939-1.88 11.829-.483zm21.18-19.385l-2.992 20.944-10.539 7.379-33.141-3.766-6.183-20.363a1.41 1.41 0 0 0-.945-.934c-.205-.06-4.308-1.23-8.659-1.607l.795-.053c.687-.049 12.118-1.451 25.767-6.157 15.115 1.161 27.458 3.02 35.897 4.557z" id="jkpath36" fill="#c7b39a"/></g><path class="jkst2" d="M187.481 115.502c.508.419.911 1.504.456 6.558-.559 6.188-3.16 17.049-4.771 18.8-1.778.344-5.505-.064-7.778-.595.393-1.559.505-2.306.822-3.9l3.975-2.781c.317-.22.526-.566.58-.941l2.778-19.466c1.686.912 3.421 1.899 3.938 2.325z" id="jkpath40" fill="#e6ccad"/><path class="jkst2" d="M40.937 140.908c.199.704.408 1.407.624 2.1-2.139.628-6.495 1.23-8.465.886-1.633-1.645-4.679-12.966-5.345-18.978-.543-4.871-.162-5.924.333-6.334.575-.483 2.728-1.708 4.593-2.707l2.519 20.449c.048.393.257.741.586.967z" id="jkpath42" fill="#e6ccad"/><path class="jkst2" d="M121.347 141.194l-.151 1.305s-4.581 4.248-11.956 5.199c-7.375.95-13.171-3.582-13.171-3.582.242.788.586 2.567 2.256 4.086a53.184 53.184 0 0 0-6.313-.393c-.804 0-1.616.023-2.401.061-4.539.237-10.924 7.1-15.414 14.014-2.203.697-9.089 2.883-17.06 5.237-7.44-10.309-11.098-20.842-11.469-21.932l.005-.006c-.15-.419-.301-.839-.441-1.268l1.913 1.338v.005l4.726 3.309 1.58 1.101c.236.167.515.253.794.253.102 0 .204-.011.305-.031l43.435-9.67a1.385 1.385 0 0 0 1.025-.95l6.194-20.39c1.069-.145 2.008-.22 2.814-.22.801 0 1.746.075 2.815.22l6.374 20.997c.162.532.624.919 1.171.977z" id="jkpath44" fill="#e6ccad"/><path class="jkst2" d="M170.926 140.066l1.402-.984c-.232.973-.484 1.94-.747 2.896-1.949 6.248-4.25 11.774-6.805 16.656-.565.039-1.161.061-1.8.061-1.972 0-3.986-.167-6.215-.371-3.868-.355-10.007-1.058-11.946-1.283-1.67-1.332-7.385-5.873-12.14-9.615-.187-.151-.348-.291-.505-.42-.837-.708-1.789-1.513-3.717-1.513-1.751 0-4.308.638-10.489 2.508 3.212-2.401 3.233-5.5 3.233-5.5l.151-1.305 40.748 4.629a1.41 1.41 0 0 0 .955-.241l4.094-2.868z" id="jkpath46" fill="#e6ccad"/><path class="jkst6" d="M140.937 54.337c.124 3.625.033 10.194-1.655 16.345a1.335 1.335 0 0 0 0 .704 259.298 259.298 0 0 0-6.446-.591c2.412-5.054 2.938-10.436 3.052-12.332 1.852-1.317 3.696-2.896 5.049-4.126z" id="jkpath48" fill="#ebd599"/><path class="jkst6" d="M79.456 58.462c.112 1.896.638 7.267 3.046 12.317-2.149.171-4.297.37-6.441.596a1.328 1.328 0 0 0 0-.694c-1.686-6.139-1.772-12.714-1.654-16.345 1.353 1.231 3.19 2.81 5.049 4.126z" id="jkpath50" fill="#ebd599"/><path class="jkst7" d="M151.835 125.675c-2.89-1.396-6.059.377-11.828.484-4.292.151-7.896.198-8.132-6.543-.237-6.747 2.513-12.326 6.805-12.478 4.292-.15 8.207 5.2 8.735 11.931.145 1.854-.06 3.207-.521 4.21 3.996-.477 4.899 2.235 4.941 2.396zm-13.488-9.878a2.203 2.203 0 0 0 2.154-2.235 2.186 2.186 0 0 0-2.235-2.153 2.194 2.194 0 0 0 .081 4.388z" id="jkpath52" fill="#2d3136"/><circle transform="rotate(-1.049 138.093 113.428)" class="jkst8" cx="138.307" cy="113.602" id="jkellipse54" r="2.194" fill="#edf6fa"/><path class="jkst7" d="M83.484 120.953c.063 6.747-3.509 6.339-7.806 6.381-.435.011-.848.016-1.258.022-.482.011-.944.016-1.39.005-4.168-.005-6.833-.194-9.19 1.079.058-.145 1.09-2.461 4.835-3.4-.414-.914-.673-2.181-.742-3.937-.257-6.741 3.9-12.269 8.197-12.306 4.292-.042 7.289 5.411 7.354 12.156zm-6.634-3.529a2.195 2.195 0 1 0-.122-4.388 2.195 2.195 0 0 0 .122 4.388z" id="jkpath56" fill="#2d3136"/><circle transform="rotate(-1.473 76.78 115.216)" class="jkst8" cx="76.79" cy="115.23" id="jkellipse58" r="2.195" fill="#edf6fa"/><g class="jkst9" id="jkg64" opacity=".8"><path class="jkst6" d="M50.691 75.155s.667-8.692 2.03-12.023c.702-1.717 4.996-2.81 8.276-3.591 3.278-.78 8.508-2.342 9.524 2.264 1.015 4.606 2.653 7.963 3.746 9.446l-1.404-18.97-22.562 5.464-1.484 16.786.703 1.327 1.171-.703" id="jkpath60" fill="#ebd599"/><path class="jkst6" d="M164.855 75.155s-.666-8.692-2.029-12.023c-.703-1.717-4.997-2.81-8.275-3.591-3.28-.78-8.51-2.342-9.526 2.264-1.013 4.606-2.654 7.963-3.748 9.446l1.407-18.97 22.562 5.464 1.483 16.786-.703 1.327-1.171-.703" id="jkpath62" fill="#ebd599"/></g><path class="jkst10" d="M132.965 18.378s-.598 45.49-11.224 45.49h-14.875-12.752c-10.626 0-11.484-45.47-11.484-45.47l-5.22 15.438.085 21.183 3.707 2.947 1.685 9.096 2.357 5.307 45.482.084 2.105-3.791 1.769-6.4.254-4.043 5.023-14.341z" id="jkpath66" opacity=".75" fill="#ebd599"/><path class="jkst10" d="M166.429 60.794s2.187 15.692 7.974 18.522c5.788 2.829 0 0 0 0l-8.103-2.444z" id="jkpath68" opacity=".75" fill="#ebd599"/><path class="jkst10" d="M48.908 60.794s-2.187 15.692-7.975 18.522c-5.788 2.829 0 0 0 0l8.104-2.444z" id="jkpath70" opacity=".75" fill="#ebd599"/><path class="jkst7" d="M167.987 76.8c2.755.902 5.526 1.858 8.036 3.325-1.343-.532-2.729-.913-4.126-1.257a70.385 70.385 0 0 0-4.201-.924c-2.82-.531-5.65-.982-8.498-1.327-2.841-.37-5.687-.682-8.546-.924-2.858-.241-5.709-.483-8.573-.65-11.446-.704-22.924-.88-34.41-.892-11.483.006-22.962.221-34.409.897-2.862.166-5.715.409-8.572.651-2.857.241-5.71.548-8.546.923-2.847.345-5.678.796-8.498 1.327-1.407.264-2.81.57-4.206.919-1.391.344-2.783.725-4.126 1.257 2.509-1.466 5.28-2.427 8.041-3.331.232-.075.467-.139.703-.214-.015-.059-.032-.113-.043-.177-.048-.317-1.069-7.859.709-18.645.086-.516.456-.935.962-1.075l2.917-.831c.634-22.625 9.952-33.266 10.243-33.594-8.326 13.397-8.25 29.286-8.106 32.986l18.128-5.152c.016-.005.026-.005.042-.01.076-.016.151-.027.226-.032.021 0 .049-.006.075-.006a1.19 1.19 0 0 1 .297.027c.015 0 .031.011.053.016.075.016.145.042.224.075.033.016.054.033.086.049.058.033.119.07.177.112.016.011.034.016.049.033l.032.032c.016.016.037.027.054.044.012.016.494.493 1.262 1.209-.182-5.973.102-23.108 8.262-37.31-.172.498-6.646 19.428-4.415 40.645.724.58 1.486 1.149 2.229 1.649.359.247.58.655.585 1.09.006.07.161 6.833 3.148 12.586.042.086.074.177.102.268 7.429-.505 14.878-.709 22.312-.714 7.436.005 14.88.22 22.307.731.027-.097.06-.193.109-.285 2.986-5.753 3.142-12.516 3.142-12.586.01-.436.231-.843.591-1.09.741-.5 1.493-1.069 2.224-1.649 2.234-21.217-4.24-40.147-4.411-40.645 8.153 14.201 8.444 31.336 8.262 37.31a62.536 62.536 0 0 0 1.261-1.209c.016-.016.039-.027.053-.044.012-.01.018-.021.033-.032.016-.016.033-.022.049-.033.06-.042.119-.079.177-.118.028-.01.054-.027.081-.043.081-.033.155-.059.236-.08.016 0 .033-.011.049-.011.096-.021.2-.032.296-.027.027 0 .049.006.07.006.075.005.156.016.231.032.012.006.028.006.042.01l18.129 5.152c.146-3.7.221-19.59-8.104-32.986.289.328 9.609 10.969 10.237 33.594l2.922.831c.499.14.875.559.962 1.075 1.777 10.786.752 18.328.708 18.645-.01.065-.026.124-.042.182.239.07.47.139.707.215zm-3.297-.968c.14-1.207.789-7.809-.591-16.801l-20.52-5.833c.184 3.475.265 11.012-1.707 18.199a1.619 1.619 0 0 1-.101.258c.203.021.408.037.606.064 5.769.661 11.511 1.584 17.189 2.83 1.712.398 3.426.823 5.124 1.283zm-25.409-5.151c1.688-6.15 1.779-12.72 1.655-16.345-1.353 1.23-3.197 2.809-5.049 4.125-.114 1.896-.64 7.278-3.052 12.332 2.149.173 4.298.366 6.446.591a1.33 1.33 0 0 1 0-.703zm-56.78.098c-2.408-5.05-2.934-10.422-3.046-12.317-1.858-1.316-3.696-2.895-5.049-4.125-.119 3.631-.032 10.206 1.654 16.345.065.237.058.473 0 .694 2.145-.227 4.292-.425 6.441-.597zm-8.933.864a1.65 1.65 0 0 1-.098-.247c-1.975-7.187-1.889-14.723-1.712-18.199L51.244 59.03c-1.38 8.982-.736 15.583-.597 16.797 1.703-.462 3.411-.887 5.131-1.284 2.835-.628 5.693-1.154 8.556-1.638 2.869-.478 5.747-.843 8.626-1.192.205-.027.404-.042.608-.07z" id="jkpath72" fill="#2d3136"/><g id="jkXMLID_1_"><g id="jkg78"><path class="jkst7" d="M129.293 18.973v17.025h-12.068v-4.974h-2.72v22.981h4.109v12.85H97.505v-12.85h4.092v-22.98h-2.711v4.974h-12.06V18.973zm-3.626 13.408v-9.789H90.443v9.789h4.816v-4.974h9.964v30.225h-4.1v5.606h13.865v-5.606h-4.1V27.407h9.964v4.974z" id="jkpath74" fill="#2d3136"/><path class="jkst0" id="jkpolygon76" fill="#cb3349" d="M101.123 57.632h4.1V27.407h-9.964v4.974h-4.816v-9.79h35.224v9.79h-4.816v-4.974h-9.964v30.225h4.1v5.606h-13.864z"/></g></g><path class="jkst3" d="M30.694 93.119c1.759-.399 4.136-.907 7.051-1.47a104.37 104.37 0 0 0-6.222 4.597z" id="jkpath83" fill="#656c67"/><path class="jkst5" d="M95.111 139.78s.492 3.165-3.938 4.519c-4.428 1.355-32.482 9.716-35.682 9.263-3.199-.451-11.319-5.874-11.319-5.874l-1.969-7.004 12.016 7.492z" id="jkpath85" fill="#c7b39a"/><path class="jkst5" d="M120.242 139.167s-.354 3.182 4.131 4.345c4.484 1.161 32.875 8.295 36.05 7.704 3.176-.591 11.053-6.361 11.053-6.361l1.663-7.084-11.045 6.588z" id="jkpath87" fill="#c7b39a"/><path class="jkst5" d="M28.412 133.956s3.887 7.775 10.166 5.083l4.485 1.645-.448 3.29-9.419 1.195-2.541-1.494z" id="jkpath89" fill="#c7b39a"/><path class="jkst5" d="M187.551 131.822s-6.353 8.115-12.632 5.424l-2.019 1.302.448 3.289 9.419 1.196 2.54-1.495z" id="jkpath91" fill="#c7b39a"/><path class="jkst5" d="M89.279 192.904s23.03 11.611 49.106-4.188l-8.374-.571s-18.272 7.232-32.738 3.235z" id="jkpath93" fill="#c7b39a"/><path class="jkst7" d="M112.626 171.509l1.594 1.899c.036.046 3.577 4.26 7.906 8.552 2.879 2.853 6.357 4.297 10.343 4.297 1.361 0 2.791-.175 4.235-.523 1.34-.326 2.796-.673 4.287-1.03 5.384-1.287 11.482-2.749 14.438-3.577.585-.166 1.238-.315 1.925-.472 3.935-.909 9.329-2.163 12.187-7.889 2.149-4.297 5.047-9.874 7.197-13.961-1.863.859-3.816 1.79-5.203 2.52-2.138 1.123-4.938 1.667-8.558 1.667-2.152 0-4.266-.181-6.605-.389-4.675-.43-12.586-1.361-12.667-1.372l-.606-.067-.478-.383c-.071-.052-7.003-5.575-12.606-9.981-.227-.186-.434-.358-.621-.513-.59-.503-.59-.503-.942-.503-1.797 0-7.02 1.62-18.462 5.167l-.703.223-.689-.26c-.078-.026-7.585-2.81-16.581-2.81-.736 0-1.47.019-2.185.056-.901.046-5.958 2.448-12.425 12.68l-.419.657-.741.238c-.107.037-11.238 3.63-23.042 7.005l-.766.218-.725-.337c-.077-.031-4.696-2.174-9.091-4.194 2.397 3.541 5.462 7.958 8.159 11.422 4.711 6.067 10.649 11.674 22.034 11.674 1.428 0 2.945-.088 4.503-.265 11.581-1.309 14.563-1.837 16.168-2.117.543-.092.973-.171 1.522-.238.088-.011 9.571-1.237 12.232-7.206 2.744-6.134 3.298-7.595 3.319-7.651l.968-2.583s.12-.669.317-.877c0 .005 0 .005.005.005l.019.016c.305.219.757.902.757.902zM40.499 55.71c-2.516 1.014-5.016 2.06-7.46 3.209-2.449 1.119-4.856 2.32-7.155 3.66-2.121 1.222-4.157 2.563-5.954 4.076-.077.455-.149.952-.211 1.423a51.357 51.357 0 0 0-.388 6.068c-.026 2.713.16 5.426.502 8.112.372 2.692.864 5.369 1.594 7.952a41.963 41.963 0 0 0 1.243 3.804c.233.623.492 1.228.762 1.818.134.294.274.585.413.864l.172.326c.201.104.409.207.605.3l1.206.574c.673.311 1.6.751 2.366 1.093.046-.037.088-.078.124-.114l-2.231-8.511c.471-.129 4.717-1.227 12.032-2.619a33.744 33.744 0 0 1-1.775-.379 36.704 36.704 0 0 1-4.898-1.563 22.857 22.857 0 0 1-2.309-1.119c-.741-.425-1.471-.905-2.035-1.547 8.035 2.624 24.637 1.433 39.398-.088 13.501-1.393 27.028-2.293 40.628-2.325 13.6.031 27.138.931 40.63 2.325 14.77 1.522 31.374 2.713 39.406.088-.564.642-1.293 1.122-2.034 1.547-.739.42-1.522.782-2.309 1.119a36.965 36.965 0 0 1-4.903 1.563c-.244.056-.492.114-.741.166 8.02 1.486 12.689 2.697 13.186 2.832l-2.138 8.107c.43-.192.864-.377 1.288-.574l1.207-.574c.196-.094.404-.196.606-.3l.166-.326c.144-.279.284-.57.419-.864.27-.591.528-1.196.767-1.818.471-1.231.879-2.51 1.236-3.804.731-2.583 1.228-5.26 1.595-7.952.346-2.686.528-5.4.502-8.112a52.755 52.755 0 0 0-.176-4.059 51.573 51.573 0 0 0-.213-2.009 29.83 29.83 0 0 0-.213-1.423c-1.797-1.513-3.831-2.853-5.954-4.076-2.299-1.34-4.704-2.541-7.159-3.66-2.438-1.149-4.943-2.195-7.46-3.209a140.105 140.105 0 0 0-3.801-1.476c-1.267-.491-2.552-.956-3.835-1.423 2.696.445 5.369 1.06 8.013 1.739 1.724.446 3.444.948 5.141 1.481-12.11-31.658-41.07-52.272-72.685-52.272-31.622 0-60.576 20.614-72.684 52.272a107.832 107.832 0 0 1 5.135-1.481c2.651-.678 5.322-1.294 8.02-1.739-1.29.466-2.568.931-3.842 1.423-1.268.47-2.535.967-3.799 1.475zm159.43 18.316a53.972 53.972 0 0 1-.258 8.733 55.462 55.462 0 0 1-1.619 8.605c-.4 1.414-.86 2.811-1.404 4.198a38.295 38.295 0 0 1-.89 2.071c-.161.341-.331.678-.523 1.025l-.284.512a8.975 8.975 0 0 1-.348.574l-.294.457-.461.237c-.492.254-.895.445-1.342.653l-1.298.585a88.22 88.22 0 0 1-2.62 1.065c-.611.239-1.15.457-1.662.674l-1.444 5.487c-.036-.009-.471-.12-1.283-.315l-.078.574c1.594.833 4.726 2.522 5.793 3.403 2.148 1.775 2.299 4.587 1.823 9.841-.244 2.697-1.139 7.946-2.381 12.767-2.144 8.298-3.283 9.273-4.753 9.649-.746.192-1.894.383-3.008.383-2.266 0-5.353.063-7.429-.439-.533 1.888-2.055 6.812-5.068 12.962.151-.073.3-.135.435-.207 3.717-1.952 10.861-5.064 11.162-5.199l5.643-2.452-2.89 5.435c-.067.118-6.264 11.773-10.059 19.383-3.769 7.538-10.835 9.179-15.065 10.151-.637.151-1.241.291-1.733.425-3.035.854-9.18 2.319-14.599 3.623-.064.016-.13.033-.197.042a64.057 64.057 0 0 1-10.955 5.411c-14.568 5.518-29.923 5.208-43.844.092a647.05 647.05 0 0 1-9.193 1.097 45.12 45.12 0 0 1-4.985.291c-13.264 0-20.294-6.736-25.425-13.331-5.493-7.062-12.212-17.546-12.497-17.985L31 158.426l6.585 2.961c3.152 1.419 12.524 5.757 15.205 7 .217-.061.43-.124.642-.186-4.457-6.357-8.112-13.605-10.695-21.634-2.195.662-5.576 1.175-8.206 1.175-.961 0-1.822-.072-2.484-.228-1.471-.336-3.148-1.754-5.431-9.795-1.325-4.668-2.314-9.764-2.603-12.387-.57-5.121-.466-7.864 1.662-9.636 1.283-1.071 5.611-3.344 6.507-3.809l-.192-1.58c-13.75 8.08-21.991 15.22-22.157 15.366L0 134.302l7.005-11.047c5.544-8.755 11.948-15.832 17.84-21.284-.244-.098-.471-.196-.71-.294l-1.299-.585a34.907 34.907 0 0 1-1.34-.653l-.461-.237-.295-.457c-.166-.249-.238-.388-.347-.574l-.29-.512c-.181-.347-.358-.684-.518-1.025a30.878 30.878 0 0 1-.89-2.071 44.74 44.74 0 0 1-1.404-4.198 54.745 54.745 0 0 1-1.62-8.605 54.664 54.664 0 0 1-.259-8.733c.078-1.455.218-2.909.419-4.354.104-.725.213-1.45.358-2.17.15-.734.296-1.418.518-2.221l.155-.564.404-.317c2.294-1.802 4.768-3.163 7.284-4.369a78.87 78.87 0 0 1 6.311-2.616c5.943-16.493 16.162-31.118 29.591-41.311C74.337 5.57 90.664 0 107.671 0s33.334 5.57 47.218 16.106c13.43 10.193 23.649 24.819 29.588 41.307a78.282 78.282 0 0 1 6.316 2.62c2.515 1.206 4.99 2.567 7.283 4.369l.404.317.156.564c.227.803.372 1.487.517 2.221.146.72.26 1.445.357 2.17.203 1.443.348 2.897.419 4.352zm-11.995 48.031c.456-5.052.058-6.139-.455-6.554-.513-.43-2.247-1.412-3.935-2.329l-2.779 19.464a1.39 1.39 0 0 1-.58.942l-3.977 2.781c-.315 1.593-.429 2.345-.817 3.903 2.273.528 5.999.938 7.775.595 1.612-1.748 4.214-12.61 4.768-18.802zm-5.161-17.648l2.977-11.29c-4.318-.978-12.27-2.615-23.1-4.148-5.53 3.976-11.582 7.155-17.53 9.691 18.199 1.771 31.57 4.406 37.653 5.747zm-4.68 27.237l3.385-23.676a240.127 240.127 0 0 0-5.731-1.169l-3.059 21.422a1.415 1.415 0 0 1-.575.943l-11.472 8.023c-.27.192-.616.28-.947.243l-34.572-3.929a1.391 1.391 0 0 1-1.176-.973l-6.227-20.5c-1.668-.431-5.949-1.43-9.696-1.43-3.764 0-8.041.999-9.708 1.43l-6.228 20.5a1.388 1.388 0 0 1-1.025.947l-34.572 7.692a1.483 1.483 0 0 1-.306.033 1.36 1.36 0 0 1-.792-.25l-11.467-8.029a1.396 1.396 0 0 1-.585-.968l-3.091-25.072c-1.284.249-2.443.487-3.479.703-.734.405-1.46.809-2.174 1.213l3.281 26.568 16.666 11.675 42.047-9.354 6.207-20.449a1.389 1.389 0 0 1 1.108-.975c1.574-.253 2.95-.382 4.116-.382 1.153 0 2.536.129 4.105.382.528.083.957.461 1.108.975l6.366 20.956 42.282 4.808zm-8.07-4.411l2.992-20.948c-8.439-1.536-20.78-3.394-35.897-4.554-13.647 4.707-25.077 6.108-25.766 6.155l-.797.057c4.353.374 8.454 1.544 8.66 1.605.452.135.804.481.944.933l6.186 20.366 33.138 3.764zm2.303 11.845l-1.404.983-3.779 2.651-4.095 2.868c-.279.192-.621.28-.954.243l-40.746-4.633-2.966-.337a1.39 1.39 0 0 1-1.171-.977l-6.377-20.998c-1.066-.145-2.014-.219-2.81-.219-.809 0-1.751.073-2.817.219l-6.192 20.392a1.383 1.383 0 0 1-1.025.946l-43.435 9.672c-.103.02-.206.03-.305.03-.279 0-.559-.083-.798-.253l-1.578-1.098-4.726-3.307v-.011l-1.91-1.335c.135.43.289.85.441 1.268l-.006.006c.368 1.092 4.028 11.622 11.467 21.929a873.96 873.96 0 0 0 17.057-5.234c4.488-6.917 10.877-13.777 15.418-14.014a51.12 51.12 0 0 1 2.402-.061c2.221 0 4.344.16 6.31.393-1.671-1.517-2.013-3.298-2.256-4.085 0 0 5.793 4.53 13.17 3.584 7.378-.953 11.959-5.204 11.959-5.204s-.021 3.102-3.236 5.503c6.182-1.869 8.739-2.511 10.489-2.511 1.931 0 2.883.808 3.717 1.519.161.129.322.268.507.419a3519.302 3519.302 0 0 1 12.141 9.614c1.936.227 8.075.926 11.943 1.283 2.23.201 4.245.372 6.217.372.637 0 1.233-.026 1.797-.063 2.558-4.88 4.857-10.411 6.808-16.653.261-.96.516-1.928.743-2.901zm-15.034-51.593c-.01-.006-.02-.012-.031-.012a551.624 551.624 0 0 0-9.826-.651 905.6 905.6 0 0 0-13.667-.668 72.95 72.95 0 0 1-1.574 2.225c-2.479 3.355-7.398 9.51-13.704 14.729 8.926-1.6 24.409-5.56 37.803-14.905.336-.238.668-.486.999-.718zm-29.876.926c.377-.471.729-.926 1.044-1.34-3.281.331-6.512.808-9.67 1.408-10.814 2.024-20.801 5.389-29.11 8.837a383.259 383.259 0 0 1 18.54-.455c3.908 0 7.708.067 11.404.176 3.179-3.056 5.861-6.182 7.792-8.626zm3.587 102.085c-4.503-.332-8.598-2.205-11.903-5.477a271.86 271.86 0 0 0-.502-.512 44.25 44.25 0 0 1-4.881.704c-.698.026-1.361.087-2.091.087l-1.083.011-.413-.011c-4.396 6.539-14.159 7.813-14.605 7.87-.403.046-.734.103-1.191.186 5.442 1.491 10.996 2.138 16.474 1.77 5.492-.367 12.627-1.558 20.195-4.628zm-17.4-7.461a45.604 45.604 0 0 0 3.184-.378 138.958 138.958 0 0 1-3.568-3.857 398.441 398.441 0 0 1-1.92 4.339h.243c.658.001 1.378-.071 2.061-.104zm-3.354-78.632c1.827-1.103 3.582-2.366 5.249-3.712a422.33 422.33 0 0 0-7.278-.072c-10.137 0-19.606.415-28.189 1.061-8.61 4.209-13.875 7.672-13.998 7.76l-8.268 5.514 5.679-8.149a52.452 52.452 0 0 1 2.956-3.857c-9.536 1.066-17.477 2.329-23.41 3.422l3.038 24.632 10.453 7.321 33.184-7.378 6.212-20.464c.104-.337.331-.621.627-.793.098-.063.202-.109.315-.14.192-.052 3.51-.999 7.336-1.465zm3.816-18.788c-2.31-.036-4.623-.057-6.933-.062h-.005c-3.39.005-6.787.041-10.189.109l-6.269 2.971c-.005.005-.041.021-.088.048-.942.46-9.174 4.613-16.919 12.021 6.943-3.65 17.146-8.418 29.153-12.115a144.186 144.186 0 0 1 11.25-2.972zM70.251 98.761c3.251-3.225 6.605-5.886 9.567-7.967-11.415 2.651-21.923 6.543-31.128 10.778a360.846 360.846 0 0 1 21.561-2.811zm2.159-9.949a150.122 150.122 0 0 1 11.813-2.796c-5.798.212-11.6.481-17.393.808-3.366.186-6.715.414-10.065.667-1.678.129-3.345.263-5.007.445-.476.046-.942.098-1.418.16-4.369 2.614-21.127 13.134-32.631 26.889 11.179-7.769 30.654-19.443 54.701-26.173zm-30.85 54.197a68.861 68.861 0 0 1-.621-2.102l-5.162-3.612a1.391 1.391 0 0 1-.586-.969l-2.516-20.449c-1.864.999-4.017 2.225-4.592 2.707-.497.409-.875 1.46-.336 6.332.668 6.01 3.712 17.333 5.348 18.979 1.968.347 6.327-.258 8.465-.886zm-3.815-51.36a229.005 229.005 0 0 0-7.051 1.47l.829 3.127a103.93 103.93 0 0 1 6.222-4.597z" id="jkpath95" fill="#2d3136"/></g></g></symbol><symbol viewBox="0 0 24 24" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="tune" xmlns="http://www.w3.org/2000/svg"><path d="M6.85 2.852h-2v6h2v-6m12 0h-2v10h2v-10m-16 10h2v8h2v-8h2v-2h-6v2m12-6h-2v-4h-2v4h-2v2h6v-2m-4 14h2v-10h-2v10m4-6v2h2v4h2v-4h2v-2h-6z" fill="#fbc02d" fill-rule="nonzero"/></symbol><symbol viewBox="0 0 50 50" id="twig" xmlns="http://www.w3.org/2000/svg"><path d="M9.727 47.556c-.125-.223-.297-2.168-.183-2.087.034.025.171.267.304.537.132.27.282.487.332.482.123-.011.075-1.196-.1-2.454-.331-2.398-1.176-4.435-2.358-5.69-.2-.212-.344-.4-.319-.419.093-.067 1.327.843 1.842 1.359.293.293.735.825.981 1.181.328.474.465.618.51.534.078-.147-.21-9.903-.376-12.701-.074-1.255.063-1.023.61 1.035 1.064 4.006 1.858 7.922 2.342 11.55.086.637.173 1.172.195 1.19.022.016.092.001.157-.034.888-.483 1.524-.667 2.55-.736.727-.048.945.062.35.178-1.15.222-1.99 1.013-2.344 2.201-.315 1.061-.327 2.707-.024 3.434.152.366.037.426-1.067.56-.716.088-.977.096-1.202.037-.356-.092-1.118-.098-1.195-.008-.031.036-.243.066-.47.066-.38 0-.423-.017-.535-.215zm1.974-3.233c.152-.205.072-.41-.204-.522-.225-.09-.263-.088-.437.025-.21.137-.252.43-.08.554.18.13.607.096.72-.057zm1.248.086a.763.763 0 0 0 .214-.203c.241-.33-.352-.622-.745-.366-.406.265.08.785.531.569zm2.288 3.094c-.033-.039.117-.387.334-.775.216-.387.411-.665.433-.618.07.152-.201 1.28-.33 1.372-.15.108-.354.117-.437.02zM8.2 47.092c-.29-.343-.221-.434.14-.182.176.123.321.263.321.31 0 .165-.279.087-.46-.128zm8.649-.145c0-.053.102-.18.227-.282.25-.204.312-.113.143.207-.095.18-.37.236-.37.075zm8.065-.827c-.243-.025-.48-.088-.527-.141-.11-.125-.114-3.043-.004-3.043.045 0 .132.149.193.331.127.38.228.42.31.124.094-.337.065-3.472-.039-4.297-.449-3.55-1.865-6.124-4.342-7.89-1.086-.774-2.653-1.436-4.047-1.711-.764-.15-.522-.224.598-.182 2.364.089 4.167.706 5.847 2.001a11.046 11.046 0 0 1 2.32 2.502c.453.682.64.854.64.584 0-.07.063-.882.139-1.805.679-8.26 2.396-15.1 4.984-19.86 1.86-3.422 5.108-6.817 7.885-8.244 1.397-.718 2.539-.988 4.02-.952.933.023 1.01.036 1.77.307a6.822 6.822 0 0 1 1.363.662c.612.407 1.309 1.004 1.235 1.058-.026.018-.343-.165-.705-.407-2.657-1.771-5.062-1.52-7.12.742-1.108 1.22-2.651 3.53-3.634 5.443-2.828 5.503-4.541 11.464-5.291 18.413-.163 1.509-.282 3.76-.195 3.703.032-.022.266-.52.518-1.108 1.597-3.723 3.578-6.428 5.79-7.908.672-.449 1.612-.904 1.715-.83.022.016-.172.22-.432.454-1.957 1.754-3.248 3.76-4.232 6.572-.938 2.68-1.366 5.588-1.368 9.3-.002 1.741.188 4.385.366 5.101.125.505.08.546-.585.546-.55 0-2.306.138-3.416.27-.414.05-.817.04-1.609-.036-.58-.056-1.129-.119-1.218-.14-.165-.037-.18-.014-.2.302-.01.186-.098.203-.728.139zm2.507-6.725c.294-.11.375-.22.375-.517 0-.63-1.309-.706-1.524-.088-.074.211.13.51.42.616.297.108.413.106.73-.011zm2.369-.052c.277-.222.318-.364.174-.611-.4-.691-1.755-.307-1.428.404.121.266.299.35.738.354.227 0 .387-.045.516-.147zm3.011 6.681c-.027-.05.088-.268.256-.484.879-1.135 1.22-1.544 1.284-1.544.04 0 .056.037.036.082l-.423.964c-.212.485-.445.924-.519.977-.169.122-.57.125-.634.005zm2.446-.596c0-.121.853-.683.896-.59.018.04-.056.209-.166.376-.168.259-.238.305-.464.305-.164 0-.266-.035-.266-.091zm-13.04-.124c-.177-.159-.493-.656-.462-.725.018-.038.248.1.512.309.264.207.457.405.428.438-.075.088-.371.074-.478-.022z" fill="#9bb92f" stroke-width=".078"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="typescript" xmlns="http://www.w3.org/2000/svg"><path d="M49 51h408v408H49V51zm246.669 314.879l19.463-1.702c.922 7.8 3.067 14.199 6.435 19.198 3.368 4.998 8.597 9.04 15.688 12.124 7.09 3.085 15.067 4.627 23.93 4.627 7.87 0 14.819-1.17 20.845-3.51 6.027-2.34 10.512-5.548 13.455-9.625 2.942-4.077 4.413-8.526 4.413-13.348 0-4.892-1.418-9.164-4.254-12.816-2.836-3.651-7.516-6.718-14.039-9.2-4.183-1.63-13.436-4.165-27.759-7.604s-24.355-6.683-30.099-9.732c-7.445-3.899-12.993-8.739-16.644-14.517-3.652-5.779-5.478-12.249-5.478-19.41 0-7.871 2.234-15.227 6.701-22.069 4.467-6.842 10.99-12.036 19.569-15.581 8.58-3.546 18.116-5.318 28.61-5.318 11.557 0 21.75 1.861 30.577 5.584 8.828 3.722 15.617 9.199 20.368 16.432 4.75 7.232 7.303 15.421 7.657 24.568l-19.782 1.489c-1.064-9.856-4.662-17.301-10.795-22.335-6.133-5.034-15.191-7.551-27.174-7.551-12.479 0-21.573 2.286-27.281 6.86-5.707 4.573-8.561 10.086-8.561 16.538 0 5.602 2.021 10.21 6.062 13.826 3.971 3.617 14.34 7.321 31.109 11.115 16.769 3.793 28.273 7.108 34.513 9.944 9.076 4.183 15.776 9.483 20.101 15.9 4.325 6.417 6.488 13.809 6.488 22.175 0 8.296-2.375 16.113-7.126 23.452-4.751 7.338-11.575 13.046-20.474 17.123-8.898 4.077-18.913 6.116-30.045 6.116-14.11 0-25.933-2.056-35.47-6.169-9.537-4.112-17.017-10.299-22.441-18.559-5.424-8.26-8.278-17.602-8.562-28.025zm-65.728 50.094V278.454h51.583v-18.399H157.938v18.399h51.37v137.519h20.633z" fill="#0288d1"/></symbol><symbol viewBox="0 0 500 500" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414" id="typescript-def" xmlns="http://www.w3.org/2000/svg"><path d="M457 459H49V51h408v408zM69 71v368h368V71H69z" fill="#0288d1"/><text x="342.219" y="344.544" font-family="ArialMT" font-size="12" fill="#0288d1" transform="translate(-6058.94 -5838) scale(18.1514)"><tspan style="-inkscape-font-specification:sans-serif" font-family="sans-serif" font-weight="400">TS</tspan></text></symbol><symbol viewBox="0 0 24 24" id="url" xmlns="http://www.w3.org/2000/svg"><path d="M16 6h-3v1.9h3a4.1 4.1 0 0 1 4.1 4.1 4.1 4.1 0 0 1-4.1 4.1h-3V18h3a6 6 0 0 0 6-6c0-3.32-2.69-6-6-6M3.9 12A4.1 4.1 0 0 1 8 7.9h3V6H8a6 6 0 0 0-6 6 6 6 0 0 0 6 6h3v-1.9H8c-2.26 0-4.1-1.84-4.1-4.1M8 13h8v-2H8v2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="verilog" xmlns="http://www.w3.org/2000/svg"><path d="M17.282 17.08H6.718V6.513h10.564m4.226 4.226V8.627h-2.113V6.514c0-1.173-.95-2.113-2.113-2.113H15.17V2.288h-2.113v2.113h-2.112V2.288H8.83v2.113H6.718c-1.173 0-2.113.94-2.113 2.113v2.113H2.492v2.113h2.113v2.113H2.492v2.113h2.113v2.113a2.113 2.113 0 0 0 2.113 2.113H8.83v2.113h2.113v-2.113h2.112v2.113h2.113v-2.113h2.113a2.113 2.113 0 0 0 2.113-2.113v-2.113h2.113v-2.113h-2.113V10.74m-6.339 2.113h-2.112V10.74h2.112m2.113-2.113H8.831v6.34h6.338z" fill="#ff7043" stroke-width="1.056"/></symbol><symbol viewBox="0 0 24 23.999999" id="vfl" xmlns="http://www.w3.org/2000/svg"><defs><style>.jra{fill:#f05223}.jrb{fill:url(#jra)}</style><radialGradient id="jra" cx="205.45" cy="208.29" r="225.35" gradientTransform="matrix(.04556 0 0 .0456 2.888 2.88)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffd104" offset="0"/><stop stop-color="#faa60e" offset=".35"/><stop stop-color="#f05023" offset="1"/></radialGradient></defs><title>houdinibadge</title><g stroke-width=".046"><path class="jra" d="M19.97 3H4.03A1.03 1.031 0 0 0 3 4.031v4.135C4.548 6.977 6.563 6.21 8.948 6.21c5.107.003 8.35 3.574 8.348 8.081 0 3.13-1.46 5.485-3.746 6.71h6.42A1.03 1.031 0 0 0 21 19.968V4.031a1.03 1.031 0 0 0-1.03-1.03z" fill="#f4511e"/><path class="jrb" d="M3 17.722v2.247A1.03 1.031 0 0 0 4.03 21h1.837C4.474 20.21 3.49 19 3 17.722z" fill="url(#jra)"/><path class="jra" d="M8.948 8.231c-2.586-.09-4.598.86-5.948 2.264v3.163c.918-2.654 3.447-3.87 5.565-3.85 2.647.027 4.689 2.025 4.7 4.284.012 2.159-.892 3.748-3.33 4.14-1.33.213-3.411-.567-3.318-2.578.046-1.037.854-1.622 1.777-1.58-.905 1.213.293 2.102 1.139 1.921 1.048-.224 1.475-1.156 1.475-1.878 0-.762-.718-1.994-2.498-1.951-2.204.052-3.591 1.639-3.638 3.602-.056 2.468 2.253 4.091 4.622 4.121 3.48.046 5.543-2.24 5.539-5.586-.005-3.029-2.434-5.946-6.085-6.072z" fill="#f05223"/></g></symbol><symbol viewBox="0 0 24 24" id="virtual" xmlns="http://www.w3.org/2000/svg"><path d="M21 14H3V4h18m0-2H3c-1.11 0-2 .89-2 2v12a2 2 0 0 0 2 2h7l-2 3v1h8v-1l-2-3h7a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 281.25 281.25" id="visualstudio" xmlns="http://www.w3.org/2000/svg"><path d="M196.18 101.74l-52.778 42.444 52.778 40.889V101.74m-136.67 110l-30-18.889v-100L62.843 81.74l47.778 37 96.666-89.222 44.444 27.778v172.22l-55.555 22.222-85.111-81.555-51.555 41.555m3.333-48.889l20.667-19.111-20.667-19.778z" fill="#ab47bc" stroke-width="11.111"/></symbol><symbol viewBox="0 0 300 300" id="vscode" xmlns="http://www.w3.org/2000/svg"><defs><style>.icon-canvas-transparent{fill:#f6f6f6;opacity:0}.icon-white{fill:#fff}</style></defs><title>BrandVisualStudioCode</title><path d="M218.62 29.953l-105.41 96.92L54.301 82.47 29.955 96.64l58.068 53.359-58.068 53.359 24.346 14.212 58.909-44.402 105.41 96.878 51.424-24.976V54.93zm0 63.744v112.6l-74.719-56.302z" fill="#2196f3" stroke-width="17.15"/></symbol><symbol viewBox="0 0 24 24" id="vue" xmlns="http://www.w3.org/2000/svg"><path d="M1.821 4.15l10.21 17.618L22.24 4.235V4.15h-7.692L12.113 8.33 9.691 4.15H1.82z" fill="#41b883"/><path d="M5.937 4.15l6.152 10.616 6.18-10.617h-3.722l-2.434 4.179-2.422-4.179H5.937z" fill="#35495e"/></symbol><symbol viewBox="0 0 420 419" id="watchman" xmlns="http://www.w3.org/2000/svg"><g stroke="#fff" stroke-linecap="round" stroke-linejoin="bevel"><path d="M166.95 145.32a93.935 123.23 0 0 1 92.934 3.263" fill="none" stroke-width="18.467"/><path d="M162.92 137.96L44.63 256.25a174.07 173.93 0 0 0 5.705 16.486l123.68-123.68-11.096-11.096zM266.54 144.04l-11.096 11.096 117.16 117.16a174.07 173.93 0 0 0 5.691-16.5l-111.76-111.76zm170.65 170.65v22.193l17.1 17.1 11.096-11.098-28.195-28.195z" fill="#fff" stroke-width="1.963"/><path d="M167.52 273.36a93.935 123.23 0 0 1 92.934-3.263" fill="none" stroke-width="18.467"/><path d="M49.516 144.56a174.07 173.93 0 0 0-.809 2.213 174.07 173.93 0 0 0-4.757 14.344 174.07 173.93 0 0 0-.016.055l119.56 119.56 11.098-11.096-125.07-125.07zM454.87 64.703l-17.668 17.668v22.191l28.764-28.764-11.096-11.096zm-80.984 80.984l-117.86 117.86 11.098 11.096 112.18-112.18a174.07 173.93 0 0 0-5.416-16.777z" fill="#fff" stroke-width="1.963"/></g><image x="21.229" y="20.262" width="378" height="377.1" preserveAspectRatio="none" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAGjCAYAAABjSWGNAAAgAElEQVR4AeydB3hUVdrH/+fOpNMF JAFUmivFXtZuIBRRQUUTil1RV3et6Lr6rSu6rg3B1dXVtXeBCCioCASIimLDhkFsgAIJSAkhPZmZ 8z3vjReGMJlMueeWmfc88MzMLaf8zp3855zznvcV4MQEkoxA7sVr01PrUrv4pdZNBNA1AHQRkJ0g ZAcJrYOA7Aipv8/Q6JgUKdBkG0iZISDSDVwSaAfAY3z+/bVSAD56L+mfwA5INAqgSkrUCKA2IOQO IcQOIUU5pNwhNZQLia2Q2OyH3OJBxqaiwk4VzfLlj0wg4QmIhG8hNzDJCEgxJH9DjgfevgGBAyCx vxSyh5DoAWA/CHQH0MEFUOoBbJbAeiHEBiED6wMSv0DgF02In1J2Vq+ZP78fXcOJCSQMARakhOnK 5GrICaO3tE3P8B0kERgkgP6Qop8E+gqgL4Bdo5gEphKAwHpIrIHAjxL4DpCrAo1yVfHsHhsSuN3c tAQmwIKUwJ2bGE2TYsjY33qLQOBwCHk4JA6HhgE08kmM9ilpRQUgvwPE1xD4MiC0r2R67dfFz/eq U1IaZ8oETCLAgmQSSM7GHAIj8td38sN7HAROkpDHATgMTWs15hSQvLn4JLBaQHwqEPgQQiwvmpHz XfLi4JY7kQALkhN7JYnqlDd2w4GQnuMk5AkCOBHAQQD4ubTgGZDAFg1ieQCBj6Dhg7SKmhW8LmUB eC6iRQL8xW8RDZ8wn4AUQ8eVHib9YjCELj4nAOhqfjmcY4wE6iGxAkIsCwDvSel5v7iwa1WMefFt TCBqAixIUSPjG6IhkDtmQw/N4xkKTQ4TEkNZgKKhZ/u1DZD4CAKLIMSik/p3WzF5sgjYXiuuQMIS YEFK2K61p2GTJ0tt2Xebj5EyMArAab+vAdlTGS7VVAI0xSeAd6QQb2uBtIW8V8pUvJwZz9XzM2AG AdpoKqpTh3uEdlYA8gwBdDEjX87D0QQaALlMCLzha5Rz2NTc0X3lmsrxCMk1XeWsig6/YFOWr0Ge JoBzICWNhNo6q4ZcGwsJkFOKT4TUZiOgzSqate8aC8vmohKIAAtSAnWm6qaMHPljWl2bzBGapk2A lKMBZKguk/N3JYHPpMCrHuGbuWj6fqWubAFX2hYCLEi2YHdToVIMKSg7SQAXABgDoJObas91tZWA H5DvCeCV2rrUwg/ndqm0tTZcuOMJsCA5vovsqeDwszd19af4LwbEZQAOtKcWXGoCEaiCwAwB7emi Gd0+TqB2cVNMJMCCZCJMt2dFFnIflJQNh8BEgKbkRIrb28T1dySBlULIpzyBwCsLCntud2QNuVK2 EGBBsgW7swqlvUIer+cSQE7UPWI7q3pcm8QlUAtgtibFU4sKu70PCJm4TeWWRUKABSkSSgl5DTkt 3XSqJuVfJDAiRFyfhGw1N8qxBH4AxJP+hrpnit/otcOxteSKKSXAgqQUr/My18216wMXCOB6AH9w Xg25RklOoEoI8bzw+R5ZNKvnj0nOIumaz4KUJF0+YsyWbL/Xdx0gr5BAxyRpNjfTvQQCkPIdDdqD iwqz33NvM7jm0RBgQYqGlguvbfKmrd2MJrPtNBc2gauc5ASElJ8EIO4/eWD2m+xLL7EfBhakBO3f wfmlR2oCtwI4G4CWoM3kZiURASmwGpAPVLTPeXnFk6IxiZqeNE1lQUqwrs4bW3Y0AoF/QIjT2Vdh gnUuN8cgsFYK3LNPoPzFwsKBDcZBfnU/ARYk9/eh3oIh+WXHaELeIZs8bCdIq7gZTCAsgXUQuK9T oPw5FqawnFxzkgXJNV0VuqJD8zcdDCHvlvpG1tDX8FEmkOAE1gohJp/Yv9vLvMbk7p5mQXJp/w0Z u7mPkP7JACbwGpFLO5GrbS4BiRII/H3xzOw3eZOtuWityo0FySrSJpWTO760s8cv7wQEeVVINSlb zoYJJBAB+bGQ4uaiwpxlCdSopGgKC5JLuvm4/PUZmcJ7NSD/DqCDS6rN1WQCdhKY45f+vxYX9vzJ zkpw2ZETYEGKnJVNV1L4h9JxAuI+9jNnUxdwsW4mQFZ4//E31N/NLomc340sSA7uo2H5Gw7zC+3f AjjFwdXkqjEBNxDYKgVuPbl/9rNs+ODc7mJBcmDf5J61toMnNfVfgLgCgNeBVeQqMQF3EpD4XGja NRyTyZndx4LkqH6RYkj+pouEkFMAdHZU1bgyTCBxCEgIPFvvabx52av7lydOs9zfEhYkh/Th0HM2 95Ye//8ADHVIlbgaTCDRCWwWENcWzcyemegNdUv7WJBs7qncXOnVum66XoBMuZFpc3W4eCaQdAQE xFyfz//n4tk9NiRd4x3WYBYkGzuEjBak0J6WwJE2VoOLZgJMANgJIW49qX+3J9jowb7HgQXJBva0 pyhLeO+QkJPYaMGGDuAimUDLBJYJgSuKZuR81/IlfEYVARYkVWRbyHfouLJcBPCUhOzbwiV8mAkw AXsJ1EOKe3Z07HYvh7mwtiNYkCzinXvx2nRvTdq9EriOw0JYBJ2LYQLxEfgCUlywuDB7VXzZ8N2R EmBBipRUHNcNGVt6hJB4CcCAOLLhW5kAE7CeQB1tqF0yI/thdtiqHj4LkkLG+fnSUy7KbpWQ/wBE isKiOGsmwASUEpBLPBouXji9+3qlxSR55ixIih6A3DEbemhe7WV2+6MIMGfLBKwnsA3AxMUzc96w vujkKJEFSUE/D87fOFoT4lkA+yjInrNkAkzAVgLyv/7MhknFz/eqs7UaCVg4C5KJnTpy5I9p9W3b TBGQf2HDBRPBclZMwHkEVnr8KFg4K2e186rm3hqxIJnUd0PGlO4vPHgdAkeZlCVnwwSYgLMJVEHI yxfP6D7d2dV0T+1YkEzoq6H5ZadLIV/gKToTYHIWTMBlBIQQj6bsrLpp/vx+9S6ruuOqy4IUR5fo VnRa2Z1S4jaeoosDJN/KBNxP4DMhcW5RYc6v7m+KfS1gQYqRvR6zKCXtVQiMjDELvo0JMIEEIiCB LR4p8hcVZr+XQM2ytCmapaUlSGF5+WUDvKnpn7EYJUiHcjOYgAkEBNAlIAKLho7deI0J2SVlFjxC irLbh+SXni0EXgTQJspb+XImwASShICAeC6lsuoqXleKrsNZkKLglVdQeiuAf/F6URTQ+FImkLwE lnkatXMWzun2W/IiiK7lLEgR8KL9RQ1tsyia60URXM6XMAEmwAQMAmsDHjFq6WvZJcYBfm2ZAAtS y2z0M7njSzt7/JgD4MRWLuXTTIAJMIFQBCqkkAVLZnRfGOokH9tNgI0adrPY611u/vq+Xr9YzmK0 Fxo+wASYQOQE2gsp3h4ytnRi5Lck55UsSC30+5D8smM8wvMhB9JrARAfZgJMIBoCXiHxVN7YjXcC kmemWiDHYEKAyRu76QzIALkDyQpxmg8xASbABGImQBZ4vt+6XVFcLHwxZ5KgN7IgNevYvPyNl0EI MmDwNDvFH5kAE2AC5hCQmJ9Zh3PnzcupMSfDxMiFp+yC+nFIQdlNEOIpFqMgKPyWCTAB8wkIjKxJ xyLy+GJ+5u7NkUdIet9JkVdQRvuLaJ8RJybABJiAVQS+9kvvqcWFXTdZVaCTy0l6QZo8WWrLVpU9 JoE/ObmjuG5MgAkkJgEB8ZNPw7Di6dnrErOFkbcqqQWJvHVvF2UU2fXCyJHxlUyACTAB0wn86pf+ vOLCnj+ZnrOLMkzaNaTcXOndLja9zGLkoqeVq8oEEpfAfh7hfW/4OaUHJW4TW29ZUo6Q8vNLUreh 42tCYEzriPgKJsAEmIBlBDZDiiGLC7NXWVaigwpKOkEiMSoXnQol5GgH9QNXhQkwASagE6C4SprU 8ooKu61MNiRJNWVH03Q0MmIxSrbHnNvLBNxDgOIqSREoGjq2tL97am1OTZNmhEQGDNtE6asCosAc dJwLE2ACTEAlAVkGIXMXz+jxg8pSnJR3UoyQfreme57FyEmPHteFCTCB8ARENqS2mJw8h78ucc4m gSBJUS7KHgVwfuJ0G7eECTCBJCHQwyM8i3LHbOiRDO1NeEEaMrbsHt70mgyPMreRCSQsgQM8Hu3d kfllXRK2hb83LKEFaUjBxluExN8SvRO5fUyACSQ4AYGBjQjMG5q/vX0itzRhBSlvbOmVAuLeRO48 bhsTYALJQ0AK8UcpamfT1pVEbXVCCtLg/I2jIfEYgKSxIkzUB5TbxQSYQDABMWS76Phsogb5SzhB Gjxu0x81IV7jEBLBDzG/ZwJMIIEInJc3tuyhBGrPrqYklCCReaQIBOYByNzVQn7DBJgAE0g0AhLX Dc0vTbj18YSZ0iILlEaBjyRk0tjsJ9p3jNvDBJhAVAQkpBy/uLD7jKjucvDFCTFCokW+Bsg3WIwc /KRx1ZgAEzCbgIAQz9IyhdkZ25VfAgiSFPoin8DxdkHkcpkAE2ACNhHI1AKBuYmycdb1gjS0oOz/ AJxn08PAxTIBJsAE7CbQ1ePV3kmEPUquFqS8/LJzJXCX3U8Dl88EmAATsJnAwVLUv+R2c3CPzRBj Ln5o/qaDIeRbABJ2k1jMcPhGJsAEkpHAH3oPrNTWlkxb6tbGu9LKLu/sDfsgRfsEQB+3gud6MwEm wAQUEJBC4NyiGTmzFeStPEvXTdlRKAmkaLTxlcVI+ePBBTABJuAyAkJKvKDPILms4lRd1wlSudj0 LwDDXMiaq8wEmAATsIJAG6kFZrnRyMFVgkQ+6iTkX63oUS6DCTABJuBaAhL9Aqhznc871wjS0HM2 99aEeIEdprr2K8IVZwJMwEICQmBMXsGmGy0sMu6iXGHUkHvx2nRPddpHEDg87hZzBkyACTCBpCEg G4UUQ4oKc5a5ocmuGCF5a9IeYjFyw+PEdWQCTMBZBESKFGKGbpnsrIqFrI3jBWno2NIxHII8ZN/x QSbABJhABARkDlI8z7lh06yjBWnImNL9IfF0BMT5EibABJgAE2iRgByVl192bYunHXLCsWtItN9o O8reBztNdcijwtVgAkzA5QTqhSaPK5re/UuntsOxI6RyUXo7i5FTHxuuFxNgAi4kkBaQ4tVRo0od G8DUkYI0JL/sGAlBXrw5MQEmwASYgEkEhMRBtZnifpOyMz0bx03ZDb9gU5a/PvAFgANNby1nyASY ABNgAlIKeeqSGd0XOg2F40ZI/nr/AyxGTntMuD5MgAkkEAEhpHh2RP76Tk5rk6MEacjYjcMBcZXT IHF9mAATYAIJRqC7X3gedVqbHDNld8LoLW3T0xu/BbCf0yBxfZgAE2ACiUhASoxZUpgzxyltc8wI KT29cQqLkVMeC64HE2ACyUBACPnYiRN+6eiUtjpCkIbll50C4AqnQOF6MAEmwASSg4DITvN7pzml rbZP2ZFNfE0GvuGAe055JLgeTIAJJB0BiZGLC3Petbvdto+QajPEP1iM7H4MuHwmwASSmoDA407Y MGurIOWNX3+IRMBV8TqS+qHlxjMBJpCoBA6oyRB32N042wRp8mSpwe99AhApdkPg8pkAE2ACTEDe OHjshkPt5GCbIC0r2XQlII+zs/FcNhNgAkyACewi4NWkeEIfLOw6ZO0bWwRpZH5ZFynkPdY2lUtj AkyACTCB8ATEse9/V3Zp+GvUnbVFkBqaxKiDumZxzkyACTABJhATAYl7cs9aa8vfZ8sFadi40qMA 2KbAMXUQ38QEmAATSBICAuiipabfZUdzLRYkKQIB+R8AFpdrB1oukwkwASbgTgIC8uph+RsOs7r2 lgrDkPxNFwHiWKsbyeUxASbABJhAVAQ8AWgPRXWHCRdb5qnhd48MPwDobkK9OQsmwASYABNQTEAI eVbRjO5vKi5mV/aWjZBq0sVNLEa7uPMbJsAEmIDjCUgpHjjyCmnZXlFLBGnEmC3ZEPJmx9PnCjIB JsAEmEAwgQM7lJddHXxA5XtLBMmX0vhPAG1UNoTzZgJMgAkwAQUEBG63KkSFckEafk7pQZC4SAEm zpIJMAEmwATUE9gn1Z/yV/XFWGB+7feARkdeKxrDZTABJsAEmID5BITENXnjN+9rfs575qh0hPT7 Jthz9iySPzEBJsAEmIDLCGSJQODvquusVJACAZC/OstMy1XD4vyZABNgAslKQEp5xfD8Tb1Utl+Z IA0pKD0ZwDCVlee8mQATYAJMwDICqX7NTwFVlSVlgiQgbQ/2pIwaZ8wEmAATSEYCUpw/ZOzmPqqa rkSQ8saVngSIIaoqzfkyASbABJiALQS8Aj5la0lKBAkBOdkWVFwoE2ACTIAJqCUgxflDz9ncW0Uh pgvS0PzSE3l0pKKrOE8mwASYgCMIeOFRY3FnuiBB4FZHIONKMAEmwASYgBICEvK84eM29jQ7c1MF KW/8+kMkMNLsSnJ+TIAJMAEm4CgCqb6AuMHsGpkqSPB7yL0E7zsyu5c4PybABJiAwwgI4PIR+es7 mVkt0wQpd1zZAQDGmlk5zosJMAEmwAQcS6CNT3j/bGbtTBMkLYAb2WedmV3DeTEBJsAEnE5AXntc /voMs2ppitPT3LPWdhCQl5hVKc6HCdhNwOsVaN9WQ1amQFaGQEaGhox0gdQUAaEBaali19x0Q6PU j1OdG30S/gDQ0CDh9wPVtQFUVUlUVgdQXRNATa20u2lcPhMwk0DnLOE5H8BTZmRqiiBpqekTAcnx jszoEc7DUgIkLL3396JvrxT03T8FPXK8yNnXgy77eJTUo7pG4tdSH9Zv9OGXDT78vK4Rq39uRFV1 QEl5nCkTUE1AAtcD8mlAxP1rK24DhNxc6fV0LfsZwH6qG875M4F4CXTqoOHQAWk4dGAqBv0hFQf0 NOU3WbzV0gXqu58asXJ1A75YWY/NW/xx58kZMAGrCAjg1KKZOQviLS/ub6O3a9mZksUo3n7g+xUR SEkROKR/Kv54eJr+v3t23I+8kpr27O4F/R9+StN0/MZNPnzxTQM++7oeK76pR31D3D8+ldSbM2UC REBKXAUgbkGKe4SUl1+6FAK53C1MwCkEaK3n2CPSMfiEdBx/VLpTqhVXPZZ9WocPP6vDxyvq9fWo uDLjm5mA+QQCwu/pVzRr3zXxZB2XIOXllw2AkCXxVIDvZQJmEKCR0PFHpWHw8Rk48ZjEEKGWuJAw LXq/Fp98WY/GRh45tcSJj1tLQEDcXzQz+2/xlBqfIBVsfBQQptqhx9MYvjf5CPQ5IAUjB2fgrFOz kq/xAN4qqsE7i2vww5rGpGw/N9pRBLZ2kuXdCwsHNsRaq5gFadSo0syaDGwE0CHWwvk+JhALAbKM yzsxA6OGZ6Jfr5RYski4e0iQ5i2qwdIPa1FXz6OmhOtglzRISHleUWH3V2OtbsyCNLRg46US4plY C+b7mEC0BPbt4sGoYZkYdybvMAjHbtbb1Zi7qAYby3zhLuNzTMB8AhIfLC7MoWjhMaWYBElKeeCM udULXp1TeQDtq+DEBFQSGHRQKkYPy8SQE03bEK6yuo7J+73ldZi7sBpfr4p5BsUxbeGKuIOApkE+ PLnTjQMOSv93LDWOWpBIjAB8T4XNW1iDp1/bCRalWNDzPa0ROO7IdH1a7pjD0lq7lM+HIfDNqgZ9 xFT8UW2Yq/gUE4iPAE2fP35fZyOTvwsh/mV8iPQ1FkG6F8AuSwoWpUhR83WREsg9PkMfER0yIDXS W/i6CAjQxtt5C6t1Cz3JExsREONLIiXQe78UPDlllxgZt3mFEFHt8I5KkKSU5E9lr4lpFiWDP7/G Q+CUY2lElIXDBrIQxcMxknsfeqoCbxfVRHIpX8MEwhJoQYzontOEEPPD3tzsZLSCdCqAkAWQKP3v 5Z1s4dMMMH9snQBNyZHFHE3RcbKOwKofGnTLPNrTxIkJxEIgjBhRdjOFEFGFJIpWkF4EcEFLFSdR eviZipZO83EmsAeBA3unYPTwTJw6OHOP4/zBWgLkmohMxskbBCcmECkB8gP59INdWru8vRBiZ2sX GecjFiQpJf3VqDZubOmVRaklMnzcINCxvaabbp9zuns3s1IYCWMdJjNDoLau6XNKCnaFojDa65ZX GimRVd53P/ImW7f0mV31pC0Y40a30Wc2WqnDJUKI51u5ZtfpaASJhl7Td90Z5g2LUhg4SXxKCGD8 WW1w6bi2jqZAISHWl/qwcZMf5OR0yzY/tu8IoKIygIqdgV1CFK4RXg/QsYMHnTtq6NTRg25dPdi/ hxf75XhBZuxOTrSPqfCtamzdHtV6tJObxHUzkUAUYkSlLhJCDI+0+GgE6U0AoyPNmEUpUlLJcR15 Vrj1Guc59aA/urRP59vVDbr7nTW/+pT7hyNh7pHtxYADU3BQ31TdiKNnjvO8kD8/sxKvzK6KSICT 4ynmVkYpRgawbCHEJuNDuNeIBElK2RHA9nAZhTrHohSKSnIdoz+8Z52a6Shfcx9/UY9PvqjDFysb 9BGQE3qka2cPjjg4DUcflgayNnRSuu/RHSj6gA0fnNQndtQlRjGiql4jhHg0kjpHKkgUnvzZSDJs fg2LUnMiyfP5vDFtcMlYZ0zP0R/UpR/V4qtvGxwfW4g8lx91SBpOOCYNp+Y6w+CDnLjSd/nnX3h9 KXm+wbtb2r6thosL2kayZrT7pt3vioUQg3d/bPldpIL0NtmUt5xN+DMsSuH5JNpZp3hYIKuxhe/V 6kHu3BqmgcSJggtS4D4nxHZ66fUqvPh6JU/jJdqXNkx7sjIFJo5vF6sYGTnvK4T4zfjQ0murgiSl bA9gR0sZRHqcRSlSUu69zuMBLhvXDgWj7bOeW7fBh/lLavQpJjJASKTUrq2GYSdl4KqL2tnerH8+ VI73PmYzcds7QnEFTBIjquWVQognW6tuJII0HkDM7sSDK8CiFEwjsd4POzkDt/zZPqMFGg3NXViD L1bWJxbYEK0ho4hDB6TqXi3sXG+a/U41XplTpVsehqgmH3I5ARPFiEgsFEKMaA1JJII0E0B+axlF ep5FKVJS7riOwoVfPLYtzjnNnlHRzHnVmLeoGmWbk9NEOWdfjy5M+WfYw5+e0keeqdB/DLjjieVa RkKA9tZdPiHuabrmRXUQQoT1nNCqIAUCcqYQ5gkS1ZBFqXk/ufOznaOiFwsrMXt+DaqqE2taLtYn gf6AnD0yyzYjkjcX1GD2/GqOwRRrBzrsvusuax/vmlGoFh0phPgi1AnjWKuCNOutquvHnJ71kHGD Wa8sSmaRtD4fWiuiX0/n2vCr/IXCSsycW+14Sznre6WpRK9XYMxpmbjiPHvWmZ54aSdef6tVhy52 4eFyIyCgSIyoZE0IEdbPPHnvDpu2+f5y7uqfGo/PO8nc4Gh/6JOCju09+OTLxJ/zDwvYZSfJ0uvZ aV0w4EBrvQ2QEP3ffeX63iF/cs7ORfSkBAJAyfeN+tpOba3EkYdYG0vqqEPT0KG9B6Wb/dhZyaPX iDrNQRepEqM/3bK14sWnMqesWnVnfILUa9Ckh0s3+Tuv/qkRLEoOenJsqArtKbpuIhldWpdmzK3C P6aU47Ov6sFCFDl38rNX8kMjXn2jGo0+icMHWSdM9GPzrFOzUF0r2S9e5F1m+5WqxOiav28lLyjp dahatGbV1F/DNTTsCGnI2M19hJR3UQbk14tFKRzKxD3X94AUfVOclc5Q58yvxgOPV2Dph3U8PRfH o0UjppXfNWDGvGpoAjjYQj96Rx+ahvbtPPh5nU93PhtHM/hWxQRUidH1d2zDqh9+30wtsGltydQl 4ZoSVpB6DbxxrADOMDIgUfplgw+nHMfTdwaTRH+lX7p33dwR/XqnWNLU5Svq8PgLO/HGuzU85WMi cRpdfvltAxYva9o71L+fNVOuB/VNAVkA/rYtgJ/WsZcHE7vUtKyuubQ9Ro8w3yMIiRH5iAxKaWtL pj4d9Hmvt2GNGobkl84SAmOa30V7H26/gdzbmZvY0MFcnvHmRhswrTTnfvQ5EiJnLoiTFdthA9NA 01H7dfcip5sHbTI1tMnSdMwNjVIfBZBn8A2lPtAG3a9K6rH2170CLMfbLabcT/uYRg/PwinHWec3 j4wdyOiBk3MIkBidaY0YUaP9XunvuqCwZ4t+UVsUpPx86dkuyrYCCLnbUZUokfnof54Na6runN5M 0JrQegMFzjvpj9b8saJ1ohdmVoH+qDsppaUKDD4hA8NPzsAhA2IbUWwvD+CDT+vwzmJn+oEbNSzT 0nXBjz6v04MB0pogJ3sJqBKjG+7YhpV7jox2N1SK/MWF2a/vPrDnuxYFKS9/w3EQ2kd7Xr7nJxal PXkkwieaXrnyAmtMht9bTt4VqvXwD05iRzvUzz29DS44t42p1fr863p9Ayn9UXZS0jToa4QTzja3 veHa+NyMptAW4a7hc+oIqBKj2+7djk/D/dgQeHLxjJwrW2pZi2tIvQbedJEQGNLSjXSc1pNUrCnR vDMthn7KJuHh8Jt+jqboLjjXGu/cT76yU18r2rzFOTbcNCKiP8r33baP7prHbMA53bz6iOsPfVJR XRvAxjJntJ0s8mh9icJy0B6zvr3UrxfSKJy+4zSlSdF3OVlH4M8Xt1MSDqZVMWpqYoe1JVMfaam1 LY6QhuaXLpACEUX645FSS3jdcZz2FNHUDXleUJ30Hf3vVDsmDhG1lzaTjh1tvZcDGimR/z0aOTkp 0ZoC/YK2Kt37nx1YvIzjLVnBm8SIPHqYnSIUI71YKf09lhT23BiqDiFHSLm50ivaVP0XQEQT5zxS CoXWHcdGDc/EnZM6os/+6n8VP/x0BV6aVYXKKmdsmKTRwLgz22DaHftYuk/HeDIoSuzQkzJ0I4kd lQE4ZbT4/c+NmPVONVJThCUboGmt0uMR+KpkD4ssAxO/mkTACWJETdEgVqxZNW1lqGaFFKRex151 tJDy6lA3tHSMRaklMs49ftn4tpg4Qf16EVnO0eZWChXuhETesmmt7N93ddajtNpdpwN6pmBEbia6 dfVie7kfW7fbL9iNjdBHbr+W+nGyBRFsDx63vWsAACAASURBVOmfqntuIevE6hqewjP7mVQlRpOn lmP5iihH+EJsXVsy9a1QbQwpSH37T5oAgWGhbgh3jEUpHB3nnOvYXsOV57eDFRtdyWKSgrrV1tn/ R4aEiPZVPfqvziAXN05LfQ5IwWl5mejU0YMt2wIor7BfmNat9+mjWlpfG/SHiCZMYsZKJvW0zWB9 qR9ULidzCKgSI4qJ9cEnMRnoZK0tmfpYqNaFXEPKKyibC8hRoW6I5BivKUVCyZ5rjjksDffc2kl5 4bQ2MnNuFTY5wGiBhIj+0N9wuXXrImYApvW2eQur9T1NZuQXbx4nHJ2OO28yf/9hqHqRN/cXX68K dYqPRUHgTxeocYIcb4DGVCm6zi/M3tK8KSFHSL0GTnpYADGvfPFIqTlmZ3ymxcxbrwm5rczUCj79 WiWeea0SVQ6YeqHQ3/+7vwsorLrbElmbjh6RpW++JWG321np+tKm0VJ6qoaBikdLhw5MA0XI/ea7 BvicYYzotscHThUjAtkoRPG6kqk/Noe6lyANz9/USwp5W/MLo/3MohQtMbXXTxzfFpeOU2vSvWRZ LR5+Zifo1e405MQMkH8uFRZFVreN3PzQVGN6uoYNZfavsaxYWY9fNvpwyrFqrTIP6puqm+GvXN2I Tb+xKkXz3CkTo3+bE7peCPnz2pJpxc3btJcgHXDwDacC4tzmF8bymUUpFmrm3pOWJnD1Re2Vxy4i bwsPP70Tv2219w8HucK59rL2utFC1857Pd7mwrU4NxqV0BoLWb+tXe9DXb1963L03SaHrRlpAqr9 4tEot6IyALL+49Q6AVViNOVxMs+Pac0oRKVFw9qSqS81P7HXN7b3oJsmAji2+YWxfmZRipVc/PfR lM+F57bF6UPNd5wYXLsHn6jQg+YFH7P6PcVposXb8We1Qbcuez3WVldHaXmDDkpFwag2ujB9v6YR ZBFnRyKHrZ99XY/ynQEce4TaKdE/Hp6u7xejDbycWiYwcUJbFIw23+MGidGCYlNnPjpflP/gA8XF e8ZH2suoIa9g43JAmCZIBjo2dDBIWPOad2KG8vUicoY7Y16VrdMpZC1HfvdIkJI1vTK7Cq+9UWXr iClnXw/yz2ijIuz1Ht1Khh5Pv7rTEVabe1TMAR9IjGhfndlJgRjpVfT40X/hrJzVwfXd46ckOVSt FVX/BmD6LkkeKQVjV/ueHkrVgfTojyB5bq6qtmfaiJydXj6haR8VbTBN5kR7eMjlEfXEdz82gmIg WZ0qq6Ue/ZnqQF7RVSUa9Xfr6sGOioDt08Oq2hhLvm4TI72NQi5vvkF2D0HKOfjKgwBcHwuQSO5h UYqEUnzXkPHChflqjRfuf2yHvpM/vprGdnf/vim4dFw7XH1RO9CGUjsTTR9R8Luff/FhQ5kfASn1 zZ121YmE4PwxbdDogx5M0w5h+mZVA35c68OQE9QZPPTaLwWnDs7E9h0BikRqF27HlKtKjMizyjtL TJ2m24OZEFi7pmTaouCDe0zZ5Y0tPQ8SLwdfoOL9iNwM3HyV+ebHyR66QtUGOOMZoCm619+2xw9d v14p+nTQaUPUrocZbW3p1fDYTYEEySlp89Q2S9MNSM4bY/7USfOyWvtMDmxnvV1tS+j3lBShj2DH nBbz7pHWmqeff3lWFZ6fWRnRtYl4kSoxeuSZCt3PokpmUorFSwqzhwaXsccIqffASRcBOD74AhXv KaTx5q1+0EY7M1Oyegnvso8Hl09ohzNPVfflnzm3Gv99YaflfugO6OnVR3yTrmwPEiW7Erk9euqV nfr+KtqP01KimE7kk418wdEIhabT7EpHHpKGC85pq6+30FSelYnaTgYPZAlI9VCVaOqW9iuFDXmg qnCb8724oK0+VWt2NawQI6qzEGi/tmTqA8H133OEVFBKw6c9FCv4YrPf80gpfqL0B2/a5H3izyhM DnZEcqV1IfJArvoXdphm66dKvm/QfynG6o2a3DSRqfa4s+wfMVE/vrmgOuTIrjUO8Zy3IuAjjd4L 36pC6WZ7tx3Ewymae0mMzj/H/GfKKjEy2iok9i8qzPl112fjDb3mFWwsBUR28DHV71WJ0pz51Xjs +cQOl2yFJd3N/9ymx8pR/RwY+dOUF5luF4xWN9ozymrt9YH/7sDC98yZQ9+3iwdnjshCwSj72/XQ UxV4u6imteabep6CAF51oZrQB8EVjSYMQvB9bnqfKGKkM5cYubgw512D/64puxMn/NLRG/DcbZyw 6lXV9B1t1mvbRkOihkomx6g3XKHONxv5orvlX9vx68aWp6fMfkbox8kjd3dW7pamtXrTH2zyTk7P plmJPFiv+KYeRR/U6lN5FIPKrkRulAb8IVWfygs3/Whm/Wi9jb6LZHBxxMHqpvDyTsrAth0B/Jig xg6qxOh/L+3EnPnW/kjRny8hvlpbMnW58aztEqQDD/rrURC41Dhh5SuLUnS06aGk0BGqEnldePyF naD1EKsSmS3/5RJ1AhtJO2hK6//u367UcovMo8kwYulHTUYRqr0ctNTunH29GHx8Bsj4wMrNpt+u brJKpLJVJRJcenLJ4i+REhnKXKTAgpbEqPCtaptQiQ1rS6bONQrfJUi9Dp40EsAZxgmrX1mUIiNO bkFUrkfQw0lB9KxMNNq74jz1cZlaahO1+dZ7t+um0i1dY/ZxcpRKI4YPP6unxV0c2Nseg42DD0rV nbeSAYJViUZlbxXVIC1NA4WcUJHIBD4zQ8Pn31jXLhXtMPIkMbpkrPk/Qu0VI2qdrF9bMu0Zo527 BKn3oEkXmOkyyCggmlcWpfC0/nJJO6WL/HdOK8f8peasmYRvye6zfQ9IsSykwe5Sm96RR3ISom+/ t9YCLbgeFPPo4y/qdXGiUOoUE8nqRKO01FSBL1ZaN6Kg+FiffFkP8rWoKs4STYt2bO9ByQ+Nlo72 ze6/xBUjIiXarS2Zep/BbJcg9Rk46RoA/YwTdr2yKO1Nnhb6aUGYFsVVJLJQuu/RHVi52ro/SEY7 aPqxn8Wjg+dmkBCV61M6ofYSGXWz8pWixH74WR2+WtUACoZn9aZf8o9nbFy3st0kghSm5OjD1Kwr 0QisXRtND3hIG2ndllSJ0bPTKzFjrl3TdHv0QlrvQ/76xNpvH9Qrs0uQeg2c9A8Anfe41KYPLEq7 we/X3YsJZ6nzETb7nWrQ2okdsXbItFvFBund9PZ890JhJf7vvnJ9zcQOLwZ71ib0p81b/Hj/kzpQ yIWMdIH9e1jnFql9O49pVoWhWxf6KO2RIiexZDWqItEPnjOGZeplbCxzj1m4KjGiH2SvzrF2Wj5c v2oy8Maakmnr6RpdkJp82FVOBcQugQqXgRXnWJSAwwel4rF7OiubZ6fQ4k+/at8ud/rCDein3tqM /O7d/sB2fP51gy1eC2L5vlD8n/eW12HVj43IzBCwwl8f+Yhb9UOjLXt5SCjeXlyL9FSh7Hknwftt WwA/rbNvijbSZyH/jCxMnGD+uiqJEX0fHJWE9t6akqlfU510Aeox8KoDpMCNjqokoJvdqvDo4AaT 8NzjM3D3X9WFGievC9PftPfBJFdH7dtqyh676W9UYfK0cny8ot62EA3xNo42epJF3k/rfPo2hpxu akdM6ekCxcvNinkTXeuNdSUKRKgqIi15hSfvEbSu5NREYnTlBUkiRmTWAJSsLZm6lPpDf7r98PcF 9nDa4Ji+MmJwmD21Y0QSdeLmWfJQoNJb9z8p6qNNf3SMB8vrgbJf/TPnVYOmIrdud8/0jMGlpdeP Pq8D/acfKqOHZYJc5qhIJx6Trlv92bm29uTLO1G+w6/kjzIxu+L8droFnhN94CWbGFF/aEAf41nW BUlqYn9h3ZYTo+yIX5NJlFQ9kAbsa2/fhlU/WG+8YJRvvHbsYP7sMDkSJQ8dm7YkjhAZvIzX4o9q Qf8piuqo4Vkg7+dmp306emwXc9oXQ/14x40dzW6enh+53UlPE3oIFSUFxJCpqu8+OaB13DRdEB8p sb/xUf+r0HvQjWcC4hTjoBNfk2FNidZUVMwbU3+SJR25VdlQZp73gXieE/pjkD/KHF9cNBp64L8V IH9zZLGVDIlCXsxfUqOviZgdnHDRB7Uod4BFGnkJ+fDzemiK9mmRWTgZcnz6pf17lc4ckYmrLzZ/ Y7grvKELYG3J1Ifoe6uPkITUekp9b7Ozv8qJPFJS5RKEetSJfv0aTJjCp82VJLQ//2JCZs5+9Fus 3btLa7CguAan5WXihsvN/4PWYsEWnfh5XaPuZd7nB+iPttmJ8iTBe+H1Sj3on9n5R5IfRTy+5lLz +84VYtQEKCc3V3qLi4VPHyEdMOCma4RA70jg2X1NIo6UKKYJuc5RkWio/uQr9lnStdQm2ogZT7hl cm1EFkO0sZQTdN9t5GFjZ6XEMYfHt6eHhN4JIySjX/1+6KMYVcYOtFcpI03Tpwgrdlr7PJEYXXtZ UosRdbOW0rby6Z+/nbZTN3ESQvY0Ot8NrzRSomiGZicydCDLLyuT7groTDVi9NQrlfofbSvbw2XZ R4AMEd54txpTHt9hXyUUlkzGDuRdQ0UaNTwTz0ztAnKlZFVSJUZkPetEg41wXGUA+9F5w+a2R7iL nXhu3qIaUOwOs5OVokTid+4Zarwv/PupCpCTVE5MIJEIvPZGFR58wvzvvcHooTv3gdlrckbewa8q xcjOvYXBbYzmfUBqetgjbdSoUpqYNX9yNpraxHgthUhwqyjRnLFheh5j81u87Z8PlevOK1u8gE8w ARcToHUzitOlKt11c0cMO1mN1wiqM4VZUTFNRyMjN4oRMZEIdKNXrTrTY2lAPrMfIpWiRNNpZidy B3PdZe2VLNBSXW+6axve+9iejY1ms+L8mEBLBChkxgXX/qYbtbR0TTzHb/lzB9AoxuykKiCpm8WI GAsNXejVK4Xs7OQ9SJE8ECRKlMz+1WFMpz3xkjmRZ7MyBSaObwearzY7kbXZ7Hersd7CgHpmt4Hz YwLRECjb7Mdjz1cgINVY4NHfE/JcMdMkJ6QsRmF6V4ocOuvVAgFXj5CMJjpdlLp29mD8mWqcpJIY Pf3aTlBUUk5MIF4CNbXWWprFU18yB//PsxXw+SQorpbZieJ0kfd18vsYT1IlRq+/Ve3aabpmPHXH 3l4BdEmUP2NOFaVuXTwYO1qNGJFVFXnr5sQEzCIg3aNHu5r8+Is7dR91tLnc7ERRWj2aiNlyjdw9 me36jNpIYmTW7I3ZzKLPT+xL93ghRQe4fc4uqPVOE6Xe+6XgySlqonok1gMZ1In8lgnEQID2pdXU Slx+nvmRVcnVkNeLqEcjpxybjr9f1yGG1oS/JfG++1KHpEnR9CZ88911lkRJhfUdrSlFY+jQr5c6 MaJFzMT5deSu54tr61wCtNVh2pNqzMJpI3c0338So9tvMN8XX+KJkf486aA0IPEEiZpntyhRBM7H 71MzMiKXIG4173TunzKuWaIQeGdxDf4xpVxJcyL9UapKjMgNWIL+EG0aIQkI8yVcyaMQfaZ2iRIF 1vv3nftEX+EI7qBpCbftwo6gWXwJEzCVAIXquO4favYqkSiF8+hysqKRkRN9UprYaem5F69NJ08N 5jtSMrGW8WZltSgdc1gaptyuRoz+99JOR7uRj7ev+H4mYCaBku8bcOmNW5TsVaJN7aEcotL3/x8K pukSXIyaur06q4NXAubv/jTzqTIhLxIlSqr3KdHDeM+taqK8PvxMhZIvlgl4OQsm4FgCFMLi+cIm /3dm7/8zPIXTd5OSqu9/UogRgFQEMryQSHdosFhTH3LVovTFynplYnT/Yzuw6P1aU3lwZkwgWQiQ B+9HnlWzgdYQueUr6pR8/5NFjOhZDABtvBCIz1e9i55qlaJkeHUwG8fkqeVY9im7AjKbK+eXXATI EzptoA0EpOk+JEmUDGEyk+qbC2rw2PPJs8fQ70EmBehL6DWk5g+IKlFqXo4ZnynC66df2R/N0oy2 cB5MwAkE6A88xVdS9QPSrDaSGJGAJlMSgUAaCVLSjJCMznWDKN04eRu++a7BqDK/MgEmYBIBMpuu b5BQ4dXBjComoxgRN02KtmRll24GRLflQaLk1OHw9XewGLnteeL6uosAbZ+g/XxOS8kqRkY/0Agp aRMtGHo9wJUKwkzECvWKm7diza+Nsd7O9zEBJhAhAdrP1+iTuGSs+a6GIqzCHpeRk+Rkm6YLBiAR aJPUgkQwCt+q1pnYLUr0ML65sBrr1vuC+4jfMwEmoJDAK7Or0NAgbf9RSt9/w3xcYXMdnbUAPCRI zvh5YCMqu0WJHsbpc6uweYvfRgpcNBNITgL0/acwFuG8L6gkw2K0my4JEq0jJX2yS5ToYXx5dhW2 lbMYJf1DyABsI0DT936/NH3zfGsNYjHak1DST9kF47BalOhh5MB6wT3A75mAfQTI0Ims71TELgrV Khajvanw6KgZExIl8hmnOrEYqSbM+TOB6AksKK7FPx9S4yk8uDb0/f/fy+r/zgSX6Yb3JEgujA+p Fq1qUWIxUtt/nDsTiIfAex/XKRUl4/tfV58osbrjob3nvSRITZ4H9zye1J+yMgVy9lU3m0luRkYO yUxqxtx4JuBkAocMUOcvgL7/+WeYH2rdyTwjrZu6v7qR1sBh15EYTRzfTolvquCmUuRJEWR2Hnwu Gd5npFPrOTEB5xG47rL2yr//FBKdEsc2293/EvCzIO3mAavEyCiS9j4JAcyc17QXyjieDK8eXr1M hm52VRszMwQun6D+x6gBhUXJINH0KqBV0Z8FdiUNWC5GRldccX47x/rUMurIr0wg0Ql0bK9ZKkYG TxKliwuSfiuogQM0Qkp6d9JWj4x20f/9DbkuSfEKHr43BxPmcy0vCIehw6eiIdCtiwdjR7dRPk3X Up14pNREJiBkJQlScvk4b/ZU0DDdijWjZsXu9ZEeSq8XePpVtjHZC06IA7SJkRMTiJdA7/1S8OSU zvFmE/f99P0nv3rkyihZk9S0eg0yuUdIVs4Zt/agjTuzDSZO4OF7a5z4PBMwg0D/fs4QI6MtNFPi 1JAYRh1Vvnr8qNEgkncNyQprmmg7kESJLPA4MQG7CGRkJL4F5CEDUvGfu+0fGTXv42QWJQ2o0gSQ lNuFnShGxsNJ0SztcvRo1IFf3UugPs64jhr9VUjgdPxR6Zh2xz6ObWGyilIDtNqkXENyshgZ35Kz R2aB/jAkc3wUgwW/RkegsZHX11oiNuzkDNzy5w4tnXbMcRIlSkm1ppRVvUOTkOodNzmmmwFVYvT6 73GVzGzqmSMy9fqmpyX2L1YzmXFeTKAlAqOHZyoTI4pAa3YiUco/I8vsbJ2aX13x873qvIDY4dQa ml0vVWJ0273b8elXTdbzNN1mZiI3I5QK36pC6WYOUWEmW84reQgUjMoC7flTkcgZK/m/o2SMbMwq xwgcakQiMCtfB+aj65AmZHIIkhVi9MRLO6FipESi9OIjXXFQ3xQHPkdcJSbgbAIXntvGEjGi6bWX Z5lvtk2ilAQjJX2mToOQCT9CskKMjK8kiZIqV0CP/qszjj5MndNHow38ygQShQBto7gwX81Witsf 2D0yMniRbzoWJYNGNK9NAyNNAluiuc1t11opRgabJ1/eielvmv9LifK/99ZOGHJChlEUvzIBJtAC Ado+QdsoVKS/3bMdy1eE9rqmUpTMXhJQwSa2POVmuk8LaFpZbBk4/y47xMigQh4XVPxSovxvu7YD Rg3j8BUGa35lAs0JXHNpe6j64339Hdvw+dfhPa6pEiUSWTLOSMC0ldrkFVLobxKtgXaKkcGSHkpy B2L2Qiflf93E9qANjDPnJp+ncIMvvzKB5gQ6ddBwwTltlfmlu/KWrfh5XWPzYkN+pu8/JcNXXciL Yjh47WXt9bso5HrCJCFLqS3erBp/WU2CzQA5QYyMB4UWOn0+4PLzzJ/HvuK8dsjK0KDC5NSoP78y AbcQ+EOfFDx2jxrvCxTldfa71Vi/0RcVDhIl8lFp9tRhoomSDDQtHWnz5uWQzCaM1DpJjIwnd8bc KvzvJTUOMcj31VUXqjFnNerPr0zA6QTI+4JKMZo+typqMTKY0fS9ijVlEqVEmb4T0DYRLyNM2gYD nptfad7Y2LdjZjuC9xnFmi/tI3jkGTWO1c85PQvU9pQU3kAba//wfe4lcFpeJu66uaOSBtDI6OnX dmLzlvj2AKoUpTOGun9NSRMB3ZZBjxgrpVgvhDxQSY9alCn9QSbPBmanux4q37XpNd68ac63vkHi 5qvMd11CbScXZLPnV2N9aXTTCvG2i+9nAnYRoDhGKqbDqT1vLqjBo89VQJrkickILWP29N31l7fX 16oXFNfa1Q1xlys0/EqZ6CMkoQXWx52jjRmoEiPagf3+7zuwzWoePTQkcioSjQ6fe6gLDh/Ee5VU 8OU8nUWAjIVUidGc+dW6H0mzxMggp2qkRD9yR+S61hjA37ApRx8hNU3ZSbhWkFSKkeEOxHiYzHol kbv5n9vNym6vfKbc3glDT3Ltw7lXe/gAE2hO4OqL2imLHUTeVh57Xs2aL7WDREmFRxcXi1JpcbHQ p3V0QZJC6MOl5p3u9M9uFCOD6Zff1uNPt2zFO4vV2JP87S8dcM5p5vrVM+ruhFdaxD7qEB4JOqEv rKxD504e3eHwGEXP9qtzqkDeVlQnVW7GXClKQQMifQ0JkL8C7loQd7MYGQ/7T+sa8eLrVfD7ocQY 46qL2qFDew3PvGa+J2KjDXa9nnB0Ouh/8Ue1mLuoBt+sijMIkF0NMbFcjwf6jxBVTkRNrGpMWR06 IBVTFcYxou0TVoZ7MITP7A28JEqNPmDJMpesKQUNiHRB8gY8P/pFIKaHxI6bEkGMDG5bt/vx3xeb fpGpsBAcf1YbZKQLPPqc+l99RpusfM09PgP0f+F7tZi3sBrf/RTZpkUr66i6LCEAGjEksvk/rY/Q H1pVibZl2OFRW5Uo3XZNB/h9cpcXclXczMlXrjHy8dCbIwZOqawVlbcCQv9snHTiayKJkcE3EAA+ +bIebdto6N8v1Ths2utBfVPRsb0Hm7b4UbHTGT88AhIgsTQr9TkgBWT+26mjB1u2BVBe4Yx2mtW+ UPmQEJ11ahZ0p7uHmjd9+eaCauxwyHNC7R53Vhtcc0mTd4JQHOI99u+nKvDGu2qmziOp2+ff1CMz Q8OAA8397p9yXAZ+2eDT/0dSD7uuEZDPrymZ9iWVrwvQqlV3yt4DbzofgHPj+gL6XhsVpt3B8Uzs 6hQq97Ov1DyYlDftYj9zRBbW/OrDr1HuNlfBhKYUzj2jjel7pw7snaL7+WvXVmsS4MrEFKbTh2bi v/d2xjGHmydERj/TNHJdvUm2zkamMb6SN5ILzjXvh0vzakyeWo6iD+yf2iJRUvGD1BWipImpa7+d qtsx7BoR9Rk4aSSAfs07zCmfE3FkFIotPZgej8Ah/c39tWSURdNbldUSqx0wtdW/Xwp65vy+jGlU 0KRXGhWSAGdladj0mx87qxJDmIafkoHrr1DnXLeqOoDnZ6rxVB9N12ZmCPzpwvagTd+q0rW3b8OK b8I7SVVVdqh86QdpMoqSP+C9bd2qKfpDt0uQeg2adAyAY0OBsvtYsoiRwfmrkgb9F+qRiqzIjjks TRc9KsfOJCFw8rHpSqswoF+qPq2Vnq5hQ5kP1TXO+OUfbaPph8S1l7bX14q6dNr1tY02m1avX/5F vel771ottNkFBx+UiosK2mLkYPM3ulNR5H2BRkY0neW0pFKUflzr078DDmvzzqWF3f5u1GnXk917 0KT9AZxhnHDKa7KJkcG95IdG/LY1gOOPVvMHm0ZgNK21YmW9aTvRjbpH+kpThxeca77T2VDlD/xD qm6BlpoisHa9zzFTUqHqGnzsxGPS8eeLm+L67Ntl19c1+BJT39Pifumm+NzkxFMhcoMzeVJH9NpP TXRk8r7wyLMVqKl17g8TVaJEcdRoZmSjjf0b4tn4Zm3J1KeM47ue8D4DJmVA4FLjhBNek1WMDPZk Fk4PUJ6iTa40rUW/trduD2BbufVTWrQLnkYsVkbBHXRQKgpGNa1d/bCmEY0ONcr74xFpuPrC9nro gpx91UxrGs+Z8frdj436pk3js9Wv5HlBpck6bUb97wvusDZVJUr0t8RhorR4bcnUN4xnbZcg9Rt4 fVVAaLcYJ+x+/csl7fSpFrPr4RQDhkjbRb9mPvi0DgJCN0yI9L5Ir+vbKwW0QL55qx8/r7N+CoP+ CLZv58FBfdX8Im6JA00LkZUfrddRHWgvmBPSUYem4U8XtsPFBW3RI9saITLa/ez0Sqz5xfpngJwC k+cF+qGgKlGwzKddth+PREnFd8NJoiQhX1tbMu1Do993CdLPqx6q7T3wxisBYc0cilGDEK80RXH2 SPMXM+9/bAeWfBg67HCIajjm0I6KAFaubkCbTE2JKFFDaZMppa9t2GBK0Tc7tPMoa1u4jqSpSwrh QRM4q35oBJng25EOGZCKyye0xcQJ7ZQZeoRr18x51SicZ32wx4EHpuLisW11k/1w9Yvn3JMv78Qr c+w31IilDZ9+mdiipEnt32tWTf3RYLNLkOhArwE3jxQCvY2TdryqEqMpj+/QN0/a0SYzyiQzaZV7 laiOhw5M09eVSJSsHDHQ1N2n9GuwrfUjJaNvDhuYpk+PEWea0rBKmPr3TcGl49rpI4QDelo7SjTa To5En/h9c7ZxzIrXkUOawkb03l9du+/9zw68VWTfHiMzOKoUpa9WNcQdWiOeNgrg1jWrpu6Ky7OH IPUeNOkQAMfHU0A896oUIze7Zg9mSsN4r1fgYEVm4bSuRCOGb75r0PfxBJet+j198eoaJFRZF0ZS /yMObhKm2jqJ739uVGbw0Wf/FN2SjEIH0KZeuxK5ynnyFetdS106ri2uPF9tYMnrbt+m/4izi62Z 5aoSpRG5mfji2wb8ttWWOettiwtzCjVkfQAAIABJREFU/i+Y056CNHBSVwBjgi+w6j2LUeSkv/y2 AVWKjQGGn5Jpy36lku8b8frb1boQqBLdSEjTWs4F57RFTZ3U15giuSeSa2jf1QXntMHNV3cAbeK1 Ky1fUYfHX9iJtxU5922pXZ06aLj8vHYw239bcHlk1v23e7Y70cQ5uJpRv1clSqcOtkeUpBTL166a +mIwiD0Eqc+gSWRz9OfgC6x4z2IUPWVaiCevC7Q/RVWi/UoZGZrlmwdp2oxEd96iGgT8AFnG2ZVI mC48ty12VjWNmGKtR86+Hpx/Tlvcek0HJe6hIq0X+fp7bnqlbk1ntfkvmbBTmHHyGqIqGaEjGhqc a9YdT9tJlMgNmNkM7RAlTcjZa0qmLQrmsYcgHTngwfJaUXUTAHVPTHDppH6KDBhozShRpumaIdv1 kfbxqLTAo4Jo0blrZ3tMw8l9DU0nLHivVl/Tor1EdiVy0UPCtG1HAD+uidxWvMs+TUL09+s7mu6r LFoW0/5XgUeeqcDPNljSnX9OG9D0pMr0YmElnplu/fSjyjaFypvWkhNBlITEY2tWTVsZ3Ma9Yk7k FWxcDghLPDawGAV3RezvyckmsSRHmyoT/TGjMOx2pe7ZXowelqnUnUwkbaNRBnkWX/R+bYtrTB3b a/pGXHIManci56E0NWd29NNI2kWbry/KbwsVPiiDy3/46Qp9RB18LNHfX3dZeyVha668ZSt+Xhf5 j65YOQuBAUUzcr4Lvn9vQRpb+m9IXBd8kYr3LEbmU504vq3uGdn8nHfnSFMihsv83Uetfdeze5Mw qdgaEG1LSJRopEpGEB4N6NhBQ98DUkBTfXYnCjlCnrvtECJqO7mF+scNHZVj+L/7tieM8UK0sFSJ 0hU3b8WaX5WKUsVJA7I7TZ68Z9yjEIK0cRykeC1aMNFcz2IUDa3orqXF4j9doNZ6iUK70wjBbl94 ZKlGMaTI3Qyn3QTI/Y9hGLL7qLXvaGMvTdOpTGS88PLsKmwrt8VCTGXTosrbpaK0aPHMnOHNG7rH GhKd7HPQLTXQpLIREotR8y4w9zNt7ly3wQdyO68qHdDDC7LCa2gEvv3ePgetFPPo4y/q9bAdZApv p/m0KtbR5EuRgW+9dzu+/V7pL9uwVdqvu1f3MpE/Su30MW3kJTdANDJN9kTfQRWb5unH3rJP69XE FhPylbUl04qb991eIyS6YEhB6W8C6NL84ng/sxjFSzDy+7t38+Lc07OUzDEH14KcVU5/swpbttn/ K5W8HdAak0rLw+C2O+X9C4WVeO2Navh89v5xpj9g9GtddbIruqvqdsWTf1amwMTx7ZR835VM3wlt 1OIZ3d5q3ua9Rkh0Qe+BN51EMd2aXxzPZxajeOhFf29lVUCfV8/KND8SZXBtyAcdCd9v2wIgZ7B2 ps1b/Hj/kzqQp3QK206/1hM5kX82GhF9sbLBMs8SoXimpQndKSo5R1Wd/jGlPOGtZ2NhSE6CVY6U Fr5Xq+99jKVuoe5Jlbj+p1VT97KQakGQbuwJiGGhMorlGDlOHHOa+UP4ZDDtjoV38D3kJ67BB5AH ApXp+KPS9TDMX5XUg8KT25nKNvtRvLwOZA1Hgd5UBQG0q43kXeH2B7brU5VWungK1V4ajf7v/s6g uFMqE60X3fVQue7WSWU5bs5bpSileIW+FGBSPLHvFhbmTAnFOqQg9Rn0Vz8gJ4a6IdpjtMCuIuoj mbLOX2J/6OFoedhx/berG/S9J4MVbqKldg04MFXf/PnLRp8jgp9RXJ+lH9Xhp3U+PRJnTjd3j5im v1GFO6eVY/mKekeEzZg4oa3ug0/1M134VjUee36na4MrquYTnD+JEq0jZ2WY64iZNuKmmidKs9eW TN1ruo7aEVKQ9usyZZOWVTUJQFw/e0iMVLgIof0wtIufU+QE1pf68M6SWqSlqgljEVyTU47NAE3j kLcFJyRqe9EHtfi11I8O7TRYEejOzHbTAv49/9mBDz6pc0RgwWOPSMNVF7XHqbnqrRtpi8FLr7vT U7eZz0A0eTU0Sn00QwJipkcHs0RJSPlQ8w2xRvtCCtK6dXcG+gyYdAoE+hgXRvuqUozs3JwZLQcn XU9RMmmXN8WfoXhAKtOgP6Tqng0oTLRTQkWvW+/TvT5s2uJHp44ePTihSgbx5j3r7Wrc/98KFH9U 65jRAe11u3Zie0tiNd3yr+1Y/AHPgsTyHNHUGlnbOlGU/H55/brvpoWMlBhSkAjAAQMn7S8EhsQC g8UoFmrW3UMjF4oSe9xRasKjB7eEzM8zMzR8/Z29C+/BdSLXOfOX1FjGILjsSN6/8W41pjxeoY/q yDjFCYnWCGktmLxDq07U/kl3bQeNbDnFTkC1KJERRdQRlwXWLH29+90ttapFQeo98AYfhLispRtb Os5i1BIZZx3/cW2jbpGmKhJtcGv1taUxbWyLShtcl+D3xOClWbSxMoDjjlQvzsFlh3pPcXumPlGh W5FV7HSGENH+LgoaSBGcaSuB6vTcjErQfiq7jTVUt9Oq/FWKEu19ilqUBApbWj8iJi0K0lEDp5bV iqprAUT8TWUxsuoxM6ecHTubTMPT0zRY4biUotKSb7MNZT49tIU5rYg/F3KWSsK0s1KCnKhancik lox0SJBos69T0ojcDDx+b2dLng1qM5l0v2NxOAynsFZZDxKlX0t9GGNyFG5aU4pWlATEA2tKppa0 1N6QG2ONi/MKSmcDONv4HO6VxSgcHeefOy0vEzdeoX5To0Hi6dcqQVZjTkvkqJb2VV2p2P0StZvW huYuqsE3NoSND8edfAWeOTxTubNeow40RUcjI/rDyUkdgd77peDJKZ1NL4BM8p9+LSIryIBX+rss KOy5vaVKtDhCohv6DLipEwROb+lm4ziLkUHCva80fbXkwzp4NHMtc1oiQvuiaCqPDC2ctlZAZrOv zKlCQ4Oa/VsffV6nmzFPf7Pa1vDRofrmgnPb4I4bO4IiB1uR6IfJs9Mro1+LsKJyCVYGjb7JFRB5 1DAzGSOllasbQLHMwqTPFxX2eCTMeYQdIeXmr+/rEZ4fw2XAYhSOjjvP0Y57CmNuVZozv1p3Bkqe FpyWPB6A9m+dPjQzbstEmpKjX5M//2KvR4tQjIeckKH/oVJtfWmU7RQHvUZ9kulV5Ujp4WcqwqG8 Z/HMPUOWN784rCDRxXkFpd8DOLD5jfSZxSgUlcQ4RtE9J09SHzogmBYFWCPvzQHnLKMEVw8d2ms4 8uA0HH5wKg7okYIe2R60ydL2uMb4QKbltFb2/U+NesTdVT80wOc8vdVDZYwengmasrUq0b6qJ18O afVrVRWSvhw7RElInFRUmLMsHPxIBOlBALRJdo/EYrQHjoT8QPuVaDf+OQrcPoUDZncgwHB1a36O XBNlpGtITxfw+yRq6qTugbqx0dnrISSk487MwrgzrRsJE7up/yMPK7ypvflzZMfnfr1S8Ph9ataU QoyUtneS2V0LC0XYn2Vh15AIUu+BN9H8wkXBwFiMgmkk7nsaqZAvvPKdARx7RMTGlnED+eMR6Ti4 f6rulYCC3zk50Zw5hUCg/UJVNRL1DdKxIzziqGnAhLPb4P7/64RBijdHB/cbGS7c8eAOfPOdM7x3 BNctWd9v3xHAF9824NTB5o6OaU2JQqzTJvygNOutwnazgj6HfNuqIHU64cGN6XW7zb9ZjEJyTOiD P/zciIXv18LjESDv3lak7K5e5B6Xgb69UnQT8dLNYX9YWVElV5dB1oMU4v4/d3fG4YOsNW0n9z/P z6zi2EUOfIJ+2+q3RJSkEHevLZm6qjUErU7ZUQZDC0pnSiCfpm9UDPEp0Nbsd6pbqyufdwABKyLS hmqmU02kQ9XVScdIiGh96IbLrTPpN9pPBhxvLqwGuWzi5GwCNFr+9537mF5Jipf2n2d3NAqZ0aWo sFNYiwcqPCJByhu7cdzE8e1eUyFGHGzL9GdAeYb79/DirBHqg/+FasiyT+t0x7orvtljOiDUpUl9 jIRoxCmZuOkq64WIwD/1SiVmzHXePrOkfihaabwqUVr6Ue36ISdk7tdK8frpiASp9LfGU7O7eOdH kmE017AYRUPLeddSWJGrLmxnS8U+/6ZeN6H+8LM6W8p3aqFkpj5qWJbu6seOOvKoyA7q5pV5+KBU TLnd/JESgH5CiJ9aq2lEgiSlfA3AuNYyi+Y8i1E0tJx7bbcuHj3ECK1P2JHW/NqoC9O7xbVwumWb Sj5tszR9H9Gl49RHbW2pHbRW9PpbPPXeEh+3HD/msDTcc2sns6vbTQixubVMIxWkCwG80FpmkZ5n MYqUlHuus9r1UCgy09+swluLakB7gJIl0X4S2nk/api5llLR8CMLOgqi58SNzdG0g6/dTcBkUSoW QgzenXvL7yIVpA4AylvOJvIzLEaRs3LblakpAhcXtEXBaHtGSwavT76ox4L3an6PrOrs/UBGnaN5 peCHucel47QhmZY5Pm2pfryvqCUy7j9uoihdI4R4NBIiEQkSZSSlfBPA6EgybekaFqOWyCTW8aMO SdN/tZN3b7sTWfkUfVCD1T81QrpYm8hI4ZD+qcg7McNSrwot9R+NRskHnVO9arRUbz4eHQGTRClb CLEpkpKjEaSxAKZHkmmoa1iMQlFJ7GMFo7Jwxfn2GD2EIkvrGxQGfNWPDa4QJxKhAf1SccIx6SCW TkhLljV5KP92NW9wdUJ/WFEH+mF5500xuxFbJIQYHmk9oxEkmqSOacWSxSjS7ki869q20XDe2W10 wwcnta7og1p8+mU9Vqysh1OC4RGfrEyBwwam4Y9HpOlTck5i9uhzO0HrRZySj8Apx6bj9htiEqVL hBDPR0osYkGiDKWULwK4INLM6ToWo2hoJe61hw5IxejhWTjlOPun8ZpTXrfBh5XfNej/v1/TiNJN PstGUB3bayBXKxQgkTwoWOUJozmDcJ9fnVOFFwo5ims4RslwLkZRai+EiNiTbrSCdCqAiPcjsRgl w2MaXRuHnZyBW/5MNjLOTuRzjTwMbNzkQ+kmP0o3+0ARdmMZTZGT2k4dNHTu6EGPHA96ZnuxXw+v 7mm7a+dWvXfZBmreoqZwGWRaz4kJEIEoRalQCFEQDbloBYm+PRH5AWExiqYbkutaWhspGNUGl59n 356ZWIn7/UBFZUDf80SOVBt9TZYSXo8Atcv4nJmu6Y5MMzMFaI+QmxJZKc5dVA165cQEmhOIQpRO F0K80/z+cJ+jEiTKSEp5L4C/hcuUxSgcHT5nEKCRw4Sz2oCilHJyBoEHn6jAu0s5PIQzesO5tYhw psMrRPhwE81bGIsg/QHA6uYZGZ/Zh5VBgl8jJdC+rYb8M7Iw7iwWpkiZmX0dGSy8uaDasrUzs+vP +VlPYERuBm6+qsXp9/uEELdGW6uoBYkKkFJ+AODE5oU9N6MSr8xmh4rNufDnyAjQesroYZksTJHh MuUqms14/W0WIlNgJmEmYUTpICEERRuPKsUqSJcCeCa4JBajYBr8Ph4CZHlGUWp5xBQPxfD3khDN nl8NWhPjxATiIRBClJYJIU6KJc9YBYl26e0aCrEYxYKe72mNAIXZPuvUTN0dUWvX8vnICDz8dAXe XlzDHhYiw8VXRUigmSidJ4R4NcJb97gsJkGiHKSU1wJ4+LHnd2LOfN4stwdV/mAqAa9X4PS8DFxz qT2xfUxtjA2Zfb2qAXMXVuP9j+t4jcgG/slSZJssbdurj+57aVaWmBtrm2MWJCrw7oe3n7j0wzpa T+LEBJQTILPqIw9Jw+jhmTj+KOdtsFUOIMoCFhTXYt6iat2PX5S38uVMIGoCAuL+opnZYS2wW8s0 LkGizPPyS5dCILe1gvg8EzCTABlAnDE0ExPOZsu85lzJ6ek7S2qwoyLQ/BR/ZgKqCASE39OvaNa+ a+IpwARBKjsXQhbGUwm+lwnESsDrAY45PB3DT8nAicck76jpvY/r9FhQX5XU87RcrA8T3xczAQEx t2hm9pkxZ/D7jXELUm6u9Hq6lv0MIKKY6fFWmO9nAi0RoP1Mg0/I0GMFDTootaXLEub4N6sasPjD Wn1tqLKKR0MJ07EubIgATi2ambMg3qrHLUhUgSEFZTcJyCnxVobvZwJmEdinowcn/TEdJx+brscR Mitfu/MhH3sffV6H95bXYcs2ttm2uz+4fJ3AqsUzswcBIu6IY6YIUu5Zazt4UtPWA+AJfX5CHUeA zMePPCQVfzw8HUcflgba5+SmRNNxH6+ow8df1INHQm7queSoqwCuKJqZ85QZrTVFkKgiQwrKHhGQ 15hRKc6DCagk0LO7F4f2T8XB/VP10VOXfZzjcZsct67+sRG0FvTFtw1Y84u7I92q7EfO2xEEttZI /37LC3vWmlEb0wRpeP6mXn4R+AGA14yKcR5MwCoC7dtpOLB3CvockIJ+vVLQM8eD7vt6kZZm2tcj ZFPKNvvx60Yfftnow/c/NYBiMW36jafhQsLig84kIMUdiwuz7zKrcqZ+4/IKSl8GcJ5ZleN8mICd BMhIonMnD9q1FaBpP4p+2yZT6EKV4hWgDbspv//8CgRoszjg+X2wVVsndW8IdQ0S9fUSOysD+nTb zqqAbo69dbsfPtYeO7uXy46fQJVX+vdfUNhze/xZNeVg7mjG438Afs8EAKYKnVmN5XyYQDQEaPqM /nNiAkxgbwISeMpMMaISTF3dXfxaz29EFBFl924iH2ECTIAJMAEXEGjwavIhs+tpqiBR5aSG+8yu JOfHBJgAE2ACziEgIF5ZOL07WVabmkwXpMXTcz4A5BJTa8mZMQEmwASYgFMI+ODX7lZRGdMFiSop Ie5UUVnOkwkwASbABGwmIOTL8fqsa6kFSgRpycyc9wEsbalQPs4EmAATYAKuJODzBwL/UlVzJYJE lZXAZFWV5nyZABNgAkzAFgKvFBf2/ElVycoE6fdR0iJVFed8mQATYAJMwFICDR6pKV2OUSZIhEnT cFvTYMlSaFwYE2ACTIAJmE5APrWwsNta07MNylCpIC2anvM5gFlB5fFbJsAEmAATcB+BGq8vVdna kYFDqSBRIR4/bgfgMwrkVybABJgAE3AXASnwyILZXcpU11q5IC2clbMaAi+obgjnzwSYABNgAkoI bGvwND6gJOdmmSoXJCrP25hCo6TqZmXzRybABJgAE3A4ASlw97JX9y+3opqWCBIN9SQER5S1oke5 DCbABJiAWQQEfqxon/2YWdm1lo8lgkSVyKqlEOeitLUK8XkmwASYABNwBgEZwC0rnhSNVtXGMkGa Ny+nRorA361qGJfDBJgAE2ACsROQwHtLCnPmxJ5D9HdaJkhUtZP757wACTIF58QEmAATYALOJeD3 yMD1VlfP8kB6eWPLjoaUH5sdi8lqcFweE2ACTCBRCUghH18yo/vVVrfP0hESNW7xjOzPADxrdUO5 PCbABJgAE2idgAS2BOobyMuO5clyQaIWpkpBjd1heWu5QCbABJgAEwhPQOC24jd62fL32RZBml+Y vQVC/F94KnyWCTABJsAErCQgpPzk5P7Zts1g2SJIBPik/t2eAPS1JCt5c1lMgAkwASYQmoDPr8kr J08WgdCn1R+13KghuEmDx244VJMaWd15g4/zeybABJgAE7CYgJBTFs/o/leLS92jONtGSFSLpTN6 fA2IaXvUiD8wASbABJiA1QTWeVI9SmMdRdIgWwWJKphZKwmC0hgbkYDga5gAE2ACyUpACnH1wpe6 2e5v1HZBIg8Omha4nAP5JetXgdvNBJiAzQReXjIje77NddCLt12QqBaLpvdYDOBJJwDhOjABJsAE kojAJq/0X+eU9jpCkAhGXV3KzQB+dQoYrgcTYAJMINEJSImrFxT23O6UdjpGkD6c26VSCslTd055 MrgeTIAJJDgBMd1q56mtAXWMIFFFl8zovhCQj7dWaT7PBJgAE2AC8RAQpV7p+3M8Oai411GCRA30 pHnIDv4HFY3lPJkAE2ACTABSQF7qpKk6o08cJ0hkehjQtAsB+IxK8isTYAJMgAmYRUD+t2hmzgKz cjMzH8cJEjVu6fRun0DIe8xsKOfFBJgAE0h2AlJgdWatsNUbQ7g+cKQgUYX9m3P+CYmPwlWezzEB JsAEmEDEBBoAnEd7PyO+w+ILHStIxcXCJ/2YIIByi5lwcUyACTCBxCMg8dclM3K+cHLDHCtIBG3J 7JxfpBRXOBkg140JMAEm4AICby8uzH7E6fV0tCARvMWF2a8L4Amng+T6MQEmwAScSUCU+j24GBDS mfXbXSvHCxJVtVr6b4TEl7urze+YABNgAkwgAgI+aHJc8Ws5WyO41vZLXCFIywt71krNkw+gwnZi XAEmwASYgEsISIhbF0/P+cAl1YUrBIlgLpmx789CyIvYK7hbHi2uJxNgAjYTmLNkZrepNtchquJd I0jUqqIZ3d+EkA9G1UK+mAkwASaQbAQEfhQy/RI3rBsFd42rBIkq3imQc6uUgsJVcGICTIAJMIG9 CVSLgHZOUWEn1y1xuE6QCguFPw0YD4Ff9u4HPsIEmAATSGoCUgAXFRV2W+lGCq4TJII8vzB7SwCB MwE4dsexGx8GrjMTYALuJiCBfxXNzJnl1la4UpAI9tIZPb6WQlzMRg5uffS43kyACZhKQMq3Th6Q fYepeVqcmbC4PNOLyysoux2Qd5meMWfIBJgAE3APgZVCpp/kxnWjYMSuFyRAiryCspfIaWBww/g9 E2ACTCAZCEhgS8AXOKJ4do8Nbm+va6fsdoMXspMsvxSQH+8+xu+YABNgAklBoEZq2qhEECPqrQQY ITU9dCPzy7o0CnwkIfsmxWPIjWQCTCDZCUgJed6Smd1fSxQQCTBCauoKsrzzSd9IGr4mSudwO5gA E2ACLREQErclkhhROxNmhGR02uBxm/6oBQJLAGQax/iVCTABJpBIBKSQjy+Z0f3qRGoTtSVhRkhG x1D484CU4ynorHGMX5kAE2ACCUTglX0COdckUHt2NSXhBIlatrSw+1wJ/IX3KO3qZ37DBJhAQhCQ S8iIizzWJERzmjUi4absgts3NL/0b1Lg3uBj/J4JMAEm4FICnwqZPtzte43CsU/IEZLR4KLCnPsE xP3GZ35lAkyACbiUwKpUKc5IZDGifknoEVLTg6dvnH0cwJUufRC52kyACSQzAYFf/I2BExNlr1G4 rkzoEVJTw2njbPafAbwSDgSfYwJMgAk4kMAGf8A/NBnEiNgnwQip6RHLz5eebaL0VQFR4MCHjqvE BJgAE2hGQJZByNzFM3r80OxEwn5MGkGiHjzyCpnSvrxsuhAYk7A9yg1jAkzA9QRog78mcErRjJzv XN+YKBqQBFN2u2mseFI07oPy8QJi7u6j/I4JMAEm4BwCuhhJLS/ZxIh6IKkEiRpcWDiwoaPcni8l ZjvnEeSaMAEmwAR0ApulRwx2a8TXePswqabsgmHl5kqvZ99NL0PKscHH+T0TYAJMwB4CotTjl3kL Z+Wstqd8+0tNuhGSgby4WPg6BbpRDKWXjWP8ygSYABOwicB6v/SdksxiRNyTVpCo8eR+o5PMpjDo /7PpIeRimQATSHICAuInvyZOLi7s+VOSo0ges+/wHS3FkLFl9wiJv4W/js8yASbABEwkIMU3fnhG FBd23WRirq7NKqlHSLt7TcglM3JuFVL8lR2y7qbC75gAE1BIQOKj+pSGXBaj3YyT1qhhN4I93w0Z WzpRSDwBwLPnGf7EBJgAEzCNwLuZtThn3rycGtNyTICMWJBCdOKQgo2jBASFBc4KcZoPMQEmwARi JiAgnivv0O1K2hcZcyYJeiMLUgsdS5FnRSAwTwBdWriEDzMBJsAEoiQg/7l4Zs4dgJBR3pgUl7Mg henm3Pz1fb3CO19C9g1zGZ9iAkyACbRGwC+Aq4pm5jzV2oXJfJ4FqZXezx1f2tnjxxwAJ7ZyKZ9m AkyACYQiUCGAsUUzcxaEOsnHdhNgK7vdLEK+K34tZ2tqZfVQ3kAbEg8fZAJMIDyBtQGPOIHFKDwk 4yyPkAwSEbzmFZTeCuBfyRS2IwIsfAkTYAIhCYjlnkZx1sI53X4LeZoP7kWABWkvJOEPDMkvPVsI vAigTfgr+SwTYAJJS0DI51N31vxp/vx+9UnLIIaGsyDFAG342E2DAlLOYWOHGODxLUwgsQn4hJA3 Fs3o/p/Ebqaa1rEgxcj1xAm/dEzzpbwK4NQYs+DbmAATSCACehwjTRQUTc8uTqBmWdoUNmqIEfey V/cv7ySzzwBwL7sbihEi38YEEoWAxOfw4WgWo/g6lEdI8fHT7x6aX3a6FPIFAPuYkB1nwQSYgIsI CCEeTdlZdROvF8XfaSxI8TPUcxiev6mXH4GZEDjKpCw5GybABJxNoAoCf1o8I+cVZ1fTPbXjKTuT +mphYbe1qVXVJ9KvJZ7CMwkqZ8MEnEtgpcePo1mMzO0gHiGZy1PPbejYjWdKKZ7hKTwFcDlLJmAz ASnk44GMhhuLn+9VZ3NVEq54FiRFXZo7ZkMPzau9LIBTFBXB2TIBJmAtge1SYuKSwhxyJcZJAQGe slMAlbIsnt1jwz4yOw8Q/wAku5lXxJmzZQIWEVgqJA5nMVJLm0dIavnquQ8bV3pUIACywhtgQXFc BBNgAuYRqBPAbScOyH548mQRMC9bzikUARakUFQUHDsuf31Gpua5FxLXsi88BYA5SyZgNgGJLwFx /uLC7FVmZ835hSbAghSai7KjeQVlgwXw5P+3d26xVVRRGP7/PbW2oqYgSIGC8a6QoPLgJYKppYL1 Fi+p0AcUrw/6oDHxHhU1XuOLiYmJqVGjRvAIGjERQ9GCGNEgmGgUlYhSORRRqQhKy5lZZho1EUs9 9zMz5386ObPXWnutb03yZ86Zvbe2HSoZYgUWgUIJDBj48K8NjQ/rVNdCUebmL0HKjVdRrAeflliz ALBbANQUJaiCiIAIFEzAgA/DPS8CAAAGbElEQVRovF5PRQWjzCuABCkvbMVxap275RQL2AlgWnEi KooIiECeBHYCvGvG5Man9V9RngSL4CZBKgLEQkI0N1uNO7z3ZsIeAFBfSCz5ioAI5EOAS/2Mf0P4 Zmw+3vIpHgEJUvFYFhSp9bJtRwUueIa0mQUFkrMIiEC2BLbB7KYVqQmLsnWQXWkJSJBKyzfH6MaW Oen5ND4OYHSOzjIXARHIjoABfK7GMre+k5r4S3YusioHAQlSOSjnOMfs9p5RGboHAV6vlx5yhCdz ERiewDrS3di1qHHN8GYarQQBCVIlqGc55+BLDz6fBDEjSxeZiYAIDE3gJxrunj5lXKdeWhgaUBSu SpCi0IVhczC2XJ6eS/BRAJOGNdWgCIjAvgQGQDzl9/c/2P3GkX37Dup7tAhIkKLVj/1mE65dGgHv JiNuB9CwX0MNiIAI/E3gdd/827pTEzf+fUGf0SYgQYp2f/6TXXNHerTn2/0ArgN4wH8MdEEEqpwA zT6C5+7QceLxuxEkSPHr2WDGze09x3j0FgDoAKBd22PaR6VdVAJfkLina9G41wFaUSMrWFkISJDK grl0k8zs6JmKjHsI5AWlm0WRRSDCBIjvYbxvlDW+lErRj3CmSu1/CEiQ/gdQXIZb5/SebkFwL4i2 uOSsPEWgQAKbaXx0JH55NpWaMlBgLLlHgIAEKQJNKGYKLe1bTyXtXgDnFzOuYolAhAh8R8MjI7Hj eQlRhLpShFQkSEWAGMUQ4aGAvo87SVys/5ii2CHllAeBrwh7fEfD+Bd1LEQe9GLgIkGKQZMKSfHs 9i3HO8dbYZgHoLaQWPIVgQoR+JjEY9NPHPeGFrVWqANlmlaCVCbQlZ7mnLmbxwfm3QzjdVrHVOlu aP4sCAQElhn4xIpXx72Xhb1MEkBAgpSAJuZSwqx5vSP8Absy3OUYwHG5+MpWBMpAYDdgL4D25IpF TV+XYT5NESECEqQINaOcqSxYYG7lF73nerAbDZgNwCvn/JpLBP5FgPjGjM8EA3s6tcXPv8hU1RcJ UlW1e+hiW9vTkwLyKsKu1n55QzPS1ZIQ6AfwGh07uxY2rtRi1pIwjlVQCVKs2lXaZMOnplVf9s5G YNeSdqG2Jiot7yqO/hkMz9bAf1HnEVXxXTBE6RKkIaDoEjCzY9tY8zPzSV4Dw7FiIgIFEtgF8FWY 37ki1fRhgbHknlACEqSENrZ4ZYXHX2ydQeIKGi41YGTxYitSwgkEAFbC7OXa2rrU2y8ftjPh9aq8 AglIkAoEWE3ubW3fHDhwyIg2g3UQvBBAfTXVr1qzJGBYC+AV52UWLl84KZ2ll8xEABIk3QR5ETjz ou2H1B04cB7Jyww4D8CIvALJKQkEDLCPaG4JAre4a/HYb5NQlGooPwEJUvmZJ27G8PDAg+iFr45f YkAbgTGJK1IF7UsgA9gqI5cGe4PXupc0/bCvgb6LQK4EJEi5EpP9sATa28372UufxoAXwHg+aFOH ddBgnAj8BGAZzN4i6pd1pUb9GqfklWv0CUiQot+jWGfYfOkPTTU1nGVw5xhspp6eYtXO8EiHNQSW +84tH+2PXavzhmLVv9glK0GKXcvim3C4zmn1hvRJ8F2rITgL5HTtqxepfvowrIfDKgZ8NwNvZXfq 8F2RylDJJJqABCnR7Y12ceHPezu89FTzeRaIGQBOBzAh2lknKrvdMKwDsdrI9/v/qFn9wZtjfktU hSomVgQkSLFqV/KTbWnvmeCcdxrMzjDwVAAnAzg0+ZWXvMKMARsIfGLAGs+CNXu3T/i8u5uZks+s CUQgSwISpCxByaxSBIwtc348CgimATaNNihQk7Xn3rD92EmzL438FMT6gO7Tg3cHny1dOv73Yb00 KAIVJiBBqnADNH1+BMJ1ULUH+ZO9wJ9ixAk0d7yZHQ3iaAB1+UWNlZcBCF+13mjARho2mLPPXcAN Xanxm2NViZIVgb8ISJB0KySMgHHW3HSTH7hjBp+iDEcYrYmGpsHvxMSY/AQY7oS9zYAewLYQDD83 G7DJkRsz9f2bup8/ck/CmqdyqpyABKnKb4BqLL95/qa62j21Y3xzjQDHGvwxNDfKYA2ObDCzBpg1 GFy9ozWY8QA4Oxhm9QT/efraz75+vxMIxQTh9gUg+mDYS2CXGcKxPwJaH8k+GnfArC8g+hyw3Rx+ 9PZie+DqtmqNTzXemar5T7boKrYfCqI6AAAAAElFTkSuQmCC"/></symbol><symbol viewBox="0 0 24 24" id="webpack" xmlns="http://www.w3.org/2000/svg"><path d="M19.376 15.988l-7.709 4.45-7.708-4.45V7.087l7.708-4.45 7.709 4.45z" fill="#fff" fill-opacity=".785" stroke-width="0"/><path d="M12.286 1.98c-.21 0-.41.059-.57.179l-7.9 4.44c-.32.17-.53.5-.53.88v9c0 .38.21.711.53.881l7.9 4.44c.16.12.36.18.57.18.21 0 .41-.06.57-.18l7.9-4.44c.32-.17.53-.5.53-.88v-9c0-.38-.21-.712-.53-.882l-7.9-4.44a.945.945 0 0 0-.57-.179zm0 2.15l7 3.939v2.104h-.016v5.177h.016v.54l-7 3.939-7-3.94V8.07l7-3.94zm0 2.08l-4.9 2.83 4.9 2.83 4.9-2.83-4.9-2.83zm-5 5.08v3.58l4 2.308v-3.58l-4-2.308zm10 0l-4 2.308v3.58l4-2.308v-3.58z" fill="#8ed6fb"/><path d="M12.286 6.21l-4.9 2.83 4.9 2.83 4.9-2.83-4.9-2.83zm-5 5.08v3.58l4 2.308v-3.58l-4-2.308zm10 0l-4 2.308v3.58l4-2.308v-3.58z" fill="#1c78c0"/></symbol><symbol viewBox="0 0 24 24" id="wolframlanguage" xmlns="http://www.w3.org/2000/svg"><title>wolframLanguage</title><g transform="scale(.12121)" fill="none" fill-rule="evenodd"><circle cx="99.197" cy="98.946" r="83.28" fill="#212121" stroke-width=".841"/><path d="M182.529 98.828a83.406 83.406 0 0 1-39.14 70.721.064.064 0 0 1-.038.019l-28.62-35.665 23.71 2.612s11.385 1.177 13.978 0c2.373-.938 15.175-18.963 15.175-18.963s-36.75-23.23-49.312-36.032c1.434-21.575-1.656-50.269-1.656-50.03-9.251 9.234-10.429 10.669-19.68 19.203-4.028-13.04-5.923-17.547-9.95-30.588-12.104 9.95-21.337 26.799-27.977 46.48a78.68 78.68 0 0 0-4.23 5.094 109.774 109.774 0 0 0-2.667 3.66 114.558 114.558 0 0 0-5.132 8.002 172.555 172.555 0 0 0-3.403 6.051c-7.706 14.475-14.034 31.066-19.515 46.001a.858.858 0 0 1-.092-.184c-14.988-30.912-9.502-67.85 13.822-93.072 23.325-25.223 59.723-33.575 91.71-21.045 31.988 12.53 53.029 43.382 53.017 77.736z" fill="#e53935"/><path d="M101.452 69.178s-1.416-8.295-2.373-11.367c6.401-6.18 7.357-7.118 13.52-13.04.477 11.845.238 18.006-.479 32.481-3.55-3.568-10.668-8.074-10.668-8.074zm-27.737 40.778s-6.64-4.029-11.624-4.728c1.435-3.329 5.223-7.596 6.18-8.773-1.913.699-15.653 6.86-17.087 12.084a74.804 74.804 0 0 1 11.385 3.79 35.993 35.993 0 0 0-8.774 20.158s21.815-3.33 38.185-1.196c.283.168.609.251.938.24l8.534.239 27.111 45.136.221.35c-.037.018-.055.037-.073.037-51.133 18.485-88.085-15.543-95.976-27.443.034-.102.058-.206.074-.313 7.1-30.017 15.855-65.939 30-76.552 7.356-12.82 9.49-31.783 22.751-41.734 3.33 9.951 8.553 30.588 12.103 40.539 15.653 15.652 39.361 35.094 55.234 43.15 1.656.956 3.79 7.596 3.79 7.596l-6.401 8.056-68.276-6.879a54.462 54.462 0 0 0-4.58-.183 86.848 86.848 0 0 0-14.144 1.36c3.311-8.295 10.43-14.935 10.43-14.935zm22.054-8.774c3.789-.46 7.817.956 12.323 3.568 4.267-1.195 4.745-1.434 9.013-2.612-5.463-4.028-11.386-8.295-19.442-7.118a47.249 47.249 0 0 0-1.894 6.162z" fill="#fff" stroke-width=".936"/></g></symbol><symbol viewBox="0 0 24 24" id="word" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2m7 1.5V9h5.5L13 3.5M7 13l1.5 7h2l1.5-3 1.5 3h2l1.5-7h1v-2h-4v2h1l-.9 4.2L13 15h-2l-1.1 2.2L9 13h1v-2H6v2h1z" fill="#01579b"/></symbol><symbol viewBox="0 0 24 24" id="xaml" xmlns="http://www.w3.org/2000/svg"><path d="M18.93 12l-3.47 6H8.54l-3.47-6 3.47-6h6.92l3.47 6m4.84 0l-4.04 7L18 18l3.46-6L18 6l1.73-1 4.04 7M.23 12l4.04-7L6 6l-3.46 6L6 18l-1.73 1-4.04-7z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 24 24" id="xml" xmlns="http://www.w3.org/2000/svg"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m.12 13.5l3.74 3.74 1.42-1.41-2.33-2.33 2.33-2.33-1.42-1.41-3.74 3.74m11.16 0l-3.74-3.74-1.42 1.41 2.33 2.33-2.33 2.33 1.42 1.41 3.74-3.74z" fill="#8bc34a"/></symbol><symbol viewBox="0 0 24 24" id="yaml" xmlns="http://www.w3.org/2000/svg"><path d="M5 3h2v2H5v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5h2v2H5c-1.07-.27-2-.9-2-2v-4a2 2 0 0 0-2-2H0v-2h1a2 2 0 0 0 2-2V5a2 2 0 0 1 2-2m14 0a2 2 0 0 1 2 2v4a2 2 0 0 0 2 2h1v2h-1a2 2 0 0 0-2 2v4a2 2 0 0 1-2 2h-2v-2h2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5h-2V3h2m-7 12a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m8 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1z" fill="#f44336"/></symbol><symbol viewBox="0 0 24 24" id="yang" xmlns="http://www.w3.org/2000/svg"><path d="M12 2a10 10 0 0 1 10 10 10 10 0 0 1-10 10A10 10 0 0 1 2 12 10 10 0 0 1 12 2m0 2a8 8 0 0 0-8 8 8 8 0 0 0 8 8 4 4 0 0 1-4-4 4 4 0 0 1 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 2.5A1.5 1.5 0 0 1 13.5 8 1.5 1.5 0 0 1 12 9.5 1.5 1.5 0 0 1 10.5 8 1.5 1.5 0 0 1 12 6.5m0 8a1.5 1.5 0 0 0-1.5 1.5 1.5 1.5 0 0 0 1.5 1.5 1.5 1.5 0 0 0 1.5-1.5 1.5 1.5 0 0 0-1.5-1.5z" fill="#42a5f5"/></symbol><symbol viewBox="0 0 289.99999 290.00001" id="yarn" xmlns="http://www.w3.org/2000/svg"><path d="M250.733 218.418c-12.39 2.943-18.661 5.653-33.993 15.641-24.004 15.487-50.176 22.688-50.176 22.688s-2.168 3.252-8.44 4.723c-10.84 2.633-51.647 4.878-55.364 4.956-9.988.077-16.105-2.555-17.809-6.66-5.188-12.388 7.434-17.809 7.434-17.809s-2.788-1.703-4.414-3.252c-1.471-1.47-3.02-4.413-3.484-3.33-1.936 4.724-2.943 16.261-8.13 21.45-7.125 7.2-20.598 4.8-28.573.619-8.75-4.646.62-15.564.62-15.564s-4.724 2.788-8.518-2.942c-3.407-5.266-6.582-14.248-5.73-25.32 1.084-12.777 15.176-25.011 15.176-25.011s-2.477-18.661 5.653-37.787c7.356-17.422 27.179-31.437 27.179-31.437s-16.648-18.352-10.454-35c4.027-10.84 5.653-10.763 6.97-11.227 4.645-1.781 9.136-3.717 12.466-7.356 16.648-17.964 37.864-14.557 37.864-14.557s9.911-30.431 19.203-24.469c2.865 1.859 13.163 24.778 13.163 24.778s10.996-6.426 12.235-4.026c6.659 12.931 7.433 37.632 4.49 52.654-4.955 24.778-17.344 38.096-22.3 46.459-1.161 1.936 13.319 8.053 22.456 33.373 8.44 23.152.929 42.587 2.245 44.756.232.387.31.542.31.542s9.679.774 29.114-11.228c10.376-6.427 22.688-13.628 36.703-13.783 13.55-.232 14.247 15.719 4.104 18.12z" fill="#2c8ebb" stroke-width=".774"/></symbol><symbol viewBox="0 0 24 24" id="zip" xmlns="http://www.w3.org/2000/svg"><path d="M14 17h-2v-2h-2v-2h2v2h2m0-6h-2v2h2v2h-2v-2h-2V9h2V7h-2V5h2v2h2m5-4H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" fill="#afb42b"/></symbol></svg>
diff --git a/app/assets/images/gitlab_logo.png b/app/assets/images/gitlab_logo.png
index ca30b459019..12525056939 100644
--- a/app/assets/images/gitlab_logo.png
+++ b/app/assets/images/gitlab_logo.png
Binary files differ
diff --git a/app/assets/images/logo.svg b/app/assets/images/logo.svg
index f4e19b67008..c650177c960 100644
--- a/app/assets/images/logo.svg
+++ b/app/assets/images/logo.svg
@@ -1,26 +1,10 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
- <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
- <title>Slice 1</title>
- <desc>Created with Sketch.</desc>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
- <g id="logo" sketch:type="MSLayerGroup" transform="translate(0.000000, 10.000000)">
- <g id="Page-1" sketch:type="MSShapeGroup">
- <g id="Fill-1-+-Group-24">
- <g id="Group-24">
- <g id="Group">
- <path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329" class="tanuki-shape"></path>
- </g>
- </g>
- </g>
- </g>
- </g>
- </g>
+<svg width="200" height="192" class="tanuki-logo" viewBox="0 0 50 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path class="tanuki-shape tanuki" d="m49.014 19-.067-.18-6.784-17.696a1.792 1.792 0 0 0-3.389.182l-4.579 14.02H15.651l-4.58-14.02a1.795 1.795 0 0 0-3.388-.182l-6.78 17.7-.071.175A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869 10.394-7.779.029-.022a12.595 12.595 0 0 0 4.182-14.554Z"
+ fill="#E24329"/>
+ <path class="tanuki-shape right-cheek" d="m49.014 19-.067-.18a22.88 22.88 0 0 0-9.12 4.103L24.931 34.187l9.485 7.167 10.393-7.779.03-.022a12.595 12.595 0 0 0 4.175-14.554Z"
+ fill="#FC6D26"/>
+ <path class="tanuki-shape chin" d="m15.414 41.354 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869-9.484-7.167-9.51 7.167Z"
+ fill="#FCA326"/>
+ <path class="tanuki-shape left-cheek" d="M10.019 22.923a22.86 22.86 0 0 0-9.117-4.1L.832 19A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 9.491-7.167L10.02 22.923Z"
+ fill="#FC6D26"/>
</svg>
diff --git a/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif b/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif
deleted file mode 100644
index 3f4ef31947b..00000000000
--- a/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo.gif b/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo.gif
deleted file mode 100644
index 387628f831c..00000000000
--- a/app/assets/images/mailers/ci_pipeline_notif_v1/gitlab-logo.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_footer_logo.gif b/app/assets/images/mailers/gitlab_footer_logo.gif
deleted file mode 100644
index 3f4ef31947b..00000000000
--- a/app/assets/images/mailers/gitlab_footer_logo.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_header_logo.gif b/app/assets/images/mailers/gitlab_header_logo.gif
deleted file mode 100644
index 387628f831c..00000000000
--- a/app/assets/images/mailers/gitlab_header_logo.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_header_logo.png b/app/assets/images/mailers/gitlab_header_logo.png
deleted file mode 100644
index 35ca1860887..00000000000
--- a/app/assets/images/mailers/gitlab_header_logo.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_logo.png b/app/assets/images/mailers/gitlab_logo.png
new file mode 100644
index 00000000000..12525056939
--- /dev/null
+++ b/app/assets/images/mailers/gitlab_logo.png
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_logo_black_text.png b/app/assets/images/mailers/gitlab_logo_black_text.png
new file mode 100644
index 00000000000..ed8f05a633e
--- /dev/null
+++ b/app/assets/images/mailers/gitlab_logo_black_text.png
Binary files differ
diff --git a/app/assets/images/mailers/gitlab_tanuki_2x.png b/app/assets/images/mailers/gitlab_tanuki_2x.png
deleted file mode 100644
index 551dd6ce2ce..00000000000
--- a/app/assets/images/mailers/gitlab_tanuki_2x.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png b/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png
deleted file mode 100644
index 31083af512e..00000000000
--- a/app/assets/images/mailers/in_product_marketing/gitlab-logo-gray-rgb.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/msapplication-tile.png b/app/assets/images/msapplication-tile.png
deleted file mode 100644
index 1e0e2ed73ce..00000000000
--- a/app/assets/images/msapplication-tile.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/touch-icon-ipad-retina.png b/app/assets/images/touch-icon-ipad-retina.png
deleted file mode 100644
index 516dc2f4710..00000000000
--- a/app/assets/images/touch-icon-ipad-retina.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/touch-icon-ipad.png b/app/assets/images/touch-icon-ipad.png
deleted file mode 100644
index b2093d015b8..00000000000
--- a/app/assets/images/touch-icon-ipad.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/touch-icon-iphone-retina.png b/app/assets/images/touch-icon-iphone-retina.png
deleted file mode 100644
index 438654e0d20..00000000000
--- a/app/assets/images/touch-icon-iphone-retina.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/touch-icon-iphone.png b/app/assets/images/touch-icon-iphone.png
deleted file mode 100644
index e5f87fbbcf6..00000000000
--- a/app/assets/images/touch-icon-iphone.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/twitter_card.jpg b/app/assets/images/twitter_card.jpg
new file mode 100644
index 00000000000..6b998ab731c
--- /dev/null
+++ b/app/assets/images/twitter_card.jpg
Binary files differ
diff --git a/app/assets/javascripts/access_tokens/components/projects_token_selector.vue b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
index a746f62b3a1..4843c52fcbb 100644
--- a/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
+++ b/app/assets/javascripts/access_tokens/components/projects_token_selector.vue
@@ -148,7 +148,7 @@ export default {
</template>
<template #dropdown-footer>
<gl-intersection-observer v-if="projects.pageInfo.hasNextPage" @appear="loadMoreProjects">
- <gl-loading-icon v-if="isLoadingMoreProjects" size="md" />
+ <gl-loading-icon v-if="isLoadingMoreProjects" class="gl-mb-3" size="sm" />
</gl-intersection-observer>
</template>
</gl-token-selector>
diff --git a/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue b/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue
new file mode 100644
index 00000000000..7f6e5dc4f35
--- /dev/null
+++ b/app/assets/javascripts/admin/background_migrations/components/database_listbox.vue
@@ -0,0 +1,51 @@
+<script>
+import { GlListbox } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { setUrlParams, visitUrl } from '~/lib/utils/url_utility';
+
+export default {
+ name: 'BackgroundMigrationsDatabaseListbox',
+ i18n: {
+ database: s__('BackgroundMigrations|Database'),
+ },
+ components: {
+ GlListbox,
+ },
+ props: {
+ databases: {
+ type: Array,
+ required: true,
+ },
+ selectedDatabase: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ selected: this.selectedDatabase,
+ };
+ },
+ methods: {
+ selectDatabase(database) {
+ visitUrl(setUrlParams({ database }));
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex gl-align-items-center" data-testid="database-listbox">
+ <label id="label" class="gl-font-weight-bold gl-mr-4 gl-mb-0">{{
+ $options.i18n.database
+ }}</label>
+ <gl-listbox
+ v-model="selected"
+ :items="databases"
+ right
+ :toggle-text="selectedDatabase"
+ aria-labelledby="label"
+ @select="selectDatabase"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/admin/background_migrations/index.js b/app/assets/javascripts/admin/background_migrations/index.js
new file mode 100644
index 00000000000..4ddd8f17c9a
--- /dev/null
+++ b/app/assets/javascripts/admin/background_migrations/index.js
@@ -0,0 +1,38 @@
+import Vue from 'vue';
+import * as Sentry from '@sentry/browser';
+import Translate from '~/vue_shared/translate';
+import BackgroundMigrationsDatabaseListbox from './components/database_listbox.vue';
+
+Vue.use(Translate);
+
+export const initBackgroundMigrationsApp = () => {
+ const el = document.getElementById('js-database-listbox');
+
+ if (!el) {
+ return false;
+ }
+
+ const { selectedDatabase } = el.dataset;
+ let { databases } = el.dataset;
+
+ try {
+ databases = JSON.parse(databases).map((database) => ({
+ value: database,
+ text: database,
+ }));
+ } catch (e) {
+ Sentry.captureException(e);
+ }
+
+ return new Vue({
+ el,
+ render(createElement) {
+ return createElement(BackgroundMigrationsDatabaseListbox, {
+ props: {
+ databases,
+ selectedDatabase,
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/admin/statistics_panel/components/app.vue b/app/assets/javascripts/admin/statistics_panel/components/app.vue
index 1f0db422807..f250bdae4f5 100644
--- a/app/assets/javascripts/admin/statistics_panel/components/app.vue
+++ b/app/assets/javascripts/admin/statistics_panel/components/app.vue
@@ -29,7 +29,7 @@ export default {
<div class="gl-card">
<div class="gl-card-body">
<h4>{{ __('Statistics') }}</h4>
- <gl-loading-icon v-if="isLoading" size="md" class="my-3" />
+ <gl-loading-icon v-if="isLoading" size="lg" class="my-3" />
<template v-else>
<p
v-for="statistic in getStatistics(statisticsLabels)"
diff --git a/app/assets/javascripts/alert_management/components/alert_management_table.vue b/app/assets/javascripts/alert_management/components/alert_management_table.vue
index 929f5d10956..37a6ea16018 100644
--- a/app/assets/javascripts/alert_management/components/alert_management_table.vue
+++ b/app/assets/javascripts/alert_management/components/alert_management_table.vue
@@ -178,8 +178,8 @@ export default {
serverErrorMessage: '',
isErrorAlertDismissed: false,
sort: 'STARTED_AT_DESC',
- statusFilter: [],
- filteredByStatus: '',
+ statusFilter: ALERTS_STATUS_TABS[0].filters,
+ filteredByStatus: ALERTS_STATUS_TABS[0].status,
alerts: {},
alertsCount: {},
sortBy: 'startedAt',
@@ -283,13 +283,17 @@ export default {
<paginated-table-with-search-and-tabs
:show-error-msg="showErrorMsg"
:i18n="$options.i18n"
- :items="alerts.list || []"
+ :items="
+ alerts.list || [] /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */
+ "
:page-info="alerts.pageInfo"
:items-count="alertsCount"
:status-tabs="$options.statusTabs"
:track-views-options="$options.trackAlertListViewsOptions"
:server-error-message="serverErrorMessage"
- :filter-search-tokens="['assignee_username']"
+ :filter-search-tokens="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ 'assignee_username',
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
filter-search-key="alerts"
@page-changed="pageChanged"
@tabs-changed="statusChanged"
@@ -305,7 +309,11 @@ export default {
<template #table>
<gl-table
class="alert-management-table"
- :items="alerts ? alerts.list : []"
+ :items="
+ alerts
+ ? alerts.list
+ : [] /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */
+ "
:fields="$options.fields"
:show-empty="true"
:busy="loading"
diff --git a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
index 902bad780ad..1f970ef1846 100644
--- a/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
+++ b/app/assets/javascripts/alerts_settings/components/alerts_settings_wrapper.vue
@@ -196,7 +196,7 @@ export default {
.then(
({ data: { httpIntegrationResetToken, prometheusIntegrationResetToken } = {} } = {}) => {
const [error] =
- httpIntegrationResetToken?.errors || prometheusIntegrationResetToken?.errors;
+ httpIntegrationResetToken?.errors || prometheusIntegrationResetToken.errors;
if (error) {
return createFlash({ message: error });
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
index d4f4f244759..babcdea935d 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/create_http_integration.mutation.graphql
@@ -3,8 +3,6 @@
mutation createHttpIntegration($projectPath: ID!, $name: String!, $active: Boolean!) {
httpIntegrationCreate(input: { projectPath: $projectPath, name: $name, active: $active }) {
errors
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
integration {
...HttpIntegrationItem
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
index caa258e0848..05bf8eab524 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/destroy_http_integration.mutation.graphql
@@ -1,10 +1,8 @@
#import "../fragments/http_integration_item.fragment.graphql"
-mutation destroyHttpIntegration($id: ID!) {
+mutation destroyHttpIntegration($id: AlertManagementHttpIntegrationID!) {
httpIntegrationDestroy(input: { id: $id }) {
errors
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
integration {
...HttpIntegrationItem
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
index 2f30f9abb5c..65245bfb914 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_http_token.mutation.graphql
@@ -1,10 +1,8 @@
#import "../fragments/http_integration_item.fragment.graphql"
-mutation resetHttpIntegrationToken($id: ID!) {
+mutation resetHttpIntegrationToken($id: AlertManagementHttpIntegrationID!) {
httpIntegrationResetToken(input: { id: $id }) {
errors
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
integration {
...HttpIntegrationItem
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql
index 8f34521b9fd..99179fca1f9 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/reset_prometheus_token.mutation.graphql
@@ -1,6 +1,6 @@
#import "../fragments/integration_item.fragment.graphql"
-mutation resetPrometheusIntegrationToken($id: ID!) {
+mutation resetPrometheusIntegrationToken($id: IntegrationsPrometheusID!) {
prometheusIntegrationResetToken(input: { id: $id }) {
errors
integration {
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
index 2cf56613673..cc9e841ffb9 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/update_http_integration.mutation.graphql
@@ -1,10 +1,12 @@
#import "../fragments/http_integration_item.fragment.graphql"
-mutation updateHttpIntegration($id: ID!, $name: String!, $active: Boolean!) {
+mutation updateHttpIntegration(
+ $id: AlertManagementHttpIntegrationID!
+ $name: String!
+ $active: Boolean!
+) {
httpIntegrationUpdate(input: { id: $id, name: $name, active: $active }) {
errors
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
integration {
...HttpIntegrationItem
}
diff --git a/app/assets/javascripts/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql b/app/assets/javascripts/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql
index 62761730bd2..95d72e4af91 100644
--- a/app/assets/javascripts/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/mutations/update_prometheus_integration.mutation.graphql
@@ -1,6 +1,10 @@
#import "../fragments/integration_item.fragment.graphql"
-mutation updatePrometheusIntegration($id: ID!, $apiUrl: String!, $active: Boolean!) {
+mutation updatePrometheusIntegration(
+ $id: IntegrationsPrometheusID!
+ $apiUrl: String!
+ $active: Boolean!
+) {
prometheusIntegrationUpdate(input: { id: $id, apiUrl: $apiUrl, active: $active }) {
errors
integration {
diff --git a/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integration.query.graphql b/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integration.query.graphql
index 7299e6836d4..5f6ab27cae9 100644
--- a/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integration.query.graphql
+++ b/app/assets/javascripts/alerts_settings/graphql/queries/get_http_integration.query.graphql
@@ -1,6 +1,6 @@
#import "ee_else_ce/alerts_settings/graphql/fragments/http_integration_payload_data.fragment.graphql"
-query getHttpIntegration($projectPath: ID!, $id: ID) {
+query getHttpIntegration($projectPath: ID!, $id: AlertManagementHttpIntegrationID!) {
project(fullPath: $projectPath) {
id
alertManagementHttpIntegrations(id: $id) {
diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
index b2b033de75d..b151e1605da 100644
--- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -7,6 +7,7 @@ import {
GlDropdownSectionHeader,
GlDropdownItem,
GlSearchBoxByType,
+ GlTruncate,
} from '@gitlab/ui';
import { debounce } from 'lodash';
import { filterBySearchTerm } from '~/analytics/shared/utils';
@@ -28,6 +29,7 @@ export default {
GlDropdownSectionHeader,
GlDropdownItem,
GlSearchBoxByType,
+ GlTruncate,
},
props: {
groupId: {
@@ -212,30 +214,29 @@ export default {
<gl-dropdown
ref="projectsDropdown"
class="dropdown dropdown-projects"
- toggle-class="gl-shadow-none"
+ toggle-class="gl-shadow-none gl-mb-0"
:loading="loadingDefaultProjects"
:show-clear-all="hasSelectedProjects"
show-highlighted-items-title
highlighted-items-title-class="gl-p-3"
+ block
@clear-all.stop="onClearAll"
@hide="onHide"
>
<template #button-content>
- <gl-loading-icon v-if="loadingDefaultProjects" class="gl-mr-2" />
- <div class="gl-display-flex gl-flex-grow-1">
- <gl-avatar
- v-if="isOnlyOneProjectSelected"
- :src="selectedProjects[0].avatarUrl"
- :entity-id="getEntityId(selectedProjects[0])"
- :entity-name="selectedProjects[0].name"
- :size="16"
- :shape="$options.AVATAR_SHAPE_OPTION_RECT"
- :alt="selectedProjects[0].name"
- class="gl-display-inline-flex gl-vertical-align-middle gl-mr-2"
- />
- {{ selectedProjectsLabel }}
- </div>
- <gl-icon class="gl-ml-2" name="chevron-down" />
+ <gl-loading-icon v-if="loadingDefaultProjects" class="gl-mr-2 gl-flex-shrink-0" />
+ <gl-avatar
+ v-if="isOnlyOneProjectSelected"
+ :src="selectedProjects[0].avatarUrl"
+ :entity-id="getEntityId(selectedProjects[0])"
+ :entity-name="selectedProjects[0].name"
+ :size="16"
+ :shape="$options.AVATAR_SHAPE_OPTION_RECT"
+ :alt="selectedProjects[0].name"
+ class="gl-display-inline-flex gl-vertical-align-middle gl-mr-2 gl-flex-shrink-0"
+ />
+ <gl-truncate :text="selectedProjectsLabel" class="gl-min-w-0 gl-flex-grow-1" />
+ <gl-icon class="gl-ml-2 gl-flex-shrink-0" name="chevron-down" />
</template>
<template #header>
<gl-dropdown-section-header>{{ __('Projects') }}</gl-dropdown-section-header>
diff --git a/app/assets/javascripts/analytics/shared/components/value_stream_metrics.vue b/app/assets/javascripts/analytics/shared/components/value_stream_metrics.vue
index 1a3544e7677..6ac1bce4032 100644
--- a/app/assets/javascripts/analytics/shared/components/value_stream_metrics.vue
+++ b/app/assets/javascripts/analytics/shared/components/value_stream_metrics.vue
@@ -1,6 +1,6 @@
<script>
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
-import { flatten, isEqual } from 'lodash';
+import { flatten, isEqual, keyBy } from 'lodash';
import createFlash from '~/flash';
import { sprintf, s__ } from '~/locale';
import { METRICS_POPOVER_CONTENT } from '../constants';
@@ -28,6 +28,23 @@ const fetchMetricsData = (reqs = [], path, params) => {
);
};
+const extractMetricsGroupData = (keyList = [], data = []) => {
+ if (!keyList.length || !data.length) return [];
+ const kv = keyBy(data, 'identifier');
+ return keyList.map((id) => kv[id] || null).filter((obj) => Boolean(obj));
+};
+
+const groupRawMetrics = (groups = [], rawData = []) => {
+ return groups.map((curr) => {
+ const { keys, ...rest } = curr;
+ return {
+ data: extractMetricsGroupData(keys, rawData),
+ keys,
+ ...rest,
+ };
+ });
+};
+
export default {
name: 'ValueStreamMetrics',
components: {
@@ -52,13 +69,24 @@ export default {
required: false,
default: null,
},
+ groupBy: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
metrics: [],
+ groupedMetrics: [],
isLoading: false,
};
},
+ computed: {
+ hasGroupedMetrics() {
+ return Boolean(this.groupBy.length);
+ },
+ },
watch: {
requestParams(newVal, oldVal) {
if (!isEqual(newVal, oldVal)) {
@@ -76,6 +104,11 @@ export default {
return fetchMetricsData(this.requests, this.requestPath, this.requestParams)
.then((data) => {
this.metrics = this.filterFn ? this.filterFn(data) : data;
+
+ if (this.hasGroupedMetrics) {
+ this.groupedMetrics = groupRawMetrics(this.groupBy, this.metrics);
+ }
+
this.isLoading = false;
})
.catch(() => {
@@ -86,14 +119,35 @@ export default {
};
</script>
<template>
- <div class="gl-display-flex gl-flex-wrap" data-testid="vsa-metrics">
+ <div class="gl-display-flex gl-mt-6" data-testid="vsa-metrics">
<gl-skeleton-loading v-if="isLoading" class="gl-h-auto gl-py-3 gl-pr-9 gl-my-6" />
- <metric-tile
- v-for="metric in metrics"
- v-show="!isLoading"
- :key="metric.identifier"
- :metric="metric"
- class="gl-my-6 gl-pr-9"
- />
+ <template v-else>
+ <div v-if="hasGroupedMetrics" class="gl-flex-direction-column">
+ <div
+ v-for="group in groupedMetrics"
+ :key="group.key"
+ class="gl-mb-7"
+ data-testid="vsa-metrics-group"
+ >
+ <h4 class="gl-my-0">{{ group.title }}</h4>
+ <div class="gl-display-flex gl-flex-wrap">
+ <metric-tile
+ v-for="metric in group.data"
+ :key="metric.identifier"
+ :metric="metric"
+ class="gl-mt-5 gl-pr-10"
+ />
+ </div>
+ </div>
+ </div>
+ <div v-else class="gl-display-flex gl-flex-wrap gl-mb-7">
+ <metric-tile
+ v-for="metric in metrics"
+ :key="metric.identifier"
+ :metric="metric"
+ class="gl-mt-5 gl-pr-10"
+ />
+ </div>
+ </template>
</div>
</template>
diff --git a/app/assets/javascripts/analytics/shared/constants.js b/app/assets/javascripts/analytics/shared/constants.js
index 2ac144ceb5e..38d05552783 100644
--- a/app/assets/javascripts/analytics/shared/constants.js
+++ b/app/assets/javascripts/analytics/shared/constants.js
@@ -55,4 +55,40 @@ export const METRICS_POPOVER_CONTENT = {
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.',
+ ),
+ },
};
+
+const KEY_METRICS_TITLE = s__('ValueStreamAnalytics|Key metrics');
+const KEY_METRICS_KEYS = ['lead_time', 'cycle_time', 'issues', 'commits', 'deploys'];
+
+const DORA_METRICS_TITLE = s__('ValueStreamAnalytics|DORA metrics');
+const DORA_METRICS_KEYS = [
+ 'deployment_frequency',
+ 'lead_time_for_changes',
+ 'time_to_restore_service',
+ 'change_failure_rate',
+];
+
+export const VSA_METRICS_GROUPS = [
+ { key: 'key_metrics', title: KEY_METRICS_TITLE, keys: KEY_METRICS_KEYS },
+ { key: 'dora_metrics', title: DORA_METRICS_TITLE, keys: DORA_METRICS_KEYS },
+];
diff --git a/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
index 09dfcddcb73..dfe94aeb884 100644
--- a/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
+++ b/app/assets/javascripts/analytics/usage_trends/components/users_chart.vue
@@ -122,7 +122,7 @@ export default {
<div>
<h3>{{ $options.i18n.yAxisTitle }}</h3>
<gl-alert v-if="loadingError" variant="danger" :dismissible="false" class="gl-mt-3">
- {{ this.$options.i18n.loadUserChartError }}
+ {{ $options.i18n.loadUserChartError }}
</gl-alert>
<chart-skeleton-loader v-else-if="isLoading" />
<gl-alert v-else-if="!chartUserData.length" variant="info" :dismissible="false" class="gl-mt-3">
@@ -132,12 +132,12 @@ export default {
v-else
:option="options"
:include-legend-avg-max="true"
- :data="[
+ :data="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
{
name: $options.i18n.yAxisTitle,
data: chartUserData,
},
- ]"
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
/>
</div>
</template>
diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js
index 64812e52849..8d46ea76be1 100644
--- a/app/assets/javascripts/api.js
+++ b/app/assets/javascripts/api.js
@@ -93,6 +93,7 @@ const Api = {
groupNotificationSettingsPath: '/api/:version/groups/:id/notification_settings',
notificationSettingsPath: '/api/:version/notification_settings',
deployKeysPath: '/api/:version/deploy_keys',
+ secureFilePath: '/api/:version/projects/:project_id/secure_files/:secure_file_id',
secureFilesPath: '/api/:version/projects/:project_id/secure_files',
dependencyProxyPath: '/api/:version/groups/:id/dependency_proxy/cache',
@@ -857,6 +858,14 @@ const Api = {
});
},
+ tag(id, tagName) {
+ const url = Api.buildUrl(this.tagPath)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':tag_name', encodeURIComponent(tagName));
+
+ return axios.get(url);
+ },
+
freezePeriods(id) {
const url = Api.buildUrl(this.freezePeriodsPath).replace(':id', encodeURIComponent(id));
@@ -970,6 +979,22 @@ const Api = {
return axios.get(url, { params: { per_page: DEFAULT_PER_PAGE, ...options } });
},
+ uploadProjectSecureFile(projectId, fileData) {
+ const url = Api.buildUrl(this.secureFilesPath).replace(':project_id', projectId);
+
+ const headers = { 'Content-Type': 'multipart/form-data' };
+
+ return axios.post(url, fileData, { headers });
+ },
+
+ deleteProjectSecureFile(projectId, secureFileId) {
+ const url = Api.buildUrl(this.secureFilePath)
+ .replace(':project_id', projectId)
+ .replace(':secure_file_id', secureFileId);
+
+ return axios.delete(url);
+ },
+
async updateNotificationSettings(projectId, groupId, data = {}) {
let url = Api.buildUrl(this.notificationSettingsPath);
diff --git a/app/assets/javascripts/api/integrations_api.js b/app/assets/javascripts/api/integrations_api.js
new file mode 100644
index 00000000000..692aae21a4f
--- /dev/null
+++ b/app/assets/javascripts/api/integrations_api.js
@@ -0,0 +1,21 @@
+import axios from '../lib/utils/axios_utils';
+import { buildApiUrl } from './api_utils';
+
+const JIRA_CONNECT_SUBSCRIPTIONS_PATH = '/api/:version/integrations/jira_connect/subscriptions';
+
+export function addJiraConnectSubscription(namespacePath, { jwt, accessToken }) {
+ const url = buildApiUrl(JIRA_CONNECT_SUBSCRIPTIONS_PATH);
+
+ return axios.post(
+ url,
+ {
+ jwt,
+ namespace_path: namespacePath,
+ },
+ {
+ headers: {
+ Authorization: `Bearer ${accessToken}`, // eslint-disable-line @gitlab/require-i18n-strings
+ },
+ },
+ );
+}
diff --git a/app/assets/javascripts/api/tags_api.js b/app/assets/javascripts/api/tags_api.js
new file mode 100644
index 00000000000..d4ee247ade6
--- /dev/null
+++ b/app/assets/javascripts/api/tags_api.js
@@ -0,0 +1,12 @@
+import axios from '../lib/utils/axios_utils';
+import { buildApiUrl } from './api_utils';
+
+const TAG_PATH = '/api/:version/projects/:id/repository/tags/:tag_name';
+
+export function getTag(id, tagName) {
+ const url = buildApiUrl(TAG_PATH)
+ .replace(':id', encodeURIComponent(id))
+ .replace(':tag_name', encodeURIComponent(tagName));
+
+ return axios.get(url);
+}
diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js
index 09995fad628..c362253f52e 100644
--- a/app/assets/javascripts/api/user_api.js
+++ b/app/assets/javascripts/api/user_api.js
@@ -10,6 +10,9 @@ const USER_PATH = '/api/:version/users/:id';
const USER_STATUS_PATH = '/api/:version/users/:id/status';
const USER_PROJECTS_PATH = '/api/:version/users/:id/projects';
const USER_POST_STATUS_PATH = '/api/:version/user/status';
+const USER_FOLLOW_PATH = '/api/:version/users/:id/follow';
+const USER_UNFOLLOW_PATH = '/api/:version/users/:id/unfollow';
+const CURRENT_USER_PATH = '/api/:version/user';
export function getUsers(query, options) {
const url = buildApiUrl(USERS_PATH);
@@ -69,3 +72,18 @@ export function updateUserStatus({ emoji, message, availability, clearStatusAfte
clear_status_after: clearStatusAfter,
});
}
+
+export function followUser(userId) {
+ const url = buildApiUrl(USER_FOLLOW_PATH).replace(':id', encodeURIComponent(userId));
+ return axios.post(url);
+}
+
+export function unfollowUser(userId) {
+ const url = buildApiUrl(USER_UNFOLLOW_PATH).replace(':id', encodeURIComponent(userId));
+ return axios.post(url);
+}
+
+export function getCurrentUser(options) {
+ const url = buildApiUrl(CURRENT_USER_PATH);
+ return axios.get(url, { ...options });
+}
diff --git a/app/assets/javascripts/behaviors/copy_to_clipboard.js b/app/assets/javascripts/behaviors/copy_to_clipboard.js
index c3c28aeafc0..07fd6dae76a 100644
--- a/app/assets/javascripts/behaviors/copy_to_clipboard.js
+++ b/app/assets/javascripts/behaviors/copy_to_clipboard.js
@@ -43,7 +43,7 @@ function genericSuccess(e) {
}
/**
- * Safari > 10 doesn't support `execCommand`, so instead we inform the user to copy manually.
+ * Safari < 10 doesn't support `execCommand`, so instead we inform the user to copy manually.
* See http://clipboardjs.com/#browser-support
*/
function genericError(e) {
diff --git a/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js
index 6922ec9c5a5..3b9f6011c6d 100644
--- a/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js
+++ b/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js
@@ -53,9 +53,6 @@ function fixElementSource(el) {
// Mermaid doesn't like `<br />` tags, so collapse all like tags into `<br>`, which is parsed correctly.
const source = el.textContent?.replace(/<br\s*\/>/g, '<br>');
- // Remove any extra spans added by the backend syntax highlighting.
- Object.assign(el, { textContent: source });
-
return { source };
}
@@ -78,17 +75,13 @@ function renderMermaidEl(el, source) {
width: '100%',
});
- // Add the original source into the DOM
- // to allow Copy-as-GFM to access it.
- const sourceEl = document.createElement('text');
- sourceEl.textContent = source;
- sourceEl.classList.add('gl-display-none');
-
const wrapper = document.createElement('div');
wrapper.appendChild(iframeEl);
- wrapper.appendChild(sourceEl);
- el.closest('pre').replaceWith(wrapper);
+ // Hide the markdown but keep it "visible enough" to allow Copy-as-GFM
+ // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83202
+ el.closest('pre').classList.add('gl-sr-only');
+ el.closest('pre').parentNode.appendChild(wrapper);
// Event Listeners
iframeEl.addEventListener('load', () => {
diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
index 6124befd3b6..82229b5aa8f 100644
--- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
+++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_issuable.js
@@ -156,7 +156,7 @@ export default class ShortcutsIssuable extends Shortcuts {
static copyBranchName() {
// There are two buttons - one that is shown when the sidebar
// is expanded, and one that is shown when it's collapsed.
- const allCopyBtns = Array.from(document.querySelectorAll('.js-sidebar-source-branch button'));
+ const allCopyBtns = Array.from(document.querySelectorAll('.js-source-branch-copy'));
// Select whichever button is currently visible so that
// the "Copied" tooltip is shown when a click is simulated.
diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue
index 9832ebbea5c..f032e2e7fb8 100644
--- a/app/assets/javascripts/blob/components/blob_content.vue
+++ b/app/assets/javascripts/blob/components/blob_content.vue
@@ -66,7 +66,7 @@ export default {
</script>
<template>
<div class="blob-viewer" :data-type="activeViewer.type" :data-loaded="!loading">
- <gl-loading-icon v-if="loading" size="md" color="dark" class="my-4 mx-auto" />
+ <gl-loading-icon v-if="loading" size="lg" color="dark" class="my-4 mx-auto" />
<template v-else>
<blob-content-error
diff --git a/app/assets/javascripts/blob/components/blob_header.vue b/app/assets/javascripts/blob/components/blob_header.vue
index 8a4fe1a9025..f78d921fa90 100644
--- a/app/assets/javascripts/blob/components/blob_header.vue
+++ b/app/assets/javascripts/blob/components/blob_header.vue
@@ -92,7 +92,7 @@ export default {
</blob-filepath>
</div>
- <div class="gl-sm-display-flex file-actions">
+ <div class="gl-display-flex gl-flex-wrap file-actions">
<viewer-switcher v-if="showViewerSwitcher" v-model="viewer" :doc-icon="blobSwitcherDocIcon" />
<slot name="actions"></slot>
diff --git a/app/assets/javascripts/blob/file_template_selector.js b/app/assets/javascripts/blob/file_template_selector.js
index e02217d0deb..4f970d657c2 100644
--- a/app/assets/javascripts/blob/file_template_selector.js
+++ b/app/assets/javascripts/blob/file_template_selector.js
@@ -1,10 +1,14 @@
import $ from 'jquery';
+import { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js';
export default class FileTemplateSelector {
constructor(mediator) {
this.mediator = mediator;
this.$dropdown = null;
this.$wrapper = null;
+
+ this.dropdown = null;
+ this.wrapper = null;
}
init() {
@@ -12,18 +16,21 @@ export default class FileTemplateSelector {
this.$dropdown = $(cfg.dropdown);
this.$wrapper = $(cfg.wrapper);
- this.$dropdownIcon = this.$wrapper.find('.dropdown-menu-toggle-icon');
- this.$loadingIcon = $(
- '<div class="gl-spinner gl-spinner-orange gl-spinner-sm gl-absolute gl-top-3 gl-right-3 gl-display-none"></div>',
- ).insertAfter(this.$dropdownIcon);
- this.$dropdownToggleText = this.$wrapper.find('.dropdown-toggle-text');
+
+ this.dropdown = document.querySelector(cfg.dropdown);
+ this.wrapper = document.querySelector(cfg.wrapper);
+
+ this.dropdownIcon = this.wrapper.querySelector('.dropdown-menu-toggle-icon');
+ this.loadingIcon = loadingIconForLegacyJS({ classes: ['gl-display-none'] });
+ this.dropdown.appendChild(this.loadingIcon);
+ this.dropdownToggleText = this.wrapper.querySelector('.dropdown-toggle-text');
this.initDropdown();
this.selectInitialTemplate();
}
selectInitialTemplate() {
- const template = this.$dropdown.data('selected');
+ const template = this.dropdown.dataset.selected;
if (!template) {
return;
@@ -33,11 +40,11 @@ export default class FileTemplateSelector {
}
show() {
- if (this.$dropdown === null) {
+ if (this.dropdown === null) {
this.init();
}
- this.$wrapper.removeClass('hidden');
+ this.wrapper.classList.remove('hidden');
/**
* We set the focus on the dropdown that was just shown. This is done so that, after selecting
@@ -49,36 +56,36 @@ export default class FileTemplateSelector {
* closed anymore.
*/
setTimeout(() => {
- this.$dropdown.focus();
+ this.dropdown.focus();
}, 0);
}
hide() {
- if (this.$dropdown !== null) {
- this.$wrapper.addClass('hidden');
+ if (this.dropdown !== null) {
+ this.wrapper.classList.add('hidden');
}
}
isHidden() {
- return !this.$wrapper || this.$wrapper.hasClass('hidden');
+ return !this.wrapper || this.wrapper.classList.contains('hidden');
}
getToggleText() {
- return this.$dropdownToggleText.text();
+ return this.dropdownToggleText.textContent;
}
setToggleText(text) {
- this.$dropdownToggleText.text(text);
+ this.dropdownToggleText.textContent = text;
}
renderLoading() {
- this.$loadingIcon.removeClass('gl-display-none');
- this.$dropdownIcon.addClass('gl-display-none');
+ this.loadingIcon.classList.remove('gl-display-none');
+ this.dropdownIcon.classList.add('gl-display-none');
}
renderLoaded() {
- this.$loadingIcon.addClass('gl-display-none');
- this.$dropdownIcon.removeClass('gl-display-none');
+ this.loadingIcon.classList.add('gl-display-none');
+ this.dropdownIcon.classList.remove('gl-display-none');
}
reportSelection(options) {
diff --git a/app/assets/javascripts/blob/openapi/index.js b/app/assets/javascripts/blob/openapi/index.js
index a04da98ff77..4c497db9842 100644
--- a/app/assets/javascripts/blob/openapi/index.js
+++ b/app/assets/javascripts/blob/openapi/index.js
@@ -11,6 +11,7 @@ export default () => {
url: el.dataset.endpoint,
dom_id: '#js-openapi-viewer',
deepLinking: true,
+ displayOperationId: true,
});
})
.catch((error) => {
diff --git a/app/assets/javascripts/blob/pipeline_tour_success_modal.vue b/app/assets/javascripts/blob/pipeline_tour_success_modal.vue
index b4ca29114cb..f3c542c467a 100644
--- a/app/assets/javascripts/blob/pipeline_tour_success_modal.vue
+++ b/app/assets/javascripts/blob/pipeline_tour_success_modal.vue
@@ -132,7 +132,7 @@ export default {
<gl-button
ref="goToPipelines"
:href="goToPipelinesPath"
- variant="success"
+ variant="confirm"
:data-track-property="humanAccess"
:data-track-value="$options.goToTrackValuePipelines"
:data-track-action="$options.trackEvent"
diff --git a/app/assets/javascripts/blob/sketch/index.js b/app/assets/javascripts/blob/sketch/index.js
index d257810da65..a92161bbc1b 100644
--- a/app/assets/javascripts/blob/sketch/index.js
+++ b/app/assets/javascripts/blob/sketch/index.js
@@ -27,7 +27,7 @@ export default class SketchLoader {
}
getZipFile() {
- return new JSZip.external.Promise((resolve, reject) => {
+ return new Promise((resolve, reject) => {
JSZipUtils.getBinaryContent(this.container.dataset.endpoint, (err, data) => {
if (err) {
reject(err);
diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js
index ee2f6cfb46c..2ee2e199358 100644
--- a/app/assets/javascripts/blob_edit/edit_blob.js
+++ b/app/assets/javascripts/blob_edit/edit_blob.js
@@ -1,8 +1,8 @@
import $ from 'jquery';
import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
+import { ToolbarExtension } from '~/editor/extensions/source_editor_toolbar_ext';
import SourceEditor from '~/editor/source_editor';
-import { getBlobLanguage } from '~/editor/utils';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
@@ -36,7 +36,7 @@ export default class EditBlob {
import('~/editor/extensions/source_editor_markdown_ext'),
import('~/editor/extensions/source_editor_markdown_livepreview_ext'),
]);
- this.editor.use([
+ this.markdownExtensions = this.editor.use([
{ definition: MarkdownExtension },
{
definition: MarkdownLivePreview,
@@ -48,7 +48,6 @@ export default class EditBlob {
message: `${BLOB_EDITOR_ERROR}: ${e}`,
});
}
- this.hasMarkdownExtension = true;
addEditorMarkdownListeners(this.editor);
}
@@ -58,8 +57,6 @@ export default class EditBlob {
const fileContentEl = document.getElementById('file-content');
const form = document.querySelector('.js-edit-blob-form');
- this.hasMarkdownExtension = false;
-
const rootEditor = new SourceEditor();
this.editor = rootEditor.createInstance({
@@ -67,21 +64,29 @@ export default class EditBlob {
blobPath: fileNameEl.value,
blobContent: editorEl.innerText,
});
- this.editor.use([{ definition: SourceEditorExtension }, { definition: FileTemplateExtension }]);
+ this.editor.use([
+ { definition: SourceEditorExtension },
+ { definition: FileTemplateExtension },
+ { definition: ToolbarExtension },
+ ]);
fileNameEl.addEventListener('change', () => {
this.editor.updateModelLanguage(fileNameEl.value);
- const newLang = getBlobLanguage(fileNameEl.value);
- if (newLang === 'markdown') {
- if (!this.hasMarkdownExtension) {
- this.fetchMarkdownExtension();
- }
- }
});
form.addEventListener('submit', () => {
fileContentEl.value = insertFinalNewline(this.editor.getValue());
});
+
+ // onDidChangeModelLanguage is part of the native Monaco API
+ // https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneCodeEditor.html#onDidChangeModelLanguage
+ this.editor.onDidChangeModelLanguage(({ newLanguage = '', oldLanguage = '' }) => {
+ if (newLanguage === 'markdown') {
+ this.fetchMarkdownExtension();
+ } else if (oldLanguage === 'markdown') {
+ this.editor.unuse(this.markdownExtensions);
+ }
+ });
}
initFileSelectors() {
diff --git a/app/assets/javascripts/boards/components/board_add_new_column_form.vue b/app/assets/javascripts/boards/components/board_add_new_column_form.vue
index 70ba90bb1d4..10c7a3db2d3 100644
--- a/app/assets/javascripts/boards/components/board_add_new_column_form.vue
+++ b/app/assets/javascripts/boards/components/board_add_new_column_form.vue
@@ -80,17 +80,14 @@ export default {
<template>
<div
- class="board-add-new-list board gl-display-inline-block gl-h-full gl-px-3 gl-vertical-align-top gl-white-space-normal gl-flex-shrink-0"
+ class="board-add-new-list board gl-display-inline-block gl-h-full gl-vertical-align-top gl-white-space-normal gl-flex-shrink-0 gl-rounded-base gl-px-3"
data-testid="board-add-new-column"
data-qa-selector="board_add_new_list"
>
<div
- class="board-inner gl-display-flex gl-flex-direction-column gl-relative gl-h-full gl-rounded-base gl-bg-white"
+ class="board-inner gl-display-flex gl-flex-direction-column gl-relative gl-h-full gl-rounded-base"
>
- <h3
- class="gl-font-size-h2 gl-px-5 gl-py-4 gl-m-0 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100"
- data-testid="board-add-column-form-title"
- >
+ <h3 class="gl-font-size-h2 gl-px-5 gl-py-5 gl-m-0" data-testid="board-add-column-form-title">
{{ $options.i18n.newList }}
</h3>
@@ -98,7 +95,7 @@ export default {
class="gl-display-flex gl-flex-direction-column gl-h-full gl-overflow-y-auto gl-align-items-flex-start"
>
<div class="gl-px-5">
- <h3 class="gl-font-lg gl-mt-5 gl-mb-2">
+ <h3 class="gl-font-lg gl-mt-3 gl-mb-2">
{{ $options.i18n.scope }}
</h3>
<p class="gl-mb-3">{{ $options.i18n.scopeDescription }}</p>
@@ -147,23 +144,18 @@ export default {
</gl-dropdown>
</gl-form-group>
</div>
- <div
- class="gl-display-flex gl-p-3 gl-border-t-1 gl-border-t-solid gl-border-gray-100 gl-bg-gray-10 gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
- >
- <gl-button
- data-testid="cancelAddNewColumn"
- class="gl-ml-auto gl-mr-3"
- @click="setAddColumnFormVisibility(false)"
- >{{ $options.i18n.cancel }}</gl-button
- >
+ <div class="gl-display-flex gl-mb-4">
<gl-button
data-testid="addNewColumnButton"
:disabled="!selectedId"
variant="confirm"
- class="gl-mr-4"
+ class="gl-mr-3 gl-ml-4"
@click="$emit('add-list')"
>{{ $options.i18n.add }}</gl-button
>
+ <gl-button data-testid="cancelAddNewColumn" @click="setAddColumnFormVisibility(false)">{{
+ $options.i18n.cancel
+ }}</gl-button>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index 814ff16efec..98ce1ac7f97 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -11,10 +11,12 @@ import { sortBy } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
import boardCardInner from 'ee_else_ce/boards/mixins/board_card_inner';
import { isScopedLabel } from '~/lib/utils/common_utils';
+import { updateHistory } from '~/lib/utils/url_utility';
import { sprintf, __, n__ } from '~/locale';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
import { ListType } from '../constants';
+import eventHub from '../eventhub';
import BoardBlockedIcon from './board_blocked_icon.vue';
import IssueDueDate from './issue_due_date.vue';
import IssueTimeEstimate from './issue_time_estimate.vue';
@@ -174,10 +176,19 @@ export default {
)
);
},
- labelTarget(label) {
+ filterByLabel(label) {
+ if (!this.updateFilters) return;
+
const filterPath = window.location.search ? `${window.location.search}&` : '?';
- const value = encodeURIComponent(label.title);
- return `${filterPath}label_name[]=${value}`;
+ const filter = `label_name[]=${encodeURIComponent(label.title)}`;
+
+ if (!filterPath.includes(filter)) {
+ updateHistory({
+ url: `${filterPath}${filter}`,
+ });
+ this.performSearch();
+ eventHub.$emit('updateTokens');
+ }
},
showScopedLabel(label) {
return this.scopedLabelsAvailable && isScopedLabel(label);
@@ -232,7 +243,7 @@ export default {
:description="label.description"
size="sm"
:scoped="showScopedLabel(label)"
- :target="labelTarget(label)"
+ @click="filterByLabel(label)"
/>
</template>
</div>
@@ -242,7 +253,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="md" class="mt-3" />
+ <gl-loading-icon v-if="item.isLoading" size="lg" class="mt-3" />
<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/board_content.vue b/app/assets/javascripts/boards/components/board_content.vue
index 1d6a71aca47..8868b9b2f3e 100644
--- a/app/assets/javascripts/boards/components/board_content.vue
+++ b/app/assets/javascripts/boards/components/board_content.vue
@@ -75,7 +75,7 @@ export default {
v-if="!isSwimlanesOn"
ref="list"
v-bind="draggableOptions"
- class="boards-list gl-w-full gl-py-5 gl-px-3 gl-white-space-nowrap"
+ class="boards-list gl-w-full gl-py-5 gl-pr-3 gl-white-space-nowrap"
@end="moveList"
>
<board-column
@@ -85,10 +85,11 @@ export default {
:list="list"
:data-draggable-item-type="$options.draggableItemTypes.list"
:disabled="disabled"
+ :class="{ 'gl-xs-display-none!': addColumnFormVisible }"
/>
<transition name="slide" @after-enter="afterFormEnters">
- <board-add-new-column v-if="addColumnFormVisible" />
+ <board-add-new-column v-if="addColumnFormVisible" class="gl-xs-w-full!" />
</transition>
</component>
diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue
index aeb2cee590d..fa0c798ca9d 100644
--- a/app/assets/javascripts/boards/components/board_filtered_search.vue
+++ b/app/assets/javascripts/boards/components/board_filtered_search.vue
@@ -2,7 +2,8 @@
import { pickBy, isEmpty, mapValues } from 'lodash';
import { mapActions } from 'vuex';
import { getIdFromGraphQLId, isGid } from '~/graphql_shared/utils';
-import { updateHistory, setUrlParams } from '~/lib/utils/url_utility';
+import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { updateHistory, setUrlParams, queryToObject } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import {
FILTERED_SEARCH_TERM,
@@ -10,6 +11,7 @@ import {
} from '~/vue_shared/components/filtered_search_bar/constants';
import FilteredSearch from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import { AssigneeFilterType } from '~/boards/constants';
+import eventHub from '../eventhub';
export default {
i18n: {
@@ -33,6 +35,7 @@ export default {
data() {
return {
filterParams: this.initialFilterParams,
+ filteredSearchKey: 0,
};
},
computed: {
@@ -306,12 +309,21 @@ export default {
},
},
created() {
+ eventHub.$on('updateTokens', this.updateTokens);
if (!isEmpty(this.eeFilters)) {
this.filterParams = this.eeFilters;
}
},
+ beforeDestroy() {
+ eventHub.$off('updateTokens', this.updateTokens);
+ },
methods: {
...mapActions(['performSearch']),
+ updateTokens() {
+ const rawFilterParams = queryToObject(window.location.search, { gatherArrays: true });
+ this.filterParams = convertObjectPropsToCamelCase(rawFilterParams, {});
+ this.filteredSearchKey += 1;
+ },
handleFilter(filters) {
this.filterParams = this.getFilterParams(filters);
@@ -399,6 +411,7 @@ export default {
<template>
<filtered-search
+ :key="filteredSearchKey"
class="gl-w-full"
namespace=""
:tokens="tokens"
diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue
index a874c9e070a..9d972860d06 100644
--- a/app/assets/javascripts/boards/components/board_form.vue
+++ b/app/assets/javascripts/boards/components/board_form.vue
@@ -17,6 +17,7 @@ const boardDefaults = {
labels: [],
milestone: {},
iterationCadence: {},
+ iterationCadenceId: null,
iteration: {},
assignee: {},
weight: null,
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 47f25f34d0c..66388f4eb43 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -287,7 +287,7 @@ export default {
:data-board-type="list.listType"
:class="{ 'bg-danger-100': boardItemsSizeExceedsMax }"
draggable=".board-card"
- class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-2"
+ class="board-list gl-w-full gl-h-full gl-list-style-none gl-mb-0 gl-p-3 gl-pt-0"
data-testid="tree-root-wrapper"
@start="handleDragOnStart"
@end="handleDragOnEnd"
diff --git a/app/assets/javascripts/boards/components/board_list_header.vue b/app/assets/javascripts/boards/components/board_list_header.vue
index 9f70c84931f..a4298eb2544 100644
--- a/app/assets/javascripts/boards/components/board_list_header.vue
+++ b/app/assets/javascripts/boards/components/board_list_header.vue
@@ -126,7 +126,7 @@ export default {
return this.list.collapsed ? this.$options.i18n.expand : this.$options.i18n.collapse;
},
chevronIcon() {
- return this.list.collapsed ? 'chevron-down' : 'chevron-right';
+ return this.list.collapsed ? 'chevron-right' : 'chevron-down';
},
isNewIssueShown() {
return (this.listType === ListType.backlog || this.showListHeaderButton) && !this.isEpicBoard;
@@ -248,7 +248,6 @@ export default {
<template>
<header
:class="{
- 'has-border': list.label && list.label.color,
'gl-h-full': list.collapsed,
'board-inner gl-rounded-top-left-base gl-rounded-top-right-base': isSwimlanesHeader,
}"
@@ -279,28 +278,6 @@ export default {
@click="toggleExpanded"
/>
<!-- EE start -->
- <span
- v-if="showMilestoneListDetails"
- aria-hidden="true"
- class="milestone-icon"
- :class="{
- 'gl-mt-3 gl-rotate-90': list.collapsed,
- 'gl-mr-2': !list.collapsed,
- }"
- >
- <gl-icon name="timer" />
- </span>
-
- <span
- v-if="showIterationListDetails"
- aria-hidden="true"
- :class="{
- 'gl-mt-3 gl-rotate-90': list.collapsed,
- 'gl-mr-2': !list.collapsed,
- }"
- >
- <gl-icon name="iteration" />
- </span>
<a
v-if="showAssigneeListDetails"
@@ -399,7 +376,7 @@ export default {
<span class="gl-display-inline-flex">
<gl-tooltip :target="() => $refs.itemCount" :title="itemsTooltipLabel" />
<span ref="itemCount" class="gl-display-inline-flex gl-align-items-center">
- <gl-icon class="gl-mr-2" :name="countIcon" />
+ <gl-icon class="gl-mr-2" :name="countIcon" :size="16" />
<item-count
v-if="!isLoading"
:items-size="isEpicBoard ? list.epicsCount : boardList.issuesCount"
diff --git a/app/assets/javascripts/boards/components/board_settings_sidebar.vue b/app/assets/javascripts/boards/components/board_settings_sidebar.vue
index 24071c6f0b4..c559e4cdbd3 100644
--- a/app/assets/javascripts/boards/components/board_settings_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_settings_sidebar.vue
@@ -135,14 +135,14 @@ export default {
:modal-id="$options.modalId"
:title="$options.i18n.modalAction"
size="sm"
- :action-primary="{
+ :action-primary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
text: $options.i18n.modalAction,
attributes: [{ variant: 'danger' }],
- }"
- :action-secondary="{
+ } /* 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 */"
@primary="handleModalPrimary"
>
<p>{{ $options.i18n.modalCopy }}</p>
diff --git a/app/assets/javascripts/boards/components/board_top_bar.vue b/app/assets/javascripts/boards/components/board_top_bar.vue
index f90ac1e9079..54a6e3000a4 100644
--- a/app/assets/javascripts/boards/components/board_top_bar.vue
+++ b/app/assets/javascripts/boards/components/board_top_bar.vue
@@ -33,7 +33,7 @@ export default {
class="issues-details-filters filtered-search-block gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row row-content-block second-block"
>
<div
- class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-flex-grow-1 gl-lg-mb-0! mb-md-2 mb-sm-0 gl-w-full"
+ class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-flex-grow-1 gl-lg-mb-0 gl-mb-3 gl-w-full"
>
<boards-selector />
<new-board-button />
@@ -41,7 +41,7 @@ export default {
<issue-board-filtered-search v-else />
</div>
<div
- class="filter-dropdown-container gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-align-items-flex-start"
+ class="filter-dropdown-container gl-md-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-align-items-flex-start"
>
<toggle-labels />
<toggle-epics-swimlanes v-if="swimlanesFeatureAvailable && isSignedIn" />
diff --git a/app/assets/javascripts/boards/components/config_toggle.vue b/app/assets/javascripts/boards/components/config_toggle.vue
index 4746f598ab7..7002fd44294 100644
--- a/app/assets/javascripts/boards/components/config_toggle.vue
+++ b/app/assets/javascripts/boards/components/config_toggle.vue
@@ -1,5 +1,6 @@
<script>
import { GlButton, GlModalDirective, GlTooltipDirective } from '@gitlab/ui';
+import { mapGetters } from 'vuex';
import { formType } from '~/boards/constants';
import eventHub from '~/boards/eventhub';
import { s__, __ } from '~/locale';
@@ -14,8 +15,9 @@ export default {
GlModalDirective,
},
mixins: [Tracking.mixin()],
- inject: ['canAdminList', 'hasScope'],
+ inject: ['canAdminList'],
computed: {
+ ...mapGetters(['hasScope']),
buttonText() {
return this.canAdminList ? s__('Boards|Edit board') : s__('Boards|View scope');
},
diff --git a/app/assets/javascripts/boards/components/project_select.vue b/app/assets/javascripts/boards/components/project_select.vue
index 1412411c275..247910301e7 100644
--- a/app/assets/javascripts/boards/components/project_select.vue
+++ b/app/assets/javascripts/boards/components/project_select.vue
@@ -91,6 +91,9 @@ export default {
loadMoreProjects() {
this.fetchGroupProjects({ search: this.searchTerm, fetchNext: true });
},
+ setFocus() {
+ this.$refs.search.focusInput();
+ },
},
};
</script>
@@ -107,8 +110,10 @@ export default {
block
menu-class="gl-w-full!"
:loading="initialLoading"
+ @shown="setFocus"
>
<gl-search-box-by-type
+ ref="search"
v-model.trim="searchTerm"
debounce="250"
:placeholder="$options.i18n.searchPlaceholder"
@@ -135,7 +140,7 @@ export default {
<span class="gl-text-gray-500">{{ $options.i18n.emptySearchResult }}</span>
</gl-dropdown-text>
<gl-intersection-observer v-if="hasNextPage" @appear="loadMoreProjects">
- <gl-loading-icon v-if="groupProjectsFlags.isLoadingMore" size="md" />
+ <gl-loading-icon v-if="groupProjectsFlags.isLoadingMore" size="lg" />
</gl-intersection-observer>
</gl-dropdown>
</div>
diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
index 9d19fe57e7a..53e574e9942 100644
--- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
+++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
@@ -130,7 +130,7 @@ export default {
@off-click="handleOffClick"
>
<template #title>
- <span class="gl-font-weight-bold" data-testid="item-title">{{ item.title }}</span>
+ <span data-testid="item-title">{{ item.title }}</span>
</template>
<template #collapsed>
<span class="gl-text-gray-800">{{ item.referencePath }}</span>
diff --git a/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql b/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
index 81cc7b4d246..0e1d11727cf 100644
--- a/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/board_list_create.mutation.graphql
@@ -2,8 +2,6 @@
mutation createBoardList($boardId: BoardID!, $backlog: Boolean, $labelId: LabelID) {
boardListCreate(input: { boardId: $boardId, backlog: $backlog, labelId: $labelId }) {
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
list {
...BoardListFragment
}
diff --git a/app/assets/javascripts/boards/graphql/board_list_destroy.mutation.graphql b/app/assets/javascripts/boards/graphql/board_list_destroy.mutation.graphql
index ef3fd36e980..5cb1a74d5c7 100644
--- a/app/assets/javascripts/boards/graphql/board_list_destroy.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/board_list_destroy.mutation.graphql
@@ -1,4 +1,4 @@
-mutation DestroyBoardList($listId: ID!) {
+mutation DestroyBoardList($listId: ListID!) {
destroyBoardList(input: { listId: $listId }) {
errors
}
diff --git a/app/assets/javascripts/boards/graphql/board_list_update.mutation.graphql b/app/assets/javascripts/boards/graphql/board_list_update.mutation.graphql
index 7ea0e2f915a..13327028065 100644
--- a/app/assets/javascripts/boards/graphql/board_list_update.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/board_list_update.mutation.graphql
@@ -1,9 +1,7 @@
#import "./board_list.fragment.graphql"
-mutation UpdateBoardList($listId: ID!, $position: Int, $collapsed: Boolean) {
+mutation UpdateBoardList($listId: ListID!, $position: Int, $collapsed: Boolean) {
updateBoardList(input: { listId: $listId, position: $position, collapsed: $collapsed }) {
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
list {
...BoardListFragment
}
diff --git a/app/assets/javascripts/boards/graphql/board_lists.query.graphql b/app/assets/javascripts/boards/graphql/board_lists.query.graphql
index e6e98864aad..06e8c8783de 100644
--- a/app/assets/javascripts/boards/graphql/board_lists.query.graphql
+++ b/app/assets/javascripts/boards/graphql/board_lists.query.graphql
@@ -2,7 +2,7 @@
query BoardLists(
$fullPath: ID!
- $boardId: ID!
+ $boardId: BoardID!
$filters: BoardIssueInput
$isGroup: Boolean = false
$isProject: Boolean = false
@@ -13,8 +13,6 @@ query BoardLists(
id
hideBacklogList
lists(issueFilters: $filters) {
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
nodes {
...BoardListFragment
}
@@ -27,8 +25,6 @@ query BoardLists(
id
hideBacklogList
lists(issueFilters: $filters) {
- # We have ID in a deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
nodes {
...BoardListFragment
}
diff --git a/app/assets/javascripts/boards/graphql/board_lists_deferred.query.graphql b/app/assets/javascripts/boards/graphql/board_lists_deferred.query.graphql
index bae3220dfad..f48383624c9 100644
--- a/app/assets/javascripts/boards/graphql/board_lists_deferred.query.graphql
+++ b/app/assets/javascripts/boards/graphql/board_lists_deferred.query.graphql
@@ -1,4 +1,4 @@
-query BoardList($id: ID!, $filters: BoardIssueInput) {
+query BoardList($id: ListID!, $filters: BoardIssueInput) {
boardList(id: $id, issueFilters: $filters) {
id
issuesCount
diff --git a/app/assets/javascripts/boards/graphql/group_board.query.graphql b/app/assets/javascripts/boards/graphql/group_board.query.graphql
index 8d87b83da96..526e3193efe 100644
--- a/app/assets/javascripts/boards/graphql/group_board.query.graphql
+++ b/app/assets/javascripts/boards/graphql/group_board.query.graphql
@@ -1,6 +1,6 @@
#import "ee_else_ce/boards/graphql/board_scope.fragment.graphql"
-query GroupBoard($fullPath: ID!, $boardId: ID!) {
+query GroupBoard($fullPath: ID!, $boardId: BoardID!) {
workspace: group(fullPath: $fullPath) {
id
board(id: $boardId) {
diff --git a/app/assets/javascripts/boards/graphql/issue_move_list.mutation.graphql b/app/assets/javascripts/boards/graphql/issue_move_list.mutation.graphql
index 1658cf09085..89670760450 100644
--- a/app/assets/javascripts/boards/graphql/issue_move_list.mutation.graphql
+++ b/app/assets/javascripts/boards/graphql/issue_move_list.mutation.graphql
@@ -3,7 +3,7 @@
mutation issueMoveList(
$projectPath: ID!
$iid: String!
- $boardId: ID!
+ $boardId: BoardID!
$fromListId: ID
$toListId: ID
$moveBeforeId: ID
diff --git a/app/assets/javascripts/boards/graphql/lists_issues.query.graphql b/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
index 994ea894be3..bf5329c4a8d 100644
--- a/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
+++ b/app/assets/javascripts/boards/graphql/lists_issues.query.graphql
@@ -2,8 +2,8 @@
query BoardListsEE(
$fullPath: ID!
- $boardId: ID!
- $id: ID
+ $boardId: BoardID!
+ $id: ListID
$filters: BoardIssueInput
$isGroup: Boolean = false
$isProject: Boolean = false
diff --git a/app/assets/javascripts/boards/graphql/project_board.query.graphql b/app/assets/javascripts/boards/graphql/project_board.query.graphql
index 8246d615a6a..2a9142696d2 100644
--- a/app/assets/javascripts/boards/graphql/project_board.query.graphql
+++ b/app/assets/javascripts/boards/graphql/project_board.query.graphql
@@ -1,6 +1,6 @@
#import "ee_else_ce/boards/graphql/board_scope.fragment.graphql"
-query ProjectBoard($fullPath: ID!, $boardId: ID!) {
+query ProjectBoard($fullPath: ID!, $boardId: BoardID!) {
workspace: project(fullPath: $fullPath) {
id
board(id: $boardId) {
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 77c5994b5a1..8af7da1e0aa 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -69,7 +69,6 @@ function mountBoardApp(el) {
timeTrackingLimitToHours: parseBoolean(el.dataset.timeTrackingLimitToHours),
issuableType: issuableTypes.issue,
emailsDisabled: parseBoolean(el.dataset.emailsDisabled),
- hasScope: parseBoolean(el.dataset.hasScope),
hasMissingBoards: parseBoolean(el.dataset.hasMissingBoards),
weights: el.dataset.weights ? JSON.parse(el.dataset.weights) : [],
// Permissions
diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js
index 82307da2572..a84b678a5d9 100644
--- a/app/assets/javascripts/boards/stores/actions.js
+++ b/app/assets/javascripts/boards/stores/actions.js
@@ -77,6 +77,7 @@ export default {
milestoneTitle: board.milestone?.title || null,
iterationId: board.iteration?.id || null,
iterationTitle: board.iteration?.title || null,
+ iterationCadenceId: board.iterationCadence?.id || null,
assigneeId: board.assignee?.id || null,
assigneeUsername: board.assignee?.username || null,
labels: board.labels?.nodes || [],
@@ -134,7 +135,7 @@ export default {
variables,
})
.then(({ data }) => {
- const { lists, hideBacklogList } = data[boardType]?.board;
+ const { lists, hideBacklogList } = data[boardType].board;
commit(types.RECEIVE_BOARD_LISTS_SUCCESS, formatBoardLists(lists));
// Backlog list needs to be created if it doesn't exist and it's not hidden
if (!lists.nodes.find((l) => l.listType === ListType.backlog) && !hideBacklogList) {
@@ -429,7 +430,7 @@ export default {
variables,
})
.then(({ data }) => {
- const { lists } = data[boardType]?.board;
+ const { lists } = data[boardType].board;
const listItems = formatListIssues(lists);
const listPageInfo = formatListsPageInfo(lists);
commit(types.RECEIVE_ITEMS_FOR_LIST_SUCCESS, { listItems, listPageInfo, listId });
diff --git a/app/assets/javascripts/boards/stores/getters.js b/app/assets/javascripts/boards/stores/getters.js
index cb31eb4b008..e1891a4d954 100644
--- a/app/assets/javascripts/boards/stores/getters.js
+++ b/app/assets/javascripts/boards/stores/getters.js
@@ -51,4 +51,18 @@ export default {
isEpicBoard: () => {
return false;
},
+
+ hasScope: (state) => {
+ const { boardConfig } = state;
+ if (boardConfig.labels?.length > 0) {
+ return true;
+ }
+ let hasScope = false;
+ ['assigneeId', 'iterationCadenceId', 'iterationId', 'milestoneId', 'weight'].forEach((attr) => {
+ if (boardConfig[attr] !== null && boardConfig[attr] !== undefined) {
+ hasScope = true;
+ }
+ });
+ return hasScope;
+ },
};
diff --git a/app/assets/javascripts/branches/components/delete_branch_modal.vue b/app/assets/javascripts/branches/components/delete_branch_modal.vue
index 14c2badeb3f..383fa5f7512 100644
--- a/app/assets/javascripts/branches/components/delete_branch_modal.vue
+++ b/app/assets/javascripts/branches/components/delete_branch_modal.vue
@@ -32,17 +32,10 @@ export default {
return sprintf(modalTitle, { branchName: this.branchName });
},
- message() {
- const modalMessage = this.isProtectedBranch
+ modalMessage() {
+ return this.isProtectedBranch
? this.$options.i18n.modalMessageProtectedBranch
: this.$options.i18n.modalMessage;
-
- return sprintf(modalMessage, { branchName: this.branchName });
- },
- unmergedWarning() {
- return sprintf(this.$options.i18n.unmergedWarning, {
- defaultBranchName: this.defaultBranchName,
- });
},
undoneWarning() {
return sprintf(this.$options.i18n.undoneWarning, {
@@ -92,17 +85,15 @@ export default {
i18n: {
modalTitle: s__('Branches|Delete branch. Are you ABSOLUTELY SURE?'),
modalTitleProtectedBranch: s__('Branches|Delete protected branch. Are you ABSOLUTELY SURE?'),
- modalMessage: s__(
- "Branches|You're about to permanently delete the branch %{strongStart}%{branchName}.%{strongEnd}",
- ),
+ modalMessage: s__("Branches|You're about to permanently delete the branch %{branchName}."),
modalMessageProtectedBranch: s__(
- "Branches|You're about to permanently delete the protected branch %{strongStart}%{branchName}.%{strongEnd}",
+ "Branches|You're about to permanently delete the protected branch %{branchName}.",
),
unmergedWarning: s__(
- 'Branches|This branch hasn’t been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it.',
+ "Branches|This branch hasn't been merged into %{defaultBranchName}. To avoid data loss, consider merging this branch before deleting it.",
),
undoneWarning: s__(
- 'Branches|Once you confirm and press %{strongStart}%{buttonText},%{strongEnd} it cannot be undone or recovered.',
+ 'Branches|After you confirm and select %{strongStart}%{buttonText},%{strongEnd} you cannot recover this branch.',
),
cancelButtonText: s__('Branches|Cancel, keep branch'),
confirmationText: s__(
@@ -119,13 +110,19 @@ export default {
<gl-modal ref="modal" size="sm" :modal-id="modalId" :title="title">
<gl-alert class="gl-mb-5" variant="danger" :dismissible="false">
<div data-testid="modal-message">
- <gl-sprintf :message="message">
- <template #strong="{ content }">
- <strong> {{ content }} </strong>
+ <gl-sprintf :message="modalMessage">
+ <template #branchName>
+ <strong>
+ <code class="gl-white-space-pre-wrap">{{ branchName }}</code>
+ </strong>
</template>
</gl-sprintf>
<p v-if="!merged" class="gl-mb-0 gl-mt-4">
- {{ unmergedWarning }}
+ <gl-sprintf :message="$options.i18n.unmergedWarning">
+ <template #defaultBranchName>
+ <code class="gl-white-space-pre-wrap">{{ defaultBranchName }}</code>
+ </template>
+ </gl-sprintf>
</p>
</div>
</gl-alert>
@@ -145,7 +142,7 @@ export default {
{{ content }}
</template>
</gl-sprintf>
- <code class="gl-white-space-pre-wrap"> {{ branchName }} </code>
+ <code class="gl-white-space-pre-wrap">{{ branchName }}</code>
<gl-form-input
v-model="enteredBranchName"
name="delete_branch_input"
diff --git a/app/assets/javascripts/captcha/captcha_modal.vue b/app/assets/javascripts/captcha/captcha_modal.vue
index b8b90b04beb..36aa098d5ff 100644
--- a/app/assets/javascripts/captcha/captcha_modal.vue
+++ b/app/assets/javascripts/captcha/captcha_modal.vue
@@ -107,7 +107,9 @@ export default {
ref="modal"
:modal-id="modalId"
:title="__('Please solve the captcha')"
- :action-cancel="{ text: __('Cancel') }"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: __('Cancel'),
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@shown="shown"
@hide="hide"
@hidden="$emit('hidden')"
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 d70ade36fe9..dbc4565b19d 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
@@ -1,22 +1,48 @@
<script>
-import { GlLink, GlLoadingIcon, GlPagination, GlTable } from '@gitlab/ui';
+import {
+ GlAlert,
+ GlButton,
+ GlIcon,
+ GlLink,
+ GlLoadingIcon,
+ GlModal,
+ GlModalDirective,
+ GlPagination,
+ GlSprintf,
+ GlTable,
+ GlTooltipDirective,
+} from '@gitlab/ui';
+import * as Sentry from '@sentry/browser';
import Api, { DEFAULT_PER_PAGE } from '~/api';
import { helpPagePath } from '~/helpers/help_page_helper';
-import { __ } from '~/locale';
+import httpStatusCodes from '~/lib/utils/http_status';
+import { __, s__, sprintf } from '~/locale';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
export default {
components: {
+ GlAlert,
+ GlButton,
+ GlIcon,
GlLink,
GlLoadingIcon,
+ GlModal,
GlPagination,
+ GlSprintf,
GlTable,
TimeagoTooltip,
},
- inject: ['projectId'],
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ GlModal: GlModalDirective,
+ },
+ inject: ['projectId', 'admin', 'fileSizeLimit'],
docsLink: helpPagePath('ci/secure_files/index'),
DEFAULT_PER_PAGE,
i18n: {
+ deleteLabel: __('Delete File'),
+ uploadLabel: __('Upload File'),
+ uploadingLabel: __('Uploading...'),
pagination: {
next: __('Next'),
prev: __('Prev'),
@@ -26,27 +52,45 @@ export default {
'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.'),
+ },
+ deleteModalTitle: s__('SecureFiles|Delete %{name}?'),
+ deleteModalMessage: s__(
+ 'SecureFiles|Secure File %{name} will be permanently deleted. Are you sure?',
+ ),
+ deleteModalButton: s__('SecureFiles|Delete secure file'),
},
+ deleteModalId: 'deleteModalId',
data() {
return {
page: 1,
totalItems: 0,
loading: false,
+ uploading: false,
+ error: false,
+ errorMessage: null,
projectSecureFiles: [],
+ deleteModalFileId: null,
+ deleteModalFileName: null,
};
},
fields: [
{
key: 'name',
label: __('Filename'),
- },
- {
- key: 'permissions',
- label: __('Permissions'),
+ tdClass: 'gl-vertical-align-middle!',
},
{
key: 'created_at',
label: __('Uploaded'),
+ tdClass: 'gl-vertical-align-middle!',
+ },
+ {
+ key: 'actions',
+ label: '',
+ tdClass: 'gl-text-right gl-vertical-align-middle!',
},
],
computed: {
@@ -63,6 +107,18 @@ export default {
this.getProjectSecureFiles();
},
methods: {
+ async deleteSecureFile(secureFileId) {
+ this.loading = true;
+ this.error = false;
+ try {
+ await Api.deleteProjectSecureFile(this.projectId, secureFileId);
+ this.getProjectSecureFiles();
+ } catch (error) {
+ Sentry.captureException(error);
+ this.error = true;
+ this.errorMessage = error;
+ }
+ },
async getProjectSecureFiles(page) {
this.loading = true;
const response = await Api.projectSecureFiles(this.projectId, { page });
@@ -72,6 +128,48 @@ export default {
this.projectSecureFiles = response.data;
this.loading = false;
+ this.uploading = false;
+ },
+ async uploadSecureFile() {
+ this.error = null;
+ this.uploading = true;
+ const [file] = this.$refs.fileUpload.files;
+ try {
+ await Api.uploadProjectSecureFile(this.projectId, this.uploadFormData(file));
+ this.getProjectSecureFiles();
+ } catch (error) {
+ this.error = true;
+ this.errorMessage = this.formattedErrorMessage(error);
+ this.uploading = false;
+ }
+ },
+ formattedErrorMessage(error) {
+ let message = '';
+ if (error?.response?.data?.message?.name) {
+ message = this.$options.i18n.uploadErrorMessages.duplicate;
+ } else if (error.response.status === httpStatusCodes.PAYLOAD_TOO_LARGE) {
+ message = sprintf(this.$options.i18n.uploadErrorMessages.tooLarge, {
+ limit: this.fileSizeLimit,
+ });
+ } else {
+ Sentry.captureException(error);
+ message = error;
+ }
+ return message;
+ },
+ loadFileSelctor() {
+ this.$refs.fileUpload.click();
+ },
+ setDeleteModalData(secureFile) {
+ this.deleteModalFileId = secureFile.id;
+ this.deleteModalFileName = secureFile.name;
+ },
+ uploadFormData(file) {
+ const formData = new FormData();
+ formData.append('name', file.name);
+ formData.append('file', file);
+
+ return formData;
},
},
};
@@ -79,16 +177,51 @@ export default {
<template>
<div>
- <h1 data-testid="title" class="gl-font-size-h1 gl-mt-3 gl-mb-0">{{ $options.i18n.title }}</h1>
+ <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="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="info" @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"
+ />
+ </div>
+ </div>
+ </div>
- <p>
- <span data-testid="info-message" class="gl-mr-2">
- {{ $options.i18n.overviewMessage }}
- <gl-link :href="$options.docsLink" target="_blank">{{
- $options.i18n.moreInformation
- }}</gl-link>
- </span>
- </p>
+ <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>
+ </span>
+ </div>
+ </div>
<gl-table
:busy="loading"
@@ -112,14 +245,23 @@ export default {
{{ item.name }}
</template>
- <template #cell(permissions)="{ item }">
- {{ item.permissions }}
- </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"
@@ -129,5 +271,25 @@ export default {
:prev-text="$options.i18n.pagination.prev"
align="center"
/>
+
+ <gl-modal
+ :ref="$options.deleteModalId"
+ :modal-id="$options.deleteModalId"
+ title-tag="h4"
+ category="primary"
+ :ok-title="$options.i18n.deleteModalButton"
+ ok-variant="danger"
+ @ok="deleteSecureFile(deleteModalFileId)"
+ >
+ <template #modal-title>
+ <gl-sprintf :message="$options.i18n.deleteModalTitle">
+ <template #name>{{ deleteModalFileName }}</template>
+ </gl-sprintf>
+ </template>
+
+ <gl-sprintf :message="$options.i18n.deleteModalMessage">
+ <template #name>{{ deleteModalFileName }}</template>
+ </gl-sprintf>
+ </gl-modal>
</div>
</template>
diff --git a/app/assets/javascripts/ci_secure_files/index.js b/app/assets/javascripts/ci_secure_files/index.js
index 18b4ac6866e..3944286dc60 100644
--- a/app/assets/javascripts/ci_secure_files/index.js
+++ b/app/assets/javascripts/ci_secure_files/index.js
@@ -1,14 +1,19 @@
import Vue from 'vue';
+import { parseBoolean } from '~/lib/utils/common_utils';
import SecureFilesList from './components/secure_files_list.vue';
export const initCiSecureFiles = (selector = '#js-ci-secure-files') => {
const containerEl = document.querySelector(selector);
const { projectId } = containerEl.dataset;
+ const { admin } = containerEl.dataset;
+ const { fileSizeLimit } = containerEl.dataset;
return new Vue({
el: containerEl,
provide: {
projectId,
+ admin: parseBoolean(admin),
+ fileSizeLimit,
},
render(createElement) {
return createElement(SecureFilesList);
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
index be2366108b3..3af89dc4a2c 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue
@@ -26,6 +26,7 @@ import {
AWS_TIP_DISMISSED_COOKIE_NAME,
AWS_TIP_MESSAGE,
CONTAINS_VARIABLE_REFERENCE_MESSAGE,
+ ENVIRONMENT_SCOPE_LINK_TITLE,
EVENT_LABEL,
EVENT_ACTION,
} from '../constants';
@@ -40,6 +41,7 @@ export default {
tokenList: awsTokenList,
awsTipMessage: AWS_TIP_MESSAGE,
containsVariableReferenceMessage: CONTAINS_VARIABLE_REFERENCE_MESSAGE,
+ environmentScopeLinkTitle: ENVIRONMENT_SCOPE_LINK_TITLE,
components: {
CiEnvironmentsDropdown,
GlAlert,
@@ -81,6 +83,7 @@ export default {
'containsVariableReferenceLink',
'protectedEnvironmentVariablesLink',
'maskedEnvironmentVariablesLink',
+ 'environmentScopeLink',
]),
...mapComputed(
[
@@ -109,7 +112,7 @@ export default {
return regex.test(this.variable.secret_value);
},
containsVariableReference() {
- const regex = RegExp(/\$/);
+ const regex = /\$/;
return regex.test(this.variable.secret_value);
},
displayMaskedError() {
@@ -278,12 +281,18 @@ export default {
<gl-form-select id="ci-variable-type" v-model="variable_type" :options="typeOptions" />
</gl-form-group>
- <gl-form-group
- :label="__('Environment scope')"
- label-for="ci-variable-env"
- class="w-50"
- data-testid="environment-scope"
- >
+ <gl-form-group label-for="ci-variable-env" class="w-50" data-testid="environment-scope">
+ <template #label>
+ {{ __('Environment scope') }}
+ <gl-link
+ :title="$options.environmentScopeLinkTitle"
+ :href="environmentScopeLink"
+ target="_blank"
+ data-testid="environment-scope-link"
+ >
+ <gl-icon name="question" :size="12" />
+ </gl-link>
+ </template>
<ci-environments-dropdown
v-if="scopedVariablesAvailable"
class="w-100"
diff --git a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue b/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
index 61636b389da..f078234829a 100644
--- a/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
+++ b/app/assets/javascripts/ci_variable_list/components/ci_variable_table.vue
@@ -179,10 +179,7 @@ export default {
</p>
</template>
</gl-table>
- <div
- class="ci-variable-actions gl-display-flex"
- :class="{ 'gl-justify-content-center': isTableEmpty }"
- >
+ <div class="ci-variable-actions gl-display-flex gl-mt-5">
<gl-button
v-gl-modal-directive="$options.modalId"
class="gl-mr-3"
diff --git a/app/assets/javascripts/ci_variable_list/constants.js b/app/assets/javascripts/ci_variable_list/constants.js
index 663a912883b..fa55b4d9e77 100644
--- a/app/assets/javascripts/ci_variable_list/constants.js
+++ b/app/assets/javascripts/ci_variable_list/constants.js
@@ -31,3 +31,5 @@ export const AWS_TOKEN_CONSTANTS = [AWS_ACCESS_KEY_ID, AWS_DEFAULT_REGION, AWS_S
export const CONTAINS_VARIABLE_REFERENCE_MESSAGE = __(
'Values that contain the %{codeStart}$%{codeEnd} character can be considered a variable reference and expanded. %{docsLinkStart}Learn more.%{docsLinkEnd}',
);
+
+export const ENVIRONMENT_SCOPE_LINK_TITLE = __('Learn more');
diff --git a/app/assets/javascripts/ci_variable_list/index.js b/app/assets/javascripts/ci_variable_list/index.js
index 7c40f8134d4..f771751194c 100644
--- a/app/assets/javascripts/ci_variable_list/index.js
+++ b/app/assets/javascripts/ci_variable_list/index.js
@@ -17,6 +17,7 @@ const mountCiVariableListApp = (containerEl) => {
containsVariableReferenceLink,
protectedEnvironmentVariablesLink,
maskedEnvironmentVariablesLink,
+ environmentScopeLink,
} = containerEl.dataset;
const isGroup = parseBoolean(group);
const isProtectedByDefault = parseBoolean(protectedByDefault);
@@ -34,6 +35,7 @@ const mountCiVariableListApp = (containerEl) => {
containsVariableReferenceLink,
protectedEnvironmentVariablesLink,
maskedEnvironmentVariablesLink,
+ environmentScopeLink,
});
return new Vue({
diff --git a/app/assets/javascripts/clone_panel.js b/app/assets/javascripts/clone_panel.js
index ec831a77bde..79280c13f0f 100644
--- a/app/assets/javascripts/clone_panel.js
+++ b/app/assets/javascripts/clone_panel.js
@@ -17,7 +17,12 @@ export default function initClonePanel() {
$('a', $cloneOptions).on('click', (e) => {
const $this = $(e.currentTarget);
const url = $this.attr('href');
- if (url && (url.startsWith('vscode://') || url.startsWith('xcode://'))) {
+ if (
+ url &&
+ (url.startsWith('vscode://') ||
+ url.startsWith('xcode://') ||
+ url.startsWith('jetbrains://'))
+ ) {
// Clone with "..." should open like a normal link
return;
}
diff --git a/app/assets/javascripts/clusters/agents/components/activity_events_list.vue b/app/assets/javascripts/clusters/agents/components/activity_events_list.vue
index 6567ce203bc..18c6503bfb2 100644
--- a/app/assets/javascripts/clusters/agents/components/activity_events_list.vue
+++ b/app/assets/javascripts/clusters/agents/components/activity_events_list.vue
@@ -28,17 +28,17 @@ export default {
},
i18n: {
emptyText: s__(
- 'ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected.',
+ 'ClusterAgents|See agent activity updates, like tokens created or revoked and clusters connected or not connected.',
),
- emptyTooltip: s__('ClusterAgents|What is GitLab Agent activity?'),
+ emptyTooltip: s__('ClusterAgents|What is agent activity?'),
error: s__(
- 'ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again.',
+ 'ClusterAgents|An error occurred while retrieving agent activity. Reload the page to try again.',
),
today: __('Today'),
yesterday: __('Yesterday'),
},
- emptyHelpLink: helpPagePath('user/clusters/agent/install/index', {
- anchor: 'view-agent-activity',
+ emptyHelpLink: helpPagePath('user/clusters/agent/work_with_agent', {
+ anchor: 'view-an-agents-activity-information',
}),
borderClasses: 'gl-border-b-1 gl-border-b-solid gl-border-b-gray-100',
apollo: {
@@ -68,8 +68,8 @@ export default {
},
emptyStateTitle() {
return n__(
- "ClusterAgents|There's no activity from the past day",
- "ClusterAgents|There's no activity from the past %d days",
+ 'ClusterAgents|No activity occurred in the past day',
+ 'ClusterAgents|No activity occurred in the past %d days',
EVENTS_STORED_DAYS,
);
},
@@ -124,7 +124,7 @@ export default {
<template>
<div>
- <gl-loading-icon v-if="isLoading" size="md" />
+ <gl-loading-icon v-if="isLoading" size="lg" />
<div v-else-if="hasEvents">
<div
diff --git a/app/assets/javascripts/clusters/agents/components/revoke_token_button.vue b/app/assets/javascripts/clusters/agents/components/revoke_token_button.vue
new file mode 100644
index 00000000000..7d36cbb170d
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/components/revoke_token_button.vue
@@ -0,0 +1,201 @@
+<script>
+import {
+ GlButton,
+ GlModalDirective,
+ GlTooltip,
+ GlModal,
+ GlFormGroup,
+ GlFormInput,
+ GlSprintf,
+} from '@gitlab/ui';
+import { s__, __, sprintf } from '~/locale';
+import { REVOKE_TOKEN_MODAL_ID, TOKEN_STATUS_ACTIVE } from '../constants';
+import revokeAgentToken from '../graphql/mutations/revoke_token.mutation.graphql';
+import getClusterAgentQuery from '../graphql/queries/get_cluster_agent.query.graphql';
+import { removeTokenFromStore } from '../graphql/cache_update';
+
+export default {
+ components: {
+ GlButton,
+ GlTooltip,
+ GlModal,
+ GlFormGroup,
+ GlFormInput,
+ GlSprintf,
+ },
+ directives: {
+ GlModalDirective,
+ },
+ inject: ['agentName', 'projectPath', 'canAdminCluster'],
+ props: {
+ token: {
+ required: true,
+ type: Object,
+ validator: (value) => ['id', 'name'].every((prop) => value[prop]),
+ },
+ cursor: {
+ required: true,
+ type: Object,
+ },
+ },
+ i18n: {
+ revokeButton: s__('ClusterAgents|Revoke token'),
+ dropdownDisabledHint: s__(
+ 'ClusterAgents|Requires a Maintainer or greater role to perform this action',
+ ),
+ modalTitle: s__('ClusterAgents|Revoke access token?'),
+ modalBody: s__(
+ 'ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action.',
+ ),
+ modalInputLabel: s__('ClusterAgents|To revoke the token, type %{name} to confirm:'),
+ modalCancel: __('Cancel'),
+ successMessage: s__('ClusterAgents|%{name} successfully revoked'),
+ defaultError: __('An error occurred. Please try again.'),
+ },
+ data() {
+ return {
+ loading: false,
+ error: null,
+ revokeConfirmText: null,
+ tokenName: null,
+ variables: {
+ agentName: this.agentName,
+ projectPath: this.projectPath,
+ tokenStatus: TOKEN_STATUS_ACTIVE,
+ ...this.cursor,
+ },
+ };
+ },
+ computed: {
+ revokeBtnDisabled() {
+ return this.loading || !this.canAdminCluster;
+ },
+ modalId() {
+ return sprintf(REVOKE_TOKEN_MODAL_ID, {
+ tokenName: this.token.name,
+ });
+ },
+ primaryModalProps() {
+ return {
+ text: this.$options.i18n.revokeButton,
+ attributes: [
+ { disabled: this.loading || this.disableModalSubmit, loading: this.loading },
+ { variant: 'danger' },
+ ],
+ };
+ },
+ cancelModalProps() {
+ return {
+ text: this.$options.i18n.modalCancel,
+ attributes: [],
+ };
+ },
+ disableModalSubmit() {
+ return this.revokeConfirmText !== this.token.name;
+ },
+ },
+ methods: {
+ async revokeToken() {
+ if (this.disableModalSubmit || this.loading) {
+ return;
+ }
+
+ this.loading = true;
+ this.error = null;
+ this.tokenName = this.token.name;
+
+ try {
+ const { errors } = await this.revokeTokenMutation();
+
+ if (errors.length) {
+ throw new Error(errors[0]);
+ }
+ } catch (error) {
+ this.error = error?.message || this.$options.i18n.defaultError;
+ } finally {
+ this.loading = false;
+ const successMessage = sprintf(this.$options.i18n.successMessage, {
+ name: this.tokenName,
+ });
+
+ this.$toast.show(this.error || successMessage);
+
+ this.hideModal();
+ }
+ },
+ revokeTokenMutation() {
+ return this.$apollo
+ .mutate({
+ mutation: revokeAgentToken,
+ variables: {
+ input: {
+ id: this.token.id,
+ },
+ },
+ update: (store) => {
+ removeTokenFromStore(store, this.token, getClusterAgentQuery, this.variables);
+ },
+ })
+
+ .then(({ data: { clusterAgentTokenRevoke } }) => {
+ return clusterAgentTokenRevoke;
+ });
+ },
+ resetModal() {
+ this.loading = false;
+ this.error = null;
+ this.revokeConfirmText = null;
+ },
+ hideModal() {
+ this.resetModal();
+ this.$refs.modal.hide();
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div ref="revokeToken" class="gl-display-inline-block">
+ <gl-button
+ v-gl-modal-directive="modalId"
+ icon="remove"
+ category="secondary"
+ variant="danger"
+ :disabled="revokeBtnDisabled"
+ :title="$options.i18n.revokeButton"
+ :aria-label="$options.i18n.revokeButton"
+ />
+
+ <gl-tooltip
+ v-if="!canAdminCluster"
+ :target="() => $refs.revokeToken"
+ :title="$options.i18n.dropdownDisabledHint"
+ />
+ </div>
+
+ <gl-modal
+ ref="modal"
+ :modal-id="modalId"
+ :title="$options.i18n.modalTitle"
+ :action-primary="primaryModalProps"
+ :action-cancel="cancelModalProps"
+ size="sm"
+ @primary="revokeToken"
+ @hide="hideModal"
+ >
+ <p>{{ $options.i18n.modalBody }}</p>
+
+ <gl-form-group>
+ <template #label>
+ <gl-sprintf :message="$options.i18n.modalInputLabel">
+ <template #name>
+ <code>{{ token.name }}</code>
+ </template>
+ </gl-sprintf>
+ </template>
+ <gl-form-input v-model="revokeConfirmText" @keydown.enter="revokeToken" />
+ </gl-form-group>
+ </gl-modal>
+ </div>
+</template>
diff --git a/app/assets/javascripts/clusters/agents/components/show.vue b/app/assets/javascripts/clusters/agents/components/show.vue
index 5df3e0811a5..e3de8339325 100644
--- a/app/assets/javascripts/clusters/agents/components/show.vue
+++ b/app/assets/javascripts/clusters/agents/components/show.vue
@@ -140,7 +140,7 @@ export default {
</span>
</template>
- <gl-loading-icon v-if="isLoading" size="md" class="gl-m-3" />
+ <gl-loading-icon v-if="isLoading" size="lg" class="gl-m-3" />
<div v-else>
<token-table :tokens="tokens" :cluster-agent-id="clusterAgent.id" :cursor="cursor" />
diff --git a/app/assets/javascripts/clusters/agents/components/token_table.vue b/app/assets/javascripts/clusters/agents/components/token_table.vue
index fbb39c28d78..9e64c9da712 100644
--- a/app/assets/javascripts/clusters/agents/components/token_table.vue
+++ b/app/assets/javascripts/clusters/agents/components/token_table.vue
@@ -3,6 +3,7 @@ import { GlEmptyState, GlTable, GlTooltip, GlTruncate } from '@gitlab/ui';
import { s__ } from '~/locale';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import CreateTokenButton from './create_token_button.vue';
+import RevokeTokenButton from './revoke_token_button.vue';
export default {
components: {
@@ -12,6 +13,7 @@ export default {
GlTruncate,
TimeAgoTooltip,
CreateTokenButton,
+ RevokeTokenButton,
},
i18n: {
createdBy: s__('ClusterAgents|Created by'),
@@ -66,6 +68,11 @@ export default {
label: this.$options.i18n.description,
tdAttr: { 'data-testid': 'agent-token-description' },
},
+ {
+ key: 'actions',
+ label: '',
+ tdAttr: { 'data-testid': 'agent-token-revoke' },
+ },
];
},
},
@@ -119,6 +126,10 @@ export default {
</gl-tooltip>
</div>
</template>
+
+ <template #cell(actions)="{ item }">
+ <revoke-token-button :token="item" :cluster-agent-id="clusterAgentId" :cursor="cursor" />
+ </template>
</gl-table>
</div>
diff --git a/app/assets/javascripts/clusters/agents/constants.js b/app/assets/javascripts/clusters/agents/constants.js
index 50d8f5e9e40..962fa243903 100644
--- a/app/assets/javascripts/clusters/agents/constants.js
+++ b/app/assets/javascripts/clusters/agents/constants.js
@@ -44,3 +44,5 @@ export const EVENT_ACTIONS_OPEN = 'open_modal';
export const EVENT_ACTIONS_CLICK = 'click_button';
export const TOKEN_NAME_LIMIT = 255;
+
+export const REVOKE_TOKEN_MODAL_ID = 'revoke-token-%{tokenName}';
diff --git a/app/assets/javascripts/clusters/agents/graphql/cache_update.js b/app/assets/javascripts/clusters/agents/graphql/cache_update.js
index 0219c4150eb..8db79c82708 100644
--- a/app/assets/javascripts/clusters/agents/graphql/cache_update.js
+++ b/app/assets/javascripts/clusters/agents/graphql/cache_update.js
@@ -22,3 +22,25 @@ export function addAgentTokenToStore(store, clusterAgentTokenCreate, query, vari
});
}
}
+
+export function removeTokenFromStore(store, revokeToken, query, variables) {
+ if (!hasErrors(revokeToken)) {
+ const sourceData = store.readQuery({
+ query,
+ variables,
+ });
+
+ const data = produce(sourceData, (draftData) => {
+ draftData.project.clusterAgent.tokens.nodes = draftData.project.clusterAgent.tokens.nodes.filter(
+ ({ id }) => id !== revokeToken.id,
+ );
+ draftData.project.clusterAgent.tokens.count -= 1;
+ });
+
+ store.writeQuery({
+ query,
+ variables,
+ data,
+ });
+ }
+}
diff --git a/app/assets/javascripts/clusters/agents/graphql/mutations/revoke_token.mutation.graphql b/app/assets/javascripts/clusters/agents/graphql/mutations/revoke_token.mutation.graphql
new file mode 100644
index 00000000000..6f1c6a66690
--- /dev/null
+++ b/app/assets/javascripts/clusters/agents/graphql/mutations/revoke_token.mutation.graphql
@@ -0,0 +1,5 @@
+mutation revokeAgentToken($input: ClusterAgentTokenRevokeInput!) {
+ clusterAgentTokenRevoke(input: $input) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/clusters/components/new_cluster.vue b/app/assets/javascripts/clusters/components/new_cluster.vue
index 8f3e2916270..41a33a8459f 100644
--- a/app/assets/javascripts/clusters/components/new_cluster.vue
+++ b/app/assets/javascripts/clusters/components/new_cluster.vue
@@ -1,6 +1,6 @@
<script>
import { GlLink, GlSprintf } from '@gitlab/ui';
-import { mapState } from 'vuex';
+import { helpPagePath } from '~/helpers/help_page_helper';
import { s__ } from '~/locale';
export default {
@@ -10,13 +10,11 @@ export default {
'ClusterIntegration|Enter details about your cluster. %{linkStart}How do I use a certificate to connect to my cluster?%{linkEnd}',
),
},
+ clusterConnectHelpPath: helpPagePath('user/project/clusters/add_existing_cluster'),
components: {
GlLink,
GlSprintf,
},
- computed: {
- ...mapState(['clusterConnectHelpPath']),
- },
};
</script>
@@ -26,7 +24,7 @@ export default {
<p>
<gl-sprintf :message="$options.i18n.information">
<template #link="{ content }">
- <gl-link :href="clusterConnectHelpPath" target="_blank">{{ content }}</gl-link>
+ <gl-link :href="$options.clusterConnectHelpPath">{{ content }}</gl-link>
</template>
</gl-sprintf>
</p>
diff --git a/app/assets/javascripts/clusters/components/remove_cluster_confirmation.vue b/app/assets/javascripts/clusters/components/remove_cluster_confirmation.vue
index 98db620e3ab..dca89133931 100644
--- a/app/assets/javascripts/clusters/components/remove_cluster_confirmation.vue
+++ b/app/assets/javascripts/clusters/components/remove_cluster_confirmation.vue
@@ -159,7 +159,7 @@ export default {
)
}}</span>
<template #modal-footer>
- <gl-button variant="secondary" @click="handleCancel">{{ __('Cancel') }}</gl-button>
+ <gl-button @click="handleCancel">{{ __('Cancel') }}</gl-button>
<template v-if="confirmCleanup">
<gl-button
:disabled="!canSubmit"
diff --git a/app/assets/javascripts/clusters/forms/components/integration_form.vue b/app/assets/javascripts/clusters/forms/components/integration_form.vue
index 3f61a1b18a7..b2a8381f937 100644
--- a/app/assets/javascripts/clusters/forms/components/integration_form.vue
+++ b/app/assets/javascripts/clusters/forms/components/integration_form.vue
@@ -140,7 +140,7 @@ export default {
<div v-if="editable" class="form group gl-display-flex gl-justify-content-end">
<gl-button
category="primary"
- variant="success"
+ variant="confirm"
type="submit"
:disabled="!canSubmit"
:aria-disabled="!canSubmit"
diff --git a/app/assets/javascripts/create_cluster/gke_cluster_namespace/index.js b/app/assets/javascripts/clusters/gke_cluster_namespace/index.js
index 2b3dfb99328..2b3dfb99328 100644
--- a/app/assets/javascripts/create_cluster/gke_cluster_namespace/index.js
+++ b/app/assets/javascripts/clusters/gke_cluster_namespace/index.js
diff --git a/app/assets/javascripts/clusters/new_cluster.js b/app/assets/javascripts/clusters/new_cluster.js
index 71f585fd307..4df6872bcc1 100644
--- a/app/assets/javascripts/clusters/new_cluster.js
+++ b/app/assets/javascripts/clusters/new_cluster.js
@@ -1,17 +1,15 @@
import Vue from 'vue';
import NewCluster from './components/new_cluster.vue';
-import { createStore } from './stores/new_cluster';
export default () => {
- const entryPoint = document.querySelector('#js-cluster-new');
+ const el = document.querySelector('#js-cluster-new');
- if (!entryPoint) {
+ if (!el) {
return null;
}
return new Vue({
- el: '#js-cluster-new',
- store: createStore(entryPoint.dataset),
+ el,
render(createElement) {
return createElement(NewCluster);
},
diff --git a/app/assets/javascripts/clusters/stores/new_cluster/index.js b/app/assets/javascripts/clusters/stores/new_cluster/index.js
deleted file mode 100644
index 87f1c05fdf9..00000000000
--- a/app/assets/javascripts/clusters/stores/new_cluster/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import state from './state';
-
-Vue.use(Vuex);
-
-export const createStore = (initialState) =>
- new Vuex.Store({
- state: state(initialState),
- });
-
-export default createStore;
diff --git a/app/assets/javascripts/clusters/stores/new_cluster/state.js b/app/assets/javascripts/clusters/stores/new_cluster/state.js
deleted file mode 100644
index 1ca1ac8de18..00000000000
--- a/app/assets/javascripts/clusters/stores/new_cluster/state.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default (initialState = {}) => ({
- clusterConnectHelpPath: initialState.clusterConnectHelpPath,
-});
diff --git a/app/assets/javascripts/clusters_list/components/agent_table.vue b/app/assets/javascripts/clusters_list/components/agent_table.vue
index 2decdb5307b..496baf8cb08 100644
--- a/app/assets/javascripts/clusters_list/components/agent_table.vue
+++ b/app/assets/javascripts/clusters_list/components/agent_table.vue
@@ -39,7 +39,7 @@ export default {
configHelpLink: helpPagePath('user/clusters/agent/install/index', {
anchor: 'create-an-agent-configuration-file',
}),
- inject: ['gitlabVersion'],
+ inject: ['gitlabVersion', 'kasVersion'],
props: {
agents: {
required: true,
@@ -102,6 +102,9 @@ export default {
return { ...agent, versions };
});
},
+ serverVersion() {
+ return this.kasVersion || this.gitlabVersion;
+ },
},
methods: {
getStatusCellId(item) {
@@ -135,12 +138,12 @@ export default {
if (!agent.versions.length) return false;
const [agentMajorVersion, agentMinorVersion] = this.getAgentVersionString(agent).split('.');
- const [gitlabMajorVersion, gitlabMinorVersion] = this.gitlabVersion.split('.');
+ const [serverMajorVersion, serverMinorVersion] = this.serverVersion.split('.');
- const majorVersionMismatch = agentMajorVersion !== gitlabMajorVersion;
+ const majorVersionMismatch = agentMajorVersion !== serverMajorVersion;
// We should warn user if their current GitLab and agent versions are more than 1 minor version apart:
- const minorVersionMismatch = Math.abs(agentMinorVersion - gitlabMinorVersion) > 1;
+ const minorVersionMismatch = Math.abs(agentMinorVersion - serverMinorVersion) > 1;
return majorVersionMismatch || minorVersionMismatch;
},
@@ -165,8 +168,6 @@ export default {
:items="agentsList"
:fields="fields"
stacked="md"
- head-variant="white"
- thead-class="gl-border-b-solid gl-border-b-2 gl-border-b-gray-100"
class="gl-mb-4!"
data-testid="cluster-agent-list-table"
>
@@ -242,7 +243,7 @@ export default {
<p class="gl-mb-0">
<gl-sprintf :message="$options.i18n.versionOutdatedText">
- <template #version>{{ gitlabVersion }}</template>
+ <template #version>{{ serverVersion }}</template>
</gl-sprintf>
<gl-link :href="$options.versionUpdateLink" class="gl-font-sm">
{{ $options.i18n.viewDocsText }}</gl-link
@@ -255,7 +256,7 @@ export default {
<p v-else-if="isVersionOutdated(item)" class="gl-mb-0">
<gl-sprintf :message="$options.i18n.versionOutdatedText">
- <template #version>{{ gitlabVersion }}</template>
+ <template #version>{{ serverVersion }}</template>
</gl-sprintf>
<gl-link :href="$options.versionUpdateLink" class="gl-font-sm">
{{ $options.i18n.viewDocsText }}</gl-link
diff --git a/app/assets/javascripts/clusters_list/components/agents.vue b/app/assets/javascripts/clusters_list/components/agents.vue
index 89b18ed6d06..8a4a81d3e96 100644
--- a/app/assets/javascripts/clusters_list/components/agents.vue
+++ b/app/assets/javascripts/clusters_list/components/agents.vue
@@ -175,7 +175,7 @@ export default {
</script>
<template>
- <gl-loading-icon v-if="isLoading" size="md" />
+ <gl-loading-icon v-if="isLoading" size="lg" />
<section v-else-if="agentList">
<div v-if="agentList.length">
diff --git a/app/assets/javascripts/clusters_list/components/clusters.vue b/app/assets/javascripts/clusters_list/components/clusters.vue
index 59cfdde731d..fb3c8ff66b0 100644
--- a/app/assets/javascripts/clusters_list/components/clusters.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters.vue
@@ -224,7 +224,7 @@ export default {
</script>
<template>
- <gl-loading-icon v-if="loadingClusters" size="md" />
+ <gl-loading-icon v-if="loadingClusters" size="lg" />
<section v-else>
<ancestor-notice />
@@ -235,8 +235,6 @@ export default {
:fields="fields"
fixed
stacked="md"
- head-variant="white"
- thead-class="gl-border-b-solid gl-border-b-2 gl-border-b-gray-100"
class="qa-clusters-table gl-mb-4!"
data-testid="cluster_list_table"
>
diff --git a/app/assets/javascripts/clusters_list/components/clusters_actions.vue b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
index 8fd759bd3e9..2675d46dd16 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_actions.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_actions.vue
@@ -1,5 +1,5 @@
<script>
-import { GlDropdown, GlDropdownItem, GlModalDirective, GlTooltip } from '@gitlab/ui';
+import { GlButton, GlDropdown, GlDropdownItem, GlModalDirective, GlTooltip } from '@gitlab/ui';
import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '../constants';
@@ -7,6 +7,7 @@ export default {
i18n: CLUSTERS_ACTIONS,
INSTALL_AGENT_MODAL_ID,
components: {
+ GlButton,
GlDropdown,
GlDropdownItem,
GlTooltip,
@@ -15,7 +16,6 @@ export default {
GlModalDirective,
},
inject: [
- 'newClusterPath',
'addClusterPath',
'newClusterDocsPath',
'canAddCluster',
@@ -42,20 +42,59 @@ export default {
}
return this.addClusterPath;
},
+ actionItems() {
+ const createCluster = {
+ href: this.newClusterDocsPath,
+ title: this.$options.i18n.createCluster,
+ testid: 'create-cluster-link',
+ };
+ const connectCluster = {
+ href: this.addClusterPath,
+ title: this.$options.i18n.connectClusterCertificate,
+ testid: 'connect-cluster-link',
+ };
+ const actions = [];
+
+ if (this.displayClusterAgents) {
+ actions.push(createCluster);
+ }
+ if (this.displayClusterAgents && this.certificateBasedClustersEnabled) {
+ actions.push(connectCluster);
+ }
+
+ return actions;
+ },
+ },
+ methods: {
+ getTooltipTarget() {
+ return this.actionItems.length ? this.$refs.actions.$el : this.$refs.actionsContainer;
+ },
},
};
</script>
<template>
- <div class="nav-controls gl-ml-auto">
+ <div ref="actionsContainer" class="nav-controls gl-ml-auto">
<gl-tooltip
v-if="!canAddCluster"
- :target="() => $refs.dropdown.$el"
- :title="$options.i18n.dropdownDisabledHint"
+ :target="() => getTooltipTarget()"
+ :title="$options.i18n.actionsDisabledHint"
/>
+ <gl-button
+ v-if="!actionItems.length"
+ data-qa-selector="clusters_actions_button"
+ category="primary"
+ variant="confirm"
+ :disabled="!canAddCluster"
+ :href="defaultActionUrl"
+ >
+ {{ defaultActionText }}
+ </gl-button>
+
<gl-dropdown
- ref="dropdown"
+ v-else
+ ref="actions"
v-gl-modal-directive="shouldTriggerModal && $options.INSTALL_AGENT_MODAL_ID"
data-qa-selector="clusters_actions_button"
category="primary"
@@ -67,31 +106,13 @@ export default {
right
>
<gl-dropdown-item
- v-if="displayClusterAgents"
- :href="newClusterDocsPath"
- data-testid="create-cluster-link"
- @click.stop
- >
- {{ $options.i18n.createCluster }}
- </gl-dropdown-item>
-
- <template v-if="displayClusterAgents && certificateBasedClustersEnabled">
- <gl-dropdown-item :href="newClusterPath" data-testid="new-cluster-link" @click.stop>
- {{ $options.i18n.createClusterCertificate }}
- </gl-dropdown-item>
-
- <gl-dropdown-item :href="addClusterPath" data-testid="connect-cluster-link" @click.stop>
- {{ $options.i18n.connectClusterCertificate }}
- </gl-dropdown-item>
- </template>
-
- <gl-dropdown-item
- v-if="certificateBasedClustersEnabled && !displayClusterAgents"
- :href="newClusterPath"
- data-testid="new-cluster-link"
+ v-for="action in actionItems"
+ :key="action.title"
+ :href="action.href"
+ :data-testid="action.testid"
@click.stop
>
- {{ $options.i18n.createClusterDeprecated }}
+ {{ action.title }}
</gl-dropdown-item>
</gl-dropdown>
</div>
diff --git a/app/assets/javascripts/clusters_list/components/clusters_view_all.vue b/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
index 73ca804e111..d831d79b994 100644
--- a/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
+++ b/app/assets/javascripts/clusters_list/components/clusters_view_all.vue
@@ -89,7 +89,7 @@ export default {
</script>
<template>
<div>
- <gl-loading-icon v-if="isLoading" size="md" />
+ <gl-loading-icon v-if="isLoading" size="lg" />
<div v-show="!isLoading" data-testid="clusters-cards-container">
<gl-card
header-class="gl-bg-white gl-display-flex gl-align-items-center gl-justify-content-space-between gl-py-4"
diff --git a/app/assets/javascripts/clusters_list/constants.js b/app/assets/javascripts/clusters_list/constants.js
index 4a168e811aa..10e71513065 100644
--- a/app/assets/javascripts/clusters_list/constants.js
+++ b/app/assets/javascripts/clusters_list/constants.js
@@ -234,11 +234,9 @@ export const CLUSTERS_ACTIONS = {
connectCluster: s__('ClusterAgents|Connect a cluster'),
connectWithAgent: s__('ClusterAgents|Connect a cluster (agent)'),
connectClusterDeprecated: s__('ClusterAgents|Connect a cluster (deprecated)'),
- createClusterDeprecated: s__('ClusterAgents|Create a cluster (deprecated)'),
createCluster: s__('ClusterAgents|Create a cluster'),
- createClusterCertificate: s__('ClusterAgents|Create a cluster (certificate - deprecated)'),
connectClusterCertificate: s__('ClusterAgents|Connect a cluster (certificate - deprecated)'),
- dropdownDisabledHint: s__(
+ actionsDisabledHint: s__(
'ClusterAgents|Requires a Maintainer or greater role to perform these actions',
),
};
diff --git a/app/assets/javascripts/clusters_list/index.js b/app/assets/javascripts/clusters_list/index.js
index f6dfb96ffd9..cd334d80e9c 100644
--- a/app/assets/javascripts/clusters_list/index.js
+++ b/app/assets/javascripts/clusters_list/index.js
@@ -23,7 +23,6 @@ export default () => {
defaultBranchName,
projectPath,
kasAddress,
- newClusterPath,
addClusterPath,
newClusterDocsPath,
emptyStateHelpText,
@@ -31,6 +30,7 @@ export default () => {
canAddCluster,
canAdminCluster,
gitlabVersion,
+ kasVersion,
displayClusterAgents,
certificateBasedClustersEnabled,
} = el.dataset;
@@ -42,7 +42,6 @@ export default () => {
emptyStateImage,
projectPath,
kasAddress,
- newClusterPath,
addClusterPath,
newClusterDocsPath,
emptyStateHelpText,
@@ -50,6 +49,7 @@ export default () => {
canAddCluster: parseBoolean(canAddCluster),
canAdminCluster: parseBoolean(canAdminCluster),
gitlabVersion,
+ kasVersion,
displayClusterAgents: parseBoolean(displayClusterAgents),
certificateBasedClustersEnabled: parseBoolean(certificateBasedClustersEnabled),
},
diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.vue b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
index b92f3d5a97b..29530ddb7a2 100644
--- a/app/assets/javascripts/commit/pipelines/pipelines_table.vue
+++ b/app/assets/javascripts/commit/pipelines/pipelines_table.vue
@@ -212,7 +212,6 @@ export default {
<template #table-header-actions>
<div v-if="canRenderPipelineButton" class="gl-text-right">
<gl-button
- variant="confirm"
data-testid="run_pipeline_button"
:loading="state.isRunningMergeRequestPipeline"
@click="tryRunPipeline"
diff --git a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
index 32d9159ee34..af049738016 100644
--- a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
+++ b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue
@@ -58,6 +58,7 @@ export default {
}
} else if (this.createBtn) {
this.createBtn.setAttribute('disabled', 'disabled');
+ this.createBtn.classList.add('disabled');
}
},
normalizeProjectData(data) {
@@ -89,11 +90,6 @@ export default {
if (this.warningText) {
this.warningText.classList.remove('gl-display-none');
}
-
- if (this.createBtn) {
- this.createBtn.classList.add('btn-warning');
- this.createBtn.classList.remove('btn-success');
- }
},
},
i18n: {
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/code_block.vue b/app/assets/javascripts/content_editor/components/bubble_menus/code_block.vue
new file mode 100644
index 00000000000..518ddd7a09c
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/code_block.vue
@@ -0,0 +1,160 @@
+<script>
+import {
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import { getParentByTagName } from '~/lib/utils/dom_utils';
+import codeBlockLanguageLoader from '../../services/code_block_language_loader';
+import CodeBlockHighlight from '../../extensions/code_block_highlight';
+import Diagram from '../../extensions/diagram';
+import Frontmatter from '../../extensions/frontmatter';
+import EditorStateObserver from '../editor_state_observer.vue';
+
+const CODE_BLOCK_NODE_TYPES = [CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
+
+export default {
+ components: {
+ BubbleMenu,
+ GlButton,
+ GlButtonGroup,
+ GlDropdown,
+ GlDropdownItem,
+ GlSearchBoxByType,
+ EditorStateObserver,
+ },
+ directives: {
+ GlTooltip,
+ },
+ inject: ['tiptapEditor'],
+ data() {
+ return {
+ codeBlockType: undefined,
+ selectedLanguage: {},
+ filterTerm: '',
+ filteredLanguages: [],
+ };
+ },
+ watch: {
+ filterTerm: {
+ handler(val) {
+ this.filteredLanguages = codeBlockLanguageLoader.filterLanguages(val);
+ },
+ immediate: true,
+ },
+ },
+ methods: {
+ shouldShow: ({ editor }) => {
+ return CODE_BLOCK_NODE_TYPES.some((type) => editor.isActive(type));
+ },
+
+ updateSelectedLanguage() {
+ this.codeBlockType = CODE_BLOCK_NODE_TYPES.find((type) => this.tiptapEditor.isActive(type));
+
+ if (this.codeBlockType) {
+ const { language } = this.tiptapEditor.getAttributes(this.codeBlockType);
+ this.selectedLanguage = codeBlockLanguageLoader.findLanguageBySyntax(language);
+ }
+ },
+
+ copyCodeBlockText() {
+ const { view } = this.tiptapEditor;
+ const { from } = this.tiptapEditor.state.selection;
+ const node = getParentByTagName(view.domAtPos(from).node, 'pre');
+
+ navigator.clipboard.writeText(node?.textContent || '');
+ },
+
+ async applySelectedLanguage(language) {
+ this.selectedLanguage = language;
+
+ await codeBlockLanguageLoader.loadLanguage(language.syntax);
+
+ this.tiptapEditor.commands.setCodeBlock({ language: this.selectedLanguage.syntax });
+ },
+
+ getReferenceClientRect() {
+ const { view } = this.tiptapEditor;
+ const { from } = this.tiptapEditor.state.selection;
+ const node = getParentByTagName(view.domAtPos(from).node, 'pre');
+ return node?.getBoundingClientRect() || new DOMRect(-1000, -1000, 0, 0);
+ },
+
+ deleteCodeBlock() {
+ this.tiptapEditor.chain().focus().deleteNode(this.codeBlockType).run();
+ },
+ },
+};
+</script>
+<template>
+ <bubble-menu
+ data-testid="code-block-bubble-menu"
+ class="gl-shadow gl-rounded-base gl-bg-white"
+ :editor="tiptapEditor"
+ plugin-key="bubbleMenuCodeBlock"
+ :should-show="shouldShow"
+ :tippy-options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ getReferenceClientRect,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ >
+ <editor-state-observer @transaction="updateSelectedLanguage">
+ <gl-button-group>
+ <gl-dropdown
+ category="tertiary"
+ contenteditable="false"
+ boundary="viewport"
+ :text="selectedLanguage.label"
+ >
+ <template #header>
+ <gl-search-box-by-type
+ v-model="filterTerm"
+ :clear-button-title="__('Clear')"
+ :placeholder="__('Search')"
+ />
+ </template>
+
+ <template #highlighted-items>
+ <gl-dropdown-item :key="selectedLanguage.syntax" is-check-item :is-checked="true">
+ {{ selectedLanguage.label }}
+ </gl-dropdown-item>
+ </template>
+
+ <gl-dropdown-item
+ v-for="language in filteredLanguages"
+ v-show="selectedLanguage.syntax !== language.syntax"
+ :key="language.syntax"
+ @click="applySelectedLanguage(language)"
+ >
+ {{ language.label }}
+ </gl-dropdown-item>
+ </gl-dropdown>
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="copy-code-block"
+ :aria-label="__('Copy code')"
+ :title="__('Copy code')"
+ icon="copy-to-clipboard"
+ @click="copyCodeBlockText"
+ />
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="delete-code-block"
+ :aria-label="__('Delete code block')"
+ :title="__('Delete code block')"
+ icon="remove"
+ @click="deleteCodeBlock"
+ />
+ </gl-button-group>
+ </editor-state-observer>
+ </bubble-menu>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue b/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue
new file mode 100644
index 00000000000..e35fbf14de5
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/formatting.vue
@@ -0,0 +1,108 @@
+<script>
+import { GlButtonGroup } from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import { BUBBLE_MENU_TRACKING_ACTION } from '../../constants';
+import trackUIControl from '../../services/track_ui_control';
+import Image from '../../extensions/image';
+import Audio from '../../extensions/audio';
+import Video from '../../extensions/video';
+import Code from '../../extensions/code';
+import CodeBlockHighlight from '../../extensions/code_block_highlight';
+import Diagram from '../../extensions/diagram';
+import Frontmatter from '../../extensions/frontmatter';
+import ToolbarButton from '../toolbar_button.vue';
+
+export default {
+ components: {
+ BubbleMenu,
+ GlButtonGroup,
+ ToolbarButton,
+ },
+ inject: ['tiptapEditor'],
+ methods: {
+ trackToolbarControlExecution({ contentType, value }) {
+ trackUIControl({ action: BUBBLE_MENU_TRACKING_ACTION, property: contentType, value });
+ },
+
+ shouldShow: ({ editor, from, to }) => {
+ if (from === to) return false;
+
+ const exclude = [
+ Code.name,
+ CodeBlockHighlight.name,
+ Diagram.name,
+ Frontmatter.name,
+ Image.name,
+ Audio.name,
+ Video.name,
+ ];
+
+ return !exclude.some((type) => editor.isActive(type));
+ },
+ },
+};
+</script>
+<template>
+ <bubble-menu
+ data-testid="formatting-bubble-menu"
+ class="gl-shadow gl-rounded-base gl-bg-white"
+ :editor="tiptapEditor"
+ :should-show="shouldShow"
+ >
+ <gl-button-group>
+ <toolbar-button
+ data-testid="bold"
+ content-type="bold"
+ icon-name="bold"
+ editor-command="toggleBold"
+ category="tertiary"
+ size="medium"
+ :label="__('Bold text')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="italic"
+ content-type="italic"
+ icon-name="italic"
+ editor-command="toggleItalic"
+ category="tertiary"
+ size="medium"
+ :label="__('Italic text')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="strike"
+ content-type="strike"
+ icon-name="strikethrough"
+ editor-command="toggleStrike"
+ category="tertiary"
+ size="medium"
+ :label="__('Strikethrough')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="code"
+ content-type="code"
+ icon-name="code"
+ editor-command="toggleCode"
+ category="tertiary"
+ size="medium"
+ :label="__('Code')"
+ @execute="trackToolbarControlExecution"
+ />
+ <toolbar-button
+ data-testid="link"
+ content-type="link"
+ icon-name="link"
+ editor-command="toggleLink"
+ :editor-command-params="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ href: '',
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ category="tertiary"
+ size="medium"
+ :label="__('Insert link')"
+ @execute="trackToolbarControlExecution"
+ />
+ </gl-button-group>
+ </bubble-menu>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/link.vue b/app/assets/javascripts/content_editor/components/bubble_menus/link.vue
new file mode 100644
index 00000000000..dae0bc63b5a
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/link.vue
@@ -0,0 +1,189 @@
+<script>
+import {
+ GlLink,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlButton,
+ GlButtonGroup,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import Link from '../../extensions/link';
+import EditorStateObserver from '../editor_state_observer.vue';
+
+export default {
+ components: {
+ BubbleMenu,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlLink,
+ GlButton,
+ GlButtonGroup,
+ EditorStateObserver,
+ },
+ directives: {
+ GlTooltip,
+ },
+ inject: ['tiptapEditor', 'contentEditor'],
+ data() {
+ return {
+ linkHref: undefined,
+ linkCanonicalSrc: undefined,
+ linkTitle: undefined,
+
+ isEditing: false,
+ };
+ },
+ watch: {
+ linkCanonicalSrc(value) {
+ if (!value) this.isEditing = true;
+ },
+ },
+ methods: {
+ shouldShow() {
+ const shouldShow = this.tiptapEditor.isActive(Link.name);
+
+ if (!shouldShow) this.isEditing = false;
+
+ return shouldShow;
+ },
+
+ startEditingLink() {
+ // select the entire link
+ this.tiptapEditor.chain().focus().extendMarkRange(Link.name).run();
+
+ this.isEditing = true;
+ },
+
+ async endEditingLink() {
+ this.isEditing = false;
+
+ this.linkHref = await this.contentEditor.resolveUrl(this.linkCanonicalSrc);
+
+ if (!this.linkCanonicalSrc && !this.linkHref) {
+ this.removeLink();
+ }
+ },
+
+ cancelEditingLink() {
+ this.endEditingLink();
+ this.updateLinkToState();
+ },
+
+ async saveEditedLink() {
+ if (!this.linkCanonicalSrc) {
+ this.removeLink();
+ } else {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .extendMarkRange(Link.name)
+ .updateAttributes(Link.name, {
+ href: this.linkCanonicalSrc,
+ canonicalSrc: this.linkCanonicalSrc,
+ title: this.linkTitle,
+ })
+ .run();
+ }
+
+ this.endEditingLink();
+ },
+
+ updateLinkToState() {
+ if (!this.tiptapEditor.isActive(Link.name)) return;
+
+ const { href, title, canonicalSrc } = this.tiptapEditor.getAttributes(Link.name);
+
+ this.linkTitle = title;
+ this.linkHref = href;
+ this.linkCanonicalSrc = canonicalSrc || href;
+ },
+
+ copyLinkHref() {
+ navigator.clipboard.writeText(this.linkCanonicalSrc);
+ },
+
+ removeLink() {
+ this.tiptapEditor.chain().focus().extendMarkRange(Link.name).unsetLink().run();
+ },
+ },
+};
+</script>
+<template>
+ <bubble-menu
+ data-testid="link-bubble-menu"
+ class="gl-shadow gl-rounded-base gl-bg-white"
+ :editor="tiptapEditor"
+ plugin-key="bubbleMenuLink"
+ :should-show="() => shouldShow()"
+ :tippy-options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ placement: 'bottom',
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ >
+ <editor-state-observer @transaction="updateLinkToState">
+ <gl-button-group v-if="!isEditing" class="gl-display-flex gl-align-items-center">
+ <gl-link
+ v-gl-tooltip
+ :href="linkHref"
+ :aria-label="linkCanonicalSrc"
+ :title="linkCanonicalSrc"
+ target="_blank"
+ class="gl-px-3 gl-overflow-hidden gl-white-space-nowrap gl-text-overflow-ellipsis"
+ >
+ {{ linkCanonicalSrc }}
+ </gl-link>
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="copy-link-url"
+ :aria-label="__('Copy link URL')"
+ :title="__('Copy link URL')"
+ icon="copy-to-clipboard"
+ @click="copyLinkHref"
+ />
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="edit-link"
+ :aria-label="__('Edit link')"
+ :title="__('Edit link')"
+ icon="pencil"
+ @click="startEditingLink"
+ />
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="remove-link"
+ :aria-label="__('Remove link')"
+ :title="__('Remove link')"
+ icon="unlink"
+ @click="removeLink"
+ />
+ </gl-button-group>
+ <gl-form v-else class="bubble-menu-form gl-p-4 gl-w-100" @submit.prevent="saveEditedLink">
+ <gl-form-group :label="__('URL')" label-for="link-href">
+ <gl-form-input id="link-href" v-model="linkCanonicalSrc" data-testid="link-href" />
+ </gl-form-group>
+ <gl-form-group :label="__('Title')" label-for="link-title">
+ <gl-form-input id="link-title" v-model="linkTitle" data-testid="link-title" />
+ </gl-form-group>
+ <div class="gl-display-flex gl-justify-content-end">
+ <gl-button class="gl-mr-3" data-testid="cancel-link" @click="cancelEditingLink">
+ {{ __('Cancel') }}
+ </gl-button>
+ <gl-button variant="confirm" type="submit">
+ {{ __('Apply') }}
+ </gl-button>
+ </div>
+ </gl-form>
+ </editor-state-observer>
+ </bubble-menu>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/bubble_menus/media.vue b/app/assets/javascripts/content_editor/components/bubble_menus/media.vue
new file mode 100644
index 00000000000..a36a860c440
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/bubble_menus/media.vue
@@ -0,0 +1,288 @@
+<script>
+import {
+ GlLink,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlLoadingIcon,
+ GlButton,
+ GlButtonGroup,
+ GlTooltipDirective as GlTooltip,
+} from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import { __ } from '~/locale';
+import Audio from '../../extensions/audio';
+import Image from '../../extensions/image';
+import Video from '../../extensions/video';
+import EditorStateObserver from '../editor_state_observer.vue';
+import { acceptedMimes } from '../../services/upload_helpers';
+
+const MEDIA_TYPES = [Audio.name, Image.name, Video.name];
+
+export default {
+ i18n: {
+ copySourceLabels: {
+ [Audio.name]: __('Copy audio URL'),
+ [Image.name]: __('Copy image URL'),
+ [Video.name]: __('Copy video URL'),
+ },
+ editLabels: {
+ [Audio.name]: __('Edit audio description'),
+ [Image.name]: __('Edit image description'),
+ [Video.name]: __('Edit video description'),
+ },
+ replaceLabels: {
+ [Audio.name]: __('Replace audio'),
+ [Image.name]: __('Replace image'),
+ [Video.name]: __('Replace video'),
+ },
+ deleteLabels: {
+ [Audio.name]: __('Delete audio'),
+ [Image.name]: __('Delete image'),
+ [Video.name]: __('Delete video'),
+ },
+ },
+ components: {
+ BubbleMenu,
+ GlForm,
+ GlFormGroup,
+ GlFormInput,
+ GlLink,
+ GlLoadingIcon,
+ GlButton,
+ GlButtonGroup,
+ EditorStateObserver,
+ },
+ directives: {
+ GlTooltip,
+ },
+ inject: ['tiptapEditor', 'contentEditor'],
+ data() {
+ return {
+ mediaType: undefined,
+ mediaSrc: undefined,
+ mediaCanonicalSrc: undefined,
+ mediaAlt: undefined,
+ mediaTitle: undefined,
+
+ isEditing: false,
+ isUpdating: false,
+ isUploading: false,
+ };
+ },
+ computed: {
+ copySourceLabel() {
+ return this.$options.i18n.copySourceLabels[this.mediaType];
+ },
+ editLabel() {
+ return this.$options.i18n.editLabels[this.mediaType];
+ },
+ replaceLabel() {
+ return this.$options.i18n.replaceLabels[this.mediaType];
+ },
+ deleteLabel() {
+ return this.$options.i18n.deleteLabels[this.mediaType];
+ },
+ showProgressIndicator() {
+ return this.isUploading || this.isUpdating;
+ },
+ },
+ methods: {
+ shouldShow() {
+ const shouldShow = MEDIA_TYPES.some((type) => this.tiptapEditor.isActive(type));
+
+ if (!shouldShow) this.isEditing = false;
+
+ return shouldShow;
+ },
+
+ startEditingMedia() {
+ this.isEditing = true;
+ },
+
+ endEditingMedia() {
+ this.isEditing = false;
+
+ this.updateMediaInfoToState();
+ },
+
+ cancelEditingMedia() {
+ this.endEditingMedia();
+ this.updateMediaInfoToState();
+ },
+
+ async saveEditedMedia() {
+ this.isUpdating = true;
+
+ this.mediaSrc = await this.contentEditor.resolveUrl(this.mediaCanonicalSrc);
+
+ const position = this.tiptapEditor.state.selection.from;
+
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .updateAttributes(this.mediaType, {
+ src: this.mediaSrc,
+ alt: this.mediaAlt,
+ canonicalSrc: this.mediaCanonicalSrc,
+ title: this.mediaTitle,
+ })
+ .run();
+
+ this.tiptapEditor.commands.setNodeSelection(position);
+
+ this.endEditingMedia();
+
+ this.isUpdating = false;
+ },
+
+ async updateMediaInfoToState() {
+ this.mediaType = MEDIA_TYPES.find((type) => this.tiptapEditor.isActive(type));
+
+ if (!this.mediaType) return;
+
+ this.isUpdating = true;
+
+ const { src, title, alt, canonicalSrc, uploading } = this.tiptapEditor.getAttributes(
+ this.mediaType,
+ );
+
+ this.mediaTitle = title;
+ this.mediaAlt = alt;
+ this.mediaCanonicalSrc = canonicalSrc || src;
+ this.isUploading = uploading;
+ this.mediaSrc = await this.contentEditor.resolveUrl(this.mediaCanonicalSrc);
+
+ this.isUpdating = false;
+ },
+
+ replaceMedia() {
+ this.$refs.fileSelector.click();
+ },
+
+ onFileSelect(e) {
+ this.tiptapEditor
+ .chain()
+ .focus()
+ .deleteSelection()
+ .uploadAttachment({
+ file: e.target.files[0],
+ })
+ .run();
+
+ this.$refs.fileSelector.value = '';
+ },
+
+ copyMediaSrc() {
+ navigator.clipboard.writeText(this.mediaCanonicalSrc);
+ },
+
+ deleteMedia() {
+ this.tiptapEditor.chain().focus().deleteSelection().run();
+ },
+ },
+
+ acceptedMimes,
+};
+</script>
+<template>
+ <bubble-menu
+ data-testid="media-bubble-menu"
+ class="gl-shadow gl-rounded-base gl-bg-white"
+ :editor="tiptapEditor"
+ plugin-key="bubbleMenuMedia"
+ :should-show="() => shouldShow()"
+ >
+ <editor-state-observer @transaction="updateMediaInfoToState">
+ <gl-button-group v-if="!isEditing" class="gl-display-flex gl-align-items-center">
+ <gl-loading-icon v-if="showProgressIndicator" class="gl-pl-4 gl-pr-3" />
+ <input
+ ref="fileSelector"
+ type="file"
+ name="content_editor_image"
+ :accept="$options.acceptedMimes[mediaType]"
+ class="gl-display-none"
+ data-qa-selector="file_upload_field"
+ @change="onFileSelect"
+ />
+
+ <gl-link
+ v-if="!showProgressIndicator"
+ v-gl-tooltip
+ :href="mediaSrc"
+ :aria-label="mediaCanonicalSrc"
+ :title="mediaCanonicalSrc"
+ target="_blank"
+ class="gl-px-3 gl-overflow-hidden gl-white-space-nowrap gl-text-overflow-ellipsis"
+ >
+ {{ mediaCanonicalSrc }}
+ </gl-link>
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="copy-media-src"
+ :aria-label="copySourceLabel"
+ :title="copySourceLabel"
+ icon="copy-to-clipboard"
+ @click="copyMediaSrc"
+ />
+ <gl-button
+ v-if="!showProgressIndicator"
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="edit-media"
+ :aria-label="editLabel"
+ :title="editLabel"
+ icon="pencil"
+ @click="startEditingMedia"
+ />
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="replace-media"
+ :aria-label="replaceLabel"
+ :title="replaceLabel"
+ icon="upload"
+ @click="replaceMedia"
+ />
+ <gl-button
+ v-gl-tooltip
+ variant="default"
+ category="tertiary"
+ size="medium"
+ data-testid="delete-media"
+ :aria-label="deleteLabel"
+ :title="deleteLabel"
+ icon="remove"
+ @click="deleteMedia"
+ />
+ </gl-button-group>
+ <gl-form v-else class="bubble-menu-form gl-p-4 gl-w-100" @submit.prevent="saveEditedMedia">
+ <gl-form-group :label="__('URL')" label-for="media-src">
+ <gl-form-input id="media-src" v-model="mediaCanonicalSrc" data-testid="media-src" />
+ </gl-form-group>
+ <gl-form-group :label="__('Description (alt text)')" label-for="media-alt">
+ <gl-form-input id="media-alt" v-model="mediaAlt" data-testid="media-alt" />
+ </gl-form-group>
+ <gl-form-group :label="__('Title')" label-for="media-title">
+ <gl-form-input id="media-title" v-model="mediaTitle" data-testid="media-title" />
+ </gl-form-group>
+ <div class="gl-display-flex gl-justify-content-end">
+ <gl-button
+ class="gl-mr-3"
+ data-testid="cancel-editing-media"
+ @click="cancelEditingMedia"
+ >{{ __('Cancel') }}</gl-button
+ >
+ <gl-button variant="confirm" type="submit">{{ __('Apply') }}</gl-button>
+ </div>
+ </gl-form>
+ </editor-state-observer>
+ </bubble-menu>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue b/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue
deleted file mode 100644
index 87f22a27856..00000000000
--- a/app/assets/javascripts/content_editor/components/code_block_bubble_menu.vue
+++ /dev/null
@@ -1,146 +0,0 @@
-<script>
-import {
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlSearchBoxByType,
- GlTooltipDirective as GlTooltip,
-} from '@gitlab/ui';
-import { BubbleMenu } from '@tiptap/vue-2';
-import codeBlockLanguageLoader from '../services/code_block_language_loader';
-import CodeBlockHighlight from '../extensions/code_block_highlight';
-import Diagram from '../extensions/diagram';
-import Frontmatter from '../extensions/frontmatter';
-import EditorStateObserver from './editor_state_observer.vue';
-
-const CODE_BLOCK_NODE_TYPES = [CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
-
-export default {
- components: {
- BubbleMenu,
- GlButton,
- GlButtonGroup,
- GlDropdown,
- GlDropdownItem,
- GlSearchBoxByType,
- EditorStateObserver,
- },
- directives: {
- GlTooltip,
- },
- inject: ['tiptapEditor'],
- data() {
- return {
- selectedLanguage: {},
- filterTerm: '',
- filteredLanguages: [],
- };
- },
- watch: {
- filterTerm: {
- handler(val) {
- this.filteredLanguages = codeBlockLanguageLoader.filterLanguages(val);
- },
- immediate: true,
- },
- },
- methods: {
- shouldShow: ({ editor }) => {
- return CODE_BLOCK_NODE_TYPES.some((type) => editor.isActive(type));
- },
-
- getSelectedLanguage() {
- const { language } = this.tiptapEditor.getAttributes(this.getCodeBlockType());
-
- this.selectedLanguage = codeBlockLanguageLoader.findLanguageBySyntax(language);
- },
-
- async setSelectedLanguage(language) {
- this.selectedLanguage = language;
-
- await codeBlockLanguageLoader.loadLanguages([language.syntax]);
-
- this.tiptapEditor.commands.setCodeBlock({ language: this.selectedLanguage.syntax });
- },
-
- tippyOnBeforeUpdate(tippy, props) {
- if (props.getReferenceClientRect) {
- // eslint-disable-next-line no-param-reassign
- props.getReferenceClientRect = () => {
- const { view } = this.tiptapEditor;
- const { from } = this.tiptapEditor.state.selection;
-
- for (let { node } = view.domAtPos(from); node; node = node.parentElement) {
- if (node.nodeName?.toLowerCase() === 'pre') {
- return node.getBoundingClientRect();
- }
- }
-
- return new DOMRect(-1000, -1000, 0, 0);
- };
- }
- },
-
- deleteCodeBlock() {
- this.tiptapEditor.chain().focus().deleteNode(this.getCodeBlockType()).run();
- },
-
- getCodeBlockType() {
- return (
- CODE_BLOCK_NODE_TYPES.find((type) => this.tiptapEditor.isActive(type)) ||
- CodeBlockHighlight.name
- );
- },
- },
-};
-</script>
-<template>
- <bubble-menu
- data-testid="code-block-bubble-menu"
- class="gl-shadow gl-rounded-base"
- :editor="tiptapEditor"
- plugin-key="bubbleMenuCodeBlock"
- :should-show="shouldShow"
- :tippy-options="{ onBeforeUpdate: tippyOnBeforeUpdate }"
- >
- <editor-state-observer @transaction="getSelectedLanguage">
- <gl-button-group>
- <gl-dropdown contenteditable="false" boundary="viewport" :text="selectedLanguage.label">
- <template #header>
- <gl-search-box-by-type
- v-model="filterTerm"
- :clear-button-title="__('Clear')"
- :placeholder="__('Search')"
- />
- </template>
-
- <template #highlighted-items>
- <gl-dropdown-item :key="selectedLanguage.syntax" is-check-item :is-checked="true">
- {{ selectedLanguage.label }}
- </gl-dropdown-item>
- </template>
-
- <gl-dropdown-item
- v-for="language in filteredLanguages"
- v-show="selectedLanguage.syntax !== language.syntax"
- :key="language.syntax"
- @click="setSelectedLanguage(language)"
- >
- {{ language.label }}
- </gl-dropdown-item>
- </gl-dropdown>
- <gl-button
- v-gl-tooltip
- variant="default"
- category="primary"
- size="medium"
- :aria-label="__('Delete code block')"
- :title="__('Delete code block')"
- icon="remove"
- @click="deleteCodeBlock"
- />
- </gl-button-group>
- </editor-state-observer>
- </bubble-menu>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue
index 5b3f4f4ddf2..74ae37b6d06 100644
--- a/app/assets/javascripts/content_editor/components/content_editor.vue
+++ b/app/assets/javascripts/content_editor/components/content_editor.vue
@@ -4,8 +4,10 @@ import { createContentEditor } from '../services/create_content_editor';
import ContentEditorAlert from './content_editor_alert.vue';
import ContentEditorProvider from './content_editor_provider.vue';
import EditorStateObserver from './editor_state_observer.vue';
-import FormattingBubbleMenu from './formatting_bubble_menu.vue';
-import CodeBlockBubbleMenu from './code_block_bubble_menu.vue';
+import FormattingBubbleMenu from './bubble_menus/formatting.vue';
+import CodeBlockBubbleMenu from './bubble_menus/code_block.vue';
+import LinkBubbleMenu from './bubble_menus/link.vue';
+import MediaBubbleMenu from './bubble_menus/media.vue';
import TopToolbar from './top_toolbar.vue';
import LoadingIndicator from './loading_indicator.vue';
@@ -18,6 +20,8 @@ export default {
TopToolbar,
FormattingBubbleMenu,
CodeBlockBubbleMenu,
+ LinkBubbleMenu,
+ MediaBubbleMenu,
EditorStateObserver,
},
props: {
@@ -92,6 +96,8 @@ export default {
<div class="gl-relative">
<formatting-bubble-menu />
<code-block-bubble-menu />
+ <link-bubble-menu />
+ <media-bubble-menu />
<tiptap-editor-content class="md" :editor="contentEditor.tiptapEditor" />
<loading-indicator />
</div>
diff --git a/app/assets/javascripts/content_editor/components/divider.vue b/app/assets/javascripts/content_editor/components/divider.vue
deleted file mode 100644
index b77bd7b7cf3..00000000000
--- a/app/assets/javascripts/content_editor/components/divider.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-<template>
- <span class="gl-mx-3 gl-border-r-solid gl-border-r-1 gl-border-gray-200"></span>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue b/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue
deleted file mode 100644
index 103079534bc..00000000000
--- a/app/assets/javascripts/content_editor/components/formatting_bubble_menu.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-<script>
-import { GlButtonGroup } from '@gitlab/ui';
-import { BubbleMenu } from '@tiptap/vue-2';
-import { BUBBLE_MENU_TRACKING_ACTION } from '../constants';
-import trackUIControl from '../services/track_ui_control';
-import Code from '../extensions/code';
-import CodeBlockHighlight from '../extensions/code_block_highlight';
-import Diagram from '../extensions/diagram';
-import Frontmatter from '../extensions/frontmatter';
-import ToolbarButton from './toolbar_button.vue';
-
-export default {
- components: {
- BubbleMenu,
- GlButtonGroup,
- ToolbarButton,
- },
- inject: ['tiptapEditor'],
- methods: {
- trackToolbarControlExecution({ contentType, value }) {
- trackUIControl({ action: BUBBLE_MENU_TRACKING_ACTION, property: contentType, value });
- },
-
- shouldShow: ({ editor, from, to }) => {
- if (from === to) return false;
-
- const exclude = [Code.name, CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
-
- return !exclude.some((type) => editor.isActive(type));
- },
- },
-};
-</script>
-<template>
- <bubble-menu
- data-testid="formatting-bubble-menu"
- class="gl-shadow gl-rounded-base"
- :editor="tiptapEditor"
- :should-show="shouldShow"
- >
- <gl-button-group>
- <toolbar-button
- data-testid="bold"
- content-type="bold"
- icon-name="bold"
- editor-command="toggleBold"
- category="primary"
- size="medium"
- :label="__('Bold text')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="italic"
- content-type="italic"
- icon-name="italic"
- editor-command="toggleItalic"
- category="primary"
- size="medium"
- :label="__('Italic text')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="strike"
- content-type="strike"
- icon-name="strikethrough"
- editor-command="toggleStrike"
- category="primary"
- size="medium"
- :label="__('Strikethrough')"
- @execute="trackToolbarControlExecution"
- />
- <toolbar-button
- data-testid="code"
- content-type="code"
- icon-name="code"
- editor-command="toggleCode"
- category="primary"
- size="medium"
- :label="__('Code')"
- @execute="trackToolbarControlExecution"
- />
- </gl-button-group>
- </bubble-menu>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/loading_indicator.vue b/app/assets/javascripts/content_editor/components/loading_indicator.vue
index 620324adb06..7bc953e0dc3 100644
--- a/app/assets/javascripts/content_editor/components/loading_indicator.vue
+++ b/app/assets/javascripts/content_editor/components/loading_indicator.vue
@@ -34,7 +34,7 @@ export default {
class="gl-w-full gl-display-flex gl-justify-content-center gl-align-items-center gl-absolute gl-top-0 gl-bottom-0"
>
<div class="gl-bg-white gl-absolute gl-w-full gl-h-full gl-opacity-3"></div>
- <gl-loading-icon size="md" />
+ <gl-loading-icon size="lg" />
</div>
</editor-state-observer>
</template>
diff --git a/app/assets/javascripts/content_editor/components/toolbar_button.vue b/app/assets/javascripts/content_editor/components/toolbar_button.vue
index cdb877152d4..c16dc34e36f 100644
--- a/app/assets/javascripts/content_editor/components/toolbar_button.vue
+++ b/app/assets/javascripts/content_editor/components/toolbar_button.vue
@@ -29,6 +29,11 @@ export default {
required: false,
default: '',
},
+ editorCommandParams: {
+ type: Object,
+ required: false,
+ default: null,
+ },
variant: {
type: String,
required: false,
@@ -42,7 +47,7 @@ export default {
size: {
type: String,
required: false,
- default: 'small',
+ default: 'medium',
},
},
data() {
@@ -58,7 +63,7 @@ export default {
const { contentType } = this;
if (this.editorCommand) {
- this.tiptapEditor.chain()[this.editorCommand]().focus().run();
+ this.tiptapEditor.chain()[this.editorCommand](this.editorCommandParams).focus().run();
}
this.$emit('execute', { contentType });
diff --git a/app/assets/javascripts/content_editor/components/top_toolbar.vue b/app/assets/javascripts/content_editor/components/top_toolbar.vue
index 89182b3a09f..19e150a4da9 100644
--- a/app/assets/javascripts/content_editor/components/top_toolbar.vue
+++ b/app/assets/javascripts/content_editor/components/top_toolbar.vue
@@ -1,6 +1,5 @@
<script>
import trackUIControl from '../services/track_ui_control';
-import Divider from './divider.vue';
import ToolbarButton from './toolbar_button.vue';
import ToolbarImageButton from './toolbar_image_button.vue';
import ToolbarLinkButton from './toolbar_link_button.vue';
@@ -14,7 +13,6 @@ export default {
ToolbarLinkButton,
ToolbarTableButton,
ToolbarImageButton,
- Divider,
},
methods: {
trackToolbarControlExecution({ contentType, value }) {
@@ -25,13 +23,13 @@ export default {
</script>
<template>
<div
- class="gl-display-flex gl-justify-content-end gl-pb-3 gl-pt-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
+ class="gl-display-flex gl-flex-wrap gl-pb-3 gl-pt-0 gl-border-b-solid gl-border-b-1 gl-border-b-gray-200"
>
<toolbar-text-style-dropdown
data-testid="text-styles"
+ class="gl-mr-3"
@execute="trackToolbarControlExecution"
/>
- <divider />
<toolbar-button
data-testid="bold"
content-type="bold"
@@ -69,7 +67,6 @@ export default {
@execute="trackToolbarControlExecution"
/>
<toolbar-link-button data-testid="link" @execute="trackToolbarControlExecution" />
- <divider />
<toolbar-image-button
ref="imageButton"
data-testid="image"
diff --git a/app/assets/javascripts/content_editor/components/wrappers/code_block.vue b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
new file mode 100644
index 00000000000..1390b9b2daf
--- /dev/null
+++ b/app/assets/javascripts/content_editor/components/wrappers/code_block.vue
@@ -0,0 +1,44 @@
+<script>
+import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
+import { __ } from '~/locale';
+import codeBlockLanguageLoader from '../../services/code_block_language_loader';
+
+export default {
+ name: 'CodeBlock',
+ components: {
+ NodeViewWrapper,
+ NodeViewContent,
+ },
+ props: {
+ node: {
+ type: Object,
+ required: true,
+ },
+ updateAttributes: {
+ type: Function,
+ required: true,
+ },
+ },
+ async mounted() {
+ const lang = codeBlockLanguageLoader.findLanguageBySyntax(this.node.attrs.language);
+ await codeBlockLanguageLoader.loadLanguage(lang.syntax);
+
+ this.updateAttributes({ language: this.node.attrs.language });
+ },
+ i18n: {
+ frontmatter: __('frontmatter'),
+ },
+};
+</script>
+<template>
+ <node-view-wrapper class="content-editor-code-block gl-relative code highlight" as="pre">
+ <span
+ v-if="node.attrs.isFrontmatter"
+ data-testid="frontmatter-label"
+ class="gl-absolute gl-top-0 gl-right-3"
+ contenteditable="false"
+ >{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
+ >
+ <node-view-content as="code" />
+ </node-view-wrapper>
+</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue b/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue
deleted file mode 100644
index e8829d00986..00000000000
--- a/app/assets/javascripts/content_editor/components/wrappers/frontmatter.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<script>
-import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
-import { __ } from '~/locale';
-
-export default {
- name: 'FrontMatter',
- components: {
- NodeViewWrapper,
- NodeViewContent,
- },
- props: {
- node: {
- type: Object,
- required: true,
- },
- },
- i18n: {
- frontmatter: __('frontmatter'),
- },
-};
-</script>
-<template>
- <node-view-wrapper class="content-editor-code-block gl-relative code highlight" as="pre">
- <span
- data-testid="frontmatter-label"
- class="gl-absolute gl-top-0 gl-right-3"
- contenteditable="false"
- >{{ $options.i18n.frontmatter }}:{{ node.attrs.language }}</span
- >
- <node-view-content as="code" />
- </node-view-wrapper>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/media.vue b/app/assets/javascripts/content_editor/components/wrappers/media.vue
deleted file mode 100644
index 37119bdd066..00000000000
--- a/app/assets/javascripts/content_editor/components/wrappers/media.vue
+++ /dev/null
@@ -1,51 +0,0 @@
-<script>
-import { GlLoadingIcon } from '@gitlab/ui';
-import { NodeViewWrapper } from '@tiptap/vue-2';
-
-const tagNameMap = {
- image: 'img',
- video: 'video',
- audio: 'audio',
-};
-
-export default {
- name: 'MediaWrapper',
- components: {
- NodeViewWrapper,
- GlLoadingIcon,
- },
- props: {
- node: {
- type: Object,
- required: true,
- },
- },
- computed: {
- tagName() {
- return tagNameMap[this.node.type.name] || 'img';
- },
- },
-};
-</script>
-<template>
- <node-view-wrapper class="gl-display-inline-block">
- <span class="gl-relative" :class="{ [`media-container ${tagName}-container`]: true }">
- <gl-loading-icon v-if="node.attrs.uploading" class="gl-absolute gl-left-50p gl-top-half" />
- <component
- :is="tagName"
- data-testid="media"
- :class="{
- 'gl-max-w-full gl-h-auto': tagName !== 'audio',
- 'gl-opacity-5': node.attrs.uploading,
- }"
- :title="node.attrs.title || node.attrs.alt"
- :alt="node.attrs.alt"
- :src="node.attrs.src"
- controls="true"
- />
- <a v-if="tagName !== 'img'" :href="node.attrs.canonicalSrc || node.attrs.src" @click.prevent>
- {{ node.attrs.title || node.attrs.alt }}
- </a>
- </span>
- </node-view-wrapper>
-</template>
diff --git a/app/assets/javascripts/content_editor/components/wrappers/table_cell_base.vue b/app/assets/javascripts/content_editor/components/wrappers/table_cell_base.vue
index 41c083111c5..209e4629830 100644
--- a/app/assets/javascripts/content_editor/components/wrappers/table_cell_base.vue
+++ b/app/assets/javascripts/content_editor/components/wrappers/table_cell_base.vue
@@ -124,7 +124,9 @@ export default {
no-caret
text-sr-only
:text="$options.i18n.editTableActions"
- :popper-opts="{ positionFixed: true }"
+ :popper-opts="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ positionFixed: true,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@hide="handleHide($event)"
>
<gl-dropdown-item @click="runCommand('addColumnBefore')">
diff --git a/app/assets/javascripts/content_editor/constants/code_block_languages.js b/app/assets/javascripts/content_editor/constants/code_block_languages.js
new file mode 100644
index 00000000000..1a4dbe4fa22
--- /dev/null
+++ b/app/assets/javascripts/content_editor/constants/code_block_languages.js
@@ -0,0 +1,210 @@
+/* eslint-disable @gitlab/require-i18n-strings */
+// List of languages referenced from https://github.com/wooorm/lowlight#data
+const CODE_BLOCK_LANGUAGES = [
+ { syntax: '1c', label: '1C:Enterprise' },
+ { syntax: 'abnf', label: 'Augmented Backus-Naur Form' },
+ { syntax: 'accesslog', label: 'Apache Access Log' },
+ { syntax: 'actionscript', variants: 'as', label: 'ActionScript' },
+ { syntax: 'ada', label: 'Ada' },
+ { syntax: 'angelscript', variants: 'asc', label: 'AngelScript' },
+ { syntax: 'apache', variants: 'apacheconf', label: 'Apache config' },
+ { syntax: 'applescript', variants: 'osascript', label: 'AppleScript' },
+ { syntax: 'arcade', label: 'ArcGIS Arcade' },
+ { syntax: 'arduino', variants: 'ino', label: 'Arduino' },
+ { syntax: 'armasm', variants: 'arm', label: 'ARM Assembly' },
+ { syntax: 'asciidoc', variants: 'adoc', label: 'AsciiDoc' },
+ { syntax: 'aspectj', label: 'AspectJ' },
+ { syntax: 'autohotkey', variants: 'ahk', label: 'AutoHotkey' },
+ { syntax: 'autoit', label: 'AutoIt' },
+ { syntax: 'avrasm', label: 'AVR Assembly' },
+ { syntax: 'awk', label: 'Awk' },
+ { syntax: 'axapta', variants: 'x++', label: 'X++' },
+ { syntax: 'bash', variants: 'sh', label: 'Bash' },
+ { syntax: 'basic', label: 'BASIC' },
+ { syntax: 'bnf', label: 'Backus-Naur Form' },
+ { syntax: 'brainfuck', variants: 'bf', label: 'Brainfuck' },
+ { syntax: 'c', variants: 'h', label: 'C' },
+ { syntax: 'cal', label: 'C/AL' },
+ { syntax: 'capnproto', variants: 'capnp', label: "Cap'n Proto" },
+ { syntax: 'ceylon', label: 'Ceylon' },
+ { syntax: 'clean', variants: 'icl, dcl', label: 'Clean' },
+ { syntax: 'clojure', variants: 'clj, edn', label: 'Clojure' },
+ { syntax: 'clojure-repl', label: 'Clojure REPL' },
+ { syntax: 'cmake', variants: 'cmake.in', label: 'CMake' },
+ { syntax: 'coffeescript', variants: 'coffee, cson, iced', label: 'CoffeeScript' },
+ { syntax: 'coq', label: 'Coq' },
+ { syntax: 'cos', variants: 'cls', label: 'Caché Object Script' },
+ { syntax: 'cpp', variants: 'cc, c++, h++, hpp, hh, hxx, cxx', label: 'C++' },
+ { syntax: 'crmsh', variants: 'crm, pcmk', label: 'crmsh' },
+ { syntax: 'crystal', variants: 'cr', label: 'Crystal' },
+ { syntax: 'csharp', variants: 'cs, c#', label: 'C#' },
+ { syntax: 'csp', label: 'CSP' },
+ { syntax: 'css', label: 'CSS' },
+ { syntax: 'd', label: 'D' },
+ { syntax: 'dart', label: 'Dart' },
+ { syntax: 'delphi', variants: 'dpr, dfm, pas, pascal', label: 'Delphi' },
+ { syntax: 'diff', variants: 'patch', label: 'Diff' },
+ { syntax: 'django', variants: 'jinja', label: 'Django' },
+ { syntax: 'dns', variants: 'bind, zone', label: 'DNS Zone' },
+ { syntax: 'dockerfile', variants: 'docker', label: 'Dockerfile' },
+ { syntax: 'dos', variants: 'bat, cmd', label: 'Batch file (DOS)' },
+ { syntax: 'dsconfig', label: 'DSConfig' },
+ { syntax: 'dts', label: 'Device Tree' },
+ { syntax: 'dust', variants: 'dst', label: 'Dust' },
+ { syntax: 'ebnf', label: 'Extended Backus-Naur Form' },
+ { syntax: 'elixir', variants: 'ex, exs', label: 'Elixir' },
+ { syntax: 'elm', label: 'Elm' },
+ { syntax: 'erb', label: 'ERB' },
+ { syntax: 'erlang', variants: 'erl', label: 'Erlang' },
+ { syntax: 'erlang-repl', label: 'Erlang REPL' },
+ { syntax: 'excel', variants: 'xlsx, xls', label: 'Excel formulae' },
+ { syntax: 'fix', label: 'FIX' },
+ { syntax: 'flix', label: 'Flix' },
+ { syntax: 'fortran', variants: 'f90, f95', label: 'Fortran' },
+ { syntax: 'fsharp', variants: 'fs, f#', label: 'F#' },
+ { syntax: 'gams', variants: 'gms', label: 'GAMS' },
+ { syntax: 'gauss', variants: 'gss', label: 'GAUSS' },
+ { syntax: 'gcode', variants: 'nc', label: 'G-code (ISO 6983)' },
+ { syntax: 'gherkin', variants: 'feature', label: 'Gherkin' },
+ { syntax: 'glsl', label: 'GLSL' },
+ { syntax: 'gml', label: 'GML' },
+ { syntax: 'go', variants: 'golang', label: 'Go' },
+ { syntax: 'golo', label: 'Golo' },
+ { syntax: 'gradle', label: 'Gradle' },
+ { syntax: 'graphql', variants: 'gql', label: 'GraphQL' },
+ { syntax: 'groovy', label: 'Groovy' },
+ { syntax: 'haml', label: 'HAML' },
+ {
+ syntax: 'handlebars',
+ variants: 'hbs, html.hbs, html.handlebars, htmlbars',
+ label: 'Handlebars',
+ },
+ { syntax: 'haskell', variants: 'hs', label: 'Haskell' },
+ { syntax: 'haxe', variants: 'hx', label: 'Haxe' },
+ { syntax: 'hsp', label: 'HSP' },
+ { syntax: 'http', variants: 'https', label: 'HTTP' },
+ { syntax: 'hy', variants: 'hylang', label: 'Hy' },
+ { syntax: 'inform7', variants: 'i7', label: 'Inform 7' },
+ { syntax: 'ini', variants: 'toml', label: 'TOML, also INI' },
+ { syntax: 'irpf90', label: 'IRPF90' },
+ { syntax: 'isbl', label: 'ISBL' },
+ { syntax: 'java', variants: 'jsp', label: 'Java' },
+ { syntax: 'javascript', variants: 'js, jsx, mjs, cjs', label: 'Javascript' },
+ { syntax: 'jboss-cli', variants: 'wildfly-cli', label: 'JBoss CLI' },
+ { syntax: 'json', label: 'JSON' },
+ { syntax: 'julia', label: 'Julia' },
+ { syntax: 'julia-repl', variants: 'jldoctest', label: 'Julia REPL' },
+ { syntax: 'kotlin', variants: 'kt, kts', label: 'Kotlin' },
+ { syntax: 'lasso', variants: 'ls, lassoscript', label: 'Lasso' },
+ { syntax: 'latex', variants: 'tex', label: 'LaTeX' },
+ { syntax: 'ldif', label: 'LDIF' },
+ { syntax: 'leaf', label: 'Leaf' },
+ { syntax: 'less', label: 'Less' },
+ { syntax: 'lisp', label: 'Lisp' },
+ { syntax: 'livecodeserver', label: 'LiveCode' },
+ { syntax: 'livescript', variants: 'ls', label: 'LiveScript' },
+ { syntax: 'llvm', label: 'LLVM IR' },
+ { syntax: 'lsl', label: 'LSL (Linden Scripting Language)' },
+ { syntax: 'lua', label: 'Lua' },
+ { syntax: 'makefile', variants: 'mk, mak, make', label: 'Makefile' },
+ { syntax: 'markdown', variants: 'md, mkdown, mkd', label: 'Markdown' },
+ { syntax: 'mathematica', variants: 'mma, wl', label: 'Mathematica' },
+ { syntax: 'matlab', label: 'Matlab' },
+ { syntax: 'maxima', label: 'Maxima' },
+ { syntax: 'mel', label: 'MEL' },
+ { syntax: 'mercury', variants: 'm, moo', label: 'Mercury' },
+ { syntax: 'mipsasm', variants: 'mips', label: 'MIPS Assembly' },
+ { syntax: 'mizar', label: 'Mizar' },
+ { syntax: 'mojolicious', label: 'Mojolicious' },
+ { syntax: 'monkey', label: 'Monkey' },
+ { syntax: 'moonscript', variants: 'moon', label: 'MoonScript' },
+ { syntax: 'n1ql', label: 'N1QL' },
+ { syntax: 'nestedtext', variants: 'nt', label: 'Nested Text' },
+ { syntax: 'nginx', variants: 'nginxconf', label: 'Nginx config' },
+ { syntax: 'nim', label: 'Nim' },
+ { syntax: 'nix', variants: 'nixos', label: 'Nix' },
+ { syntax: 'node-repl', label: 'Node REPL' },
+ { syntax: 'nsis', label: 'NSIS' },
+ {
+ syntax: 'objectivec',
+ variants: 'mm, objc, obj-c, obj-c++, objective-c++',
+ label: 'Objective-C',
+ },
+ { syntax: 'ocaml', variants: 'ml', label: 'OCaml' },
+ { syntax: 'openscad', variants: 'scad', label: 'OpenSCAD' },
+ { syntax: 'oxygene', label: 'Oxygene' },
+ { syntax: 'parser3', label: 'Parser3' },
+ { syntax: 'perl', variants: 'pl, pm', label: 'Perl' },
+ { syntax: 'pf', variants: 'pf.conf', label: 'Packet Filter config' },
+ { syntax: 'pgsql', variants: 'postgres, postgresql', label: 'PostgreSQL' },
+ { syntax: 'php', label: 'PHP' },
+ { syntax: 'php-template', label: 'PHP template' },
+ { syntax: 'plaintext', variants: 'text, txt', label: 'Plain text' },
+ { syntax: 'pony', label: 'Pony' },
+ { syntax: 'powershell', variants: 'pwsh, ps, ps1', label: 'PowerShell' },
+ { syntax: 'processing', variants: 'pde', label: 'Processing' },
+ { syntax: 'profile', label: 'Python profiler' },
+ { syntax: 'prolog', label: 'Prolog' },
+ { syntax: 'properties', label: '.properties' },
+ { syntax: 'protobuf', label: 'Protocol Buffers' },
+ { syntax: 'puppet', variants: 'pp', label: 'Puppet' },
+ { syntax: 'purebasic', variants: 'pb, pbi', label: 'PureBASIC' },
+ { syntax: 'python', variants: 'py, gyp, ipython', label: 'Python' },
+ { syntax: 'python-repl', variants: 'pycon', label: 'Python REPL' },
+ { syntax: 'q', variants: 'k, kdb', label: 'Q' },
+ { syntax: 'qml', variants: 'qt', label: 'QML' },
+ { syntax: 'r', label: 'R' },
+ { syntax: 'reasonml', variants: 're', label: 'ReasonML' },
+ { syntax: 'rib', label: 'RenderMan RIB' },
+ { syntax: 'roboconf', variants: 'graph, instances', label: 'Roboconf' },
+ { syntax: 'routeros', variants: 'mikrotik', label: 'Microtik RouterOS script' },
+ { syntax: 'rsl', label: 'RenderMan RSL' },
+ { syntax: 'ruby', variants: 'rb, gemspec, podspec, thor, irb', label: 'Ruby' },
+ { syntax: 'ruleslanguage', label: 'Oracle Rules Language' },
+ { syntax: 'rust', variants: 'rs', label: 'Rust' },
+ { syntax: 'sas', label: 'SAS' },
+ { syntax: 'scala', label: 'Scala' },
+ { syntax: 'scheme', label: 'Scheme' },
+ { syntax: 'scilab', variants: 'sci', label: 'Scilab' },
+ { syntax: 'scss', label: 'SCSS' },
+ { syntax: 'shell', variants: 'console, shellsession', label: 'Shell Session' },
+ { syntax: 'smali', label: 'Smali' },
+ { syntax: 'smalltalk', variants: 'st', label: 'Smalltalk' },
+ { syntax: 'sml', variants: 'ml', label: 'SML (Standard ML)' },
+ { syntax: 'sqf', label: 'SQF' },
+ { syntax: 'sql', label: 'SQL' },
+ { syntax: 'stan', variants: 'stanfuncs', label: 'Stan' },
+ { syntax: 'stata', variants: 'do, ado', label: 'Stata' },
+ { syntax: 'step21', variants: 'p21, step, stp', label: 'STEP Part 21' },
+ { syntax: 'stylus', variants: 'styl', label: 'Stylus' },
+ { syntax: 'subunit', label: 'SubUnit' },
+ { syntax: 'swift', label: 'Swift' },
+ { syntax: 'taggerscript', label: 'Tagger Script' },
+ { syntax: 'tap', label: 'Test Anything Protocol' },
+ { syntax: 'tcl', variants: 'tk', label: 'Tcl' },
+ { syntax: 'thrift', label: 'Thrift' },
+ { syntax: 'tp', label: 'TP' },
+ { syntax: 'twig', variants: 'craftcms', label: 'Twig' },
+ { syntax: 'typescript', variants: 'ts, tsx', label: 'TypeScript' },
+ { syntax: 'vala', label: 'Vala' },
+ { syntax: 'vbnet', variants: 'vb', label: 'Visual Basic .NET' },
+ { syntax: 'vbscript', variants: 'vbs', label: 'VBScript' },
+ { syntax: 'vbscript-html', label: 'VBScript in HTML' },
+ { syntax: 'verilog', variants: 'v, sv, svh', label: 'Verilog' },
+ { syntax: 'vhdl', label: 'VHDL' },
+ { syntax: 'vim', label: 'Vim Script' },
+ { syntax: 'wasm', label: 'WebAssembly' },
+ { syntax: 'wren', label: 'Wren' },
+ { syntax: 'x86asm', label: 'Intel x86 Assembly' },
+ { syntax: 'xl', variants: 'tao', label: 'XL' },
+ {
+ syntax: 'xml',
+ variants: 'html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg',
+ label: 'HTML, XML',
+ },
+ { syntax: 'xquery', variants: 'xpath, xq', label: 'XQuery' },
+ { syntax: 'yaml', variants: 'yml', label: 'YAML' },
+ { syntax: 'zephir', variants: 'zep', label: 'Zephir' },
+];
+
+export default CODE_BLOCK_LANGUAGES;
diff --git a/app/assets/javascripts/content_editor/constants.js b/app/assets/javascripts/content_editor/constants/index.js
index a39a243ec6b..a39a243ec6b 100644
--- a/app/assets/javascripts/content_editor/constants.js
+++ b/app/assets/javascripts/content_editor/constants/index.js
diff --git a/app/assets/javascripts/content_editor/extensions/blockquote.js b/app/assets/javascripts/content_editor/extensions/blockquote.js
index 5632bc28592..9b424ac8367 100644
--- a/app/assets/javascripts/content_editor/extensions/blockquote.js
+++ b/app/assets/javascripts/content_editor/extensions/blockquote.js
@@ -26,7 +26,7 @@ export default Blockquote.extend({
const multilineInputRegex = /^\s*>>>\s$/gm;
return [
- ...this.parent?.(),
+ ...this.parent(),
wrappingInputRule({
find: multilineInputRegex,
type: this.type,
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 61f379fc0a2..cc4ba84a29d 100644
--- a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
+++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js
@@ -1,6 +1,8 @@
import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight';
import { textblockTypeInputRule } from '@tiptap/core';
-import codeBlockLanguageLoader from '../services/code_block_language_loader';
+import { VueNodeViewRenderer } from '@tiptap/vue-2';
+import languageLoader from '../services/code_block_language_loader';
+import CodeBlockWrapper from '../components/wrappers/code_block.vue';
const extractLanguage = (element) => element.getAttribute('lang');
export const backtickInputRegex = /^```([a-z]+)?[\s\n]$/;
@@ -9,14 +11,6 @@ export const tildeInputRegex = /^~~~([a-z]+)?[\s\n]$/;
export default CodeBlockLowlight.extend({
isolating: true,
exitOnArrowDown: false,
-
- addOptions() {
- return {
- ...this.parent?.(),
- languageLoader: codeBlockLanguageLoader,
- };
- },
-
addAttributes() {
return {
language: {
@@ -30,7 +24,6 @@ export default CodeBlockLowlight.extend({
};
},
addInputRules() {
- const { languageLoader } = this.options;
const getAttributes = (match) => languageLoader?.loadLanguageFromInputRule(match) || {};
return [
@@ -65,4 +58,8 @@ export default CodeBlockLowlight.extend({
['code', {}, 0],
];
},
+
+ addNodeView() {
+ return new VueNodeViewRenderer(CodeBlockWrapper);
+ },
});
diff --git a/app/assets/javascripts/content_editor/extensions/diagram.js b/app/assets/javascripts/content_editor/extensions/diagram.js
index d192b815092..f9dfeb92e9a 100644
--- a/app/assets/javascripts/content_editor/extensions/diagram.js
+++ b/app/assets/javascripts/content_editor/extensions/diagram.js
@@ -14,6 +14,9 @@ export default CodeBlockHighlight.extend({
return element.dataset.diagram;
},
},
+ isDiagram: {
+ default: true,
+ },
};
},
diff --git a/app/assets/javascripts/content_editor/extensions/frontmatter.js b/app/assets/javascripts/content_editor/extensions/frontmatter.js
index 9842027e192..2ec22158106 100644
--- a/app/assets/javascripts/content_editor/extensions/frontmatter.js
+++ b/app/assets/javascripts/content_editor/extensions/frontmatter.js
@@ -1,10 +1,18 @@
-import { VueNodeViewRenderer } from '@tiptap/vue-2';
import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
-import FrontmatterWrapper from '../components/wrappers/frontmatter.vue';
import CodeBlockHighlight from './code_block_highlight';
export default CodeBlockHighlight.extend({
name: 'frontmatter',
+
+ addAttributes() {
+ return {
+ ...this.parent?.(),
+ isFrontmatter: {
+ default: true,
+ },
+ };
+ },
+
parseHTML() {
return [
{
@@ -24,9 +32,6 @@ export default CodeBlockHighlight.extend({
},
};
},
- addNodeView() {
- return new VueNodeViewRenderer(FrontmatterWrapper);
- },
addInputRules() {
return [];
diff --git a/app/assets/javascripts/content_editor/extensions/image.js b/app/assets/javascripts/content_editor/extensions/image.js
index 311db8151cb..25f976f524f 100644
--- a/app/assets/javascripts/content_editor/extensions/image.js
+++ b/app/assets/javascripts/content_editor/extensions/image.js
@@ -1,6 +1,4 @@
import { Image } from '@tiptap/extension-image';
-import { VueNodeViewRenderer } from '@tiptap/vue-2';
-import MediaWrapper from '../components/wrappers/media.vue';
import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';
const resolveImageEl = (element) =>
@@ -77,7 +75,4 @@ export default Image.extend({
},
];
},
- addNodeView() {
- return VueNodeViewRenderer(MediaWrapper);
- },
});
diff --git a/app/assets/javascripts/content_editor/extensions/paste_markdown.js b/app/assets/javascripts/content_editor/extensions/paste_markdown.js
index c349aa42a62..f87e4d8d1dd 100644
--- a/app/assets/javascripts/content_editor/extensions/paste_markdown.js
+++ b/app/assets/javascripts/content_editor/extensions/paste_markdown.js
@@ -2,7 +2,7 @@ import { Extension } from '@tiptap/core';
import { Plugin, PluginKey } from 'prosemirror-state';
import { __ } from '~/locale';
import { VARIANT_DANGER } from '~/flash';
-import createMarkdownDeserializer from '../services/markdown_deserializer';
+import createMarkdownDeserializer from '../services/gl_api_markdown_deserializer';
import {
ALERT_EVENT,
LOADING_CONTENT_EVENT,
@@ -10,10 +10,14 @@ import {
LOADING_ERROR_EVENT,
EXTENSION_PRIORITY_HIGHEST,
} from '../constants';
+import CodeBlockHighlight from './code_block_highlight';
+import Diagram from './diagram';
+import Frontmatter from './frontmatter';
const TEXT_FORMAT = 'text/plain';
const HTML_FORMAT = 'text/html';
const VS_CODE_FORMAT = 'vscode-editor-data';
+const CODE_BLOCK_NODE_TYPES = [CodeBlockHighlight.name, Diagram.name, Frontmatter.name];
export default Extension.create({
name: 'pasteMarkdown',
@@ -75,6 +79,11 @@ export default Extension.create({
return false;
}
+ // if a code block is active, paste as plain text
+ if (CODE_BLOCK_NODE_TYPES.some((type) => this.editor.isActive(type))) {
+ return false;
+ }
+
this.editor.commands.pasteMarkdown(content);
return true;
diff --git a/app/assets/javascripts/content_editor/extensions/playable.js b/app/assets/javascripts/content_editor/extensions/playable.js
index 2c5269377c5..ed343d8acf8 100644
--- a/app/assets/javascripts/content_editor/extensions/playable.js
+++ b/app/assets/javascripts/content_editor/extensions/playable.js
@@ -1,8 +1,6 @@
/* eslint-disable @gitlab/require-i18n-strings */
import { Node } from '@tiptap/core';
-import { VueNodeViewRenderer } from '@tiptap/vue-2';
-import MediaWrapper from '../components/wrappers/media.vue';
const queryPlayableElement = (element, mediaType) => element.querySelector(mediaType);
@@ -68,8 +66,4 @@ export default Node.create({
['a', { href: node.attrs.src }, node.attrs.title || node.attrs.alt || ''],
];
},
-
- addNodeView() {
- return VueNodeViewRenderer(MediaWrapper);
- },
});
diff --git a/app/assets/javascripts/content_editor/extensions/sourcemap.js b/app/assets/javascripts/content_editor/extensions/sourcemap.js
new file mode 100644
index 00000000000..94236e2e70e
--- /dev/null
+++ b/app/assets/javascripts/content_editor/extensions/sourcemap.js
@@ -0,0 +1,48 @@
+import { Extension } from '@tiptap/core';
+import Blockquote from './blockquote';
+import Bold from './bold';
+import BulletList from './bullet_list';
+import Code from './code';
+import CodeBlockHighlight from './code_block_highlight';
+import Heading from './heading';
+import HardBreak from './hard_break';
+import HorizontalRule from './horizontal_rule';
+import Image from './image';
+import Italic from './italic';
+import Link from './link';
+import ListItem from './list_item';
+import OrderedList from './ordered_list';
+import Paragraph from './paragraph';
+
+export default Extension.create({
+ addGlobalAttributes() {
+ return [
+ {
+ types: [
+ Bold.name,
+ Blockquote.name,
+ BulletList.name,
+ Code.name,
+ CodeBlockHighlight.name,
+ HardBreak.name,
+ Heading.name,
+ HorizontalRule.name,
+ Image.name,
+ Italic.name,
+ Link.name,
+ ListItem.name,
+ OrderedList.name,
+ Paragraph.name,
+ ],
+ attributes: {
+ sourceMarkdown: {
+ default: null,
+ },
+ sourceMapKey: {
+ default: null,
+ },
+ },
+ },
+ ];
+ },
+});
diff --git a/app/assets/javascripts/content_editor/services/asset_resolver.js b/app/assets/javascripts/content_editor/services/asset_resolver.js
new file mode 100644
index 00000000000..942457b9664
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/asset_resolver.js
@@ -0,0 +1,13 @@
+import { memoize } from 'lodash';
+
+export default ({ renderMarkdown }) => ({
+ resolveUrl: memoize(async (canonicalSrc) => {
+ const html = await renderMarkdown(`[link](${canonicalSrc})`);
+ if (!html) return canonicalSrc;
+
+ const parser = new DOMParser();
+ const { body } = parser.parseFromString(html, 'text/html');
+
+ return body.querySelector('a').getAttribute('href');
+ }),
+});
diff --git a/app/assets/javascripts/content_editor/services/code_block_language_loader.js b/app/assets/javascripts/content_editor/services/code_block_language_loader.js
index 081400cfd9a..1afaf4bfef6 100644
--- a/app/assets/javascripts/content_editor/services/code_block_language_loader.js
+++ b/app/assets/javascripts/content_editor/services/code_block_language_loader.js
@@ -1,215 +1,7 @@
import { lowlight } from 'lowlight/lib/core';
import { __, sprintf } from '~/locale';
-
-/* eslint-disable @gitlab/require-i18n-strings */
-// List of languages referenced from https://github.com/wooorm/lowlight#data
-const CODE_BLOCK_LANGUAGES = [
- { syntax: '1c', label: '1C:Enterprise' },
- { syntax: 'abnf', label: 'Augmented Backus-Naur Form' },
- { syntax: 'accesslog', label: 'Apache Access Log' },
- { syntax: 'actionscript', variants: 'as', label: 'ActionScript' },
- { syntax: 'ada', label: 'Ada' },
- { syntax: 'angelscript', variants: 'asc', label: 'AngelScript' },
- { syntax: 'apache', variants: 'apacheconf', label: 'Apache config' },
- { syntax: 'applescript', variants: 'osascript', label: 'AppleScript' },
- { syntax: 'arcade', label: 'ArcGIS Arcade' },
- { syntax: 'arduino', variants: 'ino', label: 'Arduino' },
- { syntax: 'armasm', variants: 'arm', label: 'ARM Assembly' },
- { syntax: 'asciidoc', variants: 'adoc', label: 'AsciiDoc' },
- { syntax: 'aspectj', label: 'AspectJ' },
- { syntax: 'autohotkey', variants: 'ahk', label: 'AutoHotkey' },
- { syntax: 'autoit', label: 'AutoIt' },
- { syntax: 'avrasm', label: 'AVR Assembly' },
- { syntax: 'awk', label: 'Awk' },
- { syntax: 'axapta', variants: 'x++', label: 'X++' },
- { syntax: 'bash', variants: 'sh', label: 'Bash' },
- { syntax: 'basic', label: 'BASIC' },
- { syntax: 'bnf', label: 'Backus-Naur Form' },
- { syntax: 'brainfuck', variants: 'bf', label: 'Brainfuck' },
- { syntax: 'c', variants: 'h', label: 'C' },
- { syntax: 'cal', label: 'C/AL' },
- { syntax: 'capnproto', variants: 'capnp', label: "Cap'n Proto" },
- { syntax: 'ceylon', label: 'Ceylon' },
- { syntax: 'clean', variants: 'icl, dcl', label: 'Clean' },
- { syntax: 'clojure', variants: 'clj, edn', label: 'Clojure' },
- { syntax: 'clojure-repl', label: 'Clojure REPL' },
- { syntax: 'cmake', variants: 'cmake.in', label: 'CMake' },
- { syntax: 'coffeescript', variants: 'coffee, cson, iced', label: 'CoffeeScript' },
- { syntax: 'coq', label: 'Coq' },
- { syntax: 'cos', variants: 'cls', label: 'Caché Object Script' },
- { syntax: 'cpp', variants: 'cc, c++, h++, hpp, hh, hxx, cxx', label: 'C++' },
- { syntax: 'crmsh', variants: 'crm, pcmk', label: 'crmsh' },
- { syntax: 'crystal', variants: 'cr', label: 'Crystal' },
- { syntax: 'csharp', variants: 'cs, c#', label: 'C#' },
- { syntax: 'csp', label: 'CSP' },
- { syntax: 'css', label: 'CSS' },
- { syntax: 'd', label: 'D' },
- { syntax: 'dart', label: 'Dart' },
- { syntax: 'delphi', variants: 'dpr, dfm, pas, pascal', label: 'Delphi' },
- { syntax: 'diff', variants: 'patch', label: 'Diff' },
- { syntax: 'django', variants: 'jinja', label: 'Django' },
- { syntax: 'dns', variants: 'bind, zone', label: 'DNS Zone' },
- { syntax: 'dockerfile', variants: 'docker', label: 'Dockerfile' },
- { syntax: 'dos', variants: 'bat, cmd', label: 'Batch file (DOS)' },
- { syntax: 'dsconfig', label: 'DSConfig' },
- { syntax: 'dts', label: 'Device Tree' },
- { syntax: 'dust', variants: 'dst', label: 'Dust' },
- { syntax: 'ebnf', label: 'Extended Backus-Naur Form' },
- { syntax: 'elixir', variants: 'ex, exs', label: 'Elixir' },
- { syntax: 'elm', label: 'Elm' },
- { syntax: 'erb', label: 'ERB' },
- { syntax: 'erlang', variants: 'erl', label: 'Erlang' },
- { syntax: 'erlang-repl', label: 'Erlang REPL' },
- { syntax: 'excel', variants: 'xlsx, xls', label: 'Excel formulae' },
- { syntax: 'fix', label: 'FIX' },
- { syntax: 'flix', label: 'Flix' },
- { syntax: 'fortran', variants: 'f90, f95', label: 'Fortran' },
- { syntax: 'fsharp', variants: 'fs, f#', label: 'F#' },
- { syntax: 'gams', variants: 'gms', label: 'GAMS' },
- { syntax: 'gauss', variants: 'gss', label: 'GAUSS' },
- { syntax: 'gcode', variants: 'nc', label: 'G-code (ISO 6983)' },
- { syntax: 'gherkin', variants: 'feature', label: 'Gherkin' },
- { syntax: 'glsl', label: 'GLSL' },
- { syntax: 'gml', label: 'GML' },
- { syntax: 'go', variants: 'golang', label: 'Go' },
- { syntax: 'golo', label: 'Golo' },
- { syntax: 'gradle', label: 'Gradle' },
- { syntax: 'graphql', variants: 'gql', label: 'GraphQL' },
- { syntax: 'groovy', label: 'Groovy' },
- { syntax: 'haml', label: 'HAML' },
- {
- syntax: 'handlebars',
- variants: 'hbs, html.hbs, html.handlebars, htmlbars',
- label: 'Handlebars',
- },
- { syntax: 'haskell', variants: 'hs', label: 'Haskell' },
- { syntax: 'haxe', variants: 'hx', label: 'Haxe' },
- { syntax: 'hsp', label: 'HSP' },
- { syntax: 'http', variants: 'https', label: 'HTTP' },
- { syntax: 'hy', variants: 'hylang', label: 'Hy' },
- { syntax: 'inform7', variants: 'i7', label: 'Inform 7' },
- { syntax: 'ini', variants: 'toml', label: 'TOML, also INI' },
- { syntax: 'irpf90', label: 'IRPF90' },
- { syntax: 'isbl', label: 'ISBL' },
- { syntax: 'java', variants: 'jsp', label: 'Java' },
- { syntax: 'javascript', variants: 'js, jsx, mjs, cjs', label: 'Javascript' },
- { syntax: 'jboss-cli', variants: 'wildfly-cli', label: 'JBoss CLI' },
- { syntax: 'json', label: 'JSON' },
- { syntax: 'julia', label: 'Julia' },
- { syntax: 'julia-repl', variants: 'jldoctest', label: 'Julia REPL' },
- { syntax: 'kotlin', variants: 'kt, kts', label: 'Kotlin' },
- { syntax: 'lasso', variants: 'ls, lassoscript', label: 'Lasso' },
- { syntax: 'latex', variants: 'tex', label: 'LaTeX' },
- { syntax: 'ldif', label: 'LDIF' },
- { syntax: 'leaf', label: 'Leaf' },
- { syntax: 'less', label: 'Less' },
- { syntax: 'lisp', label: 'Lisp' },
- { syntax: 'livecodeserver', label: 'LiveCode' },
- { syntax: 'livescript', variants: 'ls', label: 'LiveScript' },
- { syntax: 'llvm', label: 'LLVM IR' },
- { syntax: 'lsl', label: 'LSL (Linden Scripting Language)' },
- { syntax: 'lua', label: 'Lua' },
- { syntax: 'makefile', variants: 'mk, mak, make', label: 'Makefile' },
- { syntax: 'markdown', variants: 'md, mkdown, mkd', label: 'Markdown' },
- { syntax: 'mathematica', variants: 'mma, wl', label: 'Mathematica' },
- { syntax: 'matlab', label: 'Matlab' },
- { syntax: 'maxima', label: 'Maxima' },
- { syntax: 'mel', label: 'MEL' },
- { syntax: 'mercury', variants: 'm, moo', label: 'Mercury' },
- { syntax: 'mipsasm', variants: 'mips', label: 'MIPS Assembly' },
- { syntax: 'mizar', label: 'Mizar' },
- { syntax: 'mojolicious', label: 'Mojolicious' },
- { syntax: 'monkey', label: 'Monkey' },
- { syntax: 'moonscript', variants: 'moon', label: 'MoonScript' },
- { syntax: 'n1ql', label: 'N1QL' },
- { syntax: 'nestedtext', variants: 'nt', label: 'Nested Text' },
- { syntax: 'nginx', variants: 'nginxconf', label: 'Nginx config' },
- { syntax: 'nim', label: 'Nim' },
- { syntax: 'nix', variants: 'nixos', label: 'Nix' },
- { syntax: 'node-repl', label: 'Node REPL' },
- { syntax: 'nsis', label: 'NSIS' },
- {
- syntax: 'objectivec',
- variants: 'mm, objc, obj-c, obj-c++, objective-c++',
- label: 'Objective-C',
- },
- { syntax: 'ocaml', variants: 'ml', label: 'OCaml' },
- { syntax: 'openscad', variants: 'scad', label: 'OpenSCAD' },
- { syntax: 'oxygene', label: 'Oxygene' },
- { syntax: 'parser3', label: 'Parser3' },
- { syntax: 'perl', variants: 'pl, pm', label: 'Perl' },
- { syntax: 'pf', variants: 'pf.conf', label: 'Packet Filter config' },
- { syntax: 'pgsql', variants: 'postgres, postgresql', label: 'PostgreSQL' },
- { syntax: 'php', label: 'PHP' },
- { syntax: 'php-template', label: 'PHP template' },
- { syntax: 'plaintext', variants: 'text, txt', label: 'Plain text' },
- { syntax: 'pony', label: 'Pony' },
- { syntax: 'powershell', variants: 'pwsh, ps, ps1', label: 'PowerShell' },
- { syntax: 'processing', variants: 'pde', label: 'Processing' },
- { syntax: 'profile', label: 'Python profiler' },
- { syntax: 'prolog', label: 'Prolog' },
- { syntax: 'properties', label: '.properties' },
- { syntax: 'protobuf', label: 'Protocol Buffers' },
- { syntax: 'puppet', variants: 'pp', label: 'Puppet' },
- { syntax: 'purebasic', variants: 'pb, pbi', label: 'PureBASIC' },
- { syntax: 'python', variants: 'py, gyp, ipython', label: 'Python' },
- { syntax: 'python-repl', variants: 'pycon', label: 'Python REPL' },
- { syntax: 'q', variants: 'k, kdb', label: 'Q' },
- { syntax: 'qml', variants: 'qt', label: 'QML' },
- { syntax: 'r', label: 'R' },
- { syntax: 'reasonml', variants: 're', label: 'ReasonML' },
- { syntax: 'rib', label: 'RenderMan RIB' },
- { syntax: 'roboconf', variants: 'graph, instances', label: 'Roboconf' },
- { syntax: 'routeros', variants: 'mikrotik', label: 'Microtik RouterOS script' },
- { syntax: 'rsl', label: 'RenderMan RSL' },
- { syntax: 'ruby', variants: 'rb, gemspec, podspec, thor, irb', label: 'Ruby' },
- { syntax: 'ruleslanguage', label: 'Oracle Rules Language' },
- { syntax: 'rust', variants: 'rs', label: 'Rust' },
- { syntax: 'sas', label: 'SAS' },
- { syntax: 'scala', label: 'Scala' },
- { syntax: 'scheme', label: 'Scheme' },
- { syntax: 'scilab', variants: 'sci', label: 'Scilab' },
- { syntax: 'scss', label: 'SCSS' },
- { syntax: 'shell', variants: 'console, shellsession', label: 'Shell Session' },
- { syntax: 'smali', label: 'Smali' },
- { syntax: 'smalltalk', variants: 'st', label: 'Smalltalk' },
- { syntax: 'sml', variants: 'ml', label: 'SML (Standard ML)' },
- { syntax: 'sqf', label: 'SQF' },
- { syntax: 'sql', label: 'SQL' },
- { syntax: 'stan', variants: 'stanfuncs', label: 'Stan' },
- { syntax: 'stata', variants: 'do, ado', label: 'Stata' },
- { syntax: 'step21', variants: 'p21, step, stp', label: 'STEP Part 21' },
- { syntax: 'stylus', variants: 'styl', label: 'Stylus' },
- { syntax: 'subunit', label: 'SubUnit' },
- { syntax: 'swift', label: 'Swift' },
- { syntax: 'taggerscript', label: 'Tagger Script' },
- { syntax: 'tap', label: 'Test Anything Protocol' },
- { syntax: 'tcl', variants: 'tk', label: 'Tcl' },
- { syntax: 'thrift', label: 'Thrift' },
- { syntax: 'tp', label: 'TP' },
- { syntax: 'twig', variants: 'craftcms', label: 'Twig' },
- { syntax: 'typescript', variants: 'ts, tsx', label: 'TypeScript' },
- { syntax: 'vala', label: 'Vala' },
- { syntax: 'vbnet', variants: 'vb', label: 'Visual Basic .NET' },
- { syntax: 'vbscript', variants: 'vbs', label: 'VBScript' },
- { syntax: 'vbscript-html', label: 'VBScript in HTML' },
- { syntax: 'verilog', variants: 'v, sv, svh', label: 'Verilog' },
- { syntax: 'vhdl', label: 'VHDL' },
- { syntax: 'vim', label: 'Vim Script' },
- { syntax: 'wasm', label: 'WebAssembly' },
- { syntax: 'wren', label: 'Wren' },
- { syntax: 'x86asm', label: 'Intel x86 Assembly' },
- { syntax: 'xl', variants: 'tao', label: 'XL' },
- {
- syntax: 'xml',
- variants: 'html, xhtml, rss, atom, xjb, xsd, xsl, plist, wsf, svg',
- label: 'HTML, XML',
- },
- { syntax: 'xquery', variants: 'xpath, xq', label: 'XQuery' },
- { syntax: 'yaml', variants: 'yml', label: 'YAML' },
- { syntax: 'zephir', variants: 'zep', label: 'Zephir' },
-];
-/* eslint-enable @gitlab/require-i18n-strings */
+import CODE_BLOCK_LANGUAGES from '../constants/code_block_languages';
+import languageLoader from './highlight_js_language_loader';
const codeBlockLanguageLoader = {
lowlight,
@@ -245,38 +37,24 @@ const codeBlockLanguageLoader = {
return this.lowlight.registered(language);
},
- loadLanguagesFromDOM(domTree) {
- const languages = [];
-
- domTree.querySelectorAll('pre').forEach((preElement) => {
- languages.push(preElement.getAttribute('lang'));
- });
-
- return this.loadLanguages(languages);
- },
-
loadLanguageFromInputRule(match) {
const { syntax } = this.findLanguageBySyntax(match[1]);
- this.loadLanguages([syntax]);
+ this.loadLanguage(syntax);
return { language: syntax };
},
- loadLanguages(languageList = []) {
- const loaders = languageList
- .filter((languageName) => !this.isLanguageLoaded(languageName))
- .map((languageName) => {
- return import(
- /* webpackChunkName: 'highlight.language.js' */ `highlight.js/lib/languages/${languageName}`
- )
- .then(({ default: language }) => {
- this.lowlight.registerLanguage(languageName, language);
- })
- .catch(() => false);
- });
+ async loadLanguage(languageName) {
+ if (this.isLanguageLoaded(languageName)) return false;
- return Promise.all(loaders);
+ try {
+ const { default: language } = await languageLoader[languageName]();
+ this.lowlight.registerLanguage(languageName, language);
+ return true;
+ } catch {
+ return false;
+ }
},
};
diff --git a/app/assets/javascripts/content_editor/services/content_editor.js b/app/assets/javascripts/content_editor/services/content_editor.js
index 56badf965ee..52dacb84153 100644
--- a/app/assets/javascripts/content_editor/services/content_editor.js
+++ b/app/assets/javascripts/content_editor/services/content_editor.js
@@ -3,12 +3,13 @@ import { LOADING_CONTENT_EVENT, LOADING_SUCCESS_EVENT, LOADING_ERROR_EVENT } fro
/* eslint-disable no-underscore-dangle */
export class ContentEditor {
- constructor({ tiptapEditor, serializer, deserializer, eventHub, languageLoader }) {
+ constructor({ tiptapEditor, serializer, deserializer, assetResolver, eventHub }) {
this._tiptapEditor = tiptapEditor;
this._serializer = serializer;
this._deserializer = deserializer;
this._eventHub = eventHub;
- this._languageLoader = languageLoader;
+ this._assetResolver = assetResolver;
+ this._pristineDoc = null;
}
get tiptapEditor() {
@@ -19,6 +20,10 @@ export class ContentEditor {
return this._eventHub;
}
+ get changed() {
+ return this._pristineDoc?.eq(this.tiptapEditor.state.doc);
+ }
+
get empty() {
const doc = this.tiptapEditor?.state.doc;
@@ -34,28 +39,30 @@ export class ContentEditor {
this._eventHub.dispose();
}
+ deserialize(serializedContent) {
+ const { _tiptapEditor: editor, _deserializer: deserializer } = this;
+
+ return deserializer.deserialize({
+ schema: editor.schema,
+ content: serializedContent,
+ });
+ }
+
+ resolveUrl(canonicalSrc) {
+ return this._assetResolver.resolveUrl(canonicalSrc);
+ }
+
async setSerializedContent(serializedContent) {
- const {
- _tiptapEditor: editor,
- _deserializer: deserializer,
- _eventHub: eventHub,
- _languageLoader: languageLoader,
- } = this;
+ const { _tiptapEditor: editor, _eventHub: eventHub } = this;
const { doc, tr } = editor.state;
const selection = TextSelection.create(doc, 0, doc.content.size);
try {
eventHub.$emit(LOADING_CONTENT_EVENT);
- const result = await deserializer.deserialize({
- schema: editor.schema,
- content: serializedContent,
- });
-
- if (Object.keys(result).length !== 0) {
- const { document, dom } = result;
-
- await languageLoader.loadLanguagesFromDOM(dom);
+ const { document } = await this.deserialize(serializedContent);
+ if (document) {
+ this._pristineDoc = document;
tr.setSelection(selection)
.replaceSelectionWith(document, false)
.setMeta('preventUpdate', true);
@@ -70,8 +77,9 @@ export class ContentEditor {
}
getSerializedContent() {
- const { _tiptapEditor: editor, _serializer: serializer } = this;
+ const { _tiptapEditor: editor, _serializer: serializer, _pristineDoc: pristineDoc } = this;
+ const { doc } = editor.state;
- return serializer.serialize({ schema: editor.schema, content: editor.getJSON() });
+ return serializer.serialize({ doc, pristineDoc });
}
}
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 af19a0ab0e4..15aac3d86e5 100644
--- a/app/assets/javascripts/content_editor/services/create_content_editor.js
+++ b/app/assets/javascripts/content_editor/services/create_content_editor.js
@@ -43,6 +43,7 @@ import OrderedList from '../extensions/ordered_list';
import Paragraph from '../extensions/paragraph';
import PasteMarkdown from '../extensions/paste_markdown';
import Reference from '../extensions/reference';
+import Sourcemap from '../extensions/sourcemap';
import Strike from '../extensions/strike';
import Subscript from '../extensions/subscript';
import Superscript from '../extensions/superscript';
@@ -58,9 +59,10 @@ import Video from '../extensions/video';
import WordBreak from '../extensions/word_break';
import { ContentEditor } from './content_editor';
import createMarkdownSerializer from './markdown_serializer';
-import createMarkdownDeserializer from './markdown_deserializer';
+import createGlApiMarkdownDeserializer from './gl_api_markdown_deserializer';
+import createRemarkMarkdownDeserializer from './remark_markdown_deserializer';
+import createAssetResolver from './asset_resolver';
import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts';
-import languageLoader from './code_block_language_loader';
const createTiptapEditor = ({ extensions = [], ...options } = {}) =>
new Editor({
@@ -94,7 +96,7 @@ export const createContentEditor = ({
BulletList,
Code,
ColorChip,
- CodeBlockHighlight.configure({ lowlight, languageLoader }),
+ CodeBlockHighlight.configure({ lowlight }),
DescriptionItem,
DescriptionList,
Details,
@@ -127,6 +129,7 @@ export const createContentEditor = ({
Paragraph,
PasteMarkdown.configure({ renderMarkdown, eventHub }),
Reference,
+ Sourcemap,
Strike,
Subscript,
Superscript,
@@ -146,7 +149,18 @@ export const createContentEditor = ({
const trackedExtensions = allExtensions.map(trackInputRulesAndShortcuts);
const tiptapEditor = createTiptapEditor({ extensions: trackedExtensions, ...tiptapOptions });
const serializer = createMarkdownSerializer({ serializerConfig });
- const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
+ const deserializer = window.gon?.features?.preserveUnchangedMarkdown
+ ? createRemarkMarkdownDeserializer()
+ : createGlApiMarkdownDeserializer({
+ render: renderMarkdown,
+ });
+ const assetResolver = createAssetResolver({ renderMarkdown });
- return new ContentEditor({ tiptapEditor, serializer, eventHub, deserializer, languageLoader });
+ return new ContentEditor({
+ tiptapEditor,
+ serializer,
+ eventHub,
+ deserializer,
+ assetResolver,
+ });
};
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
new file mode 100644
index 00000000000..dcd56e55268
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/gl_api_markdown_deserializer.js
@@ -0,0 +1,33 @@
+import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model';
+
+export default ({ render }) => {
+ /**
+ * Converts a Markdown string into a ProseMirror JSONDocument based
+ * on a ProseMirror schema.
+ *
+ * @param {Object} options — The schema and content for deserialization
+ * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines
+ * the types of content supported in the document
+ * @param {String} params.content An arbitrary markdown string
+ *
+ * @returns An object with the following properties:
+ * - document: A ProseMirror document object generated from the deserialized Markdown
+ * - dom: The Markdown Deserializer renders Markdown as HTML to generate the ProseMirror
+ * document. The dom property contains the HTML generated from the Markdown Source.
+ */
+ return {
+ deserialize: async ({ schema, content }) => {
+ const html = await render(content);
+
+ if (!html) return {};
+
+ const parser = new DOMParser();
+ const { body } = parser.parseFromString(html, 'text/html');
+
+ // append original source as a comment that nodes can access
+ body.append(document.createComment(content));
+
+ 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
new file mode 100644
index 00000000000..b6a3e0bc26a
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js
@@ -0,0 +1,475 @@
+/**
+ * This module implements a function that converts a Hast Abstract
+ * Syntax Tree (AST) to a ProseMirror document.
+ *
+ * It is based on the prosemirror-markdown’s from_markdown module
+ * https://github.com/ProseMirror/prosemirror-markdown/blob/master/src/from_markdown.js.
+ *
+ * It deviates significantly from the original because
+ * prosemirror-markdown supports converting an markdown-it AST instead of a
+ * HAST one. It also adds sourcemap attributes automatically to every
+ * ProseMirror node and mark created during the conversion process.
+ *
+ * We recommend becoming familiar with HAST and ProseMirror documents to
+ * facilitate the understanding of the behavior implemented in this module.
+ *
+ * Unist syntax tree documentation: https://github.com/syntax-tree/unist
+ * Hast tree documentation: https://github.com/syntax-tree/hast
+ * ProseMirror document documentation: https://prosemirror.net/docs/ref/#model.Document_Structure
+ * visit-parents documentation: https://github.com/syntax-tree/unist-util-visit-parents
+ */
+
+import { Mark } from 'prosemirror-model';
+import { visitParents } from 'unist-util-visit-parents';
+import { toString } from 'hast-util-to-string';
+import { isFunction } from 'lodash';
+
+/**
+ * Merges two ProseMirror text nodes if both text nodes
+ * have the same set of marks.
+ *
+ * @param {ProseMirror.Node} a first ProseMirror node
+ * @param {ProseMirror.Node} b second ProseMirror node
+ * @returns {model.Node} A new text node that results from combining
+ * the text of the two text node parameters or null.
+ */
+function maybeMerge(a, b) {
+ if (a && a.isText && b && b.isText && Mark.sameSet(a.marks, b.marks)) {
+ return a.withText(a.text + b.text);
+ }
+
+ return null;
+}
+
+/**
+ * Creates an object that contains sourcemap position information
+ * included in a Hast Abstract Syntax Tree. The Content
+ * Editor uses the sourcemap information to restore the
+ * original source of a node when the user doesn’t change it.
+ *
+ * Unist syntax tree documentation: https://github.com/syntax-tree/unist
+ * Hast node documentation: https://github.com/syntax-tree/hast
+ *
+ * @param {HastNode} hastNode A Hast node
+ * @param {String} source Markdown source file
+ *
+ * @returns It returns an object with the following attributes:
+ *
+ * - sourceMapKey: A string that uniquely identifies what is
+ * the position of the hast node in the Markdown source file.
+ * - sourceMarkdown: A node’s original Markdown source extrated
+ * from the Markdown source file.
+ */
+function createSourceMapAttributes(hastNode, source) {
+ const { position } = hastNode;
+
+ return {
+ sourceMapKey: `${position.start.offset}:${position.end.offset}`,
+ sourceMarkdown: source.substring(position.start.offset, position.end.offset),
+ };
+}
+
+/**
+ * Compute ProseMirror node’s attributes from a Hast node.
+ * By default, this function includes sourcemap position
+ * information in the object returned.
+ *
+ * Other attributes are retrieved by invoking a getAttrs
+ * function provided by the ProseMirror node factory spec.
+ *
+ * @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
+ *
+ * @returns An object that contains a ProseMirror node’s attributes
+ */
+function getAttrs(proseMirrorNodeSpec, hastNode, hastParents, source) {
+ const { getAttrs: specGetAttrs } = proseMirrorNodeSpec;
+
+ return {
+ ...createSourceMapAttributes(hastNode, source),
+ ...(isFunction(specGetAttrs) ? specGetAttrs(hastNode, hastParents, source) : {}),
+ };
+}
+
+/**
+ * Keeps track of the Hast -> ProseMirror conversion process.
+ *
+ * When the `openNode` method is invoked, it adds the node to a stack
+ * data structure. When the `closeNode` method is invoked, it removes the
+ * last element from the Stack, creates a ProseMirror node, and adds that
+ * ProseMirror node to the previous node in the Stack.
+ *
+ * For example, given a Hast tree with three levels of nodes:
+ *
+ * - blockquote
+ * - paragraph
+ * - text
+ *
+ * 3. text
+ * 2. paragraph
+ * 1. blockquote
+ *
+ * Calling `closeNode` will fold the text node into paragraph. A 2nd
+ * call to this method will fold "paragraph" into "blockquote".
+ *
+ * Mark state
+ *
+ * When the `openMark` method is invoked, this class adds the Mark to a `MarkSet`
+ * object. When a text node is added, it assigns all the opened marks to that text
+ * node and cleans the marks. It takes care of merging text nodes with the same
+ * set of marks as well.
+ */
+class HastToProseMirrorConverterState {
+ constructor() {
+ this.stack = [];
+ this.marks = Mark.none;
+ }
+
+ /**
+ * Gets the first element of the node stack
+ */
+ get top() {
+ return this.stack[this.stack.length - 1];
+ }
+
+ /**
+ * Detects if the node stack is empty
+ */
+ get empty() {
+ return this.stack.length === 0;
+ }
+
+ /**
+ * Creates a text node and adds it to
+ * the top node in the stack.
+ *
+ * It applies the marks stored temporarily
+ * by calling the `addMark` method. After
+ * the text node is added, it clears the mark
+ * set afterward.
+ *
+ * If the top block node has a text
+ * node with the same set of marks as the
+ * text node created, this method merges
+ * both text nodes
+ *
+ * @param {ProseMirror.Schema} schema ProseMirror schema
+ * @param {String} text Text
+ * @returns
+ */
+ addText(schema, text) {
+ if (!text) return;
+ const nodes = this.top.content;
+ const last = nodes[nodes.length - 1];
+ const node = schema.text(text, this.marks);
+ const merged = maybeMerge(last, node);
+
+ if (last && merged) {
+ nodes[nodes.length - 1] = merged;
+ } else {
+ nodes.push(node);
+ }
+
+ this.closeMarks();
+ }
+
+ /**
+ * Adds a mark to the set of marks stored temporarily
+ * until addText is called.
+ * @param {*} markType
+ * @param {*} attrs
+ */
+ openMark(markType, attrs) {
+ this.marks = markType.create(attrs).addToSet(this.marks);
+ }
+
+ /**
+ * Empties the temporary Mark set.
+ */
+ closeMarks() {
+ this.marks = Mark.none;
+ }
+
+ /**
+ * 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 {*} 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 });
+ }
+
+ /**
+ * 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;
+ }
+
+ if (!this.empty) {
+ this.top.content.push(node);
+ }
+
+ return node;
+ }
+
+ closeUntil(hastNode) {
+ while (hastNode !== this.top?.hastNode) {
+ this.closeNode();
+ }
+ }
+}
+
+/**
+ * Create ProseMirror node/mark factories based on one or more
+ * factory specifications.
+ *
+ * Note: Read `createProseMirrorDocFromMdastTree` documentation
+ * for instructions about how to define these specifications.
+ *
+ * @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
+ *
+ * @returns An object that contains ProseMirror node factories
+ */
+const createProseMirrorNodeFactories = (schema, proseMirrorFactorySpecs, source) => {
+ const handlers = {
+ root: (state, hastNode) => state.openNode(schema.topNodeType, hastNode, {}),
+ text: (state, hastNode) => {
+ const { factorySpec } = state.top;
+
+ if (/^\s+$/.test(hastNode.value)) {
+ return;
+ }
+
+ if (factorySpec.wrapTextInParagraph === true) {
+ state.openNode(schema.nodeType('paragraph'));
+ state.addText(schema, hastNode.value);
+ state.closeNode();
+ } else {
+ state.addText(schema, hastNode.value);
+ }
+ },
+ };
+
+ for (const [hastNodeTagName, factorySpec] of Object.entries(proseMirrorFactorySpecs)) {
+ if (factorySpec.block) {
+ handlers[hastNodeTagName] = (state, hastNode, parent, ancestors) => {
+ const nodeType = schema.nodeType(
+ isFunction(factorySpec.block)
+ ? factorySpec.block(hastNode, parent, ancestors)
+ : factorySpec.block,
+ );
+
+ 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();
+ }
+ };
+ } else if (factorySpec.inline) {
+ const nodeType = schema.nodeType(factorySpec.inline);
+ handlers[hastNodeTagName] = (state, hastNode, parent) => {
+ state.closeUntil(parent);
+ state.openNode(
+ nodeType,
+ hastNode,
+ getAttrs(factorySpec, hastNode, parent, source),
+ factorySpec,
+ );
+ // Inline nodes do not have children therefore they are immediately closed
+ state.closeNode();
+ };
+ } else if (factorySpec.mark) {
+ const markType = schema.marks[factorySpec.mark];
+ handlers[hastNodeTagName] = (state, hastNode, parent) => {
+ state.openMark(markType, getAttrs(factorySpec, hastNode, parent, source));
+
+ if (factorySpec.inlineContent) {
+ state.addText(schema, hastNode.value);
+ }
+ };
+ } else {
+ throw new RangeError(`Unrecognized node factory spec ${JSON.stringify(factorySpec)}`);
+ }
+ }
+
+ return handlers;
+};
+
+/**
+ * Converts a Hast AST to a ProseMirror document based on a series
+ * of specifications that describe how to map all the nodes of the former
+ * to ProseMirror nodes or marks.
+ *
+ * The specification object describes how to map a Hast node to a ProseMirror node or mark.
+ * The converter will trigger an error if it doesn’t find a specification
+ * for a Hast node while traversing the AST.
+ *
+ * The object should have the following shape:
+ *
+ * {
+ * [hastNode.tagName]: {
+ * [block|node|mark]: [ProseMirror.Node.name],
+ * ...configurationOptions
+ * }
+ * }
+ *
+ * Where each property in the object represents a HAST node with a given tag name, for example:
+ *
+ * {
+ * h1: {},
+ * h2: {},
+ * table: {},
+ * strong: {},
+ * // etc
+ * }
+ *
+ * You can specify the type of ProseMirror object adding one the following
+ * properties:
+ *
+ * 1. "block": A ProseMirror node that contains one or more children.
+ * 2. "inline": A ProseMirror node that doesn’t contain any children although
+ * it can have inline content like a code block or a reference.
+ * 3. "mark": A ProseMirror mark.
+ *
+ * The value of that property should be the name of the ProseMirror node or mark, i.e:
+ *
+ * {
+ * h1: {
+ * block: 'heading',
+ * },
+ * h2: {
+ * block: 'heading',
+ * },
+ * img: {
+ * node: 'image',
+ * },
+ * strong: {
+ * mark: 'bold',
+ * }
+ * }
+ *
+ * You can compute a ProseMirror’s node or mark name based on the HAST node
+ * by passing a function instead of a String. The converter invokes the function
+ * and provides a HAST node object:
+ *
+ * {
+ * list: {
+ * block: (hastNode) => {
+ * let type = 'bulletList';
+
+ * if (hastNode.children.some(isTaskItem)) {
+ * type = 'taskList';
+ * } else if (hastNode.ordered) {
+ * type = 'orderedList';
+ * }
+
+ * return type;
+ * }
+ * }
+ * }
+ *
+ * Configuration options
+ * ----------------------
+ *
+ * You can customize the conversion process for every node or mark
+ * setting the following properties in the specification object:
+ *
+ * **getAttrs**
+ *
+ * Computes a ProseMirror node or mark attributes. The converter will invoke
+ * `getAttrs` with the following parameters:
+ *
+ * 1. hastNode: The hast node
+ * 2. hasParents: All the hast node’s ancestors up to the root node
+ * 3. source: Markdown source file’s content
+ *
+ * **wrapTextInParagraph**
+ *
+ * This property only applies to block nodes. If a block node contains text,
+ * it will wrap that text in a paragraph. This is useful for ProseMirror block
+ * nodes that don’t allow text directly such as list items and tables.
+ *
+ * **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.
+ *
+ * @param {model.Document_Schema} params.schema A ProseMirror schema that specifies the shape
+ * of the ProseMirror document.
+ * @param {Object} params.factorySpec A factory specification as described above
+ * @param {Hast} params.tree https://github.com/syntax-tree/hast
+ * @param {String} params.source Markdown source from which the MDast tree was generated
+ *
+ * @returns A ProseMirror document
+ */
+export const createProseMirrorDocFromMdastTree = ({ schema, factorySpecs, tree, source }) => {
+ const proseMirrorNodeFactories = createProseMirrorNodeFactories(schema, factorySpecs, source);
+ const state = new HastToProseMirrorConverterState();
+
+ visitParents(tree, (hastNode, ancestors) => {
+ const parent = ancestors[ancestors.length - 1];
+ const skipChildren = factorySpecs[hastNode.tagName]?.skipChildren;
+
+ const handler = proseMirrorNodeFactories[hastNode.tagName || hastNode.type];
+
+ if (!handler) {
+ throw new Error(
+ `Hast node of type "${
+ hastNode.tagName || hastNode.type
+ }" not supported by this converter. Please, provide an specification.`,
+ );
+ }
+
+ handler(state, hastNode, parent, ancestors);
+
+ return skipChildren === true ? 'skip' : true;
+ });
+
+ let doc;
+
+ do {
+ doc = state.closeNode();
+ } while (!state.empty);
+
+ return doc;
+};
diff --git a/app/assets/javascripts/content_editor/services/highlight_js_language_loader.js b/app/assets/javascripts/content_editor/services/highlight_js_language_loader.js
new file mode 100644
index 00000000000..a0ebbebed4e
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/highlight_js_language_loader.js
@@ -0,0 +1,248 @@
+/**
+ * This file is generated based on the contents of highlight.js/lib/languages to avoid
+ * utilizing dynamic expressions within `import()` which were the source of some
+ * confusion when attempting to produce deterministic webpack compilations across
+ * multiple build environments.
+ *
+ * This list of highlight-able languages will need to be updated as new options are
+ * introduced within the highlight.js dependency.
+ */
+
+export default {
+ '1c': () => import(/* webpackChunkName: 'hl-1c' */ 'highlight.js/lib/languages/1c'),
+ abnf: () => import(/* webpackChunkName: 'hl-abnf' */ 'highlight.js/lib/languages/abnf'),
+ accesslog: () =>
+ import(/* webpackChunkName: 'hl-accesslog' */ 'highlight.js/lib/languages/accesslog'),
+ actionscript: () =>
+ import(/* webpackChunkName: 'hl-actionscript' */ 'highlight.js/lib/languages/actionscript'),
+ ada: () => import(/* webpackChunkName: 'hl-ada' */ 'highlight.js/lib/languages/ada'),
+ angelscript: () =>
+ import(/* webpackChunkName: 'hl-angelscript' */ 'highlight.js/lib/languages/angelscript'),
+ apache: () => import(/* webpackChunkName: 'hl-apache' */ 'highlight.js/lib/languages/apache'),
+ applescript: () =>
+ import(/* webpackChunkName: 'hl-applescript' */ 'highlight.js/lib/languages/applescript'),
+ arcade: () => import(/* webpackChunkName: 'hl-arcade' */ 'highlight.js/lib/languages/arcade'),
+ arduino: () => import(/* webpackChunkName: 'hl-arduino' */ 'highlight.js/lib/languages/arduino'),
+ armasm: () => import(/* webpackChunkName: 'hl-armasm' */ 'highlight.js/lib/languages/armasm'),
+ asciidoc: () =>
+ import(/* webpackChunkName: 'hl-asciidoc' */ 'highlight.js/lib/languages/asciidoc'),
+ aspectj: () => import(/* webpackChunkName: 'hl-aspectj' */ 'highlight.js/lib/languages/aspectj'),
+ autohotkey: () =>
+ import(/* webpackChunkName: 'hl-autohotkey' */ 'highlight.js/lib/languages/autohotkey'),
+ autoit: () => import(/* webpackChunkName: 'hl-autoit' */ 'highlight.js/lib/languages/autoit'),
+ avrasm: () => import(/* webpackChunkName: 'hl-avrasm' */ 'highlight.js/lib/languages/avrasm'),
+ awk: () => import(/* webpackChunkName: 'hl-awk' */ 'highlight.js/lib/languages/awk'),
+ axapta: () => import(/* webpackChunkName: 'hl-axapta' */ 'highlight.js/lib/languages/axapta'),
+ bash: () => import(/* webpackChunkName: 'hl-bash' */ 'highlight.js/lib/languages/bash'),
+ basic: () => import(/* webpackChunkName: 'hl-basic' */ 'highlight.js/lib/languages/basic'),
+ bnf: () => import(/* webpackChunkName: 'hl-bnf' */ 'highlight.js/lib/languages/bnf'),
+ brainfuck: () =>
+ import(/* webpackChunkName: 'hl-brainfuck' */ 'highlight.js/lib/languages/brainfuck'),
+ c: () => import(/* webpackChunkName: 'hl-c' */ 'highlight.js/lib/languages/c'),
+ cal: () => import(/* webpackChunkName: 'hl-cal' */ 'highlight.js/lib/languages/cal'),
+ capnproto: () =>
+ import(/* webpackChunkName: 'hl-capnproto' */ 'highlight.js/lib/languages/capnproto'),
+ ceylon: () => import(/* webpackChunkName: 'hl-ceylon' */ 'highlight.js/lib/languages/ceylon'),
+ clean: () => import(/* webpackChunkName: 'hl-clean' */ 'highlight.js/lib/languages/clean'),
+ 'clojure-repl': () =>
+ import(/* webpackChunkName: 'hl-clojure-repl' */ 'highlight.js/lib/languages/clojure-repl'),
+ clojure: () => import(/* webpackChunkName: 'hl-clojure' */ 'highlight.js/lib/languages/clojure'),
+ cmake: () => import(/* webpackChunkName: 'hl-cmake' */ 'highlight.js/lib/languages/cmake'),
+ coffeescript: () =>
+ import(/* webpackChunkName: 'hl-coffeescript' */ 'highlight.js/lib/languages/coffeescript'),
+ coq: () => import(/* webpackChunkName: 'hl-coq' */ 'highlight.js/lib/languages/coq'),
+ cos: () => import(/* webpackChunkName: 'hl-cos' */ 'highlight.js/lib/languages/cos'),
+ cpp: () => import(/* webpackChunkName: 'hl-cpp' */ 'highlight.js/lib/languages/cpp'),
+ crmsh: () => import(/* webpackChunkName: 'hl-crmsh' */ 'highlight.js/lib/languages/crmsh'),
+ crystal: () => import(/* webpackChunkName: 'hl-crystal' */ 'highlight.js/lib/languages/crystal'),
+ csharp: () => import(/* webpackChunkName: 'hl-csharp' */ 'highlight.js/lib/languages/csharp'),
+ csp: () => import(/* webpackChunkName: 'hl-csp' */ 'highlight.js/lib/languages/csp'),
+ css: () => import(/* webpackChunkName: 'hl-css' */ 'highlight.js/lib/languages/css'),
+ d: () => import(/* webpackChunkName: 'hl-d' */ 'highlight.js/lib/languages/d'),
+ dart: () => import(/* webpackChunkName: 'hl-dart' */ 'highlight.js/lib/languages/dart'),
+ delphi: () => import(/* webpackChunkName: 'hl-delphi' */ 'highlight.js/lib/languages/delphi'),
+ diff: () => import(/* webpackChunkName: 'hl-diff' */ 'highlight.js/lib/languages/diff'),
+ django: () => import(/* webpackChunkName: 'hl-django' */ 'highlight.js/lib/languages/django'),
+ dns: () => import(/* webpackChunkName: 'hl-dns' */ 'highlight.js/lib/languages/dns'),
+ dockerfile: () =>
+ import(/* webpackChunkName: 'hl-dockerfile' */ 'highlight.js/lib/languages/dockerfile'),
+ dos: () => import(/* webpackChunkName: 'hl-dos' */ 'highlight.js/lib/languages/dos'),
+ dsconfig: () =>
+ import(/* webpackChunkName: 'hl-dsconfig' */ 'highlight.js/lib/languages/dsconfig'),
+ dts: () => import(/* webpackChunkName: 'hl-dts' */ 'highlight.js/lib/languages/dts'),
+ dust: () => import(/* webpackChunkName: 'hl-dust' */ 'highlight.js/lib/languages/dust'),
+ ebnf: () => import(/* webpackChunkName: 'hl-ebnf' */ 'highlight.js/lib/languages/ebnf'),
+ elixir: () => import(/* webpackChunkName: 'hl-elixir' */ 'highlight.js/lib/languages/elixir'),
+ elm: () => import(/* webpackChunkName: 'hl-elm' */ 'highlight.js/lib/languages/elm'),
+ erb: () => import(/* webpackChunkName: 'hl-erb' */ 'highlight.js/lib/languages/erb'),
+ 'erlang-repl': () =>
+ import(/* webpackChunkName: 'hl-erlang-repl' */ 'highlight.js/lib/languages/erlang-repl'),
+ erlang: () => import(/* webpackChunkName: 'hl-erlang' */ 'highlight.js/lib/languages/erlang'),
+ excel: () => import(/* webpackChunkName: 'hl-excel' */ 'highlight.js/lib/languages/excel'),
+ fix: () => import(/* webpackChunkName: 'hl-fix' */ 'highlight.js/lib/languages/fix'),
+ flix: () => import(/* webpackChunkName: 'hl-flix' */ 'highlight.js/lib/languages/flix'),
+ fortran: () => import(/* webpackChunkName: 'hl-fortran' */ 'highlight.js/lib/languages/fortran'),
+ fsharp: () => import(/* webpackChunkName: 'hl-fsharp' */ 'highlight.js/lib/languages/fsharp'),
+ gams: () => import(/* webpackChunkName: 'hl-gams' */ 'highlight.js/lib/languages/gams'),
+ gauss: () => import(/* webpackChunkName: 'hl-gauss' */ 'highlight.js/lib/languages/gauss'),
+ gcode: () => import(/* webpackChunkName: 'hl-gcode' */ 'highlight.js/lib/languages/gcode'),
+ gherkin: () => import(/* webpackChunkName: 'hl-gherkin' */ 'highlight.js/lib/languages/gherkin'),
+ glsl: () => import(/* webpackChunkName: 'hl-glsl' */ 'highlight.js/lib/languages/glsl'),
+ gml: () => import(/* webpackChunkName: 'hl-gml' */ 'highlight.js/lib/languages/gml'),
+ go: () => import(/* webpackChunkName: 'hl-go' */ 'highlight.js/lib/languages/go'),
+ golo: () => import(/* webpackChunkName: 'hl-golo' */ 'highlight.js/lib/languages/golo'),
+ gradle: () => import(/* webpackChunkName: 'hl-gradle' */ 'highlight.js/lib/languages/gradle'),
+ groovy: () => import(/* webpackChunkName: 'hl-groovy' */ 'highlight.js/lib/languages/groovy'),
+ haml: () => import(/* webpackChunkName: 'hl-haml' */ 'highlight.js/lib/languages/haml'),
+ handlebars: () =>
+ import(/* webpackChunkName: 'hl-handlebars' */ 'highlight.js/lib/languages/handlebars'),
+ haskell: () => import(/* webpackChunkName: 'hl-haskell' */ 'highlight.js/lib/languages/haskell'),
+ haxe: () => import(/* webpackChunkName: 'hl-haxe' */ 'highlight.js/lib/languages/haxe'),
+ hsp: () => import(/* webpackChunkName: 'hl-hsp' */ 'highlight.js/lib/languages/hsp'),
+ http: () => import(/* webpackChunkName: 'hl-http' */ 'highlight.js/lib/languages/http'),
+ hy: () => import(/* webpackChunkName: 'hl-hy' */ 'highlight.js/lib/languages/hy'),
+ inform7: () => import(/* webpackChunkName: 'hl-inform7' */ 'highlight.js/lib/languages/inform7'),
+ ini: () => import(/* webpackChunkName: 'hl-ini' */ 'highlight.js/lib/languages/ini'),
+ irpf90: () => import(/* webpackChunkName: 'hl-irpf90' */ 'highlight.js/lib/languages/irpf90'),
+ isbl: () => import(/* webpackChunkName: 'hl-isbl' */ 'highlight.js/lib/languages/isbl'),
+ java: () => import(/* webpackChunkName: 'hl-java' */ 'highlight.js/lib/languages/java'),
+ javascript: () =>
+ import(/* webpackChunkName: 'hl-javascript' */ 'highlight.js/lib/languages/javascript'),
+ 'jboss-cli': () =>
+ import(/* webpackChunkName: 'hl-jboss-cli' */ 'highlight.js/lib/languages/jboss-cli'),
+ json: () => import(/* webpackChunkName: 'hl-json' */ 'highlight.js/lib/languages/json'),
+ 'julia-repl': () =>
+ import(/* webpackChunkName: 'hl-julia-repl' */ 'highlight.js/lib/languages/julia-repl'),
+ julia: () => import(/* webpackChunkName: 'hl-julia' */ 'highlight.js/lib/languages/julia'),
+ kotlin: () => import(/* webpackChunkName: 'hl-kotlin' */ 'highlight.js/lib/languages/kotlin'),
+ lasso: () => import(/* webpackChunkName: 'hl-lasso' */ 'highlight.js/lib/languages/lasso'),
+ latex: () => import(/* webpackChunkName: 'hl-latex' */ 'highlight.js/lib/languages/latex'),
+ ldif: () => import(/* webpackChunkName: 'hl-ldif' */ 'highlight.js/lib/languages/ldif'),
+ leaf: () => import(/* webpackChunkName: 'hl-leaf' */ 'highlight.js/lib/languages/leaf'),
+ less: () => import(/* webpackChunkName: 'hl-less' */ 'highlight.js/lib/languages/less'),
+ lisp: () => import(/* webpackChunkName: 'hl-lisp' */ 'highlight.js/lib/languages/lisp'),
+ livecodeserver: () =>
+ import(/* webpackChunkName: 'hl-livecodeserver' */ 'highlight.js/lib/languages/livecodeserver'),
+ livescript: () =>
+ import(/* webpackChunkName: 'hl-livescript' */ 'highlight.js/lib/languages/livescript'),
+ llvm: () => import(/* webpackChunkName: 'hl-llvm' */ 'highlight.js/lib/languages/llvm'),
+ lsl: () => import(/* webpackChunkName: 'hl-lsl' */ 'highlight.js/lib/languages/lsl'),
+ lua: () => import(/* webpackChunkName: 'hl-lua' */ 'highlight.js/lib/languages/lua'),
+ makefile: () =>
+ import(/* webpackChunkName: 'hl-makefile' */ 'highlight.js/lib/languages/makefile'),
+ markdown: () =>
+ import(/* webpackChunkName: 'hl-markdown' */ 'highlight.js/lib/languages/markdown'),
+ mathematica: () =>
+ import(/* webpackChunkName: 'hl-mathematica' */ 'highlight.js/lib/languages/mathematica'),
+ matlab: () => import(/* webpackChunkName: 'hl-matlab' */ 'highlight.js/lib/languages/matlab'),
+ maxima: () => import(/* webpackChunkName: 'hl-maxima' */ 'highlight.js/lib/languages/maxima'),
+ mel: () => import(/* webpackChunkName: 'hl-mel' */ 'highlight.js/lib/languages/mel'),
+ mercury: () => import(/* webpackChunkName: 'hl-mercury' */ 'highlight.js/lib/languages/mercury'),
+ mipsasm: () => import(/* webpackChunkName: 'hl-mipsasm' */ 'highlight.js/lib/languages/mipsasm'),
+ mizar: () => import(/* webpackChunkName: 'hl-mizar' */ 'highlight.js/lib/languages/mizar'),
+ mojolicious: () =>
+ import(/* webpackChunkName: 'hl-mojolicious' */ 'highlight.js/lib/languages/mojolicious'),
+ monkey: () => import(/* webpackChunkName: 'hl-monkey' */ 'highlight.js/lib/languages/monkey'),
+ moonscript: () =>
+ import(/* webpackChunkName: 'hl-moonscript' */ 'highlight.js/lib/languages/moonscript'),
+ n1ql: () => import(/* webpackChunkName: 'hl-n1ql' */ 'highlight.js/lib/languages/n1ql'),
+ nestedtext: () =>
+ import(/* webpackChunkName: 'hl-nestedtext' */ 'highlight.js/lib/languages/nestedtext'),
+ nginx: () => import(/* webpackChunkName: 'hl-nginx' */ 'highlight.js/lib/languages/nginx'),
+ nim: () => import(/* webpackChunkName: 'hl-nim' */ 'highlight.js/lib/languages/nim'),
+ nix: () => import(/* webpackChunkName: 'hl-nix' */ 'highlight.js/lib/languages/nix'),
+ 'node-repl': () =>
+ import(/* webpackChunkName: 'hl-node-repl' */ 'highlight.js/lib/languages/node-repl'),
+ nsis: () => import(/* webpackChunkName: 'hl-nsis' */ 'highlight.js/lib/languages/nsis'),
+ objectivec: () =>
+ import(/* webpackChunkName: 'hl-objectivec' */ 'highlight.js/lib/languages/objectivec'),
+ ocaml: () => import(/* webpackChunkName: 'hl-ocaml' */ 'highlight.js/lib/languages/ocaml'),
+ openscad: () =>
+ import(/* webpackChunkName: 'hl-openscad' */ 'highlight.js/lib/languages/openscad'),
+ oxygene: () => import(/* webpackChunkName: 'hl-oxygene' */ 'highlight.js/lib/languages/oxygene'),
+ parser3: () => import(/* webpackChunkName: 'hl-parser3' */ 'highlight.js/lib/languages/parser3'),
+ perl: () => import(/* webpackChunkName: 'hl-perl' */ 'highlight.js/lib/languages/perl'),
+ pf: () => import(/* webpackChunkName: 'hl-pf' */ 'highlight.js/lib/languages/pf'),
+ pgsql: () => import(/* webpackChunkName: 'hl-pgsql' */ 'highlight.js/lib/languages/pgsql'),
+ 'php-template': () =>
+ import(/* webpackChunkName: 'hl-php-template' */ 'highlight.js/lib/languages/php-template'),
+ php: () => import(/* webpackChunkName: 'hl-php' */ 'highlight.js/lib/languages/php'),
+ plaintext: () =>
+ import(/* webpackChunkName: 'hl-plaintext' */ 'highlight.js/lib/languages/plaintext'),
+ pony: () => import(/* webpackChunkName: 'hl-pony' */ 'highlight.js/lib/languages/pony'),
+ powershell: () =>
+ import(/* webpackChunkName: 'hl-powershell' */ 'highlight.js/lib/languages/powershell'),
+ processing: () =>
+ import(/* webpackChunkName: 'hl-processing' */ 'highlight.js/lib/languages/processing'),
+ profile: () => import(/* webpackChunkName: 'hl-profile' */ 'highlight.js/lib/languages/profile'),
+ prolog: () => import(/* webpackChunkName: 'hl-prolog' */ 'highlight.js/lib/languages/prolog'),
+ properties: () =>
+ import(/* webpackChunkName: 'hl-properties' */ 'highlight.js/lib/languages/properties'),
+ protobuf: () =>
+ import(/* webpackChunkName: 'hl-protobuf' */ 'highlight.js/lib/languages/protobuf'),
+ puppet: () => import(/* webpackChunkName: 'hl-puppet' */ 'highlight.js/lib/languages/puppet'),
+ purebasic: () =>
+ import(/* webpackChunkName: 'hl-purebasic' */ 'highlight.js/lib/languages/purebasic'),
+ 'python-repl': () =>
+ import(/* webpackChunkName: 'hl-python-repl' */ 'highlight.js/lib/languages/python-repl'),
+ python: () => import(/* webpackChunkName: 'hl-python' */ 'highlight.js/lib/languages/python'),
+ q: () => import(/* webpackChunkName: 'hl-q' */ 'highlight.js/lib/languages/q'),
+ qml: () => import(/* webpackChunkName: 'hl-qml' */ 'highlight.js/lib/languages/qml'),
+ r: () => import(/* webpackChunkName: 'hl-r' */ 'highlight.js/lib/languages/r'),
+ reasonml: () =>
+ import(/* webpackChunkName: 'hl-reasonml' */ 'highlight.js/lib/languages/reasonml'),
+ rib: () => import(/* webpackChunkName: 'hl-rib' */ 'highlight.js/lib/languages/rib'),
+ roboconf: () =>
+ import(/* webpackChunkName: 'hl-roboconf' */ 'highlight.js/lib/languages/roboconf'),
+ routeros: () =>
+ import(/* webpackChunkName: 'hl-routeros' */ 'highlight.js/lib/languages/routeros'),
+ rsl: () => import(/* webpackChunkName: 'hl-rsl' */ 'highlight.js/lib/languages/rsl'),
+ ruby: () => import(/* webpackChunkName: 'hl-ruby' */ 'highlight.js/lib/languages/ruby'),
+ ruleslanguage: () =>
+ import(/* webpackChunkName: 'hl-ruleslanguage' */ 'highlight.js/lib/languages/ruleslanguage'),
+ rust: () => import(/* webpackChunkName: 'hl-rust' */ 'highlight.js/lib/languages/rust'),
+ sas: () => import(/* webpackChunkName: 'hl-sas' */ 'highlight.js/lib/languages/sas'),
+ scala: () => import(/* webpackChunkName: 'hl-scala' */ 'highlight.js/lib/languages/scala'),
+ scheme: () => import(/* webpackChunkName: 'hl-scheme' */ 'highlight.js/lib/languages/scheme'),
+ scilab: () => import(/* webpackChunkName: 'hl-scilab' */ 'highlight.js/lib/languages/scilab'),
+ scss: () => import(/* webpackChunkName: 'hl-scss' */ 'highlight.js/lib/languages/scss'),
+ shell: () => import(/* webpackChunkName: 'hl-shell' */ 'highlight.js/lib/languages/shell'),
+ smali: () => import(/* webpackChunkName: 'hl-smali' */ 'highlight.js/lib/languages/smali'),
+ smalltalk: () =>
+ import(/* webpackChunkName: 'hl-smalltalk' */ 'highlight.js/lib/languages/smalltalk'),
+ sml: () => import(/* webpackChunkName: 'hl-sml' */ 'highlight.js/lib/languages/sml'),
+ sqf: () => import(/* webpackChunkName: 'hl-sqf' */ 'highlight.js/lib/languages/sqf'),
+ sql: () => import(/* webpackChunkName: 'hl-sql' */ 'highlight.js/lib/languages/sql'),
+ stan: () => import(/* webpackChunkName: 'hl-stan' */ 'highlight.js/lib/languages/stan'),
+ stata: () => import(/* webpackChunkName: 'hl-stata' */ 'highlight.js/lib/languages/stata'),
+ step21: () => import(/* webpackChunkName: 'hl-step21' */ 'highlight.js/lib/languages/step21'),
+ stylus: () => import(/* webpackChunkName: 'hl-stylus' */ 'highlight.js/lib/languages/stylus'),
+ subunit: () => import(/* webpackChunkName: 'hl-subunit' */ 'highlight.js/lib/languages/subunit'),
+ swift: () => import(/* webpackChunkName: 'hl-swift' */ 'highlight.js/lib/languages/swift'),
+ taggerscript: () =>
+ import(/* webpackChunkName: 'hl-taggerscript' */ 'highlight.js/lib/languages/taggerscript'),
+ tap: () => import(/* webpackChunkName: 'hl-tap' */ 'highlight.js/lib/languages/tap'),
+ tcl: () => import(/* webpackChunkName: 'hl-tcl' */ 'highlight.js/lib/languages/tcl'),
+ thrift: () => import(/* webpackChunkName: 'hl-thrift' */ 'highlight.js/lib/languages/thrift'),
+ tp: () => import(/* webpackChunkName: 'hl-tp' */ 'highlight.js/lib/languages/tp'),
+ twig: () => import(/* webpackChunkName: 'hl-twig' */ 'highlight.js/lib/languages/twig'),
+ typescript: () =>
+ import(/* webpackChunkName: 'hl-typescript' */ 'highlight.js/lib/languages/typescript'),
+ vala: () => import(/* webpackChunkName: 'hl-vala' */ 'highlight.js/lib/languages/vala'),
+ vbnet: () => import(/* webpackChunkName: 'hl-vbnet' */ 'highlight.js/lib/languages/vbnet'),
+ 'vbscript-html': () =>
+ import(/* webpackChunkName: 'hl-vbscript-html' */ 'highlight.js/lib/languages/vbscript-html'),
+ vbscript: () =>
+ import(/* webpackChunkName: 'hl-vbscript' */ 'highlight.js/lib/languages/vbscript'),
+ verilog: () => import(/* webpackChunkName: 'hl-verilog' */ 'highlight.js/lib/languages/verilog'),
+ vhdl: () => import(/* webpackChunkName: 'hl-vhdl' */ 'highlight.js/lib/languages/vhdl'),
+ vim: () => import(/* webpackChunkName: 'hl-vim' */ 'highlight.js/lib/languages/vim'),
+ wasm: () => import(/* webpackChunkName: 'hl-wasm' */ 'highlight.js/lib/languages/wasm'),
+ wren: () => import(/* webpackChunkName: 'hl-wren' */ 'highlight.js/lib/languages/wren'),
+ x86asm: () => import(/* webpackChunkName: 'hl-x86asm' */ 'highlight.js/lib/languages/x86asm'),
+ xl: () => import(/* webpackChunkName: 'hl-xl' */ 'highlight.js/lib/languages/xl'),
+ xml: () => import(/* webpackChunkName: 'hl-xml' */ 'highlight.js/lib/languages/xml'),
+ xquery: () => import(/* webpackChunkName: 'hl-xquery' */ 'highlight.js/lib/languages/xquery'),
+ yaml: () => import(/* webpackChunkName: 'hl-yaml' */ 'highlight.js/lib/languages/yaml'),
+ zephir: () => import(/* webpackChunkName: 'hl-zephir' */ 'highlight.js/lib/languages/zephir'),
+};
diff --git a/app/assets/javascripts/content_editor/services/markdown_deserializer.js b/app/assets/javascripts/content_editor/services/markdown_deserializer.js
deleted file mode 100644
index cd4863d8eac..00000000000
--- a/app/assets/javascripts/content_editor/services/markdown_deserializer.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model';
-
-export default ({ render }) => {
- /**
- * Converts a Markdown string into a ProseMirror JSONDocument based
- * on a ProseMirror schema.
- *
- * @param {Object} options — The schema and content for deserialization
- * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines
- * the types of content supported in the document
- * @param {String} params.content An arbitrary markdown string
- *
- * @returns An object with the following properties:
- * - document: A ProseMirror document object generated from the deserialized Markdown
- * - dom: The Markdown Deserializer renders Markdown as HTML to generate the ProseMirror
- * document. The dom property contains the HTML generated from the Markdown Source.
- */
- return {
- deserialize: async ({ schema, content }) => {
- const html = await render(content);
-
- if (!html) return {};
-
- const parser = new DOMParser();
- const { body } = parser.parseFromString(html, 'text/html');
-
- // append original source as a comment that nodes can access
- body.append(document.createComment(content));
-
- return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body), dom: body };
- },
- };
-};
diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js
index c2be7bc9195..d665f24bba1 100644
--- a/app/assets/javascripts/content_editor/services/markdown_serializer.js
+++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js
@@ -48,7 +48,6 @@ import Text from '../extensions/text';
import Video from '../extensions/video';
import WordBreak from '../extensions/word_break';
import {
- isPlainURL,
renderCodeBlock,
renderHardBreak,
renderTable,
@@ -61,36 +60,30 @@ import {
renderPlayable,
renderHTMLNode,
renderContent,
+ preserveUnchanged,
+ bold,
+ italic,
+ link,
+ code,
} from './serialization_helpers';
const defaultSerializerConfig = {
marks: {
- [Bold.name]: defaultMarkdownSerializer.marks.strong,
- [Italic.name]: { open: '_', close: '_', mixable: true, expelEnclosingWhitespace: true },
- [Code.name]: defaultMarkdownSerializer.marks.code,
+ [Bold.name]: bold,
+ [Italic.name]: italic,
+ [Code.name]: code,
[Subscript.name]: { open: '<sub>', close: '</sub>', mixable: true },
[Superscript.name]: { open: '<sup>', close: '</sup>', mixable: true },
[InlineDiff.name]: {
mixable: true,
- open(state, mark) {
+ open(_, mark) {
return mark.attrs.type === 'addition' ? '{+' : '{-';
},
- close(state, mark) {
+ close(_, mark) {
return mark.attrs.type === 'addition' ? '+}' : '-}';
},
},
- [Link.name]: {
- open(state, mark, parent, index) {
- return isPlainURL(mark, parent, index, 1) ? '<' : '[';
- },
- close(state, mark, parent, index) {
- const href = mark.attrs.canonicalSrc || mark.attrs.href;
-
- return isPlainURL(mark, parent, index, -1)
- ? '>'
- : `](${state.esc(href)}${mark.attrs.title ? ` ${state.quote(mark.attrs.title)}` : ''})`;
- },
- },
+ [Link.name]: link,
[MathInline.name]: {
open: (...args) => `$${defaultMarkdownSerializer.marks.code.open(...args)}`,
close: (...args) => `${defaultMarkdownSerializer.marks.code.close(...args)}$`,
@@ -119,7 +112,7 @@ const defaultSerializerConfig = {
nodes: {
[Audio.name]: renderPlayable,
- [Blockquote.name]: (state, node) => {
+ [Blockquote.name]: preserveUnchanged((state, node) => {
if (node.attrs.multiline) {
state.write('>>>');
state.ensureNewLine();
@@ -130,9 +123,9 @@ const defaultSerializerConfig = {
} else {
state.wrapBlock('> ', null, node, () => state.renderContent(node));
}
- },
- [BulletList.name]: defaultMarkdownSerializer.nodes.bullet_list,
- [CodeBlockHighlight.name]: renderCodeBlock,
+ }),
+ [BulletList.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.bullet_list),
+ [CodeBlockHighlight.name]: preserveUnchanged(renderCodeBlock),
[Diagram.name]: renderCodeBlock,
[Division.name]: (state, node) => {
if (node.attrs.className?.includes('js-markdown-code')) {
@@ -189,13 +182,13 @@ const defaultSerializerConfig = {
},
[Figure.name]: renderHTMLNode('figure'),
[FigureCaption.name]: renderHTMLNode('figcaption'),
- [HardBreak.name]: renderHardBreak,
- [Heading.name]: defaultMarkdownSerializer.nodes.heading,
- [HorizontalRule.name]: defaultMarkdownSerializer.nodes.horizontal_rule,
- [Image.name]: renderImage,
- [ListItem.name]: defaultMarkdownSerializer.nodes.list_item,
- [OrderedList.name]: renderOrderedList,
- [Paragraph.name]: defaultMarkdownSerializer.nodes.paragraph,
+ [HardBreak.name]: preserveUnchanged(renderHardBreak),
+ [Heading.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.heading),
+ [HorizontalRule.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.horizontal_rule),
+ [Image.name]: preserveUnchanged(renderImage),
+ [ListItem.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.list_item),
+ [OrderedList.name]: preserveUnchanged(renderOrderedList),
+ [Paragraph.name]: preserveUnchanged(defaultMarkdownSerializer.nodes.paragraph),
[Reference.name]: (state, node) => {
state.write(node.attrs.originalText || node.attrs.text);
},
@@ -221,29 +214,60 @@ const defaultSerializerConfig = {
},
};
+const createChangeTracker = (doc, pristineDoc) => {
+ const changeTracker = new WeakMap();
+ const pristineSourceMarkdownMap = new Map();
+
+ if (doc && pristineDoc) {
+ pristineDoc.descendants((node) => {
+ if (node.attrs.sourceMapKey) {
+ pristineSourceMarkdownMap.set(`${node.attrs.sourceMapKey}${node.type.name}`, node);
+ }
+ });
+ doc.descendants((node) => {
+ const pristineNode = pristineSourceMarkdownMap.get(
+ `${node.attrs.sourceMapKey}${node.type.name}`,
+ );
+
+ if (pristineNode) {
+ changeTracker.set(node, node.eq(pristineNode));
+ }
+ });
+ }
+
+ return changeTracker;
+};
+
/**
- * A markdown serializer converts arbitrary Markdown content
- * into a ProseMirror document and viceversa. To convert Markdown
- * into a ProseMirror document, the Markdown should be rendered.
+ * Converts a ProseMirror document to Markdown. See the
+ * following documentation to learn how to implement
+ * custom node and mark serializer functions.
+ *
+ * https://github.com/prosemirror/prosemirror-markdown
*
- * The client should provide a render function to allow flexibility
- * on the desired rendering approach.
+ * @param {Object} params.nodes ProseMirror node serializer functions
+ * @param {Object} params.marks ProseMirror marks serializer config
*
- * @param {Function} params.render Render function
- * that parses the Markdown and converts it into HTML.
* @returns a markdown serializer
*/
export default ({ serializerConfig = {} } = {}) => ({
/**
- * Converts a ProseMirror JSONDocument based
- * on a ProseMirror schema into Markdown
- * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines
- * the types of content supported in the document
- * @param {String} params.content A ProseMirror JSONDocument
- * @returns A Markdown string
+ * Serializes a ProseMirror document as Markdown. If a node contains
+ * sourcemap metadata, the serializer is capable of restoring the
+ * Markdown from which the node was generated using a Markdown
+ * deserializer.
+ *
+ * See the Sourcemap metadata extension and the remark_markdown_deserializer
+ * service for more information.
+ *
+ * @param {ProseMirror.Node} params.doc ProseMirror document to convert into Markdown
+ * @param {ProseMirror.Node} params.pristineDoc Pristine version of the document that
+ * should be converted into Markdown. This is used to detect which nodes in the document
+ * changed.
+ * @returns A String that represents the serialized document as Markdown
*/
- serialize: ({ schema, content }) => {
- const proseMirrorDocument = schema.nodeFromJSON(content);
+ serialize: ({ doc, pristineDoc }) => {
+ const changeTracker = createChangeTracker(doc, pristineDoc);
const serializer = new ProseMirrorMarkdownSerializer(
{
...defaultSerializerConfig.nodes,
@@ -255,8 +279,9 @@ export default ({ serializerConfig = {} } = {}) => ({
},
);
- return serializer.serialize(proseMirrorDocument, {
+ return serializer.serialize(doc, {
tightLists: true,
+ changeTracker,
});
},
});
diff --git a/app/assets/javascripts/content_editor/services/markdown_sourcemap.js b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js
index 4285e04bbab..fe1b32c5b0a 100644
--- a/app/assets/javascripts/content_editor/services/markdown_sourcemap.js
+++ b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js
@@ -30,7 +30,7 @@ export const getMarkdownSource = (element) => {
for (let i = range.start.row; i <= range.end.row; i += 1) {
if (i === range.start.row) {
- elSource += source[i]?.substring(range.start.col);
+ elSource += source[i].substring(range.start.col);
} else if (i === range.end.row) {
elSource += `\n${source[i]?.substring(0, range.start.col)}`;
} else {
diff --git a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js
new file mode 100644
index 00000000000..770de1df0d0
--- /dev/null
+++ b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js
@@ -0,0 +1,87 @@
+import { isString } from 'lodash';
+import { render } from '~/lib/gfm';
+import { createProseMirrorDocFromMdastTree } from './hast_to_prosemirror_converter';
+
+const factorySpecs = {
+ blockquote: { block: 'blockquote' },
+ p: { block: 'paragraph' },
+ li: { block: 'listItem', wrapTextInParagraph: true },
+ ul: { block: 'bulletList' },
+ ol: { block: 'orderedList' },
+ h1: {
+ block: 'heading',
+ getAttrs: () => ({ level: 1 }),
+ },
+ h2: {
+ block: 'heading',
+ getAttrs: () => ({ level: 2 }),
+ },
+ h3: {
+ block: 'heading',
+ getAttrs: () => ({ level: 3 }),
+ },
+ h4: {
+ block: 'heading',
+ getAttrs: () => ({ level: 4 }),
+ },
+ h5: {
+ block: 'heading',
+ getAttrs: () => ({ level: 5 }),
+ },
+ h6: {
+ block: 'heading',
+ getAttrs: () => ({ level: 6 }),
+ },
+ pre: {
+ block: 'codeBlock',
+ skipChildren: true,
+ 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 };
+ },
+ },
+ hr: { inline: 'horizontalRule' },
+ img: {
+ inline: 'image',
+ getAttrs: (hastNode) => ({
+ src: hastNode.properties.src,
+ title: hastNode.properties.title,
+ alt: hastNode.properties.alt,
+ }),
+ },
+ br: { inline: 'hardBreak' },
+ code: { mark: 'code' },
+ em: { mark: 'italic' },
+ i: { mark: 'italic' },
+ strong: { mark: 'bold' },
+ b: { mark: 'bold' },
+ a: {
+ mark: 'link',
+ getAttrs: (hastNode) => ({
+ href: hastNode.properties.href,
+ title: hastNode.properties.title,
+ }),
+ },
+};
+
+export default () => {
+ return {
+ deserialize: async ({ schema, content: markdown }) => {
+ const document = await render({
+ markdown,
+ renderer: (tree) =>
+ createProseMirrorDocFromMdastTree({
+ schema,
+ factorySpecs,
+ tree,
+ source: markdown,
+ }),
+ });
+
+ 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 3e48434c6f9..089d30edec7 100644
--- a/app/assets/javascripts/content_editor/services/serialization_helpers.js
+++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js
@@ -349,3 +349,134 @@ export function renderCodeBlock(state, node) {
state.write('```');
state.closeBlock(node);
}
+
+export function preserveUnchanged(render) {
+ return (state, node, parent, index) => {
+ const { sourceMarkdown } = node.attrs;
+ const same = state.options.changeTracker.get(node);
+
+ if (same) {
+ state.write(sourceMarkdown);
+ state.closeBlock(node);
+ } else {
+ render(state, node, parent, index);
+ }
+ };
+}
+
+const generateBoldTags = (open = true) => {
+ return (_, mark) => {
+ const type = /^(\*\*|__|<strong|<b).*/.exec(mark.attrs.sourceMarkdown)?.[1];
+
+ switch (type) {
+ case '**':
+ case '__':
+ return type;
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ case '<strong':
+ case '<b':
+ return (open ? openTag : closeTag)(type.substring(1));
+ default:
+ return '**';
+ }
+ };
+};
+
+export const bold = {
+ open: generateBoldTags(),
+ close: generateBoldTags(false),
+ mixable: true,
+ expelEnclosingWhitespace: true,
+};
+
+const generateItalicTag = (open = true) => {
+ return (_, mark) => {
+ const type = /^(\*|_|<em|<i).*/.exec(mark.attrs.sourceMarkdown)?.[1];
+
+ switch (type) {
+ case '*':
+ case '_':
+ return type;
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ case '<em':
+ case '<i':
+ return (open ? openTag : closeTag)(type.substring(1));
+ default:
+ return '_';
+ }
+ };
+};
+
+export const italic = {
+ open: generateItalicTag(),
+ close: generateItalicTag(false),
+ mixable: true,
+ expelEnclosingWhitespace: true,
+};
+
+const generateCodeTag = (open = true) => {
+ return (_, mark) => {
+ const type = /^(`|<code).*/.exec(mark.attrs.sourceMarkdown)?.[1];
+
+ if (type === '<code') {
+ return (open ? openTag : closeTag)(type.substring(1));
+ }
+
+ return '`';
+ };
+};
+
+export const code = {
+ open: generateCodeTag(),
+ close: generateCodeTag(false),
+ mixable: true,
+ expelEnclosingWhitespace: true,
+};
+
+const LINK_HTML = 'linkHtml';
+const LINK_MARKDOWN = 'linkMarkdown';
+
+const linkType = (sourceMarkdown) => {
+ const expression = /^(\[|<a).*/.exec(sourceMarkdown)?.[1];
+
+ if (!expression || expression === '[') {
+ return LINK_MARKDOWN;
+ }
+
+ return LINK_HTML;
+};
+
+export const link = {
+ open(state, mark, parent, index) {
+ if (isPlainURL(mark, parent, index, 1)) {
+ return '<';
+ }
+
+ const { canonicalSrc, href, title, sourceMarkdown } = mark.attrs;
+
+ if (linkType(sourceMarkdown) === LINK_MARKDOWN) {
+ return '[';
+ }
+
+ const attrs = { href: state.esc(href || canonicalSrc) };
+
+ if (title) {
+ attrs.title = title;
+ }
+
+ return openTag('a', attrs);
+ },
+ close(state, mark, parent, index) {
+ if (isPlainURL(mark, parent, index, -1)) {
+ return '>';
+ }
+
+ const { canonicalSrc, href, title, sourceMarkdown } = mark.attrs;
+
+ if (linkType(sourceMarkdown) === LINK_HTML) {
+ return closeTag('a');
+ }
+
+ return `](${state.esc(canonicalSrc || href)}${title ? ` ${state.quote(title)}` : ''})`;
+ },
+};
diff --git a/app/assets/javascripts/content_editor/services/upload_helpers.js b/app/assets/javascripts/content_editor/services/upload_helpers.js
index ed2c4b39131..09f0738b51b 100644
--- a/app/assets/javascripts/content_editor/services/upload_helpers.js
+++ b/app/assets/javascripts/content_editor/services/upload_helpers.js
@@ -70,6 +70,8 @@ const uploadContent = async ({ type, editor, file, uploadsPath, renderMarkdown,
const position = state.selection.from - 1;
const { tr } = state;
+ editor.commands.setNodeSelection(position);
+
try {
const { src, canonicalSrc } = await uploadFile({ file, uploadsPath, renderMarkdown });
@@ -81,6 +83,8 @@ const uploadContent = async ({ type, editor, file, uploadsPath, renderMarkdown,
canonicalSrc,
}),
);
+
+ editor.commands.setNodeSelection(position);
} catch (e) {
editor.commands.deleteRange({ from: position, to: position + 1 });
eventHub.$emit('alert', {
diff --git a/app/assets/javascripts/content_editor/services/utils.js b/app/assets/javascripts/content_editor/services/utils.js
index b3856b0dd74..e352fa8a9db 100644
--- a/app/assets/javascripts/content_editor/services/utils.js
+++ b/app/assets/javascripts/content_editor/services/utils.js
@@ -15,7 +15,7 @@ export const hasSelection = (tiptapEditor) => {
* @returns {string}
*/
export const extractFilename = (src) => {
- return src.replace(/^.*\/|\..+?$/g, '');
+ return src.replace(/^.*\/|\.[^.]+?$/g, '');
};
export const readFileAsDataURL = (file) => {
diff --git a/app/assets/javascripts/create_cluster/components/cluster_form_dropdown.vue b/app/assets/javascripts/create_cluster/components/cluster_form_dropdown.vue
deleted file mode 100644
index fa0a17f3643..00000000000
--- a/app/assets/javascripts/create_cluster/components/cluster_form_dropdown.vue
+++ /dev/null
@@ -1,246 +0,0 @@
-<script>
-import { GlIcon } from '@gitlab/ui';
-import $ from 'jquery';
-import { isNil } from 'lodash';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-import DropdownSearchInput from '~/vue_shared/components/dropdown/dropdown_search_input.vue';
-
-const toArray = (value) => (isNil(value) ? [] : [].concat(value));
-const itemsProp = (items, prop) => items.map((item) => item[prop]);
-const defaultSearchFn = (searchQuery, labelProp) => (item) =>
- item[labelProp].toLowerCase().indexOf(searchQuery) > -1;
-
-export default {
- components: {
- DropdownButton,
- DropdownSearchInput,
- DropdownHiddenInput,
- GlIcon,
- },
- props: {
- fieldName: {
- type: String,
- required: false,
- default: '',
- },
- placeholder: {
- type: String,
- required: false,
- default: '',
- },
- defaultValue: {
- type: String,
- required: false,
- default: '',
- },
- value: {
- type: [Object, Array, String],
- required: false,
- default: () => null,
- },
- labelProperty: {
- type: String,
- required: false,
- default: 'name',
- },
- valueProperty: {
- type: String,
- required: false,
- default: 'value',
- },
- items: {
- type: Array,
- required: false,
- default: () => [],
- },
- loading: {
- type: Boolean,
- required: false,
- default: false,
- },
- disabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- loadingText: {
- type: String,
- required: false,
- default: '',
- },
- disabledText: {
- type: String,
- required: false,
- default: '',
- },
- hasErrors: {
- type: Boolean,
- required: false,
- default: false,
- },
- multiple: {
- type: Boolean,
- required: false,
- default: false,
- },
- errorMessage: {
- type: String,
- required: false,
- default: '',
- },
- searchFieldPlaceholder: {
- type: String,
- required: false,
- default: '',
- },
- emptyText: {
- type: String,
- required: false,
- default: '',
- },
- searchFn: {
- type: Function,
- required: false,
- default: defaultSearchFn,
- },
- },
- data() {
- return {
- searchQuery: '',
- focusOnSearch: false,
- };
- },
- computed: {
- toggleText() {
- if (this.loading && this.loadingText) {
- return this.loadingText;
- }
-
- if (this.disabled && this.disabledText) {
- return this.disabledText;
- }
-
- if (!this.selectedItems.length) {
- return this.placeholder;
- }
-
- return this.selectedItemsLabels;
- },
- results() {
- return this.getItemsOrEmptyList().filter(this.searchFn(this.searchQuery, this.labelProperty));
- },
- selectedItems() {
- const valueProp = this.valueProperty;
- const valueList = toArray(this.value);
- const items = this.getItemsOrEmptyList();
-
- return items.filter((item) => valueList.some((value) => item[valueProp] === value));
- },
- selectedItemsLabels() {
- return itemsProp(this.selectedItems, this.labelProperty).join(', ');
- },
- selectedItemsValues() {
- return itemsProp(this.selectedItems, this.valueProperty).join(', ');
- },
- },
- mounted() {
- $(this.$refs.dropdown)
- .on('shown.bs.dropdown', () => {
- this.focusOnSearch = true;
- })
- .on('hidden.bs.dropdown', () => {
- this.focusOnSearch = false;
- });
- },
- beforeDestroy() {
- // eslint-disable-next-line @gitlab/no-global-event-off
- $(this.$refs.dropdown).off();
- },
- methods: {
- getItemsOrEmptyList() {
- return this.items || [];
- },
- selectSingle(item) {
- this.$emit('input', item[this.valueProperty]);
- },
- selectMultiple(item) {
- const value = toArray(this.value);
- const itemValue = item[this.valueProperty];
- const itemValueIndex = value.indexOf(itemValue);
-
- if (itemValueIndex > -1) {
- value.splice(itemValueIndex, 1);
- } else {
- value.push(itemValue);
- }
-
- this.$emit('input', value);
- },
- isSelected(item) {
- return this.selectedItems.includes(item);
- },
- },
-};
-</script>
-
-<template>
- <div>
- <div ref="dropdown" class="dropdown">
- <dropdown-hidden-input :name="fieldName" :value="selectedItemsValues" />
- <dropdown-button
- :class="{ 'border-danger': hasErrors }"
- :is-disabled="disabled"
- :is-loading="loading"
- :toggle-text="toggleText"
- />
- <div class="dropdown-menu dropdown-select">
- <dropdown-search-input
- v-model="searchQuery"
- :focused="focusOnSearch"
- :placeholder-text="searchFieldPlaceholder"
- />
- <div class="dropdown-content">
- <ul>
- <li v-if="!results.length">
- <span class="js-empty-text menu-item">{{ emptyText }}</span>
- </li>
- <li v-for="item in results" :key="item.id">
- <button
- v-if="multiple"
- class="js-dropdown-item d-flex align-items-center"
- type="button"
- @click.stop.prevent="selectMultiple(item)"
- >
- <gl-icon
- :class="[{ invisible: !isSelected(item) }, 'mr-1']"
- name="mobile-issue-close"
- />
- <slot name="item" :item="item">{{ item.name }}</slot>
- </button>
- <button
- v-else
- class="js-dropdown-item"
- type="button"
- @click.prevent="selectSingle(item)"
- >
- <slot name="item" :item="item">{{ item.name }}</slot>
- </button>
- </li>
- </ul>
- </div>
- </div>
- </div>
- <span
- v-if="hasErrors && errorMessage"
- :class="[
- 'form-text js-eks-dropdown-error-message',
- {
- 'text-danger': hasErrors,
- 'text-muted': !hasErrors,
- },
- ]"
- >{{ errorMessage }}</span
- >
- </div>
-</template>
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/components/create_eks_cluster.vue b/app/assets/javascripts/create_cluster/eks_cluster/components/create_eks_cluster.vue
deleted file mode 100644
index ba170dc0e19..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/components/create_eks_cluster.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<script>
-import { mapState } from 'vuex';
-import EksClusterConfigurationForm from './eks_cluster_configuration_form.vue';
-import ServiceCredentialsForm from './service_credentials_form.vue';
-
-export default {
- components: {
- ServiceCredentialsForm,
- EksClusterConfigurationForm,
- },
- props: {
- gitlabManagedClusterHelpPath: {
- type: String,
- required: true,
- },
- namespacePerEnvironmentHelpPath: {
- type: String,
- required: true,
- },
- kubernetesIntegrationHelpPath: {
- type: String,
- required: true,
- },
- accountAndExternalIdsHelpPath: {
- type: String,
- required: true,
- },
- createRoleArnHelpPath: {
- type: String,
- required: true,
- },
- externalLinkIcon: {
- type: String,
- required: true,
- },
- },
- computed: {
- ...mapState(['hasCredentials']),
- },
-};
-</script>
-<template>
- <div class="js-create-eks-cluster">
- <eks-cluster-configuration-form
- v-if="hasCredentials"
- :gitlab-managed-cluster-help-path="gitlabManagedClusterHelpPath"
- :namespace-per-environment-help-path="namespacePerEnvironmentHelpPath"
- :kubernetes-integration-help-path="kubernetesIntegrationHelpPath"
- :external-link-icon="externalLinkIcon"
- />
- <service-credentials-form
- v-else
- :create-role-arn-help-path="createRoleArnHelpPath"
- :account-and-external-ids-help-path="accountAndExternalIdsHelpPath"
- :external-link-icon="externalLinkIcon"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue b/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue
deleted file mode 100644
index 73458a463f2..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue
+++ /dev/null
@@ -1,530 +0,0 @@
-<script>
-import {
- GlFormGroup,
- GlFormInput,
- GlFormCheckbox,
- GlIcon,
- GlLink,
- GlSprintf,
- GlButton,
-} from '@gitlab/ui';
-import { createNamespacedHelpers, mapState, mapActions, mapGetters } from 'vuex';
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-import { s__ } from '~/locale';
-import { KUBERNETES_VERSIONS } from '../constants';
-
-const { mapState: mapRolesState, mapActions: mapRolesActions } = createNamespacedHelpers('roles');
-const { mapState: mapKeyPairsState, mapActions: mapKeyPairsActions } = createNamespacedHelpers(
- 'keyPairs',
-);
-const { mapState: mapVpcsState, mapActions: mapVpcActions } = createNamespacedHelpers('vpcs');
-const { mapState: mapSubnetsState, mapActions: mapSubnetActions } = createNamespacedHelpers(
- 'subnets',
-);
-const {
- mapState: mapSecurityGroupsState,
- mapActions: mapSecurityGroupsActions,
-} = createNamespacedHelpers('securityGroups');
-const { mapState: mapInstanceTypesState } = createNamespacedHelpers('instanceTypes');
-
-export default {
- components: {
- ClusterFormDropdown,
- GlFormCheckbox,
- GlFormGroup,
- GlFormInput,
- GlIcon,
- GlLink,
- GlSprintf,
- GlButton,
- },
- props: {
- gitlabManagedClusterHelpPath: {
- type: String,
- required: true,
- },
- namespacePerEnvironmentHelpPath: {
- type: String,
- required: true,
- },
- kubernetesIntegrationHelpPath: {
- type: String,
- required: true,
- },
- externalLinkIcon: {
- type: String,
- required: true,
- },
- },
- i18n: {
- kubernetesIntegrationHelpText: s__(
- 'ClusterIntegration|Read our %{linkStart}help page%{linkEnd} on Kubernetes cluster integration.',
- ),
- roleDropdownHelpText: s__(
- 'ClusterIntegration|Your service role is distinct from the provision role used when authenticating. It will allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf. To use a new role, first create one on %{linkStart}Amazon Web Services%{linkEnd}.',
- ),
- roleDropdownHelpPath:
- 'https://docs.aws.amazon.com/eks/latest/userguide/service_IAM_role.html#create-service-role',
- regionInputLabel: s__('ClusterIntegration|Cluster Region'),
- regionHelpText: s__(
- 'ClusterIntegration|The region the new cluster will be created in. You must reauthenticate to change regions.',
- ),
- keyPairDropdownHelpText: s__(
- 'ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}.',
- ),
- keyPairDropdownHelpPath:
- 'https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#having-ec2-create-your-key-pair',
- vpcDropdownHelpText: s__(
- 'ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To use a new VPC, first create one on %{linkStart}Amazon Web Services %{linkEnd}.',
- ),
- vpcDropdownHelpPath:
- 'https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#vpc-create',
- subnetDropdownHelpText: s__(
- 'ClusterIntegration|Choose the %{linkStart}subnets %{linkEnd} in your VPC where your worker nodes will run.',
- ),
- subnetDropdownHelpPath: 'https://console.aws.amazon.com/vpc/home?#subnets',
- securityGroupDropdownHelpText: s__(
- 'ClusterIntegration|Choose the %{linkStart}security group%{linkEnd} to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets.',
- ),
- securityGroupDropdownHelpPath: 'https://console.aws.amazon.com/vpc/home?#securityGroups',
- instanceTypesDropdownHelpText: s__(
- 'ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}.',
- ),
- instanceTypesDropdownHelpPath: 'https://aws.amazon.com/ec2/instance-types',
- gitlabManagedClusterHelpText: s__(
- 'ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}',
- ),
- namespacePerEnvironmentHelpText: s__(
- 'ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared. %{linkStart}More information%{linkEnd}',
- ),
- },
- computed: {
- ...mapState([
- 'clusterName',
- 'environmentScope',
- 'kubernetesVersion',
- 'selectedRegion',
- 'selectedKeyPair',
- 'selectedVpc',
- 'selectedSubnet',
- 'selectedRole',
- 'selectedSecurityGroup',
- 'selectedInstanceType',
- 'nodeCount',
- 'gitlabManagedCluster',
- 'namespacePerEnvironment',
- 'isCreatingCluster',
- ]),
- ...mapGetters(['subnetValid']),
- ...mapRolesState({
- roles: 'items',
- isLoadingRoles: 'isLoadingItems',
- loadingRolesError: 'loadingItemsError',
- }),
- ...mapKeyPairsState({
- keyPairs: 'items',
- isLoadingKeyPairs: 'isLoadingItems',
- loadingKeyPairsError: 'loadingItemsError',
- }),
- ...mapVpcsState({
- vpcs: 'items',
- isLoadingVpcs: 'isLoadingItems',
- loadingVpcsError: 'loadingItemsError',
- }),
- ...mapSubnetsState({
- subnets: 'items',
- isLoadingSubnets: 'isLoadingItems',
- loadingSubnetsError: 'loadingItemsError',
- }),
- ...mapSecurityGroupsState({
- securityGroups: 'items',
- isLoadingSecurityGroups: 'isLoadingItems',
- loadingSecurityGroupsError: 'loadingItemsError',
- }),
- ...mapInstanceTypesState({
- instanceTypes: 'items',
- isLoadingInstanceTypes: 'isLoadingItems',
- loadingInstanceTypesError: 'loadingItemsError',
- }),
- kubernetesVersions() {
- return KUBERNETES_VERSIONS;
- },
- vpcDropdownDisabled() {
- return !this.selectedRegion;
- },
- keyPairDropdownDisabled() {
- return !this.selectedRegion;
- },
- subnetDropdownDisabled() {
- return !this.selectedVpc;
- },
- securityGroupDropdownDisabled() {
- return !this.selectedVpc;
- },
- createClusterButtonDisabled() {
- return (
- !this.clusterName ||
- !this.environmentScope ||
- !this.kubernetesVersion ||
- !this.selectedRegion ||
- !this.selectedKeyPair ||
- !this.selectedVpc ||
- !this.subnetValid ||
- !this.selectedRole ||
- !this.selectedSecurityGroup ||
- !this.selectedInstanceType ||
- !this.nodeCount ||
- this.isCreatingCluster
- );
- },
- displaySubnetError() {
- return Boolean(this.loadingSubnetsError) || this.selectedSubnet?.length === 1;
- },
- createClusterButtonLabel() {
- return this.isCreatingCluster
- ? s__('ClusterIntegration|Creating Kubernetes cluster')
- : s__('ClusterIntegration|Create Kubernetes cluster');
- },
- subnetValidationErrorText() {
- if (this.loadingSubnetsError) {
- return s__('ClusterIntegration|Could not load subnets for the selected VPC');
- }
-
- return s__('ClusterIntegration|You should select at least two subnets');
- },
- },
- mounted() {
- this.fetchRoles();
- this.setRegionAndFetchVpcsAndKeyPairs();
- },
- methods: {
- ...mapActions([
- 'createCluster',
- 'setClusterName',
- 'setEnvironmentScope',
- 'setKubernetesVersion',
- 'setRegion',
- 'setVpc',
- 'setSubnet',
- 'setRole',
- 'setKeyPair',
- 'setSecurityGroup',
- 'setInstanceType',
- 'setNodeCount',
- 'setGitlabManagedCluster',
- 'setNamespacePerEnvironment',
- ]),
- ...mapVpcActions({ fetchVpcs: 'fetchItems' }),
- ...mapSubnetActions({ fetchSubnets: 'fetchItems' }),
- ...mapRolesActions({ fetchRoles: 'fetchItems' }),
- ...mapKeyPairsActions({ fetchKeyPairs: 'fetchItems' }),
- ...mapSecurityGroupsActions({ fetchSecurityGroups: 'fetchItems' }),
- setRegionAndFetchVpcsAndKeyPairs() {
- this.setVpc({ vpc: null });
- this.setKeyPair({ keyPair: null });
- this.setSubnet({ subnet: [] });
- this.setSecurityGroup({ securityGroup: null });
- this.fetchVpcs({ region: this.selectedRegion });
- this.fetchKeyPairs({ region: this.selectedRegion });
- },
- setVpcAndFetchSubnets(vpc) {
- this.setVpc({ vpc });
- this.setSubnet({ subnet: [] });
- this.setSecurityGroup({ securityGroup: null });
- this.fetchSubnets({ vpc, region: this.selectedRegion });
- this.fetchSecurityGroups({ vpc, region: this.selectedRegion });
- },
- },
-};
-</script>
-<template>
- <form name="eks-cluster-configuration-form">
- <h4>
- {{ s__('ClusterIntegration|Enter the details for your Amazon EKS Kubernetes cluster') }}
- </h4>
- <div class="mb-3">
- <gl-sprintf :message="$options.i18n.kubernetesIntegrationHelpText">
- <template #link="{ content }">
- <gl-link :href="kubernetesIntegrationHelpPath">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-cluster-name">{{
- s__('ClusterIntegration|Kubernetes cluster name')
- }}</label>
- <gl-form-input
- id="eks-cluster-name"
- :value="clusterName"
- @input="setClusterName({ clusterName: $event })"
- />
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-environment-scope">{{
- s__('ClusterIntegration|Environment scope')
- }}</label>
- <gl-form-input
- id="eks-environment-scope"
- :value="environmentScope"
- @input="setEnvironmentScope({ environmentScope: $event })"
- />
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-kubernetes-version">{{
- s__('ClusterIntegration|Kubernetes version')
- }}</label>
- <cluster-form-dropdown
- field-id="eks-kubernetes-version"
- field-name="eks-kubernetes-version"
- :value="kubernetesVersion"
- :items="kubernetesVersions"
- :empty-text="s__('ClusterIntegration|Kubernetes version not found')"
- @input="setKubernetesVersion({ kubernetesVersion: $event })"
- />
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-role">{{ s__('ClusterIntegration|Service role') }}</label>
- <cluster-form-dropdown
- field-id="eks-role"
- field-name="eks-role"
- :value="selectedRole"
- :items="roles"
- :loading="isLoadingRoles"
- :loading-text="s__('ClusterIntegration|Loading IAM Roles')"
- :placeholder="s__('ClusterIntegration|Select service role')"
- :search-field-placeholder="s__('ClusterIntegration|Search IAM Roles')"
- :empty-text="s__('ClusterIntegration|No IAM Roles found')"
- :has-errors="Boolean(loadingRolesError)"
- :error-message="s__('ClusterIntegration|Could not load IAM roles')"
- @input="setRole({ role: $event })"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.roleDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.roleDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <gl-form-group
- :label="$options.i18n.regionInputLabel"
- :description="$options.i18n.regionHelpText"
- >
- <gl-form-input id="eks-region" :value="selectedRegion" type="text" readonly />
- </gl-form-group>
- <div class="form-group">
- <label class="label-bold" for="eks-key-pair">{{
- s__('ClusterIntegration|Key pair name')
- }}</label>
- <cluster-form-dropdown
- field-id="eks-key-pair"
- field-name="eks-key-pair"
- :value="selectedKeyPair"
- :items="keyPairs"
- :disabled="keyPairDropdownDisabled"
- :disabled-text="s__('ClusterIntegration|Select a region to choose a Key Pair')"
- :loading="isLoadingKeyPairs"
- :loading-text="s__('ClusterIntegration|Loading Key Pairs')"
- :placeholder="s__('ClusterIntegration|Select key pair')"
- :search-field-placeholder="s__('ClusterIntegration|Search Key Pairs')"
- :empty-text="s__('ClusterIntegration|No Key Pairs found')"
- :has-errors="Boolean(loadingKeyPairsError)"
- :error-message="s__('ClusterIntegration|Could not load Key Pairs')"
- @input="setKeyPair({ keyPair: $event })"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.keyPairDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.keyPairDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-vpc">{{ s__('ClusterIntegration|VPC') }}</label>
- <cluster-form-dropdown
- field-id="eks-vpc"
- field-name="eks-vpc"
- :value="selectedVpc"
- :items="vpcs"
- :loading="isLoadingVpcs"
- :disabled="vpcDropdownDisabled"
- :disabled-text="s__('ClusterIntegration|Select a region to choose a VPC')"
- :loading-text="s__('ClusterIntegration|Loading VPCs')"
- :placeholder="s__('ClusterIntegration|Select a VPC')"
- :search-field-placeholder="s__('ClusterIntegration|Search VPCs')"
- :empty-text="s__('ClusterIntegration|No VPCs found')"
- :has-errors="Boolean(loadingVpcsError)"
- :error-message="s__('ClusterIntegration|Could not load VPCs for the selected region')"
- @input="setVpcAndFetchSubnets($event)"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.vpcDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.vpcDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-role">{{ s__('ClusterIntegration|Subnets') }}</label>
- <cluster-form-dropdown
- field-id="eks-subnet"
- field-name="eks-subnet"
- multiple
- :value="selectedSubnet"
- :items="subnets"
- :loading="isLoadingSubnets"
- :disabled="subnetDropdownDisabled"
- :disabled-text="s__('ClusterIntegration|Select a VPC to choose a subnet')"
- :loading-text="s__('ClusterIntegration|Loading subnets')"
- :placeholder="s__('ClusterIntegration|Select a subnet')"
- :search-field-placeholder="s__('ClusterIntegration|Search subnets')"
- :empty-text="s__('ClusterIntegration|No subnet found')"
- :has-errors="displaySubnetError"
- :error-message="subnetValidationErrorText"
- @input="setSubnet({ subnet: $event })"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.subnetDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.subnetDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-security-group">{{
- s__('ClusterIntegration|Security group')
- }}</label>
- <cluster-form-dropdown
- field-id="eks-security-group"
- field-name="eks-security-group"
- :value="selectedSecurityGroup"
- :items="securityGroups"
- :loading="isLoadingSecurityGroups"
- :disabled="securityGroupDropdownDisabled"
- :disabled-text="s__('ClusterIntegration|Select a VPC to choose a security group')"
- :loading-text="s__('ClusterIntegration|Loading security groups')"
- :placeholder="s__('ClusterIntegration|Select a security group')"
- :search-field-placeholder="s__('ClusterIntegration|Search security groups')"
- :empty-text="s__('ClusterIntegration|No security group found')"
- :has-errors="Boolean(loadingSecurityGroupsError)"
- :error-message="
- s__('ClusterIntegration|Could not load security groups for the selected VPC')
- "
- @input="setSecurityGroup({ securityGroup: $event })"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.securityGroupDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.securityGroupDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-instance-type">{{
- s__('ClusterIntegration|Instance type')
- }}</label>
- <cluster-form-dropdown
- field-id="eks-instance-type"
- field-name="eks-instance-type"
- :value="selectedInstanceType"
- :items="instanceTypes"
- :loading="isLoadingInstanceTypes"
- :loading-text="s__('ClusterIntegration|Loading instance types')"
- :placeholder="s__('ClusterIntegration|Select an instance type')"
- :search-field-placeholder="s__('ClusterIntegration|Search instance types')"
- :empty-text="s__('ClusterIntegration|No instance type found')"
- :has-errors="Boolean(loadingInstanceTypesError)"
- :error-message="s__('ClusterIntegration|Could not load instance types')"
- @input="setInstanceType({ instanceType: $event })"
- />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.instanceTypesDropdownHelpText">
- <template #link="{ content }">
- <gl-link :href="$options.i18n.instanceTypesDropdownHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <label class="label-bold" for="eks-node-count">{{
- s__('ClusterIntegration|Number of nodes')
- }}</label>
- <gl-form-input
- id="eks-node-count"
- type="number"
- min="1"
- step="1"
- :value="nodeCount"
- @input="setNodeCount({ nodeCount: $event })"
- />
- </div>
- <div class="form-group">
- <gl-form-checkbox
- :checked="gitlabManagedCluster"
- @input="setGitlabManagedCluster({ gitlabManagedCluster: $event })"
- >{{ s__('ClusterIntegration|GitLab-managed cluster') }}</gl-form-checkbox
- >
- <p class="form text text-muted">
- <gl-sprintf :message="$options.i18n.gitlabManagedClusterHelpText">
- <template #link="{ content }">
- <gl-link :href="gitlabManagedClusterHelpPath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <gl-form-checkbox
- :checked="namespacePerEnvironment"
- @input="setNamespacePerEnvironment({ namespacePerEnvironment: $event })"
- >{{ s__('ClusterIntegration|Namespace per environment') }}</gl-form-checkbox
- >
- <p class="form text text-muted">
- <gl-sprintf :message="$options.i18n.namespacePerEnvironmentHelpText">
- <template #link="{ content }">
- <gl-link :href="namespacePerEnvironmentHelpPath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- <div class="form-group">
- <gl-button
- variant="success"
- category="primary"
- class="js-create-cluster"
- :disabled="createClusterButtonDisabled"
- :loading="isCreatingCluster"
- @click="createCluster()"
- >
- {{ createClusterButtonLabel }}
- </gl-button>
- </div>
- </form>
-</template>
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/components/service_credentials_form.vue b/app/assets/javascripts/create_cluster/eks_cluster/components/service_credentials_form.vue
deleted file mode 100644
index 004c2e26c4e..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/components/service_credentials_form.vue
+++ /dev/null
@@ -1,182 +0,0 @@
-<script>
-import { GlButton, GlFormGroup, GlFormInput, GlIcon, GlLink, GlSprintf, GlAlert } from '@gitlab/ui';
-import { mapState, mapActions } from 'vuex';
-import { s__, __ } from '~/locale';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-import { DEFAULT_REGION } from '../constants';
-
-export default {
- components: {
- GlButton,
- GlFormGroup,
- GlFormInput,
- GlIcon,
- GlLink,
- GlSprintf,
- ClipboardButton,
- GlAlert,
- },
- props: {
- accountAndExternalIdsHelpPath: {
- type: String,
- required: true,
- },
- createRoleArnHelpPath: {
- type: String,
- required: true,
- },
- externalLinkIcon: {
- type: String,
- required: true,
- },
- },
- i18n: {
- regionInputLabel: s__('ClusterIntegration|Cluster Region'),
- regionHelpPath: 'https://aws.amazon.com/about-aws/global-infrastructure/regions_az/',
- regionHelpText: s__(
- 'ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}.',
- ),
- accountAndExternalIdsHelpText: s__(
- 'ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}',
- ),
- regionHelpTextDefaultRegion: DEFAULT_REGION,
- },
- data() {
- return {
- roleArn: this.$store.state.roleArn,
- selectedRegion: this.$store.state.selectedRegion,
- };
- },
- computed: {
- ...mapState(['accountId', 'externalId', 'isCreatingRole', 'createRoleError']),
- submitButtonDisabled() {
- return this.isCreatingRole || !this.roleArn;
- },
- submitButtonLabel() {
- return this.isCreatingRole
- ? __('Authenticating')
- : s__('ClusterIntegration|Authenticate with AWS');
- },
- awsHelpLink() {
- return 'https://console.aws.amazon.com/iam/home?#roles';
- },
- },
- methods: {
- ...mapActions(['createRole']),
- },
-};
-</script>
-<template>
- <form name="service-credentials-form">
- <h4>{{ s__('ClusterIntegration|Authenticate with Amazon Web Services') }}</h4>
- <p>
- {{
- s__(
- 'ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN.',
- )
- }}
- </p>
- <gl-alert
- v-if="createRoleError"
- class="js-invalid-credentials gl-mb-5"
- variant="danger"
- :dismissible="false"
- >
- {{ createRoleError }}
- </gl-alert>
- <div class="form-row">
- <div class="form-group col-md-6">
- <label for="gitlab-account-id">{{ __('Account ID') }}</label>
- <div class="input-group">
- <gl-form-input id="gitlab-account-id" type="text" readonly :value="accountId" />
- <div class="input-group-append">
- <clipboard-button
- :text="accountId"
- :title="__('Copy Account ID to clipboard')"
- class="input-group-text js-copy-account-id-button"
- />
- </div>
- </div>
- </div>
- <div class="form-group col-md-6">
- <label for="eks-external-id">{{ __('External ID') }}</label>
- <div class="input-group">
- <gl-form-input id="eks-external-id" type="text" readonly :value="externalId" />
- <div class="input-group-append">
- <clipboard-button
- :text="externalId"
- :title="__('Copy External ID to clipboard')"
- class="input-group-text js-copy-external-id-button"
- />
- </div>
- </div>
- </div>
- <div class="col-12 mb-3 mt-n3">
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.accountAndExternalIdsHelpText">
- <template #awsLink="{ content }">
- <gl-link :href="awsHelpLink" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- <template #moreInfo="{ content }">
- <gl-link :href="accountAndExternalIdsHelpPath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
- </div>
- <div class="form-group">
- <label for="eks-provision-role-arn">{{ s__('ClusterIntegration|Provision Role ARN') }}</label>
- <gl-form-input id="eks-provision-role-arn" v-model="roleArn" />
- <p class="form-text text-muted">
- <gl-sprintf :message="$options.i18n.accountAndExternalIdsHelpText">
- <template #awsLink="{ content }">
- <gl-link :href="awsHelpLink" target="_blank">
- {{ content }}
- <gl-icon name="external-link" class="gl-vertical-align-middle" />
- </gl-link>
- </template>
- <template #moreInfo="{ content }">
- <gl-link :href="accountAndExternalIdsHelpPath" target="_blank">
- {{ content }}
- </gl-link>
- </template>
- </gl-sprintf>
- </p>
- </div>
-
- <gl-form-group :label="$options.i18n.regionInputLabel">
- <gl-form-input id="eks-region" v-model="selectedRegion" type="text" />
-
- <template #description>
- <gl-sprintf :message="$options.i18n.regionHelpText">
- <template #code>
- <code>{{ $options.i18n.regionHelpTextDefaultRegion }}</code>
- </template>
-
- <template #link="{ content }">
- <gl-link :href="$options.i18n.regionHelpPath" target="_blank">
- {{ content }}
- <gl-icon name="external-link" />
- </gl-link>
- </template>
- </gl-sprintf>
- </template>
- </gl-form-group>
-
- <gl-button
- variant="success"
- category="primary"
- type="submit"
- :disabled="submitButtonDisabled"
- :loading="isCreatingRole"
- @click.prevent="createRole({ roleArn, selectedRegion, externalId })"
- >
- {{ submitButtonLabel }}
- </gl-button>
- </form>
-</template>
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/constants.js b/app/assets/javascripts/create_cluster/eks_cluster/constants.js
deleted file mode 100644
index 3ed0f050301..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/constants.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export const DEFAULT_REGION = 'us-east-2';
-
-export const KUBERNETES_VERSIONS = [
- { name: '1.16', value: '1.16' },
- { name: '1.17', value: '1.17' },
- { name: '1.18', value: '1.18' },
- { name: '1.19', value: '1.19' },
- { name: '1.20', value: '1.20', default: true },
-];
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/index.js b/app/assets/javascripts/create_cluster/eks_cluster/index.js
deleted file mode 100644
index 38b7eefd15b..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/index.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import { parseBoolean } from '~/lib/utils/common_utils';
-import CreateEksCluster from './components/create_eks_cluster.vue';
-import createStore from './store';
-
-Vue.use(Vuex);
-
-export default (el) => {
- const {
- gitlabManagedClusterHelpPath,
- namespacePerEnvironmentHelpPath,
- kubernetesIntegrationHelpPath,
- accountAndExternalIdsHelpPath,
- createRoleArnHelpPath,
- externalId,
- accountId,
- instanceTypes,
- hasCredentials,
- createRolePath,
- createClusterPath,
- externalLinkIcon,
- roleArn,
- } = el.dataset;
-
- return new Vue({
- el,
- store: createStore({
- initialState: {
- hasCredentials: parseBoolean(hasCredentials),
- externalId,
- accountId,
- instanceTypes: JSON.parse(instanceTypes),
- createRolePath,
- createClusterPath,
- roleArn,
- },
- }),
- components: {
- CreateEksCluster,
- },
- render(createElement) {
- return createElement('create-eks-cluster', {
- props: {
- gitlabManagedClusterHelpPath,
- namespacePerEnvironmentHelpPath,
- kubernetesIntegrationHelpPath,
- accountAndExternalIdsHelpPath,
- createRoleArnHelpPath,
- externalLinkIcon,
- },
- });
- },
- });
-};
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/services/aws_services_facade.js b/app/assets/javascripts/create_cluster/eks_cluster/services/aws_services_facade.js
deleted file mode 100644
index bd9554521b8..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/services/aws_services_facade.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import EC2 from 'aws-sdk/clients/ec2';
-import IAM from 'aws-sdk/clients/iam';
-import AWS from 'aws-sdk/global';
-
-const lookupVpcName = ({ Tags: tags, VpcId: id }) => {
- const nameTag = tags.find(({ Key: key }) => key === 'Name');
-
- return nameTag ? nameTag.Value : id;
-};
-
-export const setAWSConfig = ({ awsCredentials }) => {
- AWS.config = awsCredentials;
-};
-
-export const fetchRoles = () => {
- const iam = new IAM();
-
- return iam
- .listRoles()
- .promise()
- .then(({ Roles: roles }) => roles.map(({ RoleName: name, Arn: value }) => ({ name, value })));
-};
-
-export const fetchKeyPairs = ({ region }) => {
- const ec2 = new EC2({ region });
-
- return ec2
- .describeKeyPairs()
- .promise()
- .then(({ KeyPairs: keyPairs }) => keyPairs.map(({ KeyName: name }) => ({ name, value: name })));
-};
-
-export const fetchVpcs = ({ region }) => {
- const ec2 = new EC2({ region });
-
- return ec2
- .describeVpcs()
- .promise()
- .then(({ Vpcs: vpcs }) =>
- vpcs.map((vpc) => ({
- value: vpc.VpcId,
- name: lookupVpcName(vpc),
- })),
- );
-};
-
-export const fetchSubnets = ({ vpc, region }) => {
- const ec2 = new EC2({ region });
-
- return ec2
- .describeSubnets({
- Filters: [
- {
- Name: 'vpc-id',
- Values: [vpc],
- },
- ],
- })
- .promise()
- .then(({ Subnets: subnets }) => subnets.map(({ SubnetId: id }) => ({ value: id, name: id })));
-};
-
-export const fetchSecurityGroups = ({ region, vpc }) => {
- const ec2 = new EC2({ region });
-
- return ec2
- .describeSecurityGroups({
- Filters: [
- {
- Name: 'vpc-id',
- Values: [vpc],
- },
- ],
- })
- .promise()
- .then(({ SecurityGroups: securityGroups }) =>
- securityGroups.map(({ GroupName: name, GroupId: value }) => ({ name, value })),
- );
-};
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/actions.js b/app/assets/javascripts/create_cluster/eks_cluster/store/actions.js
deleted file mode 100644
index cd8212a40f9..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/actions.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
-import { DEFAULT_REGION } from '../constants';
-import { setAWSConfig } from '../services/aws_services_facade';
-import * as types from './mutation_types';
-
-const getErrorMessage = (data) => {
- const errorKey = Object.keys(data)[0];
-
- return data[errorKey][0];
-};
-
-export const setClusterName = ({ commit }, payload) => {
- commit(types.SET_CLUSTER_NAME, payload);
-};
-
-export const setEnvironmentScope = ({ commit }, payload) => {
- commit(types.SET_ENVIRONMENT_SCOPE, payload);
-};
-
-export const setKubernetesVersion = ({ commit }, payload) => {
- commit(types.SET_KUBERNETES_VERSION, payload);
-};
-
-export const createRole = ({ dispatch, state: { createRolePath } }, payload) => {
- dispatch('requestCreateRole');
-
- const region = payload.selectedRegion || DEFAULT_REGION;
-
- return axios
- .post(createRolePath, {
- role_arn: payload.roleArn,
- role_external_id: payload.externalId,
- region,
- })
- .then(({ data }) => {
- const awsData = {
- ...convertObjectPropsToCamelCase(data),
- region,
- };
-
- dispatch('createRoleSuccess', awsData);
- })
- .catch((error) => {
- let message = error;
- if (error?.response?.data?.message) {
- message = error.response.data.message;
- }
- dispatch('createRoleError', { error: message });
- });
-};
-
-export const requestCreateRole = ({ commit }) => {
- commit(types.REQUEST_CREATE_ROLE);
-};
-
-export const createRoleSuccess = ({ dispatch, commit }, awsCredentials) => {
- dispatch('setRegion', { region: awsCredentials.region });
- setAWSConfig({ awsCredentials });
- commit(types.CREATE_ROLE_SUCCESS);
-};
-
-export const createRoleError = ({ commit }, payload) => {
- commit(types.CREATE_ROLE_ERROR, payload);
-};
-
-export const createCluster = ({ dispatch, state }) => {
- dispatch('requestCreateCluster');
-
- return axios
- .post(state.createClusterPath, {
- name: state.clusterName,
- environment_scope: state.environmentScope,
- managed: state.gitlabManagedCluster,
- namespace_per_environment: state.namespacePerEnvironment,
- provider_aws_attributes: {
- kubernetes_version: state.kubernetesVersion,
- region: state.selectedRegion,
- vpc_id: state.selectedVpc,
- subnet_ids: state.selectedSubnet,
- role_arn: state.selectedRole,
- key_name: state.selectedKeyPair,
- security_group_id: state.selectedSecurityGroup,
- instance_type: state.selectedInstanceType,
- num_nodes: state.nodeCount,
- },
- })
- .then(({ headers: { location } }) => dispatch('createClusterSuccess', location))
- .catch(({ response: { data } }) => {
- dispatch('createClusterError', data);
- });
-};
-
-export const requestCreateCluster = ({ commit }) => {
- commit(types.REQUEST_CREATE_CLUSTER);
-};
-
-export const createClusterSuccess = (_, location) => {
- window.location.assign(location);
-};
-
-export const createClusterError = ({ commit }, error) => {
- commit(types.CREATE_CLUSTER_ERROR, error);
- createFlash({
- message: getErrorMessage(error),
- });
-};
-
-export const setRegion = ({ commit }, payload) => {
- commit(types.SET_REGION, payload);
-};
-
-export const setKeyPair = ({ commit }, payload) => {
- commit(types.SET_KEY_PAIR, payload);
-};
-
-export const setVpc = ({ commit }, payload) => {
- commit(types.SET_VPC, payload);
-};
-
-export const setSubnet = ({ commit }, payload) => {
- commit(types.SET_SUBNET, payload);
-};
-
-export const setRole = ({ commit }, payload) => {
- commit(types.SET_ROLE, payload);
-};
-
-export const setSecurityGroup = ({ commit }, payload) => {
- commit(types.SET_SECURITY_GROUP, payload);
-};
-
-export const setGitlabManagedCluster = ({ commit }, payload) => {
- commit(types.SET_GITLAB_MANAGED_CLUSTER, payload);
-};
-
-export const setNamespacePerEnvironment = ({ commit }, payload) => {
- commit(types.SET_NAMESPACE_PER_ENVIRONMENT, payload);
-};
-
-export const setInstanceType = ({ commit }, payload) => {
- commit(types.SET_INSTANCE_TYPE, payload);
-};
-
-export const setNodeCount = ({ commit }, payload) => {
- commit(types.SET_NODE_COUNT, payload);
-};
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/getters.js b/app/assets/javascripts/create_cluster/eks_cluster/store/getters.js
deleted file mode 100644
index d8489ca31cf..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/getters.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export const subnetValid = ({ selectedSubnet }) =>
- Array.isArray(selectedSubnet) && selectedSubnet.length >= 2;
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/index.js b/app/assets/javascripts/create_cluster/eks_cluster/store/index.js
deleted file mode 100644
index ed054989771..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import Vuex from 'vuex';
-import clusterDropdownStore from '~/create_cluster/store/cluster_dropdown';
-import {
- fetchRoles,
- fetchKeyPairs,
- fetchVpcs,
- fetchSubnets,
- fetchSecurityGroups,
-} from '../services/aws_services_facade';
-import * as actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-const createStore = ({ initialState }) =>
- new Vuex.Store({
- actions,
- getters,
- mutations,
- state: Object.assign(state(), initialState),
- modules: {
- roles: {
- namespaced: true,
- ...clusterDropdownStore({ fetchFn: fetchRoles }),
- },
- keyPairs: {
- namespaced: true,
- ...clusterDropdownStore({ fetchFn: fetchKeyPairs }),
- },
- vpcs: {
- namespaced: true,
- ...clusterDropdownStore({ fetchFn: fetchVpcs }),
- },
- subnets: {
- namespaced: true,
- ...clusterDropdownStore({ fetchFn: fetchSubnets }),
- },
- securityGroups: {
- namespaced: true,
- ...clusterDropdownStore({ fetchFn: fetchSecurityGroups }),
- },
- instanceTypes: {
- namespaced: true,
- ...clusterDropdownStore({ initialState: { items: initialState.instanceTypes } }),
- },
- },
- });
-
-export default createStore;
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/mutation_types.js b/app/assets/javascripts/create_cluster/eks_cluster/store/mutation_types.js
deleted file mode 100644
index 4a48195a27b..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/mutation_types.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export const SET_CLUSTER_NAME = 'SET_CLUSTER_NAME';
-export const SET_ENVIRONMENT_SCOPE = 'SET_ENVIRONMENT_SCOPE';
-export const SET_KUBERNETES_VERSION = 'SET_KUBERNETES_VERSION';
-export const SET_REGION = 'SET_REGION';
-export const SET_VPC = 'SET_VPC';
-export const SET_KEY_PAIR = 'SET_KEY_PAIR';
-export const SET_SUBNET = 'SET_SUBNET';
-export const SET_ROLE = 'SET_ROLE';
-export const SET_SECURITY_GROUP = 'SET_SECURITY_GROUP';
-export const SET_INSTANCE_TYPE = 'SET_INSTANCE_TYPE';
-export const SET_NODE_COUNT = 'SET_NODE_COUNT';
-export const SET_GITLAB_MANAGED_CLUSTER = 'SET_GITLAB_MANAGED_CLUSTER';
-export const SET_NAMESPACE_PER_ENVIRONMENT = 'SET_NAMESPACE_PER_ENVIRONMENT';
-export const REQUEST_CREATE_ROLE = 'REQUEST_CREATE_ROLE';
-export const CREATE_ROLE_SUCCESS = 'CREATE_ROLE_SUCCESS';
-export const CREATE_ROLE_ERROR = 'CREATE_ROLE_ERROR';
-export const REQUEST_CREATE_CLUSTER = 'REQUEST_CREATE_CLUSTER';
-export const CREATE_CLUSTER_SUCCESS = 'CREATE_CLUSTER_SUCCESS';
-export const CREATE_CLUSTER_ERROR = 'CREATE_CLUSTER_ERROR';
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/mutations.js b/app/assets/javascripts/create_cluster/eks_cluster/store/mutations.js
deleted file mode 100644
index f57236e0e31..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/mutations.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.SET_CLUSTER_NAME](state, { clusterName }) {
- state.clusterName = clusterName;
- },
- [types.SET_ENVIRONMENT_SCOPE](state, { environmentScope }) {
- state.environmentScope = environmentScope;
- },
- [types.SET_KUBERNETES_VERSION](state, { kubernetesVersion }) {
- state.kubernetesVersion = kubernetesVersion;
- },
- [types.SET_REGION](state, { region }) {
- state.selectedRegion = region;
- },
- [types.SET_KEY_PAIR](state, { keyPair }) {
- state.selectedKeyPair = keyPair;
- },
- [types.SET_VPC](state, { vpc }) {
- state.selectedVpc = vpc;
- },
- [types.SET_SUBNET](state, { subnet }) {
- state.selectedSubnet = subnet;
- },
- [types.SET_ROLE](state, { role }) {
- state.selectedRole = role;
- },
- [types.SET_SECURITY_GROUP](state, { securityGroup }) {
- state.selectedSecurityGroup = securityGroup;
- },
- [types.SET_INSTANCE_TYPE](state, { instanceType }) {
- state.selectedInstanceType = instanceType;
- },
- [types.SET_NODE_COUNT](state, { nodeCount }) {
- state.nodeCount = nodeCount;
- },
- [types.SET_GITLAB_MANAGED_CLUSTER](state, { gitlabManagedCluster }) {
- state.gitlabManagedCluster = gitlabManagedCluster;
- },
- [types.SET_NAMESPACE_PER_ENVIRONMENT](state, { namespacePerEnvironment }) {
- state.namespacePerEnvironment = namespacePerEnvironment;
- },
- [types.REQUEST_CREATE_ROLE](state) {
- state.isCreatingRole = true;
- state.createRoleError = null;
- state.hasCredentials = false;
- },
- [types.CREATE_ROLE_SUCCESS](state) {
- state.isCreatingRole = false;
- state.createRoleError = null;
- state.hasCredentials = true;
- },
- [types.CREATE_ROLE_ERROR](state, { error }) {
- state.isCreatingRole = false;
- state.createRoleError = error;
- state.hasCredentials = false;
- },
- [types.REQUEST_CREATE_CLUSTER](state) {
- state.isCreatingCluster = true;
- state.createClusterError = null;
- },
- [types.CREATE_CLUSTER_ERROR](state, { error }) {
- state.isCreatingCluster = false;
- state.createClusterError = error;
- },
-};
diff --git a/app/assets/javascripts/create_cluster/eks_cluster/store/state.js b/app/assets/javascripts/create_cluster/eks_cluster/store/state.js
deleted file mode 100644
index c906ddf9011..00000000000
--- a/app/assets/javascripts/create_cluster/eks_cluster/store/state.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { KUBERNETES_VERSIONS } from '../constants';
-
-const kubernetesVersion = KUBERNETES_VERSIONS.find((version) => version.default).value;
-
-export default () => ({
- createRolePath: null,
-
- isCreatingRole: false,
- roleCreated: false,
- createRoleError: false,
-
- accountId: '',
- externalId: '',
-
- roleArn: '',
-
- clusterName: '',
- environmentScope: '*',
- kubernetesVersion,
- selectedRegion: '',
- selectedRole: '',
- selectedKeyPair: '',
- selectedVpc: '',
- selectedSubnet: [],
- selectedSecurityGroup: '',
- selectedInstanceType: 'm5.large',
- nodeCount: '3',
-
- isCreatingCluster: false,
- createClusterError: false,
-
- gitlabManagedCluster: true,
- namespacePerEnvironment: true,
-});
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_dropdown_mixin.js b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_dropdown_mixin.js
deleted file mode 100644
index 1246fdb19d7..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_dropdown_mixin.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { GlLoadingIcon } from '@gitlab/ui';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-import DropdownSearchInput from '~/vue_shared/components/dropdown/dropdown_search_input.vue';
-
-import store from '../store';
-
-export default {
- store,
- components: {
- DropdownButton,
- DropdownSearchInput,
- DropdownHiddenInput,
- GlLoadingIcon,
- },
- props: {
- fieldId: {
- type: String,
- required: true,
- },
- fieldName: {
- type: String,
- required: true,
- },
- defaultValue: {
- type: String,
- required: false,
- default: '',
- },
- },
- data() {
- return {
- isLoading: false,
- hasErrors: false,
- searchQuery: '',
- gapiError: '',
- };
- },
- computed: {
- results() {
- if (!this.items) {
- return [];
- }
-
- return this.items.filter((item) => item.name.toLowerCase().indexOf(this.searchQuery) > -1);
- },
- },
- methods: {
- fetchSuccessHandler() {
- if (this.defaultValue) {
- const itemToSelect = this.items.find((item) => item.name === this.defaultValue);
-
- if (itemToSelect) {
- this.setItem(itemToSelect.name);
- }
- }
-
- this.isLoading = false;
- this.hasErrors = false;
- },
- fetchFailureHandler(resp) {
- this.isLoading = false;
- this.hasErrors = true;
-
- if (resp.result && resp.result.error) {
- this.gapiError = resp.result.error.message;
- }
- },
- },
-};
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue
deleted file mode 100644
index 23c477bfbfd..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<script>
-import { mapState, mapGetters, mapActions } from 'vuex';
-import { sprintf, s__ } from '~/locale';
-
-import gkeDropdownMixin from './gke_dropdown_mixin';
-
-export default {
- name: 'GkeMachineTypeDropdown',
- mixins: [gkeDropdownMixin],
- computed: {
- ...mapState([
- 'isValidatingProjectBilling',
- 'projectHasBillingEnabled',
- 'selectedZone',
- 'selectedMachineType',
- ]),
- ...mapState({ items: 'machineTypes' }),
- ...mapGetters(['hasZone', 'hasMachineType']),
- isDisabled() {
- return (
- this.isLoading ||
- this.isValidatingProjectBilling ||
- !this.projectHasBillingEnabled ||
- !this.hasZone
- );
- },
- toggleText() {
- if (this.isLoading) {
- return s__('ClusterIntegration|Fetching machine types');
- }
-
- if (this.selectedMachineType) {
- return this.selectedMachineType;
- }
-
- if (!this.projectHasBillingEnabled && !this.hasZone) {
- return s__('ClusterIntegration|Select project and zone to choose machine type');
- }
-
- return !this.hasZone
- ? s__('ClusterIntegration|Select zone to choose machine type')
- : s__('ClusterIntegration|Select machine type');
- },
- errorMessage() {
- return sprintf(
- s__(
- 'ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}',
- ),
- { error: this.gapiError },
- );
- },
- },
- watch: {
- selectedZone() {
- this.hasErrors = false;
-
- if (this.hasZone) {
- this.isLoading = true;
-
- this.fetchMachineTypes().then(this.fetchSuccessHandler).catch(this.fetchFailureHandler);
- }
- },
- },
- methods: {
- ...mapActions(['fetchMachineTypes']),
- ...mapActions({ setItem: 'setMachineType' }),
- },
-};
-</script>
-
-<template>
- <div>
- <div class="js-gcp-machine-type-dropdown dropdown">
- <dropdown-hidden-input :name="fieldName" :value="selectedMachineType" />
- <dropdown-button
- :class="{ 'border-danger': hasErrors }"
- :is-disabled="isDisabled"
- :is-loading="isLoading"
- :toggle-text="toggleText"
- />
- <div class="dropdown-menu dropdown-select">
- <dropdown-search-input
- v-model="searchQuery"
- :placeholder-text="s__('ClusterIntegration|Search machine types')"
- />
- <div class="dropdown-content">
- <ul>
- <li v-show="!results.length">
- <span class="menu-item">
- {{ s__('ClusterIntegration|No machine types matched your search') }}
- </span>
- </li>
- <li v-for="result in results" :key="result.id">
- <button type="button" @click.prevent="setItem(result.name)">{{ result.name }}</button>
- </li>
- </ul>
- </div>
- <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
- </div>
- </div>
- <span
- v-if="hasErrors"
- :class="{
- 'text-danger': hasErrors,
- 'text-muted': !hasErrors,
- }"
- class="form-text"
- >
- {{ errorMessage }}
- </span>
- </div>
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue
deleted file mode 100644
index 8f18ac29c0f..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_network_dropdown.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<script>
-import { createNamespacedHelpers, mapState, mapGetters, mapActions } from 'vuex';
-
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-
-const { mapState: mapDropdownState } = createNamespacedHelpers('networks');
-const { mapActions: mapSubnetworkActions } = createNamespacedHelpers('subnetworks');
-
-export default {
- components: {
- ClusterFormDropdown,
- },
- props: {
- fieldName: {
- type: String,
- required: true,
- },
- },
- computed: {
- ...mapState(['selectedNetwork']),
- ...mapDropdownState(['items', 'isLoadingItems', 'loadingItemsError']),
- ...mapGetters(['hasZone', 'projectId', 'region']),
- },
- methods: {
- ...mapActions(['setNetwork', 'setSubnetwork']),
- ...mapSubnetworkActions({ fetchSubnetworks: 'fetchItems' }),
- setNetworkAndFetchSubnetworks(network) {
- const { projectId: project, region } = this;
-
- this.setSubnetwork('');
- this.setNetwork(network);
- this.fetchSubnetworks({ project, region, network: network.selfLink });
- },
- },
-};
-</script>
-<template>
- <cluster-form-dropdown
- :field-name="fieldName"
- :value="selectedNetwork"
- :items="items"
- :disabled="!hasZone"
- :loading="isLoadingItems"
- :has-errors="Boolean(loadingItemsError)"
- :loading-text="s__('ClusterIntegration|Loading networks')"
- :placeholder="s__('ClusterIntegration|Select a network')"
- :search-field-placeholder="s__('ClusterIntegration|Search networks')"
- :empty-text="s__('ClusterIntegration|No networks found')"
- :error-message="s__('ClusterIntegration|Could not load networks')"
- :disabled-text="s__('ClusterIntegration|Select a zone to choose a network')"
- @input="setNetworkAndFetchSubnetworks"
- />
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
deleted file mode 100644
index aba6dd4b493..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue
+++ /dev/null
@@ -1,194 +0,0 @@
-<script>
-import { GlSprintf, GlLink, GlIcon } from '@gitlab/ui';
-import { mapState, mapGetters, mapActions } from 'vuex';
-import { s__ } from '~/locale';
-
-import gkeDropdownMixin from './gke_dropdown_mixin';
-
-export default {
- name: 'GkeProjectIdDropdown',
- components: {
- GlSprintf,
- GlLink,
- GlIcon,
- },
- mixins: [gkeDropdownMixin],
- props: {
- docsUrl: {
- type: String,
- required: true,
- },
- },
- computed: {
- ...mapState(['selectedProject', 'isValidatingProjectBilling', 'projectHasBillingEnabled']),
- ...mapState({ items: 'projects' }),
- ...mapGetters(['hasProject']),
- hasOneProject() {
- return this.items && this.items.length === 1;
- },
- isDisabled() {
- return (
- this.isLoading || this.isValidatingProjectBilling || (this.items && this.items.length < 2)
- );
- },
- toggleText() {
- if (this.isValidatingProjectBilling) {
- return s__('ClusterIntegration|Validating project billing status');
- }
-
- if (this.isLoading) {
- return s__('ClusterIntegration|Fetching projects');
- }
-
- if (this.hasProject) {
- return this.selectedProject.name;
- }
-
- if (!this.items) {
- return s__('ClusterIntegration|No projects found');
- }
-
- return s__('ClusterIntegration|Select project');
- },
- helpText() {
- if (this.hasErrors) {
- return this.errorMessage;
- }
-
- if (!this.items) {
- return s__(
- 'ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}.',
- );
- }
-
- return this.items.length
- ? s__(
- 'ClusterIntegration|To use a new project, first create one on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}.',
- )
- : s__(
- 'ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}.',
- );
- },
- errorMessage() {
- if (!this.projectHasBillingEnabled) {
- if (this.gapiError) {
- return s__(
- 'ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again.',
- );
- }
-
- return s__(
- 'ClusterIntegration|This project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again.',
- );
- }
-
- return s__(
- 'ClusterIntegration|An error occurred while trying to fetch your projects: %{error}',
- );
- },
- },
- watch: {
- selectedProject() {
- this.setIsValidatingProjectBilling(true);
-
- this.validateProjectBilling()
- .then(this.validateProjectBillingSuccessHandler)
- .catch(this.validateProjectBillingFailureHandler);
- },
- },
- created() {
- this.isLoading = true;
-
- this.fetchProjects().then(this.fetchSuccessHandler).catch(this.fetchFailureHandler);
- },
- methods: {
- ...mapActions(['fetchProjects', 'setIsValidatingProjectBilling', 'validateProjectBilling']),
- ...mapActions({ setItem: 'setProject' }),
- fetchSuccessHandler() {
- if (this.defaultValue) {
- const projectToSelect = this.items.find((item) => item.projectId === this.defaultValue);
-
- if (projectToSelect) {
- this.setItem(projectToSelect);
- }
- } else if (this.items.length === 1) {
- this.setItem(this.items[0]);
- }
-
- this.isLoading = false;
- this.hasErrors = false;
- },
- validateProjectBillingSuccessHandler() {
- this.hasErrors = !this.projectHasBillingEnabled;
- },
- validateProjectBillingFailureHandler(resp) {
- this.hasErrors = true;
-
- this.gapiError = resp.result ? resp.result.error.message : resp;
- },
- },
-};
-</script>
-
-<template>
- <div>
- <div class="js-gcp-project-id-dropdown dropdown">
- <dropdown-hidden-input :name="fieldName" :value="selectedProject.projectId" />
- <dropdown-button
- :class="{
- 'border-danger': hasErrors,
- 'read-only': hasOneProject,
- }"
- :is-disabled="isDisabled"
- :is-loading="isLoading"
- :toggle-text="toggleText"
- />
- <div class="dropdown-menu dropdown-select">
- <dropdown-search-input
- v-model="searchQuery"
- :placeholder-text="s__('ClusterIntegration|Search projects')"
- />
- <div class="dropdown-content">
- <ul>
- <li v-show="!results.length">
- <span class="menu-item">
- {{ s__('ClusterIntegration|No projects matched your search') }}
- </span>
- </li>
- <li v-for="result in results" :key="result.project_number">
- <button type="button" @click.prevent="setItem(result)">{{ result.name }}</button>
- </li>
- </ul>
- </div>
- <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
- </div>
- </div>
- <span
- :class="{
- 'text-danger': hasErrors,
- 'text-muted': !hasErrors,
- }"
- class="form-text"
- >
- <gl-sprintf :message="helpText">
- <template #linkToBilling="{ content }">
- <gl-link
- :href="'https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral'"
- target="_blank"
- >{{ content }} <gl-icon name="external-link"
- /></gl-link>
- </template>
-
- <template #docsLink="{ content }">
- <gl-link :href="docsUrl" target="_blank"
- >{{ content }} <gl-icon name="external-link"
- /></gl-link>
- </template>
-
- <template #error>
- {{ gapiError }}
- </template>
- </gl-sprintf>
- </span>
- </div>
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_submit_button.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_submit_button.vue
deleted file mode 100644
index a7e08a5e97f..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_submit_button.vue
+++ /dev/null
@@ -1,18 +0,0 @@
-<script>
-import { mapGetters } from 'vuex';
-
-export default {
- computed: {
- ...mapGetters(['hasValidData']),
- },
-};
-</script>
-<template>
- <button
- type="submit"
- :disabled="!hasValidData"
- class="js-gke-cluster-creation-submit btn btn-success"
- >
- {{ s__('ClusterIntegration|Create Kubernetes cluster') }}
- </button>
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue
deleted file mode 100644
index dab4adc3789..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-<script>
-import { createNamespacedHelpers, mapState, mapGetters, mapActions } from 'vuex';
-
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-
-const { mapState: mapDropdownState } = createNamespacedHelpers('subnetworks');
-
-export default {
- components: {
- ClusterFormDropdown,
- },
- props: {
- fieldName: {
- type: String,
- required: true,
- },
- },
- computed: {
- ...mapState(['selectedSubnetwork']),
- ...mapDropdownState(['items', 'isLoadingItems', 'loadingItemsError']),
- ...mapGetters(['hasNetwork']),
- },
- methods: {
- ...mapActions(['setSubnetwork']),
- },
-};
-</script>
-<template>
- <cluster-form-dropdown
- :field-name="fieldName"
- :value="selectedSubnetwork"
- :items="items"
- :disabled="!hasNetwork"
- :loading="isLoadingItems"
- :has-errors="Boolean(loadingItemsError)"
- :loading-text="s__('ClusterIntegration|Loading subnetworks')"
- :placeholder="s__('ClusterIntegration|Select a subnetwork')"
- :search-field-placeholder="s__('ClusterIntegration|Search subnetworks')"
- :empty-text="s__('ClusterIntegration|No subnetworks found')"
- :error-message="s__('ClusterIntegration|Could not load subnetworks')"
- :disabled-text="s__('ClusterIntegration|Select a network to choose a subnetwork')"
- @input="setSubnetwork"
- />
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue b/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue
deleted file mode 100644
index 027ce74753e..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/components/gke_zone_dropdown.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-<script>
-import { mapState, mapActions } from 'vuex';
-import { sprintf, s__ } from '~/locale';
-
-import gkeDropdownMixin from './gke_dropdown_mixin';
-
-export default {
- name: 'GkeZoneDropdown',
- mixins: [gkeDropdownMixin],
- computed: {
- ...mapState([
- 'selectedProject',
- 'selectedZone',
- 'projects',
- 'isValidatingProjectBilling',
- 'projectHasBillingEnabled',
- ]),
- ...mapState({ items: 'zones' }),
- isDisabled() {
- return this.isLoading || this.isValidatingProjectBilling || !this.projectHasBillingEnabled;
- },
- toggleText() {
- if (this.isLoading) {
- return s__('ClusterIntegration|Fetching zones');
- }
-
- if (this.selectedZone) {
- return this.selectedZone;
- }
-
- return !this.projectHasBillingEnabled
- ? s__('ClusterIntegration|Select project to choose zone')
- : s__('ClusterIntegration|Select zone');
- },
- errorMessage() {
- return sprintf(
- s__('ClusterIntegration|An error occurred while trying to fetch project zones: %{error}'),
- { error: this.gapiError },
- );
- },
- },
- watch: {
- isValidatingProjectBilling(isValidating) {
- this.hasErrors = false;
-
- if (!isValidating && this.projectHasBillingEnabled) {
- this.isLoading = true;
-
- this.fetchZones().then(this.fetchSuccessHandler).catch(this.fetchFailureHandler);
- }
- },
- },
- methods: {
- ...mapActions(['fetchZones']),
- ...mapActions({ setItem: 'setZone' }),
- },
-};
-</script>
-
-<template>
- <div>
- <div class="js-gcp-zone-dropdown dropdown">
- <dropdown-hidden-input :name="fieldName" :value="selectedZone" />
- <dropdown-button
- :class="{ 'border-danger': hasErrors }"
- :is-disabled="isDisabled"
- :is-loading="isLoading"
- :toggle-text="toggleText"
- />
- <div class="dropdown-menu dropdown-select">
- <dropdown-search-input
- v-model="searchQuery"
- :placeholder-text="s__('ClusterIntegration|Search zones')"
- />
- <div class="dropdown-content">
- <ul>
- <li v-show="!results.length">
- <span class="menu-item">
- {{ s__('ClusterIntegration|No zones matched your search') }}
- </span>
- </li>
- <li v-for="result in results" :key="result.id">
- <button type="button" @click.prevent="setItem(result.name)">{{ result.name }}</button>
- </li>
- </ul>
- </div>
- <div class="dropdown-loading"><gl-loading-icon size="sm" /></div>
- </div>
- </div>
- <span
- v-if="hasErrors"
- :class="{
- 'text-danger': hasErrors,
- 'text-muted': !hasErrors,
- }"
- class="form-text"
- >
- {{ errorMessage }}
- </span>
- </div>
-</template>
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/constants.js b/app/assets/javascripts/create_cluster/gke_cluster/constants.js
deleted file mode 100644
index 2a1c0819916..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/constants.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { s__ } from '~/locale';
-
-export const GCP_API_ERROR = s__(
- 'ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later.',
-);
-export const GCP_API_CLOUD_BILLING_ENDPOINT =
- 'https://www.googleapis.com/discovery/v1/apis/cloudbilling/v1/rest';
-export const GCP_API_CLOUD_RESOURCE_MANAGER_ENDPOINT =
- 'https://www.googleapis.com/discovery/v1/apis/cloudresourcemanager/v1/rest';
-export const GCP_API_COMPUTE_ENDPOINT =
- 'https://www.googleapis.com/discovery/v1/apis/compute/v1/rest';
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/gapi_loader.js b/app/assets/javascripts/create_cluster/gke_cluster/gapi_loader.js
deleted file mode 100644
index b5f92fed8eb..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/gapi_loader.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// This is a helper module to lazily import the google APIs for the GKE cluster
-// integration without introducing an indirect global dependency on an
-// initialized window.gapi object.
-export default () => {
- if (window.gapiPromise === undefined) {
- // first time loading the module
- window.gapiPromise = new Promise((resolve, reject) => {
- // this callback is set as a query param to script.src URL
- window.onGapiLoad = () => {
- resolve(window.gapi);
- };
-
- const script = document.createElement('script');
- // do not use script.onload, because gapi continues to load after the initial script load
- script.type = 'text/javascript';
- script.async = true;
- script.src = 'https://apis.google.com/js/api.js?onload=onGapiLoad';
- script.onerror = reject;
- document.head.appendChild(script);
- });
- }
-
- return window.gapiPromise;
-};
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/index.js b/app/assets/javascripts/create_cluster/gke_cluster/index.js
deleted file mode 100644
index 3a42b460e1c..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/index.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import Vue from 'vue';
-import createFlash from '~/flash';
-import GkeMachineTypeDropdown from './components/gke_machine_type_dropdown.vue';
-import GkeProjectIdDropdown from './components/gke_project_id_dropdown.vue';
-import GkeSubmitButton from './components/gke_submit_button.vue';
-import GkeZoneDropdown from './components/gke_zone_dropdown.vue';
-import * as CONSTANTS from './constants';
-import gapiLoader from './gapi_loader';
-
-import store from './store';
-
-const mountComponent = (entryPoint, component, componentName, extraProps = {}) => {
- const el = document.querySelector(entryPoint);
- if (!el) return false;
-
- const hiddenInput = el.querySelector('input');
-
- return new Vue({
- el,
- store,
- components: {
- [componentName]: component,
- },
- render: (createElement) =>
- createElement(componentName, {
- props: {
- fieldName: hiddenInput.getAttribute('name'),
- fieldId: hiddenInput.getAttribute('id'),
- defaultValue: hiddenInput.value,
- ...extraProps,
- },
- }),
- });
-};
-
-const mountGkeProjectIdDropdown = () => {
- const entryPoint = '.js-gcp-project-id-dropdown-entry-point';
- const el = document.querySelector(entryPoint);
-
- mountComponent(entryPoint, GkeProjectIdDropdown, 'gke-project-id-dropdown', {
- docsUrl: el.dataset.docsurl,
- });
-};
-
-const mountGkeZoneDropdown = () => {
- mountComponent('.js-gcp-zone-dropdown-entry-point', GkeZoneDropdown, 'gke-zone-dropdown');
-};
-
-const mountGkeMachineTypeDropdown = () => {
- mountComponent(
- '.js-gcp-machine-type-dropdown-entry-point',
- GkeMachineTypeDropdown,
- 'gke-machine-type-dropdown',
- );
-};
-
-const mountGkeSubmitButton = () => {
- mountComponent('.js-gke-cluster-creation-submit-container', GkeSubmitButton, 'gke-submit-button');
-};
-
-const gkeDropdownErrorHandler = () => {
- createFlash({
- message: CONSTANTS.GCP_API_ERROR,
- });
-};
-
-const initializeGapiClient = (gapi) => () => {
- const el = document.querySelector('.js-gke-cluster-creation');
- if (!el) return false;
-
- return gapi.client
- .init({
- discoveryDocs: [
- CONSTANTS.GCP_API_CLOUD_BILLING_ENDPOINT,
- CONSTANTS.GCP_API_CLOUD_RESOURCE_MANAGER_ENDPOINT,
- CONSTANTS.GCP_API_COMPUTE_ENDPOINT,
- ],
- })
- .then(() => {
- gapi.client.setToken({ access_token: el.dataset.token });
-
- mountGkeProjectIdDropdown();
- mountGkeZoneDropdown();
- mountGkeMachineTypeDropdown();
- mountGkeSubmitButton();
- })
- .catch(gkeDropdownErrorHandler);
-};
-
-const initGkeDropdowns = () =>
- gapiLoader()
- .then((gapi) => gapi.load('client', initializeGapiClient(gapi)))
- .catch(gkeDropdownErrorHandler);
-
-export default initGkeDropdowns;
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/actions.js b/app/assets/javascripts/create_cluster/gke_cluster/store/actions.js
deleted file mode 100644
index f4c35dafc22..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/actions.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import gapiLoader from '../gapi_loader';
-import * as types from './mutation_types';
-
-const gapiResourceListRequest = ({ resource, params, commit, mutation, payloadKey }) =>
- new Promise((resolve, reject) => {
- const request = resource.list(params);
-
- return request.then(
- (resp) => {
- const { result } = resp;
-
- commit(mutation, result[payloadKey]);
-
- resolve();
- },
- (resp) => {
- reject(resp);
- },
- );
- });
-
-export const setProject = ({ commit }, selectedProject) => {
- commit(types.SET_PROJECT, selectedProject);
-};
-
-export const setZone = ({ commit }, selectedZone) => {
- commit(types.SET_ZONE, selectedZone);
-};
-
-export const setMachineType = ({ commit }, selectedMachineType) => {
- commit(types.SET_MACHINE_TYPE, selectedMachineType);
-};
-
-export const setIsValidatingProjectBilling = ({ commit }, isValidatingProjectBilling) => {
- commit(types.SET_IS_VALIDATING_PROJECT_BILLING, isValidatingProjectBilling);
-};
-
-export const fetchProjects = ({ commit }) =>
- gapiLoader().then((gapi) =>
- gapiResourceListRequest({
- resource: gapi.client.cloudresourcemanager.projects,
- params: {},
- commit,
- mutation: types.SET_PROJECTS,
- payloadKey: 'projects',
- }),
- );
-
-export const validateProjectBilling = ({ dispatch, commit, state }) =>
- gapiLoader()
- .then((gapi) => {
- const request = gapi.client.cloudbilling.projects.getBillingInfo({
- name: `projects/${state.selectedProject.projectId}`,
- });
-
- commit(types.SET_ZONE, '');
- commit(types.SET_MACHINE_TYPE, '');
-
- return request;
- })
- .then(
- (resp) => {
- const { billingEnabled } = resp.result;
-
- commit(types.SET_PROJECT_BILLING_STATUS, Boolean(billingEnabled));
- dispatch('setIsValidatingProjectBilling', false);
- },
- (errorResp) => {
- dispatch('setIsValidatingProjectBilling', false);
- return errorResp;
- },
- );
-
-export const fetchZones = ({ commit, state }) =>
- gapiLoader().then((gapi) =>
- gapiResourceListRequest({
- resource: gapi.client.compute.zones,
- params: {
- project: state.selectedProject.projectId,
- },
- commit,
- mutation: types.SET_ZONES,
- payloadKey: 'items',
- }),
- );
-
-export const fetchMachineTypes = ({ commit, state }) =>
- gapiLoader().then((gapi) =>
- gapiResourceListRequest({
- resource: gapi.client.compute.machineTypes,
- params: {
- project: state.selectedProject.projectId,
- zone: state.selectedZone,
- },
- commit,
- mutation: types.SET_MACHINE_TYPES,
- payloadKey: 'items',
- }),
- );
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/getters.js b/app/assets/javascripts/create_cluster/gke_cluster/store/getters.js
deleted file mode 100644
index 99f8393ffdb..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/getters.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export const hasProject = (state) => Boolean(state.selectedProject.projectId);
-export const hasZone = (state) => Boolean(state.selectedZone);
-export const hasMachineType = (state) => Boolean(state.selectedMachineType);
-export const hasValidData = (state, getters) =>
- Boolean(state.projectHasBillingEnabled) && getters.hasZone && getters.hasMachineType;
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/index.js b/app/assets/javascripts/create_cluster/gke_cluster/store/index.js
deleted file mode 100644
index 5f72060633e..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/index.js
+++ /dev/null
@@ -1,18 +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 createState from './state';
-
-Vue.use(Vuex);
-
-export const createStore = () =>
- new Vuex.Store({
- actions,
- getters,
- mutations,
- state: createState(),
- });
-
-export default createStore();
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/mutation_types.js b/app/assets/javascripts/create_cluster/gke_cluster/store/mutation_types.js
deleted file mode 100644
index 45a91efc2d9..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/mutation_types.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export const SET_PROJECT = 'SET_PROJECT';
-export const SET_PROJECT_BILLING_STATUS = 'SET_PROJECT_BILLING_STATUS';
-export const SET_IS_VALIDATING_PROJECT_BILLING = 'SET_IS_VALIDATING_PROJECT_BILLING';
-export const SET_ZONE = 'SET_ZONE';
-export const SET_MACHINE_TYPE = 'SET_MACHINE_TYPE';
-export const SET_PROJECTS = 'SET_PROJECTS';
-export const SET_ZONES = 'SET_ZONES';
-export const SET_MACHINE_TYPES = 'SET_MACHINE_TYPES';
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/mutations.js b/app/assets/javascripts/create_cluster/gke_cluster/store/mutations.js
deleted file mode 100644
index 88a2c1b630d..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/mutations.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.SET_PROJECT](state, selectedProject) {
- Object.assign(state, { selectedProject });
- },
- [types.SET_IS_VALIDATING_PROJECT_BILLING](state, isValidatingProjectBilling) {
- Object.assign(state, { isValidatingProjectBilling });
- },
- [types.SET_PROJECT_BILLING_STATUS](state, projectHasBillingEnabled) {
- Object.assign(state, { projectHasBillingEnabled });
- },
- [types.SET_ZONE](state, selectedZone) {
- Object.assign(state, { selectedZone });
- },
- [types.SET_MACHINE_TYPE](state, selectedMachineType) {
- Object.assign(state, { selectedMachineType });
- },
- [types.SET_PROJECTS](state, projects) {
- Object.assign(state, { projects });
- },
- [types.SET_ZONES](state, zones) {
- Object.assign(state, { zones });
- },
- [types.SET_MACHINE_TYPES](state, machineTypes) {
- Object.assign(state, { machineTypes });
- },
-};
diff --git a/app/assets/javascripts/create_cluster/gke_cluster/store/state.js b/app/assets/javascripts/create_cluster/gke_cluster/store/state.js
deleted file mode 100644
index 9f3c473d4bc..00000000000
--- a/app/assets/javascripts/create_cluster/gke_cluster/store/state.js
+++ /dev/null
@@ -1,13 +0,0 @@
-export default () => ({
- selectedProject: {
- projectId: '',
- name: '',
- },
- selectedZone: '',
- selectedMachineType: '',
- isValidatingProjectBilling: null,
- projectHasBillingEnabled: null,
- projects: [],
- zones: [],
- machineTypes: [],
-});
diff --git a/app/assets/javascripts/create_cluster/init_create_cluster.js b/app/assets/javascripts/create_cluster/init_create_cluster.js
deleted file mode 100644
index d367d7ec333..00000000000
--- a/app/assets/javascripts/create_cluster/init_create_cluster.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import PersistentUserCallout from '~/persistent_user_callout';
-import initGkeDropdowns from './gke_cluster';
-import initGkeNamespace from './gke_cluster_namespace';
-
-const newClusterViews = [':clusters:new', ':clusters:create_gcp', ':clusters:create_user'];
-
-const isProjectLevelCluster = (page) => page.startsWith('project:clusters');
-
-export default (document) => {
- const { page } = document.body.dataset;
- const isNewClusterView = newClusterViews.some((view) => page.endsWith(view));
-
- if (!isNewClusterView) {
- return;
- }
-
- const callout = document.querySelector('.gcp-signup-offer');
- PersistentUserCallout.factory(callout);
-
- initGkeDropdowns();
-
- if (isProjectLevelCluster(page)) {
- initGkeNamespace();
- }
-
- import(/* webpackChunkName: 'eks_cluster' */ '~/create_cluster/eks_cluster')
- .then(({ default: initCreateEKSCluster }) => {
- const el = document.querySelector('.js-create-eks-cluster-form-container');
-
- if (el) {
- initCreateEKSCluster(el);
- }
- })
- .catch(() => {});
-};
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/actions.js b/app/assets/javascripts/create_cluster/store/cluster_dropdown/actions.js
deleted file mode 100644
index 669b0dcc732..00000000000
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/actions.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as types from './mutation_types';
-
-export default (fetchItems) => ({
- requestItems: ({ commit }) => commit(types.REQUEST_ITEMS),
- receiveItemsSuccess: ({ commit }, payload) => commit(types.RECEIVE_ITEMS_SUCCESS, payload),
- receiveItemsError: ({ commit }, payload) => commit(types.RECEIVE_ITEMS_ERROR, payload),
- fetchItems: ({ dispatch }, payload) => {
- dispatch('requestItems');
-
- return fetchItems(payload)
- .then((items) => dispatch('receiveItemsSuccess', { items }))
- .catch((error) => dispatch('receiveItemsError', { error }));
- },
-});
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/index.js b/app/assets/javascripts/create_cluster/store/cluster_dropdown/index.js
deleted file mode 100644
index de8cc44fa7c..00000000000
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import actions from './actions';
-import * as getters from './getters';
-import mutations from './mutations';
-import state from './state';
-
-const createStore = ({ fetchFn, initialState }) => ({
- actions: actions(fetchFn),
- getters,
- mutations,
- state: Object.assign(state(), initialState || {}),
-});
-
-export default createStore;
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutation_types.js b/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutation_types.js
deleted file mode 100644
index 48959a73924..00000000000
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutation_types.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export const REQUEST_ITEMS = 'REQUEST_ITEMS';
-export const RECEIVE_ITEMS_SUCCESS = 'REQUEST_ITEMS_SUCCESS';
-export const RECEIVE_ITEMS_ERROR = 'RECEIVE_ITEMS_ERROR';
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutations.js b/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutations.js
deleted file mode 100644
index d09689f1f6c..00000000000
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/mutations.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.REQUEST_ITEMS](state) {
- state.isLoadingItems = true;
- state.loadingItemsError = null;
- },
- [types.RECEIVE_ITEMS_SUCCESS](state, { items }) {
- state.isLoadingItems = false;
- state.items = items;
- },
- [types.RECEIVE_ITEMS_ERROR](state, { error }) {
- state.isLoadingItems = false;
- state.loadingItemsError = error;
- },
-};
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/state.js b/app/assets/javascripts/create_cluster/store/cluster_dropdown/state.js
deleted file mode 100644
index b949a24216e..00000000000
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default () => ({
- isLoadingItems: false,
- items: [],
- loadingItemsError: null,
-});
diff --git a/app/assets/javascripts/crm/components/form.vue b/app/assets/javascripts/crm/components/form.vue
index 4f94898ff63..72def54aedf 100644
--- a/app/assets/javascripts/crm/components/form.vue
+++ b/app/assets/javascripts/crm/components/form.vue
@@ -1,5 +1,5 @@
<script>
-import { GlAlert, GlButton, GlDrawer, GlFormGroup, GlFormInput } from '@gitlab/ui';
+import { GlAlert, GlButton, GlDrawer, GlFormGroup, GlFormInput, GlFormSelect } from '@gitlab/ui';
import { get as getPropValueByPath, isEmpty } from 'lodash';
import { produce } from 'immer';
import { MountingPortal } from 'portal-vue';
@@ -28,6 +28,7 @@ export default {
GlDrawer,
GlFormGroup,
GlFormInput,
+ GlFormSelect,
MountingPortal,
},
props: {
@@ -136,15 +137,25 @@ export default {
methods: {
setInitialModel() {
const existingModel = this.records.find(({ id }) => id === this.existingId);
+ const noModel = !this.isEditMode || !existingModel;
this.model = this.fields.reduce(
(map, field) =>
Object.assign(map, {
- [field.name]: !this.isEditMode || !existingModel ? null : existingModel[field.name],
+ [field.name]: noModel ? null : this.extractValue(existingModel, field.name),
}),
{},
);
},
+ extractValue(existingModel, fieldName) {
+ const value = existingModel[fieldName];
+ if (value != null) return value;
+
+ /* eslint-disable-next-line @gitlab/require-i18n-strings */
+ if (!fieldName.endsWith('Id')) return null;
+
+ return existingModel[fieldName.slice(0, -2)]?.id;
+ },
formatValue(model, field) {
if (!isEmpty(model[field.name]) && field.input?.type === 'number') {
return parseFloat(model[field.name]);
@@ -216,6 +227,15 @@ export default {
return data[keys[0]];
},
+ getDrawerHeaderHeight() {
+ const wrapperEl = document.querySelector('.content-wrapper');
+
+ if (wrapperEl) {
+ return `${wrapperEl.offsetTop}px`;
+ }
+
+ return '';
+ },
},
MSG_CANCEL,
INDEX_ROUTE_NAME,
@@ -224,7 +244,12 @@ export default {
<template>
<mounting-portal v-if="!loading" mount-to="#js-crm-form-portal" append>
- <gl-drawer class="gl-drawer-responsive gl-absolute" :open="drawerOpen" @close="close(false)">
+ <gl-drawer
+ :header-height="getDrawerHeaderHeight()"
+ class="gl-drawer-responsive"
+ :open="drawerOpen"
+ @close="close(false)"
+ >
<template #title>
<h3>{{ title }}</h3>
</template>
@@ -242,7 +267,13 @@ export default {
:label="getFieldLabel(field)"
:label-for="field.name"
>
- <gl-form-input :id="field.name" v-bind="field.input" v-model="model[field.name]" />
+ <gl-form-select
+ v-if="field.values"
+ :id="field.name"
+ v-model="model[field.name]"
+ :options="field.values"
+ />
+ <gl-form-input v-else :id="field.name" v-bind="field.input" v-model="model[field.name]" />
</gl-form-group>
<span class="gl-float-right">
<gl-button data-testid="cancel-button" @click="close(false)">
diff --git a/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue b/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue
index 58eaabfbb7f..f114ffedfe6 100644
--- a/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue
+++ b/app/assets/javascripts/crm/contacts/components/contact_form_wrapper.vue
@@ -3,6 +3,7 @@ import { s__, __ } from '~/locale';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import { TYPE_CRM_CONTACT, TYPE_GROUP } from '~/graphql_shared/constants';
import ContactForm from '../../components/form.vue';
+import getGroupOrganizationsQuery from '../../organizations/components/graphql/get_group_organizations.query.graphql';
import getGroupContactsQuery from './graphql/get_group_contacts.query.graphql';
import createContactMutation from './graphql/create_contact.mutation.graphql';
import updateContactMutation from './graphql/update_contact.mutation.graphql';
@@ -19,6 +20,26 @@ export default {
default: false,
},
},
+ data() {
+ return {
+ organizations: [],
+ };
+ },
+ apollo: {
+ organizations: {
+ query() {
+ return getGroupOrganizationsQuery;
+ },
+ variables() {
+ return {
+ groupFullPath: this.groupFullPath,
+ };
+ },
+ update(data) {
+ return this.extractOrganizations(data);
+ },
+ },
+ },
computed: {
contactGraphQLId() {
if (!this.isEditMode) return null;
@@ -52,14 +73,35 @@ export default {
additionalCreateParams() {
return { groupId: this.groupGraphQLId };
},
+ fields() {
+ return [
+ { name: 'firstName', label: __('First name'), required: true },
+ { name: 'lastName', label: __('Last name'), required: true },
+ { name: 'email', label: __('Email'), required: true },
+ { name: 'phone', label: __('Phone') },
+ {
+ name: 'organizationId',
+ label: s__('Crm|Organization'),
+ values: this.organizationSelectValues,
+ },
+ { name: 'description', label: __('Description') },
+ ];
+ },
+ organizationSelectValues() {
+ const values = this.organizations.map((o) => {
+ return { value: o.id, text: o.name };
+ });
+
+ values.unshift({ value: null, text: s__('Crm|No organization') });
+ return values;
+ },
+ },
+ methods: {
+ extractOrganizations(data) {
+ const organizations = data?.group?.organizations?.nodes || [];
+ return organizations.slice().sort((a, b) => a.name.localeCompare(b.name));
+ },
},
- fields: [
- { name: 'firstName', label: __('First name'), required: true },
- { name: 'lastName', label: __('Last name'), required: true },
- { name: 'email', label: __('Email'), required: true },
- { name: 'phone', label: __('Phone') },
- { name: 'description', label: __('Description') },
- ],
};
</script>
@@ -71,7 +113,7 @@ export default {
:mutation="mutation"
:additional-create-params="additionalCreateParams"
:existing-id="contactGraphQLId"
- :fields="$options.fields"
+ :fields="fields"
:title="title"
:success-message="successMessage"
/>
diff --git a/app/assets/javascripts/crm/contacts/components/contacts_root.vue b/app/assets/javascripts/crm/contacts/components/contacts_root.vue
index 17be3800256..9d6f34c73b7 100644
--- a/app/assets/javascripts/crm/contacts/components/contacts_root.vue
+++ b/app/assets/javascripts/crm/contacts/components/contacts_root.vue
@@ -55,7 +55,7 @@ export default {
return contacts.slice().sort((a, b) => a.firstName.localeCompare(b.firstName));
},
getIssuesPath(path, value) {
- return `${path}?scope=all&state=opened&crm_contact_id=${value}`;
+ return `${path}?crm_contact_id=${value}`;
},
getEditRoute(id) {
return { name: this.$options.EDIT_ROUTE_NAME, params: { id } };
diff --git a/app/assets/javascripts/crm/organizations/components/organizations_root.vue b/app/assets/javascripts/crm/organizations/components/organizations_root.vue
index 522e29eb2af..a165dd68603 100644
--- a/app/assets/javascripts/crm/organizations/components/organizations_root.vue
+++ b/app/assets/javascripts/crm/organizations/components/organizations_root.vue
@@ -55,7 +55,7 @@ export default {
return organizations.slice().sort((a, b) => a.name.localeCompare(b.name));
},
getIssuesPath(path, value) {
- return `${path}?scope=all&state=opened&crm_organization_id=${value}`;
+ return `${path}?crm_organization_id=${value}`;
},
getEditRoute(id) {
return { name: this.$options.EDIT_ROUTE_NAME, params: { id } };
diff --git a/app/assets/javascripts/cycle_analytics/components/base.vue b/app/assets/javascripts/cycle_analytics/components/base.vue
index 3d7a34581b3..1883030e51f 100644
--- a/app/assets/javascripts/cycle_analytics/components/base.vue
+++ b/app/assets/javascripts/cycle_analytics/components/base.vue
@@ -3,6 +3,7 @@ import { GlLoadingIcon } from '@gitlab/ui';
import { mapActions, mapState, mapGetters } from 'vuex';
import { getCookie, setCookie } from '~/lib/utils/common_utils';
import ValueStreamMetrics from '~/analytics/shared/components/value_stream_metrics.vue';
+import { VSA_METRICS_GROUPS } from '~/analytics/shared/constants';
import { toYmd } from '~/analytics/shared/utils';
import PathNavigation from '~/cycle_analytics/components/path_navigation.vue';
import StageTable from '~/cycle_analytics/components/stage_table.vue';
@@ -150,34 +151,36 @@ export default {
pageTitle: __('Value Stream Analytics'),
recentActivity: __('Recent Project Activity'),
},
+ VSA_METRICS_GROUPS,
};
</script>
<template>
<div>
<h3>{{ $options.i18n.pageTitle }}</h3>
+ <value-stream-filters
+ :group-id="endpoints.groupId"
+ :group-path="endpoints.groupPath"
+ :has-project-filter="false"
+ :start-date="createdAfter"
+ :end-date="createdBefore"
+ @setDateRange="onSetDateRange"
+ />
<div class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row">
<path-navigation
v-if="displayPathNavigation"
data-testid="vsa-path-navigation"
- class="gl-w-full gl-pb-2"
+ class="gl-w-full gl-mt-4"
:loading="isLoading || isLoadingStage"
:stages="pathNavigationData"
:selected-stage="selectedStage"
@selected="onSelectStage"
/>
</div>
- <value-stream-filters
- :group-id="endpoints.groupId"
- :group-path="endpoints.groupPath"
- :has-project-filter="false"
- :start-date="createdAfter"
- :end-date="createdBefore"
- @setDateRange="onSetDateRange"
- />
<value-stream-metrics
:request-path="endpoints.fullPath"
:request-params="filterParams"
:requests="metricsRequests"
+ :group-by="$options.VSA_METRICS_GROUPS"
/>
<gl-loading-icon v-if="isLoading" size="lg" />
<stage-table
diff --git a/app/assets/javascripts/cycle_analytics/components/stage_table.vue b/app/assets/javascripts/cycle_analytics/components/stage_table.vue
index 6a45969fd1a..e4236968efc 100644
--- a/app/assets/javascripts/cycle_analytics/components/stage_table.vue
+++ b/app/assets/javascripts/cycle_analytics/components/stage_table.vue
@@ -191,9 +191,7 @@ export default {
/>
<gl-table
v-else
- head-variant="white"
stacked="lg"
- thead-class="border-bottom"
show-empty
:sort-by.sync="sort"
:sort-direction.sync="direction"
diff --git a/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue
index 66bccf19496..f686cd0db95 100644
--- a/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue
+++ b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue
@@ -1,21 +1,13 @@
<script>
-import { GlIcon, GlToggle, GlTooltipDirective } from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { GlTooltipDirective } from '@gitlab/ui';
import DateRange from '~/analytics/shared/components/daterange.vue';
import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
import { DATE_RANGE_LIMIT, PROJECTS_PER_PAGE } from '~/analytics/shared/constants';
import FilterBar from './filter_bar.vue';
-export const AGGREGATION_TOGGLE_LABEL = s__('CycleAnalytics|Filter by stop date');
-export const AGGREGATION_DESCRIPTION = s__(
- 'CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range.',
-);
-
export default {
name: 'ValueStreamFilters',
components: {
- GlIcon,
- GlToggle,
DateRange,
ProjectsDropdownFilter,
FilterBar,
@@ -57,21 +49,6 @@ export default {
required: false,
default: null,
},
- canToggleAggregation: {
- type: Boolean,
- required: false,
- default: false,
- },
- isAggregationEnabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- isUpdatingAggregationData: {
- type: Boolean,
- required: false,
- default: false,
- },
},
computed: {
projectsQueryParams() {
@@ -81,19 +58,8 @@ export default {
};
},
},
- methods: {
- onUpdateAggregation(ev) {
- if (!this.isUpdatingAggregationData) {
- this.$emit('toggleAggregation', ev);
- }
- },
- },
multiProjectSelect: true,
maxDateRange: DATE_RANGE_LIMIT,
- i18n: {
- AGGREGATION_TOGGLE_LABEL,
- AGGREGATION_DESCRIPTION,
- },
};
</script>
<template>
@@ -123,27 +89,6 @@ export default {
/>
</div>
<div class="gl-display-flex gl-flex-direction-column gl-lg-flex-direction-row">
- <div
- v-if="canToggleAggregation"
- class="gl-display-flex gl-text-align-center gl-my-2 gl-lg-mt-0 gl-lg-mb-0 gl-mr-5"
- >
- <gl-toggle
- class="gl-flex-direction-row"
- :value="isAggregationEnabled"
- :label="$options.i18n.AGGREGATION_TOGGLE_LABEL"
- :disabled="isUpdatingAggregationData"
- label-position="left"
- @change="onUpdateAggregation"
- >
- <template #label>
- {{ $options.i18n.AGGREGATION_TOGGLE_LABEL }}&nbsp;<gl-icon
- v-gl-tooltip.hover
- :title="$options.i18n.AGGREGATION_DESCRIPTION"
- name="information-o"
- />
- </template>
- </gl-toggle>
- </div>
<date-range
v-if="hasDateRangeFilter"
:start-date="startDate"
diff --git a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
index 7acb5549273..814a4b672a2 100644
--- a/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
+++ b/app/assets/javascripts/deploy_freeze/components/deploy_freeze_modal.vue
@@ -137,7 +137,7 @@ export default {
v-model="freezeStartCron"
class="gl-font-monospace!"
data-qa-selector="deploy_freeze_start_field"
- :placeholder="this.$options.translations.cronPlaceholder"
+ :placeholder="$options.translations.cronPlaceholder"
:state="freezeStartCronState"
trim
/>
@@ -154,7 +154,7 @@ export default {
v-model="freezeEndCron"
class="gl-font-monospace!"
data-qa-selector="deploy_freeze_end_field"
- :placeholder="this.$options.translations.cronPlaceholder"
+ :placeholder="$options.translations.cronPlaceholder"
:state="freezeEndCronState"
trim
/>
diff --git a/app/assets/javascripts/design_management/graphql/mutations/toggle_resolve_discussion.mutation.graphql b/app/assets/javascripts/design_management/graphql/mutations/toggle_resolve_discussion.mutation.graphql
index 124f12ef018..c235e7fbf3d 100644
--- a/app/assets/javascripts/design_management/graphql/mutations/toggle_resolve_discussion.mutation.graphql
+++ b/app/assets/javascripts/design_management/graphql/mutations/toggle_resolve_discussion.mutation.graphql
@@ -2,7 +2,7 @@
#import "../fragments/discussion_resolved_status.fragment.graphql"
#import "../fragments/design_todo_item.fragment.graphql"
-mutation toggleResolveDiscussion($id: ID!, $resolve: Boolean!) {
+mutation toggleResolveDiscussion($id: DiscussionID!, $resolve: Boolean!) {
discussionToggleResolve(input: { id: $id, resolve: $resolve }) {
discussion {
id
diff --git a/app/assets/javascripts/design_management/graphql/mutations/upload_design.mutation.graphql b/app/assets/javascripts/design_management/graphql/mutations/upload_design.mutation.graphql
index 34d683ac1ee..3200327e03d 100644
--- a/app/assets/javascripts/design_management/graphql/mutations/upload_design.mutation.graphql
+++ b/app/assets/javascripts/design_management/graphql/mutations/upload_design.mutation.graphql
@@ -3,7 +3,6 @@
mutation uploadDesign($files: [Upload!]!, $projectPath: ID!, $iid: ID!) {
designManagementUpload(input: { projectPath: $projectPath, iid: $iid, files: $files }) {
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
designs {
...DesignItem
versions {
diff --git a/app/assets/javascripts/design_management/graphql/queries/get_design.query.graphql b/app/assets/javascripts/design_management/graphql/queries/get_design.query.graphql
index a5394457f73..730467c33f6 100644
--- a/app/assets/javascripts/design_management/graphql/queries/get_design.query.graphql
+++ b/app/assets/javascripts/design_management/graphql/queries/get_design.query.graphql
@@ -13,7 +13,6 @@ query getDesign(
id
designCollection {
designs(atVersion: $atVersion, filenames: $filenames) {
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
nodes {
...DesignItem
issue {
diff --git a/app/assets/javascripts/design_management/pages/design/index.vue b/app/assets/javascripts/design_management/pages/design/index.vue
index 837320b9423..2b395921ee1 100644
--- a/app/assets/javascripts/design_management/pages/design/index.vue
+++ b/app/assets/javascripts/design_management/pages/design/index.vue
@@ -349,7 +349,9 @@ export default {
class="gl-display-flex gl-overflow-hidden gl-flex-grow-1 gl-flex-direction-column gl-relative"
>
<design-destroyer
- :filenames="[design.filename]"
+ :filenames="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ design.filename,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:project-path="projectPath"
:iid="issueIid"
@done="$router.push({ name: $options.DESIGNS_ROUTE_NAME })"
diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue
index c86f2c8451c..c3436159cea 100644
--- a/app/assets/javascripts/diffs/components/app.vue
+++ b/app/assets/javascripts/diffs/components/app.vue
@@ -17,7 +17,6 @@ import { helpPagePath } from '~/helpers/help_page_helper';
import { parseBoolean } from '~/lib/utils/common_utils';
import { updateHistory } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
-import MrWidgetHowToMergeModal from '~/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue';
import PanelResizer from '~/vue_shared/components/panel_resizer.vue';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -75,7 +74,6 @@ export default {
PanelResizer,
GlPagination,
GlSprintf,
- MrWidgetHowToMergeModal,
GlAlert,
},
mixins: [glFeatureFlagsMixin()],
@@ -373,7 +371,7 @@ export default {
events.push(TRACKING_MULTIPLE_FILES_MODE);
}
- queueRedisHllEvents(events);
+ queueRedisHllEvents(events, { verifyCap: true });
this.subscribeToVirtualScrollingEvents();
},
@@ -738,15 +736,6 @@ export default {
/>
</div>
</div>
- <mr-widget-how-to-merge-modal
- :is-fork="isForked"
- :can-merge="canMerge"
- :source-branch="branchName"
- :source-project-path="sourceProjectFullPath"
- :target-branch="targetBranchName"
- :source-project-default-url="sourceProjectDefaultUrl"
- :reviewing-docs-path="$options.howToMergeDocsPath"
- />
</div>
</div>
</template>
diff --git a/app/assets/javascripts/diffs/components/compare_dropdown_layout.vue b/app/assets/javascripts/diffs/components/compare_dropdown_layout.vue
index 6c5973b7c28..fd219a7d00f 100644
--- a/app/assets/javascripts/diffs/components/compare_dropdown_layout.vue
+++ b/app/assets/javascripts/diffs/components/compare_dropdown_layout.vue
@@ -24,7 +24,12 @@ export default {
</script>
<template>
- <gl-dropdown :text="selectedVersionName" data-qa-selector="dropdown_content">
+ <gl-dropdown
+ :text="selectedVersionName"
+ data-qa-selector="dropdown_content"
+ size="small"
+ category="tertiary"
+ >
<template v-for="version in versions">
<gl-dropdown-divider v-if="version.addDivider" :key="version.id" />
<gl-dropdown-item
diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue
index 4dfd672f99b..8a5325cf218 100644
--- a/app/assets/javascripts/diffs/components/compare_versions.vue
+++ b/app/assets/javascripts/diffs/components/compare_versions.vue
@@ -79,7 +79,7 @@ export default {
</script>
<template>
- <div class="mr-version-controls border-top">
+ <div class="mr-version-controls">
<div class="mr-version-menus-container content-block">
<gl-button
v-if="hasChanges"
diff --git a/app/assets/javascripts/diffs/components/diff_content.vue b/app/assets/javascripts/diffs/components/diff_content.vue
index b4bffdcb07f..1eba12a3ae9 100644
--- a/app/assets/javascripts/diffs/components/diff_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_content.vue
@@ -156,7 +156,7 @@ export default {
:link-href="author.path"
:img-src="author.avatar_url"
:img-alt="author.name"
- :img-size="40"
+ :img-size="48"
class="d-none d-sm-block new-comment"
/>
<diff-discussions
diff --git a/app/assets/javascripts/diffs/components/diff_expansion_cell.vue b/app/assets/javascripts/diffs/components/diff_expansion_cell.vue
index 4c7b8e8f667..4e7dc578193 100644
--- a/app/assets/javascripts/diffs/components/diff_expansion_cell.vue
+++ b/app/assets/javascripts/diffs/components/diff_expansion_cell.vue
@@ -1,42 +1,33 @@
<script>
-import { GlIcon } from '@gitlab/ui';
-import { mapState, mapActions } from 'vuex';
+import { GlTooltipDirective, GlSafeHtmlDirective, GlIcon, GlLoadingIcon } from '@gitlab/ui';
+import { mapActions } from 'vuex';
import createFlash from '~/flash';
import { s__, sprintf } from '~/locale';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import { UNFOLD_COUNT, INLINE_DIFF_VIEW_TYPE, INLINE_DIFF_LINES_KEY } from '../constants';
+import { UNFOLD_COUNT, INLINE_DIFF_LINES_KEY } from '../constants';
import * as utils from '../store/utils';
const EXPAND_ALL = 0;
const EXPAND_UP = 1;
const EXPAND_DOWN = 2;
-const lineNumberByViewType = (viewType, diffLine) => {
- const numberGetters = {
- [INLINE_DIFF_VIEW_TYPE]: (line) => line?.new_line,
- };
- const numberGetter = numberGetters[viewType];
- return numberGetter && numberGetter(diffLine);
-};
-
-const i18n = {
- showMore: sprintf(s__('Diffs|Show %{unfoldCount} lines'), { unfoldCount: UNFOLD_COUNT }),
- showAll: s__('Diffs|Show all unchanged lines'),
-};
-
export default {
- i18n,
+ i18n: {
+ showMore: sprintf(s__('Diffs|Show %{unfoldCount} lines'), { unfoldCount: UNFOLD_COUNT }),
+ showAll: s__('Diffs|Show all unchanged lines'),
+ },
components: {
GlIcon,
+ GlLoadingIcon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ SafeHtml: GlSafeHtmlDirective,
},
mixins: [glFeatureFlagsMixin()],
props: {
- fileHash: {
- type: String,
- required: true,
- },
- contextLinesPath: {
- type: String,
+ file: {
+ type: Object,
required: true,
},
line: {
@@ -53,34 +44,45 @@ export default {
required: false,
default: false,
},
+ inline: {
+ type: Boolean,
+ required: true,
+ },
+ lineCountBetween: {
+ type: Number,
+ required: false,
+ default: -1,
+ },
+ },
+ data() {
+ return { loading: { up: false, down: false, all: false } };
},
computed: {
- ...mapState({
- diffFiles: (state) => state.diffs.diffFiles,
- }),
canExpandUp() {
return !this.isBottom;
},
canExpandDown() {
return this.isBottom || !this.isTop;
},
- },
- created() {
- this.EXPAND_DOWN = EXPAND_DOWN;
- this.EXPAND_UP = EXPAND_UP;
+ isLineCountSmall() {
+ return this.lineCountBetween >= 20 || this.lineCountBetween === -1;
+ },
+ showExpandDown() {
+ return this.canExpandDown && this.isLineCountSmall;
+ },
+ showExpandUp() {
+ return this.canExpandUp && this.isLineCountSmall;
+ },
},
methods: {
...mapActions('diffs', ['loadMoreLines']),
getPrevLineNumber(oldLineNumber, newLineNumber) {
- const diffFile = utils.findDiffFile(this.diffFiles, this.fileHash);
- const index = utils.getPreviousLineIndex(INLINE_DIFF_VIEW_TYPE, diffFile, {
+ const index = utils.getPreviousLineIndex(this.file, {
oldLineNumber,
newLineNumber,
});
- return (
- lineNumberByViewType(INLINE_DIFF_VIEW_TYPE, diffFile[INLINE_DIFF_LINES_KEY][index - 2]) || 0
- );
+ return this.file[INLINE_DIFF_LINES_KEY][index - 2]?.new_line || 0;
},
callLoadMoreLines(
endpoint,
@@ -99,6 +101,9 @@ export default {
message: s__('Diffs|Something went wrong while fetching diff lines.'),
});
this.isRequesting = false;
+ })
+ .finally(() => {
+ this.loading = { up: false, down: false, all: false };
});
},
handleExpandLines(type = EXPAND_ALL) {
@@ -107,25 +112,26 @@ export default {
}
this.isRequesting = true;
- const endpoint = this.contextLinesPath;
- const { fileHash } = this;
- const view = INLINE_DIFF_VIEW_TYPE;
+ const endpoint = this.file.context_lines_path;
const oldLineNumber = this.line.meta_data.old_pos || 0;
const newLineNumber = this.line.meta_data.new_pos || 0;
const offset = newLineNumber - oldLineNumber;
- const expandOptions = { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset };
+ const expandOptions = { endpoint, oldLineNumber, newLineNumber, offset };
if (type === EXPAND_UP) {
+ this.loading.up = true;
this.handleExpandUpLines(expandOptions);
} else if (type === EXPAND_DOWN) {
+ this.loading.down = true;
this.handleExpandDownLines(expandOptions);
} else {
+ this.loading.all = true;
this.handleExpandAllLines(expandOptions);
}
},
handleExpandUpLines(expandOptions) {
- const { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset } = expandOptions;
+ const { endpoint, oldLineNumber, newLineNumber, offset } = expandOptions;
const bottom = this.isBottom;
const lineNumber = newLineNumber - 1;
@@ -139,15 +145,13 @@ export default {
unfold = false;
}
- const params = { since, to, bottom, offset, unfold, view };
+ const params = { since, to, bottom, offset, unfold };
const lineNumbers = { oldLineNumber, newLineNumber };
- this.callLoadMoreLines(endpoint, params, lineNumbers, fileHash);
+ this.callLoadMoreLines(endpoint, params, lineNumbers, this.file.file_hash);
},
handleExpandDownLines(expandOptions) {
const {
endpoint,
- fileHash,
- view,
oldLineNumber: metaOldPos,
newLineNumber: metaNewPos,
offset,
@@ -183,19 +187,19 @@ export default {
}
}
- const params = { since, to, bottom, offset, unfold, view };
+ const params = { since, to, bottom, offset, unfold };
const lineNumbers = { oldLineNumber, newLineNumber };
this.callLoadMoreLines(
endpoint,
params,
lineNumbers,
- fileHash,
+ this.file.file_hash,
isExpandDown,
nextLineNumbers,
);
},
handleExpandAllLines(expandOptions) {
- const { endpoint, fileHash, view, oldLineNumber, newLineNumber, offset } = expandOptions;
+ const { endpoint, oldLineNumber, newLineNumber, offset } = expandOptions;
const bottom = this.isBottom;
const unfold = false;
let since;
@@ -213,21 +217,71 @@ export default {
to = newLineNumber - 1;
}
- const params = { since, to, bottom, offset, unfold, view };
+ const params = { since, to, bottom, offset, unfold };
const lineNumbers = { oldLineNumber, newLineNumber };
- this.callLoadMoreLines(endpoint, params, lineNumbers, fileHash);
+ this.callLoadMoreLines(endpoint, params, lineNumbers, this.file.file_hash);
},
},
+ EXPAND_DOWN,
+ EXPAND_UP,
};
</script>
<template>
- <div class="content js-line-expansion-content">
+ <div
+ v-if="glFeatures.updatedDiffExpansionButtons"
+ class="diff-grid-row diff-grid-row-full diff-tr line_holder match expansion"
+ >
+ <div :class="{ parallel: !inline }" class="diff-grid-left diff-grid-2-col left-side">
+ <div
+ class="diff-td diff-line-num gl-text-center! gl-p-0! gl-w-full! gl-display-flex gl-flex-direction-column"
+ >
+ <button
+ v-if="showExpandDown"
+ v-gl-tooltip.left
+ :title="s__('Diffs|Next 20 lines')"
+ type="button"
+ class="js-unfold-down gl-rounded-0 gl-border-0 diff-line-expand-button"
+ @click="handleExpandLines($options.EXPAND_DOWN)"
+ >
+ <gl-loading-icon v-if="loading.down" size="sm" color="dark" inline />
+ <gl-icon v-else name="expand-down" />
+ </button>
+ <button
+ v-if="lineCountBetween !== -1 && lineCountBetween < 20"
+ v-gl-tooltip.left
+ :title="s__('Diffs|Expand all lines')"
+ type="button"
+ class="js-unfold-all gl-rounded-0 gl-border-0 diff-line-expand-button"
+ @click="handleExpandLines()"
+ >
+ <gl-loading-icon v-if="loading.all" size="sm" color="dark" inline />
+ <gl-icon v-else name="expand" />
+ </button>
+ <button
+ v-if="showExpandUp"
+ v-gl-tooltip.left
+ :title="s__('Diffs|Previous 20 lines')"
+ type="button"
+ class="js-unfold gl-rounded-0 gl-border-0 diff-line-expand-button"
+ @click="handleExpandLines($options.EXPAND_UP)"
+ >
+ <gl-loading-icon v-if="loading.up" size="sm" color="dark" inline />
+ <gl-icon v-else name="expand-up" />
+ </button>
+ </div>
+ <div
+ v-safe-html="line.rich_text"
+ class="gl-display-flex! gl-flex-direction-column gl-justify-content-center diff-td line_content left-side gl-white-space-normal!"
+ ></div>
+ </div>
+ </div>
+ <div v-else class="content js-line-expansion-content">
<button
type="button"
:disabled="!canExpandDown"
class="js-unfold-down gl-mx-2 gl-py-4 gl-cursor-pointer"
- @click="handleExpandLines(EXPAND_DOWN)"
+ @click="handleExpandLines($options.EXPAND_DOWN)"
>
<gl-icon :size="12" name="expand-down" />
<span>{{ $options.i18n.showMore }}</span>
@@ -244,7 +298,7 @@ export default {
type="button"
:disabled="!canExpandUp"
class="js-unfold gl-mx-2 gl-py-4 gl-cursor-pointer"
- @click="handleExpandLines(EXPAND_UP)"
+ @click="handleExpandLines($options.EXPAND_UP)"
>
<gl-icon :size="12" name="expand-up" />
<span>{{ $options.i18n.showMore }}</span>
diff --git a/app/assets/javascripts/diffs/components/diff_file.vue b/app/assets/javascripts/diffs/components/diff_file.vue
index d8f27a967df..0b82be7140c 100644
--- a/app/assets/javascripts/diffs/components/diff_file.vue
+++ b/app/assets/javascripts/diffs/components/diff_file.vue
@@ -5,7 +5,6 @@ import {
GlSafeHtmlDirective as SafeHtml,
GlSprintf,
GlAlert,
- GlModalDirective,
} from '@gitlab/ui';
import { escape } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
@@ -42,7 +41,6 @@ export default {
},
directives: {
SafeHtml,
- GlModalDirective,
},
mixins: [glFeatureFlagsMixin(), IdState({ idProp: (vm) => vm.file.file_hash })],
props: {
@@ -360,10 +358,12 @@ export default {
class="js-file-fork-suggestion-section file-fork-suggestion"
>
<span v-safe-html="forkMessage" class="file-fork-suggestion-note"></span>
- <a
+ <gl-button
:href="file.fork_path"
- class="js-fork-suggestion-button btn btn-grouped btn-inverted btn-success"
- >{{ $options.i18n.fork }}</a
+ class="js-fork-suggestion-button"
+ category="secondary"
+ variant="confirm"
+ >{{ $options.i18n.fork }}</gl-button
>
<button
class="js-cancel-fork-suggestion-button btn btn-grouped"
@@ -379,6 +379,53 @@ export default {
:class="hasBodyClasses.contentByHash"
data-testid="content-area"
>
+ <gl-alert
+ v-if="!showLoadingIcon && file.conflict_type"
+ variant="danger"
+ :dismissible="false"
+ data-testid="conflictsAlert"
+ >
+ {{ $options.CONFLICT_TEXT[file.conflict_type] }}
+ <template v-if="!canMerge">
+ {{ __('Ask someone with write access to resolve it.') }}
+ </template>
+ <gl-sprintf
+ v-else-if="conflictResolutionPath"
+ :message="
+ __(
+ 'You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}.',
+ )
+ "
+ >
+ <template #gitlabLink="{ content }">
+ <gl-button
+ :href="conflictResolutionPath"
+ variant="link"
+ class="gl-vertical-align-text-bottom"
+ >{{ content }}</gl-button
+ >
+ </template>
+ <template #resolveLocally="{ content }">
+ <gl-button
+ variant="link"
+ class="gl-vertical-align-text-bottom js-check-out-modal-trigger"
+ >{{ content }}</gl-button
+ >
+ </template>
+ </gl-sprintf>
+ <gl-sprintf
+ v-else
+ :message="__('You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}.')"
+ >
+ <template #resolveLocally="{ content }">
+ <gl-button
+ variant="link"
+ class="gl-vertical-align-text-bottom js-check-out-modal-trigger"
+ >{{ content }}</gl-button
+ >
+ </template>
+ </gl-sprintf>
+ </gl-alert>
<gl-loading-icon
v-if="showLoadingIcon"
size="sm"
@@ -402,55 +449,6 @@ export default {
<div v-else v-safe-html="errorMessage" class="nothing-here-block"></div>
</div>
<template v-else>
- <gl-alert
- v-if="file.conflict_type"
- variant="danger"
- :dismissible="false"
- data-testid="conflictsAlert"
- >
- {{ $options.CONFLICT_TEXT[file.conflict_type] }}
- <template v-if="!canMerge">
- {{ __('Ask someone with write access to resolve it.') }}
- </template>
- <gl-sprintf
- v-else-if="conflictResolutionPath"
- :message="
- __(
- 'You can %{gitlabLinkStart}resolve conflicts on GitLab%{gitlabLinkEnd} or %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}.',
- )
- "
- >
- <template #gitlabLink="{ content }">
- <gl-button
- :href="conflictResolutionPath"
- variant="link"
- class="gl-vertical-align-text-bottom"
- >{{ content }}</gl-button
- >
- </template>
- <template #resolveLocally="{ content }">
- <gl-button
- v-gl-modal-directive="'modal-merge-info'"
- variant="link"
- class="gl-vertical-align-text-bottom"
- >{{ content }}</gl-button
- >
- </template>
- </gl-sprintf>
- <gl-sprintf
- v-else
- :message="__('You can %{resolveLocallyStart}resolve it locally%{resolveLocallyEnd}.')"
- >
- <template #resolveLocally="{ content }">
- <gl-button
- v-gl-modal-directive="'modal-merge-info'"
- variant="link"
- class="gl-vertical-align-text-bottom"
- >{{ content }}</gl-button
- >
- </template>
- </gl-sprintf>
- </gl-alert>
<div
v-if="showWarning"
class="collapsed-file-warning gl-p-7 gl-bg-orange-50 gl-text-center gl-rounded-bottom-left-base gl-rounded-bottom-right-base"
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index 8cdbd2b7dbc..a75262ee303 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -302,6 +302,7 @@ export default {
@click="handleFileNameClick"
>
<file-icon
+ v-if="!glFeatures.removeDiffHeaderIcons"
:file-name="filePath"
:size="16"
aria-hidden="true"
@@ -394,6 +395,7 @@ export default {
<gl-dropdown
v-gl-tooltip.hover.focus="$options.i18n.optionsDropdownTitle"
size="small"
+ category="tertiary"
right
toggle-class="btn-icon js-diff-more-actions"
class="gl-pt-0!"
@@ -402,7 +404,7 @@ export default {
@hidden="setMoreActionsShown(false)"
>
<template #button-content>
- <gl-icon name="ellipsis_v" class="mr-0" :size="12" />
+ <gl-icon name="ellipsis_v" class="mr-0" />
<span class="sr-only">{{ $options.i18n.optionsDropdownTitle }}</span>
</template>
<gl-dropdown-item
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 7a30740e31b..a2f0e2c2653 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -1,6 +1,6 @@
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -179,7 +179,10 @@ export default {
if (shouldConfirm && isDirty) {
const msg = s__('Notes|Are you sure you want to cancel creating this comment?');
- const confirmed = await confirmAction(msg);
+ const confirmed = await confirmAction(msg, {
+ primaryBtnText: __('Discard changes'),
+ cancelBtnText: __('Continue editing'),
+ });
if (!confirmed) {
return;
diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue
index 4893803a3b6..1b07b00d725 100644
--- a/app/assets/javascripts/diffs/components/diff_row.vue
+++ b/app/assets/javascripts/diffs/components/diff_row.vue
@@ -160,7 +160,13 @@ export default {
<!-- eslint-disable-next-line vue/no-deprecated-functional-template -->
<template functional>
- <div :class="$options.classNameMap(props)" class="diff-grid-row diff-tr line_holder">
+ <div
+ :class="[
+ $options.classNameMap(props),
+ { expansion: props.line.left && props.line.left.type === 'expanded' },
+ ]"
+ class="diff-grid-row diff-tr line_holder"
+ >
<div
:id="props.line.left && props.line.left.line_code"
data-testid="left-side"
diff --git a/app/assets/javascripts/diffs/components/diff_row_utils.js b/app/assets/javascripts/diffs/components/diff_row_utils.js
index 99999445c43..f610ac979ca 100644
--- a/app/assets/javascripts/diffs/components/diff_row_utils.js
+++ b/app/assets/javascripts/diffs/components/diff_row_utils.js
@@ -10,6 +10,7 @@ import {
CONFLICT_MARKER_THEIR,
CONFLICT_THEIR,
CONFLICT_OUR,
+ EXPANDED_LINE_TYPE,
} from '../constants';
export const isHighlighted = (highlightedRow, line, isCommented) => {
@@ -118,10 +119,12 @@ export const mapParallel = (content) => (line) => {
if (right) {
right = {
...right,
- renderDiscussion: Boolean(hasExpandedDiscussionOnRight && right.type),
+ renderDiscussion: Boolean(
+ hasExpandedDiscussionOnRight && right.type && right.type !== EXPANDED_LINE_TYPE,
+ ),
hasDraft: content.hasParallelDraftRight(content.diffFile.file_hash, line),
lineDraft: content.draftForLine(content.diffFile.file_hash, line, 'right'),
- hasCommentForm: Boolean(right.hasForm && right.type),
+ hasCommentForm: Boolean(right.hasForm && right.type && right.type !== EXPANDED_LINE_TYPE),
emptyCellClassMap: { conflict_their: line.left?.type === CONFLICT_OUR },
addCommentTooltip: addCommentTooltip(line.right),
};
diff --git a/app/assets/javascripts/diffs/components/diff_view.vue b/app/assets/javascripts/diffs/components/diff_view.vue
index f46b0a538f1..529f8e0a2f9 100644
--- a/app/assets/javascripts/diffs/components/diff_view.vue
+++ b/app/assets/javascripts/diffs/components/diff_view.vue
@@ -141,6 +141,18 @@ export default {
table.classList.add(`${lineClass}-selected`);
}
},
+ getCountBetweenIndex(index) {
+ if (index === 0) {
+ return -1;
+ } else if (!this.diffLines[index + 1]) {
+ return -1;
+ }
+
+ return (
+ Number(this.diffLines[index + 1].left.new_line) -
+ Number(this.diffLines[index - 1].left.new_line)
+ );
+ },
},
userColorScheme: window.gon.user_color_scheme,
};
@@ -158,38 +170,51 @@ export default {
>
<template v-for="(line, index) in diffLines">
<template v-if="line.isMatchLineLeft || line.isMatchLineRight">
- <div :key="`expand-${index}`" class="diff-tr line_expansion match">
- <div class="diff-td text-center gl-font-regular">
- <diff-expansion-cell
- :file-hash="diffFile.file_hash"
- :context-lines-path="diffFile.context_lines_path"
- :line="line.left"
- :is-top="index === 0"
- :is-bottom="index + 1 === diffLinesLength"
- />
+ <diff-expansion-cell
+ v-if="glFeatures.updatedDiffExpansionButtons"
+ :key="`expand-${index}`"
+ :file="diffFile"
+ :line="line.left"
+ :is-top="index === 0"
+ :is-bottom="index + 1 === diffLinesLength"
+ :inline="inline"
+ :line-count-between="getCountBetweenIndex(index)"
+ />
+ <template v-else>
+ <div :key="`expand-${index}`" class="diff-tr line_expansion old-line_expansion match">
+ <div class="diff-td text-center gl-font-regular">
+ <diff-expansion-cell
+ :file="diffFile"
+ :context-lines-path="diffFile.context_lines_path"
+ :line="line.left"
+ :is-top="index === 0"
+ :is-bottom="index + 1 === diffLinesLength"
+ :inline="inline"
+ />
+ </div>
</div>
- </div>
- <div
- v-if="line.left.rich_text"
- :key="`expand-definition-${index}`"
- class="diff-grid-row diff-tr line_holder match"
- >
- <div class="diff-grid-left diff-grid-3-col left-side">
- <div class="diff-td diff-line-num"></div>
- <div v-if="inline" class="diff-td diff-line-num"></div>
- <div
- v-safe-html="line.left.rich_text"
- class="diff-td line_content left-side gl-white-space-normal!"
- ></div>
+ <div
+ v-if="line.left.rich_text"
+ :key="`expand-definition-${index}`"
+ class="diff-grid-row diff-tr line_holder match"
+ >
+ <div class="diff-grid-left diff-grid-3-col left-side">
+ <div class="diff-td diff-line-num"></div>
+ <div v-if="inline" class="diff-td diff-line-num"></div>
+ <div
+ v-safe-html="line.left.rich_text"
+ class="diff-td line_content left-side gl-white-space-normal!"
+ ></div>
+ </div>
+ <div v-if="!inline" class="diff-grid-right diff-grid-3-col right-side">
+ <div class="diff-td diff-line-num"></div>
+ <div
+ v-safe-html="line.left.rich_text"
+ class="diff-td line_content right-side gl-white-space-normal!"
+ ></div>
+ </div>
</div>
- <div v-if="!inline" class="diff-grid-right diff-grid-3-col right-side">
- <div class="diff-td diff-line-num"></div>
- <div
- v-safe-html="line.left.rich_text"
- class="diff-td line_content right-side gl-white-space-normal!"
- ></div>
- </div>
- </div>
+ </template>
</template>
<diff-row
v-if="!line.isMatchLineLeft && !line.isMatchLineRight"
diff --git a/app/assets/javascripts/diffs/components/hidden_files_warning.vue b/app/assets/javascripts/diffs/components/hidden_files_warning.vue
index b9962682848..f6a8c679f3b 100644
--- a/app/assets/javascripts/diffs/components/hidden_files_warning.vue
+++ b/app/assets/javascripts/diffs/components/hidden_files_warning.vue
@@ -51,7 +51,7 @@ export default {
__(
'To preserve performance only %{strongStart}%{visible} of %{total}%{strongEnd} files are displayed.',
),
- { visible, total },
+ { visible, total } /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */,
)
"
>
diff --git a/app/assets/javascripts/diffs/components/image_diff_overlay.vue b/app/assets/javascripts/diffs/components/image_diff_overlay.vue
index 8871be1f9af..bd040cd1ba1 100644
--- a/app/assets/javascripts/diffs/components/image_diff_overlay.vue
+++ b/app/assets/javascripts/diffs/components/image_diff_overlay.vue
@@ -132,10 +132,10 @@ export default {
<design-note-pin
v-if="canComment && currentCommentForm"
- :position="{
+ :position="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
left: `${currentCommentForm.xPercent}%`,
top: `${currentCommentForm.yPercent}%`,
- }"
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
/>
</div>
</template>
diff --git a/app/assets/javascripts/diffs/constants.js b/app/assets/javascripts/diffs/constants.js
index bbe27c0dbd6..6c0c9c4e1d0 100644
--- a/app/assets/javascripts/diffs/constants.js
+++ b/app/assets/javascripts/diffs/constants.js
@@ -1,6 +1,7 @@
export const INLINE_DIFF_VIEW_TYPE = 'inline';
export const PARALLEL_DIFF_VIEW_TYPE = 'parallel';
export const MATCH_LINE_TYPE = 'match';
+export const EXPANDED_LINE_TYPE = 'expanded';
export const OLD_NO_NEW_LINE_TYPE = 'old-nonewline';
export const NEW_NO_NEW_LINE_TYPE = 'new-nonewline';
export const CONTEXT_LINE_TYPE = 'context';
@@ -101,6 +102,8 @@ export const CONFLICT_MARKER_THEIR = 'conflict_marker_their';
// Tracking events
export const DEFER_DURATION = 750;
+export const TRACKING_CAP_KEY = 'code_review_events_dispatched';
+export const TRACKING_CAP_LENGTH = 86400000; // 24 hours
export const TRACKING_CLICK_DIFF_VIEW_SETTING = 'i_code_review_click_diff_view_setting';
export const TRACKING_DIFF_VIEW_INLINE = 'i_code_review_diff_view_inline';
diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js
index fb35114c0a9..d2b798245fc 100644
--- a/app/assets/javascripts/diffs/store/mutations.js
+++ b/app/assets/javascripts/diffs/store/mutations.js
@@ -4,6 +4,7 @@ import {
DIFF_FILE_MANUAL_COLLAPSE,
DIFF_FILE_AUTOMATIC_COLLAPSE,
INLINE_DIFF_LINES_KEY,
+ EXPANDED_LINE_TYPE,
} from '../constants';
import * as types from './mutation_types';
import {
@@ -131,6 +132,7 @@ export default {
: line.line_code || `${fileHash}_${line.old_line}_${line.new_line}`;
return {
...line,
+ type: line.type || EXPANDED_LINE_TYPE,
line_code: lineCode,
discussions: line.discussions || [],
hasForm: false,
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index f2028892a5f..92f3cf83740 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -15,13 +15,15 @@ import {
CONFLICT_MARKER,
CONFLICT_MARKER_OUR,
CONFLICT_MARKER_THEIR,
+ EXPANDED_LINE_TYPE,
} from '../constants';
import { prepareRawDiffFile } from '../utils/diff_file';
export const isAdded = (line) => ['new', 'new-nonewline'].includes(line.type);
export const isRemoved = (line) => ['old', 'old-nonewline'].includes(line.type);
export const isUnchanged = (line) => !line.type;
-export const isMeta = (line) => ['match', 'new-nonewline', 'old-nonewline'].includes(line.type);
+export const isMeta = (line) =>
+ ['match', EXPANDED_LINE_TYPE, 'new-nonewline', 'old-nonewline'].includes(line.type);
export const isConflictMarker = (line) =>
[CONFLICT_MARKER_OUR, CONFLICT_MARKER_THEIR].includes(line.type);
export const isConflictSeperator = (line) => line.type === CONFLICT_MARKER;
@@ -60,7 +62,7 @@ export const parallelizeDiffLines = (diffLines, inline) => {
const line = diffLines[i];
line.chunk = chunk;
- if (isMeta(line)) chunk += 1;
+ if (isMeta(line) && line.type !== EXPANDED_LINE_TYPE) chunk += 1;
if (isRemoved(line) || isConflictOur(line) || inline) {
lines.push({
@@ -205,7 +207,7 @@ export const findIndexInInlineLines = (lines, lineNumbers) => {
);
};
-export const getPreviousLineIndex = (diffViewType, file, lineNumbers) => {
+export const getPreviousLineIndex = (file, lineNumbers) => {
return findIndexInInlineLines(file[INLINE_DIFF_LINES_KEY], lineNumbers);
};
@@ -406,7 +408,7 @@ function deduplicateFilesList(files) {
export function prepareDiffData({ diff, priorFiles = [], meta = false }) {
const cleanedFiles = (diff.diff_files || [])
- .map((file, index, allFiles) => prepareRawDiffFile({ file, allFiles, meta }))
+ .map((file, index, allFiles) => prepareRawDiffFile({ file, allFiles, meta, index }))
.map(ensureBasicDiffFileLines)
.map(prepareDiffFileLines)
.map((file) => finalizeDiffFile(file));
diff --git a/app/assets/javascripts/diffs/utils/diff_file.js b/app/assets/javascripts/diffs/utils/diff_file.js
index 54dcf70c491..bcd9fa01278 100644
--- a/app/assets/javascripts/diffs/utils/diff_file.js
+++ b/app/assets/javascripts/diffs/utils/diff_file.js
@@ -50,7 +50,7 @@ function identifier(file) {
export const isNotDiffable = (file) => file?.viewer?.name === viewerModes.not_diffable;
-export function prepareRawDiffFile({ file, allFiles, meta = false }) {
+export function prepareRawDiffFile({ file, allFiles, meta = false, index = -1 }) {
const additionalProperties = {
brokenSymlink: fileSymlinkInformation(file, allFiles),
viewer: {
@@ -66,6 +66,10 @@ export function prepareRawDiffFile({ file, allFiles, meta = false }) {
additionalProperties.id = identifier(file);
}
+ if (index >= 0 && Number(index) === index) {
+ additionalProperties.order = index;
+ }
+
return Object.assign(file, additionalProperties);
}
@@ -89,6 +93,27 @@ export function getShortShaFromFile(file) {
return file.content_sha ? truncateSha(String(file.content_sha)) : null;
}
+export function match({ fileA, fileB, mode = 'universal' } = {}) {
+ const matching = {
+ universal: (a, b) => (a?.id && b?.id ? a.id === b.id : false),
+ /*
+ * MR mode can be wildly incorrect if there is ever the possibility of files from multiple MRs
+ * (e.g. a browser-local merge request/file cache).
+ * That's why the default here is "universal" mode: UUIDs can't conflict, but you can opt into
+ * the dangerous one.
+ *
+ * For reference:
+ * file_identifier_hash === sha1( `${filePath}-${Boolean(isNew)}-${Boolean(isDeleted)}-${Boolean(isRenamed)}` )
+ */
+ mr: (a, b) =>
+ a?.file_identifier_hash && b?.file_identifier_hash
+ ? a.file_identifier_hash === b.file_identifier_hash
+ : false,
+ };
+
+ return (matching[mode] || (() => false))(fileA, fileB);
+}
+
export function stats(file) {
let valid = false;
let classes = '';
diff --git a/app/assets/javascripts/diffs/utils/queue_events.js b/app/assets/javascripts/diffs/utils/queue_events.js
index 08fcc98d45f..cc7141df622 100644
--- a/app/assets/javascripts/diffs/utils/queue_events.js
+++ b/app/assets/javascripts/diffs/utils/queue_events.js
@@ -1,13 +1,31 @@
import { delay } from 'lodash';
import api from '~/api';
-import { DEFER_DURATION } from '../constants';
+import { DEFER_DURATION, TRACKING_CAP_KEY, TRACKING_CAP_LENGTH } from '../constants';
-function trackRedisHllUserEvent(event, deferDuration = 0) {
+function shouldDispatchEvent() {
+ const timestamp = parseInt(localStorage.getItem(TRACKING_CAP_KEY), 10);
+
+ if (Number.isNaN(timestamp)) {
+ return true;
+ }
+
+ return timestamp + TRACKING_CAP_LENGTH < Date.now();
+}
+
+export function dispatchRedisHllUserEvent(event, deferDuration = 0) {
delay(() => api.trackRedisHllUserEvent(event), deferDuration);
}
-export function queueRedisHllEvents(events) {
+export function queueRedisHllEvents(events, { verifyCap = false } = {}) {
+ if (verifyCap) {
+ if (!shouldDispatchEvent()) {
+ return;
+ }
+
+ localStorage.setItem(TRACKING_CAP_KEY, Date.now());
+ }
+
events.forEach((event, index) => {
- trackRedisHllUserEvent(event, DEFER_DURATION * (index + 1));
+ dispatchRedisHllUserEvent(event, DEFER_DURATION * (index + 1));
});
}
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar.vue b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
index 1427f2df461..2c177634bbe 100644
--- a/app/assets/javascripts/editor/components/source_editor_toolbar.vue
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
@@ -55,8 +55,8 @@ export default {
id="se-toolbar"
class="gl-py-3 gl-px-5 gl-bg-white gl-border-t gl-border-b gl-display-flex gl-justify-content-space-between gl-align-items-center"
>
- <template v-for="group in $options.groups">
- <gl-button-group v-if="hasGroupItems(group)" :key="group">
+ <div v-for="group in $options.groups" :key="group">
+ <gl-button-group v-if="hasGroupItems(group)">
<template v-for="item in getGroupItems(group)">
<source-editor-toolbar-button
:key="item.id"
@@ -65,6 +65,6 @@ export default {
/>
</template>
</gl-button-group>
- </template>
+ </div>
</section>
</template>
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue b/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue
index 2595d67af34..194b482c12e 100644
--- a/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar_button.vue
@@ -1,7 +1,5 @@
<script>
import { GlButton, GlTooltipDirective } from '@gitlab/ui';
-import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
-import getToolbarItemQuery from '~/editor/graphql/get_item.query.graphql';
export default {
name: 'SourceEditorToolbarButton',
@@ -20,70 +18,40 @@ export default {
},
},
},
- data() {
- return {
- buttonItem: this.button,
- };
- },
- apollo: {
- buttonItem: {
- query: getToolbarItemQuery,
- variables() {
- return {
- id: this.button.id,
- };
- },
- update({ item }) {
- return item;
- },
- skip() {
- return !this.button.id;
- },
- },
- },
computed: {
icon() {
- return this.buttonItem.selected
- ? this.buttonItem.selectedIcon || this.buttonItem.icon
- : this.buttonItem.icon;
+ return this.button.selected ? this.button.selectedIcon || this.button.icon : this.button.icon;
},
label() {
- return this.buttonItem.selected
- ? this.buttonItem.selectedLabel || this.buttonItem.label
- : this.buttonItem.label;
+ return this.button.selected
+ ? this.button.selectedLabel || this.button.label
+ : this.button.label;
+ },
+ showButton() {
+ return Object.entries(this.button).length > 0;
},
},
methods: {
clickHandler() {
- if (this.buttonItem.onClick) {
- this.buttonItem.onClick();
+ if (this.button.onClick) {
+ this.button.onClick();
}
- this.$apollo.mutate({
- mutation: updateToolbarItemMutation,
- variables: {
- id: this.buttonItem.id,
- propsToUpdate: {
- selected: !this.buttonItem.selected,
- },
- },
- });
this.$emit('click');
},
},
};
</script>
<template>
- <div>
- <gl-button
- v-gl-tooltip.hover
- :category="buttonItem.category"
- :variant="buttonItem.variant"
- type="button"
- :selected="buttonItem.selected"
- :icon="icon"
- :title="label"
- :aria-label="label"
- @click="clickHandler"
- />
- </div>
+ <gl-button
+ v-if="showButton"
+ v-gl-tooltip.hover
+ :category="button.category"
+ :variant="button.variant"
+ type="button"
+ :selected="button.selected"
+ :icon="icon"
+ :title="label"
+ :aria-label="label"
+ @click="clickHandler"
+ />
</template>
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar_graphql.js b/app/assets/javascripts/editor/components/source_editor_toolbar_graphql.js
new file mode 100644
index 00000000000..603ba26f22e
--- /dev/null
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar_graphql.js
@@ -0,0 +1,53 @@
+import produce from 'immer';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import typeDefs from '~/editor/graphql/typedefs.graphql';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
+import createDefaultClient from '~/lib/graphql';
+
+Vue.use(VueApollo);
+
+const resolvers = {
+ Mutation: {
+ addToolbarItems: (_, { items = [] }, { cache }) => {
+ const itemsSourceData = cache.readQuery({ query: getToolbarItemsQuery });
+ const data = produce(itemsSourceData, (draftData) => {
+ const existingNodes = draftData?.items?.nodes || [];
+ draftData.items = {
+ nodes: Array.isArray(items) ? [...existingNodes, ...items] : [...existingNodes, items],
+ };
+ });
+ cache.writeQuery({ query: getToolbarItemsQuery, data });
+ },
+
+ removeToolbarItems: (_, { ids }, { cache }) => {
+ const sourceData = cache.readQuery({ query: getToolbarItemsQuery });
+ const {
+ items: { nodes },
+ } = sourceData;
+ const data = produce(sourceData, (draftData) => {
+ draftData.items.nodes = nodes.filter((item) => !ids.includes(item.id));
+ });
+ cache.writeQuery({ query: getToolbarItemsQuery, data });
+ },
+
+ updateToolbarItem: (_, { id, propsToUpdate }, { cache }) => {
+ const itemSourceData = cache.readQuery({ query: getToolbarItemsQuery });
+ const data = produce(itemSourceData, (draftData) => {
+ const existingNodes = draftData?.items?.nodes || [];
+ draftData.items = {
+ nodes: existingNodes.map((item) => {
+ return item.id === id ? { ...item, ...propsToUpdate } : item;
+ }),
+ };
+ });
+ cache.writeQuery({ query: getToolbarItemsQuery, data });
+ },
+ },
+};
+
+const defaultClient = createDefaultClient(resolvers, { typeDefs });
+
+export const apolloProvider = new VueApollo({
+ defaultClient,
+});
diff --git a/app/assets/javascripts/editor/constants.js b/app/assets/javascripts/editor/constants.js
index 361122d8890..83cfdd25757 100644
--- a/app/assets/javascripts/editor/constants.js
+++ b/app/assets/javascripts/editor/constants.js
@@ -1,5 +1,5 @@
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { s__ } from '~/locale';
+import { s__, __ } from '~/locale';
export const URI_PREFIX = 'gitlab';
export const CONTENT_UPDATE_DEBOUNCE = DEFAULT_DEBOUNCE_AND_THROTTLE_MS;
@@ -57,5 +57,8 @@ export const EXTENSION_CI_SCHEMA_FILE_NAME_MATCH = '.gitlab-ci.yml';
export const EXTENSION_MARKDOWN_PREVIEW_PANEL_CLASS = 'md';
export const EXTENSION_MARKDOWN_PREVIEW_PANEL_PARENT_CLASS = 'source-editor-preview';
export const EXTENSION_MARKDOWN_PREVIEW_ACTION_ID = 'markdown-preview';
+export const EXTENSION_MARKDOWN_PREVIEW_HIDE_ACTION_ID = 'markdown-preview-hide';
export const EXTENSION_MARKDOWN_PREVIEW_PANEL_WIDTH = 0.5; // 50% of the width
export const EXTENSION_MARKDOWN_PREVIEW_UPDATE_DELAY = 250; // ms
+export const EXTENSION_MARKDOWN_PREVIEW_LABEL = __('Preview Markdown');
+export const EXTENSION_MARKDOWN_HIDE_PREVIEW_LABEL = __('Hide Live Preview');
diff --git a/app/assets/javascripts/editor/extensions/source_editor_extension_base.js b/app/assets/javascripts/editor/extensions/source_editor_extension_base.js
index 3aa19df964c..0590bb7455a 100644
--- a/app/assets/javascripts/editor/extensions/source_editor_extension_base.js
+++ b/app/assets/javascripts/editor/extensions/source_editor_extension_base.js
@@ -5,7 +5,7 @@ import {
EXTENSION_BASE_LINE_NUMBERS_CLASS,
} from '../constants';
-const hashRegexp = new RegExp('#?L', 'g');
+const hashRegexp = /#?L/g;
const createAnchor = (href) => {
const fragment = new DocumentFragment();
@@ -64,7 +64,7 @@ export class SourceEditorExtension {
const [start, end] =
bounds && Array.isArray(bounds)
? bounds
- : window.location.hash?.replace(hashRegexp, '').split('-');
+ : window.location.hash.replace(hashRegexp, '').split('-');
let startLine = start ? parseInt(start, 10) : null;
let endLine = end ? parseInt(end, 10) : startLine;
if (endLine < startLine) {
diff --git a/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js b/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js
index 9d53268c340..11cc85c659d 100644
--- a/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js
+++ b/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js
@@ -3,14 +3,17 @@ import { BLOB_PREVIEW_ERROR } from '~/blob_edit/constants';
import createFlash from '~/flash';
import { sanitize } from '~/lib/dompurify';
import axios from '~/lib/utils/axios_utils';
-import { __ } from '~/locale';
import syntaxHighlight from '~/syntax_highlight';
import {
EXTENSION_MARKDOWN_PREVIEW_PANEL_CLASS,
EXTENSION_MARKDOWN_PREVIEW_ACTION_ID,
+ EXTENSION_MARKDOWN_PREVIEW_HIDE_ACTION_ID,
EXTENSION_MARKDOWN_PREVIEW_PANEL_WIDTH,
EXTENSION_MARKDOWN_PREVIEW_PANEL_PARENT_CLASS,
EXTENSION_MARKDOWN_PREVIEW_UPDATE_DELAY,
+ EXTENSION_MARKDOWN_PREVIEW_LABEL,
+ EXTENSION_MARKDOWN_HIDE_PREVIEW_LABEL,
+ EDITOR_TOOLBAR_RIGHT_GROUP,
} from '../constants';
const fetchPreview = (text, previewMarkdownPath) => {
@@ -41,31 +44,58 @@ export class EditorMarkdownPreviewExtension {
onSetup(instance, setupOptions) {
this.preview = {
el: undefined,
- action: undefined,
+ actions: {
+ preview: undefined,
+ hide: undefined,
+ },
shown: false,
modelChangeListener: undefined,
path: setupOptions.previewMarkdownPath,
+ actionShowPreviewCondition: instance.createContextKey('toggleLivePreview', true),
};
+ this.toolbarButtons = [];
+
this.setupPreviewAction(instance);
+ if (instance.toolbar) {
+ this.setupToolbar(instance);
+ }
+ }
- instance.getModel().onDidChangeLanguage(({ newLanguage, oldLanguage } = {}) => {
- if (newLanguage === 'markdown' && oldLanguage !== newLanguage) {
- instance.setupPreviewAction();
- } else {
- instance.cleanup();
- }
- });
+ onBeforeUnuse(instance) {
+ this.cleanup(instance);
+ const ids = this.toolbarButtons.map((item) => item.id);
+ if (instance.toolbar) {
+ instance.toolbar.removeItems(ids);
+ }
+ }
- instance.onDidChangeModel(() => {
- const model = instance.getModel();
- if (model) {
- const { language } = model.getLanguageIdentifier();
- instance.cleanup();
- if (language === 'markdown') {
- instance.setupPreviewAction();
- }
- }
- });
+ cleanup(instance) {
+ if (this.preview.modelChangeListener) {
+ this.preview.modelChangeListener.dispose();
+ }
+ this.preview.actions.preview.dispose();
+ this.preview.actions.hide.dispose();
+ if (this.preview.shown) {
+ this.togglePreviewPanel(instance);
+ this.togglePreviewLayout(instance);
+ }
+ this.preview.shown = false;
+ }
+
+ setupToolbar(instance) {
+ this.toolbarButtons = [
+ {
+ id: EXTENSION_MARKDOWN_PREVIEW_ACTION_ID,
+ label: EXTENSION_MARKDOWN_PREVIEW_LABEL,
+ icon: 'live-preview',
+ selected: false,
+ group: EDITOR_TOOLBAR_RIGHT_GROUP,
+ category: 'primary',
+ selectedLabel: EXTENSION_MARKDOWN_HIDE_PREVIEW_LABEL,
+ onClick: () => instance.togglePreview(),
+ },
+ ];
+ instance.toolbar.addItems(this.toolbarButtons);
}
togglePreviewLayout(instance) {
@@ -103,22 +133,33 @@ export class EditorMarkdownPreviewExtension {
setupPreviewAction(instance) {
if (instance.getAction(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID)) return;
-
- this.preview.action = instance.addAction({
- id: EXTENSION_MARKDOWN_PREVIEW_ACTION_ID,
- label: __('Preview Markdown'),
+ const actionBasis = {
keybindings: [
// eslint-disable-next-line no-bitwise,no-undef
monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KEY_P),
],
contextMenuGroupId: 'navigation',
contextMenuOrder: 1.5,
-
// Method that will be executed when the action is triggered.
// @param ed The editor instance is passed in as a convenience
run(inst) {
inst.togglePreview();
},
+ };
+
+ this.preview.actions.preview = instance.addAction({
+ ...actionBasis,
+ id: EXTENSION_MARKDOWN_PREVIEW_ACTION_ID,
+ label: EXTENSION_MARKDOWN_PREVIEW_LABEL,
+
+ precondition: 'toggleLivePreview',
+ });
+ this.preview.actions.hide = instance.addAction({
+ ...actionBasis,
+ id: EXTENSION_MARKDOWN_PREVIEW_HIDE_ACTION_ID,
+ label: EXTENSION_MARKDOWN_HIDE_PREVIEW_LABEL,
+
+ precondition: '!toggleLivePreview',
});
}
@@ -126,18 +167,6 @@ export class EditorMarkdownPreviewExtension {
return {
markdownPreview: this.preview,
- cleanup: (instance) => {
- if (this.preview.modelChangeListener) {
- this.preview.modelChangeListener.dispose();
- }
- this.preview.action.dispose();
- if (this.preview.shown) {
- this.togglePreviewPanel(instance);
- this.togglePreviewLayout(instance);
- }
- this.preview.shown = false;
- },
-
fetchPreview: (instance) => this.fetchPreview(instance),
setupPreviewAction: (instance) => this.setupPreviewAction(instance),
@@ -149,6 +178,8 @@ export class EditorMarkdownPreviewExtension {
this.togglePreviewLayout(instance);
this.togglePreviewPanel(instance);
+ this.preview.actionShowPreviewCondition.set(!this.preview.actionShowPreviewCondition.get());
+
if (!this.preview?.shown) {
this.preview.modelChangeListener = instance.onDidChangeModelContent(
debounce(
@@ -161,6 +192,11 @@ export class EditorMarkdownPreviewExtension {
}
this.preview.shown = !this.preview?.shown;
+ if (instance.toolbar) {
+ instance.toolbar.updateItem(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID, {
+ selected: this.preview.shown,
+ });
+ }
},
};
}
diff --git a/app/assets/javascripts/editor/extensions/source_editor_toolbar_ext.js b/app/assets/javascripts/editor/extensions/source_editor_toolbar_ext.js
new file mode 100644
index 00000000000..9655c8ae76a
--- /dev/null
+++ b/app/assets/javascripts/editor/extensions/source_editor_toolbar_ext.js
@@ -0,0 +1,98 @@
+import Vue from 'vue';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
+import removeToolbarItemsMutation from '~/editor/graphql/remove_items.mutation.graphql';
+import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
+import addToolbarItemsMutation from '~/editor/graphql/add_items.mutation.graphql';
+import SourceEditorToolbar from '~/editor/components/source_editor_toolbar.vue';
+import { apolloProvider } from '~/editor/components/source_editor_toolbar_graphql';
+
+const client = apolloProvider.defaultClient;
+
+export class ToolbarExtension {
+ /**
+ * A required getter returning the extension's name
+ * We have to provide it for every extension instead of relying on the built-in
+ * `name` prop because the prop does not survive the webpack's minification
+ * and the name mangling.
+ * @returns {string}
+ */
+ static get extensionName() {
+ return 'ToolbarExtension';
+ }
+ /**
+ * THE LIFE-CYCLE CALLBACKS
+ */
+
+ /**
+ * Is called before the extension gets used by an instance,
+ * Use `onSetup` to setup Monaco directly:
+ * actions, keystrokes, update options, etc.
+ * Is called only once before the extension gets registered
+ *
+ * @param { Object } [instance] The Source Editor instance
+ * @param { Object } [setupOptions] The setupOptions object
+ */
+ // eslint-disable-next-line class-methods-use-this
+ onSetup(instance, setupOptions) {
+ const el = setupOptions?.el || document.getElementById('editor-toolbar');
+ ToolbarExtension.setupVue(el);
+ }
+
+ static setupVue(el) {
+ client.cache.writeQuery({ query: getToolbarItemsQuery, data: { items: { nodes: [] } } });
+ const ToolbarComponent = Vue.extend(SourceEditorToolbar);
+
+ const toolbar = new ToolbarComponent({
+ el,
+ apolloProvider,
+ });
+ toolbar.$mount();
+ }
+
+ /**
+ * The public API of the extension: these are the methods that will be exposed
+ * to the end user
+ * @returns {Object}
+ */
+ // eslint-disable-next-line class-methods-use-this
+ provides() {
+ return {
+ toolbar: {
+ getItem: (id) => {
+ const items = client.readQuery({ query: getToolbarItemsQuery })?.items?.nodes || [];
+ return items.find((item) => item.id === id);
+ },
+ getAllItems: () => {
+ return client.readQuery({ query: getToolbarItemsQuery })?.items?.nodes || [];
+ },
+ addItems: (items = []) => {
+ return client.mutate({
+ mutation: addToolbarItemsMutation,
+ variables: {
+ items,
+ },
+ });
+ },
+ removeItems: (ids = []) => {
+ client.mutate({
+ mutation: removeToolbarItemsMutation,
+ variables: {
+ ids,
+ },
+ });
+ },
+ updateItem: (id = '', propsToUpdate = {}) => {
+ if (id) {
+ client.mutate({
+ mutation: updateToolbarItemMutation,
+ variables: {
+ id,
+ propsToUpdate,
+ },
+ });
+ }
+ },
+ },
+ };
+ }
+}
diff --git a/app/assets/javascripts/editor/graphql/add_items.mutation.graphql b/app/assets/javascripts/editor/graphql/add_items.mutation.graphql
new file mode 100644
index 00000000000..13afcc04a48
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/add_items.mutation.graphql
@@ -0,0 +1,3 @@
+mutation addItems($items: [Item]) {
+ addToolbarItems(items: $items) @client
+}
diff --git a/app/assets/javascripts/editor/graphql/get_item.query.graphql b/app/assets/javascripts/editor/graphql/get_item.query.graphql
deleted file mode 100644
index 7c8bc09f7b0..00000000000
--- a/app/assets/javascripts/editor/graphql/get_item.query.graphql
+++ /dev/null
@@ -1,9 +0,0 @@
-query ToolbarItem($id: String!) {
- item(id: $id) @client {
- id
- label
- icon
- selected
- group
- }
-}
diff --git a/app/assets/javascripts/editor/graphql/remove_items.mutation.graphql b/app/assets/javascripts/editor/graphql/remove_items.mutation.graphql
new file mode 100644
index 00000000000..627f105b0ec
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/remove_items.mutation.graphql
@@ -0,0 +1,3 @@
+mutation removeToolbarItems($ids: [ID!]) {
+ removeToolbarItems(ids: $ids) @client
+}
diff --git a/app/assets/javascripts/editor/graphql/typedefs.graphql b/app/assets/javascripts/editor/graphql/typedefs.graphql
new file mode 100644
index 00000000000..2433ebf6c66
--- /dev/null
+++ b/app/assets/javascripts/editor/graphql/typedefs.graphql
@@ -0,0 +1,23 @@
+type Item {
+ id: ID!
+ label: String!
+ icon: String
+ selected: Boolean
+ group: Int!
+ category: String
+ selectedLabel: String
+}
+
+type Items {
+ nodes: [Item]!
+}
+
+extend type Query {
+ items: Items
+}
+
+extend type Mutation {
+ updateToolbarItem(id: ID!, propsToUpdate: Item!): LocalErrors
+ removeToolbarItems(ids: [ID!]): LocalErrors
+ addToolbarItems(items: [Item]): LocalErrors
+}
diff --git a/app/assets/javascripts/editor/graphql/update_item.mutation.graphql b/app/assets/javascripts/editor/graphql/update_item.mutation.graphql
index f8424c65181..05c18988c87 100644
--- a/app/assets/javascripts/editor/graphql/update_item.mutation.graphql
+++ b/app/assets/javascripts/editor/graphql/update_item.mutation.graphql
@@ -1,3 +1,3 @@
-mutation updateItem($id: String!, $propsToUpdate: Item!) {
+mutation updateItem($id: ID!, $propsToUpdate: Item!) {
updateToolbarItem(id: $id, propsToUpdate: $propsToUpdate) @client
}
diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json
index fe3229ac91b..1352211b927 100644
--- a/app/assets/javascripts/editor/schema/ci.json
+++ b/app/assets/javascripts/editor/schema/ci.json
@@ -170,23 +170,6 @@
}
]
},
- "cobertura": {
- "description": "Path for file(s) that should be parsed as Cobertura XML coverage report",
- "oneOf": [
- {
- "type": "string",
- "description": "Path to a single XML file"
- },
- {
- "type": "array",
- "description": "A list of paths to XML files that will automatically be merged into one report",
- "items": {
- "type": "string"
- },
- "minItems": 1
- }
- ]
- },
"coverage_report": {
"type": "object",
"description": "Used to collect coverage reports from the job.",
@@ -1093,8 +1076,8 @@
"description": "The name of a job to execute when the environment is about to be stopped."
},
"action": {
- "enum": ["start", "prepare", "stop"],
- "description": "Specifies what this job will do. 'start' (default) indicates the job will start the deployment. 'prepare' indicates this will not affect the deployment. 'stop' indicates this will stop the deployment.",
+ "enum": ["start", "prepare", "stop", "verify", "access"],
+ "description": "Specifies what this job will do. 'start' (default) indicates the job will start the deployment. 'prepare'/'verify'/'access' indicates this will not affect the deployment. 'stop' indicates this will stop the deployment.",
"default": "start"
},
"auto_stop_in": {
diff --git a/app/assets/javascripts/environments/components/enable_review_app_modal.vue b/app/assets/javascripts/environments/components/enable_review_app_modal.vue
index 4d43ee156fb..6343fe8702a 100644
--- a/app/assets/javascripts/environments/components/enable_review_app_modal.vue
+++ b/app/assets/javascripts/environments/components/enable_review_app_modal.vue
@@ -45,6 +45,8 @@ export default {
copyToClipboardText: s__('EnableReviewApp|Copy snippet text'),
title: s__('ReviewApp|Enable Review App'),
},
+ visualReviewsDocs: helpPagePath('ci/review_apps/index.md', { anchor: 'visual-reviews' }),
+ connectClusterDocs: helpPagePath('user/clusters/agent/index'),
data() {
const modalInfoCopyId = uniqueId('enable-review-app-copy-string-');
@@ -64,9 +66,6 @@ export default {
except:
- ${this.defaultBranchName}`;
},
- visualReviewsDocs() {
- return helpPagePath('ci/review_apps/index.md', { anchor: 'visual-reviews' });
- },
},
};
</script>
@@ -88,11 +87,7 @@ export default {
<strong>{{ content }}</strong>
</template>
<template #link="{ content }">
- <gl-link
- href="https://docs.gitlab.com/ee/user/project/clusters/add_remove_clusters.html"
- target="_blank"
- >{{ content }}</gl-link
- >
+ <gl-link :href="$options.connectClusterDocs" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</p>
@@ -134,7 +129,7 @@ export default {
<strong>{{ content }}</strong>
</template>
<template #link="{ content }">
- <gl-link :href="visualReviewsDocs" target="_blank">{{ content }}</gl-link>
+ <gl-link :href="$options.visualReviewsDocs" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</p>
diff --git a/app/assets/javascripts/environments/components/environment_folder.vue b/app/assets/javascripts/environments/components/environment_folder.vue
index d5c6d26cfd0..788c3ba6fed 100644
--- a/app/assets/javascripts/environments/components/environment_folder.vue
+++ b/app/assets/javascripts/environments/components/environment_folder.vue
@@ -34,9 +34,6 @@ export default {
variables() {
return { environment: this.nestedEnvironment.latest, scope: this.scope };
},
- pollInterval() {
- return this.interval;
- },
},
interval: {
query: pollIntervalQuery,
@@ -73,6 +70,11 @@ export default {
methods: {
toggleCollapse() {
this.visible = !this.visible;
+ if (this.visible) {
+ this.$apollo.queries.folder.startPolling(this.interval);
+ } else {
+ this.$apollo.queries.folder.stopPolling();
+ }
},
isFirstEnvironment(index) {
return index === 0;
diff --git a/app/assets/javascripts/environments/components/environments_table.vue b/app/assets/javascripts/environments/components/environments_table.vue
index 7b8b756487b..7fcd6e5fff8 100644
--- a/app/assets/javascripts/environments/components/environments_table.vue
+++ b/app/assets/javascripts/environments/components/environments_table.vue
@@ -146,7 +146,7 @@ export default {
{{ tableData.autoStop.title }}
</div>
</div>
- <template v-for="(model, i) in sortedEnvironments" :model="model">
+ <template v-for="(model, i) in sortedEnvironments">
<environment-item
:key="`environment-item-${i}`"
:model="model"
diff --git a/app/assets/javascripts/environments/folder/environments_folder_view.vue b/app/assets/javascripts/environments/folder/environments_folder_view.vue
index 3c608ad0ba9..adb14ce3d6f 100644
--- a/app/assets/javascripts/environments/folder/environments_folder_view.vue
+++ b/app/assets/javascripts/environments/folder/environments_folder_view.vue
@@ -54,7 +54,9 @@ export default {
:key="`${tab.name}-${i}`"
:active="tab.isActive"
:title-item-class="tab.isActive ? 'gl-outline-none' : ''"
- :title-link-attributes="{ 'data-testid': `environments-tab-${tab.scope}` }"
+ :title-link-attributes="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ 'data-testid': `environments-tab-${tab.scope}`,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@click="onChangeTab(tab.scope)"
>
<template #title>
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 3d540d46b3c..86102fd54b1 100644
--- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
+++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue
@@ -254,7 +254,7 @@ export default {
data-testid="integrated-disabled-alert"
@dismiss="isAlertDismissed = true"
>
- <gl-sprintf :message="this.$options.i18n.integratedErrorTrackingDisabledText">
+ <gl-sprintf :message="$options.i18n.integratedErrorTrackingDisabledText">
<template #epicLink="{ content }">
<gl-link :href="$options.epicLink" target="_blank">{{ content }}</gl-link>
</template>
diff --git a/app/assets/javascripts/error_tracking/queries/details.query.graphql b/app/assets/javascripts/error_tracking/queries/details.query.graphql
index f70e09d76f7..dd21b0f9c92 100644
--- a/app/assets/javascripts/error_tracking/queries/details.query.graphql
+++ b/app/assets/javascripts/error_tracking/queries/details.query.graphql
@@ -1,4 +1,4 @@
-query errorDetails($fullPath: ID!, $errorId: ID!) {
+query errorDetails($fullPath: ID!, $errorId: GitlabErrorTrackingDetailedErrorID!) {
project(fullPath: $fullPath) {
id
sentryErrors {
diff --git a/app/assets/javascripts/error_tracking_settings/components/app.vue b/app/assets/javascripts/error_tracking_settings/components/app.vue
index e850d954e0a..70fb1fa9cd7 100644
--- a/app/assets/javascripts/error_tracking_settings/components/app.vue
+++ b/app/assets/javascripts/error_tracking_settings/components/app.vue
@@ -152,7 +152,7 @@ export default {
<template>
<div>
<gl-alert v-if="showIntegratedTrackingDisabledAlert" variant="danger" @dismiss="dismissAlert">
- <gl-sprintf :message="this.$options.i18n.integratedErrorTrackingDisabledText">
+ <gl-sprintf :message="$options.i18n.integratedErrorTrackingDisabledText">
<template #epicLink="{ content }">
<gl-link :href="$options.epicLink" target="_blank">{{ content }}</gl-link>
</template>
diff --git a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
index 09cef74477c..b57db73a86e 100644
--- a/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
+++ b/app/assets/javascripts/filtered_search/available_dropdown_mappings.js
@@ -1,18 +1,15 @@
import { sortMilestonesByDueDate } from '~/milestones/utils';
import { mergeUrlParams } from '../lib/utils/url_utility';
-import DropdownAjaxFilter from './dropdown_ajax_filter';
import DropdownEmoji from './dropdown_emoji';
import DropdownHint from './dropdown_hint';
import DropdownNonUser from './dropdown_non_user';
import DropdownOperator from './dropdown_operator';
import DropdownUser from './dropdown_user';
import DropdownUtils from './dropdown_utils';
-import NullDropdown from './null_dropdown';
export default class AvailableDropdownMappings {
constructor({
container,
- runnerTagsEndpoint,
labelsEndpoint,
milestonesEndpoint,
releasesEndpoint,
@@ -22,7 +19,6 @@ export default class AvailableDropdownMappings {
includeDescendantGroups,
}) {
this.container = container;
- this.runnerTagsEndpoint = runnerTagsEndpoint;
this.labelsEndpoint = labelsEndpoint;
this.milestonesEndpoint = milestonesEndpoint;
this.releasesEndpoint = releasesEndpoint;
@@ -135,25 +131,6 @@ export default class AvailableDropdownMappings {
gl: DropdownNonUser,
element: this.container.querySelector('#js-dropdown-confidential'),
},
- status: {
- reference: null,
- gl: NullDropdown,
- element: this.container.querySelector('#js-dropdown-admin-runner-status'),
- },
- type: {
- reference: null,
- gl: NullDropdown,
- element: this.container.querySelector('#js-dropdown-admin-runner-type'),
- },
- tag: {
- reference: null,
- gl: DropdownAjaxFilter,
- extraArguments: {
- endpoint: this.getRunnerTagsEndpoint(),
- symbol: '~',
- },
- element: this.container.querySelector('#js-dropdown-runner-tag'),
- },
'target-branch': {
reference: null,
gl: DropdownNonUser,
@@ -202,10 +179,6 @@ export default class AvailableDropdownMappings {
return endpoint;
}
- getRunnerTagsEndpoint() {
- return `${this.runnerTagsEndpoint}.json`;
- }
-
getMergeRequestTargetBranchesEndpoint() {
const endpoint = `${
gon.relative_url_root || ''
diff --git a/app/assets/javascripts/filtered_search/constants.js b/app/assets/javascripts/filtered_search/constants.js
index f8b5910de9e..e07dccd11e8 100644
--- a/app/assets/javascripts/filtered_search/constants.js
+++ b/app/assets/javascripts/filtered_search/constants.js
@@ -15,6 +15,4 @@ export const MAX_HISTORY_SIZE = 5;
export const FILTERED_SEARCH = {
MERGE_REQUESTS: 'merge_requests',
ISSUES: 'issues',
- ADMIN_RUNNERS: 'admin/runners',
- GROUP_RUNNERS_ANCHOR: 'runners-settings',
};
diff --git a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
index e467e97dda9..7471d3204d6 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
@@ -9,7 +9,6 @@ import FilteredSearchVisualTokens from './filtered_search_visual_tokens';
export default class FilteredSearchDropdownManager {
constructor({
- runnerTagsEndpoint = '',
labelsEndpoint = '',
milestonesEndpoint = '',
iterationsEndpoint = '',
@@ -26,7 +25,6 @@ export default class FilteredSearchDropdownManager {
const removeTrailingSlash = (url) => url.replace(/\/$/, '');
this.container = FilteredSearchContainer.container;
- this.runnerTagsEndpoint = removeTrailingSlash(runnerTagsEndpoint);
this.labelsEndpoint = removeTrailingSlash(labelsEndpoint);
this.milestonesEndpoint = removeTrailingSlash(milestonesEndpoint);
this.iterationsEndpoint = removeTrailingSlash(iterationsEndpoint);
diff --git a/app/assets/javascripts/filtered_search/filtered_search_manager.js b/app/assets/javascripts/filtered_search/filtered_search_manager.js
index 5ba69f052c9..07f2c75f00a 100644
--- a/app/assets/javascripts/filtered_search/filtered_search_manager.js
+++ b/app/assets/javascripts/filtered_search/filtered_search_manager.js
@@ -114,7 +114,6 @@ export default class FilteredSearchManager {
this.tokenizer = FilteredSearchTokenizer;
const {
- runnerTagsEndpoint = '',
labelsEndpoint = '',
milestonesEndpoint = '',
releasesEndpoint = '',
@@ -124,7 +123,6 @@ export default class FilteredSearchManager {
} = this.filteredSearchInput.dataset;
this.dropdownManager = new FilteredSearchDropdownManager({
- runnerTagsEndpoint,
labelsEndpoint,
milestonesEndpoint,
releasesEndpoint,
@@ -583,7 +581,7 @@ export default class FilteredSearchManager {
* Eg. not[foo]=%bar
* key = foo; value = %bar
*/
- const notKeyValueRegex = new RegExp(/not\[(\w+)\]\[?\]?=(.*)/);
+ const notKeyValueRegex = /not\[(\w+)\]\[?\]?=(.*)/;
return params.map((query) => {
// Check if there are matches for `not` operator
diff --git a/app/assets/javascripts/filtered_search/group_runners_filtered_search_token_keys.js b/app/assets/javascripts/filtered_search/group_runners_filtered_search_token_keys.js
deleted file mode 100644
index ceeb71c4eec..00000000000
--- a/app/assets/javascripts/filtered_search/group_runners_filtered_search_token_keys.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { __ } from '~/locale';
-import FilteredSearchTokenKeys from './filtered_search_token_keys';
-
-const tokenKeys = [
- {
- formattedKey: __('Status'),
- key: 'status',
- type: 'string',
- param: 'status',
- symbol: '',
- icon: 'messages',
- tag: 'status',
- },
- {
- formattedKey: __('Type'),
- key: 'type',
- type: 'string',
- param: 'type',
- symbol: '',
- icon: 'cube',
- tag: 'type',
- },
-];
-
-const GroupRunnersFilteredSearchTokenKeys = new FilteredSearchTokenKeys(tokenKeys);
-
-export default GroupRunnersFilteredSearchTokenKeys;
diff --git a/app/assets/javascripts/filtered_search/null_dropdown.js b/app/assets/javascripts/filtered_search/null_dropdown.js
deleted file mode 100644
index 4cfce2a5beb..00000000000
--- a/app/assets/javascripts/filtered_search/null_dropdown.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import FilteredSearchDropdown from './filtered_search_dropdown';
-
-export default class NullDropdown extends FilteredSearchDropdown {
- renderContent(forceShowList = false) {
- this.droplab.changeHookList(this.hookId, this.dropdown, [], this.config);
-
- super.renderContent(forceShowList);
- }
-}
diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js
index 24ec16bf20e..5a47e76d597 100644
--- a/app/assets/javascripts/flash.js
+++ b/app/assets/javascripts/flash.js
@@ -86,48 +86,43 @@ const addDismissFlashClickListener = (flashEl, fadeTransition) => {
/**
* Render an alert at the top of the page, or, optionally an
- * arbitrary existing container.
- *
- * This alert is always dismissible.
- *
- * Usage:
- *
- * 1. Render a new alert
+ * arbitrary existing container. This alert is always dismissible.
*
+ * @example
+ * // Render a new alert
* import { createAlert, VARIANT_WARNING } from '~/flash';
*
* createAlert({ message: 'My error message' });
* createAlert({ message: 'My warning message', variant: VARIANT_WARNING });
*
- * 2. Dismiss this alert programmatically
- *
+ * @example
+ * // Dismiss this alert programmatically
* const alert = createAlert({ message: 'Message' });
*
* // ...
*
* alert.dismiss();
*
- * 3. Respond to the alert being dismissed
+ * @example
+ * // Respond to the alert being dismissed
+ * createAlert({ message: 'Message', onDismiss: () => {} });
*
- * createAlert({ message: 'Message', onDismiss: () => { ... }});
- *
- * @param {Object} options Options to control the flash message
- * @param {String} options.message Alert message text
- * @param {String?} options.variant Which GlAlert variant to use, should be VARIANT_SUCCESS, VARIANT_WARNING, VARIANT_DANGER, VARIANT_INFO or VARIANT_TIP. Defaults to VARIANT_DANGER.
- * @param {Object?} options.parent Reference to parent element under which alert needs to appear. Defaults to `document`.
- * @param {Function?} options.onDismiss Handler to call when this alert is dismissed.
- * @param {Object?} options.containerSelector Selector for the container of the alert
- * @param {Object?} options.primaryButton Object describing primary button of alert
- * @param {String?} link Href of primary button
- * @param {String?} text Text of primary button
- * @param {Function?} clickHandler Handler to call when primary button is clicked on. The click event is sent as an argument.
- * @param {Object?} options.secondaryButton Object describing secondary button of alert
- * @param {String?} link Href of secondary button
- * @param {String?} text Text of secondary button
- * @param {Function?} clickHandler Handler to call when secondary button is clicked on. The click event is sent as an argument.
- * @param {Boolean?} options.captureError Whether to send error to Sentry
- * @param {Object} options.error Error to be captured in Sentry
- * @returns
+ * @param {object} options - Options to control the flash message
+ * @param {string} options.message - Alert message text
+ * @param {VARIANT_SUCCESS|VARIANT_WARNING|VARIANT_DANGER|VARIANT_INFO|VARIANT_TIP} [options.variant] - Which GlAlert variant to use; it defaults to VARIANT_DANGER.
+ * @param {object} [options.parent] - Reference to parent element under which alert needs to appear. Defaults to `document`.
+ * @param {Function} [options.onDismiss] - Handler to call when this alert is dismissed.
+ * @param {string} [options.containerSelector] - Selector for the container of the alert
+ * @param {object} [options.primaryButton] - Object describing primary button of alert
+ * @param {string} [options.primaryButton.link] - Href of primary button
+ * @param {string} [options.primaryButton.text] - Text of primary button
+ * @param {Function} [options.primaryButton.clickHandler] - Handler to call when primary button is clicked on. The click event is sent as an argument.
+ * @param {object} [options.secondaryButton] - Object describing secondary button of alert
+ * @param {string} [options.secondaryButton.link] - Href of secondary button
+ * @param {string} [options.secondaryButton.text] - Text of secondary button
+ * @param {Function} [options.secondaryButton.clickHandler] - Handler to call when secondary button is clicked on. The click event is sent as an argument.
+ * @param {boolean} [options.captureError] - Whether to send error to Sentry
+ * @param {object} [options.error] - Error to be captured in Sentry
*/
const createAlert = function createAlert({
message,
@@ -207,22 +202,25 @@ const createAlert = function createAlert({
});
};
-/*
- * Flash banner supports different types of Flash configurations
- * along with ability to provide actionConfig which can be used to show
- * additional action or link on banner next to message
+/**
+ * @deprecated use `createAlert` instead
+ *
+ * Flash banner supports different types of Flash configurations
+ * along with ability to provide actionConfig which can be used to show
+ * additional action or link on banner next to message
*
- * @param {Object} options Options to control the flash message
- * @param {String} options.message Flash message text
- * @param {String} options.type Type of Flash, it can be `notice`, `success`, `warning` or `alert` (default)
- * @param {Object} options.parent Reference to parent element under which Flash needs to appear
- * @param {Object} options.actionConfig Map of config to show action on banner
- * @param {String} href URL to which action config should point to (default: '#')
- * @param {String} title Title of action
- * @param {Function} clickHandler Method to call when action is clicked on
- * @param {Boolean} options.fadeTransition Boolean to determine whether to fade the alert out
- * @param {Boolean} options.captureError Boolean to determine whether to send error to Sentry
- * @param {Object} options.error Error to be captured in Sentry
+ * @param {object} options - Options to control the flash message
+ * @param {string} options.message - Flash message text
+ * @param {'alert'|'notice'|'success'|'warning'} [options.type] - Type of Flash; it defaults to 'alert'
+ * @param {Element|Document} [options.parent] - Reference to parent element under which Flash needs to appear
+ * @param {object} [options.actionConfig] - Map of config to show action on banner
+ * @param {string} [options.actionConfig.href] - URL to which action config should point to (default: '#')
+ * @param {string} [options.actionConfig.title] - Title of action
+ * @param {Function} [options.actionConfig.clickHandler] - Method to call when action is clicked on
+ * @param {boolean} [options.fadeTransition] - Boolean to determine whether to fade the alert out
+ * @param {boolean} [options.addBodyClass] - Adds `flash-shown` class to the `body` element
+ * @param {boolean} [options.captureError] - Boolean to determine whether to send error to Sentry
+ * @param {object} [options.error] - Error to be captured in Sentry
*/
const createFlash = function createFlash({
message,
diff --git a/app/assets/javascripts/frequent_items/constants.js b/app/assets/javascripts/frequent_items/constants.js
index 9e1dcf70aa5..cb5d21161a9 100644
--- a/app/assets/javascripts/frequent_items/constants.js
+++ b/app/assets/javascripts/frequent_items/constants.js
@@ -7,7 +7,7 @@ export const FREQUENT_ITEMS = {
ELIGIBLE_FREQUENCY: 3,
};
-export const HOUR_IN_MS = 3600000;
+export const FIFTEEN_MINUTES_IN_MS = 900000;
export const STORAGE_KEY = {
projects: 'frequent-projects',
diff --git a/app/assets/javascripts/frequent_items/utils.js b/app/assets/javascripts/frequent_items/utils.js
index 27ef47df8c8..1c33c8b1084 100644
--- a/app/assets/javascripts/frequent_items/utils.js
+++ b/app/assets/javascripts/frequent_items/utils.js
@@ -1,7 +1,7 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import { take } from 'lodash';
import { sanitize } from '~/lib/dompurify';
-import { FREQUENT_ITEMS, HOUR_IN_MS } from './constants';
+import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from './constants';
export const isMobile = () => ['md', 'sm', 'xs'].includes(bp.getBreakpointSize());
@@ -38,7 +38,8 @@ export const updateExistingFrequentItem = (frequentItem, item) => {
// `frequentItem` comes from localStorage and it's possible it doesn't have a `lastAccessedOn`
const neverAccessed = !frequentItem.lastAccessedOn;
const shouldUpdate =
- neverAccessed || Math.abs(item.lastAccessedOn - frequentItem.lastAccessedOn) / HOUR_IN_MS > 1;
+ neverAccessed ||
+ Math.abs(item.lastAccessedOn - frequentItem.lastAccessedOn) / FIFTEEN_MINUTES_IN_MS > 1;
return {
...item,
diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js
index 8cb2e9e249b..b1af1ad797b 100644
--- a/app/assets/javascripts/gfm_auto_complete.js
+++ b/app/assets/javascripts/gfm_auto_complete.js
@@ -844,7 +844,7 @@ class GfmAutoComplete {
}
}
-GfmAutoComplete.regexSubtext = new RegExp(/\s+/g);
+GfmAutoComplete.regexSubtext = /\s+/g;
GfmAutoComplete.defaultLoadingData = ['loading'];
diff --git a/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql
index 78b2cd34a5c..824997f8e33 100644
--- a/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql
+++ b/app/assets/javascripts/graphql_shared/fragments/issuable_timelogs.fragment.graphql
@@ -1,4 +1,5 @@
fragment TimelogFragment on Timelog {
+ id
timeSpent
user {
id
diff --git a/app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql b/app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql
index 429993b37bf..0b451262b5a 100644
--- a/app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql
+++ b/app/assets/javascripts/graphql_shared/fragments/user_availability.fragment.graphql
@@ -1,4 +1,3 @@
-# eslint-disable-next-line @graphql-eslint/require-id-when-available
fragment UserAvailability on User {
status {
availability
diff --git a/app/assets/javascripts/graphql_shared/mutations/todo_mark_done.mutation.graphql b/app/assets/javascripts/graphql_shared/mutations/todo_mark_done.mutation.graphql
index 4d59b4d94cd..e8ad919f4a8 100644
--- a/app/assets/javascripts/graphql_shared/mutations/todo_mark_done.mutation.graphql
+++ b/app/assets/javascripts/graphql_shared/mutations/todo_mark_done.mutation.graphql
@@ -1,4 +1,4 @@
-mutation todoMarkDone($id: ID!) {
+mutation todoMarkDone($id: TodoID!) {
todoMarkDone(input: { id: $id }) {
errors
todo {
diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json
index 3d6360fc4f8..7ca3f20ec1c 100644
--- a/app/assets/javascripts/graphql_shared/possible_types.json
+++ b/app/assets/javascripts/graphql_shared/possible_types.json
@@ -76,6 +76,10 @@
"Discussion",
"Note"
],
+ "SecurityPolicySource": [
+ "GroupSecurityPolicySource",
+ "ProjectSecurityPolicySource"
+ ],
"Service": [
"BaseService",
"JiraService"
diff --git a/app/assets/javascripts/group.js b/app/assets/javascripts/group.js
index b6a6720e7a1..49e7dd28ff6 100644
--- a/app/assets/javascripts/group.js
+++ b/app/assets/javascripts/group.js
@@ -1,8 +1,13 @@
+import { debounce } from 'lodash';
+
import createFlash from '~/flash';
import { __ } from '~/locale';
import { getGroupPathAvailability } from '~/rest_api';
+import axios from '~/lib/utils/axios_utils';
import { slugify } from './lib/utils/text_utility';
+const DEBOUNCE_TIMEOUT_DURATION = 1000;
+
export default class Group {
constructor() {
this.groupPaths = Array.from(document.querySelectorAll('.js-autofill-group-path'));
@@ -10,7 +15,11 @@ export default class Group {
this.parentId = document.getElementById('group_parent_id');
this.updateHandler = this.update.bind(this);
this.resetHandler = this.reset.bind(this);
- this.updateGroupPathSlugHandler = this.updateGroupPathSlug.bind(this);
+ this.updateGroupPathSlugHandler = debounce(
+ this.updateGroupPathSlug.bind(this),
+ DEBOUNCE_TIMEOUT_DURATION,
+ );
+ this.currentApiRequestController = null;
this.groupNames.forEach((groupName) => {
groupName.addEventListener('keyup', this.updateHandler);
@@ -44,13 +53,23 @@ export default class Group {
});
}
- updateGroupPathSlug({ currentTarget: { value } = '' } = {}) {
- const slug = this.groupPaths[0]?.value || slugify(value);
+ updateGroupPathSlug({ target: { value } = '' } = {}) {
+ if (this.currentApiRequestController !== null) {
+ this.currentApiRequestController.abort();
+ }
+
+ this.currentApiRequestController = new AbortController();
+
+ const slug = slugify(value);
if (!slug) return;
- getGroupPathAvailability(slug, this.parentId?.value)
+ getGroupPathAvailability(slug, this.parentId?.value, {
+ signal: this.currentApiRequestController.signal,
+ })
.then(({ data }) => data)
.then(({ exists, suggests }) => {
+ this.currentApiRequestController = null;
+
if (exists && suggests.length) {
const [suggestedSlug] = suggests;
@@ -63,10 +82,14 @@ export default class Group {
});
}
})
- .catch(() =>
+ .catch((error) => {
+ if (axios.isCancel(error)) {
+ return;
+ }
+
createFlash({
message: __('An error occurred while checking group path. Please refresh and try again.'),
- }),
- );
+ });
+ });
}
}
diff --git a/app/assets/javascripts/group_settings/components/shared_runners_form.vue b/app/assets/javascripts/group_settings/components/shared_runners_form.vue
index dcac337c6ef..3365f4aa76c 100644
--- a/app/assets/javascripts/group_settings/components/shared_runners_form.vue
+++ b/app/assets/javascripts/group_settings/components/shared_runners_form.vue
@@ -1,73 +1,64 @@
<script>
-import { GlToggle, GlLoadingIcon, GlTooltip, GlAlert } from '@gitlab/ui';
-import { debounce } from 'lodash';
+import { GlToggle, GlAlert } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import { __ } from '~/locale';
-import { DEBOUNCE_TOGGLE_DELAY, ERROR_MESSAGE } from '../constants';
+import { ERROR_MESSAGE } from '../constants';
export default {
components: {
GlToggle,
- GlLoadingIcon,
- GlTooltip,
GlAlert,
},
inject: [
'updatePath',
- 'sharedRunnersAvailability',
- 'parentSharedRunnersAvailability',
- 'runnerEnabled',
- 'runnerDisabled',
- 'runnerAllowOverride',
+ 'sharedRunnersSetting',
+ 'parentSharedRunnersSetting',
+ 'runnerEnabledValue',
+ 'runnerDisabledValue',
+ 'runnerAllowOverrideValue',
],
data() {
return {
isLoading: false,
- enabled: true,
- allowOverride: false,
+ value: this.sharedRunnersSetting,
error: null,
};
},
computed: {
- toggleDisabled() {
- return this.parentSharedRunnersAvailability === this.runnerDisabled || this.isLoading;
+ isSharedRunnersToggleDisabled() {
+ return this.parentSharedRunnersSetting === this.runnerDisabledValue;
},
- enabledOrDisabledSetting() {
- return this.enabled ? this.runnerEnabled : this.runnerDisabled;
+ sharedRunnersToggleValue() {
+ return this.value === this.runnerEnabledValue;
},
- disabledWithOverrideSetting() {
- return this.allowOverride ? this.runnerAllowOverride : this.runnerDisabled;
+ isOverrideToggleDisabled() {
+ // cannot override when sharing is enabled
+ return this.isSharedRunnersToggleDisabled || this.value === this.runnerEnabledValue;
+ },
+ overrideToggleValue() {
+ return this.value === this.runnerAllowOverrideValue;
},
- },
- created() {
- if (this.sharedRunnersAvailability !== this.runnerEnabled) {
- this.enabled = false;
- }
-
- if (this.sharedRunnersAvailability === this.runnerAllowOverride) {
- this.allowOverride = true;
- }
},
methods: {
- generatePayload(data) {
- return { shared_runners_setting: data };
- },
- enableOrDisable() {
- this.updateRunnerSettings(this.generatePayload(this.enabledOrDisabledSetting));
-
- // reset override toggle to false if shared runners are enabled
- this.allowOverride = false;
+ onSharedRunnersToggle(value) {
+ const newSetting = value ? this.runnerEnabledValue : this.runnerDisabledValue;
+ this.updateSetting(newSetting);
},
- override() {
- this.updateRunnerSettings(this.generatePayload(this.disabledWithOverrideSetting));
+ onOverrideToggle(value) {
+ const newSetting = value ? this.runnerAllowOverrideValue : this.runnerDisabledValue;
+ this.updateSetting(newSetting);
},
- updateRunnerSettings: debounce(function debouncedUpdateRunnerSettings(setting) {
+ updateSetting(setting) {
+ if (this.isLoading) {
+ return;
+ }
+
this.isLoading = true;
axios
- .put(this.updatePath, setting)
+ .put(this.updatePath, { shared_runners_setting: setting })
.then(() => {
- this.isLoading = false;
+ this.value = setting;
})
.catch((error) => {
const message = [
@@ -76,51 +67,52 @@ export default {
].join(' ');
this.error = message;
+ })
+ .finally(() => {
+ this.isLoading = false;
});
- }, DEBOUNCE_TOGGLE_DELAY),
+ },
},
};
</script>
<template>
- <div ref="sharedRunnersForm">
- <gl-alert v-if="error" variant="danger" :dismissible="false">{{ error }}</gl-alert>
+ <div>
+ <gl-alert v-if="error" variant="danger" :dismissible="false" class="gl-mb-5">
+ {{ error }}
+ </gl-alert>
- <h4 class="gl-display-flex gl-align-items-center">
- {{ __('Set up shared runner availability') }}
- <gl-loading-icon v-if="isLoading" class="gl-ml-3" size="sm" inline />
- </h4>
+ <gl-alert
+ v-if="isSharedRunnersToggleDisabled"
+ variant="warning"
+ :dismissible="false"
+ class="gl-mb-5"
+ >
+ {{ __('Shared runners are disabled for the parent group') }}
+ </gl-alert>
- <section class="gl-mt-5">
+ <section class="gl-mb-5">
<gl-toggle
- v-model="enabled"
- :disabled="toggleDisabled"
+ :value="sharedRunnersToggleValue"
+ :is-loading="isLoading"
+ :disabled="isSharedRunnersToggleDisabled"
:label="__('Enable shared runners for this group')"
- data-testid="enable-runners-toggle"
- @change="enableOrDisable"
+ :help="__('Enable shared runners for all projects and subgroups in this group.')"
+ data-testid="shared-runners-toggle"
+ @change="onSharedRunnersToggle"
/>
-
- <span class="gl-text-gray-600">
- {{ __('Enable shared runners for all projects and subgroups in this group.') }}
- </span>
</section>
- <section v-if="!enabled" class="gl-mt-5">
+ <section class="gl-mb-5">
<gl-toggle
- v-model="allowOverride"
- :disabled="toggleDisabled"
+ :value="overrideToggleValue"
+ :is-loading="isLoading"
+ :disabled="isOverrideToggleDisabled"
:label="__('Allow projects and subgroups to override the group setting')"
+ :help="__('Allows projects or subgroups in this group to override the global setting.')"
data-testid="override-runners-toggle"
- @change="override"
+ @change="onOverrideToggle"
/>
-
- <span class="gl-text-gray-600">
- {{ __('Allows projects or subgroups in this group to override the global setting.') }}
- </span>
</section>
-
- <gl-tooltip v-if="toggleDisabled" :target="() => $refs.sharedRunnersForm">
- {{ __('Shared runners are disabled for the parent group') }}
- </gl-tooltip>
</div>
</template>
diff --git a/app/assets/javascripts/group_settings/constants.js b/app/assets/javascripts/group_settings/constants.js
index 4067b6b52a3..ab5c0db45ba 100644
--- a/app/assets/javascripts/group_settings/constants.js
+++ b/app/assets/javascripts/group_settings/constants.js
@@ -1,6 +1,3 @@
import { __ } from '~/locale';
-// Debounce delay in milliseconds
-export const DEBOUNCE_TOGGLE_DELAY = 1000;
-
export const ERROR_MESSAGE = __('Refresh the page and try again.');
diff --git a/app/assets/javascripts/group_settings/mount_shared_runners.js b/app/assets/javascripts/group_settings/mount_shared_runners.js
index 21a2373e2b1..aeb6d57a11a 100644
--- a/app/assets/javascripts/group_settings/mount_shared_runners.js
+++ b/app/assets/javascripts/group_settings/mount_shared_runners.js
@@ -6,22 +6,22 @@ export default (containerId = 'update-shared-runners-form') => {
const {
updatePath,
- sharedRunnersAvailability,
- parentSharedRunnersAvailability,
- runnerEnabled,
- runnerDisabled,
- runnerAllowOverride,
+ sharedRunnersSetting,
+ parentSharedRunnersSetting,
+ runnerEnabledValue,
+ runnerDisabledValue,
+ runnerAllowOverrideValue,
} = containerEl.dataset;
return new Vue({
el: containerEl,
provide: {
updatePath,
- sharedRunnersAvailability,
- parentSharedRunnersAvailability,
- runnerEnabled,
- runnerDisabled,
- runnerAllowOverride,
+ sharedRunnersSetting,
+ parentSharedRunnersSetting,
+ runnerEnabledValue,
+ runnerDisabledValue,
+ runnerAllowOverrideValue,
},
render(createElement) {
return createElement(UpdateSharedRunnersForm);
diff --git a/app/assets/javascripts/header_search/components/app.vue b/app/assets/javascripts/header_search/components/app.vue
index 4406cacdf3f..adf304aebc7 100644
--- a/app/assets/javascripts/header_search/components/app.vue
+++ b/app/assets/javascripts/header_search/components/app.vue
@@ -120,9 +120,11 @@ export default {
...mapActions(['setSearch', 'fetchAutocompleteOptions', 'clearAutocomplete']),
openDropdown() {
this.showDropdown = true;
+ this.$emit('toggleDropdown', this.showDropdown);
},
closeDropdown() {
this.showDropdown = false;
+ this.$emit('toggleDropdown', this.showDropdown);
},
submitSearch() {
return visitUrl(this.currentFocusedOption?.url || this.searchQuery);
@@ -146,7 +148,7 @@ export default {
v-outside="closeDropdown"
role="search"
:aria-label="$options.i18n.searchGitlab"
- class="header-search gl-relative gl-rounded-base"
+ class="header-search gl-relative gl-rounded-base gl-w-full"
:class="headerSearchActivityDescriptor"
>
<gl-search-box-by-type
diff --git a/app/assets/javascripts/header_search/index.js b/app/assets/javascripts/header_search/index.js
index 4af8513ecdb..b2c505d569f 100644
--- a/app/assets/javascripts/header_search/index.js
+++ b/app/assets/javascripts/header_search/index.js
@@ -7,6 +7,7 @@ Vue.use(Translate);
export const initHeaderSearchApp = (search = '') => {
const el = document.getElementById('js-header-search');
+ let navBarEl = null;
if (!el) {
return false;
@@ -19,8 +20,21 @@ export const initHeaderSearchApp = (search = '') => {
return new Vue({
el,
store: createStore({ searchPath, issuesPath, mrPath, autocompletePath, searchContext, search }),
+ mounted() {
+ navBarEl = document.querySelector('.header-content');
+ },
render(createElement) {
- return createElement(HeaderSearchApp);
+ return createElement(HeaderSearchApp, {
+ on: {
+ toggleDropdown: (isVisible = false) => {
+ if (isVisible) {
+ navBarEl?.classList.add('header-search-is-active');
+ } else {
+ navBarEl?.classList.remove('header-search-is-active');
+ }
+ },
+ },
+ });
},
});
};
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/form.vue b/app/assets/javascripts/ide/components/commit_sidebar/form.vue
index 38f3b094b7c..cb906374fe1 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/form.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/form.vue
@@ -216,7 +216,9 @@ export default {
modal-id="ide-commit-error-modal"
:title="lastCommitError.title"
:action-primary="commitErrorPrimaryAction.button"
- :action-cancel="{ text: __('Cancel') }"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: __('Cancel'),
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@ok="commitErrorPrimaryAction.callback"
>
<div v-safe-html="lastCommitError.messageHTML"></div>
diff --git a/app/assets/javascripts/ide/components/ide_status_bar.vue b/app/assets/javascripts/ide/components/ide_status_bar.vue
index 32f87cb0a92..93ff7e8566f 100644
--- a/app/assets/javascripts/ide/components/ide_status_bar.vue
+++ b/app/assets/javascripts/ide/components/ide_status_bar.vue
@@ -108,7 +108,7 @@ export default {
by
<user-avatar-image
css-classes="ide-status-avatar"
- :size="18"
+ :size="16"
:img-src="latestPipeline && latestPipeline.commit.author_gravatar_url"
:img-alt="lastCommit.author_name"
:tooltip-text="lastCommit.author_name"
diff --git a/app/assets/javascripts/import_entities/components/import_status.vue b/app/assets/javascripts/import_entities/components/import_status.vue
index 9262a4e1e95..5455a034106 100644
--- a/app/assets/javascripts/import_entities/components/import_status.vue
+++ b/app/assets/javascripts/import_entities/components/import_status.vue
@@ -44,6 +44,11 @@ const STATUS_MAP = {
text: __('Failed'),
variant: 'danger',
},
+ [STATUSES.TIMEOUT]: {
+ icon: 'status-failed',
+ text: __('Timeout'),
+ variant: 'danger',
+ },
[STATUSES.CANCELLED]: {
icon: 'status-stopped',
text: __('Cancelled'),
diff --git a/app/assets/javascripts/import_entities/constants.js b/app/assets/javascripts/import_entities/constants.js
index 20a4d2d84b4..c470da21765 100644
--- a/app/assets/javascripts/import_entities/constants.js
+++ b/app/assets/javascripts/import_entities/constants.js
@@ -10,4 +10,5 @@ export const STATUSES = {
NONE: 'none',
SCHEDULING: 'scheduling',
CANCELLED: 'cancelled',
+ TIMEOUT: 'timeout',
};
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 028197ec9b1..ce401862cc1 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
@@ -25,7 +25,7 @@ import importGroupsMutation from '../graphql/mutations/import_groups.mutation.gr
import updateImportStatusMutation from '../graphql/mutations/update_import_status.mutation.graphql';
import availableNamespacesQuery from '../graphql/queries/available_namespaces.query.graphql';
import bulkImportSourceGroupsQuery from '../graphql/queries/bulk_import_source_groups.query.graphql';
-import { NEW_NAME_FIELD, i18n } from '../constants';
+import { NEW_NAME_FIELD, ROOT_NAMESPACE, i18n } from '../constants';
import { StatusPoller } from '../services/status_poller';
import { isFinished, isAvailableForImport, isNameValid, isSameTarget } from '../utils';
import ImportActionsCell from './import_actions_cell.vue';
@@ -71,6 +71,10 @@ export default {
type: String,
required: true,
},
+ historyPath: {
+ type: String,
+ required: true,
+ },
},
data() {
@@ -426,10 +430,10 @@ export default {
return this.importTargets[group.id];
}
- const defaultTargetNamespace = this.availableNamespaces[0] ?? { fullPath: '', id: null };
+ const defaultTargetNamespace = this.availableNamespaces[0] ?? ROOT_NAMESPACE;
let importTarget;
if (group.lastImportTarget) {
- const targetNamespace = this.availableNamespaces.find(
+ const targetNamespace = [ROOT_NAMESPACE, ...this.availableNamespaces].find(
(ns) => ns.fullPath === group.lastImportTarget.targetNamespace,
);
@@ -485,12 +489,15 @@ export default {
<template>
<div>
- <h1
- class="gl-my-0 gl-py-4 gl-font-size-h1 gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1 gl-display-flex"
+ <div
+ class="gl-display-flex gl-align-items-center gl-border-solid gl-border-gray-200 gl-border-0 gl-border-b-1"
>
- <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
- {{ s__('BulkImport|Import groups from GitLab') }}
- </h1>
+ <h1 class="gl-my-0 gl-py-4 gl-font-size-h1gl-display-flex">
+ <img :src="$options.gitlabLogo" class="gl-w-6 gl-h-6 gl-mb-2 gl-display-inline gl-mr-2" />
+ {{ s__('BulkImport|Import groups from GitLab') }}
+ </h1>
+ <gl-link :href="historyPath" class="gl-ml-auto">{{ s__('BulkImport|History') }}</gl-link>
+ </div>
<gl-alert
v-if="unavailableFeatures.length > 0 && unavailableFeaturesAlertVisible"
variant="warning"
diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue b/app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue
index 344a6e45370..4fbbd5b239c 100644
--- a/app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue
+++ b/app/assets/javascripts/import_entities/import_groups/components/import_target_cell.vue
@@ -57,6 +57,7 @@ export default {
toggle-class="gl-rounded-top-right-none! gl-rounded-bottom-right-none!"
class="gl-h-7 gl-flex-grow-1"
data-qa-selector="target_namespace_selector_dropdown"
+ data-testid="target-namespace-selector"
>
<gl-dropdown-item @click="$emit('update-target-namespace', { fullPath: '', id: null })">{{
s__('BulkImport|No parent')
diff --git a/app/assets/javascripts/import_entities/import_groups/constants.js b/app/assets/javascripts/import_entities/import_groups/constants.js
index ac1466238d0..32137308684 100644
--- a/app/assets/javascripts/import_entities/import_groups/constants.js
+++ b/app/assets/javascripts/import_entities/import_groups/constants.js
@@ -18,3 +18,5 @@ export const i18n = {
};
export const NEW_NAME_FIELD = 'newName';
+
+export const ROOT_NAMESPACE = { fullPath: '', id: null };
diff --git a/app/assets/javascripts/import_entities/import_groups/index.js b/app/assets/javascripts/import_entities/import_groups/index.js
index 67a7258d504..02af0db7f9a 100644
--- a/app/assets/javascripts/import_entities/import_groups/index.js
+++ b/app/assets/javascripts/import_entities/import_groups/index.js
@@ -17,6 +17,7 @@ export function mountImportGroupsApp(mountElement) {
jobsPath,
sourceUrl,
groupPathRegex,
+ historyPath,
} = mountElement.dataset;
const apolloProvider = new VueApollo({
defaultClient: createApolloClient({
@@ -38,6 +39,7 @@ export function mountImportGroupsApp(mountElement) {
sourceUrl,
jobsPath,
groupPathRegex: new RegExp(`^(${groupPathRegex})$`),
+ historyPath,
},
});
},
diff --git a/app/assets/javascripts/import_entities/import_groups/utils.js b/app/assets/javascripts/import_entities/import_groups/utils.js
index 1d0ab75e1cb..f896203ba60 100644
--- a/app/assets/javascripts/import_entities/import_groups/utils.js
+++ b/app/assets/javascripts/import_entities/import_groups/utils.js
@@ -10,7 +10,7 @@ export function getInvalidNameValidationMessage(importTarget) {
}
export function isFinished(group) {
- return [STATUSES.FINISHED, STATUSES.FAILED].includes(group.progress?.status);
+ return [STATUSES.FINISHED, STATUSES.FAILED, STATUSES.TIMEOUT].includes(group.progress?.status);
}
export function isAvailableForImport(group) {
diff --git a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
index e0703a77424..0307607321e 100644
--- a/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
+++ b/app/assets/javascripts/import_entities/import_projects/components/import_projects_table.vue
@@ -1,5 +1,11 @@
<script>
-import { GlButton, GlLoadingIcon, GlIntersectionObserver, GlModal, GlFormInput } from '@gitlab/ui';
+import {
+ GlButton,
+ GlLoadingIcon,
+ GlIntersectionObserver,
+ GlModal,
+ GlSearchBoxByClick,
+} from '@gitlab/ui';
import { mapActions, mapState, mapGetters } from 'vuex';
import { n__, __, sprintf } from '~/locale';
import ProviderRepoTableRow from './provider_repo_table_row.vue';
@@ -12,7 +18,7 @@ export default {
GlButton,
GlModal,
GlIntersectionObserver,
- GlFormInput,
+ GlSearchBoxByClick,
},
props: {
providerTitle: {
@@ -134,13 +140,13 @@ export default {
<slot name="actions"></slot>
<form v-if="filterable" class="gl-ml-auto" novalidate @submit.prevent>
- <gl-form-input
+ <gl-search-box-by-click
data-qa-selector="githubish_import_filter_field"
name="filter"
:placeholder="__('Filter by name')"
autofocus
- size="lg"
- @keyup.enter="setFilter($event.target.value)"
+ @submit="setFilter"
+ @clear="setFilter('')"
/>
</form>
</div>
diff --git a/app/assets/javascripts/incidents/components/incidents_list.vue b/app/assets/javascripts/incidents/components/incidents_list.vue
index bfc5bd823a2..922e870caa7 100644
--- a/app/assets/javascripts/incidents/components/incidents_list.vue
+++ b/app/assets/javascripts/incidents/components/incidents_list.vue
@@ -338,7 +338,9 @@ export default {
:show-items="showList"
:show-error-msg="showErrorMsg"
:i18n="$options.i18n"
- :items="incidents.list || []"
+ :items="
+ incidents.list || [] /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */
+ "
:page-info="incidents.pageInfo"
:items-count="incidentsCount"
:status-tabs="$options.statusTabs"
@@ -372,7 +374,10 @@ export default {
<template #table>
<gl-table
- :items="incidents.list || []"
+ :items="
+ incidents.list ||
+ [] /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */
+ "
:fields="availableFields"
:busy="loading"
stacked="md"
diff --git a/app/assets/javascripts/incidents/graphql/fragments/incident_fields.fragment.graphql b/app/assets/javascripts/incidents/graphql/fragments/incident_fields.fragment.graphql
index b72941966c6..2d84b141f32 100644
--- a/app/assets/javascripts/incidents/graphql/fragments/incident_fields.fragment.graphql
+++ b/app/assets/javascripts/incidents/graphql/fragments/incident_fields.fragment.graphql
@@ -1,4 +1,3 @@
-# eslint-disable-next-line @graphql-eslint/require-id-when-available
fragment IncidentFields on Issue {
severity
escalationStatus
diff --git a/app/assets/javascripts/integrations/constants.js b/app/assets/javascripts/integrations/constants.js
index c5ed5bb08a9..b9975eed716 100644
--- a/app/assets/javascripts/integrations/constants.js
+++ b/app/assets/javascripts/integrations/constants.js
@@ -37,3 +37,13 @@ export const integrationFormSectionComponents = {
[integrationFormSections.JIRA_TRIGGER]: 'IntegrationSectionJiraTrigger',
[integrationFormSections.JIRA_ISSUES]: 'IntegrationSectionJiraIssues',
};
+
+export const billingPlans = {
+ PREMIUM: 'premium',
+ ULTIMATE: 'ultimate',
+};
+
+export const billingPlanNames = {
+ [billingPlans.PREMIUM]: s__('BillingPlans|Premium'),
+ [billingPlans.ULTIMATE]: s__('BillingPlans|Ultimate'),
+};
diff --git a/app/assets/javascripts/integrations/edit/components/integration_form.vue b/app/assets/javascripts/integrations/edit/components/integration_form.vue
index 661299920c7..9f43360fb73 100644
--- a/app/assets/javascripts/integrations/edit/components/integration_form.vue
+++ b/app/assets/javascripts/integrations/edit/components/integration_form.vue
@@ -1,5 +1,11 @@
<script>
-import { GlButton, GlModalDirective, GlSafeHtmlDirective as SafeHtml, GlForm } from '@gitlab/ui';
+import {
+ GlBadge,
+ GlButton,
+ GlModalDirective,
+ GlSafeHtmlDirective as SafeHtml,
+ GlForm,
+} from '@gitlab/ui';
import axios from 'axios';
import * as Sentry from '@sentry/browser';
import { mapState, mapActions, mapGetters } from 'vuex';
@@ -10,6 +16,7 @@ import {
I18N_SUCCESSFUL_CONNECTION_MESSAGE,
integrationLevels,
integrationFormSectionComponents,
+ billingPlanNames,
} from '~/integrations/constants';
import { refreshCurrentPage } from '~/lib/utils/url_utility';
import csrf from '~/lib/utils/csrf';
@@ -42,6 +49,7 @@ export default {
import(
/* webpackChunkName: 'integrationSectionJiraTrigger' */ '~/integrations/edit/components/sections/jira_trigger.vue'
),
+ GlBadge,
GlButton,
GlForm,
},
@@ -177,6 +185,7 @@ export default {
},
csrf,
integrationFormSectionComponents,
+ billingPlanNames,
};
</script>
@@ -214,7 +223,20 @@ export default {
>
<div class="row">
<div class="col-lg-4">
- <h4 class="gl-mt-0">{{ section.title }}</h4>
+ <h4 class="gl-mt-0">
+ {{ section.title
+ }}<gl-badge
+ v-if="section.plan"
+ :href="propsSource.aboutPricingUrl"
+ target="_blank"
+ rel="noopener noreferrer"
+ variant="tier"
+ icon="license"
+ class="gl-ml-3"
+ >
+ {{ $options.billingPlanNames[section.plan] }}
+ </gl-badge>
+ </h4>
<p v-safe-html:[$options.descriptionHtmlConfig]="section.description"></p>
</div>
diff --git a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
index f00339c92fa..584d23e17e1 100644
--- a/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
+++ b/app/assets/javascripts/integrations/edit/components/jira_issues_fields.vue
@@ -2,7 +2,6 @@
import { GlFormGroup, GlFormCheckbox, GlFormInput } from '@gitlab/ui';
import { mapGetters } from 'vuex';
import { s__, __ } from '~/locale';
-import JiraUpgradeCta from './jira_upgrade_cta.vue';
export default {
name: 'JiraIssuesFields',
@@ -10,7 +9,6 @@ export default {
GlFormGroup,
GlFormCheckbox,
GlFormInput,
- JiraUpgradeCta,
JiraIssueCreationVulnerabilities: () =>
import('ee_component/integrations/edit/components/jira_issue_creation_vulnerabilities.vue'),
},
@@ -45,11 +43,6 @@ export default {
required: false,
default: null,
},
- upgradePlanPath: {
- type: String,
- required: false,
- default: '',
- },
isValidated: {
type: Boolean,
required: false,
@@ -64,6 +57,9 @@ export default {
},
computed: {
...mapGetters(['isInheriting']),
+ checkboxDisabled() {
+ return !this.showJiraIssuesIntegration || this.isInheriting;
+ },
validProjectKey() {
return !this.enableJiraIssues || Boolean(this.projectKey) || !this.isValidated;
},
@@ -85,64 +81,48 @@ export default {
<template>
<div>
- <template v-if="showJiraIssuesIntegration">
- <input name="service[issues_enabled]" type="hidden" :value="enableJiraIssues || false" />
- <gl-form-checkbox
- v-model="enableJiraIssues"
- :disabled="isInheriting"
- data-qa-selector="service_jira_issues_enabled_checkbox"
- >
- {{ $options.i18n.enableCheckboxLabel }}
- <template #help>
- {{ $options.i18n.enableCheckboxHelp }}
- </template>
- </gl-form-checkbox>
+ <input name="service[issues_enabled]" type="hidden" :value="enableJiraIssues || false" />
+ <gl-form-checkbox
+ v-model="enableJiraIssues"
+ :disabled="checkboxDisabled"
+ data-qa-selector="service_jira_issues_enabled_checkbox"
+ >
+ {{ $options.i18n.enableCheckboxLabel }}
+ <template #help>
+ {{ $options.i18n.enableCheckboxHelp }}
+ </template>
+ </gl-form-checkbox>
- <div v-if="enableJiraIssues" class="gl-pl-6 gl-mt-3">
- <gl-form-group
- :label="$options.i18n.projectKeyLabel"
- label-for="service_project_key"
- :invalid-feedback="$options.i18n.requiredFieldFeedback"
+ <div v-if="enableJiraIssues" class="gl-pl-6 gl-mt-3">
+ <gl-form-group
+ :label="$options.i18n.projectKeyLabel"
+ label-for="service_project_key"
+ :invalid-feedback="$options.i18n.requiredFieldFeedback"
+ :state="validProjectKey"
+ class="gl-max-w-26"
+ data-testid="project-key-form-group"
+ >
+ <gl-form-input
+ id="service_project_key"
+ v-model="projectKey"
+ name="service[project_key]"
+ data-qa-selector="service_jira_project_key_field"
+ :placeholder="$options.i18n.projectKeyPlaceholder"
+ :required="enableJiraIssues"
:state="validProjectKey"
- class="gl-max-w-26"
- data-testid="project-key-form-group"
- >
- <gl-form-input
- id="service_project_key"
- v-model="projectKey"
- name="service[project_key]"
- data-qa-selector="service_jira_project_key_field"
- :placeholder="$options.i18n.projectKeyPlaceholder"
- :required="enableJiraIssues"
- :state="validProjectKey"
- :readonly="isInheriting"
- />
- </gl-form-group>
-
- <jira-issue-creation-vulnerabilities
- :project-key="projectKey"
- :initial-is-enabled="initialEnableJiraVulnerabilities"
- :initial-issue-type-id="initialVulnerabilitiesIssuetype"
- :show-full-feature="showJiraVulnerabilitiesIntegration"
- class="gl-mt-6"
- data-testid="jira-for-vulnerabilities"
- @request-jira-issue-types="$emit('request-jira-issue-types')"
- />
- <jira-upgrade-cta
- v-if="!showJiraVulnerabilitiesIntegration"
- class="gl-mt-2 gl-ml-6"
- data-testid="ultimate-upgrade-cta"
- show-ultimate-message
- :upgrade-plan-path="upgradePlanPath"
+ :readonly="isInheriting"
/>
- </div>
- </template>
+ </gl-form-group>
- <jira-upgrade-cta
- v-else
- data-testid="premium-upgrade-cta"
- show-premium-message
- :upgrade-plan-path="upgradePlanPath"
- />
+ <jira-issue-creation-vulnerabilities
+ :project-key="projectKey"
+ :initial-is-enabled="initialEnableJiraVulnerabilities"
+ :initial-issue-type-id="initialVulnerabilitiesIssuetype"
+ :show-full-feature="showJiraVulnerabilitiesIntegration"
+ class="gl-mt-6"
+ data-testid="jira-for-vulnerabilities"
+ @request-jira-issue-types="$emit('request-jira-issue-types')"
+ />
+ </div>
</div>
</template>
diff --git a/app/assets/javascripts/integrations/edit/index.js b/app/assets/javascripts/integrations/edit/index.js
index 9a9aae36657..92e6ca509c3 100644
--- a/app/assets/javascripts/integrations/edit/index.js
+++ b/app/assets/javascripts/integrations/edit/index.js
@@ -23,6 +23,7 @@ function parseDatasetToProps(data) {
projectKey,
upgradePlanPath,
learnMorePath,
+ aboutPricingUrl,
triggerEvents,
sections,
fields,
@@ -82,6 +83,7 @@ function parseDatasetToProps(data) {
upgradePlanPath,
},
learnMorePath,
+ aboutPricingUrl,
triggerEvents: JSON.parse(triggerEvents),
sections: JSON.parse(sections, { deep: true }),
fields: convertObjectPropsToCamelCase(JSON.parse(fields), { deep: true }),
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
index d71468284ca..fb6c376cfe6 100644
--- a/app/assets/javascripts/invite_members/components/import_a_project_modal.vue
+++ b/app/assets/javascripts/invite_members/components/import_a_project_modal.vue
@@ -145,7 +145,7 @@ export default {
<gl-button
:disabled="importDisabled"
:loading="isLoading"
- variant="success"
+ variant="confirm"
data-testid="import-button"
@click="submitImport"
>{{ $options.i18n.modalPrimaryButton }}</gl-button
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 a9aa0e9b760..7857b9d86d2 100644
--- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue
+++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue
@@ -88,6 +88,11 @@ export default {
type: Array,
required: true,
},
+ usersLimitDataset: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
},
data() {
return {
@@ -146,6 +151,18 @@ export default {
isOnLearnGitlab() {
return this.source === LEARN_GITLAB;
},
+ reachedLimit() {
+ if (this.usersLimitDataset.freeUsersLimit && this.usersLimitDataset.membersCount) {
+ return this.usersLimitDataset.membersCount >= this.usersLimitDataset.freeUsersLimit;
+ }
+
+ return false;
+ },
+ formGroupDescription() {
+ return this.reachedLimit
+ ? this.$options.labels.placeHolderDisabled
+ : this.$options.labels.placeHolder;
+ },
},
mounted() {
eventHub.$on('openModal', (options) => {
@@ -274,12 +291,14 @@ export default {
:help-link="helpLink"
:label-intro-text="labelIntroText"
:label-search-field="$options.labels.searchField"
- :form-group-description="$options.labels.placeHolder"
+ :form-group-description="formGroupDescription"
:submit-disabled="inviteDisabled"
:invalid-feedback-message="invalidFeedbackMessage"
:is-loading="isLoading"
:new-users-to-invite="newUsersToInvite"
:root-group-id="rootId"
+ :reached-limit="reachedLimit"
+ :users-limit-dataset="usersLimitDataset"
@reset="resetFields"
@submit="sendInvite"
@access-level="onAccessLevelUpdate"
@@ -294,7 +313,10 @@ export default {
</template>
<template #user-limit-notification>
- <user-limit-notification />
+ <user-limit-notification
+ :reached-limit="reachedLimit"
+ :users-limit-dataset="usersLimitDataset"
+ />
</template>
<template #select="{ validationState, labelId }">
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 d9297614a7e..33d37b809c2 100644
--- a/app/assets/javascripts/invite_members/components/invite_modal_base.vue
+++ b/app/assets/javascripts/invite_members/components/invite_modal_base.vue
@@ -8,7 +8,9 @@ import {
GlLink,
GlSprintf,
GlFormInput,
+ GlIcon,
} from '@gitlab/ui';
+import Tracking from '~/tracking';
import { sprintf } from '~/locale';
import ContentTransition from '~/vue_shared/components/content_transition.vue';
import {
@@ -16,8 +18,13 @@ import {
ACCESS_EXPIRE_DATE,
READ_MORE_TEXT,
INVITE_BUTTON_TEXT,
+ INVITE_BUTTON_TEXT_DISABLED,
CANCEL_BUTTON_TEXT,
+ CANCEL_BUTTON_TEXT_DISABLED,
HEADER_CLOSE_LABEL,
+ ON_SHOW_TRACK_LABEL,
+ ON_CLOSE_TRACK_LABEL,
+ ON_SUBMIT_TRACK_LABEL,
} from '../constants';
const DEFAULT_SLOT = 'default';
@@ -41,8 +48,10 @@ export default {
GlDropdownItem,
GlSprintf,
GlFormInput,
+ GlIcon,
ContentTransition,
},
+ mixins: [Tracking.mixin()],
inheritAttrs: false,
props: {
modalTitle: {
@@ -122,6 +131,16 @@ export default {
required: false,
default: false,
},
+ reachedLimit: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ usersLimitDataset: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
},
data() {
// Be sure to check out reset!
@@ -151,20 +170,27 @@ export default {
},
actionPrimary() {
return {
- text: this.submitButtonText,
+ text: this.reachedLimit ? INVITE_BUTTON_TEXT_DISABLED : this.submitButtonText,
attributes: {
variant: 'confirm',
- disabled: this.submitDisabled,
- loading: this.isLoading,
+ disabled: this.reachedLimit ? false : this.submitDisabled,
+ loading: this.reachedLimit ? false : this.isLoading,
'data-qa-selector': 'invite_button',
+ ...(this.reachedLimit && { href: this.usersLimitDataset.membersPath }),
},
};
},
actionCancel() {
+ if (this.reachedLimit && this.usersLimitDataset.userNamespace) return undefined;
+
return {
- text: this.cancelButtonText,
+ text: this.reachedLimit ? CANCEL_BUTTON_TEXT_DISABLED : this.cancelButtonText,
+ ...(this.reachedLimit && { attributes: { href: this.usersLimitDataset.purchasePath } }),
};
},
+ selectLabelClass() {
+ return `col-form-label ${this.reachedLimit ? 'gl-text-gray-500' : ''}`;
+ },
},
watch: {
selectedAccessLevel: {
@@ -183,15 +209,24 @@ export default {
this.$emit('reset');
},
+ onShowModal() {
+ if (this.reachedLimit) {
+ this.track('render', { category: 'default', label: ON_SHOW_TRACK_LABEL });
+ }
+ },
onCloseModal(e) {
- if (this.preventCancelDefault) {
+ if (this.preventCancelDefault || this.reachedLimit) {
e.preventDefault();
} else {
this.onReset();
this.$refs.modal.hide();
}
- this.$emit('cancel');
+ if (this.reachedLimit) {
+ this.track('click_button', { category: 'default', label: ON_CLOSE_TRACK_LABEL });
+ } else {
+ this.$emit('cancel');
+ }
},
changeSelectedItem(item) {
this.selectedAccessLevel = item;
@@ -200,10 +235,14 @@ export default {
// We never want to hide when submitting
e.preventDefault();
- this.$emit('submit', {
- accessLevel: this.selectedAccessLevel,
- expiresAt: this.selectedDate,
- });
+ if (this.reachedLimit) {
+ this.track('click_button', { category: 'default', label: ON_SUBMIT_TRACK_LABEL });
+ } else {
+ this.$emit('submit', {
+ accessLevel: this.selectedAccessLevel,
+ expiresAt: this.selectedDate,
+ });
+ }
},
},
HEADER_CLOSE_LABEL,
@@ -227,6 +266,7 @@ export default {
:header-close-label="$options.HEADER_CLOSE_LABEL"
:action-primary="actionPrimary"
:action-cancel="actionCancel"
+ @shown="onShowModal"
@primary="onSubmit"
@cancel="onCloseModal"
@hidden="onReset"
@@ -255,64 +295,73 @@ export default {
<gl-form-group
:invalid-feedback="invalidFeedbackMessage"
:state="validationState"
- :description="formGroupDescription"
data-testid="members-form-group"
>
- <label :id="selectLabelId" class="col-form-label">{{ labelSearchField }}</label>
- <slot name="select" v-bind="{ validationState, labelId: selectLabelId }"></slot>
+ <template #description>
+ <gl-icon v-if="reachedLimit" name="lock" />
+ {{ formGroupDescription }}
+ </template>
+
+ <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>
</gl-form-group>
- <label class="gl-font-weight-bold">{{ $options.ACCESS_LEVEL }}</label>
- <div class="gl-mt-2 gl-w-half gl-xs-w-full">
- <gl-dropdown
- class="gl-shadow-none gl-w-full"
- data-qa-selector="access_level_dropdown"
- v-bind="$attrs"
- :text="selectedRoleName"
- >
- <template v-for="(key, item) in accessLevels">
- <gl-dropdown-item
- :key="key"
- active-class="is-active"
- is-check-item
- :is-checked="key === selectedAccessLevel"
- @click="changeSelectedItem(key)"
- >
- <div>{{ item }}</div>
- </gl-dropdown-item>
- </template>
- </gl-dropdown>
- </div>
+ <template v-if="!reachedLimit">
+ <label class="gl-font-weight-bold">{{ $options.ACCESS_LEVEL }}</label>
- <div class="gl-mt-2 gl-w-half gl-xs-w-full">
- <gl-sprintf :message="$options.READ_MORE_TEXT">
- <template #link="{ content }">
- <gl-link :href="helpLink" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </div>
+ <div class="gl-mt-2 gl-w-half gl-xs-w-full">
+ <gl-dropdown
+ class="gl-shadow-none gl-w-full"
+ data-qa-selector="access_level_dropdown"
+ v-bind="$attrs"
+ :text="selectedRoleName"
+ >
+ <template v-for="(key, item) in accessLevels">
+ <gl-dropdown-item
+ :key="key"
+ active-class="is-active"
+ is-check-item
+ :is-checked="key === selectedAccessLevel"
+ @click="changeSelectedItem(key)"
+ >
+ <div>{{ item }}</div>
+ </gl-dropdown-item>
+ </template>
+ </gl-dropdown>
+ </div>
- <label class="gl-mt-5 gl-display-block" for="expires_at">{{
- $options.ACCESS_EXPIRE_DATE
- }}</label>
- <div class="gl-mt-2 gl-w-half gl-xs-w-full gl-display-inline-block">
- <gl-datepicker
- v-model="selectedDate"
- class="gl-display-inline!"
- :min-date="minDate"
- :target="null"
- >
- <template #default="{ formattedDate }">
- <gl-form-input
- class="gl-w-full"
- :value="formattedDate"
- :placeholder="__(`YYYY-MM-DD`)"
- />
- </template>
- </gl-datepicker>
- </div>
- <slot name="form-after"></slot>
+ <div class="gl-mt-2 gl-w-half gl-xs-w-full">
+ <gl-sprintf :message="$options.READ_MORE_TEXT">
+ <template #link="{ content }">
+ <gl-link :href="helpLink" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </div>
+
+ <label class="gl-mt-5 gl-display-block" for="expires_at">{{
+ $options.ACCESS_EXPIRE_DATE
+ }}</label>
+ <div class="gl-mt-2 gl-w-half gl-xs-w-full gl-display-inline-block">
+ <gl-datepicker
+ v-model="selectedDate"
+ class="gl-display-inline!"
+ :min-date="minDate"
+ :target="null"
+ >
+ <template #default="{ formattedDate }">
+ <gl-form-input
+ class="gl-w-full"
+ :value="formattedDate"
+ :placeholder="__(`YYYY-MM-DD`)"
+ />
+ </template>
+ </gl-datepicker>
+ </div>
+ <slot name="form-after"></slot>
+ </template>
</template>
+
<template v-for="{ key } in extraSlots" #[key]>
<slot :name="key"></slot>
</template>
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 0a191f6d406..30c9294344e 100644
--- a/app/assets/javascripts/invite_members/components/members_token_select.vue
+++ b/app/assets/javascripts/invite_members/components/members_token_select.vue
@@ -134,10 +134,10 @@ export default {
:hide-dropdown-with-no-items="hideDropdownWithNoItems"
:placeholder="placeholderText"
:aria-labelledby="ariaLabelledby"
- :text-input-attrs="{
+ :text-input-attrs="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
'data-testid': 'members-token-select-input',
'data-qa-selector': 'members_token_select_input',
- }"
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@blur="handleBlur"
@text-input="handleTextInput"
@input="handleInput"
diff --git a/app/assets/javascripts/invite_members/components/user_limit_notification.vue b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
index beef1aef8a1..ea5f4317d86 100644
--- a/app/assets/javascripts/invite_members/components/user_limit_notification.vue
+++ b/app/assets/javascripts/invite_members/components/user_limit_notification.vue
@@ -1,35 +1,51 @@
<script>
import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
-import { s__, n__, sprintf } from '~/locale';
+import { n__, sprintf } from '~/locale';
-const CLOSE_TO_LIMIT_COUNT = 2;
-
-const WARNING_ALERT_TITLE = s__(
- 'InviteMembersModal|You only have space for %{count} more %{members} in %{name}',
-);
-
-const DANGER_ALERT_TITLE = s__(
- "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}",
-);
-
-const CLOSE_TO_LIMIT_MESSAGE = s__(
- 'InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
-);
+import {
+ WARNING_ALERT_TITLE,
+ DANGER_ALERT_TITLE,
+ REACHED_LIMIT_MESSAGE,
+ REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE,
+ CLOSE_TO_LIMIT_MESSAGE,
+} from '../constants';
-const REACHED_LIMIT_MESSAGE = s__(
- 'InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need.',
-).concat(' ', CLOSE_TO_LIMIT_MESSAGE);
+const CLOSE_TO_LIMIT_COUNT = 2;
export default {
name: 'UserLimitNotification',
components: { GlAlert, GlSprintf, GlLink },
- inject: ['name', 'newTrialRegistrationPath', 'purchasePath', 'freeUsersLimit', 'membersCount'],
+ inject: ['name'],
+ props: {
+ reachedLimit: {
+ type: Boolean,
+ required: true,
+ },
+ usersLimitDataset: {
+ type: Object,
+ required: false,
+ default: () => ({}),
+ },
+ },
computed: {
- reachedLimit() {
- return this.isLimit();
+ freeUsersLimit() {
+ return this.usersLimitDataset.freeUsersLimit;
+ },
+ membersCount() {
+ return this.usersLimitDataset.membersCount;
+ },
+ newTrialRegistrationPath() {
+ return this.usersLimitDataset.newTrialRegistrationPath;
+ },
+ purchasePath() {
+ return this.usersLimitDataset.purchasePath;
},
closeToLimit() {
- return this.isLimit(CLOSE_TO_LIMIT_COUNT);
+ if (this.freeUsersLimit && this.membersCount) {
+ return this.membersCount >= this.freeUsersLimit - CLOSE_TO_LIMIT_COUNT;
+ }
+
+ return false;
},
warningAlertTitle() {
return sprintf(WARNING_ALERT_TITLE, {
@@ -51,28 +67,29 @@ export default {
title() {
return this.reachedLimit ? this.dangerAlertTitle : this.warningAlertTitle;
},
+ reachedLimitMessage() {
+ if (this.usersLimitDataset.userNamespace) {
+ return this.$options.i18n.reachedLimitMessage;
+ }
+
+ return this.$options.i18n.reachedLimitUpgradeSuggestionMessage;
+ },
message() {
if (this.reachedLimit) {
- return this.$options.i18n.reachedLimitMessage;
+ return this.reachedLimitMessage;
}
return this.$options.i18n.closeToLimitMessage;
},
},
methods: {
- isLimit(deviation = 0) {
- if (this.freeUsersLimit && this.membersCount) {
- return this.membersCount >= this.freeUsersLimit - deviation;
- }
-
- return false;
- },
pluralMembers(count) {
return n__('member', 'members', count);
},
},
i18n: {
reachedLimitMessage: REACHED_LIMIT_MESSAGE,
+ reachedLimitUpgradeSuggestionMessage: REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE,
closeToLimitMessage: CLOSE_TO_LIMIT_MESSAGE,
},
};
diff --git a/app/assets/javascripts/invite_members/constants.js b/app/assets/javascripts/invite_members/constants.js
index 3cd0bfc0181..928f79f1c8d 100644
--- a/app/assets/javascripts/invite_members/constants.js
+++ b/app/assets/javascripts/invite_members/constants.js
@@ -35,8 +35,11 @@ export const MEMBERS_TO_PROJECT_DEFAULT_INTRO_TEXT = s__(
export const MEMBERS_TO_PROJECT_CELEBRATE_INTRO_TEXT = s__(
"InviteMembersModal|Congratulations on creating your project, you're almost there!",
);
-export const MEMBERS_SEARCH_FIELD = s__('InviteMembersModal|GitLab member or email address');
+export const MEMBERS_SEARCH_FIELD = s__('InviteMembersModal|Username or email address');
export const MEMBERS_PLACEHOLDER = s__('InviteMembersModal|Select members or type email addresses');
+export const MEMBERS_PLACEHOLDER_DISABLED = s__(
+ 'InviteMembersModal|This feature is disabled until this group has space for more members.',
+);
export const MEMBERS_TASKS_TO_BE_DONE_TITLE = s__(
'InviteMembersModal|Create issues for your new team member to work on (optional)',
);
@@ -66,7 +69,9 @@ export const READ_MORE_TEXT = s__(
`InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions`,
);
export const INVITE_BUTTON_TEXT = s__('InviteMembersModal|Invite');
+export const INVITE_BUTTON_TEXT_DISABLED = s__('InviteMembersModal|Manage members');
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_MODAL_LABELS = {
@@ -94,6 +99,7 @@ export const MEMBER_MODAL_LABELS = {
},
searchField: MEMBERS_SEARCH_FIELD,
placeHolder: MEMBERS_PLACEHOLDER,
+ placeHolderDisabled: MEMBERS_PLACEHOLDER_DISABLED,
tasksToBeDone: {
title: MEMBERS_TASKS_TO_BE_DONE_TITLE,
noProjects: MEMBERS_TASKS_TO_BE_DONE_NO_PROJECTS,
@@ -118,3 +124,27 @@ export const GROUP_MODAL_LABELS = {
};
export const LEARN_GITLAB = 'learn_gitlab';
+export const ON_SHOW_TRACK_LABEL = 'locked_modal_viewed';
+export const ON_CLOSE_TRACK_LABEL = 'explore_paid_plans_clicked';
+export const ON_SUBMIT_TRACK_LABEL = 'manage_members_clicked';
+
+export const WARNING_ALERT_TITLE = s__(
+ 'InviteMembersModal|You only have space for %{count} more %{members} in %{name}',
+);
+export const DANGER_ALERT_TITLE = s__(
+ "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}",
+);
+
+export const REACHED_LIMIT_MESSAGE = s__(
+ 'InviteMembersModal|You cannot add more members, but you can remove members who no longer need access.',
+);
+
+export const REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE = REACHED_LIMIT_MESSAGE.concat(
+ s__(
+ '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.',
+ ),
+);
+
+export const CLOSE_TO_LIMIT_MESSAGE = s__(
+ 'InviteMembersModal|To get more members an owner of this namespace can %{trialLinkStart}start a trial%{trialLinkEnd} or %{upgradeLinkStart}upgrade%{upgradeLinkEnd} to a paid tier.',
+);
diff --git a/app/assets/javascripts/invite_members/init_invite_members_modal.js b/app/assets/javascripts/invite_members/init_invite_members_modal.js
index 958121ad735..a4be3f205a3 100644
--- a/app/assets/javascripts/invite_members/init_invite_members_modal.js
+++ b/app/assets/javascripts/invite_members/init_invite_members_modal.js
@@ -1,7 +1,7 @@
import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import InviteMembersModal from '~/invite_members/components/invite_members_modal.vue';
-import { parseBoolean } from '~/lib/utils/common_utils';
+import { parseBoolean, convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
Vue.use(GlToast);
@@ -26,10 +26,6 @@ export default (function initInviteMembersModal() {
provide: {
name: el.dataset.name,
newProjectPath: el.dataset.newProjectPath,
- newTrialRegistrationPath: el.dataset.newTrialRegistrationPath,
- purchasePath: el.dataset.purchasePath,
- freeUsersLimit: el.dataset.freeUsersLimit && parseInt(el.dataset.freeUsersLimit, 10),
- membersCount: el.dataset.membersCount && parseInt(el.dataset.membersCount, 10),
},
render: (createElement) =>
createElement(InviteMembersModal, {
@@ -42,6 +38,9 @@ export default (function initInviteMembersModal() {
projects: JSON.parse(el.dataset.projects || '[]'),
usersFilter: el.dataset.usersFilter,
filterId: parseInt(el.dataset.filterId, 10),
+ usersLimitDataset: convertObjectPropsToCamelCase(
+ JSON.parse(el.dataset.usersLimitDataset || '{}'),
+ ),
},
}),
});
diff --git a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
index 82223ab9ef4..06d1a2ee233 100644
--- a/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
+++ b/app/assets/javascripts/issuable/components/issuable_header_warnings.vue
@@ -2,14 +2,21 @@
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { mapGetters } from 'vuex';
import { __ } from '~/locale';
+import { IssuableType, WorkspaceType } from '~/issues/constants';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
export default {
+ WorkspaceType,
+ IssuableType,
components: {
GlIcon,
+ ConfidentialityBadge,
},
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [glFeatureFlagMixin()],
inject: ['hidden'],
computed: {
...mapGetters(['getNoteableData']),
@@ -19,6 +26,9 @@ export default {
isConfidential() {
return this.getNoteableData.confidential;
},
+ isMergeRequest() {
+ return this.getNoteableData.targetType === 'merge_request' && this.glFeatures.updatedMrHeader;
+ },
warningIconsMeta() {
return [
{
@@ -27,11 +37,6 @@ export default {
dataTestId: 'locked',
},
{
- iconName: 'eye-slash',
- visible: this.isConfidential,
- dataTestId: 'confidential',
- },
- {
iconName: 'spam',
visible: this.hidden,
dataTestId: 'hidden',
@@ -45,6 +50,12 @@ export default {
<template>
<div class="gl-display-inline-block">
+ <confidentiality-badge
+ v-if="isConfidential"
+ data-testid="confidential"
+ :workspace-type="$options.WorkspaceType.project"
+ :issuable-type="$options.IssuableType.Issue"
+ />
<template v-for="meta in warningIconsMeta">
<div
v-if="meta.visible"
@@ -52,7 +63,11 @@ export default {
v-gl-tooltip
:data-testid="meta.dataTestId"
:title="meta.tooltip || null"
- class="issuable-warning-icon inline"
+ :class="{
+ 'gl-mr-3 gl-mt-2 gl-display-flex gl-justify-content-center gl-align-items-center': isMergeRequest,
+ 'gl-display-inline-block': !isMergeRequest,
+ }"
+ class="issuable-warning-icon"
>
<gl-icon :name="meta.iconName" class="icon" />
</div>
diff --git a/app/assets/javascripts/issuable/components/related_issuable_item.vue b/app/assets/javascripts/issuable/components/related_issuable_item.vue
index 2bb0e3c80f9..dfe18567608 100644
--- a/app/assets/javascripts/issuable/components/related_issuable_item.vue
+++ b/app/assets/javascripts/issuable/components/related_issuable_item.vue
@@ -116,7 +116,7 @@ export default {
<div
class="item-path-area item-path-id d-flex align-items-center mr-2 mt-2 mt-xl-0 ml-xl-2"
>
- <gl-tooltip :target="() => this.$refs.iconElement">
+ <gl-tooltip :target="() => $refs.iconElement">
<span v-safe-html="stateTitle"></span>
</gl-tooltip>
<span v-gl-tooltip :title="itemPath" class="path-id-text d-inline-block">{{
diff --git a/app/assets/javascripts/issuable/components/status_box.vue b/app/assets/javascripts/issuable/components/status_box.vue
index bd6fdc131cb..498dc859186 100644
--- a/app/assets/javascripts/issuable/components/status_box.vue
+++ b/app/assets/javascripts/issuable/components/status_box.vue
@@ -1,32 +1,50 @@
<script>
-import { GlIcon } from '@gitlab/ui';
+import { GlBadge, GlIcon } from '@gitlab/ui';
import Vue from 'vue';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { fetchPolicies } from '~/lib/graphql';
import { __ } from '~/locale';
+import { IssuableType } from '~/issues/constants';
+import { IssuableStates } from '~/vue_shared/issuable/list/constants';
-export const statusBoxState = Vue.observable({
+export const badgeState = Vue.observable({
state: '',
updateStatus: null,
});
const CLASSES = {
- opened: 'status-box-open',
- locked: 'status-box-open',
- closed: 'status-box-mr-closed',
- merged: 'status-box-mr-merged',
+ opened: 'issuable-status-badge-open',
+ locked: 'issuable-status-badge-open',
+ closed: 'issuable-status-badge-closed',
+ merged: 'issuable-status-badge-merged',
+};
+
+const ISSUE_ICONS = {
+ opened: 'issues',
+ locked: 'issues',
+ closed: 'issue-closed',
+};
+
+const MERGE_REQUEST_ICONS = {
+ opened: 'merge-request-open',
+ locked: 'merge-request-open',
+ closed: 'merge-request-close',
+ merged: 'merge',
};
const STATUS = {
- opened: [__('Open'), 'issue-open-m'],
- locked: [__('Open'), 'issue-open-m'],
- closed: [__('Closed'), 'issue-close'],
- merged: [__('Merged'), 'git-merge'],
+ opened: __('Open'),
+ locked: __('Open'),
+ closed: __('Closed'),
+ merged: __('Merged'),
};
export default {
components: {
+ GlBadge,
GlIcon,
},
+ mixins: [glFeatureFlagMixin()],
inject: {
query: { default: null },
projectPath: { default: null },
@@ -46,30 +64,47 @@ export default {
},
data() {
if (this.initialState) {
- statusBoxState.state = this.initialState;
+ badgeState.state = this.initialState;
}
- return statusBoxState;
+ return badgeState;
},
computed: {
- statusBoxClass() {
- return CLASSES[`${this.issuableType}_${this.state}`] || CLASSES[this.state];
+ badgeClass() {
+ return [
+ CLASSES[this.state],
+ {
+ 'gl-vertical-align-bottom':
+ this.issuableType === IssuableType.MergeRequest && this.glFeatures.updatedMrHeader,
+ },
+ ];
+ },
+ badgeVariant() {
+ if (this.state === IssuableStates.Opened) {
+ return 'success';
+ } else if (this.state === IssuableStates.Closed) {
+ return this.issuableType === IssuableType.MergeRequest ? 'danger' : 'info';
+ }
+ return 'info';
},
- statusHumanName() {
- return (STATUS[`${this.issuableType}_${this.state}`] || STATUS[this.state])[0];
+ badgeText() {
+ return STATUS[this.state];
},
- statusIconName() {
- return (STATUS[`${this.issuableType}_${this.state}`] || STATUS[this.state])[1];
+ badgeIcon() {
+ if (this.issuableType === IssuableType.Issue) {
+ return ISSUE_ICONS[this.state];
+ }
+ return MERGE_REQUEST_ICONS[this.state];
},
},
created() {
- if (!statusBoxState.updateStatus) {
- statusBoxState.updateStatus = this.fetchState;
+ if (!badgeState.updateStatus) {
+ badgeState.updateStatus = this.fetchState;
}
},
beforeDestroy() {
- if (statusBoxState.updateStatus && this.query) {
- statusBoxState.updateStatus = null;
+ if (badgeState.updateStatus && this.query) {
+ badgeState.updateStatus = null;
}
},
methods: {
@@ -83,17 +118,15 @@ export default {
fetchPolicy: fetchPolicies.NO_CACHE,
});
- statusBoxState.state = data?.workspace?.issuable?.state;
+ badgeState.state = data?.workspace?.issuable?.state;
},
},
};
</script>
<template>
- <div :class="statusBoxClass" class="issuable-status-box status-box">
- <gl-icon :name="statusIconName" class="gl-display-block gl-sm-display-none!" />
- <span class="gl-display-none gl-sm-display-block">
- {{ statusHumanName }}
- </span>
- </div>
+ <gl-badge class="issuable-status-badge gl-mr-3" :class="badgeClass" :variant="badgeVariant">
+ <gl-icon :name="badgeIcon" />
+ <span class="gl-display-none gl-sm-display-block gl-ml-2">{{ badgeText }}</span>
+ </gl-badge>
</template>
diff --git a/app/assets/javascripts/issuable/issuable_form.js b/app/assets/javascripts/issuable/issuable_form.js
index 018cadad50f..8e76a33c7dd 100644
--- a/app/assets/javascripts/issuable/issuable_form.js
+++ b/app/assets/javascripts/issuable/issuable_form.js
@@ -65,7 +65,8 @@ export default class IssuableForm {
this.gfmAutoComplete = new GfmAutoComplete(
gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources,
).setup();
- this.usersSelect = new UsersSelect();
+ const autoAssignToMe = form.get(0).id === 'new_merge_request';
+ this.usersSelect = new UsersSelect(undefined, undefined, { autoAssignToMe });
this.reviewersSelect = new UsersSelect(undefined, '.js-reviewer-search');
this.zenMode = new ZenMode();
diff --git a/app/assets/javascripts/issues/create_merge_request_dropdown.js b/app/assets/javascripts/issues/create_merge_request_dropdown.js
index c96af6da720..8294c018117 100644
--- a/app/assets/javascripts/issues/create_merge_request_dropdown.js
+++ b/app/assets/javascripts/issues/create_merge_request_dropdown.js
@@ -69,12 +69,12 @@ export default class CreateMergeRequestDropdown {
// with user's inputs.
this.regexps = {
branch: {
- createBranchPath: new RegExp('(branch_name=)(.+?)(?=&issue)'),
- createMrPath: new RegExp('(source_branch%5D=)(.+?)(?=&)'),
+ createBranchPath: /(branch_name=)(.+?)(?=&issue)/,
+ createMrPath: /(source_branch%5D=)(.+?)(?=&)/,
},
ref: {
- createBranchPath: new RegExp('(ref=)(.+?)$'),
- createMrPath: new RegExp('(target_branch%5D=)(.+?)$'),
+ createBranchPath: /(ref=)(.+?)$/,
+ createMrPath: /(target_branch%5D=)(.+?)$/,
},
};
@@ -170,7 +170,6 @@ export default class CreateMergeRequestDropdown {
createMergeRequest() {
return new Promise(() => {
this.isCreatingMergeRequest = true;
-
return this.createBranch().then(() => {
let path = canCreateConfidentialMergeRequest()
? this.createMrPath.replace(
diff --git a/app/assets/javascripts/issues/issue.js b/app/assets/javascripts/issues/issue.js
index 8e27f547b5c..a9321cf200d 100644
--- a/app/assets/javascripts/issues/issue.js
+++ b/app/assets/javascripts/issues/issue.js
@@ -49,8 +49,8 @@ export default class Issue {
issueFailMessage = __('Unable to update this issue at this time.'),
) {
if ('id' in data) {
- const isClosedBadge = $('div.status-box-issue-closed');
- const isOpenBadge = $('div.status-box-open');
+ const isClosedBadge = $('.issuable-status-badge-closed');
+ const isOpenBadge = $('.issuable-status-badge-open');
const projectIssuesCounter = $('.issue_counter');
isClosedBadge.toggleClass('hidden', !isClosed);
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 a43aed6c521..b81ab103271 100644
--- a/app/assets/javascripts/issues/list/components/issues_list_app.vue
+++ b/app/assets/javascripts/issues/list/components/issues_list_app.vue
@@ -13,6 +13,8 @@ import fuzzaldrinPlus from 'fuzzaldrin-plus';
import IssueCardTimeInfo from 'ee_else_ce/issues/list/components/issue_card_time_info.vue';
import getIssuesQuery from 'ee_else_ce/issues/list/queries/get_issues.query.graphql';
import getIssuesCountsQuery from 'ee_else_ce/issues/list/queries/get_issues_counts.query.graphql';
+import getIssuesWithoutCrmQuery from 'ee_else_ce/issues/list/queries/get_issues_without_crm.query.graphql';
+import getIssuesCountsWithoutCrmQuery from 'ee_else_ce/issues/list/queries/get_issues_counts_without_crm.query.graphql';
import createFlash, { FLASH_TYPES } from '~/flash';
import { TYPE_USER } from '~/graphql_shared/constants';
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
@@ -45,6 +47,7 @@ import {
PAGE_SIZE,
PARAM_PAGE_AFTER,
PARAM_PAGE_BEFORE,
+ PARAM_SORT,
PARAM_STATE,
RELATIVE_POSITION_ASC,
TOKEN_TYPE_ASSIGNEE,
@@ -122,6 +125,7 @@ export default {
'isAnonymousSearchDisabled',
'isIssueRepositioningDisabled',
'isProject',
+ 'isPublicVisibilityRestricted',
'isSignedIn',
'jiraIntegrationPath',
'newIssuePath',
@@ -138,48 +142,24 @@ export default {
},
},
data() {
- const pageAfter = getParameterByName(PARAM_PAGE_AFTER);
- const pageBefore = getParameterByName(PARAM_PAGE_BEFORE);
- const state = getParameterByName(PARAM_STATE);
- const defaultSortKey = state === IssuableStates.Closed ? UPDATED_DESC : CREATED_DESC;
- const dashboardSortKey = getSortKey(this.initialSort);
- const graphQLSortKey =
- isSortKey(this.initialSort?.toUpperCase()) && this.initialSort.toUpperCase();
-
- // The initial sort is an old enum value when it is saved on the dashboard issues page.
- // The initial sort is a GraphQL enum value when it is saved on the Vue issues list page.
- let sortKey = dashboardSortKey || graphQLSortKey || defaultSortKey;
-
- if (this.isIssueRepositioningDisabled && sortKey === RELATIVE_POSITION_ASC) {
- this.showIssueRepositioningMessage();
- sortKey = defaultSortKey;
- }
-
- const isSearchDisabled =
- this.isAnonymousSearchDisabled &&
- !this.isSignedIn &&
- window.location.search.includes('search=');
-
- if (isSearchDisabled) {
- this.showAnonymousSearchingMessage();
- }
-
return {
exportCsvPathWithQuery: this.getExportCsvPathWithQuery(),
- filterTokens: isSearchDisabled ? [] : getFilterTokens(window.location.search),
+ filterTokens: [],
issues: [],
issuesCounts: {},
issuesError: null,
pageInfo: {},
- pageParams: getInitialPageParams(sortKey, pageAfter, pageBefore),
+ pageParams: {},
showBulkEditSidebar: false,
- sortKey,
- state: state || IssuableStates.Opened,
+ sortKey: CREATED_DESC,
+ state: IssuableStates.Opened,
};
},
apollo: {
issues: {
- query: getIssuesQuery,
+ query() {
+ return this.hasCrmParameter ? getIssuesQuery : getIssuesWithoutCrmQuery;
+ },
variables() {
return this.queryVariables;
},
@@ -203,7 +183,9 @@ export default {
debounce: 200,
},
issuesCounts: {
- query: getIssuesCountsQuery,
+ query() {
+ return this.hasCrmParameter ? getIssuesCountsQuery : getIssuesCountsWithoutCrmQuery;
+ },
variables() {
return this.queryVariables;
},
@@ -228,6 +210,7 @@ export default {
const isIidSearch = ISSUE_REFERENCE.test(this.searchQuery);
return {
fullPath: this.fullPath,
+ hideUsers: this.isPublicVisibilityRestricted && !this.isSignedIn,
iid: isIidSearch ? this.searchQuery.slice(1) : undefined,
isProject: this.isProject,
isSignedIn: this.isSignedIn,
@@ -415,8 +398,22 @@ export default {
...this.urlFilterParams,
};
},
+ hasCrmParameter() {
+ return (
+ window.location.search.includes('crm_contact_id=') ||
+ window.location.search.includes('crm_organization_id=')
+ );
+ },
+ },
+ watch: {
+ $route(newValue, oldValue) {
+ if (newValue.fullPath !== oldValue.fullPath) {
+ this.updateData(getParameterByName(PARAM_SORT));
+ }
+ },
},
created() {
+ this.updateData(this.initialSort);
this.cache = {};
},
mounted() {
@@ -516,6 +513,8 @@ export default {
this.pageParams = getInitialPageParams(this.sortKey);
}
this.state = state;
+
+ this.$router.push({ query: this.urlParams });
},
handleDismissAlert() {
this.issuesError = null;
@@ -525,8 +524,11 @@ export default {
this.showAnonymousSearchingMessage();
return;
}
+
this.pageParams = getInitialPageParams(this.sortKey);
this.filterTokens = filter;
+
+ this.$router.push({ query: this.urlParams });
},
handleNextPage() {
this.pageParams = {
@@ -534,6 +536,8 @@ export default {
firstPageSize: PAGE_SIZE,
};
scrollUp();
+
+ this.$router.push({ query: this.urlParams });
},
handlePreviousPage() {
this.pageParams = {
@@ -541,6 +545,8 @@ export default {
lastPageSize: PAGE_SIZE,
};
scrollUp();
+
+ this.$router.push({ query: this.urlParams });
},
handleReorder({ newIndex, oldIndex }) {
const issueToMove = this.issues[oldIndex];
@@ -592,6 +598,8 @@ export default {
if (this.isSignedIn) {
this.saveSortPreference(sortKey);
}
+
+ this.$router.push({ query: this.urlParams });
},
saveSortPreference(sortKey) {
this.$apollo
@@ -623,6 +631,39 @@ export default {
toggleBulkEditSidebar(showBulkEditSidebar) {
this.showBulkEditSidebar = showBulkEditSidebar;
},
+ updateData(sortValue) {
+ const pageAfter = getParameterByName(PARAM_PAGE_AFTER);
+ const pageBefore = getParameterByName(PARAM_PAGE_BEFORE);
+ const state = getParameterByName(PARAM_STATE);
+
+ const defaultSortKey = state === IssuableStates.Closed ? UPDATED_DESC : CREATED_DESC;
+ const dashboardSortKey = getSortKey(sortValue);
+ const graphQLSortKey = isSortKey(sortValue?.toUpperCase()) && sortValue.toUpperCase();
+
+ // The initial sort is an old enum value when it is saved on the dashboard issues page.
+ // The initial sort is a GraphQL enum value when it is saved on the Vue issues list page.
+ let sortKey = dashboardSortKey || graphQLSortKey || defaultSortKey;
+
+ if (this.isIssueRepositioningDisabled && sortKey === RELATIVE_POSITION_ASC) {
+ this.showIssueRepositioningMessage();
+ sortKey = defaultSortKey;
+ }
+
+ const isSearchDisabled =
+ this.isAnonymousSearchDisabled &&
+ !this.isSignedIn &&
+ window.location.search.includes('search=');
+
+ if (isSearchDisabled) {
+ this.showAnonymousSearchingMessage();
+ }
+
+ this.exportCsvPathWithQuery = this.getExportCsvPathWithQuery();
+ this.filterTokens = isSearchDisabled ? [] : getFilterTokens(window.location.search);
+ this.pageParams = getInitialPageParams(sortKey, pageAfter, pageBefore);
+ this.sortKey = sortKey;
+ this.state = state || IssuableStates.Opened;
+ },
},
};
</script>
@@ -649,10 +690,10 @@ export default {
:is-manual-ordering="isManualOrdering"
:show-bulk-edit-sidebar="showBulkEditSidebar"
:show-pagination-controls="showPaginationControls"
- :use-keyset-pagination="true"
+ sync-filter-and-sort
+ use-keyset-pagination
:has-next-page="pageInfo.hasNextPage"
:has-previous-page="pageInfo.hasPreviousPage"
- :url-params="urlParams"
@click-tab="handleClickTab"
@dismiss-alert="handleDismissAlert"
@filter="handleFilter"
diff --git a/app/assets/javascripts/issues/list/constants.js b/app/assets/javascripts/issues/list/constants.js
index 4b07a078512..0795df10a7c 100644
--- a/app/assets/javascripts/issues/list/constants.js
+++ b/app/assets/javascripts/issues/list/constants.js
@@ -56,8 +56,10 @@ export const ISSUE_REFERENCE = /^#\d+$/;
export const MAX_LIST_SIZE = 10;
export const PAGE_SIZE = 20;
export const PAGE_SIZE_MANUAL = 100;
+export const PARAM_ASSIGNEE_ID = 'assignee_id';
export const PARAM_PAGE_AFTER = 'page_after';
export const PARAM_PAGE_BEFORE = 'page_before';
+export const PARAM_SORT = 'sort';
export const PARAM_STATE = 'state';
export const RELATIVE_POSITION = 'relative_position';
@@ -112,7 +114,8 @@ export const URL_PARAM = 'urlParam';
export const NORMAL_FILTER = 'normalFilter';
export const SPECIAL_FILTER = 'specialFilter';
export const ALTERNATIVE_FILTER = 'alternativeFilter';
-export const SPECIAL_FILTER_VALUES = [
+
+export const specialFilterValues = [
FILTER_NONE,
FILTER_ANY,
FILTER_CURRENT,
@@ -131,6 +134,8 @@ export const TOKEN_TYPE_CONFIDENTIAL = 'confidential';
export const TOKEN_TYPE_ITERATION = 'iteration';
export const TOKEN_TYPE_EPIC = 'epic_id';
export const TOKEN_TYPE_WEIGHT = 'weight';
+export const TOKEN_TYPE_CONTACT = 'crm_contact';
+export const TOKEN_TYPE_ORGANIZATION = 'crm_organization';
export const filters = {
[TOKEN_TYPE_AUTHOR]: {
@@ -174,6 +179,7 @@ export const filters = {
},
[OPERATOR_IS_NOT]: {
[NORMAL_FILTER]: 'not[milestone_title]',
+ [SPECIAL_FILTER]: 'not[milestone_title]',
},
},
},
@@ -258,6 +264,7 @@ export const filters = {
},
[OPERATOR_IS_NOT]: {
[NORMAL_FILTER]: 'not[iteration_id]',
+ [SPECIAL_FILTER]: 'not[iteration_id]',
},
},
},
@@ -291,4 +298,24 @@ export const filters = {
},
},
},
+ [TOKEN_TYPE_CONTACT]: {
+ [API_PARAM]: {
+ [NORMAL_FILTER]: 'crmContactId',
+ },
+ [URL_PARAM]: {
+ [OPERATOR_IS]: {
+ [NORMAL_FILTER]: 'crm_contact_id',
+ },
+ },
+ },
+ [TOKEN_TYPE_ORGANIZATION]: {
+ [API_PARAM]: {
+ [NORMAL_FILTER]: 'crmOrganizationId',
+ },
+ [URL_PARAM]: {
+ [OPERATOR_IS]: {
+ [NORMAL_FILTER]: 'crm_organization_id',
+ },
+ },
+ },
};
diff --git a/app/assets/javascripts/issues/list/index.js b/app/assets/javascripts/issues/list/index.js
index 3b2d37eab74..f5cb160e344 100644
--- a/app/assets/javascripts/issues/list/index.js
+++ b/app/assets/javascripts/issues/list/index.js
@@ -1,6 +1,7 @@
import produce from 'immer';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import VueRouter from 'vue-router';
import getIssuesQuery from 'ee_else_ce/issues/list/queries/get_issues.query.graphql';
import IssuesListApp from 'ee_else_ce/issues/list/components/issues_list_app.vue';
import createDefaultClient from '~/lib/graphql';
@@ -53,6 +54,7 @@ export function mountIssuesListApp() {
}
Vue.use(VueApollo);
+ Vue.use(VueRouter);
const resolvers = {
Mutation: {
@@ -74,11 +76,6 @@ export function mountIssuesListApp() {
},
};
- const defaultClient = createDefaultClient(resolvers);
- const apolloProvider = new VueApollo({
- defaultClient,
- });
-
const {
autocompleteAwardEmojisPath,
calendarPath,
@@ -104,6 +101,7 @@ export function mountIssuesListApp() {
isAnonymousSearchDisabled,
isIssueRepositioningDisabled,
isProject,
+ isPublicVisibilityRestricted,
isSignedIn,
jiraIntegrationPath,
markdownHelpPath,
@@ -121,7 +119,14 @@ export function mountIssuesListApp() {
return new Vue({
el,
name: 'IssuesListRoot',
- apolloProvider,
+ apolloProvider: new VueApollo({
+ defaultClient: createDefaultClient(resolvers),
+ }),
+ router: new VueRouter({
+ base: window.location.pathname,
+ mode: 'history',
+ routes: [{ path: '/' }],
+ }),
provide: {
autocompleteAwardEmojisPath,
calendarPath,
@@ -140,6 +145,7 @@ export function mountIssuesListApp() {
isAnonymousSearchDisabled: parseBoolean(isAnonymousSearchDisabled),
isIssueRepositioningDisabled: parseBoolean(isIssueRepositioningDisabled),
isProject: parseBoolean(isProject),
+ isPublicVisibilityRestricted: parseBoolean(isPublicVisibilityRestricted),
isSignedIn: parseBoolean(isSignedIn),
jiraIntegrationPath,
newIssuePath,
diff --git a/app/assets/javascripts/issues/list/queries/get_issues.query.graphql b/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
index ec24ea7c56a..df7016aeb74 100644
--- a/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
+++ b/app/assets/javascripts/issues/list/queries/get_issues.query.graphql
@@ -2,6 +2,7 @@
#import "./issue.fragment.graphql"
query getIssues(
+ $hideUsers: Boolean = false
$isProject: Boolean = false
$isSignedIn: Boolean = false
$fullPath: ID!
@@ -20,6 +21,8 @@ query getIssues(
$releaseTag: [String!]
$releaseTagWildcardId: ReleaseTagWildcardId
$types: [IssueType!]
+ $crmContactId: String
+ $crmOrganizationId: String
$not: NegatedIssueFilterInput
$beforeCursor: String
$afterCursor: String
@@ -43,6 +46,8 @@ query getIssues(
milestoneWildcardId: $milestoneWildcardId
myReactionEmoji: $myReactionEmoji
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
before: $beforeCursor
after: $afterCursor
@@ -76,6 +81,8 @@ query getIssues(
releaseTag: $releaseTag
releaseTagWildcardId: $releaseTagWildcardId
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
before: $beforeCursor
after: $afterCursor
diff --git a/app/assets/javascripts/issues/list/queries/get_issues_counts.query.graphql b/app/assets/javascripts/issues/list/queries/get_issues_counts.query.graphql
index 58e7ce32e7c..c1aee772167 100644
--- a/app/assets/javascripts/issues/list/queries/get_issues_counts.query.graphql
+++ b/app/assets/javascripts/issues/list/queries/get_issues_counts.query.graphql
@@ -14,6 +14,8 @@ query getIssuesCount(
$releaseTag: [String!]
$releaseTagWildcardId: ReleaseTagWildcardId
$types: [IssueType!]
+ $crmContactId: String
+ $crmOrganizationId: String
$not: NegatedIssueFilterInput
) {
group(fullPath: $fullPath) @skip(if: $isProject) {
@@ -32,6 +34,8 @@ query getIssuesCount(
milestoneWildcardId: $milestoneWildcardId
myReactionEmoji: $myReactionEmoji
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
@@ -50,6 +54,8 @@ query getIssuesCount(
milestoneWildcardId: $milestoneWildcardId
myReactionEmoji: $myReactionEmoji
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
@@ -68,6 +74,8 @@ query getIssuesCount(
milestoneWildcardId: $milestoneWildcardId
myReactionEmoji: $myReactionEmoji
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
@@ -90,6 +98,8 @@ query getIssuesCount(
releaseTag: $releaseTag
releaseTagWildcardId: $releaseTagWildcardId
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
@@ -109,6 +119,8 @@ query getIssuesCount(
releaseTag: $releaseTag
releaseTagWildcardId: $releaseTagWildcardId
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
@@ -128,6 +140,8 @@ query getIssuesCount(
releaseTag: $releaseTag
releaseTagWildcardId: $releaseTagWildcardId
types: $types
+ crmContactId: $crmContactId
+ crmOrganizationId: $crmOrganizationId
not: $not
) {
count
diff --git a/app/assets/javascripts/issues/list/queries/get_issues_counts_without_crm.query.graphql b/app/assets/javascripts/issues/list/queries/get_issues_counts_without_crm.query.graphql
new file mode 100644
index 00000000000..ab91aab1218
--- /dev/null
+++ b/app/assets/javascripts/issues/list/queries/get_issues_counts_without_crm.query.graphql
@@ -0,0 +1,136 @@
+query getIssuesCountWithoutCrm(
+ $isProject: Boolean = false
+ $fullPath: ID!
+ $iid: String
+ $search: String
+ $assigneeId: String
+ $assigneeUsernames: [String!]
+ $authorUsername: String
+ $confidential: Boolean
+ $labelName: [String]
+ $milestoneTitle: [String]
+ $milestoneWildcardId: MilestoneWildcardId
+ $myReactionEmoji: String
+ $releaseTag: [String!]
+ $releaseTagWildcardId: ReleaseTagWildcardId
+ $types: [IssueType!]
+ $not: NegatedIssueFilterInput
+) {
+ group(fullPath: $fullPath) @skip(if: $isProject) {
+ id
+ openedIssues: issues(
+ includeSubgroups: true
+ state: opened
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ closedIssues: issues(
+ includeSubgroups: true
+ state: closed
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ allIssues: issues(
+ includeSubgroups: true
+ state: all
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ }
+ project(fullPath: $fullPath) @include(if: $isProject) {
+ id
+ openedIssues: issues(
+ state: opened
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ releaseTag: $releaseTag
+ releaseTagWildcardId: $releaseTagWildcardId
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ closedIssues: issues(
+ state: closed
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ releaseTag: $releaseTag
+ releaseTagWildcardId: $releaseTagWildcardId
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ allIssues: issues(
+ state: all
+ iid: $iid
+ search: $search
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ releaseTag: $releaseTag
+ releaseTagWildcardId: $releaseTagWildcardId
+ types: $types
+ not: $not
+ ) {
+ count
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues/list/queries/get_issues_without_crm.query.graphql b/app/assets/javascripts/issues/list/queries/get_issues_without_crm.query.graphql
new file mode 100644
index 00000000000..4a8b1dfd618
--- /dev/null
+++ b/app/assets/javascripts/issues/list/queries/get_issues_without_crm.query.graphql
@@ -0,0 +1,94 @@
+#import "~/graphql_shared/fragments/page_info.fragment.graphql"
+#import "./issue.fragment.graphql"
+
+query getIssuesWithoutCrm(
+ $hideUsers: Boolean = false
+ $isProject: Boolean = false
+ $isSignedIn: Boolean = false
+ $fullPath: ID!
+ $iid: String
+ $search: String
+ $sort: IssueSort
+ $state: IssuableState
+ $assigneeId: String
+ $assigneeUsernames: [String!]
+ $authorUsername: String
+ $confidential: Boolean
+ $labelName: [String]
+ $milestoneTitle: [String]
+ $milestoneWildcardId: MilestoneWildcardId
+ $myReactionEmoji: String
+ $releaseTag: [String!]
+ $releaseTagWildcardId: ReleaseTagWildcardId
+ $types: [IssueType!]
+ $not: NegatedIssueFilterInput
+ $beforeCursor: String
+ $afterCursor: String
+ $firstPageSize: Int
+ $lastPageSize: Int
+) {
+ group(fullPath: $fullPath) @skip(if: $isProject) {
+ id
+ issues(
+ includeSubgroups: true
+ iid: $iid
+ search: $search
+ sort: $sort
+ state: $state
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ types: $types
+ not: $not
+ before: $beforeCursor
+ after: $afterCursor
+ first: $firstPageSize
+ last: $lastPageSize
+ ) {
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...IssueFragment
+ reference(full: true)
+ }
+ }
+ }
+ project(fullPath: $fullPath) @include(if: $isProject) {
+ id
+ issues(
+ iid: $iid
+ search: $search
+ sort: $sort
+ state: $state
+ assigneeId: $assigneeId
+ assigneeUsernames: $assigneeUsernames
+ authorUsername: $authorUsername
+ confidential: $confidential
+ labelName: $labelName
+ milestoneTitle: $milestoneTitle
+ milestoneWildcardId: $milestoneWildcardId
+ myReactionEmoji: $myReactionEmoji
+ releaseTag: $releaseTag
+ releaseTagWildcardId: $releaseTagWildcardId
+ types: $types
+ not: $not
+ before: $beforeCursor
+ after: $afterCursor
+ first: $firstPageSize
+ last: $lastPageSize
+ ) {
+ pageInfo {
+ ...PageInfo
+ }
+ nodes {
+ ...IssueFragment
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
index d09e4d9df2b..73a13cea94a 100644
--- a/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
+++ b/app/assets/javascripts/issues/list/queries/issue.fragment.graphql
@@ -17,7 +17,7 @@ fragment IssueFragment on Issue {
userDiscussionsCount @include(if: $isSignedIn)
webPath
webUrl
- assignees {
+ assignees @skip(if: $hideUsers) {
nodes {
__typename
id
@@ -27,7 +27,7 @@ fragment IssueFragment on Issue {
webUrl
}
}
- author {
+ author @skip(if: $hideUsers) {
__typename
id
avatarUrl
diff --git a/app/assets/javascripts/issues/list/utils.js b/app/assets/javascripts/issues/list/utils.js
index 4b77bd9bc5f..3ca93069628 100644
--- a/app/assets/javascripts/issues/list/utils.js
+++ b/app/assets/javascripts/issues/list/utils.js
@@ -1,4 +1,6 @@
+import { createTerm } from '@gitlab/ui/src/components/base/filtered_search/filtered_search_utils';
import { isPositiveInteger } from '~/lib/utils/number_utils';
+import { getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import {
FILTERED_SEARCH_TERM,
@@ -20,13 +22,14 @@ import {
NORMAL_FILTER,
PAGE_SIZE,
PAGE_SIZE_MANUAL,
+ PARAM_ASSIGNEE_ID,
POPULARITY_ASC,
POPULARITY_DESC,
PRIORITY_ASC,
PRIORITY_DESC,
RELATIVE_POSITION_ASC,
SPECIAL_FILTER,
- SPECIAL_FILTER_VALUES,
+ specialFilterValues,
TITLE_ASC,
TITLE_DESC,
TOKEN_TYPE_ASSIGNEE,
@@ -195,23 +198,27 @@ const convertToFilteredSearchTerms = (locationSearch) =>
export const getFilterTokens = (locationSearch) => {
if (!locationSearch) {
- return [];
+ return [createTerm()];
}
const filterTokens = convertToFilteredTokens(locationSearch);
const searchTokens = convertToFilteredSearchTerms(locationSearch);
- return filterTokens.concat(searchTokens);
+ const tokens = filterTokens.concat(searchTokens);
+ return tokens.length ? tokens : [createTerm()];
};
-const getFilterType = (data, tokenType = '') =>
- SPECIAL_FILTER_VALUES.includes(data) ||
- (tokenType === TOKEN_TYPE_ASSIGNEE && isPositiveInteger(data))
- ? SPECIAL_FILTER
- : NORMAL_FILTER;
+const getFilterType = (data, tokenType = '') => {
+ const isAssigneeIdParam =
+ tokenType === TOKEN_TYPE_ASSIGNEE &&
+ isPositiveInteger(data) &&
+ getParameterByName(PARAM_ASSIGNEE_ID) === data;
+
+ return specialFilterValues.includes(data) || isAssigneeIdParam ? SPECIAL_FILTER : NORMAL_FILTER;
+};
const wildcardTokens = [TOKEN_TYPE_ITERATION, TOKEN_TYPE_MILESTONE, TOKEN_TYPE_RELEASE];
const isWildcardValue = (tokenType, value) =>
- wildcardTokens.includes(tokenType) && SPECIAL_FILTER_VALUES.includes(value);
+ wildcardTokens.includes(tokenType) && specialFilterValues.includes(value);
const requiresUpperCaseValue = (tokenType, value) =>
tokenType === TOKEN_TYPE_TYPE || isWildcardValue(tokenType, value);
diff --git a/app/assets/javascripts/issues/show/components/app.vue b/app/assets/javascripts/issues/show/components/app.vue
index 456a2029703..c664135f30e 100644
--- a/app/assets/javascripts/issues/show/components/app.vue
+++ b/app/assets/javascripts/issues/show/components/app.vue
@@ -1,11 +1,17 @@
<script>
-import { GlIcon, GlIntersectionObserver, GlTooltipDirective } from '@gitlab/ui';
+import { GlIcon, GlBadge, GlIntersectionObserver, GlTooltipDirective } from '@gitlab/ui';
import Visibility from 'visibilityjs';
import createFlash from '~/flash';
-import { IssuableStatus, IssuableStatusText, IssuableType } from '~/issues/constants';
+import {
+ IssuableStatus,
+ IssuableStatusText,
+ WorkspaceType,
+ IssuableType,
+} from '~/issues/constants';
import Poll from '~/lib/utils/poll';
import { visitUrl } from '~/lib/utils/url_utility';
import { __, sprintf } from '~/locale';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
import { ISSUE_TYPE_PATH, INCIDENT_TYPE_PATH, INCIDENT_TYPE, POLLING_DELAY } from '../constants';
import eventHub from '../event_hub';
import getIssueStateQuery from '../queries/get_issue_state.query.graphql';
@@ -18,13 +24,16 @@ import PinnedLinks from './pinned_links.vue';
import titleComponent from './title.vue';
export default {
+ WorkspaceType,
components: {
GlIcon,
+ GlBadge,
GlIntersectionObserver,
titleComponent,
editedComponent,
formComponent,
PinnedLinks,
+ ConfidentialityBadge,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -156,7 +165,7 @@ export default {
issuableType: {
type: String,
required: false,
- default: 'issue',
+ default: IssuableType.Issue,
},
canAttachFile: {
type: Boolean,
@@ -259,13 +268,19 @@ export default {
: '';
},
statusIcon() {
- return this.isClosed ? 'issue-close' : 'issue-open-m';
+ if (this.issuableType === IssuableType.Issue) {
+ return this.isClosed ? 'issue-closed' : 'issues';
+ }
+ return this.isClosed ? 'epic-closed' : 'epic';
+ },
+ statusVariant() {
+ return this.isClosed ? 'info' : 'success';
},
statusText() {
return IssuableStatusText[this.issuableStatus];
},
shouldShowStickyHeader() {
- return this.issuableType === IssuableType.Issue;
+ return [IssuableType.Issue, IssuableType.Epic].includes(this.issuableType);
},
},
created() {
@@ -327,20 +342,24 @@ export default {
});
},
- updateFormState(state) {
+ setFormState(state) {
this.store.setFormState(state);
},
- updateAndShowForm(templates = {}) {
+ updateFormState(templates = {}) {
+ this.setFormState({
+ title: this.state.titleText,
+ description: this.state.descriptionText,
+ lock_version: this.state.lock_version,
+ lockedWarningVisible: false,
+ updateLoading: false,
+ issuableTemplates: templates,
+ });
+ },
+
+ updateAndShowForm(templates) {
if (!this.showForm) {
- this.store.setFormState({
- title: this.state.titleText,
- description: this.state.descriptionText,
- lock_version: this.state.lock_version,
- lockedWarningVisible: false,
- updateLoading: false,
- issuableTemplates: templates,
- });
+ this.updateFormState(templates);
this.showForm = true;
}
},
@@ -373,9 +392,7 @@ export default {
},
updateIssuable() {
- this.store.setFormState({
- updateLoading: true,
- });
+ this.setFormState({ updateLoading: true });
const {
store: { formState },
@@ -413,10 +430,6 @@ export default {
.catch((error = {}) => {
const { message, response = {} } = error;
- this.store.setFormState({
- updateLoading: false,
- });
-
let errMsg = this.defaultErrorMessage;
if (response.data && response.data.errors) {
@@ -428,6 +441,9 @@ export default {
this.flashContainer = createFlash({
message: errMsg,
});
+ })
+ .finally(() => {
+ this.setFormState({ updateLoading: false });
});
},
@@ -446,6 +462,12 @@ export default {
}
},
+ handleListItemReorder(description) {
+ this.updateFormState();
+ this.setFormState({ description });
+ this.updateIssuable();
+ },
+
taskListUpdateStarted() {
this.poll.stop();
},
@@ -483,7 +505,7 @@ export default {
:can-attach-file="canAttachFile"
:enable-autocomplete="enableAutocomplete"
:issuable-type="issuableType"
- @updateForm="updateFormState"
+ @updateForm="setFormState"
/>
</div>
<div v-else>
@@ -509,19 +531,21 @@ export default {
<div
class="issue-sticky-header-text gl-display-flex gl-align-items-center gl-mx-auto gl-px-5"
>
- <p
- class="issuable-status-box status-box gl-my-0"
- :class="[isClosed ? 'status-box-issue-closed' : 'status-box-open']"
+ <gl-badge :variant="statusVariant" class="gl-mr-2">
+ <gl-icon :name="statusIcon" />
+ <span class="gl-display-none gl-sm-display-block gl-ml-2">{{
+ statusText
+ }}</span></gl-badge
>
- <gl-icon :name="statusIcon" class="gl-display-block d-sm-none gl-h-6!" />
- <span class="gl-display-none d-sm-block">{{ statusText }}</span>
- </p>
<span v-if="isLocked" data-testid="locked" class="issuable-warning-icon">
<gl-icon name="lock" :aria-label="__('Locked')" />
</span>
- <span v-if="isConfidential" data-testid="confidential" class="issuable-warning-icon">
- <gl-icon name="eye-slash" :aria-label="__('Confidential')" />
- </span>
+ <confidentiality-badge
+ v-if="isConfidential"
+ data-testid="confidential"
+ :workspace-type="$options.WorkspaceType.project"
+ :issuable-type="issuableType"
+ />
<span
v-if="isHidden"
v-gl-tooltip
@@ -559,6 +583,8 @@ export default {
:issuable-type="issuableType"
:update-url="updateEndpoint"
:lock-version="state.lock_version"
+ :is-updating="formState.updateLoading"
+ @listItemReorder="handleListItemReorder"
@taskListUpdateStarted="taskListUpdateStarted"
@taskListUpdateSucceeded="taskListUpdateSucceeded"
@taskListUpdateFailed="taskListUpdateFailed"
diff --git a/app/assets/javascripts/issues/show/components/description.vue b/app/assets/javascripts/issues/show/components/description.vue
index 0b7e128c47b..4f97458dcd1 100644
--- a/app/assets/javascripts/issues/show/components/description.vue
+++ b/app/assets/javascripts/issues/show/components/description.vue
@@ -7,22 +7,31 @@ import {
GlModalDirective,
} from '@gitlab/ui';
import $ from 'jquery';
+import Sortable from 'sortablejs';
import Vue from 'vue';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
import { TYPE_WORK_ITEM } from '~/graphql_shared/constants';
import createFlash from '~/flash';
import { isPositiveInteger } from '~/lib/utils/number_utils';
import { getParameterByName, setUrlParams, updateHistory } from '~/lib/utils/url_utility';
import { __, s__, sprintf } from '~/locale';
+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 glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
import animateMixin from '../mixins/animate';
+import { convertDescriptionWithNewSort } from '../utils';
Vue.use(GlToast);
+const workItemTypes = {
+ TASK: 'task',
+};
+
export default {
directives: {
SafeHtml,
@@ -74,6 +83,11 @@ export default {
required: false,
default: null,
},
+ isUpdating: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
const workItemId = getParameterByName('work_item_id');
@@ -89,10 +103,20 @@ export default {
: undefined,
};
},
- computed: {
- showWorkItemDetailModal() {
- return Boolean(this.workItemId);
+ apollo: {
+ workItem: {
+ query: workItemQuery,
+ variables() {
+ return {
+ id: this.workItemId,
+ };
+ },
+ skip() {
+ return !this.workItemId || !this.workItemsEnabled;
+ },
},
+ },
+ computed: {
workItemsEnabled() {
return this.glFeatures.workItems;
},
@@ -126,6 +150,16 @@ export default {
if (this.workItemsEnabled) {
this.renderTaskActions();
}
+
+ if (this.workItemId) {
+ const taskLink = this.$el.querySelector(
+ `.gfm-issue[data-issue="${getIdFromGraphQLId(this.workItemId)}"]`,
+ );
+ this.openWorkItemDetailModal(taskLink);
+ }
+ },
+ beforeDestroy() {
+ this.removeAllPointerEventListeners();
},
methods: {
renderGFM() {
@@ -142,9 +176,67 @@ export default {
onSuccess: this.taskListUpdateSuccess.bind(this),
onError: this.taskListUpdateError.bind(this),
});
+
+ this.renderSortableLists();
}
},
+ renderSortableLists() {
+ this.removeAllPointerEventListeners();
+
+ const lists = document.querySelectorAll('.description ul, .description ol');
+ lists.forEach((list) => {
+ Array.from(list.children).forEach((listItem) => {
+ listItem.prepend(this.createDragIconElement());
+ this.addPointerEventListeners(listItem);
+ });
+ Sortable.create(
+ list,
+ getSortableDefaultOptions({
+ handle: '.drag-icon',
+ onUpdate: (event) => {
+ const description = convertDescriptionWithNewSort(this.descriptionText, event.to);
+ this.$emit('listItemReorder', description);
+ },
+ }),
+ );
+ });
+ },
+ createDragIconElement() {
+ const container = document.createElement('div');
+ container.innerHTML = `<svg class="drag-icon s14 gl-icon gl-cursor-grab gl-visibility-hidden" role="img" aria-hidden="true">
+ <use href="${gon.sprite_icons}#drag-vertical"></use>
+ </svg>`;
+ return container.firstChild;
+ },
+ addPointerEventListeners(listItem) {
+ const pointeroverListener = (event) => {
+ if (isDragging() || this.isUpdating) {
+ return;
+ }
+ event.target.closest('li').querySelector('.drag-icon').style.visibility = 'visible'; // eslint-disable-line no-param-reassign
+ };
+ const pointeroutListener = (event) => {
+ event.target.closest('li').querySelector('.drag-icon').style.visibility = 'hidden'; // eslint-disable-line no-param-reassign
+ };
+
+ // We use pointerover/pointerout instead of CSS so that when we hover over a
+ // list item with children, the drag icons of its children do not become visible.
+ listItem.addEventListener('pointerover', pointeroverListener);
+ listItem.addEventListener('pointerout', pointeroutListener);
+
+ this.pointerEventListeners = this.pointerEventListeners || new Map();
+ this.pointerEventListeners.set(listItem, [
+ { type: 'pointerover', listener: pointeroverListener },
+ { type: 'pointerout', listener: pointeroutListener },
+ ]);
+ },
+ removeAllPointerEventListeners() {
+ this.pointerEventListeners?.forEach((events, listItem) => {
+ events.forEach((event) => listItem.removeEventListener(event.type, event.listener));
+ this.pointerEventListeners.delete(listItem);
+ });
+ },
taskListUpdateStarted() {
this.$emit('taskListUpdateStarted');
},
@@ -195,10 +287,16 @@ export default {
taskListFields.forEach((item, index) => {
const taskLink = item.querySelector('.gfm-issue');
if (taskLink) {
- const { issue, referenceType } = taskLink.dataset;
+ const { issue, referenceType, issueType } = taskLink.dataset;
+ if (issueType !== workItemTypes.TASK) {
+ return;
+ }
+ const workItemId = convertToGraphQLId(TYPE_WORK_ITEM, issue);
+ this.addHoverListeners(taskLink, workItemId);
taskLink.addEventListener('click', (e) => {
e.preventDefault();
- this.workItemId = convertToGraphQLId(TYPE_WORK_ITEM, issue);
+ this.openWorkItemDetailModal(taskLink);
+ this.workItemId = workItemId;
this.updateWorkItemIdUrlQuery(issue);
this.track('viewed_work_item_from_modal', {
category: 'workItems:show',
@@ -215,10 +313,9 @@ export default {
'btn-md',
'gl-button',
'btn-default-tertiary',
- 'gl-left-0',
'gl-p-0!',
- 'gl-top-2',
- 'gl-absolute',
+ 'gl-mt-n1',
+ 'gl-ml-3',
'js-add-task',
);
button.id = `js-task-button-${index}`;
@@ -229,24 +326,46 @@ export default {
</svg>
`;
button.setAttribute('aria-label', s__('WorkItem|Convert to work item'));
- button.addEventListener('click', () => this.openCreateTaskModal(button.id));
- item.prepend(button);
+ button.addEventListener('click', () => this.openCreateTaskModal(button));
+ item.append(button);
});
},
- openCreateTaskModal(id) {
- const { parentElement } = this.$el.querySelector(`#${id}`);
+ addHoverListeners(taskLink, id) {
+ let workItemPrefetch;
+ taskLink.addEventListener('mouseover', () => {
+ workItemPrefetch = setTimeout(() => {
+ this.workItemId = id;
+ }, 150);
+ });
+ taskLink.addEventListener('mouseout', () => {
+ if (workItemPrefetch) {
+ clearTimeout(workItemPrefetch);
+ }
+ });
+ },
+ setActiveTask(el) {
+ const { parentElement } = el;
const lineNumbers = parentElement.getAttribute('data-sourcepos').match(/\b\d+(?=:)/g);
this.activeTask = {
- id,
title: parentElement.innerText,
lineNumberStart: lineNumbers[0],
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();
+ },
closeWorkItemDetailModal() {
this.workItemId = undefined;
this.updateWorkItemIdUrlQuery(undefined);
@@ -255,7 +374,8 @@ export default {
this.$emit('updateDescription', description);
this.closeCreateTaskModal();
},
- handleDeleteTask() {
+ handleDeleteTask(description) {
+ this.$emit('updateDescription', description);
this.$toast.show(s__('WorkItem|Work item deleted'));
},
updateWorkItemIdUrlQuery(workItemId) {
@@ -318,9 +438,13 @@ export default {
/>
</gl-modal>
<work-item-detail-modal
+ ref="detailsModal"
:can-update="canUpdate"
- :visible="showWorkItemDetailModal"
:work-item-id="workItemId"
+ :issue-gid="issueGid"
+ :lock-version="lockVersion"
+ :line-number-start="activeTask.lineNumberStart"
+ :line-number-end="activeTask.lineNumberEnd"
@workItemDeleted="handleDeleteTask"
@close="closeWorkItemDetailModal"
/>
diff --git a/app/assets/javascripts/issues/show/index.js b/app/assets/javascripts/issues/show/index.js
index 4a5ebf9615b..6b0b26ef2e3 100644
--- a/app/assets/javascripts/issues/show/index.js
+++ b/app/assets/javascripts/issues/show/index.js
@@ -38,6 +38,7 @@ export function initIncidentApp(issueData = {}) {
projectId,
slaFeatureAvailable,
uploadMetricsFeatureAvailable,
+ state,
} = issueData;
const fullPath = `${projectNamespace}/${projectPath}`;
@@ -60,6 +61,7 @@ export function initIncidentApp(issueData = {}) {
return createElement(IssueApp, {
props: {
...issueData,
+ issuableStatus: state,
descriptionComponent: IncidentTabs,
showTitleBorder: false,
},
diff --git a/app/assets/javascripts/issues/show/utils.js b/app/assets/javascripts/issues/show/utils.js
new file mode 100644
index 00000000000..60e66f59f92
--- /dev/null
+++ b/app/assets/javascripts/issues/show/utils.js
@@ -0,0 +1,99 @@
+import { COLON, HYPHEN, NEWLINE } from '~/lib/utils/text_utility';
+
+/**
+ * Get the index from sourcepos that represents the line of
+ * the description when the description is split by newline.
+ *
+ * @param {String} sourcepos Source position in format `23:3-23:14`
+ * @returns {Number} Index of description split by newline
+ */
+const getDescriptionIndex = (sourcepos) => {
+ const [startRange] = sourcepos.split(HYPHEN);
+ const [startRow] = startRange.split(COLON);
+ return startRow - 1;
+};
+
+/**
+ * Given a `ul` or `ol` element containing a new sort order, this function performs
+ * a depth-first search to get the new sort order in the form of sourcepos indices.
+ *
+ * @param {HTMLElement} list A `ul` or `ol` element containing a new sort order
+ * @returns {Array<Number>} An array representing the new order of the list
+ */
+const getNewSourcePositions = (list) => {
+ const newSourcePositions = [];
+
+ function pushPositionOfChildListItems(el) {
+ if (!el) {
+ return;
+ }
+ if (el.tagName === 'LI') {
+ newSourcePositions.push(getDescriptionIndex(el.dataset.sourcepos));
+ }
+ Array.from(el.children).forEach(pushPositionOfChildListItems);
+ }
+
+ pushPositionOfChildListItems(list);
+
+ return newSourcePositions;
+};
+
+/**
+ * Converts a description to one with a new list sort order.
+ *
+ * Given a description like:
+ *
+ * <pre>
+ * 1. I am text
+ * 2.
+ * 3. - Item 1
+ * 4. - Item 2
+ * 5. - Item 3
+ * 6. - Item 4
+ * 7. - Item 5
+ * </pre>
+ *
+ * And a reordered list (due to dragging Item 2 into Item 1's position) like:
+ *
+ * <pre>
+ * <ul data-sourcepos="3:1-8:0">
+ * <li data-sourcepos="4:1-4:8">
+ * Item 2
+ * <ul data-sourcepos="5:1-6:10">
+ * <li data-sourcepos="5:1-5:10">Item 3</li>
+ * <li data-sourcepos="6:1-6:10">Item 4</li>
+ * </ul>
+ * </li>
+ * <li data-sourcepos="3:1-3:8">Item 1</li>
+ * <li data-sourcepos="7:1-8:0">Item 5</li>
+ * <ul>
+ * </pre>
+ *
+ * This function returns:
+ *
+ * <pre>
+ * 1. I am text
+ * 2.
+ * 3. - Item 2
+ * 4. - Item 3
+ * 5. - Item 4
+ * 6. - Item 1
+ * 7. - Item 5
+ * </pre>
+ *
+ * @param {String} description Description in markdown format
+ * @param {HTMLElement} list A `ul` or `ol` element containing a new sort order
+ * @returns {String} Markdown with a new list sort order
+ */
+export const convertDescriptionWithNewSort = (description, list) => {
+ const descriptionLines = description.split(NEWLINE);
+ const startIndexOfList = getDescriptionIndex(list.dataset.sourcepos);
+
+ getNewSourcePositions(list)
+ .map((lineIndex) => descriptionLines[lineIndex])
+ .forEach((line, index) => {
+ descriptionLines[startIndexOfList + index] = line;
+ });
+
+ return descriptionLines.join(NEWLINE);
+};
diff --git a/app/assets/javascripts/jira_connect/subscriptions/api.js b/app/assets/javascripts/jira_connect/subscriptions/api.js
index 14947b6c835..de67703356f 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/api.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/api.js
@@ -29,3 +29,13 @@ export const fetchGroups = async (groupsPath, { page, perPage, search }) => {
},
});
};
+
+export const fetchSubscriptions = async (subscriptionsPath) => {
+ const jwt = await getJwt();
+
+ return axios.get(subscriptionsPath, {
+ params: {
+ jwt,
+ },
+ });
+};
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
index 1fc40e5c0d6..fa1c2e1912c 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue
@@ -1,17 +1,27 @@
<script>
+import { mapActions } from 'vuex';
import { GlButton } from '@gitlab/ui';
-import { helpPagePath } from '~/helpers/help_page_helper';
import { addSubscription } from '~/jira_connect/subscriptions/api';
import { persistAlert, reloadPage } from '~/jira_connect/subscriptions/utils';
-import { s__ } from '~/locale';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import GroupItemName from '../group_item_name.vue';
+import {
+ INTEGRATIONS_DOC_LINK,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ I18N_ADD_SUBSCRIPTIONS_ERROR_MESSAGE,
+} from '../../constants';
export default {
components: {
GlButton,
GroupItemName,
},
+ mixins: [glFeatureFlagMixin()],
inject: {
+ addSubscriptionsPath: {
+ default: '',
+ },
subscriptionsPath: {
default: '',
},
@@ -32,31 +42,41 @@ export default {
isLoading: false,
};
},
+ computed: {
+ oauthEnabled() {
+ return this.glFeatures.jiraConnectOauth;
+ },
+ },
methods: {
- onClick() {
+ ...mapActions(['addSubscription']),
+ async onClick() {
+ if (this.oauthEnabled) {
+ this.isLoading = true;
+ await this.addSubscription({
+ namespacePath: this.group.full_path,
+ subscriptionsPath: this.subscriptionsPath,
+ });
+ this.isLoading = false;
+ } else {
+ this.deprecatedAddSubscription();
+ }
+ },
+ deprecatedAddSubscription() {
this.isLoading = true;
- addSubscription(this.subscriptionsPath, this.group.full_path)
+ addSubscription(this.addSubscriptionsPath, this.group.full_path)
.then(() => {
persistAlert({
- title: s__('Integrations|Namespace successfully linked'),
- message: s__(
- 'Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
- ),
- linkUrl: helpPagePath('integration/jira_development_panel.html', {
- anchor: 'use-the-integration',
- }),
+ title: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ message: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ linkUrl: INTEGRATIONS_DOC_LINK,
variant: 'success',
});
reloadPage();
})
.catch((error) => {
- this.$emit(
- 'error',
- error?.response?.data?.error ||
- s__('Integrations|Failed to link namespace. Please try again.'),
- );
+ this.$emit('error', error?.response?.data?.error || I18N_ADD_SUBSCRIPTIONS_ERROR_MESSAGE);
this.isLoading = false;
});
},
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
index 51db3e784aa..22422872183 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/app.vue
@@ -1,14 +1,14 @@
<script>
import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
import { isEmpty } from 'lodash';
-import { mapState, mapMutations } from 'vuex';
+import { mapState, mapMutations, mapActions } from 'vuex';
import { retrieveAlert } from '~/jira_connect/subscriptions/utils';
import AccessorUtilities from '~/lib/utils/accessor';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '../constants';
import { SET_ALERT } from '../store/mutation_types';
-import SignInPage from '../pages/sign_in.vue';
-import SubscriptionsPage from '../pages/subscriptions.vue';
+import SignInPage from '../pages/sign_in/sign_in_page.vue';
+import SubscriptionsPage from '../pages/subscriptions_page.vue';
import UserLink from './user_link.vue';
import CompatibilityAlert from './compatibility_alert.vue';
import BrowserSupportAlert from './browser_support_alert.vue';
@@ -30,17 +30,13 @@ export default {
usersPath: {
default: '',
},
- subscriptions: {
- default: [],
+ subscriptionsPath: {
+ default: '',
},
},
- data() {
- return {
- user: null,
- };
- },
computed: {
- ...mapState(['alert']),
+ ...mapState(['currentUser']),
+ ...mapState(['alert', 'subscriptions']),
shouldShowAlert() {
return Boolean(this.alert?.message);
},
@@ -48,7 +44,11 @@ export default {
return !isEmpty(this.subscriptions);
},
userSignedIn() {
- return Boolean(!this.usersPath || this.user);
+ if (this.isOauthEnabled) {
+ return Boolean(this.currentUser);
+ }
+
+ return Boolean(!this.usersPath);
},
isOauthEnabled() {
return this.glFeatures.jiraConnectOauth;
@@ -64,16 +64,29 @@ export default {
created() {
this.setInitialAlert();
},
+ mounted() {
+ this.fetchSubscriptionsOauth();
+ },
methods: {
...mapMutations({
setAlert: SET_ALERT,
}),
+ ...mapActions(['fetchSubscriptions']),
+ /**
+ * Fetch subscriptions from the REST API,
+ * if the jiraConnectOauth flag is enabled.
+ */
+ fetchSubscriptionsOauth() {
+ if (!this.isOauthEnabled) return;
+
+ this.fetchSubscriptions(this.subscriptionsPath);
+ },
setInitialAlert() {
const { linkUrl, title, message, variant } = retrieveAlert() || {};
this.setAlert({ linkUrl, title, message, variant });
},
- onSignInOauth(user) {
- this.user = user;
+ onSignInOauth() {
+ this.fetchSubscriptionsOauth();
},
onSignInError() {
this.setAlert({
@@ -109,9 +122,12 @@ export default {
</template>
</gl-alert>
- <user-link :user-signed-in="userSignedIn" :has-subscriptions="hasSubscriptions" :user="user" />
+ <user-link
+ :user-signed-in="userSignedIn"
+ :has-subscriptions="hasSubscriptions"
+ :user="currentUser"
+ />
- <h2 class="gl-text-center gl-mb-7">{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
<div class="gl-layout-w-limited gl-mx-auto gl-px-5 gl-mb-7">
<sign-in-page
v-if="!userSignedIn"
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue b/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
index dfed57df7d6..b9e8bab019f 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/sign_in_oauth_button.vue
@@ -1,4 +1,5 @@
<script>
+import { mapActions, mapMutations } from 'vuex';
import { GlButton } from '@gitlab/ui';
import axios from '~/lib/utils/axios_utils';
import {
@@ -8,8 +9,8 @@ import {
} from '~/jira_connect/subscriptions/constants';
import { setUrlParams } from '~/lib/utils/url_utility';
import AccessorUtilities from '~/lib/utils/accessor';
-
import { createCodeVerifier, createCodeChallenge } from '../pkce';
+import { SET_ACCESS_TOKEN } from '../store/mutation_types';
export default {
components: {
@@ -31,6 +32,10 @@ export default {
window.removeEventListener('message', this.handleWindowMessage);
},
methods: {
+ ...mapActions(['loadCurrentUser']),
+ ...mapMutations({
+ setAccessToken: SET_ACCESS_TOKEN,
+ }),
async startOAuthFlow() {
this.loading = true;
@@ -40,6 +45,7 @@ export default {
// Build the initial OAuth authorization URL
const { oauth_authorize_url: oauthAuthorizeURL } = this.oauthMetadata;
+
const oauthAuthorizeURLWithChallenge = setUrlParams(
{
code_challenge: codeChallenge,
@@ -57,7 +63,6 @@ export default {
async handleWindowMessage(event) {
if (window.origin !== event.origin) {
this.loading = false;
- this.handleError();
return;
}
@@ -73,7 +78,10 @@ export default {
const code = event.data?.code;
try {
const accessToken = await this.getOAuthToken(code);
- await this.loadUser(accessToken);
+ await this.loadCurrentUser(accessToken);
+
+ this.setAccessToken(accessToken);
+ this.$emit('sign-in');
} catch (e) {
this.handleError();
} finally {
@@ -96,13 +104,6 @@ export default {
return data.access_token;
},
- async loadUser(accessToken) {
- const { data } = await axios.get('/api/v4/user', {
- headers: { Authorization: `Bearer ${accessToken}` },
- });
-
- this.$emit('sign-in', data);
- },
},
i18n: {
defaultButtonText: I18N_DEFAULT_SIGN_IN_BUTTON_TEXT,
diff --git a/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue b/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
index 0251728c896..4c039be9ba5 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/components/subscriptions_list.vue
@@ -1,7 +1,7 @@
<script>
import { GlButton, GlTableLite } from '@gitlab/ui';
import { isEmpty } from 'lodash';
-import { mapMutations } from 'vuex';
+import { mapMutations, mapState } from 'vuex';
import { removeSubscription } from '~/jira_connect/subscriptions/api';
import { reloadPage } from '~/jira_connect/subscriptions/utils';
import { __, s__ } from '~/locale';
@@ -16,11 +16,6 @@ export default {
GroupItemName,
TimeagoTooltip,
},
- inject: {
- subscriptions: {
- default: [],
- },
- },
data() {
return {
loadingItem: null,
@@ -45,6 +40,9 @@ export default {
i18n: {
unlinkError: s__('Integrations|Failed to unlink namespace. Please try again.'),
},
+ computed: {
+ ...mapState(['subscriptions']),
+ },
methods: {
...mapMutations({
setAlert: SET_ALERT,
diff --git a/app/assets/javascripts/jira_connect/subscriptions/constants.js b/app/assets/javascripts/jira_connect/subscriptions/constants.js
index d30ebdbb487..8faafb1b0d0 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/constants.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/constants.js
@@ -1,4 +1,5 @@
import { s__ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
export const DEFAULT_GROUPS_PER_PAGE = 10;
export const ALERT_LOCALSTORAGE_KEY = 'gitlab_alert';
@@ -8,6 +9,22 @@ export const ADD_NAMESPACE_MODAL_ID = 'add-namespace-modal';
export const I18N_DEFAULT_SIGN_IN_BUTTON_TEXT = s__('Integrations|Sign in to GitLab');
export const I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE = s__('Integrations|Failed to sign in to GitLab.');
+export const I18N_DEFAULT_SUBSCRIPTIONS_ERROR_MESSAGE = s__(
+ 'Integrations|Failed to load subscriptions.',
+);
+export const I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE = s__(
+ 'Integrations|Namespace successfully linked',
+);
+export const I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE = s__(
+ 'Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
+);
+export const INTEGRATIONS_DOC_LINK = helpPagePath('integration/jira_development_panel', {
+ anchor: 'use-the-integration',
+});
+
+export const I18N_ADD_SUBSCRIPTIONS_ERROR_MESSAGE = s__(
+ 'Integrations|Failed to link namespace. Please try again.',
+);
const OAUTH_WINDOW_SIZE = 800;
export const OAUTH_WINDOW_OPTIONS = [
diff --git a/app/assets/javascripts/jira_connect/subscriptions/index.js b/app/assets/javascripts/jira_connect/subscriptions/index.js
index 3b584b5fe98..8e9f73538b9 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/index.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/index.js
@@ -9,8 +9,6 @@ import JiraConnectApp from './components/app.vue';
import createStore from './store';
import { sizeToParent } from './utils';
-const store = createStore();
-
export function initJiraConnect() {
const el = document.querySelector('.js-jira-connect-app');
if (!el) {
@@ -24,6 +22,7 @@ export function initJiraConnect() {
const {
groupsPath,
subscriptions,
+ addSubscriptionsPath,
subscriptionsPath,
usersPath,
gitlabUserPath,
@@ -31,12 +30,14 @@ export function initJiraConnect() {
} = el.dataset;
sizeToParent();
+ const store = createStore({ subscriptions: JSON.parse(subscriptions) });
+
return new Vue({
el,
store,
provide: {
groupsPath,
- subscriptions: JSON.parse(subscriptions),
+ addSubscriptionsPath,
subscriptionsPath,
usersPath,
gitlabUserPath,
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in.vue
deleted file mode 100644
index a24ee33b723..00000000000
--- a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<script>
-import { s__ } from '~/locale';
-
-import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import SubscriptionsList from '../components/subscriptions_list.vue';
-
-export default {
- name: 'SignInPage',
- components: {
- SubscriptionsList,
- SignInLegacyButton: () => import('../components/sign_in_legacy_button.vue'),
- SignInOauthButton: () => import('../components/sign_in_oauth_button.vue'),
- },
- mixins: [glFeatureFlagMixin()],
- inject: ['usersPath'],
- props: {
- hasSubscriptions: {
- type: Boolean,
- required: true,
- },
- },
- computed: {
- useSignInOauthButton() {
- return this.glFeatures.jiraConnectOauth;
- },
- },
- i18n: {
- signInButtonTextWithSubscriptions: s__('Integrations|Sign in to add namespaces'),
- signInText: s__('JiraService|Sign in to GitLab.com to get started.'),
- },
- methods: {
- onSignInError() {
- this.$emit('error');
- },
- },
-};
-</script>
-
-<template>
- <div v-if="hasSubscriptions">
- <div class="gl-display-flex gl-justify-content-end">
- <sign-in-oauth-button
- v-if="useSignInOauthButton"
- @sign-in="$emit('sign-in-oauth', $event)"
- @error="onSignInError"
- >
- {{ $options.i18n.signInButtonTextWithSubscriptions }}
- </sign-in-oauth-button>
- <sign-in-legacy-button v-else :users-path="usersPath">
- {{ $options.i18n.signInButtonTextWithSubscriptions }}
- </sign-in-legacy-button>
- </div>
-
- <subscriptions-list />
- </div>
- <div v-else class="gl-text-center">
- <p class="gl-mb-7">{{ $options.i18n.signInText }}</p>
- <sign-in-oauth-button
- v-if="useSignInOauthButton"
- @sign-in="$emit('sign-in-oauth', $event)"
- @error="onSignInError"
- />
- <sign-in-legacy-button v-else class="gl-mb-7" :users-path="usersPath" />
- </div>
-</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue
new file mode 100644
index 00000000000..91b66c87694
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue
@@ -0,0 +1,68 @@
+<script>
+import { s__ } from '~/locale';
+
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import SubscriptionsList from '../../components/subscriptions_list.vue';
+
+export default {
+ name: 'SignInGitlabCom',
+ components: {
+ SubscriptionsList,
+ SignInLegacyButton: () => import('../../components/sign_in_legacy_button.vue'),
+ SignInOauthButton: () => import('../../components/sign_in_oauth_button.vue'),
+ },
+ mixins: [glFeatureFlagMixin()],
+ inject: ['usersPath'],
+ props: {
+ hasSubscriptions: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ useSignInOauthButton() {
+ return this.glFeatures.jiraConnectOauth;
+ },
+ },
+ i18n: {
+ signInButtonTextWithSubscriptions: s__('Integrations|Sign in to add namespaces'),
+ signInText: s__('JiraService|Sign in to GitLab.com to get started.'),
+ },
+ methods: {
+ onSignInError() {
+ this.$emit('error');
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h2 class="gl-text-center gl-mb-7">{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
+ <div v-if="hasSubscriptions">
+ <div class="gl-display-flex gl-justify-content-end gl-mb-3">
+ <sign-in-oauth-button
+ v-if="useSignInOauthButton"
+ @sign-in="$emit('sign-in-oauth', $event)"
+ @error="onSignInError"
+ >
+ {{ $options.i18n.signInButtonTextWithSubscriptions }}
+ </sign-in-oauth-button>
+ <sign-in-legacy-button v-else :users-path="usersPath">
+ {{ $options.i18n.signInButtonTextWithSubscriptions }}
+ </sign-in-legacy-button>
+ </div>
+
+ <subscriptions-list />
+ </div>
+ <div v-else class="gl-text-center">
+ <p class="gl-mb-7">{{ $options.i18n.signInText }}</p>
+ <sign-in-oauth-button
+ v-if="useSignInOauthButton"
+ @sign-in="$emit('sign-in-oauth', $event)"
+ @error="onSignInError"
+ />
+ <sign-in-legacy-button v-else class="gl-mb-7" :users-path="usersPath" />
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue
new file mode 100644
index 00000000000..4f5aa4c255c
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue
@@ -0,0 +1,72 @@
+<script>
+import { GlButton } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import SignInOauthButton from '../../../components/sign_in_oauth_button.vue';
+import VersionSelectForm from './version_select_form.vue';
+
+export default {
+ name: 'SignInGitlabMultiversion',
+ components: {
+ GlButton,
+ SignInOauthButton,
+ VersionSelectForm,
+ },
+ data() {
+ return {
+ gitlabBasePath: null,
+ };
+ },
+ computed: {
+ hasSelectedVersion() {
+ return this.gitlabBasePath !== null;
+ },
+ subtitle() {
+ return this.hasSelectedVersion
+ ? this.$options.i18n.signInSubtitle
+ : this.$options.i18n.versionSelectSubtitle;
+ },
+ },
+ methods: {
+ resetGitlabBasePath() {
+ this.gitlabBasePath = null;
+ },
+ onVersionSelect(gitlabBasePath) {
+ this.gitlabBasePath = gitlabBasePath;
+ },
+ onSignInError() {
+ this.$emit('error');
+ },
+ },
+ i18n: {
+ title: s__('JiraService|Welcome to GitLab for Jira'),
+ signInSubtitle: s__('JiraService|Sign in to GitLab to link namespaces.'),
+ versionSelectSubtitle: s__('JiraService|What version of GitLab are you using?'),
+ changeVersionButtonText: s__('JiraService|Change GitLab version'),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div class="gl-text-center">
+ <h2>{{ $options.i18n.title }}</h2>
+ <p data-testid="subtitle">{{ subtitle }}</p>
+ </div>
+
+ <version-select-form v-if="!hasSelectedVersion" class="gl-mt-7" @submit="onVersionSelect" />
+
+ <div v-else class="gl-text-center">
+ <sign-in-oauth-button
+ class="gl-mb-5"
+ @sign-in="$emit('sign-in-oauth', $event)"
+ @error="onSignInError"
+ />
+
+ <div>
+ <gl-button category="tertiary" variant="confirm" @click="resetGitlabBasePath">
+ {{ $options.i18n.changeVersionButtonText }}
+ </gl-button>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue
new file mode 100644
index 00000000000..0fa745ed7e3
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue
@@ -0,0 +1,88 @@
+<script>
+import {
+ GlForm,
+ GlFormGroup,
+ GlFormRadioGroup,
+ GlFormInput,
+ GlFormRadio,
+ GlButton,
+} from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+
+const RADIO_OPTIONS = {
+ saas: 'saas',
+ selfManaged: 'selfManaged',
+};
+
+const DEFAULT_RADIO_OPTION = RADIO_OPTIONS.saas;
+const GITLAB_COM_BASE_PATH = 'https://gitlab.com';
+
+export default {
+ name: 'VersionSelectForm',
+ components: {
+ GlForm,
+ GlFormGroup,
+ GlFormRadioGroup,
+ GlFormInput,
+ GlFormRadio,
+ GlButton,
+ },
+ data() {
+ return {
+ selected: DEFAULT_RADIO_OPTION,
+ selfManagedBasePathInput: '',
+ };
+ },
+ computed: {
+ isSelfManagedSelected() {
+ return this.selected === RADIO_OPTIONS.selfManaged;
+ },
+ },
+ methods: {
+ onSubmit() {
+ const gitlabBasePath =
+ this.selected === RADIO_OPTIONS.saas ? GITLAB_COM_BASE_PATH : this.selfManagedBasePathInput;
+ this.$emit('submit', gitlabBasePath);
+ },
+ },
+ radioOptions: RADIO_OPTIONS,
+ i18n: {
+ title: s__('JiraService|Welcome to GitLab for Jira'),
+ saasRadioLabel: __('GitLab.com (SaaS)'),
+ saasRadioHelp: __('Most common'),
+ selfManagedRadioLabel: __('GitLab (self-managed)'),
+ instanceURLInputLabel: s__('JiraService|GitLab instance URL'),
+ instanceURLInputDescription: s__('JiraService|For example: https://gitlab.example.com'),
+ },
+};
+</script>
+
+<template>
+ <gl-form class="gl-max-w-62 gl-mx-auto" @submit.prevent="onSubmit">
+ <gl-form-radio-group v-model="selected" class="gl-mb-3" name="gitlab_version">
+ <gl-form-radio :value="$options.radioOptions.saas">
+ {{ $options.i18n.saasRadioLabel }}
+ <template #help>
+ {{ $options.i18n.saasRadioHelp }}
+ </template>
+ </gl-form-radio>
+ <gl-form-radio :value="$options.radioOptions.selfManaged">
+ {{ $options.i18n.selfManagedRadioLabel }}
+ </gl-form-radio>
+ </gl-form-radio-group>
+
+ <gl-form-group
+ v-if="isSelfManagedSelected"
+ class="gl-ml-6"
+ :label="$options.i18n.instanceURLInputLabel"
+ :description="$options.i18n.instanceURLInputDescription"
+ label-for="self-managed-instance-input"
+ >
+ <gl-form-input id="self-managed-instance-input" v-model="selfManagedBasePathInput" required />
+ </gl-form-group>
+
+ <div class="gl-display-flex gl-justify-content-end">
+ <gl-button variant="confirm" type="submit">{{ __('Save') }}</gl-button>
+ </div>
+ </gl-form>
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue
new file mode 100644
index 00000000000..f4c59b2184e
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue
@@ -0,0 +1,35 @@
+<script>
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import SignInGitlabCom from './sign_in_gitlab_com.vue';
+import SignInGitlabMultiversion from './sign_in_gitlab_multiversion/index.vue';
+
+export default {
+ name: 'SignInPage',
+ components: { SignInGitlabCom, SignInGitlabMultiversion },
+ mixins: [glFeatureFlagMixin()],
+ props: {
+ hasSubscriptions: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ isOauthSelfManagedEnabled() {
+ return this.glFeatures.jiraConnectOauth && this.glFeatures.jiraConnectOauthSelfManaged;
+ },
+ },
+};
+</script>
+<template>
+ <sign-in-gitlab-multiversion
+ v-if="isOauthSelfManagedEnabled"
+ @sign-in-oauth="$emit('sign-in-oauth', $event)"
+ @error="$emit('error', $event)"
+ />
+ <sign-in-gitlab-com
+ v-else
+ :has-subscriptions="hasSubscriptions"
+ @sign-in-oauth="$emit('sign-in-oauth')"
+ @error="$emit('error', $event)"
+ />
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions.vue
deleted file mode 100644
index 426f2999370..00000000000
--- a/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-<script>
-import { GlEmptyState } from '@gitlab/ui';
-import SubscriptionsList from '../components/subscriptions_list.vue';
-import AddNamespaceButton from '../components/add_namespace_button.vue';
-
-export default {
- name: 'SubscriptionsPage',
- components: {
- GlEmptyState,
- SubscriptionsList,
- AddNamespaceButton,
- },
- props: {
- hasSubscriptions: {
- type: Boolean,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <div v-if="hasSubscriptions">
- <div class="gl-display-flex gl-justify-content-end">
- <add-namespace-button />
- </div>
-
- <subscriptions-list />
- </div>
- <gl-empty-state
- v-else
- :title="s__('Integrations|No linked namespaces')"
- :description="
- s__(
- 'Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance.',
- )
- "
- >
- <template #actions>
- <add-namespace-button />
- </template>
- </gl-empty-state>
-</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions_page.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions_page.vue
new file mode 100644
index 00000000000..b1c1ae73e14
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/subscriptions_page.vue
@@ -0,0 +1,54 @@
+<script>
+import { mapState } from 'vuex';
+import { GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
+
+import SubscriptionsList from '../components/subscriptions_list.vue';
+import AddNamespaceButton from '../components/add_namespace_button.vue';
+
+export default {
+ name: 'SubscriptionsPage',
+ components: {
+ GlEmptyState,
+ GlLoadingIcon,
+ SubscriptionsList,
+ AddNamespaceButton,
+ },
+ props: {
+ hasSubscriptions: {
+ type: Boolean,
+ required: true,
+ },
+ },
+ computed: {
+ ...mapState(['subscriptionsLoading', 'subscriptionsError']),
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h2 class="gl-text-center gl-mb-7">{{ s__('JiraService|GitLab for Jira Configuration') }}</h2>
+
+ <gl-loading-icon v-if="subscriptionsLoading" size="md" />
+ <div v-else-if="hasSubscriptions && !subscriptionsError">
+ <div class="gl-display-flex gl-justify-content-end gl-mb-3">
+ <add-namespace-button />
+ </div>
+
+ <subscriptions-list />
+ </div>
+ <gl-empty-state
+ v-else
+ :title="s__('Integrations|No linked namespaces')"
+ :description="
+ s__(
+ 'Integrations|Namespaces are the GitLab groups and subgroups you link to this Jira instance.',
+ )
+ "
+ >
+ <template #actions>
+ <add-namespace-button />
+ </template>
+ </gl-empty-state>
+ </div>
+</template>
diff --git a/app/assets/javascripts/jira_connect/subscriptions/store/actions.js b/app/assets/javascripts/jira_connect/subscriptions/store/actions.js
new file mode 100644
index 00000000000..4a83ee8671d
--- /dev/null
+++ b/app/assets/javascripts/jira_connect/subscriptions/store/actions.js
@@ -0,0 +1,73 @@
+import { fetchSubscriptions as fetchSubscriptionsREST } from '~/jira_connect/subscriptions/api';
+import { getCurrentUser } from '~/rest_api';
+import { addJiraConnectSubscription } from '~/api/integrations_api';
+import {
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ INTEGRATIONS_DOC_LINK,
+ I18N_DEFAULT_SUBSCRIPTIONS_ERROR_MESSAGE,
+} from '../constants';
+import { getJwt } from '../utils';
+import {
+ SET_SUBSCRIPTIONS,
+ SET_SUBSCRIPTIONS_LOADING,
+ SET_SUBSCRIPTIONS_ERROR,
+ ADD_SUBSCRIPTION_LOADING,
+ ADD_SUBSCRIPTION_ERROR,
+ SET_ALERT,
+ SET_CURRENT_USER,
+ SET_CURRENT_USER_ERROR,
+} from './mutation_types';
+
+export const fetchSubscriptions = async ({ commit }, subscriptionsPath) => {
+ commit(SET_SUBSCRIPTIONS_LOADING, true);
+
+ try {
+ const data = await fetchSubscriptionsREST(subscriptionsPath);
+ commit(SET_SUBSCRIPTIONS, data.data.subscriptions);
+ } catch {
+ commit(SET_SUBSCRIPTIONS_ERROR, true);
+ commit(SET_ALERT, { message: I18N_DEFAULT_SUBSCRIPTIONS_ERROR_MESSAGE, variant: 'danger' });
+ } finally {
+ commit(SET_SUBSCRIPTIONS_LOADING, false);
+ }
+};
+
+export const loadCurrentUser = async ({ commit }, accessToken) => {
+ try {
+ const { data: user } = await getCurrentUser({
+ headers: { Authorization: `Bearer ${accessToken}` },
+ });
+
+ commit(SET_CURRENT_USER, user);
+ } catch (e) {
+ commit(SET_CURRENT_USER_ERROR, e);
+ }
+};
+
+export const addSubscription = async (
+ { commit, state, dispatch },
+ { namespacePath, subscriptionsPath },
+) => {
+ try {
+ commit(ADD_SUBSCRIPTION_LOADING, true);
+
+ await addJiraConnectSubscription(namespacePath, {
+ jwt: await getJwt(),
+ accessToken: state.accessToken,
+ });
+
+ commit(SET_ALERT, {
+ title: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ message: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ linkUrl: INTEGRATIONS_DOC_LINK,
+ variant: 'success',
+ });
+
+ dispatch('fetchSubscriptions', subscriptionsPath);
+ } catch (e) {
+ commit(ADD_SUBSCRIPTION_ERROR, e);
+ } finally {
+ commit(ADD_SUBSCRIPTION_LOADING, false);
+ }
+};
diff --git a/app/assets/javascripts/jira_connect/subscriptions/store/index.js b/app/assets/javascripts/jira_connect/subscriptions/store/index.js
index de830e3891a..abad1920bcc 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/store/index.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/store/index.js
@@ -1,12 +1,15 @@
import Vue from 'vue';
import Vuex from 'vuex';
+import * as actions from './actions';
import mutations from './mutations';
-import state from './state';
+import createState from './state';
Vue.use(Vuex);
-export default () =>
- new Vuex.Store({
+export default function createStore(initialState) {
+ return new Vuex.Store({
mutations,
- state,
+ actions,
+ state: createState(initialState),
});
+}
diff --git a/app/assets/javascripts/jira_connect/subscriptions/store/mutation_types.js b/app/assets/javascripts/jira_connect/subscriptions/store/mutation_types.js
index 15f36b824d9..d4893fbcaf6 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/store/mutation_types.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/store/mutation_types.js
@@ -1 +1,13 @@
export const SET_ALERT = 'SET_ALERT';
+
+export const SET_SUBSCRIPTIONS = 'SET_SUBSCRIPTIONS';
+export const SET_SUBSCRIPTIONS_LOADING = 'SET_SUBSCRIPTIONS_LOADING';
+export const SET_SUBSCRIPTIONS_ERROR = 'SET_SUBSCRIPTIONS_ERROR';
+
+export const ADD_SUBSCRIPTION_LOADING = 'ADD_SUBSCRIPTION_LOADING';
+export const ADD_SUBSCRIPTION_ERROR = 'ADD_SUBSCRIPTION_ERROR';
+
+export const SET_CURRENT_USER = 'SET_CURRENT_USER';
+export const SET_CURRENT_USER_ERROR = 'SET_CURRENT_USER_ERROR';
+
+export const SET_ACCESS_TOKEN = 'SET_ACCESS_TOKEN';
diff --git a/app/assets/javascripts/jira_connect/subscriptions/store/mutations.js b/app/assets/javascripts/jira_connect/subscriptions/store/mutations.js
index 2a25e0fe25f..60076c918fd 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/store/mutations.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/store/mutations.js
@@ -1,7 +1,45 @@
-import { SET_ALERT } from './mutation_types';
+import {
+ SET_ALERT,
+ SET_SUBSCRIPTIONS,
+ SET_SUBSCRIPTIONS_LOADING,
+ SET_SUBSCRIPTIONS_ERROR,
+ ADD_SUBSCRIPTION_LOADING,
+ ADD_SUBSCRIPTION_ERROR,
+ SET_CURRENT_USER,
+ SET_CURRENT_USER_ERROR,
+ SET_ACCESS_TOKEN,
+} from './mutation_types';
export default {
[SET_ALERT](state, { title, message, variant, linkUrl } = {}) {
state.alert = { title, message, variant, linkUrl };
},
+
+ [SET_SUBSCRIPTIONS](state, subscriptions = []) {
+ state.subscriptions = subscriptions;
+ },
+ [SET_SUBSCRIPTIONS_LOADING](state, subscriptionsLoading) {
+ state.subscriptionsLoading = subscriptionsLoading;
+ },
+ [SET_SUBSCRIPTIONS_ERROR](state, subscriptionsError) {
+ state.subscriptionsError = subscriptionsError;
+ },
+
+ [ADD_SUBSCRIPTION_LOADING](state, loading) {
+ state.addSubscriptionLoading = loading;
+ },
+ [ADD_SUBSCRIPTION_ERROR](state, error) {
+ state.addSubscriptionError = error;
+ },
+
+ [SET_CURRENT_USER](state, currentUser) {
+ state.currentUser = currentUser;
+ },
+ [SET_CURRENT_USER_ERROR](state, currentUserError) {
+ state.currentUserError = currentUserError;
+ },
+
+ [SET_ACCESS_TOKEN](state, accessToken) {
+ state.accessToken = accessToken;
+ },
};
diff --git a/app/assets/javascripts/jira_connect/subscriptions/store/state.js b/app/assets/javascripts/jira_connect/subscriptions/store/state.js
index c807df03f00..03a83f18b4c 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/store/state.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/store/state.js
@@ -1,3 +1,17 @@
-export default () => ({
- alert: undefined,
-});
+export default function createState({ subscriptions = [], subscriptionsLoading = false } = {}) {
+ return {
+ alert: undefined,
+
+ subscriptions,
+ subscriptionsLoading,
+ subscriptionsError: false,
+
+ addSubscriptionLoading: false,
+ addSubscriptionError: false,
+
+ currentUser: null,
+ currentUserError: null,
+
+ accessToken: null,
+ };
+}
diff --git a/app/assets/javascripts/jira_import/components/jira_import_form.vue b/app/assets/javascripts/jira_import/components/jira_import_form.vue
index af4a26a7352..8a36a4d2466 100644
--- a/app/assets/javascripts/jira_import/components/jira_import_form.vue
+++ b/app/assets/javascripts/jira_import/components/jira_import_form.vue
@@ -304,7 +304,10 @@ export default {
:text="data.value || $options.currentUsername"
class="w-100"
:aria-label="
- sprintf($options.dropdownLabel, { jiraDisplayName: data.item.jiraDisplayName })
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf($options.dropdownLabel, {
+ jiraDisplayName: data.item.jiraDisplayName,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
"
@hide="resetDropdown"
>
diff --git a/app/assets/javascripts/jobs/components/job_app.vue b/app/assets/javascripts/jobs/components/job_app.vue
index 85fe5ed7e26..396b015ad83 100644
--- a/app/assets/javascripts/jobs/components/job_app.vue
+++ b/app/assets/javascripts/jobs/components/job_app.vue
@@ -94,7 +94,7 @@ export default {
'emptyStateIllustration',
'isScrollingDown',
'emptyStateAction',
- 'hasRunnersForProject',
+ 'hasOfflineRunnersForProject',
]),
shouldRenderContent() {
@@ -220,7 +220,7 @@ export default {
<!-- Body Section -->
<stuck-block
v-if="job.stuck"
- :has-no-runners-for-project="hasRunnersForProject"
+ :has-offline-runners-for-project="hasOfflineRunnersForProject"
:tags="job.tags"
:runners-path="runnerSettingsUrl"
/>
diff --git a/app/assets/javascripts/jobs/components/sidebar.vue b/app/assets/javascripts/jobs/components/sidebar.vue
index 1b4c9ebdf7d..cc099dba72f 100644
--- a/app/assets/javascripts/jobs/components/sidebar.vue
+++ b/app/assets/javascripts/jobs/components/sidebar.vue
@@ -125,6 +125,7 @@ export default {
:title="$options.i18n.cancelJobButtonLabel"
:aria-label="$options.i18n.cancelJobButtonLabel"
:href="job.cancel_path"
+ variant="danger"
icon="cancel"
data-method="post"
data-testid="cancel-button"
diff --git a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
index 5428f657252..2ba531c9e95 100644
--- a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
+++ b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue
@@ -56,7 +56,7 @@ export default {
});
},
runnerId() {
- const { id, short_sha: token, description } = this.job?.runner;
+ const { id, short_sha: token, description } = this.job.runner;
return `#${id} (${token}) ${description}`;
},
@@ -71,11 +71,20 @@ export default {
return '';
}
- return sprintf(__(` (from %{timeoutSource})`), {
+ return sprintf(__(' (from %{timeoutSource})'), {
timeoutSource: this.job.metadata.timeout_source,
});
},
},
+ i18n: {
+ COVERAGE: __('Coverage'),
+ FINISHED: __('Finished'),
+ ERASED: __('Erased'),
+ QUEUED: __('Queued'),
+ RUNNER: __('Runner'),
+ TAGS: __('Tags:'),
+ TIMEOUT: __('Timeout'),
+ },
};
</script>
@@ -86,22 +95,22 @@ export default {
v-if="job.finished_at"
:value="finishedAt"
data-testid="job-finished"
- title="Finished"
+ :title="$options.i18n.FINISHED"
/>
- <detail-row v-if="job.erased_at" :value="erasedAt" title="Erased" />
- <detail-row v-if="job.queued" :value="queued" title="Queued" />
+ <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="hasTimeout"
:help-url="runnerHelpUrl"
:value="timeout"
data-testid="job-timeout"
- title="Timeout"
+ :title="$options.i18n.TIMEOUT"
/>
- <detail-row v-if="job.runner" :value="runnerId" title="Runner" />
- <detail-row v-if="job.coverage" :value="coverage" title="Coverage" />
+ <detail-row v-if="job.runner" :value="runnerId" :title="$options.i18n.RUNNER" />
+ <detail-row v-if="job.coverage" :value="coverage" :title="$options.i18n.COVERAGE" />
<p v-if="hasTags" class="build-detail-row" data-testid="job-tags">
- <span class="font-weight-bold">{{ __('Tags:') }}</span>
+ <span class="font-weight-bold">{{ $options.i18n.TAGS }}</span>
<gl-badge v-for="(tag, i) in job.tags" :key="i" variant="info">{{ tag }}</gl-badge>
</p>
</div>
diff --git a/app/assets/javascripts/jobs/components/stuck_block.vue b/app/assets/javascripts/jobs/components/stuck_block.vue
index abd0c13702a..f9cde61e917 100644
--- a/app/assets/javascripts/jobs/components/stuck_block.vue
+++ b/app/assets/javascripts/jobs/components/stuck_block.vue
@@ -11,7 +11,7 @@ export default {
GlLink,
},
props: {
- hasNoRunnersForProject: {
+ hasOfflineRunnersForProject: {
type: Boolean,
required: true,
},
@@ -37,7 +37,7 @@ export default {
dataTestId: 'job-stuck-with-tags',
showTags: true,
};
- } else if (this.hasNoRunnersForProject) {
+ } else if (this.hasOfflineRunnersForProject) {
return {
text: s__(`Job|This job is stuck because the project
doesn't have any runners online assigned to it.`),
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 f16e0287d5d..02aeb46a22b 100644
--- a/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
+++ b/app/assets/javascripts/jobs/components/table/cells/actions_cell.vue
@@ -1,6 +1,7 @@
<script>
import { GlButton, GlButtonGroup, GlModal, GlModalDirective, GlSprintf } from '@gitlab/ui';
import GlCountdown from '~/vue_shared/components/gl_countdown.vue';
+import { redirectTo } from '~/lib/utils/url_utility';
import {
ACTIONS_DOWNLOAD_ARTIFACTS,
ACTIONS_START_NOW,
@@ -108,11 +109,11 @@ export default {
},
},
methods: {
- async postJobAction(name, mutation) {
+ async postJobAction(name, mutation, redirect = false) {
try {
const {
data: {
- [name]: { errors },
+ [name]: { errors, job },
},
} = await this.$apollo.mutate({
mutation,
@@ -121,6 +122,10 @@ export default {
if (errors.length > 0) {
reportMessageToSentry(this.$options.name, errors.join(', '), {});
this.showToastMessage();
+ } else if (redirect) {
+ // Retry and Play actions redirect to job detail view
+ // we don't need to refetch with jobActionPerformed event
+ redirectTo(job.detailedStatus.detailsPath);
} else {
eventHub.$emit('jobActionPerformed');
}
@@ -147,12 +152,12 @@ export default {
retryJob() {
this.retryBtnDisabled = true;
- this.postJobAction(this.$options.jobRetry, retryJobMutation);
+ this.postJobAction(this.$options.jobRetry, retryJobMutation, true);
},
playJob() {
this.playManualBtnDisabled = true;
- this.postJobAction(this.$options.jobPlay, playJobMutation);
+ this.postJobAction(this.$options.jobPlay, playJobMutation, true);
},
unscheduleJob() {
this.unscheduleBtnDisabled = true;
diff --git a/app/assets/javascripts/jobs/components/table/graphql/fragments/job.fragment.graphql b/app/assets/javascripts/jobs/components/table/graphql/fragments/job.fragment.graphql
index 06b065a86ce..3038216fdfc 100644
--- a/app/assets/javascripts/jobs/components/table/graphql/fragments/job.fragment.graphql
+++ b/app/assets/javascripts/jobs/components/table/graphql/fragments/job.fragment.graphql
@@ -1,3 +1,7 @@
fragment Job on CiJob {
id
+ detailedStatus {
+ id
+ detailsPath
+ }
}
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 0a25dc5bea5..27e3b8028b7 100644
--- a/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
+++ b/app/assets/javascripts/jobs/components/table/jobs_table_tabs.vue
@@ -54,7 +54,9 @@ export default {
<gl-tab
v-for="tab in tabs"
:key="tab.text"
- :title-link-attributes="{ 'data-testid': tab.testId }"
+ :title-link-attributes="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ 'data-testid': tab.testId,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@click="$emit('fetchJobsByStatus', tab.scope)"
>
<template #title>
diff --git a/app/assets/javascripts/jobs/store/getters.js b/app/assets/javascripts/jobs/store/getters.js
index 9d255822250..a0f9db7409d 100644
--- a/app/assets/javascripts/jobs/store/getters.js
+++ b/app/assets/javascripts/jobs/store/getters.js
@@ -1,7 +1,7 @@
-import { isEmpty, isString } from 'lodash';
+import { isEmpty } from 'lodash';
import { isScrolledToBottom } from '~/lib/utils/scroll_utils';
-export const headerTime = (state) => (state.job.started ? state.job.started : state.job.created_at);
+export const headerTime = (state) => state.job.started_at || state.job.created_at;
export const hasForwardDeploymentFailure = (state) =>
state?.job?.failure_reason === 'forward_deployment_failure';
@@ -13,10 +13,10 @@ export const shouldRenderCalloutMessage = (state) =>
!isEmpty(state.job.status) && !isEmpty(state.job.callout_message);
/**
- * When job has not started the key will be null
- * When job started the key will be a string with a date.
+ * When the job has not started the value of job.started_at will be null
+ * When job has started the value of job.started_at will be a string with a date.
*/
-export const shouldRenderTriggeredLabel = (state) => isString(state.job.started);
+export const shouldRenderTriggeredLabel = (state) => Boolean(state.job.started_at);
export const hasEnvironment = (state) => !isEmpty(state.job.deployment_status);
@@ -46,5 +46,5 @@ export const shouldRenderSharedRunnerLimitWarning = (state) =>
export const isScrollingDown = (state) => isScrolledToBottom() && !state.isJobLogComplete;
-export const hasRunnersForProject = (state) =>
+export const hasOfflineRunnersForProject = (state) =>
state?.job?.runners?.available && !state?.job?.runners?.online;
diff --git a/app/assets/javascripts/lib/dompurify.js b/app/assets/javascripts/lib/dompurify.js
index 47568f0ecff..4959550e273 100644
--- a/app/assets/javascripts/lib/dompurify.js
+++ b/app/assets/javascripts/lib/dompurify.js
@@ -7,6 +7,7 @@ const defaultConfig = {
// Prevent possible XSS attacks with data-* attributes used by @rails/ujs
// See https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1421
FORBID_ATTR: ['data-remote', 'data-url', 'data-type', 'data-method'],
+ FORBID_TAGS: ['style', 'mstyle'],
};
// 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 07388f1fdfa..4e704eb69b2 100644
--- a/app/assets/javascripts/lib/gfm/index.js
+++ b/app/assets/javascripts/lib/gfm/index.js
@@ -32,7 +32,7 @@ const compilerFactory = (renderer) =>
* the MDast tree
*/
export const render = async ({ markdown, renderer }) => {
- const { value } = await createParser().use(compilerFactory(renderer)).process(markdown);
+ const { result } = await createParser().use(compilerFactory(renderer)).process(markdown);
- return value;
+ return result;
};
diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js
index 96d019f62f2..1ed0cc3130b 100644
--- a/app/assets/javascripts/lib/utils/common_utils.js
+++ b/app/assets/javascripts/lib/utils/common_utils.js
@@ -4,15 +4,15 @@
import { GlBreakpointInstance as breakpointInstance } from '@gitlab/ui/dist/utils';
import $ from 'jquery';
-import Cookies from 'js-cookie';
import { isFunction, defer } from 'lodash';
+import Cookies from '~/lib/utils/cookies';
import { SCOPED_LABEL_DELIMITER } from '~/vue_shared/components/sidebar/labels_select_widget/constants';
import { convertToCamelCase, convertToSnakeCase } from './text_utility';
import { isObject } from './type_utility';
import { getLocationHash } from './url_utility';
export const getPagePath = (index = 0) => {
- const { page = '' } = document?.body?.dataset;
+ const { page = '' } = document.body.dataset;
return page.split(':')[index];
};
@@ -105,7 +105,7 @@ export const handleLocationHash = () => {
}
if (isInIssuePage()) {
- adjustment -= fixedIssuableTitle?.offsetHeight;
+ adjustment -= fixedIssuableTitle.offsetHeight;
}
if (isInMRPage()) {
@@ -157,7 +157,7 @@ export const contentTop = () => {
() => getOuterHeight('#js-peek'),
() => getOuterHeight('.navbar-gitlab'),
({ desktop }) => {
- const container = document.querySelector('.line-resolve-all-container');
+ const container = document.querySelector('.discussions-counter');
let size = 0;
if (!desktop && container) {
@@ -282,23 +282,51 @@ export const getSelectedFragment = (restrictToNode) => {
return documentFragment;
};
+function execInsertText(text) {
+ if (text === '') return document.execCommand('delete');
+
+ return document.execCommand('insertText', false, text);
+}
+
+/**
+ * This method inserts text into a textarea/input field.
+ * Uses `execCommand` if supported
+ *
+ * @param {HTMLElement} target - textarea/input to have text inserted into
+ * @param {String | function} text - text to be inserted
+ */
export const insertText = (target, text) => {
- // Firefox doesn't support `document.execCommand('insertText', false, text)` on textareas
const { selectionStart, selectionEnd, value } = target;
-
const textBefore = value.substring(0, selectionStart);
const textAfter = value.substring(selectionEnd, value.length);
-
const insertedText = text instanceof Function ? text(textBefore, textAfter) : text;
- const newText = textBefore + insertedText + textAfter;
- // eslint-disable-next-line no-param-reassign
- target.value = newText;
- // eslint-disable-next-line no-param-reassign
- target.selectionStart = selectionStart + insertedText.length;
-
- // eslint-disable-next-line no-param-reassign
- target.selectionEnd = selectionStart + insertedText.length;
+ // The `execCommand` is officially deprecated. However, for `insertText`,
+ // there is currently no alternative. We need to use it in order to trigger
+ // the browser's undo tracking when we insert text.
+ // Per https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand on 2022-04-11,
+ // The Clipboard API can be used instead of execCommand in many cases,
+ // but execCommand is still sometimes useful. In particular, the Clipboard
+ // API doesn't replace the insertText command
+ // So we attempt to use it if possible. Otherwise, fall back to just replacing
+ // the value as before. In this case, Undo will be broken with inserted text.
+ // Testing on older versions of Firefox:
+ // 87 and below: does not work and falls through to just replacing value.
+ // 87 was released in Mar of 2021
+ // 89 and above: works well
+ // 89 was released in May of 2021
+ if (!execInsertText(insertedText)) {
+ const newText = textBefore + insertedText + textAfter;
+
+ // eslint-disable-next-line no-param-reassign
+ target.value = newText;
+
+ // eslint-disable-next-line no-param-reassign
+ target.selectionStart = selectionStart + insertedText.length;
+
+ // eslint-disable-next-line no-param-reassign
+ target.selectionEnd = selectionStart + insertedText.length;
+ }
// Trigger autosave
target.dispatchEvent(new Event('input'));
diff --git a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
index 1d8eb73d3d7..3788d8ab20c 100644
--- a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
+++ b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_modal.vue
@@ -3,7 +3,6 @@ import { GlModal, GlSafeHtmlDirective } from '@gitlab/ui';
import { __ } from '~/locale';
export default {
- cancelAction: { text: __('Cancel') },
directives: {
SafeHtml: GlSafeHtmlDirective,
},
@@ -36,6 +35,16 @@ export default {
required: false,
default: 'confirm',
},
+ cancelText: {
+ type: String,
+ required: false,
+ default: __('Cancel'),
+ },
+ cancelVariant: {
+ type: String,
+ required: false,
+ default: 'default',
+ },
modalHtmlMessage: {
type: String,
required: false,
@@ -71,7 +80,14 @@ export default {
};
},
cancelAction() {
- return this.hideCancel ? null : this.$options.cancelAction;
+ return this.hideCancel
+ ? null
+ : {
+ text: this.cancelText,
+ attributes: {
+ variant: this.cancelVariant,
+ },
+ };
},
shouldShowHeader() {
return Boolean(this.title?.length);
diff --git a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
index 1adb6f9c26f..173116062c9 100644
--- a/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
+++ b/app/assets/javascripts/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal.js
@@ -7,6 +7,8 @@ export function confirmAction(
primaryBtnText,
secondaryBtnVariant,
secondaryBtnText,
+ cancelBtnVariant,
+ cancelBtnText,
modalHtmlMessage,
title,
hideCancel,
@@ -28,6 +30,8 @@ export function confirmAction(
secondaryVariant: secondaryBtnVariant,
primaryVariant: primaryBtnVariant,
primaryText: primaryBtnText,
+ cancelVariant: cancelBtnVariant,
+ cancelText: cancelBtnText,
title,
modalHtmlMessage,
hideCancel,
diff --git a/app/assets/javascripts/lib/utils/cookies.js b/app/assets/javascripts/lib/utils/cookies.js
new file mode 100644
index 00000000000..be0491376c9
--- /dev/null
+++ b/app/assets/javascripts/lib/utils/cookies.js
@@ -0,0 +1,8 @@
+import CookiesBuilder from 'js-cookie';
+
+// set default path for cookies
+const Cookies = CookiesBuilder.withAttributes({
+ path: gon.relative_url_root || '/',
+});
+
+export default Cookies;
diff --git a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
index 095a29a2eff..05f34db662a 100644
--- a/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
+++ b/app/assets/javascripts/lib/utils/datetime/timeago_utility.js
@@ -7,7 +7,7 @@ import { formatDate } from './date_format_utility';
*
* see https://github.com/hustcc/timeago.js/tree/v3.0.0/locales
*/
-const timeagoLanguageCode = languageCode().replace(/-/g, '_');
+export const timeagoLanguageCode = languageCode().replace(/-/g, '_');
/**
* Registers timeago locales
diff --git a/app/assets/javascripts/lib/utils/dom_utils.js b/app/assets/javascripts/lib/utils/dom_utils.js
index b52a736f153..4262329aae7 100644
--- a/app/assets/javascripts/lib/utils/dom_utils.js
+++ b/app/assets/javascripts/lib/utils/dom_utils.js
@@ -90,6 +90,20 @@ export const getParents = (element) => {
return parents;
};
+export const getParentByTagName = (element, tagName) => {
+ let parent = element.parentNode;
+
+ do {
+ if (parent.nodeName?.toLowerCase() === tagName?.toLowerCase()) {
+ return parent;
+ }
+
+ parent = parent.parentElement;
+ } while (parent);
+
+ return undefined;
+};
+
/**
* This method takes a HTML element and an object of attributes
* to save repeated calls to `setAttribute` when multiple
diff --git a/app/assets/javascripts/lib/utils/http_status.js b/app/assets/javascripts/lib/utils/http_status.js
index 6b9be34235b..c5190592bb6 100644
--- a/app/assets/javascripts/lib/utils/http_status.js
+++ b/app/assets/javascripts/lib/utils/http_status.js
@@ -22,6 +22,7 @@ const httpStatusCodes = {
METHOD_NOT_ALLOWED: 405,
CONFLICT: 409,
GONE: 410,
+ PAYLOAD_TOO_LARGE: 413,
UNPROCESSABLE_ENTITY: 422,
TOO_MANY_REQUESTS: 429,
INTERNAL_SERVER_ERROR: 500,
diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js
index 52fa90c7791..243de48948c 100644
--- a/app/assets/javascripts/lib/utils/text_markdown.js
+++ b/app/assets/javascripts/lib/utils/text_markdown.js
@@ -14,6 +14,8 @@ const LIST_LINE_HEAD_PATTERN = /^(?<indent>\s*)(?<leader>((?<isUl>[*+-])|(?<isOl
// detect a horizontal rule that might be mistaken for a list item (not full pattern for an <hr>)
const HR_PATTERN = /^((\s{0,3}-+\s*-+\s*-+\s*[\s-]*)|(\s{0,3}\*+\s*\*+\s*\*+\s*[\s*]*))$/;
+let compositioningNoteText = false;
+
function selectedText(text, textarea) {
return text.substring(textarea.selectionStart, textarea.selectionEnd);
}
@@ -363,10 +365,11 @@ function continueOlText(result, nextLineResult) {
}
function handleContinueList(e, textArea) {
- if (!gon.features?.markdownContinueLists) return;
if (!(e.key === 'Enter')) return;
if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;
if (textArea.selectionStart !== textArea.selectionEnd) return;
+ // prevent unintended line breaks were inserted using Japanese IME on MacOS
+ if (compositioningNoteText) return;
const currentLine = lineBefore(textArea.value, textArea, false);
const result = currentLine.match(LIST_LINE_HEAD_PATTERN);
@@ -420,6 +423,14 @@ export function keypressNoteText(e) {
handleSurroundSelectedText(e, textArea);
}
+export function compositionStartNoteText() {
+ compositioningNoteText = true;
+}
+
+export function compositionEndNoteText() {
+ compositioningNoteText = false;
+}
+
export function updateTextForToolbarBtn($toolbarBtn) {
return updateText({
textArea: $toolbarBtn.closest('.md-area').find('textarea'),
@@ -435,6 +446,8 @@ export function updateTextForToolbarBtn($toolbarBtn) {
export function addMarkdownListeners(form) {
$('.markdown-area', form)
.on('keydown', keypressNoteText)
+ .on('compositionstart', compositionStartNoteText)
+ .on('compositionend', compositionEndNoteText)
.each(function attachTextareaShortcutHandlers() {
Shortcuts.initMarkdownEditorShortcuts($(this), updateTextForToolbarBtn);
});
@@ -474,6 +487,8 @@ export function addEditorMarkdownListeners(editor) {
export function removeMarkdownListeners(form) {
$('.markdown-area', form)
.off('keydown', keypressNoteText)
+ .off('compositionstart', compositionStartNoteText)
+ .off('compositionend', compositionEndNoteText)
.each(function removeTextareaShortcutHandlers() {
Shortcuts.removeMarkdownEditorShortcuts($(this));
});
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index 419afa0a0a9..dad9cbcb6f6 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -6,6 +6,10 @@ import {
} from '~/lib/utils/constants';
import { allSingleQuotes } from '~/lib/utils/regexp';
+export const COLON = ':';
+export const HYPHEN = '-';
+export const NEWLINE = '\n';
+
/**
* Adds a , to a string composed by numbers, at every 3 chars.
*
diff --git a/app/assets/javascripts/lib/utils/url_utility.js b/app/assets/javascripts/lib/utils/url_utility.js
index 335cd6a16e5..ff60fd2aecb 100644
--- a/app/assets/javascripts/lib/utils/url_utility.js
+++ b/app/assets/javascripts/lib/utils/url_utility.js
@@ -420,6 +420,19 @@ export function isSafeURL(url) {
}
/**
+ * Returns the sanitized url when not safe
+ *
+ * @param {String} url
+ * @returns {String}
+ */
+export function sanitizeUrl(url) {
+ if (!isSafeURL(url)) {
+ return 'about:blank';
+ }
+ return url;
+}
+
+/**
* Returns a normalized url
*
* https://gitlab.com/foo/../baz => https://gitlab.com/baz
diff --git a/app/assets/javascripts/lib/utils/users_cache.js b/app/assets/javascripts/lib/utils/users_cache.js
index 54f69ef8e1b..bd000bb26fe 100644
--- a/app/assets/javascripts/lib/utils/users_cache.js
+++ b/app/assets/javascripts/lib/utils/users_cache.js
@@ -35,6 +35,17 @@ class UsersCache extends Cache {
// missing catch is intentional, error handling depends on use case
}
+ updateById(userId, data) {
+ if (!this.hasData(userId)) {
+ return;
+ }
+
+ this.internalStorage[userId] = {
+ ...this.internalStorage[userId],
+ ...data,
+ };
+ }
+
retrieveStatusById(userId) {
if (this.hasData(userId) && this.get(userId).status) {
return Promise.resolve(this.get(userId).status);
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 8fc54be9c28..2f3cdc525a7 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -1,7 +1,6 @@
/* global $ */
import jQuery from 'jquery';
-import Cookies from 'js-cookie';
// bootstrap webpack, common libs, polyfills, and behaviors
import './webpack';
@@ -178,9 +177,6 @@ initUserTracking();
initLayoutNav();
initAlertHandler();
-// Set the default path for all cookies to GitLab's root directory
-Cookies.defaults.path = gon.relative_url_root || '/';
-
// `hashchange` is not triggered when link target is already in window.location
$body.on('click', 'a[href^="#"]', function clickHashLinkCallback() {
const href = this.getAttribute('href');
@@ -199,7 +195,11 @@ $body.on('click', 'a[href^="#"]', function clickHashLinkCallback() {
* Quick fix: Get rid of jQuery for this implementation
*/
const isBoardsPage = /(projects|groups):boards:show/.test(document.body.dataset.page);
-if (!isBoardsPage && (bootstrapBreakpoint === 'sm' || bootstrapBreakpoint === 'xs')) {
+if (
+ !isBoardsPage &&
+ !window.gon?.features?.movedMrSidebar &&
+ (bootstrapBreakpoint === 'sm' || bootstrapBreakpoint === 'xs')
+) {
const $rightSidebar = $('aside.right-sidebar');
const $layoutPage = $('.layout-page');
diff --git a/app/assets/javascripts/members/components/table/members_table.vue b/app/assets/javascripts/members/components/table/members_table.vue
index 0b97ce7e33e..14d628e455c 100644
--- a/app/assets/javascripts/members/components/table/members_table.vue
+++ b/app/assets/javascripts/members/components/table/members_table.vue
@@ -232,12 +232,10 @@ export default {
v-bind="tableAttrs.table"
class="members-table"
data-testid="members-table"
- head-variant="white"
stacked="lg"
:fields="filteredAndModifiedFields"
:items="members"
primary-key="id"
- thead-class="border-bottom"
:empty-text="__('No members found')"
show-empty
:tbody-tr-attr="tbodyTrAttr"
diff --git a/app/assets/javascripts/merge_request.js b/app/assets/javascripts/merge_request.js
index 829e2264152..960b25bb552 100644
--- a/app/assets/javascripts/merge_request.js
+++ b/app/assets/javascripts/merge_request.js
@@ -5,6 +5,7 @@ import createFlash from '~/flash';
import toast from '~/vue_shared/plugins/global_toast';
import { __ } from '~/locale';
import eventHub from '~/vue_merge_request_widget/event_hub';
+import { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js';
import axios from './lib/utils/axios_utils';
import { addDelimiter } from './lib/utils/text_utility';
import { getParameterValues, setUrlParams } from './lib/utils/url_utility';
@@ -31,8 +32,16 @@ function MergeRequest(opts) {
selector: '.detail-page-description',
lockVersion: this.$el.data('lockVersion'),
onSuccess: (result) => {
- document.querySelector('#task_status').innerText = result.task_status;
- document.querySelector('#task_status_short').innerText = result.task_status_short;
+ const taskStatus = document.querySelector('#task_status');
+ const taskStatusShort = document.querySelector('#task_status_short');
+
+ if (taskStatus) {
+ taskStatus.innerText = result.task_status;
+ }
+
+ if (taskStatusShort) {
+ document.querySelector('#task_status_short').innerText = result.task_status_short;
+ }
},
onError: () => {
createFlash({
@@ -72,8 +81,7 @@ MergeRequest.prototype.initMRBtnListeners = function () {
const wipEvent = getParameterValues('merge_request[wip_event]', url)[0];
const mobileDropdown = draftToggle.closest('.dropdown.show');
- const loader = document.createElement('span');
- loader.classList.add('gl-spinner', 'gl-mr-3');
+ const loader = loadingIconForLegacyJS({ inline: true, classes: ['gl-mr-3'] });
if (mobileDropdown) {
$(mobileDropdown.firstElementChild).dropdown('toggle');
@@ -90,10 +98,13 @@ MergeRequest.prototype.initMRBtnListeners = function () {
MergeRequest.toggleDraftStatus(data.title, wipEvent === 'unwip');
})
.catch(() => {
- draftToggle.removeAttribute('disabled');
createFlash({
message: __('Something went wrong. Please try again.'),
});
+ })
+ .finally(() => {
+ draftToggle.removeAttribute('disabled');
+ loader.remove();
});
});
});
@@ -145,7 +156,11 @@ MergeRequest.toggleDraftStatus = function (title, isReady) {
} else {
toast(__('Marked as draft. Can only be merged when marked as ready.'));
}
- const titleEl = document.querySelector('.merge-request .detail-page-description .title');
+ const titleEl = document.querySelector(
+ `.merge-request .detail-page-${
+ window.gon?.features?.updatedMrHeader ? 'header' : 'description'
+ } .title`,
+ );
if (titleEl) {
titleEl.textContent = title;
@@ -162,7 +177,9 @@ MergeRequest.toggleDraftStatus = function (title, isReady) {
);
draftToggle.setAttribute('href', url);
- draftToggle.textContent = isReady ? __('Mark as draft') : __('Mark as ready');
+ draftToggle.querySelector('.gl-new-dropdown-item-text-wrapper').textContent = isReady
+ ? __('Mark as draft')
+ : __('Mark as ready');
});
}
};
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index 61f7a079d77..e02109d1fd1 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -1,5 +1,4 @@
/* eslint-disable no-new, class-methods-use-this */
-import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import $ from 'jquery';
import Vue from 'vue';
import { getCookie, isMetaClick, parseBoolean, scrollToElement } from '~/lib/utils/common_utils';
@@ -176,6 +175,8 @@ export default class MergeRequestTabs {
: null;
this.navbar = document.querySelector('.navbar-gitlab');
this.peek = document.getElementById('js-peek');
+ this.sidebar = document.querySelector('.js-right-sidebar');
+ this.pageLayout = document.querySelector('.layout-page');
this.paddingTop = 16;
this.scrollPositions = {};
@@ -282,7 +283,7 @@ export default class MergeRequestTabs {
if (action === 'commits') {
this.loadCommits(href);
- this.expandView();
+ // this.hideSidebar();
this.resetViewContainer();
this.commitPipelinesTable = destroyPipelines(this.commitPipelinesTable);
} else if (action === 'new') {
@@ -301,13 +302,12 @@ export default class MergeRequestTabs {
*/
this.loadDiff(href);
}
- if (bp.getBreakpointSize() !== 'xl') {
- this.shrinkView();
- }
+ // this.hideSidebar();
this.expandViewContainer();
this.commitPipelinesTable = destroyPipelines(this.commitPipelinesTable);
this.commitsTab.classList.remove('active');
} else if (action === 'pipelines') {
+ // this.hideSidebar();
this.resetViewContainer();
this.mountPipelinesView();
} else {
@@ -320,9 +320,7 @@ export default class MergeRequestTabs {
notesTab.classList.add('active');
}
- if (bp.getBreakpointSize() !== 'xs') {
- this.expandView();
- }
+ // this.showSidebar();
this.resetViewContainer();
this.commitPipelinesTable = destroyPipelines(this.commitPipelinesTable);
}
@@ -509,19 +507,6 @@ export default class MergeRequestTabs {
}
}
- shrinkView() {
- const $gutterBtn = $('.js-sidebar-toggle:visible');
- const $expandSvg = $gutterBtn.find('.js-sidebar-expand');
-
- // Wait until listeners are set
- setTimeout(() => {
- // Only when sidebar is expanded
- if ($expandSvg.length && $expandSvg.hasClass('hidden')) {
- $gutterBtn.trigger('click', [true]);
- }
- }, 0);
- }
-
// Expand the issuable sidebar unless the user explicitly collapsed it
expandView() {
if (parseBoolean(getCookie('collapsed_gutter'))) {
@@ -538,4 +523,24 @@ export default class MergeRequestTabs {
}
}, 0);
}
+
+ hideSidebar() {
+ if (!isInVueNoteablePage() || this.cachedPageLayoutClasses) return;
+
+ this.cachedPageLayoutClasses = this.pageLayout.className;
+ this.pageLayout.classList.remove(
+ 'right-sidebar-collapsed',
+ 'right-sidebar-expanded',
+ 'page-with-icon-sidebar',
+ );
+ this.sidebar.style.width = '0px';
+ }
+
+ showSidebar() {
+ if (!isInVueNoteablePage() || !this.cachedPageLayoutClasses) return;
+
+ this.pageLayout.className = this.cachedPageLayoutClasses;
+ this.sidebar.style.width = '';
+ delete this.cachedPageLayoutClasses;
+ }
}
diff --git a/app/assets/javascripts/milestones/components/milestone_combobox.vue b/app/assets/javascripts/milestones/components/milestone_combobox.vue
index d7ffdfd7c5f..59d2a2b29b3 100644
--- a/app/assets/javascripts/milestones/components/milestone_combobox.vue
+++ b/app/assets/javascripts/milestones/components/milestone_combobox.vue
@@ -187,7 +187,7 @@ export default {
ref="searchBox"
v-model.trim="searchQuery"
class="gl-m-3"
- :placeholder="this.$options.translations.searchMilestones"
+ :placeholder="$options.translations.searchMilestones"
@input="onSearchBoxInput"
@keydown.enter.prevent="onSearchBoxEnter"
/>
diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue
index c4392dd3748..6a85833db27 100644
--- a/app/assets/javascripts/monitoring/components/dashboard.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard.vue
@@ -492,7 +492,9 @@ export default {
v-if="!groupSingleEmptyState(groupData.key)"
:value="groupData.panels"
group="metrics-dashboard"
- :component-data="{ attrs: { class: 'row mx-0 w-100' } }"
+ :component-data="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ attrs: { class: 'row mx-0 w-100' },
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:disabled="!isRearrangingPanels"
@input="updatePanels(groupData.key, $event)"
>
diff --git a/app/assets/javascripts/monitoring/components/dashboard_panel.vue b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
index 78e3b15913a..ff8ccded83b 100644
--- a/app/assets/javascripts/monitoring/components/dashboard_panel.vue
+++ b/app/assets/javascripts/monitoring/components/dashboard_panel.vue
@@ -19,6 +19,7 @@ import invalidUrl from '~/lib/utils/invalid_url';
import { relativePathToAbsolute, getBaseURL, visitUrl, 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';
@@ -57,6 +58,7 @@ export default {
GlTooltip: GlTooltipDirective,
TrackEvent: TrackEventDirective,
},
+ mixins: [glFeatureFlagsMixin()],
props: {
clipboardText: {
type: String,
@@ -141,6 +143,9 @@ export default {
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) {
diff --git a/app/assets/javascripts/mr_notes/index.js b/app/assets/javascripts/mr_notes/index.js
index a1377415efe..7424c011052 100644
--- a/app/assets/javascripts/mr_notes/index.js
+++ b/app/assets/javascripts/mr_notes/index.js
@@ -31,6 +31,8 @@ export default function initMrNotes() {
const el = document.getElementById('js-vue-discussion-counter');
if (el) {
+ const { blocksMerge } = el.dataset;
+
// eslint-disable-next-line no-new
new Vue({
el,
@@ -40,7 +42,11 @@ export default function initMrNotes() {
},
store,
render(createElement) {
- return createElement('discussion-counter');
+ return createElement('discussion-counter', {
+ props: {
+ blocksMerge: blocksMerge === 'true',
+ },
+ });
},
});
}
diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue
index a9948fed3b6..4e03bed8737 100644
--- a/app/assets/javascripts/notes/components/comment_form.vue
+++ b/app/assets/javascripts/notes/components/comment_form.vue
@@ -6,7 +6,7 @@ import { mapActions, mapGetters, mapState } from 'vuex';
import Autosave from '~/autosave';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import createFlash from '~/flash';
-import { statusBoxState } from '~/issuable/components/status_box.vue';
+import { badgeState } from '~/issuable/components/status_box.vue';
import httpStatusCodes from '~/lib/utils/http_status';
import {
capitalizeFirstCharacter,
@@ -90,9 +90,16 @@ export default {
return this.getUserData.id;
},
commentButtonTitle() {
- return this.noteType === constants.COMMENT
- ? this.$options.i18n.comment
- : this.$options.i18n.startThread;
+ const { comment, internalComment, startThread, startInternalThread } = this.$options.i18n;
+ if (this.noteIsConfidential) {
+ return this.noteType === constants.COMMENT ? internalComment : startInternalThread;
+ }
+ return this.noteType === constants.COMMENT ? comment : startThread;
+ },
+ textareaPlaceholder() {
+ return this.noteIsConfidential
+ ? this.$options.i18n.bodyPlaceholderInternal
+ : this.$options.i18n.bodyPlaceholder;
},
discussionsRequireResolution() {
return this.getNoteableData.noteableType === constants.MERGE_REQUEST_NOTEABLE_TYPE;
@@ -266,7 +273,7 @@ export default {
const toggleState = this.isOpen ? this.closeIssuable : this.reopenIssuable;
toggleState()
- .then(() => statusBoxState.updateStatus && statusBoxState.updateStatus())
+ .then(() => badgeState.updateStatus && badgeState.updateStatus())
.then(refreshUserMergeRequestCounts)
.catch(() =>
createFlash({
@@ -371,7 +378,7 @@ export default {
data-testid="comment-field"
data-supports-quick-actions="true"
:aria-label="$options.i18n.comment"
- :placeholder="$options.i18n.bodyPlaceholder"
+ :placeholder="textareaPlaceholder"
@keydown.up="editCurrentUserLastNote()"
@keydown.meta.enter="handleEnter()"
@keydown.ctrl.enter="handleEnter()"
@@ -386,7 +393,7 @@ export default {
data-testid="add-to-review-button"
type="submit"
category="primary"
- variant="success"
+ variant="confirm"
@click.prevent="handleSaveDraft()"
>{{ __('Add to review') }}</gl-button
>
@@ -419,6 +426,7 @@ export default {
class="gl-mr-3"
:disabled="disableSubmitButton"
:tracking-label="trackingLabel"
+ :is-internal-note="noteIsConfidential"
:noteable-display-name="noteableDisplayName"
:discussions-require-resolution="discussionsRequireResolution"
@click="handleSave"
diff --git a/app/assets/javascripts/notes/components/comment_type_dropdown.vue b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
index 30ea5d3532e..543be838920 100644
--- a/app/assets/javascripts/notes/components/comment_type_dropdown.vue
+++ b/app/assets/javascripts/notes/components/comment_type_dropdown.vue
@@ -32,6 +32,11 @@ export default {
required: false,
default: false,
},
+ isInternalNote: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
noteableDisplayName: {
type: String,
required: true,
@@ -48,18 +53,43 @@ export default {
isNoteTypeDiscussion() {
return this.noteType === constants.DISCUSSION;
},
+ dropdownCommentButtonTitle() {
+ const { comment, internalComment } = this.$options.i18n.submitButton;
+
+ return this.isInternalNote ? internalComment : comment;
+ },
+ dropdownStartThreadButtonTitle() {
+ const { startThread, startInternalThread } = this.$options.i18n.submitButton;
+
+ return this.isInternalNote ? startInternalThread : startThread;
+ },
commentButtonTitle() {
- return this.noteType === constants.COMMENT
- ? this.$options.i18n.comment
- : this.$options.i18n.startThread;
+ const { comment, internalComment, startThread, startInternalThread } = this.$options.i18n;
+
+ if (this.isInternalNote) {
+ return this.noteType === constants.COMMENT ? internalComment : startInternalThread;
+ }
+ return this.noteType === constants.COMMENT ? comment : startThread;
},
startDiscussionDescription() {
- return this.discussionsRequireResolution
- ? this.$options.i18n.discussionThatNeedsResolution
- : this.$options.i18n.discussion;
+ const {
+ discussionThatNeedsResolution,
+ internalDiscussionThatNeedsResolution,
+ discussion,
+ internalDiscussion,
+ } = this.$options.i18n;
+
+ if (this.isInternalNote) {
+ return this.discussionsRequireResolution
+ ? internalDiscussionThatNeedsResolution
+ : internalDiscussion;
+ }
+ return this.discussionsRequireResolution ? discussionThatNeedsResolution : discussion;
},
commentDescription() {
- return sprintf(this.$options.i18n.submitButton.commentHelp, {
+ const { commentHelp, internalCommentHelp } = this.$options.i18n.submitButton;
+
+ return sprintf(this.isInternalNote ? internalCommentHelp : commentHelp, {
noteableDisplayName: this.noteableDisplayName,
});
},
@@ -101,7 +131,7 @@ export default {
:is-checked="isNoteTypeComment"
@click.stop.prevent="setNoteTypeToComment"
>
- <strong>{{ $options.i18n.submitButton.comment }}</strong>
+ <strong>{{ dropdownCommentButtonTitle }}</strong>
<p class="gl-m-0">{{ commentDescription }}</p>
</gl-dropdown-item>
<gl-dropdown-divider />
@@ -111,7 +141,7 @@ export default {
data-qa-selector="discussion_menu_item"
@click.stop.prevent="setNoteTypeToDiscussion"
>
- <strong>{{ $options.i18n.submitButton.startThread }}</strong>
+ <strong>{{ dropdownStartThreadButtonTitle }}</strong>
<p class="gl-m-0">{{ startDiscussionDescription }}</p>
</gl-dropdown-item>
</gl-dropdown>
diff --git a/app/assets/javascripts/notes/components/diff_discussion_header.vue b/app/assets/javascripts/notes/components/diff_discussion_header.vue
index 45d97f278dc..5210d2ca287 100644
--- a/app/assets/javascripts/notes/components/diff_discussion_header.vue
+++ b/app/assets/javascripts/notes/components/diff_discussion_header.vue
@@ -98,13 +98,14 @@ export default {
<template>
<div class="discussion-header note-wrapper">
- <div v-once class="timeline-icon align-self-start flex-shrink-0">
+ <div v-once class="timeline-icon gl-align-self-start gl-flex-shrink-0 gl-flex-shrink gl-mr-4">
<user-avatar-link
v-if="author"
:link-href="author.path"
:img-src="author.avatar_url"
:img-alt="author.name"
- :img-size="40"
+ :img-size="32"
+ :img-css-classes="'gl-mr-0!' /* NOTE: this is needed only while we migrate user-avatar-image to GlAvatar (https://gitlab.com/groups/gitlab-org/-/epics/7731) */"
/>
</div>
<div class="timeline-content w-100">
diff --git a/app/assets/javascripts/notes/components/discussion_counter.vue b/app/assets/javascripts/notes/components/discussion_counter.vue
index 33819c78c0f..f746f7ed0ed 100644
--- a/app/assets/javascripts/notes/components/discussion_counter.vue
+++ b/app/assets/javascripts/notes/components/discussion_counter.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTooltipDirective, GlIcon, GlButton, GlButtonGroup } from '@gitlab/ui';
+import { GlTooltipDirective, GlButton, GlButtonGroup } from '@gitlab/ui';
import { mapGetters, mapActions } from 'vuex';
import { __ } from '~/locale';
import discussionNavigation from '../mixins/discussion_navigation';
@@ -9,46 +9,41 @@ export default {
GlTooltip: GlTooltipDirective,
},
components: {
- GlIcon,
GlButton,
GlButtonGroup,
},
mixins: [discussionNavigation],
+ props: {
+ blocksMerge: {
+ type: Boolean,
+ required: true,
+ },
+ },
computed: {
...mapGetters([
- 'getUserData',
'getNoteableData',
'resolvableDiscussionsCount',
'unresolvedDiscussionsCount',
- 'discussions',
+ 'allResolvableDiscussions',
]),
- isLoggedIn() {
- return this.getUserData.id;
- },
allResolved() {
return this.unresolvedDiscussionsCount === 0;
},
- resolveAllDiscussionsIssuePath() {
- return this.getNoteableData.create_issue_to_resolve_discussions_path;
- },
- toggeableDiscussions() {
- return this.discussions.filter((discussion) => !discussion.individual_note);
- },
allExpanded() {
- return this.toggeableDiscussions.every((discussion) => discussion.expanded);
- },
- lineResolveClass() {
- return this.allResolved ? 'line-resolve-btn is-active' : 'line-resolve-text';
+ return this.allResolvableDiscussions.every((discussion) => discussion.expanded);
},
toggleThreadsLabel() {
return this.allExpanded ? __('Collapse all threads') : __('Expand all threads');
},
+ resolveAllDiscussionsIssuePath() {
+ return this.getNoteableData.create_issue_to_resolve_discussions_path;
+ },
},
methods: {
...mapActions(['setExpandDiscussions']),
handleExpandDiscussions() {
this.setExpandDiscussions({
- discussionIds: this.toggeableDiscussions.map((discussion) => discussion.id),
+ discussionIds: this.allResolvableDiscussions.map((discussion) => discussion.id),
expanded: !this.allExpanded,
});
},
@@ -60,21 +55,61 @@ export default {
<div
v-if="resolvableDiscussionsCount > 0"
ref="discussionCounter"
- class="line-resolve-all-container full-width-mobile gl-display-flex d-sm-flex"
+ class="gl-display-flex discussions-counter"
>
- <div class="line-resolve-all">
- <span :class="lineResolveClass">
- <template v-if="allResolved">
- <gl-icon name="check-circle-filled" />
- {{ __('All threads resolved') }}
- </template>
- <template v-else>
- {{ n__('%d unresolved thread', '%d unresolved threads', unresolvedDiscussionsCount) }}
- </template>
- </span>
+ <div
+ class="gl-display-flex gl-align-items-center gl-pl-4 gl-rounded-base gl-mr-3"
+ :class="{
+ 'gl-bg-orange-50': blocksMerge && !allResolved,
+ 'gl-bg-gray-50': !blocksMerge || allResolved,
+ 'gl-pr-4': allResolved,
+ 'gl-pr-2': !allResolved,
+ }"
+ data-testid="discussions-counter-text"
+ >
+ <template v-if="allResolved">
+ {{ __('All threads resolved!') }}
+ </template>
+ <template v-else>
+ {{ n__('%d unresolved thread', '%d unresolved threads', unresolvedDiscussionsCount) }}
+ <gl-button-group class="gl-ml-3">
+ <gl-button
+ v-gl-tooltip.hover
+ :title="__('Jump to previous unresolved thread')"
+ :aria-label="__('Jump to previous unresolved thread')"
+ class="discussion-previous-btn gl-rounded-base! gl-px-2!"
+ data-track-action="click_button"
+ data-track-label="mr_previous_unresolved_thread"
+ data-track-property="click_previous_unresolved_thread_top"
+ icon="angle-up"
+ category="tertiary"
+ @click="jumpToPreviousDiscussion"
+ />
+ <gl-button
+ v-gl-tooltip.hover
+ :title="__('Jump to next unresolved thread')"
+ :aria-label="__('Jump to next unresolved thread')"
+ class="discussion-next-btn gl-rounded-base! gl-px-2!"
+ data-track-action="click_button"
+ data-track-label="mr_next_unresolved_thread"
+ data-track-property="click_next_unresolved_thread_top"
+ icon="angle-down"
+ category="tertiary"
+ @click="jumpToNextDiscussion"
+ />
+ </gl-button-group>
+ </template>
</div>
<gl-button-group>
<gl-button
+ v-gl-tooltip
+ :title="toggleThreadsLabel"
+ :aria-label="toggleThreadsLabel"
+ class="toggle-all-discussions-btn"
+ :icon="allExpanded ? 'collapse' : 'expand'"
+ @click="handleExpandDiscussions"
+ />
+ <gl-button
v-if="resolveAllDiscussionsIssuePath && !allResolved"
v-gl-tooltip
:href="resolveAllDiscussionsIssuePath"
@@ -83,26 +118,6 @@ export default {
class="new-issue-for-discussion discussion-create-issue-btn"
icon="issue-new"
/>
- <gl-button
- v-if="isLoggedIn && !allResolved"
- v-gl-tooltip
- :title="__('Jump to next unresolved thread')"
- :aria-label="__('Jump to next unresolved thread')"
- class="discussion-next-btn"
- data-track-action="click_button"
- data-track-label="mr_next_unresolved_thread"
- data-track-property="click_next_unresolved_thread_top"
- icon="comment-next"
- @click="jumpToNextDiscussion"
- />
- <gl-button
- v-gl-tooltip
- :title="toggleThreadsLabel"
- :aria-label="toggleThreadsLabel"
- class="toggle-all-discussions-btn"
- :icon="allExpanded ? 'angle-up' : 'angle-down'"
- @click="handleExpandDiscussions"
- />
</gl-button-group>
</div>
</template>
diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue
index fe17a061c0a..6c9bc4461c2 100644
--- a/app/assets/javascripts/notes/components/note_body.vue
+++ b/app/assets/javascripts/notes/components/note_body.vue
@@ -4,6 +4,7 @@ import { GlSafeHtmlDirective } from '@gitlab/ui';
import { escape } from 'lodash';
import { mapActions, mapGetters, mapState } from 'vuex';
+import { __ } from '~/locale';
import '~/behaviors/markdown/render_gfm';
import Suggestions from '~/vue_shared/components/markdown/suggestions.vue';
import autosave from '../mixins/autosave';
@@ -69,6 +70,9 @@ export default {
noteBody() {
return this.note.note;
},
+ saveButtonTitle() {
+ return this.note.confidential ? __('Save internal note') : __('Save comment');
+ },
hasSuggestion() {
return this.note.suggestions && this.note.suggestions.length;
},
@@ -180,6 +184,7 @@ export default {
:note-id="note.id"
:line="line"
:note="note"
+ :save-button-title="saveButtonTitle"
:help-page-path="helpPagePath"
:discussion="discussion"
:resolve-discussion="note.resolve_discussion"
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index c1e763d81ee..5dd032abd72 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -8,9 +8,11 @@ import markdownField from '~/vue_shared/components/markdown/field.vue';
import eventHub from '../event_hub';
import issuableStateMixin from '../mixins/issuable_state';
import resolvable from '../mixins/resolvable';
+import { COMMENT_FORM } from '../i18n';
import CommentFieldLayout from './comment_field_layout.vue';
export default {
+ i18n: COMMENT_FORM,
name: 'NoteForm',
components: {
markdownField,
@@ -133,6 +135,11 @@ export default {
.some((n) => n.current_user?.can_resolve_discussion) || this.isDraft
);
},
+ textareaPlaceholder() {
+ return this.discussionNote?.confidential
+ ? this.$options.i18n.bodyPlaceholderInternal
+ : this.$options.i18n.bodyPlaceholder;
+ },
noteHash() {
if (this.noteId) {
return `#note_${this.noteId}`;
@@ -350,7 +357,7 @@ export default {
data-qa-selector="reply_field"
dir="auto"
:aria-label="__('Reply to comment')"
- :placeholder="__('Write a comment or drag your files here…')"
+ :placeholder="textareaPlaceholder"
@keydown.meta.enter="handleKeySubmit()"
@keydown.ctrl.enter="handleKeySubmit()"
@keydown.exact.up="editMyLastNote()"
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index 11b427b9346..1ad9d593ccc 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -1,6 +1,7 @@
<script>
import {
GlIcon,
+ GlBadge,
GlLoadingIcon,
GlTooltipDirective,
GlSafeHtmlDirective as SafeHtml,
@@ -10,8 +11,6 @@ import { __, s__ } from '~/locale';
import timeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserNameWithStatus from '~/sidebar/components/assignees/user_name_with_status.vue';
-import { NOTEABLE_TYPE_MAPPING } from '../constants';
-
export default {
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
components: {
@@ -19,6 +18,7 @@ export default {
GitlabTeamMemberBadge: () =>
import('ee_component/vue_shared/components/user_avatar/badges/gitlab_team_member_badge.vue'),
GlIcon,
+ GlBadge,
GlLoadingIcon,
UserNameWithStatus,
},
@@ -111,13 +111,7 @@ export default {
return this.author.name;
},
noteConfidentialityTooltip() {
- if (
- this.noteableType === NOTEABLE_TYPE_MAPPING.Issue ||
- this.noteableType === NOTEABLE_TYPE_MAPPING.MergeRequest
- ) {
- return s__('Notes|This comment is confidential and only visible to project members');
- }
- return s__('Notes|This comment is confidential and only visible to group members');
+ return s__('Notes|This internal note will always remain confidential');
},
},
mounted() {
@@ -236,15 +230,16 @@ export default {
</a>
<time-ago-tooltip v-else ref="noteTimestamp" :time="createdAt" tooltip-placement="bottom" />
</template>
- <gl-icon
+ <gl-badge
v-if="isConfidential"
v-gl-tooltip:tooltipcontainer.bottom
- data-testid="confidentialIndicator"
- name="eye-slash"
- :size="16"
+ data-testid="internalNoteIndicator"
+ variant="warning"
+ size="sm"
:title="noteConfidentialityTooltip"
- class="gl-ml-1 gl-text-orange-700 align-middle"
- />
+ >
+ {{ __('Internal note') }}
+ </gl-badge>
<slot name="extra-controls"></slot>
<gl-loading-icon
v-if="showSpinner"
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 000eb3bdff3..0f5a517a4c5 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -7,7 +7,7 @@ import { clearDraft, getDiscussionReplyKey } from '~/lib/utils/autosave';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { ignoreWhilePending } from '~/lib/utils/ignore_while_pending';
-import { s__, __ } from '~/locale';
+import { s__, __, sprintf } from '~/locale';
import diffLineNoteFormMixin from '~/notes/mixins/diff_line_note_form';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import userAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -95,6 +95,9 @@ export default {
isLoggedIn() {
return isLoggedIn();
},
+ commentType() {
+ return this.discussion.confidential ? __('internal note') : __('comment');
+ },
autosaveKey() {
return getDiscussionReplyKey(this.firstNote.noteable_type, this.discussion.id);
},
@@ -104,6 +107,9 @@ export default {
firstNote() {
return this.discussion.notes.slice(0, 1)[0];
},
+ saveButtonTitle() {
+ return this.discussion.confidential ? __('Reply internally') : __('Comment');
+ },
shouldShowJumpToNextDiscussion() {
return this.showJumpToNextDiscussion(this.discussionsByDiffOrder ? 'diff' : 'discussion');
},
@@ -174,9 +180,15 @@ export default {
},
cancelReplyForm: ignoreWhilePending(async function cancelReplyForm(shouldConfirm, isDirty) {
if (shouldConfirm && isDirty) {
- const msg = s__('Notes|Are you sure you want to cancel creating this comment?');
+ const msg = sprintf(
+ s__('Notes|Are you sure you want to cancel creating this %{commentType}?'),
+ { commentType: this.commentType },
+ );
- const confirmed = await confirmAction(msg);
+ const confirmed = await confirmAction(msg, {
+ primaryBtnText: __('Discard changes'),
+ cancelBtnText: __('Continue editing'),
+ });
if (!confirmed) {
return;
@@ -308,7 +320,7 @@ export default {
ref="noteForm"
:discussion="discussion"
:line="diffLine"
- save-button-title="Comment"
+ :save-button-title="saveButtonTitle"
:autosave-key="autosaveKey"
@handleFormUpdateAddToReview="addReplyToReview"
@handleFormUpdate="saveReply"
diff --git a/app/assets/javascripts/notes/components/noteable_note.vue b/app/assets/javascripts/notes/components/noteable_note.vue
index a2fbb242222..cda22b58c5b 100644
--- a/app/assets/javascripts/notes/components/noteable_note.vue
+++ b/app/assets/javascripts/notes/components/noteable_note.vue
@@ -108,6 +108,9 @@ export default {
author() {
return this.note.author;
},
+ commentType() {
+ return this.note.confidential ? __('internal note') : __('comment');
+ },
classNameBindings() {
return {
[`note-row-${this.note.id}`]: true,
@@ -246,14 +249,19 @@ export default {
this.$emit('handleEdit');
},
async deleteHandler() {
- const typeOfComment = this.note.isDraft ? __('pending comment') : __('comment');
+ let { commentType } = this;
+
+ if (this.note.isDraft) {
+ // Draft internal notes (i.e. MR review comments) are not supported.
+ commentType = __('pending comment');
+ }
- const msg = sprintf(__('Are you sure you want to delete this %{typeOfComment}?'), {
- typeOfComment,
+ const msg = sprintf(__('Are you sure you want to delete this %{commentType}?'), {
+ commentType,
});
const confirmed = await confirmAction(msg, {
primaryBtnVariant: 'danger',
- primaryBtnText: __('Delete Comment'),
+ primaryBtnText: this.note.confidential ? __('Delete Internal Note') : __('Delete Comment'),
});
if (confirmed) {
@@ -356,7 +364,9 @@ export default {
isDirty,
}) {
if (shouldConfirm && isDirty) {
- const msg = __('Are you sure you want to cancel editing this comment?');
+ const msg = sprintf(__('Are you sure you want to cancel editing this %{commentType}?'), {
+ commentType: this.commentType,
+ });
const confirmed = await confirmAction(msg, {
primaryBtnText: __('Cancel editing'),
primaryBtnVariant: 'danger',
diff --git a/app/assets/javascripts/notes/i18n.js b/app/assets/javascripts/notes/i18n.js
index 951fa9733d4..4c0ee81bec0 100644
--- a/app/assets/javascripts/notes/i18n.js
+++ b/app/assets/javascripts/notes/i18n.js
@@ -6,19 +6,26 @@ export const COMMENT_FORM = {
),
note: __('Note'),
comment: __('Comment'),
+ internalComment: __('Add internal note'),
issue: __('issue'),
startThread: __('Start thread'),
+ startInternalThread: __('Start internal thread'),
mergeRequest: __('merge request'),
epic: __('epic'),
bodyPlaceholder: __('Write a comment or drag your files here…'),
- confidential: s__('Notes|Make this comment confidential'),
+ bodyPlaceholderInternal: __('Write an internal note or drag your files here…'),
+ confidential: s__('Notes|Make this an internal note'),
confidentialVisibility: s__(
- 'Notes|Confidential comments are only visible to members with the role of Reporter or higher',
+ 'Notes|Internal notes are only visible to the author, assignees, and members with the role of Reporter or higher',
),
discussionThatNeedsResolution: __(
'Discuss a specific suggestion or question that needs to be resolved.',
),
+ internalDiscussionThatNeedsResolution: __(
+ 'Discuss a specific suggestion or question internally that needs to be resolved.',
+ ),
discussion: __('Discuss a specific suggestion or question.'),
+ internalDiscussion: __('Discuss a specific suggestion or question internally.'),
actionButtonWithNote: __('%{actionText} & %{openOrClose} %{noteable}'),
actionButton: {
withNote: {
@@ -32,7 +39,10 @@ export const COMMENT_FORM = {
},
submitButton: {
startThread: __('Start thread'),
+ startInternalThread: __('Start internal thread'),
comment: __('Comment'),
+ internalComment: __('Add internal note'),
commentHelp: __('Add a general comment to this %{noteableDisplayName}.'),
+ internalCommentHelp: __('Add a confidential internal note to this %{noteableDisplayName}.'),
},
};
diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js
index 204e704e504..0cfc17a6ae9 100644
--- a/app/assets/javascripts/notes/stores/actions.js
+++ b/app/assets/javascripts/notes/stores/actions.js
@@ -17,6 +17,7 @@ import { mergeUrlParams } from '~/lib/utils/url_utility';
import sidebarTimeTrackingEventHub from '~/sidebar/event_hub';
import TaskList from '~/task_list';
import mrWidgetEventHub from '~/vue_merge_request_widget/event_hub';
+import SidebarStore from '~/sidebar/stores/sidebar_store';
import * as constants from '../constants';
import eventHub from '../event_hub';
import * as types from './mutation_types';
@@ -369,7 +370,14 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
}
const processQuickActions = (res) => {
- const { errors: { commands_only: message } = { commands_only: null } } = res;
+ const {
+ errors: { commands_only: commandsOnly, command_names: commandNames } = {
+ commands_only: null,
+ command_names: [],
+ },
+ } = res;
+ let message = commandsOnly;
+
/*
The following reply means that quick actions have been successfully applied:
@@ -387,6 +395,13 @@ export const saveNote = ({ commit, dispatch }, noteData) => {
confidentialWidget.setConfidentiality();
}
+ const commands = ['approve', 'merge', 'assign_reviewer', 'assign'];
+ const commandUpdatesAttentionRequest = commandNames[0].some((c) => commands.includes(c));
+
+ if (commandUpdatesAttentionRequest && SidebarStore.singleton.currentUserHasAttention) {
+ message = sprintf(__('%{message}. Your attention request was removed.'), { message });
+ }
+
$('.js-gfm-input').trigger('clear-commands-cache.atwho');
createFlash({
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index a710ac0ccf5..1fe82d96435 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -1,5 +1,6 @@
import { flattenDeep, clone } from 'lodash';
-import { statusBoxState } from '~/issuable/components/status_box.vue';
+import { match } from '~/diffs/utils/diff_file';
+import { badgeState } from '~/issuable/components/status_box.vue';
import { isInMRPage } from '~/lib/utils/common_utils';
import * as constants from '../constants';
import { collapseSystemNotes } from './collapse_utils';
@@ -84,8 +85,7 @@ export const getBlockedByIssues = (state) => state.noteableData.blocked_by_issue
export const userCanReply = (state) => Boolean(state.noteableData.current_user.can_create_note);
-export const openState = (state) =>
- isInMRPage() ? statusBoxState.state : state.noteableData.state;
+export const openState = (state) => (isInMRPage() ? badgeState.state : state.noteableData.state);
export const getUserData = (state) => state.userData || {};
@@ -179,29 +179,42 @@ export const unresolvedDiscussionsIdsByDate = (state, getters) =>
// Sorts the array of resolvable yet unresolved discussions by
// comparing file names first. If file names are the same, compares
// line numbers.
-export const unresolvedDiscussionsIdsByDiff = (state, getters) =>
- getters.allResolvableDiscussions
+export const unresolvedDiscussionsIdsByDiff = (state, getters, allState) => {
+ const authoritativeFiles = allState.diffs.diffFiles;
+
+ return getters.allResolvableDiscussions
.filter((d) => !d.resolved && d.active)
.sort((a, b) => {
+ let order = 0;
+
if (!a.diff_file || !b.diff_file) {
- return 0;
+ return order;
}
- // Get file names comparison result
- const filenameComparison = a.diff_file.file_path.localeCompare(b.diff_file.file_path);
+ const authoritativeA = authoritativeFiles.find((source) =>
+ match({ fileA: source, fileB: a.diff_file, mode: 'mr' }),
+ );
+ const authoritativeB = authoritativeFiles.find((source) =>
+ match({ fileA: source, fileB: b.diff_file, mode: 'mr' }),
+ );
+
+ if (authoritativeA && authoritativeB) {
+ order = authoritativeA.order - authoritativeB.order;
+ }
// Get the line numbers, to compare within the same file
const aLines = [a.position.new_line, a.position.old_line];
const bLines = [b.position.new_line, b.position.old_line];
- return filenameComparison < 0 ||
- (filenameComparison === 0 &&
+ return order < 0 ||
+ (order === 0 &&
// .max() because one of them might be zero (if removed/added)
Math.max(aLines[0], aLines[1]) < Math.max(bLines[0], bLines[1]))
? -1
: 1;
})
.map((d) => d.id);
+};
export const resolvedDiscussionCount = (state, getters) => {
const resolvedMap = getters.resolvedDiscussionsById;
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/delete_modal.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/delete_modal.vue
index 7a8a1bbcf09..2da8ca2d8a8 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/delete_modal.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/delete_modal.vue
@@ -83,11 +83,13 @@ export default {
modal-id="delete-tag-modal"
ok-variant="danger"
size="sm"
- :action-primary="{
+ :action-primary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
text: __('Delete'),
attributes: [{ variant: 'danger' }, { disabled: disablePrimaryButton }],
- }"
- :action-cancel="{ text: __('Cancel') }"
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: __('Cancel'),
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@primary="$emit('confirmDelete')"
@cancel="$emit('cancelDelete')"
@change="projectPath = ''"
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue
index 7659ba5f9ea..9e8eb92d87a 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue
@@ -168,7 +168,9 @@ export default {
<div>
<persisted-search
class="gl-mb-5"
- :sortable-fields="[$options.searchConfig.NAME_SORT_FIELD]"
+ :sortable-fields="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ $options.searchConfig.NAME_SORT_FIELD,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:default-order="$options.searchConfig.NAME_SORT_FIELD.orderBy"
default-sort="asc"
@update="handleSearchUpdate"
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 1f52e319ad0..3ae69731537 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,7 +1,9 @@
<script>
-import { GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { GlIcon, GlPopover, GlLink, GlSprintf } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { timeTilRun } from '../../utils';
import {
- CLEANUP_TIMED_OUT_ERROR_MESSAGE,
+ PARTIAL_CLEANUP_CONTINUE_MESSAGE,
CLEANUP_STATUS_SCHEDULED,
CLEANUP_STATUS_ONGOING,
CLEANUP_STATUS_UNFINISHED,
@@ -15,9 +17,9 @@ export default {
name: 'CleanupStatus',
components: {
GlIcon,
- },
- directives: {
- GlTooltip: GlTooltipDirective,
+ GlPopover,
+ GlLink,
+ GlSprintf,
},
props: {
status: {
@@ -29,12 +31,17 @@ export default {
);
},
},
+ expirationPolicy: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
},
i18n: {
CLEANUP_STATUS_SCHEDULED,
CLEANUP_STATUS_ONGOING,
CLEANUP_STATUS_UNFINISHED,
- CLEANUP_TIMED_OUT_ERROR_MESSAGE,
+ PARTIAL_CLEANUP_CONTINUE_MESSAGE,
},
computed: {
showStatus() {
@@ -46,26 +53,57 @@ export default {
statusText() {
return this.$options.i18n[`CLEANUP_STATUS_${this.status}`];
},
- expireIconClass() {
- return this.failedDelete ? 'gl-text-orange-500' : '';
+ calculatedTimeTilNextRun() {
+ return timeTilRun(this.expirationPolicy?.next_run);
},
},
+ statusPopoverOptions: {
+ triggers: 'hover',
+ placement: 'top',
+ },
+ cleanupPolicyHelpPage: helpPagePath(
+ 'user/packages/container_registry/reduce_container_registry_storage.html',
+ { anchor: 'how-the-cleanup-policy-works' },
+ ),
};
</script>
<template>
- <div v-if="showStatus" class="gl-display-inline-flex gl-align-items-center">
- <gl-icon name="expire" data-testid="main-icon" :class="expireIconClass" />
+ <div
+ v-if="showStatus"
+ id="status-popover-container"
+ class="gl-display-inline-flex gl-align-items-center"
+ >
+ <div class="gl-display-inline-flex gl-align-items-center">
+ <gl-icon name="expire" data-testid="main-icon" />
+ </div>
<span class="gl-mx-2">
{{ statusText }}
</span>
<gl-icon
v-if="failedDelete"
- v-gl-tooltip="{ title: $options.i18n.CLEANUP_TIMED_OUT_ERROR_MESSAGE }"
+ id="status-info"
:size="14"
- class="gl-text-black-normal"
+ class="gl-text-gray-500"
data-testid="extra-info"
- name="information"
+ name="information-o"
/>
+ <gl-popover
+ target="status-info"
+ container="status-popover-container"
+ v-bind="$options.statusPopoverOptions"
+ >
+ <template #title>
+ {{ $options.i18n.CLEANUP_STATUS_UNFINISHED }}
+ </template>
+ <gl-sprintf :message="$options.i18n.PARTIAL_CLEANUP_CONTINUE_MESSAGE">
+ <template #time>{{ calculatedTimeTilNextRun }}</template
+ ><template #link="{ content }"
+ ><gl-link :href="$options.cleanupPolicyHelpPage" class="gl-font-sm" target="_blank">{{
+ content
+ }}</gl-link></template
+ >
+ </gl-sprintf>
+ </gl-popover>
</div>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list.vue
index 5bd13322ebb..6f1f67e251f 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/image_list.vue
@@ -22,6 +22,11 @@ export default {
type: Object,
required: true,
},
+ expirationPolicy: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
},
computed: {
showPagination() {
@@ -38,6 +43,7 @@ export default {
:key="index"
:item="listItem"
:metadata-loading="metadataLoading"
+ :expiration-policy="expirationPolicy"
@delete="$emit('delete', $event)"
/>
<div class="gl-display-flex gl-justify-content-center">
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 484903354e8..d76a8245b63 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
@@ -6,12 +6,10 @@ import { n__ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import {
- ASYNC_DELETE_IMAGE_ERROR_MESSAGE,
LIST_DELETE_BUTTON_DISABLED,
LIST_DELETE_BUTTON_DISABLED_FOR_MIGRATION,
REMOVE_REPOSITORY_LABEL,
ROW_SCHEDULED_FOR_DELETION,
- CLEANUP_TIMED_OUT_ERROR_MESSAGE,
IMAGE_DELETE_SCHEDULED_STATUS,
IMAGE_FAILED_DELETED_STATUS,
IMAGE_MIGRATING_STATE,
@@ -45,6 +43,11 @@ export default {
default: false,
required: false,
},
+ expirationPolicy: {
+ type: Object,
+ default: () => ({}),
+ required: false,
+ },
},
i18n: {
REMOVE_REPOSITORY_LABEL,
@@ -73,15 +76,6 @@ export default {
this.item.tagsCount,
);
},
- warningIconText() {
- if (this.failedDelete) {
- return ASYNC_DELETE_IMAGE_ERROR_MESSAGE;
- }
- if (this.item.expirationPolicyStartedAt) {
- return CLEANUP_TIMED_OUT_ERROR_MESSAGE;
- }
- return null;
- },
imageName() {
return this.item.name ? this.item.path : `${this.item.path}/ ${ROOT_IMAGE_TEXT}`;
},
@@ -140,6 +134,7 @@ export default {
v-if="item.expirationPolicyCleanupStatus"
class="ml-2"
:status="item.expirationPolicyCleanupStatus"
+ :expiration-policy="expirationPolicy"
/>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
index 154e176dc6e..4ffd8390e4d 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue
@@ -7,7 +7,6 @@ import TitleArea from '~/vue_shared/components/registry/title_area.vue';
import {
CONTAINER_REGISTRY_TITLE,
- LIST_INTRO_TEXT,
EXPIRATION_POLICY_WILL_RUN_IN,
EXPIRATION_POLICY_DISABLED_TEXT,
SET_UP_CLEANUP,
@@ -87,19 +86,12 @@ export default {
? sprintf(EXPIRATION_POLICY_WILL_RUN_IN, { time: this.timeTillRun })
: EXPIRATION_POLICY_DISABLED_TEXT;
},
- infoMessages() {
- return [{ text: LIST_INTRO_TEXT, link: this.helpPagePath }];
- },
},
};
</script>
<template>
- <title-area
- :title="$options.i18n.CONTAINER_REGISTRY_TITLE"
- :info-messages="infoMessages"
- :metadata-loading="metadataLoading"
- >
+ <title-area :title="$options.i18n.CONTAINER_REGISTRY_TITLE" :metadata-loading="metadataLoading">
<template #right-actions>
<slot name="commands"></slot>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/details.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/details.js
index 3c7f7ca9aa8..2a58933cd64 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/details.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/details.js
@@ -87,7 +87,7 @@ export const CLEANUP_DISABLED_TOOLTIP = s__(
export const CLEANUP_STATUS_SCHEDULED = s__('ContainerRegistry|Cleanup will run soon');
export const CLEANUP_STATUS_ONGOING = s__('ContainerRegistry|Cleanup is ongoing');
-export const CLEANUP_STATUS_UNFINISHED = s__('ContainerRegistry|Cleanup timed out');
+export const CLEANUP_STATUS_UNFINISHED = s__('ContainerRegistry|Partial cleanup complete');
export const DETAILS_DELETE_IMAGE_ERROR_MESSAGE = s__(
'ContainerRegistry|Something went wrong while scheduling the image for deletion.',
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
index e584da23edb..9d0ecfd2dcb 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/constants/expiration_policies.js
@@ -10,7 +10,7 @@ export const DELETE_ALERT_TITLE = s__('ContainerRegistry|Some tags were not dele
export const DELETE_ALERT_LINK_TEXT = s__(
'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}',
);
-export const CLEANUP_TIMED_OUT_ERROR_MESSAGE = s__(
- 'ContainerRegistry|Cleanup timed out before it could delete all tags',
+export const PARTIAL_CLEANUP_CONTINUE_MESSAGE = s__(
+ 'ContainerRegistry|The cleanup will continue within %{time}. %{linkStart}Learn more%{linkEnd}',
);
export const SET_UP_CLEANUP = s__('ContainerRegistry|Set up cleanup');
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 c7022d6070f..ceaf8a65a10 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
@@ -8,9 +8,6 @@ export const CONNECTION_ERROR_TITLE = s__('ContainerRegistry|Docker connection e
export const CONNECTION_ERROR_MESSAGE = s__(
`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}.`,
);
-export const LIST_INTRO_TEXT = s__(
- `ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}`,
-);
export const LIST_DELETE_BUTTON_DISABLED = s__(
'ContainerRegistry|Missing or insufficient permission, delete button disabled',
);
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_details.query.graphql b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_details.query.graphql
index 916740f41b8..e2036d9e63d 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_details.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_details.query.graphql
@@ -1,4 +1,4 @@
-query getContainerRepositoryDetails($id: ID!) {
+query getContainerRepositoryDetails($id: ContainerRepositoryID!) {
containerRepository(id: $id) {
id
name
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql
index f1f67b98407..1faa9dec795 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_metadata.query.graphql
@@ -1,4 +1,4 @@
-query getContainerRepositoryMetadata($id: ID!) {
+query getContainerRepositoryMetadata($id: ContainerRepositoryID!) {
containerRepository(id: $id) {
id
tagsCount
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
index 8c577cc7b17..e57ac2a9efe 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
@@ -1,7 +1,7 @@
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
query getContainerRepositoryTags(
- $id: ID!
+ $id: ContainerRepositoryID!
$first: Int
$last: Int
$after: String
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
index d1cab406984..c1bd71de646 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue
@@ -336,6 +336,7 @@ export default {
:images="images"
:metadata-loading="$apollo.queries.additionalDetails.loading"
:page-info="pageInfo"
+ :expiration-policy="config.expirationPolicy"
@delete="deleteImage"
@prev-page="fetchPreviousPage"
@next-page="fetchNextPage"
@@ -370,7 +371,10 @@ export default {
ref="deleteModal"
size="sm"
modal-id="delete-image-modal"
- :action-primary="{ text: __('Remove'), attributes: { variant: 'danger' } }"
+ :action-primary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: __('Remove'),
+ attributes: { variant: 'danger' },
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@primary="doDelete"
@cancel="track('cancel_delete')"
>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/utils.js b/app/assets/javascripts/packages_and_registries/container_registry/explorer/utils.js
new file mode 100644
index 00000000000..ffdaf9f2f17
--- /dev/null
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/utils.js
@@ -0,0 +1,8 @@
+import { approximateDuration, calculateRemainingMilliseconds } from '~/lib/utils/datetime_utility';
+
+export const timeTilRun = (time) => {
+ if (!time) return '';
+
+ const difference = calculateRemainingMilliseconds(time);
+ return approximateDuration(difference / 1000);
+};
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
index 67c2ca02d20..1faff1ff4de 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/app.vue
@@ -16,10 +16,7 @@ import Api from '~/api';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TitleArea from '~/vue_shared/components/registry/title_area.vue';
import ManifestsList from '~/packages_and_registries/dependency_proxy/components/manifests_list.vue';
-import {
- DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
- DEPENDENCY_PROXY_DOCS_PATH,
-} from '~/packages_and_registries/settings/group/constants';
+import { DEPENDENCY_PROXY_DOCS_PATH } from '~/packages_and_registries/settings/group/constants';
import { GRAPHQL_PAGE_SIZE } from '~/packages_and_registries/dependency_proxy/constants';
import getDependencyProxyDetailsQuery from '~/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql';
@@ -42,11 +39,8 @@ export default {
directives: {
GlModalDirective,
},
- inject: ['groupPath', 'groupId', 'dependencyProxyAvailable', 'noManifestsIllustration'],
+ inject: ['groupPath', 'groupId', 'noManifestsIllustration'],
i18n: {
- proxyNotAvailableText: s__(
- 'DependencyProxy|Dependency Proxy feature is limited to public groups for now.',
- ),
proxyImagePrefix: s__('DependencyProxy|Dependency Proxy image prefix'),
copyImagePrefixText: s__('DependencyProxy|Copy prefix'),
blobCountAndSize: s__('DependencyProxy|Contains %{count} blobs of images (%{size})'),
@@ -80,32 +74,20 @@ export default {
apollo: {
group: {
query: getDependencyProxyDetailsQuery,
- skip() {
- return !this.dependencyProxyAvailable;
- },
variables() {
return this.queryVariables;
},
},
},
computed: {
- infoMessages() {
- return [
- {
- text: DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
- link: DEPENDENCY_PROXY_DOCS_PATH,
- },
- ];
- },
-
queryVariables() {
return { fullPath: this.groupPath, first: GRAPHQL_PAGE_SIZE };
},
pageInfo() {
- return this.group.dependencyProxyManifests.pageInfo;
+ return this.group.dependencyProxyManifests?.pageInfo;
},
manifests() {
- return this.group.dependencyProxyManifests.nodes;
+ return this.group.dependencyProxyManifests?.nodes;
},
modalTitleWithCount() {
return sprintf(
@@ -132,7 +114,10 @@ export default {
);
},
showDeleteDropdown() {
- return this.group.dependencyProxyBlobCount > 0;
+ return this.group.dependencyProxyManifests?.nodes.length > 0;
+ },
+ showDependencyProxyImagePrefix() {
+ return this.group.dependencyProxyImagePrefix?.length > 0;
},
},
methods: {
@@ -181,7 +166,7 @@ export default {
>
{{ deleteCacheAlertMessage }}
</gl-alert>
- <title-area :title="$options.i18n.pageTitle" :info-messages="infoMessages">
+ <title-area :title="$options.i18n.pageTitle">
<template v-if="showDeleteDropdown" #right-actions>
<gl-dropdown
icon="ellipsis_v"
@@ -198,41 +183,34 @@ export default {
</gl-dropdown>
</template>
</title-area>
- <gl-alert
- v-if="!dependencyProxyAvailable"
- :dismissible="false"
- data-testid="proxy-not-available"
- >
- {{ $options.i18n.proxyNotAvailableText }}
- </gl-alert>
- <gl-skeleton-loader v-else-if="$apollo.queries.group.loading" />
-
- <div v-else data-testid="main-area">
- <gl-form-group :label="$options.i18n.proxyImagePrefix">
- <gl-form-input-group
- readonly
- :value="group.dependencyProxyImagePrefix"
- class="gl-layout-w-limited"
- data-testid="proxy-url"
- >
- <template #append>
- <clipboard-button
- :text="group.dependencyProxyImagePrefix"
- :title="$options.i18n.copyImagePrefixText"
- />
- </template>
- </gl-form-input-group>
- <template #description>
- <span data-qa-selector="dependency_proxy_count" data-testid="proxy-count">
- <gl-sprintf :message="$options.i18n.blobCountAndSize">
- <template #count>{{ group.dependencyProxyBlobCount }}</template>
- <template #size>{{ group.dependencyProxyTotalSize }}</template>
- </gl-sprintf>
- </span>
+ <gl-form-group v-if="showDependencyProxyImagePrefix" :label="$options.i18n.proxyImagePrefix">
+ <gl-form-input-group
+ readonly
+ :value="group.dependencyProxyImagePrefix"
+ class="gl-layout-w-limited"
+ data-testid="proxy-url"
+ >
+ <template #append>
+ <clipboard-button
+ :text="group.dependencyProxyImagePrefix"
+ :title="$options.i18n.copyImagePrefixText"
+ />
</template>
- </gl-form-group>
+ </gl-form-input-group>
+ <template #description>
+ <span data-qa-selector="dependency_proxy_count" data-testid="proxy-count">
+ <gl-sprintf :message="$options.i18n.blobCountAndSize">
+ <template #count>{{ group.dependencyProxyBlobCount }}</template>
+ <template #size>{{ group.dependencyProxyTotalSize }}</template>
+ </gl-sprintf>
+ </span>
+ </template>
+ </gl-form-group>
+ <gl-skeleton-loader v-if="$apollo.queries.group.loading" />
+
+ <div v-else data-testid="main-area">
<manifests-list
v-if="manifests && manifests.length"
:manifests="manifests"
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifest_row.vue b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifest_row.vue
index 78880b6e3f4..1bbd0c32dc4 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifest_row.vue
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/components/manifest_row.vue
@@ -1,5 +1,6 @@
<script>
-import { GlSprintf } from '@gitlab/ui';
+import { GlIcon, GlSprintf } from '@gitlab/ui';
+import { MANIFEST_PENDING_DESTRUCTION_STATUS } from '~/packages_and_registries/dependency_proxy/constants';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import { s__ } from '~/locale';
@@ -7,6 +8,7 @@ import { s__ } from '~/locale';
export default {
name: 'ManifestRow',
components: {
+ GlIcon,
GlSprintf,
ListItem,
TimeagoTooltip,
@@ -24,17 +26,31 @@ export default {
version() {
return this.manifest?.imageName.split(':')[1];
},
+ isErrorStatus() {
+ return this.manifest?.status === MANIFEST_PENDING_DESTRUCTION_STATUS;
+ },
+ disabledRowStyle() {
+ return this.isErrorStatus ? 'gl-font-weight-normal gl-text-gray-500' : '';
+ },
},
i18n: {
cachedAgoMessage: s__('DependencyProxy|Cached %{time}'),
+ scheduledForDeletion: s__('DependencyProxy|Scheduled for deletion'),
},
};
</script>
<template>
- <list-item>
- <template #left-primary> {{ name }} </template>
- <template #left-secondary> {{ version }} </template>
+ <list-item :disabled="isErrorStatus">
+ <template #left-primary>
+ <span :class="disabledRowStyle">{{ name }}</span>
+ </template>
+ <template #left-secondary>
+ {{ version }}
+ <span v-if="isErrorStatus" class="gl-ml-4" data-testid="status"
+ ><gl-icon name="clock" /> {{ $options.i18n.scheduledForDeletion }}</span
+ >
+ </template>
<template #right-primary> &nbsp; </template>
<template #right-secondary>
<timeago-tooltip :time="manifest.createdAt" data-testid="cached-message">
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js b/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js
index 3c6ede6fdce..fdad69204ba 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/constants.js
@@ -1 +1,2 @@
export const GRAPHQL_PAGE_SIZE = 20;
+export const MANIFEST_PENDING_DESTRUCTION_STATUS = 'PENDING_DESTRUCTION';
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
index 5c43b10a5e3..c1597625964 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/graphql/queries/get_dependency_proxy_details.query.graphql
@@ -20,6 +20,7 @@ query getDependencyProxyDetails(
id
createdAt
imageName
+ status
}
pageInfo {
...PageInfo
diff --git a/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js b/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js
index dc73470e07d..14789aafdb7 100644
--- a/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js
+++ b/app/assets/javascripts/packages_and_registries/dependency_proxy/index.js
@@ -1,5 +1,4 @@
import Vue from 'vue';
-import { parseBoolean } from '~/lib/utils/common_utils';
import app from '~/packages_and_registries/dependency_proxy/app.vue';
import { apolloProvider } from '~/packages_and_registries/dependency_proxy/graphql';
import Translate from '~/vue_shared/translate';
@@ -11,12 +10,11 @@ export const initDependencyProxyApp = () => {
if (!el) {
return null;
}
- const { dependencyProxyAvailable, ...dataset } = el.dataset;
+ const { ...dataset } = el.dataset;
return new Vue({
el,
apolloProvider,
provide: {
- dependencyProxyAvailable: parseBoolean(dependencyProxyAvailable),
...dataset,
},
render(createElement) {
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue
index f198d2e1bfa..425fb4596fd 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/components/app.vue
@@ -191,7 +191,10 @@ export default {
<package-list-row
v-for="v in packageEntity.versions"
:key="v.id"
- :package-entity="{ name: packageEntity.name, ...v }"
+ :package-entity="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ name: packageEntity.name,
+ ...v,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:package-link="v.id.toString()"
:disable-delete="true"
:show-package-type="false"
diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/infrastructure_search.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/infrastructure_search.vue
index c611f92036d..d3c38da1531 100644
--- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/infrastructure_search.vue
+++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/infrastructure_search.vue
@@ -33,7 +33,7 @@ export default {
<registry-search
:filter="filter"
:sorting="sorting"
- :tokens="[]"
+ :tokens="[] /* eslint-disable-line @gitlab/vue-no-new-non-primitive-in-template */"
:sortable-fields="sortableFields"
@sorting:changed="updateSorting"
@filter:changed="setFilter"
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_title.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_title.vue
index 118c509828c..f5946797626 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_title.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_title.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon, GlSprintf, GlBadge, GlResizeObserverDirective } from '@gitlab/ui';
+import { GlSprintf, GlBadge, GlResizeObserverDirective } from '@gitlab/ui';
import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
import { numberToHumanSize } from '~/lib/utils/number_utils';
import { __ } from '~/locale';
@@ -14,7 +14,6 @@ export default {
name: 'PackageTitle',
components: {
TitleArea,
- GlIcon,
GlSprintf,
PackageTags,
MetadataItem,
@@ -84,7 +83,6 @@ export default {
data-qa-selector="package_title"
>
<template #sub-header>
- <gl-icon name="eye" class="gl-mr-3" />
<span data-testid="sub-header">
<gl-sprintf :message="$options.i18n.packageInfo">
<template #version>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
index 6222c2e73d7..04faff1a75b 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
@@ -1,5 +1,12 @@
<script>
-import { GlButton, GlSprintf, GlTooltipDirective, GlTruncate } from '@gitlab/ui';
+import {
+ GlDropdown,
+ GlDropdownItem,
+ GlIcon,
+ GlSprintf,
+ GlTooltipDirective,
+ GlTruncate,
+} from '@gitlab/ui';
import { s__, __ } from '~/locale';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import {
@@ -17,7 +24,9 @@ import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
export default {
name: 'PackageListRow',
components: {
- GlButton,
+ GlDropdown,
+ GlDropdownItem,
+ GlIcon,
GlSprintf,
GlTruncate,
PackageTags,
@@ -50,31 +59,42 @@ export default {
pipelineUser() {
return this.pipeline?.user?.name;
},
- showWarningIcon() {
+ errorStatusRow() {
return this.packageEntity.status === PACKAGE_ERROR_STATUS;
},
showTags() {
return Boolean(this.packageEntity.tags?.nodes?.length);
},
- disabledRow() {
+ nonDefaultRow() {
return this.packageEntity.status && this.packageEntity.status !== PACKAGE_DEFAULT_STATUS;
},
routerLinkEvent() {
- return this.disabledRow ? '' : 'click';
+ return this.nonDefaultRow ? '' : 'click';
+ },
+ errorPackageStyle() {
+ return {
+ 'gl-text-red-500': this.errorStatusRow,
+ 'gl-font-weight-normal': this.errorStatusRow,
+ };
},
},
i18n: {
erroredPackageText: s__('PackageRegistry|Invalid Package: failed metadata extraction'),
createdAt: __('Created %{timestamp}'),
+ deletePackage: s__('PackageRegistry|Delete package'),
+ errorPublishing: s__('PackageRegistry|Error publishing'),
+ warning: __('Warning'),
+ moreActions: __('More actions'),
},
};
</script>
<template>
- <list-item data-qa-selector="package_row" :disabled="disabledRow">
+ <list-item data-qa-selector="package_row">
<template #left-primary>
<div class="gl-display-flex gl-align-items-center gl-mr-3 gl-min-w-0">
<router-link
+ :class="errorPackageStyle"
class="gl-text-body gl-min-w-0"
data-testid="details-link"
data-qa-selector="package_link"
@@ -84,16 +104,6 @@ export default {
<gl-truncate :text="packageEntity.name" />
</router-link>
- <gl-button
- v-if="showWarningIcon"
- v-gl-tooltip="{ title: $options.i18n.erroredPackageText }"
- class="gl-hover-bg-transparent!"
- icon="warning"
- category="tertiary"
- data-testid="warning-icon"
- :aria-label="__('Warning')"
- />
-
<package-tags
v-if="showTags"
class="gl-ml-3"
@@ -104,7 +114,7 @@ export default {
</div>
</template>
<template #left-secondary>
- <div class="gl-display-flex" data-testid="left-secondary-infos">
+ <div v-if="!errorStatusRow" class="gl-display-flex" data-testid="left-secondary-infos">
<span>{{ packageEntity.version }}</span>
<div v-if="pipelineUser" class="gl-display-none gl-sm-display-flex gl-ml-2">
@@ -120,9 +130,19 @@ export default {
<package-path
v-if="isGroupPage"
:path="packageEntity.project.fullPath"
- :disabled="disabledRow"
+ :disabled="nonDefaultRow"
/>
</div>
+ <div v-else>
+ <gl-icon
+ v-gl-tooltip="{ title: $options.i18n.erroredPackageText }"
+ name="warning"
+ class="gl-text-red-500"
+ :aria-label="$options.i18n.warning"
+ data-testid="warning-icon"
+ />
+ <span class="gl-text-red-500">{{ $options.i18n.errorPublishing }}</span>
+ </div>
</template>
<template #right-primary>
@@ -139,16 +159,22 @@ export default {
</span>
</template>
- <template v-if="!disabledRow" #right-action>
- <gl-button
- data-testid="action-delete"
- icon="remove"
- category="secondary"
- variant="danger"
- :title="s__('PackageRegistry|Remove package')"
- :aria-label="s__('PackageRegistry|Remove package')"
- @click="$emit('packageToDelete', packageEntity)"
- />
+ <template v-if="packageEntity.canDestroy" #right-action>
+ <gl-dropdown
+ data-testid="delete-dropdown"
+ icon="ellipsis_v"
+ :text="$options.i18n.moreActions"
+ :text-sr-only="true"
+ category="tertiary"
+ no-caret
+ >
+ <gl-dropdown-item
+ data-testid="action-delete"
+ variant="danger"
+ @click="$emit('packageToDelete', packageEntity)"
+ >{{ $options.i18n.deletePackage }}</gl-dropdown-item
+ >
+ </gl-dropdown>
</template>
</list-item>
</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_title.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_title.vue
index bf41c36e09b..440e11a99f2 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_title.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_title.vue
@@ -27,21 +27,15 @@ export default {
packageAmountText() {
return n__(`%d Package`, `%d Packages`, this.count);
},
- infoMessages() {
- return [{ text: this.$options.i18n.LIST_INTRO_TEXT, link: this.helpUrl }];
- },
},
i18n: {
LIST_TITLE_TEXT: s__('PackageRegistry|Package Registry'),
- LIST_INTRO_TEXT: s__(
- 'PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}',
- ),
},
};
</script>
<template>
- <title-area :title="$options.i18n.LIST_TITLE_TEXT" :info-messages="infoMessages">
+ <title-area :title="$options.i18n.LIST_TITLE_TEXT">
<template #metadata-amount>
<metadata-item v-if="showPackageCount" icon="package" :text="packageAmountText" />
</template>
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue
index 298ed9bccdb..1aff23bc112 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/packages_list.vue
@@ -1,18 +1,20 @@
<script>
-import { GlModal, GlSprintf, GlKeysetPagination } from '@gitlab/ui';
-import { s__ } from '~/locale';
+import { GlAlert, GlModal, GlSprintf, GlKeysetPagination } from '@gitlab/ui';
+import { s__, sprintf } from '~/locale';
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
import PackagesListLoader from '~/packages_and_registries/shared/components/packages_list_loader.vue';
import {
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
+ PACKAGE_ERROR_STATUS,
} from '~/packages_and_registries/package_registry/constants';
import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
import Tracking from '~/tracking';
export default {
components: {
+ GlAlert,
GlKeysetPagination,
GlModal,
GlSprintf,
@@ -40,6 +42,7 @@ export default {
data() {
return {
itemToBeDeleted: null,
+ errorPackages: [],
};
},
computed: {
@@ -70,6 +73,24 @@ export default {
}
},
},
+ errorTitleAlert() {
+ return sprintf(
+ s__('PackageRegistry|There was an error publishing a %{packageName} package'),
+ { packageName: this.errorPackages[0].name },
+ );
+ },
+ showErrorPackageAlert() {
+ return this.errorPackages.length > 0;
+ },
+ },
+ watch: {
+ list(newVal) {
+ this.errorPackages = newVal.filter((pkg) => pkg.status === PACKAGE_ERROR_STATUS);
+ },
+ },
+ created() {
+ this.errorPackages =
+ this.list.length > 0 ? this.list.filter((pkg) => pkg.status === PACKAGE_ERROR_STATUS) : [];
},
methods: {
setItemToBeDeleted(item) {
@@ -83,12 +104,19 @@ export default {
deleteItemCanceled() {
this.track(CANCEL_DELETE_PACKAGE_TRACKING_ACTION);
},
+ showConfirmationModal() {
+ this.setItemToBeDeleted(this.errorPackages[0]);
+ },
},
i18n: {
deleteModalContent: s__(
'PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?',
),
modalAction: s__('PackageRegistry|Delete package'),
+ errorMessageBodyAlert: s__(
+ 'PackageRegistry|There was a timeout and the package was not published. Delete this package and try again.',
+ ),
+ deleteThisPackage: s__('PackageRegistry|Delete this package'),
},
};
</script>
@@ -102,6 +130,14 @@ export default {
</div>
<template v-else>
+ <gl-alert
+ v-if="showErrorPackageAlert"
+ variant="danger"
+ :title="errorTitleAlert"
+ :primary-button-text="$options.i18n.deleteThisPackage"
+ @primaryAction="showConfirmationModal"
+ >{{ $options.i18n.errorMessageBodyAlert }}</gl-alert
+ >
<div data-qa-selector="packages-table">
<packages-list-row
v-for="packageEntity in list"
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql b/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql
index 66315fda9e9..b5695a01376 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/fragments/package_data.fragment.graphql
@@ -5,6 +5,7 @@ fragment PackageData on Package {
packageType
createdAt
status
+ canDestroy
tags {
nodes {
id
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_details.query.graphql b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_details.query.graphql
index c45cbe56e00..41b0c285fff 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_details.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/package_registry/graphql/queries/get_package_details.query.graphql
@@ -1,4 +1,4 @@
-query getPackageDetails($id: ID!) {
+query getPackageDetails($id: PackagesPackageID!) {
package(id: $id) {
id
name
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 85a7aeb5561..482a3ef2ead 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/bundle.js
@@ -21,7 +21,6 @@ export default () => {
groupPath: el.dataset.groupPath,
groupDependencyProxyPath: el.dataset.groupDependencyProxyPath,
defaultExpanded: parseBoolean(el.dataset.defaultExpanded),
- dependencyProxyAvailable: parseBoolean(el.dataset.dependencyProxyAvailable),
},
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 fd62fe144b2..a5189201112 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
@@ -13,7 +13,6 @@ import {
import {
DEPENDENCY_PROXY_HEADER,
- DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
DEPENDENCY_PROXY_DOCS_PATH,
} from '~/packages_and_registries/settings/group/constants';
@@ -28,7 +27,6 @@ export default {
},
i18n: {
DEPENDENCY_PROXY_HEADER,
- DEPENDENCY_PROXY_SETTINGS_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}',
@@ -140,19 +138,6 @@ export default {
data-qa-selector="dependency_proxy_settings_content"
>
<template #title> {{ $options.i18n.DEPENDENCY_PROXY_HEADER }} </template>
- <template #description>
- <span data-testid="description">
- <gl-sprintf :message="$options.i18n.DEPENDENCY_PROXY_SETTINGS_DESCRIPTION">
- <template #docLink="{ content }">
- <gl-link
- data-testid="description-link"
- :href="$options.links.DEPENDENCY_PROXY_DOCS_PATH"
- >{{ content }}</gl-link
- >
- </template>
- </gl-sprintf>
- </span>
- </template>
<template #default>
<div>
<gl-toggle
diff --git a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
index 64c12b4be6a..f285dfc0755 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
+++ b/app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue
@@ -13,7 +13,7 @@ export default {
PackagesSettings,
DependencyProxySettings,
},
- inject: ['groupPath', 'dependencyProxyAvailable'],
+ inject: ['groupPath'],
apollo: {
group: {
query: getGroupPackagesSettingsQuery,
@@ -83,7 +83,6 @@ export default {
/>
<dependency-proxy-settings
- v-if="dependencyProxyAvailable"
:dependency-proxy-settings="dependencyProxySettings"
:dependency-proxy-image-ttl-policy="dependencyProxyImageTtlPolicy"
:is-loading="isLoading"
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 ee922457993..0249b475e46 100644
--- a/app/assets/javascripts/packages_and_registries/settings/group/constants.js
+++ b/app/assets/javascripts/packages_and_registries/settings/group/constants.js
@@ -19,13 +19,10 @@ export const DUPLICATES_SETTINGS_EXCEPTION_LEGEND = s__(
);
export const DEPENDENCY_PROXY_HEADER = s__('DependencyProxy|Dependency Proxy');
-export const DEPENDENCY_PROXY_SETTINGS_DESCRIPTION = s__(
- 'DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies.',
-);
// Parameters
-export const PACKAGES_DOCS_PATH = helpPagePath('user/packages');
+export const PACKAGES_DOCS_PATH = helpPagePath('user/packages/index');
export const MAVEN_DUPLICATES_ALLOWED = 'mavenDuplicatesAllowed';
export const MAVEN_DUPLICATE_EXCEPTION_REGEX = 'mavenDuplicateExceptionRegex';
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 3ef75b3ef0e..5ecacb84d65 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
@@ -112,9 +112,7 @@ export default {
},
signupEnabledHelpText() {
const text = sprintf(
- s__(
- 'ApplicationSettings|When enabled, any user visiting %{host} will be able to create an account.',
- ),
+ s__('ApplicationSettings|Any user that visits %{host} can create an account.'),
{
host: this.host,
},
@@ -125,7 +123,7 @@ export default {
requireAdminApprovalHelpText() {
const text = sprintf(
s__(
- 'ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled.',
+ '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.',
),
{
host: this.host,
@@ -197,32 +195,34 @@ export default {
),
domainAllowListLabel: s__('ApplicationSettings|Allowed domains for sign-ups'),
domainAllowListDescription: s__(
- 'ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com',
+ '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',
),
userCapLabel: s__('ApplicationSettings|User cap'),
userCapDescription: s__(
- 'ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited.',
+ '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.',
),
domainDenyListGroupLabel: s__('ApplicationSettings|Domain denylist'),
- domainDenyListLabel: s__('ApplicationSettings|Enable domain denylist for sign ups'),
+ domainDenyListLabel: s__('ApplicationSettings|Enable domain denylist for sign-ups'),
domainDenyListTypeFileLabel: s__('ApplicationSettings|Upload denylist file'),
domainDenyListTypeRawLabel: s__('ApplicationSettings|Enter denylist manually'),
domainDenyListFileLabel: s__('ApplicationSettings|Denylist file'),
domainDenyListFileDescription: s__(
- 'ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries.',
+ 'ApplicationSettings|Users with e-mail addresses that match these domain(s) cannot sign up. Wildcards allowed. Use separate lines or commas for multiple entries.',
),
domainDenyListListLabel: s__('ApplicationSettings|Denied domains for sign-ups'),
domainDenyListListDescription: s__(
- 'ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com',
+ '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',
),
domainPlaceholder: s__('ApplicationSettings|domain.com'),
emailRestrictionsEnabledGroupLabel: s__('ApplicationSettings|Email restrictions'),
emailRestrictionsEnabledLabel: s__(
- 'ApplicationSettings|Enable email restrictions for sign ups',
+ 'ApplicationSettings|Enable email restrictions for sign-ups',
),
emailRestrictionsGroupLabel: s__('ApplicationSettings|Email restrictions for sign-ups'),
- afterSignUpTextGroupLabel: s__('ApplicationSettings|After sign up text'),
- afterSignUpTextGroupDescription: s__('ApplicationSettings|Markdown enabled'),
+ afterSignUpTextGroupLabel: s__('ApplicationSettings|After sign-up text'),
+ afterSignUpTextGroupDescription: s__(
+ 'ApplicationSettings|Text shown after a user signs up. Markdown enabled.',
+ ),
},
};
</script>
@@ -288,19 +288,21 @@ export default {
name="application_setting[minimum_password_length]"
/>
- <gl-sprintf
- :message="
- s__(
- 'ApplicationSettings|See GitLab\'s %{linkStart}Password Policy Guidelines%{linkEnd}',
- )
- "
- >
- <template #link="{ content }">
- <gl-link :href="form.minimumPasswordLengthHelpLink" target="_blank">{{
- content
- }}</gl-link>
- </template>
- </gl-sprintf>
+ <template #description>
+ <gl-sprintf
+ :message="
+ s__(
+ 'ApplicationSettings|See GitLab\'s %{linkStart}Password Policy Guidelines%{linkEnd}.',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="form.minimumPasswordLengthHelpLink" target="_blank">{{
+ content
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
</gl-form-group>
<gl-form-group
@@ -380,17 +382,19 @@ export default {
name="application_setting[email_restrictions]"
></textarea>
- <gl-sprintf
- :message="
- s__(
- 'ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information.',
- )
- "
- >
- <template #link="{ content }">
- <gl-link :href="form.supportedSyntaxLinkUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
+ <template #description>
+ <gl-sprintf
+ :message="
+ s__(
+ 'ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. %{linkStart}What is the supported syntax?%{linkEnd}',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="form.supportedSyntaxLinkUrl" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
</gl-form-group>
<gl-form-group
diff --git a/app/assets/javascripts/pages/admin/background_migrations/index.js b/app/assets/javascripts/pages/admin/background_migrations/index.js
new file mode 100644
index 00000000000..4c59613140b
--- /dev/null
+++ b/app/assets/javascripts/pages/admin/background_migrations/index.js
@@ -0,0 +1,3 @@
+import { initBackgroundMigrationsApp } from '~/admin/background_migrations';
+
+initBackgroundMigrationsApp();
diff --git a/app/assets/javascripts/pages/admin/clusters/index.js b/app/assets/javascripts/pages/admin/clusters/index.js
deleted file mode 100644
index f398b1cee82..00000000000
--- a/app/assets/javascripts/pages/admin/clusters/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import initCreateCluster from '~/create_cluster/init_create_cluster';
-
-initCreateCluster(document, gon);
diff --git a/app/assets/javascripts/pages/groups/clusters/index.js b/app/assets/javascripts/pages/groups/clusters/index.js
index 4d48bd4be2b..99fb7fa68a9 100644
--- a/app/assets/javascripts/pages/groups/clusters/index.js
+++ b/app/assets/javascripts/pages/groups/clusters/index.js
@@ -1,5 +1,3 @@
import initIntegrationForm from '~/clusters/forms/show/index';
-import initCreateCluster from '~/create_cluster/init_create_cluster';
-initCreateCluster(document, gon);
initIntegrationForm();
diff --git a/app/assets/javascripts/pages/groups/new/components/app.vue b/app/assets/javascripts/pages/groups/new/components/app.vue
index c3ac074cd7a..713287f65b4 100644
--- a/app/assets/javascripts/pages/groups/new/components/app.vue
+++ b/app/assets/javascripts/pages/groups/new/components/app.vue
@@ -21,9 +21,7 @@ const PANELS = [
name: 'import-group-pane',
selector: '#import-group-pane',
title: s__('GroupsNew|Import group'),
- description: s__(
- 'GroupsNew|Export groups with all their related data and move to a new GitLab instance.',
- ),
+ description: s__('GroupsNew|Import a group and related data from another GitLab instance.'),
illustration: importGroupIllustration,
details: 'Migrate your existing groups from another instance of GitLab.',
},
diff --git a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
index 5d8ee146e62..52add416f38 100644
--- a/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
+++ b/app/assets/javascripts/pages/groups/settings/ci_cd/show/index.js
@@ -1,24 +1,9 @@
import initVariableList from '~/ci_variable_list';
-import GroupRunnersFilteredSearchTokenKeys from '~/filtered_search/group_runners_filtered_search_token_keys';
import initSharedRunnersForm from '~/group_settings/mount_shared_runners';
-import { FILTERED_SEARCH } from '~/filtered_search/constants';
-import initFilteredSearch from '~/pages/search/init_filtered_search';
-import { initRunnerAwsDeployments } from '~/pages/shared/mount_runner_aws_deployments';
-import { initInstallRunner } from '~/pages/shared/mount_runner_instructions';
import initSettingsPanels from '~/settings_panels';
// Initialize expandable settings panels
initSettingsPanels();
-initFilteredSearch({
- page: FILTERED_SEARCH.ADMIN_RUNNERS,
- filteredSearchTokenKeys: GroupRunnersFilteredSearchTokenKeys,
- anchor: FILTERED_SEARCH.GROUP_RUNNERS_ANCHOR,
- useDefaultState: false,
-});
-
initSharedRunnersForm();
initVariableList();
-
-initInstallRunner();
-initRunnerAwsDeployments();
diff --git a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
index 9a4054eb110..35a8d3d979a 100644
--- a/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
+++ b/app/assets/javascripts/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue
@@ -9,6 +9,7 @@ import { getBulkImportsHistory } from '~/rest_api';
import ImportStatus from '~/import_entities/components/import_status.vue';
import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import { DEFAULT_ERROR } from '../utils/error_messages';
@@ -16,6 +17,8 @@ const DEFAULT_PER_PAGE = 20;
const DEFAULT_TH_CLASSES =
'gl-bg-transparent! gl-border-b-solid! gl-border-b-gray-200! gl-border-b-1! gl-p-5!';
+const HISTORY_PAGINATION_SIZE_PERSIST_KEY = 'gl-bulk-imports-history-per-page';
+
const tableCell = (config) => ({
thClass: `${DEFAULT_TH_CLASSES}`,
tdClass: (value, key, item) => {
@@ -37,6 +40,7 @@ export default {
PaginationBar,
ImportStatus,
TimeAgo,
+ LocalStorageSync,
},
data() {
@@ -59,7 +63,7 @@ export default {
}),
tableCell({
key: 'destination_name',
- label: s__('BulkImport|New group'),
+ label: s__('BulkImport|Destination group'),
thClass: `${DEFAULT_TH_CLASSES} gl-w-40p`,
}),
tableCell({
@@ -85,10 +89,13 @@ export default {
this.loadHistoryItems();
},
deep: true,
- immediate: true,
},
},
+ mounted() {
+ this.loadHistoryItems();
+ },
+
methods: {
async loadHistoryItems() {
try {
@@ -116,6 +123,7 @@ export default {
},
gitlabLogo: window.gon.gitlab_logo,
+ historyPaginationSizePersistKey: HISTORY_PAGINATION_SIZE_PERSIST_KEY,
};
</script>
@@ -171,5 +179,9 @@ export default {
@set-page-size="paginationConfig.perPage = $event"
/>
</template>
+ <local-storage-sync
+ v-model="paginationConfig.perPage"
+ :storage-key="$options.historyPaginationSizePersistKey"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/pages/projects/clusters/index.js b/app/assets/javascripts/pages/projects/clusters/index.js
deleted file mode 100644
index f398b1cee82..00000000000
--- a/app/assets/javascripts/pages/projects/clusters/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import initCreateCluster from '~/create_cluster/init_create_cluster';
-
-initCreateCluster(document, gon);
diff --git a/app/assets/javascripts/pages/projects/clusters/show/index.js b/app/assets/javascripts/pages/projects/clusters/show/index.js
index 71ab5a0b19c..0b34f374abc 100644
--- a/app/assets/javascripts/pages/projects/clusters/show/index.js
+++ b/app/assets/javascripts/pages/projects/clusters/show/index.js
@@ -1,6 +1,6 @@
import ClustersBundle from '~/clusters/clusters_bundle';
import initIntegrationForm from '~/clusters/forms/show';
-import initGkeNamespace from '~/create_cluster/gke_cluster_namespace';
+import initGkeNamespace from '~/clusters/gke_cluster_namespace';
import initClusterHealth from './cluster_health';
new ClustersBundle(); // eslint-disable-line no-new
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 1667f2c3576..1912477758b 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
@@ -1,5 +1,6 @@
<script>
-import { GlLink, GlIcon, GlButton, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
+import { GlLink, GlIcon, GlButton, GlPopover, GlTooltipDirective as GlTooltip } from '@gitlab/ui';
import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
import { isExperimentVariant } from '~/experimentation/utils';
import eventHub from '~/invite_members/event_hub';
@@ -12,6 +13,7 @@ export default {
GlLink,
GlIcon,
GlButton,
+ GlPopover,
GitlabExperiment,
},
directives: {
@@ -19,6 +21,8 @@ export default {
},
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'),
},
props: {
@@ -31,6 +35,11 @@ export default {
type: Object,
},
},
+ data() {
+ return {
+ popoverId: uniqueId('contact-admin-'),
+ };
+ },
computed: {
linkTitle() {
return ACTION_LABELS[this.action].title;
@@ -78,7 +87,7 @@ export default {
{{ linkTitle }}
</gl-link>
<gl-link
- v-else
+ v-else-if="value.enabled"
:target="openInNewTab ? '_blank' : '_self'"
:href="value.url"
data-testid="uncompleted-learn-gitlab-link"
@@ -87,6 +96,33 @@ export default {
>
{{ linkTitle }}
</gl-link>
+ <template v-else>
+ <div data-testid="disabled-learn-gitlab-link">{{ linkTitle }}</div>
+ <gl-button
+ :id="popoverId"
+ category="tertiary"
+ icon="question-o"
+ class="ml-auto"
+ :aria-label="$options.i18n.contactAdmin"
+ size="small"
+ data-testid="contact-admin-popover-trigger"
+ />
+ <gl-popover
+ :target="popoverId"
+ placement="top"
+ triggers="hover focus"
+ data-testid="contact-admin-popover"
+ >
+ <p>{{ $options.i18n.contactAdmin }}</p>
+ <gl-link
+ :href="value.url"
+ class="font-size-inherit"
+ data-testid="view-administrator-link-text"
+ >
+ {{ $options.i18n.viewAdminList }}
+ </gl-link>
+ </gl-popover>
+ </template>
<gitlab-experiment name="video_tutorials_continuous_onboarding">
<template #control></template>
<template #candidate>
@@ -100,6 +136,7 @@ export default {
:href="linkToVideoTutorial"
target="_blank"
class="ml-auto"
+ size="small"
data-testid="video-tutorial-link"
data-track-action="click_video_link"
:data-track-label="linkTitle"
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 9ba5e17237a..05bacd9b350 100644
--- a/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
+++ b/app/assets/javascripts/pages/projects/learn_gitlab/constants/index.js
@@ -30,6 +30,7 @@ export const ACTION_LABELS = {
description: s__('LearnGitLab|Try all GitLab features for 30 days, no credit card required.'),
section: 'workspace',
position: 3,
+ openInNewTab: true,
},
codeOwnersEnabled: {
title: s__('LearnGitLab|Add code owners'),
@@ -40,6 +41,7 @@ export const ACTION_LABELS = {
trialRequired: true,
section: 'workspace',
position: 4,
+ openInNewTab: true,
videoTutorial: 'https://vimeo.com/670896787',
},
requiredMrApprovalsEnabled: {
@@ -49,6 +51,7 @@ export const ACTION_LABELS = {
trialRequired: true,
section: 'workspace',
position: 5,
+ openInNewTab: true,
videoTutorial: 'https://vimeo.com/670904904',
},
mergeRequestCreated: {
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 0e0c1475eda..48e360ce762 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
@@ -8,6 +8,7 @@ import createDefaultClient from '~/lib/graphql';
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 getStateQuery from './queries/get_state.query.graphql';
export default function initMergeRequestShow() {
@@ -19,22 +20,45 @@ export default function initMergeRequestShow() {
initAwardsApp(document.getElementById('js-vue-awards-block'));
const el = document.querySelector('.js-mr-status-box');
+ const { iid, issuableType, projectPath } = el.dataset;
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
});
// eslint-disable-next-line no-new
new Vue({
el,
+ name: 'IssuableStatusBoxRoot',
apolloProvider,
provide: {
query: getStateQuery,
- projectPath: el.dataset.projectPath,
- iid: el.dataset.iid,
+ iid,
+ projectPath,
},
render(h) {
return h(StatusBox, {
props: {
initialState: el.dataset.state,
+ issuableType,
+ },
+ });
+ },
+ });
+
+ const modalEl = document.getElementById('js-check-out-modal');
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el: modalEl,
+ render(h) {
+ return h(MrWidgetHowToMergeModal, {
+ props: {
+ canMerge: modalEl.dataset.canMerge === 'true',
+ isFork: modalEl.dataset.isFork === 'true',
+ sourceBranch: modalEl.dataset.sourceBranch,
+ sourceProjectPath: modalEl.dataset.sourceProjectPath,
+ targetBranch: modalEl.dataset.targetBranch,
+ sourceProjectDefaultUrl: modalEl.dataset.sourceProjectDefaultUrl,
+ reviewingDocsPath: modalEl.dataset.reviewingDocsPath,
},
});
},
diff --git a/app/assets/javascripts/pages/projects/project.js b/app/assets/javascripts/pages/projects/project.js
index 4f57e1308df..032e2410233 100644
--- a/app/assets/javascripts/pages/projects/project.js
+++ b/app/assets/javascripts/pages/projects/project.js
@@ -65,6 +65,7 @@ export default class Project {
const fieldName = $dropdown.data('fieldName');
const shouldVisit = Boolean($dropdown.data('visit'));
const $form = $dropdown.closest('form');
+ const path = $form.find('#path').val();
const action = $form.attr('action');
const linkTarget = mergeUrlParams(serializeForm($form[0]), action);
@@ -116,20 +117,21 @@ export default class Project {
},
clicked(options) {
const { e } = options;
- e.preventDefault();
- // Since this page does not reload when changing directories in a repo
- // the rendered links do not have the path to the current directory.
- // This updates the path based on the current url and then opens
- // the the url with the updated path parameter.
- if (shouldVisit) {
+ if (!shouldVisit) {
+ e.preventDefault();
+ }
+
+ // Some pages need to dynamically get the current path
+ // so they can opt-in to JS getting the path from the
+ // current URL by not setting a path in the dropdown form
+ if (shouldVisit && path === undefined) {
+ e.preventDefault();
+
const selectedUrl = new URL(e.target.href);
const loc = window.location.href;
if (loc.includes('/-/')) {
- // Since the current ref in renderRow is outdated on page changes
- // (To be addressed in: https://gitlab.com/gitlab-org/gitlab/-/issues/327085)
- // We are deciphering the current ref from the dropdown data instead
const currentRef = $dropdown.data('ref');
// The split and startWith is to ensure an exact word match
// and avoid partial match ie. currentRef is "dev" and loc is "development"
diff --git a/app/assets/javascripts/pages/projects/serverless/index.js b/app/assets/javascripts/pages/projects/serverless/index.js
deleted file mode 100644
index 9ae81b327b1..00000000000
--- a/app/assets/javascripts/pages/projects/serverless/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import ServerlessBundle from '~/serverless/serverless_bundle';
-
-new ServerlessBundle(); // eslint-disable-line no-new
diff --git a/app/assets/javascripts/pages/projects/services/edit/index.js b/app/assets/javascripts/pages/projects/services/edit/index.js
index 2048d3dfc37..64df0d07d74 100644
--- a/app/assets/javascripts/pages/projects/services/edit/index.js
+++ b/app/assets/javascripts/pages/projects/services/edit/index.js
@@ -1,5 +1,4 @@
import initIntegrationSettingsForm from '~/integrations/edit';
-import PrometheusAlerts from '~/prometheus_alerts';
import CustomMetrics from '~/prometheus_metrics/custom_metrics';
initIntegrationSettingsForm();
@@ -10,5 +9,3 @@ if (prometheusSettingsWrapper) {
const customMetrics = new CustomMetrics(prometheusSettingsSelector);
customMetrics.init();
}
-
-PrometheusAlerts();
diff --git a/app/assets/javascripts/pages/projects/show/index.js b/app/assets/javascripts/pages/projects/show/index.js
index 71c6773c176..e2b1a702560 100644
--- a/app/assets/javascripts/pages/projects/show/index.js
+++ b/app/assets/javascripts/pages/projects/show/index.js
@@ -1,8 +1,5 @@
-import initTree from 'ee_else_ce/repository';
-import Activities from '~/activities';
import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation';
-import { BlobViewer } from '~/blob/viewer';
-import { initUploadForm } from '~/blob_edit/blob_bundle';
+
import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import leaveByUrl from '~/namespaces/leave_by_url';
@@ -10,33 +7,38 @@ import initVueNotificationsDropdown from '~/notifications';
import Star from '~/projects/star';
import { initUploadFileTrigger } from '~/projects/upload_file';
import initReadMore from '~/read_more';
-import UserCallout from '~/user_callout';
-
-initReadMore();
-new Star(); // eslint-disable-line no-new
-
-// eslint-disable-next-line no-new
-new UserCallout({
- setCalloutPerProject: false,
- className: 'js-autodevops-banner',
-});
// Project show page loads different overview content based on user preferences
-
if (document.querySelector('.js-upload-blob-form')) {
- initUploadForm();
+ import(/* webpackChunkName: 'blobBundle' */ '~/blob_edit/blob_bundle')
+ .then(({ initUploadForm }) => {
+ initUploadForm();
+ })
+ .catch(() => {});
}
if (document.getElementById('js-tree-list')) {
- initTree();
+ import(/* webpackChunkName: 'treeList' */ 'ee_else_ce/repository')
+ .then(({ default: initTree }) => {
+ initTree();
+ })
+ .catch(() => {});
}
if (document.querySelector('.blob-viewer')) {
- new BlobViewer(); // eslint-disable-line no-new
+ import(/* webpackChunkName: 'blobViewer' */ '~/blob/viewer')
+ .then(({ BlobViewer }) => {
+ new BlobViewer(); // eslint-disable-line no-new
+ })
+ .catch(() => {});
}
if (document.querySelector('.project-show-activity')) {
- new Activities(); // eslint-disable-line no-new
+ import(/* webpackChunkName: 'activitiesList' */ '~/activities')
+ .then(({ default: Activities }) => {
+ new Activities(); // eslint-disable-line no-new
+ })
+ .catch(() => {});
}
leaveByUrl('project');
@@ -48,3 +50,18 @@ new ShortcutsNavigation(); // eslint-disable-line no-new
initUploadFileTrigger();
initInviteMembersModal();
initInviteMembersTrigger();
+
+initReadMore();
+new Star(); // eslint-disable-line no-new
+
+if (document.querySelector('.js-autodevops-banner')) {
+ import(/* webpackChunkName: 'userCallOut' */ '~/user_callout')
+ .then(({ default: UserCallout }) => {
+ // eslint-disable-next-line no-new
+ new UserCallout({
+ setCalloutPerProject: false,
+ className: 'js-autodevops-banner',
+ });
+ })
+ .catch(() => {});
+}
diff --git a/app/assets/javascripts/pages/projects/wikis/edit/index.js b/app/assets/javascripts/pages/projects/wikis/edit/index.js
deleted file mode 100644
index b2288c2655c..00000000000
--- a/app/assets/javascripts/pages/projects/wikis/edit/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import { mountApplications } from '~/pages/shared/wikis/edit';
-
-mountApplications();
diff --git a/app/assets/javascripts/pages/projects/wikis/index.js b/app/assets/javascripts/pages/projects/wikis/index.js
index 83fcd348ddf..692baee383b 100644
--- a/app/assets/javascripts/pages/projects/wikis/index.js
+++ b/app/assets/javascripts/pages/projects/wikis/index.js
@@ -1,3 +1,6 @@
import Wikis from '~/pages/shared/wikis/wikis';
+import { mountApplications } from '~/pages/shared/wikis/async_edit';
+
+mountApplications();
export default new Wikis();
diff --git a/app/assets/javascripts/pages/projects/wikis/show/index.js b/app/assets/javascripts/pages/projects/wikis/show/index.js
index 7ca5f6964cd..288f6b616cc 100644
--- a/app/assets/javascripts/pages/projects/wikis/show/index.js
+++ b/app/assets/javascripts/pages/projects/wikis/show/index.js
@@ -1,5 +1,3 @@
import { mountApplications } from '~/pages/shared/wikis/show';
-import { mountApplications as mountEditApplications } from '~/pages/shared/wikis/async_edit';
mountApplications();
-mountEditApplications();
diff --git a/app/assets/javascripts/pages/registrations/new/index.js b/app/assets/javascripts/pages/registrations/new/index.js
index 8bbe81a9ed5..94a5c1cb29b 100644
--- a/app/assets/javascripts/pages/registrations/new/index.js
+++ b/app/assets/javascripts/pages/registrations/new/index.js
@@ -3,9 +3,14 @@ import { trackNewRegistrations } from '~/google_tag_manager';
import NoEmojiValidator from '~/emoji/no_emoji_validator';
import LengthValidator from '~/pages/sessions/new/length_validator';
import UsernameValidator from '~/pages/sessions/new/username_validator';
+import Tracking from '~/tracking';
new UsernameValidator(); // eslint-disable-line no-new
new LengthValidator(); // eslint-disable-line no-new
new NoEmojiValidator(); // eslint-disable-line no-new
trackNewRegistrations();
+
+Tracking.enableFormTracking({
+ forms: { allow: ['new_user'] },
+});
diff --git a/app/assets/javascripts/persistent_user_callouts.js b/app/assets/javascripts/persistent_user_callouts.js
index dee832c01d5..100ffc0664b 100644
--- a/app/assets/javascripts/persistent_user_callouts.js
+++ b/app/assets/javascripts/persistent_user_callouts.js
@@ -13,6 +13,7 @@ const PERSISTENT_USER_CALLOUTS = [
'.js-approaching-seats-count-threshold',
'.js-storage-enforcement-banner',
'.js-user-over-limit-free-plan-alert',
+ '.js-minute-limit-banner',
];
const initCallouts = () => {
diff --git a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
index 8536db78dfb..d9da238358f 100644
--- a/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
+++ b/app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue
@@ -54,15 +54,15 @@ export default {
return {
message: this.defaultMessage,
openMergeRequest: false,
- targetBranch: this.currentBranch,
+ sourceBranch: this.currentBranch,
};
},
computed: {
isCommitFormFilledOut() {
- return this.message && this.targetBranch;
+ return this.message && this.sourceBranch;
},
- isCurrentBranchTarget() {
- return this.targetBranch === this.currentBranch;
+ isCurrentBranchSourceBranch() {
+ return this.sourceBranch === this.currentBranch;
},
isSubmitDisabled() {
return !this.isCommitFormFilledOut || (!this.hasUnsavedChanges && !this.isNewCiConfigFile);
@@ -79,7 +79,7 @@ export default {
onSubmit() {
this.$emit('submit', {
message: this.message,
- targetBranch: this.targetBranch,
+ sourceBranch: this.sourceBranch,
openMergeRequest: this.openMergeRequest,
});
},
@@ -93,7 +93,7 @@ export default {
},
i18n: {
commitMessage: __('Commit message'),
- targetBranch: __('Target Branch'),
+ sourceBranch: __('Branch'),
startMergeRequest: __('Start a %{new_merge_request} with these changes'),
newMergeRequest: __('new merge request'),
commitChanges: __('Commit changes'),
@@ -120,20 +120,20 @@ export default {
/>
</gl-form-group>
<gl-form-group
- id="target-branch-group"
- :label="$options.i18n.targetBranch"
+ id="source-branch-group"
+ :label="$options.i18n.sourceBranch"
label-cols-sm="2"
- label-for="target-branch-field"
+ label-for="source-branch-field"
>
<gl-form-input
- id="target-branch-field"
- v-model="targetBranch"
+ id="source-branch-field"
+ v-model="sourceBranch"
class="gl-font-monospace!"
required
- data-qa-selector="target_branch_field"
+ data-qa-selector="source_branch_field"
/>
<gl-form-checkbox
- v-if="!isCurrentBranchTarget"
+ v-if="!isCurrentBranchSourceBranch"
v-model="openMergeRequest"
data-testid="new-mr-checkbox"
data-qa-selector="new_mr_checkbox"
diff --git a/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue b/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
index 4ef598d6ff3..9cbf60b1c8f 100644
--- a/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
+++ b/app/assets/javascripts/pipeline_editor/components/commit/commit_section.vue
@@ -75,7 +75,7 @@ export default {
},
},
methods: {
- async onCommitSubmit({ message, targetBranch, openMergeRequest }) {
+ async onCommitSubmit({ message, sourceBranch, openMergeRequest }) {
this.isSaving = true;
try {
@@ -88,7 +88,7 @@ export default {
variables: {
action: this.action,
projectPath: this.projectFullPath,
- branch: targetBranch,
+ branch: sourceBranch,
startBranch: this.currentBranch,
message,
filePath: this.ciConfigPath,
@@ -104,12 +104,11 @@ export default {
if (errors?.length) {
this.$emit('showError', { type: COMMIT_FAILURE, reasons: errors });
} else {
- const commitBranch = targetBranch;
const params = openMergeRequest
? {
type: COMMIT_SUCCESS_WITH_REDIRECT,
params: {
- sourceBranch: commitBranch,
+ sourceBranch,
targetBranch: this.currentBranch,
},
}
@@ -119,10 +118,10 @@ export default {
...params,
});
- this.updateLastCommitBranch(targetBranch);
- this.updateCurrentBranch(targetBranch);
+ this.updateLastCommitBranch(sourceBranch);
+ this.updateCurrentBranch(sourceBranch);
- if (this.currentBranch === targetBranch) {
+ if (this.currentBranch === sourceBranch) {
this.$emit('updateCommitSha');
}
}
diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
index 853e839a7ab..42e2d34fa3a 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
@@ -46,7 +46,9 @@ export default {
:value="mergedYaml"
:file-name="ciConfigPath"
:file-global-id="fileGlobalId"
- :editor-options="{ readOnly: true }"
+ :editor-options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ readOnly: true,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
v-on="$listeners"
/>
</div>
diff --git a/app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue b/app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue
index 83b074dd55c..58df98d0fb7 100644
--- a/app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue
+++ b/app/assets/javascripts/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue
@@ -1,26 +1,74 @@
<script>
+import { GlButton } from '@gitlab/ui';
+import getAppStatus from '~/pipeline_editor/graphql/queries/client/app_status.query.graphql';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { EDITOR_APP_STATUS_EMPTY, EDITOR_APP_STATUS_LOADING } from '../../constants';
+import FileTreePopover from '../popovers/file_tree_popover.vue';
import BranchSwitcher from './branch_switcher.vue';
export default {
components: {
BranchSwitcher,
+ FileTreePopover,
+ GlButton,
},
+ mixins: [glFeatureFlagMixin()],
props: {
hasUnsavedChanges: {
type: Boolean,
required: false,
default: false,
},
+ isNewCiConfigFile: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
shouldLoadNewBranch: {
type: Boolean,
required: false,
default: false,
},
},
+ apollo: {
+ appStatus: {
+ query: getAppStatus,
+ update(data) {
+ return data.app.status;
+ },
+ },
+ },
+ computed: {
+ isAppLoading() {
+ return this.appStatus === EDITOR_APP_STATUS_LOADING;
+ },
+ showFileTreeToggle() {
+ return (
+ this.glFeatures.pipelineEditorFileTree &&
+ !this.isNewCiConfigFile &&
+ this.appStatus !== EDITOR_APP_STATUS_EMPTY
+ );
+ },
+ },
+ methods: {
+ onFileTreeBtnClick() {
+ this.$emit('toggle-file-tree');
+ },
+ },
};
</script>
<template>
<div class="gl-mb-4">
+ <gl-button
+ v-if="showFileTreeToggle"
+ id="file-tree-toggle"
+ icon="file-tree"
+ data-testid="file-tree-toggle"
+ :aria-label="__('File Tree')"
+ :loading="isAppLoading"
+ @click="onFileTreeBtnClick"
+ />
+ <file-tree-popover v-if="showFileTreeToggle" />
<branch-switcher
:has-unsaved-changes="hasUnsavedChanges"
:should-load-new-branch="shouldLoadNewBranch"
diff --git a/app/assets/javascripts/pipeline_editor/components/file_tree/container.vue b/app/assets/javascripts/pipeline_editor/components/file_tree/container.vue
new file mode 100644
index 00000000000..280cd729a43
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/file_tree/container.vue
@@ -0,0 +1,78 @@
+<script>
+import { GlAlert, GlTooltipDirective } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+import { FILE_TREE_TIP_DISMISSED_KEY } from '../../constants';
+import FileItem from './file_item.vue';
+
+const i18n = {
+ tipBtn: __('Learn more'),
+ tipDescription: s__(
+ 'PipelineEditorFileTree|When you use the include keyword to add pipeline configuration from files in the project, those files will be listed here.',
+ ),
+ tipTitle: s__('PipelineEditorFileTree|Configuration files added with the include keyword'),
+};
+
+export default {
+ i18n,
+ name: 'PipelineEditorFileTreeContainer',
+ components: {
+ FileIcon,
+ FileItem,
+ GlAlert,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ inject: ['ciConfigPath', 'includesHelpPagePath'],
+ props: {
+ includes: {
+ type: Array,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ canShowTip: localStorage.getItem(FILE_TREE_TIP_DISMISSED_KEY) !== 'true',
+ };
+ },
+ computed: {
+ showTip() {
+ return this.includes.length === 0 && this.canShowTip;
+ },
+ },
+ methods: {
+ dismissTip() {
+ this.canShowTip = false;
+ localStorage.setItem(FILE_TREE_TIP_DISMISSED_KEY, 'true');
+ },
+ },
+};
+</script>
+<template>
+ <aside class="file-tree-container gl-mr-5 gl-mb-5">
+ <div
+ v-gl-tooltip
+ :title="ciConfigPath"
+ class="gl-bg-gray-50 gl-py-2 gl-px-3 gl-mb-3 gl-rounded-base"
+ >
+ <span class="file-row-name gl-str-truncated" :title="ciConfigPath">
+ <file-icon class="file-row-icon" :file-name="ciConfigPath" />
+ <span data-testid="current-config-filename">{{ ciConfigPath }}</span>
+ </span>
+ </div>
+ <gl-alert
+ v-if="showTip"
+ variant="tip"
+ :title="$options.i18n.tipTitle"
+ :secondary-button-text="$options.i18n.tipBtn"
+ :secondary-button-link="includesHelpPagePath"
+ @dismiss="dismissTip"
+ >
+ {{ $options.i18n.tipDescription }}
+ </gl-alert>
+ <div class="gl-overflow-y-auto">
+ <file-item v-for="file in includes" :key="file.location" :file="file" />
+ </div>
+ </aside>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/file_tree/file_item.vue b/app/assets/javascripts/pipeline_editor/components/file_tree/file_item.vue
new file mode 100644
index 00000000000..786d483b5b9
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/file_tree/file_item.vue
@@ -0,0 +1,45 @@
+<script>
+import { GlIcon, GlLink, GlTooltipDirective } from '@gitlab/ui';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+
+export default {
+ name: 'PipelineEditorFileItem',
+ components: {
+ FileIcon,
+ GlIcon,
+ GlLink,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ file: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ fileName() {
+ return this.file.location;
+ },
+ filePath() {
+ return this.file.blob || this.file.raw;
+ },
+ },
+};
+</script>
+<template>
+ <gl-link
+ v-gl-tooltip
+ :href="filePath"
+ :title="fileName"
+ target="_blank"
+ class="file-tree-includes-link gl-display-flex gl-justify-content-space-between gl-hover-bg-gray-50 gl-text-body gl-hover-text-gray-900 gl-hover-text-decoration-none gl-py-2 gl-px-3 gl-rounded-base"
+ >
+ <span class="file-row-name gl-str-truncated" :title="fileName">
+ <file-icon class="file-row-icon" :file-name="fileName" />
+ <span>{{ fileName }}</span>
+ </span>
+ <gl-icon class="gl-display-none gl-relative gl-text-gray-500" name="external-link" />
+ </gl-link>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
index 25a78aab933..7beabcfe403 100644
--- a/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
+++ b/app/assets/javascripts/pipeline_editor/components/header/pipeline_editor_mini_graph.vue
@@ -47,6 +47,12 @@ export default {
downstreamPipelines() {
return this.linkedPipelines?.downstream?.nodes || [];
},
+ hasDownstreamPipelines() {
+ return this.downstreamPipelines.length > 0;
+ },
+ hasPipelineStages() {
+ return this.pipelineStages.length > 0;
+ },
pipelinePath() {
return this.pipeline.detailedStatus?.detailsPath || '';
},
@@ -73,9 +79,6 @@ export default {
};
});
},
- showDownstreamPipelines() {
- return this.downstreamPipelines.length > 0;
- },
upstreamPipeline() {
return this.linkedPipelines?.upstream;
},
@@ -84,15 +87,20 @@ export default {
</script>
<template>
- <div v-if="pipelineStages.length > 0" class="stage-cell gl-mr-5">
+ <div
+ v-if="hasPipelineStages"
+ class="gl-align-items-center gl-display-inline-flex gl-flex-wrap stage-cell gl-mr-5"
+ >
<linked-pipelines-mini-list
v-if="upstreamPipeline"
- :triggered-by="[upstreamPipeline]"
+ :triggered-by="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ upstreamPipeline,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
data-testid="pipeline-editor-mini-graph-upstream"
/>
- <pipeline-mini-graph class="gl-display-inline" :stages="pipelineStages" />
+ <pipeline-mini-graph :stages="pipelineStages" />
<linked-pipelines-mini-list
- v-if="showDownstreamPipelines"
+ v-if="hasDownstreamPipelines"
:triggered="downstreamPipelines"
:pipeline-path="pipelinePath"
data-testid="pipeline-editor-mini-graph-downstream"
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 d50e6f9a623..da31fc62d09 100644
--- a/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
+++ b/app/assets/javascripts/pipeline_editor/components/pipeline_editor_tabs.vue
@@ -23,7 +23,7 @@ import CiEditorHeader from './editor/ci_editor_header.vue';
import TextEditor from './editor/text_editor.vue';
import CiLint from './lint/ci_lint.vue';
import EditorTab from './ui/editor_tab.vue';
-import WalkthroughPopover from './walkthrough_popover.vue';
+import WalkthroughPopover from './popovers/walkthrough_popover.vue';
export default {
i18n: {
diff --git a/app/assets/javascripts/pipeline_editor/components/popovers/file_tree_popover.vue b/app/assets/javascripts/pipeline_editor/components/popovers/file_tree_popover.vue
new file mode 100644
index 00000000000..6270429535d
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/popovers/file_tree_popover.vue
@@ -0,0 +1,59 @@
+<script>
+import { GlLink, GlPopover, GlOutsideDirective as Outside, GlSprintf } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { FILE_TREE_POPOVER_DISMISSED_KEY } from '../../constants';
+
+export default {
+ name: 'PipelineEditorFileTreePopover',
+ directives: { Outside },
+ i18n: {
+ description: s__(
+ 'pipelineEditorWalkthrough|You can use the file tree to view your pipeline configuration files. %{linkStart}Learn more%{linkEnd}',
+ ),
+ },
+ components: {
+ GlLink,
+ GlPopover,
+ GlSprintf,
+ },
+ inject: ['includesHelpPagePath'],
+ data() {
+ return {
+ showPopover: false,
+ };
+ },
+ mounted() {
+ this.showPopover = localStorage.getItem(FILE_TREE_POPOVER_DISMISSED_KEY) !== 'true';
+ },
+ methods: {
+ closePopover() {
+ this.showPopover = false;
+ },
+ dismissPermanently() {
+ this.closePopover();
+ localStorage.setItem(FILE_TREE_POPOVER_DISMISSED_KEY, 'true');
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-popover
+ v-if="showPopover"
+ show
+ show-close-button
+ target="file-tree-toggle"
+ triggers="manual"
+ placement="right"
+ data-qa-selector="file_tree_popover"
+ @close-button-clicked="dismissPermanently"
+ >
+ <div v-outside="closePopover" class="gl-font-base gl-mb-3">
+ <gl-sprintf :message="$options.i18n.description">
+ <template #link="{ content }">
+ <gl-link :href="includesHelpPagePath" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </div>
+ </gl-popover>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/popovers/walkthrough_popover.vue b/app/assets/javascripts/pipeline_editor/components/popovers/walkthrough_popover.vue
new file mode 100644
index 00000000000..c636d8b8e34
--- /dev/null
+++ b/app/assets/javascripts/pipeline_editor/components/popovers/walkthrough_popover.vue
@@ -0,0 +1,83 @@
+<script>
+import { GlButton, GlPopover, GlSprintf, GlOutsideDirective as Outside } from '@gitlab/ui';
+import { s__ } from '~/locale';
+
+export default {
+ directives: { Outside },
+ i18n: {
+ title: s__('pipelineEditorWalkthrough|See how GitLab pipelines work'),
+ description: s__(
+ 'pipelineEditorWalkthrough|This %{codeStart}.gitlab-ci.yml%{codeEnd} file creates a simple test pipeline.',
+ ),
+ instruction: s__(
+ 'pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} button at the bottom of the page to run the pipeline.',
+ ),
+ ctaText: s__("pipelineEditorWalkthrough|Let's do this!"),
+ },
+ components: {
+ GlButton,
+ GlPopover,
+ GlSprintf,
+ },
+ data() {
+ return {
+ show: true,
+ };
+ },
+ computed: {
+ targetElement() {
+ return document.querySelector('.js-walkthrough-popover-target');
+ },
+ },
+ methods: {
+ close() {
+ this.show = false;
+ },
+ handleClickCta() {
+ this.close();
+ this.$emit('walkthrough-popover-cta-clicked');
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-popover
+ :show.sync="show"
+ :title="$options.i18n.title"
+ :target="targetElement"
+ placement="right"
+ triggers="focus"
+ >
+ <div v-outside="close" class="gl-display-flex gl-flex-direction-column">
+ <p>
+ <gl-sprintf :message="$options.i18n.description">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <p>
+ <gl-sprintf :message="$options.i18n.instruction">
+ <template #bold="{ content }">
+ <strong>
+ {{ content }}
+ </strong>
+ </template>
+ </gl-sprintf>
+ </p>
+
+ <gl-button
+ class="gl-align-self-end"
+ category="tertiary"
+ data-testid="ctaBtn"
+ variant="confirm"
+ @click="handleClickCta"
+ >
+ <gl-emoji data-name="rocket" />
+ {{ $options.i18n.ctaText }}
+ </gl-button>
+ </div>
+ </gl-popover>
+</template>
diff --git a/app/assets/javascripts/pipeline_editor/components/walkthrough_popover.vue b/app/assets/javascripts/pipeline_editor/components/walkthrough_popover.vue
deleted file mode 100644
index 5742b11b841..00000000000
--- a/app/assets/javascripts/pipeline_editor/components/walkthrough_popover.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-<script>
-import { GlButton, GlPopover, GlSprintf, GlOutsideDirective as Outside } from '@gitlab/ui';
-import { s__ } from '~/locale';
-
-export default {
- directives: { Outside },
- i18n: {
- title: s__('pipelineEditorWalkthrough|See how GitLab pipelines work'),
- description: s__(
- 'pipelineEditorWalkthrough|This %{codeStart}.gitlab-ci.yml%{codeEnd} file creates a simple test pipeline.',
- ),
- instruction: s__(
- 'pipelineEditorWalkthrough|Use the %{boldStart}commit changes%{boldEnd} button at the bottom of the page to run the pipeline.',
- ),
- ctaText: s__("pipelineEditorWalkthrough|Let's do this!"),
- },
- components: {
- GlButton,
- GlPopover,
- GlSprintf,
- },
- data() {
- return {
- show: true,
- };
- },
- computed: {
- targetElement() {
- return document.querySelector('.js-walkthrough-popover-target');
- },
- },
- methods: {
- close() {
- this.show = false;
- },
- handleClickCta() {
- this.close();
- this.$emit('walkthrough-popover-cta-clicked');
- },
- },
-};
-</script>
-
-<template>
- <gl-popover
- :show.sync="show"
- :title="$options.i18n.title"
- :target="targetElement"
- placement="right"
- triggers="focus"
- >
- <div v-outside="close" class="gl-display-flex gl-flex-direction-column">
- <p>
- <gl-sprintf :message="$options.i18n.description">
- <template #code="{ content }">
- <code>{{ content }}</code>
- </template>
- </gl-sprintf>
- </p>
-
- <p>
- <gl-sprintf :message="$options.i18n.instruction">
- <template #bold="{ content }">
- <strong>
- {{ content }}
- </strong>
- </template>
- </gl-sprintf>
- </p>
-
- <gl-button
- class="gl-align-self-end"
- category="tertiary"
- data-testid="ctaBtn"
- variant="confirm"
- @click="handleClickCta"
- >
- <gl-emoji data-name="rocket" />
- {{ this.$options.i18n.ctaText }}
- </gl-button>
- </div>
- </gl-popover>
-</template>
diff --git a/app/assets/javascripts/pipeline_editor/constants.js b/app/assets/javascripts/pipeline_editor/constants.js
index 9b4732b26d2..ff7c742f588 100644
--- a/app/assets/javascripts/pipeline_editor/constants.js
+++ b/app/assets/javascripts/pipeline_editor/constants.js
@@ -49,6 +49,10 @@ export const BRANCH_PAGINATION_LIMIT = 20;
export const BRANCH_SEARCH_DEBOUNCE = '500';
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 STARTER_TEMPLATE_NAME = 'Getting-Started';
export const pipelineEditorTrackingOptions = {
diff --git a/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.query.graphql b/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.query.graphql
index df7de6a1f54..5354ed7c2d5 100644
--- a/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.query.graphql
+++ b/app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.query.graphql
@@ -3,6 +3,12 @@
query getCiConfigData($projectPath: ID!, $sha: String, $content: String!) {
ciConfig(projectPath: $projectPath, sha: $sha, content: $content) {
errors
+ includes {
+ location
+ type
+ blob
+ raw
+ }
mergedYaml
status
stages {
diff --git a/app/assets/javascripts/pipeline_editor/index.js b/app/assets/javascripts/pipeline_editor/index.js
index 732fc665c9e..e13d9cf9df0 100644
--- a/app/assets/javascripts/pipeline_editor/index.js
+++ b/app/assets/javascripts/pipeline_editor/index.js
@@ -30,6 +30,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
defaultBranch,
emptyStateIllustrationPath,
helpPaths,
+ includesHelpPagePath,
lintHelpPagePath,
lintUnavailableHelpPagePath,
needsHelpPagePath,
@@ -41,7 +42,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
runnerHelpPagePath,
totalBranches,
ymlHelpPagePath,
- } = el?.dataset;
+ } = el.dataset;
const configurationPaths = Object.fromEntries(
Object.entries(CODE_SNIPPET_SOURCE_SETTINGS).map(([source, { datasetKey }]) => [
@@ -118,6 +119,7 @@ export const initPipelineEditor = (selector = '#js-pipeline-editor') => {
defaultBranch,
emptyStateIllustrationPath,
helpPaths,
+ includesHelpPagePath,
lintHelpPagePath,
lintUnavailableHelpPagePath,
needsHelpPagePath,
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
index 4e6a4ffa6d2..3fd31edec2c 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue
@@ -104,6 +104,7 @@ export default {
this.setAppStatus(EDITOR_APP_STATUS_EMPTY);
}
+ this.isNewCiConfigFile = false;
if (!hasCIFile) {
if (this.shouldSkipStartScreen) {
this.setNewEmptyCiConfigFile();
@@ -381,7 +382,7 @@ export default {
</script>
<template>
- <div class="gl-mt-4 gl-relative">
+ <div class="gl-mt-4 gl-relative" data-qa-selector="pipeline_editor_app">
<gl-loading-icon v-if="isBlobContentLoading" size="lg" class="gl-m-3" />
<pipeline-editor-empty-state
v-else-if="showStartScreen"
diff --git a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
index 23e3ce10d5a..59022a91322 100644
--- a/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
+++ b/app/assets/javascripts/pipeline_editor/pipeline_editor_home.vue
@@ -1,12 +1,14 @@
<script>
import { GlModal } from '@gitlab/ui';
import { __ } from '~/locale';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import CommitSection from './components/commit/commit_section.vue';
import PipelineEditorDrawer from './components/drawer/pipeline_editor_drawer.vue';
import PipelineEditorFileNav from './components/file_nav/pipeline_editor_file_nav.vue';
+import PipelineEditorFileTree from './components/file_tree/container.vue';
import PipelineEditorHeader from './components/header/pipeline_editor_header.vue';
import PipelineEditorTabs from './components/pipeline_editor_tabs.vue';
-import { CREATE_TAB } from './constants';
+import { CREATE_TAB, FILE_TREE_DISPLAY_KEY } from './constants';
export default {
commitSectionRef: 'commitSectionRef',
@@ -28,9 +30,11 @@ export default {
GlModal,
PipelineEditorDrawer,
PipelineEditorFileNav,
+ PipelineEditorFileTree,
PipelineEditorHeader,
PipelineEditorTabs,
},
+ mixins: [glFeatureFlagMixin()],
props: {
ciConfigData: {
type: Object,
@@ -61,6 +65,7 @@ export default {
scrollToCommitForm: false,
shouldLoadNewBranch: false,
showDrawer: false,
+ showFileTree: false,
showSwitchBranchModal: false,
};
},
@@ -68,6 +73,15 @@ export default {
showCommitForm() {
return this.currentTab === CREATE_TAB;
},
+ includesFiles() {
+ return this.ciConfigData?.includes || [];
+ },
+ isFileTreeVisible() {
+ return this.showFileTree && this.glFeatures.pipelineEditorFileTree;
+ },
+ },
+ mounted() {
+ this.showFileTree = JSON.parse(localStorage.getItem(FILE_TREE_DISPLAY_KEY)) || false;
},
methods: {
closeBranchModal() {
@@ -82,6 +96,10 @@ export default {
openDrawer() {
this.showDrawer = true;
},
+ toggleFileTree() {
+ this.showFileTree = !this.showFileTree;
+ localStorage.setItem(FILE_TREE_DISPLAY_KEY, this.showFileTree);
+ },
switchBranch() {
this.showSwitchBranchModal = false;
this.shouldLoadNewBranch = true;
@@ -114,28 +132,39 @@ export default {
</gl-modal>
<pipeline-editor-file-nav
:has-unsaved-changes="hasUnsavedChanges"
+ :is-new-ci-config-file="isNewCiConfigFile"
:should-load-new-branch="shouldLoadNewBranch"
@select-branch="handleConfirmSwitchBranch"
+ @toggle-file-tree="toggleFileTree"
v-on="$listeners"
/>
- <pipeline-editor-header
- :ci-config-data="ciConfigData"
- :commit-sha="commitSha"
- :is-new-ci-config-file="isNewCiConfigFile"
- v-on="$listeners"
- />
- <pipeline-editor-tabs
- :ci-config-data="ciConfigData"
- :ci-file-content="ciFileContent"
- :commit-sha="commitSha"
- :is-new-ci-config-file="isNewCiConfigFile"
- :show-drawer="showDrawer"
- v-on="$listeners"
- @open-drawer="openDrawer"
- @close-drawer="closeDrawer"
- @set-current-tab="setCurrentTab"
- @walkthrough-popover-cta-clicked="setScrollToCommitForm"
- />
+ <div class="gl-display-flex gl-w-full gl-sm-flex-direction-column">
+ <pipeline-editor-file-tree
+ v-if="isFileTreeVisible"
+ class="gl-flex-shrink-0"
+ :includes="includesFiles"
+ />
+ <div class="gl-flex-grow-1 gl-min-w-0">
+ <pipeline-editor-header
+ :ci-config-data="ciConfigData"
+ :commit-sha="commitSha"
+ :is-new-ci-config-file="isNewCiConfigFile"
+ v-on="$listeners"
+ />
+ <pipeline-editor-tabs
+ :ci-config-data="ciConfigData"
+ :ci-file-content="ciFileContent"
+ :commit-sha="commitSha"
+ :is-new-ci-config-file="isNewCiConfigFile"
+ :show-drawer="showDrawer"
+ v-on="$listeners"
+ @open-drawer="openDrawer"
+ @close-drawer="closeDrawer"
+ @set-current-tab="setCurrentTab"
+ @walkthrough-popover-cta-clicked="setScrollToCommitForm"
+ />
+ </div>
+ </div>
<commit-section
v-if="showCommitForm"
:ref="$options.commitSectionRef"
diff --git a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
index 32e1e18b684..d84fc724d38 100644
--- a/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
+++ b/app/assets/javascripts/pipeline_new/components/pipeline_new_form.vue
@@ -313,7 +313,7 @@ export default {
errors = [],
warnings = [],
total_warnings: totalWarnings = 0,
- } = err?.response?.data;
+ } = err.response.data;
const [error] = errors;
this.reportError({
diff --git a/app/assets/javascripts/pipeline_new/index.js b/app/assets/javascripts/pipeline_new/index.js
index a645ea8603b..927eeb5e144 100644
--- a/app/assets/javascripts/pipeline_new/index.js
+++ b/app/assets/javascripts/pipeline_new/index.js
@@ -17,7 +17,7 @@ export default () => {
fileParam,
settingsLink,
maxWarnings,
- } = el?.dataset;
+ } = el.dataset;
const variableParams = JSON.parse(varParam);
const fileParams = JSON.parse(fileParam);
diff --git a/app/assets/javascripts/pipelines/components/dag/dag.vue b/app/assets/javascripts/pipelines/components/dag/dag.vue
index 16fb931ec2b..475dd3bf36e 100644
--- a/app/assets/javascripts/pipelines/components/dag/dag.vue
+++ b/app/assets/javascripts/pipelines/components/dag/dag.vue
@@ -238,7 +238,7 @@ export default {
</div>
</template>
<template v-if="dagDocPath" #actions>
- <gl-button :href="dagDocPath" target="__blank" variant="success">
+ <gl-button :href="dagDocPath" target="_blank" variant="confirm">
{{ $options.emptyStateTexts.button }}
</gl-button>
</template>
diff --git a/app/assets/javascripts/pipelines/components/graph/constants.js b/app/assets/javascripts/pipelines/components/graph/constants.js
index 0b59612b25c..85ca52f633e 100644
--- a/app/assets/javascripts/pipelines/components/graph/constants.js
+++ b/app/assets/javascripts/pipelines/components/graph/constants.js
@@ -15,4 +15,8 @@ export const VIEW_TYPE_KEY = 'pipeline_graph_view_type';
export const SINGLE_JOB = 'single_job';
export const JOB_DROPDOWN = 'job_dropdown';
+export const BUILD_KIND = 'BUILD';
+export const BRIDGE_KIND = 'BRIDGE';
+
+export const ACTION_FAILURE = 'action_failure';
export const IID_FAILURE = 'missing_iid';
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component.vue b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
index 015f0519c72..31a34ab4fb5 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
@@ -233,6 +233,7 @@ export default {
:view-type="viewType"
@downstreamHovered="setSourceJob"
@pipelineExpandToggle="togglePipelineExpanded"
+ @refreshPipelineGraph="$emit('refreshPipelineGraph')"
@scrollContainer="slidePipelineContainer"
@error="onError"
/>
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 534ad25a35d..f822e2c0874 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component_wrapper.vue
@@ -8,7 +8,7 @@ import { DEFAULT, DRAW_FAILURE, LOAD_FAILURE } from '../../constants';
import DismissPipelineGraphCallout from '../../graphql/mutations/dismiss_pipeline_notification.graphql';
import getPipelineQuery from '../../graphql/queries/get_pipeline_header_data.query.graphql';
import { reportToSentry, reportMessageToSentry } from '../../utils';
-import { IID_FAILURE, LAYER_VIEW, STAGE_VIEW, VIEW_TYPE_KEY } from './constants';
+import { ACTION_FAILURE, IID_FAILURE, LAYER_VIEW, STAGE_VIEW, VIEW_TYPE_KEY } from './constants';
import PipelineGraph from './graph_component.vue';
import GraphViewSelector from './graph_view_selector.vue';
import {
@@ -57,13 +57,29 @@ export default {
showLinks: false,
};
},
- errorTexts: {
- [DRAW_FAILURE]: __('An error occurred while drawing job relationship links.'),
- [IID_FAILURE]: __(
- 'The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data.',
- ),
- [LOAD_FAILURE]: __('We are currently unable to fetch data for this pipeline.'),
- [DEFAULT]: __('An unknown error occurred while loading this graph.'),
+ errors: {
+ [ACTION_FAILURE]: {
+ text: __('An error occurred while performing this action.'),
+ variant: 'danger',
+ },
+ [DRAW_FAILURE]: {
+ text: __('An error occurred while drawing job relationship links.'),
+ variant: 'danger',
+ },
+ [IID_FAILURE]: {
+ text: __(
+ 'The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data.',
+ ),
+ variant: 'info',
+ },
+ [LOAD_FAILURE]: {
+ text: __('Currently unable to fetch data for this pipeline.'),
+ variant: 'danger',
+ },
+ [DEFAULT]: {
+ text: __('An unknown error occurred while loading this graph.'),
+ variant: 'danger',
+ },
},
apollo: {
callouts: {
@@ -154,28 +170,12 @@ export default {
},
computed: {
alert() {
- switch (this.alertType) {
- case DRAW_FAILURE:
- return {
- text: this.$options.errorTexts[DRAW_FAILURE],
- variant: 'danger',
- };
- case IID_FAILURE:
- return {
- text: this.$options.errorTexts[IID_FAILURE],
- variant: 'info',
- };
- case LOAD_FAILURE:
- return {
- text: this.$options.errorTexts[LOAD_FAILURE],
- variant: 'danger',
- };
- default:
- return {
- text: this.$options.errorTexts[DEFAULT],
- variant: 'danger',
- };
- }
+ const { errors } = this.$options;
+
+ return {
+ text: errors[this.alertType]?.text ?? errors[DEFAULT].text,
+ variant: errors[this.alertType]?.variant ?? errors[DEFAULT].variant,
+ };
},
configPaths() {
return {
diff --git a/app/assets/javascripts/pipelines/components/graph/job_item.vue b/app/assets/javascripts/pipelines/components/graph/job_item.vue
index f69b25dfa7c..362571930d6 100644
--- a/app/assets/javascripts/pipelines/components/graph/job_item.vue
+++ b/app/assets/javascripts/pipelines/components/graph/job_item.vue
@@ -1,5 +1,5 @@
<script>
-import { GlTooltipDirective, GlLink } from '@gitlab/ui';
+import { GlBadge, GlLink, GlTooltipDirective } from '@gitlab/ui';
import delayedJobMixin from '~/jobs/mixins/delayed_job_mixin';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import { sprintf, __ } from '~/locale';
@@ -7,7 +7,7 @@ import CiIcon from '~/vue_shared/components/ci_icon.vue';
import { reportToSentry } from '../../utils';
import ActionComponent from '../jobs_shared/action_component.vue';
import JobNameComponent from '../jobs_shared/job_name_component.vue';
-import { SINGLE_JOB } from './constants';
+import { BRIDGE_KIND, SINGLE_JOB } from './constants';
/**
* Renders the badge for the pipeline graph and the job's dropdown.
@@ -35,11 +35,16 @@ import { SINGLE_JOB } from './constants';
*/
export default {
+ i18n: {
+ bridgeBadgeText: __('Trigger job'),
+ unauthorizedTooltip: __('You are not authorized to run this manual job'),
+ },
hoverClass: 'gl-shadow-x0-y0-b3-s1-blue-500',
components: {
ActionComponent,
CiIcon,
JobNameComponent,
+ GlBadge,
GlLink,
},
directives: {
@@ -113,6 +118,12 @@ export default {
isSingleItem() {
return this.type === SINGLE_JOB;
},
+ isBridge() {
+ return this.kind === BRIDGE_KIND;
+ },
+ kind() {
+ return this.job?.kind || '';
+ },
nameComponent() {
return this.hasDetails ? 'gl-link' : 'div';
},
@@ -187,6 +198,7 @@ export default {
[this.$options.hoverClass]:
this.relatedDownstreamHovered || this.relatedDownstreamExpanded,
},
+ { 'gl-rounded-lg': this.isBridge },
this.cssClassJobName,
];
},
@@ -213,9 +225,6 @@ export default {
this.$emit('pipelineActionRequestComplete');
},
},
- i18n: {
- unauthorizedTooltip: __('You are not authorized to run this manual job'),
- },
};
</script>
<template>
@@ -253,6 +262,9 @@ export default {
</div>
</div>
</div>
+ <gl-badge v-if="isBridge" class="gl-mt-3" variant="info" size="sm">
+ {{ $options.i18n.bridgeBadgeText }}
+ </gl-badge>
</component>
<action-component
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
index d59802196af..9f76d4cec50 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipeline.vue
@@ -1,10 +1,22 @@
<script>
-import { GlBadge, GlButton, GlLink, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
+import {
+ GlBadge,
+ GlButton,
+ GlLink,
+ GlLoadingIcon,
+ GlTooltip,
+ GlTooltipDirective,
+} from '@gitlab/ui';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
import { __, sprintf } from '~/locale';
+import CancelPipelineMutation from '~/pipelines/graphql/mutations/cancel_pipeline.mutation.graphql';
+import RetryPipelineMutation from '~/pipelines/graphql/mutations/retry_pipeline.mutation.graphql';
import CiStatus from '~/vue_shared/components/ci_icon.vue';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { PIPELINE_GRAPHQL_TYPE } from '../../constants';
import { reportToSentry } from '../../utils';
-import { DOWNSTREAM, UPSTREAM } from './constants';
+import { ACTION_FAILURE, DOWNSTREAM, UPSTREAM } from './constants';
export default {
directives: {
@@ -16,7 +28,14 @@ export default {
GlButton,
GlLink,
GlLoadingIcon,
+ GlTooltip,
},
+ styles: {
+ actionSizeClasses: ['gl-h-7 gl-w-7'],
+ flatLeftBorder: ['gl-rounded-bottom-left-none!', 'gl-rounded-top-left-none!'],
+ flatRightBorder: ['gl-rounded-bottom-right-none!', 'gl-rounded-top-right-none!'],
+ },
+ mixins: [glFeatureFlagMixin()],
props: {
columnTitle: {
type: String,
@@ -39,15 +58,44 @@ export default {
required: true,
},
},
+ data() {
+ return {
+ hasActionTooltip: false,
+ isActionLoading: false,
+ };
+ },
computed: {
- buttonBorderClass() {
- return this.isUpstream ? 'gl-border-r-1!' : 'gl-border-l-1!';
+ action() {
+ if (this.glFeatures?.downstreamRetryAction && this.isDownstream) {
+ if (this.isCancelable) {
+ return {
+ icon: 'cancel',
+ method: this.cancelPipeline,
+ ariaLabel: __('Cancel downstream pipeline'),
+ };
+ } else if (this.isRetryable) {
+ return {
+ icon: 'retry',
+ method: this.retryPipeline,
+ ariaLabel: __('Retry downstream pipeline'),
+ };
+ }
+ }
+
+ return {};
+ },
+ buttonBorderClasses() {
+ return this.isUpstream
+ ? ['gl-border-r-0!', ...this.$options.styles.flatRightBorder]
+ : ['gl-border-l-0!', ...this.$options.styles.flatLeftBorder];
},
buttonId() {
return `js-linked-pipeline-${this.pipeline.id}`;
},
- cardSpacingClass() {
- return this.isDownstream ? 'gl-pr-0' : '';
+ cardClasses() {
+ return this.isDownstream
+ ? this.$options.styles.flatRightBorder
+ : this.$options.styles.flatLeftBorder;
},
expandedIcon() {
if (this.isUpstream) {
@@ -64,9 +112,21 @@ export default {
flexDirection() {
return this.isUpstream ? 'gl-flex-direction-row-reverse' : 'gl-flex-direction-row';
},
+ graphqlPipelineId() {
+ return convertToGraphQLId(PIPELINE_GRAPHQL_TYPE, this.pipeline.id);
+ },
+ hasUpdatePipelinePermissions() {
+ return Boolean(this.pipeline?.userPermissions?.updatePipeline);
+ },
+ isCancelable() {
+ return Boolean(this.pipeline?.cancelable && this.hasUpdatePipelinePermissions);
+ },
isDownstream() {
return this.type === DOWNSTREAM;
},
+ isRetryable() {
+ return Boolean(this.pipeline?.retryable && this.hasUpdatePipelinePermissions);
+ },
isSameProject() {
return !this.pipeline.multiproject;
},
@@ -93,13 +153,19 @@ export default {
projectName() {
return this.pipeline.project.name;
},
+ showAction() {
+ return Boolean(this.action?.method && this.action?.icon && this.action?.ariaLabel);
+ },
+ showCardTooltip() {
+ return !this.hasActionTooltip;
+ },
sourceJobName() {
return this.pipeline.sourceJob?.name ?? '';
},
sourceJobInfo() {
return this.isDownstream ? sprintf(__('Created by %{job}'), { job: this.sourceJobName }) : '';
},
- tooltipText() {
+ cardTooltipText() {
return `${this.downstreamTitle} #${this.pipeline.id} - ${this.pipelineStatus.label} -
${this.sourceJobInfo}`;
},
@@ -108,6 +174,26 @@ export default {
reportToSentry('linked_pipeline', `error: ${err}, info: ${info}`);
},
methods: {
+ cancelPipeline() {
+ this.executePipelineAction(CancelPipelineMutation);
+ },
+ async executePipelineAction(mutation) {
+ try {
+ this.isActionLoading = true;
+
+ await this.$apollo.mutate({
+ mutation,
+ variables: {
+ id: this.graphqlPipelineId,
+ },
+ });
+ this.$emit('refreshPipelineGraph');
+ } catch {
+ this.$emit('error', { type: ACTION_FAILURE });
+ } finally {
+ this.isActionLoading = false;
+ }
+ },
hideTooltips() {
this.$root.$emit(BV_HIDE_TOOLTIP);
},
@@ -122,6 +208,12 @@ export default {
onDownstreamHoverLeave() {
this.$emit('downstreamHovered', '');
},
+ retryPipeline() {
+ this.executePipelineAction(RetryPipelineMutation);
+ },
+ setActionTooltip(flag) {
+ this.hasActionTooltip = flag;
+ },
},
};
</script>
@@ -129,33 +221,48 @@ export default {
<template>
<div
ref="linkedPipeline"
- v-gl-tooltip
- class="gl-h-full gl-display-flex! gl-border-solid gl-border-gray-100 gl-border-1"
+ class="gl-h-full gl-display-flex!"
:class="flexDirection"
- :title="tooltipText"
data-qa-selector="linked_pipeline_container"
@mouseover="onDownstreamHovered"
@mouseleave="onDownstreamHoverLeave"
>
- <div class="gl-w-full gl-bg-white gl-p-3" :class="cardSpacingClass">
- <div class="gl-display-flex gl-pr-3">
- <ci-status
- v-if="!pipelineIsLoading"
- :status="pipelineStatus"
- :size="24"
- css-classes="gl-top-0 gl-pr-2"
- />
+ <gl-tooltip v-if="showCardTooltip" :target="() => $refs.linkedPipeline">
+ {{ cardTooltipText }}
+ </gl-tooltip>
+ <div class="gl-bg-white gl-border gl-p-3 gl-rounded-lg gl-w-full" :class="cardClasses">
+ <div class="gl-display-flex gl-gap-x-3">
+ <ci-status v-if="!pipelineIsLoading" :status="pipelineStatus" :size="24" css-classes="" />
<div v-else class="gl-pr-3"><gl-loading-icon size="sm" inline /></div>
- <div class="gl-display-flex gl-flex-direction-column gl-downstream-pipeline-job-width">
+ <div
+ class="gl-display-flex gl-downstream-pipeline-job-width gl-flex-direction-column gl-line-height-normal"
+ >
<span class="gl-text-truncate" data-testid="downstream-title">
{{ downstreamTitle }}
</span>
<div class="gl-text-truncate">
- <gl-link class="gl-text-blue-500!" :href="pipeline.path" data-testid="pipelineLink"
+ <gl-link
+ class="gl-text-blue-500! gl-font-sm"
+ :href="pipeline.path"
+ data-testid="pipelineLink"
>#{{ pipeline.id }}</gl-link
>
</div>
</div>
+ <gl-button
+ v-if="showAction"
+ v-gl-tooltip
+ :title="action.ariaLabel"
+ :loading="isActionLoading"
+ :icon="action.icon"
+ class="gl-rounded-full!"
+ :class="$options.styles.actionSizeClasses"
+ :aria-label="action.ariaLabel"
+ @click="action.method"
+ @mouseover="setActionTooltip(true)"
+ @mouseout="setActionTooltip(false)"
+ />
+ <div v-else :class="$options.styles.actionSizeClasses"></div>
</div>
<div class="gl-pt-2">
<gl-badge size="sm" variant="info" data-testid="downstream-pipeline-label">
@@ -166,8 +273,8 @@ export default {
<div class="gl-display-flex">
<gl-button
:id="buttonId"
- class="gl-shadow-none! gl-rounded-0!"
- :class="`js-pipeline-expand-${pipeline.id} ${buttonBorderClass}`"
+ class="gl-border! gl-shadow-none! gl-rounded-lg!"
+ :class="[`js-pipeline-expand-${pipeline.id}`, buttonBorderClasses]"
:icon="expandedIcon"
:aria-label="__('Expand pipeline')"
data-testid="expand-pipeline-button"
diff --git a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
index 3c1208afbf0..b06c2f15042 100644
--- a/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
+++ b/app/assets/javascripts/pipelines/components/graph/linked_pipelines_column.vue
@@ -66,14 +66,13 @@ export default {
columnClass() {
const positionValues = {
right: 'gl-ml-6',
- left: 'gl-mr-6',
+ left: 'gl-mx-6',
};
+
return `graph-position-${this.graphPosition} ${positionValues[this.graphPosition]}`;
},
computedTitleClasses() {
- const positionalClasses = this.isUpstream
- ? ['gl-w-full', 'gl-text-right', 'gl-linked-pipeline-padding']
- : [];
+ const positionalClasses = this.isUpstream ? ['gl-w-full', 'gl-linked-pipeline-padding'] : [];
return [...this.$options.titleClasses, ...positionalClasses];
},
@@ -202,7 +201,7 @@ export default {
<li
v-for="pipeline in linkedPipelines"
:key="pipeline.id"
- class="gl-display-flex gl-mb-4"
+ class="gl-display-flex gl-mb-3"
:class="{ 'gl-flex-direction-row-reverse': isUpstream }"
>
<linked-pipeline
@@ -215,6 +214,7 @@ export default {
@downstreamHovered="onDownstreamHovered"
@pipelineClicked="onPipelineClick(pipeline)"
@pipelineExpandToggle="onPipelineExpandToggle"
+ @refreshPipelineGraph="$emit('refreshPipelineGraph')"
/>
<div
v-if="showContainer(pipeline.id)"
diff --git a/app/assets/javascripts/pipelines/components/header_component.vue b/app/assets/javascripts/pipelines/components/header_component.vue
index 04b78b8aa23..37878f3fb6d 100644
--- a/app/assets/javascripts/pipelines/components/header_component.vue
+++ b/app/assets/javascripts/pipelines/components/header_component.vue
@@ -93,6 +93,7 @@ export default {
data() {
return {
pipeline: null,
+ failureMessages: [],
failureType: null,
isCanceling: false,
isRetrying: false,
@@ -159,8 +160,9 @@ export default {
},
},
methods: {
- reportFailure(errorType) {
+ reportFailure(errorType, errorMessages = []) {
this.failureType = errorType;
+ this.failureMessages = errorMessages;
},
async postPipelineAction(name, mutation) {
try {
@@ -176,7 +178,7 @@ export default {
if (errors.length > 0) {
this.isRetrying = false;
- this.reportFailure(POST_FAILURE);
+ this.reportFailure(POST_FAILURE, errors);
} else {
await this.$apollo.queries.pipeline.refetch();
if (!this.isFinished) {
@@ -214,7 +216,7 @@ export default {
});
if (errors.length > 0) {
- this.reportFailure(DELETE_FAILURE);
+ this.reportFailure(DELETE_FAILURE, errors);
this.isDeleting = false;
} else {
redirectTo(setUrlFragment(this.paths.pipelinesPath, 'delete_success'));
@@ -231,9 +233,11 @@ export default {
</script>
<template>
<div class="js-pipeline-header-container">
- <gl-alert v-if="hasError" :variant="failure.variant" :dismissible="false">{{
- failure.text
- }}</gl-alert>
+ <gl-alert v-if="hasError" :title="failure.text" :variant="failure.variant" :dismissible="false">
+ <div v-for="(failureMessage, index) in failureMessages" :key="`failure-message-${index}`">
+ {{ failureMessage }}
+ </div>
+ </gl-alert>
<ci-header
v-if="shouldRenderContent"
:status="pipeline.detailedStatus"
@@ -261,6 +265,7 @@ export default {
v-if="canCancelPipeline"
:loading="isCanceling"
:disabled="isCanceling"
+ class="gl-ml-3"
variant="danger"
data-testid="cancelPipeline"
@click="cancelPipeline()"
diff --git a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_app.vue b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_app.vue
new file mode 100644
index 00000000000..9e886fd7a48
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_app.vue
@@ -0,0 +1,73 @@
+<script>
+import { GlLoadingIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import createFlash from '~/flash';
+import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import GetFailedJobsQuery from '../../graphql/queries/get_failed_jobs.query.graphql';
+import { prepareFailedJobs } from './utils';
+import FailedJobsTable from './failed_jobs_table.vue';
+
+export default {
+ components: {
+ GlLoadingIcon,
+ FailedJobsTable,
+ },
+ inject: {
+ fullPath: {
+ default: '',
+ },
+ pipelineIid: {
+ default: '',
+ },
+ },
+ props: {
+ failedJobsSummary: {
+ type: Array,
+ required: true,
+ },
+ },
+ apollo: {
+ failedJobs: {
+ query: GetFailedJobsQuery,
+ variables() {
+ return {
+ fullPath: this.fullPath,
+ pipelineIid: this.pipelineIid,
+ };
+ },
+ update({ project }) {
+ if (project?.pipeline?.jobs?.nodes) {
+ return project.pipeline.jobs.nodes.map((job) => {
+ return { normalizedId: getIdFromGraphQLId(job.id), ...job };
+ });
+ }
+ return [];
+ },
+ result() {
+ this.preparedFailedJobs = prepareFailedJobs(this.failedJobs, this.failedJobsSummary);
+ },
+ error() {
+ createFlash({ message: s__('Jobs|There was a problem fetching the failed jobs.') });
+ },
+ },
+ },
+ data() {
+ return {
+ failedJobs: [],
+ preparedFailedJobs: [],
+ };
+ },
+ computed: {
+ loading() {
+ return this.$apollo.queries.failedJobs.loading;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-loading-icon v-if="loading" size="lg" class="gl-mt-4" />
+ <failed-jobs-table v-else :failed-jobs="preparedFailedJobs" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
new file mode 100644
index 00000000000..1c646bdf3d6
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/jobs/failed_jobs_table.vue
@@ -0,0 +1,111 @@
+<script>
+import { GlButton, GlLink, GlSafeHtmlDirective, GlTableLite } from '@gitlab/ui';
+import { __, s__ } from '~/locale';
+import createFlash from '~/flash';
+import { redirectTo } from '~/lib/utils/url_utility';
+import CiBadge from '~/vue_shared/components/ci_badge_link.vue';
+import RetryFailedJobMutation from '../../graphql/mutations/retry_failed_job.mutation.graphql';
+import { DEFAULT_FIELDS } from '../../constants';
+
+export default {
+ fields: DEFAULT_FIELDS,
+ retry: __('Retry'),
+ components: {
+ CiBadge,
+ GlButton,
+ GlLink,
+ GlTableLite,
+ },
+ directives: {
+ SafeHtml: GlSafeHtmlDirective,
+ },
+ props: {
+ failedJobs: {
+ type: Array,
+ required: true,
+ },
+ },
+ methods: {
+ async retryJob(id) {
+ try {
+ const {
+ data: {
+ jobRetry: { errors, job },
+ },
+ } = await this.$apollo.mutate({
+ mutation: RetryFailedJobMutation,
+ variables: { id },
+ });
+ if (errors.length > 0) {
+ this.showErrorMessage();
+ } else {
+ redirectTo(job.detailedStatus.detailsPath);
+ }
+ } catch {
+ this.showErrorMessage();
+ }
+ },
+ canRetryJob(job) {
+ return job.retryable && job.userPermissions.updateBuild;
+ },
+ showErrorMessage() {
+ createFlash({ message: s__('Job|There was a problem retrying the failed job.') });
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-table-lite :items="failedJobs" :fields="$options.fields" stacked="lg" fixed>
+ <template #table-colgroup="{ fields }">
+ <col v-for="field in fields" :key="field.key" :class="field.columnClass" />
+ </template>
+
+ <template #cell(name)="{ item }">
+ <div
+ class="gl-display-flex gl-align-items-center gl-lg-justify-content-start gl-justify-content-end"
+ >
+ <ci-badge :status="item.detailedStatus" :show-text="false" class="gl-mr-3" />
+ <div class="gl-text-truncate">
+ <gl-link
+ :href="item.detailedStatus.detailsPath"
+ class="gl-font-weight-bold gl-text-gray-900!"
+ >
+ {{ item.name }}
+ </gl-link>
+ </div>
+ </div>
+ </template>
+
+ <template #cell(stage)="{ item }">
+ <div class="gl-text-truncate">
+ <span>{{ item.stage.name }}</span>
+ </div>
+ </template>
+
+ <template #cell(failure)="{ item }">
+ <span>{{ item.failure }}</span>
+ </template>
+
+ <template #cell(actions)="{ item }">
+ <gl-button
+ v-if="canRetryJob(item)"
+ icon="repeat"
+ :title="$options.retry"
+ :aria-label="$options.retry"
+ @click="retryJob(item.id)"
+ />
+ </template>
+
+ <template #row-details="{ item }">
+ <pre
+ v-if="item.userPermissions.readBuild"
+ class="gl-w-full gl-text-left gl-border-none"
+ data-testid="job-log"
+ >
+ <code v-safe-html="item.failureSummary" class="gl-reset-bg gl-p-0" >
+ </code>
+ </pre>
+ </template>
+ </gl-table-lite>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/jobs/utils.js b/app/assets/javascripts/pipelines/components/jobs/utils.js
new file mode 100644
index 00000000000..c8414d44d14
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/jobs/utils.js
@@ -0,0 +1,33 @@
+/*
+ We get the failure and failure summary from Rails which has
+ a summary failure log. Here we combine that data with the data
+ from GraphQL to display the log.
+
+ failedJobs is from GraphQL
+ failedJobsSummary is from Rails
+ */
+
+export const prepareFailedJobs = (failedJobs = [], failedJobsSummary = []) => {
+ const combinedJobs = [];
+
+ if (failedJobs.length > 0 && failedJobsSummary.length > 0) {
+ failedJobs.forEach((failedJob) => {
+ const foundJob = failedJobsSummary.find(
+ (failedJobSummary) => failedJob.normalizedId === failedJobSummary.id,
+ );
+
+ if (foundJob) {
+ combinedJobs.push({
+ ...failedJob,
+ failure: foundJob?.failure,
+ failureSummary: foundJob?.failure_summary,
+ // this field is needed for the slot row-details
+ // on the failed_jobs_table.vue component
+ _showDetails: true,
+ });
+ }
+ });
+ }
+
+ return combinedJobs;
+};
diff --git a/app/assets/javascripts/pipelines/components/pipeline_tabs.vue b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
index 62c785d7ad2..66d30c10362 100644
--- a/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
+++ b/app/assets/javascripts/pipelines/components/pipeline_tabs.vue
@@ -1,6 +1,7 @@
<script>
import { GlTabs, GlTab } from '@gitlab/ui';
import { __ } from '~/locale';
+import { failedJobsTabName, jobsTabName, needsTabName, testReportTabName } from '../constants';
import PipelineGraphWrapper from './graph/graph_component_wrapper.vue';
import Dag from './dag/dag.vue';
import JobsApp from './jobs/jobs_app.vue';
@@ -16,6 +17,12 @@ export default {
testsTitle: __('Tests'),
},
},
+ tabNames: {
+ needs: needsTabName,
+ jobs: jobsTabName,
+ failures: failedJobsTabName,
+ tests: testReportTabName,
+ },
components: {
Dag,
GlTab,
@@ -25,24 +32,47 @@ export default {
PipelineGraphWrapper,
TestReports,
},
+ inject: ['defaultTabValue'],
+ methods: {
+ isActive(tabName) {
+ return tabName === this.defaultTabValue;
+ },
+ },
};
</script>
<template>
<gl-tabs>
- <gl-tab :title="$options.i18n.tabs.pipelineTitle" data-testid="pipeline-tab">
+ <gl-tab ref="pipelineTab" :title="$options.i18n.tabs.pipelineTitle" data-testid="pipeline-tab">
<pipeline-graph-wrapper />
</gl-tab>
- <gl-tab :title="$options.i18n.tabs.needsTitle" data-testid="dag-tab">
+ <gl-tab
+ ref="dagTab"
+ :title="$options.i18n.tabs.needsTitle"
+ :active="isActive($options.tabNames.needs)"
+ data-testid="dag-tab"
+ >
<dag />
</gl-tab>
- <gl-tab :title="$options.i18n.tabs.jobsTitle" data-testid="jobs-tab">
+ <gl-tab
+ :title="$options.i18n.tabs.jobsTitle"
+ :active="isActive($options.tabNames.jobs)"
+ data-testid="jobs-tab"
+ >
<jobs-app />
</gl-tab>
- <gl-tab :title="$options.i18n.tabs.failedJobsTitle" data-testid="failed-jobs-tab">
+ <gl-tab
+ :title="$options.i18n.tabs.failedJobsTitle"
+ :active="isActive($options.tabNames.failures)"
+ data-testid="failed-jobs-tab"
+ >
<failed-jobs-app />
</gl-tab>
- <gl-tab :title="$options.i18n.tabs.testsTitle" data-testid="tests-tab">
+ <gl-tab
+ :title="$options.i18n.tabs.testsTitle"
+ :active="isActive($options.tabNames.tests)"
+ data-testid="tests-tab"
+ >
<test-reports />
</gl-tab>
<slot></slot>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
index 5a9c85a0f10..3bbdfc73e1b 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state.vue
@@ -1,7 +1,9 @@
<script>
import { GlEmptyState } from '@gitlab/ui';
import { s__ } from '~/locale';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
import PipelinesCiTemplates from './empty_state/pipelines_ci_templates.vue';
+import IosTemplates from './empty_state/ios_templates.vue';
export default {
i18n: {
@@ -10,7 +12,9 @@ export default {
name: 'PipelinesEmptyState',
components: {
GlEmptyState,
+ GitlabExperiment,
PipelinesCiTemplates,
+ IosTemplates,
},
props: {
emptyStateSvgPath: {
@@ -21,26 +25,24 @@ export default {
type: Boolean,
required: true,
},
- ciRunnerSettingsPath: {
+ registrationToken: {
type: String,
required: false,
default: null,
},
- anyRunnersAvailable: {
- type: Boolean,
- required: false,
- default: true,
- },
},
};
</script>
<template>
<div>
- <pipelines-ci-templates
- v-if="canSetCi"
- :ci-runner-settings-path="ciRunnerSettingsPath"
- :any-runners-available="anyRunnersAvailable"
- />
+ <gitlab-experiment v-if="canSetCi" name="ios_specific_templates">
+ <template #control>
+ <pipelines-ci-templates />
+ </template>
+ <template #candidate>
+ <ios-templates :registration-token="registrationToken" />
+ </template>
+ </gitlab-experiment>
<gl-empty-state
v-else
title=""
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue
index 3b312e78d11..64d4414eb94 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ci_templates.vue
@@ -12,15 +12,31 @@ export default {
},
mixins: [Tracking.mixin()],
inject: ['pipelineEditorPath', 'suggestedCiTemplates'],
+ props: {
+ disabled: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ filterTemplates: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
+ },
data() {
- const templates = this.suggestedCiTemplates.map(({ name, logo }) => {
- return {
- name,
- logo,
- link: mergeUrlParams({ template: name }, this.pipelineEditorPath),
- description: sprintf(this.$options.i18n.description, { name }),
- };
- });
+ const templates = this.suggestedCiTemplates
+ .filter(
+ (template) => !this.filterTemplates.length || this.filterTemplates.includes(template.name),
+ )
+ .map(({ name, logo, title }) => {
+ return {
+ name: title || name,
+ logo,
+ link: mergeUrlParams({ template: name }, this.pipelineEditorPath),
+ description: sprintf(this.$options.i18n.description, { name: title || name }),
+ };
+ });
return {
templates,
@@ -34,7 +50,9 @@ export default {
},
},
i18n: {
- description: s__('Pipelines|CI/CD template to test and deploy your %{name} project.'),
+ description: s__(
+ 'Pipelines|Continuous integration and deployment template to test and deploy your %{name} project.',
+ ),
cta: s__('Pipelines|Use template'),
},
AVATAR_SHAPE_OPTION_RECT,
@@ -67,6 +85,7 @@ export default {
</div>
</div>
<gl-button
+ :disabled="disabled"
category="primary"
variant="confirm"
:href="template.link"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ios_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ios_templates.vue
new file mode 100644
index 00000000000..8ff311e90e7
--- /dev/null
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/ios_templates.vue
@@ -0,0 +1,220 @@
+<script>
+import { GlButton, GlCard, GlSprintf, GlLink, GlPopover, GlModalDirective } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { mergeUrlParams } from '~/lib/utils/url_utility';
+import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue';
+import apolloProvider from '~/pipelines/graphql/provider';
+import CiTemplates from './ci_templates.vue';
+
+export default {
+ components: {
+ GlButton,
+ GlCard,
+ GlSprintf,
+ GlLink,
+ GlPopover,
+ RunnerInstructionsModal,
+ CiTemplates,
+ },
+ directives: {
+ GlModalDirective,
+ },
+ inject: ['pipelineEditorPath', 'iosRunnersAvailable'],
+ props: {
+ registrationToken: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ },
+ apolloProvider,
+ iOSTemplateName: 'iOS-Fastlane',
+ modalId: 'runner-instructions-modal',
+ runnerDocsLink: 'https://docs.gitlab.com/runner/install/osx',
+ whatElseLink: helpPagePath('ci/index.md'),
+ i18n: {
+ title: s__('Pipelines|Get started with GitLab CI/CD'),
+ subtitle: s__('Pipelines|Building for iOS?'),
+ explanation: s__("Pipelines|We'll walk you through how to deploy to iOS in two easy steps."),
+ runnerSetupTitle: s__('Pipelines|1. Set up a runner'),
+ runnerSetupButton: s__('Pipelines|Set up a runner'),
+ runnerSetupBodyUnfinished: s__(
+ 'Pipelines|GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline.',
+ ),
+ runnerSetupBodyFinished: s__(
+ 'Pipelines|You have runners available to run your job now. No need to do anything else.',
+ ),
+ runnerSetupPopoverTitle: s__(
+ "Pipelines|Let's get that runner set up! %{emojiStart}tada%{emojiEnd}",
+ ),
+ runnerSetupPopoverBodyLine1: s__(
+ 'Pipelines|Follow these instructions to install GitLab Runner on macOS.',
+ ),
+ runnerSetupPopoverBodyLine2: s__(
+ 'Pipelines|Need more information to set up your runner? %{linkStart}Check out our documentation%{linkEnd}.',
+ ),
+ configurePipelineTitle: s__('Pipelines|2. Configure deployment pipeline'),
+ configurePipelineBody: s__("Pipelines|We'll guide you through a simple pipeline set-up."),
+ configurePipelineButton: s__('Pipelines|Configure pipeline'),
+ noWalkthroughTitle: s__("Pipelines|Don't need a guide? Jump in right away with a template."),
+ noWalkthroughExplanation: s__('Pipelines|Based on your project, we recommend this template:'),
+ notBuildingForIos: s__(
+ "Pipelines|Not building for iOS or not what you're looking for? %{linkStart}See what else%{linkEnd} GitLab CI/CD has to offer.",
+ ),
+ },
+ data() {
+ return {
+ isModalShown: false,
+ isPopoverShown: false,
+ isRunnerSetupFinished: this.iosRunnersAvailable,
+ popoverTarget: `${this.$options.modalId}___BV_modal_content_`,
+ configurePipelineLink: mergeUrlParams(
+ { template: this.$options.iOSTemplateName },
+ this.pipelineEditorPath,
+ ),
+ };
+ },
+ computed: {
+ runnerSetupBodyText() {
+ return this.iosRunnersAvailable
+ ? this.$options.i18n.runnerSetupBodyFinished
+ : this.$options.i18n.runnerSetupBodyUnfinished;
+ },
+ },
+ methods: {
+ showModal() {
+ this.isModalShown = true;
+ },
+ hideModal() {
+ this.togglePopover();
+ this.isRunnerSetupFinished = true;
+ },
+ togglePopover() {
+ this.isPopoverShown = !this.isPopoverShown;
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <h2 class="gl-font-size-h2 gl-text-gray-900">{{ $options.i18n.title }}</h2>
+ <h3 class="gl-font-lg gl-text-gray-900 gl-mt-1">{{ $options.i18n.subtitle }}</h3>
+ <p>{{ $options.i18n.explanation }}</p>
+
+ <div class="gl-lg-display-flex">
+ <div class="gl-lg-display-flex gl-lg-w-25p gl-lg-pr-4 gl-mb-4">
+ <gl-card body-class="gl-display-flex gl-flex-grow-1">
+ <div
+ class="gl-display-flex gl-flex-grow-1 gl-flex-direction-column gl-justify-content-space-between gl-align-items-flex-start"
+ >
+ <div>
+ <div class="gl-py-5">
+ <gl-emoji
+ v-show="isRunnerSetupFinished"
+ class="gl-font-size-h2-xl"
+ data-name="white_check_mark"
+ data-testid="runner-setup-marked-completed"
+ />
+ <gl-emoji
+ v-show="!isRunnerSetupFinished"
+ class="gl-font-size-h2-xl"
+ data-name="tools"
+ data-testid="runner-setup-marked-todo"
+ />
+ </div>
+ <span class="gl-text-gray-800 gl-font-weight-bold">
+ {{ $options.i18n.runnerSetupTitle }}
+ </span>
+ <p class="gl-font-sm gl-mt-3">{{ runnerSetupBodyText }}</p>
+ </div>
+
+ <gl-button
+ v-if="!iosRunnersAvailable"
+ v-gl-modal-directive="$options.modalId"
+ category="primary"
+ variant="confirm"
+ @click="showModal"
+ >
+ {{ $options.i18n.runnerSetupButton }}
+ </gl-button>
+ <runner-instructions-modal
+ v-if="isModalShown"
+ :modal-id="$options.modalId"
+ :registration-token="registrationToken"
+ default-platform-name="osx"
+ @shown="togglePopover"
+ @hide="hideModal"
+ />
+ <gl-popover
+ v-if="isPopoverShown"
+ :show="true"
+ :show-close-button="true"
+ :target="popoverTarget"
+ triggers="manual"
+ placement="left"
+ fallback-placement="clockwise"
+ >
+ <template #title>
+ <gl-sprintf :message="$options.i18n.runnerSetupPopoverTitle">
+ <template #emoji="{ content }">
+ <gl-emoji class="gl-ml-2" :data-name="content" />
+ </template>
+ </gl-sprintf>
+ </template>
+ <div class="gl-mb-5">
+ {{ $options.i18n.runnerSetupPopoverBodyLine1 }}
+ </div>
+ <gl-sprintf :message="$options.i18n.runnerSetupPopoverBodyLine2">
+ <template #link="{ content }">
+ <gl-link :href="$options.runnerDocsLink" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </gl-popover>
+ </div>
+ </gl-card>
+ </div>
+ <div class="gl-lg-display-flex gl-lg-w-25p gl-lg-pr-4 gl-mb-4">
+ <gl-card body-class="gl-display-flex gl-flex-grow-1">
+ <div
+ class="gl-display-flex gl-flex-grow-1 gl-flex-direction-column gl-justify-content-space-between gl-align-items-flex-start"
+ >
+ <div>
+ <div class="gl-py-5"><gl-emoji class="gl-font-size-h2-xl" data-name="tools" /></div>
+ <span class="gl-text-gray-800 gl-font-weight-bold">
+ {{ $options.i18n.configurePipelineTitle }}
+ </span>
+ <p class="gl-font-sm gl-mt-3">{{ $options.i18n.configurePipelineBody }}</p>
+ </div>
+
+ <gl-button
+ :disabled="!isRunnerSetupFinished"
+ category="primary"
+ variant="confirm"
+ data-testid="configure-pipeline-link"
+ :href="configurePipelineLink"
+ >
+ {{ $options.i18n.configurePipelineButton }}
+ </gl-button>
+ </div>
+ </gl-card>
+ </div>
+ </div>
+ <h3 class="gl-font-lg gl-text-gray-900 gl-mt-5">{{ $options.i18n.noWalkthroughTitle }}</h3>
+ <p>{{ $options.i18n.noWalkthroughExplanation }}</p>
+ <ci-templates
+ :filter-templates="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ $options.iOSTemplateName,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ :disabled="!isRunnerSetupFinished"
+ />
+ <p>
+ <gl-sprintf :message="$options.i18n.notBuildingForIos">
+ <template #link="{ content }">
+ <gl-link :href="$options.whatElseLink">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </p>
+ </div>
+</template>
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue
index be46a7f5cec..3eafb36bd1d 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue
@@ -33,19 +33,7 @@ export default {
RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
I18N,
- inject: ['pipelineEditorPath'],
- props: {
- ciRunnerSettingsPath: {
- type: String,
- required: false,
- default: null,
- },
- anyRunnersAvailable: {
- type: Boolean,
- required: false,
- default: true,
- },
- },
+ inject: ['anyRunnersAvailable', 'pipelineEditorPath', 'ciRunnerSettingsPath'],
data() {
return {
gettingStartedTemplateUrl: mergeUrlParams(
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue
index 2b33467e948..e35fccf2d7e 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_mini_graph.vue
@@ -36,7 +36,7 @@ export default {
};
</script>
<template>
- <div data-testid="pipeline-mini-graph">
+ <div data-testid="pipeline-mini-graph" class="gl-display-inline gl-vertical-align-middle gl-my-1">
<div
v-for="stage in stages"
:key="stage.name"
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
index afcb04cd7eb..53e21d4ce8b 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_stage.vue
@@ -12,7 +12,8 @@
* 4. Commit widget
*/
-import { GlDropdown, GlLoadingIcon, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import { GlDropdown, GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { __, sprintf } from '~/locale';
@@ -21,7 +22,7 @@ import JobItem from './job_item.vue';
export default {
components: {
- GlIcon,
+ CiIcon,
GlLoadingIcon,
GlDropdown,
JobItem,
@@ -51,14 +52,6 @@ export default {
dropdownContent: [],
};
},
- computed: {
- triggerButtonClass() {
- return `ci-status-icon-${this.stage.status.group}`;
- },
- borderlessIcon() {
- return `${this.stage.status.icon}_borderless`;
- },
- },
watch: {
updateDropdown() {
if (this.updateDropdown && this.isDropdownOpen() && !this.isLoading) {
@@ -114,15 +107,21 @@ export default {
variant="link"
:aria-label="stageAriaLabel(stage.title)"
:lazy="true"
- :popper-opts="{ placement: 'bottom' }"
- :toggle-class="['mini-pipeline-graph-dropdown-toggle', triggerButtonClass]"
+ :popper-opts="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ placement: 'bottom',
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ :toggle-class="['gl-rounded-full!']"
menu-class="mini-pipeline-graph-dropdown-menu"
@show="onShowDropdown"
>
<template #button-content>
- <span class="gl-pointer-events-none">
- <gl-icon :name="borderlessIcon" />
- </span>
+ <ci-icon
+ is-interactive
+ css-classes="gl-rounded-full"
+ :size="24"
+ :status="stage.status"
+ class="gl-align-items-center gl-display-inline-flex"
+ />
</template>
<gl-loading-icon v-if="isLoading" size="sm" />
<ul
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
index db9dc74863d..485e338f639 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines.vue
@@ -107,16 +107,11 @@ export default {
type: Object,
required: true,
},
- ciRunnerSettingsPath: {
+ registrationToken: {
type: String,
required: false,
default: null,
},
- anyRunnersAvailable: {
- type: Boolean,
- required: false,
- default: true,
- },
},
data() {
return {
@@ -386,8 +381,7 @@ export default {
v-else-if="stateToRender === $options.stateMap.emptyState"
:empty-state-svg-path="emptyStateSvgPath"
:can-set-ci="canCreatePipeline"
- :ci-runner-settings-path="ciRunnerSettingsPath"
- :any-runners-available="anyRunnersAvailable"
+ :registration-token="registrationToken"
/>
<gl-empty-state
diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
index 77b9c2b5203..53da98434b0 100644
--- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
+++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_table.vue
@@ -174,12 +174,13 @@ export default {
<div></div>
<linked-pipelines-mini-list
v-if="item.triggered_by"
- :triggered-by="[item.triggered_by]"
+ :triggered-by="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ item.triggered_by,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
data-testid="mini-graph-upstream"
/>
<pipeline-mini-graph
v-if="item.details && item.details.stages && item.details.stages.length > 0"
- class="gl-display-inline"
:stages="item.details.stages"
:update-dropdown="updateGraphDropdown"
@pipelineActionRequestComplete="onPipelineActionRequestComplete"
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 51373e712ff..9b0e6560c53 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
@@ -35,7 +35,7 @@ export default {
},
computed: {
...mapState(['pageInfo']),
- ...mapGetters(['getSuiteTests', 'getSuiteTestCount']),
+ ...mapGetters(['getSuiteTests', 'getSuiteTestCount', 'getSuiteArtifactsExpired']),
hasSuites() {
return this.getSuiteTests.length > 0;
},
@@ -80,7 +80,8 @@ export default {
<div
v-for="(testCase, index) in getSuiteTests"
:key="index"
- class="gl-responsive-table-row rounded align-items-md-start mt-xs-3 js-case-row"
+ class="gl-responsive-table-row rounded align-items-md-start"
+ data-testid="test-case-row"
>
<div class="table-section section-20 section-wrap">
<div role="rowheader" class="table-mobile-header">{{ __('Suite') }}</div>
@@ -157,7 +158,16 @@ export default {
</div>
<div v-else>
- <p class="js-no-test-cases">{{ s__('TestReports|There are no test cases to display.') }}</p>
+ <p data-testid="no-test-cases">
+ {{ s__('TestReports|There are no test cases to display.') }}
+ </p>
+ <p v-if="getSuiteArtifactsExpired" data-testid="artifacts-expired">
+ {{
+ s__(
+ 'TestReports|Test details are populated by job artifacts. The job artifacts from this pipeline are expired.',
+ )
+ }}
+ </p>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/pipelines/constants.js b/app/assets/javascripts/pipelines/constants.js
index 36f708ff2af..0510992e962 100644
--- a/app/assets/javascripts/pipelines/constants.js
+++ b/app/assets/javascripts/pipelines/constants.js
@@ -9,6 +9,7 @@ export const FILTER_TAG_IDENTIFIER = 'tag';
export const SCHEDULE_ORIGIN = 'schedule';
export const NEEDS_PROPERTY = 'needs';
export const EXPLICIT_NEEDS_PROPERTY = 'previousStageJobsOrNeeds';
+export const PIPELINE_GRAPHQL_TYPE = 'Ci::Pipeline';
export const ICONS = {
TAG: 'tag',
@@ -44,6 +45,28 @@ export const UNSUPPORTED_DATA = 'unsupported_data';
export const CHILD_VIEW = 'child';
+// Pipeline tabs
+
+export const TAB_QUERY_PARAM = 'tab';
+
+export const needsTabName = 'dag';
+export const jobsTabName = 'builds';
+export const failedJobsTabName = 'failures';
+export const testReportTabName = 'test_report';
+export const securityTabName = 'security';
+export const licensesTabName = 'licenses';
+export const codeQualityTabName = 'codequality_report';
+
+export const validPipelineTabNames = [
+ needsTabName,
+ jobsTabName,
+ failedJobsTabName,
+ testReportTabName,
+ securityTabName,
+ licensesTabName,
+ codeQualityTabName,
+];
+
// Constants for the ID and IID selection dropdown
export const PipelineKeyOptions = [
{
@@ -62,3 +85,27 @@ export const TOAST_MESSAGE = s__('Pipeline|Creating pipeline.');
export const BUTTON_TOOLTIP_RETRY = __('Retry failed jobs');
export const BUTTON_TOOLTIP_CANCEL = __('Cancel');
+
+export const DEFAULT_FIELDS = [
+ {
+ key: 'name',
+ label: __('Name'),
+ columnClass: 'gl-w-20p',
+ },
+ {
+ key: 'stage',
+ label: __('Stage'),
+ columnClass: 'gl-w-20p',
+ },
+ {
+ key: 'failure',
+ label: __('Failure'),
+ columnClass: 'gl-w-40p',
+ },
+ {
+ key: 'actions',
+ label: '',
+ tdClass: 'gl-text-right',
+ columnClass: 'gl-w-20p',
+ },
+];
diff --git a/app/assets/javascripts/pipelines/graphql/mutations/retry_failed_job.mutation.graphql b/app/assets/javascripts/pipelines/graphql/mutations/retry_failed_job.mutation.graphql
new file mode 100644
index 00000000000..1955cc9b0ac
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/mutations/retry_failed_job.mutation.graphql
@@ -0,0 +1,12 @@
+mutation retryFailedJob($id: CiBuildID!) {
+ jobRetry(input: { id: $id }) {
+ job {
+ id
+ detailedStatus {
+ id
+ detailsPath
+ }
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/pipelines/graphql/provider.js b/app/assets/javascripts/pipelines/graphql/provider.js
new file mode 100644
index 00000000000..ef96b443da8
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/provider.js
@@ -0,0 +1,9 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+
+Vue.use(VueApollo);
+
+export default new VueApollo({
+ defaultClient: createDefaultClient(),
+});
diff --git a/app/assets/javascripts/pipelines/graphql/queries/get_failed_jobs.query.graphql b/app/assets/javascripts/pipelines/graphql/queries/get_failed_jobs.query.graphql
new file mode 100644
index 00000000000..14e9a838f4b
--- /dev/null
+++ b/app/assets/javascripts/pipelines/graphql/queries/get_failed_jobs.query.graphql
@@ -0,0 +1,41 @@
+query getFailedJobs($fullPath: ID!, $pipelineIid: ID!) {
+ project(fullPath: $fullPath) {
+ id
+ pipeline(iid: $pipelineIid) {
+ id
+ jobs(statuses: FAILED) {
+ nodes {
+ status
+ detailedStatus {
+ id
+ detailsPath
+ group
+ icon
+ label
+ text
+ tooltip
+ action {
+ id
+ buttonTitle
+ icon
+ method
+ path
+ title
+ }
+ }
+ id
+ stage {
+ id
+ name
+ }
+ name
+ retryable
+ userPermissions {
+ readBuild
+ updateBuild
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/pipelines/pipeline_details_bundle.js b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
index 338de65e795..fd869014570 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_bundle.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_bundle.js
@@ -1,10 +1,11 @@
import createFlash from '~/flash';
-import { __ } from '~/locale';
+import { __, s__ } from '~/locale';
import createDagApp from './pipeline_details_dag';
import { createPipelinesDetailApp } from './pipeline_details_graph';
import { createPipelineHeaderApp } from './pipeline_details_header';
import { createPipelineNotificationApp } from './pipeline_details_notification';
import { createPipelineJobsApp } from './pipeline_details_jobs';
+import { createPipelineFailedJobsApp } from './pipeline_details_failed_jobs';
import { apolloProvider } from './pipeline_shared_client';
import { createTestDetails } from './pipeline_test_details';
@@ -16,6 +17,7 @@ const SELECTORS = {
PIPELINE_TABS: '#js-pipeline-tabs',
PIPELINE_TESTS: '#js-pipeline-tests-detail',
PIPELINE_JOBS: '#js-pipeline-jobs-vue',
+ PIPELINE_FAILED_JOBS: '#js-pipeline-failed-jobs-vue',
};
export default async function initPipelineDetailsBundle() {
@@ -79,5 +81,15 @@ export default async function initPipelineDetailsBundle() {
message: __('An error occurred while loading the Jobs tab.'),
});
}
+
+ if (gon.features?.failedJobsTabVue) {
+ try {
+ createPipelineFailedJobsApp(SELECTORS.PIPELINE_FAILED_JOBS);
+ } catch {
+ createFlash({
+ message: s__('Jobs|An error occurred while loading the Failed Jobs tab.'),
+ });
+ }
+ }
}
}
diff --git a/app/assets/javascripts/pipelines/pipeline_details_dag.js b/app/assets/javascripts/pipelines/pipeline_details_dag.js
index e2835ecc4d1..b2cb0457c4d 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_dag.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_dag.js
@@ -17,7 +17,7 @@ const createDagApp = (apolloProvider) => {
emptySvgPath,
pipelineProjectPath,
pipelineIid,
- } = el?.dataset;
+ } = el.dataset;
// eslint-disable-next-line no-new
new Vue({
diff --git a/app/assets/javascripts/pipelines/pipeline_details_failed_jobs.js b/app/assets/javascripts/pipelines/pipeline_details_failed_jobs.js
new file mode 100644
index 00000000000..7bf3b64bf47
--- /dev/null
+++ b/app/assets/javascripts/pipelines/pipeline_details_failed_jobs.js
@@ -0,0 +1,36 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createDefaultClient from '~/lib/graphql';
+import FailedJobsApp from './components/jobs/failed_jobs_app.vue';
+
+Vue.use(VueApollo);
+
+const apolloProvider = new VueApollo({
+ defaultClient: createDefaultClient(),
+});
+
+export const createPipelineFailedJobsApp = (selector) => {
+ const containerEl = document.querySelector(selector);
+
+ if (!containerEl) {
+ return false;
+ }
+
+ const { fullPath, pipelineIid, failedJobsSummaryData } = containerEl.dataset;
+
+ return new Vue({
+ el: containerEl,
+ apolloProvider,
+ provide: {
+ fullPath,
+ pipelineIid,
+ },
+ render(createElement) {
+ return createElement(FailedJobsApp, {
+ props: {
+ failedJobsSummary: JSON.parse(failedJobsSummaryData),
+ },
+ });
+ },
+ });
+};
diff --git a/app/assets/javascripts/pipelines/pipeline_details_header.js b/app/assets/javascripts/pipelines/pipeline_details_header.js
index 1c619768764..2fedd7e7a98 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_header.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_header.js
@@ -11,7 +11,7 @@ export const createPipelineHeaderApp = (elSelector, apolloProvider, graphqlResou
return;
}
- const { fullPath, pipelineId, pipelineIid, pipelinesPath } = el?.dataset;
+ const { fullPath, pipelineId, pipelineIid, pipelinesPath } = el.dataset;
// eslint-disable-next-line no-new
new Vue({
el,
diff --git a/app/assets/javascripts/pipelines/pipeline_details_notification.js b/app/assets/javascripts/pipelines/pipeline_details_notification.js
index 0061be843c5..b480fc7c713 100644
--- a/app/assets/javascripts/pipelines/pipeline_details_notification.js
+++ b/app/assets/javascripts/pipelines/pipeline_details_notification.js
@@ -11,7 +11,7 @@ export const createPipelineNotificationApp = (elSelector, apolloProvider) => {
return;
}
- const { deprecatedKeywordsDocPath, fullPath, pipelineIid } = el?.dataset;
+ const { deprecatedKeywordsDocPath, fullPath, pipelineIid } = el.dataset;
// eslint-disable-next-line no-new
new Vue({
el,
diff --git a/app/assets/javascripts/pipelines/pipeline_tabs.js b/app/assets/javascripts/pipelines/pipeline_tabs.js
index ff88c6215e5..530917f0402 100644
--- a/app/assets/javascripts/pipelines/pipeline_tabs.js
+++ b/app/assets/javascripts/pipelines/pipeline_tabs.js
@@ -1,7 +1,10 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import PipelineTabs from 'ee_else_ce/pipelines/components/pipeline_tabs.vue';
-import { reportToSentry } from './utils';
+import { removeParams, updateHistory } from '~/lib/utils/url_utility';
+import { TAB_QUERY_PARAM } from '~/pipelines/constants';
+import { parseBoolean } from '~/lib/utils/common_utils';
+import { getPipelineDefaultTab, reportToSentry } from './utils';
Vue.use(VueApollo);
@@ -17,7 +20,19 @@ const createPipelineTabs = (selector, apolloProvider) => {
downloadablePathForReportType,
exposeSecurityDashboard,
exposeLicenseScanningData,
+ graphqlResourceEtag,
+ pipelineIid,
+ pipelineProjectPath,
} = dataset;
+
+ const defaultTabValue = getPipelineDefaultTab(window.location.href);
+
+ updateHistory({
+ url: removeParams([TAB_QUERY_PARAM]),
+ title: document.title,
+ replace: true,
+ });
+
// eslint-disable-next-line no-new
new Vue({
el: selector,
@@ -26,11 +41,15 @@ const createPipelineTabs = (selector, apolloProvider) => {
},
apolloProvider,
provide: {
- canGenerateCodequalityReports: JSON.parse(canGenerateCodequalityReports),
+ canGenerateCodequalityReports: parseBoolean(canGenerateCodequalityReports),
codequalityReportDownloadPath,
+ defaultTabValue,
downloadablePathForReportType,
- exposeSecurityDashboard: JSON.parse(exposeSecurityDashboard),
- exposeLicenseScanningData: JSON.parse(exposeLicenseScanningData),
+ exposeSecurityDashboard: parseBoolean(exposeSecurityDashboard),
+ exposeLicenseScanningData: parseBoolean(exposeLicenseScanningData),
+ graphqlResourceEtag,
+ pipelineIid,
+ pipelineProjectPath,
},
errorCaptured(err, _vm, info) {
reportToSentry('pipeline_tabs', `error: ${err}, info: ${info}`);
diff --git a/app/assets/javascripts/pipelines/pipelines_index.js b/app/assets/javascripts/pipelines/pipelines_index.js
index f4d9a44a754..6dccdb1a3e6 100644
--- a/app/assets/javascripts/pipelines/pipelines_index.js
+++ b/app/assets/javascripts/pipelines/pipelines_index.js
@@ -40,6 +40,8 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
params,
ciRunnerSettingsPath,
anyRunnersAvailable,
+ iosRunnersAvailable,
+ registrationToken,
} = el.dataset;
return new Vue({
@@ -49,6 +51,9 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
artifactsEndpoint,
artifactsEndpointPlaceholder,
suggestedCiTemplates: JSON.parse(suggestedCiTemplates),
+ ciRunnerSettingsPath,
+ anyRunnersAvailable: parseBoolean(anyRunnersAvailable),
+ iosRunnersAvailable: parseBoolean(iosRunnersAvailable),
},
data() {
return {
@@ -78,8 +83,7 @@ export const initPipelinesIndex = (selector = '#pipelines-list-vue') => {
projectId,
defaultBranchName,
params: JSON.parse(params),
- ciRunnerSettingsPath,
- anyRunnersAvailable: parseBoolean(anyRunnersAvailable),
+ registrationToken,
},
});
},
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/actions.js b/app/assets/javascripts/pipelines/stores/test_reports/actions.js
index b7f590a7b3c..f0556f3d12e 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/actions.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/actions.js
@@ -38,11 +38,7 @@ export const fetchTestSuite = ({ state, commit, dispatch }, index) => {
return axios
.get(state.suiteEndpoint, { params: { build_ids } })
.then(({ data }) => commit(types.SET_SUITE, { suite: data, index }))
- .catch(() => {
- createFlash({
- message: s__('TestReports|There was an error fetching the test suite.'),
- });
- })
+ .catch((error) => commit(types.SET_SUITE_ERROR, error))
.finally(() => {
dispatch('toggleLoading');
});
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/constants.js b/app/assets/javascripts/pipelines/stores/test_reports/constants.js
new file mode 100644
index 00000000000..8eebfb6b208
--- /dev/null
+++ b/app/assets/javascripts/pipelines/stores/test_reports/constants.js
@@ -0,0 +1 @@
+export const ARTIFACTS_EXPIRED_ERROR_MESSAGE = 'Test report artifacts have expired';
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/getters.js b/app/assets/javascripts/pipelines/stores/test_reports/getters.js
index 03680de0fa9..e6a88bb4175 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/getters.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/getters.js
@@ -1,4 +1,5 @@
import { addIconStatus, formatFilePath, formattedTime } from './utils';
+import { ARTIFACTS_EXPIRED_ERROR_MESSAGE } from './constants';
export const getTestSuites = (state) => {
const { test_suites: testSuites = [] } = state.testReports;
@@ -29,3 +30,6 @@ export const getSuiteTests = (state) => {
};
export const getSuiteTestCount = (state) => getSelectedSuite(state)?.test_cases?.length || 0;
+
+export const getSuiteArtifactsExpired = (state) =>
+ state.errorMessage === ARTIFACTS_EXPIRED_ERROR_MESSAGE;
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/mutation_types.js b/app/assets/javascripts/pipelines/stores/test_reports/mutation_types.js
index 803f6bf60b1..7651a2f4327 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/mutation_types.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/mutation_types.js
@@ -2,4 +2,5 @@ export const SET_PAGE = 'SET_PAGE';
export const SET_SELECTED_SUITE_INDEX = 'SET_SELECTED_SUITE_INDEX';
export const SET_SUMMARY = 'SET_SUMMARY';
export const SET_SUITE = 'SET_SUITE';
+export const SET_SUITE_ERROR = 'SET_SUITE_ERROR';
export const TOGGLE_LOADING = 'TOGGLE_LOADING';
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/mutations.js b/app/assets/javascripts/pipelines/stores/test_reports/mutations.js
index cf0bf8483dd..68ee063dda7 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/mutations.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/mutations.js
@@ -1,3 +1,5 @@
+import createFlash from '~/flash';
+import { s__ } from '~/locale';
import * as types from './mutation_types';
export default {
@@ -13,6 +15,18 @@ export default {
state.testReports.test_suites[index] = { ...suite, hasFullSuite: true };
},
+ [types.SET_SUITE_ERROR](state, error) {
+ const errorMessage = error.response?.data?.errors;
+
+ if (errorMessage) {
+ state.errorMessage = errorMessage;
+ } else {
+ createFlash({
+ message: s__('TestReports|There was an error fetching the test suite.'),
+ });
+ }
+ },
+
[types.SET_SELECTED_SUITE_INDEX](state, selectedSuiteIndex) {
Object.assign(state, { selectedSuiteIndex });
},
diff --git a/app/assets/javascripts/pipelines/stores/test_reports/state.js b/app/assets/javascripts/pipelines/stores/test_reports/state.js
index 0ee6f53fa58..3ec9418c14e 100644
--- a/app/assets/javascripts/pipelines/stores/test_reports/state.js
+++ b/app/assets/javascripts/pipelines/stores/test_reports/state.js
@@ -5,6 +5,7 @@ export default ({ blobPath = '', summaryEndpoint = '', suiteEndpoint = '' }) =>
testReports: {},
selectedSuiteIndex: null,
isLoading: false,
+ errorMessage: null,
pageInfo: {
page: 1,
perPage: 20,
diff --git a/app/assets/javascripts/pipelines/utils.js b/app/assets/javascripts/pipelines/utils.js
index f6e1c8b7412..588d15495ab 100644
--- a/app/assets/javascripts/pipelines/utils.js
+++ b/app/assets/javascripts/pipelines/utils.js
@@ -1,7 +1,12 @@
import * as Sentry from '@sentry/browser';
import { pickBy } from 'lodash';
-import { SUPPORTED_FILTER_PARAMETERS, NEEDS_PROPERTY } from './constants';
-
+import { getParameterValues } from '~/lib/utils/url_utility';
+import {
+ NEEDS_PROPERTY,
+ SUPPORTED_FILTER_PARAMETERS,
+ TAB_QUERY_PARAM,
+ validPipelineTabNames,
+} from './constants';
/*
The following functions are the main engine in transforming the data as
received from the endpoint into the format the d3 graph expects.
@@ -138,3 +143,13 @@ export const reportMessageToSentry = (component, message, context) => {
Sentry.captureMessage(message);
});
};
+
+export const getPipelineDefaultTab = (url) => {
+ const [tabQueryValue] = getParameterValues(TAB_QUERY_PARAM, url);
+
+ if (tabQueryValue && validPipelineTabNames.includes(tabQueryValue)) {
+ return tabQueryValue;
+ }
+
+ return null;
+};
diff --git a/app/assets/javascripts/project_select_combo_button.js b/app/assets/javascripts/project_select_combo_button.js
index 09dbf2cee04..ad80032c551 100644
--- a/app/assets/javascripts/project_select_combo_button.js
+++ b/app/assets/javascripts/project_select_combo_button.js
@@ -1,5 +1,6 @@
import $ from 'jquery';
import { sprintf, __ } from '~/locale';
+import { sanitizeUrl } from '~/lib/utils/url_utility';
import AccessorUtilities from './lib/utils/accessor';
import { loadCSSFile } from './lib/utils/css_utils';
@@ -80,7 +81,7 @@ export default class ProjectSelectComboButton {
setNewItemBtnAttributes(project) {
if (project) {
- this.newItemBtn.attr('href', project.url);
+ this.newItemBtn.attr('href', sanitizeUrl(project.url));
this.newItemBtn.text(
sprintf(__('New %{type} in %{project}'), {
type: this.resourceLabel,
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 8511f9bdb0f..9bd78b7c89e 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
@@ -121,20 +121,18 @@ export default {
</script>
<template>
- <div>
+ <div class="gl-pt-2">
<gl-loading-icon v-if="$apollo.queries.pipeline.loading" />
- <div v-else>
+ <div v-else class="gl-align-items-center gl-display-flex">
<linked-pipelines-mini-list
v-if="upstreamPipeline"
- :triggered-by="[upstreamPipeline]"
+ :triggered-by="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ [
+ upstreamPipeline,
+ ] /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
data-testid="commit-box-mini-graph-upstream"
/>
- <pipeline-mini-graph
- :stages="formattedStages"
- class="gl-display-inline"
- data-testid="commit-box-mini-graph"
- />
+ <pipeline-mini-graph :stages="formattedStages" data-testid="commit-box-mini-graph" />
<linked-pipelines-mini-list
v-if="hasDownstream"
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index 3e1c471f015..2bf13941f6f 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -1,6 +1,6 @@
import $ from 'jquery';
import { debounce } from 'lodash';
-import DEFAULT_PROJECT_TEMPLATES from 'ee_else_ce/projects/default_project_templates';
+import DEFAULT_PROJECT_TEMPLATES from 'any_else_ce/projects/default_project_templates';
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '../lib/utils/constants';
import { ENTER_KEY } from '../lib/utils/keys';
@@ -286,9 +286,6 @@ const bindEvents = () => {
});
$('.js-import-git-toggle-button').on('click', () => {
- const $projectMirror = $('#project_mirror');
-
- $projectMirror.attr('disabled', !$projectMirror.attr('disabled'));
setProjectNamePathHandlers(
$('.tab-pane.active #project_name'),
$('.tab-pane.active #project_path'),
diff --git a/app/assets/javascripts/projects/settings/init_access_dropdown.js b/app/assets/javascripts/projects/settings/init_access_dropdown.js
index 11272652b63..941efaef3bc 100644
--- a/app/assets/javascripts/projects/settings/init_access_dropdown.js
+++ b/app/assets/javascripts/projects/settings/init_access_dropdown.js
@@ -4,7 +4,7 @@ import AccessDropdown from './components/access_dropdown.vue';
export const initAccessDropdown = (el, options) => {
if (!el) {
- return false;
+ return null;
}
const { accessLevelsData, accessLevel } = options;
diff --git a/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue b/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
index d4c97cbf038..9c8de9bef2d 100644
--- a/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
+++ b/app/assets/javascripts/projects/settings/topics/components/topics_token_selector.vue
@@ -85,7 +85,7 @@ export default {
<gl-avatar-labeled
:src="dropdownItem.avatarUrl"
:entity-name="dropdownItem.name"
- :label="dropdownItem.name"
+ :label="dropdownItem.title"
:size="32"
:shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
diff --git a/app/assets/javascripts/projects/settings/topics/queries/project_topics_search.query.graphql b/app/assets/javascripts/projects/settings/topics/queries/project_topics_search.query.graphql
index b193165062a..0c0a874d950 100644
--- a/app/assets/javascripts/projects/settings/topics/queries/project_topics_search.query.graphql
+++ b/app/assets/javascripts/projects/settings/topics/queries/project_topics_search.query.graphql
@@ -3,6 +3,7 @@ query searchProjectTopics($search: String) {
nodes {
id
name
+ title
avatarUrl
}
}
diff --git a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
index e5ddfe82e3b..8a9a0b541f3 100644
--- a/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
+++ b/app/assets/javascripts/projects/settings_service_desk/components/service_desk_setting.vue
@@ -128,7 +128,7 @@ export default {
this.selectedTemplate = selectedTemplate;
},
validateProjectKey() {
- if (this.projectKey && !new RegExp(/^[a-z0-9_]+$/).test(this.projectKey)) {
+ if (this.projectKey && !/^[a-z0-9_]+$/.test(this.projectKey)) {
this.projectKeyError = __('Only use lowercase letters, numbers, and underscores.');
return;
}
@@ -270,18 +270,16 @@ export default {
</template>
</gl-form-group>
- <div class="gl-display-flex gl-justify-content-end">
- <gl-button
- variant="success"
- class="gl-mt-5"
- data-testid="save_service_desk_settings_button"
- data-qa-selector="save_service_desk_settings_button"
- :disabled="isTemplateSaving"
- @click="onSaveTemplate"
- >
- {{ __('Save changes') }}
- </gl-button>
- </div>
+ <gl-button
+ variant="confirm"
+ class="gl-mt-5"
+ data-testid="save_service_desk_settings_button"
+ data-qa-selector="save_service_desk_settings_button"
+ :disabled="isTemplateSaving"
+ @click="onSaveTemplate"
+ >
+ {{ __('Save changes') }}
+ </gl-button>
</div>
</div>
</div>
diff --git a/app/assets/javascripts/prometheus_alerts/components/reset_key.vue b/app/assets/javascripts/prometheus_alerts/components/reset_key.vue
deleted file mode 100644
index befbca48736..00000000000
--- a/app/assets/javascripts/prometheus_alerts/components/reset_key.vue
+++ /dev/null
@@ -1,149 +0,0 @@
-<script>
-import {
- GlButton,
- GlFormGroup,
- GlFormInput,
- GlModal,
- GlModalDirective,
- GlSprintf,
- GlLink,
-} from '@gitlab/ui';
-import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { __ } from '~/locale';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-
-export default {
- copyToClipboard: __('Copy'),
- components: {
- GlButton,
- GlFormGroup,
- GlFormInput,
- GlModal,
- ClipboardButton,
- GlSprintf,
- GlLink,
- },
- directives: {
- 'gl-modal': GlModalDirective,
- },
- props: {
- initialAuthorizationKey: {
- type: String,
- required: false,
- default: '',
- },
- changeKeyUrl: {
- type: String,
- required: true,
- },
- notifyUrl: {
- type: String,
- required: true,
- },
- learnMoreUrl: {
- type: String,
- required: true,
- },
- disabled: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- authorizationKey: this.initialAuthorizationKey,
- };
- },
- methods: {
- resetKey() {
- axios
- .post(this.changeKeyUrl)
- .then((res) => {
- this.authorizationKey = res.data.token;
- })
- .catch(() => {
- createFlash({
- message: __('Failed to reset key. Please try again.'),
- });
- });
- },
- },
-};
-</script>
-
-<template>
- <div class="row py-4 border-top js-prometheus-alerts">
- <div class="col-lg-3">
- <h4 class="mt-0">
- {{ __('Alerts') }}
- </h4>
- <p>
- {{ __('Receive alerts from manually configured Prometheus servers.') }}
- </p>
- </div>
- <div class="col-lg-9">
- <gl-sprintf
- :message="
- __(
- 'To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab.',
- )
- "
- >
- <template #link="{ content }">
- <gl-link :href="learnMoreUrl" target="_blank">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- <gl-form-group :label="__('URL')" label-for="notify-url" label-class="label-bold">
- <div class="input-group">
- <gl-form-input id="notify-url" :readonly="true" :value="notifyUrl" />
- <span class="input-group-append">
- <clipboard-button
- :text="notifyUrl"
- :title="$options.copyToClipboard"
- :disabled="disabled"
- />
- </span>
- </div>
- </gl-form-group>
- <gl-form-group
- :label="__('Authorization key')"
- label-for="authorization-key"
- label-class="label-bold"
- >
- <div class="input-group">
- <gl-form-input id="authorization-key" :readonly="true" :value="authorizationKey" />
- <span class="input-group-append">
- <clipboard-button
- :text="authorizationKey"
- :title="$options.copyToClipboard"
- :disabled="disabled"
- />
- </span>
- </div>
- </gl-form-group>
- <template v-if="authorizationKey.length > 0">
- <gl-modal
- modal-id="authKeyModal"
- :title="__('Reset authorization key?')"
- :ok-title="__('Reset authorization key')"
- ok-variant="danger"
- @ok="resetKey"
- >
- {{
- __(
- 'Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key.',
- )
- }}
- </gl-modal>
- <gl-button v-gl-modal.authKeyModal class="js-reset-auth-key" :disabled="disabled">{{
- __('Reset key')
- }}</gl-button>
- </template>
- <gl-button v-else :disabled="disabled" class="js-reset-auth-key" @click="resetKey">{{
- __('Generate key')
- }}</gl-button>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/prometheus_alerts/index.js b/app/assets/javascripts/prometheus_alerts/index.js
deleted file mode 100644
index 7efe6ed186b..00000000000
--- a/app/assets/javascripts/prometheus_alerts/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import Vue from 'vue';
-import ResetKey from './components/reset_key.vue';
-
-export default () => {
- const el = document.querySelector('#js-settings-prometheus-alerts');
-
- if (!el) {
- return;
- }
-
- const { authorizationKey, changeKeyUrl, notifyUrl, learnMoreUrl, disabled } = el.dataset;
-
- // eslint-disable-next-line no-new
- new Vue({
- el,
- render(createElement) {
- return createElement(ResetKey, {
- props: {
- initialAuthorizationKey: authorizationKey,
- changeKeyUrl,
- notifyUrl,
- learnMoreUrl,
- disabled,
- },
- });
- },
- });
-};
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 9ee2e7a4ffd..42de419aec4 100644
--- a/app/assets/javascripts/related_issues/components/add_issuable_form.vue
+++ b/app/assets/javascripts/related_issues/components/add_issuable_form.vue
@@ -195,7 +195,10 @@ export default {
:path-id-separator="pathIdSeparator"
:input-value="inputValue"
:auto-complete-sources="transformedAutocompleteSources"
- :auto-complete-options="{ issues: autoCompleteIssues, epics: autoCompleteEpics }"
+ :auto-complete-options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ issues: autoCompleteIssues,
+ epics: autoCompleteEpics,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:issuable-type="issuableType"
@pendingIssuableRemoveRequest="onPendingIssuableRemoveRequest"
@formCancel="onFormCancel"
diff --git a/app/assets/javascripts/related_issues/components/related_issues_root.vue b/app/assets/javascripts/related_issues/components/related_issues_root.vue
index 40d58c04753..da049d68467 100644
--- a/app/assets/javascripts/related_issues/components/related_issues_root.vue
+++ b/app/assets/javascripts/related_issues/components/related_issues_root.vue
@@ -220,7 +220,8 @@ export default {
const startsWithNumber = String(touchedReference).match(/^[0-9]/) !== null;
if (startsWithNumber) {
- this.inputValue = `#${touchedReference}`;
+ const { pathIdSeparator } = this;
+ this.inputValue = `${pathIdSeparator}${touchedReference}`;
} else {
this.inputValue = `${touchedReference}`;
}
diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue
index 8365e6a5ab0..327da1fb2a1 100644
--- a/app/assets/javascripts/releases/components/app_edit_new.vue
+++ b/app/assets/javascripts/releases/components/app_edit_new.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlFormInput, GlFormGroup, GlSprintf } from '@gitlab/ui';
+import { GlButton, 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';
@@ -12,9 +12,11 @@ import TagField from './tag_field.vue';
export default {
name: 'ReleaseEditNewApp',
components: {
+ GlFormCheckbox,
GlFormInput,
GlFormGroup,
GlButton,
+ GlLink,
GlSprintf,
MarkdownField,
AssetLinksForm,
@@ -28,6 +30,7 @@ export default {
'fetchError',
'markdownDocsPath',
'markdownPreviewPath',
+ 'editReleaseDocsPath',
'releasesPagePath',
'release',
'newMilestonePath',
@@ -35,8 +38,9 @@ export default {
'projectId',
'groupId',
'groupMilestonesAvailable',
+ 'tagNotes',
]),
- ...mapGetters('editNew', ['isValid', 'isExistingRelease']),
+ ...mapGetters('editNew', ['isValid', 'isExistingRelease', 'formattedReleaseNotes']),
showForm() {
return Boolean(!this.isFetchingRelease && !this.fetchError && this.release);
},
@@ -64,6 +68,14 @@ export default {
this.updateReleaseMilestones(milestones);
},
},
+ includeTagNotes: {
+ get() {
+ return this.$store.state.editNew.includeTagNotes;
+ },
+ set(includeTagNotes) {
+ this.updateIncludeTagNotes(includeTagNotes);
+ },
+ },
cancelPath() {
const backUrl = getParameterByName(BACK_URL_PARAM);
@@ -105,6 +117,7 @@ export default {
'updateReleaseTitle',
'updateReleaseNotes',
'updateReleaseMilestones',
+ 'updateIncludeTagNotes',
]),
submitForm() {
if (!this.isFormSubmissionDisabled) {
@@ -161,7 +174,7 @@ export default {
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
:add-spacing-classes="false"
- :textarea-value="releaseNotes"
+ :textarea-value="formattedReleaseNotes"
class="gl-mt-3 gl-mb-3"
>
<template #textarea>
@@ -178,6 +191,25 @@ export default {
</markdown-field>
</div>
</gl-form-group>
+ <gl-form-group v-if="!isExistingRelease">
+ <gl-form-checkbox v-model="includeTagNotes">
+ {{ s__('Release|Include message from the annotated tag.') }}
+
+ <template #help>
+ <gl-sprintf
+ :message="
+ s__(
+ 'Release|You can edit the content later by editing the release. %{linkStart}How do I edit a release?%{linkEnd}',
+ )
+ "
+ >
+ <template #link="{ content }">
+ <gl-link :href="editReleaseDocsPath">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </template>
+ </gl-form-checkbox>
+ </gl-form-group>
<asset-links-form />
diff --git a/app/assets/javascripts/releases/components/tag_field_new.vue b/app/assets/javascripts/releases/components/tag_field_new.vue
index 9e05d00a98d..d3b6d07590f 100644
--- a/app/assets/javascripts/releases/components/tag_field_new.vue
+++ b/app/assets/javascripts/releases/components/tag_field_new.vue
@@ -52,7 +52,10 @@ export default {
},
},
showTagNameValidationError() {
- return this.isInputDirty && this.validationErrors.isTagNameEmpty;
+ return (
+ this.isInputDirty &&
+ (this.validationErrors.isTagNameEmpty || this.validationErrors.existingRelease)
+ );
},
tagNameInputId() {
return uniqueId('tag-name-input-');
@@ -60,9 +63,14 @@ export default {
createFromSelectorId() {
return uniqueId('create-from-selector-');
},
+ tagFeedback() {
+ return this.validationErrors.existingRelease
+ ? __('Selected tag is already in use. Choose another option.')
+ : __('Tag name is required.');
+ },
},
methods: {
- ...mapActions('editNew', ['updateReleaseTagName', 'updateCreateFrom']),
+ ...mapActions('editNew', ['updateReleaseTagName', 'updateCreateFrom', 'fetchTagNotes']),
markInputAsDirty() {
this.isInputDirty = true;
},
@@ -112,7 +120,7 @@ export default {
<gl-form-group
data-testid="tag-name-field"
:state="!showTagNameValidationError"
- :invalid-feedback="__('Tag name is required')"
+ :invalid-feedback="tagFeedback"
:label="$options.translations.tagName.label"
:label-for="tagNameInputId"
:label-description="$options.translations.tagName.labelDescription"
@@ -125,6 +133,7 @@ export default {
:translations="$options.translations.tagName"
:enabled-ref-types="$options.tagNameEnabledRefTypes"
:state="!showTagNameValidationError"
+ @input="fetchTagNotes"
@hide.once="markInputAsDirty"
>
<template #footer="{ isLoading, matches, query }">
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 b3ba4f9263a..08197377f61 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js
@@ -1,3 +1,4 @@
+import { getTag } from '~/rest_api';
import createFlash from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
@@ -7,6 +8,7 @@ import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_
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 * as types from './mutation_types';
export const initializeRelease = ({ commit, dispatch, getters }) => {
@@ -224,3 +226,23 @@ export const updateRelease = async ({ commit, dispatch, state, getters }) => {
});
}
};
+
+export const fetchTagNotes = ({ commit, state }, tagName) => {
+ commit(types.REQUEST_TAG_NOTES);
+
+ return getTag(state.projectId, tagName)
+ .then(({ data }) => {
+ commit(types.RECEIVE_TAG_NOTES_SUCCESS, data);
+ })
+ .catch((error) => {
+ createFlash({
+ message: s__('Release|Unable to fetch the tag notes.'),
+ });
+
+ commit(types.RECEIVE_TAG_NOTES_ERROR, error);
+ });
+};
+
+export const updateIncludeTagNotes = ({ commit }, includeTagNotes) => {
+ commit(types.UPDATE_INCLUDE_TAG_NOTES, includeTagNotes);
+};
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 d4f49e53619..0ca5eb9931a 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js
@@ -1,4 +1,5 @@
import { isEmpty } from 'lodash';
+import { s__ } from '~/locale';
import { hasContent } from '~/lib/utils/text_utility';
import { getDuplicateItemsFromArray } from '~/lib/utils/array_utility';
@@ -52,6 +53,10 @@ export const validationErrors = (state) => {
errors.isTagNameEmpty = true;
}
+ if (state.existingRelease) {
+ errors.existingRelease = true;
+ }
+
// Each key of this object is a URL, and the value is an
// array of Release link objects that share this URL.
// This is used for detecting duplicate URLs.
@@ -113,11 +118,15 @@ export const validationErrors = (state) => {
/** Returns whether or not the release object is valid */
export const isValid = (_state, getters) => {
const errors = getters.validationErrors;
- return Object.values(errors.assets.links).every(isEmpty) && !errors.isTagNameEmpty;
+ return (
+ Object.values(errors.assets.links).every(isEmpty) &&
+ !errors.isTagNameEmpty &&
+ !errors.existingRelease
+ );
};
/** Returns all the variables for a `releaseUpdate` GraphQL mutation */
-export const releaseUpdateMutatationVariables = (state) => {
+export const releaseUpdateMutatationVariables = (state, getters) => {
const name = state.release.name?.trim().length > 0 ? state.release.name.trim() : null;
// Milestones may be either a list of milestone objects OR just a list
@@ -129,7 +138,9 @@ export const releaseUpdateMutatationVariables = (state) => {
projectPath: state.projectPath,
tagName: state.release.tagName,
name,
- description: state.release.description,
+ description: state.includeTagNotes
+ ? getters.formattedReleaseNotes
+ : state.release.description,
milestones,
},
};
@@ -151,3 +162,8 @@ export const releaseCreateMutatationVariables = (state, getters) => {
},
};
};
+
+export const formattedReleaseNotes = ({ includeTagNotes, release: { description }, tagNotes }) =>
+ includeTagNotes && tagNotes
+ ? `${description}\n\n### ${s__('Releases|Tag message')}\n\n${tagNotes}\n`
+ : description;
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 1b2f5f33f02..daa077309a1 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
@@ -20,3 +20,9 @@ export const UPDATE_ASSET_LINK_URL = 'UPDATE_ASSET_LINK_URL';
export const UPDATE_ASSET_LINK_NAME = 'UPDATE_ASSET_LINK_NAME';
export const UPDATE_ASSET_LINK_TYPE = 'UPDATE_ASSET_LINK_TYPE';
export const REMOVE_ASSET_LINK = 'REMOVE_ASSET_LINK';
+
+export const REQUEST_TAG_NOTES = 'REQUEST_TAG_NOTES';
+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';
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 cf282f9ab2c..6b22468bbfe 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/mutations.js
@@ -95,4 +95,22 @@ export default {
[types.REMOVE_ASSET_LINK](state, linkIdToRemove) {
state.release.assets.links = state.release.assets.links.filter((l) => l.id !== linkIdToRemove);
},
+
+ [types.REQUEST_TAG_NOTES](state) {
+ state.isFetchingTagNotes = true;
+ },
+ [types.RECEIVE_TAG_NOTES_SUCCESS](state, data) {
+ state.fetchError = undefined;
+ state.isFetchingTagNotes = false;
+ state.tagNotes = data.message;
+ state.existingRelease = data.release;
+ },
+ [types.RECEIVE_TAG_NOTES_ERROR](state, error) {
+ state.fetchError = error;
+ state.isFetchingTagNotes = false;
+ state.tagNotes = '';
+ },
+ [types.UPDATE_INCLUDE_TAG_NOTES](state, includeTagNotes) {
+ state.includeTagNotes = includeTagNotes;
+ },
};
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 315d07ac664..33cb3ee06d0 100644
--- a/app/assets/javascripts/releases/stores/modules/edit_new/state.js
+++ b/app/assets/javascripts/releases/stores/modules/edit_new/state.js
@@ -9,6 +9,7 @@ export default ({
manageMilestonesPath,
newMilestonePath,
releasesPagePath,
+ editReleaseDocsPath,
tagName = null,
defaultBranch = null,
@@ -23,6 +24,7 @@ export default ({
manageMilestonesPath,
newMilestonePath,
releasesPagePath,
+ editReleaseDocsPath,
/**
* The name of the tag associated with the release, provided by the backend.
@@ -48,4 +50,8 @@ export default ({
isUpdatingRelease: false,
updateError: null,
+
+ tagNotes: '',
+ includeTagNotes: false,
+ existingRelease: null,
});
diff --git a/app/assets/javascripts/reports/codequality_report/store/getters.js b/app/assets/javascripts/reports/codequality_report/store/getters.js
index 4712f8cbefe..70d11e96a54 100644
--- a/app/assets/javascripts/reports/codequality_report/store/getters.js
+++ b/app/assets/javascripts/reports/codequality_report/store/getters.js
@@ -1,5 +1,5 @@
import { spriteIcon } from '~/lib/utils/common_utils';
-import { sprintf, s__ } from '~/locale';
+import { sprintf, s__, n__ } from '~/locale';
import { LOADING, ERROR, SUCCESS, STATUS_NOT_FOUND } from '../../constants';
export const hasCodequalityIssues = (state) =>
@@ -29,9 +29,17 @@ export const codequalityText = (state) => {
},
);
} else if (resolvedIssues.length) {
- text = s__(`ciReport|Code quality improved`);
+ text = n__(
+ `ciReport|Code quality improved due to 1 resolved issue`,
+ `ciReport|Code quality improved due to %d resolved issues`,
+ resolvedIssues.length,
+ );
} else if (newIssues.length) {
- text = s__(`ciReport|Code quality degraded`);
+ text = n__(
+ `ciReport|Code quality degraded due to 1 new issue`,
+ `ciReport|Code quality degraded due to %d new issues`,
+ newIssues.length,
+ );
}
return text;
diff --git a/app/assets/javascripts/repository/components/blob_content_viewer.vue b/app/assets/javascripts/repository/components/blob_content_viewer.vue
index c9e4aab1db1..3729bd4c601 100644
--- a/app/assets/javascripts/repository/components/blob_content_viewer.vue
+++ b/app/assets/javascripts/repository/components/blob_content_viewer.vue
@@ -8,7 +8,7 @@ import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { __ } from '~/locale';
-import { redirectTo } from '~/lib/utils/url_utility';
+import { redirectTo, getLocationHash } from '~/lib/utils/url_utility';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
import CodeIntelligence from '~/code_navigation/components/app.vue';
@@ -17,15 +17,12 @@ import getRefMixin from '../mixins/get_ref';
import blobInfoQuery from '../queries/blob_info.query.graphql';
import userInfoQuery from '../queries/user_info.query.graphql';
import applicationInfoQuery from '../queries/application_info.query.graphql';
-import { DEFAULT_BLOB_INFO, TEXT_FILE_TYPE, LFS_STORAGE } from '../constants';
+import { DEFAULT_BLOB_INFO, TEXT_FILE_TYPE, LFS_STORAGE, LEGACY_FILE_TYPES } from '../constants';
import BlobButtonGroup from './blob_button_group.vue';
import ForkSuggestion from './fork_suggestion.vue';
import { loadViewer } from './blob_viewers';
export default {
- i18n: {
- pipelineEditor: __('Pipeline Editor'),
- },
components: {
BlobHeader,
BlobButtonGroup,
@@ -132,7 +129,8 @@ export default {
return this.shouldLoadLegacyViewer ? null : loadViewer(fileType, this.isUsingLfs);
},
shouldLoadLegacyViewer() {
- return this.viewer.fileType === TEXT_FILE_TYPE && !this.glFeatures.highlightJs;
+ const isTextFile = this.viewer.fileType === TEXT_FILE_TYPE && !this.glFeatures.highlightJs;
+ return isTextFile || LEGACY_FILE_TYPES.includes(this.blobInfo.fileType);
},
legacyViewerLoaded() {
return (
@@ -199,11 +197,20 @@ export default {
this.legacyRichViewer = html;
}
+ this.scrollToHash();
this.isBinary = binary;
this.isLoadingLegacyViewer = false;
})
.catch(() => this.displayError());
},
+ scrollToHash() {
+ const hash = getLocationHash();
+ if (hash) {
+ // Ensures the browser's native scroll to hash is triggered for async content
+ window.location.hash = '';
+ window.location.hash = hash;
+ }
+ },
displayError() {
createFlash({ message: __('An error occurred while loading the file. Please try again.') });
},
diff --git a/app/assets/javascripts/repository/components/breadcrumbs.vue b/app/assets/javascripts/repository/components/breadcrumbs.vue
index 84c9f9d0bbe..20888db80a9 100644
--- a/app/assets/javascripts/repository/components/breadcrumbs.vue
+++ b/app/assets/javascripts/repository/components/breadcrumbs.vue
@@ -269,6 +269,9 @@ export default {
renderAddToTreeDropdown() {
return !this.isBlobPath && (this.canCollaborate || this.canCreateMrFromFork);
},
+ newDirectoryPath() {
+ return joinPaths(this.newDirPath, this.currentPath);
+ },
},
methods: {
isLast(i) {
@@ -332,7 +335,7 @@ export default {
:commit-message="__('Add new directory')"
:target-branch="selectedBranch"
:original-branch="originalBranch"
- :path="newDirPath"
+ :path="newDirectoryPath"
/>
</nav>
</template>
diff --git a/app/assets/javascripts/repository/components/last_commit.vue b/app/assets/javascripts/repository/components/last_commit.vue
index 2810db33e64..03dd7c6fada 100644
--- a/app/assets/javascripts/repository/components/last_commit.vue
+++ b/app/assets/javascripts/repository/components/last_commit.vue
@@ -14,6 +14,7 @@ import CiIcon from '~/vue_shared/components/ci_icon.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+import UserAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
import getRefMixin from '../mixins/get_ref';
import projectPathQuery from '../queries/project_path.query.graphql';
@@ -27,6 +28,7 @@ export default {
GlButtonGroup,
GlLink,
GlLoadingIcon,
+ UserAvatarImage,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -111,24 +113,24 @@ export default {
</script>
<template>
- <div class="well-segment commit gl-p-5 gl-w-full">
+ <div class="well-segment commit gl-p-5 gl-w-full gl-display-flex">
<gl-loading-icon v-if="isLoading" size="md" color="dark" class="m-auto" />
<template v-else-if="commit">
<user-avatar-link
v-if="commit.author"
:link-href="commit.author.webPath"
:img-src="commit.author.avatarUrl"
- :img-size="40"
- class="avatar-cell"
+ :img-size="32"
+ :img-css-classes="'gl-mr-0!' /* NOTE: this is needed only while we migrate user-avatar-image to GlAvatar (7731 epics) */"
+ class="gl-my-2 gl-mr-4"
+ />
+ <user-avatar-image
+ v-else
+ class="gl-my-2 gl-mr-4"
+ :img-src="commit.authorGravatar || $options.defaultAvatarUrl"
+ :css-classes="'gl-mr-0!' /* NOTE: this is needed only while we migrate user-avatar-image to GlAvatar (7731 epics) */"
+ :size="32"
/>
- <span v-else class="avatar-cell user-avatar-link">
- <img
- :src="commit.authorGravatar || $options.defaultAvatarUrl"
- width="40"
- height="40"
- class="avatar s40"
- />
- </span>
<div class="commit-detail flex-list">
<div class="commit-content qa-commit-content">
<gl-link
@@ -168,7 +170,10 @@ export default {
class="commit-row-description gl-mb-3"
></pre>
</div>
- <div class="commit-actions flex-row">
+ <div class="gl-flex-grow-1"></div>
+ <div
+ class="commit-actions gl-display-flex gl-flex-align gl-align-items-center gl-flex-direction-row"
+ >
<div
v-if="commit.signatureHtml"
v-html="commit.signatureHtml /* eslint-disable-line vue/no-v-html */"
diff --git a/app/assets/javascripts/repository/constants.js b/app/assets/javascripts/repository/constants.js
index bb9d3180be8..2cafeed2ef4 100644
--- a/app/assets/javascripts/repository/constants.js
+++ b/app/assets/javascripts/repository/constants.js
@@ -86,3 +86,24 @@ export const DEFAULT_BLOB_INFO = {
export const TEXT_FILE_TYPE = 'text';
export const LFS_STORAGE = 'lfs';
+
+/**
+ * We have some features (like linking to external dependencies) that our frontend highlighter
+ * do not yet support.
+ * 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',
+ 'podfile',
+ 'podspec',
+ 'podspec_json',
+ 'cartfile',
+ 'godeps_json',
+ 'requirements_txt',
+ 'cargo_toml',
+ 'go_mod',
+ 'go_sum',
+];
diff --git a/app/assets/javascripts/repository/index.js b/app/assets/javascripts/repository/index.js
index b38a1cfdc7b..8f8735a6371 100644
--- a/app/assets/javascripts/repository/index.js
+++ b/app/assets/javascripts/repository/index.js
@@ -151,12 +151,20 @@ export default function setupVueRepositoryList() {
const treeHistoryLinkEl = document.getElementById('js-tree-history-link');
const { historyLink } = treeHistoryLinkEl.dataset;
+ let { isProjectOverview } = treeHistoryLinkEl.dataset;
+
+ const isProjectOverviewAfterEach = router.afterEach(() => {
+ isProjectOverview = false;
+ isProjectOverviewAfterEach();
+ });
// eslint-disable-next-line no-new
new Vue({
el: treeHistoryLinkEl,
router,
render(h) {
+ if (parseBoolean(isProjectOverview) && !this.$route.params.path) return null;
+
return h(
GlButton,
{
diff --git a/app/assets/javascripts/rest_api.js b/app/assets/javascripts/rest_api.js
index 48a15954035..0f8e6945bf9 100644
--- a/app/assets/javascripts/rest_api.js
+++ b/app/assets/javascripts/rest_api.js
@@ -4,6 +4,7 @@ export * from './api/user_api';
export * from './api/markdown_api';
export * from './api/bulk_imports_api';
export * from './api/namespaces_api';
+export * from './api/tags_api';
// Note: It's not possible to spy on methods imported from this file in
// Jest tests.
diff --git a/app/assets/javascripts/right_sidebar.js b/app/assets/javascripts/right_sidebar.js
index 009afe03ea6..a3abc8b8e90 100644
--- a/app/assets/javascripts/right_sidebar.js
+++ b/app/assets/javascripts/right_sidebar.js
@@ -7,6 +7,18 @@ import createFlash from './flash';
import axios from './lib/utils/axios_utils';
import { sprintf, s__, __ } from './locale';
+const updateSidebarClasses = (layoutPage, rightSidebar) => {
+ if (window.innerWidth >= 768) {
+ layoutPage.classList.remove('right-sidebar-expanded', 'right-sidebar-collapsed');
+ rightSidebar.classList.remove('right-sidebar-collapsed');
+ rightSidebar.classList.add('right-sidebar-expanded');
+ } else {
+ layoutPage.classList.add('right-sidebar-collapsed', 'is-merge-request');
+ rightSidebar.classList.add('right-sidebar-collapsed');
+ rightSidebar.classList.remove('right-sidebar-expanded');
+ }
+};
+
function Sidebar() {
this.toggleTodo = this.toggleTodo.bind(this);
this.sidebar = $('aside');
@@ -42,13 +54,22 @@ Sidebar.prototype.addEventListeners = function () {
this.sidebar.on('hiddenGlDropdown', this, this.onSidebarDropdownHidden);
$document.on('click', '.js-sidebar-toggle', this.sidebarToggleClicked);
- return $(document)
- .off('click', '.js-issuable-todo')
- .on('click', '.js-issuable-todo', this.toggleTodo);
+ $(document).off('click', '.js-issuable-todo').on('click', '.js-issuable-todo', this.toggleTodo);
+
+ if (window.gon?.features?.movedMrSidebar) {
+ const layoutPage = document.querySelector('.layout-page');
+ const rightSidebar = document.querySelector('.js-right-sidebar');
+
+ updateSidebarClasses(layoutPage, rightSidebar);
+ window.addEventListener('resize', () => updateSidebarClasses(layoutPage, rightSidebar));
+ }
};
Sidebar.prototype.sidebarToggleClicked = function (e, triggered) {
const $this = $(this);
+
+ if ($this.hasClass('right-sidebar-merge-requests')) return;
+
const $collapseIcon = $('.js-sidebar-collapse');
const $expandIcon = $('.js-sidebar-expand');
const $toggleContainer = $('.js-sidebar-toggle-container');
diff --git a/app/assets/javascripts/runner/admin_runner_edit/admin_runner_edit_app.vue b/app/assets/javascripts/runner/admin_runner_edit/admin_runner_edit_app.vue
index c2db3b9facd..40787cf72da 100644
--- a/app/assets/javascripts/runner/admin_runner_edit/admin_runner_edit_app.vue
+++ b/app/assets/javascripts/runner/admin_runner_edit/admin_runner_edit_app.vue
@@ -5,7 +5,7 @@ import { convertToGraphQLId } from '~/graphql_shared/utils';
import RunnerHeader from '../components/runner_header.vue';
import RunnerUpdateForm from '../components/runner_update_form.vue';
import { I18N_FETCH_ERROR } from '../constants';
-import runnerQuery from '../graphql/details/runner.query.graphql';
+import runnerFormQuery from '../graphql/edit/runner_form.query.graphql';
import { captureException } from '../sentry_utils';
export default {
@@ -19,6 +19,11 @@ export default {
type: String,
required: true,
},
+ runnerPath: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -27,7 +32,7 @@ export default {
},
apollo: {
runner: {
- query: runnerQuery,
+ query: runnerFormQuery,
variables() {
return {
id: convertToGraphQLId(TYPE_CI_RUNNER, this.runnerId),
@@ -40,6 +45,11 @@ export default {
},
},
},
+ computed: {
+ loading() {
+ return this.$apollo.queries.runner.loading;
+ },
+ },
errorCaptured(error) {
this.reportToSentry(error);
},
@@ -53,6 +63,11 @@ export default {
<template>
<div>
<runner-header v-if="runner" :runner="runner" />
- <runner-update-form :runner="runner" class="gl-my-5" />
+ <runner-update-form
+ :loading="loading"
+ :runner="runner"
+ :runner-path="runnerPath"
+ class="gl-my-5"
+ />
</div>
</template>
diff --git a/app/assets/javascripts/runner/admin_runner_edit/index.js b/app/assets/javascripts/runner/admin_runner_edit/index.js
index adb420f9963..a2ac5731a62 100644
--- a/app/assets/javascripts/runner/admin_runner_edit/index.js
+++ b/app/assets/javascripts/runner/admin_runner_edit/index.js
@@ -12,7 +12,7 @@ export const initAdminRunnerEdit = (selector = '#js-admin-runner-edit') => {
return null;
}
- const { runnerId } = el.dataset;
+ const { runnerId, runnerPath } = el.dataset;
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
@@ -25,6 +25,7 @@ export const initAdminRunnerEdit = (selector = '#js-admin-runner-edit') => {
return h(AdminRunnerEditApp, {
props: {
runnerId,
+ runnerPath,
},
});
},
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 86ad912f017..c3f317b40b0 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,19 +1,23 @@
<script>
import { GlTooltipDirective } from '@gitlab/ui';
-import { createAlert } from '~/flash';
+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 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 { I18N_FETCH_ERROR } from '../constants';
-import runnerQuery from '../graphql/details/runner.query.graphql';
+import runnerQuery from '../graphql/show/runner.query.graphql';
import { captureException } from '../sentry_utils';
+import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_local_storage';
export default {
name: 'AdminRunnerShowApp',
components: {
+ RunnerDeleteButton,
RunnerEditButton,
RunnerPauseButton,
RunnerHeader,
@@ -27,6 +31,10 @@ export default {
type: String,
required: true,
},
+ runnersPath: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
@@ -52,6 +60,9 @@ export default {
canUpdate() {
return this.runner.userPermissions?.updateRunner;
},
+ canDelete() {
+ return this.runner.userPermissions?.deleteRunner;
+ },
},
errorCaptured(error) {
this.reportToSentry(error);
@@ -60,6 +71,10 @@ export default {
reportToSentry(error) {
captureException({ error, component: this.$options.name });
},
+ onDeleted({ message }) {
+ saveAlertToLocalStorage({ message, variant: VARIANT_SUCCESS });
+ redirectTo(this.runnersPath);
+ },
},
};
</script>
@@ -69,6 +84,7 @@ export default {
<template #actions>
<runner-edit-button v-if="canUpdate && runner.editAdminUrl" :href="runner.editAdminUrl" />
<runner-pause-button v-if="canUpdate" :runner="runner" />
+ <runner-delete-button v-if="canDelete" :runner="runner" @deleted="onDeleted" />
</template>
</runner-header>
diff --git a/app/assets/javascripts/runner/admin_runner_show/index.js b/app/assets/javascripts/runner/admin_runner_show/index.js
index a781898cf8d..ea455416648 100644
--- a/app/assets/javascripts/runner/admin_runner_show/index.js
+++ b/app/assets/javascripts/runner/admin_runner_show/index.js
@@ -1,18 +1,21 @@
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 AdminRunnerShowApp from './admin_runner_show_app.vue';
Vue.use(VueApollo);
export const initAdminRunnerShow = (selector = '#js-admin-runner-show') => {
+ showAlertFromLocalStorage();
+
const el = document.querySelector(selector);
if (!el) {
return null;
}
- const { runnerId } = el.dataset;
+ const { runnerId, runnersPath } = el.dataset;
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(),
@@ -25,6 +28,7 @@ export const initAdminRunnerShow = (selector = '#js-admin-runner-show') => {
return h(AdminRunnerShowApp, {
props: {
runnerId,
+ runnersPath,
},
});
},
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 accc9926a57..c2bb635e056 100644
--- a/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/runner/admin_runners/admin_runners_app.vue
@@ -38,7 +38,7 @@ import {
} from '../runner_search_utils';
import { captureException } from '../sentry_utils';
-const runnersCountSmartQuery = {
+const countSmartQuery = () => ({
query: runnersAdminCountQuery,
fetchPolicy: fetchPolicies.NETWORK_ONLY,
update(data) {
@@ -47,6 +47,39 @@ const runnersCountSmartQuery = {
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 {
@@ -101,65 +134,30 @@ export default {
this.reportToSentry(error);
},
},
+
+ // Tabs counts
allRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: null,
- };
- },
+ ...tabCountSmartQuery({ type: null }),
},
instanceRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: INSTANCE_TYPE,
- };
- },
+ ...tabCountSmartQuery({ type: INSTANCE_TYPE }),
},
groupRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: GROUP_TYPE,
- };
- },
+ ...tabCountSmartQuery({ type: GROUP_TYPE }),
},
projectRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: PROJECT_TYPE,
- };
- },
+ ...tabCountSmartQuery({ type: PROJECT_TYPE }),
},
+
+ // Runner stats
onlineRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- status: STATUS_ONLINE,
- };
- },
+ ...statusCountSmartQuery({ status: STATUS_ONLINE, name: 'onlineRunnersTotal' }),
},
offlineRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- status: STATUS_OFFLINE,
- };
- },
+ ...statusCountSmartQuery({ status: STATUS_OFFLINE, name: 'offlineRunnersTotal' }),
},
staleRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- status: STATUS_STALE,
- };
- },
+ ...statusCountSmartQuery({ status: STATUS_STALE, name: 'staleRunnersTotal' }),
},
},
computed: {
@@ -263,12 +261,6 @@ export default {
</script>
<template>
<div>
- <runner-stats
- :online-runners-count="onlineRunnersTotal"
- :offline-runners-count="offlineRunnersTotal"
- :stale-runners-count="staleRunnersTotal"
- />
-
<div
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"
>
@@ -300,6 +292,12 @@ export default {
:namespace="$options.filteredSearchNamespace"
/>
+ <runner-stats
+ :online-runners-count="onlineRunnersTotal"
+ :offline-runners-count="offlineRunnersTotal"
+ :stale-runners-count="staleRunnersTotal"
+ />
+
<div v-if="noRunnersFound" class="gl-text-center gl-p-5">
{{ __('No runners found') }}
</div>
diff --git a/app/assets/javascripts/runner/admin_runners/index.js b/app/assets/javascripts/runner/admin_runners/index.js
index 12e2cb2ee9f..b1d8442bb32 100644
--- a/app/assets/javascripts/runner/admin_runners/index.js
+++ b/app/assets/javascripts/runner/admin_runners/index.js
@@ -5,12 +5,15 @@ import { visitUrl } from '~/lib/utils/url_utility';
import { updateOutdatedUrl } from '~/runner/runner_search_utils';
import createDefaultClient from '~/lib/graphql';
import { createLocalState } from '../graphql/list/local_state';
+import { showAlertFromLocalStorage } from '../local_storage_alert/show_alert_from_local_storage';
import AdminRunnersApp from './admin_runners_app.vue';
Vue.use(GlToast);
Vue.use(VueApollo);
export const initAdminRunners = (selector = '#js-admin-runners') => {
+ showAlertFromLocalStorage();
+
const el = document.querySelector(selector);
if (!el) {
diff --git a/app/assets/javascripts/runner/components/registration/registration_dropdown.vue b/app/assets/javascripts/runner/components/registration/registration_dropdown.vue
index 3fbe3c1be74..bb2a8ddf151 100644
--- a/app/assets/javascripts/runner/components/registration/registration_dropdown.vue
+++ b/app/assets/javascripts/runner/components/registration/registration_dropdown.vue
@@ -96,7 +96,7 @@ export default {
<runner-instructions-modal
v-if="instructionsModalOpened"
ref="runnerInstructionsModal"
- :registration-token="registrationToken"
+ :registration-token="currentRegistrationToken"
data-testid="runner-instructions-modal"
/>
</gl-dropdown-item>
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 1234054c660..09d46ce3e66 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
@@ -115,14 +115,14 @@ export default {
<gl-modal
size="sm"
:modal-id="$options.modalId"
- :action-primary="{
+ :action-primary="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
text: $options.i18n.modalAction,
attributes: [{ variant: 'danger' }],
- }"
- :action-secondary="{
+ } /* 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 */"
:title="$options.i18n.modalTitle"
@primary="handleModalPrimary"
>
diff --git a/app/assets/javascripts/runner/components/runner_delete_button.vue b/app/assets/javascripts/runner/components/runner_delete_button.vue
index b58665ecbc9..62382891df0 100644
--- a/app/assets/javascripts/runner/components/runner_delete_button.vue
+++ b/app/assets/javascripts/runner/components/runner_delete_button.vue
@@ -165,6 +165,8 @@ export default {
:loading="deleting"
:disabled="disabled"
variant="danger"
+ category="secondary"
+ v-bind="$attrs"
>
{{ buttonContent }}
</gl-button>
diff --git a/app/assets/javascripts/runner/components/runner_details.vue b/app/assets/javascripts/runner/components/runner_details.vue
index b6a5ffc7a64..3734f436034 100644
--- a/app/assets/javascripts/runner/components/runner_details.vue
+++ b/app/assets/javascripts/runner/components/runner_details.vue
@@ -84,6 +84,9 @@ export default {
</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">
diff --git a/app/assets/javascripts/runner/components/runner_jobs.vue b/app/assets/javascripts/runner/components/runner_jobs.vue
index b25d92d049e..4eb1312b204 100644
--- a/app/assets/javascripts/runner/components/runner_jobs.vue
+++ b/app/assets/javascripts/runner/components/runner_jobs.vue
@@ -1,7 +1,7 @@
<script>
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { createAlert } from '~/flash';
-import runnerJobsQuery from '../graphql/details/runner_jobs.query.graphql';
+import runnerJobsQuery from '../graphql/show/runner_jobs.query.graphql';
import { I18N_FETCH_ERROR, I18N_NO_JOBS_FOUND, RUNNER_DETAILS_JOBS_PAGE_SIZE } from '../constants';
import { captureException } from '../sentry_utils';
import { getPaginationVariables } from '../utils';
diff --git a/app/assets/javascripts/runner/components/runner_pagination.vue b/app/assets/javascripts/runner/components/runner_pagination.vue
index b683a7f2330..cfc21d1407b 100644
--- a/app/assets/javascripts/runner/components/runner_pagination.vue
+++ b/app/assets/javascripts/runner/components/runner_pagination.vue
@@ -21,10 +21,10 @@ export default {
},
computed: {
prevPage() {
- return this.pageInfo?.hasPreviousPage ? this.value?.page - 1 : null;
+ return this.pageInfo?.hasPreviousPage ? this.value.page - 1 : null;
},
nextPage() {
- return this.pageInfo?.hasNextPage ? this.value?.page + 1 : null;
+ return this.pageInfo?.hasNextPage ? this.value.page + 1 : null;
},
},
methods: {
diff --git a/app/assets/javascripts/runner/components/runner_projects.vue b/app/assets/javascripts/runner/components/runner_projects.vue
index d080d34fdd3..daca718e2b5 100644
--- a/app/assets/javascripts/runner/components/runner_projects.vue
+++ b/app/assets/javascripts/runner/components/runner_projects.vue
@@ -2,7 +2,7 @@
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
import { sprintf, formatNumber } from '~/locale';
import { createAlert } from '~/flash';
-import runnerProjectsQuery from '../graphql/details/runner_projects.query.graphql';
+import runnerProjectsQuery from '../graphql/show/runner_projects.query.graphql';
import {
I18N_ASSIGNED_PROJECTS,
I18N_NONE,
diff --git a/app/assets/javascripts/runner/components/runner_update_form.vue b/app/assets/javascripts/runner/components/runner_update_form.vue
index 119e5236f85..56c9007a781 100644
--- a/app/assets/javascripts/runner/components/runner_update_form.vue
+++ b/app/assets/javascripts/runner/components/runner_update_form.vue
@@ -1,10 +1,12 @@
<script>
import {
GlButton,
+ GlIcon,
GlForm,
GlFormCheckbox,
GlFormGroup,
GlFormInputGroup,
+ GlSkeletonLoader,
GlTooltipDirective,
} from '@gitlab/ui';
import {
@@ -12,19 +14,23 @@ import {
runnerToModel,
} from 'ee_else_ce/runner/runner_update_form_utils';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
+import { redirectTo } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import { captureException } from '~/runner/sentry_utils';
import { ACCESS_LEVEL_NOT_PROTECTED, ACCESS_LEVEL_REF_PROTECTED, PROJECT_TYPE } from '../constants';
-import runnerUpdateMutation from '../graphql/details/runner_update.mutation.graphql';
+import runnerUpdateMutation from '../graphql/edit/runner_update.mutation.graphql';
+import { saveAlertToLocalStorage } from '../local_storage_alert/save_alert_to_local_storage';
export default {
name: 'RunnerUpdateForm',
components: {
GlButton,
+ GlIcon,
GlForm,
GlFormCheckbox,
GlFormGroup,
GlFormInputGroup,
+ GlSkeletonLoader,
RunnerUpdateCostFactorFields: () =>
import('ee_component/runner/components/runner_update_cost_factor_fields.vue'),
},
@@ -37,6 +43,16 @@ export default {
required: false,
default: null,
},
+ loading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ runnerPath: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
data() {
return {
@@ -48,9 +64,6 @@ export default {
canBeLockedToProject() {
return this.runner?.runnerType === PROJECT_TYPE;
},
- readonlyIpAddress() {
- return this.runner?.ipAddress;
- },
},
watch: {
runner(newVal, oldVal) {
@@ -74,24 +87,23 @@ export default {
});
if (errors?.length) {
- // Validation errors need not be thrown
- createAlert({ message: errors[0] });
- return;
+ this.onError(errors[0]);
+ } else {
+ this.onSuccess();
}
-
- this.onSuccess();
} catch (error) {
const { message } = error;
-
- createAlert({ message });
+ this.onError(message);
captureException({ error, component: this.$options.name });
- } finally {
- this.saving = false;
}
},
onSuccess() {
- createAlert({ message: __('Changes saved.'), variant: VARIANT_SUCCESS });
- this.model = runnerToModel(this.runner);
+ saveAlertToLocalStorage({ message: __('Changes saved.'), variant: VARIANT_SUCCESS });
+ redirectTo(this.runnerPath);
+ },
+ onError(message) {
+ this.saving = false;
+ createAlert({ message });
},
},
ACCESS_LEVEL_NOT_PROTECTED,
@@ -100,104 +112,108 @@ export default {
</script>
<template>
<gl-form @submit.prevent="onSubmit">
- <gl-form-checkbox
- v-model="model.active"
- data-testid="runner-field-paused"
- :value="false"
- :unchecked-value="true"
- >
- {{ __('Paused') }}
- <template #help>
- {{ s__('Runners|Stop the runner from accepting new jobs.') }}
- </template>
- </gl-form-checkbox>
+ <h4 class="gl-font-lg gl-my-5">{{ s__('Runners|Details') }}</h4>
- <gl-form-checkbox
- v-model="model.accessLevel"
- data-testid="runner-field-protected"
- :value="$options.ACCESS_LEVEL_REF_PROTECTED"
- :unchecked-value="$options.ACCESS_LEVEL_NOT_PROTECTED"
- >
- {{ __('Protected') }}
- <template #help>
- {{ s__('Runners|Use the runner on pipelines for protected branches only.') }}
- </template>
- </gl-form-checkbox>
+ <gl-skeleton-loader v-if="loading" />
+ <gl-form-group v-else :label="__('Description')" data-testid="runner-field-description">
+ <gl-form-input-group v-model="model.description" />
+ </gl-form-group>
- <gl-form-checkbox v-model="model.runUntagged" data-testid="runner-field-run-untagged">
- {{ __('Run untagged jobs') }}
- <template #help>
- {{ s__('Runners|Use the runner for jobs without tags, in addition to tagged jobs.') }}
- </template>
- </gl-form-checkbox>
+ <hr />
- <gl-form-checkbox
- v-if="canBeLockedToProject"
- v-model="model.locked"
- data-testid="runner-field-locked"
- >
- {{ __('Lock to current projects') }}
- <template #help>
- {{
- s__(
- 'Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects.',
- )
- }}
- </template>
- </gl-form-checkbox>
+ <h4 class="gl-font-lg gl-my-5">{{ s__('Runners|Configuration') }}</h4>
- <gl-form-group :label="__('IP Address')" data-testid="runner-field-ip-address">
- <gl-form-input-group :value="readonlyIpAddress" readonly select-on-click>
- <template #append>
- <gl-button
- v-gl-tooltip.hover
- :title="__('Copy IP Address')"
- :aria-label="__('Copy IP Address')"
- :data-clipboard-text="readonlyIpAddress"
- icon="copy-to-clipboard"
- class="d-inline-flex"
- />
- </template>
- </gl-form-input-group>
- </gl-form-group>
+ <template v-if="loading">
+ <gl-skeleton-loader v-for="i in 3" :key="i" />
+ </template>
+ <template v-else>
+ <div class="gl-mb-5">
+ <gl-form-checkbox
+ v-model="model.active"
+ data-testid="runner-field-paused"
+ :value="false"
+ :unchecked-value="true"
+ >
+ {{ __('Paused') }}
+ <template #help>
+ {{ s__('Runners|Stop the runner from accepting new jobs.') }}
+ </template>
+ </gl-form-checkbox>
- <gl-form-group :label="__('Description')" data-testid="runner-field-description">
- <gl-form-input-group v-model="model.description" />
- </gl-form-group>
+ <gl-form-checkbox
+ v-model="model.accessLevel"
+ data-testid="runner-field-protected"
+ :value="$options.ACCESS_LEVEL_REF_PROTECTED"
+ :unchecked-value="$options.ACCESS_LEVEL_NOT_PROTECTED"
+ >
+ {{ __('Protected') }}
+ <template #help>
+ {{ s__('Runners|Use the runner on pipelines for protected branches only.') }}
+ </template>
+ </gl-form-checkbox>
- <gl-form-group
- data-testid="runner-field-max-timeout"
- :label="__('Maximum job timeout')"
- :description="
- s__(
- 'Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project.',
- )
- "
- >
- <gl-form-input-group v-model.number="model.maximumTimeout" type="number" />
- </gl-form-group>
+ <gl-form-checkbox v-model="model.runUntagged" data-testid="runner-field-run-untagged">
+ {{ __('Run untagged jobs') }}
+ <template #help>
+ {{ s__('Runners|Use the runner for jobs without tags, in addition to tagged jobs.') }}
+ </template>
+ </gl-form-checkbox>
- <gl-form-group
- data-testid="runner-field-tags"
- :label="__('Tags')"
- :description="
- __('You can set up jobs to only use runners with specific tags. Separate tags with commas.')
- "
- >
- <gl-form-input-group v-model="model.tagList" />
- </gl-form-group>
+ <gl-form-checkbox
+ v-if="canBeLockedToProject"
+ v-model="model.locked"
+ data-testid="runner-field-locked"
+ >
+ {{ __('Lock to current projects') }} <gl-icon name="lock" />
+ <template #help>
+ {{
+ s__(
+ 'Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects.',
+ )
+ }}
+ </template>
+ </gl-form-checkbox>
+ </div>
- <runner-update-cost-factor-fields v-model="model" />
+ <gl-form-group
+ data-testid="runner-field-max-timeout"
+ :label="__('Maximum job timeout')"
+ :description="
+ s__(
+ 'Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project.',
+ )
+ "
+ >
+ <gl-form-input-group v-model.number="model.maximumTimeout" type="number" />
+ </gl-form-group>
+
+ <gl-form-group
+ data-testid="runner-field-tags"
+ :label="__('Tags')"
+ :description="
+ __(
+ 'You can set up jobs to only use runners with specific tags. Separate tags with commas.',
+ )
+ "
+ >
+ <gl-form-input-group v-model="model.tagList" />
+ </gl-form-group>
+
+ <runner-update-cost-factor-fields v-model="model" />
+ </template>
- <div class="form-actions">
+ <div class="gl-mt-6">
<gl-button
type="submit"
variant="confirm"
class="js-no-auto-disable"
- :loading="saving || !runner"
+ :loading="loading || saving"
>
{{ __('Save changes') }}
</gl-button>
+ <gl-button :href="runnerPath">
+ {{ __('Cancel') }}
+ </gl-button>
</div>
</gl-form>
</template>
diff --git a/app/assets/javascripts/runner/graphql/details/runner.query.graphql b/app/assets/javascripts/runner/graphql/details/runner.query.graphql
deleted file mode 100644
index 4792a186160..00000000000
--- a/app/assets/javascripts/runner/graphql/details/runner.query.graphql
+++ /dev/null
@@ -1,9 +0,0 @@
-#import "ee_else_ce/runner/graphql/details/runner_details.fragment.graphql"
-
-query getRunner($id: CiRunnerID!) {
- # We have an id in deeply nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
- runner(id: $id) {
- ...RunnerDetails
- }
-}
diff --git a/app/assets/javascripts/runner/graphql/details/runner_details.fragment.graphql b/app/assets/javascripts/runner/graphql/details/runner_details.fragment.graphql
deleted file mode 100644
index 2449ee0fc0f..00000000000
--- a/app/assets/javascripts/runner/graphql/details/runner_details.fragment.graphql
+++ /dev/null
@@ -1,5 +0,0 @@
-#import "./runner_details_shared.fragment.graphql"
-
-fragment RunnerDetails on CiRunner {
- ...RunnerDetailsShared
-}
diff --git a/app/assets/javascripts/runner/graphql/details/runner_details_shared.fragment.graphql b/app/assets/javascripts/runner/graphql/details/runner_details_shared.fragment.graphql
deleted file mode 100644
index d8c67728fac..00000000000
--- a/app/assets/javascripts/runner/graphql/details/runner_details_shared.fragment.graphql
+++ /dev/null
@@ -1,35 +0,0 @@
-fragment RunnerDetailsShared on CiRunner {
- __typename
- id
- runnerType
- active
- accessLevel
- runUntagged
- locked
- ipAddress
- description
- maximumTimeout
- jobCount
- tagList
- createdAt
- status(legacyMode: null)
- contactedAt
- version
- editAdminUrl
- userPermissions {
- updateRunner
- deleteRunner
- }
- groups {
- # Only a single group can be loaded here, while projects
- # are loaded separately using the query with pagination
- # parameters `runner_projects.query.graphql`.
- nodes {
- id
- avatarUrl
- name
- fullName
- webUrl
- }
- }
-}
diff --git a/app/assets/javascripts/runner/graphql/details/runner_update.mutation.graphql b/app/assets/javascripts/runner/graphql/details/runner_update.mutation.graphql
deleted file mode 100644
index e4bf51e2c30..00000000000
--- a/app/assets/javascripts/runner/graphql/details/runner_update.mutation.graphql
+++ /dev/null
@@ -1,15 +0,0 @@
-#import "ee_else_ce/runner/graphql/details/runner_details.fragment.graphql"
-
-# Mutation for updates from the runner form, loads
-# attributes shown in the runner details.
-
-mutation runnerUpdate($input: RunnerUpdateInput!) {
- runnerUpdate(input: $input) {
- # We have an id in deep nested fragment
- # eslint-disable-next-line @graphql-eslint/require-id-when-available
- runner {
- ...RunnerDetails
- }
- errors
- }
-}
diff --git a/app/assets/javascripts/runner/graphql/edit/runner_fields.fragment.graphql b/app/assets/javascripts/runner/graphql/edit/runner_fields.fragment.graphql
new file mode 100644
index 00000000000..b732d587d70
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/edit/runner_fields.fragment.graphql
@@ -0,0 +1,5 @@
+#import "./runner_fields_shared.fragment.graphql"
+
+fragment RunnerFields on CiRunner {
+ ...RunnerFieldsShared
+}
diff --git a/app/assets/javascripts/runner/graphql/edit/runner_fields_shared.fragment.graphql b/app/assets/javascripts/runner/graphql/edit/runner_fields_shared.fragment.graphql
new file mode 100644
index 00000000000..f900a0450e5
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/edit/runner_fields_shared.fragment.graphql
@@ -0,0 +1,15 @@
+fragment RunnerFieldsShared on CiRunner {
+ __typename
+ id
+ shortSha
+ runnerType
+ active
+ accessLevel
+ runUntagged
+ locked
+ description
+ maximumTimeout
+ tagList
+ createdAt
+ status(legacyMode: null)
+}
diff --git a/app/assets/javascripts/runner/graphql/edit/runner_form.query.graphql b/app/assets/javascripts/runner/graphql/edit/runner_form.query.graphql
new file mode 100644
index 00000000000..0bf66c223fc
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/edit/runner_form.query.graphql
@@ -0,0 +1,7 @@
+#import "ee_else_ce/runner/graphql/edit/runner_fields.fragment.graphql"
+
+query getRunnerForm($id: CiRunnerID!) {
+ runner(id: $id) {
+ ...RunnerFields
+ }
+}
diff --git a/app/assets/javascripts/runner/graphql/edit/runner_update.mutation.graphql b/app/assets/javascripts/runner/graphql/edit/runner_update.mutation.graphql
new file mode 100644
index 00000000000..8694a51b5a4
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/edit/runner_update.mutation.graphql
@@ -0,0 +1,13 @@
+#import "ee_else_ce/runner/graphql/edit/runner_fields.fragment.graphql"
+
+# Mutation for updates from the runner form, loads
+# attributes shown in the runner details.
+
+mutation runnerUpdate($input: RunnerUpdateInput!) {
+ runnerUpdate(input: $input) {
+ runner {
+ ...RunnerFields
+ }
+ errors
+ }
+}
diff --git a/app/assets/javascripts/runner/graphql/show/runner.query.graphql b/app/assets/javascripts/runner/graphql/show/runner.query.graphql
new file mode 100644
index 00000000000..178816b58bd
--- /dev/null
+++ b/app/assets/javascripts/runner/graphql/show/runner.query.graphql
@@ -0,0 +1,41 @@
+query getRunner($id: CiRunnerID!) {
+ runner(id: $id) {
+ __typename
+ id
+ shortSha
+ runnerType
+ active
+ accessLevel
+ runUntagged
+ locked
+ ipAddress
+ executorName
+ architectureName
+ platformName
+ description
+ maximumTimeout
+ jobCount
+ tagList
+ createdAt
+ status(legacyMode: null)
+ contactedAt
+ version
+ editAdminUrl
+ userPermissions {
+ updateRunner
+ deleteRunner
+ }
+ groups {
+ # Only a single group can be loaded here, while projects
+ # are loaded separately using the query with pagination
+ # parameters `runner_projects.query.graphql`.
+ nodes {
+ id
+ avatarUrl
+ name
+ fullName
+ webUrl
+ }
+ }
+ }
+}
diff --git a/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql b/app/assets/javascripts/runner/graphql/show/runner_jobs.query.graphql
index 14585e62bf2..14585e62bf2 100644
--- a/app/assets/javascripts/runner/graphql/details/runner_jobs.query.graphql
+++ b/app/assets/javascripts/runner/graphql/show/runner_jobs.query.graphql
diff --git a/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql b/app/assets/javascripts/runner/graphql/show/runner_projects.query.graphql
index cb27de7c200..cb27de7c200 100644
--- a/app/assets/javascripts/runner/graphql/details/runner_projects.query.graphql
+++ b/app/assets/javascripts/runner/graphql/show/runner_projects.query.graphql
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 b299d7c40fe..b5bd4b111fd 100644
--- a/app/assets/javascripts/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/runner/group_runners/group_runners_app.vue
@@ -34,7 +34,7 @@ import {
} from '../runner_search_utils';
import { captureException } from '../sentry_utils';
-const runnersCountSmartQuery = {
+const countSmartQuery = () => ({
query: groupRunnersCountQuery,
fetchPolicy: fetchPolicies.NETWORK_ONLY,
update(data) {
@@ -43,6 +43,39 @@ const runnersCountSmartQuery = {
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 {
@@ -116,59 +149,27 @@ export default {
this.reportToSentry(error);
},
},
- onlineRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- groupFullPath: this.groupFullPath,
- status: STATUS_ONLINE,
- };
- },
- },
- offlineRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- groupFullPath: this.groupFullPath,
- status: STATUS_OFFLINE,
- };
- },
- },
- staleRunnersTotal: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- groupFullPath: this.groupFullPath,
- status: STATUS_STALE,
- };
- },
- },
+
+ // Tabs counts
allRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: null,
- };
- },
+ ...tabCountSmartQuery({ type: null }),
},
groupRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: GROUP_TYPE,
- };
- },
+ ...tabCountSmartQuery({ type: GROUP_TYPE }),
},
projectRunnersCount: {
- ...runnersCountSmartQuery,
- variables() {
- return {
- ...this.countVariables,
- type: PROJECT_TYPE,
- };
- },
+ ...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: {
@@ -263,12 +264,6 @@ export default {
<template>
<div>
- <runner-stats
- :online-runners-count="onlineRunnersTotal"
- :offline-runners-count="offlineRunnersTotal"
- :stale-runners-count="staleRunnersTotal"
- />
-
<div class="gl-display-flex gl-align-items-center">
<runner-type-tabs
v-model="search"
@@ -298,6 +293,12 @@ export default {
:namespace="filteredSearchNamespace"
/>
+ <runner-stats
+ :online-runners-count="onlineRunnersTotal"
+ :offline-runners-count="offlineRunnersTotal"
+ :stale-runners-count="staleRunnersTotal"
+ />
+
<div v-if="noRunnersFound" class="gl-text-center gl-p-5">
{{ __('No runners found') }}
</div>
diff --git a/app/assets/javascripts/runner/local_storage_alert/constants.js b/app/assets/javascripts/runner/local_storage_alert/constants.js
new file mode 100644
index 00000000000..69b7418f898
--- /dev/null
+++ b/app/assets/javascripts/runner/local_storage_alert/constants.js
@@ -0,0 +1 @@
+export const LOCAL_STORAGE_ALERT_KEY = 'local-storage-alert';
diff --git a/app/assets/javascripts/runner/local_storage_alert/save_alert_to_local_storage.js b/app/assets/javascripts/runner/local_storage_alert/save_alert_to_local_storage.js
new file mode 100644
index 00000000000..ca7c627459a
--- /dev/null
+++ b/app/assets/javascripts/runner/local_storage_alert/save_alert_to_local_storage.js
@@ -0,0 +1,8 @@
+import AccessorUtilities from '~/lib/utils/accessor';
+import { LOCAL_STORAGE_ALERT_KEY } from './constants';
+
+export const saveAlertToLocalStorage = (alertOptions) => {
+ if (AccessorUtilities.canUseLocalStorage()) {
+ localStorage.setItem(LOCAL_STORAGE_ALERT_KEY, JSON.stringify(alertOptions));
+ }
+};
diff --git a/app/assets/javascripts/runner/local_storage_alert/show_alert_from_local_storage.js b/app/assets/javascripts/runner/local_storage_alert/show_alert_from_local_storage.js
new file mode 100644
index 00000000000..d768a06494a
--- /dev/null
+++ b/app/assets/javascripts/runner/local_storage_alert/show_alert_from_local_storage.js
@@ -0,0 +1,18 @@
+import AccessorUtilities from '~/lib/utils/accessor';
+import { LOCAL_STORAGE_ALERT_KEY } from './constants';
+
+export const showAlertFromLocalStorage = async () => {
+ if (AccessorUtilities.canUseLocalStorage()) {
+ const alertOptions = localStorage.getItem(LOCAL_STORAGE_ALERT_KEY);
+
+ if (alertOptions) {
+ try {
+ const { createAlert } = await import('~/flash');
+ createAlert(JSON.parse(alertOptions));
+ } catch {
+ // ignore when the alert data cannot be parsed
+ }
+ }
+ localStorage.removeItem(LOCAL_STORAGE_ALERT_KEY);
+ }
+};
diff --git a/app/assets/javascripts/runner/runner_search_utils.js b/app/assets/javascripts/runner/runner_search_utils.js
index 5e3c412ddb6..0d688ed65ef 100644
--- a/app/assets/javascripts/runner/runner_search_utils.js
+++ b/app/assets/javascripts/runner/runner_search_utils.js
@@ -18,7 +18,6 @@ import {
PARAM_KEY_BEFORE,
DEFAULT_SORT,
RUNNER_PAGE_SIZE,
- STATUS_NEVER_CONTACTED,
} from './constants';
import { getPaginationVariables } from './utils';
@@ -84,7 +83,6 @@ const getPaginationFromParams = (params) => {
};
// Outdated URL parameters
-const STATUS_NOT_CONNECTED = 'NOT_CONNECTED';
const STATUS_ACTIVE = 'ACTIVE';
const STATUS_PAUSED = 'PAUSED';
@@ -116,10 +114,6 @@ export const updateOutdatedUrl = (url = window.location.href) => {
const status = params[PARAM_KEY_STATUS]?.[0] || null;
switch (status) {
- case STATUS_NOT_CONNECTED:
- return updateUrlParams(url, {
- [PARAM_KEY_STATUS]: [STATUS_NEVER_CONTACTED],
- });
case STATUS_ACTIVE:
return updateUrlParams(url, {
[PARAM_KEY_PAUSED]: ['false'],
diff --git a/app/assets/javascripts/runner/utils.js b/app/assets/javascripts/runner/utils.js
index 1f7794720de..cb2917a92fd 100644
--- a/app/assets/javascripts/runner/utils.js
+++ b/app/assets/javascripts/runner/utils.js
@@ -1,5 +1,4 @@
import { formatNumber } from '~/locale';
-import { DEFAULT_TH_CLASSES } from '~/lib/utils/constants';
import { RUNNER_JOB_COUNT_LIMIT } from './constants';
/**
@@ -28,7 +27,7 @@ export const tableField = ({ key, label = '', thClasses = [], ...options }) => {
return {
key,
label,
- thClass: [DEFAULT_TH_CLASSES, ...thClasses],
+ thClass: thClasses,
tdAttr: {
'data-testid': `td-${key}`,
},
diff --git a/app/assets/javascripts/security_configuration/components/app.vue b/app/assets/javascripts/security_configuration/components/app.vue
index ba0120a0a70..d0c4ad3646c 100644
--- a/app/assets/javascripts/security_configuration/components/app.vue
+++ b/app/assets/javascripts/security_configuration/components/app.vue
@@ -1,15 +1,15 @@
<script>
import { GlTab, GlTabs, GlSprintf, GlLink, GlAlert } from '@gitlab/ui';
import { __, s__ } from '~/locale';
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import UserCalloutDismisser from '~/vue_shared/components/user_callout_dismisser.vue';
+import SectionLayout from '~/vue_shared/security_configuration/components/section_layout.vue';
+import currentLicenseQuery from '~/security_configuration/graphql/current_license.query.graphql';
import AutoDevOpsAlert from './auto_dev_ops_alert.vue';
import AutoDevOpsEnabledAlert from './auto_dev_ops_enabled_alert.vue';
-import { AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY } from './constants';
+import { AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY, LICENSE_ULTIMATE } from './constants';
import FeatureCard from './feature_card.vue';
import TrainingProviderList from './training_provider_list.vue';
-import SectionLayout from './section_layout.vue';
import UpgradeBanner from './upgrade_banner.vue';
export const i18n = {
@@ -50,8 +50,18 @@ export default {
UserCalloutDismisser,
TrainingProviderList,
},
- mixins: [glFeatureFlagsMixin()],
inject: ['projectFullPath', 'vulnerabilityTrainingDocsPath'],
+ apollo: {
+ currentLicensePlan: {
+ query: currentLicenseQuery,
+ update({ currentLicense }) {
+ return currentLicense?.plan;
+ },
+ error() {
+ this.hasCurrentLicenseFetchError = true;
+ },
+ },
+ },
props: {
augmentedSecurityFeatures: {
type: Array,
@@ -91,6 +101,8 @@ export default {
return {
autoDevopsEnabledAlertDismissedProjects: [],
errorMessage: '',
+ currentLicensePlan: '',
+ hasCurrentLicenseFetchError: false,
};
},
computed: {
@@ -111,6 +123,12 @@ export default {
!this.autoDevopsEnabledAlertDismissedProjects.includes(this.projectFullPath)
);
},
+ shouldShowVulnerabilityManagementTab() {
+ // if the query fails (if the plan is `null` also means an error has occurred) we still want to show the feature
+ const hasQueryError = this.hasCurrentLicenseFetchError || this.currentLicensePlan === null;
+
+ return hasQueryError || this.currentLicensePlan === LICENSE_ULTIMATE;
+ },
},
methods: {
dismissAutoDevopsEnabledAlert() {
@@ -175,7 +193,7 @@ export default {
@dismiss="dismissAutoDevopsEnabledAlert"
/>
- <section-layout :heading="$options.i18n.securityTesting">
+ <section-layout class="gl-border-b-0" :heading="$options.i18n.securityTesting">
<template #description>
<p>
<span data-testid="latest-pipeline-info-security">
@@ -252,7 +270,7 @@ export default {
</section-layout>
</gl-tab>
<gl-tab
- v-if="glFeatures.secureVulnerabilityTraining"
+ v-if="shouldShowVulnerabilityManagementTab"
data-testid="vulnerability-management-tab"
:title="$options.i18n.vulnerabilityManagement"
query-param-value="vulnerability-management"
diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js
index 6db28ef0fad..5b04ad6f9ba 100644
--- a/app/assets/javascripts/security_configuration/components/constants.js
+++ b/app/assets/javascripts/security_configuration/components/constants.js
@@ -55,7 +55,7 @@ export const DAST_DESCRIPTION = s__(
);
export const DAST_HELP_PATH = helpPagePath('user/application_security/dast/index');
export const DAST_CONFIG_HELP_PATH = helpPagePath('user/application_security/dast/index', {
- anchor: 'enable-dast',
+ anchor: 'enable-automatic-dast-run',
});
export const DAST_BADGE_TEXT = __('Available on-demand');
export const DAST_BADGE_TOOLTIP = __(
@@ -126,7 +126,7 @@ export const COVERAGE_FUZZING_HELP_PATH = helpPagePath(
);
export const COVERAGE_FUZZING_CONFIG_HELP_PATH = helpPagePath(
'user/application_security/coverage_fuzzing/index',
- { anchor: 'configuration' },
+ { anchor: 'enable-coverage-guided-fuzz-testing' },
);
export const CORPUS_MANAGEMENT_NAME = __('Corpus Management');
@@ -310,3 +310,7 @@ export const TEMP_PROVIDER_URLS = {
Kontra: 'https://application.security/',
[__('Secure Code Warrior')]: 'https://www.securecodewarrior.com/',
};
+
+export const LICENSE_ULTIMATE = 'ultimate';
+export const LICENSE_FREE = 'free';
+export const LICENSE_PREMIUM = 'premium';
diff --git a/app/assets/javascripts/security_configuration/components/feature_card.vue b/app/assets/javascripts/security_configuration/components/feature_card.vue
index 309e5f21445..19b412d66ca 100644
--- a/app/assets/javascripts/security_configuration/components/feature_card.vue
+++ b/app/assets/javascripts/security_configuration/components/feature_card.vue
@@ -119,8 +119,10 @@ export default {
/>
<template v-if="enabled">
- <gl-icon name="check-circle-filled" />
- <span class="gl-text-green-700">{{ $options.i18n.enabled }}</span>
+ <span>
+ <gl-icon name="check-circle-filled" />
+ <span class="gl-text-green-700">{{ $options.i18n.enabled }}</span>
+ </span>
</template>
<template v-else-if="available">
diff --git a/app/assets/javascripts/security_configuration/components/section_layout.vue b/app/assets/javascripts/security_configuration/components/section_layout.vue
deleted file mode 100644
index 1fe8dd862a0..00000000000
--- a/app/assets/javascripts/security_configuration/components/section_layout.vue
+++ /dev/null
@@ -1,23 +0,0 @@
-<script>
-export default {
- name: 'SectionLayout',
- props: {
- heading: {
- type: String,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <div class="row gl-line-height-20 gl-pt-6">
- <div class="col-lg-4">
- <h2 class="gl-font-size-h2 gl-mt-0">{{ heading }}</h2>
- <slot name="description"></slot>
- </div>
- <div class="col-lg-8">
- <slot name="features"></slot>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/security_configuration/graphql/current_license.query.graphql b/app/assets/javascripts/security_configuration/graphql/current_license.query.graphql
new file mode 100644
index 00000000000..9ab4f4d4347
--- /dev/null
+++ b/app/assets/javascripts/security_configuration/graphql/current_license.query.graphql
@@ -0,0 +1,6 @@
+query getCurrentLicensePlan {
+ currentLicense {
+ id
+ plan
+ }
+}
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 f0474614dab..891e0dda312 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
@@ -5,6 +5,7 @@ query getSecurityTrainingUrls($projectFullPath: ID!, $identifierExternalIds: [St
name
status
url
+ identifier
}
}
}
diff --git a/app/assets/javascripts/security_configuration/index.js b/app/assets/javascripts/security_configuration/index.js
index 65cf1ec27a3..dcc41a38067 100644
--- a/app/assets/javascripts/security_configuration/index.js
+++ b/app/assets/javascripts/security_configuration/index.js
@@ -37,6 +37,7 @@ export const initSecurityConfiguration = (el) => {
return new Vue({
el,
apolloProvider,
+ name: 'SecurityConfigurationRoot',
provide: {
projectFullPath,
upgradePath,
diff --git a/app/assets/javascripts/serverless/components/area.vue b/app/assets/javascripts/serverless/components/area.vue
deleted file mode 100644
index a9584c070fe..00000000000
--- a/app/assets/javascripts/serverless/components/area.vue
+++ /dev/null
@@ -1,145 +0,0 @@
-<script>
-import { GlAreaChart } from '@gitlab/ui/dist/charts';
-import dateFormat from 'dateformat';
-import { debounceByAnimationFrame } from '~/lib/utils/common_utils';
-import { __ } from '~/locale';
-import { X_INTERVAL } from '../constants';
-import { validateGraphData } from '../utils';
-
-let debouncedResize;
-
-export default {
- components: {
- GlAreaChart,
- },
- inheritAttrs: false,
- props: {
- graphData: {
- type: Object,
- required: true,
- validator: validateGraphData,
- },
- containerWidth: {
- type: Number,
- required: true,
- },
- },
- data() {
- return {
- tooltipPopoverTitle: '',
- tooltipPopoverContent: '',
- width: this.containerWidth,
- };
- },
- computed: {
- chartData() {
- return this.graphData.queries.reduce((accumulator, query) => {
- accumulator[query.unit] = query.result.reduce((acc, res) => acc.concat(res.values), []);
- return accumulator;
- }, {});
- },
- extractTimeData() {
- return this.chartData.requests.map((data) => data.time);
- },
- generateSeries() {
- return {
- name: __('Invocations'),
- type: 'line',
- data: this.chartData.requests.map((data) => [data.time, data.value]),
- symbolSize: 0,
- };
- },
- getInterval() {
- const { result } = this.graphData.queries[0];
-
- if (result.length === 0) {
- return 1;
- }
-
- const split = result[0].values.reduce(
- (acc, pair) => (pair.value > acc ? pair.value : acc),
- 1,
- );
-
- return split < X_INTERVAL ? split : X_INTERVAL;
- },
- chartOptions() {
- return {
- xAxis: {
- name: 'time',
- type: 'time',
- axisLabel: {
- formatter: (date) => dateFormat(date, 'h:MM TT'),
- },
- data: this.extractTimeData,
- nameTextStyle: {
- padding: [18, 0, 0, 0],
- },
- },
- yAxis: {
- name: this.yAxisLabel,
- nameTextStyle: {
- padding: [0, 0, 36, 0],
- },
- splitNumber: this.getInterval,
- },
- legend: {
- formatter: this.xAxisLabel,
- },
- series: this.generateSeries,
- };
- },
- xAxisLabel() {
- return this.graphData.queries.map((query) => query.label).join(', ');
- },
- yAxisLabel() {
- const [query] = this.graphData.queries;
- return `${this.graphData.y_label} (${query.unit})`;
- },
- },
- watch: {
- containerWidth: 'onResize',
- },
- beforeDestroy() {
- window.removeEventListener('resize', debouncedResize);
- },
- created() {
- debouncedResize = debounceByAnimationFrame(this.onResize);
- window.addEventListener('resize', debouncedResize);
- },
- methods: {
- formatTooltipText(params) {
- const [seriesData] = params.seriesData;
- this.tooltipPopoverTitle = dateFormat(params.value, 'dd mmm yyyy, h:MMTT');
- this.tooltipPopoverContent = `${this.yAxisLabel}: ${seriesData.value[1]}`;
- },
- onResize() {
- const { width } = this.$refs.areaChart.$el.getBoundingClientRect();
- this.width = width;
- },
- },
-};
-</script>
-
-<template>
- <div class="prometheus-graph">
- <div class="prometheus-graph-header">
- <h5 ref="graphTitle" class="prometheus-graph-title">{{ graphData.title }}</h5>
- <div ref="graphWidgets" class="prometheus-graph-widgets">
- <slot></slot>
- </div>
- </div>
- <gl-area-chart
- ref="areaChart"
- v-bind="$attrs"
- :data="[]"
- :option="chartOptions"
- :format-tooltip-text="formatTooltipText"
- :width="width"
- :include-legend-avg-max="false"
- >
- <template #tooltip-title>{{ tooltipPopoverTitle }}</template>
- <template #tooltip-content>{{ tooltipPopoverContent }}</template>
- </gl-area-chart>
- </div>
-</template>
diff --git a/app/assets/javascripts/serverless/components/empty_state.vue b/app/assets/javascripts/serverless/components/empty_state.vue
deleted file mode 100644
index 6d1cea519c4..00000000000
--- a/app/assets/javascripts/serverless/components/empty_state.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<script>
-import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui';
-import { mapState } from 'vuex';
-import { s__ } from '~/locale';
-import { DEPRECATION_POST_LINK } from '../constants';
-
-export default {
- components: {
- GlEmptyState,
- GlLink,
- GlSprintf,
- },
- i18n: {
- title: s__('Serverless|Getting started with serverless'),
- description: s__(
- 'Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}',
- ),
- },
- deprecationPostLink: DEPRECATION_POST_LINK,
- computed: {
- ...mapState(['emptyImagePath', 'helpPath']),
- },
-};
-</script>
-
-<template>
- <gl-empty-state :svg-path="emptyImagePath" :title="$options.i18n.title">
- <template #description>
- <gl-sprintf :message="$options.i18n.description">
- <template #postLink="{ content }">
- <gl-link :href="$options.deprecationPostLink" target="_blank">{{ content }}</gl-link>
- </template>
- <template #link="{ content }">
- <gl-link :href="helpPath">{{ content }}</gl-link>
- </template>
- </gl-sprintf>
- </template>
- </gl-empty-state>
-</template>
diff --git a/app/assets/javascripts/serverless/components/environment_row.vue b/app/assets/javascripts/serverless/components/environment_row.vue
deleted file mode 100644
index 01030172ea8..00000000000
--- a/app/assets/javascripts/serverless/components/environment_row.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-<script>
-import ItemCaret from '~/groups/components/item_caret.vue';
-import FunctionRow from './function_row.vue';
-
-export default {
- components: {
- ItemCaret,
- FunctionRow,
- },
- props: {
- env: {
- type: Array,
- required: true,
- },
- envName: {
- type: String,
- required: true,
- },
- },
- data() {
- return {
- isOpen: true,
- };
- },
- computed: {
- envId() {
- if (this.envName === '*') {
- return 'env-global';
- }
-
- return `env-${this.envName}`;
- },
- isOpenClass() {
- return {
- 'is-open': this.isOpen,
- };
- },
- },
- methods: {
- toggleOpen() {
- this.isOpen = !this.isOpen;
- },
- },
-};
-</script>
-
-<template>
- <li :id="envId" :class="isOpenClass" class="group-row has-children">
- <div
- class="group-row-contents d-flex justify-content-end align-items-center py-2"
- role="button"
- @click.stop="toggleOpen"
- >
- <div class="folder-toggle-wrap d-flex align-items-center">
- <item-caret :is-group-open="isOpen" />
- </div>
- <div class="group-text flex-grow title namespace-title gl-ml-3">
- {{ envName }}
- </div>
- </div>
- <ul v-if="isOpen" class="content-list group-list-tree">
- <function-row v-for="(f, index) in env" :key="f.name" :index="index" :func="f" />
- </ul>
- </li>
-</template>
diff --git a/app/assets/javascripts/serverless/components/function_details.vue b/app/assets/javascripts/serverless/components/function_details.vue
deleted file mode 100644
index d2306c2d8bd..00000000000
--- a/app/assets/javascripts/serverless/components/function_details.vue
+++ /dev/null
@@ -1,94 +0,0 @@
-<script>
-import { isString } from 'lodash';
-import { mapState, mapActions, mapGetters } from 'vuex';
-import AreaChart from './area.vue';
-import MissingPrometheus from './missing_prometheus.vue';
-import PodBox from './pod_box.vue';
-import Url from './url.vue';
-
-export default {
- components: {
- PodBox,
- Url,
- AreaChart,
- MissingPrometheus,
- },
- props: {
- func: {
- type: Object,
- required: true,
- },
- hasPrometheus: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return {
- elWidth: 0,
- };
- },
- computed: {
- name() {
- return this.func.name;
- },
- description() {
- return isString(this.func.description) ? this.func.description : '';
- },
- funcUrl() {
- return this.func.url;
- },
- podCount() {
- return Number(this.func.podcount) || 0;
- },
- ...mapState(['graphData', 'hasPrometheusData']),
- ...mapGetters(['hasPrometheusMissingData']),
- },
- created() {
- this.fetchMetrics({
- metricsPath: this.func.metricsUrl,
- hasPrometheus: this.hasPrometheus,
- });
- },
- mounted() {
- this.elWidth = this.$el.clientWidth;
- },
- methods: {
- ...mapActions(['fetchMetrics']),
- },
-};
-</script>
-
-<template>
- <section id="serverless-function-details">
- <h3 class="serverless-function-name">{{ name }}</h3>
- <div class="gl-mb-3 serverless-function-description">
- <div v-for="(line, index) in description.split('\n')" :key="index">{{ line }}</div>
- </div>
- <url :uri="funcUrl" />
-
- <h4>{{ s__('ServerlessDetails|Kubernetes Pods') }}</h4>
- <div v-if="podCount > 0">
- <p>
- <b v-if="podCount == 1">{{ podCount }} {{ s__('ServerlessDetails|pod in use') }}</b>
- <b v-else>{{ podCount }} {{ s__('ServerlessDetails|pods in use') }}</b>
- </p>
- <pod-box :count="podCount" />
- <p>
- {{
- s__('ServerlessDetails|Number of Kubernetes pods in use over time based on necessity.')
- }}
- </p>
- </div>
- <div v-else>
- <p>{{ s__('ServerlessDetails|No pods loaded at this time.') }}</p>
- </div>
-
- <area-chart v-if="hasPrometheusData" :graph-data="graphData" :container-width="elWidth" />
- <missing-prometheus
- v-if="!hasPrometheus || hasPrometheusMissingData"
- :missing-data="hasPrometheusMissingData"
- />
- </section>
-</template>
diff --git a/app/assets/javascripts/serverless/components/function_row.vue b/app/assets/javascripts/serverless/components/function_row.vue
deleted file mode 100644
index fab9c0a75e7..00000000000
--- a/app/assets/javascripts/serverless/components/function_row.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-<script>
-import { isString } from 'lodash';
-import { visitUrl } from '~/lib/utils/url_utility';
-import Timeago from '~/vue_shared/components/time_ago_tooltip.vue';
-import Url from './url.vue';
-
-export default {
- components: {
- Timeago,
- Url,
- },
- props: {
- func: {
- type: Object,
- required: true,
- },
- },
- computed: {
- name() {
- return this.func.name;
- },
- description() {
- if (!isString(this.func.description)) {
- return '';
- }
-
- const desc = this.func.description.split('\n');
- if (desc.length > 1) {
- return desc[1];
- }
-
- return desc[0];
- },
- detailUrl() {
- return this.func.detail_url;
- },
- targetUrl() {
- return this.func.url;
- },
- image() {
- return this.func.image;
- },
- timestamp() {
- return this.func.created_at;
- },
- },
- methods: {
- checkClass(element) {
- if (element.closest('.no-expand') === null) {
- return true;
- }
-
- return false;
- },
- openDetails(e) {
- if (this.checkClass(e.target)) {
- visitUrl(this.detailUrl);
- }
- },
- },
-};
-</script>
-
-<template>
- <li :id="name" class="group-row">
- <div class="group-row-contents py-2" role="button" @click="openDetails">
- <p class="float-right text-right">
- <span>{{ image }}</span
- ><br />
- <timeago :time="timestamp" />
- </p>
- <b>{{ name }}</b>
- <div v-for="line in description.split('\n')" :key="line">{{ line }}</div>
- <url :uri="targetUrl" class="gl-mt-3 no-expand" />
- </div>
- </li>
-</template>
diff --git a/app/assets/javascripts/serverless/components/functions.vue b/app/assets/javascripts/serverless/components/functions.vue
deleted file mode 100644
index e9461aa3ead..00000000000
--- a/app/assets/javascripts/serverless/components/functions.vue
+++ /dev/null
@@ -1,139 +0,0 @@
-<script>
-import {
- GlLink,
- GlAlert,
- GlSprintf,
- GlLoadingIcon,
- GlSafeHtmlDirective as SafeHtml,
-} from '@gitlab/ui';
-import { mapState, mapActions, mapGetters } from 'vuex';
-import { sprintf, s__ } from '~/locale';
-import { CHECKING_INSTALLED, DEPRECATION_POST_LINK } from '../constants';
-import EmptyState from './empty_state.vue';
-import EnvironmentRow from './environment_row.vue';
-
-export default {
- components: {
- EnvironmentRow,
- EmptyState,
- GlLink,
- GlAlert,
- GlSprintf,
- GlLoadingIcon,
- },
- directives: {
- SafeHtml,
- },
- deprecationPostLink: DEPRECATION_POST_LINK,
- computed: {
- ...mapState(['installed', 'isLoading', 'hasFunctionData', 'helpPath', 'statusPath']),
- ...mapGetters(['getFunctions']),
-
- checkingInstalled() {
- return this.installed === CHECKING_INSTALLED;
- },
- isInstalled() {
- return this.installed === true;
- },
- noServerlessConfigFile() {
- return sprintf(
- s__(
- 'Serverless|Your repository does not have a corresponding %{startTag}serverless.yml%{endTag} file.',
- ),
- { startTag: '<code>', endTag: '</code>' },
- false,
- );
- },
- noGitlabYamlConfigured() {
- return sprintf(
- s__('Serverless|Your %{startTag}.gitlab-ci.yml%{endTag} file is not properly configured.'),
- { startTag: '<code>', endTag: '</code>' },
- false,
- );
- },
- mismatchedServerlessFunctions() {
- return sprintf(
- s__(
- "Serverless|The functions listed in the %{startTag}serverless.yml%{endTag} file don't match the namespace of your cluster.",
- ),
- { startTag: '<code>', endTag: '</code>' },
- false,
- );
- },
- },
- created() {
- this.fetchFunctions({
- functionsPath: this.statusPath,
- });
- },
- methods: {
- ...mapActions(['fetchFunctions']),
- },
-};
-</script>
-
-<template>
- <section id="serverless-functions" class="flex-grow">
- <gl-alert class="gl-mt-6" variant="warning" :dismissible="false">
- <gl-sprintf
- :message="s__('Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3.')"
- ><template #link="{ content }"
- ><gl-link :href="$options.deprecationPostLink" target="_blank">{{
- content
- }}</gl-link></template
- ></gl-sprintf
- >
- </gl-alert>
-
- <gl-loading-icon v-if="checkingInstalled" size="lg" class="gl-mt-3 gl-mb-3" />
-
- <div v-else-if="isInstalled">
- <div v-if="hasFunctionData">
- <div class="groups-list-tree-container js-functions-wrapper">
- <ul class="content-list group-list-tree">
- <environment-row
- v-for="(env, index) in getFunctions"
- :key="index"
- :env="env"
- :env-name="index"
- />
- </ul>
- </div>
- <gl-loading-icon v-if="isLoading" size="lg" class="gl-mt-3 gl-mb-3 js-functions-loader" />
- </div>
- <div v-else class="empty-state js-empty-state">
- <div class="text-content">
- <h4 class="state-title text-center">{{ s__('Serverless|No functions available') }}</h4>
- <p class="state-description">
- {{
- s__(
- 'Serverless|There is currently no function data available from Knative. This could be for a variety of reasons including:',
- )
- }}
- </p>
- <ul>
- <li v-safe-html="noServerlessConfigFile"></li>
- <li v-safe-html="noGitlabYamlConfigured"></li>
- <li v-safe-html="mismatchedServerlessFunctions"></li>
- <li>{{ s__('Serverless|The deploy job has not finished.') }}</li>
- </ul>
-
- <p>
- {{
- s__(
- 'Serverless|If you believe none of these apply, please check back later as the function data may be in the process of becoming available.',
- )
- }}
- </p>
- <div class="text-center">
- <gl-link :href="helpPath" class="btn btn-success">{{
- s__('Serverless|Learn more about Serverless')
- }}</gl-link>
- </div>
- </div>
- </div>
- </div>
-
- <empty-state v-else />
- </section>
-</template>
diff --git a/app/assets/javascripts/serverless/components/missing_prometheus.vue b/app/assets/javascripts/serverless/components/missing_prometheus.vue
deleted file mode 100644
index d9e6bb5009e..00000000000
--- a/app/assets/javascripts/serverless/components/missing_prometheus.vue
+++ /dev/null
@@ -1,57 +0,0 @@
-<script>
-import { GlButton, GlLink } from '@gitlab/ui';
-import { mapState } from 'vuex';
-import { s__ } from '~/locale';
-
-export default {
- components: {
- GlButton,
- GlLink,
- },
- props: {
- missingData: {
- type: Boolean,
- required: true,
- },
- },
- computed: {
- ...mapState(['clustersPath', 'helpPath']),
- missingStateClass() {
- return this.missingData ? 'missing-prometheus-state' : 'empty-prometheus-state';
- },
- prometheusHelpPath() {
- return `${this.helpPath}#prometheus-support`;
- },
- description() {
- return this.missingData
- ? s__(`ServerlessDetails|Invocation metrics loading or not available at this time.`)
- : s__(
- `ServerlessDetails|Function invocation metrics require the Prometheus cluster integration.`,
- );
- },
- },
-};
-</script>
-
-<template>
- <div class="row" :class="missingStateClass">
- <div class="col-12">
- <div class="text-content">
- <h4 class="state-title text-left">{{ s__(`ServerlessDetails|Invocations`) }}</h4>
- <p class="state-description">
- {{ description }}
- <gl-link :href="prometheusHelpPath">{{
- s__(`ServerlessDetails|More information`)
- }}</gl-link
- >.
- </p>
-
- <div v-if="!missingData" class="text-left">
- <gl-button :href="clustersPath" variant="success" category="primary">
- {{ s__('ServerlessDetails|Configure cluster.') }}
- </gl-button>
- </div>
- </div>
- </div>
- </div>
-</template>
diff --git a/app/assets/javascripts/serverless/components/pod_box.vue b/app/assets/javascripts/serverless/components/pod_box.vue
deleted file mode 100644
index 04d3641bce3..00000000000
--- a/app/assets/javascripts/serverless/components/pod_box.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-<script>
-export default {
- props: {
- count: {
- type: Number,
- required: true,
- },
- color: {
- type: String,
- required: false,
- default: 'green',
- },
- },
- methods: {
- boxOffset(i) {
- return 20 * (i - 1);
- },
- },
-};
-</script>
-
-<template>
- <svg :width="boxOffset(count + 1)" :height="20">
- <rect
- v-for="i in count"
- :key="i"
- width="15"
- height="15"
- rx="5"
- ry="5"
- :fill="color"
- :x="boxOffset(i)"
- y="0"
- />
- </svg>
-</template>
diff --git a/app/assets/javascripts/serverless/components/url.vue b/app/assets/javascripts/serverless/components/url.vue
deleted file mode 100644
index b105f49e475..00000000000
--- a/app/assets/javascripts/serverless/components/url.vue
+++ /dev/null
@@ -1,28 +0,0 @@
-<script>
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-
-export default {
- components: {
- ClipboardButton,
- },
- props: {
- uri: {
- type: String,
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <div class="clipboard-group">
- <div class="gl-cursor-text label label-monospace monospace" data-testid="url-text-field">
- {{ uri }}
- </div>
- <clipboard-button
- :text="uri"
- :title="s__('ServerlessURL|Copy URL')"
- class="input-group-text js-clipboard-btn"
- />
- </div>
-</template>
diff --git a/app/assets/javascripts/serverless/constants.js b/app/assets/javascripts/serverless/constants.js
deleted file mode 100644
index 42c9ee983b4..00000000000
--- a/app/assets/javascripts/serverless/constants.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export const MAX_REQUESTS = 3; // max number of times to retry
-
-export const X_INTERVAL = 5; // Reflects the number of verticle bars on the x-axis
-
-export const CHECKING_INSTALLED = 'checking'; // The backend is still determining whether or not Knative is installed
-
-export const TIMEOUT = 'timeout';
-
-export const DEPRECATION_POST_LINK =
- 'https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released/#gitlab-serverless';
diff --git a/app/assets/javascripts/serverless/event_hub.js b/app/assets/javascripts/serverless/event_hub.js
deleted file mode 100644
index e31806ad199..00000000000
--- a/app/assets/javascripts/serverless/event_hub.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import createEventHub from '~/helpers/event_hub_factory';
-
-export default createEventHub();
diff --git a/app/assets/javascripts/serverless/serverless_bundle.js b/app/assets/javascripts/serverless/serverless_bundle.js
deleted file mode 100644
index e8d87a40fc7..00000000000
--- a/app/assets/javascripts/serverless/serverless_bundle.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import Vue from 'vue';
-import FunctionDetails from './components/function_details.vue';
-import Functions from './components/functions.vue';
-import { createStore } from './store';
-
-export default class Serverless {
- constructor() {
- if (document.querySelector('.js-serverless-function-details-page') != null) {
- const entryPointData = document.querySelector('.js-serverless-function-details-page').dataset;
- const store = createStore(entryPointData);
-
- const {
- serviceName,
- serviceDescription,
- serviceEnvironment,
- serviceUrl,
- serviceNamespace,
- servicePodcount,
- serviceMetricsUrl,
- prometheus,
- } = entryPointData;
- const el = document.querySelector('#js-serverless-function-details');
-
- const service = {
- name: serviceName,
- description: serviceDescription,
- environment: serviceEnvironment,
- url: serviceUrl,
- namespace: serviceNamespace,
- podcount: servicePodcount,
- metricsUrl: serviceMetricsUrl,
- };
-
- this.functionDetails = new Vue({
- el,
- store,
- render(createElement) {
- return createElement(FunctionDetails, {
- props: {
- func: service,
- hasPrometheus: prometheus !== undefined,
- },
- });
- },
- });
- } else {
- const entryPointData = document.querySelector('.js-serverless-functions-page').dataset;
- const store = createStore(entryPointData);
-
- const el = document.querySelector('#js-serverless-functions');
- this.functions = new Vue({
- el,
- store,
- render(createElement) {
- return createElement(Functions);
- },
- });
- }
- }
-
- destroy() {
- this.destroyed = true;
-
- this.functions.$destroy();
- this.functionDetails.$destroy();
- }
-}
diff --git a/app/assets/javascripts/serverless/store/actions.js b/app/assets/javascripts/serverless/store/actions.js
deleted file mode 100644
index 166cd796680..00000000000
--- a/app/assets/javascripts/serverless/store/actions.js
+++ /dev/null
@@ -1,131 +0,0 @@
-import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-import { backOff } from '~/lib/utils/common_utils';
-import statusCodes from '~/lib/utils/http_status';
-import { __ } from '~/locale';
-import { MAX_REQUESTS, CHECKING_INSTALLED, TIMEOUT } from '../constants';
-import * as types from './mutation_types';
-
-export const requestFunctionsLoading = ({ commit }) => commit(types.REQUEST_FUNCTIONS_LOADING);
-export const receiveFunctionsSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_FUNCTIONS_SUCCESS, data);
-export const receiveFunctionsPartial = ({ commit }, data) =>
- commit(types.RECEIVE_FUNCTIONS_PARTIAL, data);
-export const receiveFunctionsTimeout = ({ commit }, data) =>
- commit(types.RECEIVE_FUNCTIONS_TIMEOUT, data);
-export const receiveFunctionsNoDataSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_FUNCTIONS_NODATA_SUCCESS, data);
-export const receiveFunctionsError = ({ commit }, error) =>
- commit(types.RECEIVE_FUNCTIONS_ERROR, error);
-
-export const receiveMetricsSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_METRICS_SUCCESS, data);
-export const receiveMetricsNoPrometheus = ({ commit }) =>
- commit(types.RECEIVE_METRICS_NO_PROMETHEUS);
-export const receiveMetricsNoDataSuccess = ({ commit }, data) =>
- commit(types.RECEIVE_METRICS_NODATA_SUCCESS, data);
-export const receiveMetricsError = ({ commit }, error) =>
- commit(types.RECEIVE_METRICS_ERROR, error);
-
-export const fetchFunctions = ({ dispatch }, { functionsPath }) => {
- let retryCount = 0;
-
- const functionsPartiallyFetched = (data) => {
- if (data.functions !== null && data.functions.length) {
- dispatch('receiveFunctionsPartial', data);
- }
- };
-
- dispatch('requestFunctionsLoading');
-
- backOff((next, stop) => {
- axios
- .get(functionsPath)
- .then((response) => {
- if (response.data.knative_installed === CHECKING_INSTALLED) {
- retryCount += 1;
- if (retryCount < MAX_REQUESTS) {
- functionsPartiallyFetched(response.data);
- next();
- } else {
- stop(TIMEOUT);
- }
- } else {
- stop(response.data);
- }
- })
- .catch(stop);
- })
- .then((data) => {
- if (data === TIMEOUT) {
- dispatch('receiveFunctionsTimeout');
- createFlash({
- message: __('Loading functions timed out. Please reload the page to try again.'),
- });
- } else if (data.functions !== null && data.functions.length) {
- dispatch('receiveFunctionsSuccess', data);
- } else {
- dispatch('receiveFunctionsNoDataSuccess', data);
- }
- })
- .catch((error) => {
- dispatch('receiveFunctionsError', error);
- createFlash({
- message: error,
- });
- });
-};
-
-export const fetchMetrics = ({ dispatch }, { metricsPath, hasPrometheus }) => {
- let retryCount = 0;
-
- if (!hasPrometheus) {
- dispatch('receiveMetricsNoPrometheus');
- return;
- }
-
- backOff((next, stop) => {
- axios
- .get(metricsPath)
- .then((response) => {
- if (response.status === statusCodes.NO_CONTENT) {
- retryCount += 1;
- if (retryCount < MAX_REQUESTS) {
- next();
- } else {
- dispatch('receiveMetricsNoDataSuccess');
- stop(null);
- }
- } else {
- stop(response.data);
- }
- })
- .catch(stop);
- })
- .then((data) => {
- if (data === null) {
- return;
- }
-
- const updatedMetric = data.metrics;
- const queries = data.metrics.queries.map((query) => ({
- ...query,
- result: query.result.map((result) => ({
- ...result,
- values: result.values.map(([timestamp, value]) => ({
- time: new Date(timestamp * 1000).toISOString(),
- value: Number(value),
- })),
- })),
- }));
-
- updatedMetric.queries = queries;
- dispatch('receiveMetricsSuccess', updatedMetric);
- })
- .catch((error) => {
- dispatch('receiveMetricsError', error);
- createFlash({
- message: error,
- });
- });
-};
diff --git a/app/assets/javascripts/serverless/store/getters.js b/app/assets/javascripts/serverless/store/getters.js
deleted file mode 100644
index da975c56e5d..00000000000
--- a/app/assets/javascripts/serverless/store/getters.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { translate } from '../utils';
-
-export const hasPrometheusMissingData = (state) => state.hasPrometheus && !state.hasPrometheusData;
-
-// Convert the function list into a k/v grouping based on the environment scope
-
-export const getFunctions = (state) => translate(state.functions);
diff --git a/app/assets/javascripts/serverless/store/index.js b/app/assets/javascripts/serverless/store/index.js
deleted file mode 100644
index 6f32d85201e..00000000000
--- a/app/assets/javascripts/serverless/store/index.js
+++ /dev/null
@@ -1,18 +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 createState from './state';
-
-Vue.use(Vuex);
-
-export const createStore = (entryPointData = {}) =>
- new Vuex.Store({
- actions,
- getters,
- mutations,
- state: createState(entryPointData),
- });
-
-export default createStore;
diff --git a/app/assets/javascripts/serverless/store/mutation_types.js b/app/assets/javascripts/serverless/store/mutation_types.js
deleted file mode 100644
index b8fa9ea1a01..00000000000
--- a/app/assets/javascripts/serverless/store/mutation_types.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export const REQUEST_FUNCTIONS_LOADING = 'REQUEST_FUNCTIONS_LOADING';
-export const RECEIVE_FUNCTIONS_SUCCESS = 'RECEIVE_FUNCTIONS_SUCCESS';
-export const RECEIVE_FUNCTIONS_PARTIAL = 'RECEIVE_FUNCTIONS_PARTIAL';
-export const RECEIVE_FUNCTIONS_TIMEOUT = 'RECEIVE_FUNCTIONS_TIMEOUT';
-export const RECEIVE_FUNCTIONS_NODATA_SUCCESS = 'RECEIVE_FUNCTIONS_NODATA_SUCCESS';
-export const RECEIVE_FUNCTIONS_ERROR = 'RECEIVE_FUNCTIONS_ERROR';
-
-export const RECEIVE_METRICS_NO_PROMETHEUS = 'RECEIVE_METRICS_NO_PROMETHEUS';
-export const RECEIVE_METRICS_SUCCESS = 'RECEIVE_METRICS_SUCCESS';
-export const RECEIVE_METRICS_NODATA_SUCCESS = 'RECEIVE_METRICS_NODATA_SUCCESS';
-export const RECEIVE_METRICS_ERROR = 'RECEIVE_METRICS_ERROR';
diff --git a/app/assets/javascripts/serverless/store/mutations.js b/app/assets/javascripts/serverless/store/mutations.js
deleted file mode 100644
index 2685a5b11ff..00000000000
--- a/app/assets/javascripts/serverless/store/mutations.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import * as types from './mutation_types';
-
-export default {
- [types.REQUEST_FUNCTIONS_LOADING](state) {
- state.isLoading = true;
- },
- [types.RECEIVE_FUNCTIONS_SUCCESS](state, data) {
- state.functions = data.functions;
- state.installed = data.knative_installed;
- state.isLoading = false;
- state.hasFunctionData = true;
- },
- [types.RECEIVE_FUNCTIONS_PARTIAL](state, data) {
- state.functions = data.functions;
- state.installed = true;
- state.isLoading = true;
- state.hasFunctionData = true;
- },
- [types.RECEIVE_FUNCTIONS_TIMEOUT](state) {
- state.isLoading = false;
- },
- [types.RECEIVE_FUNCTIONS_NODATA_SUCCESS](state, data) {
- state.isLoading = false;
- state.installed = data.knative_installed;
- state.hasFunctionData = false;
- },
- [types.RECEIVE_FUNCTIONS_ERROR](state, error) {
- state.error = error;
- state.hasFunctionData = false;
- state.isLoading = false;
- },
- [types.RECEIVE_METRICS_SUCCESS](state, data) {
- state.isLoading = false;
- state.hasPrometheusData = true;
- state.graphData = data;
- },
- [types.RECEIVE_METRICS_NODATA_SUCCESS](state) {
- state.isLoading = false;
- state.hasPrometheusData = false;
- },
- [types.RECEIVE_METRICS_ERROR](state, error) {
- state.hasPrometheusData = false;
- state.error = error;
- },
- [types.RECEIVE_METRICS_NO_PROMETHEUS](state) {
- state.hasPrometheusData = false;
- state.hasPrometheus = false;
- },
-};
diff --git a/app/assets/javascripts/serverless/store/state.js b/app/assets/javascripts/serverless/store/state.js
deleted file mode 100644
index 353bfcf3fed..00000000000
--- a/app/assets/javascripts/serverless/store/state.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export default (
- initialState = { clustersPath: null, helpPath: null, emptyImagePath: null, statusPath: null },
-) => ({
- clustersPath: initialState.clustersPath,
- error: null,
- helpPath: initialState.helpPath,
- installed: 'checking',
- isLoading: true,
-
- // functions
- functions: [],
- hasFunctionData: true,
- statusPath: initialState.statusPath,
-
- // function_details
- hasPrometheus: true,
- hasPrometheusData: false,
- graphData: {},
-
- // empty_state
- emptyImagePath: initialState.emptyImagePath,
-});
diff --git a/app/assets/javascripts/serverless/utils.js b/app/assets/javascripts/serverless/utils.js
deleted file mode 100644
index e218a9aa3fd..00000000000
--- a/app/assets/javascripts/serverless/utils.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Validate that the object coming in has valid query details and results
-export const validateGraphData = (data) =>
- data.queries &&
- Array.isArray(data.queries) &&
- data.queries.filter((query) => {
- if (Array.isArray(query.result)) {
- return query.result.filter((res) => Array.isArray(res.values)).length === query.result.length;
- }
-
- return false;
- }).length === data.queries.length;
-
-export const translate = (functions) =>
- functions.reduce(
- (acc, func) =>
- Object.assign(acc, {
- [func.environment_scope]: (acc[func.environment_scope] || []).concat([func]),
- }),
- {},
- );
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 578c344da02..ef40de82d01 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_avatar_link.vue
@@ -101,14 +101,15 @@ 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"
- class="gl-display-inline-block"
+ :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 -->
<span class="gl-display-flex">
- <assignee-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
+ <assignee-avatar :user="user" :img-size="24" :issuable-type="issuableType" />
<slot></slot>
</span>
</gl-link>
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
index f98aa0dc77d..6e18cf36690 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignee_title.vue
@@ -1,6 +1,7 @@
<script>
import { GlLoadingIcon, GlIcon } from '@gitlab/ui';
import { n__, __ } from '~/locale';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
export default {
name: 'AssigneeTitle',
@@ -8,6 +9,7 @@ export default {
GlLoadingIcon,
GlIcon,
},
+ mixins: [glFeatureFlagMixin()],
props: {
loading: {
type: Boolean,
@@ -45,7 +47,7 @@ export default {
};
</script>
<template>
- <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
+ <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900 gl-font-weight-bold">
{{ assigneeTitle }}
<gl-loading-icon v-if="loading" size="sm" inline class="align-bottom" />
<a
@@ -63,6 +65,7 @@ export default {
v-if="showToggle"
:aria-label="__('Toggle sidebar')"
class="gutter-toggle float-right js-sidebar-toggle"
+ :class="{ 'gl-display-block gl-md-display-none!': glFeatures.movedMrSidebar }"
href="#"
role="button"
>
diff --git a/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue b/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
index 856687c00ae..50b1955abcc 100644
--- a/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/collapsed_assignee_list.vue
@@ -124,7 +124,11 @@ export default {
:issuable-type="issuableType"
/>
<button v-if="hasMoreThanTwoAssignees" class="btn-link" type="button">
- <span class="avatar-counter sidebar-avatar-counter"> {{ sidebarAvatarCounter }} </span>
+ <span
+ class="avatar-counter sidebar-avatar-counter gl-display-flex gl-align-items-center gl-pl-3"
+ >
+ {{ sidebarAvatarCounter }}
+ </span>
<gl-icon
v-if="isMergeRequest && !allAssigneesCanMerge"
name="warning-solid"
diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue
index 19f588b28be..e9c68008143 100644
--- a/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_participant.vue
@@ -3,6 +3,11 @@ import { GlAvatarLabeled, GlAvatarLink, GlIcon } from '@gitlab/ui';
import { IssuableType } from '~/issues/constants';
import { s__, sprintf } from '~/locale';
+const AVAILABILITY_STATUS = {
+ NOT_SET: 'NOT_SET',
+ BUSY: 'BUSY',
+};
+
export default {
components: {
GlAvatarLabeled,
@@ -22,12 +27,17 @@ export default {
},
computed: {
userLabel() {
- if (!this.user.status) {
- return this.user.name;
+ const { name, status } = this.user;
+ if (!status || status?.availability !== AVAILABILITY_STATUS.BUSY) {
+ return name;
}
- return sprintf(s__('UserAvailability|%{author} (Busy)'), {
- author: this.user.name,
- });
+ return sprintf(
+ s__('UserAvailability|%{author} (Busy)'),
+ {
+ author: name,
+ },
+ false,
+ );
},
hasCannotMergeIcon() {
return this.issuableType === IssuableType.MergeRequest && !this.user.canMerge;
diff --git a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
index 8717d205dcb..01d29da5486 100644
--- a/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/uncollapsed_assignee_list.vue
@@ -35,13 +35,6 @@ export default {
firstUser() {
return this.users[0];
},
- hasOneUser() {
- if (this.showVerticalList) {
- return false;
- }
-
- return this.users.length === 1;
- },
hiddenAssigneesLabel() {
const { numberOfHiddenAssignees } = this;
return sprintf(__('+ %{numberOfHiddenAssignees} more'), { numberOfHiddenAssignees });
@@ -90,30 +83,15 @@ export default {
</script>
<template>
- <assignee-avatar-link
- v-if="hasOneUser"
- tooltip-placement="left"
- :tooltip-has-name="false"
- :user="firstUser"
- :issuable-type="issuableType"
- >
- <div class="ml-2 gl-line-height-normal">
- <user-name-with-status :name="firstUser.name" :availability="userAvailability(firstUser)" />
- <div>{{ username }}</div>
- </div>
- </assignee-avatar-link>
- <div v-else>
+ <div>
<div class="gl-display-flex gl-flex-wrap">
<div
v-for="(user, index) in uncollapsedUsers"
:key="user.id"
:class="{
- 'user-item': !showVerticalList,
- 'gl-display-inline-block': !showVerticalList,
- 'gl-display-grid gl-align-items-center': showVerticalList,
- 'gl-mb-3': index !== users.length - 1 && showVerticalList,
+ 'gl-mb-3': index !== users.length - 1,
}"
- class="assignee-grid"
+ class="assignee-grid gl-display-grid gl-align-items-center gl-w-full"
>
<assignee-avatar-link
:user="user"
@@ -123,12 +101,10 @@ export default {
data-css-area="user"
>
<div
- v-if="showVerticalList"
- class="gl-ml-3 gl-line-height-normal gl-display-grid"
+ class="gl-ml-3 gl-line-height-normal gl-display-grid gl-align-items-center"
data-testid="username"
>
<user-name-with-status :name="user.name" :availability="userAvailability(user)" />
- <span>@{{ user.username }}</span>
</div>
</assignee-avatar-link>
<attention-requested-toggle
diff --git a/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
index cdc1c65a516..031de669489 100644
--- a/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
+++ b/app/assets/javascripts/sidebar/components/attention_requested_toggle.vue
@@ -5,9 +5,8 @@ import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
export default {
i18n: {
- attentionRequestedReviewer: __('Request attention to review'),
- attentionRequestedAssignee: __('Request attention'),
- removeAttentionRequested: __('Remove attention request'),
+ addAttentionRequest: __('Add attention request'),
+ removeAttentionRequest: __('Remove attention request'),
attentionRequestedNoPermission: __('Attention requested'),
noAttentionRequestedNoPermission: __('No attention request'),
},
@@ -36,20 +35,35 @@ export default {
tooltipTitle() {
if (this.user.attention_requested) {
if (this.user.can_update_merge_request) {
- return this.$options.i18n.removeAttentionRequested;
+ return this.$options.i18n.removeAttentionRequest;
}
return this.$options.i18n.attentionRequestedNoPermission;
}
if (this.user.can_update_merge_request) {
- return this.type === 'reviewer'
- ? this.$options.i18n.attentionRequestedReviewer
- : this.$options.i18n.attentionRequestedAssignee;
+ return this.$options.i18n.addAttentionRequest;
}
return this.$options.i18n.noAttentionRequestedNoPermission;
},
+ request() {
+ const state = {
+ variant: 'default',
+ icon: 'attention',
+ direction: 'add',
+ };
+
+ if (this.user.attention_requested) {
+ Object.assign(state, {
+ variant: 'warning',
+ icon: 'attention-solid',
+ direction: 'remove',
+ });
+ }
+
+ return state;
+ },
},
methods: {
toggleAttentionRequired() {
@@ -60,6 +74,7 @@ export default {
this.$emit('toggle-attention-requested', {
user: this.user,
callback: this.toggleAttentionRequiredComplete,
+ direction: this.request.direction,
});
},
toggleAttentionRequiredComplete() {
@@ -77,8 +92,8 @@ export default {
>
<gl-button
:loading="loading"
- :variant="user.attention_requested ? 'warning' : 'default'"
- :icon="user.attention_requested ? 'attention-solid' : 'attention'"
+ :variant="request.variant"
+ :icon="request.icon"
:aria-label="tooltipTitle"
:class="{ 'gl-pointer-events-none': !user.can_update_merge_request }"
size="small"
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue
index 37a44eb8f01..6afaee91d7a 100644
--- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_content.vue
@@ -1,10 +1,13 @@
<script>
-import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import { __, sprintf } from '~/locale';
+import { GlIcon, GlAlert, GlTooltipDirective } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { IssuableType, WorkspaceType } from '~/issues/constants';
+import { confidentialityInfoText } from '~/vue_shared/constants';
export default {
components: {
GlIcon,
+ GlAlert,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -20,12 +23,11 @@ export default {
},
},
computed: {
- confidentialText() {
- return this.confidential
- ? sprintf(__('This %{issuableType} is confidential'), {
- issuableType: this.issuableType,
- })
- : __('Not confidential');
+ confidentialBodyText() {
+ return confidentialityInfoText(
+ this.issuableType === IssuableType.Epic ? WorkspaceType.group : WorkspaceType.project,
+ this.issuableType,
+ );
},
confidentialIcon() {
return this.confidential ? 'eye-slash' : 'eye';
@@ -59,6 +61,17 @@ export default {
class="sidebar-item-icon inline hide-collapsed"
:class="{ 'is-active': confidential }"
/>
- <span class="hide-collapsed" data-testid="confidential-text">{{ confidentialText }}</span>
+ <span class="hide-collapsed" data-testid="confidential-text">
+ {{ tooltipLabel }}
+ <gl-alert
+ v-if="confidential"
+ :show-icon="false"
+ :dismissible="false"
+ variant="warning"
+ class="gl-mt-3"
+ >
+ {{ confidentialBodyText }}
+ </gl-alert>
+ </span>
</div>
</template>
diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue
index 209d1cca360..71e40fde77d 100644
--- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue
+++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue
@@ -8,7 +8,7 @@ import { confidentialityQueries } from '~/sidebar/constants';
export default {
i18n: {
confidentialityOnWarning: __(
- 'You are going to turn on confidentiality. Only team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{issuableType}.',
+ '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}.',
),
confidentialityOffWarning: __(
'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}.',
@@ -53,6 +53,9 @@ export default {
? this.$options.i18n.confidentialityOffWarning
: this.$options.i18n.confidentialityOnWarning;
},
+ context() {
+ return this.issuableType === IssuableType.Issue ? __('project') : __('group');
+ },
workspacePath() {
return this.issuableType === IssuableType.Issue
? {
@@ -119,6 +122,7 @@ export default {
<template #strong="{ content }">
<strong>{{ content }}</strong>
</template>
+ <template #context>{{ context }}</template>
<template #issuableType>{{ issuableType }}</template>
</gl-sprintf>
</p>
diff --git a/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue b/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue
index 950647f1cb2..67f36f65b5d 100644
--- a/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue
+++ b/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue
@@ -2,7 +2,7 @@
import { GlIcon, GlLink, GlPopover, GlTooltipDirective } from '@gitlab/ui';
import { __, n__, sprintf } from '~/locale';
import createFlash from '~/flash';
-import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
import { TYPE_ISSUE } from '~/graphql_shared/constants';
import getIssueCrmContactsQuery from './queries/get_issue_crm_contacts.query.graphql';
import issueCrmContactsSubscription from './queries/issue_crm_contacts.subscription.graphql';
@@ -21,6 +21,10 @@ export default {
type: String,
required: true,
},
+ groupIssuesPath: {
+ type: String,
+ required: true,
+ },
},
data() {
return {
@@ -85,6 +89,10 @@ export default {
Boolean,
);
},
+ getIssuesPath(contactId) {
+ const id = getIdFromGraphQLId(contactId);
+ return `${this.groupIssuesPath}?crm_contact_id=${id}`;
+ },
},
};
</script>
@@ -100,7 +108,7 @@ export default {
><gl-icon name="question-o"
/></gl-link>
</div>
- <div class="title hide-collapsed gl-mb-2 gl-line-height-20">
+ <div class="title hide-collapsed gl-mb-2 gl-line-height-20 gl-font-weight-bold">
{{ contactsLabel }}
</div>
<div class="hide-collapsed gl-display-flex gl-flex-wrap">
@@ -110,8 +118,8 @@ export default {
:key="index"
class="gl-pr-2"
>
- <span :id="`contact_${index}`" class="gl-font-weight-bold"
- >{{ contact.firstName }} {{ contact.lastName }}{{ divider(index) }}</span
+ <gl-link :id="`contact_${index}`" :href="getIssuesPath(contact.id)"
+ >{{ contact.firstName }} {{ contact.lastName }}{{ divider(index) }}</gl-link
>
<gl-popover
v-if="shouldShowPopover(contact)"
diff --git a/app/assets/javascripts/sidebar/components/date/sidebar_formatted_date.vue b/app/assets/javascripts/sidebar/components/date/sidebar_formatted_date.vue
index 87cf1c29fb0..627b8452508 100644
--- a/app/assets/javascripts/sidebar/components/date/sidebar_formatted_date.vue
+++ b/app/assets/javascripts/sidebar/components/date/sidebar_formatted_date.vue
@@ -35,7 +35,7 @@ export default {
<template>
<div class="gl-display-flex gl-align-items-center hide-collapsed">
<span
- :class="hasDate ? 'gl-text-gray-900 gl-font-weight-bold' : 'gl-text-gray-500'"
+ :class="hasDate ? 'gl-text-gray-900' : 'gl-text-gray-500'"
data-testid="sidebar-date-value"
>
{{ formattedDate }}
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 cb49f329f7e..699d1bebea1 100644
--- a/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
+++ b/app/assets/javascripts/sidebar/components/lock/issuable_lock_form.vue
@@ -1,7 +1,9 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
-import { mapGetters } from 'vuex';
-import { __ } from '~/locale';
+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 editForm from './edit_form.vue';
@@ -23,11 +25,11 @@ export default {
editForm,
GlIcon,
},
-
directives: {
GlTooltip: GlTooltipDirective,
},
-
+ mixins: [glFeatureFlagMixin()],
+ inject: ['fullPath'],
props: {
isEditable: {
required: true,
@@ -41,6 +43,9 @@ export default {
},
computed: {
...mapGetters(['getNoteableData']),
+ isMergeRequest() {
+ return this.getNoteableData.targetType === 'merge_request' && this.glFeatures.movedMrSidebar;
+ },
issuableDisplayName() {
const isInIssuePage = this.getNoteableData.targetType === this.$options.issue;
return isInIssuePage ? __('issue') : __('merge request');
@@ -66,17 +71,49 @@ export default {
},
methods: {
+ ...mapActions(['updateLockedAttribute']),
toggleForm() {
if (this.isEditable) {
this.isLockDialogOpen = !this.isLockDialogOpen;
}
},
+ toggleLocked() {
+ this.isLoading = true;
+
+ this.updateLockedAttribute({
+ locked: !this.isLocked,
+ fullPath: this.fullPath,
+ })
+ .catch(() => {
+ const flashMessage = __(
+ 'Something went wrong trying to change the locked state of this %{issuableDisplayName}',
+ );
+ createFlash({
+ message: sprintf(flashMessage, { issuableDisplayName: this.issuableDisplayName }),
+ });
+ })
+ .finally(() => {
+ this.isLoading = false;
+ });
+ },
},
};
</script>
<template>
- <div class="block issuable-sidebar-item lock">
+ <li v-if="isMergeRequest" class="gl-new-dropdown-item">
+ <button type="button" class="dropdown-item" @click="toggleLocked">
+ <span class="gl-new-dropdown-item-text-wrapper">
+ <template v-if="isLocked">
+ {{ __('Unlock merge request') }}
+ </template>
+ <template v-else>
+ {{ __('Lock merge request') }}
+ </template>
+ </span>
+ </button>
+ </li>
+ <div v-else class="block issuable-sidebar-item lock">
<div
v-gl-tooltip.left.viewport="{ title: tooltipLabel }"
class="sidebar-collapsed-icon"
@@ -86,7 +123,7 @@ export default {
<gl-icon :name="lockStatus.icon" class="sidebar-item-icon is-active" />
</div>
- <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
+ <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900 gl-font-weight-bold">
{{ sprintf(__('Lock %{issuableDisplayName}'), { issuableDisplayName: issuableDisplayName }) }}
<a
v-if="isEditable"
@@ -111,12 +148,6 @@ export default {
/>
<div data-testid="lock-status" class="sidebar-item-value" :class="lockStatus.class">
- <gl-icon
- :size="16"
- :name="lockStatus.icon"
- class="sidebar-item-icon"
- :class="lockStatus.iconClass"
- />
{{ lockStatus.displayText }}
</div>
</div>
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index 3fd35de2132..77e41648e9b 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -101,7 +101,10 @@ export default {
<gl-loading-icon v-if="loading" size="sm" />
<span v-else data-testid="collapsed-count"> {{ participantCount }} </span>
</div>
- <div v-if="showParticipantLabel" class="title hide-collapsed gl-mb-2 gl-line-height-20">
+ <div
+ v-if="showParticipantLabel"
+ class="title hide-collapsed gl-mb-2! gl-line-height-20 gl-font-weight-bold"
+ >
<gl-loading-icon v-if="loading" size="sm" :inline="true" />
{{ participantLabel }}
</div>
diff --git a/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue b/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
index 60d8fb4d408..e09b5d913f7 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/collapsed_reviewer_list.vue
@@ -96,7 +96,11 @@ export default {
<gl-icon v-if="hasNoUsers" name="user" :aria-label="__('None')" />
<collapsed-reviewer v-for="user in collapsedUsers" :key="user.id" :user="user" />
<button v-if="hasMoreThanTwoReviewers" class="btn-link" type="button">
- <span class="avatar-counter sidebar-avatar-counter"> {{ sidebarAvatarCounter }} </span>
+ <span
+ class="avatar-counter sidebar-avatar-counter gl-display-flex gl-align-items-center gl-pl-3"
+ >
+ {{ sidebarAvatarCounter }}
+ </span>
<gl-icon
v-if="!allReviewersCanMerge"
name="warning-solid"
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 a11468c8761..36a08482e69 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_avatar_link.vue
@@ -47,8 +47,6 @@ export default {
return sprintf(__('%{userName} (cannot merge)'), { userName: this.user.name });
} else if (this.cannotMerge) {
return __('Cannot merge');
- } else if (this.tooltipHasName) {
- return this.user.name;
}
return '';
@@ -70,14 +68,15 @@ 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"
- class="gl-display-inline-block"
+ :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 -->
<span class="gl-display-flex">
- <reviewer-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
+ <reviewer-avatar :user="user" :img-size="24" :issuable-type="issuableType" />
<slot :user="user"></slot>
</span>
</gl-link>
diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
index 367dcdb961b..933b9b11b40 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue
@@ -33,7 +33,7 @@ export default {
};
</script>
<template>
- <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
+ <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900 gl-font-weight-bold">
{{ reviewerTitle }}
<gl-loading-icon v-if="loading" size="sm" inline class="align-bottom" />
<a
diff --git a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
index 3e6be3487b1..2f58e11c00f 100644
--- a/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
+++ b/app/assets/javascripts/sidebar/components/reviewers/uncollapsed_reviewer_list.vue
@@ -98,7 +98,7 @@ export default {
'gl-mb-3': index !== users.length - 1,
'attention-requests': glFeatures.mrAttentionRequests,
}"
- class="gl-display-grid gl-align-items-center reviewer-grid"
+ class="gl-display-grid gl-align-items-center reviewer-grid gl-mr-2"
data-testid="reviewer"
>
<reviewer-avatar-link
@@ -108,9 +108,8 @@ export default {
class="gl-word-break-word gl-mr-2"
data-css-area="user"
>
- <div class="gl-ml-3 gl-line-height-normal gl-display-grid">
- <span>{{ user.name }}</span>
- <span>@{{ user.username }}</span>
+ <div class="gl-ml-3 gl-line-height-normal gl-display-grid gl-align-items-center">
+ {{ user.name }}
</div>
</reviewer-avatar-link>
<attention-requested-toggle
diff --git a/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue b/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
index ec23e817127..897cab45fe4 100644
--- a/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
+++ b/app/assets/javascripts/sidebar/components/sidebar_dropdown_widget.vue
@@ -331,20 +331,19 @@ export default {
:data-testid="`select-${formatIssuableAttribute.kebab}`"
:class="isClassicSidebar ? 'hide-collapsed' : 'gl-mt-3'"
>
- <span v-if="updating" class="gl-font-weight-bold">{{ selectedTitle }}</span>
+ <span v-if="updating">{{ selectedTitle }}</span>
<span v-else-if="!currentAttribute" class="gl-text-gray-500">
{{ $options.i18n.none }}
</span>
<slot
v-else
name="value"
- :attributeTitle="attributeTitle"
- :attributeUrl="attributeUrl"
- :currentAttribute="currentAttribute"
+ :attribute-title="attributeTitle"
+ :attribute-url="attributeUrl"
+ :current-attribute="currentAttribute"
>
<gl-link
v-gl-tooltip="tooltipText"
- class="gl-text-gray-900! gl-font-weight-bold"
:href="attributeUrl"
:data-qa-selector="`${formatIssuableAttribute.snake}_link`"
>
@@ -389,9 +388,9 @@ export default {
<slot
v-else
name="list"
- :attributesList="attributesList"
- :isAttributeChecked="isAttributeChecked"
- :updateAttribute="updateAttribute"
+ :attributes-list="attributesList"
+ :is-attribute-checked="isAttributeChecked"
+ :update-attribute="updateAttribute"
>
<gl-dropdown-item
v-for="attrItem in attributesList"
diff --git a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
index 056b3e98a1c..7551b181a58 100644
--- a/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
+++ b/app/assets/javascripts/sidebar/components/sidebar_editable_item.vue
@@ -110,7 +110,7 @@ export default {
<template>
<div>
<div
- class="gl-display-flex gl-align-items-center gl-line-height-20 gl-mb-2 gl-text-gray-900"
+ class="gl-display-flex gl-align-items-center gl-line-height-20 gl-mb-2 gl-text-gray-900 gl-font-weight-bold"
@click.self="collapse"
>
<span class="hide-collapsed" data-testid="title" @click="collapse">
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 7a10a9f3a4c..1bafa845665 100644
--- a/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
+++ b/app/assets/javascripts/sidebar/components/subscriptions/sidebar_subscriptions_widget.vue
@@ -5,6 +5,7 @@ import { IssuableType } from '~/issues/constants';
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 { subscribedQueries, Tracking } from '~/sidebar/constants';
const ICON_ON = 'notifications';
@@ -25,6 +26,7 @@ export default {
GlToggle,
SidebarEditableItem,
},
+ mixins: [glFeatureFlagMixin()],
props: {
iid: {
type: String,
@@ -82,6 +84,9 @@ export default {
},
},
computed: {
+ isMergeRequest() {
+ return this.issuableType === IssuableType.MergeRequest && this.glFeatures.movedMrSidebar;
+ },
isLoading() {
return this.$apollo.queries?.subscribed?.loading || this.loading;
},
@@ -171,7 +176,20 @@ export default {
</script>
<template>
+ <li v-if="isMergeRequest" class="gl-new-dropdown-item">
+ <button type="button" class="dropdown-item" @click="toggleSubscribed">
+ <span class="gl-new-dropdown-item-text-wrapper">
+ <template v-if="subscribed">
+ {{ __('Turn off notifications') }}
+ </template>
+ <template v-else>
+ {{ __('Turn on notifications') }}
+ </template>
+ </span>
+ </button>
+ </li>
<sidebar-editable-item
+ v-else
ref="editable"
:title="$options.i18n.notifications"
:tracking="$options.tracking"
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/report.vue b/app/assets/javascripts/sidebar/components/time_tracking/report.vue
index 5d4031ac68b..d9797961d40 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/report.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/report.vue
@@ -78,9 +78,9 @@ export default {
},
},
fields: [
- { key: 'spentAt', label: __('Spent At'), sortable: true },
+ { key: 'spentAt', label: __('Spent At'), sortable: true, tdClass: 'gl-w-quarter' },
{ key: 'user', label: __('User'), sortable: true },
- { key: 'timeSpent', label: __('Time Spent'), sortable: true },
+ { key: 'timeSpent', label: __('Time Spent'), sortable: true, tdClass: 'gl-w-15' },
{ key: 'summary', label: __('Summary / Note'), sortable: true },
],
};
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
index fdbcef22bba..057bb9f0100 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/time_tracker.vue
@@ -204,7 +204,7 @@ export default {
:time-estimate-human-readable="humanTimeEstimate"
/>
<div
- class="hide-collapsed gl-line-height-20 gl-text-gray-900 gl-display-flex gl-align-items-center"
+ class="hide-collapsed gl-line-height-20 gl-text-gray-900 gl-display-flex gl-align-items-center gl-font-weight-bold gl-mr-3"
>
{{ __('Time tracking') }}
<gl-loading-icon v-if="isTimeTrackingInfoLoading" size="sm" class="gl-ml-2" inline />
@@ -221,8 +221,7 @@ export default {
</div>
<div v-if="!isTimeTrackingInfoLoading" class="hide-collapsed">
<div v-if="showEstimateOnlyState" data-testid="estimateOnlyPane">
- <span class="gl-font-weight-bold">{{ $options.i18n.estimatedOnlyText }} </span
- >{{ humanTimeEstimate }}
+ <span>{{ $options.i18n.estimatedOnlyText }} </span>{{ humanTimeEstimate }}
</div>
<time-tracking-spent-only-pane
v-if="showSpentOnlyState"
@@ -250,6 +249,7 @@ export default {
</gl-link>
<gl-modal
modal-id="time-tracking-report"
+ size="lg"
:title="__('Time tracking report')"
:hide-footer="true"
>
diff --git a/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue
index eabba619af5..482b9343e70 100644
--- a/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue
+++ b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue
@@ -6,6 +6,9 @@ import { __, sprintf } from '~/locale';
import { todoQueries, TodoMutationTypes, todoMutations } from '~/sidebar/constants';
import { todoLabel } from '~/vue_shared/components/sidebar/todo_toggle//utils';
import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
+import Tracking from '~/tracking';
+
+const trackingMixin = Tracking.mixin();
export default {
components: {
@@ -16,6 +19,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
+ mixins: [trackingMixin],
inject: {
isClassicSidebar: {
default: false,
@@ -151,6 +155,10 @@ export default {
message: errors[0],
});
}
+ this.track('click_todo', {
+ label: 'right_sidebar',
+ property: this.hasTodo,
+ });
},
)
.catch(() => {
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 2a7d967cb61..351bb50d941 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -218,7 +218,7 @@ function mountCrmContactsComponent() {
if (!el) return;
- const { issueId } = el.dataset;
+ const { issueId, groupIssuesPath } = el.dataset;
// eslint-disable-next-line no-new
new Vue({
el,
@@ -231,6 +231,7 @@ function mountCrmContactsComponent() {
createElement('crm-contacts', {
props: {
issueId,
+ groupIssuesPath,
},
}),
});
@@ -430,10 +431,7 @@ function mountLockComponent(store) {
return;
}
- const { fullPath } = getSidebarOptions();
-
- const dataNode = document.getElementById('js-lock-issue-data');
- const initialData = JSON.parse(dataNode.innerHTML);
+ const { fullPath, editable } = getSidebarOptions();
// eslint-disable-next-line no-new
new Vue({
@@ -446,7 +444,7 @@ function mountLockComponent(store) {
render: (createElement) =>
createElement(IssuableLockForm, {
props: {
- isEditable: initialData.is_editable,
+ isEditable: editable,
},
}),
});
diff --git a/app/assets/javascripts/sidebar/queries/remove_attention_request.mutation.graphql b/app/assets/javascripts/sidebar/queries/remove_attention_request.mutation.graphql
new file mode 100644
index 00000000000..d9b9c04fd63
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/remove_attention_request.mutation.graphql
@@ -0,0 +1,7 @@
+mutation mergeRequestRemoveAttentionRequest($projectPath: ID!, $iid: String!, $userId: UserID!) {
+ mergeRequestRemoveAttentionRequest(
+ input: { projectPath: $projectPath, iid: $iid, userId: $userId }
+ ) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/request_attention.mutation.graphql b/app/assets/javascripts/sidebar/queries/request_attention.mutation.graphql
new file mode 100644
index 00000000000..99a86e4fe5c
--- /dev/null
+++ b/app/assets/javascripts/sidebar/queries/request_attention.mutation.graphql
@@ -0,0 +1,5 @@
+mutation mergeRequestRequestAttention($projectPath: ID!, $iid: String!, $userId: UserID!) {
+ mergeRequestRequestAttention(input: { projectPath: $projectPath, iid: $iid, userId: $userId }) {
+ errors
+ }
+}
diff --git a/app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql b/app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql
index 73765e7d77b..0d66ee0d6e5 100644
--- a/app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql
+++ b/app/assets/javascripts/sidebar/queries/reviewer_rereview.mutation.graphql
@@ -1,4 +1,4 @@
-mutation mergeRequestRequestRereview($projectPath: ID!, $iid: String!, $userId: ID!) {
+mutation mergeRequestRequestRereview($projectPath: ID!, $iid: String!, $userId: UserID!) {
mergeRequestReviewerRereview(input: { projectPath: $projectPath, iid: $iid, userId: $userId }) {
errors
}
diff --git a/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql b/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql
deleted file mode 100644
index a9f4af6e1b9..00000000000
--- a/app/assets/javascripts/sidebar/queries/toggle_attention_requested.mutation.graphql
+++ /dev/null
@@ -1,7 +0,0 @@
-mutation mergeRequestToggleAttentionRequested($projectPath: ID!, $iid: String!, $userId: ID!) {
- mergeRequestToggleAttentionRequested(
- input: { projectPath: $projectPath, iid: $iid, userId: $userId }
- ) {
- errors
- }
-}
diff --git a/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql b/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql
index 368f06fac7f..938953ccfb2 100644
--- a/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql
+++ b/app/assets/javascripts/sidebar/queries/update_merge_request_milestone.mutation.graphql
@@ -1,4 +1,4 @@
-mutation mergeRequestSetMilestone($fullPath: ID!, $iid: String!, $attributeId: ID) {
+mutation mergeRequestSetMilestone($fullPath: ID!, $iid: String!, $attributeId: MilestoneID) {
issuableSetAttribute: mergeRequestSetMilestone(
input: { projectPath: $fullPath, iid: $iid, milestoneId: $attributeId }
) {
diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js
index 90d8f2098bb..ea170203576 100644
--- a/app/assets/javascripts/sidebar/services/sidebar_service.js
+++ b/app/assets/javascripts/sidebar/services/sidebar_service.js
@@ -5,7 +5,8 @@ import createGqClient, { fetchPolicies } from '~/lib/graphql';
import axios from '~/lib/utils/axios_utils';
import reviewerRereviewMutation from '../queries/reviewer_rereview.mutation.graphql';
import sidebarDetailsMRQuery from '../queries/sidebar_details_mr.query.graphql';
-import toggleAttentionRequestedMutation from '../queries/toggle_attention_requested.mutation.graphql';
+import requestAttentionMutation from '../queries/request_attention.mutation.graphql';
+import removeAttentionRequestMutation from '../queries/remove_attention_request.mutation.graphql';
const queries = {
merge_request: sidebarDetailsMRQuery,
@@ -92,9 +93,19 @@ export default class SidebarService {
});
}
- toggleAttentionRequested(userId) {
+ requestAttention(userId) {
return gqClient.mutate({
- mutation: toggleAttentionRequestedMutation,
+ mutation: requestAttentionMutation,
+ variables: {
+ userId: convertToGraphQLId(TYPE_USER, `${userId}`),
+ projectPath: this.fullPath,
+ iid: this.iid.toString(),
+ },
+ });
+ }
+ removeAttentionRequest(userId) {
+ return gqClient.mutate({
+ mutation: removeAttentionRequestMutation,
variables: {
userId: convertToGraphQLId(TYPE_USER, `${userId}`),
projectPath: this.fullPath,
diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js
index 83fb8f31dfb..7df901577b8 100644
--- a/app/assets/javascripts/sidebar/sidebar_mediator.js
+++ b/app/assets/javascripts/sidebar/sidebar_mediator.js
@@ -40,6 +40,7 @@ export default class SidebarMediator {
const data = { assignee_ids: assignees };
try {
+ const { currentUserHasAttention } = this.store;
const res = await this.service.update(field, data);
this.store.overwrite('assignees', res.data.assignees);
@@ -48,6 +49,10 @@ export default class SidebarMediator {
this.store.overwrite('reviewers', res.data.reviewers);
}
+ if (currentUserHasAttention && this.store.isAddingAssignee) {
+ toast(__('Assigned user(s). Your attention request was removed.'));
+ }
+
return Promise.resolve(res);
} catch (e) {
return Promise.reject(e);
@@ -63,11 +68,16 @@ export default class SidebarMediator {
const data = { reviewer_ids: reviewers };
try {
+ const { currentUserHasAttention } = this.store;
const res = await this.service.update(field, data);
this.store.overwrite('reviewers', res.data.reviewers);
this.store.overwrite('assignees', res.data.assignees);
+ if (currentUserHasAttention && this.store.isAddingAssignee) {
+ toast(__('Requested review. Your attention request was removed.'));
+ }
+
return Promise.resolve(res);
} catch (e) {
return Promise.reject();
@@ -98,14 +108,19 @@ export default class SidebarMediator {
}
}
- async toggleAttentionRequested(type, { user, callback }) {
+ async toggleAttentionRequested(type, { user, callback, direction }) {
+ const mutations = {
+ add: (id) => this.service.requestAttention(id),
+ remove: (id) => this.service.removeAttentionRequest(id),
+ };
+
try {
const isReviewer = type === 'reviewer';
const reviewerOrAssignee = isReviewer
? this.store.findReviewer(user)
: this.store.findAssignee(user);
- await this.service.toggleAttentionRequested(user.id);
+ await mutations[direction]?.(user.id);
if (reviewerOrAssignee.attention_requested) {
toast(
@@ -115,12 +130,22 @@ export default class SidebarMediator {
);
} else {
const currentUserId = gon.current_user_id;
+ const { currentUserHasAttention } = this.store;
if (currentUserId !== user.id) {
this.removeCurrentUserAttentionRequested();
}
- toast(sprintf(__('Requested attention from @%{username}'), { username: user.username }));
+ toast(
+ currentUserHasAttention && currentUserId !== user.id
+ ? sprintf(
+ __(
+ 'Requested attention from @%{username}. Your own attention request was removed.',
+ ),
+ { username: user.username },
+ )
+ : sprintf(__('Requested attention from @%{username}'), { username: user.username }),
+ );
}
this.store.updateReviewer(user.id, 'attention_requested');
@@ -138,7 +163,7 @@ export default class SidebarMediator {
captureError: true,
actionConfig: {
title: __('Try again'),
- clickHandler: () => this.toggleAttentionRequired(type, { user, callback }),
+ clickHandler: () => this.toggleAttentionRequired(type, { user, callback, direction }),
},
});
}
diff --git a/app/assets/javascripts/sidebar/stores/sidebar_store.js b/app/assets/javascripts/sidebar/stores/sidebar_store.js
index 2caa6f4f0a0..ca85ee7fd94 100644
--- a/app/assets/javascripts/sidebar/stores/sidebar_store.js
+++ b/app/assets/javascripts/sidebar/stores/sidebar_store.js
@@ -18,7 +18,9 @@ export default class SidebarStore {
this.humanTimeSpent = '';
this.timeTrackingLimitToHours = timeTrackingLimitToHours;
this.assignees = [];
+ this.addingAssignees = [];
this.reviewers = [];
+ this.addingReviewers = [];
this.isFetching = {
assignees: true,
reviewers: true,
@@ -32,6 +34,7 @@ export default class SidebarStore {
this.subscribeDisabledDescription = '';
this.subscribed = null;
this.changing = false;
+ this.issuableType = options.issuableType;
SidebarStore.singleton = this;
}
@@ -73,12 +76,20 @@ export default class SidebarStore {
if (!this.findAssignee(assignee)) {
this.changing = true;
this.assignees.push(assignee);
+
+ if (assignee.id !== this.currentUser.id) {
+ this.addingAssignees.push(assignee.id);
+ }
}
}
addReviewer(reviewer) {
if (!this.findReviewer(reviewer)) {
this.reviewers.push(reviewer);
+
+ if (reviewer.id !== this.currentUser.id) {
+ this.addingReviewers.push(reviewer.id);
+ }
}
}
@@ -114,12 +125,14 @@ export default class SidebarStore {
if (assignee) {
this.changing = true;
this.assignees = this.assignees.filter(({ id }) => id !== assignee.id);
+ this.addingAssignees = this.addingAssignees.filter(({ id }) => id !== assignee.id);
}
}
removeReviewer(reviewer) {
if (reviewer) {
this.reviewers = this.reviewers.filter(({ id }) => id !== reviewer.id);
+ this.addingReviewers = this.addingReviewers.filter(({ id }) => id !== reviewer.id);
}
}
@@ -147,4 +160,26 @@ export default class SidebarStore {
setMoveToProjectId(moveToProjectId) {
this.moveToProjectId = moveToProjectId;
}
+
+ get currentUserHasAttention() {
+ if (!window.gon?.features?.mrAttentionRequests || !this.isMergeRequest) return false;
+
+ const currentUserId = this.currentUser.id;
+ const currentUserReviewer = this.findReviewer({ id: currentUserId });
+ const currentUserAssignee = this.findAssignee({ id: currentUserId });
+
+ return currentUserReviewer?.attention_requested || currentUserAssignee?.attention_requested;
+ }
+
+ get isAddingAssignee() {
+ return this.addingAssignees.length > 0;
+ }
+
+ get isAddingReviewer() {
+ return this.addingReviewers.length > 0;
+ }
+
+ get isMergeRequest() {
+ return this.issuableType === 'merge_request';
+ }
}
diff --git a/app/assets/javascripts/snippets/components/edit.vue b/app/assets/javascripts/snippets/components/edit.vue
index e4a97f08c8d..2537ec78850 100644
--- a/app/assets/javascripts/snippets/components/edit.vue
+++ b/app/assets/javascripts/snippets/components/edit.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlLoadingIcon } from '@gitlab/ui';
+import { GlButton, GlLoadingIcon, GlFormInput, GlFormGroup } from '@gitlab/ui';
import eventHub from '~/blob/components/eventhub';
import createFlash from '~/flash';
@@ -11,7 +11,6 @@ import {
} from '~/performance/constants';
import { performanceMarkAndMeasure } from '~/performance/utils';
import FormFooterActions from '~/vue_shared/components/form/form_footer_actions.vue';
-import TitleField from '~/vue_shared/components/form/title.vue';
import { SNIPPET_CREATE_MUTATION_ERROR, SNIPPET_UPDATE_MUTATION_ERROR } from '../constants';
import { getSnippetMixin } from '../mixins/snippets';
@@ -31,10 +30,11 @@ export default {
SnippetDescriptionEdit,
SnippetVisibilityEdit,
SnippetBlobActionsEdit,
- TitleField,
FormFooterActions,
GlButton,
GlLoadingIcon,
+ GlFormInput,
+ GlFormGroup,
},
mixins: [getSnippetMixin],
inject: ['selectedLevel'],
@@ -67,6 +67,7 @@ export default {
description: '',
visibilityLevel: this.selectedLevel,
},
+ showValidation: false,
};
},
computed: {
@@ -85,8 +86,11 @@ export default {
hasValidBlobs() {
return this.actions.every((x) => x.content);
},
- updatePrevented() {
- return this.snippet.title === '' || !this.hasValidBlobs || this.isUpdating;
+ isTitleValid() {
+ return this.snippet.title !== '';
+ },
+ isFormValid() {
+ return this.isTitleValid && this.hasValidBlobs;
},
isProjectSnippet() {
return Boolean(this.projectPath);
@@ -112,6 +116,12 @@ export default {
}
return this.snippet.webUrl;
},
+ shouldShowBlobsErrors() {
+ return this.showValidation && !this.hasValidBlobs;
+ },
+ shouldShowTitleErrors() {
+ return this.showValidation && !this.isTitleValid;
+ },
},
beforeCreate() {
performanceMarkAndMeasure({ mark: SNIPPET_MARK_EDIT_APP_START });
@@ -165,6 +175,12 @@ export default {
};
},
handleFormSubmit() {
+ this.showValidation = true;
+
+ if (!this.isFormValid) {
+ return;
+ }
+
this.isUpdating = true;
this.$apollo
@@ -206,19 +222,31 @@ export default {
class="loading-animation prepend-top-20 gl-mb-6"
/>
<template v-else>
- <title-field
- id="snippet-title"
- v-model="snippet.title"
- data-qa-selector="snippet_title_field"
- required
- :autofocus="true"
- />
+ <gl-form-group
+ :label="__('Title')"
+ label-for="snippet-title"
+ :invalid-feedback="__('This field is required.')"
+ :state="!shouldShowTitleErrors"
+ >
+ <gl-form-input
+ id="snippet-title"
+ v-model="snippet.title"
+ data-testid="snippet-title-input"
+ data-qa-selector="snippet_title_field"
+ :autofocus="true"
+ />
+ </gl-form-group>
+
<snippet-description-edit
v-model="snippet.description"
:markdown-preview-path="markdownPreviewPath"
:markdown-docs-path="markdownDocsPath"
/>
- <snippet-blob-actions-edit :init-blobs="blobs" @actions="updateActions" />
+ <snippet-blob-actions-edit
+ :init-blobs="blobs"
+ :is-valid="!shouldShowBlobsErrors"
+ @actions="updateActions"
+ />
<snippet-visibility-edit
v-model="snippet.visibilityLevel"
@@ -228,12 +256,13 @@ export default {
<form-footer-actions>
<template #prepend>
<gl-button
+ class="js-no-auto-disable"
category="primary"
type="submit"
variant="confirm"
- :disabled="updatePrevented"
data-qa-selector="submit_button"
data-testid="snippet-submit-btn"
+ :disabled="isUpdating"
>{{ saveButtonLabel }}</gl-button
>
</template>
diff --git a/app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue b/app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue
index d221195ddc7..260ee496df0 100644
--- a/app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue
+++ b/app/assets/javascripts/snippets/components/snippet_blob_actions_edit.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton } from '@gitlab/ui';
+import { GlButton, GlFormGroup } from '@gitlab/ui';
import { cloneDeep } from 'lodash';
import { s__, sprintf } from '~/locale';
import { SNIPPET_MAX_BLOBS } from '../constants';
@@ -10,12 +10,18 @@ export default {
components: {
SnippetBlobEdit,
GlButton,
+ GlFormGroup,
},
props: {
initBlobs: {
type: Array,
required: true,
},
+ isValid: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
data() {
return {
@@ -124,16 +130,26 @@ export default {
</script>
<template>
<div class="form-group">
- <label :for="firstInputId">{{ s__('Snippets|Files') }}</label>
- <snippet-blob-edit
- v-for="(blobId, index) in blobIds"
- :key="blobId"
- :class="{ 'gl-mt-3': index > 0 }"
- :blob="blobs[blobId]"
- :can-delete="canDelete"
- @blob-updated="updateBlob(blobId, $event)"
- @delete="deleteBlob(blobId)"
- />
+ <gl-form-group
+ :label="s__('Snippets|Files')"
+ :label-for="firstInputId"
+ :invalid-feedback="
+ s__(
+ 'Snippets|Snippets can\'t contain empty files. Ensure all files have content, or delete them.',
+ )
+ "
+ :state="isValid"
+ >
+ <snippet-blob-edit
+ v-for="(blobId, index) in blobIds"
+ :key="blobId"
+ :class="{ 'gl-mt-3': index > 0 }"
+ :blob="blobs[blobId]"
+ :can-delete="canDelete"
+ @blob-updated="updateBlob(blobId, $event)"
+ @delete="deleteBlob(blobId)"
+ />
+ </gl-form-group>
<gl-button
:disabled="!canAdd"
data-testid="add_button"
diff --git a/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql b/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql
index f43d53661f4..a13c143f775 100644
--- a/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql
+++ b/app/assets/javascripts/snippets/mutations/delete_snippet.mutation.graphql
@@ -1,4 +1,4 @@
-mutation DeleteSnippet($id: ID!) {
+mutation DeleteSnippet($id: SnippetID!) {
destroySnippet(input: { id: $id }) {
errors
}
diff --git a/app/assets/javascripts/sortable/constants.js b/app/assets/javascripts/sortable/constants.js
index 7fddac00ab2..f5bb0a3b11f 100644
--- a/app/assets/javascripts/sortable/constants.js
+++ b/app/assets/javascripts/sortable/constants.js
@@ -1,3 +1,5 @@
+export const DRAG_CLASS = 'is-dragging';
+
/**
* Default config options for sortablejs.
* @type {object}
@@ -12,7 +14,7 @@
export const defaultSortableOptions = {
animation: 200,
forceFallback: true,
- fallbackClass: 'is-dragging',
+ fallbackClass: DRAG_CLASS,
fallbackOnBody: true,
ghostClass: 'is-ghost',
fallbackTolerance: 1,
diff --git a/app/assets/javascripts/sortable/utils.js b/app/assets/javascripts/sortable/utils.js
index c2c8fb03b58..88ac1295a39 100644
--- a/app/assets/javascripts/sortable/utils.js
+++ b/app/assets/javascripts/sortable/utils.js
@@ -1,13 +1,17 @@
/* global DocumentTouch */
-import { defaultSortableOptions } from './constants';
+import { defaultSortableOptions, DRAG_CLASS } from './constants';
export function sortableStart() {
- document.body.classList.add('is-dragging');
+ document.body.classList.add(DRAG_CLASS);
}
export function sortableEnd() {
- document.body.classList.remove('is-dragging');
+ document.body.classList.remove(DRAG_CLASS);
+}
+
+export function isDragging() {
+ return document.body.classList.contains(DRAG_CLASS);
}
export function getSortableDefaultOptions(options) {
diff --git a/app/assets/javascripts/static_site_editor/components/edit_area.vue b/app/assets/javascripts/static_site_editor/components/edit_area.vue
index ea775eff358..2f2efe290ec 100644
--- a/app/assets/javascripts/static_site_editor/components/edit_area.vue
+++ b/app/assets/javascripts/static_site_editor/components/edit_area.vue
@@ -167,7 +167,9 @@ export default {
:content="editableContent"
:initial-edit-type="editorMode"
:image-root="imageRoot"
- :options="{ customRenderers }"
+ :options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ customRenderers,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
class="mb-9 pb-6 h-100"
@modeChange="onModeChange"
@input="onInputChange"
diff --git a/app/assets/javascripts/tracking/dispatch_snowplow_event.js b/app/assets/javascripts/tracking/dispatch_snowplow_event.js
index 7e596f5f36f..5daeaf1d85b 100644
--- a/app/assets/javascripts/tracking/dispatch_snowplow_event.js
+++ b/app/assets/javascripts/tracking/dispatch_snowplow_event.js
@@ -1,3 +1,4 @@
+import * as Sentry from '@sentry/browser';
import getStandardContext from './get_standard_context';
export function dispatchSnowplowEvent(
@@ -24,5 +25,11 @@ export function dispatchSnowplowEvent(
value = Number(value);
}
- return window.snowplow('trackStructEvent', category, action, label, property, value, contexts);
+ try {
+ window.snowplow('trackStructEvent', category, action, label, property, value, contexts);
+ return true;
+ } catch (error) {
+ Sentry.captureException(error);
+ return false;
+ }
}
diff --git a/app/assets/javascripts/tracking/tracker.js b/app/assets/javascripts/tracking/tracker.js
new file mode 100644
index 00000000000..9ad86e76b6e
--- /dev/null
+++ b/app/assets/javascripts/tracking/tracker.js
@@ -0,0 +1,267 @@
+import { LOAD_ACTION_ATTR_SELECTOR } from './constants';
+import { dispatchSnowplowEvent } from './dispatch_snowplow_event';
+import getStandardContext from './get_standard_context';
+import {
+ getEventHandlers,
+ createEventPayload,
+ renameKey,
+ getReferrersCache,
+ addReferrersCacheEntry,
+} from './utils';
+
+export const Tracker = {
+ nonInitializedQueue: [],
+ initialized: false,
+ definitionsLoaded: false,
+ definitionsManifest: {},
+ definitionsEventsQueue: [],
+ definitions: [],
+ ALLOWED_URL_HASHES: ['#diff', '#note'],
+ /**
+ * (Legacy) Determines if tracking is enabled at the user level.
+ * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/DNT.
+ *
+ * @returns {Boolean}
+ */
+ trackable() {
+ return !['1', 'yes'].includes(
+ window.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack,
+ );
+ },
+
+ /**
+ * Determines if Snowplow is available/enabled.
+ *
+ * @returns {Boolean}
+ */
+ enabled() {
+ return typeof window.snowplow === 'function' && Tracker.trackable();
+ },
+
+ /**
+ * Dispatches a structured event per our taxonomy:
+ * https://docs.gitlab.com/ee/development/snowplow/index.html#structured-event-taxonomy.
+ *
+ * If the library is not initialized and events are trying to be
+ * dispatched (data-attributes, load-events), they will be added
+ * to a queue to be flushed afterwards.
+ *
+ * If there is an error when using the library, it will return ´false´
+ * and ´true´ otherwise.
+ *
+ * @param {...any} eventData defined event taxonomy
+ * @returns {Boolean}
+ */
+ event(...eventData) {
+ if (!Tracker.enabled()) {
+ return false;
+ }
+
+ if (!Tracker.initialized) {
+ Tracker.nonInitializedQueue.push(eventData);
+ return false;
+ }
+
+ return dispatchSnowplowEvent(...eventData);
+ },
+
+ /**
+ * Preloads event definitions.
+ *
+ * @returns {undefined}
+ */
+ loadDefinitions() {
+ // TODO: fetch definitions from the server and flush the queue
+ // See https://gitlab.com/gitlab-org/gitlab/-/issues/358256
+ Tracker.definitionsLoaded = true;
+
+ while (Tracker.definitionsEventsQueue.length) {
+ Tracker.dispatchFromDefinition(...Tracker.definitionsEventsQueue.shift());
+ }
+ },
+
+ /**
+ * Dispatches a structured event with data from its event definition.
+ *
+ * @param {String} basename
+ * @param {Object} eventData
+ * @returns {Boolean}
+ */
+ definition(basename, eventData = {}) {
+ if (!Tracker.enabled()) {
+ return false;
+ }
+
+ if (!(basename in Tracker.definitionsManifest)) {
+ throw new Error(`Missing Snowplow event definition "${basename}"`);
+ }
+
+ return Tracker.dispatchFromDefinition(basename, eventData);
+ },
+
+ /**
+ * Builds an event with data from a valid definition and sends it to
+ * Snowplow. If the definitions are not loaded, it pushes the data to a queue.
+ *
+ * @param {String} basename
+ * @param {Object} eventData
+ * @returns {Boolean}
+ */
+ dispatchFromDefinition(basename, eventData) {
+ if (!Tracker.definitionsLoaded) {
+ Tracker.definitionsEventsQueue.push([basename, eventData]);
+
+ return false;
+ }
+
+ const eventDefinition = Tracker.definitions.find((definition) => definition.key === basename);
+
+ return Tracker.event(
+ eventData.category ?? eventDefinition.category,
+ eventData.action ?? eventDefinition.action,
+ eventData,
+ );
+ },
+
+ /**
+ * Dispatches any event emitted before initialization.
+ *
+ * @returns {undefined}
+ */
+ flushPendingEvents() {
+ Tracker.initialized = true;
+
+ while (Tracker.nonInitializedQueue.length) {
+ dispatchSnowplowEvent(...Tracker.nonInitializedQueue.shift());
+ }
+ },
+
+ /**
+ * Attaches event handlers for data-attributes powered events.
+ *
+ * @param {String} category - the default category for all events
+ * @param {HTMLElement} parent - element containing data-attributes
+ * @returns {Array}
+ */
+ bindDocument(category = document.body.dataset.page, parent = document) {
+ if (!Tracker.enabled() || parent.trackingBound) {
+ return [];
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ parent.trackingBound = true;
+
+ const handlers = getEventHandlers(category, (...args) => Tracker.event(...args));
+ handlers.forEach((event) => parent.addEventListener(event.name, event.func));
+
+ return handlers;
+ },
+
+ /**
+ * Attaches event handlers for load-events (on render).
+ *
+ * @param {String} category - the default category for all events
+ * @param {HTMLElement} parent - element containing event targets
+ * @returns {Array}
+ */
+ trackLoadEvents(category = document.body.dataset.page, parent = document) {
+ if (!Tracker.enabled()) {
+ return [];
+ }
+
+ const loadEvents = parent.querySelectorAll(LOAD_ACTION_ATTR_SELECTOR);
+
+ loadEvents.forEach((element) => {
+ const { action, data } = createEventPayload(element);
+ Tracker.event(category, action, data);
+ });
+
+ return loadEvents;
+ },
+
+ /**
+ * Enable Snowplow automatic form tracking.
+ * The config param requires at least one array of either forms
+ * class names, or field name attributes.
+ * https://docs.gitlab.com/ee/development/snowplow/index.html#form-tracking.
+ *
+ * @param {Object} config
+ * @param {Array} contexts
+ * @returns {undefined}
+ */
+ enableFormTracking(config, contexts = []) {
+ if (!Tracker.enabled()) {
+ return;
+ }
+
+ if (!Array.isArray(config?.forms?.allow) && !Array.isArray(config?.fields?.allow)) {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ throw new Error('Unable to enable form event tracking without allow rules.');
+ }
+
+ // Ignore default/standard schema
+ const standardContext = getStandardContext();
+ const userProvidedContexts = contexts.filter(
+ (context) => context.schema !== standardContext.schema,
+ );
+
+ const mappedConfig = {};
+ if (config.forms) {
+ mappedConfig.forms = renameKey(config.forms, 'allow', 'whitelist');
+ }
+
+ if (config.fields) {
+ mappedConfig.fields = renameKey(config.fields, 'allow', 'whitelist');
+ }
+
+ const enabler = () => window.snowplow('enableFormTracking', mappedConfig, userProvidedContexts);
+
+ if (document.readyState === 'complete') {
+ enabler();
+ } else {
+ document.addEventListener('readystatechange', () => {
+ if (document.readyState === 'complete') {
+ enabler();
+ }
+ });
+ }
+ },
+
+ /**
+ * Replaces the URL and referrer for the default web context
+ * if the replacements are available.
+ *
+ * @returns {undefined}
+ */
+ setAnonymousUrls() {
+ const { snowplowPseudonymizedPageUrl: pageUrl } = window.gl;
+
+ if (!pageUrl) {
+ return;
+ }
+
+ const referrers = getReferrersCache();
+ const pageLinks = Object.seal({
+ url: pageUrl,
+ referrer: '',
+ originalUrl: window.location.href,
+ });
+
+ const appendHash = Tracker.ALLOWED_URL_HASHES.some((prefix) =>
+ window.location.hash.startsWith(prefix),
+ );
+ const customUrl = `${pageUrl}${appendHash ? window.location.hash : ''}`;
+ window.snowplow('setCustomUrl', customUrl);
+
+ if (document.referrer) {
+ const node = referrers.find((links) => links.originalUrl === document.referrer);
+
+ if (node) {
+ pageLinks.referrer = node.url;
+ window.snowplow('setReferrerUrl', pageLinks.referrer);
+ }
+ }
+
+ addReferrersCacheEntry(referrers, pageLinks);
+ },
+};
diff --git a/app/assets/javascripts/tracking/tracking.js b/app/assets/javascripts/tracking/tracking.js
index f299c57b33f..923aea433f1 100644
--- a/app/assets/javascripts/tracking/tracking.js
+++ b/app/assets/javascripts/tracking/tracking.js
@@ -1,268 +1,7 @@
-import { LOAD_ACTION_ATTR_SELECTOR } from './constants';
-import { dispatchSnowplowEvent } from './dispatch_snowplow_event';
-import getStandardContext from './get_standard_context';
-import {
- getEventHandlers,
- createEventPayload,
- renameKey,
- addExperimentContext,
- getReferrersCache,
- addReferrersCacheEntry,
-} from './utils';
-
-const ALLOWED_URL_HASHES = ['#diff', '#note'];
-
-export default class Tracking {
- static nonInitializedQueue = [];
- static initialized = false;
- static definitionsLoaded = false;
- static definitionsManifest = {};
- static definitionsEventsQueue = [];
- static definitions = [];
-
- /**
- * (Legacy) Determines if tracking is enabled at the user level.
- * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/DNT.
- *
- * @returns {Boolean}
- */
- static trackable() {
- return !['1', 'yes'].includes(
- window.doNotTrack || navigator.doNotTrack || navigator.msDoNotTrack,
- );
- }
-
- /**
- * Determines if Snowplow is available/enabled.
- *
- * @returns {Boolean}
- */
- static enabled() {
- return typeof window.snowplow === 'function' && this.trackable();
- }
-
- /**
- * Dispatches a structured event per our taxonomy:
- * https://docs.gitlab.com/ee/development/snowplow/index.html#structured-event-taxonomy.
- *
- * If the library is not initialized and events are trying to be
- * dispatched (data-attributes, load-events), they will be added
- * to a queue to be flushed afterwards.
- *
- * @param {...any} eventData defined event taxonomy
- * @returns {undefined|Boolean}
- */
- static event(...eventData) {
- if (!this.enabled()) {
- return false;
- }
-
- if (!this.initialized) {
- this.nonInitializedQueue.push(eventData);
- return false;
- }
-
- return dispatchSnowplowEvent(...eventData);
- }
-
- /**
- * Preloads event definitions.
- *
- * @returns {undefined}
- */
- static loadDefinitions() {
- // TODO: fetch definitions from the server and flush the queue
- // See https://gitlab.com/gitlab-org/gitlab/-/issues/358256
- this.definitionsLoaded = true;
-
- while (this.definitionsEventsQueue.length) {
- this.dispatchFromDefinition(...this.definitionsEventsQueue.shift());
- }
- }
-
- /**
- * Dispatches a structured event with data from its event definition.
- *
- * @param {String} basename
- * @param {Object} eventData
- * @returns {undefined|Boolean}
- */
- static definition(basename, eventData = {}) {
- if (!this.enabled()) {
- return false;
- }
-
- if (!(basename in this.definitionsManifest)) {
- throw new Error(`Missing Snowplow event definition "${basename}"`);
- }
-
- return this.dispatchFromDefinition(basename, eventData);
- }
-
- /**
- * Builds an event with data from a valid definition and sends it to
- * Snowplow. If the definitions are not loaded, it pushes the data to a queue.
- *
- * @param {String} basename
- * @param {Object} eventData
- * @returns {undefined|Boolean}
- */
- static dispatchFromDefinition(basename, eventData) {
- if (!this.definitionsLoaded) {
- this.definitionsEventsQueue.push([basename, eventData]);
-
- return false;
- }
-
- const eventDefinition = this.definitions.find((definition) => definition.key === basename);
-
- return this.event(
- eventData.category ?? eventDefinition.category,
- eventData.action ?? eventDefinition.action,
- eventData,
- );
- }
-
- /**
- * Dispatches any event emitted before initialization.
- *
- * @returns {undefined}
- */
- static flushPendingEvents() {
- this.initialized = true;
-
- while (this.nonInitializedQueue.length) {
- dispatchSnowplowEvent(...this.nonInitializedQueue.shift());
- }
- }
-
- /**
- * Attaches event handlers for data-attributes powered events.
- *
- * @param {String} category - the default category for all events
- * @param {HTMLElement} parent - element containing data-attributes
- * @returns {Array}
- */
- static bindDocument(category = document.body.dataset.page, parent = document) {
- if (!this.enabled() || parent.trackingBound) {
- return [];
- }
-
- // eslint-disable-next-line no-param-reassign
- parent.trackingBound = true;
-
- const handlers = getEventHandlers(category, (...args) => this.event(...args));
- handlers.forEach((event) => parent.addEventListener(event.name, event.func));
-
- return handlers;
- }
-
- /**
- * Attaches event handlers for load-events (on render).
- *
- * @param {String} category - the default category for all events
- * @param {HTMLElement} parent - element containing event targets
- * @returns {Array}
- */
- static trackLoadEvents(category = document.body.dataset.page, parent = document) {
- if (!this.enabled()) {
- return [];
- }
-
- const loadEvents = parent.querySelectorAll(LOAD_ACTION_ATTR_SELECTOR);
-
- loadEvents.forEach((element) => {
- const { action, data } = createEventPayload(element);
- this.event(category, action, data);
- });
-
- return loadEvents;
- }
-
- /**
- * Enable Snowplow automatic form tracking.
- * The config param requires at least one array of either forms
- * class names, or field name attributes.
- * https://docs.gitlab.com/ee/development/snowplow/index.html#form-tracking.
- *
- * @param {Object} config
- * @param {Array} contexts
- * @returns {undefined}
- */
- static enableFormTracking(config, contexts = []) {
- if (!this.enabled()) {
- return;
- }
-
- if (!Array.isArray(config?.forms?.allow) && !Array.isArray(config?.fields?.allow)) {
- // eslint-disable-next-line @gitlab/require-i18n-strings
- throw new Error('Unable to enable form event tracking without allow rules.');
- }
-
- // Ignore default/standard schema
- const standardContext = getStandardContext();
- const userProvidedContexts = contexts.filter(
- (context) => context.schema !== standardContext.schema,
- );
-
- const mappedConfig = {};
- if (config.forms) {
- mappedConfig.forms = renameKey(config.forms, 'allow', 'whitelist');
- }
-
- if (config.fields) {
- mappedConfig.fields = renameKey(config.fields, 'allow', 'whitelist');
- }
-
- const enabler = () => window.snowplow('enableFormTracking', mappedConfig, userProvidedContexts);
-
- if (document.readyState === 'complete') {
- enabler();
- } else {
- document.addEventListener('readystatechange', () => {
- if (document.readyState === 'complete') {
- enabler();
- }
- });
- }
- }
-
- /**
- * Replaces the URL and referrer for the default web context
- * if the replacements are available.
- *
- * @returns {undefined}
- */
- static setAnonymousUrls() {
- const { snowplowPseudonymizedPageUrl: pageUrl } = window.gl;
-
- if (!pageUrl) {
- return;
- }
-
- const referrers = getReferrersCache();
- const pageLinks = Object.seal({
- url: pageUrl,
- referrer: '',
- originalUrl: window.location.href,
- });
-
- const appendHash = ALLOWED_URL_HASHES.some((prefix) => window.location.hash.startsWith(prefix));
- const customUrl = `${pageUrl}${appendHash ? window.location.hash : ''}`;
- window.snowplow('setCustomUrl', customUrl);
-
- if (document.referrer) {
- const node = referrers.find((links) => links.originalUrl === document.referrer);
-
- if (node) {
- pageLinks.referrer = node.url;
- window.snowplow('setReferrerUrl', pageLinks.referrer);
- }
- }
-
- addReferrersCacheEntry(referrers, pageLinks);
- }
+import { Tracker } from 'jh_else_ce/tracking/tracker';
+import { addExperimentContext } from './utils';
+const Tracking = Object.assign(Tracker, {
/**
* Returns an implementation of this class in the form of
* a Vue mixin.
@@ -270,7 +9,7 @@ export default class Tracking {
* @param {Object} opts - default options for all events
* @returns {Object}
*/
- static mixin(opts = {}) {
+ mixin(opts = {}) {
return {
computed: {
trackingCategory() {
@@ -294,5 +33,7 @@ export default class Tracking {
},
},
};
- }
-}
+ },
+});
+
+export default Tracking;
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index 4544373d8aa..438ae2bc1bc 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -32,6 +32,7 @@ const populateUserInfo = (user) => {
([userData, status]) => {
if (userData) {
Object.assign(user, {
+ id: userId,
avatarUrl: userData.avatar_url,
bot: userData.bot,
username: userData.username,
@@ -42,6 +43,7 @@ const populateUserInfo = (user) => {
websiteUrl: userData.website_url,
pronouns: userData.pronouns,
localTime: userData.local_time,
+ isFollowed: userData.is_followed,
loaded: true,
});
}
@@ -97,15 +99,29 @@ export default function addPopovers(elements = document.querySelectorAll('.js-us
bio: null,
workInformation: null,
status: null,
+ isFollowed: false,
loaded: false,
};
const renderedPopover = new UserPopoverComponent({
propsData: {
target: el,
user,
+ placement: el.dataset.placement || 'top',
},
});
+ const { userId } = el.dataset;
+
+ renderedPopover.$on('follow', () => {
+ UsersCache.updateById(userId, { is_followed: true });
+ user.isFollowed = true;
+ });
+
+ renderedPopover.$on('unfollow', () => {
+ UsersCache.updateById(userId, { is_followed: false });
+ user.isFollowed = false;
+ });
+
initializedPopovers.set(el, renderedPopover);
renderedPopover.$mount();
diff --git a/app/assets/javascripts/users_select/index.js b/app/assets/javascripts/users_select/index.js
index f7a5589af90..e1e5cc565c6 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 } = options;
+ const { handleClick, autoAssignToMe } = options;
const userSelect = this;
$els.each((i, dropdown) => {
@@ -172,10 +172,7 @@ function UsersSelect(currentUser, els, options = {}) {
});
};
- $assignToMeLink.on('click', (e) => {
- e.preventDefault();
- $(e.currentTarget).hide();
-
+ const onAssignToMeClick = () => {
if ($dropdown.data('multiSelect')) {
assignYourself();
checkMaxSelect();
@@ -194,8 +191,19 @@ 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);
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/added_commit_message.vue b/app/assets/javascripts/vue_merge_request_widget/components/added_commit_message.vue
index 492e68b636f..437d035fbf5 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/added_commit_message.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/added_commit_message.vue
@@ -12,6 +12,11 @@ export default {
},
mixins: [glFeatureFlagMixin()],
props: {
+ state: {
+ type: String,
+ required: false,
+ default: '',
+ },
isSquashEnabled: {
type: Boolean,
required: false,
@@ -30,8 +35,16 @@ export default {
type: String,
required: true,
},
+ mergeCommitSha: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
+ isMerged() {
+ return this.state === 'merged';
+ },
targetBranchEscaped() {
return escape(this.targetBranch);
},
@@ -39,6 +52,22 @@ export default {
return n__('%d commit', '%d commits', this.isSquashEnabled ? 1 : this.commitsCount);
},
message() {
+ if (this.glFeatures.restructuredMrWidget) {
+ if (this.state === 'closed') {
+ return s__('mrWidgetCommitsAdded|The changes were not merged into %{targetBranch}.');
+ } else if (this.isMerged) {
+ return s__(
+ 'mrWidgetCommitsAdded|Changes merged into %{targetBranch} with %{mergeCommitSha}%{squashedCommits}.',
+ );
+ }
+
+ return this.isFastForwardEnabled
+ ? s__('mrWidgetCommitsAdded|%{commitCount} will be added to %{targetBranch}.')
+ : s__(
+ 'mrWidgetCommitsAdded|%{commitCount} and %{mergeCommitCount} will be added to %{targetBranch}%{squashedCommits}.',
+ );
+ }
+
return this.isFastForwardEnabled
? s__('mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}.')
: s__(
@@ -48,6 +77,13 @@ export default {
textDecorativeComponent() {
return this.glFeatures.restructuredMrWidget ? 'span' : 'strong';
},
+ squashCommitMessage() {
+ if (this.isMerged) {
+ return s__('mergedCommitsAdded|(commits were squashed)');
+ }
+
+ return n__('(squashes %d commit)', '(squashes %d commits)', this.commitsCount);
+ },
},
mergeCommitCount,
};
@@ -69,9 +105,14 @@ export default {
</template>
<template #squashedCommits>
<template v-if="glFeatures.restructuredMrWidget && isSquashEnabled">
- {{ n__('(squashes %d commit)', '(squashes %d commits)', commitsCount) }}</template
+ {{ squashCommitMessage }}</template
></template
>
+ <template #mergeCommitSha>
+ <template v-if="glFeatures.restructuredMrWidget"
+ ><span class="label-branch">{{ mergeCommitSha }}</span></template
+ >
+ </template>
</gl-sprintf>
</span>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue b/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue
index 24cefd63ce3..e7d5e4086bc 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/approvals/approvals.vue
@@ -2,8 +2,11 @@
import { GlButton } from '@gitlab/ui';
import createFlash from '~/flash';
import { BV_SHOW_MODAL } from '~/lib/utils/constants';
-import { s__ } from '~/locale';
+import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { s__, __ } from '~/locale';
import sidebarEventHub from '~/sidebar/event_hub';
+import showToast from '~/vue_shared/plugins/global_toast';
+import SidebarMediator from '~/sidebar/sidebar_mediator';
import eventHub from '../../event_hub';
import approvalsMixin from '../../mixins/approvals';
import MrWidgetContainer from '../mr_widget_container.vue';
@@ -21,7 +24,7 @@ export default {
ApprovalsSummaryOptional,
GlButton,
},
- mixins: [approvalsMixin],
+ mixins: [approvalsMixin, glFeatureFlagsMixin()],
props: {
mr: {
type: Object,
@@ -171,6 +174,14 @@ export default {
return serviceFn()
.then((data) => {
this.mr.setApprovals(data);
+
+ if (
+ this.glFeatures.mrAttentionRequests &&
+ SidebarMediator.singleton?.store.currentUserHasAttention
+ ) {
+ showToast(__('Approved. Your attention request was removed.'));
+ }
+
eventHub.$emit('MRWidgetUpdateRequested');
eventHub.$emit('ApprovalUpdated');
sidebarEventHub.$emit('removeCurrentUserAttentionRequested');
@@ -217,7 +228,7 @@ export default {
<slot
:is-approving="isApproving"
:approve-with-auth="approveWithAuth"
- :hasApproval-auth-error="hasApprovalAuthError"
+ :has-approval-auth-error="hasApprovalAuthError"
></slot>
</template>
</div>
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 f1b89c42fb5..0bc17de638b 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
@@ -47,6 +47,8 @@ export default {
fullData: [],
isCollapsed: true,
showFade: false,
+ modalData: undefined,
+ modalName: undefined,
};
},
computed: {
@@ -116,6 +118,9 @@ export default {
return summary;
},
+ modalId() {
+ return this.modalName || `modal${this.$options.name}`;
+ },
},
watch: {
isCollapsed(newVal) {
@@ -249,7 +254,7 @@ export default {
class="media-body gl-display-flex gl-flex-direction-row! gl-align-self-center"
data-testid="widget-extension-top-level"
>
- <div class="gl-flex-grow-1">
+ <div class="gl-flex-grow-1" data-testid="widget-extension-top-level-summary">
<template v-if="isLoadingSummary">{{ widgetLoadingText }}</template>
<template v-else-if="hasFetchError">{{ widgetErrorText }}</template>
<div v-else>
@@ -306,12 +311,20 @@ export default {
data-testid="extension-list-item"
>
<gl-intersection-observer
- :options="{ rootMargin: '100px', thresholds: 0.1 }"
+ :options="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ rootMargin: '100px',
+ thresholds: 0.1,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
class="gl-w-full"
@appear="appear(index)"
@disappear="disappear(index)"
>
- <child-content :data="item" :widget-label="widgetLabel" :level="2" />
+ <child-content
+ :data="item"
+ :widget-label="widgetLabel"
+ :modal-id="modalId"
+ :level="2"
+ />
</gl-intersection-observer>
</div>
</dynamic-scroller-item>
@@ -322,5 +335,8 @@ export default {
class="fade mr-extenson-scrim gl-absolute gl-left-0 gl-bottom-0 gl-w-full gl-h-7 gl-pointer-events-none"
></div>
</div>
+ <div v-if="$options.modalComponent && modalData">
+ <component :is="$options.modalComponent" :modal-id="modalId" v-bind="modalData" />
+ </div>
</section>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
index 5cfee21dd5e..0ca4c92a5ae 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/child_content.vue
@@ -1,5 +1,5 @@
<script>
-import { GlBadge, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
+import { GlBadge, GlLink, GlSafeHtmlDirective, GlModalDirective } from '@gitlab/ui';
import StatusIcon from './status_icon.vue';
import Actions from './actions.vue';
import { generateText } from './utils';
@@ -14,6 +14,7 @@ export default {
},
directives: {
SafeHtml: GlSafeHtmlDirective,
+ GlModal: GlModalDirective,
},
props: {
data: {
@@ -24,6 +25,11 @@ export default {
type: String,
required: true,
},
+ modalId: {
+ type: String,
+ required: false,
+ default: null,
+ },
level: {
type: Number,
required: true,
@@ -63,6 +69,11 @@ export default {
<div v-if="data.link">
<gl-link :href="data.link.href">{{ data.link.text }}</gl-link>
</div>
+ <div v-if="data.modal">
+ <gl-link v-gl-modal="modalId" @click="data.modal.onClick">
+ {{ data.modal.text }}
+ </gl-link>
+ </div>
<div v-if="data.supportingText">
<p v-safe-html="generateText(data.supportingText)" class="gl-m-0"></p>
</div>
@@ -87,6 +98,7 @@ export default {
:key="childData.id"
:data="childData"
:widget-label="widgetLabel"
+ :modal-id="modalId"
:level="3"
data-testid="child-content"
/>
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 8438f3492b2..65273678fb9 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
@@ -14,6 +14,7 @@ export const registerExtension = (extension) => {
i18n: extension.i18n,
expandEvent: extension.expandEvent,
enablePolling: extension.enablePolling,
+ modalComponent: extension.modalComponent,
computed: {
...Object.keys(extension.computed).reduce(
(acc, 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 01d8de132e7..456a1f17aae 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
@@ -49,7 +49,7 @@ export default {
]"
class="gl-rounded-full gl-mr-3 gl-relative gl-p-2"
>
- <gl-loading-icon v-if="isLoading" size="md" inline class="gl-display-block" />
+ <gl-loading-icon v-if="isLoading" size="lg" inline class="gl-display-block" />
<gl-icon
v-else
:name="$options.EXTENSION_ICON_NAMES[iconName]"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
index 5fba070f79c..cba12507eba 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
+++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/utils.js
@@ -35,9 +35,7 @@ const textStyleTags = {
[getStartTag('small')]: '<span class="gl-font-sm gl-text-gray-700">',
};
-export const generateText = (text) => {
- if (typeof text !== 'string') return null;
-
+const createText = (text) => {
return text
.replace(
new RegExp(
@@ -60,3 +58,21 @@ export const generateText = (text) => {
)
.replace(/%{([a-z]|_)+}/g, ''); // Filter out any tags we don't know about
};
+
+export const generateText = (text) => {
+ if (typeof text === 'string') {
+ return createText(text);
+ } else if (
+ typeof text === 'object' &&
+ typeof text.text === 'string' &&
+ typeof text.href === 'string'
+ ) {
+ return createText(
+ `${
+ text.prependText ? `${text.prependText} ` : ''
+ }<a class="gl-text-decoration-underline" href="${text.href}">${text.text}</a>`,
+ );
+ }
+
+ return null;
+};
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
index 8cdaa3316ee..e1d88099580 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue
@@ -1,9 +1,5 @@
<script>
import {
- GlButton,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
GlLink,
GlTooltipDirective,
GlModalDirective,
@@ -14,8 +10,6 @@ import { constructWebIDEPath } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import clipboardButton from '~/vue_shared/components/clipboard_button.vue';
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
-import MrWidgetHowToMergeModal from './mr_widget_how_to_merge_modal.vue';
import MrWidgetIcon from './mr_widget_icon.vue';
export default {
@@ -24,14 +18,8 @@ export default {
clipboardButton,
TooltipOnTruncate,
MrWidgetIcon,
- MrWidgetHowToMergeModal,
- GlButton,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownItem,
GlLink,
GlSprintf,
- WebIdeLink,
},
directives: {
GlTooltip: GlTooltipDirective,
@@ -107,71 +95,6 @@ export default {
</gl-sprintf>
</div>
</div>
-
- <div class="branch-actions d-flex">
- <template v-if="mr.isOpen">
- <web-ide-link
- v-if="!mr.sourceBranchRemoved"
- :show-edit-button="false"
- :show-web-ide-button="true"
- :web-ide-url="webIdePath"
- :web-ide-text="$options.i18n.webIdeText"
- :show-gitpod-button="mr.showGitpodButton"
- :gitpod-url="mr.gitpodUrl"
- :gitpod-enabled="mr.gitpodEnabled"
- :user-preferences-gitpod-path="mr.userPreferencesGitpodPath"
- :user-profile-enable-gitpod-path="mr.userProfileEnableGitpodPath"
- :gitpod-text="$options.i18n.gitpodText"
- class="gl-display-none gl-md-display-inline-block gl-mr-3"
- data-placement="bottom"
- tabindex="0"
- data-qa-selector="open_in_web_ide_button"
- />
- <gl-button
- v-gl-modal-directive="'modal-merge-info'"
- :disabled="mr.sourceBranchRemoved"
- class="js-check-out-branch gl-mr-3"
- >
- {{ s__('mrWidget|Check out branch') }}
- </gl-button>
- <mr-widget-how-to-merge-modal
- :is-fork="isFork"
- :can-merge="mr.canMerge"
- :source-branch="mr.sourceBranch"
- :source-project="mr.sourceProject"
- :source-project-path="mr.sourceProjectFullPath"
- :target-branch="mr.targetBranch"
- :source-project-default-url="mr.sourceProjectDefaultUrl"
- :reviewing-docs-path="mr.reviewingDocsPath"
- />
- </template>
- <gl-dropdown
- v-gl-tooltip
- :title="__('Download as')"
- :aria-label="__('Download as')"
- icon="download"
- right
- data-qa-selector="download_dropdown"
- >
- <gl-dropdown-section-header>{{ __('Download as') }}</gl-dropdown-section-header>
- <gl-dropdown-item
- :href="mr.emailPatchesPath"
- class="js-download-email-patches"
- download
- data-qa-selector="download_email_patches_menu_item"
- >
- {{ s__('mrWidget|Email patches') }}
- </gl-dropdown-item>
- <gl-dropdown-item
- :href="mr.plainDiffPath"
- class="js-download-plain-diff"
- download
- data-qa-selector="download_plain_diff_menu_item"
- >
- {{ s__('mrWidget|Plain diff') }}
- </gl-dropdown-item>
- </gl-dropdown>
- </div>
</div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
index e906b8c3b59..c2a3ae361ca 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_how_to_merge_modal.vue
@@ -112,11 +112,19 @@ export default {
return escapeShellString(this.sourceBranch);
},
},
+ mounted() {
+ document.addEventListener('click', (e) => {
+ if (e.target.closest('.js-check-out-modal-trigger')) {
+ this.$refs.modal.show();
+ }
+ });
+ },
};
</script>
<template>
<gl-modal
+ ref="modal"
modal-id="modal-merge-info"
:no-enforce-focus="true"
:title="$options.i18n.title"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
index c0b80eef082..3b3b46e9772 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue
@@ -276,12 +276,11 @@ export default {
</div>
</div>
<div>
- <span class="mr-widget-pipeline-graph">
- <span class="stage-cell">
+ <span class="gl-align-items-center gl-display-inline-flex mr-widget-pipeline-graph">
+ <span class="gl-align-items-center gl-display-inline-flex gl-flex-wrap stage-cell">
<linked-pipelines-mini-list v-if="triggeredBy.length" :triggered-by="triggeredBy" />
<pipeline-mini-graph
v-if="hasStages"
- class="gl-display-inline-block"
stages-class="mr-widget-pipeline-stages"
:stages="pipeline.details.stages"
:is-merge-train="isMergeTrain"
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_related_links.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_related_links.vue
index 2cef37d5c2e..b8a1f89d232 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_related_links.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_related_links.vue
@@ -1,5 +1,5 @@
<script>
-import { GlSafeHtmlDirective as SafeHtml, GlLink } from '@gitlab/ui';
+import { GlSafeHtmlDirective as SafeHtml, GlLink, GlSprintf } from '@gitlab/ui';
import { s__, n__ } from '~/locale';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -10,6 +10,7 @@ export default {
},
components: {
GlLink,
+ GlSprintf,
},
mixins: [glFeatureFlagMixin()],
props: {
@@ -28,6 +29,16 @@ export default {
required: false,
default: true,
},
+ divergedCommitsCount: {
+ type: Number,
+ required: false,
+ default: 0,
+ },
+ targetBranchPath: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
computed: {
closesText() {
@@ -81,5 +92,19 @@ export default {
}}</gl-link>
</span>
</p>
+ <div
+ v-if="
+ divergedCommitsCount > 0 && glFeatures.updatedMrHeader && !glFeatures.restructuredMrWidget
+ "
+ class="diverged-commits-count"
+ >
+ <gl-sprintf :message="s__('mrWidget|The source branch is %{link} the target branch')">
+ <template #link>
+ <gl-link :href="targetBranchPath">{{
+ n__('%d commit behind', '%d commits behind', divergedCommitsCount)
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </div>
</section>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
index 9499603163b..7ff1eb6e73a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_status_icon.vue
@@ -46,7 +46,7 @@ export default {
<gl-button
v-if="!glFeatures.restructuredMrWidget && showDisabledButton"
category="primary"
- variant="success"
+ variant="confirm"
data-testid="disabled-merge-button"
:disabled="true"
>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
index a44caf886a4..aabbeac564a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue
@@ -175,7 +175,7 @@ export default {
{{ cancelButtonText }}
</gl-button>
</h4>
- <section class="mr-info-list">
+ <section v-if="!glFeatures.restructuredMrWidget" class="mr-info-list">
<p v-if="shouldRemoveSourceBranch">
{{ s__('mrWidget|Deletes the source branch') }}
</p>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
index 6d5ca58aa20..d50e52f5ac1 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_closed.vue
@@ -1,4 +1,5 @@
<script>
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import MrWidgetAuthorTime from '../mr_widget_author_time.vue';
import statusIcon from '../mr_widget_status_icon.vue';
@@ -8,6 +9,7 @@ export default {
MrWidgetAuthorTime,
statusIcon,
},
+ mixins: [glFeatureFlagMixin()],
props: {
/* TODO: This is providing all store and service down when it
only needs metrics and targetBranch */
@@ -29,7 +31,7 @@ export default {
:date-readable="mr.metrics.readableClosedAt"
/>
- <section class="mr-info-list">
+ <section v-if="!glFeatures.restructuredMrWidget" class="mr-info-list">
<p>
{{ s__('mrWidget|The changes were not merged into') }}
<a :href="mr.targetBranchPath" class="label-branch"> {{ mr.targetBranch }} </a>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
index 7435f578852..def30dacf8a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_conflicts.vue
@@ -1,5 +1,5 @@
<script>
-import { GlButton, GlModalDirective, GlSkeletonLoader } from '@gitlab/ui';
+import { GlButton, GlSkeletonLoader } from '@gitlab/ui';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import mergeRequestQueryVariablesMixin from '../../mixins/merge_request_query_variables';
import userPermissionsQuery from '../../queries/permissions.query.graphql';
@@ -13,9 +13,6 @@ export default {
StatusIcon,
GlButton,
},
- directives: {
- GlModalDirective,
- },
mixins: [glFeatureFlagMixin(), mergeRequestQueryVariablesMixin],
apollo: {
userPermissions: {
@@ -131,9 +128,9 @@ export default {
</gl-button>
<gl-button
v-if="canMerge"
- v-gl-modal-directive="'modal-merge-info'"
:size="glFeatures.restructuredMrWidget ? 'small' : 'medium'"
data-testid="merge-locally-button"
+ class="js-check-out-modal-trigger"
>
{{ s__('mrWidget|Resolve locally') }}
</gl-button>
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
index 84dac95ce74..bf036f562ed 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue
@@ -1,6 +1,7 @@
<script>
/* eslint-disable @gitlab/vue-require-i18n-strings */
import { GlLoadingIcon, GlButton, GlTooltipDirective, GlIcon } from '@gitlab/ui';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import api from '~/api';
import createFlash from '~/flash';
import { s__, __ } from '~/locale';
@@ -22,6 +23,7 @@ export default {
GlLoadingIcon,
GlButton,
},
+ mixins: [glFeatureFlagMixin()],
props: {
mr: {
type: Object,
@@ -181,7 +183,11 @@ export default {
{{ s__('mrWidget|Delete source branch') }}
</gl-button>
</div>
- <section class="mr-info-list" data-qa-selector="merged_status_content">
+ <section
+ v-if="!glFeatures.restructuredMrWidget"
+ class="mr-info-list"
+ data-qa-selector="merged_status_content"
+ >
<p>
{{ s__('mrWidget|The changes were merged into') }}
<span class="label-branch">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
index 887d1aab524..b86ab69af3f 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merging.vue
@@ -1,5 +1,6 @@
<script>
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
+import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import simplePoll from '~/lib/utils/simple_poll';
import MergeRequest from '~/merge_request';
import eventHub from '../../event_hub';
@@ -14,6 +15,7 @@ export default {
components: {
statusIcon,
},
+ mixins: [glFeatureFlagMixin()],
props: {
mr: {
type: Object,
@@ -88,7 +90,7 @@ export default {
{{ mergeStatus.message }}
<gl-emoji :data-name="mergeStatus.emoji" />
</h4>
- <section class="mr-info-list">
+ <section v-if="!glFeatures.restructuredMrWidget" class="mr-info-list">
<p>
{{ s__('mrWidget|Merges changes into') }}
<span class="label-branch">
diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
index 4f8faeb877f..4fb95fe635c 100644
--- a/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue
@@ -322,11 +322,33 @@ export default {
},
restructuredWidgetShowMergeButtons() {
if (this.glFeatures.restructuredMrWidget) {
- return this.isMergeAllowed && this.state.userPermissions.canMerge;
+ return (
+ (this.isMergeAllowed || this.isAutoMergeAvailable) &&
+ this.state.userPermissions.canMerge &&
+ !this.mr.mergeOngoing &&
+ !this.mr.autoMergeEnabled
+ );
}
return true;
},
+ sourceBranchDeletedText() {
+ if (this.glFeatures.restructuredMrWidget) {
+ if (this.removeSourceBranch) {
+ return this.mr.state === 'merged'
+ ? __('Deleted the source branch.')
+ : __('Source branch will be deleted.');
+ }
+
+ return this.mr.state === 'merged'
+ ? __('Did not delete the source branch.')
+ : __('Source branch will not be deleted.');
+ }
+
+ return this.removeSourceBranch
+ ? __('Deletes the source branch.')
+ : __('Does not delete the source branch.');
+ },
},
mounted() {
if (this.glFeatures.mergeRequestWidgetGraphql) {
@@ -421,6 +443,8 @@ export default {
if (this.glFeatures.mergeRequestWidgetGraphql) {
this.updateGraphqlState();
}
+
+ this.isMakingRequest = false;
})
.catch(() => {
this.isMakingRequest = false;
@@ -499,6 +523,7 @@ export default {
<template>
<div
+ data-testid="ready_to_merge_state"
:class="{
'gl-border-t-1 gl-border-t-solid gl-border-gray-100 gl-bg-gray-10 gl-pl-7 gl-rounded-bottom-left-base gl-rounded-bottom-right-base':
glFeatures.restructuredMrWidget,
@@ -611,6 +636,7 @@ export default {
glFeatures.restructuredMrWidget && (shouldShowSquashEdit || shouldShowMergeEdit)
"
v-model="editCommitMessage"
+ data-testid="widget_edit_commit_message"
class="gl-display-flex gl-align-items-center"
>
{{ __('Edit commit message') }}
@@ -686,25 +712,36 @@ export default {
v-if="!restructuredWidgetShowMergeButtons"
class="gl-w-full gl-order-n1 gl-text-gray-500"
>
- <strong>
+ <strong v-if="mr.state !== 'closed'">
{{ __('Merge details') }}
</strong>
<ul class="gl-pl-4 gl-m-0">
+ <li
+ v-if="mr.divergedCommitsCount > 0 && glFeatures.updatedMrHeader"
+ class="gl-line-height-normal"
+ >
+ <gl-sprintf
+ :message="s__('mrWidget|The source branch is %{link} the target branch')"
+ >
+ <template #link>
+ <gl-link :href="mr.targetBranchPath">{{
+ n__('%d commit behind', '%d commits behind', mr.divergedCommitsCount)
+ }}</gl-link>
+ </template>
+ </gl-sprintf>
+ </li>
<li class="gl-line-height-normal">
<added-commit-message
+ :state="mr.state"
+ :merge-commit-sha="mr.shortMergeCommitSha"
:is-squash-enabled="squashBeforeMerge"
:is-fast-forward-enabled="!shouldShowMergeEdit"
:commits-count="commitsCount"
:target-branch="stateData.targetBranch"
/>
</li>
- <li class="gl-line-height-normal">
- <template v-if="removeSourceBranch">
- {{ __('Deletes the source branch.') }}
- </template>
- <template v-else>
- {{ __('Does not delete the source branch.') }}
- </template>
+ <li v-if="mr.state !== 'closed'" class="gl-line-height-normal">
+ {{ sourceBranchDeletedText }}
</li>
<li v-if="mr.relatedLinks" class="gl-line-height-normal">
<related-links
@@ -733,6 +770,8 @@ export default {
:state="mr.state"
:related-links="mr.relatedLinks"
:show-assign-to-me="false"
+ :diverged-commits-count="mr.divergedCommitsCount"
+ :target-branch-path="mr.targetBranchPath"
class="mr-ready-merge-related-links gl-display-inline"
/>
</template>
diff --git a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
index d32db50874c..cea8df2484b 100644
--- a/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
+++ b/app/assets/javascripts/vue_merge_request_widget/extensions/code_quality/index.js
@@ -83,14 +83,11 @@ export default {
this.collapsedData.newErrors.map((e) => {
return fullData.push({
text: `${capitalizeFirstCharacter(e.severity)} - ${e.description}`,
- subtext: sprintf(
- s__(`ciReport|in %{open_link}${e.file_path}:${e.line}%{close_link}`),
- {
- open_link: `<a class="gl-text-decoration-underline" href="${e.urlPath}">`,
- close_link: '</a>',
- },
- false,
- ),
+ subtext: {
+ prependText: s__(`ciReport|in`),
+ text: `${e.file_path}:${e.line}`,
+ href: e.urlPath,
+ },
icon: {
name: SEVERITY_ICONS_EXTENSION[e.severity],
},
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 cd5cfb6837c..23f14bea4e1 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
@@ -10,6 +10,8 @@ export const i18n = {
label: s__('Reports|Test summary'),
loading: s__('Reports|Test summary results are loading'),
error: s__('Reports|Test summary failed to load results'),
+ newHeader: s__('Reports|New'),
+ fixedHeader: s__('Reports|Fixed'),
fullReport: s__('Reports|Full report'),
noChanges: (bold) => s__(`Reports|${noText(bold)} changed test results`),
@@ -36,4 +38,32 @@ export const i18n = {
sprintf(s__('Reports|An error occurred while loading %{name} results'), { name }),
headReportParsingError: s__('Reports|Head report parsing error:'),
baseReportParsingError: s__('Reports|Base report parsing error:'),
+
+ recentFailureSummary: (recentlyFailed, failed) => {
+ if (failed < 2) {
+ return sprintf(
+ s__(
+ 'Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days',
+ ),
+ { recentlyFailed, failed },
+ );
+ }
+ return sprintf(
+ n__(
+ 'Reports|%{recentlyFailed} out of %{failed} failed tests has failed more than once in the last 14 days',
+ 'Reports|%{recentlyFailed} out of %{failed} failed tests have failed more than once in the last 14 days',
+ recentlyFailed,
+ ),
+ { recentlyFailed, failed },
+ );
+ },
+ recentFailureCount: (recentFailures) =>
+ sprintf(
+ n__(
+ 'Reports|Failed %{count} time in %{base_branch} in the last 14 days',
+ 'Reports|Failed %{count} times in %{base_branch} in the last 14 days',
+ recentFailures.count,
+ ),
+ recentFailures,
+ ),
};
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 65d9257903f..577b2cbfc5c 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,7 +1,13 @@
import { uniqueId } from 'lodash';
import axios from '~/lib/utils/axios_utils';
import { EXTENSION_ICONS } from '../../constants';
-import { summaryTextBuilder, reportTextBuilder, reportSubTextBuilder } from './utils';
+import {
+ summaryTextBuilder,
+ reportTextBuilder,
+ reportSubTextBuilder,
+ countRecentlyFailedTests,
+ recentFailuresTextBuilder,
+} from './utils';
import { i18n, TESTS_FAILED_STATUS, ERROR_STATUS } from './constants';
export default {
@@ -18,7 +24,10 @@ export default {
if (data.hasSuiteError) {
return this.$options.i18n.error;
}
- return summaryTextBuilder(this.$options.i18n.label, data.summary);
+ return {
+ subject: summaryTextBuilder(this.$options.i18n.label, data.summary),
+ meta: recentFailuresTextBuilder(data.summary),
+ };
},
statusIcon(data) {
if (data.parsingInProgress) {
@@ -50,6 +59,10 @@ export default {
hasSuiteError: data.suites?.some((suite) => suite.status === ERROR_STATUS),
parsingInProgress: status === 204,
...data,
+ summary: {
+ recentlyFailed: countRecentlyFailedTests(data.suites),
+ ...data.summary,
+ },
},
};
});
@@ -66,17 +79,66 @@ export default {
}
return EXTENSION_ICONS.success;
},
- prepareReports() {
- return this.collapsedData.suites.map((suite) => {
+ testHeader(test, sectionHeader, index) {
+ const headers = [];
+ if (index === 0) {
+ headers.push(sectionHeader);
+ }
+ if (test.recent_failures?.count && test.recent_failures?.base_branch) {
+ headers.push(i18n.recentFailureCount(test.recent_failures));
+ }
+ return headers;
+ },
+ mapTestAsChild({ iconName, sectionHeader }) {
+ return (test, index) => {
return {
- id: uniqueId('suite-'),
- text: reportTextBuilder(suite),
- subtext: reportSubTextBuilder(suite),
- icon: {
- name: this.suiteIcon(suite),
- },
+ id: uniqueId('test-'),
+ header: this.testHeader(test, sectionHeader, index),
+ icon: { name: iconName },
+ text: test.name,
};
- });
+ };
+ },
+ prepareReports() {
+ return this.collapsedData.suites
+ .map((suite) => {
+ return {
+ ...suite,
+ summary: {
+ recentlyFailed: countRecentlyFailedTests(suite),
+ ...suite.summary,
+ },
+ };
+ })
+ .map((suite) => {
+ return {
+ id: uniqueId('suite-'),
+ text: reportTextBuilder(suite),
+ subtext: reportSubTextBuilder(suite),
+ icon: {
+ name: this.suiteIcon(suite),
+ },
+ children: [
+ ...[...suite.new_failures, ...suite.new_errors].map(
+ this.mapTestAsChild({
+ sectionHeader: i18n.newHeader,
+ iconName: EXTENSION_ICONS.failed,
+ }),
+ ),
+ ...[...suite.existing_failures, ...suite.existing_errors].map(
+ this.mapTestAsChild({
+ iconName: EXTENSION_ICONS.failed,
+ }),
+ ),
+ ...[...suite.resolved_failures, ...suite.resolved_errors].map(
+ this.mapTestAsChild({
+ sectionHeader: i18n.fixedHeader,
+ iconName: EXTENSION_ICONS.success,
+ }),
+ ),
+ ],
+ };
+ });
},
},
};
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 a74ed20362f..9e4b0ac581c 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
@@ -43,13 +43,42 @@ export const reportTextBuilder = ({ name = '', summary = {}, status }) => {
return i18n.summaryText(name, resultsString);
};
-export const reportSubTextBuilder = ({ suite_errors }) => {
- const errors = [];
- if (suite_errors?.head) {
- errors.push(`${i18n.headReportParsingError} ${suite_errors.head}`);
- }
- if (suite_errors?.base) {
- errors.push(`${i18n.baseReportParsingError} ${suite_errors.base}`);
+export const recentFailuresTextBuilder = (summary = {}) => {
+ const { failed, recentlyFailed } = summary;
+ if (!failed || !recentlyFailed) return '';
+
+ return i18n.recentFailureSummary(recentlyFailed, failed);
+};
+
+export const reportSubTextBuilder = ({ suite_errors, summary }) => {
+ if (suite_errors?.head || suite_errors?.base) {
+ const errors = [];
+ if (suite_errors?.head) {
+ errors.push(`${i18n.headReportParsingError} ${suite_errors.head}`);
+ }
+ if (suite_errors?.base) {
+ errors.push(`${i18n.baseReportParsingError} ${suite_errors.base}`);
+ }
+ return errors.join('<br />');
}
- return errors.join('<br />');
+ return recentFailuresTextBuilder(summary);
+};
+
+export const countRecentlyFailedTests = (subject) => {
+ // handle either a single report or an array of reports
+ const reports = !subject.length ? [subject] : subject;
+
+ return reports
+ .map((report) => {
+ 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,
+ )
+ .reduce((total, count) => total + count, 0)
+ );
+ })
+ .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 4b3ad288768..8ebb7f6f159 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
@@ -165,7 +165,10 @@ export default {
return this.mr?.codequalityReportsPath;
},
shouldRenderRelatedLinks() {
- return Boolean(this.mr.relatedLinks) && !this.mr.isNothingToMergeState;
+ return (
+ (Boolean(this.mr.relatedLinks) || this.mr.divergedCommitsCount > 0) &&
+ !this.mr.isNothingToMergeState
+ );
},
shouldRenderSourceBranchRemovalStatus() {
return (
@@ -195,6 +198,9 @@ export default {
shouldRenderTestReport() {
return Boolean(this.mr?.testResultsPath);
},
+ shouldRenderRefactoredTestReport() {
+ return window.gon?.features?.refactorMrWidgetTestSummary;
+ },
mergeError() {
let { mergeError } = this.mr;
@@ -228,6 +234,9 @@ export default {
isRestructuredMrWidgetEnabled() {
return window.gon?.features?.restructuredMrWidget;
},
+ isUpdatedHeaderEnabled() {
+ return window.gon?.features?.updatedMrHeader;
+ },
},
watch: {
'mr.machineValue': {
@@ -512,7 +521,7 @@ export default {
}
},
registerTestReportExtension() {
- if (this.shouldRenderTestReport && this.shouldShowExtension) {
+ if (this.shouldRenderTestReport && this.shouldRenderRefactoredTestReport) {
registerExtension(testReportExtension);
}
},
@@ -521,11 +530,15 @@ export default {
</script>
<template>
<div v-if="isLoaded" class="mr-state-widget gl-mt-3">
- <header class="gl-rounded-base gl-border-solid gl-border-1 gl-border-gray-100">
+ <header
+ v-if="shouldRenderCollaborationStatus || !isUpdatedHeaderEnabled"
+ :class="{ 'mr-widget-workflow gl-mt-0!': isUpdatedHeaderEnabled }"
+ class="gl-rounded-base gl-border-solid gl-border-1 gl-border-gray-100 gl-overflow-hidden"
+ >
<mr-widget-alert-message v-if="shouldRenderCollaborationStatus" type="info">
{{ s__('mrWidget|Members who can merge are allowed to add commits.') }}
</mr-widget-alert-message>
- <mr-widget-header :mr="mr" />
+ <mr-widget-header v-if="!isUpdatedHeaderEnabled" :mr="mr" />
</header>
<mr-widget-suggest-pipeline
v-if="shouldSuggestPipelines"
@@ -588,7 +601,7 @@ export default {
/>
<grouped-test-reports-app
- v-if="mr.testResultsPath && !shouldShowExtension"
+ v-if="shouldRenderTestReport && !shouldRenderRefactoredTestReport"
class="js-reports-container"
:endpoint="mr.testResultsPath"
:head-blob-path="mr.headBlobPath"
@@ -617,6 +630,8 @@ export default {
v-if="shouldRenderRelatedLinks"
:state="mr.state"
:related-links="mr.relatedLinks"
+ :diverged-commits-count="mr.divergedCommitsCount"
+ :target-branch-path="mr.targetBranchPath"
class="mr-info-list gl-ml-7 gl-pb-5"
/>
diff --git a/app/assets/javascripts/vue_merge_request_widget/queries/states/ready_to_merge.fragment.graphql b/app/assets/javascripts/vue_merge_request_widget/queries/states/ready_to_merge.fragment.graphql
index 99e6f4e9beb..efc0673bc26 100644
--- a/app/assets/javascripts/vue_merge_request_widget/queries/states/ready_to_merge.fragment.graphql
+++ b/app/assets/javascripts/vue_merge_request_widget/queries/states/ready_to_merge.fragment.graphql
@@ -11,7 +11,6 @@ fragment ReadyToMerge on Project {
shouldRemoveSourceBranch
forceRemoveSourceBranch
defaultMergeCommitMessage
- defaultMergeCommitMessageWithDescription
defaultSquashCommitMessage
squash
squashOnMerge
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index eb07609d5d6..146cf7e11a7 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -1,5 +1,5 @@
import getStateKey from 'ee_else_ce/vue_merge_request_widget/stores/get_state_key';
-import { statusBoxState } from '~/issuable/components/status_box.vue';
+import { badgeState } from '~/issuable/components/status_box.vue';
import { formatDate, getTimeago } from '~/lib/utils/datetime_utility';
import { machine } from '~/lib/utils/finite_state_machine';
import {
@@ -221,8 +221,8 @@ export default class MergeRequestStore {
}
updateStatusState(state) {
- if (this.mergeRequestState !== state && statusBoxState.updateStatus) {
- statusBoxState.updateStatus();
+ if (this.mergeRequestState !== state && badgeState.updateStatus) {
+ badgeState.updateStatus();
}
}
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
index 948d2505966..c93f620995f 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_details.vue
@@ -278,7 +278,7 @@ export default {
data-testid="viewIncidentBtn"
:href="incidentPath(alert.issue.iid)"
category="primary"
- variant="success"
+ variant="confirm"
>
{{ s__('AlertManagement|View incident') }}
</gl-button>
@@ -288,7 +288,7 @@ export default {
data-testid="createIncidentBtn"
:loading="incidentCreationInProgress"
category="primary"
- variant="success"
+ variant="confirm"
@click="createIncident()"
>
{{ s__('AlertManagement|Create incident') }}
diff --git a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
index 8b76af05ffe..6a03e38a31d 100644
--- a/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue
@@ -1,12 +1,12 @@
<script>
-import { GlSegmentedControl } from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
+import SegmentedControlButtonGroup from '~/vue_shared/components/segmented_control_button_group.vue';
import CiCdAnalyticsAreaChart from './ci_cd_analytics_area_chart.vue';
export default {
components: {
- GlSegmentedControl,
CiCdAnalyticsAreaChart,
+ SegmentedControlButtonGroup,
},
props: {
charts: {
@@ -38,7 +38,11 @@ export default {
</script>
<template>
<div>
- <gl-segmented-control v-model="selectedChart" :options="chartRanges" class="gl-mb-4" />
+ <segmented-control-button-group
+ v-model="selectedChart"
+ :options="chartRanges"
+ class="gl-mb-4"
+ />
<ci-cd-analytics-area-chart
v-if="chart"
v-bind="$attrs"
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 07bd6019b80..9bccc49e894 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -11,17 +11,22 @@ import { GlIcon } from '@gitlab/ui';
* }
*
* Used in:
- * - Pipelines table Badge
- * - Pipelines table mini graph
- * - Pipeline graph
- * - Pipeline show view badge
- * - Jobs table
+ * - Extended MR Popover
* - Jobs show view header
* - Jobs show view sidebar
+ * - Jobs table
* - Linked pipelines
- * - Extended MR Popover
+ * - Pipeline graph
+ * - Pipeline mini graph
+ * - Pipeline show view badge
+ * - Pipelines table Badge
+ */
+
+/*
+ * These sizes are defined in gitlab-ui/src/scss/variables.scss
+ * under '$gl-icon-sizes'
*/
-const validSizes = [8, 12, 16, 18, 24, 32, 48, 72];
+const validSizes = [8, 12, 14, 16, 24, 32, 48, 72];
export default {
components: {
@@ -45,6 +50,11 @@ export default {
required: false,
default: false,
},
+ isInteractive: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
cssClasses: {
type: String,
required: false,
@@ -52,9 +62,9 @@ export default {
},
},
computed: {
- cssClass() {
+ wrapperStyleClasses() {
const status = this.status.group;
- return `ci-status-icon ci-status-icon-${status} js-ci-status-icon-${status}`;
+ return `ci-status-icon ci-status-icon-${status} js-ci-status-icon-${status} gl-rounded-full gl-justify-content-center`;
},
icon() {
return this.borderless ? `${this.status.icon}_borderless` : this.status.icon;
@@ -63,7 +73,10 @@ export default {
};
</script>
<template>
- <span :class="cssClass">
+ <span
+ :class="[wrapperStyleClasses, { interactive: isInteractive }]"
+ :style="{ height: `${size}px`, width: `${size}px` }"
+ >
<gl-icon :name="icon" :size="size" :class="cssClasses" :aria-label="status.icon" />
</span>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue b/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
index 7a166f9a3e4..78db2bf15b0 100644
--- a/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
+++ b/app/assets/javascripts/vue_shared/components/color_picker/color_picker.vue
@@ -4,6 +4,7 @@
*
* @example
* <color-picker
+ :id="example-id"
:invalid-feedback="__('Please enter a valid hex (#RRGGBB or #RGB) color value')"
:label="__('Background color')"
:value="#FF0000"
@@ -12,6 +13,7 @@
/>
*/
import { GlFormGroup, GlFormInput, GlFormInputGroup, GlLink, GlTooltipDirective } from '@gitlab/ui';
+import { uniqueId } from 'lodash';
import { __ } from '~/locale';
const PREVIEW_COLOR_DEFAULT_CLASSES =
@@ -29,6 +31,11 @@ export default {
GlTooltip: GlTooltipDirective,
},
props: {
+ id: {
+ type: String,
+ required: false,
+ default: () => uniqueId('color-picker-'),
+ },
invalidFeedback: {
type: String,
required: false,
@@ -94,14 +101,13 @@ export default {
<div>
<gl-form-group
:label="label"
- label-for="color-picker"
+ :label-for="id"
:description="description"
:invalid-feedback="invalidFeedback"
:state="state"
:class="{ 'gl-mb-3!': hasSuggestedColors }"
>
<gl-form-input-group
- id="color-picker"
max-length="7"
type="text"
class="gl-align-center gl-rounded-0 gl-rounded-top-right-base gl-rounded-bottom-right-base"
@@ -112,6 +118,7 @@ export default {
<template #prepend>
<div :class="previewColorClasses" :style="previewColor" data-testid="color-preview">
<gl-form-input
+ :id="id"
type="color"
class="gl-absolute gl-top-0 gl-left-0 gl-h-full! gl-p-0! gl-m-0! gl-opacity-0"
tabindex="-1"
diff --git a/app/assets/javascripts/vue_shared/components/commit.vue b/app/assets/javascripts/vue_shared/components/commit.vue
index ebbc1bfb037..388353bc35b 100644
--- a/app/assets/javascripts/vue_shared/components/commit.vue
+++ b/app/assets/javascripts/vue_shared/components/commit.vue
@@ -172,7 +172,9 @@ export default {
:img-src="author.avatar_url"
:img-alt="userImageAltDescription"
:tooltip-text="author.username"
+ :img-size="16"
class="avatar-image-container text-decoration-none"
+ img-css-classes="gl-mr-3"
/>
<tooltip-on-truncate :title="title" class="flex-truncate-child">
<gl-link :href="commitUrl" class="commit-row-message cgray">{{ title }}</gl-link>
diff --git a/app/assets/javascripts/vue_shared/components/confidentiality_badge.vue b/app/assets/javascripts/vue_shared/components/confidentiality_badge.vue
new file mode 100644
index 00000000000..298c7bc50cc
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/confidentiality_badge.vue
@@ -0,0 +1,39 @@
+<script>
+import { GlBadge, GlTooltipDirective } from '@gitlab/ui';
+import { confidentialityInfoText } from '../constants';
+
+export default {
+ components: {
+ GlBadge,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ workspaceType: {
+ type: String,
+ required: true,
+ },
+ issuableType: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ confidentialTooltip() {
+ return confidentialityInfoText(this.workspaceType, this.issuableType);
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-badge
+ v-gl-tooltip.bottom
+ :title="confidentialTooltip"
+ icon="eye-slash"
+ variant="warning"
+ class="gl-display-inline gl-mr-2"
+ >{{ __('Confidential') }}</gl-badge
+ >
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.stories.js b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.stories.js
index 6629b293eb9..8481280f25f 100644
--- a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.stories.js
+++ b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.stories.js
@@ -14,6 +14,8 @@ const Template = (args, { argTypes }) => ({
additionalInformation: args.additionalInformation || null,
confirmDangerMessage: args.confirmDangerMessage || 'You require more Vespene Gas',
htmlConfirmationMessage: args.confirmDangerMessage || false,
+ confirmButtonText: args.confirmButtonText || 'Cancel',
+ cancelButtonText: args.cancelButtonText || 'Confirm',
},
});
diff --git a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue
index 88890b3332d..37e480f7e41 100644
--- a/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue
+++ b/app/assets/javascripts/vue_shared/components/confirm_danger/confirm_danger_modal.vue
@@ -12,7 +12,7 @@ import {
CONFIRM_DANGER_MODAL_TITLE,
CONFIRM_DANGER_PHRASE_TEXT,
CONFIRM_DANGER_WARNING,
- CONFIRM_DANGER_MODAL_ERROR,
+ CONFIRM_DANGER_MODAL_CANCEL,
} from './constants';
export default {
@@ -40,6 +40,9 @@ export default {
additionalInformation: {
default: CONFIRM_DANGER_WARNING,
},
+ cancelButtonText: {
+ default: CONFIRM_DANGER_MODAL_CANCEL,
+ },
},
props: {
modalId: {
@@ -66,6 +69,11 @@ export default {
attributes: [{ variant: 'danger', disabled: !this.isValid, class: 'qa-confirm-button' }],
};
},
+ actionCancel() {
+ return {
+ text: this.cancelButtonText,
+ };
+ },
},
methods: {
equalString(a, b) {
@@ -77,7 +85,6 @@ export default {
CONFIRM_DANGER_MODAL_TITLE,
CONFIRM_DANGER_WARNING,
CONFIRM_DANGER_PHRASE_TEXT,
- CONFIRM_DANGER_MODAL_ERROR,
},
};
</script>
@@ -88,6 +95,7 @@ export default {
:data-testid="modalId"
:title="$options.i18n.CONFIRM_DANGER_MODAL_TITLE"
:action-primary="actionPrimary"
+ :action-cancel="actionCancel"
@primary="$emit('confirm')"
>
<gl-alert
@@ -110,7 +118,7 @@ export default {
</template>
</gl-sprintf>
</p>
- <gl-form-group :state="isValid" :invalid-feedback="$options.i18n.CONFIRM_DANGER_MODAL_ERROR">
+ <gl-form-group :state="isValid">
<gl-form-input
id="confirm_name_input"
v-model="confirmationPhrase"
diff --git a/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js b/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js
index fa44a9be411..90d55d0f93f 100644
--- a/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js
+++ b/app/assets/javascripts/vue_shared/components/confirm_danger/constants.js
@@ -2,7 +2,6 @@ import { __ } from '~/locale';
export const CONFIRM_DANGER_MODAL_ID = 'confirm-danger-modal';
export const CONFIRM_DANGER_MODAL_TITLE = __('Confirmation required');
-export const CONFIRM_DANGER_MODAL_ERROR = __('Confirmation required');
export const CONFIRM_DANGER_MODAL_BUTTON = __('Confirm');
export const CONFIRM_DANGER_WARNING = __(
'This action can lead to data loss. To prevent accidental actions we ask you to confirm your intention.',
@@ -10,3 +9,4 @@ export const CONFIRM_DANGER_WARNING = __(
export const CONFIRM_DANGER_PHRASE_TEXT = __(
'Please type %{phrase_code} to proceed or close this modal to cancel.',
);
+export const CONFIRM_DANGER_MODAL_CANCEL = __('Cancel');
diff --git a/app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue b/app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue
index e546ca57c5e..181c1b89e31 100644
--- a/app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue
+++ b/app/assets/javascripts/vue_shared/components/date_time_picker/date_time_picker.vue
@@ -248,7 +248,7 @@ export default {
__('Cancel')
}}</gl-button>
<gl-button
- variant="success"
+ variant="confirm"
category="primary"
:disabled="!isValid"
@click="setFixedRange()"
diff --git a/app/assets/javascripts/vue_shared/components/deployment_instance.vue b/app/assets/javascripts/vue_shared/components/deployment_instance.vue
index 41b783aa011..4aae86fc82b 100644
--- a/app/assets/javascripts/vue_shared/components/deployment_instance.vue
+++ b/app/assets/javascripts/vue_shared/components/deployment_instance.vue
@@ -14,6 +14,7 @@
*/
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: {
@@ -22,7 +23,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
-
+ mixins: [glFeatureFlagsMixin()],
props: {
/**
* Represents the status of the pod. Each state is represented with a different
@@ -75,7 +76,9 @@ export default {
},
computedLogPath() {
- return this.isLink ? mergeUrlParams({ pod_name: this.podName }, this.logsPath) : null;
+ return this.isLink && this.glFeatures.monitorLogging
+ ? mergeUrlParams({ pod_name: this.podName }, this.logsPath)
+ : null;
},
},
};
diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_hidden_input.vue b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_hidden_input.vue
deleted file mode 100644
index afde0c81580..00000000000
--- a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_hidden_input.vue
+++ /dev/null
@@ -1,18 +0,0 @@
-<script>
-export default {
- props: {
- name: {
- type: String,
- required: true,
- },
- value: {
- type: [Number, String],
- required: true,
- },
- },
-};
-</script>
-
-<template>
- <input :name="name" :value="value" type="hidden" />
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_search_input.vue b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_search_input.vue
deleted file mode 100644
index edb5ffdc39c..00000000000
--- a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_search_input.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-<script>
-import { GlIcon } from '@gitlab/ui';
-import { __ } from '~/locale';
-
-export default {
- components: {
- GlIcon,
- },
- props: {
- placeholderText: {
- type: String,
- required: true,
- default: __('Search'),
- },
- focused: {
- type: Boolean,
- required: false,
- default: false,
- },
- },
- data() {
- return { searchQuery: this.value };
- },
- watch: {
- searchQuery(query) {
- this.$emit('input', query);
- },
- focused(val) {
- if (val) {
- this.$refs.searchInput.focus();
- }
- },
- },
-};
-</script>
-
-<template>
- <div class="dropdown-input">
- <input
- ref="searchInput"
- v-model="searchQuery"
- :placeholder="placeholderText"
- class="dropdown-input-field"
- type="search"
- autocomplete="off"
- />
- <gl-icon name="search" class="dropdown-input-search" data-hidden="true" />
- </div>
-</template>
diff --git a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue
index 2a79ccc2648..840911dc99c 100644
--- a/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue
+++ b/app/assets/javascripts/vue_shared/components/dropdown/dropdown_widget/dropdown_widget.vue
@@ -1,28 +1,22 @@
<script>
import {
- GlIcon,
GlLoadingIcon,
GlDropdown,
GlDropdownForm,
GlDropdownDivider,
GlDropdownItem,
- GlDropdownSectionHeader,
GlSearchBoxByType,
} from '@gitlab/ui';
import { __ } from '~/locale';
-import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue';
export default {
components: {
- GlIcon,
GlLoadingIcon,
GlDropdown,
GlDropdownForm,
GlDropdownDivider,
GlDropdownItem,
- GlDropdownSectionHeader,
GlSearchBoxByType,
- TooltipOnTruncate,
},
props: {
selectText: {
@@ -45,11 +39,6 @@ export default {
required: false,
default: () => [],
},
- groupedOptions: {
- type: Array,
- required: false,
- default: () => [],
- },
isLoading: {
type: Boolean,
required: false,
@@ -70,6 +59,11 @@ export default {
required: false,
default: false,
},
+ customIsSelectedOption: {
+ type: Function,
+ required: false,
+ default: undefined,
+ },
},
computed: {
isSearchEmpty() {
@@ -87,6 +81,9 @@ export default {
}
},
isSelected(option) {
+ if (this.customIsSelectedOption !== undefined) {
+ return this.customIsSelectedOption(option);
+ }
if (Array.isArray(this.selected)) {
return this.selected.some((label) => label.title === option.title);
}
@@ -143,7 +140,7 @@ export default {
<gl-dropdown-form class="gl-relative gl-min-h-7" data-qa-selector="labels_dropdown_content">
<gl-loading-icon
v-if="isLoading"
- size="md"
+ size="lg"
class="gl-absolute gl-left-0 gl-top-0 gl-right-0"
/>
<template v-else>
@@ -177,36 +174,7 @@ export default {
{{ option.title }}
</slot>
</gl-dropdown-item>
- <template v-for="(optionGroup, index) in groupedOptions">
- <gl-dropdown-divider v-if="index !== 0" :key="index" />
- <gl-dropdown-section-header :key="optionGroup.id">
- <div class="gl-display-flex gl-max-w-full">
- <tooltip-on-truncate
- :title="optionGroup.title"
- class="gl-text-truncate gl-flex-grow-1"
- >
- {{ optionGroup.title }}
- </tooltip-on-truncate>
- <span v-if="optionGroup.secondaryText" class="gl-float-right gl-font-weight-normal">
- <gl-icon name="clock" class="gl-mr-2" />
- {{ optionGroup.secondaryText }}
- </span>
- </div>
- </gl-dropdown-section-header>
- <gl-dropdown-item
- v-for="option in optionGroup.options"
- :key="optionKey(option)"
- :is-checked="isSelected(option)"
- is-check-centered
- is-check-item
- data-testid="unselected-option"
- @click="selectOption(option)"
- >
- <slot name="item" :item="option">
- {{ option.title }}
- </slot>
- </gl-dropdown-item>
- </template>
+ <slot v-bind="{ isSelected }" name="grouped-options"></slot>
<gl-dropdown-item v-if="noOptionsFound" class="gl-pl-6!">
{{ $options.i18n.noMatchingResults }}
</gl-dropdown-item>
diff --git a/app/assets/javascripts/vue_shared/components/file_finder/index.vue b/app/assets/javascripts/vue_shared/components/file_finder/index.vue
index b0c1c1531aa..680f229d5e8 100644
--- a/app/assets/javascripts/vue_shared/components/file_finder/index.vue
+++ b/app/assets/javascripts/vue_shared/components/file_finder/index.vue
@@ -1,5 +1,5 @@
<script>
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlLoadingIcon } from '@gitlab/ui';
import fuzzaldrinPlus from 'fuzzaldrin-plus';
import Mousetrap from 'mousetrap';
import VirtualList from 'vue-virtual-scroll-list';
@@ -9,13 +9,13 @@ import Item from './item.vue';
export const MAX_FILE_FINDER_RESULTS = 40;
export const FILE_FINDER_ROW_HEIGHT = 55;
-export const FILE_FINDER_EMPTY_ROW_HEIGHT = 33;
const originalStopCallback = Mousetrap.prototype.stopCallback;
export default {
components: {
GlIcon,
+ GlLoadingIcon,
Item,
VirtualList,
},
@@ -71,7 +71,7 @@ export default {
return this.filteredBlobsLength ? Math.min(this.filteredBlobsLength, 5) : 1;
},
listHeight() {
- return this.filteredBlobsLength ? FILE_FINDER_ROW_HEIGHT : FILE_FINDER_EMPTY_ROW_HEIGHT;
+ return FILE_FINDER_ROW_HEIGHT;
},
showClearInputButton() {
return this.searchText.trim() !== '';
@@ -265,9 +265,9 @@ export default {
</li>
</template>
<li v-else class="dropdown-menu-empty-item">
- <div class="gl-mr-3 gl-ml-3 gl-mt-3 gl-mb-3">
+ <div class="gl-mr-3 gl-ml-3 gl-mt-5 gl-mb-3">
<template v-if="loading">
- {{ __('Loading...') }}
+ <gl-loading-icon />
</template>
<template v-else>
{{ __('No files found.') }}
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
index 3d48c74b40b..d7a84798e47 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js
@@ -1,6 +1,6 @@
import { __ } from '~/locale';
-export const DEBOUNCE_DELAY = 200;
+export const DEBOUNCE_DELAY = 500;
export const MAX_RECENT_TOKENS_SIZE = 3;
export const FILTER_NONE = 'None';
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
index 6638a5de62f..33d507dad57 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue
@@ -89,32 +89,20 @@ export default {
required: false,
default: () => ({}),
},
+ syncFilterAndSort: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
- let selectedSortOption = this.sortOptions[0]?.sortDirection?.descending;
- let selectedSortDirection = SortDirection.descending;
-
- // Extract correct sortBy value based on initialSortBy
- if (this.initialSortBy) {
- selectedSortOption = this.sortOptions
- .filter(
- (sortBy) =>
- sortBy.sortDirection.ascending === this.initialSortBy ||
- sortBy.sortDirection.descending === this.initialSortBy,
- )
- .pop();
- selectedSortDirection = Object.keys(selectedSortOption.sortDirection).find(
- (key) => selectedSortOption.sortDirection[key] === this.initialSortBy,
- );
- }
-
return {
initialRender: true,
recentSearchesPromise: null,
recentSearches: [],
filterValue: this.initialFilterValue,
- selectedSortOption,
- selectedSortDirection,
+ selectedSortOption: this.sortOptions[0],
+ selectedSortDirection: SortDirection.descending,
};
},
computed: {
@@ -173,7 +161,20 @@ export default {
return undefined;
},
},
+ watch: {
+ initialFilterValue(newValue) {
+ if (this.syncFilterAndSort) {
+ this.filterValue = newValue;
+ }
+ },
+ initialSortBy(newValue) {
+ if (this.syncFilterAndSort) {
+ this.updateSelectedSortValues(newValue);
+ }
+ },
+ },
created() {
+ this.updateSelectedSortValues(this.initialSortBy);
if (this.recentSearchesStorageKey) this.setupRecentSearch();
},
methods: {
@@ -309,12 +310,25 @@ export default {
const cleared = true;
this.$emit('onFilter', [], cleared);
},
+ updateSelectedSortValues(sort) {
+ if (!sort) {
+ return;
+ }
+
+ this.selectedSortOption = this.sortOptions.find(
+ (sortBy) =>
+ sortBy.sortDirection.ascending === sort || sortBy.sortDirection.descending === sort,
+ );
+ this.selectedSortDirection = Object.keys(this.selectedSortOption.sortDirection).find(
+ (key) => this.selectedSortOption.sortDirection[key] === sort,
+ );
+ },
},
};
</script>
<template>
- <div class="vue-filtered-search-bar-container d-md-flex">
+ <div class="vue-filtered-search-bar-container gl-md-display-flex">
<gl-form-checkbox
v-if="showCheckbox"
class="gl-align-self-center"
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
index 696456be990..848c49c48c7 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/author_token.vue
@@ -87,6 +87,7 @@ export default {
:get-active-token-value="getActiveAuthor"
:default-suggestions="defaultAuthors"
:preloaded-suggestions="preloadedAuthors"
+ v-bind="$attrs"
@fetch-suggestions="fetchAuthors"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
index e7923e0b55e..c3a0a97a7ba 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/base_token.vue
@@ -211,10 +211,22 @@ export default {
@select="handleTokenValueSelected"
>
<template #view-token="viewTokenProps">
- <slot name="view-token" :view-token-props="{ ...viewTokenProps, activeTokenValue }"></slot>
+ <slot
+ name="view-token"
+ :view-token-props="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ ...viewTokenProps,
+ activeTokenValue,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ ></slot>
</template>
<template #view="viewTokenProps">
- <slot name="view" :view-token-props="{ ...viewTokenProps, activeTokenValue }"></slot>
+ <slot
+ name="view"
+ :view-token-props="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ ...viewTokenProps,
+ activeTokenValue,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
+ ></slot>
</template>
<template v-if="suggestionsEnabled" #suggestions>
<template v-if="showDefaultSuggestions">
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
index 4ecfc1cf40c..aa5161ca93c 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/branch_token.vue
@@ -65,6 +65,7 @@ export default {
:suggestions="branches"
:suggestions-loading="loading"
:get-active-token-value="getActiveBranch"
+ v-bind="$attrs"
@fetch-suggestions="fetchBranches"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
index 5a69751a2cc..210d814d22a 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue
@@ -67,6 +67,7 @@ export default {
:suggestions="emojis"
:suggestions-loading="loading"
:get-active-token-value="getActiveEmoji"
+ v-bind="$attrs"
@fetch-suggestions="fetchEmojis"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
index 3f7a8920f48..6f24955814c 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/label_token.vue
@@ -104,6 +104,7 @@ export default {
:suggestions="labels"
:get-active-token-value="getActiveLabel"
:default-suggestions="defaultLabels"
+ v-bind="$attrs"
@fetch-suggestions="fetchLabels"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
index 11c081ab4f8..69265d0fdc9 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue
@@ -84,6 +84,7 @@ export default {
:suggestions="milestones"
:suggestions-loading="loading"
:get-active-token-value="getActiveMilestone"
+ v-bind="$attrs"
@fetch-suggestions="fetchMilestones"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/release_token.vue b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/release_token.vue
index f353cc3a765..9e68c92af5d 100644
--- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/release_token.vue
+++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/tokens/release_token.vue
@@ -66,6 +66,7 @@ export default {
:suggestions="releases"
:suggestions-loading="loading"
:get-active-token-value="getActiveRelease"
+ v-bind="$attrs"
@fetch-suggestions="fetchReleases"
v-on="$listeners"
>
diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue
index 722df3cc58b..1f309a19b14 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/field.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue
@@ -111,6 +111,16 @@ export default {
required: false,
default: false,
},
+ showCommentToolBar: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
+ restrictedToolBarItems: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
@@ -331,7 +341,7 @@ export default {
:enable-preview="enablePreview"
:show-suggest-popover="showSuggestPopover"
:suggestion-start-index="suggestionsStartIndex"
- data-testid="markdownHeader"
+ :restricted-tool-bar-items="restrictedToolBarItems"
@preview-markdown="showPreviewTab"
@write-markdown="showWriteTab"
@handleSuggestDismissed="() => $emit('handleSuggestDismissed')"
@@ -350,6 +360,7 @@ export default {
:markdown-docs-path="markdownDocsPath"
:quick-actions-docs-path="quickActionsDocsPath"
:can-attach-file="canAttachFile"
+ :show-comment-tool-bar="showCommentToolBar"
/>
</div>
</div>
@@ -362,8 +373,6 @@ export default {
<suggestions
v-if="hasSuggestion"
:note-html="markdownPreview"
- :from-line="lineNumber"
- :from-content="lineContent"
:line-type="lineType"
:disabled="true"
:suggestions="suggestions"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue
index d0bd5046bf0..ba2b5eaa4f9 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/header.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue
@@ -54,6 +54,11 @@ export default {
required: false,
default: true,
},
+ restrictedToolBarItems: {
+ type: Array,
+ required: false,
+ default: () => [],
+ },
},
data() {
return {
@@ -193,7 +198,10 @@ export default {
<toolbar-button
tag="**"
:button-title="
- sprintf(s__('MarkdownEditor|Add bold text (%{modifierKey}B)'), { modifierKey })
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add bold text (%{modifierKey}B)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
"
:shortcuts="$options.shortcuts.bold"
icon="bold"
@@ -201,22 +209,28 @@ export default {
<toolbar-button
tag="_"
:button-title="
- sprintf(s__('MarkdownEditor|Add italic text (%{modifierKey}I)'), { modifierKey })
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add italic text (%{modifierKey}I)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
"
:shortcuts="$options.shortcuts.italic"
icon="italic"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('strikethrough')"
tag="~~"
:button-title="
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
sprintf(s__('MarkdownEditor|Add strikethrough text (%{modifierKey}⇧X)'), {
- modifierKey,
+ modifierKey /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */,
})
"
:shortcuts="$options.shortcuts.strikethrough"
icon="strikethrough"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('quote')"
:prepend="true"
:tag="tag"
:button-title="__('Insert a quote')"
@@ -266,30 +280,37 @@ export default {
tag="[{text}](url)"
tag-select="url"
:button-title="
- sprintf(s__('MarkdownEditor|Add a link (%{modifierKey}K)'), { modifierKey })
+ /* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */
+ sprintf(s__('MarkdownEditor|Add a link (%{modifierKey}K)'), {
+ modifierKey,
+ }) /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */
"
:shortcuts="$options.shortcuts.link"
icon="link"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('bullet-list')"
:prepend="true"
tag="- "
:button-title="__('Add a bullet list')"
icon="list-bulleted"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('numbered-list')"
:prepend="true"
tag="1. "
:button-title="__('Add a numbered list')"
icon="list-numbered"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('task-list')"
:prepend="true"
tag="- [ ] "
:button-title="__('Add a task list')"
icon="list-task"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('collapsible-section')"
:tag="mdCollapsibleSection"
:prepend="true"
tag-select="Click to expand"
@@ -297,12 +318,14 @@ export default {
icon="details-block"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('table')"
:tag="mdTable"
:prepend="true"
:button-title="__('Add a table')"
icon="table"
/>
<toolbar-button
+ v-if="!restrictedToolBarItems.includes('full-screen')"
class="js-zen-enter"
:prepend="true"
:button-title="__('Go full screen')"
diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
index f1c293c87f4..6c99a749edc 100644
--- a/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
+++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar.vue
@@ -24,6 +24,11 @@ export default {
required: false,
default: true,
},
+ showCommentToolBar: {
+ type: Boolean,
+ required: false,
+ default: true,
+ },
},
computed: {
hasQuickActionsDocsPath() {
@@ -34,24 +39,33 @@ export default {
</script>
<template>
- <div class="comment-toolbar clearfix">
+ <div v-if="showCommentToolBar" class="comment-toolbar clearfix">
<div class="toolbar-text">
<template v-if="!hasQuickActionsDocsPath && markdownDocsPath">
- <gl-link :href="markdownDocsPath" target="_blank">
- {{ __('Markdown is supported') }}
- </gl-link>
+ <gl-sprintf
+ :message="
+ s__('MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}')
+ "
+ >
+ <template #markdownDocsLink="{ content }">
+ <gl-link :href="markdownDocsPath" target="_blank">{{ content }}</gl-link>
+ </template>
+ </gl-sprintf>
</template>
<template v-if="hasQuickActionsDocsPath && markdownDocsPath">
<gl-sprintf
:message="
- __(
- '%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported',
+ s__(
+ 'NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}.',
)
"
>
<template #markdownDocsLink="{ content }">
<gl-link :href="markdownDocsPath" target="_blank">{{ content }}</gl-link>
</template>
+ <template #keyboard="{ content }">
+ <kbd>{{ content }}</kbd>
+ </template>
<template #quickActionsDocsLink="{ content }">
<gl-link :href="quickActionsDocsPath" target="_blank">{{ content }}</gl-link>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue
index 3e796a73f72..e23721da223 100644
--- a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue
+++ b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_tab.vue
@@ -90,7 +90,9 @@ export default {
modal-id="upload-metric-modal"
size="sm"
:action-primary="actionPrimaryProps"
- :action-cancel="{ text: $options.i18n.modalCancel }"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: $options.i18n.modalCancel,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:title="$options.i18n.modalTitle"
:visible="modalVisible"
@hidden="clearInputs"
diff --git a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue
index 8eb8e52728d..bbbaaeb8a9e 100644
--- a/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue
+++ b/app/assets/javascripts/vue_shared/components/metric_images/metric_images_table.vue
@@ -159,7 +159,9 @@ export default {
size="sm"
:visible="modalVisible"
:action-primary="deleteActionPrimaryProps"
- :action-cancel="{ text: $options.i18n.modalCancel }"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: $options.i18n.modalCancel,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
@primary.prevent="onDelete"
@hidden="resetEditFields"
>
@@ -177,7 +179,9 @@ export default {
modal-id="edit-metric-modal"
size="sm"
:action-primary="updateActionPrimaryProps"
- :action-cancel="{ text: $options.i18n.modalCancel }"
+ :action-cancel="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ text: $options.i18n.modalCancel,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:visible="editModalVisible"
data-testid="metric-image-edit-modal"
@hidden="resetEditFields"
diff --git a/app/assets/javascripts/vue_shared/components/navigation_tabs.vue b/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
index a069d1cd756..21212e82de4 100644
--- a/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
+++ b/app/assets/javascripts/vue_shared/components/navigation_tabs.vue
@@ -61,7 +61,9 @@ export default {
v-for="(tab, i) in tabs"
:key="i"
:title-link-class="`js-${scope}-tab-${tab.scope} gl-display-inline-flex`"
- :title-link-attributes="{ 'data-testid': `${scope}-tab-${tab.scope}` }"
+ :title-link-attributes="/* eslint-disable @gitlab/vue-no-new-non-primitive-in-template */ {
+ 'data-testid': `${scope}-tab-${tab.scope}`,
+ } /* eslint-enable @gitlab/vue-no-new-non-primitive-in-template */"
:active="tab.isActive"
@click="onTabClick(tab)"
>
diff --git a/app/assets/javascripts/vue_shared/components/paginated_list.vue b/app/assets/javascripts/vue_shared/components/paginated_list.vue
index e19b8510399..ddc7a457b98 100644
--- a/app/assets/javascripts/vue_shared/components/paginated_list.vue
+++ b/app/assets/javascripts/vue_shared/components/paginated_list.vue
@@ -29,7 +29,7 @@ export default {
</template>
<template #default="{ listItem, query }">
- <slot :listItem="listItem" :query="query"></slot>
+ <slot :list-item="listItem" :query="query"></slot>
</template>
</gl-paginated-list>
</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 6bb321713d5..a8b250f2041 100644
--- a/app/assets/javascripts/vue_shared/components/registry/list_item.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/list_item.vue
@@ -32,7 +32,6 @@ export default {
return {
'gl-border-t-transparent': !this.first && !this.selected,
'gl-border-t-gray-100': this.first && !this.selected,
- 'gl-opacity-5': this.disabled,
'gl-border-b-gray-100': !this.selected,
'gl-bg-blue-50 gl-border-blue-200': this.selected,
};
diff --git a/app/assets/javascripts/vue_shared/components/registry/registry_search.vue b/app/assets/javascripts/vue_shared/components/registry/registry_search.vue
index 767a108dde5..da68fe961a6 100644
--- a/app/assets/javascripts/vue_shared/components/registry/registry_search.vue
+++ b/app/assets/javascripts/vue_shared/components/registry/registry_search.vue
@@ -116,6 +116,7 @@ export default {
@clear="clearSearch"
/>
<gl-sorting
+ data-testid="registry-sort-dropdown"
:text="sortText"
:is-ascending="isSortAscending"
@sortDirectionChange="onDirectionChange"
diff --git a/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue b/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
index d5493aa5a66..9eaaf7d1c18 100644
--- a/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
+++ b/app/assets/javascripts/vue_shared/components/runner_instructions/runner_instructions_modal.vue
@@ -50,6 +50,11 @@ export default {
required: false,
default: null,
},
+ defaultPlatformName: {
+ type: String,
+ required: false,
+ default: null,
+ },
},
apollo: {
platforms: {
@@ -64,9 +69,10 @@ export default {
});
},
result() {
- // Select first platform by default
- if (this.platforms?.[0]) {
- this.selectPlatform(this.platforms[0]);
+ if (this.platforms.length) {
+ // If it is set and available, select the defaultSelectedPlatform.
+ // Otherwise, select the first available platform
+ this.selectPlatform(this.defaultPlatform() || this.platforms[0]);
}
},
error() {
@@ -138,6 +144,14 @@ export default {
show() {
this.$refs.modal.show();
},
+ focusSelected() {
+ // By default the first platform always gets the focus, but when the `defaultPlatformName`
+ // property is present, any other platform might actually be selected.
+ this.$refs[this.selectedPlatformName]?.[0].$el.focus();
+ },
+ defaultPlatform() {
+ return this.platforms.find((platform) => platform.name === this.defaultPlatformName);
+ },
selectPlatform(platform) {
this.selectedPlatform = platform;
@@ -182,6 +196,8 @@ export default {
:title="$options.i18n.installARunner"
:action-secondary="$options.closeButton"
v-bind="$attrs"
+ v-on="$listeners"
+ @shown="focusSelected"
>
<gl-alert v-if="showAlert" variant="danger" @dismiss="toggleAlert(false)">
{{ $options.i18n.fetchError }}
@@ -203,6 +219,7 @@ export default {
<gl-button
v-for="platform in platforms"
:key="platform.name"
+ :ref="platform.name"
:selected="selectedPlatform && selectedPlatform.name === platform.name"
@click="selectPlatform(platform)"
>
diff --git a/app/assets/javascripts/vue_shared/components/segmented_control_button_group.vue b/app/assets/javascripts/vue_shared/components/segmented_control_button_group.vue
new file mode 100644
index 00000000000..f50706b6de8
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/segmented_control_button_group.vue
@@ -0,0 +1,35 @@
+<script>
+import { GlButtonGroup, GlButton } from '@gitlab/ui';
+
+// TODO: We're planning to move this component to GitLab UI
+// https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1787
+export default {
+ components: {
+ GlButtonGroup,
+ GlButton,
+ },
+ props: {
+ options: {
+ type: Array,
+ required: true,
+ },
+ value: {
+ type: [String, Number, Boolean],
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <gl-button-group>
+ <gl-button
+ v-for="opt in options"
+ :key="opt.value"
+ :disabled="!!opt.disabled"
+ :selected="value === opt.value"
+ @click="$emit('input', opt.value)"
+ >
+ <slot name="button-content" v-bind="opt">{{ opt.text }}</slot>
+ </gl-button>
+ </gl-button-group>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue b/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
index 12daaea8758..dfa2ca2d20c 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/issuable_move_dropdown.vue
@@ -175,7 +175,7 @@ export default {
:debounce="300"
/>
<div data-testid="content" class="dropdown-content">
- <gl-loading-icon v-if="projectsListLoading" size="md" class="gl-p-5" />
+ <gl-loading-icon v-if="projectsListLoading" size="lg" class="gl-p-5" />
<ul v-else>
<gl-dropdown-item
v-for="project in projects"
@@ -199,7 +199,7 @@ export default {
>
<gl-button
category="primary"
- variant="success"
+ variant="confirm"
:disabled="!Boolean(selectedProject)"
class="gl-text-center! issuable-move-button"
@click="handleMoveClick"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
index 3ec33a653b8..2cccb8325f4 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_create_view.vue
@@ -104,7 +104,7 @@ export default {
<gl-button
:disabled="disableCreate"
category="primary"
- variant="success"
+ variant="confirm"
class="float-left d-flex align-items-center"
@click="handleCreateClick"
>
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
index 623e7799493..134575b7a27 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
@@ -185,7 +185,7 @@ export default {
<gl-loading-icon
v-if="labelsFetchInProgress"
class="labels-fetch-loading gl-align-items-center w-100 h-100"
- size="md"
+ size="lg"
/>
<ul v-else class="list-unstyled gl-mb-0 gl-word-break-word">
<label-item
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
index 7989ad40b5a..e91a0489ef1 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_title.vue
@@ -23,7 +23,7 @@ export default {
</script>
<template>
- <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900">
+ <div class="hide-collapsed gl-line-height-20 gl-mb-2 gl-text-gray-900 gl-font-weight-bold">
{{ __('Labels') }}
<template v-if="allowLabelEdit">
<gl-loading-icon v-show="labelsSelectInProgress" size="sm" inline />
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
index 88977652556..090bf9493bf 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
@@ -179,7 +179,7 @@ export default {
<gl-button
:disabled="disableCreate"
category="primary"
- variant="success"
+ variant="confirm"
class="gl-display-flex gl-align-items-center"
data-testid="create-button"
@click="createLabel"
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
index ae179ef93c7..f595e635f2c 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
@@ -147,7 +147,7 @@ export default {
<gl-loading-icon
v-if="labelsFetchInProgress"
class="labels-fetch-loading gl-align-items-center gl-w-full gl-h-full gl-mb-3"
- size="md"
+ size="lg"
/>
<template v-else>
<gl-dropdown-item
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue
index 1b8e4bcfec6..c30ca5369ee 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/components/chunk_line.vue
@@ -36,6 +36,9 @@ export default {
return content;
},
+ firstLineClass() {
+ return { 'gl-mt-3!': this.number === 1 };
+ },
},
methods: {
wrapBidiChar(bidiChar) {
@@ -56,10 +59,11 @@ export default {
</script>
<template>
<div class="gl-display-flex">
- <div class="line-numbers gl-pt-0! gl-pb-0! gl-absolute gl-z-index-3">
+ <div class="gl-p-0! gl-absolute gl-z-index-3 gl-border-r diff-line-num line-numbers">
<gl-link
:id="`L${number}`"
- class="file-line-num diff-line-num gl-user-select-none"
+ class="gl-user-select-none gl-ml-5 gl-pr-3 gl-shadow-none! file-line-num diff-line-num"
+ :class="firstLineClass"
:to="`#L${number}`"
:data-line-number="number"
>
@@ -68,7 +72,8 @@ export default {
</div>
<pre
- class="code highlight gl-p-0! gl-w-full gl-overflow-visible! gl-ml-11!"
+ class="gl-p-0! gl-w-full gl-overflow-visible! gl-ml-11! gl-border-none! code highlight"
+ :class="firstLineClass"
><code><span :id="`LC${number}`" v-safe-html="formattedContent" :lang="language" class="line" data-testid="content"></span></code></pre>
</div>
</template>
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 edf2229a9a1..ed87a202b15 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
@@ -2,6 +2,7 @@
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 Chunk from './components/chunk.vue';
@@ -129,7 +130,7 @@ export default {
let languageDefinition;
try {
- languageDefinition = await import(`highlight.js/lib/languages/${this.language}`);
+ languageDefinition = await languageLoader[this.language]();
this.hljs.registerLanguage(this.language, languageDefinition.default);
} catch (message) {
this.$emit('error', message);
diff --git a/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue b/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
index e784bba6698..0d466df1b7f 100644
--- a/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
+++ b/app/assets/javascripts/vue_shared/components/time_ago_tooltip.vue
@@ -42,6 +42,6 @@ export default {
:class="cssClass"
:title="tooltipTitle(time)"
:datetime="time"
- ><slot :timeAgo="timeAgo">{{ timeAgo }}</slot></time
+ ><slot :time-ago="timeAgo">{{ timeAgo }}</slot></time
>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
index 62de76e46b5..f62bf686f85 100644
--- a/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
+++ b/app/assets/javascripts/vue_shared/components/upload_dropzone/upload_dropzone.vue
@@ -160,7 +160,7 @@ export default {
>
<gl-icon name="upload" :size="iconStyles.size" :class="iconStyles.class" />
<p class="gl-mb-0" data-testid="upload-text">
- <slot name="upload-text" :openFileUpload="openFileUpload">
+ <slot name="upload-text" :open-file-upload="openFileUpload">
<gl-sprintf
:message="
singleFileSelection
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
new file mode 100644
index 00000000000..bc5e0cf10dd
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/usage_quotas/usage_banner.vue
@@ -0,0 +1,68 @@
+<script>
+import { GlSkeletonLoader } from '@gitlab/ui';
+import { helpPagePath } from '~/helpers/help_page_helper';
+import { s__ } from '~/locale';
+
+export default {
+ name: 'UsageBanner',
+ components: {
+ GlSkeletonLoader,
+ },
+ props: {
+ loading: {
+ type: Boolean,
+ required: false,
+ 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>
+<template>
+ <div class="gl-display-flex gl-flex-direction-column">
+ <div class="gl-display-flex gl-align-items-center gl-py-3">
+ <div
+ class="gl-display-flex gl-xs-flex-direction-column gl-justify-content-space-between gl-align-items-stretch gl-flex-grow-1"
+ >
+ <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']"
+ class="gl-display-flex gl-align-items-center gl-text-body gl-font-weight-bold gl-min-h-6 gl-min-w-0 gl-mb-4"
+ >
+ <slot name="left-primary-text"></slot>
+ </div>
+ <div
+ v-if="$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>
+ </div>
+ </div>
+ <div
+ 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']"
+ 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']"
+ class="gl-display-flex gl-align-items-center gl-min-h-6"
+ >
+ <slot v-if="!loading" name="right-secondary-text"></slot>
+ <gl-skeleton-loader v-else :width="60" :lines="1" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
index cac8f0a9aa5..ec7a7cd72ae 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
@@ -6,9 +6,13 @@ import {
GlIcon,
GlSafeHtmlDirective,
GlSprintf,
+ GlButton,
} 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';
const MAX_SKELETON_LINES = 4;
@@ -24,6 +28,7 @@ export default {
UserAvatarImage,
UserNameWithStatus,
GlSprintf,
+ GlButton,
},
directives: {
SafeHtml: GlSafeHtmlDirective,
@@ -38,6 +43,16 @@ export default {
required: true,
default: null,
},
+ placement: {
+ type: String,
+ required: false,
+ default: 'top',
+ },
+ },
+ data() {
+ return {
+ toggleFollowLoading: false,
+ };
},
computed: {
statusHtml() {
@@ -59,6 +74,59 @@ export default {
availabilityStatus() {
return this.user?.status?.availability || '';
},
+ isNotCurrentUser() {
+ return !this.userIsLoading && this.user.username !== gon.current_username;
+ },
+ shouldRenderToggleFollowButton() {
+ return this.isNotCurrentUser && typeof this.user?.isFollowed !== 'undefined';
+ },
+ toggleFollowButtonText() {
+ if (this.toggleFollowLoading) return null;
+
+ return this.user?.isFollowed ? __('Unfollow') : __('Follow');
+ },
+ toggleFollowButtonVariant() {
+ return this.user?.isFollowed ? 'default' : 'confirm';
+ },
+ },
+ methods: {
+ async toggleFollow() {
+ if (this.user.isFollowed) {
+ this.unfollow();
+ } else {
+ this.follow();
+ }
+ },
+ async follow() {
+ this.toggleFollowLoading = true;
+ try {
+ await followUser(this.user.id);
+ this.$emit('follow');
+ } catch (error) {
+ createFlash({
+ message: __('An error occurred while trying to follow this user, please try again.'),
+ error,
+ captureError: true,
+ });
+ } finally {
+ this.toggleFollowLoading = false;
+ }
+ },
+ async unfollow() {
+ this.toggleFollowLoading = true;
+ try {
+ await unfollowUser(this.user.id);
+ this.$emit('unfollow');
+ } catch (error) {
+ createFlash({
+ message: __('An error occurred while trying to unfollow this user, please try again.'),
+ error,
+ captureError: true,
+ });
+ } finally {
+ this.toggleFollowLoading = false;
+ }
+ },
},
safeHtmlConfig: { ADD_TAGS: ['gl-emoji'] },
};
@@ -66,12 +134,24 @@ export default {
<template>
<!-- 200ms delay so not every mouseover triggers Popover -->
- <gl-popover :target="target" :delay="200" boundary="viewport" placement="top">
+ <gl-popover :target="target" :delay="200" :placement="placement" boundary="viewport">
<div class="gl-p-3 gl-line-height-normal gl-display-flex" data-testid="user-popover">
- <div class="gl-p-2 flex-shrink-1">
- <user-avatar-image :img-src="user.avatarUrl" :size="64" css-classes="gl-mr-3!" />
+ <div
+ class="gl-p-2 flex-shrink-1 gl-display-flex gl-flex-direction-column align-items-center gl-w-70p"
+ >
+ <user-avatar-image :img-src="user.avatarUrl" :size="64" css-classes="gl-m-0!" />
+ <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>
- <div class="gl-p-2 gl-w-full gl-min-w-0">
+ <div class="gl-w-full gl-min-w-0 gl-word-break-word">
<template v-if="userIsLoading">
<gl-skeleton-loader
:lines="$options.maxSkeletonLines"
@@ -94,7 +174,7 @@ export default {
<div class="gl-text-gray-500">
<div v-if="user.bio" class="gl-display-flex gl-mb-2">
<gl-icon name="profile" class="gl-flex-shrink-0" />
- <span ref="bio" class="gl-ml-2 gl-overflow-hidden">{{ user.bio }}</span>
+ <span ref="bio" class="gl-ml-2">{{ user.bio }}</span>
</div>
<div v-if="user.workInformation" class="gl-display-flex gl-mb-2">
<gl-icon name="work" class="gl-flex-shrink-0" />
diff --git a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
index 9df5254155e..91f20863089 100644
--- a/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
+++ b/app/assets/javascripts/vue_shared/components/user_select/user_select.vue
@@ -298,7 +298,7 @@ export default {
<gl-loading-icon
v-if="isLoading"
data-testid="loading-participants"
- size="md"
+ size="lg"
class="gl-absolute gl-left-0 gl-top-0 gl-right-0"
/>
<template v-else>
diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js
index 9cb66f6e65f..3ebeec4a50b 100644
--- a/app/assets/javascripts/vue_shared/constants.js
+++ b/app/assets/javascripts/vue_shared/constants.js
@@ -1,4 +1,5 @@
-import { __ } from '~/locale';
+import { __, sprintf } from '~/locale';
+import { IssuableType, WorkspaceType } from '~/issues/constants';
const INTERVALS = {
minute: 'minute',
@@ -66,3 +67,14 @@ export const getTimeWindow = (timeWindowName) =>
export const AVATAR_SHAPE_OPTION_CIRCLE = 'circle';
export const AVATAR_SHAPE_OPTION_RECT = 'rect';
+
+export const confidentialityInfoText = (workspaceType, issuableType) =>
+ sprintf(
+ __(
+ 'Only %{workspaceType} members with at least Reporter role can view or be notified about this %{issuableType}.',
+ ),
+ {
+ workspaceType: workspaceType === WorkspaceType.project ? __('project') : __('group'),
+ issuableType: issuableType === IssuableType.Issue ? __('issue') : __('epic'),
+ },
+ );
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 c216a05bdb0..0758cb507e9 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
@@ -1,5 +1,5 @@
<script>
-import { GlForm, GlFormInput } from '@gitlab/ui';
+import { GlForm, GlFormInput, GlFormGroup } from '@gitlab/ui';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_vue/constants';
import LabelsSelect from '~/vue_shared/components/sidebar/labels_select_vue/labels_select_root.vue';
@@ -9,6 +9,7 @@ export default {
components: {
GlForm,
GlFormInput,
+ GlFormGroup,
MarkdownField,
LabelsSelect,
},
@@ -37,6 +38,7 @@ export default {
selectedLabels: [],
};
},
+ computed: {},
methods: {
handleUpdateSelectedLabels(labels) {
if (labels.length) {
@@ -52,12 +54,15 @@ export default {
<div data-testid="issuable-title" class="form-group row">
<label for="issuable-title" class="col-form-label col-sm-2">{{ __('Title') }}</label>
<div class="col-sm-10">
- <gl-form-input
- id="issuable-title"
- v-model="issuableTitle"
- :autofocus="true"
- :placeholder="__('Title')"
- />
+ <gl-form-group :description="__('Maximum of 255 characters')">
+ <gl-form-input
+ id="issuable-title"
+ v-model="issuableTitle"
+ maxlength="255"
+ :autofocus="true"
+ :placeholder="__('Title')"
+ />
+ </gl-form-group>
</div>
</div>
<div data-testid="issuable-description" class="form-group row">
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 8008b85bbdb..6453290f6ea 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
@@ -55,7 +55,7 @@ export default {
return createdSecondsAgo < SECONDS_IN_DAY;
},
author() {
- return this.issuable.author;
+ return this.issuable.author || {};
},
webUrl() {
return this.issuable.gitlabWebUrl || this.issuable.webUrl;
@@ -215,7 +215,7 @@ export default {
<span class="gl-display-none gl-sm-display-inline">
<span aria-hidden="true">&middot;</span>
<span class="issuable-authored gl-mr-3">
- <gl-sprintf :message="__('created %{timeAgo} by %{author}')">
+ <gl-sprintf v-if="author.name" :message="__('created %{timeAgo} by %{author}')">
<template #timeAgo>
<span
v-gl-tooltip.bottom
@@ -241,6 +241,17 @@ export default {
</gl-link>
</template>
</gl-sprintf>
+ <gl-sprintf v-else :message="__('created %{timeAgo}')">
+ <template #timeAgo>
+ <span
+ v-gl-tooltip.bottom
+ :title="tooltipTitle(issuable.createdAt)"
+ data-testid="issuable-created-at"
+ >
+ {{ createdAt }}
+ </span>
+ </template>
+ </gl-sprintf>
</span>
<slot name="timeframe"></slot>
</span>
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 20f178dfb7d..8b293b2e9f6 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
@@ -168,6 +168,11 @@ export default {
required: false,
default: '',
},
+ syncFilterAndSort: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
data() {
return {
@@ -282,6 +287,7 @@ export default {
:sort-options="sortOptions"
:initial-filter-value="initialFilterValue"
:initial-sort-by="initialSortBy"
+ :sync-filter-and-sort="syncFilterAndSort"
:show-checkbox="showBulkEditSidebar"
:checkbox-checked="allIssuablesChecked"
class="gl-flex-grow-1 gl-border-t-none row-content-block"
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 ee7e113af72..649dbd6576b 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
@@ -1,14 +1,23 @@
<script>
-import { GlIcon, GlButton, GlTooltipDirective, GlAvatarLink, GlAvatarLabeled } from '@gitlab/ui';
+import {
+ GlIcon,
+ GlBadge,
+ GlButton,
+ GlTooltipDirective,
+ GlAvatarLink,
+ GlAvatarLabeled,
+} from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { isExternal } from '~/lib/utils/url_utility';
import { n__, sprintf } from '~/locale';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
+import { IssuableStates } from '~/vue_shared/issuable/list/constants';
export default {
components: {
GlIcon,
+ GlBadge,
GlButton,
GlAvatarLink,
GlAvatarLabeled,
@@ -26,6 +35,11 @@ export default {
type: Object,
required: true,
},
+ issuableState: {
+ type: String,
+ required: false,
+ default: '',
+ },
statusBadgeClass: {
type: String,
required: false,
@@ -36,6 +50,11 @@ export default {
required: false,
default: '',
},
+ statusIconClass: {
+ type: String,
+ required: false,
+ default: '',
+ },
blocked: {
type: Boolean,
required: false,
@@ -53,6 +72,9 @@ export default {
},
},
computed: {
+ badgeVariant() {
+ return this.issuableState === IssuableStates.Opened ? 'success' : 'info';
+ },
authorId() {
return getIdFromGraphQLId(`${this.author.id}`);
},
@@ -71,6 +93,9 @@ export default {
{ completedCount, count },
);
},
+ hasTasks() {
+ return this.taskCompletionStatus.count > 0;
+ },
},
mounted() {
this.toggleSidebarButtonEl = document.querySelector('.js-toggle-right-sidebar-button');
@@ -88,10 +113,15 @@ export default {
<template>
<div class="detail-page-header">
<div class="detail-page-header-body">
- <div data-testid="status" class="issuable-status-box status-box" :class="statusBadgeClass">
- <gl-icon v-if="statusIcon" :name="statusIcon" class="d-block d-sm-none" />
- <span class="d-none d-sm-block"><slot name="status-badge"></slot></span>
- </div>
+ <gl-badge
+ data-testid="status"
+ class="issuable-status-badge gl-mr-3"
+ :class="statusBadgeClass"
+ :variant="badgeVariant"
+ >
+ <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 v-if="blocked || confidential" class="gl-display-inline-block">
<div v-if="blocked" data-testid="blocked" class="issuable-warning-icon inline">
@@ -128,7 +158,7 @@ export default {
<strong class="author d-sm-none d-inline">@{{ author.username }}</strong>
</gl-avatar-link>
<span
- v-if="taskCompletionStatus"
+ v-if="taskCompletionStatus && hasTasks"
data-testid="task-status"
class="gl-display-none gl-md-display-block gl-lg-display-inline-block"
>{{ taskStatusString }}</span
diff --git a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_show_root.vue b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_show_root.vue
index 8849af2a52e..c165ee91c59 100644
--- a/app/assets/javascripts/vue_shared/issuable/show/components/issuable_show_root.vue
+++ b/app/assets/javascripts/vue_shared/issuable/show/components/issuable_show_root.vue
@@ -27,6 +27,11 @@ export default {
required: false,
default: '',
},
+ statusIconClass: {
+ type: String,
+ required: false,
+ default: '',
+ },
enableEdit: {
type: Boolean,
required: false,
@@ -102,8 +107,10 @@ export default {
<template>
<div class="issuable-show-container" data-qa-selector="issuable_show_container">
<issuable-header
+ :issuable-state="issuable.state"
:status-badge-class="statusBadgeClass"
:status-icon="statusIcon"
+ :status-icon-class="statusIconClass"
:blocked="issuable.blocked"
:confidential="issuable.confidential"
:created-at="issuable.createdAt"
@@ -122,6 +129,7 @@ export default {
:issuable="issuable"
:status-badge-class="statusBadgeClass"
:status-icon="statusIcon"
+ :status-icon-class="statusIconClass"
:enable-edit="enableEdit"
:enable-autocomplete="enableAutocomplete"
:enable-autosave="enableAutosave"
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 45941174a62..47f05a2cee2 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
@@ -86,7 +86,7 @@ export default {
>
<p
data-testid="status"
- class="issuable-status-box status-box gl-my-0"
+ class="issuable-status-box status-box gl-white-space-nowrap gl-my-0"
:class="statusBadgeClass"
>
<gl-icon :name="statusIcon" class="gl-display-block d-sm-none gl-h-6!" />
diff --git a/app/assets/javascripts/vue_shared/mixins/timeago.js b/app/assets/javascripts/vue_shared/mixins/timeago.js
index c5f41d81167..2a0256548a8 100644
--- a/app/assets/javascripts/vue_shared/mixins/timeago.js
+++ b/app/assets/javascripts/vue_shared/mixins/timeago.js
@@ -1,4 +1,4 @@
-import { formatDate, getTimeago } from '~/lib/utils/datetime_utility';
+import { formatDate, getTimeago, timeagoLanguageCode } from '~/lib/utils/datetime_utility';
/**
* Mixin with time ago methods used in some vue components
@@ -8,7 +8,7 @@ export default {
timeFormatted(time) {
const timeago = getTimeago();
- return timeago.format(time);
+ return timeago.format(time, timeagoLanguageCode);
},
tooltipTitle(time) {
diff --git a/app/assets/javascripts/vue_shared/security_configuration/components/section_layout.vue b/app/assets/javascripts/vue_shared/security_configuration/components/section_layout.vue
new file mode 100644
index 00000000000..6045d75ac11
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/security_configuration/components/section_layout.vue
@@ -0,0 +1,34 @@
+<script>
+import SectionLoader from './section_loader.vue';
+
+export default {
+ name: 'SectionLayout',
+ components: {
+ SectionLoader,
+ },
+ props: {
+ heading: {
+ type: String,
+ required: true,
+ },
+ isLoading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="row gl-m-0 gl-border-b gl-line-height-20 gl-py-6">
+ <div class="col-lg-4 gl-pl-0 gl-pr-9">
+ <h2 class="gl-font-size-h2 gl-mt-0">{{ heading }}</h2>
+ <slot name="description"></slot>
+ </div>
+ <div class="col-lg-8 gl-pr-0 gl-pl-0">
+ <section-loader v-if="isLoading" />
+ <slot v-else name="features"></slot>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/security_configuration/components/section_loader.vue b/app/assets/javascripts/vue_shared/security_configuration/components/section_loader.vue
new file mode 100644
index 00000000000..b15e25b0943
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/security_configuration/components/section_loader.vue
@@ -0,0 +1,35 @@
+<script>
+import { GlCard, GlSkeletonLoader } from '@gitlab/ui';
+
+export default {
+ name: 'SectionLoader',
+ components: {
+ GlCard,
+ GlSkeletonLoader,
+ },
+};
+</script>
+
+<template>
+ <div>
+ <gl-skeleton-loader :width="1248" :height="180">
+ <rect x="0" y="0" width="100" height="15" rx="4" />
+ <rect x="0" y="24" width="460" height="32" rx="4" />
+ <rect x="0" y="71" width="100" height="15" rx="4" />
+ <rect x="0" y="95" width="460" height="72" rx="4" />
+ </gl-skeleton-loader>
+ <gl-card v-for="i in 2" :key="i" class="gl-mb-5">
+ <template #header>
+ <gl-skeleton-loader :width="1248" :height="15">
+ <rect x="0" y="0" width="300" height="15" rx="4" />
+ </gl-skeleton-loader>
+ </template>
+ <gl-skeleton-loader :width="1248" :height="15">
+ <rect x="0" y="0" width="600" height="15" rx="4" />
+ </gl-skeleton-loader>
+ <gl-skeleton-loader :width="1248" :height="15">
+ <rect x="0" y="0" width="300" height="15" rx="4" />
+ </gl-skeleton-loader>
+ </gl-card>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/security_reports/store/utils.js b/app/assets/javascripts/vue_shared/security_reports/store/utils.js
index 458bacce915..6a4f671abb9 100644
--- a/app/assets/javascripts/vue_shared/security_reports/store/utils.js
+++ b/app/assets/javascripts/vue_shared/security_reports/store/utils.js
@@ -90,7 +90,7 @@ const createStatusMessage = ({ reportType, status, total }) => {
if (status) {
message = __('%{reportType} %{status}');
} else if (!total) {
- message = __('%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities.');
+ message = __('%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities.');
} else {
message = __(
'%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}',
diff --git a/app/assets/javascripts/whats_new/components/feature.vue b/app/assets/javascripts/whats_new/components/feature.vue
index a93bda326de..90f6230ef72 100644
--- a/app/assets/javascripts/whats_new/components/feature.vue
+++ b/app/assets/javascripts/whats_new/components/feature.vue
@@ -37,9 +37,11 @@ export default {
<template>
<div class="gl-py-6 gl-px-6 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100">
<gl-link
+ v-if="feature.image_url"
:href="feature.url"
target="_blank"
class="gl-display-block"
+ data-testid="whats-new-image-link"
data-track-action="click_whats_new_item"
:data-track-label="feature.title"
:data-track-property="feature.url"
@@ -67,9 +69,11 @@ export default {
v-for="packageName in feature.packages"
:key="packageName"
size="md"
- class="whats-new-item-badge gl-mr-2"
+ variant="tier"
+ icon="license"
+ class="gl-mr-2"
>
- <gl-icon name="license" />{{ packageName }}
+ {{ packageName }}
</gl-badge>
</div>
<div
diff --git a/app/assets/javascripts/work_items/components/item_state.vue b/app/assets/javascripts/work_items/components/item_state.vue
new file mode 100644
index 00000000000..0b6c1a75bb2
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/item_state.vue
@@ -0,0 +1,62 @@
+<script>
+import { GlFormGroup, GlFormSelect } from '@gitlab/ui';
+import { __ } from '~/locale';
+import { STATE_OPEN, STATE_CLOSED } from '../constants';
+
+export default {
+ i18n: {
+ status: __('Status'),
+ },
+ states: [
+ {
+ value: STATE_OPEN,
+ text: __('Open'),
+ },
+ {
+ value: STATE_CLOSED,
+ text: __('Closed'),
+ },
+ ],
+ components: {
+ GlFormGroup,
+ GlFormSelect,
+ },
+ props: {
+ state: {
+ type: String,
+ required: true,
+ },
+ loading: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ computed: {
+ currentState() {
+ return this.$options.states[this.state];
+ },
+ },
+ methods: {
+ setState(newState) {
+ if (newState !== this.state) {
+ this.$emit('changed', newState);
+ }
+ },
+ },
+ labelId: 'work-item-state-select',
+};
+</script>
+
+<template>
+ <gl-form-group :label="$options.i18n.status" :label-for="$options.labelId">
+ <gl-form-select
+ :id="$options.labelId"
+ :value="state"
+ :options="$options.states"
+ :disabled="loading"
+ class="gl-w-auto"
+ @change="setState"
+ />
+ </gl-form-group>
+</template>
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 40b6fcdd204..31e4a932c5a 100644
--- a/app/assets/javascripts/work_items/components/work_item_actions.vue
+++ b/app/assets/javascripts/work_items/components/work_item_actions.vue
@@ -1,7 +1,7 @@
<script>
import { GlDropdown, GlDropdownItem, GlModal, GlModalDirective } from '@gitlab/ui';
import { s__ } from '~/locale';
-import deleteWorkItemMutation from '../graphql/delete_work_item.mutation.graphql';
+import Tracking from '~/tracking';
export default {
i18n: {
@@ -15,55 +15,36 @@ export default {
directives: {
GlModal: GlModalDirective,
},
+ mixins: [Tracking.mixin({ label: 'actions_menu' })],
props: {
workItemId: {
type: String,
required: false,
default: null,
},
- canUpdate: {
+ canDelete: {
type: Boolean,
required: false,
default: false,
},
},
- emits: ['workItemDeleted', 'error'],
+ emits: ['deleteWorkItem'],
methods: {
- deleteWorkItem() {
- this.$apollo
- .mutate({
- mutation: deleteWorkItemMutation,
- variables: {
- input: {
- id: this.workItemId,
- },
- },
- })
- .then(({ data: { workItemDelete, errors } }) => {
- if (errors?.length) {
- throw new Error(errors[0].message);
- }
-
- if (workItemDelete?.errors.length) {
- throw new Error(workItemDelete.errors[0]);
- }
-
- this.$emit('workItemDeleted');
- })
- .catch((e) => {
- this.$emit(
- 'error',
- e.message ||
- s__('WorkItem|Something went wrong when deleting the work item. Please try again.'),
- );
- });
+ handleDeleteWorkItem() {
+ this.track('click_delete_work_item');
+ this.$emit('deleteWorkItem');
+ },
+ handleCancelDeleteWorkItem({ trigger }) {
+ if (trigger !== 'ok') {
+ this.track('cancel_delete_work_item');
+ }
},
},
};
</script>
<template>
- <div v-if="canUpdate">
+ <div v-if="canDelete">
<gl-dropdown
icon="ellipsis_v"
text-sr-only
@@ -81,7 +62,8 @@ export default {
:title="$options.i18n.deleteWorkItem"
:ok-title="$options.i18n.deleteWorkItem"
ok-variant="danger"
- @ok="deleteWorkItem"
+ @ok="handleDeleteWorkItem"
+ @hide="handleCancelDeleteWorkItem"
>
{{
s__(
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 f2fb1e3ccbc..4222ffe42fe 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -1,15 +1,20 @@
<script>
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlSkeletonLoader } from '@gitlab/ui';
import { i18n } from '../constants';
import workItemQuery from '../graphql/work_item.query.graphql';
import workItemTitleSubscription from '../graphql/work_item_title.subscription.graphql';
+import WorkItemActions from './work_item_actions.vue';
+import WorkItemState from './work_item_state.vue';
import WorkItemTitle from './work_item_title.vue';
export default {
i18n,
components: {
GlAlert,
+ GlSkeletonLoader,
+ WorkItemActions,
WorkItemTitle,
+ WorkItemState,
},
props: {
workItemId: {
@@ -49,9 +54,18 @@ export default {
},
},
computed: {
+ workItemLoading() {
+ return this.$apollo.queries.workItem.loading;
+ },
workItemType() {
return this.workItem.workItemType?.name;
},
+ canUpdate() {
+ return this.workItem?.userPermissions?.updateWorkItem;
+ },
+ canDelete() {
+ return this.workItem?.userPermissions?.deleteWorkItem;
+ },
},
};
</script>
@@ -62,12 +76,35 @@ export default {
{{ error }}
</gl-alert>
- <work-item-title
- :loading="$apollo.queries.workItem.loading"
- :work-item-id="workItem.id"
- :work-item-title="workItem.title"
- :work-item-type="workItemType"
- @error="error = $event"
- />
+ <div v-if="workItemLoading" class="gl-max-w-26 gl-py-5">
+ <gl-skeleton-loader :height="65" :width="240">
+ <rect width="240" height="20" x="5" y="0" rx="4" />
+ <rect width="100" height="20" x="5" y="45" rx="4" />
+ </gl-skeleton-loader>
+ </div>
+ <template v-else>
+ <div class="gl-display-flex">
+ <work-item-title
+ :work-item-id="workItem.id"
+ :work-item-title="workItem.title"
+ :work-item-type="workItemType"
+ class="gl-mr-5"
+ @error="error = $event"
+ @updated="$emit('workItemUpdated')"
+ />
+ <work-item-actions
+ :work-item-id="workItem.id"
+ :can-delete="canDelete"
+ class="gl-ml-auto gl-mt-5"
+ @deleteWorkItem="$emit('deleteWorkItem')"
+ @error="error = $event"
+ />
+ </div>
+ <work-item-state
+ :work-item="workItem"
+ @error="error = $event"
+ @updated="$emit('workItemUpdated')"
+ />
+ </template>
</section>
</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 a79091fb8b2..172a40a6e56 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
@@ -1,42 +1,87 @@
<script>
-import { GlAlert, GlButton, GlModal } from '@gitlab/ui';
-import WorkItemActions from './work_item_actions.vue';
+import { GlAlert, GlModal } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import deleteWorkItemFromTaskMutation from '../graphql/delete_task_from_work_item.mutation.graphql';
import WorkItemDetail from './work_item_detail.vue';
export default {
components: {
GlAlert,
- GlButton,
GlModal,
WorkItemDetail,
- WorkItemActions,
},
props: {
- canUpdate: {
- type: Boolean,
+ workItemId: {
+ type: String,
required: false,
- default: false,
+ default: null,
},
- visible: {
- type: Boolean,
- required: true,
+ issueGid: {
+ type: String,
+ required: false,
+ default: '',
},
- workItemId: {
+ lockVersion: {
+ type: Number,
+ required: false,
+ default: null,
+ },
+ lineNumberStart: {
+ type: String,
+ required: false,
+ default: null,
+ },
+ lineNumberEnd: {
type: String,
required: false,
default: null,
},
},
- emits: ['workItemDeleted', 'close'],
+ emits: ['workItemDeleted', 'workItemUpdated', 'close'],
data() {
return {
error: undefined,
};
},
methods: {
- handleWorkItemDeleted() {
- this.$emit('workItemDeleted');
- this.closeModal();
+ deleteWorkItem() {
+ this.$apollo
+ .mutate({
+ mutation: deleteWorkItemFromTaskMutation,
+ variables: {
+ input: {
+ id: this.issueGid,
+ lockVersion: this.lockVersion,
+ taskData: {
+ id: this.workItemId,
+ lineNumberStart: Number(this.lineNumberStart),
+ lineNumberEnd: Number(this.lineNumberEnd),
+ },
+ },
+ },
+ })
+ .then(
+ ({
+ data: {
+ workItemDeleteTask: {
+ workItem: { descriptionHtml },
+ errors,
+ },
+ },
+ }) => {
+ if (errors?.length) {
+ throw new Error(errors[0].message);
+ }
+
+ this.$emit('workItemDeleted', descriptionHtml);
+ this.$refs.modal.hide();
+ },
+ )
+ .catch((e) => {
+ this.error =
+ e.message ||
+ s__('WorkItem|Something went wrong when deleting the work item. Please try again.');
+ });
},
closeModal() {
this.error = '';
@@ -45,37 +90,31 @@ export default {
setErrorMessage(message) {
this.error = message;
},
+ show() {
+ this.$refs.modal.show();
+ },
},
};
</script>
<template>
- <gl-modal hide-footer modal-id="work-item-detail-modal" :visible="visible" @hide="closeModal">
- <template #modal-header>
- <div class="gl-w-full gl-display-flex gl-align-items-center gl-justify-content-end">
- <h2 class="modal-title gl-mr-auto">{{ s__('WorkItem|Work Item') }}</h2>
- <work-item-actions
- :work-item-id="workItemId"
- :can-update="canUpdate"
- @workItemDeleted="handleWorkItemDeleted"
- @error="setErrorMessage"
- />
- <gl-button category="tertiary" icon="close" :aria-label="__('Close')" @click="closeModal" />
- </div>
- </template>
+ <gl-modal ref="modal" hide-footer size="lg" modal-id="work-item-detail-modal" @hide="closeModal">
<gl-alert v-if="error" variant="danger" @dismiss="error = false">
{{ error }}
</gl-alert>
- <work-item-detail :work-item-id="workItemId" />
+ <work-item-detail
+ :work-item-id="workItemId"
+ @deleteWorkItem="deleteWorkItem"
+ @workItemUpdated="$emit('workItemUpdated')"
+ />
</gl-modal>
</template>
<style>
-/* hide the existing close button until we can do it
- * with https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2710
+/* hide the existing modal header
*/
-#work-item-detail-modal .modal-header > .gl-button {
+#work-item-detail-modal .modal-header {
display: none;
}
</style>
diff --git a/app/assets/javascripts/work_items/components/work_item_state.vue b/app/assets/javascripts/work_items/components/work_item_state.vue
new file mode 100644
index 00000000000..51db4c804eb
--- /dev/null
+++ b/app/assets/javascripts/work_items/components/work_item_state.vue
@@ -0,0 +1,98 @@
+<script>
+import * as Sentry from '@sentry/browser';
+import Tracking from '~/tracking';
+import {
+ i18n,
+ STATE_OPEN,
+ STATE_CLOSED,
+ STATE_EVENT_CLOSE,
+ STATE_EVENT_REOPEN,
+} from '../constants';
+import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
+import ItemState from './item_state.vue';
+
+export default {
+ components: {
+ ItemState,
+ },
+ mixins: [Tracking.mixin()],
+ props: {
+ workItem: {
+ type: Object,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ updateInProgress: false,
+ };
+ },
+ computed: {
+ workItemType() {
+ return this.workItem.workItemType?.name;
+ },
+ tracking() {
+ return {
+ category: 'workItems:show',
+ label: 'item_state',
+ property: `type_${this.workItemType}`,
+ };
+ },
+ },
+ methods: {
+ async updateWorkItemState(newState) {
+ const stateEventMap = {
+ [STATE_OPEN]: STATE_EVENT_REOPEN,
+ [STATE_CLOSED]: STATE_EVENT_CLOSE,
+ };
+
+ const stateEvent = stateEventMap[newState];
+
+ await this.updateWorkItem(stateEvent);
+ },
+ async updateWorkItem(updatedState) {
+ if (!updatedState) {
+ return;
+ }
+
+ this.updateInProgress = true;
+
+ try {
+ this.track('updated_state');
+
+ const {
+ data: { workItemUpdate },
+ } = await this.$apollo.mutate({
+ mutation: updateWorkItemMutation,
+ variables: {
+ input: {
+ id: this.workItem.id,
+ stateEvent: updatedState,
+ },
+ },
+ });
+
+ if (workItemUpdate?.errors?.length) {
+ throw new Error(workItemUpdate.errors[0]);
+ }
+
+ this.$emit('updated');
+ } catch (error) {
+ this.$emit('error', i18n.updateError);
+ Sentry.captureException(error);
+ }
+
+ this.updateInProgress = false;
+ },
+ },
+};
+</script>
+
+<template>
+ <item-state
+ v-if="workItem.state"
+ :state="workItem.state"
+ :loading="updateInProgress"
+ @changed="updateWorkItemState"
+ />
+</template>
diff --git a/app/assets/javascripts/work_items/components/work_item_title.vue b/app/assets/javascripts/work_items/components/work_item_title.vue
index 88a825853cc..d2e6d3c0bbf 100644
--- a/app/assets/javascripts/work_items/components/work_item_title.vue
+++ b/app/assets/javascripts/work_items/components/work_item_title.vue
@@ -1,5 +1,4 @@
<script>
-import { GlLoadingIcon } from '@gitlab/ui';
import Tracking from '~/tracking';
import { i18n } from '../constants';
import updateWorkItemMutation from '../graphql/update_work_item.mutation.graphql';
@@ -7,16 +6,10 @@ import ItemTitle from './item_title.vue';
export default {
components: {
- GlLoadingIcon,
ItemTitle,
},
mixins: [Tracking.mixin()],
props: {
- loading: {
- type: Boolean,
- required: false,
- default: false,
- },
workItemId: {
type: String,
required: false,
@@ -59,6 +52,7 @@ export default {
},
});
this.track('updated_title');
+ this.$emit('updated');
} catch {
this.$emit('error', i18n.updateError);
}
@@ -68,6 +62,5 @@ export default {
</script>
<template>
- <gl-loading-icon v-if="loading" class="gl-mt-3" size="md" />
- <item-title v-else :title="workItemTitle" @title-changed="updateTitle" />
+ <item-title :title="workItemTitle" @title-changed="updateTitle" />
</template>
diff --git a/app/assets/javascripts/work_items/constants.js b/app/assets/javascripts/work_items/constants.js
index d3bcaf0f95f..e914500108f 100644
--- a/app/assets/javascripts/work_items/constants.js
+++ b/app/assets/javascripts/work_items/constants.js
@@ -1,6 +1,14 @@
import { s__ } from '~/locale';
+export const STATE_OPEN = 'OPEN';
+export const STATE_CLOSED = 'CLOSED';
+
+export const STATE_EVENT_REOPEN = 'REOPEN';
+export const STATE_EVENT_CLOSE = 'CLOSE';
+
export const i18n = {
fetchError: s__('WorkItem|Something went wrong when fetching the work item. Please try again.'),
updateError: s__('WorkItem|Something went wrong while updating the work item. Please try again.'),
};
+
+export const DEFAULT_MODAL_TYPE = 'Task';
diff --git a/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql b/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql
new file mode 100644
index 00000000000..32c07ed48c7
--- /dev/null
+++ b/app/assets/javascripts/work_items/graphql/delete_task_from_work_item.mutation.graphql
@@ -0,0 +1,9 @@
+mutation workItemDeleteTask($input: WorkItemDeleteTaskInput!) {
+ workItemDeleteTask(input: $input) {
+ workItem {
+ id
+ descriptionHtml
+ }
+ errors
+ }
+}
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 2707d6bb790..e25fd102699 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.fragment.graphql
@@ -1,8 +1,14 @@
fragment WorkItem on WorkItem {
id
title
+ state
+ description
workItemType {
id
name
}
+ userPermissions {
+ deleteWorkItem
+ updateWorkItem
+ }
}
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 1d3dae0649d..3b46fed97ec 100644
--- a/app/assets/javascripts/work_items/graphql/work_item.query.graphql
+++ b/app/assets/javascripts/work_items/graphql/work_item.query.graphql
@@ -1,6 +1,6 @@
#import "./work_item.fragment.graphql"
-query workItem($id: ID!) {
+query workItem($id: WorkItemID!) {
workItem(id: $id) {
...WorkItem
}
diff --git a/app/assets/javascripts/work_items/index.js b/app/assets/javascripts/work_items/index.js
index 10fae9b9cc0..e39b0d6a353 100644
--- a/app/assets/javascripts/work_items/index.js
+++ b/app/assets/javascripts/work_items/index.js
@@ -5,7 +5,7 @@ import { createApolloProvider } from './graphql/provider';
export const initWorkItemsRoot = () => {
const el = document.querySelector('#js-work-items');
- const { fullPath } = el.dataset;
+ const { fullPath, issuesListPath } = el.dataset;
return new Vue({
el,
@@ -13,6 +13,7 @@ export const initWorkItemsRoot = () => {
apolloProvider: createApolloProvider(),
provide: {
fullPath,
+ issuesListPath,
},
render(createElement) {
return createElement(App);
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 a95da80ac95..04c6a61689c 100644
--- a/app/assets/javascripts/work_items/pages/create_work_item.vue
+++ b/app/assets/javascripts/work_items/pages/create_work_item.vue
@@ -6,6 +6,7 @@ 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';
@@ -77,6 +78,13 @@ 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;
},
@@ -115,20 +123,15 @@ export default {
},
},
update(store, { data: { workItemCreate } }) {
- const { id, title, workItemType } = workItemCreate.workItem;
+ const { workItem } = workItemCreate;
store.writeQuery({
query: workItemQuery,
variables: {
- id,
+ id: workItem.id,
},
data: {
- workItem: {
- __typename: 'WorkItem',
- id,
- title,
- workItemType,
- },
+ workItem,
},
});
},
@@ -185,11 +188,11 @@ export default {
<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">
- <item-title :title="title" data-testid="title-input" @title-input="handleTitleInput" />
+ <item-title :title="initialTitle" data-testid="title-input" @title-input="handleTitleInput" />
<div>
<gl-loading-icon
v-if="$apollo.queries.workItemTypes.loading"
- size="md"
+ size="lg"
data-testid="loading-types"
/>
<gl-form-select
diff --git a/app/assets/javascripts/work_items/pages/work_item_root.vue b/app/assets/javascripts/work_items/pages/work_item_root.vue
index b8f2bcff25d..6dc3dc3b3c9 100644
--- a/app/assets/javascripts/work_items/pages/work_item_root.vue
+++ b/app/assets/javascripts/work_items/pages/work_item_root.vue
@@ -1,26 +1,70 @@
<script>
+import { GlAlert } from '@gitlab/ui';
import { TYPE_WORK_ITEM } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
+import { visitUrl } from '~/lib/utils/url_utility';
+import { s__ } from '~/locale';
import WorkItemDetail from '../components/work_item_detail.vue';
+import deleteWorkItemMutation from '../graphql/delete_work_item.mutation.graphql';
export default {
components: {
+ GlAlert,
WorkItemDetail,
},
+ inject: ['issuesListPath'],
props: {
id: {
type: String,
required: true,
},
},
+ data() {
+ return {
+ error: '',
+ };
+ },
computed: {
gid() {
return convertToGraphQLId(TYPE_WORK_ITEM, this.id);
},
},
+ methods: {
+ deleteWorkItem() {
+ this.$apollo
+ .mutate({
+ mutation: deleteWorkItemMutation,
+ variables: {
+ input: {
+ id: this.gid,
+ },
+ },
+ })
+ .then(({ data: { workItemDelete, errors } }) => {
+ if (errors?.length) {
+ throw new Error(errors[0].message);
+ }
+
+ if (workItemDelete?.errors.length) {
+ throw new Error(workItemDelete.errors[0]);
+ }
+
+ this.$toast.show(s__('WorkItem|Work item deleted'));
+ visitUrl(this.issuesListPath);
+ })
+ .catch((e) => {
+ this.error =
+ e.message ||
+ s__('WorkItem|Something went wrong when deleting the work item. Please try again.');
+ });
+ },
+ },
};
</script>
<template>
- <work-item-detail :work-item-id="gid" />
+ <div>
+ <gl-alert v-if="error" variant="danger" @dismiss="error = ''">{{ error }}</gl-alert>
+ <work-item-detail :work-item-id="gid" @deleteWorkItem="deleteWorkItem" />
+ </div>
</template>
diff --git a/app/assets/javascripts/work_items/router/index.js b/app/assets/javascripts/work_items/router/index.js
index 142fab8cfa6..2b39a298720 100644
--- a/app/assets/javascripts/work_items/router/index.js
+++ b/app/assets/javascripts/work_items/router/index.js
@@ -1,8 +1,10 @@
+import { GlToast } from '@gitlab/ui';
import Vue from 'vue';
import VueRouter from 'vue-router';
import { joinPaths } from '~/lib/utils/url_utility';
import { routes } from './routes';
+Vue.use(GlToast);
Vue.use(VueRouter);
export function createRouter(fullPath) {
diff --git a/app/assets/javascripts/work_items_hierarchy/components/app.vue b/app/assets/javascripts/work_items_hierarchy/components/app.vue
index 621cfe5bace..779bd27516a 100644
--- a/app/assets/javascripts/work_items_hierarchy/components/app.vue
+++ b/app/assets/javascripts/work_items_hierarchy/components/app.vue
@@ -1,6 +1,6 @@
<script>
import { GlBanner } from '@gitlab/ui';
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import { parseBoolean } from '~/lib/utils/common_utils';
import RESPONSE from '../static_response';
import { WORK_ITEMS_SURVEY_COOKIE_NAME, workItemTypes } from '../constants';
diff --git a/app/assets/stylesheets/bootstrap_migration_components.scss b/app/assets/stylesheets/bootstrap_migration_components.scss
index b6cecbe5806..676e69707c7 100644
--- a/app/assets/stylesheets/bootstrap_migration_components.scss
+++ b/app/assets/stylesheets/bootstrap_migration_components.scss
@@ -26,7 +26,7 @@ input[type='file'] {
line-height: 1;
}
-.form-group.row .col-form-label {
+.form-group.row > .col-form-label {
// Bootstrap 4 aligns labels to the left
// for horizontal forms
@include media-breakpoint-up(md) {
@@ -118,7 +118,14 @@ input[type='file'] {
margin-bottom: 16px;
.well-segment {
- padding: 16px;
+ padding: 1rem;
+
+ &.pipeline-info {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.25rem;
+ }
&:not(:last-of-type) {
border-bottom: 1px solid $well-inner-border;
diff --git a/app/assets/stylesheets/components/content_editor.scss b/app/assets/stylesheets/components/content_editor.scss
index 7f498b79d33..870ed50c6eb 100644
--- a/app/assets/stylesheets/components/content_editor.scss
+++ b/app/assets/stylesheets/components/content_editor.scss
@@ -13,6 +13,11 @@
}
}
+ img.ProseMirror-selectednode {
+ outline: 3px solid rgba($blue-400, 0.48);
+ outline-offset: -3px;
+ }
+
ul[data-type='taskList'] {
list-style: none;
padding: 0;
@@ -121,3 +126,7 @@
border: 1px solid $black-transparent;
background-color: var(--gl-color-chip-color);
}
+
+.bubble-menu-form {
+ width: 320px;
+}
diff --git a/app/assets/stylesheets/components/dashboard_skeleton.scss b/app/assets/stylesheets/components/dashboard_skeleton.scss
index 09ba89c0782..1dcaa47470b 100644
--- a/app/assets/stylesheets/components/dashboard_skeleton.scss
+++ b/app/assets/stylesheets/components/dashboard_skeleton.scss
@@ -48,8 +48,7 @@
}
}
- &-header,
- &-footer {
+ &-header {
&-failed {
background-color: $red-100;
}
diff --git a/app/assets/stylesheets/components/design_management/design.scss b/app/assets/stylesheets/components/design_management/design.scss
index a9be1d89495..b8bd1000bfd 100644
--- a/app/assets/stylesheets/components/design_management/design.scss
+++ b/app/assets/stylesheets/components/design_management/design.scss
@@ -7,7 +7,7 @@ $t-gray-a-16-design-pin: rgba($black, 0.16);
}
.design-detail {
- background-color: rgba($black, 0.9);
+ background-color: rgba($modal-backdrop-bg, $modal-backdrop-opacity);
.with-performance-bar & {
top: 35px;
diff --git a/app/assets/stylesheets/components/whats_new.scss b/app/assets/stylesheets/components/whats_new.scss
index 98a7ea5792b..c1c68f64d86 100644
--- a/app/assets/stylesheets/components/whats_new.scss
+++ b/app/assets/stylesheets/components/whats_new.scss
@@ -47,12 +47,6 @@
margin-top: calc(#{$performance-bar-height} + #{$system-header-height} + #{$header-height});
}
-.gl-badge.whats-new-item-badge {
- background-color: $purple-light;
- color: $purple;
- @include gl-font-weight-bold;
-}
-
.whats-new-item-title-link {
&:hover,
&:focus,
diff --git a/app/assets/stylesheets/errors.scss b/app/assets/stylesheets/errors.scss
index dc08c816d7d..00cc3409fa7 100644
--- a/app/assets/stylesheets/errors.scss
+++ b/app/assets/stylesheets/errors.scss
@@ -118,3 +118,11 @@ a {
}
}
}
+
+.tanuki-logo {
+ width: 210px;
+ height: 210px;
+ max-width: 40vw;
+ display: block;
+ margin: map-get($spacing-scale, 4) auto;
+}
diff --git a/app/assets/stylesheets/framework/broadcast_messages.scss b/app/assets/stylesheets/framework/broadcast_messages.scss
index 58f986ec0ae..a0bfca79dc3 100644
--- a/app/assets/stylesheets/framework/broadcast_messages.scss
+++ b/app/assets/stylesheets/framework/broadcast_messages.scss
@@ -14,11 +14,14 @@
}
.broadcast-banner-message {
- text-align: center;
-
p {
margin-bottom: 0;
}
+
+ a {
+ color: inherit;
+ text-decoration: underline;
+ }
}
.broadcast-notification-message {
diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss
index 9cebd4f49a4..33522c66024 100644
--- a/app/assets/stylesheets/framework/buttons.scss
+++ b/app/assets/stylesheets/framework/buttons.scss
@@ -121,6 +121,10 @@
@include btn-color($white, $border-color, $white-normal, $border-white-normal, $white-dark, $border-white-normal, $gl-text-color);
}
+@mixin btn-purple {
+ @include btn-color($purple-700, $purple-800, $purple-800, $purple-900, $purple-900, $purple-950, $white);
+}
+
@mixin btn-with-margin {
margin-left: $btn-side-margin;
float: left;
@@ -194,6 +198,10 @@
@include btn-red;
}
+ &.btn-purple {
+ @include btn-purple;
+ }
+
&.btn-grouped {
@include btn-with-margin;
}
@@ -261,7 +269,7 @@
.btn-block {
width: 100%;
margin: 0;
- margin-bottom: 15px;
+ @include gl-mb-5;
&.btn {
padding: 6px 0;
diff --git a/app/assets/stylesheets/framework/diffs.scss b/app/assets/stylesheets/framework/diffs.scss
index f0495fdc94e..7a77256398e 100644
--- a/app/assets/stylesheets/framework/diffs.scss
+++ b/app/assets/stylesheets/framework/diffs.scss
@@ -34,7 +34,7 @@
@media (min-width: map-get($grid-breakpoints, md)) {
// The `+11` is to ensure the file header border shows when scrolled -
// the bottom of the compare-versions header and the top of the file header
- $mr-file-header-top: calc(#{$mr-version-controls-height} + #{$header-height} + #{$mr-tabs-height} + 11px);
+ $mr-file-header-top: calc(#{$header-height} + #{$mr-tabs-height});
position: -webkit-sticky;
position: sticky;
@@ -582,25 +582,6 @@ table.code {
}
}
-.diff-expansion-cell {
- flex: 1 1;
- min-width: max-content;
-}
-
-.diff-expansion-cell-middle {
- flex: 0 1 max-content;
-}
-
-@media only screen and (min-width: $breakpoint-xl) {
- .diff-expansion-cell-start {
- text-align: right;
- }
-
- .diff-expansion-cell-end {
- text-align: left;
- }
-}
-
// Merge request diff grid layout
.diff-grid {
.diff-td {
@@ -612,6 +593,10 @@ table.code {
.diff-grid-row {
display: grid;
grid-template-columns: 1fr 1fr;
+
+ &.diff-grid-row-full {
+ grid-template-columns: 1fr;
+ }
}
.diff-grid-left,
@@ -626,6 +611,14 @@ table.code {
grid-template-columns: 50px 1fr !important;
}
+ .diff-grid-2-col {
+ grid-template-columns: 100px 1fr !important;
+
+ &.parallel {
+ grid-template-columns: 50px 1fr !important;
+ }
+ }
+
&.inline-diff-view .diff-grid-3-col {
grid-template-columns: 50px 50px 1fr !important;
}
@@ -1209,3 +1202,10 @@ table.code {
position: absolute;
bottom: 100vh;
}
+
+.diff-line-expand-button {
+ &:hover,
+ &:focus {
+ @include gl-bg-gray-200;
+ }
+}
diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss
index e378fcb6129..f322c6c8929 100644
--- a/app/assets/stylesheets/framework/files.scss
+++ b/app/assets/stylesheets/framework/files.scss
@@ -376,14 +376,12 @@ span.idiff {
a {
color: $gl-text-color;
}
+}
- @include media-breakpoint-down(md) {
- .file-actions {
- margin-top: $gl-padding-8;
-
- .btn {
- margin-bottom: $gl-padding-8;
- }
+.blob-content-holder .file-actions {
+ @include media-breakpoint-down(sm) {
+ .btn {
+ margin-bottom: $gl-padding-8;
}
}
}
@@ -452,7 +450,6 @@ span.idiff {
.note-container {
.user-avatar-link.new-comment {
position: absolute;
- margin: 40px $gl-padding 0 116px;
}
}
diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss
index 5dd71cec8d1..37b61d36911 100644
--- a/app/assets/stylesheets/framework/filters.scss
+++ b/app/assets/stylesheets/framework/filters.scss
@@ -49,7 +49,7 @@
margin: 0 0 10px;
}
- .dropdown-menu-toggle,
+ .dropdown-menu-toggle.dropdown-menu-toggle,
.update-issues-btn .btn {
width: 100%;
}
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index 4d0d64ae723..50783433c3d 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -83,7 +83,6 @@ label {
margin-right: 0;
.form-control {
- height: 29px;
background: $white;
font-family: $monospace-font;
}
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index f44123fc2ed..f76a0cbbae8 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -10,17 +10,6 @@
right: 0;
border-radius: 0;
- .logo-text {
- line-height: initial;
-
- svg {
- width: 55px;
- height: 14px;
- margin: 0;
- fill: $white;
- }
- }
-
.close-icon {
display: none;
}
@@ -33,14 +22,6 @@
min-height: $header-height;
padding-left: 0;
- .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
- }
-
.title {
padding-right: 0;
color: currentColor;
@@ -71,10 +52,14 @@
display: flex;
align-items: center;
padding: 2px 8px;
- margin: 5px 2px 5px -8px;
+ margin: 4px 2px 4px -12px;
border-radius: $border-radius-default;
}
+ .canary-badge {
+ margin-left: -8px;
+ }
+
.project-item-select {
right: auto;
left: 0;
@@ -127,7 +112,7 @@
border-radius: 0;
min-width: 45px;
padding: 0;
- margin: $gl-padding-8 -7px $gl-padding-8 0;
+ margin: $gl-padding-8 $gl-padding-8 $gl-padding-8 0;
font-size: 14px;
text-align: center;
color: currentColor;
@@ -353,6 +338,14 @@
}
}
+ &:last-child {
+ > a {
+ font-weight: 600;
+ line-height: 16px;
+ color: $gl-text-color;
+ }
+ }
+
> a {
font-size: 12px;
color: currentColor;
@@ -390,17 +383,6 @@
margin-left: auto;
}
-.breadcrumbs-sub-title {
- margin: 0;
- font-size: 12px;
- font-weight: 600;
- line-height: 16px;
-
- a {
- color: $gl-text-color;
- }
-}
-
.btn-sign-in {
background-color: $indigo-100;
color: $indigo-900;
diff --git a/app/assets/stylesheets/framework/icons.scss b/app/assets/stylesheets/framework/icons.scss
index 0aeb7208c59..ca0240b6a65 100644
--- a/app/assets/stylesheets/framework/icons.scss
+++ b/app/assets/stylesheets/framework/icons.scss
@@ -3,6 +3,17 @@
svg {
fill: $green-500;
}
+
+ &.interactive {
+ &:hover {
+ background: $green-500;
+
+ svg {
+ --svg-status-bg: #{$green-100};
+ box-shadow: 0 0 0 1px $green-500;
+ }
+ }
+ }
}
.ci-status-icon-error,
@@ -10,6 +21,17 @@
svg {
fill: $red-500;
}
+
+ &.interactive {
+ &:hover {
+ background: $red-500;
+
+ svg {
+ --svg-status-bg: #{$red-100};
+ box-shadow: 0 0 0 1px $red-500;
+ }
+ }
+ }
}
.ci-status-icon-pending,
@@ -19,11 +41,33 @@
svg {
fill: $orange-500;
}
+
+ &.interactive {
+ &:hover {
+ background: $orange-500;
+
+ svg {
+ --svg-status-bg: #{$orange-100};
+ box-shadow: 0 0 0 1px $orange-500;
+ }
+ }
+ }
}
.ci-status-icon-running {
svg {
- fill: $blue-400;
+ fill: $blue-500;
+ }
+
+ &.interactive {
+ &:hover {
+ background: $blue-500;
+
+ svg {
+ --svg-status-bg: #{$blue-100};
+ box-shadow: 0 0 0 1px $blue-500;
+ }
+ }
}
}
@@ -32,7 +76,18 @@
.ci-status-icon-scheduled,
.ci-status-icon-manual {
svg {
- fill: $gl-text-color;
+ fill: $gray-900;
+ }
+
+ &.interactive {
+ &:hover {
+ background: $gray-900;
+
+ svg {
+ --svg-status-bg: #{$gray-100};
+ box-shadow: 0 0 0 1px $gray-900;
+ }
+ }
}
}
@@ -42,7 +97,18 @@
.ci-status-icon-skipped,
.ci-status-icon-notfound {
svg {
- fill: var(--gray-400, $gray-400);
+ fill: $gray-500;
+ }
+
+ &.interactive {
+ &:hover {
+ background: $gray-500;
+
+ svg {
+ --svg-status-bg: #{$gray-100};
+ box-shadow: 0 0 0 1px $gray-500;
+ }
+ }
}
}
diff --git a/app/assets/stylesheets/framework/logo.scss b/app/assets/stylesheets/framework/logo.scss
index c5feefb8c54..1845438eedb 100644
--- a/app/assets/stylesheets/framework/logo.scss
+++ b/app/assets/stylesheets/framework/logo.scss
@@ -9,19 +9,16 @@
}
.tanuki-logo {
- .tanuki-left-ear,
- .tanuki-right-ear,
- .tanuki-nose {
+ .tanuki {
@include tanuki-logo-colors($tanuki-red);
}
- .tanuki-left-eye,
- .tanuki-right-eye {
+ .left-cheek,
+ .right-cheek {
@include tanuki-logo-colors($tanuki-orange);
}
- .tanuki-left-cheek,
- .tanuki-right-cheek {
+ .chin {
@include tanuki-logo-colors($tanuki-yellow);
}
@@ -31,98 +28,54 @@
@include webkit-prefix(animation-iteration-count, infinite);
}
- .tanuki-left-cheek {
- @include include-keyframes(animate-tanuki-left-cheek) {
+ .tanuki {
+ @include include-keyframes(animate-tanuki-base) {
0%,
- 10%,
- 100% {
- fill: lighten($tanuki-yellow, 25%);
- }
-
- 90% {
- fill: $tanuki-yellow;
- }
- }
- }
-
- .tanuki-left-eye {
- @include include-keyframes(animate-tanuki-left-eye) {
- 10%,
- 80% {
- fill: $tanuki-orange;
- }
-
- 20%,
- 90% {
- fill: lighten($tanuki-orange, 25%);
- }
- }
- }
-
- .tanuki-left-ear {
- @include include-keyframes(animate-tanuki-left-ear) {
- 10%,
- 80% {
+ 50% {
fill: $tanuki-red;
}
- 20%,
- 90% {
+ 25% {
fill: lighten($tanuki-red, 25%);
}
}
}
- .tanuki-nose {
- @include include-keyframes(animate-tanuki-nose) {
- 20%,
- 70% {
- fill: $tanuki-red;
- }
-
- 30%,
- 80% {
- fill: lighten($tanuki-red, 25%);
- }
- }
- }
-
- .tanuki-right-eye {
- @include include-keyframes(animate-tanuki-right-eye) {
- 30%,
- 60% {
+ .right-cheek {
+ @include include-keyframes(animate-tanuki-right-cheek) {
+ 25%,
+ 75% {
fill: $tanuki-orange;
}
- 40%,
- 70% {
+ 50% {
fill: lighten($tanuki-orange, 25%);
}
}
}
- .tanuki-right-ear {
- @include include-keyframes(animate-tanuki-right-ear) {
- 30%,
- 60% {
- fill: $tanuki-red;
+ .chin {
+ @include include-keyframes(animate-tanuki-chin) {
+ 50%,
+ 100% {
+ fill: $tanuki-yellow;
}
- 40%,
- 70% {
- fill: lighten($tanuki-red, 25%);
+ 75% {
+ fill: lighten($tanuki-yellow, 25%);
}
}
}
- .tanuki-right-cheek {
- @include include-keyframes(animate-tanuki-right-cheek) {
- 40% {
- fill: $tanuki-yellow;
+ .left-cheek {
+ @include include-keyframes(animate-tanuki-left-cheek) {
+ 25%,
+ 75% {
+ fill: $tanuki-orange;
}
- 60% {
- fill: lighten($tanuki-yellow, 25%);
+ 100% {
+ fill: lighten($tanuki-orange, 25%);
}
}
}
diff --git a/app/assets/stylesheets/framework/secondary_navigation_elements.scss b/app/assets/stylesheets/framework/secondary_navigation_elements.scss
index 8cad55f414a..549b61aedae 100644
--- a/app/assets/stylesheets/framework/secondary_navigation_elements.scss
+++ b/app/assets/stylesheets/framework/secondary_navigation_elements.scss
@@ -174,6 +174,10 @@
width: 100%;
}
+ .btn.dropdown-toggle-split {
+ margin-left: 1px;
+ }
+
/* This resets the width of the control so that the search button doesn't wrap */
.gl-search-box-by-click .form-control {
width: 1%;
@@ -368,7 +372,7 @@
.project-item-select-holder.btn-group {
.new-project-item-select-button {
- max-width: 44px;
+ max-width: 32px;
}
}
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index d270f802c56..dd9581c4692 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -19,13 +19,23 @@
.right-sidebar-collapsed {
padding-right: 0;
- @include media-breakpoint-up(sm) {
- &:not(.wiki-sidebar):not(.build-sidebar):not(.issuable-bulk-update-sidebar) .content-wrapper {
- padding-right: $gutter-collapsed-width;
+ &:not(.is-merge-request) {
+ @include media-breakpoint-up(sm) {
+ &:not(.wiki-sidebar):not(.build-sidebar):not(.issuable-bulk-update-sidebar) .content-wrapper {
+ padding-right: $gutter-collapsed-width;
+ }
+
+ .merge-request-tabs-holder.affix {
+ right: $gutter-collapsed-width;
+ }
}
+ }
- .merge-request-tabs-holder.affix {
- right: $gutter-collapsed-width;
+ &.is-merge-request {
+ @include media-breakpoint-up(md) {
+ .content-wrapper {
+ padding-right: $gutter-collapsed-width;
+ }
}
}
@@ -49,6 +59,18 @@
padding-right: 0;
z-index: $zindex-dropdown-menu;
+ &.right-sidebar-merge-requests {
+ width: 270px;
+
+ @include media-breakpoint-up(md) {
+ z-index: auto;
+ }
+
+ .shortcut-sidebar-dropdown-toggle {
+ margin-right: 0 !important;
+ }
+ }
+
@include media-breakpoint-only(sm) {
&:not(.wiki-sidebar):not(.build-sidebar):not(.issuable-bulk-update-sidebar) .content-wrapper {
padding-right: $gutter-collapsed-width;
@@ -71,12 +93,20 @@
}
.right-sidebar {
- border-left: 1px solid $border-color;
+ border-left: 1px solid $gray-100;
- .sidebar-container,
- .issuable-sidebar {
- // Add 100px so that potentially visible vertical scroll bar is hidden
- width: calc(100% + 100px);
+ &.right-sidebar-merge-requests {
+ @include media-breakpoint-up(md) {
+ border-left: 0;
+ }
+ }
+
+ &:not(.right-sidebar-merge-requests) {
+ .sidebar-container,
+ .issuable-sidebar {
+ // Add 100px so that potentially visible vertical scroll bar is hidden
+ width: calc(100% + 100px);
+ }
}
}
@@ -135,7 +165,11 @@
// rest of the sidebar, and could be removed once the sidebar has been fully converted to use
// gitlab-ui components.
.title .gl-button {
- color: $gl-text-color;
+ font-weight: $gl-font-weight-bold;
+
+ .gl-button {
+ color: $gl-text-color;
+ }
}
}
@@ -227,6 +261,10 @@
margin-right: -$gl-spacing-scale-2;
}
+.issuable-sidebar.is-merge-request .edit-link {
+ margin-right: 0;
+}
+
.assignee-grid {
grid-template-areas: ' attention user';
grid-template-columns: min-content 1fr;
diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss
index 6348703e9e1..f39d53c5b1c 100644
--- a/app/assets/stylesheets/framework/tables.scss
+++ b/app/assets/stylesheets/framework/tables.scss
@@ -10,9 +10,6 @@ table {
* color palette in https://gitlab.com/gitlab-org/gitlab/-/issues/213570
*
* The overwrites here affected the following areas:
- * - The security dashboard tables. When removing
- * this code, table-th-transparent and original-text-color classes should
- * be removed there.
* - The subscription seats table. When removing this code, the .seats-table
* <th> and margin overrides should be removed there.
*
@@ -23,8 +20,16 @@ table {
@include gl-text-gray-500;
}
- .md &:not(.code),
&.table {
+ .thead-white {
+ th {
+ background-color: $white;
+ }
+ }
+ }
+
+ .md &:not(.code),
+ &.table:not(.gl-table) {
margin-bottom: $gl-padding;
.dropdown-menu a {
@@ -58,23 +63,12 @@ table {
&.wide {
width: 55%;
}
-
- &.table-th-transparent {
- background: none;
- color: $gl-text-color-secondary;
- }
-
- &.original-gl-th {
- @include gl-text-gray-500;
- border-bottom: 1px solid $cycle-analytics-light-gray;
- }
}
}
.thead-white {
th {
- background-color: $white;
color: $gl-text-color-secondary;
border-top: 0;
}
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 8e3b34e4eaf..bc649b6407d 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -453,7 +453,7 @@ $border-radius-small: 2px;
$border-radius-large: 8px;
$default-icon-size: 16px;
$layout-link-gray: #7e7c7c;
-$btn-side-margin: 10px;
+$btn-side-margin: $grid-size;
$btn-sm-side-margin: 7px;
$btn-margin-5: 5px;
$count-arrow-border: #dce0e5;
@@ -658,7 +658,6 @@ $calendar-user-contrib-text: #959494;
$cycle-analytics-box-padding: 30px;
$cycle-analytics-box-text-color: #8c8c8c;
$cycle-analytics-big-font: 19px;
-$cycle-analytics-light-gray: #bfbfbf;
$cycle-analytics-dismiss-icon-color: #b2b2b2;
/*
@@ -934,7 +933,6 @@ $issues-analytics-popover-boarder-color: rgba(0, 0, 0, 0.15);
Merge requests
*/
$mr-tabs-height: 48px;
-$mr-version-controls-height: 56px;
/*
Compare Branches
diff --git a/app/assets/stylesheets/framework/wells.scss b/app/assets/stylesheets/framework/wells.scss
index b796f04750b..cfd215b81b8 100644
--- a/app/assets/stylesheets/framework/wells.scss
+++ b/app/assets/stylesheets/framework/wells.scss
@@ -39,7 +39,7 @@
.icon-container {
display: inline-block;
- margin-right: 8px;
+ margin: 0 0.5rem 0 0.25rem;
svg {
position: relative;
diff --git a/app/assets/stylesheets/highlight/common.scss b/app/assets/stylesheets/highlight/common.scss
index bd327082e20..433141ae690 100644
--- a/app/assets/stylesheets/highlight/common.scss
+++ b/app/assets/stylesheets/highlight/common.scss
@@ -19,7 +19,17 @@
background: $dark-diff-match-color;
}
-@mixin diff-expansion($background, $border, $link) {
+@mixin diff-expansion($background, $color, $hover-background, $hover-color) {
+ background-color: $background;
+ color: $color;
+
+ &:hover {
+ background-color: $hover-background;
+ color: $hover-color;
+ }
+}
+
+@mixin old-diff-expansion($background, $border, $link) {
background-color: $background;
.diff-td,
@@ -49,6 +59,13 @@
}
}
+
+@mixin dark-diff-expansion-line {
+ &.expansion .diff-td {
+ background-color: $dark-diff-match-color;
+ }
+}
+
@mixin line-coverage-border-color($coverage, $no-coverage) {
transition: border-left 0.1s ease-out;
@@ -121,7 +138,8 @@
@include gl-mr-2;
@include gl-w-4;
@include gl-h-4;
- @include gl-float-left;
+ @include gl-absolute;
+ @include gl-left-3;
background-color: $color;
mask-image: asset_url('icons-stacked.svg#link');
mask-repeat: no-repeat;
diff --git a/app/assets/stylesheets/highlight/themes/dark.scss b/app/assets/stylesheets/highlight/themes/dark.scss
index c51b1f04757..0eeebdb2e7a 100644
--- a/app/assets/stylesheets/highlight/themes/dark.scss
+++ b/app/assets/stylesheets/highlight/themes/dark.scss
@@ -154,8 +154,12 @@ $dark-il: #de935f;
color: $dark-line-color;
}
- .line_expansion {
- @include diff-expansion($dark-main-bg, $dark-border, $dark-na);
+ .old-line_expansion {
+ @include old-diff-expansion($dark-main-bg, $dark-border, $dark-na);
+ }
+
+ .diff-line-expand-button {
+ @include diff-expansion($gray-600, $gray-200, $gray-300, $white);
}
// Diff line
@@ -166,6 +170,10 @@ $dark-il: #de935f;
@include dark-diff-match-line;
}
+ &.diff-grid-row {
+ @include dark-diff-expansion-line;
+ }
+
.diff-td.diff-line-num.hll:not(.empty-cell),
.diff-td.line-coverage.hll:not(.empty-cell),
.diff-td.line-codequality.hll:not(.empty-cell),
diff --git a/app/assets/stylesheets/highlight/themes/monokai.scss b/app/assets/stylesheets/highlight/themes/monokai.scss
index 226bb44f0e7..b8cd97d6504 100644
--- a/app/assets/stylesheets/highlight/themes/monokai.scss
+++ b/app/assets/stylesheets/highlight/themes/monokai.scss
@@ -1,6 +1,7 @@
/* https://github.com/richleland/pygments-css/blob/master/monokai.css */
@import '../common';
+@import 'highlight.js/styles/base16/monokai.css';
/*
* Monokai Colors
@@ -124,8 +125,12 @@ $monokai-gh: #75715e;
color: $monokai-text-color;
}
- .line_expansion {
- @include diff-expansion($monokai-bg, $monokai-border, $monokai-k);
+ .old-line_expansion {
+ @include old-diff-expansion($monokai-bg, $monokai-border, $monokai-k);
+ }
+
+ .diff-line-expand-button {
+ @include diff-expansion($gray-600, $gray-200, $gray-300, $white);
}
// Diff line
@@ -136,6 +141,10 @@ $monokai-gh: #75715e;
@include dark-diff-match-line;
}
+ &.diff-grid-row {
+ @include dark-diff-expansion-line;
+ }
+
.diff-td.diff-line-num.hll:not(.empty-cell),
.diff-td.line-coverage.hll:not(.empty-cell),
.diff-td.line-codequality.hll:not(.empty-cell),
diff --git a/app/assets/stylesheets/highlight/themes/none.scss b/app/assets/stylesheets/highlight/themes/none.scss
index 7a36aba8be7..99a3de23c26 100644
--- a/app/assets/stylesheets/highlight/themes/none.scss
+++ b/app/assets/stylesheets/highlight/themes/none.scss
@@ -44,10 +44,15 @@
color: $gl-text-color;
}
- .line_expansion {
- @include diff-expansion($gray-light, $white-normal, $gl-text-color);
+ .old-line_expansion {
+ @include old-diff-expansion($gray-light, $white-normal, $gl-text-color);
}
+ .diff-line-expand-button {
+ @include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
+ }
+
+
// Diff line
$none-expanded-border: #e0e0e0;
$none-expanded-bg: #e0e0e0;
diff --git a/app/assets/stylesheets/highlight/themes/solarized-dark.scss b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
index acd401e1694..55d17b8f1d2 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-dark.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-dark.scss
@@ -1,6 +1,7 @@
/* https://gist.github.com/qguv/7936275 */
@import '../common';
+@import 'highlight.js/styles/base16/solarized-dark.css';
/*
* Solarized dark colors
@@ -127,8 +128,12 @@ $solarized-dark-il: #2aa198;
color: $solarized-dark-pre-color;
}
- .line_expansion {
- @include diff-expansion($solarized-dark-line-bg, $solarized-dark-border, $solarized-dark-kd);
+ .old-line_expansion {
+ @include old-diff-expansion($solarized-dark-line-bg, $solarized-dark-border, $solarized-dark-kd);
+ }
+
+ .diff-line-expand-button {
+ @include diff-expansion(lighten($solarized-dark-pre-bg, 10%), $gray-200, lighten($solarized-dark-pre-bg, 20%), $white);
}
// Diff line
@@ -139,6 +144,10 @@ $solarized-dark-il: #2aa198;
@include dark-diff-match-line;
}
+ &.diff-grid-row {
+ @include dark-diff-expansion-line;
+ }
+
.diff-td.diff-line-num.hll:not(.empty-cell),
.diff-td.line-coverage.hll:not(.empty-cell),
.diff-td.line-codequality.hll:not(.empty-cell),
diff --git a/app/assets/stylesheets/highlight/themes/solarized-light.scss b/app/assets/stylesheets/highlight/themes/solarized-light.scss
index ddcecc4cbcf..72b961097e4 100644
--- a/app/assets/stylesheets/highlight/themes/solarized-light.scss
+++ b/app/assets/stylesheets/highlight/themes/solarized-light.scss
@@ -1,6 +1,7 @@
/* https://gist.github.com/qguv/7936275 */
@import '../common';
+@import 'highlight.js/styles/base16/solarized-light.css';
/*
* Solarized light syntax colors
@@ -133,9 +134,13 @@ $solarized-light-il: #2aa198;
background-color: $solarized-light-pre-bg;
color: $solarized-light-pre-color;
}
+
+ .old-line_expansion {
+ @include old-diff-expansion($solarized-light-line-bg, $solarized-light-border, $solarized-light-kd);
+ }
- .line_expansion {
- @include diff-expansion($solarized-light-line-bg, $solarized-light-border, $solarized-light-kd);
+ .diff-line-expand-button {
+ @include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
}
// Diff line
@@ -146,6 +151,10 @@ $solarized-light-il: #2aa198;
@include match-line;
}
+ &.diff-grid-row.expansion .diff-td {
+ background-color: $solarized-light-matchline-bg;
+ }
+
.diff-td.diff-line-num.hll:not(.empty-cell),
.diff-td.line-coverage.hll:not(.empty-cell),
.diff-td.line-codequality.hll:not(.empty-cell),
diff --git a/app/assets/stylesheets/highlight/white_base.scss b/app/assets/stylesheets/highlight/white_base.scss
index 20a36d2e8b1..b984c194033 100644
--- a/app/assets/stylesheets/highlight/white_base.scss
+++ b/app/assets/stylesheets/highlight/white_base.scss
@@ -77,6 +77,22 @@ $white-gc-bg: #eaf2f5;
background-color: $gray-light;
}
+@mixin diff-match-line {
+ &.expansion {
+ &.match .diff-td {
+ color: $gray-400;
+ }
+
+ .diff-td {
+ background-color: $gray-50;
+
+ &:first-child {
+ border-color: $gray-100;
+ }
+ }
+ }
+}
+
// Line numbers
.file-line-num {
@include line-number-link($black-transparent);
@@ -117,8 +133,8 @@ pre.code,
color: $white-code-color;
}
-.line_expansion {
- @include diff-expansion($gray-light, $border-color, $blue-600);
+.old-line_expansion {
+ @include old-diff-expansion($gray-light, $border-color, $blue-600);
&.diff-tr:last-child {
border-bottom-right-radius: 4px;
@@ -130,6 +146,10 @@ pre.code,
}
}
+.diff-line-expand-button {
+ @include diff-expansion($gray-100, $gray-700, $gray-200, $gray-800);
+}
+
// Diff line
.line_holder {
&.match .line_content,
@@ -138,6 +158,10 @@ pre.code,
@include match-line;
}
+ &.diff-grid-row {
+ @include diff-match-line;
+ }
+
&:not(.match) .diff-grid-left:hover,
&:not(.match) .diff-grid-right:hover,
&.code-search-line:hover {
diff --git a/app/assets/stylesheets/mailer.scss b/app/assets/stylesheets/mailer.scss
index 5f50489555b..b8cbe64df38 100644
--- a/app/assets/stylesheets/mailer.scss
+++ b/app/assets/stylesheets/mailer.scss
@@ -197,6 +197,5 @@ tr.footer td {
.footer-logo {
width: 90px;
- height: 33px;
}
}
diff --git a/app/assets/stylesheets/page_bundles/_pipeline_mixins.scss b/app/assets/stylesheets/page_bundles/_pipeline_mixins.scss
index ee777820b81..3327f8da632 100644
--- a/app/assets/stylesheets/page_bundles/_pipeline_mixins.scss
+++ b/app/assets/stylesheets/page_bundles/_pipeline_mixins.scss
@@ -13,98 +13,6 @@
}
}
-@mixin mini-pipeline-graph-color(
- $color-background-default,
- $color-background-hover-focus,
- $color-background-active,
- $color-foreground-default,
- $color-foreground-hover-focus,
- $color-foreground-active
-) {
- background-color: $color-background-default;
- border-color: $color-foreground-default;
-
- svg {
- fill: $color-foreground-default;
- }
-
- &:hover,
- &:focus {
- background-color: $color-background-hover-focus;
- border-color: $color-foreground-hover-focus;
-
- svg {
- fill: $color-foreground-hover-focus;
- }
- }
-
- &:active {
- background-color: $color-background-active;
- border-color: $color-foreground-active;
-
- svg {
- fill: $color-foreground-active;
- }
- }
-
- &:focus {
- box-shadow: 0 0 4px 1px $blue-300;
- }
-}
-
-@mixin mini-pipeline-item() {
- border-radius: 100px;
- background-color: var(--white, $white);
- border-width: 1px;
- border-style: solid;
- width: $ci-action-icon-size;
- height: $ci-action-icon-size;
- margin: 0;
- padding: 0;
- position: relative;
- vertical-align: middle;
-
- &:hover,
- &:active,
- &:focus {
- outline: none;
- border-width: 2px;
- }
-
- // Dropdown button animation in mini pipeline graph
- &.ci-status-icon-success {
- @include mini-pipeline-graph-color(var(--white, $white), $green-100, $green-200, $green-500, $green-600, $green-700);
- }
-
- &.ci-status-icon-failed {
- @include mini-pipeline-graph-color(var(--white, $white), $red-100, $red-200, $red-500, $red-600, $red-700);
- }
-
- &.ci-status-icon-pending,
- &.ci-status-icon-waiting-for-resource,
- &.ci-status-icon-success-with-warnings {
- @include mini-pipeline-graph-color(var(--white, $white), $orange-50, $orange-100, $orange-500, $orange-600, $orange-700);
- }
-
- &.ci-status-icon-running {
- @include mini-pipeline-graph-color(var(--white, $white), $blue-100, $blue-200, $blue-500, $blue-600, $blue-700);
- }
-
- &.ci-status-icon-canceled,
- &.ci-status-icon-scheduled,
- &.ci-status-icon-disabled,
- &.ci-status-icon-manual {
- @include mini-pipeline-graph-color(var(--white, $white), $gray-500, $gray-700, $gray-900, $gray-950, $black);
- }
-
- &.ci-status-icon-preparing,
- &.ci-status-icon-created,
- &.ci-status-icon-not-found,
- &.ci-status-icon-skipped {
- @include mini-pipeline-graph-color(var(--white, $white), var(--gray-100, $gray-100), var(--gray-200, $gray-200), var(--gray-400, $gray-400), var(--gray-500, $gray-500), var(--gray-600, $gray-600));
- }
-}
-
/**
Action icons inside dropdowns:
- mini graph in pipelines table
diff --git a/app/assets/stylesheets/page_bundles/boards.scss b/app/assets/stylesheets/page_bundles/boards.scss
index eecd4954e39..81d35b8bc7b 100644
--- a/app/assets/stylesheets/page_bundles/boards.scss
+++ b/app/assets/stylesheets/page_bundles/boards.scss
@@ -49,6 +49,7 @@
height: calc(100vh - #{$issue-board-list-difference-xs});
overflow-x: scroll;
min-height: 200px;
+ border-left: 8px solid var(--gray-10, $white);
@include media-breakpoint-only(sm) {
height: calc(100vh - #{$issue-board-list-difference-sm});
@@ -131,8 +132,7 @@
.board-inner {
font-size: $issue-boards-font-size;
- background: var(--gray-10, $gray-10);
- border: 1px solid var(--gray-100, $gray-100);
+ background: var(--gray-50, $gray-50);
}
// to highlight columns we have animated pulse of box-shadow
@@ -169,33 +169,7 @@
}
}
-.board-header {
- &.has-border::before {
- border-top: 3px solid;
- border-color: inherit;
- border-top-left-radius: $border-radius-default;
- border-top-right-radius: $border-radius-default;
- content: '';
- position: absolute;
- width: calc(100% + 2px);
- top: 0;
- left: 0;
- margin-top: -1px;
- margin-right: -1px;
- margin-left: -1px;
- padding-top: 1px;
- padding-right: 1px;
- padding-left: 1px;
-
- .board-title {
- padding-top: ($gl-padding - 3px);
- padding-bottom: $gl-padding;
- }
- }
-}
-
.board-title {
- border-bottom: 1px solid var(--gray-100, $gray-100);
height: 3rem;
.max-issue-size::before {
@@ -218,8 +192,7 @@
}
.board-card {
- background: var(--white, $white);
- border: 1px solid var(--gray-100, $gray-100);
+ background: var(--gray-10, $white);
box-shadow: 0 1px 2px rgba(var(--black, $black), 0.1);
line-height: $gl-padding;
list-style: none;
@@ -239,6 +212,10 @@
background-color: var(--blue-50, $blue-50);
}
+ &.sortable-chosen {
+ box-shadow: 0 2px 4px 0 rgba($black, 0.16);
+ }
+
.gl-label {
margin-top: 4px;
margin-right: 4px;
diff --git a/app/assets/stylesheets/page_bundles/dashboard_projects.scss b/app/assets/stylesheets/page_bundles/dashboard_projects.scss
index eb0e1701b7f..5eced37bed3 100644
--- a/app/assets/stylesheets/page_bundles/dashboard_projects.scss
+++ b/app/assets/stylesheets/page_bundles/dashboard_projects.scss
@@ -15,9 +15,9 @@
.blank-state-link {
&:hover {
- background-color: $gray-light;
+ background-color: var(--gray-50, $gray-10);
+ color: var(--gl-text-color, $gl-text-color);
text-decoration: none;
- color: $gl-text-color;
}
}
diff --git a/app/assets/stylesheets/page_bundles/issues_show.scss b/app/assets/stylesheets/page_bundles/issues_show.scss
new file mode 100644
index 00000000000..9873a0121c0
--- /dev/null
+++ b/app/assets/stylesheets/page_bundles/issues_show.scss
@@ -0,0 +1,67 @@
+@import 'mixins_and_variables_and_functions';
+
+.description {
+ ul,
+ ol {
+ /* We're changing list-style-position to inside because the default of outside
+ * doesn't move the negative margin to the left of the bullet. */
+ list-style-position: inside;
+ }
+
+ li {
+ position: relative;
+ /* In the browser, the li element comes after (to the right of) the bullet point, so hovering
+ * over the left of the bullet point doesn't trigger a row hover. To trigger hovering on the
+ * left, we're applying negative margin here to shift the li element left. */
+ margin-inline-start: -1rem;
+ padding-inline-start: 2.5rem;
+
+ .drag-icon {
+ position: absolute;
+ inset-block-start: 0.3rem;
+ inset-inline-start: 1rem;
+ }
+ }
+
+ ul.task-list {
+ > li.task-list-item {
+ /* We're using !important to override the same selector in typography.scss */
+ margin-inline-start: -1rem !important;
+ padding-inline-start: 2.5rem;
+
+ > input.task-list-item-checkbox {
+ position: static;
+ vertical-align: middle;
+ margin-block-start: -2px;
+ }
+ }
+ }
+}
+
+.description.work-items-enabled {
+ ul.task-list {
+ > li.task-list-item {
+ .js-add-task {
+ svg {
+ visibility: hidden;
+ }
+
+ &:focus svg {
+ visibility: visible;
+ }
+ }
+
+ &:hover,
+ &:focus-within {
+ .js-add-task svg {
+ visibility: visible;
+ }
+ }
+ }
+ }
+}
+
+.is-ghost {
+ opacity: 0.3;
+ pointer-events: none;
+}
diff --git a/app/assets/stylesheets/page_bundles/jira_connect.scss b/app/assets/stylesheets/page_bundles/jira_connect.scss
index 1c8fd7e2590..f153569f99b 100644
--- a/app/assets/stylesheets/page_bundles/jira_connect.scss
+++ b/app/assets/stylesheets/page_bundles/jira_connect.scss
@@ -17,6 +17,11 @@
@import '@gitlab/ui/src/components/base/table/table';
@import '@gitlab/ui/src/components/base/tooltip/tooltip';
@import '@gitlab/ui/src/components/base/search_box_by_type/search_box_by_type';
+@import '@gitlab/ui/src/components/base/form/form_input/form_input';
+@import '@gitlab/ui/src/components/base/form/form_radio/form_radio';
+@import '@gitlab/ui/src/components/base/form/form_radio_group/form_radio_group';
+@import '@gitlab/ui/src/components/base/form/form_checkbox/form_checkbox';
+@import '@gitlab/ui/src/components/base/form/form_group/form_group';
$header-height: 40px;
@@ -39,9 +44,3 @@ $header-height: 40px;
height: calc(100% - #{$header-height});
max-width: 1000px;
}
-
-// needed for external_link
-svg.s16 {
- width: 16px;
- height: 16px;
-}
diff --git a/app/assets/stylesheets/page_bundles/merge_requests.scss b/app/assets/stylesheets/page_bundles/merge_requests.scss
index 34a3d936a67..f04cdfba0e4 100644
--- a/app/assets/stylesheets/page_bundles/merge_requests.scss
+++ b/app/assets/stylesheets/page_bundles/merge_requests.scss
@@ -41,7 +41,7 @@ $tabs-holder-z-index: 250;
// If they don't match, the file tree and the diff files stick
// to the top at different heights, which is a bad-looking defect
$diff-file-header-top: 11px;
- $top-pos: calc(#{$header-height} + #{$mr-tabs-height} + #{$mr-version-controls-height} + #{$diff-file-header-top});
+ $top-pos: calc(#{$header-height} + #{$mr-tabs-height} + #{$diff-file-header-top});
position: -webkit-sticky;
position: sticky;
@@ -121,10 +121,6 @@ $tabs-holder-z-index: 250;
@include media-breakpoint-down(sm) {
flex-direction: column;
- .stage-cell .stage-container {
- margin-top: 16px;
- }
-
.dropdown .mini-pipeline-graph-dropdown-menu.dropdown-menu {
transform: initial;
}
@@ -666,22 +662,19 @@ $tabs-holder-z-index: 250;
margin-top: $gl-padding;
position: relative;
- &::before {
+ &:not(:last-child)::before {
content: '';
border-left: 1px solid var(--gray-100, $gray-100);
position: absolute;
left: 28px;
- top: -17px;
+ bottom: -17px;
height: 16px;
}
}
.mr-version-controls {
- position: relative;
- z-index: $tabs-holder-z-index + 10;
background: var(--white, $white);
color: var(--gl-text-color, $gl-text-color);
- margin-top: -1px;
.mr-version-menus-container {
display: flex;
@@ -703,45 +696,26 @@ $tabs-holder-z-index: 250;
}
.content-block {
- padding: $gl-padding;
+ padding: $gl-padding-8 $gl-padding;
border-bottom: 0;
}
.mr-version-dropdown,
.mr-version-compare-dropdown {
- margin: 0 0.5rem;
- }
-
- .dropdown-title {
- color: var(--gl-text-color, $gl-text-color);
- }
-
- // Shortening button height by 1px to make compare-versions
- // header 56px and fit into our 8px design grid
- .btn {
- height: 34px;
- }
-
- @include media-breakpoint-up(md) {
- position: -webkit-sticky;
- position: sticky;
- top: calc(#{$header-height} + #{$mr-tabs-height});
+ margin: 0 $gl-spacing-scale-1;
- .with-system-header & {
- top: calc(#{$header-height} + #{$mr-tabs-height} + #{$system-header-height});
- }
-
- .with-system-header.with-performance-bar & {
- top: calc(#{$header-height} + #{$mr-tabs-height} + #{$system-header-height} + #{$performance-bar-height});
- }
+ .dropdown-toggle.gl-button {
+ padding: $gl-spacing-scale-2 2px $gl-spacing-scale-2 $gl-spacing-scale-2;
+ font-weight: $gl-font-weight-bold;
- .mr-version-menus-container {
- flex-wrap: nowrap;
+ .gl-button-icon {
+ margin-left: $gl-spacing-scale-1;
+ }
}
+ }
- .with-performance-bar & {
- top: calc(#{$header-height} + #{$performance-bar-height} + #{$mr-tabs-height});
- }
+ .dropdown-title {
+ color: var(--gl-text-color, $gl-text-color);
}
}
@@ -761,3 +735,11 @@ $tabs-holder-z-index: 250;
.attention-request-sidebar-popover {
z-index: 999;
}
+
+.merge-request-overview {
+ @include media-breakpoint-up(md) {
+ display: grid;
+ grid-template-columns: 1fr 270px;
+ grid-gap: 5%;
+ }
+}
diff --git a/app/assets/stylesheets/page_bundles/milestone.scss b/app/assets/stylesheets/page_bundles/milestone.scss
index aa582db10d2..c401f1a4902 100644
--- a/app/assets/stylesheets/page_bundles/milestone.scss
+++ b/app/assets/stylesheets/page_bundles/milestone.scss
@@ -167,7 +167,7 @@ $status-box-line-height: 26px;
border-bottom: 1px solid var(--border-color, $border-color);
}
-@include media-breakpoint-down(xs) {
+@include media-breakpoint-down(md) {
.milestone-actions {
@include clearfix();
padding-top: $gl-vert-padding;
diff --git a/app/assets/stylesheets/page_bundles/pipeline.scss b/app/assets/stylesheets/page_bundles/pipeline.scss
index cbb6d68bf35..e6afc70acbb 100644
--- a/app/assets/stylesheets/page_bundles/pipeline.scss
+++ b/app/assets/stylesheets/page_bundles/pipeline.scss
@@ -139,7 +139,7 @@
}
.gl-downstream-pipeline-job-width {
- width: 170px;
+ width: 8rem;
}
.gl-linked-pipeline-padding {
diff --git a/app/assets/stylesheets/page_bundles/pipeline_editor.scss b/app/assets/stylesheets/page_bundles/pipeline_editor.scss
new file mode 100644
index 00000000000..e167052a3e1
--- /dev/null
+++ b/app/assets/stylesheets/page_bundles/pipeline_editor.scss
@@ -0,0 +1,22 @@
+@import 'mixins_and_variables_and_functions';
+
+.file-tree-container {
+ @include gl-w-full;
+
+ @media (min-width: $breakpoint-md) {
+ width: 300px;
+ }
+}
+
+.file-tree-container > div.gl-overflow-y-auto {
+ max-height: 220px;
+
+ @media (min-width: $breakpoint-md) {
+ max-height: 700px;
+ }
+}
+
+.file-tree-includes-link:hover > svg {
+ @include gl-display-block;
+ top: 2px;
+}
diff --git a/app/assets/stylesheets/page_bundles/pipelines.scss b/app/assets/stylesheets/page_bundles/pipelines.scss
index 7b54be5c91f..a225a0f0061 100644
--- a/app/assets/stylesheets/page_bundles/pipelines.scss
+++ b/app/assets/stylesheets/page_bundles/pipelines.scss
@@ -73,36 +73,12 @@
// Mini Pipelines
.stage-cell {
- .mini-pipeline-graph-dropdown-toggle {
- svg {
- height: $ci-action-icon-size;
- width: $ci-action-icon-size;
- position: absolute;
- top: -1px;
- left: -1px;
- z-index: 2;
- overflow: visible;
- }
-
- &:hover,
- &:active,
- &:focus {
- svg {
- top: -2px;
- left: -2px;
- }
- }
- }
-
.stage-container {
- display: inline-block;
- position: relative;
- vertical-align: middle;
- height: $ci-action-icon-size;
- margin: 3px 0;
+ align-items: center;
+ display: inline-flex;
+ .stage-container {
- margin-left: 6px;
+ margin-left: 4px;
}
// Hack to show a button tooltip inline
@@ -118,44 +94,15 @@
&:not(:last-child) {
&::after {
content: '';
- width: 7px;
+ width: 4px;
position: absolute;
- right: -7px;
- top: 11px;
- border-bottom: 2px solid var(--border-color, $border-color);
- }
- }
-
- //delete when all pipelines are updated to new size
- &.mr-widget-pipeline-stages {
- + .stage-container {
- margin-left: 4px;
- }
-
- &:not(:last-child) {
- &::after {
- width: 4px;
- right: -4px;
- top: 11px;
- }
+ right: -4px;
+ border-bottom: 2px solid $gray-200;
}
}
}
}
-// Commit mini pipeline (HAML)
-button.mini-pipeline-graph-dropdown-toggle,
-// GlDropdown mini pipeline (Vue)
-// As the `mini-pipeline-item` mixin specificity is lower
-// than the toggle of dropdown with 'variant="link"' we add
-// classes ".gl-button.btn-link" to make it more specific
-// and avoid having the size overriden
-//
-// See https://gitlab.com/gitlab-org/gitlab/-/issues/320737
-button.gl-button.btn-link.mini-pipeline-graph-dropdown-toggle {
- @include mini-pipeline-item();
-}
-
// Action icons inside dropdowns:
// mini graph in pipelines table
// mini graph in MR widget pipeline
diff --git a/app/assets/stylesheets/page_bundles/terms.scss b/app/assets/stylesheets/page_bundles/terms.scss
index 8eb66e58aed..9dff3e9c99c 100644
--- a/app/assets/stylesheets/page_bundles/terms.scss
+++ b/app/assets/stylesheets/page_bundles/terms.scss
@@ -22,14 +22,6 @@
justify-content: space-between;
line-height: $line-height-base;
- .logo-text {
- width: 55px;
- height: 24px;
- display: flex;
- flex-direction: column;
- justify-content: center;
- }
-
.navbar-collapse {
padding-right: 0;
flex-grow: 0;
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index cc8ea1493fc..afe57bb26e6 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -35,9 +35,6 @@
}
.mr-widget-pipeline-graph {
- display: inline-block;
- vertical-align: middle;
-
.dropdown-menu {
margin-top: 11px;
}
@@ -45,8 +42,6 @@
}
.branch-info .commit-icon {
- margin-right: 8px;
-
svg {
top: 3px;
}
diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss
index f237d57aa88..e0319952adb 100644
--- a/app/assets/stylesheets/pages/detail_page.scss
+++ b/app/assets/stylesheets/pages/detail_page.scss
@@ -8,7 +8,8 @@
a {
color: $gl-text-color;
- &.link {
+ &.link,
+ &.gl-link {
color: $blue-600;
}
}
@@ -25,6 +26,7 @@
.detail-page-header-body {
position: relative;
display: flex;
+ align-items: center;
flex: 1 1;
min-width: 0;
@@ -38,9 +40,18 @@
align-self: center;
flex: 0 0 auto;
- @include media-breakpoint-down(xs) {
- width: 100%;
- margin-top: 10px;
+ &:not(.is-merge-request) {
+ @include media-breakpoint-down(xs) {
+ width: 100%;
+ margin-top: 10px;
+ }
+ }
+
+ &.is-merge-request {
+ @include media-breakpoint-down(sm) {
+ width: 100%;
+ margin-top: 10px;
+ }
}
}
@@ -56,4 +67,8 @@
.description {
margin-top: 6px;
}
+
+ .author-link {
+ color: $gl-text-color;
+ }
}
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index c00af802c06..4093ef087dc 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -108,21 +108,13 @@
.merge-icon {
color: $orange-400;
position: absolute;
+ bottom: -3px;
+ right: -3px;
filter: drop-shadow(0 0 0.5px $white) drop-shadow(0 0 1px $white) drop-shadow(0 0 2px $white);
}
}
-.assignee .merge-icon {
- top: calc(50% + 0.25rem);
- left: 1.275rem;
-}
-
-.reviewer .merge-icon {
- bottom: -3px;
- right: -3px;
-}
-
-.right-sidebar {
+@mixin right-sidebar {
position: fixed;
top: $header-height;
// Default value for CSS var must contain a unit
@@ -130,10 +122,23 @@
bottom: var(--review-bar-height, 0px);
right: 0;
transition: width $sidebar-transition-duration;
- background: $gray-light;
+ background-color: $white;
z-index: 200;
overflow: hidden;
+}
+
+.right-sidebar {
+ &:not(.right-sidebar-merge-requests) {
+ @include right-sidebar;
+ }
+
+ &.right-sidebar-merge-requests {
+ @include media-breakpoint-down(sm) {
+ @include right-sidebar;
+ }
+ }
+
@include media-breakpoint-down(sm) {
z-index: 251;
}
@@ -143,10 +148,6 @@
&:hover {
color: $blue-800;
-
- .avatar {
- border-color: rgba($gray-normal, 0.2);
- }
}
}
@@ -176,12 +177,26 @@
}
}
+ &.right-sidebar-merge-requests {
+ .block,
+ .sidebar-contained-width,
+ .issuable-sidebar-header {
+ width: 100%;
+ border-bottom: 0;
+ }
+
+ .block {
+ @include media-breakpoint-up(md) {
+ padding: $gl-spacing-scale-5 0;
+ }
+ }
+ }
+
.block,
.sidebar-contained-width,
.issuable-sidebar-header {
@include clearfix;
padding: $gl-padding 0;
- border-bottom: 1px solid $border-gray-normal;
// This prevents the mess when resizing the sidebar
// of elements repositioning themselves..
width: $gutter-inner-width;
@@ -218,16 +233,6 @@
}
}
- .cross-project-reference {
- span {
- width: 85%;
- }
-
- button {
- padding: 1px 5px;
- }
- }
-
.selectbox {
display: none;
@@ -242,9 +247,20 @@
.issuable-sidebar {
height: 100%;
- overflow-y: scroll;
- overflow-x: hidden;
- -webkit-overflow-scrolling: touch;
+
+ &:not(.is-merge-request) {
+ overflow-y: scroll;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ &.is-merge-request {
+ @include media-breakpoint-down(sm) {
+ overflow-y: scroll;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+ }
+ }
}
&.affix-top .issuable-sidebar {
@@ -252,7 +268,9 @@
}
&.right-sidebar-expanded {
- width: $gutter-width;
+ &:not(.right-sidebar-merge-requests) {
+ width: $gutter-width;
+ }
.value {
line-height: 1;
@@ -260,6 +278,12 @@
.issuable-sidebar {
padding: 0 20px;
+
+ &.is-merge-request {
+ @include media-breakpoint-up(md) {
+ padding: 0;
+ }
+ }
}
&:not(.boards-sidebar):not([data-signed-in]):not([data-always-show-toggle]) {
@@ -302,8 +326,17 @@
/* Extra small devices (phones, less than 768px) */
display: none;
/* Small devices (tablets, 768px and up) */
- @include media-breakpoint-up(sm) {
- display: block;
+
+ &:not(.right-sidebar-merge-requests) {
+ @include media-breakpoint-up(sm) {
+ display: block;
+ }
+ }
+
+ &.right-sidebar-merge-requests {
+ @include media-breakpoint-up(md) {
+ display: block;
+ }
}
width: $gutter-collapsed-width;
@@ -380,10 +413,6 @@
}
}
- .sidebar-avatar-counter {
- padding-top: 2px;
- }
-
.todo-undone {
color: $blue-600;
fill: $blue-600;
@@ -428,6 +457,10 @@
width: 24px;
height: 24px;
border-radius: 12px;
+
+ ~.merge-icon {
+ bottom: 0;
+ }
}
.sidebar-collapsed-user {
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index f127b0dc66c..04e0ef6631e 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -307,32 +307,3 @@ ul.related-merge-requests > li gl-emoji {
.issuable-header-slide-leave-to {
transform: translateY(-100%);
}
-
-.description.work-items-enabled {
- ul.task-list {
- > li.task-list-item {
- padding-inline-start: 2.5rem;
-
- .js-add-task {
- svg {
- visibility: hidden;
- }
-
- &:focus svg {
- visibility: visible;
- }
- }
-
- > input.task-list-item-checkbox {
- left: 1.25rem;
- }
-
- &:hover,
- &:focus-within {
- .js-add-task svg {
- visibility: visible;
- }
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index 4a3ec5992a5..7f0bdadd2bc 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -45,7 +45,6 @@
.omniauth-container {
box-shadow: 0 0 0 1px $border-color;
border-radius: $border-radius;
- padding: 15px;
.login-heading h3 {
font-weight: $gl-font-weight-normal;
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index f95cff012d0..0d3ed0e7c71 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -233,8 +233,7 @@ $tabs-holder-z-index: 250;
top: calc(#{$header-height} + #{$system-header-height} + #{$performance-bar-height});
}
- @include media-breakpoint-up(sm) {
- position: -webkit-sticky;
+ @include media-breakpoint-up(md) {
position: sticky;
}
@@ -294,8 +293,7 @@ $tabs-holder-z-index: 250;
justify-content: space-between;
@include media-breakpoint-down(xs) {
- .discussion-filter-container,
- .line-resolve-all-container {
+ .discussion-filter-container {
margin-bottom: $gl-padding-4;
}
}
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index d8c3851748d..1949603b416 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -840,35 +840,6 @@ $system-note-svg-size: 16px;
}
}
-.line-resolve-all-container {
- > div {
- white-space: nowrap;
- }
-
- .btn-group .btn:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
-}
-
-.line-resolve-all {
- vertical-align: middle;
- display: inline-block;
- padding: $gl-padding-8 $gl-padding-12;
- background-color: $gray-light;
- border: 1px solid $border-color;
- border-right: 0;
- border-radius: $border-radius-default;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- font-size: $gl-font-size;
- line-height: 1rem;
-
- @include media-breakpoint-down(xs) {
- flex: 1;
- }
-}
-
.line-resolve-btn {
position: relative;
top: 0;
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 8034389adc8..3b76130dd1a 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -548,15 +548,6 @@ pre.light-well {
}
}
-.git-clone-holder,
-.mobile-git-clone {
- .btn {
- .icon {
- fill: $white;
- }
- }
-}
-
.new-protected-branch,
.new-protected-tag {
label {
@@ -713,22 +704,6 @@ pre.light-well {
margin-bottom: 10px;
}
-.service-installation {
- padding: 32px;
- margin: 32px;
- border-radius: 3px;
- background-color: $white;
-
- h3 {
- margin-top: 0;
- }
-
- hr {
- margin: 32px 0;
- border-color: $border-color;
- }
-}
-
.project-badge {
opacity: 0.9;
diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index 18a0f119edf..8755db83d35 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -2,6 +2,11 @@ $search-dropdown-max-height: 400px;
$search-avatar-size: 16px;
$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;
+
+$border-radius-medium: 3px;
.search-results {
.search-result-row {
@@ -37,8 +42,44 @@ input[type='checkbox']:hover {
0 0 0 1px lighten($dropdown-input-focus-shadow, 20%);
}
+.header-content {
+ .header-search-new {
+ max-width: $search-input-field-max-width;
+ }
+
+ &.header-search-is-active {
+ .navbar-collapse {
+ flex-grow: 1;
+ }
+
+ @include media-breakpoint-down(lg) {
+ .title-container {
+ flex: 0;
+ overflow: hidden;
+ }
+ }
+
+ @include media-breakpoint-up(xl) {
+ .navbar-nav {
+ padding-left: 1rem;
+ }
+ }
+ }
+}
+
+// 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 {
- width: 320px;
+ min-width: $search-input-field-min-width;
+
+ @include media-breakpoint-between(md, lg) {
+ min-width: $search-input-field-x-min-width;
+ }
input,
svg {
@@ -66,9 +107,10 @@ input[type='checkbox']:hover {
border-width: 0;
border-style: solid;
border-image: none;
- border-radius: 3px;
+ 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;
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index 33c66648718..a9fbff8958d 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -6,10 +6,6 @@
.nav-block {
margin: 16px 0;
- .btn svg {
- color: $gl-text-color-secondary;
- }
-
.tree-ref-holder {
margin-right: 15px;
}
@@ -100,7 +96,7 @@
}
}
- .tree-table {
+ table.tree-table {
margin-bottom: 0;
tr {
diff --git a/app/assets/stylesheets/startup/startup-dark.scss b/app/assets/stylesheets/startup/startup-dark.scss
index 62d45332204..001431e517b 100644
--- a/app/assets/stylesheets/startup/startup-dark.scss
+++ b/app/assets/stylesheets/startup/startup-dark.scss
@@ -12,6 +12,7 @@ body.gl-dark {
--gl-text-color: #fafafa;
--border-color: #4f4f4f;
--black: #fff;
+ --nav-active-bg: rgba(255, 255, 255, 0.08);
}
:root {
--white: #333;
@@ -350,9 +351,6 @@ h1 {
.d-lg-none {
display: none !important;
}
- .d-lg-block {
- display: block !important;
- }
}
.sr-only {
position: absolute;
@@ -393,8 +391,7 @@ a.gl-badge.badge-info:active {
background-color: #0b5cad;
}
a.gl-badge.badge-info:active {
- box-shadow: inset 0 0 0 1px rgba(51, 51, 51, 0.8),
- 0 0 0 1px rgba(51, 51, 51, 0.4), 0 0 0 4px rgba(66, 143, 220, 0.48);
+ box-shadow: 0 0 0 1px #333, 0 0 0 3px #1f75cb;
outline: none;
}
.gl-badge.badge-success {
@@ -407,8 +404,7 @@ a.gl-badge.badge-success:active {
background-color: #24663b;
}
a.gl-badge.badge-success:active {
- box-shadow: inset 0 0 0 1px rgba(51, 51, 51, 0.8),
- 0 0 0 1px rgba(51, 51, 51, 0.4), 0 0 0 4px rgba(66, 143, 220, 0.48);
+ box-shadow: 0 0 0 1px #333, 0 0 0 3px #1f75cb;
outline: none;
}
.gl-badge.badge-warning {
@@ -421,8 +417,7 @@ a.gl-badge.badge-warning:active {
background-color: #8f4700;
}
a.gl-badge.badge-warning:active {
- box-shadow: inset 0 0 0 1px rgba(51, 51, 51, 0.8),
- 0 0 0 1px rgba(51, 51, 51, 0.4), 0 0 0 4px rgba(66, 143, 220, 0.48);
+ box-shadow: 0 0 0 1px #333, 0 0 0 3px #1f75cb;
outline: none;
}
.gl-button .gl-badge {
@@ -487,9 +482,8 @@ a.gl-badge.badge-warning:active {
}
.gl-link:active {
text-decoration: underline;
- box-shadow: 0 0 0 1px rgba(51, 51, 51, 0.4),
- 0 0 0 4px rgba(66, 143, 220, 0.48);
- outline: none;
+ outline: 2px solid #1f75cb;
+ outline-offset: 2px;
}
.gl-button {
display: inline-flex;
@@ -518,8 +512,7 @@ a.gl-badge.badge-warning:active {
}
.gl-button.gl-button.btn-default:active,
.gl-button.gl-button.btn-default.active {
- box-shadow: inset 0 0 0 2px #bfbfbf, 0 0 0 1px rgba(51, 51, 51, 0.4),
- 0 0 0 4px rgba(66, 143, 220, 0.48);
+ box-shadow: inset 0 0 0 1px #bfbfbf, 0 0 0 1px #333, 0 0 0 3px #1f75cb;
outline: none;
background-color: #404040;
}
@@ -742,7 +735,7 @@ body {
}
}
@media (max-width: 767.98px) {
- .dropdown-menu-toggle {
+ .dropdown-menu-toggle.dropdown-menu-toggle {
width: 100%;
}
}
@@ -770,15 +763,6 @@ input {
right: 0;
border-radius: 0;
}
-.navbar-gitlab .logo-text {
- line-height: initial;
-}
-.navbar-gitlab .logo-text svg {
- width: 55px;
- height: 14px;
- margin: 0;
- fill: #333;
-}
.navbar-gitlab .close-icon {
display: none;
}
@@ -790,13 +774,6 @@ input {
min-height: var(--header-height, 40px);
padding-left: 0;
}
-.navbar-gitlab .header-content .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
-}
.navbar-gitlab .header-content .title {
padding-right: 0;
color: currentColor;
@@ -817,9 +794,12 @@ input {
display: flex;
align-items: center;
padding: 2px 8px;
- margin: 5px 2px 5px -8px;
+ margin: 4px 2px 4px -12px;
border-radius: 4px;
}
+.navbar-gitlab .header-content .title .canary-badge {
+ margin-left: -8px;
+}
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
margin: 0 2px;
}
@@ -853,7 +833,7 @@ input {
border-radius: 0;
min-width: 45px;
padding: 0;
- margin: 8px -7px 8px 0;
+ margin: 8px 8px 8px 0;
font-size: 14px;
text-align: center;
color: currentColor;
@@ -997,6 +977,16 @@ input {
.top-nav-toggle .dropdown-icon {
margin-right: 0.5rem;
}
+.tanuki-logo .tanuki {
+ fill: #e24329;
+}
+.tanuki-logo .left-cheek,
+.tanuki-logo .right-cheek {
+ fill: #fc6d26;
+}
+.tanuki-logo .chin {
+ fill: #fca326;
+}
.context-header {
position: relative;
margin-right: 2px;
@@ -1513,8 +1503,16 @@ svg.s12 {
svg.s16 {
vertical-align: -3px;
}
+.header-content .header-search-new {
+ max-width: 600px;
+}
.header-search {
- width: 320px;
+ min-width: 320px;
+}
+@media (min-width: 768px) and (max-width: 1199.98px) {
+ .header-search {
+ min-width: 200px;
+ }
}
.header-search.is-not-active::after {
content: "/";
@@ -1535,6 +1533,7 @@ svg.s16 {
border-radius: 3px;
box-shadow: none;
white-space: pre-wrap;
+ box-sizing: border-box;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: keep-all;
@@ -1787,6 +1786,7 @@ body.gl-dark {
--white: #333;
--black: #fff;
--svg-status-bg: #333;
+ --nav-active-bg: rgba(255, 255, 255, 0.08);
}
.nav-sidebar li a {
color: var(--gray-600);
@@ -1862,6 +1862,7 @@ body.gl-dark
}
body.gl-dark .header-search {
background-color: rgba(250, 250, 250, 0.2) !important;
+ border-radius: 4px;
}
body.gl-dark .header-search svg.gl-search-box-by-type-search-icon {
color: rgba(250, 250, 250, 0.8);
@@ -1900,9 +1901,6 @@ body.gl-dark .nav-sidebar .fly-out-top-item .fly-out-top-item-container {
background-color: var(--gray-100, #303030);
color: var(--gray-900, #fafafa);
}
-body.gl-dark .logo-text svg {
- fill: var(--gl-text-color);
-}
body.gl-dark .navbar-gitlab {
background-color: var(--gray-50);
box-shadow: 0 1px 0 0 var(--gray-100);
@@ -2023,6 +2021,7 @@ body.gl-dark {
--white: #333;
--black: #fff;
--svg-status-bg: #333;
+ --nav-active-bg: rgba(255, 255, 255, 0.08);
}
.tab-width-8 {
-moz-tab-size: 8;
@@ -2045,17 +2044,47 @@ body.gl-dark {
.gl-display-none {
display: none;
}
+@media (min-width: 992px) {
+ .gl-lg-display-none\! {
+ display: none !important;
+ }
+}
+.gl-display-flex {
+ display: flex;
+}
+@media (min-width: 992px) {
+ .gl-lg-display-flex {
+ display: flex;
+ }
+}
@media (min-width: 576px) {
.gl-sm-display-block {
display: block;
}
}
+@media (min-width: 992px) {
+ .gl-lg-display-block {
+ display: block;
+ }
+}
+.gl-display-inline-block\! {
+ display: inline-block !important;
+}
+.gl-align-items-stretch {
+ align-items: stretch;
+}
+.gl-flex-grow-1 {
+ flex-grow: 1;
+}
.gl-relative {
position: relative;
}
.gl-absolute {
position: absolute;
}
+.gl-w-full {
+ width: 100%;
+}
.gl-px-3 {
padding-left: 0.5rem;
padding-right: 0.5rem;
@@ -2063,6 +2092,9 @@ body.gl-dark {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-pt-0 {
+ padding-top: 0;
+}
.gl-ml-n2 {
margin-left: -0.25rem;
}
@@ -2073,6 +2105,12 @@ body.gl-dark {
margin-left: 0 !important;
margin-right: 0 !important;
}
+.gl-text-right {
+ text-align: right;
+}
+.gl-white-space-nowrap {
+ white-space: nowrap;
+}
.gl-font-sm {
font-size: 0.75rem;
}
diff --git a/app/assets/stylesheets/startup/startup-general.scss b/app/assets/stylesheets/startup/startup-general.scss
index a8b7299b935..c42b5554d8d 100644
--- a/app/assets/stylesheets/startup/startup-general.scss
+++ b/app/assets/stylesheets/startup/startup-general.scss
@@ -336,9 +336,6 @@ h1 {
.d-lg-none {
display: none !important;
}
- .d-lg-block {
- display: block !important;
- }
}
.sr-only {
position: absolute;
@@ -379,8 +376,7 @@ a.gl-badge.badge-info:active {
background-color: #9dc7f1;
}
a.gl-badge.badge-info:active {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.8),
- 0 0 0 1px rgba(255, 255, 255, 0.4), 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
}
.gl-badge.badge-success {
@@ -393,8 +389,7 @@ a.gl-badge.badge-success:active {
background-color: #91d4a8;
}
a.gl-badge.badge-success:active {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.8),
- 0 0 0 1px rgba(255, 255, 255, 0.4), 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
}
.gl-badge.badge-warning {
@@ -407,8 +402,7 @@ a.gl-badge.badge-warning:active {
background-color: #e9be74;
}
a.gl-badge.badge-warning:active {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.8),
- 0 0 0 1px rgba(255, 255, 255, 0.4), 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
}
.gl-button .gl-badge {
@@ -473,9 +467,8 @@ a.gl-badge.badge-warning:active {
}
.gl-link:active {
text-decoration: underline;
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
- outline: none;
+ outline: 2px solid #428fdc;
+ outline-offset: 2px;
}
.gl-button {
display: inline-flex;
@@ -504,8 +497,7 @@ a.gl-badge.badge-warning:active {
}
.gl-button.gl-button.btn-default:active,
.gl-button.gl-button.btn-default.active {
- box-shadow: inset 0 0 0 2px #5e5e5e, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: inset 0 0 0 1px #5e5e5e, 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
background-color: #dbdbdb;
}
@@ -728,7 +720,7 @@ body {
}
}
@media (max-width: 767.98px) {
- .dropdown-menu-toggle {
+ .dropdown-menu-toggle.dropdown-menu-toggle {
width: 100%;
}
}
@@ -756,15 +748,6 @@ input {
right: 0;
border-radius: 0;
}
-.navbar-gitlab .logo-text {
- line-height: initial;
-}
-.navbar-gitlab .logo-text svg {
- width: 55px;
- height: 14px;
- margin: 0;
- fill: #fff;
-}
.navbar-gitlab .close-icon {
display: none;
}
@@ -776,13 +759,6 @@ input {
min-height: var(--header-height, 40px);
padding-left: 0;
}
-.navbar-gitlab .header-content .title-container {
- display: flex;
- align-items: stretch;
- flex: 1 1 auto;
- padding-top: 0;
- overflow: visible;
-}
.navbar-gitlab .header-content .title {
padding-right: 0;
color: currentColor;
@@ -803,9 +779,12 @@ input {
display: flex;
align-items: center;
padding: 2px 8px;
- margin: 5px 2px 5px -8px;
+ margin: 4px 2px 4px -12px;
border-radius: 4px;
}
+.navbar-gitlab .header-content .title .canary-badge {
+ margin-left: -8px;
+}
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
margin: 0 2px;
}
@@ -839,7 +818,7 @@ input {
border-radius: 0;
min-width: 45px;
padding: 0;
- margin: 8px -7px 8px 0;
+ margin: 8px 8px 8px 0;
font-size: 14px;
text-align: center;
color: currentColor;
@@ -983,6 +962,16 @@ input {
.top-nav-toggle .dropdown-icon {
margin-right: 0.5rem;
}
+.tanuki-logo .tanuki {
+ fill: #e24329;
+}
+.tanuki-logo .left-cheek,
+.tanuki-logo .right-cheek {
+ fill: #fc6d26;
+}
+.tanuki-logo .chin {
+ fill: #fca326;
+}
.context-header {
position: relative;
margin-right: 2px;
@@ -1499,8 +1488,16 @@ svg.s12 {
svg.s16 {
vertical-align: -3px;
}
+.header-content .header-search-new {
+ max-width: 600px;
+}
.header-search {
- width: 320px;
+ min-width: 320px;
+}
+@media (min-width: 768px) and (max-width: 1199.98px) {
+ .header-search {
+ min-width: 200px;
+ }
}
.header-search.is-not-active::after {
content: "/";
@@ -1521,6 +1518,7 @@ svg.s16 {
border-radius: 3px;
box-shadow: none;
white-space: pre-wrap;
+ box-sizing: border-box;
word-wrap: break-word;
overflow-wrap: break-word;
word-break: keep-all;
@@ -1706,17 +1704,47 @@ svg.s16 {
.gl-display-none {
display: none;
}
+@media (min-width: 992px) {
+ .gl-lg-display-none\! {
+ display: none !important;
+ }
+}
+.gl-display-flex {
+ display: flex;
+}
+@media (min-width: 992px) {
+ .gl-lg-display-flex {
+ display: flex;
+ }
+}
@media (min-width: 576px) {
.gl-sm-display-block {
display: block;
}
}
+@media (min-width: 992px) {
+ .gl-lg-display-block {
+ display: block;
+ }
+}
+.gl-display-inline-block\! {
+ display: inline-block !important;
+}
+.gl-align-items-stretch {
+ align-items: stretch;
+}
+.gl-flex-grow-1 {
+ flex-grow: 1;
+}
.gl-relative {
position: relative;
}
.gl-absolute {
position: absolute;
}
+.gl-w-full {
+ width: 100%;
+}
.gl-px-3 {
padding-left: 0.5rem;
padding-right: 0.5rem;
@@ -1724,6 +1752,9 @@ svg.s16 {
.gl-pr-2 {
padding-right: 0.25rem;
}
+.gl-pt-0 {
+ padding-top: 0;
+}
.gl-ml-n2 {
margin-left: -0.25rem;
}
@@ -1734,6 +1765,12 @@ svg.s16 {
margin-left: 0 !important;
margin-right: 0 !important;
}
+.gl-text-right {
+ text-align: right;
+}
+.gl-white-space-nowrap {
+ white-space: nowrap;
+}
.gl-font-sm {
font-size: 0.75rem;
}
diff --git a/app/assets/stylesheets/startup/startup-signin.scss b/app/assets/stylesheets/startup/startup-signin.scss
index 751ad26ca21..020ed9c040b 100644
--- a/app/assets/stylesheets/startup/startup-signin.scss
+++ b/app/assets/stylesheets/startup/startup-signin.scss
@@ -138,9 +138,8 @@ hr {
margin-right: -15px;
margin-left: -15px;
}
+.col-md-6,
.col-sm-12,
-.col-sm-7,
-.col-sm-5,
.col {
position: relative;
width: 100%;
@@ -159,14 +158,6 @@ hr {
order: 12;
}
@media (min-width: 576px) {
- .col-sm-5 {
- flex: 0 0 41.6666666667%;
- max-width: 41.6666666667%;
- }
- .col-sm-7 {
- flex: 0 0 58.3333333333%;
- max-width: 58.3333333333%;
- }
.col-sm-12 {
flex: 0 0 100%;
max-width: 100%;
@@ -178,6 +169,12 @@ hr {
order: 12;
}
}
+@media (min-width: 768px) {
+ .col-md-6 {
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+}
.form-control {
display: block;
width: 100%;
@@ -354,8 +351,7 @@ fieldset:disabled a.btn {
background-color: #fff;
}
.gl-button.gl-button.btn-default:active {
- box-shadow: inset 0 0 0 2px #5e5e5e, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: inset 0 0 0 1px #5e5e5e, 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
background-color: #dbdbdb;
}
@@ -367,8 +363,7 @@ fieldset:disabled a.btn {
box-shadow: inset 0 0 0 1px #1068bf;
}
.gl-button.gl-button.btn-confirm:active {
- box-shadow: inset 0 0 0 2px #033464, 0 0 0 1px rgba(255, 255, 255, 0.4),
- 0 0 0 4px rgba(31, 117, 203, 0.48);
+ box-shadow: inset 0 0 0 1px #033464, 0 0 0 1px #fff, 0 0 0 3px #428fdc;
outline: none;
background-color: #0b5cad;
}
@@ -519,6 +514,16 @@ label.label-bold {
.navbar-empty .brand-header-logo {
max-height: 100%;
}
+.tanuki-logo .tanuki {
+ fill: #e24329;
+}
+.tanuki-logo .left-cheek,
+.tanuki-logo .right-cheek {
+ fill: #fc6d26;
+}
+.tanuki-logo .chin {
+ fill: #fca326;
+}
input::-moz-placeholder {
color: #868686;
opacity: 1;
@@ -568,7 +573,6 @@ svg {
.login-page .omniauth-container {
box-shadow: 0 0 0 1px #dbdbdb;
border-radius: 0.25rem;
- padding: 15px;
}
.login-page .login-box .login-heading h3,
.login-page .omniauth-container .login-heading h3 {
diff --git a/app/assets/stylesheets/themes/_dark.scss b/app/assets/stylesheets/themes/_dark.scss
index 550e3981401..6a9e96c3ac5 100644
--- a/app/assets/stylesheets/themes/_dark.scss
+++ b/app/assets/stylesheets/themes/_dark.scss
@@ -99,6 +99,7 @@ $white-normal: #333;
$white-dark: #444;
$border-color: #4f4f4f;
+$nav-active-bg: rgba(255, 255, 255, 0.08);
body.gl-dark {
--gray-10: #{$gray-10};
@@ -199,6 +200,7 @@ body.gl-dark {
--black: #{$black};
--svg-status-bg: #{$white};
+ --nav-active-bg: #{$nav-active-bg};
.gl-button.gl-button,
.gl-button.gl-button.btn-block {
diff --git a/app/assets/stylesheets/themes/dark_mode_overrides.scss b/app/assets/stylesheets/themes/dark_mode_overrides.scss
index 83254fe1a52..dbb961fe71f 100644
--- a/app/assets/stylesheets/themes/dark_mode_overrides.scss
+++ b/app/assets/stylesheets/themes/dark_mode_overrides.scss
@@ -71,10 +71,13 @@
body.gl-dark {
@include gitlab-theme($gray-900, $gray-400, $gray-500, $gray-900, $gray-900, $white);
- .logo-text svg {
- fill: var(--gl-text-color);
+ .terms {
+ .logo-text {
+ fill: var(--black);
+ }
}
+
.navbar-gitlab {
background-color: var(--gray-50);
box-shadow: 0 1px 0 0 var(--gray-100);
diff --git a/app/assets/stylesheets/themes/theme_helper.scss b/app/assets/stylesheets/themes/theme_helper.scss
index 07194e2b532..234010074aa 100644
--- a/app/assets/stylesheets/themes/theme_helper.scss
+++ b/app/assets/stylesheets/themes/theme_helper.scss
@@ -150,6 +150,7 @@
.header-search {
background-color: rgba($search-and-nav-links, 0.2) !important;
+ border-radius: $border-radius-default;
&:hover {
background-color: rgba($search-and-nav-links, 0.3) !important;
diff --git a/app/assets/stylesheets/themes/theme_light.scss b/app/assets/stylesheets/themes/theme_light.scss
index f2fdd499781..66b2b3c3437 100644
--- a/app/assets/stylesheets/themes/theme_light.scss
+++ b/app/assets/stylesheets/themes/theme_light.scss
@@ -15,8 +15,8 @@ body {
background-color: $gray-50;
box-shadow: 0 1px 0 0 $border-color;
- .logo-text svg {
- fill: $gray-900;
+ .logo-text {
+ fill: #171321;
}
.navbar-sub-nav,
@@ -48,6 +48,7 @@ body {
.header-search {
background-color: $white !important;
box-shadow: inset 0 0 0 1px $border-color !important;
+ border-radius: $border-radius-default;
&:hover {
background-color: $white !important;
diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss
index d7a5e21e303..fd85ff894a7 100644
--- a/app/assets/stylesheets/utilities.scss
+++ b/app/assets/stylesheets/utilities.scss
@@ -366,3 +366,30 @@ to @gitlab/ui by https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1709
/* stylelint-disable property-no-vendor-prefix */
-webkit-backdrop-filter: blur(2px); // still required by Safari
}
+
+/*
+ * The below style will be moved to @gitlab/ui by
+ * https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1792
+ */
+.gl-text-purple-800 {
+ color: $purple-800;
+}
+
+.gl-bg-theme-indigo-800 {
+ background-color: $theme-indigo-800;
+}
+
+.gl-border-indigo-700 {
+ border-color: $theme-indigo-700;
+}
+
+.gl-border-gray-75 {
+ border-color: $gl-text-color-quaternary;
+}
+
+.gl-min-h-8 {
+ min-height: $gl-spacing-scale-8;
+}
+
+/* End gitlab-ui#1751 */
+
diff --git a/app/components/diffs/overflow_warning_component.html.haml b/app/components/diffs/overflow_warning_component.html.haml
index 907d066e73d..b184fa1d527 100644
--- a/app/components/diffs/overflow_warning_component.html.haml
+++ b/app/components/diffs/overflow_warning_component.html.haml
@@ -1,9 +1,9 @@
= render Pajamas::AlertComponent.new(title: _('Too many changes to show.'),
variant: :warning,
- alert_class: 'gl-mb-5') do
- .gl-alert-body
+ alert_class: 'gl-mb-5') do |c|
+ = c.body do
= message
- .gl-alert-actions
+ = c.actions do
= diff_link
= patch_link
diff --git a/app/components/pajamas/alert_component.html.haml b/app/components/pajamas/alert_component.html.haml
index a1d3c700e57..782ac8b9ca2 100644
--- a/app/components/pajamas/alert_component.html.haml
+++ b/app/components/pajamas/alert_component.html.haml
@@ -1,5 +1,6 @@
-.gl-alert{ role: 'alert', class: ["gl-alert-#{@variant}", @alert_class], data: @alert_data }
- = sprite_icon(icon, css_class: icon_classes)
+.gl-alert{ role: 'alert', class: [base_class, @alert_class], data: @alert_data }
+ - if @show_icon
+ = sprite_icon(icon, css_class: icon_classes)
- if @dismissible
%button.btn.gl-dismiss-btn.btn-default.btn-sm.gl-button.btn-default-tertiary.btn-icon.js-close{ type: 'button',
aria: { label: _('Dismiss') },
@@ -10,4 +11,9 @@
- if @title
%h4.gl-alert-title
= @title
- = content
+ - if body?
+ .gl-alert-body
+ = body
+ - if actions?
+ .gl-alert-actions
+ = actions
diff --git a/app/components/pajamas/alert_component.rb b/app/components/pajamas/alert_component.rb
index 4bb6c41661b..c1b2132da29 100644
--- a/app/components/pajamas/alert_component.rb
+++ b/app/components/pajamas/alert_component.rb
@@ -6,26 +6,39 @@ module Pajamas
# @param [String] title
# @param [Symbol] variant
# @param [Boolean] dismissible
+ # @param [Boolean] show_icon
# @param [String] alert_class
# @param [Hash] alert_data
# @param [String] close_button_class
# @param [Hash] close_button_data
def initialize(
- title: nil, variant: :info, dismissible: true,
+ title: nil, variant: :info, dismissible: true, show_icon: true,
alert_class: nil, alert_data: {}, close_button_class: nil, close_button_data: {})
@title = title
@variant = variant
@dismissible = dismissible
+ @show_icon = show_icon
@alert_class = alert_class
@alert_data = alert_data
@close_button_class = close_button_class
@close_button_data = close_button_data
end
+ def base_class
+ classes = ["gl-alert-#{@variant}"]
+ classes.push('gl-alert-not-dismissible') unless @dismissible
+ classes.push('gl-alert-no-icon') unless @show_icon
+
+ classes.join(' ')
+ end
+
private
delegate :sprite_icon, to: :helpers
+ renders_one :body
+ renders_one :actions
+
ICONS = {
info: 'information-o',
warning: 'warning',
diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb
index 75d1e4bf6a0..253fca0a253 100644
--- a/app/controllers/admin/application_settings_controller.rb
+++ b/app/controllers/admin/application_settings_controller.rb
@@ -27,6 +27,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
feature_category :source_code_management, [:repository, :clear_repository_check_states]
feature_category :continuous_integration, [:ci_cd, :reset_registration_token]
+ urgency :low, [:ci_cd, :reset_registration_token]
feature_category :service_ping, [:usage_data, :service_usage_data]
feature_category :integrations, [:integrations]
feature_category :pages, [:lets_encrypt_terms_of_service]
@@ -53,7 +54,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
end
def service_usage_data
- @service_ping_data_present = Rails.cache.exist?('usage_data')
+ @service_ping_data_present = prerecorded_service_ping_data.present?
end
def update
@@ -63,7 +64,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
def usage_data
respond_to do |format|
format.html do
- usage_data_json = Gitlab::Json.pretty_generate(Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values, cached: true))
+ usage_data_json = Gitlab::Json.pretty_generate(service_ping_data)
render html: Gitlab::Highlight.highlight('payload.json', usage_data_json, language: 'json')
end
@@ -71,7 +72,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
format.json do
Gitlab::UsageDataCounters::ServiceUsageDataCounter.count(:download_payload_click)
- render json: Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values, cached: true).to_json
+ render json: service_ping_data.to_json
end
end
end
@@ -255,6 +256,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
:raw_blob_request_limit,
:issues_create_limit,
:notes_create_limit,
+ :pipeline_limit_per_project_user_sha,
:default_branch_name,
disabled_oauth_sign_in_sources: [],
import_sources: [],
@@ -306,6 +308,14 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
def valid_setting_panels
VALID_SETTING_PANELS
end
+
+ def service_ping_data
+ prerecorded_service_ping_data || Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values)
+ end
+
+ def prerecorded_service_ping_data
+ Rails.cache.fetch(Gitlab::Usage::ServicePingReport::CACHE_KEY) || ::RawUsageData.for_current_reporting_cycle.first&.payload
+ end
end
Admin::ApplicationSettingsController.prepend_mod_with('Admin::ApplicationSettingsController')
diff --git a/app/controllers/admin/applications_controller.rb b/app/controllers/admin/applications_controller.rb
index 83413afb6b7..a6a21cf3649 100644
--- a/app/controllers/admin/applications_controller.rb
+++ b/app/controllers/admin/applications_controller.rb
@@ -19,10 +19,7 @@ class Admin::ApplicationsController < Admin::ApplicationController
end
def new
- # Default access tokens to expire. This preserves backward compatibility
- # with existing applications. This will be removed in 15.0.
- # Removal issue: https://gitlab.com/gitlab-org/gitlab/-/issues/340848
- @application = Doorkeeper::Application.new(expire_access_tokens: true)
+ @application = Doorkeeper::Application.new
end
def edit
diff --git a/app/controllers/admin/background_migrations_controller.rb b/app/controllers/admin/background_migrations_controller.rb
index 42b89a3317e..c6c9e0ced22 100644
--- a/app/controllers/admin/background_migrations_controller.rb
+++ b/app/controllers/admin/background_migrations_controller.rb
@@ -2,6 +2,9 @@
class Admin::BackgroundMigrationsController < Admin::ApplicationController
feature_category :database
+ urgency :low
+
+ around_action :support_multiple_databases
def index
@relations_by_tab = {
@@ -13,6 +16,13 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
@current_tab = @relations_by_tab.key?(params[:tab]) ? params[:tab] : 'queued'
@migrations = @relations_by_tab[@current_tab].page(params[:page])
@successful_rows_counts = batched_migration_class.successful_rows_counts(@migrations.map(&:id))
+ @databases = Gitlab::Database.db_config_names
+ end
+
+ def show
+ @migration = batched_migration_class.find(params[:id])
+
+ @failed_jobs = @migration.batched_jobs.with_status(:failed).page(params[:page])
end
def pause
@@ -38,6 +48,18 @@ class Admin::BackgroundMigrationsController < Admin::ApplicationController
private
+ def support_multiple_databases
+ Gitlab::Database::SharedModel.using_connection(base_model.connection) do
+ yield
+ end
+ end
+
+ def base_model
+ @selected_database = params[:database] || Gitlab::Database::MAIN_DATABASE_NAME
+
+ Gitlab::Database.database_base_models[@selected_database]
+ end
+
def batched_migration_class
@batched_migration_class ||= Gitlab::Database::BackgroundMigration::BatchedMigration
end
diff --git a/app/controllers/admin/batched_jobs_controller.rb b/app/controllers/admin/batched_jobs_controller.rb
new file mode 100644
index 00000000000..0a00ba13dc8
--- /dev/null
+++ b/app/controllers/admin/batched_jobs_controller.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class Admin::BatchedJobsController < Admin::ApplicationController
+ feature_category :database
+ urgency :low
+
+ around_action :support_multiple_databases
+
+ def show
+ @job = Gitlab::Database::BackgroundMigration::BatchedJob.find(params[:id])
+
+ @transition_logs = @job.batched_job_transition_logs
+ end
+
+ private
+
+ def support_multiple_databases
+ Gitlab::Database::SharedModel.using_connection(base_model.connection) do
+ yield
+ end
+ end
+
+ def base_model
+ @selected_database = params[:database] || Gitlab::Database::MAIN_DATABASE_NAME
+
+ Gitlab::Database.database_base_models[@selected_database]
+ end
+end
diff --git a/app/controllers/admin/deploy_keys_controller.rb b/app/controllers/admin/deploy_keys_controller.rb
index ed63e65d4df..b24b25446b0 100644
--- a/app/controllers/admin/deploy_keys_controller.rb
+++ b/app/controllers/admin/deploy_keys_controller.rb
@@ -5,6 +5,7 @@ class Admin::DeployKeysController < Admin::ApplicationController
before_action :deploy_key, only: [:destroy, :edit, :update]
feature_category :continuous_delivery
+ urgency :low
def index
end
diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb
index 9abb244bc92..4d163824ef6 100644
--- a/app/controllers/admin/groups_controller.rb
+++ b/app/controllers/admin/groups_controller.rb
@@ -61,7 +61,7 @@ class Admin::GroupsController < Admin::ApplicationController
end
def members_update
- member_params = params.permit(:user_ids, :access_level, :expires_at)
+ member_params = params.permit(:user_id, :access_level, :expires_at)
result = Members::CreateService.new(current_user, member_params.merge(limit: -1, source: @group, invite_source: 'admin-group-page')).execute
if result[:status] == :success
diff --git a/app/controllers/admin/jobs_controller.rb b/app/controllers/admin/jobs_controller.rb
index b800ca79d6b..ef9264d1615 100644
--- a/app/controllers/admin/jobs_controller.rb
+++ b/app/controllers/admin/jobs_controller.rb
@@ -4,6 +4,7 @@ class Admin::JobsController < Admin::ApplicationController
BUILDS_PER_PAGE = 30
feature_category :continuous_integration
+ urgency :low
def index
# We need all builds for tabs counters
diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb
index 822b7a93c9c..4747f3c5dea 100644
--- a/app/controllers/admin/labels_controller.rb
+++ b/app/controllers/admin/labels_controller.rb
@@ -4,6 +4,7 @@ class Admin::LabelsController < Admin::ApplicationController
before_action :set_label, only: [:show, :edit, :update, :destroy]
feature_category :team_planning
+ urgency :low
def index
@labels = Label.templates.page(params[:page])
diff --git a/app/controllers/admin/requests_profiles_controller.rb b/app/controllers/admin/requests_profiles_controller.rb
deleted file mode 100644
index b60cb7ff9c2..00000000000
--- a/app/controllers/admin/requests_profiles_controller.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-class Admin::RequestsProfilesController < Admin::ApplicationController
- feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
-
- def index
- @profile_token = Gitlab::RequestProfiler.profile_token
- @profiles = Gitlab::RequestProfiler.all.group_by(&:request_path)
- end
-
- def show
- clean_name = Rack::Utils.clean_path_info(params[:name])
- profile = Gitlab::RequestProfiler.find(clean_name)
-
- unless profile && profile.content_type
- return redirect_to admin_requests_profiles_path, alert: 'Profile not found'
- end
-
- send_file profile.file_path, type: "#{profile.content_type}; charset=utf-8", disposition: 'inline'
- end
-end
diff --git a/app/controllers/admin/runner_projects_controller.rb b/app/controllers/admin/runner_projects_controller.rb
index a4055cbe990..0165c6471db 100644
--- a/app/controllers/admin/runner_projects_controller.rb
+++ b/app/controllers/admin/runner_projects_controller.rb
@@ -4,6 +4,7 @@ class Admin::RunnerProjectsController < Admin::ApplicationController
before_action :project, only: [:create]
feature_category :runner
+ urgency :low
def create
@runner = Ci::Runner.find(params[:runner_project][:runner_id])
diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb
index 06880ace899..02e33baaf07 100644
--- a/app/controllers/admin/runners_controller.rb
+++ b/app/controllers/admin/runners_controller.rb
@@ -5,24 +5,20 @@ class Admin::RunnersController < Admin::ApplicationController
before_action :runner, except: [:index, :tag_list, :runner_setup_scripts]
before_action only: [:index] do
- push_frontend_feature_flag(:admin_runners_bulk_delete, default_enabled: :yaml)
+ push_frontend_feature_flag(:admin_runners_bulk_delete)
end
feature_category :runner
+ urgency :low
def index
end
def show
- # We will show runner details in a read-only view in
- # future iterations. For now, this route will have a
- # redirect until this new view is developed. See more:
- # https://gitlab.com/gitlab-org/gitlab/-/issues/347856
- redirect_to edit_admin_runner_path(runner) unless Feature.enabled?(:runner_read_only_admin_view, default_enabled: :yaml)
end
def edit
- assign_builds_and_projects
+ assign_projects
end
def update
@@ -31,7 +27,7 @@ class Admin::RunnersController < Admin::ApplicationController
format.html { redirect_to edit_admin_runner_path(@runner) }
end
else
- assign_builds_and_projects
+ assign_projects
render 'show'
end
end
@@ -87,12 +83,7 @@ class Admin::RunnersController < Admin::ApplicationController
end
# rubocop: disable CodeReuse/ActiveRecord
- def assign_builds_and_projects
- @builds = runner
- .builds
- .order_id_desc
- .preload_project_and_pipeline_project.first(30)
-
+ def assign_projects
@projects =
if params[:search].present?
::Project.search(params[:search])
diff --git a/app/controllers/admin/sessions_controller.rb b/app/controllers/admin/sessions_controller.rb
index 9c378f4c883..63579421573 100644
--- a/app/controllers/admin/sessions_controller.rb
+++ b/app/controllers/admin/sessions_controller.rb
@@ -68,7 +68,7 @@ class Admin::SessionsController < ApplicationController
def valid_otp_attempt?(user)
otp_validation_result =
- ::Users::ValidateOtpService.new(user).execute(user_params[:otp_attempt])
+ ::Users::ValidateManualOtpService.new(user).execute(user_params[:otp_attempt])
valid_otp_attempt = otp_validation_result[:status] == :success
return valid_otp_attempt if Gitlab::Database.read_only?
diff --git a/app/controllers/admin/topics_controller.rb b/app/controllers/admin/topics_controller.rb
index ccc38ba7cd5..908313bdb83 100644
--- a/app/controllers/admin/topics_controller.rb
+++ b/app/controllers/admin/topics_controller.rb
@@ -51,7 +51,8 @@ class Admin::TopicsController < Admin::ApplicationController
[
:avatar,
:description,
- :name
+ :name,
+ :title
]
end
end
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index f19333d5d57..6b11b8eda5c 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -372,7 +372,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def check_ban_user_feature_flag
- access_denied! unless Feature.enabled?(:ban_user_feature_flag, default_enabled: :yaml)
+ access_denied! unless Feature.enabled?(:ban_user_feature_flag)
end
def log_impersonation_event
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 572ec40ef16..4fc96752507 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -286,6 +286,13 @@ class ApplicationController < ActionController::Base
end
end
+ def render_409(message = nil)
+ respond_to do |format|
+ format.html { render template: "errors/request_conflict", formats: :html, layout: "errors", status: :conflict, locals: { message: message } }
+ format.any { head :conflict }
+ end
+ end
+
def respond_422
head :unprocessable_entity
end
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index 663e3cf8648..f84d2ed320d 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -12,8 +12,9 @@ class AutocompleteController < ApplicationController
feature_category :code_review, [:merge_request_target_branches]
feature_category :continuous_delivery, [:deploy_keys_with_owners]
- urgency :low, [:merge_request_target_branches]
- urgency :default, [:users]
+ urgency :low, [:merge_request_target_branches, :deploy_keys_with_owners, :users]
+ urgency :low, [:award_emojis]
+ urgency :medium, [:projects]
def users
group = Autocomplete::GroupFinder
diff --git a/app/controllers/boards/issues_controller.rb b/app/controllers/boards/issues_controller.rb
index e7ae941886d..11377df7a10 100644
--- a/app/controllers/boards/issues_controller.rb
+++ b/app/controllers/boards/issues_controller.rb
@@ -22,6 +22,7 @@ module Boards
before_action :can_move_issues?, only: [:bulk_move]
feature_category :team_planning
+ urgency :low
def index
list_service = Boards::Issues::ListService.new(board_parent, current_user, filter_params)
diff --git a/app/controllers/boards/lists_controller.rb b/app/controllers/boards/lists_controller.rb
index 696b251301f..c3b5a887920 100644
--- a/app/controllers/boards/lists_controller.rb
+++ b/app/controllers/boards/lists_controller.rb
@@ -9,6 +9,7 @@ module Boards
skip_before_action :authenticate_user!, only: [:index]
feature_category :team_planning
+ urgency :low
def index
lists = Boards::Lists::ListService.new(board.resource_parent, current_user).execute(board)
diff --git a/app/controllers/clusters/base_controller.rb b/app/controllers/clusters/base_controller.rb
index f88d381b3bf..2401d8b1044 100644
--- a/app/controllers/clusters/base_controller.rb
+++ b/app/controllers/clusters/base_controller.rb
@@ -9,6 +9,10 @@ class Clusters::BaseController < ApplicationController
helper_method :clusterable
feature_category :kubernetes_management
+ urgency :low, [
+ :index, :show, :environments, :cluster_status, :prometheus_proxy,
+ :destroy, :new_cluster_docs, :connect, :new, :create_user
+ ]
private
diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb
index 939c0ef220c..ae3b6125bde 100644
--- a/app/controllers/clusters/clusters_controller.rb
+++ b/app/controllers/clusters/clusters_controller.rb
@@ -6,12 +6,9 @@ class Clusters::ClustersController < Clusters::BaseController
include MetricsDashboard
before_action :cluster, only: [:cluster_status, :show, :update, :destroy, :clear_cache]
- before_action :generate_gcp_authorize_url, only: [:new]
- before_action :validate_gcp_token, only: [:new]
- before_action :gcp_cluster, only: [:new]
- before_action :user_cluster, only: [:new, :connect]
+ before_action :user_cluster, only: [:connect]
before_action :authorize_read_cluster!, only: [:show, :index]
- before_action :authorize_create_cluster!, only: [:new, :connect, :authorize_aws_role]
+ before_action :authorize_create_cluster!, only: [:connect, :authorize_aws_role]
before_action :authorize_update_cluster!, only: [:update]
before_action :update_applications_status, only: [:cluster_status]
before_action :ensure_feature_enabled!, except: [:index, :new_cluster_docs]
@@ -46,16 +43,6 @@ class Clusters::ClustersController < Clusters::BaseController
end
end
- def new
- if params[:provider] == 'aws'
- @aws_role = Aws::Role.create_or_find_by!(user: current_user)
- @instance_types = load_instance_types.to_json
-
- elsif params[:provider] == 'gcp'
- redirect_to @authorize_url if @authorize_url && !@valid_gcp_token
- end
- end
-
# Overridding ActionController::Metal#status is NOT a good idea
def cluster_status
respond_to do |format|
@@ -108,24 +95,6 @@ class Clusters::ClustersController < Clusters::BaseController
redirect_to clusterable.index_path, status: :found
end
- def create_gcp
- @gcp_cluster = ::Clusters::CreateService
- .new(current_user, create_gcp_cluster_params)
- .execute(access_token: token_in_session)
- .present(current_user: current_user)
-
- if @gcp_cluster.persisted?
- redirect_to @gcp_cluster.show_path
- else
- generate_gcp_authorize_url
- validate_gcp_token
- user_cluster
- params[:provider] = 'gcp'
-
- render :new, locals: { active_tab: 'create' }
- end
- end
-
def create_aws
@aws_cluster = ::Clusters::CreateService
.new(current_user, create_aws_cluster_params)
@@ -173,16 +142,12 @@ class Clusters::ClustersController < Clusters::BaseController
private
- def certificate_based_clusters_enabled?
- Feature.enabled?(:certificate_based_clusters, clusterable, default_enabled: :yaml, type: :ops)
- end
-
def ensure_feature_enabled!
- render_404 unless certificate_based_clusters_enabled?
+ render_404 unless clusterable.certificate_based_clusters_enabled?
end
def cluster_list
- return [] unless certificate_based_clusters_enabled?
+ return [] unless clusterable.certificate_based_clusters_enabled?
finder = ClusterAncestorsFinder.new(clusterable.__subject__, current_user)
clusters = finder.execute
@@ -239,24 +204,6 @@ class Clusters::ClustersController < Clusters::BaseController
end
end
- def create_gcp_cluster_params
- params.require(:cluster).permit(
- *base_permitted_cluster_params,
- :name,
- provider_gcp_attributes: [
- :gcp_project_id,
- :zone,
- :num_nodes,
- :machine_type,
- :cloud_run,
- :legacy_abac
- ]).merge(
- provider_type: :gcp,
- platform_type: :kubernetes,
- clusterable: clusterable.__subject__
- )
- end
-
def create_aws_cluster_params
params.require(:cluster).permit(
*base_permitted_cluster_params,
@@ -300,10 +247,10 @@ class Clusters::ClustersController < Clusters::BaseController
end
def generate_gcp_authorize_url
- new_path = clusterable.new_path(provider: :gcp).to_s
- error_path = @project ? project_clusters_path(@project) : new_path
+ connect_path = clusterable.connect_path().to_s
+ error_path = @project ? project_clusters_path(@project) : connect_path
- state = generate_session_key_redirect(new_path, error_path)
+ state = generate_session_key_redirect(connect_path, error_path)
@authorize_url = GoogleApi::CloudPlatform::Client.new(
nil, callback_google_api_auth_url,
diff --git a/app/controllers/concerns/authenticates_with_two_factor.rb b/app/controllers/concerns/authenticates_with_two_factor.rb
index 14dcec33545..4228a93d310 100644
--- a/app/controllers/concerns/authenticates_with_two_factor.rb
+++ b/app/controllers/concerns/authenticates_with_two_factor.rb
@@ -23,9 +23,9 @@ module AuthenticatesWithTwoFactor
session[:otp_user_id] = user.id
session[:user_password_hash] = Digest::SHA256.hexdigest(user.encrypted_password)
- push_frontend_feature_flag(:webauthn, default_enabled: :yaml)
+ push_frontend_feature_flag(:webauthn)
- if Feature.enabled?(:webauthn, default_enabled: :yaml)
+ if Feature.enabled?(:webauthn)
setup_webauthn_authentication(user)
else
setup_u2f_authentication(user)
diff --git a/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb b/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
index 05be04059fd..574fc6c0f37 100644
--- a/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
+++ b/app/controllers/concerns/authenticates_with_two_factor_for_admin_mode.rb
@@ -11,7 +11,7 @@ module AuthenticatesWithTwoFactorForAdminMode
return handle_locked_user(user) unless user.can?(:log_in)
session[:otp_user_id] = user.id
- push_frontend_feature_flag(:webauthn, default_enabled: :yaml)
+ push_frontend_feature_flag(:webauthn)
if user.two_factor_webauthn_enabled?
setup_webauthn_authentication(user)
diff --git a/app/controllers/concerns/dependency_proxy/group_access.rb b/app/controllers/concerns/dependency_proxy/group_access.rb
index 44611641529..45392625e45 100644
--- a/app/controllers/concerns/dependency_proxy/group_access.rb
+++ b/app/controllers/concerns/dependency_proxy/group_access.rb
@@ -18,9 +18,5 @@ module DependencyProxy
def authorize_read_dependency_proxy!
access_denied! unless can?(auth_user, :read_dependency_proxy, group)
end
-
- def authorize_admin_dependency_proxy!
- access_denied! unless can?(auth_user, :admin_dependency_proxy, group)
- end
end
end
diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb
index ae90bd59d01..4d3eb9cd183 100644
--- a/app/controllers/concerns/issuable_actions.rb
+++ b/app/controllers/concerns/issuable_actions.rb
@@ -184,7 +184,7 @@ module IssuableActions
def paginated_discussions
return if params[:per_page].blank?
- return unless issuable.instance_of?(Issue) && Feature.enabled?(:paginated_issue_discussions, project, default_enabled: :yaml)
+ return unless issuable.instance_of?(Issue) && Feature.enabled?(:paginated_issue_discussions, project)
strong_memoize(:paginated_discussions) do
issuable
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index 8410a8779f6..55b6747fcfb 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -65,7 +65,7 @@ module NotesActions
json.merge!(note_json(@note))
end
- if @note.errors.present? && @note.errors.attribute_names != [:commands_only]
+ if @note.errors.present? && @note.errors.attribute_names != [:commands_only, :command_names]
render json: json, status: :unprocessable_entity
else
render json: json
diff --git a/app/controllers/concerns/oauth_applications.rb b/app/controllers/concerns/oauth_applications.rb
index 794307ebb0c..8e63cc391ff 100644
--- a/app/controllers/concerns/oauth_applications.rb
+++ b/app/controllers/concerns/oauth_applications.rb
@@ -30,7 +30,7 @@ module OauthApplications
end
def permitted_params
- %i{name redirect_uri scopes confidential expire_access_tokens}
+ %i{name redirect_uri scopes confidential}
end
def application_params
diff --git a/app/controllers/concerns/product_analytics_tracking.rb b/app/controllers/concerns/product_analytics_tracking.rb
index 03296d6b233..4021ff83578 100644
--- a/app/controllers/concerns/product_analytics_tracking.rb
+++ b/app/controllers/concerns/product_analytics_tracking.rb
@@ -20,7 +20,7 @@ module ProductAnalyticsTracking
def route_events_to(destinations, name, &block)
track_unique_redis_hll_event(name, &block) if destinations.include?(:redis_hll)
- if destinations.include?(:snowplow) && Feature.enabled?(:route_hll_to_snowplow, tracking_namespace_source, default_enabled: :yaml)
+ if destinations.include?(:snowplow) && Feature.enabled?(:route_hll_to_snowplow, tracking_namespace_source)
Gitlab::Tracking.event(self.class.to_s, name, namespace: tracking_namespace_source, user: current_user)
end
end
diff --git a/app/controllers/concerns/send_file_upload.rb b/app/controllers/concerns/send_file_upload.rb
index 8b053ef7c59..c8369c465b8 100644
--- a/app/controllers/concerns/send_file_upload.rb
+++ b/app/controllers/concerns/send_file_upload.rb
@@ -71,6 +71,6 @@ module SendFileUpload
end
def scaling_allowed_by_feature_flags?(file_upload)
- Feature.enabled?(:dynamic_image_resizing, default_enabled: true, type: :ops)
+ Feature.enabled?(:dynamic_image_resizing, type: :ops)
end
end
diff --git a/app/controllers/concerns/uploads_actions.rb b/app/controllers/concerns/uploads_actions.rb
index c9b6e8923fe..f914e804e18 100644
--- a/app/controllers/concerns/uploads_actions.rb
+++ b/app/controllers/concerns/uploads_actions.rb
@@ -143,11 +143,17 @@ module UploadsActions
end
def bypass_auth_checks_on_uploads?
- if ::Feature.enabled?(:enforce_auth_checks_on_uploads, project, default_enabled: :yaml)
- false
- else
- action_name == 'show' && embeddable?
+ if ::Feature.enabled?(:enforce_auth_checks_on_uploads, target_project)
+ if target_project && !target_project.public? && target_project.enforce_auth_checks_on_uploads?
+ return false
+ end
end
+
+ action_name == 'show' && embeddable?
+ end
+
+ def target_project
+ nil
end
def find_model
diff --git a/app/controllers/concerns/wiki_actions.rb b/app/controllers/concerns/wiki_actions.rb
index 91de1d8aeae..9fc8886aaee 100644
--- a/app/controllers/concerns/wiki_actions.rb
+++ b/app/controllers/concerns/wiki_actions.rb
@@ -21,6 +21,10 @@ module WikiActions
before_action :load_sidebar, except: [:pages]
before_action :set_content_class
+ before_action do
+ push_frontend_feature_flag(:preserve_unchanged_markdown, @group)
+ end
+
before_action only: [:show, :edit, :update] do
@valid_encoding = valid_encoding?
end
diff --git a/app/controllers/dashboard/groups_controller.rb b/app/controllers/dashboard/groups_controller.rb
index 23ffcd50369..552d74686d6 100644
--- a/app/controllers/dashboard/groups_controller.rb
+++ b/app/controllers/dashboard/groups_controller.rb
@@ -7,6 +7,8 @@ class Dashboard::GroupsController < Dashboard::ApplicationController
feature_category :subgroups
+ urgency :low, [:index]
+
def index
groups = GroupsFinder.new(current_user, all_available: false).execute
render_group_tree(groups)
diff --git a/app/controllers/dashboard/labels_controller.rb b/app/controllers/dashboard/labels_controller.rb
index d2f31258ecd..d23518cf051 100644
--- a/app/controllers/dashboard/labels_controller.rb
+++ b/app/controllers/dashboard/labels_controller.rb
@@ -2,6 +2,7 @@
class Dashboard::LabelsController < Dashboard::ApplicationController
feature_category :team_planning
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb
index 34d9739d91c..2cb2d6bbe23 100644
--- a/app/controllers/dashboard/milestones_controller.rb
+++ b/app/controllers/dashboard/milestones_controller.rb
@@ -5,6 +5,7 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
before_action :groups, only: :index
feature_category :team_planning
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb
index 4d6c7a63516..0e4592259d8 100644
--- a/app/controllers/dashboard/projects_controller.rb
+++ b/app/controllers/dashboard/projects_controller.rb
@@ -15,6 +15,7 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
skip_cross_project_access_check :index, :starred
feature_category :projects
+ urgency :low, [:starred, :index]
def index
respond_to do |format|
diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb
index 2c5e6817427..d2434d4b0ba 100644
--- a/app/controllers/dashboard/todos_controller.rb
+++ b/app/controllers/dashboard/todos_controller.rb
@@ -9,6 +9,7 @@ class Dashboard::TodosController < Dashboard::ApplicationController
before_action :find_todos, only: [:index, :destroy_all]
feature_category :team_planning
+ urgency :low
def index
@sort = params[:sort]
@@ -98,6 +99,14 @@ class Dashboard::TodosController < Dashboard::ApplicationController
end
def todo_params
- params.permit(:action_id, :author_id, :project_id, :type, :sort, :state, :group_id)
+ aliased_action_id(
+ params.permit(:action_id, :author_id, :project_id, :type, :sort, :state, :group_id)
+ )
+ end
+
+ def aliased_action_id(original_params)
+ return original_params unless original_params[:action_id].to_i == ::Todo::MENTIONED
+
+ original_params.merge(action_id: [::Todo::MENTIONED, ::Todo::DIRECTLY_ADDRESSED])
end
end
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index f25cc1bbc32..82e5bb6cd7c 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -18,7 +18,8 @@ class DashboardController < Dashboard::ApplicationController
feature_category :team_planning, [:issues, :issues_calendar]
feature_category :code_review, [:merge_requests]
- urgency :low, [:merge_requests]
+ urgency :low, [:merge_requests, :activity]
+ urgency :low, [:issues, :issues_calendar]
def activity
respond_to do |format|
diff --git a/app/controllers/explore/groups_controller.rb b/app/controllers/explore/groups_controller.rb
index aa4196b1c18..97791b43d41 100644
--- a/app/controllers/explore/groups_controller.rb
+++ b/app/controllers/explore/groups_controller.rb
@@ -4,6 +4,7 @@ class Explore::GroupsController < Explore::ApplicationController
include GroupTree
feature_category :subgroups
+ urgency :low
def index
render_group_tree GroupsFinder.new(current_user).execute
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index 23e0143506e..34745815f3d 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -24,9 +24,9 @@ class Explore::ProjectsController < Explore::ApplicationController
rescue_from PageOutOfBoundsError, with: :page_out_of_bounds
feature_category :projects
-
# TODO: Set higher urgency after addressing https://gitlab.com/gitlab-org/gitlab/-/issues/357913
- urgency :low, [:index]
+ # and https://gitlab.com/gitlab-org/gitlab/-/issues/358945
+ urgency :low, [:index, :topics, :trending, :starred, :topic]
def index
show_alert_if_search_is_disabled
diff --git a/app/controllers/google_api/authorizations_controller.rb b/app/controllers/google_api/authorizations_controller.rb
index b9c5e87c69c..5080ee5fbbe 100644
--- a/app/controllers/google_api/authorizations_controller.rb
+++ b/app/controllers/google_api/authorizations_controller.rb
@@ -7,6 +7,7 @@ module GoogleApi
before_action :validate_session_key!
feature_category :kubernetes_management
+ urgency :low
##
# handle the response from google after the user
diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb
index b00d85b6b0f..c71c101b434 100644
--- a/app/controllers/graphql_controller.rb
+++ b/app/controllers/graphql_controller.rb
@@ -64,7 +64,7 @@ class GraphqlController < ApplicationController
log_exception(exception)
if Rails.env.test? || Rails.env.development?
- render_error("Internal server error: #{exception.message}")
+ render_error("Internal server error: #{exception.message}", raised_at: exception.backtrace[0..10].join(' <-- '))
else
render_error("Internal server error")
end
@@ -207,8 +207,9 @@ class GraphqlController < ApplicationController
render_error("Not found!", status: :not_found)
end
- def render_error(message, status: 500)
+ def render_error(message, status: 500, raised_at: nil)
error = { errors: [message: message] }
+ error[:errors].first['raisedAt'] = raised_at if raised_at
render json: error, status: status
end
diff --git a/app/controllers/groups/autocomplete_sources_controller.rb b/app/controllers/groups/autocomplete_sources_controller.rb
index 17cdcd9cb9b..a2eb475d360 100644
--- a/app/controllers/groups/autocomplete_sources_controller.rb
+++ b/app/controllers/groups/autocomplete_sources_controller.rb
@@ -5,6 +5,7 @@ class Groups::AutocompleteSourcesController < Groups::ApplicationController
feature_category :team_planning, [:issues, :labels, :milestones, :commands]
feature_category :code_review, [:merge_requests]
+ urgency :low, [:issues, :labels, :milestones, :commands]
urgency :low, [:merge_requests]
def members
diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb
index c65232c0fea..0fbceb43be1 100644
--- a/app/controllers/groups/boards_controller.rb
+++ b/app/controllers/groups/boards_controller.rb
@@ -7,8 +7,8 @@ class Groups::BoardsController < Groups::ApplicationController
before_action :assign_endpoint_vars
before_action do
- push_frontend_feature_flag(:board_multi_select, group, default_enabled: :yaml)
- push_frontend_feature_flag(:realtime_labels, group, default_enabled: :yaml)
+ push_frontend_feature_flag(:board_multi_select, group)
+ push_frontend_feature_flag(:realtime_labels, group)
experiment(:prominent_create_board_btn, subject: current_user) do |e|
e.control { }
e.candidate { }
@@ -16,6 +16,7 @@ class Groups::BoardsController < Groups::ApplicationController
end
feature_category :team_planning
+ urgency :low
private
diff --git a/app/controllers/groups/crm/contacts_controller.rb b/app/controllers/groups/crm/contacts_controller.rb
index b59e20d9cea..5bc927911c1 100644
--- a/app/controllers/groups/crm/contacts_controller.rb
+++ b/app/controllers/groups/crm/contacts_controller.rb
@@ -2,6 +2,7 @@
class Groups::Crm::ContactsController < Groups::ApplicationController
feature_category :team_planning
+ urgency :low
before_action :validate_root_group!
before_action :authorize_read_crm_contact!
diff --git a/app/controllers/groups/crm/organizations_controller.rb b/app/controllers/groups/crm/organizations_controller.rb
index 846995ecba5..ef5ddcdbca6 100644
--- a/app/controllers/groups/crm/organizations_controller.rb
+++ b/app/controllers/groups/crm/organizations_controller.rb
@@ -2,6 +2,7 @@
class Groups::Crm::OrganizationsController < Groups::ApplicationController
feature_category :team_planning
+ urgency :low
before_action :validate_root_group!
before_action :authorize_read_crm_organization!
diff --git a/app/controllers/groups/dependency_proxies_controller.rb b/app/controllers/groups/dependency_proxies_controller.rb
index 2e120de435e..8e134529c34 100644
--- a/app/controllers/groups/dependency_proxies_controller.rb
+++ b/app/controllers/groups/dependency_proxies_controller.rb
@@ -4,10 +4,10 @@ module Groups
class DependencyProxiesController < Groups::ApplicationController
include ::DependencyProxy::GroupAccess
- before_action :authorize_admin_dependency_proxy!, only: :update
before_action :verify_dependency_proxy_enabled!
- feature_category :package_registry
+ feature_category :dependency_proxy
+ urgency :low
private
diff --git a/app/controllers/groups/dependency_proxy/application_controller.rb b/app/controllers/groups/dependency_proxy/application_controller.rb
index 18a6ff93e15..f7337a3cdb1 100644
--- a/app/controllers/groups/dependency_proxy/application_controller.rb
+++ b/app/controllers/groups/dependency_proxy/application_controller.rb
@@ -16,8 +16,6 @@ module Groups
prepend_before_action :authenticate_user_from_jwt_token!
def authenticate_user_from_jwt_token!
- return unless dependency_proxy_for_private_groups?
-
authenticate_with_http_token do |token, _|
@authentication_result = EMPTY_AUTH_RESULT
@@ -36,10 +34,6 @@ module Groups
private
- def dependency_proxy_for_private_groups?
- Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true)
- end
-
def request_bearer_token!
# unfortunately, we cannot use https://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html#method-i-authentication_request
response.headers['WWW-Authenticate'] = ::DependencyProxy::Registry.authenticate_header
diff --git a/app/controllers/groups/dependency_proxy_auth_controller.rb b/app/controllers/groups/dependency_proxy_auth_controller.rb
index 60b2371fa9a..03579d62ba9 100644
--- a/app/controllers/groups/dependency_proxy_auth_controller.rb
+++ b/app/controllers/groups/dependency_proxy_auth_controller.rb
@@ -2,6 +2,7 @@
class Groups::DependencyProxyAuthController < ::Groups::DependencyProxy::ApplicationController
feature_category :dependency_proxy
+ urgency :low
def authenticate
render plain: '', status: :ok
diff --git a/app/controllers/groups/dependency_proxy_for_containers_controller.rb b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
index 8513979c53b..2e9e0b12d2f 100644
--- a/app/controllers/groups/dependency_proxy_for_containers_controller.rb
+++ b/app/controllers/groups/dependency_proxy_for_containers_controller.rb
@@ -17,6 +17,7 @@ class Groups::DependencyProxyForContainersController < ::Groups::DependencyProxy
attr_reader :token
feature_category :dependency_proxy
+ urgency :low
def manifest
result = DependencyProxy::FindCachedManifestService.new(group, image, tag, token).execute
diff --git a/app/controllers/groups/deploy_tokens_controller.rb b/app/controllers/groups/deploy_tokens_controller.rb
index 9ef22aa33dc..5bab6f59a42 100644
--- a/app/controllers/groups/deploy_tokens_controller.rb
+++ b/app/controllers/groups/deploy_tokens_controller.rb
@@ -4,6 +4,7 @@ class Groups::DeployTokensController < Groups::ApplicationController
before_action :authorize_destroy_deploy_token!
feature_category :continuous_delivery
+ urgency :low
def revoke
Groups::DeployTokens::RevokeService.new(@group, current_user, params).execute
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index 51778f31f65..d325bb402e7 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -21,6 +21,7 @@ class Groups::GroupMembersController < Groups::ApplicationController
:override
feature_category :subgroups
+ urgency :low
def index
push_frontend_feature_flag(:group_member_inherited_group, @group)
diff --git a/app/controllers/groups/imports_controller.rb b/app/controllers/groups/imports_controller.rb
index 7cf39e378db..a35237a706d 100644
--- a/app/controllers/groups/imports_controller.rb
+++ b/app/controllers/groups/imports_controller.rb
@@ -4,6 +4,7 @@ class Groups::ImportsController < Groups::ApplicationController
include ContinueParams
feature_category :importers
+ urgency :low
def show
if @group.import_state.nil? || @group.import_state.finished?
diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb
index 7bcc8182bd6..2d821676677 100644
--- a/app/controllers/groups/labels_controller.rb
+++ b/app/controllers/groups/labels_controller.rb
@@ -10,6 +10,7 @@ class Groups::LabelsController < Groups::ApplicationController
respond_to :html
feature_category :team_planning
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb
index 75877cdef9c..494b8c5621d 100644
--- a/app/controllers/groups/milestones_controller.rb
+++ b/app/controllers/groups/milestones_controller.rb
@@ -7,6 +7,7 @@ class Groups::MilestonesController < Groups::ApplicationController
before_action :authorize_admin_milestones!, only: [:edit, :new, :create, :update, :destroy]
feature_category :team_planning
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/groups/packages_controller.rb b/app/controllers/groups/packages_controller.rb
index 1f3d80260ed..5d808d4c1c6 100644
--- a/app/controllers/groups/packages_controller.rb
+++ b/app/controllers/groups/packages_controller.rb
@@ -5,6 +5,7 @@ module Groups
before_action :verify_packages_enabled!
feature_category :package_registry
+ urgency :low
# The show action renders index to allow frontend routing to work on page refresh
def show
diff --git a/app/controllers/groups/registry/repositories_controller.rb b/app/controllers/groups/registry/repositories_controller.rb
index 549a148bfb8..cb7bf001918 100644
--- a/app/controllers/groups/registry/repositories_controller.rb
+++ b/app/controllers/groups/registry/repositories_controller.rb
@@ -8,7 +8,8 @@ module Groups
before_action :verify_container_registry_enabled!
before_action :authorize_read_container_image!
- feature_category :package_registry
+ feature_category :container_registry
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/groups/releases_controller.rb b/app/controllers/groups/releases_controller.rb
index e87135cc104..c97947683dc 100644
--- a/app/controllers/groups/releases_controller.rb
+++ b/app/controllers/groups/releases_controller.rb
@@ -3,6 +3,7 @@
module Groups
class ReleasesController < Groups::ApplicationController
feature_category :release_evidence
+ urgency :low
def index
respond_to do |format|
@@ -15,19 +16,11 @@ module Groups
private
def releases
- if Feature.enabled?(:group_releases_finder_inoperator)
- Releases::GroupReleasesFinder
- .new(@group, current_user)
- .execute(preload: false)
- .page(params[:page])
- .per(30)
- else
- ReleasesFinder
- .new(@group, current_user, { include_subgroups: true })
- .execute(preload: false)
- .page(params[:page])
- .per(30)
- end
+ Releases::GroupReleasesFinder
+ .new(@group, current_user)
+ .execute(preload: false)
+ .page(params[:page])
+ .per(30)
end
end
end
diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb
index a2be4d9d7e1..8d687bf3c2c 100644
--- a/app/controllers/groups/runners_controller.rb
+++ b/app/controllers/groups/runners_controller.rb
@@ -3,10 +3,10 @@
class Groups::RunnersController < Groups::ApplicationController
before_action :authorize_read_group_runners!, only: [:index, :show]
before_action :authorize_admin_group_runners!, only: [:edit, :update, :destroy, :pause, :resume]
- before_action :runner_list_group_view_vue_ui_enabled, only: [:index]
before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show]
feature_category :runner
+ urgency :low
def index
finder = Ci::RunnersFinder.new(current_user: current_user, params: { group: @group })
@@ -15,10 +15,6 @@ class Groups::RunnersController < Groups::ApplicationController
Gitlab::Tracking.event(self.class.name, 'index', user: current_user, namespace: @group)
end
- def runner_list_group_view_vue_ui_enabled
- render_404 unless Feature.enabled?(:runner_list_group_view_vue_ui, group, default_enabled: :yaml)
- end
-
def show
end
@@ -33,32 +29,6 @@ class Groups::RunnersController < Groups::ApplicationController
end
end
- def destroy
- if can?(current_user, :delete_runner, @runner)
- Ci::Runners::UnregisterRunnerService.new(@runner, current_user).execute
-
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), status: :found
- else
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), status: :found, alert: _('Runner cannot be deleted, please contact your administrator.')
- end
- end
-
- def resume
- if Ci::Runners::UpdateRunnerService.new(@runner).update(active: true)
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), notice: _('Runner was successfully updated.')
- else
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), alert: _('Runner was not updated.')
- end
- end
-
- def pause
- if Ci::Runners::UpdateRunnerService.new(@runner).update(active: false)
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), notice: _('Runner was successfully updated.')
- else
- redirect_to group_settings_ci_cd_path(@group, anchor: 'runners-settings'), alert: _('Runner was not updated.')
- end
- end
-
private
def runner
diff --git a/app/controllers/groups/settings/applications_controller.rb b/app/controllers/groups/settings/applications_controller.rb
index 6388277e4dc..bfe61696e0f 100644
--- a/app/controllers/groups/settings/applications_controller.rb
+++ b/app/controllers/groups/settings/applications_controller.rb
@@ -57,10 +57,8 @@ module Groups
# https://gitlab.com/gitlab-org/gitlab/-/issues/324187
@applications = @group.oauth_applications.limit(100)
- # Default access tokens to expire. This preserves backward compatibility
- # with existing applications. This will be removed in 15.0.
- # Removal issue: https://gitlab.com/gitlab-org/gitlab/-/issues/340848
- @application ||= Doorkeeper::Application.new(expire_access_tokens: true)
+ # Don't overwrite a value possibly set by `create`
+ @application ||= Doorkeeper::Application.new
end
def set_application
diff --git a/app/controllers/groups/settings/ci_cd_controller.rb b/app/controllers/groups/settings/ci_cd_controller.rb
index 9b9e3f7b0bc..4b75cec19f7 100644
--- a/app/controllers/groups/settings/ci_cd_controller.rb
+++ b/app/controllers/groups/settings/ci_cd_controller.rb
@@ -3,8 +3,6 @@
module Groups
module Settings
class CiCdController < Groups::ApplicationController
- include RunnerSetupScripts
-
layout 'group_settings'
skip_cross_project_access_check :show
before_action :authorize_admin_group!
@@ -13,16 +11,9 @@ module Groups
before_action :push_licensed_features, only: [:show]
feature_category :continuous_integration
-
- NUMBER_OF_RUNNERS_PER_PAGE = 4
+ urgency :low
def show
- runners_finder = Ci::RunnersFinder.new(current_user: current_user, params: params.merge({ group: @group }))
- # We need all runners for count
- @all_group_runners = runners_finder.execute.except(:limit, :offset)
- @group_runners = runners_finder.execute.page(params[:page]).per(NUMBER_OF_RUNNERS_PER_PAGE)
-
- @sort = runners_finder.sort_key
end
def update
@@ -35,13 +26,6 @@ module Groups
redirect_to group_settings_ci_cd_path
end
- def reset_registration_token
- ::Ci::Runners::ResetRegistrationTokenService.new(@group, current_user).execute
-
- flash[:notice] = _('GroupSettings|New runners registration token has been generated!')
- redirect_to group_settings_ci_cd_path
- end
-
def update_auto_devops
if auto_devops_service.execute
flash[:notice] = s_('GroupSettings|Auto DevOps pipeline was updated for the group')
@@ -52,10 +36,6 @@ module Groups
redirect_to group_settings_ci_cd_path
end
- def runner_setup_scripts
- private_runner_setup_scripts
- end
-
private
def define_variables
diff --git a/app/controllers/groups/settings/packages_and_registries_controller.rb b/app/controllers/groups/settings/packages_and_registries_controller.rb
index c44e0727ff9..411b8577c3f 100644
--- a/app/controllers/groups/settings/packages_and_registries_controller.rb
+++ b/app/controllers/groups/settings/packages_and_registries_controller.rb
@@ -8,6 +8,7 @@ module Groups
before_action :verify_packages_enabled!
feature_category :package_registry
+ urgency :low
def show
end
diff --git a/app/controllers/groups/settings/repository_controller.rb b/app/controllers/groups/settings/repository_controller.rb
index 7404075985b..b0431c31179 100644
--- a/app/controllers/groups/settings/repository_controller.rb
+++ b/app/controllers/groups/settings/repository_controller.rb
@@ -12,6 +12,7 @@ module Groups
end
feature_category :continuous_delivery
+ urgency :low
def create_deploy_token
result = Groups::DeployTokens::CreateService.new(@group, current_user, deploy_token_params).execute
diff --git a/app/controllers/groups/shared_projects_controller.rb b/app/controllers/groups/shared_projects_controller.rb
index 7acdacc2d46..2d2664c02e8 100644
--- a/app/controllers/groups/shared_projects_controller.rb
+++ b/app/controllers/groups/shared_projects_controller.rb
@@ -7,6 +7,7 @@ module Groups
skip_cross_project_access_check :index
feature_category :subgroups
+ urgency :low, [:index]
def index
shared_projects = GroupProjectsFinder.new(
diff --git a/app/controllers/groups/uploads_controller.rb b/app/controllers/groups/uploads_controller.rb
index 49249f87d31..22e6549aa04 100644
--- a/app/controllers/groups/uploads_controller.rb
+++ b/app/controllers/groups/uploads_controller.rb
@@ -10,6 +10,7 @@ class Groups::UploadsController < Groups::ApplicationController
before_action :verify_workhorse_api!, only: [:authorize]
feature_category :subgroups
+ urgency :low, [:show]
private
diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb
index 995d5abf045..d46cf899d8c 100644
--- a/app/controllers/groups_controller.rb
+++ b/app/controllers/groups_controller.rb
@@ -31,7 +31,7 @@ class GroupsController < Groups::ApplicationController
before_action :user_actions, only: [:show]
before_action do
- push_frontend_feature_flag(:vue_issues_list, @group, default_enabled: :yaml)
+ push_frontend_feature_flag(:vue_issues_list, @group)
end
before_action :check_export_rate_limit!, only: [:export, :download_export]
@@ -57,10 +57,13 @@ class GroupsController < Groups::ApplicationController
feature_category :code_review, [:merge_requests, :unfoldered_environment_names]
feature_category :projects, [:projects]
feature_category :importers, [:export, :download_export]
+ urgency :low, [:export, :download_export]
urgency :high, [:unfoldered_environment_names]
+
+ urgency :low, [:issues, :issues_calendar, :preview_markdown]
# TODO: Set #show to higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/334795
- urgency :low, [:merge_requests, :show]
+ urgency :low, [:merge_requests, :show, :create, :new, :update, :projects, :destroy, :edit, :activity]
def index
redirect_to(current_user ? dashboard_groups_path : explore_groups_path)
@@ -209,7 +212,7 @@ class GroupsController < Groups::ApplicationController
end
def issues
- return super if !html_request? || Feature.disabled?(:vue_issues_list, group, default_enabled: :yaml)
+ return super if !html_request? || Feature.disabled?(:vue_issues_list, group)
@has_issues = IssuesFinder.new(current_user, group_id: group.id, include_subgroups: true).execute
.non_archived
@@ -227,6 +230,8 @@ class GroupsController < Groups::ApplicationController
protected
def render_show_html
+ Gitlab::Tracking.event('group_overview', 'render', user: current_user, namespace: @group)
+
render 'groups/show', locals: { trial: params[:trial] }
end
diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb
index 9494a686467..2bcbf88039b 100644
--- a/app/controllers/ide_controller.rb
+++ b/app/controllers/ide_controller.rb
@@ -12,7 +12,7 @@ class IdeController < ApplicationController
before_action do
push_frontend_feature_flag(:build_service_proxy)
push_frontend_feature_flag(:schema_linting)
- push_frontend_feature_flag(:reject_unsigned_commits_by_gitlab, default_enabled: :yaml)
+ push_frontend_feature_flag(:reject_unsigned_commits_by_gitlab)
define_index_vars
end
diff --git a/app/controllers/import/available_namespaces_controller.rb b/app/controllers/import/available_namespaces_controller.rb
index 0c2af13d3f3..c16c40cefea 100644
--- a/app/controllers/import/available_namespaces_controller.rb
+++ b/app/controllers/import/available_namespaces_controller.rb
@@ -2,6 +2,7 @@
class Import::AvailableNamespacesController < ApplicationController
feature_category :importers
+ urgency :low
def index
render json: NamespaceSerializer.new.represent(current_user.manageable_groups_with_routes(include_groups_with_developer_maintainer_access: true))
diff --git a/app/controllers/import/base_controller.rb b/app/controllers/import/base_controller.rb
index 51ca12370e6..7ef07032913 100644
--- a/app/controllers/import/base_controller.rb
+++ b/app/controllers/import/base_controller.rb
@@ -5,6 +5,7 @@ class Import::BaseController < ApplicationController
before_action -> { check_rate_limit!(:project_import, scope: [current_user, :project_import], redirect_back: true) }, only: [:create]
feature_category :importers
+ urgency :low
def status
respond_to do |format|
diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb
index 7c9525d1744..55707000cf8 100644
--- a/app/controllers/import/bitbucket_controller.rb
+++ b/app/controllers/import/bitbucket_controller.rb
@@ -29,13 +29,12 @@ class Import::BitbucketController < Import::BaseController
end
end
+ # We need to re-expose controller's internal method 'status' as action.
+ # rubocop:disable Lint/UselessMethodDefinition
def status
super
end
-
- def realtime_changes
- super
- end
+ # rubocop:enable Lint/UselessMethodDefinition
def create
bitbucket_client = Bitbucket::Client.new(credentials)
diff --git a/app/controllers/import/bitbucket_server_controller.rb b/app/controllers/import/bitbucket_server_controller.rb
index 31e9694ca1d..00f3f0b08b2 100644
--- a/app/controllers/import/bitbucket_server_controller.rb
+++ b/app/controllers/import/bitbucket_server_controller.rb
@@ -52,13 +52,12 @@ class Import::BitbucketServerController < Import::BaseController
redirect_to status_import_bitbucket_server_path
end
+ # We need to re-expose controller's internal method 'status' as action.
+ # rubocop:disable Lint/UselessMethodDefinition
def status
super
end
-
- def realtime_changes
- super
- end
+ # rubocop:enable Lint/UselessMethodDefinition
protected
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
index f26c06b7e37..34f12aebb91 100644
--- a/app/controllers/import/bulk_imports_controller.rb
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -7,6 +7,7 @@ class Import::BulkImportsController < ApplicationController
before_action :verify_blocked_uri, only: :status
feature_category :importers
+ urgency :low
POLLING_INTERVAL = 3_000
@@ -98,7 +99,7 @@ class Import::BulkImportsController < ApplicationController
end
def ensure_group_import_enabled
- render_404 unless Feature.enabled?(:bulk_import, default_enabled: :yaml)
+ render_404 unless Feature.enabled?(:bulk_import)
end
def access_token_key
diff --git a/app/controllers/import/fogbugz_controller.rb b/app/controllers/import/fogbugz_controller.rb
index 377292d47d8..c223d9d211e 100644
--- a/app/controllers/import/fogbugz_controller.rb
+++ b/app/controllers/import/fogbugz_controller.rb
@@ -54,10 +54,6 @@ class Import::FogbugzController < Import::BaseController
end
# rubocop: enable CodeReuse/ActiveRecord
- def realtime_changes
- super
- end
-
def create
repo = client.repo(params[:repo_id])
fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] }
diff --git a/app/controllers/import/gitea_controller.rb b/app/controllers/import/gitea_controller.rb
index 32c9da67e90..4b4ac07b389 100644
--- a/app/controllers/import/gitea_controller.rb
+++ b/app/controllers/import/gitea_controller.rb
@@ -16,10 +16,12 @@ class Import::GiteaController < Import::GithubController
super
end
- # Must be defined or it will 404
+ # We need to re-expose controller's internal method 'status' as action.
+ # rubocop:disable Lint/UselessMethodDefinition
def status
super
end
+ # rubocop:enable Lint/UselessMethodDefinition
protected
@@ -61,7 +63,7 @@ class Import::GiteaController < Import::GithubController
override :client
def client
- @client ||= Gitlab::LegacyGithubImport::Client.new(session[access_token_key], client_options)
+ @client ||= Gitlab::LegacyGithubImport::Client.new(session[access_token_key], **client_options)
end
override :client_options
diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb
index fa9517c3545..c846d9d225a 100644
--- a/app/controllers/import/gitlab_controller.rb
+++ b/app/controllers/import/gitlab_controller.rb
@@ -16,9 +16,12 @@ class Import::GitlabController < Import::BaseController
redirect_to status_import_gitlab_url
end
+ # We need to re-expose controller's internal method 'status' as action.
+ # rubocop:disable Lint/UselessMethodDefinition
def status
super
end
+ # rubocop:enable Lint/UselessMethodDefinition
def create
repo = client.project(params[:repo_id].to_i)
diff --git a/app/controllers/import/gitlab_groups_controller.rb b/app/controllers/import/gitlab_groups_controller.rb
index c9d5e9986dc..81f18a18776 100644
--- a/app/controllers/import/gitlab_groups_controller.rb
+++ b/app/controllers/import/gitlab_groups_controller.rb
@@ -6,6 +6,7 @@ class Import::GitlabGroupsController < ApplicationController
before_action :check_import_rate_limit!, only: %i[create]
feature_category :importers
+ urgency :low
def create
unless file_is_valid?(group_params[:file])
diff --git a/app/controllers/import/history_controller.rb b/app/controllers/import/history_controller.rb
index 69e31392f21..9677624d0b7 100644
--- a/app/controllers/import/history_controller.rb
+++ b/app/controllers/import/history_controller.rb
@@ -2,4 +2,5 @@
class Import::HistoryController < ApplicationController
feature_category :importers
+ urgency :low
end
diff --git a/app/controllers/import/manifest_controller.rb b/app/controllers/import/manifest_controller.rb
index 956d0c9a2ae..461ba982969 100644
--- a/app/controllers/import/manifest_controller.rb
+++ b/app/controllers/import/manifest_controller.rb
@@ -10,9 +10,12 @@ class Import::ManifestController < Import::BaseController
def new
end
+ # We need to re-expose controller's internal method 'status' as action.
+ # rubocop:disable Lint/UselessMethodDefinition
def status
super
end
+ # rubocop:enable Lint/UselessMethodDefinition
def upload
group = Group.find(params[:group_id])
@@ -36,10 +39,6 @@ class Import::ManifestController < Import::BaseController
end
end
- def realtime_changes
- super
- end
-
def create
repository = importable_repos.find do |project|
project[:id] == params[:repo_id].to_i
diff --git a/app/controllers/import/url_controller.rb b/app/controllers/import/url_controller.rb
index 4e4b6ad125e..fed3412881a 100644
--- a/app/controllers/import/url_controller.rb
+++ b/app/controllers/import/url_controller.rb
@@ -2,6 +2,7 @@
class Import::UrlController < ApplicationController
feature_category :importers
+ urgency :low
def validate
result = Import::ValidateRemoteGitEndpointService.new(validate_params).execute
diff --git a/app/controllers/jira_connect/application_controller.rb b/app/controllers/jira_connect/application_controller.rb
index 9b3bff062dd..e26d69314cd 100644
--- a/app/controllers/jira_connect/application_controller.rb
+++ b/app/controllers/jira_connect/application_controller.rb
@@ -20,60 +20,44 @@ class JiraConnect::ApplicationController < ApplicationController
end
def verify_qsh_claim!
- payload, _ = decode_auth_token!
-
- return if request.format.json? && payload['qsh'] == 'context-qsh'
+ return if request.format.json? && jwt.verify_context_qsh_claim
# Make sure `qsh` claim matches the current request
- render_403 unless payload['qsh'] == Atlassian::Jwt.create_query_string_hash(request.url, request.method, jira_connect_base_url)
- rescue StandardError
- render_403
+ render_403 unless jwt.verify_qsh_claim(request.url, request.method, jira_connect_base_url)
end
def atlassian_jwt_valid?
return false unless installation_from_jwt
# Verify JWT signature with our stored `shared_secret`
- decode_auth_token!
- rescue JWT::DecodeError
- false
+ jwt.valid?(installation_from_jwt.shared_secret)
end
def installation_from_jwt
strong_memoize(:installation_from_jwt) do
- next unless claims['iss']
+ next unless jwt.iss_claim
- JiraConnectInstallation.find_by_client_key(claims['iss'])
- end
- end
-
- def claims
- strong_memoize(:claims) do
- next {} unless auth_token
-
- # Decode without verification to get `client_key` in `iss`
- payload, _ = Atlassian::Jwt.decode(auth_token, nil, false)
- payload
+ JiraConnectInstallation.find_by_client_key(jwt.iss_claim)
end
end
def jira_user
strong_memoize(:jira_user) do
next unless installation_from_jwt
- next unless claims['sub']
+ next unless jwt.sub_claim
# This only works for Jira Cloud installations.
- installation_from_jwt.client.user_info(claims['sub'])
+ installation_from_jwt.client.user_info(jwt.sub_claim)
end
end
- def decode_auth_token!
- Atlassian::Jwt.decode(auth_token, installation_from_jwt.shared_secret)
+ def jwt
+ strong_memoize(:jwt) do
+ Atlassian::JiraConnect::Jwt::Symmetric.new(auth_token)
+ end
end
def auth_token
- strong_memoize(:auth_token) do
- params[:jwt] || request.headers['Authorization']&.split(' ', 2)&.last
- end
+ params[:jwt] || request.headers['Authorization']&.split(' ', 2)&.last
end
end
diff --git a/app/controllers/jira_connect/events_controller.rb b/app/controllers/jira_connect/events_controller.rb
index 3c78f63e069..394fdc9b2f6 100644
--- a/app/controllers/jira_connect/events_controller.rb
+++ b/app/controllers/jira_connect/events_controller.rb
@@ -47,7 +47,7 @@ class JiraConnect::EventsController < JiraConnect::ApplicationController
end
def verify_asymmetric_atlassian_jwt!
- asymmetric_jwt = Atlassian::JiraConnect::AsymmetricJwt.new(auth_token, jwt_verification_claims)
+ asymmetric_jwt = Atlassian::JiraConnect::Jwt::Asymmetric.new(auth_token, jwt_verification_claims)
return head :unauthorized unless asymmetric_jwt.valid?
diff --git a/app/controllers/jira_connect/subscriptions_controller.rb b/app/controllers/jira_connect/subscriptions_controller.rb
index d8ce67d6267..2ba9f8264e1 100644
--- a/app/controllers/jira_connect/subscriptions_controller.rb
+++ b/app/controllers/jira_connect/subscriptions_controller.rb
@@ -19,7 +19,8 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
end
before_action do
- push_frontend_feature_flag(:jira_connect_oauth, @user, default_enabled: :yaml)
+ push_frontend_feature_flag(:jira_connect_oauth, @user)
+ push_frontend_feature_flag(:jira_connect_oauth_self_managed, @user)
end
before_action :allow_rendering_in_iframe, only: :index
diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb
index 81084ffe38b..3724bb0d925 100644
--- a/app/controllers/oauth/applications_controller.rb
+++ b/app/controllers/oauth/applications_controller.rb
@@ -57,10 +57,8 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController
@authorized_anonymous_tokens = @authorized_tokens.reject(&:application)
@authorized_apps = @authorized_tokens.map(&:application).uniq.reject(&:nil?)
- # Default access tokens to expire. This preserves backward compatibility
- # with existing applications. This will be removed in 15.0.
- # Removal issue: https://gitlab.com/gitlab-org/gitlab/-/issues/340848
- @application ||= Doorkeeper::Application.new(expire_access_tokens: true)
+ # Don't overwrite a value possibly set by `create`
+ @application ||= Doorkeeper::Application.new
end
# Override Doorkeeper to scope to the current user
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index d1c409d071e..0817813f967 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -5,7 +5,7 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
include InitializesCurrentUserMode
include Gitlab::Utils::StrongMemoize
- before_action :verify_confirmed_email!, :verify_confidential_application!
+ before_action :verify_confirmed_email!
layout 'profile'
@@ -37,8 +37,7 @@ 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,
- default_enabled: :yaml)
+ return unless Feature.enabled?(:omniauth_login_minimal_scopes, current_user)
auth_type = params.delete('gl_auth_type')
return unless auth_type == 'login'
@@ -78,18 +77,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
doorkeeper_application&.includes_scope?(*::Gitlab::Auth::API_SCOPES)
end
- # Confidential apps require the client_secret to be sent with the request.
- # Doorkeeper allows implicit grant flow requests (response_type=token) to
- # work without client_secret regardless of the confidential setting.
- # This leads to security vulnerabilities and we want to block it.
- def verify_confidential_application!
- render 'doorkeeper/authorizations/error' if authorizable_confidential?
- end
-
- def authorizable_confidential?
- pre_auth.authorizable? && pre_auth.response_type == 'token' && pre_auth.client.application.confidential
- end
-
def verify_confirmed_email!
return if current_user&.confirmed?
diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb
index dc5b22e1606..927b50245a4 100644
--- a/app/controllers/omniauth_callbacks_controller.rb
+++ b/app/controllers/omniauth_callbacks_controller.rb
@@ -9,7 +9,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
after_action :verify_known_sign_in
- protect_from_forgery except: [:kerberos, :saml, :cas3, :failure] + AuthHelper.saml_providers, with: :exception, prepend: true
+ protect_from_forgery except: [:cas3, :failure] + AuthHelper.saml_providers, with: :exception, prepend: true
feature_category :authentication_and_authorization
diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb
index bd52ef0b0d4..83eabbb736e 100644
--- a/app/controllers/profiles/accounts_controller.rb
+++ b/app/controllers/profiles/accounts_controller.rb
@@ -4,6 +4,7 @@ class Profiles::AccountsController < Profiles::ApplicationController
include AuthHelper
feature_category :users
+ urgency :low, [:show]
def show
render(locals: show_view_variables)
diff --git a/app/controllers/profiles/emails_controller.rb b/app/controllers/profiles/emails_controller.rb
index 7a88162f469..7e332d9a498 100644
--- a/app/controllers/profiles/emails_controller.rb
+++ b/app/controllers/profiles/emails_controller.rb
@@ -8,6 +8,7 @@ class Profiles::EmailsController < Profiles::ApplicationController
only: [:resend_confirmation_instructions]
feature_category :users
+ urgency :low, [:index]
def index
@primary_email = current_user.email
diff --git a/app/controllers/profiles/gpg_keys_controller.rb b/app/controllers/profiles/gpg_keys_controller.rb
index 9e16d195b00..e31ca87a5d5 100644
--- a/app/controllers/profiles/gpg_keys_controller.rb
+++ b/app/controllers/profiles/gpg_keys_controller.rb
@@ -3,7 +3,7 @@
class Profiles::GpgKeysController < Profiles::ApplicationController
before_action :set_gpg_key, only: [:destroy, :revoke]
- feature_category :users
+ feature_category :source_code_management
def index
@gpg_keys = current_user.gpg_keys.with_subkeys
diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb
index 3a189c900ac..90d5f945d78 100644
--- a/app/controllers/profiles/keys_controller.rb
+++ b/app/controllers/profiles/keys_controller.rb
@@ -2,6 +2,7 @@
class Profiles::KeysController < Profiles::ApplicationController
feature_category :users
+ urgency :low, [:create, :index]
def index
@keys = current_user.keys.order_id_desc
diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb
index ccfd360a781..9323d266cd5 100644
--- a/app/controllers/profiles/notifications_controller.rb
+++ b/app/controllers/profiles/notifications_controller.rb
@@ -2,6 +2,7 @@
class Profiles::NotificationsController < Profiles::ApplicationController
feature_category :team_planning
+ urgency :low
def show
@user = current_user
diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb
index 8dc9697c56d..ad2e384077a 100644
--- a/app/controllers/profiles/personal_access_tokens_controller.rb
+++ b/app/controllers/profiles/personal_access_tokens_controller.rb
@@ -63,5 +63,3 @@ class Profiles::PersonalAccessTokensController < Profiles::ApplicationController
finder(state: 'active', sort: 'expires_at_asc').execute
end
end
-
-Profiles::PersonalAccessTokensController.prepend_mod_with('Profiles::PersonalAccessTokensController')
diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb
index 820b6520f6c..7aca76c2fb1 100644
--- a/app/controllers/profiles/preferences_controller.rb
+++ b/app/controllers/profiles/preferences_controller.rb
@@ -5,6 +5,9 @@ class Profiles::PreferencesController < Profiles::ApplicationController
feature_category :users
+ urgency :low, [:show]
+ urgency :medium, [:update]
+
def show
end
diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb
index 48b0d313d3c..2e71b4801ed 100644
--- a/app/controllers/profiles/two_factor_auths_controller.rb
+++ b/app/controllers/profiles/two_factor_auths_controller.rb
@@ -9,7 +9,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
helper_method :current_password_required?
before_action do
- push_frontend_feature_flag(:webauthn, default_enabled: :yaml)
+ push_frontend_feature_flag(:webauthn)
end
feature_category :authentication_and_authorization
@@ -35,7 +35,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
@qr_code = build_qr_code
@account_string = account_string
- if Feature.enabled?(:webauthn, default_enabled: :yaml)
+ if Feature.enabled?(:webauthn)
setup_webauthn_registration
else
setup_u2f_registration
@@ -44,7 +44,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
def create
otp_validation_result =
- ::Users::ValidateOtpService.new(current_user).execute(params[:pin_code])
+ ::Users::ValidateManualOtpService.new(current_user).execute(params[:pin_code])
if otp_validation_result[:status] == :success
ActiveSession.destroy_all_but_current(current_user, session)
@@ -61,7 +61,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
@qr_code = build_qr_code
@account_string = account_string
- if Feature.enabled?(:webauthn, default_enabled: :yaml)
+ if Feature.enabled?(:webauthn)
setup_webauthn_registration
else
setup_u2f_registration
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index d57a293ab4d..d5e7195a157 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -11,10 +11,11 @@ class ProfilesController < Profiles::ApplicationController
end
skip_before_action :require_email, only: [:show, :update]
before_action do
- push_frontend_feature_flag(:webauthn, default_enabled: :yaml)
+ push_frontend_feature_flag(:webauthn)
end
feature_category :users
+ urgency :low, [:show, :update]
def show
end
diff --git a/app/controllers/projects/alert_management_controller.rb b/app/controllers/projects/alert_management_controller.rb
index ebe867d915d..ef0c47b0eed 100644
--- a/app/controllers/projects/alert_management_controller.rb
+++ b/app/controllers/projects/alert_management_controller.rb
@@ -4,6 +4,7 @@ class Projects::AlertManagementController < Projects::ApplicationController
before_action :authorize_read_alert_management_alert!
feature_category :incident_management
+ urgency :low
def index
end
diff --git a/app/controllers/projects/alerting/notifications_controller.rb b/app/controllers/projects/alerting/notifications_controller.rb
index ae8498ce65f..82fff287c4a 100644
--- a/app/controllers/projects/alerting/notifications_controller.rb
+++ b/app/controllers/projects/alerting/notifications_controller.rb
@@ -13,6 +13,9 @@ module Projects
prepend_before_action :repository, :project_without_auth
feature_category :incident_management
+ # Goal is to increase the urgency to medium.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/361310.
+ urgency :low, [:create]
def create
token = extract_alert_manager_token(request)
diff --git a/app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb b/app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb
index 03dcb164d94..60bcd1d7238 100644
--- a/app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb
+++ b/app/controllers/projects/analytics/cycle_analytics/value_streams_controller.rb
@@ -4,6 +4,7 @@ class Projects::Analytics::CycleAnalytics::ValueStreamsController < Projects::Ap
respond_to :json
feature_category :planning_analytics
+ urgency :low
before_action :authorize_read_cycle_analytics!
diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb
index f678e19d05d..9dbf989ca3f 100644
--- a/app/controllers/projects/autocomplete_sources_controller.rb
+++ b/app/controllers/projects/autocomplete_sources_controller.rb
@@ -9,7 +9,8 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController
feature_category :users, [:members]
feature_category :snippets, [:snippets]
- urgency :low, [:merge_requests]
+ urgency :low, [:merge_requests, :members]
+ urgency :low, [:issues, :labels, :milestones, :commands, :contacts]
def members
render json: ::Projects::ParticipantsService.new(@project, current_user).execute(target)
diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb
index fb113df137f..70d9b524e4d 100644
--- a/app/controllers/projects/avatars_controller.rb
+++ b/app/controllers/projects/avatars_controller.rb
@@ -9,6 +9,8 @@ class Projects::AvatarsController < Projects::ApplicationController
feature_category :projects
+ urgency :low, [:show]
+
def show
@blob = @repository.blob_at_branch(@repository.root_ref, @project.avatar_in_git)
diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb
index 57a06f26f8c..64ced43311a 100644
--- a/app/controllers/projects/blame_controller.rb
+++ b/app/controllers/projects/blame_controller.rb
@@ -23,8 +23,11 @@ class Projects::BlameController < Projects::ApplicationController
environment_params[:find_latest] = true
@environment = ::Environments::EnvironmentsByDeploymentsFinder.new(@project, current_user, environment_params).execute.last
- @blame = Gitlab::Blame.new(@blob, @commit)
- @blame = Gitlab::View::Presenter::Factory.new(@blame, project: @project, path: @path).fabricate!
+ blame_service = Projects::BlameService.new(@blob, @commit, params.permit(:page))
+
+ @blame = Gitlab::View::Presenter::Factory.new(blame_service.blame, project: @project, path: @path).fabricate!
+
+ render locals: { blame_pagination: blame_service.pagination }
end
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 26a7b5662be..a9561fb9312 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -42,8 +42,8 @@ class Projects::BlobController < Projects::ApplicationController
urgency :low, [:create, :show, :edit, :update, :diff]
before_action do
- push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:highlight_js, @project, default_enabled: :yaml)
+ 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/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index 7a30e68d9a2..36986a714fb 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -7,8 +7,8 @@ class Projects::BoardsController < Projects::ApplicationController
before_action :check_issues_available!
before_action :assign_endpoint_vars
before_action do
- push_frontend_feature_flag(:board_multi_select, project, default_enabled: :yaml)
- push_frontend_feature_flag(:realtime_labels, project&.group, default_enabled: :yaml)
+ push_frontend_feature_flag(:board_multi_select, project)
+ push_frontend_feature_flag(:realtime_labels, project&.group)
experiment(:prominent_create_board_btn, subject: current_user) do |e|
e.control { }
e.candidate { }
@@ -16,6 +16,7 @@ class Projects::BoardsController < Projects::ApplicationController
end
feature_category :team_planning
+ urgency :low
private
diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb
index 6264f10ce2d..27969cb1a75 100644
--- a/app/controllers/projects/branches_controller.rb
+++ b/app/controllers/projects/branches_controller.rb
@@ -111,7 +111,7 @@ class Projects::BranchesController < Projects::ApplicationController
flash_type = result.error? ? :alert : :notice
flash[flash_type] = result.message
- redirect_to project_branches_path(@project), status: :see_other
+ redirect_back_or_default(default: project_branches_path(@project), options: { status: :see_other })
end
format.js { head result.http_status }
diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb
index 61e8e5b015a..4168612d50f 100644
--- a/app/controllers/projects/builds_controller.rb
+++ b/app/controllers/projects/builds_controller.rb
@@ -5,8 +5,7 @@ class Projects::BuildsController < Projects::ApplicationController
feature_category :continuous_integration
- urgency :high, [:index, :show]
- urgency :low, [:raw]
+ urgency :low, [:raw, :index, :show]
def index
redirect_to project_jobs_path(project)
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 8c6e8f0e126..dbf3b2051fb 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -3,7 +3,8 @@
class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action :check_can_collaborate!
before_action do
- push_frontend_feature_flag(:schema_linting, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:schema_linting, @project)
+ push_frontend_feature_flag(:pipeline_editor_file_tree, @project)
end
feature_category :pipeline_authoring
diff --git a/app/controllers/projects/ci/secure_files_controller.rb b/app/controllers/projects/ci/secure_files_controller.rb
index 5141d0188b0..59ddca19081 100644
--- a/app/controllers/projects/ci/secure_files_controller.rb
+++ b/app/controllers/projects/ci/secure_files_controller.rb
@@ -6,5 +6,6 @@ class Projects::Ci::SecureFilesController < Projects::ApplicationController
feature_category :pipeline_authoring
def show
+ render_404 unless Feature.enabled?(:ci_secure_files, project)
end
end
diff --git a/app/controllers/projects/cluster_agents_controller.rb b/app/controllers/projects/cluster_agents_controller.rb
index 282b9ef1fb7..3f759e5c18c 100644
--- a/app/controllers/projects/cluster_agents_controller.rb
+++ b/app/controllers/projects/cluster_agents_controller.rb
@@ -4,6 +4,7 @@ class Projects::ClusterAgentsController < Projects::ApplicationController
before_action :authorize_can_read_cluster_agent!
feature_category :kubernetes_management
+ urgency :low
def show
@agent_name = params[:name]
diff --git a/app/controllers/projects/clusters_controller.rb b/app/controllers/projects/clusters_controller.rb
index 440375bf3c9..30d001d0ac5 100644
--- a/app/controllers/projects/clusters_controller.rb
+++ b/app/controllers/projects/clusters_controller.rb
@@ -6,7 +6,7 @@ class Projects::ClustersController < Clusters::ClustersController
before_action do
push_frontend_feature_flag(:prometheus_computed_alerts)
- push_frontend_feature_flag(:show_gitlab_agent_feedback, type: :ops, default_enabled: :yaml)
+ push_frontend_feature_flag(:show_gitlab_agent_feedback, type: :ops)
end
layout 'project'
diff --git a/app/controllers/projects/cycle_analytics/events_controller.rb b/app/controllers/projects/cycle_analytics/events_controller.rb
index a1da8d4e91f..43b4cdbe9a8 100644
--- a/app/controllers/projects/cycle_analytics/events_controller.rb
+++ b/app/controllers/projects/cycle_analytics/events_controller.rb
@@ -12,6 +12,7 @@ module Projects
before_action :authorize_read_merge_request!, only: [:code, :review]
feature_category :planning_analytics
+ urgency :low
def issue
render_events(cycle_analytics[:issue].events)
diff --git a/app/controllers/projects/cycle_analytics_controller.rb b/app/controllers/projects/cycle_analytics_controller.rb
index dc6a9a73d9e..6160dafb177 100644
--- a/app/controllers/projects/cycle_analytics_controller.rb
+++ b/app/controllers/projects/cycle_analytics_controller.rb
@@ -14,6 +14,7 @@ class Projects::CycleAnalyticsController < Projects::ApplicationController
track_redis_hll_event :show, name: 'p_analytics_valuestream'
feature_category :planning_analytics
+ urgency :low
before_action do
push_licensed_feature(:cycle_analytics_for_groups) if project.licensed_feature_available?(:cycle_analytics_for_groups)
diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb
index ce25f86d692..96afe9dbb9f 100644
--- a/app/controllers/projects/deploy_keys_controller.rb
+++ b/app/controllers/projects/deploy_keys_controller.rb
@@ -11,6 +11,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
layout 'project_settings'
feature_category :continuous_delivery
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/projects/deploy_tokens_controller.rb b/app/controllers/projects/deploy_tokens_controller.rb
index 42c2d8b17f1..ed77fa2fee6 100644
--- a/app/controllers/projects/deploy_tokens_controller.rb
+++ b/app/controllers/projects/deploy_tokens_controller.rb
@@ -4,6 +4,7 @@ class Projects::DeployTokensController < Projects::ApplicationController
before_action :authorize_admin_project!
feature_category :continuous_delivery
+ urgency :low
def revoke
@token = @project.deploy_tokens.find(params[:id])
diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb
index 231684427fb..bebade1b21b 100644
--- a/app/controllers/projects/deployments_controller.rb
+++ b/app/controllers/projects/deployments_controller.rb
@@ -4,6 +4,7 @@ class Projects::DeploymentsController < Projects::ApplicationController
before_action :authorize_read_deployment!
feature_category :continuous_delivery
+ urgency :low
# rubocop: disable CodeReuse/ActiveRecord
def index
diff --git a/app/controllers/projects/discussions_controller.rb b/app/controllers/projects/discussions_controller.rb
index 9f7d47b95f3..a61930d4b99 100644
--- a/app/controllers/projects/discussions_controller.rb
+++ b/app/controllers/projects/discussions_controller.rb
@@ -10,6 +10,7 @@ class Projects::DiscussionsController < Projects::ApplicationController
before_action :authorize_resolve_discussion!, only: [:resolve, :unresolve]
feature_category :team_planning
+ urgency :low
def resolve
Discussions::ResolveService.new(project, current_user, one_or_more_discussions: discussion).execute
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index 8e81e75ad13..1a2c0d64d19 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -24,9 +24,13 @@ 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
+ urgency :low
def index
@project = ProjectPresenter.new(project, current_user: current_user)
@@ -73,7 +77,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController
# rubocop: enable CodeReuse/ActiveRecord
def show
- @deployments = environment.deployments.ordered.page(params[:page])
+ @deployments = deployments
end
def new
@@ -202,6 +206,10 @@ class Projects::EnvironmentsController < Projects::ApplicationController
private
+ def deployments
+ environment.deployments.ordered.page(params[:page])
+ end
+
def verify_api_request!
Gitlab::Workhorse.verify_api_request!(request.headers)
end
diff --git a/app/controllers/projects/feature_flags_clients_controller.rb b/app/controllers/projects/feature_flags_clients_controller.rb
index 9a1f8932a27..2652345fc5a 100644
--- a/app/controllers/projects/feature_flags_clients_controller.rb
+++ b/app/controllers/projects/feature_flags_clients_controller.rb
@@ -5,6 +5,7 @@ class Projects::FeatureFlagsClientsController < Projects::ApplicationController
before_action :feature_flags_client
feature_category :feature_flags
+ urgency :low
def reset_token
feature_flags_client.reset_token!
diff --git a/app/controllers/projects/feature_flags_controller.rb b/app/controllers/projects/feature_flags_controller.rb
index 7c0da8f8a24..1d1fe91ad70 100644
--- a/app/controllers/projects/feature_flags_controller.rb
+++ b/app/controllers/projects/feature_flags_controller.rb
@@ -11,6 +11,7 @@ class Projects::FeatureFlagsController < Projects::ApplicationController
before_action :feature_flag, only: [:edit, :update, :destroy]
feature_category :feature_flags
+ urgency :low
def index
@feature_flags = FeatureFlagsFinder
diff --git a/app/controllers/projects/feature_flags_user_lists_controller.rb b/app/controllers/projects/feature_flags_user_lists_controller.rb
index fd81321924a..023eb51cc94 100644
--- a/app/controllers/projects/feature_flags_user_lists_controller.rb
+++ b/app/controllers/projects/feature_flags_user_lists_controller.rb
@@ -5,6 +5,7 @@ class Projects::FeatureFlagsUserListsController < Projects::ApplicationControlle
before_action :user_list, only: [:edit, :show]
feature_category :feature_flags
+ urgency :low
def index
end
diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb
index 606f6ac7941..63309cce1e5 100644
--- a/app/controllers/projects/graphs_controller.rb
+++ b/app/controllers/projects/graphs_controller.rb
@@ -15,6 +15,7 @@ class Projects::GraphsController < Projects::ApplicationController
urgency :low, [:show]
feature_category :continuous_integration, [:ci]
+ urgency :low, [:ci]
def show
respond_to do |format|
diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb
index 3b3f9bdcf6b..41daeddcf7f 100644
--- a/app/controllers/projects/imports_controller.rb
+++ b/app/controllers/projects/imports_controller.rb
@@ -12,6 +12,7 @@ class Projects::ImportsController < Projects::ApplicationController
before_action :redirect_if_no_import, only: :show
feature_category :importers
+ urgency :low
def new
end
diff --git a/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb b/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb
index 408652b4b9e..f1e518abf48 100644
--- a/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb
+++ b/app/controllers/projects/incident_management/pager_duty_incidents_controller.rb
@@ -11,6 +11,7 @@ module Projects
prepend_before_action :project_without_auth
feature_category :incident_management
+ urgency :low
def create
result = webhook_processor.execute(params[:token])
diff --git a/app/controllers/projects/incidents_controller.rb b/app/controllers/projects/incidents_controller.rb
index dd1e51bb9bd..fd7ba7b5460 100644
--- a/app/controllers/projects/incidents_controller.rb
+++ b/app/controllers/projects/incidents_controller.rb
@@ -7,11 +7,12 @@ class Projects::IncidentsController < Projects::ApplicationController
before_action :authorize_read_issue!
before_action :load_incident, only: [:show]
before_action do
- push_frontend_feature_flag(:incident_escalations, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:incident_timeline, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:incident_escalations, @project)
+ push_frontend_feature_flag(:incident_timeline, @project)
end
feature_category :incident_management
+ urgency :low
def index
end
diff --git a/app/controllers/projects/issue_links_controller.rb b/app/controllers/projects/issue_links_controller.rb
index e8c3110574f..956557457fa 100644
--- a/app/controllers/projects/issue_links_controller.rb
+++ b/app/controllers/projects/issue_links_controller.rb
@@ -8,6 +8,7 @@ module Projects
before_action :authorize_issue_link_association!, only: :destroy
feature_category :team_planning
+ urgency :low
private
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 46943e7214a..b65616fdb3c 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -39,16 +39,16 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :authorize_download_code!, only: [:related_branches]
before_action do
- push_frontend_feature_flag(:vue_issues_list, project&.group, default_enabled: :yaml)
- push_frontend_feature_flag(:contacts_autocomplete, project&.group, default_enabled: :yaml)
- push_frontend_feature_flag(:incident_timeline, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:vue_issues_list, project&.group)
+ 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, default_enabled: :yaml)
- push_frontend_feature_flag(:issue_assignees_widget, project, default_enabled: :yaml)
- push_frontend_feature_flag(:paginated_issue_discussions, project, default_enabled: :yaml)
- push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
+ 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?)
end
@@ -65,10 +65,18 @@ class Projects::IssuesController < Projects::ApplicationController
:toggle_award_emoji, :mark_as_spam, :related_branches,
:can_create_branch, :create_merge_request
]
+ urgency :low, [
+ :index, :calendar, :show, :new, :create, :edit, :update,
+ :destroy, :move, :reorder, :designs, :toggle_subscription,
+ :discussions, :bulk_update, :realtime_changes,
+ :toggle_award_emoji, :mark_as_spam, :related_branches,
+ :can_create_branch, :create_merge_request
+ ]
feature_category :service_desk, [:service_desk]
urgency :low, [:service_desk]
feature_category :importers, [:import_csv, :export_csv]
+ urgency :low, [:import_csv, :export_csv]
attr_accessor :vulnerability_id
@@ -252,7 +260,7 @@ class Projects::IssuesController < Projects::ApplicationController
def vue_issues_list?
action_name.to_sym == :index &&
html_request? &&
- Feature.enabled?(:vue_issues_list, project&.group, default_enabled: :yaml)
+ Feature.enabled?(:vue_issues_list, project&.group)
end
def sorting_field
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index 0f6cf97d69d..8c9f82b9dc1 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -21,13 +21,14 @@ class Projects::JobsController < Projects::ApplicationController
before_action :push_jobs_table_vue_search, only: [:index]
before_action do
- push_frontend_feature_flag(:infinitely_collapsible_sections, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:trigger_job_retry_action, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:infinitely_collapsible_sections, @project)
+ push_frontend_feature_flag(:trigger_job_retry_action, @project)
end
layout 'project'
feature_category :continuous_integration
+ urgency :low
def index
# We need all builds for tabs counters
@@ -140,7 +141,7 @@ class Projects::JobsController < Projects::ApplicationController
end
def raw
- if @build.trace.archived_trace_exist?
+ if @build.trace.archived?
workhorse_set_content_type!
send_upload(@build.job_artifacts_trace.file,
send_params: raw_send_params,
@@ -261,10 +262,10 @@ class Projects::JobsController < Projects::ApplicationController
end
def push_jobs_table_vue
- push_frontend_feature_flag(:jobs_table_vue, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:jobs_table_vue, @project)
end
def push_jobs_table_vue_search
- push_frontend_feature_flag(:jobs_table_vue_search, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:jobs_table_vue_search, @project)
end
end
diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb
index 814081194d6..8ec2cbb41e9 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -15,6 +15,7 @@ class Projects::LabelsController < Projects::ApplicationController
respond_to :js, :html
feature_category :team_planning
+ urgency :low
def index
respond_to do |format|
diff --git a/app/controllers/projects/learn_gitlab_controller.rb b/app/controllers/projects/learn_gitlab_controller.rb
index b9f9a1810b7..61e4a1812ba 100644
--- a/app/controllers/projects/learn_gitlab_controller.rb
+++ b/app/controllers/projects/learn_gitlab_controller.rb
@@ -7,6 +7,7 @@ class Projects::LearnGitlabController < Projects::ApplicationController
before_action :enable_video_tutorials_continuous_onboarding_experiment
feature_category :users
+ urgency :low, [:index]
def index
end
diff --git a/app/controllers/projects/logs_controller.rb b/app/controllers/projects/logs_controller.rb
index a4bdbc827e0..63d8981ef38 100644
--- a/app/controllers/projects/logs_controller.rb
+++ b/app/controllers/projects/logs_controller.rb
@@ -10,6 +10,8 @@ module Projects
feature_category :logging
def index
+ return render_404 unless Feature.enabled?(:monitor_logging, project)
+
if environment || cluster
render :index
else
@@ -28,7 +30,6 @@ module Projects
private
def render_logs(service, permitted_params)
- ::Gitlab::UsageCounters::PodLogs.increment(project.id)
::Gitlab::PollingInterval.set_header(response, interval: 3_000)
result = service.new(cluster, namespace, params: permitted_params).execute
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 03bb132fe47..458df40ece1 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -33,20 +33,25 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
before_action only: [:show] do
push_frontend_feature_flag(:file_identifier_hash)
- push_frontend_feature_flag(:merge_request_widget_graphql, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:merge_request_widget_graphql, project)
push_frontend_feature_flag(:core_security_mr_widget_counts, project)
- push_frontend_feature_flag(:paginated_notes, project, default_enabled: :yaml)
- push_frontend_feature_flag(:confidential_notes, project, default_enabled: :yaml)
- push_frontend_feature_flag(:restructured_mr_widget, project, default_enabled: :yaml)
- push_frontend_feature_flag(:refactor_mr_widgets_extensions, project, default_enabled: :yaml)
- push_frontend_feature_flag(:rebase_without_ci_ui, project, default_enabled: :yaml)
- push_frontend_feature_flag(:secure_vulnerability_training, project, default_enabled: :yaml)
- push_frontend_feature_flag(:issue_assignees_widget, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:realtime_labels, project, default_enabled: :yaml)
+ push_frontend_feature_flag(:paginated_notes, 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_mr_widget_test_summary, project)
+ push_frontend_feature_flag(:rebase_without_ci_ui, project)
+ push_frontend_feature_flag(:issue_assignees_widget, @project)
+ push_frontend_feature_flag(:realtime_labels, project)
+ push_frontend_feature_flag(:updated_diff_expansion_buttons, project)
+ push_frontend_feature_flag(:mr_attention_requests, current_user)
+ push_frontend_feature_flag(:updated_mr_header, project)
+ push_frontend_feature_flag(:remove_diff_header_icons, project)
+ push_frontend_feature_flag(:moved_mr_sidebar, project)
end
before_action do
- push_frontend_feature_flag(:permit_all_shared_groups_for_approval, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:permit_all_shared_groups_for_approval, @project)
end
around_action :allow_gitaly_ref_name_caching, only: [:index, :show, :discussions]
@@ -81,12 +86,12 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
:rebase,
:discussions,
:pipelines,
- :test_reports
- ]
- urgency :low, [
+ :test_reports,
:codequality_mr_diff_reports,
- :codequality_reports
+ :codequality_reports,
+ :terraform_reports
]
+ urgency :low, [:pipeline_status, :pipelines, :exposed_artifacts]
def index
@merge_requests = @issuables
diff --git a/app/controllers/projects/metrics_dashboard_controller.rb b/app/controllers/projects/metrics_dashboard_controller.rb
index 3f10749602e..e305b018293 100644
--- a/app/controllers/projects/metrics_dashboard_controller.rb
+++ b/app/controllers/projects/metrics_dashboard_controller.rb
@@ -12,6 +12,7 @@ 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/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index b896e2543ff..744e45a0f9c 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -19,6 +19,7 @@ class Projects::MilestonesController < Projects::ApplicationController
respond_to :html
feature_category :team_planning
+ urgency :low
def index
@sort = params[:sort] || 'due_date_asc'
diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 7322e08e62e..d24b232293b 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -12,6 +12,7 @@ class Projects::NotesController < Projects::ApplicationController
before_action :authorize_resolve_note!, only: [:resolve, :unresolve]
feature_category :team_planning
+ urgency :low
def delete_attachment
note.remove_attachment!
diff --git a/app/controllers/projects/packages/infrastructure_registry_controller.rb b/app/controllers/projects/packages/infrastructure_registry_controller.rb
index 99d75afc63a..f1410bf6043 100644
--- a/app/controllers/projects/packages/infrastructure_registry_controller.rb
+++ b/app/controllers/projects/packages/infrastructure_registry_controller.rb
@@ -6,6 +6,7 @@ module Projects
include PackagesAccess
feature_category :infrastructure_as_code
+ urgency :low
def show
@package = project.packages.find(params[:id])
diff --git a/app/controllers/projects/packages/packages_controller.rb b/app/controllers/projects/packages/packages_controller.rb
index 969922266fa..f045bae5c96 100644
--- a/app/controllers/projects/packages/packages_controller.rb
+++ b/app/controllers/projects/packages/packages_controller.rb
@@ -6,6 +6,7 @@ module Projects
include PackagesAccess
feature_category :package_registry
+ urgency :low
# The show action renders index to allow frontend routing to work on page refresh
def show
diff --git a/app/controllers/projects/pipeline_schedules_controller.rb b/app/controllers/projects/pipeline_schedules_controller.rb
index f6171403667..fa38fb209f0 100644
--- a/app/controllers/projects/pipeline_schedules_controller.rb
+++ b/app/controllers/projects/pipeline_schedules_controller.rb
@@ -12,6 +12,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
feature_category :continuous_integration
+ urgency :low
# rubocop: disable CodeReuse/ActiveRecord
def index
diff --git a/app/controllers/projects/pipelines/application_controller.rb b/app/controllers/projects/pipelines/application_controller.rb
index c147d697888..e9dc71a0f4a 100644
--- a/app/controllers/projects/pipelines/application_controller.rb
+++ b/app/controllers/projects/pipelines/application_controller.rb
@@ -11,6 +11,7 @@ module Projects
before_action :authorize_read_pipeline!
feature_category :continuous_integration
+ urgency :low
private
diff --git a/app/controllers/projects/pipelines/tests_controller.rb b/app/controllers/projects/pipelines/tests_controller.rb
index 4daf700a8bd..8f0e20290fe 100644
--- a/app/controllers/projects/pipelines/tests_controller.rb
+++ b/app/controllers/projects/pipelines/tests_controller.rb
@@ -23,7 +23,7 @@ module Projects
def show
respond_to do |format|
format.json do
- if Feature.enabled?(:ci_test_report_artifacts_expired, project, default_enabled: :yaml) && pipeline.has_expired_test_reports?
+ if Feature.enabled?(:ci_test_report_artifacts_expired, project) && pipeline.has_expired_test_reports?
render json: { errors: 'Test report artifacts have expired' }, status: :not_found
else
render json: TestSuiteSerializer
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 02f041637ba..94865024688 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -4,8 +4,11 @@ class Projects::PipelinesController < Projects::ApplicationController
include ::Gitlab::Utils::StrongMemoize
include RedisTracking
- urgency :default, [:status]
- urgency :low, [:index, :new, :builds, :show, :failures, :create, :stage, :retry, :dag, :cancel, :test_report]
+ urgency :low, [
+ :index, :new, :builds, :show, :failures, :create,
+ :stage, :retry, :dag, :cancel, :test_report,
+ :charts, :config_variables, :destroy, :status
+ ]
before_action :disable_query_limiting, only: [:create, :retry]
before_action :pipeline, except: [:index, :new, :create, :charts, :config_variables]
@@ -18,7 +21,9 @@ class Projects::PipelinesController < Projects::ApplicationController
before_action :ensure_pipeline, only: [:show, :downloadable_artifacts]
before_action do
- push_frontend_feature_flag(:pipeline_tabs_vue, @project, default_enabled: :yaml)
+ push_frontend_feature_flag(:pipeline_tabs_vue, @project)
+ push_frontend_feature_flag(:downstream_retry_action, @project)
+ push_frontend_feature_flag(:failed_jobs_tab_vue, @project)
end
# Will be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/225596
@@ -37,6 +42,23 @@ class Projects::PipelinesController < Projects::ApplicationController
POLLING_INTERVAL = 10_000
+ content_security_policy do |policy|
+ next if policy.directives.blank?
+
+ default_script_src = policy.directives['script-src'] || policy.directives['default-src']
+ script_src_values = Array.wrap(default_script_src) | ["'self'", "'unsafe-eval'", 'https://*.zuora.com']
+
+ default_frame_src = policy.directives['frame-src'] || policy.directives['default-src']
+ frame_src_values = Array.wrap(default_frame_src) | ["'self'", 'https://*.zuora.com']
+
+ default_child_src = policy.directives['child-src'] || policy.directives['default-src']
+ child_src_values = Array.wrap(default_child_src) | ["'self'", 'https://*.zuora.com']
+
+ policy.script_src(*script_src_values)
+ policy.frame_src(*frame_src_values)
+ policy.child_src(*child_src_values)
+ end
+
feature_category :continuous_integration, [
:charts, :show, :config_variables, :stage, :cancel, :retry,
:builds, :dag, :failures, :status,
@@ -127,12 +149,22 @@ class Projects::PipelinesController < Projects::ApplicationController
end
def builds
- render_show
+ if Feature.enabled?(:pipeline_tabs_vue, project)
+ redirect_to pipeline_path(@pipeline, tab: 'builds')
+ else
+ render_show
+ end
end
def dag
respond_to do |format|
- format.html { render_show }
+ format.html do
+ if Feature.enabled?(:pipeline_tabs_vue, project)
+ redirect_to pipeline_path(@pipeline, tab: 'dag')
+ else
+ render_show
+ end
+ end
format.json do
render json: Ci::DagPipelineSerializer
.new(project: @project, current_user: @current_user)
@@ -142,7 +174,9 @@ class Projects::PipelinesController < Projects::ApplicationController
end
def failures
- if @pipeline.failed_builds.present?
+ if Feature.enabled?(:pipeline_tabs_vue, project)
+ redirect_to pipeline_path(@pipeline, tab: 'failures')
+ elsif @pipeline.failed_builds.present?
render_show
else
redirect_to pipeline_path(@pipeline)
@@ -196,7 +230,13 @@ class Projects::PipelinesController < Projects::ApplicationController
def test_report
respond_to do |format|
- format.html { render_show }
+ format.html do
+ if Feature.enabled?(:pipeline_tabs_vue, project)
+ redirect_to pipeline_path(@pipeline, tab: 'test_report')
+ else
+ render_show
+ end
+ end
format.json do
render json: TestReportSerializer
.new(current_user: @current_user)
diff --git a/app/controllers/projects/pipelines_settings_controller.rb b/app/controllers/projects/pipelines_settings_controller.rb
index 6e08a889520..9adec4dcf00 100644
--- a/app/controllers/projects/pipelines_settings_controller.rb
+++ b/app/controllers/projects/pipelines_settings_controller.rb
@@ -4,6 +4,7 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
before_action :authorize_admin_pipeline!
feature_category :continuous_integration
+ urgency :low
def show
redirect_to project_settings_ci_cd_path(@project, params: params.to_unsafe_h)
diff --git a/app/controllers/projects/product_analytics_controller.rb b/app/controllers/projects/product_analytics_controller.rb
index 5db7585d8e0..c89cd52530a 100644
--- a/app/controllers/projects/product_analytics_controller.rb
+++ b/app/controllers/projects/product_analytics_controller.rb
@@ -54,6 +54,6 @@ class Projects::ProductAnalyticsController < Projects::ApplicationController
end
def feature_enabled!
- render_404 unless Feature.enabled?(:product_analytics, @project, default_enabled: false)
+ render_404 unless Feature.enabled?(:product_analytics, @project)
end
end
diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb
index 49618c89672..168e703c87d 100644
--- a/app/controllers/projects/project_members_controller.rb
+++ b/app/controllers/projects/project_members_controller.rb
@@ -9,6 +9,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController
before_action :authorize_admin_project_member!, except: [:index, :leave, :request_access]
feature_category :projects
+ urgency :low
def index
@sort = params[:sort].presence || sort_value_name
diff --git a/app/controllers/projects/prometheus/alerts_controller.rb b/app/controllers/projects/prometheus/alerts_controller.rb
index 7aebff13278..5e1b9570fa0 100644
--- a/app/controllers/projects/prometheus/alerts_controller.rb
+++ b/app/controllers/projects/prometheus/alerts_controller.rb
@@ -14,9 +14,10 @@ module Projects
prepend_before_action :repository, :project_without_auth, only: [:notify]
before_action :authorize_read_prometheus_alerts!, except: [:notify]
- before_action :alert, only: [:update, :show, :destroy, :metrics_dashboard]
+ before_action :alert, only: [:show, :metrics_dashboard]
feature_category :incident_management
+ urgency :low
def index
render json: serialize_as_json(alerts)
@@ -37,68 +38,13 @@ module Projects
end
end
- def create
- @alert = create_service.execute
-
- if @alert.persisted?
- schedule_prometheus_update!
-
- render json: serialize_as_json(@alert)
- else
- head :bad_request
- end
- end
-
- def update
- if update_service.execute(alert)
- schedule_prometheus_update!
-
- render json: serialize_as_json(alert)
- else
- head :bad_request
- end
- end
-
- def destroy
- if destroy_service.execute(alert)
- schedule_prometheus_update!
-
- head :ok
- else
- head :bad_request
- end
- end
-
private
- def alerts_params
- params.permit(:operator, :threshold, :environment_id, :prometheus_metric_id, :runbook_url)
- end
-
def notify_service
Projects::Prometheus::Alerts::NotifyService
.new(project, params.permit!)
end
- def create_service
- Projects::Prometheus::Alerts::CreateService
- .new(project: project, current_user: current_user, params: alerts_params)
- end
-
- def update_service
- Projects::Prometheus::Alerts::UpdateService
- .new(project: project, current_user: current_user, params: alerts_params)
- end
-
- def destroy_service
- Projects::Prometheus::Alerts::DestroyService
- .new(project: project, current_user: current_user, params: nil)
- end
-
- def schedule_prometheus_update!
- ::Clusters::Applications::ScheduleUpdateService.new(application, project).execute
- end
-
def serialize_as_json(alert_obj)
serializer.represent(alert_obj)
end
@@ -123,10 +69,6 @@ module Projects
}.reverse_merge(opts))
end
- def application
- @application ||= alert.environment.cluster_prometheus_adapter
- end
-
def extract_alert_manager_token(request)
Doorkeeper::OAuth::Token.from_bearer_authorization(request)
end
@@ -136,10 +78,6 @@ module Projects
.find_by_full_path("#{params[:namespace_id]}/#{params[:project_id]}")
end
- def prometheus_alerts
- project.prometheus_alerts.for_environment(params[:environment_id])
- end
-
def metrics_dashboard_params
{
embedded: true,
diff --git a/app/controllers/projects/prometheus/metrics_controller.rb b/app/controllers/projects/prometheus/metrics_controller.rb
index e61d357ce4e..c5778ba15f2 100644
--- a/app/controllers/projects/prometheus/metrics_controller.rb
+++ b/app/controllers/projects/prometheus/metrics_controller.rb
@@ -74,9 +74,9 @@ module Projects
end
def update
- @metric = update_metrics_service(prometheus_metric).execute
+ @metric = prometheus_metric
- if @metric.persisted?
+ if @metric.update(metrics_params)
redirect_to edit_project_integration_path(project, ::Integrations::Prometheus),
notice: _('Metric was successfully updated.')
else
diff --git a/app/controllers/projects/registry/application_controller.rb b/app/controllers/projects/registry/application_controller.rb
index e7bf8c8e757..9a94de3859a 100644
--- a/app/controllers/projects/registry/application_controller.rb
+++ b/app/controllers/projects/registry/application_controller.rb
@@ -9,6 +9,7 @@ module Projects
before_action :authorize_read_container_image!
feature_category :container_registry
+ urgency :low
private
diff --git a/app/controllers/projects/releases/evidences_controller.rb b/app/controllers/projects/releases/evidences_controller.rb
index 41e2ce81eb8..9f59898878c 100644
--- a/app/controllers/projects/releases/evidences_controller.rb
+++ b/app/controllers/projects/releases/evidences_controller.rb
@@ -8,6 +8,7 @@ module Projects
before_action :authorize_read_release_evidence!
feature_category :release_evidence
+ urgency :low
def show
respond_to do |format|
diff --git a/app/controllers/projects/releases_controller.rb b/app/controllers/projects/releases_controller.rb
index 19413d97d9d..1dfb71842bd 100644
--- a/app/controllers/projects/releases_controller.rb
+++ b/app/controllers/projects/releases_controller.rb
@@ -10,13 +10,20 @@ class Projects::ReleasesController < Projects::ApplicationController
before_action :validate_suffix_path, :fetch_latest_tag, only: :latest_permalink
feature_category :release_orchestration
+ urgency :low
def index
respond_to do |format|
format.html do
require_non_empty_project
end
- format.json { render json: releases }
+ format.json do
+ if Feature.enabled?(:remove_sha_from_releases_json, project)
+ render json: ReleaseSerializer.new.represent(releases)
+ else
+ render json: releases
+ end
+ end
end
end
diff --git a/app/controllers/projects/runner_projects_controller.rb b/app/controllers/projects/runner_projects_controller.rb
index b77ce070492..34ce8df202b 100644
--- a/app/controllers/projects/runner_projects_controller.rb
+++ b/app/controllers/projects/runner_projects_controller.rb
@@ -6,6 +6,7 @@ class Projects::RunnerProjectsController < Projects::ApplicationController
layout 'project_settings'
feature_category :runner
+ urgency :low
def create
@runner = Ci::Runner.find(params[:runner_project][:runner_id])
diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb
index 0eda8e3352d..ba9576795ec 100644
--- a/app/controllers/projects/runners_controller.rb
+++ b/app/controllers/projects/runners_controller.rb
@@ -5,6 +5,7 @@ class Projects::RunnersController < Projects::ApplicationController
before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show]
feature_category :runner
+ urgency :low
def index
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings')
diff --git a/app/controllers/projects/security/configuration_controller.rb b/app/controllers/projects/security/configuration_controller.rb
index cdb02047215..00a2a5d1193 100644
--- a/app/controllers/projects/security/configuration_controller.rb
+++ b/app/controllers/projects/security/configuration_controller.rb
@@ -42,7 +42,7 @@ module Projects
end
def unify_configuration_enabled?
- Feature.enabled?(:unify_security_configuration, project, default_enabled: :yaml)
+ Feature.enabled?(:unify_security_configuration, project)
end
end
end
diff --git a/app/controllers/projects/serverless/functions_controller.rb b/app/controllers/projects/serverless/functions_controller.rb
deleted file mode 100644
index 7352edaaab2..00000000000
--- a/app/controllers/projects/serverless/functions_controller.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Serverless
- class FunctionsController < Projects::ApplicationController
- before_action :ensure_feature_enabled!
- before_action :authorize_read_cluster!
-
- feature_category :not_owned # rubocop:todo Gitlab/AvoidFeatureCategoryNotOwned
-
- def index
- respond_to do |format|
- format.json do
- functions = finder.execute.select do |function|
- can?(@current_user, :read_cluster, function.cluster)
- end
-
- serialized_functions = serialize_function(functions)
-
- render json: {
- knative_installed: finder.knative_installed,
- functions: serialized_functions
- }.to_json
- end
-
- format.html do
- render
- end
- end
- end
-
- def show
- function = finder.service(params[:environment_id], params[:id])
- return not_found unless function && can?(@current_user, :read_cluster, function.cluster)
-
- @service = serialize_function(function)
- return not_found if @service.nil?
-
- @prometheus = finder.has_prometheus?(params[:environment_id])
-
- respond_to do |format|
- format.json do
- render json: @service
- end
-
- format.html
- end
- end
-
- def metrics
- respond_to do |format|
- format.json do
- metrics = finder.invocation_metrics(params[:environment_id], params[:id])
-
- if metrics.nil?
- head :no_content
- else
- render json: metrics
- end
- end
- end
- end
-
- private
-
- def finder
- Projects::Serverless::FunctionsFinder.new(project)
- end
-
- def serialize_function(function)
- Projects::Serverless::ServiceSerializer.new(current_user: @current_user, project: project).represent(function)
- end
-
- def ensure_feature_enabled!
- render_404 unless Feature.enabled?(:deprecated_serverless, project, default_enabled: :yaml, type: :ops)
- end
- end
- end
-end
diff --git a/app/controllers/projects/service_ping_controller.rb b/app/controllers/projects/service_ping_controller.rb
index 368da8d1ef2..d8f1785d95e 100644
--- a/app/controllers/projects/service_ping_controller.rb
+++ b/app/controllers/projects/service_ping_controller.rb
@@ -3,7 +3,7 @@
class Projects::ServicePingController < Projects::ApplicationController
before_action :authenticate_user!
- feature_category :service_ping
+ feature_category :web_ide
def web_ide_clientside_preview
return render_404 unless Gitlab::CurrentSettings.web_ide_clientside_preview_enabled?
@@ -17,6 +17,7 @@ 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)
head(200)
end
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 1321111faaf..8f83e34411b 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -10,8 +10,6 @@ class Projects::ServicesController < Projects::ApplicationController
before_action :integration
before_action :default_integration, only: [:edit, :update]
before_action :web_hook_logs, only: [:edit, :update]
- before_action :set_deprecation_notice_for_prometheus_integration, only: [:edit, :update]
- before_action :redirect_deprecated_prometheus_integration, only: [:update]
respond_to :html
@@ -118,18 +116,6 @@ class Projects::ServicesController < Projects::ApplicationController
.merge(errors: integration.errors.as_json)
end
- def redirect_deprecated_prometheus_integration
- redirect_to edit_project_integration_path(project, integration) if integration.is_a?(::Integrations::Prometheus) && Feature.enabled?(:settings_operations_prometheus_service, project)
- end
-
- def set_deprecation_notice_for_prometheus_integration
- return if !integration.is_a?(::Integrations::Prometheus) || !Feature.enabled?(:settings_operations_prometheus_service, project)
-
- operations_link_start = "<a href=\"#{project_settings_operations_path(project)}\">"
- message = s_('PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page have been deprecated.') % { operations_link_start: operations_link_start, operations_link_end: "</a>" }
- flash.now[:alert] = message.html_safe
- end
-
def use_inherited_settings?(attributes)
default_integration && attributes[:inherit_from_id] == default_integration.id.to_s
end
diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb
index 3f4d26bb6ec..ee50327be8f 100644
--- a/app/controllers/projects/settings/ci_cd_controller.rb
+++ b/app/controllers/projects/settings/ci_cd_controller.rb
@@ -18,6 +18,7 @@ module Projects
helper_method :highlight_badge
feature_category :continuous_integration
+ urgency :low
def show
if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project)
@@ -87,7 +88,7 @@ module Projects
def permitted_project_params
[
:runners_token, :builds_enabled, :build_allow_git_fetch,
- :build_timeout_human_readable, :build_coverage_regex, :public_builds,
+ :build_timeout_human_readable, :public_builds, :ci_separated_caches,
:auto_cancel_pending_pipelines, :ci_config_path, :auto_rollback_enabled,
auto_devops_attributes: [:id, :domain, :enabled, :deploy_strategy],
ci_cd_settings_attributes: [:default_git_depth, :forward_deployment_enabled]
diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb
index 43c72b358db..d4126cbd708 100644
--- a/app/controllers/projects/settings/operations_controller.rb
+++ b/app/controllers/projects/settings/operations_controller.rb
@@ -17,6 +17,7 @@ module Projects
helper_method :tracing_setting
feature_category :incident_management
+ urgency :low
def update
result = ::Projects::Operations::UpdateService.new(project, current_user, update_params).execute
@@ -133,7 +134,7 @@ module Projects
# overridden in EE
def permitted_project_params
- project_params = {
+ {
incident_management_setting_attributes: ::Gitlab::Tracking::IncidentManagement.tracking_keys.keys,
metrics_setting_attributes: [:external_dashboard_url, :dashboard_timezone],
@@ -149,12 +150,6 @@ module Projects
grafana_integration_attributes: [:token, :grafana_url, :enabled],
tracing_setting_attributes: [:external_url]
}
-
- if Feature.enabled?(:settings_operations_prometheus_service, project)
- project_params[:prometheus_integration_attributes] = [:manual_configuration, :api_url]
- end
-
- project_params
end
end
end
diff --git a/app/controllers/projects/settings/packages_and_registries_controller.rb b/app/controllers/projects/settings/packages_and_registries_controller.rb
index 8f0a19cfac5..0cd2bfa9695 100644
--- a/app/controllers/projects/settings/packages_and_registries_controller.rb
+++ b/app/controllers/projects/settings/packages_and_registries_controller.rb
@@ -9,6 +9,7 @@ module Projects
before_action :packages_and_registries_settings_enabled!
feature_category :package_registry
+ urgency :low
def show
end
diff --git a/app/controllers/projects/settings/repository_controller.rb b/app/controllers/projects/settings/repository_controller.rb
index a28c08e87cb..0fd2d56229a 100644
--- a/app/controllers/projects/settings/repository_controller.rb
+++ b/app/controllers/projects/settings/repository_controller.rb
@@ -12,7 +12,7 @@ module Projects
feature_category :source_code_management, [:show, :cleanup]
feature_category :continuous_delivery, [:create_deploy_token]
- urgency :low, [:show]
+ urgency :low, [:show, :create_deploy_token]
def show
render_show
diff --git a/app/controllers/projects/starrers_controller.rb b/app/controllers/projects/starrers_controller.rb
index 91f49fc4d66..bc857648a06 100644
--- a/app/controllers/projects/starrers_controller.rb
+++ b/app/controllers/projects/starrers_controller.rb
@@ -5,6 +5,8 @@ class Projects::StarrersController < Projects::ApplicationController
feature_category :projects
+ urgency :low, [:index]
+
def index
@starrers = UsersStarProjectsFinder.new(@project, params, current_user: @current_user).execute
@sort = params[:sort].presence || sort_value_name
diff --git a/app/controllers/projects/tags/releases_controller.rb b/app/controllers/projects/tags/releases_controller.rb
index 8e5539f546b..b852673d82a 100644
--- a/app/controllers/projects/tags/releases_controller.rb
+++ b/app/controllers/projects/tags/releases_controller.rb
@@ -9,6 +9,7 @@ class Projects::Tags::ReleasesController < Projects::ApplicationController
before_action :release
feature_category :release_evidence
+ urgency :low
def edit
end
diff --git a/app/controllers/projects/terraform_controller.rb b/app/controllers/projects/terraform_controller.rb
index aef163c98c5..ed1783bb43d 100644
--- a/app/controllers/projects/terraform_controller.rb
+++ b/app/controllers/projects/terraform_controller.rb
@@ -4,6 +4,7 @@ class Projects::TerraformController < Projects::ApplicationController
before_action :authorize_can_read_terraform_state!
feature_category :infrastructure_as_code
+ urgency :low
def index
end
diff --git a/app/controllers/projects/todos_controller.rb b/app/controllers/projects/todos_controller.rb
index dafdeb4c9ef..bba1949a084 100644
--- a/app/controllers/projects/todos_controller.rb
+++ b/app/controllers/projects/todos_controller.rb
@@ -7,6 +7,7 @@ class Projects::TodosController < Projects::ApplicationController
before_action :authenticate_user!, only: [:create]
feature_category :team_planning
+ urgency :low
private
diff --git a/app/controllers/projects/tracings_controller.rb b/app/controllers/projects/tracings_controller.rb
index 2bc0c590e8d..a4aac6aaa32 100644
--- a/app/controllers/projects/tracings_controller.rb
+++ b/app/controllers/projects/tracings_controller.rb
@@ -15,6 +15,7 @@ module Projects
feature_category :tracing
def show
+ render_404 unless Feature.enabled?(:monitor_tracing, @project)
end
private
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index a70795f2065..ed14f66847c 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -17,9 +17,9 @@ class Projects::TreeController < Projects::ApplicationController
before_action :authorize_edit_tree!, only: [:create_dir]
before_action do
- push_frontend_feature_flag(:lazy_load_commits, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:highlight_js, @project, default_enabled: :yaml)
+ 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/triggers_controller.rb b/app/controllers/projects/triggers_controller.rb
index eec35fcec8d..f43c7e75fee 100644
--- a/app/controllers/projects/triggers_controller.rb
+++ b/app/controllers/projects/triggers_controller.rb
@@ -9,6 +9,7 @@ class Projects::TriggersController < Projects::ApplicationController
layout 'project_settings'
feature_category :continuous_integration
+ urgency :low
def index
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers')
diff --git a/app/controllers/projects/uploads_controller.rb b/app/controllers/projects/uploads_controller.rb
index e6e91231ba2..a364668ea5f 100644
--- a/app/controllers/projects/uploads_controller.rb
+++ b/app/controllers/projects/uploads_controller.rb
@@ -23,6 +23,10 @@ class Projects::UploadsController < Projects::ApplicationController
FileUploader
end
+ def target_project
+ model
+ end
+
def find_model
return @project if @project
diff --git a/app/controllers/projects/work_items_controller.rb b/app/controllers/projects/work_items_controller.rb
index d39664e1deb..27857dac2b7 100644
--- a/app/controllers/projects/work_items_controller.rb
+++ b/app/controllers/projects/work_items_controller.rb
@@ -6,6 +6,7 @@ class Projects::WorkItemsController < Projects::ApplicationController
end
feature_category :team_planning
+ urgency :low
def index
render_404 unless project&.work_items_feature_flag_enabled?
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 6cdfdfa9e2f..60d30352ff8 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -35,11 +35,12 @@ class ProjectsController < Projects::ApplicationController
before_action :check_export_rate_limit!, only: [:export, :download_export, :generate_new_export]
before_action do
- push_frontend_feature_flag(:lazy_load_commits, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:refactor_blob_viewer, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:highlight_js, @project, default_enabled: :yaml)
- push_frontend_feature_flag(:increase_page_size_exponentially, @project, default_enabled: :yaml)
+ 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)
+ push_licensed_feature(:security_orchestration_policies) if @project.present? && @project.licensed_feature_available?(:security_orchestration_policies)
push_force_frontend_feature_flag(:work_items, @project&.work_items_feature_flag_enabled?)
end
@@ -56,8 +57,13 @@ class ProjectsController < Projects::ApplicationController
feature_category :code_review, [:unfoldered_environment_names]
feature_category :portfolio_management, [:planning_hierarchy]
+ urgency :low, [:export, :remove_export, :generate_new_export, :download_export]
+ urgency :low, [:preview_markdown, :new_issuable_address]
# TODO: Set high urgency for #show https://gitlab.com/gitlab-org/gitlab/-/issues/334444
- urgency :low, [:refs, :show]
+
+ urgency :low, [:refs, :show, :toggle_star, :transfer, :archive, :destroy, :update, :create,
+ :activity, :edit, :new, :export, :remove_export, :generate_new_export, :download_export]
+
urgency :high, [:unfoldered_environment_names]
def index
@@ -233,6 +239,11 @@ class ProjectsController < Projects::ApplicationController
edit_project_path(@project, anchor: 'js-export-project'),
notice: _("Project export started. A download link will be sent by email and made available on this page.")
)
+ rescue Project::ExportLimitExceeded => ex
+ redirect_to(
+ edit_project_path(@project, anchor: 'js-export-project'),
+ alert: ex.to_s
+ )
end
def download_export
@@ -340,6 +351,8 @@ class ProjectsController < Projects::ApplicationController
#
# pages list order: repository readme, wiki home, issues list, customize workflow
def render_landing_page
+ Gitlab::Tracking.event('project_overview', 'render', user: current_user, project: @project.project)
+
if can?(current_user, :download_code, @project)
return render 'projects/no_repo' unless @project.repository_exists?
@@ -412,6 +425,7 @@ class ProjectsController < Projects::ApplicationController
squash_option
mr_default_target_self
warn_about_potentially_unwanted_characters
+ enforce_auth_checks_on_uploads
]
end
@@ -420,7 +434,6 @@ class ProjectsController < Projects::ApplicationController
:allow_merge_on_skipped_pipeline,
:avatar,
:build_allow_git_fetch,
- :build_coverage_regex,
:build_timeout_human_readable,
:resolve_outdated_diff_discussions,
:container_registry_enabled,
@@ -451,6 +464,7 @@ class ProjectsController < Projects::ApplicationController
:initialize_with_sast,
:initialize_with_readme,
:autoclose_referenced_issues,
+ :ci_separated_caches,
:suggestion_commit_message,
:packages_enabled,
:service_desk_enabled,
diff --git a/app/controllers/pwa_controller.rb b/app/controllers/pwa_controller.rb
new file mode 100644
index 00000000000..ea14dfb27b3
--- /dev/null
+++ b/app/controllers/pwa_controller.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class PwaController < ApplicationController # rubocop:disable Gitlab/NamespacedClass
+ layout 'errors'
+
+ feature_category :navigation
+
+ skip_before_action :authenticate_user!
+
+ def offline
+ end
+end
diff --git a/app/controllers/registrations/welcome_controller.rb b/app/controllers/registrations/welcome_controller.rb
index 41fd1b7a1e6..ea50099120b 100644
--- a/app/controllers/registrations/welcome_controller.rb
+++ b/app/controllers/registrations/welcome_controller.rb
@@ -2,6 +2,8 @@
module Registrations
class WelcomeController < ApplicationController
+ include OneTrustCSP
+
layout 'minimal'
skip_before_action :authenticate_user!, :required_signup_info, :check_two_factor_requirement, only: [:show, :update]
before_action :require_current_user
diff --git a/app/controllers/repositories/lfs_storage_controller.rb b/app/controllers/repositories/lfs_storage_controller.rb
index 252b604dcb0..d54b51b463a 100644
--- a/app/controllers/repositories/lfs_storage_controller.rb
+++ b/app/controllers/repositories/lfs_storage_controller.rb
@@ -6,6 +6,8 @@ module Repositories
include WorkhorseRequest
include SendFileUpload
+ InvalidUploadedFile = Class.new(StandardError)
+
skip_before_action :verify_workhorse_api!, only: :download
# added here as a part of the refactor, will be removed
@@ -44,6 +46,8 @@ module Repositories
end
def upload_finalize
+ validate_uploaded_file!
+
if store_file!(oid, size)
head 200, content_type: LfsRequest::CONTENT_TYPE
else
@@ -55,6 +59,8 @@ module Repositories
render_lfs_forbidden
rescue ObjectStorage::RemoteStoreError
render_lfs_forbidden
+ rescue InvalidUploadedFile
+ render plain: 'SHA256 or size mismatch', status: :bad_request
end
private
@@ -117,5 +123,13 @@ module Repositories
lfs_object: object
)
end
+
+ def validate_uploaded_file!
+ return unless uploaded_file
+
+ if size != uploaded_file.size || oid != uploaded_file.sha256
+ raise InvalidUploadedFile
+ end
+ end
end
end
diff --git a/app/controllers/runner_setup_controller.rb b/app/controllers/runner_setup_controller.rb
index 89b635d5a6f..3926bc553ee 100644
--- a/app/controllers/runner_setup_controller.rb
+++ b/app/controllers/runner_setup_controller.rb
@@ -2,6 +2,7 @@
class RunnerSetupController < ApplicationController
feature_category :runner
+ urgency :low
def platforms
render json: Gitlab::Ci::RunnerInstructions::OS.merge(Gitlab::Ci::RunnerInstructions::OTHER_ENVIRONMENTS)
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index b4e2da0c7b3..aab901c1008 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -25,8 +25,7 @@ class SearchController < ApplicationController
layout 'search'
feature_category :global_search
- urgency :high, [:opensearch]
- urgency :low, [:count]
+ urgency :low
def show
@project = search_service.project
@@ -169,17 +168,17 @@ class SearchController < ApplicationController
search_allowed = case params[:scope]
when 'blobs'
- Feature.enabled?(:global_search_code_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_code_tab, current_user, type: :ops)
when 'commits'
- Feature.enabled?(:global_search_commits_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_commits_tab, current_user, type: :ops)
when 'issues'
- Feature.enabled?(:global_search_issues_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_issues_tab, current_user, type: :ops)
when 'merge_requests'
- Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_merge_requests_tab, current_user, type: :ops)
when 'wiki_blobs'
- Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_wiki_tab, current_user, type: :ops)
when 'users'
- Feature.enabled?(:global_search_users_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_users_tab, current_user, type: :ops)
else
true
end
diff --git a/app/controllers/sent_notifications_controller.rb b/app/controllers/sent_notifications_controller.rb
index ebadfd1cdfb..6069924b39a 100644
--- a/app/controllers/sent_notifications_controller.rb
+++ b/app/controllers/sent_notifications_controller.rb
@@ -4,6 +4,7 @@ class SentNotificationsController < ApplicationController
skip_before_action :authenticate_user!
feature_category :team_planning
+ urgency :low
def unsubscribe
@sent_notification = SentNotification.for(params[:id])
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 3e11e0940bf..66a531b0b3b 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -33,7 +33,7 @@ class SessionsController < Devise::SessionsController
before_action :load_recaptcha
before_action :set_invite_params, only: [:new]
before_action do
- push_frontend_feature_flag(:webauthn, default_enabled: :yaml)
+ push_frontend_feature_flag(:webauthn)
end
after_action :log_failed_login, if: :action_new_and_failed_login?
@@ -53,6 +53,7 @@ class SessionsController < Devise::SessionsController
protect_from_forgery with: :exception, prepend: true, except: :destroy
feature_category :authentication_and_authorization
+ urgency :low
CAPTCHA_HEADER = 'X-GitLab-Show-Login-Captcha'
MAX_FAILED_LOGIN_ATTEMPTS = 5
@@ -270,7 +271,7 @@ class SessionsController < Devise::SessionsController
def valid_otp_attempt?(user)
otp_validation_result =
- ::Users::ValidateOtpService.new(user).execute(user_params[:otp_attempt])
+ ::Users::ValidateManualOtpService.new(user).execute(user_params[:otp_attempt])
return true if otp_validation_result[:status] == :success
user.invalidate_otp_backup_code!(user_params[:otp_attempt])
@@ -306,9 +307,9 @@ class SessionsController < Devise::SessionsController
def authentication_method
if user_params[:otp_attempt]
AuthenticationEvent::TWO_FACTOR
- elsif user_params[:device_response] && Feature.enabled?(:webauthn, default_enabled: :yaml)
+ elsif user_params[:device_response] && Feature.enabled?(:webauthn)
AuthenticationEvent::TWO_FACTOR_WEBAUTHN
- elsif user_params[:device_response] && !Feature.enabled?(:webauthn, default_enabled: :yaml)
+ elsif user_params[:device_response] && !Feature.enabled?(:webauthn)
AuthenticationEvent::TWO_FACTOR_U2F
else
AuthenticationEvent::STANDARD
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 228ef710749..794d60e733d 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -34,7 +34,9 @@ class UsersController < ApplicationController
feature_category :snippets, [:snippets]
# TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357914
- urgency :low, [:show]
+ urgency :low, [:show, :calendar_activities, :contributed, :activity, :projects, :groups]
+ urgency :default, [:calendar, :followers, :following, :starred]
+ urgency :high, [:exists]
def show
respond_to do |format|
diff --git a/app/experiments/build_ios_app_guide_email_experiment.rb b/app/experiments/build_ios_app_guide_email_experiment.rb
new file mode 100644
index 00000000000..d334a6a30d9
--- /dev/null
+++ b/app/experiments/build_ios_app_guide_email_experiment.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class BuildIosAppGuideEmailExperiment < ApplicationExperiment
+ control { false }
+ candidate { true }
+end
diff --git a/app/finders/alert_management/alerts_finder.rb b/app/finders/alert_management/alerts_finder.rb
index 1fbc1a4a258..11c0f37a79c 100644
--- a/app/finders/alert_management/alerts_finder.rb
+++ b/app/finders/alert_management/alerts_finder.rb
@@ -66,5 +66,3 @@ module AlertManagement
end
end
end
-
-AlertManagement::AlertsFinder.prepend_mod_with('AlertManagement::AlertsFinder')
diff --git a/app/finders/error_tracking/errors_finder.rb b/app/finders/error_tracking/errors_finder.rb
deleted file mode 100644
index c361d6e2fc2..00000000000
--- a/app/finders/error_tracking/errors_finder.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-module ErrorTracking
- class ErrorsFinder
- def initialize(current_user, project, params)
- @current_user = current_user
- @project = project
- @params = params
- end
-
- def execute
- return ErrorTracking::Error.none unless authorized?
-
- collection = project.error_tracking_errors
- collection = by_status(collection)
- collection = sort(collection)
-
- collection.keyset_paginate(cursor: params[:cursor], per_page: limit)
- end
-
- private
-
- attr_reader :current_user, :project, :params
-
- def by_status(collection)
- if params[:status].present? && ErrorTracking::Error.statuses.key?(params[:status])
- collection.for_status(params[:status])
- else
- collection
- end
- end
-
- def authorized?
- Ability.allowed?(current_user, :read_sentry_issue, project)
- end
-
- def sort(collection)
- params[:sort] ? collection.sort_by_attribute(params[:sort]) : collection.order_id_desc
- end
-
- def limit
- # Restrict the maximum limit at 100 records.
- [(params[:limit] || 20).to_i, 100].min
- end
- end
-end
diff --git a/app/finders/group_descendants_finder.rb b/app/finders/group_descendants_finder.rb
index 40d6be03a17..42cd06c8066 100644
--- a/app/finders/group_descendants_finder.rb
+++ b/app/finders/group_descendants_finder.rb
@@ -112,7 +112,7 @@ class GroupDescendantsFinder
group_ids = base_for_ancestors.except(:select, :sort).select(:id)
groups = Group.where(id: group_ids)
- if Feature.enabled?(:linear_group_descendants_finder_upto, current_user, default_enabled: :yaml)
+ if Feature.enabled?(:linear_group_descendants_finder_upto, current_user)
groups.self_and_ancestors(upto: parent_group.id)
else
Gitlab::ObjectHierarchy.new(groups).base_and_ancestors(upto: parent_group.id)
diff --git a/app/finders/group_members_finder.rb b/app/finders/group_members_finder.rb
index 4213a3f1965..048e25046da 100644
--- a/app/finders/group_members_finder.rb
+++ b/app/finders/group_members_finder.rb
@@ -60,6 +60,10 @@ class GroupMembersFinder < UnionFinder
members = members.filter_by_2fa(params[:two_factor])
end
+ if params[:access_levels].present?
+ members = members.by_access_level(params[:access_levels])
+ end
+
members = apply_additional_filters(members)
by_created_at(members)
diff --git a/app/finders/groups/projects_requiring_authorizations_refresh/base.rb b/app/finders/groups/projects_requiring_authorizations_refresh/base.rb
new file mode 100644
index 00000000000..c719e6ba903
--- /dev/null
+++ b/app/finders/groups/projects_requiring_authorizations_refresh/base.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Groups
+ module ProjectsRequiringAuthorizationsRefresh
+ class Base
+ def initialize(group)
+ @group = group
+ end
+
+ private
+
+ def ids_of_projects_in_hierarchy_and_project_shares(group)
+ project_ids = Set.new
+
+ ids_of_projects_in_hierarchy = group.all_projects.pluck(:id) # rubocop: disable CodeReuse/ActiveRecord
+ ids_of_projects_in_project_shares = ids_of_projects_shared_with_self_and_descendant_groups(group)
+
+ project_ids.merge(ids_of_projects_in_hierarchy)
+ project_ids.merge(ids_of_projects_in_project_shares)
+
+ project_ids
+ end
+
+ def ids_of_projects_shared_with_self_and_descendant_groups(group, batch_size: 50)
+ project_ids = Set.new
+
+ group.self_and_descendants_ids.each_slice(batch_size) do |group_ids|
+ project_ids.merge(ProjectGroupLink.in_group(group_ids).pluck(:project_id)) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ project_ids
+ end
+ end
+ end
+end
diff --git a/app/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder.rb b/app/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder.rb
new file mode 100644
index 00000000000..f6b8b999b99
--- /dev/null
+++ b/app/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# Groups::ProjectsRequiringAuthorizationsRefresh::OnDirectMembershipFinder
+#
+# Given a group, this finder can be used to obtain a list of Project IDs of projects
+# that requires their `project_authorizations` records to be refreshed in the event where
+# a member has been added/removed/updated in the group.
+
+module Groups
+ module ProjectsRequiringAuthorizationsRefresh
+ class OnDirectMembershipFinder < Base
+ def execute
+ project_ids = Set.new
+
+ project_ids.merge(ids_of_projects_in_hierarchy_and_project_shares(@group))
+ project_ids.merge(ids_of_projects_in_hierarchy_and_project_shares_of_shared_groups(@group))
+
+ project_ids.to_a
+ end
+
+ private
+
+ def ids_of_projects_in_hierarchy_and_project_shares_of_shared_groups(group, batch_size: 10)
+ project_ids = Set.new
+
+ group.shared_groups.each_batch(of: batch_size) do |shared_groups_batch|
+ shared_groups_batch.each do |shared_group|
+ project_ids.merge(ids_of_projects_in_hierarchy_and_project_shares(shared_group))
+ end
+ end
+
+ project_ids
+ end
+ end
+ end
+end
diff --git a/app/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder.rb b/app/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder.rb
new file mode 100644
index 00000000000..781e1222287
--- /dev/null
+++ b/app/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+# Groups::ProjectsRequiringAuthorizationsRefresh::OnTransferFinder
+#
+# Given a group, this finder can be used to obtain a list of Project IDs of projects
+# that requires their `project_authorizations` records to be refreshed in the event where
+# the group has been transferred.
+
+module Groups
+ module ProjectsRequiringAuthorizationsRefresh
+ class OnTransferFinder < Base
+ def execute
+ ids_of_projects_in_hierarchy_and_project_shares(@group).to_a
+ end
+ end
+ end
+end
diff --git a/app/finders/groups_finder.rb b/app/finders/groups_finder.rb
index 7cb3e7a5d7f..9a8bc74f435 100644
--- a/app/finders/groups_finder.rb
+++ b/app/finders/groups_finder.rb
@@ -54,7 +54,7 @@ class GroupsFinder < UnionFinder
groups = []
if current_user
- if Feature.enabled?(:use_traversal_ids_groups_finder, current_user, default_enabled: :yaml)
+ if Feature.enabled?(:use_traversal_ids_groups_finder, current_user)
groups << current_user.authorized_groups.self_and_ancestors
groups << current_user.groups.self_and_descendants
else
@@ -81,7 +81,7 @@ class GroupsFinder < UnionFinder
.groups
.where('members.access_level >= ?', params[:min_access_level])
- if Feature.enabled?(:use_traversal_ids_groups_finder, current_user, default_enabled: :yaml)
+ if Feature.enabled?(:use_traversal_ids_groups_finder, current_user)
groups.self_and_descendants
else
Gitlab::ObjectHierarchy
diff --git a/app/finders/incident_management/timeline_events_finder.rb b/app/finders/incident_management/timeline_events_finder.rb
new file mode 100644
index 00000000000..09de46bb79f
--- /dev/null
+++ b/app/finders/incident_management/timeline_events_finder.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ class TimelineEventsFinder
+ def initialize(user, incident, params = {})
+ @user = user
+ @incident = incident
+ @params = params
+ end
+
+ def execute
+ return ::IncidentManagement::TimelineEvent.none unless allowed?
+
+ collection = incident.incident_management_timeline_events
+ collection = by_id(collection)
+ sort(collection)
+ end
+
+ private
+
+ attr_reader :user, :incident, :params
+
+ def allowed?
+ Ability.allowed?(user, :read_incident_management_timeline_event, incident)
+ end
+
+ def by_id(collection)
+ return collection unless params[:id]
+
+ collection.id_in(params[:id])
+ end
+
+ def sort(collection)
+ collection.order_occurred_at_asc
+ end
+ end
+end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index bf7b2265ded..fe07a52cbf0 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -348,7 +348,7 @@ class IssuableFinder
params[:in].blank? &&
klass.try(:pg_full_text_searchable_columns).present? &&
params[:search] =~ FULL_TEXT_SEARCH_TERM_REGEX &&
- Feature.enabled?(:issues_full_text_search, params.project || params.group, default_enabled: :yaml)
+ Feature.enabled?(:issues_full_text_search, params.project || params.group)
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -489,7 +489,7 @@ class IssuableFinder
def or_filters_enabled?
strong_memoize(:or_filters_enabled) do
- Feature.enabled?(:or_issuable_queries, feature_flag_scope, default_enabled: :yaml)
+ Feature.enabled?(:or_issuable_queries, feature_flag_scope)
end
end
diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb
index a7eaaddd187..7929c36906d 100644
--- a/app/finders/issues_finder.rb
+++ b/app/finders/issues_finder.rb
@@ -20,7 +20,6 @@
# sort: string
# my_reaction_emoji: string
# public_only: boolean
-# include_hidden: boolean
# due_date: date or '0', '', 'overdue', 'week', or 'month'
# created_after: datetime
# created_before: datetime
@@ -48,6 +47,8 @@ class IssuesFinder < IssuableFinder
# rubocop: disable CodeReuse/ActiveRecord
def with_confidentiality_access_check
+ return Issue.all if params.user_can_see_all_issues?
+
# Only admins can see hidden issues, so for non-admins, we filter out any hidden issues
issues = Issue.without_hidden
@@ -75,9 +76,7 @@ class IssuesFinder < IssuableFinder
private
def init_collection
- if params.include_hidden?
- Issue.all
- elsif params.public_only?
+ if params.public_only?
Issue.public_only
else
with_confidentiality_access_check
diff --git a/app/finders/issues_finder/params.rb b/app/finders/issues_finder/params.rb
index 57bfb35f1b8..7f8acb79ed6 100644
--- a/app/finders/issues_finder/params.rb
+++ b/app/finders/issues_finder/params.rb
@@ -6,10 +6,6 @@ class IssuesFinder
params.fetch(:public_only, false)
end
- def include_hidden?
- user_can_see_all_issues?
- end
-
def filter_by_any_due_date?
due_date? && params[:due_date] == Issue::AnyDueDate.name
end
diff --git a/app/finders/packages/build_infos_finder.rb b/app/finders/packages/build_infos_finder.rb
index 92ad5888eb9..a346c3d754b 100644
--- a/app/finders/packages/build_infos_finder.rb
+++ b/app/finders/packages/build_infos_finder.rb
@@ -2,33 +2,55 @@
module Packages
class BuildInfosFinder
+ include ActiveRecord::ConnectionAdapters::Quoting
+
MAX_PAGE_SIZE = 100
- def initialize(package, params)
- @package = package
+ def initialize(package_ids, params)
+ @package_ids = package_ids
@params = params
end
def execute
- build_infos = @package.build_infos.without_empty_pipelines
- build_infos = apply_order(build_infos)
- build_infos = apply_limit(build_infos)
- apply_cursor(build_infos)
+ return Packages::BuildInfo.none if @package_ids.blank?
+
+ # This is a highly custom query that
+ # will not be re-used elsewhere
+ # rubocop: disable CodeReuse/ActiveRecord
+ query = Packages::Package.id_in(@package_ids)
+ .select('build_infos.*')
+ .from([Packages::Package.arel_table, lateral_query.arel.lateral.as('build_infos')])
+ .order('build_infos.id DESC')
+
+ # We manually select build_infos fields from the lateral query.
+ # Thus, we need to instruct ActiveRecord that returned rows are
+ # actually Packages::BuildInfo objects
+ Packages::BuildInfo.find_by_sql(query.to_sql)
+ # rubocop: enable CodeReuse/ActiveRecord
end
private
- def apply_order(build_infos)
- order_direction = :desc
- order_direction = :asc if last
+ def lateral_query
+ order_direction = last ? :asc : :desc
- build_infos.order_by_pipeline_id(order_direction)
+ # This is a highly custom query that
+ # will not be re-used elsewhere
+ # rubocop: disable CodeReuse/ActiveRecord
+ where_condition = Packages::BuildInfo.arel_table[:package_id]
+ .eq(Arel.sql("#{Packages::Package.table_name}.id"))
+ build_infos = ::Packages::BuildInfo.without_empty_pipelines
+ .where(where_condition)
+ .order(id: order_direction)
+ .limit(max_rows_per_package_id)
+ # rubocop: enable CodeReuse/ActiveRecord
+ apply_cursor(build_infos)
end
- def apply_limit(build_infos)
+ def max_rows_per_package_id
limit = [first, last, max_page_size, MAX_PAGE_SIZE].compact.min
limit += 1 if support_next_page
- build_infos.limit(limit)
+ limit
end
def apply_cursor(build_infos)
diff --git a/app/finders/packages/build_infos_for_many_packages_finder.rb b/app/finders/packages/build_infos_for_many_packages_finder.rb
deleted file mode 100644
index 8f9805f51d0..00000000000
--- a/app/finders/packages/build_infos_for_many_packages_finder.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-module Packages
- # TODO rename to BuildInfosFinder when cleaning up packages_graphql_pipelines_resolver
- # https://gitlab.com/gitlab-org/gitlab/-/issues/358432
- class BuildInfosForManyPackagesFinder
- include ActiveRecord::ConnectionAdapters::Quoting
-
- MAX_PAGE_SIZE = 100
-
- def initialize(package_ids, params)
- @package_ids = package_ids
- @params = params
- end
-
- def execute
- return Packages::BuildInfo.none if @package_ids.blank?
-
- # This is a highly custom query that
- # will not be re-used elsewhere
- # rubocop: disable CodeReuse/ActiveRecord
- query = Packages::Package.id_in(@package_ids)
- .select('build_infos.*')
- .from([Packages::Package.arel_table, lateral_query.arel.lateral.as('build_infos')])
- .order('build_infos.id DESC')
-
- # We manually select build_infos fields from the lateral query.
- # Thus, we need to instruct ActiveRecord that returned rows are
- # actually Packages::BuildInfo objects
- Packages::BuildInfo.find_by_sql(query.to_sql)
- # rubocop: enable CodeReuse/ActiveRecord
- end
-
- private
-
- def lateral_query
- order_direction = last ? :asc : :desc
-
- # This is a highly custom query that
- # will not be re-used elsewhere
- # rubocop: disable CodeReuse/ActiveRecord
- where_condition = Packages::BuildInfo.arel_table[:package_id]
- .eq(Arel.sql("#{Packages::Package.table_name}.id"))
- build_infos = ::Packages::BuildInfo.without_empty_pipelines
- .where(where_condition)
- .order(id: order_direction)
- .limit(max_rows_per_package_id)
- # rubocop: enable CodeReuse/ActiveRecord
- apply_cursor(build_infos)
- end
-
- def max_rows_per_package_id
- limit = [first, last, max_page_size, MAX_PAGE_SIZE].compact.min
- limit += 1 if support_next_page
- limit
- end
-
- def apply_cursor(build_infos)
- if before
- build_infos.with_pipeline_id_greater_than(before)
- elsif after
- build_infos.with_pipeline_id_less_than(after)
- else
- build_infos
- end
- end
-
- def first
- @params[:first]
- end
-
- def last
- @params[:last]
- end
-
- def max_page_size
- @params[:max_page_size]
- end
-
- def before
- @params[:before]
- end
-
- def after
- @params[:after]
- end
-
- def support_next_page
- @params[:support_next_page]
- end
- end
-end
diff --git a/app/finders/personal_access_tokens_finder.rb b/app/finders/personal_access_tokens_finder.rb
index be266045951..7d356c1014c 100644
--- a/app/finders/personal_access_tokens_finder.rb
+++ b/app/finders/personal_access_tokens_finder.rb
@@ -79,8 +79,6 @@ class PersonalAccessTokensFinder
tokens.active
when 'inactive'
tokens.inactive
- when 'active_or_expired'
- tokens.not_revoked.expired.or(tokens.active)
else
tokens
end
diff --git a/app/finders/projects/serverless/functions_finder.rb b/app/finders/projects/serverless/functions_finder.rb
deleted file mode 100644
index f8ccea6b820..00000000000
--- a/app/finders/projects/serverless/functions_finder.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Serverless
- class FunctionsFinder
- include Gitlab::Utils::StrongMemoize
- include ReactiveCaching
-
- attr_reader :project
-
- self.reactive_cache_key = ->(finder) { finder.cache_key }
- self.reactive_cache_work_type = :external_dependency
- self.reactive_cache_worker_finder = ->(_id, *args) { from_cache(*args) }
-
- MAX_CLUSTERS = 10
-
- def initialize(project)
- @project = project
- end
-
- def execute
- knative_services.flatten.compact
- end
-
- def knative_installed
- return knative_installed_from_cluster?(*cache_key) if available_environments.empty?
-
- states = services_finders.map do |finder|
- finder.knative_detected.tap do |state|
- return state if state == ::Clusters::KnativeServicesFinder::KNATIVE_STATES['checking'] # rubocop:disable Cop/AvoidReturnFromBlocks
- end
- end
-
- states.any? { |state| state == ::Clusters::KnativeServicesFinder::KNATIVE_STATES['installed'] }
- end
-
- def service(environment_scope, name)
- knative_service(environment_scope, name)&.first
- end
-
- def invocation_metrics(environment_scope, name)
- environment = finders_for_scope(environment_scope).first&.environment
-
- if environment.present? && environment.prometheus_adapter&.can_query?
- func = ::Serverless::Function.new(project, name, environment.deployment_namespace)
- environment.prometheus_adapter.query(:knative_invocation, func)
- end
- end
-
- def has_prometheus?(environment_scope)
- finders_for_scope(environment_scope).any? do |finder|
- finder.cluster.integration_prometheus_available?
- end
- end
-
- def self.from_cache(project_id)
- project = Project.find(project_id)
-
- new(project)
- end
-
- def cache_key(*args)
- [project.id]
- end
-
- def calculate_reactive_cache(*)
- # rubocop: disable CodeReuse/ActiveRecord
- project.all_clusters.enabled.take(MAX_CLUSTERS).any? do |cluster|
- cluster.kubeclient.knative_client.discover
- rescue Kubeclient::ResourceNotFoundError
- next
- end
- end
-
- private
-
- def knative_installed_from_cluster?(*cache_key)
- cached_data = with_reactive_cache_memoized(*cache_key) { |data| data }
-
- return ::Clusters::KnativeServicesFinder::KNATIVE_STATES['checking'] if cached_data.nil?
-
- cached_data ? true : false
- end
-
- def with_reactive_cache_memoized(*cache_key)
- strong_memoize(:reactive_cache) do
- with_reactive_cache(*cache_key) { |data| data }
- end
- end
-
- def knative_service(environment_scope, name)
- finders_for_scope(environment_scope).map do |finder|
- services = finder
- .services
- .select { |svc| svc["metadata"]["name"] == name }
-
- attributes = add_metadata(finder, services).first
- next unless attributes
-
- Gitlab::Serverless::Service.new(attributes)
- end
- end
-
- def knative_services
- services_finders.map do |finder|
- attributes = add_metadata(finder, finder.services)
-
- attributes&.map do |attributes|
- Gitlab::Serverless::Service.new(attributes)
- end
- end
- end
-
- def add_metadata(finder, services)
- return if services.nil?
-
- add_pod_count = services.one?
-
- services.each do |s|
- s["environment_scope"] = finder.cluster.environment_scope
- s["environment"] = finder.environment
- s["cluster"] = finder.cluster
-
- if add_pod_count
- s["podcount"] = finder
- .service_pod_details(s["metadata"]["name"])
- .length
- end
- end
- end
-
- def services_finders
- strong_memoize(:services_finders) do
- available_environments.map(&:knative_services_finder).compact
- end
- end
-
- def available_environments
- @project.environments.available.preload_cluster
- end
-
- def finders_for_scope(environment_scope)
- services_finders.select do |finder|
- environment_scope == finder.cluster.environment_scope
- end
- end
-
- def id
- nil
- end
- end
- end
-end
diff --git a/app/finders/releases_finder.rb b/app/finders/releases_finder.rb
index 0d72d6ffc6b..78240e0a050 100644
--- a/app/finders/releases_finder.rb
+++ b/app/finders/releases_finder.rb
@@ -29,28 +29,14 @@ class ReleasesFinder
Release.where(project_id: projects).where.not(tag: nil) # rubocop: disable CodeReuse/ActiveRecord
end
- def include_subgroups?
- params.fetch(:include_subgroups, false)
- end
-
def projects
strong_memoize(:projects) do
if parent.is_a?(Project)
Ability.allowed?(current_user, :read_release, parent) ? [parent] : []
- elsif parent.is_a?(Group)
- Ability.allowed?(current_user, :read_release, parent) ? accessible_projects : []
end
end
end
- def accessible_projects
- if include_subgroups?
- Project.for_group_and_its_subgroups(parent)
- else
- parent.projects
- end
- end
-
# rubocop: disable CodeReuse/ActiveRecord
def by_tag(releases)
return releases unless params[:tag].present?
diff --git a/app/finders/tags_finder.rb b/app/finders/tags_finder.rb
index 6bc5419e704..16bba62f766 100644
--- a/app/finders/tags_finder.rb
+++ b/app/finders/tags_finder.rb
@@ -1,10 +1,6 @@
# frozen_string_literal: true
class TagsFinder < GitRefsFinder
- def initialize(repository, params)
- super(repository, params)
- end
-
def execute(gitaly_pagination: false)
tags = if gitaly_pagination
repository.tags_sorted_by(sort, pagination_params)
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb
index 64903c67573..0f7bf893bb2 100644
--- a/app/finders/user_recent_events_finder.rb
+++ b/app/finders/user_recent_events_finder.rb
@@ -74,7 +74,12 @@ class UserRecentEventsFinder
return Event.none if users.empty?
if Feature.enabled?(:optimized_followed_users_queries, current_user)
- query_builder_params = event_filter.in_operator_query_builder_params(users)
+ 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)
diff --git a/app/graphql/mutations/award_emojis/base.rb b/app/graphql/mutations/award_emojis/base.rb
index ce73f2083f2..dc2d46269e6 100644
--- a/app/graphql/mutations/award_emojis/base.rb
+++ b/app/graphql/mutations/award_emojis/base.rb
@@ -26,12 +26,6 @@ module Mutations
private
- # TODO: remove this method when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- def find_object(id:)
- super(id: ::Types::GlobalIDType[::Awardable].coerce_isolated_input(id))
- end
-
def authorize!(object)
super
raise_resource_not_available_error!(NOT_EMOJI_AWARDABLE) unless object.emoji_awardable?
diff --git a/app/graphql/mutations/base_mutation.rb b/app/graphql/mutations/base_mutation.rb
index 5de042f78d6..d57a097a9e2 100644
--- a/app/graphql/mutations/base_mutation.rb
+++ b/app/graphql/mutations/base_mutation.rb
@@ -4,7 +4,6 @@ module Mutations
class BaseMutation < GraphQL::Schema::RelayClassicMutation
include Gitlab::Graphql::Authorize::AuthorizeResource
prepend Gitlab::Graphql::CopyFieldDescription
- prepend ::Gitlab::Graphql::GlobalIDCompatibility
ERROR_MESSAGE = 'You cannot perform write operations on a read-only instance'
diff --git a/app/graphql/mutations/boards/update.rb b/app/graphql/mutations/boards/update.rb
index 40ab5a5ba7d..7cfce9d2d91 100644
--- a/app/graphql/mutations/boards/update.rb
+++ b/app/graphql/mutations/boards/update.rb
@@ -33,9 +33,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Board].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/ci/ci_cd_settings_update.rb b/app/graphql/mutations/ci/ci_cd_settings_update.rb
index dec90ced962..98b8e9567e7 100644
--- a/app/graphql/mutations/ci/ci_cd_settings_update.rb
+++ b/app/graphql/mutations/ci/ci_cd_settings_update.rb
@@ -2,42 +2,9 @@
module Mutations
module Ci
- class CiCdSettingsUpdate < BaseMutation
+ # TODO: Remove in 16.0, see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87002
+ class CiCdSettingsUpdate < ProjectCiCdSettingsUpdate
graphql_name 'CiCdSettingsUpdate'
-
- include FindsProject
-
- authorize :admin_project
-
- argument :full_path, GraphQL::Types::ID,
- required: true,
- description: 'Full Path of the project the settings belong to.'
-
- argument :keep_latest_artifact, GraphQL::Types::Boolean,
- required: false,
- description: 'Indicates if the latest artifact should be kept for this project.'
-
- argument :job_token_scope_enabled, GraphQL::Types::Boolean,
- required: false,
- description: 'Indicates CI job tokens generated in this project have restricted access to resources.'
-
- field :ci_cd_settings,
- Types::Ci::CiCdSettingType,
- null: false,
- description: 'CI/CD settings after mutation.'
-
- def resolve(full_path:, **args)
- project = authorized_find!(full_path)
- settings = project.ci_cd_settings
- settings.update(args)
-
- {
- ci_cd_settings: settings,
- errors: errors_on_object(settings)
- }
- end
end
end
end
-
-Mutations::Ci::CiCdSettingsUpdate.prepend_mod_with('Mutations::Ci::CiCdSettingsUpdate')
diff --git a/app/graphql/mutations/ci/job/base.rb b/app/graphql/mutations/ci/job/base.rb
index a9fe26226d9..6ea8e25a58d 100644
--- a/app/graphql/mutations/ci/job/base.rb
+++ b/app/graphql/mutations/ci/job/base.rb
@@ -11,9 +11,6 @@ module Mutations
description: 'ID of the job to mutate.'
def find_object(id: )
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = JobID.coerce_isolated_input(id)
GlobalID::Locator.locate(id)
end
end
diff --git a/app/graphql/mutations/ci/pipeline/base.rb b/app/graphql/mutations/ci/pipeline/base.rb
index aed8035a52a..503cf6c005f 100644
--- a/app/graphql/mutations/ci/pipeline/base.rb
+++ b/app/graphql/mutations/ci/pipeline/base.rb
@@ -13,9 +13,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = PipelineID.coerce_isolated_input(id)
GlobalID::Locator.locate(id)
end
end
diff --git a/app/graphql/mutations/ci/project_ci_cd_settings_update.rb b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
new file mode 100644
index 00000000000..b0cffa2c088
--- /dev/null
+++ b/app/graphql/mutations/ci/project_ci_cd_settings_update.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Ci
+ class ProjectCiCdSettingsUpdate < BaseMutation
+ graphql_name 'ProjectCiCdSettingsUpdate'
+
+ include FindsProject
+
+ authorize :admin_project
+
+ argument :full_path, GraphQL::Types::ID,
+ required: true,
+ description: 'Full Path of the project the settings belong to.'
+
+ argument :keep_latest_artifact, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Indicates if the latest artifact should be kept for this project.'
+
+ argument :job_token_scope_enabled, GraphQL::Types::Boolean,
+ required: false,
+ description: 'Indicates CI job tokens generated in this project have restricted access to resources.'
+
+ field :ci_cd_settings,
+ Types::Ci::CiCdSettingType,
+ null: false,
+ description: 'CI/CD settings after mutation.'
+
+ def resolve(full_path:, **args)
+ project = authorized_find!(full_path)
+ settings = project.ci_cd_settings
+ settings.update(args)
+
+ {
+ ci_cd_settings: settings,
+ errors: errors_on_object(settings)
+ }
+ end
+ end
+ end
+end
+
+Mutations::Ci::ProjectCiCdSettingsUpdate.prepend_mod_with('Mutations::Ci::ProjectCiCdSettingsUpdate')
diff --git a/app/graphql/mutations/ci/runner/delete.rb b/app/graphql/mutations/ci/runner/delete.rb
index 1713ec0bf6d..db68914a4eb 100644
--- a/app/graphql/mutations/ci/runner/delete.rb
+++ b/app/graphql/mutations/ci/runner/delete.rb
@@ -23,10 +23,6 @@ module Mutations
end
def find_object(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = RunnerID.coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/ci/runner/update.rb b/app/graphql/mutations/ci/runner/update.rb
index 3432840f60f..faccd1273e5 100644
--- a/app/graphql/mutations/ci/runner/update.rb
+++ b/app/graphql/mutations/ci/runner/update.rb
@@ -61,10 +61,6 @@ module Mutations
end
def find_object(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = RunnerID.coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/ci/runners_registration_token/reset.rb b/app/graphql/mutations/ci/runners_registration_token/reset.rb
index 29ef7aa2e81..8c49b682ab0 100644
--- a/app/graphql/mutations/ci/runners_registration_token/reset.rb
+++ b/app/graphql/mutations/ci/runners_registration_token/reset.rb
@@ -23,19 +23,24 @@ module Mutations
null: true,
description: 'Runner token after mutation.'
- def resolve(**args)
+ def resolve(type:, id: nil)
+ scope = authorized_find!(type: type, id: id)
+ new_token = reset_token(scope)
+
{
- token: reset_token(**args),
- errors: []
+ token: new_token,
+ errors: errors_on_object(scope)
}
end
private
- def find_object(type:, **args)
- id = args[:id]
-
+ def find_object(type:, id: nil)
case type
+ when 'instance_type'
+ raise Gitlab::Graphql::Errors::ArgumentError, "id must not be specified for '#{type}' scope" if id.present?
+
+ ApplicationSetting.current
when 'group_type'
GitlabSchema.object_from_id(id, expected_type: ::Group)
when 'project_type'
@@ -43,20 +48,7 @@ module Mutations
end
end
- def reset_token(type:, **args)
- id = args[:id]
- scope = nil
-
- case type
- when 'instance_type'
- raise Gitlab::Graphql::Errors::ArgumentError, "id must not be specified for '#{type}' scope" if id.present?
-
- scope = ApplicationSetting.current
- authorize!(scope)
- when 'group_type', 'project_type'
- scope = authorized_find!(type: type, id: id)
- end
-
+ def reset_token(scope)
::Ci::Runners::ResetRegistrationTokenService.new(scope, current_user).execute if scope
end
end
diff --git a/app/graphql/mutations/clusters/agent_tokens/create.rb b/app/graphql/mutations/clusters/agent_tokens/create.rb
index 07bf2536065..a99a54fa5ed 100644
--- a/app/graphql/mutations/clusters/agent_tokens/create.rb
+++ b/app/graphql/mutations/clusters/agent_tokens/create.rb
@@ -58,9 +58,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ClusterAgentID.coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/clusters/agent_tokens/delete.rb b/app/graphql/mutations/clusters/agent_tokens/delete.rb
deleted file mode 100644
index 603b6b30910..00000000000
--- a/app/graphql/mutations/clusters/agent_tokens/delete.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-module Mutations
- module Clusters
- module AgentTokens
- class Delete < BaseMutation
- graphql_name 'ClusterAgentTokenDelete'
-
- authorize :admin_cluster
-
- TokenID = ::Types::GlobalIDType[::Clusters::AgentToken]
-
- argument :id, TokenID,
- required: true,
- description: 'Global ID of the cluster agent token that will be deleted.'
-
- def resolve(id:)
- token = authorized_find!(id: id)
- token.destroy
-
- { errors: errors_on_object(token) }
- end
-
- private
-
- def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = TokenID.coerce_isolated_input(id)
- GitlabSchema.find_by_gid(id)
- end
- end
- end
- end
-end
diff --git a/app/graphql/mutations/clusters/agent_tokens/revoke.rb b/app/graphql/mutations/clusters/agent_tokens/revoke.rb
index ca570792296..974db976f1d 100644
--- a/app/graphql/mutations/clusters/agent_tokens/revoke.rb
+++ b/app/graphql/mutations/clusters/agent_tokens/revoke.rb
@@ -24,9 +24,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = TokenID.coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/clusters/agents/delete.rb b/app/graphql/mutations/clusters/agents/delete.rb
index 9ada1f31f60..fb482e02794 100644
--- a/app/graphql/mutations/clusters/agents/delete.rb
+++ b/app/graphql/mutations/clusters/agents/delete.rb
@@ -28,9 +28,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = AgentID.coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/container_expiration_policies/update.rb b/app/graphql/mutations/container_expiration_policies/update.rb
index 762058acf3d..c2208e469c5 100644
--- a/app/graphql/mutations/container_expiration_policies/update.rb
+++ b/app/graphql/mutations/container_expiration_policies/update.rb
@@ -7,7 +7,7 @@ module Mutations
include FindsProject
- authorize :destroy_container_image
+ authorize :admin_container_image
argument :project_path,
GraphQL::Types::ID,
diff --git a/app/graphql/mutations/container_repositories/destroy_base.rb b/app/graphql/mutations/container_repositories/destroy_base.rb
index ddaa6c52121..1c2c4d87a5f 100644
--- a/app/graphql/mutations/container_repositories/destroy_base.rb
+++ b/app/graphql/mutations/container_repositories/destroy_base.rb
@@ -8,9 +8,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::ContainerRepository].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/customer_relations/contacts/base.rb b/app/graphql/mutations/customer_relations/contacts/base.rb
new file mode 100644
index 00000000000..5d49d48ebe2
--- /dev/null
+++ b/app/graphql/mutations/customer_relations/contacts/base.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Mutations
+ module CustomerRelations
+ module Contacts
+ class Base < BaseMutation
+ include ResolvesIds
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ field :contact,
+ Types::CustomerRelations::ContactType,
+ null: true,
+ description: 'Contact after the mutation.'
+
+ authorize :admin_crm_contact
+
+ def set_organization!(args)
+ return unless args[:organization_id]
+
+ args[:organization_id] = args[:organization_id].model_id
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/customer_relations/contacts/create.rb b/app/graphql/mutations/customer_relations/contacts/create.rb
index 96dc047c3db..5b4063fb89a 100644
--- a/app/graphql/mutations/customer_relations/contacts/create.rb
+++ b/app/graphql/mutations/customer_relations/contacts/create.rb
@@ -3,17 +3,11 @@
module Mutations
module CustomerRelations
module Contacts
- class Create < BaseMutation
+ class Create < Base
graphql_name 'CustomerRelationsContactCreate'
- include ResolvesIds
include Gitlab::Graphql::Authorize::AuthorizeResource
- field :contact,
- Types::CustomerRelations::ContactType,
- null: true,
- description: 'Contact after the mutation.'
-
argument :group_id, ::Types::GlobalIDType[::Group],
required: true,
description: 'Group for the contact.'
@@ -42,8 +36,6 @@ module Mutations
required: false,
description: 'Description of or notes for the contact.'
- authorize :admin_crm_contact
-
def resolve(args)
group = authorized_find!(id: args[:group_id])
@@ -55,12 +47,6 @@ module Mutations
def find_object(id:)
GitlabSchema.object_from_id(id, expected_type: ::Group)
end
-
- def set_organization!(args)
- return unless args[:organization_id]
-
- args[:organization_id] = resolve_ids(args[:organization_id], ::Types::GlobalIDType[::CustomerRelations::Organization])[0]
- end
end
end
end
diff --git a/app/graphql/mutations/customer_relations/contacts/update.rb b/app/graphql/mutations/customer_relations/contacts/update.rb
index a3abf37f21f..1fc4f655464 100644
--- a/app/graphql/mutations/customer_relations/contacts/update.rb
+++ b/app/graphql/mutations/customer_relations/contacts/update.rb
@@ -3,18 +3,9 @@
module Mutations
module CustomerRelations
module Contacts
- class Update < Mutations::BaseMutation
+ class Update < Base
graphql_name 'CustomerRelationsContactUpdate'
- include ResolvesIds
-
- authorize :admin_crm_contact
-
- field :contact,
- Types::CustomerRelations::ContactType,
- null: true,
- description: 'Contact after the mutation.'
-
argument :id, ::Types::GlobalIDType[::CustomerRelations::Contact],
required: true,
description: 'Global ID of the contact.'
@@ -43,6 +34,10 @@ module Mutations
required: false,
description: 'Description of or notes for the contact.'
+ argument :active, GraphQL::Types::Boolean,
+ required: false,
+ description: 'State of the contact.'
+
def resolve(args)
contact = ::Gitlab::Graphql::Lazy.force(GitlabSchema.object_from_id(args.delete(:id), expected_type: ::CustomerRelations::Contact))
raise_resource_not_available_error! unless contact
@@ -50,6 +45,7 @@ module Mutations
group = contact.group
authorize!(group)
+ set_organization!(args)
result = ::CustomerRelations::Contacts::UpdateService.new(group: group, current_user: current_user, params: args).execute(contact)
{ contact: result.payload, errors: result.errors }
end
diff --git a/app/graphql/mutations/customer_relations/organizations/update.rb b/app/graphql/mutations/customer_relations/organizations/update.rb
index 0c05541dbd7..b2153b0b102 100644
--- a/app/graphql/mutations/customer_relations/organizations/update.rb
+++ b/app/graphql/mutations/customer_relations/organizations/update.rb
@@ -34,6 +34,10 @@ module Mutations
required: false,
description: 'Description of or notes for the organization.'
+ argument :active, GraphQL::Types::Boolean,
+ required: false,
+ description: 'State of the organization.'
+
def resolve(args)
organization = ::Gitlab::Graphql::Lazy.force(GitlabSchema.object_from_id(args.delete(:id), expected_type: ::CustomerRelations::Organization))
raise_resource_not_available_error! unless organization
diff --git a/app/graphql/mutations/design_management/move.rb b/app/graphql/mutations/design_management/move.rb
index 1ca03f22880..b19d9b4ce61 100644
--- a/app/graphql/mutations/design_management/move.rb
+++ b/app/graphql/mutations/design_management/move.rb
@@ -35,9 +35,6 @@ module Mutations
end
def find_design(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = DesignID.coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
diff --git a/app/graphql/mutations/discussions/toggle_resolve.rb b/app/graphql/mutations/discussions/toggle_resolve.rb
index 2005c9e54e0..fce6e4f416f 100644
--- a/app/graphql/mutations/discussions/toggle_resolve.rb
+++ b/app/graphql/mutations/discussions/toggle_resolve.rb
@@ -54,9 +54,6 @@ module Mutations
end
def find_object(id:)
- # TODO: remove explicit coercion once compatibility layer has been removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = Types::GlobalIDType[Discussion].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
diff --git a/app/graphql/mutations/environments/canary_ingress/update.rb b/app/graphql/mutations/environments/canary_ingress/update.rb
index ce24b8842c6..1cddfdd815b 100644
--- a/app/graphql/mutations/environments/canary_ingress/update.rb
+++ b/app/graphql/mutations/environments/canary_ingress/update.rb
@@ -24,7 +24,7 @@ module Mutations
'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
def resolve(id:, **kwargs)
- return { errors: [REMOVAL_ERR_MSG] } if cert_based_clusters_ff_disabled?
+ return { errors: [REMOVAL_ERR_MSG] } unless certificate_based_clusters_enabled?
environment = authorized_find!(id: id)
@@ -36,15 +36,14 @@ module Mutations
end
def find_object(id:)
- # TODO: remove as part of https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Environment].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
private
- def cert_based_clusters_ff_disabled?
- Feature.disabled?(:certificate_based_clusters, default_enabled: :yaml, type: :ops)
+ def certificate_based_clusters_enabled?
+ instance_cluster = ::Clusters::Instance.new
+ instance_cluster.certificate_based_clusters_enabled?
end
end
end
diff --git a/app/graphql/mutations/incident_management/timeline_event/base.rb b/app/graphql/mutations/incident_management/timeline_event/base.rb
new file mode 100644
index 00000000000..742470b4831
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/base.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Base < BaseMutation
+ field :timeline_event,
+ ::Types::IncidentManagement::TimelineEventType,
+ null: true,
+ description: 'Timeline event.'
+
+ authorize :admin_incident_management_timeline_event
+
+ private
+
+ def response(result)
+ {
+ timeline_event: result.payload[:timeline_event],
+ errors: result.errors
+ }
+ end
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::IncidentManagement::TimelineEvent).sync
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/create.rb b/app/graphql/mutations/incident_management/timeline_event/create.rb
new file mode 100644
index 00000000000..cbc708a2530
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/create.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Create < Base
+ graphql_name 'TimelineEventCreate'
+
+ argument :incident_id, Types::GlobalIDType[::Issue],
+ required: true,
+ description: 'Incident ID of the timeline event.'
+
+ argument :note, GraphQL::Types::String,
+ required: true,
+ description: 'Text note of the timeline event.'
+
+ argument :occurred_at, Types::TimeType,
+ required: true,
+ description: 'Timestamp of when the event occurred.'
+
+ def resolve(incident_id:, **args)
+ incident = authorized_find!(id: incident_id)
+
+ authorize!(incident)
+
+ response ::IncidentManagement::TimelineEvents::CreateService.new(incident, current_user, args).execute
+ end
+
+ private
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Issue).sync
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/destroy.rb b/app/graphql/mutations/incident_management/timeline_event/destroy.rb
new file mode 100644
index 00000000000..728a2e7c0d6
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/destroy.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Destroy < Base
+ graphql_name 'TimelineEventDestroy'
+
+ argument :id, Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'Timeline event ID to remove.'
+
+ def resolve(id:)
+ timeline_event = authorized_find!(id: id)
+
+ response ::IncidentManagement::TimelineEvents::DestroyService.new(
+ timeline_event,
+ current_user
+ ).execute
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb b/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb
new file mode 100644
index 00000000000..73a20b8a380
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/promote_from_note.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class PromoteFromNote < Base
+ graphql_name 'TimelineEventPromoteFromNote'
+
+ argument :note_id, Types::GlobalIDType[::Note],
+ required: true,
+ description: 'Note ID from which the timeline event promoted.'
+
+ def resolve(note_id:)
+ note = find_object(id: note_id)
+ incident = note&.noteable
+
+ authorize!(incident)
+
+ response ::IncidentManagement::TimelineEvents::CreateService.new(
+ incident,
+ current_user,
+ promoted_from_note: note,
+ note: note.note,
+ occurred_at: note.created_at
+ ).execute
+ end
+
+ private
+
+ def find_object(id:)
+ GitlabSchema.object_from_id(id, expected_type: ::Note).sync
+ end
+
+ def authorize!(object)
+ raise_noteable_not_incident! if object && !object.try(:incident?)
+
+ super
+ end
+
+ def raise_noteable_not_incident!
+ raise_resource_not_available_error! 'Note does not belong to an incident'
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/incident_management/timeline_event/update.rb b/app/graphql/mutations/incident_management/timeline_event/update.rb
new file mode 100644
index 00000000000..1f53bdc19cb
--- /dev/null
+++ b/app/graphql/mutations/incident_management/timeline_event/update.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Mutations
+ module IncidentManagement
+ module TimelineEvent
+ class Update < Base
+ graphql_name 'TimelineEventUpdate'
+
+ argument :id, ::Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'ID of the timeline event to update.'
+
+ argument :note, GraphQL::Types::String,
+ required: false,
+ description: 'Text note of the timeline event.'
+
+ argument :occurred_at, Types::TimeType,
+ required: false,
+ description: 'Timestamp when the event occurred.'
+
+ def resolve(id:, **args)
+ timeline_event = authorized_find!(id: id)
+
+ response ::IncidentManagement::TimelineEvents::UpdateService.new(
+ timeline_event,
+ current_user,
+ args
+ ).execute
+ end
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/issues/set_crm_contacts.rb b/app/graphql/mutations/issues/set_crm_contacts.rb
index 62990fc67f1..4df65e4769c 100644
--- a/app/graphql/mutations/issues/set_crm_contacts.rb
+++ b/app/graphql/mutations/issues/set_crm_contacts.rb
@@ -48,7 +48,7 @@ module Mutations
private
def feature_enabled?(project)
- Feature.enabled?(:customer_relations, project.group, default_enabled: :yaml) && project.group&.crm_enabled?
+ Feature.enabled?(:customer_relations, project.group) && project.group&.crm_enabled?
end
end
end
diff --git a/app/graphql/mutations/merge_requests/remove_attention_request.rb b/app/graphql/mutations/merge_requests/remove_attention_request.rb
new file mode 100644
index 00000000000..3b12b09528b
--- /dev/null
+++ b/app/graphql/mutations/merge_requests/remove_attention_request.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Mutations
+ module MergeRequests
+ class RemoveAttentionRequest < Base
+ graphql_name 'MergeRequestRemoveAttentionRequest'
+
+ argument :user_id, ::Types::GlobalIDType[::User],
+ loads: Types::UserType,
+ required: true,
+ description: <<~DESC
+ User ID of the user for attention request removal.
+ DESC
+
+ def resolve(project_path:, iid:, user:)
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless feature_enabled?
+
+ merge_request = authorized_find!(project_path: project_path, iid: iid)
+
+ result = ::MergeRequests::RemoveAttentionRequestedService.new(
+ project: merge_request.project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ ).execute
+
+ {
+ merge_request: merge_request,
+ errors: Array(result[:message])
+ }
+ end
+
+ private
+
+ def feature_enabled?
+ current_user&.mr_attention_requests_enabled?
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/request_attention.rb b/app/graphql/mutations/merge_requests/request_attention.rb
new file mode 100644
index 00000000000..5f5565285f6
--- /dev/null
+++ b/app/graphql/mutations/merge_requests/request_attention.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module Mutations
+ module MergeRequests
+ class RequestAttention < Base
+ graphql_name 'MergeRequestRequestAttention'
+
+ argument :user_id, ::Types::GlobalIDType[::User],
+ loads: Types::UserType,
+ required: true,
+ description: <<~DESC
+ User ID of the user to request attention.
+ DESC
+
+ def resolve(project_path:, iid:, user:)
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless feature_enabled?
+
+ merge_request = authorized_find!(project_path: project_path, iid: iid)
+
+ result = ::MergeRequests::RequestAttentionService.new(
+ project: merge_request.project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ ).execute
+
+ {
+ merge_request: merge_request,
+ errors: Array(result[:message])
+ }
+ end
+
+ private
+
+ def feature_enabled?
+ current_user&.mr_attention_requests_enabled?
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/set_labels.rb b/app/graphql/mutations/merge_requests/set_labels.rb
index 0b40d6c5c5e..f80fcd0f1ac 100644
--- a/app/graphql/mutations/merge_requests/set_labels.rb
+++ b/app/graphql/mutations/merge_requests/set_labels.rb
@@ -23,9 +23,6 @@ module Mutations
merge_request = authorized_find!(project_path: project_path, iid: iid)
project = merge_request.project
- # TODO: remove this line when the compatibility layer is removed:
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- label_ids = label_ids.map { |id| ::Types::GlobalIDType[::Label].coerce_isolated_input(id) }
# MergeRequests::UpdateService expects integers
label_ids = label_ids.compact.map(&:model_id)
diff --git a/app/graphql/mutations/merge_requests/toggle_attention_requested.rb b/app/graphql/mutations/merge_requests/toggle_attention_requested.rb
index f316f23fb85..8913ca48531 100644
--- a/app/graphql/mutations/merge_requests/toggle_attention_requested.rb
+++ b/app/graphql/mutations/merge_requests/toggle_attention_requested.rb
@@ -13,6 +13,8 @@ module Mutations
DESC
def resolve(project_path:, iid:, user:)
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable, 'Feature disabled' unless current_user&.mr_attention_requests_enabled?
+
merge_request = authorized_find!(project_path: project_path, iid: iid)
result = ::MergeRequests::ToggleAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request, user: user).execute
diff --git a/app/graphql/mutations/metrics/dashboard/annotations/create.rb b/app/graphql/mutations/metrics/dashboard/annotations/create.rb
index 2eb48c9029d..2e7c0c5a2f9 100644
--- a/app/graphql/mutations/metrics/dashboard/annotations/create.rb
+++ b/app/graphql/mutations/metrics/dashboard/annotations/create.rb
@@ -96,16 +96,7 @@ module Mutations
end
def annotation_source(args)
- # TODO: remove these lines when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- annotation_source_id = if args[:cluster_id]
- ::Types::GlobalIDType[::Clusters::Cluster].coerce_isolated_input(args[:cluster_id])
- else
- ::Types::GlobalIDType[::Environment].coerce_isolated_input(args[:environment_id])
- end
-
- # TODO: uncomment following line once lines above are removed
- # annotation_source_id = args[:cluster_id] || args[:environment_id]
+ annotation_source_id = args[:cluster_id] || args[:environment_id]
authorized_find!(id: annotation_source_id)
end
end
diff --git a/app/graphql/mutations/namespace/package_settings/update.rb b/app/graphql/mutations/namespace/package_settings/update.rb
index 934b75193d7..e499e646781 100644
--- a/app/graphql/mutations/namespace/package_settings/update.rb
+++ b/app/graphql/mutations/namespace/package_settings/update.rb
@@ -8,7 +8,7 @@ module Mutations
include Mutations::ResolvesNamespace
- authorize :create_package_settings
+ authorize :admin_package
argument :namespace_path,
GraphQL::Types::ID,
diff --git a/app/graphql/mutations/notes/base.rb b/app/graphql/mutations/notes/base.rb
index 65bb9e4644c..fb74805db17 100644
--- a/app/graphql/mutations/notes/base.rb
+++ b/app/graphql/mutations/notes/base.rb
@@ -17,9 +17,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove explicit coercion once compatibility layer has been removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Note].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/notes/create/base.rb b/app/graphql/mutations/notes/create/base.rb
index e13a51c6862..1b673204213 100644
--- a/app/graphql/mutations/notes/create/base.rb
+++ b/app/graphql/mutations/notes/create/base.rb
@@ -42,9 +42,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove explicit coercion once compatibility layer has been removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Noteable].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
diff --git a/app/graphql/mutations/notes/create/note.rb b/app/graphql/mutations/notes/create/note.rb
index 1cfc11c6b11..4d6f056de09 100644
--- a/app/graphql/mutations/notes/create/note.rb
+++ b/app/graphql/mutations/notes/create/note.rb
@@ -22,11 +22,8 @@ module Mutations
def create_note_params(noteable, args)
discussion_id = nil
- if args[:discussion_id]
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- discussion_gid = ::Types::GlobalIDType[::Discussion].coerce_isolated_input(args[:discussion_id])
- discussion = GitlabSchema.find_by_gid(discussion_gid)
+ if gid = args[:discussion_id]
+ discussion = GitlabSchema.find_by_gid(gid)
authorize_discussion!(discussion)
diff --git a/app/graphql/mutations/notes/reposition_image_diff_note.rb b/app/graphql/mutations/notes/reposition_image_diff_note.rb
index ec68f077c84..9c3377b1f96 100644
--- a/app/graphql/mutations/notes/reposition_image_diff_note.rb
+++ b/app/graphql/mutations/notes/reposition_image_diff_note.rb
@@ -26,6 +26,7 @@ module Mutations
def resolve(note:, position:)
authorize!(note)
+ position = position.to_h.compact
pre_update_checks!(note, position)
updated_note = ::Notes::UpdateService.new(
@@ -46,7 +47,7 @@ module Mutations
# just a `DiffNote` with a particular kind of `Gitlab::Diff::Position`.
# In addition to accepting a `DiffNote` Global ID we also need to
# perform this check.
- def pre_update_checks!(note, position)
+ def pre_update_checks!(note, _position)
unless note.position&.on_image?
raise Gitlab::Graphql::Errors::ResourceNotAvailable,
'Resource is not an ImageDiffNote'
diff --git a/app/graphql/mutations/notes/update/image_diff_note.rb b/app/graphql/mutations/notes/update/image_diff_note.rb
index 284c0f1bb20..8e4dbb06d46 100644
--- a/app/graphql/mutations/notes/update/image_diff_note.rb
+++ b/app/graphql/mutations/notes/update/image_diff_note.rb
@@ -54,7 +54,7 @@ module Mutations
original_position = note.position.to_h
- Gitlab::Diff::Position.new(original_position.merge(args[:position]))
+ Gitlab::Diff::Position.new(original_position.merge(args[:position].to_h))
end
end
end
diff --git a/app/graphql/mutations/packages/destroy.rb b/app/graphql/mutations/packages/destroy.rb
index 81fa53fc116..a398b1ff9dc 100644
--- a/app/graphql/mutations/packages/destroy.rb
+++ b/app/graphql/mutations/packages/destroy.rb
@@ -27,9 +27,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Packages::Package].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/packages/destroy_file.rb b/app/graphql/mutations/packages/destroy_file.rb
index 4aa33b3504c..f2a8f2b853a 100644
--- a/app/graphql/mutations/packages/destroy_file.rb
+++ b/app/graphql/mutations/packages/destroy_file.rb
@@ -25,9 +25,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Packages::PackageFile].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/release_asset_links/delete.rb b/app/graphql/mutations/release_asset_links/delete.rb
index d8f0946670b..91fa74859f6 100644
--- a/app/graphql/mutations/release_asset_links/delete.rb
+++ b/app/graphql/mutations/release_asset_links/delete.rb
@@ -29,10 +29,6 @@ module Mutations
end
def find_object(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ReleaseAssetLinkID.coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/release_asset_links/update.rb b/app/graphql/mutations/release_asset_links/update.rb
index 18d92cd82ae..f9368927371 100644
--- a/app/graphql/mutations/release_asset_links/update.rb
+++ b/app/graphql/mutations/release_asset_links/update.rb
@@ -54,10 +54,6 @@ module Mutations
end
def find_object(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ReleaseAssetLinkID.coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/saved_replies/base.rb b/app/graphql/mutations/saved_replies/base.rb
index 59871df687f..4923fcb7851 100644
--- a/app/graphql/mutations/saved_replies/base.rb
+++ b/app/graphql/mutations/saved_replies/base.rb
@@ -24,14 +24,10 @@ module Mutations
end
def feature_enabled?
- Feature.enabled?(:saved_replies, current_user, default_enabled: :yaml)
+ Feature.enabled?(:saved_replies, current_user)
end
def find_object(id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Users::SavedReply].coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/timelogs/delete.rb b/app/graphql/mutations/timelogs/delete.rb
new file mode 100644
index 00000000000..8fd41c27b88
--- /dev/null
+++ b/app/graphql/mutations/timelogs/delete.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Mutations
+ module Timelogs
+ class Delete < Mutations::BaseMutation
+ graphql_name 'TimelogDelete'
+
+ field :timelog,
+ Types::TimelogType,
+ null: true,
+ description: 'Deleted timelog.'
+
+ argument :id,
+ ::Types::GlobalIDType[::Timelog],
+ required: true,
+ description: 'Global ID of the timelog.'
+
+ authorize :admin_timelog
+
+ def resolve(id:)
+ timelog = authorized_find!(id: id)
+ result = ::Timelogs::DeleteService.new(timelog, current_user).execute
+
+ # Return the result payload, not the loaded timelog, so that it returns null in case of unauthorized access
+ { timelog: result.payload, errors: result.errors }
+ end
+
+ def find_object(id:)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/todos/base.rb b/app/graphql/mutations/todos/base.rb
index 4dab3bbc3f4..9a94c5d1e6d 100644
--- a/app/graphql/mutations/todos/base.rb
+++ b/app/graphql/mutations/todos/base.rb
@@ -6,9 +6,6 @@ module Mutations
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Todo].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/todos/create.rb b/app/graphql/mutations/todos/create.rb
index ccc3d0b61e4..489d2f490ff 100644
--- a/app/graphql/mutations/todos/create.rb
+++ b/app/graphql/mutations/todos/create.rb
@@ -17,8 +17,7 @@ module Mutations
description: 'To-do item created.'
def resolve(target_id:)
- id = ::Types::GlobalIDType[Todoable].coerce_isolated_input(target_id)
- target = authorized_find!(id)
+ target = authorized_find!(target_id)
todo = TodoService.new.mark_todo(target, current_user)&.first
errors = errors_on_object(todo) if todo
diff --git a/app/graphql/mutations/todos/mark_all_done.rb b/app/graphql/mutations/todos/mark_all_done.rb
index 67a822c1067..fe4023515a4 100644
--- a/app/graphql/mutations/todos/mark_all_done.rb
+++ b/app/graphql/mutations/todos/mark_all_done.rb
@@ -39,7 +39,7 @@ module Mutations
if args[:target_id].present?
target = Gitlab::Graphql::Lazy.force(
- GitlabSchema.find_by_gid(TodoableID.coerce_isolated_input(args[:target_id]))
+ GitlabSchema.find_by_gid(args[:target_id])
)
raise Gitlab::Graphql::Errors::ResourceNotAvailable, "Resource not available: #{args[:target_id]}" if target.nil?
diff --git a/app/graphql/mutations/todos/restore_many.rb b/app/graphql/mutations/todos/restore_many.rb
index 3453645000b..fe0ad6df65b 100644
--- a/app/graphql/mutations/todos/restore_many.rb
+++ b/app/graphql/mutations/todos/restore_many.rb
@@ -33,9 +33,6 @@ module Mutations
def model_ids_of(ids)
ids.map do |gid|
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- gid = ::Types::GlobalIDType[::Todo].coerce_isolated_input(gid)
gid.model_id.to_i
end.compact
end
diff --git a/app/graphql/mutations/user_preferences/update.rb b/app/graphql/mutations/user_preferences/update.rb
index eface536a87..b71c952b0f2 100644
--- a/app/graphql/mutations/user_preferences/update.rb
+++ b/app/graphql/mutations/user_preferences/update.rb
@@ -38,7 +38,7 @@ module Mutations
def disabled_sort_value?(args)
return false unless [:escalation_status_asc, :escalation_status_desc].include?(args[:issues_sort])
- Feature.disabled?(:incident_escalations, default_enabled: :yaml)
+ Feature.disabled?(:incident_escalations)
end
end
end
diff --git a/app/graphql/mutations/work_items/create.rb b/app/graphql/mutations/work_items/create.rb
index c29dbb899b5..2e136d409ab 100644
--- a/app/graphql/mutations/work_items/create.rb
+++ b/app/graphql/mutations/work_items/create.rb
@@ -53,9 +53,6 @@ module Mutations
private
def global_id_compatibility_params(params)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- params[:work_item_type_id] = ::Types::GlobalIDType[::WorkItems::Type].coerce_isolated_input(params[:work_item_type_id]) if params[:work_item_type_id]
params[:work_item_type_id] = params[:work_item_type_id]&.model_id
params
diff --git a/app/graphql/mutations/work_items/create_from_task.rb b/app/graphql/mutations/work_items/create_from_task.rb
index 278c1bc65a9..4da709401a6 100644
--- a/app/graphql/mutations/work_items/create_from_task.rb
+++ b/app/graphql/mutations/work_items/create_from_task.rb
@@ -55,8 +55,6 @@ module Mutations
private
def find_object(id:)
- # TODO: Remove coercion when working on https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/work_items/delete.rb b/app/graphql/mutations/work_items/delete.rb
index 3d72ebbd95d..1830ab5443c 100644
--- a/app/graphql/mutations/work_items/delete.rb
+++ b/app/graphql/mutations/work_items/delete.rb
@@ -38,8 +38,6 @@ module Mutations
private
def find_object(id:)
- # TODO: Remove coercion when working on https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/mutations/work_items/delete_task.rb b/app/graphql/mutations/work_items/delete_task.rb
new file mode 100644
index 00000000000..87620a28fa1
--- /dev/null
+++ b/app/graphql/mutations/work_items/delete_task.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+module Mutations
+ module WorkItems
+ class DeleteTask < BaseMutation
+ graphql_name 'WorkItemDeleteTask'
+
+ description "Deletes a task in a work item's description." \
+ ' Available only when feature flag `work_items` is enabled. This feature is experimental and' \
+ ' is subject to change without notice.'
+
+ authorize :update_work_item
+
+ argument :id, ::Types::GlobalIDType[::WorkItem],
+ required: true,
+ description: 'Global ID of the work item.'
+ argument :lock_version, GraphQL::Types::Int,
+ required: true,
+ description: 'Current lock version of the work item containing the task in the description.'
+ argument :task_data, ::Types::WorkItems::DeletedTaskInputType,
+ required: true,
+ description: 'Arguments necessary to delete a task from a work item\'s description.',
+ prepare: ->(attributes, _ctx) { attributes.to_h }
+
+ field :work_item, Types::WorkItemType,
+ null: true,
+ description: 'Updated work item.'
+
+ def resolve(id:, lock_version:, task_data:)
+ work_item = authorized_find!(id: id)
+ task_data[:task] = authorized_find_task!(task_data[:id])
+
+ unless work_item.project.work_items_feature_flag_enabled?
+ return { errors: ['`work_items` feature flag disabled for this project'] }
+ end
+
+ result = ::WorkItems::DeleteTaskService.new(
+ work_item: work_item,
+ current_user: current_user,
+ lock_version: lock_version,
+ task_params: task_data
+ ).execute
+
+ response = { errors: result.errors }
+ response[:work_item] = work_item if result.success?
+
+ response
+ end
+
+ private
+
+ def authorized_find_task!(task_id)
+ task = ::Gitlab::Graphql::Lazy.force(GitlabSchema.find_by_gid(task_id))
+
+ if current_user.can?(:delete_work_item, task)
+ task
+ else
+ # Fail early if user cannot delete task
+ raise_resource_not_available_error!
+ end
+ end
+
+ # method used by `authorized_find!(id: id)`
+ def find_object(id:)
+ GitlabSchema.find_by_gid(id)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/work_items/update.rb b/app/graphql/mutations/work_items/update.rb
index 091237d6fa0..20319301482 100644
--- a/app/graphql/mutations/work_items/update.rb
+++ b/app/graphql/mutations/work_items/update.rb
@@ -52,8 +52,6 @@ module Mutations
private
def find_object(id:)
- # TODO: Remove coercion when working on https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/queries/burndown_chart/burnup.iteration.query.graphql b/app/graphql/queries/burndown_chart/burnup.iteration.query.graphql
new file mode 100644
index 00000000000..ff50c34ade3
--- /dev/null
+++ b/app/graphql/queries/burndown_chart/burnup.iteration.query.graphql
@@ -0,0 +1,40 @@
+query BurnupTimesSeriesIterationData(
+ $iterationId: IterationID!
+ $weight: Boolean = false
+ $fullPath: String
+) {
+ iteration(id: $iterationId) {
+ __typename
+ id
+ title
+ report(fullPath: $fullPath) {
+ __typename
+ burnupTimeSeries {
+ __typename
+ date
+ completedCount @skip(if: $weight)
+ scopeCount @skip(if: $weight)
+ completedWeight @include(if: $weight)
+ scopeWeight @include(if: $weight)
+ }
+ stats {
+ __typename
+ total {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ complete {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ incomplete {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ }
+ }
+ }
+}
diff --git a/app/graphql/queries/burndown_chart/burnup.milestone.query.graphql b/app/graphql/queries/burndown_chart/burnup.milestone.query.graphql
new file mode 100644
index 00000000000..18e59249500
--- /dev/null
+++ b/app/graphql/queries/burndown_chart/burnup.milestone.query.graphql
@@ -0,0 +1,36 @@
+query BurnupTimesSeriesMilestoneData($milestoneId: MilestoneID!, $weight: Boolean = false) {
+ milestone(id: $milestoneId) {
+ __typename
+ id
+ title
+ report {
+ __typename
+ burnupTimeSeries {
+ __typename
+ date
+ completedCount @skip(if: $weight)
+ scopeCount @skip(if: $weight)
+ completedWeight @include(if: $weight)
+ scopeWeight @include(if: $weight)
+ }
+ stats {
+ __typename
+ total {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ complete {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ incomplete {
+ __typename
+ count @skip(if: $weight)
+ weight @include(if: $weight)
+ }
+ }
+ }
+ }
+}
diff --git a/app/graphql/queries/burndown_chart/burnup.query.graphql b/app/graphql/queries/burndown_chart/burnup.query.graphql
deleted file mode 100644
index 0795645f8b7..00000000000
--- a/app/graphql/queries/burndown_chart/burnup.query.graphql
+++ /dev/null
@@ -1,75 +0,0 @@
-query BurnupTimesSeriesData(
- $id: ID!
- $isIteration: Boolean = false
- $weight: Boolean = false
- $fullPath: String
-) {
- milestone(id: $id) @skip(if: $isIteration) {
- __typename
- id
- title
- report {
- __typename
- burnupTimeSeries {
- __typename
- date
- completedCount @skip(if: $weight)
- scopeCount @skip(if: $weight)
- completedWeight @include(if: $weight)
- scopeWeight @include(if: $weight)
- }
- stats {
- __typename
- total {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- complete {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- incomplete {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- }
- }
- }
- iteration(id: $id) @include(if: $isIteration) {
- __typename
- id
- title
- report(fullPath: $fullPath) {
- __typename
- burnupTimeSeries {
- __typename
- date
- completedCount @skip(if: $weight)
- scopeCount @skip(if: $weight)
- completedWeight @include(if: $weight)
- scopeWeight @include(if: $weight)
- }
- stats {
- __typename
- total {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- complete {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- incomplete {
- __typename
- count @skip(if: $weight)
- weight @include(if: $weight)
- }
- }
- }
- }
-}
diff --git a/app/graphql/queries/design_management/get_design_list.query.graphql b/app/graphql/queries/design_management/get_design_list.query.graphql
index f0caa7c5b4c..c2100b5fa04 100644
--- a/app/graphql/queries/design_management/get_design_list.query.graphql
+++ b/app/graphql/queries/design_management/get_design_list.query.graphql
@@ -1,4 +1,4 @@
-query getDesignList($fullPath: ID!, $iid: String!, $atVersion: ID) {
+query getDesignList($fullPath: ID!, $iid: String!, $atVersion: DesignManagementVersionID) {
project(fullPath: $fullPath) {
__typename
id
diff --git a/app/graphql/queries/pipelines/get_pipeline_details.query.graphql b/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
index f4921706f7e..c8353c738a5 100644
--- a/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
+++ b/app/graphql/queries/pipelines/get_pipeline_details.query.graphql
@@ -18,6 +18,11 @@ fragment LinkedPipelineData on Pipeline {
id
iid
path
+ cancelable
+ retryable
+ userPermissions {
+ updatePipeline
+ }
status: detailedStatus {
__typename
id
@@ -97,6 +102,7 @@ query getPipelineDetails($projectPath: ID!, $iid: ID!) {
__typename
id
name
+ kind
scheduledAt
needs {
__typename
diff --git a/app/graphql/queries/snippet/snippet_blob_content.query.graphql b/app/graphql/queries/snippet/snippet_blob_content.query.graphql
index 4459a5e4316..0ac7d4d23a0 100644
--- a/app/graphql/queries/snippet/snippet_blob_content.query.graphql
+++ b/app/graphql/queries/snippet/snippet_blob_content.query.graphql
@@ -1,4 +1,4 @@
-query SnippetBlobContent($ids: [ID!], $rich: Boolean!, $paths: [String!]) {
+query SnippetBlobContent($ids: [SnippetID!], $rich: Boolean!, $paths: [String!]) {
snippets(ids: $ids) {
__typename
nodes {
diff --git a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
index abc54614a59..225e20bab83 100644
--- a/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
+++ b/app/graphql/resolvers/alert_management/http_integrations_resolver.rb
@@ -26,8 +26,7 @@ module Resolvers
private
def integrations_by(gid:)
- id = Types::GlobalIDType[::AlertManagement::HttpIntegration].coerce_isolated_input(gid)
- object = GitlabSchema.find_by_gid(id)
+ object = GitlabSchema.find_by_gid(gid)
defer { object }.then do |integration|
ret = integration if project == integration&.project
diff --git a/app/graphql/resolvers/base_issues_resolver.rb b/app/graphql/resolvers/base_issues_resolver.rb
index 4cae7866a49..a1fda976876 100644
--- a/app/graphql/resolvers/base_issues_resolver.rb
+++ b/app/graphql/resolvers/base_issues_resolver.rb
@@ -35,7 +35,7 @@ module Resolvers
def prepare_params(args, parent)
return unless [:escalation_status_asc, :escalation_status_desc].include?(args[:sort])
- return if Feature.enabled?(:incident_escalations, parent, default_enabled: :yaml)
+ return if Feature.enabled?(:incident_escalations, parent)
args[:sort] = :created_desc # default for sort argument
end
diff --git a/app/graphql/resolvers/base_resolver.rb b/app/graphql/resolvers/base_resolver.rb
index dbded8f60a0..2b54a3fdd55 100644
--- a/app/graphql/resolvers/base_resolver.rb
+++ b/app/graphql/resolvers/base_resolver.rb
@@ -4,7 +4,6 @@ module Resolvers
class BaseResolver < GraphQL::Schema::Resolver
extend ::Gitlab::Utils::Override
include ::Gitlab::Utils::StrongMemoize
- include ::Gitlab::Graphql::GlobalIDCompatibility
argument_class ::Types::BaseArgument
diff --git a/app/graphql/resolvers/boards_resolver.rb b/app/graphql/resolvers/boards_resolver.rb
index 679f2b4cceb..91cd15f615d 100644
--- a/app/graphql/resolvers/boards_resolver.rb
+++ b/app/graphql/resolvers/boards_resolver.rb
@@ -26,9 +26,6 @@ module Resolvers
def extract_board_id(id)
return unless id.present?
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = Types::GlobalIDType[Board].coerce_isolated_input(id)
id.model_id
end
end
diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb
index f9d60650443..6f861012d83 100644
--- a/app/graphql/resolvers/ci/config_resolver.rb
+++ b/app/graphql/resolvers/ci/config_resolver.rb
@@ -37,7 +37,7 @@ module Resolvers
.new(project: project, current_user: context[:current_user], sha: sha)
.validate(content, dry_run: dry_run)
- response(result).merge(merged_yaml: result.merged_yaml)
+ response(result)
rescue GRPC::InvalidArgument => error
Gitlab::ErrorTracking.track_and_raise_exception(error, sha: sha)
end
@@ -45,20 +45,14 @@ module Resolvers
private
def response(result)
- if result.errors.empty?
- {
- status: :valid,
- errors: [],
- warnings: result.warnings,
- stages: make_stages(result.jobs)
- }
- else
- {
- status: :invalid,
- warnings: result.warnings,
- errors: result.errors
- }
- end
+ {
+ status: result.status,
+ errors: result.errors,
+ warnings: result.warnings,
+ stages: make_stages(result),
+ merged_yaml: result.merged_yaml,
+ includes: result.includes
+ }
end
def make_jobs(config_jobs)
@@ -90,8 +84,10 @@ module Resolvers
end
end
- def make_stages(jobs)
- make_groups(jobs)
+ def make_stages(result)
+ return [] unless result.valid?
+
+ make_groups(result.jobs)
.group_by { |group| group[:stage] }
.map { |name, groups| { name: name, groups: groups } }
end
diff --git a/app/graphql/resolvers/ci/runner_status_resolver.rb b/app/graphql/resolvers/ci/runner_status_resolver.rb
index d916a8a13f0..447ab306ba7 100644
--- a/app/graphql/resolvers/ci/runner_status_resolver.rb
+++ b/app/graphql/resolvers/ci/runner_status_resolver.rb
@@ -3,7 +3,8 @@
module Resolvers
module Ci
# NOTE: This class was introduced to allow modifying the meaning of certain values in RunnerStatusEnum
- # while preserving backward compatibility. It can be removed in 15.0 once the API has stabilized.
+ # while preserving backward compatibility. It can be removed in 17.0 after being deprecated
+ # and made a no-op in %16.0 (legacy_mode will be hard-coded to nil).
class RunnerStatusResolver < BaseResolver
type Types::Ci::RunnerStatusEnum, null: false
@@ -14,7 +15,11 @@ module Resolvers
default_value: '14.5',
required: false,
description: 'Compatibility mode. A null value turns off compatibility mode.',
- deprecated: { reason: 'Will be removed in 15.0. From that release onward, the field will behave as if legacyMode is null', milestone: '14.6' }
+ deprecated: {
+ reason: 'Will be removed in 17.0. In GitLab 16.0 and later, ' \
+ 'the field will act as if `legacyMode` is null',
+ milestone: '15.0'
+ }
def resolve(legacy_mode:, **args)
runner.status(legacy_mode)
diff --git a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
index 432d6f48607..de44dbb26d7 100644
--- a/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
+++ b/app/graphql/resolvers/concerns/issue_resolver_arguments.rb
@@ -68,6 +68,12 @@ module IssueResolverArguments
description: 'Negated arguments.',
prepare: ->(negated_args, ctx) { negated_args.to_h },
required: false
+ argument :crm_contact_id, GraphQL::Types::String,
+ required: false,
+ description: 'ID of a contact assigned to the issues.'
+ argument :crm_organization_id, GraphQL::Types::String,
+ required: false,
+ description: 'ID of an organization assigned to the issues.'
end
def resolve_with_lookahead(**args)
diff --git a/app/graphql/resolvers/concerns/resolves_ids.rb b/app/graphql/resolvers/concerns/resolves_ids.rb
index 8bf2a6b2ac9..3e248c40562 100644
--- a/app/graphql/resolvers/concerns/resolves_ids.rb
+++ b/app/graphql/resolvers/concerns/resolves_ids.rb
@@ -3,13 +3,10 @@
module ResolvesIds
extend ActiveSupport::Concern
- def resolve_ids(ids, type)
+ def resolve_ids(ids)
Array.wrap(ids).map do |id|
next unless id.present?
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = type.coerce_isolated_input(id)
id.model_id
end.compact
end
diff --git a/app/graphql/resolvers/concerns/resolves_snippets.rb b/app/graphql/resolvers/concerns/resolves_snippets.rb
index 46d78a6a8c8..8274b5cc49f 100644
--- a/app/graphql/resolvers/concerns/resolves_snippets.rb
+++ b/app/graphql/resolvers/concerns/resolves_snippets.rb
@@ -28,7 +28,7 @@ module ResolvesSnippets
def snippet_finder_params(args)
{
- ids: resolve_ids(args[:ids], ::Types::GlobalIDType[::Snippet]),
+ ids: resolve_ids(args[:ids]),
scope: args[:visibility]
}.merge(options_by_type(args[:type]))
end
diff --git a/app/graphql/resolvers/concerns/time_frame_arguments.rb b/app/graphql/resolvers/concerns/time_frame_arguments.rb
index 0ec3c642f29..87b7a96045c 100644
--- a/app/graphql/resolvers/concerns/time_frame_arguments.rb
+++ b/app/graphql/resolvers/concerns/time_frame_arguments.rb
@@ -24,10 +24,13 @@ module TimeFrameArguments
# TODO: remove when the start_date and end_date arguments are removed
def validate_timeframe_params!(args)
return unless %i[start_date end_date timeframe].any? { |k| args[k].present? }
- return if args[:timeframe] && %i[start_date end_date].all? { |k| args[k].nil? }
+
+ # the timeframe is passed in as a TimeframeInputType
+ timeframe = args[:timeframe].to_h if args[:timeframe]
+ return if timeframe && %i[start_date end_date].all? { |k| args[k].nil? }
error_message =
- if args[:timeframe].present?
+ if timeframe.present?
"startDate and endDate are deprecated in favor of timeframe. Please use only timeframe."
elsif args[:start_date].nil? || args[:end_date].nil?
"Both startDate and endDate must be present."
@@ -42,7 +45,7 @@ module TimeFrameArguments
def transform_timeframe_parameters(args)
if args[:timeframe]
- args[:timeframe].transform_keys { |k| :"#{k}_date" }
+ args[:timeframe].to_h.transform_keys { |k| :"#{k}_date" }
else
args.slice(:start_date, :end_date)
end
diff --git a/app/graphql/resolvers/design_management/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/design_at_version_resolver.rb
index c87670bc24c..5ba23b5d1ed 100644
--- a/app/graphql/resolvers/design_management/design_at_version_resolver.rb
+++ b/app/graphql/resolvers/design_management/design_at_version_resolver.rb
@@ -18,9 +18,6 @@ module Resolvers
end
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::DesignManagement::DesignAtVersion].coerce_isolated_input(id)
dav = GitlabSchema.find_by_gid(id)
return unless consistent?(dav)
diff --git a/app/graphql/resolvers/design_management/design_resolver.rb b/app/graphql/resolvers/design_management/design_resolver.rb
index d9e5203ef0e..eaa11d2fd9d 100644
--- a/app/graphql/resolvers/design_management/design_resolver.rb
+++ b/app/graphql/resolvers/design_management/design_resolver.rb
@@ -54,10 +54,6 @@ module Resolvers
end
def parse_gid(gid)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- gid = ::Types::GlobalIDType[::DesignManagement::Design].coerce_isolated_input(gid)
-
gid.model_id
end
end
diff --git a/app/graphql/resolvers/design_management/designs_resolver.rb b/app/graphql/resolvers/design_management/designs_resolver.rb
index a62ef6d76e5..429bbba74a5 100644
--- a/app/graphql/resolvers/design_management/designs_resolver.rb
+++ b/app/graphql/resolvers/design_management/designs_resolver.rb
@@ -24,13 +24,17 @@ module Resolvers
end
def resolve(ids: nil, filenames: nil, at_version: nil)
- ::DesignManagement::DesignsFinder.new(
- issue,
- current_user,
- ids: design_ids(ids),
- filenames: filenames,
- visible_at_version: version(at_version)
- ).execute
+ context.scoped_set!(:at_version_argument, at_version) if at_version
+
+ ::Gitlab::Graphql::Lazy.with_value(version(at_version)) do |visible_at|
+ ::DesignManagement::DesignsFinder.new(
+ issue,
+ current_user,
+ ids: design_ids(ids),
+ filenames: filenames,
+ visible_at_version: visible_at
+ ).execute
+ end
end
private
@@ -38,19 +42,12 @@ module Resolvers
def version(at_version)
return unless at_version
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- at_version = VersionID.coerce_isolated_input(at_version)
- # TODO: when we get promises use this to make resolve lazy
- Gitlab::Graphql::Lazy.force(GitlabSchema.find_by_gid(at_version))
+ GitlabSchema.find_by_gid(at_version)
end
def design_ids(gids)
return if gids.nil?
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- gids = gids.map { |id| DesignID.coerce_isolated_input(id) }
gids.map(&:model_id)
end
diff --git a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb
index 76e365c40b1..30d2865ae85 100644
--- a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb
+++ b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb
@@ -34,11 +34,6 @@ module Resolvers
def resolve(design_id: nil, filename: nil, design_at_version_id: nil)
validate_arguments(design_id, filename, design_at_version_id)
- # TODO: remove this when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- design_id &&= DesignID.coerce_isolated_input(design_id)
- design_at_version_id &&= DesignAtVersionID.coerce_isolated_input(design_at_version_id)
-
return unless Ability.allowed?(current_user, :read_design, issue)
return specific_design_at_version(design_at_version_id) if design_at_version_id
diff --git a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
index 97cc7554ba8..9f98762b519 100644
--- a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
+++ b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb
@@ -41,9 +41,6 @@ module Resolvers
def design_ids(gids)
return if gids.nil?
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- gids = gids.map { |id| DesignID.coerce_isolated_input(id) }
gids.map(&:model_id)
end
diff --git a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
index 2682ce6b3b1..f29cd30c36f 100644
--- a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
+++ b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb
@@ -24,10 +24,6 @@ module Resolvers
description: "SHA256 of a specific version."
def resolve(version_id: nil, sha: nil)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- version_id &&= VersionID.coerce_isolated_input(version_id)
-
check_args(version_id, sha)
::DesignManagement::VersionsFinder
diff --git a/app/graphql/resolvers/design_management/version_resolver.rb b/app/graphql/resolvers/design_management/version_resolver.rb
index a6403fbd69f..7895981d67c 100644
--- a/app/graphql/resolvers/design_management/version_resolver.rb
+++ b/app/graphql/resolvers/design_management/version_resolver.rb
@@ -18,10 +18,6 @@ module Resolvers
end
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::DesignManagement::Version].coerce_isolated_input(id)
-
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/resolvers/design_management/versions_resolver.rb b/app/graphql/resolvers/design_management/versions_resolver.rb
index 23ba3c86d98..de636655087 100644
--- a/app/graphql/resolvers/design_management/versions_resolver.rb
+++ b/app/graphql/resolvers/design_management/versions_resolver.rb
@@ -9,8 +9,6 @@ module Resolvers
VersionID = ::Types::GlobalIDType[::DesignManagement::Version]
- extras [:parent]
-
argument :earlier_or_equal_to_sha, GraphQL::Types::String,
as: :sha,
required: false,
@@ -26,11 +24,8 @@ module Resolvers
::Resolvers::DesignManagement::VersionInCollectionResolver
end
- def resolve(parent: nil, id: nil, sha: nil)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id &&= VersionID.coerce_isolated_input(id)
- version = cutoff(parent, id, sha)
+ def resolve(id: nil, sha: nil)
+ version = cutoff(id, sha)
raise ::Gitlab::Graphql::Errors::ResourceNotAvailable, 'cutoff not found' unless version.present?
@@ -44,11 +39,11 @@ module Resolvers
private
# Find the most recent version that the client will accept
- def cutoff(parent, id, sha)
+ def cutoff(id, sha)
if sha.present? || id.present?
specific_version(id, sha)
- elsif at_version = at_version_arg(parent)
- by_id(at_version)
+ elsif at_version = context[:at_version_argument]
+ by_id(at_version) # See: DesignsResolver
else
:unconstrained
end
@@ -68,20 +63,6 @@ module Resolvers
def by_id(gid)
::Gitlab::Graphql::Lazy.force(GitlabSchema.find_by_gid(gid))
end
-
- # Find an `at_version` argument passed to a parent node.
- #
- # If one is found, then a design collection further up the AST
- # has been filtered to reflect designs at that version, and so
- # for consistency we should only present versions up to the given
- # version here.
- def at_version_arg(parent)
- # TODO: remove coercion when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- version_id = ::Gitlab::Graphql::FindArgumentInParent.find(parent, :at_version, limit_depth: 4)
- version_id &&= VersionID.coerce_isolated_input(version_id)
- version_id
- end
end
end
end
diff --git a/app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb b/app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb
index 7032af46221..27bba6c8144 100644
--- a/app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb
+++ b/app/graphql/resolvers/error_tracking/sentry_detailed_error_resolver.rb
@@ -10,10 +10,6 @@ module Resolvers
description: 'ID of the Sentry issue.'
def resolve(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Gitlab::ErrorTracking::DetailedError].coerce_isolated_input(id)
-
# Get data from Sentry
response = ::ErrorTracking::IssueDetailsService.new(
project,
diff --git a/app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb b/app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb
index 8876f8badcd..3867634dd8b 100644
--- a/app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb
+++ b/app/graphql/resolvers/error_tracking/sentry_error_stack_trace_resolver.rb
@@ -10,10 +10,6 @@ module Resolvers
description: 'ID of the Sentry issue.'
def resolve(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Gitlab::ErrorTracking::DetailedError].coerce_isolated_input(id)
-
# Get data from Sentry
response = ::ErrorTracking::IssueLatestEventService.new(
project,
diff --git a/app/graphql/resolvers/group_members_resolver.rb b/app/graphql/resolvers/group_members_resolver.rb
index d3662b08cdf..f787f12e82a 100644
--- a/app/graphql/resolvers/group_members_resolver.rb
+++ b/app/graphql/resolvers/group_members_resolver.rb
@@ -11,6 +11,10 @@ module Resolvers
required: false,
default_value: GroupMembersFinder::DEFAULT_RELATIONS
+ argument :access_levels, [Types::AccessLevelEnum],
+ description: 'Filter members by the given access levels.',
+ required: false
+
private
def finder_class
diff --git a/app/graphql/resolvers/group_packages_resolver.rb b/app/graphql/resolvers/group_packages_resolver.rb
index d91fe84317d..b48e0b75190 100644
--- a/app/graphql/resolvers/group_packages_resolver.rb
+++ b/app/graphql/resolvers/group_packages_resolver.rb
@@ -26,7 +26,10 @@ module Resolvers
def resolve(sort:, **filters)
return unless packages_available?
- ::Packages::GroupPackagesFinder.new(current_user, object, filters.merge(GROUP_SORT_TO_PARAMS_MAP.fetch(sort))).execute
+ params = filters.merge(GROUP_SORT_TO_PARAMS_MAP.fetch(sort))
+ params[:preload_pipelines] = false
+
+ ::Packages::GroupPackagesFinder.new(current_user, object, params).execute
end
end
end
diff --git a/app/graphql/resolvers/incident_management/timeline_events_resolver.rb b/app/graphql/resolvers/incident_management/timeline_events_resolver.rb
new file mode 100644
index 00000000000..b9978259e6b
--- /dev/null
+++ b/app/graphql/resolvers/incident_management/timeline_events_resolver.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Resolvers
+ module IncidentManagement
+ class TimelineEventsResolver < BaseResolver
+ include LooksAhead
+
+ alias_method :project, :object
+
+ type ::Types::IncidentManagement::TimelineEventType.connection_type, null: true
+
+ argument :incident_id,
+ ::Types::GlobalIDType[::Issue],
+ required: true,
+ description: 'ID of the incident.'
+
+ when_single do
+ argument :id,
+ ::Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ required: true,
+ description: 'ID of the timeline event.',
+ prepare: ->(id, ctx) { id.model_id }
+ end
+
+ def resolve(**args)
+ incident = args[:incident_id].find
+
+ apply_lookahead(::IncidentManagement::TimelineEventsFinder.new(current_user, incident, args).execute)
+ end
+ end
+ end
+end
diff --git a/app/graphql/resolvers/package_details_resolver.rb b/app/graphql/resolvers/package_details_resolver.rb
index 42cb23e701d..705d3900cd2 100644
--- a/app/graphql/resolvers/package_details_resolver.rb
+++ b/app/graphql/resolvers/package_details_resolver.rb
@@ -17,9 +17,6 @@ module Resolvers
end
def resolve(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Packages::Package].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/resolvers/package_pipelines_resolver.rb b/app/graphql/resolvers/package_pipelines_resolver.rb
index 59a1cd173a4..9ff77f02547 100644
--- a/app/graphql/resolvers/package_pipelines_resolver.rb
+++ b/app/graphql/resolvers/package_pipelines_resolver.rb
@@ -12,21 +12,33 @@ module Resolvers
alias_method :package, :object
- def resolve(first: nil, last: nil, after: nil, before: nil, lookahead:)
- finder = ::Packages::BuildInfosFinder.new(
- package,
- first: first,
- last: last,
- after: decode_cursor(after),
- before: decode_cursor(before),
- max_page_size: context.schema.default_max_page_size,
- support_next_page: lookahead.selects?(:page_info)
- )
+ # this resolver can be called for 100 packages max and we want to limit the
+ # number of build infos returned for _each_ package when using the new finder.
+ MAX_PAGE_SIZE = 20
- build_infos = finder.execute
+ # This returns a promise for a connection of promises for pipelines:
+ # Lazy[Connection[Lazy[Pipeline]]] structure
+ def resolve(first: nil, last: nil, after: nil, before: nil, lookahead:)
+ default_value = default_value_for(first: first, last: last, after: after, before: before)
+ BatchLoader::GraphQL.for(package.id)
+ .batch(default_value: default_value) do |package_ids, loader|
+ build_infos = ::Packages::BuildInfosFinder.new(
+ package_ids,
+ first: first,
+ last: last,
+ after: decode_cursor(after),
+ before: decode_cursor(before),
+ max_page_size: MAX_PAGE_SIZE,
+ support_next_page: lookahead.selects?(:page_info)
+ ).execute
- # this .pluck_pipeline_ids can load max 101 pipelines ids
- ::Ci::Pipeline.id_in(build_infos.pluck_pipeline_ids)
+ build_infos.each do |build_info|
+ loader.call(build_info.package_id) do |connection|
+ connection.items << lazy_load_pipeline(build_info.pipeline_id)
+ connection
+ end
+ end
+ end
end
# we manage the pagination manually, so opt out of the connection field extension
@@ -39,6 +51,22 @@ module Resolvers
private
+ def lazy_load_pipeline(id)
+ ::Gitlab::Graphql::Loaders::BatchModelLoader.new(::Ci::Pipeline, id)
+ .find
+ end
+
+ def default_value_for(first:, last:, after:, before:)
+ Gitlab::Graphql::Pagination::ActiveRecordArrayConnection.new(
+ [],
+ first: first,
+ last: last,
+ after: after,
+ before: before,
+ max_page_size: MAX_PAGE_SIZE
+ )
+ end
+
def decode_cursor(encoded)
return unless encoded
diff --git a/app/graphql/resolvers/project_packages_resolver.rb b/app/graphql/resolvers/project_packages_resolver.rb
index 6d66c2fe460..284d3c594da 100644
--- a/app/graphql/resolvers/project_packages_resolver.rb
+++ b/app/graphql/resolvers/project_packages_resolver.rb
@@ -8,7 +8,10 @@ module Resolvers
def resolve(sort:, **filters)
return unless packages_available?
- ::Packages::PackagesFinder.new(object, filters.merge(SORT_TO_PARAMS_MAP.fetch(sort))).execute
+ params = filters.merge(SORT_TO_PARAMS_MAP.fetch(sort))
+ params[:preload_pipelines] = false
+
+ ::Packages::PackagesFinder.new(object, params).execute
end
end
end
diff --git a/app/graphql/resolvers/project_pipeline_resolver.rb b/app/graphql/resolvers/project_pipeline_resolver.rb
index ea733ab08ad..69327cd17b1 100644
--- a/app/graphql/resolvers/project_pipeline_resolver.rb
+++ b/app/graphql/resolvers/project_pipeline_resolver.rb
@@ -47,5 +47,10 @@ module Resolvers
{ statuses: [:needs] }
]
end
+
+ def self.resolver_complexity(args, child_complexity:)
+ complexity = super
+ complexity - 10
+ end
end
end
diff --git a/app/graphql/resolvers/snippets_resolver.rb b/app/graphql/resolvers/snippets_resolver.rb
index 149bd8fa1ce..90f5f2cb534 100644
--- a/app/graphql/resolvers/snippets_resolver.rb
+++ b/app/graphql/resolvers/snippets_resolver.rb
@@ -38,11 +38,9 @@ module Resolvers
private
def snippet_finder_params(args)
- # TODO: remove the type arguments when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
super
- .merge(author: resolve_ids(args[:author_id], ::Types::GlobalIDType[::User]),
- project: resolve_ids(args[:project_id], ::Types::GlobalIDType[::Project]),
+ .merge(author: resolve_ids(args[:author_id]),
+ project: resolve_ids(args[:project_id]),
explore: args[:explore])
end
end
diff --git a/app/graphql/resolvers/timelog_resolver.rb b/app/graphql/resolvers/timelog_resolver.rb
index 14831a29d90..52c4508003a 100644
--- a/app/graphql/resolvers/timelog_resolver.rb
+++ b/app/graphql/resolvers/timelog_resolver.rb
@@ -3,7 +3,6 @@
module Resolvers
class TimelogResolver < BaseResolver
include LooksAhead
- include ResolvesIds
type ::Types::TimelogType.connection_type, null: false
@@ -100,14 +99,13 @@ module Resolvers
def apply_project_filter(timelogs, args)
return timelogs unless args[:project_id]
- project = resolve_ids(args[:project_id], ::Types::GlobalIDType[::Project])
- timelogs.in_project(project)
+ timelogs.in_project(args[:project_id].model_id)
end
def apply_group_filter(timelogs, args)
return timelogs unless args[:group_id]
- group = Group.find_by_id(resolve_ids(args[:group_id], ::Types::GlobalIDType[::Group]))
+ group = Group.find_by_id(args[:group_id].model_id)
timelogs.in_group(group)
end
diff --git a/app/graphql/resolvers/user_merge_requests_resolver_base.rb b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
index e0201e45664..b2d85307c49 100644
--- a/app/graphql/resolvers/user_merge_requests_resolver_base.rb
+++ b/app/graphql/resolvers/user_merge_requests_resolver_base.rb
@@ -57,9 +57,6 @@ module Resolvers
end
def load_project(project_path, project_id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- project_id &&= ::Types::GlobalIDType[::Project].coerce_isolated_input(project_id)
@project = ::Gitlab::Graphql::Lazy.force(resolve_project(full_path: project_path, project_id: project_id))
end
diff --git a/app/graphql/resolvers/work_item_resolver.rb b/app/graphql/resolvers/work_item_resolver.rb
index ad510849f31..9eb7d6bc693 100644
--- a/app/graphql/resolvers/work_item_resolver.rb
+++ b/app/graphql/resolvers/work_item_resolver.rb
@@ -20,9 +20,6 @@ module Resolvers
private
def find_object(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
end
diff --git a/app/graphql/subscriptions/issuable_updated.rb b/app/graphql/subscriptions/issuable_updated.rb
index c1d82bfcf9c..ad78fd4b4a1 100644
--- a/app/graphql/subscriptions/issuable_updated.rb
+++ b/app/graphql/subscriptions/issuable_updated.rb
@@ -15,10 +15,6 @@ module Subscriptions
end
def authorized?(issuable_id:)
- # TODO: remove this check when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- raise Gitlab::Graphql::Errors::ArgumentError, 'Invalid IssuableID' unless issuable_id.is_a?(GlobalID)
-
issuable = force(GitlabSchema.find_by_gid(issuable_id))
unauthorized! unless issuable && Ability.allowed?(current_user, :"read_#{issuable.to_ability_name}", issuable)
diff --git a/app/graphql/types/alert_management/domain_filter_enum.rb b/app/graphql/types/alert_management/domain_filter_enum.rb
index 3ee01e4c391..cd70cdd8ecf 100644
--- a/app/graphql/types/alert_management/domain_filter_enum.rb
+++ b/app/graphql/types/alert_management/domain_filter_enum.rb
@@ -7,7 +7,11 @@ module Types
description 'Filters the alerts based on given domain'
value 'operations', description: 'Alerts for operations domain.'
- value 'threat_monitoring', description: 'Alerts for threat monitoring domain.'
+ value 'threat_monitoring', description: 'Alerts for threat monitoring domain.',
+ deprecated: {
+ reason: 'Network policies are deprecated and will be removed in GitLab 16.0',
+ milestone: '15.0'
+ }
end
end
end
diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb
index 75909592c6c..b4cd54b1332 100644
--- a/app/graphql/types/base_field.rb
+++ b/app/graphql/types/base_field.rb
@@ -68,7 +68,7 @@ module Types
end
def visible?(context)
- return false if feature_flag.present? && !Feature.enabled?(feature_flag, default_enabled: :yaml)
+ return false if feature_flag.present? && !Feature.enabled?(feature_flag)
super
end
diff --git a/app/graphql/types/boards/board_issue_input_type.rb b/app/graphql/types/boards/board_issue_input_type.rb
index afa66c1c510..0dd7fbc87da 100644
--- a/app/graphql/types/boards/board_issue_input_type.rb
+++ b/app/graphql/types/boards/board_issue_input_type.rb
@@ -7,7 +7,6 @@ module Types
argument :not, NegatedBoardIssueInputType,
required: false,
- prepare: ->(negated_args, ctx) { negated_args.to_h },
description: 'List of negated arguments.'
argument :search, GraphQL::Types::String,
diff --git a/app/graphql/types/ci/config/config_type.rb b/app/graphql/types/ci/config/config_type.rb
index de355c8eacf..a7a6927136d 100644
--- a/app/graphql/types/ci/config/config_type.rb
+++ b/app/graphql/types/ci/config/config_type.rb
@@ -9,6 +9,8 @@ module Types
field :errors, [GraphQL::Types::String], null: true,
description: 'Linting errors.'
+ field :includes, [Types::Ci::Config::IncludeType], null: true,
+ description: 'List of included files.'
field :merged_yaml, GraphQL::Types::String, null: true,
description: 'Merged CI configuration YAML.'
field :stages, Types::Ci::Config::StageType.connection_type, null: true,
diff --git a/app/graphql/types/ci/config/include_type.rb b/app/graphql/types/ci/config/include_type.rb
new file mode 100644
index 00000000000..71eb8f755ab
--- /dev/null
+++ b/app/graphql/types/ci/config/include_type.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ # rubocop: disable Graphql/AuthorizeTypes
+ module Config
+ class IncludeType < BaseObject
+ graphql_name 'CiConfigInclude'
+
+ field :type,
+ Types::Ci::Config::IncludeTypeEnum,
+ null: true,
+ description: 'Include type.'
+
+ field :location,
+ GraphQL::Types::String,
+ null: true,
+ description: 'File location. It can be masked if it contains masked variables, e.g., ' \
+ '".gitlab/ci/build-images.gitlab-ci.yml".'
+
+ field :blob,
+ GraphQL::Types::String,
+ null: true,
+ description: 'File blob location. It can be masked if it contains masked variables, e.g., ' \
+ '"https://gitlab.com/gitlab-org/gitlab/-/blob/e52d6d0246d7375291850e61f0abc101fbda9dc2' \
+ '/.gitlab/ci/build-images.gitlab-ci.yml".'
+
+ field :raw,
+ GraphQL::Types::String,
+ null: true,
+ description: 'File raw location. It can be masked if it contains masked variables, e.g., ' \
+ '"https://gitlab.com/gitlab-org/gitlab/-/raw/e52d6d0246d7375291850e61f0abc101fbda9dc2' \
+ '/.gitlab/ci/build-images.gitlab-ci.yml".'
+
+ field :extra, # rubocop:disable Graphql/JSONType
+ GraphQL::Types::JSON,
+ null: true,
+ description: 'Extra information for the `include`, which can contain `job_name`, `project`, and `ref`. ' \
+ 'Values can be masked if they contain masked variables.'
+
+ field :context_project,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Current project scope, e.g., "gitlab-org/gitlab".'
+
+ field :context_sha,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Current sha scope.'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/ci/config/include_type_enum.rb b/app/graphql/types/ci/config/include_type_enum.rb
new file mode 100644
index 00000000000..328824ae996
--- /dev/null
+++ b/app/graphql/types/ci/config/include_type_enum.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Types
+ module Ci
+ module Config
+ class IncludeTypeEnum < BaseEnum
+ graphql_name 'CiConfigIncludeType'
+ description 'Include type.'
+
+ value 'remote', description: 'Remote include.', value: :remote
+ value 'local', description: 'Local include.', value: :local
+ value 'file', description: 'Project file include.', value: :file
+ value 'template', description: 'Template include.', value: :template
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb
index 537b8e42ad1..81afc7f0f42 100644
--- a/app/graphql/types/ci/pipeline_type.rb
+++ b/app/graphql/types/ci/pipeline_type.rb
@@ -195,7 +195,6 @@ module Types
raise ::Gitlab::Graphql::Errors::ArgumentError, 'One of id or name is required' unless id || name
if id
- id = ::Types::GlobalIDType[::CommitStatus].coerce_isolated_input(id) if id
pipeline.statuses.id_in(id.model_id)
else
pipeline.statuses.by_name(name)
diff --git a/app/graphql/types/ci/runner_status_enum.rb b/app/graphql/types/ci/runner_status_enum.rb
index 2e65e2d4e1e..e8bd3d15a54 100644
--- a/app/graphql/types/ci/runner_status_enum.rb
+++ b/app/graphql/types/ci/runner_status_enum.rb
@@ -28,21 +28,17 @@ module Types
value: :online
value 'OFFLINE',
- description: "Runner that has not contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}.",
- deprecated: { reason: 'This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period offline', milestone: '14.6' },
+ description: "Runner that has not contacted this instance within the " \
+ "last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}. Will be considered `STALE` if offline for " \
+ "more than #{::Ci::Runner::STALE_TIMEOUT.inspect}.",
value: :offline
value 'STALE',
- description: "Runner that has not contacted this instance within the last #{::Ci::Runner::STALE_TIMEOUT.inspect}. Only available if legacyMode is null. Will be a possible return value starting in 15.0.",
+ description: "Runner that has not contacted this instance within the last #{::Ci::Runner::STALE_TIMEOUT.inspect}.",
value: :stale
- value 'NOT_CONNECTED',
- description: 'Runner that has never contacted this instance.',
- deprecated: { reason: "Use NEVER_CONTACTED instead. NEVER_CONTACTED will have a slightly different scope starting in 15.0, with STALE being returned instead after #{::Ci::Runner::STALE_TIMEOUT.inspect} of no contact", milestone: '14.6' },
- value: :not_connected
-
value 'NEVER_CONTACTED',
- description: 'Runner that has never contacted this instance. Set legacyMode to null to utilize this value. Will replace NOT_CONNECTED starting in 15.0.',
+ description: 'Runner that has never contacted this instance.',
value: :never_contacted
end
end
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index a7f0730f07e..6f957d2511f 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -34,8 +34,15 @@ module Types
description: 'Admin form URL of the runner. Only available for administrators.'
field :executor_name, GraphQL::Types::String, null: true,
description: 'Executor last advertised by the runner.',
- method: :executor_name,
- feature_flag: :graphql_ci_runner_executor
+ method: :executor_name
+ field :platform_name, GraphQL::Types::String, null: true,
+ description: 'Platform provided by the runner.',
+ method: :platform
+ field :architecture_name, GraphQL::Types::String, null: true,
+ description: 'Architecture provided by the the runner.',
+ method: :architecture
+ field :maintenance_note, GraphQL::Types::String, null: true,
+ description: 'Runner\'s maintenance notes.'
field :groups, ::Types::GroupType.connection_type, null: true,
description: 'Groups the runner is associated with. For group runners only.'
field :id, ::Types::GlobalIDType[::Ci::Runner], null: false,
@@ -70,7 +77,7 @@ module Types
Types::Ci::RunnerStatusEnum,
null: false,
description: 'Status of the runner.',
- resolver: ::Resolvers::Ci::RunnerStatusResolver
+ resolver: ::Resolvers::Ci::RunnerStatusResolver # TODO: Remove :resolver in %17.0
field :tag_list, [GraphQL::Types::String], null: true,
description: 'Tags associated with the runner.'
field :token_expires_at, Types::TimeType, null: true,
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 e3d77e485bc..02feafe3df9 100644
--- a/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
+++ b/app/graphql/types/ci/runner_upgrade_status_type_enum.rb
@@ -5,17 +5,11 @@ module Types
class RunnerUpgradeStatusTypeEnum < BaseEnum
graphql_name 'CiRunnerUpgradeStatusType'
- value 'NOT_AVAILABLE',
- description: "An update is not available for the runner.",
- value: :not_available
+ value 'UNKNOWN', description: 'Upgrade status is unknown.', value: :unknown
- value 'AVAILABLE',
- description: "An update is available for the runner.",
- value: :available
-
- value 'RECOMMENDED',
- description: "An update is available and recommended for the runner.",
- value: :recommended
+ Gitlab::Ci::RunnerUpgradeCheck::STATUSES.each do |status, description|
+ value status.to_s.upcase, description: description, value: status
+ end
end
end
end
diff --git a/app/graphql/types/color_type.rb b/app/graphql/types/color_type.rb
new file mode 100644
index 00000000000..ee5c0c8737b
--- /dev/null
+++ b/app/graphql/types/color_type.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Types
+ class ColorType < BaseScalar
+ graphql_name 'Color'
+ description <<~DESC
+ Color represented as a hex code or named color.
+
+ For example: "#fefefe".
+ DESC
+
+ def self.coerce_input(value, ctx)
+ color = Gitlab::Color.of(value)
+ raise GraphQL::CoercionError, 'Not a color' unless color.valid?
+
+ color
+ rescue ArgumentError => e
+ raise GraphQL::CoercionError, e.message
+ end
+
+ def self.coerce_result(value, ctx)
+ value.to_s
+ end
+ end
+end
diff --git a/app/graphql/types/concerns/gitlab_style_deprecations.rb b/app/graphql/types/concerns/gitlab_style_deprecations.rb
index 802562ed958..cd8e393b235 100644
--- a/app/graphql/types/concerns/gitlab_style_deprecations.rb
+++ b/app/graphql/types/concerns/gitlab_style_deprecations.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
# Concern for handling deprecation arguments.
-# https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-and-enum-values
+# https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-schema-items
module GitlabStyleDeprecations
extend ActiveSupport::Concern
@@ -11,7 +11,7 @@ module GitlabStyleDeprecations
def gitlab_deprecation(kwargs)
if kwargs[:deprecation_reason].present?
raise ArgumentError, 'Use `deprecated` property instead of `deprecation_reason`. ' \
- 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-arguments-and-enum-values'
+ 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-schema-items'
end
deprecation = ::Gitlab::Graphql::Deprecation.parse(kwargs.delete(:deprecated))
diff --git a/app/graphql/types/container_expiration_policy_type.rb b/app/graphql/types/container_expiration_policy_type.rb
index 0e9534be684..22020aff36b 100644
--- a/app/graphql/types/container_expiration_policy_type.rb
+++ b/app/graphql/types/container_expiration_policy_type.rb
@@ -6,7 +6,7 @@ module Types
description 'A tag expiration policy designed to keep only the images that matter most'
- authorize :destroy_container_image
+ authorize :admin_container_image
field :cadence, Types::ContainerExpirationPolicyCadenceEnum, null: false, description: 'This container expiration policy schedule.'
field :created_at, Types::TimeType, null: false, description: 'Timestamp of when the container expiration policy was created.'
diff --git a/app/graphql/types/container_repository_type.rb b/app/graphql/types/container_repository_type.rb
index dddf9a3ee97..cb818ac5e92 100644
--- a/app/graphql/types/container_repository_type.rb
+++ b/app/graphql/types/container_repository_type.rb
@@ -21,6 +21,7 @@ module Types
field :status, Types::ContainerRepositoryStatusEnum, null: true, description: 'Status of the container repository.'
field :tags_count, GraphQL::Types::Int, null: false, description: 'Number of tags associated with this image.'
field :updated_at, Types::TimeType, null: false, description: 'Timestamp when the container repository was updated.'
+ field :last_cleanup_deleted_tags_count, GraphQL::Types::Int, null: true, description: 'Number of deleted tags from the last cleanup.'
def can_delete
Ability.allowed?(current_user, :update_container_image, object)
diff --git a/app/graphql/types/current_user_todos.rb b/app/graphql/types/current_user_todos.rb
index 2551db875b0..4c4cb516979 100644
--- a/app/graphql/types/current_user_todos.rb
+++ b/app/graphql/types/current_user_todos.rb
@@ -17,9 +17,24 @@ module Types
def current_user_todos(state: nil)
state ||= %i[done pending] # TodosFinder treats a `nil` state param as `pending`
- klass = unpresented.class
+ key = [state, unpresented.class.name]
- TodosFinder.new(current_user, state: state, type: klass.name, target_id: object.id).execute
+ BatchLoader::GraphQL.for(unpresented).batch(default_value: [], key: key) do |targets, loader, args|
+ state, klass_name = args[:key]
+
+ targets_by_id = targets.index_by(&:id)
+ ids = targets_by_id.keys
+
+ results = TodosFinder.new(current_user, state: state, type: klass_name, target_id: ids).execute
+
+ by_target_id = results.group_by(&:target_id)
+
+ by_target_id.each do |target_id, todos|
+ target = targets_by_id[target_id]
+ todos.each { _1.target = target } # prevent extra loads
+ loader.call(target, todos)
+ end
+ end
end
end
end
diff --git a/app/graphql/types/customer_relations/contact_type.rb b/app/graphql/types/customer_relations/contact_type.rb
index 6a3882c66af..c07d2164d14 100644
--- a/app/graphql/types/customer_relations/contact_type.rb
+++ b/app/graphql/types/customer_relations/contact_type.rb
@@ -50,6 +50,11 @@ module Types
Types::TimeType,
null: false,
description: 'Timestamp the contact was last updated.'
+
+ field :active,
+ GraphQL::Types::Boolean,
+ null: false,
+ description: 'State of the contact.', method: :active?
end
end
end
diff --git a/app/graphql/types/customer_relations/organization_type.rb b/app/graphql/types/customer_relations/organization_type.rb
index 0f97f0a2433..d7835470795 100644
--- a/app/graphql/types/customer_relations/organization_type.rb
+++ b/app/graphql/types/customer_relations/organization_type.rb
@@ -36,6 +36,11 @@ module Types
Types::TimeType,
null: false,
description: 'Timestamp the organization was last updated.'
+
+ field :active,
+ GraphQL::Types::Boolean,
+ null: false,
+ description: 'State of the organization.', method: :active?
end
end
end
diff --git a/app/graphql/types/dependency_proxy/group_setting_type.rb b/app/graphql/types/dependency_proxy/group_setting_type.rb
index 8b8b8572aa9..6c6f848d019 100644
--- a/app/graphql/types/dependency_proxy/group_setting_type.rb
+++ b/app/graphql/types/dependency_proxy/group_setting_type.rb
@@ -6,7 +6,7 @@ module Types
description 'Group-level Dependency Proxy settings'
- authorize :read_dependency_proxy
+ authorize :admin_dependency_proxy
field :enabled, GraphQL::Types::Boolean, null: false, description: 'Indicates whether the dependency proxy is enabled for the group.'
end
diff --git a/app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb b/app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb
index 9ab7c50998d..b8c178539a0 100644
--- a/app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb
+++ b/app/graphql/types/dependency_proxy/image_ttl_group_policy_type.rb
@@ -6,7 +6,7 @@ module Types
description 'Group-level Dependency Proxy TTL policy settings'
- authorize :read_dependency_proxy
+ authorize :admin_dependency_proxy
field :created_at, Types::TimeType, null: true, description: 'Timestamp of creation.'
field :enabled, GraphQL::Types::Boolean, null: false, description: 'Indicates whether the policy is enabled or disabled.'
diff --git a/app/graphql/types/deprecated_mutations.rb b/app/graphql/types/deprecated_mutations.rb
index 70d5fc31cd1..49bad56b6f9 100644
--- a/app/graphql/types/deprecated_mutations.rb
+++ b/app/graphql/types/deprecated_mutations.rb
@@ -5,8 +5,7 @@ module Types
extend ActiveSupport::Concern
prepended do
- mount_mutation Mutations::Clusters::AgentTokens::Delete,
- deprecated: { reason: 'Tokens must be revoked with ClusterAgentTokenRevoke', milestone: '14.7' }
+ # placeholder for any FOSS mutations to be deprecated
end
end
end
diff --git a/app/graphql/types/design_management/design_fields.rb b/app/graphql/types/design_management/design_fields.rb
index 364f72a519f..c3a35cfe1ad 100644
--- a/app/graphql/types/design_management/design_fields.rb
+++ b/app/graphql/types/design_management/design_fields.rb
@@ -43,13 +43,12 @@ module Types
end
def image_v432x230(parent:)
- version = cached_stateful_version(parent)
- action = design.actions.up_to_version(version).most_recent.first
-
- # A `nil` return value indicates that the image has not been processed
- return unless action.image_v432x230.file
+ Gitlab::Graphql::Lazy.with_value(lazy_action(parent)) do |action|
+ # A `nil` return value indicates that the image has not been processed
+ next unless action&.image_v432x230&.file
- Gitlab::UrlBuilder.build(design, ref: version.sha, size: :v432x230)
+ Gitlab::UrlBuilder.build(action.design, ref: action.version.sha, size: :v432x230)
+ end
end
def event(parent:)
@@ -73,6 +72,25 @@ module Types
def issue
::Gitlab::Graphql::Loaders::BatchModelLoader.new(::Issue, design.issue_id).find
end
+
+ private
+
+ def lazy_action(parent)
+ version = cached_stateful_version(parent)
+
+ BatchLoader::GraphQL.for([version, design]).batch do |ids, loader|
+ by_version = ids.group_by(&:first).transform_values { _1.map(&:second) }
+ designs_by_id = ids.map(&:second).index_by(&:id)
+
+ by_version.each do |v, designs|
+ actions = ::DesignManagement::Action.most_recent.up_to_version(v).by_design(designs).with_version
+ actions.each do |action|
+ action.design = designs_by_id[action.design_id] # eliminate duplicate load
+ loader.call([v, action.design], action)
+ end
+ end
+ end
+ end
end
end
end
diff --git a/app/graphql/types/design_management/design_type.rb b/app/graphql/types/design_management/design_type.rb
index 4c0b1162306..cc4c0e19ec7 100644
--- a/app/graphql/types/design_management/design_type.rb
+++ b/app/graphql/types/design_management/design_type.rb
@@ -23,14 +23,13 @@ module Types
field :versions,
Types::DesignManagement::VersionType.connection_type,
resolver: Resolvers::DesignManagement::VersionsResolver,
- description: "All versions related to this design ordered newest first.",
- extras: [:parent]
+ description: "All versions related to this design ordered newest first."
# Returns a `DesignManagement::Version` for this query based on the
# `atVersion` argument passed to a parent node if present, or otherwise
# the most recent `Version` for the issue.
def cached_stateful_version(parent_node)
- version_gid = Gitlab::Graphql::FindArgumentInParent.find(parent_node, :at_version)
+ version_gid = context[:at_version_argument] # See: DesignsResolver
# Caching is scoped to an `issue_id` to allow us to cache the
# most recent `Version` for an issue
diff --git a/app/graphql/types/global_id_type.rb b/app/graphql/types/global_id_type.rb
index 4f92b5e8cc2..6a924c13a3c 100644
--- a/app/graphql/types/global_id_type.rb
+++ b/app/graphql/types/global_id_type.rb
@@ -1,21 +1,5 @@
# frozen_string_literal: true
-module GraphQLExtensions
- module ScalarExtensions
- # Allow ID to unify with GlobalID Types
- def ==(other)
- if name == 'ID' && other.is_a?(self.class) &&
- other.type_class.ancestors.include?(::Types::GlobalIDType)
- return true
- end
-
- super
- end
- end
-end
-
-::GraphQL::ScalarType.prepend(GraphQLExtensions::ScalarExtensions)
-
module Types
class GlobalIDType < BaseScalar
graphql_name 'GlobalID'
diff --git a/app/graphql/types/incident_management/timeline_event_type.rb b/app/graphql/types/incident_management/timeline_event_type.rb
new file mode 100644
index 00000000000..a6d3f57404b
--- /dev/null
+++ b/app/graphql/types/incident_management/timeline_event_type.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+module Types
+ module IncidentManagement
+ class TimelineEventType < BaseObject
+ graphql_name 'TimelineEventType'
+ description 'Describes an incident management timeline event'
+
+ authorize :read_incident_management_timeline_event
+
+ field :id,
+ Types::GlobalIDType[::IncidentManagement::TimelineEvent],
+ null: false,
+ description: 'ID of the timeline event.'
+
+ field :author,
+ Types::UserType,
+ null: true,
+ description: 'User that created the timeline event.'
+
+ field :updated_by_user,
+ Types::UserType,
+ null: true,
+ description: 'User that updated the timeline event.'
+
+ field :incident,
+ Types::IssueType,
+ null: false,
+ description: 'Incident of the timeline event.'
+
+ field :note,
+ GraphQL::Types::String,
+ null: true,
+ description: 'Text note of the timeline event.'
+
+ field :note_html,
+ GraphQL::Types::String,
+ null: true,
+ description: 'HTML note of the timeline event.'
+
+ field :promoted_from_note,
+ Types::Notes::NoteType,
+ null: true,
+ description: 'Note from which the timeline event was created.'
+
+ field :editable,
+ GraphQL::Types::Boolean,
+ null: false,
+ description: 'Indicates the timeline event is editable.'
+
+ field :action,
+ GraphQL::Types::String,
+ null: false,
+ description: 'Indicates the timeline event icon.'
+
+ field :occurred_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event occurred.'
+
+ field :created_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event created.'
+
+ field :updated_at,
+ Types::TimeType,
+ null: false,
+ description: 'Timestamp when the event updated.'
+ end
+ end
+end
diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb
index 07450c38616..c83200bd614 100644
--- a/app/graphql/types/issue_type.rb
+++ b/app/graphql/types/issue_type.rb
@@ -170,7 +170,7 @@ module Types
end
def hidden?
- object.hidden? if Feature.enabled?(:ban_user_feature_flag, default_enabled: :yaml)
+ object.hidden? if Feature.enabled?(:ban_user_feature_flag)
end
def escalation_status
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index af198d03c3f..cc3df474bef 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -67,9 +67,6 @@ module Types
description: 'Indicates if members of the target project can push to the fork.'
field :default_merge_commit_message, GraphQL::Types::String, null: true, calls_gitaly: true,
description: 'Default merge commit message of the merge request.'
- field :default_merge_commit_message_with_description, GraphQL::Types::String, null: true,
- description: 'Default merge commit message of the merge request with description. Will have the same value as `defaultMergeCommitMessage` when project has `mergeCommitTemplate` set.',
- deprecated: { reason: 'Define merge commit template in project and use `defaultMergeCommitMessage`', milestone: '14.5' }
field :default_squash_commit_message, GraphQL::Types::String, null: true, calls_gitaly: true,
description: 'Default squash commit message of the merge request.'
field :diff_stats_summary, Types::DiffStatsSummaryType, null: true, calls_gitaly: true,
@@ -97,6 +94,7 @@ module Types
method: :public_merge_status, null: true,
description: 'Merge status of the merge request.'
field :mergeable_discussions_state, GraphQL::Types::Boolean, null: true,
+ calls_gitaly: true,
description: 'Indicates if all discussions in the merge request have been resolved, allowing the merge request to be merged.'
field :rebase_commit_sha, GraphQL::Types::String, null: true,
description: 'Rebase commit SHA of the merge request.'
@@ -254,10 +252,6 @@ module Types
object.default_merge_commit_message(include_description: false, user: current_user)
end
- def default_merge_commit_message_with_description
- object.default_merge_commit_message(include_description: true)
- end
-
def default_squash_commit_message
object.default_squash_commit_message(user: current_user)
end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 2297912ac35..7d8ada82d40 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -47,6 +47,10 @@ module Types
mount_mutation Mutations::DependencyProxy::ImageTtlGroupPolicy::Update
mount_mutation Mutations::DependencyProxy::GroupSettings::Update
mount_mutation Mutations::Environments::CanaryIngress::Update
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Create
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::PromoteFromNote
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Update
+ mount_mutation Mutations::IncidentManagement::TimelineEvent::Destroy
mount_mutation Mutations::Issues::Create
mount_mutation Mutations::Issues::SetAssignees
mount_mutation Mutations::Issues::SetCrmContacts
@@ -69,7 +73,9 @@ module Types
mount_mutation Mutations::MergeRequests::SetDraft, calls_gitaly: true
mount_mutation Mutations::MergeRequests::SetAssignees
mount_mutation Mutations::MergeRequests::ReviewerRereview
- mount_mutation Mutations::MergeRequests::ToggleAttentionRequested, feature_flag: :mr_attention_requests
+ mount_mutation Mutations::MergeRequests::RequestAttention
+ mount_mutation Mutations::MergeRequests::RemoveAttentionRequest
+ mount_mutation Mutations::MergeRequests::ToggleAttentionRequested
mount_mutation Mutations::Metrics::Dashboard::Annotations::Create
mount_mutation Mutations::Metrics::Dashboard::Annotations::Delete
mount_mutation Mutations::Notes::Create::Note, calls_gitaly: true
@@ -88,6 +94,7 @@ module Types
mount_mutation Mutations::Terraform::State::Delete
mount_mutation Mutations::Terraform::State::Lock
mount_mutation Mutations::Terraform::State::Unlock
+ mount_mutation Mutations::Timelogs::Delete
mount_mutation Mutations::Todos::Create
mount_mutation Mutations::Todos::MarkDone
mount_mutation Mutations::Todos::Restore
@@ -108,7 +115,12 @@ module Types
mount_mutation Mutations::Ci::Pipeline::Cancel
mount_mutation Mutations::Ci::Pipeline::Destroy
mount_mutation Mutations::Ci::Pipeline::Retry
- mount_mutation Mutations::Ci::CiCdSettingsUpdate
+ mount_mutation Mutations::Ci::CiCdSettingsUpdate, deprecated: {
+ reason: :renamed,
+ replacement: 'ProjectCiCdSettingsUpdate',
+ milestone: '15.0'
+ }
+ mount_mutation Mutations::Ci::ProjectCiCdSettingsUpdate
mount_mutation Mutations::Ci::Job::Play
mount_mutation Mutations::Ci::Job::Retry
mount_mutation Mutations::Ci::Job::Cancel
@@ -128,6 +140,7 @@ module Types
mount_mutation Mutations::WorkItems::Create
mount_mutation Mutations::WorkItems::CreateFromTask
mount_mutation Mutations::WorkItems::Delete
+ mount_mutation Mutations::WorkItems::DeleteTask
mount_mutation Mutations::WorkItems::Update
mount_mutation Mutations::SavedReplies::Create
mount_mutation Mutations::SavedReplies::Update
diff --git a/app/graphql/types/namespace/package_settings_type.rb b/app/graphql/types/namespace/package_settings_type.rb
index cb546bbf3ec..7a0abe619a5 100644
--- a/app/graphql/types/namespace/package_settings_type.rb
+++ b/app/graphql/types/namespace/package_settings_type.rb
@@ -6,7 +6,7 @@ module Types
description 'Namespace-level Package Registry settings'
- authorize :read_package_settings
+ authorize :admin_package
field :generic_duplicate_exception_regex, Types::UntrustedRegexp, null: true, description: 'When generic_duplicates_allowed is false, you can publish duplicate packages with names that match this regex. Otherwise, this setting has no effect.'
field :generic_duplicates_allowed, GraphQL::Types::Boolean, null: false, description: 'Indicates whether duplicate generic packages are allowed for this namespace.'
diff --git a/app/graphql/types/notes/update_diff_image_position_input_type.rb b/app/graphql/types/notes/update_diff_image_position_input_type.rb
index 0c6e4a16434..913d24cb513 100644
--- a/app/graphql/types/notes/update_diff_image_position_input_type.rb
+++ b/app/graphql/types/notes/update_diff_image_position_input_type.rb
@@ -28,6 +28,8 @@ module Types
raise GraphQL::ExecutionError, "At least one property of `#{self.class.graphql_name}` must be set"
end
end
+
+ super
end
end
end
diff --git a/app/graphql/types/packages/package_base_type.rb b/app/graphql/types/packages/package_base_type.rb
new file mode 100644
index 00000000000..06ccde94cd4
--- /dev/null
+++ b/app/graphql/types/packages/package_base_type.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module Types
+ module Packages
+ class PackageBaseType < ::Types::BaseObject
+ graphql_name 'PackageBase'
+ description 'Represents a package in the Package Registry'
+
+ connection_type_class(Types::CountableConnectionType)
+
+ authorize :read_package
+
+ field :id, ::Types::GlobalIDType[::Packages::Package], null: false,
+ description: 'ID of the package.'
+
+ field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
+ field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
+ field :metadata, Types::Packages::MetadataType, null: true,
+ description: 'Package metadata.'
+ field :name, GraphQL::Types::String, null: false, description: 'Name of the package.'
+ field :package_type, Types::Packages::PackageTypeEnum, null: false, description: 'Package type.'
+ field :project, Types::ProjectType, null: false, description: 'Project where the package is stored.'
+ field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
+ field :tags, Types::Packages::PackageTagType.connection_type, null: true, description: 'Package tags.'
+ field :updated_at, Types::TimeType, null: false, description: 'Date of most recent update.'
+ field :version, GraphQL::Types::String, null: true, description: 'Version string.'
+
+ def project
+ Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
+ end
+
+ def can_destroy
+ Ability.allowed?(current_user, :destroy_package, object)
+ end
+
+ # NOTE: This method must be kept in sync with the union
+ # type: `Types::Packages::MetadataType`.
+ #
+ # `Types::Packages::MetadataType.resolve_type(metadata, ctx)` must never raise.
+ # rubocop: disable GraphQL/ResolverMethodLength
+ def metadata
+ case object.package_type
+ when 'composer'
+ object.composer_metadatum
+ when 'conan'
+ object.conan_metadatum
+ when 'maven'
+ object.maven_metadatum
+ when 'nuget'
+ object.nuget_metadatum
+ when 'pypi'
+ object.pypi_metadatum
+ else
+ nil
+ end
+ end
+ # rubocop: enable GraphQL/ResolverMethodLength
+ end
+ end
+end
diff --git a/app/graphql/types/packages/package_details_type.rb b/app/graphql/types/packages/package_details_type.rb
index 444ecb5e792..ae57e103f40 100644
--- a/app/graphql/types/packages/package_details_type.rb
+++ b/app/graphql/types/packages/package_details_type.rb
@@ -4,26 +4,19 @@ module Types
module Packages
class PackageDetailsType < PackageType
graphql_name 'PackageDetailsType'
- description 'Represents a package details in the Package Registry. Note that this type is in beta and susceptible to changes'
+ description 'Represents a package details in the Package Registry'
include ::PackagesHelper
authorize :read_package
- field :versions, ::Types::Packages::PackageType.connection_type, null: true,
+ field :versions, ::Types::Packages::PackageBaseType.connection_type, null: true,
description: 'Other versions of the package.'
field :package_files, Types::Packages::PackageFileType.connection_type, null: true, method: :installable_package_files, description: 'Package files.'
field :dependency_links, Types::Packages::PackageDependencyLinkType.connection_type, null: true, description: 'Dependency link.'
- # this is an override of Types::Packages::PackageType.pipelines
- # in order to use a custom resolver: Resolvers::PackagePipelinesResolver
- field :pipelines,
- resolver: Resolvers::PackagePipelinesResolver,
- description: 'Pipelines that built the package.',
- deprecated: { reason: 'Due to scalability concerns, this field is going to be removed', milestone: '14.6' }
-
field :composer_config_repository_url, GraphQL::Types::String, null: true, description: 'Url of the Composer setup endpoint.'
field :composer_url, GraphQL::Types::String, null: true, description: 'Url of the Composer endpoint.'
field :conan_url, GraphQL::Types::String, null: true, description: 'Url of the Conan project endpoint.'
diff --git a/app/graphql/types/packages/package_type.rb b/app/graphql/types/packages/package_type.rb
index 1155be28e08..f6586670c72 100644
--- a/app/graphql/types/packages/package_type.rb
+++ b/app/graphql/types/packages/package_type.rb
@@ -2,67 +2,17 @@
module Types
module Packages
- class PackageType < ::Types::BaseObject
+ class PackageType < Types::Packages::PackageBaseType
graphql_name 'Package'
- description 'Represents a package in the Package Registry. Note that this type is in beta and susceptible to changes'
-
- connection_type_class(Types::CountableConnectionType)
+ description 'Represents a package with pipelines in the Package Registry'
authorize :read_package
- field :id, ::Types::GlobalIDType[::Packages::Package], null: false,
- description: 'ID of the package.'
-
- field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
- field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
- field :metadata, Types::Packages::MetadataType, null: true,
- description: 'Package metadata.'
- field :name, GraphQL::Types::String, null: false, description: 'Name of the package.'
- field :package_type, Types::Packages::PackageTypeEnum, null: false, description: 'Package type.'
- field :pipelines, Types::Ci::PipelineType.connection_type, null: true,
- description: 'Pipelines that built the package.',
- deprecated: { reason: 'Due to scalability concerns, this field is going to be removed', milestone: '14.6' }
- field :project, Types::ProjectType, null: false, description: 'Project where the package is stored.'
- field :status, Types::Packages::PackageStatusEnum, null: false, description: 'Package status.'
- field :tags, Types::Packages::PackageTagType.connection_type, null: true, description: 'Package tags.'
- field :updated_at, Types::TimeType, null: false, description: 'Date of most recent update.'
- field :version, GraphQL::Types::String, null: true, description: 'Version string.'
- field :versions, ::Types::Packages::PackageType.connection_type, null: true,
- description: 'Other versions of the package.',
- deprecated: { reason: 'This field is now only returned in the PackageDetailsType', milestone: '13.11' }
-
- def project
- Gitlab::Graphql::Loaders::BatchModelLoader.new(Project, object.project_id).find
- end
-
- def versions
- []
- end
-
- def can_destroy
- Ability.allowed?(current_user, :destroy_package, object)
- end
-
- # NOTE: This method must be kept in sync with the union
- # type: `Types::Packages::MetadataType`.
- #
- # `Types::Packages::MetadataType.resolve_type(metadata, ctx)` must never raise.
- def metadata
- case object.package_type
- when 'composer'
- object.composer_metadatum
- when 'conan'
- object.conan_metadatum
- when 'maven'
- object.maven_metadatum
- when 'nuget'
- object.nuget_metadatum
- when 'pypi'
- object.pypi_metadatum
- else
- nil
- end
- end
+ field :pipelines,
+ resolver: Resolvers::PackagePipelinesResolver,
+ description: <<-DESC
+ Pipelines that built the package. Max page size #{Resolvers::PackagePipelinesResolver::MAX_PAGE_SIZE}.
+ DESC
end
end
end
diff --git a/app/graphql/types/permission_types/timelog.rb b/app/graphql/types/permission_types/timelog.rb
new file mode 100644
index 00000000000..c35f3101e39
--- /dev/null
+++ b/app/graphql/types/permission_types/timelog.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Types
+ module PermissionTypes
+ class Timelog < BasePermissionType
+ graphql_name 'TimelogPermissions'
+
+ abilities :admin_timelog
+ end
+ end
+end
diff --git a/app/graphql/types/permission_types/work_item.rb b/app/graphql/types/permission_types/work_item.rb
new file mode 100644
index 00000000000..bae1dae4834
--- /dev/null
+++ b/app/graphql/types/permission_types/work_item.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module Types
+ module PermissionTypes
+ class WorkItem < BasePermissionType
+ graphql_name 'WorkItemPermissions'
+ description 'Check permissions for the current user on a work item'
+
+ abilities :read_work_item, :update_work_item, :delete_work_item
+ end
+ end
+end
diff --git a/app/graphql/types/project_statistics_type.rb b/app/graphql/types/project_statistics_type.rb
index 1146774b43c..5ab3cc33e85 100644
--- a/app/graphql/types/project_statistics_type.rb
+++ b/app/graphql/types/project_statistics_type.rb
@@ -27,5 +27,7 @@ module Types
description: 'Uploads size of the project in bytes.'
field :wiki_size, GraphQL::Types::Float, null: true,
description: 'Wiki size of the project in bytes.'
+ field :container_registry_size, GraphQL::Types::Float, null: true,
+ description: 'Container Registry size of the project in bytes.'
end
end
diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb
index 47e9a6c11fc..f1de8e985b3 100644
--- a/app/graphql/types/project_type.rb
+++ b/app/graphql/types/project_type.rb
@@ -295,6 +295,19 @@ module Types
description: 'HTTP Integrations which can receive alerts for the project.',
resolver: Resolvers::AlertManagement::HttpIntegrationsResolver
+ field :incident_management_timeline_events,
+ Types::IncidentManagement::TimelineEventType.connection_type,
+ null: true,
+ description: 'Incident Management Timeline events associated with the incident.',
+ extras: [:lookahead],
+ resolver: Resolvers::IncidentManagement::TimelineEventsResolver
+
+ field :incident_management_timeline_event,
+ Types::IncidentManagement::TimelineEventType,
+ null: true,
+ description: 'Incident Management Timeline event associated with the incident.',
+ resolver: Resolvers::IncidentManagement::TimelineEventsResolver.single
+
field :releases,
Types::ReleaseType.connection_type,
null: true,
diff --git a/app/graphql/types/projects/topic_type.rb b/app/graphql/types/projects/topic_type.rb
index c579f2f2b9d..bde6d79ddbf 100644
--- a/app/graphql/types/projects/topic_type.rb
+++ b/app/graphql/types/projects/topic_type.rb
@@ -12,6 +12,10 @@ module Types
field :name, GraphQL::Types::String, null: false,
description: 'Name of the topic.'
+ field :title, GraphQL::Types::String, null: false,
+ method: :title_or_name,
+ description: 'Title of the topic.'
+
field :description, GraphQL::Types::String, null: true,
description: 'Description of the topic.'
diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb
index cc46c7e86e4..01b1a71896a 100644
--- a/app/graphql/types/query_type.rb
+++ b/app/graphql/types/query_type.rb
@@ -99,17 +99,6 @@ module Types
argument :id, ::Types::GlobalIDType[::MergeRequest], required: true, description: 'Global ID of the merge request.'
end
- field :instance_statistics_measurements,
- type: Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
- null: true,
- description: 'Get statistics on the instance.',
- resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver,
- deprecated: {
- reason: :renamed,
- replacement: 'Query.usageTrendsMeasurements',
- milestone: '13.10'
- }
-
field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
null: true,
description: 'Get statistics on the instance.',
@@ -160,30 +149,18 @@ module Types
end
def issue(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::Issue].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
def merge_request(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::MergeRequest].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
def milestone(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[Milestone].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
def container_repository(id:)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- id = ::Types::GlobalIDType[::ContainerRepository].coerce_isolated_input(id)
GitlabSchema.find_by_gid(id)
end
diff --git a/app/graphql/types/range_input_type.rb b/app/graphql/types/range_input_type.rb
index 9580b37d6c0..15b8121da93 100644
--- a/app/graphql/types/range_input_type.rb
+++ b/app/graphql/types/range_input_type.rb
@@ -21,7 +21,7 @@ module Types
raise ::Gitlab::Graphql::Errors::ArgumentError, 'start must be before end'
end
- to_h
+ super
end
end
end
diff --git a/app/graphql/types/root_storage_statistics_type.rb b/app/graphql/types/root_storage_statistics_type.rb
index 467331c5643..b1b712aab38 100644
--- a/app/graphql/types/root_storage_statistics_type.rb
+++ b/app/graphql/types/root_storage_statistics_type.rb
@@ -16,5 +16,6 @@ module Types
field :storage_size, GraphQL::Types::Float, null: false, description: 'Total storage in bytes.'
field :uploads_size, GraphQL::Types::Float, null: false, description: 'Uploads size in bytes.'
field :wiki_size, GraphQL::Types::Float, null: false, description: 'Wiki size in bytes.'
+ field :container_registry_size, GraphQL::Types::Float, null: false, description: 'Container Registry size in bytes.'
end
end
diff --git a/app/graphql/types/timelog_type.rb b/app/graphql/types/timelog_type.rb
index d348fa698fa..c3fb9b77927 100644
--- a/app/graphql/types/timelog_type.rb
+++ b/app/graphql/types/timelog_type.rb
@@ -6,6 +6,13 @@ module Types
authorize :read_issue
+ expose_permissions Types::PermissionTypes::Timelog
+
+ field :id,
+ GraphQL::Types::ID,
+ null: false,
+ description: 'Internal ID of the timelog.'
+
field :spent_at,
Types::TimeType,
null: true,
diff --git a/app/graphql/types/work_item_type.rb b/app/graphql/types/work_item_type.rb
index 512b9ef64d2..cd784d54959 100644
--- a/app/graphql/types/work_item_type.rb
+++ b/app/graphql/types/work_item_type.rb
@@ -23,5 +23,7 @@ module Types
markdown_field :title_html, null: true
markdown_field :description_html, null: true
+
+ expose_permissions Types::PermissionTypes::WorkItem
end
end
diff --git a/app/graphql/types/work_items/convert_task_input_type.rb b/app/graphql/types/work_items/convert_task_input_type.rb
index 1f142c6815c..2e66c1c1b3f 100644
--- a/app/graphql/types/work_items/convert_task_input_type.rb
+++ b/app/graphql/types/work_items/convert_task_input_type.rb
@@ -24,10 +24,6 @@ module Types
class << self
def work_item_type_global_id(global_id)
- # TODO: remove this line when the compatibility layer is removed
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- global_id = ::Types::GlobalIDType[::WorkItems::Type].coerce_isolated_input(global_id)
-
global_id&.model_id
end
end
diff --git a/app/graphql/types/work_items/deleted_task_input_type.rb b/app/graphql/types/work_items/deleted_task_input_type.rb
new file mode 100644
index 00000000000..92297876c89
--- /dev/null
+++ b/app/graphql/types/work_items/deleted_task_input_type.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Types
+ module WorkItems
+ class DeletedTaskInputType < BaseInputObject
+ graphql_name 'WorkItemDeletedTaskInput'
+
+ argument :id, ::Types::GlobalIDType[::WorkItem],
+ required: true,
+ description: 'Global ID of the task referenced in the work item\'s description.'
+ argument :line_number_end, GraphQL::Types::Int,
+ required: true,
+ description: 'Last line in the Markdown source that defines the list item task.'
+ argument :line_number_start, GraphQL::Types::Int,
+ required: true,
+ description: 'First line in the Markdown source that defines the list item task.'
+ end
+ end
+end
diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb
index cb43d911a2f..6dbd0f7bd7b 100644
--- a/app/helpers/appearances_helper.rb
+++ b/app/helpers/appearances_helper.rb
@@ -35,23 +35,21 @@ module AppearancesHelper
end
end
- def brand_header_logo
+ def brand_header_logo(options = {})
+ add_gitlab_white_text = options[:add_gitlab_white_text] || false
+ add_gitlab_black_text = options[:add_gitlab_black_text] || false
+
if current_appearance&.header_logo?
image_tag current_appearance.header_logo_path, class: 'brand-header-logo'
- elsif Feature.enabled?(:ukraine_support_tanuki)
- render partial: 'shared/logo_ukraine', formats: :svg
+ elsif add_gitlab_white_text
+ render partial: 'shared/logo_with_white_text', formats: :svg
+ elsif add_gitlab_black_text
+ render partial: 'shared/logo_with_black_text', formats: :svg
else
render partial: 'shared/logo', formats: :svg
end
end
- # Skip the 'GitLab' type logo when custom brand logo is set
- def brand_header_logo_type
- unless current_appearance&.header_logo?
- render partial: 'shared/logo_type', formats: :svg
- end
- end
-
def header_message
return unless current_appearance&.show_header?
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index feeedb0a501..8cdfc267693 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -21,7 +21,7 @@ module ApplicationHelper
def dispensable_render(...)
render(...)
rescue StandardError => error
- if Feature.enabled?(:dispensable_render, default_enabled: :yaml)
+ if Feature.enabled?(:dispensable_render)
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
nil
else
@@ -32,7 +32,7 @@ module ApplicationHelper
def dispensable_render_if_exists(...)
render_if_exists(...)
rescue StandardError => error
- if Feature.enabled?(:dispensable_render, default_enabled: :yaml)
+ if Feature.enabled?(:dispensable_render)
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
nil
else
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index 57e08eeb4f4..9023cca18dc 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -97,24 +97,18 @@ module ApplicationSettingsHelper
end
end
- def oauth_providers_checkboxes
+ def oauth_providers_checkboxes(form)
button_based_providers.map do |source|
- disabled = @application_setting.disabled_oauth_sign_in_sources.include?(source.to_s)
+ checked = !@application_setting.disabled_oauth_sign_in_sources.include?(source.to_s)
name = Gitlab::Auth::OAuth::Provider.label_for(source)
- checkbox_name = 'application_setting[enabled_oauth_sign_in_sources][]'
- checkbox_id = "application_setting_enabled_oauth_sign_in_sources_#{name.parameterize(separator: '_')}"
-
- content_tag :div, class: 'form-check' do
- check_box_tag(
- checkbox_name,
- source,
- !disabled,
- autocomplete: 'off',
- id: checkbox_id,
- class: 'form-check-input'
- ) +
- label_tag(checkbox_id, name, class: 'form-check-label')
- end
+
+ form.gitlab_ui_checkbox_component(
+ :enabled_oauth_sign_in_sources,
+ name,
+ checkbox_options: { checked: checked, multiple: true, autocomplete: 'off' },
+ checked_value: source,
+ unchecked_value: nil
+ )
end
end
@@ -278,6 +272,7 @@ module ApplicationSettingsHelper
:invisible_captcha_enabled,
:max_artifacts_size,
:max_attachment_size,
+ :max_export_size,
:max_import_size,
:max_pages_size,
:max_yaml_size_bytes,
@@ -412,6 +407,8 @@ module ApplicationSettingsHelper
:container_registry_import_max_retries,
:container_registry_import_start_max_retries,
:container_registry_import_max_step_duration,
+ :container_registry_pre_import_timeout,
+ :container_registry_import_timeout,
:container_registry_import_target_plan,
:container_registry_import_created_before,
:keep_latest_artifact,
@@ -431,7 +428,8 @@ module ApplicationSettingsHelper
:users_get_by_id_limit_allowlist_raw,
:runner_token_expiration_interval,
:group_runner_token_expiration_interval,
- :project_runner_token_expiration_interval
+ :project_runner_token_expiration_interval,
+ :pipeline_limit_per_project_user_sha
].tap do |settings|
settings << :deactivate_dormant_users unless Gitlab.com?
end
@@ -468,7 +466,7 @@ module ApplicationSettingsHelper
def instance_clusters_enabled?
clusterable = Clusters::Instance.new
- Feature.enabled?(:certificate_based_clusters, clusterable, default_enabled: :yaml, type: :ops) &&
+ clusterable.certificate_based_clusters_enabled? &&
can?(current_user, :read_cluster, clusterable)
end
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 6ac4a12bcd5..07152133402 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -91,7 +91,9 @@ module AuthHelper
end
def saml_providers
- auth_providers.select { |provider| auth_strategy_class(provider) == 'OmniAuth::Strategies::SAML' }
+ auth_providers.select do |provider|
+ provider == :saml || auth_strategy_class(provider) == 'OmniAuth::Strategies::SAML'
+ end
end
def auth_strategy_class(provider)
diff --git a/app/helpers/badges_helper.rb b/app/helpers/badges_helper.rb
index a03f7f4097a..26ebe8a6470 100644
--- a/app/helpers/badges_helper.rb
+++ b/app/helpers/badges_helper.rb
@@ -69,6 +69,7 @@ module BadgesHelper
icon_only = options[:icon_only]
variant_class = VARIANT_CLASSES[options.fetch(:variant, :muted)]
size_class = SIZE_CLASSES[options.fetch(:size, :md)]
+ icon_classes = GL_ICON_CLASSES.dup << options.fetch(:icon_classes, nil)
html_options = html_options.merge(
class: [
@@ -85,7 +86,6 @@ module BadgesHelper
end
if options[:icon]
- icon_classes = GL_ICON_CLASSES.dup
icon_classes << "gl-mr-2" unless icon_only
icon = sprite_icon(options[:icon], css_class: icon_classes.join(' '))
diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb
index f849f36bf84..f98e70e41d8 100644
--- a/app/helpers/boards_helper.rb
+++ b/app/helpers/boards_helper.rb
@@ -25,7 +25,6 @@ module BoardsHelper
labels_manage_path: labels_manage_path,
releases_fetch_path: releases_fetch_path,
board_type: board.to_type,
- has_scope: board.scoped?.to_s,
has_missing_boards: has_missing_boards?.to_s,
multiple_boards_available: multiple_boards_available?.to_s,
board_base_url: board_base_url
diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb
index b138e9aeb0c..10cfa97030d 100644
--- a/app/helpers/broadcast_messages_helper.rb
+++ b/app/helpers/broadcast_messages_helper.rb
@@ -73,7 +73,7 @@ module BroadcastMessagesHelper
private
def current_user_access_level_for_project_or_group
- return if Feature.disabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+ return if Feature.disabled?(:role_targeted_broadcast_messages)
return unless current_user.present?
strong_memoize(:current_user_access_level_for_project_or_group) do
diff --git a/app/helpers/ci/builds_helper.rb b/app/helpers/ci/builds_helper.rb
index bfdb830f2c3..b4a2cf7bb1e 100644
--- a/app/helpers/ci/builds_helper.rb
+++ b/app/helpers/ci/builds_helper.rb
@@ -36,5 +36,15 @@ module Ci
description: project_job_url(@project, @build)
}
end
+
+ def prepare_failed_jobs_summary_data(failed_builds)
+ failed_builds.map do |build|
+ {
+ id: build.id,
+ failure: build.present.callout_failure_message,
+ failure_summary: build_summary(build)
+ }
+ end.to_json
+ end
end
end
diff --git a/app/helpers/ci/pipeline_editor_helper.rb b/app/helpers/ci/pipeline_editor_helper.rb
index 18557afcb99..da773e3e8a8 100644
--- a/app/helpers/ci/pipeline_editor_helper.rb
+++ b/app/helpers/ci/pipeline_editor_helper.rb
@@ -21,6 +21,7 @@ module Ci
"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,
+ "includes-help-page-path" => help_page_path('ci/yaml/includes'),
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
"lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb
index 70d2a4fafd1..7722677e503 100644
--- a/app/helpers/ci/pipelines_helper.rb
+++ b/app/helpers/ci/pipelines_helper.rb
@@ -42,7 +42,7 @@ module Ci
{ name: 'Django', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/django.svg') },
{ name: 'Docker', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/docker.svg') },
{ name: 'Elixir', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/elixir.svg') },
- { name: 'iOS-Fastlane', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/fastlane.svg') },
+ { name: 'iOS-Fastlane', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/fastlane.svg'), title: 'iOS with Fastlane' },
{ name: 'Flutter', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/flutter.svg') },
{ name: 'Go', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/go_logo.svg') },
{ name: 'Gradle', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/gradle.svg') },
@@ -51,6 +51,7 @@ module Ci
{ name: 'Julia', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/julia.svg') },
{ name: 'Laravel', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/laravel.svg') },
{ name: 'LaTeX', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/latex.svg') },
+ { name: 'MATLAB', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/matlab.svg') },
{ name: 'Maven', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/maven.svg') },
{ name: 'Mono', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/mono.svg') },
{ name: 'Nodejs', logo: image_path('illustrations/third-party-logos/ci_cd-template-logos/node_js.svg') },
@@ -109,6 +110,7 @@ module Ci
experiment(:ios_specific_templates, actor: current_user, project: project, sticky_to: project) do |e|
e.candidate do
data[:registration_token] = project.runners_token if can?(current_user, :register_project_runners, project)
+ data[:ios_runners_available] = (project.shared_runners_available? && Gitlab.com?).to_s
end
end
diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb
index 0e8b6fa6d25..6366ca0dfb1 100644
--- a/app/helpers/ci/runners_helper.rb
+++ b/app/helpers/ci/runners_helper.rb
@@ -17,7 +17,7 @@ module Ci
title = s_("Runners|Runner is online; last contact was %{runner_contact} ago") % { runner_contact: time_ago_in_words(contacted_at) }
icon = 'status-active'
span_class = 'gl-text-green-500'
- when :not_connected, :never_contacted
+ when :never_contacted
title = s_("Runners|Runner has never contacted this instance")
icon = 'warning-solid'
when :offline
@@ -72,11 +72,11 @@ module Ci
def group_shared_runners_settings_data(group)
{
update_path: api_v4_groups_path(id: group.id),
- shared_runners_availability: group.shared_runners_setting,
- parent_shared_runners_availability: group.parent&.shared_runners_setting,
- runner_enabled: Namespace::SR_ENABLED,
- runner_disabled: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
- runner_allow_override: Namespace::SR_DISABLED_WITH_OVERRIDE
+ shared_runners_setting: group.shared_runners_setting,
+ parent_shared_runners_setting: group.parent&.shared_runners_setting,
+ runner_enabled_value: Namespace::SR_ENABLED,
+ runner_disabled_value: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
+ runner_allow_override_value: Namespace::SR_DISABLED_WITH_OVERRIDE
}
end
diff --git a/app/helpers/ci/secure_files_helper.rb b/app/helpers/ci/secure_files_helper.rb
new file mode 100644
index 00000000000..30b2e12ac3b
--- /dev/null
+++ b/app/helpers/ci/secure_files_helper.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+module Ci
+ module SecureFilesHelper
+ def show_secure_files_setting(project, user)
+ return false if user.nil?
+
+ Feature.enabled?(:ci_secure_files, project) && user.can?(:read_secure_files, project)
+ end
+ end
+end
diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb
index fe057fb3412..8449bccd285 100644
--- a/app/helpers/clusters_helper.rb
+++ b/app/helpers/clusters_helper.rb
@@ -17,17 +17,17 @@ module ClustersHelper
clusters_empty_state_image: image_path('illustrations/empty-state/empty-state-clusters.svg'),
empty_state_image: image_path('illustrations/empty-state/empty-state-agents.svg'),
empty_state_help_text: clusterable.empty_state_help_text,
- new_cluster_path: clusterable.new_path,
add_cluster_path: clusterable.connect_path,
new_cluster_docs_path: clusterable.new_cluster_docs_path,
can_add_cluster: clusterable.can_add_cluster?.to_s,
can_admin_cluster: clusterable.can_admin_cluster?.to_s,
display_cluster_agents: display_cluster_agents?(clusterable).to_s,
- certificate_based_clusters_enabled: Feature.enabled?(:certificate_based_clusters, clusterable, default_enabled: :yaml, type: :ops).to_s,
+ certificate_based_clusters_enabled: clusterable.certificate_based_clusters_enabled?.to_s,
default_branch_name: default_branch_name(clusterable),
project_path: clusterable_project_path(clusterable),
kas_address: Gitlab::Kas.external_url,
- gitlab_version: Gitlab.version_info
+ gitlab_version: Gitlab.version_info,
+ kas_version: Gitlab::Kas.version_info
}
end
@@ -39,13 +39,7 @@ module ClustersHelper
base_domain: cluster.base_domain,
application_ingress_external_ip: cluster.application_ingress_external_ip,
auto_devops_help_path: help_page_path('topics/autodevops/index'),
- external_endpoint_help_path: help_page_path('user/project/clusters/index.md', anchor: 'base-domain')
- }
- end
-
- def js_cluster_new
- {
- cluster_connect_help_path: help_page_path('user/project/clusters/add_remove_clusters', anchor: 'add-existing-cluster')
+ external_endpoint_help_path: help_page_path('user/project/clusters/gitlab_managed_clusters.md', anchor: 'base-domain')
}
end
diff --git a/app/helpers/container_registry_helper.rb b/app/helpers/container_registry_helper.rb
index 255b8183164..52ef276c097 100644
--- a/app/helpers/container_registry_helper.rb
+++ b/app/helpers/container_registry_helper.rb
@@ -1,10 +1,6 @@
# frozen_string_literal: true
module ContainerRegistryHelper
- def container_registry_expiration_policies_throttling?
- Feature.enabled?(:container_registry_expiration_policies_throttling, default_enabled: :yaml)
- end
-
def container_repository_gid_prefix
"gid://#{GlobalID.app}/#{ContainerRepository.name}/"
end
diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb
index 79b04ae0e2b..59731dc2f6f 100644
--- a/app/helpers/emails_helper.rb
+++ b/app/helpers/emails_helper.rb
@@ -69,8 +69,8 @@ module EmailsHelper
)
else
image_tag(
- image_url('mailers/gitlab_header_logo.gif'),
- size: '55x50',
+ image_url('mailers/gitlab_logo.png'),
+ size: '55x55',
alt: 'GitLab'
)
end
diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb
index 80ab303357b..ca61c4da41c 100644
--- a/app/helpers/groups/group_members_helper.rb
+++ b/app/helpers/groups/group_members_helper.rb
@@ -53,7 +53,7 @@ module Groups::GroupMembersHelper
end
def group_group_links_list_data(group, include_relations, search)
- if ::Feature.enabled?(:group_member_inherited_group, group, default_enabled: :yaml)
+ if ::Feature.enabled?(:group_member_inherited_group, group)
group_links = group_group_links(group, include_relations)
group_links = group_links.search(search) if search
else
diff --git a/app/helpers/instance_configuration_helper.rb b/app/helpers/instance_configuration_helper.rb
index f695be32743..b06e3ff2904 100644
--- a/app/helpers/instance_configuration_helper.rb
+++ b/app/helpers/instance_configuration_helper.rb
@@ -17,4 +17,8 @@ module InstanceConfigurationHelper
number_to_human_size(v, strip_insignificant_zeros: true, significant: false)
end
end
+
+ def instance_configuration_disabled_cell_html(value)
+ instance_configuration_cell_html(value == 0 ? nil : value)
+ end
end
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
index b960ed46ba9..862938ac961 100644
--- a/app/helpers/integrations_helper.rb
+++ b/app/helpers/integrations_helper.rb
@@ -112,6 +112,7 @@ module IntegrationsHelper
enable_comments: integration.comment_on_event_enabled.to_s,
comment_detail: integration.comment_detail,
learn_more_path: integrations_help_page_path,
+ about_pricing_url: Gitlab::Saas.about_pricing_url,
trigger_events: trigger_events_for_integration(integration),
sections: integration.sections.to_json,
fields: fields_for_integration(integration),
diff --git a/app/helpers/invite_members_helper.rb b/app/helpers/invite_members_helper.rb
index a682d2712be..e46270ab819 100644
--- a/app/helpers/invite_members_helper.rb
+++ b/app/helpers/invite_members_helper.rb
@@ -20,30 +20,17 @@ module InviteMembersHelper
end
end
- def group_select_data(group)
- # This should only be used for groups to load the invite group modal.
- # For instance the invite groups modal should not call this from a project scope
- # this is only to be called in scope of a group context as noted in this thread
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79036#note_821465513
- # the group sharing in projects disabling is explained there as well
- if group.root_ancestor.namespace_settings.prevent_sharing_groups_outside_hierarchy
- { groups_filter: 'descendant_groups', parent_id: group.root_ancestor.id }
- else
- {}
- end
- end
-
def common_invite_group_modal_data(source, member_class, is_project)
{
id: source.id,
- root_id: source.root_ancestor&.id,
+ root_id: source.root_ancestor.id,
name: source.name,
default_access_level: Gitlab::Access::GUEST,
invalid_groups: source.related_group_ids,
help_link: help_page_url('user/permissions'),
is_project: is_project,
access_levels: member_class.access_level_roles.to_json
- }
+ }.merge(group_select_data(source))
end
# Overridden in EE
@@ -68,6 +55,14 @@ module InviteMembersHelper
private
+ def group_select_data(source)
+ if source.root_ancestor.prevent_sharing_groups_outside_hierarchy
+ { groups_filter: 'descendant_groups', parent_id: source.root_ancestor.id }
+ else
+ {}
+ end
+ end
+
# Overridden in EE
def users_filter_data(group)
{}
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 98eca3785e7..486d5bb3866 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -13,6 +13,8 @@ module IssuablesHelper
end
def sidebar_gutter_collapsed_class
+ return "right-sidebar-expanded" if moved_mr_sidebar_enabled?
+
"right-sidebar-#{sidebar_gutter_collapsed? ? 'collapsed' : 'expanded'}"
end
@@ -236,6 +238,7 @@ module IssuablesHelper
markdownPreviewPath: preview_markdown_path(parent, target_type: issuable.model_name, target_id: issuable.iid),
markdownDocsPath: help_page_path('user/markdown'),
lockVersion: issuable.lock_version,
+ state: issuable.state,
issuableTemplateNamesPath: template_names_path(parent, issuable),
initialTitleHtml: markdown_field(issuable, :title),
initialTitleText: issuable.title,
@@ -341,14 +344,20 @@ module IssuablesHelper
end
def state_name_with_icon(issuable)
- if issuable.is_a?(MergeRequest) && issuable.merged?
- [_("Merged"), "git-merge"]
- elsif issuable.is_a?(MergeRequest) && issuable.closed?
- [_("Closed"), "close"]
- elsif issuable.closed?
- [_("Closed"), "mobile-issue-close"]
+ if issuable.is_a?(MergeRequest)
+ if issuable.open?
+ [_("Open"), "merge-request-open"]
+ elsif issuable.merged?
+ [_("Merged"), "merge"]
+ else
+ [_("Closed"), "merge-request-close"]
+ end
else
- [_("Open"), "issue-open-m"]
+ if issuable.open?
+ [_("Open"), "issues"]
+ else
+ [_("Closed"), "issue-closed"]
+ end
end
end
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index c8c9ea32184..04de77dd484 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -28,16 +28,18 @@ module IssuesHelper
end
def status_box_class(item)
+ updated_mr_header_enabled = Feature.enabled?(:updated_mr_header, @project)
+
if item.try(:expired?)
'status-box-expired'
elsif item.try(:merged?)
- 'status-box-mr-merged'
+ updated_mr_header_enabled ? 'badge-info' : 'status-box-mr-merged'
elsif item.closed?
- 'status-box-mr-closed'
+ item.is_a?(MergeRequest) && updated_mr_header_enabled ? 'badge-danger' : 'status-box-mr-closed'
elsif item.try(:upcoming?)
'status-box-upcoming'
else
- 'status-box-open'
+ item.is_a?(MergeRequest) && updated_mr_header_enabled ? 'badge-success' : 'status-box-open'
end
end
@@ -63,7 +65,7 @@ module IssuesHelper
end
def issue_hidden?(issue)
- Feature.enabled?(:ban_user_feature_flag, default_enabled: :yaml) && issue.hidden?
+ Feature.enabled?(:ban_user_feature_flag) && issue.hidden?
end
def hidden_issue_icon(issue)
@@ -152,7 +154,7 @@ module IssuesHelper
end
def issue_closed_text(issue, current_user)
- link = issue_closed_link(issue, current_user, css_class: 'text-white text-underline')
+ link = issue_closed_link(issue, current_user, css_class: 'text-underline gl-reset-color!')
if link
s_('IssuableStatus|Closed (%{link})').html_safe % { link: link }
@@ -202,6 +204,8 @@ module IssuesHelper
initial_sort: current_user&.user_preference&.issues_sort,
is_anonymous_search_disabled: Feature.enabled?(:disable_anonymous_search, type: :ops).to_s,
is_issue_repositioning_disabled: issue_repositioning_disabled?.to_s,
+ is_public_visibility_restricted:
+ Gitlab::CurrentSettings.restricted_visibility_levels.include?(Gitlab::VisibilityLevel::PUBLIC).to_s,
is_signed_in: current_user.present?.to_s,
jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'),
rss_path: url_for(safe_params.merge(rss_url_options)),
diff --git a/app/helpers/jira_connect_helper.rb b/app/helpers/jira_connect_helper.rb
index 67b85b26f9e..30f29e002b8 100644
--- a/app/helpers/jira_connect_helper.rb
+++ b/app/helpers/jira_connect_helper.rb
@@ -7,7 +7,8 @@ module JiraConnectHelper
{
groups_path: api_v4_groups_path(params: { min_access_level: Gitlab::Access::MAINTAINER, skip_groups: skip_groups }),
subscriptions: subscriptions.map { |s| serialize_subscription(s) }.to_json,
- subscriptions_path: jira_connect_subscriptions_path,
+ add_subscriptions_path: jira_connect_subscriptions_path,
+ subscriptions_path: jira_connect_subscriptions_path(format: :json),
users_path: current_user ? nil : jira_connect_users_path, # users_path is used to determine if user is signed in
gitlab_user_path: current_user ? user_path(current_user) : nil,
oauth_metadata: Feature.enabled?(:jira_connect_oauth, current_user) ? jira_connect_oauth_data.to_json : nil
diff --git a/app/helpers/lazy_image_tag_helper.rb b/app/helpers/lazy_image_tag_helper.rb
index d0bdaaae5f8..10d603ef5d3 100644
--- a/app/helpers/lazy_image_tag_helper.rb
+++ b/app/helpers/lazy_image_tag_helper.rb
@@ -8,8 +8,11 @@ module LazyImageTagHelper
end
# Override the default ActionView `image_tag` helper to support lazy-loading
+ # accept :auto_dark boolean to enable automatic dark variant of the image
+ # (see: https://gitlab.com/gitlab-org/gitlab-ui/-/merge_requests/2698)
+ # accept :dark_variant path to be used as a source when dark mode is enabled
def image_tag(source, options = {})
- source = options[:dark_variant] if options[:dark_variant] && user_application_dark_mode?
+ source, options = prepare_dark_variant(source, options)
options = options.symbolize_keys
unless options.delete(:lazy) == false
@@ -29,4 +32,25 @@ module LazyImageTagHelper
# Required for Banzai::Filter::ImageLazyLoadFilter
module_function :placeholder_image # rubocop: disable Style/AccessModifierDeclarations
+
+ private
+
+ def prepare_dark_variant(source, options)
+ dark_variant = options.delete(:dark_variant)
+ auto_dark = options.delete(:auto_dark)
+
+ if dark_variant && auto_dark
+ raise ArgumentError, "dark_variant and auto_dark are mutually exclusive"
+ end
+
+ if (auto_dark || dark_variant) && user_application_dark_mode?
+ if auto_dark
+ options[:class] = 'gl-dark-invert-keep-hue'
+ elsif dark_variant
+ source = dark_variant
+ end
+ end
+
+ [source, options]
+ end
end
diff --git a/app/helpers/learn_gitlab_helper.rb b/app/helpers/learn_gitlab_helper.rb
index 60f3b12d736..890f7f099df 100644
--- a/app/helpers/learn_gitlab_helper.rb
+++ b/app/helpers/learn_gitlab_helper.rb
@@ -34,7 +34,8 @@ module LearnGitlabHelper
action,
url: url,
completed: attributes[OnboardingProgress.column_name(action)].present?,
- svg: image_path("learn_gitlab/#{action}.svg")
+ svg: image_path("learn_gitlab/#{action}.svg"),
+ enabled: true
]
end
end
diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb
index 2d93813d5ee..e1c9e7d3896 100644
--- a/app/helpers/merge_requests_helper.rb
+++ b/app/helpers/merge_requests_helper.rb
@@ -156,7 +156,7 @@ module MergeRequestsHelper
total: total_count
}
- if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+ if current_user&.mr_attention_requests_enabled?
attention_requested_count = attention_requested_merge_requests_count
counts[:attention_requested_count] = attention_requested_count
@@ -206,6 +206,19 @@ module MergeRequestsHelper
api_v4_projects_merge_requests_award_emoji_path(id: merge_request.project.id, merge_request_iid: merge_request.iid)
end
+ def how_merge_modal_data(merge_request)
+ {
+ is_fork: merge_request.for_fork?.to_s,
+ can_merge: merge_request.can_be_merged_by?(current_user).to_s,
+ source_branch: merge_request.source_branch,
+ source_project_path: merge_request.source_project&.path,
+ source_project_full_path: merge_request.source_project&.full_path,
+ source_project_default_url: merge_request.source_project && default_url_to_repo(merge_request.source_project),
+ target_branch: merge_request.target_branch,
+ reviewing_docs_path: help_page_path('user/project/merge_requests/reviews/index.md', anchor: "checkout-merge-requests-locally-through-the-head-ref")
+ }
+ end
+
private
def review_requested_merge_requests_count
@@ -219,6 +232,34 @@ module MergeRequestsHelper
def default_suggestion_commit_message
@project.suggestion_commit_message.presence || Gitlab::Suggestions::CommitMessage::DEFAULT_SUGGESTION_COMMIT_MESSAGE
end
+
+ def merge_request_source_branch(merge_request)
+ branch = if merge_request.for_fork?
+ "#{merge_request.source_project_path}:#{merge_request.source_branch}"
+ else
+ merge_request.source_branch
+ end
+
+ branch_path = if merge_request.source_project
+ project_tree_path(merge_request.source_project, merge_request.source_branch)
+ else
+ ''
+ end
+
+ link_to branch, branch_path, title: branch, class: 'gl-link gl-font-monospace gl-bg-blue-50 gl-rounded-base gl-font-sm gl-px-2 gl-display-inline-block gl-text-truncate gl-max-w-26 gl-mb-n2'
+ end
+
+ def merge_request_header(project, merge_request)
+ link_to_author = link_to_member(project, merge_request.author, size: 24, extra_class: 'gl-font-weight-bold', avatar: false)
+ copy_button = clipboard_button(text: merge_request.source_branch, title: _('Copy branch name'), class: 'btn btn-default btn-sm gl-button btn-default-tertiary btn-icon gl-display-none! gl-md-display-inline-block! js-source-branch-copy')
+ target_branch = link_to merge_request.target_branch, project_tree_path(merge_request.target_project, merge_request.target_branch), title: merge_request.target_branch, class: 'gl-link gl-font-monospace gl-bg-blue-50 gl-rounded-base gl-font-sm gl-px-2 gl-display-inline-block gl-text-truncate gl-max-w-26 gl-mb-n2'
+
+ _('%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}').html_safe % { author: link_to_author.html_safe, source_branch: merge_request_source_branch(merge_request).html_safe, copy_button: copy_button.html_safe, target_branch: target_branch.html_safe, created_at: time_ago_with_tooltip(merge_request.created_at, html_class: 'gl-display-inline-block').html_safe }
+ end
+
+ def moved_mr_sidebar_enabled?
+ Feature.enabled?(:moved_mr_sidebar, @project) && defined?(@merge_request)
+ end
end
MergeRequestsHelper.prepend_mod_with('MergeRequestsHelper')
diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb
index cf386ee398a..a50629b7996 100644
--- a/app/helpers/namespaces_helper.rb
+++ b/app/helpers/namespaces_helper.rb
@@ -88,11 +88,12 @@ module NamespacesHelper
}.to_json
end
- def pipeline_usage_quota_app_data(namespace)
+ def pipeline_usage_app_data(namespace)
{
namespace_actual_plan_name: namespace.actual_plan_name,
namespace_path: namespace.full_path,
namespace_id: namespace.id,
+ user_namespace: namespace.user_namespace?.to_s,
page_size: page_size
}
end
diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb
index 1c4d294baa7..37cd491e19f 100644
--- a/app/helpers/nav_helper.rb
+++ b/app/helpers/nav_helper.rb
@@ -19,11 +19,13 @@ module NavHelper
end
def page_gutter_class
+ moved_sidebar_enabled = current_controller?('merge_requests') && moved_mr_sidebar_enabled?
+
if page_has_markdown?
if cookies[:collapsed_gutter] == 'true'
- %w[page-gutter right-sidebar-collapsed]
+ ["page-gutter", "#{'right-sidebar-collapsed' unless moved_sidebar_enabled}"]
else
- %w[page-gutter right-sidebar-expanded]
+ ["page-gutter", "#{'right-sidebar-expanded' unless moved_sidebar_enabled}"]
end
elsif current_path?('jobs#show')
%w[page-gutter build-sidebar right-sidebar-expanded]
@@ -56,7 +58,7 @@ module NavHelper
end
def admin_monitoring_nav_links
- %w(system_info background_migrations background_jobs health_check requests_profiles)
+ %w(system_info background_migrations background_jobs health_check)
end
def admin_analytics_nav_links
diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb
index fb74a52fcda..0c057a29bec 100644
--- a/app/helpers/page_layout_helper.rb
+++ b/app/helpers/page_layout_helper.rb
@@ -55,7 +55,7 @@ module PageLayoutHelper
end
def page_image
- default = image_url('gitlab_logo.png')
+ default = image_url('twitter_card.jpg')
subject = @project || @user || @group
diff --git a/app/helpers/personal_access_tokens_helper.rb b/app/helpers/personal_access_tokens_helper.rb
deleted file mode 100644
index 5cc8d21096f..00000000000
--- a/app/helpers/personal_access_tokens_helper.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-module PersonalAccessTokensHelper
- def personal_access_token_expiration_enforced?
- false
- end
-end
diff --git a/app/helpers/profiles_helper.rb b/app/helpers/profiles_helper.rb
index 0d514773891..20d0dd9b30c 100644
--- a/app/helpers/profiles_helper.rb
+++ b/app/helpers/profiles_helper.rb
@@ -53,13 +53,11 @@ module ProfilesHelper
# Overridden in EE::ProfilesHelper#ssh_key_expiration_tooltip
def ssh_key_expiration_tooltip(key)
return key.errors.full_messages.join(', ') if key.errors.full_messages.any?
-
- s_('Profiles|Key usable beyond expiration date.') if key.expired?
end
# Overridden in EE::ProfilesHelper#ssh_key_expires_field_description
def ssh_key_expires_field_description
- s_('Profiles|Key can still be used after expiration.')
+ s_('Profiles|Key becomes invalid on this date.')
end
# Overridden in EE::ProfilesHelper#ssh_key_expiration_policy_enabled?
diff --git a/app/helpers/projects/pipeline_helper.rb b/app/helpers/projects/pipeline_helper.rb
index 185632a49b5..286026bc290 100644
--- a/app/helpers/projects/pipeline_helper.rb
+++ b/app/helpers/projects/pipeline_helper.rb
@@ -7,6 +7,7 @@ module Projects
can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
+ pipeline_iid: pipeline.iid,
pipeline_project_path: project.full_path
}
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 21c7a54670c..c3f22dc7693 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -212,7 +212,7 @@ module ProjectsHelper
end
def no_password_message
- push_pull_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('gitlab-basics/start-using-git', anchor: 'pull-and-push') }
+ push_pull_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('topics/git/terminology', anchor: 'pull-and-push') }
clone_with_https_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('gitlab-basics/start-using-git', anchor: 'clone-with-https') }
set_password_link_start = '<a href="%{url}">'.html_safe % { url: edit_profile_password_path }
set_up_pat_link_start = '<a href="%{url}">'.html_safe % { url: profile_personal_access_tokens_path }
@@ -379,7 +379,7 @@ module ProjectsHelper
end
def show_terraform_banner?(project)
- Feature.enabled?(:show_terraform_banner, type: :ops, default_enabled: true) && project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
+ Feature.enabled?(:show_terraform_banner, type: :ops) && project.repository_languages.with_programming_language('HCL').exists? && project.terraform_states.empty?
end
def project_permissions_panel_data(project)
@@ -614,6 +614,7 @@ module ProjectsHelper
operationsAccessLevel: feature.operations_access_level,
showDefaultAwardEmojis: project.show_default_award_emojis?,
warnAboutPotentiallyUnwantedCharacters: project.warn_about_potentially_unwanted_characters?,
+ enforceAuthChecksOnUploads: project.enforce_auth_checks_on_uploads?,
securityAndComplianceAccessLevel: project.security_and_compliance_access_level,
containerRegistryAccessLevel: feature.container_registry_access_level
}
diff --git a/app/helpers/releases_helper.rb b/app/helpers/releases_helper.rb
index 4fa61191ba5..a516ac85131 100644
--- a/app/helpers/releases_helper.rb
+++ b/app/helpers/releases_helper.rb
@@ -12,7 +12,7 @@ module ReleasesHelper
image_path(IMAGE_PATH)
end
- def help_page(anchor: nil)
+ def releases_help_page_path(anchor: nil)
help_page_path(DOCUMENTATION_PATH, anchor: anchor)
end
@@ -21,7 +21,7 @@ module ReleasesHelper
project_id: @project.id,
project_path: @project.full_path,
illustration_path: illustration,
- documentation_path: help_page
+ documentation_path: releases_help_page_path
}.tap do |data|
if can?(current_user, :create_release, @project)
data[:new_release_path] = new_project_release_path(@project)
@@ -78,9 +78,10 @@ module ReleasesHelper
project_path: @project.full_path,
markdown_preview_path: preview_markdown_path(@project),
markdown_docs_path: help_page_path('user/markdown'),
- release_assets_docs_path: help_page(anchor: 'release-assets'),
+ 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)
+ new_milestone_path: new_project_milestone_path(@project),
+ edit_release_docs_path: releases_help_page_path(anchor: 'edit-a-release')
}
end
end
diff --git a/app/helpers/routing/projects_helper.rb b/app/helpers/routing/projects_helper.rb
index 859070d59ec..8c0bd9b1ecc 100644
--- a/app/helpers/routing/projects_helper.rb
+++ b/app/helpers/routing/projects_helper.rb
@@ -35,7 +35,15 @@ module Routing
end
def issue_url(entity, *args)
- project_issue_url(entity.project, entity, *args)
+ if use_work_items_path?(entity)
+ work_item_url(entity, *args)
+ else
+ project_issue_url(entity.project, entity, *args)
+ end
+ end
+
+ def work_item_url(entity, *args)
+ project_work_items_url(entity.project, entity.id, *args)
end
def merge_request_url(entity, *args)
@@ -77,5 +85,11 @@ module Routing
toggle_subscription_project_merge_request_path(entity.project, entity)
end
end
+
+ private
+
+ def use_work_items_path?(issue)
+ issue.issue_type == 'task' && issue.project.work_items_feature_flag_enabled?
+ end
end
end
diff --git a/app/helpers/routing/pseudonymization_helper.rb b/app/helpers/routing/pseudonymization_helper.rb
index 3e5d4ee21c0..eb4e5d1c01c 100644
--- a/app/helpers/routing/pseudonymization_helper.rb
+++ b/app/helpers/routing/pseudonymization_helper.rb
@@ -10,6 +10,8 @@ module Routing
sortDesc
state
tab
+ glm_source
+ glm_content
].freeze
def initialize(request_object, group, project)
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index f8bfc74b344..69bea0abd88 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -374,8 +374,6 @@ module SearchHelper
autocomplete: 'off'
}
- opts[:data]['runner-tags-endpoint'] = tag_list_admin_runners_path
-
if @project.present?
opts[:data]['project-id'] = @project.id
opts[:data]['labels-endpoint'] = project_labels_path(@project)
@@ -445,7 +443,7 @@ module SearchHelper
return false unless can?(current_user, :read_users_list)
return true if @group
- Feature.enabled?(:global_search_users_tab, current_user, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:global_search_users_tab, current_user, type: :ops)
end
def issuable_state_to_badge_class(issuable)
@@ -479,7 +477,7 @@ module SearchHelper
end
def feature_flag_tab_enabled?(flag)
- @group || Feature.enabled?(flag, current_user, type: :ops, default_enabled: true)
+ @group || Feature.enabled?(flag, current_user, type: :ops)
end
end
diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb
index b4ad9db815d..43ec02b6537 100644
--- a/app/helpers/sorting_helper.rb
+++ b/app/helpers/sorting_helper.rb
@@ -250,6 +250,51 @@ module SortingHelper
sort_options_hash[sort_value]
end
+ def issuable_sort_options(viewing_issues, viewing_merge_requests)
+ 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_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) }
+ ]
+
+ 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([relative_position_option]) if viewing_issues
+
+ options.concat([title_option])
+ end
+
+ def due_date_option
+ { value: sort_value_due_date, text: sort_title_due_date, href: page_filter_path(sort: sort_value_due_date) }
+ end
+
+ def popularity_option
+ { value: sort_value_popularity, text: sort_title_popularity, href: page_filter_path(sort: sort_value_popularity) }
+ end
+
+ def label_priority_option
+ { value: sort_value_label_priority, text: sort_title_label_priority, href: page_filter_path(sort: sort_value_label_priority) }
+ end
+
+ def merged_option
+ { 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
+
+ def title_option
+ { value: sort_value_title, text: sort_title_title, href: page_filter_path(sort: sort_value_title) }
+ end
+
def sort_direction_icon(sort_value)
case sort_value
when sort_value_milestone, sort_value_due_date, sort_value_merged_date, sort_value_closed_date, /_asc\z/
diff --git a/app/helpers/storage_helper.rb b/app/helpers/storage_helper.rb
index a075ccc38f5..cb1a5f5ce0c 100644
--- a/app/helpers/storage_helper.rb
+++ b/app/helpers/storage_helper.rb
@@ -32,8 +32,9 @@ module StorageHelper
{
text: html_escape_once(s_("UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. " \
- "View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}.")).html_safe %
- { storage_enforcement_date: namespace.storage_enforcement_date, strong_start: "<strong>".html_safe, strong_end: "</strong>".html_safe, namespace_type: namespace.type },
+ "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}.")).html_safe %
+ { storage_enforcement_date: namespace.storage_enforcement_date, used_storage: storage_counter(namespace.root_storage_statistics&.storage_size || 0), strong_start: "<strong>".html_safe, strong_end: "</strong>".html_safe, namespace_type: namespace.type },
variant: 'warning',
callouts_path: namespace.user_namespace? ? callouts_path : group_callouts_path,
callouts_feature_name: storage_enforcement_banner_user_callouts_feature_name(namespace),
diff --git a/app/helpers/system_note_helper.rb b/app/helpers/system_note_helper.rb
index b45ce10a2f6..82847534d8e 100644
--- a/app/helpers/system_note_helper.rb
+++ b/app/helpers/system_note_helper.rb
@@ -43,7 +43,8 @@ module SystemNoteHelper
'issue_type' => 'pencil-square',
'attention_requested' => 'user',
'attention_request_removed' => 'user',
- 'contact' => 'users'
+ 'contact' => 'users',
+ 'timeline_event' => 'clock'
}.freeze
def system_note_icon_name(note)
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index 60bf79f3114..d3cc922423d 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -17,12 +17,11 @@ module TodosHelper
case todo.action
when Todo::ASSIGNED then todo.self_added? ? 'assigned' : 'assigned you'
when Todo::REVIEW_REQUESTED then 'requested a review of'
- when Todo::MENTIONED then "mentioned #{todo_action_subject(todo)} on"
+ when Todo::MENTIONED, Todo::DIRECTLY_ADDRESSED then "mentioned #{todo_action_subject(todo)} on"
when Todo::BUILD_FAILED then 'The pipeline failed in'
when Todo::MARKED then 'added a todo for'
when Todo::APPROVAL_REQUIRED then "set #{todo_action_subject(todo)} as an approver for"
when Todo::UNMERGEABLE then 'Could not merge'
- when Todo::DIRECTLY_ADDRESSED then "directly addressed #{todo_action_subject(todo)} on"
when Todo::MERGE_TRAIN_REMOVED then "Removed from Merge Train:"
when Todo::ATTENTION_REQUESTED then 'requested your attention on'
end
@@ -151,8 +150,7 @@ module TodosHelper
{ id: Todo::REVIEW_REQUESTED, text: 'Review requested' },
{ id: Todo::MENTIONED, text: 'Mentioned' },
{ id: Todo::MARKED, text: 'Added' },
- { id: Todo::BUILD_FAILED, text: 'Pipelines' },
- { id: Todo::DIRECTLY_ADDRESSED, text: 'Directly addressed' }
+ { id: Todo::BUILD_FAILED, text: 'Pipelines' }
]
end
diff --git a/app/helpers/tracking_helper.rb b/app/helpers/tracking_helper.rb
index 1beb88548c5..9ef57a57d62 100644
--- a/app/helpers/tracking_helper.rb
+++ b/app/helpers/tracking_helper.rb
@@ -2,7 +2,7 @@
module TrackingHelper
def tracking_attrs(label, action, property)
- return {} unless tracking_enabled?
+ return {} unless ::Gitlab::Tracking.enabled?
{
data: {
@@ -16,11 +16,4 @@ module TrackingHelper
def tracking_attrs_data(label, action, property)
tracking_attrs(label, action, property).fetch(:data, {})
end
-
- private
-
- def tracking_enabled?
- Rails.env.production? &&
- ::Gitlab::Tracking.enabled?
- end
end
diff --git a/app/helpers/users/group_callouts_helper.rb b/app/helpers/users/group_callouts_helper.rb
index 9a9fce4d7e3..0aa4eb89499 100644
--- a/app/helpers/users/group_callouts_helper.rb
+++ b/app/helpers/users/group_callouts_helper.rb
@@ -31,5 +31,3 @@ module Users
end
end
end
-
-Users::GroupCalloutsHelper.prepend_mod
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 1247f9ae260..fd460d71867 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -125,7 +125,7 @@ module UsersHelper
end
def ban_feature_available?
- Feature.enabled?(:ban_user_feature_flag, default_enabled: :yaml)
+ Feature.enabled?(:ban_user_feature_flag)
end
def confirm_user_data(user)
diff --git a/app/helpers/workhorse_helper.rb b/app/helpers/workhorse_helper.rb
index 70df696510a..f1ddc2e902e 100644
--- a/app/helpers/workhorse_helper.rb
+++ b/app/helpers/workhorse_helper.rb
@@ -38,6 +38,8 @@ module WorkhorseHelper
# Send an entry from artifacts through Workhorse and set safe content type
def send_artifacts_entry(file, entry)
headers.store(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+ headers.store(*Gitlab::Workhorse.detect_content_type)
+
head :ok
end
diff --git a/app/mailers/emails/in_product_marketing.rb b/app/mailers/emails/in_product_marketing.rb
index 317e1545350..1b46d4841b0 100644
--- a/app/mailers/emails/in_product_marketing.rb
+++ b/app/mailers/emails/in_product_marketing.rb
@@ -21,6 +21,12 @@ module Emails
mail_to(to: email, subject: @message.subject_line)
end
+ def build_ios_app_guide_email(recipient_email)
+ @message = ::Gitlab::Email::Message::BuildIosAppGuide.new
+
+ mail_to(to: recipient_email, subject: @message.subject_line)
+ end
+
private
def mail_to(to:, subject:)
diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb
index 341accaea32..5cbc3c9ef9c 100644
--- a/app/mailers/emails/merge_requests.rb
+++ b/app/mailers/emails/merge_requests.rb
@@ -155,6 +155,20 @@ module Emails
end
end
+ def approved_merge_request_email(recipient_id, merge_request_id, approved_by_user_id, reason = nil)
+ setup_merge_request_mail(merge_request_id, recipient_id)
+
+ @approved_by = User.find(approved_by_user_id)
+ mail_answer_thread(@merge_request, merge_request_thread_options(approved_by_user_id, reason))
+ end
+
+ def unapproved_merge_request_email(recipient_id, merge_request_id, unapproved_by_user_id, reason = nil)
+ setup_merge_request_mail(merge_request_id, recipient_id)
+
+ @unapproved_by = User.find(unapproved_by_user_id)
+ mail_answer_thread(@merge_request, merge_request_thread_options(unapproved_by_user_id, reason))
+ end
+
private
def setup_merge_request_mail(merge_request_id, recipient_id, present: false)
diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb
index 14c724b5b91..efc6ce163c0 100644
--- a/app/mailers/emails/projects.rb
+++ b/app/mailers/emails/projects.rb
@@ -68,6 +68,20 @@ module Emails
mail(to: user.notification_email_for(@project.group), subject: subject(subject_text))
end
+ def inactive_project_deletion_warning_email(project, user, deletion_date)
+ @project = project
+ @user = user
+ @deletion_date = deletion_date
+ subject_text = "Action required: Project #{project.name} is scheduled to be deleted on " \
+ "#{deletion_date} due to inactivity"
+
+ mail(to: user.notification_email_for(project.group),
+ subject: subject(subject_text)) do |format|
+ format.html { render layout: 'mailer' }
+ format.text { render layout: 'mailer' }
+ end
+ end
+
private
def add_alert_headers
diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb
index e7c8964a733..60d59465165 100644
--- a/app/mailers/previews/notify_preview.rb
+++ b/app/mailers/previews/notify_preview.rb
@@ -201,6 +201,10 @@ class NotifyPreview < ActionMailer::Preview
Notify.merge_when_pipeline_succeeds_email(user.id, merge_request.id, user.id).message
end
+ def inactive_project_deletion_warning
+ Notify.inactive_project_deletion_warning_email(project, user, '2022-04-22').message
+ end
+
private
def project
diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb
index 1ec3cb62c76..9f05c87018d 100644
--- a/app/models/alert_management/alert.rb
+++ b/app/models/alert_management/alert.rb
@@ -81,7 +81,6 @@ module AlertManagement
scope :search, -> (query) { fuzzy_search(query, [:title, :description, :monitoring_tool, :service]) }
scope :not_resolved, -> { without_status(:resolved) }
scope :with_prometheus_alert, -> { includes(:prometheus_alert) }
- scope :with_threat_monitoring_alerts, -> { where(domain: :threat_monitoring ) }
scope :with_operations_alerts, -> { where(domain: :operations) }
scope :order_start_time, -> (sort_order) { order(started_at: sort_order) }
@@ -119,6 +118,10 @@ module AlertManagement
end
end
+ def self.find_unresolved_alert(project, fingerprint)
+ for_fingerprint(project, fingerprint).not_resolved.take
+ end
+
def self.last_prometheus_alert_by_project_id
ids = select(arel_table[:id].maximum).group(:project_id)
with_prometheus_alert.where(id: ids)
@@ -143,10 +146,6 @@ module AlertManagement
reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE
end
- def metric_images_available?
- ::AlertManagement::MetricImage.available_for?(project)
- end
-
def prometheus?
monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
end
diff --git a/app/models/alert_management/metric_image.rb b/app/models/alert_management/metric_image.rb
index 8175a31be7a..4ed28c3b1eb 100644
--- a/app/models/alert_management/metric_image.rb
+++ b/app/models/alert_management/metric_image.rb
@@ -7,10 +7,6 @@ module AlertManagement
belongs_to :alert, class_name: 'AlertManagement::Alert', foreign_key: 'alert_id', inverse_of: :metric_images
- def self.available_for?(project)
- true
- end
-
private
def local_path
diff --git a/app/models/analytics/cycle_analytics/aggregation.rb b/app/models/analytics/cycle_analytics/aggregation.rb
index 2c04e67a04b..2e58d64ae95 100644
--- a/app/models/analytics/cycle_analytics/aggregation.rb
+++ b/app/models/analytics/cycle_analytics/aggregation.rb
@@ -26,6 +26,14 @@ class Analytics::CycleAnalytics::Aggregation < ApplicationRecord
}.compact
end
+ def consistency_check_cursor_for(model)
+ {
+ :start_event_timestamp => self["last_consistency_check_#{model.issuable_model.table_name}_start_event_timestamp"],
+ :end_event_timestamp => self["last_consistency_check_#{model.issuable_model.table_name}_end_event_timestamp"],
+ model.issuable_id_column => self["last_consistency_check_#{model.issuable_model.table_name}_issuable_id"]
+ }.compact
+ end
+
def refresh_last_run(mode)
self["last_#{mode}_run_at"] = Time.current
end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 7cd2fe705e3..6afd8875ad3 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -12,6 +12,9 @@ class ApplicationSetting < ApplicationRecord
ignore_columns %i[static_objects_external_storage_auth_token], remove_with: '14.9', remove_after: '2022-03-22'
ignore_column %i[max_package_files_for_package_destruction], remove_with: '14.9', remove_after: '2022-03-22'
ignore_column :user_email_lookup_limit, remove_with: '15.0', remove_after: '2022-04-18'
+ ignore_column :pseudonymizer_enabled, remove_with: '15.1', remove_after: '2022-06-22'
+ ignore_column :enforce_ssh_key_expiration, remove_with: '15.2', remove_after: '2022-07-22'
+ ignore_column :enforce_pat_expiration, remove_with: '15.2', remove_after: '2022-07-22'
INSTANCE_REVIEW_MIN_USERS = 50
GRAFANA_URL_ERROR_MESSAGE = 'Please check your Grafana URL setting in ' \
@@ -199,6 +202,10 @@ class ApplicationSetting < ApplicationRecord
presence: true,
numericality: { only_integer: true, greater_than: 0 }
+ validates :max_export_size,
+ presence: true,
+ numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+
validates :max_import_size,
presence: true,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
@@ -370,6 +377,8 @@ class ApplicationSetting < ApplicationRecord
:container_registry_import_max_retries,
:container_registry_import_start_max_retries,
:container_registry_import_max_step_duration,
+ :container_registry_pre_import_timeout,
+ :container_registry_import_timeout,
allow_nil: false,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
@@ -480,6 +489,9 @@ class ApplicationSetting < ApplicationRecord
validates :raw_blob_request_limit,
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+ validates :pipeline_limit_per_project_user_sha,
+ numericality: { only_integer: true, greater_than_or_equal_to: 0 }
+
validates :ci_jwt_signing_key,
rsa_key: true, allow_nil: true
@@ -613,6 +625,7 @@ class ApplicationSetting < ApplicationRecord
attr_encrypted :recaptcha_private_key, encryption_options_base_32_aes_256_gcm
attr_encrypted :recaptcha_site_key, encryption_options_base_32_aes_256_gcm
attr_encrypted :slack_app_secret, encryption_options_base_32_aes_256_gcm
+ attr_encrypted :slack_app_signing_secret, encryption_options_base_32_aes_256_gcm.merge(encode: false, encode_iv: false)
attr_encrypted :slack_app_verification_token, encryption_options_base_32_aes_256_gcm
attr_encrypted :ci_jwt_signing_key, encryption_options_base_32_aes_256_gcm
attr_encrypted :customers_dot_jwt_signing_key, encryption_options_base_32_aes_256_gcm
@@ -638,6 +651,7 @@ class ApplicationSetting < ApplicationRecord
reset_memoized_terms
end
after_commit :expire_performance_bar_allowed_user_ids_cache, if: -> { previous_changes.key?('performance_bar_allowed_group_id') }
+ after_commit :reset_deletion_warning_redis_key, if: :saved_change_to_inactive_projects_delete_after_months?
def validate_grafana_url
validate_url(parsed_grafana_url, :grafana_url, GRAFANA_URL_ERROR_MESSAGE)
@@ -768,6 +782,10 @@ class ApplicationSetting < ApplicationRecord
)
end
end
+
+ def reset_deletion_warning_redis_key
+ Gitlab::InactiveProjectsDeletionWarningTracker.reset_all
+ end
end
ApplicationSetting.prepend_mod_with('ApplicationSetting')
diff --git a/app/models/application_setting_implementation.rb b/app/models/application_setting_implementation.rb
index 194356acc51..a54dc4f691d 100644
--- a/app/models/application_setting_implementation.rb
+++ b/app/models/application_setting_implementation.rb
@@ -108,6 +108,7 @@ module ApplicationSettingImplementation
mailgun_events_enabled: false,
max_artifacts_size: Settings.artifacts['max_size'],
max_attachment_size: Settings.gitlab['max_attachment_size'],
+ max_export_size: 0,
max_import_size: 0,
max_yaml_size_bytes: 1.megabyte,
max_yaml_depth: 100,
@@ -223,6 +224,8 @@ module ApplicationSettingImplementation
container_registry_import_max_retries: 3,
container_registry_import_start_max_retries: 50,
container_registry_import_max_step_duration: 5.minutes,
+ container_registry_pre_import_timeout: 30.minutes,
+ container_registry_import_timeout: 10.minutes,
container_registry_import_target_plan: 'free',
container_registry_import_created_before: '2022-01-23 00:00:00',
kroki_enabled: false,
diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb
index b255c774347..1f921c71984 100644
--- a/app/models/broadcast_message.rb
+++ b/app/models/broadcast_message.rb
@@ -131,7 +131,7 @@ class BroadcastMessage < ApplicationRecord
end
def matches_current_user_access_level?(user_access_level)
- return false if target_access_levels.present? && Feature.disabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+ return false if target_access_levels.present? && Feature.disabled?(:role_targeted_broadcast_messages)
return true unless target_access_levels.present?
target_access_levels.include? user_access_level
diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb
index ff444ddefa3..a06b920342c 100644
--- a/app/models/ci/bridge.rb
+++ b/app/models/ci/bridge.rb
@@ -57,6 +57,14 @@ module Ci
end
end
+ def retryable?
+ return false unless Feature.enabled?(:ci_recreate_downstream_pipeline, project)
+
+ return false if failed? && (pipeline_loop_detected? || reached_max_descendant_pipelines_depth?)
+
+ super
+ end
+
def self.with_preloads
preload(
:metadata,
@@ -65,8 +73,11 @@ module Ci
)
end
- def retryable?
- false
+ def self.clone_accessors
+ %i[pipeline project ref tag options name
+ allow_failure stage stage_id stage_idx
+ yaml_variables when description needs_attributes
+ scheduling_type].freeze
end
def inherit_status_from_downstream!(pipeline)
@@ -204,7 +215,7 @@ module Ci
end
def downstream_variables
- if ::Feature.enabled?(:ci_trigger_forward_variables, project, default_enabled: :yaml)
+ if ::Feature.enabled?(:ci_trigger_forward_variables, project)
calculate_downstream_variables
.reverse # variables priority
.uniq { |var| var[:key] } # only one variable key to pass
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index a8ad55fd5a4..eea8086d71d 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -45,6 +45,7 @@ module Ci
has_one :runtime_metadata, class_name: 'Ci::RunningBuild', foreign_key: :build_id
has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id, inverse_of: :build
has_many :report_results, class_name: 'Ci::BuildReportResult', inverse_of: :build
+ has_one :namespace, through: :project
# Projects::DestroyService destroys Ci::Pipelines, which use_fast_destroy on :job_artifacts
# before we delete builds. By doing this, the relation should be empty and not fire any
@@ -74,6 +75,7 @@ module Ci
delegate :gitlab_deploy_token, to: :project
delegate :harbor_integration, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true
+ delegate :ensure_persistent_ref, to: :pipeline
##
# Since Gitlab 11.5, deployments records started being created right after
@@ -325,7 +327,7 @@ module Ci
after_transition pending: :running do |build|
build.run_after_commit do
- build.pipeline.persistent_ref.create
+ build.ensure_persistent_ref
BuildHooksWorker.perform_async(id)
end
@@ -335,7 +337,7 @@ module Ci
build.run_after_commit do
build.run_status_commit_hooks!
- if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project, default_enabled: :yaml)
+ if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project)
Ci::BuildFinishedWorker.perform_async(id)
else
::BuildFinishedWorker.perform_async(id)
@@ -504,7 +506,7 @@ module Ci
if metadata&.expanded_environment_name.present?
metadata.expanded_environment_name
else
- if ::Feature.enabled?(:ci_expand_environment_name_and_url, project, default_enabled: :yaml)
+ if ::Feature.enabled?(:ci_expand_environment_name_and_url, project)
ExpandVariables.expand(environment, -> { simple_variables.sort_and_expand_all })
else
ExpandVariables.expand(environment, -> { simple_variables })
@@ -675,7 +677,7 @@ module Ci
end
def has_archived_trace?
- trace.archived_trace_exist?
+ trace.archived?
end
def artifacts_file
@@ -752,7 +754,7 @@ module Ci
end
def valid_token?(token)
- self.token && ActiveSupport::SecurityUtils.secure_compare(token, self.token)
+ self.token && token.present? && ActiveSupport::SecurityUtils.secure_compare(token, self.token)
end
# acts_as_taggable uses this method create/remove tags with contexts
@@ -823,7 +825,6 @@ module Ci
end
end
- # and use that for `ExpireBuildInstanceArtifactsWorker`?
def erase_erasable_artifacts!
job_artifacts.erasable.destroy_all # rubocop: disable Cop/DestroyAll
end
@@ -884,10 +885,6 @@ module Ci
job_artifacts.find_by(file_type: file_types_ids)&.file
end
- def coverage_regex
- super || project.try(:build_coverage_regex)
- end
-
def steps
[Gitlab::Ci::Build::Step.from_commands(self),
Gitlab::Ci::Build::Step.from_release(self),
@@ -911,6 +908,8 @@ module Ci
end
end
+ return cache unless project.ci_separated_caches
+
type_suffix = pipeline.protected_ref? ? 'protected' : 'non_protected'
cache.map do |entry|
entry.merge(key: "#{entry[:key]}-#{type_suffix}")
@@ -1224,7 +1223,7 @@ module Ci
def job_jwt_variables
Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables unless Feature.enabled?(:ci_job_jwt, project, default_enabled: true)
+ break variables unless Feature.enabled?(:ci_job_jwt, project)
jwt = Gitlab::Ci::Jwt.for_build(self)
jwt_v2 = Gitlab::Ci::JwtV2.for_build(self)
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index ca68989002c..4ee661d89f4 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -38,7 +38,7 @@ module Ci
job_timeout_source: 4
}
- ignore_columns :runner_features, remove_with: '14.7', remove_after: '2021-11-22'
+ ignore_columns :runner_features, remove_with: '15.1', remove_after: '2022-05-22'
def update_timeout_state
timeout = timeout_with_highest_precedence
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index dff8bb89021..c831ef12501 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -45,7 +45,7 @@ module Ci
dotenv: '.env',
cobertura: 'cobertura-coverage.xml',
terraform: 'tfplan.json',
- cluster_applications: 'gl-cluster-applications.json', # DEPRECATED: https://gitlab.com/gitlab-org/gitlab/-/issues/333441
+ cluster_applications: 'gl-cluster-applications.json', # DEPRECATED: https://gitlab.com/gitlab-org/gitlab/-/issues/361094
requirements: 'requirements.json',
coverage_fuzzing: 'gl-coverage-fuzzing.json',
api_fuzzing: 'gl-api-fuzzing-report.json'
@@ -64,7 +64,7 @@ module Ci
network_referee: :gzip,
dotenv: :gzip,
cobertura: :gzip,
- cluster_applications: :gzip,
+ cluster_applications: :gzip, # DEPRECATED: https://gitlab.com/gitlab-org/gitlab/-/issues/361094
lsif: :zip,
# Security reports and license scanning reports are raw artifacts
@@ -187,7 +187,6 @@ module Ci
scope :downloadable, -> { where(file_type: DOWNLOADABLE_TYPES) }
scope :unlocked, -> { joins(job: :pipeline).merge(::Ci::Pipeline.unlocked) }
scope :order_expired_asc, -> { order(expire_at: :asc) }
- scope :order_expired_desc, -> { order(expire_at: :desc) }
scope :with_destroy_preloads, -> { includes(project: [:route, :statistics]) }
scope :for_project, ->(project) { where(project_id: project) }
@@ -323,12 +322,12 @@ module Ci
end
end
- def archived_trace_exists?
+ def stored?
file&.file&.exists?
end
def self.archived_trace_exists_for?(job_id)
- where(job_id: job_id).trace.take&.archived_trace_exists?
+ where(job_id: job_id).trace.take&.stored?
end
def self.max_artifact_size(type:, project:)
diff --git a/app/models/ci/namespace_settings.rb b/app/models/ci/namespace_settings.rb
new file mode 100644
index 00000000000..d519a48311f
--- /dev/null
+++ b/app/models/ci/namespace_settings.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+# CI::NamespaceSettings mixin
+#
+# This module is intended to encapsulate CI/CD settings-specific logic
+# and be prepended in the `Namespace` model
+module Ci
+ module NamespaceSettings
+ # Overridden in EE::Namespace
+ def allow_stale_runner_pruning?
+ false
+ end
+
+ # Overridden in EE::Namespace
+ def allow_stale_runner_pruning=(_value)
+ raise NotImplementedError
+ end
+ end
+end
diff --git a/app/models/ci/pending_build.rb b/app/models/ci/pending_build.rb
index 41dc74ef050..d900a056242 100644
--- a/app/models/ci/pending_build.rb
+++ b/app/models/ci/pending_build.rb
@@ -31,7 +31,7 @@ module Ci
end
def maintain_denormalized_data?
- ::Feature.enabled?(:ci_pending_builds_maintain_denormalized_data, default_enabled: :yaml)
+ ::Feature.enabled?(:ci_pending_builds_maintain_denormalized_data)
end
private
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 2d0479e02a3..c10069382f2 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -36,10 +36,10 @@ module Ci
# Ci::CreatePipelineService returns Ci::Pipeline so this is the only place
# where we can pass additional information from the service. This accessor
- # is used for storing the processed CI YAML contents for linting purposes.
+ # is used for storing the processed metadata for linting purposes.
# There is an open issue to address this:
# https://gitlab.com/gitlab-org/gitlab/-/issues/259010
- attr_accessor :merged_yaml
+ attr_accessor :config_metadata
# This is used to retain access to the method defined by `Ci::HasRef`
# before being overridden in this class.
@@ -198,7 +198,7 @@ module Ci
# Create a separate worker for each new operation
before_transition [:created, :waiting_for_resource, :preparing, :pending] => :running do |pipeline|
- pipeline.started_at = Time.current
+ pipeline.started_at ||= Time.current
end
before_transition any => [:success, :failed, :canceled] do |pipeline|
@@ -253,8 +253,6 @@ module Ci
after_transition any => ::Ci::Pipeline.completed_statuses do |pipeline|
pipeline.run_after_commit do
- pipeline.persistent_ref.delete
-
pipeline.all_merge_requests.each do |merge_request|
next unless merge_request.auto_merge_enabled?
@@ -288,6 +286,12 @@ module Ci
end
end
+ after_transition any => ::Ci::Pipeline.stopped_statuses do |pipeline|
+ pipeline.run_after_commit do
+ pipeline.persistent_ref.delete
+ end
+ end
+
after_transition any => [:success, :failed] do |pipeline|
ref_status = pipeline.ci_ref&.update_status_by!(pipeline)
@@ -336,7 +340,7 @@ module Ci
scope :with_only_interruptible_builds, -> do
where('NOT EXISTS (?)',
Ci::Build.where('ci_builds.commit_id = ci_pipelines.id')
- .with_status(:running, :success, :failed)
+ .with_status(STARTED_STATUSES)
.not_interruptible
)
end
@@ -978,7 +982,7 @@ module Ci
end
# With multi-project and parent-child pipelines
- def self_with_upstreams_and_downstreams
+ def all_pipelines_in_hierarchy
object_hierarchy.all_objects
end
@@ -992,6 +996,7 @@ module Ci
object_hierarchy(project_condition: :same).base_and_descendants
end
+ # Follow the parent-child relationships and return the top-level parent
def root_ancestor
return self unless child?
@@ -1000,6 +1005,12 @@ module Ci
.first
end
+ # Follow the upstream pipeline relationships, regardless of multi-project or
+ # parent-child, and return the top-level ancestor.
+ def upstream_root
+ object_hierarchy.base_and_ancestors(hierarchy_order: :desc).first
+ end
+
def bridge_triggered?
source_bridge.present?
end
@@ -1257,6 +1268,12 @@ module Ci
self.ci_ref = Ci::Ref.ensure_for(self)
end
+ def ensure_persistent_ref
+ return if persistent_ref.exist?
+
+ persistent_ref.create
+ end
+
def reset_source_bridge!(current_user)
return unless bridge_waiting?
@@ -1271,10 +1288,11 @@ module Ci
def security_reports(report_types: [])
reports_scope = report_types.empty? ? ::Ci::JobArtifact.security_reports : ::Ci::JobArtifact.security_reports(file_types: report_types)
+ types_to_collect = report_types.empty? ? ::Ci::JobArtifact::SECURITY_REPORT_FILE_TYPES : report_types
::Gitlab::Ci::Reports::Security::Reports.new(self).tap do |security_reports|
latest_report_builds(reports_scope).each do |build|
- build.collect_security_reports!(security_reports)
+ build.collect_security_reports!(security_reports, report_types: types_to_collect)
end
end
end
diff --git a/app/models/ci/processable.rb b/app/models/ci/processable.rb
index d79ff74753a..f666629c8fd 100644
--- a/app/models/ci/processable.rb
+++ b/app/models/ci/processable.rb
@@ -101,6 +101,21 @@ module Ci
:merge_train_pipeline?,
to: :pipeline
+ def clone(current_user:)
+ new_attributes = self.class.clone_accessors.to_h do |attribute|
+ [attribute, public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
+ end
+
+ if persisted_environment.present?
+ new_attributes[:metadata_attributes] ||= {}
+ new_attributes[:metadata_attributes][:expanded_environment_name] = expanded_environment_name
+ end
+
+ new_attributes[:user] = current_user
+
+ self.class.new(new_attributes)
+ end
+
def retryable?
return false if retried? || archived? || deployment_rejected?
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index b9ba9d8e1b0..7a1d52f5aea 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -12,6 +12,7 @@ module Ci
include Gitlab::Utils::StrongMemoize
include TaggableQueries
include Presentable
+ include EachBatch
add_authentication_token_field :token, encrypted: :optional, expires_at: :compute_token_expiration, expiration_enforced?: :token_expiration_enforced?
@@ -59,7 +60,7 @@ module Ci
AVAILABLE_TYPES_LEGACY = %w[specific shared].freeze
AVAILABLE_TYPES = runner_types.keys.freeze
- AVAILABLE_STATUSES = %w[active paused online offline not_connected never_contacted stale].freeze # TODO: Remove in %15.0: not_connected. In %16.0: active, paused. Relevant issues: https://gitlab.com/gitlab-org/gitlab/-/issues/347303, https://gitlab.com/gitlab-org/gitlab/-/issues/347305, https://gitlab.com/gitlab-org/gitlab/-/issues/344648
+ AVAILABLE_STATUSES = %w[active paused online offline never_contacted stale].freeze # TODO: Remove in %16.0: active, paused. Relevant issue: https://gitlab.com/gitlab-org/gitlab/-/issues/344648
AVAILABLE_SCOPES = (AVAILABLE_TYPES_LEGACY + AVAILABLE_TYPES + AVAILABLE_STATUSES).freeze
FORM_EDITABLE = %i[description tag_list active run_untagged locked access_level maximum_timeout_human_readable].freeze
@@ -83,7 +84,6 @@ module Ci
scope :recent, -> { where('ci_runners.created_at >= :date OR ci_runners.contacted_at >= :date', date: stale_deadline) }
scope :stale, -> { where('ci_runners.created_at < :date AND (ci_runners.contacted_at IS NULL OR ci_runners.contacted_at < :date)', date: stale_deadline) }
scope :offline, -> { where(arel_table[:contacted_at].lteq(online_contact_time_deadline)) }
- scope :not_connected, -> { where(contacted_at: nil) } # TODO: Remove in 15.0
scope :never_contacted, -> { where(contacted_at: nil) }
scope :ordered, -> { order(id: :desc) }
@@ -289,7 +289,7 @@ module Ci
def assign_to(project, current_user = nil)
if instance_type?
- self.runner_type = :project_type
+ raise ArgumentError, 'Transitioning an instance runner to a project runner is not supported'
elsif group_type?
raise ArgumentError, 'Transitioning a group runner to a project runner is not supported'
end
@@ -322,6 +322,9 @@ module Ci
end
def status(legacy_mode = nil)
+ # TODO Deprecate legacy_mode in %16.0 and make it a no-op
+ # (see https://gitlab.com/gitlab-org/gitlab/-/issues/360545)
+ # TODO Remove legacy_mode in %17.0
return deprecated_rest_status if legacy_mode == '14.5'
return :stale if stale?
@@ -331,10 +334,12 @@ module Ci
end
# DEPRECATED
- # TODO Remove in %16.0 in favor of `status` for REST calls
+ # TODO Remove in %16.0 in favor of `status` for REST calls, see https://gitlab.com/gitlab-org/gitlab/-/issues/344648
def deprecated_rest_status
- if contacted_at.nil? # TODO Remove in %15.0, see https://gitlab.com/gitlab-org/gitlab/-/issues/344648
- :not_connected
+ return :stale if stale?
+
+ if contacted_at.nil?
+ :never_contacted
elsif active?
online? ? :online : :offline
else
@@ -462,7 +467,7 @@ module Ci
end
def self.token_expiration_enforced?
- Feature.enabled?(:enforce_runner_token_expires_at, default_enabled: :yaml)
+ Feature.enabled?(:enforce_runner_token_expires_at)
end
private
diff --git a/app/models/ci/secure_file.rb b/app/models/ci/secure_file.rb
index 6a26a5341aa..9c82e106d6e 100644
--- a/app/models/ci/secure_file.rb
+++ b/app/models/ci/secure_file.rb
@@ -3,8 +3,11 @@
module Ci
class SecureFile < Ci::ApplicationRecord
include FileStoreMounter
+ include IgnorableColumns
include Limitable
+ ignore_column :permissions, remove_with: '15.2', remove_after: '2022-06-22'
+
FILE_SIZE_LIMIT = 5.megabytes.freeze
CHECKSUM_ALGORITHM = 'sha256'
@@ -14,14 +17,12 @@ module Ci
belongs_to :project, optional: false
validates :file, presence: true, file_size: { maximum: FILE_SIZE_LIMIT }
- validates :checksum, :file_store, :name, :permissions, :project_id, presence: true
+ validates :checksum, :file_store, :name, :project_id, presence: true
validates :name, uniqueness: { scope: :project }
after_initialize :generate_key_data
before_validation :assign_checksum
- enum permissions: { read_only: 0, read_write: 1, execute: 2 }
-
default_value_for(:file_store) { Ci::SecureFileUploader.default_store }
mount_file_store_uploader Ci::SecureFileUploader
diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb
index 21f7e410843..d1e169a1f78 100644
--- a/app/models/clusters/applications/prometheus.rb
+++ b/app/models/clusters/applications/prometheus.rb
@@ -18,7 +18,6 @@ module Clusters
default_value_for :version, VERSION
scope :preload_cluster_platform, -> { preload(cluster: [:platform_kubernetes]) }
- scope :with_clusters_with_cilium, -> { joins(:cluster).merge(Clusters::Cluster.with_available_cilium) }
attr_encrypted :alert_manager_token,
mode: :per_attribute_iv,
diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb
index 87afa9f9491..014f7530357 100644
--- a/app/models/clusters/cluster.rb
+++ b/app/models/clusters/cluster.rb
@@ -137,7 +137,6 @@ module Clusters
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 :with_available_cilium, -> { joins(:application_cilium).merge(::Clusters::Applications::Cilium.available) }
scope :distinct_with_deployed_environments, -> { joins(:environments).merge(::Deployment.success).distinct }
scope :managed, -> { where(managed: true) }
diff --git a/app/models/clusters/instance.rb b/app/models/clusters/instance.rb
index 2a09ba11564..b5acc6a68f9 100644
--- a/app/models/clusters/instance.rb
+++ b/app/models/clusters/instance.rb
@@ -9,5 +9,11 @@ module Clusters
def flipper_id
self.class.to_s
end
+
+ def certificate_based_clusters_enabled?
+ ::Gitlab::SafeRequestStore.fetch("certificate_based_clusters:") do
+ Feature.enabled?(:certificate_based_clusters, type: :ops)
+ end
+ end
end
end
diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb
index 1bd8e8b44cb..9d4f0a89403 100644
--- a/app/models/clusters/platforms/kubernetes.rb
+++ b/app/models/clusters/platforms/kubernetes.rb
@@ -11,6 +11,16 @@ module Clusters
RESERVED_NAMESPACES = %w(gitlab-managed-apps).freeze
+ IGNORED_CONNECTION_EXCEPTIONS = [
+ Gitlab::UrlBlocker::BlockedUrlError,
+ Kubeclient::HttpError,
+ Errno::ECONNREFUSED,
+ URI::InvalidURIError,
+ Errno::EHOSTUNREACH,
+ OpenSSL::X509::StoreError,
+ OpenSSL::SSL::SSLError
+ ].freeze
+
self.table_name = 'cluster_platforms_kubernetes'
self.reactive_cache_work_type = :external_dependency
@@ -102,10 +112,23 @@ module Clusters
def calculate_reactive_cache_for(environment)
return unless enabled?
- pods = read_pods(environment.deployment_namespace)
- deployments = read_deployments(environment.deployment_namespace)
+ pods = []
+ deployments = []
+ ingresses = []
+
+ begin
+ pods = read_pods(environment.deployment_namespace)
+ deployments = read_deployments(environment.deployment_namespace)
+
+ ingresses = read_ingresses(environment.deployment_namespace)
+ rescue *IGNORED_CONNECTION_EXCEPTIONS => e
+ log_kube_connection_error(e)
- ingresses = read_ingresses(environment.deployment_namespace)
+ # Return hash with default values so that it is cached.
+ return {
+ pods: pods, deployments: deployments, ingresses: ingresses
+ }
+ end
# extract only the data required for display to avoid unnecessary caching
{
@@ -292,6 +315,23 @@ module Clusters
}
end
end
+
+ def log_kube_connection_error(error)
+ logger.error({
+ exception: {
+ class: error.class.name,
+ message: error.message
+ },
+ status_code: error.try(:error_code),
+ namespace: self.namespace,
+ class_name: self.class.name,
+ event: :kube_connection_error
+ })
+ end
+
+ def logger
+ @logger ||= Gitlab::Kubernetes::Logger.build
+ end
end
end
end
diff --git a/app/models/concerns/bulk_member_access_load.rb b/app/models/concerns/bulk_member_access_load.rb
index efc65e55e40..c3aa3019abb 100644
--- a/app/models/concerns/bulk_member_access_load.rb
+++ b/app/models/concerns/bulk_member_access_load.rb
@@ -12,6 +12,11 @@ module BulkMemberAccessLoad
end
end
+ def purge_resource_id_from_request_store(resource_klass, resource_id)
+ Gitlab::SafeRequestPurger.execute(resource_key: max_member_access_for_resource_key(resource_klass),
+ resource_ids: [resource_id])
+ end
+
def max_member_access_for_resource_key(klass)
"max_member_access_for_#{klass.name.underscore.pluralize}:#{self.class}:#{self.id}"
end
diff --git a/app/models/concerns/ci/has_deployment_name.rb b/app/models/concerns/ci/has_deployment_name.rb
index fe288134872..887653e846e 100644
--- a/app/models/concerns/ci/has_deployment_name.rb
+++ b/app/models/concerns/ci/has_deployment_name.rb
@@ -5,7 +5,7 @@ module Ci
extend ActiveSupport::Concern
def count_user_deployment?
- Feature.enabled?(:job_deployment_count) && deployment_name?
+ deployment_name?
end
def deployment_name?
diff --git a/app/models/concerns/ci/has_status.rb b/app/models/concerns/ci/has_status.rb
index 313c767e59f..cca66c3ec94 100644
--- a/app/models/concerns/ci/has_status.rb
+++ b/app/models/concerns/ci/has_status.rb
@@ -7,16 +7,15 @@ module Ci
DEFAULT_STATUS = 'created'
BLOCKED_STATUS = %w[manual scheduled].freeze
AVAILABLE_STATUSES = %w[created waiting_for_resource preparing pending running success failed canceled skipped manual scheduled].freeze
- # TODO: replace STARTED_STATUSES with data from BUILD_STARTED_RUNNING_STATUSES in https://gitlab.com/gitlab-org/gitlab/-/issues/273378
- # see https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82149#note_865508501
- BUILD_STARTED_RUNNING_STATUSES = %w[running success failed].freeze
- STARTED_STATUSES = %w[running success failed skipped manual scheduled].freeze
+ STARTED_STATUSES = %w[running success failed].freeze
ACTIVE_STATUSES = %w[waiting_for_resource preparing pending running].freeze
COMPLETED_STATUSES = %w[success failed canceled skipped].freeze
+ STOPPED_STATUSES = COMPLETED_STATUSES + BLOCKED_STATUS
ORDERED_STATUSES = %w[failed preparing pending running waiting_for_resource manual scheduled canceled success skipped created].freeze
PASSED_WITH_WARNINGS_STATUSES = %w[failed canceled].to_set.freeze
EXCLUDE_IGNORED_STATUSES = %w[manual failed canceled].to_set.freeze
- CANCELABLE_STATUSES = %w[running waiting_for_resource preparing pending created scheduled].freeze
+ ALIVE_STATUSES = (ACTIVE_STATUSES + ['created']).freeze
+ CANCELABLE_STATUSES = (ALIVE_STATUSES + ['scheduled']).freeze
STATUSES_ENUM = { created: 0, pending: 1, running: 2, success: 3,
failed: 4, canceled: 5, skipped: 6, manual: 7,
scheduled: 8, preparing: 9, waiting_for_resource: 10 }.freeze
@@ -47,6 +46,10 @@ module Ci
def completed_statuses
COMPLETED_STATUSES.map(&:to_sym)
end
+
+ def stopped_statuses
+ STOPPED_STATUSES.map(&:to_sym)
+ end
end
included do
@@ -78,8 +81,8 @@ module Ci
scope :skipped, -> { with_status(:skipped) }
scope :manual, -> { with_status(:manual) }
scope :scheduled, -> { with_status(:scheduled) }
- scope :alive, -> { with_status(:created, :waiting_for_resource, :preparing, :pending, :running) }
- scope :alive_or_scheduled, -> { with_status(:created, :waiting_for_resource, :preparing, :pending, :running, :scheduled) }
+ scope :alive, -> { with_status(*ALIVE_STATUSES) }
+ scope :alive_or_scheduled, -> { with_status(*klass::CANCELABLE_STATUSES) }
scope :created_or_pending, -> { with_status(:created, :pending) }
scope :running_or_pending, -> { with_status(:running, :pending) }
scope :finished, -> { with_status(:success, :failed, :canceled) }
@@ -98,7 +101,7 @@ module Ci
end
def started?
- STARTED_STATUSES.include?(status) && started_at
+ STARTED_STATUSES.include?(status) && !!started_at
end
def active?
diff --git a/app/models/concerns/cross_database_modification.rb b/app/models/concerns/cross_database_modification.rb
index 85645e482f6..dea62f03f91 100644
--- a/app/models/concerns/cross_database_modification.rb
+++ b/app/models/concerns/cross_database_modification.rb
@@ -103,7 +103,7 @@ module CrossDatabaseModification
def track_gitlab_schema_in_current_transaction?
return false unless Feature::FlipperFeature.table_exists?
- Feature.enabled?(:track_gitlab_schema_in_current_transaction, default_enabled: :yaml)
+ Feature.enabled?(:track_gitlab_schema_in_current_transaction)
rescue ActiveRecord::NoDatabaseError, PG::ConnectionBad
false
end
diff --git a/app/models/concerns/deployment_platform.rb b/app/models/concerns/deployment_platform.rb
index d9c622f247a..2b5e1a204cb 100644
--- a/app/models/concerns/deployment_platform.rb
+++ b/app/models/concerns/deployment_platform.rb
@@ -3,7 +3,7 @@
module DeploymentPlatform
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def deployment_platform(environment: nil)
- return if Feature.disabled?(:certificate_based_clusters, default_enabled: :yaml, type: :ops)
+ return unless self.namespace.certificate_based_clusters_enabled?
@deployment_platform ||= {}
diff --git a/app/models/concerns/integrations/loggable.rb b/app/models/concerns/integrations/loggable.rb
new file mode 100644
index 00000000000..57847ea335c
--- /dev/null
+++ b/app/models/concerns/integrations/loggable.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Integrations
+ module Loggable
+ def log_info(message, params = {})
+ message = build_message(message, params)
+
+ logger.info(message)
+ end
+
+ def log_error(message, params = {})
+ message = build_message(message, params)
+
+ logger.error(message)
+ end
+
+ def log_exception(error, params = {})
+ Gitlab::ExceptionLogFormatter.format!(error, params)
+
+ log_error(params[:message] || error.message, params)
+ end
+
+ def build_message(message, params = {})
+ {
+ integration_class: self.class.name,
+ integration_id: id,
+ project_id: project&.id,
+ project_path: project&.full_path,
+ message: message
+ }.merge(params)
+ end
+
+ def logger
+ Gitlab::IntegrationsLogger
+ end
+ end
+end
diff --git a/app/models/concerns/integrations/reset_secret_fields.rb b/app/models/concerns/integrations/reset_secret_fields.rb
new file mode 100644
index 00000000000..f79c4392f19
--- /dev/null
+++ b/app/models/concerns/integrations/reset_secret_fields.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+# Integrations should reset their "secret" fields (type: 'password') when certain "exposing"
+# fields are changed (e.g. URLs), to avoid leaking secrets to unauthorized parties.
+# The result of this is that users have to reenter the secrets to confirm the change.
+module Integrations
+ module ResetSecretFields
+ extend ActiveSupport::Concern
+
+ included do
+ before_validation :reset_secret_fields!, if: :reset_secret_fields?
+ end
+
+ def exposing_secrets_fields
+ # TODO: Once all integrations use `Integrations::Field` we can remove the `.try` here.
+ # See: https://gitlab.com/groups/gitlab-org/-/epics/7652
+ fields.select { _1.try(:exposes_secrets) }.pluck(:name)
+ end
+
+ private
+
+ def reset_secret_fields?
+ exposing_secrets_fields.any? do |field|
+ public_send("#{field}_changed?") # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+
+ def reset_secret_fields!
+ secret_fields.each do |field|
+ next if public_send("#{field}_touched?") # rubocop:disable GitlabSecurity/PublicSend
+
+ public_send("#{field}=", nil) # rubocop:disable GitlabSecurity/PublicSend
+
+ # NOTE: Some of our specs also write to properties in addition to data fields,
+ # in order to test backwards compatibility. So in those cases we also need to
+ # clear the field in properties, since the setter above will only affect the data field.
+ self.properties = properties.except(field) if properties.present?
+ 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 be13701289a..3bdaa852ddf 100644
--- a/app/models/concerns/integrations/slack_mattermost_notifier.rb
+++ b/app/models/concerns/integrations/slack_mattermost_notifier.rb
@@ -14,11 +14,21 @@ module Integrations
# - https://gitlab.com/gitlab-org/slack-notifier#middleware
# - https://gitlab.com/gitlab-org/gitlab/-/issues/347048
notifier = ::Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
- notifier.ping(
+ responses = notifier.ping(
message.pretext,
attachments: message.attachments,
fallback: message.fallback
)
+
+ responses.each do |response|
+ unless response.success?
+ log_error('SlackMattermostNotifier HTTP error response',
+ request_host: response.request.uri.host,
+ response_code: response.code,
+ response_body: response.body
+ )
+ end
+ end
end
class HTTPClient
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index dbd760a9c45..713a4386fee 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -195,7 +195,7 @@ module Issuable
end
def supports_escalation?
- return false unless ::Feature.enabled?(:incident_escalations, project, default_enabled: :yaml)
+ return false unless ::Feature.enabled?(:incident_escalations, project)
incident?
end
@@ -520,7 +520,7 @@ module Issuable
changes.merge!(hook_association_changes(old_associations))
end
- Gitlab::HookData::IssuableBuilder.new(self).build(user: user, changes: changes)
+ Gitlab::DataBuilder::Issuable.new(self).build(user: user, changes: changes)
end
def labels_array
diff --git a/app/models/concerns/limitable.rb b/app/models/concerns/limitable.rb
index fab1aa21634..6ff540b7866 100644
--- a/app/models/concerns/limitable.rb
+++ b/app/models/concerns/limitable.rb
@@ -28,8 +28,8 @@ module Limitable
def validate_scoped_plan_limit_not_exceeded
scope_relation = self.public_send(limit_scope) # rubocop:disable GitlabSecurity/PublicSend
return unless scope_relation
- return if limit_feature_flag && ::Feature.disabled?(limit_feature_flag, scope_relation, default_enabled: :yaml)
- return if limit_feature_flag_for_override && ::Feature.enabled?(limit_feature_flag_for_override, scope_relation, default_enabled: :yaml)
+ return if limit_feature_flag && ::Feature.disabled?(limit_feature_flag, scope_relation)
+ return if limit_feature_flag_for_override && ::Feature.enabled?(limit_feature_flag_for_override, scope_relation)
relation = limit_relation ? self.public_send(limit_relation) : self.class.where(limit_scope => scope_relation) # rubocop:disable GitlabSecurity/PublicSend
limits = scope_relation.actual_limits
diff --git a/app/models/concerns/merge_request_reviewer_state.rb b/app/models/concerns/merge_request_reviewer_state.rb
index 893d06b4da8..18ec1c253e1 100644
--- a/app/models/concerns/merge_request_reviewer_state.rb
+++ b/app/models/concerns/merge_request_reviewer_state.rb
@@ -16,8 +16,6 @@ module MergeRequestReviewerState
belongs_to :updated_state_by, class_name: 'User', foreign_key: :updated_state_by_user_id
- after_initialize :set_state, unless: :persisted?
-
def attention_requested_by
return unless attention_requested?
diff --git a/app/models/concerns/packages/destructible.rb b/app/models/concerns/packages/destructible.rb
index a3b7d8580c1..647c63b7f60 100644
--- a/app/models/concerns/packages/destructible.rb
+++ b/app/models/concerns/packages/destructible.rb
@@ -5,7 +5,7 @@ module Packages
extend ActiveSupport::Concern
class_methods do
- def next_pending_destruction(order_by: nil)
+ def next_pending_destruction(order_by:)
set = pending_destruction.limit(1).lock('FOR UPDATE SKIP LOCKED')
set = set.order(order_by) if order_by
set.take
diff --git a/app/models/concerns/pg_full_text_searchable.rb b/app/models/concerns/pg_full_text_searchable.rb
index 68357c44300..bfc539ee392 100644
--- a/app/models/concerns/pg_full_text_searchable.rb
+++ b/app/models/concerns/pg_full_text_searchable.rb
@@ -80,6 +80,15 @@ module PgFullTextSearchable
pg_full_text_searchable_columns[column[:name]] = column[:weight]
end
+ # When multiple updates are done in a transaction, `saved_changes` will only report the latest save
+ # and we may miss an update to the searchable columns.
+ # As a workaround, we set a dirty flag here and update the search data in `after_save_commit`.
+ after_save do
+ next unless pg_full_text_searchable_columns.keys.any? { |f| saved_changes.has_key?(f) }
+
+ @update_pg_full_text_search_data = true
+ end
+
# We update this outside the transaction because this could raise an error if the resulting tsvector
# is too long. When that happens, we still persist the create / update but the model will not have a
# search data record. This is fine in most cases because this is a very rare occurrence and only happens
@@ -87,9 +96,8 @@ module PgFullTextSearchable
#
# We also do not want to use a subtransaction here due to: https://gitlab.com/groups/gitlab-org/-/epics/6540
after_save_commit do
- next unless pg_full_text_searchable_columns.keys.any? { |f| saved_changes.has_key?(f) }
-
- update_search_data!
+ update_search_data! if @update_pg_full_text_search_data
+ @update_pg_full_text_search_data = nil
end
end
diff --git a/app/models/concerns/project_services_loggable.rb b/app/models/concerns/project_services_loggable.rb
deleted file mode 100644
index e5385435138..00000000000
--- a/app/models/concerns/project_services_loggable.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# frozen_string_literal: true
-
-module ProjectServicesLoggable
- def log_info(message, params = {})
- message = build_message(message, params)
-
- logger.info(message)
- end
-
- def log_error(message, params = {})
- message = build_message(message, params)
-
- logger.error(message)
- end
-
- def build_message(message, params = {})
- {
- service_class: self.class.name,
- project_id: project&.id,
- project_path: project&.full_path,
- message: message
- }.merge(params)
- end
-
- def logger
- Gitlab::ProjectServiceLogger
- end
-end
diff --git a/app/models/concerns/routable.rb b/app/models/concerns/routable.rb
index 2cf95ac0dae..5b759dedb26 100644
--- a/app/models/concerns/routable.rb
+++ b/app/models/concerns/routable.rb
@@ -97,7 +97,7 @@ module Routable
def full_name
# We have to test for persistence as the cache key uses #updated_at
- return (route&.name || build_full_name) unless persisted? && Feature.enabled?(:cached_route_lookups, self, type: :ops, default_enabled: :yaml)
+ return (route&.name || build_full_name) unless persisted? && Feature.enabled?(:cached_route_lookups, self, type: :ops)
# Return the name as-is if the parent is missing
return name if route.nil? && parent.nil? && name.present?
@@ -115,7 +115,7 @@ module Routable
def full_path
# We have to test for persistence as the cache key uses #updated_at
- return (route&.path || build_full_path) unless persisted? && Feature.enabled?(:cached_route_lookups, self, type: :ops, default_enabled: :yaml)
+ return (route&.path || build_full_path) unless persisted? && Feature.enabled?(:cached_route_lookups, self, type: :ops)
# Return the path as-is if the parent is missing
return path if route.nil? && parent.nil? && path.present?
diff --git a/app/models/concerns/sha256_attribute.rb b/app/models/concerns/sha256_attribute.rb
deleted file mode 100644
index 3c906642b1a..00000000000
--- a/app/models/concerns/sha256_attribute.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-module Sha256Attribute
- extend ActiveSupport::Concern
-
- class_methods do
- def sha256_attribute(name)
- return if ENV['STATIC_VERIFICATION']
-
- validate_binary_column_exists!(name) unless Rails.env.production?
-
- attribute(name, Gitlab::Database::Sha256Attribute.new)
- end
-
- # This only gets executed in non-production environments as an additional check to ensure
- # the column is the correct type. In production it should behave like any other attribute.
- # See https://gitlab.com/gitlab-org/gitlab/merge_requests/5502 for more discussion
- def validate_binary_column_exists!(name)
- return unless database_exists?
-
- unless table_exists?
- warn "WARNING: sha256_attribute #{name.inspect} is invalid since the table doesn't exist - you may need to run database migrations"
- return
- end
-
- column = columns.find { |c| c.name == name.to_s }
-
- unless column
- warn "WARNING: sha256_attribute #{name.inspect} is invalid since the column doesn't exist - you may need to run database migrations"
- return
- end
-
- unless column.type == :binary
- raise ArgumentError, "sha256_attribute #{name.inspect} is invalid since the column type is not :binary"
- end
- rescue StandardError => error
- Gitlab::AppLogger.error "Sha256Attribute initialization: #{error.message}"
- raise
- end
-
- def database_exists?
- database.exists?
- end
- end
-end
diff --git a/app/models/concerns/sha_attribute.rb b/app/models/concerns/sha_attribute.rb
index e49f4d03bda..701d2fda5c5 100644
--- a/app/models/concerns/sha_attribute.rb
+++ b/app/models/concerns/sha_attribute.rb
@@ -3,39 +3,71 @@
module ShaAttribute
extend ActiveSupport::Concern
- # Needed for the database method
- include DatabaseReflection
+ class ShaAttributeTypeMismatchError < StandardError
+ def initialize(column_name, column_type)
+ @column_name = column_name
+ @column_type = column_type
+ end
+
+ def message
+ "sha_attribute :#{@column_name} should be a :binary column but it is :#{@column_type}"
+ end
+ end
+
+ class Sha256AttributeTypeMismatchError < ShaAttributeTypeMismatchError
+ def message
+ "sha256_attribute :#{@column_name} should be a :binary column but it is :#{@column_type}"
+ end
+ end
class_methods do
def sha_attribute(name)
return if ENV['STATIC_VERIFICATION']
- validate_binary_column_exists!(name) if Rails.env.development? || Rails.env.test?
+ sha_attribute_fields << name
attribute(name, Gitlab::Database::ShaAttribute.new)
end
+ def sha_attribute_fields
+ @sha_attribute_fields ||= []
+ end
+
+ def sha256_attribute(name)
+ return if ENV['STATIC_VERIFICATION']
+
+ sha256_attribute_fields << name
+
+ attribute(name, Gitlab::Database::Sha256Attribute.new)
+ end
+
+ def sha256_attribute_fields
+ @sha256_attribute_fields ||= []
+ end
+
# This only gets executed in non-production environments as an additional check to ensure
# the column is the correct type. In production it should behave like any other attribute.
# See https://gitlab.com/gitlab-org/gitlab/merge_requests/5502 for more discussion
- def validate_binary_column_exists!(name)
- return unless database_exists?
- return unless table_exists?
+ def load_schema!
+ super
- column = columns.find { |c| c.name == name.to_s }
+ return if Rails.env.production?
- return unless column
+ sha_attribute_fields.each do |field|
+ column = columns_hash[field.to_s]
- unless column.type == :binary
- raise ArgumentError, "sha_attribute #{name.inspect} is invalid since the column type is not :binary"
+ if column && column.type != :binary
+ raise ShaAttributeTypeMismatchError.new(column.name, column.type)
+ end
end
- rescue StandardError => error
- Gitlab::AppLogger.error "ShaAttribute initialization: #{error.message}"
- raise
- end
- def database_exists?
- database.exists?
+ sha256_attribute_fields.each do |field|
+ column = columns_hash[field.to_s]
+
+ if column && column.type != :binary
+ raise Sha256AttributeTypeMismatchError.new(column.name, column.type)
+ end
+ end
end
end
end
diff --git a/app/models/container_registry/event.rb b/app/models/container_registry/event.rb
index c1b865ae578..5409bdf5af4 100644
--- a/app/models/container_registry/event.rb
+++ b/app/models/container_registry/event.rb
@@ -2,6 +2,8 @@
module ContainerRegistry
class Event
+ include Gitlab::Utils::StrongMemoize
+
ALLOWED_ACTIONS = %w(push delete).freeze
PUSH_ACTION = 'push'
EVENT_TRACKING_CATEGORY = 'container_registry:notification'
@@ -17,7 +19,7 @@ module ContainerRegistry
end
def handle!
- # no op
+ update_project_statistics
end
def track!
@@ -58,10 +60,25 @@ module ContainerRegistry
end
def container_registry_path
- path = event.dig('target', 'repository')
- return unless path
+ strong_memoize(:container_registry_path) do
+ path = event.dig('target', 'repository')
+ next unless path
+
+ ContainerRegistry::Path.new(path)
+ end
+ end
+
+ def project
+ container_registry_path&.repository_project
+ end
+
+ def update_project_statistics
+ return unless supported?
+ return unless target_tag?
+ return unless project
+ return unless Feature.enabled?(:container_registry_project_statistics, project)
- ContainerRegistry::Path.new(path)
+ ProjectCacheWorker.perform_async(project.id, [], [:container_registry_size])
end
end
end
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index 78bd520d5d5..c965d7cffe1 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -43,7 +43,8 @@ class ContainerRepository < ApplicationRecord
migration_canceled: 4,
not_found: 5,
native_import: 6,
- migration_forced_canceled: 7
+ migration_forced_canceled: 7,
+ migration_canceled_by_registry: 8
}
delegate :client, :gitlab_api_client, to: :registry
@@ -214,9 +215,9 @@ class ContainerRepository < ApplicationRecord
container_repository.migration_skipped_at = Time.zone.now
end
- before_transition any => %i[import_done import_aborted] do |container_repository|
+ before_transition any => %i[import_done import_aborted import_skipped] do |container_repository|
container_repository.run_after_commit do
- ::ContainerRegistry::Migration::EnqueuerWorker.perform_async
+ ::ContainerRegistry::Migration::EnqueuerWorker.enqueue_a_job
end
end
end
@@ -325,17 +326,13 @@ class ContainerRepository < ApplicationRecord
return if importing?
start_import(forced: true)
- when 'import_canceled', 'pre_import_canceled'
- return if import_skipped?
-
- skip_import(reason: :migration_canceled)
when 'import_complete'
finish_import
- when 'import_failed'
+ when 'import_failed', 'import_canceled'
retry_import
when 'pre_import_complete'
finish_pre_import_and_start_import
- when 'pre_import_failed'
+ when 'pre_import_failed', 'pre_import_canceled'
retry_pre_import
else
yield
@@ -376,6 +373,10 @@ class ContainerRepository < ApplicationRecord
migration_retries_count >= ContainerRegistry::Migration.max_retries
end
+ def nearing_or_exceeded_retry_limit?
+ migration_retries_count >= ContainerRegistry::Migration.max_retries - 1
+ end
+
def last_import_step_done_at
[migration_pre_import_done_at, migration_import_done_at, migration_aborted_at, migration_skipped_at].compact.max
end
@@ -460,12 +461,8 @@ class ContainerRepository < ApplicationRecord
client.delete_repository_tag_by_name(self.path, name)
end
- def reset_expiration_policy_started_at!
- update!(expiration_policy_started_at: nil)
- end
-
def start_expiration_policy!
- update!(expiration_policy_started_at: Time.zone.now)
+ update!(expiration_policy_started_at: Time.zone.now, last_cleanup_deleted_tags_count: nil)
end
def size
diff --git a/app/models/deploy_token.rb b/app/models/deploy_token.rb
index 360a9ffbc53..3c0f7d91a03 100644
--- a/app/models/deploy_token.rb
+++ b/app/models/deploy_token.rb
@@ -5,7 +5,11 @@ class DeployToken < ApplicationRecord
include TokenAuthenticatable
include PolicyActor
include Gitlab::Utils::StrongMemoize
- add_authentication_token_field :token, encrypted: :optional
+ include IgnorableColumns
+
+ ignore_column :token, remove_with: '15.2', remove_after: '2022-07-22'
+
+ add_authentication_token_field :token, encrypted: :required
AVAILABLE_SCOPES = %i(read_repository read_registry write_registry
read_package_registry write_package_registry).freeze
@@ -126,6 +130,10 @@ class DeployToken < ApplicationRecord
end
end
+ def impersonated?
+ false
+ end
+
def expires_at
expires_at = read_attribute(:expires_at)
expires_at != Forever.date ? expires_at : nil
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 63d531d82c3..4204ad707b2 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -70,6 +70,11 @@ class Deployment < ApplicationRecord
transition created: :blocked
end
+ # This transition is possible when we have manual jobs.
+ event :create do
+ transition skipped: :created
+ end
+
event :unblock do
transition blocked: :created
end
@@ -348,7 +353,7 @@ class Deployment < ApplicationRecord
def sync_status_with(build)
return false unless ::Deployment.statuses.include?(build.status)
- return false if build.created? || build.status == self.status
+ return false if build.status == self.status
update_status!(build.status)
rescue StandardError => e
@@ -403,6 +408,8 @@ class Deployment < ApplicationRecord
skip!
when 'blocked'
block!
+ when 'created'
+ create!
else
raise ArgumentError, "The status #{status.inspect} is invalid"
end
diff --git a/app/models/design_management/action.rb b/app/models/design_management/action.rb
index b9df2873a73..5f407a5867d 100644
--- a/app/models/design_management/action.rb
+++ b/app/models/design_management/action.rb
@@ -19,6 +19,7 @@ module DesignManagement
scope :ordered, -> { order(version_id: :asc) }
scope :by_design, -> (design) { where(design: design) }
scope :by_event, -> (event) { where(event: event) }
+ scope :with_version, -> { preload(:version) }
# For each design, only select the most recent action
scope :most_recent, -> do
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 9e663b2ee74..865f5c68af1 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -26,7 +26,7 @@ class Environment < ApplicationRecord
has_many :self_managed_prometheus_alert_events, inverse_of: :environment
has_many :alert_management_alerts, class_name: 'AlertManagement::Alert', inverse_of: :environment
- has_one :last_deployment, -> { Feature.enabled?(:env_last_deployment_by_finished_at, default_enabled: :yaml) ? success.ordered : success.distinct_on_environment }, class_name: 'Deployment', inverse_of: :environment
+ has_one :last_deployment, -> { success.ordered }, class_name: 'Deployment', inverse_of: :environment
has_one :last_visible_deployment, -> { visible.distinct_on_environment }, inverse_of: :environment, class_name: 'Deployment'
has_one :last_visible_deployable, through: :last_visible_deployment, source: 'deployable', source_type: 'CommitStatus', disable_joins: true
has_one :last_visible_pipeline, through: :last_visible_deployable, source: 'pipeline', disable_joins: true
@@ -314,13 +314,9 @@ class Environment < ApplicationRecord
def stop_actions
strong_memoize(:stop_actions) do
- if ::Feature.enabled?(:environment_multiple_stop_actions, project, default_enabled: :yaml)
- # Fix N+1 queries it brings to the serializer.
- # Tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/358780
- last_deployment_group.map(&:stop_action).compact
- else
- [last_deployment&.stop_action].compact
- end
+ # Fix N+1 queries it brings to the serializer.
+ # Tracked in https://gitlab.com/gitlab-org/gitlab/-/issues/358780
+ last_deployment_group.map(&:stop_action).compact
end
end
diff --git a/app/models/event.rb b/app/models/event.rb
index e9a98c06b59..7760be3e817 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -357,6 +357,8 @@ class Event < ApplicationRecord
Project.unscoped.where(id: project_id)
.where('last_activity_at <= ?', RESET_PROJECT_ACTIVITY_INTERVAL.ago)
.touch_all(:last_activity_at, time: created_at) # rubocop: disable Rails/SkipsModelValidations
+
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project.id).reset
end
def authored_by?(user)
@@ -369,6 +371,10 @@ class Event < ApplicationRecord
Event._to_partial_path
end
+ def has_no_project_and_group?
+ project_id.nil? && group_id.nil?
+ end
+
protected
def capability
diff --git a/app/models/event_collection.rb b/app/models/event_collection.rb
index fc093894847..4258027aa56 100644
--- a/app/models/event_collection.rb
+++ b/app/models/event_collection.rb
@@ -8,6 +8,8 @@
class EventCollection
include Gitlab::Utils::StrongMemoize
+ attr_reader :filter
+
# To prevent users from putting too much pressure on the database by cycling
# through thousands of events we put a limit on the number of pages.
MAX_PAGE = 10
@@ -19,7 +21,7 @@ class EventCollection
@projects = projects
@limit = limit
@offset = offset
- @filter = filter
+ @filter = filter || EventFilter.new(EventFilter::ALL)
@groups = groups
end
@@ -44,35 +46,46 @@ class EventCollection
private
def project_events
- in_operator_optimized_relation('project_id', projects)
+ in_operator_optimized_relation('project_id', projects, Project)
end
def group_events
- in_operator_optimized_relation('group_id', groups)
+ in_operator_optimized_relation('group_id', groups, Namespace)
end
def project_and_group_events
- Event.from_union([project_events, group_events]).recent
+ if EventFilter::PROJECT_ONLY_EVENT_TYPES.include?(filter.filter)
+ project_events
+ else
+ Event.from_union([project_events, group_events]).recent
+ end
end
- def in_operator_optimized_relation(parent_column, parents)
- scope = filtered_events
- array_scope = parents.select(:id)
- array_mapping_scope = -> (parent_id_expression) { Event.where(Event.arel_table[parent_column].eq(parent_id_expression)).reorder(id: :desc) }
- finder_query = -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ def in_operator_optimized_relation(parent_column, parents, parent_model)
+ query_builder_params = if Feature.enabled?(:optimized_project_and_group_activity_queries)
+ array_data = {
+ scope_ids: parents.pluck(:id),
+ scope_model: parent_model,
+ mapping_column: parent_column
+ }
+ filter.in_operator_query_builder_params(array_data)
+ else
+ {
+ scope: filtered_events,
+ array_scope: parents.select(:id),
+ array_mapping_scope: -> (parent_id_expression) { Event.where(Event.arel_table[parent_column].eq(parent_id_expression)).reorder(id: :desc) },
+ finder_query: -> (id_expression) { Event.where(Event.arel_table[:id].eq(id_expression)) }
+ }
+ end
Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder
- .new(
- scope: scope,
- array_scope: array_scope,
- array_mapping_scope: array_mapping_scope,
- finder_query: finder_query
- )
+ .new(**query_builder_params)
.execute
+ .limit(@limit + @offset)
end
def filtered_events
- @filter ? @filter.apply_filter(base_relation) : base_relation
+ filter.apply_filter(base_relation)
end
def paginate_events(events)
@@ -99,3 +112,5 @@ class EventCollection
end
end
end
+
+EventCollection.prepend_mod
diff --git a/app/models/group.rb b/app/models/group.rb
index 990c06fdc41..86f4b14cb6c 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -146,7 +146,7 @@ class Group < Namespace
validates :group_feature, presence: true
add_authentication_token_field :runners_token,
- encrypted: -> { Feature.enabled?(:groups_tokens_optional_encryption, default_enabled: true) ? :optional : :required },
+ encrypted: -> { Feature.enabled?(:groups_tokens_optional_encryption) ? :optional : :required },
prefix: RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX
after_create :post_create_hook
@@ -870,7 +870,7 @@ class Group < Namespace
actors << self if root_ancestor != self
actors.any? do |actor|
- ::Feature.enabled?(feature_flag, actor, default_enabled: :yaml)
+ ::Feature.enabled?(feature_flag, actor)
end
end
diff --git a/app/models/group_group_link.rb b/app/models/group_group_link.rb
index b0020f097b5..a70110c4076 100644
--- a/app/models/group_group_link.rb
+++ b/app/models/group_group_link.rb
@@ -41,3 +41,5 @@ class GroupGroupLink < ApplicationRecord
Gitlab::Access.human_access(self.group_access)
end
end
+
+GroupGroupLink.prepend_mod_with('GroupGroupLink')
diff --git a/app/models/incident_management/timeline_event.rb b/app/models/incident_management/timeline_event.rb
new file mode 100644
index 00000000000..d30d6906e14
--- /dev/null
+++ b/app/models/incident_management/timeline_event.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ class TimelineEvent < ApplicationRecord
+ include CacheMarkdownField
+
+ self.table_name = 'incident_management_timeline_events'
+
+ cache_markdown_field :note,
+ pipeline: :'incident_management/timeline_event',
+ issuable_reference_expansion_enabled: true
+
+ belongs_to :project
+ belongs_to :author, class_name: 'User', foreign_key: :author_id
+ belongs_to :incident, class_name: 'Issue', foreign_key: :issue_id, inverse_of: :incident_management_timeline_events
+ belongs_to :updated_by_user, class_name: 'User', foreign_key: :updated_by_user_id
+ belongs_to :promoted_from_note, class_name: 'Note', foreign_key: :promoted_from_note_id
+
+ validates :project, :incident, :occurred_at, presence: true
+ validates :action, presence: true, length: { maximum: 128 }
+ validates :note, :note_html, presence: true, length: { maximum: 10_000 }
+
+ scope :order_occurred_at_asc, -> { reorder(occurred_at: :asc) }
+ end
+end
diff --git a/app/models/instance_configuration.rb b/app/models/instance_configuration.rb
index 00e55d0fd89..8a8c1a29375 100644
--- a/app/models/instance_configuration.rb
+++ b/app/models/instance_configuration.rb
@@ -13,6 +13,7 @@ class InstanceConfiguration
{ ssh_algorithms_hashes: ssh_algorithms_hashes,
host: host,
gitlab_pages: gitlab_pages,
+ ci_cd_limits: ci_cd_limits,
size_limits: size_limits,
package_file_size_limits: package_file_size_limits,
rate_limits: rate_limits }.deep_symbolize_keys
@@ -47,6 +48,7 @@ class InstanceConfiguration
{
max_attachment_size: application_settings[:max_attachment_size].megabytes,
receive_max_input_size: application_settings[:receive_max_input_size]&.megabytes,
+ max_export_size: application_settings[:max_export_size] > 0 ? application_settings[:max_export_size].megabytes : nil,
max_import_size: application_settings[:max_import_size] > 0 ? application_settings[:max_import_size].megabytes : nil,
diff_max_patch_bytes: application_settings[:diff_max_patch_bytes].bytes,
max_artifacts_size: application_settings[:max_artifacts_size].megabytes,
@@ -128,6 +130,23 @@ class InstanceConfiguration
}
end
+ def ci_cd_limits
+ Plan.all.to_h { |plan| [plan.name.capitalize, plan_ci_cd_limits(plan)] }
+ end
+
+ def plan_ci_cd_limits(plan)
+ plan.actual_limits.slice(
+ :ci_pipeline_size,
+ :ci_active_jobs,
+ :ci_active_pipelines,
+ :ci_project_subscriptions,
+ :ci_pipeline_schedules,
+ :ci_needs_size_limit,
+ :ci_registered_group_runners,
+ :ci_registered_project_runners
+ )
+ end
+
def ssh_algorithm_file(algorithm)
File.join(SSH_ALGORITHMS_PATH, "ssh_host_#{algorithm.downcase}_key.pub")
end
diff --git a/app/models/integration.rb b/app/models/integration.rb
index c0e244e38b6..b5064cfae2d 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -5,14 +5,14 @@
class Integration < ApplicationRecord
include Sortable
include Importable
- include ProjectServicesLoggable
+ include Integrations::Loggable
include Integrations::HasDataFields
+ include Integrations::ResetSecretFields
include FromUnion
include EachBatch
include IgnorableColumns
extend ::Gitlab::Utils::Override
- ignore_column :template, remove_with: '15.0', remove_after: '2022-04-22'
ignore_column :type, remove_with: '15.0', remove_after: '2022-04-22'
ignore_column :properties, remove_with: '15.1', remove_after: '2022-05-22'
@@ -161,7 +161,7 @@ class Integration < ApplicationRecord
end
def fields
- self.class.fields
+ self.class.fields.dup
end
# Provide convenient accessor methods for each serialized property.
@@ -279,7 +279,7 @@ class Integration < ApplicationRecord
end
def self.dev_integration_names
- return [] unless Rails.env.development?
+ return [] unless Gitlab.dev_or_test_env?
DEV_INTEGRATION_NAMES
end
@@ -447,6 +447,7 @@ class Integration < ApplicationRecord
# TODO: Once all integrations use `Integrations::Field` we can
# use `#secret?` here.
+ # See: https://gitlab.com/groups/gitlab-org/-/epics/7652
def secret_fields
fields.select { |f| f[:type] == 'password' }.pluck(:name)
end
diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb
index b384a94d713..4e144a688f6 100644
--- a/app/models/integrations/bamboo.rb
+++ b/app/models/integrations/bamboo.rb
@@ -5,7 +5,26 @@ module Integrations
include ReactivelyCached
prepend EnableSslVerification
- prop_accessor :bamboo_url, :build_key, :username, :password
+ field :bamboo_url,
+ title: s_('BambooService|Bamboo URL'),
+ placeholder: s_('https://bamboo.example.com'),
+ help: s_('BambooService|Bamboo service root URL.'),
+ required: true
+
+ field :build_key,
+ help: s_('BambooService|Bamboo build plan key.'),
+ non_empty_password_title: s_('BambooService|Enter new build key'),
+ non_empty_password_help: s_('BambooService|Leave blank to use your current build key.'),
+ placeholder: s_('KEY'),
+ required: true
+
+ field :username,
+ help: s_('BambooService|The user with API access to the Bamboo server.')
+
+ field :password,
+ type: 'password',
+ non_empty_password_title: s_('ProjectService|Enter new password'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current password')
validates :bamboo_url, presence: true, public_url: true, if: :activated?
validates :build_key, presence: true, if: :activated?
@@ -43,39 +62,6 @@ module Integrations
'bamboo'
end
- def fields
- [
- {
- type: 'text',
- name: 'bamboo_url',
- title: s_('BambooService|Bamboo URL'),
- placeholder: s_('https://bamboo.example.com'),
- help: s_('BambooService|Bamboo service root URL.'),
- required: true
- },
- {
- type: 'password',
- name: 'build_key',
- help: s_('BambooService|Bamboo build plan key.'),
- non_empty_password_title: s_('BambooService|Enter new build key'),
- non_empty_password_help: s_('BambooService|Leave blank to use your current build key.'),
- placeholder: s_('KEY'),
- required: true
- },
- {
- type: 'text',
- name: 'username',
- help: s_('BambooService|The user with API access to the Bamboo server.')
- },
- {
- type: 'password',
- name: 'password',
- non_empty_password_title: s_('ProjectService|Enter new password'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current password')
- }
- ]
- end
-
def build_page(sha, ref)
with_reactive_cache(sha, ref) {|cached| cached[:build_page] }
end
diff --git a/app/models/integrations/base_chat_notification.rb b/app/models/integrations/base_chat_notification.rb
index 54bd595892f..9bf208abcf7 100644
--- a/app/models/integrations/base_chat_notification.rb
+++ b/app/models/integrations/base_chat_notification.rb
@@ -149,6 +149,10 @@ module Integrations
raise NotImplementedError
end
+ def webhook_placeholder
+ raise NotImplementedError
+ end
+
private
def log_usage(_, _)
diff --git a/app/models/integrations/base_ci.rb b/app/models/integrations/base_ci.rb
index b2e269b1b50..4f8732da703 100644
--- a/app/models/integrations/base_ci.rb
+++ b/app/models/integrations/base_ci.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
-# Base class for CI services
-# List methods you need to implement to get your CI service
+# Base class for CI integrations
+# List methods you need to implement to get your CI integration
# working with GitLab merge requests
module Integrations
class BaseCi < Integration
@@ -12,7 +12,7 @@ module Integrations
end
def self.supported_events
- %w(push)
+ %w[push]
end
# Return complete url to build page
@@ -30,10 +30,10 @@ module Integrations
#
#
# Ex.
- # @service.commit_status('13be4ac', 'master')
+ # @integration.commit_status('13be4ac', 'master')
# # => 'success'
#
- # @service.commit_status('2abe4ac', 'dev')
+ # @integration.commit_status('2abe4ac', 'dev')
# # => 'running'
#
#
diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb
index 3b802271a36..d1e54ce86ee 100644
--- a/app/models/integrations/buildkite.rb
+++ b/app/models/integrations/buildkite.rb
@@ -10,7 +10,18 @@ module Integrations
ENDPOINT = "https://buildkite.com"
- prop_accessor :project_url, :token
+ field :project_url,
+ title: _('Pipeline URL'),
+ placeholder: "#{ENDPOINT}/example-org/test-pipeline",
+ required: true
+
+ field :token,
+ type: 'password',
+ title: _('Token'),
+ help: s_('ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository.'),
+ non_empty_password_title: s_('ProjectService|Enter new token'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
+ required: true
validates :project_url, presence: true, public_url: true, if: :activated?
validates :token, presence: true, if: :activated?
@@ -74,24 +85,6 @@ module Integrations
s_('ProjectService|Run CI/CD pipelines with Buildkite.')
end
- def fields
- [
- { type: 'password',
- name: 'token',
- title: _('Token'),
- help: s_('ProjectService|The token you get after you create a Buildkite pipeline with a GitLab repository.'),
- 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: 'project_url',
- title: _('Pipeline URL'),
- placeholder: "#{ENDPOINT}/example-org/test-pipeline",
- required: true }
- ]
- end
-
def calculate_reactive_cache(sha, ref)
response = Gitlab::HTTP.try_get(commit_status_path(sha), request_options)
diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb
index 73f78bec381..0c65ed8cd5f 100644
--- a/app/models/integrations/drone_ci.rb
+++ b/app/models/integrations/drone_ci.rb
@@ -10,7 +10,17 @@ module Integrations
DRONE_SAAS_HOSTNAME = 'cloud.drone.io'
- prop_accessor :drone_url, :token
+ field :drone_url,
+ title: s_('ProjectService|Drone server URL'),
+ placeholder: 'http://drone.example.com',
+ required: true
+
+ field :token,
+ type: 'password',
+ help: s_('ProjectService|Token for the Drone project.'),
+ non_empty_password_title: s_('ProjectService|Enter new token'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current token.'),
+ required: true
validates :drone_url, presence: true, public_url: true, if: :activated?
validates :token, presence: true, if: :activated?
@@ -94,26 +104,6 @@ module Integrations
s_('ProjectService|Run CI/CD pipelines with Drone.')
end
- def fields
- [
- {
- type: 'password',
- name: 'token',
- help: s_('ProjectService|Token for the Drone project.'),
- 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: 'drone_url',
- title: s_('ProjectService|Drone server URL'),
- placeholder: 'http://drone.example.com',
- required: true
- }
- ]
- end
-
override :hook_url
def hook_url
[drone_url, "/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join
diff --git a/app/models/integrations/field.rb b/app/models/integrations/field.rb
index f00c4236a92..ca7833c1a56 100644
--- a/app/models/integrations/field.rb
+++ b/app/models/integrations/field.rb
@@ -10,6 +10,7 @@ module Integrations
non_empty_password_help
non_empty_password_title
api_only
+ exposes_secrets
].freeze
attr_reader :name
diff --git a/app/models/integrations/jenkins.rb b/app/models/integrations/jenkins.rb
index 32f11ee23eb..a1abbce72bc 100644
--- a/app/models/integrations/jenkins.rb
+++ b/app/models/integrations/jenkins.rb
@@ -7,7 +7,25 @@ module Integrations
prepend EnableSslVerification
extend Gitlab::Utils::Override
- prop_accessor :jenkins_url, :project_name, :username, :password
+ field :jenkins_url,
+ title: s_('ProjectService|Jenkins server URL'),
+ required: true,
+ placeholder: 'http://jenkins.example.com',
+ help: s_('The URL of the Jenkins server.')
+
+ field :project_name,
+ required: true,
+ placeholder: 'my_project_name',
+ help: s_('The name of the Jenkins project. Copy the name from the end of the URL to the project.')
+
+ field :username,
+ help: s_('The username for the Jenkins server.')
+
+ field :password,
+ type: 'password',
+ help: s_('The password for the Jenkins server.'),
+ non_empty_password_title: s_('ProjectService|Enter new password.'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current password.')
before_validation :reset_password
@@ -15,7 +33,6 @@ module Integrations
validates :project_name, presence: true, if: :activated?
validates :username, presence: true, if: ->(service) { service.activated? && service.password_touched? && service.password.present? }
- default_value_for :push_events, true
default_value_for :merge_requests_events, false
default_value_for :tag_push_events, false
@@ -72,37 +89,5 @@ module Integrations
def self.to_param
'jenkins'
end
-
- def fields
- [
- {
- type: 'text',
- name: 'jenkins_url',
- title: s_('ProjectService|Jenkins server URL'),
- required: true,
- placeholder: 'http://jenkins.example.com',
- help: s_('The URL of the Jenkins server.')
- },
- {
- type: 'text',
- name: 'project_name',
- required: true,
- placeholder: 'my_project_name',
- help: s_('The name of the Jenkins project. Copy the name from the end of the URL to the project.')
- },
- {
- type: 'text',
- name: 'username',
- help: s_('The username for the Jenkins server.')
- },
- {
- type: 'password',
- name: 'password',
- help: s_('The password for the Jenkins server.'),
- non_empty_password_title: s_('ProjectService|Enter new password.'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current password.')
- }
- ]
- end
end
end
diff --git a/app/models/integrations/jira.rb b/app/models/integrations/jira.rb
index a800b9e5baa..992bd01bf5f 100644
--- a/app/models/integrations/jira.rb
+++ b/app/models/integrations/jira.rb
@@ -31,7 +31,6 @@ module Integrations
# We should use username/password for Jira Server and email/api_token for Jira Cloud,
# for more information check: https://gitlab.com/gitlab-org/gitlab-foss/issues/49936.
- before_validation :reset_password
after_commit :update_deployment_type, on: [:create, :update], if: :update_deployment_type?
enum comment_detail: {
@@ -46,12 +45,14 @@ module Integrations
required: true,
title: -> { s_('JiraService|Web URL') },
help: -> { s_('JiraService|Base URL of the Jira instance.') },
- placeholder: 'https://jira.example.com'
+ placeholder: 'https://jira.example.com',
+ exposes_secrets: true
field :api_url,
section: SECTION_TYPE_CONNECTION,
title: -> { s_('JiraService|Jira API URL') },
- help: -> { s_('JiraService|If different from Web URL.') }
+ help: -> { s_('JiraService|If different from Web URL.') },
+ exposes_secrets: true
field :username,
section: SECTION_TYPE_CONNECTION,
@@ -98,13 +99,6 @@ module Integrations
jira_tracker_data || self.build_jira_tracker_data
end
- def reset_password
- return unless reset_password?
-
- data_fields.password = nil
- self.properties = properties.except('password')
- end
-
def set_default_data
return unless issues_tracker.present?
@@ -174,7 +168,8 @@ module Integrations
sections.push({
type: SECTION_TYPE_JIRA_ISSUES,
title: _('Issues'),
- description: jira_issues_section_description
+ description: jira_issues_section_description,
+ plan: 'premium'
})
end
@@ -358,16 +353,7 @@ module Integrations
true
rescue StandardError => error
- log_error(
- "Issue transition failed",
- error: {
- exception_class: error.class.name,
- exception_message: error.message,
- exception_backtrace: Gitlab::BacktraceCleaner.clean_backtrace(error.backtrace)
- },
- client_url: client_url
- )
-
+ log_exception(error, message: 'Issue transition failed', client_url: client_url)
false
end
@@ -544,9 +530,7 @@ module Integrations
yield
rescue StandardError => error
@error = error
- payload = { client_url: client_url }
- Gitlab::ExceptionLogFormatter.format!(error, payload)
- log_error("Error sending message", payload)
+ log_exception(error, message: 'Error sending message', client_url: client_url)
nil
end
@@ -554,15 +538,6 @@ module Integrations
api_url.presence || url
end
- def reset_password?
- # don't reset the password if a new one is provided
- return false if password_touched?
- return true if api_url_changed?
- return false if api_url.present?
-
- url_changed?
- end
-
def update_deployment_type?
api_url_changed? || url_changed? || username_changed? || password_changed?
end
diff --git a/app/models/integrations/mock_ci.rb b/app/models/integrations/mock_ci.rb
index 568fb609a44..cd2928136ef 100644
--- a/app/models/integrations/mock_ci.rb
+++ b/app/models/integrations/mock_ci.rb
@@ -7,7 +7,11 @@ module Integrations
ALLOWED_STATES = %w[failed canceled running pending success success-with-warnings skipped not_found].freeze
- prop_accessor :mock_service_url
+ field :mock_service_url,
+ title: s_('ProjectService|Mock service URL'),
+ placeholder: 'http://localhost:4004',
+ required: true
+
validates :mock_service_url, presence: true, public_url: true, if: :activated?
def title
@@ -22,18 +26,6 @@ module Integrations
'mock_ci'
end
- def fields
- [
- {
- type: 'text',
- name: 'mock_service_url',
- title: s_('ProjectService|Mock service URL'),
- placeholder: 'http://localhost:4004',
- required: true
- }
- ]
- end
-
# Return complete url to build page
#
# Ex.
diff --git a/app/models/integrations/packagist.rb b/app/models/integrations/packagist.rb
index 738319ce835..758c9e4761b 100644
--- a/app/models/integrations/packagist.rb
+++ b/app/models/integrations/packagist.rb
@@ -10,9 +10,6 @@ module Integrations
validates :username, presence: true, if: :activated?
validates :token, presence: true, if: :activated?
- default_value_for :push_events, true
- default_value_for :tag_push_events, true
-
def title
'Packagist'
end
diff --git a/app/models/integrations/prometheus.rb b/app/models/integrations/prometheus.rb
index d6aafe45ae9..427034edb79 100644
--- a/app/models/integrations/prometheus.rb
+++ b/app/models/integrations/prometheus.rb
@@ -27,10 +27,7 @@ module Integrations
after_commit :track_events
- after_create_commit :create_default_alerts
-
scope :preload_project, -> { preload(:project) }
- scope :with_clusters_with_cilium, -> { joins(project: [:clusters]).merge(Clusters::Cluster.with_available_cilium) }
def show_active_box?
false
@@ -169,12 +166,6 @@ module Integrations
manual_configuration_changed? && !manual_configuration?
end
- def create_default_alerts
- return unless project_id
-
- ::Prometheus::CreateDefaultAlertsWorker.perform_async(project_id)
- end
-
def behind_iap?
manual_configuration? && google_iap_audience_client_id.present? && google_iap_service_account_json.present?
end
diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb
index f0f83f118d7..1205173e40b 100644
--- a/app/models/integrations/teamcity.rb
+++ b/app/models/integrations/teamcity.rb
@@ -8,7 +8,22 @@ module Integrations
TEAMCITY_SAAS_HOSTNAME = /\A[^\.]+\.teamcity\.com\z/i.freeze
- prop_accessor :teamcity_url, :build_type, :username, :password
+ field :teamcity_url,
+ title: s_('ProjectService|TeamCity server URL'),
+ placeholder: 'https://teamcity.example.com',
+ required: true
+
+ field :build_type,
+ help: s_('ProjectService|The build configuration ID of the TeamCity project.'),
+ required: true
+
+ field :username,
+ help: s_('ProjectService|Must have permission to trigger a manual build in TeamCity.')
+
+ field :password,
+ type: 'password',
+ non_empty_password_title: s_('ProjectService|Enter new password'),
+ non_empty_password_help: s_('ProjectService|Leave blank to use your current password')
validates :teamcity_url, presence: true, public_url: true, if: :activated?
validates :build_type, presence: true, if: :activated?
@@ -51,35 +66,6 @@ module Integrations
s_('To run CI/CD pipelines with JetBrains TeamCity, input the GitLab project details in the TeamCity project Version Control Settings.')
end
- def fields
- [
- {
- type: 'text',
- name: 'teamcity_url',
- title: s_('ProjectService|TeamCity server URL'),
- placeholder: 'https://teamcity.example.com',
- required: true
- },
- {
- type: 'text',
- name: 'build_type',
- help: s_('ProjectService|The build configuration ID of the TeamCity project.'),
- required: true
- },
- {
- type: 'text',
- name: 'username',
- help: s_('ProjectService|Must have permission to trigger a manual build in TeamCity.')
- },
- {
- type: 'password',
- name: 'password',
- non_empty_password_title: s_('ProjectService|Enter new password'),
- non_empty_password_help: s_('ProjectService|Leave blank to use your current password')
- }
- ]
- end
-
def build_page(sha, ref)
with_reactive_cache(sha, ref) {|cached| cached[:build_page] }
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 484cceb9129..d4eb77ef6de 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -88,6 +88,7 @@ class Issue < ApplicationRecord
has_many :prometheus_alerts, through: :prometheus_alert_events
has_many :issue_customer_relations_contacts, class_name: 'CustomerRelations::IssueContact', inverse_of: :issue
has_many :customer_relations_contacts, through: :issue_customer_relations_contacts, source: :contact, class_name: 'CustomerRelations::Contact', inverse_of: :issues
+ has_many :incident_management_timeline_events, class_name: 'IncidentManagement::TimelineEvent', foreign_key: :issue_id, inverse_of: :incident
alias_attribute :escalation_status, :incident_management_issuable_escalation_status
@@ -142,14 +143,12 @@ class Issue < ApplicationRecord
scope :with_issue_type, ->(types) { where(issue_type: types) }
scope :without_issue_type, ->(types) { where.not(issue_type: types) }
- scope :public_only, -> {
- without_hidden.where(confidential: false)
- }
+ scope :public_only, -> { where(confidential: false) }
scope :confidential_only, -> { where(confidential: true) }
scope :without_hidden, -> {
- if Feature.enabled?(:ban_user_feature_flag, default_enabled: :yaml)
+ if Feature.enabled?(:ban_user_feature_flag)
where('NOT EXISTS (?)', Users::BannedUser.select(1).where('issues.author_id = banned_users.user_id'))
else
all
diff --git a/app/models/key.rb b/app/models/key.rb
index 42ea0f29171..e093f9faad3 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -5,7 +5,7 @@ require 'digest/md5'
class Key < ApplicationRecord
include AfterCommitQueue
include Sortable
- include Sha256Attribute
+ include ShaAttribute
include Expirable
include FromUnion
@@ -24,17 +24,12 @@ class Key < ApplicationRecord
length: { maximum: 5000 },
format: { with: /\A(#{Gitlab::SSHPublicKey.supported_algorithms.join('|')})/ }
- validates :fingerprint,
- uniqueness: true,
- presence: { message: 'cannot be generated' },
- unless: -> { Gitlab::FIPS.enabled? }
-
validates :fingerprint_sha256,
uniqueness: true,
- presence: { message: 'cannot be generated' },
- if: -> { Gitlab::FIPS.enabled? }
+ presence: { message: 'cannot be generated' }
validate :key_meets_restrictions
+ validate :expiration, on: :create
delegate :name, :email, to: :user, prefix: true
@@ -154,6 +149,10 @@ class Key < ApplicationRecord
"type is forbidden. Must be #{Gitlab::Utils.to_exclusive_sentence(allowed_types)}"
end
+
+ def expiration
+ errors.add(:key, message: 'has expired') if expired?
+ end
end
Key.prepend_mod_with('Key')
diff --git a/app/models/label.rb b/app/models/label.rb
index 4c9f071f43a..7f4556c11c9 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -160,11 +160,6 @@ class Label < ApplicationRecord
on_project_boards(project_id).where(id: label_id).exists?
end
- # Generate a hex color based on hex-encoded value
- def self.color_for(value)
- "##{Digest::MD5.hexdigest(value)[0..5]}"
- end
-
def open_issues_count(user = nil)
issues_count(user, state: 'opened')
end
diff --git a/app/models/loose_foreign_keys/deleted_record.rb b/app/models/loose_foreign_keys/deleted_record.rb
index ebda5872f1c..6dfd6ea2aae 100644
--- a/app/models/loose_foreign_keys/deleted_record.rb
+++ b/app/models/loose_foreign_keys/deleted_record.rb
@@ -10,7 +10,7 @@ class LooseForeignKeys::DeletedRecord < Gitlab::Database::SharedModel
partitioned_by :partition, strategy: :sliding_list,
next_partition_if: -> (active_partition) do
- return false if Feature.disabled?(:lfk_automatic_partition_creation, default_enabled: :yaml)
+ return false if Feature.disabled?(:lfk_automatic_partition_creation)
oldest_record_in_partition = LooseForeignKeys::DeletedRecord
.select(:id, :created_at)
@@ -22,7 +22,7 @@ class LooseForeignKeys::DeletedRecord < Gitlab::Database::SharedModel
oldest_record_in_partition.present? && oldest_record_in_partition.created_at < PARTITION_DURATION.ago
end,
detach_partition_if: -> (partition) do
- return false if Feature.disabled?(:lfk_automatic_partition_dropping, default_enabled: :yaml)
+ return false if Feature.disabled?(:lfk_automatic_partition_dropping)
!LooseForeignKeys::DeletedRecord
.for_partition(partition)
diff --git a/app/models/member.rb b/app/models/member.rb
index 18ad2785d6e..a5084c8a60c 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -77,6 +77,10 @@ class Member < ApplicationRecord
]).merge(self)
end
+ scope :excluding_users, ->(user_ids) do
+ where.not(user_id: user_ids)
+ end
+
# This scope encapsulates (most of) the conditions a row in the member table
# must satisfy if it is a valid permission. Of particular note:
#
@@ -165,6 +169,7 @@ class Member < ApplicationRecord
scope :owners, -> { active.where(access_level: OWNER) }
scope :owners_and_maintainers, -> { active.where(access_level: [OWNER, MAINTAINER]) }
scope :with_user, -> (user) { where(user: user) }
+ scope :by_access_level, -> (access_level) { active.where(access_level: access_level) }
scope :preload_user_and_notification_settings, -> { preload(user: :notification_settings) }
@@ -516,7 +521,7 @@ class Member < ApplicationRecord
end
def blocking_refresh
- return true unless Feature.enabled?(:allow_non_blocking_member_refresh, default_enabled: :yaml)
+ return true unless Feature.enabled?(:allow_non_blocking_member_refresh)
return true if @blocking_refresh.nil?
@blocking_refresh
diff --git a/app/models/members_preloader.rb b/app/models/members_preloader.rb
index 8b8eca54550..ba7e4b39989 100644
--- a/app/models/members_preloader.rb
+++ b/app/models/members_preloader.rb
@@ -13,7 +13,7 @@ class MembersPreloader
ActiveRecord::Associations::Preloader.new.preload(members, :created_by)
ActiveRecord::Associations::Preloader.new.preload(members, user: :status)
ActiveRecord::Associations::Preloader.new.preload(members, user: :u2f_registrations)
- ActiveRecord::Associations::Preloader.new.preload(members, user: :webauthn_registrations) if Feature.enabled?(:webauthn, default_enabled: :yaml)
+ ActiveRecord::Associations::Preloader.new.preload(members, user: :webauthn_registrations) if Feature.enabled?(:webauthn)
end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 4c6ed399bf9..39b5949ea7a 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -1152,7 +1152,7 @@ class MergeRequest < ApplicationRecord
# rubocop: disable CodeReuse/ServiceClass
def mergeable_state?(skip_ci_check: false, skip_discussions_check: false)
- if Feature.enabled?(:improved_mergeability_checks, self.project, default_enabled: :yaml)
+ if Feature.enabled?(:improved_mergeability_checks, self.project)
additional_checks = MergeRequests::Mergeability::RunChecksService.new(
merge_request: self,
params: {
@@ -1438,30 +1438,8 @@ class MergeRequest < ApplicationRecord
actual_head_pipeline.success?
end
- ##
- # This method is for looking for active environments which created via pipelines for merge requests.
- # Since deployments run on a merge request ref (e.g. `refs/merge-requests/:iid/head`),
- # we cannot look up environments with source branch name.
- def legacy_environments
- return Environment.none unless actual_head_pipeline&.merge_request?
-
- build_for_actual_head_pipeline = Ci::Build.latest.where(pipeline: actual_head_pipeline)
-
- environments = build_for_actual_head_pipeline.joins(:metadata)
- .where.not('ci_builds_metadata.expanded_environment_name' => nil)
- .distinct('ci_builds_metadata.expanded_environment_name')
- .limit(100)
- .pluck(:expanded_environment_name)
-
- Environment.where(project: project, name: environments)
- end
-
def environments_in_head_pipeline(deployment_status: nil)
- if ::Feature.enabled?(:fix_related_environments_for_merge_requests, target_project, default_enabled: :yaml)
- actual_head_pipeline&.environments_in_self_and_descendants(deployment_status: deployment_status) || Environment.none
- else
- legacy_environments
- end
+ actual_head_pipeline&.environments_in_self_and_descendants(deployment_status: deployment_status) || Environment.none
end
def fetch_ref!
@@ -1977,10 +1955,6 @@ class MergeRequest < ApplicationRecord
end
end
- def attention_requested_enabled?
- Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml)
- end
-
private
attr_accessor :skip_fetch_ref
diff --git a/app/models/merge_request_assignee.rb b/app/models/merge_request_assignee.rb
index 77b46fa50f4..fd8e5860040 100644
--- a/app/models/merge_request_assignee.rb
+++ b/app/models/merge_request_assignee.rb
@@ -10,12 +10,6 @@ class MergeRequestAssignee < ApplicationRecord
scope :in_projects, ->(project_ids) { joins(:merge_request).where(merge_requests: { target_project_id: project_ids }) }
- def set_state
- if Feature.enabled?(:mr_attention_requests, self.merge_request&.project, default_enabled: :yaml)
- self.state = MergeRequestReviewer.find_by(user_id: self.user_id, merge_request_id: self.merge_request_id)&.state || :attention_requested
- end
- end
-
def cache_key
[model_name.cache_key, id, state, assignee.cache_key]
end
diff --git a/app/models/merge_request_reviewer.rb b/app/models/merge_request_reviewer.rb
index 8c75fb2e4e6..4abf0fa09f0 100644
--- a/app/models/merge_request_reviewer.rb
+++ b/app/models/merge_request_reviewer.rb
@@ -6,12 +6,6 @@ class MergeRequestReviewer < ApplicationRecord
belongs_to :merge_request
belongs_to :reviewer, class_name: 'User', foreign_key: :user_id, inverse_of: :merge_request_reviewers
- def set_state
- if Feature.enabled?(:mr_attention_requests, self.merge_request&.project, default_enabled: :yaml)
- self.state = MergeRequestAssignee.find_by(user_id: self.user_id, merge_request_id: self.merge_request_id)&.state || :attention_requested
- end
- end
-
def cache_key
[model_name.cache_key, id, state, reviewer.cache_key]
end
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 3b75b6d163a..fcd641671f5 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -16,6 +16,7 @@ class Namespace < ApplicationRecord
include Namespaces::Traversal::Linear
include EachBatch
include BlocksUnsafeSerialization
+ include Ci::NamespaceSettings
# Temporary column used for back-filling project namespaces.
# Remove it once the back-filling of all project namespaces is done.
@@ -44,6 +45,7 @@ class Namespace < ApplicationRecord
has_many :projects, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :project_statistics
has_one :namespace_settings, inverse_of: :namespace, class_name: 'NamespaceSetting', autosave: true
+ has_one :ci_cd_settings, inverse_of: :namespace, class_name: 'NamespaceCiCdSetting', autosave: true
has_one :namespace_statistics
has_one :namespace_route, foreign_key: :namespace_id, autosave: false, inverse_of: :namespace, class_name: 'Route'
has_many :namespace_members, foreign_key: :member_namespace_id, inverse_of: :member_namespace, class_name: 'Member'
@@ -110,6 +112,8 @@ class Namespace < ApplicationRecord
delegate :name, to: :owner, allow_nil: true, prefix: true
delegate :avatar_url, to: :owner, allow_nil: true
+ delegate :prevent_sharing_groups_outside_hierarchy, :prevent_sharing_groups_outside_hierarchy=,
+ to: :namespace_settings, allow_nil: true
after_save :schedule_sync_event_worker, if: -> { saved_change_to_id? || saved_change_to_parent_id? }
@@ -126,7 +130,7 @@ class Namespace < ApplicationRecord
before_destroy(prepend: true) { prepare_for_destroy }
after_destroy :rm_dir
after_commit :expire_child_caches, on: :update, if: -> {
- Feature.enabled?(:cached_route_lookups, self, type: :ops, default_enabled: :yaml) &&
+ Feature.enabled?(:cached_route_lookups, self, type: :ops) &&
saved_change_to_name? || saved_change_to_path? || saved_change_to_parent_id?
}
@@ -238,11 +242,11 @@ class Namespace < ApplicationRecord
return unless host.ends_with?(gitlab_host)
name = host.delete_suffix(gitlab_host)
- Namespace.where(parent_id: nil).by_path(name)
+ Namespace.top_most.by_path(name)
end
def top_most
- where(parent_id: nil)
+ by_parent(nil)
end
end
@@ -351,7 +355,7 @@ class Namespace < ApplicationRecord
# Includes projects from this namespace and projects from all subgroups
# that belongs to this namespace
def all_projects
- if Feature.enabled?(:recursive_approach_for_all_projects, default_enabled: :yaml)
+ if Feature.enabled?(:recursive_approach_for_all_projects)
namespace = user_namespace? ? self : self_and_descendant_ids
Project.where(namespace: namespace)
else
@@ -372,6 +376,10 @@ class Namespace < ApplicationRecord
false
end
+ def all_project_ids_except(ids)
+ all_projects.where.not(id: ids).pluck(:id)
+ end
+
# Deprecated, use #licensed_feature_available? instead. Remove once Namespace#feature_available? isn't used anymore.
def feature_available?(feature, _user = nil)
licensed_feature_available?(feature)
@@ -512,7 +520,7 @@ class Namespace < ApplicationRecord
end
def issue_repositioning_disabled?
- Feature.enabled?(:block_issue_repositioning, self, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:block_issue_repositioning, self, type: :ops)
end
def storage_enforcement_date
@@ -521,6 +529,12 @@ class Namespace < ApplicationRecord
nil
end
+ def certificate_based_clusters_enabled?
+ ::Gitlab::SafeRequestStore.fetch("certificate_based_clusters:ns:#{self.id}") do
+ Feature.enabled?(:certificate_based_clusters, self, type: :ops)
+ end
+ end
+
private
def expire_child_caches
@@ -634,7 +648,7 @@ class Namespace < ApplicationRecord
end
def cache_first_auto_devops_config?
- ::Feature.enabled?(:namespaces_cache_first_auto_devops_config, default_enabled: :yaml)
+ ::Feature.enabled?(:namespaces_cache_first_auto_devops_config)
end
def write_projects_repository_config
diff --git a/app/models/namespace_ci_cd_setting.rb b/app/models/namespace_ci_cd_setting.rb
new file mode 100644
index 00000000000..c9c3a3206b6
--- /dev/null
+++ b/app/models/namespace_ci_cd_setting.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class NamespaceCiCdSetting < ApplicationRecord # rubocop:disable Gitlab/NamespacedClass
+ belongs_to :namespace, inverse_of: :ci_cd_settings
+
+ self.primary_key = :namespace_id
+end
+
+NamespaceCiCdSetting.prepend_mod
diff --git a/app/models/namespaces/traversal/linear.rb b/app/models/namespaces/traversal/linear.rb
index 6320e0bc39d..b0350b0288f 100644
--- a/app/models/namespaces/traversal/linear.rb
+++ b/app/models/namespaces/traversal/linear.rb
@@ -77,38 +77,38 @@ module Namespaces
end
def sync_traversal_ids?
- Feature.enabled?(:sync_traversal_ids, root_ancestor, default_enabled: :yaml)
+ Feature.enabled?(:sync_traversal_ids, root_ancestor)
end
def use_traversal_ids?
- return false unless Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ return false unless Feature.enabled?(:use_traversal_ids)
traversal_ids.present?
end
def use_traversal_ids_for_self_and_hierarchy?
return false unless use_traversal_ids?
- return false unless Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy, root_ancestor, default_enabled: :yaml)
+ return false unless Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy, root_ancestor)
traversal_ids.present?
end
def use_traversal_ids_for_ancestors?
return false unless use_traversal_ids?
- return false unless Feature.enabled?(:use_traversal_ids_for_ancestors, root_ancestor, default_enabled: :yaml)
+ return false unless Feature.enabled?(:use_traversal_ids_for_ancestors, root_ancestor)
traversal_ids.present?
end
def use_traversal_ids_for_ancestors_upto?
return false unless use_traversal_ids?
- return false unless Feature.enabled?(:use_traversal_ids_for_ancestors_upto, root_ancestor, default_enabled: :yaml)
+ return false unless Feature.enabled?(:use_traversal_ids_for_ancestors_upto, root_ancestor)
traversal_ids.present?
end
def use_traversal_ids_for_root_ancestor?
- return false unless Feature.enabled?(:use_traversal_ids_for_root_ancestor, default_enabled: :yaml)
+ return false unless Feature.enabled?(:use_traversal_ids_for_root_ancestor)
traversal_ids.present?
end
diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb
index 0cac4c9143a..f0e9a8feeb2 100644
--- a/app/models/namespaces/traversal/linear_scopes.rb
+++ b/app/models/namespaces/traversal/linear_scopes.rb
@@ -55,7 +55,7 @@ module Namespaces
def self_and_descendants(include_self: true)
return super unless use_traversal_ids_for_descendants_scopes?
- if Feature.enabled?(:traversal_ids_btree, default_enabled: :yaml)
+ if Feature.enabled?(:traversal_ids_btree)
self_and_descendants_with_comparison_operators(include_self: include_self)
else
records = self_and_descendants_with_duplicates_with_array_operator(include_self: include_self)
@@ -67,7 +67,7 @@ module Namespaces
def self_and_descendant_ids(include_self: true)
return super unless use_traversal_ids_for_descendants_scopes?
- if Feature.enabled?(:traversal_ids_btree, default_enabled: :yaml)
+ if Feature.enabled?(:traversal_ids_btree)
self_and_descendants_with_comparison_operators(include_self: include_self).as_ids
else
self_and_descendants_with_duplicates_with_array_operator(include_self: include_self)
@@ -102,26 +102,26 @@ module Namespaces
private
def use_traversal_ids?
- Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ Feature.enabled?(:use_traversal_ids)
end
def use_traversal_ids_roots?
- Feature.enabled?(:use_traversal_ids_roots, default_enabled: :yaml) &&
+ Feature.enabled?(:use_traversal_ids_roots) &&
use_traversal_ids?
end
def use_traversal_ids_for_ancestor_scopes?
- Feature.enabled?(:use_traversal_ids_for_ancestor_scopes, default_enabled: :yaml) &&
+ Feature.enabled?(:use_traversal_ids_for_ancestor_scopes) &&
use_traversal_ids?
end
def use_traversal_ids_for_descendants_scopes?
- Feature.enabled?(:use_traversal_ids_for_descendants_scopes, default_enabled: :yaml) &&
+ Feature.enabled?(:use_traversal_ids_for_descendants_scopes) &&
use_traversal_ids?
end
def use_traversal_ids_for_self_and_hierarchy_scopes?
- Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy_scopes, default_enabled: :yaml) &&
+ Feature.enabled?(:use_traversal_ids_for_self_and_hierarchy_scopes) &&
use_traversal_ids?
end
diff --git a/app/models/packages/build_info.rb b/app/models/packages/build_info.rb
index 38245bef7a5..61e2194006b 100644
--- a/app/models/packages/build_info.rb
+++ b/app/models/packages/build_info.rb
@@ -7,6 +7,6 @@ class Packages::BuildInfo < ApplicationRecord
scope :pluck_pipeline_ids, -> { pluck(:pipeline_id) }
scope :without_empty_pipelines, -> { where.not(pipeline_id: nil) }
scope :order_by_pipeline_id, -> (direction) { order(pipeline_id: direction) }
- scope :with_pipeline_id_less_than, -> (pipeline_id) { where("pipeline_id < ?", pipeline_id) }
- scope :with_pipeline_id_greater_than, -> (pipeline_id) { where("pipeline_id > ?", pipeline_id) }
+ scope :with_pipeline_id_less_than, -> (pipeline_id) { where("#{table_name}.pipeline_id < ?", pipeline_id) }
+ scope :with_pipeline_id_greater_than, -> (pipeline_id) { where("#{table_name}.pipeline_id > ?", pipeline_id) }
end
diff --git a/app/models/packages/cleanup.rb b/app/models/packages/cleanup.rb
new file mode 100644
index 00000000000..16bba4f445d
--- /dev/null
+++ b/app/models/packages/cleanup.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+module Packages
+ module Cleanup
+ def self.table_name_prefix
+ 'packages_cleanup_'
+ end
+ end
+end
diff --git a/app/models/packages/cleanup/policy.rb b/app/models/packages/cleanup/policy.rb
new file mode 100644
index 00000000000..87c101cfb8c
--- /dev/null
+++ b/app/models/packages/cleanup/policy.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+module Packages
+ module Cleanup
+ class Policy < ApplicationRecord
+ include Schedulable
+
+ KEEP_N_DUPLICATED_PACKAGE_FILES_VALUES = %w[all 1 10 20 30 40 50].freeze
+
+ self.primary_key = :project_id
+
+ belongs_to :project
+
+ validates :project, presence: true
+ validates :keep_n_duplicated_package_files,
+ inclusion: {
+ in: KEEP_N_DUPLICATED_PACKAGE_FILES_VALUES,
+ message: 'keep_n_duplicated_package_files is invalid'
+ }
+
+ # used by Schedulable
+ def self.active
+ where.not(keep_n_duplicated_package_files: 'all')
+ end
+
+ def set_next_run_at
+ # fixed cadence of 12 hours
+ self.next_run_at = Time.zone.now + 12.hours
+ end
+ end
+ end
+end
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb
index 2804588be85..93119bbff1f 100644
--- a/app/models/pages_domain.rb
+++ b/app/models/pages_domain.rb
@@ -245,8 +245,9 @@ class PagesDomain < ApplicationRecord
def validate_pages_domain
return unless domain
- if domain.downcase.ends_with?(".#{Settings.pages.host.downcase}") || domain.casecmp(Settings.pages.host) == 0
- self.errors.add(:domain, "#{Settings.pages.host} and its subdomains cannot be used as custom pages domains. Please compare our documentation at https://docs.gitlab.com/ee/administration/pages/#advanced-configuration against your configuration.")
+ if domain.downcase.ends_with?(".#{Settings.pages.host.downcase}")
+ error_template = _("Subdomains of the Pages root domain %{root_domain} are reserved and cannot be used as custom Pages domains.")
+ self.errors.add(:domain, error_template % { root_domain: Settings.pages.host })
end
end
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
index 021ff789b13..68ba3d6eab4 100644
--- a/app/models/personal_access_token.rb
+++ b/app/models/personal_access_token.rb
@@ -49,10 +49,6 @@ class PersonalAccessToken < ApplicationRecord
!revoked? && !expired?
end
- def expired_but_not_enforced?
- false
- end
-
def self.redis_getdel(user_id)
Gitlab::Redis::SharedState.with do |redis|
redis_key = redis_shared_state_key(user_id)
diff --git a/app/models/preloaders/group_root_ancestor_preloader.rb b/app/models/preloaders/group_root_ancestor_preloader.rb
index 3ca713d9635..29c60e90964 100644
--- a/app/models/preloaders/group_root_ancestor_preloader.rb
+++ b/app/models/preloaders/group_root_ancestor_preloader.rb
@@ -8,7 +8,7 @@ module Preloaders
end
def execute
- return unless ::Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ return unless ::Feature.enabled?(:use_traversal_ids)
# type == 'Group' condition located on subquery to prevent a filter in the query
root_query = Namespace.joins("INNER JOIN (#{join_sql}) as root_query ON root_query.root_id = namespaces.id")
diff --git a/app/models/preloaders/user_max_access_level_in_groups_preloader.rb b/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
index 2cd54b975f3..8df986b47a2 100644
--- a/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
+++ b/app/models/preloaders/user_max_access_level_in_groups_preloader.rb
@@ -10,7 +10,7 @@ module Preloaders
end
def execute
- if ::Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ if ::Feature.enabled?(:use_traversal_ids)
preload_with_traversal_ids
else
preload_direct_memberships
diff --git a/app/models/preloaders/user_max_access_level_in_projects_preloader.rb b/app/models/preloaders/user_max_access_level_in_projects_preloader.rb
index 3764e9dcb16..2e2272a2ef5 100644
--- a/app/models/preloaders/user_max_access_level_in_projects_preloader.rb
+++ b/app/models/preloaders/user_max_access_level_in_projects_preloader.rb
@@ -5,25 +5,50 @@ module Preloaders
# stores the values in requests store via the ProjectTeam class.
class UserMaxAccessLevelInProjectsPreloader
def initialize(projects, user)
- @projects = projects
+ @projects = if projects.is_a?(Array)
+ Project.where(id: projects)
+ else
+ # Push projects base query in to a sub-select to avoid
+ # table name clashes. Performs better than aliasing.
+ Project.where(id: projects.reselect(:id))
+ end
+
@user = user
end
def execute
- # Use reselect to override the existing select to prevent
- # the error `subquery has too many columns`
- # NotificationsController passes in an Array so we need to check the type
- project_ids = @projects.is_a?(ActiveRecord::Relation) ? @projects.reselect(:id) : @projects
- access_levels = @user
- .project_authorizations
- .where(project_id: project_ids)
- .group(:project_id)
- .maximum(:access_level)
-
- @projects.each do |project|
- access_level = access_levels[project.id] || Gitlab::Access::NO_ACCESS
+ project_authorizations = ProjectAuthorization.arel_table
+
+ auths = @projects
+ .select(
+ Project.default_select_columns,
+ project_authorizations[:user_id],
+ project_authorizations[:access_level]
+ )
+ .joins(project_auth_join)
+
+ auths.each do |project|
+ access_level = project.access_level || Gitlab::Access::NO_ACCESS
ProjectTeam.new(project).write_member_access_for_user_id(@user.id, access_level)
end
end
+
+ private
+
+ def project_auth_join
+ project_authorizations = ProjectAuthorization.arel_table
+ projects = Project.arel_table
+
+ projects
+ .join(
+ project_authorizations.as(project_authorizations.name),
+ Arel::Nodes::OuterJoin
+ )
+ .on(
+ project_authorizations[:project_id].eq(projects[:id])
+ .and(project_authorizations[:user_id].eq(@user.id))
+ )
+ .join_sources
+ end
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index f7182d1645c..f4e39524e47 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -49,6 +49,7 @@ class Project < ApplicationRecord
ignore_columns :container_registry_enabled, remove_after: '2021-09-22', remove_with: '14.4'
BoardLimitExceeded = Class.new(StandardError)
+ ExportLimitExceeded = Class.new(StandardError)
ignore_columns :mirror_last_update_at, :mirror_last_successful_update_at, remove_after: '2021-09-22', remove_with: '14.4'
ignore_columns :pull_mirror_branch_prefix, remove_after: '2021-09-22', remove_with: '14.4'
@@ -112,7 +113,7 @@ class Project < ApplicationRecord
default_value_for(:ci_config_path) { Gitlab::CurrentSettings.default_ci_config_path }
add_authentication_token_field :runners_token,
- encrypted: -> { Feature.enabled?(:projects_tokens_optional_encryption, default_enabled: true) ? :optional : :required },
+ encrypted: -> { Feature.enabled?(:projects_tokens_optional_encryption) ? :optional : :required },
prefix: RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX
before_validation :mark_remote_mirrors_for_removal, if: -> { RemoteMirror.table_exists? }
@@ -237,6 +238,7 @@ class Project < ApplicationRecord
has_many :package_files, through: :packages, class_name: 'Packages::PackageFile'
# 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::ProjectDistribution', dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
+ has_one :packages_cleanup_policy, class_name: 'Packages::Cleanup::Policy', inverse_of: :project
has_one :import_state, autosave: true, class_name: 'ProjectImportState', inverse_of: :project
has_one :import_export_upload, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
@@ -409,7 +411,6 @@ class Project < ApplicationRecord
has_one :operations_feature_flags_client, class_name: 'Operations::FeatureFlagsClient'
has_many :operations_feature_flags_user_lists, class_name: 'Operations::FeatureFlags::UserList'
- has_many :error_tracking_errors, inverse_of: :project, class_name: 'ErrorTracking::Error'
has_many :error_tracking_client_keys, inverse_of: :project, class_name: 'ErrorTracking::ClientKey'
has_many :timelogs
@@ -448,6 +449,7 @@ class Project < ApplicationRecord
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?,
@@ -462,7 +464,7 @@ class Project < ApplicationRecord
delegate :add_user, :add_users, 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, to: :namespace, allow_nil: true
+ delegate :root_ancestor, :certificate_based_clusters_enabled?, 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
@@ -471,6 +473,7 @@ class Project < ApplicationRecord
delegate :job_token_scope_enabled, :job_token_scope_enabled=, to: :ci_cd_settings, prefix: :ci, allow_nil: true
delegate :keep_latest_artifact, :keep_latest_artifact=, to: :ci_cd_settings, allow_nil: true
delegate :restrict_user_defined_variables, :restrict_user_defined_variables=, to: :ci_cd_settings, allow_nil: true
+ delegate :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
delegate :actual_limits, :actual_plan_name, :actual_plan, to: :namespace, allow_nil: true
delegate :allow_merge_on_skipped_pipeline, :allow_merge_on_skipped_pipeline?,
@@ -742,6 +745,16 @@ class Project < ApplicationRecord
Project.with(cte.to_arel).from(cte.alias_to(Project.arel_table))
end
+ def self.inactive
+ project_statistics = ::ProjectStatistics.arel_table
+ minimum_size_mb = ::Gitlab::CurrentSettings.inactive_projects_min_size_mb.megabytes
+ last_activity_cutoff = ::Gitlab::CurrentSettings.inactive_projects_send_warning_email_after_months.months.ago
+
+ joins(:statistics)
+ .where((project_statistics[:storage_size]).gt(minimum_size_mb))
+ .where('last_activity_at < ?', last_activity_cutoff)
+ end
+
scope :active, -> { joins(:issues, :notes, :merge_requests).order('issues.created_at, notes.created_at, merge_requests.created_at DESC') }
scope :abandoned, -> { where('projects.last_activity_at < ?', 6.months.ago) }
@@ -962,7 +975,7 @@ class Project < ApplicationRecord
end
def ancestors(hierarchy_order: nil)
- if Feature.enabled?(:linear_project_ancestors, self, default_enabled: :yaml)
+ if Feature.enabled?(:linear_project_ancestors, self)
group&.self_and_ancestors(hierarchy_order: hierarchy_order) || Group.none
else
ancestors_upto(hierarchy_order: hierarchy_order)
@@ -1013,6 +1026,10 @@ class Project < ApplicationRecord
packages.where(package_type: package_type).exists?
end
+ def packages_cleanup_policy
+ super || build_packages_cleanup_policy
+ end
+
def first_auto_devops_config
return namespace.first_auto_devops_config if auto_devops&.enabled.nil?
@@ -1020,7 +1037,7 @@ class Project < ApplicationRecord
end
def unlink_forks_upon_visibility_decrease_enabled?
- Feature.enabled?(:unlink_fork_network_upon_visibility_decrease, self, default_enabled: true)
+ Feature.enabled?(:unlink_fork_network_upon_visibility_decrease, self)
end
# LFS and hashed repository storage are required for using Design Management.
@@ -2047,6 +2064,8 @@ class Project < ApplicationRecord
end
def add_export_job(current_user:, after_export_strategy: nil, params: {})
+ check_project_export_limit!
+
job_id = ProjectExportWorker.perform_async(current_user.id, self.id, after_export_strategy, params)
if job_id
@@ -2866,12 +2885,12 @@ class Project < ApplicationRecord
end
def work_items_feature_flag_enabled?
- group&.work_items_feature_flag_enabled? || Feature.enabled?(:work_items, self, default_enabled: :yaml)
+ group&.work_items_feature_flag_enabled? || Feature.enabled?(:work_items, self)
end
def enqueue_record_project_target_platforms
return unless Gitlab.com?
- return unless Feature.enabled?(:record_projects_target_platforms, self, default_enabled: :yaml)
+ return unless Feature.enabled?(:record_projects_target_platforms, self)
Projects::RecordTargetPlatformsWorker.perform_async(id)
end
@@ -2903,7 +2922,7 @@ class Project < ApplicationRecord
if @topic_list != self.topic_list
self.topics.delete_all
self.topics = @topic_list.map do |topic|
- Projects::Topic.where('lower(name) = ?', topic.downcase).order(total_projects_count: :desc).first_or_create(name: topic)
+ Projects::Topic.where('lower(name) = ?', topic.downcase).order(total_projects_count: :desc).first_or_create(name: topic, title: topic)
end
end
@@ -3105,6 +3124,14 @@ class Project < ApplicationRecord
Projects::SyncEvent.enqueue_worker
end
end
+
+ def check_project_export_limit!
+ return if Gitlab::CurrentSettings.current_application_settings.max_export_size == 0
+
+ if self.statistics.storage_size > Gitlab::CurrentSettings.current_application_settings.max_export_size.megabytes
+ raise ExportLimitExceeded, _('The project size exceeds the export limit.')
+ end
+ end
end
Project.prepend_mod_with('Project')
diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb
index 28a493cae33..38740aa20dd 100644
--- a/app/models/project_ci_cd_setting.rb
+++ b/app/models/project_ci_cd_setting.rb
@@ -18,11 +18,12 @@ class ProjectCiCdSetting < ApplicationRecord
allow_nil: true
default_value_for :forward_deployment_enabled, true
+ default_value_for :separated_caches, true
chronic_duration_attr :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval
def forward_deployment_enabled?
- super && ::Feature.enabled?(:forward_deployment_enabled, project, default_enabled: true)
+ super && ::Feature.enabled?(:forward_deployment_enabled, project)
end
def keep_latest_artifacts_available?
diff --git a/app/models/project_import_state.rb b/app/models/project_import_state.rb
index fabbd5b49cb..b1c1a5b6697 100644
--- a/app/models/project_import_state.rb
+++ b/app/models/project_import_state.rb
@@ -69,11 +69,9 @@ class ProjectImportState < ApplicationRecord
project.reset_cache_and_import_attrs
if Gitlab::ImportSources.importer_names.include?(project.import_type) && project.repo_exists?
- # rubocop: disable CodeReuse/ServiceClass
state.run_after_commit do
- Projects::AfterImportService.new(project).execute
+ Projects::AfterImportWorker.perform_async(project.id)
end
- # rubocop: enable CodeReuse/ServiceClass
end
end
end
diff --git a/app/models/project_pages_metadatum.rb b/app/models/project_pages_metadatum.rb
index dc1e9319340..7a3ece4bc92 100644
--- a/app/models/project_pages_metadatum.rb
+++ b/app/models/project_pages_metadatum.rb
@@ -8,8 +8,6 @@ class ProjectPagesMetadatum < ApplicationRecord
self.primary_key = :project_id
- ignore_columns :artifacts_archive_id, remove_with: '15.0', remove_after: '2022-04-22'
-
belongs_to :project, inverse_of: :pages_metadatum
belongs_to :pages_deployment
diff --git a/app/models/project_setting.rb b/app/models/project_setting.rb
index 6cd6eee2616..e9fd7e4446c 100644
--- a/app/models/project_setting.rb
+++ b/app/models/project_setting.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ProjectSetting < ApplicationRecord
- ALLOWED_TARGET_PLATFORMS = %w(ios osx tvos watchos).freeze
+ ALLOWED_TARGET_PLATFORMS = %w(ios osx tvos watchos android).freeze
belongs_to :project, inverse_of: :project_setting
@@ -21,7 +21,7 @@ class ProjectSetting < ApplicationRecord
validate :validates_mr_default_target_self
default_value_for(:legacy_open_source_license_available) do
- Feature.enabled?(:legacy_open_source_license_available, default_enabled: :yaml, type: :ops)
+ Feature.enabled?(:legacy_open_source_license_available, type: :ops)
end
def squash_enabled_by_default?
@@ -36,6 +36,15 @@ class ProjectSetting < ApplicationRecord
super(val&.map(&:to_s)&.sort)
end
+ def human_squash_option
+ case squash_option
+ when 'never' then 'Do not allow'
+ when 'always' then 'Require'
+ when 'default_on' then 'Encourage'
+ when 'default_off' then 'Allow'
+ end
+ end
+
private
def validates_mr_default_target_self
diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb
index 99cec647a98..95fc135f38f 100644
--- a/app/models/project_statistics.rb
+++ b/app/models/project_statistics.rb
@@ -19,7 +19,7 @@ class ProjectStatistics < ApplicationRecord
before_save :update_storage_size
- COLUMNS_TO_REFRESH = [:repository_size, :wiki_size, :lfs_objects_size, :commit_count, :snippets_size, :uploads_size].freeze
+ COLUMNS_TO_REFRESH = [:repository_size, :wiki_size, :lfs_objects_size, :commit_count, :snippets_size, :uploads_size, :container_registry_size].freeze
INCREMENTABLE_COLUMNS = {
build_artifacts_size: %i[storage_size],
packages_size: %i[storage_size],
@@ -76,6 +76,12 @@ class ProjectStatistics < ApplicationRecord
self.uploads_size = project.uploads.sum(:size)
end
+ def update_container_registry_size
+ return unless Feature.enabled?(:container_registry_project_statistics, project)
+
+ self.container_registry_size = project.container_repositories_size || 0
+ end
+
# `wiki_size` and `snippets_size` have no default value in the database
# and the column can be nil.
# This means that, when the columns were added, all rows had nil
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index 4b89d95c1a3..bb5363598df 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -193,6 +193,10 @@ class ProjectTeam
project.merge_value_to_request_store(User, user_id, project_access_level)
end
+ def purge_member_access_cache_for_user_id(user_id)
+ project.purge_resource_id_from_request_store(User, user_id)
+ end
+
def max_member_access(user_id)
max_member_access_for_user_ids([user_id])[user_id]
end
diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb
index 9214a23e259..bc7f94e4374 100644
--- a/app/models/projects/topic.rb
+++ b/app/models/projects/topic.rb
@@ -9,6 +9,7 @@ module Projects
validates :name, presence: true, length: { maximum: 255 }
validates :name, uniqueness: { case_sensitive: false }, if: :name_changed?
+ validates :title, presence: true, length: { maximum: 255 }, on: :create
validates :description, length: { maximum: 1024 }
has_many :project_topics, class_name: 'Projects::ProjectTopic'
@@ -22,13 +23,17 @@ module Projects
reorder(order_expression.desc, arel_table['non_private_projects_count'].desc, arel_table['id'])
end
+ def title_or_name
+ title || name
+ end
+
class << self
def find_by_name_case_insensitive(name)
find_by('LOWER(name) = ?', name.downcase)
end
def search(query)
- fuzzy_search(query, [:name])
+ fuzzy_search(query, [:name, :title])
end
def update_non_private_projects_counter(ids_before, ids_after, project_visibility_level_before, project_visibility_level_after)
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index 96002c8668a..77038d52efe 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -68,6 +68,10 @@ class ProtectedBranch < ApplicationRecord
def allow_multiple?(type)
type == :push
end
+
+ def self.downcase_humanized_name
+ name.underscore.humanize.downcase
+ end
end
ProtectedBranch.prepend_mod_with('ProtectedBranch')
diff --git a/app/models/raw_usage_data.rb b/app/models/raw_usage_data.rb
index 6fe3b26b58b..a6844eb8616 100644
--- a/app/models/raw_usage_data.rb
+++ b/app/models/raw_usage_data.rb
@@ -1,9 +1,16 @@
# frozen_string_literal: true
class RawUsageData < ApplicationRecord
+ REPORTING_CADENCE = 7.days.freeze
+
validates :payload, presence: true
validates :recorded_at, presence: true, uniqueness: true
+ scope :for_current_reporting_cycle, -> do
+ where('created_at >= ?', REPORTING_CADENCE.ago.beginning_of_day)
+ .order(created_at: :desc)
+ end
+
def update_version_metadata!(usage_data_id:)
self.update_columns(sent_at: Time.current, version_usage_data_id_value: usage_data_id)
end
diff --git a/app/models/system_note_metadata.rb b/app/models/system_note_metadata.rb
index 0be56d8b4a4..2643ef272d8 100644
--- a/app/models/system_note_metadata.rb
+++ b/app/models/system_note_metadata.rb
@@ -24,7 +24,7 @@ class SystemNoteMetadata < ApplicationRecord
opened closed merged duplicate locked unlocked outdated reviewer
tag due_date pinned_embed cherry_pick health_status approved unapproved
status alert_issue_added relate unrelate new_alert_added severity
- attention_requested attention_request_removed contact
+ attention_requested attention_request_removed contact timeline_event
].freeze
validates :note, presence: true, unless: :importing?
diff --git a/app/models/user.rb b/app/models/user.rb
index 26d47de4f00..8aae4441852 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -239,6 +239,8 @@ class User < ApplicationRecord
has_many :timelogs
+ has_many :resource_label_events, dependent: :nullify # rubocop:disable Cop/ActiveRecordDependent
+
#
# Validations
#
@@ -941,7 +943,7 @@ class User < ApplicationRecord
end
def two_factor_u2f_enabled?
- return false if Feature.enabled?(:webauthn, default_enabled: :yaml)
+ return false if Feature.enabled?(:webauthn)
if u2f_registrations.loaded?
u2f_registrations.any?
@@ -955,7 +957,7 @@ class User < ApplicationRecord
end
def two_factor_webauthn_enabled?
- return false unless Feature.enabled?(:webauthn, default_enabled: :yaml)
+ return false unless Feature.enabled?(:webauthn)
(webauthn_registrations.loaded? && webauthn_registrations.any?) || (!webauthn_registrations.loaded? && webauthn_registrations.exists?)
end
@@ -1583,7 +1585,7 @@ class User < ApplicationRecord
end
def manageable_groups(include_groups_with_developer_maintainer_access: false)
- owned_and_maintainer_group_hierarchy = if Feature.enabled?(:linear_user_manageable_groups, self, default_enabled: :yaml)
+ owned_and_maintainer_group_hierarchy = if Feature.enabled?(:linear_user_manageable_groups, self)
owned_or_maintainers_groups.self_and_descendants
else
Gitlab::ObjectHierarchy.new(owned_or_maintainers_groups).base_and_descendants
@@ -1673,7 +1675,7 @@ class User < ApplicationRecord
def ci_owned_runners_cross_joins_fix_enabled?
strong_memoize(:ci_owned_runners_cross_joins_fix_enabled) do
- Feature.enabled?(:ci_owned_runners_cross_joins_fix, self, default_enabled: :yaml)
+ Feature.enabled?(:ci_owned_runners_cross_joins_fix, self)
end
end
@@ -1735,7 +1737,7 @@ class User < ApplicationRecord
end
def attention_requested_open_merge_requests_count(force: false)
- if Feature.enabled?(:uncached_mr_attention_requests_count, self, default_enabled: :yaml)
+ if Feature.enabled?(:uncached_mr_attention_requests_count, self)
MergeRequestsFinder.new(self, attention: self.username, state: 'opened', non_archived: true).execute.count
else
Rails.cache.fetch(attention_request_cache_key, force: force, expires_in: COUNT_CACHE_VALIDITY_PERIOD) do
@@ -2070,6 +2072,10 @@ class User < ApplicationRecord
end
end
+ def mr_attention_requests_enabled?
+ Feature.enabled?(:mr_attention_requests, self)
+ end
+
protected
# override, from Devise::Validatable
@@ -2313,7 +2319,7 @@ class User < ApplicationRecord
# to avoid querying descendants since they are already covered
# by ancestor namespaces. If the FF is not available fallback to
# inefficient search: https://gitlab.com/gitlab-org/gitlab/-/issues/336436
- unless Feature.enabled?(:use_traversal_ids, default_enabled: :yaml)
+ unless Feature.enabled?(:use_traversal_ids)
return Ci::NamespaceMirror.contains_any_of_namespaces(search_members.pluck(:source_id))
end
@@ -2322,7 +2328,7 @@ class User < ApplicationRecord
.shortest_traversal_ids_prefixes
# Use efficient btree index to perform search
- if Feature.enabled?(:ci_owned_runners_unnest_index, self, default_enabled: :yaml)
+ if Feature.enabled?(:ci_owned_runners_unnest_index, self)
Ci::NamespaceMirror.contains_traversal_ids(traversal_ids)
else
Ci::NamespaceMirror.contains_any_of_namespaces(traversal_ids.map(&:last))
diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb
index 62614a851c1..559e93be360 100644
--- a/app/models/user_custom_attribute.rb
+++ b/app/models/user_custom_attribute.rb
@@ -6,13 +6,34 @@ class UserCustomAttribute < ApplicationRecord
validates :user_id, :key, :value, presence: true
validates :key, uniqueness: { scope: [:user_id] }
- def self.upsert_custom_attributes(custom_attributes)
- created_at = DateTime.now
- updated_at = DateTime.now
+ scope :by_key, ->(key) { where(key: key) }
+ scope :by_user_id, ->(user_id) { where(user_id: user_id) }
+ scope :by_updated_at, ->(updated_at) { where(updated_at: updated_at) }
+ scope :arkose_sessions, -> { by_key('arkose_session') }
- custom_attributes.map! do |custom_attribute|
- custom_attribute.merge({ created_at: created_at, updated_at: updated_at })
+ class << self
+ def upsert_custom_attributes(custom_attributes)
+ created_at = DateTime.now
+ updated_at = DateTime.now
+
+ custom_attributes.map! do |custom_attribute|
+ custom_attribute.merge({ created_at: created_at, updated_at: updated_at })
+ end
+ upsert_all(custom_attributes, unique_by: [:user_id, :key])
+ end
+
+ def sessions
+ return none if blocked_users.empty?
+
+ arkose_sessions
+ .by_user_id(blocked_users.map(&:user_id))
+ .select(:value)
+ end
+
+ private
+
+ def blocked_users
+ by_key('blocked_at').by_updated_at(Date.yesterday.all_day)
end
- upsert_all(custom_attributes, unique_by: [:user_id, :key])
end
end
diff --git a/app/models/users/callout.rb b/app/models/users/callout.rb
index a91a3406b22..b3729c84dd6 100644
--- a/app/models/users/callout.rb
+++ b/app/models/users/callout.rb
@@ -49,7 +49,9 @@ module Users
storage_enforcement_banner_fourth_enforcement_threshold: 46,
attention_requests_top_nav: 47,
attention_requests_side_nav: 48,
- minute_limit_banner: 49
+ minute_limit_banner: 49,
+ preview_user_over_limit_free_plan_alert: 50, # EE-only
+ user_reached_limit_free_plan_alert: 51 # EE-only
}
validates :feature_name,
diff --git a/app/models/users/in_product_marketing_email.rb b/app/models/users/in_product_marketing_email.rb
index f2f1d18339e..82c2e336a09 100644
--- a/app/models/users/in_product_marketing_email.rb
+++ b/app/models/users/in_product_marketing_email.rb
@@ -4,15 +4,28 @@ module Users
class InProductMarketingEmail < ApplicationRecord
include BulkInsertSafe
+ BUILD_IOS_APP_GUIDE = 'build_ios_app_guide'
+ CAMPAIGNS = [BUILD_IOS_APP_GUIDE].freeze
+
belongs_to :user
validates :user, presence: true
- validates :track, presence: true
- validates :series, presence: true
+
+ validates :track, :series, presence: true, if: -> { campaign.blank? }
+ validates :campaign, presence: true, if: -> { track.blank? && series.blank? }
+ validates :campaign, inclusion: { in: CAMPAIGNS }, allow_nil: true
+
validates :user_id, uniqueness: {
scope: [:track, :series],
- message: 'has already been sent'
- }
+ message: 'track series email has already been sent'
+ }, if: -> { track.present? }
+
+ validates :user_id, uniqueness: {
+ scope: :campaign,
+ message: 'campaign email has already been sent'
+ }, if: -> { campaign.present? }
+
+ validate :campaign_or_track_series
enum track: {
create: 0,
@@ -31,23 +44,47 @@ module Users
INACTIVE_TRACK_NAMES = %w(invite_team).freeze
ACTIVE_TRACKS = tracks.except(*INACTIVE_TRACK_NAMES)
+ scope :for_user_with_track_and_series, -> (user, track, series) do
+ where(user: user, track: track, series: series)
+ end
+
scope :without_track_and_series, -> (track, series) do
- users = User.arel_table
- product_emails = arel_table
+ join_condition = for_user.and(for_track_and_series(track, series))
+ users_without_records(join_condition)
+ end
+
+ scope :without_campaign, -> (campaign) do
+ join_condition = for_user.and(for_campaign(campaign))
+ users_without_records(join_condition)
+ end
- join_condition = users[:id].eq(product_emails[:user_id])
- .and(product_emails[:track]).eq(ACTIVE_TRACKS[track])
- .and(product_emails[:series]).eq(series)
+ def self.users_table
+ User.arel_table
+ end
- arel_join = users.join(product_emails, Arel::Nodes::OuterJoin).on(join_condition)
+ def self.distinct_users_sql
+ name = users_table.table_name
+ Arel.sql("DISTINCT ON(#{name}.id) #{name}.*")
+ end
+ def self.users_without_records(condition)
+ arel_join = users_table.join(arel_table, Arel::Nodes::OuterJoin).on(condition)
joins(arel_join.join_sources)
.where(in_product_marketing_emails: { id: nil })
- .select(Arel.sql("DISTINCT ON(#{users.table_name}.id) #{users.table_name}.*"))
+ .select(distinct_users_sql)
end
- scope :for_user_with_track_and_series, -> (user, track, series) do
- where(user: user, track: track, series: series)
+ def self.for_user
+ arel_table[:user_id].eq(users_table[:id])
+ end
+
+ def self.for_campaign(campaign)
+ arel_table[:campaign].eq(campaign)
+ end
+
+ def self.for_track_and_series(track, series)
+ arel_table[:track].eq(ACTIVE_TRACKS[track])
+ .and(arel_table[:series]).eq(series)
end
def self.save_cta_click(user, track, series)
@@ -55,5 +92,13 @@ module Users
email.update(cta_clicked_at: Time.zone.now) if email && email.cta_clicked_at.blank?
end
+
+ private
+
+ def campaign_or_track_series
+ if campaign.present? && (track.present? || series.present?)
+ errors.add(:campaign, 'should be a campaign or a track and series but not both')
+ end
+ end
end
end
diff --git a/app/models/wiki.rb b/app/models/wiki.rb
index b3f09b20463..32d70fcd3b7 100644
--- a/app/models/wiki.rb
+++ b/app/models/wiki.rb
@@ -13,43 +13,65 @@ class Wiki
markdown: {
name: 'Markdown',
default_extension: :md,
+ extension_regex: Regexp.new('md|mkdn?|mdown|markdown', 'i'),
created_by_user: true
},
rdoc: {
name: 'RDoc',
default_extension: :rdoc,
+ extension_regex: Regexp.new('rdoc', 'i'),
created_by_user: true
},
asciidoc: {
name: 'AsciiDoc',
default_extension: :asciidoc,
+ extension_regex: Regexp.new('adoc|asciidoc', 'i'),
created_by_user: true
},
org: {
name: 'Org',
default_extension: :org,
+ extension_regex: Regexp.new('org', 'i'),
created_by_user: true
},
textile: {
name: 'Textile',
- default_extension: :textile
+ default_extension: :textile,
+ extension_regex: Regexp.new('textile', 'i')
},
creole: {
name: 'Creole',
- default_extension: :creole
+ default_extension: :creole,
+ extension_regex: Regexp.new('creole', 'i')
},
rest: {
name: 'reStructuredText',
- default_extension: :rst
+ default_extension: :rst,
+ extension_regex: Regexp.new('re?st(\.txt)?', 'i')
},
mediawiki: {
name: 'MediaWiki',
- default_extension: :mediawiki
+ default_extension: :mediawiki,
+ extension_regex: Regexp.new('(media)?wiki', 'i')
+ },
+ pod: {
+ name: 'Pod',
+ default_extension: :pod,
+ extension_regex: Regexp.new('pod', 'i')
+ },
+ plaintext: {
+ name: 'Plain Text',
+ default_extension: :txt,
+ extension_regex: Regexp.new('txt', 'i')
}
}.freeze unless defined?(MARKUPS)
VALID_USER_MARKUPS = MARKUPS.select { |_, v| v[:created_by_user] }.freeze unless defined?(VALID_USER_MARKUPS)
+ unless defined?(ALLOWED_EXTENSIONS_REGEX)
+ ALLOWED_EXTENSIONS_REGEX = Regexp.union(MARKUPS.map { |key, value| value[:extension_regex] }).freeze
+ end
+
CouldNotCreateWikiError = Class.new(StandardError)
HOMEPAGE = 'home'
@@ -205,50 +227,61 @@ class Wiki
end
def create_page(title, content, format = :markdown, message = nil)
- commit = commit_details(:created, message, title)
-
- wiki.write_page(title, format.to_sym, content, commit)
- repository.expire_status_cache if repository.empty?
- after_wiki_activity
-
- true
- rescue Gitlab::Git::Wiki::DuplicatePageError => e
- @error_message = "Duplicate page: #{e.message}"
- false
- end
-
- def update_page(page, content:, title: nil, format: :markdown, message: nil)
- if Feature.enabled?(:gitaly_replace_wiki_update_page, container, default_enabled: :yaml)
+ if Feature.enabled?(:gitaly_replace_wiki_create_page, container, type: :undefined)
with_valid_format(format) do |default_extension|
- title = title.presence || Pathname(page.path).sub_ext('').to_s
-
- # If the format is the same we keep the former extension. This check is for formats
- # that can have more than one extension like Markdown (.md, .markdown)
- # If we don't do this we will override the existing extension.
- extension = page.format != format.to_sym ? default_extension : File.extname(page.path).downcase[1..]
-
- capture_git_error(:updated) do
- repository.update_file(
- user,
- sluggified_full_path(title, extension),
- content,
- previous_path: page.path,
- **multi_commit_options(:updated, message, title))
+ if file_exists_by_regex?(title)
+ raise_duplicate_page_error!
+ end
+ capture_git_error(:created) do
+ create_wiki_repository unless repository_exists?
+ sanitized_path = sluggified_full_path(title, default_extension)
+ repository.create_file(user, sanitized_path, content, **multi_commit_options(:created, message, title))
+ repository.expire_status_cache if repository.empty?
after_wiki_activity
true
+ rescue Gitlab::Git::Index::IndexError
+ raise_duplicate_page_error!
end
end
else
- commit = commit_details(:updated, message, page.title)
-
- wiki.update_page(page.path, title || page.name, format.to_sym, content, commit)
+ commit = commit_details(:created, message, title)
+ wiki.write_page(title, format.to_sym, content, commit)
+ repository.expire_status_cache if repository.empty?
after_wiki_activity
true
end
+ rescue Gitlab::Git::Wiki::DuplicatePageError => e
+ @error_message = _("Duplicate page: %{error_message}" % { error_message: e.message })
+
+ false
+ end
+
+ def update_page(page, content:, title: nil, format: :markdown, message: nil)
+ with_valid_format(format) do |default_extension|
+ title = title.presence || Pathname(page.path).sub_ext('').to_s
+
+ # If the format is the same we keep the former extension. This check is for formats
+ # that can have more than one extension like Markdown (.md, .markdown)
+ # If we don't do this we will override the existing extension.
+ extension = page.format != format.to_sym ? default_extension : File.extname(page.path).downcase[1..]
+
+ capture_git_error(:updated) do
+ repository.update_file(
+ user,
+ sluggified_full_path(title, extension),
+ content,
+ previous_path: page.path,
+ **multi_commit_options(:updated, message, title))
+
+ after_wiki_activity
+
+ true
+ end
+ end
end
def delete_page(page, message = nil)
@@ -393,12 +426,33 @@ class Wiki
yield default_extension
end
+ def file_exists_by_regex?(title)
+ return false unless repository_exists?
+
+ escaped_title = Regexp.escape(sluggified_title(title))
+ regex = Regexp.new("^#{escaped_title}\.#{ALLOWED_EXTENSIONS_REGEX}$", 'i')
+
+ repository.ls_files('HEAD').any? { |s| s =~ regex }
+ end
+
+ def raise_duplicate_page_error!
+ raise Gitlab::Git::Wiki::DuplicatePageError, _('A page with that title already exists')
+ end
+
def sluggified_full_path(title, extension)
sluggified_title(title) + '.' + extension
end
def sluggified_title(title)
- Gitlab::EncodingHelper.encode_utf8_no_detect(title).tr(' ', '-')
+ utf8_encoded_title = Gitlab::EncodingHelper.encode_utf8_no_detect(title)
+
+ sanitized_title(utf8_encoded_title).tr(' ', '-')
+ end
+
+ def sanitized_title(title)
+ clean_absolute_path = File.expand_path(title, '/')
+
+ Pathname.new(clean_absolute_path).relative_path_from('/').to_s
end
end
diff --git a/app/models/work_items/type.rb b/app/models/work_items/type.rb
index e2d38dc9903..0d390fa131d 100644
--- a/app/models/work_items/type.rb
+++ b/app/models/work_items/type.rb
@@ -41,6 +41,10 @@ module WorkItems
scope :by_type, ->(base_type) { where(base_type: base_type) }
def self.default_by_type(type)
+ found_type = find_by(namespace_id: nil, base_type: type)
+ return found_type if found_type
+
+ Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.upsert_types
find_by(namespace_id: nil, base_type: type)
end
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 7a49ad3d4aa..a4600c720a3 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -22,6 +22,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
condition(:share_with_group_locked, scope: :subject) { @subject.share_with_group_lock? }
condition(:parent_share_with_group_locked, scope: :subject) { @subject.parent&.share_with_group_lock? }
condition(:can_change_parent_share_with_group_lock) { can?(:change_share_with_group_lock, @subject.parent) }
+ condition(:migration_bot, scope: :user) { @user.migration_bot? }
desc "User is a project bot"
condition(:project_bot) { user.project_bot? && access_level >= GroupMember::GUEST }
@@ -54,11 +55,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
end
condition(:dependency_proxy_access_allowed) do
- if Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true)
- access_level(for_any_session: true) >= GroupMember::GUEST || valid_dependency_proxy_deploy_token
- else
- can?(:read_group)
- end
+ access_level(for_any_session: true) >= GroupMember::GUEST || valid_dependency_proxy_deploy_token
end
desc "Deploy token with read_package_registry scope"
@@ -81,7 +78,11 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
condition(:crm_enabled, score: 0, scope: :subject) { Feature.enabled?(:customer_relations, @subject) && @subject.crm_enabled? }
condition(:group_runner_registration_allowed) do
- Feature.disabled?(:runner_registration_control, default_enabled: :yaml) || Gitlab::CurrentSettings.valid_runner_registrars.include?('group')
+ Feature.disabled?(:runner_registration_control) || Gitlab::CurrentSettings.valid_runner_registrars.include?('group')
+ end
+
+ condition(:change_prevent_sharing_groups_outside_hierarchy_available) do
+ change_prevent_sharing_groups_outside_hierarchy_available?
end
rule { can?(:read_group) & design_management_enabled }.policy do
@@ -134,13 +135,11 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
rule { has_access }.enable :read_namespace
rule { developer }.policy do
- enable :admin_milestone
enable :create_metrics_dashboard_annotation
enable :delete_metrics_dashboard_annotation
enable :update_metrics_dashboard_annotation
enable :create_custom_emoji
enable :create_package
- enable :create_package_settings
enable :developer_access
enable :admin_crm_organization
enable :admin_crm_contact
@@ -152,18 +151,19 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :read_container_image
enable :admin_issue_board
enable :admin_label
+ enable :admin_milestone
enable :admin_issue_board_list
enable :admin_issue
enable :read_metrics_dashboard_annotation
enable :read_prometheus
enable :read_package
- enable :read_package_settings
enable :read_crm_organization
enable :read_crm_contact
end
rule { maintainer }.policy do
enable :destroy_package
+ enable :admin_package
enable :create_projects
enable :admin_pipeline
enable :admin_build
@@ -188,7 +188,6 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :set_note_created_at
enable :set_emails_disabled
- enable :change_prevent_sharing_groups_outside_hierarchy
enable :change_new_user_signups_cap
enable :update_default_branch_protection
enable :create_deploy_token
@@ -197,6 +196,10 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
enable :owner_access
end
+ rule { owner & change_prevent_sharing_groups_outside_hierarchy_available }.policy do
+ enable :change_prevent_sharing_groups_outside_hierarchy
+ end
+
rule { can?(:read_nested_project_resources) }.policy do
enable :read_group_activity
enable :read_group_issues
@@ -248,7 +251,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
rule { dependency_proxy_access_allowed & dependency_proxy_available }
.enable :read_dependency_proxy
- rule { developer & dependency_proxy_available }.policy do
+ rule { maintainer & dependency_proxy_available }.policy do
enable :admin_dependency_proxy
end
@@ -283,6 +286,11 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
prevent :register_group_runners
end
+ rule { migration_bot }.policy do
+ enable :read_resource_access_tokens
+ enable :destroy_resource_access_tokens
+ end
+
def access_level(for_any_session: false)
return GroupMember::NO_ACCESS if @user.nil?
return GroupMember::NO_ACCESS unless user_is_user?
@@ -315,6 +323,10 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
def valid_dependency_proxy_deploy_token
@user.is_a?(DeployToken) && @user&.valid_for_dependency_proxy? && @user&.has_access_to_group?(@subject)
end
+
+ def change_prevent_sharing_groups_outside_hierarchy_available?
+ true
+ end
end
GroupPolicy.prepend_mod_with('GroupPolicy')
diff --git a/app/policies/incident_management/timeline_event_policy.rb b/app/policies/incident_management/timeline_event_policy.rb
new file mode 100644
index 00000000000..514a2bf0a56
--- /dev/null
+++ b/app/policies/incident_management/timeline_event_policy.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ class TimelineEventPolicy < ::BasePolicy
+ delegate { @subject.incident }
+ end
+end
diff --git a/app/policies/issuable_policy.rb b/app/policies/issuable_policy.rb
index ed5a0f24ed0..4e6df79773e 100644
--- a/app/policies/issuable_policy.rb
+++ b/app/policies/issuable_policy.rb
@@ -34,6 +34,14 @@ class IssuablePolicy < BasePolicy
prevent :resolve_note
prevent :award_emoji
end
+
+ rule { can?(:read_issue) }.policy do
+ enable :read_incident_management_timeline_event
+ end
+
+ rule { can?(:read_issue) & can?(:developer_access) }.policy do
+ enable :admin_incident_management_timeline_event
+ end
end
IssuablePolicy.prepend_mod_with('IssuablePolicy')
diff --git a/app/policies/issue_policy.rb b/app/policies/issue_policy.rb
index a667c843bc6..a341d1ef661 100644
--- a/app/policies/issue_policy.rb
+++ b/app/policies/issue_policy.rb
@@ -12,8 +12,11 @@ class IssuePolicy < IssuablePolicy
@user && IssueCollection.new([@subject]).visible_to(@user).any?
end
- desc "User can read contacts belonging to the issue group"
- condition(:can_read_crm_contacts, scope: :subject) { @user.can?(:read_crm_contact, @subject.project.root_ancestor) }
+ desc "Project belongs to a group, crm is enabled and user can read contacts in the root group"
+ condition(:can_read_crm_contacts, scope: :subject) do
+ subject.project.group&.crm_enabled? &&
+ @user.can?(:read_crm_contact, @subject.project.root_ancestor)
+ end
desc "Issue is confidential"
condition(:confidential, scope: :subject) { @subject.confidential? }
@@ -81,6 +84,10 @@ class IssuePolicy < IssuablePolicy
enable :set_confidentiality
end
+ rule { can_read_crm_contacts }.policy do
+ enable :read_crm_contacts
+ end
+
rule { can?(:set_issue_metadata) & can_read_crm_contacts }.policy do
enable :set_issue_crm_contacts
end
diff --git a/app/policies/namespace_ci_cd_setting_policy.rb b/app/policies/namespace_ci_cd_setting_policy.rb
new file mode 100644
index 00000000000..d883526b86d
--- /dev/null
+++ b/app/policies/namespace_ci_cd_setting_policy.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class NamespaceCiCdSettingPolicy < BasePolicy # rubocop:disable Gitlab/NamespacedClass
+ delegate { @subject.namespace }
+end
diff --git a/app/policies/namespaces/user_namespace_policy.rb b/app/policies/namespaces/user_namespace_policy.rb
index 09b0f5d608d..028247497e5 100644
--- a/app/policies/namespaces/user_namespace_policy.rb
+++ b/app/policies/namespaces/user_namespace_policy.rb
@@ -14,8 +14,7 @@ module Namespaces
enable :read_namespace
enable :read_statistics
enable :create_jira_connect_subscription
- enable :create_package_settings
- enable :read_package_settings
+ enable :admin_package
end
rule { ~can_create_personal_project }.prevent :create_projects
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 68b288bdc87..60519dc346b 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -195,7 +195,7 @@ class ProjectPolicy < BasePolicy
end
condition(:project_runner_registration_allowed) do
- Feature.disabled?(:runner_registration_control, default_enabled: :yaml) || Gitlab::CurrentSettings.valid_runner_registrars.include?('project')
+ Feature.disabled?(:runner_registration_control) || Gitlab::CurrentSettings.valid_runner_registrars.include?('project')
end
# `:read_project` may be prevented in EE, but `:read_project_for_iids` should
@@ -285,6 +285,7 @@ class ProjectPolicy < BasePolicy
enable :reopen_issue
enable :admin_issue
enable :admin_label
+ enable :admin_milestone
enable :admin_issue_board_list
enable :admin_issue_link
enable :read_commit_status
@@ -370,7 +371,6 @@ class ProjectPolicy < BasePolicy
enable :create_package
enable :admin_issue_board
enable :admin_merge_request
- enable :admin_milestone
enable :update_merge_request
enable :reopen_merge_request
enable :create_commit_status
diff --git a/app/policies/timelog_policy.rb b/app/policies/timelog_policy.rb
index f71c4204639..02380604c60 100644
--- a/app/policies/timelog_policy.rb
+++ b/app/policies/timelog_policy.rb
@@ -2,4 +2,11 @@
class TimelogPolicy < BasePolicy
delegate { @subject.issuable }
+
+ desc "User who created the timelog"
+ condition(:is_author) { @user && @subject.user == @user }
+
+ rule { is_author | can?(:maintainer_access) }.policy do
+ enable :admin_timelog
+ end
end
diff --git a/app/policies/work_item_policy.rb b/app/policies/work_item_policy.rb
index b4723bc7ed8..e191e8d26ca 100644
--- a/app/policies/work_item_policy.rb
+++ b/app/policies/work_item_policy.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
class WorkItemPolicy < IssuePolicy
- rule { can?(:owner_access) | is_author }.enable :delete_work_item
+ condition(:is_member_and_author) { is_project_member? & is_author? }
+
+ rule { can?(:destroy_issue) | is_member_and_author }.enable :delete_work_item
rule { can?(:update_issue) }.enable :update_work_item
diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb
index c2ed40d8b0c..9558eee55a6 100644
--- a/app/presenters/clusterable_presenter.rb
+++ b/app/presenters/clusterable_presenter.rb
@@ -28,10 +28,6 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated
polymorphic_path([clusterable, :clusters], options)
end
- def new_path(options = {})
- new_polymorphic_path([clusterable, :cluster], options)
- end
-
def connect_path
polymorphic_path([clusterable, :clusters], action: :connect)
end
@@ -40,22 +36,10 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated
polymorphic_path([clusterable, :clusters], action: :new_cluster_docs)
end
- def authorize_aws_role_path
- polymorphic_path([clusterable, :clusters], action: :authorize_aws_role)
- end
-
def create_user_clusters_path
polymorphic_path([clusterable, :clusters], action: :create_user)
end
- def create_gcp_clusters_path
- polymorphic_path([clusterable, :clusters], action: :create_gcp)
- end
-
- def create_aws_clusters_path
- polymorphic_path([clusterable, :clusters], action: :create_aws)
- end
-
def cluster_status_cluster_path(cluster, params = {})
raise NotImplementedError
end
diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb
index e2fc2b4b485..454e5c0e44a 100644
--- a/app/presenters/clusters/cluster_presenter.rb
+++ b/app/presenters/clusters/cluster_presenter.rb
@@ -70,7 +70,7 @@ module Clusters
{
'clusters-path': clusterable.index_path,
'dashboard-endpoint': clusterable.metrics_dashboard_path(cluster),
- 'documentation-path': help_page_path('user/project/clusters/index', anchor: 'monitoring-your-kubernetes-cluster'),
+ 'documentation-path': help_page_path('user/infrastructure/clusters/manage/clusters_health'),
'add-dashboard-documentation-path': help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'),
'empty-getting-started-svg-path': image_path('illustrations/monitoring/getting_started.svg'),
'empty-loading-svg-path': image_path('illustrations/monitoring/loading.svg'),
diff --git a/app/presenters/dev_ops_report/metric_presenter.rb b/app/presenters/dev_ops_report/metric_presenter.rb
index ec85c5d3809..1a5b12fa408 100644
--- a/app/presenters/dev_ops_report/metric_presenter.rb
+++ b/app/presenters/dev_ops_report/metric_presenter.rb
@@ -60,7 +60,7 @@ module DevOpsReport
description: 'created per active user',
feature: 'environments',
blog: 'https://about.gitlab.com/2016/08/26/ci-deployment-and-environments/',
- docs: help_page_path('ci/environments')
+ docs: help_page_path('ci/environments/index')
),
Card.new(
metric: metric,
diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb
index 001c9cbb4e9..12b7ce2f5e7 100644
--- a/app/presenters/instance_clusterable_presenter.rb
+++ b/app/presenters/instance_clusterable_presenter.rb
@@ -18,11 +18,6 @@ class InstanceClusterablePresenter < ClusterablePresenter
admin_clusters_path(options)
end
- override :new_path
- def new_path(options = {})
- new_admin_cluster_path(options)
- end
-
override :cluster_status_cluster_path
def cluster_status_cluster_path(cluster, params = {})
cluster_status_admin_cluster_path(cluster, params)
@@ -53,21 +48,6 @@ class InstanceClusterablePresenter < ClusterablePresenter
create_user_admin_clusters_path
end
- override :create_gcp_clusters_path
- def create_gcp_clusters_path
- create_gcp_admin_clusters_path
- end
-
- override :create_aws_clusters_path
- def create_aws_clusters_path
- create_aws_admin_clusters_path
- end
-
- override :authorize_aws_role_path
- def authorize_aws_role_path
- authorize_aws_role_admin_clusters_path
- end
-
override :empty_state_help_text
def empty_state_help_text
s_('ClusterIntegration|Adding an integration will share the cluster across all projects.')
diff --git a/app/presenters/issue_presenter.rb b/app/presenters/issue_presenter.rb
index 75f6d749acb..9b4e7e22165 100644
--- a/app/presenters/issue_presenter.rb
+++ b/app/presenters/issue_presenter.rb
@@ -4,9 +4,7 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
presents ::Issue, as: :issue
def issue_path
- return url_builder.build(issue, only_path: true) unless use_work_items_path?
-
- project_work_items_path(issue.project, work_items_path: issue.id)
+ web_path
end
delegator_override :subscribed?
@@ -17,18 +15,6 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated
def project_emails_disabled?
issue.project.emails_disabled?
end
-
- def web_url
- return super unless use_work_items_path?
-
- project_work_items_url(issue.project, work_items_path: issue.id)
- end
-
- private
-
- def use_work_items_path?
- issue.issue_type == 'task' && issue.project.work_items_feature_flag_enabled?
- end
end
IssuePresenter.prepend_mod_with('IssuePresenter')
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index 098519cdffe..af1b254c46f 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -36,7 +36,6 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def statistics_buttons(show_auto_devops_callout:)
[
- upload_anchor_data,
readme_anchor_data,
license_anchor_data,
changelog_anchor_data,
@@ -458,7 +457,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated
def project_topic_list
strong_memoize(:project_topic_list) do
- project.topics.map(&:name)
+ project.topics.map { |topic| { name: topic.name, title: topic.title_or_name } }
end
end
diff --git a/app/presenters/projects/security/configuration_presenter.rb b/app/presenters/projects/security/configuration_presenter.rb
index 77f4d57ae09..772be0125a0 100644
--- a/app/presenters/projects/security/configuration_presenter.rb
+++ b/app/presenters/projects/security/configuration_presenter.rb
@@ -68,7 +68,7 @@ module Projects
end
def latest_pipeline_path
- return help_page_path('ci/pipelines') unless latest_default_branch_pipeline
+ return help_page_path('ci/pipelines/index') unless latest_default_branch_pipeline
project_pipeline_path(self, latest_default_branch_pipeline)
end
diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb
index dc775fb4160..26b8169d2b0 100644
--- a/app/presenters/user_presenter.rb
+++ b/app/presenters/user_presenter.rb
@@ -21,7 +21,7 @@ class UserPresenter < Gitlab::View::Presenter::Delegated
delegator_override :saved_replies
def saved_replies
- return ::Users::SavedReply.none unless Feature.enabled?(:saved_replies, current_user, default_enabled: :yaml)
+ return ::Users::SavedReply.none unless Feature.enabled?(:saved_replies, current_user)
return ::Users::SavedReply.none unless current_user.can?(:read_saved_replies, user)
user.saved_replies
diff --git a/app/serializers/award_emoji_entity.rb b/app/serializers/award_emoji_entity.rb
index 212931a2fa9..6ca782d8203 100644
--- a/app/serializers/award_emoji_entity.rb
+++ b/app/serializers/award_emoji_entity.rb
@@ -3,4 +3,5 @@
class AwardEmojiEntity < Grape::Entity
expose :name
expose :user, using: API::Entities::UserSafe
+ expose :url
end
diff --git a/app/serializers/build_details_entity.rb b/app/serializers/build_details_entity.rb
index 9fd35faf0b7..5f72259f34a 100644
--- a/app/serializers/build_details_entity.rb
+++ b/app/serializers/build_details_entity.rb
@@ -148,12 +148,14 @@ class BuildDetailsEntity < Ci::JobEntity
end
def failure_message
- _("This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}") %
- { invalid_dependencies: invalid_dependencies }
+ # We do not return the invalid_dependencies for all scenarios see https://gitlab.com/gitlab-org/gitlab/-/issues/287772#note_914406387
+ punctuation = invalid_dependencies.empty? ? '.' : ': '
+ _("This job could not start because it could not retrieve the needed artifacts%{punctuation}%{invalid_dependencies}") %
+ { invalid_dependencies: invalid_dependencies, punctuation: punctuation }
end
def help_message(docs_url)
- html_escape(_("Please refer to %{docs_url}")) % { docs_url: "<a href=\"#{docs_url}\">#{html_escape(docs_url)}</a>".html_safe }
+ html_escape(_("<a href=\"#{docs_url}\">Learn more.</a>".html_safe))
end
end
diff --git a/app/serializers/ci/job_entity.rb b/app/serializers/ci/job_entity.rb
index fca3dec74d4..b6b11e54a16 100644
--- a/app/serializers/ci/job_entity.rb
+++ b/app/serializers/ci/job_entity.rb
@@ -8,6 +8,7 @@ module Ci
expose :name
expose :started?, as: :started
+ expose :started_at, if: -> (job) { job.started? }
expose :complete?, as: :complete
expose :archived?, as: :archived
diff --git a/app/serializers/cluster_entity.rb b/app/serializers/cluster_entity.rb
index e2d24e74b29..df72a994143 100644
--- a/app/serializers/cluster_entity.rb
+++ b/app/serializers/cluster_entity.rb
@@ -19,7 +19,7 @@ class ClusterEntity < Grape::Entity
Clusters::ClusterPresenter.new(cluster).show_path # rubocop: disable CodeReuse/Presenter
end
- expose :gitlab_managed_apps_logs_path do |cluster|
+ 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
@@ -27,7 +27,13 @@ class ClusterEntity < Grape::Entity
Clusters::KubernetesErrorEntity.new(cluster)
end
- expose :enable_advanced_logs_querying do |cluster|
+ 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/environment_entity.rb b/app/serializers/environment_entity.rb
index 634be365a9d..ac99463bd64 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -103,7 +103,8 @@ class EnvironmentEntity < Grape::Entity
end
def can_read_pod_logs?
- can?(current_user, :read_pod_logs, environment.project)
+ Feature.enabled?(:monitor_logging, environment.project) &&
+ can?(current_user, :read_pod_logs, environment.project)
end
def can_read_deploy_board?
diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb
index a8645c8670d..b13140efea7 100644
--- a/app/serializers/environment_serializer.rb
+++ b/app/serializers/environment_serializer.rb
@@ -81,7 +81,10 @@ class EnvironmentSerializer < BaseSerializer
{
user: [],
cluster: [],
- project: [],
+ project: {
+ route: [],
+ namespace: :route
+ },
deployable: {
user: [],
metadata: [],
diff --git a/app/serializers/issue_board_entity.rb b/app/serializers/issue_board_entity.rb
index 4b9c48f3f7c..bcad28d6aad 100644
--- a/app/serializers/issue_board_entity.rb
+++ b/app/serializers/issue_board_entity.rb
@@ -37,7 +37,7 @@ class IssueBoardEntity < Grape::Entity
end
expose :real_path, if: -> (issue) { issue.project } do |issue|
- project_issue_path(issue.project, issue)
+ Gitlab::UrlBuilder.build(issue, only_path: true)
end
expose :issue_sidebar_endpoint, if: -> (issue) { issue.project } do |issue|
diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb
index fbcfcf84d9b..852a2e62b7d 100644
--- a/app/serializers/issue_entity.rb
+++ b/app/serializers/issue_entity.rb
@@ -31,7 +31,7 @@ class IssueEntity < IssuableEntity
end
expose :web_url do |issue|
- project_issue_path(issue.project, issue)
+ Gitlab::UrlBuilder.build(issue, only_path: true)
end
expose :current_user do
diff --git a/app/serializers/issue_sidebar_basic_entity.rb b/app/serializers/issue_sidebar_basic_entity.rb
index 7222b5df425..2450c6a4d85 100644
--- a/app/serializers/issue_sidebar_basic_entity.rb
+++ b/app/serializers/issue_sidebar_basic_entity.rb
@@ -12,7 +12,7 @@ class IssueSidebarBasicEntity < IssuableSidebarBasicEntity
end
expose :show_crm_contacts do |issuable|
- current_user&.can?(:read_crm_contact, issuable.project.root_ancestor) &&
+ current_user&.can?(:read_crm_contacts, issuable) &&
CustomerRelations::Contact.exists_for_group?(issuable.project.root_ancestor)
end
end
diff --git a/app/serializers/linked_issue_entity.rb b/app/serializers/linked_issue_entity.rb
index 6ae3f4044db..769e3ed7310 100644
--- a/app/serializers/linked_issue_entity.rb
+++ b/app/serializers/linked_issue_entity.rb
@@ -18,7 +18,7 @@ class LinkedIssueEntity < Grape::Entity
end
expose :path do |link|
- project_issue_path(link.project, link.iid)
+ Gitlab::UrlBuilder.build(link, only_path: true)
end
expose :relation_path
diff --git a/app/serializers/merge_request_user_entity.rb b/app/serializers/merge_request_user_entity.rb
index 97912656bbb..12c573d1a13 100644
--- a/app/serializers/merge_request_user_entity.rb
+++ b/app/serializers/merge_request_user_entity.rb
@@ -20,7 +20,7 @@ class MergeRequestUserEntity < ::API::Entities::UserBasic
find_reviewer_or_assignee(user, options)&.reviewed?
end
- expose :attention_requested, if: satisfies(:present?, :allows_reviewers?, :attention_requested_enabled?) do |user, options|
+ expose :attention_requested, if: ->(_, options) { options[:merge_request].present? && options[:merge_request].allows_reviewers? && request.current_user&.mr_attention_requests_enabled? } do |user, options|
find_reviewer_or_assignee(user, options)&.attention_requested?
end
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index 21ab20747d0..5bf91ed0a51 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -143,7 +143,7 @@ class MergeRequestWidgetEntity < Grape::Entity
end
expose :security_reports_docs_path do |merge_request|
- help_page_path('user/application_security/index.md', anchor: 'viewing-security-scan-information-in-merge-requests')
+ help_page_path('user/application_security/index.md', anchor: 'view-security-scan-information-in-merge-requests')
end
expose :enabled_reports do |merge_request|
diff --git a/app/serializers/release_entity.rb b/app/serializers/release_entity.rb
index 6777b0f9780..5c3d06b82d3 100644
--- a/app/serializers/release_entity.rb
+++ b/app/serializers/release_entity.rb
@@ -1,6 +1,15 @@
# frozen_string_literal: true
+# TODO: consider removing this entity after https://gitlab.com/gitlab-org/gitlab/-/issues/360631
class ReleaseEntity < Grape::Entity
expose :id
expose :tag # see https://gitlab.com/gitlab-org/gitlab/-/issues/36338
+ expose :name
+ expose :description
+ expose :project_id
+ expose :author_id
+
+ expose :created_at
+ expose :updated_at
+ expose :released_at
end
diff --git a/app/services/alert_management/alerts/update_service.rb b/app/services/alert_management/alerts/update_service.rb
index 0769adc862e..6bdceb0f27b 100644
--- a/app/services/alert_management/alerts/update_service.rb
+++ b/app/services/alert_management/alerts/update_service.rb
@@ -162,8 +162,9 @@ module AlertManagement
end
def filter_duplicate
- # Only need to check if changing to an open status
- return unless params[:status_event] && AlertManagement::Alert.open_status?(status)
+ # Only need to check if changing to a not-resolved status
+ return if params[:status_event].blank? || params[:status_event] == :resolve
+ return unless alert.resolved?
param_errors << unresolved_alert_error if duplicate_alert?
end
@@ -171,24 +172,23 @@ module AlertManagement
def duplicate_alert?
return if alert.fingerprint.blank?
- open_alerts.any? && open_alerts.exclude?(alert)
+ unresolved_alert.present?
end
- def open_alerts
- strong_memoize(:open_alerts) do
- AlertManagement::Alert.for_fingerprint(project, alert.fingerprint).open
+ def unresolved_alert
+ strong_memoize(:unresolved_alert) do
+ AlertManagement::Alert.find_unresolved_alert(project, alert.fingerprint)
end
end
def unresolved_alert_error
_('An %{link_start}alert%{link_end} with the same fingerprint is already open. ' \
'To change the status of this alert, resolve the linked alert.'
- ) % open_alert_url_params
+ ) % unresolved_alert_url_params
end
- def open_alert_url_params
- open_alert = open_alerts.first
- alert_path = Gitlab::Routing.url_helpers.details_project_alert_management_path(project, open_alert)
+ def unresolved_alert_url_params
+ alert_path = Gitlab::Routing.url_helpers.details_project_alert_management_path(project, unresolved_alert)
{
link_start: '<a href="%{url}">'.html_safe % { url: alert_path },
diff --git a/app/services/alert_management/metric_images/upload_service.rb b/app/services/alert_management/metric_images/upload_service.rb
index e9db10594df..46e7e3dbedd 100644
--- a/app/services/alert_management/metric_images/upload_service.rb
+++ b/app/services/alert_management/metric_images/upload_service.rb
@@ -39,7 +39,7 @@ module AlertManagement
private
def can_upload_metrics?
- alert.metric_images_available? && current_user&.can?(:upload_alert_management_metric_image, alert)
+ current_user&.can?(:upload_alert_management_metric_image, alert)
end
end
end
diff --git a/app/services/authorized_project_update/project_access_changed_service.rb b/app/services/authorized_project_update/project_access_changed_service.rb
index 62bf4ced1ae..dafec1fef59 100644
--- a/app/services/authorized_project_update/project_access_changed_service.rb
+++ b/app/services/authorized_project_update/project_access_changed_service.rb
@@ -7,6 +7,8 @@ module AuthorizedProjectUpdate
end
def execute(blocking: true)
+ return if @project_ids.empty?
+
bulk_args = @project_ids.map { |id| [id] }
if blocking
diff --git a/app/services/authorized_project_update/project_create_service.rb b/app/services/authorized_project_update/project_create_service.rb
deleted file mode 100644
index 5809315a066..00000000000
--- a/app/services/authorized_project_update/project_create_service.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-module AuthorizedProjectUpdate
- class ProjectCreateService < BaseService
- BATCH_SIZE = 1000
-
- def initialize(project)
- @project = project
- end
-
- def execute
- group = project.group
-
- unless group
- return ServiceResponse.error(message: 'Project does not have a group')
- end
-
- group.members_from_self_and_ancestors_with_effective_access_level
- .each_batch(of: BATCH_SIZE, column: :user_id) do |members|
- attributes = members.map do |member|
- { user_id: member.user_id, project_id: project.id, access_level: member.access_level }
- end
-
- ProjectAuthorization.insert_all(attributes) unless attributes.empty?
- end
-
- ServiceResponse.success
- end
-
- private
-
- attr_reader :project
- end
-end
diff --git a/app/services/authorized_project_update/project_group_link_create_service.rb b/app/services/authorized_project_update/project_group_link_create_service.rb
deleted file mode 100644
index 10cf4c50569..00000000000
--- a/app/services/authorized_project_update/project_group_link_create_service.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-module AuthorizedProjectUpdate
- class ProjectGroupLinkCreateService < BaseService
- include Gitlab::Utils::StrongMemoize
-
- BATCH_SIZE = 1000
-
- def initialize(project, group, group_access = nil)
- @project = project
- @group = group
- @group_access = group_access
- end
-
- def execute
- group.members_from_self_and_ancestors_with_effective_access_level
- .each_batch(of: BATCH_SIZE, column: :user_id) do |members|
- existing_authorizations = existing_project_authorizations(members)
- authorizations_to_create = []
- user_ids_to_delete = []
-
- members.each do |member|
- new_access_level = access_level(member.access_level)
- existing_access_level = existing_authorizations[member.user_id]
-
- if existing_access_level
- # User might already have access to the project unrelated to the
- # current project share
- next if existing_access_level >= new_access_level
-
- user_ids_to_delete << member.user_id
- end
-
- authorizations_to_create << { user_id: member.user_id,
- project_id: project.id,
- access_level: new_access_level }
- end
-
- update_authorizations(user_ids_to_delete, authorizations_to_create)
- end
-
- ServiceResponse.success
- end
-
- private
-
- attr_reader :project, :group, :group_access
-
- def access_level(membership_access_level)
- return membership_access_level unless group_access
-
- # access level (role) must not be higher than the max access level (role) set when
- # creating the project share
- [membership_access_level, group_access].min
- end
-
- def existing_project_authorizations(members)
- user_ids = members.map(&:user_id)
-
- ProjectAuthorization.where(project_id: project.id, user_id: user_ids) # rubocop: disable CodeReuse/ActiveRecord
- .select(:user_id, :access_level)
- .each_with_object({}) do |authorization, hash|
- hash[authorization.user_id] = authorization.access_level
- end
- end
-
- def update_authorizations(user_ids_to_delete, authorizations_to_create)
- project.remove_project_authorizations(user_ids_to_delete) if user_ids_to_delete.any?
- ProjectAuthorization.insert_all_in_batches(authorizations_to_create) if authorizations_to_create.any?
- end
- end
-end
diff --git a/app/services/bulk_imports/file_decompression_service.rb b/app/services/bulk_imports/file_decompression_service.rb
index b76746b199f..41616fc1c75 100644
--- a/app/services/bulk_imports/file_decompression_service.rb
+++ b/app/services/bulk_imports/file_decompression_service.rb
@@ -21,7 +21,7 @@ module BulkImports
def execute
validate_tmpdir
validate_filepath
- validate_decompressed_file_size if Feature.enabled?(:validate_import_decompressed_archive_size, default_enabled: :yaml)
+ validate_decompressed_file_size if Feature.enabled?(:validate_import_decompressed_archive_size)
validate_symlink(filepath)
decompress_file
diff --git a/app/services/ci/create_downstream_pipeline_service.rb b/app/services/ci/create_downstream_pipeline_service.rb
index 0a0c614bb87..b38b3b93353 100644
--- a/app/services/ci/create_downstream_pipeline_service.rb
+++ b/app/services/ci/create_downstream_pipeline_service.rb
@@ -6,6 +6,7 @@ module Ci
# specifications.
class CreateDownstreamPipelineService < ::BaseService
include Gitlab::Utils::StrongMemoize
+ include Ci::DownstreamPipelineHelpers
DuplicateDownstreamPipelineError = Class.new(StandardError)
@@ -37,6 +38,8 @@ module Ci
.execute(pipeline_params.fetch(:source), **pipeline_params[:execute_params])
.payload
+ log_downstream_pipeline_creation(downstream_pipeline)
+
downstream_pipeline.tap do |pipeline|
update_bridge_status!(@bridge, pipeline)
end
diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb
index 8622b1a5863..bf2355c447a 100644
--- a/app/services/ci/expire_pipeline_cache_service.rb
+++ b/app/services/ci/expire_pipeline_cache_service.rb
@@ -86,7 +86,7 @@ module Ci
etag_paths << path
end
- pipeline.self_with_upstreams_and_downstreams.includes(project: [:route, { namespace: :route }]).each do |relative_pipeline| # rubocop: disable CodeReuse/ActiveRecord
+ pipeline.all_pipelines_in_hierarchy.includes(project: [:route, { namespace: :route }]).each do |relative_pipeline| # rubocop: disable CodeReuse/ActiveRecord
etag_paths << project_pipeline_path(relative_pipeline.project, relative_pipeline)
etag_paths << graphql_pipeline_path(relative_pipeline)
etag_paths << graphql_pipeline_sha_path(relative_pipeline.sha)
diff --git a/app/services/ci/generate_kubeconfig_service.rb b/app/services/ci/generate_kubeconfig_service.rb
index 18f68c0ff09..894ab8e8505 100644
--- a/app/services/ci/generate_kubeconfig_service.rb
+++ b/app/services/ci/generate_kubeconfig_service.rb
@@ -2,8 +2,9 @@
module Ci
class GenerateKubeconfigService
- def initialize(build)
- @build = build
+ def initialize(pipeline, token:)
+ @pipeline = pipeline
+ @token = token
@template = Gitlab::Kubernetes::Kubeconfig::Template.new
end
@@ -33,10 +34,10 @@ module Ci
private
- attr_reader :build, :template
+ attr_reader :pipeline, :token, :template
def agents
- build.pipeline.authorized_cluster_agents
+ pipeline.authorized_cluster_agents
end
def cluster_name
@@ -52,7 +53,7 @@ module Ci
end
def agent_token(agent)
- ['ci', agent.id, build.token].join(delimiter)
+ ['ci', agent.id, token].join(delimiter)
end
def delimiter
diff --git a/app/services/ci/job_artifacts/create_service.rb b/app/services/ci/job_artifacts/create_service.rb
index 7c67a2e175d..635111130d6 100644
--- a/app/services/ci/job_artifacts/create_service.rb
+++ b/app/services/ci/job_artifacts/create_service.rb
@@ -133,7 +133,7 @@ module Ci
job.update_column(:artifacts_expire_at, artifact.expire_at)
end
- success
+ success(artifact: artifact)
rescue ActiveRecord::RecordNotUnique => error
track_exception(error, params)
error('another artifact of the same type already exists', :bad_request)
diff --git a/app/services/ci/job_artifacts/destroy_batch_service.rb b/app/services/ci/job_artifacts/destroy_batch_service.rb
index 90d157373c3..5121a8b0a8b 100644
--- a/app/services/ci/job_artifacts/destroy_batch_service.rb
+++ b/app/services/ci/job_artifacts/destroy_batch_service.rb
@@ -33,9 +33,11 @@ module Ci
destroy_related_records(@job_artifacts)
- Ci::DeletedObject.transaction do
- Ci::DeletedObject.bulk_import(@job_artifacts, @pick_up_at)
- Ci::JobArtifact.id_in(@job_artifacts.map(&:id)).delete_all
+ destroy_around_hook(@job_artifacts) do
+ Ci::DeletedObject.transaction do
+ Ci::DeletedObject.bulk_import(@job_artifacts, @pick_up_at)
+ Ci::JobArtifact.id_in(@job_artifacts.map(&:id)).delete_all
+ end
end
after_batch_destroy_hook(@job_artifacts)
@@ -52,6 +54,13 @@ module Ci
private
# Overriden in EE
+ # :nocov:
+ def destroy_around_hook(artifacts)
+ yield
+ end
+ # :nocov:
+
+ # Overriden in EE
def destroy_related_records(artifacts); end
# Overriden in EE
@@ -121,7 +130,7 @@ module Ci
end
def fix_expire_at?
- Feature.enabled?(:ci_detect_wrongly_expired_artifacts, default_enabled: :yaml)
+ Feature.enabled?(:ci_detect_wrongly_expired_artifacts)
end
def wrongly_expired?(artifact)
diff --git a/app/services/ci/pipeline_creation/start_pipeline_service.rb b/app/services/ci/pipeline_creation/start_pipeline_service.rb
index 27c12caaa0a..65a045f32dd 100644
--- a/app/services/ci/pipeline_creation/start_pipeline_service.rb
+++ b/app/services/ci/pipeline_creation/start_pipeline_service.rb
@@ -10,6 +10,11 @@ module Ci
end
def execute
+ ##
+ # Create a persistent ref for the pipeline.
+ # The pipeline ref is fetched in the jobs and deleted when the pipeline transitions to a finished state.
+ pipeline.ensure_persistent_ref
+
Ci::ProcessPipelineService.new(pipeline).execute
end
end
diff --git a/app/services/ci/pipeline_trigger_service.rb b/app/services/ci/pipeline_trigger_service.rb
index 7746382b845..06eb1aee8e6 100644
--- a/app/services/ci/pipeline_trigger_service.rb
+++ b/app/services/ci/pipeline_trigger_service.rb
@@ -4,6 +4,7 @@ module Ci
class PipelineTriggerService < BaseService
include Gitlab::Utils::StrongMemoize
include Services::ReturnServiceResponses
+ include Ci::DownstreamPipelineHelpers
def execute
if trigger_from_token
@@ -69,6 +70,7 @@ module Ci
pipeline.source_pipeline = source
end
+ log_downstream_pipeline_creation(response.payload)
pipeline_service_response(response.payload)
end
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
index 9f476c8a785..fefbdb151ec 100644
--- a/app/services/ci/queue/build_queue_service.rb
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -80,7 +80,7 @@ module Ci
def strategy
strong_memoize(:strategy) do
- if ::Feature.enabled?(:ci_pending_builds_queue_source, runner, default_enabled: :yaml)
+ if ::Feature.enabled?(:ci_pending_builds_queue_source, runner)
Queue::PendingBuildsStrategy.new(runner)
else
Queue::BuildsTableStrategy.new(runner)
diff --git a/app/services/ci/queue/builds_table_strategy.rb b/app/services/ci/queue/builds_table_strategy.rb
index 237dd510d50..c27c10bd18d 100644
--- a/app/services/ci/queue/builds_table_strategy.rb
+++ b/app/services/ci/queue/builds_table_strategy.rb
@@ -18,7 +18,7 @@ module Ci
.joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
.where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
- if Feature.enabled?(:ci_queueing_disaster_recovery_disable_fair_scheduling, runner, type: :ops, default_enabled: :yaml)
+ if 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
diff --git a/app/services/ci/queue/pending_builds_strategy.rb b/app/services/ci/queue/pending_builds_strategy.rb
index 47158b8ea1d..f2eba0681db 100644
--- a/app/services/ci/queue/pending_builds_strategy.rb
+++ b/app/services/ci/queue/pending_builds_strategy.rb
@@ -51,7 +51,7 @@ module Ci
end
def use_denormalized_data_strategy?
- ::Feature.enabled?(:ci_queuing_use_denormalized_data_strategy, default_enabled: :yaml)
+ ::Feature.enabled?(:ci_queuing_use_denormalized_data_strategy)
end
private
@@ -70,7 +70,7 @@ module Ci
end
def builds_ordered_for_shared_runners(relation)
- if Feature.enabled?(:ci_queueing_disaster_recovery_disable_fair_scheduling, runner, type: :ops, default_enabled: :yaml)
+ 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_pending_builds.build_id ASC')
else
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index 6c9044b5089..8969b95b81f 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -157,15 +157,13 @@ module Ci
unless build.pending?
@metrics.increment_queue_operation(:build_not_pending)
- if Feature.enabled?(:ci_pending_builds_table_resiliency, default_enabled: :yaml)
- ##
- # If this build can not be picked because we had stale data in
- # `ci_pending_builds` table, we need to respond with 409 to retry
- # this operation.
- #
- if ::Ci::UpdateBuildQueueService.new.remove!(build)
- return Result.new(nil, nil, false)
- end
+ ##
+ # If this build can not be picked because we had stale data in
+ # `ci_pending_builds` table, we need to respond with 409 to retry
+ # this operation.
+ #
+ if ::Ci::UpdateBuildQueueService.new.remove!(build)
+ return Result.new(nil, nil, false)
end
return
diff --git a/app/services/ci/retry_job_service.rb b/app/services/ci/retry_job_service.rb
index af7e7fa16e9..e0ced3d0197 100644
--- a/app/services/ci/retry_job_service.rb
+++ b/app/services/ci/retry_job_service.rb
@@ -23,11 +23,11 @@ module Ci
# Cloning a job requires a strict type check to ensure
# the attributes being used for the clone are taken straight
# from the model and not overridden by other abstractions.
- raise TypeError unless job.instance_of?(Ci::Build)
+ raise TypeError unless job.instance_of?(Ci::Build) || job.instance_of?(Ci::Bridge)
check_access!(job)
- new_job = clone_job(job)
+ new_job = job.clone(current_user: current_user)
new_job.run_after_commit do
::Ci::CopyCrossDatabaseAssociationsService.new.execute(job, new_job)
@@ -53,9 +53,12 @@ module Ci
private
+ def check_assignable_runners!(job); end
+
def retry_job(job)
clone!(job).tap do |new_job|
- check_assignable_runners!(new_job)
+ check_assignable_runners!(new_job) if new_job.is_a?(Ci::Build)
+
next if new_job.failed?
Gitlab::OptimisticLocking.retry_lock(new_job, name: 'retry_build', &:enqueue)
@@ -68,26 +71,6 @@ module Ci
raise Gitlab::Access::AccessDeniedError, '403 Forbidden'
end
end
-
- def check_assignable_runners!(job); end
-
- def clone_job(job)
- project.builds.new(job_attributes(job))
- end
-
- def job_attributes(job)
- attributes = job.class.clone_accessors.to_h do |attribute|
- [attribute, job.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend
- end
-
- if job.persisted_environment.present?
- attributes[:metadata_attributes] ||= {}
- attributes[:metadata_attributes][:expanded_environment_name] = job.expanded_environment_name
- end
-
- attributes[:user] = current_user
- attributes
- end
end
end
diff --git a/app/services/ci/runners/register_runner_service.rb b/app/services/ci/runners/register_runner_service.rb
index 7978d094d9b..196d2de1a65 100644
--- a/app/services/ci/runners/register_runner_service.rb
+++ b/app/services/ci/runners/register_runner_service.rb
@@ -47,7 +47,7 @@ module Ci
end
def runner_registrar_valid?(type)
- Feature.disabled?(:runner_registration_control, default_enabled: :yaml) || Gitlab::CurrentSettings.valid_runner_registrars.include?(type)
+ Feature.disabled?(:runner_registration_control) || Gitlab::CurrentSettings.valid_runner_registrars.include?(type)
end
def token_scope
diff --git a/app/services/ci/runners/reset_registration_token_service.rb b/app/services/ci/runners/reset_registration_token_service.rb
index bbe49c04644..2a3fb08c5e1 100644
--- a/app/services/ci/runners/reset_registration_token_service.rb
+++ b/app/services/ci/runners/reset_registration_token_service.rb
@@ -29,3 +29,5 @@ module Ci
end
end
end
+
+Ci::Runners::ResetRegistrationTokenService.prepend_mod
diff --git a/app/services/ci/stuck_builds/drop_running_service.rb b/app/services/ci/stuck_builds/drop_running_service.rb
index a79224cc231..dfcf3ca3836 100644
--- a/app/services/ci/stuck_builds/drop_running_service.rb
+++ b/app/services/ci/stuck_builds/drop_running_service.rb
@@ -16,7 +16,7 @@ module Ci
private
def running_timed_out_builds
- if Feature.enabled?(:ci_new_query_for_running_stuck_jobs, default_enabled: :yaml)
+ if Feature.enabled?(:ci_new_query_for_running_stuck_jobs)
Ci::Build
.running
.created_at_before(BUILD_RUNNING_OUTDATED_TIMEOUT.ago)
diff --git a/app/services/ci/update_build_state_service.rb b/app/services/ci/update_build_state_service.rb
index 9df36b86404..a74ddcfaf06 100644
--- a/app/services/ci/update_build_state_service.rb
+++ b/app/services/ci/update_build_state_service.rb
@@ -217,11 +217,11 @@ module Ci
def chunks_migration_enabled?
::Feature.enabled?(:ci_enable_live_trace, build.project) &&
- ::Feature.enabled?(:ci_accept_trace, build.project, type: :ops, default_enabled: true)
+ ::Feature.enabled?(:ci_accept_trace, build.project, type: :ops)
end
def log_invalid_chunks?
- ::Feature.enabled?(:ci_trace_log_invalid_chunks, build.project, type: :ops, default_enabled: false)
+ ::Feature.enabled?(:ci_trace_log_invalid_chunks, build.project, type: :ops)
end
end
end
diff --git a/app/services/clusters/kubernetes.rb b/app/services/clusters/kubernetes.rb
index ef549b56946..819ac4c8464 100644
--- a/app/services/clusters/kubernetes.rb
+++ b/app/services/clusters/kubernetes.rb
@@ -14,7 +14,5 @@ module Clusters
GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME = 'gitlab-crossplane-database-rolebinding'
KNATIVE_SERVING_NAMESPACE = 'knative-serving'
ISTIO_SYSTEM_NAMESPACE = 'istio-system'
- GITLAB_CILIUM_ROLE_NAME = 'gitlab-cilium-role'
- GITLAB_CILIUM_ROLE_BINDING_NAME = 'gitlab-cilium-rolebinding'
end
end
diff --git a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
index ecad33fc7c0..eabc428d0d2 100644
--- a/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
+++ b/app/services/clusters/kubernetes/create_or_update_service_account_service.rb
@@ -53,8 +53,6 @@ module Clusters
create_or_update_knative_serving_role_binding
create_or_update_crossplane_database_role
create_or_update_crossplane_database_role_binding
- create_or_update_cilium_role
- create_or_update_cilium_role_binding
end
private
@@ -99,14 +97,6 @@ module Clusters
kubeclient.update_role_binding(crossplane_database_role_binding_resource)
end
- def create_or_update_cilium_role
- kubeclient.update_role(cilium_role_resource)
- end
-
- def create_or_update_cilium_role_binding
- kubeclient.update_role_binding(cilium_role_binding_resource)
- end
-
def service_account_resource
Gitlab::Kubernetes::ServiceAccount.new(
service_account_name,
@@ -185,28 +175,6 @@ module Clusters
service_account_name: service_account_name
).generate
end
-
- def cilium_role_resource
- Gitlab::Kubernetes::Role.new(
- name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
- namespace: service_account_namespace,
- rules: [{
- apiGroups: %w(cilium.io),
- resources: %w(ciliumnetworkpolicies),
- verbs: %w(get list create update patch)
- }]
- ).generate
- end
-
- def cilium_role_binding_resource
- Gitlab::Kubernetes::RoleBinding.new(
- name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
- role_name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
- role_kind: :Role,
- namespace: service_account_namespace,
- service_account_name: service_account_name
- ).generate
- end
end
end
end
diff --git a/app/services/concerns/alert_management/alert_processing.rb b/app/services/concerns/alert_management/alert_processing.rb
index 2b556a4339d..abbfd4d66d4 100644
--- a/app/services/concerns/alert_management/alert_processing.rb
+++ b/app/services/concerns/alert_management/alert_processing.rb
@@ -104,7 +104,7 @@ module AlertManagement
def find_existing_alert
return unless incoming_payload.gitlab_fingerprint
- AlertManagement::Alert.not_resolved.for_fingerprint(project, incoming_payload.gitlab_fingerprint).first
+ AlertManagement::Alert.find_unresolved_alert(project, incoming_payload.gitlab_fingerprint)
end
def build_new_alert
diff --git a/app/services/concerns/ci/downstream_pipeline_helpers.rb b/app/services/concerns/ci/downstream_pipeline_helpers.rb
new file mode 100644
index 00000000000..39c0adb6e4e
--- /dev/null
+++ b/app/services/concerns/ci/downstream_pipeline_helpers.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Ci
+ module DownstreamPipelineHelpers
+ def log_downstream_pipeline_creation(downstream_pipeline)
+ return unless downstream_pipeline&.persisted?
+
+ hierarchy_size = downstream_pipeline.all_pipelines_in_hierarchy.count
+ root_pipeline = downstream_pipeline.upstream_root
+
+ ::Gitlab::AppLogger.info(
+ message: "downstream pipeline created",
+ class: self.class.name,
+ root_pipeline_id: root_pipeline.id,
+ downstream_pipeline_id: downstream_pipeline.id,
+ downstream_pipeline_relationship: downstream_pipeline.parent_pipeline? ? :parent_child : :multi_project,
+ hierarchy_size: hierarchy_size,
+ root_pipeline_plan: root_pipeline.project.actual_plan_name,
+ root_pipeline_namespace_path: root_pipeline.project.namespace.full_path,
+ root_pipeline_project_path: root_pipeline.project.full_path
+ )
+ end
+ end
+end
diff --git a/app/services/concerns/group_linkable.rb b/app/services/concerns/group_linkable.rb
new file mode 100644
index 00000000000..43d10e01a4a
--- /dev/null
+++ b/app/services/concerns/group_linkable.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module GroupLinkable
+ extend ActiveSupport::Concern
+
+ def execute
+ return error('Not Found', 404) unless valid_to_create?
+
+ build_link
+
+ if link.save
+ after_successful_save
+ success(link: link)
+ else
+ error(link.errors.full_messages.to_sentence, 409)
+ end
+ end
+
+ private
+
+ attr_reader :shared_with_group, :link
+
+ def sharing_allowed?
+ sharing_outside_hierarchy_allowed? || within_hierarchy?
+ end
+
+ def sharing_outside_hierarchy_allowed?
+ !root_ancestor.prevent_sharing_groups_outside_hierarchy
+ end
+
+ def within_hierarchy?
+ root_ancestor.self_and_descendants_ids.include?(shared_with_group.id)
+ end
+
+ def after_successful_save
+ setup_authorizations
+ end
+end
diff --git a/app/services/container_expiration_policies/cleanup_service.rb b/app/services/container_expiration_policies/cleanup_service.rb
index 0da5e552c48..34889e58127 100644
--- a/app/services/container_expiration_policies/cleanup_service.rb
+++ b/app/services/container_expiration_policies/cleanup_service.rb
@@ -35,7 +35,8 @@ module ContainerExpirationPolicies
if service_result[:status] == :success
repository.update!(
expiration_policy_cleanup_status: :cleanup_unscheduled,
- expiration_policy_completed_at: Time.zone.now
+ expiration_policy_completed_at: Time.zone.now,
+ last_cleanup_deleted_tags_count: service_result[:deleted_size]
)
success(:finished, service_result)
diff --git a/app/services/container_expiration_policies/update_service.rb b/app/services/container_expiration_policies/update_service.rb
index 2f34941d692..32ee47457b7 100644
--- a/app/services/container_expiration_policies/update_service.rb
+++ b/app/services/container_expiration_policies/update_service.rb
@@ -28,7 +28,7 @@ module ContainerExpirationPolicies
end
def allowed?
- Ability.allowed?(current_user, :destroy_container_image, @container)
+ Ability.allowed?(current_user, :admin_container_image, @container)
end
def container_expiration_policy_params
diff --git a/app/services/container_expiration_policy_service.rb b/app/services/container_expiration_policy_service.rb
deleted file mode 100644
index cf5d702a9ef..00000000000
--- a/app/services/container_expiration_policy_service.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class ContainerExpirationPolicyService < BaseService
- InvalidPolicyError = Class.new(StandardError)
-
- def execute(container_expiration_policy)
- container_expiration_policy.schedule_next_run!
-
- container_expiration_policy.container_repositories.find_each do |container_repository|
- CleanupContainerRepositoryWorker.perform_async(
- nil,
- container_repository.id,
- container_expiration_policy.policy_params
- .merge(container_expiration_policy: true)
- )
- end
- end
-end
diff --git a/app/services/customer_relations/contacts/base_service.rb b/app/services/customer_relations/contacts/base_service.rb
index 1797e5021a1..4c6bcabe9e0 100644
--- a/app/services/customer_relations/contacts/base_service.rb
+++ b/app/services/customer_relations/contacts/base_service.rb
@@ -12,6 +12,23 @@ module CustomerRelations
def error(message)
ServiceResponse.error(message: Array(message))
end
+
+ def organization_valid?
+ return true unless params[:organization_id]
+
+ organization = Organization.find(params[:organization_id])
+ organization.group_id == group.id
+ rescue ActiveRecord::RecordNotFound
+ false
+ end
+
+ def error_organization_invalid
+ error('The specified organization was not found or does not belong to this group')
+ end
+
+ def error_no_permissions
+ error('You have insufficient permissions to manage contacts for this group')
+ end
end
end
end
diff --git a/app/services/customer_relations/contacts/create_service.rb b/app/services/customer_relations/contacts/create_service.rb
index 7ff8b731e0d..2fabc51eebf 100644
--- a/app/services/customer_relations/contacts/create_service.rb
+++ b/app/services/customer_relations/contacts/create_service.rb
@@ -8,7 +8,6 @@ module CustomerRelations
return error_organization_invalid unless organization_valid?
contact = Contact.create(params.merge(group_id: group.id))
-
return error_creating(contact) unless contact.persisted?
ServiceResponse.success(payload: contact)
@@ -16,23 +15,6 @@ module CustomerRelations
private
- def organization_valid?
- return true unless params[:organization_id]
-
- organization = Organization.find(params[:organization_id])
- organization.group_id == group.id
- rescue ActiveRecord::RecordNotFound
- false
- end
-
- def error_organization_invalid
- error('The specified organization was not found or does not belong to this group')
- end
-
- def error_no_permissions
- error('You have insufficient permissions to create a contact for this group')
- end
-
def error_creating(contact)
error(contact&.errors&.full_messages || 'Failed to create contact')
end
diff --git a/app/services/customer_relations/contacts/update_service.rb b/app/services/customer_relations/contacts/update_service.rb
index 473a80be262..66eb5731bc9 100644
--- a/app/services/customer_relations/contacts/update_service.rb
+++ b/app/services/customer_relations/contacts/update_service.rb
@@ -5,6 +5,9 @@ module CustomerRelations
class UpdateService < BaseService
def execute(contact)
return error_no_permissions unless allowed?
+
+ handle_active_param
+ return error_organization_invalid unless organization_valid?
return error_updating(contact) unless contact.update(params)
ServiceResponse.success(payload: contact)
@@ -12,8 +15,11 @@ module CustomerRelations
private
- def error_no_permissions
- error('You have insufficient permissions to update a contact for this group')
+ def handle_active_param
+ return if params[:active].nil?
+
+ active = params.delete(:active)
+ params[:state] = active ? 'active' : 'inactive'
end
def error_updating(contact)
diff --git a/app/services/customer_relations/organizations/update_service.rb b/app/services/customer_relations/organizations/update_service.rb
index 9d8f908db14..78fff9cf8f4 100644
--- a/app/services/customer_relations/organizations/update_service.rb
+++ b/app/services/customer_relations/organizations/update_service.rb
@@ -5,6 +5,8 @@ module CustomerRelations
class UpdateService < BaseService
def execute(organization)
return error_no_permissions unless allowed?
+
+ handle_active_param
return error_updating(organization) unless organization.update(params)
ServiceResponse.success(payload: organization)
@@ -12,6 +14,13 @@ module CustomerRelations
private
+ def handle_active_param
+ return if params[:active].nil?
+
+ active = params.delete(:active)
+ params[:state] = active ? 'active' : 'inactive'
+ end
+
def error_no_permissions
error('You have insufficient permissions to update an organization for this group')
end
diff --git a/app/services/database/consistency_fix_service.rb b/app/services/database/consistency_fix_service.rb
new file mode 100644
index 00000000000..402fa7541b3
--- /dev/null
+++ b/app/services/database/consistency_fix_service.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Database
+ class ConsistencyFixService
+ def initialize(source_model:, target_model:, sync_event_class:, source_sort_key:, target_sort_key:)
+ @source_model = source_model
+ @target_model = target_model
+ @sync_event_class = sync_event_class
+ @source_sort_key = source_sort_key
+ @target_sort_key = target_sort_key
+ end
+
+ attr_accessor :source_model, :target_model, :sync_event_class, :source_sort_key, :target_sort_key
+
+ def execute(ids:)
+ ids.each do |id|
+ if source_object(id) && target_object(id)
+ create_sync_event_for(id)
+ elsif target_object(id)
+ target_object(id).destroy!
+ end
+ end
+ sync_event_class.enqueue_worker
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def source_object(id)
+ source_model.find_by(source_sort_key => id)
+ end
+
+ def target_object(id)
+ target_model.find_by(target_sort_key => id)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def create_sync_event_for(id)
+ if source_model == Namespace
+ sync_event_class.create!(namespace_id: id)
+ elsif source_model == Project
+ sync_event_class.create!(project_id: id)
+ else
+ raise("Unknown Source Model #{source_model.name}")
+ end
+ end
+ end
+end
diff --git a/app/services/deployments/update_environment_service.rb b/app/services/deployments/update_environment_service.rb
index b0ba8ecaa47..b0eb153a7af 100644
--- a/app/services/deployments/update_environment_service.rb
+++ b/app/services/deployments/update_environment_service.rb
@@ -58,7 +58,7 @@ module Deployments
def expanded_environment_url
return unless environment_url
- if ::Feature.enabled?(:ci_expand_environment_name_and_url, deployment.project, default_enabled: :yaml)
+ if ::Feature.enabled?(:ci_expand_environment_name_and_url, deployment.project)
ExpandVariables.expand(environment_url, -> { variables.sort_and_expand_all })
else
ExpandVariables.expand(environment_url, -> { variables })
diff --git a/app/services/environments/stop_service.rb b/app/services/environments/stop_service.rb
index 24ae658d3d6..54ad94947ff 100644
--- a/app/services/environments/stop_service.rb
+++ b/app/services/environments/stop_service.rb
@@ -18,7 +18,9 @@ module Environments
environments.each { |environment| execute(environment) }
end
- def execute_for_merge_request(merge_request)
+ def execute_for_merge_request_pipeline(merge_request)
+ return unless merge_request.actual_head_pipeline&.merge_request?
+
merge_request.environments_in_head_pipeline(deployment_status: :success).each do |environment|
execute(environment)
end
diff --git a/app/services/error_tracking/base_service.rb b/app/services/error_tracking/base_service.rb
index 598621f70e1..d2ecd0a6d5a 100644
--- a/app/services/error_tracking/base_service.rb
+++ b/app/services/error_tracking/base_service.rb
@@ -71,5 +71,15 @@ module ErrorTracking
def can_update?
can?(current_user, :update_sentry_issue, project)
end
+
+ def error_repository
+ Gitlab::ErrorTracking::ErrorRepository.build(project)
+ end
+
+ def handle_error_repository_exceptions
+ yield
+ rescue Gitlab::ErrorTracking::ErrorRepository::DatabaseError => e
+ { error: e.message }
+ end
end
end
diff --git a/app/services/error_tracking/collect_error_service.rb b/app/services/error_tracking/collect_error_service.rb
index 6376b743255..8cb3793ba97 100644
--- a/app/services/error_tracking/collect_error_service.rb
+++ b/app/services/error_tracking/collect_error_service.rb
@@ -5,30 +5,24 @@ module ErrorTracking
include Gitlab::Utils::StrongMemoize
def execute
- # Error is a way to group events based on common data like name or cause
- # of exception. We need to keep a sane balance here between taking too little
- # and too much data into group logic.
- error = project.error_tracking_errors.report_error(
- name: exception['type'], # Example: ActionView::MissingTemplate
- description: exception['value'], # Example: Missing template posts/show in...
- actor: actor, # Example: PostsController#show
- platform: event['platform'], # Example: ruby
- timestamp: timestamp
- )
-
- # The payload field contains all the data on error including stacktrace in jsonb.
- # Together with occurred_at these are 2 main attributes that we need to save here.
- error.events.create!(
- environment: event['environment'],
+ error_repository.report_error(
+ name: exception['type'],
description: exception['value'],
- level: event['level'],
+ actor: actor,
+ platform: event['platform'],
occurred_at: timestamp,
+ environment: event['environment'],
+ level: event['level'],
payload: event
)
end
private
+ def error_repository
+ Gitlab::ErrorTracking::ErrorRepository.build(project)
+ end
+
def event
@event ||= format_event(params[:event])
end
diff --git a/app/services/error_tracking/issue_details_service.rb b/app/services/error_tracking/issue_details_service.rb
index 1614c597a8e..e82ad540e57 100644
--- a/app/services/error_tracking/issue_details_service.rb
+++ b/app/services/error_tracking/issue_details_service.rb
@@ -49,13 +49,10 @@ module ErrorTracking
# Issue https://gitlab.com/gitlab-org/gitlab/-/issues/329596
#
if project_error_tracking_setting.integrated_client?
- error = project.error_tracking_errors.find(issue_id)
-
- # We use the same response format as project_error_tracking_setting
- # method below for compatibility with existing code.
- {
- issue: error.to_sentry_detailed_error
- }
+ handle_error_repository_exceptions do
+ error = error_repository.find_error(issue_id)
+ { issue: error }
+ end
else
project_error_tracking_setting.issue_details(issue_id: issue_id)
end
diff --git a/app/services/error_tracking/issue_latest_event_service.rb b/app/services/error_tracking/issue_latest_event_service.rb
index 1bf86c658fc..0290c8eac86 100644
--- a/app/services/error_tracking/issue_latest_event_service.rb
+++ b/app/services/error_tracking/issue_latest_event_service.rb
@@ -26,14 +26,13 @@ module ErrorTracking
# Issue https://gitlab.com/gitlab-org/gitlab/-/issues/329596
#
if project_error_tracking_setting.integrated_client?
- error = project.error_tracking_errors.find(issue_id)
- event = error.events.last
+ handle_error_repository_exceptions do
+ event = error_repository.last_event_for(issue_id)
- # We use the same response format as project_error_tracking_setting
- # method below for compatibility with existing code.
- {
- latest_event: event.to_sentry_error_event
- }
+ # We use the same response format as project_error_tracking_setting
+ # method below for compatibility with existing code.
+ { latest_event: event }
+ end
else
project_error_tracking_setting.issue_latest_event(issue_id: issue_id)
end
diff --git a/app/services/error_tracking/issue_update_service.rb b/app/services/error_tracking/issue_update_service.rb
index 624e5f94dde..ca5e8d656a6 100644
--- a/app/services/error_tracking/issue_update_service.rb
+++ b/app/services/error_tracking/issue_update_service.rb
@@ -84,14 +84,12 @@ module ErrorTracking
# Issue https://gitlab.com/gitlab-org/gitlab/-/issues/329596
#
if project_error_tracking_setting.integrated_client?
- error = project.error_tracking_errors.find(opts[:issue_id])
- error.status = opts[:params][:status]
- error.save!
+ updated = error_repository.update_error(opts[:issue_id], status: opts[:params][:status])
# We use the same response format as project_error_tracking_setting
# method below for compatibility with existing code.
{
- updated: true
+ updated: updated
}
else
project_error_tracking_setting.update_issue(**opts)
diff --git a/app/services/error_tracking/list_issues_service.rb b/app/services/error_tracking/list_issues_service.rb
index 1979816b88d..ca7208dba96 100644
--- a/app/services/error_tracking/list_issues_service.rb
+++ b/app/services/error_tracking/list_issues_service.rb
@@ -73,24 +73,24 @@ module ErrorTracking
if project_error_tracking_setting.integrated_client?
# We are going to support more options in the future.
# For now we implement the bare minimum for rendering the list in UI.
- filter_opts = {
- status: opts[:issue_status],
+ list_opts = {
+ filters: { status: opts[:issue_status] },
sort: opts[:sort],
limit: opts[:limit],
cursor: opts[:cursor]
}
- errors = ErrorTracking::ErrorsFinder.new(current_user, project, filter_opts).execute
+ errors, pagination = error_repository.list_errors(**list_opts)
- pagination = {}
- pagination[:next] = { cursor: errors.cursor_for_next_page } if errors.has_next_page?
- pagination[:previous] = { cursor: errors.cursor_for_previous_page } if errors.has_previous_page?
+ pagination_hash = {}
+ pagination_hash[:next] = { cursor: pagination.next } if pagination.next
+ pagination_hash[:previous] = { cursor: pagination.prev } if pagination.prev
# We use the same response format as project_error_tracking_setting
# method below for compatibility with existing code.
{
- issues: errors.map(&:to_sentry_error),
- pagination: pagination
+ issues: errors,
+ pagination: pagination_hash
}
else
project_error_tracking_setting.list_sentry_issues(**opts)
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 417680e37cf..5a2c29f8e7a 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -185,7 +185,7 @@ class EventCreateService
track_event(event_action: :pushed, event_target: Project, author_id: current_user.id)
namespace = project.namespace
- if Feature.enabled?(:route_hll_to_snowplow, namespace, default_enabled: :yaml)
+ if Feature.enabled?(:route_hll_to_snowplow, namespace)
Gitlab::Tracking.event(self.class.to_s, 'action_active_users_project_repo', namespace: namespace, user: current_user, project: project)
end
diff --git a/app/services/git/base_hooks_service.rb b/app/services/git/base_hooks_service.rb
index 63f3f73905a..269637805ad 100644
--- a/app/services/git/base_hooks_service.rb
+++ b/app/services/git/base_hooks_service.rb
@@ -172,7 +172,7 @@ module Git
else
# This service runs in Sidekiq, so this shouldn't ever be
# called, but this is included just in case.
- Gitlab::ProjectServiceLogger
+ Gitlab::IntegrationsLogger
end
end
end
diff --git a/app/services/groups/group_links/create_service.rb b/app/services/groups/group_links/create_service.rb
index 8c3ba0a63f2..56ddf3ec0b4 100644
--- a/app/services/groups/group_links/create_service.rb
+++ b/app/services/groups/group_links/create_service.rb
@@ -3,50 +3,35 @@
module Groups
module GroupLinks
class CreateService < Groups::BaseService
- def initialize(shared_group, shared_with_group, user, params)
- @shared_group = shared_group
- super(shared_with_group, user, params)
- end
-
- def execute
- unless shared_with_group && shared_group &&
- can?(current_user, :admin_group_member, shared_group) &&
- can?(current_user, :read_group, shared_with_group) &&
- sharing_allowed?
- return error('Not Found', 404)
- end
+ include GroupLinkable
- link = GroupGroupLink.new(
- shared_group: shared_group,
- shared_with_group: shared_with_group,
- group_access: params[:shared_group_access],
- expires_at: params[:expires_at]
- )
+ def initialize(group, shared_with_group, user, params)
+ @shared_with_group = shared_with_group
- if link.save
- shared_with_group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
- success(link: link)
- else
- error(link.errors.full_messages.to_sentence, 409)
- end
+ super(group, user, params)
end
private
- attr_reader :shared_group
+ delegate :root_ancestor, to: :group
- alias_method :shared_with_group, :group
-
- def sharing_allowed?
- sharing_outside_hierarchy_allowed? || within_hierarchy?
+ def valid_to_create?
+ can?(current_user, :admin_group_member, group) &&
+ can?(current_user, :read_group, shared_with_group) &&
+ sharing_allowed?
end
- def sharing_outside_hierarchy_allowed?
- !shared_group.root_ancestor.namespace_settings.prevent_sharing_groups_outside_hierarchy
+ def build_link
+ @link = GroupGroupLink.new(
+ shared_group: group,
+ shared_with_group: shared_with_group,
+ group_access: params[:shared_group_access],
+ expires_at: params[:expires_at]
+ )
end
- def within_hierarchy?
- shared_group.root_ancestor.self_and_descendants_ids.include?(shared_with_group.id)
+ def setup_authorizations
+ shared_with_group.refresh_members_authorized_projects(blocking: false, direct_members_only: true)
end
end
end
diff --git a/app/services/groups/import_export/export_service.rb b/app/services/groups/import_export/export_service.rb
index ea26ebec20b..2bfd5a5ebab 100644
--- a/app/services/groups/import_export/export_service.rb
+++ b/app/services/groups/import_export/export_service.rb
@@ -78,7 +78,7 @@ module Groups
end
def ndjson?
- ::Feature.enabled?(:group_export_ndjson, group&.parent, default_enabled: :yaml)
+ ::Feature.enabled?(:group_export_ndjson, group&.parent)
end
def version_saver
diff --git a/app/services/groups/import_export/import_service.rb b/app/services/groups/import_export/import_service.rb
index c8c2124078d..f026f1698a9 100644
--- a/app/services/groups/import_export/import_service.rb
+++ b/app/services/groups/import_export/import_service.rb
@@ -72,7 +72,7 @@ module Groups
end
def ndjson?
- ::Feature.enabled?(:group_import_ndjson, group&.parent, default_enabled: true) &&
+ ::Feature.enabled?(:group_import_ndjson, group&.parent) &&
File.exist?(File.join(shared.export_path, 'tree/groups/_all.ndjson'))
end
diff --git a/app/services/groups/open_issues_count_service.rb b/app/services/groups/open_issues_count_service.rb
index c18d239998b..17cf3d38987 100644
--- a/app/services/groups/open_issues_count_service.rb
+++ b/app/services/groups/open_issues_count_service.rb
@@ -3,15 +3,11 @@
module Groups
# Service class for counting and caching the number of open issues of a group.
class OpenIssuesCountService < Groups::CountService
- # TOTAL_COUNT_KEY includes confidential and hidden issues (admin)
- # TOTAL_COUNT_WITHOUT_HIDDEN_KEY includes confidential issues but not hidden issues (reporter and above)
- # PUBLIC_COUNT_WITHOUT_HIDDEN_KEY does not include confidential or hidden issues (guest)
- TOTAL_COUNT_KEY = 'group_open_issues_including_hidden_count'
- TOTAL_COUNT_WITHOUT_HIDDEN_KEY = 'group_open_issues_without_hidden_count'
- PUBLIC_COUNT_WITHOUT_HIDDEN_KEY = 'group_open_public_issues_without_hidden_count'
+ PUBLIC_COUNT_KEY = 'group_public_open_issues_count'
+ TOTAL_COUNT_KEY = 'group_total_open_issues_count'
def clear_all_cache_keys
- [cache_key(TOTAL_COUNT_KEY), cache_key(TOTAL_COUNT_WITHOUT_HIDDEN_KEY), cache_key(PUBLIC_COUNT_WITHOUT_HIDDEN_KEY)].each do |key|
+ [cache_key(PUBLIC_COUNT_KEY), cache_key(TOTAL_COUNT_KEY)].each do |key|
Rails.cache.delete(key)
end
end
@@ -19,19 +15,7 @@ module Groups
private
def cache_key_name
- if include_hidden?
- TOTAL_COUNT_KEY
- elsif public_only?
- PUBLIC_COUNT_WITHOUT_HIDDEN_KEY
- else
- TOTAL_COUNT_WITHOUT_HIDDEN_KEY
- end
- end
-
- def include_hidden?
- strong_memoize(:user_is_admin) do
- user&.can_admin_all_resources?
- end
+ public_only? ? PUBLIC_COUNT_KEY : TOTAL_COUNT_KEY
end
def public_only?
@@ -51,8 +35,7 @@ module Groups
state: 'opened',
non_archived: true,
include_subgroups: true,
- public_only: public_only?,
- include_hidden: include_hidden?
+ public_only: public_only?
).execute
end
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index f2e959396bc..a0021ae2ccb 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -191,18 +191,9 @@ module Groups
end
def refresh_project_authorizations
- projects_to_update = Set.new
+ project_ids = Groups::ProjectsRequiringAuthorizationsRefresh::OnTransferFinder.new(@group).execute
- # All projects in this hierarchy need to have their project authorizations recalculated
- @group.all_projects.each_batch { |prjs| projects_to_update.merge(prjs.ids) } # rubocop: disable CodeReuse/ActiveRecord
-
- # When a group is transferred, it also affects who gets access to the projects shared to
- # the subgroups within its hierarchy, so we also schedule jobs that refresh authorizations for all such shared projects.
- ProjectGroupLink.in_group(@group.self_and_descendants.select(:id)).each_batch do |project_group_links|
- projects_to_update.merge(project_group_links.pluck(:project_id)) # rubocop: disable CodeReuse/ActiveRecord
- end
-
- AuthorizedProjectUpdate::ProjectAccessChangedService.new(projects_to_update.to_a).execute unless projects_to_update.empty?
+ AuthorizedProjectUpdate::ProjectAccessChangedService.new(project_ids).execute
end
def raise_transfer_error(message)
diff --git a/app/services/import/bitbucket_server_service.rb b/app/services/import/bitbucket_server_service.rb
index cdb23370ddc..d1c22f06464 100644
--- a/app/services/import/bitbucket_server_service.rb
+++ b/app/services/import/bitbucket_server_service.rb
@@ -21,6 +21,8 @@ module Import
if project.persisted?
success(project)
+ elsif project.errors[:import_source_disabled].present?
+ error(project.errors[:import_source_disabled], :forbidden)
else
log_and_return_error(project_save_error(project), :unprocessable_entity)
end
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index a891dcc11e3..033f6bcb043 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -25,6 +25,8 @@ module Import
if project.persisted?
success(project)
+ elsif project.errors[:import_source_disabled].present?
+ error(project.errors[:import_source_disabled], :forbidden)
else
error(project_save_error(project), :unprocessable_entity)
end
diff --git a/app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb b/app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb
index ae9a450660c..ac58711a0ac 100644
--- a/app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb
+++ b/app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb
@@ -58,7 +58,7 @@ module Import
end
def validate_aws_s3?
- ::Feature.enabled?(:import_project_from_remote_file_s3, default_enabled: :yaml)
+ ::Feature.enabled?(:import_project_from_remote_file_s3)
end
def headers
diff --git a/app/services/incident_management/timeline_events/base_service.rb b/app/services/incident_management/timeline_events/base_service.rb
new file mode 100644
index 00000000000..cae58465e4a
--- /dev/null
+++ b/app/services/incident_management/timeline_events/base_service.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ module TimelineEvents
+ class BaseService
+ def allowed?
+ user&.can?(:admin_incident_management_timeline_event, incident)
+ end
+
+ def success(timeline_event)
+ ServiceResponse.success(payload: { timeline_event: timeline_event })
+ end
+
+ def error(message)
+ ServiceResponse.error(message: message)
+ end
+
+ def error_no_permissions
+ error(_('You have insufficient permissions to manage timeline events for this incident'))
+ end
+
+ def error_in_save(timeline_event)
+ error(timeline_event.errors.full_messages.to_sentence)
+ end
+ end
+ end
+end
diff --git a/app/services/incident_management/timeline_events/create_service.rb b/app/services/incident_management/timeline_events/create_service.rb
new file mode 100644
index 00000000000..7d287e1bd82
--- /dev/null
+++ b/app/services/incident_management/timeline_events/create_service.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ module TimelineEvents
+ DEFAULT_ACTION = 'comment'
+
+ class CreateService < TimelineEvents::BaseService
+ def initialize(incident, user, params)
+ @project = incident.project
+ @incident = incident
+ @user = user
+ @params = params
+ end
+
+ def execute
+ return error_no_permissions unless allowed?
+
+ timeline_event_params = {
+ project: project,
+ incident: incident,
+ author: user,
+ note: params[:note],
+ action: params.fetch(:action, DEFAULT_ACTION),
+ note_html: params[:note_html].presence || params[:note],
+ occurred_at: params[:occurred_at],
+ promoted_from_note: params[:promoted_from_note]
+ }
+
+ timeline_event = IncidentManagement::TimelineEvent.new(timeline_event_params)
+
+ if timeline_event.save
+ add_system_note(timeline_event)
+
+ success(timeline_event)
+ else
+ error_in_save(timeline_event)
+ end
+ end
+
+ private
+
+ attr_reader :project, :user, :incident, :params
+
+ def add_system_note(timeline_event)
+ return unless Feature.enabled?(:incident_timeline, project)
+
+ SystemNoteService.add_timeline_event(timeline_event)
+ end
+ end
+ end
+end
diff --git a/app/services/incident_management/timeline_events/destroy_service.rb b/app/services/incident_management/timeline_events/destroy_service.rb
new file mode 100644
index 00000000000..8bb186c289a
--- /dev/null
+++ b/app/services/incident_management/timeline_events/destroy_service.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ module TimelineEvents
+ class DestroyService < TimelineEvents::BaseService
+ # @param timeline_event [IncidentManagement::TimelineEvent]
+ # @param user [User]
+ def initialize(timeline_event, user)
+ @timeline_event = timeline_event
+ @user = user
+ @incident = timeline_event.incident
+ @project = @incident.project
+ end
+
+ def execute
+ return error_no_permissions unless allowed?
+
+ if timeline_event.destroy
+ add_system_note(incident, user)
+
+ success(timeline_event)
+ else
+ error_in_save(timeline_event)
+ end
+ end
+
+ private
+
+ attr_reader :project, :timeline_event, :user, :incident
+
+ def add_system_note(incident, user)
+ return unless Feature.enabled?(:incident_timeline, project)
+
+ SystemNoteService.delete_timeline_event(incident, user)
+ end
+ end
+ end
+end
diff --git a/app/services/incident_management/timeline_events/update_service.rb b/app/services/incident_management/timeline_events/update_service.rb
new file mode 100644
index 00000000000..fe8b4879561
--- /dev/null
+++ b/app/services/incident_management/timeline_events/update_service.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+module IncidentManagement
+ module TimelineEvents
+ # @param timeline_event [IncidentManagement::TimelineEvent]
+ # @param user [User]
+ # @param params [Hash]
+ # @option params [string] note
+ # @option params [datetime] occurred_at
+ class UpdateService < TimelineEvents::BaseService
+ def initialize(timeline_event, user, params)
+ @timeline_event = timeline_event
+ @incident = timeline_event.incident
+ @user = user
+ @note = params[:note]
+ @occurred_at = params[:occurred_at]
+ end
+
+ def execute
+ return error_no_permissions unless allowed?
+
+ if timeline_event.update(update_params)
+ add_system_note(timeline_event)
+
+ success(timeline_event)
+ else
+ error_in_save(timeline_event)
+ end
+ end
+
+ private
+
+ attr_reader :timeline_event, :incident, :user, :note, :occurred_at
+
+ def update_params
+ { updated_by_user: user, note: note.presence, occurred_at: occurred_at.presence }.compact
+ end
+
+ def add_system_note(timeline_event)
+ return unless Feature.enabled?(:incident_timeline, incident.project)
+
+ changes = was_changed(timeline_event)
+ return if changes == :none
+
+ SystemNoteService.edit_timeline_event(timeline_event, user, was_changed: changes)
+ end
+
+ def was_changed(timeline_event)
+ changes = timeline_event.previous_changes
+ occurred_at_changed = changes.key?('occurred_at')
+ note_changed = changes.key?('note')
+
+ return :occurred_at_and_note if occurred_at_changed && note_changed
+ return :occurred_at if occurred_at_changed
+ return :note if note_changed
+
+ :none
+ end
+ end
+ end
+end
diff --git a/app/services/issuable/destroy_service.rb b/app/services/issuable/destroy_service.rb
index b75905fb5b0..6aab56f0f68 100644
--- a/app/services/issuable/destroy_service.rb
+++ b/app/services/issuable/destroy_service.rb
@@ -26,13 +26,15 @@ module Issuable
end
def delete_todos(actor, issuable)
- TodosDestroyer::DestroyedIssuableWorker
- .perform_async(issuable.id, issuable.class.name)
+ issuable.run_after_commit_or_now do
+ TodosDestroyer::DestroyedIssuableWorker.perform_async(issuable.id, issuable.class.name)
+ end
end
def delete_label_links(actor, issuable)
- Issuable::LabelLinksDestroyWorker
- .perform_async(issuable.id, issuable.class.name)
+ issuable.run_after_commit_or_now do
+ Issuable::LabelLinksDestroyWorker.perform_async(issuable.id, issuable.class.name)
+ end
end
end
end
diff --git a/app/services/jira/requests/base.rb b/app/services/jira/requests/base.rb
index 3e15d47e8af..8e8511e5180 100644
--- a/app/services/jira/requests/base.rb
+++ b/app/services/jira/requests/base.rb
@@ -3,8 +3,6 @@
module Jira
module Requests
class Base
- include ProjectServicesLoggable
-
JIRA_API_VERSION = 2
# Limit the size of the JSON error message we will attempt to parse, as the JSON is external input.
JIRA_ERROR_JSON_SIZE_LIMIT = 5_000
@@ -54,17 +52,13 @@ module Jira
def request
response = client.get(url)
build_service_response(response)
- rescue *ALL_ERRORS => e
- log_error('Error sending message',
- client_url: client.options[:site],
- error: {
- exception_class: e.class.name,
- exception_message: e.message,
- exception_backtrace: Gitlab::BacktraceCleaner.clean_backtrace(e.backtrace)
- }
+ rescue *ALL_ERRORS => error
+ jira_integration.log_exception(error,
+ message: 'Error sending message',
+ client_url: client.options[:site]
)
- ServiceResponse.error(message: error_message(e))
+ ServiceResponse.error(message: error_message(error))
end
def auth_docs_link_start
diff --git a/app/services/jira_connect/sync_service.rb b/app/services/jira_connect/sync_service.rb
index bddc7cbe5a0..92255711399 100644
--- a/app/services/jira_connect/sync_service.rb
+++ b/app/services/jira_connect/sync_service.rb
@@ -39,7 +39,7 @@ module JiraConnect
end
def logger
- Gitlab::ProjectServiceLogger
+ Gitlab::IntegrationsLogger
end
end
end
diff --git a/app/services/jira_import/start_import_service.rb b/app/services/jira_import/start_import_service.rb
index c9ffdeb2a16..4d1f2c94ac8 100644
--- a/app/services/jira_import/start_import_service.rb
+++ b/app/services/jira_import/start_import_service.rb
@@ -73,7 +73,7 @@ module JiraImport
jira_imports_for_project = project.jira_imports.by_jira_project_key(jira_project_key).size + 1
title = "jira-import::#{jira_project_key}-#{jira_imports_for_project}"
description = "Label for issues that were imported from Jira on #{import_start_time.strftime('%Y-%m-%d %H:%M:%S')}"
- color = "#{Label.color_for(title)}"
+ color = "#{::Gitlab::Color.color_for(title)}"
{ title: title, description: description, color: color }
end
diff --git a/app/services/loose_foreign_keys/batch_cleaner_service.rb b/app/services/loose_foreign_keys/batch_cleaner_service.rb
index b89de15a568..95eb8b47009 100644
--- a/app/services/loose_foreign_keys/batch_cleaner_service.rb
+++ b/app/services/loose_foreign_keys/batch_cleaner_service.rb
@@ -54,8 +54,6 @@ module LooseForeignKeys
attr_reader :parent_table, :loose_foreign_key_definitions, :deleted_parent_records, :modification_tracker, :deleted_records_counter, :deleted_records_rescheduled_count, :deleted_records_incremented_count
def handle_over_limit
- return if Feature.disabled?(:lfk_fair_queueing, default_enabled: :yaml)
-
records_to_reschedule = []
records_to_increment = []
diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb
index 8f7b63c32c8..8485e7cbafa 100644
--- a/app/services/members/create_service.rb
+++ b/app/services/members/create_service.rb
@@ -46,9 +46,11 @@ module Members
:tasks_to_be_done_members, :member_created_member_task_id
def invites_from_params
- return params[:user_ids] if params[:user_ids].is_a?(Array)
+ # String, Nil, Array, Integer
+ return params[:user_id] if params[:user_id].is_a?(Array)
+ return [] unless params[:user_id]
- params[:user_ids]&.to_s&.split(',')&.uniq&.flatten || []
+ params[:user_id].to_s.split(',').uniq
end
def validate_invite_source!
diff --git a/app/services/members/creator_service.rb b/app/services/members/creator_service.rb
index 321658ac9c5..81986a2883f 100644
--- a/app/services/members/creator_service.rb
+++ b/app/services/members/creator_service.rb
@@ -82,7 +82,13 @@ module Members
if member.request?
approve_request
else
- member.save
+ # 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?
end
end
diff --git a/app/services/members/projects/creator_service.rb b/app/services/members/projects/creator_service.rb
index d92fe60c54a..9e9389d3c18 100644
--- a/app/services/members/projects/creator_service.rb
+++ b/app/services/members/projects/creator_service.rb
@@ -6,16 +6,11 @@ module Members
private
def can_create_new_member?
- # order is important here!
- # The `admin_project_member` check has side-effects that causes projects not be created if this area is hit
- # during project creation.
- # Call that triggers is current_user.can?(:admin_project_member, member.project)
- # I tracked back to base_policy.rb admin check and specifically in
- # Gitlab::Auth::CurrentUserMode.new(@user).admin_mode? call.
- # This calls user.admin? and that specific call causes issues with project creation in
- # spec/requests/api/projects_spec.rb specs and others, mostly around project creation.
- # https://gitlab.com/gitlab-org/gitlab/-/issues/358931 for investigation
- adding_the_creator_as_owner_in_a_personal_project? || current_user.can?(:admin_project_member, member.project)
+ # This access check(`admin_project_member`) will write to safe request store cache for the user being added.
+ # This means any operations inside the same request will need to purge that safe request
+ # store cache if operations are needed to be done inside the same request that checks max member access again on
+ # that user.
+ current_user.can?(:admin_project_member, member.project) || adding_the_creator_as_owner_in_a_personal_project?
end
def can_update_existing_member?
diff --git a/app/services/merge_requests/approval_service.rb b/app/services/merge_requests/approval_service.rb
index 37c2676e51c..e3f0758699b 100644
--- a/app/services/merge_requests/approval_service.rb
+++ b/app/services/merge_requests/approval_service.rb
@@ -33,6 +33,8 @@ module MergeRequests
def execute_approval_hooks(merge_request, current_user)
# Only one approval is required for a merge request to be approved
+ notification_service.async.approve_mr(merge_request, current_user)
+
execute_hooks(merge_request, 'approved')
end
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index d197c13378a..44be254441d 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -43,6 +43,8 @@ module MergeRequests
end
def handle_assignees_change(merge_request, old_assignees)
+ bulk_update_assignees_state(merge_request, merge_request.assignees - old_assignees)
+
MergeRequests::HandleAssigneesChangeService
.new(project: project, current_user: current_user)
.async_execute(merge_request, old_assignees)
@@ -58,17 +60,16 @@ module MergeRequests
new_reviewers = merge_request.reviewers - old_reviewers
merge_request_activity_counter.track_users_review_requested(users: new_reviewers)
merge_request_activity_counter.track_reviewers_changed_action(user: current_user)
+ bulk_update_reviewers_state(merge_request, new_reviewers)
unless new_reviewers.include?(current_user)
remove_attention_requested(merge_request)
-
- merge_request.merge_request_reviewers_with(new_reviewers).update_all(updated_state_by_user_id: current_user.id)
end
end
def cleanup_environments(merge_request)
Environments::StopService.new(merge_request.source_project, current_user)
- .execute_for_merge_request(merge_request)
+ .execute_for_merge_request_pipeline(merge_request)
end
def cancel_review_app_jobs!(merge_request)
@@ -246,7 +247,7 @@ module MergeRequests
end
def remove_all_attention_requests(merge_request)
- return unless merge_request.attention_requested_enabled?
+ return unless current_user.mr_attention_requests_enabled?
users = merge_request.reviewers + merge_request.assignees
@@ -254,9 +255,49 @@ module MergeRequests
end
def remove_attention_requested(merge_request)
- return unless merge_request.attention_requested_enabled?
+ return unless current_user.mr_attention_requests_enabled?
+
+ ::MergeRequests::RemoveAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request, user: current_user).execute
+ end
+
+ def bulk_update_assignees_state(merge_request, new_assignees)
+ return unless current_user.mr_attention_requests_enabled?
+ return if new_assignees.empty?
+
+ assignees_map = merge_request.merge_request_assignees_with(new_assignees).to_h do |assignee|
+ state = if assignee.user_id == current_user&.id
+ :unreviewed
+ else
+ merge_request.find_reviewer(assignee.assignee)&.state || :attention_requested
+ end
+
+ [
+ assignee,
+ { state: MergeRequestAssignee.states[state], updated_state_by_user_id: current_user.id }
+ ]
+ end
+
+ ::Gitlab::Database::BulkUpdate.execute(%i[state updated_state_by_user_id], assignees_map)
+ end
+
+ def bulk_update_reviewers_state(merge_request, new_reviewers)
+ return unless current_user.mr_attention_requests_enabled?
+ return if new_reviewers.empty?
+
+ reviewers_map = merge_request.merge_request_reviewers_with(new_reviewers).to_h do |reviewer|
+ state = if reviewer.user_id == current_user&.id
+ :unreviewed
+ else
+ merge_request.find_assignee(reviewer.reviewer)&.state || :attention_requested
+ end
+
+ [
+ reviewer,
+ { state: MergeRequestReviewer.states[state], updated_state_by_user_id: current_user.id }
+ ]
+ end
- ::MergeRequests::RemoveAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request).execute
+ ::Gitlab::Database::BulkUpdate.execute(%i[state updated_state_by_user_id], reviewers_map)
end
end
end
diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 878e42172b7..ee6f204be45 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -203,6 +203,12 @@ module MergeRequests
target_branch.blank? || target_project.commit(target_branch)
end
+ def set_draft_title_if_needed
+ return unless compare_commits.empty? || Gitlab::Utils.to_boolean(params[:draft])
+
+ merge_request.title = wip_title
+ end
+
# When your branch name starts with an iid followed by a dash this pattern will be
# interpreted as the user wants to close that issue on this project.
#
@@ -220,7 +226,7 @@ module MergeRequests
assign_title_and_description_from_commits
merge_request.title ||= title_from_issue if target_project.issues_enabled? || target_project.external_issue_tracker
merge_request.title ||= source_branch.titleize.humanize
- merge_request.title = wip_title if compare_commits.empty?
+ set_draft_title_if_needed
append_closes_description
end
diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb
index 9c525ae8489..8e0f72eb380 100644
--- a/app/services/merge_requests/create_service.rb
+++ b/app/services/merge_requests/create_service.rb
@@ -25,9 +25,7 @@ module MergeRequests
# expose issuable create method so it can be called from email
# handler CreateMergeRequestHandler
- def create(merge_request)
- super
- end
+ public :create
private
diff --git a/app/services/merge_requests/handle_assignees_change_service.rb b/app/services/merge_requests/handle_assignees_change_service.rb
index a169a6dc0b6..78c93d10f2a 100644
--- a/app/services/merge_requests/handle_assignees_change_service.rb
+++ b/app/services/merge_requests/handle_assignees_change_service.rb
@@ -21,8 +21,6 @@ module MergeRequests
merge_request_activity_counter.track_users_assigned_to_mr(users: new_assignees)
merge_request_activity_counter.track_assignees_changed_action(user: current_user)
- merge_request.merge_request_assignees_with(new_assignees).update_all(updated_state_by_user_id: current_user.id)
-
execute_assignees_hooks(merge_request, old_assignees) if options[:execute_hooks]
unless new_assignees.include?(current_user)
diff --git a/app/services/merge_requests/mergeability/run_checks_service.rb b/app/services/merge_requests/mergeability/run_checks_service.rb
index 03c6d985c23..fd6907c976b 100644
--- a/app/services/merge_requests/mergeability/run_checks_service.rb
+++ b/app/services/merge_requests/mergeability/run_checks_service.rb
@@ -37,7 +37,7 @@ module MergeRequests
attr_reader :merge_request, :params
def run_check(check)
- return check.execute unless Feature.enabled?(:mergeability_caching, merge_request.project, default_enabled: :yaml)
+ return check.execute unless Feature.enabled?(:mergeability_caching, merge_request.project)
return check.execute unless check.cacheable?
cached_result = results.read(merge_check: check)
diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb
index e475b57e4a2..980c757bcbc 100644
--- a/app/services/merge_requests/post_merge_service.rb
+++ b/app/services/merge_requests/post_merge_service.rb
@@ -45,7 +45,19 @@ module MergeRequests
closed_issues = merge_request.visible_closing_issues_for(current_user)
closed_issues.each do |issue|
- Issues::CloseService.new(project: project, current_user: current_user).execute(issue, commit: merge_request)
+ # We are intentionally only closing Issues asynchronously (excluding ExternalIssues)
+ # as the worker only supports finding an Issue. We are also only experiencing
+ # SQL timeouts when closing an Issue.
+ if Feature.enabled?(:async_mr_close_issue, project) && issue.is_a?(Issue)
+ MergeRequests::CloseIssueWorker.perform_async(
+ project.id,
+ current_user.id,
+ issue.id,
+ merge_request.id
+ )
+ else
+ Issues::CloseService.new(project: project, current_user: current_user).execute(issue, commit: merge_request)
+ end
end
end
diff --git a/app/services/merge_requests/push_options_handler_service.rb b/app/services/merge_requests/push_options_handler_service.rb
index adbe3ddfdad..076fe8c3b21 100644
--- a/app/services/merge_requests/push_options_handler_service.rb
+++ b/app/services/merge_requests/push_options_handler_service.rb
@@ -126,6 +126,7 @@ module MergeRequests
params = {
title: push_options[:title],
description: push_options[:description],
+ draft: push_options[:draft],
target_branch: push_options[:target],
force_remove_source_branch: push_options[:remove_source_branch],
label: push_options[:label],
@@ -147,6 +148,10 @@ module MergeRequests
params[:milestone] = milestone if milestone
end
+ if params.key?(:description)
+ params[:description] = params[:description].gsub('\n', "\n")
+ end
+
params
end
diff --git a/app/services/merge_requests/remove_approval_service.rb b/app/services/merge_requests/remove_approval_service.rb
index c7bc3532264..d9bb17a7b1b 100644
--- a/app/services/merge_requests/remove_approval_service.rb
+++ b/app/services/merge_requests/remove_approval_service.rb
@@ -33,6 +33,7 @@ module MergeRequests
def trigger_approval_hooks(merge_request)
yield
+ notification_service.async.unapprove_mr(merge_request, current_user)
execute_hooks(merge_request, 'unapproved')
end
diff --git a/app/services/merge_requests/remove_attention_requested_service.rb b/app/services/merge_requests/remove_attention_requested_service.rb
index a32a8071471..8a410fda691 100644
--- a/app/services/merge_requests/remove_attention_requested_service.rb
+++ b/app/services/merge_requests/remove_attention_requested_service.rb
@@ -2,22 +2,26 @@
module MergeRequests
class RemoveAttentionRequestedService < MergeRequests::BaseService
- attr_accessor :merge_request
+ attr_accessor :merge_request, :user
- def initialize(project:, current_user:, merge_request:)
+ def initialize(project:, current_user:, merge_request:, user:)
super(project: project, current_user: current_user)
@merge_request = merge_request
+ @user = user
end
def execute
return error("Invalid permissions") unless can?(current_user, :update_merge_request, merge_request)
if reviewer || assignee
+ return success if reviewer&.reviewed? || assignee&.reviewed?
+
update_state(reviewer)
update_state(assignee)
- current_user.invalidate_attention_requested_count
+ user.invalidate_attention_requested_count
+ create_remove_attention_request_note
success
else
@@ -28,15 +32,19 @@ module MergeRequests
private
def assignee
- merge_request.find_assignee(current_user)
+ @assignee ||= merge_request.find_assignee(user)
end
def reviewer
- merge_request.find_reviewer(current_user)
+ @reviewer ||= merge_request.find_reviewer(user)
end
def update_state(reviewer_or_assignee)
reviewer_or_assignee&.update(state: :reviewed)
end
+
+ def create_remove_attention_request_note
+ SystemNoteService.remove_attention_request(merge_request, merge_request.project, current_user, user)
+ end
end
end
diff --git a/app/services/merge_requests/request_attention_service.rb b/app/services/merge_requests/request_attention_service.rb
new file mode 100644
index 00000000000..07e9996f87b
--- /dev/null
+++ b/app/services/merge_requests/request_attention_service.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class RequestAttentionService < MergeRequests::BaseService
+ attr_accessor :merge_request, :user
+
+ def initialize(project:, current_user:, merge_request:, user:)
+ super(project: project, current_user: current_user)
+
+ @merge_request = merge_request
+ @user = user
+ end
+
+ def execute
+ return error("Invalid permissions") unless can?(current_user, :update_merge_request, merge_request)
+
+ if reviewer || assignee
+ return success if reviewer&.attention_requested? || assignee&.attention_requested?
+
+ update_state(reviewer)
+ update_state(assignee)
+
+ user.invalidate_attention_requested_count
+ create_attention_request_note
+ notity_user
+
+ if current_user.id != user.id
+ remove_attention_requested(merge_request)
+ end
+
+ success
+ else
+ error("User is not a reviewer or assignee of the merge request")
+ end
+ end
+
+ private
+
+ def notity_user
+ notification_service.async.attention_requested_of_merge_request(merge_request, current_user, user)
+ todo_service.create_attention_requested_todo(merge_request, current_user, user)
+ end
+
+ def create_attention_request_note
+ SystemNoteService.request_attention(merge_request, merge_request.project, current_user, user)
+ end
+
+ def assignee
+ @assignee ||= merge_request.find_assignee(user)
+ end
+
+ def reviewer
+ @reviewer ||= merge_request.find_reviewer(user)
+ end
+
+ def update_state(reviewer_or_assignee)
+ reviewer_or_assignee&.update(state: :attention_requested, updated_state_by: current_user)
+ end
+ end
+end
diff --git a/app/services/merge_requests/update_assignees_service.rb b/app/services/merge_requests/update_assignees_service.rb
index d52c1bbbcda..5b23f69ac4a 100644
--- a/app/services/merge_requests/update_assignees_service.rb
+++ b/app/services/merge_requests/update_assignees_service.rb
@@ -20,6 +20,8 @@ module MergeRequests
attrs = update_attrs.merge(assignee_ids: new_ids)
merge_request.update!(**attrs)
+ bulk_update_assignees_state(merge_request, merge_request.assignees - old_assignees)
+
# Defer the more expensive operations (handle_assignee_changes) to the background
MergeRequests::HandleAssigneesChangeService
.new(project: project, current_user: current_user)
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 391079223ca..6e8afaecbba 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -11,6 +11,10 @@ module MergeRequests
end
def execute(merge_request)
+ if Gitlab::Utils.to_boolean(params[:draft])
+ merge_request.title = merge_request.draft_title
+ end
+
update_merge_request_with_specialized_service(merge_request) || general_fallback(merge_request)
end
diff --git a/app/services/namespaces/in_product_marketing_email_records.rb b/app/services/namespaces/in_product_marketing_email_records.rb
deleted file mode 100644
index 1237a05ea13..00000000000
--- a/app/services/namespaces/in_product_marketing_email_records.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module Namespaces
- class InProductMarketingEmailRecords
- attr_reader :records
-
- def initialize
- @records = []
- end
-
- def save!
- Users::InProductMarketingEmail.bulk_insert!(@records)
- @records = []
- end
-
- def add(user, track, series)
- @records << Users::InProductMarketingEmail.new(
- user: user,
- track: track,
- series: series,
- created_at: Time.zone.now,
- updated_at: Time.zone.now
- )
- end
- end
-end
diff --git a/app/services/namespaces/in_product_marketing_emails_service.rb b/app/services/namespaces/in_product_marketing_emails_service.rb
index e42c3498c21..414f253deb8 100644
--- a/app/services/namespaces/in_product_marketing_emails_service.rb
+++ b/app/services/namespaces/in_product_marketing_emails_service.rb
@@ -61,7 +61,7 @@ module Namespaces
def initialize(track, interval)
@track = track
@interval = interval
- @sent_email_records = InProductMarketingEmailRecords.new
+ @sent_email_records = ::Users::InProductMarketingEmailRecords.new
end
def execute
@@ -86,7 +86,7 @@ module Namespaces
users_for_group(group).each do |user|
if can_perform_action?(user, group)
send_email(user, group)
- sent_email_records.add(user, track, series)
+ sent_email_records.add(user, track: track, series: series)
end
end
diff --git a/app/services/namespaces/package_settings/update_service.rb b/app/services/namespaces/package_settings/update_service.rb
index cbadbe5c907..c0af0900450 100644
--- a/app/services/namespaces/package_settings/update_service.rb
+++ b/app/services/namespaces/package_settings/update_service.rb
@@ -32,7 +32,7 @@ module Namespaces
end
def allowed?
- Ability.allowed?(current_user, :create_package_settings, @container)
+ Ability.allowed?(current_user, :admin_package, @container)
end
def package_settings_params
diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb
index d32d1c8ca12..4074b1d1182 100644
--- a/app/services/notes/create_service.rb
+++ b/app/services/notes/create_service.rb
@@ -45,13 +45,13 @@ module Notes
def execute_quick_actions(note)
return yield(false) unless quick_actions_supported?(note)
- content, update_params, message = quick_actions_service.execute(note, quick_action_options)
+ content, update_params, message, command_names = quick_actions_service.execute(note, quick_action_options)
only_commands = content.empty?
note.note = content
yield(only_commands)
- do_commands(note, update_params, message, only_commands)
+ do_commands(note, update_params, message, command_names, only_commands)
end
def quick_actions_supported?(note)
@@ -84,7 +84,7 @@ module Notes
end
end
- def do_commands(note, update_params, message, only_commands)
+ def do_commands(note, update_params, message, command_names, only_commands)
return if quick_actions_service.commands_executed_count.to_i == 0
if update_params.present?
@@ -96,6 +96,7 @@ module Notes
# when #save is called
if only_commands
note.errors.add(:commands_only, message.presence || _('Failed to apply commands.'))
+ note.errors.add(:command_names, command_names.flatten)
# Allow consumers to detect problems applying commands
note.errors.add(:commands, _('Failed to apply commands.')) unless message.present?
end
@@ -112,6 +113,7 @@ module Notes
track_note_creation_usage_for_issues(note) if note.for_issue?
track_note_creation_usage_for_merge_requests(note) if note.for_merge_request?
track_incident_action(user, note.noteable, 'incident_comment') if note.for_issue?
+ track_note_creation_in_ipynb(note)
if Feature.enabled?(:notes_create_service_tracking, project)
Gitlab::Tracking.event('Notes::CreateService', 'execute', **tracking_data_for(note))
@@ -134,6 +136,16 @@ module Notes
def track_note_creation_usage_for_merge_requests(note)
Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter.track_create_comment_action(note: note)
end
+
+ def should_track_ipynb_notes?(note)
+ Feature.enabled?(:ipynbdiff_notes_tracker) && note.respond_to?(:diff_file) && note.diff_file&.ipynb?
+ end
+
+ def track_note_creation_in_ipynb(note)
+ return unless should_track_ipynb_notes?(note)
+
+ Gitlab::UsageDataCounters::IpynbDiffActivityCounter.note_created(note)
+ end
end
end
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index a3f250bb235..32b23d4978f 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -761,6 +761,20 @@ class NotificationService
mailer.in_product_marketing_email(user_id, group_id, track, series).deliver_later
end
+ def approve_mr(merge_request, current_user)
+ approve_mr_email(merge_request, merge_request.target_project, current_user)
+ end
+
+ def unapprove_mr(merge_request, current_user)
+ unapprove_mr_email(merge_request, merge_request.target_project, current_user)
+ end
+
+ def inactive_project_deletion_warning(project, deletion_date)
+ owners_and_maintainers_without_invites(project).each do |recipient|
+ mailer.inactive_project_deletion_warning_email(project, recipient.user, deletion_date).deliver_later
+ end
+ end
+
protected
def new_resource_email(target, current_user, method)
@@ -866,6 +880,22 @@ class NotificationService
private
+ def approve_mr_email(merge_request, project, current_user)
+ recipients = ::NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: 'approve')
+
+ recipients.each do |recipient|
+ mailer.approved_merge_request_email(recipient.user.id, merge_request.id, current_user.id).deliver_later
+ end
+ end
+
+ def unapprove_mr_email(merge_request, project, current_user)
+ recipients = ::NotificationRecipients::BuildService.build_recipients(merge_request, current_user, action: 'unapprove')
+
+ recipients.each do |recipient|
+ mailer.unapproved_merge_request_email(recipient.user.id, merge_request.id, current_user.id).deliver_later
+ end
+ end
+
def pipeline_notification_status(ref_status, pipeline)
if Ci::Ref.failing_state?(ref_status)
'failed'
diff --git a/app/services/projects/after_import_service.rb b/app/services/projects/after_import_service.rb
deleted file mode 100644
index bb0d084d191..00000000000
--- a/app/services/projects/after_import_service.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- class AfterImportService
- RESERVED_REF_PREFIXES = Repository::RESERVED_REFS_NAMES.map { |n| File.join('refs', n, '/') }
-
- def initialize(project)
- @project = project
- end
-
- def execute
- service = Repositories::HousekeepingService.new(@project)
-
- service.execute do
- import_failure_service.with_retry(action: 'delete_all_refs') do
- repository.delete_all_refs_except(RESERVED_REF_PREFIXES)
- end
- end
-
- # Right now we don't actually have a way to know if a project
- # import actually changed, so we increment the counter to avoid
- # causing GC to run every time.
- service.increment!
- rescue Repositories::HousekeepingService::LeaseTaken => e
- Gitlab::Import::Logger.info(
- message: 'Project housekeeping failed',
- project_full_path: @project.full_path,
- project_id: @project.id,
- 'error.message' => e.message
- )
- end
-
- private
-
- def import_failure_service
- Gitlab::ImportExport::ImportFailureService.new(@project)
- end
-
- def repository
- @project.repository
- end
- end
-end
diff --git a/app/services/projects/android_target_platform_detector_service.rb b/app/services/projects/android_target_platform_detector_service.rb
new file mode 100644
index 00000000000..11635ad18d5
--- /dev/null
+++ b/app/services/projects/android_target_platform_detector_service.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Projects
+ # Service class to detect if a project is made to run on the Android platform.
+ #
+ # This service searches for an AndroidManifest.xml file which all Android app
+ # project must have. It returns the symbol :android if the given project is an
+ # Android app project.
+ #
+ # Ref: https://developer.android.com/guide/topics/manifest/manifest-intro
+ #
+ # Example usage:
+ # > AndroidTargetPlatformDetectorService.new(a_project).execute
+ # => nil
+ # > AndroidTargetPlatformDetectorService.new(an_android_project).execute
+ # => :android
+ class AndroidTargetPlatformDetectorService < BaseService
+ # <manifest> element is required and must occur once inside AndroidManifest.xml
+ MANIFEST_FILE_SEARCH_QUERY = '<manifest filename:AndroidManifest.xml'
+
+ def execute
+ detect
+ end
+
+ private
+
+ def file_finder
+ @file_finder ||= ::Gitlab::FileFinder.new(project, project.default_branch)
+ end
+
+ def detect
+ return :android if file_finder.find(MANIFEST_FILE_SEARCH_QUERY).present?
+ end
+ end
+end
diff --git a/app/services/projects/blame_service.rb b/app/services/projects/blame_service.rb
new file mode 100644
index 00000000000..f7c1240a3ba
--- /dev/null
+++ b/app/services/projects/blame_service.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+# Service class to correctly initialize Gitlab::Blame and Kaminari pagination
+# objects
+module Projects
+ class BlameService
+ PER_PAGE = 1000
+
+ def initialize(blob, commit, params)
+ @blob = blob
+ @commit = commit
+ @page = extract_page(params)
+ end
+
+ def blame
+ Gitlab::Blame.new(blob, commit, range: blame_range)
+ end
+
+ def pagination
+ return unless pagination_enabled?
+
+ Kaminari.paginate_array([], total_count: blob_lines_count)
+ .page(page)
+ .per(per_page)
+ .limit(per_page)
+ end
+
+ private
+
+ attr_reader :blob, :commit, :page
+
+ def blame_range
+ return unless pagination_enabled?
+
+ first_line = (page - 1) * per_page + 1
+ last_line = (first_line + per_page).to_i - 1
+
+ first_line..last_line
+ end
+
+ def extract_page(params)
+ page = params.fetch(:page, 1).to_i
+
+ return 1 if page < 1 || overlimit?(page)
+
+ page
+ end
+
+ def per_page
+ PER_PAGE
+ end
+
+ def overlimit?(page)
+ page * per_page >= blob_lines_count + per_page
+ end
+
+ def blob_lines_count
+ @blob_lines_count ||= blob.data.lines.count
+ end
+
+ def pagination_enabled?
+ Feature.enabled?(:blame_page_pagination, commit.project)
+ end
+ end
+end
diff --git a/app/services/projects/branches_by_mode_service.rb b/app/services/projects/branches_by_mode_service.rb
index 090671cc79a..0248f997a03 100644
--- a/app/services/projects/branches_by_mode_service.rb
+++ b/app/services/projects/branches_by_mode_service.rb
@@ -37,7 +37,7 @@ class Projects::BranchesByModeService
def use_gitaly_pagination?
return false if params[:page].present? || params[:search].present?
- Feature.enabled?(:branch_list_keyset_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:branch_list_keyset_pagination, project)
end
def fetch_branches_via_offset_pagination
diff --git a/app/services/projects/container_repository/cleanup_tags_service.rb b/app/services/projects/container_repository/cleanup_tags_service.rb
index 72f3fddb4c3..0a8e8e72766 100644
--- a/app/services/projects/container_repository/cleanup_tags_service.rb
+++ b/app/services/projects/container_repository/cleanup_tags_service.rb
@@ -117,7 +117,6 @@ module Projects
@counts[:before_truncate_size] = @tags.size
@counts[:after_truncate_size] = @tags.size
- return unless throttling_enabled?
return if max_list_size == 0
# truncate the list to make sure that after the #filter_keep_n
@@ -151,10 +150,6 @@ module Projects
!!result
end
- def throttling_enabled?
- Feature.enabled?(:container_registry_expiration_policies_throttling, default_enabled: :yaml)
- end
-
def max_list_size
::Gitlab::CurrentSettings.current_application_settings.container_registry_cleanup_tags_service_max_list_size.to_i
end
diff --git a/app/services/projects/container_repository/delete_tags_service.rb b/app/services/projects/container_repository/delete_tags_service.rb
index b4a57c70111..a3e533c670e 100644
--- a/app/services/projects/container_repository/delete_tags_service.rb
+++ b/app/services/projects/container_repository/delete_tags_service.rb
@@ -8,13 +8,13 @@ module Projects
def execute(container_repository)
@container_repository = container_repository
- unless params[:container_expiration_policy]
+ unless container_expiration_policy?
return error('access denied') unless can?(current_user, :destroy_container_image, project)
end
@tag_names = params[:tags]
return error('not tags specified') if @tag_names.blank?
- return error('repository importing') if @container_repository.migration_importing?
+ return error('repository importing') if cancel_while_importing?
delete_tags
end
@@ -49,6 +49,20 @@ module Projects
log_error(log_data)
end
end
+
+ def cancel_while_importing?
+ return true if @container_repository.importing?
+
+ if container_expiration_policy?
+ return @container_repository.pre_importing? || @container_repository.pre_import_done?
+ end
+
+ false
+ end
+
+ def container_expiration_policy?
+ params[:container_expiration_policy].present?
+ end
end
end
end
diff --git a/app/services/projects/container_repository/gitlab/delete_tags_service.rb b/app/services/projects/container_repository/gitlab/delete_tags_service.rb
index f109cb0ca20..81cef554dec 100644
--- a/app/services/projects/container_repository/gitlab/delete_tags_service.rb
+++ b/app/services/projects/container_repository/gitlab/delete_tags_service.rb
@@ -46,18 +46,11 @@ module Projects
end
def timeout?(start_time)
- return false unless throttling_enabled?
return false if service_timeout.in?(DISABLED_TIMEOUTS)
(Time.zone.now - start_time) > service_timeout
end
- def throttling_enabled?
- strong_memoize(:feature_flag) do
- Feature.enabled?(:container_registry_expiration_policies_throttling, default_enabled: :yaml)
- end
- end
-
def service_timeout
::Gitlab::CurrentSettings.current_application_settings.container_registry_delete_tags_service_timeout
end
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 3e26c8c35b2..c7f284bec9b 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -4,6 +4,9 @@ module Projects
class CreateService < BaseService
include ValidatesClassificationLabel
+ ImportSourceDisabledError = Class.new(StandardError)
+ INTERNAL_IMPORT_SOURCES = %w[bare_repository gitlab_custom_project_template gitlab_project_migration].freeze
+
def initialize(user, params)
@current_user = user
@params = params.dup
@@ -25,6 +28,8 @@ module Projects
@project = Project.new(params)
+ validate_import_source_enabled!
+
@project.visibility_level = @project.group.visibility_level unless @project.visibility_level_allowed_by_group?
# If a project is newly created it should have shared runners settings
@@ -77,6 +82,9 @@ module Projects
rescue ActiveRecord::RecordInvalid => e
message = "Unable to save #{e.inspect}: #{e.record.errors.full_messages.join(", ")}"
fail(error: message)
+ rescue ImportSourceDisabledError => e
+ @project.errors.add(:import_source_disabled, e.message) if @project
+ fail(error: e.message)
rescue StandardError => e
@project.errors.add(:base, e.message) if @project
fail(error: e.message)
@@ -124,11 +132,7 @@ module Projects
end
def create_project_settings
- if Feature.enabled?(:create_project_settings, default_enabled: :yaml)
- @project.project_setting.save if @project.project_setting.changed?
- else
- @project.create_project_setting unless @project.project_setting
- end
+ @project.project_setting.save if @project.project_setting.changed?
end
# Add an authorization for the current user authorizations inline
@@ -157,6 +161,13 @@ module Projects
)
else
@project.add_owner(@project.namespace.owner, current_user: current_user)
+ # During the process of adding a project owner, a check on permissions is made on the user which caches
+ # the max member access for that user on this project.
+ # Since that is `0` before the member is created - and we are still inside the request
+ # cycle when we need to do other operations that might check those permissions (e.g. write a commit)
+ # we need to purge that cache so that the updated permissions is fetched instead of using the outdated cached value of 0
+ # from before member creation
+ @project.team.purge_member_access_cache_for_user_id(@project.namespace.owner.id)
end
end
@@ -242,6 +253,18 @@ module Projects
private
+ def validate_import_source_enabled!
+ return unless @params[:import_type]
+
+ import_type = @params[:import_type].to_s
+
+ return if INTERNAL_IMPORT_SOURCES.include?(import_type)
+
+ unless ::Gitlab::CurrentSettings.import_sources&.include?(import_type)
+ raise ImportSourceDisabledError, "#{import_type} import source is disabled"
+ end
+ end
+
def parent_namespace
@parent_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace
end
diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb
index a0232779c97..72036aaff35 100644
--- a/app/services/projects/group_links/create_service.rb
+++ b/app/services/projects/group_links/create_service.rb
@@ -3,26 +3,31 @@
module Projects
module GroupLinks
class CreateService < BaseService
- def execute(group)
- return error('Not Found', 404) unless group && can?(current_user, :read_namespace, group)
+ include GroupLinkable
- link = project.project_group_links.new(
- group: group,
- group_access: params[:link_group_access],
- expires_at: params[:expires_at]
- )
+ def initialize(project, shared_with_group, user, params)
+ @shared_with_group = shared_with_group
- if link.save
- setup_authorizations(group)
- success(link: link)
- else
- error(link.errors.full_messages.to_sentence, 409)
- end
+ super(project, user, params)
end
private
- def setup_authorizations(group)
+ delegate :root_ancestor, to: :project
+
+ def valid_to_create?
+ can?(current_user, :read_namespace, shared_with_group) && sharing_allowed?
+ end
+
+ def build_link
+ @link = project.project_group_links.new(
+ group: shared_with_group,
+ group_access: params[:link_group_access],
+ expires_at: params[:expires_at]
+ )
+ end
+
+ def setup_authorizations
AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(project.id)
# AuthorizedProjectsWorker uses an exclusive lease per user but
@@ -30,7 +35,7 @@ module Projects
# compare the inconsistency rates of both approaches, we still run
# AuthorizedProjectsWorker but with some delay and lower urgency as a
# safety net.
- group.refresh_members_authorized_projects(
+ shared_with_group.refresh_members_authorized_projects(
blocking: false,
priority: UserProjectAccessChangedService::LOW_PRIORITY
)
diff --git a/app/services/projects/in_product_marketing_campaign_emails_service.rb b/app/services/projects/in_product_marketing_campaign_emails_service.rb
new file mode 100644
index 00000000000..249a2d89fc1
--- /dev/null
+++ b/app/services/projects/in_product_marketing_campaign_emails_service.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Projects
+ class InProductMarketingCampaignEmailsService
+ include Gitlab::Experiment::Dsl
+
+ def initialize(project, campaign)
+ @project = project
+ @campaign = campaign
+ @sent_email_records = ::Users::InProductMarketingEmailRecords.new
+ end
+
+ def execute
+ send_emails
+ end
+
+ private
+
+ attr_reader :project, :campaign, :sent_email_records
+
+ def send_emails
+ project_users.each do |user|
+ send_email(user)
+ end
+
+ sent_email_records.save!
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def project_users
+ @project_users ||= project.users
+ .where(email_opted_in: true)
+ .merge(Users::InProductMarketingEmail.without_campaign(campaign))
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def project_users_max_access_levels
+ ids = project_users.map(&:id)
+ @project_users_max_access_levels ||= project.team.max_member_access_for_user_ids(ids)
+ end
+
+ def send_email(user)
+ return unless user.can?(:receive_notifications)
+ return unless target_user?(user)
+
+ Notify.build_ios_app_guide_email(user.notification_email_or_default).deliver_later
+
+ sent_email_records.add(user, campaign: campaign)
+ experiment(:build_ios_app_guide_email, project: project).track(:email_sent)
+ end
+
+ def target_user?(user)
+ max_access_level = project_users_max_access_levels[user.id]
+ max_access_level >= Gitlab::Access::DEVELOPER
+ end
+ end
+end
diff --git a/app/services/projects/lfs_pointers/lfs_download_service.rb b/app/services/projects/lfs_pointers/lfs_download_service.rb
index 76005a1c96e..c032fbf1508 100644
--- a/app/services/projects/lfs_pointers/lfs_download_service.rb
+++ b/app/services/projects/lfs_pointers/lfs_download_service.rb
@@ -23,7 +23,7 @@ module Projects
def execute
return unless project&.lfs_enabled? && lfs_download_object
return error("LFS file with oid #{lfs_oid} has invalid attributes") unless lfs_download_object.valid?
- return link_existing_lfs_object! if Feature.enabled?(:lfs_link_existing_object, project, default_enabled: :yaml) && lfs_size > LARGE_FILE_SIZE && lfs_object
+ return link_existing_lfs_object! if Feature.enabled?(:lfs_link_existing_object, project) && lfs_size > LARGE_FILE_SIZE && lfs_object
wrap_download_errors do
download_lfs_file!
diff --git a/app/services/projects/open_issues_count_service.rb b/app/services/projects/open_issues_count_service.rb
index 8b7a418edf5..ee4d559e612 100644
--- a/app/services/projects/open_issues_count_service.rb
+++ b/app/services/projects/open_issues_count_service.rb
@@ -7,12 +7,8 @@ module Projects
include Gitlab::Utils::StrongMemoize
# Cache keys used to store issues count
- # TOTAL_COUNT_KEY includes confidential and hidden issues (admin)
- # TOTAL_COUNT_WITHOUT_HIDDEN_KEY includes confidential issues but not hidden issues (reporter and above)
- # PUBLIC_COUNT_WITHOUT_HIDDEN_KEY does not include confidential or hidden issues (guest)
- TOTAL_COUNT_KEY = 'project_open_issues_including_hidden_count'
- TOTAL_COUNT_WITHOUT_HIDDEN_KEY = 'project_open_issues_without_hidden_count'
- PUBLIC_COUNT_WITHOUT_HIDDEN_KEY = 'project_open_public_issues_without_hidden_count'
+ PUBLIC_COUNT_KEY = 'public_open_issues_count'
+ TOTAL_COUNT_KEY = 'total_open_issues_count'
def initialize(project, user = nil)
@user = user
@@ -20,98 +16,59 @@ module Projects
super(project)
end
- # rubocop: disable CodeReuse/ActiveRecord
- def refresh_cache(&block)
- if block_given?
- super(&block)
- else
- update_cache_for_key(total_count_cache_key) do
- issues_with_hidden
- end
-
- update_cache_for_key(public_count_without_hidden_cache_key) do
- issues_without_hidden_without_confidential
- end
-
- update_cache_for_key(total_count_without_hidden_cache_key) do
- issues_without_hidden_with_confidential
- end
- end
- end
-
- private
-
- def relation_for_count
- self.class.query(@project, public_only: public_only?, include_hidden: include_hidden?)
- end
-
def cache_key_name
- if include_hidden?
- TOTAL_COUNT_KEY
- elsif public_only?
- PUBLIC_COUNT_WITHOUT_HIDDEN_KEY
- else
- TOTAL_COUNT_WITHOUT_HIDDEN_KEY
- end
- end
-
- def include_hidden?
- user_is_admin?
+ public_only? ? PUBLIC_COUNT_KEY : TOTAL_COUNT_KEY
end
def public_only?
!user_is_at_least_reporter?
end
- def user_is_admin?
- strong_memoize(:user_is_admin) do
- @user&.can_admin_all_resources?
- end
- end
-
def user_is_at_least_reporter?
strong_memoize(:user_is_at_least_reporter) do
@user && @project.team.member?(@user, Gitlab::Access::REPORTER)
end
end
- def total_count_without_hidden_cache_key
- cache_key(TOTAL_COUNT_WITHOUT_HIDDEN_KEY)
+ def relation_for_count
+ self.class.query(@project, public_only: public_only?)
end
- def public_count_without_hidden_cache_key
- cache_key(PUBLIC_COUNT_WITHOUT_HIDDEN_KEY)
+ def public_count_cache_key
+ cache_key(PUBLIC_COUNT_KEY)
end
def total_count_cache_key
cache_key(TOTAL_COUNT_KEY)
end
- def issues_with_hidden
- self.class.query(@project, public_only: false, include_hidden: true).count
- end
+ # rubocop: disable CodeReuse/ActiveRecord
+ def refresh_cache(&block)
+ count_grouped_by_confidential = self.class.query(@project, public_only: false).group(:confidential).count
+ public_count = count_grouped_by_confidential[false] || 0
+ total_count = public_count + (count_grouped_by_confidential[true] || 0)
- def issues_without_hidden_without_confidential
- self.class.query(@project, public_only: true, include_hidden: false).count
- end
+ update_cache_for_key(public_count_cache_key) do
+ public_count
+ end
- def issues_without_hidden_with_confidential
- self.class.query(@project, public_only: false, include_hidden: false).count
+ update_cache_for_key(total_count_cache_key) do
+ total_count
+ end
end
- # We only show total issues count for admins, who are allowed to view hidden issues.
- # We also only show issues count including confidential for reporters, who are allowed to view confidential issues.
+ # We only show issues count including confidential for reporters, who are allowed to view confidential issues.
# This will still show a discrepancy on issues number but should be less than before.
# Check https://gitlab.com/gitlab-org/gitlab-foss/issues/38418 description.
+
# rubocop: disable CodeReuse/ActiveRecord
+ def self.query(projects, public_only: true)
+ issues_filtered_by_type = Issue.opened.with_issue_type(Issue::TYPES_FOR_LIST)
- def self.query(projects, public_only: true, include_hidden: false)
- if include_hidden
- Issue.opened.with_issue_type(Issue::TYPES_FOR_LIST).where(project: projects)
- elsif public_only
- Issue.public_only.opened.with_issue_type(Issue::TYPES_FOR_LIST).where(project: projects)
+ if public_only
+ issues_filtered_by_type.public_only.where(project: projects)
else
- Issue.without_hidden.opened.with_issue_type(Issue::TYPES_FOR_LIST).where(project: projects)
+ issues_filtered_by_type.where(project: projects)
end
end
# rubocop: enable CodeReuse/ActiveRecord
diff --git a/app/services/projects/overwrite_project_service.rb b/app/services/projects/overwrite_project_service.rb
index eea8f867b45..d3fed43363c 100644
--- a/app/services/projects/overwrite_project_service.rb
+++ b/app/services/projects/overwrite_project_service.rb
@@ -41,7 +41,7 @@ module Projects
private
def track_service(start_time, source_project, exception)
- return if ::Feature.disabled?(:project_overwrite_service_tracking, source_project, default_enabled: :yaml)
+ return if ::Feature.disabled?(:project_overwrite_service_tracking, source_project)
duration = ::Gitlab::Metrics::System.monotonic_time - start_time
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index c7a34afffb3..c29770d0c5f 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -45,7 +45,7 @@ module Projects
def visible_groups
visible_groups = project.invited_groups
- unless project_owner?
+ unless project.team.owner?(current_user)
visible_groups = visible_groups.public_or_visible_to_user(current_user)
end
@@ -60,13 +60,5 @@ module Projects
def individual_project_members
project.project_members.select(*GroupMember.cached_column_list)
end
-
- def project_owner?
- if project.group.present?
- project.group.owners.include?(current_user)
- else
- project.namespace.owner == current_user
- end
- end
end
end
diff --git a/app/services/projects/prometheus/alerts/alert_params.rb b/app/services/projects/prometheus/alerts/alert_params.rb
deleted file mode 100644
index 1c39ed36b12..00000000000
--- a/app/services/projects/prometheus/alerts/alert_params.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- module Alerts
- module AlertParams
- def alert_params
- return params if params[:operator].blank?
-
- params.merge(
- operator: PrometheusAlert.operator_to_enum(params[:operator])
- )
- end
- end
- end
- end
-end
diff --git a/app/services/projects/prometheus/alerts/create_service.rb b/app/services/projects/prometheus/alerts/create_service.rb
deleted file mode 100644
index 0d7d8ab1a62..00000000000
--- a/app/services/projects/prometheus/alerts/create_service.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- module Alerts
- class CreateService < BaseProjectService
- include AlertParams
-
- def execute
- project.prometheus_alerts.create(alert_params)
- end
- end
- end
- end
-end
diff --git a/app/services/projects/prometheus/alerts/destroy_service.rb b/app/services/projects/prometheus/alerts/destroy_service.rb
deleted file mode 100644
index 243b12eb654..00000000000
--- a/app/services/projects/prometheus/alerts/destroy_service.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- module Alerts
- class DestroyService < BaseProjectService
- def execute(alert)
- alert.destroy
- end
- end
- end
- end
-end
diff --git a/app/services/projects/prometheus/alerts/update_service.rb b/app/services/projects/prometheus/alerts/update_service.rb
deleted file mode 100644
index 1802f35dae9..00000000000
--- a/app/services/projects/prometheus/alerts/update_service.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- module Alerts
- class UpdateService < BaseProjectService
- include AlertParams
-
- def execute(alert)
- alert.update(alert_params)
- end
- end
- end
- end
-end
diff --git a/app/services/projects/prometheus/metrics/base_service.rb b/app/services/projects/prometheus/metrics/base_service.rb
index be1783dde70..15247d45776 100644
--- a/app/services/projects/prometheus/metrics/base_service.rb
+++ b/app/services/projects/prometheus/metrics/base_service.rb
@@ -8,40 +8,12 @@ module Projects
def initialize(metric, params = {})
@metric = metric
- @project = metric.project
@params = params.dup
end
protected
- attr_reader :metric, :project, :params
-
- def application
- alert.environment.cluster_prometheus_adapter
- end
-
- def schedule_alert_update
- return unless alert
- return unless alert.environment
-
- ::Clusters::Applications::ScheduleUpdateService.new(
- alert.environment.cluster_prometheus_adapter, project).execute
- end
-
- def alert
- strong_memoize(:alert) { find_alert(metric) }
- end
-
- def find_alert(metric)
- Projects::Prometheus::AlertsFinder
- .new(project: project, metric: metric)
- .execute
- .first
- end
-
- def has_alert?
- alert.present?
- end
+ attr_reader :metric, :params
end
end
end
diff --git a/app/services/projects/prometheus/metrics/destroy_service.rb b/app/services/projects/prometheus/metrics/destroy_service.rb
index 6a46eb5516c..d85499dc4ae 100644
--- a/app/services/projects/prometheus/metrics/destroy_service.rb
+++ b/app/services/projects/prometheus/metrics/destroy_service.rb
@@ -5,7 +5,6 @@ module Projects
module Metrics
class DestroyService < Metrics::BaseService
def execute
- schedule_alert_update if has_alert?
metric.destroy
end
end
diff --git a/app/services/projects/prometheus/metrics/update_service.rb b/app/services/projects/prometheus/metrics/update_service.rb
deleted file mode 100644
index 9b51f4ab47d..00000000000
--- a/app/services/projects/prometheus/metrics/update_service.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- module Metrics
- class UpdateService < Metrics::BaseService
- def execute
- metric.update!(params)
- schedule_alert_update if requires_alert_update?
- metric
- end
-
- private
-
- def requires_alert_update?
- has_alert? && (changing_title? || changing_query?)
- end
-
- def changing_title?
- metric.previous_changes.include?(:title)
- end
-
- def changing_query?
- metric.previous_changes.include?(:query)
- end
- end
- end
- end
-end
diff --git a/app/services/projects/record_target_platforms_service.rb b/app/services/projects/record_target_platforms_service.rb
index 224e16f53b3..664e72e9785 100644
--- a/app/services/projects/record_target_platforms_service.rb
+++ b/app/services/projects/record_target_platforms_service.rb
@@ -4,26 +4,50 @@ module Projects
class RecordTargetPlatformsService < BaseService
include Gitlab::Utils::StrongMemoize
+ def initialize(project, detector_service)
+ @project = project
+ @detector_service = detector_service
+ end
+
def execute
record_target_platforms
end
private
+ attr_reader :project, :detector_service
+
def target_platforms
strong_memoize(:target_platforms) do
- AppleTargetPlatformDetectorService.new(project).execute
+ Array(detector_service.new(project).execute)
end
end
def record_target_platforms
return unless target_platforms.present?
- setting = ::ProjectSetting.find_or_initialize_by(project: project) # rubocop:disable CodeReuse/ActiveRecord
- setting.target_platforms = target_platforms
- setting.save
+ project_setting.target_platforms = target_platforms
+ project_setting.save
+
+ send_build_ios_app_guide_email
+
+ project_setting.target_platforms
+ end
+
+ def project_setting
+ @project_setting ||= ::ProjectSetting.find_or_initialize_by(project: project) # rubocop:disable CodeReuse/ActiveRecord
+ end
+
+ def experiment_candidate?
+ experiment(:build_ios_app_guide_email, project: project).run
+ end
+
+ def send_build_ios_app_guide_email
+ return unless target_platforms.include? :ios
+ return unless experiment_candidate?
- setting.target_platforms
+ campaign = Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE
+ Projects::InProductMarketingCampaignEmailsService.new(project, campaign).execute
end
end
end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 2ec965fe2f4..c6ea364320f 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -30,6 +30,7 @@ module Projects
validate_state!
validate_max_size!
+ validate_public_folder!
validate_max_entries!
build.artifacts_file.use_file do |artifacts_path|
@@ -180,6 +181,10 @@ module Projects
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
diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb
index f3ea0967a99..705d23ec704 100644
--- a/app/services/projects/update_remote_mirror_service.rb
+++ b/app/services/projects/update_remote_mirror_service.rb
@@ -65,7 +65,7 @@ module Projects
message += "Error synchronizing LFS files:"
message += "\n\n#{lfs_status[:message]}\n\n"
- failed = Feature.enabled?(:remote_mirror_fail_on_lfs, project, default_enabled: :yaml)
+ failed = Feature.enabled?(:remote_mirror_fail_on_lfs, project)
end
if response.divergent_refs.any?
diff --git a/app/services/prometheus/create_default_alerts_service.rb b/app/services/prometheus/create_default_alerts_service.rb
deleted file mode 100644
index eb8a9d45658..00000000000
--- a/app/services/prometheus/create_default_alerts_service.rb
+++ /dev/null
@@ -1,105 +0,0 @@
-# frozen_string_literal: true
-
-# DEPRECATED: To be removed as part of https://gitlab.com/groups/gitlab-org/-/epics/5877
-module Prometheus
- class CreateDefaultAlertsService < BaseService
- include Gitlab::Utils::StrongMemoize
-
- attr_reader :project
-
- DEFAULT_ALERTS = [
- {
- identifier: 'response_metrics_nginx_ingress_16_http_error_rate',
- operator: 'gt',
- threshold: 0.1
- },
- {
- identifier: 'response_metrics_nginx_ingress_http_error_rate',
- operator: 'gt',
- threshold: 0.1
- },
- {
- identifier: 'response_metrics_nginx_http_error_percentage',
- operator: 'gt',
- threshold: 0.1
- }
- ].freeze
-
- def initialize(project:)
- @project = project
- end
-
- def execute
- return ServiceResponse.error(message: 'Invalid project') unless project
- return ServiceResponse.error(message: 'Invalid environment') unless environment
-
- create_alerts
- schedule_prometheus_update
-
- ServiceResponse.success
- end
-
- private
-
- def create_alerts
- DEFAULT_ALERTS.each do |alert_hash|
- identifier = alert_hash[:identifier]
- next if alerts_by_identifier(environment).key?(identifier)
-
- metric = metrics_by_identifier[identifier]
- next unless metric
-
- create_alert(alert: alert_hash, metric: metric)
- end
- end
-
- def schedule_prometheus_update
- return unless prometheus_adapter
-
- ::Clusters::Applications::ScheduleUpdateService.new(prometheus_adapter, project).execute
- end
-
- def prometheus_adapter
- environment.cluster_prometheus_adapter
- end
-
- def metrics_by_identifier
- strong_memoize(:metrics_by_identifier) do
- metric_identifiers = DEFAULT_ALERTS.map { |alert| alert[:identifier] }
-
- PrometheusMetricsFinder
- .new(identifier: metric_identifiers, common: true)
- .execute
- .index_by(&:identifier)
- end
- end
-
- def alerts_by_identifier(environment)
- strong_memoize(:alerts_by_identifier) do
- Projects::Prometheus::AlertsFinder
- .new(project: project, metric: metrics_by_identifier.values, environment: environment)
- .execute
- .index_by { |alert| alert.prometheus_metric.identifier }
- end
- end
-
- def environment
- strong_memoize(:environment) do
- Environments::EnvironmentsFinder.new(project, nil, name: 'production').execute.first ||
- project.environments.first
- end
- end
-
- def create_alert(alert:, metric:)
- PrometheusAlert.create!(
- project: project,
- prometheus_metric: metric,
- environment: environment,
- threshold: alert[:threshold],
- operator: alert[:operator]
- )
- rescue ActiveRecord::RecordNotUnique
- # Ignore duplicate creations although it unlikely to happen
- end
- end
-end
diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb
index 47f4b9c6898..4bcb15b2d9c 100644
--- a/app/services/quick_actions/interpret_service.rb
+++ b/app/services/quick_actions/interpret_service.rb
@@ -44,7 +44,7 @@ module QuickActions
content, commands = extractor.extract_commands(content, only: only)
extract_updates(commands)
- [content, @updates, execution_messages_for(commands)]
+ [content, @updates, execution_messages_for(commands), command_names(commands)]
end
# Takes a text and interprets the commands that are extracted from it.
@@ -83,8 +83,10 @@ module QuickActions
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).to_set
- missing = args.reject { |arg| arg == 'me' || found_names.include?(arg.delete_prefix('@')) }.map { "'#{_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?
@@ -165,6 +167,15 @@ module QuickActions
end.compact
end
+ def command_names(commands)
+ commands.flatten.map do |name|
+ definition = self.class.definition_by_name(name)
+ next unless definition
+
+ name
+ end.compact
+ end
+
def extract_updates(commands)
commands.each do |name, arg|
definition = self.class.definition_by_name(name)
diff --git a/app/services/service_ping/build_payload_service.rb b/app/services/service_ping/build_payload_service.rb
deleted file mode 100644
index f4ae939fd07..00000000000
--- a/app/services/service_ping/build_payload_service.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-# frozen_string_literal: true
-
-module ServicePing
- class BuildPayloadService
- def execute
- return {} unless allowed_to_report?
-
- raw_payload
- end
-
- private
-
- def allowed_to_report?
- product_intelligence_enabled? && !User.single_user&.requires_usage_stats_consent?
- end
-
- def product_intelligence_enabled?
- ::Gitlab::CurrentSettings.usage_ping_enabled?
- end
-
- def raw_payload
- @raw_payload ||= ::Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values)
- end
- end
-end
-
-ServicePing::BuildPayloadService.prepend_mod_with('ServicePing::BuildPayloadService')
diff --git a/app/services/service_ping/devops_report_service.rb b/app/services/service_ping/devops_report_service.rb
deleted file mode 100644
index 3b8f5dfdb82..00000000000
--- a/app/services/service_ping/devops_report_service.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module ServicePing
- class DevopsReportService
- def initialize(data)
- @data = data
- end
-
- def execute
- # `conv_index` was previously named `dev_ops_score` in
- # version-gitlab-com, so we check both for backwards compatibility.
- metrics = @data['conv_index'] || @data['dev_ops_score']
-
- # Do not attempt to save a report for the first Service Ping
- # response for a given GitLab instance, which comes without
- # metrics.
- return if metrics.keys == ['usage_data_id']
-
- report = DevOpsReport::Metric.create(
- metrics.slice(*DevOpsReport::Metric::METRICS)
- )
-
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(ActiveRecord::RecordInvalid.new(report)) unless report.persisted?
- end
- end
-end
diff --git a/app/services/service_ping/permit_data_categories_service.rb b/app/services/service_ping/permit_data_categories_service.rb
deleted file mode 100644
index d8fa255a485..00000000000
--- a/app/services/service_ping/permit_data_categories_service.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module ServicePing
- class PermitDataCategoriesService
- STANDARD_CATEGORY = 'standard'
- SUBSCRIPTION_CATEGORY = 'subscription'
- OPERATIONAL_CATEGORY = 'operational'
- OPTIONAL_CATEGORY = 'optional'
- CATEGORIES = [
- STANDARD_CATEGORY,
- SUBSCRIPTION_CATEGORY,
- OPERATIONAL_CATEGORY,
- OPTIONAL_CATEGORY
- ].to_set.freeze
-
- def execute
- return [] unless ServicePingSettings.product_intelligence_enabled?
-
- CATEGORIES
- end
- end
-end
-
-ServicePing::PermitDataCategoriesService.prepend_mod_with('ServicePing::PermitDataCategoriesService')
diff --git a/app/services/service_ping/submit_service.rb b/app/services/service_ping/submit_service.rb
index c8733bc2f11..343fc00a2f0 100644
--- a/app/services/service_ping/submit_service.rb
+++ b/app/services/service_ping/submit_service.rb
@@ -6,6 +6,7 @@ module ServicePing
STAGING_BASE_URL = 'https://gitlab-services-version-gitlab-com-staging.gs-staging.gitlab.org'
USAGE_DATA_PATH = 'usage_data'
ERROR_PATH = 'usage_ping_errors'
+ METADATA_PATH = 'usage_ping_metadata'
SubmissionError = Class.new(StandardError)
@@ -18,26 +19,27 @@ module ServicePing
start = Time.current
begin
- usage_data = BuildPayloadService.new.execute
+ usage_data = ServicePing::BuildPayload.new.execute
response = submit_usage_data_payload(usage_data)
rescue StandardError => e
return unless Gitlab::CurrentSettings.usage_ping_enabled?
error_payload = {
time: Time.current,
- uuid: Gitlab::UsageData.add_metric('UuidMetric'),
- hostname: Gitlab::UsageData.add_metric('HostnameMetric'),
- version: Gitlab::UsageData.alt_usage_data { Gitlab::VERSION },
- message: e.message,
+ uuid: Gitlab::CurrentSettings.uuid,
+ hostname: Gitlab.config.gitlab.host,
+ version: Gitlab.version_info.to_s,
+ message: "#{e.message.presence || e.class} at #{e.backtrace[0]}",
elapsed: (Time.current - start).round(1)
}
- submit_payload({ error: error_payload }, url: error_url)
+ submit_payload({ error: error_payload }, path: ERROR_PATH)
usage_data = Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values)
response = submit_usage_data_payload(usage_data)
end
- version_usage_data_id = response.dig('conv_index', 'usage_data_id') || response.dig('dev_ops_score', 'usage_data_id')
+ version_usage_data_id =
+ response.dig('conv_index', 'usage_data_id') || response.dig('dev_ops_score', 'usage_data_id')
unless version_usage_data_id.is_a?(Integer) && version_usage_data_id > 0
raise SubmissionError, "Invalid usage_data_id in response: #{version_usage_data_id}"
@@ -46,23 +48,32 @@ module ServicePing
unless @skip_db_write
raw_usage_data = save_raw_usage_data(usage_data)
raw_usage_data.update_version_metadata!(usage_data_id: version_usage_data_id)
- DevopsReportService.new(response).execute
+ ServicePing::DevopsReport.new(response).execute
end
- end
- def url
- URI.join(base_url, USAGE_DATA_PATH)
- end
+ return unless Feature.enabled?(:measure_service_ping_metric_collection)
- def error_url
- URI.join(base_url, ERROR_PATH)
+ submit_payload({ metadata: { metrics: metrics_collection_time(usage_data) } }, path: METADATA_PATH)
end
private
- def submit_payload(payload, url: self.url)
+ def metrics_collection_time(payload, parents = [])
+ return [] unless payload.is_a?(Hash)
+
+ payload.flat_map do |key, metric_value|
+ key_path = parents.dup.append(key)
+ if metric_value.respond_to?(:duration)
+ { name: key_path.join('.'), time_elapsed: metric_value.duration }
+ else
+ metrics_collection_time(metric_value, key_path)
+ end
+ end
+ end
+
+ def submit_payload(payload, path: USAGE_DATA_PATH)
Gitlab::HTTP.post(
- url,
+ URI.join(base_url, path),
body: payload.to_json,
allow_local_requests: true,
headers: { 'Content-type' => 'application/json' }
@@ -80,9 +91,13 @@ module ServicePing
end
def save_raw_usage_data(usage_data)
- RawUsageData.safe_find_or_create_by(recorded_at: usage_data[:recorded_at]) do |record|
+ # safe_find_or_create_by! was originally called here.
+ # We merely switched to `find_or_create_by!`
+ # rubocop: disable CodeReuse/ActiveRecord
+ RawUsageData.find_or_create_by(recorded_at: usage_data[:recorded_at]) do |record|
record.payload = usage_data
end
+ # rubocop: enable CodeReuse/ActiveRecord
end
# See https://gitlab.com/gitlab-org/gitlab/-/issues/233615 for details
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 9db39a5e174..d7e4b53b5de 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -111,6 +111,21 @@ module SystemNoteService
::SystemNotes::TimeTrackingService.new(noteable: noteable, project: project, author: author).change_time_spent
end
+ # Called when a timelog is removed from a Noteable
+ #
+ # noteable - Noteable object
+ # project - Project owning the noteable
+ # author - User performing the change
+ # timelog - The removed timelog
+ #
+ # Example Note text:
+ # "deleted 2h 30m of time spent from 22-03-2022"
+ #
+ # Returns the created Note object
+ def remove_timelog(noteable, project, author, timelog)
+ ::SystemNotes::TimeTrackingService.new(noteable: noteable, project: project, author: author).remove_timelog(timelog)
+ end
+
def close_after_error_tracking_resolve(issue, project, author)
::SystemNotes::IssuablesService.new(noteable: issue, project: project, author: author).close_after_error_tracking_resolve
end
@@ -351,11 +366,27 @@ module SystemNoteService
::SystemNotes::IssuablesService.new(noteable: issue, project: issue.project, author: author).change_issue_type
end
+ def add_timeline_event(timeline_event)
+ incidents_service(timeline_event.incident).add_timeline_event(timeline_event)
+ end
+
+ def edit_timeline_event(timeline_event, author, was_changed:)
+ incidents_service(timeline_event.incident).edit_timeline_event(timeline_event, author, was_changed: was_changed)
+ end
+
+ def delete_timeline_event(noteable, author)
+ incidents_service(noteable).delete_timeline_event(author)
+ end
+
private
def merge_requests_service(noteable, project, author)
::SystemNotes::MergeRequestsService.new(noteable: noteable, project: project, author: author)
end
+
+ def incidents_service(incident)
+ ::SystemNotes::IncidentsService.new(noteable: incident)
+ end
end
SystemNoteService.prepend_mod_with('SystemNoteService')
diff --git a/app/services/system_notes/incidents_service.rb b/app/services/system_notes/incidents_service.rb
new file mode 100644
index 00000000000..d5da684a2d8
--- /dev/null
+++ b/app/services/system_notes/incidents_service.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module SystemNotes
+ class IncidentsService < ::SystemNotes::BaseService
+ CHANGED_TEXT = {
+ occurred_at: 'the event time/date on ',
+ note: 'the text on ',
+ occurred_at_and_note: 'the event time/date and text on '
+ }.freeze
+
+ def initialize(noteable:)
+ @noteable = noteable
+ @project = noteable.project
+ end
+
+ 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})"
+
+ 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})"
+
+ create_note(NoteSummary.new(noteable, project, author, body, action: 'timeline_event'))
+ end
+
+ def delete_timeline_event(author)
+ body = 'deleted an incident timeline event'
+
+ create_note(NoteSummary.new(noteable, project, author, body, action: 'timeline_event'))
+ end
+ end
+end
diff --git a/app/services/system_notes/time_tracking_service.rb b/app/services/system_notes/time_tracking_service.rb
index a804a06fe4c..a9b1f6d3d37 100644
--- a/app/services/system_notes/time_tracking_service.rb
+++ b/app/services/system_notes/time_tracking_service.rb
@@ -76,6 +76,18 @@ module SystemNotes
create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
end
+ def remove_timelog(timelog)
+ time_spent = timelog.time_spent
+ spent_at = timelog.spent_at&.to_date
+
+ parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent)
+
+ body = "deleted #{parsed_time} of spent time"
+ body += " from #{spent_at}" if spent_at
+
+ create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking'))
+ end
+
private
def issue_activity_counter
diff --git a/app/services/timelogs/base_service.rb b/app/services/timelogs/base_service.rb
new file mode 100644
index 00000000000..be46c26e047
--- /dev/null
+++ b/app/services/timelogs/base_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Timelogs
+ class BaseService
+ include BaseServiceUtility
+ include Gitlab::Utils::StrongMemoize
+
+ attr_accessor :timelog, :current_user
+
+ def initialize(timelog, user)
+ @timelog = timelog
+ @current_user = user
+ end
+ end
+end
diff --git a/app/services/timelogs/delete_service.rb b/app/services/timelogs/delete_service.rb
new file mode 100644
index 00000000000..0df888a3706
--- /dev/null
+++ b/app/services/timelogs/delete_service.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+module Timelogs
+ class DeleteService < Timelogs::BaseService
+ def execute
+ unless can?(current_user, :admin_timelog, timelog)
+ return ServiceResponse.error(
+ message: "Timelog doesn't exist or you don't have permission to delete it",
+ http_status: 404)
+ end
+
+ if timelog.destroy
+ issuable = timelog.issuable
+
+ if issuable
+ # Add a system note for the timelog removal
+ SystemNoteService.remove_timelog(issuable, issuable.project, current_user, timelog)
+ end
+
+ ServiceResponse.success(payload: timelog)
+ else
+ ServiceResponse.error(message: 'Failed to remove timelog', http_status: 400)
+ end
+ end
+ end
+end
diff --git a/app/services/users/destroy_service.rb b/app/services/users/destroy_service.rb
index 1ea65049dc2..dfa9316889e 100644
--- a/app/services/users/destroy_service.rb
+++ b/app/services/users/destroy_service.rb
@@ -63,10 +63,7 @@ module Users
# destroying: https://github.com/rails/rails/issues/22510
# This ensures we delete records in batches.
user.destroy_dependent_associations_in_batches(exclude: [:snippets])
-
- if Feature.enabled?(:nullify_in_batches_on_user_deletion, default_enabled: :yaml)
- user.nullify_dependent_associations_in_batches
- end
+ user.nullify_dependent_associations_in_batches
# Destroy the namespace after destroying the user since certain methods may depend on the namespace existing
user_data = user.destroy
diff --git a/app/services/users/in_product_marketing_email_records.rb b/app/services/users/in_product_marketing_email_records.rb
new file mode 100644
index 00000000000..94dbd809496
--- /dev/null
+++ b/app/services/users/in_product_marketing_email_records.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Users
+ class InProductMarketingEmailRecords
+ attr_reader :records
+
+ def initialize
+ @records = []
+ end
+
+ def save!
+ Users::InProductMarketingEmail.bulk_insert!(@records)
+ @records = []
+ end
+
+ def add(user, campaign: nil, track: nil, series: nil)
+ @records << Users::InProductMarketingEmail.new(
+ user: user,
+ campaign: campaign,
+ track: track,
+ series: series,
+ created_at: Time.zone.now,
+ updated_at: Time.zone.now
+ )
+ end
+ end
+end
diff --git a/app/services/users/validate_manual_otp_service.rb b/app/services/users/validate_manual_otp_service.rb
new file mode 100644
index 00000000000..96a827db13c
--- /dev/null
+++ b/app/services/users/validate_manual_otp_service.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Users
+ class ValidateManualOtpService < BaseService
+ include ::Gitlab::Auth::Otp::Fortinet
+
+ def initialize(current_user)
+ @current_user = current_user
+ @strategy = if forti_authenticator_enabled?(current_user)
+ ::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp.new(current_user)
+ elsif forti_token_cloud_enabled?(current_user)
+ ::Gitlab::Auth::Otp::Strategies::FortiTokenCloud.new(current_user)
+ else
+ ::Gitlab::Auth::Otp::Strategies::Devise.new(current_user)
+ end
+ end
+
+ def execute(otp_code)
+ strategy.validate(otp_code)
+ rescue StandardError => ex
+ Gitlab::ErrorTracking.log_exception(ex)
+ error(ex.message)
+ end
+
+ private
+
+ attr_reader :strategy
+ end
+end
diff --git a/app/services/users/validate_otp_service.rb b/app/services/users/validate_otp_service.rb
deleted file mode 100644
index c8a9f217d22..00000000000
--- a/app/services/users/validate_otp_service.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-module Users
- class ValidateOtpService < BaseService
- include ::Gitlab::Auth::Otp::Fortinet
-
- def initialize(current_user)
- @current_user = current_user
- @strategy = if forti_authenticator_enabled?(current_user)
- ::Gitlab::Auth::Otp::Strategies::FortiAuthenticator.new(current_user)
- elsif forti_token_cloud_enabled?(current_user)
- ::Gitlab::Auth::Otp::Strategies::FortiTokenCloud.new(current_user)
- else
- ::Gitlab::Auth::Otp::Strategies::Devise.new(current_user)
- end
- end
-
- def execute(otp_code)
- strategy.validate(otp_code)
- rescue StandardError => ex
- Gitlab::ErrorTracking.log_exception(ex)
- error(message: ex.message)
- end
-
- private
-
- attr_reader :strategy
- end
-end
diff --git a/app/services/users/validate_push_otp_service.rb b/app/services/users/validate_push_otp_service.rb
new file mode 100644
index 00000000000..6a914cda28c
--- /dev/null
+++ b/app/services/users/validate_push_otp_service.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Users
+ class ValidatePushOtpService < BaseService
+ include ::Gitlab::Auth::Otp::Fortinet
+
+ def initialize(current_user)
+ @current_user = current_user
+ @strategy = if forti_authenticator_enabled?(current_user)
+ ::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::PushOtp.new(current_user)
+ end
+ end
+
+ def execute
+ strategy.validate
+ rescue StandardError => ex
+ Gitlab::ErrorTracking.log_exception(ex)
+ error(ex.message)
+ end
+
+ private
+
+ attr_reader :strategy
+ end
+end
diff --git a/app/services/work_items/delete_task_service.rb b/app/services/work_items/delete_task_service.rb
new file mode 100644
index 00000000000..3bb23576442
--- /dev/null
+++ b/app/services/work_items/delete_task_service.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module WorkItems
+ class DeleteTaskService
+ def initialize(work_item:, current_user: nil, task_params: {}, lock_version:)
+ @work_item = work_item
+ @current_user = current_user
+ @task_params = task_params
+ @lock_version = lock_version
+ @task = task_params[:task]
+ @errors = []
+ end
+
+ def execute
+ transaction_result = ::WorkItem.transaction do
+ replacement_result = TaskListReferenceRemovalService.new(
+ work_item: @work_item,
+ task: @task,
+ line_number_start: @task_params[:line_number_start],
+ line_number_end: @task_params[:line_number_end],
+ lock_version: @lock_version,
+ current_user: @current_user
+ ).execute
+
+ break ::ServiceResponse.error(message: replacement_result.errors, http_status: 422) if replacement_result.error?
+
+ delete_result = ::WorkItems::DeleteService.new(
+ project: @task.project,
+ current_user: @current_user
+ ).execute(@task)
+
+ if delete_result.error?
+ @errors += delete_result.errors
+ raise ActiveRecord::Rollback
+ end
+
+ delete_result
+ end
+
+ return transaction_result if transaction_result
+
+ ::ServiceResponse.error(message: @errors, http_status: 422)
+ 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
new file mode 100644
index 00000000000..e7ec73a96e0
--- /dev/null
+++ b/app/services/work_items/task_list_reference_removal_service.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module WorkItems
+ class TaskListReferenceRemovalService
+ STALE_OBJECT_MESSAGE = 'Stale work item. Check lock version'
+
+ def initialize(work_item:, task:, line_number_start:, line_number_end:, lock_version:, current_user:)
+ @work_item = work_item
+ @task = task
+ @line_number_start = line_number_start
+ @line_number_end = line_number_end
+ @lock_version = lock_version
+ @current_user = current_user
+ end
+
+ def execute
+ return ::ServiceResponse.error(message: 'line_number_start must be greater than 0') if @line_number_start < 1
+ return ::ServiceResponse.error(message: "Work item description can't be blank") if @work_item.description.blank?
+
+ if @line_number_end < @line_number_start
+ return ::ServiceResponse.error(message: 'line_number_end must be greater or equal to line_number_start')
+ end
+
+ source_lines = @work_item.description.split("\n")
+
+ 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)
+ end
+
+ unless line_matches_reference
+ return ::ServiceResponse.error(
+ message: "Unable to detect a task on lines #{@line_number_start}-#{@line_number_end}"
+ )
+ end
+
+ remove_task_lines!(source_lines)
+
+ ::WorkItems::UpdateService.new(
+ project: @work_item.project,
+ current_user: @current_user,
+ params: { description: source_lines.join("\n"), lock_version: @lock_version }
+ ).execute(@work_item)
+
+ if @work_item.valid?
+ ::ServiceResponse.success
+ else
+ ::ServiceResponse.error(message: @work_item.errors.full_messages)
+ end
+ 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/views/admin/application_settings/_account_and_limit.html.haml b/app/views/admin/application_settings/_account_and_limit.html.haml
index a0fa69c54c5..f914de138a9 100644
--- a/app/views/admin/application_settings/_account_and_limit.html.haml
+++ b/app/views/admin/application_settings/_account_and_limit.html.haml
@@ -19,6 +19,10 @@
= f.label :receive_max_input_size, _('Maximum push size (MB)'), class: 'label-light'
= f.number_field :receive_max_input_size, class: 'form-control gl-form-input qa-receive-max-input-size-field', title: _('Maximum size limit for a single commit.'), data: { toggle: 'tooltip', container: 'body' }
.form-group
+ = f.label :max_export_size, _('Maximum export size (MB)'), class: 'label-light'
+ = f.number_field :max_export_size, class: 'form-control gl-form-input', title: _('Maximum size of export files.'), data: { toggle: 'tooltip', container: 'body' }
+ %span.form-text.text-muted= _('Set to 0 for no size limit.')
+ .form-group
= f.label :max_import_size, _('Maximum import size (MB)'), class: 'label-light'
= f.number_field :max_import_size, class: 'form-control gl-form-input qa-receive-max-import-size-field', title: _('Maximum size of import files.'), data: { toggle: 'tooltip', container: 'body' }
%span.form-text.text-muted= _('Only effective when remote storage is enabled. Set to 0 for no size limit.')
@@ -29,9 +33,7 @@
= render_if_exists 'admin/application_settings/git_two_factor_session_expiry', form: f
= render_if_exists 'admin/application_settings/personal_access_token_expiration_policy', form: f
- = render_if_exists 'admin/application_settings/enforce_pat_expiration', form: f
= render_if_exists 'admin/application_settings/ssh_key_expiration_policy', form: f
- = render_if_exists 'admin/application_settings/enforce_ssh_key_expiration', form: f
.form-group
= f.label :user_oauth_applications, _('User OAuth applications'), class: 'label-bold'
diff --git a/app/views/admin/application_settings/_issue_limits.html.haml b/app/views/admin/application_settings/_issue_limits.html.haml
index 663e1485749..431e2a64c46 100644
--- a/app/views/admin/application_settings/_issue_limits.html.haml
+++ b/app/views/admin/application_settings/_issue_limits.html.haml
@@ -1,9 +1,9 @@
-= form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-issue-limits-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-issue-limits-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- = f.label :issues_create_limit, 'Max requests per minute per user', class: 'label-bold'
+ = f.label :issues_create_limit, _('Maximum number of requests per minute')
= f.number_field :issues_create_limit, class: 'form-control gl-form-input'
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_note_limits.html.haml b/app/views/admin/application_settings/_note_limits.html.haml
index d4ae0d3944c..40760b3c45e 100644
--- a/app/views/admin/application_settings/_note_limits.html.haml
+++ b/app/views/admin/application_settings/_note_limits.html.haml
@@ -9,7 +9,7 @@
= f.label :notes_create_limit_allowlist, _('Users to exclude from the rate limit'), class: 'label-bold'
= f.text_area :notes_create_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'note-create-limits-allowlist-field-description' }
.form-text.text-muted{ id: 'note-create-limits-allowlist-field-description' }
- = _('List of users allowed to exceed the rate limit.')
+ = _('List of users who are allowed to exceed the rate limit. Example: username1, username2')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_pipeline_limits.html.haml b/app/views/admin/application_settings/_pipeline_limits.html.haml
new file mode 100644
index 00000000000..e93823172db
--- /dev/null
+++ b/app/views/admin/application_settings/_pipeline_limits.html.haml
@@ -0,0 +1,9 @@
+= gitlab_ui_form_for @application_setting, url: network_admin_application_settings_path(anchor: 'js-pipeline-limits-settings'), html: { class: 'fieldset-form' } do |f|
+ = form_errors(@application_setting)
+
+ %fieldset
+ .form-group
+ = f.label :pipeline_limit_per_project_user_sha, _('Maximum number of requests per minute')
+ = f.number_field :pipeline_limit_per_project_user_sha, class: 'form-control gl-form-input'
+
+ = f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/admin/application_settings/_prometheus.html.haml b/app/views/admin/application_settings/_prometheus.html.haml
index 11830fac336..59681c0278e 100644
--- a/app/views/admin/application_settings/_prometheus.html.haml
+++ b/app/views/admin/application_settings/_prometheus.html.haml
@@ -1,20 +1,17 @@
-= form_for @application_setting, url: metrics_and_profiling_admin_application_settings_path(anchor: 'js-prometheus-settings'), html: { class: 'fieldset-form' } do |f|
+= 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)
%fieldset
.form-group
- .form-check
- = f.check_box :prometheus_metrics_enabled, class: 'form-check-input'
- = f.label :prometheus_metrics_enabled, class: 'form-check-label' do
- = _("Enable health and performance metrics endpoint")
- .form-text.text-muted
- = _('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_to _('Learn More.'), help_page_path('administration/monitoring/prometheus/gitlab_metrics.md'), target: '_blank', rel: 'noopener noreferrer'
+ - prometheus_help_link_url = help_page_path('administration/monitoring/prometheus/gitlab_metrics')
+ - prometheus_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: prometheus_help_link_url }
+ = f.gitlab_ui_checkbox_component :prometheus_metrics_enabled,
+ _('Enable health and performance metrics endpoint'),
+ help_text: s_('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}').html_safe % { link_start: prometheus_help_link_start, link_end: '</a>'.html_safe }
+ .form-text.gl-text-gray-500.gl-pl-6
- unless Gitlab::Metrics.metrics_folder_present?
- .form-text.text-muted
- %strong.cred= _("WARNING:")
- = _("Environment variable %{environment_variable} does not exist or is not pointing to a valid directory.").html_safe % { environment_variable: '<code>prometheus_multiproc_dir</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory')
+ - icon_link = link_to sprite_icon('question-o'), help_page_path('administration/monitoring/prometheus/gitlab_metrics', anchor: 'metrics-shared-directory'), target: '_blank', rel: 'noopener noreferrer'
+ = s_('AdminSettings|%{strongStart}WARNING:%{strongEnd} Environment variable %{environment_variable} does not exist or is not pointing to a valid directory. %{icon_link}').html_safe % { strongStart: '<strong class="gl-text-red-500">'.html_safe, strongEnd: '</strong>'.html_safe, environment_variable: '<code>prometheus_multiproc_dir</code>'.html_safe, icon_link: icon_link }
.form-group
= f.label :metrics_method_call_threshold, _('Method call threshold (ms)'), class: 'label-bold'
= f.number_field :metrics_method_call_threshold, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml
index eb1f94a2f04..856db32e088 100644
--- a/app/views/admin/application_settings/_registry.html.haml
+++ b/app/views/admin/application_settings/_registry.html.haml
@@ -13,7 +13,6 @@
= f.gitlab_ui_checkbox_component :container_expiration_policies_enable_historic_entries,
'%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
- - if container_registry_expiration_policies_throttling?
.form-group
= f.label :container_registry_delete_tags_service_timeout, _('Cleanup policy maximum processing time (seconds)'), class: 'label-bold'
= f.number_field :container_registry_delete_tags_service_timeout, min: 0, class: 'form-control gl-form-input'
diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml
index 62a90e173ec..b5fa08aed79 100644
--- a/app/views/admin/application_settings/_repository_storage.html.haml
+++ b/app/views/admin/application_settings/_repository_storage.html.haml
@@ -1,16 +1,16 @@
-= form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-storage-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-storage-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
.sub-section
%h4= _('Hashed repository storage paths')
.form-group
- .form-check
- = f.check_box :hashed_storage_enabled, class: 'form-check-input qa-hashed-storage-checkbox', disabled: @application_setting.hashed_storage_enabled?
- = f.label :hashed_storage_enabled, _('Use hashed storage'), class: 'label-bold form-check-label'
- .form-text.text-muted
- = _('Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0.')
- = link_to s_('Learn more.'), help_page_path('administration/repository_storage_types.md', anchor: 'hashed-storage'), target: '_blank', rel: 'noopener noreferrer'
+ - repository_storage_help_link_url = help_page_path('administration/repository_storage_types.md')
+ - repository_storage_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: repository_storage_help_link_url }
+ = f.gitlab_ui_checkbox_component :hashed_storage_enabled,
+ _('Use hashed storage'),
+ checkbox_options: { disabled: @application_setting.hashed_storage_enabled? },
+ help_text: _('Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0. %{link_start}Learn more.%{link_end}').html_safe % { link_start: repository_storage_help_link_start, link_end: '</a>'.html_safe }
.sub-section
%h4= _("Storage nodes for new repositories")
diff --git a/app/views/admin/application_settings/_runner_registrars_form.html.haml b/app/views/admin/application_settings/_runner_registrars_form.html.haml
index 08b3d173d20..1d6051a06ea 100644
--- a/app/views/admin/application_settings/_runner_registrars_form.html.haml
+++ b/app/views/admin/application_settings/_runner_registrars_form.html.haml
@@ -1,16 +1,16 @@
-= form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-runner-settings'), html: { class: 'fieldset-form' } do |f|
+= gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-runner-settings'), html: { class: 'fieldset-form' } do |f|
= form_errors(@application_setting)
%fieldset
- .form-group
- = hidden_field_tag "application_setting[valid_runner_registrars][]", nil
- - ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES.each do |type|
- .form-check
- = f.check_box(:valid_runner_registrars, { multiple: true, checked: valid_runner_registrars.include?(type), class: 'form-check-input' }, type, nil)
- = f.label :valid_runner_registrars, class: 'form-check-label' do
- = s_("Runners|Members of the %{type} can register runners") % { type: type }
- %span.form-text.gl-text-gray-600
+ .gl-form-group
+ %span.form-text.gl-mb-3.gl-mt-0
= _('If no options are selected, only administrators can register runners.')
= link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'prevent-users-from-registering-runners'), target: '_blank', rel: 'noopener noreferrer'
+ = hidden_field_tag "application_setting[valid_runner_registrars][]", nil
+ - ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES.each do |type|
+ = f.gitlab_ui_checkbox_component :valid_runner_registrars, s_("Runners|Members of the %{type} can register runners") % { type: type },
+ checkbox_options: { multiple: true, checked: valid_runner_registrars.include?(type) },
+ checked_value: type,
+ unchecked_value: nil
= f.submit _('Save changes'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml
index bce210d28d3..48f0b9b2c31 100644
--- a/app/views/admin/application_settings/_signin.html.haml
+++ b/app/views/admin/application_settings/_signin.html.haml
@@ -1,39 +1,28 @@
-= form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-signin-settings'), html: { class: 'fieldset-form', id: 'signin-settings' } do |f|
+= gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-signin-settings'), html: { class: 'fieldset-form', id: 'signin-settings' } do |f|
= form_errors(@application_setting)
%fieldset
.form-group
- .form-check
- = f.check_box :password_authentication_enabled_for_web, class: 'form-check-input'
- = f.label :password_authentication_enabled_for_web, class: 'form-check-label' do
- = _('Allow password authentication for the web interface')
- .form-text.text-muted
- = _('Clear this checkbox to use an external authentication provider instead.')
+ = f.gitlab_ui_checkbox_component :password_authentication_enabled_for_web,
+ _('Allow password authentication for the web interface'),
+ help_text: _('Clear this checkbox to use an external authentication provider instead.')
.form-group
- .form-check
- = f.check_box :password_authentication_enabled_for_git, class: 'form-check-input'
- = f.label :password_authentication_enabled_for_git, class: 'form-check-label' do
- = _('Allow password authentication for Git over HTTP(S)')
- .form-text.text-muted
- - if Gitlab::Auth::Ldap::Config.enabled?
- = _('Clear this checkbox to use a personal access token or LDAP password instead.')
- - else
- = _('Clear this checkbox to use a personal access token instead.')
+ = f.gitlab_ui_checkbox_component :password_authentication_enabled_for_git,
+ _('Allow password authentication for Git over HTTP(S)'),
+ help_text: Gitlab::Auth::Ldap::Config.enabled? ? _('Clear this checkbox to use a personal access token or LDAP password instead.') : _('Clear this checkbox to use a personal access token instead.')
- if omniauth_enabled? && button_based_providers.any?
%fieldset.form-group
%legend.gl-font-base.gl-mb-3.gl-border-none.gl-font-weight-bold= _('Enabled OAuth authentication sources')
= hidden_field_tag 'application_setting[enabled_oauth_sign_in_sources][]'
- - oauth_providers_checkboxes.each do |source|
+ - oauth_providers_checkboxes(f).each do |source|
= source
.form-group
= f.label :two_factor_authentication, _('Two-factor authentication'), class: 'label-bold'
- .form-check
- = f.check_box :require_two_factor_authentication, class: 'form-check-input'
- = f.label :require_two_factor_authentication, class: 'form-check-label' do
- = _('Enforce two-factor authentication')
- %p.form-text.text-muted
- = _('Enforce two-factor authentication for all user sign-ins.')
- = link_to _('Learn more.'), help_page_path('security/two_factor_authentication.md'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Enforce two-factor authentication for all user sign-ins.')
+ - help_link = link_to _('Learn more.'), help_page_path('security/two_factor_authentication.md'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :require_two_factor_authentication,
+ _('Enforce two-factor authentication'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :two_factor_authentication, _('Two-factor grace period'), class: 'label-bold'
= f.number_field :two_factor_grace_period, min: 0, class: 'form-control gl-form-input', placeholder: '0'
@@ -42,22 +31,18 @@
.form-group
= f.label :admin_mode, _('Admin Mode'), class: 'label-bold'
= sprite_icon('lock', css_class: 'gl-icon')
- .form-check
- = f.check_box :admin_mode, class: 'form-check-input'
- = f.label :admin_mode, class: 'form-check-label' do
- = _('Enable admin mode')
- %p.form-text.text-muted
- = _('Require additional authentication for administrative tasks.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/sign_in_restrictions', anchor: 'admin-mode'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Require additional authentication for administrative tasks.')
+ - help_link = link_to _('Learn more.'), help_page_path('user/admin_area/settings/sign_in_restrictions', anchor: 'admin-mode'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :admin_mode,
+ _('Enable admin mode'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :unknown_sign_in, _('Email notification for unknown sign-ins'), class: 'label-bold'
- .form-check
- = f.check_box :notify_on_unknown_sign_in, class: 'form-check-input'
- = f.label :notify_on_unknown_sign_in, class: 'form-check-label' do
- = _('Enable email notification')
- %p.form-text.text-muted
- = _('Notify users by email when sign-in location is not recognized.')
- = link_to _('Learn more.'), help_page_path('user/profile/unknown_sign_in_notification.md'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _('Notify users by email when sign-in location is not recognized.')
+ - help_link = link_to _('Learn more.'), help_page_path('user/profile/unknown_sign_in_notification.md'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :notify_on_unknown_sign_in,
+ _('Enable email notification'),
+ help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
.form-group
= f.label :home_page_url, _('Home page URL'), class: 'label-bold'
= f.text_field :home_page_url, class: 'form-control gl-form-input', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block'
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index a1285a3f467..8b4ac9b79c8 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -13,7 +13,7 @@
.form-group
- can_be_configured = @application_setting.usage_ping_can_be_configured?
- service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index') }
- - deactivating_service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index', anchor: 'disable-service-ping-using-the-configuration-file') }
+ - deactivating_service_ping_link_start = link_start % { url: help_page_path('user/admin_area/settings/usage_statistics', anchor: 'disable-usage-statistics-with-the-configuration-file') }
- usage_ping_help_text = s_('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}').html_safe % { link_start: service_ping_link_start, link_end: link_end }
- disabled_help_text = s_('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}.').html_safe % { link_start: deactivating_service_ping_link_start, link_end: link_end }
= f.gitlab_ui_checkbox_component :usage_ping_enabled, s_('AdminSettings|Enable Service Ping'),
@@ -28,7 +28,7 @@
.form-group
- usage_ping_enabled = @application_setting.usage_ping_enabled?
- label = s_('AdminSettings|Enable Registration Features')
- - label_link = link_to sprite_icon('question-o'), help_page_path('development/service_ping/index', anchor: 'registration-features-program')
+ - label_link = link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/usage_statistics', anchor: 'registration-features-program')
- help_text = usage_ping_enabled ? s_('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.') : s_('AdminSettings|To enable Registration Features, first enable Service Ping.')
= f.gitlab_ui_checkbox_component :usage_ping_features_enabled?, '%{label} %{label_link}'.html_safe % { label: label, label_link: label_link },
help_text: '<span id="service_ping_features_helper_text">%{help_text}</span>'.html_safe % { help_text: help_text },
diff --git a/app/views/admin/application_settings/_users_api_limits.html.haml b/app/views/admin/application_settings/_users_api_limits.html.haml
index 9b3502b3cfd..3918c76b12c 100644
--- a/app/views/admin/application_settings/_users_api_limits.html.haml
+++ b/app/views/admin/application_settings/_users_api_limits.html.haml
@@ -9,6 +9,6 @@
= f.label :users_get_by_id_limit_allowlist_raw, _('Users to exclude from the rate limit'), class: 'label-bold'
= f.text_area :users_get_by_id_limit_allowlist_raw, class: 'form-control gl-form-input', rows: 5, aria: { describedBy: 'users-api-limit-users-allowlist-field-description' }
.form-text.text-muted{ id: 'users-api-limit-users-allowlist-field-description' }
- = _('List of users allowed to exceed the rate limit.')
+ = _('List of users who are allowed to exceed the rate limit. Example: username1, username2')
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
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 23649bc2d54..e3c044ff979 100644
--- a/app/views/admin/application_settings/_visibility_and_access.html.haml
+++ b/app/views/admin/application_settings/_visibility_and_access.html.haml
@@ -16,29 +16,30 @@
= f.label :default_group_visibility, class: 'label-bold'
= render('shared/visibility_radios', model_method: :default_group_visibility, form: f, selected_level: @application_setting.default_group_visibility, form_model: Group.new)
.form-group
- = f.label :restricted_visibility_levels, class: 'label-bold'
+ = f.label :restricted_visibility_levels, class: 'label-bold gl-mb-0'
+ %span.form-text.gl-mt-0.gl-mb-3#restricted-visibility-help
+ = _('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.')
= hidden_field_tag 'application_setting[restricted_visibility_levels][]'
- restricted_level_checkboxes(f).each do |level|
= level
- %span.form-text.text-muted#restricted-visibility-help
- = _('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.')
.form-group
- = f.label :import_sources, class: 'label-bold'
- = hidden_field_tag 'application_setting[import_sources][]'
- - import_sources_checkboxes(f).each do |source|
- = source
- %span.form-text.text-muted#import-sources-help
+ = 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')
= link_to sprite_icon('question-o'), help_page_path("integration/github")
, Bitbucket
= link_to sprite_icon('question-o'), help_page_path("integration/bitbucket")
and GitLab.com
= link_to sprite_icon('question-o'), help_page_path("integration/gitlab")
+ = hidden_field_tag 'application_setting[import_sources][]'
+ - import_sources_checkboxes(f).each do |source|
+ = source
= render_if_exists 'admin/application_settings/ldap_access_setting', form: f
.form-group
- = f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Project export enabled')
+ = f.label :project_export, s_('AdminSettings|Project export'), class: 'label-bold'
+ = f.gitlab_ui_checkbox_component :project_export_enabled, s_('AdminSettings|Enabled')
.form-group
%label.label-bold= _('Enabled Git access protocols')
diff --git a/app/views/admin/application_settings/ci/_header.html.haml b/app/views/admin/application_settings/ci/_header.html.haml
index 1298be9a6cb..a22e67b0522 100644
--- a/app/views/admin/application_settings/ci/_header.html.haml
+++ b/app/views/admin/application_settings/ci/_header.html.haml
@@ -13,7 +13,7 @@
= _('Variables can be:')
%ul
%li
- = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/admin/application_settings/ci_cd.html.haml b/app/views/admin/application_settings/ci_cd.html.haml
index aab4f44d4d7..e925175b7ea 100644
--- a/app/views/admin/application_settings/ci_cd.html.haml
+++ b/app/views/admin/application_settings/ci_cd.html.haml
@@ -8,7 +8,7 @@
.settings-content
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') }
= s_('Environment variables on this GitLab instance are configured to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
#js-instance-variables{ data: { endpoint: admin_ci_variables_path, group: 'true', maskable_regex: ci_variable_maskable_regex, protected_by_default: ci_variable_protected_by_default?.to_s} }
@@ -38,7 +38,7 @@
.settings-content
= render 'registry'
-- if Feature.enabled?(:runner_registration_control, default_enabled: :yaml)
+- if Feature.enabled?(:runner_registration_control)
%section.settings.as-runner.no-animate#js-runner-settings{ class: ('expanded' if expanded_by_default?) }
.settings-header
%h4
diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml
index bc2fedec69c..7643f8fa7a7 100644
--- a/app/views/admin/application_settings/general.html.haml
+++ b/app/views/admin/application_settings/general.html.haml
@@ -93,7 +93,7 @@
%p
= _('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|
+ = 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)
%fieldset
@@ -115,4 +115,4 @@
= render 'admin/application_settings/snowplow'
= render 'admin/application_settings/eks'
= render 'admin/application_settings/floc'
-= render_if_exists 'admin/application_settings/license_file'
+= 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 7cb5760f62a..8e4b0b53f28 100644
--- a/app/views/admin/application_settings/metrics_and_profiling.html.haml
+++ b/app/views/admin/application_settings/metrics_and_profiling.html.haml
@@ -53,9 +53,7 @@
.settings-content
= render 'usage'
-= render_if_exists 'admin/application_settings/pseudonymizer_settings', expanded: expanded_by_default?
-
-- if Feature.enabled?(:configure_sentry_in_application_settings, default_enabled: :yaml)
+- 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
diff --git a/app/views/admin/application_settings/network.html.haml b/app/views/admin/application_settings/network.html.haml
index ea35b7ab9c4..a2497fe122b 100644
--- a/app/views/admin/application_settings/network.html.haml
+++ b/app/views/admin/application_settings/network.html.haml
@@ -157,4 +157,16 @@
.settings-content
= render 'import_export_limits'
+%section.settings.as-pipeline-limits.no-animate#js-pipeline-limits-settings{ class: ('expanded' if expanded_by_default?) }
+ .settings-header
+ %h4
+ = _('Pipeline creation rate limits')
+ %button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
+ = expanded_by_default? ? _('Collapse') : _('Expand')
+ %p
+ = _('Limit the number of pipeline creation requests per minute. This limit includes pipelines created through the UI, the API, and by background processing.')
+ = link_to _('Learn more.'), help_page_path('user/admin_area/settings/rate_limit_on_pipelines_creation.md'), target: '_blank', rel: 'noopener noreferrer'
+ .settings-content
+ = render 'pipeline_limits'
+
= render_if_exists 'admin/application_settings/ee_network_settings'
diff --git a/app/views/admin/application_settings/service_usage_data.html.haml b/app/views/admin/application_settings/service_usage_data.html.haml
index ec084c05cf7..55c25ca32d5 100644
--- a/app/views/admin/application_settings/service_usage_data.html.haml
+++ b/app/views/admin/application_settings/service_usage_data.html.haml
@@ -18,9 +18,9 @@
- else
= render Pajamas::AlertComponent.new(variant: :warning,
dismissible: false,
- title: _('Service Ping payload not found in the application cache')) do
+ title: _('Service Ping payload not found in the application cache')) do |c|
- .gl-alert-body
+ = c.body do
- enable_service_ping_link_url = help_page_path('user/admin_area/settings/usage_statistics', anchor: 'enable-or-disable-usage-statistics')
- enable_service_ping_link = '<a href="%{url}">'.html_safe % { url: enable_service_ping_link_url }
- generate_manually_link_url = help_page_path('administration/troubleshooting/gitlab_rails_cheat_sheet', anchor: 'generate-service-ping')
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
index 925b3681298..fd73d4c5671 100644
--- a/app/views/admin/applications/_form.html.haml
+++ b/app/views/admin/applications/_form.html.haml
@@ -21,25 +21,13 @@
.col-sm-2.col-form-label.pt-0
= f.label :trusted
.col-sm-10
- = f.check_box :trusted
- %span.form-text.text-muted
- 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.
+ = f.gitlab_ui_checkbox_component :trusted, _('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.')
= content_tag :div, class: 'form-group row' do
.col-sm-2.col-form-label.pt-0
= f.label :confidential
.col-sm-10
- = f.check_box :confidential
- %span.form-text.text-muted
- = _('The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential.')
-
- = content_tag :div, class: 'form-group row' do
- .col-sm-2.col-form-label.pt-0
- = f.label :expire_access_tokens
- .col-sm-10
- = f.check_box :expire_access_tokens
- %span.form-text.text-muted
- = _('Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility.')
+ = f.gitlab_ui_checkbox_component :confidential, _('The application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are considered non-confidential.')
.form-group.row
.col-sm-2.col-form-label.pt-0
diff --git a/app/views/admin/background_migrations/_job.html.haml b/app/views/admin/background_migrations/_job.html.haml
new file mode 100644
index 00000000000..e34f73e8b94
--- /dev/null
+++ b/app/views/admin/background_migrations/_job.html.haml
@@ -0,0 +1,10 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = link_to admin_background_migration_batched_job_path(job.batched_migration, job, params: { database: params[:database] }) do
+ = job.id
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Started at') } }
+ = job.started_at
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Finished at') } }
+ = job.finished_at
+ %td{ role: 'cell', data: { label: s_('BackgroundMigrations|Batch size') } }
+ = job.batch_size
diff --git a/app/views/admin/background_migrations/_migration.html.haml b/app/views/admin/background_migrations/_migration.html.haml
index 9cef8332259..f4906028e39 100644
--- a/app/views/admin/background_migrations/_migration.html.haml
+++ b/app/views/admin/background_migrations/_migration.html.haml
@@ -1,5 +1,7 @@
%tr{ role: 'row' }
- %td{ role: 'cell', data: { label: _('Migration') } }= migration.job_class_name + ': ' + migration.table_name
+ %td{ role: 'cell', data: { label: _('Migration') } }
+ = link_to admin_background_migration_path(migration, database: params[:database]) do
+ = migration.job_class_name + ': ' + migration.table_name
%td{ role: 'cell', data: { label: _('Progress') } }
- progress = batched_migration_progress(migration, @successful_rows_counts[migration.id])
- if progress
@@ -10,14 +12,14 @@
= gl_badge_tag migration.status_name.to_s.humanize, { size: :sm, variant: batched_migration_status_badge_variant(migration) }
%td{ role: 'cell', data: { label: _('Action') } }
- if migration.active?
- = button_to pause_admin_background_migration_path(migration),
+ = button_to pause_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Pause'), 'aria-label' => _('Pause') do
= sprite_icon('pause', css_class: 'gl-button-icon gl-icon')
- elsif migration.paused?
- = button_to resume_admin_background_migration_path(migration),
+ = button_to resume_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Resume'), 'aria-label' => _('Resume') do
= sprite_icon('play', css_class: 'gl-button-icon gl-icon')
- elsif migration.failed?
- = button_to retry_admin_background_migration_path(migration),
+ = button_to retry_admin_background_migration_path(migration, database: params[:database]),
class: 'gl-button btn btn-icon has-tooltip', title: _('Retry'), 'aria-label' => _('Retry') do
= sprite_icon('retry', css_class: 'gl-button-icon gl-icon')
diff --git a/app/views/admin/background_migrations/_migration_full_information.html.haml b/app/views/admin/background_migrations/_migration_full_information.html.haml
new file mode 100644
index 00000000000..620274c375f
--- /dev/null
+++ b/app/views/admin/background_migrations/_migration_full_information.html.haml
@@ -0,0 +1,21 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = @migration.id
+ %td{ role: 'cell', data: { label: _('Min Value') } }
+ = @migration.min_value
+ %td{ role: 'cell', data: { label: _('Max Value') } }
+ = @migration.max_value
+ %td{ role: 'cell', data: { label: _('Batch size') } }
+ = @migration.batch_size
+ %td{ role: 'cell', data: { label: _('Sub-batch size') } }
+ = @migration.sub_batch_size
+ %td{ role: 'cell', data: { label: _('Interval') } }
+ = @migration.interval
+ %td{ role: 'cell', data: { label: _('Pause time (ms)') } }
+ = @migration.pause_ms
+ %td{ role: 'cell', data: { label: _('Created on') } }
+ = @migration.created_at
+ %td{ role: 'cell', data: { label: _('Last updated') } }
+ = @migration.updated_at
+ %td{ role: 'cell', data: { label: _('Status') } }
+ = gl_badge_tag @migration.status_name.to_s.humanize, { size: :sm, variant: batched_migration_status_badge_variant(@migration) }
diff --git a/app/views/admin/background_migrations/index.html.haml b/app/views/admin/background_migrations/index.html.haml
index afceb6427e0..c8b195219ec 100644
--- a/app/views/admin/background_migrations/index.html.haml
+++ b/app/views/admin/background_migrations/index.html.haml
@@ -1,13 +1,26 @@
-- page_title _('Background Migrations')
+- page_title s_('BackgroundMigrations|Background Migrations')
+- @breadcrumb_link = admin_background_migrations_path(database: params[:database])
+
+.gl-display-flex.gl-sm-flex-direction-column.gl-sm-align-items-flex-end.gl-pb-5.gl-border-b-1.gl-border-b-solid.gl-border-b-gray-100
+ .gl-flex-grow-1
+ %h3= s_('BackgroundMigrations|Background Migrations')
+ %p.light.gl-mb-0
+ - learnmore_link = help_page_path('development/database/batched_background_migrations')
+ - learnmore_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: learnmore_link }
+ = html_escape(s_('BackgroundMigrations|Background migrations are used to perform data migrations whenever a migration exceeds the time limits in our guidelines. %{linkStart}Learn more%{linkEnd}')) % { linkStart: learnmore_link_start, linkEnd: '</a>'.html_safe }
+
+ - if @databases.size > 1
+ .gl-display-flex.gl-align-items-center.gl-flex-grow-0.gl-flex-basis-0.gl-sm-mt-0.gl-mt-5.gl-sm-ml-7.gl-ml-0
+ #js-database-listbox{ data: { databases: @databases, selected_database: @selected_database } }
= gl_tabs_nav do
- = gl_tab_link_to admin_background_migrations_path, item_active: @current_tab == 'queued' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: nil, database: params[:database] }), item_active: @current_tab == 'queued' do
= _('Queued')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['queued'])
- = gl_tab_link_to admin_background_migrations_path(tab: 'failed'), item_active: @current_tab == 'failed' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: 'failed', database: params[:database] }), item_active: @current_tab == 'failed' do
= _('Failed')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['failed'])
- = gl_tab_link_to admin_background_migrations_path(tab: 'finished'), item_active: @current_tab == 'finished' do
+ = gl_tab_link_to admin_background_migrations_path({ tab: 'finished', database: params[:database] }), item_active: @current_tab == 'finished' do
= _('Finished')
= gl_tab_counter_badge limited_counter_with_delimiter(@relations_by_tab['finished'])
@@ -16,10 +29,10 @@
%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
%thead{ role: 'rowgroup' }
%tr{ role: 'row' }
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Migration')
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Progress')
- %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
- %th.table-th-transparent.border-bottom{ role: 'cell' }
+ %th.border-bottom{ role: 'cell' }= _('Migration')
+ %th.border-bottom{ role: 'cell' }= _('Progress')
+ %th.border-bottom{ role: 'cell' }= _('Status')
+ %th.border-bottom{ role: 'cell' }
%tbody{ role: 'rowgroup' }
= render partial: 'migration', collection: @migrations
diff --git a/app/views/admin/background_migrations/show.html.haml b/app/views/admin/background_migrations/show.html.haml
new file mode 100644
index 00000000000..7915a9d36dc
--- /dev/null
+++ b/app/views/admin/background_migrations/show.html.haml
@@ -0,0 +1,39 @@
+- add_to_breadcrumbs s_('BackgroundMigrations|Background Migrations'), admin_background_migrations_path(database: params[:database])
+- breadcrumb_title @migration.id
+- page_title @migration.job_class_name , s_('BackgroundMigrations|Background Migrations')
+- @breadcrumb_link = admin_background_migration_path(@migration, database: params[:database])
+
+%h3= @migration.job_class_name + ': ' + @migration.table_name
+
+.tab-content.gl-tab-content
+ .tab-pane.active{ role: 'tabpanel' }
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Id')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Min Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Max Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Sub-batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Interval')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Pause time (ms)')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Created on')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Last updated')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Status')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'migration_full_information', migration: @migration
+
+- if @migration.batched_jobs.with_status(:failed).any?
+ %h5= s_('BackgroundMigrations|Failed jobs:')
+
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th{ role: 'cell' }= _('Id')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Started at')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Finished at')
+ %th{ role: 'cell' }= s_('BackgroundMigrations|Batch size')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'job', collection: @failed_jobs
+
+ = paginate_collection @failed_jobs
diff --git a/app/views/admin/batched_jobs/_job.html.haml b/app/views/admin/batched_jobs/_job.html.haml
new file mode 100644
index 00000000000..512f4062ccf
--- /dev/null
+++ b/app/views/admin/batched_jobs/_job.html.haml
@@ -0,0 +1,17 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = @job.id
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Min value') } }
+ = @job.min_value
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Max value') } }
+ = @job.max_value
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Batch size') } }
+ = @job.batch_size
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Started at') } }
+ = @job.started_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Finished at') } }
+ = @job.finished_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Attempts') } }
+ = @job.attempts
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Pause ms') } }
+ = @job.pause_ms
diff --git a/app/views/admin/batched_jobs/_transition_log.html.haml b/app/views/admin/batched_jobs/_transition_log.html.haml
new file mode 100644
index 00000000000..bd81be4679a
--- /dev/null
+++ b/app/views/admin/batched_jobs/_transition_log.html.haml
@@ -0,0 +1,13 @@
+%tr{ role: 'row' }
+ %td{ role: 'cell', data: { label: _('Id') } }
+ = transition_log.id
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Created at') } }
+ = transition_log.created_at
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Previous status') } }
+ = transition_log.previous_status
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Next status') } }
+ = transition_log.next_status
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Exception class') } }
+ = transition_log.exception_class
+ %td{ role: 'cell', data: { label: s_('BatchedJob|Exception message') } }
+ = transition_log.exception_message
diff --git a/app/views/admin/batched_jobs/show.html.haml b/app/views/admin/batched_jobs/show.html.haml
new file mode 100644
index 00000000000..760635413a5
--- /dev/null
+++ b/app/views/admin/batched_jobs/show.html.haml
@@ -0,0 +1,36 @@
+- add_to_breadcrumbs s_('Batched Job|Background Migrations'), admin_background_migrations_path(database: params[:database])
+- add_to_breadcrumbs @job.batched_background_migration_id, admin_background_migration_path(@job.batched_migration, database: params[:database])
+- breadcrumb_title sprintf(s_('Batched Job|Batched Job (Id: %{id})'), { id: @job.id.to_s})
+- page_title @job.id, s_('BatchedJob|Batched Jobs')
+- @breadcrumb_link = admin_background_migration_batched_job_path(@job.batched_migration, @job, database: params[:database])
+
+%h3= sprintf(s_('Batched Job|Batched Job (Id: %{id})'), { id: @job.id.to_s})
+
+%table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= _('Id')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Min Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Max Value')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Batch size')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Started at')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Finished at')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Attempts')
+ %th.table-th-transparent.border-bottom{ role: 'cell' }= s_('BatchedJob|Pause time (ms)')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'job', job: @job
+
+- if @transition_logs.any?
+ %h5= s_('BatchedJob|Transition logs:')
+
+ %table.table.b-table.gl-table.b-table-stacked-md{ role: 'table' }
+ %thead{ role: 'rowgroup' }
+ %tr{ role: 'row' }
+ %th{ role: 'cell' }= _('Id')
+ %th{ role: 'cell' }= s_('BatchedJob|Created At')
+ %th{ role: 'cell' }= s_('BatchedJob|Previous Status')
+ %th{ role: 'cell' }= s_('BatchedJob|Next Status')
+ %th{ role: 'cell' }= s_('BatchedJob|Exception Class')
+ %th{ role: 'cell' }= s_('BatchedJob|Exception Message')
+ %tbody{ role: 'rowgroup' }
+ = render partial: 'transition_log', collection: @transition_logs
diff --git a/app/views/admin/broadcast_messages/_form.html.haml b/app/views/admin/broadcast_messages/_form.html.haml
index 4102918931f..dfd3b87c674 100644
--- a/app/views/admin/broadcast_messages/_form.html.haml
+++ b/app/views/admin/broadcast_messages/_form.html.haml
@@ -29,7 +29,7 @@
= f.label :starts_at, _("Dismissable")
.col-sm-10
= f.gitlab_ui_checkbox_component :dismissable, _('Allow users to dismiss the broadcast message')
- - if Feature.enabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+ - if Feature.enabled?(:role_targeted_broadcast_messages)
.form-group.row
.col-sm-2.col-form-label
= f.label :target_access_levels, _('Target roles')
diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml
index 54c2a9d5250..8b657eda0c0 100644
--- a/app/views/admin/broadcast_messages/index.html.haml
+++ b/app/views/admin/broadcast_messages/index.html.haml
@@ -1,6 +1,6 @@
- breadcrumb_title _("Messages")
- page_title _("Broadcast Messages")
-- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages, default_enabled: :yaml)
+- targeted_broadcast_messages_enabled = Feature.enabled?(:role_targeted_broadcast_messages)
%h3.page-title
= _('Broadcast Messages')
diff --git a/app/views/admin/dashboard/_security_newsletter_callout.html.haml b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
index 9b994b757f9..4b1303cc97c 100644
--- a/app/views/admin/dashboard/_security_newsletter_callout.html.haml
+++ b/app/views/admin/dashboard/_security_newsletter_callout.html.haml
@@ -6,9 +6,9 @@
alert_data: { feature_id: Users::CalloutsHelper::SECURITY_NEWSLETTER_CALLOUT,
dismiss_endpoint: callouts_path,
defer_links: 'true' },
- close_button_data: { testid: 'close-security-newsletter-callout' }) do
- .gl-alert-body
+ close_button_data: { testid: 'close-security-newsletter-callout' }) do |c|
+ = c.body do
= s_('AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates.')
- .gl-alert-actions
+ = c.actions do
= link_to 'https://about.gitlab.com/company/preference-center/', target: '_blank', rel: 'noreferrer noopener', class: 'deferred-link gl-alert-action btn-confirm btn-md gl-button' do
= s_('AdminArea|Sign up for the GitLab newsletter')
diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml
index 8ac6f63cdfb..944d7bfced0 100644
--- a/app/views/admin/groups/_form.html.haml
+++ b/app/views/admin/groups/_form.html.haml
@@ -27,8 +27,8 @@
- if @group.new_record?
.form-group.row
.offset-sm-2.col-sm-10
- = render Pajamas::AlertComponent.new(dismissible: false) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false) do |c|
+ = c.body do
= render 'shared/group_tips'
.form-actions
= f.submit _('Create group'), class: "gl-button btn btn-confirm"
diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml
index 09f2d431197..39b2fa41c80 100644
--- a/app/views/admin/groups/show.html.haml
+++ b/app/views/admin/groups/show.html.haml
@@ -112,7 +112,7 @@
= form_tag admin_group_members_update_path(@group), id: "new_project_member", class: "bulk_import", method: :put do
%div
- = users_select_tag(:user_ids, multiple: true, email_user: true, skip_ldap: @group.ldap_synced?, scope: :all)
+ = users_select_tag(:user_id, multiple: true, email_user: true, skip_ldap: @group.ldap_synced?, scope: :all)
.gl-mt-3
= select_tag :access_level, options_for_select(@group.access_level_roles), class: "project-access-select select2"
%hr
diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml
index be7055e6f7b..16f6e71d79b 100644
--- a/app/views/admin/projects/show.html.haml
+++ b/app/views/admin/projects/show.html.haml
@@ -16,8 +16,8 @@
.col-md-12
= render Pajamas::AlertComponent.new(variant: :danger,
alert_class: 'gl-mb-5',
- alert_data: { testid: 'last-repository-check-failed-alert' }) do
- .gl-alert-body
+ alert_data: { testid: 'last-repository-check-failed-alert' }) do |c|
+ = c.body do
- last_check_message = _("Last repository check (%{last_check_timestamp}) failed. See the 'repocheck.log' file for error messages.")
- last_check_message = last_check_message % { last_check_timestamp: time_ago_with_tooltip(@project.last_repository_check_at) }
= last_check_message.html_safe
diff --git a/app/views/admin/requests_profiles/index.html.haml b/app/views/admin/requests_profiles/index.html.haml
deleted file mode 100644
index 9d42a2bfa93..00000000000
--- a/app/views/admin/requests_profiles/index.html.haml
+++ /dev/null
@@ -1,22 +0,0 @@
-- page_title _('Requests Profiles')
-
-%h3.page-title
- = page_title
-
-.bs-callout.clearfix
- = html_escape(_('Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request')) % { profile_token: @profile_token, codeOpen: '<code>'.html_safe, codeClose: '</code>'.html_safe }
-
-- if @profiles.present?
- .gl-mt-3
- - @profiles.each do |path, profiles|
- .card
- .card-header
- %code= path
- %ul.content-list
- - profiles.each do |profile|
- %li
- = link_to profile.time.to_s(:long) + ' ' + profile.profile_mode.capitalize,
- admin_requests_profile_path(profile)
-- else
- %p
- = _('No profiles found')
diff --git a/app/views/admin/runners/edit.html.haml b/app/views/admin/runners/edit.html.haml
index 5570c46c17f..ccdfe67ea77 100644
--- a/app/views/admin/runners/edit.html.haml
+++ b/app/views/admin/runners/edit.html.haml
@@ -1,95 +1,53 @@
-- add_page_specific_style 'page_bundles/ci_status'
-
- runner_name = "##{@runner.id} (#{@runner.short_sha})"
-- if Feature.enabled?(:runner_read_only_admin_view, default_enabled: :yaml)
- - breadcrumb_title _('Edit')
- - page_title _('Edit'), runner_name
- - add_to_breadcrumbs _('Runners'), admin_runners_path
- - add_to_breadcrumbs runner_name, admin_runner_path(@runner)
-- else
- - breadcrumb_title runner_name
- - page_title runner_name
+- breadcrumb_title _('Edit')
+- page_title _('Edit'), runner_name
+- add_to_breadcrumbs _('Runners'), admin_runners_path
+- add_to_breadcrumbs runner_name, admin_runner_path(@runner)
-#js-admin-runner-edit{ data: {runner_id: @runner.id} }
+#js-admin-runner-edit{ data: {runner_id: @runner.id, runner_path: admin_runner_path(@runner) } }
-.row
- .col-md-6
- %h4= _('Restrict projects for this runner')
- - if @runner.runner_projects.any?
- %table.table{ data: { testid: 'assigned-projects' } }
- %thead
- %tr
- %th= _('Assigned projects')
- - @runner.runner_projects.each do |runner_project|
- - project = runner_project.project
- - if project
- %tr
- %td
- = render Pajamas::AlertComponent.new(variant: :danger,
- dismissible: false,
- title: project.full_name) do
- .gl-alert-actions
- = link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
+- if @runner.project_type?
+ .gl-overflow-auto
+ %h4.gl-font-lg.gl-my-5= _('Restrict projects for this runner')
- %table.table{ data: { testid: 'unassigned-projects' } }
+ - if @runner.runner_projects.any?
+ %table.table{ data: { testid: 'assigned-projects' } }
%thead
%tr
- %th= _('Project')
- %th
-
+ %th= _('Assigned projects')
+ - @runner.runner_projects.each do |runner_project|
+ - project = runner_project.project
+ - if project
+ %tr
+ %td
+ = render Pajamas::AlertComponent.new(variant: :danger,
+ dismissible: false,
+ title: project.full_name) do |c|
+ = c.actions do
+ = link_to _('Disable'), admin_namespace_project_runner_project_path(project.namespace, project, runner_project), method: :delete, class: 'btn gl-alert-action btn-confirm btn-md gl-button'
+
+ %table.table{ data: { testid: 'unassigned-projects' } }
+ %thead
+ %tr
+ %th= s_('Runners|Select projects to assign to this runner')
+ %th
+
+ %tr
+ %td
+ = form_tag edit_admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do
+ .input-group
+ = search_field_tag :search, params[:search], class: 'form-control gl-form-input', spellcheck: false
+ .input-group-append
+ = submit_tag _('Search'), class: 'gl-button btn btn-default'
+
+ %td
+ - @projects.each do |project|
%tr
%td
- = form_tag edit_admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do
- .input-group
- = search_field_tag :search, params[:search], class: 'form-control gl-form-input', spellcheck: false
- .input-group-append
- = submit_tag _('Search'), class: 'gl-button btn btn-default'
-
+ = project.full_name
%td
- - @projects.each do |project|
- %tr
- %td
- = project.full_name
- %td
- .float-right
- = form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
- = f.hidden_field :runner_id, value: @runner.id
- = f.submit _('Enable'), aria: { label: s_('Runners|Change to project runner') }, class: 'gl-button btn btn-sm', data: { confirm: (s_('Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?') if @runner.instance_type?), confirm_btn_variant: 'danger' }
- = paginate_without_count @projects
-
- .col-md-6
- %h4= _('Recent jobs served by this runner')
- %table.table.ci-table.runner-builds
- %thead
- %tr
- %th= _('Job')
- %th= _('Status')
- %th= _('Project')
- %th= _('Commit')
- %th= _('Finished at')
-
- - @builds.each do |build|
- - project = build.project
- %tr.build
- %td.id
- - if project
- = link_to project_job_path(project, build) do
- %strong ##{build.id}
- - else
- %strong ##{build.id}
-
- %td.status
- = render 'ci/status/badge', status: build.detailed_status(current_user)
-
- %td.status
- - if project
- = project.full_name
-
- %td.build-link
- - if project
- = link_to pipeline_path(build.pipeline) do
- %strong= build.pipeline.short_sha
-
- %td.timestamp
- - if build.finished_at
- %span= time_ago_with_tooltip build.finished_at
+ .float-right
+ = form_for project.runner_projects.new, url: admin_namespace_project_runner_projects_path(project.namespace, project), method: :post do |f|
+ = f.hidden_field :runner_id, value: @runner.id
+ = f.submit _('Enable'), class: 'gl-button btn btn-sm'
+ = paginate_without_count @projects
diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml
index 5c4a7026f50..22351397b9a 100644
--- a/app/views/admin/runners/show.html.haml
+++ b/app/views/admin/runners/show.html.haml
@@ -5,4 +5,4 @@
- page_title title
- add_to_breadcrumbs _('Runners'), admin_runners_path
-#js-admin-runner-show{ data: {runner_id: @runner.id} }
+#js-admin-runner-show{ data: {runner_id: @runner.id, runners_path: admin_runners_path} }
diff --git a/app/views/admin/sessions/_new_base.html.haml b/app/views/admin/sessions/_new_base.html.haml
index c9b002a4dd2..65eb1358b40 100644
--- a/app/views/admin/sessions/_new_base.html.haml
+++ b/app/views/admin/sessions/_new_base.html.haml
@@ -4,4 +4,4 @@
= password_field_tag 'user[password]', nil, class: 'form-control', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
.submit-container.move-submit-down
- = submit_tag _('Enter Admin Mode'), class: 'gl-button btn btn-success', data: { qa_selector: 'enter_admin_mode_button' }
+ = submit_tag _('Enter Admin Mode'), class: 'gl-button btn btn-confirm', data: { qa_selector: 'enter_admin_mode_button' }
diff --git a/app/views/admin/sessions/_signin_box.html.haml b/app/views/admin/sessions/_signin_box.html.haml
index ab7eb8c79dc..9372bae14c3 100644
--- a/app/views/admin/sessions/_signin_box.html.haml
+++ b/app/views/admin/sessions/_signin_box.html.haml
@@ -14,6 +14,6 @@
= render_if_exists 'devise/sessions/new_smartcard'
- if allow_admin_mode_password_authentication_for_web?
- .login-box.tab-pane{ id: 'login-pane', role: 'tabpanel', class: active_when(!any_form_based_providers_enabled?) }
+ .login-box.tab-pane.gl-p-5{ id: 'login-pane', role: 'tabpanel', class: active_when(!any_form_based_providers_enabled?) }
.login-body
= render 'admin/sessions/new_base'
diff --git a/app/views/admin/sessions/_two_factor_otp.html.haml b/app/views/admin/sessions/_two_factor_otp.html.haml
index 3fe6e20a367..40ba79d1a65 100644
--- a/app/views/admin/sessions/_two_factor_otp.html.haml
+++ b/app/views/admin/sessions/_two_factor_otp.html.haml
@@ -6,4 +6,4 @@
= _("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.")
.submit-container.move-submit-down
- = submit_tag 'Verify code', class: 'gl-button btn btn-success'
+ = submit_tag 'Verify code', class: 'gl-button btn btn-confirm'
diff --git a/app/views/admin/sessions/new.html.haml b/app/views/admin/sessions/new.html.haml
index 67c607270a5..7d07b49c98e 100644
--- a/app/views/admin/sessions/new.html.haml
+++ b/app/views/admin/sessions/new.html.haml
@@ -8,7 +8,7 @@
- if any_form_based_providers_enabled?
= render 'devise/shared/tabs_ldap', show_password_form: allow_admin_mode_password_authentication_for_web?, render_signup_link: false
- else
- = render 'devise/shared/tabs_normal', tab_title: _('Enter Admin Mode'), render_signup_link: false
+ = render 'devise/shared/tab_single', tab_title: page_title
.tab-content
- if allow_admin_mode_password_authentication_for_web? || ldap_sign_in_enabled? || crowd_enabled?
= render 'admin/sessions/signin_box'
diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml
index 531ab206157..3f915846dd8 100644
--- a/app/views/admin/sessions/two_factor.html.haml
+++ b/app/views/admin/sessions/two_factor.html.haml
@@ -5,9 +5,9 @@
.col-md-5.new-session-forms-container
.login-page
#signin-container
- = render 'devise/shared/tabs_normal', tab_title: _('Enter Admin Mode'), render_signup_link: false
+ = render 'devise/shared/tab_single', tab_title: _('Enter Admin Mode')
.tab-content
- .login-box.tab-pane.active{ id: 'login-pane', role: 'tabpanel' }
+ .login-box.tab-pane.gl-p-5.active{ id: 'login-pane', role: 'tabpanel' }
.login-body
- if current_user.two_factor_otp_enabled?
= render 'admin/sessions/two_factor_otp'
diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml
index 50ef375dd35..9b9d97950cc 100644
--- a/app/views/admin/topics/_form.html.haml
+++ b/app/views/admin/topics/_form.html.haml
@@ -3,13 +3,20 @@
.form-group
= f.label :name do
- = _("Topic name")
- = f.text_field :name, placeholder: _('My topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_name_field' },
+ = _("Topic slug (name)")
+ = f.text_field :name, placeholder: _('my-topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_name_field' },
required: true,
title: _('Please fill in a name for your topic.'),
autofocus: true
.form-group
+ = f.label :title do
+ = _("Topic title")
+ = f.text_field :title, placeholder: _('My topic'), class: 'form-control input-lg', data: { qa_selector: 'topic_title_field' },
+ required: true,
+ title: _('Please fill in a title for your topic.')
+
+ .form-group
= f.label :description, _("Description")
= render layout: 'shared/md_preview', locals: { url: preview_markdown_admin_topics_path, referenced_users: false } do
= render 'shared/zen', f: f, attr: :description,
diff --git a/app/views/admin/topics/_topic.html.haml b/app/views/admin/topics/_topic.html.haml
index 959e7ab31fc..462943263df 100644
--- a/app/views/admin/topics/_topic.html.haml
+++ b/app/views/admin/topics/_topic.html.haml
@@ -1,4 +1,5 @@
- topic = local_assigns.fetch(:topic)
+- title = topic.title || topic.name
%li.topic-row.gl-py-3.gl-align-items-center{ class: 'gl-display-flex!', data: { qa_selector: 'topic_row_content' } }
.avatar-container.rect-avatar.s40.gl-flex-shrink-0
@@ -6,7 +7,9 @@
.gl-min-w-0.gl-flex-grow-1
.title
- = link_to topic.name, topic_explore_projects_path(topic_name: topic.name)
+ = link_to title, topic_explore_projects_path(topic_name: topic.name)
+ %div
+ = topic.name
.stats.gl-text-gray-500.gl-flex-shrink-0.gl-display-none.gl-sm-display-flex
%span.gl-ml-5.has-tooltip{ title: n_('%d project', '%d projects', topic.total_projects_count) % topic.total_projects_count }
diff --git a/app/views/admin/users/_users.html.haml b/app/views/admin/users/_users.html.haml
index 86391b980c0..a7ed7b8c052 100644
--- a/app/views/admin/users/_users.html.haml
+++ b/app/views/admin/users/_users.html.haml
@@ -1,8 +1,8 @@
- if registration_features_can_be_prompted?
= render Pajamas::AlertComponent.new(variant: :tip,
alert_class: 'gl-my-5',
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= render 'shared/registration_features_discovery_message', feature_title: s_('RegistrationFeatures|send emails to users')
.top-area
diff --git a/app/views/ci/runner/_how_to_setup_runner.html.haml b/app/views/ci/runner/_how_to_setup_runner.html.haml
index f0a9936112b..8f4cc41822b 100644
--- a/app/views/ci/runner/_how_to_setup_runner.html.haml
+++ b/app/views/ci/runner/_how_to_setup_runner.html.haml
@@ -8,13 +8,13 @@
= _("Register the runner with this URL:")
%br
%code#coordinator_address= root_url(only_path: false)
- = clipboard_button(target: '#coordinator_address', title: _("Copy URL"), class: "btn-transparent btn-clipboard")
+ = clipboard_button(target: '#coordinator_address', title: _("Copy URL"))
%br
%br
= _("And this registration token:")
%br
%code#registration_token{ data: {testid: 'registration_token' } }= registration_token
- = clipboard_button(target: '#registration_token', title: _("Copy token"), class: "btn-transparent btn-clipboard")
+ = clipboard_button(target: '#registration_token', title: _("Copy token"))
.gl-mt-3.gl-mb-3
= button_to _("Reset registration token"), reset_token_url,
diff --git a/app/views/ci/runner/_setup_runner_in_aws.html.haml b/app/views/ci/runner/_setup_runner_in_aws.html.haml
index b0a5b40f2ad..09fa0176da6 100644
--- a/app/views/ci/runner/_setup_runner_in_aws.html.haml
+++ b/app/views/ci/runner/_setup_runner_in_aws.html.haml
@@ -8,7 +8,7 @@
= _('Copy this registration token.')
%br
%code#registration_token{ data: { testid: 'registration_token' } }= registration_token
- = clipboard_button(target: '#registration_token', title: _('Copy token'), class: 'btn-transparent btn-clipboard')
+ = clipboard_button(target: '#registration_token', title: _('Copy token'))
%li
= _('Choose the preferred Runner and populate the AWS CFT.')
= link_to _('Learn more.'), 'https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg', target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/ci/variables/_content.html.haml b/app/views/ci/variables/_content.html.haml
index 8a2a479486f..b597c2d442a 100644
--- a/app/views/ci/variables/_content.html.haml
+++ b/app/views/ci/variables/_content.html.haml
@@ -4,7 +4,7 @@
= _('Variables can be:')
%ul
%li
- = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ = html_escape(_('%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
= html_escape(_('%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
= link_to _('Learn more.'), help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/ci/variables/_index.html.haml b/app/views/ci/variables/_index.html.haml
index f289e6a3386..0024526a90c 100644
--- a/app/views/ci/variables/_index.html.haml
+++ b/app/views/ci/variables/_index.html.haml
@@ -2,7 +2,7 @@
- if ci_variable_protected_by_default?
%p.settings-message.text-center
- - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable') }
+ - link_start = '<a href="%{url}">'.html_safe % { url: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables') }
= s_('Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe }
- is_group = !@group.nil?
@@ -17,9 +17,9 @@
aws_tip_commands_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'run-aws-commands-from-gitlab-cicd'),
aws_tip_learn_link: help_page_path('ci/cloud_deployment/index.md', anchor: 'aws'),
contains_variable_reference_link: help_page_path('ci/variables/index', anchor: 'use-variables-in-other-variables'),
- protected_environment_variables_link: help_page_path('ci/variables/index', anchor: 'protect-a-cicd-variable'),
+ protected_environment_variables_link: help_page_path('ci/variables/index', anchor: 'protected-cicd-variables'),
masked_environment_variables_link: help_page_path('ci/variables/index', anchor: 'mask-a-cicd-variable'),
-} }
+ environment_scope_link: help_page_path('ci/environments/index', anchor: 'scope-environments-with-specs') } }
- if !@group && @project.group
.settings-header.border-top.gl-mt-6
diff --git a/app/views/clusters/clusters/_banner.html.haml b/app/views/clusters/clusters/_banner.html.haml
index b7d1aa6f944..720e3ff08e2 100644
--- a/app/views/clusters/clusters/_banner.html.haml
+++ b/app/views/clusters/clusters/_banner.html.haml
@@ -7,13 +7,13 @@
%span.gl-ml-2= s_('ClusterIntegration|Kubernetes cluster is being created...')
= render Pajamas::AlertComponent.new(variant: :warning,
- alert_class: 'hidden js-cluster-api-unreachable') do
- .gl-alert-body
+ alert_class: 'hidden js-cluster-api-unreachable') do |c|
+ = c.body do
= s_('ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct.')
= render Pajamas::AlertComponent.new(variant: :warning,
- alert_class: 'hidden js-cluster-authentication-failure js-cluster-api-unreachable') do
- .gl-alert-body
+ alert_class: 'hidden js-cluster-authentication-failure js-cluster-api-unreachable') do |c|
+ = c.body do
= s_('ClusterIntegration|There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid.')
.hidden.js-cluster-success.bs-callout.bs-callout-success{ role: 'alert' }
diff --git a/app/views/clusters/clusters/_deprecation_alert.html.haml b/app/views/clusters/clusters/_deprecation_alert.html.haml
index 202e2c14d3f..3a83efec29b 100644
--- a/app/views/clusters/clusters/_deprecation_alert.html.haml
+++ b/app/views/clusters/clusters/_deprecation_alert.html.haml
@@ -1,5 +1,5 @@
-= render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mt-6 gl-mb-3') do
- .gl-alert-body
+= render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mt-6 gl-mb-3') do |c|
+ = c.body do
- link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
- issue_link_start = link_start % { url: 'https://gitlab.com/gitlab-org/configure/general/-/issues/199' }
- docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index.md') }
diff --git a/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml b/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
index ffd910b1b9d..b130e0c7214 100644
--- a/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
+++ b/app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml
@@ -2,9 +2,9 @@
= render Pajamas::AlertComponent.new(title: s_('ClusterIntegration|Did you know?'),
alert_class: 'gcp-signup-offer',
- alert_data: { feature_id: Users::CalloutsHelper::GCP_SIGNUP_OFFER, dismiss_endpoint: callouts_path }) do
- .gl-alert-body
+ alert_data: { feature_id: Users::CalloutsHelper::GCP_SIGNUP_OFFER, dismiss_endpoint: callouts_path }) do |c|
+ = c.body do
= s_('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.').html_safe % { sign_up_link: link }
- .gl-alert-actions
+ = c.actions do
%a.gl-button.btn-confirm.text-decoration-none{ href: 'https://cloud.google.com/partners/partnercredit/?pcn_code=0014M00001h35gDQAQ#contact-form', target: '_blank', rel: 'noopener noreferrer' }
= s_("ClusterIntegration|Apply for credit")
diff --git a/app/views/clusters/clusters/_integrations.html.haml b/app/views/clusters/clusters/_integrations.html.haml
index c670dafb947..62ae551fee7 100644
--- a/app/views/clusters/clusters/_integrations.html.haml
+++ b/app/views/clusters/clusters/_integrations.html.haml
@@ -13,15 +13,16 @@
= prometheus_form.gitlab_ui_checkbox_component :enabled,
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-success'
+ = prometheus_form.submit _('Save changes'), class: 'btn gl-button btn-confirm'
- .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-success'
+ - 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/_sidebar.html.haml b/app/views/clusters/clusters/_sidebar.html.haml
index 045c03df4fa..e479773e70d 100644
--- a/app/views/clusters/clusters/_sidebar.html.haml
+++ b/app/views/clusters/clusters/_sidebar.html.haml
@@ -1,5 +1,4 @@
- is_connect_page = local_assigns.fetch(:is_connect_page, false)
-- docs_mode = local_assigns.fetch(:docs_mode, false)
- title = is_connect_page ? s_('ClusterIntegration|Connect a Kubernetes cluster') : s_('ClusterIntegration|Create a Kubernetes cluster')
%h3
@@ -7,7 +6,7 @@
%p
= clusterable.sidebar_text
-- if !docs_mode
+- if is_connect_page
%p
= clusterable.learn_more_link
diff --git a/app/views/clusters/clusters/aws/_new.html.haml b/app/views/clusters/clusters/aws/_new.html.haml
deleted file mode 100644
index 7142dd83dce..00000000000
--- a/app/views/clusters/clusters/aws/_new.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- if !Gitlab::CurrentSettings.eks_integration_enabled?
- - documentation_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/clusters/add_eks_clusters.md',
- anchor: 'additional-requirements-for-self-managed-instances') }
- = s_('Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service.').html_safe % { link_start: documentation_link_start, link_end: '<a/>'.html_safe }
-- else
- .js-create-eks-cluster-form-container{ data: { 'gitlab-managed-cluster-help-path' => help_page_path('user/project/clusters/gitlab_managed_clusters.md'),
- 'namespace-per-environment-help-path' => help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'),
- 'create-role-path' => clusterable.authorize_aws_role_path,
- 'create-cluster-path' => clusterable.create_aws_clusters_path,
- 'account-id' => Gitlab::CurrentSettings.eks_account_id,
- 'external-id' => @aws_role.role_external_id,
- 'role-arn' => @aws_role.role_arn,
- 'instance-types' => @instance_types,
- 'kubernetes-integration-help-path' => help_page_path('user/infrastructure/clusters/index.md'),
- 'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'how-to-create-a-new-cluster-on-eks-through-cluster-certificates-deprecated'),
- 'create-role-arn-help-path' => help_page_path('user/project/clusters/add_eks_clusters.md', anchor: 'how-to-create-a-new-cluster-on-eks-through-cluster-certificates-deprecated'),
- 'external-link-icon' => sprite_icon('external-link') } }
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 807f98b7b0a..bed671832f3 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
@@ -1,15 +1,11 @@
-- provider = local_assigns.fetch(:provider)
-- is_current_provider = provider == params[:provider]
- logo_path = local_assigns.fetch(:logo_path)
- help_path = local_assigns.fetch(:help_path)
- label = local_assigns.fetch(:label)
- last = local_assigns.fetch(:last, false)
-- docs_mode = local_assigns.fetch(:docs_mode, false)
- classes = ["btn btn-confirm gl-button btn-confirm-secondary gl-flex-direction-column gl-w-half"]
-- conditional_classes = [("gl-mr-5" unless last), ("active" if is_current_provider && !docs_mode), ("js-create-#{provider}-cluster-button" if !docs_mode)]
-- link = docs_mode ? help_path : clusterable.new_path(provider: provider)
+- conditional_classes = [("gl-mr-5" unless last)]
-= link_to link, class: classes + conditional_classes do
+= 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
= 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 69250141816..e4128ee22a4 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
@@ -3,13 +3,12 @@
- 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')
-- docs_mode = local_assigns.fetch(:docs_mode, false)
.gl-p-5
%h4.gl-mb-5
= create_cluster_label
.gl-display-flex
= render partial: 'clusters/clusters/cloud_providers/cloud_provider_button',
- locals: { provider: 'aws', label: eks_label, logo_path: 'illustrations/logos/amazon_eks.svg', help_path: eks_help_path, docs_mode: docs_mode }
+ 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: { provider: 'gcp', label: gke_label, logo_path: 'illustrations/logos/google_gke.svg', help_path: gke_help_path, docs_mode: docs_mode, last: true }
+ locals: { label: gke_label, logo_path: 'illustrations/logos/google_gke.svg', help_path: gke_help_path, last: true }
diff --git a/app/views/clusters/clusters/connect.html.haml b/app/views/clusters/clusters/connect.html.haml
index ec00a9c345a..82750974803 100644
--- a/app/views/clusters/clusters/connect.html.haml
+++ b/app/views/clusters/clusters/connect.html.haml
@@ -9,5 +9,5 @@
.gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
= render 'sidebar', is_connect_page: true
.gl-w-full
- #js-cluster-new{ data: js_cluster_new }
+ #js-cluster-new
= render 'clusters/clusters/user/form'
diff --git a/app/views/clusters/clusters/gcp/_form.html.haml b/app/views/clusters/clusters/gcp/_form.html.haml
deleted file mode 100644
index 58b8e8b1003..00000000000
--- a/app/views/clusters/clusters/gcp/_form.html.haml
+++ /dev/null
@@ -1,87 +0,0 @@
-- external_link_icon = sprite_icon('external-link')
-- zones_link_url = 'https://cloud.google.com/compute/docs/regions-zones/regions-zones'
-- machine_type_link_url = 'https://cloud.google.com/compute/docs/machine-types'
-- pricing_link_url = 'https://cloud.google.com/compute/pricing#machinetype'
-- kubernetes_integration_url = help_page_path('user/infrastructure/clusters/index.md')
-- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe
-- help_link_end = ' %{external_link_icon}</a>'.html_safe % { external_link_icon: external_link_icon }
-
-%p
- = s_('ClusterIntegration|Read our %{link_start}help page%{link_end} on Kubernetes cluster integration.').html_safe % { link_start: help_link_start % { url: kubernetes_integration_url }, link_end: '</a>'.html_safe }
-
-%p= link_to('Select a different Google account', @authorize_url)
-
-= bootstrap_form_for @gcp_cluster, html: { class: 'gl-show-field-errors js-gke-cluster-creation prepend-top-20',
- data: { token: token_in_session } }, url: clusterable.create_gcp_clusters_path, as: :cluster do |field|
- = field.text_field :name, required: true, title: s_('ClusterIntegration|Cluster name is required.'),
- label: s_('ClusterIntegration|Kubernetes cluster name'), label_class: 'label-bold'
- = field.form_group :environment_scope, label: { text: s_('ClusterIntegration|Environment scope'),
- class: 'label-bold' } do
- = field.text_field :environment_scope, required: true, class: 'form-control',
- title: 'Environment scope is required.', wrapper: false
- .form-text.text-muted= s_("ClusterIntegration|Choose which of your environments will use this cluster.")
-
- = field.fields_for :provider_gcp, @gcp_cluster.provider_gcp do |provider_gcp_field|
- .form-group
- = provider_gcp_field.label :gcp_project_id, s_('ClusterIntegration|Google Cloud Platform project'),
- class: 'label-bold'
- .js-gcp-project-id-dropdown-entry-point{ data: { docsUrl: 'https://console.cloud.google.com/home/dashboard' } }
- = provider_gcp_field.hidden_field :gcp_project_id
- .dropdown
- %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true }
- %span.dropdown-toggle-text
- = _('Select project')
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %span.form-text.text-muted &nbsp;
-
- .form-group
- = provider_gcp_field.label :zone, s_('ClusterIntegration|Zone'), class: 'label-bold'
- .js-gcp-zone-dropdown-entry-point
- = provider_gcp_field.hidden_field :zone
- .dropdown
- %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true }
- %span.dropdown-toggle-text
- = _('Select project to choose zone')
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %p.form-text.text-muted
- = s_('ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}.').html_safe % { help_link_start: help_link_start % { url: zones_link_url }, help_link_end: help_link_end }
-
- = provider_gcp_field.number_field :num_nodes, required: true, placeholder: '3',
- title: s_('ClusterIntegration|Number of nodes must be a numerical value.'),
- label: s_('ClusterIntegration|Number of nodes'), label_class: 'label-bold'
-
- .form-group
- = provider_gcp_field.label :machine_type, s_('ClusterIntegration|Machine type'), class: 'label-bold'
- .js-gcp-machine-type-dropdown-entry-point
- = provider_gcp_field.hidden_field :machine_type
- .dropdown
- %button.dropdown-menu-toggle.dropdown-menu-full-width{ type: 'button', disabled: true }
- %span.dropdown-toggle-text
- = _('Select project and zone to choose machine type')
- = sprite_icon('chevron-down', css_class: 'dropdown-menu-toggle-icon gl-top-3')
- %p.form-text.text-muted
- = s_('ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}.').html_safe % { help_link_start_machine_type: help_link_start % { url: machine_type_link_url }, help_link_start_pricing: help_link_start % { url: pricing_link_url }, help_link_end: help_link_end }
-
- .form-group
- = provider_gcp_field.check_box :cloud_run, { label: s_('ClusterIntegration|Enable Cloud Run for Anthos'),
- label_class: 'label-bold' }
- .form-text.text-muted
- = s_('ClusterIntegration|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster.')
- = link_to _('Learn more.'), help_page_path('user/project/clusters/add_gke_clusters.md', anchor: 'cloud-run-for-anthos'), target: '_blank', rel: 'noopener noreferrer'
-
- .form-group
- = field.check_box :managed, { label: s_('ClusterIntegration|GitLab-managed cluster'),
- label_class: 'label-bold' }
- .form-text.text-muted
- = s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.')
- = link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer'
-
- .form-group
- = field.check_box :namespace_per_environment, { label: s_('ClusterIntegration|Namespace per environment'), label_class: 'label-bold' }
- .form-text.text-muted
- = s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.')
- = link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer'
-
- .form-group.js-gke-cluster-creation-submit-container
- = field.submit s_('ClusterIntegration|Create Kubernetes cluster'),
- class: 'js-gke-cluster-creation-submit gl-button btn btn-confirm', disabled: true
diff --git a/app/views/clusters/clusters/gcp/_gcp_not_configured.html.haml b/app/views/clusters/clusters/gcp/_gcp_not_configured.html.haml
deleted file mode 100644
index f1f26a0aab8..00000000000
--- a/app/views/clusters/clusters/gcp/_gcp_not_configured.html.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-- documentation_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path("integration/google") }
-- link_end = '<a/>'.html_safe
-= s_('Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service.').html_safe % { link_start: documentation_link_start, link_end: link_end }
diff --git a/app/views/clusters/clusters/gcp/_header.html.haml b/app/views/clusters/clusters/gcp/_header.html.haml
deleted file mode 100644
index a2ad3cd64df..00000000000
--- a/app/views/clusters/clusters/gcp/_header.html.haml
+++ /dev/null
@@ -1,14 +0,0 @@
-%h4
- = s_('ClusterIntegration|Enter the details for your Kubernetes cluster')
-%p
- = s_('ClusterIntegration|Please make sure that your Google account meets the following requirements:')
-%ul
- %li
- - link_to_kubernetes_engine = link_to(s_('ClusterIntegration|access to Google Kubernetes Engine'), 'https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral', target: '_blank', rel: 'noopener noreferrer')
- = s_('ClusterIntegration|Your account must have %{link_to_kubernetes_engine}').html_safe % { link_to_kubernetes_engine: link_to_kubernetes_engine }
- %li
- - link_to_requirements = link_to(s_('ClusterIntegration|meets the requirements'), 'https://cloud.google.com/kubernetes-engine/docs/quickstart?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral', target: '_blank', rel: 'noopener noreferrer')
- = s_('ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters').html_safe % { link_to_requirements: link_to_requirements }
- %li
- - link_to_container_project = link_to(s_('ClusterIntegration|Google Kubernetes Engine project'), 'https://console.cloud.google.com/home/dashboard?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral', target: '_blank', rel: 'noopener noreferrer')
- = s_('ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below').html_safe % { link_to_container_project: link_to_container_project }
diff --git a/app/views/clusters/clusters/gcp/_new.html.haml b/app/views/clusters/clusters/gcp/_new.html.haml
deleted file mode 100644
index 6c3a230fb93..00000000000
--- a/app/views/clusters/clusters/gcp/_new.html.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-= render 'clusters/clusters/gcp/header'
-- if @valid_gcp_token
- = render 'clusters/clusters/gcp/form'
-- else
- = render 'clusters/clusters/gcp/gcp_not_configured'
diff --git a/app/views/clusters/clusters/new.html.haml b/app/views/clusters/clusters/new.html.haml
deleted file mode 100644
index 53d521fface..00000000000
--- a/app/views/clusters/clusters/new.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-- @content_class = 'limit-container-width' unless fluid_layout
-- add_to_breadcrumbs _('Kubernetes Clusters'), clusterable.index_path
-- breadcrumb_title _('Create a cluster')
-- page_title _('Create a Kubernetes cluster')
-- provider = params[:provider]
-
-= render 'deprecation_alert'
-
-= render_gcp_signup_offer
-
-.gl-md-display-flex.gl-mt-3
- .gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
- = render 'sidebar', is_connect_page: false
- .gl-w-full
- = render 'clusters/clusters/cloud_providers/cloud_provider_selector'
-
- - if ['aws', 'gcp'].include?(provider)
- .gl-p-5.gl-border-1.gl-border-t-solid.gl-border-gray-100
- = render "clusters/clusters/#{provider}/new"
diff --git a/app/views/clusters/clusters/new_cluster_docs.html.haml b/app/views/clusters/clusters/new_cluster_docs.html.haml
index 9b99aef0e72..bff371b8d51 100644
--- a/app/views/clusters/clusters/new_cluster_docs.html.haml
+++ b/app/views/clusters/clusters/new_cluster_docs.html.haml
@@ -2,12 +2,11 @@
- add_to_breadcrumbs _('Kubernetes Clusters'), clusterable.index_path
- breadcrumb_title _('Create a cluster')
- page_title _('Create a Kubernetes cluster')
-- docs_mode = true
= render_gcp_signup_offer
.gl-md-display-flex.gl-mt-3
.gl-w-quarter.gl-xs-w-full.gl-flex-shrink-0.gl-md-mr-5
- = render 'sidebar', docs_mode: docs_mode, is_connect_page: false
+ = render 'sidebar', is_connect_page: false
.gl-w-full
- = render 'clusters/clusters/cloud_providers/cloud_provider_selector', docs_mode: docs_mode
+ = render 'clusters/clusters/cloud_providers/cloud_provider_selector'
diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml
index fb46b4e5064..58e0ef96333 100644
--- a/app/views/clusters/clusters/show.html.haml
+++ b/app/views/clusters/clusters/show.html.haml
@@ -28,14 +28,6 @@
= render 'banner'
- .gl-alert.gl-alert-warning{ role: 'alert' }
- = sprite_icon('warning', css_class: "gl-alert-icon gl-alert-icon-no-title gl-icon")
- %button.js-close.gl-alert-dismiss{ type: 'button', 'aria-label' => _('Dismiss'), data: { testid: 'dismiss-one-click-application-removal' } }
- = sprite_icon('close', css_class: 'gl-icon')
- .gl-alert-body
- = s_('ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working.')
- = link_to _('More information.'), help_page_path("user/clusters/applications"), target: '_blank', rel: 'noopener noreferrer'
-
- if cluster_created?(@cluster)
.js-toggle-container
= gl_tabs_nav do
diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml
index 2dd15ebd266..bf7b24181c1 100644
--- a/app/views/clusters/clusters/user/_form.html.haml
+++ b/app/views/clusters/clusters/user/_form.html.haml
@@ -1,7 +1,5 @@
-- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_remove_clusters.md',
- anchor: 'add-existing-cluster'), target: '_blank', rel: 'noopener noreferrer'
-- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_remove_clusters.md',
- anchor: 'access-controls'), target: '_blank', rel: 'noopener noreferrer'
+- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_existing_cluster'), target: '_blank', rel: 'noopener noreferrer'
+- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/cluster_access'), target: '_blank', rel: 'noopener noreferrer'
- api_url_help_text = s_('ClusterIntegration|The URL used to access the Kubernetes API.')
- ca_cert_help_text = s_('ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster.')
diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml
index 1d711f366c4..4f6ddf10984 100644
--- a/app/views/dashboard/todos/index.html.haml
+++ b/app/views/dashboard/todos/index.html.haml
@@ -70,6 +70,8 @@
= sort_title_recently_created
= link_to todos_filter_path(sort: sort_value_oldest_created) do
= sort_title_oldest_created
+ = link_to todos_filter_path(sort: sort_value_recently_updated) do
+ = sort_title_recently_updated
.row.js-todos-all
- if @allowed_todos.any?
diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml
index d5372862128..c90a9e7c672 100644
--- a/app/views/devise/passwords/new.html.haml
+++ b/app/views/devise/passwords/new.html.haml
@@ -3,17 +3,17 @@
= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post, class: 'gl-show-field-errors' }) do |f|
.devise-errors
= render "devise/shared/error_messages", resource: resource
- .form-group
+ .form-group.gl-px-5.gl-pt-5
= f.label :email
= f.email_field :email, class: "form-control gl-form-input", required: true, autocomplete: 'off', value: params[:user_email], autofocus: true, title: _('Please provide a valid email address.')
.form-text.text-muted
= _('Requires your primary GitLab email address.')
- %div
- if recaptcha_enabled?
- = recaptcha_tags nonce: content_security_policy_nonce
+ .gl-px-5
+ = recaptcha_tags nonce: content_security_policy_nonce
- .gl-mt-5
+ .gl-p-5
= f.submit _("Reset password"), class: "gl-button btn-confirm btn"
.clearfix.prepend-top-20
diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml
index 83e3fd85511..48b38861e6e 100644
--- a/app/views/devise/sessions/_new_base.html.haml
+++ b/app/views/devise/sessions/_new_base.html.haml
@@ -1,12 +1,12 @@
= gitlab_ui_form_for(resource, as: resource_name, url: session_path(resource_name), html: { class: 'new_user gl-show-field-errors js-sign-in-form', aria: { live: 'assertive' }, data: { testid: 'sign-in-form' }}) do |f|
- .form-group
- = f.label _('Username or email'), for: 'user_login', class: 'label-bold'
+ .form-group.gl-px-5.gl-pt-5
+ = render_if_exists 'devise/sessions/new_base_user_login_label', form: f
= f.text_field :login, value: @invite_email, class: 'form-control gl-form-input top js-username-field', autofocus: 'autofocus', autocapitalize: 'off', autocorrect: 'off', required: true, title: _('This field is required.'), data: { qa_selector: 'login_field', testid: 'username-field' }
- .form-group
+ .form-group.gl-px-5
= f.label :password, class: 'label-bold'
= f.password_field :password, class: 'form-control gl-form-input bottom', autocomplete: 'current-password', required: true, title: _('This field is required.'), data: { qa_selector: 'password_field' }
- if devise_mapping.rememberable?
- %div
+ .gl-px-5
.gl-display-inline-block
= f.gitlab_ui_checkbox_component :remember_me, _('Remember me')
.gl-float-right
@@ -18,7 +18,8 @@
- if Feature.enabled?(:arkose_labs_login_challenge)
= render_if_exists 'devise/sessions/arkose_labs'
- elsif captcha_enabled? || captcha_on_login_required?
- = recaptcha_tags nonce: content_security_policy_nonce
+ .gl-px-5
+ = recaptcha_tags nonce: content_security_policy_nonce
- .submit-container.move-submit-down
+ .submit-container.move-submit-down.gl-px-5
= f.button _('Sign in'), type: :submit, class: "gl-button btn btn-block btn-confirm js-sign-in-button#{' js-no-auto-disable' if Feature.enabled?(:arkose_labs_login_challenge)}", data: { qa_selector: 'sign_in_button', testid: 'sign-in-button' }
diff --git a/app/views/devise/sessions/_new_base_user_login_label.html.haml b/app/views/devise/sessions/_new_base_user_login_label.html.haml
new file mode 100644
index 00000000000..2aa66684cad
--- /dev/null
+++ b/app/views/devise/sessions/_new_base_user_login_label.html.haml
@@ -0,0 +1 @@
+= local_assigns[:form].label _('Username or email'), for: 'user_login', class: 'label-bold'
diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml
index fb4c011dd49..bdf357c5f74 100644
--- a/app/views/devise/sessions/_new_crowd.html.haml
+++ b/app/views/devise/sessions/_new_crowd.html.haml
@@ -1,13 +1,13 @@
= form_tag(omniauth_authorize_path(:user, :crowd), id: 'new_crowd_user', class: 'gl-show-field-errors') do
- .form-group
+ .form-group.gl-px-5.gl-pt-5
= label_tag :username, _('Username or email')
= text_field_tag :username, nil, { class: "form-control top", title: _("This field is required."), autofocus: "autofocus", required: true }
- .form-group
+ .form-group.gl-px-5
= label_tag :password
= password_field_tag :password, nil, { autocomplete: 'current-password', class: "form-control bottom", title: _("This field is required."), required: true }
- if devise_mapping.rememberable?
- .remember-me
+ .remember-me.gl-px-5
%label{ for: "remember_me" }
= check_box_tag :remember_me, '1', false, id: 'remember_me'
%span= _('Remember me')
- = submit_tag _("Sign in"), class: "gl-button btn-confirm btn"
+ = submit_tag _("Sign in"), class: "gl-button btn-confirm btn gl-px-5"
diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml
index fea58779c17..4cde24f4afa 100644
--- a/app/views/devise/sessions/_new_ldap.html.haml
+++ b/app/views/devise/sessions/_new_ldap.html.haml
@@ -3,17 +3,17 @@
- submit_message = local_assigns.fetch(:submit_message, _('Sign in'))
= form_tag(omniauth_callback_path(:user, server['provider_name']), id: 'new_ldap_user', class: "gl-show-field-errors") do
- .form-group
+ .form-group.gl-px-5.gl-pt-5
= label_tag :username, "#{server['label']} Username"
= text_field_tag :username, nil, { class: "form-control gl-form-input top", title: _("This field is required."), autofocus: "autofocus", data: { qa_selector: 'username_field' }, required: true }
- .form-group
+ .form-group.gl-px-5
= label_tag :password
= password_field_tag :password, nil, { autocomplete: 'current-password', class: "form-control gl-form-input bottom", title: _("This field is required."), data: { qa_selector: 'password_field' }, required: true }
- if !hide_remember_me && devise_mapping.rememberable?
- .remember-me
+ .remember-me.gl-px-5
%label{ for: "remember_me" }
= check_box_tag :remember_me, '1', false, id: 'remember_me'
%span= _('Remember me')
- .submit-container.move-submit-down
+ .submit-container.move-submit-down.gl-px-5
= submit_tag submit_message, class: "gl-button btn btn-confirm", data: { qa_selector: 'sign_in_button' }
diff --git a/app/views/devise/sessions/two_factor.html.haml b/app/views/devise/sessions/two_factor.html.haml
index 29bcb3c158b..77a2fda021f 100644
--- a/app/views/devise/sessions/two_factor.html.haml
+++ b/app/views/devise/sessions/two_factor.html.haml
@@ -1,6 +1,6 @@
%div
= render 'devise/shared/tab_single', tab_title: _('Two-Factor Authentication')
- .login-box
+ .login-box.gl-p-5
.login-body
- if @user.two_factor_otp_enabled?
= form_for(resource, as: resource_name, url: session_path(resource_name), method: :post, html: { class: "edit_user gl-show-field-errors js-2fa-form #{'hidden' if @user.two_factor_webauthn_u2f_enabled?}" }) do |f|
diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml
index bd7fe41ae8d..32b4a15517e 100644
--- a/app/views/devise/shared/_omniauth_box.html.haml
+++ b/app/views/devise/shared/_omniauth_box.html.haml
@@ -1,6 +1,6 @@
- hide_remember_me = local_assigns.fetch(:hide_remember_me, false)
-.omniauth-container.gl-mt-5
+.omniauth-container.gl-mt-5.gl-p-5
%label.gl-font-weight-bold
= _('Sign in with')
- providers = enabled_button_based_providers
diff --git a/app/views/devise/shared/_tab_single.html.haml b/app/views/devise/shared/_tab_single.html.haml
index 1b5a932a09a..336954d00b0 100644
--- a/app/views/devise/shared/_tab_single.html.haml
+++ b/app/views/devise/shared/_tab_single.html.haml
@@ -1,2 +1,2 @@
= gl_tabs_nav({ class: 'new-session-tabs gl-border-0' }) do
- = gl_tab_link_to tab_title, '#', { item_active: true, class: 'gl-cursor-default!', tab_class: 'gl-bg-transparent!', tabindex: '-1' }
+ = gl_tab_link_to tab_title, '#', { item_active: true, class: 'gl-cursor-default!', tab_class: 'gl-bg-transparent!', tabindex: '-1', data: { qa_selector: 'sign_in_tab' } }
diff --git a/app/views/devise/shared/_tabs_normal.html.haml b/app/views/devise/shared/_tabs_normal.html.haml
deleted file mode 100644
index 01dd3748887..00000000000
--- a/app/views/devise/shared/_tabs_normal.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- tab_title = local_assigns.fetch(:tab_title, _('Sign in'))
-- render_signup_link = local_assigns.fetch(:render_signup_link, true)
-
-%ul.nav-links.new-session-tabs.nav-tabs.nav{ role: 'tablist' }
- %li.nav-item{ role: 'presentation' }
- %a.nav-link.active{ href: '#login-pane', data: { toggle: 'tab', qa_selector: 'sign_in_tab' }, role: 'tab' }= tab_title
- - if render_signup_link && allow_signup?
- %li.nav-item{ role: 'presentation' }
- %a.nav-link{ href: '#register-pane', data: { track_label: 'sign_in_register', track_property: '', track_action: 'click_button', track_value: '', toggle: 'tab', qa_selector: 'register_tab' }, role: 'tab' } Register
diff --git a/app/views/doorkeeper/authorizations/redirect.html.haml b/app/views/doorkeeper/authorizations/redirect.html.haml
index 9580f33c88a..a9ac92fd087 100644
--- a/app/views/doorkeeper/authorizations/redirect.html.haml
+++ b/app/views/doorkeeper/authorizations/redirect.html.haml
@@ -5,4 +5,16 @@
= javascript_tag do
:plain
- window.location= "#{redirect_uri}";
+ (function() {
+ // Only permit a basic set of characters in the fragment.
+ const allowedRegex = /^#[\w-]+$/g;
+
+ const hash = window.location.hash;
+ let redirectUri = "#{redirect_uri}";
+
+ if (window.location.hash && window.location.hash.search(allowedRegex) === 0 && redirectUri.indexOf('#') === -1) {
+ redirectUri = redirectUri + hash;
+ }
+
+ window.location = redirectUri;
+ })();
diff --git a/app/views/errors/request_conflict.html.haml b/app/views/errors/request_conflict.html.haml
new file mode 100644
index 00000000000..2f5abaca72f
--- /dev/null
+++ b/app/views/errors/request_conflict.html.haml
@@ -0,0 +1,18 @@
+- message = local_assigns.fetch(:message, nil)
+- content_for(:title, 'Request Conflict')
+
+%img{ :alt => "", :src => image_path('logo.svg') }
+%h1
+ 409
+.container
+ %h2
+ = s_("409|There was a conflict with your request.")
+ - if message
+ %p
+ = message
+ %p
+ = s_('409|Please contact your GitLab administrator if you think this is a mistake.')
+ .action-container.js-go-back{ hidden: true }
+ %button{ type: 'button', class: 'gl-button btn btn-primary' }
+ = _('Go Back')
+= render "errors/footer"
diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml
index d08c3d5ba41..53c59474d83 100644
--- a/app/views/events/event/_note.html.haml
+++ b/app/views/events/event/_note.html.haml
@@ -1,3 +1,5 @@
+- return if !event.personal_snippet_note? && event.has_no_project_and_group?
+
= icon_for_profile_event(event)
= event_user_info(event)
diff --git a/app/views/explore/projects/topic.html.haml b/app/views/explore/projects/topic.html.haml
index aeb040ea61f..76e59a49ed1 100644
--- a/app/views/explore/projects/topic.html.haml
+++ b/app/views/explore/projects/topic.html.haml
@@ -1,7 +1,7 @@
- @hide_top_links = false
- @no_container = true
-- page_title @topic.name, _("Topics")
-- max_topic_name_length = 50
+- page_title @topic.title_or_name, _("Topics")
+- max_topic_title_length = 50
= render_dashboard_ultimate_trial(current_user)
@@ -9,12 +9,12 @@
.gl-pb-5.gl-align-items-center.gl-justify-content-center.gl-display-flex
.avatar-container.rect-avatar.s60.gl-flex-shrink-0
= topic_icon(@topic, alt: _('Topic avatar'), class: 'avatar topic-avatar s60')
- - if @topic.name.length > max_topic_name_length
- %h1.gl-mt-3.str-truncated.has-tooltip{ title: @topic.name }
- = truncate(@topic.name, length: max_topic_name_length)
+ - if @topic.title_or_name.length > max_topic_title_length
+ %h1.gl-mt-3.gl-str-truncated.has-tooltip{ title: @topic.title_or_name }
+ = truncate(@topic.title_or_name, length: max_topic_title_length)
- else
%h1.gl-mt-3
- = @topic.name
+ = @topic.title_or_name
- if @topic.description.present?
.topic-description.gl-ml-4.gl-mr-4
= markdown(@topic.description)
diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml
index 9b3a8c31d54..bd893ca3162 100644
--- a/app/views/groups/_home_panel.html.haml
+++ b/app/views/groups/_home_panel.html.haml
@@ -17,8 +17,7 @@
- if can?(current_user, :read_group, @group)
%span.gl-display-inline-block.gl-vertical-align-middle
= s_("GroupPage|Group ID: %{group_id}") % { group_id: @group.id }
- - button_class = "btn gl-button btn-sm btn-tertiary btn-default-tertiary home-panel-metadata"
- = clipboard_button(title: s_('GroupPage|Copy group ID'), text: @group.id, class: button_class)
+ = clipboard_button(title: s_('GroupPage|Copy group ID'), text: @group.id)
- if current_user
%span.gl-ml-3.gl-mb-3
= render 'shared/members/access_request_links', source: @group
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 95b3ad26e99..654ee70dbee 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
@@ -5,8 +5,8 @@
= s_('GroupsNew|Import groups from another instance of GitLab')
= link_to _('History'), history_import_bulk_imports_path, class: 'gl-link gl-ml-auto'
= render Pajamas::AlertComponent.new(dismissible: false,
- variant: :warning) do
- .gl-alert-body
+ variant: :warning) 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') }
- docs_link_end = '</a>'.html_safe
= s_('GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: docs_link_end }
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 ddd7481e0bd..04170c30a20 100644
--- a/app/views/groups/_import_group_from_file_panel.html.haml
+++ b/app/views/groups/_import_group_from_file_panel.html.haml
@@ -7,8 +7,8 @@
%h4
= _('Import group from file')
= render Pajamas::AlertComponent.new(variant: :warning,
- dismissible: false) do
- .gl-alert-body
+ 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 }
diff --git a/app/views/groups/_invite_groups_modal.html.haml b/app/views/groups/_invite_groups_modal.html.haml
index 22ef319348a..2e11f6cee4f 100644
--- a/app/views/groups/_invite_groups_modal.html.haml
+++ b/app/views/groups/_invite_groups_modal.html.haml
@@ -1,3 +1,3 @@
- return unless can_admin_group_member?(group)
-.js-invite-groups-modal{ data: common_invite_group_modal_data(group, GroupMember, 'false').merge(group_select_data(group)) }
+.js-invite-groups-modal{ data: common_invite_group_modal_data(group, GroupMember, 'false') }
diff --git a/app/views/groups/dependency_proxies/show.html.haml b/app/views/groups/dependency_proxies/show.html.haml
index 940a504438d..082f637e854 100644
--- a/app/views/groups/dependency_proxies/show.html.haml
+++ b/app/views/groups/dependency_proxies/show.html.haml
@@ -1,7 +1,5 @@
- page_title _("Dependency Proxy")
- @content_class = "limit-container-width" unless fluid_layout
-- dependency_proxy_available = Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public?
#js-dependency-proxy{ data: { group_path: @group.full_path,
- dependency_proxy_available: dependency_proxy_available.to_s,
no_manifests_illustration: image_path('illustrations/docker-empty-state.svg'), group_id: @group.id } }
diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml
index 8afa6316c56..209faa937dc 100644
--- a/app/views/groups/issues.html.haml
+++ b/app/views/groups/issues.html.haml
@@ -5,7 +5,7 @@
= content_for :meta_tags do
= auto_discovery_link_tag(:atom, safe_params.merge(rss_url_options).to_h, title: "#{@group.name} issues")
-- if Feature.enabled?(:vue_issues_list, @group, default_enabled: :yaml)
+- if Feature.enabled?(:vue_issues_list, @group)
.js-issues-list{ data: group_issues_list_data(@group, current_user) }
- if @can_bulk_update
= render_if_exists 'shared/issuable/group_bulk_update_sidebar', group: @group, type: :issues
diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml
index 5c0487db0fc..50a1b474504 100644
--- a/app/views/groups/milestones/index.html.haml
+++ b/app/views/groups/milestones/index.html.haml
@@ -9,7 +9,7 @@
= render 'shared/milestones/search_form'
= render 'shared/milestones_sort_dropdown'
- if can?(current_user, :admin_milestone, @group)
- = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm", data: { qa_selector: "new_group_milestone_link" }
+ = link_to _('New milestone'), new_group_milestone_path(@group), class: "btn gl-button btn-confirm gl-ml-3", data: { qa_selector: "new_group_milestone_link" }
- if @milestones.blank?
= render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index') do
diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml
index 750030601b7..58a78a8adc1 100644
--- a/app/views/groups/new.html.haml
+++ b/app/views/groups/new.html.haml
@@ -15,7 +15,7 @@
#import-group-pane.tab-pane
- if import_sources_enabled?
- - if Feature.enabled?(:bulk_import, default_enabled: :yaml)
+ - if Feature.enabled?(:bulk_import)
= render 'import_group_from_another_instance_panel'
.gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1
= render 'import_group_from_file_panel'
diff --git a/app/views/groups/runners/_group_runners.html.haml b/app/views/groups/runners/_group_runners.html.haml
deleted file mode 100644
index 876642474cd..00000000000
--- a/app/views/groups/runners/_group_runners.html.haml
+++ /dev/null
@@ -1,29 +0,0 @@
-- link = link_to _('Runner API'), help_page_path('api/runners.md')
-
-%h4
- = _('Group runners')
-
--# Proper policies should be implemented per
--# https://gitlab.com/gitlab-org/gitlab-foss/issues/45894
-.bs-callout.help-callout
- %p
- = _('These runners are shared across projects in this group.')
- = _('Group runners can be managed with the %{link}.').html_safe % { link: link }
-
- - if can?(current_user, :register_group_runners, @group)
- - if params[:ci_runner_templates]
- %hr
- = render partial: 'ci/runner/setup_runner_in_aws',
- locals: { registration_token: @group.runners_token }
- %hr
- = render partial: 'ci/runner/how_to_setup_runner',
- locals: { registration_token: @group.runners_token,
- type: 'group',
- reset_token_url: reset_registration_token_group_settings_ci_cd_path,
- project_path: '',
- group_path: @group.full_path }
- %br
- - else
- = _('Please contact an admin to register runners.')
- = link_to _('Learn more.'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'prevent-users-from-registering-runners'), target: '_blank', rel: 'noopener noreferrer'
-
diff --git a/app/views/groups/runners/_runner.html.haml b/app/views/groups/runners/_runner.html.haml
deleted file mode 100644
index b2d8b9668e7..00000000000
--- a/app/views/groups/runners/_runner.html.haml
+++ /dev/null
@@ -1,80 +0,0 @@
-.gl-responsive-table-row{ id: dom_id(runner) }
- .table-section.section-10.section-wrap
- .table-mobile-header{ role: 'rowheader' }= _('Type')
- .table-mobile-content
- - if runner.group_type?
- = gl_badge_tag s_('Runners|group'), variant: :success, size: :sm
- - else
- = gl_badge_tag s_('Runners|specific'), variant: :info, size: :sm
- - if runner.locked?
- = gl_badge_tag s_('Runners|locked'), variant: :warning, size: :sm
- - unless runner.active?
- = gl_badge_tag s_('Runners|paused'), { variant: :danger, size: :sm }, { title: s_('Runners|Not accepting jobs'), data: { toggle: 'tooltip', container: 'body' } }
-
- .table-section.section-30
- .table-mobile-header{ role: 'rowheader' }= s_('Runners|Runner')
- .table-mobile-content
- = link_to("##{runner.id} (#{runner.short_sha})", group_runner_path(@group, runner))
- .gl-text-truncate
- %span{ title: runner.description, data: { toggle: 'tooltip', container: 'body' } }
- = runner.description
-
- .table-section.section-10
- .table-mobile-header{ role: 'rowheader' }= _('Version')
- .table-mobile-content.str-truncated.has-tooltip{ title: runner.version }
- = runner.version
-
- .table-section.section-10
- .table-mobile-header{ role: 'rowheader' }= _('IP Address')
- .table-mobile-content.str-truncated.has-tooltip{ title: runner.ip_address }
- = runner.ip_address
-
- .table-section.section-5
- .table-mobile-header{ role: 'rowheader' }= _('Projects')
- .table-mobile-content
- - if runner.group_type?
- \-
- - else
- = runner.runner_projects.count(:all)
-
- .table-section.section-5
- .table-mobile-header{ role: 'rowheader' }= _('Jobs')
- .table-mobile-content
- = limited_counter_with_delimiter(runner.builds)
-
- .table-section.section-10.section-wrap
- .table-mobile-header{ role: 'rowheader' }= _('Tags')
- .table-mobile-content
- - runner.tags.map(&:name).sort.each do |tag|
- = gl_badge_tag tag, { variant: :info }, { class: 'str-truncated has-tooltip', title: tag }
-
- .table-section.section-10
- .table-mobile-header{ role: 'rowheader' }= _('Last contact')
- .table-mobile-content
- - contacted_at = runner_contacted_at(runner)
- - if contacted_at
- = time_ago_with_tooltip contacted_at
- - else
- = _('Never')
-
- .table-section.table-button-footer.section-10
- .btn-group.table-action-buttons
- .btn-group
- = link_to edit_group_runner_path(@group, runner), class: 'gl-button btn btn-default btn-icon has-tooltip', title: _('Edit'), ref: 'tooltip', aria: { label: _('Edit') }, data: { placement: 'top', container: 'body'} do
- = sprite_icon('pencil', css_class: 'gl-icon')
- .btn-group
- - if runner.active?
- = link_to pause_group_runner_path(@group, runner), method: :post, class: 'gl-button btn btn-default btn-icon', title: s_('Runners|Pause from accepting jobs'), ref: 'tooltip', aria: { label: _('Pause') }, data: { toggle: 'tooltip', container: 'body', confirm: _('Are you sure?') } do
- = sprite_icon('pause', css_class: 'gl-icon')
- - else
- = link_to resume_group_runner_path(@group, runner), method: :post, class: 'gl-button btn btn-default btn-icon', title: s_('Runners|Resume accepting jobs'), ref: 'tooltip', aria: { label: _('Resume') }, data: { toggle: 'tooltip', container: 'body'} do
- = sprite_icon('play', css_class: 'gl-icon')
- - if runner.belongs_to_more_than_one_project?
- - delete_runner_tooltip = _('Multi-project Runners cannot be removed')
- .btn-group.has-tooltip{ data: { container: 'body', placement: 'top' }, title: delete_runner_tooltip }
- .gl-button.btn.btn-danger.btn-icon{ 'aria-label' => delete_runner_tooltip, disabled: 'disabled' }
- = sprite_icon('close', css_class: 'gl-icon')
- - else
- .btn-group
- = link_to group_runner_path(@group, runner), method: :delete, class: 'gl-button btn btn-danger btn-icon has-tooltip', title: _('Remove'), ref: 'tooltip', aria: { label: _('Remove') }, data: { placement: 'top', container: 'body', confirm: _('Are you sure?'), confirm_btn_variant: "danger" } do
- = sprite_icon('close', css_class: 'gl-icon')
diff --git a/app/views/groups/runners/_settings.html.haml b/app/views/groups/runners/_settings.html.haml
index 087b06ee37d..7716a2f125f 100644
--- a/app/views/groups/runners/_settings.html.haml
+++ b/app/views/groups/runners/_settings.html.haml
@@ -1,119 +1,14 @@
-- if Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml)
- .gl-mb-6
- #update-shared-runners-form{ data: group_shared_runners_settings_data(@group) }
- .gl-card.gl-px-8.gl-py-6.gl-line-height-20
- .gl-card-body.gl-display-flex{ :class => "gl-p-0!" }
- .gl-banner-illustration
- = image_tag('illustrations/rocket-launch-md.svg', alt: s_('Runners|Rocket launch illustration'))
- .gl-banner-content
- %h1.gl-banner-title
- = s_('Runners|New group runners view')
- %p
- = s_('Runners|The new view gives you more space and better visibility into your fleet of runners.')
- %a.btn.btn-confirm.btn-md.gl-button{ :href => group_runners_path(@group) }
- %span.gl-button-text
- = s_('Runners|Take me there!')
-- else
- = render 'shared/runners/runner_description'
-
- %hr
-
- .row
- .col-sm-6
- = render 'groups/runners/group_runners'
- .col-sm-6
- = render 'groups/runners/shared_runners'
-
- %h4.underlined-title
- = _('Available runners: %{runners}').html_safe % { runners: limited_counter_with_delimiter(@all_group_runners) }
-
- -# haml-lint:disable NoPlainNodes
- .row
- .col-sm-9
- = form_tag group_settings_ci_cd_path, id: 'runners-search', method: :get, class: 'filter-form js-filter-form' do
- .filtered-search-wrapper.d-flex
- .filtered-search-box
- = dropdown_tag(_('Recent searches'),
- options: { wrapper_class: 'filtered-search-history-dropdown-wrapper',
- toggle_class: 'gl-button btn btn-default filtered-search-history-dropdown-toggle-button',
- dropdown_class: 'filtered-search-history-dropdown',
- content_class: 'filtered-search-history-dropdown-content' }) do
- .js-filtered-search-history-dropdown{ data: { full_path: group_settings_ci_cd_path } }
- .filtered-search-box-input-container.droplab-dropdown
- .scroll-container
- %ul.tokens-container.list-unstyled
- %li.input-token
- %input.form-control.filtered-search{ search_filter_input_options('runners') }
- #js-dropdown-hint.filtered-search-input-dropdown-menu.dropdown-menu.hint-dropdown
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item{ data: {hint: "#{'{{hint}}'}", tag: "#{'{{tag}}'}", action: "#{'{{hint === \'search\' ? \'submit\' : \'\' }}'}" } }
- = button_tag class: 'gl-button btn btn-link' do
- -# Encapsulate static class name `{{icon}}` inside #{} to bypass
- -# haml lint's ClassAttributeWithStaticValue
- %svg
- %use{ 'xlink:href': "#{'{{icon}}'}" }
- %span.js-filter-hint
- {{formattedKey}}
- #js-dropdown-operator.filtered-search-input-dropdown-menu.dropdown-menu
- %ul.filter-dropdown{ data: { dropdown: true, dynamic: true } }
- %li.filter-dropdown-item{ data: { value: "{{ title }}" } }
- = button_tag class: 'gl-button btn btn-link' do
- {{ title }}
- %span.btn-helptext
- {{ help }}
- #js-dropdown-admin-runner-status.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- - Ci::Runner::AVAILABLE_STATUSES.each do |status|
- %li.filter-dropdown-item{ data: { value: status } }
- = button_tag class: 'gl-button btn btn-link' do
- = status.titleize
-
- #js-dropdown-admin-runner-type.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- - Ci::Runner::AVAILABLE_TYPES.each do |runner_type|
- - next if runner_type == 'instance_type'
- %li.filter-dropdown-item{ data: { value: runner_type } }
- = button_tag class: 'gl-button btn btn-link' do
- = runner_type.titleize
-
- #js-dropdown-runner-tag.filtered-search-input-dropdown-menu.dropdown-menu
- %ul{ data: { dropdown: true } }
- %li.filter-dropdown-item{ data: { value: 'none' } }
- = button_tag class: 'gl-button btn btn-link' do
- = _('No Tag')
- %li.divider.droplab-item-ignore
- %ul.filter-dropdown{ data: { dynamic: true, dropdown: true } }
- %li.filter-dropdown-item
- = button_tag class: 'gl-button btn btn-link js-data-value' do
- %span.dropdown-light-content
- {{name}}
-
- = button_tag class: 'clear-search hidden' do
- = sprite_icon('close', size: 16, css_class: 'clear-search-icon')
- .filter-dropdown-container
- = render 'groups/runners/sort_dropdown'
-
- .col-sm-3.text-right-lg
- = _('Runners currently online: %{active_runners_count}') % { active_runners_count: limited_counter_with_delimiter(@all_group_runners.online) }
-
-
- - if @group_runners.any?
- .content-list{ data: { testid: 'runners-table' } }
- .table-holder
- .gl-responsive-table-row.table-row-header{ role: 'row' }
- .table-section.section-10{ role: 'rowheader' }= _('Type/State')
- .table-section.section-30{ role: 'rowheader' }= s_('Runners|Runner')
- .table-section.section-10{ role: 'rowheader' }= _('Version')
- .table-section.section-10{ role: 'rowheader' }= _('IP Address')
- .table-section.section-5{ role: 'rowheader' }= _('Projects')
- .table-section.section-5{ role: 'rowheader' }= _('Jobs')
- .table-section.section-10{ role: 'rowheader' }= _('Tags')
- .table-section.section-10{ role: 'rowheader' }= _('Last contact')
- .table-section.section-10{ role: 'rowheader' }
-
- - @group_runners.each do |runner|
- - runner = runner.present(current_user: current_user)
- = render 'groups/runners/runner', runner: runner
- = paginate @group_runners, theme: 'gitlab', :params => { :anchor => 'runners-settings' }
- - else
- .nothing-here-block= _('No runners found')
+.gl-mb-6
+ #update-shared-runners-form{ data: group_shared_runners_settings_data(@group) }
+.gl-card.gl-px-8.gl-py-6.gl-line-height-20
+ .gl-card-body.gl-display-flex{ :class => "gl-p-0!" }
+ .gl-banner-illustration
+ = image_tag('illustrations/rocket-launch-md.svg', alt: s_('Runners|Rocket launch illustration'))
+ .gl-banner-content
+ %h1.gl-banner-title
+ = s_('Runners|New group runners view')
+ %p
+ = s_('Runners|The new view gives you more space and better visibility into your fleet of runners.')
+ %a.btn.btn-confirm.btn-md.gl-button{ :href => group_runners_path(@group) }
+ %span.gl-button-text
+ = s_('Runners|Take me there!')
diff --git a/app/views/groups/runners/_shared_runners.html.haml b/app/views/groups/runners/_shared_runners.html.haml
deleted file mode 100644
index 15b1199b8c9..00000000000
--- a/app/views/groups/runners/_shared_runners.html.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-= render 'shared/runners/shared_runners_description'
-
-#update-shared-runners-form{ data: group_shared_runners_settings_data(@group) }
diff --git a/app/views/groups/runners/_sort_dropdown.html.haml b/app/views/groups/runners/_sort_dropdown.html.haml
deleted file mode 100644
index b7b10cecee8..00000000000
--- a/app/views/groups/runners/_sort_dropdown.html.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-- runners_sort_options = runners_sort_options_hash.map { |value, text| { value: value, text: text, href: page_filter_path(sort: value) } }
-
-= gl_redirect_listbox_tag runners_sort_options, @sort, class: 'gl-ml-3', data: { display: 'static' }
diff --git a/app/views/groups/runners/edit.html.haml b/app/views/groups/runners/edit.html.haml
index 4a5bab94246..04b9d88723f 100644
--- a/app/views/groups/runners/edit.html.haml
+++ b/app/views/groups/runners/edit.html.haml
@@ -1,11 +1,7 @@
- breadcrumb_title _('Edit')
- page_title _('Edit'), "##{@runner.id} (#{@runner.short_sha})"
-- if Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml)
- - add_to_breadcrumbs _('Runners'), group_runners_path(@group)
-- else
- - add_to_breadcrumbs _('CI/CD Settings'), group_settings_ci_cd_path(@group)
-
+- add_to_breadcrumbs _('Runners'), group_runners_path(@group)
- add_to_breadcrumbs "#{@runner.short_sha}", group_runner_path(@group, @runner)
diff --git a/app/views/groups/runners/show.html.haml b/app/views/groups/runners/show.html.haml
index 72701491c67..b6c0c8a707f 100644
--- a/app/views/groups/runners/show.html.haml
+++ b/app/views/groups/runners/show.html.haml
@@ -1,6 +1,3 @@
-- if Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml)
- - add_to_breadcrumbs _('Runners'), group_runners_path(@group)
-- else
- - add_to_breadcrumbs _('CI/CD Settings'), group_settings_ci_cd_path(@group)
+- add_to_breadcrumbs _('Runners'), group_runners_path(@group)
= render 'shared/runners/runner_details', runner: @runner
diff --git a/app/views/groups/settings/_export.html.haml b/app/views/groups/settings/_export.html.haml
index 62bc574231f..6cae416311e 100644
--- a/app/views/groups/settings/_export.html.haml
+++ b/app/views/groups/settings/_export.html.haml
@@ -3,8 +3,8 @@
.sub-section
%h4= s_('GroupSettings|Export group')
%p= _('Export this group with all related data.')
- = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mb-4') do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_class: 'gl-mb-4') 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') }
- docs_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: docs_link_end }
@@ -12,8 +12,8 @@
- export_information = _('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.') % { strong_text_start: '<strong>'.html_safe, strong_text_end: '</strong>'.html_safe}
= export_information.html_safe
= link_to _('Learn more.'), help_page_path('user/group/settings/import_export.md'), target: '_blank', rel: 'noopener noreferrer'
- = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do |c|
+ = c.body do
%p.gl-mb-0
%p= _('The following items will be exported:')
%ul
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index 1a2f770cd59..ecb31b37fd3 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -34,7 +34,7 @@
= render 'groups/settings/ip_restriction_registration_features_cta', f: f
= render_if_exists 'groups/settings/ip_restriction', f: f, group: @group
= render_if_exists 'groups/settings/allowed_email_domain', f: f, group: @group
- - if Feature.enabled?(:group_wiki_settings_toggle, @group, default_enabled: :yaml)
+ - if @group.licensed_feature_available?(:group_wikis)
= render_if_exists 'groups/settings/wiki', f: f, group: @group
= render 'groups/settings/lfs', f: f
= render 'groups/settings/project_creation_level', f: f, group: @group
diff --git a/app/views/groups/settings/_remove_button.html.haml b/app/views/groups/settings/_remove_button.html.haml
index 66d6b516a86..e765638953a 100644
--- a/app/views/groups/settings/_remove_button.html.haml
+++ b/app/views/groups/settings/_remove_button.html.haml
@@ -1,8 +1,8 @@
- remove_form_id = local_assigns.fetch(:remove_form_id, nil)
- if group.paid?
- = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5', alert_data: { testid: 'group-has-linked-subscription-alert' }) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5', alert_data: { testid: 'group-has-linked-subscription-alert' }) do |c|
+ = c.body do
= html_escape(_("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.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/index', anchor: 'change-the-linked-namespace')}\">".html_safe, linkEnd: '</a>'.html_safe }
.js-confirm-danger{ data: group_settings_confirm_modal_data(group, remove_form_id) }
diff --git a/app/views/groups/settings/_transfer.html.haml b/app/views/groups/settings/_transfer.html.haml
index f5d9d0e2587..e65c3cd13f6 100644
--- a/app/views/groups/settings/_transfer.html.haml
+++ b/app/views/groups/settings/_transfer.html.haml
@@ -13,7 +13,7 @@
%li= s_('GroupSettings|You will need to update your local repositories to point to the new location.')
%li= s_("GroupSettings|If the parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.")
- if group.paid?
- = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false, alert_class: 'gl-mb-5') do |c|
+ = c.body do
= html_escape(_("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.")) % { linkStart: "<a href=\"#{help_page_path('subscriptions/index', anchor: 'change-the-linked-namespace')}\">".html_safe, linkEnd: '</a>'.html_safe }
.js-transfer-group-form{ data: initial_data }
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 78ce981eb07..c4ce76c43ec 100644
--- a/app/views/groups/settings/packages_and_registries/show.html.haml
+++ b/app/views/groups/settings/packages_and_registries/show.html.haml
@@ -1,9 +1,7 @@
- breadcrumb_title _('Packages & Registries')
- page_title _('Packages & Registries')
- @content_class = 'limit-container-width' unless fluid_layout
-- dependency_proxy_available = Feature.enabled?(:dependency_proxy_for_private_groups, default_enabled: true) || @group.public?
%section#js-packages-and-registries-settings{ data: { default_expanded: expanded_by_default?.to_s,
group_path: @group.full_path,
- dependency_proxy_available: dependency_proxy_available.to_s,
group_dependency_proxy_path: group_dependency_proxy_path(@group) } }
diff --git a/app/views/help/instance_configuration.html.haml b/app/views/help/instance_configuration.html.haml
index 411a81cb976..b6d27123be4 100644
--- a/app/views/help/instance_configuration.html.haml
+++ b/app/views/help/instance_configuration.html.haml
@@ -10,6 +10,7 @@
= render 'help/instance_configuration/size_limits'
= render 'help/instance_configuration/package_registry'
= render 'help/instance_configuration/rate_limits'
+ = render 'help/instance_configuration/ci_cd_limits'
%p
%strong= _("Table of contents")
diff --git a/app/views/help/instance_configuration/_ci_cd_limits.html.haml b/app/views/help/instance_configuration/_ci_cd_limits.html.haml
new file mode 100644
index 00000000000..bd5b8a6f10d
--- /dev/null
+++ b/app/views/help/instance_configuration/_ci_cd_limits.html.haml
@@ -0,0 +1,52 @@
+- ci_cd_limits = @instance_configuration.settings[:ci_cd_limits]
+- return unless ci_cd_limits.present?
+
+- content_for :table_content do
+ %li= link_to _('CI/CD limits'), '#ci-cd-limits'
+
+- content_for :settings_content do
+ %h2#ci-cd-limits
+ = _('CI/CD limits')
+
+ %p
+ = s_('CICD|There are several CI/CD limits in place.')
+ .table-responsive
+ %table
+ %thead
+ %tr
+ %th= s_('CICD|Limit')
+ - ci_cd_limits.each_key do |title|
+ %th= title.to_s.humanize
+ %tbody
+ %tr
+ %td= s_('AdminSettings|Maximum number of jobs in a single pipeline')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_pipeline_size])
+ %tr
+ %td= s_('AdminSettings|Total number of jobs in currently active pipelines')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_active_jobs])
+ %tr
+ %td= s_('AdminSettings|Maximum number of active pipelines per project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_active_pipelines])
+ %tr
+ %td= s_('AdminSettings|Maximum number of pipeline subscriptions to and from a project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_project_subscriptions])
+ %tr
+ %td= s_('AdminSettings|Maximum number of pipeline schedules')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_pipeline_schedules])
+ %tr
+ %td= s_('AdminSettings|Maximum number of DAG dependencies that a job can have')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_needs_size_limit])
+ %tr
+ %td= s_('AdminSettings|Maximum number of runners registered per group')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_registered_group_runners])
+ %tr
+ %td= s_('AdminSettings|Maximum number of runners registered per project')
+ - ci_cd_limits.each_value do |limits|
+ %td= instance_configuration_disabled_cell_html(limits[:ci_registered_project_runners])
diff --git a/app/views/help/instance_configuration/_size_limits.html.haml b/app/views/help/instance_configuration/_size_limits.html.haml
index b592eeed020..90501450385 100644
--- a/app/views/help/instance_configuration/_size_limits.html.haml
+++ b/app/views/help/instance_configuration/_size_limits.html.haml
@@ -24,6 +24,9 @@
%td= _('Maximum push size')
%td= instance_configuration_human_size_cell(size_limits[:receive_max_input_size])
%tr
+ %td= _('Maximum export size')
+ %td= instance_configuration_human_size_cell(size_limits[:max_export_size])
+ %tr
%td= _('Maximum import size')
%td= instance_configuration_human_size_cell(size_limits[:max_import_size])
%tr
diff --git a/app/views/import/bulk_imports/status.html.haml b/app/views/import/bulk_imports/status.html.haml
index 2aae8811678..71866bab30b 100644
--- a/app/views/import/bulk_imports/status.html.haml
+++ b/app/views/import/bulk_imports/status.html.haml
@@ -8,4 +8,5 @@
jobs_path: realtime_changes_import_bulk_imports_path(format: :json),
source_url: @source_url,
group_path_regex: Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX_JS,
+ history_path: history_import_bulk_imports_path,
group_url_error_message: group_url_error_message } }
diff --git a/app/views/import/shared/_errors.html.haml b/app/views/import/shared/_errors.html.haml
index aa6fcc445fd..ae54d0544f3 100644
--- a/app/views/import/shared/_errors.html.haml
+++ b/app/views/import/shared/_errors.html.haml
@@ -1,7 +1,7 @@
- if @errors.present?
= render Pajamas::AlertComponent.new(variant: :danger,
dismissible: false,
- alert_class: 'gl-mb-5') do
- .gl-alert-body
+ alert_class: 'gl-mb-5') do |c|
+ = c.body do
- @errors.each do |error|
= error
diff --git a/app/views/jira_connect/users/show.html.haml b/app/views/jira_connect/users/show.html.haml
index 29805a2c42d..569c4587f14 100644
--- a/app/views/jira_connect/users/show.html.haml
+++ b/app/views/jira_connect/users/show.html.haml
@@ -11,7 +11,7 @@
= s_('JiraService|You can now close this window and%{br}return to the GitLab for Jira application.').html_safe % { br: '<br>'.html_safe }
- if @jira_app_link
- %p= external_link s_('Integrations|Return to GitLab for Jira'), @jira_app_link, class: 'gl-button btn btn-confirm'
+ %p= link_to s_('Integrations|Return to GitLab for Jira'), @jira_app_link, class: 'gl-button btn btn-confirm'
%p= link_to _('Sign out'), destroy_user_session_path, method: :post
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 15cd9bece71..55c66454d0b 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -3,32 +3,14 @@
%head{ prefix: "og: http://ogp.me/ns#" }
%meta{ charset: "utf-8" }
+ %title= page_title(site_name)
+
= render 'layouts/loading_hints'
%meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' }
= render 'layouts/startup_js'
- -# Open Graph - http://ogp.me/
- %meta{ property: 'og:type', content: "object" }
- %meta{ property: 'og:site_name', content: site_name }
- %meta{ property: 'og:title', content: page_title }
- %meta{ property: 'og:description', content: page_description }
- %meta{ property: 'og:image', content: page_image }
- %meta{ property: 'og:image:width', content: '64' }
- %meta{ property: 'og:image:height', content: '64' }
- %meta{ property: 'og:url', content: request.base_url + request.fullpath }
-
- -# Twitter Card - https://dev.twitter.com/cards/types/summary
- %meta{ property: 'twitter:card', content: "summary" }
- %meta{ property: 'twitter:title', content: page_title }
- %meta{ property: 'twitter:description', content: page_description }
- %meta{ property: 'twitter:image', content: page_image }
- = page_card_meta_tags
-
- %title= page_title(site_name)
- %meta{ name: "description", content: page_description }
-
- if page_canonical_link
%link{ rel: 'canonical', href: page_canonical_link }
@@ -67,27 +49,38 @@
= yield :project_javascripts
- = csrf_meta_tags
- = csp_meta_tag
- = action_cable_meta_tag
+ -# Open Graph - http://ogp.me/
+ %meta{ property: 'og:type', content: "object" }
+ %meta{ property: 'og:site_name', content: site_name }
+ %meta{ property: 'og:title', content: page_title }
+ %meta{ property: 'og:description', content: page_description }
+ %meta{ property: 'og:image', content: page_image }
+ %meta{ property: 'og:image:width', content: '64' }
+ %meta{ property: 'og:image:height', content: '64' }
+ %meta{ property: 'og:url', content: request.base_url + request.fullpath }
+
+ -# Twitter Card - https://dev.twitter.com/cards/types/summary
+ %meta{ property: 'twitter:card', content: "summary" }
+ %meta{ property: 'twitter:title', content: page_title }
+ %meta{ property: 'twitter:description', content: page_description }
+ %meta{ property: 'twitter:image', content: page_image }
+ = page_card_meta_tags
+
+ %meta{ name: "description", content: page_description }
%meta{ name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1' }
%meta{ name: 'theme-color', content: user_theme_primary_color }
+ = csrf_meta_tags
+ = csp_meta_tag
+ = action_cable_meta_tag
+
-# Apple Safari/iOS home screen icons
- = favicon_link_tag 'touch-icon-iphone.png', rel: 'apple-touch-icon'
- = favicon_link_tag 'touch-icon-ipad.png', rel: 'apple-touch-icon', sizes: '76x76'
- = favicon_link_tag 'touch-icon-iphone-retina.png', rel: 'apple-touch-icon', sizes: '120x120'
- = favicon_link_tag 'touch-icon-ipad-retina.png', rel: 'apple-touch-icon', sizes: '152x152'
- %link{ rel: 'mask-icon', href: image_path('logo.svg'), color: 'rgb(226, 67, 41)' }
+ = favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon'
-# OpenSearch
%link{ href: search_opensearch_path(format: :xml), rel: 'search', title: 'Search GitLab', type: 'application/opensearchdescription+xml' }
- -# Windows 8 pinned site tile
- %meta{ name: 'msapplication-TileImage', content: image_path('msapplication-tile.png') }
- %meta{ name: 'msapplication-TileColor', content: '#30353E' }
-
= yield :meta_tags
= render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id')
diff --git a/app/views/layouts/_header_search.html.haml b/app/views/layouts/_header_search.html.haml
index f7b7aac6de4..3c62180214b 100644
--- a/app/views/layouts/_header_search.html.haml
+++ b/app/views/layouts/_header_search.html.haml
@@ -1,4 +1,4 @@
-#js-header-search.header-search.is-not-active.gl-relative{ data: { 'search-context' => header_search_context.to_json,
+#js-header-search.header-search.is-not-active.gl-relative.gl-w-full{ data: { 'search-context' => header_search_context.to_json,
'search-path' => search_path,
'issues-path' => issues_dashboard_path,
'mr-path' => merge_requests_dashboard_path,
diff --git a/app/views/layouts/_loading_hints.html.haml b/app/views/layouts/_loading_hints.html.haml
index 9b2815ea9bc..b3bb474ea43 100644
--- a/app/views/layouts/_loading_hints.html.haml
+++ b/app/views/layouts/_loading_hints.html.haml
@@ -12,4 +12,4 @@
= preload_link_tag(path_to_stylesheet('application'), crossorigin: css_crossorigin)
= preload_link_tag(path_to_stylesheet("highlight/themes/#{user_color_scheme}"), crossorigin: css_crossorigin)
- if Gitlab::Tracking.enabled? && Gitlab::Tracking.collector_hostname
- %link{ rel: 'preconnect', href: Gitlab::Tracking.collector_hostname, crossorigin: '' }
+ %link{ rel: 'preconnect', href: "https://#{Gitlab::Tracking.collector_hostname}", crossorigin: '' }
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index 5c9c6a06ac1..cee5c1b6b69 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -16,7 +16,7 @@
%h1.mb-3.font-weight-normal
= current_appearance&.title.presence || _('GitLab')
.row.mb-3
- .col-sm-7.order-12.order-sm-1.brand-holder
+ .col-md-6.order-12.order-sm-1.brand-holder
- unless recently_confirmed_com?
= brand_image
- if current_appearance&.description?
@@ -36,7 +36,7 @@
= render_if_exists 'layouts/devise_help_text'
- .col-sm-5.order-1.new-session-forms-container{ class: recently_confirmed_com? ? 'order-sm-first' : 'order-sm-12' }
+ .col-md-6.order-1.new-session-forms-container{ class: recently_confirmed_com? ? 'order-sm-first' : 'order-sm-12' }
= yield
= render 'devise/shared/footer', footer_message: footer_message
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index c15a5e54a42..3cae8186750 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -4,16 +4,15 @@
%header.navbar.navbar-gitlab.navbar-expand-sm.js-navbar{ data: { qa_selector: 'navbar' } }
%a.gl-sr-only.gl-accessibility{ href: "#content-body" } Skip to content
.container-fluid
- .header-content
- .title-container.hide-when-top-nav-responsive-open
+ .header-content.js-header-content
+ .title-container.hide-when-top-nav-responsive-open.gl-transition-medium.gl-display-flex.gl-align-items-stretch.gl-pt-0
%h1.title
%span.gl-sr-only GitLab
= link_to root_path, title: _('Dashboard'), id: 'logo', **tracking_attrs('main_navigation', 'click_gitlab_logo_link', 'navigation') do
- = brand_header_logo
- - logo_text = brand_header_logo_type
- - if logo_text.present?
- %span.logo-text.d-none.d-lg-block.gl-ml-3
- = logo_text
+ %span{ :class => "gl-display-none gl-lg-display-flex" }
+ = brand_header_logo({add_gitlab_white_text: true})
+ %span{ :class => "gl-lg-display-none! gl-display-flex" }
+ = brand_header_logo
- if Gitlab.com_and_canary?
= link_to Gitlab::Saas.canary_toggle_com_url, class: 'canary-badge bg-transparent', data: { qa_selector: 'canary_badge_link' }, target: :_blank, rel: 'noopener noreferrer' do
= gl_badge_tag({ variant: :success, size: :sm }) do
@@ -32,15 +31,15 @@
.gl-display-none.gl-sm-display-block
= render "layouts/nav/top_nav"
- .navbar-collapse.collapse
- %ul.nav.navbar-nav
+ .navbar-collapse.gl-transition-medium.collapse
+ %ul.nav.navbar-nav.gl-w-full
- if current_user
- = render 'layouts/header/new_dropdown', class: 'gl-display-none gl-sm-display-block'
+ = render 'layouts/header/new_dropdown', class: 'gl-display-none gl-sm-display-block gl-white-space-nowrap gl-text-right'
- if top_nav_show_search
- search_menu_item = top_nav_search_menu_item_attrs
- %li.nav-item.header-search-new.d-none.d-lg-block.m-auto
+ %li.nav-item.header-search-new.gl-display-none.gl-lg-display-block.m-auto.gl-w-full
- unless current_controller?(:search)
- - if Feature.enabled?(:new_header_search, default_enabled: :yaml)
+ - if Feature.enabled?(:new_header_search)
= render 'layouts/header_search'
- else
= render 'layouts/search'
@@ -61,7 +60,7 @@
= number_with_delimiter(issues_count)
- if header_link?(:merge_requests)
= nav_link(path: 'dashboard#merge_requests', html_options: { class: "user-counter dropdown" }) do
- - top_level_link = Feature.enabled?(:mr_attention_requests, default_enabled: :yaml) ? attention_requested_mrs_dashboard_path : assigned_mrs_dashboard_path
+ - top_level_link = current_user.mr_attention_requests_enabled? ? attention_requested_mrs_dashboard_path : assigned_mrs_dashboard_path
= link_to top_level_link, class: 'dashboard-shortcuts-merge_requests', title: _('Merge requests'), aria: { label: _('Merge requests') },
data: { qa_selector: 'merge_requests_shortcut_button',
toggle: "dropdown",
@@ -78,7 +77,7 @@
%ul
%li.dropdown-header
= _('Merge requests')
- - if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+ - if current_user.mr_attention_requests_enabled?
%li#js-need-attention-nav
#js-need-attention-nav-onboarding
= link_to attention_requested_mrs_dashboard_path, class: 'gl-display-flex! gl-align-items-center js-prefetch-document' do
@@ -87,12 +86,18 @@
%li.divider
%li
= link_to assigned_mrs_dashboard_path, class: 'gl-display-flex! gl-align-items-center js-prefetch-document' do
- = _('Assigned to you')
+ - if current_user.mr_attention_requests_enabled?
+ = _('Assignee')
+ - else
+ = _('Assigned to you')
= gl_badge_tag({ variant: :neutral, size: :sm }, { class: "js-assigned-mr-count gl-ml-auto" }) do
= user_merge_requests_counts[:assigned]
%li
= link_to reviewer_mrs_dashboard_path, class: 'gl-display-flex! gl-align-items-center js-prefetch-document' do
- = _('Review requests for you')
+ - if current_user.mr_attention_requests_enabled?
+ = _('Reviewer')
+ - else
+ = _('Review requests for you')
= gl_badge_tag({ variant: :neutral, size: :sm }, { class: "js-reviewer-mr-count gl-ml-auto" }) do
= user_merge_requests_counts[:review_requested]
- if header_link?(:todos)
diff --git a/app/views/layouts/header/_logo_with_title.html.haml b/app/views/layouts/header/_logo_with_title.html.haml
index 0b9d4e2eea4..66614bdb21e 100644
--- a/app/views/layouts/header/_logo_with_title.html.haml
+++ b/app/views/layouts/header/_logo_with_title.html.haml
@@ -1,4 +1,5 @@
%header.navbar.fixed-top.navbar-gitlab.justify-content-center
- = render partial: 'shared/logo', formats: :svg
- %span.logo-text.d-none.d-lg-block.gl-ml-3.pt-1
- = render partial: 'shared/logo_type', formats: :svg
+ .gl-display-none.gl-lg-display-block
+ = render partial: 'shared/logo_with_white_text', formats: :svg
+ .gl-lg-display-none
+ = render partial: 'shared/logo', formats: :svg
diff --git a/app/views/layouts/header/_new_dropdown.html.haml b/app/views/layouts/header/_new_dropdown.html.haml
index a0b271fdafa..e5b03acbe3b 100644
--- a/app/views/layouts/header/_new_dropdown.html.haml
+++ b/app/views/layouts/header/_new_dropdown.html.haml
@@ -6,8 +6,8 @@
- return if menu_sections.empty?
-%li.header-new.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_action: "click_dropdown" } }
- = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip", id: "js-onboarding-new-project-link", title: title, ref: 'tooltip', aria: { label: title }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static', qa_selector: 'new_menu_toggle' } do
+%li.header-new.gl-flex-grow-1.gl-flex-shrink-1.dropdown{ class: top_class, data: { track_label: "new_dropdown", track_action: "click_dropdown" } }
+ = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip gl-display-inline-block!", id: "js-onboarding-new-project-link", title: title, ref: 'tooltip', aria: { label: title }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static', qa_selector: 'new_menu_toggle' } do
= sprite_icon('plus-square')
= sprite_icon('chevron-down', css_class: 'caret-down')
.dropdown-menu.dropdown-menu-right.dropdown-extended-height
diff --git a/app/views/layouts/header/_registration_enabled_callout.html.haml b/app/views/layouts/header/_registration_enabled_callout.html.haml
index affee15c4d0..03e961bda8f 100644
--- a/app/views/layouts/header/_registration_enabled_callout.html.haml
+++ b/app/views/layouts/header/_registration_enabled_callout.html.haml
@@ -5,10 +5,10 @@
alert_class: 'js-registration-enabled-callout',
alert_data: { feature_id: Users::CalloutsHelper::REGISTRATION_ENABLED_CALLOUT,
dismiss_endpoint: callouts_path },
- close_button_data: { testid: 'close-registration-enabled-callout' }) do
- .gl-alert-body
+ close_button_data: { testid: 'close-registration-enabled-callout' }) do |c|
+ = c.body do
= _('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.')
- .gl-alert-actions
+ = c.actions do
= link_to general_admin_application_settings_path(anchor: 'js-signup-settings'), class: 'btn gl-alert-action btn-confirm btn-md gl-button' do
%span.gl-button-text
= _('Turn off')
diff --git a/app/views/layouts/header/_storage_enforcement_banner.html.haml b/app/views/layouts/header/_storage_enforcement_banner.html.haml
index 92c02d6ecfd..6613130fdf3 100644
--- a/app/views/layouts/header/_storage_enforcement_banner.html.haml
+++ b/app/views/layouts/header/_storage_enforcement_banner.html.haml
@@ -8,7 +8,7 @@
alert_data: { feature_id: banner_info[:callouts_feature_name],
dismiss_endpoint: banner_info[:callouts_path],
group_id: namespace.id,
- defer_links: "true" }) do
- .gl-alert-body
+ defer_links: "true" }) do |c|
+ = c.body do
= banner_info[:text]
= banner_info[:learn_more_link]
diff --git a/app/views/layouts/in_product_marketing_mailer.html.haml b/app/views/layouts/in_product_marketing_mailer.html.haml
index 679a2d4b8b3..65c68c95d9a 100644
--- a/app/views/layouts/in_product_marketing_mailer.html.haml
+++ b/app/views/layouts/in_product_marketing_mailer.html.haml
@@ -170,7 +170,7 @@
%table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", width: "100%" }
%tr
%td{ align: "left", style: "padding: 0 20px;" }
- = about_link('mailers/in_product_marketing/gitlab-logo-gray-rgb.png', 200)
+ = about_link('mailers/gitlab_logo_black_text.png', 200)
%tr
%td{ "aria-hidden" => "true", height: "30", style: "font-size: 0; line-height: 0;" }
diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml
index c2eb6b68024..580b8e67a3c 100644
--- a/app/views/layouts/mailer.html.haml
+++ b/app/views/layouts/mailer.html.haml
@@ -1,7 +1,7 @@
= content_for :footer do
%tr.footer
%td
- %img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_footer_logo.gif') }
+ %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')
diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml
index 3c52c430868..fde4e74fb7a 100644
--- a/app/views/layouts/nav/_breadcrumbs.html.haml
+++ b/app/views/layouts/nav/_breadcrumbs.html.haml
@@ -18,9 +18,8 @@
= breadcrumb_list_item link_to(extra[:text], extra[:link])
= render "layouts/nav/breadcrumbs/collapsed_inline_list", location: :after
- unless @skip_current_level_breadcrumb
- %li
- %h2.breadcrumbs-sub-title{ data: { qa_selector: 'breadcrumb_sub_title_content' } }
- = link_to @breadcrumb_title, breadcrumb_title_link
+ %li{ data: { testid: 'breadcrumb-current-link', qa_selector: 'breadcrumb_current_link' } }
+ = link_to @breadcrumb_title, breadcrumb_title_link
-# haml-lint:disable InlineJavaScript
%script{ type: 'application/ld+json' }
:plain
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index 94c708783e4..02565a8f573 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -103,10 +103,6 @@
= link_to admin_health_check_path, title: _('Health Check') do
%span
= _('Health Check')
- = nav_link(controller: :requests_profiles) do
- = link_to admin_requests_profiles_path, title: _('Requests Profiles') do
- %span
- = _('Requests Profiles')
- if Gitlab::CurrentSettings.current_application_settings.grafana_enabled?
= nav_link do
= link_to Gitlab::CurrentSettings.current_application_settings.grafana_url, target: '_blank', title: _('Metrics Dashboard'), rel: 'noopener noreferrer' do
diff --git a/app/views/layouts/terms.html.haml b/app/views/layouts/terms.html.haml
index caa46b7bc56..91301e1e226 100644
--- a/app/views/layouts/terms.html.haml
+++ b/app/views/layouts/terms.html.haml
@@ -1,10 +1,11 @@
!!! 5
- add_page_specific_style 'page_bundles/terms'
- @hide_breadcrumbs = true
+- body_classes = [user_application_theme]
%html{ lang: I18n.locale, class: page_class }
= render "layouts/head"
- %body{ data: { page: body_data_page } }
+ %body{ class: body_classes, data: { page: body_data_page } }
.layout-page.terms{ class: page_class }
.content-wrapper.gl-pb-5
.mobile-overlay
@@ -17,11 +18,7 @@
.content{ id: "content-body" }
.gl-card
.gl-card-header
- = brand_header_logo
- - logo_text = brand_header_logo_type
- - if logo_text.present?
- %span.logo-text.gl-ml-3
- = logo_text
+ = brand_header_logo({add_gitlab_black_text: true})
- if header_link?(:user_dropdown)
.navbar-collapse
%ul.nav.navbar-nav
diff --git a/app/views/layouts/unknown_user_mailer.html.haml b/app/views/layouts/unknown_user_mailer.html.haml
index 2eb7b400604..7f0d1dc01dd 100644
--- a/app/views/layouts/unknown_user_mailer.html.haml
+++ b/app/views/layouts/unknown_user_mailer.html.haml
@@ -1,7 +1,7 @@
= content_for :footer do
%tr.footer
%td.gitlab-info
- %img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_footer_logo.gif') }
+ %img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png') }
%p.gitlab-info-text
= html_escape(_("GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate")) % { br_tag: '<br/>'.html_safe }
diff --git a/app/views/notify/approved_merge_request_email.html.haml b/app/views/notify/approved_merge_request_email.html.haml
new file mode 100644
index 00000000000..4393186a8ad
--- /dev/null
+++ b/app/views/notify/approved_merge_request_email.html.haml
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+%html{ lang: "en" }
+ %head
+ %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/
+ %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/
+ %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/
+ %title= message.subject
+ :css
+ /* CLIENT-SPECIFIC STYLES */
+ body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+ table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
+ img { -ms-interpolation-mode: bicubic; }
+
+ /* iOS BLUE LINKS */
+ a[x-apple-data-detectors] {
+ color: inherit !important;
+ text-decoration: none !important;
+ font-size: inherit !important;
+ font-family: inherit !important;
+ font-weight: inherit !important;
+ line-height: inherit !important;
+ }
+
+ /* ANDROID MARGIN HACK */
+ body { margin:0 !important; }
+ div[style*="margin: 16px 0"] { margin:0 !important; }
+
+ @media only screen and (max-width: 639px) {
+ body, #body {
+ min-width: 320px !important;
+ }
+ table.wrapper {
+ width: 100% !important;
+ min-width: 320px !important;
+ }
+ table.wrapper > tbody > tr > td {
+ border-left: 0 !important;
+ border-right: 0 !important;
+ border-radius: 0 !important;
+ padding-left: 10px !important;
+ padding-right: 10px !important;
+ }
+ }
+
+ ul.users-list {
+ list-style: none;
+ padding: 0px;
+ display: block;
+ margin-top: 0px;
+ }
+ ul.users-list li {
+ display: inline-block;
+ padding-right: 12px;
+ padding-top: 8px;
+ }
+
+ %body{ style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;height:100%;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
+ %table#body{ border: "0", cellpadding: "0", cellspacing: "0", style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;" }
+ %tbody
+ %tr.line
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
+ %tr.header
+ %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", height: "55", src: image_url('mailers/gitlab_logo.png'), width: "55" }/
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
+ %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#ffffff;text-align:left;padding:18px 25px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.content{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" }
+ %tbody
+ %tr.success
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;color:#ffffff;background-color:#31af64;" }
+ %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;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" }
+ %img{ alt: "✓", height: "13", src: image_url('mailers/ci_pipeline_notif_v1/icon-check-green-inverted.gif'), style: "display:block;", width: "13" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" }
+ - if @merge_request.respond_to? :approvals_required
+ %span Merge request was approved (#{@merge_request.approvals.count}/#{@merge_request.approvals_required})
+ - else
+ %span Merge request was approved
+ %tr.spacer
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" }
+ &nbsp;
+ %tr.section
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4;text-align:center;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;width:100%;" }
+ %tbody
+ %tr{ style: 'width:100%;' }
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;text-align:center;" }
+ %img{ src: image_url('mailers/approval/icon-merge-request-gray.gif'), style: "height:18px;width:18px;margin-bottom:-4px;", alt: "Merge request icon" }
+ %span{ style: "font-weight: 600;color:#333333;" } Merge request
+ %a{ href: merge_request_url(@merge_request), style: "font-weight: 600;color:#3777b0;text-decoration:none" }= @merge_request.to_reference
+ %span was approved by
+ %img.avatar{ height: "24", src: avatar_icon_for_user(@approved_by, 24, only_path: false), style: "border-radius:12px;margin:-7px 0 -7px 3px;", width: "24", alt: "Avatar" }/
+ %a.muted{ href: user_url(@approved_by), style: "color:#333333;text-decoration:none;" }
+ = @approved_by.name
+ %tr.spacer
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" }
+ &nbsp;
+ %tr.section
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" }
+ - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name
+ - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner)
+ %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" }
+ = namespace_name
+ \/
+ %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" }
+ = @project.name
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" }
+ %tbody
+ %tr
+ %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-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" }
+ %span.muted{ style: "color:#333333;text-decoration:none;" }
+ = @merge_request.source_branch
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" }
+ %img.avatar{ height: "24", src: avatar_icon_for_user(@merge_request.author, 24, only_path: false), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" }
+ %a.muted{ href: user_url(@merge_request.author), style: "color:#333333;text-decoration:none;" }
+ = @merge_request.author.name
+
+ - if @merge_request.assignees.any?
+ = render 'users_list', users: @merge_request.assignees, user_label: assignees_label(@merge_request, include_value: false)
+
+ - if @merge_request.reviewers.any?
+ = render 'users_list', users: @merge_request.reviewers, user_label: reviewers_label(@merge_request, include_value: false)
+ - if Gitlab.ee?
+ -# EE-specific start
+ = render 'layouts/mailer/additional_text'
+ -# EE-specific end
+
+ %tr.footer
+ %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 }
diff --git a/app/views/notify/approved_merge_request_email.text.haml b/app/views/notify/approved_merge_request_email.text.haml
new file mode 100644
index 00000000000..476da7f9af7
--- /dev/null
+++ b/app/views/notify/approved_merge_request_email.text.haml
@@ -0,0 +1,9 @@
+Merge request #{@merge_request.to_reference} was approved by #{sanitize_name(@approved_by.name)}
+
+Merge request URL: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
+
+= merge_path_description(@merge_request, 'to')
+
+Author: #{sanitize_name(@merge_request.author_name)}
+= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/notify/build_ios_app_guide_email.html.haml b/app/views/notify/build_ios_app_guide_email.html.haml
new file mode 100644
index 00000000000..e9f23d3c0f9
--- /dev/null
+++ b/app/views/notify/build_ios_app_guide_email.html.haml
@@ -0,0 +1,13 @@
+%tr
+ %td{ bgcolor: "#ffffff", height: "auto", style: "max-width: 600px; width: 100%; text-align: center; height: 200px; padding: 25px 15px; mso-line-height-rule: exactly; min-height: 40px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;", valign: "middle", width: "100%" }
+ = inline_image_link(@message.logo_path, { width: '150', style: 'width: 150px;' })
+ %h1{ style: "font-size: 40px; line-height: 46x; color: #000000; padding: 20px 0 0 0; font-weight: normal;" }
+ = @message.title
+%tr
+ %td{ style: "padding: 10px 20px 30px 20px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif; color:#000000; font-size: 18px; line-height: 24px;" }
+ %p{ style: "margin: 0 0 20px 0;" }
+ = @message.body_line1.html_safe
+%tr
+ %td{ align: "center", style: "padding: 20px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;" }
+ .cta_link.cta_link_primary= @message.cta_link
+ .cta_link.cta_link_secondary= @message.cta2_link
diff --git a/app/views/notify/build_ios_app_guide_email.text.erb b/app/views/notify/build_ios_app_guide_email.text.erb
new file mode 100644
index 00000000000..59757b7c1b0
--- /dev/null
+++ b/app/views/notify/build_ios_app_guide_email.text.erb
@@ -0,0 +1,13 @@
+<%= @message.title %>
+
+<%= @message.body_line1 %>
+
+<%= @message.cta_link %>
+
+<%= @message.cta2_link %>
+
+<%= @message.footer_links %>
+
+<%= @message.address %>
+
+<%= @message.unsubscribe %>
diff --git a/app/views/notify/inactive_project_deletion_warning_email.html.haml b/app/views/notify/inactive_project_deletion_warning_email.html.haml
new file mode 100644
index 00000000000..52253ce3076
--- /dev/null
+++ b/app/views/notify/inactive_project_deletion_warning_email.html.haml
@@ -0,0 +1,28 @@
+- project_link = link_to(_("%{project_name}") % { project_name: @project.name }, @project.http_url_to_repo)
+- projects_api_link = link_to(_("Projects API"), help_page_url('api/projects'))
+- events_api_link = link_to(_("Events API"), help_page_url('api/events', anchor: 'list-a-projects-visible-events'))
+
+%p
+ = _('Hi %{username},') % { username: sanitize_name(@user.name) }
+
+%p
+ = html_escape(_("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:")) % { project_link: project_link.html_safe, deletion_date: @deletion_date, b_open: '<b>'.html_safe, b_close: '</b>'.html_safe }
+
+%p
+ %ul
+ %li= _("Create or close an issue.")
+ %li= _("Create, update, or delete a merge request.")
+ %li= _("Push code to the repository.")
+ %li= _("Add or remove a user.")
+
+%p
+ = html_escape(_("To ensure %{project_link} is unscheduled for deletion, check that activity has been logged by GitLab. For example:")) %{project_link: project_link.html_safe}
+
+%p
+ %ul
+ %li= html_escape(_("Go to the %{b_open}Activity%{b_close} page for %{project_link}.")) % { project_link: project_link, b_open: '<b>'.html_safe, b_close: '</b>'.html_safe }
+ %li= html_escape(_("View the %{code_open}last_activity_at%{code_close} attribute for %{project_link} using the %{projects_api_link}.")) % { project_link: project_link.html_safe, projects_api_link: projects_api_link.html_safe, code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ %li= html_escape(_("List the visible events for %{project_link} using the %{events_api_link}.")) % { project_link: project_link.html_safe, events_api_link: events_api_link.html_safe }
+
+%p
+ = html_escape(_("This email supersedes any previous emails about scheduled deletion you may have received for %{project_link}.")) % { project_link: project_link.html_safe }
diff --git a/app/views/notify/inactive_project_deletion_warning_email.text.erb b/app/views/notify/inactive_project_deletion_warning_email.text.erb
new file mode 100644
index 00000000000..a0b79967817
--- /dev/null
+++ b/app/views/notify/inactive_project_deletion_warning_email.text.erb
@@ -0,0 +1,17 @@
+<%= _('Hi %{username},') % { username: sanitize_name(@user.name) } %>
+
+<%= _("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:") %
+ { project_name: @project.name, project_link: @project.http_url_to_repo, deletion_date: @deletion_date } %>
+
+<%= _("- Create or close an issue.") %>
+<%= _("- Create, update, or delete a merge request.") %>
+<%= _("- Push code to the repository.") %>
+<%= _("- Add or remove a user.") %>
+
+<%= _("To ensure %{project_name} is unscheduled for deletion, check that activity has been logged by GitLab. For example:") % { project_name: @project.name } %>
+
+<%= _("- Go to the Activity page for %{project_name}.") % { project_name: @project.name } %>
+<%= _("- View the last_activity_at attribute for %{project_name} using the Project API %{projects_api_link}.") % { project_name: @project.name, projects_api_link: help_page_url('api/projects') } %>
+<%= _("- List the visible events for %{project_name} using the Events API %{events_api_link}.") % { project_name: @project.name, events_api_link: help_page_url('api/events', anchor: 'list-a-projects-visible-events') } %>
+
+<%= _("This email supersedes any previous emails about scheduled deletion you may have received for %{project_name}.") % { project_name: @project.name } %>
diff --git a/app/views/notify/merge_request_unmergeable_email.html.haml b/app/views/notify/merge_request_unmergeable_email.html.haml
index 6bcff28985c..f0a5e5d4367 100644
--- a/app/views/notify/merge_request_unmergeable_email.html.haml
+++ b/app/views/notify/merge_request_unmergeable_email.html.haml
@@ -1,2 +1,10 @@
%p
= sprintf(s_('Notify|Merge request %{merge_request} can no longer be merged due to conflict.'), { merge_request: merge_request_reference_link(@merge_request) }).html_safe
+%p
+ = merge_path_description(@merge_request, 'to')
+%p
+ = sprintf(s_('Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
+%p
+ = assignees_label(@merge_request)
+%p
+ = reviewers_label(@merge_request)
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 e7c51c8fb13..e4d138cce96 100644
--- a/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
+++ b/app/views/notify/merge_when_pipeline_succeeds_email.html.haml
@@ -61,7 +61,7 @@
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
%tr.header
%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", height: "50", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo.gif'), width: "55" }
+ %img{ alt: "GitLab", height: "55", src: image_url('mailers/gitlab_logo.png'), width: "55" }
%tr
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
%table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" }
@@ -146,7 +146,7 @@
%tr.footer
%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", height: "33", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }
+ %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;")
diff --git a/app/views/notify/merged_merge_request_email.html.haml b/app/views/notify/merged_merge_request_email.html.haml
index 0622e2f6ffb..e2e4d6d937f 100644
--- a/app/views/notify/merged_merge_request_email.html.haml
+++ b/app/views/notify/merged_merge_request_email.html.haml
@@ -1,2 +1,16 @@
%p
= sprintf(s_('Notify|Merge request %{merge_request} was merged'), { merge_request: merge_request_reference_link(@merge_request) }).html_safe
+
+%p
+ = merge_path_description(@merge_request, 'to')
+
+%div
+ = sprintf(s_('Notify|Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
+
+ - if @merge_request.assignees.any?
+ %div
+ = assignees_label(@merge_request)
+
+ - if @merge_request.reviewers.any?
+ %div
+ = reviewers_label(@merge_request)
diff --git a/app/views/notify/merged_merge_request_email.text.haml b/app/views/notify/merged_merge_request_email.text.haml
index d6ec916641d..9b9eb566903 100644
--- a/app/views/notify/merged_merge_request_email.text.haml
+++ b/app/views/notify/merged_merge_request_email.text.haml
@@ -5,5 +5,9 @@
= merge_path_description(@merge_request, 'to')
= sprintf(s_('Notify|Author: %{author_name}'), { author_name: sanitize_name(@merge_request.author_name) })
-= assignees_label(@merge_request)
-= reviewers_label(@merge_request)
+
+- if @merge_request.assignees.any?
+ = assignees_label(@merge_request)
+
+- if @merge_request.reviewers.any?
+ = reviewers_label(@merge_request)
diff --git a/app/views/notify/unapproved_merge_request_email.html.haml b/app/views/notify/unapproved_merge_request_email.html.haml
new file mode 100644
index 00000000000..8a4138b7515
--- /dev/null
+++ b/app/views/notify/unapproved_merge_request_email.html.haml
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+%html{ lang: "en" }
+ %head
+ %meta{ content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type" }/
+ %meta{ content: "width=device-width, initial-scale=1", name: "viewport" }/
+ %meta{ content: "IE=edge", "http-equiv" => "X-UA-Compatible" }/
+ %title= message.subject
+ :css
+ /* CLIENT-SPECIFIC STYLES */
+ body, table, td, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+ table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
+ img { -ms-interpolation-mode: bicubic; }
+
+ /* iOS BLUE LINKS */
+ a[x-apple-data-detectors] {
+ color: inherit !important;
+ text-decoration: none !important;
+ font-size: inherit !important;
+ font-family: inherit !important;
+ font-weight: inherit !important;
+ line-height: inherit !important;
+ }
+
+ /* ANDROID MARGIN HACK */
+ body { margin:0 !important; }
+ div[style*="margin: 16px 0"] { margin:0 !important; }
+
+ @media only screen and (max-width: 639px) {
+ body, #body {
+ min-width: 320px !important;
+ }
+ table.wrapper {
+ width: 100% !important;
+ min-width: 320px !important;
+ }
+ table.wrapper > tbody > tr > td {
+ border-left: 0 !important;
+ border-right: 0 !important;
+ border-radius: 0 !important;
+ padding-left: 10px !important;
+ padding-right: 10px !important;
+ }
+ }
+
+ ul.users-list {
+ list-style: none;
+ padding: 0px;
+ display: block;
+ margin-top: 0px;
+ }
+ ul.users-list li {
+ display: inline-block;
+ padding-right: 12px;
+ padding-top: 8px;
+ }
+
+ %body{ style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;height:100%;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
+ %table#body{ border: "0", cellpadding: "0", cellspacing: "0", style: "background-color:#fafafa;margin:0;padding:0;text-align:center;min-width:640px;width:100%;" }
+ %tbody
+ %tr.line
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
+ %tr.header
+ %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", height: "55", src: image_url('mailers/gitlab_logo.png'), width: "55" }/
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
+ %table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#ffffff;text-align:left;padding:18px 25px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.content{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;border-collapse:separate;border-spacing:0;" }
+ %tbody
+ %tr.success
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:10px;border-radius:3px;font-size:14px;line-height:1.3;text-align:center;overflow:hidden;color:#ffffff;background-color:#FC6D26;" }
+ %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;vertical-align:middle;color:#ffffff;text-align:center;padding-right:5px;" }
+ %img{ alt: "✗", height: "13", src: image_url('mailers/approval/icon-x-orange-inverted.gif'), style: "display:block;", width: "13" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;vertical-align:middle;color:#ffffff;text-align:center;" }
+ - if @merge_request.respond_to? :approvals_required
+ %span Merge request was unapproved (#{@merge_request.approvals.count}/#{@merge_request.approvals_required})
+ - else
+ %span Merge request was unapproved
+ %tr.spacer
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" }
+ &nbsp;
+ %tr.section
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4;text-align:center;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;width:100%;" }
+ %tbody
+ %tr{ style: 'width:100%;' }
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;text-align:center;" }
+ %img{ src: image_url('mailers/approval/icon-merge-request-gray.gif'), style: "height:18px;width:18px;margin-bottom:-4px;", alt: "Merge request icon" }
+ %span{ style: "font-weight: 600;color:#333333;" } Merge request
+ %a{ href: merge_request_url(@merge_request), style: "font-weight: 600;color:#3777b0;text-decoration:none" }= @merge_request.to_reference
+ %span was unapproved by
+ %img.avatar{ height: "24", src: avatar_icon_for_user(@unapproved_by, 24), style: "border-radius:12px;margin:-7px 0 -7px 3px;", width: "24", alt: "Avatar" }/
+ %a.muted{ href: user_url(@unapproved_by), style: "color:#333333;text-decoration:none;" }
+ = @unapproved_by.name
+ %tr.spacer
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;height:18px;font-size:18px;line-height:18px;" }
+ &nbsp;
+ %tr.section
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:0 15px;border:1px solid #ededed;border-radius:3px;overflow:hidden;" }
+ %table.info{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:100%;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;" } Project
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;" }
+ - namespace_name = @project.group ? @project.group.name : @project.namespace.owner.name
+ - namespace_url = @project.group ? group_url(@project.group) : user_url(@project.namespace.owner)
+ %a.muted{ href: namespace_url, style: "color:#333333;text-decoration:none;" }
+ = namespace_name
+ \/
+ %a.muted{ href: project_url(@project), style: "color:#333333;text-decoration:none;" }
+ = @project.name
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Branch
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" }
+ %tbody
+ %tr
+ %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-branch-gray.gif'), style: "display:block;", width: "13", alt: "Branch icon" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" }
+ %span.muted{ style: "color:#333333;text-decoration:none;" }
+ = @merge_request.source_branch
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;border-top:1px solid #ededed;" } Author
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#8c8c8c;font-weight:300;padding:14px 0;margin:0;color:#333333;font-weight:400;width:75%;padding-left:5px;border-top:1px solid #ededed;" }
+ %table.img{ border: "0", cellpadding: "0", cellspacing: "0", style: "border-collapse:collapse;" }
+ %tbody
+ %tr
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;padding-right:5px;" }
+ %img.avatar{ height: "24", src: avatar_icon_for_user(@merge_request.author, 24), style: "display:block;border-radius:12px;margin:-2px 0;", width: "24", alt: "Avatar" }/
+ %td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;vertical-align:middle;" }
+ %a.muted{ href: user_url(@merge_request.author), style: "color:#333333;text-decoration:none;" }
+ = @merge_request.author.name
+ - if @merge_request.assignees.any?
+ = render 'users_list', users: @merge_request.assignees, user_label: assignees_label(@merge_request, include_value: false)
+
+ - if @merge_request.reviewers.any?
+ = render 'users_list', users: @merge_request.reviewers, user_label: reviewers_label(@merge_request, include_value: false)
+ - if Gitlab.ee?
+ -# EE-specific start
+ = render 'layouts/mailer/additional_text'
+ -# EE-specific end
+
+ %tr.footer
+ %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 }
diff --git a/app/views/notify/unapproved_merge_request_email.text.haml b/app/views/notify/unapproved_merge_request_email.text.haml
new file mode 100644
index 00000000000..4e34b883906
--- /dev/null
+++ b/app/views/notify/unapproved_merge_request_email.text.haml
@@ -0,0 +1,9 @@
+Merge request #{@merge_request.to_reference} was unapproved by #{@unapproved_by.name}
+
+Merge request URL: #{project_merge_request_url(@merge_request.target_project, @merge_request)}
+
+= merge_path_description(@merge_request, 'to')
+
+Author: #{sanitize_name(@merge_request.author_name)}
+= assignees_label(@merge_request)
+= reviewers_label(@merge_request)
diff --git a/app/views/profiles/_email_settings.html.haml b/app/views/profiles/_email_settings.html.haml
index 1057e96f442..35cad79b6fd 100644
--- a/app/views/profiles/_email_settings.html.haml
+++ b/app/views/profiles/_email_settings.html.haml
@@ -5,15 +5,34 @@
- help_text = email_change_disabled ? s_("Your account uses dedicated credentials for the \"%{group_name}\" group and can only be updated through SSO.") % { group_name: @user.managing_group.name } : read_only_help_text
- password_automatically_set = @user.password_automatically_set?
-= form.text_field :email, required: true, class: 'input-lg gl-form-input', value: (@user.email unless @user.temp_oauth_email?), help: help_text.html_safe, readonly: readonly || email_change_disabled
-- unless password_automatically_set
- = hidden_field_tag 'user[validation_password]', :validation_password, class: 'js-password-prompt-field', help: s_("Profiles|Enter your password to confirm the email change")
-= form.select :public_email, options_for_select(@user.public_verified_emails, selected: @user.public_email),
- { help: s_("Profiles|This email will be displayed on your public profile"), include_blank: s_("Profiles|Do not show on profile") },
- control_class: 'select2 input-lg', disabled: email_change_disabled
-- 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 }
-= form.select :commit_email, options_for_select(commit_email_select_options(@user), selected: @user.commit_email),
- { help: commit_email_docs_link },
- control_class: 'select2 input-lg', disabled: email_change_disabled
+.form-group.gl-form-group
+ = form.label :email, _('Email')
+ = form.text_field :email, required: true, class: 'gl-form-input form-control gl-form-input-lg', value: (@user.email unless @user.temp_oauth_email?), readonly: readonly || email_change_disabled
+ %small.form-text.text-gl-muted
+ = help_text.html_safe
+
+ - unless password_automatically_set
+ = hidden_field_tag 'user[validation_password]', :validation_password, class: 'js-password-prompt-field', help: s_("Profiles|Enter your password to confirm the email change")
+
+.form-group.gl-form-group
+ = form.label :public_email, s_('Profiles|Public email')
+ .gl-form-input-lg
+ = form.select :public_email,
+ options_for_select(@user.public_verified_emails, selected: @user.public_email),
+ { 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")
+
+.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 }
+ = form.label :commit_email, s_('Profiles|Commit email')
+ .gl-form-input-lg
+ = form.select :commit_email,
+ options_for_select(commit_email_select_options(@user), selected: @user.commit_email),
+ {},
+ { class: 'gl-form-select custom-select', disabled: email_change_disabled }
+ %small.form-text.text-gl-muted
+ = commit_email_docs_link
diff --git a/app/views/profiles/_name.html.haml b/app/views/profiles/_name.html.haml
index aea38bf4c3b..5af4fe24d62 100644
--- a/app/views/profiles/_name.html.haml
+++ b/app/views/profiles/_name.html.haml
@@ -1,5 +1,9 @@
+= form.label :name, s_('Profiles|Full name')
- if user.read_only_attribute?(:name)
- = form.text_field :name, class: 'gl-form-input', required: true, readonly: true, wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' },
- help: 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) }
+ = 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) }
- else
- = form.text_field :name, class: 'gl-form-input', label: s_('Profiles|Full name'), required: true, title: s_("Profiles|Using emojis in names seems fun, but please try to set a status message instead"), wrapper: { class: 'col-md-9 qa-full-name rspec-full-name' }, help: s_("Profiles|Enter your name, so people you know can recognize you")
+ = 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")
diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml
index 8568e61aa33..bbbb8154c51 100644
--- a/app/views/profiles/accounts/show.html.haml
+++ b/app/views/profiles/accounts/show.html.haml
@@ -3,15 +3,15 @@
- if current_user.ldap_user?
= render Pajamas::AlertComponent.new(alert_class: 'gl-my-5',
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= s_('Profiles|Some options are unavailable for LDAP accounts')
- if params[:two_factor_auth_enabled_successfully]
= render Pajamas::AlertComponent.new(variant: :success,
alert_class: 'gl-my-5',
- close_button_class: 'js-close-2fa-enabled-success-alert') do
- .gl-alert-body
+ close_button_class: 'js-close-2fa-enabled-success-alert') do |c|
+ = c.body do
= html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: '<a href="%{href}">'.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: '</a>'.html_safe }
.row.gl-mt-3.js-search-settings-section
diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index 5d74bbe9971..26c9b2f0ee1 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -3,8 +3,8 @@
%div
- if @user.errors.any?
- = render Pajamas::AlertComponent.new(variant: :danger) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(variant: :danger) do |c|
+ = c.body do
%ul
- @user.errors.full_messages.each do |msg|
%li= msg
diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml
index 3fb48f3d3e3..8c799a5e3fe 100644
--- a/app/views/profiles/preferences/show.html.haml
+++ b/app/views/profiles/preferences/show.html.haml
@@ -127,7 +127,12 @@
= _('Language')
= f.select :preferred_language, language_choices, {}, class: 'select2'
.form-text.text-muted
- = s_('Preferences|This feature is experimental and translations are not complete yet')
+ = s_('Preferences|This feature is experimental and translations are not yet complete.')
+ %p
+ = link_to help_page_url('development/i18n/translation'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do
+ = _("Help translate GitLab into your language")
+ %span{ aria: { label: _('Open new window') } }
+ = sprite_icon('external-link')
.form-group
= f.label :first_day_of_week, class: 'label-bold' do
= _('First day of the week')
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 531e72b7cc2..107c7cebc61 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -5,7 +5,7 @@
- availability = availability_values
- custom_emoji = show_status_emoji?(@user.status)
-= bootstrap_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|
+= 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)
.row.js-search-settings-section
@@ -34,7 +34,7 @@
.gl-my-3
%button.gl-button.btn.btn-default.js-choose-user-avatar-button{ type: 'button' }= s_("Profiles|Choose file...")
%span.avatar-file-name.gl-ml-3.js-avatar-filename= s_("Profiles|No file chosen.")
- = f.file_field_without_bootstrap :avatar, class: 'js-user-avatar-input hidden', accept: 'image/*'
+ = f.file_field :avatar, class: 'js-user-avatar-input hidden', accept: 'image/*'
.gl-text-gray-500= s_("Profiles|The maximum file size allowed is 200KB.")
- if @user.avatar?
= link_to s_("Profiles|Remove avatar"), profile_avatar_path, data: { confirm: s_("Profiles|Avatar will be removed. Are you sure?") }, method: :delete, class: 'gl-button btn btn-danger-secondary btn-sm gl-mt-5'
@@ -62,16 +62,24 @@
= sprite_icon("close")
= status_form.hidden_field :emoji, id: 'js-status-emoji-field'
- = status_form.text_field :message,
- id: 'js-status-message-field',
- class: 'form-control gl-form-input input-lg',
- label: s_("Profiles|Your status"),
- prepend: emoji_button,
- append: reset_message_button,
- placeholder: s_("Profiles|What's your status?")
- .checkbox-icon-inline-wrapper
- = status_form.check_box :availability, { data: { testid: "user-availability-checkbox" }, label: s_("Profiles|Busy"), wrapper_class: 'gl-mr-0 gl-font-weight-bold' }, availability["busy"], availability["not_set"]
- .gl-text-gray-600.gl-ml-5= s_('Profiles|An indicator appears next to your name and avatar')
+ .form-group.gl-form-group
+ = status_form.label :message, s_("Profiles|Your status")
+ .input-group{ role: 'group' }
+ .input-group-prepend
+ = emoji_button
+ = status_form.text_field :message,
+ id: 'js-status-message-field',
+ class: 'form-control gl-form-input input-lg',
+ placeholder: s_("Profiles|What's your status?")
+ .input-group-append
+ = reset_message_button
+ .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'),
+ checkbox_options: { data: { testid: "user-availability-checkbox" } },
+ checked_value: availability["busy"],
+ unchecked_value: availability["not_set"]
.col-lg-12
%hr
.row.user-time-preferences.js-search-settings-section
@@ -94,35 +102,71 @@
= s_("Profiles|Some options are unavailable for LDAP accounts")
.col-lg-8
.row
- = render 'profiles/name', form: f, user: @user
- = f.text_field :id, class: 'gl-form-input', readonly: true, label: s_('Profiles|User ID'), wrapper: { class: 'col-md-3' }
-
- = f.text_field :pronouns, label: s_('Profiles|Pronouns'), class: 'input-md gl-form-input', help: s_("Profiles|Enter your pronouns to let people know how to refer to you")
- = f.text_field :pronunciation, label: s_('Profiles|Pronunciation'), class: 'input-md gl-form-input', help: s_("Profiles|Enter how your name is pronounced to help people address you correctly")
+ .form-group.gl-form-group.col-md-9.rspec-full-name
+ = render 'profiles/name', form: f, user: @user
+ .form-group.gl-form-group.col-md-3
+ = f.label :id, s_('Profiles|User ID')
+ = f.text_field :id, class: 'gl-form-input form-control', readonly: true
+ .form-group.gl-form-group
+ = f.label :pronouns, s_('Profiles|Pronouns')
+ = f.text_field :pronouns, class: 'gl-form-input form-control gl-form-input-lg'
+ %small.form-text.text-gl-muted
+ = 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-form-input-lg'
+ %small.form-text.text-gl-muted
+ = 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
- = f.text_field :skype, class: 'input-md gl-form-input', placeholder: s_("Profiles|username")
- = f.text_field :linkedin, class: 'input-md gl-form-input', help: s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename")
- = f.text_field :twitter, class: 'input-md gl-form-input', placeholder: s_("Profiles|@username")
- = f.text_field :website_url, label: s_('Profiles|Website url'), class: 'input-lg gl-form-input', placeholder: s_("Profiles|https://website.com")
- - if @user.read_only_attribute?(:location)
- = f.text_field :location, class: 'gl-form-input', readonly: true, help: s_("Profiles|Your location was automatically set based on your %{provider_label} account") % { provider_label: attribute_provider_label(:location) }
- - else
- = f.text_field :location, label: s_('Profiles|Location'), class: 'input-lg gl-form-input', placeholder: s_("Profiles|City, country")
- = f.text_field :job_title, label: s_('Profiles|Job title'), class: 'input-md gl-form-input'
- = f.text_field :organization, label: s_('Profiles|Organization'), class: 'input-md gl-form-input', help: s_("Profiles|Who you represent or work for")
- = f.text_area :bio, class: 'gl-form-input', label: s_('Profiles|Bio'), rows: 4, maxlength: 250, help: s_("Profiles|Tell us about yourself in fewer than 250 characters")
+ .form-group.gl-form-group
+ = f.label :skype
+ = f.text_field :skype, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|username")
+ .form-group.gl-form-group
+ = f.label :linkedin
+ = f.text_field :linkedin, class: 'gl-form-input form-control gl-form-input-lg'
+ %small.form-text.text-gl-muted
+ = s_("Profiles|Your LinkedIn profile name from linkedin.com/in/profilename")
+ .form-group.gl-form-group
+ = f.label :twitter
+ = f.text_field :twitter, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|@username")
+ .form-group.gl-form-group
+ = f.label :website_url, s_('Profiles|Website url')
+ = f.text_field :website_url, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|https://website.com")
+ .form-group.gl-form-group
+ = f.label :location, s_('Profiles|Location')
+ - if @user.read_only_attribute?(:location)
+ = f.text_field :location, class: 'gl-form-input form-control gl-form-input-lg', readonly: true
+ %small.form-text.text-gl-muted
+ = s_("Profiles|Your location was automatically set based on your %{provider_label} account") % { provider_label: attribute_provider_label(:location) }
+ - else
+ = f.text_field :location, class: 'gl-form-input form-control gl-form-input-lg', placeholder: s_("Profiles|City, country")
+ .form-group.gl-form-group
+ = f.label :job_title, s_('Profiles|Job title')
+ = f.text_field :job_title, class: 'gl-form-input form-control gl-form-input-lg'
+ .form-group.gl-form-group
+ = f.label :organization, s_('Profiles|Organization')
+ = f.text_field :organization, class: 'gl-form-input form-control gl-form-input-lg'
+ %small.form-text.text-gl-muted
+ = 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")
%hr
- %h5= _('Private profile')
- .checkbox-icon-inline-wrapper
- - private_profile_label = capture do
- = s_("Profiles|Don't display activity-related personal information on your profile")
- = f.check_box :private_profile, label: private_profile_label, inline: true, wrapper_class: 'mr-0'
- = link_to sprite_icon('question-o'), help_page_path('user/profile/index.md', anchor: 'make-your-user-profile-page-private')
- %h5= s_("Profiles|Private contributions")
- = f.check_box :include_private_contributions, label: s_('Profiles|Include private contributions on my profile'), wrapper_class: 'mb-2', inline: true
- .help-block
- = s_("Profiles|Choose to show contributions of private projects on your public profile without any project, repository or organization information")
+ %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_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
+ %legend.col-form-label.col-form-label
+ = 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")
%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 3ae64643420..ace644a493b 100644
--- a/app/views/profiles/two_factor_auths/show.html.haml
+++ b/app/views/profiles/two_factor_auths/show.html.haml
@@ -2,7 +2,7 @@
- page_title _('Two-Factor Authentication'), _('Account')
- add_to_breadcrumbs _('Account'), profile_account_path
- @content_class = "limit-container-width" unless fluid_layout
-- webauthn_enabled = Feature.enabled?(:webauthn, default_enabled: :yaml)
+- webauthn_enabled = Feature.enabled?(:webauthn)
.js-two-factor-auth{ 'data-two-factor-skippable' => "#{two_factor_skippable?}", 'data-two_factor_skip_url' => skip_profile_two_factor_auth_path }
.row.gl-mt-3
@@ -42,8 +42,8 @@
- if @error
= render Pajamas::AlertComponent.new(title: @error[:message],
variant: :danger,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= link_to _('Try the troubleshooting steps here.'), help_page_path('user/profile/account/two_factor_authentication.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer'
.form-group
diff --git a/app/views/projects/_deletion_failed.html.haml b/app/views/projects/_deletion_failed.html.haml
index f9d8a2d2989..85a7b9eb22b 100644
--- a/app/views/projects/_deletion_failed.html.haml
+++ b/app/views/projects/_deletion_failed.html.haml
@@ -3,7 +3,7 @@
= render Pajamas::AlertComponent.new(variant: :warning,
dismissible: false,
- alert_class: 'project-deletion-failed-message') do
- .gl-alert-body
+ alert_class: 'project-deletion-failed-message') do |c|
+ = c.body do
This project was scheduled for deletion, but failed with the following message:
= project.delete_error
diff --git a/app/views/projects/_files.html.haml b/app/views/projects/_files.html.haml
index 74ace549bb1..bea5d548e03 100644
--- a/app/views/projects/_files.html.haml
+++ b/app/views/projects/_files.html.haml
@@ -8,7 +8,7 @@
#tree-holder.tree-holder.clearfix
.nav-block.gl-display-flex.gl-xs-flex-direction-column.gl-align-items-stretch
- = render 'projects/tree/tree_header', tree: @tree
+ = render 'projects/tree/tree_header', tree: @tree, is_project_overview: is_project_overview
.info-well.gl-display-none.gl-sm-display-flex.project-last-commit.gl-flex-direction-column
#js-last-commit.gl-m-auto
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index 8e6cc6da65d..eee9cfe0618 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -1,7 +1,7 @@
- empty_repo = @project.empty_repo?
- show_auto_devops_callout = show_auto_devops_callout?(@project)
- emails_disabled = @project.emails_disabled?
-- cache_enabled = Feature.enabled?(:cache_home_panel, @project, type: :development, default_enabled: :yaml)
+- cache_enabled = Feature.enabled?(:cache_home_panel, @project, type: :development)
.project-home-panel.js-show-on-project-root.gl-my-5{ class: [("empty-project" if empty_repo)] }
.gl-display-flex.gl-justify-content-space-between.gl-flex-wrap.gl-sm-flex-direction-column.gl-mb-3
@@ -19,8 +19,7 @@
- if can?(current_user, :read_project, @project)
%span.gl-display-inline-block.gl-vertical-align-middle
= s_('ProjectPage|Project ID: %{project_id}') % { project_id: @project.id }
- - button_class = "btn gl-button btn-sm btn-tertiary btn-default-tertiary home-panel-metadata"
- = clipboard_button(title: s_('ProjectPage|Copy project ID'), text: @project.id, class: button_class)
+ = clipboard_button(title: s_('ProjectPage|Copy project ID'), text: @project.id)
- if current_user
%span.gl-ml-3.gl-mb-3
= render 'shared/members/access_request_links', source: @project
diff --git a/app/views/projects/_last_push.html.haml b/app/views/projects/_last_push.html.haml
index 66857dadb65..5a2add9de1e 100644
--- a/app/views/projects/_last_push.html.haml
+++ b/app/views/projects/_last_push.html.haml
@@ -2,8 +2,8 @@
- if event && show_last_push_widget?(event)
= render Pajamas::AlertComponent.new(variant: :success,
alert_class: 'gl-mt-3',
- close_button_class: 'js-close-banner') do
- .gl-alert-body
+ close_button_class: 'js-close-banner') do |c|
+ = c.body do
%span= s_("LastPushEvent|You pushed to")
%strong.gl-display-inline-flex.gl-max-w-50p{ data: { toggle: 'tooltip' }, title: event.ref_name }
= link_to event.ref_name, project_commits_path(event.project, event.ref_name), class: 'ref-name gl-text-truncate'
@@ -15,6 +15,6 @@
#{time_ago_with_tooltip(event.created_at)}
- if can?(current_user, :create_merge_request_in, event.project.default_merge_request_target)
- .gl-alert-actions
+ = c.actions do
= link_to new_mr_path_from_push_event(event), title: _("New merge request"), class: "btn gl-button btn-confirm qa-create-merge-request" do
#{ _('Create merge request') }
diff --git a/app/views/projects/_merge_request_merge_checks_settings.html.haml b/app/views/projects/_merge_request_merge_checks_settings.html.haml
index 4f9af40f711..3345b3043b8 100644
--- a/app/views/projects/_merge_request_merge_checks_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_checks_settings.html.haml
@@ -3,21 +3,16 @@
.form-group
%b= s_('ProjectSettings|Merge checks')
%p.text-secondary= s_('ProjectSettings|These checks must pass before merge requests can be merged.')
- .form-check.mb-2.builds-feature
- = form.check_box :only_allow_merge_if_pipeline_succeeds, class: 'form-check-input'
- = form.label :only_allow_merge_if_pipeline_succeeds, class: 'form-check-label' do
- = s_('ProjectSettings|Pipelines must succeed')
- .text-secondary
- = s_("ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running.")
- .form-check.mb-2
- .gl-pl-6
- = form.check_box :allow_merge_on_skipped_pipeline, class: 'form-check-input'
- = form.label :allow_merge_on_skipped_pipeline, class: 'form-check-label' do
- = s_('ProjectSettings|Skipped pipelines are considered successful')
- .text-secondary
- = s_('ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline.')
- .form-check.mb-2
- = form.check_box :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-input', data: { qa_selector: 'allow_merge_if_all_discussions_are_resolved_checkbox' }
- = form.label :only_allow_merge_if_all_discussions_are_resolved, class: 'form-check-label' do
- = s_('ProjectSettings|All discussions must be resolved')
+ .builds-feature
+ = form.gitlab_ui_checkbox_component :only_allow_merge_if_pipeline_succeeds,
+ s_('ProjectSettings|Pipelines must succeed'),
+ help_text: s_("ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running.")
+ .gl-pl-6
+ = form.gitlab_ui_checkbox_component :allow_merge_on_skipped_pipeline,
+ s_('ProjectSettings|Skipped pipelines are considered successful'),
+ help_text: s_('ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline.'),
+ checkbox_options: { class: 'gl-pl-6' }
+ = form.gitlab_ui_checkbox_component :only_allow_merge_if_all_discussions_are_resolved,
+ s_('ProjectSettings|All threads must be resolved'),
+ checkbox_options: { data: { qa_selector: 'allow_merge_if_all_discussions_are_resolved_checkbox' } }
= render_if_exists 'projects/merge_request_merge_checks_jira_enforcement', form: form, project: @project
diff --git a/app/views/projects/_merge_request_merge_method_settings.html.haml b/app/views/projects/_merge_request_merge_method_settings.html.haml
index 250f7e94e84..cb660750632 100644
--- a/app/views/projects/_merge_request_merge_method_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_method_settings.html.haml
@@ -4,7 +4,7 @@
%b= s_('ProjectSettings|Merge method')
%p.text-secondary
= s_('ProjectSettings|Determine what happens to the commit history when you merge a merge request.')
- = link_to s_('ProjectSettings|Learn about commit history.'), help_page_path('user/project/merge_requests/commits.md'), target: '_blank', rel: 'noopener noreferrer'
+ = link_to s_('ProjectSettings|How do they differ?'), help_page_path('user/project/merge_requests/methods/index.md'), target: '_blank', rel: 'noopener noreferrer'
.form-check.mb-2
= form.radio_button :merge_method, :merge, class: "js-merge-method-radio form-check-input"
= label_tag :project_merge_method_merge, class: 'form-check-label' do
diff --git a/app/views/projects/_merge_request_merge_options_settings.html.haml b/app/views/projects/_merge_request_merge_options_settings.html.haml
index 20f3933d0a8..e91c001ea3d 100644
--- a/app/views/projects/_merge_request_merge_options_settings.html.haml
+++ b/app/views/projects/_merge_request_merge_options_settings.html.haml
@@ -5,17 +5,10 @@
%p.text-secondary= s_('ProjectSettings|Additional settings that influence how and when merges are done.')
= render_if_exists 'projects/merge_pipelines_settings', form: form
= render_if_exists 'projects/merge_trains_settings', form: form
- .form-check.mb-2
- = form.check_box :resolve_outdated_diff_discussions, class: 'form-check-input'
- = form.label :resolve_outdated_diff_discussions, class: 'form-check-label' do
- = s_('ProjectSettings|Automatically resolve merge request diff discussions when they become outdated')
- .form-check.mb-2
- = form.check_box :printing_merge_request_link_enabled, class: 'form-check-input'
- = form.label :printing_merge_request_link_enabled, class: 'form-check-label' do
- = s_('ProjectSettings|Show link to create or view a merge request when pushing from the command line')
- .form-check.mb-2
- = form.check_box :remove_source_branch_after_merge, class: 'form-check-input'
- = form.label :remove_source_branch_after_merge, class: 'form-check-label' do
- = s_('ProjectSettings|Enable "Delete source branch" option by default')
- .descr.text-secondary
- = s_('ProjectSettings|Existing merge requests and protected branches are not affected.')
+ = form.gitlab_ui_checkbox_component :resolve_outdated_diff_discussions,
+ s_('ProjectSettings|Automatically resolve merge request diff threads when they become outdated')
+ = form.gitlab_ui_checkbox_component :printing_merge_request_link_enabled,
+ s_('ProjectSettings|Show link to create or view a merge request when pushing from the command line')
+ = form.gitlab_ui_checkbox_component :remove_source_branch_after_merge,
+ s_('ProjectSettings|Enable "Delete source branch" option by default'),
+ help_text: s_('ProjectSettings|Existing merge requests and protected branches are not affected.')
diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml
index e79825bdfc4..66fa1a69ef9 100644
--- a/app/views/projects/_new_project_fields.html.haml
+++ b/app/views/projects/_new_project_fields.html.haml
@@ -39,8 +39,8 @@
= project_tip.html_safe
= render Pajamas::AlertComponent.new(alert_class: "gl-mb-4 gl-display-none js-user-readme-repo",
dismissible: false,
- variant: :success) do
- .gl-alert-body
+ variant: :success) do |c|
+ = c.body do
- help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/profile/index', anchor: 'add-details-to-your-profile-with-a-readme') }
= html_escape(_('%{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}')) % { project_path: "<strong>#{current_user.username} / #{current_user.username}</strong>".html_safe, help_link_start: help_link_start, help_link_end: '</a>'.html_safe }
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index 7f72438c3f9..bc1e62a8980 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -58,3 +58,6 @@
#{line}
- current_line += line_count
+
+ - if blame_pagination
+ = paginate(blame_pagination, theme: "gitlab")
diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml
index 85b9a69ab4c..2c3aade1068 100644
--- a/app/views/projects/blob/_blob.html.haml
+++ b/app/views/projects/blob/_blob.html.haml
@@ -14,7 +14,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, default_enabled: :yaml) && !expanded
+ - if Feature.enabled?(:refactor_blob_viewer, @project) && !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/_breadcrumb.html.haml b/app/views/projects/blob/_breadcrumb.html.haml
index e666bb237bd..7c2caf34fd1 100644
--- a/app/views/projects/blob/_breadcrumb.html.haml
+++ b/app/views/projects/blob/_breadcrumb.html.haml
@@ -2,7 +2,7 @@
.nav-block
.tree-ref-container
.tree-ref-holder
- = render 'shared/ref_switcher', destination: 'blob', path: @path
+ = render 'shared/ref_switcher', destination: 'blob'
%ul.breadcrumb.repo-breadcrumb
%li.breadcrumb-item
diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml
index c9303e19d5d..09a275c24a1 100644
--- a/app/views/projects/blob/_editor.html.haml
+++ b/app/views/projects/blob/_editor.html.haml
@@ -40,6 +40,8 @@
Soft wrap
.file-editor.code
+ - if Feature.enabled?(:source_editor_toolbar, current_user)
+ #editor-toolbar
.js-edit-mode-pane.qa-editor#editor{ data: { 'editor-loading': true } }<
%pre.editor-loading-content= params[:content] || local_assigns[:blob_data]
- if local_assigns[:path]
diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml
index aefa4a41ab5..f80601ef221 100644
--- a/app/views/projects/blob/edit.html.haml
+++ b/app/views/projects/blob/edit.html.haml
@@ -6,12 +6,13 @@
- if @conflict
= render Pajamas::AlertComponent.new(alert_class: 'gl-mb-5 gl-mt-5',
variant: :danger,
- dismissible: false) do
+ dismissible: false) do |c|
- blob_url = project_blob_path(@project, @id)
- external_link_icon = content_tag 'span', { aria: { label: _('Opens new window') }} do
- sprite_icon('external-link', css_class: 'gl-icon').html_safe
- blob_link_start = '<a href="%{url}" class="gl-link" target="_blank" rel="noopener noreferrer">'.html_safe % { url: blob_url }
- = _('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.').html_safe % { link_start: blob_link_start, link_end: '</a>'.html_safe , icon: external_link_icon }
+ = c.body do
+ = _('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.').html_safe % { link_start: blob_link_start, link_end: '</a>'.html_safe , icon: external_link_icon }
%h3.page-title.blob-edit-page-title
diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml
index 85a0346e691..295b2de9bd2 100644
--- a/app/views/projects/branches/index.html.haml
+++ b/app/views/projects/branches/index.html.haml
@@ -39,7 +39,7 @@
%ul.content-list.all-branches
- @branches.each do |branch|
= render "projects/branches/branch", branch: branch, merged: @merged_branch_names.include?(branch.name), commit_status: @branch_pipeline_statuses[branch.name], show_commit_status: @branch_pipeline_statuses.any?
- - if Feature.enabled?(:branch_list_keyset_pagination, @project, default_enabled: :yaml)
+ - if Feature.enabled?(:branch_list_keyset_pagination, @project)
= render('kaminari/gitlab/without_count', previous_path: @prev_path, next_path: @next_path)
- else
= paginate @branches, theme: 'gitlab'
diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml
index 07bae7819a4..c06f60bd05d 100644
--- a/app/views/projects/branches/new.html.haml
+++ b/app/views/projects/branches/new.html.haml
@@ -2,8 +2,8 @@
- default_ref = params[:ref] || @project.default_branch
- if @error
- = render Pajamas::AlertComponent.new(variant: :danger) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(variant: :danger) do |c|
+ = c.body do
= @error
%h3.page-title
= _('New Branch')
diff --git a/app/views/projects/buttons/_clone.html.haml b/app/views/projects/buttons/_clone.html.haml
index 74d10f11898..5fd1c5cd403 100644
--- a/app/views/projects/buttons/_clone.html.haml
+++ b/app/views/projects/buttons/_clone.html.haml
@@ -30,13 +30,23 @@
%label.label-bold{ class: 'gl-px-4!' }
= _('Open in your IDE')
- if ssh_enabled?
- %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + CGI.escape(project.ssh_url_to_repo) }
+ - escaped_ssh_url_to_repo = CGI.escape(project.ssh_url_to_repo)
+ %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + escaped_ssh_url_to_repo }
.gl-new-dropdown-item-text-wrapper
= _('Visual Studio Code (SSH)')
- if http_enabled?
- %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + CGI.escape(project.http_url_to_repo) }
+ - escaped_http_url_to_repo = CGI.escape(project.http_url_to_repo)
+ %a.dropdown-item.open-with-link{ href: 'vscode://vscode.git/clone?url=' + escaped_http_url_to_repo }
.gl-new-dropdown-item-text-wrapper
= _('Visual Studio Code (HTTPS)')
+ - if ssh_enabled?
+ %a.dropdown-item.open-with-link{ href: 'jetbrains://idea/checkout/git?idea.required.plugins.id=Git4Idea&checkout.repo=' + escaped_ssh_url_to_repo }
+ .gl-new-dropdown-item-text-wrapper
+ = _('IntelliJ IDEA (SSH)')
+ - if http_enabled?
+ %a.dropdown-item.open-with-link{ href: 'jetbrains://idea/checkout/git?idea.required.plugins.id=Git4Idea&checkout.repo=' + escaped_http_url_to_repo }
+ .gl-new-dropdown-item-text-wrapper
+ = _('IntelliJ IDEA (HTTPS)')
- if show_xcode_link?(@project)
%a.dropdown-item.open-with-link{ href: xcode_uri_to_repo(@project) }
.gl-new-dropdown-item-text-wrapper
diff --git a/app/views/projects/ci/pipeline_editor/show.html.haml b/app/views/projects/ci/pipeline_editor/show.html.haml
index c4757ea9c26..18eac48d42a 100644
--- a/app/views/projects/ci/pipeline_editor/show.html.haml
+++ b/app/views/projects/ci/pipeline_editor/show.html.haml
@@ -1,5 +1,6 @@
- @force_fluid_layout = true
- add_page_specific_style 'page_bundles/pipelines'
+- add_page_specific_style 'page_bundles/pipeline_editor'
- page_title s_('Pipelines|Pipeline Editor')
- content_for :prefetch_asset_tags do
diff --git a/app/views/projects/ci/secure_files/show.html.haml b/app/views/projects/ci/secure_files/show.html.haml
index db0734be6bd..1a87ccd753c 100644
--- a/app/views/projects/ci/secure_files/show.html.haml
+++ b/app/views/projects/ci/secure_files/show.html.haml
@@ -1,5 +1,3 @@
-- @content_class = "limit-container-width"
-
- page_title s_('Secure Files')
-#js-ci-secure-files{ data: { project_id: @project.id } }
+#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/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml
index 82d3bfbcfe6..c6fb3bcd559 100644
--- a/app/views/projects/commits/_commits.html.haml
+++ b/app/views/projects/commits/_commits.html.haml
@@ -14,7 +14,7 @@
%li.commits-row{ data: { day: day } }
%ul.content-list.commit-list.flex-list
- - if Feature.enabled?(:cached_commits, project, default_enabled: :yaml)
+ - if Feature.enabled?(:cached_commits, project)
= render partial: 'projects/commits/commit', collection: daily_commits, locals: { project: project, ref: ref, merge_request: merge_request }, cached: -> (commit) { commit_partial_cache_key(commit, ref: ref, merge_request: merge_request, request: request) }
- else
= render partial: 'projects/commits/commit', collection: daily_commits, locals: { project: project, ref: ref, merge_request: merge_request }
@@ -28,7 +28,7 @@
%li.commits-row
%ul.content-list.commit-list.flex-list
- - if Feature.enabled?(:cached_commits, project, default_enabled: :yaml)
+ - if Feature.enabled?(:cached_commits, project)
= render partial: 'projects/commits/commit', collection: context_commits, locals: { project: project, ref: ref, merge_request: merge_request }, cached: -> (commit) { commit_partial_cache_key(commit, ref: ref, merge_request: merge_request, request: request) }
- else
= render partial: 'projects/commits/commit', collection: context_commits, locals: { project: project, ref: ref, merge_request: merge_request }
@@ -36,8 +36,8 @@
- if hidden > 0
%li
= render Pajamas::AlertComponent.new(variant: :warning,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= n_('%s additional commit has been omitted to prevent performance issues.', '%s additional commits have been omitted to prevent performance issues.', hidden) % number_with_delimiter(hidden)
- if can_update_merge_request && context_commits&.empty?
diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml
index f9d3af7aa36..2d3d36a9157 100644
--- a/app/views/projects/default_branch/_show.html.haml
+++ b/app/views/projects/default_branch/_show.html.haml
@@ -9,7 +9,7 @@
= _('Set the default branch for this project. All merge requests and commits are made against this branch unless you specify a different one.')
.settings-content
- = form_for @project, remote: true, html: { multipart: true, anchor: 'default-branch-settings' }, authenticity_token: true do |f|
+ = gitlab_ui_form_for @project, remote: true, html: { multipart: true, anchor: 'default-branch-settings' }, authenticity_token: true do |f|
%fieldset
- if @project.empty_repo?
.text-secondary
@@ -20,12 +20,10 @@
= f.select(:default_branch, @project.repository.branch_names, {}, {class: 'select2 select-wide', data: { qa_selector: 'default_branch_dropdown' }})
.form-group
- .form-check
- = f.check_box :autoclose_referenced_issues, class: 'form-check-input'
- = f.label :autoclose_referenced_issues, class: 'form-check-label' do
- %strong= _("Auto-close referenced issues on default branch")
- .form-text.text-muted
- = _("When merge requests and commits in the default branch close, any issues they reference also close.")
- = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
+ - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.")
+ - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer'
+ = f.gitlab_ui_checkbox_component :autoclose_referenced_issues,
+ _("Auto-close referenced issues on default branch"),
+ help_text: (help_text + "&nbsp;" + help_icon).html_safe
= f.submit _('Save changes'), class: "gl-button btn btn-confirm", data: { qa_selector: 'save_changes_button' }
diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml
index 504bbf3a304..e92297a5a6a 100644
--- a/app/views/projects/deployments/_deployment.html.haml
+++ b/app/views/projects/deployments/_deployment.html.haml
@@ -46,3 +46,4 @@
.btn-group.table-action-buttons
= render 'projects/deployments/actions', deployment: deployment
= render 'projects/deployments/rollback', deployment: deployment
+ = render_if_exists 'projects/deployments/approvals', deployment: deployment
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 6f4ffecd5e0..d596199f816 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -34,8 +34,7 @@
- if load_diff_files_async
- url = url_for(safe_params.merge(action: 'diff_files'))
.js-diffs-batch{ data: { diff_files_path: url } }
- .text-center
- %span.gl-spinner.gl-spinner-md
+ = gl_loading_icon( size: "md", css_class: "gl-mt-4" )
- else
= render partial: 'projects/diffs/file', collection: diff_files, as: :diff_file, locals: { project: diffs.project, environment: environment, diff_page_context: diff_page_context }
diff --git a/app/views/projects/diffs/_text_file.html.haml b/app/views/projects/diffs/_text_file.html.haml
index 2cd215c5518..9b64afa8c60 100644
--- a/app/views/projects/diffs/_text_file.html.haml
+++ b/app/views/projects/diffs/_text_file.html.haml
@@ -4,7 +4,7 @@
%a.show-suppressed-diff.cursor-pointer.js-show-suppressed-diff= _("Changes suppressed. Click to show.")
%table.text-file.diff-wrap-lines.code.code-commit.js-syntax-highlight.commit-diff{ data: diff_view_data, class: too_big ? 'hide' : '' }
- - if Feature.enabled?(:inline_haml_diff_line_rendering, @project, default_enabled: :yaml)
+ - if Feature.enabled?(:inline_haml_diff_line_rendering, @project)
- diff_file.highlighted_diff_lines.each do |line|
- line_code = diff_file.line_code(line)
diff --git a/app/views/projects/feature_flags/edit.html.haml b/app/views/projects/feature_flags/edit.html.haml
index ac8c0575077..121dcd31a13 100644
--- a/app/views/projects/feature_flags/edit.html.haml
+++ b/app/views/projects/feature_flags/edit.html.haml
@@ -2,6 +2,6 @@
- add_to_breadcrumbs s_('FeatureFlags|Feature Flags'), project_feature_flags_path(@project)
- breadcrumb_title @feature_flag.name
-- page_title s_('FeatureFlags|Edit Feature Flag')
+- page_title s_('FeatureFlags|Edit Feature Flag'), @feature_flag.name
#js-edit-feature-flag{ data: edit_feature_flag_data }
diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml
index 9b64f158a1b..13fd4cee0cc 100644
--- a/app/views/projects/forks/error.html.haml
+++ b/app/views/projects/forks/error.html.haml
@@ -3,8 +3,8 @@
= render Pajamas::AlertComponent.new(title: _('Fork Error!'),
variant: :danger,
alert_class: 'gl-mt-5',
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
%p
= _("You tried to fork %{link_to_the_project} but it failed for the following reason:").html_safe % { link_to_the_project: link_to_project(@project) }
@@ -17,5 +17,5 @@
- else
= error
- .gl-alert-actions
- = link_to _('Try to fork again'), new_project_fork_path(@project), title: _("Fork"), class: "btn gl-alert-action btn-info btn-md gl-button"
+ = c.actions do
+ = link_to _('Try to fork again'), new_project_fork_path(@project), title: _("Fork"), class: "btn gl-alert-action btn-info btn-md gl-button"
diff --git a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
index 9e3d9b4258a..a3569d41714 100644
--- a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
+++ b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
@@ -39,10 +39,9 @@
.label-container
- if generic_commit_status.tags.any?
- generic_commit_status.tags.each do |tag|
- %span.badge.badge-primary
- = tag
+ = gl_badge_tag tag, variant: :info, size: :sm
- if retried
- %span.badge.badge-warning retried
+ = gl_badge_tag retried, variant: :warning, size: :sm
- if pipeline_link
%td
diff --git a/app/views/projects/graphs/charts.html.haml b/app/views/projects/graphs/charts.html.haml
index 40280e0787f..ca0307aed60 100644
--- a/app/views/projects/graphs/charts.html.haml
+++ b/app/views/projects/graphs/charts.html.haml
@@ -46,7 +46,7 @@
.col-md-6
.tree-ref-container
.tree-ref-holder
- = render 'shared/ref_switcher', destination: 'graphs_commits'
+ = render 'shared/ref_switcher', destination: 'graphs_commits', path: @path
%ul.breadcrumb.repo-breadcrumb
= commits_breadcrumbs
diff --git a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
index f28b951ad62..291edf014c3 100644
--- a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
+++ b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml
@@ -3,6 +3,6 @@
- service_desk_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: service_desk_link_url }
= render Pajamas::AlertComponent.new(variant: :warning,
- alert_class: 'hide js-alert-moved-from-service-desk-warning gl-mt-5') do
- .gl-alert-body.gl-mr-3
+ alert_class: 'hide js-alert-moved-from-service-desk-warning gl-mt-5') do |c|
+ = c.body do
= s_('This project does not have %{service_desk_link_start}Service Desk%{service_desk_link_end} enabled, so the user who created the issue will no longer receive email notifications about new activity.').html_safe % { service_desk_link_start: service_desk_link_start, service_desk_link_end: '</a>'.html_safe }
diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml
index f1c19756474..a904b53515c 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, default_enabled: :yaml) ? discussions_path(@issue, per_page: 20) : discussions_path(@issue)
+- add_page_startup_api_call Feature.enabled?(:paginated_issue_discussions, @project) ? discussions_path(@issue, per_page: 20) : discussions_path(@issue)
- @gfm_form = true
diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml
index d74b6c0639c..fe2be0f73c9 100644
--- a/app/views/projects/issues/index.html.haml
+++ b/app/views/projects/issues/index.html.haml
@@ -13,7 +13,7 @@
issues_path: project_issues_path(@project),
project_path: @project.full_path } }
-- if Feature.enabled?(:vue_issues_list, @project&.group, default_enabled: :yaml)
+- if Feature.enabled?(:vue_issues_list, @project&.group)
.js-issues-list{ data: project_issues_list_data(@project, current_user) }
- if @can_bulk_update
= render 'shared/issuable/bulk_update_sidebar', type: :issues
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index 6c6f98e0b20..3572d1d6556 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -2,6 +2,7 @@
- add_to_breadcrumbs _("Issues"), project_issues_path(@project)
- breadcrumb_title @issue.to_reference
- page_title "#{@issue.title} (#{@issue.to_reference})", _("Issues")
+- add_page_specific_style 'page_bundles/issues_show'
= 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 9a2a1e57165..e725e8e6889 100644
--- a/app/views/projects/jobs/index.html.haml
+++ b/app/views/projects/jobs/index.html.haml
@@ -4,7 +4,7 @@
- add_page_specific_style 'page_bundles/ci_status'
- admin = local_assigns.fetch(:admin, false)
-- if Feature.enabled?(:jobs_table_vue, @project, default_enabled: :yaml)
+- 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
diff --git a/app/views/projects/mattermosts/_no_teams.html.haml b/app/views/projects/mattermosts/_no_teams.html.haml
index 3d901c6f59b..1f008496a34 100644
--- a/app/views/projects/mattermosts/_no_teams.html.haml
+++ b/app/views/projects/mattermosts/_no_teams.html.haml
@@ -1,9 +1,3 @@
-- if @teams_error_message
- = content_for :flash_message do
- = render Pajamas::AlertComponent.new(variant: :danger) do
- .gl-alert-body
- = @teams_error_message
-
%p
You aren’t a member of any team on the Mattermost instance at
%strong= Gitlab.config.mattermost.host
diff --git a/app/views/projects/mattermosts/new.html.haml b/app/views/projects/mattermosts/new.html.haml
index 9e293d07cb7..8254198bd41 100644
--- a/app/views/projects/mattermosts/new.html.haml
+++ b/app/views/projects/mattermosts/new.html.haml
@@ -1,10 +1,20 @@
-- @body_class = 'card-content'
+- add_to_breadcrumbs _('Integrations'), scoped_integrations_path(project: @project, group: @group)
+- add_to_breadcrumbs @integration.title, scoped_edit_integration_path(@integration, project: @project, group: @group)
+- breadcrumb_title _('New')
+- page_title @integration.title, _('Integrations')
+- @content_class = 'limit-container-width' unless fluid_layout
-.service-installation
- .inline.float-right
+- if @teams_error_message
+ = render Pajamas::AlertComponent.new(variant: :danger) do |c|
+ = c.body do
+ = @teams_error_message
+
+%h3
+ Install Mattermost Command
+ .gl-float-right
= custom_icon('mattermost_logo', size: 48)
- %h3 Install Mattermost Command
- - if @teams.empty?
- = render 'no_teams'
- - else
- = render 'team_selection'
+
+- if @teams.empty?
+ = render 'no_teams'
+- else
+ = render 'team_selection'
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 f6afac493d5..282faf7714e 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
@@ -1,36 +1,46 @@
- display_issuable_type = issuable_display_type(@merge_request)
-- button_class = "btn gl-button #{!@merge_request.closed? && 'js-draft-toggle-button'}"
-- toggle_class = "btn gl-button dropdown-toggle"
-.float-left.btn-group.gl-ml-3.gl-display-none.gl-md-display-flex
- = link_to @merge_request.closed? ? reopen_issuable_path(@merge_request) : toggle_draft_merge_request_path(@merge_request), method: :put, class: "#{button_class} btn-confirm-secondary" do
- - if @merge_request.closed?
- = _('Reopen')
- = display_issuable_type
- - else
- = @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft')
+.float-left.btn-group.gl-md-ml-3.gl-display-flex.dropdown.gl-new-dropdown.gl-md-w-auto.gl-w-full
+ = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md gl-button gl-dropdown-toggle btn-default-tertiary dropdown-icon-only dropdown-toggle-no-caret gl-display-none! gl-md-display-inline-flex!", data: { 'toggle' => 'dropdown' } do
+ %span.gl-sr-only= _('Toggle dropdown')
+ = sprite_icon "ellipsis_v", size: 16, css_class: "dropdown-icon gl-icon"
+ = button_tag type: 'button', class: "btn dropdown-toggle btn-default btn-md btn-block gl-button gl-dropdown-toggle gl-md-display-none!", data: { 'toggle' => 'dropdown' } do
+ %span.gl-new-dropdown-button-text= _('Merge request actions')
+ = sprite_icon "chevron-down", size: 16, css_class: "dropdown-icon gl-icon"
+ .dropdown-menu.dropdown-menu-right
+ .gl-new-dropdown-inner
+ .gl-new-dropdown-contents
+ %ul
+ - if can?(current_user, :update_merge_request, @merge_request)
+ %li.gl-new-dropdown-item{ class: "gl-md-display-none!" }
+ = link_to edit_project_merge_request_path(@project, @merge_request), class: 'dropdown-item' do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Edit')
+ - if @merge_request.open?
+ %li.gl-new-dropdown-item
+ = link_to toggle_draft_merge_request_path(@merge_request), method: :put, class: 'dropdown-item js-draft-toggle-button' do
+ .gl-new-dropdown-item-text-wrapper
+ = @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft')
+ %li.gl-new-dropdown-item.js-close-item
+ = link_to close_issuable_path(@merge_request), method: :put, class: 'dropdown-item' do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Close')
+ = display_issuable_type
+ - elsif !@merge_request.source_project_missing?
+ %li.gl-new-dropdown-item
+ = link_to reopen_issuable_path(@merge_request), method: :put, class: 'dropdown-item' do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Reopen')
+ = display_issuable_type
- - if !@merge_request.closed? || !issuable_author_is_current_user(@merge_request)
- = button_tag type: 'button', class: "#{toggle_class} btn-confirm-secondary btn-icon", data: { 'toggle' => 'dropdown' } do
- %span.gl-sr-only= _('Toggle dropdown')
- = sprite_icon "chevron-down", size: 12, css_class: "gl-button-icon"
-
- %ul.dropdown-menu.dropdown-menu-right
- - if @merge_request.open?
- %li
- = link_to close_issuable_path(@merge_request), method: :put do
- .description
- %strong.title
- = _('Close')
- = display_issuable_type
-
- - unless issuable_author_is_current_user(@merge_request)
- - unless @merge_request.closed?
- %li.divider.droplab-item-ignore
-
- %li
- %a{ href: new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)) }
- .description
- %strong.title= _('Report abuse')
- %p.text.gl-mb-0
- = _('Report %{display_issuable_type} that are abusive, inappropriate or spam.') % { display_issuable_type: display_issuable_type.pluralize }
+ - if current_user && moved_mr_sidebar_enabled?
+ %li.gl-new-dropdown-divider
+ %hr.dropdown-divider
+ %li.gl-new-dropdown-item.js-sidebar-subscriptions-entry-point
+ - unless issuable_author_is_current_user(@merge_request)
+ %li.gl-new-dropdown-item
+ = link_to new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'dropdown-item' do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Report abuse')
+ - if moved_mr_sidebar_enabled?
+ %li.gl-new-dropdown-item#js-lock-entry-point
diff --git a/app/views/projects/merge_requests/_code_dropdown.html.haml b/app/views/projects/merge_requests/_code_dropdown.html.haml
new file mode 100644
index 00000000000..0bd28e315d9
--- /dev/null
+++ b/app/views/projects/merge_requests/_code_dropdown.html.haml
@@ -0,0 +1,39 @@
+.float-left.gl-md-ml-3.dropdown.gl-new-dropdown{ class: "gl-display-none! gl-md-display-flex!" }
+ #js-check-out-modal{ data: how_merge_modal_data(@merge_request) }
+ = button_tag type: 'button', class: "btn dropdown-toggle btn-confirm gl-button gl-dropdown-toggle", data: { toggle: 'dropdown', qa_selector: 'mr_code_dropdown' } do
+ %span.gl-new-dropdown-button-text= _('Code')
+ = sprite_icon "chevron-down", size: 16, css_class: "dropdown-icon gl-icon gl-ml-2 gl-mr-0!"
+ .dropdown-menu.dropdown-menu-right
+ .gl-new-dropdown-inner
+ .gl-new-dropdown-contents
+ %ul
+ %li.gl-new-dropdown-section-header
+ %header.dropdown-header
+ = _('Review changes')
+ %li.gl-new-dropdown-item
+ %button.dropdown-item.js-check-out-modal-trigger{ type: 'button' }
+ .gl-new-dropdown-item-text-wrapper
+ = _('Check out branch')
+ - if current_user
+ %li.gl-new-dropdown-item
+ = link_to ide_merge_request_path(@merge_request), class: 'dropdown-item', data: { qa_selector: 'open_in_web_ide_button' } do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Open in Web IDE')
+ - if Gitlab::CurrentSettings.gitpod_enabled && current_user&.gitpod_enabled
+ %li.gl-new-dropdown-item
+ = link_to "#{Gitlab::CurrentSettings.gitpod_url}##{merge_request_url(@merge_request)}", class: 'dropdown-item' do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Open in Gitpod')
+ %li.gl-new-dropdown-divider
+ %hr.dropdown-divider
+ %li.gl-new-dropdown-section-header
+ %header.dropdown-header
+ = _('Download')
+ %li.gl-new-dropdown-item
+ = link_to merge_request_path(@merge_request, format: :patch), class: 'dropdown-item', download: '', data: { qa_selector: 'download_email_patches_menu_item' } do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Email patches')
+ %li.gl-new-dropdown-item
+ = link_to merge_request_path(@merge_request, format: :diff), class: 'dropdown-item', data: { qa_selector: 'download_plain_diff_menu_item' } do
+ .gl-new-dropdown-item-text-wrapper
+ = _('Plain diff')
diff --git a/app/views/projects/merge_requests/_mr_box.html.haml b/app/views/projects/merge_requests/_mr_box.html.haml
index 916b841e350..e16631b4943 100644
--- a/app/views/projects/merge_requests/_mr_box.html.haml
+++ b/app/views/projects/merge_requests/_mr_box.html.haml
@@ -1,3 +1,7 @@
.detail-page-description.py-2
- %h2.title.mb-0{ data: { qa_selector: 'title_content' } }
- = markdown_field(@merge_request, :title)
+ - if Feature.enabled?(:updated_mr_header, @project)
+ = render 'shared/issuable/status_box', issuable: @merge_request
+ = merge_request_header(@project, @merge_request)
+ - else
+ %h2.title.mb-0{ data: { qa_selector: 'title_content' } }
+ = markdown_field(@merge_request, :title)
diff --git a/app/views/projects/merge_requests/_mr_title.html.haml b/app/views/projects/merge_requests/_mr_title.html.haml
index 49b7320d630..638c520e210 100644
--- a/app/views/projects/merge_requests/_mr_title.html.haml
+++ b/app/views/projects/merge_requests/_mr_title.html.haml
@@ -2,51 +2,40 @@
- can_update_merge_request = can?(current_user, :update_merge_request, @merge_request)
- 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)
-- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden, current_user&.preferred_language]
+- updated_mr_header_enabled = Feature.enabled?(:updated_mr_header, @project)
+- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden, current_user&.preferred_language, updated_mr_header_enabled]
= cache(cache_key, expires_in: 1.day) do
- if @merge_request.closed_or_merged_without_fork?
= render Pajamas::AlertComponent.new(alert_class: 'gl-mb-5',
variant: :danger,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= _('The source project of this merge request has been removed.')
- .detail-page-header.border-bottom-0.pt-0.pb-0
+ .detail-page-header.border-bottom-0.pt-0.pb-0{ class: "#{'gl-display-block gl-md-display-flex!' if updated_mr_header_enabled}" }
.detail-page-header-body
- = render "shared/issuable/status_box", issuable: @merge_request
+ - unless updated_mr_header_enabled
+ = render "shared/issuable/status_box", issuable: @merge_request
+ .issuable-meta{ class: "#{'gl-display-flex' if updated_mr_header_enabled}" }
+ - if updated_mr_header_enabled
+ #js-issuable-header-warnings
+ %h2.title.gl-my-0.gl-display-inline-block{ data: { qa_selector: 'title_content' } }
+ = markdown_field(@merge_request, :title)
+ - else
+ #js-issuable-header-warnings
+ = issuable_meta(@merge_request, @project)
- .issuable-meta
- #js-issuable-header-warnings
- = issuable_meta(@merge_request, @project)
+ %div
+ %button.gl-button.btn.btn-default.btn-icon.float-right.gl-display-block.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ type: 'button', class: "#{'gl-md-display-none!' if moved_mr_sidebar_enabled? } #{'gl-sm-display-none!' unless moved_mr_sidebar_enabled?}" }
+ = sprite_icon('chevron-double-lg-left')
- %a.gl-button.btn.btn-default.btn-icon.float-right.d-block.d-sm-none.gutter-toggle.issuable-gutter-toggle.js-sidebar-toggle{ href: "#" }
- = sprite_icon('chevron-double-lg-left')
+ .detail-page-header-actions.js-issuable-actions{ class: "#{'gl-align-self-start is-merge-request' if updated_mr_header_enabled}" }
+ - if can_update_merge_request
+ = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" }
- .detail-page-header-actions.js-issuable-actions
- .clearfix.dropdown
- %button.gl-button.btn.btn-default.float-left.gl-md-display-none.gl-w-full{ type: "button", data: { toggle: "dropdown" } }
- Options
- = sprite_icon('chevron-down', css_class: 'gl-text-gray-500')
- .dropdown-menu.dropdown-menu-right
- %ul
- - if can_update_merge_request
- %li= link_to _('Edit'), edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)
- - if @merge_request.opened?
- %li
- = link_to @merge_request.work_in_progress? ? _('Mark as ready') : _('Mark as draft'), toggle_draft_merge_request_path(@merge_request), method: :put, class: "js-draft-toggle-button"
- %li{ class: [merge_request_button_visibility(@merge_request, true), 'js-close-item'] }
- = link_to _('Close'), merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, title: 'Close merge request'
- - if can_reopen_merge_request
- %li{ class: merge_request_button_visibility(@merge_request, false) }
- = link_to _('Reopen'), merge_request_path(@merge_request, merge_request: { state_event: :reopen }), method: :put, title: 'Reopen merge request'
- - unless @merge_request.merged? || current_user == @merge_request.author
- %li= link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request))
+ - if @merge_request.source_project
+ = render 'projects/merge_requests/code_dropdown'
- - if can_update_merge_request
- = link_to _('Edit'), edit_project_merge_request_path(@project, @merge_request), class: "gl-display-none gl-md-display-block btn gl-button btn-default btn-grouped js-issuable-edit", data: { qa_selector: "edit_button" }
-
- - if can_update_merge_request && !are_close_and_open_buttons_hidden
- = render 'projects/merge_requests/close_reopen_draft_report_toggle'
- - elsif !@merge_request.merged?
- = link_to _('Report abuse'), new_abuse_report_path(user_id: @merge_request.author.id, ref_url: merge_request_url(@merge_request)), class: 'gl-display-none gl-md-display-block gl-button btn btn-default gl-float-right gl-ml-3', title: _('Report abuse')
+ - if current_user
+ = render 'projects/merge_requests/close_reopen_draft_report_toggle'
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 e2ac8ef5abc..811b45ef8af 100644
--- a/app/views/projects/merge_requests/creations/_new_compare.html.haml
+++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml
@@ -22,7 +22,7 @@
selected: f.object.source_project_id
.merge-request-select.dropdown
= f.hidden_field :source_branch
- = dropdown_toggle f.object.source_branch.presence || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch }, { toggle_class: "js-compare-dropdown js-source-branch monospace" }
+ = dropdown_toggle f.object.source_branch.presence || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch, qa_selector: "source_branch_dropdown" }, { toggle_class: "js-compare-dropdown js-source-branch monospace" }
.dropdown-menu.dropdown-menu-selectable.js-source-branch-dropdown.git-revision-dropdown
= dropdown_title(_("Select source branch"))
= dropdown_filter(_("Search branches"))
@@ -62,4 +62,4 @@
- if @merge_request.errors.any?
= form_errors(@merge_request)
- = f.submit 'Compare branches and continue', class: "gl-button btn btn-confirm mr-compare-btn"
+ = f.submit 'Compare branches and continue', class: "gl-button btn btn-confirm mr-compare-btn", data: { qa_selector: "compare_branches_button" }
diff --git a/app/views/projects/merge_requests/invalid.html.haml b/app/views/projects/merge_requests/invalid.html.haml
index ce5a042fbf8..4596fcd280d 100644
--- a/app/views/projects/merge_requests/invalid.html.haml
+++ b/app/views/projects/merge_requests/invalid.html.haml
@@ -10,8 +10,8 @@
= render "projects/merge_requests/mr_box"
= render Pajamas::AlertComponent.new(variant: :danger,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
- if @merge_request.for_fork? && !@merge_request.source_project
= err_fork_project_removed
- elsif !@merge_request.source_branch_exists?
diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml
index 008f2588dbd..13e5451df98 100644
--- a/app/views/projects/merge_requests/show.html.haml
+++ b/app/views/projects/merge_requests/show.html.haml
@@ -1,5 +1,6 @@
- @gfm_form = true
-- @content_class = "merge-request-container#{' limit-container-width' unless fluid_layout}"
+- unless moved_mr_sidebar_enabled?
+ - @content_class = "merge-request-container#{' limit-container-width' unless fluid_layout}"
- add_to_breadcrumbs _("Merge requests"), project_merge_requests_path(@project)
- breadcrumb_title @merge_request.to_reference
- page_title "#{@merge_request.title} (#{@merge_request.to_reference})", _("Merge requests")
@@ -41,14 +42,14 @@
= _("Changes")
= gl_badge_tag @diffs_count, { size: :sm }
.d-flex.flex-wrap.align-items-center.justify-content-lg-end
- #js-vue-discussion-counter
+ #js-vue-discussion-counter{ data: { blocks_merge: @project.only_allow_merge_if_all_discussions_are_resolved?.to_s } }
.tab-content#diff-notes-app
#js-diff-file-finder
#js-code-navigation
= render "projects/merge_requests/tabs/pane", id: "notes", class: "notes voting_notes" do
- .row
- %section.col-md-12
+ %div{ class: "#{'merge-request-overview' if moved_mr_sidebar_enabled?}" }
+ %section
.issuable-discussion.js-vue-notes-event
- if @merge_request.description.present?
.detail-page-description
@@ -70,6 +71,8 @@
help_page_path: suggest_changes_help_path,
current_user_data: @current_user_data,
is_locked: @merge_request.discussion_locked.to_s } }
+ - if moved_mr_sidebar_enabled?
+ = render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, reviewers: @merge_request.reviewers, source_branch: @merge_request.source_branch
= render "projects/merge_requests/tabs/pane", name: "commits", id: "commits", class: "commits" do
-# This tab is always loaded via AJAX
@@ -83,7 +86,8 @@
.loading.hide
= gl_loading_icon(size: 'lg')
-= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, reviewers: @merge_request.reviewers, source_branch: @merge_request.source_branch
+- unless moved_mr_sidebar_enabled?
+ = render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, reviewers: @merge_request.reviewers, source_branch: @merge_request.source_branch
- if @merge_request.can_be_reverted?(current_user)
= render "projects/commit/change", type: 'revert', commit: @merge_request.merge_commit
@@ -92,7 +96,7 @@
#js-review-bar
-- if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+- if current_user&.mr_attention_requests_enabled?
#js-need-attention-sidebar-onboarding
= render 'projects/invite_members_modal', project: @project
diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml
index 154a92e6ec8..326a7c4027f 100644
--- a/app/views/projects/milestones/index.html.haml
+++ b/app/views/projects/milestones/index.html.haml
@@ -9,7 +9,7 @@
= render 'shared/milestones/search_form'
= render 'shared/milestones_sort_dropdown'
- if can?(current_user, :admin_milestone, @project)
- = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
+ = link_to new_project_milestone_path(@project), class: 'gl-button btn btn-confirm gl-ml-3', data: { qa_selector: "new_project_milestone_link" }, title: _('New milestone') do
= _('New milestone')
- if @milestones.blank?
diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml
index 13aa8f56d20..4ec72176202 100644
--- a/app/views/projects/milestones/show.html.haml
+++ b/app/views/projects/milestones/show.html.haml
@@ -14,8 +14,8 @@
- if can?(current_user, :read_issue, @project) && @milestone.total_issues_count == 0
= render Pajamas::AlertComponent.new(dismissible: false,
alert_data: { testid: 'no-issues-alert' },
- alert_class: 'gl-mt-3 gl-mb-5') do
- .gl-alert-body
+ alert_class: 'gl-mt-3 gl-mb-5') do |c|
+ = c.body do
= _('Assign some issues to this milestone.')
- else
= render 'shared/milestones/milestone_complete_alert', milestone: @milestone do
diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml
index bc8400a63f9..d689b54678e 100644
--- a/app/views/projects/mirrors/_mirror_repos.html.haml
+++ b/app/views/projects/mirrors/_mirror_repos.html.haml
@@ -37,8 +37,8 @@
.panel-footer
= f.submit _('Mirror repository'), class: 'gl-button btn btn-confirm js-mirror-submit qa-mirror-repository-button', name: :update_remote_mirror
- else
- = render Pajamas::AlertComponent.new(dismissible: false) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(dismissible: false) do |c|
+ = c.body do
= _('Mirror settings are only available to GitLab administrators.')
.panel.panel-default
diff --git a/app/views/projects/pages/_access.html.haml b/app/views/projects/pages/_access.html.haml
index 67a2eeb7e7b..c5efacb21af 100644
--- a/app/views/projects/pages/_access.html.haml
+++ b/app/views/projects/pages/_access.html.haml
@@ -15,7 +15,7 @@
= external_link(domain.url, domain.url)
- unless @project.public_pages?
.card-footer.gl-alert-warning
- - help_page = help_page_path('/user/project/pages/pages_access_control')
+ - help_page = help_page_path('user/project/pages/pages_access_control')
- link_start = '<a href="%{url}" target="_blank" class="gl-alert-link" rel="noopener noreferrer">'.html_safe % { url: help_page }
- link_end = '</a>'.html_safe
= html_escape_once(s_('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.')).html_safe % { link_start: link_start, link_end: link_end, strong_start: '<strong>'.html_safe, strong_end: '</strong>'.html_safe }
diff --git a/app/views/projects/pages/_destroy.haml b/app/views/projects/pages/_destroy.haml
index 99efb0b98c6..993026d2884 100644
--- a/app/views/projects/pages/_destroy.haml
+++ b/app/views/projects/pages/_destroy.haml
@@ -8,7 +8,7 @@
%p.gl-mb-0
= s_('GitLabPages|Removing pages will prevent them from being exposed to the outside world.')
.card-footer
- = link_to s_('GitLabPages|Remove pages'), project_pages_path(@project), data: { confirm: s_('GitLabPages|Are you sure?')}, method: :delete, class: "btn gl-button btn-danger"
+ = link_to s_('GitLabPages|Remove pages'), project_pages_path(@project), data: { confirm: s_('GitLabPages|Are you sure?'), 'confirm-btn-variant': 'danger'}, method: :delete, class: "btn gl-button btn-danger", "aria-label": s_('GitLabPages|Remove pages')
- else
.nothing-here-block
= s_('GitLabPages|Only project maintainers can remove pages')
diff --git a/app/views/projects/pages/_list.html.haml b/app/views/projects/pages/_list.html.haml
index 4e9c77564da..04178804de4 100644
--- a/app/views/projects/pages/_list.html.haml
+++ b/app/views/projects/pages/_list.html.haml
@@ -20,7 +20,7 @@
= gl_badge_tag s_('GitLabPages|Expired'), variant: :danger
%div
= link_to s_('GitLabPages|Edit'), project_pages_domain_path(@project, domain), class: "btn gl-button btn-sm btn-grouped btn-confirm btn-inverted"
- = link_to s_('GitLabPages|Remove'), project_pages_domain_path(@project, domain), data: { confirm: s_('GitLabPages|Are you sure?')}, method: :delete, class: "btn gl-button btn-danger btn-sm btn-grouped"
+ = link_to s_('GitLabPages|Remove'), project_pages_domain_path(@project, domain), data: { confirm: s_('GitLabPages|Are you sure?'), 'confirm-btn-variant': 'danger'}, "aria-label": s_("GitLabPages|Remove domain"), method: :delete, class: "btn gl-button btn-danger btn-sm btn-grouped"
- if domain.needs_verification?
%li.list-group-item.bs-callout-warning
- details_link_start = "<a href='#{project_pages_domain_path(@project, domain)}'>".html_safe
diff --git a/app/views/projects/pages_domains/_certificate.html.haml b/app/views/projects/pages_domains/_certificate.html.haml
index 861305dc93b..4ba3e084dc4 100644
--- a/app/views/projects/pages_domains/_certificate.html.haml
+++ b/app/views/projects/pages_domains/_certificate.html.haml
@@ -38,7 +38,8 @@
= domain_presenter.pages_domain.subject || _('missing')
= link_to _('Remove'),
clean_certificate_project_pages_domain_path(@project, domain_presenter),
- data: { confirm: _('Are you sure?') },
+ data: { confirm: _('Are you sure?'), 'confirm-btn-variant': 'danger' },
+ 'aria-label': s_("GitLabPages|Remove certificate"),
class: 'gl-button btn btn-danger btn-sm',
method: :delete
- else
diff --git a/app/views/projects/pages_domains/_form.html.haml b/app/views/projects/pages_domains/_form.html.haml
index d3e2854ff19..9d9603b0947 100644
--- a/app/views/projects/pages_domains/_form.html.haml
+++ b/app/views/projects/pages_domains/_form.html.haml
@@ -1,7 +1,8 @@
- if domain_presenter.errors.any?
- = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do
- - domain_presenter.errors.full_messages.each do |msg|
- = msg
+ = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do |c|
+ = c.body do
+ - domain_presenter.errors.full_messages.each do |msg|
+ = msg
.form-group.border-section
.row
diff --git a/app/views/projects/pipelines/_with_tabs.html.haml b/app/views/projects/pipelines/_with_tabs.html.haml
index 88e6b98b115..6b26c9f3f00 100644
--- a/app/views/projects/pipelines/_with_tabs.html.haml
+++ b/app/views/projects/pipelines/_with_tabs.html.haml
@@ -32,40 +32,45 @@
#js-pipeline-jobs-vue{ data: { full_path: @project.full_path, pipeline_iid: @pipeline.iid } }
- if @pipeline.failed_builds.present?
- #js-tab-failures.build-failures.tab-pane.build-page
- %table.table.responsive-table.ci-table.responsive-table-sm-rounded
- %thead
- %th.table-th-transparent
- %th.table-th-transparent= _('Name')
- %th.table-th-transparent= _('Stage')
- %th.table-th-transparent= _('Failure')
+ #js-tab-failures.tab-pane
+ - if Feature.enabled?(:failed_jobs_tab_vue, @project)
+ #js-pipeline-failed-jobs-vue{ data: { full_path: @project.full_path, pipeline_iid: @pipeline.iid, failed_jobs_summary_data: prepare_failed_jobs_summary_data(@pipeline.failed_builds) } }
+ - else
+ .build-failures.build-page
+ %table.table.gl-table.responsive-table.ci-table.responsive-table-sm-rounded
+ %thead
+ %th
+ %th= _('Name')
+ %th= _('Stage')
+ %th= _('Failure')
+ %th
- %tbody
- - @pipeline.failed_builds.each_with_index do |build, index|
- - job = build.present(current_user: current_user)
- %tr.build-state.responsive-table-border-start
- %td.responsive-table-cell.ci-status-icon-failed{ data: { column: _('Status')} }
- .d-none.d-md-block.build-icon
- = sprite_icon("status_#{build.status}")
- .d-md-none.build-badge
- = render "ci/status/badge", link: false, status: job.detailed_status(current_user)
- %td.responsive-table-cell.build-name{ data: { column: _('Name')} }
- = link_to build.name, pipeline_job_url(pipeline, build)
- %td.responsive-table-cell.build-stage{ data: { column: _('Stage')} }
- = build.stage.titleize
- %td.responsive-table-cell.build-failure{ data: { column: _('Failure')} }
- = build.present.callout_failure_message
- %td.responsive-table-cell.build-actions
- - if can?(current_user, :update_build, job) && job.retryable?
- = link_to retry_project_job_path(build.project, build, 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')
- - if can?(current_user, :read_build, job)
- %tr.build-log-row.responsive-table-border-end
- %td
- %td.responsive-table-cell.build-log-container{ colspan: 4 }
- %pre.build-log.build-log-rounded
- %code.bash.js-build-output
- = build_summary(build)
+ %tbody
+ - @pipeline.failed_builds.each_with_index do |build, index|
+ - job = build.present(current_user: current_user)
+ %tr.build-state.responsive-table-border-start
+ %td.responsive-table-cell.ci-status-icon-failed{ data: { column: _('Status')} }
+ .d-none.d-md-block.build-icon
+ = sprite_icon("status_#{build.status}")
+ .d-md-none.build-badge
+ = render "ci/status/badge", link: false, status: job.detailed_status(current_user)
+ %td.responsive-table-cell.build-name{ data: { column: _('Name')} }
+ = link_to build.name, pipeline_job_url(pipeline, build)
+ %td.responsive-table-cell.build-stage{ data: { column: _('Stage')} }
+ = build.stage.titleize
+ %td.responsive-table-cell.build-failure{ data: { column: _('Failure')} }
+ = build.present.callout_failure_message
+ %td.responsive-table-cell.build-actions
+ - if can?(current_user, :update_build, job) && job.retryable?
+ = link_to retry_project_job_path(build.project, build, 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')
+ - if can?(current_user, :read_build, job)
+ %tr.build-log-row.responsive-table-border-end
+ %td
+ %td.responsive-table-cell.build-log-container{ colspan: 4 }
+ %pre.build-log.build-log-rounded
+ %code.bash.js-build-output
+ = build_summary(build)
#js-tab-dag.tab-pane
#js-pipeline-dag-vue{ data: { pipeline_project_path: @project.full_path, pipeline_iid: @pipeline.iid, empty_svg_path: image_path('illustrations/empty-state/empty-dag-md.svg'), about_dag_doc_path: help_page_path('ci/directed_acyclic_graph/index.md'), dag_doc_path: help_page_path('ci/yaml/index.md', anchor: 'needs')} }
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index 2b0a0fc1253..30b224a60da 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 }
#js-pipeline-notification{ data: { deprecated_keywords_doc_path: help_page_path('ci/yaml/index.md', anchor: 'deprecated-keywords'), full_path: @project.full_path, pipeline_iid: @pipeline.iid } }
- - if Feature.enabled?(:pipeline_tabs_vue, @project, default_enabled: :yaml)
+ - if Feature.enabled?(:pipeline_tabs_vue, @project)
#js-pipeline-tabs{ data: js_pipeline_tabs_data(@project, @pipeline) }
- else
= render "projects/pipelines/with_tabs", pipeline: @pipeline, stages: @stages, pipeline_has_errors: pipeline_has_errors
diff --git a/app/views/projects/runners/_group_runners.html.haml b/app/views/projects/runners/_group_runners.html.haml
index 8134ee8f417..449b6c25f50 100644
--- a/app/views/projects/runners/_group_runners.html.haml
+++ b/app/views/projects/runners/_group_runners.html.haml
@@ -28,10 +28,7 @@
= _('This group does not have any group runners yet.')
- if can?(current_user, :admin_group_runners, @project.group)
- - if Feature.enabled?(:runner_list_group_view_vue_ui, @group, default_enabled: :yaml)
- - register_runners_path = group_runners_path(@project.group)
- - else
- - register_runners_path = group_settings_ci_cd_path(@project.group)
+ - register_runners_path = group_runners_path(@project.group)
- group_link = link_to _("group's CI/CD settings."), register_runners_path
= _('Group owners can register group runners in the %{link}').html_safe % { link: group_link }
- else
diff --git a/app/views/projects/serverless/functions/index.html.haml b/app/views/projects/serverless/functions/index.html.haml
deleted file mode 100644
index 03a1b0ee7bb..00000000000
--- a/app/views/projects/serverless/functions/index.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- @content_class = "limit-container-width" unless fluid_layout
-- breadcrumb_title _('Serverless')
-- page_title _('Serverless')
-- status_path = project_serverless_functions_path(@project, format: :json)
-- clusters_path = project_clusters_path(@project)
-
-.serverless-functions-page.js-serverless-functions-page{ data: { status_path: status_path,
- installed: @installed,
- clusters_path: clusters_path,
- help_path: help_page_path('user/project/clusters/serverless/index'),
- empty_image_path: image_path('illustrations/empty-state/empty-serverless-lg.svg') } }
-
-.js-serverless-functions-notice
- .flash-container
-
-.top-area.adjust.d-flex.justify-content-center.gl-border-none
- .serverless-functions-table#js-serverless-functions
diff --git a/app/views/projects/serverless/functions/show.html.haml b/app/views/projects/serverless/functions/show.html.haml
deleted file mode 100644
index dd81d957e51..00000000000
--- a/app/views/projects/serverless/functions/show.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-- @content_class = "limit-container-width" unless fluid_layout
-- clusters_path = project_clusters_path(@project)
-- help_path = help_page_path('user/project/clusters/serverless/index')
-
-- add_to_breadcrumbs('Serverless', project_serverless_functions_path(@project))
-
-- page_title @service[:name]
-
-.serverless-function-details-page.js-serverless-function-details-page{ data: { service: @service.as_json,
- prometheus: @prometheus,
- clusters_path: clusters_path,
- help_path: help_path } }
-
-.serverless-function-details#js-serverless-function-details
-
-.js-serverless-function-notice
- .flash-container
-
-.function-holder.js-function-holder.input-group
diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml
index d1d9a220068..9d74f99bb19 100644
--- a/app/views/projects/services/_form.html.haml
+++ b/app/views/projects/services/_form.html.haml
@@ -1,5 +1,5 @@
-- if lookup_context.template_exists?('top', "projects/services/#{integration.to_param}", true)
- = render "projects/services/#{integration.to_param}/top", integration: integration
+- if lookup_context.template_exists?('top', "shared/integrations/#{integration.to_param}", true)
+ = render "shared/integrations/#{integration.to_param}/top", integration: integration
- if integration.activate_disabled_reason.present? && integration.activate_disabled_reason[:trackers].any?
-# When using integration.activate_disabled_reason[:trackers], it's potentially insecure to use the raw records
@@ -7,8 +7,8 @@
-# For example, we can get the link to each tracker with scoped_edit_integration_path(tracker, tracker.project)
= render Pajamas::AlertComponent.new(title: s_('ExternalIssueIntegration|Another issue tracker is already in use'),
variant: :warning,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= s_('ExternalIssueIntegration|Only one issue tracker integration can be active at a time. Please disable the active tracker first and try again.')
%h2.gl-mb-4
@@ -17,6 +17,6 @@
= sprite_icon('check', css_class: 'gl-text-green-500')
= render 'shared/integration_settings', integration: integration
-- if lookup_context.template_exists?('show', "projects/services/#{integration.to_param}", true)
+- if lookup_context.template_exists?('show', "shared/integrations/#{integration.to_param}", true)
%hr
- = render "projects/services/#{integration.to_param}/show", integration: integration
+ = render "shared/integrations/#{integration.to_param}/show", integration: integration
diff --git a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml b/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml
deleted file mode 100644
index 9d8ce186232..00000000000
--- a/app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml
+++ /dev/null
@@ -1,98 +0,0 @@
-- pretty_name = @project&.full_name ? html_escape(@project&.full_name) : '<' + _('project name') + '>'
-- run_actions_text = html_escape(s_("ProjectService|Perform common operations on GitLab project: %{project_name}")) % { project_name: pretty_name }
-
-%p= s_("ProjectService|To configure this integration, you should:")
-%ul.list-unstyled.indent-list
- %li
- 1.
- = link_to 'https://docs.gitlab.com/ee/user/project/integrations/mattermost_slash_commands.html#enable-custom-slash-commands', target: '_blank', rel: 'noopener noreferrer nofollow' do
- Enable custom slash commands
- = sprite_icon('external-link')
- on your Mattermost installation.
- %li
- 2.
- = link_to 'https://docs.gitlab.com/ee/user/project/integrations/mattermost_slash_commands.html#create-a-slash-command', target: '_blank', rel: 'noopener noreferrer nofollow' do
- Add a slash command
- = sprite_icon('external-link')
- in your Mattermost team with the options listed below.
- %li
- 3. Paste the token into the
- %strong Token
- field.
- %li
- 4. Select the
- %strong Active
- check box, then select
- %strong Save changes
- to start using GitLab inside Mattermost!
-
-%hr
-
-.help-form
- .form-group
- = label_tag :display_name, _('Display name'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :display_name, "GitLab / #{pretty_name}".html_safe, class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#display_name', class: 'input-group-text')
-
- .form-group
- = label_tag :description, _('Description'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :description, run_actions_text, class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#description', class: 'input-group-text')
-
- .form-group
- = label_tag nil, s_('MattermostService|Command trigger word'), class: 'col-12 col-form-label label-bold'
- .col-12
- %p= s_('MattermostService|Fill in the word that works best for your team.')
- %p
- = s_('MattermostService|Suggestions:')
- %code= 'gitlab'
- - if @project
- %code= @project.path # Path contains no spaces, but dashes
- %code= @project.full_path
-
- .form-group
- = label_tag :request_url, s_('MattermostService|Request URL'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :request_url, service_trigger_url(integration), class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#request_url', class: 'input-group-text')
-
- .form-group
- = label_tag nil, s_('MattermostService|Request method'), class: 'col-12 col-form-label label-bold'
- .col-12 POST
-
- .form-group
- = label_tag :response_username, s_('MattermostService|Response username'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :response_username, 'GitLab', class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#response_username', class: 'input-group-text')
-
- .form-group
- = label_tag :response_icon, s_('MattermostService|Response icon'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :response_icon, asset_url('gitlab_logo.png'), class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#response_icon', class: 'input-group-text')
-
- .form-group
- = label_tag nil, _('Autocomplete'), class: 'col-12 col-form-label label-bold'
- .col-12 Yes
-
- .form-group
- = label_tag :autocomplete_hint, _('Autocomplete hint'), class: 'col-12 col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :autocomplete_hint, '[help]', class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#autocomplete_hint', class: 'input-group-text')
-
- .form-group
- = label_tag :autocomplete_description, _('Autocomplete description'), class: 'col-12 col-form-label label-bold'
- .col-12.input-group
- = text_field_tag :autocomplete_description, run_actions_text, class: 'form-control form-control-sm', readonly: 'readonly'
- .input-group-append
- = clipboard_button(target: '#autocomplete_description', class: 'input-group-text')
diff --git a/app/views/projects/services/mattermost_slash_commands/_help.html.haml b/app/views/projects/services/mattermost_slash_commands/_help.html.haml
deleted file mode 100644
index 993df389fb0..00000000000
--- a/app/views/projects/services/mattermost_slash_commands/_help.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- enabled = Gitlab.config.mattermost.enabled
-
-.info-well
- .well-segment
- %p
- = s_("MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost.")
- = link_to help_page_path('user/project/integrations/mattermost_slash_commands.md'), target: '_blank' do
- = _("How do I configure this integration?")
- = sprite_icon('external-link')
- %p.inline
- = s_("MattermostService|After you configure the integration, view your new Mattermost commands by entering")
- %kbd.inline /&lt;trigger&gt; help
- - if !enabled && integration.project_level?
- = render 'projects/services/mattermost_slash_commands/detailed_help', integration: integration
-
-- if enabled && integration.project_level?
- = render 'projects/services/mattermost_slash_commands/installation_info', integration: integration
diff --git a/app/views/projects/services/prometheus/_external_alerts.html.haml b/app/views/projects/services/prometheus/_external_alerts.html.haml
deleted file mode 100644
index 168b4853a9a..00000000000
--- a/app/views/projects/services/prometheus/_external_alerts.html.haml
+++ /dev/null
@@ -1,8 +0,0 @@
-- return unless can?(current_user, :read_prometheus_alerts, @project)
-- return unless integration.manual_configuration?
-
-- notify_url = notify_project_prometheus_alerts_url(@project, format: :json)
-- authorization_key = @project.alerting_setting.try(:token)
-- learn_more_url = help_page_path('operations/metrics/alerts.md', anchor: 'external-prometheus-instances')
-
-#js-settings-prometheus-alerts{ data: { notify_url: notify_url, authorization_key: authorization_key, change_key_url: reset_alerting_token_project_settings_operations_path(@project), learn_more_url: learn_more_url, disabled: true } }
diff --git a/app/views/projects/services/prometheus/_metrics.html.haml b/app/views/projects/services/prometheus/_metrics.html.haml
deleted file mode 100644
index 8794f3e24da..00000000000
--- a/app/views/projects/services/prometheus/_metrics.html.haml
+++ /dev/null
@@ -1,38 +0,0 @@
-- project = local_assigns.fetch(:project)
-
-= render 'projects/services/prometheus/custom_metrics', project: project, integration: integration
-
-.col-lg-3
- %p
- = s_('PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters.')
- = link_to s_('PrometheusService|More information'), help_page_path('user/project/integrations/prometheus'), target: '_blank', rel: "noopener noreferrer"
-
-.col-lg-9
- .card.js-panel-monitored-metrics{ data: { active_metrics: active_common_project_prometheus_metrics_path(project, :json), metrics_help_path: help_page_path('user/project/integrations/prometheus_library/index') } }
- .card-header
- %strong
- = s_('PrometheusService|Common metrics')
- = gl_badge_tag 0, nil, class: 'js-monitored-count'
- .card-body
- .loading-metrics.js-loading-metrics
- %p.m-3
- = gl_loading_icon(inline: true, css_class: 'metrics-load-spinner')
- = s_('PrometheusService|Finding and configuring metrics...')
- .empty-metrics.hidden.js-empty-metrics
- %p.text-tertiary.m-3
- = s_('PrometheusService|Waiting for your first deployment to an environment to find common metrics')
- %ul.list-unstyled.metrics-list.hidden.js-metrics-list
-
- .card.hidden.js-panel-missing-env-vars
- .card-header
- = sprite_icon('chevron-lg-right', css_class: 'panel-toggle js-panel-toggle-right' )
- = sprite_icon('chevron-lg-down', css_class: 'panel-toggle js-panel-toggle-down hidden' )
- = s_('PrometheusService|Missing environment variable')
- = gl_badge_tag 0, nil, class: 'js-env-var-count'
- .card-body.hidden
- .flash-container
- .flash-notice
- .flash-text
- = s_("PrometheusService|To set up automatic monitoring, add the environment variable %{variable} to exporter's queries." % { variable: "<code>$CI_ENVIRONMENT_SLUG</code>" }).html_safe
- = link_to s_('PrometheusService|More information'), help_page_path('operations/metrics/dashboards/variables.md', anchor: 'query-variables')
- %ul.list-unstyled.metrics-list.js-missing-var-metrics-list
diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml
deleted file mode 100644
index 3350ac8a6c5..00000000000
--- a/app/views/projects/services/prometheus/_show.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-.row
- .col-lg-3
- %h4.gl-mt-0
- = s_('PrometheusService|Metrics')
-
-.row.gl-mb-3.prometheus-metrics-monitoring.js-prometheus-metrics-monitoring
- = render 'projects/services/prometheus/metrics', project: @project, integration: integration
-
-= render 'projects/services/prometheus/external_alerts', project: @project, integration: integration
diff --git a/app/views/projects/services/prometheus/_top.html.haml b/app/views/projects/services/prometheus/_top.html.haml
deleted file mode 100644
index 52b29ea2e8f..00000000000
--- a/app/views/projects/services/prometheus/_top.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- return unless integration.manual_configuration?
-
-.row
- .col-lg-12
- = render Pajamas::AlertComponent.new(dismissible: false) do
- .gl-alert-body
- = s_('AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated.')
- .gl-alert-actions
- = link_to _('Visit settings page'), project_settings_operations_path(@project, anchor: 'js-alert-management-settings'), class: 'gl-button btn gl-alert-action btn-info'
diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml
index 5ef56cda6d2..508e63f77d8 100644
--- a/app/views/projects/settings/ci_cd/_form.html.haml
+++ b/app/views/projects/settings/ci_cd/_form.html.haml
@@ -1,6 +1,7 @@
- help_link_public_pipelines = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer'
- help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer'
-- help_link_skip_outdated =link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer'
+- help_link_skip_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'skip-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer'
+- help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/index', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer'
.row.gl-mt-3
.col-lg-12
@@ -25,6 +26,11 @@
help_text: (_('When a deployment job is successful, skip older deployment jobs that are still pending.') + ' ' + help_link_skip_outdated).html_safe
.form-group
+ = f.gitlab_ui_checkbox_component :ci_separated_caches,
+ s_("CICD|Use separate caches for protected branches"),
+ help_text: (s_('CICD|Unprotected branches will not have access to the cache from protected branches.') + ' ' + help_link_separated_caches).html_safe
+
+ .form-group
= f.label :ci_config_path, _('CI/CD configuration file'), class: 'label-bold'
= f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml'
%p.form-text.text-muted
@@ -77,19 +83,7 @@
= _("The maximum file size in megabytes for individual job artifacts.")
= link_to sprite_icon('question-o'), help_page_path('user/admin_area/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer'
- .form-group
- = f.label :build_coverage_regex, _("Test coverage parsing"), class: 'label-bold'
- .input-group
- %span.input-group-prepend
- .input-group-text /
- = f.text_field :build_coverage_regex, class: 'form-control gl-form-input', placeholder: 'Regular expression', data: { qa_selector: 'build_coverage_regex_field' }
- %span.input-group-append
- .input-group-text /
- %p.form-text.text-muted
- = html_escape(_('The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable.')) % { regex: '<code>\(\d+.\d+%\)</code>'.html_safe }
- = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'add-test-coverage-results-using-project-settings-deprecated'), target: '_blank', rel: 'noopener noreferrer'
-
- = f.submit _('Save changes'), class: "btn gl-button btn-confirm", data: { qa_selector: 'save_general_pipelines_changes_button' }
+ = f.submit _('Save changes'), class: "btn gl-button btn-confirm"
%hr
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index 28cde994d00..87ca13a7bd6 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -7,14 +7,14 @@
- expanded = expanded_by_default?
- general_expanded = @project.errors.empty? ? expanded : true
-%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded), data: { qa_selector: 'general_pipelines_settings_content' } }
+%section.settings#js-general-pipeline-settings.no-animate{ class: ('expanded' if general_expanded) }
.settings-header
%h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
= _("General pipelines")
%button.btn.gl-button.btn-default.js-settings-toggle{ type: 'button' }
= expanded ? _('Collapse') : _('Expand')
%p
- = _("Customize your pipeline configuration and coverage report.")
+ = _("Customize your pipeline configuration.")
.settings-content
= render 'form'
@@ -109,3 +109,15 @@
= link_to _('Learn more'), help_page_path('ci/jobs/ci_job_token'), target: '_blank', rel: 'noopener noreferrer'
.settings-content
= render 'ci/token_access/index'
+
+- if show_secure_files_setting(@project, current_user)
+ %section.settings
+ .settings-header
+ %h4.settings-title
+ = _("Secure Files")
+ = button_to project_ci_secure_files_path(@project), method: :get, class: 'btn gl-button btn-default' do
+ = _('Manage')
+ %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'
+
diff --git a/app/views/projects/settings/operations/_prometheus.html.haml b/app/views/projects/settings/operations/_prometheus.html.haml
deleted file mode 100644
index 93281cc225b..00000000000
--- a/app/views/projects/settings/operations/_prometheus.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-%section.settings.no-animate.js-prometheus-settings
- .settings-header
- %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only
- = _('Prometheus')
- %button.gl-button.btn.btn-default.js-settings-toggle{ type: 'button' }
- = _('Expand')
- %p
- = _('Link Prometheus monitoring to GitLab.')
- = link_to _('More information'), help_page_path('user/project/integrations/prometheus'), target: '_blank', rel: 'noopener noreferrer'
- .settings-content
- - if @project
- = render 'shared/prometheus_configuration_banner', project: @project, integration: service, header_tag: :b, info_well_classes: 'gl-p-3 gl-mt-3'
-
- %b.gl-mb-3
- = s_('PrometheusService|Manual configuration')
- %p
- = s_('PrometheusService|Auto configuration settings are used unless you override their values here.')
diff --git a/app/views/projects/settings/operations/show.html.haml b/app/views/projects/settings/operations/show.html.haml
index 9a31666c316..80c22604e49 100644
--- a/app/views/projects/settings/operations/show.html.haml
+++ b/app/views/projects/settings/operations/show.html.haml
@@ -15,13 +15,14 @@
= s_('Deprecations|Feature deprecation and removal')
.gl-alert-body
%p
- = html_escape(s_('Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. 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 }
+ = 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|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'
+= 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'
= render 'projects/settings/operations/grafana_integration'
= render_if_exists 'projects/settings/operations/status_page'
-= render 'projects/settings/operations/prometheus', service: prometheus_integration if Feature.enabled?(:settings_operations_prometheus_service)
diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml
index 202c0f22420..29bdca1c876 100644
--- a/app/views/projects/tree/_tree_header.html.haml
+++ b/app/views/projects/tree/_tree_header.html.haml
@@ -1,6 +1,8 @@
+- is_project_overview = local_assigns.fetch(:is_project_overview, false)
+
.tree-ref-container.gl-display-flex.mb-2.mb-md-0
.tree-ref-holder
- = render 'shared/ref_switcher', destination: 'tree', path: @path, show_create: true
+ = render 'shared/ref_switcher', destination: 'tree', show_create: true
#js-repo-breadcrumb{ data: breadcrumb_data_attributes }
@@ -8,7 +10,7 @@
.tree-controls
.d-block.d-sm-flex.flex-wrap.align-items-start.gl-children-ml-sm-3.gl-first-child-ml-sm-0<
= render_if_exists 'projects/tree/lock_link'
- #js-tree-history-link{ data: { history_link: project_commits_path(@project, @ref) } }
+ #js-tree-history-link{ data: { history_link: project_commits_path(@project, @ref), is_project_overview: is_project_overview.to_s } }
= render 'projects/find_file_link'
= render 'shared/web_ide_button', blob: nil
diff --git a/app/views/projects/work_items/index.html.haml b/app/views/projects/work_items/index.html.haml
index 0efd7a740d3..356f93c6ed5 100644
--- a/app/views/projects/work_items/index.html.haml
+++ b/app/views/projects/work_items/index.html.haml
@@ -1,3 +1,3 @@
- page_title s_('WorkItem|Work Items')
-#js-work-items{ data: { full_path: @project.full_path } }
+#js-work-items{ data: { full_path: @project.full_path, issues_list_path: project_issues_path(@project) } }
diff --git a/app/views/pwa/offline.html.haml b/app/views/pwa/offline.html.haml
new file mode 100644
index 00000000000..5eae546bea9
--- /dev/null
+++ b/app/views/pwa/offline.html.haml
@@ -0,0 +1,31 @@
+= link_to root_path do
+ = render 'shared/logo.svg'
+%h1= _('Offline')
+.container
+ %h3= _('You are currently offline, or the GitLab instance is not reachable.')
+ %p= _("In the background, we're attempting to connect you again.")
+ -# haml-lint:disable InlineJavaScript
+ :javascript
+ window.addEventListener('online', () => {
+ window.location.reload();
+ });
+
+ async function checkNetworkAndReload() {
+ try {
+ const response = await fetch('.');
+ // Verify we get a valid response from the server
+ if (response.status >= 200 && response.status < 500) {
+ window.location.reload();
+ return;
+ }
+ } catch {
+ // Unable to connect to the server, ignore.
+ }
+ window.setTimeout(checkNetworkAndReload, 2500);
+ }
+
+ if (window.location.pathname.endsWith('/-/offline')) {
+ return;
+ }
+
+ checkNetworkAndReload();
diff --git a/app/views/registrations/welcome/show.html.haml b/app/views/registrations/welcome/show.html.haml
index 6235cce5d80..62499f1a6b6 100644
--- a/app/views/registrations/welcome/show.html.haml
+++ b/app/views/registrations/welcome/show.html.haml
@@ -17,7 +17,7 @@
%p.gl-text-center= html_escape(_('%{gitlab_experience_text}. We won\'t share this information with anyone.')) % { gitlab_experience_text: gitlab_experience_text }
- else
%p.gl-text-center= html_escape(_('%{gitlab_experience_text}. Don\'t worry, this information isn\'t shared outside of your self-managed GitLab instance.')) % { gitlab_experience_text: gitlab_experience_text }
- = gitlab_ui_form_for(current_user, url: users_sign_up_welcome_path, html: { class: 'card gl-w-full! gl-p-5', 'aria-live' => 'assertive' }) do |f|
+ = gitlab_ui_form_for(current_user, url: users_sign_up_welcome_path, html: { class: 'card gl-w-full! gl-p-5 js-users-signup-welcome', 'aria-live' => 'assertive' }) do |f|
.devise-errors
= render 'devise/shared/error_messages', resource: current_user
.row
@@ -27,7 +27,7 @@
- if Feature.enabled?(:user_other_role_details)
.row
.form-group.col-sm-12.js-other-role-group.hidden
- = f.label :other_role, _('What is your job title? (optional)'), class: 'form-check-label gl-mb-3'
+ = f.label :other_role, _('What is your job title? (optional)')
= f.text_field :other_role, class: 'form-control'
= render_if_exists "registrations/welcome/jobs_to_be_done", f: f
= render_if_exists "registrations/welcome/setup_for_company", f: f
diff --git a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
index fdd4dfba616..d69f54608e9 100644
--- a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
+++ b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml
@@ -1,12 +1,12 @@
- if show_auto_devops_implicitly_enabled_banner?(project, current_user)
= render Pajamas::AlertComponent.new(alert_class: 'qa-auto-devops-banner auto-devops-implicitly-enabled-banner',
close_button_class: 'hide-auto-devops-implicitly-enabled-banner',
- close_button_data: { project_id: project.id }) do
- .gl-alert-body
+ close_button_data: { project_id: project.id }) do |c|
+ = c.body do
= s_("AutoDevOps|The Auto DevOps pipeline has been enabled and will be used if no alternative CI configuration file is found.")
- unless Gitlab.config.registry.enabled
%div
= _('Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work.')
- .gl-alert-actions
+ = c.actions do
= link_to _('Settings'), project_settings_ci_cd_path(project), class: 'alert-link btn gl-button btn-confirm'
= link_to _('More information'), help_page_path('topics/autodevops/index.md'), target: '_blank', class: 'alert-link btn gl-button btn-default gl-ml-3'
diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml
index 850d58920db..7248403d6c9 100644
--- a/app/views/shared/_import_form.html.haml
+++ b/app/views/shared/_import_form.html.haml
@@ -2,6 +2,19 @@
- import_url = Gitlab::UrlSanitizer.new(f.object.import_url)
.import-url-data
+ .info-well.prepend-top-20
+ .well-segment
+ %ul
+ %li
+ = html_escape(_('The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ %li= html_escape(_('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.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ %li
+ = _('If your HTTP repository is not publicly accessible, add your credentials.')
+ %li
+ = import_will_timeout_message(ci_cd_only)
+ %li
+ = import_svn_message(ci_cd_only)
+ = render_if_exists 'shared/ci_cd_only_link', ci_cd_only: ci_cd_only
.form-group
= f.label :import_url, class: 'label-bold' do
%span
@@ -11,9 +24,10 @@
= render Pajamas::AlertComponent.new(variant: :danger,
alert_class: 'gl-mt-3 js-import-url-error hide',
dismissible: false,
- close_button_class: 'js-close-2fa-enabled-success-alert') do
- .gl-alert-body
+ close_button_class: 'js-close-2fa-enabled-success-alert') do |c|
+ = c.body do
= s_('Import|There is not a valid Git repository at this URL. If your HTTP repository is not publicly accessible, verify your credentials.')
+ = render_if_exists 'shared/ee/import_form', f: f, ci_cd_only: ci_cd_only
.row
.form-group.col-md-6
= f.label :import_url_user, class: 'label-bold' do
@@ -26,19 +40,3 @@
%span
= _('Password (optional)')
= f.password_field :import_url_password, class: 'form-control gl-form-input', required: false, autocomplete: 'new-password'
-
- .info-well.prepend-top-20
- .well-segment
- %ul
- %li
- = html_escape(_('The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- %li= html_escape(_('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.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- %li
- = _('If your HTTP repository is not publicly accessible, add your credentials.')
- %li
- = import_will_timeout_message(ci_cd_only)
- %li
- = import_svn_message(ci_cd_only)
- = render_if_exists 'shared/ci_cd_only_link', ci_cd_only: ci_cd_only
-
-= render_if_exists 'shared/ee/import_form', f: f, ci_cd_only: ci_cd_only
diff --git a/app/views/shared/_integration_settings.html.haml b/app/views/shared/_integration_settings.html.haml
index 93606ca0aba..84710b2ecc7 100644
--- a/app/views/shared/_integration_settings.html.haml
+++ b/app/views/shared/_integration_settings.html.haml
@@ -6,8 +6,8 @@
.js-vue-integration-settings{ data: integration_form_data(integration, group: @group, project: @project) }
.js-integration-help-html.gl-display-none
-# All content below will be repositioned in Vue
- - if lookup_context.template_exists?('help', "projects/services/#{integration.to_param}", true)
- = render "projects/services/#{integration.to_param}/help", integration: integration
+ - if lookup_context.template_exists?('help', "shared/integrations/#{integration.to_param}", true)
+ = render "shared/integrations/#{integration.to_param}/help", integration: integration
- elsif integration.help.present?
.info-well
.well-segment
diff --git a/app/views/shared/_logo.svg b/app/views/shared/_logo.svg
index 0ef9de5fed6..83f6fe5c16c 100644
--- a/app/views/shared/_logo.svg
+++ b/app/views/shared/_logo.svg
@@ -1,9 +1,10 @@
-<svg width="24" height="24" class="tanuki-logo" viewBox="0 0 36 36">
- <path class="tanuki-shape tanuki-left-ear" fill="#e24329" d="M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z"/>
- <path class="tanuki-shape tanuki-right-ear" fill="#e24329" d="M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z"/>
- <path class="tanuki-shape tanuki-nose" fill="#e24329" d="M18,34.38 3,14 33,14 Z"/>
- <path class="tanuki-shape tanuki-left-eye" fill="#fc6d26" d="M18,34.38 11.38,14 2,14 6,25Z"/>
- <path class="tanuki-shape tanuki-right-eye" fill="#fc6d26" d="M18,34.38 24.62,14 34,14 30,25Z"/>
- <path class="tanuki-shape tanuki-left-cheek" fill="#fca326" d="M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z"/>
- <path class="tanuki-shape tanuki-right-cheek" fill="#fca326" d="M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z"/>
+<svg class="tanuki-logo" width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#E24329"/>
+ <path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#FC6D26"/>
+ <path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
+ fill="#FCA326"/>
+ <path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
+ fill="#FC6D26"/>
</svg>
diff --git a/app/views/shared/_logo_type.svg b/app/views/shared/_logo_type.svg
deleted file mode 100644
index cb07e2634a9..00000000000
--- a/app/views/shared/_logo_type.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 617 169"><path d="M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3"/></svg>
diff --git a/app/views/shared/_logo_ukraine.svg b/app/views/shared/_logo_ukraine.svg
deleted file mode 100644
index e2c2bb3855d..00000000000
--- a/app/views/shared/_logo_ukraine.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg width="24" height="24" class="tanuki-logo" viewBox="0 0 24 24">
- <path d="M4.89929534,0.3165 L7.56629534,8.5025 L16.3922953,8.5025 L19.0592953,0.3165 C19.1962953,-0.1055 19.8432953,-0.1055 19.9792953,0.3165 L23.9122953,12.6095 C23.9722953,12.7935 23.9722953,12.9895 23.9192953,13.1695 L0.0392953418,13.1695 C-0.0143874393,12.9863283 -0.0119492421,12.7912726 0.0462953418,12.6095 L3.97929534,0.3165 C4.11529534,-0.1055 4.76229534,-0.1055 4.89929534,0.3165 Z" id="Path" fill="#005BBB"></path>
- <path d="M7.20329534,9.0025 L16.7552953,9.0025 L16.8682953,8.6575 L19.5182953,0.5185 L23.4362953,12.7615 C23.4961172,12.9376949 23.435535,13.1323657 23.2862953,13.2435 L23.2852953,13.2455 L11.9852953,21.4655 L11.9792953,21.4715 L0.673295342,13.2455 C0.522422013,13.1321007 0.462258936,12.9374792 0.522295342,12.7615 L4.43929534,0.5185 L7.09029534,8.6585 L7.20329534,9.0025 Z" id="Shape" stroke="#FFFFFF" opacity="0.32" stroke-linejoin="round"></path>
- <path d="M0.0012953418,12.8575 C-0.0152229638,13.1685309 0.127095079,13.4667211 0.379295342,13.6495 L11.9792953,22.0895 L11.9862953,22.0845 L11.9922953,22.0895 L11.9872953,22.0835 L23.5792953,13.6495 C23.8319507,13.466647 23.9743476,13.1679148 23.9572953,12.8565 L0.0012953418,12.8565 L0.0012953418,12.8575 Z" id="Path" fill="#FFD500"></path>
-</svg> \ No newline at end of file
diff --git a/app/views/shared/_logo_with_black_text.svg b/app/views/shared/_logo_with_black_text.svg
new file mode 100644
index 00000000000..f5b0b70618b
--- /dev/null
+++ b/app/views/shared/_logo_with_black_text.svg
@@ -0,0 +1,12 @@
+<svg class="tanuki-logo" width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path class="logo-text" d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
+ fill="#171321"/>
+ <path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#E24329"/>
+ <path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#FC6D26"/>
+ <path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
+ fill="#FCA326"/>
+ <path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
+ fill="#FC6D26"/>
+</svg>
diff --git a/app/views/shared/_logo_with_white_text.svg b/app/views/shared/_logo_with_white_text.svg
new file mode 100644
index 00000000000..d0067538058
--- /dev/null
+++ b/app/views/shared/_logo_with_white_text.svg
@@ -0,0 +1,12 @@
+<svg class="tanuki-logo" width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path class="logo-text" d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
+ fill="#fff"/>
+ <path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#E24329"/>
+ <path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
+ fill="#FC6D26"/>
+ <path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
+ fill="#FCA326"/>
+ <path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
+ fill="#FC6D26"/>
+</svg>
diff --git a/app/views/shared/_milestones_sort_dropdown.html.haml b/app/views/shared/_milestones_sort_dropdown.html.haml
index 1c6eb7aa96b..b68022bfeda 100644
--- a/app/views/shared/_milestones_sort_dropdown.html.haml
+++ b/app/views/shared/_milestones_sort_dropdown.html.haml
@@ -1,4 +1,4 @@
- milestones_sort_options = milestones_sort_options_hash.map { |value, text| { value: value, text: text, href: page_filter_path(sort: value) } }
%div{ data: {testid: 'milestone_sort_by_dropdown'} }
- = gl_redirect_listbox_tag milestones_sort_options, @sort, class: 'gl-ml-3'
+ = gl_redirect_listbox_tag milestones_sort_options, @sort
diff --git a/app/views/shared/_new_project_item_select.html.haml b/app/views/shared/_new_project_item_select.html.haml
index 74a397d7a03..821f1ede422 100644
--- a/app/views/shared/_new_project_item_select.html.haml
+++ b/app/views/shared/_new_project_item_select.html.haml
@@ -1,7 +1,6 @@
- if any_projects?(@projects)
- .project-item-select-holder.btn-group.gl-ml-auto.gl-mr-auto.gl-relative.gl-overflow-hidden{ class: 'gl-display-flex!' }
- %a.btn.gl-button.btn-confirm.js-new-project-item-link.block-truncated.qa-new-project-item-link{ href: '', data: { label: local_assigns[:label], type: local_assigns[:type] }, class: "gl-m-0!" }
+ .dropdown.b-dropdown.gl-new-dropdown.btn-group.project-item-select-holder{ class: 'gl-display-inline-flex!' }
+ %a.btn.gl-button.btn-confirm.split-content-button.js-new-project-item-link.block-truncated.qa-new-project-item-link{ href: '', data: { label: local_assigns[:label], type: local_assigns[:type] } }
= gl_loading_icon(inline: true, color: 'light')
= project_select_tag :project_path, class: "project-item-select gl-absolute! gl-visibility-hidden", data: { include_groups: local_assigns[:include_groups], order_by: 'last_activity_at', relative_path: local_assigns[:path], with_shared: local_assigns[:with_shared], include_projects_in_subgroups: local_assigns[:include_projects_in_subgroups] }, with_feature_enabled: local_assigns[:with_feature_enabled]
- %button.btn.dropdown-toggle.btn-confirm.btn-md.gl-button.gl-dropdown-toggle.dropdown-toggle-split.new-project-item-select-button.qa-new-project-item-select-button.gl-p-0.gl-w-100{ class: "gl-m-0!", 'aria-label': _('Toggle project select') }
- = sprite_icon('chevron-down')
+ %button.btn.dropdown-toggle.btn-confirm.btn-md.gl-button.gl-dropdown-toggle.dropdown-toggle-split.new-project-item-select-button.qa-new-project-item-select-button{ 'aria-label': _('Toggle project select') }
diff --git a/app/views/shared/_no_password.html.haml b/app/views/shared/_no_password.html.haml
index 195bd15f840..91cd91ec38b 100644
--- a/app/views/shared/_no_password.html.haml
+++ b/app/views/shared/_no_password.html.haml
@@ -1,9 +1,9 @@
- if show_no_password_message?
= render Pajamas::AlertComponent.new(variant: :warning,
alert_class: 'js-no-password-message',
- close_button_class: 'js-hide-no-password-message') do
- .gl-alert-body
+ close_button_class: 'js-hide-no-password-message') do |c|
+ = c.body do
= no_password_message
- .gl-alert-actions
+ = c.actions do
= link_to _('Remind later'), '#', class: 'js-hide-no-password-message gl-alert-action btn btn-confirm btn-md gl-button'
= link_to _("Don't show again"), profile_path(user: { hide_no_password: true }), method: :put, role: 'button', class: 'gl-alert-action btn btn-default btn-md gl-button'
diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml
index d30679b4305..c4d8cb092dc 100644
--- a/app/views/shared/_no_ssh.html.haml
+++ b/app/views/shared/_no_ssh.html.haml
@@ -1,9 +1,9 @@
- if show_no_ssh_key_message?
= render Pajamas::AlertComponent.new(variant: :warning,
alert_class: 'js-no-ssh-message',
- close_button_class: 'js-hide-no-ssh-message') do
- .gl-alert-body
+ close_button_class: 'js-hide-no-ssh-message') do |c|
+ = c.body do
= s_("MissingSSHKeyWarningLink|You can't push or pull repositories using SSH until you add an SSH key to your profile.")
- .gl-alert-actions
+ = c.actions do
= link_to s_('MissingSSHKeyWarningLink|Add SSH key'), profile_keys_path, class: "gl-alert-action btn btn-confirm btn-md gl-button"
= link_to s_("MissingSSHKeyWarningLink|Don't show again"), profile_path(user: { hide_no_ssh_key: true }), method: :put, role: 'button', class: 'gl-alert-action btn btn-default btn-md gl-button'
diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml
index 76fb34985c0..0af378cb883 100644
--- a/app/views/shared/_outdated_browser.html.haml
+++ b/app/views/shared/_outdated_browser.html.haml
@@ -1,6 +1,6 @@
- if outdated_browser?
- = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(variant: :danger, dismissible: false) do |c|
+ = c.body do
= s_('OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser.')
%br
- browser_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('install/requirements', anchor: 'supported-web-browsers') }
diff --git a/app/views/shared/_project_limit.html.haml b/app/views/shared/_project_limit.html.haml
index 7e1874f3416..b630c829c76 100644
--- a/app/views/shared/_project_limit.html.haml
+++ b/app/views/shared/_project_limit.html.haml
@@ -1,9 +1,9 @@
- if cookies[:hide_project_limit_message].blank? && !current_user.hide_project_limit && !current_user.can_create_project? && current_user.projects_limit > 0
= render Pajamas::AlertComponent.new(variant: :warning,
dismissible: false,
- alert_class: 'project-limit-message') do
- .gl-alert-body
+ alert_class: 'project-limit-message') do |c|
+ = c.body do
= _("You won't be able to create new projects because you have reached your project limit.")
- .gl-alert-actions
+ = c.actions do
= link_to _('Remind later'), '#', class: 'alert-link hide-project-limit-message btn gl-button btn-confirm'
= link_to _("Don't show again"), profile_path(user: {hide_project_limit: true}), method: :put, class: 'alert-link btn gl-button btn-default gl-ml-3'
diff --git a/app/views/shared/_registration_features_discovery_message.html.haml b/app/views/shared/_registration_features_discovery_message.html.haml
index e5b1ad88a7f..053c511830c 100644
--- a/app/views/shared/_registration_features_discovery_message.html.haml
+++ b/app/views/shared/_registration_features_discovery_message.html.haml
@@ -1,5 +1,5 @@
- feature_title = local_assigns.fetch(:feature_title, s_('RegistrationFeatures|use this feature'))
-- registration_features_docs_path = help_page_path('development/service_ping/index.md', anchor: 'registration-features-program')
+- registration_features_docs_path = help_page_path('user/admin_area/settings/usage_statistics.md', anchor: 'registration-features-program')
- registration_features_link_start = '<a href="%{url}" target="_blank">'.html_safe % { url: registration_features_docs_path }
%div
diff --git a/app/views/shared/_service_ping_consent.html.haml b/app/views/shared/_service_ping_consent.html.haml
index 96f015c7a4b..8de7552c39a 100644
--- a/app/views/shared/_service_ping_consent.html.haml
+++ b/app/views/shared/_service_ping_consent.html.haml
@@ -1,10 +1,10 @@
- if session[:ask_for_usage_stats_consent]
- = render Pajamas::AlertComponent.new(alert_class: 'service-ping-consent-message') do
- .gl-alert-body
+ = render Pajamas::AlertComponent.new(alert_class: 'service-ping-consent-message') do |c|
+ = c.body do
- docs_link = link_to _('collect usage information'), help_page_path('user/admin_area/settings/usage_statistics.md'), class: 'gl-link'
- settings_link = link_to _('your settings'), metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link'
= s_('To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}.').html_safe % { docs_link: docs_link, settings_link: settings_link }
- .gl-alert-actions.gl-mt-3
+ = c.actions do
- send_service_data_path = admin_application_settings_path(application_setting: { version_check_enabled: 1, usage_ping_enabled: 1 })
- not_now_path = admin_application_settings_path(application_setting: { version_check_enabled: 0, usage_ping_enabled: 0 })
= link_to _("Send service data"), send_service_data_path, 'data-url' => admin_application_settings_path, method: :put, 'data-check-enabled': true, 'data-service-ping-enabled': true, class: 'js-service-ping-consent-action alert-link btn gl-button btn-info'
diff --git a/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
index 2294c44d49f..0899756d088 100644
--- a/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
+++ b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml
@@ -3,10 +3,10 @@
alert_data: { feature_id: Users::CalloutsHelper::TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK,
dismiss_endpoint: callouts_path,
defer_links: 'true' },
- close_button_data: { testid: 'close-account-recovery-regular-check-callout' }) do
- .gl-alert-body
+ close_button_data: { testid: 'close-account-recovery-regular-check-callout' }) do |c|
+ = c.body do
= s_('Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place.')
= link_to _('Learn more.'), help_page_path('user/profile/account/two_factor_authentication', anchor: 'recovery-codes'), target: '_blank', rel: 'noopener noreferrer'
- .gl-alert-actions
+ = c.actions do
= link_to profile_two_factor_auth_path, class: 'deferred-link btn gl-alert-action btn-confirm btn-md gl-button' do
= s_('Profiles|Manage two-factor authentication')
diff --git a/app/views/shared/access_tokens/_table.html.haml b/app/views/shared/access_tokens/_table.html.haml
index 7f7dafbe5b0..5ca9cf8d9a4 100644
--- a/app/views/shared/access_tokens/_table.html.haml
+++ b/app/views/shared/access_tokens/_table.html.haml
@@ -1,23 +1,16 @@
- no_active_tokens_message = local_assigns.fetch(:no_active_tokens_message, _('This user has no active %{type}.') % { type: type_plural })
- impersonation = local_assigns.fetch(:impersonation, false)
- resource = local_assigns.fetch(:resource, false)
-- personal = !impersonation && !resource
%hr
%h5
= _('Active %{type} (%{token_length})') % { type: type_plural, token_length: active_tokens.length }
-- if personal && !personal_access_token_expiration_enforced?
- %p.profile-settings-content
- = _("Personal access tokens are not revoked upon expiration.")
- if impersonation
%p.profile-settings-content
= _("To see all the user's personal access tokens you must impersonate them first.")
-- if personal
- = render_if_exists 'profiles/personal_access_tokens/token_expiry_notification', active_tokens: active_tokens
-
- if active_tokens.present?
.table-responsive
%table.table.active-tokens
@@ -46,12 +39,8 @@
%span.token-never-used-label= _('Never')
%td
- if token.expires?
- - if token.expired? || token.expired_but_not_enforced?
- %span{ class: 'text-danger has-tooltip', title: _('Token valid until revoked') }
- = _('Expired')
- - else
- %span{ class: ('text-warning' if token.expires_soon?) }
- = time_ago_with_tooltip(token.expires_at)
+ %span{ class: ('text-warning' if token.expires_soon?) }
+ = time_ago_with_tooltip(token.expires_at)
- else
%span.token-never-expires-label= _('Never')
- if resource
diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml
index 7289121d9eb..2e04bbf3605 100644
--- a/app/views/shared/deploy_tokens/_form.html.haml
+++ b/app/views/shared/deploy_tokens/_form.html.haml
@@ -3,7 +3,7 @@
- group_deploy_tokens_help_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: group_deploy_tokens_help_link_url }
= s_('DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}').html_safe % { link_start: group_deploy_tokens_help_link_start, link_end: '</a>'.html_safe }
-= form_for token, url: create_deploy_token_path(group_or_project, anchor: 'js-deploy-tokens'), method: :post, remote: Feature.enabled?(:ajax_new_deploy_token, group_or_project) do |f|
+= gitlab_ui_form_for token, url: create_deploy_token_path(group_or_project, anchor: 'js-deploy-tokens'), method: :post, remote: Feature.enabled?(:ajax_new_deploy_token, group_or_project) do |f|
.form-group
= f.label :name, class: 'label-bold'
@@ -23,33 +23,15 @@
.form-group
= f.label :scopes, _('Scopes (select at least one)'), class: 'label-bold'
- %fieldset.form-group.form-check
- = f.check_box :read_repository, class: 'form-check-input', data: { qa_selector: 'deploy_token_read_repository_checkbox' }
- = f.label :read_repository, 'read_repository', class: 'label-bold form-check-label'
- .text-secondary
- = s_('DeployTokens|Allows read-only access to the repository.')
+ = f.gitlab_ui_checkbox_component :read_repository, 'read_repository', help_text: s_('DeployTokens|Allows read-only access to the repository.'), checkbox_options: { data: { qa_selector: 'deploy_token_read_repository_checkbox' } }
- if container_registry_enabled?(group_or_project)
- %fieldset.form-group.form-check
- = f.check_box :read_registry, class: 'form-check-input', data: { qa_selector: 'deploy_token_read_registry_checkbox' }
- = f.label :read_registry, 'read_registry', class: 'label-bold form-check-label'
- .text-secondary= s_('DeployTokens|Allows read-only access to registry images.')
-
- %fieldset.form-group.form-check
- = f.check_box :write_registry, class: 'form-check-input', data: { qa_selector: 'deploy_token_write_registry_checkbox' }
- = f.label :write_registry, 'write_registry', class: 'label-bold form-check-label'
- .text-secondary= s_('DeployTokens|Allows write access to registry images.')
+ = f.gitlab_ui_checkbox_component :read_registry, 'read_registry', help_text: s_('DeployTokens|Allows read-only access to registry images.'), checkbox_options: { data: { qa_selector: 'deploy_token_read_registry_checkbox' } }
+ = f.gitlab_ui_checkbox_component :write_registry, 'write_registry', help_text: s_('DeployTokens|Allows write access to registry images.'), checkbox_options: { data: { qa_selector: 'deploy_token_write_registry_checkbox' } }
- if packages_registry_enabled?(group_or_project)
- %fieldset.form-group.form-check
- = f.check_box :read_package_registry, class: 'form-check-input', data: { qa_selector: 'deploy_token_read_package_registry_checkbox' }
- = f.label :read_package_registry, 'read_package_registry', class: 'label-bold form-check-label'
- .text-secondary= s_('DeployTokens|Allows read-only access to the package registry.')
-
- %fieldset.form-group.form-check
- = f.check_box :write_package_registry, class: 'form-check-input', data: { qa_selector: 'deploy_token_write_package_registry_checkbox' }
- = f.label :write_package_registry, 'write_package_registry', class: 'label-bold form-check-label'
- .text-secondary= s_('DeployTokens|Allows read and write access to the package registry.')
+ = f.gitlab_ui_checkbox_component :read_package_registry, 'read_package_registry', help_text: s_('DeployTokens|Allows read-only access to the package registry.'), checkbox_options: { data: { qa_selector: 'deploy_token_read_package_registry_checkbox' } }
+ = f.gitlab_ui_checkbox_component :write_package_registry, 'write_package_registry', help_text: s_('DeployTokens|Allows read and write access to the package registry.'), checkbox_options: { data: { qa_selector: 'deploy_token_write_package_registry_checkbox' } }
.gl-mt-3
= f.submit s_('DeployTokens|Create deploy token'), class: 'btn gl-button btn-confirm', data: { qa_selector: 'create_deploy_token_button' }
diff --git a/app/views/shared/doorkeeper/applications/_form.html.haml b/app/views/shared/doorkeeper/applications/_form.html.haml
index c1650405776..b40e2630011 100644
--- a/app/views/shared/doorkeeper/applications/_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_form.html.haml
@@ -17,12 +17,6 @@
help_text: _('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.')
.form-group
- - help_text = _('Enable access tokens to expire after 2 hours. If disabled, tokens do not expire.')
- - help_link = link_to _('Learn more.'), help_page_path('integration/oauth_provider.md', anchor: 'expiring-access-tokens'), target: '_blank', rel: 'noopener noreferrer'
- = f.gitlab_ui_checkbox_component :expire_access_tokens, _('Expire access tokens'),
- help_text: '%{help_text} %{help_link}'.html_safe % { help_text: help_text, help_link: help_link }
-
- .form-group
= f.label :scopes, class: 'label-bold'
= render 'shared/tokens/scopes_form', prefix: 'doorkeeper_application', token: @application, scopes: @scopes, f: f
diff --git a/app/views/shared/empty_states/_merge_requests.html.haml b/app/views/shared/empty_states/_merge_requests.html.haml
index d0c4fb2432c..fe602db4393 100644
--- a/app/views/shared/empty_states/_merge_requests.html.haml
+++ b/app/views/shared/empty_states/_merge_requests.html.haml
@@ -10,7 +10,7 @@
.row.empty-state.merge-requests
.col-12
.svg-content
- = image_tag 'illustrations/merge_requests.svg'
+ = image_tag 'illustrations/merge_requests.svg', { auto_dark: true }
.col-12
.text-content
- if has_filter_bar_param?
@@ -42,4 +42,4 @@
- if project_select_button
= render 'shared/new_project_item_select', path: 'merge_requests/new', label: _('merge request'), type: :merge_requests, with_feature_enabled: 'merge_requests'
- else
- = link_to _('New merge request'), button_path, class: 'gl-button btn btn-confirm', title: _('New merge request'), id: 'new_merge_request_link'
+ = link_to _('New merge request'), button_path, class: 'gl-button btn btn-confirm', title: _('New merge request'), id: 'new_merge_request_link', data: { qa_selector: "new_merge_request_button" }
diff --git a/app/views/shared/errors/_gitaly_unavailable.html.haml b/app/views/shared/errors/_gitaly_unavailable.html.haml
index e99c41f2496..c9d7920b9c2 100644
--- a/app/views/shared/errors/_gitaly_unavailable.html.haml
+++ b/app/views/shared/errors/_gitaly_unavailable.html.haml
@@ -1,6 +1,6 @@
= render Pajamas::AlertComponent.new(alert_class: 'gl-my-5',
variant: :danger,
dismissible: false,
- title: reason) do
- .gl-alert-body
+ title: reason) do |c|
+ = c.body do
= s_('The git server, Gitaly, is not available at this time. Please contact your administrator.')
diff --git a/app/views/shared/hook_logs/_content.html.haml b/app/views/shared/hook_logs/_content.html.haml
index ce04e24b09f..932971402a2 100644
--- a/app/views/shared/hook_logs/_content.html.haml
+++ b/app/views/shared/hook_logs/_content.html.haml
@@ -12,8 +12,8 @@
- if hook_log.internal_error_message.present?
= render Pajamas::AlertComponent.new(title: _('Internal error occurred while delivering this webhook.'),
variant: :danger,
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= _('Error: %{error}') % { error: hook_log.internal_error_message }
%h4= _('Response')
diff --git a/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml
new file mode 100644
index 00000000000..fec443738c3
--- /dev/null
+++ b/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml
@@ -0,0 +1,98 @@
+- pretty_name = @project&.full_name ? html_escape(@project&.full_name) : '<' + _('project name') + '>'
+- run_actions_text = html_escape(s_("ProjectService|Perform common operations on GitLab project: %{project_name}")) % { project_name: pretty_name }
+
+%p= s_("ProjectService|To configure this integration, you should:")
+%ul.list-unstyled.indent-list
+ %li
+ 1.
+ = link_to 'https://docs.gitlab.com/ee/user/project/integrations/mattermost_slash_commands.html#enable-custom-slash-commands', target: '_blank', rel: 'noopener noreferrer nofollow' do
+ Enable custom slash commands
+ = sprite_icon('external-link')
+ on your Mattermost installation.
+ %li
+ 2.
+ = link_to 'https://docs.gitlab.com/ee/user/project/integrations/mattermost_slash_commands.html#create-a-slash-command', target: '_blank', rel: 'noopener noreferrer nofollow' do
+ Add a slash command
+ = sprite_icon('external-link')
+ in your Mattermost team with the options listed below.
+ %li
+ 3. Paste the token into the
+ %strong Token
+ field.
+ %li
+ 4. Select the
+ %strong Active
+ check box, then select
+ %strong Save changes
+ to start using GitLab inside Mattermost!
+
+%hr
+
+.help-form
+ .form-group
+ = label_tag :display_name, _('Display name'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :display_name, "GitLab / #{pretty_name}".html_safe, class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#display_name', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag :description, _('Description'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :description, run_actions_text, class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#description', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag nil, s_('MattermostService|Command trigger word'), class: 'col-12 col-form-label label-bold'
+ .col-12
+ %p= s_('MattermostService|Fill in the word that works best for your team.')
+ %p
+ = s_('MattermostService|Suggestions:')
+ %code= 'gitlab'
+ - if @project
+ %code= @project.path # Path contains no spaces, but dashes
+ %code= @project.full_path
+
+ .form-group
+ = label_tag :request_url, s_('MattermostService|Request URL'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :request_url, service_trigger_url(integration), class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#request_url', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag nil, s_('MattermostService|Request method'), class: 'col-12 col-form-label label-bold'
+ .col-12 POST
+
+ .form-group
+ = label_tag :response_username, s_('MattermostService|Response username'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :response_username, 'GitLab', class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#response_username', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag :response_icon, s_('MattermostService|Response icon'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :response_icon, asset_url('gitlab_logo.png'), class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#response_icon', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag nil, _('Autocomplete'), class: 'col-12 col-form-label label-bold'
+ .col-12 Yes
+
+ .form-group
+ = label_tag :autocomplete_hint, _('Autocomplete hint'), class: 'col-12 col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :autocomplete_hint, '[help]', class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#autocomplete_hint', class: 'gl-button btn-default btn-icon input-group-text')
+
+ .form-group
+ = label_tag :autocomplete_description, _('Autocomplete description'), class: 'col-12 col-form-label label-bold'
+ .col-12.input-group
+ = text_field_tag :autocomplete_description, run_actions_text, class: 'form-control form-control-sm', readonly: 'readonly'
+ .input-group-append
+ = clipboard_button(target: '#autocomplete_description', class: 'gl-button btn-default btn-icon input-group-text')
diff --git a/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml
new file mode 100644
index 00000000000..6ce1c65a8dc
--- /dev/null
+++ b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml
@@ -0,0 +1,17 @@
+- enabled = Gitlab.config.mattermost.enabled
+
+.info-well
+ .well-segment
+ %p
+ = s_("MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost.")
+ = link_to help_page_path('user/project/integrations/mattermost_slash_commands.md'), target: '_blank' do
+ = _("How do I configure this integration?")
+ = sprite_icon('external-link')
+ %p.inline
+ = s_("MattermostService|After you configure the integration, view your new Mattermost commands by entering")
+ %kbd.inline /&lt;trigger&gt; help
+ - if !enabled && integration.project_level?
+ = render 'shared/integrations/mattermost_slash_commands/detailed_help', integration: integration
+
+- if enabled && integration.project_level?
+ = render 'shared/integrations/mattermost_slash_commands/installation_info', integration: integration
diff --git a/app/views/projects/services/mattermost_slash_commands/_installation_info.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_installation_info.html.haml
index 38adc69dd5e..38adc69dd5e 100644
--- a/app/views/projects/services/mattermost_slash_commands/_installation_info.html.haml
+++ b/app/views/shared/integrations/mattermost_slash_commands/_installation_info.html.haml
diff --git a/app/views/projects/services/prometheus/_custom_metrics.html.haml b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
index 896249c6163..896249c6163 100644
--- a/app/views/projects/services/prometheus/_custom_metrics.html.haml
+++ b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
diff --git a/app/views/projects/services/prometheus/_help.html.haml b/app/views/shared/integrations/prometheus/_help.html.haml
index f40d8638845..f40d8638845 100644
--- a/app/views/projects/services/prometheus/_help.html.haml
+++ b/app/views/shared/integrations/prometheus/_help.html.haml
diff --git a/app/views/shared/integrations/prometheus/_metrics.html.haml b/app/views/shared/integrations/prometheus/_metrics.html.haml
new file mode 100644
index 00000000000..8ee0ddfa1b1
--- /dev/null
+++ b/app/views/shared/integrations/prometheus/_metrics.html.haml
@@ -0,0 +1,38 @@
+- project = local_assigns.fetch(:project)
+
+= render 'shared/integrations/prometheus/custom_metrics', project: project, integration: integration
+
+.col-lg-3
+ %p
+ = s_('PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters.')
+ = link_to s_('PrometheusService|More information'), help_page_path('user/project/integrations/prometheus'), target: '_blank', rel: "noopener noreferrer"
+
+.col-lg-9
+ .card.js-panel-monitored-metrics{ data: { active_metrics: active_common_project_prometheus_metrics_path(project, :json), metrics_help_path: help_page_path('user/project/integrations/prometheus_library/index') } }
+ .card-header
+ %strong
+ = s_('PrometheusService|Common metrics')
+ = gl_badge_tag 0, nil, class: 'js-monitored-count'
+ .card-body
+ .loading-metrics.js-loading-metrics
+ %p.m-3
+ = gl_loading_icon(inline: true, css_class: 'metrics-load-spinner')
+ = s_('PrometheusService|Finding and configuring metrics...')
+ .empty-metrics.hidden.js-empty-metrics
+ %p.text-tertiary.m-3
+ = s_('PrometheusService|Waiting for your first deployment to an environment to find common metrics')
+ %ul.list-unstyled.metrics-list.hidden.js-metrics-list
+
+ .card.hidden.js-panel-missing-env-vars
+ .card-header
+ = sprite_icon('chevron-lg-right', css_class: 'panel-toggle js-panel-toggle-right' )
+ = sprite_icon('chevron-lg-down', css_class: 'panel-toggle js-panel-toggle-down hidden' )
+ = s_('PrometheusService|Missing environment variable')
+ = gl_badge_tag 0, nil, class: 'js-env-var-count'
+ .card-body.hidden
+ .flash-container
+ .flash-notice
+ .flash-text
+ = s_("PrometheusService|To set up automatic monitoring, add the environment variable %{variable} to exporter's queries." % { variable: "<code>$CI_ENVIRONMENT_SLUG</code>" }).html_safe
+ = link_to s_('PrometheusService|More information'), help_page_path('operations/metrics/dashboards/variables.md', anchor: 'query-variables')
+ %ul.list-unstyled.metrics-list.js-missing-var-metrics-list
diff --git a/app/views/shared/integrations/prometheus/_show.html.haml b/app/views/shared/integrations/prometheus/_show.html.haml
new file mode 100644
index 00000000000..0e133e66794
--- /dev/null
+++ b/app/views/shared/integrations/prometheus/_show.html.haml
@@ -0,0 +1,7 @@
+.row
+ .col-lg-3
+ %h4.gl-mt-0
+ = s_('PrometheusService|Metrics')
+
+.row.gl-mb-3.prometheus-metrics-monitoring.js-prometheus-metrics-monitoring
+ = render 'shared/integrations/prometheus/metrics', project: @project, integration: integration
diff --git a/app/views/projects/services/slack/_help.haml b/app/views/shared/integrations/slack/_help.haml
index c5fcd5ca5fe..c5fcd5ca5fe 100644
--- a/app/views/projects/services/slack/_help.haml
+++ b/app/views/shared/integrations/slack/_help.haml
diff --git a/app/views/projects/services/slack_slash_commands/_help.html.haml b/app/views/shared/integrations/slack_slash_commands/_help.html.haml
index fee0ca15808..fee0ca15808 100644
--- a/app/views/projects/services/slack_slash_commands/_help.html.haml
+++ b/app/views/shared/integrations/slack_slash_commands/_help.html.haml
diff --git a/app/views/shared/issuable/_assignees.html.haml b/app/views/shared/issuable/_assignees.html.haml
index 73f1e35f03f..112b0368a3a 100644
--- a/app/views/shared/issuable/_assignees.html.haml
+++ b/app/views/shared/issuable/_assignees.html.haml
@@ -3,7 +3,7 @@
- render_count = assignees_rendering_overflow ? max_render - 1 : max_render
- more_assignees_count = issuable.assignees.size - render_count
-- if issuable.instance_of?(MergeRequest) && Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+- if issuable.instance_of?(MergeRequest) && current_user&.mr_attention_requests_enabled?
= render 'shared/issuable/merge_request_assignees', issuable: issuable, count: render_count
- else
- issuable.assignees.take(render_count).each do |assignee| # rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml
index e0d5f738273..62e1a930ee6 100644
--- a/app/views/shared/issuable/_form.html.haml
+++ b/app/views/shared/issuable/_form.html.haml
@@ -8,8 +8,8 @@
- if @conflict
= render Pajamas::AlertComponent.new(variant: :danger,
dismissible: false,
- alert_class: 'gl-mb-5') do
- .gl-alert-body
+ alert_class: 'gl-mb-5') do |c|
+ = c.body do
Someone edited the #{issuable.class.model_name.human.downcase} the same time you did.
Please check out
= link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project, issuable]), target: "_blank", rel: 'noopener noreferrer'
diff --git a/app/views/shared/issuable/_reviewers.html.haml b/app/views/shared/issuable/_reviewers.html.haml
index 4af2cb00859..3bf923eb946 100644
--- a/app/views/shared/issuable/_reviewers.html.haml
+++ b/app/views/shared/issuable/_reviewers.html.haml
@@ -3,7 +3,7 @@
- render_count = reviewers_rendering_overflow ? max_render - 1 : max_render
- more_reviewers_count = issuable.reviewers.size - render_count
-- if issuable.instance_of?(MergeRequest) && Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+- if issuable.instance_of?(MergeRequest) && current_user&.mr_attention_requests_enabled?
= render 'shared/issuable/merge_request_reviewers', issuable: issuable, count: render_count
- else
- issuable.reviewers.take(render_count).each do |reviewer| # rubocop: disable CodeReuse/ActiveRecord
diff --git a/app/views/shared/issuable/_search_bar.html.haml b/app/views/shared/issuable/_search_bar.html.haml
index 7fdf8ea7796..6394e05ae24 100644
--- a/app/views/shared/issuable/_search_bar.html.haml
+++ b/app/views/shared/issuable/_search_bar.html.haml
@@ -88,7 +88,7 @@
= render 'shared/issuable/user_dropdown_item',
user: User.new(username: '{{username}}', name: '{{name}}'),
avatar: { lazy: true, url: '{{avatar_url}}' }
- - if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+ - if current_user&.mr_attention_requests_enabled?
#js-dropdown-attention-requested.filtered-search-input-dropdown-menu.dropdown-menu
- if current_user
%ul{ data: { dropdown: true } }
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index b99294f504c..feffc7eb011 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -8,17 +8,25 @@
- add_page_startup_api_call "#{issuable_sidebar[:issuable_json_path]}?serializer=sidebar_extras"
- reviewers = local_assigns.fetch(:reviewers, nil)
- in_group_context_with_iterations = @project.group.present? && issuable_sidebar[:supports_iterations]
+- is_merge_request = issuable_type === 'merge_request'
+- moved_sidebar_enabled = moved_mr_sidebar_enabled? && is_merge_request
-%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { signed: { in: signed_in }, issuable_type: issuable_type }, class: sidebar_gutter_collapsed_class, 'aria-live' => 'polite', 'aria-label': issuable_type }
- .issuable-sidebar
- .issuable-sidebar-header.gl-py-3
- %a.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ role: "button", href: "#", "aria-label" => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } }
+%aside.right-sidebar.js-right-sidebar.js-issuable-sidebar{ data: { signed: { in: signed_in }, issuable_type: issuable_type }, class: "#{sidebar_gutter_collapsed_class} #{'right-sidebar-merge-requests' if moved_sidebar_enabled}", 'aria-live' => 'polite', 'aria-label': issuable_type }
+ .issuable-sidebar{ class: "#{'is-merge-request' if moved_sidebar_enabled}" }
+ .issuable-sidebar-header{ class: "#{'gl-pb-2! gl-md-display-flex gl-justify-content-end gl-md-display-none!' if moved_sidebar_enabled}" }
+ %a.gutter-toggle.float-right.js-sidebar-toggle.has-tooltip{ role: "button", class: "#{'gl-display-block' if moved_sidebar_enabled}", href: "#", "aria-label" => _('Toggle sidebar'), title: sidebar_gutter_tooltip_text, data: { container: 'body', placement: 'left', boundary: 'viewport' } }
= sidebar_gutter_toggle_icon
- - if signed_in
+ - if signed_in && !moved_sidebar_enabled
.js-issuable-todo{ data: { project_path: issuable_sidebar[:project_full_path], iid: issuable_sidebar[:iid], id: issuable_sidebar[:id] } }
= form_for issuable_type, url: issuable_sidebar[:issuable_json_path], remote: true, html: { class: 'issuable-context-form inline-update js-issuable-update' } do |f|
- .block.assignee.qa-assignee-block
+ - if signed_in && moved_sidebar_enabled
+ .block.to-do
+ .title.hide-collapsed.gl-font-weight-bold.gl-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-mt-2{ class: 'gl-mb-0!' }
+ = _('To-Do')
+ .js-issuable-todo{ data: { project_path: issuable_sidebar[:project_full_path], iid: issuable_sidebar[:iid], id: issuable_sidebar[:id] } }
+
+ .block.assignee.qa-assignee-block{ class: "#{'gl-mt-3' if !signed_in && moved_sidebar_enabled}" }
= render "shared/issuable/sidebar_assignees", issuable_sidebar: issuable_sidebar, assignees: assignees, signed_in: signed_in
- if reviewers
@@ -33,6 +41,8 @@
- if @project.group.present?
= render_if_exists 'shared/issuable/sidebar_item_epic', issuable_sidebar: issuable_sidebar, group_path: @project.group.full_path, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid], issuable_type: issuable_type
+ .js-sidebar-labels{ data: sidebar_labels_data(issuable_sidebar, @project) }
+
- if issuable_sidebar[:supports_milestone]
.block.milestone{ :class => ("gl-border-b-0!" if in_group_context_with_iterations), data: { qa_selector: 'milestone_block', testid: 'sidebar-milestones' } }
.js-milestone-select{ data: { can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid] } }
@@ -43,7 +53,12 @@
- if issuable_sidebar[:show_crm_contacts]
.block.contact
- #js-issue-crm-contacts{ data: { issue_id: issuable_sidebar[:id] } }
+ #js-issue-crm-contacts{ data: { issue_id: issuable_sidebar[:id], group_issues_path: issues_group_path(@project.group) } }
+
+ = render_if_exists 'shared/issuable/sidebar_weight', issuable_sidebar: issuable_sidebar, can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid]
+
+ - if issuable_sidebar.has_key?(:due_date)
+ #js-due-date-entry-point
- if issuable_sidebar[:supports_time_tracking]
#issuable-time-tracker.block
@@ -51,12 +66,6 @@
.title.hide-collapsed
= _('Time tracking')
= gl_loading_icon(inline: true)
- - if issuable_sidebar.has_key?(:due_date)
- #js-due-date-entry-point
-
- .js-sidebar-labels{ data: sidebar_labels_data(issuable_sidebar, @project) }
-
- = render_if_exists 'shared/issuable/sidebar_weight', issuable_sidebar: issuable_sidebar, can_edit: can_edit_issuable.to_s, project_path: issuable_sidebar[:project_full_path], issue_iid: issuable_sidebar[:iid]
- if issuable_sidebar[:supports_severity]
#js-severity
@@ -71,25 +80,23 @@
= render_if_exists 'shared/issuable/sidebar_cve_id_request', issuable_sidebar: issuable_sidebar
- -# haml-lint:disable InlineJavaScript
- %script#js-lock-issue-data{ type: "application/json" }= { is_locked: !!issuable_sidebar[:discussion_locked], is_editable: can_edit_issuable }.to_json.html_safe
- #js-lock-entry-point
+ - if !moved_sidebar_enabled
+ #js-lock-entry-point
+ - if signed_in
+ .js-sidebar-subscriptions-entry-point
.js-sidebar-participants-entry-point
- - if signed_in
- .js-sidebar-subscriptions-entry-point
-
.block.with-sub-blocks
#js-reference-entry-point
- - if issuable_type == 'merge_request'
+ - if issuable_type == 'merge_request' && !moved_sidebar_enabled
.sub-block.js-sidebar-source-branch
.sidebar-collapsed-icon.js-dont-change-state
- = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport')
+ = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport', class: 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm js-source-branch-copy')
.gl-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-mb-2.hide-collapsed
%span.gl-overflow-hidden.gl-text-overflow-ellipsis.gl-white-space-nowrap
= _('Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}').html_safe % { source_branch_open: "<span class='gl-font-monospace' data-testid='ref-name' title='#{html_escape(source_branch)}'>".html_safe, source_branch_close: "</span>".html_safe, source_branch: html_escape(source_branch) }
- = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport')
+ = clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport', class: 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm js-source-branch-copy')
- if show_forwarding_email
.block
diff --git a/app/views/shared/issuable/_sort_dropdown.html.haml b/app/views/shared/issuable/_sort_dropdown.html.haml
index f6d7ed6764d..e36c4cd6be0 100644
--- a/app/views/shared/issuable/_sort_dropdown.html.haml
+++ b/app/views/shared/issuable/_sort_dropdown.html.haml
@@ -1,26 +1,9 @@
-- sort_value = @sort
-- sort_title = issuable_sort_option_title(sort_value)
- viewing_issues = controller.controller_name == 'issues' || controller.action_name == 'issues'
- viewing_merge_requests = controller.controller_name == 'merge_requests'
+- items = issuable_sort_options(viewing_issues, viewing_merge_requests)
+- selected = issuable_sort_option_overrides[@sort] || @sort
-.dropdown.inline.gl-ml-3.issue-sort-dropdown
+.gl-ml-3
.btn-group{ role: 'group' }
- .btn-group{ role: 'group' }
- %button.dropdown-menu-toggle{ type: 'button', data: { toggle: 'dropdown', display: 'static' }, class: 'gl-button btn btn-default' }
- = sort_title
- = sprite_icon('chevron-down', css_class: "dropdown-menu-toggle-icon gl-top-3")
- %ul.dropdown-menu.dropdown-menu-right.dropdown-menu-selectable.dropdown-menu-sort
- %li
- = sortable_item(sort_title_priority, page_filter_path(sort: sort_value_priority), sort_title)
- = sortable_item(sort_title_created_date, page_filter_path(sort: sort_value_created_date), sort_title)
- = sortable_item(sort_title_recently_updated, page_filter_path(sort: sort_value_recently_updated), sort_title)
- = sortable_item(sort_title_milestone, page_filter_path(sort: sort_value_milestone), sort_title)
- = sortable_item(sort_title_due_date, page_filter_path(sort: sort_value_due_date), sort_title) if viewing_issues
- = sortable_item(sort_title_popularity, page_filter_path(sort: sort_value_popularity), sort_title)
- = sortable_item(sort_title_label_priority, page_filter_path(sort: sort_value_label_priority), sort_title)
- = sortable_item(sort_title_merged_date, page_filter_path(sort: sort_value_merged_date), sort_title) if viewing_merge_requests
- = sortable_item(sort_title_closed_date, page_filter_path(sort: sort_value_closed_date), sort_title) if viewing_merge_requests
- = sortable_item(sort_title_relative_position, page_filter_path(sort: sort_value_relative_position), sort_title) if viewing_issues
- = sortable_item(sort_title_title, page_filter_path(sort: sort_value_title), sort_title)
- = render_if_exists('shared/ee/issuable/sort_dropdown', viewing_issues: viewing_issues, sort_title: sort_title)
- = issuable_sort_direction_button(sort_value)
+ = gl_redirect_listbox_tag(items, selected, data: { right: true })
+ = issuable_sort_direction_button(@sort)
diff --git a/app/views/shared/issuable/_status_box.html.haml b/app/views/shared/issuable/_status_box.html.haml
index c0e972684d2..4fda1f11545 100644
--- a/app/views/shared/issuable/_status_box.html.haml
+++ b/app/views/shared/issuable/_status_box.html.haml
@@ -1,6 +1,10 @@
-- state_human_name, state_icon_name = state_name_with_icon(issuable)
+- badge_text = state_name_with_icon(issuable)[0]
+- badge_icon = state_name_with_icon(issuable)[1]
+- badge_variant = issuable.open? ? :success : issuable.merged? ? :info : :danger
+- badge_status_class = issuable.open? ? 'issuable-status-badge-open' : issuable.merged? ? 'issuable-status-badge-merged' : 'issuable-status-badge-closed'
+- updated_mr_header_enabled = Feature.enabled?(:updated_mr_header, @project) && issuable.is_a?(MergeRequest)
+- badge_classes = "js-mr-status-box issuable-status-badge gl-mr-3 #{badge_status_class} #{'gl-vertical-align-bottom' if updated_mr_header_enabled}"
-.issuable-status-box.status-box.js-mr-status-box{ class: status_box_class(issuable), data: { project_path: issuable.project.path_with_namespace, iid: issuable.iid, state: issuable.state } }
- = sprite_icon(state_icon_name, css_class: 'gl-display-block gl-sm-display-none!')
- %span.gl-display-none.gl-sm-display-block
- = state_human_name
+= gl_badge_tag({ variant: badge_variant, icon: badge_icon, icon_classes: 'gl-mr-0!' }, { class: badge_classes, data: { project_path: issuable.project.path_with_namespace, iid: issuable.iid, issuable_type: 'merge_request', state: issuable.state } }) do
+ %span.gl-display-none.gl-sm-display-block.gl-ml-2
+ = badge_text
diff --git a/app/views/shared/issue_type/_details_header.html.haml b/app/views/shared/issue_type/_details_header.html.haml
index eca61819cca..08fba712d5e 100644
--- a/app/views/shared/issue_type/_details_header.html.haml
+++ b/app/views/shared/issue_type/_details_header.html.haml
@@ -1,17 +1,16 @@
-- link = issue_closed_link(@issue, current_user, css_class: 'text-white text-underline')
+- link = issue_closed_link(@issue, current_user, css_class: 'text-underline gl-reset-color!')
+- badge_classes = 'issuable-status-badge gl-mr-3'
.detail-page-header
.detail-page-header-body
- .issuable-status-box.status-box.status-box-issue-closed{ class: issue_status_visibility(issuable, status_box: :closed) }
- = sprite_icon('issue-close', css_class: 'gl-display-block gl-sm-display-none!')
- .gl-display-none.gl-sm-display-block
+ = gl_badge_tag({ variant: :info, icon: 'issue-closed', icon_classes: 'gl-mr-0!' }, { class: "#{issue_status_visibility(issuable, status_box: :closed)} #{badge_classes} issuable-status-badge-closed" }) do
+ .gl-display-none.gl-sm-display-block.gl-ml-2
= issue_closed_text(issuable, current_user)
- - if link
- %span.text-white.gl-pl-2.gl-sm-display-none
- = "(#{link})"
- .issuable-status-box.status-box.status-box-open{ class: issue_status_visibility(issuable, status_box: :open) }
- = sprite_icon('issue-open-m', css_class: 'gl-display-block gl-sm-display-none!')
- %span.gl-display-none.gl-sm-display-block
+ - if link
+ %span.gl-pl-2.gl-sm-display-none
+ = "(#{link})"
+ = gl_badge_tag({ variant: :success, icon: 'issues', icon_classes: 'gl-mr-0!' }, { class: "#{issue_status_visibility(issuable, status_box: :open)} #{badge_classes} issuable-status-badge-open" }) do
+ %span.gl-display-none.gl-sm-display-block.gl-ml-2
= _('Open')
.issuable-meta
diff --git a/app/views/shared/milestones/_milestone.html.haml b/app/views/shared/milestones/_milestone.html.haml
index 4e06b7902bd..45699808b6b 100644
--- a/app/views/shared/milestones/_milestone.html.haml
+++ b/app/views/shared/milestones/_milestone.html.haml
@@ -4,7 +4,7 @@
%li{ class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: custom_dom_id }
.row
- .col-sm-6
+ .col-md-6
.gl-mb-2
%strong{ data: { qa_selector: "milestone_link", qa_milestone_title: milestone.title } }
= link_to truncate(milestone.title, length: 100), milestone_path(milestone)
@@ -33,18 +33,18 @@
%div
= render('shared/milestone_expired', milestone: milestone)
- if milestone.group_milestone?
- = gl_badge_tag milestone.group.full_name, variant: :info
+ = gl_badge_tag milestone.group.full_name, { variant: :info }, { class: 'gl-white-space-normal gl-text-left' }
- if milestone.project_milestone?
- = gl_badge_tag milestone.project.full_name, variant: :muted
+ = gl_badge_tag milestone.project.full_name, { variant: :muted }, { class: 'gl-white-space-normal gl-text-left' }
- .col-sm-4.milestone-progress
+ .col-md-4.milestone-progress
= milestone_progress_bar(milestone)
= link_to pluralize(milestone.total_issues_count, _('Issue')), issues_path
- if milestone.merge_requests_enabled?
&middot;
= link_to pluralize(milestone.total_merge_requests_count, _('Merge request')), merge_requests_path
.float-lg-right.light #{milestone.percent_complete}% complete
- .col-sm-2
+ .col-md-2
.milestone-actions.d-flex.justify-content-sm-start.justify-content-md-end
- if @project # if in milestones list on project level
- if can_admin_group_milestones?
diff --git a/app/views/shared/milestones/_milestone_complete_alert.html.haml b/app/views/shared/milestones/_milestone_complete_alert.html.haml
index 4685a93a343..86f9193cc7a 100644
--- a/app/views/shared/milestones/_milestone_complete_alert.html.haml
+++ b/app/views/shared/milestones/_milestone_complete_alert.html.haml
@@ -3,6 +3,6 @@
- if milestone.complete? && milestone.active?
= render Pajamas::AlertComponent.new(variant: :success,
alert_data: { testid: 'all-issues-closed-alert' },
- dismissible: false) do
- .gl-alert-body
- = yield
+ dismissible: false) do |c|
+ = c.body do
+ = yield
diff --git a/app/views/shared/milestones/_sidebar.html.haml b/app/views/shared/milestones/_sidebar.html.haml
index a1e94172ec3..12026b89429 100644
--- a/app/views/shared/milestones/_sidebar.html.haml
+++ b/app/views/shared/milestones/_sidebar.html.haml
@@ -163,9 +163,9 @@
.block.reference
.sidebar-collapsed-icon.js-dont-change-state
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
- .cross-project-reference.hide-collapsed
- %span.gl-display-inline-block.gl-text-truncate
+ .gl-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-mb-2.hide-collapsed
+ %span.gl-overflow-hidden.gl-text-overflow-ellipsis.gl-white-space-nowrap
= s_('MilestoneSidebar|Reference:')
%span{ title: milestone_ref }
= milestone_ref
- = clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport', class: 'btn-clipboard btn-transparent gl-float-right gl-bg-gray-10')
+ = clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
diff --git a/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml b/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
index cfa87351689..d167ffb5582 100644
--- a/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
+++ b/app/views/shared/namespaces/cascading_settings/_enforcement_checkbox.html.haml
@@ -9,10 +9,7 @@
- lock_attribute = "lock_#{attribute}"
-.gl-form-checkbox.custom-control.custom-checkbox
- = form.check_box lock_attribute, checked: group.namespace_settings.public_send(lock_attribute), class: 'custom-control-input', data: { testid: 'enforce-for-all-subgroups-checkbox' }
- = form.label lock_attribute, class: 'custom-control-label' do
- %span
- = yield.presence || s_('CascadingSettings|Enforce for all subgroups')
- %p.help-text
- = help_text
+= form.gitlab_ui_checkbox_component lock_attribute,
+ s_('CascadingSettings|Enforce for all subgroups'),
+ help_text: help_text,
+ checkbox_options: { checked: group.namespace_settings.public_send(lock_attribute), data: { testid: 'enforce-for-all-subgroups-checkbox' } }
diff --git a/app/views/shared/notes/_hints.html.haml b/app/views/shared/notes/_hints.html.haml
index 8a79a17b166..c845d4df7df 100644
--- a/app/views/shared/notes/_hints.html.haml
+++ b/app/views/shared/notes/_hints.html.haml
@@ -2,15 +2,12 @@
- supports_file_upload = local_assigns.fetch(:supports_file_upload, true)
.comment-toolbar.clearfix
.toolbar-text
- = link_to _('Markdown'), help_page_path('user/markdown'), target: '_blank', rel: 'noopener noreferrer'
+ - markdownLinkStart = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/markdown') }
+ - quickActionsLinkStart = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: help_page_path('user/project/quick_actions') }
- if supports_quick_actions
- and
- = link_to _('quick actions'), help_page_path('user/project/quick_actions'), target: '_blank', rel: 'noopener noreferrer'
- are
+ = html_escape(s_('NoteToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}. For %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd}, type %{keyboardStart}/%{keyboardEnd}.')) % { markdownDocsLinkStart: markdownLinkStart, markdownDocsLinkEnd: '</a>'.html_safe, quickActionsDocsLinkStart: quickActionsLinkStart, quickActionsDocsLinkEnd: '</a>'.html_safe, keyboardStart: '<kbd>'.html_safe, keyboardEnd: '</kbd>'.html_safe }
- else
- is
- supported
-
+ = html_escape(s_('MarkdownToolbar|Supports %{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd}')) % { markdownDocsLinkStart: markdownLinkStart, markdownDocsLinkEnd: '</a>'.html_safe }
- if supports_file_upload
%span.uploading-container
%span.uploading-progress-container.hide
diff --git a/app/views/shared/projects/_topics.html.haml b/app/views/shared/projects/_topics.html.haml
index b7df369327c..e3895663033 100644
--- a/app/views/shared/projects/_topics.html.haml
+++ b/app/views/shared/projects/_topics.html.haml
@@ -7,25 +7,25 @@
= sprite_icon('tag', css_class: 'icon gl-relative gl-mr-2')
- project.topics_to_show.each do |topic|
- - explore_project_topic_path = topic_explore_projects_path(topic_name: topic)
- - if topic.length > max_project_topic_length
- %a.gl-mr-3.has-tooltip{ data: { container: "body" }, title: topic, href: explore_project_topic_path, itemprop: 'keywords' }
- = gl_badge_tag truncate(topic, length: max_project_topic_length)
+ - explore_project_topic_path = topic_explore_projects_path(topic_name: topic[:name])
+ - if topic[:title].length > max_project_topic_length
+ %a.gl-mr-3.has-tooltip{ data: { container: "body" }, title: topic[:title], href: explore_project_topic_path, itemprop: 'keywords' }
+ = gl_badge_tag truncate(topic[:title], length: max_project_topic_length)
- else
%a.gl-mr-3{ href: explore_project_topic_path, itemprop: 'keywords' }
- = gl_badge_tag topic
+ = gl_badge_tag topic[:title]
- if project.has_extra_topics?
- title = _('More topics')
- content = capture do
%span.gl-display-inline-flex.gl-flex-wrap
- project.topics_not_shown.each do |topic|
- - explore_project_topic_path = topic_explore_projects_path(topic_name: topic)
- - if topic.length > max_project_topic_length
- %a.gl-mr-3.gl-mb-3.has-tooltip{ data: { container: "body" }, title: topic, href: explore_project_topic_path, itemprop: 'keywords' }
- = gl_badge_tag truncate(topic, length: max_project_topic_length)
+ - explore_project_topic_path = topic_explore_projects_path(topic_name: topic[:name])
+ - if topic[:title].length > max_project_topic_length
+ %a.gl-mr-3.gl-mb-3.has-tooltip{ data: { container: "body" }, title: topic[:title], href: explore_project_topic_path, itemprop: 'keywords' }
+ = gl_badge_tag truncate(topic[:title], length: max_project_topic_length)
- else
%a.gl-mr-3.gl-mb-3{ href: explore_project_topic_path, itemprop: 'keywords' }
- = gl_badge_tag topic
+ = gl_badge_tag topic[:title]
.text-nowrap{ role: 'button', tabindex: 0, data: { toggle: 'popover', html: 'true', placement: 'top', title: title, content: content } }
= _("+ %{count} more") % { count: project.count_of_extra_topics_not_shown }
diff --git a/app/views/shared/runners/_form.html.haml b/app/views/shared/runners/_form.html.haml
index 8d0069a7664..024b06fe97a 100644
--- a/app/views/shared/runners/_form.html.haml
+++ b/app/views/shared/runners/_form.html.haml
@@ -1,30 +1,22 @@
-= form_for runner, url: runner_form_url do |f|
+= gitlab_ui_form_for runner, url: runner_form_url do |f|
= form_errors(runner)
.form-group.row
= label :active, _("Active"), class: 'col-form-label col-sm-2'
.col-sm-10
- .form-check
- = f.check_box :active, { class: 'form-check-input' }
- %label.light{ for: :runner_active }= _("Paused runners don't accept new jobs")
+ = f.gitlab_ui_checkbox_component :active, _("Paused runners don't accept new jobs")
.form-group.row
= label :protected, _("Protected"), class: 'col-form-label col-sm-2'
.col-sm-10
- .form-check
- = f.check_box :access_level, { class: 'form-check-input' }, 'ref_protected', 'not_protected'
- %label.light{ for: :runner_access_level }= _('This runner will only run on pipelines triggered on protected branches')
+ = f.gitlab_ui_checkbox_component :access_level, _('This runner will only run on pipelines triggered on protected branches'), checked_value: 'ref_protected', unchecked_value: 'not_protected'
.form-group.row
= label :run_untagged, _('Run untagged jobs'), class: 'col-form-label col-sm-2'
.col-sm-10
- .form-check
- = f.check_box :run_untagged, { class: 'form-check-input' }
- %label.light{ for: :runner_run_untagged }= _('Indicates whether this runner can pick jobs without tags')
+ = f.gitlab_ui_checkbox_component :run_untagged, _('Indicates whether this runner can pick jobs without tags')
- unless runner.group_type?
.form-group.row
= label :locked, _('Lock to current projects'), class: 'col-form-label col-sm-2'
.col-sm-10
- .form-check
- = f.check_box :locked, { class: 'form-check-input' }
- %label.light{ for: :runner_locked }= _('When a runner is locked, it cannot be assigned to other projects')
+ = f.gitlab_ui_checkbox_component :locked, _('When a runner is locked, it cannot be assigned to other projects')
.form-group.row
= label_tag :ip_address, class: 'col-form-label col-sm-2' do
= _('IP Address')
diff --git a/app/views/shared/runners/_runner_type_alert.html.haml b/app/views/shared/runners/_runner_type_alert.html.haml
index 365cee5fadc..4bf02b71109 100644
--- a/app/views/shared/runners/_runner_type_alert.html.haml
+++ b/app/views/shared/runners/_runner_type_alert.html.haml
@@ -3,14 +3,14 @@
- if runner.group_type?
= render Pajamas::AlertComponent.new(alert_class: alert_class,
title: s_('Runners|This runner is available to all projects and subgroups in a group.'),
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= s_('Runners|Use Group runners when you want all projects in a group to have access to a set of runners.')
= link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'group-runners'), target: '_blank', rel: 'noopener noreferrer'
- else
= render Pajamas::AlertComponent.new(alert_class: alert_class,
title: s_('Runners|This runner is associated with specific projects.'),
- dismissible: false) do
- .gl-alert-body
+ dismissible: false) do |c|
+ = c.body do
= s_('Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner.')
= link_to _('Learn more.'), help_page_path('ci/runners/runners_scope', anchor: 'specific-runners'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/shared/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml
index 4e373dda013..3cd70dab4d5 100644
--- a/app/views/shared/snippets/_snippet.html.haml
+++ b/app/views/shared/snippets/_snippet.html.haml
@@ -4,21 +4,20 @@
%li.snippet-row.py-3{ data: { qa_selector: 'snippet_link', qa_snippet_title: snippet.title } }
= image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: ''
- .title
- = link_to gitlab_snippet_path(snippet) do
- = snippet.title
+ = link_to gitlab_snippet_path(snippet), class: "title" do
+ = snippet.title
- %ul.controls{ data: { qa_selector: 'snippet_file_count_content', qa_snippet_files: snippet.statistics&.file_count } }
- %li
- = snippet_file_count(snippet)
- %li
- = link_to gitlab_snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count == 0) do
- = sprite_icon('comments', css_class: 'gl-vertical-align-text-bottom')
- = notes_count
- %li
- %span.sr-only{ data: { qa_selector: 'snippet_visibility_content', qa_snippet_visibility: visibility_level_label(snippet.visibility_level) } }
- = visibility_level_label(snippet.visibility_level)
- = visibility_level_icon(snippet.visibility_level)
+ %ul.controls{ data: { qa_selector: 'snippet_file_count_content', qa_snippet_files: snippet.statistics&.file_count } }
+ %li
+ = snippet_file_count(snippet)
+ %li
+ = link_to gitlab_snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count == 0) do
+ = sprite_icon('comments', css_class: 'gl-vertical-align-text-bottom')
+ = notes_count
+ %li
+ %span.sr-only{ data: { qa_selector: 'snippet_visibility_content', qa_snippet_visibility: visibility_level_label(snippet.visibility_level) } }
+ = visibility_level_label(snippet.visibility_level)
+ = visibility_level_icon(snippet.visibility_level)
.snippet-info
#{snippet.to_reference} &middot;
diff --git a/app/views/shared/topics/_topic.html.haml b/app/views/shared/topics/_topic.html.haml
index a47d4495777..ca1098511da 100644
--- a/app/views/shared/topics/_topic.html.haml
+++ b/app/views/shared/topics/_topic.html.haml
@@ -1,4 +1,4 @@
-- max_topic_name_length = 30
+- max_topic_title_length = 30
- detail_page_link = topic_explore_projects_path(topic_name: topic.name)
.col-lg-3.col-md-4.col-sm-12
@@ -8,9 +8,9 @@
= link_to detail_page_link do
= topic_icon(topic, class: "avatar s40")
= link_to detail_page_link do
- - if topic.name.length > max_topic_name_length
- %h5.str-truncated.has-tooltip{ title: topic.name }
- = truncate(topic.name, length: max_topic_name_length)
+ - if topic.title_or_name.length > max_topic_title_length
+ %h5.gl-str-truncated.has-tooltip{ title: topic.title_or_name }
+ = truncate(topic.title_or_name, length: max_topic_title_length)
- else
%h5
- = topic.name
+ = topic.title_or_name
diff --git a/app/views/shared/web_hooks/_hook_errors.html.haml b/app/views/shared/web_hooks/_hook_errors.html.haml
index a100a620cea..d95efe83e15 100644
--- a/app/views/shared/web_hooks/_hook_errors.html.haml
+++ b/app/views/shared/web_hooks/_hook_errors.html.haml
@@ -11,13 +11,13 @@
support_link_start: link_start % { url: support_path },
support_link_end: link_end }
= render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook was automatically disabled'),
- variant: :danger) do
- .gl-alert-body
+ variant: :danger) do |c|
+ = c.body do
= s_('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.').html_safe % placeholders
- elsif hook.permanently_disabled?
= render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook failed to connect'),
- variant: :danger) do
- .gl-alert-body
+ variant: :danger) do |c|
+ = c.body do
= s_('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.').html_safe % { strong_start: strong_start, strong_end: strong_end }
- elsif hook.temporarily_disabled?
- help_path = help_page_path('user/project/integrations/webhooks', anchor: 'webhook-fails-or-multiple-webhook-requests-are-triggered')
@@ -27,6 +27,6 @@
help_link_start: link_start % { url: help_path },
help_link_end: link_end }
= render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook fails to connect'),
- variant: :warning) do
- .gl-alert-body
+ variant: :warning) do |c|
+ = c.body do
= s_('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.').html_safe % placeholders
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index bfb70e0d496..8a525e455fd 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -3,24 +3,6 @@
#
# Do not edit it manually!
---
-- :name: authorized_project_update:authorized_project_update_project_create
- :worker_name: AuthorizedProjectUpdate::ProjectCreateWorker
- :feature_category: :authentication_and_authorization
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
-- :name: authorized_project_update:authorized_project_update_project_group_link_create
- :worker_name: AuthorizedProjectUpdate::ProjectGroupLinkCreateWorker
- :feature_category: :authentication_and_authorization
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :tags: []
- :name: authorized_project_update:authorized_project_update_project_recalculate
:worker_name: AuthorizedProjectUpdate::ProjectRecalculateWorker
:feature_category: :authentication_and_authorization
@@ -597,6 +579,15 @@
:weight: 1
:idempotent:
:tags: []
+- :name: cronjob:projects_inactive_projects_deletion_cron
+ :worker_name: Projects::InactiveProjectsDeletionCronWorker
+ :feature_category: :compliance_management
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: cronjob:projects_schedule_refresh_build_artifacts_size_statistics
:worker_name: Projects::ScheduleRefreshBuildArtifactsSizeStatisticsWorker
:feature_category: :build_artifacts
@@ -678,15 +669,6 @@
:weight: 1
:idempotent:
:tags: []
-- :name: cronjob:requests_profiles
- :worker_name: RequestsProfilesWorker
- :feature_category: :source_code_management
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: cronjob:schedule_merge_request_cleanup_refs
:worker_name: ScheduleMergeRequestCleanupRefsWorker
:feature_category: :code_review
@@ -2290,15 +2272,6 @@
:weight: 1
:idempotent: true
:tags: []
-- :name: expire_build_instance_artifacts
- :worker_name: ExpireBuildInstanceArtifactsWorker
- :feature_category: :build_artifacts
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent:
- :tags: []
- :name: export_csv
:worker_name: ExportCsvWorker
:feature_category: :team_planning
@@ -2533,6 +2506,15 @@
:weight: 1
:idempotent: true
:tags: []
+- :name: merge_requests_close_issue
+ :worker_name: MergeRequests::CloseIssueWorker
+ :feature_category: :code_review
+ :has_external_dependencies: true
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: merge_requests_delete_source_branch
:worker_name: MergeRequests::DeleteSourceBranchWorker
:feature_category: :source_code_management
@@ -2803,6 +2785,15 @@
:weight: 1
:idempotent:
:tags: []
+- :name: projects_after_import
+ :worker_name: Projects::AfterImportWorker
+ :feature_category: :importers
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: projects_git_garbage_collect
:worker_name: Projects::GitGarbageCollectWorker
:feature_category: :gitaly
@@ -2812,6 +2803,15 @@
:weight: 1
:idempotent:
:tags: []
+- :name: projects_inactive_projects_deletion_notification
+ :worker_name: Projects::InactiveProjectsDeletionNotificationWorker
+ :feature_category: :compliance_management
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
+ :tags: []
- :name: projects_post_creation
:worker_name: Projects::PostCreationWorker
:feature_category: :source_code_management
@@ -3123,7 +3123,7 @@
:worker_name: WebHooks::DestroyWorker
:feature_category: :integrations
:has_external_dependencies:
- :urgency: :low
+ :urgency: :high
:resource_boundary: :unknown
:weight: 1
:idempotent: true
diff --git a/app/workers/authorized_project_update/project_create_worker.rb b/app/workers/authorized_project_update/project_create_worker.rb
deleted file mode 100644
index 1f19168cd36..00000000000
--- a/app/workers/authorized_project_update/project_create_worker.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module AuthorizedProjectUpdate
- class ProjectCreateWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- feature_category :authentication_and_authorization
- urgency :low
- queue_namespace :authorized_project_update
-
- idempotent!
-
- def perform(project_id)
- project = Project.find(project_id)
-
- AuthorizedProjectUpdate::ProjectCreateService.new(project).execute
- end
- end
-end
diff --git a/app/workers/authorized_project_update/project_group_link_create_worker.rb b/app/workers/authorized_project_update/project_group_link_create_worker.rb
deleted file mode 100644
index d83981c4ce1..00000000000
--- a/app/workers/authorized_project_update/project_group_link_create_worker.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-module AuthorizedProjectUpdate
- class ProjectGroupLinkCreateWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- feature_category :authentication_and_authorization
- urgency :low
- queue_namespace :authorized_project_update
-
- idempotent!
-
- def perform(project_id, group_id, group_access = nil)
- project = Project.find(project_id)
- group = Group.find(group_id)
-
- AuthorizedProjectUpdate::ProjectGroupLinkCreateService
- .new(project, group, group_access)
- .execute
- end
- end
-end
diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb
index 1a98705c151..b515f0fa202 100644
--- a/app/workers/bulk_imports/pipeline_worker.rb
+++ b/app/workers/bulk_imports/pipeline_worker.rb
@@ -4,7 +4,7 @@ module BulkImports
class PipelineWorker # rubocop:disable Scalability/IdempotentWorker
include ApplicationWorker
- NDJSON_PIPELINE_PERFORM_DELAY = 10.seconds
+ FILE_EXTRACTION_PIPELINE_PERFORM_DELAY = 10.seconds
data_consistency :always
feature_category :importers
@@ -46,13 +46,13 @@ module BulkImports
raise(Entity::FailedError, 'Failed entity status')
end
- if ndjson_pipeline?(pipeline_tracker)
- status = ExportStatus.new(pipeline_tracker, pipeline_tracker.pipeline_class.relation)
+ if file_extraction_pipeline?(pipeline_tracker)
+ export_status = ExportStatus.new(pipeline_tracker, pipeline_tracker.pipeline_class.relation)
raise(Pipeline::ExpiredError, 'Pipeline timeout') if job_timeout?(pipeline_tracker)
- raise(Pipeline::FailedError, status.error) if status.failed?
+ raise(Pipeline::FailedError, export_status.error) if export_status.failed?
- return reenqueue(pipeline_tracker) if status.started?
+ return reenqueue(pipeline_tracker) if export_status.started?
end
pipeline_tracker.update!(status_event: 'start', jid: jid)
@@ -104,15 +104,15 @@ module BulkImports
@logger ||= Gitlab::Import::Logger.build
end
- def ndjson_pipeline?(pipeline_tracker)
- pipeline_tracker.pipeline_class.ndjson_pipeline?
+ def file_extraction_pipeline?(pipeline_tracker)
+ pipeline_tracker.pipeline_class.file_extraction_pipeline?
end
def job_timeout?(pipeline_tracker)
(Time.zone.now - pipeline_tracker.entity.created_at) > Pipeline::NDJSON_EXPORT_TIMEOUT
end
- def reenqueue(pipeline_tracker, delay: NDJSON_PIPELINE_PERFORM_DELAY)
+ def reenqueue(pipeline_tracker, delay: FILE_EXTRACTION_PIPELINE_PERFORM_DELAY)
self.class.perform_in(
delay,
pipeline_tracker.id,
diff --git a/app/workers/ci/build_finished_worker.rb b/app/workers/ci/build_finished_worker.rb
index 70c234bd4c7..2d7f3a67004 100644
--- a/app/workers/ci/build_finished_worker.rb
+++ b/app/workers/ci/build_finished_worker.rb
@@ -61,7 +61,7 @@ module Ci
end
def archive_trace_worker_class(build)
- if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project, default_enabled: :yaml)
+ if Feature.enabled?(:ci_build_finished_worker_namespace_changed, build.project)
Ci::ArchiveTraceWorker
else
::ArchiveTraceWorker
diff --git a/app/workers/cleanup_container_repository_worker.rb b/app/workers/cleanup_container_repository_worker.rb
index 7274ecf62f9..73501315575 100644
--- a/app/workers/cleanup_container_repository_worker.rb
+++ b/app/workers/cleanup_container_repository_worker.rb
@@ -23,31 +23,17 @@ class CleanupContainerRepositoryWorker
return unless valid?
- if run_by_container_expiration_policy?
- container_repository.start_expiration_policy!
- end
-
- result = Projects::ContainerRepository::CleanupTagsService
+ Projects::ContainerRepository::CleanupTagsService
.new(container_repository, current_user, params)
.execute
-
- if run_by_container_expiration_policy? && result[:status] == :success
- container_repository.reset_expiration_policy_started_at!
- end
end
private
def valid?
- return true if run_by_container_expiration_policy?
-
current_user && container_repository && project
end
- def run_by_container_expiration_policy?
- @params['container_expiration_policy'] && container_repository.present? && project.present?
- end
-
def project
container_repository&.project
end
diff --git a/app/workers/concerns/git_garbage_collect_methods.rb b/app/workers/concerns/git_garbage_collect_methods.rb
index 308ffacfc6b..5c0493c9be5 100644
--- a/app/workers/concerns/git_garbage_collect_methods.rb
+++ b/app/workers/concerns/git_garbage_collect_methods.rb
@@ -37,7 +37,7 @@ module GitGarbageCollectMethods
# Refresh the branch cache in case garbage collection caused a ref lookup to fail
flush_ref_caches(resource) if gc?(task)
- update_repository_statistics(resource) if task != :pack_refs
+ update_repository_statistics(resource, task)
# In case pack files are deleted, release libgit2 cache and open file
# descriptors ASAP instead of waiting for Ruby garbage collection
@@ -83,7 +83,7 @@ module GitGarbageCollectMethods
def gitaly_call(task, resource)
repository = resource.repository.raw_repository
- if Feature.enabled?(:optimized_housekeeping, container(resource), default_enabled: :yaml)
+ if Feature.enabled?(:optimized_housekeeping, container(resource))
client = repository.gitaly_repository_client
if task == :prune
@@ -135,15 +135,25 @@ module GitGarbageCollectMethods
resource.repository.has_visible_content?
end
- def update_repository_statistics(resource)
+ def update_repository_statistics(resource, task)
+ return if task == :pack_refs
+
resource.repository.expire_statistics_caches
return if Gitlab::Database.read_only? # GitGarbageCollectWorker may be run on a Geo secondary
- update_db_repository_statistics(resource)
+ stats_to_update = stats
+
+ stats_to_update.delete(:repository_size) if task == :incremental_repack
+
+ update_db_repository_statistics(resource, stats_to_update)
end
- def update_db_repository_statistics(resource)
+ def update_db_repository_statistics(resource, stats)
# no-op
end
+
+ def stats
+ []
+ end
end
diff --git a/app/workers/concerns/reenqueuer.rb b/app/workers/concerns/reenqueuer.rb
index 641ca691868..9c0f8f94a24 100644
--- a/app/workers/concerns/reenqueuer.rb
+++ b/app/workers/concerns/reenqueuer.rb
@@ -41,6 +41,8 @@ module Reenqueuer
end
def perform(*args)
+ set_custom_lease_key(*args) if self.respond_to?(:set_custom_lease_key)
+
try_obtain_lease do
reenqueue(*args) do
ensure_minimum_duration(minimum_duration) do
diff --git a/app/workers/concerns/worker_attributes.rb b/app/workers/concerns/worker_attributes.rb
index 8f7a3da5429..5d7251e9a98 100644
--- a/app/workers/concerns/worker_attributes.rb
+++ b/app/workers/concerns/worker_attributes.rb
@@ -104,7 +104,7 @@ module WorkerAttributes
def get_data_consistency_feature_flag_enabled?
return true unless class_attributes[:data_consistency_feature_flag]
- Feature.enabled?(class_attributes[:data_consistency_feature_flag], default_enabled: :yaml)
+ Feature.enabled?(class_attributes[:data_consistency_feature_flag])
end
# Set this attribute on a job when it will call to services outside of the
@@ -175,7 +175,7 @@ module WorkerAttributes
def deduplication_enabled?
return true unless get_deduplication_options[:feature_flag]
- Feature.enabled?(get_deduplication_options[:feature_flag], default_enabled: :yaml)
+ Feature.enabled?(get_deduplication_options[:feature_flag])
end
def big_payload!
diff --git a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
index cd3ed5d4c9b..f40855a7455 100644
--- a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
+++ b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb
@@ -27,7 +27,6 @@ module ContainerExpirationPolicies
].freeze
def perform_work
- return unless throttling_enabled?
return unless container_repository
log_extra_metadata_on_done(:container_repository_id, container_repository.id)
@@ -45,8 +44,6 @@ module ContainerExpirationPolicies
end
def max_running_jobs
- return 0 unless throttling_enabled?
-
::Gitlab::CurrentSettings.container_registry_expiration_policies_worker_capacity
end
@@ -122,10 +119,6 @@ module ContainerExpirationPolicies
policy.next_run_at < now || (now + max_cleanup_execution_time.seconds < policy.next_run_at)
end
- def throttling_enabled?
- Feature.enabled?(:container_registry_expiration_policies_throttling, default_enabled: :yaml)
- end
-
def max_cleanup_execution_time
::Gitlab::CurrentSettings.container_registry_delete_tags_service_timeout
end
diff --git a/app/workers/container_expiration_policy_worker.rb b/app/workers/container_expiration_policy_worker.rb
index 308ccfe2cb3..80499aff431 100644
--- a/app/workers/container_expiration_policy_worker.rb
+++ b/app/workers/container_expiration_policy_worker.rb
@@ -5,7 +5,11 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
data_consistency :always
+ # rubocop:disable Scalability/CronWorkerContext
+ # This worker does not perform work scoped to a context
include CronjobQueue
+ # rubocop:enable Scalability/CronWorkerContext
+
include ExclusiveLeaseGuard
feature_category :container_registry
@@ -17,7 +21,9 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
def perform
process_stale_ongoing_cleanups
disable_policies_without_container_repositories
- throttling_enabled? ? perform_throttled : perform_unthrottled
+ try_obtain_lease do
+ ContainerExpirationPolicies::CleanupContainerRepositoryWorker.perform_with_capacity
+ end
log_counts
end
@@ -54,54 +60,6 @@ class ContainerExpirationPolicyWorker # rubocop:disable Scalability/IdempotentWo
.update_all(expiration_policy_cleanup_status: :cleanup_unfinished)
end
- def perform_unthrottled
- with_runnable_policy(preloaded: true) do |policy|
- with_context(project: policy.project,
- user: nil) do |project:, user:|
- ContainerExpirationPolicyService.new(project, user)
- .execute(policy)
- end
- end
- end
-
- def perform_throttled
- try_obtain_lease do
- ContainerExpirationPolicies::CleanupContainerRepositoryWorker.perform_with_capacity
- end
- end
-
- # TODO : remove the preload option when cleaning FF container_registry_expiration_policies_throttling
- def with_runnable_policy(preloaded: false)
- ContainerExpirationPolicy.runnable_schedules.each_batch(of: BATCH_SIZE) do |policies|
- # rubocop: disable CodeReuse/ActiveRecord
- cte = Gitlab::SQL::CTE.new(:batched_policies, policies.limit(BATCH_SIZE))
- # rubocop: enable CodeReuse/ActiveRecord
- scope = cte.apply_to(ContainerExpirationPolicy.all).with_container_repositories
-
- scope = scope.preloaded if preloaded
-
- scope.each do |policy|
- if policy.valid?
- yield policy
- else
- disable_invalid_policy!(policy)
- end
- end
- end
- end
-
- def disable_invalid_policy!(policy)
- policy.disable!
- Gitlab::ErrorTracking.log_exception(
- ::ContainerExpirationPolicyWorker::InvalidPolicyError.new,
- container_expiration_policy_id: policy.id
- )
- end
-
- def throttling_enabled?
- Feature.enabled?(:container_registry_expiration_policies_throttling, default_enabled: :yaml)
- end
-
def lease_timeout
5.hours
end
diff --git a/app/workers/container_registry/migration/enqueuer_worker.rb b/app/workers/container_registry/migration/enqueuer_worker.rb
index 8705deb0cb2..a0babb98e82 100644
--- a/app/workers/container_registry/migration/enqueuer_worker.rb
+++ b/app/workers/container_registry/migration/enqueuer_worker.rb
@@ -13,10 +13,37 @@ module ContainerRegistry
data_consistency :always
feature_category :container_registry
urgency :low
- deduplicate :until_executing, including_scheduled: true
+ deduplicate :until_executing, ttl: DEFAULT_LEASE_TIMEOUT
idempotent!
def perform
+ migration.enqueuer_loop? ? perform_with_loop : perform_without_loop
+ end
+
+ def self.enqueue_a_job
+ perform_async
+ perform_in(7.seconds) if ::ContainerRegistry::Migration.enqueue_twice?
+ end
+
+ private
+
+ def perform_with_loop
+ try_obtain_lease do
+ while runnable? && Time.zone.now < loop_deadline && migration.enqueuer_loop?
+ repository_handled = handle_aborted_migration || handle_next_migration
+
+ # no repository was found: stop the loop
+ break unless repository_handled
+
+ # we're going for another iteration so we need to clear memoization
+ clear_memoization(:next_repository)
+ clear_memoization(:next_aborted_repository)
+ clear_memoization(:last_step_completed_repository)
+ end
+ end
+ end
+
+ def perform_without_loop
re_enqueue = false
try_obtain_lease do
break unless runnable?
@@ -26,12 +53,10 @@ module ContainerRegistry
re_enqueue_if_capacity if re_enqueue
end
- private
-
def handle_aborted_migration
return unless next_aborted_repository
- log_extra_metadata_on_done(:import_type, 'retry')
+ log_on_done(:import_type, 'retry')
log_repository(next_aborted_repository)
next_aborted_repository.retry_aborted_migration
@@ -40,15 +65,16 @@ module ContainerRegistry
rescue StandardError => e
Gitlab::ErrorTracking.log_exception(e, next_aborted_repository_id: next_aborted_repository&.id)
- true
+ migration.enqueuer_loop? ? false : true
ensure
log_repository_migration_state(next_aborted_repository)
+ log_repository_info(next_aborted_repository, import_type: 'retry')
end
def handle_next_migration
return unless next_repository
- log_extra_metadata_on_done(:import_type, 'next')
+ log_on_done(:import_type, 'next')
log_repository(next_repository)
# We return true because the repository was successfully processed (migration_state is changed)
@@ -63,14 +89,16 @@ module ContainerRegistry
false
ensure
log_repository_migration_state(next_repository)
+ log_repository_info(next_repository, import_type: 'next')
end
def tag_count_too_high?
+ return false if migration.max_tags_count == 0
return false unless next_repository.tags_count > migration.max_tags_count
next_repository.skip_import(reason: :too_many_tags)
- log_extra_metadata_on_done(:tags_count_too_high, true)
- log_extra_metadata_on_done(:max_tags_count_setting, migration.max_tags_count)
+ log_on_done(:tags_count_too_high, true)
+ log_on_done(:max_tags_count_setting, migration.max_tags_count)
true
end
@@ -122,7 +150,11 @@ module ContainerRegistry
def next_repository
strong_memoize(:next_repository) do
- ContainerRepository.ready_for_import.take # rubocop:disable CodeReuse/ActiveRecord
+ # 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
+ # 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
end
end
@@ -145,18 +177,51 @@ module ContainerRegistry
def re_enqueue_if_capacity
return unless below_capacity?
- self.class.perform_async
+ self.class.enqueue_a_job
end
def log_repository(repository)
- log_extra_metadata_on_done(:container_repository_id, repository&.id)
- log_extra_metadata_on_done(:container_repository_path, repository&.path)
+ log_on_done(:container_repository_id, repository&.id)
+ log_on_done(:container_repository_path, repository&.path)
end
def log_repository_migration_state(repository)
return unless repository
- log_extra_metadata_on_done(:container_repository_migration_state, repository.migration_state)
+ log_on_done(:container_repository_migration_state, repository.migration_state)
+ end
+
+ def log_on_done(key, value)
+ return if migration.enqueuer_loop?
+
+ log_extra_metadata_on_done(key, value)
+ end
+
+ def log_info(extras)
+ logger.info(structured_payload(extras))
+ end
+
+ def log_repository_info(repository, extras = {})
+ return unless migration.enqueuer_loop?
+ return unless repository
+
+ repository_info = {
+ container_repository_id: repository.id,
+ container_repository_path: repository.path,
+ container_repository_migration_state: repository.migration_state
+ }
+
+ if repository.import_skipped?
+ repository_info[:container_repository_migration_skipped_reason] = repository.migration_skipped_reason
+ end
+
+ log_info(extras.merge(repository_info))
+ end
+
+ def loop_deadline
+ strong_memoize(:loop_deadline) do
+ 250.seconds.from_now
+ end
end
# used by ExclusiveLeaseGuard
diff --git a/app/workers/container_registry/migration/guard_worker.rb b/app/workers/container_registry/migration/guard_worker.rb
index bab6b8c2a72..1111061a89b 100644
--- a/app/workers/container_registry/migration/guard_worker.rb
+++ b/app/workers/container_registry/migration/guard_worker.rb
@@ -13,7 +13,7 @@ module ContainerRegistry
feature_category :container_registry
urgency :low
worker_resource_boundary :unknown
- deduplicate :until_executed
+ deduplicate :until_executed, ttl: 5.minutes
idempotent!
def perform
@@ -64,7 +64,17 @@ module ContainerRegistry
end
def long_running_migration?(repository)
- migration_start_timestamp(repository).before?(long_running_migration_threshold)
+ timeout = long_running_migration_threshold
+
+ if Feature.enabled?(:registry_migration_guard_thresholds)
+ timeout = if repository.migration_state == 'pre_importing'
+ migration.pre_import_timeout.seconds
+ else
+ migration.import_timeout.seconds
+ end
+ end
+
+ migration_start_timestamp(repository).before?(timeout.ago)
end
def external_state_matches_migration_state?(repository)
@@ -83,17 +93,21 @@ module ContainerRegistry
end
def step_before_timestamp
- ::ContainerRegistry::Migration.max_step_duration.seconds.ago
+ migration.max_step_duration.seconds.ago
end
def max_capacity
# doubling the actual capacity to prevent issues in case the capacity
# is not properly applied
- ::ContainerRegistry::Migration.capacity * 2
+ migration.capacity * 2
+ end
+
+ def migration
+ ::ContainerRegistry::Migration
end
def long_running_migration_threshold
- @threshold ||= 30.minutes.ago
+ @threshold ||= 10.minutes
end
def cancel_long_running_migration(repository)
@@ -101,7 +115,11 @@ module ContainerRegistry
case result[:status]
when :ok
- repository.skip_import(reason: :migration_canceled)
+ if repository.nearing_or_exceeded_retry_limit?
+ repository.skip_import(reason: :migration_canceled)
+ else
+ repository.abort_import
+ end
when :bad_request
repository.reconcile_import_status(result[:state]) do
repository.abort_import
diff --git a/app/workers/database/batched_background_migration/ci_database_worker.rb b/app/workers/database/batched_background_migration/ci_database_worker.rb
index 13314cf95e2..ee9cbba7076 100644
--- a/app/workers/database/batched_background_migration/ci_database_worker.rb
+++ b/app/workers/database/batched_background_migration/ci_database_worker.rb
@@ -5,7 +5,7 @@ module Database
include SingleDatabaseWorker
def self.enabled?
- Feature.enabled?(:execute_batched_migrations_on_schedule_ci_database, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:execute_batched_migrations_on_schedule_ci_database, type: :ops)
end
def self.tracking_database
diff --git a/app/workers/database/batched_background_migration_worker.rb b/app/workers/database/batched_background_migration_worker.rb
index 6a41fe70915..31208d7a473 100644
--- a/app/workers/database/batched_background_migration_worker.rb
+++ b/app/workers/database/batched_background_migration_worker.rb
@@ -5,7 +5,7 @@ module Database
include BatchedBackgroundMigration::SingleDatabaseWorker
def self.enabled?
- Feature.enabled?(:execute_batched_migrations_on_schedule, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:execute_batched_migrations_on_schedule, type: :ops)
end
def self.tracking_database
diff --git a/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb b/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb
index 2b4253947ac..b2174be1402 100644
--- a/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb
+++ b/app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb
@@ -13,7 +13,7 @@ module Database
version 1
def perform
- return if Feature.disabled?(:ci_namespace_mirrors_consistency_check, default_enabled: :yaml)
+ return if Feature.disabled?(:ci_namespace_mirrors_consistency_check)
results = ConsistencyCheckService.new(
source_model: Namespace,
@@ -22,6 +22,16 @@ module Database
target_columns: %w[namespace_id traversal_ids]
).execute
+ if results[:mismatches_details].any?
+ ConsistencyFixService.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ sync_event_class: Namespaces::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :namespace_id
+ ).execute(ids: results[:mismatches_details].map { |h| h[:id] })
+ end
+
log_extra_metadata_on_done(:results, results)
end
end
diff --git a/app/workers/database/ci_project_mirrors_consistency_check_worker.rb b/app/workers/database/ci_project_mirrors_consistency_check_worker.rb
index e9413256617..84052ab238b 100644
--- a/app/workers/database/ci_project_mirrors_consistency_check_worker.rb
+++ b/app/workers/database/ci_project_mirrors_consistency_check_worker.rb
@@ -13,7 +13,7 @@ module Database
version 1
def perform
- return if Feature.disabled?(:ci_project_mirrors_consistency_check, default_enabled: :yaml)
+ return if Feature.disabled?(:ci_project_mirrors_consistency_check)
results = ConsistencyCheckService.new(
source_model: Project,
@@ -22,6 +22,16 @@ module Database
target_columns: %w[project_id namespace_id]
).execute
+ if results[:mismatches_details].any?
+ ConsistencyFixService.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ ).execute(ids: results[:mismatches_details].map { |h| h[:id] })
+ end
+
log_extra_metadata_on_done(:results, results)
end
end
diff --git a/app/workers/deployments/hooks_worker.rb b/app/workers/deployments/hooks_worker.rb
index 31c57e5c001..608601b4eb9 100644
--- a/app/workers/deployments/hooks_worker.rb
+++ b/app/workers/deployments/hooks_worker.rb
@@ -13,6 +13,9 @@ module Deployments
params = params.with_indifferent_access
if (deploy = Deployment.find_by_id(params[:deployment_id]))
+ 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)
end
end
diff --git a/app/workers/expire_build_instance_artifacts_worker.rb b/app/workers/expire_build_instance_artifacts_worker.rb
deleted file mode 100644
index 948e1a59b07..00000000000
--- a/app/workers/expire_build_instance_artifacts_worker.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-class ExpireBuildInstanceArtifactsWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- data_consistency :always
-
- sidekiq_options retry: 3
-
- feature_category :build_artifacts
-
- def perform(build_id)
- # rubocop: disable CodeReuse/ActiveRecord
- build = Ci::Build
- .with_expired_artifacts
- .reorder(nil)
- .find_by_id(build_id)
- # rubocop: enable CodeReuse/ActiveRecord
-
- return unless build&.project && !build.project.pending_delete
-
- Gitlab::AppLogger.info("Removing artifacts for build #{build.id}...")
- build.erase_erasable_artifacts!
- 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 5188bda03e2..34996b710d4 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
@@ -36,7 +36,7 @@ module Gitlab
private
def diff_notes_importer(project)
- if project.group.present? && Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops, default_enabled: :yaml)
+ if project.group.present? && Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops)
Importer::SingleEndpointDiffNotesImporter
else
Importer::DiffNotesImporter
diff --git a/app/workers/gitlab/github_import/stage/import_notes_worker.rb b/app/workers/gitlab/github_import/stage/import_notes_worker.rb
index 90a1337169f..167b3e147a3 100644
--- a/app/workers/gitlab/github_import/stage/import_notes_worker.rb
+++ b/app/workers/gitlab/github_import/stage/import_notes_worker.rb
@@ -29,7 +29,7 @@ module Gitlab
end
def importers(project)
- if project.group.present? && Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops, default_enabled: :yaml)
+ if project.group.present? && Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops)
[
Importer::SingleEndpointMergeRequestNotesImporter,
Importer::SingleEndpointIssueNotesImporter
diff --git a/app/workers/merge_request_cleanup_refs_worker.rb b/app/workers/merge_request_cleanup_refs_worker.rb
index 27bd5774b8d..db6f4649f47 100644
--- a/app/workers/merge_request_cleanup_refs_worker.rb
+++ b/app/workers/merge_request_cleanup_refs_worker.rb
@@ -18,7 +18,7 @@ class MergeRequestCleanupRefsWorker
FAILURE_THRESHOLD = 3
def perform_work
- return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
+ return unless Feature.enabled?(:merge_request_refs_cleanup)
unless merge_request
logger.error('No existing merge request to be cleaned up.')
diff --git a/app/workers/merge_requests/close_issue_worker.rb b/app/workers/merge_requests/close_issue_worker.rb
new file mode 100644
index 00000000000..86d63e571ac
--- /dev/null
+++ b/app/workers/merge_requests/close_issue_worker.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module MergeRequests
+ class CloseIssueWorker
+ include ApplicationWorker
+
+ data_consistency :always
+ feature_category :code_review
+ urgency :low
+ idempotent!
+
+ # Issues:CloseService execute webhooks which are treated as external dependencies
+ worker_has_external_dependencies!
+
+ # This worker only accepts ID of an Issue. We are intentionally using this
+ # worker to close Issues asynchronously as we only experience SQL timeouts
+ # when closing an Issue.
+ def perform(project_id, user_id, issue_id, merge_request_id)
+ project = Project.find_by_id(project_id)
+
+ unless project
+ logger.info(structured_payload(message: 'Project not found.', project_id: project_id))
+ return
+ end
+
+ user = User.find_by_id(user_id)
+
+ unless user
+ logger.info(structured_payload(message: 'User not found.', user_id: user_id))
+ return
+ end
+
+ issue = Issue.find_by_id(issue_id)
+
+ unless issue
+ logger.info(structured_payload(message: 'Issue not found.', issue_id: issue_id))
+ return
+ end
+
+ merge_request = MergeRequest.find_by_id(merge_request_id)
+
+ unless merge_request
+ logger.info(structured_payload(message: 'Merge request not found.', merge_request_id: merge_request_id))
+ return
+ end
+
+ Issues::CloseService
+ .new(project: project, current_user: user)
+ .execute(issue, commit: merge_request)
+ end
+ end
+end
diff --git a/app/workers/packages/cleanup_package_file_worker.rb b/app/workers/packages/cleanup_package_file_worker.rb
index f188017ee7a..68a145920ca 100644
--- a/app/workers/packages/cleanup_package_file_worker.rb
+++ b/app/workers/packages/cleanup_package_file_worker.rb
@@ -32,7 +32,7 @@ module Packages
end
def next_item
- model.next_pending_destruction
+ model.next_pending_destruction(order_by: :id)
end
def log_metadata(package_file)
diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb
index 6d809dfb22b..f73958a6ef9 100644
--- a/app/workers/project_service_worker.rb
+++ b/app/workers/project_service_worker.rb
@@ -13,10 +13,13 @@ class ProjectServiceWorker # rubocop:disable Scalability/IdempotentWorker
def perform(hook_id, data)
data = data.with_indifferent_access
- integration = Integration.find(hook_id)
- integration.execute(data)
- rescue StandardError => error
- integration_class = integration&.class&.name || "Not Found"
- Gitlab::ErrorTracking.log_exception(error, integration_class: integration_class)
+ integration = Integration.find_by_id(hook_id)
+ return unless integration
+
+ begin
+ integration.execute(data)
+ rescue StandardError => error
+ integration.log_exception(error)
+ end
end
end
diff --git a/app/workers/projects/after_import_worker.rb b/app/workers/projects/after_import_worker.rb
new file mode 100644
index 00000000000..06211b2d991
--- /dev/null
+++ b/app/workers/projects/after_import_worker.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Projects
+ class AfterImportWorker
+ include ApplicationWorker
+
+ RESERVED_REF_PREFIXES = Repository::RESERVED_REFS_NAMES.map { |n| File.join('refs', n, '/') }
+
+ data_consistency :always
+ idempotent!
+ urgency :low
+ feature_category :importers
+
+ def perform(project_id)
+ @project = Project.find(project_id)
+
+ service = Repositories::HousekeepingService.new(@project)
+
+ service.execute do
+ import_failure_service.with_retry(action: 'delete_all_refs') do
+ repository.delete_all_refs_except(RESERVED_REF_PREFIXES)
+ end
+ end
+
+ # Right now we don't actually have a way to know if a project
+ # import actually changed, so we increment the counter to avoid
+ # causing GC to run every time.
+ service.increment!
+ rescue Repositories::HousekeepingService::LeaseTaken => e
+ Gitlab::Import::Logger.info(
+ message: 'Project housekeeping failed',
+ project_full_path: @project.full_path,
+ project_id: @project.id,
+ 'error.message' => e.message
+ )
+ end
+
+ private
+
+ def import_failure_service
+ Gitlab::ImportExport::ImportFailureService.new(@project)
+ end
+
+ def repository
+ @project.repository
+ end
+ end
+end
diff --git a/app/workers/projects/git_garbage_collect_worker.rb b/app/workers/projects/git_garbage_collect_worker.rb
index a70c52abde2..9ac3953e83c 100644
--- a/app/workers/projects/git_garbage_collect_worker.rb
+++ b/app/workers/projects/git_garbage_collect_worker.rb
@@ -44,8 +44,12 @@ module Projects
end
override :update_db_repository_statistics
- def update_db_repository_statistics(resource)
- Projects::UpdateStatisticsService.new(resource, nil, statistics: [:repository_size, :lfs_objects_size]).execute
+ def update_db_repository_statistics(resource, stats)
+ Projects::UpdateStatisticsService.new(resource, nil, statistics: stats).execute
+ end
+
+ def stats
+ [:repository_size, :lfs_objects_size]
end
end
end
diff --git a/app/workers/projects/inactive_projects_deletion_cron_worker.rb b/app/workers/projects/inactive_projects_deletion_cron_worker.rb
new file mode 100644
index 00000000000..2c3f4191502
--- /dev/null
+++ b/app/workers/projects/inactive_projects_deletion_cron_worker.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+module Projects
+ class InactiveProjectsDeletionCronWorker
+ include ApplicationWorker
+ include Gitlab::Utils::StrongMemoize
+ include CronjobQueue
+
+ idempotent!
+ data_consistency :always
+ feature_category :compliance_management
+
+ INTERVAL = 2.seconds.to_i
+
+ def perform
+ return unless ::Gitlab::CurrentSettings.delete_inactive_projects?
+
+ admin_user = User.admins.active.first
+
+ return unless admin_user
+
+ notified_inactive_projects = Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects
+
+ Project.inactive.without_deleted.find_each(batch_size: 100).with_index do |project, index| # rubocop: disable CodeReuse/ActiveRecord
+ next unless Feature.enabled?(:inactive_projects_deletion, project.root_namespace)
+
+ delay = index * INTERVAL
+
+ with_context(project: project, user: admin_user) do
+ deletion_warning_email_sent_on = notified_inactive_projects["project:#{project.id}"]
+
+ if send_deletion_warning_email?(deletion_warning_email_sent_on, project)
+ send_notification(delay, project, admin_user)
+ elsif deletion_warning_email_sent_on && delete_due_to_inactivity?(deletion_warning_email_sent_on)
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project.id).reset
+ delete_project(project, admin_user)
+ end
+ end
+ end
+ end
+
+ private
+
+ def grace_months_after_deletion_notification
+ strong_memoize(:grace_months_after_deletion_notification) do
+ (::Gitlab::CurrentSettings.inactive_projects_delete_after_months -
+ ::Gitlab::CurrentSettings.inactive_projects_send_warning_email_after_months).months
+ end
+ end
+
+ def send_deletion_warning_email?(deletion_warning_email_sent_on, project)
+ deletion_warning_email_sent_on.blank?
+ end
+
+ def delete_due_to_inactivity?(deletion_warning_email_sent_on)
+ deletion_warning_email_sent_on < grace_months_after_deletion_notification.ago
+ end
+
+ def deletion_date
+ grace_months_after_deletion_notification.from_now.to_date.to_s
+ end
+
+ def delete_project(project, user)
+ ::Projects::DestroyService.new(project, user, {}).async_execute
+ end
+
+ def send_notification(delay, project, user)
+ ::Projects::InactiveProjectsDeletionNotificationWorker.perform_in(delay, project.id, deletion_date)
+ end
+ end
+end
+
+Projects::InactiveProjectsDeletionCronWorker.prepend_mod
diff --git a/app/workers/projects/inactive_projects_deletion_notification_worker.rb b/app/workers/projects/inactive_projects_deletion_notification_worker.rb
new file mode 100644
index 00000000000..0bf808fd753
--- /dev/null
+++ b/app/workers/projects/inactive_projects_deletion_notification_worker.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+module Projects
+ class InactiveProjectsDeletionNotificationWorker
+ include ApplicationWorker
+ include ExceptionBacktrace
+
+ idempotent!
+ data_consistency :sticky
+ sidekiq_options retry: 3
+ feature_category :compliance_management
+
+ def perform(project_id, deletion_date)
+ return if Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?
+
+ project = Project.find(project_id)
+
+ notification_service.inactive_project_deletion_warning(project, deletion_date)
+
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ rescue ActiveRecord::RecordNotFound => error
+ Gitlab::ErrorTracking.log_exception(error, project_id: project_id)
+ end
+
+ private
+
+ def notification_service
+ @notification_service ||= NotificationService.new
+ end
+ end
+end
diff --git a/app/workers/projects/record_target_platforms_worker.rb b/app/workers/projects/record_target_platforms_worker.rb
index 5b1f85ecca0..899721492e9 100644
--- a/app/workers/projects/record_target_platforms_worker.rb
+++ b/app/workers/projects/record_target_platforms_worker.rb
@@ -7,6 +7,7 @@ module Projects
LEASE_TIMEOUT = 1.hour.to_i
APPLE_PLATFORM_LANGUAGES = %w(swift objective-c).freeze
+ ANDROID_PLATFORM_LANGUAGES = %w(java kotlin).freeze
feature_category :experimentation_activation
data_consistency :always
@@ -18,10 +19,10 @@ module Projects
@project = Project.find_by_id(project_id)
return unless project
- return unless uses_apple_platform_languages?
+ return unless detector_service
try_obtain_lease do
- @target_platforms = Projects::RecordTargetPlatformsService.new(project).execute
+ @target_platforms = Projects::RecordTargetPlatformsService.new(project, detector_service).execute
log_target_platforms_metadata
end
end
@@ -30,8 +31,29 @@ module Projects
attr_reader :target_platforms, :project
+ def detector_service
+ if uses_apple_platform_languages?
+ AppleTargetPlatformDetectorService
+ elsif uses_android_platform_languages? && detect_android_projects_enabled?
+ AndroidTargetPlatformDetectorService
+ end
+ end
+
+ def detect_android_projects_enabled?
+ Feature.enabled?(:detect_android_projects, project)
+ end
+
def uses_apple_platform_languages?
- project.repository_languages.with_programming_language(*APPLE_PLATFORM_LANGUAGES).present?
+ target_languages.with_programming_language(*APPLE_PLATFORM_LANGUAGES).present?
+ end
+
+ def uses_android_platform_languages?
+ target_languages.with_programming_language(*ANDROID_PLATFORM_LANGUAGES).present?
+ end
+
+ def target_languages
+ languages = APPLE_PLATFORM_LANGUAGES + ANDROID_PLATFORM_LANGUAGES
+ @target_languages ||= project.repository_languages.with_programming_language(*languages)
end
def log_target_platforms_metadata
diff --git a/app/workers/prometheus/create_default_alerts_worker.rb b/app/workers/prometheus/create_default_alerts_worker.rb
index 94ac02c4c04..1a0fe7e8d56 100644
--- a/app/workers/prometheus/create_default_alerts_worker.rb
+++ b/app/workers/prometheus/create_default_alerts_worker.rb
@@ -13,19 +13,7 @@ module Prometheus
idempotent!
def perform(project_id)
- project = Project.find_by_id(project_id)
-
- return unless project
-
- result = ::Prometheus::CreateDefaultAlertsService.new(project: project).execute
-
- log_info(result.message) if result.error?
- end
-
- private
-
- def log_info(message)
- logger.info(structured_payload(message: message))
+ # No-op Will be removed in https://gitlab.com/gitlab-org/gitlab/-/issues/360756
end
end
end
diff --git a/app/workers/requests_profiles_worker.rb b/app/workers/requests_profiles_worker.rb
deleted file mode 100644
index e02b63fb621..00000000000
--- a/app/workers/requests_profiles_worker.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-class RequestsProfilesWorker # rubocop:disable Scalability/IdempotentWorker
- include ApplicationWorker
-
- data_consistency :always
-
- # rubocop:disable Scalability/CronWorkerContext
- # This worker does not perform work scoped to a context
- include CronjobQueue
- # rubocop:enable Scalability/CronWorkerContext
-
- feature_category :source_code_management
-
- def perform
- Gitlab::RequestProfiler.remove_all_profiles
- end
-end
diff --git a/app/workers/schedule_merge_request_cleanup_refs_worker.rb b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
index 58cd8f7ade3..b3d0067471a 100644
--- a/app/workers/schedule_merge_request_cleanup_refs_worker.rb
+++ b/app/workers/schedule_merge_request_cleanup_refs_worker.rb
@@ -12,7 +12,7 @@ class ScheduleMergeRequestCleanupRefsWorker
def perform
return if Gitlab::Database.read_only?
- return unless Feature.enabled?(:merge_request_refs_cleanup, default_enabled: false)
+ return unless Feature.enabled?(:merge_request_refs_cleanup)
MergeRequestCleanupRefsWorker.perform_with_capacity
end
diff --git a/app/workers/web_hooks/destroy_worker.rb b/app/workers/web_hooks/destroy_worker.rb
index f457cd11e54..822a1e770d7 100644
--- a/app/workers/web_hooks/destroy_worker.rb
+++ b/app/workers/web_hooks/destroy_worker.rb
@@ -7,7 +7,7 @@ module WebHooks
data_consistency :always
sidekiq_options retry: 3
feature_category :integrations
- urgency :low
+ urgency :high
idempotent!
diff --git a/app/workers/wikis/git_garbage_collect_worker.rb b/app/workers/wikis/git_garbage_collect_worker.rb
index b00190c6b98..977493834c9 100644
--- a/app/workers/wikis/git_garbage_collect_worker.rb
+++ b/app/workers/wikis/git_garbage_collect_worker.rb
@@ -19,8 +19,12 @@ module Wikis
end
override :update_db_repository_statistics
- def update_db_repository_statistics(resource)
- Projects::UpdateStatisticsService.new(resource.container, nil, statistics: [:wiki_size]).execute
+ def update_db_repository_statistics(resource, stats)
+ Projects::UpdateStatisticsService.new(resource.container, nil, statistics: stats).execute
+ end
+
+ def stats
+ [:wiki_size]
end
end
end
diff --git a/config/application.rb b/config/application.rb
index aa1a0b26d60..8a40aaa8bd6 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -72,7 +72,7 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/patch/database_config')
require_dependency Rails.root.join('lib/gitlab/exceptions_app')
- config.exceptions_app = Gitlab::ExceptionsApp.new(Rails.public_path)
+ config.exceptions_app = Gitlab::ExceptionsApp.new(Gitlab.jh? ? Rails.root.join('jh/public') : Rails.public_path)
# This preload is required to:
#
@@ -141,6 +141,9 @@ module Gitlab
Gitlab.ee { config.autoload_paths.push("#{config.root}/ee/lib/generators") }
Gitlab.jh { config.autoload_paths.push("#{config.root}/jh/lib/generators") }
+ # Add JH initializer into rails initializers path
+ Gitlab.jh { config.paths["config/initializers"] << "#{config.root}/jh/config/initializers" }
+
# Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named.
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
@@ -272,6 +275,7 @@ module Gitlab
config.assets.precompile << "page_bundles/import.css"
config.assets.precompile << "page_bundles/incident_management_list.css"
config.assets.precompile << "page_bundles/issues_list.css"
+ config.assets.precompile << "page_bundles/issues_show.css"
config.assets.precompile << "page_bundles/jira_connect.css"
config.assets.precompile << "page_bundles/jira_connect_users.css"
config.assets.precompile << "page_bundles/learn_gitlab.css"
@@ -286,6 +290,7 @@ module Gitlab
config.assets.precompile << "page_bundles/pipeline.css"
config.assets.precompile << "page_bundles/pipeline_schedules.css"
config.assets.precompile << "page_bundles/pipelines.css"
+ config.assets.precompile << "page_bundles/pipeline_editor.css"
config.assets.precompile << "page_bundles/productivity_analytics.css"
config.assets.precompile << "page_bundles/profile_two_factor_auth.css"
config.assets.precompile << "page_bundles/project.css"
@@ -486,19 +491,17 @@ module Gitlab
end
end
- # Load JH initializers under JH. Load ordering is:
- # 1. prepend_helpers_path
- # 2. before_zeitwerk
- # 3. let_zeitwerk_take_over
- # 4. move_initializers
- # 5. load_config_initializers
- # 6. load_jh_config_initializers
- Gitlab.jh do
- initializer :load_jh_config_initializers, after: :load_config_initializers do
- Dir[Rails.root.join('jh/config/initializers/*.rb')].sort.each do |initializer|
- load_config_initializer(initializer)
- 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.
@@ -509,7 +512,7 @@ module Gitlab
# app/assets/stylesheets/example.scss
#
# The jh/ version will be preferred.
- initializer :prefer_specialized_assets, after: :append_assets_path do |app|
+ initializer :prefer_specialized_assets, after: :append_assets_path, before: :build_middleware_stack do |app|
Gitlab.extensions.each do |extension|
%w[images javascripts stylesheets].each do |path|
app.config.assets.paths.unshift("#{config.root}/#{extension}/app/assets/#{path}")
@@ -521,8 +524,10 @@ module Gitlab
# because we connect to database from routes
# https://github.com/rails/rails/blob/fdf840f69a2e33d78a9d40b91d9b7fddb76711e9/activerecord/lib/active_record/railtie.rb#L308
initializer :clear_active_connections_again, after: :set_routes_reloader_hook do
+ # rubocop:disable Database/MultipleDatabases
ActiveRecord::Base.clear_active_connections!
ActiveRecord::Base.flush_idle_connections!
+ # rubocop:enable Database/MultipleDatabases
end
# DO NOT PLACE ANY INITIALIZERS AFTER THIS.
diff --git a/config/database.yml.env b/config/database.yml.env
deleted file mode 100644
index 1e35651c9a6..00000000000
--- a/config/database.yml.env
+++ /dev/null
@@ -1,17 +0,0 @@
-<%= ENV['RAILS_ENV'] %>:
- ## Connection information
- # Please be aware that the DATABASE_URL environment variable will take
- # precedence over the following 6 parameters. For more information, see
- # doc/administration/environment_variables.md
- adapter: <%= ENV['GITLAB_DATABASE_ADAPTER'] || 'postgresql' %>
- database: <%= ENV['GITLAB_DATABASE_DATABASE'] || "gitlab_#{ENV['RAILS_ENV']}" %>
- username: <%= ENV['GITLAB_DATABASE_USERNAME'] || 'root' %>
- password: <%= ENV['GITLAB_DATABASE_PASSWORD'] || '' %>
- host: <%= ENV['GITLAB_DATABASE_HOST'] || 'localhost' %>
- port: <%= ENV['GITLAB_DATABASE_PORT'] || '5432' %>
-
- ## Behavior information
- # The following parameters will be used even if you're using the DATABASE_URL
- # environment variable.
- encoding: <%= ENV['GITLAB_DATABASE_ENCODING'] || 'unicode' %>
- pool: <%= ENV['GITLAB_DATABASE_POOL'] || '10' %>
diff --git a/config/events/1651052988_gitlab__usage_data_counters__ci_template_unique_counter_ci_templates_unique.yml b/config/events/1651052988_gitlab__usage_data_counters__ci_template_unique_counter_ci_templates_unique.yml
new file mode 100644
index 00000000000..47234c07f59
--- /dev/null
+++ b/config/events/1651052988_gitlab__usage_data_counters__ci_template_unique_counter_ci_templates_unique.yml
@@ -0,0 +1,23 @@
+---
+description: Run Pipeline
+category: Gitlab::UsageDataCounters::CiTemplateUniqueCounter
+action: ci_templates_unique
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: ops
+product_stage: configure
+product_group: group::configure
+product_category: infrastructure_as_code
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84337
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/events/1651053267_event_create_service_action_active_users_project_repo.yml b/config/events/1651053267_event_create_service_action_active_users_project_repo.yml
new file mode 100644
index 00000000000..bab5dd9e7b3
--- /dev/null
+++ b/config/events/1651053267_event_create_service_action_active_users_project_repo.yml
@@ -0,0 +1,23 @@
+---
+description: Perform Git operation (read/write/push)
+category: EventCreateService
+action: action_active_users_project_repo
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: dev
+product_stage: create
+product_group: group::source code
+product_category: source_code_management
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83795
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
+
diff --git a/config/events/1651580551_groups_controller_show_render.yml b/config/events/1651580551_groups_controller_show_render.yml
new file mode 100644
index 00000000000..60b078c5ba5
--- /dev/null
+++ b/config/events/1651580551_groups_controller_show_render.yml
@@ -0,0 +1,21 @@
+description: Render event to understand if users view this page more on average
+category: group_overview
+action: show
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: growth
+product_stage:
+product_group: group::conversion
+product_category:
+milestone: "15.0"
+introduced_by_url:
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/events/1651581659_projects_controller_show_render.yml b/config/events/1651581659_projects_controller_show_render.yml
new file mode 100644
index 00000000000..411d02ae77d
--- /dev/null
+++ b/config/events/1651581659_projects_controller_show_render.yml
@@ -0,0 +1,21 @@
+description: Render event to understand if users view this page more on average
+category: project_overview
+action: show
+label_description:
+property_description:
+value_description:
+extra_properties:
+identifiers:
+product_section: growth
+product_stage:
+product_group: group::conversion
+product_category:
+milestone: "15.0"
+introduced_by_url:
+distributions:
+- ce
+- ee
+tiers:
+- free
+- premium
+- ultimate
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index c991d3e3720..473cf240864 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -24,16 +24,16 @@
- code_review
- code_testing
- compliance_management
-- container_host_security
-- container_network_security
- container_registry
- container_scanning
- continuous_delivery
- continuous_integration
- continuous_integration_scaling
- continuous_verification
+- credential_management
- database
- dataops
+- dedicated
- delivery
- dependency_firewall
- dependency_proxy
@@ -54,6 +54,7 @@
- experimentation_expansion
- feature_flags
- five_minute_production_app
+- fulfillment_platform
- fuzz_testing
- geo_replication
- git_lfs
@@ -61,7 +62,6 @@
- gitlab_docs
- global_search
- helm_chart_registry
-- horse
- importers
- incident_management
- infrastructure_as_code
@@ -87,6 +87,7 @@
- package_registry
- pages
- performance_testing
+- permissions
- pipeline_authoring
- planning_analytics
- portfolio_management
@@ -99,6 +100,7 @@
- redis
- release_evidence
- release_orchestration
+- remote_development
- requirements_management
- review_apps
- runbooks
@@ -118,8 +120,10 @@
- static_application_security_testing
- static_site_editor
- subgroups
+- system_access
- team_planning
- tracing
+- user_management
- users
- utilization
- value_stream_management
diff --git a/config/feature_flags/development/async_mr_close_issue.yml b/config/feature_flags/development/async_mr_close_issue.yml
new file mode 100644
index 00000000000..84db0a57fd6
--- /dev/null
+++ b/config/feature_flags/development/async_mr_close_issue.yml
@@ -0,0 +1,8 @@
+---
+name: async_mr_close_issue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86328
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361320
+milestone: '15.0'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/automated_email_provision.yml b/config/feature_flags/development/automated_email_provision.yml
index 2b3fee208ab..2734413dd8f 100644
--- a/config/feature_flags/development/automated_email_provision.yml
+++ b/config/feature_flags/development/automated_email_provision.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348317
milestone: '14.6'
type: development
group: group::license
-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
new file mode 100644
index 00000000000..49fb1a7f605
--- /dev/null
+++ b/config/feature_flags/development/blame_page_pagination.yml
@@ -0,0 +1,8 @@
+---
+name: blame_page_pagination
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85827
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360927
+milestone: '15.0'
+type: development
+group: group::source code
+default_enabled: false
diff --git a/config/feature_flags/development/ci_expand_environment_name_and_url.yml b/config/feature_flags/development/ci_expand_environment_name_and_url.yml
index 58626cdfc46..beb7065cf53 100644
--- a/config/feature_flags/development/ci_expand_environment_name_and_url.yml
+++ b/config/feature_flags/development/ci_expand_environment_name_and_url.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358831
milestone: '14.10'
type: development
group: group::pipeline authoring
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_fix_rules_if_comparison_with_regexp_variable.yml b/config/feature_flags/development/ci_fix_rules_if_comparison_with_regexp_variable.yml
new file mode 100644
index 00000000000..be21707d376
--- /dev/null
+++ b/config/feature_flags/development/ci_fix_rules_if_comparison_with_regexp_variable.yml
@@ -0,0 +1,8 @@
+---
+name: ci_fix_rules_if_comparison_with_regexp_variable
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85310
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359740
+milestone: '15.0'
+type: development
+group: group::pipeline authoring
+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
new file mode 100644
index 00000000000..24932e0cfe4
--- /dev/null
+++ b/config/feature_flags/development/ci_minutes_cost_factor_for_all_public_projects.yml
@@ -0,0 +1,8 @@
+---
+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_namespace_mirrors_consistency_check.yml b/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml
index 965fb904a15..6d4e50c2753 100644
--- a/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml
+++ b/config/feature_flags/development/ci_namespace_mirrors_consistency_check.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356577
milestone: '14.10'
type: development
group: group::sharding
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_pending_builds_table_resiliency.yml b/config/feature_flags/development/ci_pending_builds_table_resiliency.yml
deleted file mode 100644
index 2e53bf2c9a1..00000000000
--- a/config/feature_flags/development/ci_pending_builds_table_resiliency.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_pending_builds_table_resiliency
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84359
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357988
-milestone: '14.10'
-type: development
-group: group::pipeline execution
-default_enabled: true
diff --git a/config/feature_flags/development/ci_project_mirrors_consistency_check.yml b/config/feature_flags/development/ci_project_mirrors_consistency_check.yml
index 9ba2865216d..5fc88ef9bfb 100644
--- a/config/feature_flags/development/ci_project_mirrors_consistency_check.yml
+++ b/config/feature_flags/development/ci_project_mirrors_consistency_check.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356583
milestone: '14.10'
type: development
group: group::sharding
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/ci_recreate_downstream_pipeline.yml b/config/feature_flags/development/ci_recreate_downstream_pipeline.yml
new file mode 100644
index 00000000000..17b8a0965fc
--- /dev/null
+++ b/config/feature_flags/development/ci_recreate_downstream_pipeline.yml
@@ -0,0 +1,8 @@
+---
+name: ci_recreate_downstream_pipeline
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83613
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358409
+milestone: '14.10'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/ci_variables_builder_config_variables.yml b/config/feature_flags/development/ci_variables_builder_config_variables.yml
deleted file mode 100644
index eb74993f90f..00000000000
--- a/config/feature_flags/development/ci_variables_builder_config_variables.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ci_variables_builder_config_variables
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79935
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358791
-milestone: '14.10'
-type: development
-group: group::pipeline execution
-default_enabled: false
diff --git a/config/feature_flags/development/confidential_notes.yml b/config/feature_flags/development/confidential_notes.yml
index 4e9add5eb3c..8c7197d2ef9 100644
--- a/config/feature_flags/development/confidential_notes.yml
+++ b/config/feature_flags/development/confidential_notes.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/207474
milestone: '13.9'
type: development
group: group::product planning
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/contacts_autocomplete.yml b/config/feature_flags/development/contacts_autocomplete.yml
index 9d6960f6713..2b0908e7343 100644
--- a/config/feature_flags/development/contacts_autocomplete.yml
+++ b/config/feature_flags/development/contacts_autocomplete.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352123
milestone: '14.8'
type: development
group: group::product planning
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/container_registry_expiration_policies_throttling.yml b/config/feature_flags/development/container_registry_expiration_policies_throttling.yml
deleted file mode 100644
index e22c7c3177b..00000000000
--- a/config/feature_flags/development/container_registry_expiration_policies_throttling.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: container_registry_expiration_policies_throttling
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36319
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/238190
-milestone: '13.4'
-type: development
-group: group::package
-default_enabled: true
diff --git a/config/feature_flags/development/container_registry_follow_redirects_middleware.yml b/config/feature_flags/development/container_registry_follow_redirects_middleware.yml
deleted file mode 100644
index 6b0ded9dbc4..00000000000
--- a/config/feature_flags/development/container_registry_follow_redirects_middleware.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: container_registry_follow_redirects_middleware
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81056
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353291
-milestone: '14.9'
-type: development
-group: group::package
-default_enabled: true
diff --git a/config/feature_flags/development/container_registry_migration_phase2_capacity_2.yml b/config/feature_flags/development/container_registry_migration_phase2_capacity_2.yml
new file mode 100644
index 00000000000..11e66a5531e
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase2_capacity_2.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase2_capacity_2
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85277
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '14.10'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase2_capacity_5.yml b/config/feature_flags/development/container_registry_migration_phase2_capacity_5.yml
new file mode 100644
index 00000000000..544354f1b84
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase2_capacity_5.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase2_capacity_5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85908
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '15.0'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase2_enqueue_twice.yml b/config/feature_flags/development/container_registry_migration_phase2_enqueue_twice.yml
new file mode 100644
index 00000000000..83ae4e8c761
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase2_enqueue_twice.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase2_enqueue_twice
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86596
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '15.0'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_migration_phase2_enqueuer_loop.yml b/config/feature_flags/development/container_registry_migration_phase2_enqueuer_loop.yml
new file mode 100644
index 00000000000..abd14090007
--- /dev/null
+++ b/config/feature_flags/development/container_registry_migration_phase2_enqueuer_loop.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_migration_phase2_enqueuer_loop
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87168
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '15.0'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/container_registry_project_statistics.yml b/config/feature_flags/development/container_registry_project_statistics.yml
new file mode 100644
index 00000000000..e17fb8406b3
--- /dev/null
+++ b/config/feature_flags/development/container_registry_project_statistics.yml
@@ -0,0 +1,8 @@
+---
+name: container_registry_project_statistics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84923
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359852
+milestone: '15.0'
+type: development
+group: group::utilization
+default_enabled: false
diff --git a/config/feature_flags/development/create_project_settings.yml b/config/feature_flags/development/create_project_settings.yml
deleted file mode 100644
index 8c536d1f3fa..00000000000
--- a/config/feature_flags/development/create_project_settings.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: create_project_settings
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84502
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358136
-milestone: '14.10'
-type: development
-group: group::authentication and authorization
-default_enabled: false
diff --git a/config/feature_flags/development/customer_relations.yml b/config/feature_flags/development/customer_relations.yml
index 58783708921..d68e299758a 100644
--- a/config/feature_flags/development/customer_relations.yml
+++ b/config/feature_flags/development/customer_relations.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346082
milestone: '14.3'
type: development
group: group::product planning
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/delayed_project_import_schedule_worker.yml b/config/feature_flags/development/delayed_project_import_schedule_worker.yml
new file mode 100644
index 00000000000..cdf42fbb8ec
--- /dev/null
+++ b/config/feature_flags/development/delayed_project_import_schedule_worker.yml
@@ -0,0 +1,8 @@
+---
+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/dependency_proxy_for_private_groups.yml b/config/feature_flags/development/dependency_proxy_for_private_groups.yml
deleted file mode 100644
index 0bc795ba02e..00000000000
--- a/config/feature_flags/development/dependency_proxy_for_private_groups.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: dependency_proxy_for_private_groups
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46042
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/276777
-milestone: '13.7'
-type: development
-group: group::package
-default_enabled: true
diff --git a/config/feature_flags/development/deployment_approval_rules.yml b/config/feature_flags/development/deployment_approval_rules.yml
deleted file mode 100644
index 1658f9c4fe0..00000000000
--- a/config/feature_flags/development/deployment_approval_rules.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: deployment_approval_rules
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83495
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354726
-milestone: '14.10'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/detect_android_projects.yml b/config/feature_flags/development/detect_android_projects.yml
new file mode 100644
index 00000000000..4270cbdff7c
--- /dev/null
+++ b/config/feature_flags/development/detect_android_projects.yml
@@ -0,0 +1,8 @@
+---
+name: detect_android_projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85681
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360902
+milestone: '15.0'
+type: development
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/development/distribute_github_parallel_import.yml b/config/feature_flags/development/distribute_github_parallel_import.yml
deleted file mode 100644
index e7f9ac78afb..00000000000
--- a/config/feature_flags/development/distribute_github_parallel_import.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: distribute_github_parallel_import
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83616
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356800
-milestone: '14.10'
-type: development
-group: group::source code
-default_enabled: false
diff --git a/config/feature_flags/development/downstream_retry_action.yml b/config/feature_flags/development/downstream_retry_action.yml
new file mode 100644
index 00000000000..7031c7565ce
--- /dev/null
+++ b/config/feature_flags/development/downstream_retry_action.yml
@@ -0,0 +1,8 @@
+---
+name: downstream_retry_action
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83751
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357406
+milestone: '15.0'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/enforce_security_report_validation.yml b/config/feature_flags/development/enforce_security_report_validation.yml
index 0478033c55b..2a8d3e32ec4 100644
--- a/config/feature_flags/development/enforce_security_report_validation.yml
+++ b/config/feature_flags/development/enforce_security_report_validation.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351000
milestone: '14.9'
type: development
group: group::threat insights
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/enhanced_notify_css.yml b/config/feature_flags/development/enhanced_notify_css.yml
index 010b80caf5d..c17da36c7ed 100644
--- a/config/feature_flags/development/enhanced_notify_css.yml
+++ b/config/feature_flags/development/enhanced_notify_css.yml
@@ -2,7 +2,7 @@
name: enhanced_notify_css
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78604
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355907
-milestone: '14.8'
+milestone: '14.9'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/env_last_deployment_by_finished_at.yml b/config/feature_flags/development/env_last_deployment_by_finished_at.yml
deleted file mode 100644
index 36163b167d0..00000000000
--- a/config/feature_flags/development/env_last_deployment_by_finished_at.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: env_last_deployment_by_finished_at
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83558
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357299
-milestone: '14.10'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/environment_multiple_stop_actions.yml b/config/feature_flags/development/environment_multiple_stop_actions.yml
deleted file mode 100644
index 514d5e8cf52..00000000000
--- a/config/feature_flags/development/environment_multiple_stop_actions.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: environment_multiple_stop_actions
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84922
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358911
-milestone: '14.10'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/failed_jobs_tab_vue.yml b/config/feature_flags/development/failed_jobs_tab_vue.yml
new file mode 100644
index 00000000000..1c70bd5b418
--- /dev/null
+++ b/config/feature_flags/development/failed_jobs_tab_vue.yml
@@ -0,0 +1,8 @@
+---
+name: failed_jobs_tab_vue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86151
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360849
+milestone: '15.0'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/filter_quarantined_commits.yml b/config/feature_flags/development/filter_quarantined_commits.yml
new file mode 100644
index 00000000000..2c18e83d947
--- /dev/null
+++ b/config/feature_flags/development/filter_quarantined_commits.yml
@@ -0,0 +1,8 @@
+---
+name: filter_quarantined_commits
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86440
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361174
+milestone: '15.0'
+type: development
+group: group::gitaly
+default_enabled: true
diff --git a/config/feature_flags/development/fix_related_environments_for_merge_requests.yml b/config/feature_flags/development/fix_related_environments_for_merge_requests.yml
deleted file mode 100644
index d958f1d4de0..00000000000
--- a/config/feature_flags/development/fix_related_environments_for_merge_requests.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: fix_related_environments_for_merge_requests
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83382
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356642
-milestone: '14.10'
-type: development
-group: group::release
-default_enabled: true
diff --git a/config/feature_flags/development/geo_use_clone_on_first_sync.yml b/config/feature_flags/development/geo_use_clone_on_first_sync.yml
index 6eb41ee2f56..ae9dcf9a7bb 100644
--- a/config/feature_flags/development/geo_use_clone_on_first_sync.yml
+++ b/config/feature_flags/development/geo_use_clone_on_first_sync.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357462
milestone: '14.10'
type: development
group: group::geo
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/gitaly_enforce_requests_limits.yml b/config/feature_flags/development/gitaly_enforce_requests_limits.yml
deleted file mode 100644
index cacfd87f203..00000000000
--- a/config/feature_flags/development/gitaly_enforce_requests_limits.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_enforce_requests_limits
-introduced_by_url:
-rollout_issue_url:
-milestone:
-type: development
-group:
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_go_user_merge_branch.yml b/config/feature_flags/development/gitaly_go_user_merge_branch.yml
deleted file mode 100644
index 3804a3f56b5..00000000000
--- a/config/feature_flags/development/gitaly_go_user_merge_branch.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_go_user_merge_branch
-introduced_by_url:
-rollout_issue_url:
-milestone:
-type: development
-group:
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_mep_mep.yml b/config/feature_flags/development/gitaly_mep_mep.yml
deleted file mode 100644
index 75cac13fe83..00000000000
--- a/config/feature_flags/development/gitaly_mep_mep.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_mep_mep
-introduced_by_url:
-rollout_issue_url:
-milestone:
-type: development
-group:
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_pack_objects_hook_with_sidechannel.yml b/config/feature_flags/development/gitaly_pack_objects_hook_with_sidechannel.yml
deleted file mode 100644
index 14cebc656c1..00000000000
--- a/config/feature_flags/development/gitaly_pack_objects_hook_with_sidechannel.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_pack_objects_hook_with_sidechannel
-introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3758
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1187
-milestone: '14.3'
-type: development
-group: 'team::Scalability'
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_replace_wiki_update_page.yml b/config/feature_flags/development/gitaly_replace_wiki_update_page.yml
deleted file mode 100644
index 9fabf5edde8..00000000000
--- a/config/feature_flags/development/gitaly_replace_wiki_update_page.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_replace_wiki_update_page
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83833
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357246
-milestone: '14.10'
-type: development
-group: group::editor
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_upload_pack_gitaly_hooks.yml b/config/feature_flags/development/gitaly_upload_pack_gitaly_hooks.yml
deleted file mode 100644
index 86e268af772..00000000000
--- a/config/feature_flags/development/gitaly_upload_pack_gitaly_hooks.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_upload_pack_gitaly_hooks
-introduced_by_url:
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/807
-milestone: '13.9'
-type: development
-group:
-default_enabled: false
diff --git a/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml b/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml
deleted file mode 100644
index 6e52112b754..00000000000
--- a/config/feature_flags/development/gitaly_user_merge_branch_access_error.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitaly_user_merge_branch_access_error
-introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3705
-rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/3757
-milestone: '14.3'
-type: development
-group: group::gitaly
-default_enabled: false
diff --git a/config/feature_flags/development/gitlab_shell_upload_pack_sidechannel.yml b/config/feature_flags/development/gitlab_shell_upload_pack_sidechannel.yml
deleted file mode 100644
index e329959d36f..00000000000
--- a/config/feature_flags/development/gitlab_shell_upload_pack_sidechannel.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: gitlab_shell_upload_pack_sidechannel
-introduced_by_url:
-rollout_issue_url:
-milestone: '14.8'
-type: development
-group: group::scalability
-default_enabled: false
diff --git a/config/feature_flags/development/graphql_ci_runner_executor.yml b/config/feature_flags/development/graphql_ci_runner_executor.yml
deleted file mode 100644
index f58482b32d8..00000000000
--- a/config/feature_flags/development/graphql_ci_runner_executor.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: graphql_ci_runner_executor
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76534
-rollout_issue_url:
-milestone: '14.7'
-type: development
-group: group::runner
-default_enabled: false
diff --git a/config/feature_flags/development/group_releases_finder_inoperator.yml b/config/feature_flags/development/group_releases_finder_inoperator.yml
deleted file mode 100644
index c76c328b5bf..00000000000
--- a/config/feature_flags/development/group_releases_finder_inoperator.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_releases_finder_inoperator
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80093
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355463
-milestone: '14.9'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/group_wiki_settings_toggle.yml b/config/feature_flags/development/group_wiki_settings_toggle.yml
deleted file mode 100644
index 083453a6944..00000000000
--- a/config/feature_flags/development/group_wiki_settings_toggle.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: group_wiki_settings_toggle
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82298
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358387
-milestone: '14.10'
-type: development
-group: group::editor
-default_enabled: false
diff --git a/config/feature_flags/development/inactive_projects_deletion.yml b/config/feature_flags/development/inactive_projects_deletion.yml
new file mode 100644
index 00000000000..e9bb91f62cc
--- /dev/null
+++ b/config/feature_flags/development/inactive_projects_deletion.yml
@@ -0,0 +1,8 @@
+---
+name: inactive_projects_deletion
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357968
+milestone: '15.0'
+type: development
+group: group::compliance
+default_enabled: false
diff --git a/config/feature_flags/development/ipynbdiff_notes_tracker.yml b/config/feature_flags/development/ipynbdiff_notes_tracker.yml
new file mode 100644
index 00000000000..af471a3f6ee
--- /dev/null
+++ b/config/feature_flags/development/ipynbdiff_notes_tracker.yml
@@ -0,0 +1,8 @@
+---
+name: ipynbdiff_notes_tracker
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85398
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/362232
+milestone: '15.0'
+type: development
+group: group::incubation
+default_enabled: false
diff --git a/config/feature_flags/development/jira_connect_oauth_self_managed.yml b/config/feature_flags/development/jira_connect_oauth_self_managed.yml
new file mode 100644
index 00000000000..dd7a8b6cd29
--- /dev/null
+++ b/config/feature_flags/development/jira_connect_oauth_self_managed.yml
@@ -0,0 +1,8 @@
+---
+name: jira_connect_oauth_self_managed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85483
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/359940
+milestone: '15.0'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/development/job_deployment_count.yml b/config/feature_flags/development/job_deployment_count.yml
deleted file mode 100644
index 9a101da9a99..00000000000
--- a/config/feature_flags/development/job_deployment_count.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: job_deployment_count
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79272
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351591
-milestone: '14.8'
-type: development
-group: group::release
-default_enabled: false
diff --git a/config/feature_flags/development/lfk_fair_queueing.yml b/config/feature_flags/development/lfk_fair_queueing.yml
deleted file mode 100644
index 6dc6cb72e56..00000000000
--- a/config/feature_flags/development/lfk_fair_queueing.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: lfk_fair_queueing
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79116
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351082
-milestone: '14.8'
-type: development
-group: group::sharding
-default_enabled: true
diff --git a/config/feature_flags/development/markdown_continue_lists.yml b/config/feature_flags/development/markdown_continue_lists.yml
deleted file mode 100644
index 8be9a3008da..00000000000
--- a/config/feature_flags/development/markdown_continue_lists.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: markdown_continue_lists
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79161
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351386
-milestone: '14.8'
-type: development
-group: group::project management
-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
new file mode 100644
index 00000000000..c480bdedae6
--- /dev/null
+++ b/config/feature_flags/development/measure_service_ping_metric_collection.yml
@@ -0,0 +1,8 @@
+---
+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/monitor_logging.yml b/config/feature_flags/development/monitor_logging.yml
new file mode 100644
index 00000000000..e9e3f49a3bb
--- /dev/null
+++ b/config/feature_flags/development/monitor_logging.yml
@@ -0,0 +1,8 @@
+---
+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
new file mode 100644
index 00000000000..e4de215cc97
--- /dev/null
+++ b/config/feature_flags/development/monitor_tracing.yml
@@ -0,0 +1,8 @@
+---
+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/moved_mr_sidebar.yml b/config/feature_flags/development/moved_mr_sidebar.yml
new file mode 100644
index 00000000000..b12d3023e3c
--- /dev/null
+++ b/config/feature_flags/development/moved_mr_sidebar.yml
@@ -0,0 +1,8 @@
+---
+name: moved_mr_sidebar
+introduced_by_url:
+rollout_issue_url:
+milestone: '14.10'
+type: development
+group: group::code review
+default_enabled: false
diff --git a/config/feature_flags/development/namespace_storage_limit_bypass_date_check.yml b/config/feature_flags/development/namespace_storage_limit_bypass_date_check.yml
new file mode 100644
index 00000000000..f70e60d14b5
--- /dev/null
+++ b/config/feature_flags/development/namespace_storage_limit_bypass_date_check.yml
@@ -0,0 +1,8 @@
+---
+name: namespace_storage_limit_bypass_date_check
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86794
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361785
+milestone: '15.0'
+type: development
+group: group::utilization
+default_enabled: false
diff --git a/config/feature_flags/development/new_vulnerability_form.yml b/config/feature_flags/development/new_vulnerability_form.yml
deleted file mode 100644
index 8f73b18876c..00000000000
--- a/config/feature_flags/development/new_vulnerability_form.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: new_vulnerability_form
-introduced_by_url:
-rollout_issue_url:
-milestone: '14.9'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml b/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml
deleted file mode 100644
index d97b4974f27..00000000000
--- a/config/feature_flags/development/nullify_in_batches_on_user_deletion.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: 'nullify_in_batches_on_user_deletion'
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84709
-rollout_issue_url:
-milestone: '14.10'
-type: development
-group: group::optimize
-default_enabled: true
diff --git a/config/feature_flags/development/omit_epic_subscribed.yml b/config/feature_flags/development/omit_epic_subscribed.yml
new file mode 100644
index 00000000000..885636d6626
--- /dev/null
+++ b/config/feature_flags/development/omit_epic_subscribed.yml
@@ -0,0 +1,8 @@
+---
+name: omit_epic_subscribed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86016
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360663
+milestone: '15.0'
+type: development
+group: group::product planning
+default_enabled: true
diff --git a/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml b/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml
index 75ed8e642c6..52743818b5a 100644
--- a/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml
+++ b/config/feature_flags/development/omniauth_initializer_fullhost_proc.yml
@@ -1,8 +1,8 @@
---
name: omniauth_initializer_fullhost_proc
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82401
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82703
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/355579
milestone: '14.10'
type: development
group: group::geo
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/optimized_followed_users_queries.yml b/config/feature_flags/development/optimized_followed_users_queries.yml
index 514c3c91829..9e08810659b 100644
--- a/config/feature_flags/development/optimized_followed_users_queries.yml
+++ b/config/feature_flags/development/optimized_followed_users_queries.yml
@@ -2,7 +2,7 @@
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: '14.10'
+milestone: '15.0'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/optimized_project_and_group_activity_queries.yml b/config/feature_flags/development/optimized_project_and_group_activity_queries.yml
new file mode 100644
index 00000000000..6efb0a3818a
--- /dev/null
+++ b/config/feature_flags/development/optimized_project_and_group_activity_queries.yml
@@ -0,0 +1,8 @@
+---
+name: optimized_project_and_group_activity_queries
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85810
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360458
+milestone: '15.0'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/pipeline_editor_file_tree.yml b/config/feature_flags/development/pipeline_editor_file_tree.yml
new file mode 100644
index 00000000000..db31133a530
--- /dev/null
+++ b/config/feature_flags/development/pipeline_editor_file_tree.yml
@@ -0,0 +1,8 @@
+---
+name: pipeline_editor_file_tree
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83910
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357219
+milestone: '15.0'
+type: development
+group: group::pipeline authoring
+default_enabled: false
diff --git a/config/feature_flags/development/preserve_unchanged_markdown.yml b/config/feature_flags/development/preserve_unchanged_markdown.yml
new file mode 100644
index 00000000000..55e5d913389
--- /dev/null
+++ b/config/feature_flags/development/preserve_unchanged_markdown.yml
@@ -0,0 +1,8 @@
+---
+name: preserve_unchanged_markdown
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86060
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360713
+milestone: '15.0'
+type: development
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/development/push_rules_supersede_code_owners.yml b/config/feature_flags/development/push_rules_supersede_code_owners.yml
deleted file mode 100644
index 2341556502f..00000000000
--- a/config/feature_flags/development/push_rules_supersede_code_owners.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: push_rules_supersede_code_owners
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44126
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/262019
-type: development
-group: group::code review
-default_enabled: true
-milestone: '13.5'
diff --git a/config/feature_flags/development/refactor_mr_widget_test_summary.yml b/config/feature_flags/development/refactor_mr_widget_test_summary.yml
new file mode 100644
index 00000000000..902248f1d85
--- /dev/null
+++ b/config/feature_flags/development/refactor_mr_widget_test_summary.yml
@@ -0,0 +1,8 @@
+---
+name: refactor_mr_widget_test_summary
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83631
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/358208
+milestone: '15.0'
+type: development
+group: group::pipeline insights
+default_enabled: false
diff --git a/config/feature_flags/development/registry_migration_guard_thresholds.yml b/config/feature_flags/development/registry_migration_guard_thresholds.yml
new file mode 100644
index 00000000000..664897c9e87
--- /dev/null
+++ b/config/feature_flags/development/registry_migration_guard_thresholds.yml
@@ -0,0 +1,8 @@
+---
+name: registry_migration_guard_thresholds
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360790
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350543
+milestone: '15.0'
+type: development
+group: group::package
+default_enabled: false
diff --git a/config/feature_flags/development/remove_diff_header_icons.yml b/config/feature_flags/development/remove_diff_header_icons.yml
new file mode 100644
index 00000000000..213e911c414
--- /dev/null
+++ b/config/feature_flags/development/remove_diff_header_icons.yml
@@ -0,0 +1,8 @@
+---
+name: remove_diff_header_icons
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87289
+rollout_issue_url:
+milestone: '15.0'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/remove_sha_from_releases_json.yml b/config/feature_flags/development/remove_sha_from_releases_json.yml
new file mode 100644
index 00000000000..27b62c62978
--- /dev/null
+++ b/config/feature_flags/development/remove_sha_from_releases_json.yml
@@ -0,0 +1,8 @@
+---
+name: remove_sha_from_releases_json
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86233
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360903
+milestone: '15.0'
+type: development
+group: group::release
+default_enabled: false
diff --git a/config/feature_flags/development/rendered_diffs_viewer.yml b/config/feature_flags/development/rendered_diffs_viewer.yml
index e159b2656e1..bca0d638eaf 100644
--- a/config/feature_flags/development/rendered_diffs_viewer.yml
+++ b/config/feature_flags/development/rendered_diffs_viewer.yml
@@ -2,7 +2,7 @@
name: rendered_diffs_viewer
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75500
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352831
-milestone: '14.9'
+milestone: '15.0'
type: development
group: group::incubation
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/replace_order_by_created_at_with_id.yml b/config/feature_flags/development/replace_order_by_created_at_with_id.yml
new file mode 100644
index 00000000000..c370b172cd3
--- /dev/null
+++ b/config/feature_flags/development/replace_order_by_created_at_with_id.yml
@@ -0,0 +1,8 @@
+---
+name: replace_order_by_created_at_with_id
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86104
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360757
+milestone: '15.0'
+type: development
+group: group::workspace
+default_enabled: false
diff --git a/config/feature_flags/development/route_hll_to_snowplow.yml b/config/feature_flags/development/route_hll_to_snowplow.yml
index 3c8f7826a0a..0caaf1446ca 100644
--- a/config/feature_flags/development/route_hll_to_snowplow.yml
+++ b/config/feature_flags/development/route_hll_to_snowplow.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/354442
milestone: '14.9'
type: development
group: group::product intelligence
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/runner_list_group_view_vue_ui.yml b/config/feature_flags/development/runner_list_group_view_vue_ui.yml
deleted file mode 100644
index 542bad1b236..00000000000
--- a/config/feature_flags/development/runner_list_group_view_vue_ui.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: runner_list_group_view_vue_ui
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66376
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336405
-milestone: '14.2'
-type: development
-group: group::runner
-default_enabled: true
diff --git a/config/feature_flags/development/runner_read_only_admin_view.yml b/config/feature_flags/development/runner_read_only_admin_view.yml
deleted file mode 100644
index 7a412e70dd9..00000000000
--- a/config/feature_flags/development/runner_read_only_admin_view.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: runner_read_only_admin_view
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77682
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350164
-milestone: '14.7'
-type: development
-group: group::runner
-default_enabled: true
diff --git a/config/feature_flags/development/secure_vulnerability_training.yml b/config/feature_flags/development/secure_vulnerability_training.yml
deleted file mode 100644
index 7dbc25f1ebf..00000000000
--- a/config/feature_flags/development/secure_vulnerability_training.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: secure_vulnerability_training
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346074
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346308
-milestone: '14.6'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/settings_operations_prometheus_service.yml b/config/feature_flags/development/settings_operations_prometheus_service.yml
deleted file mode 100644
index 93afe504b21..00000000000
--- a/config/feature_flags/development/settings_operations_prometheus_service.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: settings_operations_prometheus_service
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24296
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/258560
-milestone: '12.8'
-type: development
-group: group::respond
-default_enabled: false
diff --git a/config/feature_flags/development/slack_app_use_v2_flow.yml b/config/feature_flags/development/slack_app_use_v2_flow.yml
new file mode 100644
index 00000000000..2f696629cee
--- /dev/null
+++ b/config/feature_flags/development/slack_app_use_v2_flow.yml
@@ -0,0 +1,8 @@
+---
+name: slack_app_use_v2_flow
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85726
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360680
+milestone: '15.0'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/development/ukraine_support_tanuki.yml b/config/feature_flags/development/ukraine_support_tanuki.yml
deleted file mode 100644
index 3a2c64a5aa4..00000000000
--- a/config/feature_flags/development/ukraine_support_tanuki.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: ukraine_support_tanuki
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82050
-rollout_issue_url:
-milestone: '14.9'
-type: development
-group: group::editor
-default_enabled: false
diff --git a/config/feature_flags/development/updated_diff_expansion_buttons.yml b/config/feature_flags/development/updated_diff_expansion_buttons.yml
new file mode 100644
index 00000000000..a566eab6047
--- /dev/null
+++ b/config/feature_flags/development/updated_diff_expansion_buttons.yml
@@ -0,0 +1,8 @@
+---
+name: updated_diff_expansion_buttons
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80890
+rollout_issue_url:
+milestone: '14.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/updated_mr_header.yml b/config/feature_flags/development/updated_mr_header.yml
new file mode 100644
index 00000000000..7268076b587
--- /dev/null
+++ b/config/feature_flags/development/updated_mr_header.yml
@@ -0,0 +1,8 @@
+---
+name: updated_mr_header
+introduced_by_url:
+rollout_issue_url:
+milestone: '14.10'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_diff_searches.yml b/config/feature_flags/development/usage_data_diff_searches.yml
new file mode 100644
index 00000000000..70c053b7a17
--- /dev/null
+++ b/config/feature_flags/development/usage_data_diff_searches.yml
@@ -0,0 +1,7 @@
+name: usage_data_diff_searches
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86603
+rollout_issue_url:
+milestone: '15.0'
+type: development
+group: group::code review
+default_enabled: true
diff --git a/config/feature_flags/development/usage_data_static_site_editor_commits.yml b/config/feature_flags/development/usage_data_static_site_editor_commits.yml
deleted file mode 100644
index a1d790b3505..00000000000
--- a/config/feature_flags/development/usage_data_static_site_editor_commits.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_static_site_editor_commits
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47309
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/284082
-milestone: '13.6'
-type: development
-group: group::static_site_editor
-default_enabled: false
diff --git a/config/feature_flags/development/usage_data_static_site_editor_merge_requests.yml b/config/feature_flags/development/usage_data_static_site_editor_merge_requests.yml
deleted file mode 100644
index b68e4d12915..00000000000
--- a/config/feature_flags/development/usage_data_static_site_editor_merge_requests.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: usage_data_static_site_editor_merge_requests
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47309
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/284083
-milestone: '13.6'
-type: development
-group: group::static_site_editor
-default_enabled: false
diff --git a/config/feature_flags/development/use_vsa_aggregated_tables.yml b/config/feature_flags/development/use_vsa_aggregated_tables.yml
index d2adec3633b..89c24181eb1 100644
--- a/config/feature_flags/development/use_vsa_aggregated_tables.yml
+++ b/config/feature_flags/development/use_vsa_aggregated_tables.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343429
milestone: '14.5'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vsa_reaggregation_worker.yml b/config/feature_flags/development/vsa_reaggregation_worker.yml
index d5218d6e7e3..a3cc83722a3 100644
--- a/config/feature_flags/development/vsa_reaggregation_worker.yml
+++ b/config/feature_flags/development/vsa_reaggregation_worker.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357647
milestone: '14.10'
type: development
group: group::optimize
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_reads_table.yml b/config/feature_flags/development/vulnerability_reads_table.yml
deleted file mode 100644
index 0269c5330ae..00000000000
--- a/config/feature_flags/development/vulnerability_reads_table.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vulnerability_reads_table
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76220
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348151
-milestone: '14.9'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/vulnerability_report_pagination.yml b/config/feature_flags/development/vulnerability_report_pagination.yml
deleted file mode 100644
index 677cc1efe11..00000000000
--- a/config/feature_flags/development/vulnerability_report_pagination.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: vulnerability_report_pagination
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79834
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351975
-milestone: '14.8'
-type: development
-group: group::threat insights
-default_enabled: true
diff --git a/config/feature_flags/development/workhorse_use_sidechannel.yml b/config/feature_flags/development/workhorse_use_sidechannel.yml
deleted file mode 100644
index 1ba32be28c1..00000000000
--- a/config/feature_flags/development/workhorse_use_sidechannel.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: workhorse_use_sidechannel
-introduced_by_url:
-rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1193
-milestone: '14.4'
-type: development
-group: 'group::scalability'
-default_enabled: true
diff --git a/config/feature_flags/experiment/build_ios_app_guide_email.yml b/config/feature_flags/experiment/build_ios_app_guide_email.yml
new file mode 100644
index 00000000000..4e90b036063
--- /dev/null
+++ b/config/feature_flags/experiment/build_ios_app_guide_email.yml
@@ -0,0 +1,8 @@
+---
+name: build_ios_app_guide_email
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83817
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357803
+milestone: '15.0'
+type: experiment
+group: group::activation
+default_enabled: false
diff --git a/config/feature_flags/ops/certificate_based_clusters.yml b/config/feature_flags/ops/certificate_based_clusters.yml
index eaf4151b80a..65a05377774 100644
--- a/config/feature_flags/ops/certificate_based_clusters.yml
+++ b/config/feature_flags/ops/certificate_based_clusters.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353410
milestone: '14.9'
type: ops
group: group::configure
-default_enabled: true
+default_enabled: false
diff --git a/config/feature_flags/ops/ci_runner_separation_by_plan.yml b/config/feature_flags/ops/ci_runner_separation_by_plan.yml
new file mode 100644
index 00000000000..37f4303abe3
--- /dev/null
+++ b/config/feature_flags/ops/ci_runner_separation_by_plan.yml
@@ -0,0 +1,8 @@
+---
+name: ci_runner_separation_by_plan
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83780
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361639
+milestone: '15.0'
+type: ops
+group: group::runner
+default_enabled: false
diff --git a/config/feature_flags/ops/deprecated_serverless.yml b/config/feature_flags/ops/deprecated_serverless.yml
deleted file mode 100644
index 0982778f139..00000000000
--- a/config/feature_flags/ops/deprecated_serverless.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: deprecated_serverless
-introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81493'
-rollout_issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/353901'
-milestone: '14.9'
-type: ops
-group: 'group::configure'
-default_enabled: true
diff --git a/config/feature_flags/ops/jira_raise_timeouts.yml b/config/feature_flags/ops/jira_raise_timeouts.yml
new file mode 100644
index 00000000000..d1ab0ff0670
--- /dev/null
+++ b/config/feature_flags/ops/jira_raise_timeouts.yml
@@ -0,0 +1,8 @@
+---
+name: jira_raise_timeouts
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86439
+rollout_issue_url:
+milestone: '15.0'
+type: ops
+group: group::integrations
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_enforce_requests_limits.yml b/config/feature_flags/undefined/gitaly_enforce_requests_limits.yml
new file mode 100644
index 00000000000..d624694d7b0
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_enforce_requests_limits.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_enforce_requests_limits
+introduced_by_url:
+rollout_issue_url:
+milestone:
+type: undefined
+group:
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_go_user_merge_branch.yml b/config/feature_flags/undefined/gitaly_go_user_merge_branch.yml
new file mode 100644
index 00000000000..51b40b6aa38
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_go_user_merge_branch.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_go_user_merge_branch
+introduced_by_url:
+rollout_issue_url:
+milestone:
+type: undefined
+group:
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_mep_mep.yml b/config/feature_flags/undefined/gitaly_mep_mep.yml
new file mode 100644
index 00000000000..7f903b26539
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_mep_mep.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_mep_mep
+introduced_by_url:
+rollout_issue_url:
+milestone:
+type: undefined
+group:
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_pack_objects_hook_with_sidechannel.yml b/config/feature_flags/undefined/gitaly_pack_objects_hook_with_sidechannel.yml
new file mode 100644
index 00000000000..a09daecbfa5
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_pack_objects_hook_with_sidechannel.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_pack_objects_hook_with_sidechannel
+introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3758
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1187
+milestone: '14.3'
+type: undefined
+group: 'team::Scalability'
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_replace_wiki_create_page.yml b/config/feature_flags/undefined/gitaly_replace_wiki_create_page.yml
new file mode 100644
index 00000000000..9b7a36cb2c0
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_replace_wiki_create_page.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_replace_wiki_create_page
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83734
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/356983
+milestone: '15.0'
+type: undefined
+group: group::editor
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_upload_pack_gitaly_hooks.yml b/config/feature_flags/undefined/gitaly_upload_pack_gitaly_hooks.yml
new file mode 100644
index 00000000000..5d09ba62152
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_upload_pack_gitaly_hooks.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_upload_pack_gitaly_hooks
+introduced_by_url:
+rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/807
+milestone: '13.9'
+type: undefined
+group:
+default_enabled: false
diff --git a/config/feature_flags/undefined/gitaly_user_merge_branch_access_error.yml b/config/feature_flags/undefined/gitaly_user_merge_branch_access_error.yml
new file mode 100644
index 00000000000..2b732c3f1ec
--- /dev/null
+++ b/config/feature_flags/undefined/gitaly_user_merge_branch_access_error.yml
@@ -0,0 +1,8 @@
+---
+name: gitaly_user_merge_branch_access_error
+introduced_by_url: https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3705
+rollout_issue_url: https://gitlab.com/gitlab-org/gitaly/-/issues/3757
+milestone: '14.3'
+type: undefined
+group: group::gitaly
+default_enabled: false
diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index 57106120fb2..54a92f5b8b4 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -220,7 +220,7 @@ production: &base
#
# log_path: log/mail_room_json.log
- # Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: false
# For Microsoft Graph support
@@ -288,7 +288,6 @@ production: &base
# object_store:
# enabled: false
# remote_directory: artifacts # The bucket name
- # background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
# connection:
# provider: AWS # Only AWS supported at the moment
@@ -308,7 +307,6 @@ production: &base
# object_store:
# enabled: false
# remote_directory: external-diffs
- # background_upload: false
# proxy_download: false
# connection:
# provider: AWS
@@ -324,8 +322,6 @@ production: &base
object_store:
enabled: false
remote_directory: lfs-objects # Bucket name
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false)
- # background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
connection:
provider: AWS
@@ -346,8 +342,6 @@ production: &base
object_store:
enabled: false
remote_directory: uploads # Bucket name
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false)
- # background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
connection:
provider: AWS
@@ -368,8 +362,6 @@ production: &base
object_store:
enabled: false
remote_directory: packages # The bucket name
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false)
- # background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
connection:
provider: AWS
@@ -389,8 +381,6 @@ production: &base
object_store:
enabled: false
remote_directory: dependency_proxy # The bucket name
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false)
- # background_upload: false # Temporary option to limit automatic upload (Default: true)
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage
connection:
provider: AWS
@@ -592,20 +582,11 @@ production: &base
geo_secondary_registry_consistency_worker:
cron: "* * * * *"
- # GitLab Geo file download dispatch worker
- # NOTE: This will only take effect if Geo is enabled (secondary nodes only)
- geo_file_download_dispatch_worker:
- cron: "*/1 * * * *"
-
# GitLab Geo registry sync worker (for backfilling)
# NOTE: This will only take effect if Geo is enabled (secondary nodes only)
geo_registry_sync_worker:
cron: "*/1 * * * *"
- # Export pseudonymized data in CSV format for analysis
- pseudonymizer_worker:
- cron: "0 * * * *"
-
# Elasticsearch bulk updater for incremental updates.
# NOTE: This will only take effect if elasticsearch is enabled.
elastic_index_bulk_cron_worker:
@@ -621,6 +602,10 @@ production: &base
elastic_index_initial_bulk_cron_worker:
cron: "*/10 * * * *"
+ # Periodically prune stale runners from namespaces having opted-in.
+ ci_runners_stale_group_runners_prune_worker_cron:
+ cron: "30 * * * *"
+
registry:
# enabled: true
# host: registry.example.com
@@ -1215,20 +1200,6 @@ production: &base
# # server_side_encryption: 'aws:kms'
# # server_side_encryption_kms_key_id: 'arn:aws:kms:YOUR-KEY-ID-HERE'
- ## Pseudonymizer exporter
- pseudonymizer:
- # Tables manifest that specifies the fields to extract and pseudonymize.
- manifest: config/pseudonymizer.yml
- upload:
- remote_directory: 'gitlab-elt'
- # Fog storage connection settings, see http://fog.io/storage/ .
- connection:
- # provider: AWS
- # region: eu-west-1
- # aws_access_key_id: AKIAKIAKI
- # aws_secret_access_key: 'secret123'
- # # The remote 'directory' to store the CSV files. For S3, this would be the bucket name.
-
## GitLab Shell settings
gitlab_shell:
path: /home/git/gitlab-shell/
@@ -1304,9 +1275,8 @@ production: &base
sidekiq_health_checks:
# enabled: true
- # log_enabled: false
# address: localhost
- # port: 8082
+ # 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
@@ -1438,7 +1408,6 @@ test:
object_store:
enabled: false
remote_directory: artifacts # The bucket name
- background_upload: false
connection:
provider: AWS # Only AWS supported at the moment
aws_access_key_id: AWS_ACCESS_KEY_ID
@@ -1534,17 +1503,6 @@ test:
backup:
path: tmp/tests/backups
gitaly_backup_path: tmp/tests/gitaly/_build/bin/gitaly-backup
- pseudonymizer:
- manifest: config/pseudonymizer.yml
- upload:
- # The remote 'directory' to store the CSV files. For S3, this would be the bucket name.
- remote_directory: gitlab-elt.test
- # Fog storage connection settings, see http://fog.io/storage/
- connection:
- provider: AWS # Only AWS supported at the moment
- aws_access_key_id: AWS_ACCESS_KEY_ID
- aws_secret_access_key: AWS_SECRET_ACCESS_KEY
- region: us-east-1
gitlab_shell:
path: tmp/tests/gitlab-shell/
authorized_keys_file: tmp/tests/authorized_keys
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 8f228120c8e..ae6c2bde081 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -186,7 +186,7 @@ external_pull_requests:
merge_request_metrics:
- table: ci_pipelines
column: pipeline_id
- on_delete: async_delete
+ on_delete: async_nullify
merge_requests:
- table: ci_pipelines
column: head_pipeline_id
diff --git a/config/initializers/00_connection_logger.rb b/config/initializers/00_connection_logger.rb
new file mode 100644
index 00000000000..9f03d13f95f
--- /dev/null
+++ b/config/initializers/00_connection_logger.rb
@@ -0,0 +1,26 @@
+# 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_marginalia.rb b/config/initializers/0_marginalia.rb
index 805a9e33347..e88599fd93c 100644
--- a/config/initializers/0_marginalia.rb
+++ b/config/initializers/0_marginalia.rb
@@ -17,11 +17,14 @@ Marginalia::Comment.components = [:application, :correlation_id, :jid, :endpoint
# As mentioned in https://github.com/basecamp/marginalia/pull/93/files,
# adding :line has some overhead because a regexp on the backtrace has
-# to be run on every SQL query. Only enable this in development because
+# to be run on every SQL query. Only enable this in development and test because
# we've seen it slow things down.
-if Rails.env.development?
+if Gitlab.dev_or_test_env?
Marginalia::Comment.components << :line
- Marginalia::Comment.lines_to_ignore = Regexp.union(Gitlab::BacktraceCleaner::IGNORE_BACKTRACES + %w(lib/ruby/gems/ lib/gem_extensions/ lib/ruby/))
+ Marginalia::Comment.lines_to_ignore = Regexp.union(
+ Gitlab::BacktraceCleaner::IGNORE_BACKTRACES + %w[
+ lib/ruby/gems/ lib/gem_extensions/ lib/ruby/ lib/gitlab/marginalia/ gems/
+ ])
end
Gitlab::Marginalia.set_application_name
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index c0dc18c60c9..05d480f267e 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -252,7 +252,7 @@ Settings.gitlab_ci['url'] ||= Settings.__send__(:build_gitlab_ci
Settings['ci_secure_files'] ||= Settingslogic.new({})
Settings.ci_secure_files['enabled'] = true if Settings.ci_secure_files['enabled'].nil?
Settings.ci_secure_files['storage_path'] = Settings.absolute(Settings.ci_secure_files['storage_path'] || File.join(Settings.shared['path'], "ci_secure_files"))
-Settings.ci_secure_files['object_store'] = ObjectStoreSettings.legacy_parse(Settings.ci_secure_files['object_store'])
+Settings.ci_secure_files['object_store'] = ObjectStoreSettings.legacy_parse(Settings.ci_secure_files['object_store'], 'secure_files')
#
# Reply by email
@@ -276,7 +276,7 @@ Settings.artifacts['storage_path'] = Settings.absolute(Settings.artifacts.values
# Settings.artifact['path'] is deprecated, use `storage_path` instead
Settings.artifacts['path'] = Settings.artifacts['storage_path']
Settings.artifacts['max_size'] ||= 100 # in megabytes
-Settings.artifacts['object_store'] = ObjectStoreSettings.legacy_parse(Settings.artifacts['object_store'])
+Settings.artifacts['object_store'] = ObjectStoreSettings.legacy_parse(Settings.artifacts['object_store'], 'artifacts')
#
# Registry
@@ -321,7 +321,7 @@ Settings.pages['secret_file'] ||= Rails.root.join('.gitlab_pages_secret')
# We want pages zip archives to be stored on the same directory as old pages hierarchical structure
# this will allow us to easier migrate existing instances with NFS
Settings.pages['storage_path'] = Settings.pages['path']
-Settings.pages['object_store'] = ObjectStoreSettings.legacy_parse(Settings.pages['object_store'])
+Settings.pages['object_store'] = ObjectStoreSettings.legacy_parse(Settings.pages['object_store'], 'pages')
Settings.pages['local_store'] ||= Settingslogic.new({})
Settings.pages['local_store']['path'] = Settings.absolute(Settings.pages['local_store']['path'] || File.join(Settings.shared['path'], "pages"))
Settings.pages['local_store']['enabled'] = true if Settings.pages['local_store']['enabled'].nil?
@@ -362,7 +362,7 @@ Settings['external_diffs'] ||= Settingslogic.new({})
Settings.external_diffs['enabled'] = false if Settings.external_diffs['enabled'].nil?
Settings.external_diffs['when'] = 'always' if Settings.external_diffs['when'].nil?
Settings.external_diffs['storage_path'] = Settings.absolute(Settings.external_diffs['storage_path'] || File.join(Settings.shared['path'], 'external-diffs'))
-Settings.external_diffs['object_store'] = ObjectStoreSettings.legacy_parse(Settings.external_diffs['object_store'])
+Settings.external_diffs['object_store'] = ObjectStoreSettings.legacy_parse(Settings.external_diffs['object_store'], 'external_diffs')
#
# Git LFS
@@ -370,7 +370,7 @@ Settings.external_diffs['object_store'] = ObjectStoreSettings.legacy_parse(Setti
Settings['lfs'] ||= Settingslogic.new({})
Settings.lfs['enabled'] = true if Settings.lfs['enabled'].nil?
Settings.lfs['storage_path'] = Settings.absolute(Settings.lfs['storage_path'] || File.join(Settings.shared['path'], "lfs-objects"))
-Settings.lfs['object_store'] = ObjectStoreSettings.legacy_parse(Settings.lfs['object_store'])
+Settings.lfs['object_store'] = ObjectStoreSettings.legacy_parse(Settings.lfs['object_store'], 'lfs')
#
# Uploads
@@ -378,7 +378,7 @@ Settings.lfs['object_store'] = ObjectStoreSettings.legacy_parse(Settings.lfs['ob
Settings['uploads'] ||= Settingslogic.new({})
Settings.uploads['storage_path'] = Settings.absolute(Settings.uploads['storage_path'] || 'public')
Settings.uploads['base_dir'] = Settings.uploads['base_dir'] || 'uploads/-/system'
-Settings.uploads['object_store'] = ObjectStoreSettings.legacy_parse(Settings.uploads['object_store'])
+Settings.uploads['object_store'] = ObjectStoreSettings.legacy_parse(Settings.uploads['object_store'], 'uploads')
Settings.uploads['object_store']['remote_directory'] ||= 'uploads'
#
@@ -388,7 +388,7 @@ Settings['packages'] ||= Settingslogic.new({})
Settings.packages['enabled'] = true if Settings.packages['enabled'].nil?
Settings.packages['dpkg_deb_path'] = '/usr/bin/dpkg-deb' if Settings.packages['dpkg_deb_path'].nil?
Settings.packages['storage_path'] = Settings.absolute(Settings.packages['storage_path'] || File.join(Settings.shared['path'], "packages"))
-Settings.packages['object_store'] = ObjectStoreSettings.legacy_parse(Settings.packages['object_store'])
+Settings.packages['object_store'] = ObjectStoreSettings.legacy_parse(Settings.packages['object_store'], 'packages')
#
# Dependency Proxy
@@ -396,7 +396,7 @@ Settings.packages['object_store'] = ObjectStoreSettings.legacy_parse(Settings.p
Settings['dependency_proxy'] ||= Settingslogic.new({})
Settings.dependency_proxy['enabled'] = true if Settings.dependency_proxy['enabled'].nil?
Settings.dependency_proxy['storage_path'] = Settings.absolute(Settings.dependency_proxy['storage_path'] || File.join(Settings.shared['path'], "dependency_proxy"))
-Settings.dependency_proxy['object_store'] = ObjectStoreSettings.legacy_parse(Settings.dependency_proxy['object_store'])
+Settings.dependency_proxy['object_store'] = ObjectStoreSettings.legacy_parse(Settings.dependency_proxy['object_store'], 'dependency_proxy')
# For first iteration dependency proxy uses Rails server to download blobs.
# To ensure acceptable performance we only allow feature to be used with
@@ -410,7 +410,7 @@ Settings.dependency_proxy['enabled'] = false unless Gitlab::Runtime.puma?
Settings['terraform_state'] ||= Settingslogic.new({})
Settings.terraform_state['enabled'] = true if Settings.terraform_state['enabled'].nil?
Settings.terraform_state['storage_path'] = Settings.absolute(Settings.terraform_state['storage_path'] || File.join(Settings.shared['path'], "terraform_state"))
-Settings.terraform_state['object_store'] = ObjectStoreSettings.legacy_parse(Settings.terraform_state['object_store'])
+Settings.terraform_state['object_store'] = ObjectStoreSettings.legacy_parse(Settings.terraform_state['object_store'], 'terraform_state')
#
# Mattermost
@@ -482,9 +482,6 @@ Settings.cron_jobs['import_export_project_cleanup_worker']['job_class'] = 'Impor
Settings.cron_jobs['ci_archive_traces_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_archive_traces_cron_worker']['cron'] ||= '17 * * * *'
Settings.cron_jobs['ci_archive_traces_cron_worker']['job_class'] = 'Ci::ArchiveTracesCronWorker'
-Settings.cron_jobs['requests_profiles_worker'] ||= Settingslogic.new({})
-Settings.cron_jobs['requests_profiles_worker']['cron'] ||= '0 0 * * *'
-Settings.cron_jobs['requests_profiles_worker']['job_class'] = 'RequestsProfilesWorker'
Settings.cron_jobs['remove_expired_members_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['remove_expired_members_worker']['cron'] ||= '10 0 * * *'
Settings.cron_jobs['remove_expired_members_worker']['job_class'] = 'RemoveExpiredMembersWorker'
@@ -629,6 +626,9 @@ Settings.cron_jobs['clusters_integrations_check_prometheus_health_worker']['job_
Settings.cron_jobs['projects_schedule_refresh_build_artifacts_size_statistics_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['projects_schedule_refresh_build_artifacts_size_statistics_worker']['cron'] ||= '2/17 * * * *'
Settings.cron_jobs['projects_schedule_refresh_build_artifacts_size_statistics_worker']['job_class'] = 'Projects::ScheduleRefreshBuildArtifactsSizeStatisticsWorker'
+Settings.cron_jobs['inactive_projects_deletion_cron_worker'] ||= Settingslogic.new({})
+Settings.cron_jobs['inactive_projects_deletion_cron_worker']['cron'] ||= '0 1 * * *'
+Settings.cron_jobs['inactive_projects_deletion_cron_worker']['job_class'] = 'Projects::InactiveProjectsDeletionCronWorker'
Gitlab.ee do
Settings.cron_jobs['analytics_devops_adoption_create_all_snapshots_worker'] ||= Settingslogic.new({})
@@ -664,9 +664,6 @@ Gitlab.ee do
Settings.cron_jobs['geo_secondary_usage_data_cron_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['geo_secondary_usage_data_cron_worker']['cron'] ||= '0 0 * * 0'
Settings.cron_jobs['geo_secondary_usage_data_cron_worker']['job_class'] ||= 'Geo::SecondaryUsageDataCronWorker'
- Settings.cron_jobs['geo_file_download_dispatch_worker'] ||= Settingslogic.new({})
- Settings.cron_jobs['geo_file_download_dispatch_worker']['cron'] ||= '*/1 * * * *'
- Settings.cron_jobs['geo_file_download_dispatch_worker']['job_class'] ||= 'Geo::FileDownloadDispatchWorker'
Settings.cron_jobs['geo_registry_sync_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['geo_registry_sync_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['geo_registry_sync_worker']['job_class'] ||= 'Geo::RegistrySyncWorker'
@@ -712,9 +709,9 @@ Gitlab.ee do
Settings.cron_jobs['ldap_sync_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ldap_sync_worker']['cron'] ||= '30 1 * * *'
Settings.cron_jobs['ldap_sync_worker']['job_class'] = 'LdapSyncWorker'
- Settings.cron_jobs['pseudonymizer_worker'] ||= Settingslogic.new({})
- Settings.cron_jobs['pseudonymizer_worker']['cron'] ||= '0 23 * * *'
- Settings.cron_jobs['pseudonymizer_worker']['job_class'] ||= 'PseudonymizerWorker'
+ Settings.cron_jobs['free_user_cap_data_remediation'] ||= Settingslogic.new({})
+ Settings.cron_jobs['free_user_cap_data_remediation']['cron'] ||= '17 6,10,14,18 * * *'
+ Settings.cron_jobs['free_user_cap_data_remediation']['job_class'] = 'Namespaces::FreeUserCapWorker'
Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker']['cron'] ||= '0 12 * * *'
Settings.cron_jobs['update_max_seats_used_for_gitlab_com_subscriptions_worker']['job_class'] = 'UpdateMaxSeatsUsedForGitlabComSubscriptionsWorker'
@@ -739,9 +736,6 @@ Gitlab.ee do
Settings.cron_jobs['users_create_statistics_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['users_create_statistics_worker']['cron'] ||= '2 15 * * *'
Settings.cron_jobs['users_create_statistics_worker']['job_class'] = 'Users::CreateStatisticsWorker'
- Settings.cron_jobs['network_policy_metrics_worker'] ||= Settingslogic.new({})
- Settings.cron_jobs['network_policy_metrics_worker']['cron'] ||= '0 3 * * 0'
- Settings.cron_jobs['network_policy_metrics_worker']['job_class'] = 'NetworkPolicyMetricsWorker'
Settings.cron_jobs['iterations_update_status_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['iterations_update_status_worker']['cron'] ||= '5 0 * * *'
Settings.cron_jobs['iterations_update_status_worker']['job_class'] = 'IterationsUpdateStatusWorker'
@@ -775,6 +769,12 @@ Gitlab.ee do
Settings.cron_jobs['ci_project_mirrors_consistency_check_worker'] ||= Settingslogic.new({})
Settings.cron_jobs['ci_project_mirrors_consistency_check_worker']['cron'] ||= '2-58/4 * * * *'
Settings.cron_jobs['ci_project_mirrors_consistency_check_worker']['job_class'] = 'Database::CiProjectMirrorsConsistencyCheckWorker'
+ Settings.cron_jobs['arkose_blocked_users_report_worker'] ||= Settingslogic.new({})
+ Settings.cron_jobs['arkose_blocked_users_report_worker']['cron'] ||= '0 6 * * *'
+ Settings.cron_jobs['arkose_blocked_users_report_worker']['job_class'] = 'Arkose::BlockedUsersReportWorker'
+ Settings.cron_jobs['ci_runners_stale_group_runners_prune_worker_cron'] ||= Settingslogic.new({})
+ Settings.cron_jobs['ci_runners_stale_group_runners_prune_worker_cron']['cron'] ||= '30 * * * *'
+ Settings.cron_jobs['ci_runners_stale_group_runners_prune_worker_cron']['job_class'] = 'Ci::Runners::StaleGroupRunnersPruneCronWorker'
end
#
@@ -864,16 +864,6 @@ Settings.backup['upload']['storage_class'] ||= nil
Settings.backup['gitaly_backup_path'] ||= Gitlab::Utils.which('gitaly-backup')
#
-# Pseudonymizer
-#
-Gitlab.ee do
- Settings['pseudonymizer'] ||= Settingslogic.new({})
- Settings.pseudonymizer['manifest'] = Settings.absolute(Settings.pseudonymizer['manifest'] || Rails.root.join("config/pseudonymizer.yml"))
- Settings.pseudonymizer['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil })
- # Settings.pseudonymizer['upload']['multipart_chunk_size'] ||= 104857600
-end
-
-#
# Git
#
Settings['git'] ||= Settingslogic.new({})
@@ -979,15 +969,10 @@ Settings.monitoring.sidekiq_exporter['log_enabled'] ||= false
Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost'
Settings.monitoring.sidekiq_exporter['port'] ||= 8082
-# TODO: Once we split out health checks from SidekiqExporter, we
-# should not let this default to the same settings anymore; we only
-# do this for back-compat currently.
-# https://gitlab.com/gitlab-org/gitlab/-/issues/345804
Settings.monitoring['sidekiq_health_checks'] ||= Settingslogic.new({})
-Settings.monitoring.sidekiq_health_checks['enabled'] ||= Settings.monitoring.sidekiq_exporter['enabled']
-Settings.monitoring.sidekiq_health_checks['log_enabled'] ||= Settings.monitoring.sidekiq_exporter['log_enabled']
-Settings.monitoring.sidekiq_health_checks['address'] ||= Settings.monitoring.sidekiq_exporter['address']
-Settings.monitoring.sidekiq_health_checks['port'] ||= Settings.monitoring.sidekiq_exporter['port']
+Settings.monitoring.sidekiq_health_checks['enabled'] ||= false
+Settings.monitoring.sidekiq_health_checks['address'] ||= 'localhost'
+Settings.monitoring.sidekiq_health_checks['port'] ||= 8092
Settings.monitoring['web_exporter'] ||= Settingslogic.new({})
Settings.monitoring.web_exporter['enabled'] ||= false
diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb
index 6953de670a7..a8e8bdf2c9f 100644
--- a/config/initializers/7_prometheus_metrics.rb
+++ b/config/initializers/7_prometheus_metrics.rb
@@ -58,24 +58,6 @@ end
# context (i.e. not in the Rails console or rspec) and when users have enabled metrics.
return if Rails.env.test? || !Gitlab::Runtime.application? || !Gitlab::Metrics.prometheus_metrics_enabled?
-if Gitlab::Runtime.sidekiq? && (!ENV['SIDEKIQ_WORKER_ID'] || ENV['SIDEKIQ_WORKER_ID'] == '0')
- # The single worker outside of a sidekiq-cluster, or the first worker (sidekiq_0)
- # in a cluster of processes, is responsible for serving health checks.
- #
- # Do not clean the metrics directory here - the supervisor script should
- # have already taken care of that.
- Sidekiq.configure_server do |config|
- config.on(:startup) do
- # In https://gitlab.com/gitlab-org/gitlab/-/issues/345804 we are looking to
- # only serve health-checks from a worker process; for backwards compatibility
- # we still go through the metrics exporter server, but start to configure it
- # with the new settings keys.
- exporter_settings = Settings.monitoring.sidekiq_health_checks
- Gitlab::Metrics::Exporter::SidekiqExporter.instance(exporter_settings).start
- end
- end
-end
-
Gitlab::Cluster::LifecycleEvents.on_master_start do
Gitlab::Metrics.gauge(:deployments, 'GitLab Version', {}, :max).set({ version: Gitlab::VERSION, revision: Gitlab.revision }, 1)
diff --git a/config/initializers/active_record_lifecycle.rb b/config/initializers/active_record_lifecycle.rb
index 92cc1d81617..73df2b41a04 100644
--- a/config/initializers/active_record_lifecycle.rb
+++ b/config/initializers/active_record_lifecycle.rb
@@ -5,7 +5,9 @@
if defined?(ActiveRecord::Base) && !Gitlab::Runtime.sidekiq?
Gitlab::Cluster::LifecycleEvents.on_worker_start do
ActiveSupport.on_load(:active_record) do
- ActiveRecord::Base.establish_connection # rubocop: disable Database/EstablishConnection
+ # rubocop:disable Database/MultipleDatabases
+ ActiveRecord::Base.establish_connection # rubocop:disable Database/EstablishConnection
+ # rubocop:enable Database/MultipleDatabases
Gitlab::AppLogger.debug("ActiveRecord connection established")
end
@@ -18,8 +20,8 @@ if defined?(ActiveRecord::Base)
# the following is highly recommended for Rails + "preload_app true"
# as there's no need for the master process to hold a connection
- ActiveRecord::Base.connection.disconnect!
+ ActiveRecord::Base.clear_all_connections! # rubocop:disable Database/MultipleDatabases
- Gitlab::AppLogger.debug("ActiveRecord connection disconnected")
+ Gitlab::AppLogger.debug("ActiveRecord connections disconnected")
end
end
diff --git a/config/initializers/active_record_transaction_observer.rb b/config/initializers/active_record_transaction_observer.rb
index b90b3a39ac1..1dc7b55ed5a 100644
--- a/config/initializers/active_record_transaction_observer.rb
+++ b/config/initializers/active_record_transaction_observer.rb
@@ -3,7 +3,7 @@
return unless Gitlab.com? || Gitlab.dev_or_test_env?
Gitlab::Application.configure do
- if Feature.feature_flags_available? && ::Feature.enabled?(:active_record_transactions_tracking, type: :ops, default_enabled: :yaml)
+ if Feature.feature_flags_available? && ::Feature.enabled?(:active_record_transactions_tracking, type: :ops)
Gitlab::Database::Transaction::Observer.register!
end
end
diff --git a/config/initializers/attr_encrypted_no_db_connection.rb b/config/initializers/attr_encrypted_no_db_connection.rb
index 91eef7d0a5c..d9e943bd249 100644
--- a/config/initializers/attr_encrypted_no_db_connection.rb
+++ b/config/initializers/attr_encrypted_no_db_connection.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+raise 'This patch is only tested with attr_encrypted v3.1.0' unless AttrEncrypted::Version.string == '3.1.0'
+
module AttrEncrypted
module Adapters
module ActiveRecord
@@ -11,23 +13,6 @@ module AttrEncrypted
false
end
- # Prevent attr_encrypted from checking out a database connection
- # indefinitely. The result of this method is only used when the former
- # is true, but it is called unconditionally, so there is still value to
- # ensuring the connection is released
- def attribute_instance_methods_as_symbols
- # Use with_connection so the connection doesn't stay pinned to the thread.
- connected = ::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
-
- if connected
- # Call version from AttrEncrypted::Adapters::ActiveRecord
- super
- else
- # Call version from AttrEncrypted, i.e., `super` with regards to AttrEncrypted::Adapters::ActiveRecord
- AttrEncrypted.instance_method(:attribute_instance_methods_as_symbols).bind(self).call
- end
- end
-
protected
# The attr_encrypted gem is not actively maintained
diff --git a/config/initializers/carrierwave_patch.rb b/config/initializers/carrierwave_patch.rb
index a9c74478541..6053154489f 100644
--- a/config/initializers/carrierwave_patch.rb
+++ b/config/initializers/carrierwave_patch.rb
@@ -22,7 +22,7 @@ module CarrierWave
# multithreaded uploads (https://github.com/fog/fog-aws/pull/579).
# Multithreaded uploads are essential for copying large amounts of data
# within the request timeout.
- if ::Feature.enabled?(:s3_multithreaded_uploads, default_enabled: true) && fog_provider == 'AWS'
+ if ::Feature.enabled?(:s3_multithreaded_uploads) && fog_provider == 'AWS'
# AWS SDK uses 10 threads by default and a multipart chunk size of 10 MB
file.concurrency = 10
file.multipart_chunk_size = 10485760
diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb
index 3c6606066cd..f7c3f4e98b5 100644
--- a/config/initializers/content_security_policy.rb
+++ b/config/initializers/content_security_policy.rb
@@ -7,8 +7,6 @@ csp_settings['report_only'] = false if csp_settings['report_only'].nil?
csp_settings['directives'] ||= {}
if csp_settings['enabled']
- csp_settings['directives'] = ::Gitlab::ContentSecurityPolicy::ConfigLoader.default_directives if csp_settings['directives'].empty?
-
# See https://guides.rubyonrails.org/security.html#content-security-policy
Rails.application.config.content_security_policy do |policy|
loader = ::Gitlab::ContentSecurityPolicy::ConfigLoader.new(csp_settings['directives'].to_h)
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 25bf164c96a..7827ad8f168 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -37,13 +37,6 @@ Doorkeeper.configure do
# Authorization Code expiration time (default 10 minutes).
# authorization_code_expires_in 10.minutes
- # Access token expiration time (default 2 hours).
- # Until 15.0, applications can opt-out of expiring tokens.
- # Removal issue: https://gitlab.com/gitlab-org/gitlab/-/issues/340848
- custom_access_token_expires_in do |context|
- context.client&.expire_access_tokens ? 2.hours : Float::INFINITY
- end
-
# 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
@@ -97,11 +90,10 @@ Doorkeeper.configure do
# strings and the flows they enable are:
#
# "authorization_code" => Authorization Code Grant Flow
- # "implicit" => Implicit Grant Flow
# "password" => Resource Owner Password Credentials Grant Flow
# "client_credentials" => Client Credentials Grant Flow
#
- grant_flows %w(authorization_code implicit password client_credentials)
+ grant_flows %w(authorization_code password client_credentials)
# Under some circumstances you might want to have applications auto-approved,
# so that the user skips the authorization step.
diff --git a/config/initializers/elastic_client_setup.rb b/config/initializers/elastic_client_setup.rb
index 67b5032a2ee..dd68a3f7999 100644
--- a/config/initializers/elastic_client_setup.rb
+++ b/config/initializers/elastic_client_setup.rb
@@ -19,32 +19,6 @@ Gitlab.ee do
Elasticsearch::Model::ClassMethods.prepend GemExtensions::Elasticsearch::Model::Client
Elasticsearch::Model.singleton_class.prepend GemExtensions::Elasticsearch::Model::Client
- # This monkey patch cannot be handled by prepend like the above since this
- # module is included into other classes.
- module Elasticsearch
- module Model
- module Response
- module Base
- if Gem::Version.new(Elasticsearch::Model::VERSION) >= Gem::Version.new('7.0.0')
- raise "elasticsearch-model was upgraded, please remove this monkey patch in #{__FILE__}"
- end
-
- # Handle ES7 API where total is returned as an object. This
- # change is taken from the V7 gem
- # https://github.com/elastic/elasticsearch-rails/commit/9c40f630e1b549f0b7889fe33dcd826b485af6fc
- # and can be removed when we upgrade the gem to V7
- def total
- if response.response['hits']['total'].respond_to?(:keys)
- response.response['hits']['total']['value']
- else
- response.response['hits']['total']
- end
- end
- end
- end
- end
- end
-
### Modified from elasticsearch-model/lib/elasticsearch/model/searching.rb
module Elasticsearch
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb
index 24040d7b076..2c7034f758d 100644
--- a/config/initializers/omniauth.rb
+++ b/config/initializers/omniauth.rb
@@ -12,7 +12,7 @@ if Gitlab::Auth::Ldap::Config.enabled?
end
OmniAuth.config.full_host =
- if Feature.feature_flags_available? && ::Feature.enabled?(:omniauth_initializer_fullhost_proc, default_enabled: :yaml)
+ if Feature.feature_flags_available? && ::Feature.enabled?(:omniauth_initializer_fullhost_proc)
Gitlab::AppLogger.debug("Using OmniAuth proc initializer")
Gitlab::OmniauthInitializer.full_host
else
diff --git a/config/initializers/request_profiler.rb b/config/initializers/request_profiler.rb
index c368568ec51..7b588ded1ea 100644
--- a/config/initializers/request_profiler.rb
+++ b/config/initializers/request_profiler.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
Rails.application.configure do |config|
- config.middleware.use(Gitlab::RequestProfiler::Middleware)
config.middleware.use(Gitlab::Middleware::Speedscope)
config.middleware.use(Gitlab::Middleware::MemoryReport)
end
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 25984c45318..29df6da6ef1 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -8,13 +8,13 @@ end
def enable_reliable_fetch?
return true unless Feature::FlipperFeature.table_exists?
- Feature.enabled?(:gitlab_sidekiq_reliable_fetcher, type: :ops, default_enabled: true)
+ Feature.enabled?(:gitlab_sidekiq_reliable_fetcher, type: :ops)
end
def enable_semi_reliable_fetch_mode?
return true unless Feature::FlipperFeature.table_exists?
- Feature.enabled?(:gitlab_sidekiq_enable_semi_reliable_fetcher, type: :ops, default_enabled: true)
+ Feature.enabled?(:gitlab_sidekiq_enable_semi_reliable_fetcher, type: :ops)
end
# Custom Queues configuration
@@ -56,13 +56,24 @@ Sidekiq.configure_server do |config|
config.on :startup do
# Clear any connections that might have been obtained before starting
# Sidekiq (e.g. in an initializer).
- ActiveRecord::Base.clear_all_connections!
+ ActiveRecord::Base.clear_all_connections! # rubocop:disable Database/MultipleDatabases
# Start monitor to track running jobs. By default, cancel job is not enabled
# To cancel job, it requires `SIDEKIQ_MONITOR_WORKER=1` to enable notification channel
Gitlab::SidekiqDaemon::Monitor.instance.start
Gitlab::SidekiqDaemon::MemoryKiller.instance.start if enable_sidekiq_memory_killer && use_sidekiq_daemon_memory_killer
+
+ first_sidekiq_worker = !ENV['SIDEKIQ_WORKER_ID'] || ENV['SIDEKIQ_WORKER_ID'] == '0'
+ health_checks = Settings.monitoring.sidekiq_health_checks
+
+ # Start health-check in-process server
+ if first_sidekiq_worker && health_checks.enabled
+ Gitlab::HealthChecks::Server.instance(
+ address: health_checks.address,
+ port: health_checks.port
+ ).start
+ end
end
if enable_reliable_fetch?
diff --git a/config/initializers/validate_database_config.rb b/config/initializers/validate_database_config.rb
index d5e73cdc1ee..d381dbac2ed 100644
--- a/config/initializers/validate_database_config.rb
+++ b/config/initializers/validate_database_config.rb
@@ -4,12 +4,6 @@ if Gitlab::Utils.to_boolean(ENV['SKIP_DATABASE_CONFIG_VALIDATION'], default: fal
return
end
-if Rails.application.config.uses_legacy_database_config
- warn "WARNING: This installation of GitLab uses a deprecated syntax for 'config/database.yml'. " \
- "The support for this syntax will be removed in 15.0. " \
- "More information can be found here: https://gitlab.com/gitlab-org/gitlab/-/issues/338182"
-end
-
if configurations = ActiveRecord::Base.configurations.configurations
if configurations.first.name != Gitlab::Database::MAIN_DATABASE_NAME
raise "ERROR: This installation of GitLab uses unsupported 'config/database.yml'. " \
diff --git a/config/initializers_before_autoloader/004_zeitwerk.rb b/config/initializers_before_autoloader/004_zeitwerk.rb
index ff96a84166a..db0688d1559 100644
--- a/config/initializers_before_autoloader/004_zeitwerk.rb
+++ b/config/initializers_before_autoloader/004_zeitwerk.rb
@@ -27,7 +27,6 @@ Rails.autoloaders.each do |autoloader|
'dn' => 'DN',
'gitlab_cli_activity_unique_counter' => 'GitLabCliActivityUniqueCounter',
'global_id_type' => 'GlobalIDType',
- 'global_id_compatibility' => 'GlobalIDCompatibility',
'hll' => 'HLL',
'hll_redis_counter' => 'HLLRedisCounter',
'redis_hll_metric' => 'RedisHLLMetric',
diff --git a/config/metrics/aggregates/code_review.yml b/config/metrics/aggregates/code_review.yml
index 004f155864e..a25222b8d6b 100644
--- a/config/metrics/aggregates/code_review.yml
+++ b/config/metrics/aggregates/code_review.yml
@@ -75,6 +75,12 @@
- 'i_code_review_post_merge_submit_cherry_pick_modal'
- 'i_code_review_user_jetbrains_api_request'
- 'i_code_review_user_gitlab_cli_api_request'
+ - 'i_code_review_user_create_note_in_ipynb_diff'
+ - 'i_code_review_user_create_note_in_ipynb_diff_mr'
+ - 'i_code_review_user_create_note_in_ipynb_diff_commit'
+ - 'i_code_review_create_note_in_ipynb_diff'
+ - 'i_code_review_create_note_in_ipynb_diff_mr'
+ - 'i_code_review_create_note_in_ipynb_diff_commit'
- name: code_review_category_monthly_active_users
operator: OR
source: redis
@@ -140,6 +146,12 @@
- 'i_code_review_post_merge_click_cherry_pick'
- 'i_code_review_post_merge_submit_revert_modal'
- 'i_code_review_post_merge_submit_cherry_pick_modal'
+ - 'i_code_review_user_create_note_in_ipynb_diff'
+ - 'i_code_review_user_create_note_in_ipynb_diff_mr'
+ - 'i_code_review_user_create_note_in_ipynb_diff_commit'
+ - 'i_code_review_create_note_in_ipynb_diff'
+ - 'i_code_review_create_note_in_ipynb_diff_mr'
+ - 'i_code_review_create_note_in_ipynb_diff_commit'
- name: code_review_extension_category_monthly_active_users
operator: OR
source: redis
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 9c4356db883..934d9f77c24 100644
--- a/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_28d/20210216175548_ci_pipeline_config_auto_devops.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
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
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 b53069b4962..76e24559ff2 100644
--- a/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
+++ b/config/metrics/counts_28d/20210216180327_action_monthly_active_users_ide_edit.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit
description: Number of unique users per month who edited a file from any web editor
product_section: dev
diff --git a/config/metrics/counts_28d/20210216180814_events.yml b/config/metrics/counts_28d/20210216180814_events.yml
index 082dc3b8853..8e974979ae8 100644
--- a/config/metrics/counts_28d/20210216180814_events.yml
+++ b/config/metrics/counts_28d/20210216180814_events.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
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
diff --git a/config/metrics/counts_28d/20210216181923_successful_deployments.yml b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
index 2bf7204facc..675a7972ddc 100644
--- a/config/metrics/counts_28d/20210216181923_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181923_successful_deployments.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts_monthly.successful_deployments
description: Total successful deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181924_failed_deployments.yml b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
index 1a0840f2cee..b173c4dd125 100644
--- a/config/metrics/counts_28d/20210216181924_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181924_failed_deployments.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts_monthly.failed_deployments
description: Total failed deployments
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181937_failed_deployments.yml b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
index 78622151915..00967fc519c 100644
--- a/config/metrics/counts_28d/20210216181937_failed_deployments.yml
+++ b/config/metrics/counts_28d/20210216181937_failed_deployments.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage_monthly.release.failed_deployments
description: Disinct users who initiated a failed deployment.
product_section: ops
diff --git a/config/metrics/counts_28d/20210216181941_successful_deployments.yml b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
index 10c9de1817f..cc176feb5d3 100644
--- a/config/metrics/counts_28d/20210216181941_successful_deployments.yml
+++ b/config/metrics/counts_28d/20210216181941_successful_deployments.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage_monthly.release.successful_deployments
description: Disinct users who initiated a successful deployment.
product_section: ops
diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml
index 1e9f66b0d22..3718bef319c 100644
--- a/config/metrics/counts_28d/20210216182051_protected_branches.yml
+++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage_monthly.create.protected_branches
description: Count of users creating projects with repositories making use of at least
one protected branch in last 28 days.
diff --git a/config/metrics/counts_28d/20210216183644_gitlab_project.yml b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
index a370f8d5f52..c74e5c56a8d 100644
--- a/config/metrics/counts_28d/20210216183644_gitlab_project.yml
+++ b/config/metrics/counts_28d/20210216183644_gitlab_project.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitlab_project
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183646_gitlab.yml b/config/metrics/counts_28d/20210216183646_gitlab.yml
index a19c8d6ac0e..511f9cd279c 100644
--- a/config/metrics/counts_28d/20210216183646_gitlab.yml
+++ b/config/metrics/counts_28d/20210216183646_gitlab.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitlab
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183648_github.yml b/config/metrics/counts_28d/20210216183648_github.yml
index c33cc1809af..0894998c7c4 100644
--- a/config/metrics/counts_28d/20210216183648_github.yml
+++ b/config/metrics/counts_28d/20210216183648_github.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: github
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183650_bitbucket.yml b/config/metrics/counts_28d/20210216183650_bitbucket.yml
index 557a38cad1c..2f205a8995a 100644
--- a/config/metrics/counts_28d/20210216183650_bitbucket.yml
+++ b/config/metrics/counts_28d/20210216183650_bitbucket.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: bitbucket
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
index d9f255a0b2d..7f470f7955f 100644
--- a/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
+++ b/config/metrics/counts_28d/20210216183652_bitbucket_server.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: bitbucket_server
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183653_gitea.yml b/config/metrics/counts_28d/20210216183653_gitea.yml
index 996749bba7d..37e3ed2bf43 100644
--- a/config/metrics/counts_28d/20210216183653_gitea.yml
+++ b/config/metrics/counts_28d/20210216183653_gitea.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitea
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183655_git.yml b/config/metrics/counts_28d/20210216183655_git.yml
index 20fde277b5d..daf8875ad12 100644
--- a/config/metrics/counts_28d/20210216183655_git.yml
+++ b/config/metrics/counts_28d/20210216183655_git.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: git
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183657_manifest.yml b/config/metrics/counts_28d/20210216183657_manifest.yml
index 00ded898baa..d597be585f3 100644
--- a/config/metrics/counts_28d/20210216183657_manifest.yml
+++ b/config/metrics/counts_28d/20210216183657_manifest.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: manifest
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
index a27be901a49..68d5d3604a0 100644
--- a/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183659_gitlab_migration.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountBulkImportsEntitiesMetric
+options:
+ source_type: project_entity
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183703_fogbugz.yml b/config/metrics/counts_28d/20210216183703_fogbugz.yml
index ea7ecc67a8b..e3286c11f2a 100644
--- a/config/metrics/counts_28d/20210216183703_fogbugz.yml
+++ b/config/metrics/counts_28d/20210216183703_fogbugz.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: fogbugz
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183705_phabricator.yml b/config/metrics/counts_28d/20210216183705_phabricator.yml
index b982bdace5a..942f5e9dabc 100644
--- a/config/metrics/counts_28d/20210216183705_phabricator.yml
+++ b/config/metrics/counts_28d/20210216183705_phabricator.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: phabricator
distribution:
- ce
- ee
diff --git a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
index b44b46ddf1d..4c80d88c922 100644
--- a/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
+++ b/config/metrics/counts_28d/20210216183711_gitlab_migration.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: 28d
data_source: database
+instrumentation_class: CountBulkImportsEntitiesMetric
+options:
+ source_type: group_entity
distribution:
- ce
- ee
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 6c33950166a..19e4aa14577 100644
--- a/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
+++ b/config/metrics/counts_28d/20210216184303_o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: redis_hll_counters.pipeline_authoring.o_pipeline_authoring_unique_users_committing_ciconfigfile_monthly
description: Monthly unique user count doing commits which contains the CI config
file
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 b8ca7aaa5ad..df70ef7c718 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
@@ -88,7 +88,9 @@ options:
- p_ci_templates_jobs_load_performance_testing
- p_ci_templates_jobs_helm_2to3
- p_ci_templates_jobs_sast
+ - p_ci_templates_jobs_sast_latest
- p_ci_templates_jobs_secret_detection
+ - p_ci_templates_jobs_secret_detection_latest
- p_ci_templates_jobs_code_intelligence
- p_ci_templates_jobs_code_quality
- p_ci_templates_jobs_dependency_scanning
diff --git a/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
index 74f9406a133..d5656bcc80b 100644
--- a/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
+++ b/config/metrics/counts_28d/20210715094458_releases_with_milestones.yml
@@ -1,7 +1,7 @@
---
key_path: usage_activity_by_stage_monthly.release.releases_with_milestones
description: Unique users creating releases with milestones associated
-performance_indicator_type: [smau]
+performance_indicator_type: []
product_section: ops
product_stage: release
product_group: 'group::release'
diff --git a/config/metrics/counts_28d/20210901221659_p_ci_templates_security_cluster_image_scanning_monthly.yml b/config/metrics/counts_28d/20210901221659_p_ci_templates_security_cluster_image_scanning_monthly.yml
index f3a696627fe..4e1407fd8e3 100644
--- a/config/metrics/counts_28d/20210901221659_p_ci_templates_security_cluster_image_scanning_monthly.yml
+++ b/config/metrics/counts_28d/20210901221659_p_ci_templates_security_cluster_image_scanning_monthly.yml
@@ -6,7 +6,9 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
+milestone_removed: '15.0'
+removed_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87000'
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
time_frame: 28d
diff --git a/config/metrics/counts_28d/20210901221849_p_ci_templates_managed_cluster_applications_monthly.yml b/config/metrics/counts_28d/20210901221849_p_ci_templates_managed_cluster_applications_monthly.yml
index 92c0ea14727..6f98773d30a 100644
--- a/config/metrics/counts_28d/20210901221849_p_ci_templates_managed_cluster_applications_monthly.yml
+++ b/config/metrics/counts_28d/20210901221849_p_ci_templates_managed_cluster_applications_monthly.yml
@@ -6,9 +6,11 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267
+milestone_removed: '15.0'
time_frame: 28d
data_source: redis_hll
data_category: optional
diff --git a/config/metrics/counts_28d/20210901221932_p_ci_templates_serverless_monthly.yml b/config/metrics/counts_28d/20210901221932_p_ci_templates_serverless_monthly.yml
index 9dab50a9e6c..c30375c57d4 100644
--- a/config/metrics/counts_28d/20210901221932_p_ci_templates_serverless_monthly.yml
+++ b/config/metrics/counts_28d/20210901221932_p_ci_templates_serverless_monthly.yml
@@ -6,9 +6,11 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267
+milestone_removed: '15.0'
time_frame: 28d
data_source: redis_hll
data_category: optional
diff --git a/config/metrics/counts_28d/20210901223916_p_ci_templates_implicit_security_cluster_image_scanning_monthly.yml b/config/metrics/counts_28d/20210901223916_p_ci_templates_implicit_security_cluster_image_scanning_monthly.yml
index ddf785a71bd..25c535315d2 100644
--- a/config/metrics/counts_28d/20210901223916_p_ci_templates_implicit_security_cluster_image_scanning_monthly.yml
+++ b/config/metrics/counts_28d/20210901223916_p_ci_templates_implicit_security_cluster_image_scanning_monthly.yml
@@ -6,7 +6,9 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
+milestone_removed: '15.0'
+removed_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87000'
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
time_frame: 28d
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 9a2d93e597e..9704fcc43dd 100644
--- a/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
+++ b/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
@@ -12,7 +12,7 @@ milestone: "14.3"
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70061
time_frame: 28d
data_source: database
-data_category: optional
+data_category: operational
performance_indicator_type: []
distribution:
- ce
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 54118e30127..9a829f0b172 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
@@ -11,7 +11,7 @@ milestone: '14.6'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75187
time_frame: 28d
data_source: redis_hll
-data_category: optional
+data_category: operational
instrumentation_class: RedisHLLMetric
performance_indicator_type: []
distribution:
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 9a2e194ed1a..b053926a87a 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
@@ -11,7 +11,7 @@ milestone: '14.6'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75187
time_frame: 28d
data_source: redis_hll
-data_category: optional
+data_category: operational
instrumentation_class: RedisHLLMetric
performance_indicator_type: []
distribution:
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
new file mode 100644
index 00000000000..260bae1061f
--- /dev/null
+++ b/config/metrics/counts_28d/20220308234005_p_ci_templates_jobs_sast_latest_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_sast_latest_monthly
+description: Weekly counts for SAST CI Latest template (Jobs folder)
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_latest
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
new file mode 100644
index 00000000000..163fc9c9ad6
--- /dev/null
+++ b/config/metrics/counts_28d/20220309001640_p_ci_templates_jobs_secret_detection_latest_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_secret_detection_latest_monthly
+description: Weekly counts for Secret Detection CI Latest template (Security folder)
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_secret_detection_latest
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
new file mode 100644
index 00000000000..2d3ca5386f7
--- /dev/null
+++ b/config/metrics/counts_28d/20220310213320_p_ci_templates_implicit_jobs_secret_detection_latest_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_secret_detection_latest_monthly
+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_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_secret_detection_latest
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
new file mode 100644
index 00000000000..72d37ffb037
--- /dev/null
+++ b/config/metrics/counts_28d/20220310213749_p_ci_templates_implicit_jobs_sast_latest_monthly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_latest_monthly
+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_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_sast_latest
diff --git a/config/metrics/counts_28d/20220428154012_live_preview.yml b/config/metrics/counts_28d/20220428154012_live_preview.yml
new file mode 100644
index 00000000000..8d2954cb825
--- /dev/null
+++ b/config/metrics/counts_28d/20220428154012_live_preview.yml
@@ -0,0 +1,26 @@
+---
+data_category: optional
+key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_live_preview_edit
+description: Count of monthly unique users that successfully connect to Live Preview
+product_section: dev
+product_stage: create
+product_group: group::editor
+product_category: web_ide
+value_type: number
+status: active
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85420
+time_frame: 28d
+data_source: redis_hll
+instrumentation_class: RedisHLLMetric
+options:
+ events:
+ - g_edit_by_live_preview
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+performance_indicator_type: []
+milestone: "15.0"
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
new file mode 100644
index 00000000000..b14d684b908
--- /dev/null
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_jobs_sast_iac_monthly.yml
@@ -0,0 +1,26 @@
+---
+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_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_iac
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
new file mode 100644
index 00000000000..0925312f33a
--- /dev/null
+++ b/config/metrics/counts_28d/20220510024223_p_ci_templates_security_sast_iac_monthly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_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_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_security_sast_iac
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 b0cca62db12..a3696ba0098 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
@@ -88,7 +88,9 @@ options:
- p_ci_templates_jobs_load_performance_testing
- p_ci_templates_jobs_helm_2to3
- p_ci_templates_jobs_sast
+ - p_ci_templates_jobs_sast_latest
- p_ci_templates_jobs_secret_detection
+ - p_ci_templates_jobs_secret_detection_latest
- p_ci_templates_jobs_code_intelligence
- p_ci_templates_jobs_code_quality
- p_ci_templates_jobs_dependency_scanning
diff --git a/config/metrics/counts_7d/20210901221654_p_ci_templates_security_cluster_image_scanning_weekly.yml b/config/metrics/counts_7d/20210901221654_p_ci_templates_security_cluster_image_scanning_weekly.yml
index 200f46ac22d..b7fd799f8a6 100644
--- a/config/metrics/counts_7d/20210901221654_p_ci_templates_security_cluster_image_scanning_weekly.yml
+++ b/config/metrics/counts_7d/20210901221654_p_ci_templates_security_cluster_image_scanning_weekly.yml
@@ -6,7 +6,9 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
+milestone_removed: '15.0'
+removed_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87000'
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
time_frame: 7d
diff --git a/config/metrics/counts_7d/20210901221844_p_ci_templates_managed_cluster_applications_weekly.yml b/config/metrics/counts_7d/20210901221844_p_ci_templates_managed_cluster_applications_weekly.yml
index 592f52a0681..b93751d3c30 100644
--- a/config/metrics/counts_7d/20210901221844_p_ci_templates_managed_cluster_applications_weekly.yml
+++ b/config/metrics/counts_7d/20210901221844_p_ci_templates_managed_cluster_applications_weekly.yml
@@ -6,9 +6,11 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267
+milestone_removed: '15.0'
time_frame: 7d
data_source: redis_hll
data_category: optional
diff --git a/config/metrics/counts_7d/20210901221928_p_ci_templates_serverless_weekly.yml b/config/metrics/counts_7d/20210901221928_p_ci_templates_serverless_weekly.yml
index 86c3ca6e3df..060893ca349 100644
--- a/config/metrics/counts_7d/20210901221928_p_ci_templates_serverless_weekly.yml
+++ b/config/metrics/counts_7d/20210901221928_p_ci_templates_serverless_weekly.yml
@@ -6,9 +6,11 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267
+milestone_removed: '15.0'
time_frame: 7d
data_source: redis_hll
data_category: optional
diff --git a/config/metrics/counts_7d/20210901223912_p_ci_templates_implicit_security_cluster_image_scanning_weekly.yml b/config/metrics/counts_7d/20210901223912_p_ci_templates_implicit_security_cluster_image_scanning_weekly.yml
index e1ee3f9fd1d..04ba99db306 100644
--- a/config/metrics/counts_7d/20210901223912_p_ci_templates_implicit_security_cluster_image_scanning_weekly.yml
+++ b/config/metrics/counts_7d/20210901223912_p_ci_templates_implicit_security_cluster_image_scanning_weekly.yml
@@ -6,7 +6,9 @@ product_stage: ''
product_group: ''
product_category: ''
value_type: number
-status: active
+status: removed
+milestone_removed: '15.0'
+removed_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87000'
milestone: '14.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69204
time_frame: 7d
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
new file mode 100644
index 00000000000..1b65c7b1c84
--- /dev/null
+++ b/config/metrics/counts_7d/20220308233959_p_ci_templates_jobs_sast_latest_weekly.yml
@@ -0,0 +1,25 @@
+---
+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_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_latest
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
new file mode 100644
index 00000000000..64760e33d59
--- /dev/null
+++ b/config/metrics/counts_7d/20220309001635_p_ci_templates_jobs_secret_detection_latest_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_jobs_secret_detection_latest_weekly
+description: Weekly counts for Secret Detection CI Latest template (Jobs folder)
+product_section: sec
+product_stage: secure
+product_group: group::static analysis
+product_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_secret_detection_latest
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
new file mode 100644
index 00000000000..13d03d6c833
--- /dev/null
+++ b/config/metrics/counts_7d/20220310213315_p_ci_templates_implicit_jobs_secret_detection_latest_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_secret_detection_latest_weekly
+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_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_secret_detection_latest
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
new file mode 100644
index 00000000000..74eb8fffa9a
--- /dev/null
+++ b/config/metrics/counts_7d/20220310213743_p_ci_templates_implicit_jobs_sast_latest_weekly.yml
@@ -0,0 +1,25 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_implicit_jobs_sast_latest_weekly
+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_category: static_application_security_testing
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81847'
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_implicit_jobs_sast_latest
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
new file mode 100644
index 00000000000..9bba92b5162
--- /dev/null
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_jobs_sast_iac_weekly.yml
@@ -0,0 +1,26 @@
+---
+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_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_jobs_sast_iac
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
new file mode 100644
index 00000000000..c28dfd94cad
--- /dev/null
+++ b/config/metrics/counts_7d/20220510024437_p_ci_templates_security_sast_iac_weekly.yml
@@ -0,0 +1,26 @@
+---
+key_path: redis_hll_counters.ci_templates.p_ci_templates_security_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_category: SAST
+value_type: number
+status: active
+milestone: "15.0"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86275
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
+options:
+ events:
+ - p_ci_templates_security_sast_iac
diff --git a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
index ef2b37bb001..64d7a9434be 100644
--- a/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
+++ b/config/metrics/counts_all/20210216175446_network_policy_forwards.yml
@@ -8,7 +8,9 @@ product_stage: protect
product_group: group::container security
product_category: container_network_security
value_type: number
-status: active
+status: removed
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86351
+milestone_removed: 15.0
time_frame: all
data_source: redis
distribution:
diff --git a/config/metrics/counts_all/20210216175448_network_policy_drops.yml b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
index 933363c0a14..d3a874253f9 100644
--- a/config/metrics/counts_all/20210216175448_network_policy_drops.yml
+++ b/config/metrics/counts_all/20210216175448_network_policy_drops.yml
@@ -8,7 +8,9 @@ product_stage: protect
product_group: group::container security
product_category: container_network_security
value_type: number
-status: active
+status: removed
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86351
+milestone_removed: "15.0"
time_frame: all
data_source: redis
distribution:
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 d5bfa361905..7dc2a7a756b 100644
--- a/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
+++ b/config/metrics/counts_all/20210216175516_ci_pipeline_config_auto_devops.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.ci_pipeline_config_auto_devops
description: Total pipelines from an Auto DevOps template
product_section: ops
diff --git a/config/metrics/counts_all/20210216175525_ci_builds.yml b/config/metrics/counts_all/20210216175525_ci_builds.yml
index 885996afdf9..cfa86761e7e 100644
--- a/config/metrics/counts_all/20210216175525_ci_builds.yml
+++ b/config/metrics/counts_all/20210216175525_ci_builds.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage.verify.ci_builds
description: Unique count of builds in project
product_section: ops
diff --git a/config/metrics/counts_all/20210216180638_gitlab_project.yml b/config/metrics/counts_all/20210216180638_gitlab_project.yml
index 9f31a887b87..a3991441a70 100644
--- a/config/metrics/counts_all/20210216180638_gitlab_project.yml
+++ b/config/metrics/counts_all/20210216180638_gitlab_project.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitlab_project
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180639_gitlab.yml b/config/metrics/counts_all/20210216180639_gitlab.yml
index a19b04ac6e1..3497675a00c 100644
--- a/config/metrics/counts_all/20210216180639_gitlab.yml
+++ b/config/metrics/counts_all/20210216180639_gitlab.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitlab
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180641_github.yml b/config/metrics/counts_all/20210216180641_github.yml
index a6ab0bd5b7f..930c96898de 100644
--- a/config/metrics/counts_all/20210216180641_github.yml
+++ b/config/metrics/counts_all/20210216180641_github.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: github
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180643_bitbucket.yml b/config/metrics/counts_all/20210216180643_bitbucket.yml
index 9239f592c23..2e612b09057 100644
--- a/config/metrics/counts_all/20210216180643_bitbucket.yml
+++ b/config/metrics/counts_all/20210216180643_bitbucket.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: bitbucket
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180645_bitbucket_server.yml b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
index bbeb3b2c7d3..fc5df480f75 100644
--- a/config/metrics/counts_all/20210216180645_bitbucket_server.yml
+++ b/config/metrics/counts_all/20210216180645_bitbucket_server.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: bitbucket_server
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180647_gitea.yml b/config/metrics/counts_all/20210216180647_gitea.yml
index 448663cda8b..584d0f26cb1 100644
--- a/config/metrics/counts_all/20210216180647_gitea.yml
+++ b/config/metrics/counts_all/20210216180647_gitea.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: gitea
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180649_git.yml b/config/metrics/counts_all/20210216180649_git.yml
index 3fee6391a56..d5569d2a56e 100644
--- a/config/metrics/counts_all/20210216180649_git.yml
+++ b/config/metrics/counts_all/20210216180649_git.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: git
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180650_manifest.yml b/config/metrics/counts_all/20210216180650_manifest.yml
index af2a3567e74..e6578f840bb 100644
--- a/config/metrics/counts_all/20210216180650_manifest.yml
+++ b/config/metrics/counts_all/20210216180650_manifest.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: manifest
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180652_gitlab_migration.yml b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
index 2652673fff7..7e9e9b6d261 100644
--- a/config/metrics/counts_all/20210216180652_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180652_gitlab_migration.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountBulkImportsEntitiesMetric
+options:
+ source_type: project_entity
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180656_fogbugz.yml b/config/metrics/counts_all/20210216180656_fogbugz.yml
index 217a8d6013c..ef5baf27291 100644
--- a/config/metrics/counts_all/20210216180656_fogbugz.yml
+++ b/config/metrics/counts_all/20210216180656_fogbugz.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: fogbugz
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180658_phabricator.yml b/config/metrics/counts_all/20210216180658_phabricator.yml
index becf44044df..1f48180200b 100644
--- a/config/metrics/counts_all/20210216180658_phabricator.yml
+++ b/config/metrics/counts_all/20210216180658_phabricator.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountImportedProjectsMetric
+options:
+ import_type: phabricator
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180703_gitlab_migration.yml b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
index b25e0d72ad8..a4aca8f7859 100644
--- a/config/metrics/counts_all/20210216180703_gitlab_migration.yml
+++ b/config/metrics/counts_all/20210216180703_gitlab_migration.yml
@@ -10,6 +10,9 @@ value_type: number
status: active
time_frame: all
data_source: database
+instrumentation_class: CountBulkImportsEntitiesMetric
+options:
+ source_type: group_entity
distribution:
- ce
- ee
diff --git a/config/metrics/counts_all/20210216180754_events.yml b/config/metrics/counts_all/20210216180754_events.yml
index dce6352d266..85875448f00 100644
--- a/config/metrics/counts_all/20210216180754_events.yml
+++ b/config/metrics/counts_all/20210216180754_events.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage.manage.events
description: Number of distinct users who have generated a manage event
product_section: dev
diff --git a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
index c79a1ee24b9..c753ae06c09 100644
--- a/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
+++ b/config/metrics/counts_all/20210216180931_projects_prometheus_active.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.projects_prometheus_active
description: Count of projects with active integrations for Prometheus
product_section: ops
diff --git a/config/metrics/counts_all/20210216181249_feature_flags.yml b/config/metrics/counts_all/20210216181249_feature_flags.yml
index 17feacedd54..70e6e6c04eb 100644
--- a/config/metrics/counts_all/20210216181249_feature_flags.yml
+++ b/config/metrics/counts_all/20210216181249_feature_flags.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.feature_flags
description: Number of feature flag toggles
product_section: ops
diff --git a/config/metrics/counts_all/20210216181914_environments.yml b/config/metrics/counts_all/20210216181914_environments.yml
index 23bb7bf3dda..ce6fb171f79 100644
--- a/config/metrics/counts_all/20210216181914_environments.yml
+++ b/config/metrics/counts_all/20210216181914_environments.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.environments
description: Total available and stopped environments
product_section: ops
diff --git a/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml b/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
index 5a7073d3525..7a524dee720 100644
--- a/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
+++ b/config/metrics/counts_all/20210423005644_i_analytics_dev_ops_adoption.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: analytics_unique_visits.i_analytics_dev_ops_adoption
description: Unique users viewing analytics devops adoption
product_section: dev
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 b23d63a3ff8..d0331a65b0b 100644
--- a/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
+++ b/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.ci_runners_instance_type_active
name: "count_active_instance_ci_runners"
description: Total active Shared (Instance) Runners
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 d09fd9e7578..b1a360df561 100644
--- a/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
+++ b/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.ci_runners_group_type_active
name: "count_active_group_ci_runners"
description: Total active Group Runners
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 11b5626dc1e..b344f64c250 100644
--- a/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
+++ b/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: counts.ci_runners_project_type_active
name: "count_active_project_ci_runners"
description: Total active Specific (Project) Runners
diff --git a/config/metrics/counts_all/20210514141520_project_imports_total.yml b/config/metrics/counts_all/20210514141520_project_imports_total.yml
index 1c5a42c4892..2608714799a 100644
--- a/config/metrics/counts_all/20210514141520_project_imports_total.yml
+++ b/config/metrics/counts_all/20210514141520_project_imports_total.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: usage_activity_by_stage.manage.project_imports.total
description: Number of projects imported
product_section: dev
diff --git a/config/metrics/license/20210204124829_active_user_count.yml b/config/metrics/license/20210204124829_active_user_count.yml
index c6e0895a918..e4347ebef9d 100644
--- a/config/metrics/license/20210204124829_active_user_count.yml
+++ b/config/metrics/license/20210204124829_active_user_count.yml
@@ -5,7 +5,7 @@ product_section: growth
product_stage: growth
product_group: group::product intelligence
product_category: collection
-value_type: string
+value_type: number
status: active
milestone: "<13.9"
data_category: subscription
diff --git a/config/metrics/schema.json b/config/metrics/schema.json
index 09376e32ef0..bb024eac8c1 100644
--- a/config/metrics/schema.json
+++ b/config/metrics/schema.json
@@ -43,6 +43,9 @@
"introduced_by_url": {
"type": ["string", "null"]
},
+ "removed_by_url": {
+ "type": ["string", "null"]
+ },
"repair_issue_url": {
"type": ["string"]
},
diff --git a/config/metrics/settings/20210204124912_prometheus_enabled.yml b/config/metrics/settings/20210204124912_prometheus_enabled.yml
index 236e1656a6b..e19d5ff781a 100644
--- a/config/metrics/settings/20210204124912_prometheus_enabled.yml
+++ b/config/metrics/settings/20210204124912_prometheus_enabled.yml
@@ -1,5 +1,5 @@
---
-data_category: optional
+data_category: operational
key_path: prometheus_enabled
description: Whether the bundled Prometheus is enabled
product_section: growth
diff --git a/config/object_store_settings.rb b/config/object_store_settings.rb
index 53fbfb088db..ea954b7061a 100644
--- a/config/object_store_settings.rb
+++ b/config/object_store_settings.rb
@@ -16,15 +16,26 @@ class ObjectStoreSettings
# we don't need to raise an error in that case
ALLOWED_INCOMPLETE_TYPES = %w(pages).freeze
+ # A fallback switch in case anyone gets a trouble with background upload removal
+ # Epic: https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/734
+ LEGACY_BACKGROUND_UPLOADS_ENV = "GITLAB_LEGACY_BACKGROUND_UPLOADS"
+
attr_accessor :settings
# Legacy parser
- def self.legacy_parse(object_store)
+ def self.legacy_parse(object_store, object_store_type)
object_store ||= Settingslogic.new({})
object_store['enabled'] = false if object_store['enabled'].nil?
object_store['remote_directory'] ||= nil
- object_store['direct_upload'] = false if object_store['direct_upload'].nil?
- object_store['background_upload'] = true if object_store['background_upload'].nil?
+
+ if support_legacy_background_upload?(object_store_type)
+ object_store['direct_upload'] = false
+ object_store['background_upload'] = true
+ else
+ object_store['direct_upload'] = true
+ object_store['background_upload'] = false
+ end
+
object_store['proxy_download'] = false if object_store['proxy_download'].nil?
object_store['storage_options'] ||= {}
@@ -33,6 +44,10 @@ class ObjectStoreSettings
object_store
end
+ def self.support_legacy_background_upload?(object_store_type)
+ ENV[LEGACY_BACKGROUND_UPLOADS_ENV].to_s.split(',').map(&:strip).include?(object_store_type)
+ end
+
def initialize(settings)
@settings = settings
end
diff --git a/config/pseudonymizer.yml b/config/pseudonymizer.yml
deleted file mode 100644
index cd8db9d8dc5..00000000000
--- a/config/pseudonymizer.yml
+++ /dev/null
@@ -1,472 +0,0 @@
-tables:
- approvals:
- whitelist:
- - id
- - merge_request_id
- - user_id
- - created_at
- - updated_at
- approver_groups:
- whitelist:
- - id
- - target_type
- - group_id
- - created_at
- - updated_at
- board_assignees:
- whitelist:
- - id
- - board_id
- - assignee_id
- board_labels:
- whitelist:
- - id
- - board_id
- - label_id
- boards:
- whitelist:
- - id
- - project_id
- - created_at
- - updated_at
- - milestone_id
- - group_id
- - weight
- epic_issues:
- whitelist:
- - id
- - epic_id
- - issue_id
- - relative_position
- epic_metrics:
- whitelist:
- - id
- - epic_id
- - created_at
- - updated_at
- epics:
- whitelist:
- - id
- - group_id
- - author_id
- - assignee_id
- - iid
- - updated_by_id
- - last_edited_by_id
- - lock_version
- - start_date
- - end_date
- - last_edited_at
- - created_at
- - updated_at
- - title
- - description
- issue_assignees:
- whitelist:
- - user_id
- - issue_id
- issue_links:
- whitelist:
- - id
- - source_id
- - target_id
- - created_at
- - updated_at
- issue_metrics:
- whitelist:
- - id
- - issue_id
- - first_mentioned_in_commit_at
- - first_associated_with_milestone_at
- - first_added_to_board_at
- - created_at
- - updated_at
- issues:
- whitelist:
- - id
- - title
- - author_id
- - project_id
- - created_at
- - confidential
- - updated_at
- - description
- - milestone_id
- - state_id
- - updated_by_id
- - weight
- - due_date
- - moved_to_id
- - duplicated_to_id
- - lock_version
- - time_estimate
- - last_edited_at
- - last_edited_by_id
- - discussion_locked
- - closed_at
- label_links:
- whitelist:
- - id
- - label_id
- - target_id
- - target_type
- - created_at
- - updated_at
- label_priorities:
- whitelist:
- - id
- - project_id
- - label_id
- - priority
- - created_at
- - updated_at
- labels:
- whitelist:
- - id
- - title
- - color
- - project_id
- - created_at
- - updated_at
- - template
- - type
- - group_id
- licenses:
- whitelist:
- - id
- - created_at
- - updated_at
- merge_request_diffs:
- whitelist:
- - id
- - state
- - merge_request_id
- - created_at
- - updated_at
- - base_commit_sha
- - real_size
- - head_commit_sha
- - start_commit_sha
- - commits_count
- merge_request_metrics:
- whitelist:
- - id
- - merge_request_id
- - latest_build_started_at
- - latest_build_finished_at
- - first_deployed_to_production_at
- - merged_at
- - created_at
- - updated_at
- - pipeline_id
- - merged_by_id
- - latest_closed_by_id
- - latest_closed_at
- merge_requests:
- whitelist:
- - id
- - target_branch
- - source_branch
- - source_project_id
- - author_id
- - assignee_id
- - created_at
- - updated_at
- - milestone_id
- - state_id
- - merge_status
- - target_project_id
- - updated_by_id
- - merge_error
- - merge_params
- - merge_when_pipeline_succeeds
- - merge_user_id
- - approvals_before_merge
- - lock_version
- - time_estimate
- - squash
- - last_edited_at
- - last_edited_by_id
- - head_pipeline_id
- - discussion_locked
- - latest_merge_request_diff_id
- - allow_maintainer_to_push
- merge_requests_closing_issues:
- whitelist:
- - id
- - merge_request_id
- - issue_id
- - created_at
- - updated_at
- milestones:
- whitelist:
- - id
- - project_id
- - due_date
- - created_at
- - updated_at
- - state
- - start_date
- - group_id
- namespace_statistics:
- whitelist:
- - id
- - namespace_id
- - shared_runners_seconds
- - shared_runners_seconds_last_reset
- namespaces:
- whitelist:
- - id
- - name
- - path
- - owner_id
- - created_at
- - updated_at
- - type
- - avatar
- - membership_lock
- - share_with_group_lock
- - visibility_level
- - request_access_enabled
- - ldap_sync_status
- - ldap_sync_error
- - ldap_sync_last_update_at
- - ldap_sync_last_successful_update_at
- - ldap_sync_last_sync_at
- - lfs_enabled
- - parent_id
- - shared_runners_minutes_limit
- - repository_size_limit
- - require_two_factor_authentication
- - two_factor_grace_period
- - project_creation_level
- members:
- whitelist:
- - id
- - access_level
- - source_id
- - source_type
- - user_id
- - notification_level
- - type
- - created_by_id
- - invite_email
- - invite_accepted_at
- - requested_at
- - expires_at
- - ldap
- - override
- notification_settings:
- whitelist:
- - id
- - user_id
- - source_id
- - source_type
- - level
- - created_at
- - updated_at
- - new_note
- - new_issue
- - reopen_issue
- - close_issue
- - reassign_issue
- - new_merge_request
- - reopen_merge_request
- - close_merge_request
- - reassign_merge_request
- - merge_merge_request
- - failed_pipeline
- - success_pipeline
- project_authorizations:
- whitelist:
- - user_id
- - project_id
- - access_level
- project_auto_devops:
- whitelist:
- - id
- - project_id
- - created_at
- - updated_at
- - enabled
- project_custom_attributes:
- whitelist:
- - id
- - created_at
- - updated_at
- - project_id
- - key
- - value
- project_features:
- whitelist:
- - id
- - project_id
- - merge_requests_access_level
- - issues_access_level
- - wiki_access_level
- - snippets_access_level
- - builds_access_level
- - created_at
- - updated_at
- - repository_access_level
- project_group_links:
- whitelist:
- - id
- - project_id
- - group_id
- - created_at
- - updated_at
- - group_access
- - expires_at
- project_import_data:
- whitelist:
- - id
- - project_id
- project_mirror_data:
- whitelist:
- - id
- - project_id
- - retry_count
- - last_update_started_at
- - last_update_scheduled_at
- - next_execution_timestamp
- project_repository_states:
- whitelist:
- - id
- - project_id
- - repository_verification_checksum
- - wiki_verification_checksum
- - last_repository_verification_failure
- - last_wiki_verification_failure
- project_statistics:
- whitelist:
- - id
- - project_id
- - namespace_id
- - commit_count
- - storage_size
- - repository_size
- - lfs_objects_size
- - build_artifacts_size
- - shared_runners_seconds
- - shared_runners_seconds_last_reset
- projects:
- whitelist:
- - id
- - name
- - path
- - description
- - created_at
- - updated_at
- - creator_id
- - namespace_id
- - last_activity_at
- - import_url
- - visibility_level
- - archived
- - avatar
- - merge_requests_template
- - star_count
- - merge_requests_rebase_enabled
- - import_type
- - import_source
- - approvals_before_merge
- - reset_approvals_on_push
- - merge_requests_ff_only_enabled
- - issues_template
- - mirror
- - mirror_user_id
- - shared_runners_enabled
- - build_coverage_regex
- - build_allow_git_fetch
- - build_timeout
- - mirror_trigger_builds
- - pending_delete
- - public_builds
- - last_repository_check_failed
- - last_repository_check_at
- - only_allow_merge_if_pipeline_succeeds
- - has_external_issue_tracker
- - repository_storage
- - repository_read_only
- - request_access_enabled
- - has_external_wiki
- - ci_config_path
- - lfs_enabled
- - only_allow_merge_if_all_discussions_are_resolved
- - repository_size_limit
- - printing_merge_request_link_enabled
- - auto_cancel_pending_pipelines
- - service_desk_enabled
- - delete_error
- - last_repository_updated_at
- - disable_overriding_approvers_per_merge_request
- - storage_version
- - resolve_outdated_diff_discussions
- - remote_mirror_available_overridden
- - only_mirror_protected_branches
- - pull_mirror_available_overridden
- - mirror_overwrites_diverged_branches
- - external_authorization_classification_label
- subscriptions:
- whitelist:
- - id
- - user_id
- - subscribable_id
- - subscribable_type
- - subscribed
- - created_at
- - updated_at
- - project_id
- users:
- whitelist:
- - id
- - remember_created_at
- - sign_in_count
- - current_sign_in_at
- - last_sign_in_at
- - current_sign_in_ip
- - last_sign_in_ip
- - created_at
- - updated_at
- - admin
- - projects_limit
- - failed_attempts
- - locked_at
- - can_create_group
- - can_create_team
- - state
- - color_scheme_id
- - password_expires_at
- - created_by_id
- - last_credential_check_at
- - avatar
- - confirmed_at
- - confirmation_sent_at
- - unconfirmed_email
- - hide_no_ssh_key
- - website_url
- - admin_email_unsubscribed_at
- - notification_email
- - hide_no_password
- - password_automatically_set
- - location
- - public_email
- - dashboard
- - project_view
- - consumed_timestep
- - layout
- - hide_project_limit
- - note
- - otp_grace_period_started_at
- - external
- - organization
- - auditor
- - require_two_factor_authentication_from_group
- - two_factor_grace_period
- - last_activity_on
- - notified_of_own_activity
- - user_type
- - preferred_language
- - theme_id
-
diff --git a/config/routes.rb b/config/routes.rb
index 41f06a412a3..b2b4bece68a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -116,6 +116,8 @@ Rails.application.routes.draw do
get '/whats_new' => 'whats_new#index'
+ get 'offline' => "pwa#offline"
+
# '/-/health' implemented by BasicHealthCheck middleware
get 'liveness' => 'health#liveness'
get 'readiness' => 'health#readiness'
@@ -234,12 +236,11 @@ Rails.application.routes.draw do
# End of the /-/ scope.
concern :clusterable do
- resources :clusters, only: [:index, :new, :show, :update, :destroy] do
+ resources :clusters, only: [:index, :show, :update, :destroy] do
collection do
get :connect
get :new_cluster_docs
post :create_user
- post :create_gcp
post :create_aws
post :authorize_aws_role
end
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index d066dd2fb35..8148e92d0e5 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -88,7 +88,9 @@ namespace :admin do
get :instance_review, to: 'instance_review#index'
- resources :background_migrations, only: [:index] do
+ resources :background_migrations, only: [:index, :show] do
+ resources :batched_jobs, only: [:show]
+
member do
post :pause
post :resume
@@ -100,7 +102,6 @@ namespace :admin do
resource :background_jobs, controller: 'background_jobs', only: [:show]
resource :system_info, controller: 'system_info', only: [:show]
- resources :requests_profiles, only: [:index, :show], param: :name, constraints: { name: /.+\.(html|txt)/ }
resources :projects, only: [:index]
diff --git a/config/routes/project.rb b/config/routes/project.rb
index a3f6139a6ef..6b2a9700686 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -303,15 +303,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
concerns :clusterable
- namespace :serverless do
- scope :functions do
- get '/:environment_id/:id', to: 'functions#show'
- get '/:environment_id/:id/metrics', to: 'functions#metrics', as: :metrics
- end
-
- resources :functions, only: [:index]
- end
-
resources :terraform, only: [:index]
resources :google_cloud, only: [:index]
@@ -517,7 +508,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
namespace :prometheus do
- resources :alerts, constraints: { id: /\d+/ }, only: [:index, :create, :show, :update, :destroy] do # rubocop: disable Cop/PutProjectRoutesUnderScope
+ resources :alerts, constraints: { id: /\d+/ }, only: [:index, :show] do # rubocop: disable Cop/PutProjectRoutesUnderScope
post :notify, on: :collection # rubocop:todo Cop/PutProjectRoutesUnderScope
member do
get :metrics_dashboard # rubocop:todo Cop/PutProjectRoutesUnderScope
diff --git a/config/routes/user.rb b/config/routes/user.rb
index 64dc56e18ec..ccacf817cc5 100644
--- a/config/routes/user.rb
+++ b/config/routes/user.rb
@@ -27,7 +27,7 @@ devise_controllers = { omniauth_callbacks: :omniauth_callbacks,
sessions: :sessions,
confirmations: :confirmations }
-if ::Gitlab.ee? && ::Gitlab::Geo.connected? && ::Gitlab::Geo.secondary?
+if ::Gitlab.ee? && ::Gitlab::Geo.secondary?(infer_without_database: true)
devise_for :users, controllers: devise_controllers, path_names: { sign_in: 'auth/geo/sign_in',
sign_out: 'auth/geo/sign_out' }
# When using Geo, the other type of routes should be present as well, as browsers
diff --git a/config/settings.rb b/config/settings.rb
index 1860ea0f659..df67fdc8c53 100644
--- a/config/settings.rb
+++ b/config/settings.rb
@@ -195,9 +195,9 @@ class Settings < Settingslogic
# Set a default UUID for the case when the UUID hasn't been initialized.
uuid = Gitlab::CurrentSettings.uuid || 'uuid-not-set'
- minute = Digest::MD5.hexdigest(uuid + 'minute').to_i(16) % 60
- hour = Digest::MD5.hexdigest(uuid + 'hour').to_i(16) % 24
- day_of_week = Digest::MD5.hexdigest(uuid).to_i(16) % 7
+ minute = Digest::SHA256.hexdigest(uuid + 'minute').to_i(16) % 60
+ hour = Digest::SHA256.hexdigest(uuid + 'hour').to_i(16) % 24
+ day_of_week = Digest::SHA256.hexdigest(uuid).to_i(16) % 7
"#{minute} #{hour} * * #{day_of_week}"
end
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 7ec142344ee..11c232df4e0 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -161,8 +161,6 @@
- 1
- - experiments_record_conversion_event
- 1
-- - expire_build_instance_artifacts
- - 1
- - export_csv
- 1
- - external_service_reactive_caching
@@ -263,6 +261,8 @@
- 1
- - merge_request_reset_approvals
- 1
+- - merge_requests_close_issue
+ - 1
- - merge_requests_delete_source_branch
- 1
- - merge_requests_handle_assignees_change
@@ -355,8 +355,12 @@
- 1
- - project_template_export
- 1
+- - projects_after_import
+ - 1
- - projects_git_garbage_collect
- 1
+- - projects_inactive_projects_deletion_notification
+ - 1
- - projects_post_creation
- 1
- - projects_process_sync_events
@@ -415,10 +419,14 @@
- 1
- - security_findings_delete_by_job_id
- 1
+- - security_generate_scan_finding_rules
+ - 1
- - security_orchestration_policy_rule_schedule_namespace
- 1
- - security_scans
- 2
+- - security_sync_scan_policies
+ - 1
- - self_monitoring_project_create
- 2
- - self_monitoring_project_delete
diff --git a/danger/roulette/Dangerfile b/danger/roulette/Dangerfile
index 8d1b14d3b9a..d83b7788d73 100644
--- a/danger/roulette/Dangerfile
+++ b/danger/roulette/Dangerfile
@@ -104,8 +104,8 @@ categories = Set.new(changes.keys - [:unknown])
# Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
categories << :database if helper.mr_labels.include?('database')
-# Ensure to spin for UX reviewer for community contributions when ~UX is applied (e.g. to review changes to the UI)
-categories << :ux if (["UX", "Community contribution"] - helper.mr_labels).empty?
+# Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI) except when it's from wider community contribution where we want to assign from the corresponding group
+categories << :ux if helper.mr_labels.include?('UX') && !helper.mr_labels.include?('Community contribution')
# Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied
categories << :product_intelligence if helper.mr_labels.include?("product intelligence::review pending")
diff --git a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
index 28e58a0c60d..5a0fc88dad9 100644
--- a/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
+++ b/data/deprecations/14-0-nfs-fot-git-repository-storage.yml
@@ -16,7 +16,7 @@
We encourage customers currently using NFS for Git repositories to plan their migration by reviewing our documentation on [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
reporter: mjwood
- stage: create # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: create
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]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-10-dependency-scanning-default-java-version.yml b/data/deprecations/14-10-dependency-scanning-default-java-version.yml
new file mode 100644
index 00000000000..c589f2bb3ac
--- /dev/null
+++ b/data/deprecations/14-10-dependency-scanning-default-java-version.yml
@@ -0,0 +1,16 @@
+- name: "Dependency Scanning default Java version changed to 17"
+ announcement_milestone: "14.10"
+ announcement_date: "2022-04-22"
+ removal_milestone: "15.0"
+ removal_date: "2021-05-22"
+ breaking_change: true
+ reporter: NicoleSchwartz
+ body: |
+ In GitLab 15.0, for Dependency Scanning, the default version of Java that the scanner expects will be updated from 11 to 17. Java 17 is [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). Dependency scanning continues to support the same [range of versions (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#supported-languages-and-package-managers), only the default version is changing. If your project uses the previous default of Java 11, be sure to [set the `DS_Java_Version` variable to match](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: secure # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: ultimate # (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]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning
+ 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/deprecations/14-3-repository-push-audit-events.yml b/data/deprecations/14-3-repository-push-audit-events.yml
index 587dc98d03c..033fa957320 100644
--- a/data/deprecations/14-3-repository-push-audit-events.yml
+++ b/data/deprecations/14-3-repository-push-audit-events.yml
@@ -5,7 +5,7 @@
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
- Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated) are now deprecated and will be removed in GitLab 15.0.
+ Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are now deprecated and will be removed in GitLab 15.0.
These events have always been disabled by default and had to be manually enabled with a
feature flag. Enabling them can cause too many events to be generated which can
@@ -13,4 +13,4 @@
stage: Manage
tiers: Premium
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337993
- documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated
+ documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#removed-events
diff --git a/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml b/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml
new file mode 100644
index 00000000000..774b41a4170
--- /dev/null
+++ b/data/deprecations/14-5-certificate-based-integration-with-kubernetes-saas.yml
@@ -0,0 +1,19 @@
+- name: "SaaS certificate-based integration with Kubernetes"
+ announcement_milestone: "14.5"
+ announcement_date: "2021-11-15"
+ removal_milestone: "15.6"
+ removal_date: "2022-11-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: |
+ The certificate-based integration with Kubernetes will be [deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). As a GitLab SaaS customer, on new namespaces, you will no longer be able to integrate GitLab and your cluster using the certificate-based approach as of GitLab 15.0. The integration for current users will be enabled per namespace. The integrations are expected to be switched off completely on GitLab SaaS around 2022 November 22.
+
+ For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
+ [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
+
+ For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
+ GitLab self-managed customers can still use the feature [with a feature flag](https://docs.gitlab.com/ee/update/deprecations.html#self-managed-certificate-based-integration-with-kubernetes).
+ stage: Configure
+ tiers: [Free, Premium, Ultimate]
+ issue_url: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
+ documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
diff --git a/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml b/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
index 5cf9354cd05..6ab678c4199 100644
--- a/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
+++ b/data/deprecations/14-5-certificate-based-integration-with-kubernetes.yml
@@ -1,27 +1,21 @@
-- name: "Certificate-based integration with Kubernetes"
+- name: "Self-managed certificate-based integration with Kubernetes"
announcement_milestone: "14.5"
announcement_date: "2021-11-15"
- removal_milestone: "15.6"
- removal_date: "2022-11-22" # the date of the milestone release when this feature is planned to be removed
+ removal_milestone: "16.0"
+ removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: |
- [The certificate-based integration with Kubernetes will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
+ The certificate-based integration with Kubernetes [will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
- If you are a self-managed customer, in GitLab 15.0, a feature flag will be introduced so you can keep
- certificate-based integration enabled. The flag will be disabled by default.
- The flag and the related code will be removed in GitLab 15.6.
+ As a self-managed customer, we are introducing a feature flag in GitLab 15.0 so you can keep your certificate-based integration enabled. However, the feature flag will be disabled by default, so this change is a **breaking change**.
- Until the final removal in 15.6, features built on the integration will continue to work, and
- GitLab will continue to fix security and critical issues.
-
- If you use GitLab.com, certificate-based integrations will cease functioning in 15.0.
+ In GitLab 16.0 we will remove both the feature and its related code. Until the final removal in 16.0, features built on this integration will continue to work, if you enable the feature flag. Until the feature is removed, GitLab will continue to fix security and critical issues as they arise.
For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
- [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab.
- See the documentation for [how to migrate](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html).
+ [agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
stage: Configure
- tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
+ tiers: [Core, Premium, Ultimate]
issue_url: 'https://gitlab.com/groups/gitlab-org/configure/-/epics/8'
documentation_url: 'https://docs.gitlab.com/ee/user/infrastructure/clusters/#certificate-based-kubernetes-integration-deprecated'
diff --git a/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml b/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
index 9b45454fef8..f6b47162a36 100644
--- a/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
+++ b/data/deprecations/14-5-deprecate-convert-instance-runner-to-project.yml
@@ -1,11 +1,15 @@
-- name: "Converting an instance (shared) runner to a project (specific) runner"
+- name: "Changing an instance (shared) runner to a project (specific) runner"
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-11-22"
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
- In GitLab 15.0, we will remove the feature that enables you to convert an instance (shared) runner to a project (specific) runner. Users who need to add a runner to only a particular project can register a runner to the project directly.
+ In GitLab 15.0, you can no longer change an instance (shared) runner to a project (specific) runner.
+
+ Users often accidentally change instance runners to project runners, and they're unable to change them back. GitLab does not allow you to change a project runner to a shared runner because of the security implications. A runner meant for one project could be set to run jobs for an entire instance.
+
+ Administrators who need to add runners for multiple projects can register a runner for one project, then go to the Admin view and choose additional projects.
stage: Verify
tiers: [Core, Premium, Ultimate]
diff --git a/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml b/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
index 2dfc20ae14e..85cb235f445 100644
--- a/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
+++ b/data/deprecations/14-5-deprecate-defaultMergeCommitMessageWithDescription-graphql.yml
@@ -7,7 +7,8 @@
body: | # Do not modify this line, instead modify the lines below.
The GraphQL API field `defaultMergeCommitMessageWithDescription` has been deprecated and will be removed in GitLab 15.0. For projects with a commit message template set, it will ignore the template.
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: create
+ reporter: phikai
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]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-5-deprecate-sles-12sp2.yml b/data/deprecations/14-5-deprecate-sles-12sp2.yml
index 69f8eb73bfd..adfbea4ce42 100644
--- a/data/deprecations/14-5-deprecate-sles-12sp2.yml
+++ b/data/deprecations/14-5-deprecate-sles-12sp2.yml
@@ -6,3 +6,5 @@
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 SP2 [ended on March 31, 2021](https://www.suse.com/lifecycle/). The CA certificates on SP2 include the expired DST root certificate, and it's not getting new CA certificate package updates. We have implemented some [workarounds](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/merge_requests/191), but we will not be able to continue to keep the build running properly.
+ stage: enablement
+ reporter: dorrino
diff --git a/data/deprecations/14-5-remove-package-pipelines-api.yml b/data/deprecations/14-5-remove-package-pipelines-api.yml
index 392636f90a0..91b2971297f 100644
--- a/data/deprecations/14-5-remove-package-pipelines-api.yml
+++ b/data/deprecations/14-5-remove-package-pipelines-api.yml
@@ -1,13 +1,13 @@
- name: "Package pipelines in API payload is paginated" # The name of the feature to be deprecated
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-11-22" # 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: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ removal_milestone: "16.0" # The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # the date of the milestone release when this feature is planned to be removed
breaking_change: true
body: | # Do not modify this line, instead modify the lines below.
A request to the API for `/api/v4/projects/:id/packages` returns a paginated result of packages. Each package lists all of its pipelines in this response. This is a performance concern, as it's possible for a package to have hundreds or thousands of associated pipelines.
- In milestone 15.0, we will remove the `pipelines` attribute from the API response.
+ In milestone 16.0, we will remove the `pipelines` attribute from the API response.
stage: package
tiers: Free
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/289956
diff --git a/data/deprecations/14-6-deprecate-types.yml b/data/deprecations/14-6-deprecate-types.yml
index 3db9f574d38..7f6c1a4cfa5 100644
--- a/data/deprecations/14-6-deprecate-types.yml
+++ b/data/deprecations/14-6-deprecate-types.yml
@@ -7,7 +7,8 @@
body: | # Do not modify this line, instead modify the lines below.
The `type` and `types` CI/CD keywords will be removed in GitLab 15.0. Pipelines that use these keywords will stop working, so you must switch to `stage` and `stages`, which have the same behavior.
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: verify
+ reporter: dhershkovitch
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]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-6-job_char_limit.yml b/data/deprecations/14-6-job_char_limit.yml
index ee3efafe9f6..b7dff12da5f 100644
--- a/data/deprecations/14-6-job_char_limit.yml
+++ b/data/deprecations/14-6-job_char_limit.yml
@@ -7,7 +7,8 @@
body: | # Do not modify this line, instead modify the lines below.
In GitLab 15.0 we are going to limit the number of characters in CI/CD job names to 255. Any pipeline with job names that exceed the 255 character limit will stop working after the 15.0 release.
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ reporter: dhershkovitch
+ stage: verify
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]
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342800 # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-6-pipeline-fields-package-deprecation.yml b/data/deprecations/14-6-pipeline-fields-package-deprecation.yml
deleted file mode 100644
index 14892d2bbae..00000000000
--- a/data/deprecations/14-6-pipeline-fields-package-deprecation.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-- name: "`pipelines` fields in the Package GraphQL types"
- announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22" # 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: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
- breaking_change: true
- body: | # Do not modify this line, instead modify the lines below.
- As part of the work to create a [Package Registry GraphQL API](https://gitlab.com/groups/gitlab-org/-/epics/6318), the Package group deprecated the `pipelines` fields in all Package-related GraphQL types. As of GitLab 14.6, the `pipelines` field is deprecated in [`Package`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#package) and [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#packagedetailstype) due to scalability and performance concerns.
-
- In milestone 15.0, we will completely remove `pipelines` from `Package` and `PackageDetailsType`. You can follow and contribute to work on a replacement in the epic [GitLab-#7214](https://gitlab.com/groups/gitlab-org/-/epics/7214).
- stage: package
- tiers: Free
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347219
diff --git a/data/deprecations/14-6-runner-api-status-renames-not_connected.yml b/data/deprecations/14-6-runner-api-status-renames-not_connected.yml
deleted file mode 100644
index a2aba7cadbe..00000000000
--- a/data/deprecations/14-6-runner-api-status-renames-not_connected.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-- name: "Runner status `not_connected` API value"
- announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- removal_milestone: "15.0" # the milestone when this feature is planned to be removed
- removal_date: "2022-05-22"
- breaking_change: true
- body: | # Do not modify this line, instead modify the lines below.
- The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
- will return `never_contacted` instead of `not_connected` as the status values in 15.0.
-
- Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
- stage: Verify
- tiers: [Core, Premium, Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347305
- documentation_url: https://docs.gitlab.com/ee/api/runners.html
- announcement_date: "2021-12-22"
diff --git a/data/deprecations/14-6-runner_api_new_stale_status_breaking_change.yml b/data/deprecations/14-6-runner_api_new_stale_status_breaking_change.yml
deleted file mode 100644
index 0f21318d329..00000000000
--- a/data/deprecations/14-6-runner_api_new_stale_status_breaking_change.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-- name: "API: `stale` status returned instead of `offline` or `not_connected`"
- announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2021-12-22"
- removal_milestone: "15.0" # the milestone when this feature is planned to be removed
- removal_date: "2022-05-22"
- breaking_change: true
- body: | # Do not modify this line, instead modify the lines below.
- A breaking change will occur for the Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints in 15.0.
-
- Instead of the GitLab Runner API endpoints returning `offline` and `not_connected` for runners that have not contacted the GitLab instance in the past three months, the API endpoints will return the `stale` value, which was introduced in 14.6.
- stage: Verify
- tiers: [Core, Premium, Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347303
- documentation_url: https://docs.gitlab.com/ee/api/runners.html#runners-api
diff --git a/data/deprecations/14-7-deprecate-static-site-editor.yml b/data/deprecations/14-7-deprecate-static-site-editor.yml
index 18f2ec26645..0960bffe4cf 100644
--- a/data/deprecations/14-7-deprecate-static-site-editor.yml
+++ b/data/deprecations/14-7-deprecate-static-site-editor.yml
@@ -4,7 +4,9 @@
removal_milestone: "15.0" # The milestone when this feature is planned to be removed
removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-22), the date of the milestone release when this feature is planned to be removed.
body: | # Do not modify this line, instead modify the lines below.
- The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the Web IDE. Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects.
+ The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the [Web IDE](https://docs.gitlab.com/ee/user/project/web_ide/index.html).
+
+ Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects.
# The following items are not published on the docs page, but may be used in the future.
stage: Create # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
tiers: [Free, Premium, Ultimate] # (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]
diff --git a/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml b/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
index 0638f86968a..36104ad15d8 100644
--- a/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
+++ b/data/deprecations/14-8-deprecate-projectFingerprint-from-PipelineSecurityReportFinding-GraphQL.yml
@@ -11,7 +11,7 @@
The method for calculating fingerprints has changed, resulting in different values. Going forward, the new values will be
exposed in the UUID field. Data previously available in the projectFingerprint field will eventually be removed entirely.
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: secure
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]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-8-enforce-pat-expiration.yml b/data/deprecations/14-8-enforce-pat-expiration.yml
index bb5155984ef..bc8e35a4e2c 100644
--- a/data/deprecations/14-8-enforce-pat-expiration.yml
+++ b/data/deprecations/14-8-enforce-pat-expiration.yml
@@ -9,5 +9,6 @@
The feature to disable enforcement of PAT expiration is unusual from a security perspective.
We have become concerned that this unusual feature could create unexpected behavior for users.
Unexpected behavior in a security feature is inherently dangerous, so we have decided to remove this feature.
+ stage: manage
issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351962" # (optional) This is a link to the deprecation issue in GitLab
documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-personal-access-tokens-to-be-used-deprecated" # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-8-enforce-ssh-expiration.yml b/data/deprecations/14-8-enforce-ssh-expiration.yml
index 2f8362001df..5887e749d2c 100644
--- a/data/deprecations/14-8-enforce-ssh-expiration.yml
+++ b/data/deprecations/14-8-enforce-ssh-expiration.yml
@@ -9,5 +9,6 @@
The feature to disable enforcement of SSH expiration is unusual from a security perspective.
We have become concerned that this unusual feature could create unexpected behavior for users.
Unexpected behavior in a security feature is inherently dangerous, so we have decided to remove this feature.
+ stage: manage
issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351963" # (optional) This is a link to the deprecation issue in GitLab
documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-ssh-keys-to-be-used-deprecated" # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-8-graphql-ids.yml b/data/deprecations/14-8-graphql-ids.yml
index 67ff418c51a..cd830a313b1 100644
--- a/data/deprecations/14-8-graphql-ids.yml
+++ b/data/deprecations/14-8-graphql-ids.yml
@@ -58,7 +58,7 @@
to one of the other two forms (using the correct appropriate type in the signature, or using
an inline argument expression).
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: ecosystem
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]
issue_url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/257883'
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-8-grpc-proxy.yml b/data/deprecations/14-8-grpc-proxy.yml
index 1ec505fd216..9d161dbc8f9 100644
--- a/data/deprecations/14-8-grpc-proxy.yml
+++ b/data/deprecations/14-8-grpc-proxy.yml
@@ -18,7 +18,7 @@
increase throughput and reduce Go garbage collection latency. For more information, see
the [relevant epic](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/463).
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ stage: platform
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]
issue_url: # (optional) This is a link to the deprecation issue in GitLab
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/14-8-protect-cns-chs.yml b/data/deprecations/14-8-protect-cns-chs.yml
index 8ea76d1b371..6fb67e98b2c 100644
--- a/data/deprecations/14-8-protect-cns-chs.yml
+++ b/data/deprecations/14-8-protect-cns-chs.yml
@@ -6,7 +6,7 @@
breaking_change: true
reporter: sam.white
body: | # Do not modify this line, instead modify the lines below.
- All functionality related to GitLab's Container Network Security and Container Host Security categories is deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies into GitLab, add the desired Helm charts into your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through the GitLab [Secure CI/CD Tunnel](https://docs.gitlab.com/ee/user/clusters/agent/repository.html#run-kubectl-commands-using-the-cicd-tunnel).
+ All functionality related to GitLab's Container Network Security and Container Host Security categories is deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies into GitLab, add the desired Helm charts into your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through GitLab [CI/CD](https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html).
As part of this change, the following specific capabilities within GitLab are now deprecated, and are scheduled for removal in GitLab 15.0:
diff --git a/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml b/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
index 0300641e540..99af852c13e 100644
--- a/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
+++ b/data/deprecations/14-8-runner-api-active-field-replaced-with-paused-breaking-change.yml
@@ -27,7 +27,7 @@
existing runners.
stage: Verify
tiers: [Core, Premium, Ultimate]
- issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347211
- documentation_url: https://docs.gitlab.com/ee/api/runners.html
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351109
+ documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/#cirunner
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/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml b/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
index 8f706840f0d..174e51f5f5d 100644
--- a/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
+++ b/data/deprecations/14-8-runner-api-status-filter-does-accept-active-or-paused.yml
@@ -15,4 +15,4 @@
stage: Verify
tiers: [Core, Premium, Ultimate]
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351109
- documentation_url: https://docs.gitlab.com/ee/api/runners.html
+ documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/#queryrunners
diff --git a/data/deprecations/14-8-sast-analyzer-removals.yml b/data/deprecations/14-8-sast-analyzer-removals.yml
index 6bbeee0cd6b..cf9549f7315 100644
--- a/data/deprecations/14-8-sast-analyzer-removals.yml
+++ b/data/deprecations/14-8-sast-analyzer-removals.yml
@@ -1,8 +1,8 @@
- name: "SAST analyzer consolidation and CI/CD template changes"
announcement_milestone: "14.8"
announcement_date: "2022-02-22"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
+ removal_milestone: "15.2"
+ removal_date: "2022-07-22"
breaking_change: true
reporter: connorgilbert
body: | # Do not modify this line, instead modify the lines below.
@@ -11,12 +11,15 @@
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).
- In GitLab 15.0, GitLab SAST will no longer use the following analyzers:
+ In GitLab 15.2, 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)
- [Bandit](https://gitlab.com/gitlab-org/security-products/analyzers/bandit) (Python)
+ NOTE:
+ This change was originally planned for GitLab 15.0 and has been postponed.
+
These analyzers will be removed from the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) and replaced with the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
They will no longer receive routine updates, except for security issues.
We will not delete container images previously published for these analyzers; any such change would be announced as a [deprecation, removal, or breaking change announcement](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-removals-and-breaking-changes).
@@ -25,7 +28,7 @@
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).
- If you applied customizations to any of the affected analyzers, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#breaking-change).
+ 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.
stage: Secure
tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
diff --git a/data/deprecations/14-9-deprecate-composer-download-permissions.yml b/data/deprecations/14-9-deprecate-composer-download-permissions.yml
index 79cb2a81c53..e44f1c55167 100644
--- a/data/deprecations/14-9-deprecate-composer-download-permissions.yml
+++ b/data/deprecations/14-9-deprecate-composer-download-permissions.yml
@@ -1,11 +1,12 @@
- name: "Permissions change for downloading Composer dependencies"
announcement_milestone: "14.9"
announcement_date: "2022-03-22"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
+ removal_milestone: "14.10"
+ removal_date: "2022-04-22"
breaking_change: true
reporter: trizzi
body: | # Do not modify this line, instead modify the lines below.
The GitLab Composer repository can be used to push, search, fetch metadata about, and download PHP dependencies. All these actions require authentication, except for downloading dependencies.
Downloading Composer dependencies without authentication is deprecated in GitLab 14.9, and will be removed in GitLab 15.0. Starting with GitLab 15.0, you must authenticate to download Composer dependencies.
+ stage: package
diff --git a/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml b/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
index 740b3ca2e0d..366f0e83470 100644
--- a/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
+++ b/data/deprecations/14-9-deprecate-permissions-change-package-settings.yml
@@ -14,3 +14,4 @@
- [Container Registry cleanup policy](https://docs.gitlab.com/ee/api/graphql/reference/#containerexpirationpolicy)
- [Dependency Proxy time-to-live policy](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxyimagettlgrouppolicy)
- [Enabling the Dependency Proxy for your group](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxysetting)
+ stage: package
diff --git a/data/deprecations/14-9-deprecate-testcoveragesetting.yml b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
index 9015172eeb9..e6dfb22562b 100644
--- a/data/deprecations/14-9-deprecate-testcoveragesetting.yml
+++ b/data/deprecations/14-9-deprecate-testcoveragesetting.yml
@@ -7,8 +7,9 @@
reporter: jreporter # GitLab username of the person reporting the deprecation
body: | # Do not modify this line, instead modify the lines below.
To simplify setting a test coverage pattern, in GitLab 15.0 the
- [project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-using-project-settings-deprecated)
+ [project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-using-project-settings-removed)
is being removed.
Instead, using the project’s `.gitlab-ci.yml`, provide a regular expression with the `coverage` keyword to set
testing coverage results in merge requests.
+ stage: verify
diff --git a/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml b/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml
new file mode 100644
index 00000000000..5d940b5e14d
--- /dev/null
+++ b/data/deprecations/14-9-deprecation-htpassword-authentication-container-registry.yml
@@ -0,0 +1,12 @@
+- name: "htpasswd Authentication for the Container Registry"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: trizzi
+ body: | # Do not modify this line, instead modify the lines below.
+ The Container Registry supports [authentication](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#auth) with `htpasswd`. It relies on an [Apache `htpasswd` file](https://httpd.apache.org/docs/2.4/programs/htpasswd.html), with passwords hashed using `bcrypt`.
+
+ Since it isn't used in the context of GitLab (the product), `htpasswd` authentication will be deprecated in GitLab 14.9 and removed in GitLab 15.0.
+ stage: package
diff --git a/data/deprecations/15-0-JTW_v2_update.yml b/data/deprecations/15-0-JTW_v2_update.yml
deleted file mode 100644
index 39880d7fbe0..00000000000
--- a/data/deprecations/15-0-JTW_v2_update.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-# This is a template for a feature deprecation
-# A deprecation typically occurs when a feature or capability is planned to be removed in a future release.
-# Deprecations should be announced at least two releases prior to removal. Any breaking changes should only be done in major releases.
-#
-# 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.
-#
-# 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.
-
-- name: "Changes to the `CI_JOB_JWT`" # The name of the feature to be deprecated
- announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
- announcement_date: "2022-02-22" # 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: "15.0" # The milestone when this feature is planned to be removed
- removal_date: "2022-05-22" # 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 # If this deprecation is a breaking change, set this value to true
- reporter: dhershkovitch # GitLab username of the person reporting the deprecation
- body: | # Do not modify this line, instead modify the lines below.
- The `CI_JOB_JWT` will be updated to support a wider variety of cloud providers. It will be changed to match [`CI_JOB_JWT_V2`](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html), but this change may not be backwards compatible for all users, including Hashicorp Vault users. To maintain the current behavior, users can switch to using `CI_JOB_JWT_V1`, or update their configuration in GitLab 15.0 to use the improved `CI_JOB_JWT`.
-# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
- 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]
- issue_url: # (optional) This is a link to the deprecation issue in GitLab
- 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/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
new file mode 100644
index 00000000000..7f426190963
--- /dev/null
+++ b/data/deprecations/15-0-ci-cd-settings-update-mutation-renamed.yml
@@ -0,0 +1,19 @@
+- name: "CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate"
+ announcement_milestone: "15.0"
+ announcement_date: "2022-05-22"
+ removal_milestone: "16.0"
+ removal_date: "2023-05-22"
+ breaking_change: true
+ reporter: pedropombeiro
+ stage: Verify
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/361801
+ body: |
+ The `CiCdSettingsUpdate` mutation was renamed to `ProjectCiCdSettingsUpdate` in GitLab 15.0.
+ The `CiCdSettingsUpdate` mutation will be removed in GitLab 16.0.
+ Any user scripts that use the `CiCdSettingsUpdate` mutation must be updated to use `ProjectCiCdSettingsUpdate`
+ instead.
+
+ tiers: [Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/#mutationprojectcicdsettingsupdate
+ image_url:
+ video_url:
diff --git a/data/deprecations/15-0-deprecate-postgresql-12.yml b/data/deprecations/15-0-deprecate-postgresql-12.yml
new file mode 100644
index 00000000000..bebfba64405
--- /dev/null
+++ b/data/deprecations/15-0-deprecate-postgresql-12.yml
@@ -0,0 +1,19 @@
+- name: "PostgreSQL 12 deprecated"
+ announcement_milestone: "15.0"
+ announcement_date: "2022-05-22"
+ removal_milestone: "16.0"
+ removal_date: "2023-05-22"
+ breaking_change: true
+ reporter: iroussos
+ body: | # Do not modify this line, instead modify the lines below.
+ Support for PostgreSQL 12 is scheduled for removal in GitLab 16.0.
+ In GitLab 16.0, PostgreSQL 13 becomes the minimum required PostgreSQL version.
+
+ PostgreSQL 12 will be supported for the full GitLab 15 release cycle.
+ PostgreSQL 13 will also be supported for instances that want to upgrade prior to GitLab 16.0.
+
+ Upgrading to PostgreSQL 13 is not yet supported for GitLab instances with Geo enabled. Geo support for PostgreSQL 13 will be announced in a minor release version of GitLab 15, after the process is fully supported and validated. For more information, read the Geo related verifications on the [support epic for PostgreSQL 13](https://gitlab.com/groups/gitlab-org/-/epics/3832).
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/349185
+ documentation_url: https://docs.gitlab.com/omnibus/development/managing-postgresql-versions.html
diff --git a/data/deprecations/15-0-oauth-noexpiry.yml b/data/deprecations/15-0-oauth-noexpiry.yml
index 154630c9f16..9f2521998aa 100644
--- a/data/deprecations/15-0-oauth-noexpiry.yml
+++ b/data/deprecations/15-0-oauth-noexpiry.yml
@@ -16,7 +16,8 @@
1. Select **Expire access tokens** to enable them. Tokens must be revoked or they don’t expire.
# The following items are not published on the docs page, but may be used in the future.
- stage: # Manage
+ reporter: hsutor
+ stage: manage
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]
issue_url: # https://gitlab.com/gitlab-org/gitlab/-/issues/21745
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/15-0-oauth.yml b/data/deprecations/15-0-oauth.yml
index 98c7c974808..7e1c3ff51cd 100644
--- a/data/deprecations/15-0-oauth.yml
+++ b/data/deprecations/15-0-oauth.yml
@@ -7,7 +7,8 @@
body: | # Do not modify this line, instead modify the lines below.
The OAuth implicit grant authorization flow will be removed in our next major release, GitLab 15.0. Any applications that use OAuth implicit grant should switch to alternative [supported OAuth flows](https://docs.gitlab.com/ee/api/oauth2.html).
# The following items are not published on the docs page, but may be used in the future.
- stage: # Manage
+ reporter: hsutor
+ stage: manage
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]
issue_url: # https://gitlab.com/gitlab-org/gitlab/-/issues/344609
documentation_url: # (optional) This is a link to the current documentation page
diff --git a/data/deprecations/15-0-runner-status-legacy-mode.yml b/data/deprecations/15-0-runner-status-legacy-mode.yml
new file mode 100644
index 00000000000..ee7ac1af820
--- /dev/null
+++ b/data/deprecations/15-0-runner-status-legacy-mode.yml
@@ -0,0 +1,18 @@
+- name: "GraphQL API legacyMode argument for Runner status" # The name of the feature to be deprecated
+ announcement_milestone: "15.0" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-05-22" # 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" # The milestone when this feature is planned to be removed
+ removal_date: "2023-05-22" # 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 # If this deprecation is a breaking change, set this value to true
+ reporter: pedropombeiro # GitLab username of the person reporting the deprecation
+ body: | # Do not modify this line, instead modify the lines below.
+ The `legacyMode` argument to the `status` field in `RunnerType` will be rendered non-functional in the 16.0 release
+ as part of the deprecations details in the [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351109).
+
+ In GitLab 16.0 and later, the `status` field will act as if `legacyMode` is null. The `legacyMode` argument will
+ be present during the 16.x cycle to avoid breaking the API signature, and will be removed altogether in the
+ 17.0 release.
+ stage: Verify
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360545
+ documentation_url: https://docs.gitlab.com/ee/api/graphql/reference/#cirunnerstatus
diff --git a/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml b/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml
new file mode 100644
index 00000000000..271e11f0d7f
--- /dev/null
+++ b/data/deprecations/15-2-deprecation-vulnerability-report-state-sort.yml
@@ -0,0 +1,19 @@
+- name: "Vulnerability Report sort by State" # (required) The name of the feature to be deprecated
+ announcement_milestone: "15.0" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-05-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: "15.2" # (required) The milestone when this feature is planned to be removed
+ removal_date: "2022-07-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: false # (required) If this deprecation is a breaking change, set this value to true
+ reporter: matt_wilson # (required) GitLab username of the person reporting the deprecation
+ stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360516 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The ability to sort the Vulnerability Report by the `State` column was disabled and put behind a feature flag in GitLab 14.10 due to a refactor
+ of the underlying data model. The feature flag has remained off by default as further refactoring will be required to ensure sorting
+ by this value remains performant. Due to very low usage of the `State` column for sorting, the feature flag will instead be removed in
+ GitLab 15.2 to simplify the codebase and prevent any unwanted performance degradation.
+# The following items are not published on the docs page, but may be used in the future.
+ tiers: Ultimate # (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/deprecations/distribution_deprecations_14-4.yml b/data/deprecations/distribution_deprecations_14-4.yml
index b8c4e0d817c..5b7163d5b4d 100644
--- a/data/deprecations/distribution_deprecations_14-4.yml
+++ b/data/deprecations/distribution_deprecations_14-4.yml
@@ -2,5 +2,6 @@
announcement_milestone: "14.9" # The milestone when this feature was first announced as deprecated.
announcement_date: "2021-10-22"
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22"
body: | # Do not modify this line, instead modify the lines below.
The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and will be removed from GitLab Shell in GitLab 15.0.
diff --git a/data/deprecations/templates/14-9-deprecation-htpassword-authentication-container-registry.yml b/data/deprecations/templates/14-9-deprecation-htpassword-authentication-container-registry.yml
deleted file mode 100644
index 14c6b235a1a..00000000000
--- a/data/deprecations/templates/14-9-deprecation-htpassword-authentication-container-registry.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-- name: "htpasswd Authentication for the Container Registry"
- announcement_milestone: "14.9"
- announcement_date: "2022-03-22"
- removal_milestone: "15.0"
- removal_date: "2022-05-22"
- breaking_change: true
- reporter: trizzi
- body: | # Do not modify this line, instead modify the lines below.
- The Container Registry supports [authentication](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#auth) with `htpasswd`. It relies on an [Apache `htpasswd` file](https://httpd.apache.org/docs/2.4/programs/htpasswd.html), with passwords hashed using `bcrypt`.
-
- Since it isn't used in the context of GitLab (the product), `htpasswd` authentication will be deprecated in GitLab 14.9 and removed in GitLab 15.0.
diff --git a/data/deprecations/templates/_deprecation_template.md.erb b/data/deprecations/templates/_deprecation_template.md.erb
index 09a53404798..46eb152d86a 100644
--- a/data/deprecations/templates/_deprecation_template.md.erb
+++ b/data/deprecations/templates/_deprecation_template.md.erb
@@ -36,15 +36,22 @@ For deprecation reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc
-->
+{::options parse_block_html="true" /}
+
View deprecations by the product versions in which they were announced.
Each deprecation has a **planned removal milestone** and indicates whether it is a breaking change.
Most of the deprecations are **planned for removal in 15.0**, and many of them are **breaking changes**.
+<div class="js-deprecation-filters"></div>
<% if milestones.any? -%>
<%- milestones.each do |milestone| %>
+<div class="announcement-milestone">
+
## <%= milestone %>
<%- entries.select{|d| d["announcement_milestone"] == milestone}.each do |deprecation| %>
+<div class="deprecation removal-<%= deprecation["removal_milestone"].gsub('.', '') %><% if deprecation["breaking_change"] -%> breaking-change<% end %>">
+
### <%= deprecation["name"]%>
<% if deprecation["breaking_change"] -%>
@@ -57,9 +64,11 @@ changes to your code, settings, or workflow.
<%= deprecation["body"] -%><% else %>
<%= deprecation["body"] -%><% end %><%- if deprecation["removal_milestone"] -%>
-**Planned removal milestone: <%= deprecation["removal_milestone"]%> (<%= deprecation["removal_date"]%>)**
+**Planned removal milestone: <span class="removal-milestone"><%= deprecation["removal_milestone"]%></span> (<%= deprecation["removal_date"]%>)**
+</div>
<%- end -%>
<%- end -%>
+</div>
<%- end -%>
<%- else -%>
diff --git a/data/deprecations/templates/example.yml b/data/deprecations/templates/example.yml
index 06e53084ed2..190235b0e3c 100644
--- a/data/deprecations/templates/example.yml
+++ b/data/deprecations/templates/example.yml
@@ -10,14 +10,16 @@
#
# Please delete this line and above before submitting your merge request.
-- name: "Feature name" # The name of the feature to be deprecated
- announcement_milestone: "XX.YY" # The milestone when this feature was first announced as deprecated.
- announcement_date: "YYYY-MM-DD" # 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: "XX.YY" # The milestone when this feature is planned to be removed
- removal_date: # 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: false # If this deprecation is a breaking change, set this value to true
- reporter: exampleuser # GitLab username of the person reporting the deprecation
- body: | # Do not modify this line, instead modify the lines below.
+- name: "Feature name" # (required) The name of the feature to be deprecated
+ announcement_milestone: "XX.YY" # (required) The milestone when this feature was first announced as deprecated.
+ announcement_date: "YYYY-MM-DD" # (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: "XX.YY" # (required) The milestone when this feature is planned to be removed
+ removal_date: # (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: false # (required) If this deprecation is a breaking change, set this value to true
+ reporter: exampleuser # (required) GitLab username of the person reporting the deprecation
+ stage: stage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/000000 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
<!-- START OF BODY COMMENT
This area supports markdown. Delete this entire comment and replace it with your markdown content.
@@ -26,9 +28,7 @@
END OF BODY COMMENT -->
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
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]
- issue_url: # (optional) This is a link to the deprecation issue in GitLab
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/14_0/removal_enablement_pg11.yml b/data/removals/14_0/removal_enablement_pg11.yml
index 6f9c7718268..d409a1bc9d3 100644
--- a/data/removals/14_0/removal_enablement_pg11.yml
+++ b/data/removals/14_0/removal_enablement_pg11.yml
@@ -4,6 +4,6 @@
reporter: joshlambert
breaking_change: true
body: |
- PostgreSQL 12 will be the minimum required version in GitLab 14.0. It offers [significant improvements](https://www.postgresql.org/about/news/postgresql-12-released-1976/) to indexing, partitioning, and general performance benefits.
+ GitLab 14.0 requires PostgreSQL 12 or later. It offers [significant improvements](https://www.postgresql.org/about/news/postgresql-12-released-1976/) to indexing, partitioning, and general performance benefits.
- Starting in GitLab 13.7, all new installations default to version 12. From GitLab 13.8, single-node instances are automatically upgraded as well. If you aren't ready to upgrade, you can [opt out of automatic upgrades](https://docs.gitlab.com/omnibus/settings/database.html#opt-out-of-automatic-postgresql-upgrades).
+ Starting in GitLab 13.7, all new installations default to PostgreSQL version 12. From GitLab 13.8, single-node instances are automatically upgraded as well. If you aren't ready to upgrade, you can [opt out of automatic upgrades](https://docs.gitlab.com/omnibus/settings/database.html#opt-out-of-automatic-postgresql-upgrades).
diff --git a/data/removals/14_10/14-10-package-permissions-composer-change.yml b/data/removals/14_10/14-10-package-permissions-composer-change.yml
new file mode 100644
index 00000000000..e44f1c55167
--- /dev/null
+++ b/data/removals/14_10/14-10-package-permissions-composer-change.yml
@@ -0,0 +1,12 @@
+- name: "Permissions change for downloading Composer dependencies"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "14.10"
+ removal_date: "2022-04-22"
+ breaking_change: true
+ reporter: trizzi
+ body: | # Do not modify this line, instead modify the lines below.
+ The GitLab Composer repository can be used to push, search, fetch metadata about, and download PHP dependencies. All these actions require authentication, except for downloading dependencies.
+
+ Downloading Composer dependencies without authentication is deprecated in GitLab 14.9, and will be removed in GitLab 15.0. Starting with GitLab 15.0, you must authenticate to download Composer dependencies.
+ stage: package
diff --git a/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml b/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml
new file mode 100644
index 00000000000..4a241f913a1
--- /dev/null
+++ b/data/removals/15_0/15-0-Legacy-approval-status-names-from-License-Compliance-API.yml
@@ -0,0 +1,11 @@
+- name: "Legacy approval status names in License Compliance API"
+ announcement_milestone: "14.6"
+ announcement_date: "2021-12-13"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: sam.white
+ stage: secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345839
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ We have now removed the deprecated legacy names for approval status of license policy (`blacklisted`, `approved`) in the API queries and responses. If you are using our License Compliance API you should stop using the `approved` and `blacklisted` query parameters, they are now `allowed` and `denied`. In 15.0 the responses will also stop using `approved` and `blacklisted` so you may need to adjust any of your custom tools.
diff --git a/data/removals/15_0/15-0-Pseudonymizer.yml b/data/removals/15_0/15-0-Pseudonymizer.yml
new file mode 100644
index 00000000000..f3ad893e5dc
--- /dev/null
+++ b/data/removals/15_0/15-0-Pseudonymizer.yml
@@ -0,0 +1,13 @@
+- name: "Pseudonymizer"
+ announcement_milestone: "14.7"
+ announcement_date: "2022-01-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ The Pseudonymizer feature is generally unused, can cause production issues with large databases, and can interfere with object storage development.
+ It was removed in GitLab 15.0.
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ documentation_url: "https://docs.gitlab.com/ee/administration/pseudonymizer.html"
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/219952"
diff --git a/data/removals/15_0/15-0-Retire-js-analyzer.yml b/data/removals/15_0/15-0-Retire-js-analyzer.yml
new file mode 100644
index 00000000000..5b5d38d039c
--- /dev/null
+++ b/data/removals/15_0/15-0-Retire-js-analyzer.yml
@@ -0,0 +1,13 @@
+- name: "Retire-JS Dependency Scanning tool"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We have removed support for retire.js from Dependency Scanning as of May 22, 2022 in GitLab 15.0. JavaScript scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+ If you have explicitly excluded retire.js using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to retire.js. If you have customized your pipeline’s Dependency Scanning configuration related to the `retire-js-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference retire.js, or customized your template specifically for retire.js, you will not need to take any action.
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/289830"
diff --git a/data/removals/15_0/15-0-SLES-12-SP2.yml b/data/removals/15_0/15-0-SLES-12-SP2.yml
new file mode 100644
index 00000000000..40c51fa5f95
--- /dev/null
+++ b/data/removals/15_0/15-0-SLES-12-SP2.yml
@@ -0,0 +1,10 @@
+- name: "SUSE Linux Enterprise Server 12 SP2"
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-11-22"
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 SP2 [ended on March 31, 2021](https://www.suse.com/lifecycle/). The CA certificates on SP2 include the expired DST root certificate, and it's not getting new CA certificate package updates. We have implemented some [workarounds](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/merge_requests/191), but we will not be able to continue to keep the build running properly.
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
diff --git a/data/removals/15_0/15-0-advanced-search-elasticsearch-6-8.yml b/data/removals/15_0/15-0-advanced-search-elasticsearch-6-8.yml
new file mode 100644
index 00000000000..5877b9cf0af
--- /dev/null
+++ b/data/removals/15_0/15-0-advanced-search-elasticsearch-6-8.yml
@@ -0,0 +1,16 @@
+- name: "Elasticsearch 6.8.x in GitLab 15.0"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: JohnMcGuire
+ body: | # Do not modify this line, instead modify the lines below.
+ Elasticsearch 6.8 support has been removed in GitLab 15.0. Elasticsearch 6.8 has reached [end of life](https://www.elastic.co/support/eol).
+ If you use Elasticsearch 6.8, **you must upgrade your Elasticsearch version to 7.x** prior to upgrading to GitLab 15.0.
+ You should not upgrade to Elasticsearch 8 until you have completed the GitLab 15.0 upgrade.
+
+ View the [version requirements](https://docs.gitlab.com/ee/integration/elasticsearch.html#version-requirements) for details.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: "Enablement"
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/350275
diff --git a/data/removals/15_0/15-0-bundler-audit.yml b/data/removals/15_0/15-0-bundler-audit.yml
new file mode 100644
index 00000000000..991280585ba
--- /dev/null
+++ b/data/removals/15_0/15-0-bundler-audit.yml
@@ -0,0 +1,13 @@
+- name: "bundler-audit Dependency Scanning tool"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal, Ruby scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+ If you have explicitly excluded bundler-audit using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to bundler-audit. If you have customized your pipeline’s Dependency Scanning configuration related to the `bundler-audit-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference bundler-audit or customized your template specifically for bundler-audit, you will not need to take any action.
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/347491"
diff --git a/data/removals/15_0/15-0-container-registry-htpasswd.yml b/data/removals/15_0/15-0-container-registry-htpasswd.yml
new file mode 100644
index 00000000000..e9a4b2e9882
--- /dev/null
+++ b/data/removals/15_0/15-0-container-registry-htpasswd.yml
@@ -0,0 +1,11 @@
+- name: "Container registry authentication with htpasswd"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: trizzi
+ body: | # Do not modify this line, instead modify the lines below.
+ The Container Registry supports [authentication](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#auth) with `htpasswd`. It relies on an [Apache `htpasswd` file](https://httpd.apache.org/docs/2.4/programs/htpasswd.html), with passwords hashed using `bcrypt`.
+
+ Since it isn't used in the context of GitLab (the product), `htpasswd` authentication will be deprecated in GitLab 14.9 and removed in GitLab 15.0.
diff --git a/data/removals/15_0/15-0-custom_hooks_dir.yml b/data/removals/15_0/15-0-custom_hooks_dir.yml
new file mode 100644
index 00000000000..2c116a55e1c
--- /dev/null
+++ b/data/removals/15_0/15-0-custom_hooks_dir.yml
@@ -0,0 +1,12 @@
+- name: "Move `custom_hooks_dir` setting from GitLab Shell to Gitaly"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and is removed from GitLab Shell in GitLab 15.0.
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/4208
+ documentation_url: https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories
diff --git a/data/removals/15_0/15-0-database-deprecate-legacy-database-conf.yml b/data/removals/15_0/15-0-database-deprecate-legacy-database-conf.yml
new file mode 100644
index 00000000000..c9c64de7aff
--- /dev/null
+++ b/data/removals/15_0/15-0-database-deprecate-legacy-database-conf.yml
@@ -0,0 +1,17 @@
+- name: "Support for legacy format of `config/database.yml` removed"
+ announcement_milestone: "14.3"
+ announcement_date: "2021-09-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: |
+ The syntax of [GitLab's database](https://docs.gitlab.com/omnibus/settings/database.html)
+ configuration located in `database.yml` has changed and the legacy format has been removed.
+ The legacy format supported a single PostgreSQL adapter, whereas the new format supports multiple databases.
+ The `main:` database needs to be defined as a first configuration item.
+
+ This change only impacts users compiling GitLab from source, all the other installation methods handle this configuration automatically.
+ Instructions are available [in the source update documentation](https://docs.gitlab.com/ee/update/upgrading_from_source.html#new-configuration-options-for-databaseyml).
+ stage: Enablement
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/338182
diff --git a/data/removals/15_0/15-0-dependency-scanning-default-java-version.yml b/data/removals/15_0/15-0-dependency-scanning-default-java-version.yml
new file mode 100644
index 00000000000..dee3b5093fc
--- /dev/null
+++ b/data/removals/15_0/15-0-dependency-scanning-default-java-version.yml
@@ -0,0 +1,15 @@
+- name: "Dependency Scanning default Java version changed to 17"
+ announcement_milestone: "14.10"
+ announcement_date: "2022-04-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: NicoleSchwartz
+ body: |
+ For Dependency Scanning, the default version of Java that the scanner expects will be updated from 11 to 17. Java 17 is [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). Dependency Scanning continues to support the same [range of versions (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#supported-languages-and-package-managers), only the default version is changing. If your project uses the previous default of Java 11, be sure to [set the `DS_JAVA_VERSION` variable to match](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning). Please note that consequently the default version of Gradle is now 7.3.3.
+ stage: secure
+ tiers: ultimate
+ issue_url:
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning
+ image_url:
+ video_url:
diff --git a/data/removals/15_0/15-0-dependency-scanning-python-image.yml b/data/removals/15_0/15-0-dependency-scanning-python-image.yml
new file mode 100644
index 00000000000..cbb1e32a211
--- /dev/null
+++ b/data/removals/15_0/15-0-dependency-scanning-python-image.yml
@@ -0,0 +1,11 @@
+- name: "End of support for Python 3.6 in Dependency Scanning"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ stage: secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351503
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ For those using Dependency Scanning for Python projects, we are removing support for the default `gemnasium-python:2` image which uses Python 3.6, as well as the custom `gemnasium-python:2-python-3.9` image which uses Python 3.9. The new default image as of GitLab 15.0 will be for Python 3.9 as it is a [supported version](https://endoflife.date/python) and 3.6 [is no longer supported](https://endoflife.date/python).
diff --git a/data/removals/15_0/15-0-ds-default-analyzers.yml b/data/removals/15_0/15-0-ds-default-analyzers.yml
new file mode 100644
index 00000000000..702ce854d0d
--- /dev/null
+++ b/data/removals/15_0/15-0-ds-default-analyzers.yml
@@ -0,0 +1,12 @@
+- name: "DS_DEFAULT_ANALYZERS environment variable"
+ announcement_milestone: "14.0"
+ announcement_date: "2021-06-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ We are removing the `DS_DEFAULT_ANALYZERS` environment variable from Dependency Scanning on May 22, 2022 in 15.0. After this removal, this variable's value will be ignored. To configure which analyzers to run with the default configuration, you should use the `DS_EXCLUDED_ANALYZERS` variable instead.
+
+ stage: secure
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/333299"
diff --git a/data/removals/15_0/15-0-geo-remove-db-rake-tasks.yml b/data/removals/15_0/15-0-geo-remove-db-rake-tasks.yml
new file mode 100644
index 00000000000..571217f9c92
--- /dev/null
+++ b/data/removals/15_0/15-0-geo-remove-db-rake-tasks.yml
@@ -0,0 +1,31 @@
+- name: "Custom `geo:db:*` Rake tasks are no longer available"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: sranasinghe
+ stage: enablement
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/351945
+ body: |
+ In GitLab 14.8, we [deprecated the `geo:db:*` Rake tasks and replaced them with built-in tasks](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77269/diffs) after [switching the Geo tracking database to use Rails' 6 support of multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6458).
+ The following `geo:db:*` tasks have been removed from GitLab 15.0 and have been replaced with their corresponding `db:*:geo` tasks:
+
+ - `geo:db:drop` -> `db:drop:geo`
+ - `geo:db:create` -> `db:create:geo`
+ - `geo:db:setup` -> `db:setup:geo`
+ - `geo:db:migrate` -> `db:migrate:geo`
+ - `geo:db:rollback` -> `db:rollback:geo`
+ - `geo:db:version` -> `db:version:geo`
+ - `geo:db:reset` -> `db:reset:geo`
+ - `geo:db:seed` -> `db:seed:geo`
+ - `geo:schema:load:geo` -> `db:schema:load:geo`
+ - `geo:db:schema:dump` -> `db:schema:dump:geo`
+ - `geo:db:migrate:up` -> `db:migrate:up:geo`
+ - `geo:db:migrate:down` -> `db:migrate:down:geo`
+ - `geo:db:migrate:redo` -> `db:migrate:redo:geo`
+ - `geo:db:migrate:status` -> `db:migrate:status:geo`
+ - `geo:db:test:prepare` -> `db:test:prepare:geo`
+ - `geo:db:test:load` -> `db:test:load:geo`
+ - `geo:db:test:purge` -> `db:test:purge:geo`
+ tiers: ["Premium", "Ultimate"]
diff --git a/data/removals/15_0/15-0-geo-remove-promote-db.yml b/data/removals/15_0/15-0-geo-remove-promote-db.yml
new file mode 100644
index 00000000000..65fa8fdff8e
--- /dev/null
+++ b/data/removals/15_0/15-0-geo-remove-promote-db.yml
@@ -0,0 +1,13 @@
+- name: "The `promote-db` command is no longer available from `gitlab-ctl`"
+ announcement_milestone: "14.5"
+ announcement_date: "2021-11-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sranasinghe
+ stage: enablement
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345207
+ body: |
+ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-db` which is used to promote database nodes in multi-node Geo secondary sites. The `gitlab-ctl promote-db` command has been removed in GitLab 15.0.
+ tiers: [Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/administration/geo/disaster_recovery/planned_failover.html
diff --git a/data/removals/15_0/15-0-geo-remove-promote-to-primary-node.yml b/data/removals/15_0/15-0-geo-remove-promote-to-primary-node.yml
new file mode 100644
index 00000000000..becc7b26b9a
--- /dev/null
+++ b/data/removals/15_0/15-0-geo-remove-promote-to-primary-node.yml
@@ -0,0 +1,13 @@
+- name: "Remove `promote-to-primary-node` command from `gitlab-ctl`"
+ announcement_milestone: "14.5"
+ announcement_date: "2021-11-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sranasinghe
+ stage: enablement
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/345207
+ body: |
+ In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-to-primary-node` which was only usable for single-node Geo sites. `gitlab-ctl promote-to-primary-node` has been removed in GitLab 15.0.
+ tiers: [Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/administration/geo/disaster_recovery/planned_failover.html
diff --git a/data/removals/15_0/15-0-gitaly-internal-socket-dir.yml b/data/removals/15_0/15-0-gitaly-internal-socket-dir.yml
new file mode 100644
index 00000000000..eedb50d2205
--- /dev/null
+++ b/data/removals/15_0/15-0-gitaly-internal-socket-dir.yml
@@ -0,0 +1,13 @@
+- name: "Support for `gitaly['internal_socket_dir']`"
+ announcement_milestone: "14.10"
+ announcement_date: "2022-04-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ Gitaly introduced a new directory that holds all runtime data Gitaly requires to operate correctly. This new directory replaces the old internal socket directory, and consequentially the usage of `gitaly['internal_socket_dir']` was deprecated in favor of `gitaly['runtime_dir']`.
+
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6758
+ documentation_url: https://docs.gitlab.com/omnibus/update/gitlab_15_changes.html#removing-support-for-gitalys-internal-socket-path
diff --git a/data/removals/15_0/15-0-managed-cluster-applications.yml b/data/removals/15_0/15-0-managed-cluster-applications.yml
new file mode 100644
index 00000000000..b0e4bae8852
--- /dev/null
+++ b/data/removals/15_0/15-0-managed-cluster-applications.yml
@@ -0,0 +1,12 @@
+- name: "`Managed-Cluster-Applications.gitlab-ci.yml`"
+ announcement_milestone: "14.0"
+ announcement_date: "2021-06-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ body: | # Do not modify this line, instead modify the lines below.
+ 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.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: "Configure"
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/333610
diff --git a/data/removals/15_0/15-0-oauth-implicit-grant.yml b/data/removals/15_0/15-0-oauth-implicit-grant.yml
new file mode 100644
index 00000000000..4a8cd53dc13
--- /dev/null
+++ b/data/removals/15_0/15-0-oauth-implicit-grant.yml
@@ -0,0 +1,16 @@
+- name: "OAuth implicit grant" # the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
+ announcement_milestone: "14.0" # The milestone when this feature was deprecated.
+ announcement_date: "2021-06-22" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: true # Change to true if this removal is a breaking change.
+ reporter: hsutor # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ The OAuth implicit grant authorization flow is no longer supported. Any applications that use OAuth implicit grant must switch to alternative [supported OAuth flows](https://docs.gitlab.com/ee/api/oauth2.html).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ 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]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ 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-oauth-tokens-no-expiry.yml b/data/removals/15_0/15-0-oauth-tokens-no-expiry.yml
new file mode 100644
index 00000000000..f93b8253ec7
--- /dev/null
+++ b/data/removals/15_0/15-0-oauth-tokens-no-expiry.yml
@@ -0,0 +1,18 @@
+- name: "OAuth tokens without an expiration"
+ announcement_milestone: "14.3"
+ announcement_date: "2021-09-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: hsutor
+ body: |
+ GitLab no longer supports OAuth tokens [without an expiration](https://docs.gitlab.com/ee/integration/oauth_provider.html#expiring-access-tokens).
+
+ Any existing token without an expiration has one automatically generated and applied.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ 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]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: https://docs.gitlab.com/ee/integration/oauth_provider.html#expiring-access-tokens
+ 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-omniauth-kerberos-gem.yml b/data/removals/15_0/15-0-omniauth-kerberos-gem.yml
new file mode 100644
index 00000000000..fa005ff0404
--- /dev/null
+++ b/data/removals/15_0/15-0-omniauth-kerberos-gem.yml
@@ -0,0 +1,21 @@
+- name: "`omniauth-kerberos` gem" # the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
+ announcement_milestone: "14.3" # The milestone when this feature was deprecated.
+ announcement_date: "2021-09-22" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: true # Change to true if this removal is a breaking change.
+ reporter: hsutor # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ The `omniauth-kerberos` gem is no longer supported. This gem has not been maintained and has very little usage. Therefore, we
+ removed support for this authentication method and recommend using [SPEGNO](https://en.wikipedia.org/wiki/SPNEGO) instead. You can
+ follow the [upgrade instructions](https://docs.gitlab.com/ee/integration/kerberos.html#upgrading-from-password-based-to-ticket-based-kerberos-sign-ins)
+ to upgrade from the removed integration to the new supported one.
+
+ We are not removing Kerberos SPNEGO integration. We are removing the old password-based Kerberos.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ 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]
+ issue_url: # (optional) This is a link to the deprecation issue in GitLab
+ 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-package-container-registry-group-api.yml b/data/removals/15_0/15-0-package-container-registry-group-api.yml
new file mode 100644
index 00000000000..4d992c6c75f
--- /dev/null
+++ b/data/removals/15_0/15-0-package-container-registry-group-api.yml
@@ -0,0 +1,14 @@
+- name: "Update to the Container Registry group-level API"
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-11-22"
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ In GitLab 15.0, support for the `tags` and `tags_count` parameters will be removed from the Container Registry API that [gets registry repositories from a group](../api/container_registry.md#within-a-group).
+
+ The `GET /groups/:id/registry/repositories` endpoint will remain, but won't return any info about tags. To get the info about tags, you can use the existing `GET /registry/repositories/:id` endpoint, which will continue to support the `tags` and `tag_count` options as it does today. The latter must be called once per image repository.
+ stage: Package
+ tiers: Free
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336912
+ documentation_url: https://docs.gitlab.com/ee/api/container_registry.html#within-a-group
diff --git a/data/removals/15_0/15-0-package-settings-permissions.yml b/data/removals/15_0/15-0-package-settings-permissions.yml
new file mode 100644
index 00000000000..5a458b588b8
--- /dev/null
+++ b/data/removals/15_0/15-0-package-settings-permissions.yml
@@ -0,0 +1,18 @@
+- name: "GraphQL permissions change for Package settings"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: trizzi
+ body: | # Do not modify this line, instead modify the lines below.
+ The GitLab Package stage offers a Package Registry, Container Registry, and Dependency Proxy to help you manage all of your dependencies using GitLab. Each of these product categories has a variety of settings that can be adjusted using the API.
+
+ The permissions model for GraphQL is being updated. After 15.0, users with the Guest, Reporter, and Developer role can no longer update these settings:
+
+ - [Package Registry settings](https://docs.gitlab.com/ee/api/graphql/reference/#packagesettings)
+ - [Container Registry cleanup policy](https://docs.gitlab.com/ee/api/graphql/reference/#containerexpirationpolicy)
+ - [Dependency Proxy time-to-live policy](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxyimagettlgrouppolicy)
+ - [Enabling the Dependency Proxy for your group](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxysetting)
+
+ The issue for this removal is [GitLab-#350682](https://gitlab.com/gitlab-org/gitlab/-/issues/350682)
diff --git a/data/removals/15_0/15-0-praefect-database-no-proxy.yml b/data/removals/15_0/15-0-praefect-database-no-proxy.yml
new file mode 100644
index 00000000000..b363decc68e
--- /dev/null
+++ b/data/removals/15_0/15-0-praefect-database-no-proxy.yml
@@ -0,0 +1,11 @@
+- name: "Move Gitaly Cluster Praefect `database_host_no_proxy` and `database_port_no_proxy configs`"
+ announcement_milestone: "14.0"
+ announcement_date: "2021-05-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ The Gitaly Cluster configuration keys for `praefect['database_host_no_proxy']` and `praefect['database_port_no_proxy']` are replaced with `praefect['database_direct_host']` and `praefect['database_direct_port']`.
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6150
diff --git a/data/removals/15_0/15-0-praefect-virtual-storage.yml b/data/removals/15_0/15-0-praefect-virtual-storage.yml
new file mode 100644
index 00000000000..a1ffa20bcfd
--- /dev/null
+++ b/data/removals/15_0/15-0-praefect-virtual-storage.yml
@@ -0,0 +1,9 @@
+- name: "Gitaly nodes in virtual storage"
+ announcement_milestone: "13.12" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-04-22"
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ Configuring the Gitaly nodes directly in the virtual storage's root configuration object has been deprecated in GitLab 13.12 and is no longer supported in GitLab 15.0. You must move the Gitaly nodes under the `'nodes'` key as described in [the Praefect configuration](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#praefect).
+ tiers: [Free, Premium, Ultimate]
diff --git a/data/removals/15_0/15-0-protect-cns-chs.yml b/data/removals/15_0/15-0-protect-cns-chs.yml
new file mode 100644
index 00000000000..470f809efa1
--- /dev/null
+++ b/data/removals/15_0/15-0-protect-cns-chs.yml
@@ -0,0 +1,21 @@
+- name: "Container Network and Host Security"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ All functionality related to the Container Network Security and Container Host Security categories was deprecated in GitLab 14.8 and is scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies with GitLab, add the desired Helm charts in your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through GitLab [CI/CD](https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html).
+
+ As part of this change, the following capabilities within GitLab are scheduled for removal in GitLab 15.0:
+
+ - The **Security & Compliance > Threat Monitoring** page.
+ - The Network Policy security policy type, as found on the **Security & Compliance > Policies** page.
+ - The ability to manage integrations with the following technologies through GitLab: AppArmor, Cilium, Falco, FluentD, and Pod Security Policies.
+ - All APIs related to the above functionality.
+
+ For additional context, or to provide feedback regarding this change, please reference our [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/7476).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: "Protect"
+ issue_url: https://gitlab.com/groups/gitlab-org/-/epics/7477
diff --git a/data/removals/15_0/15-0-protect-vulnerability-check.yml b/data/removals/15_0/15-0-protect-vulnerability-check.yml
new file mode 100644
index 00000000000..91052457612
--- /dev/null
+++ b/data/removals/15_0/15-0-protect-vulnerability-check.yml
@@ -0,0 +1,18 @@
+- name: "Vulnerability Check"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: sam.white
+ body: | # Do not modify this line, instead modify the lines below.
+ The vulnerability check feature was deprecated in GitLab 14.8 and is scheduled for removal in GitLab 15.0. We encourage you to migrate to the new security approvals feature instead. You can do so by navigating to **Security & Compliance > Policies** and creating a new Scan Result Policy.
+
+ The new security approvals feature is similar to vulnerability check. For example, both can require approvals for MRs that contain security vulnerabilities. However, security approvals improve the previous experience in several ways:
+
+ - Users can choose who is allowed to edit security approval rules. An independent security or compliance team can therefore manage rules in a way that prevents development project maintainers from modifying the rules.
+ - Multiple rules can be created and chained together to allow for filtering on different severity thresholds for each scanner type.
+ - A two-step approval process can be enforced for any desired changes to security approval rules.
+ - A single set of security policies can be applied to multiple development projects to allow for ease in maintaining a single, centralized ruleset.
+ stage: "Protect"
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/357300
diff --git a/data/removals/15_0/15-0-removal-artifacts-keyword.yml b/data/removals/15_0/15-0-removal-artifacts-keyword.yml
new file mode 100644
index 00000000000..39f618c47f5
--- /dev/null
+++ b/data/removals/15_0/15-0-removal-artifacts-keyword.yml
@@ -0,0 +1,16 @@
+- name: "`artifacts:report: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)
+ 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.
+
+# The following items are not published on the docs page, but may be used in the future.
+ stage: Verify
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348980
+ documentation_url: https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportscobertura-removed
diff --git a/data/removals/15_0/15-0-removal-testcoveragesetting.yml b/data/removals/15_0/15-0-removal-testcoveragesetting.yml
new file mode 100644
index 00000000000..bd72a28f0db
--- /dev/null
+++ b/data/removals/15_0/15-0-removal-testcoveragesetting.yml
@@ -0,0 +1,14 @@
+- name: "Test coverage project CI/CD setting" # The headline announcing the removal. i.e. "`CI_PROJECT_CONFIG_PATH` removed in Gitlab 14.0"
+ announcement_milestone: "14.8" # The milestone when this feature was deprecated.
+ announcement_date: "2022-03-22" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: true # Change to true if this removal is a breaking change.
+ reporter: jreporter # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ To specify a test coverage pattern, in GitLab 15.0 the
+ [project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-to-a-merge-request-removed)
+ has been removed.
+
+ To set test coverage parsing, use the project’s `.gitlab-ci.yml` file by providing a regular expression with the
+ [`coverage` keyword](https://docs.gitlab.com/ee/ci/yaml/index.html#coverage).
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
new file mode 100644
index 00000000000..7d077175b29
--- /dev/null
+++ b/data/removals/15_0/15-0-remove-background-upload-object-storage.yml
@@ -0,0 +1,20 @@
+- name: "Background upload for object storage"
+ announcement_milestone: "14.9"
+ announcement_date: "2022-03-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ 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.
+
+ This impacts a small 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).
+ stage: Enablement
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/26600
+ documentation_url: https://docs.gitlab.com/ee/administration/object_storage.html
diff --git a/data/removals/15_0/15-0-remove-dependency-proxy-feature-flag.yml b/data/removals/15_0/15-0-remove-dependency-proxy-feature-flag.yml
new file mode 100644
index 00000000000..1d43573bb22
--- /dev/null
+++ b/data/removals/15_0/15-0-remove-dependency-proxy-feature-flag.yml
@@ -0,0 +1,13 @@
+- name: "Remove dependency_proxy_for_private_groups feature flag" # The name of the feature to be deprecated
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-11-22" # 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: "15.0" # The milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ A feature flag was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab 13.7 as part of the change to require authentication to use the Dependency Proxy. Before GitLab 13.7, you could use the Dependency Proxy without authentication.
+
+ In GitLab 15.0, we will remove the feature flag, and you must always authenticate when you use the Dependency Proxy.
+ stage: package
+ tiers: Free
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/276777
diff --git a/data/removals/15_0/15-0-remove-replicaiton-detail-routes.yml b/data/removals/15_0/15-0-remove-replicaiton-detail-routes.yml
new file mode 100644
index 00000000000..133a7464a91
--- /dev/null
+++ b/data/removals/15_0/15-0-remove-replicaiton-detail-routes.yml
@@ -0,0 +1,12 @@
+- name: "Legacy Geo Admin UI routes"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: sranasinghe
+ stage: enablement
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351345"
+ body: |
+ In GitLab 13.0, we introduced new project and design replication details routes in the Geo Admin UI. These routes are `/admin/geo/replication/projects` and `/admin/geo/replication/designs`. We kept the legacy routes and redirected them to the new routes. These legacy routes `/admin/geo/projects` and `/admin/geo/designs` have been removed in GitLab 15.0. Please update any bookmarks or scripts that may use the legacy routes.
+ tiers: ["Premium", "Ultimate"]
diff --git a/data/removals/15_0/15-0-remove-versions-packagetype.yml b/data/removals/15_0/15-0-remove-versions-packagetype.yml
new file mode 100644
index 00000000000..cfce5d8a226
--- /dev/null
+++ b/data/removals/15_0/15-0-remove-versions-packagetype.yml
@@ -0,0 +1,13 @@
+- name: "Remove Versions from PackageType"
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-11-22" # 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: "15.0" # The milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ As part of the work to create a [Package Registry GraphQL API](https://gitlab.com/groups/gitlab-org/-/epics/6318), the Package group deprecated the `Version` type for the basic `PackageType` type and moved it to [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#packagedetailstype).
+
+ In GitLab 15.0, we will completely remove `Version` from `PackageType`.
+ stage: package
+ tiers: Free
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/327453
diff --git a/data/removals/15_0/15-0-remove_ff_push_rules_supersede_code_owners.yml b/data/removals/15_0/15-0-remove_ff_push_rules_supersede_code_owners.yml
new file mode 100644
index 00000000000..b88b6a3f38f
--- /dev/null
+++ b/data/removals/15_0/15-0-remove_ff_push_rules_supersede_code_owners.yml
@@ -0,0 +1,16 @@
+- name: "Removed feature flag PUSH_RULES_SUPERSEDE_CODE_OWNERS" # The name of the feature to be deprecated
+ announcement_milestone: "14.8" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-02-22" # 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: "15.0" # The milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # 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 # If this deprecation is a breaking change, set this value to true
+ reporter: tlinz # GitLab username of the person reporting the deprecation
+ body: | # Do not modify this line, instead modify the lines below.
+ The feature flag `PUSH_RULES_SUPERSEDE_CODE_OWNERS` has been removed in GitLab 15.0. From now on, push rules will supersede CODEOWNERS. The CODEOWNERS feature is no longer available for access control.
+# The following items are not published on the docs page, but may be used in the future.
+ stage: create # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ 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]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/262019 # (optional) This is a link to the deprecation issue in GitLab
+ 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-request-profiling.yml b/data/removals/15_0/15-0-request-profiling.yml
new file mode 100644
index 00000000000..0ca6919130c
--- /dev/null
+++ b/data/removals/15_0/15-0-request-profiling.yml
@@ -0,0 +1,18 @@
+- name: "Request profiling"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: iroussos
+ body: | # Do not modify this line, instead modify the lines below.
+ [Request profiling](https://docs.gitlab.com/ee/administration/monitoring/performance/request_profiling.html) has been removed in GitLab 15.0.
+
+ We're working on [consolidating our profiling tools](https://gitlab.com/groups/gitlab-org/-/epics/7327) and making them more easily accessible.
+ We [evaluated](https://gitlab.com/gitlab-org/gitlab/-/issues/350152) the use of this feature and we found that it is not widely used.
+ It also depends on a few third-party gems that are not actively maintained anymore, have not been updated for the latest version of Ruby, or crash frequently when profiling heavy page loads.
+
+ For more information, check the [summary section of the deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488#deprecation-summary).
+ stage: Monitor
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352488
diff --git a/data/removals/15_0/15-0-runner-api-status-renames-not_connected.yml b/data/removals/15_0/15-0-runner-api-status-renames-not_connected.yml
new file mode 100644
index 00000000000..9406936a2eb
--- /dev/null
+++ b/data/removals/15_0/15-0-runner-api-status-renames-not_connected.yml
@@ -0,0 +1,16 @@
+- name: "Runner status `not_connected` API value"
+ announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
+ deprecated the `not_connected` status value in GitLab 14.6 and will start returning `never_contacted` in its place
+ starting in GitLab 15.0.
+
+ Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
+ stage: Verify
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347305
+ documentation_url: https://docs.gitlab.com/ee/api/runners.html
+ announcement_date: "2021-12-22"
diff --git a/data/removals/15_0/15-0-runner-disable-strict-host-key-check.yml b/data/removals/15_0/15-0-runner-disable-strict-host-key-check.yml
new file mode 100644
index 00000000000..384d025ad66
--- /dev/null
+++ b/data/removals/15_0/15-0-runner-disable-strict-host-key-check.yml
@@ -0,0 +1,14 @@
+- name: "Known host required for GitLab Runner SSH executor"
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ In [GitLab 14.3](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/3074), we added a configuration setting in the GitLab Runner `config.toml`. This setting, [`[runners.ssh.disable_strict_host_key_checking]`](https://docs.gitlab.com/runner/executors/ssh.html#security), controls whether or not to use strict host key checking with the SSH executor.
+
+ In GitLab 15.0, the default value for this configuration option has changed from `true` to `false`. This means that strict host key checking will be enforced when using the GitLab Runner SSH executor.
+ stage: Verify
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab-runner/-/issues/28192
+ documentation_url: https://docs.gitlab.com/runner/executors/ssh.html#security
+ announcement_date: "2021-11-22"
diff --git a/data/removals/15_0/15-0-runner_api_new_stale_status_breaking_change.yml b/data/removals/15_0/15-0-runner_api_new_stale_status_breaking_change.yml
new file mode 100644
index 00000000000..905bc3befce
--- /dev/null
+++ b/data/removals/15_0/15-0-runner_api_new_stale_status_breaking_change.yml
@@ -0,0 +1,17 @@
+- name: "API: `stale` status returned instead of `offline` or `not_connected`"
+ announcement_milestone: "14.6" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-12-22"
+ removal_milestone: "15.0" # the milestone when this feature is planned to be removed
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ A breaking change was made to the Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
+ in 15.0.
+
+ Instead of the GitLab Runner API endpoints returning `offline` and `not_connected` for runners that have not
+ contacted the GitLab instance in the past three months, the API endpoints now return the `stale` value,
+ which was introduced in 14.6.
+ stage: Verify
+ tiers: [Core, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347303
+ documentation_url: https://docs.gitlab.com/ee/api/runners.html#runners-api
diff --git a/data/removals/15_0/15-0-sast-dotnet-21.yml b/data/removals/15_0/15-0-sast-dotnet-21.yml
new file mode 100644
index 00000000000..28f13949154
--- /dev/null
+++ b/data/removals/15_0/15-0-sast-dotnet-21.yml
@@ -0,0 +1,33 @@
+- name: "SAST support for .NET 2.1"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: connorgilbert
+ stage: Secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352553
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The [GitLab SAST Security Code Scan analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan) scans .NET code for security vulnerabilities.
+ For technical reasons, the analyzer must first build the code to scan it.
+
+ In GitLab versions prior to 15.0, the default analyzer image (version 2) included support for:
+
+ - .NET 2.1
+ - .NET Core 3.1
+ - .NET 5.0
+
+ In GitLab 15.0, we've changed the default major version for this analyzer from version 2 to version 3. This change:
+
+ - Adds [severity values for vulnerabilities](https://gitlab.com/gitlab-org/gitlab/-/issues/350408) along with [other new features and improvements](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan/-/blob/master/CHANGELOG.md).
+ - Removes .NET 2.1 support.
+ - Adds support for .NET 6.0, Visual Studio 2019, and Visual Studio 2022.
+
+ Version 3 was [announced in GitLab 14.6](https://about.gitlab.com/releases/2021/12/22/gitlab-14-6-released/#sast-support-for-net-6) and made available as an optional upgrade.
+
+ If you rely on .NET 2.1 support being present in the analyzer image by default, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352553#breaking-change).
+# The following items are not published on the docs page, but may be used in the future.
+ tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks # (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-sast-spotbugs-java-8.yml b/data/removals/15_0/15-0-sast-spotbugs-java-8.yml
new file mode 100644
index 00000000000..c6e59bf4b0f
--- /dev/null
+++ b/data/removals/15_0/15-0-sast-spotbugs-java-8.yml
@@ -0,0 +1,28 @@
+- name: "Out-of-the-box SAST (SpotBugs) support for Java 8"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: connorgilbert
+ stage: Secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352549
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The [GitLab SAST SpotBugs analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) scans [Java, Scala, Groovy, and Kotlin code](https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks) for security vulnerabilities.
+ For technical reasons, the analyzer must first compile the code before scanning.
+ Unless you use the [pre-compilation strategy](https://docs.gitlab.com/ee/user/application_security/sast/#pre-compilation), the analyzer attempts to automatically compile your project's code.
+
+ In GitLab versions prior to 15.0, the analyzer image included Java 8 and Java 11 runtimes to facilitate compilation.
+
+ As of GitLab 15.0, we've:
+
+ - Removed Java 8 from the analyzer image to reduce the size of the image.
+ - Added Java 17 to the analyzer image to make it easier to compile with Java 17.
+ - Changed the default Java version from Java 8 to Java 17.
+
+ If you rely on Java 8 being present in the analyzer environment, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352549#breaking-change).
+# The following items are not published on the docs page, but may be used in the future.
+ tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks # (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-secret-detection-configurations.yml b/data/removals/15_0/15-0-secret-detection-configurations.yml
new file mode 100644
index 00000000000..0f759fae11c
--- /dev/null
+++ b/data/removals/15_0/15-0-secret-detection-configurations.yml
@@ -0,0 +1,30 @@
+- name: "Secret Detection configuration variables"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: false
+ reporter: connorgilbert
+ stage: Secure
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/352565
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ To make it simpler and more reliable to [customize GitLab Secret Detection](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings), we've removed some of the variables that you could previously set in your CI/CD configuration.
+
+ The following variables previously allowed you to customize the options for historical scanning, but interacted poorly with the [GitLab-managed CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml) and are now removed:
+
+ - `SECRET_DETECTION_COMMIT_FROM`
+ - `SECRET_DETECTION_COMMIT_TO`
+ - `SECRET_DETECTION_COMMITS`
+ - `SECRET_DETECTION_COMMITS_FILE`
+
+ The `SECRET_DETECTION_ENTROPY_LEVEL` previously allowed you to configure rules that only considered the entropy level of strings in your codebase, and is now removed.
+ This type of entropy-only rule created an unacceptable number of incorrect results (false positives).
+
+ You can still customize the behavior of the Secret Detection analyzer using the [available CI/CD variables](https://docs.gitlab.com/ee/user/application_security/secret_detection/#available-cicd-variables).
+
+ For further details, see [the deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352565).
+# The following items are not published on the docs page, but may be used in the future.
+ tiers: [Free, Silver, Gold, Core, Premium, Ultimate]
+ documentation_url: https://docs.gitlab.com/ee/user/application_security/secret_detection/#available-cicd-variables # (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-serverless.yml b/data/removals/15_0/15-0-serverless.yml
new file mode 100644
index 00000000000..9f6a94037d8
--- /dev/null
+++ b/data/removals/15_0/15-0-serverless.yml
@@ -0,0 +1,17 @@
+- name: "GitLab Serverless"
+ announcement_milestone: "14.3"
+ announcement_date: "2021-09-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: nagyv-gitlab
+ body: | # Do not modify this line, instead modify the lines below.
+ All functionality related to GitLab Serverless was deprecated in GitLab 14.3 and is scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to explore using the following technologies with GitLab CI/CD:
+
+ - [Serverless Framework](https://www.serverless.com)
+ - [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/deploying-using-gitlab.html)
+
+ For additional context, or to provide feedback regarding this change, please reference our [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/6).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: "Configure"
+ issue_url: https://gitlab.com/groups/gitlab-org/configure/-/epics/6
diff --git a/data/removals/15_0/15-0-sidekiq-metrics-health-check-config.yml b/data/removals/15_0/15-0-sidekiq-metrics-health-check-config.yml
new file mode 100644
index 00000000000..cfd0d5f5b13
--- /dev/null
+++ b/data/removals/15_0/15-0-sidekiq-metrics-health-check-config.yml
@@ -0,0 +1,24 @@
+- name: "Sidekiq configuration for metrics and health checks"
+ announcement_milestone: "14.7"
+ announcement_date: "2021-01-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ In GitLab 15.0, you can no longer serve Sidekiq metrics and health checks over a single address and port.
+
+ To improve stability, availability, and prevent data loss in edge cases, GitLab now serves
+ [Sidekiq metrics and health checks from two separate servers](https://gitlab.com/groups/gitlab-org/-/epics/6409).
+
+ When you use Omnibus or Helm charts, if GitLab is configured for both servers to bind to the same address,
+ a configuration error occurs.
+ To prevent this error, choose different ports for the metrics and health check servers:
+
+ - [Configure Sidekiq health checks](https://docs.gitlab.com/ee/administration/sidekiq.html#configure-health-checks)
+ - [Configure the Sidekiq metrics server](https://docs.gitlab.com/ee/administration/sidekiq.html#configure-the-sidekiq-metrics-server)
+
+ If you installed GitLab from source, verify manually that both servers are configured to bind to separate addresses and ports.
+ stage: Enablement
+ tiers: [Free, Premium, Ultimate]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347509
+ documentation_url: https://docs.gitlab.com/ee/administration/sidekiq.html
diff --git a/data/removals/15_0/15-0-static-site-editor.yml b/data/removals/15_0/15-0-static-site-editor.yml
new file mode 100644
index 00000000000..492c3b5e3d2
--- /dev/null
+++ b/data/removals/15_0/15-0-static-site-editor.yml
@@ -0,0 +1,17 @@
+- name: "Static Site Editor" # (required) the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
+ announcement_milestone: "14.7" # (required) The milestone when this feature was deprecated.
+ announcement_date: "2022-01-22" # (required) The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # (required) The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # (required) This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: false # (required) Change to true if this removal is a breaking change.
+ reporter: ericschurter # (required) GitLab username of the person reporting the removal
+ stage: create # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/347137 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
+ The Static Site Editor was deprecated in GitLab 14.7 and the feature is being removed in GitLab 15.0. Incoming requests to the Static Site Editor will be redirected and open the target file to edit in the Web IDE. Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects. We will continue investing in improvements to the Markdown editing experience by [maturing the Content Editor](https://gitlab.com/groups/gitlab-org/-/epics/5401) and making it available as a way to edit content across GitLab.
+
+# The following items are not published on the docs page, but may be used in the future.
+ 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: https://docs.gitlab.com/ee/user/project/static_site_editor/
+ 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-tracing.yml b/data/removals/15_0/15-0-tracing.yml
new file mode 100644
index 00000000000..b2ad2e525c0
--- /dev/null
+++ b/data/removals/15_0/15-0-tracing.yml
@@ -0,0 +1,16 @@
+- name: "Jaeger integration removed in GitLab 15.0" # The headline announcing the removal. i.e. "`CI_PROJECT_CONFIG_PATH` removed in Gitlab 14.0"
+ announcement_milestone: "14.7" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2022-01-22"
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: true # Change to true if this removal is a breaking change.
+ reporter: kbychu # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distributed tracing system. GitLab users could previously navigate to their Jaeger instance to gain insight into the performance of a deployed application, tracking each function or microservice that handles a given request. Tracing in GitLab was deprecated in GitLab 14.7, and removed in 15.0. To track work on a possible replacement, see the issue for [Opstrace integration with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: Monitor # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: [Free] # (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]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346540 # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: https://docs.gitlab.com/ee/operations/tracing.html # (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-type.yml b/data/removals/15_0/15-0-type.yml
new file mode 100644
index 00000000000..bb1b764f823
--- /dev/null
+++ b/data/removals/15_0/15-0-type.yml
@@ -0,0 +1,10 @@
+- name: "Remove `type` and `types` keyword from CI/CD configuration"
+ announcement_milestone: "14.6"
+ announcement_date: "2021-12-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: dhershkovitch
+ body: | # Do not modify this line, instead modify the lines below.
+ The `type` and `types` CI/CD keywords is removed in GitLab 15.0, so pipelines that use these keywords fail with a syntax error. Switch to `stage` and `stages`, which have the same behavior.
+# The following items are not published on the docs page, but may be used in the future.
diff --git a/data/removals/15_0/15_0-logging.yml b/data/removals/15_0/15_0-logging.yml
new file mode 100644
index 00000000000..2cff8f39e19
--- /dev/null
+++ b/data/removals/15_0/15_0-logging.yml
@@ -0,0 +1,16 @@
+- name: "ELK stack logging removed in GitLab 15.0" # The headline announcing the removal. i.e. "`CI_PROJECT_CONFIG_PATH` removed in Gitlab 14.0"
+ announcement_milestone: "14.7" # The milestone when this feature was deprecated.
+ announcement_date: "2022-01-22" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "15.0" # The milestone when this feature is being removed.
+ removal_date: "2022-05-22" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: true # Change to true if this removal is a breaking change.
+ reporter: kbychu # GitLab username of the person reporting the removal
+ body: | # Do not modify this line, instead modify the lines below.
+ The logging features in GitLab allow users to install the ELK stack (Elasticsearch, Logstash, and Kibana) to aggregate and manage application logs. Users could search for relevant logs in GitLab directly. However, since deprecating certificate-based integration with Kubernetes clusters and GitLab Managed Apps, this feature is no longer available. For more information on the future of logging and observability, you can follow the issue for [integrating Opstrace with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
+# The following items are not published on the docs page, but may be used in the future.
+ stage: Monitor # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
+ tiers: [Free] # (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]
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/346485 # (optional) This is a link to the deprecation issue in GitLab
+ documentation_url: https://docs.gitlab.com/ee/operations/index.html # (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-remove-pipelines-from-version-field.yml b/data/removals/15_0/15_0-remove-pipelines-from-version-field.yml
new file mode 100644
index 00000000000..46bb76b19e1
--- /dev/null
+++ b/data/removals/15_0/15_0-remove-pipelines-from-version-field.yml
@@ -0,0 +1,16 @@
+- name: "Remove pipelines field from the version field" # The name of the feature to be deprecated
+ announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
+ announcement_date: "2021-11-22" # 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: "15.0" # The milestone when this feature is planned to be removed
+ removal_date: "2022-05-22" # The date of the milestone release when this feature is planned to be removed
+ breaking_change: true
+ body: | # Do not modify this line, instead modify the lines below.
+ In GraphQL, there are two `pipelines` fields that you can use in a [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/#packagedetailstype) to get the pipelines for package versions:
+
+ - The `versions` field's `pipelines` field. This returns all the pipelines associated with all the package's versions, which can pull an unbounded number of objects in memory and create performance concerns.
+ - The `pipelines` field of a specific `version`. This returns only the pipelines associated with that single package version.
+
+ To mitigate possible performance problems, we will remove the `versions` field's `pipelines` field in GitLab 15.0. Although you will no longer be able to get all pipelines for all versions of a package, you can still get the pipelines of a single version through the remaining `pipelines` field for that version.
+ stage: package
+ tiers: Free
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342882
diff --git a/data/removals/15_0/removal-manage-premium-required-pipelines.yml b/data/removals/15_0/removal-manage-premium-required-pipelines.yml
new file mode 100644
index 00000000000..1e91fe1d3fc
--- /dev/null
+++ b/data/removals/15_0/removal-manage-premium-required-pipelines.yml
@@ -0,0 +1,18 @@
+- name: "Required pipeline configurations in Premium tier"
+ announcement_milestone: "14.8"
+ announcement_date: "2021-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ [Required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) helps to define and mandate organization-wide pipeline configurations and is a requirement at an executive and organizational level. To align better with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers), this feature is removed from the Premium tier in GitLab 15.0. This feature continues to be available in the GitLab Ultimate tier.
+
+ We recommend customers use [Compliance Pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration), also in GitLab Ultimate, as an alternative as it provides greater flexibility, allowing required pipelines to be assigned to specific compliance framework labels.
+
+ This change also helps GitLab remain consistent in our tiering strategy with the other related Ultimate-tier features:
+
+ - [Security policies](https://docs.gitlab.com/ee/user/application_security/policies/).
+ - [Compliance framework pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration).
+
+ stage: "Manage"
diff --git a/data/removals/15_0/removal_manage_ repository_push_audit_event.yml b/data/removals/15_0/removal_manage_ repository_push_audit_event.yml
new file mode 100644
index 00000000000..474a5c41a95
--- /dev/null
+++ b/data/removals/15_0/removal_manage_ repository_push_audit_event.yml
@@ -0,0 +1,17 @@
+- name: "Audit events for repository push events"
+ announcement_milestone: "14.3"
+ announcement_date: "2021-09-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ body: |
+ Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are removed as of GitLab 15.0.
+
+ Audit events for repository events were always disabled by default and had to be manually enabled with a feature flag.
+ Enabling them could slow down GitLab instances by generating too many events. Therefore, they are removed.
+
+ Please note that we will add high-volume audit events in the future as part of [streaming audit events](https://docs.gitlab.com/ee/administration/audit_event_streaming.html). An example of this is how we will send [Git fetch actions](https://gitlab.com/gitlab-org/gitlab/-/issues/343984) as a streaming audit event. If you would be interested in seeing repository push events or some other action as a streaming audit event, please reach out to us!
+ stage: Manage
+ tiers: Premium
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337993
+ documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#removed-events
diff --git a/data/removals/15_0/removal_manage_optional_pat_expiration.yml b/data/removals/15_0/removal_manage_optional_pat_expiration.yml
new file mode 100644
index 00000000000..21c5b99d1a8
--- /dev/null
+++ b/data/removals/15_0/removal_manage_optional_pat_expiration.yml
@@ -0,0 +1,13 @@
+- name: "Optional enforcement of personal access token expiration"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ Allowing expired personal access tokens to be used is unusual from a security perspective and could create unusual situations where an
+ expired key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so we now do not let expired personal access tokens be used.
+
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351962"
+ documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-access-tokens-to-be-used-removed"
diff --git a/data/removals/15_0/removal_manage_ssh_expiration.yml b/data/removals/15_0/removal_manage_ssh_expiration.yml
new file mode 100644
index 00000000000..accd1d49f6f
--- /dev/null
+++ b/data/removals/15_0/removal_manage_ssh_expiration.yml
@@ -0,0 +1,13 @@
+- name: "Optional enforcement of SSH expiration"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ Disabling SSH expiration enforcement is unusual from a security perspective and could create unusual situations where an expired
+ key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so now we enforce
+ expiration on all SSH keys.
+ issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/351963"
+ documentation_url: "https://docs.gitlab.com/ee/user/admin_area/settings/account_and_limit_settings.html#allow-expired-ssh-keys-to-be-used-deprecated"
diff --git a/data/removals/15_0/removal_manage_status_check_passed_status.yml b/data/removals/15_0/removal_manage_status_check_passed_status.yml
new file mode 100644
index 00000000000..598cba369cb
--- /dev/null
+++ b/data/removals/15_0/removal_manage_status_check_passed_status.yml
@@ -0,0 +1,25 @@
+- name: "External status check API breaking changes"
+ announcement_milestone: "14.8"
+ announcement_date: "2022-02-22"
+ removal_milestone: "15.0"
+ removal_date: "2022-05-22"
+ breaking_change: true
+ reporter: stkerr
+ body: |
+ The [external status check API](https://docs.gitlab.com/ee/api/status_checks.html) was originally implemented to
+ support pass-by-default requests to mark a status check as passing. Pass-by-default requests are now removed.
+ Specifically, the following are removed:
+
+ - Requests that do not contain the `status` field.
+ - Requests that have the `status` field set to `approved`.
+
+ From GitLab 15.0, status checks are only set to a passing state if the `status` field is both present
+ and set to `passed`. Requests that:
+
+ - Do not contain the `status` field will be rejected with a `400` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
+ - Contain any value other than `passed`, such as `approved`, cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+
+ To align with this change, API calls to list external status checks also return the value of `passed` rather than
+ `approved` for status checks that have passed.
+ stage: "Manage"
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339039
diff --git a/data/removals/templates/example.yml b/data/removals/templates/example.yml
index 0904c6a6d7a..b6c3c75d496 100644
--- a/data/removals/templates/example.yml
+++ b/data/removals/templates/example.yml
@@ -9,14 +9,16 @@
#
# Please delete this line and above before submitting your merge request.
-- name: "Feature name" # the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
- announcement_milestone: "XX.YY" # The milestone when this feature was deprecated.
- announcement_date: "YYYY-MM-DD" # The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
- removal_milestone: "XX.YY" # The milestone when this feature is being removed.
- removal_date: "YYYY-MM-DD" # This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
- breaking_change: false # Change to true if this removal is a breaking change.
- reporter: exampleuser # GitLab username of the person reporting the removal
- body: | # Do not modify this line, instead modify the lines below.
+- name: "Feature name" # (required) the name of the feature being removed. Avoid the words `deprecation`, `deprecate`, `removal`, and `remove` in this field because these are implied.
+ announcement_milestone: "XX.YY" # (required) The milestone when this feature was deprecated.
+ announcement_date: "YYYY-MM-DD" # (required) The date of the milestone release when this feature was deprecated. This should almost always be the 22nd of a month (YYYY-MM-DD), unless you did an out of band blog post.
+ removal_milestone: "XX.YY" # (required) The milestone when this feature is being removed.
+ removal_date: "YYYY-MM-DD" # (required) This should almost always be the 22nd of a month (YYYY-MM-DD), the date of the milestone release when this feature will be removed.
+ breaking_change: false # (required) Change to true if this removal is a breaking change.
+ reporter: exampleuser # (required) GitLab username of the person reporting the removal
+ stage: stage # (required) String value of the stage that the feature was created in. e.g., Growth
+ issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/000000 # (required) Link to the deprecation issue in GitLab
+ body: | # (required) Do not modify this line, instead modify the lines below.
<!-- START OF BODY COMMENT
This area supports markdown. Delete this entire comment and replace it with your markdown content.
@@ -25,9 +27,7 @@
END OF BODY COMMENT -->
# The following items are not published on the docs page, but may be used in the future.
- stage: # (optional - may be required in the future) String value of the stage that the feature was created in. e.g., Growth
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]
- issue_url: # (optional) This is a link to the deprecation issue in GitLab
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/whats_new/202107220001_14_1.yml b/data/whats_new/202107220001_14_1.yml
index 3c67d74d3db..881d96c58d3 100644
--- a/data/whats_new/202107220001_14_1.yml
+++ b/data/whats_new/202107220001_14_1.yml
@@ -90,22 +90,22 @@
image_url: https://img.youtube.com/vi/-1MuKzWJXKQ/hqdefault.jpg
published_at: 2021-07-22
release: 14.1
-- title: CI/CD Tunnel for Kubernetes clusters
+- title: CI/CD workflow for Kubernetes clusters
body: |
- Until now, connecting Kubernetes clusters to GitLab CI/CD required users to open up their clusters towards GitLab. Some organizations do not encourage opening up their firewall externally due to security concerns.
+ Until now, connecting Kubernetes clusters to GitLab CI/CD required you to open up your clusters towards GitLab. Some organizations do not encourage opening up their firewall externally due to security concerns.
- GitLab now ships with a CI/CD Tunnel that connects GitLab Runners with your Kubernetes cluster using the [GitLab Kubernetes Agent](https://docs.gitlab.com/ee/user/clusters/agent/). This enables versatile GitOps workflows where the deployment logic can be coded in the pipeline.
+ GitLab now ships with a CI/CD functionality that connects runners with your Kubernetes cluster by using the [GitLab agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/). This enables versatile GitOps workflows where the deployment logic can be coded in the pipeline.
You and your team can safely use your preferred tool to run the deployment itself using `kubectl`, `helm`, `kpt`, `tanka`, or anything else without security concerns.
- To use the tunnel, define the `kubecontext` in your CI/CD pipeline to connect with your agent. To simplify this process, we plan to [automatically inject the `kubecontext`](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) into the CI/CD environment in a future iteration.
+ Define the `kubecontext` in your CI/CD pipeline to connect with your agent. To simplify this process, we plan to [automatically inject the `kubecontext`](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) into the CI/CD environment in a future iteration.
- The CI/CD tunnel is currently supported only from the project where the agent was configured but we are working on [adding group-level support](https://gitlab.com/groups/gitlab-org/-/epics/5784). You can safely start using the tunnel on GitLab SaaS and self-managed instances.
+ This type of connection is currently supported only from the project where the agent was configured but we are working on [adding group-level support](https://gitlab.com/groups/gitlab-org/-/epics/5784). You can safely start using CI/CD in your jobs on GitLab SaaS and self-managed instances.
stage: Configure
self-managed: true
gitlab-com: true
packages: [Premium, Ultimate]
- url: https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_tunnel.html
+ url: https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html
image_url: https://img.youtube.com/vi/eXxM4ScqiJs/hqdefault.jpg
published_at: 2021-07-22
release: 14.1
diff --git a/data/whats_new/202109200001_14_03.yml b/data/whats_new/202109200001_14_03.yml
index ab82772e637..fa0f05bf0a0 100644
--- a/data/whats_new/202109200001_14_03.yml
+++ b/data/whats_new/202109200001_14_03.yml
@@ -72,7 +72,7 @@
release: 14.3
- title: Grant group access to the GitLab Kubernetes Agent
body: |
- The GitLab Kubernetes Agent provides a secure connection between a Kubernetes cluster and GitLab. Until GitLab 14.2, the CI/CD Tunnel enabled pushing to a cluster only from the same project where the Kubernetes Agent was registered. In GitLab 14.3, the Agent can be authorized to access entire groups. As a result, every project under the authorized group has access to the cluster without the need to register an agent for every project.
+ The GitLab Kubernetes Agent provides a secure connection between a Kubernetes cluster and GitLab. Until GitLab 14.2, the GitLab CI/CD enabled pushing to a cluster only from the same project where the Kubernetes Agent was registered. In GitLab 14.3, the Agent can be authorized to access entire groups. As a result, every project under the authorized group has access to the cluster without the need to register an agent for every project.
stage: Configure
self-managed: true
gitlab-com: true
diff --git a/data/whats_new/2021111800001_14_05.yml b/data/whats_new/2021111800001_14_05.yml
index 5a7607478fc..71f4b0245b9 100644
--- a/data/whats_new/2021111800001_14_05.yml
+++ b/data/whats_new/2021111800001_14_05.yml
@@ -53,7 +53,7 @@
release: 14.5
- title: GitLab Kubernetes Agent available in GitLab Free
body: |
- Connecting a Kubernetes cluster with the GitLab Kubernetes Agent simplifies the setup for cluster applications and enables secure GitOps deployments to the cluster. Initially, the GitLab Kubernetes Agent was available only for Premium users. In our commitment to the open source ethos, we moved the core features of the GitLab Kubernetes Agent and the CI/CD Tunnel to GitLab Free. We expect that the open-sourced features are compelling to many users without dedicated infrastructure teams and strong requirements around cluster management. Advanced features remain available as part of the GitLab Premium offering.
+ Connecting a Kubernetes cluster with the GitLab Kubernetes Agent simplifies the setup for cluster applications and enables secure GitOps deployments to the cluster. Initially, the GitLab Kubernetes Agent was available only for Premium users. In our commitment to the open source ethos, we moved the core features of the GitLab agent for Kubernetes and the ability to use CI/CD with Kubernetes to GitLab Free. We expect that the open-sourced features are compelling to many users without dedicated infrastructure teams and strong requirements around cluster management. Advanced features remain available as part of the GitLab Premium offering.
stage: Configure
self-managed: true
gitlab-com: true
diff --git a/db/docs/abuse_reports.yml b/db/docs/abuse_reports.yml
index b05b9618a27..dcd081e6892 100644
--- a/db/docs/abuse_reports.yml
+++ b/db/docs/abuse_reports.yml
@@ -3,7 +3,7 @@ table_name: abuse_reports
classes:
- AbuseReport
feature_categories:
-- users
-description: TODO
+- instance_resiliency
+description: Stores abuse reports from other users.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cba7f20dc8614d12e3eeda6e14f454aeb22b9b54
milestone: '7.13'
diff --git a/db/docs/alert_management_alert_assignees.yml b/db/docs/alert_management_alert_assignees.yml
index 23b81240c11..4d5a1acb0ca 100644
--- a/db/docs/alert_management_alert_assignees.yml
+++ b/db/docs/alert_management_alert_assignees.yml
@@ -4,6 +4,6 @@ classes:
- AlertManagement::AlertAssignee
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Persists metadata between users and alerts to support alert assignments
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32609
milestone: '13.1'
diff --git a/db/docs/alert_management_alert_metric_images.yml b/db/docs/alert_management_alert_metric_images.yml
index e43be4f854c..bcfa2b54b1c 100644
--- a/db/docs/alert_management_alert_metric_images.yml
+++ b/db/docs/alert_management_alert_metric_images.yml
@@ -4,6 +4,6 @@ classes:
- AlertManagement::MetricImage
feature_categories:
- incident_management
-description: TODO
+description: Persists metadata for uploads related to alerts
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80339
milestone: '14.8'
diff --git a/db/docs/alert_management_alert_user_mentions.yml b/db/docs/alert_management_alert_user_mentions.yml
index c834c2a8b12..6a3aaf2ce83 100644
--- a/db/docs/alert_management_alert_user_mentions.yml
+++ b/db/docs/alert_management_alert_user_mentions.yml
@@ -4,6 +4,6 @@ classes:
- AlertManagement::AlertUserMention
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Persists metadata for system notes related to alerts
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33217
milestone: '13.1'
diff --git a/db/docs/alert_management_alerts.yml b/db/docs/alert_management_alerts.yml
index 1d5cbf0df23..ca8b02ec346 100644
--- a/db/docs/alert_management_alerts.yml
+++ b/db/docs/alert_management_alerts.yml
@@ -4,6 +4,6 @@ classes:
- AlertManagement::Alert
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Persists incoming alert data including its payload
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29864
milestone: '13.0'
diff --git a/db/docs/alert_management_http_integrations.yml b/db/docs/alert_management_http_integrations.yml
index 7dba70bcb67..8fa330f0775 100644
--- a/db/docs/alert_management_http_integrations.yml
+++ b/db/docs/alert_management_http_integrations.yml
@@ -4,6 +4,6 @@ classes:
- AlertManagement::HttpIntegration
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44098
+description: Persists settings for alert HTTP integrations
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43634
milestone: '13.5'
diff --git a/db/docs/allowed_email_domains.yml b/db/docs/allowed_email_domains.yml
index 69f7aa3a804..65a12dd712c 100644
--- a/db/docs/allowed_email_domains.yml
+++ b/db/docs/allowed_email_domains.yml
@@ -3,7 +3,7 @@ table_name: allowed_email_domains
classes:
- AllowedEmailDomain
feature_categories:
-- users
-description: TODO
+- subgroups
+description: Stores email domains for group, only members with email from those domains can be added to the group
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14800
milestone: '12.2'
diff --git a/db/docs/analytics_cycle_analytics_group_value_streams.yml b/db/docs/analytics_cycle_analytics_group_value_streams.yml
index fdf620c382f..d41ed8168d0 100644
--- a/db/docs/analytics_cycle_analytics_group_value_streams.yml
+++ b/db/docs/analytics_cycle_analytics_group_value_streams.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- value_stream_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36658
milestone: '13.2'
diff --git a/db/docs/analytics_cycle_analytics_project_value_streams.yml b/db/docs/analytics_cycle_analytics_project_value_streams.yml
index 28c3f7082a2..9b63ea0500a 100644
--- a/db/docs/analytics_cycle_analytics_project_value_streams.yml
+++ b/db/docs/analytics_cycle_analytics_project_value_streams.yml
@@ -3,7 +3,7 @@ table_name: analytics_cycle_analytics_project_value_streams
classes:
- Analytics::CycleAnalytics::ProjectValueStream
feature_categories:
-- planning_analytics
-description: TODO
+- value_stream_management
+description: Used to store the value stream configurations for projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60925
milestone: '13.12'
diff --git a/db/docs/application_settings.yml b/db/docs/application_settings.yml
index 578e8ad5c3d..ae28221b7ac 100644
--- a/db/docs/application_settings.yml
+++ b/db/docs/application_settings.yml
@@ -6,7 +6,6 @@ feature_categories:
- continuous_integration
- integrations
- metrics
-- pages
- service_ping
- source_code_management
description: GitLab application settings
diff --git a/db/docs/approval_merge_request_rules_approved_approvers.yml b/db/docs/approval_merge_request_rules_approved_approvers.yml
index a9b46353dd0..9074a4dd39a 100644
--- a/db/docs/approval_merge_request_rules_approved_approvers.yml
+++ b/db/docs/approval_merge_request_rules_approved_approvers.yml
@@ -3,6 +3,6 @@ table_name: approval_merge_request_rules_approved_approvers
classes: []
feature_categories:
- code_review
-description: TODO
+description: Join table for approved approvers and ApprovalMergeRequestRule
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8497
milestone: '11.7'
diff --git a/db/docs/approvers.yml b/db/docs/approvers.yml
index 01f7ac1f4e9..86fc663be93 100644
--- a/db/docs/approvers.yml
+++ b/db/docs/approvers.yml
@@ -3,7 +3,7 @@ table_name: approvers
classes:
- Approver
feature_categories:
-- security_orchestration
-description: TODO
+- code_review
+description: Approvers of given merge request
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3cc78d89984d9c9df8372c52b7bba38e6226f9f2
milestone: '7.13'
diff --git a/db/docs/ar_internal_metadata.yml b/db/docs/ar_internal_metadata.yml
index c25904a3a1b..e299e9f6317 100644
--- a/db/docs/ar_internal_metadata.yml
+++ b/db/docs/ar_internal_metadata.yml
@@ -3,6 +3,7 @@ table_name: ar_internal_metadata
classes: []
feature_categories:
- database
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
-milestone: '13.0'
+description: >-
+ An internal table used by ActiveRecord to store information about how the database was migrated.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: '0.8'
diff --git a/db/docs/atlassian_identities.yml b/db/docs/atlassian_identities.yml
index 0df18d40ab4..64e29a80817 100644
--- a/db/docs/atlassian_identities.yml
+++ b/db/docs/atlassian_identities.yml
@@ -3,7 +3,7 @@ table_name: atlassian_identities
classes:
- Atlassian::Identity
feature_categories:
-- importers
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- authentication_and_authorization
+description: Stores Atlassian credentials that are used to integrate with Atlassian API
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40176
milestone: '13.4'
diff --git a/db/docs/authentication_events.yml b/db/docs/authentication_events.yml
index fb76b359854..7eec9124e81 100644
--- a/db/docs/authentication_events.yml
+++ b/db/docs/authentication_events.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- authentication_and_authorization
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/39652
milestone: '13.4'
diff --git a/db/docs/award_emoji.yml b/db/docs/award_emoji.yml
index feef2ee340e..7405e3e57e2 100644
--- a/db/docs/award_emoji.yml
+++ b/db/docs/award_emoji.yml
@@ -3,7 +3,7 @@ table_name: award_emoji
classes:
- AwardEmoji
feature_categories:
-- snippets
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3bdc57f0a710b3769381ecad7ea4098223ecff56
+- team_planning
+description: Store the awarding of emoji by users on Issues, Epics, and other Awardables.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/3785
milestone: '8.9'
diff --git a/db/docs/background_migration_jobs.yml b/db/docs/background_migration_jobs.yml
index a07e605210f..b0fd5b58d50 100644
--- a/db/docs/background_migration_jobs.yml
+++ b/db/docs/background_migration_jobs.yml
@@ -4,6 +4,8 @@ classes:
- Gitlab::Database::BackgroundMigrationJob
feature_categories:
- database
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: >-
+ The background_migration_jobs table stores information about the jobs processed during the execution of a background migration.
+ See https://docs.gitlab.com/ee/development/database/background_migrations.html for more details.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35913
milestone: '13.2'
diff --git a/db/docs/badges.yml b/db/docs/badges.yml
index f96a3c37bcc..209d4d1d88a 100644
--- a/db/docs/badges.yml
+++ b/db/docs/badges.yml
@@ -6,6 +6,6 @@ classes:
- ProjectBadge
feature_categories:
- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8fe880dc064e0e6cd10f7176ade7c312cfb37b90
+description: Stores badges records
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17082
milestone: '10.6'
diff --git a/db/docs/batched_background_migration_job_transition_logs.yml b/db/docs/batched_background_migration_job_transition_logs.yml
index 32e18facc18..826145d82b4 100644
--- a/db/docs/batched_background_migration_job_transition_logs.yml
+++ b/db/docs/batched_background_migration_job_transition_logs.yml
@@ -4,6 +4,8 @@ classes:
- Gitlab::Database::BackgroundMigration::BatchedJobTransitionLog
feature_categories:
- database
-description: TODO
+description: >-
+ The batched_background_migration_job_transition_logs table stores information about the batched background migrations jobs transitions.
+ Every time a batched background migrations job changes to a new state, the system records that information in this table.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75113
milestone: '14.8'
diff --git a/db/docs/batched_background_migration_jobs.yml b/db/docs/batched_background_migration_jobs.yml
index ed63a1527e5..4a307d28781 100644
--- a/db/docs/batched_background_migration_jobs.yml
+++ b/db/docs/batched_background_migration_jobs.yml
@@ -4,6 +4,7 @@ classes:
- Gitlab::Database::BackgroundMigration::BatchedJob
feature_categories:
- database
-description: TODO
+description: >-
+ The batched_background_migration_jobs table stores information about the jobs created during the execution of a batched background migration.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54628
milestone: '13.10'
diff --git a/db/docs/batched_background_migrations.yml b/db/docs/batched_background_migrations.yml
index cdb9df4824f..a8285210801 100644
--- a/db/docs/batched_background_migrations.yml
+++ b/db/docs/batched_background_migrations.yml
@@ -4,6 +4,8 @@ classes:
- Gitlab::Database::BackgroundMigration::BatchedMigration
feature_categories:
- database
-description: TODO
+description: >-
+ The batched_background_migrations table stores information about the batched background migrations present in the system.
+ See https://docs.gitlab.com/ee/development/batched_background_migrations.html for more details.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54628
milestone: '13.10'
diff --git a/db/docs/board_assignees.yml b/db/docs/board_assignees.yml
index f570eda19ee..dd7235a440e 100644
--- a/db/docs/board_assignees.yml
+++ b/db/docs/board_assignees.yml
@@ -4,6 +4,6 @@ classes:
- BoardAssignee
feature_categories:
- team_planning
-description: TODO
+description: Used by issue boards to filter issues by assignee as part of the default scope
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2912
milestone: '10.2'
diff --git a/db/docs/board_group_recent_visits.yml b/db/docs/board_group_recent_visits.yml
index 0dfe7f8cb4b..3e516038737 100644
--- a/db/docs/board_group_recent_visits.yml
+++ b/db/docs/board_group_recent_visits.yml
@@ -4,6 +4,6 @@ classes:
- BoardGroupRecentVisit
feature_categories:
- team_planning
-description: TODO
+description: The last group issue board visited by a user, used to redirect them from the default boards page
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7aeab58f4861144fcc1d334907cb1b465c645001
milestone: '11.5'
diff --git a/db/docs/board_labels.yml b/db/docs/board_labels.yml
index a6e7cf8daac..33dfdd5df70 100644
--- a/db/docs/board_labels.yml
+++ b/db/docs/board_labels.yml
@@ -4,6 +4,6 @@ classes:
- BoardLabel
feature_categories:
- team_planning
-description: TODO
+description: Used by issue boards to filter issues by label as part of the default scope
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/2912
milestone: '10.2'
diff --git a/db/docs/board_project_recent_visits.yml b/db/docs/board_project_recent_visits.yml
index a1d5a03452f..bd7783acfe7 100644
--- a/db/docs/board_project_recent_visits.yml
+++ b/db/docs/board_project_recent_visits.yml
@@ -4,6 +4,6 @@ classes:
- BoardProjectRecentVisit
feature_categories:
- team_planning
-description: TODO
+description: The last project issue board visited by a user, used to redirect them from the default boards page
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7aeab58f4861144fcc1d334907cb1b465c645001
milestone: '11.5'
diff --git a/db/docs/board_user_preferences.yml b/db/docs/board_user_preferences.yml
index 209374e9d66..61b30c4fc66 100644
--- a/db/docs/board_user_preferences.yml
+++ b/db/docs/board_user_preferences.yml
@@ -4,6 +4,6 @@ classes:
- BoardUserPreference
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Preferences for issue boards stored on a per user basis, such as whether to hide or show labels
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33892
milestone: '13.1'
diff --git a/db/docs/boards.yml b/db/docs/boards.yml
index c837f24f3ff..bf50cecd826 100644
--- a/db/docs/boards.yml
+++ b/db/docs/boards.yml
@@ -3,7 +3,7 @@ table_name: boards
classes:
- Board
feature_categories:
-- design_management
-description: TODO
+- team_planning
+description: Configuration information for issue boards, including default scope and visibility of open and closed lists
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/611dab2e522e5e59cf09cd459a31686e65616863
milestone: '8.11'
diff --git a/db/docs/boards_epic_board_labels.yml b/db/docs/boards_epic_board_labels.yml
index 3f273abe5de..d34499f8105 100644
--- a/db/docs/boards_epic_board_labels.yml
+++ b/db/docs/boards_epic_board_labels.yml
@@ -3,7 +3,7 @@ table_name: boards_epic_board_labels
classes:
- Boards::EpicBoardLabel
feature_categories:
-- team_planning
-description: TODO
+- portfolio_management
+description: Information relating epic boards to labels used to scope the boards
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48658
milestone: '13.7'
diff --git a/db/docs/boards_epic_board_positions.yml b/db/docs/boards_epic_board_positions.yml
index 895be38e94a..88d01bc9a11 100644
--- a/db/docs/boards_epic_board_positions.yml
+++ b/db/docs/boards_epic_board_positions.yml
@@ -3,7 +3,7 @@ table_name: boards_epic_board_positions
classes:
- Boards::EpicBoardPosition
feature_categories:
-- team_planning
-description: TODO
+- portfolio_management
+description: Relates epics to epic boards by position, unique to each combination of epic and board
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48120
milestone: '13.7'
diff --git a/db/docs/boards_epic_board_recent_visits.yml b/db/docs/boards_epic_board_recent_visits.yml
index 35929e178be..c60d1400f8c 100644
--- a/db/docs/boards_epic_board_recent_visits.yml
+++ b/db/docs/boards_epic_board_recent_visits.yml
@@ -3,7 +3,7 @@ table_name: boards_epic_board_recent_visits
classes:
- Boards::EpicBoardRecentVisit
feature_categories:
-- team_planning
-description: TODO
+- portfolio_management
+description: The epic board most recently visited by users, used to determine where to redirect them by default
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60720
milestone: '13.12'
diff --git a/db/docs/boards_epic_boards.yml b/db/docs/boards_epic_boards.yml
index 0603ce71c21..7b35decdd54 100644
--- a/db/docs/boards_epic_boards.yml
+++ b/db/docs/boards_epic_boards.yml
@@ -4,6 +4,6 @@ classes:
- Boards::EpicBoard
feature_categories:
- portfolio_management
-description: TODO
+description: Configuration information for epic boards, including default scope and visibility of open and closed lists
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48658
milestone: '13.7'
diff --git a/db/docs/boards_epic_list_user_preferences.yml b/db/docs/boards_epic_list_user_preferences.yml
index 38f4a1e020b..ea3eee5a33f 100644
--- a/db/docs/boards_epic_list_user_preferences.yml
+++ b/db/docs/boards_epic_list_user_preferences.yml
@@ -3,7 +3,7 @@ table_name: boards_epic_list_user_preferences
classes:
- Boards::EpicListUserPreference
feature_categories:
-- team_planning
-description: TODO
+- portfolio_management
+description: Epic board list preferences on a per-user basis, specifically whether the user has collapsed the list or not
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/54541
milestone: '13.10'
diff --git a/db/docs/boards_epic_lists.yml b/db/docs/boards_epic_lists.yml
index 2a723b4d24e..87a15e4dde0 100644
--- a/db/docs/boards_epic_lists.yml
+++ b/db/docs/boards_epic_lists.yml
@@ -4,6 +4,6 @@ classes:
- Boards::EpicList
feature_categories:
- portfolio_management
-description: TODO
+description: Configuration of a single list within an epic board
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49728
-milestone: '13.8'
+milestone: '13.7'
diff --git a/db/docs/boards_epic_user_preferences.yml b/db/docs/boards_epic_user_preferences.yml
index 3fa841c2703..8137d370ebe 100644
--- a/db/docs/boards_epic_user_preferences.yml
+++ b/db/docs/boards_epic_user_preferences.yml
@@ -3,7 +3,7 @@ table_name: boards_epic_user_preferences
classes:
- Boards::EpicUserPreference
feature_categories:
-- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- portfolio_management
+description: The epic_ids used to create swimlanes on issue boards; stored per user, per board
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40360
milestone: '13.4'
diff --git a/db/docs/bulk_import_configurations.yml b/db/docs/bulk_import_configurations.yml
index 2138fbc4d56..8456e834230 100644
--- a/db/docs/bulk_import_configurations.yml
+++ b/db/docs/bulk_import_configurations.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::Configuration
feature_categories:
- importers
-description: TODO
+description: Used to store the configuration details of a bulk import of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
milestone: '13.5'
diff --git a/db/docs/bulk_import_entities.yml b/db/docs/bulk_import_entities.yml
index 373f5f76369..250df850949 100644
--- a/db/docs/bulk_import_entities.yml
+++ b/db/docs/bulk_import_entities.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::Entity
feature_categories:
- importers
-description: TODO
+description: Used to store and track the status of the migration of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
milestone: '13.5'
diff --git a/db/docs/bulk_import_export_uploads.yml b/db/docs/bulk_import_export_uploads.yml
index 7b5dcf28102..40b418b2711 100644
--- a/db/docs/bulk_import_export_uploads.yml
+++ b/db/docs/bulk_import_export_uploads.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::ExportUpload
feature_categories:
- importers
-description: TODO
+description: Used to store information of the exported files containing the data of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59976
milestone: '13.12'
diff --git a/db/docs/bulk_import_exports.yml b/db/docs/bulk_import_exports.yml
index d64391b8b52..27af7fd1892 100644
--- a/db/docs/bulk_import_exports.yml
+++ b/db/docs/bulk_import_exports.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::Export
feature_categories:
- importers
-description: TODO
+description: Used to track the generation status of export files for groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59976
milestone: '13.12'
diff --git a/db/docs/bulk_import_failures.yml b/db/docs/bulk_import_failures.yml
index 52e019deeea..87a127f47c4 100644
--- a/db/docs/bulk_import_failures.yml
+++ b/db/docs/bulk_import_failures.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::Failure
feature_categories:
- importers
-description: TODO
+description: Used to store failures that occur during the migration of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47526
milestone: '13.7'
diff --git a/db/docs/bulk_import_trackers.yml b/db/docs/bulk_import_trackers.yml
index 8ad5e6a7029..6f31bfb7c80 100644
--- a/db/docs/bulk_import_trackers.yml
+++ b/db/docs/bulk_import_trackers.yml
@@ -4,6 +4,6 @@ classes:
- BulkImports::Tracker
feature_categories:
- importers
-description: TODO
+description: Used to store and track the status of each pipeline associated with the migration of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47009
milestone: '13.6'
diff --git a/db/docs/bulk_imports.yml b/db/docs/bulk_imports.yml
index 2f63f742618..354cb9c4ef7 100644
--- a/db/docs/bulk_imports.yml
+++ b/db/docs/bulk_imports.yml
@@ -4,6 +4,6 @@ classes:
- BulkImport
feature_categories:
- importers
-description: TODO
+description: Used to store and track the status of a bulk import request of groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42978
milestone: '13.5'
diff --git a/db/docs/chat_names.yml b/db/docs/chat_names.yml
index aadfdfaa89f..c588c65dca5 100644
--- a/db/docs/chat_names.yml
+++ b/db/docs/chat_names.yml
@@ -3,7 +3,8 @@ table_name: chat_names
classes:
- ChatName
feature_categories:
-- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c60437786bfe43344b4a5eb040437f73f37c6396
+- integrations
+- chatops
+description: Stores mappings from external chat accounts to GitLab users.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7450
milestone: '8.14'
diff --git a/db/docs/chat_teams.yml b/db/docs/chat_teams.yml
index c2b15011547..295947d77c8 100644
--- a/db/docs/chat_teams.yml
+++ b/db/docs/chat_teams.yml
@@ -3,7 +3,8 @@ table_name: chat_teams
classes:
- ChatTeam
feature_categories:
-- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/297dc70158f905fef4557d1ee6510bcf459a08a9
+- integrations
+- chatops
+description: Stores mappings from external chat teams to GitLab groups.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/8746
milestone: '9.0'
diff --git a/db/docs/ci_build_needs.yml b/db/docs/ci_build_needs.yml
index 976d834c884..f9367124ed2 100644
--- a/db/docs/ci_build_needs.yml
+++ b/db/docs/ci_build_needs.yml
@@ -4,6 +4,6 @@ classes:
- Ci::BuildNeed
feature_categories:
- pipeline_authoring
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e7ee84aad4237eaa16f2aba75b4d2c7860625c9d
+description: Dependencies for a specific CI/CD job.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31328
milestone: '12.2'
diff --git a/db/docs/ci_build_pending_states.yml b/db/docs/ci_build_pending_states.yml
index 7f6ce6de4a2..aa9e07d64b5 100644
--- a/db/docs/ci_build_pending_states.yml
+++ b/db/docs/ci_build_pending_states.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- continuous_integration
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41585
milestone: '13.4'
diff --git a/db/docs/ci_build_report_results.yml b/db/docs/ci_build_report_results.yml
index 101f1b0ce83..42d152221f3 100644
--- a/db/docs/ci_build_report_results.yml
+++ b/db/docs/ci_build_report_results.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- code_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32991
milestone: '13.1'
diff --git a/db/docs/ci_daily_build_group_report_results.yml b/db/docs/ci_daily_build_group_report_results.yml
index 4b481176b38..8f23ac42bd0 100644
--- a/db/docs/ci_daily_build_group_report_results.yml
+++ b/db/docs/ci_daily_build_group_report_results.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- code_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30387
milestone: '13.0'
diff --git a/db/docs/ci_deleted_objects.yml b/db/docs/ci_deleted_objects.yml
index 7189b0a7c6c..24d19069913 100644
--- a/db/docs/ci_deleted_objects.yml
+++ b/db/docs/ci_deleted_objects.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- build_artifacts
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44928
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9bf76fe03f8edf4f67023448161af27abb8fb521
milestone: '13.5'
diff --git a/db/docs/ci_freeze_periods.yml b/db/docs/ci_freeze_periods.yml
index ed28e4189e9..877e18acd9d 100644
--- a/db/docs/ci_freeze_periods.yml
+++ b/db/docs/ci_freeze_periods.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- continuous_integration
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29162
milestone: '13.0'
diff --git a/db/docs/ci_instance_variables.yml b/db/docs/ci_instance_variables.yml
index a73a38d2a02..aaac23556d6 100644
--- a/db/docs/ci_instance_variables.yml
+++ b/db/docs/ci_instance_variables.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- pipeline_authoring
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30156
milestone: '13.0'
diff --git a/db/docs/ci_job_artifact_states.yml b/db/docs/ci_job_artifact_states.yml
index d555c2d4564..6fe7443dd26 100644
--- a/db/docs/ci_job_artifact_states.yml
+++ b/db/docs/ci_job_artifact_states.yml
@@ -4,6 +4,6 @@ classes:
- Geo::JobArtifactState
feature_categories:
- geo_replication
-description: TODO
+description: Separate table for job artifacts containing Geo verification metadata.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75264
milestone: '14.8'
diff --git a/db/docs/ci_pipeline_artifacts.yml b/db/docs/ci_pipeline_artifacts.yml
index 31aaa42bf0f..753a57c74e2 100644
--- a/db/docs/ci_pipeline_artifacts.yml
+++ b/db/docs/ci_pipeline_artifacts.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- build_artifacts
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37969
milestone: '13.3'
diff --git a/db/docs/ci_pipeline_messages.yml b/db/docs/ci_pipeline_messages.yml
index 9a66ad366b1..ad759f5f7e6 100644
--- a/db/docs/ci_pipeline_messages.yml
+++ b/db/docs/ci_pipeline_messages.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- continuous_integration
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33762
milestone: '13.2'
diff --git a/db/docs/ci_platform_metrics.yml b/db/docs/ci_platform_metrics.yml
index 4d64ed63894..26039b8a7c8 100644
--- a/db/docs/ci_platform_metrics.yml
+++ b/db/docs/ci_platform_metrics.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- continuous_integration
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40036
milestone: '13.4'
diff --git a/db/docs/ci_runner_namespaces.yml b/db/docs/ci_runner_namespaces.yml
index 30414d064c3..ea57281076d 100644
--- a/db/docs/ci_runner_namespaces.yml
+++ b/db/docs/ci_runner_namespaces.yml
@@ -4,6 +4,6 @@ classes:
- Ci::RunnerNamespace
feature_categories:
- runner
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0970e7b9608d6ada1c0fe45242ea092ea91068aa
+description: Relationships between runners and namespaces for group runners
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1549239849adf31a078be7503ab2288795e337cf
milestone: '10.8'
diff --git a/db/docs/ci_runner_projects.yml b/db/docs/ci_runner_projects.yml
index 80e3a333999..120044e4a34 100644
--- a/db/docs/ci_runner_projects.yml
+++ b/db/docs/ci_runner_projects.yml
@@ -4,6 +4,6 @@ classes:
- Ci::RunnerProject
feature_categories:
- runner
-description: TODO
+description: Relationships between runners and projects for project runners
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
milestone: '8.0'
diff --git a/db/docs/ci_runners.yml b/db/docs/ci_runners.yml
index 9725c668507..1ca8cb39738 100644
--- a/db/docs/ci_runners.yml
+++ b/db/docs/ci_runners.yml
@@ -4,6 +4,8 @@ classes:
- Ci::Runner
feature_categories:
- runner
-description: TODO
+- runner_fleet
+- runner_saas
+description: Registered CI runners
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62
milestone: '8.0'
diff --git a/db/docs/ci_sources_pipelines.yml b/db/docs/ci_sources_pipelines.yml
index a217d2453d7..1fdc758a181 100644
--- a/db/docs/ci_sources_pipelines.yml
+++ b/db/docs/ci_sources_pipelines.yml
@@ -3,7 +3,7 @@ table_name: ci_sources_pipelines
classes:
- Ci::Sources::Pipeline
feature_categories:
-- continuous_integration
-description: TODO
+- pipeline_authoring
+description: It stores parent-child and cross-project pipeline relationships.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/163983e0d7d1dab622846441bd0dd9086c78a69f
milestone: '9.3'
diff --git a/db/docs/ci_unit_tests.yml b/db/docs/ci_unit_tests.yml
index f80372511c4..c22ad567c12 100644
--- a/db/docs/ci_unit_tests.yml
+++ b/db/docs/ci_unit_tests.yml
@@ -3,7 +3,7 @@ table_name: ci_unit_tests
classes:
- Ci::UnitTest
feature_categories:
-- continuous_integration
+- code_testing
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56137
milestone: '13.11'
diff --git a/db/docs/cluster_agent_tokens.yml b/db/docs/cluster_agent_tokens.yml
index 9f8827ffe66..0d6265789f1 100644
--- a/db/docs/cluster_agent_tokens.yml
+++ b/db/docs/cluster_agent_tokens.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- kubernetes_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33228
milestone: '13.3'
diff --git a/db/docs/cluster_agents.yml b/db/docs/cluster_agents.yml
index adeda8df3e5..6593542dad6 100644
--- a/db/docs/cluster_agents.yml
+++ b/db/docs/cluster_agents.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- kubernetes_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33228
milestone: '13.3'
diff --git a/db/docs/clusters.yml b/db/docs/clusters.yml
index 142186e4410..cad0fd4c3b3 100644
--- a/db/docs/clusters.yml
+++ b/db/docs/clusters.yml
@@ -3,7 +3,7 @@ table_name: clusters
classes:
- Clusters::Cluster
feature_categories:
-- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d0cff7f5855f91b5479f9fdaa39d8d95ec691a9e
+- kubernetes_management
+description: Persists information about GitLab managed clusters
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14879
milestone: '10.1'
diff --git a/db/docs/clusters_applications_cilium.yml b/db/docs/clusters_applications_cilium.yml
index f91ed18fdbc..1fa71a93911 100644
--- a/db/docs/clusters_applications_cilium.yml
+++ b/db/docs/clusters_applications_cilium.yml
@@ -3,7 +3,7 @@ table_name: clusters_applications_cilium
classes:
- Clusters::Applications::Cilium
feature_categories:
-- kubernetes_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- container_network_security
+description: Information about installed instance of Cilium in the cluster
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34601
milestone: '13.2'
diff --git a/db/docs/clusters_applications_prometheus.yml b/db/docs/clusters_applications_prometheus.yml
index 5118d286ffc..394ab63f81f 100644
--- a/db/docs/clusters_applications_prometheus.yml
+++ b/db/docs/clusters_applications_prometheus.yml
@@ -3,7 +3,7 @@ table_name: clusters_applications_prometheus
classes:
- Clusters::Applications::Prometheus
feature_categories:
-- container_network_security
-description: TODO
+- kubernetes_management
+description: Information about installed instance of Prometheus in the cluster
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0d4548026f3060ca0a8f7aa8d8fc89838bc66130
milestone: '10.4'
diff --git a/db/docs/clusters_integration_elasticstack.yml b/db/docs/clusters_integration_elasticstack.yml
index 3536501c54d..2c2261a53e2 100644
--- a/db/docs/clusters_integration_elasticstack.yml
+++ b/db/docs/clusters_integration_elasticstack.yml
@@ -3,7 +3,7 @@ table_name: clusters_integration_elasticstack
classes:
- Clusters::Integrations::ElasticStack
feature_categories:
-- integrations
+- configure
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077
milestone: '13.12'
diff --git a/db/docs/clusters_integration_prometheus.yml b/db/docs/clusters_integration_prometheus.yml
index 78a1933a931..f8702226daa 100644
--- a/db/docs/clusters_integration_prometheus.yml
+++ b/db/docs/clusters_integration_prometheus.yml
@@ -4,6 +4,6 @@ classes:
- Clusters::Integrations::Prometheus
feature_categories:
- incident_management
-description: TODO
+description: Persists information about prometheus cluster integration
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59091
milestone: '13.11'
diff --git a/db/docs/commit_user_mentions.yml b/db/docs/commit_user_mentions.yml
index 96a269dcd6a..e04f2001d9c 100644
--- a/db/docs/commit_user_mentions.yml
+++ b/db/docs/commit_user_mentions.yml
@@ -3,7 +3,7 @@ table_name: commit_user_mentions
classes:
- CommitUserMention
feature_categories:
-- users
-description: TODO
+- team_planning
+description: User mentions in commit messages
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/container_expiration_policies.yml b/db/docs/container_expiration_policies.yml
index e3b3e8598cd..a7027ee6f5e 100644
--- a/db/docs/container_expiration_policies.yml
+++ b/db/docs/container_expiration_policies.yml
@@ -4,6 +4,6 @@ classes:
- ContainerExpirationPolicy
feature_categories:
- container_registry
-description: TODO
+description: Project level settings for container registry cleanup policies
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20412
milestone: '12.6'
diff --git a/db/docs/container_repositories.yml b/db/docs/container_repositories.yml
index d3fa52f5126..c4eb599848a 100644
--- a/db/docs/container_repositories.yml
+++ b/db/docs/container_repositories.yml
@@ -4,6 +4,6 @@ classes:
- ContainerRepository
feature_categories:
- container_registry
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/01d159b409d8b24d36204979a73de249843d71bf
+description: Container registry repositories (images), originally named container_images, renamed in https://gitlab.com/gitlab-org/gitlab/-/commit/01d159b409d8b24d36204979a73de249843d71bf
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/10109
milestone: '9.1'
diff --git a/db/docs/coverage_fuzzing_corpuses.yml b/db/docs/coverage_fuzzing_corpuses.yml
index 1ea6737dac8..3e8e55cd4e6 100644
--- a/db/docs/coverage_fuzzing_corpuses.yml
+++ b/db/docs/coverage_fuzzing_corpuses.yml
@@ -3,7 +3,7 @@ table_name: coverage_fuzzing_corpuses
classes:
- AppSec::Fuzzing::Coverage::Corpus
feature_categories:
-- code_quality
-description: TODO
+- fuzz_testing
+description: Stores additional values describing corpuses used by coverage fuzzing
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71704
milestone: '14.4'
diff --git a/db/docs/csv_issue_imports.yml b/db/docs/csv_issue_imports.yml
index 8d0968f78e0..7560876c4a0 100644
--- a/db/docs/csv_issue_imports.yml
+++ b/db/docs/csv_issue_imports.yml
@@ -4,6 +4,6 @@ classes:
- Issues::CsvImport
feature_categories:
- importers
-description: TODO
+description: Used to report the unique user usage of the CSV Issue Import feature
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44742
milestone: '13.6'
diff --git a/db/docs/custom_emoji.yml b/db/docs/custom_emoji.yml
index 1a290153544..205e652835e 100644
--- a/db/docs/custom_emoji.yml
+++ b/db/docs/custom_emoji.yml
@@ -4,6 +4,6 @@ classes:
- CustomEmoji
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Filename and name of custom emoji created by users
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24229
milestone: '13.2'
diff --git a/db/docs/customer_relations_contacts.yml b/db/docs/customer_relations_contacts.yml
index 409295f037d..57fce1e0def 100644
--- a/db/docs/customer_relations_contacts.yml
+++ b/db/docs/customer_relations_contacts.yml
@@ -3,7 +3,7 @@ table_name: customer_relations_contacts
classes:
- CustomerRelations::Contact
feature_categories:
-- users
-description: TODO
+- service_desk
+description: Contacts, against which time can be spent by users on issues using the CRM functionality
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67985
milestone: '14.3'
diff --git a/db/docs/customer_relations_organizations.yml b/db/docs/customer_relations_organizations.yml
index 18a6709b4f3..b25c70a4fd2 100644
--- a/db/docs/customer_relations_organizations.yml
+++ b/db/docs/customer_relations_organizations.yml
@@ -3,7 +3,7 @@ table_name: customer_relations_organizations
classes:
- CustomerRelations::Organization
feature_categories:
-- subgroups
-description: TODO
+- team_planning
+description: Organizations, against which time can be spent by users on issues using the CRM functionality
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67551
milestone: '14.2'
diff --git a/db/docs/dast_scanner_profiles.yml b/db/docs/dast_scanner_profiles.yml
index 813029bde9a..f71e969e3c9 100644
--- a/db/docs/dast_scanner_profiles.yml
+++ b/db/docs/dast_scanner_profiles.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- dynamic_application_security_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37404
milestone: '13.3'
diff --git a/db/docs/dast_site_profiles.yml b/db/docs/dast_site_profiles.yml
index e2ce0676d8d..b68f5cd2368 100644
--- a/db/docs/dast_site_profiles.yml
+++ b/db/docs/dast_site_profiles.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- dynamic_application_security_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36659
milestone: '13.2'
diff --git a/db/docs/dast_site_tokens.yml b/db/docs/dast_site_tokens.yml
index ce8af8e6fd1..9891c9742a4 100644
--- a/db/docs/dast_site_tokens.yml
+++ b/db/docs/dast_site_tokens.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- dynamic_application_security_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41639
milestone: '13.4'
diff --git a/db/docs/dast_site_validations.yml b/db/docs/dast_site_validations.yml
index 9d4a73d1d52..9e14ba276e4 100644
--- a/db/docs/dast_site_validations.yml
+++ b/db/docs/dast_site_validations.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- dynamic_application_security_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41639
milestone: '13.4'
diff --git a/db/docs/dast_sites.yml b/db/docs/dast_sites.yml
index 6513a66eb8a..8b739997022 100644
--- a/db/docs/dast_sites.yml
+++ b/db/docs/dast_sites.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- dynamic_application_security_testing
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36659
milestone: '13.2'
diff --git a/db/docs/dependency_proxy_blobs.yml b/db/docs/dependency_proxy_blobs.yml
index 2d09d624fc5..ad54ac8943e 100644
--- a/db/docs/dependency_proxy_blobs.yml
+++ b/db/docs/dependency_proxy_blobs.yml
@@ -4,6 +4,6 @@ classes:
- DependencyProxy::Blob
feature_categories:
- dependency_proxy
-description: TODO
+description: Dependency proxy blob files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10676
milestone: '11.11'
diff --git a/db/docs/dependency_proxy_group_settings.yml b/db/docs/dependency_proxy_group_settings.yml
index 854d79f9be5..d975ca482de 100644
--- a/db/docs/dependency_proxy_group_settings.yml
+++ b/db/docs/dependency_proxy_group_settings.yml
@@ -4,6 +4,6 @@ classes:
- DependencyProxy::GroupSetting
feature_categories:
- dependency_proxy
-description: TODO
+description: Group-level settings for the dependency proxy
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10676
milestone: '11.11'
diff --git a/db/docs/dependency_proxy_image_ttl_group_policies.yml b/db/docs/dependency_proxy_image_ttl_group_policies.yml
index d9c7af2e37d..f985c083118 100644
--- a/db/docs/dependency_proxy_image_ttl_group_policies.yml
+++ b/db/docs/dependency_proxy_image_ttl_group_policies.yml
@@ -4,6 +4,6 @@ classes:
- DependencyProxy::ImageTtlGroupPolicy
feature_categories:
- dependency_proxy
-description: TODO
+description: Group-level settings for dependency proxy cleanup policies
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68809
milestone: '14.3'
diff --git a/db/docs/dependency_proxy_manifests.yml b/db/docs/dependency_proxy_manifests.yml
index eaaac522646..408878790a0 100644
--- a/db/docs/dependency_proxy_manifests.yml
+++ b/db/docs/dependency_proxy_manifests.yml
@@ -4,6 +4,6 @@ classes:
- DependencyProxy::Manifest
feature_categories:
- dependency_proxy
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48727
+description: Dependency proxy manifest files
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48535
milestone: '13.7'
diff --git a/db/docs/description_versions.yml b/db/docs/description_versions.yml
index 868193ff26c..8fb2d481fe9 100644
--- a/db/docs/description_versions.yml
+++ b/db/docs/description_versions.yml
@@ -3,7 +3,7 @@ table_name: description_versions
classes:
- DescriptionVersion
feature_categories:
-- design_management
-description: TODO
+- team_planning
+description: The diff of the change when an edit is made to an Issue, MR or Epic description
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17147
milestone: '12.4'
diff --git a/db/docs/design_management_designs.yml b/db/docs/design_management_designs.yml
index 50ddf7ce806..abdd01899da 100644
--- a/db/docs/design_management_designs.yml
+++ b/db/docs/design_management_designs.yml
@@ -4,6 +4,6 @@ classes:
- DesignManagement::Design
feature_categories:
- design_management
-description: TODO
+description: Information about Designs, image files under management by the Design Management tool
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9801
milestone: '11.10'
diff --git a/db/docs/design_management_designs_versions.yml b/db/docs/design_management_designs_versions.yml
index 030efb93696..2613cba55d9 100644
--- a/db/docs/design_management_designs_versions.yml
+++ b/db/docs/design_management_designs_versions.yml
@@ -4,6 +4,6 @@ classes:
- DesignManagement::Action
feature_categories:
- design_management
-description: TODO
+description: The SHA referencing changes to a single design or multiple design files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10552
milestone: '11.10'
diff --git a/db/docs/design_management_versions.yml b/db/docs/design_management_versions.yml
index 64fdfcb11d7..8f411df6e93 100644
--- a/db/docs/design_management_versions.yml
+++ b/db/docs/design_management_versions.yml
@@ -4,6 +4,6 @@ classes:
- DesignManagement::Version
feature_categories:
- design_management
-description: TODO
+description: The SHA referencing changes to individual designs made using the Design Management tool
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9801
milestone: '11.10'
diff --git a/db/docs/design_user_mentions.yml b/db/docs/design_user_mentions.yml
index e2a9cd2c03e..74aa0d89c01 100644
--- a/db/docs/design_user_mentions.yml
+++ b/db/docs/design_user_mentions.yml
@@ -3,7 +3,7 @@ table_name: design_user_mentions
classes:
- DesignUserMention
feature_categories:
-- design_management
-description: TODO
+- team_planning
+description: User mentions in content related to designs
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/diff_note_positions.yml b/db/docs/diff_note_positions.yml
index 274c34ed72e..8e8a64861ab 100644
--- a/db/docs/diff_note_positions.yml
+++ b/db/docs/diff_note_positions.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- source_code_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28113
milestone: '13.0'
diff --git a/db/docs/draft_notes.yml b/db/docs/draft_notes.yml
index 685dd01f3bb..9273fb5fa61 100644
--- a/db/docs/draft_notes.yml
+++ b/db/docs/draft_notes.yml
@@ -3,9 +3,8 @@ table_name: draft_notes
classes:
- DraftNote
feature_categories:
-- projects
+- code_review
- source_code_management
-- team_planning
-description: TODO
+description: Notes created during the review of an MR that are not yet published
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213
milestone: '11.4'
diff --git a/db/docs/elastic_reindexing_tasks.yml b/db/docs/elastic_reindexing_tasks.yml
index 640d57ea4df..049dae71d4c 100644
--- a/db/docs/elastic_reindexing_tasks.yml
+++ b/db/docs/elastic_reindexing_tasks.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- global_search
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34069
milestone: '13.2'
diff --git a/db/docs/emails.yml b/db/docs/emails.yml
index db08ba6e458..229861b1d91 100644
--- a/db/docs/emails.yml
+++ b/db/docs/emails.yml
@@ -4,6 +4,6 @@ classes:
- Email
feature_categories:
- users
-description: TODO
+description: Stores users email records
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/29cfd33d949d21d67f3892473c24d4f0a127dfe6
milestone: '6.6'
diff --git a/db/docs/epic_issues.yml b/db/docs/epic_issues.yml
index 2424213279b..506005eee4c 100644
--- a/db/docs/epic_issues.yml
+++ b/db/docs/epic_issues.yml
@@ -4,6 +4,6 @@ classes:
- EpicIssue
feature_categories:
- portfolio_management
-description: TODO
+description: The relationships between Epics and Issues
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3302
milestone: '10.2'
diff --git a/db/docs/epic_user_mentions.yml b/db/docs/epic_user_mentions.yml
index 15caca9e58b..8d2803b2526 100644
--- a/db/docs/epic_user_mentions.yml
+++ b/db/docs/epic_user_mentions.yml
@@ -3,7 +3,7 @@ table_name: epic_user_mentions
classes:
- EpicUserMention
feature_categories:
-- users
-description: TODO
+- team_planning
+description: User mentions in epic descriptions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/epics.yml b/db/docs/epics.yml
index 94f33026b1e..a8a07c445d0 100644
--- a/db/docs/epics.yml
+++ b/db/docs/epics.yml
@@ -4,6 +4,6 @@ classes:
- Epic
feature_categories:
- portfolio_management
-description: TODO
+description: Information directly related to Epics, used by epic management features and the roadmap
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3126
milestone: '10.2'
diff --git a/db/docs/error_tracking_client_keys.yml b/db/docs/error_tracking_client_keys.yml
index b9c7b74f0a3..c07fc282839 100644
--- a/db/docs/error_tracking_client_keys.yml
+++ b/db/docs/error_tracking_client_keys.yml
@@ -4,6 +4,6 @@ classes:
- ErrorTracking::ClientKey
feature_categories:
- error_tracking
-description: TODO
+description: Model to store public keys used by Sentry SDK for Error Tracking
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66466
milestone: '14.2'
diff --git a/db/docs/error_tracking_error_events.yml b/db/docs/error_tracking_error_events.yml
index 19a7f1cbfe8..9d938e47e3c 100644
--- a/db/docs/error_tracking_error_events.yml
+++ b/db/docs/error_tracking_error_events.yml
@@ -4,6 +4,6 @@ classes:
- ErrorTracking::ErrorEvent
feature_categories:
- error_tracking
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/2d1c197ab0bf10071cb52e579edd3808cb0adc21
+description: Persists error event data for the Error Tracking's GitLab backend
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64712
milestone: '14.1'
diff --git a/db/docs/error_tracking_errors.yml b/db/docs/error_tracking_errors.yml
index b348d47c77f..a961d759da3 100644
--- a/db/docs/error_tracking_errors.yml
+++ b/db/docs/error_tracking_errors.yml
@@ -4,6 +4,6 @@ classes:
- ErrorTracking::Error
feature_categories:
- error_tracking
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/2d1c197ab0bf10071cb52e579edd3808cb0adc21
+description: Persists error data for the Error Tracking's GitLab backend
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64712
milestone: '14.1'
diff --git a/db/docs/experiment_users.yml b/db/docs/experiment_users.yml
index a136f212a1f..38e6c57a283 100644
--- a/db/docs/experiment_users.yml
+++ b/db/docs/experiment_users.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- experimentation_conversion
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38397
milestone: '13.3'
diff --git a/db/docs/experiments.yml b/db/docs/experiments.yml
index 496c0a7644c..ef2ccfa8d89 100644
--- a/db/docs/experiments.yml
+++ b/db/docs/experiments.yml
@@ -3,7 +3,7 @@ table_name: experiments
classes:
- Experiment
feature_categories:
-- experimentation_expansion
+- experimentation_conversion
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38397
milestone: '13.3'
diff --git a/db/docs/geo_cache_invalidation_events.yml b/db/docs/geo_cache_invalidation_events.yml
index 6ae56893281..5695cddfb7f 100644
--- a/db/docs/geo_cache_invalidation_events.yml
+++ b/db/docs/geo_cache_invalidation_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::CacheInvalidationEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event to process feature flag toggles instantly on a secondary by invalidating the cache, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7738
milestone: '11.4'
diff --git a/db/docs/geo_container_repository_updated_events.yml b/db/docs/geo_container_repository_updated_events.yml
index c48c60fbf10..8d17ded97d4 100644
--- a/db/docs/geo_container_repository_updated_events.yml
+++ b/db/docs/geo_container_repository_updated_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::ContainerRepositoryUpdatedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a container repository (image, tag, registry) gets updated, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1902d9cc74a1dc2c87fdbb39a6cdbb67092cbb5a
milestone: '12.2'
diff --git a/db/docs/geo_event_log.yml b/db/docs/geo_event_log.yml
index 122ded0537e..905383664e5 100644
--- a/db/docs/geo_event_log.yml
+++ b/db/docs/geo_event_log.yml
@@ -4,6 +4,6 @@ classes:
- Geo::EventLog
feature_categories:
- geo_replication
-description: TODO
+description: Log of all events that a Geo secondary can process. Parsed/watched through streaming replication on all secondaries.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/cb6c7cbe2a9ee05cea6926e3d8c18f6aa26f4c64
milestone: '9.3'
diff --git a/db/docs/geo_events.yml b/db/docs/geo_events.yml
index 8a56c02d33e..6e30da25f5a 100644
--- a/db/docs/geo_events.yml
+++ b/db/docs/geo_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::Event
feature_categories:
- geo_replication
-description: TODO
+description: Geo events implemented generically, used by the SSF where all object types can generate an event to be processed by the secondary sites.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23447
milestone: '12.8'
diff --git a/db/docs/geo_hashed_storage_attachments_events.yml b/db/docs/geo_hashed_storage_attachments_events.yml
index 6d98ea7d21b..457b34af0f1 100644
--- a/db/docs/geo_hashed_storage_attachments_events.yml
+++ b/db/docs/geo_hashed_storage_attachments_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::HashedStorageAttachmentsEvent
feature_categories:
- geo_replication
-description: TODO
+description: Used to replicate storage attachments migration paths on Geo secondaries from regular to hashed storage.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3544
milestone: '10.3'
diff --git a/db/docs/geo_hashed_storage_migrated_events.yml b/db/docs/geo_hashed_storage_migrated_events.yml
index 38415c32f52..175015c487d 100644
--- a/db/docs/geo_hashed_storage_migrated_events.yml
+++ b/db/docs/geo_hashed_storage_migrated_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::HashedStorageMigratedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Used to replicate repository migration paths on Geo secondaries from regular to hashed storage.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3066
milestone: '10.2'
diff --git a/db/docs/geo_job_artifact_deleted_events.yml b/db/docs/geo_job_artifact_deleted_events.yml
deleted file mode 100644
index d58b0b83924..00000000000
--- a/db/docs/geo_job_artifact_deleted_events.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-table_name: geo_job_artifact_deleted_events
-classes:
-- Geo::JobArtifactDeletedEvent
-feature_categories:
-- geo_replication
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3935
-milestone: '10.4'
diff --git a/db/docs/geo_lfs_object_deleted_events.yml b/db/docs/geo_lfs_object_deleted_events.yml
index 1bf82510ee4..05cafd6d806 100644
--- a/db/docs/geo_lfs_object_deleted_events.yml
+++ b/db/docs/geo_lfs_object_deleted_events.yml
@@ -3,6 +3,6 @@ table_name: geo_lfs_object_deleted_events
classes: []
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when an LFS object gets deleted, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3481
milestone: '10.2'
diff --git a/db/docs/geo_node_namespace_links.yml b/db/docs/geo_node_namespace_links.yml
index 6847760f494..cede321ed47 100644
--- a/db/docs/geo_node_namespace_links.yml
+++ b/db/docs/geo_node_namespace_links.yml
@@ -4,6 +4,6 @@ classes:
- GeoNodeNamespaceLink
feature_categories:
- geo_replication
-description: TODO
+description: Passthrough table for geo_nodes many-to-many namespaces relation.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14c6128530579ca92fa79342d4119d25bcff1f2d
milestone: '9.5'
diff --git a/db/docs/geo_node_statuses.yml b/db/docs/geo_node_statuses.yml
index 3a7dfe16df1..ff955e79eb1 100644
--- a/db/docs/geo_node_statuses.yml
+++ b/db/docs/geo_node_statuses.yml
@@ -4,6 +4,6 @@ classes:
- GeoNodeStatus
feature_categories:
- geo_replication
-description: TODO
+description: Contains sites status and metadata for each Geo site, updated async through a scheduled worker.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3230
milestone: '10.2'
diff --git a/db/docs/geo_nodes.yml b/db/docs/geo_nodes.yml
index 143213cad96..956b79fe0a0 100644
--- a/db/docs/geo_nodes.yml
+++ b/db/docs/geo_nodes.yml
@@ -4,6 +4,6 @@ classes:
- GeoNode
feature_categories:
- geo_replication
-description: TODO
+description: Contains Geo sites configuration data and settings.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/5ab12ad02ed753dd933485094ba45512890f0b50
milestone: '8.5'
diff --git a/db/docs/geo_repositories_changed_events.yml b/db/docs/geo_repositories_changed_events.yml
index 214a4b3fe09..348d8331fe7 100644
--- a/db/docs/geo_repositories_changed_events.yml
+++ b/db/docs/geo_repositories_changed_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::RepositoriesChangedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when the repositories for selective sync of a specific Geo secondary change, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/312bc703a4619b87ba2ac4e59623e7747a24502c
milestone: '9.5'
diff --git a/db/docs/geo_repository_created_events.yml b/db/docs/geo_repository_created_events.yml
index 22c546ac0a2..ea7b8558bdc 100644
--- a/db/docs/geo_repository_created_events.yml
+++ b/db/docs/geo_repository_created_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::RepositoryCreatedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a repository gets created, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f3eacf881659b7af97b7c7ba3289237ec6cdc1cb
milestone: '10.0'
diff --git a/db/docs/geo_repository_deleted_events.yml b/db/docs/geo_repository_deleted_events.yml
index 9c2b72a0172..4814994181a 100644
--- a/db/docs/geo_repository_deleted_events.yml
+++ b/db/docs/geo_repository_deleted_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::RepositoryDeletedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a repository gets deleted, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/04c3da24ac5975b140cf2e6a7e33414543f148f5
milestone: '9.4'
diff --git a/db/docs/geo_repository_renamed_events.yml b/db/docs/geo_repository_renamed_events.yml
index 431577572e3..2e6838f51e4 100644
--- a/db/docs/geo_repository_renamed_events.yml
+++ b/db/docs/geo_repository_renamed_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::RepositoryRenamedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a repository gets renamed, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6e5fa040d1c689fad4e110dd10be8ddba61ea7ef
milestone: '9.4'
diff --git a/db/docs/geo_repository_updated_events.yml b/db/docs/geo_repository_updated_events.yml
index 0aa83949fef..51a0033d0a7 100644
--- a/db/docs/geo_repository_updated_events.yml
+++ b/db/docs/geo_repository_updated_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::RepositoryUpdatedEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a repository gets updated (content changed), belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/71cc57b1e4b7721c93107357517235a18f7ba8e2
milestone: '9.3'
diff --git a/db/docs/geo_reset_checksum_events.yml b/db/docs/geo_reset_checksum_events.yml
index ba56f659295..d4aad156687 100644
--- a/db/docs/geo_reset_checksum_events.yml
+++ b/db/docs/geo_reset_checksum_events.yml
@@ -4,6 +4,6 @@ classes:
- Geo::ResetChecksumEvent
feature_categories:
- geo_replication
-description: TODO
+description: Geo event for when a project gets reverified on the primary, belongs to geo_event_log.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7394
milestone: '11.4'
diff --git a/db/docs/gitlab_subscription_histories.yml b/db/docs/gitlab_subscription_histories.yml
index 428b17a8e85..1b84c943a04 100644
--- a/db/docs/gitlab_subscription_histories.yml
+++ b/db/docs/gitlab_subscription_histories.yml
@@ -4,6 +4,6 @@ classes:
- GitlabSubscriptionHistory
feature_categories:
- purchase
-description: TODO
+description: History log for the gitlab_subscriptions table
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19694
milestone: '12.6'
diff --git a/db/docs/gitlab_subscriptions.yml b/db/docs/gitlab_subscriptions.yml
index e32156da0c8..d4a15216aa6 100644
--- a/db/docs/gitlab_subscriptions.yml
+++ b/db/docs/gitlab_subscriptions.yml
@@ -4,6 +4,6 @@ classes:
- GitlabSubscription
feature_categories:
- purchase
-description: TODO
+description: Used to store information related to GitLab subscriptions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7885
milestone: '11.6'
diff --git a/db/docs/group_crm_settings.yml b/db/docs/group_crm_settings.yml
index 977ba21e2f8..3798512d05e 100644
--- a/db/docs/group_crm_settings.yml
+++ b/db/docs/group_crm_settings.yml
@@ -3,7 +3,7 @@ table_name: group_crm_settings
classes:
- Group::CrmSettings
feature_categories:
-- subgroups
-description: TODO
+- service_desk
+description: Group-level settings for CRM-related features
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76983
milestone: '14.7'
diff --git a/db/docs/group_custom_attributes.yml b/db/docs/group_custom_attributes.yml
index 6a06b847414..3bf4f6a0f92 100644
--- a/db/docs/group_custom_attributes.yml
+++ b/db/docs/group_custom_attributes.yml
@@ -4,6 +4,6 @@ classes:
- GroupCustomAttribute
feature_categories:
- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f773a8ef5a1f76166d0455c6a5e473278885c17
+description: Stores custom attributes per group
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14593
milestone: '10.2'
diff --git a/db/docs/group_deploy_keys.yml b/db/docs/group_deploy_keys.yml
index 1b456703e37..c96b6fd0470 100644
--- a/db/docs/group_deploy_keys.yml
+++ b/db/docs/group_deploy_keys.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- secrets_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30886
milestone: '13.1'
diff --git a/db/docs/group_deploy_keys_groups.yml b/db/docs/group_deploy_keys_groups.yml
index e50849a6967..c8c36cc16b4 100644
--- a/db/docs/group_deploy_keys_groups.yml
+++ b/db/docs/group_deploy_keys_groups.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- advanced_deployments
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32901
milestone: '13.2'
diff --git a/db/docs/group_features.yml b/db/docs/group_features.yml
new file mode 100644
index 00000000000..ca156be4117
--- /dev/null
+++ b/db/docs/group_features.yml
@@ -0,0 +1,9 @@
+---
+table_name: group_features
+classes:
+- Groups::FeatureSetting
+feature_categories:
+- navigation
+description: Stores access levels for group features, like the wiki
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82017
+milestone: '14.10'
diff --git a/db/docs/group_import_states.yml b/db/docs/group_import_states.yml
index 72acbaa0daa..fe51c414c25 100644
--- a/db/docs/group_import_states.yml
+++ b/db/docs/group_import_states.yml
@@ -4,6 +4,6 @@ classes:
- GroupImportState
feature_categories:
- importers
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Used to store and track the group import status when using the Import/Export feature
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29588
milestone: '13.0'
diff --git a/db/docs/group_wiki_repositories.yml b/db/docs/group_wiki_repositories.yml
index 6a5a1976ca3..0c4ce444958 100644
--- a/db/docs/group_wiki_repositories.yml
+++ b/db/docs/group_wiki_repositories.yml
@@ -4,6 +4,6 @@ classes:
- GroupWikiRepository
feature_categories:
- wiki
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores information about group wiki repositories.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31121
milestone: '13.0'
diff --git a/db/docs/import_export_uploads.yml b/db/docs/import_export_uploads.yml
index f9295ef89c9..6cac47c8490 100644
--- a/db/docs/import_export_uploads.yml
+++ b/db/docs/import_export_uploads.yml
@@ -4,6 +4,6 @@ classes:
- ImportExportUpload
feature_categories:
- importers
-description: TODO
+description: Used to store the location of the imported or exported archives files of groups or projects when using the feature Import/Export
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a2bf1641546a1d3eeb3e9f44734854f655c0adef
milestone: '11.1'
diff --git a/db/docs/import_failures.yml b/db/docs/import_failures.yml
index ef0e71deca3..7fb01579573 100644
--- a/db/docs/import_failures.yml
+++ b/db/docs/import_failures.yml
@@ -4,6 +4,6 @@ classes:
- ImportFailure
feature_categories:
- importers
-description: TODO
+description: Used to store group or project import failures that occur when using the Import/Export feature
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20727
milestone: '12.6'
diff --git a/db/docs/incident_management_escalation_policies.yml b/db/docs/incident_management_escalation_policies.yml
index f8bb51957fd..9584f65b14d 100644
--- a/db/docs/incident_management_escalation_policies.yml
+++ b/db/docs/incident_management_escalation_policies.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::EscalationPolicy
feature_categories:
- incident_management
-description: TODO
+description: Persists information about escalation policies in a project
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60685
milestone: '13.12'
diff --git a/db/docs/incident_management_escalation_rules.yml b/db/docs/incident_management_escalation_rules.yml
index 6f97d8b6524..40c1f9bdcc0 100644
--- a/db/docs/incident_management_escalation_rules.yml
+++ b/db/docs/incident_management_escalation_rules.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::EscalationRule
feature_categories:
- incident_management
-description: TODO
+description: Persists information about escalation rules for incident management
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60685
milestone: '13.12'
diff --git a/db/docs/incident_management_issuable_escalation_statuses.yml b/db/docs/incident_management_issuable_escalation_statuses.yml
index 4c0010f212a..466bc0314b6 100644
--- a/db/docs/incident_management_issuable_escalation_statuses.yml
+++ b/db/docs/incident_management_issuable_escalation_statuses.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::IssuableEscalationStatus
feature_categories:
- incident_management
-description: TODO
+description: Persists escalation status information for incidents
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65206
milestone: '14.2'
diff --git a/db/docs/incident_management_oncall_participants.yml b/db/docs/incident_management_oncall_participants.yml
index a394afae79b..9186be4824c 100644
--- a/db/docs/incident_management_oncall_participants.yml
+++ b/db/docs/incident_management_oncall_participants.yml
@@ -4,6 +4,7 @@ classes:
- IncidentManagement::OncallParticipant
feature_categories:
- incident_management
-description: TODO
+- on_call_schedule_management
+description: Persists information about on-call rotation participants
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49058
milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_rotations.yml b/db/docs/incident_management_oncall_rotations.yml
index 114973d12be..bf9df2e2d2a 100644
--- a/db/docs/incident_management_oncall_rotations.yml
+++ b/db/docs/incident_management_oncall_rotations.yml
@@ -4,6 +4,7 @@ classes:
- IncidentManagement::OncallRotation
feature_categories:
- incident_management
-description: TODO
+- on_call_schedule_management
+description: Persists information about on-call rotation
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49058
milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_schedules.yml b/db/docs/incident_management_oncall_schedules.yml
index deb05826e08..9fa0ed1bec5 100644
--- a/db/docs/incident_management_oncall_schedules.yml
+++ b/db/docs/incident_management_oncall_schedules.yml
@@ -4,6 +4,7 @@ classes:
- IncidentManagement::OncallSchedule
feature_categories:
- incident_management
-description: TODO
+- on_call_schedule_management
+description: Persists on-call schedules for incident management in a project
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47407
milestone: '13.7'
diff --git a/db/docs/incident_management_oncall_shifts.yml b/db/docs/incident_management_oncall_shifts.yml
index 2e1a12032d4..6ef7de5da50 100644
--- a/db/docs/incident_management_oncall_shifts.yml
+++ b/db/docs/incident_management_oncall_shifts.yml
@@ -4,6 +4,7 @@ classes:
- IncidentManagement::OncallShift
feature_categories:
- incident_management
-description: TODO
+- on_call_schedule_management
+description: Tracks past and present on-call shifts
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49423
milestone: '13.8'
diff --git a/db/docs/incident_management_pending_alert_escalations.yml b/db/docs/incident_management_pending_alert_escalations.yml
index 5c8f456f084..c39b8d74ce2 100644
--- a/db/docs/incident_management_pending_alert_escalations.yml
+++ b/db/docs/incident_management_pending_alert_escalations.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::PendingEscalations::Alert
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e5cc867503dfbd54f99df90cce6be39bc4fde712
+description: Persists information about pending alert escalations for incidents
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64274
milestone: '14.1'
diff --git a/db/docs/incident_management_pending_issue_escalations.yml b/db/docs/incident_management_pending_issue_escalations.yml
index 0956b1f9453..eb8f11fc72f 100644
--- a/db/docs/incident_management_pending_issue_escalations.yml
+++ b/db/docs/incident_management_pending_issue_escalations.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::PendingEscalations::Issue
feature_categories:
- incident_management
-description: TODO
+description: Represents when issues should be escalated according to a project's escalation policy
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65209
milestone: '14.3'
diff --git a/db/docs/incident_management_timeline_events.yml b/db/docs/incident_management_timeline_events.yml
index d13a6ec29ec..6031f0d32e2 100644
--- a/db/docs/incident_management_timeline_events.yml
+++ b/db/docs/incident_management_timeline_events.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::TimelineEvent
feature_categories:
- incident_management
-description: TODO
+description: Persists timeline events for an incident
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74530
milestone: '14.6'
diff --git a/db/docs/integrations.yml b/db/docs/integrations.yml
index 708bd6d8b1a..4629b7558ed 100644
--- a/db/docs/integrations.yml
+++ b/db/docs/integrations.yml
@@ -50,6 +50,8 @@ classes:
- Integrations::Zentao
feature_categories:
- integrations
-description: TODO
+description: |
+ Support 3rd party integrations: Jira, Slack, etc., formerly services table.
+ https://gitlab.com/gitlab-org/gitlab/-/commit/1dab19d0d7b25cb5af27b8d10c8b615b2d38c2cf
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/64562
milestone: '9.4'
diff --git a/db/docs/internal_ids.yml b/db/docs/internal_ids.yml
index 48596a153d6..100e58ad921 100644
--- a/db/docs/internal_ids.yml
+++ b/db/docs/internal_ids.yml
@@ -3,8 +3,7 @@ table_name: internal_ids
classes:
- InternalId
feature_categories:
-- projects
-- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/754272e392c0da088200a1b56156600973f63267
+- database
+description: Keeps track of counters scoped to a certain context, e.g. a project-wide counter for issues.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17580
milestone: '10.7'
diff --git a/db/docs/issuable_severities.yml b/db/docs/issuable_severities.yml
index 9a86931e4c3..5f9a8f5ba43 100644
--- a/db/docs/issuable_severities.yml
+++ b/db/docs/issuable_severities.yml
@@ -4,6 +4,6 @@ classes:
- IssuableSeverity
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Integer representing severity applied to issues, currently used for incidents
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40272
milestone: '13.4'
diff --git a/db/docs/issuable_slas.yml b/db/docs/issuable_slas.yml
index 631086f68a9..14e94a3aed3 100644
--- a/db/docs/issuable_slas.yml
+++ b/db/docs/issuable_slas.yml
@@ -4,6 +4,6 @@ classes:
- IssuableSla
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44928
+description: Persists information about incident SLAs for incidents
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44253
milestone: '13.5'
diff --git a/db/docs/issue_assignees.yml b/db/docs/issue_assignees.yml
index 5b09ffa4b87..f6a06e7c51d 100644
--- a/db/docs/issue_assignees.yml
+++ b/db/docs/issue_assignees.yml
@@ -4,6 +4,6 @@ classes:
- IssueAssignee
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ac5d8fddd6809113e3d43d94c315f993605135e9
+description: Users assigned to an issue
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1541
milestone: '9.2'
diff --git a/db/docs/issue_customer_relations_contacts.yml b/db/docs/issue_customer_relations_contacts.yml
index d88ccc1c72b..1548835f6d3 100644
--- a/db/docs/issue_customer_relations_contacts.yml
+++ b/db/docs/issue_customer_relations_contacts.yml
@@ -3,7 +3,7 @@ table_name: issue_customer_relations_contacts
classes:
- CustomerRelations::IssueContact
feature_categories:
-- purchase
-description: TODO
+- team_planning
+description: Holds Customer Relations (CRM) Contacts
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71007
milestone: '14.4'
diff --git a/db/docs/issue_email_participants.yml b/db/docs/issue_email_participants.yml
index 11995b17d2c..8cbed5f9d8f 100644
--- a/db/docs/issue_email_participants.yml
+++ b/db/docs/issue_email_participants.yml
@@ -4,6 +4,6 @@ classes:
- IssueEmailParticipant
feature_categories:
- service_desk
-description: TODO
+description: Email addresses for non-GitLab users added to issues as participants
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42943
milestone: '13.5'
diff --git a/db/docs/issue_emails.yml b/db/docs/issue_emails.yml
index 48129cff428..3f6c3ee3d72 100644
--- a/db/docs/issue_emails.yml
+++ b/db/docs/issue_emails.yml
@@ -3,7 +3,8 @@ table_name: issue_emails
classes:
- Issue::Email
feature_categories:
+- service_desk
- team_planning
-description: TODO
+description: The Message-ID of the original email that resulted in the creation of an issue
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71749
milestone: '14.6'
diff --git a/db/docs/issue_links.yml b/db/docs/issue_links.yml
index 3eb0ba63125..592a4b3873f 100644
--- a/db/docs/issue_links.yml
+++ b/db/docs/issue_links.yml
@@ -4,6 +4,6 @@ classes:
- IssueLink
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7afdb31770f927cf4fcca98ab675e015f39f8479
+description: Links two issues by relationship type, which can be related or blocking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1719
milestone: '9.4'
diff --git a/db/docs/issue_tracker_data.yml b/db/docs/issue_tracker_data.yml
index 03aa6132fc4..3af23de8633 100644
--- a/db/docs/issue_tracker_data.yml
+++ b/db/docs/issue_tracker_data.yml
@@ -4,6 +4,6 @@ classes:
- Integrations::IssueTrackerData
feature_categories:
- integrations
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f332ae8da994509232c7601074b25514ad23c52
+description: Data related to the issue tracker integrations.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14187
milestone: '12.0'
diff --git a/db/docs/issue_user_mentions.yml b/db/docs/issue_user_mentions.yml
index f854ac9bc96..72e0d483c64 100644
--- a/db/docs/issue_user_mentions.yml
+++ b/db/docs/issue_user_mentions.yml
@@ -4,6 +4,6 @@ classes:
- IssueUserMention
feature_categories:
- team_planning
-description: TODO
+description: User mentions in issue descriptions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/issues.yml b/db/docs/issues.yml
index f8e70998cd0..db95aea01c3 100644
--- a/db/docs/issues.yml
+++ b/db/docs/issues.yml
@@ -5,6 +5,6 @@ classes:
- WorkItem
feature_categories:
- team_planning
-description: TODO
+description: Information describing issues, which is also used by the WorkItem class
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
milestone: "<6.0"
diff --git a/db/docs/issues_prometheus_alert_events.yml b/db/docs/issues_prometheus_alert_events.yml
index 4a222ab3924..01ff7f9b6e4 100644
--- a/db/docs/issues_prometheus_alert_events.yml
+++ b/db/docs/issues_prometheus_alert_events.yml
@@ -3,6 +3,6 @@ table_name: issues_prometheus_alert_events
classes: []
feature_categories:
- incident_management
-description: TODO
+description: Adds relationship between PrometheusAlertEvent and issues created due to them
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17477
milestone: '12.4'
diff --git a/db/docs/issues_self_managed_prometheus_alert_events.yml b/db/docs/issues_self_managed_prometheus_alert_events.yml
index 016e1f17a6e..feb208d7c3a 100644
--- a/db/docs/issues_self_managed_prometheus_alert_events.yml
+++ b/db/docs/issues_self_managed_prometheus_alert_events.yml
@@ -3,6 +3,6 @@ table_name: issues_self_managed_prometheus_alert_events
classes: []
feature_categories:
- incident_management
-description: TODO
+description: Adds associations between Issues table and Prometheus alerts from self-managed Prometheus instances
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18046
milestone: '12.4'
diff --git a/db/docs/iterations_cadences.yml b/db/docs/iterations_cadences.yml
index d47214ba780..5c6ea38b10e 100644
--- a/db/docs/iterations_cadences.yml
+++ b/db/docs/iterations_cadences.yml
@@ -4,6 +4,6 @@ classes:
- Iterations::Cadence
feature_categories:
- team_planning
-description: TODO
+description: Defines an iteration cadence for a group, used to define how iterations should act
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50707
-milestone: '13.10'
+milestone: '13.9'
diff --git a/db/docs/jira_connect_installations.yml b/db/docs/jira_connect_installations.yml
index 0ce19242942..8695e0294b6 100644
--- a/db/docs/jira_connect_installations.yml
+++ b/db/docs/jira_connect_installations.yml
@@ -4,6 +4,6 @@ classes:
- JiraConnectInstallation
feature_categories:
- integrations
-description: TODO
+description: GitLab.com for Jira Cloud app installation data, formerly Jira Connect App.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9593
milestone: '11.9'
diff --git a/db/docs/jira_connect_subscriptions.yml b/db/docs/jira_connect_subscriptions.yml
index c7b134fb201..775ae3aa96c 100644
--- a/db/docs/jira_connect_subscriptions.yml
+++ b/db/docs/jira_connect_subscriptions.yml
@@ -4,6 +4,6 @@ classes:
- JiraConnectSubscription
feature_categories:
- integrations
-description: TODO
+description: GitLab.com for Jira Cloud app subscriptions data, formerly Jira Connect App.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/10453
milestone: '11.11'
diff --git a/db/docs/jira_imports.yml b/db/docs/jira_imports.yml
index 497b0776c4c..38cdca874e2 100644
--- a/db/docs/jira_imports.yml
+++ b/db/docs/jira_imports.yml
@@ -4,6 +4,6 @@ classes:
- JiraImportState
feature_categories:
- integrations
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
-milestone: '13.0'
+description: Track Jira issue import progress into GitLab issues.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28108
+milestone: '12.10'
diff --git a/db/docs/jira_tracker_data.yml b/db/docs/jira_tracker_data.yml
index 30915569024..6e7d6236ffa 100644
--- a/db/docs/jira_tracker_data.yml
+++ b/db/docs/jira_tracker_data.yml
@@ -4,6 +4,6 @@ classes:
- Integrations::JiraTrackerData
feature_categories:
- integrations
-description: TODO
+description: Data related to the Jira integration.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1f332ae8da994509232c7601074b25514ad23c52
milestone: '12.0'
diff --git a/db/docs/keys.yml b/db/docs/keys.yml
index 3bb5ed48b19..d016b316c15 100644
--- a/db/docs/keys.yml
+++ b/db/docs/keys.yml
@@ -5,7 +5,8 @@ classes:
- Key
- LDAPKey
feature_categories:
-- users
-description: TODO
+- authentication_and_authorization
+- continuous_delivery
+description: SSH keys used by users or for deployments.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
milestone: "<6.0"
diff --git a/db/docs/label_links.yml b/db/docs/label_links.yml
index 28e261c6ea1..5eb10e5e968 100644
--- a/db/docs/label_links.yml
+++ b/db/docs/label_links.yml
@@ -4,6 +4,6 @@ classes:
- LabelLink
feature_categories:
- team_planning
-description: TODO
+description: Information linking labels with target objects that can be labelled; such as issues, MRs and epics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/03654a6abf47c88b8b980a6707874ff78080d2fe
milestone: '7.2'
diff --git a/db/docs/label_priorities.yml b/db/docs/label_priorities.yml
index 28ff029515c..608cda8590e 100644
--- a/db/docs/label_priorities.yml
+++ b/db/docs/label_priorities.yml
@@ -4,6 +4,6 @@ classes:
- LabelPriority
feature_categories:
- team_planning
-description: TODO
+description: The relative priority assigned to a label within a project, if any
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/297892011330ecdd2fa7cbe47fbc6fd4f3b62171
-milestone: '8.13'
+milestone: '8.14'
diff --git a/db/docs/labels.yml b/db/docs/labels.yml
index aafe399e8c7..efda4b65021 100644
--- a/db/docs/labels.yml
+++ b/db/docs/labels.yml
@@ -6,6 +6,6 @@ classes:
- ProjectLabel
feature_categories:
- team_planning
-description: TODO
+description: Information related to labels, which can be associated with groups or projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/03654a6abf47c88b8b980a6707874ff78080d2fe
milestone: '7.2'
diff --git a/db/docs/lfs_file_locks.yml b/db/docs/lfs_file_locks.yml
index c7f8463165e..8cd1c2fd4f9 100644
--- a/db/docs/lfs_file_locks.yml
+++ b/db/docs/lfs_file_locks.yml
@@ -4,6 +4,6 @@ classes:
- LfsFileLock
feature_categories:
- git_lfs
-description: TODO
+description: File locks for LFS objects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4091
milestone: '10.5'
diff --git a/db/docs/lfs_object_states.yml b/db/docs/lfs_object_states.yml
index f0f16f74b33..a18699e3557 100644
--- a/db/docs/lfs_object_states.yml
+++ b/db/docs/lfs_object_states.yml
@@ -4,6 +4,6 @@ classes:
- Geo::LfsObjectState
feature_categories:
- git_lfs
-description: TODO
+description: Geo verification states for LFS objects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63981
milestone: '14.6'
diff --git a/db/docs/lfs_objects.yml b/db/docs/lfs_objects.yml
index 575ca8f181a..0e26e3c7758 100644
--- a/db/docs/lfs_objects.yml
+++ b/db/docs/lfs_objects.yml
@@ -4,6 +4,6 @@ classes:
- LfsObject
feature_categories:
- git_lfs
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14032d8eb1a60ae5920286249c1044be2fa27278
+description: LFS files
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1727
milestone: '8.2'
diff --git a/db/docs/lfs_objects_projects.yml b/db/docs/lfs_objects_projects.yml
index 4a835bf7a40..85cc8f94022 100644
--- a/db/docs/lfs_objects_projects.yml
+++ b/db/docs/lfs_objects_projects.yml
@@ -5,6 +5,6 @@ classes:
feature_categories:
- git_lfs
- source_code_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/14032d8eb1a60ae5920286249c1044be2fa27278
+description: Join table relating lfs_objects and projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1727
milestone: '8.2'
diff --git a/db/docs/licenses.yml b/db/docs/licenses.yml
index 433dbc9c5b5..5e178996e3d 100644
--- a/db/docs/licenses.yml
+++ b/db/docs/licenses.yml
@@ -4,6 +4,6 @@ classes:
- License
feature_categories:
- purchase
-description: TODO
+description: Used to store information related to the instance's license
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/d1f2b09fadcfba210c5121bd214b910b9f9809fd
milestone: '7.11'
diff --git a/db/docs/list_user_preferences.yml b/db/docs/list_user_preferences.yml
index a53602899eb..cd2b53fd384 100644
--- a/db/docs/list_user_preferences.yml
+++ b/db/docs/list_user_preferences.yml
@@ -3,7 +3,7 @@ table_name: list_user_preferences
classes:
- ListUserPreference
feature_categories:
-- users
-description: TODO
+- team_planning
+description: Issue board list preferences on a per-user basis, specifically whether the user has collapsed the list or not
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15657
milestone: '12.3'
diff --git a/db/docs/lists.yml b/db/docs/lists.yml
index 5ccd20c300f..4633be6fb58 100644
--- a/db/docs/lists.yml
+++ b/db/docs/lists.yml
@@ -3,7 +3,7 @@ table_name: lists
classes:
- List
feature_categories:
-- design_management
-description: TODO
+- team_planning
+description: Configuration of a single list on an issue board
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/611dab2e522e5e59cf09cd459a31686e65616863
milestone: '8.11'
diff --git a/db/docs/member_tasks.yml b/db/docs/member_tasks.yml
index 7f55c8d6eec..8802d50176b 100644
--- a/db/docs/member_tasks.yml
+++ b/db/docs/member_tasks.yml
@@ -3,7 +3,7 @@ table_name: member_tasks
classes:
- MemberTask
feature_categories:
-- authentication_and_authorization
+- experimentation_activation
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69299
milestone: '14.5'
diff --git a/db/docs/members.yml b/db/docs/members.yml
index ebf8a4f3bc6..b26d0edd6c9 100644
--- a/db/docs/members.yml
+++ b/db/docs/members.yml
@@ -8,6 +8,6 @@ classes:
feature_categories:
- projects
- subgroups
-description: TODO
+description: Stores members per namespace
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3503b504eabf95487fc3fb49df953a7d694da4fe
milestone: '7.4'
diff --git a/db/docs/merge_request_assignees.yml b/db/docs/merge_request_assignees.yml
index 38c94ff3c30..6fd82ac003e 100644
--- a/db/docs/merge_request_assignees.yml
+++ b/db/docs/merge_request_assignees.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestAssignee
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/929ee4d18da886826e9fcc15c35b4d4024bc8237
+description: Store allocated assignees for merge requests
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26496
milestone: '11.10'
diff --git a/db/docs/merge_request_cleanup_schedules.yml b/db/docs/merge_request_cleanup_schedules.yml
index ec791ef2567..9a9338713a6 100644
--- a/db/docs/merge_request_cleanup_schedules.yml
+++ b/db/docs/merge_request_cleanup_schedules.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequest::CleanupSchedule
feature_categories:
- code_review
-description: TODO
+description: Store refs cleanup schedules for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46758
milestone: '13.6'
diff --git a/db/docs/merge_request_context_commits.yml b/db/docs/merge_request_context_commits.yml
index d9b4729c7b9..4c52a0a6c08 100644
--- a/db/docs/merge_request_context_commits.yml
+++ b/db/docs/merge_request_context_commits.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestContextCommit
feature_categories:
- code_review
-description: TODO
+description: Store context commit related data for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23701
milestone: '12.8'
diff --git a/db/docs/merge_request_diff_commit_users.yml b/db/docs/merge_request_diff_commit_users.yml
index ab634358238..4a07b37993e 100644
--- a/db/docs/merge_request_diff_commit_users.yml
+++ b/db/docs/merge_request_diff_commit_users.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequest::DiffCommitUser
feature_categories:
- code_review
-description: TODO
+description: Store commit user information for merge request diffs
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63669
milestone: '14.1'
diff --git a/db/docs/merge_request_diff_commits.yml b/db/docs/merge_request_diff_commits.yml
index 8f29d38b2a9..155b6f82612 100644
--- a/db/docs/merge_request_diff_commits.yml
+++ b/db/docs/merge_request_diff_commits.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestDiffCommit
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/aff5c9f3e5ecdd9eee2b2b60ab6367da878582fc
+description: Store commit related information within a merge request diff
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12527
milestone: '9.4'
diff --git a/db/docs/merge_request_diff_details.yml b/db/docs/merge_request_diff_details.yml
index 4d48beb4de6..ff0770e97b6 100644
--- a/db/docs/merge_request_diff_details.yml
+++ b/db/docs/merge_request_diff_details.yml
@@ -3,7 +3,7 @@ table_name: merge_request_diff_details
classes:
- MergeRequestDiffDetail
feature_categories:
-- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- geo_replication
+description: External MR diff replication detail
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34248
milestone: '13.4'
diff --git a/db/docs/merge_request_diff_files.yml b/db/docs/merge_request_diff_files.yml
index 9d3e9c7715b..56b7b0ec6ee 100644
--- a/db/docs/merge_request_diff_files.yml
+++ b/db/docs/merge_request_diff_files.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestDiffFile
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9a73b634ab4220f68a8296ccb582a68293874489
+description: Store file related information within a merge request diff
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12047
milestone: '9.4'
diff --git a/db/docs/merge_request_diffs.yml b/db/docs/merge_request_diffs.yml
index f8df727e7fa..912f972e67d 100644
--- a/db/docs/merge_request_diffs.yml
+++ b/db/docs/merge_request_diffs.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestDiff
feature_categories:
- code_review
-description: TODO
+description: Store information about the changes made within a git push for a merge request
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/c983e8eb3d9cac01090b8657735544f71f891576
milestone: '6.6'
diff --git a/db/docs/merge_request_metrics.yml b/db/docs/merge_request_metrics.yml
index a2fb3d187d6..5faf14d0875 100644
--- a/db/docs/merge_request_metrics.yml
+++ b/db/docs/merge_request_metrics.yml
@@ -5,6 +5,6 @@ classes:
feature_categories:
- value_stream_management
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/487906b3861068a8f81125814f919a07bfab8469
+description: Store various metrics for merge requests
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5986
milestone: '8.12'
diff --git a/db/docs/merge_request_reviewers.yml b/db/docs/merge_request_reviewers.yml
index a039a2bba84..61810bd13c9 100644
--- a/db/docs/merge_request_reviewers.yml
+++ b/db/docs/merge_request_reviewers.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestReviewer
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Store allocated reviewers for merge requests
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40358
milestone: '13.4'
diff --git a/db/docs/merge_request_user_mentions.yml b/db/docs/merge_request_user_mentions.yml
index edae95c3a65..95d2117c12b 100644
--- a/db/docs/merge_request_user_mentions.yml
+++ b/db/docs/merge_request_user_mentions.yml
@@ -3,7 +3,7 @@ table_name: merge_request_user_mentions
classes:
- MergeRequestUserMention
feature_categories:
-- code_review
-description: TODO
+- team_planning
+description: Store user mentions for merge requests
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/merge_requests.yml b/db/docs/merge_requests.yml
index 49f3b2f97e8..6546d28a534 100644
--- a/db/docs/merge_requests.yml
+++ b/db/docs/merge_requests.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequest
feature_categories:
- code_review
-description: TODO
+description: This is the main table that stores information about project merge requests.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6d460aa2d6b3959593c168eed181516036525393
milestone: "<6.0"
diff --git a/db/docs/merge_requests_closing_issues.yml b/db/docs/merge_requests_closing_issues.yml
index fd68b5627f8..210419bc75f 100644
--- a/db/docs/merge_requests_closing_issues.yml
+++ b/db/docs/merge_requests_closing_issues.yml
@@ -4,6 +4,6 @@ classes:
- MergeRequestsClosingIssues
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/ba25e2f1ac61b47940f939a2d9f1d0ad417e1de2
+description: Store the events of merge request closing any issues
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5986
milestone: '8.12'
diff --git a/db/docs/metrics_dashboard_annotations.yml b/db/docs/metrics_dashboard_annotations.yml
index e5f03bf4525..a874ef0dfdc 100644
--- a/db/docs/metrics_dashboard_annotations.yml
+++ b/db/docs/metrics_dashboard_annotations.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- metrics
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27583
milestone: '13.0'
diff --git a/db/docs/metrics_users_starred_dashboards.yml b/db/docs/metrics_users_starred_dashboards.yml
index 2d86519455c..903b563d071 100644
--- a/db/docs/metrics_users_starred_dashboards.yml
+++ b/db/docs/metrics_users_starred_dashboards.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- metrics
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29912
milestone: '13.0'
diff --git a/db/docs/milestones.yml b/db/docs/milestones.yml
index be4c7540c43..c41bb289f37 100644
--- a/db/docs/milestones.yml
+++ b/db/docs/milestones.yml
@@ -4,6 +4,6 @@ classes:
- Milestone
feature_categories:
- team_planning
-description: TODO
+description: Information related to milestones, used by team planning features to timebox work
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/23d950855d6d2524d00b1f0618c008e2529f06a4
milestone: "<6.0"
diff --git a/db/docs/namespace_admin_notes.yml b/db/docs/namespace_admin_notes.yml
index afc9f814fd6..f46d8f8846b 100644
--- a/db/docs/namespace_admin_notes.yml
+++ b/db/docs/namespace_admin_notes.yml
@@ -3,7 +3,8 @@ table_name: namespace_admin_notes
classes:
- Namespace::AdminNote
feature_categories:
+- authentication_and_authorization
- subgroups
-description: TODO
+description: Contains notes about groups that are visible to server administrators.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47825
milestone: '13.11'
diff --git a/db/docs/namespace_ci_cd_settings.yml b/db/docs/namespace_ci_cd_settings.yml
new file mode 100644
index 00000000000..8159f721c98
--- /dev/null
+++ b/db/docs/namespace_ci_cd_settings.yml
@@ -0,0 +1,10 @@
+---
+table_name: namespace_ci_cd_settings
+classes:
+- NamespaceCiCdSetting
+feature_categories:
+- continuous_integration
+- runner_fleet
+description: Namespace-scoped settings related to the CI/CD domain
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86477
+milestone: '15.0'
diff --git a/db/docs/namespace_limits.yml b/db/docs/namespace_limits.yml
index 4b528dcd447..55b174f9e6f 100644
--- a/db/docs/namespace_limits.yml
+++ b/db/docs/namespace_limits.yml
@@ -3,7 +3,7 @@ table_name: namespace_limits
classes:
- NamespaceLimit
feature_categories:
-- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- utilization
+description: Contains limits for namespace features like storage and ci
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34746
milestone: '13.2'
diff --git a/db/docs/namespace_package_settings.yml b/db/docs/namespace_package_settings.yml
index 5d5971ca73f..518458dd02f 100644
--- a/db/docs/namespace_package_settings.yml
+++ b/db/docs/namespace_package_settings.yml
@@ -4,6 +4,6 @@ classes:
- Namespace::PackageSetting
feature_categories:
- package_registry
-description: TODO
+description: Namespace and group-level settings for the package registry
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50104
milestone: '13.8'
diff --git a/db/docs/namespace_settings.yml b/db/docs/namespace_settings.yml
index a452d2473c5..ef2f96eb46e 100644
--- a/db/docs/namespace_settings.yml
+++ b/db/docs/namespace_settings.yml
@@ -4,6 +4,6 @@ classes:
- NamespaceSetting
feature_categories:
- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores settings per namespace
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36321
milestone: '13.2'
diff --git a/db/docs/namespaces.yml b/db/docs/namespaces.yml
index 49d84d15a75..0518b055e52 100644
--- a/db/docs/namespaces.yml
+++ b/db/docs/namespaces.yml
@@ -7,6 +7,6 @@ classes:
- Namespaces::UserNamespace
feature_categories:
- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e29ccece332e57c9fb6c532a3680e3b457e3a301
+description: Storing namespaces records for groups, users and projects
+introduced_by_url: https://github.com/gitlabhq/gitlabhq/pull/2051
milestone: "<6.0"
diff --git a/db/docs/note_diff_files.yml b/db/docs/note_diff_files.yml
index a3908378d92..33921af7f6d 100644
--- a/db/docs/note_diff_files.yml
+++ b/db/docs/note_diff_files.yml
@@ -4,6 +4,6 @@ classes:
- NoteDiffFile
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bb8f2520b4254c9dabe377df48e29c5f17894a1d
+description: Persisted truncated note diffs
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/18991
milestone: '11.0'
diff --git a/db/docs/notes.yml b/db/docs/notes.yml
index 9ceeb0e1fe1..f97bfc5bb5c 100644
--- a/db/docs/notes.yml
+++ b/db/docs/notes.yml
@@ -12,7 +12,11 @@ classes:
- SyntheticNote
- WeightNote
feature_categories:
+- code_review
+- portfolio_management
+- service_desk
+- snippets
- team_planning
-description: TODO
+description: The object at the core of comments, discussions and system notes shown on issues, MRs and epics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
milestone: "<6.0"
diff --git a/db/docs/notification_settings.yml b/db/docs/notification_settings.yml
index 8791213322c..214db1ca14a 100644
--- a/db/docs/notification_settings.yml
+++ b/db/docs/notification_settings.yml
@@ -4,6 +4,6 @@ classes:
- NotificationSetting
feature_categories:
- team_planning
-description: TODO
+description: User preferences for receiving notifications related to various actions within the application
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/31b0e53015e38e51d9c02cca85c9279600b1bf85
milestone: '8.7'
diff --git a/db/docs/operations_feature_flags.yml b/db/docs/operations_feature_flags.yml
index 1a294aaa07a..c84ed55d0fb 100644
--- a/db/docs/operations_feature_flags.yml
+++ b/db/docs/operations_feature_flags.yml
@@ -3,7 +3,7 @@ table_name: operations_feature_flags
classes:
- Operations::FeatureFlag
feature_categories:
-- integrations
+- release
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7433
milestone: '11.4'
diff --git a/db/docs/operations_feature_flags_issues.yml b/db/docs/operations_feature_flags_issues.yml
index 9b440b5cb41..660c8161a08 100644
--- a/db/docs/operations_feature_flags_issues.yml
+++ b/db/docs/operations_feature_flags_issues.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- feature_flags
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32876
milestone: '13.1'
diff --git a/db/docs/operations_strategies_user_lists.yml b/db/docs/operations_strategies_user_lists.yml
index 7e283021e43..d56950b877c 100644
--- a/db/docs/operations_strategies_user_lists.yml
+++ b/db/docs/operations_strategies_user_lists.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- feature_flags
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30243
milestone: '13.0'
diff --git a/db/docs/operations_user_lists.yml b/db/docs/operations_user_lists.yml
index 4f1473bd09d..68af1fae839 100644
--- a/db/docs/operations_user_lists.yml
+++ b/db/docs/operations_user_lists.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- feature_flags
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28822
milestone: '13.0'
diff --git a/db/docs/packages_build_infos.yml b/db/docs/packages_build_infos.yml
index 5ddea0efdc0..5eae65c0e0e 100644
--- a/db/docs/packages_build_infos.yml
+++ b/db/docs/packages_build_infos.yml
@@ -4,6 +4,6 @@ classes:
- Packages::BuildInfo
feature_categories:
- package_registry
-description: TODO
+description: Join table relating packages_packages with ci_pipelines
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19796
milestone: '12.6'
diff --git a/db/docs/packages_cleanup_policies.yml b/db/docs/packages_cleanup_policies.yml
new file mode 100644
index 00000000000..1221c7952a0
--- /dev/null
+++ b/db/docs/packages_cleanup_policies.yml
@@ -0,0 +1,9 @@
+---
+table_name: packages_cleanup_policies
+classes:
+- Packages::Cleanup::Policy
+feature_categories:
+- package_registry
+description: Cleanup policy parameters for packages.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85918
+milestone: '15.0'
diff --git a/db/docs/packages_composer_cache_files.yml b/db/docs/packages_composer_cache_files.yml
index 97993c3f255..e6e81eb149b 100644
--- a/db/docs/packages_composer_cache_files.yml
+++ b/db/docs/packages_composer_cache_files.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Composer::CacheFile
feature_categories:
- package_registry
-description: TODO
+description: Composer packages cached SHA files (deprecated)
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51509
milestone: '13.9'
diff --git a/db/docs/packages_composer_metadata.yml b/db/docs/packages_composer_metadata.yml
index a50143c8b82..19d51711d42 100644
--- a/db/docs/packages_composer_metadata.yml
+++ b/db/docs/packages_composer_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Composer::Metadatum
feature_categories:
- package_registry
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Composer package metadata
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30448
milestone: '13.1'
diff --git a/db/docs/packages_conan_file_metadata.yml b/db/docs/packages_conan_file_metadata.yml
index 4e3c3c99933..7d4d86ee4ed 100644
--- a/db/docs/packages_conan_file_metadata.yml
+++ b/db/docs/packages_conan_file_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Conan::FileMetadatum
feature_categories:
- package_registry
-description: TODO
+description: Conan package file metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16418
milestone: '12.5'
diff --git a/db/docs/packages_conan_metadata.yml b/db/docs/packages_conan_metadata.yml
index aba2904d564..82b590af698 100644
--- a/db/docs/packages_conan_metadata.yml
+++ b/db/docs/packages_conan_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Conan::Metadatum
feature_categories:
- package_registry
-description: TODO
+description: Conan package metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16418
milestone: '12.5'
diff --git a/db/docs/packages_debian_file_metadata.yml b/db/docs/packages_debian_file_metadata.yml
index 3d4e17c04f3..6a86b7ec285 100644
--- a/db/docs/packages_debian_file_metadata.yml
+++ b/db/docs/packages_debian_file_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::FileMetadatum
feature_categories:
- package_registry
-description: TODO
+description: Debian package file metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49692
milestone: '13.8'
diff --git a/db/docs/packages_debian_group_architectures.yml b/db/docs/packages_debian_group_architectures.yml
index b403d632dc7..4ffee154fa3 100644
--- a/db/docs/packages_debian_group_architectures.yml
+++ b/db/docs/packages_debian_group_architectures.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::GroupArchitecture
feature_categories:
- package_registry
-description: TODO
+description: Debian registry group-level architectures
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51265
milestone: '13.8'
diff --git a/db/docs/packages_debian_group_component_files.yml b/db/docs/packages_debian_group_component_files.yml
index 3b5deebdd10..dc68328e4b5 100644
--- a/db/docs/packages_debian_group_component_files.yml
+++ b/db/docs/packages_debian_group_component_files.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::GroupComponentFile
feature_categories:
- package_registry
-description: TODO
+description: Debian group-level component files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52885
milestone: '13.9'
diff --git a/db/docs/packages_debian_group_components.yml b/db/docs/packages_debian_group_components.yml
index 6d2389fed5a..316e46b90b7 100644
--- a/db/docs/packages_debian_group_components.yml
+++ b/db/docs/packages_debian_group_components.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::GroupComponent
feature_categories:
- package_registry
-description: TODO
+description: Debian package group-level distribution components
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51732
milestone: '13.9'
diff --git a/db/docs/packages_debian_group_distribution_keys.yml b/db/docs/packages_debian_group_distribution_keys.yml
index 527c71d60c1..19d55536e37 100644
--- a/db/docs/packages_debian_group_distribution_keys.yml
+++ b/db/docs/packages_debian_group_distribution_keys.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::GroupDistributionKey
feature_categories:
- package_registry
-description: TODO
+description: Debian group-level distribution keys
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60993
milestone: '14.0'
diff --git a/db/docs/packages_debian_group_distributions.yml b/db/docs/packages_debian_group_distributions.yml
index 6512640b9f9..cb4b3bcd469 100644
--- a/db/docs/packages_debian_group_distributions.yml
+++ b/db/docs/packages_debian_group_distributions.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::GroupDistribution
feature_categories:
- package_registry
-description: TODO
+description: Debian registry group level distributions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49405
milestone: '13.8'
diff --git a/db/docs/packages_debian_project_architectures.yml b/db/docs/packages_debian_project_architectures.yml
index 853cc81d15f..becdee8cfa6 100644
--- a/db/docs/packages_debian_project_architectures.yml
+++ b/db/docs/packages_debian_project_architectures.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::ProjectArchitecture
feature_categories:
- package_registry
-description: TODO
+description: Debian registry group-level architectures
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51265
milestone: '13.8'
diff --git a/db/docs/packages_debian_project_component_files.yml b/db/docs/packages_debian_project_component_files.yml
index cdd6355750d..5b6da936ebc 100644
--- a/db/docs/packages_debian_project_component_files.yml
+++ b/db/docs/packages_debian_project_component_files.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::ProjectComponentFile
feature_categories:
- package_registry
-description: TODO
+description: Debian project-level component files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52885
milestone: '13.9'
diff --git a/db/docs/packages_debian_project_components.yml b/db/docs/packages_debian_project_components.yml
index c638e2c978a..44eb9a489a0 100644
--- a/db/docs/packages_debian_project_components.yml
+++ b/db/docs/packages_debian_project_components.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::ProjectComponent
feature_categories:
- package_registry
-description: TODO
+description: Debian package project-level distribution components
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51732
milestone: '13.9'
diff --git a/db/docs/packages_debian_project_distribution_keys.yml b/db/docs/packages_debian_project_distribution_keys.yml
index 81408969dec..17863f45e88 100644
--- a/db/docs/packages_debian_project_distribution_keys.yml
+++ b/db/docs/packages_debian_project_distribution_keys.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::ProjectDistributionKey
feature_categories:
- package_registry
-description: TODO
+description: Debian project-level distribution keys
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60993
milestone: '14.0'
diff --git a/db/docs/packages_debian_project_distributions.yml b/db/docs/packages_debian_project_distributions.yml
index 814ad61f878..4689b0b7534 100644
--- a/db/docs/packages_debian_project_distributions.yml
+++ b/db/docs/packages_debian_project_distributions.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::ProjectDistribution
feature_categories:
- package_registry
-description: TODO
+description: Debian package registry project level distributions
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49405
milestone: '13.8'
diff --git a/db/docs/packages_debian_publications.yml b/db/docs/packages_debian_publications.yml
index b5ae53759aa..181338308a3 100644
--- a/db/docs/packages_debian_publications.yml
+++ b/db/docs/packages_debian_publications.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Debian::Publication
feature_categories:
- package_registry
-description: TODO
+description: Debian package publications relating distributions to packages
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52916
milestone: '13.9'
diff --git a/db/docs/packages_dependencies.yml b/db/docs/packages_dependencies.yml
index ead51b0606a..27b0b2cbd9b 100644
--- a/db/docs/packages_dependencies.yml
+++ b/db/docs/packages_dependencies.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Dependency
feature_categories:
- package_registry
-description: TODO
+description: Information about package dependencies for a set of supported package types
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20549
milestone: '12.6'
diff --git a/db/docs/packages_dependency_links.yml b/db/docs/packages_dependency_links.yml
index 1045cd08e42..5a6731a9e82 100644
--- a/db/docs/packages_dependency_links.yml
+++ b/db/docs/packages_dependency_links.yml
@@ -4,6 +4,6 @@ classes:
- Packages::DependencyLink
feature_categories:
- package_registry
-description: TODO
+description: Join table between packages_packages and packages_dependencies
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20549
milestone: '12.6'
diff --git a/db/docs/packages_events.yml b/db/docs/packages_events.yml
index 2d33fb0048d..1063e26a749 100644
--- a/db/docs/packages_events.yml
+++ b/db/docs/packages_events.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Event
feature_categories:
- package_registry
-description: TODO
+description: Package tracking events (deprecated)
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41846
milestone: '13.5'
diff --git a/db/docs/packages_helm_file_metadata.yml b/db/docs/packages_helm_file_metadata.yml
index 63d5f8d05e6..13b23fd88cf 100644
--- a/db/docs/packages_helm_file_metadata.yml
+++ b/db/docs/packages_helm_file_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Helm::FileMetadatum
feature_categories:
- package_registry
-description: TODO
+description: Helm package file metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57017
milestone: '13.12'
diff --git a/db/docs/packages_maven_metadata.yml b/db/docs/packages_maven_metadata.yml
index 6d00fe77502..6f99f79ffc2 100644
--- a/db/docs/packages_maven_metadata.yml
+++ b/db/docs/packages_maven_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Maven::Metadatum
feature_categories:
- package_registry
-description: TODO
+description: Maven package metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
milestone: '11.3'
diff --git a/db/docs/packages_npm_metadata.yml b/db/docs/packages_npm_metadata.yml
index 588e60ebe42..af8c20bf1c0 100644
--- a/db/docs/packages_npm_metadata.yml
+++ b/db/docs/packages_npm_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Npm::Metadatum
feature_categories:
- package_registry
-description: TODO
+description: Npm package metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73639
milestone: '14.5'
diff --git a/db/docs/packages_nuget_dependency_link_metadata.yml b/db/docs/packages_nuget_dependency_link_metadata.yml
index 12234295a67..92c00306eb3 100644
--- a/db/docs/packages_nuget_dependency_link_metadata.yml
+++ b/db/docs/packages_nuget_dependency_link_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Nuget::DependencyLinkMetadatum
feature_categories:
- package_registry
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Join table between nuget target frameworks and packages_dependency_links
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30618
milestone: '13.0'
diff --git a/db/docs/packages_nuget_metadata.yml b/db/docs/packages_nuget_metadata.yml
index 5c4e1203a85..8179666c148 100644
--- a/db/docs/packages_nuget_metadata.yml
+++ b/db/docs/packages_nuget_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Nuget::Metadatum
feature_categories:
- package_registry
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
-milestone: '13.0'
+description: Nuget package metadata
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30994
+milestone: '13.1'
diff --git a/db/docs/packages_package_file_build_infos.yml b/db/docs/packages_package_file_build_infos.yml
index 808fb837e70..16996a07def 100644
--- a/db/docs/packages_package_file_build_infos.yml
+++ b/db/docs/packages_package_file_build_infos.yml
@@ -4,6 +4,6 @@ classes:
- Packages::PackageFileBuildInfo
feature_categories:
- package_registry
-description: TODO
+description: Join table relating packages_package_files and ci_pipelines
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44348
milestone: '13.6'
diff --git a/db/docs/packages_package_files.yml b/db/docs/packages_package_files.yml
index 4d7a0410ba4..c9e23f1003e 100644
--- a/db/docs/packages_package_files.yml
+++ b/db/docs/packages_package_files.yml
@@ -4,6 +4,6 @@ classes:
- Packages::PackageFile
feature_categories:
- package_registry
-description: TODO
+description: Package registry file links and file metadata for all package types
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
milestone: '11.3'
diff --git a/db/docs/packages_packages.yml b/db/docs/packages_packages.yml
index 2ad5ae62c88..6378aeaa565 100644
--- a/db/docs/packages_packages.yml
+++ b/db/docs/packages_packages.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Package
feature_categories:
- package_registry
-description: TODO
+description: Information for individual packages in the package registry
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6607
milestone: '11.3'
diff --git a/db/docs/packages_pypi_metadata.yml b/db/docs/packages_pypi_metadata.yml
index 4f39a392f65..7d2d8d7be05 100644
--- a/db/docs/packages_pypi_metadata.yml
+++ b/db/docs/packages_pypi_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Pypi::Metadatum
feature_categories:
- package_registry
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: PyPI package metadata
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27632
milestone: '13.0'
diff --git a/db/docs/packages_rubygems_metadata.yml b/db/docs/packages_rubygems_metadata.yml
index 0384427f782..ba521f99d77 100644
--- a/db/docs/packages_rubygems_metadata.yml
+++ b/db/docs/packages_rubygems_metadata.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Rubygems::Metadatum
feature_categories:
- package_registry
-description: TODO
+description: Ruby gems metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52639
milestone: '13.9'
diff --git a/db/docs/packages_tags.yml b/db/docs/packages_tags.yml
index 760c7229e9f..41aad5590f5 100644
--- a/db/docs/packages_tags.yml
+++ b/db/docs/packages_tags.yml
@@ -4,6 +4,6 @@ classes:
- Packages::Tag
feature_categories:
- package_registry
-description: TODO
+description: Package identifier tags for supported package types. See https://docs.gitlab.com/ee/user/packages/npm_registry/#add-npm-distribution-tags for an example.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20636
milestone: '12.7'
diff --git a/db/docs/pages_deployment_states.yml b/db/docs/pages_deployment_states.yml
index 9e526eea46e..dd0ff12abbe 100644
--- a/db/docs/pages_deployment_states.yml
+++ b/db/docs/pages_deployment_states.yml
@@ -4,6 +4,6 @@ classes:
- Geo::PagesDeploymentState
feature_categories:
- pages
-description: TODO
+description: Stores verification state for Geo replicated Pages deployments.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74905
milestone: '14.6'
diff --git a/db/docs/pages_deployments.yml b/db/docs/pages_deployments.yml
index 3c96d27c179..606147f9887 100644
--- a/db/docs/pages_deployments.yml
+++ b/db/docs/pages_deployments.yml
@@ -4,6 +4,6 @@ classes:
- PagesDeployment
feature_categories:
- pages
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores ZIP archives for GitLab Pages websites.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41785
milestone: '13.4'
diff --git a/db/docs/pages_domain_acme_orders.yml b/db/docs/pages_domain_acme_orders.yml
index 7c1a31eac26..1bc97c3e47e 100644
--- a/db/docs/pages_domain_acme_orders.yml
+++ b/db/docs/pages_domain_acme_orders.yml
@@ -4,6 +4,6 @@ classes:
- PagesDomainAcmeOrder
feature_categories:
- pages
-description: TODO
+description: Stores ACME order information used in obtaining Let's Encrypt certificates for GitLab Pages domains.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/14014
milestone: '12.0'
diff --git a/db/docs/pages_domains.yml b/db/docs/pages_domains.yml
index 8fecb70740c..e0fc084c4c2 100644
--- a/db/docs/pages_domains.yml
+++ b/db/docs/pages_domains.yml
@@ -4,6 +4,6 @@ classes:
- PagesDomain
feature_categories:
- pages
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/807a5494fa543392ea7a996b479e577d41ff6344
+description: Store Pages domain, certificate and encryption meta data.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/173
milestone: '8.5'
diff --git a/db/docs/plan_limits.yml b/db/docs/plan_limits.yml
index a923704d568..f5ddcb11f3d 100644
--- a/db/docs/plan_limits.yml
+++ b/db/docs/plan_limits.yml
@@ -4,6 +4,6 @@ classes:
- PlanLimits
feature_categories:
- purchase
-description: TODO
+description: Contains Plan specific limits (CI minute quantities for example)
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19438
milestone: '12.5'
diff --git a/db/docs/plans.yml b/db/docs/plans.yml
index a259d1d1628..df227bcb6e9 100644
--- a/db/docs/plans.yml
+++ b/db/docs/plans.yml
@@ -4,6 +4,6 @@ classes:
- Plan
feature_categories:
- purchase
-description: TODO
+description: Contains information about purchasable Plans for GitLab namespaces
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/39ca951a0f28d147d4689379bbe48a9c14d55d9f
milestone: '9.5'
diff --git a/db/docs/programming_languages.yml b/db/docs/programming_languages.yml
index f1b44508bbb..5da5720a116 100644
--- a/db/docs/programming_languages.yml
+++ b/db/docs/programming_languages.yml
@@ -3,7 +3,7 @@ table_name: programming_languages
classes:
- ProgrammingLanguage
feature_categories:
-- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/79a5d76801a45696db629e1f543f2e1d6fa4784f
+- source_code_management
+description: Contains known programming languages and their assigned colors
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/19480
milestone: '11.2'
diff --git a/db/docs/project_access_tokens.yml b/db/docs/project_access_tokens.yml
index 59b1ad32857..8c53c854b64 100644
--- a/db/docs/project_access_tokens.yml
+++ b/db/docs/project_access_tokens.yml
@@ -4,5 +4,5 @@ classes: []
feature_categories:
- authentication_and_authorization
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33272
milestone: '13.1'
diff --git a/db/docs/project_alerting_settings.yml b/db/docs/project_alerting_settings.yml
index 60a23e35f71..0737c65faaf 100644
--- a/db/docs/project_alerting_settings.yml
+++ b/db/docs/project_alerting_settings.yml
@@ -4,6 +4,6 @@ classes:
- Alerting::ProjectAlertingSetting
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/39aa9458c282c1dabd3623698da5af3b9a6122a9
+description: Persists project-level tokens for manual Prometheus installations
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9334
milestone: '11.8'
diff --git a/db/docs/project_authorizations.yml b/db/docs/project_authorizations.yml
index b2ca65a53d5..890997d7d33 100644
--- a/db/docs/project_authorizations.yml
+++ b/db/docs/project_authorizations.yml
@@ -4,6 +4,7 @@ classes:
- ProjectAuthorization
feature_categories:
- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/fd05e26618dd0c123ca476b6f5a3d85f1cfe397a
+- authentication_and_authorization
+description: Stores maximal access to the project per user
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/6839
milestone: '8.14'
diff --git a/db/docs/project_build_artifacts_size_refreshes.yml b/db/docs/project_build_artifacts_size_refreshes.yml
new file mode 100644
index 00000000000..8f07ab9b3e1
--- /dev/null
+++ b/db/docs/project_build_artifacts_size_refreshes.yml
@@ -0,0 +1,9 @@
+---
+table_name: project_build_artifacts_size_refreshes
+classes:
+- Projects::BuildArtifactsSizeRefresh
+feature_categories:
+- build_artifacts
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81306
+milestone: '14.9'
diff --git a/db/docs/project_ci_feature_usages.yml b/db/docs/project_ci_feature_usages.yml
index bc327583a8e..af9404570df 100644
--- a/db/docs/project_ci_feature_usages.yml
+++ b/db/docs/project_ci_feature_usages.yml
@@ -3,8 +3,7 @@ table_name: project_ci_feature_usages
classes:
- Projects::CiFeatureUsage
feature_categories:
-- projects
-- continuous_integration
-description: TODO
+- code_testing
+description: Project CI feature usage information
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68186
milestone: '14.2'
diff --git a/db/docs/project_compliance_framework_settings.yml b/db/docs/project_compliance_framework_settings.yml
index 3d409ca5dd6..bc5555926c1 100644
--- a/db/docs/project_compliance_framework_settings.yml
+++ b/db/docs/project_compliance_framework_settings.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- compliance_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28182
milestone: '13.0'
diff --git a/db/docs/project_custom_attributes.yml b/db/docs/project_custom_attributes.yml
index 56f425f4c21..90f13b4f593 100644
--- a/db/docs/project_custom_attributes.yml
+++ b/db/docs/project_custom_attributes.yml
@@ -4,6 +4,6 @@ classes:
- ProjectCustomAttribute
feature_categories:
- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/6902848a9c54f9eb1bfd82fe173ad0d5d62fe2d5
+description: Stores custom attributes per project
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/14593
milestone: '10.2'
diff --git a/db/docs/project_error_tracking_settings.yml b/db/docs/project_error_tracking_settings.yml
index 0a1e2571743..d10982fe712 100644
--- a/db/docs/project_error_tracking_settings.yml
+++ b/db/docs/project_error_tracking_settings.yml
@@ -4,6 +4,6 @@ classes:
- ErrorTracking::ProjectErrorTrackingSetting
feature_categories:
- error_tracking
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f40b5860d76a8ea5d964260834a6e83516b0f1fd
+description: Project settings related to Error Tracking
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/24047
milestone: '11.7'
diff --git a/db/docs/project_export_jobs.yml b/db/docs/project_export_jobs.yml
index 2afc913a8bb..991cdbeb12a 100644
--- a/db/docs/project_export_jobs.yml
+++ b/db/docs/project_export_jobs.yml
@@ -4,6 +4,6 @@ classes:
- ProjectExportJob
feature_categories:
- importers
-description: TODO
+description: Used to track and control project export status
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23664
milestone: '12.9'
diff --git a/db/docs/project_feature_usages.yml b/db/docs/project_feature_usages.yml
index 51e8191c6e5..b3182de243b 100644
--- a/db/docs/project_feature_usages.yml
+++ b/db/docs/project_feature_usages.yml
@@ -3,7 +3,7 @@ table_name: project_feature_usages
classes:
- ProjectFeatureUsage
feature_categories:
-- product_analytics
-description: TODO
+- integrations
+description: Track Jira DVCS usage
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/21db9a55e200b23a5a47251e9df46fd548c74559
milestone: '11.8'
diff --git a/db/docs/project_features.yml b/db/docs/project_features.yml
index 7890f023485..7b94db88e70 100644
--- a/db/docs/project_features.yml
+++ b/db/docs/project_features.yml
@@ -3,7 +3,7 @@ table_name: project_features
classes:
- ProjectFeature
feature_categories:
-- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/892dea67717c0efbd6a28f7639f34535ec0a8747
+- navigation
+description: Stores access levels for project features like wikis, issues, repositories, containers, ect.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5606
milestone: '8.12'
diff --git a/db/docs/project_import_data.yml b/db/docs/project_import_data.yml
index 5bff9f27dca..22c0f036b63 100644
--- a/db/docs/project_import_data.yml
+++ b/db/docs/project_import_data.yml
@@ -4,6 +4,6 @@ classes:
- ProjectImportData
feature_categories:
- importers
-description: TODO
+description: Used to store credentials and configuration of external projects when using the Import/Export feature
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7d98c8842d6bc9b14fb410f028db7ab651961b42
milestone: '7.10'
diff --git a/db/docs/project_incident_management_settings.yml b/db/docs/project_incident_management_settings.yml
index 55413824f40..b1ef6824fe2 100644
--- a/db/docs/project_incident_management_settings.yml
+++ b/db/docs/project_incident_management_settings.yml
@@ -4,6 +4,6 @@ classes:
- IncidentManagement::ProjectIncidentManagementSetting
feature_categories:
- incident_management
-description: TODO
+description: Persists project settings for incident management
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/9744
milestone: '11.9'
diff --git a/db/docs/project_mirror_data.yml b/db/docs/project_mirror_data.yml
index e6426b7f638..3ea755c04a2 100644
--- a/db/docs/project_mirror_data.yml
+++ b/db/docs/project_mirror_data.yml
@@ -4,6 +4,6 @@ classes:
- ProjectImportState
feature_categories:
- importers
-description: TODO
+description: Used to store and track the project import status when using the Import/Export feature
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/0ca479d1ce0eadfcdc0e29d0e18136f5790d5b2f
milestone: '9.3'
diff --git a/db/docs/project_pages_metadata.yml b/db/docs/project_pages_metadata.yml
index 38da6c77f83..aa792520bc3 100644
--- a/db/docs/project_pages_metadata.yml
+++ b/db/docs/project_pages_metadata.yml
@@ -4,6 +4,6 @@ classes:
- ProjectPagesMetadatum
feature_categories:
- pages
-description: TODO
+description: Store GitLab Pages metadata for projects.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17197
milestone: '12.4'
diff --git a/db/docs/project_repository_storage_moves.yml b/db/docs/project_repository_storage_moves.yml
index fe3886a7690..12fa9d33f07 100644
--- a/db/docs/project_repository_storage_moves.yml
+++ b/db/docs/project_repository_storage_moves.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- source_code_management
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29095
milestone: '13.0'
diff --git a/db/docs/project_security_settings.yml b/db/docs/project_security_settings.yml
index b1f6264950a..79ebdcae8c2 100644
--- a/db/docs/project_security_settings.yml
+++ b/db/docs/project_security_settings.yml
@@ -3,7 +3,8 @@ table_name: project_security_settings
classes:
- ProjectSecuritySetting
feature_categories:
-- projects
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- dependency_scanning
+- container_scanning
+description: Project settings related to security features.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32577
milestone: '13.1'
diff --git a/db/docs/project_settings.yml b/db/docs/project_settings.yml
index 5aa3d6daf48..cc084590c89 100644
--- a/db/docs/project_settings.yml
+++ b/db/docs/project_settings.yml
@@ -4,6 +4,6 @@ classes:
- ProjectSetting
feature_categories:
- projects
-description: TODO
+description: Stores settings per project
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/a2a7ad291f64a5db74c1bc21fb556e6e8862d0f3
-milestone: '12.8'
+milestone: '10.8'
diff --git a/db/docs/project_topics.yml b/db/docs/project_topics.yml
index addad163923..cbe0d482586 100644
--- a/db/docs/project_topics.yml
+++ b/db/docs/project_topics.yml
@@ -4,6 +4,6 @@ classes:
- Projects::ProjectTopic
feature_categories:
- projects
-description: TODO
+description: Stores topics per project relationship
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67574
milestone: '14.3'
diff --git a/db/docs/project_tracing_settings.yml b/db/docs/project_tracing_settings.yml
index cc7e65a6cb8..1a864dc7eae 100644
--- a/db/docs/project_tracing_settings.yml
+++ b/db/docs/project_tracing_settings.yml
@@ -3,7 +3,7 @@ table_name: project_tracing_settings
classes:
- ProjectTracingSetting
feature_categories:
-- projects
+- tracing
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7903
milestone: '11.5'
diff --git a/db/docs/projects.yml b/db/docs/projects.yml
index 41fef75ae0c..9a845a21751 100644
--- a/db/docs/projects.yml
+++ b/db/docs/projects.yml
@@ -4,6 +4,6 @@ classes:
- Project
feature_categories:
- projects
-description: TODO
+description: Stores project records
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
milestone: "<6.0"
diff --git a/db/docs/prometheus_alerts.yml b/db/docs/prometheus_alerts.yml
index 0e017292f81..3d3a2e45650 100644
--- a/db/docs/prometheus_alerts.yml
+++ b/db/docs/prometheus_alerts.yml
@@ -4,6 +4,6 @@ classes:
- PrometheusAlert
feature_categories:
- incident_management
-description: TODO
+description: Persists information about prometheus alerts from an environment
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6590
milestone: '11.2'
diff --git a/db/docs/protected_environment_approval_rules.yml b/db/docs/protected_environment_approval_rules.yml
new file mode 100644
index 00000000000..ea7f0e1d05d
--- /dev/null
+++ b/db/docs/protected_environment_approval_rules.yml
@@ -0,0 +1,9 @@
+---
+table_name: protected_environment_approval_rules
+classes:
+- ProtectedEnvironments::ApprovalRule
+feature_categories:
+- continuous_delivery
+description: TODO
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82800
+milestone: '14.10'
diff --git a/db/docs/raw_usage_data.yml b/db/docs/raw_usage_data.yml
index 36dfbd7742a..c7e194d6417 100644
--- a/db/docs/raw_usage_data.yml
+++ b/db/docs/raw_usage_data.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- metrics
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/38457
milestone: '13.3'
diff --git a/db/docs/redirect_routes.yml b/db/docs/redirect_routes.yml
index 315a251a921..a9b93a9b8f9 100644
--- a/db/docs/redirect_routes.yml
+++ b/db/docs/redirect_routes.yml
@@ -5,6 +5,6 @@ classes:
feature_categories:
- projects
- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/7d02bcd2e0165a90a9f2c1edb34b064ff76afd69
+description: Stores routes for redirect after changing the path to group or project
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/11136
milestone: '9.2'
diff --git a/db/docs/related_epic_links.yml b/db/docs/related_epic_links.yml
index a99b8791703..f498353c04b 100644
--- a/db/docs/related_epic_links.yml
+++ b/db/docs/related_epic_links.yml
@@ -4,6 +4,6 @@ classes:
- Epic::RelatedEpicLink
feature_categories:
- portfolio_management
-description: TODO
+description: Information on the relationship between two epics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80499
milestone: '14.9'
diff --git a/db/docs/requirements.yml b/db/docs/requirements.yml
index fc473246e53..29340196b32 100644
--- a/db/docs/requirements.yml
+++ b/db/docs/requirements.yml
@@ -4,6 +4,6 @@ classes:
- RequirementsManagement::Requirement
feature_categories:
- requirements_management
-description: TODO
+description: Information relating to Requirements as implemented by the Requirements Management tool
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26097
milestone: '12.9'
diff --git a/db/docs/requirements_management_test_reports.yml b/db/docs/requirements_management_test_reports.yml
index a39bb19637f..b7fc5fa54f8 100644
--- a/db/docs/requirements_management_test_reports.yml
+++ b/db/docs/requirements_management_test_reports.yml
@@ -4,6 +4,6 @@ classes:
- RequirementsManagement::TestReport
feature_categories:
- requirements_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
-milestone: '13.1'
+description: Information related to Test Reports, which relate historical test outcomes to Requirements
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31643
+milestone: '13.0'
diff --git a/db/docs/resource_iteration_events.yml b/db/docs/resource_iteration_events.yml
index 96be1471854..8e61c68a6f6 100644
--- a/db/docs/resource_iteration_events.yml
+++ b/db/docs/resource_iteration_events.yml
@@ -4,6 +4,6 @@ classes:
- ResourceIterationEvent
feature_categories:
- planning_analytics
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Records the addition and removal of issues to iterations
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37617
milestone: '13.3'
diff --git a/db/docs/resource_label_events.yml b/db/docs/resource_label_events.yml
index 08b3fc0b184..b770b642452 100644
--- a/db/docs/resource_label_events.yml
+++ b/db/docs/resource_label_events.yml
@@ -4,6 +4,6 @@ classes:
- ResourceLabelEvent
feature_categories:
- planning_analytics
-description: TODO
+description: Records the addition and removal of labels from resources that can be labelled; such as issues, MRs and epics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6697
milestone: '11.2'
diff --git a/db/docs/resource_milestone_events.yml b/db/docs/resource_milestone_events.yml
index 5a6dfdb3d61..8792bb269b6 100644
--- a/db/docs/resource_milestone_events.yml
+++ b/db/docs/resource_milestone_events.yml
@@ -3,7 +3,7 @@ table_name: resource_milestone_events
classes:
- ResourceMilestoneEvent
feature_categories:
-- team_planning
-description: TODO
+- planning_analytics
+description: Records the addition and removal of issues to milestones
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23965
milestone: '12.8'
diff --git a/db/docs/resource_state_events.yml b/db/docs/resource_state_events.yml
index c5bd88c7927..12887a5a6c4 100644
--- a/db/docs/resource_state_events.yml
+++ b/db/docs/resource_state_events.yml
@@ -3,7 +3,7 @@ table_name: resource_state_events
classes:
- ResourceStateEvent
feature_categories:
-- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- planning_analytics
+description: Records the change of state of issues between opened and closed
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28926
milestone: '13.0'
diff --git a/db/docs/resource_weight_events.yml b/db/docs/resource_weight_events.yml
index bc2d34d382c..3f17b312fea 100644
--- a/db/docs/resource_weight_events.yml
+++ b/db/docs/resource_weight_events.yml
@@ -3,7 +3,7 @@ table_name: resource_weight_events
classes:
- ResourceWeightEvent
feature_categories:
-- team_planning
-description: TODO
+- planning_analytics
+description: Records the change of weight on issues along with timestamps
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21515
milestone: '12.7'
diff --git a/db/docs/reviews.yml b/db/docs/reviews.yml
index 299574bbe23..5a9f4c03bfb 100644
--- a/db/docs/reviews.yml
+++ b/db/docs/reviews.yml
@@ -3,7 +3,7 @@ table_name: reviews
classes:
- Review
feature_categories:
-- review_apps
+- code_review
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8442
milestone: '11.6'
diff --git a/db/docs/routes.yml b/db/docs/routes.yml
index 9b325694f03..9184309dabf 100644
--- a/db/docs/routes.yml
+++ b/db/docs/routes.yml
@@ -6,6 +6,7 @@ classes:
feature_categories:
- projects
- subgroups
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/83232be0e14cc8b35bf74532203a6e4371c15e70
+- users
+description: Stores routes per namespaces and projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/7121
milestone: '9.0'
diff --git a/db/docs/saved_replies.yml b/db/docs/saved_replies.yml
index e4f24d2b6c9..bc667bddf4b 100644
--- a/db/docs/saved_replies.yml
+++ b/db/docs/saved_replies.yml
@@ -3,7 +3,7 @@ table_name: saved_replies
classes:
- Users::SavedReply
feature_categories:
-- users
-description: TODO
+- team_planning
+description: Text templates used to populate comments using a quick action
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80807
milestone: '14.9'
diff --git a/db/docs/schema_migrations.yml b/db/docs/schema_migrations.yml
index f09cdb7bb53..a8df9b8a767 100644
--- a/db/docs/schema_migrations.yml
+++ b/db/docs/schema_migrations.yml
@@ -5,6 +5,7 @@ classes:
- Geo::TrackingBase::SchemaMigration
feature_categories:
- database
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
-milestone: '13.0'
+description: >-
+ An internal table used by ActiveRecord to keep track of which migrations have been applied to the database.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9ba1224867665844b117fa037e1465bb706b3685
+milestone: '0.8'
diff --git a/db/docs/security_findings.yml b/db/docs/security_findings.yml
index 57a5d18c288..b4607d56dca 100644
--- a/db/docs/security_findings.yml
+++ b/db/docs/security_findings.yml
@@ -4,6 +4,6 @@ classes:
- Security::Finding
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores a subset of the Finding data which is used to optimize the pipeline security tab
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/40368
milestone: '13.4'
diff --git a/db/docs/security_orchestration_policy_configurations.yml b/db/docs/security_orchestration_policy_configurations.yml
index 0505aad2317..0f91d180dc3 100644
--- a/db/docs/security_orchestration_policy_configurations.yml
+++ b/db/docs/security_orchestration_policy_configurations.yml
@@ -4,6 +4,8 @@ classes:
- Security::OrchestrationPolicyConfiguration
feature_categories:
- security_orchestration
-description: TODO
+description: |
+ Relates a Project/Namespace and Security Orchestration Policy Project, where Security
+ Policies are stored in the repository as a YAML file.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/53743
milestone: '13.9'
diff --git a/db/docs/security_orchestration_policy_rule_schedules.yml b/db/docs/security_orchestration_policy_rule_schedules.yml
index a4fea57adaf..160e8657f7c 100644
--- a/db/docs/security_orchestration_policy_rule_schedules.yml
+++ b/db/docs/security_orchestration_policy_rule_schedules.yml
@@ -4,6 +4,7 @@ classes:
- Security::OrchestrationPolicyRuleSchedule
feature_categories:
- security_orchestration
-description: TODO
+description: |
+ Security policies scheduled to run based on cadence defined in the policy
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59842
milestone: '13.12'
diff --git a/db/docs/security_scans.yml b/db/docs/security_scans.yml
index e50afd83472..fc6732bc80f 100644
--- a/db/docs/security_scans.yml
+++ b/db/docs/security_scans.yml
@@ -4,6 +4,6 @@ classes:
- Security::Scan
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about the security scans that are a part of Ci::Build
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23669
milestone: '12.8'
diff --git a/db/docs/security_training_providers.yml b/db/docs/security_training_providers.yml
index ba805a13e47..b8c6bc7e01f 100644
--- a/db/docs/security_training_providers.yml
+++ b/db/docs/security_training_providers.yml
@@ -4,6 +4,6 @@ classes:
- Security::TrainingProvider
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about the available security training providers
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78195
milestone: '14.7'
diff --git a/db/docs/security_trainings.yml b/db/docs/security_trainings.yml
index 310963541f0..2e84f8a5f65 100644
--- a/db/docs/security_trainings.yml
+++ b/db/docs/security_trainings.yml
@@ -4,6 +4,6 @@ classes:
- Security::Training
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about the primary security training provider for a given project
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78195
milestone: '14.7'
diff --git a/db/docs/sent_notifications.yml b/db/docs/sent_notifications.yml
index db42e03c7cc..9bc7158b067 100644
--- a/db/docs/sent_notifications.yml
+++ b/db/docs/sent_notifications.yml
@@ -3,7 +3,7 @@ table_name: sent_notifications
classes:
- SentNotification
feature_categories:
-- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f76eac56b9d7d4ae61010cddcca68682824b2239
+- team_planning
+description: Information related to sent email notifications that supports reply-by-email functionality
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/1173
milestone: '8.0'
diff --git a/db/docs/sentry_issues.yml b/db/docs/sentry_issues.yml
index 898d4ddbae1..af96751fc7d 100644
--- a/db/docs/sentry_issues.yml
+++ b/db/docs/sentry_issues.yml
@@ -4,6 +4,6 @@ classes:
- SentryIssue
feature_categories:
- error_tracking
-description: TODO
+description: Persists issue data for the Error Tracking's Sentry backend
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20629
milestone: '12.6'
diff --git a/db/docs/service_desk_settings.yml b/db/docs/service_desk_settings.yml
index a346b98b8ec..1e924ecd01b 100644
--- a/db/docs/service_desk_settings.yml
+++ b/db/docs/service_desk_settings.yml
@@ -4,6 +4,6 @@ classes:
- ServiceDeskSetting
feature_categories:
- service_desk
-description: TODO
+description: Settings related to Service Desk such as templates to use for email notifications
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19515
milestone: '12.6'
diff --git a/db/docs/slack_integrations.yml b/db/docs/slack_integrations.yml
index 0c4b0ea97a5..031bd77ada6 100644
--- a/db/docs/slack_integrations.yml
+++ b/db/docs/slack_integrations.yml
@@ -4,6 +4,6 @@ classes:
- SlackIntegration
feature_categories:
- integrations
-description: TODO
+description: Data related to the Slack application integration.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/f50ef96b87d8c785662e82843c22a2ef6093132e
milestone: '9.4'
diff --git a/db/docs/snippet_repositories.yml b/db/docs/snippet_repositories.yml
index c8bffcd9f7a..52a6b96c42c 100644
--- a/db/docs/snippet_repositories.yml
+++ b/db/docs/snippet_repositories.yml
@@ -4,6 +4,6 @@ classes:
- SnippetRepository
feature_categories:
- snippets
-description: TODO
+description: Stores repository information used to version control snippets.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23796
milestone: '12.8'
diff --git a/db/docs/snippet_statistics.yml b/db/docs/snippet_statistics.yml
index 4e9de04a918..390d096d1d3 100644
--- a/db/docs/snippet_statistics.yml
+++ b/db/docs/snippet_statistics.yml
@@ -4,6 +4,6 @@ classes:
- SnippetStatistics
feature_categories:
- snippets
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores the repository size, commit count, and file count regarding the snippet repository.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35026
milestone: '13.2'
diff --git a/db/docs/snippet_user_mentions.yml b/db/docs/snippet_user_mentions.yml
index 726b10aa62e..aee265b202a 100644
--- a/db/docs/snippet_user_mentions.yml
+++ b/db/docs/snippet_user_mentions.yml
@@ -4,6 +4,6 @@ classes:
- SnippetUserMention
feature_categories:
- snippets
-description: TODO
+description: For storing mentioned users, groups, projects referenced in a snippet description.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19009
milestone: '12.6'
diff --git a/db/docs/snippets.yml b/db/docs/snippets.yml
index b370e9c3bd6..1d8f7ca6b15 100644
--- a/db/docs/snippets.yml
+++ b/db/docs/snippets.yml
@@ -6,6 +6,6 @@ classes:
- Snippet
feature_categories:
- snippets
-description: TODO
+description: GitLab snippets allow you to store and share bits of code and text with other users.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9265de3d25715aeafd38a4ef41596dca058dc18c
-milestone: "<6.0"
+milestone: "1.0.1"
diff --git a/db/docs/software_license_policies.yml b/db/docs/software_license_policies.yml
index 7da6a69651c..478c68d8c59 100644
--- a/db/docs/software_license_policies.yml
+++ b/db/docs/software_license_policies.yml
@@ -4,6 +4,6 @@ classes:
- SoftwareLicensePolicy
feature_categories:
- license_compliance
-description: TODO
+description: Allows user to approve or deny the use certain software licenses in their project.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6246
milestone: '11.2'
diff --git a/db/docs/software_licenses.yml b/db/docs/software_licenses.yml
index 26780aa5ef9..48e78c8ca02 100644
--- a/db/docs/software_licenses.yml
+++ b/db/docs/software_licenses.yml
@@ -4,6 +4,6 @@ classes:
- SoftwareLicense
feature_categories:
- license_compliance
-description: TODO
+description: Normalized software licenses to use in conjunction with License Compliance features (like software license policies)
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6246
milestone: '11.2'
diff --git a/db/docs/sprints.yml b/db/docs/sprints.yml
index f330c47484f..7193c225dae 100644
--- a/db/docs/sprints.yml
+++ b/db/docs/sprints.yml
@@ -4,6 +4,6 @@ classes:
- Iteration
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Also called iterations, timeboxes to which issues can be assigned. Used to plan and track work.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30125
milestone: '13.0'
diff --git a/db/docs/status_page_published_incidents.yml b/db/docs/status_page_published_incidents.yml
index 79d46ba2ad4..4a21ed156f2 100644
--- a/db/docs/status_page_published_incidents.yml
+++ b/db/docs/status_page_published_incidents.yml
@@ -4,6 +4,6 @@ classes:
- StatusPage::PublishedIncident
feature_categories:
- incident_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Corresponds to an issue which has been published to the Status Page
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29994
milestone: '13.0'
diff --git a/db/docs/status_page_settings.yml b/db/docs/status_page_settings.yml
index b4022bdb678..a5cefe70300 100644
--- a/db/docs/status_page_settings.yml
+++ b/db/docs/status_page_settings.yml
@@ -4,6 +4,6 @@ classes:
- StatusPage::ProjectSetting
feature_categories:
- incident_management
-description: TODO
+description: Project settings related to Status Page
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25863
milestone: '12.9'
diff --git a/db/docs/suggestions.yml b/db/docs/suggestions.yml
index 2ecaddb2704..837fb58af04 100644
--- a/db/docs/suggestions.yml
+++ b/db/docs/suggestions.yml
@@ -4,6 +4,6 @@ classes:
- Suggestion
feature_categories:
- code_review
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/23d6fbf1c016aba0374b9675f621d97f52d1abb9
+description: Storing code suggestions within notes
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/8656
milestone: '11.6'
diff --git a/db/docs/system_note_metadata.yml b/db/docs/system_note_metadata.yml
index 305b4501b60..40b193a4b91 100644
--- a/db/docs/system_note_metadata.yml
+++ b/db/docs/system_note_metadata.yml
@@ -3,7 +3,7 @@ table_name: system_note_metadata
classes:
- SystemNoteMetadata
feature_categories:
-- importers
-description: TODO
+- team_planning
+description: Used to store notes metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/1c3c7fb25d972fc19d5b4bb371cb21094d81e478
milestone: '9.1'
diff --git a/db/docs/taggings.yml b/db/docs/taggings.yml
index a13108e705a..71078ab9c19 100644
--- a/db/docs/taggings.yml
+++ b/db/docs/taggings.yml
@@ -3,7 +3,8 @@ table_name: taggings
classes:
- ActsAsTaggableOn::Tagging
feature_categories:
+- continuous_integration
- runner
-description: TODO
+description: Taggings applied to arbitrary models based on entries in the 'tags' table
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b946da44695c9c8fe8867bb87bcdf801c52177d3
-milestone: "<6.0"
+milestone: "1.2"
diff --git a/db/docs/tags.yml b/db/docs/tags.yml
index 2d4820d6095..9ae2a4361ff 100644
--- a/db/docs/tags.yml
+++ b/db/docs/tags.yml
@@ -3,7 +3,8 @@ table_name: tags
classes:
- ActsAsTaggableOn::Tag
feature_categories:
+- continuous_integration
- runner
-description: TODO
+description: Tags applied to arbitrary models through the 'taggings' table
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/b946da44695c9c8fe8867bb87bcdf801c52177d3
milestone: "<6.0"
diff --git a/db/docs/terraform_state_versions.yml b/db/docs/terraform_state_versions.yml
index 8c1110caa95..a812d2a209e 100644
--- a/db/docs/terraform_state_versions.yml
+++ b/db/docs/terraform_state_versions.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- infrastructure_as_code
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35211
milestone: '13.4'
diff --git a/db/docs/terraform_states.yml b/db/docs/terraform_states.yml
index 90be304d898..78a277cafd6 100644
--- a/db/docs/terraform_states.yml
+++ b/db/docs/terraform_states.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- infrastructure_as_code
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26619
milestone: '13.0'
diff --git a/db/docs/timelogs.yml b/db/docs/timelogs.yml
index ab01a1f1f6a..0aebf8ec5db 100644
--- a/db/docs/timelogs.yml
+++ b/db/docs/timelogs.yml
@@ -4,6 +4,6 @@ classes:
- Timelog
feature_categories:
- team_planning
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/bf13fa054a67d5245ee83555e730d7ee6ab7264c
+description: Time spend data recorded by users on issues
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/870
milestone: '8.14'
diff --git a/db/docs/todos.yml b/db/docs/todos.yml
index 1f4db172e2b..1a146e29d2f 100644
--- a/db/docs/todos.yml
+++ b/db/docs/todos.yml
@@ -4,6 +4,6 @@ classes:
- Todo
feature_categories:
- team_planning
-description: TODO
+description: An action required or notification of action taken for a user on a target object, generated by various actions within the GitLab application
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3d52e139b13ad077286f2f9f46b7e98f43ad9564
milestone: '8.5'
diff --git a/db/docs/topics.yml b/db/docs/topics.yml
index d093c263386..25a448e3361 100644
--- a/db/docs/topics.yml
+++ b/db/docs/topics.yml
@@ -4,6 +4,6 @@ classes:
- Projects::Topic
feature_categories:
- projects
-description: TODO
+description: Stores topics that can be assigned to projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67574
milestone: '14.3'
diff --git a/db/docs/upcoming_reconciliations.yml b/db/docs/upcoming_reconciliations.yml
index 4d8e505c888..722fa2aee70 100644
--- a/db/docs/upcoming_reconciliations.yml
+++ b/db/docs/upcoming_reconciliations.yml
@@ -4,6 +4,6 @@ classes:
- GitlabSubscriptions::UpcomingReconciliation
feature_categories:
- purchase
-description: TODO
+description: Stores the data needed to notify a user of an upcoming reconciliation
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63054
milestone: '14.0'
diff --git a/db/docs/upload_states.yml b/db/docs/upload_states.yml
index b1ee7e17e2e..29df41c07dd 100644
--- a/db/docs/upload_states.yml
+++ b/db/docs/upload_states.yml
@@ -4,6 +4,6 @@ classes:
- Geo::UploadState
feature_categories:
- geo_replication
-description: TODO
+description: Separate table for uploads containing Geo verification metadata.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65921
milestone: '14.6'
diff --git a/db/docs/user_agent_details.yml b/db/docs/user_agent_details.yml
index ae49ded4348..53292bf93f1 100644
--- a/db/docs/user_agent_details.yml
+++ b/db/docs/user_agent_details.yml
@@ -3,7 +3,7 @@ table_name: user_agent_details
classes:
- UserAgentDetail
feature_categories:
-- snippets
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/95419679f23f0628d1885dd9656cc159e9d55ea9
+- instance_resiliency
+description: Stores user agent details for submission to Akismet spam detection.
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/5538
milestone: '8.11'
diff --git a/db/docs/user_callouts.yml b/db/docs/user_callouts.yml
index fe6243636d9..63ee837eb2c 100644
--- a/db/docs/user_callouts.yml
+++ b/db/docs/user_callouts.yml
@@ -3,7 +3,7 @@ table_name: user_callouts
classes:
- Users::Callout
feature_categories:
-- users
+- navigation
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/648826721f13ee4309a11638e538d96006648b39
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/16735
milestone: '10.5'
diff --git a/db/docs/user_canonical_emails.yml b/db/docs/user_canonical_emails.yml
index 8bf0e485030..4d9c3ba4797 100644
--- a/db/docs/user_canonical_emails.yml
+++ b/db/docs/user_canonical_emails.yml
@@ -3,7 +3,7 @@ table_name: user_canonical_emails
classes:
- UserCanonicalEmail
feature_categories:
-- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+- authentication_and_authorization
+description: stores the canonical version of user's primary email address
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27722
milestone: '13.0'
diff --git a/db/docs/user_credit_card_validations.yml b/db/docs/user_credit_card_validations.yml
index 9a452721ca8..1ba8bf40460 100644
--- a/db/docs/user_credit_card_validations.yml
+++ b/db/docs/user_credit_card_validations.yml
@@ -3,7 +3,7 @@ table_name: user_credit_card_validations
classes:
- Users::CreditCardValidation
feature_categories:
-- users
-description: TODO
+- purchase
+description: Stores whether the user has completed a first time validation to run CI pipelines
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60626
milestone: '13.12'
diff --git a/db/docs/user_custom_attributes.yml b/db/docs/user_custom_attributes.yml
index 60359fb2c48..956450acb68 100644
--- a/db/docs/user_custom_attributes.yml
+++ b/db/docs/user_custom_attributes.yml
@@ -4,6 +4,6 @@ classes:
- UserCustomAttribute
feature_categories:
- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/e9eae3eb0dd25e4a34c9a4b6bcc7de312dde4489
+description: Storing custom attributes per user
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/13038
milestone: '10.1'
diff --git a/db/docs/user_details.yml b/db/docs/user_details.yml
index 5ced831f9ad..636074214b0 100644
--- a/db/docs/user_details.yml
+++ b/db/docs/user_details.yml
@@ -4,6 +4,6 @@ classes:
- UserDetail
feature_categories:
- users
-description: TODO
+description: Stores user details
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25483
milestone: '12.9'
diff --git a/db/docs/user_follow_users.yml b/db/docs/user_follow_users.yml
index 08756637c10..56243b97546 100644
--- a/db/docs/user_follow_users.yml
+++ b/db/docs/user_follow_users.yml
@@ -4,6 +4,6 @@ classes:
- Users::UserFollowUser
feature_categories:
- users
-description: TODO
+description: Stores which users follow each other
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45451
milestone: '13.9'
diff --git a/db/docs/user_group_callouts.yml b/db/docs/user_group_callouts.yml
index 0ed79640cb1..910752339ed 100644
--- a/db/docs/user_group_callouts.yml
+++ b/db/docs/user_group_callouts.yml
@@ -3,7 +3,7 @@ table_name: user_group_callouts
classes:
- Users::GroupCallout
feature_categories:
-- users
+- navigation
description: TODO
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68785
milestone: '14.3'
diff --git a/db/docs/user_interacted_projects.yml b/db/docs/user_interacted_projects.yml
index 3eb67f6c2f3..e62e863b0a9 100644
--- a/db/docs/user_interacted_projects.yml
+++ b/db/docs/user_interacted_projects.yml
@@ -3,7 +3,7 @@ table_name: user_interacted_projects
classes:
- UserInteractedProject
feature_categories:
-- product_analytics
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/43b74afd8656df8228c19d5e5e6aee9f87abc244
+- projects
+description: Tracks which projects a given user has actively interacted with
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17327
milestone: '10.6'
diff --git a/db/docs/user_preferences.yml b/db/docs/user_preferences.yml
index 0a0b447c0c2..b9afb679503 100644
--- a/db/docs/user_preferences.yml
+++ b/db/docs/user_preferences.yml
@@ -4,6 +4,6 @@ classes:
- UserPreference
feature_categories:
- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/132abd3d68a8d97e8245dfc8f87a297a2ff1f39d
+description: Stores users' preferences
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7816
milestone: '11.5'
diff --git a/db/docs/user_statuses.yml b/db/docs/user_statuses.yml
index cf4667c4189..94aaff70d85 100644
--- a/db/docs/user_statuses.yml
+++ b/db/docs/user_statuses.yml
@@ -4,6 +4,6 @@ classes:
- UserStatus
feature_categories:
- users
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/812bfb158b70b09cfd438379a4b9446aa85b52ec
+description: Stores users' statuses
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20614
milestone: '11.2'
diff --git a/db/docs/users_security_dashboard_projects.yml b/db/docs/users_security_dashboard_projects.yml
index a98399aa9c8..4c379e5739d 100644
--- a/db/docs/users_security_dashboard_projects.yml
+++ b/db/docs/users_security_dashboard_projects.yml
@@ -4,6 +4,6 @@ classes:
- UsersSecurityDashboardProject
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores projects which users select to appear in their Security Dashboard
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18708
milestone: '12.5'
diff --git a/db/docs/users_star_projects.yml b/db/docs/users_star_projects.yml
index a1da7dca644..0199a0e3433 100644
--- a/db/docs/users_star_projects.yml
+++ b/db/docs/users_star_projects.yml
@@ -4,6 +4,6 @@ classes:
- UsersStarProject
feature_categories:
- projects
-description: TODO
+description: Stores conection between users and project through staring action
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/714f7201d3362793d11f33793e5ef6dc83bdd2f0
-milestone: '7.2'
+milestone: '7.1'
diff --git a/db/docs/users_statistics.yml b/db/docs/users_statistics.yml
index 7ff35cd8726..f2c44cc456e 100644
--- a/db/docs/users_statistics.yml
+++ b/db/docs/users_statistics.yml
@@ -3,7 +3,7 @@ table_name: users_statistics
classes:
- UsersStatistics
feature_categories:
-- product_analytics
-description: TODO
+- utilization
+description: User statistics
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26261
milestone: '12.9'
diff --git a/db/docs/verification_codes.yml b/db/docs/verification_codes.yml
index 9e784ed00ee..24c4d0991f9 100644
--- a/db/docs/verification_codes.yml
+++ b/db/docs/verification_codes.yml
@@ -3,6 +3,6 @@ table_name: verification_codes
classes: []
feature_categories:
- jihu
-description: TODO
+description: Used by the JiHu edition for user verification
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71139
milestone: '14.4'
diff --git a/db/docs/vulnerabilities.yml b/db/docs/vulnerabilities.yml
index f2dad96bebc..72f080a075f 100644
--- a/db/docs/vulnerabilities.yml
+++ b/db/docs/vulnerabilities.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerability
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about vulnerabilites present in the project's source code
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16181
milestone: '12.4'
diff --git a/db/docs/vulnerability_exports.yml b/db/docs/vulnerability_exports.yml
index f9d392d3485..4254a4426d6 100644
--- a/db/docs/vulnerability_exports.yml
+++ b/db/docs/vulnerability_exports.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Export
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores metadata about exported Vulnerabilities CSV files
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27196
milestone: '13.0'
diff --git a/db/docs/vulnerability_external_issue_links.yml b/db/docs/vulnerability_external_issue_links.yml
index ff0b8f98414..2adf90e6838 100644
--- a/db/docs/vulnerability_external_issue_links.yml
+++ b/db/docs/vulnerability_external_issue_links.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::ExternalIssueLink
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about connections between external issue trackers and vulnerabilities
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/48465
milestone: '13.7'
diff --git a/db/docs/vulnerability_feedback.yml b/db/docs/vulnerability_feedback.yml
index 4d5ae868188..bcd8c3935e6 100644
--- a/db/docs/vulnerability_feedback.yml
+++ b/db/docs/vulnerability_feedback.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Feedback
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about the confirm, dismiss, or create issue to investigate actions taken on vulnerabilities
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/5452
milestone: '10.8'
diff --git a/db/docs/vulnerability_finding_evidences.yml b/db/docs/vulnerability_finding_evidences.yml
index a2b48caece6..0c7fc7c7fdd 100644
--- a/db/docs/vulnerability_finding_evidences.yml
+++ b/db/docs/vulnerability_finding_evidences.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Finding::Evidence
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores evidence used to identify presence of a vulnerability
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56790
milestone: '13.11'
diff --git a/db/docs/vulnerability_finding_links.yml b/db/docs/vulnerability_finding_links.yml
index 4f47e82e85f..c259778cb09 100644
--- a/db/docs/vulnerability_finding_links.yml
+++ b/db/docs/vulnerability_finding_links.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::FindingLink
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45502
+description: Stores URLs relevant to the vulnerability findings
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/46555
milestone: '13.6'
diff --git a/db/docs/vulnerability_finding_signatures.yml b/db/docs/vulnerability_finding_signatures.yml
index 963dd96dd2c..a9faf1e8a1b 100644
--- a/db/docs/vulnerability_finding_signatures.yml
+++ b/db/docs/vulnerability_finding_signatures.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::FindingSignature
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores signatures of vulnerability locations which are used to improve tracking
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/57840
milestone: '13.11'
diff --git a/db/docs/vulnerability_findings_remediations.yml b/db/docs/vulnerability_findings_remediations.yml
index 4a757073567..f59b2360f42 100644
--- a/db/docs/vulnerability_findings_remediations.yml
+++ b/db/docs/vulnerability_findings_remediations.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::FindingRemediation
feature_categories:
- vulnerability_management
-description: TODO
+description: Join table between Remediations and Findings
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47166
milestone: '13.7'
diff --git a/db/docs/vulnerability_flags.yml b/db/docs/vulnerability_flags.yml
index fa47f878029..5d26faf66e0 100644
--- a/db/docs/vulnerability_flags.yml
+++ b/db/docs/vulnerability_flags.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Flag
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores additional information for vulnerabilities, for example if a vulnerability is identified as a false positive
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65573
milestone: '14.1'
diff --git a/db/docs/vulnerability_historical_statistics.yml b/db/docs/vulnerability_historical_statistics.yml
index 47fec93a242..22622f2494d 100644
--- a/db/docs/vulnerability_historical_statistics.yml
+++ b/db/docs/vulnerability_historical_statistics.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::HistoricalStatistic
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores aggregate vulnerability statistics which are used in the Security Dashboard
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36955
milestone: '13.3'
diff --git a/db/docs/vulnerability_identifiers.yml b/db/docs/vulnerability_identifiers.yml
index eefdddfe7eb..9be03505671 100644
--- a/db/docs/vulnerability_identifiers.yml
+++ b/db/docs/vulnerability_identifiers.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Identifier
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores identifiers (like CVE or CWE) for vulnerabilities that have been found
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
milestone: '11.4'
diff --git a/db/docs/vulnerability_issue_links.yml b/db/docs/vulnerability_issue_links.yml
index d19e885dd86..8503af34831 100644
--- a/db/docs/vulnerability_issue_links.yml
+++ b/db/docs/vulnerability_issue_links.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::IssueLink
feature_categories:
- vulnerability_management
-description: TODO
+description: Join table between Vulnerabilities and Issues
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/19852
milestone: '12.5'
diff --git a/db/docs/vulnerability_occurrence_identifiers.yml b/db/docs/vulnerability_occurrence_identifiers.yml
index 5791b42846b..77b985e3e02 100644
--- a/db/docs/vulnerability_occurrence_identifiers.yml
+++ b/db/docs/vulnerability_occurrence_identifiers.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::FindingIdentifier
feature_categories:
- vulnerability_management
-description: TODO
+description: Join table between Findings and Identifiers
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
milestone: '11.4'
diff --git a/db/docs/vulnerability_occurrence_pipelines.yml b/db/docs/vulnerability_occurrence_pipelines.yml
index 5cbc490a2b8..5c798e7a2ac 100644
--- a/db/docs/vulnerability_occurrence_pipelines.yml
+++ b/db/docs/vulnerability_occurrence_pipelines.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::FindingPipeline
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3270e15c4de7f40b97ce25bdc3cc9c4282e2f573
+description: Join table between Findings and Pipelines
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7578
milestone: '11.5'
diff --git a/db/docs/vulnerability_occurrences.yml b/db/docs/vulnerability_occurrences.yml
index 001764c385e..919a0ae19e7 100644
--- a/db/docs/vulnerability_occurrences.yml
+++ b/db/docs/vulnerability_occurrences.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Finding
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about findings for a given vulnerability
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
milestone: '11.4'
diff --git a/db/docs/vulnerability_reads.yml b/db/docs/vulnerability_reads.yml
index 0d60920c694..29727da2e69 100644
--- a/db/docs/vulnerability_reads.yml
+++ b/db/docs/vulnerability_reads.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Read
feature_categories:
- vulnerability_management
-description: TODO
+description: Denormalized version of the vulnerabilites table used for faster reads
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/74733
milestone: '14.6'
diff --git a/db/docs/vulnerability_remediations.yml b/db/docs/vulnerability_remediations.yml
index 6dfd80ec6b4..3f4e93ba0d8 100644
--- a/db/docs/vulnerability_remediations.yml
+++ b/db/docs/vulnerability_remediations.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Remediation
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores remediation information, such as diffs, for a given vulnerability
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47166
milestone: '13.7'
diff --git a/db/docs/vulnerability_scanners.yml b/db/docs/vulnerability_scanners.yml
index 18d534619bf..2ea7a3763d6 100644
--- a/db/docs/vulnerability_scanners.yml
+++ b/db/docs/vulnerability_scanners.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Scanner
feature_categories:
- vulnerability_management
-description: TODO
+description: Stores information about the vulnerability scanners used by projects
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/6896
milestone: '11.4'
diff --git a/db/docs/vulnerability_statistics.yml b/db/docs/vulnerability_statistics.yml
index e32fdc907ff..c94145e24f1 100644
--- a/db/docs/vulnerability_statistics.yml
+++ b/db/docs/vulnerability_statistics.yml
@@ -4,6 +4,6 @@ classes:
- Vulnerabilities::Statistic
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores pre-calculated vulnerability statistics for projects
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34289
milestone: '13.2'
diff --git a/db/docs/vulnerability_user_mentions.yml b/db/docs/vulnerability_user_mentions.yml
index 594f7fa78f8..4e4a07e97ac 100644
--- a/db/docs/vulnerability_user_mentions.yml
+++ b/db/docs/vulnerability_user_mentions.yml
@@ -4,6 +4,6 @@ classes:
- VulnerabilityUserMention
feature_categories:
- vulnerability_management
-description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+description: Stores notes for a given vulnerability
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27515
milestone: '13.0'
diff --git a/db/docs/web_hook_logs.yml b/db/docs/web_hook_logs.yml
index eb47aa1dc9a..e7ed77112bb 100644
--- a/db/docs/web_hook_logs.yml
+++ b/db/docs/web_hook_logs.yml
@@ -4,6 +4,6 @@ classes:
- WebHookLog
feature_categories:
- integrations
-description: TODO
+description: Webhooks logs data.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/330789c23c777d8ca646eba7c25f39cb7342cdee
milestone: '9.3'
diff --git a/db/docs/web_hooks.yml b/db/docs/web_hooks.yml
index 8b0a2c8c002..3c43dd837b5 100644
--- a/db/docs/web_hooks.yml
+++ b/db/docs/web_hooks.yml
@@ -8,6 +8,6 @@ classes:
- WebHook
feature_categories:
- integrations
-description: TODO
+description: Webhooks data with the custom HTTP callbacks that a user defines.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/edab46e9fa5f568b1423c0021e81d30453d7dc1e
milestone: "<6.0"
diff --git a/db/docs/webauthn_registrations.yml b/db/docs/webauthn_registrations.yml
index 21659b88cb6..13c4c28e24b 100644
--- a/db/docs/webauthn_registrations.yml
+++ b/db/docs/webauthn_registrations.yml
@@ -5,5 +5,5 @@ classes:
feature_categories:
- authentication_and_authorization
description: TODO
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/9af97ee69a36de1dc4e73f4030d6316d3f0a82c5
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/35797
milestone: '13.2'
diff --git a/db/docs/wiki_page_meta.yml b/db/docs/wiki_page_meta.yml
index b5b28d1e8e0..bed636eed08 100644
--- a/db/docs/wiki_page_meta.yml
+++ b/db/docs/wiki_page_meta.yml
@@ -4,6 +4,6 @@ classes:
- WikiPage::Meta
feature_categories:
- wiki
-description: TODO
+description: Used to record the metadata for wiki pages when we create events.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26529
milestone: '13.0'
diff --git a/db/docs/wiki_page_slugs.yml b/db/docs/wiki_page_slugs.yml
index e0e29ea41ad..a6997322f73 100644
--- a/db/docs/wiki_page_slugs.yml
+++ b/db/docs/wiki_page_slugs.yml
@@ -4,6 +4,6 @@ classes:
- WikiPage::Slug
feature_categories:
- wiki
-description: TODO
+description: Stores wiki page slug metadata for when we create events.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/26529
milestone: '13.0'
diff --git a/db/docs/work_item_types.yml b/db/docs/work_item_types.yml
index 48fed8d6aba..afb694bca79 100644
--- a/db/docs/work_item_types.yml
+++ b/db/docs/work_item_types.yml
@@ -4,6 +4,6 @@ classes:
- WorkItems::Type
feature_categories:
- team_planning
-description: TODO
+description: The work item type related to an issue. Currently one of a predefined set but in future will support custom types.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55705
milestone: '14.2'
diff --git a/db/docs/zentao_tracker_data.yml b/db/docs/zentao_tracker_data.yml
index 8270759b5d6..c99aebd70e2 100644
--- a/db/docs/zentao_tracker_data.yml
+++ b/db/docs/zentao_tracker_data.yml
@@ -4,6 +4,6 @@ classes:
- Integrations::ZentaoTrackerData
feature_categories:
- integrations
-description: TODO
+description: Data related to the ZenTao integration.
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67938
milestone: '14.2'
diff --git a/db/docs/zoom_meetings.yml b/db/docs/zoom_meetings.yml
index 0c1a47eb6d0..620df953ad5 100644
--- a/db/docs/zoom_meetings.yml
+++ b/db/docs/zoom_meetings.yml
@@ -4,6 +4,6 @@ classes:
- ZoomMeeting
feature_categories:
- incident_management
-description: TODO
+description: Persists Zoom meetings, its associations and its metadata
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17890
milestone: '12.5'
diff --git a/db/fixtures/development/001_create_base_work_item_types.rb b/db/fixtures/development/001_create_base_work_item_types.rb
index 7a541ca20b0..8bd43fd9df6 100644
--- a/db/fixtures/development/001_create_base_work_item_types.rb
+++ b/db/fixtures/development/001_create_base_work_item_types.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
Gitlab::Seeder.quiet do
- Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.import
+ Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.upsert_types
end
diff --git a/db/fixtures/development/04_labels.rb b/db/fixtures/development/04_labels.rb
index aff8331a191..5f0d7f2d8be 100644
--- a/db/fixtures/development/04_labels.rb
+++ b/db/fixtures/development/04_labels.rb
@@ -12,7 +12,7 @@ class Gitlab::Seeder::GroupLabels
@label_per_group.times do
label_title = FFaker::Product.brand
Labels::CreateService
- .new(title: label_title, color: "##{Digest::MD5.hexdigest(label_title)[0..5]}")
+ .new(title: label_title, color: "#{::Gitlab::Color.color_for(label_title)}")
.execute(group: @group)
print '.'
end
@@ -29,7 +29,7 @@ class Gitlab::Seeder::ProjectLabels
@label_per_project.times do
label_title = FFaker::Vehicle.model
Labels::CreateService
- .new(title: label_title, color: "##{Digest::MD5.hexdigest(label_title)[0..5]}")
+ .new(title: label_title, color: "#{::Gitlab::Color.color_for(label_title)}")
.execute(project: @project)
print '.'
end
diff --git a/db/fixtures/development/33_triage_ops.rb b/db/fixtures/development/33_triage_ops.rb
index 1bb1f6c05d9..aaf92315125 100644
--- a/db/fixtures/development/33_triage_ops.rb
+++ b/db/fixtures/development/33_triage_ops.rb
@@ -30,6 +30,10 @@ class Gitlab::Seeder::TriageOps
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
@@ -83,6 +87,38 @@ class Gitlab::Seeder::TriageOps
puts "Hook with url '#{hook.url}' and token '#{hook.token}' for '#{group_path}' is present now."
end
+ def ensure_work_type_labels_for(group_path)
+ label_titles = [
+ 'bug::availability',
+ 'bug::mobile',
+ 'bug::performance',
+ 'bug::vulnerability',
+ 'feature::addition',
+ 'feature::consolidation',
+ 'feature::enhancement',
+ 'feature::removal',
+ 'maintenance::dependency',
+ 'maintenance::pipelines',
+ 'maintenance::refactor',
+ 'maintenance::test-gap',
+ 'maintenance::usability',
+ 'maintenance::workflow',
+ 'type::bug',
+ 'type::feature',
+ 'type::maintenance',
+ ]
+
+ group = Group.find_by_full_path(group_path)
+
+ label_titles.each do |label_title|
+ color = ::Gitlab::Color.color_for(label_title[/[^:]+/])
+
+ Labels::CreateService
+ .new(title: label_title, color: "#{color}")
+ .execute(group: group)
+ end
+ end
+
def ensure_group(full_path)
group = Group.find_by_full_path(full_path)
diff --git a/db/fixtures/development/34_uploads.rb b/db/fixtures/development/34_uploads.rb
new file mode 100644
index 00000000000..fc45c51e136
--- /dev/null
+++ b/db/fixtures/development/34_uploads.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+# This seeder seeds comments as well, because uploads are not relevant by
+# themselves
+Gitlab::Seeder.quiet do
+ upload_seed_total_limit = 50
+ upload_seed_individual_limit = upload_seed_total_limit / 10
+
+ Issue.limit(upload_seed_individual_limit).find_each do |issue|
+ project = issue.project
+
+ project.team.users.limit(upload_seed_individual_limit).each do |user|
+ file = CarrierWaveStringFile.new_file(
+ file_content: "seeded upload file in project #{project.full_path}, issue #{issue.iid}",
+ filename: 'seeded_upload.txt',
+ content_type: 'text/plain'
+ )
+
+ uploader = UploadService.new(project, file, FileUploader).execute
+
+ note_params = {
+ noteable_type: 'Issue',
+ noteable_id: issue.id,
+ note: "Seeded upload: #{uploader.to_h[:markdown]}",
+ }
+
+ Notes::CreateService.new(project, user, note_params).execute
+ print '.'
+ end
+ end
+
+ MergeRequest.limit(upload_seed_individual_limit).find_each do |mr|
+ project = mr.project
+
+ project.team.users.limit(upload_seed_individual_limit).each do |user|
+ file = CarrierWaveStringFile.new_file(
+ file_content: "seeded upload file in project #{project.full_path}, MR #{mr.iid}",
+ filename: 'seeded_upload.txt',
+ content_type: 'text/plain'
+ )
+
+ uploader = UploadService.new(project, file, FileUploader).execute
+
+ note_params = {
+ noteable_type: 'MergeRequest',
+ noteable_id: mr.id,
+ note: "Seeded upload: #{uploader.to_h[:markdown]}",
+ }
+
+ Notes::CreateService.new(project, user, note_params).execute
+ print '.'
+ end
+ end
+end
diff --git a/db/fixtures/production/003_create_base_work_item_types.rb b/db/fixtures/production/003_create_base_work_item_types.rb
index 7a541ca20b0..8bd43fd9df6 100644
--- a/db/fixtures/production/003_create_base_work_item_types.rb
+++ b/db/fixtures/production/003_create_base_work_item_types.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
Gitlab::Seeder.quiet do
- Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.import
+ Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.upsert_types
end
diff --git a/db/migrate/20220213100000_remove_integration_type_triggers.rb b/db/migrate/20220213100000_remove_integration_type_triggers.rb
new file mode 100644
index 00000000000..137e5648125
--- /dev/null
+++ b/db/migrate/20220213100000_remove_integration_type_triggers.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+class RemoveIntegrationTypeTriggers < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::SchemaHelpers
+
+ FUNCTION_NAME = 'integrations_set_type_new'
+ TRIGGER_ON_INSERT_NAME = 'trigger_type_new_on_insert'
+
+ def up
+ drop_trigger(:integrations, TRIGGER_ON_INSERT_NAME)
+ drop_function(FUNCTION_NAME)
+ end
+
+ def down
+ create_trigger_function(FUNCTION_NAME, replace: true) do
+ <<~SQL.squish
+ UPDATE integrations
+ SET type_new = COALESCE(NEW.type_new, regexp_replace(NEW.type, '\\A(.+)Service\\Z', 'Integrations::\\1'))
+ , type = COALESCE(NEW.type, regexp_replace(NEW.type_new, '\\AIntegrations::(.+)\\Z', '\\1Service'))
+ WHERE integrations.id = NEW.id;
+ RETURN NULL;
+ SQL
+ end
+
+ execute(<<~SQL)
+ CREATE TRIGGER #{TRIGGER_ON_INSERT_NAME}
+ AFTER INSERT ON integrations
+ FOR EACH ROW
+ EXECUTE FUNCTION #{FUNCTION_NAME}();
+ SQL
+ end
+end
diff --git a/db/migrate/20220324091224_add_enforce_auth_checks_on_uploads_to_project_settings.rb b/db/migrate/20220324091224_add_enforce_auth_checks_on_uploads_to_project_settings.rb
new file mode 100644
index 00000000000..2c86d1d346d
--- /dev/null
+++ b/db/migrate/20220324091224_add_enforce_auth_checks_on_uploads_to_project_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddEnforceAuthChecksOnUploadsToProjectSettings < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def change
+ add_column :project_settings, :enforce_auth_checks_on_uploads, :boolean, null: false, default: true
+ end
+end
diff --git a/db/migrate/20220331125725_add_title_to_topic.rb b/db/migrate/20220331125725_add_title_to_topic.rb
new file mode 100644
index 00000000000..0c6ccb6beb9
--- /dev/null
+++ b/db/migrate/20220331125725_add_title_to_topic.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddTitleToTopic < Gitlab::Database::Migration[1.0]
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220331130726_add_text_limit_to_topics_title.rb
+ def change
+ add_column :topics, :title, :text
+ end
+ # rubocop:enable Migration/AddLimitToTextColumns
+end
diff --git a/db/migrate/20220331130726_add_text_limit_to_topics_title.rb b/db/migrate/20220331130726_add_text_limit_to_topics_title.rb
new file mode 100644
index 00000000000..4a4b30edc0d
--- /dev/null
+++ b/db/migrate/20220331130726_add_text_limit_to_topics_title.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToTopicsTitle < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :topics, :title, 255
+ end
+
+ def down
+ remove_text_limit :topics, :title
+ end
+end
diff --git a/db/migrate/20220401071609_add_campaign_to_in_product_marketing_email.rb b/db/migrate/20220401071609_add_campaign_to_in_product_marketing_email.rb
new file mode 100644
index 00000000000..f8d027cfd2e
--- /dev/null
+++ b/db/migrate/20220401071609_add_campaign_to_in_product_marketing_email.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class AddCampaignToInProductMarketingEmail < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ TARGET_TABLE = :in_product_marketing_emails
+ UNIQUE_INDEX_NAME = :index_in_product_marketing_emails_on_user_campaign
+ CONSTRAINT_NAME = :in_product_marketing_emails_track_and_series_or_campaign
+ TRACK_AND_SERIES_NOT_NULL_CONSTRAINT = 'track IS NOT NULL AND series IS NOT NULL AND campaign IS NULL'
+ CAMPAIGN_NOT_NULL_CONSTRAINT = 'track IS NULL AND series IS NULL AND campaign IS NOT NULL'
+
+ def up
+ change_column_null TARGET_TABLE, :track, true
+ change_column_null TARGET_TABLE, :series, true
+
+ # rubocop:disable Migration/AddLimitToTextColumns
+ # limit is added in 20220420034519_add_text_limit_to_in_product_marketing_email_campaign.rb
+ add_column :in_product_marketing_emails, :campaign, :text, if_not_exists: true
+ # rubocop:enable Migration/AddLimitToTextColumns
+ add_concurrent_index TARGET_TABLE, [:user_id, :campaign], unique: true, name: UNIQUE_INDEX_NAME
+ add_check_constraint TARGET_TABLE,
+ "(#{TRACK_AND_SERIES_NOT_NULL_CONSTRAINT}) OR (#{CAMPAIGN_NOT_NULL_CONSTRAINT})",
+ CONSTRAINT_NAME
+ end
+
+ def down
+ remove_check_constraint TARGET_TABLE, CONSTRAINT_NAME
+ remove_concurrent_index TARGET_TABLE, [:user_id, :campaign], name: UNIQUE_INDEX_NAME
+ remove_column :in_product_marketing_emails, :campaign, if_exists: true
+
+ # Records that previously had a value for campaign column will have NULL
+ # values for track and series columns so we can't reverse
+ # change_column_null.
+ end
+end
diff --git a/db/migrate/20220401151123_add_last_repository_updated_at_to_project_repository_state.rb b/db/migrate/20220401151123_add_last_repository_updated_at_to_project_repository_state.rb
new file mode 100644
index 00000000000..d8ef5865576
--- /dev/null
+++ b/db/migrate/20220401151123_add_last_repository_updated_at_to_project_repository_state.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddLastRepositoryUpdatedAtToProjectRepositoryState < Gitlab::Database::Migration[1.0]
+ def change
+ add_column :project_repository_states, :last_repository_updated_at, :datetime_with_timezone
+ add_column :project_repository_states, :last_wiki_updated_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20220406133049_add_delayed_group_deletion_to_application_settings.rb b/db/migrate/20220406133049_add_delayed_group_deletion_to_application_settings.rb
new file mode 100644
index 00000000000..16ee7033021
--- /dev/null
+++ b/db/migrate/20220406133049_add_delayed_group_deletion_to_application_settings.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddDelayedGroupDeletionToApplicationSettings < Gitlab::Database::Migration[1.0]
+ def up
+ add_column :application_settings, :delayed_group_deletion, :boolean, default: true, null: false
+ end
+
+ def down
+ remove_column :application_settings, :delayed_group_deletion
+ end
+end
diff --git a/db/migrate/20220412060931_add_nullify_build_data_trigger_on_merge_request_metrics.rb b/db/migrate/20220412060931_add_nullify_build_data_trigger_on_merge_request_metrics.rb
new file mode 100644
index 00000000000..96ec44c16c5
--- /dev/null
+++ b/db/migrate/20220412060931_add_nullify_build_data_trigger_on_merge_request_metrics.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AddNullifyBuildDataTriggerOnMergeRequestMetrics < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::SchemaHelpers
+
+ TABLE_NAME = 'merge_request_metrics'
+ FUNCTION_NAME = 'nullify_merge_request_metrics_build_data'
+ TRIGGER_NAME = 'nullify_merge_request_metrics_build_data_on_update'
+
+ def up
+ create_trigger_function(FUNCTION_NAME) do
+ <<~SQL
+ IF (OLD.pipeline_id IS NOT NULL) AND (NEW.pipeline_id IS NULL) THEN
+ NEW.latest_build_started_at = NULL;
+ NEW.latest_build_finished_at = NULL;
+ END IF;
+ RETURN NEW;
+ SQL
+ end
+
+ create_trigger(TABLE_NAME, TRIGGER_NAME, FUNCTION_NAME, fires: 'BEFORE UPDATE')
+ end
+
+ def down
+ drop_trigger(TABLE_NAME, TRIGGER_NAME)
+ drop_function(FUNCTION_NAME)
+ end
+end
diff --git a/db/migrate/20220412135446_add_unique_fingerprint_sha256_index_to_key.rb b/db/migrate/20220412135446_add_unique_fingerprint_sha256_index_to_key.rb
new file mode 100644
index 00000000000..3f2ea80ef30
--- /dev/null
+++ b/db/migrate/20220412135446_add_unique_fingerprint_sha256_index_to_key.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddUniqueFingerprintSha256IndexToKey < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_keys_on_fingerprint_sha256'
+ NEW_INDEX_NAME = 'index_keys_on_fingerprint_sha256_unique'
+
+ def up
+ add_concurrent_index :keys, :fingerprint_sha256, unique: true, name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :keys, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :keys, :fingerprint_sha256, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :keys, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220412140446_add_unique_fingerprint_sha256_index_to_group_deploy_key.rb b/db/migrate/20220412140446_add_unique_fingerprint_sha256_index_to_group_deploy_key.rb
new file mode 100644
index 00000000000..db238394dd6
--- /dev/null
+++ b/db/migrate/20220412140446_add_unique_fingerprint_sha256_index_to_group_deploy_key.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddUniqueFingerprintSha256IndexToGroupDeployKey < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_group_deploy_keys_on_fingerprint_sha256'
+ NEW_INDEX_NAME = 'index_group_deploy_keys_on_fingerprint_sha256_unique'
+
+ def up
+ add_concurrent_index :group_deploy_keys, :fingerprint_sha256, unique: true, name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :group_deploy_keys, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :group_deploy_keys, :fingerprint_sha256, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :group_deploy_keys, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220412140755_drop_unique_fingerprint_md5_index_from_key.rb b/db/migrate/20220412140755_drop_unique_fingerprint_md5_index_from_key.rb
new file mode 100644
index 00000000000..09fb7de0798
--- /dev/null
+++ b/db/migrate/20220412140755_drop_unique_fingerprint_md5_index_from_key.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropUniqueFingerprintMd5IndexFromKey < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_keys_on_fingerprint'
+
+ def up
+ remove_concurrent_index_by_name :keys, INDEX_NAME
+ add_concurrent_index :keys, :fingerprint, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :keys, INDEX_NAME
+ add_concurrent_index :keys, :fingerprint, unique: true, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220412141020_drop_unique_fingerprint_md5_index_from_group_deploy_key.rb b/db/migrate/20220412141020_drop_unique_fingerprint_md5_index_from_group_deploy_key.rb
new file mode 100644
index 00000000000..51ae664ed4a
--- /dev/null
+++ b/db/migrate/20220412141020_drop_unique_fingerprint_md5_index_from_group_deploy_key.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DropUniqueFingerprintMd5IndexFromGroupDeployKey < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_group_deploy_keys_on_fingerprint'
+
+ def up
+ remove_concurrent_index_by_name :group_deploy_keys, INDEX_NAME
+ add_concurrent_index :group_deploy_keys, :fingerprint, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :group_deploy_keys, INDEX_NAME
+ add_concurrent_index :group_deploy_keys, :fingerprint, unique: true, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220413054910_backfill_delayed_group_deletion.rb b/db/migrate/20220413054910_backfill_delayed_group_deletion.rb
new file mode 100644
index 00000000000..420f200be02
--- /dev/null
+++ b/db/migrate/20220413054910_backfill_delayed_group_deletion.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class BackfillDelayedGroupDeletion < Gitlab::Database::Migration[1.0]
+ class ApplicationSetting < ActiveRecord::Base
+ self.table_name = 'application_settings'
+ end
+
+ def up
+ ApplicationSetting.reset_column_information
+
+ ApplicationSetting.find_each do |application_setting|
+ application_setting.update!(delayed_group_deletion: application_setting.deletion_adjourned_period > 0)
+ end
+ end
+
+ def down
+ ApplicationSetting.reset_column_information
+
+ ApplicationSetting.update_all(delayed_group_deletion: true)
+ end
+end
diff --git a/db/migrate/20220413124200_add_view_for_per_table_autovacuum_status.rb b/db/migrate/20220413124200_add_view_for_per_table_autovacuum_status.rb
new file mode 100644
index 00000000000..977a16d1b54
--- /dev/null
+++ b/db/migrate/20220413124200_add_view_for_per_table_autovacuum_status.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class AddViewForPerTableAutovacuumStatus < Gitlab::Database::Migration[1.0]
+ def up
+ execute <<~SQL
+ DROP VIEW IF EXISTS postgres_autovacuum_activity;
+ DROP FUNCTION IF EXISTS postgres_pg_stat_activity_autovacuum;
+
+ CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS SETOF pg_catalog.pg_stat_activity AS
+ $$
+ SELECT *
+ FROM pg_stat_activity
+ WHERE datname = current_database()
+ AND state = 'active'
+ AND backend_type = 'autovacuum worker'
+ $$
+ LANGUAGE sql
+ VOLATILE
+ SECURITY DEFINER
+ SET search_path = 'pg_catalog', 'pg_temp';
+
+ CREATE VIEW postgres_autovacuum_activity AS
+ WITH processes as
+ (
+ SELECT query, query_start, (regexp_matches(query, '^autovacuum: VACUUM (\w+)\.(\w+)')) as matches
+ FROM postgres_pg_stat_activity_autovacuum()
+ WHERE query ~* '^autovacuum: VACUUM \w+\.\w+'
+ )
+ SELECT matches[1] || '.' || matches[2] as table_identifier,
+ matches[1] as schema,
+ matches[2] as table,
+ query_start as vacuum_start
+ FROM processes;
+
+ COMMENT ON VIEW postgres_autovacuum_activity IS 'Contains information about PostgreSQL backends currently performing autovacuum operations on the tables indicated here.';
+ SQL
+ end
+
+ def down
+ execute <<~SQL
+ DROP VIEW IF EXISTS postgres_autovacuum_activity;
+ DROP FUNCTION IF EXISTS postgres_pg_stat_activity_autovacuum;
+ SQL
+ end
+end
diff --git a/db/migrate/20220413164146_remove_max_seats_used_indices.rb b/db/migrate/20220413164146_remove_max_seats_used_indices.rb
new file mode 100644
index 00000000000..d89ce6de4a4
--- /dev/null
+++ b/db/migrate/20220413164146_remove_max_seats_used_indices.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class RemoveMaxSeatsUsedIndices < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ MAX_SEATS_USED_INDEX = 'tmp_gitlab_subscriptions_max_seats_used_migration'
+ MAX_SEATS_USED_INDEX_2 = 'tmp_gitlab_subscriptions_max_seats_used_migration_2'
+
+ def up
+ remove_concurrent_index_by_name :gitlab_subscriptions, MAX_SEATS_USED_INDEX
+ remove_concurrent_index_by_name :gitlab_subscriptions, MAX_SEATS_USED_INDEX_2
+ end
+
+ def down
+ add_concurrent_index :gitlab_subscriptions, :id,
+ where: "start_date >= '2021-08-02' AND start_date <= '2021-11-20' AND max_seats_used != 0 " \
+ "AND max_seats_used > seats_in_use AND max_seats_used > seats",
+ name: MAX_SEATS_USED_INDEX
+ add_concurrent_index :gitlab_subscriptions, :id,
+ where: "start_date < '2021-08-02' AND max_seats_used != 0 AND max_seats_used > seats_in_use " \
+ "AND max_seats_used > seats",
+ name: MAX_SEATS_USED_INDEX_2
+ end
+end
diff --git a/db/migrate/20220413235818_add_max_seats_used_changed_at_to_gitlab_subscriptions.rb b/db/migrate/20220413235818_add_max_seats_used_changed_at_to_gitlab_subscriptions.rb
new file mode 100644
index 00000000000..34e3a59cfb7
--- /dev/null
+++ b/db/migrate/20220413235818_add_max_seats_used_changed_at_to_gitlab_subscriptions.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddMaxSeatsUsedChangedAtToGitlabSubscriptions < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :gitlab_subscriptions, :max_seats_used_changed_at, :datetime_with_timezone
+ end
+end
diff --git a/db/migrate/20220414203622_add_index_for_columns_user_custom_attribute.rb b/db/migrate/20220414203622_add_index_for_columns_user_custom_attribute.rb
new file mode 100644
index 00000000000..b461e656f1f
--- /dev/null
+++ b/db/migrate/20220414203622_add_index_for_columns_user_custom_attribute.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AddIndexForColumnsUserCustomAttribute < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+ INDEX_NAME = 'index_key_updated_at_on_user_custom_attribute'
+
+ def up
+ add_concurrent_index(:user_custom_attributes, [:key, :updated_at], name: INDEX_NAME)
+ end
+
+ def down
+ remove_concurrent_index_by_name(:user_custom_attributes, INDEX_NAME)
+ end
+end
diff --git a/db/migrate/20220415015143_replace_iterations_cadence_date_range_constraint.rb b/db/migrate/20220415015143_replace_iterations_cadence_date_range_constraint.rb
new file mode 100644
index 00000000000..9788fd4a32b
--- /dev/null
+++ b/db/migrate/20220415015143_replace_iterations_cadence_date_range_constraint.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class ReplaceIterationsCadenceDateRangeConstraint < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ execute <<~SQL
+ ALTER TABLE sprints
+ DROP CONSTRAINT IF EXISTS iteration_start_and_due_date_iterations_cadence_id_constraint;
+
+ ALTER TABLE sprints
+ ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint
+ EXCLUDE USING gist
+ ( iterations_cadence_id WITH =,
+ daterange(start_date, due_date, '[]') WITH &&
+ )
+ WHERE (group_id IS NOT NULL) DEFERRABLE INITIALLY DEFERRED;
+ SQL
+ end
+
+ def down
+ execute <<~SQL
+ ALTER TABLE sprints
+ DROP CONSTRAINT IF EXISTS iteration_start_and_due_date_iterations_cadence_id_constraint;
+
+ ALTER TABLE sprints
+ ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint
+ EXCLUDE USING gist
+ ( iterations_cadence_id WITH =,
+ daterange(start_date, due_date, '[]') WITH &&
+ )
+ WHERE (group_id IS NOT NULL);
+ SQL
+ end
+end
diff --git a/db/migrate/20220419223906_add_arkose_namespace_to_application_settings.rb b/db/migrate/20220419223906_add_arkose_namespace_to_application_settings.rb
new file mode 100644
index 00000000000..1fc655228db
--- /dev/null
+++ b/db/migrate/20220419223906_add_arkose_namespace_to_application_settings.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddArkoseNamespaceToApplicationSettings < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ ARKOSE_LABS_DEFAULT_NAMESPACE = 'client'
+
+ def up
+ unless column_exists?(:application_settings, :arkose_labs_namespace)
+ add_column :application_settings,
+ :arkose_labs_namespace,
+ :text,
+ default: ARKOSE_LABS_DEFAULT_NAMESPACE,
+ null: false
+ end
+
+ add_text_limit :application_settings, :arkose_labs_namespace, 255
+ end
+
+ def down
+ remove_column :application_settings, :arkose_labs_namespace
+ end
+end
diff --git a/db/migrate/20220420034519_add_text_limit_to_in_product_marketing_email_campaign.rb b/db/migrate/20220420034519_add_text_limit_to_in_product_marketing_email_campaign.rb
new file mode 100644
index 00000000000..c590111da21
--- /dev/null
+++ b/db/migrate/20220420034519_add_text_limit_to_in_product_marketing_email_campaign.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToInProductMarketingEmailCampaign < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :in_product_marketing_emails, :campaign, 255
+ end
+
+ def down
+ remove_text_limit :in_product_marketing_emails, :campaign
+ end
+end
diff --git a/db/migrate/20220420135245_fix_batched_background_migration_default_arguments.rb b/db/migrate/20220420135245_fix_batched_background_migration_default_arguments.rb
new file mode 100644
index 00000000000..42a0ee32ecb
--- /dev/null
+++ b/db/migrate/20220420135245_fix_batched_background_migration_default_arguments.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class FixBatchedBackgroundMigrationDefaultArguments < Gitlab::Database::Migration[1.0]
+ def change
+ change_column_default :batched_background_migrations, :job_arguments, from: '[]', to: []
+ end
+end
diff --git a/db/migrate/20220420173247_add_group_inheritance_type_to_pe_authorizable.rb b/db/migrate/20220420173247_add_group_inheritance_type_to_pe_authorizable.rb
new file mode 100644
index 00000000000..f1ddf48304e
--- /dev/null
+++ b/db/migrate/20220420173247_add_group_inheritance_type_to_pe_authorizable.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class AddGroupInheritanceTypeToPeAuthorizable < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :protected_environment_deploy_access_levels,
+ :group_inheritance_type,
+ :smallint,
+ default: 0, limit: 2, null: false
+ add_column :protected_environment_approval_rules,
+ :group_inheritance_type,
+ :smallint,
+ default: 0, limit: 2, null: false
+ end
+end
diff --git a/db/migrate/20220420192542_add_id_for_cleanup_index_packages_package_files.rb b/db/migrate/20220420192542_add_id_for_cleanup_index_packages_package_files.rb
new file mode 100644
index 00000000000..a5a0001ab69
--- /dev/null
+++ b/db/migrate/20220420192542_add_id_for_cleanup_index_packages_package_files.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddIdForCleanupIndexPackagesPackageFiles < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_packages_package_files_on_id_for_cleanup'
+
+ PACKAGE_FILE_STATUS_PENDING_DESTRUCTION = 1
+
+ def up
+ where = "status = #{PACKAGE_FILE_STATUS_PENDING_DESTRUCTION}"
+
+ add_concurrent_index :packages_package_files, :id, name: INDEX_NAME, where: where
+ end
+
+ def down
+ remove_concurrent_index_by_name :packages_package_files, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220421114418_make_fingerprint_nullable_for_group_deploy_key.rb b/db/migrate/20220421114418_make_fingerprint_nullable_for_group_deploy_key.rb
new file mode 100644
index 00000000000..587ebf1289d
--- /dev/null
+++ b/db/migrate/20220421114418_make_fingerprint_nullable_for_group_deploy_key.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class MakeFingerprintNullableForGroupDeployKey < Gitlab::Database::Migration[2.0]
+ def up
+ change_column_null :group_deploy_keys, :fingerprint, true
+ end
+
+ def down
+ # There may now be nulls in the table, so we cannot re-add the constraint here.
+ end
+end
diff --git a/db/migrate/20220421141342_add_allowed_plans_to_ci_runners.rb b/db/migrate/20220421141342_add_allowed_plans_to_ci_runners.rb
new file mode 100644
index 00000000000..46da684cfe2
--- /dev/null
+++ b/db/migrate/20220421141342_add_allowed_plans_to_ci_runners.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddAllowedPlansToCiRunners < Gitlab::Database::Migration[1.0]
+ def change
+ # rubocop:disable Migration/AddLimitToTextColumns
+ add_column :ci_runners, :allowed_plans, :text, array: true, null: false, default: []
+ # rubocop:enable Migration/AddLimitToTextColumns
+ end
+end
diff --git a/db/migrate/20220421144758_change_dotenv_plan_limits_for_old_plans.rb b/db/migrate/20220421144758_change_dotenv_plan_limits_for_old_plans.rb
new file mode 100644
index 00000000000..a4dede974e2
--- /dev/null
+++ b/db/migrate/20220421144758_change_dotenv_plan_limits_for_old_plans.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class ChangeDotenvPlanLimitsForOldPlans < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ create_or_update_plan_limit('dotenv_variables', 'early_adopter', 50)
+ create_or_update_plan_limit('dotenv_variables', 'bronze', 50)
+ create_or_update_plan_limit('dotenv_variables', 'silver', 100)
+ create_or_update_plan_limit('dotenv_variables', 'gold', 150)
+ end
+
+ def down
+ create_or_update_plan_limit('dotenv_variables', 'early_adopter', 20)
+ create_or_update_plan_limit('dotenv_variables', 'bronze', 20)
+ create_or_update_plan_limit('dotenv_variables', 'silver', 20)
+ create_or_update_plan_limit('dotenv_variables', 'gold', 20)
+ end
+end
diff --git a/db/migrate/20220421180321_add_last_cleanup_deleted_tags_count_to_container_repository.rb b/db/migrate/20220421180321_add_last_cleanup_deleted_tags_count_to_container_repository.rb
new file mode 100644
index 00000000000..141bc4b49e6
--- /dev/null
+++ b/db/migrate/20220421180321_add_last_cleanup_deleted_tags_count_to_container_repository.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddLastCleanupDeletedTagsCountToContainerRepository < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :container_repositories, :last_cleanup_deleted_tags_count, :integer
+ end
+end
diff --git a/db/migrate/20220422200633_fix_view_for_per_table_autovacuum_status.rb b/db/migrate/20220422200633_fix_view_for_per_table_autovacuum_status.rb
new file mode 100644
index 00000000000..0af56d32674
--- /dev/null
+++ b/db/migrate/20220422200633_fix_view_for_per_table_autovacuum_status.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+class FixViewForPerTableAutovacuumStatus < Gitlab::Database::Migration[2.0]
+ def up
+ execute <<~SQL
+ DROP VIEW IF EXISTS postgres_autovacuum_activity;
+ DROP FUNCTION IF EXISTS postgres_pg_stat_activity_autovacuum;
+
+ CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS TABLE(query text, query_start timestamptz) AS
+ $$
+ SELECT query, query_start
+ FROM pg_stat_activity
+ WHERE datname = current_database()
+ AND state = 'active'
+ AND backend_type = 'autovacuum worker'
+ $$
+ LANGUAGE sql
+ VOLATILE
+ SECURITY DEFINER
+ SET search_path = 'pg_catalog', 'pg_temp';
+
+ CREATE VIEW postgres_autovacuum_activity AS
+ WITH processes as
+ (
+ SELECT query, query_start, (regexp_matches(query, '^autovacuum: VACUUM (\w+)\.(\w+)')) as matches
+ FROM postgres_pg_stat_activity_autovacuum()
+ WHERE query ~* '^autovacuum: VACUUM \w+\.\w+'
+ )
+ SELECT matches[1] || '.' || matches[2] as table_identifier,
+ matches[1] as schema,
+ matches[2] as table,
+ query_start as vacuum_start
+ FROM processes;
+
+ COMMENT ON VIEW postgres_autovacuum_activity IS 'Contains information about PostgreSQL backends currently performing autovacuum operations on the tables indicated here.';
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ DROP VIEW IF EXISTS postgres_autovacuum_activity;
+ DROP FUNCTION IF EXISTS postgres_pg_stat_activity_autovacuum;
+
+ CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS SETOF pg_catalog.pg_stat_activity AS
+ $$
+ SELECT *
+ FROM pg_stat_activity
+ WHERE datname = current_database()
+ AND state = 'active'
+ AND backend_type = 'autovacuum worker'
+ $$
+ LANGUAGE sql
+ VOLATILE
+ SECURITY DEFINER
+ SET search_path = 'pg_catalog', 'pg_temp';
+
+ CREATE VIEW postgres_autovacuum_activity AS
+ WITH processes as
+ (
+ SELECT query, query_start, (regexp_matches(query, '^autovacuum: VACUUM (\w+)\.(\w+)')) as matches
+ FROM postgres_pg_stat_activity_autovacuum()
+ WHERE query ~* '^autovacuum: VACUUM \w+\.\w+'
+ )
+ SELECT matches[1] || '.' || matches[2] as table_identifier,
+ matches[1] as schema,
+ matches[2] as table,
+ query_start as vacuum_start
+ FROM processes;
+
+ COMMENT ON VIEW postgres_autovacuum_activity IS 'Contains information about PostgreSQL backends currently performing autovacuum operations on the tables indicated here.';
+ SQL
+ end
+end
diff --git a/db/migrate/20220422220507_remove_tmp_index_supporting_leaky_regex_cleanup.rb b/db/migrate/20220422220507_remove_tmp_index_supporting_leaky_regex_cleanup.rb
new file mode 100644
index 00000000000..15a3c4d579e
--- /dev/null
+++ b/db/migrate/20220422220507_remove_tmp_index_supporting_leaky_regex_cleanup.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class RemoveTmpIndexSupportingLeakyRegexCleanup < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = "tmp_index_merge_requests_draft_and_status_leaky_regex"
+ LEAKY_REGEXP_STR = "^\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP"
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :merge_requests, INDEX_NAME
+ end
+
+ def down
+ where_clause = <<~SQL
+ draft = true AND
+ state_id = 1 AND
+ ((title)::text ~* '#{LEAKY_REGEXP_STR}'::text) AND ((title)::text !~* '#{CORRECTED_REGEXP_STR}'::text)
+ SQL
+
+ add_concurrent_index :merge_requests, :id,
+ where: where_clause,
+ name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220425120604_create_packages_cleanup_policies.rb b/db/migrate/20220425120604_create_packages_cleanup_policies.rb
new file mode 100644
index 00000000000..0b04457235e
--- /dev/null
+++ b/db/migrate/20220425120604_create_packages_cleanup_policies.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class CreatePackagesCleanupPolicies < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ create_table :packages_cleanup_policies, id: false do |t|
+ t.timestamps_with_timezone null: false
+ t.references :project,
+ primary_key: true,
+ default: nil,
+ index: false,
+ foreign_key: { to_table: :projects, on_delete: :cascade }
+ t.datetime_with_timezone :next_run_at, null: true
+ t.text :keep_n_duplicated_package_files, default: 'all', null: false, limit: 255
+ end
+ end
+
+ def down
+ drop_table :packages_cleanup_policies
+ end
+end
diff --git a/db/migrate/20220426130217_add_max_export_size_to_application_settings.rb b/db/migrate/20220426130217_add_max_export_size_to_application_settings.rb
new file mode 100644
index 00000000000..d1488a77d14
--- /dev/null
+++ b/db/migrate/20220426130217_add_max_export_size_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddMaxExportSizeToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :max_export_size, :integer, default: 0
+ end
+end
diff --git a/db/migrate/20220502125053_recreate_index_for_project_group_link_with_group_id_and_project_id.rb b/db/migrate/20220502125053_recreate_index_for_project_group_link_with_group_id_and_project_id.rb
new file mode 100644
index 00000000000..1d9a18b7b23
--- /dev/null
+++ b/db/migrate/20220502125053_recreate_index_for_project_group_link_with_group_id_and_project_id.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RecreateIndexForProjectGroupLinkWithGroupIdAndProjectId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_project_group_links_on_group_id'
+ NEW_INDEX_NAME = 'index_project_group_links_on_group_id_and_project_id'
+
+ def up
+ add_concurrent_index :project_group_links, [:group_id, :project_id], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :project_group_links, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :project_group_links, [:group_id], name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :project_group_links, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220502150408_add_slack_integrations_bot_columns.rb b/db/migrate/20220502150408_add_slack_integrations_bot_columns.rb
new file mode 100644
index 00000000000..cb5b201e71e
--- /dev/null
+++ b/db/migrate/20220502150408_add_slack_integrations_bot_columns.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class AddSlackIntegrationsBotColumns < Gitlab::Database::Migration[2.0]
+ def change
+ change_table :slack_integrations do |t|
+ t.column :bot_user_id, :text
+ t.column :encrypted_bot_access_token, :binary
+ t.column :encrypted_bot_access_token_iv, :binary
+ end
+ end
+end
diff --git a/db/migrate/20220502152633_add_slack_integrations_bot_user_id_text_limit.rb b/db/migrate/20220502152633_add_slack_integrations_bot_user_id_text_limit.rb
new file mode 100644
index 00000000000..649d6ccf9d4
--- /dev/null
+++ b/db/migrate/20220502152633_add_slack_integrations_bot_user_id_text_limit.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddSlackIntegrationsBotUserIdTextLimit < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :slack_integrations, :bot_user_id, 255
+ end
+
+ def down
+ remove_text_limit :slack_integrations, :bot_user_id
+ end
+end
diff --git a/db/migrate/20220503073401_recreate_index_for_group_group_link_with_both_group_ids.rb b/db/migrate/20220503073401_recreate_index_for_group_group_link_with_both_group_ids.rb
new file mode 100644
index 00000000000..214e9c5e0a7
--- /dev/null
+++ b/db/migrate/20220503073401_recreate_index_for_group_group_link_with_both_group_ids.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class RecreateIndexForGroupGroupLinkWithBothGroupIds < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_group_group_links_on_shared_with_group_id'
+ NEW_INDEX_NAME = 'index_group_group_links_on_shared_with_group_and_shared_group'
+
+ def up
+ add_concurrent_index :group_group_links, [:shared_with_group_id, :shared_group_id], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :group_group_links, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :group_group_links, [:shared_with_group_id], name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :group_group_links, NEW_INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220503102855_add_namespace_ci_cd_settings_table.rb b/db/migrate/20220503102855_add_namespace_ci_cd_settings_table.rb
new file mode 100644
index 00000000000..532e80d1567
--- /dev/null
+++ b/db/migrate/20220503102855_add_namespace_ci_cd_settings_table.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddNamespaceCiCdSettingsTable < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ create_table :namespace_ci_cd_settings, id: false do |t|
+ t.references :namespace, primary_key: true, default: nil, index: false, foreign_key: { on_delete: :cascade }
+ t.boolean :allow_stale_runner_pruning, null: false, default: false
+ end
+ end
+
+ def down
+ drop_table :namespace_ci_cd_settings, if_exists: true
+ end
+end
diff --git a/db/migrate/20220504042847_add_slack_signing_key_to_application_settings.rb b/db/migrate/20220504042847_add_slack_signing_key_to_application_settings.rb
new file mode 100644
index 00000000000..ddfa7c63370
--- /dev/null
+++ b/db/migrate/20220504042847_add_slack_signing_key_to_application_settings.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class AddSlackSigningKeyToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :encrypted_slack_app_signing_secret, :binary
+ add_column :application_settings, :encrypted_slack_app_signing_secret_iv, :binary
+ end
+end
diff --git a/db/migrate/20220504140036_add_container_registry_size_to_namespace_root_storage_statistics.rb b/db/migrate/20220504140036_add_container_registry_size_to_namespace_root_storage_statistics.rb
new file mode 100644
index 00000000000..0197b418cd8
--- /dev/null
+++ b/db/migrate/20220504140036_add_container_registry_size_to_namespace_root_storage_statistics.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddContainerRegistrySizeToNamespaceRootStorageStatistics < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :namespace_root_storage_statistics, :container_registry_size, :bigint, default: 0, null: false
+ end
+end
diff --git a/db/migrate/20220505092254_add_allow_stale_runner_pruning_index_to_namespace_ci_cd_settings.rb b/db/migrate/20220505092254_add_allow_stale_runner_pruning_index_to_namespace_ci_cd_settings.rb
new file mode 100644
index 00000000000..b7fd8fdee4f
--- /dev/null
+++ b/db/migrate/20220505092254_add_allow_stale_runner_pruning_index_to_namespace_ci_cd_settings.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddAllowStaleRunnerPruningIndexToNamespaceCiCdSettings < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_cicd_settings_on_namespace_id_where_stale_pruning_enabled'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :namespace_ci_cd_settings,
+ :namespace_id,
+ where: '(allow_stale_runner_pruning = true)',
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :namespace_ci_cd_settings, INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220506180411_add_index_to_vulnerability_feedback_finding_uuid.rb b/db/migrate/20220506180411_add_index_to_vulnerability_feedback_finding_uuid.rb
new file mode 100644
index 00000000000..a6f01ce5a0e
--- /dev/null
+++ b/db/migrate/20220506180411_add_index_to_vulnerability_feedback_finding_uuid.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AddIndexToVulnerabilityFeedbackFindingUuid < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vulnerability_feedback_finding_uuid'
+
+ # We are indexing on UUID, a hash index should be smaller and faster
+ # details on https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86808#note_943330140
+ def up
+ add_concurrent_index :vulnerability_feedback, :finding_uuid, using: :hash, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :vulnerability_feedback, :finding_uuid, using: :hash, name: INDEX_NAME
+ end
+end
diff --git a/db/migrate/20220507204024_add_separated_caches_option_to_project_ci_settings.rb b/db/migrate/20220507204024_add_separated_caches_option_to_project_ci_settings.rb
new file mode 100644
index 00000000000..39daf9fe296
--- /dev/null
+++ b/db/migrate/20220507204024_add_separated_caches_option_to_project_ci_settings.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class AddSeparatedCachesOptionToProjectCiSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def change
+ add_column :project_ci_cd_settings, :separated_caches, :boolean, default: true, null: false
+ end
+end
diff --git a/db/migrate/20220511090324_add_last_consistency_check_cursors_to_vsa_aggregations.rb b/db/migrate/20220511090324_add_last_consistency_check_cursors_to_vsa_aggregations.rb
new file mode 100644
index 00000000000..53c09597be5
--- /dev/null
+++ b/db/migrate/20220511090324_add_last_consistency_check_cursors_to_vsa_aggregations.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AddLastConsistencyCheckCursorsToVsaAggregations < Gitlab::Database::Migration[2.0]
+ def up
+ change_table(:analytics_cycle_analytics_aggregations, bulk: true) do |t|
+ t.column :last_consistency_check_issues_stage_event_hash_id, :bigint, null: true
+ t.column :last_consistency_check_issues_start_event_timestamp, :datetime_with_timezone, null: true
+ t.column :last_consistency_check_issues_end_event_timestamp, :datetime_with_timezone, null: true
+ t.column :last_consistency_check_issues_issuable_id, :bigint, null: true
+
+ t.column :last_consistency_check_merge_requests_stage_event_hash_id, :bigint, null: true
+ t.column :last_consistency_check_merge_requests_start_event_timestamp, :datetime_with_timezone, null: true
+ t.column :last_consistency_check_merge_requests_end_event_timestamp, :datetime_with_timezone, null: true
+ t.column :last_consistency_check_merge_requests_issuable_id, :bigint, null: true
+ end
+ end
+
+ def down
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_issues_stage_event_hash_id
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_issues_start_event_timestamp
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_issues_end_event_timestamp
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_issues_issuable_id
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_merge_requests_stage_event_hash_id
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_merge_requests_start_event_timestamp
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_merge_requests_end_event_timestamp
+ remove_column :analytics_cycle_analytics_aggregations, :last_consistency_check_merge_requests_issuable_id
+ end
+end
diff --git a/db/migrate/20220511151646_add_exclude_from_free_user_cap_to_namespace_settings.rb b/db/migrate/20220511151646_add_exclude_from_free_user_cap_to_namespace_settings.rb
new file mode 100644
index 00000000000..03f6ad5911c
--- /dev/null
+++ b/db/migrate/20220511151646_add_exclude_from_free_user_cap_to_namespace_settings.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddExcludeFromFreeUserCapToNamespaceSettings < Gitlab::Database::Migration[2.0]
+ enable_lock_retries!
+
+ def up
+ add_column :namespace_settings, :exclude_from_free_user_cap, :boolean, null: false, default: false
+ end
+
+ def down
+ remove_column :namespace_settings, :exclude_from_free_user_cap
+ end
+end
diff --git a/db/migrate/20220511191502_add_registry_migration_guard_thresholds_to_application_settings.rb b/db/migrate/20220511191502_add_registry_migration_guard_thresholds_to_application_settings.rb
new file mode 100644
index 00000000000..87a29bd5889
--- /dev/null
+++ b/db/migrate/20220511191502_add_registry_migration_guard_thresholds_to_application_settings.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddRegistryMigrationGuardThresholdsToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :container_registry_pre_import_timeout,
+ :integer,
+ default: 30.minutes,
+ null: false
+
+ add_column :application_settings, :container_registry_import_timeout,
+ :integer,
+ default: 10.minutes,
+ null: false
+ end
+end
diff --git a/db/migrate/20220511191503_add_pipeline_create_limit_per_project_user_sha_to_application_settings.rb b/db/migrate/20220511191503_add_pipeline_create_limit_per_project_user_sha_to_application_settings.rb
new file mode 100644
index 00000000000..6454bac629a
--- /dev/null
+++ b/db/migrate/20220511191503_add_pipeline_create_limit_per_project_user_sha_to_application_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddPipelineCreateLimitPerProjectUserShaToApplicationSettings < Gitlab::Database::Migration[2.0]
+ def change
+ add_column :application_settings, :pipeline_limit_per_project_user_sha, :integer, default: 0, null: false
+ end
+end
diff --git a/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb b/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb
index b4570c8398b..0377df7a46b 100644
--- a/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb
+++ b/db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb
@@ -1,44 +1,14 @@
# frozen_string_literal: true
class RescheduleArtifactExpiryBackfillAgain < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- MIGRATION = 'BackfillArtifactExpiryDate'
- SWITCH_DATE = Date.new(2020, 06, 22).freeze
-
- disable_ddl_transaction!
-
- class JobArtifact < ActiveRecord::Base
- include EachBatch
-
- self.inheritance_column = :_type_disabled
- self.table_name = 'ci_job_artifacts'
-
- scope :without_expiry_date, -> { where(expire_at: nil) }
- scope :before_switch, -> { where("date(created_at AT TIME ZONE 'UTC') < ?::date", SWITCH_DATE) }
- end
+ # This migration has been disabled as it was causing a regression bug for self instances
+ # preventing artifact deletion, see https://gitlab.com/gitlab-org/gitlab/-/issues/355955
def up
- Gitlab::BackgroundMigration.steal(MIGRATION) do |job|
- job.delete
-
- false
- end
-
- queue_background_migration_jobs_by_range_at_intervals(
- JobArtifact.without_expiry_date.before_switch,
- MIGRATION,
- 2.minutes,
- batch_size: 200_000
- )
+ # no-op
end
def down
- Gitlab::BackgroundMigration.steal(MIGRATION) do |job|
- job.delete
-
- false
- end
+ # no-op
end
end
diff --git a/db/post_migrate/20211103184303_drop_runner_features_from_ci_builds_metadata.rb b/db/post_migrate/20211103184303_drop_runner_features_from_ci_builds_metadata.rb
new file mode 100644
index 00000000000..00580b2f933
--- /dev/null
+++ b/db/post_migrate/20211103184303_drop_runner_features_from_ci_builds_metadata.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class DropRunnerFeaturesFromCiBuildsMetadata < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def up
+ remove_column :ci_builds_metadata, :runner_features
+ end
+
+ def down
+ add_column :ci_builds_metadata, :runner_features, :jsonb, default: {}, null: false
+ end
+end
diff --git a/db/post_migrate/20220213103859_remove_integrations_type.rb b/db/post_migrate/20220213103859_remove_integrations_type.rb
new file mode 100644
index 00000000000..c3633d1e7d3
--- /dev/null
+++ b/db/post_migrate/20220213103859_remove_integrations_type.rb
@@ -0,0 +1,132 @@
+# frozen_string_literal: true
+
+class RemoveIntegrationsType < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillIntegrationsTypeNew'
+ BATCH_SIZE = 50
+ TABLE_NAME = :integrations
+ COLUMN = :type
+
+ # see db/post_migrate/20220213104531_create_indexes_on_integration_type_new.rb
+ def indices
+ [
+ {
+ name: "index_integrations_on_project_and_#{COLUMN}_where_inherit_null",
+ columns: [:project_id, COLUMN],
+ where: 'inherit_from_id IS NULL'
+ },
+ {
+ name: "index_integrations_on_project_id_and_#{COLUMN}_unique",
+ columns: [:project_id, COLUMN],
+ unique: true
+ },
+ {
+ name: "index_integrations_on_#{COLUMN}",
+ columns: [COLUMN]
+ },
+ {
+ name: "index_integrations_on_#{COLUMN}_and_instance_partial",
+ columns: [COLUMN, :instance],
+ where: 'instance = true',
+ unique: true
+ },
+ {
+ name: 'index_integrations_on_type_id_when_active_and_project_id_not_nu',
+ columns: [COLUMN, :id],
+ where: '((active = true) AND (project_id IS NOT NULL))'
+ },
+ {
+ name: "index_integrations_on_unique_group_id_and_#{COLUMN}",
+ columns: [:group_id, COLUMN],
+ unique: true
+ }
+ ]
+ end
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: TABLE_NAME,
+ column_name: :id,
+ job_arguments: [])
+
+ cleanup_unmigrated_rows!
+
+ remove_column :integrations, :type, :text
+ end
+
+ # WARNING: this migration is not really safe to be reverted, since doing so
+ # will leave the type column empty. If this migration is reverted, we will
+ # need to backfill it from type_new
+ def down
+ add_column :integrations, :type, 'character varying'
+
+ indices.each do |index|
+ add_concurrent_index TABLE_NAME, index[:columns], index.except(:columns)
+ end
+ end
+
+ # Convert any remaining unmigrated rows
+ def cleanup_unmigrated_rows!
+ tmp_index_name = 'tmp_idx_integrations_unmigrated_type_new'
+ add_concurrent_index :integrations, :id, where: 'type_new is null', name: tmp_index_name
+
+ define_batchable_model(:integrations).where(type_new: nil).each_batch do |batch|
+ min_id, max_id = batch.pluck(Arel.sql('MIN(id), MAX(id)')).first
+
+ connection.execute(<<~SQL)
+ WITH mapping(old_type, new_type) AS (VALUES
+ ('AsanaService', 'Integrations::Asana'),
+ ('AssemblaService', 'Integrations::Assembla'),
+ ('BambooService', 'Integrations::Bamboo'),
+ ('BugzillaService', 'Integrations::Bugzilla'),
+ ('BuildkiteService', 'Integrations::Buildkite'),
+ ('CampfireService', 'Integrations::Campfire'),
+ ('ConfluenceService', 'Integrations::Confluence'),
+ ('CustomIssueTrackerService', 'Integrations::CustomIssueTracker'),
+ ('DatadogService', 'Integrations::Datadog'),
+ ('DiscordService', 'Integrations::Discord'),
+ ('DroneCiService', 'Integrations::DroneCi'),
+ ('EmailsOnPushService', 'Integrations::EmailsOnPush'),
+ ('EwmService', 'Integrations::Ewm'),
+ ('ExternalWikiService', 'Integrations::ExternalWiki'),
+ ('FlowdockService', 'Integrations::Flowdock'),
+ ('HangoutsChatService', 'Integrations::HangoutsChat'),
+ ('IrkerService', 'Integrations::Irker'),
+ ('JenkinsService', 'Integrations::Jenkins'),
+ ('JiraService', 'Integrations::Jira'),
+ ('MattermostService', 'Integrations::Mattermost'),
+ ('MattermostSlashCommandsService', 'Integrations::MattermostSlashCommands'),
+ ('MicrosoftTeamsService', 'Integrations::MicrosoftTeams'),
+ ('MockCiService', 'Integrations::MockCi'),
+ ('MockMonitoringService', 'Integrations::MockMonitoring'),
+ ('PackagistService', 'Integrations::Packagist'),
+ ('PipelinesEmailService', 'Integrations::PipelinesEmail'),
+ ('PivotaltrackerService', 'Integrations::Pivotaltracker'),
+ ('PrometheusService', 'Integrations::Prometheus'),
+ ('PushoverService', 'Integrations::Pushover'),
+ ('RedmineService', 'Integrations::Redmine'),
+ ('SlackService', 'Integrations::Slack'),
+ ('SlackSlashCommandsService', 'Integrations::SlackSlashCommands'),
+ ('TeamcityService', 'Integrations::Teamcity'),
+ ('UnifyCircuitService', 'Integrations::UnifyCircuit'),
+ ('WebexTeamsService', 'Integrations::WebexTeams'),
+ ('YoutrackService', 'Integrations::Youtrack'),
+
+ -- EE-only integrations
+ ('GithubService', 'Integrations::Github'),
+ ('GitlabSlackApplicationService', 'Integrations::GitlabSlackApplication')
+ )
+
+ UPDATE integrations SET type_new = mapping.new_type
+ FROM mapping
+ WHERE integrations.type_new IS NULL
+ AND integrations.id BETWEEN #{min_id} AND #{max_id}
+ AND integrations.type = mapping.old_type
+ SQL
+ end
+ ensure
+ remove_concurrent_index_by_name(:integrations, tmp_index_name)
+ end
+end
diff --git a/db/post_migrate/20220314154235_migrate_vulnerability_approval_rules.rb b/db/post_migrate/20220314154235_migrate_vulnerability_approval_rules.rb
new file mode 100644
index 00000000000..f9ad2ba4f0c
--- /dev/null
+++ b/db/post_migrate/20220314154235_migrate_vulnerability_approval_rules.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 MigrateVulnerabilityApprovalRules < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ # no-op
+ end
+
+ def down
+ # no-op
+ # Vulnerability-Check feature has been removed as part of 15.0
+ end
+end
diff --git a/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb b/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb
index 8838a27f233..2249413b1e4 100644
--- a/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb
+++ b/db/post_migrate/20220315181136_backfill_work_item_type_id_on_issues.rb
@@ -1,40 +1,13 @@
# frozen_string_literal: true
class BackfillWorkItemTypeIdOnIssues < Gitlab::Database::Migration[1.0]
- MIGRATION = 'BackfillWorkItemTypeIdForIssues'
- BATCH_CLASS_NAME = 'BackfillIssueWorkItemTypeBatchingStrategy'
- BATCH_SIZE = 10_000
- MAX_BATCH_SIZE = 30_000
- SUB_BATCH_SIZE = 100
- INTERVAL = 2.minutes
-
- class MigrationWorkItemType < ApplicationRecord
- self.table_name = 'work_item_types'
-
- def self.id_by_type
- where(namespace_id: nil).order(:base_type).pluck(:base_type, :id).to_h
- end
- end
-
def up
- # We expect no more than 5 types. Only 3 of them are expected to have associated issues at the moment
- MigrationWorkItemType.id_by_type.each do |base_type, type_id|
- queue_batched_background_migration(
- MIGRATION,
- :issues,
- :id,
- base_type,
- type_id,
- job_interval: INTERVAL,
- batch_size: BATCH_SIZE,
- max_batch_size: MAX_BATCH_SIZE,
- sub_batch_size: SUB_BATCH_SIZE,
- batch_class_name: BATCH_CLASS_NAME
- )
- end
+ # no-op
+ # This migration will be rescheduled as described in
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85212
end
def down
- Gitlab::Database::BackgroundMigration::BatchedMigration.where(job_class_name: MIGRATION).delete_all
+ # no-op
end
end
diff --git a/db/post_migrate/20220324165436_schedule_backfill_project_settings.rb b/db/post_migrate/20220324165436_schedule_backfill_project_settings.rb
new file mode 100644
index 00000000000..c1aaea44bfd
--- /dev/null
+++ b/db/post_migrate/20220324165436_schedule_backfill_project_settings.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillProjectSettings < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'BackfillProjectSettings'
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 5_000
+ SUB_BATCH_SIZE = 200
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :projects,
+ :id,
+ job_interval: INTERVAL,
+ batch_size: BATCH_SIZE,
+ sub_batch_size: SUB_BATCH_SIZE
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :projects, :id, [])
+ .delete_all
+ end
+end
diff --git a/db/post_migrate/20220328095848_delete_failed_reset_duplicate_ci_runners_token_migration_records.rb b/db/post_migrate/20220328095848_delete_failed_reset_duplicate_ci_runners_token_migration_records.rb
new file mode 100644
index 00000000000..3c1a6a48ef5
--- /dev/null
+++ b/db/post_migrate/20220328095848_delete_failed_reset_duplicate_ci_runners_token_migration_records.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class DeleteFailedResetDuplicateCiRunnersTokenMigrationRecords < Gitlab::Database::Migration[1.0]
+ def up
+ # Delete remaining records of botched migrations before we start the new migrations
+ Gitlab::Database::BackgroundMigrationJob
+ .for_migration_class('ResetDuplicateCiRunnersTokenValuesOnProjects')
+ .delete_all
+ Gitlab::Database::BackgroundMigrationJob
+ .for_migration_class('ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects')
+ .delete_all
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb b/db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
new file mode 100644
index 00000000000..326a8e30ecb
--- /dev/null
+++ b/db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class Schedule20220328ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects'
+ BATCH_SIZE = 2_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ class Project < ActiveRecord::Base # rubocop:disable Style/Documentation
+ include ::EachBatch
+
+ self.table_name = 'projects'
+
+ scope :base_query, -> { where.not(runners_token_encrypted: nil) }
+ end
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ Project.base_query,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb b/db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb
new file mode 100644
index 00000000000..d999def0078
--- /dev/null
+++ b/db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class Schedule20220328ResetDuplicateCiRunnersTokenValuesOnProjects < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'ResetDuplicateCiRunnersTokenValuesOnProjects'
+ BATCH_SIZE = 2_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ class Project < ActiveRecord::Base # rubocop:disable Style/Documentation
+ include ::EachBatch
+
+ self.table_name = 'projects'
+
+ scope :base_query, -> { where.not(runners_token: nil) }
+ end
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ Project.base_query,
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220331133802_schedule_backfill_topics_title.rb b/db/post_migrate/20220331133802_schedule_backfill_topics_title.rb
new file mode 100644
index 00000000000..8e594a9df52
--- /dev/null
+++ b/db/post_migrate/20220331133802_schedule_backfill_topics_title.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillTopicsTitle < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'BackfillTopicsTitle'
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('topics'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb b/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb
index 1f2c0715f04..9b74cef144f 100644
--- a/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb
+++ b/db/post_migrate/20220404194649_replace_work_item_type_backfill_next_batch_strategy.rb
@@ -1,21 +1,13 @@
# frozen_string_literal: true
class ReplaceWorkItemTypeBackfillNextBatchStrategy < Gitlab::Database::Migration[1.0]
- JOB_CLASS_NAME = 'BackfillWorkItemTypeIdForIssues'
- NEW_STRATEGY_CLASS = 'BackfillIssueWorkItemTypeBatchingStrategy'
- OLD_STRATEGY_CLASS = 'PrimaryKeyBatchingStrategy'
-
- class InlineBatchedMigration < ApplicationRecord
- self.table_name = :batched_background_migrations
- end
-
def up
- InlineBatchedMigration.where(job_class_name: JOB_CLASS_NAME)
- .update_all(batch_class_name: NEW_STRATEGY_CLASS)
+ # no-op
+ # migrations will be rescheduled with the correct batching class
+ # no need for this migration
end
def down
- InlineBatchedMigration.where(job_class_name: JOB_CLASS_NAME)
- .update_all(batch_class_name: OLD_STRATEGY_CLASS)
+ # no-op
end
end
diff --git a/db/post_migrate/20220405092619_toggle_vsa_aggregations_enable.rb b/db/post_migrate/20220405092619_toggle_vsa_aggregations_enable.rb
new file mode 100644
index 00000000000..da1353b5cf9
--- /dev/null
+++ b/db/post_migrate/20220405092619_toggle_vsa_aggregations_enable.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class ToggleVsaAggregationsEnable < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ model = define_batchable_model('analytics_cycle_analytics_aggregations')
+
+ model.each_batch(of: 100) do |relation|
+ relation.where('enabled IS FALSE').update_all(enabled: true)
+ end
+ end
+
+ def down
+ # noop
+ end
+end
diff --git a/db/post_migrate/20220411173544_cleanup_orphans_approval_project_rules.rb b/db/post_migrate/20220411173544_cleanup_orphans_approval_project_rules.rb
new file mode 100644
index 00000000000..f7132407adb
--- /dev/null
+++ b/db/post_migrate/20220411173544_cleanup_orphans_approval_project_rules.rb
@@ -0,0 +1,38 @@
+# 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 CleanupOrphansApprovalProjectRules < Gitlab::Database::Migration[1.0]
+ class ApprovalProjectRule < ActiveRecord::Base
+ self.table_name = 'approval_project_rules'
+ end
+
+ def up
+ return unless Gitlab.ee?
+
+ ApprovalProjectRule.reset_column_information
+
+ logger = ::Gitlab::BackgroundMigration::Logger.build
+ records_ids = []
+
+ # Related enum: report_type: { vulnerability: 1, license_scanning: 2, code_coverage: 3, scan_finding: 4 }
+ ApprovalProjectRule.where(report_type: 4)
+ .joins("LEFT JOIN security_orchestration_policy_configurations
+ ON approval_project_rules.project_id = security_orchestration_policy_configurations.project_id")
+ .where(security_orchestration_policy_configurations: { project_id: nil }).each do |record|
+ records_ids << record.id
+ logger.info(
+ message: "CleanupOrphansApprovalProjectRules with record id: #{record.id}",
+ class: ApprovalProjectRule.name,
+ attributes: record.attributes
+ )
+ end
+
+ ApprovalProjectRule.where(id: records_ids).delete_all
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
index f2aa9c0b717..fb43e13364d 100644
--- a/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
+++ b/db/post_migrate/20220412044906_finalize_traversal_ids_background_migrations.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class FinalizeTraversalIdsBackgroundMigrations < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
def up
finalize_background_migration('BackfillNamespaceTraversalIdsRoots')
finalize_background_migration('BackfillNamespaceTraversalIdsChildren')
diff --git a/db/post_migrate/20220415124802_remove_job_artifact_deprecated_geo_fields.rb b/db/post_migrate/20220415124802_remove_job_artifact_deprecated_geo_fields.rb
new file mode 100644
index 00000000000..65432ba3ce1
--- /dev/null
+++ b/db/post_migrate/20220415124802_remove_job_artifact_deprecated_geo_fields.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class RemoveJobArtifactDeprecatedGeoFields < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_column :geo_event_log, :job_artifact_deleted_event_id, :bigint
+ end
+ end
+
+ def down
+ with_lock_retries do
+ unless column_exists?(:geo_event_log, :job_artifact_deleted_event_id)
+ add_column(:geo_event_log, :job_artifact_deleted_event_id, :bigint)
+ end
+ end
+
+ add_concurrent_foreign_key :geo_event_log, :geo_job_artifact_deleted_events,
+ column: :job_artifact_deleted_event_id,
+ name: 'fk_176d3fbb5d',
+ on_delete: :cascade
+
+ add_concurrent_index :geo_event_log,
+ :job_artifact_deleted_event_id,
+ name: 'index_geo_event_log_on_job_artifact_deleted_event_id',
+ where: "(job_artifact_deleted_event_id IS NOT NULL)"
+ end
+end
diff --git a/db/post_migrate/20220415124804_remove_job_artifact_deleted_event_table.rb b/db/post_migrate/20220415124804_remove_job_artifact_deleted_event_table.rb
new file mode 100644
index 00000000000..05b716f26ab
--- /dev/null
+++ b/db/post_migrate/20220415124804_remove_job_artifact_deleted_event_table.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveJobArtifactDeletedEventTable < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ drop_table :geo_job_artifact_deleted_events
+ end
+
+ def down
+ create_table :geo_job_artifact_deleted_events, id: :bigserial do |t|
+ t.bigint :job_artifact_id, null: false, index: true
+ t.string :file_path, null: false
+ end
+ end
+end
diff --git a/db/post_migrate/20220420061439_add_notes_null_discussion_id_temp_index.rb b/db/post_migrate/20220420061439_add_notes_null_discussion_id_temp_index.rb
new file mode 100644
index 00000000000..35a6d5f5b10
--- /dev/null
+++ b/db/post_migrate/20220420061439_add_notes_null_discussion_id_temp_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddNotesNullDiscussionIdTempIndex < Gitlab::Database::Migration[2.0]
+ # Temporary index to be removed in 15.0 https://gitlab.com/gitlab-org/gitlab/-/issues/357581
+ INDEX_NAME = 'tmp_index_notes_on_id_where_discussion_id_is_null'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :notes, :id, where: 'discussion_id IS NULL', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :notes, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220420061450_backfill_null_note_discussion_ids.rb b/db/post_migrate/20220420061450_backfill_null_note_discussion_ids.rb
new file mode 100644
index 00000000000..8880bc2f748
--- /dev/null
+++ b/db/post_migrate/20220420061450_backfill_null_note_discussion_ids.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class BackfillNullNoteDiscussionIds < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'BackfillNoteDiscussionId'
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 10_000
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ disable_ddl_transaction!
+
+ class Note < MigrationRecord
+ include EachBatch
+
+ self.table_name = 'notes'
+ self.inheritance_column = :_type_disabled
+ end
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ Note.where(discussion_id: nil),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220420135946_update_batched_background_migration_arguments.rb b/db/post_migrate/20220420135946_update_batched_background_migration_arguments.rb
new file mode 100644
index 00000000000..40ed98dcb5e
--- /dev/null
+++ b/db/post_migrate/20220420135946_update_batched_background_migration_arguments.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class UpdateBatchedBackgroundMigrationArguments < Gitlab::Database::Migration[1.0]
+ def up
+ execute(<<~SQL)
+ UPDATE batched_background_migrations
+ SET job_arguments = '[]'
+ WHERE job_arguments = '"[]"';
+ SQL
+ end
+
+ def down
+ execute(<<~SQL)
+ UPDATE batched_background_migrations
+ SET job_arguments = '"[]"'
+ WHERE job_arguments = '[]';
+ SQL
+ end
+end
diff --git a/db/post_migrate/20220420214703_schedule_backfill_draft_status_on_merge_requests_corrected_regex.rb b/db/post_migrate/20220420214703_schedule_backfill_draft_status_on_merge_requests_corrected_regex.rb
new file mode 100644
index 00000000000..1001aca583b
--- /dev/null
+++ b/db/post_migrate/20220420214703_schedule_backfill_draft_status_on_merge_requests_corrected_regex.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+class ScheduleBackfillDraftStatusOnMergeRequestsCorrectedRegex < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = "tmp_index_merge_requests_draft_and_status"
+ MIGRATION = "BackfillDraftStatusOnMergeRequestsWithCorrectedRegex"
+ DELAY_INTERVAL = 2.minutes
+ BATCH_SIZE = 50
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :merge_requests, :id,
+ where: "draft = false AND state_id = 1 AND ((title)::text ~* '#{CORRECTED_REGEXP_STR}'::text)",
+ name: INDEX_NAME
+
+ eligible_mrs = MergeRequest.where(state_id: 1)
+ .where(draft: false)
+ .where("title ~* ?", "#{CORRECTED_REGEXP_STR}")
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ eligible_mrs,
+ MIGRATION,
+ DELAY_INTERVAL,
+ track_jobs: true,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name :merge_requests, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220422121443_add_async_index_for_group_activity_events.rb b/db/post_migrate/20220422121443_add_async_index_for_group_activity_events.rb
new file mode 100644
index 00000000000..92b97203eed
--- /dev/null
+++ b/db/post_migrate/20220422121443_add_async_index_for_group_activity_events.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexForGroupActivityEvents < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_events_for_group_activity'
+
+ def up
+ prepare_async_index :events, %I[group_id target_type action id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+
+ def down
+ unprepare_async_index :events, %I[group_id target_type action id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+end
diff --git a/db/post_migrate/20220425111114_add_async_index_for_project_activity_events.rb b/db/post_migrate/20220425111114_add_async_index_for_project_activity_events.rb
new file mode 100644
index 00000000000..b203ceca976
--- /dev/null
+++ b/db/post_migrate/20220425111114_add_async_index_for_project_activity_events.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexForProjectActivityEvents < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_events_for_project_activity'
+
+ def up
+ prepare_async_index :events, %I[project_id target_type action id], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :events, %I[project_id target_type action id], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220425111453_add_async_index_to_events_on_group_id_and_id.rb b/db/post_migrate/20220425111453_add_async_index_to_events_on_group_id_and_id.rb
new file mode 100644
index 00000000000..313a31d8964
--- /dev/null
+++ b/db/post_migrate/20220425111453_add_async_index_to_events_on_group_id_and_id.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddAsyncIndexToEventsOnGroupIdAndId < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_events_on_group_id_and_id'
+
+ def up
+ prepare_async_index :events, %I[group_id id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+
+ def down
+ unprepare_async_index :events, %I[group_id id], name: INDEX_NAME, where: 'group_id IS NOT NULL'
+ end
+end
diff --git a/db/post_migrate/20220425121410_add_temporary_index_for_backfill_integrations_enable_ssl_verification.rb b/db/post_migrate/20220425121410_add_temporary_index_for_backfill_integrations_enable_ssl_verification.rb
new file mode 100644
index 00000000000..d0f8e60fa54
--- /dev/null
+++ b/db/post_migrate/20220425121410_add_temporary_index_for_backfill_integrations_enable_ssl_verification.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddTemporaryIndexForBackfillIntegrationsEnableSslVerification < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'tmp_index_integrations_on_id_where_type_droneci_or_teamcity'
+ INDEX_CONDITION = "type_new IN ('Integrations::DroneCi', 'Integrations::Teamcity') " \
+ "AND encrypted_properties IS NOT NULL"
+
+ def up
+ # this index is used in 20220209121435_backfill_integrations_enable_ssl_verification
+ add_concurrent_index :integrations, :id, where: INDEX_CONDITION, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :integrations, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb b/db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb
new file mode 100644
index 00000000000..101bde975db
--- /dev/null
+++ b/db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class BackfillIntegrationsEnableSslVerification < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ MIGRATION = 'BackfillIntegrationsEnableSslVerification'
+ INTERVAL = 5.minutes
+ BATCH_SIZE = 1_000
+
+ class Integration < MigrationRecord
+ include EachBatch
+ include IgnorableColumns
+
+ self.table_name = :integrations
+ self.inheritance_column = :_type_disabled
+
+ ignore_column :template, remove_with: '15.0', remove_after: '2022-04-22'
+ ignore_column :type, remove_with: '15.0', remove_after: '2022-04-22'
+ ignore_column :properties, remove_with: '15.1', remove_after: '2022-05-22'
+
+ scope :affected, -> do
+ where(type_new: %w[Integrations::DroneCi Integrations::Teamcity]).where.not(encrypted_properties: nil)
+ end
+
+ attr_encrypted :properties,
+ mode: :per_attribute_iv,
+ key: Settings.attr_encrypted_db_key_base_32,
+ algorithm: 'aes-256-gcm',
+ marshal: true,
+ marshaler: ::Gitlab::Json,
+ encode: false,
+ encode_iv: false
+
+ # Handle assignment of props with symbol keys.
+ # To do this correctly, we need to call the method generated by attr_encrypted.
+ alias_method :attr_encrypted_props=, :properties=
+ private :attr_encrypted_props=
+
+ def properties=(props)
+ self.attr_encrypted_props = props&.with_indifferent_access&.freeze
+ end
+ end
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ Integration.affected,
+ MIGRATION,
+ INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ end
+end
diff --git a/db/post_migrate/20220426185933_backfill_deployments_finished_at.rb b/db/post_migrate/20220426185933_backfill_deployments_finished_at.rb
new file mode 100644
index 00000000000..860756de298
--- /dev/null
+++ b/db/post_migrate/20220426185933_backfill_deployments_finished_at.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class BackfillDeploymentsFinishedAt < Gitlab::Database::Migration[2.0]
+ DEPLOYMENT_STATUS_SUCCESS = 2 # Equivalent to Deployment.statuses[:success]
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ BATCH_SIZE = 100
+
+ def up
+ define_batchable_model('deployments')
+ .where(finished_at: nil)
+ .where(status: DEPLOYMENT_STATUS_SUCCESS)
+ .each_batch(of: BATCH_SIZE) { |relation| relation.update_all('finished_at = created_at') }
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220428133724_schedule_expire_o_auth_tokens.rb b/db/post_migrate/20220428133724_schedule_expire_o_auth_tokens.rb
new file mode 100644
index 00000000000..3e0e9b8af0e
--- /dev/null
+++ b/db/post_migrate/20220428133724_schedule_expire_o_auth_tokens.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class ScheduleExpireOAuthTokens < Gitlab::Database::Migration[2.0]
+ def up
+ # reschedulled with db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb
+ end
+
+ def down
+ # reschedulled with db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb
+ end
+end
diff --git a/db/post_migrate/20220502015011_clean_up_fix_merge_request_diff_commit_users.rb b/db/post_migrate/20220502015011_clean_up_fix_merge_request_diff_commit_users.rb
new file mode 100644
index 00000000000..582a0f5cf37
--- /dev/null
+++ b/db/post_migrate/20220502015011_clean_up_fix_merge_request_diff_commit_users.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CleanUpFixMergeRequestDiffCommitUsers < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION_CLASS = 'FixMergeRequestDiffCommitUsers'
+
+ def up
+ finalize_background_migration(MIGRATION_CLASS)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220502173045_reset_too_many_tags_skipped_registry_imports.rb b/db/post_migrate/20220502173045_reset_too_many_tags_skipped_registry_imports.rb
new file mode 100644
index 00000000000..e327035d6c9
--- /dev/null
+++ b/db/post_migrate/20220502173045_reset_too_many_tags_skipped_registry_imports.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class ResetTooManyTagsSkippedRegistryImports < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'ResetTooManyTagsSkippedRegistryImports'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 10_000
+
+ disable_ddl_transaction!
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('container_repositories').where(
+ migration_state: 'import_skipped',
+ migration_skipped_reason: 2
+ ),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20220503114353_prepare_confidential_note_index.rb b/db/post_migrate/20220503114353_prepare_confidential_note_index.rb
new file mode 100644
index 00000000000..08e60f3d935
--- /dev/null
+++ b/db/post_migrate/20220503114353_prepare_confidential_note_index.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class PrepareConfidentialNoteIndex < Gitlab::Database::Migration[2.0]
+ INDEX_NAME = 'index_notes_on_confidential'
+
+ def up
+ prepare_async_index :notes, :confidential, where: 'confidential = true', name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :notes, :confidential, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220503134610_remove_requirements_management_test_reports_requirement_id.rb b/db/post_migrate/20220503134610_remove_requirements_management_test_reports_requirement_id.rb
new file mode 100644
index 00000000000..4c46a02c99f
--- /dev/null
+++ b/db/post_migrate/20220503134610_remove_requirements_management_test_reports_requirement_id.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class RemoveRequirementsManagementTestReportsRequirementId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ TARGET_TABLE = :requirements_management_test_reports
+ CONSTRAINT_NAME = 'fk_rails_fb3308ad55'
+
+ def up
+ with_lock_retries do
+ remove_column TARGET_TABLE, :requirement_id
+ end
+ end
+
+ def down
+ unless column_exists?(TARGET_TABLE, :requirement_id)
+ with_lock_retries do
+ add_column TARGET_TABLE, :requirement_id, :bigint, after: :created_at
+ end
+ end
+
+ add_concurrent_index TARGET_TABLE, :requirement_id,
+ name: :index_requirements_management_test_reports_on_requirement_id
+
+ add_concurrent_foreign_key TARGET_TABLE, :requirements,
+ column: :requirement_id, name: CONSTRAINT_NAME, on_delete: :cascade
+ end
+end
diff --git a/db/post_migrate/20220504083348_add_indexes_for_primary_email_post_regression_cleanup_migration.rb b/db/post_migrate/20220504083348_add_indexes_for_primary_email_post_regression_cleanup_migration.rb
new file mode 100644
index 00000000000..ba0457fa36e
--- /dev/null
+++ b/db/post_migrate/20220504083348_add_indexes_for_primary_email_post_regression_cleanup_migration.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AddIndexesForPrimaryEmailPostRegressionCleanupMigration < Gitlab::Database::Migration[2.0]
+ USERS_INDEX = :index_users_on_id_for_primary_email_migration
+ EMAIL_INDEX = :index_emails_on_email_user_id
+
+ disable_ddl_transaction!
+
+ def up
+ unless index_exists_by_name?(:users, USERS_INDEX)
+
+ disable_statement_timeout do
+ execute <<~SQL
+ CREATE INDEX CONCURRENTLY #{USERS_INDEX}
+ ON users (id) INCLUDE (email, confirmed_at)
+ WHERE confirmed_at IS NOT NULL
+ SQL
+ end
+ end
+
+ add_concurrent_index :emails, [:email, :user_id], name: EMAIL_INDEX
+ end
+
+ def down
+ remove_concurrent_index_by_name :users, USERS_INDEX
+ remove_concurrent_index_by_name :emails, EMAIL_INDEX
+ end
+end
diff --git a/db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb b/db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb
new file mode 100644
index 00000000000..110e2578cd5
--- /dev/null
+++ b/db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class CleanupAfterFixingRegressionWithNewUsersEmails < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ BATCH_SIZE = 10_000
+
+ # Stubbed class to access the User table
+ class User < MigrationRecord
+ include ::EachBatch
+
+ self.table_name = 'users'
+ self.inheritance_column = :_type_disabled
+
+ scope :confirmed, -> { where.not(confirmed_at: nil) }
+
+ has_many :emails
+ end
+
+ # Stubbed class to access the Emails table
+ class Email < MigrationRecord
+ self.table_name = 'emails'
+ self.inheritance_column = :_type_disabled
+
+ belongs_to :user
+ end
+
+ # rubocop: disable Layout/LineLength
+ def up
+ # Select confirmed users that do not have their primary email in the emails table,
+ # and create the email record.
+ not_exists_condition = 'NOT EXISTS (SELECT 1 FROM emails WHERE emails.email = users.email AND emails.user_id = users.id)'
+
+ User.confirmed.each_batch(of: BATCH_SIZE) do |user_batch|
+ user_batch.select(:id, :email, :confirmed_at).where(not_exists_condition).each do |user|
+ current_time = Time.now.utc
+
+ begin
+ Email.create(
+ user_id: user.id,
+ email: user.email,
+ confirmed_at: user.confirmed_at,
+ created_at: current_time,
+ updated_at: current_time
+ )
+ rescue StandardError => error
+ Gitlab::AppLogger.error("Could not add primary email #{user.email} to emails for user with ID #{user.id} due to #{error}")
+ end
+ end
+ end
+ end
+ # rubocop: enable Layout/LineLength
+
+ def down
+ # Intentionally left blank
+ end
+end
diff --git a/db/post_migrate/20220504084136_drop_temporary_indexes_for_primary_email_post_regression_cleanup.rb b/db/post_migrate/20220504084136_drop_temporary_indexes_for_primary_email_post_regression_cleanup.rb
new file mode 100644
index 00000000000..60c69426a8a
--- /dev/null
+++ b/db/post_migrate/20220504084136_drop_temporary_indexes_for_primary_email_post_regression_cleanup.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class DropTemporaryIndexesForPrimaryEmailPostRegressionCleanup < Gitlab::Database::Migration[2.0]
+ USERS_INDEX = :index_users_on_id_for_primary_email_migration
+ EMAIL_INDEX = :index_emails_on_email_user_id
+
+ disable_ddl_transaction!
+
+ def up
+ remove_concurrent_index_by_name :users, USERS_INDEX
+ remove_concurrent_index_by_name :emails, EMAIL_INDEX
+ end
+
+ def down
+ unless index_exists_by_name?(:users, USERS_INDEX)
+
+ disable_statement_timeout do
+ execute <<~SQL
+ CREATE INDEX CONCURRENTLY #{USERS_INDEX}
+ ON users (id) INCLUDE (email, confirmed_at)
+ WHERE confirmed_at IS NOT NULL
+ SQL
+ end
+ end
+
+ add_concurrent_index :emails, [:email, :user_id], name: EMAIL_INDEX
+ end
+end
diff --git a/db/post_migrate/20220505022001_add_index_to_deployments_on_created_at_cluster_id_and_project_id.rb b/db/post_migrate/20220505022001_add_index_to_deployments_on_created_at_cluster_id_and_project_id.rb
new file mode 100644
index 00000000000..c78c3a86cf3
--- /dev/null
+++ b/db/post_migrate/20220505022001_add_index_to_deployments_on_created_at_cluster_id_and_project_id.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class AddIndexToDeploymentsOnCreatedAtClusterIdAndProjectId < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # This temporary index was created to support the script that will be run as part o this
+ # Change Request: https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6981
+ #
+ # Issue to remove the temporary index: https://gitlab.com/gitlab-org/gitlab/-/issues/361389
+ INDEX_NAME = 'tp_index_created_at_cluster_id_project_id_on_deployments'
+
+ # The change request will only run for deployments newer than this date. This is what we'll
+ # be considering as "Active certificate based cluster Kubernetes Deployments". Namespaces with
+ # deployments older than this will have to be migrated to the agent and won't have their
+ # certificate based clusters life extended.
+ DEPLOYMENTS_START_DATE = '2022-04-03 00:00:00'
+
+ def up
+ add_concurrent_index(
+ :deployments,
+ [:created_at, :cluster_id, :project_id],
+ name: INDEX_NAME,
+ where: "cluster_id is not null and created_at > '#{DEPLOYMENTS_START_DATE}'")
+ end
+
+ def down
+ remove_concurrent_index_by_name(:deployments, INDEX_NAME)
+ end
+end
diff --git a/db/post_migrate/20220505044348_fix_automatic_iterations_cadences_start_date.rb b/db/post_migrate/20220505044348_fix_automatic_iterations_cadences_start_date.rb
new file mode 100644
index 00000000000..90d70da1a28
--- /dev/null
+++ b/db/post_migrate/20220505044348_fix_automatic_iterations_cadences_start_date.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class FixAutomaticIterationsCadencesStartDate < Gitlab::Database::Migration[2.0]
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ execute(<<~SQL)
+ UPDATE iterations_cadences
+ SET start_date=COALESCE(
+ (
+ SELECT start_date
+ FROM sprints
+ WHERE iterations_cadences.id=sprints.iterations_cadence_id
+ ORDER BY sprints.start_date ASC
+ LIMIT 1
+ ),
+ start_date
+ )
+ WHERE iterations_cadences.automatic=true;
+ SQL
+ end
+
+ def down
+ # no-op
+ # The migration updates the records for the feature used behind a non-default feature flag.
+ # The correct data can be computed with the records from 'sprints' table.
+ end
+end
diff --git a/db/post_migrate/20220505053504_remove_namespaces_id_parent_id_inverse_partial_index.rb b/db/post_migrate/20220505053504_remove_namespaces_id_parent_id_inverse_partial_index.rb
new file mode 100644
index 00000000000..aca3ccaa03e
--- /dev/null
+++ b/db/post_migrate/20220505053504_remove_namespaces_id_parent_id_inverse_partial_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveNamespacesIdParentIdInversePartialIndex < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ NAME = 'index_namespaces_id_parent_id_is_not_null'
+
+ def up
+ remove_concurrent_index :namespaces, :id, name: NAME
+ end
+
+ def down
+ add_concurrent_index :namespaces, :id, where: 'parent_id IS NOT NULL', name: NAME
+ end
+end
diff --git a/db/post_migrate/20220505060011_remove_namespaces_id_parent_id_partial_index.rb b/db/post_migrate/20220505060011_remove_namespaces_id_parent_id_partial_index.rb
new file mode 100644
index 00000000000..5125a97af7e
--- /dev/null
+++ b/db/post_migrate/20220505060011_remove_namespaces_id_parent_id_partial_index.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class RemoveNamespacesIdParentIdPartialIndex < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ NAME = 'index_namespaces_id_parent_id_is_null'
+
+ def up
+ remove_concurrent_index :namespaces, :id, name: NAME
+ end
+
+ def down
+ add_concurrent_index :namespaces, :id, where: 'parent_id IS NULL', name: NAME
+ end
+end
diff --git a/db/post_migrate/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints.rb b/db/post_migrate/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints.rb
new file mode 100644
index 00000000000..5cffdb641d6
--- /dev/null
+++ b/db/post_migrate/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class UpdateIndexOnAlertsToExcludeNullFingerprints < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_partial_am_alerts_on_project_id_and_fingerprint'
+ NEW_INDEX_NAME = 'index_unresolved_alerts_on_project_id_and_fingerprint'
+
+ def up
+ add_concurrent_index :alert_management_alerts,
+ [:project_id, :fingerprint],
+ where: "fingerprint IS NOT NULL and status <> 2",
+ name: NEW_INDEX_NAME,
+ unique: true
+
+ remove_concurrent_index_by_name :alert_management_alerts, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :alert_management_alerts,
+ [:project_id, :fingerprint],
+ where: "status <> 2",
+ name: OLD_INDEX_NAME,
+ unique: true
+
+ remove_concurrent_index_by_name :alert_management_alerts, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220505193512_add_not_null_constraint_to_issues_work_item_type.rb b/db/post_migrate/20220505193512_add_not_null_constraint_to_issues_work_item_type.rb
new file mode 100644
index 00000000000..3ea003383a6
--- /dev/null
+++ b/db/post_migrate/20220505193512_add_not_null_constraint_to_issues_work_item_type.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddNotNullConstraintToIssuesWorkItemType < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ def up
+ add_not_null_constraint :issues, :work_item_type_id, validate: false
+ end
+
+ def down
+ remove_not_null_constraint :issues, :work_item_type_id
+ end
+end
diff --git a/db/post_migrate/20220506201639_remove_devops_adoption_security_scan_succeeded_column.rb b/db/post_migrate/20220506201639_remove_devops_adoption_security_scan_succeeded_column.rb
new file mode 100644
index 00000000000..64722919aff
--- /dev/null
+++ b/db/post_migrate/20220506201639_remove_devops_adoption_security_scan_succeeded_column.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class RemoveDevopsAdoptionSecurityScanSucceededColumn < Gitlab::Database::Migration[2.0]
+ def up
+ remove_column :analytics_devops_adoption_snapshots, :security_scan_succeeded
+ end
+
+ def down
+ add_column :analytics_devops_adoption_snapshots, :security_scan_succeeded, :boolean
+ end
+end
diff --git a/db/post_migrate/20220510003916_remove_tmp_empty_traversal_ids_root_namespace_index.rb b/db/post_migrate/20220510003916_remove_tmp_empty_traversal_ids_root_namespace_index.rb
new file mode 100644
index 00000000000..424c6f164e7
--- /dev/null
+++ b/db/post_migrate/20220510003916_remove_tmp_empty_traversal_ids_root_namespace_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveTmpEmptyTraversalIdsRootNamespaceIndex < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ ROOT_NS_INDEX_NAME = 'tmp_index_namespaces_empty_traversal_ids_with_root_namespaces'
+
+ def up
+ remove_concurrent_index :namespaces, :id, name: ROOT_NS_INDEX_NAME
+ end
+
+ def down
+ where_sql = "parent_id IS NULL AND traversal_ids = '{}'"
+ add_concurrent_index :namespaces, :id, where: where_sql, name: ROOT_NS_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220510004501_remove_tmp_empty_traversal_ids_child_namespace_index.rb b/db/post_migrate/20220510004501_remove_tmp_empty_traversal_ids_child_namespace_index.rb
new file mode 100644
index 00000000000..804b20a38e9
--- /dev/null
+++ b/db/post_migrate/20220510004501_remove_tmp_empty_traversal_ids_child_namespace_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveTmpEmptyTraversalIdsChildNamespaceIndex < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ CHILD_INDEX_NAME = 'tmp_index_namespaces_empty_traversal_ids_with_child_namespaces'
+
+ def up
+ remove_concurrent_index :namespaces, :id, name: CHILD_INDEX_NAME
+ end
+
+ def down
+ where_sql = "parent_id IS NOT NULL AND traversal_ids = '{}'"
+ add_concurrent_index :namespaces, :id, where: where_sql, name: CHILD_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20220511152439_remove_not_null_constraint_from_work_item_type.rb b/db/post_migrate/20220511152439_remove_not_null_constraint_from_work_item_type.rb
new file mode 100644
index 00000000000..f56763cdafb
--- /dev/null
+++ b/db/post_migrate/20220511152439_remove_not_null_constraint_from_work_item_type.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class RemoveNotNullConstraintFromWorkItemType < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85866 introduced a NOT NULL constraint on
+ # `issues` which caused QA failures (https://gitlab.com/gitlab-org/gitlab/-/issues/362023), and
+ # Helm database issues resulting in broken tests after restoring the database.
+ def up
+ remove_not_null_constraint :issues, :work_item_type_id, constraint_name: 'check_2addf801cd'
+ end
+
+ def down
+ add_not_null_constraint :issues, :work_item_type_id, validate: false
+ end
+end
diff --git a/db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb b/db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb
new file mode 100644
index 00000000000..0c8a2386583
--- /dev/null
+++ b/db/post_migrate/20220513043344_reschedule_expire_o_auth_tokens.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class RescheduleExpireOAuthTokens < Gitlab::Database::Migration[2.0]
+ MIGRATION = 'ExpireOAuthTokens'
+ INTERVAL = 2.minutes.freeze
+
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ def up
+ # remove the original migration from db/post_migrate/20220428133724_schedule_expire_o_auth_tokens.rb
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :oauth_access_tokens, :id, [])
+ .delete_all
+
+ # reschedule
+ queue_batched_background_migration(
+ MIGRATION,
+ :oauth_access_tokens,
+ :id,
+ job_interval: INTERVAL
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :oauth_access_tokens, :id, [])
+ .delete_all
+ end
+end
diff --git a/db/post_migrate/20220517144749_remove_vulnerability_approval_rules.rb b/db/post_migrate/20220517144749_remove_vulnerability_approval_rules.rb
new file mode 100644
index 00000000000..83e3784c3aa
--- /dev/null
+++ b/db/post_migrate/20220517144749_remove_vulnerability_approval_rules.rb
@@ -0,0 +1,29 @@
+# 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 RemoveVulnerabilityApprovalRules < Gitlab::Database::Migration[2.0]
+ disable_ddl_transaction!
+
+ restrict_gitlab_migration gitlab_schema: :gitlab_main
+
+ class ApprovalProjectRule < MigrationRecord
+ self.table_name = 'approval_project_rules'
+
+ enum report_type: { vulnerability: 1, license_scanning: 2, code_coverage: 3, scan_finding: 4 }
+ end
+
+ def up
+ return unless Gitlab.ee?
+
+ ApprovalProjectRule.reset_column_information
+
+ ApprovalProjectRule.vulnerability.delete_all
+ end
+
+ def down
+ # no-op
+ # Vulnerability-Check feature has been removed as part of 15.0
+ end
+end
diff --git a/db/schema_migrations/20211103184303 b/db/schema_migrations/20211103184303
new file mode 100644
index 00000000000..f488474ce82
--- /dev/null
+++ b/db/schema_migrations/20211103184303
@@ -0,0 +1 @@
+fdec8e2d58c5b857a997d7fa3536969df8c05b8c455811cbec984834e031f2cb \ No newline at end of file
diff --git a/db/schema_migrations/20220213100000 b/db/schema_migrations/20220213100000
new file mode 100644
index 00000000000..a62215351cd
--- /dev/null
+++ b/db/schema_migrations/20220213100000
@@ -0,0 +1 @@
+a6c1438ebcffca03e1c42ca9a233d087932fabcfd1eacf20dd801b9f574226e5 \ No newline at end of file
diff --git a/db/schema_migrations/20220213103859 b/db/schema_migrations/20220213103859
new file mode 100644
index 00000000000..8950d31675e
--- /dev/null
+++ b/db/schema_migrations/20220213103859
@@ -0,0 +1 @@
+ffc9a2dd97ace1f34e0cfca0c407dcf98dabf30379a441ba948261aec531fe85 \ No newline at end of file
diff --git a/db/schema_migrations/20220314154235 b/db/schema_migrations/20220314154235
new file mode 100644
index 00000000000..911a5dc9854
--- /dev/null
+++ b/db/schema_migrations/20220314154235
@@ -0,0 +1 @@
+b3015220caeb1d21856de8c5026e2db052e98e4fb1c4b4f3a931b8481c2b8240 \ No newline at end of file
diff --git a/db/schema_migrations/20220324091224 b/db/schema_migrations/20220324091224
new file mode 100644
index 00000000000..4be0647a91b
--- /dev/null
+++ b/db/schema_migrations/20220324091224
@@ -0,0 +1 @@
+7418b98f33ada13dedab493ad8a969808a18db2fa0188e428b1c685aabb3bc66 \ No newline at end of file
diff --git a/db/schema_migrations/20220324165436 b/db/schema_migrations/20220324165436
new file mode 100644
index 00000000000..e2e366134f6
--- /dev/null
+++ b/db/schema_migrations/20220324165436
@@ -0,0 +1 @@
+6fcf6e2ecc7d9b62adf20add28b1eeeebde449dfa52d2af67d9098768d3cb67e \ No newline at end of file
diff --git a/db/schema_migrations/20220328095848 b/db/schema_migrations/20220328095848
new file mode 100644
index 00000000000..83af691ee8e
--- /dev/null
+++ b/db/schema_migrations/20220328095848
@@ -0,0 +1 @@
+4d75e2180a30d3cdd4efa3b6a7d107e146b755faf0316e985a8813a85644af35 \ No newline at end of file
diff --git a/db/schema_migrations/20220328100456 b/db/schema_migrations/20220328100456
new file mode 100644
index 00000000000..a6017220eb0
--- /dev/null
+++ b/db/schema_migrations/20220328100456
@@ -0,0 +1 @@
+a27caa521761ff1f4513318eb4ce3ea0e29d101f260493598caf4c8cb0fcc931 \ No newline at end of file
diff --git a/db/schema_migrations/20220328100457 b/db/schema_migrations/20220328100457
new file mode 100644
index 00000000000..531ea3cd432
--- /dev/null
+++ b/db/schema_migrations/20220328100457
@@ -0,0 +1 @@
+954217de622b1ee360edbd89dd31c5a051001cf6879ce97c7b49c228321d48d7 \ No newline at end of file
diff --git a/db/schema_migrations/20220331125725 b/db/schema_migrations/20220331125725
new file mode 100644
index 00000000000..6f10644b517
--- /dev/null
+++ b/db/schema_migrations/20220331125725
@@ -0,0 +1 @@
+a7e5490e9b53cbbed01c03690cbe0bb4668adb17ec4fe14ca96e021f2e313b38 \ No newline at end of file
diff --git a/db/schema_migrations/20220331130726 b/db/schema_migrations/20220331130726
new file mode 100644
index 00000000000..d88e56d14c9
--- /dev/null
+++ b/db/schema_migrations/20220331130726
@@ -0,0 +1 @@
+bcaf6139100dc5658d33292e8e5484d1d6278f022eeb6e3bcd519efdccdf4470 \ No newline at end of file
diff --git a/db/schema_migrations/20220331133802 b/db/schema_migrations/20220331133802
new file mode 100644
index 00000000000..780876ac02e
--- /dev/null
+++ b/db/schema_migrations/20220331133802
@@ -0,0 +1 @@
+0e96430b245f6f04447ee50b6e0c0b9d7828cfeaf1f08e303aa04bb40a117a7f \ No newline at end of file
diff --git a/db/schema_migrations/20220401071609 b/db/schema_migrations/20220401071609
new file mode 100644
index 00000000000..1fa11a31867
--- /dev/null
+++ b/db/schema_migrations/20220401071609
@@ -0,0 +1 @@
+fa1651c066191279fe922b311be3e112b87648c52b1af7a81d7b73ebfe2f7177 \ No newline at end of file
diff --git a/db/schema_migrations/20220401151123 b/db/schema_migrations/20220401151123
new file mode 100644
index 00000000000..9dd7ec7854c
--- /dev/null
+++ b/db/schema_migrations/20220401151123
@@ -0,0 +1 @@
+eeb0e38915de7053811e36b0829a21472c041131d1399ebaf14811d407a43f1b \ No newline at end of file
diff --git a/db/schema_migrations/20220405092619 b/db/schema_migrations/20220405092619
new file mode 100644
index 00000000000..599f60fe611
--- /dev/null
+++ b/db/schema_migrations/20220405092619
@@ -0,0 +1 @@
+c5cd7bd6ad1dff678aaa2eea89dde757cdbc159cecc8abc5d098e9ce91d55c40 \ No newline at end of file
diff --git a/db/schema_migrations/20220406133049 b/db/schema_migrations/20220406133049
new file mode 100644
index 00000000000..4c67d7fd780
--- /dev/null
+++ b/db/schema_migrations/20220406133049
@@ -0,0 +1 @@
+bfd9afc3245a311f905548c18535a2d4216b3973b505b1e3217037e4c0a39a2e \ No newline at end of file
diff --git a/db/schema_migrations/20220411173544 b/db/schema_migrations/20220411173544
new file mode 100644
index 00000000000..e56cd4d9cfc
--- /dev/null
+++ b/db/schema_migrations/20220411173544
@@ -0,0 +1 @@
+0bb23775f65b9997e04dffe701ba609d26dde89796406941fbd27bf810b174ae \ No newline at end of file
diff --git a/db/schema_migrations/20220412060931 b/db/schema_migrations/20220412060931
new file mode 100644
index 00000000000..145d3aaf101
--- /dev/null
+++ b/db/schema_migrations/20220412060931
@@ -0,0 +1 @@
+504e7df63be512fb4f6d3abbf9ebe381752f2c24b63b2d6a4d11c64894c1555b \ No newline at end of file
diff --git a/db/schema_migrations/20220412135446 b/db/schema_migrations/20220412135446
new file mode 100644
index 00000000000..29fd0a2befc
--- /dev/null
+++ b/db/schema_migrations/20220412135446
@@ -0,0 +1 @@
+ec0dbbc2963943fd1449503c141fd8e84e5c0f58ab6b845734a61bedcd7da44a \ No newline at end of file
diff --git a/db/schema_migrations/20220412140446 b/db/schema_migrations/20220412140446
new file mode 100644
index 00000000000..c9c06daa26f
--- /dev/null
+++ b/db/schema_migrations/20220412140446
@@ -0,0 +1 @@
+28d84269536b34084bf060d72592119c580ad92ff9de481dd67770f07fc26ab4 \ No newline at end of file
diff --git a/db/schema_migrations/20220412140755 b/db/schema_migrations/20220412140755
new file mode 100644
index 00000000000..3a34d98162d
--- /dev/null
+++ b/db/schema_migrations/20220412140755
@@ -0,0 +1 @@
+95353be853064cd1038e8a416254017f33c42bfadf97eca6732a62c0796018f9 \ No newline at end of file
diff --git a/db/schema_migrations/20220412141020 b/db/schema_migrations/20220412141020
new file mode 100644
index 00000000000..6487e30776f
--- /dev/null
+++ b/db/schema_migrations/20220412141020
@@ -0,0 +1 @@
+bf0696047c736e361225ce33ee750def26ae2f9bd2ece9065799fd9514edbfcc \ No newline at end of file
diff --git a/db/schema_migrations/20220413054910 b/db/schema_migrations/20220413054910
new file mode 100644
index 00000000000..6f6c0321d53
--- /dev/null
+++ b/db/schema_migrations/20220413054910
@@ -0,0 +1 @@
+5d386a9eb1602afcaf44442c5696e03721a265cf104564258f4adee60b70b0f2 \ No newline at end of file
diff --git a/db/schema_migrations/20220413124200 b/db/schema_migrations/20220413124200
new file mode 100644
index 00000000000..cbf9676b231
--- /dev/null
+++ b/db/schema_migrations/20220413124200
@@ -0,0 +1 @@
+f5d7722ee4b0288294b08b470e7f9c072cf50f888a33fa7ed234eaafa5684843 \ No newline at end of file
diff --git a/db/schema_migrations/20220413164146 b/db/schema_migrations/20220413164146
new file mode 100644
index 00000000000..a78ab62884e
--- /dev/null
+++ b/db/schema_migrations/20220413164146
@@ -0,0 +1 @@
+bae5ea4ce48e44704ed37a400222fd9d09ac6da43ca878747ba3fd1105d16360 \ No newline at end of file
diff --git a/db/schema_migrations/20220413235818 b/db/schema_migrations/20220413235818
new file mode 100644
index 00000000000..449b2d61115
--- /dev/null
+++ b/db/schema_migrations/20220413235818
@@ -0,0 +1 @@
+41913029290e231d17f108fadf62e629b8919f5edf8854a4a7ae92e233329af3 \ No newline at end of file
diff --git a/db/schema_migrations/20220414203622 b/db/schema_migrations/20220414203622
new file mode 100644
index 00000000000..80a4196677d
--- /dev/null
+++ b/db/schema_migrations/20220414203622
@@ -0,0 +1 @@
+d966d06f88e31be3e310bb1e414484c95fa458680d4cc7f04f20f2a297feb8fd \ No newline at end of file
diff --git a/db/schema_migrations/20220415015143 b/db/schema_migrations/20220415015143
new file mode 100644
index 00000000000..5014ff7b005
--- /dev/null
+++ b/db/schema_migrations/20220415015143
@@ -0,0 +1 @@
+6dc4a3e617d9a6a42a0c226c95c377112ae852aabb93d12825be66ee36803b2c \ No newline at end of file
diff --git a/db/schema_migrations/20220415124802 b/db/schema_migrations/20220415124802
new file mode 100644
index 00000000000..3f5c99b675b
--- /dev/null
+++ b/db/schema_migrations/20220415124802
@@ -0,0 +1 @@
+aaf55d3f4a82789695ce1107d045a6230e111d5058733f72ccf4a1e5563a2636 \ No newline at end of file
diff --git a/db/schema_migrations/20220415124804 b/db/schema_migrations/20220415124804
new file mode 100644
index 00000000000..1c325f0fdbc
--- /dev/null
+++ b/db/schema_migrations/20220415124804
@@ -0,0 +1 @@
+728ce5b9d0986fa55a43841b2a5961f9716b3e2933d1e77e3ac00e30244c6f8e \ No newline at end of file
diff --git a/db/schema_migrations/20220419223906 b/db/schema_migrations/20220419223906
new file mode 100644
index 00000000000..8d07b0a30b6
--- /dev/null
+++ b/db/schema_migrations/20220419223906
@@ -0,0 +1 @@
+ea53a3b454314f6f87f33659f30e408fb4be4b17b9aac36cee2c19855f458802 \ No newline at end of file
diff --git a/db/schema_migrations/20220420034519 b/db/schema_migrations/20220420034519
new file mode 100644
index 00000000000..0b46a4df4a9
--- /dev/null
+++ b/db/schema_migrations/20220420034519
@@ -0,0 +1 @@
+8ce9e197aa590d01755541a9f1c53d6835a9d4ae389e011c5050778d19e80f00 \ No newline at end of file
diff --git a/db/schema_migrations/20220420061439 b/db/schema_migrations/20220420061439
new file mode 100644
index 00000000000..cde4753761c
--- /dev/null
+++ b/db/schema_migrations/20220420061439
@@ -0,0 +1 @@
+02ff5492367d5a0b0f6b1164c33a9fe0475e72b8fba5d2f8affc4c5a118d4192 \ No newline at end of file
diff --git a/db/schema_migrations/20220420061450 b/db/schema_migrations/20220420061450
new file mode 100644
index 00000000000..04ee97a7e4d
--- /dev/null
+++ b/db/schema_migrations/20220420061450
@@ -0,0 +1 @@
+17046780fbe87b7eab87034dfffed239b9da48b5ef78dd1c547575158fc1d37f \ No newline at end of file
diff --git a/db/schema_migrations/20220420135245 b/db/schema_migrations/20220420135245
new file mode 100644
index 00000000000..65ac71d8af3
--- /dev/null
+++ b/db/schema_migrations/20220420135245
@@ -0,0 +1 @@
+8b3978648b92209ac691d014e1f54a7aa6a9023163094593d64d2b8e54b7248e \ No newline at end of file
diff --git a/db/schema_migrations/20220420135946 b/db/schema_migrations/20220420135946
new file mode 100644
index 00000000000..55bd78a0373
--- /dev/null
+++ b/db/schema_migrations/20220420135946
@@ -0,0 +1 @@
+de813cf367628504ac0a017fa600725042c4653574c15eda52db21531ce7d39c \ No newline at end of file
diff --git a/db/schema_migrations/20220420173247 b/db/schema_migrations/20220420173247
new file mode 100644
index 00000000000..9ab6dac867e
--- /dev/null
+++ b/db/schema_migrations/20220420173247
@@ -0,0 +1 @@
+a4113363674f268a3beaef22e29b2aba4e5ba7566bc47dc5676ddc8f8733d331 \ No newline at end of file
diff --git a/db/schema_migrations/20220420192542 b/db/schema_migrations/20220420192542
new file mode 100644
index 00000000000..fe62709c7a7
--- /dev/null
+++ b/db/schema_migrations/20220420192542
@@ -0,0 +1 @@
+f9f2dc1f24f02571a7919da72b78e54922fd4fe202bc326235485610264d137c \ No newline at end of file
diff --git a/db/schema_migrations/20220420214703 b/db/schema_migrations/20220420214703
new file mode 100644
index 00000000000..ff519126cc2
--- /dev/null
+++ b/db/schema_migrations/20220420214703
@@ -0,0 +1 @@
+fdf562fd8681b104ef91842e036b1153e7a4786529bcd2e35fcb964ecd25345e \ No newline at end of file
diff --git a/db/schema_migrations/20220421114418 b/db/schema_migrations/20220421114418
new file mode 100644
index 00000000000..48a1862b29b
--- /dev/null
+++ b/db/schema_migrations/20220421114418
@@ -0,0 +1 @@
+33f834b8588ad7a618f39668b2546d0945d283c005e6b822a870d6bf5a8ea03d \ No newline at end of file
diff --git a/db/schema_migrations/20220421141342 b/db/schema_migrations/20220421141342
new file mode 100644
index 00000000000..f28b4c06a1d
--- /dev/null
+++ b/db/schema_migrations/20220421141342
@@ -0,0 +1 @@
+cd332bdb33335750855cd0d6e49bed12a841defa24bc5ffb14ad49a39bd663aa \ No newline at end of file
diff --git a/db/schema_migrations/20220421144758 b/db/schema_migrations/20220421144758
new file mode 100644
index 00000000000..225aaeb5a01
--- /dev/null
+++ b/db/schema_migrations/20220421144758
@@ -0,0 +1 @@
+e774ed2d502ce6ef749a048894fa81a51ec521a3bbf8420709b82a6d72058e61 \ No newline at end of file
diff --git a/db/schema_migrations/20220421180321 b/db/schema_migrations/20220421180321
new file mode 100644
index 00000000000..b2ffb29adf1
--- /dev/null
+++ b/db/schema_migrations/20220421180321
@@ -0,0 +1 @@
+71cde7610713f9e2e21f87a2176cc4ec5fdc797021edab144adfaaf463acb8ef \ No newline at end of file
diff --git a/db/schema_migrations/20220422121443 b/db/schema_migrations/20220422121443
new file mode 100644
index 00000000000..79a69c6af87
--- /dev/null
+++ b/db/schema_migrations/20220422121443
@@ -0,0 +1 @@
+5febc5341ccfd930c8dbc77ca2b2bbadb351444a616e657f8ce8cd477c73280f \ No newline at end of file
diff --git a/db/schema_migrations/20220422200633 b/db/schema_migrations/20220422200633
new file mode 100644
index 00000000000..3cb52317fa0
--- /dev/null
+++ b/db/schema_migrations/20220422200633
@@ -0,0 +1 @@
+666eff0892b795c7f1a84dfcdb6fad6266f952bb91b69c81e803d16ecdc0d11d \ No newline at end of file
diff --git a/db/schema_migrations/20220422220507 b/db/schema_migrations/20220422220507
new file mode 100644
index 00000000000..cd9385a2ec1
--- /dev/null
+++ b/db/schema_migrations/20220422220507
@@ -0,0 +1 @@
+4042ca84ca23fafa3943705704c68606f1c423832395170d93988f90255c3249 \ No newline at end of file
diff --git a/db/schema_migrations/20220425111114 b/db/schema_migrations/20220425111114
new file mode 100644
index 00000000000..ca0b2c6f908
--- /dev/null
+++ b/db/schema_migrations/20220425111114
@@ -0,0 +1 @@
+a9ba21d5f1fcff29b0f14d5bab99dd867ec101667f021914da845e286aabe2a5 \ No newline at end of file
diff --git a/db/schema_migrations/20220425111453 b/db/schema_migrations/20220425111453
new file mode 100644
index 00000000000..45326d41fdd
--- /dev/null
+++ b/db/schema_migrations/20220425111453
@@ -0,0 +1 @@
+30d5d5538f965562f594a78b9430a11ea87ea900216ee9c03df422ea47de8f0c \ No newline at end of file
diff --git a/db/schema_migrations/20220425120604 b/db/schema_migrations/20220425120604
new file mode 100644
index 00000000000..dd68ec935d8
--- /dev/null
+++ b/db/schema_migrations/20220425120604
@@ -0,0 +1 @@
+56ebfb7a97217af23f12db7f93c47104be30da7633a22caf9e74547d5a27d29b \ No newline at end of file
diff --git a/db/schema_migrations/20220425121410 b/db/schema_migrations/20220425121410
new file mode 100644
index 00000000000..8b8b6029483
--- /dev/null
+++ b/db/schema_migrations/20220425121410
@@ -0,0 +1 @@
+73ab85c5ef724f6aba4a964f42e586db0a198affd134ba598189629fb95989a4 \ No newline at end of file
diff --git a/db/schema_migrations/20220425121435 b/db/schema_migrations/20220425121435
new file mode 100644
index 00000000000..d62359b6bef
--- /dev/null
+++ b/db/schema_migrations/20220425121435
@@ -0,0 +1 @@
+fd00d3d8104cba09134853976cf4f1dea7abb5e1dd2c4ea8b46adc4742c71030 \ No newline at end of file
diff --git a/db/schema_migrations/20220426130217 b/db/schema_migrations/20220426130217
new file mode 100644
index 00000000000..d8df97c8516
--- /dev/null
+++ b/db/schema_migrations/20220426130217
@@ -0,0 +1 @@
+5a55099d1f50c3059778e340bbbe519d4fcd6c1eefb235191f8db02f92b7b49e \ No newline at end of file
diff --git a/db/schema_migrations/20220426185933 b/db/schema_migrations/20220426185933
new file mode 100644
index 00000000000..46a67db3499
--- /dev/null
+++ b/db/schema_migrations/20220426185933
@@ -0,0 +1 @@
+56001affed339a7184ee20c7e34707aa33ba405db4f83d8926228b1bf72d5af8 \ No newline at end of file
diff --git a/db/schema_migrations/20220428133724 b/db/schema_migrations/20220428133724
new file mode 100644
index 00000000000..9b9f36980f1
--- /dev/null
+++ b/db/schema_migrations/20220428133724
@@ -0,0 +1 @@
+9daf43ece9531540c942ade3939bf86f332701af8a9a0e50bd8ef3b90322baa2 \ No newline at end of file
diff --git a/db/schema_migrations/20220502015011 b/db/schema_migrations/20220502015011
new file mode 100644
index 00000000000..dff75369b56
--- /dev/null
+++ b/db/schema_migrations/20220502015011
@@ -0,0 +1 @@
+fbc4aa4bc958a5b3d9b184d459e1e540a5f83f01c5a8206d9546ccb28817c143 \ No newline at end of file
diff --git a/db/schema_migrations/20220502125053 b/db/schema_migrations/20220502125053
new file mode 100644
index 00000000000..9b026e23576
--- /dev/null
+++ b/db/schema_migrations/20220502125053
@@ -0,0 +1 @@
+b87e7b69f4d88a5620180648568c499e6e86fe001a8cfd235eebf050d5cdc9a1 \ No newline at end of file
diff --git a/db/schema_migrations/20220502150408 b/db/schema_migrations/20220502150408
new file mode 100644
index 00000000000..2bab54bbe7d
--- /dev/null
+++ b/db/schema_migrations/20220502150408
@@ -0,0 +1 @@
+a730ff7969895be95e92fff5bb9b468ed407bd65bccb9daf40f892e18b4d18b6 \ No newline at end of file
diff --git a/db/schema_migrations/20220502152633 b/db/schema_migrations/20220502152633
new file mode 100644
index 00000000000..b5dd2256ac8
--- /dev/null
+++ b/db/schema_migrations/20220502152633
@@ -0,0 +1 @@
+f8f34dc48e55723d868d1a247a92731ed1f1d5d185791c3202d0ed2cdedb41d3 \ No newline at end of file
diff --git a/db/schema_migrations/20220502173045 b/db/schema_migrations/20220502173045
new file mode 100644
index 00000000000..d17f403df8d
--- /dev/null
+++ b/db/schema_migrations/20220502173045
@@ -0,0 +1 @@
+893f211ebd0dceae4e375e644ed6213a066fe8b5985f226f5f256651fdd4b483 \ No newline at end of file
diff --git a/db/schema_migrations/20220503073401 b/db/schema_migrations/20220503073401
new file mode 100644
index 00000000000..bccca17138b
--- /dev/null
+++ b/db/schema_migrations/20220503073401
@@ -0,0 +1 @@
+3e05b07c5a3a0912884e0bdda08e0f4ef93ce95b6e3f5deb30b10eca74c6ea79 \ No newline at end of file
diff --git a/db/schema_migrations/20220503102855 b/db/schema_migrations/20220503102855
new file mode 100644
index 00000000000..e63b6ebe429
--- /dev/null
+++ b/db/schema_migrations/20220503102855
@@ -0,0 +1 @@
+e573f8f4ebca77bae3f3ecc68d4e5a9fe015f4a1040e72615b74cc158a7f7e5f \ No newline at end of file
diff --git a/db/schema_migrations/20220503114353 b/db/schema_migrations/20220503114353
new file mode 100644
index 00000000000..26c027548eb
--- /dev/null
+++ b/db/schema_migrations/20220503114353
@@ -0,0 +1 @@
+2750d11c933db0404f9a32ea5c8a7f028e07f720f83b288e9476c33326ec63c5 \ No newline at end of file
diff --git a/db/schema_migrations/20220503134610 b/db/schema_migrations/20220503134610
new file mode 100644
index 00000000000..555f0dbcc0d
--- /dev/null
+++ b/db/schema_migrations/20220503134610
@@ -0,0 +1 @@
+0e38608a14abd18ab257531f11e31e0a5d7d3801d9725ae02731b6b5ce881db7 \ No newline at end of file
diff --git a/db/schema_migrations/20220504042847 b/db/schema_migrations/20220504042847
new file mode 100644
index 00000000000..e27d4835f51
--- /dev/null
+++ b/db/schema_migrations/20220504042847
@@ -0,0 +1 @@
+cf3c125a0a8e8410abac5aaa68289d9548f77c29c2e46f1e93299fba5ba77a2b \ No newline at end of file
diff --git a/db/schema_migrations/20220504083348 b/db/schema_migrations/20220504083348
new file mode 100644
index 00000000000..ef9c042e036
--- /dev/null
+++ b/db/schema_migrations/20220504083348
@@ -0,0 +1 @@
+bb01480d2108f02bb6adcc671afc40de88655644e78397f1395fbb5af32cd24a \ No newline at end of file
diff --git a/db/schema_migrations/20220504083836 b/db/schema_migrations/20220504083836
new file mode 100644
index 00000000000..cfde07ab90d
--- /dev/null
+++ b/db/schema_migrations/20220504083836
@@ -0,0 +1 @@
+686d7d3266e7df938827f34a65fe73c0b92d0a76df34789751e609627a0768f6 \ No newline at end of file
diff --git a/db/schema_migrations/20220504084136 b/db/schema_migrations/20220504084136
new file mode 100644
index 00000000000..49ed93714c2
--- /dev/null
+++ b/db/schema_migrations/20220504084136
@@ -0,0 +1 @@
+6d4b1755e342c6608b95d7abca028353d2f0e84efb63e06b9cc230c23f737565 \ No newline at end of file
diff --git a/db/schema_migrations/20220504140036 b/db/schema_migrations/20220504140036
new file mode 100644
index 00000000000..34f7f6b4ea9
--- /dev/null
+++ b/db/schema_migrations/20220504140036
@@ -0,0 +1 @@
+726f09e0f6dd7f53a5e1928c9cb86e1499a9af7d84fe6d4cab847ab54db12711 \ No newline at end of file
diff --git a/db/schema_migrations/20220505022001 b/db/schema_migrations/20220505022001
new file mode 100644
index 00000000000..cfa4871ffbd
--- /dev/null
+++ b/db/schema_migrations/20220505022001
@@ -0,0 +1 @@
+4d93c3c0234171212aca73b7f3ed471a918fd30091e76e3427696c41c2842fce \ No newline at end of file
diff --git a/db/schema_migrations/20220505044348 b/db/schema_migrations/20220505044348
new file mode 100644
index 00000000000..0c537719a8f
--- /dev/null
+++ b/db/schema_migrations/20220505044348
@@ -0,0 +1 @@
+50c34d341ad1d989b865e2d9f6ac11d19e18c756436b8385518d1210bc2e6fe1 \ No newline at end of file
diff --git a/db/schema_migrations/20220505053504 b/db/schema_migrations/20220505053504
new file mode 100644
index 00000000000..5a1594ccac7
--- /dev/null
+++ b/db/schema_migrations/20220505053504
@@ -0,0 +1 @@
+e1b5a06c0a72e361d308f599d446125aaf5882a986423cc0b29c5faa9bc3954b \ No newline at end of file
diff --git a/db/schema_migrations/20220505060011 b/db/schema_migrations/20220505060011
new file mode 100644
index 00000000000..dd31c727827
--- /dev/null
+++ b/db/schema_migrations/20220505060011
@@ -0,0 +1 @@
+aa0e6f29d918bff13cbf499e465f63320dbb6ed5a6940c2c438fe015dcc7fcd6 \ No newline at end of file
diff --git a/db/schema_migrations/20220505092254 b/db/schema_migrations/20220505092254
new file mode 100644
index 00000000000..b720f68248e
--- /dev/null
+++ b/db/schema_migrations/20220505092254
@@ -0,0 +1 @@
+d37359ba5f697c4aaec738073c7705a64b54b97d2548f72571f3cb33848cfc3b \ No newline at end of file
diff --git a/db/schema_migrations/20220505174658 b/db/schema_migrations/20220505174658
new file mode 100644
index 00000000000..67dfd7ca827
--- /dev/null
+++ b/db/schema_migrations/20220505174658
@@ -0,0 +1 @@
+57dd9ed105c0380b660e8cc450848b8662bf6a41e47cbfac1bcc061934cbc24c \ No newline at end of file
diff --git a/db/schema_migrations/20220505193512 b/db/schema_migrations/20220505193512
new file mode 100644
index 00000000000..635cf9dd443
--- /dev/null
+++ b/db/schema_migrations/20220505193512
@@ -0,0 +1 @@
+bad94788a101a4567442e4e5a008896323ef00f7c0a98e4439e3b58e2095f30e \ No newline at end of file
diff --git a/db/schema_migrations/20220506180411 b/db/schema_migrations/20220506180411
new file mode 100644
index 00000000000..44b12faf69e
--- /dev/null
+++ b/db/schema_migrations/20220506180411
@@ -0,0 +1 @@
+c8d61ae69828d0f234473092ea4a481e05aeffb61f777c5085836558f2fbe062 \ No newline at end of file
diff --git a/db/schema_migrations/20220506201639 b/db/schema_migrations/20220506201639
new file mode 100644
index 00000000000..5aba0b7c055
--- /dev/null
+++ b/db/schema_migrations/20220506201639
@@ -0,0 +1 @@
+ddc86a14dbd512ee87654fa12fc2ef55f0f705341f628c2b26d0a80b6b2708a0 \ No newline at end of file
diff --git a/db/schema_migrations/20220507204024 b/db/schema_migrations/20220507204024
new file mode 100644
index 00000000000..510badf30ea
--- /dev/null
+++ b/db/schema_migrations/20220507204024
@@ -0,0 +1 @@
+8014dcf24ac2f1171240daa349e0552cb313b06f756b84e09a16d76a8810132a \ No newline at end of file
diff --git a/db/schema_migrations/20220510003916 b/db/schema_migrations/20220510003916
new file mode 100644
index 00000000000..35584f5f55f
--- /dev/null
+++ b/db/schema_migrations/20220510003916
@@ -0,0 +1 @@
+ccafdc28ff28fc758fe67084f3a837c72f91470467bda2acdb6282de89b46e34 \ No newline at end of file
diff --git a/db/schema_migrations/20220510004501 b/db/schema_migrations/20220510004501
new file mode 100644
index 00000000000..6342258af5d
--- /dev/null
+++ b/db/schema_migrations/20220510004501
@@ -0,0 +1 @@
+ef9c231a917e4beacff9689c4bbfea0885c4223d3d8b59823a5ffac7f3b2364f \ No newline at end of file
diff --git a/db/schema_migrations/20220511090324 b/db/schema_migrations/20220511090324
new file mode 100644
index 00000000000..186512ca91a
--- /dev/null
+++ b/db/schema_migrations/20220511090324
@@ -0,0 +1 @@
+4904ea4034a58dadb9b84deaade823f1e50085b5a4bce69da7fa44c38e588858 \ No newline at end of file
diff --git a/db/schema_migrations/20220511151646 b/db/schema_migrations/20220511151646
new file mode 100644
index 00000000000..d6ff140cdf8
--- /dev/null
+++ b/db/schema_migrations/20220511151646
@@ -0,0 +1 @@
+cf49c37edf23372a0117895bd2036cefd42616871f42511c6ecbe03a47b96e9f \ No newline at end of file
diff --git a/db/schema_migrations/20220511152439 b/db/schema_migrations/20220511152439
new file mode 100644
index 00000000000..f58f97f4962
--- /dev/null
+++ b/db/schema_migrations/20220511152439
@@ -0,0 +1 @@
+ef899952453ddd870c45f2b4eded754152972944037309cf96701fe27a5db6cb \ No newline at end of file
diff --git a/db/schema_migrations/20220511191502 b/db/schema_migrations/20220511191502
new file mode 100644
index 00000000000..caebd721aa6
--- /dev/null
+++ b/db/schema_migrations/20220511191502
@@ -0,0 +1 @@
+432214f4683800e1f5b5e42d05d9a6de07c317fec0dffd6b1eb312ccfd437e0c \ No newline at end of file
diff --git a/db/schema_migrations/20220511191503 b/db/schema_migrations/20220511191503
new file mode 100644
index 00000000000..c8860c56eb6
--- /dev/null
+++ b/db/schema_migrations/20220511191503
@@ -0,0 +1 @@
+dd2733b77f86e108c5015edcdbc715dd011b00479828a7087af9120cc5ae5661 \ No newline at end of file
diff --git a/db/schema_migrations/20220513043344 b/db/schema_migrations/20220513043344
new file mode 100644
index 00000000000..af72eebc3b9
--- /dev/null
+++ b/db/schema_migrations/20220513043344
@@ -0,0 +1 @@
+33928e6cb39e42efae6c8bc12291317a08197c0fe5a1f912aac8972eabc96de7 \ No newline at end of file
diff --git a/db/schema_migrations/20220517144749 b/db/schema_migrations/20220517144749
new file mode 100644
index 00000000000..99f5bf6730a
--- /dev/null
+++ b/db/schema_migrations/20220517144749
@@ -0,0 +1 @@
+437e4ddcf1e6071a37ab1d407108c98fedd4f93ed1d975d2306440318f67c996 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index c226da842c3..fa9d9e8f778 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -89,14 +89,6 @@ RETURN NULL;
END
$$;
-CREATE FUNCTION integrations_set_type_new() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
-BEGIN
-UPDATE integrations SET type_new = COALESCE(NEW.type_new, regexp_replace(NEW.type, '\A(.+)Service\Z', 'Integrations::\1')) , type = COALESCE(NEW.type, regexp_replace(NEW.type_new, '\AIntegrations::(.+)\Z', '\1Service')) WHERE integrations.id = NEW.id; RETURN NULL;
-END
-$$;
-
CREATE FUNCTION next_traversal_ids_sibling(traversal_ids integer[]) RETURNS integer[]
LANGUAGE plpgsql IMMUTABLE STRICT
AS $$
@@ -106,6 +98,30 @@ BEGIN
END;
$$;
+CREATE FUNCTION nullify_merge_request_metrics_build_data() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+IF (OLD.pipeline_id IS NOT NULL) AND (NEW.pipeline_id IS NULL) THEN
+ NEW.latest_build_started_at = NULL;
+ NEW.latest_build_finished_at = NULL;
+END IF;
+RETURN NEW;
+
+END
+$$;
+
+CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS TABLE(query text, query_start timestamp with time zone)
+ LANGUAGE sql SECURITY DEFINER
+ SET search_path TO 'pg_catalog', 'pg_temp'
+ AS $$
+ SELECT query, query_start
+ FROM pg_stat_activity
+ WHERE datname = current_database()
+ AND state = 'active'
+ AND backend_type = 'autovacuum worker'
+$$;
+
CREATE FUNCTION set_has_external_issue_tracker() RETURNS trigger
LANGUAGE plpgsql
AS $$
@@ -10645,6 +10661,14 @@ CREATE TABLE analytics_cycle_analytics_aggregations (
last_full_issues_updated_at timestamp with time zone,
last_full_issues_id integer,
last_full_merge_requests_id integer,
+ last_consistency_check_issues_stage_event_hash_id bigint,
+ last_consistency_check_issues_start_event_timestamp timestamp with time zone,
+ last_consistency_check_issues_end_event_timestamp timestamp with time zone,
+ last_consistency_check_issues_issuable_id bigint,
+ last_consistency_check_merge_requests_stage_event_hash_id bigint,
+ last_consistency_check_merge_requests_start_event_timestamp timestamp with time zone,
+ last_consistency_check_merge_requests_end_event_timestamp timestamp with time zone,
+ last_consistency_check_merge_requests_issuable_id bigint,
CONSTRAINT chk_rails_1ef688e577 CHECK ((cardinality(incremental_runtimes_in_seconds) <= 10)),
CONSTRAINT chk_rails_7810292ec9 CHECK ((cardinality(last_full_run_processed_records) <= 10)),
CONSTRAINT chk_rails_8b9e89687c CHECK ((cardinality(last_full_run_runtimes_in_seconds) <= 10)),
@@ -10784,7 +10808,6 @@ CREATE TABLE analytics_devops_adoption_snapshots (
runner_configured boolean NOT NULL,
pipeline_succeeded boolean NOT NULL,
deploy_succeeded boolean NOT NULL,
- security_scan_succeeded boolean,
end_time timestamp with time zone NOT NULL,
total_projects_count integer,
code_owners_used_count integer,
@@ -11274,6 +11297,14 @@ CREATE TABLE application_settings (
inactive_projects_delete_after_months integer DEFAULT 2 NOT NULL,
inactive_projects_min_size_mb integer DEFAULT 0 NOT NULL,
inactive_projects_send_warning_email_after_months integer DEFAULT 1 NOT NULL,
+ delayed_group_deletion boolean DEFAULT true NOT NULL,
+ arkose_labs_namespace text DEFAULT 'client'::text NOT NULL,
+ max_export_size integer DEFAULT 0,
+ encrypted_slack_app_signing_secret bytea,
+ encrypted_slack_app_signing_secret_iv bytea,
+ container_registry_pre_import_timeout integer DEFAULT 1800 NOT NULL,
+ container_registry_import_timeout integer DEFAULT 600 NOT NULL,
+ pipeline_limit_per_project_user_sha integer DEFAULT 0 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_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)),
@@ -11295,6 +11326,7 @@ CREATE TABLE application_settings (
CONSTRAINT check_5bcba483c4 CHECK ((char_length(sentry_environment) <= 255)),
CONSTRAINT check_718b4458ae CHECK ((char_length(personal_access_token_prefix) <= 20)),
CONSTRAINT check_7227fad848 CHECK ((char_length(rate_limiting_response_text) <= 255)),
+ CONSTRAINT check_7ccfe2764a CHECK ((char_length(arkose_labs_namespace) <= 255)),
CONSTRAINT check_85a39b68ff CHECK ((char_length(encrypted_ci_jwt_signing_key_iv) <= 255)),
CONSTRAINT check_8dca35398a CHECK ((char_length(public_runner_releases_url) <= 255)),
CONSTRAINT check_9a719834eb CHECK ((char_length(secret_detection_token_revocation_url) <= 255)),
@@ -11729,7 +11761,7 @@ CREATE TABLE batched_background_migrations (
batch_class_name text DEFAULT 'PrimaryKeyBatchingStrategy'::text NOT NULL,
table_name text NOT NULL,
column_name text NOT NULL,
- job_arguments jsonb DEFAULT '"[]"'::jsonb NOT NULL,
+ job_arguments jsonb DEFAULT '[]'::jsonb NOT NULL,
total_tuple_count bigint,
pause_ms integer DEFAULT 100 NOT NULL,
max_batch_size integer,
@@ -12368,7 +12400,6 @@ CREATE TABLE ci_builds_metadata (
secrets jsonb DEFAULT '{}'::jsonb NOT NULL,
build_id bigint NOT NULL,
id bigint NOT NULL,
- runner_features jsonb DEFAULT '{}'::jsonb NOT NULL,
runtime_runner_features jsonb DEFAULT '{}'::jsonb NOT NULL
);
@@ -13017,6 +13048,7 @@ CREATE TABLE ci_runners (
executor_type smallint,
maintainer_note text,
token_expires_at timestamp with time zone,
+ allowed_plans text[] DEFAULT '{}'::text[] NOT NULL,
CONSTRAINT check_ce275cee06 CHECK ((char_length(maintainer_note) <= 1024))
);
@@ -13757,6 +13789,7 @@ CREATE TABLE container_repositories (
migration_state text DEFAULT 'default'::text NOT NULL,
migration_aborted_in_state text,
migration_plan text,
+ last_cleanup_deleted_tags_count integer,
CONSTRAINT check_05e9012f36 CHECK ((char_length(migration_plan) <= 255)),
CONSTRAINT check_13c58fe73a CHECK ((char_length(migration_state) <= 255)),
CONSTRAINT check_97f0249439 CHECK ((char_length(migration_aborted_in_state) <= 255))
@@ -15148,7 +15181,6 @@ CREATE TABLE geo_event_log (
hashed_storage_migrated_event_id bigint,
lfs_object_deleted_event_id bigint,
hashed_storage_attachments_event_id bigint,
- job_artifact_deleted_event_id bigint,
reset_checksum_event_id bigint,
cache_invalidation_event_id bigint,
container_repository_updated_event_id bigint,
@@ -15220,21 +15252,6 @@ CREATE SEQUENCE geo_hashed_storage_migrated_events_id_seq
ALTER SEQUENCE geo_hashed_storage_migrated_events_id_seq OWNED BY geo_hashed_storage_migrated_events.id;
-CREATE TABLE geo_job_artifact_deleted_events (
- id bigint NOT NULL,
- file_path character varying NOT NULL,
- job_artifact_id bigint NOT NULL
-);
-
-CREATE SEQUENCE geo_job_artifact_deleted_events_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE geo_job_artifact_deleted_events_id_seq OWNED BY geo_job_artifact_deleted_events.id;
-
CREATE TABLE geo_lfs_object_deleted_events (
id bigint NOT NULL,
lfs_object_id integer NOT NULL,
@@ -15515,6 +15532,7 @@ CREATE TABLE gitlab_subscriptions (
seats_in_use integer DEFAULT 0 NOT NULL,
seats_owed integer DEFAULT 0 NOT NULL,
trial_extension_type smallint,
+ max_seats_used_changed_at timestamp with time zone,
CONSTRAINT check_77fea3f0e7 CHECK ((namespace_id IS NOT NULL))
);
@@ -15654,7 +15672,7 @@ CREATE TABLE group_deploy_keys (
expires_at timestamp with time zone,
key text NOT NULL,
title text,
- fingerprint text NOT NULL,
+ fingerprint text,
fingerprint_sha256 bytea,
CONSTRAINT check_cc0365908d CHECK ((char_length(title) <= 255)),
CONSTRAINT check_e4526dcf91 CHECK ((char_length(fingerprint) <= 255)),
@@ -15877,10 +15895,13 @@ CREATE TABLE in_product_marketing_emails (
id bigint NOT NULL,
user_id bigint NOT NULL,
cta_clicked_at timestamp with time zone,
- track smallint NOT NULL,
- series smallint NOT NULL,
+ track smallint,
+ series smallint,
created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL
+ updated_at timestamp with time zone NOT NULL,
+ campaign text,
+ CONSTRAINT check_9d8b29f74f CHECK ((char_length(campaign) <= 255)),
+ CONSTRAINT in_product_marketing_emails_track_and_series_or_campaign CHECK ((((track IS NOT NULL) AND (series IS NOT NULL) AND (campaign IS NULL)) OR ((track IS NULL) AND (series IS NULL) AND (campaign IS NOT NULL))))
);
CREATE SEQUENCE in_product_marketing_emails_id_seq
@@ -16117,7 +16138,6 @@ ALTER SEQUENCE insights_id_seq OWNED BY insights.id;
CREATE TABLE integrations (
id integer NOT NULL,
- type character varying,
project_id integer,
created_at timestamp without time zone,
updated_at timestamp without time zone,
@@ -17337,6 +17357,11 @@ CREATE TABLE namespace_aggregation_schedules (
namespace_id integer NOT NULL
);
+CREATE TABLE namespace_ci_cd_settings (
+ namespace_id bigint NOT NULL,
+ allow_stale_runner_pruning boolean DEFAULT false NOT NULL
+);
+
CREATE TABLE namespace_limits (
additional_purchased_storage_size bigint DEFAULT 0 NOT NULL,
additional_purchased_storage_ends_on date,
@@ -17367,7 +17392,8 @@ CREATE TABLE namespace_root_storage_statistics (
pipeline_artifacts_size bigint DEFAULT 0 NOT NULL,
uploads_size bigint DEFAULT 0 NOT NULL,
dependency_proxy_size bigint DEFAULT 0 NOT NULL,
- notification_level smallint DEFAULT 100 NOT NULL
+ notification_level smallint DEFAULT 100 NOT NULL,
+ container_registry_size bigint DEFAULT 0 NOT NULL
);
CREATE TABLE namespace_settings (
@@ -17388,6 +17414,7 @@ CREATE TABLE namespace_settings (
runner_token_expiration_interval integer,
subgroup_runner_token_expiration_interval integer,
project_runner_token_expiration_interval integer,
+ exclude_from_free_user_cap boolean DEFAULT false NOT NULL,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
@@ -17861,6 +17888,15 @@ CREATE SEQUENCE packages_build_infos_id_seq
ALTER SEQUENCE packages_build_infos_id_seq OWNED BY packages_build_infos.id;
+CREATE TABLE packages_cleanup_policies (
+ created_at timestamp with time zone NOT NULL,
+ updated_at timestamp with time zone NOT NULL,
+ project_id bigint NOT NULL,
+ next_run_at timestamp with time zone,
+ keep_n_duplicated_package_files text DEFAULT 'all'::text NOT NULL,
+ CONSTRAINT check_e53f35ab7b CHECK ((char_length(keep_n_duplicated_package_files) <= 255))
+);
+
CREATE TABLE packages_composer_cache_files (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@@ -18728,6 +18764,22 @@ CREATE SEQUENCE postgres_async_indexes_id_seq
ALTER SEQUENCE postgres_async_indexes_id_seq OWNED BY postgres_async_indexes.id;
+CREATE VIEW postgres_autovacuum_activity AS
+ WITH processes AS (
+ SELECT postgres_pg_stat_activity_autovacuum.query,
+ postgres_pg_stat_activity_autovacuum.query_start,
+ regexp_matches(postgres_pg_stat_activity_autovacuum.query, '^autovacuum: VACUUM (w+).(w+)'::text) AS matches
+ FROM postgres_pg_stat_activity_autovacuum() postgres_pg_stat_activity_autovacuum(query, query_start)
+ WHERE (postgres_pg_stat_activity_autovacuum.query ~* '^autovacuum: VACUUM w+.w+'::text)
+ )
+ SELECT ((processes.matches[1] || '.'::text) || processes.matches[2]) AS table_identifier,
+ processes.matches[1] AS schema,
+ processes.matches[2] AS "table",
+ processes.query_start AS vacuum_start
+ FROM processes;
+
+COMMENT ON VIEW postgres_autovacuum_activity IS 'Contains information about PostgreSQL backends currently performing autovacuum operations on the tables indicated here.';
+
CREATE VIEW postgres_foreign_keys AS
SELECT pg_constraint.oid,
pg_constraint.conname AS name,
@@ -19054,7 +19106,8 @@ CREATE TABLE project_ci_cd_settings (
keep_latest_artifact boolean DEFAULT true NOT NULL,
restrict_user_defined_variables boolean DEFAULT false NOT NULL,
job_token_scope_enabled boolean DEFAULT false NOT NULL,
- runner_token_expiration_interval integer
+ runner_token_expiration_interval integer,
+ separated_caches boolean DEFAULT true NOT NULL
);
CREATE SEQUENCE project_ci_cd_settings_id_seq
@@ -19338,7 +19391,9 @@ CREATE TABLE project_repository_states (
repository_retry_count integer,
wiki_retry_count integer,
last_repository_verification_ran_at timestamp with time zone,
- last_wiki_verification_ran_at timestamp with time zone
+ last_wiki_verification_ran_at timestamp with time zone,
+ last_repository_updated_at timestamp with time zone,
+ last_wiki_updated_at timestamp with time zone
);
CREATE SEQUENCE project_repository_states_id_seq
@@ -19410,6 +19465,7 @@ CREATE TABLE project_settings (
squash_commit_template text,
legacy_open_source_license_available boolean DEFAULT true NOT NULL,
target_platforms character varying[] DEFAULT '{}'::character varying[] NOT NULL,
+ enforce_auth_checks_on_uploads boolean DEFAULT true NOT NULL,
CONSTRAINT check_3a03e7557a CHECK ((char_length(previous_default_branch) <= 4096)),
CONSTRAINT check_b09644994b CHECK ((char_length(squash_commit_template) <= 500)),
CONSTRAINT check_bde223416c CHECK ((show_default_award_emojis IS NOT NULL)),
@@ -19738,6 +19794,7 @@ CREATE TABLE protected_environment_approval_rules (
updated_at timestamp with time zone NOT NULL,
access_level smallint,
required_approvals smallint NOT NULL,
+ group_inheritance_type smallint DEFAULT 0 NOT NULL,
CONSTRAINT chk_rails_bed75249bc CHECK ((((access_level IS NOT NULL) AND (group_id IS NULL) AND (user_id IS NULL)) OR ((user_id IS NOT NULL) AND (access_level IS NULL) AND (group_id IS NULL)) OR ((group_id IS NOT NULL) AND (user_id IS NULL) AND (access_level IS NULL)))),
CONSTRAINT chk_rails_cfa90ae3b5 CHECK ((required_approvals > 0))
);
@@ -19758,7 +19815,8 @@ CREATE TABLE protected_environment_deploy_access_levels (
access_level integer DEFAULT 40,
protected_environment_id integer NOT NULL,
user_id integer,
- group_id integer
+ group_id integer,
+ group_inheritance_type smallint DEFAULT 0 NOT NULL
);
CREATE SEQUENCE protected_environment_deploy_access_levels_id_seq
@@ -20050,7 +20108,6 @@ ALTER SEQUENCE requirements_id_seq OWNED BY requirements.id;
CREATE TABLE requirements_management_test_reports (
id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
- requirement_id bigint,
author_id bigint,
state smallint NOT NULL,
build_id bigint,
@@ -20542,7 +20599,11 @@ CREATE TABLE slack_integrations (
alias character varying NOT NULL,
user_id character varying NOT NULL,
created_at timestamp without time zone NOT NULL,
- updated_at timestamp without time zone NOT NULL
+ updated_at timestamp without time zone NOT NULL,
+ bot_user_id text,
+ encrypted_bot_access_token bytea,
+ encrypted_bot_access_token_iv bytea,
+ CONSTRAINT check_bc553aea8a CHECK ((char_length(bot_user_id) <= 255))
);
CREATE SEQUENCE slack_integrations_id_seq
@@ -21048,6 +21109,8 @@ CREATE TABLE topics (
description text,
total_projects_count bigint DEFAULT 0 NOT NULL,
non_private_projects_count bigint DEFAULT 0 NOT NULL,
+ title text,
+ CONSTRAINT check_223b50f9be CHECK ((char_length(title) <= 255)),
CONSTRAINT check_26753fb43a CHECK ((char_length(avatar) <= 255)),
CONSTRAINT check_5d1a07c8c8 CHECK ((char_length(description) <= 1024)),
CONSTRAINT check_7a90d4c757 CHECK ((char_length(name) <= 255))
@@ -22663,8 +22726,6 @@ ALTER TABLE ONLY geo_hashed_storage_attachments_events ALTER COLUMN id SET DEFAU
ALTER TABLE ONLY geo_hashed_storage_migrated_events ALTER COLUMN id SET DEFAULT nextval('geo_hashed_storage_migrated_events_id_seq'::regclass);
-ALTER TABLE ONLY geo_job_artifact_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_job_artifact_deleted_events_id_seq'::regclass);
-
ALTER TABLE ONLY geo_lfs_object_deleted_events ALTER COLUMN id SET DEFAULT nextval('geo_lfs_object_deleted_events_id_seq'::regclass);
ALTER TABLE ONLY geo_node_namespace_links ALTER COLUMN id SET DEFAULT nextval('geo_node_namespace_links_id_seq'::regclass);
@@ -24504,9 +24565,6 @@ ALTER TABLE ONLY geo_hashed_storage_attachments_events
ALTER TABLE ONLY geo_hashed_storage_migrated_events
ADD CONSTRAINT geo_hashed_storage_migrated_events_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY geo_job_artifact_deleted_events
- ADD CONSTRAINT geo_job_artifact_deleted_events_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY geo_lfs_object_deleted_events
ADD CONSTRAINT geo_lfs_object_deleted_events_pkey PRIMARY KEY (id);
@@ -24697,7 +24755,7 @@ ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
ADD CONSTRAINT issues_self_managed_prometheus_alert_events_pkey PRIMARY KEY (issue_id, self_managed_prometheus_alert_event_id);
ALTER TABLE ONLY sprints
- ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint EXCLUDE USING gist (iterations_cadence_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((group_id IS NOT NULL));
+ ADD CONSTRAINT iteration_start_and_due_date_iterations_cadence_id_constraint EXCLUDE USING gist (iterations_cadence_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((group_id IS NOT NULL)) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE ONLY sprints
ADD CONSTRAINT iteration_start_and_due_daterange_project_id_constraint EXCLUDE USING gist (project_id WITH =, daterange(start_date, due_date, '[]'::text) WITH &&) WHERE ((project_id IS NOT NULL));
@@ -24831,6 +24889,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_ci_cd_settings
+ ADD CONSTRAINT namespace_ci_cd_settings_pkey PRIMARY KEY (namespace_id);
+
ALTER TABLE ONLY namespace_limits
ADD CONSTRAINT namespace_limits_pkey PRIMARY KEY (namespace_id);
@@ -24903,6 +24964,9 @@ ALTER TABLE ONLY operations_user_lists
ALTER TABLE ONLY packages_build_infos
ADD CONSTRAINT packages_build_infos_pkey PRIMARY KEY (id);
+ALTER TABLE ONLY packages_cleanup_policies
+ ADD CONSTRAINT packages_cleanup_policies_pkey PRIMARY KEY (project_id);
+
ALTER TABLE ONLY packages_composer_cache_files
ADD CONSTRAINT packages_composer_cache_files_pkey PRIMARY KEY (id);
@@ -27257,6 +27321,8 @@ CREATE INDEX index_ci_variables_on_key ON ci_variables USING btree (key);
CREATE UNIQUE INDEX index_ci_variables_on_project_id_and_key_and_environment_scope ON ci_variables USING btree (project_id, key, environment_scope);
+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_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);
@@ -27705,8 +27771,6 @@ CREATE INDEX index_geo_event_log_on_hashed_storage_attachments_event_id ON geo_e
CREATE INDEX index_geo_event_log_on_hashed_storage_migrated_event_id ON geo_event_log USING btree (hashed_storage_migrated_event_id) WHERE (hashed_storage_migrated_event_id IS NOT NULL);
-CREATE INDEX index_geo_event_log_on_job_artifact_deleted_event_id ON geo_event_log USING btree (job_artifact_deleted_event_id) WHERE (job_artifact_deleted_event_id IS NOT NULL);
-
CREATE INDEX index_geo_event_log_on_lfs_object_deleted_event_id ON geo_event_log USING btree (lfs_object_deleted_event_id) WHERE (lfs_object_deleted_event_id IS NOT NULL);
CREATE INDEX index_geo_event_log_on_repositories_changed_event_id ON geo_event_log USING btree (repositories_changed_event_id) WHERE (repositories_changed_event_id IS NOT NULL);
@@ -27725,8 +27789,6 @@ CREATE INDEX index_geo_hashed_storage_attachments_events_on_project_id ON geo_ha
CREATE INDEX index_geo_hashed_storage_migrated_events_on_project_id ON geo_hashed_storage_migrated_events USING btree (project_id);
-CREATE INDEX index_geo_job_artifact_deleted_events_on_job_artifact_id ON geo_job_artifact_deleted_events USING btree (job_artifact_id);
-
CREATE INDEX index_geo_lfs_object_deleted_events_on_lfs_object_id ON geo_lfs_object_deleted_events USING btree (lfs_object_id);
CREATE INDEX index_geo_node_namespace_links_on_geo_node_id ON geo_node_namespace_links USING btree (geo_node_id);
@@ -27809,9 +27871,9 @@ CREATE UNIQUE INDEX index_group_deploy_keys_group_on_group_deploy_key_and_group_
CREATE INDEX index_group_deploy_keys_groups_on_group_deploy_key_id ON group_deploy_keys_groups USING btree (group_deploy_key_id);
-CREATE UNIQUE INDEX index_group_deploy_keys_on_fingerprint ON group_deploy_keys USING btree (fingerprint);
+CREATE INDEX index_group_deploy_keys_on_fingerprint ON group_deploy_keys USING btree (fingerprint);
-CREATE INDEX index_group_deploy_keys_on_fingerprint_sha256 ON group_deploy_keys USING btree (fingerprint_sha256);
+CREATE UNIQUE INDEX index_group_deploy_keys_on_fingerprint_sha256_unique ON group_deploy_keys USING btree (fingerprint_sha256);
CREATE INDEX index_group_deploy_keys_on_user_id ON group_deploy_keys USING btree (user_id);
@@ -27821,7 +27883,7 @@ CREATE UNIQUE INDEX index_group_deploy_tokens_on_group_and_deploy_token_ids ON g
CREATE UNIQUE INDEX index_group_group_links_on_shared_group_and_shared_with_group ON group_group_links USING btree (shared_group_id, shared_with_group_id);
-CREATE INDEX index_group_group_links_on_shared_with_group_id ON group_group_links USING btree (shared_with_group_id);
+CREATE INDEX index_group_group_links_on_shared_with_group_and_shared_group ON group_group_links USING btree (shared_with_group_id, shared_group_id);
CREATE INDEX index_group_import_states_on_group_id ON group_import_states USING btree (group_id);
@@ -27879,6 +27941,8 @@ CREATE INDEX index_imported_projects_on_import_type_creator_id_created_at ON pro
CREATE INDEX index_imported_projects_on_import_type_id ON projects USING btree (import_type, id) WHERE (import_type IS NOT NULL);
+CREATE UNIQUE INDEX index_in_product_marketing_emails_on_user_campaign ON in_product_marketing_emails USING btree (user_id, campaign);
+
CREATE INDEX index_in_product_marketing_emails_on_user_id ON in_product_marketing_emails USING btree (user_id);
CREATE UNIQUE INDEX index_in_product_marketing_emails_on_user_track_series ON in_product_marketing_emails USING btree (user_id, track, series);
@@ -27915,26 +27979,14 @@ CREATE INDEX index_integrations_on_inherit_from_id ON integrations USING btree (
CREATE INDEX index_integrations_on_project_and_type_new_where_inherit_null ON integrations USING btree (project_id, type_new) WHERE (inherit_from_id IS NULL);
-CREATE INDEX index_integrations_on_project_and_type_where_inherit_null ON integrations USING btree (project_id, type) WHERE (inherit_from_id IS NULL);
-
CREATE UNIQUE INDEX index_integrations_on_project_id_and_type_new_unique ON integrations USING btree (project_id, type_new);
-CREATE UNIQUE INDEX index_integrations_on_project_id_and_type_unique ON integrations USING btree (project_id, type);
-
-CREATE INDEX index_integrations_on_type ON integrations USING btree (type);
-
-CREATE UNIQUE INDEX index_integrations_on_type_and_instance_partial ON integrations USING btree (type, instance) WHERE (instance = true);
-
-CREATE INDEX index_integrations_on_type_id_when_active_and_project_id_not_nu ON integrations USING btree (type, id) WHERE ((active = true) AND (project_id IS NOT NULL));
-
CREATE INDEX index_integrations_on_type_new ON integrations USING btree (type_new);
CREATE INDEX index_integrations_on_type_new_and_instance_partial ON integrations USING btree (type_new, instance) WHERE (instance = true);
CREATE INDEX index_integrations_on_type_new_id_when_active_and_has_project ON integrations USING btree (type_new, id) WHERE ((active = true) AND (project_id IS NOT NULL));
-CREATE UNIQUE INDEX index_integrations_on_unique_group_id_and_type ON integrations USING btree (group_id, type);
-
CREATE INDEX index_integrations_on_unique_group_id_and_type_new ON integrations USING btree (group_id, type_new);
CREATE INDEX index_internal_ids_on_namespace_id ON internal_ids USING btree (namespace_id);
@@ -28047,11 +28099,13 @@ CREATE INDEX index_job_artifact_states_on_verification_state ON ci_job_artifact_
CREATE INDEX index_job_artifact_states_pending_verification ON ci_job_artifact_states USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+CREATE INDEX index_key_updated_at_on_user_custom_attribute ON user_custom_attributes USING btree (key, updated_at);
+
CREATE INDEX index_keys_on_expires_at_and_id ON keys USING btree (date(timezone('UTC'::text, expires_at)), id) WHERE (expiry_notification_delivered_at IS NULL);
-CREATE UNIQUE INDEX index_keys_on_fingerprint ON keys USING btree (fingerprint);
+CREATE INDEX index_keys_on_fingerprint ON keys USING btree (fingerprint);
-CREATE INDEX index_keys_on_fingerprint_sha256 ON keys USING btree (fingerprint_sha256);
+CREATE UNIQUE INDEX index_keys_on_fingerprint_sha256_unique ON keys USING btree (fingerprint_sha256);
CREATE INDEX index_keys_on_id_and_ldap_key_type ON keys USING btree (id) WHERE ((type)::text = 'LDAPKey'::text);
@@ -28319,10 +28373,6 @@ CREATE UNIQUE INDEX index_namespace_root_storage_statistics_on_namespace_id ON n
CREATE UNIQUE INDEX index_namespace_statistics_on_namespace_id ON namespace_statistics USING btree (namespace_id);
-CREATE INDEX index_namespaces_id_parent_id_is_not_null ON namespaces USING btree (id) WHERE (parent_id IS NOT NULL);
-
-CREATE INDEX index_namespaces_id_parent_id_is_null ON namespaces USING btree (id) WHERE (parent_id IS NULL);
-
CREATE UNIQUE INDEX index_namespaces_name_parent_id_type ON namespaces USING btree (name, parent_id, type);
CREATE INDEX index_namespaces_on_created_at ON namespaces USING btree (created_at);
@@ -28541,6 +28591,8 @@ CREATE INDEX index_packages_package_file_build_infos_on_pipeline_id ON packages_
CREATE INDEX index_packages_package_files_on_file_store ON packages_package_files USING btree (file_store);
+CREATE INDEX index_packages_package_files_on_id_for_cleanup ON packages_package_files USING btree (id) WHERE (status = 1);
+
CREATE INDEX index_packages_package_files_on_package_id_and_file_name ON packages_package_files USING btree (package_id, file_name);
CREATE INDEX index_packages_package_files_on_package_id_id ON packages_package_files USING btree (package_id, id);
@@ -28615,8 +28667,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_partial_am_alerts_on_project_id_and_fingerprint ON alert_management_alerts USING btree (project_id, fingerprint) WHERE (status <> 2);
-
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);
@@ -28697,7 +28747,7 @@ COMMENT ON INDEX index_project_features_on_project_id_include_container_registry
CREATE INDEX index_project_features_on_project_id_ral_20 ON project_features USING btree (project_id) WHERE (repository_access_level = 20);
-CREATE INDEX index_project_group_links_on_group_id ON project_group_links USING btree (group_id);
+CREATE INDEX index_project_group_links_on_group_id_and_project_id ON project_group_links USING btree (group_id, project_id);
CREATE INDEX index_project_group_links_on_project_id ON project_group_links USING btree (project_id);
@@ -28949,8 +28999,6 @@ CREATE INDEX index_requirements_management_test_reports_on_build_id ON requireme
CREATE INDEX index_requirements_management_test_reports_on_issue_id ON requirements_management_test_reports USING btree (issue_id);
-CREATE INDEX index_requirements_management_test_reports_on_requirement_id ON requirements_management_test_reports USING btree (requirement_id);
-
CREATE INDEX index_requirements_on_author_id ON requirements USING btree (author_id);
CREATE INDEX index_requirements_on_created_at ON requirements USING btree (created_at);
@@ -29305,6 +29353,8 @@ CREATE INDEX index_unit_test_failures_failed_at ON ci_unit_test_failures USING b
CREATE UNIQUE INDEX index_unit_test_failures_unique_columns ON ci_unit_test_failures USING btree (unit_test_id, failed_at DESC, build_id);
+CREATE UNIQUE INDEX index_unresolved_alerts_on_project_id_and_fingerprint ON alert_management_alerts USING btree (project_id, fingerprint) WHERE ((fingerprint IS NOT NULL) AND (status <> 2));
+
CREATE UNIQUE INDEX index_upcoming_reconciliations_on_namespace_id ON upcoming_reconciliations USING btree (namespace_id);
CREATE INDEX index_upload_states_failed_verification ON upload_states USING btree (verification_retry_at NULLS FIRST) WHERE (verification_state = 3);
@@ -29483,6 +29533,8 @@ CREATE INDEX index_vulnerability_external_issue_links_on_author_id ON vulnerabil
CREATE INDEX index_vulnerability_external_issue_links_on_vulnerability_id ON vulnerability_external_issue_links USING btree (vulnerability_id);
+CREATE INDEX index_vulnerability_feedback_finding_uuid ON vulnerability_feedback USING hash (finding_uuid);
+
CREATE INDEX index_vulnerability_feedback_on_author_id ON vulnerability_feedback USING btree (author_id);
CREATE INDEX index_vulnerability_feedback_on_comment_author_id ON vulnerability_feedback USING btree (comment_author_id);
@@ -29669,10 +29721,6 @@ CREATE UNIQUE INDEX taggings_idx ON taggings USING btree (tag_id, taggable_id, t
CREATE UNIQUE INDEX term_agreements_unique_index ON term_agreements USING btree (user_id, term_id);
-CREATE INDEX tmp_gitlab_subscriptions_max_seats_used_migration ON gitlab_subscriptions USING btree (id) WHERE ((start_date >= '2021-08-02'::date) AND (start_date <= '2021-11-20'::date) AND (max_seats_used <> 0) AND (max_seats_used > seats_in_use) AND (max_seats_used > seats));
-
-CREATE INDEX tmp_gitlab_subscriptions_max_seats_used_migration_2 ON gitlab_subscriptions USING btree (id) WHERE ((start_date < '2021-08-02'::date) AND (max_seats_used <> 0) AND (max_seats_used > seats_in_use) AND (max_seats_used > seats));
-
CREATE INDEX tmp_idx_container_repos_on_non_migrated ON container_repositories USING btree (project_id, id) WHERE ((migration_state <> 'import_done'::text) AND (created_at < '2022-01-23 00:00:00'::timestamp without time zone));
CREATE INDEX tmp_index_ci_job_artifacts_on_id_where_trace_and_expire_at ON ci_job_artifacts USING btree (id) WHERE ((file_type = 3) AND (expire_at = ANY (ARRAY['2021-04-22 00:00:00+00'::timestamp with time zone, '2021-05-22 00:00:00+00'::timestamp with time zone, '2021-06-22 00:00:00+00'::timestamp with time zone, '2022-01-22 00:00:00+00'::timestamp with time zone, '2022-02-22 00:00:00+00'::timestamp with time zone, '2022-03-22 00:00:00+00'::timestamp with time zone, '2022-04-22 00:00:00+00'::timestamp with time zone])));
@@ -29687,15 +29735,15 @@ CREATE INDEX tmp_index_for_null_project_namespace_id ON projects USING btree (id
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));
+CREATE INDEX tmp_index_integrations_on_id_where_type_droneci_or_teamcity ON integrations USING btree (id) WHERE ((type_new = ANY (ARRAY['Integrations::DroneCi'::text, 'Integrations::Teamcity'::text])) AND (encrypted_properties IS NOT NULL));
+
CREATE INDEX tmp_index_issues_on_issue_type_and_id ON issues USING btree (issue_type, id);
CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (state = 2);
-CREATE INDEX tmp_index_merge_requests_draft_and_status_leaky_regex ON merge_requests USING btree (id) WHERE ((draft = true) AND (state_id = 1) AND ((title)::text ~* '^\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP'::text) AND ((title)::text !~* '^(\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP)'::text));
+CREATE INDEX tmp_index_merge_requests_draft_and_status ON merge_requests USING btree (id) WHERE ((draft = false) AND (state_id = 1) AND ((title)::text ~* '^(\[draft\]|\(draft\)|draft:|draft|\[WIP\]|WIP:|WIP)'::text));
-CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_child_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NOT NULL) AND (traversal_ids = '{}'::integer[]));
-
-CREATE INDEX tmp_index_namespaces_empty_traversal_ids_with_root_namespaces ON namespaces USING btree (id) WHERE ((parent_id IS NULL) AND (traversal_ids = '{}'::integer[]));
+CREATE INDEX tmp_index_notes_on_id_where_discussion_id_is_null ON notes USING btree (id) WHERE (discussion_id IS NULL);
CREATE UNIQUE INDEX tmp_index_on_tmp_project_id_on_namespaces ON namespaces USING btree (tmp_project_id);
@@ -29705,6 +29753,8 @@ CREATE INDEX tmp_index_projects_on_id_and_runners_token ON projects USING btree
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 tp_index_created_at_cluster_id_project_id_on_deployments ON deployments USING btree (created_at, cluster_id, project_id) WHERE ((cluster_id IS NOT NULL) AND (created_at > '2022-04-03 00:00:00'::timestamp without time zone));
+
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_architectures_on_distribution_id_and_name ON packages_debian_group_architectures USING btree (distribution_id, name);
CREATE UNIQUE INDEX uniq_pkgs_deb_grp_components_on_distribution_id_and_name ON packages_debian_group_components USING btree (distribution_id, name);
@@ -31027,6 +31077,8 @@ CREATE TRIGGER merge_requests_loose_fk_trigger AFTER DELETE ON merge_requests RE
CREATE TRIGGER namespaces_loose_fk_trigger AFTER DELETE ON namespaces REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
+CREATE TRIGGER nullify_merge_request_metrics_build_data_on_update BEFORE UPDATE ON merge_request_metrics FOR EACH ROW EXECUTE FUNCTION nullify_merge_request_metrics_build_data();
+
CREATE TRIGGER projects_loose_fk_trigger AFTER DELETE ON projects REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
CREATE TRIGGER trigger_delete_project_namespace_on_project_delete AFTER DELETE ON projects FOR EACH ROW WHEN ((old.project_namespace_id IS NOT NULL)) EXECUTE FUNCTION delete_associated_project_namespace();
@@ -31055,8 +31107,6 @@ CREATE TRIGGER trigger_projects_parent_id_on_insert AFTER INSERT ON projects FOR
CREATE TRIGGER trigger_projects_parent_id_on_update AFTER UPDATE ON projects FOR EACH ROW WHEN ((old.namespace_id IS DISTINCT FROM new.namespace_id)) EXECUTE FUNCTION insert_projects_sync_event();
-CREATE TRIGGER trigger_type_new_on_insert AFTER INSERT ON integrations FOR EACH ROW EXECUTE FUNCTION integrations_set_type_new();
-
CREATE TRIGGER trigger_update_has_issues_on_vulnerability_issue_links_delete AFTER DELETE ON vulnerability_issue_links FOR EACH ROW EXECUTE FUNCTION unset_has_issues_on_vulnerability_reads();
CREATE TRIGGER trigger_update_has_issues_on_vulnerability_issue_links_update AFTER INSERT ON vulnerability_issue_links FOR EACH ROW EXECUTE FUNCTION set_has_issues_on_vulnerability_reads();
@@ -31139,9 +31189,6 @@ ALTER TABLE ONLY protected_branch_push_access_levels
ALTER TABLE ONLY internal_ids
ADD CONSTRAINT fk_162941d509 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
-ALTER TABLE ONLY geo_event_log
- ADD CONSTRAINT fk_176d3fbb5d FOREIGN KEY (job_artifact_deleted_event_id) REFERENCES geo_job_artifact_deleted_events(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY incident_management_timeline_events
ADD CONSTRAINT fk_17a5fafbd4 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
@@ -32297,6 +32344,9 @@ ALTER TABLE ONLY namespace_settings
ALTER TABLE ONLY self_managed_prometheus_alert_events
ADD CONSTRAINT fk_rails_3936dadc62 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY packages_cleanup_policies
+ ADD CONSTRAINT fk_rails_393ba98591 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY approval_project_rules_groups
ADD CONSTRAINT fk_rails_396841e79e FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
@@ -33095,6 +33145,9 @@ ALTER TABLE ONLY vulnerability_occurrence_identifiers
ALTER TABLE ONLY alert_management_http_integrations
ADD CONSTRAINT fk_rails_bec49f52cc FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+ALTER TABLE ONLY namespace_ci_cd_settings
+ ADD CONSTRAINT fk_rails_bf04185d54 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
+
ALTER TABLE ONLY vulnerability_occurrences
ADD CONSTRAINT fk_rails_bf5b788ca7 FOREIGN KEY (scanner_id) REFERENCES vulnerability_scanners(id) ON DELETE CASCADE;
@@ -33446,9 +33499,6 @@ ALTER TABLE ONLY merge_requests_closing_issues
ALTER TABLE ONLY banned_users
ADD CONSTRAINT fk_rails_fa5bb598e5 FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
-ALTER TABLE ONLY requirements_management_test_reports
- ADD CONSTRAINT fk_rails_fb3308ad55 FOREIGN KEY (requirement_id) REFERENCES requirements(id) ON DELETE CASCADE;
-
ALTER TABLE ONLY operations_feature_flags_issues
ADD CONSTRAINT fk_rails_fb4d2a7cb1 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;
diff --git a/doc/.vale/gitlab/Admin.yml b/doc/.vale/gitlab/Admin.yml
index 987dbfdbd09..f6b0a988499 100644
--- a/doc/.vale/gitlab/Admin.yml
+++ b/doc/.vale/gitlab/Admin.yml
@@ -10,4 +10,4 @@ link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html
level: suggestion
ignorecase: false
swap:
- '[Aa]dmin ?\w*': '(?:Admin( Area| Mode)?|[Aa]dminist(ration|rator|rators|er|rative))'
+ '[Aa]dmin ?\w*': '(?:Admin( Area| Mode)?|[Aa]dminist(ration|rator|rators|er|rative|ering|ered))'
diff --git a/doc/.vale/gitlab/BadPlurals.yml b/doc/.vale/gitlab/BadPlurals.yml
index 81e2a0e563d..efc55ac3d56 100644
--- a/doc/.vale/gitlab/BadPlurals.yml
+++ b/doc/.vale/gitlab/BadPlurals.yml
@@ -11,4 +11,4 @@ level: warning
scope: raw
ignorecase: true
raw:
- - '\w*\(s\)(?<!http\(s\))'
+ - '\b\w+\(s\)(?<!http\(s\))'
diff --git a/doc/.vale/gitlab/CIConfigFile.yml b/doc/.vale/gitlab/CIConfigFile.yml
new file mode 100644
index 00000000000..5a65e51ea16
--- /dev/null
+++ b/doc/.vale/gitlab/CIConfigFile.yml
@@ -0,0 +1,17 @@
+---
+# Error: gitlab.CIConfigFile
+#
+# Checks that the `.gitlab-ci.yml` file is referenced properly.
+#
+# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
+extends: existence
+message: 'The CI/CD configuration file should be exactly: `.gitlab-ci.yml`'
+link: https://docs.gitlab.com/ee/development/documentation/versions.html
+level: error
+scope: raw
+raw:
+ - '(`gitlab-ci.yml`|'
+ - '`gitlabci.yml`|'
+ - '`gitlab.ci.yml`|'
+ - '`.gitlab.ci-yml`|'
+ - '`.gitlab-ci.yaml`)'
diff --git a/doc/.vale/gitlab/SubstitutionSuggestions.yml b/doc/.vale/gitlab/SubstitutionSuggestions.yml
index df132d89637..4b77def065d 100644
--- a/doc/.vale/gitlab/SubstitutionSuggestions.yml
+++ b/doc/.vale/gitlab/SubstitutionSuggestions.yml
@@ -7,7 +7,7 @@
# For a list of all options, see https://errata-ai.github.io/vale/styles/
extends: substitution
message: 'Consider %s instead of "%s".'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#language
+link: https://docs.gitlab.com/ee/development/documentation/styleguide/word_list.html
level: suggestion
ignorecase: true
swap:
@@ -15,7 +15,7 @@ swap:
active users: '"billable users"'
docs: '"documentation"'
e-mail: '"email"'
- GFM: '"GitLab Flavored Markdown"'
+ GLFM: '"GitLab Flavored Markdown"'
it is recommended: '"we recommend"'
navigate: go
OAuth2: '"OAuth 2.0"'
diff --git a/doc/.vale/gitlab/SubstitutionWarning.yml b/doc/.vale/gitlab/SubstitutionWarning.yml
index 7b20887f53f..d17015b97fd 100644
--- a/doc/.vale/gitlab/SubstitutionWarning.yml
+++ b/doc/.vale/gitlab/SubstitutionWarning.yml
@@ -12,6 +12,7 @@ level: warning
ignorecase: true
swap:
air(?:-| )?gapped: offline environment
+ bullet: list item
click: select
code base: codebase
config: configuration
@@ -20,7 +21,9 @@ swap:
distro: distribution
file name: filename
filesystem: file system
+ GFM: GLFM
info: information
+ n/a: not applicable
repo: repository
timezone: time zone
utilize: use
diff --git a/doc/.vale/gitlab/VersionText.yml b/doc/.vale/gitlab/VersionText.yml
index fbdda17e2a0..68753de60aa 100644
--- a/doc/.vale/gitlab/VersionText.yml
+++ b/doc/.vale/gitlab/VersionText.yml
@@ -16,7 +16,7 @@
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: existence
message: 'This introduced-in line is not formatted correctly.'
-link: https://docs.gitlab.com/ee/development/documentation/styleguide/index.html#version-text-in-the-version-history
+link: https://docs.gitlab.com/ee/development/documentation/versions.html
level: error
scope: raw
raw:
diff --git a/doc/.vale/gitlab/spelling-exceptions.txt b/doc/.vale/gitlab/spelling-exceptions.txt
index 76e8f99b5db..92e10a91753 100644
--- a/doc/.vale/gitlab/spelling-exceptions.txt
+++ b/doc/.vale/gitlab/spelling-exceptions.txt
@@ -25,6 +25,7 @@ arity
Artifactory
Asana
Asciidoctor
+asdf
Assembla
Atlassian
auditability
@@ -64,6 +65,7 @@ Bamboo
Bazel
Bhyve
Bitbucket
+Bitnami
blockquote
blockquoted
blockquotes
@@ -93,8 +95,13 @@ Camo
canonicalization
canonicalized
captcha
+Casdoor
CentOS
+Ceph
Certbot
+cgo
+cgroup
+cgroups
chai
changeset
changesets
@@ -104,11 +111,13 @@ chatbots
ChatOps
checksummed
checksumming
+Chemlab
Citrix
Citus
clonable
Cloudwatch
Cobertura
+Codeception
Codepen
Cognito
colocated
@@ -174,6 +183,7 @@ disambiguates
discoverability
dismissable
Disqus
+Distroless
Divio
Dockerfile
Dockerfiles
@@ -199,6 +209,7 @@ enums
ETag
Excon
exfiltration
+ExifTool
expirable
Facebook
failover
@@ -206,6 +217,7 @@ failovers
failsafe
Falco
falsy
+Fargate
fastlane
Fastzip
favicon
@@ -254,7 +266,9 @@ Gradle
Grafana
Grafonnet
gravatar
+Grype
Gzip
+Hackathon
Haml
hardcode
hardcoded
@@ -333,6 +347,7 @@ Leiningen
libFuzzer
Libravatar
liveness
+lockfiles
Lodash
Lograge
logrotate
@@ -352,6 +367,7 @@ Makefile
Makefiles
Markdown
markdownlint
+Marketo
matcher
matchers
Matomo
@@ -364,6 +380,7 @@ memoizing
Memorystore
mergeability
mergeable
+metaprogramming
Microsoft
middleware
middlewares
@@ -386,6 +403,7 @@ ModSecurity
Monokai
monorepo
monorepos
+monospace
multiline
mutex
nameserver
@@ -399,6 +417,7 @@ Nanoc
negatable
Netlify
Nokogiri
+nosniff
noteable
noteables
npm
@@ -472,6 +491,7 @@ proxies
proxyable
proxying
pseudocode
+pseudonymization
pseudonymized
pseudonymizer
Puma
@@ -484,6 +504,7 @@ Rackspace
Raspbian
rbenv
rbtrace
+Rclone
Rdoc
reachability
Realplayer
@@ -575,6 +596,7 @@ serializer
serializers
serializing
serverless
+setuptools
severities
sharded
sharding
@@ -592,10 +614,12 @@ Slony
smartcard
smartcards
snapshotting
+Snyk
Sobelow
Solargraph
Solarized
Sourcegraph
+Spamcheck
spammable
sparkline
sparklines
@@ -660,6 +684,7 @@ Sysbench
syscall
syscalls
syslog
+systemd
tanuki
tcpdump
templated
@@ -700,6 +725,7 @@ Twilio
Twitter
TypeScript
Ubuntu
+Udemy
unapplied
unapprove
unapproved
@@ -804,6 +830,7 @@ Vagrantfile
validator
validators
vendored
+vendoring
versionless
viewport
viewports
@@ -828,6 +855,7 @@ wireframes
wireframing
Wireshark
Wordpress
+Workato
worktree
worktrees
Worldline
@@ -836,6 +864,7 @@ Xeon
YouTrack
ytt
Yubico
+Zabbix
Zeitwerk
Zendesk
ZenTao
diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md
index 6cf630ad079..07979e21038 100644
--- a/doc/administration/audit_event_streaming.md
+++ b/doc/administration/audit_event_streaming.md
@@ -132,13 +132,11 @@ Delete an event streaming destination by specifying an ID. Get the required ID b
streaming destinations.
```graphql
-
-mutation{
+mutation {
externalAuditEventDestinationDestroy(input: { id: destination }) {
errors
}
}
-
```
Destination is deleted if:
@@ -158,10 +156,11 @@ the destination's value when [listing streaming destinations](#list-streaming-de
## 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.
+> - [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.
+> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/357211) in GitLab 15.0.
FLAG:
-On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](feature_flags.md) named `audit_event_streaming_git_operations`. On GitLab.com, this feature is not available.
+On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](feature_flags.md) named `audit_event_streaming_git_operations`. On GitLab.com, this feature is available.
Streaming audit events can be sent when signed-in users push or pull a project's remote Git repositories:
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index 36f3a71cd2e..6fac21ef889 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -10,6 +10,7 @@ GitLab offers a way to view the changes made within the GitLab server for owners
on a [paid plan](https://about.gitlab.com/pricing/).
GitLab system administrators can also view all audit events by accessing the [`audit_json.log` file](logs.md#audit_jsonlog).
+The JSON audit log does not include events that are [only streamed](../development/audit_event_guide/index.md#event-streaming).
You can:
@@ -33,7 +34,7 @@ permission level, who added a new user, or who removed a user.
## Retention policy
There is no retention policy in place for audit events.
-See the [Specify a retention period for audit events](https://gitlab.com/gitlab-org/gitlab/-/issues/8137) for more information.
+See the [Specify a retention period for audit events](https://gitlab.com/groups/gitlab-org/-/epics/7917) for more information.
## List of events
@@ -114,6 +115,8 @@ From there, you can see the following actions:
- Instance administrator started or stopped impersonation of a group member. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/300961) in GitLab 14.8.
- Group deploy token was successfully created, revoked, or deleted. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353452) in GitLab 14.9.
- Failed attempt to create a group deploy token. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353452) in GitLab 14.9.
+- [IP restrictions](../user/group/index.md#restrict-group-access-by-ip-address) changed. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/358986) in GitLab 15.0
+- Changes to push rules. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227629) in GitLab 15.0.
Group events can also be accessed via the [Group Audit Events API](../api/audit_events.md#group-audit-events)
@@ -178,6 +181,11 @@ From there, you can see the following actions:
- Skipped pipelines are considered successful enabled or disabled ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301124) in GitLab 14.9)
- All discussions must be resolved enabled or disabled ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301124) in GitLab 14.9)
- Commit message suggestion is updated ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301124) in GitLab 14.9)
+- Status check is added, edited, or deleted ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355805) in GitLab 15.0)
+- Merge commit message template is updated ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355805) in GitLab 15.0)
+- Squash commit message template is updated ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355805) in GitLab 15.0)
+- Default description template for merge requests is updated ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355805) in GitLab 15.0)
+- Project was scheduled for deletion due to inactivity ([introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0)
Project events can also be accessed via the [Project Audit Events API](../api/audit_events.md#project-audit-events).
@@ -258,36 +266,15 @@ Don't see the event you want in any of the epics linked above? You can either:
request it.
- [Add it yourself](../development/audit_event_guide/).
-### Disabled events
+### Removed events
-#### Repository push (DEPRECATED)
+> - Repositories push events was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
+> - Repositories push events was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 15.0.
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
+The repositories push events feature was:
-WARNING:
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
-
-The current architecture of audit events is not prepared to receive a very high amount of records.
-It may make the user interface for your project or audit events very busy, and the disk space consumed by the
-`audit_events` PostgreSQL table may increase considerably. It's disabled by default
-to prevent performance degradations on GitLab instances with very high Git write traffic.
-
-If you still wish to enable **Repository push** events in your instance, follow
-the steps below.
-
-**In Omnibus installations:**
-
-1. Enter the Rails console:
-
- ```shell
- sudo gitlab-rails console
- ```
-
-1. Flip the switch and enable the feature flag:
-
- ```ruby
- Feature.enable(:repository_push_audit_event)
- ```
+- [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
+- [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 15.0.
## Search
diff --git a/doc/administration/auditor_users.md b/doc/administration/auditor_users.md
index b3304fd1cbd..1d0aff51a04 100644
--- a/doc/administration/auditor_users.md
+++ b/doc/administration/auditor_users.md
@@ -6,88 +6,52 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Auditor users **(PREMIUM SELF)**
-Auditor users are given read-only access to all projects, groups, and other
-resources on the GitLab instance.
-
-## Overview
-
-Auditor users are able to have both full access to their own resources
-(including projects, groups, and snippets) and read-only access to _all_ other
-resources, except the [Admin Area](../user/admin_area/index.md). These user
-accounts are regular users who can be added to projects, create personal
-snippets, and create milestones on their groups, while also having read-only
-access to all projects on the server to which they haven't been explicitly
-[given access](../user/permissions.md).
-
-The `Auditor` access level is _not_ a read-only version of the `Admin` access level. Auditor users
-can't access the project or group settings pages, or the Admin Area.
-
-Assuming you have signed in as an Auditor user:
-
-- For a project the Auditor is not member of, the Auditor should have
- read-only access. If the project is public or internal, they have the same
- access as users that aren't members of that project or group.
-- For a project the Auditor owns, the Auditor should have full access to
- everything.
-- For a project to which the Auditor is added as a member, the Auditor should
- have the same access as their given [permissions](../user/permissions.md).
- For example, if they were added as a Developer, they can push commits or
- comment on issues.
-- The Auditor can't view the Admin Area, or perform any administration actions.
-
-For more information about what an Auditor can or can't do, see the
-[Permissions and restrictions of an Auditor user](#permissions-and-restrictions-of-an-auditor-user)
-section.
+Users with auditor access have read-only access to all groups, projects, and other resources except:
+
+- The [Admin Area](../user/admin_area/index.md).
+- Project and group settings.
-## Use cases
+For more information, see [Auditor user permissions and restrictions](#auditor-user-permissions-and-restrictions)
+section.
-The following use cases describe some situations where Auditor users could be
-helpful:
+Situations where auditor access for users could be helpful include:
- Your compliance department wants to run tests against the entire GitLab base
to ensure users are complying with password, credit card, and other sensitive
- data policies. With Auditor users, this can be achieved very without having
- to give them user administration rights or using the API to add them to all projects.
+ data policies. You can achieve this with auditor access without giving the compliance department
+ user administration rights or adding them to all projects.
- If particular users need visibility or access to most of all projects in
your GitLab instance, instead of manually adding the user to all projects,
- you can create an Auditor user and then share the credentials with those users
- to which you want to grant access.
+ you can create an account with auditor access and then share the credentials
+ with those users to which you want to grant access.
-## Add an Auditor user
+## Add a user with auditor access
-To create an Auditor user:
+To create a new user account with auditor access (or change an existing user):
+
+To create a user account with auditor access:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Overview > Users**.
-1. Create a new user or edit an existing one, and in the **Access** section
- select Auditor.
+1. Create a new user or edit an existing one. Set **Access Level** to **Auditor**.
1. If you created a user, select **Create user**. For an existing user, select **Save changes**.
-To revoke Auditor permissions from a user, make them a Regular user by
-following the previous steps.
-
-Additionally users can be set as an Auditor using [SAML groups](../integration/saml.md#auditor-groups).
-
-## Permissions and restrictions of an Auditor user
-
-An Auditor user should be able to access all projects and groups of a GitLab
-instance, with the following permissions and restrictions:
-
-- Has read-only access to the API
-- Can access projects that are:
- - Private
- - Public
- - Internal
-- Can read all files in a repository
-- Can read issues and MRs
-- Can read project snippets
-- Cannot be Administrator and Auditor at the same time
-- Cannot access the Admin Area
-- In a group or project they're not a member of:
- - Cannot access project settings
- - Cannot access group settings
- - Cannot commit to repository
- - Cannot create or comment on issues and MRs
- - Cannot create or modify files from the Web UI
- - Cannot merge a merge request
- - Cannot create project snippets
+To revoke auditor access from a user, follow these steps but set **Access Level** to **Regular**.
+
+You can also give users auditor access using [SAML groups](../integration/saml.md#auditor-groups).
+
+## Auditor user permissions and restrictions
+
+Auditor access is _not_ a read-only version of administrator access because it doesn't permit access to the Admin Area.
+
+For access to their own resources and resources within a group or project where they are a member,
+users with auditor access have the same [permissions](../user/permissions.md) as regular users.
+
+If you are signed in with auditor access, you:
+
+- Have full access to projects you own.
+- Have read-only access to projects you aren't a member of.
+- Have [permissions](../user/permissions.md) based on your role to projects you are a member of. For example, if you have the Developer role,
+ you can push commits or comment on issues.
+- Can access the same resources using the GitLab UI or API.
+- Can't view the Admin Area, or perform any administration actions.
diff --git a/doc/administration/auth/ldap/index.md b/doc/administration/auth/ldap/index.md
index a7e070b755a..9232e79b800 100644
--- a/doc/administration/auth/ldap/index.md
+++ b/doc/administration/auth/ldap/index.md
@@ -468,7 +468,7 @@ If initially your LDAP configuration looked like:
password: '123'
```
-1. Edit `/etc/gitlab/gitlab.rb` and remove the settings for `user_dn` and `password`.
+1. Edit `/etc/gitlab/gitlab.rb` and remove the settings for `bind_dn` and `password`.
1. [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
@@ -502,7 +502,7 @@ If initially your LDAP configuration looked like:
password: '123'
```
-1. Edit `config/gitlab.yaml` and remove the settings for `user_dn` and `password`.
+1. Edit `config/gitlab.yaml` and remove the settings for `bind_dn` and `password`.
1. [Restart GitLab](../../restart_gitlab.md#installations-from-source) for the changes to take effect.
@@ -531,16 +531,19 @@ However, these users can continue to use Git with SSH until the next time the
To delete the account immediately, you can manually
[block the user](../../../user/admin_area/moderate_users.md#block-a-user).
-## Updating user email addresses
+## Update user email addresses
-Email addresses on the LDAP server are considered the source of truth for users when LDAP is used to sign in. Updating user email
-addresses must be done on the LDAP server that manages the user. The email address for GitLab is updated either:
+Email addresses on the LDAP server are considered the source of truth for users when LDAP is used to sign in.
+
+Updating user email addresses must be done on the LDAP server that manages the user. The email address for GitLab is updated either:
- When the user next signs in.
- When the next [user sync](ldap_synchronization.md#user-sync) is run.
The updated user's previous email address becomes the secondary email address to preserve that user's commit history.
+You can find more details on the expected behavior of user updates in our [LDAP troubleshooting section](ldap-troubleshooting.md#user-dn-orand-email-have-changed).
+
## Google Secure LDAP
> Introduced in GitLab 11.9.
diff --git a/doc/administration/auth/ldap/ldap_synchronization.md b/doc/administration/auth/ldap/ldap_synchronization.md
index d7ce54a47c0..0f0d301bfa9 100644
--- a/doc/administration/auth/ldap/ldap_synchronization.md
+++ b/doc/administration/auth/ldap/ldap_synchronization.md
@@ -190,8 +190,8 @@ to lock down user abilities to invite new members to a group.
When enabled, the following applies:
-- Only administrator can manage memberships of any group including access levels.
-- Users are not allowed to share project with other groups or invite members to
+- Only an administrator can manage memberships of any group including access levels.
+- Users are not allowed to share a project with other groups or invite members to
a project created in a group.
To enable it, you must:
diff --git a/doc/administration/configure.md b/doc/administration/configure.md
index e42eb632f14..cba4a23d95a 100644
--- a/doc/administration/configure.md
+++ b/doc/administration/configure.md
@@ -30,7 +30,7 @@ The tables lists features on the left and provides their capabilities to the rig
## Geo Capabilities
-If your availabity needs to span multiple zones or multiple locations, please read about [Geo](geo/index.md).
+If your availability needs to span multiple zones or multiple locations, please read about [Geo](geo/index.md).
| | Availability | Recoverability | Data Resiliency | Performance | Risks/Trade-offs|
|-|--------------|----------------|-----------------|-------------|-----------------|
@@ -44,7 +44,7 @@ The following table outlines failure modes and mitigation paths for the product
| ----------- | -------------------------- | ----------------------------- | ---------------------------------- | ----- |
| Single Gitaly Node | Downtime - Must restore from backup | Downtime - Must restore from Backup | Downtime - Must wait for outage to end | |
| Single Gitaly Node + Geo Secondary | Downtime - Must restore from backup, can perform a manual failover to secondary | Downtime - Must restore from Backup, errors could have propagated to secondary | Manual intervention - failover to Geo secondary | |
-| Sharded Gitaly Install | Partial Downtime - Only repos on impacted node affected, must restore from backup | Partial Downtime - Only repos on impacted node affected, must restore from backup | Downtime - Must wait for outage to end | |
-| Sharded Gitaly Install + Geo Secondary | Partial Downtime - Only repos on impacted node affected, must restore from backup, could perform manual failover to secondary for impacted repos | Partial Downtime - Only repos on impacted node affected, must restore from backup, errors could have propagated to secondary | Manual intervention - failover to Geo secondary | |
+| Sharded Gitaly Install | Partial Downtime - Only repositories on impacted node affected, must restore from backup | Partial Downtime - Only repositories on impacted node affected, must restore from backup | Downtime - Must wait for outage to end | |
+| Sharded Gitaly Install + Geo Secondary | Partial Downtime - Only repositories on impacted node affected, must restore from backup, could perform manual failover to secondary for impacted repositories | Partial Downtime - Only repositories on impacted node affected, must restore from backup, errors could have propagated to secondary | Manual intervention - failover to Geo secondary | |
| Gitaly Cluster Install* | No Downtime - will swap repository primary to another node after 10 seconds | N/A - All writes are voted on by multiple Gitaly Cluster nodes | Downtime - Must wait for outage to end | Snapshot backups for Gitaly Cluster nodes not supported at this time |
| Gitaly Cluster Install* + Geo Secondary | No Downtime - will swap repository primary to another node after 10 seconds | N/A - All writes are voted on by multiple Gitaly Cluster nodes | Manual intervention - failover to Geo secondary | Snapshot backups for Gitaly Cluster nodes not supported at this time |
diff --git a/doc/administration/encrypted_configuration.md b/doc/administration/encrypted_configuration.md
index baa6e967507..5c943e56b98 100644
--- a/doc/administration/encrypted_configuration.md
+++ b/doc/administration/encrypted_configuration.md
@@ -11,7 +11,7 @@ type: reference
GitLab can read settings for certain features from encrypted settings files. The supported features are:
-- [LDAP `user_bn` and `password`](auth/ldap/index.md#use-encrypted-credentials).
+- [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
diff --git a/doc/administration/environment_variables.md b/doc/administration/environment_variables.md
index 22159b6e9db..1fe5b223f8b 100644
--- a/doc/administration/environment_variables.md
+++ b/doc/administration/environment_variables.md
@@ -37,31 +37,6 @@ You can use the following environment variables to override certain values:
| `RAILS_ENV` | string | The Rails environment; can be one of `production`, `development`, `staging`, or `test`. |
| `UNSTRUCTURED_RAILS_LOG` | string | Enables the unstructured log in addition to JSON logs (defaults to `true`). |
-## Complete database variables
-
-The recommended method for specifying your database connection information is
-to set the `DATABASE_URL` environment variable. This variable contains
-connection information (`adapter`, `database`, `username`, `password`, `host`,
-and `port`), but no behavior information (`encoding` or `pool`). If you don't
-want to use `DATABASE_URL`, or want to set database behavior information,
-either:
-
-- Copy the template file, `cp config/database.yml.env config/database.yml`.
-- Set a value for some `GITLAB_DATABASE_XXX` variables.
-
-The list of `GITLAB_DATABASE_XXX` variables that you can set is:
-
-| Variable | Default value | Overridden by `DATABASE_URL`? |
-|-----------------------------|--------------------------------|-------------------------------|
-| `GITLAB_DATABASE_ADAPTER` | `postgresql` | **{check-circle}** Yes |
-| `GITLAB_DATABASE_DATABASE` | `gitlab_#{ENV['RAILS_ENV']` | **{check-circle}** Yes |
-| `GITLAB_DATABASE_ENCODING` | `unicode` | **{dotted-circle}** No |
-| `GITLAB_DATABASE_HOST` | `localhost` | **{check-circle}** Yes |
-| `GITLAB_DATABASE_PASSWORD` | _none_ | **{check-circle}** Yes |
-| `GITLAB_DATABASE_POOL` | `10` | **{dotted-circle}** No |
-| `GITLAB_DATABASE_PORT` | `5432` | **{check-circle}** Yes |
-| `GITLAB_DATABASE_USERNAME` | `root` | **{check-circle}** Yes |
-
## Adding more variables
We welcome merge requests to make more settings configurable by using variables.
diff --git a/doc/administration/geo/disaster_recovery/bring_primary_back.md b/doc/administration/geo/disaster_recovery/bring_primary_back.md
index 64673b9ee8d..4e68cc39580 100644
--- a/doc/administration/geo/disaster_recovery/bring_primary_back.md
+++ b/doc/administration/geo/disaster_recovery/bring_primary_back.md
@@ -42,7 +42,7 @@ To bring the former **primary** site up to date:
NOTE:
If you [changed the DNS records](index.md#step-4-optional-updating-the-primary-domain-dns-record)
for this site during disaster recovery procedure you may need to [block
- all the writes to this site](planned_failover.md#prevent-updates-to-the-primary-node)
+ all the writes to this site](planned_failover.md#prevent-updates-to-the-primary-site)
during this procedure.
1. [Set up database replication](../setup/database.md). In this case, the **secondary** site
diff --git a/doc/administration/geo/disaster_recovery/index.md b/doc/administration/geo/disaster_recovery/index.md
index 1725c283396..baece830318 100644
--- a/doc/administration/geo/disaster_recovery/index.md
+++ b/doc/administration/geo/disaster_recovery/index.md
@@ -100,15 +100,15 @@ Note the following when promoting a secondary:
#### Promoting a **secondary** site running on a single node running GitLab 14.5 and later
-1. SSH in to your **secondary** node and execute:
+1. SSH in to your **secondary** site and execute:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -122,10 +122,10 @@ Note the following when promoting a secondary:
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
-1. SSH in to your **secondary** node and login as root:
+1. SSH in to your **secondary** site and login as root:
```shell
sudo -i
@@ -142,7 +142,7 @@ Use `gitlab-ctl geo promote` instead.
1. Promote the **secondary** site to the **primary** site:
- - To promote the secondary node to primary along with [preflight checks](planned_failover.md#preflight-checks):
+ - To promote the secondary site to primary along with [preflight checks](planned_failover.md#preflight-checks):
```shell
gitlab-ctl promote-to-primary-node
@@ -163,7 +163,7 @@ Use `gitlab-ctl geo promote` instead.
shows that it is complete, you can skip the preflight checks to make the
command complete promotion. This bug was fixed in GitLab 13.8 and later.
- - To promote the secondary node to primary **without any further confirmation**,
+ - To promote the secondary site to primary **without any further confirmation**,
even when preflight checks fail:
```shell
@@ -178,13 +178,13 @@ Use `gitlab-ctl geo promote` instead.
1. SSH to every Sidekiq, PostgresSQL, and Gitaly node in the **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the node on the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -192,13 +192,13 @@ Use `gitlab-ctl geo promote` instead.
1. SSH into each Rails node on your **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -212,7 +212,7 @@ Use `gitlab-ctl geo promote` instead.
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
The `gitlab-ctl promote-to-primary-node` command cannot be used yet in
@@ -256,13 +256,13 @@ do this manually.
1. SSH to every Sidekiq, PostgresSQL, and Gitaly node in the **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -270,13 +270,13 @@ do this manually.
1. SSH into each Rails node on your **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -290,7 +290,7 @@ do this manually.
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
The `gitlab-ctl promote-to-primary-node` command cannot be used yet in
@@ -347,7 +347,7 @@ site first.
- [Azure PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/howto-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 node, for example `/tmp/geo_promote.sh`, and modify the connection
+ secondary site, for example `/tmp/geo_promote.sh`, and modify the connection
parameters to match your environment. Then, execute it to promote the replica:
```shell
@@ -370,13 +370,13 @@ site first.
1. SSH to every Sidekiq, PostgresSQL, and Gitaly node in the **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -384,13 +384,13 @@ site first.
1. SSH into each Rails node on your **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -404,7 +404,7 @@ site first.
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
The `gitlab-ctl promote-to-primary-node` command cannot be used in conjunction with
@@ -418,7 +418,7 @@ required:
- [Azure PostgreSQL](https://docs.microsoft.com/en-us/azure/postgresql/howto-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 node, for example `/tmp/geo_promote.sh`, and modify the connection
+ secondary site, for example `/tmp/geo_promote.sh`, and modify the connection
parameters to match your environment. Then, execute it to promote the replica:
```shell
@@ -503,7 +503,7 @@ secondary domain, like changing Git remotes and API URLs.
in `/etc/gitlab/gitlab.rb`.
1. For GitLab 12.0 through 12.7, you may need to update the **primary**
- node's name in the database. This bug has been fixed in GitLab 12.8.
+ site's name in the database. This bug has been fixed in GitLab 12.8.
To determine if you need to do this, search for the
`gitlab_rails["geo_node_name"]` setting in your `/etc/gitlab/gitlab.rb`
@@ -571,9 +571,9 @@ and after that you also need two extra steps.
# Allow PostgreSQL client authentication from the primary and secondary IPs. These IPs may be
# public or VPC addresses in CIDR format, for example ['198.51.100.1/32', '198.51.100.2/32']
##
- postgresql['md5_auth_cidr_addresses'] = ['<primary_node_ip>/32', '<secondary_node_ip>/32']
+ postgresql['md5_auth_cidr_addresses'] = ['<primary_site_ip>/32', '<secondary_site_ip>/32']
- # Every secondary server needs to have its own slot so specify the number of secondary nodes you're going to have
+ # Every secondary site needs to have its own slot so specify the number of secondary sites you're going to have
postgresql['max_replication_slots'] = 1
##
@@ -643,7 +643,7 @@ avoid a split-brain situation where writes can occur in two different GitLab
instances, complicating recovery efforts. So to prepare for the failover, you
must disable the **primary** site:
-- If you have access to the **primary** Kubernetes cluster, connect to it and disable the GitLab webservice and Sidekiq pods:
+- If you have access to the **primary** Kubernetes cluster, connect to it and disable the GitLab `webservice` and `Sidekiq` pods:
```shell
kubectl --namespace gitlab scale deploy gitlab-geo-webservice-default --replicas=0
@@ -662,7 +662,7 @@ must disable the **primary** site:
- Revoke object storage permissions from the **primary** site.
- Physically disconnect a machine.
-### Step 2. Promote all **secondary** sites external to the cluster
+### Step 2. Promote all **secondary** site nodes external to the cluster
WARNING:
If the secondary site [has been paused](../../geo/index.md#pausing-and-resuming-replication), this performs
@@ -673,13 +673,13 @@ If you are running GitLab 14.5 and later:
1. For each node outside of the **secondary** Kubernetes cluster using Omnibus such as PostgreSQL or Gitaly, SSH into the node and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the **secondary** site node external to the Kubernetes cluster to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the **secondary** site node external to the Kubernetes cluster to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -699,7 +699,7 @@ If you are running GitLab 14.5 and later:
If you are running GitLab 14.4 and earlier:
-1. SSH in to the database node in the **secondary** and trigger PostgreSQL to
+1. SSH in to the database node in the **secondary** site and trigger PostgreSQL to
promote to read-write:
```shell
diff --git a/doc/administration/geo/disaster_recovery/planned_failover.md b/doc/administration/geo/disaster_recovery/planned_failover.md
index 2a21bda23d7..57bad6177d9 100644
--- a/doc/administration/geo/disaster_recovery/planned_failover.md
+++ b/doc/administration/geo/disaster_recovery/planned_failover.md
@@ -12,10 +12,10 @@ the event of unplanned outage, but it can be used in conjunction with a planned
failover to migrate your GitLab instance between regions without extended
downtime.
-As replication between Geo nodes is asynchronous, a planned failover requires
-a maintenance window in which updates to the **primary** node are blocked. The
+As replication between Geo sites is asynchronous, a planned failover requires
+a maintenance window in which updates to the **primary** site are blocked. The
length of this window is determined by your replication capacity - once the
-**secondary** node is completely synchronized with the **primary** node, the failover can occur without
+**secondary** site is completely synchronized with the **primary** site, the failover can occur without
data loss.
This document assumes you already have a fully configured, working Geo setup.
@@ -28,7 +28,7 @@ have a high degree of confidence in being able to perform them accurately.
## Not all data is automatically replicated
If you are using any GitLab features that Geo [doesn't support](../replication/datatypes.md#limitations-on-replicationverification),
-you must make separate provisions to ensure that the **secondary** node has an
+you must make separate provisions to ensure that the **secondary** site has an
up-to-date copy of any data associated with that feature. This may extend the
required scheduled maintenance period significantly.
@@ -36,7 +36,7 @@ A common strategy for keeping this period as short as possible for data stored
in files is to use `rsync` to transfer the data. An initial `rsync` can be
performed ahead of the maintenance window; subsequent `rsync`s (including a
final transfer inside the maintenance window) then transfers only the
-*changes* between the **primary** node and the **secondary** nodes.
+*changes* between the **primary** site and the **secondary** sites.
Repository-centric strategies for using `rsync` effectively can be found in the
[moving repositories](../../operations/moving_repositories.md) documentation; these strategies can
@@ -98,31 +98,31 @@ Doing so reduces both the length of the maintenance window, and the risk of data
loss as a result of a poorly executed planned failover.
In GitLab 12.4, you can optionally allow GitLab to manage replication of Object Storage for
-**secondary** nodes. For more information, see [Object Storage replication](../replication/object_storage.md).
+**secondary** sites. For more information, see [Object Storage replication](../replication/object_storage.md).
-### Review the configuration of each **secondary** node
+### Review the configuration of each **secondary** site
-Database settings are automatically replicated to the **secondary** node, but the
+Database settings are automatically replicated to the **secondary** site, but the
`/etc/gitlab/gitlab.rb` file must be set up manually, and differs between
-nodes. If features such as Mattermost, OAuth or LDAP integration are enabled
-on the **primary** node but not the **secondary** node, they are lost during failover.
+sites. If features such as Mattermost, OAuth or LDAP integration are enabled
+on the **primary** site but not the **secondary** site, they are lost during failover.
-Review the `/etc/gitlab/gitlab.rb` file for both nodes and ensure the **secondary** node
-supports everything the **primary** node does **before** scheduling a planned failover.
+Review the `/etc/gitlab/gitlab.rb` file for both sites and ensure the **secondary** site
+supports everything the **primary** site does **before** scheduling a planned failover.
### Run system checks
-Run the following on both **primary** and **secondary** nodes:
+Run the following on both **primary** and **secondary** sites:
```shell
gitlab-rake gitlab:check
gitlab-rake gitlab:geo:check
```
-If any failures are reported on either node, they should be resolved **before**
+If any failures are reported on either site, they should be resolved **before**
scheduling a planned failover.
-### Check that secrets match between nodes
+### Check that secrets and SSH host keys match between nodes
The SSH host keys and `/etc/gitlab/gitlab-secrets.json` files should be
identical on all nodes. Check this by running the following on all nodes and
@@ -132,8 +132,14 @@ comparing the output:
sudo sha256sum /etc/ssh/ssh_host* /etc/gitlab/gitlab-secrets.json
```
-If any files differ, replace the content on the **secondary** node with the
-content from the **primary** node.
+If any files differ, [manually replicate GitLab secrets](../replication/configuration.md#step-1-manually-replicate-secret-gitlab-values) and [replicate SSH host keys](../replication/configuration.md#step-2-manually-replicate-the-primary-sites-ssh-host-keys)
+to the **secondary** site as necessary.
+
+### Check that the correct certificates are installed for HTTPS
+
+This step can be safely skipped if the **primary** site and all external sites accessed by the **primary** site use public CA-issued certificates.
+
+If the **primary** site uses custom or self-signed TLS certificates to secure inbound connections or if the **primary** site connects to external services that use custom or self-signed certificates, the correct certificates should also be installed on the **secondary** site. Follow instructions for [using custom certificates](../replication/configuration.md#step-4-optional-using-custom-certificates) with **secondary** sites.
### Ensure Geo replication is up-to-date
@@ -141,13 +147,13 @@ The maintenance window won't end until Geo replication and verification is
completely finished. To keep the window as short as possible, you should
ensure these processes are close to 100% as possible during active use.
-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. On the left sidebar, select **Geo > Sites**.
Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
- objects aren't yet replicated (shown in gray), consider giving the node more
+ objects aren't yet replicated (shown in gray), consider giving the site more
time to complete
![Replication status](../replication/img/geo_dashboard_v14_0.png)
@@ -160,7 +166,7 @@ You can use the [Geo status API](../../../api/geo_nodes.md#retrieve-project-sync
the reasons for failure.
A common cause of replication failures is the data being missing on the
-**primary** node - you can resolve these failures by restoring the data from backup,
+**primary** site - you can resolve these failures by restoring the data from backup,
or removing references to the missing data.
### Verify the integrity of replicated data
@@ -169,21 +175,21 @@ This [content was moved to another location](background_verification.md).
### Notify users of scheduled maintenance
-On the **primary** node:
+On the **primary** site:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Messages**.
1. Add a message notifying users on the maintenance window.
- You can check under **Geo > Nodes** to estimate how long it
+ You can check under **Geo > Sites** to estimate how long it
takes to finish syncing.
1. Select **Add broadcast message**.
-## Prevent updates to the **primary** node
+## Prevent updates to the **primary** site
To ensure that all data is replicated to a secondary site, updates (write requests) need to
be disabled on the **primary** site:
-1. Enable [maintenance mode](../../maintenance_mode/index.md) on the **primary** node.
+1. Enable [maintenance mode](../../maintenance_mode/index.md) on the **primary** site.
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
1. On the Sidekiq dashboard, select **Cron**.
@@ -199,22 +205,22 @@ GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary
1. If you are manually replicating any data not managed by Geo, trigger the
final replication process now.
-1. On the **primary** node:
+1. On the **primary** site:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
1. On the Sidekiq dashboard, select **Queues**, and wait for all queues except
those with `geo` in the name to drop to 0.
These queues contain work that has been submitted by your users; failing over
before it is completed, causes the work to be lost.
- 1. On the left sidebar, select **Geo > Nodes** and wait for the
- following conditions to be true of the **secondary** node you are failing over to:
+ 1. On the left sidebar, select **Geo > Sites** and wait for the
+ following conditions to be true of the **secondary** site you are failing over to:
- All replication meters reach 100% replicated, 0% failures.
- All verification meters reach 100% verified, 0% failures.
- Database replication lag is 0ms.
- The Geo log cursor is up to date (0 events behind).
-1. On the **secondary** node:
+1. On the **secondary** site:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
1. On the Sidekiq dashboard, select **Queues**, and wait for all the `geo`
@@ -222,16 +228,16 @@ GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary
1. [Run an integrity check](../../raketasks/check.md) to verify the integrity
of CI artifacts, LFS objects, and uploads in file storage.
-At this point, your **secondary** node contains an up-to-date copy of everything the
-**primary** node has, meaning nothing was lost when you fail over.
+At this point, your **secondary** site contains an up-to-date copy of everything the
+**primary** site has, meaning nothing was lost when you fail over.
-## Promote the **secondary** node
+## Promote the **secondary** site
-After the replication is finished, [promote the **secondary** node to a **primary** node](index.md). This process causes a brief outage on the **secondary** node, and users may need to log in again. If you follow the steps correctly, the old primary Geo site should still be disabled and user traffic should go to the newly-promoted site instead.
+After the replication is finished, [promote the **secondary** site to a **primary** site](index.md). This process causes a brief outage on the **secondary** site, and users may need to log in again. If you follow the steps correctly, the old primary Geo site should still be disabled and user traffic should go to the newly-promoted site instead.
-When the promotion is completed, the maintenance window is over, and your new **primary** node now
+When the promotion is completed, the maintenance window is over, and your new **primary** site now
begins to diverge from the old one. If problems do arise at this point, failing
-back to the old **primary** node [is possible](bring_primary_back.md), but likely to result
+back to the old **primary** site [is possible](bring_primary_back.md), but likely to result
in the loss of any data uploaded to the new **primary** in the meantime.
Don't forget to remove the broadcast message after the failover is complete.
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
index 9b3e0ecb427..59134df8e7f 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_multi_node.md
@@ -69,7 +69,7 @@ GitLab 13.9 through GitLab 14.3 are affected by a bug in which the Geo secondary
On the **secondary** site:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes** to see its status.
+1. On the left sidebar, select **Geo > Sites** to see its status.
Replicated objects (shown in green) should be close to 100%,
and there should be no failures (shown in red). If a large proportion of
objects aren't yet replicated (shown in gray), consider giving the site more
@@ -84,7 +84,7 @@ failed to replicate is **lost**.
You can use the
[Geo status API](../../../../api/geo_nodes.md#retrieve-project-sync-or-verification-failures-that-occurred-on-the-current-node)
to review failed objects and the reasons for failure.
-A common cause of replication failures is the data being missing on the
+A common cause of replication failures is data that is missing on the
**primary** site - you can resolve these failures by restoring the data from backup,
or removing references to the missing data.
@@ -100,22 +100,22 @@ follow these steps to avoid unnecessary data loss:
**primary**. Your **secondary** site still needs read-only
access to the **primary** site during the maintenance window:
- 1. At the scheduled time, using your cloud provider or your node's firewall, block
- all HTTP, HTTPS and SSH traffic to/from the **primary** node, **except** for your IP and
- the **secondary** node's IP.
+ 1. At the scheduled time, using your cloud provider or your site's firewall, block
+ all HTTP, HTTPS and SSH traffic to/from the **primary** site, **except** for your IP and
+ the **secondary** site's IP.
- For instance, you can run the following commands on the **primary** node:
+ For instance, you can run the following commands on the **primary** site:
```shell
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 22 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 22 -j ACCEPT
sudo iptables -A INPUT --destination-port 22 -j REJECT
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 80 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 80 -j ACCEPT
sudo iptables -A INPUT --tcp-dport 80 -j REJECT
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 443 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 443 -j ACCEPT
sudo iptables -A INPUT --tcp-dport 443 -j REJECT
```
@@ -157,8 +157,8 @@ follow these steps to avoid unnecessary data loss:
those with `geo` in the name to drop to 0.
These queues contain work that has been submitted by your users; failing over
before it is completed, causes the work to be lost.
- 1. On the left sidebar, select **Geo > Nodes** and wait for the
- following conditions to be true of the **secondary** node you are failing over to:
+ 1. On the left sidebar, select **Geo > Sites** and wait for the
+ following conditions to be true of the **secondary** site you are failing over to:
- All replication meters reach 100% replicated, 0% failures.
- All verification meters reach 100% verified, 0% failures.
@@ -230,13 +230,13 @@ follow these steps to avoid unnecessary data loss:
1. SSH to every Sidekiq, PostgresSQL, and Gitaly node in the **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -244,13 +244,13 @@ follow these steps to avoid unnecessary data loss:
1. SSH into each Rails node on your **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -264,7 +264,7 @@ follow these steps to avoid unnecessary data loss:
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
NOTE:
diff --git a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
index fa30b11fe32..25f6999ce43 100644
--- a/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
+++ b/doc/administration/geo/disaster_recovery/runbooks/planned_failover_single_node.md
@@ -85,22 +85,22 @@ follow these steps to avoid unnecessary data loss:
**primary**. Your **secondary** site still needs read-only
access to the **primary** site during the maintenance window:
- 1. At the scheduled time, using your cloud provider or your node's firewall, block
- all HTTP, HTTPS and SSH traffic to/from the **primary** node, **except** for your IP and
- the **secondary** node's IP.
+ 1. At the scheduled time, using your cloud provider or your site's firewall, block
+ all HTTP, HTTPS and SSH traffic to/from the **primary** site, **except** for your IP and
+ the **secondary** site's IP.
- For instance, you can run the following commands on the **primary** node:
+ For instance, you can run the following commands on the **primary** site:
```shell
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 22 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 22 -j ACCEPT
sudo iptables -A INPUT --destination-port 22 -j REJECT
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 80 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 80 -j ACCEPT
sudo iptables -A INPUT --tcp-dport 80 -j REJECT
- sudo iptables -A INPUT -p tcp -s <secondary_node_ip> --destination-port 443 -j ACCEPT
+ sudo iptables -A INPUT -p tcp -s <secondary_site_ip> --destination-port 443 -j ACCEPT
sudo iptables -A INPUT -p tcp -s <your_ip> --destination-port 443 -j ACCEPT
sudo iptables -A INPUT --tcp-dport 443 -j REJECT
```
@@ -120,7 +120,7 @@ follow these steps to avoid unnecessary data loss:
1. On the **primary** site:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Monitoring > Background Jobs**.
- 1. On the Sidekiq dhasboard, select **Cron**.
+ 1. On the Sidekiq dashboard, select **Cron**.
1. Select `Disable All` to disable any non-Geo periodic background jobs.
1. Select `Enable` for the `geo_sidekiq_cron_config_worker` cron job.
This job re-enables several other cron jobs that are essential for planned
@@ -142,7 +142,7 @@ follow these steps to avoid unnecessary data loss:
those with `geo` in the name to drop to 0.
These queues contain work that has been submitted by your users; failing over
before it is completed, causes the work to be lost.
- 1. On the left sidebar, select **Geo > Nodes** and wait for the
+ 1. On the left sidebar, select **Geo > Sites** and wait for the
following conditions to be true of the **secondary** site you are failing over to:
- All replication meters reach 100% replicated, 0% failures.
@@ -224,15 +224,15 @@ Note the following when promoting a secondary:
To promote the secondary site running GitLab 14.5 and later:
-1. SSH in to your **secondary** node and run one of the following commands:
+1. SSH in to your **secondary** site and run one of the following commands:
- - To promote the secondary node to primary:
+ - To promote the secondary site to primary:
```shell
sudo gitlab-ctl geo promote
```
- - To promote the secondary node to primary **without any further confirmation**:
+ - To promote the secondary site to primary **without any further confirmation**:
```shell
sudo gitlab-ctl geo promote --force
@@ -247,7 +247,7 @@ To promote the secondary site running GitLab 14.4 and earlier:
WARNING:
The `gitlab-ctl promote-to-primary-node` and `gitlab-ctl promoted-db` commands are
-deprecated in GitLab 14.5 and later, and are scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
+deprecated in GitLab 14.5 and later, and [removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/345207).
Use `gitlab-ctl geo promote` instead.
1. SSH in to your **secondary** site and login as root:
diff --git a/doc/administration/geo/glossary.md b/doc/administration/geo/glossary.md
index a18e78a5e01..c6b3f26dc67 100644
--- a/doc/administration/geo/glossary.md
+++ b/doc/administration/geo/glossary.md
@@ -26,9 +26,9 @@ these definitions yet.
| Single-node site | A specific configuration of GitLab that uses exactly one node. | GitLab | single-server, single-instance
| Multi-node site | A specific configuration of GitLab that uses more than one node. | GitLab | multi-server, multi-instance, high availability |
| Primary site | A GitLab site whose data is being replicated by at least one secondary site. There can only be a single primary site. | Geo-specific | Geo deployment, Primary node |
-| Secondary site(s) | A GitLab site that is configured to replicate the data of a primary site. There can be one or more secondary sites. | Geo-specific | Geo deployment, Secondary node |
+| Secondary site | A GitLab site that is configured to replicate the data of a primary site. There can be one or more secondary sites. | Geo-specific | Geo deployment, Secondary node |
| Geo deployment | A collection of two or more GitLab sites with exactly one primary site being replicated by one or more secondary sites. | Geo-specific | |
-| Reference architecture(s) | A [specified configuration of GitLab for a number of users](../reference_architectures/index.md), possibly including multiple nodes and multiple sites. | GitLab | |
+| Reference architecture | A [specified configuration of GitLab for a number of users](../reference_architectures/index.md), possibly including multiple nodes and multiple sites. | GitLab | |
| Promoting | Changing the role of a site from secondary to primary. | Geo-specific | |
| Demoting | Changing the role of a site from primary to secondary. | Geo-specific | |
| Failover | The entire process that shifts users from a primary Site to a secondary site. This includes promoting a secondary, but contains other parts as well. For example, scheduling maintenance. | Geo-specific | |
diff --git a/doc/administration/geo/index.md b/doc/administration/geo/index.md
index 1b80e91c9c4..dc25be825ea 100644
--- a/doc/administration/geo/index.md
+++ b/doc/administration/geo/index.md
@@ -254,7 +254,7 @@ Omnibus GitLab-managed database. External databases are not supported.
In some circumstances, like during [upgrades](replication/updating_the_geo_sites.md) or a [planned failover](disaster_recovery/planned_failover.md), it is desirable to pause replication between the primary and secondary.
-Pausing and resuming replication is done via a command line tool from the a node in the secondary site where the `postgresql` service is enabled.
+Pausing and resuming replication is done via a command line tool from the node in the secondary site where the `postgresql` service is enabled.
If `postgresql` is on a standalone database node, ensure that `gitlab.rb` on that node contains the configuration line `gitlab_rails['geo_node_name'] = 'node_name'`, where `node_name` is the same as the `geo_name_name` on the application node.
@@ -288,7 +288,7 @@ For more information on how to replicate the Container Registry, see [Docker Reg
### Geo secondary proxy
-For more information on using Geo proxying on secondary nodes, see [Geo proxying for secondary sites](secondary_proxy/index.md).
+For more information on using Geo proxying on secondary sites, see [Geo proxying for secondary sites](secondary_proxy/index.md).
### Security Review
diff --git a/doc/administration/geo/replication/configuration.md b/doc/administration/geo/replication/configuration.md
index 16b4848e6d3..adf89c24a4e 100644
--- a/doc/administration/geo/replication/configuration.md
+++ b/doc/administration/geo/replication/configuration.md
@@ -129,7 +129,7 @@ keys must be manually replicated to the **secondary** site.
```shell
chown root:root /etc/ssh/ssh_host_*_key*
- chmod 0600 /etc/ssh/ssh_host_*_key*
+ chmod 0600 /etc/ssh/ssh_host_*_key
```
1. To verify key fingerprint matches, execute the following command on both primary and secondary nodes on each site:
@@ -241,15 +241,60 @@ that the **secondary** site can act on those notifications immediately.
Be sure the _secondary_ site is running and accessible. You can sign in to the
_secondary_ site with the same credentials as were used with the _primary_ site.
-### Step 4. (Optional) Configuring the **secondary** site to trust the **primary** site
+### Step 4. (Optional) Using custom certificates
-You can safely skip this step if your **primary** site uses a CA-issued HTTPS certificate.
+You can safely skip this step if:
-If your **primary** site is using a self-signed certificate for *HTTPS* support, you
-need to add that certificate to the **secondary** site's trust store. Retrieve the
-certificate from the **primary** site and follow
-[these instructions](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates)
-on the **secondary** site.
+- Your **primary** site uses a public CA-issued HTTPS certificate.
+- Your **primary** site only connects to external services with CA-issued (not self-signed) HTTPS certificates.
+
+#### Custom or self-signed certificate for inbound connections
+
+If your GitLab Geo **primary** site uses a custom or [self-signed certificate to secure inbound HTTPS connections](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates), this certificate can either be single-domain certificate or multi-domain.
+
+Install the correct certificate based on your certificate type:
+
+- **Multi-domain certificate** that includes both primary and secondary site domains: Install the certificate at `/etc/gitlab/ssl` on all **Rails, Sidekiq, and Gitaly** nodes in the **secondary** site.
+- **Single-domain certificate** where the certificates are specific to each Geo site domain: Generate a valid certificate for your **secondary** site's domain and install it at `/etc/gitlab/ssl` per [these instructions](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates) on all **Rails, Sidekiq, and Gitaly** nodes in the **secondary** site.
+
+#### Connecting to external services that use customer certificates
+
+A copy of the self-signed certificate for the external service needs to be added to the trust store on all the **primary** site's nodes that require access to the service.
+
+For the **secondary** site to be able to access the same external services, these certificates *must* be added to the **secondary** site's trust store.
+
+If your **primary** site is using a [custom or self-signed certificate for inbound HTTPS connections](#custom-or-self-signed-certificate-for-inbound-connections), the **primary** site's certificate needs to be added to the **secondary** site's trust store:
+
+1. SSH into each **Rails, Sidekiq, and Gitaly node on your secondary** site and login as root:
+
+ ```shell
+ sudo -i
+ ```
+
+1. Copy the trusted certs from the **primary** site:
+
+ If you can access one of the nodes on your **primary** site serving SSH traffic using the root user:
+
+ ```shell
+ scp root@<primary_site_node_fqdn>:/etc/gitlab/trusted-certs/* /etc/gitlab/trusted-certs
+ ```
+
+ If you only have access through a user with sudo privileges:
+
+ ```shell
+ # Run this from the node on your primary site:
+ sudo tar --transform 's/.*\///g' -zcvf ~/geo-trusted-certs.tar.gz /etc/gitlab/trusted-certs/*
+
+ # Run this on each node on your secondary site:
+ scp <user_with_sudo>@<primary_site_node_fqdn>:geo-trusted-certs.tar.gz .
+ tar zxvf ~/geo-trusted-certs.tar.gz -C /etc/gitlab/trusted-certs
+ ```
+
+1. Reconfigure each updated **Rails, Sidekiq, and Gitaly node in your secondary** site:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
### Step 5. Enable Git access over HTTP/HTTPS
diff --git a/doc/administration/geo/replication/multiple_servers.md b/doc/administration/geo/replication/multiple_servers.md
index 87b1aa7fc44..7b800817461 100644
--- a/doc/administration/geo/replication/multiple_servers.md
+++ b/doc/administration/geo/replication/multiple_servers.md
@@ -119,7 +119,7 @@ NOTE:
[NFS](../../nfs.md) can be used in place of Gitaly but is not
recommended.
-### Step 2: Configure Postgres streaming replication
+### Step 2: Configure PostgreSQL streaming replication
Follow the [Geo database replication instructions](../setup/database.md).
@@ -261,7 +261,7 @@ nodes connect to the databases.
NOTE:
Make sure that current node's IP is listed in
`postgresql['md5_auth_cidr_addresses']` setting of the read-replica database to
-allow Rails on this node to connect to Postgres.
+allow Rails on this node to connect to PostgreSQL.
After making these changes [Reconfigure GitLab](../../restart_gitlab.md#omnibus-gitlab-reconfigure) so the changes take effect.
diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md
index 871d6041066..5a29c5a3c54 100644
--- a/doc/administration/geo/replication/troubleshooting.md
+++ b/doc/administration/geo/replication/troubleshooting.md
@@ -419,6 +419,21 @@ sudo gitlab-ctl reconfigure
To help us resolve this problem, consider commenting on
[the issue](https://gitlab.com/gitlab-org/gitlab/-/issues/4489).
+### Message: `FATAL: could not connect to the primary server: server certificate for "PostgreSQL" does not match host name`
+
+This happens because the PostgreSQL certificate that the Omnibus GitLab package automatically creates contains
+the Common Name `PostgreSQL`, but the replication is connecting to a different host and GitLab attempts to use
+the `verify-full` SSL mode by default.
+
+In order to fix this, you can either:
+
+- Use the `--sslmode=verify-ca` argument with the `replicate-geo-database` command.
+- For an already replicated database, change `sslmode=verify-full` to `sslmode=verify-ca`
+ in `/var/opt/gitlab/postgresql/data/gitlab-geo.conf` and run `gitlab-ctl restart postgresql`.
+- [Configure SSL for PostgreSQL](https://docs.gitlab.com/omnibus/settings/database.html#configuring-ssl)
+ with a custom certificate (including the host name that's used to connect to the database in the CN or SAN)
+ instead of using the automatically generated certificate.
+
### Message: `LOG: invalid CIDR mask in address`
This happens on wrongly-formatted addresses in `postgresql['md5_auth_cidr_addresses']`.
@@ -637,9 +652,9 @@ to start again from scratch, there are a few steps that can help you:
1. Reset the Tracking Database.
```shell
- gitlab-rake geo:db:drop # on a secondary app node
- gitlab-ctl reconfigure # on the tracking database node
- gitlab-rake geo:db:setup # on a secondary app node
+ gitlab-rake db:drop:geo # on a secondary app node
+ gitlab-ctl reconfigure # on the tracking database node
+ gitlab-rake db:migrate:geo # on a secondary app node
```
1. Restart previously stopped services.
@@ -977,7 +992,7 @@ On the **primary** node:
1. On the left sidebar, select **Geo > Nodes**.
1. Find the affected **secondary** site and select **Edit**.
1. Ensure the **URL** field matches the value found in `/etc/gitlab/gitlab.rb`
- in `external_url "https://gitlab.example.com"` on the frontend server(s) of
+ in `external_url "https://gitlab.example.com"` on the frontend servers of
the **secondary** node.
## Fixing common errors
@@ -1042,7 +1057,7 @@ Make sure you follow the [Geo database replication](../setup/database.md) instru
If you are using Omnibus GitLab installation, something might have failed during upgrade. You can:
- Run `sudo gitlab-ctl reconfigure`.
-- Manually trigger the database migration by running: `sudo gitlab-rake geo:db:migrate` as root on the **secondary** node.
+- Manually trigger the database migration by running: `sudo gitlab-rake db:migrate:geo` as root on the **secondary** node.
### GitLab indicates that more than 100% of repositories were synced
@@ -1101,12 +1116,70 @@ This is due to [Pages data not being managed by Geo](datatypes.md#limitations-on
Find advice to resolve those error messages in the
[Pages administration documentation](../../../administration/pages/index.md#404-error-after-promoting-a-geo-secondary-to-a-primary-node).
+### Primary site returns 500 error when accessing `/admin/geo/replication/projects`
+
+Navigating to **Admin > Geo > Replication** (or `/admin/geo/replication/projects`) on a primary Geo site, shows a 500 error, while that same link on the secondary works fine. The primary's `production.log` has a similar entry to the following:
+
+```plaintext
+Geo::TrackingBase::SecondaryNotConfigured: Geo secondary database is not configured
+ from ee/app/models/geo/tracking_base.rb:26:in `connection'
+ [..]
+ from ee/app/views/admin/geo/projects/_all.html.haml:1
+```
+
+On a Geo primary site this error can be ignored.
+
+This happens because GitLab is attempting to display registries from the [Geo tracking database](../../../administration/geo/#geo-tracking-database) which doesn't exist on the primary site (only the original projects exist on the primary; no replicated projects are present, therefore no tracking database exists).
+
## Fixing client errors
-### Authorization errors from LFS HTTP(s) client requests
+### Authorization errors from LFS HTTP(S) client requests
You may have problems if you're running a version of [Git LFS](https://git-lfs.github.com/) before 2.4.2.
As noted in [this authentication issue](https://github.com/git-lfs/git-lfs/issues/3025),
requests redirected from the secondary to the primary node do not properly send the
Authorization header. This may result in either an infinite `Authorization <-> Redirect`
loop, or Authorization error messages.
+
+## Recovering from a partial failover
+
+The partial failover to a secondary Geo *site* may be the result of a temporary/transient issue. Therefore, first attempt to run the promote command again.
+
+1. SSH into every Sidekiq, PostgresSQL, Gitaly, and Rails node in the **secondary** site and run one of the following commands:
+
+ - To promote the secondary node to primary:
+
+ ```shell
+ sudo gitlab-ctl geo promote
+ ```
+
+ - To promote the secondary node to primary **without any further confirmation**:
+
+ ```shell
+ sudo gitlab-ctl geo promote --force
+ ```
+
+1. Verify you can connect to the newly-promoted **primary** site using the URL used previously for the **secondary** site.
+1. If **successful**, the **secondary** site is now promoted to the **primary** site.
+
+If the above steps are **not successful**, proceed through the next steps:
+
+1. SSH to every Sidekiq, PostgresSQL, Gitaly and Rails node in the **secondary** site and perform the following operations:
+
+ - Create a `/etc/gitlab/gitlab-cluster.json` file with the following content:
+
+ ```shell
+ {
+ "primary": true,
+ "secondary": false
+ }
+ ```
+
+ - Reconfigure GitLab for the changes to take effect:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+1. Verify you can connect to the newly-promoted **primary** site using the URL used previously for the **secondary** site.
+1. If successful, the **secondary** site is now promoted to the **primary** site.
diff --git a/doc/administration/geo/replication/version_specific_updates.md b/doc/administration/geo/replication/version_specific_updates.md
index b0797445890..6b617a21be8 100644
--- a/doc/administration/geo/replication/version_specific_updates.md
+++ b/doc/administration/geo/replication/version_specific_updates.md
@@ -12,9 +12,9 @@ for updating Geo sites.
## Updating to 14.9
-**DO NOT** update to GitLab 14.9.0.
+**DO NOT** update to GitLab 14.9.0. Instead, use 14.9.1 or later.
-We've discovered an issue with Geo's CI verification feature that may [cause job traces to be lost](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6664). This issue will be fixed in the next patch release.
+We've discovered an issue with Geo's CI verification feature that may [cause job traces to be lost](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6664). This issue was fixed in [the GitLab 14.9.1 patch release](https://about.gitlab.com/releases/2022/03/23/gitlab-14-9-1-released/).
If you have already updated to GitLab 14.9.0, you can disable the feature causing the issue by [disabling the `geo_job_artifact_replication` feature flag](../../feature_flags.md#how-to-enable-and-disable-features-behind-flags).
diff --git a/doc/administration/geo/setup/database.md b/doc/administration/geo/setup/database.md
index 9c917be123e..52f4adc4e03 100644
--- a/doc/administration/geo/setup/database.md
+++ b/doc/administration/geo/setup/database.md
@@ -300,6 +300,24 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
need it when setting up the **secondary** node! The certificate is not sensitive
data.
+ However, this certificate is created with a generic `PostgreSQL` Common Name. For this,
+ you must use the `verify-ca` mode when replicating the database, otherwise,
+ the hostname mismatch will cause errors.
+
+1. Optional. Generate your own SSL certificate and manually
+ [configure SSL for PostgreSQL](https://docs.gitlab.com/omnibus/settings/database.html#configuring-ssl),
+ instead of using the generated certificate.
+
+ You will need at least the SSL certificate and key, and set the `postgresql['ssl_cert_file']` and
+ `postgresql['ssl_key_file']` values to their full paths, as per the Database SSL docs.
+
+ This allows you to use the `verify-full` SSL mode when replicating the database
+ and get the extra benefit of verifying the full hostname in the CN.
+
+ You can use this certificate (that you have also set in `postgresql['ssl_cert_file']`) instead
+ of the certificate from the point above going forward. This will allow you to use `verify-full`
+ without replication errors if the CN matches.
+
#### Step 2. Configure the **secondary** server
1. SSH into your GitLab **secondary** server and login as root:
@@ -367,7 +385,13 @@ There is an [issue where support is being discussed](https://gitlab.com/gitlab-o
-h <primary_node_ip>
```
- When prompted enter the password you set in the first step for the
+ NOTE:
+ If you are using manually generated certificates and plan on using
+ `sslmode=verify-full` to benefit of the full hostname verification,
+ make sure to replace `verify-ca` to `verify-full` when
+ running the command.
+
+ When prompted enter the _plaintext_ password you set in the first step for the
`gitlab_replicator` user. If all worked correctly, you should see
the list of **primary** node's databases.
@@ -455,6 +479,7 @@ data before running `pg_basebackup`.
gitlab-ctl replicate-geo-database \
--slot-name=<secondary_node_name> \
--host=<primary_node_ip>
+ --sslmode=verify-ca
```
NOTE:
@@ -463,6 +488,13 @@ data before running `pg_basebackup`.
When prompted, enter the _plaintext_ password you set up for the `gitlab_replicator`
user in the first step.
+ NOTE:
+ If you have generated custom PostgreSQL certificates, you will want to use
+ `--sslmode=verify-full` (or omit the `sslmode` line entirely), to benefit from the extra
+ validation of the full host name in the certificate CN / SAN for additional security.
+ Otherwise, using the automatically created certificate with `verify-full` will fail,
+ as it has a generic `PostgreSQL` CN which will not match the `--host` value in this command.
+
This command also takes a number of additional options. You can use `--help`
to list them all, but here are a couple of tips:
@@ -1061,7 +1093,7 @@ For each node running the `gitlab-rails`, `sidekiq`, and `geo-logcursor` service
1. Run the tracking database migrations:
```shell
- gitlab-rake geo:db:migrate
+ gitlab-rake db:migrate:geo
```
### Migrating a single tracking database node to Patroni
diff --git a/doc/administration/geo/setup/external_database.md b/doc/administration/geo/setup/external_database.md
index cd77647e7dc..58fd6b28797 100644
--- a/doc/administration/geo/setup/external_database.md
+++ b/doc/administration/geo/setup/external_database.md
@@ -245,11 +245,11 @@ the tracking database on port 5432.
1. The reconfigure should automatically create the database. If needed, you can perform this task manually. This task (whether run by itself or during reconfigure) requires the database user to be a superuser.
```shell
- gitlab-rake geo:db:create
+ gitlab-rake db:create:geo
```
1. The reconfigure should automatically migrate the database. You can migrate the database manually if needed, for example if `geo_secondary['auto_migrate'] = false`:
```shell
- gitlab-rake geo:db:migrate
+ gitlab-rake db:migrate:geo
```
diff --git a/doc/administration/git_protocol.md b/doc/administration/git_protocol.md
index 29156d9b3e1..3612487f456 100644
--- a/doc/administration/git_protocol.md
+++ b/doc/administration/git_protocol.md
@@ -111,4 +111,4 @@ URL to use SSH.
### Observe Git protocol version of connections
For information on observing the Git protocol versions are being used in a production environment,
-see the [relevant documentation](gitaly/index.md#useful-queries).
+see the [relevant documentation](gitaly/monitoring.md#useful-queries).
diff --git a/doc/administration/gitaly/configure_gitaly.md b/doc/administration/gitaly/configure_gitaly.md
index 0fb285c50d6..6888a2abe9a 100644
--- a/doc/administration/gitaly/configure_gitaly.md
+++ b/doc/administration/gitaly/configure_gitaly.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Configure Gitaly **(FREE SELF)**
@@ -217,7 +216,12 @@ disable enforcement. For more information, see the documentation on configuring
1. Edit `/etc/gitlab/gitlab.rb`:
- <!-- Updates to following example must also be made at https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab -->
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
```ruby
# Avoid running unnecessary services on the Gitaly server
@@ -229,10 +233,11 @@ disable enforcement. For more information, see the documentation on configuring
gitlab_workhorse['enable'] = false
grafana['enable'] = false
gitlab_exporter['enable'] = false
+ gitlab_kas['enable'] = false
# If you run a separate monitoring node you can disable these services
- alertmanager['enable'] = false
prometheus['enable'] = false
+ alertmanager['enable'] = false
# If you don't run a separate monitoring node you can
# enable Prometheus access & disable these extra services.
@@ -252,14 +257,14 @@ disable enforcement. For more information, see the documentation on configuring
# Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from Gitaly client to Gitaly server.
gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'
- # Authentication token to ensure only authorized servers can communicate with
- # Gitaly server
- gitaly['auth_token'] = 'AUTH_TOKEN'
-
# Make Gitaly accept connections on all network interfaces. You must use
# firewalls to restrict access to this address/port.
# Comment out following line if you only want to support TLS connections
gitaly['listen_addr'] = "0.0.0.0:8075"
+
+ # Authentication token to ensure only authorized servers can communicate with
+ # Gitaly server
+ gitaly['auth_token'] = 'AUTH_TOKEN'
```
1. Append the following to `/etc/gitlab/gitlab.rb` for each respective Gitaly server:
@@ -710,7 +715,7 @@ To configure Gitaly with TLS:
### Observe type of Gitaly connections
For information on observing the type of Gitaly connections being served, see the
-[relevant documentation](index.md#useful-queries).
+[relevant documentation](monitoring.md#useful-queries).
## `gitaly-ruby`
@@ -773,8 +778,8 @@ settings:
Clone traffic can put a large strain on your Gitaly service. The bulk of the work gets done in the
either of the following RPCs:
-- `SSHUploadPack` (for Git SSH).
-- `PostUploadPack` (for Git HTTP).
+- `SSHUploadPackWithSidechannel` (for Git SSH).
+- `PostUploadPackWithSidechannel` (for Git HTTP).
To prevent such workloads from overwhelming your Gitaly server, you can set concurrency limits in
Gitaly's configuration file. For example:
@@ -784,26 +789,103 @@ Gitaly's configuration file. For example:
gitaly['concurrency'] = [
{
- 'rpc' => "/gitaly.SmartHTTPService/PostUploadPack",
- 'max_per_repo' => 20
+ 'rpc' => "/gitaly.SmartHTTPService/PostUploadPackWithSidechanel",
+ 'max_per_repo' => 20,
+ 'max_queue_time' => "1s",
+ 'max_queue_size' => 10
},
{
- 'rpc' => "/gitaly.SSHService/SSHUploadPack",
+ 'rpc' => "/gitaly.SSHService/SSHUploadPackWithSidechannel",
'max_per_repo' => 20
+ 'max_queue_time' => "1s",
+ 'max_queue_size' => 10
}
]
```
+- `rpc` is the name of the RPC to set a concurrency limit for per repository.
+- `max_per_repo` is the maximum number of in-flight RPC calls for the given RPC per repository.
+- `max_queue_time` is the maximum amount of time a request can wait in the concurrency queue to
+ be picked up by Gitaly.
+- `max_queue_size` is the maximum size the concurrency queue can grow to before requests are rejected by
+ Gitaly.
+
This limits the number of in-flight RPC calls for the given RPCs. The limit is applied per
repository. In the example above:
-- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPack` RPC
- calls in flight, and the same for `SSHUploadPack`.
+- Each repository served by the Gitaly server can have at most 20 simultaneous `PostUploadPackWithSidechannel` and
+ `SSHUploadPackWithSidechannel` RPC calls in flight.
- If another request comes in for a repository that has used up its 20 slots, that request gets
queued.
+- If a request waits in the queue for more than 1 second, it is rejected with an error.
+- If the queue grows beyond 10, subsequent requests are rejected with an error.
You can observe the behavior of this queue using the Gitaly logs and Prometheus. For more
-information, see the [relevant documentation](index.md#monitor-gitaly).
+information, see the [relevant documentation](monitoring.md#monitor-gitaly-concurrency-limiting).
+
+## Control groups
+
+> - Introduced in GitLab 13.10.
+
+Gitaly shells out to Git for many of its operations. Git can consume a lot of resources for certain operations,
+especially for large repositories.
+
+Control groups (cgroups) in Linux allow limits to be imposed on how much memory and CPU can be consumed.
+See the [`cgroups` Linux man page](https://man7.org/linux/man-pages/man7/cgroups.7.html) for more information.
+cgroups can be useful for protecting the system against resource exhaustion because of overconsumption of memory and CPU.
+
+Gitaly has built-in cgroups control. When configured, Gitaly assigns Git
+processes to a cgroup based on the repository the Git command is operating in.
+Each cgroup has a memory and CPU limit. When a cgroup reaches its:
+
+- Memory limit, the kernel looks through the processes for a candidate to kill.
+- CPU limit, processes are not killed, but the processes are prevented from consuming more CPU than allowed.
+
+The main reason to configure cgroups for your GitLab installation is that it
+protects against system resource starvation due to a few large repositories or
+bad actors.
+
+Some Git operations are expensive by nature. `git clone`, for instance,
+spawns a `git-upload-pack` process on the server that can consume a lot of memory
+for large repositories. For example, a client that keeps on cloning a
+large repository over and over again. This situation could potentially use up all of the
+memory on a server, causing other operations to fail for other users.
+
+There are many ways someone can create a repository that can consume large amounts of memory when cloned or downloaded.
+Using cgroups allows the kernel to kill these operations before they hog up all system resources.
+
+### Configure cgroups in Gitaly
+
+To configure cgroups in Gitaly, add `gitaly['cgroups']` to `/etc/gitlab/gitlab.rb`. For
+example:
+
+```ruby
+# in /etc/gitlab/gitlab.rb
+gitaly['cgroups_count'] = 1000
+gitaly['cgroups_mountpoint'] = "/sys/fs/cgroup"
+gitaly['cgroups_hierarchy_root'] = "gitaly"
+gitaly['cgroups_memory_limit'] = 32212254720
+gitaly['cgroups_memory_enabled'] = true
+gitaly['cgroups_cpu_shares'] = 1024
+gitaly['cgroups_cpu_enabled'] = true
+
+```
+
+- `cgroups_count` is the number of cgroups created. Each time a new
+ command is spawned, Gitaly assigns it to one of these cgroups based
+ on the command line arguments of the command. A circular hashing algorithm assigns
+ commands to these cgroups.
+- `cgroups_mountpoint` is where the parent cgroup directory is mounted. Defaults to `/sys/fs/cgroup`.
+- `cgroups_hierarchy_root` is the parent cgroup under which Gitaly creates groups, and
+ is expected to be owned by the user and group Gitaly runs as. Omnibus GitLab
+ creates the set of directories `mountpoint/<cpu|memory>/hierarchy_root`
+ when Gitaly starts.
+- `cgroups_memory_enabled` enables or disables the memory limit on cgroups.
+- `cgroups_memory_bytes` is the total memory limit each cgroup imposes on the processes added to it.
+- `cgroups_cpu_enabled` enables or disables the CPU limit on cgroups.
+- `cgroups_cpu_shares` is the CPU limit each cgroup imposes on the processes added to it. The maximum is 1024 shares,
+ which represents 100% of CPU.
+ which represents 100% of CPU.
## Background Repository Optimization
@@ -858,7 +940,7 @@ server" and "Gitaly client" refers to the same machine.
### Verify authentication monitoring
Before rotating a Gitaly authentication token, verify that you can
-[monitor the authentication behavior](index.md#useful-queries) of your GitLab installation using
+[monitor the authentication behavior](monitoring.md#useful-queries) of your GitLab installation using
Prometheus.
You can then continue the rest of the procedure.
@@ -1068,7 +1150,7 @@ closed it.
### Observe the cache
-The cache can be observed [using metrics](index.md#monitor-gitaly) and in the following logged
+The cache can be observed [using metrics](monitoring.md#pack-objects-cache) and in the following logged
information:
|Message|Fields|Description|
diff --git a/doc/administration/gitaly/faq.md b/doc/administration/gitaly/faq.md
index b0a88e8adc9..a5c2c7d1469 100644
--- a/doc/administration/gitaly/faq.md
+++ b/doc/administration/gitaly/faq.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Frequently asked questions **(FREE SELF)**
diff --git a/doc/administration/gitaly/index.md b/doc/administration/gitaly/index.md
index 8e4464bba43..f43f9f5d6c1 100644
--- a/doc/administration/gitaly/index.md
+++ b/doc/administration/gitaly/index.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Gitaly and Gitaly Cluster **(FREE SELF)**
@@ -57,7 +56,7 @@ If you have:
- Not yet migrated to Gitaly Cluster and want to continue using NFS, remain on the service you are using. NFS is
supported in 14.x releases but is [deprecated](../../update/deprecations.md#nfs-for-git-repository-storage).
-Support for storing Git repository data on NFS will end for all versions of GitLab with the release of 15.0.
+ Support for storing Git repository data on NFS is scheduled to end for all versions of GitLab on November 22, 2022.
- Not yet migrated to Gitaly Cluster but want to migrate away from NFS, you have two options:
- A sharded Gitaly instance.
- Gitaly Cluster.
@@ -72,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-live-upgrade-assistance.html) 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 live upgrade assistance](https://about.gitlab.com/support/scheduling-upgrade-assistance.html) 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
@@ -233,9 +232,142 @@ variable replication factor is tracked in [this issue](https://gitlab.com/groups
As with normal Gitaly storages, virtual storages can be sharded.
+### Storage layout
+
+WARNING:
+The storage layout is an internal detail of Gitaly Cluster and is not guaranteed to remain stable between releases.
+The information here is only for informational purposes and to help with debugging. Performing changes in the
+repositories directly on the disk is not supported and may lead to breakage or the changes being overwritten.
+
+Gitaly Cluster's virtual storages provide an abstraction that looks like a single storage but actually consists of
+multiple physical storages. Gitaly Cluster has to replicate each operation to each physical storage. Operations
+may succeed on some of the physical storages but fail on others.
+
+Partially applied operations can cause problems with other operations and leave the system in a state it can't recover from.
+To avoid these types of problems, each operation should either fully apply or not apply at all. This property of operations is called
+[atomicity](https://en.wikipedia.org/wiki/Atomicity_(database_systems)).
+
+GitLab controls the storage layout on the repository storages. GitLab instructs the repository storage where to create,
+delete, and move repositories. These operations create atomicity issues when they are being applied to multiple physical storages.
+For example:
+
+- GitLab deletes a repository while one of its replicas is unavailable.
+- GitLab later recreates the repository.
+
+As a result, the stale replica that was unavailable at the time of deletion may cause conflicts and prevent
+recreation of the repository.
+
+These atomicity issues have caused multiple problems in the past with:
+
+- Geo syncing to a secondary site with Gitaly Cluster.
+- Backup restoration.
+- Repository moves between repository storages.
+
+Gitaly Cluster provides atomicity for these operations by storing repositories on the disk in a special layout that prevents
+conflicts that could occur due to partially applied operations.
+
+#### Client-generated replica paths
+
+Repositories are stored in the storages at the relative path determined by the [Gitaly client](#gitaly-architecture). These paths can be
+identified by them not beginning with the `@cluster` prefix. The relative paths
+follow the [hashed storage](../repository_storage_types.md#hashed-storage) schema.
+
+#### Praefect-generated replica paths (GitLab 15.0 and later)
+
+> Introduced in GitLab 15.0 behind [a feature flag](https://gitlab.com/gitlab-org/gitaly/-/issues/4218) named `gitaly_praefect_generated_replica_paths`. 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](../feature_flags.md)
+named `gitaly_praefect_generated_replica_paths`. 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 Gitaly Cluster creates a repository, it assigns the repository a unique and permanent ID called the _repository ID_. The repository ID is
+internal to Gitaly Cluster and doesn't relate to any IDs elsewhere in GitLab. If a repository is removed from Gitaly Cluster and later moved
+back, the repository is assigned a new repository ID and is a different repository from Gitaly Cluster's perspective. The sequence of repository IDs
+always increases, but there may be gaps in the sequence.
+
+The repository ID is used to derive a unique storage path called _replica path_ for each repository on the cluster. The replicas of
+a repository are all stored at the same replica path on the storages. The replica path is distinct from the _relative path_:
+
+- The relative path is a name the Gitaly client uses to identify a repository, together with its virtual storage, that is unique to them.
+- The replica path is the actual physical path in the physical storages.
+
+Praefect translates the repositories in the RPCs from the virtual `(virtual storage, relative path)` identifier into physical repository
+`(storage, replica_path)` identifier when handling the client requests.
+
+The format of the replica path for:
+
+- Object pools is `@cluster/pools/<xx>/<xx>/<repository ID>`. Object pools are stored in a different directory than other repositories.
+ They must be identifiable by Gitaly to avoid pruning them as part of housekeeping. Pruning object pools can cause data loss in the linked
+ repositories.
+- Other repositories is `@cluster/repositories/<xx>/<xx>/<repository ID>`
+
+For example, `@cluster/repositories/6f/96/54771`.
+
+The last component of the replica path, `54771`, is the repository ID. This can be used to identify the repository on the disk.
+
+`<xx>/<xx>` are the first four hex digits of the SHA256 hash of the string representation of the repository ID. This is used to balance
+the repositories evenly into subdirectories to avoid overly large directories that might cause problems on some file
+systems. In this case, `54771` hashes to `6f960ab01689464e768366d3315b3d3b2c28f38761a58a70110554eb04d582f7` so the
+first four digits are `6f` and `96`.
+
+#### Identify repositories on disk
+
+Use the [`praefect metadata`](troubleshooting.md#view-repository-metadata) subcommand to:
+
+- Retrieve a repository's virtual storage and relative path from the metadata store. After you have the hashed storage path, you can use the Rails
+ console to retrieve the project path.
+- Find where a repository is stored in the cluster with either:
+ - The virtual storage and relative path.
+ - The repository ID.
+
+The repository on disk also contains the project path in the Git configuration file. The configuration file can be used to determine
+the project's location even if the repository's metadata has been deleted. Follow the
+[instructions in hashed storage's documentation](../repository_storage_types.md#from-hashed-path-to-project-name).
+
+#### Atomicity of operations
+
+Gitaly Cluster uses the PostgreSQL metadata store with the storage layout to ensure atomicity of repository creation,
+deletion, and move operations. The disk operations can't be atomically applied across multiple storages. However, PostgreSQL guarantees
+the atomicity of the metadata operations. Gitaly Cluster models the operations in a manner that the failing operations always leave
+the metadata consistent. The disks may contain stale state even after successful operations. This is expected and the leftover state
+won't intefere with future operations but may use up disk space unnecessarily until a clean up is performed.
+
+There is on-going work on a [background crawler](https://gitlab.com/gitlab-org/gitaly/-/issues/3719) that cleans up the leftover
+repositories from the storages.
+
+##### Repository creations
+
+When creating repositories, Praefect:
+
+1. Reserves a repository ID from PostgreSQL. This is atomic and no two creations receive the same ID.
+1. Creates replicas on the Gitaly storages in the replica path derived from the repository ID.
+1. Creates metadata records after the repository is successfully created on disk.
+
+Even if two concurrent operations create the same repository, they'd be stored in different directories on the storages and not
+conflict. The first to complete creates the metadata record and the other operation fails with an "already exists" error.
+The failing creation leaves leftover repositories on the storages. There is on-going work on a
+[background crawler](https://gitlab.com/gitlab-org/gitaly/-/issues/3719) that clean up the leftover repositories from the storages.
+
+The repository IDs are generated from the `repositories_repository_id_seq` in PostgreSQL. In the above example, the failing operation took
+one repository ID without successfully creating a repository with it. Failed repository creations are expected lead to gaps in the repository IDs.
+
+##### Repository deletions
+
+A repository is deleted by removing its metadata record. The repository ceases to logically exist as soon as the metadata record is deleted.
+PostgreSQL guarantees the atomicity of the removal and a concurrent delete fails with a "not found" error. After successfully deleting
+the metadata record, Praefect attempts to remove the replicas from the storages. This may fail and leave leftover state in the storages.
+The leftover state is eventually cleaned up.
+
+##### Repository moves
+
+Unlike Gitaly, Gitaly Cluster doesn't move the repositories in the storages but only virtually moves the repository by updating the
+relative path of the repository in the metadata store.
+
### Moving beyond NFS
-Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be unavailable starting GitLab 15.0. Please see our [statement of support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for more details.
+Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be unavailable starting
+November 22, 2022. Please see our [statement of support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs)
+for more details.
[Network File System (NFS)](https://en.wikipedia.org/wiki/Network_File_System)
is not well suited to Git workloads which are CPU and IOPS sensitive.
@@ -316,7 +448,7 @@ The primary node is chosen to serve the request if:
- There are no up to date nodes.
- Any other error occurs during node selection.
-You can [monitor distribution of reads](#monitor-gitaly-cluster) using Prometheus.
+You can [monitor distribution of reads](monitoring.md#monitor-gitaly-cluster) using Prometheus.
#### Strong consistency
@@ -344,7 +476,7 @@ Strong consistency:
- The [13.12 documentation](https://docs.gitlab.com/13.12/ee/administration/gitaly/praefect.html#strong-consistency).
- Is unavailable in GitLab 13.0 and earlier.
-For more information on monitoring strong consistency, see the Gitaly Cluster [Prometheus metrics documentation](#monitor-gitaly-cluster).
+For more information on monitoring strong consistency, see the Gitaly Cluster [Prometheus metrics documentation](monitoring.md#monitor-gitaly-cluster).
#### Replication factor
@@ -392,167 +524,6 @@ off Gitaly Cluster to a sharded Gitaly instance:
1. [Move the repositories](../operations/moving_repositories.md#move-repositories) to the newly created storage. You can
move them by shard or by group, which gives you the opportunity to spread them over multiple Gitaly servers.
-## Monitor Gitaly and Gitaly Cluster
-
-You can use the available logs and [Prometheus metrics](../monitoring/prometheus/index.md) to
-monitor Gitaly and Gitaly Cluster (Praefect).
-
-Metric definitions are available:
-
-- Directly from Prometheus `/metrics` endpoint configured for Gitaly.
-- Using [Grafana Explore](https://grafana.com/docs/grafana/latest/explore/) on a
- Grafana instance configured against Prometheus.
-
-### Monitor Gitaly
-
-You can observe the behavior of [queued requests](configure_gitaly.md#limit-rpc-concurrency) using
-the Gitaly logs and Prometheus:
-
-- In the [Gitaly logs](../logs.md#gitaly-logs), look for the string (or structured log field)
- `acquire_ms`. Messages that have this field are reporting about the concurrency limiter.
-- In Prometheus, look for the following metrics:
- - `gitaly_rate_limiting_in_progress`.
- - `gitaly_rate_limiting_queued`.
- - `gitaly_rate_limiting_seconds`.
-
- Although the name of the Prometheus metric contains `rate_limiting`, it's a concurrency limiter,
- not a rate limiter. If a Gitaly client makes 1,000 requests in a row very quickly, concurrency
- doesn't exceed 1, and the concurrency limiter has no effect.
-
-The following [pack-objects cache](configure_gitaly.md#pack-objects-cache) metrics are available:
-
-- `gitaly_pack_objects_cache_enabled`, a gauge set to `1` when the cache is enabled. Available
- labels: `dir` and `max_age`.
-- `gitaly_pack_objects_cache_lookups_total`, a counter for cache lookups. Available label: `result`.
-- `gitaly_pack_objects_generated_bytes_total`, a counter for the number of bytes written into the
- cache.
-- `gitaly_pack_objects_served_bytes_total`, a counter for the number of bytes read from the cache.
-- `gitaly_streamcache_filestore_disk_usage_bytes`, a gauge for the total size of cache files.
- Available label: `dir`.
-- `gitaly_streamcache_index_entries`, a gauge for the number of entries in the cache. Available
- label: `dir`.
-
-Some of these metrics start with `gitaly_streamcache` because they are generated by the
-`streamcache` internal library package in Gitaly.
-
-Example:
-
-```plaintext
-gitaly_pack_objects_cache_enabled{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache",max_age="300"} 1
-gitaly_pack_objects_cache_lookups_total{result="hit"} 2
-gitaly_pack_objects_cache_lookups_total{result="miss"} 1
-gitaly_pack_objects_generated_bytes_total 2.618649e+07
-gitaly_pack_objects_served_bytes_total 7.855947e+07
-gitaly_streamcache_filestore_disk_usage_bytes{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 2.6200152e+07
-gitaly_streamcache_filestore_removed_total{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 1
-gitaly_streamcache_index_entries{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 1
-```
-
-#### Useful queries
-
-The following are useful queries for monitoring Gitaly:
-
-- Use the following Prometheus query to observe the
- [type of connections](configure_gitaly.md#enable-tls-support) Gitaly is serving a production
- environment:
-
- ```prometheus
- sum(rate(gitaly_connections_total[5m])) by (type)
- ```
-
-- Use the following Prometheus query to monitor the
- [authentication behavior](configure_gitaly.md#observe-type-of-gitaly-connections) of your GitLab
- installation:
-
- ```prometheus
- sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
- ```
-
- In a system where authentication is configured correctly and where you have live traffic, you
- see something like this:
-
- ```prometheus
- {enforced="true",status="ok"} 4424.985419441742
- ```
-
- There may also be other numbers with rate 0, but you only have to take note of the non-zero numbers.
-
- The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
- numbers, something is wrong in your configuration.
-
- The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
- handling about 4000 requests per second.
-
-- Use the following Prometheus query to observe the [Git protocol versions](../git_protocol.md)
- being used in a production environment:
-
- ```prometheus
- sum(rate(gitaly_git_protocol_requests_total[1m])) by (grpc_method,git_protocol,grpc_service)
- ```
-
-### Monitor Gitaly Cluster
-
-To monitor Gitaly Cluster (Praefect), you can use these Prometheus metrics. There are two separate metrics
-endpoints from which metrics can be scraped:
-
-- The default `/metrics` endpoint.
-- `/db_metrics`, which contains metrics that require database queries.
-
-#### Default Prometheus `/metrics` endpoint
-
-The following metrics are available from the `/metrics` endpoint:
-
-- `gitaly_praefect_read_distribution`, a counter to track [distribution of reads](#distributed-reads).
- It has two labels:
-
- - `virtual_storage`.
- - `storage`.
-
- They reflect configuration defined for this instance of Praefect.
-
-- `gitaly_praefect_replication_latency_bucket`, a histogram measuring the amount of time it takes
- for replication to complete after the replication job starts. Available in GitLab 12.10 and later.
-- `gitaly_praefect_replication_delay_bucket`, a histogram measuring how much time passes between
- when the replication job is created and when it starts. Available in GitLab 12.10 and later.
-- `gitaly_praefect_node_latency_bucket`, a histogram measuring the latency in Gitaly returning
- health check information to Praefect. This indicates Praefect connection saturation. Available in
- GitLab 12.10 and later.
-
-To monitor [strong consistency](#strong-consistency), you can use the following Prometheus metrics:
-
-- `gitaly_praefect_transactions_total`, the number of transactions created and voted on.
-- `gitaly_praefect_subtransactions_per_transaction_total`, the number of times nodes cast a vote for
- a single transaction. This can happen multiple times if multiple references are getting updated in
- a single transaction.
-- `gitaly_praefect_voters_per_transaction_total`: the number of Gitaly nodes taking part in a
- transaction.
-- `gitaly_praefect_transactions_delay_seconds`, the server-side delay introduced by waiting for the
- transaction to be committed.
-- `gitaly_hook_transaction_voting_delay_seconds`, the client-side delay introduced by waiting for
- the transaction to be committed.
-
-To monitor the number of repositories that have no healthy, up-to-date replicas:
-
-- `gitaly_praefect_unavailable_repositories`
-
-You can also monitor the [Praefect logs](../logs.md#praefect-logs).
-
-#### Database metrics `/db_metrics` endpoint
-
-> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3286) in GitLab 14.5.
-
-The following metrics are available from the `/db_metrics` endpoint:
-
-- `gitaly_praefect_unavailable_repositories`, the number of repositories that have no healthy, up to date replicas.
-- `gitaly_praefect_read_only_repositories`, the number of repositories in read-only mode in a virtual storage.
- This metric is available for backwards compatibility reasons. `gitaly_praefect_unavailable_repositories` is more
- accurate.
-- `gitaly_praefect_replication_queue_depth`, the number of jobs in the replication queue.
-
-## Recover from failure
-
-Gitaly Cluster can [recover from certain types of failure](recovery.md).
-
## Do not bypass Gitaly
GitLab doesn't advise directly accessing Gitaly repositories stored on disk with a Git client,
@@ -660,4 +631,4 @@ The second facet presents the only real solution. For this, we developed
## NFS deprecation notice
Engineering support for NFS for Git repositories is deprecated. Technical support is planned to be
-unavailable from GitLab 15.0. For further information, please see our [NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation) documentation.
+unavailable beginning November 22, 2022. For further information, please see our [NFS Deprecation](../nfs.md#gitaly-and-nfs-deprecation) documentation.
diff --git a/doc/administration/gitaly/monitoring.md b/doc/administration/gitaly/monitoring.md
new file mode 100644
index 00000000000..17f94f912ee
--- /dev/null
+++ b/doc/administration/gitaly/monitoring.md
@@ -0,0 +1,202 @@
+---
+stage: Create
+group: Gitaly
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Monitoring Gitaly and Gitaly Cluster
+
+You can use the available logs and [Prometheus metrics](../monitoring/prometheus/index.md) to
+monitor Gitaly and Gitaly Cluster (Praefect).
+
+Metric definitions are available:
+
+- Directly from Prometheus `/metrics` endpoint configured for Gitaly.
+- Using [Grafana Explore](https://grafana.com/docs/grafana/latest/explore/) on a
+ Grafana instance configured against Prometheus.
+
+## Monitor Gitaly rate limiting
+
+Gitaly can be configured to limit requests based on:
+
+- Concurrency of requests.
+- A rate limit.
+
+Monitor Gitaly request limiting with the `gitaly_requests_dropped_total` Prometheus metric. This metric provides a total count
+of requests dropped due to request limiting. The `reason` label indicates why a request was dropped:
+
+- `rate`, due to rate limiting.
+- `max_size`, because the concurrency queue size was reached.
+- `max_time`, because the request exceeded the maximum queue wait time as configured in Gitaly.
+
+## Monitor Gitaly concurrency limiting
+
+You can observe specific behavior of [concurrency-queued requests](configure_gitaly.md#limit-rpc-concurrency) using
+the Gitaly logs and Prometheus:
+
+- In the [Gitaly logs](../logs.md#gitaly-logs), look for the string (or structured log field)
+ `acquire_ms`. Messages that have this field are reporting about the concurrency limiter.
+- In Prometheus, look for the following metrics:
+ - `gitaly_concurrency_limiting_in_progress` indicates how many concurrent requests are
+ being processed.
+ - `gitaly_concurrency_limiting_queued` indicates how many requests for an RPC for a given
+ repository are waiting due to the concurrency limit being reached.
+ - `gitaly_concurrency_limiting_acquiring_seconds` indicates how long a request has to
+ wait due to concurrency limits before being processed.
+
+## Monitor Gitaly cgroups
+
+You can observe the status of [control groups (cgroups)](configure_gitaly.md#control-groups) using Prometheus:
+
+- `gitaly_cgroups_memory_failed_total`, a gauge for the total number of times
+ the memory limit has been hit. This number resets each time a server is
+ restarted.
+- `gitaly_cgroups_cpu_usage`, a gauge that measures CPU usage per cgroup.
+- `gitaly_cgroup_procs_total`, a gauge that measures the total number of
+ processes Gitaly has spawned under the control of cgroups.
+
+## `pack-objects` cache
+
+The following [`pack-objects` cache](configure_gitaly.md#pack-objects-cache) metrics are available:
+
+- `gitaly_pack_objects_cache_enabled`, a gauge set to `1` when the cache is enabled. Available
+ labels: `dir` and `max_age`.
+- `gitaly_pack_objects_cache_lookups_total`, a counter for cache lookups. Available label: `result`.
+- `gitaly_pack_objects_generated_bytes_total`, a counter for the number of bytes written into the
+ cache.
+- `gitaly_pack_objects_served_bytes_total`, a counter for the number of bytes read from the cache.
+- `gitaly_streamcache_filestore_disk_usage_bytes`, a gauge for the total size of cache files.
+ Available label: `dir`.
+- `gitaly_streamcache_index_entries`, a gauge for the number of entries in the cache. Available
+ label: `dir`.
+
+Some of these metrics start with `gitaly_streamcache` because they are generated by the
+`streamcache` internal library package in Gitaly.
+
+Example:
+
+```plaintext
+gitaly_pack_objects_cache_enabled{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache",max_age="300"} 1
+gitaly_pack_objects_cache_lookups_total{result="hit"} 2
+gitaly_pack_objects_cache_lookups_total{result="miss"} 1
+gitaly_pack_objects_generated_bytes_total 2.618649e+07
+gitaly_pack_objects_served_bytes_total 7.855947e+07
+gitaly_streamcache_filestore_disk_usage_bytes{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 2.6200152e+07
+gitaly_streamcache_filestore_removed_total{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 1
+gitaly_streamcache_index_entries{dir="/var/opt/gitlab/git-data/repositories/+gitaly/PackObjectsCache"} 1
+```
+
+## Useful queries
+
+The following are useful queries for monitoring Gitaly:
+
+- Use the following Prometheus query to observe the
+ [type of connections](configure_gitaly.md#enable-tls-support) Gitaly is serving a production
+ environment:
+
+ ```prometheus
+ sum(rate(gitaly_connections_total[5m])) by (type)
+ ```
+
+- Use the following Prometheus query to monitor the
+ [authentication behavior](configure_gitaly.md#observe-type-of-gitaly-connections) of your GitLab
+ installation:
+
+ ```prometheus
+ sum(rate(gitaly_authentications_total[5m])) by (enforced, status)
+ ```
+
+ In a system where authentication is configured correctly and where you have live traffic, you
+ see something like this:
+
+ ```prometheus
+ {enforced="true",status="ok"} 4424.985419441742
+ ```
+
+ There may also be other numbers with rate 0, but you only have to take note of the non-zero numbers.
+
+ The only non-zero number should have `enforced="true",status="ok"`. If you have other non-zero
+ numbers, something is wrong in your configuration.
+
+ The `status="ok"` number reflects your current request rate. In the example above, Gitaly is
+ handling about 4000 requests per second.
+
+- Use the following Prometheus query to observe the [Git protocol versions](../git_protocol.md)
+ being used in a production environment:
+
+ ```prometheus
+ sum(rate(gitaly_git_protocol_requests_total[1m])) by (grpc_method,git_protocol,grpc_service)
+ ```
+
+## Monitor Gitaly Cluster
+
+To monitor Gitaly Cluster (Praefect), you can use these Prometheus metrics. There are two separate metrics
+endpoints from which metrics can be scraped:
+
+- The default `/metrics` endpoint.
+- `/db_metrics`, which contains metrics that require database queries.
+
+### Default Prometheus `/metrics` endpoint
+
+The following metrics are available from the `/metrics` endpoint:
+
+- `gitaly_praefect_read_distribution`, a counter to track [distribution of reads](index.md#distributed-reads).
+ It has two labels:
+
+ - `virtual_storage`.
+ - `storage`.
+
+ They reflect configuration defined for this instance of Praefect.
+
+- `gitaly_praefect_replication_latency_bucket`, a histogram measuring the amount of time it takes
+ for replication to complete after the replication job starts. Available in GitLab 12.10 and later.
+- `gitaly_praefect_replication_delay_bucket`, a histogram measuring how much time passes between
+ when the replication job is created and when it starts. Available in GitLab 12.10 and later.
+- `gitaly_praefect_node_latency_bucket`, a histogram measuring the latency in Gitaly returning
+ health check information to Praefect. This indicates Praefect connection saturation. Available in
+ GitLab 12.10 and later.
+
+To monitor [strong consistency](index.md#strong-consistency), you can use the following Prometheus metrics:
+
+- `gitaly_praefect_transactions_total`, the number of transactions created and voted on.
+- `gitaly_praefect_subtransactions_per_transaction_total`, the number of times nodes cast a vote for
+ a single transaction. This can happen multiple times if multiple references are getting updated in
+ a single transaction.
+- `gitaly_praefect_voters_per_transaction_total`: the number of Gitaly nodes taking part in a
+ transaction.
+- `gitaly_praefect_transactions_delay_seconds`, the server-side delay introduced by waiting for the
+ transaction to be committed.
+- `gitaly_hook_transaction_voting_delay_seconds`, the client-side delay introduced by waiting for
+ the transaction to be committed.
+
+To monitor the number of repositories that have no healthy, up-to-date replicas:
+
+- `gitaly_praefect_unavailable_repositories`
+
+To monitor [repository verification](praefect.md#repository-verification), use the following Prometheus metrics:
+
+- `gitaly_praefect_verification_queue_depth`, the total number of replicas pending verification. This
+ metric is scraped from the database and is only available when Prometheus is scraping the database metrics.
+- `gitaly_praefect_verification_jobs_dequeued_total`, the number of verification jobs picked up by the
+ worker.
+- `gitaly_praefect_verification_jobs_completed_total`, the number of verification jobs completed by the
+ worker. The `result` label indicates the end result of the jobs:
+ - `valid` indicates the expected replica existed on the storage.
+ - `invalid` indicates the replica expected to exist did not exist on the storage.
+ - `error` indicates the job failed and has to be retried.
+- `gitaly_praefect_stale_verification_leases_released_total`, the number of stale verification leases
+ released.
+
+You can also monitor the [Praefect logs](../logs.md#praefect-logs).
+
+### Database metrics `/db_metrics` endpoint
+
+> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/3286) in GitLab 14.5.
+
+The following metrics are available from the `/db_metrics` endpoint:
+
+- `gitaly_praefect_unavailable_repositories`, the number of repositories that have no healthy, up to date replicas.
+- `gitaly_praefect_read_only_repositories`, the number of repositories in read-only mode in a virtual storage.
+ This metric is available for backwards compatibility reasons. `gitaly_praefect_unavailable_repositories` is more
+ accurate.
+- `gitaly_praefect_replication_queue_depth`, the number of jobs in the replication queue.
diff --git a/doc/administration/gitaly/praefect.md b/doc/administration/gitaly/praefect.md
index 7dee12a6690..fb9f3e9c361 100644
--- a/doc/administration/gitaly/praefect.md
+++ b/doc/administration/gitaly/praefect.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Configure Gitaly Cluster **(FREE SELF)**
@@ -326,7 +325,7 @@ pgbouncer['databases'] = {
user: 'pgbouncer',
password: PGBOUNCER_SQL_PASSWORD_HASH,
pool_mode: 'transaction'
- }
+ },
praefect_production_direct: {
host: POSTGRESQL_HOST,
# Use `pgbouncer` user to connect to database backend.
@@ -338,6 +337,13 @@ pgbouncer['databases'] = {
...
}
+
+# Allow the praefect user to connect to PgBouncer
+pgbouncer['users'] = {
+ 'praefect': {
+ 'password': PRAEFECT_SQL_PASSWORD_HASH,
+ }
+}
```
Both `praefect_production` and `praefect_production_direct` use the same database endpoint
@@ -422,25 +428,33 @@ On the **Praefect** node:
1. Disable all other services by editing `/etc/gitlab/gitlab.rb`:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
- # Disable all other services on the Praefect node
+ # Avoid running unnecessary services on the Praefect server
+ gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
nginx['enable'] = false
- alertmanager['enable'] = false
- prometheus['enable'] = false
- grafana['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
- gitaly['enable'] = false
+ prometheus['enable'] = false
+ alertmanager['enable'] = false
+ grafana['enable'] = false
+ gitlab_exporter['enable'] = false
+ gitlab_kas['enable'] = false
# Enable only the Praefect service
praefect['enable'] = true
- # Disable database migrations to prevent database connections during 'gitlab-ctl reconfigure'
- gitlab_rails['auto_migrate'] = false
+ # Prevent database migrations from running on upgrade automatically
praefect['auto_migrate'] = false
+ gitlab_rails['auto_migrate'] = false
```
1. Configure **Praefect** to listen on network interfaces by editing
@@ -953,7 +967,7 @@ application. This is done by updating the `git_data_dirs`.
Particular attention should be shown to:
- the storage name added to `git_data_dirs` in this section must match the
- storage name under `praefect['virtual_storages']` on the Praefect node(s). This
+ storage name under `praefect['virtual_storages']` on the Praefect nodes. This
was set in the [Praefect](#praefect) section of this guide. This document uses
`default` as the Praefect storage name.
@@ -1209,6 +1223,110 @@ You can configure:
If `default_replication_factor` is unset, the repositories are always replicated on every node defined in `virtual_storages`. If a new
node is introduced to the virtual storage, both new and existing repositories are replicated to the node automatically.
+## Repository verification
+
+> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/issues/4080) in GitLab 15.0.
+
+Praefect stores metadata about the repositories in a database. If the repositories are modified on disk
+without going through Praefect, the metadata can become inaccurate. Because the metadata is used for replication
+and routing decisions, any inaccuracies may cause problems. Praefect contains a background worker that
+periodically verifies the metadata against the actual state on the disks. The worker:
+
+1. Picks up a batch of replicas to verify on healthy storages. The replicas are either unverified or have exceeded
+ the configured verification interval. Replicas that have never been verified are prioritized, followed by
+ the other replicas ordered by longest time since the last successful verification.
+1. Checks whether the replicas exist on their respective storages. If the:
+ - Replica exists, update its last successful verification time.
+ - Replica doesn't exist, remove its metadata record.
+ - Check failed, the replica is picked up for verification again when the next worker dequeues more work.
+
+The worker acquires an exclusive verification lease on each of the replicas it is about to verify. This avoids multiple
+workers from verifying the same replica concurrently. The worker releases the leases when it has completed its check.
+Praefect contains a background goroutine that releases stale leases every 10 seconds when workers are terminated for
+some reason without releasing the lease.
+
+The worker logs each of the metadata removals prior to executing them. The `perform_deletions` key
+indicates whether the invalid metadata records are actually deleted or not. For example:
+
+```json
+{
+ "level": "info",
+ "msg": "removing metadata records of non-existent replicas",
+ "perform_deletions": false,
+ "replicas": {
+ "default": {
+ "@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.git": [
+ "praefect-internal-0"
+ ]
+ }
+ }
+}
+```
+
+### Configure the verification worker
+
+The worker is enabled by default and verifies the metadata records every seven days. The verification
+interval is configurable with any valid [Go duration string](https://pkg.go.dev/time#ParseDuration).
+
+To verify the metadata every three days:
+
+```ruby
+praefect['background_verification_verification_interval'] = '72h'
+```
+
+Values of 0 and below disable the background verifier.
+
+```ruby
+praefect['background_verification_verification_interval'] = '0'
+```
+
+#### Enable deletions
+
+WARNING:
+Deletions are disabled by default due to a race condition with repository renames that can cause incorrect
+deletions. This is especially prominent in Geo instances as Geo performs more renames than instances without Geo.
+See [Handle repository creations, deletions and renames atomically](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/4101)
+for progress on a fix. We do not recommend enabling the deletions until this is fixed.
+
+By default, the worker does not delete invalid metadata records but simply logs them and outputs Prometheus
+metrics for them.
+
+You can enable deleting invalid metadata records with:
+
+```ruby
+praefect['background_verification_delete_invalid_records'] = true
+```
+
+### Prioritize verification manually
+
+You can prioritize verification of some replicas ahead of their next scheduled verification time.
+This might be needed after a disk failure, for example, when the administrator knows that the disk contents may have
+changed. Praefect would eventually verify the replicas again, but users may encounter errors in the meantime.
+
+To manually prioritize reverification of some replicas, use the `praefect verify` subcommand. The subcommand marks
+replicas as unverified. Unverified replicas are prioritized by the background verification worker. The verification
+worker must be enabled for the replicas to be verified.
+
+Prioritize verifying the replicas of a specific repository:
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml verify -repository-id=<repository-id>
+```
+
+Prioritize verifying all replicas stored on a virtual storage:
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml verify -virtual-storage=<virtual-storage>
+```
+
+Prioritize verifying all replicas stored on a storage:
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml verify -virtual-storage=<virtual-storage> -storage=<storage>
+```
+
+The output includes the number of replicas that were marked unverified.
+
## Automatic failover and primary election strategies
Praefect regularly checks the health of each Gitaly node. This is used to automatically fail over
diff --git a/doc/administration/gitaly/recovery.md b/doc/administration/gitaly/recovery.md
index a7166f7e62e..6de2acf1792 100644
--- a/doc/administration/gitaly/recovery.md
+++ b/doc/administration/gitaly/recovery.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Recovery options
@@ -348,13 +347,23 @@ If this occurs, run `remove-repository` again.
### Manually list untracked repositories
-> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3926) in GitLab 14.4.
+> - [Introduced](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3926) in GitLab 14.4.
+> - `older-than` option added in GitLab 15.0.
The `list-untracked-repositories` Praefect sub-command lists repositories of the Gitaly Cluster that both:
- Exist for at least one Gitaly storage.
- Aren't tracked in the Praefect database.
+Add the `-older-than` option to avoid showing repositories that are the process of being created and for which a record doesn't yet exist in the
+Praefect database. Replace `<duration>` with a time duration (for example, `5s`, `10m`, or `1h`). Defaults to `6h`.
+
+```shell
+sudo /opt/gitlab/embedded/bin/praefect -config /var/opt/gitlab/praefect/config.toml list-untracked-repositories -older-than <duration>
+```
+
+Only repositories with a creation time before the specified duration are considered.
+
The command outputs:
- Result to `STDOUT` and the command's logs.
diff --git a/doc/administration/gitaly/reference.md b/doc/administration/gitaly/reference.md
index 9fe09be10a3..d1e802111cd 100644
--- a/doc/administration/gitaly/reference.md
+++ b/doc/administration/gitaly/reference.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Gitaly reference **(FREE SELF)**
@@ -71,7 +70,7 @@ Remember to disable `transitioning` when you are done
changing your token settings.
All authentication attempts are counted in Prometheus under
-the [`gitaly_authentications_total` metric](index.md#useful-queries).
+the [`gitaly_authentications_total` metric](monitoring.md#useful-queries).
### TLS
diff --git a/doc/administration/gitaly/troubleshooting.md b/doc/administration/gitaly/troubleshooting.md
index 1be0bf23ed5..c79ed1d1707 100644
--- a/doc/administration/gitaly/troubleshooting.md
+++ b/doc/administration/gitaly/troubleshooting.md
@@ -2,7 +2,6 @@
stage: Create
group: Gitaly
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Troubleshooting Gitaly and Gitaly Cluster **(FREE SELF)**
@@ -356,7 +355,7 @@ The following sections provide possible solutions to Gitaly Cluster errors.
### Check cluster health
-> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/) in GitLab 14.6.
+> [Introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5688) in GitLab 14.5.
The `check` Praefect sub-command runs a series of checks to determine the health of the Gitaly Cluster.
@@ -417,6 +416,16 @@ If this check fails:
1. Check if there is a high load on the Praefect database. If the Praefect database is slow to respond, it can lead health checks failing to persist
to the database, leading Praefect to think nodes are unhealthy.
+#### Check clock synchronization
+
+> [Introduced](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/4225) in GitLab 14.8.
+
+Authentication between Praefect and the Gitaly servers requires the server times to be
+in sync so the token check succeeds.
+
+This check helps identify the root cause of `permission denied`
+[errors being logged by Praefect](#permission-denied-errors-appearing-in-gitaly-or-praefect-logs-when-accessing-repositories).
+
### Praefect errors in logs
If you receive an error, check `/var/log/gitlab/gitlab-rails/production.log`.
@@ -513,16 +522,19 @@ Replicas:
Generation: 1, fully up to date
Healthy: true
Valid Primary: true
+ Verified At: 2021-04-01 10:04:20 +0000 UTC
- Storage: "gitaly-2"
Assigned: true
Generation: 0, behind by 1 changes
Healthy: true
Valid Primary: false
+ Verified At: unverified
- Storage: "gitaly-3"
Assigned: true
Generation: replica not yet created
Healthy: false
Valid Primary: false
+ Verified At: unverified
```
#### Available metadata
@@ -548,6 +560,7 @@ For each replica, the following metadata is available:
| `Generation` | Latest confirmed generation of the replica. It indicates:<br><br>- The replica is fully up to date if the generation matches the repository's generation.<br>- The replica is outdated if the replica's generation is less than the repository's generation.<br>- `replica not yet created` if the replica does not yet exist at all on the storage. |
| `Healthy` | Indicates whether the Gitaly node that is hosting this replica is considered healthy by the consensus of Praefect nodes. |
| `Valid Primary` | Indicates whether the replica is fit to serve as the primary node. If the repository's primary is not a valid primary, a failover occurs on the next write to the repository if there is another replica that is a valid primary. A replica is a valid primary if:<br><br>- It is stored on a healthy Gitaly node.<br>- It is fully up to date.<br>- It is not targeted by a pending deletion job from decreasing replication factor.<br>- It is assigned. |
+| `Verified At` | Indicates last successful verification of the replica by the [verification worker](praefect.md#repository-verification). If the replica has not yet been verified, `unverified` is displayed in place of the last successful verification time. Introduced in GitLab 15.0. |
### Check that repositories are in sync
diff --git a/doc/administration/inactive_project_deletion.md b/doc/administration/inactive_project_deletion.md
new file mode 100644
index 00000000000..a2d2093c57b
--- /dev/null
+++ b/doc/administration/inactive_project_deletion.md
@@ -0,0 +1,60 @@
+---
+stage: Manage
+group: Compliance
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Inactive project deletion **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0 [with a flag](../administration/feature_flags.md) named `inactive_projects_deletion`. 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 `inactive_projects_deletion`.
+On GitLab.com, this feature is not available. This feature is not ready for production use.
+
+Administrators of large GitLab instances can find that over time, projects become inactive and are no longer used.
+These projects take up unnecessary disk space. With inactive project deletion, you can identify these projects, warn
+the maintainers ahead of time, and then delete the projects if they remain inactive. When an inactive project is
+deleted, the action generates an audit event that it was performed by the first active administrator.
+
+## Configure inactive project deletion
+
+You can configure inactive projects deletion or turn it off using the
+[Application settings API](../api/settings.md#change-application-settings).
+
+The following options are available:
+
+- `delete_inactive_projects`: Enable or disable inactive project deletion.
+- `inactive_projects_min_size_mb`: Minimum size (MB) of inactive projects to be considered for deletion.
+ Projects smaller in size than this threshold aren't considered inactive.
+- `inactive_projects_delete_after_months`: Minimum duration (months) after which a project is scheduled for deletion if
+ it continues be inactive.
+- `inactive_projects_send_warning_email_after_months`: Minimum duration (months) after which a deletion warning email is
+ sent if a project continues to be inactive. The warning email is sent to users with the Owner and Maintainer roles of
+ the inactive project. This duration should be less than the `inactive_projects_delete_after_months` duration.
+
+For example:
+
+- `delete_inactive_projects` enabled.
+- `inactive_projects_min_size_mb` set to `50`.
+- `inactive_projects_delete_after_months` set to `12`.
+- `inactive_projects_send_warning_email_after_months` set to `6`.
+
+In this scenario, when a project's size is:
+
+- Less than 50 MB, the project is not considered inactive.
+- Greater than 50 MB and it is inactive for:
+ - More than 6 months, a deletion warning is email is sent to users with the Owner and Maintainer role on the project
+ with the scheduled date of deletion.
+ - More than 12 months, the project is scheduled for deletion.
+
+## Determine when a project was last active
+
+You can view a project's activities and determine when the project was last active in the following ways:
+
+1. Go to the [activity page](../user/project/working_with_projects.md#view-project-activity) for the project and view
+ the date of the latest event.
+1. View the `last_activity_at` attribute for the project using the [Projects API](../api/projects.md).
+1. List the visible events for the project using the [Events API](../api/events.md#list-a-projects-visible-events).
+ View the `created_at` attribute of the latest event.
diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md
index 63f8ce3c4cb..2fd57036169 100644
--- a/doc/administration/incoming_email.md
+++ b/doc/administration/incoming_email.md
@@ -302,7 +302,7 @@ gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
-# Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
```
@@ -340,7 +340,7 @@ incoming_email:
# The IDLE command timeout.
idle_timeout: 60
- # Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
```
@@ -384,7 +384,7 @@ gitlab_rails['incoming_email_mailbox_name'] = "inbox"
# The IDLE command timeout.
gitlab_rails['incoming_email_idle_timeout'] = 60
-# Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
gitlab_rails['incoming_email_expunge_deleted'] = true
```
@@ -422,7 +422,7 @@ incoming_email:
# The IDLE command timeout.
idle_timeout: 60
- # Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: true
```
@@ -463,6 +463,9 @@ gitlab_rails['incoming_email_host'] = "exchange.example.com"
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
+
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+gitlab_rails['incoming_email_expunge_deleted'] = true
```
Example for source installs:
@@ -491,6 +494,9 @@ incoming_email:
port: 993
# Whether the IMAP server uses SSL
ssl: true
+
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ expunge_deleted: true
```
##### Dedicated email address
@@ -521,6 +527,9 @@ gitlab_rails['incoming_email_host'] = "exchange.example.com"
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
+
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+gitlab_rails['incoming_email_expunge_deleted'] = true
```
Example for source installs:
@@ -545,6 +554,9 @@ incoming_email:
port: 993
# Whether the IMAP server uses SSL
ssl: true
+
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ expunge_deleted: true
```
#### Microsoft Office 365
@@ -599,6 +611,9 @@ gitlab_rails['incoming_email_host'] = "outlook.office365.com"
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
+
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+gitlab_rails['incoming_email_expunge_deleted'] = true
```
This example for source installs assumes the mailbox `incoming@office365.example.com`:
@@ -626,6 +641,9 @@ incoming_email:
port: 993
# Whether the IMAP server uses SSL
ssl: true
+
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ expunge_deleted: true
```
##### Catch-all mailbox
@@ -654,6 +672,9 @@ gitlab_rails['incoming_email_host'] = "outlook.office365.com"
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
+
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+gitlab_rails['incoming_email_expunge_deleted'] = true
```
This example for source installs assumes the catch-all mailbox `incoming@office365.example.com`:
@@ -681,6 +702,9 @@ incoming_email:
port: 993
# Whether the IMAP server uses SSL
ssl: true
+
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ expunge_deleted: true
```
##### Dedicated email address
@@ -708,6 +732,9 @@ gitlab_rails['incoming_email_host'] = "outlook.office365.com"
gitlab_rails['incoming_email_port'] = 993
# Whether the IMAP server uses SSL
gitlab_rails['incoming_email_ssl'] = true
+
+# Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+gitlab_rails['incoming_email_expunge_deleted'] = true
```
This example for source installs assumes the dedicated email address `incoming@office365.example.com`:
@@ -730,6 +757,9 @@ incoming_email:
port: 993
# Whether the IMAP server uses SSL
ssl: true
+
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
+ expunge_deleted: true
```
#### Microsoft Graph
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 73ea4a8e1d0..1d8dcd34d68 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -203,13 +203,8 @@ Learn how to install, configure, update, and maintain your GitLab instance.
- [Enable Performance Monitoring](monitoring/performance/gitlab_configuration.md): Enable GitLab Performance Monitoring.
- [GitLab performance monitoring with Prometheus](monitoring/prometheus/index.md): Configure GitLab and Prometheus for measuring performance metrics.
- [GitLab performance monitoring with Grafana](monitoring/performance/grafana_configuration.md): Configure GitLab to visualize time series metrics through graphs and dashboards.
- - [Request Profiling](monitoring/performance/request_profiling.md): Get a detailed profile on slow requests.
- [Performance Bar](monitoring/performance/performance_bar.md): Get performance information for the current page.
-## Analytics
-
-- [Pseudonymizer](pseudonymizer.md): Export data from a GitLab database to CSV files in a secure way.
-
## Troubleshooting
- [Debugging tips](troubleshooting/debug.md): Tips to debug problems when things go wrong.
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 0a0c538caa2..8d3fec3b19e 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -636,7 +636,8 @@ If the limit value is set to zero, the limit is disabled.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276192) in GitLab 14.1, disabled by default.
> - Enabled by default and [feature flag `ci_jobs_trace_size_limit` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/335259) in GitLab 14.2.
-The job log file size limit is 100 megabytes by default. Any job that exceeds this value is dropped.
+The job log file size limit in GitLab is 100 megabytes by default. Any job that exceeds the
+limit is marked as failed, and dropped by the runner.
You can change the limit in the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session).
Update `ci_jobs_trace_size_limit` with the new value in megabytes:
@@ -645,6 +646,11 @@ Update `ci_jobs_trace_size_limit` with the new value in megabytes:
Plan.default.actual_limits.update!(ci_jobs_trace_size_limit: 125)
```
+GitLab Runner also has an
+[`output_limit` setting](https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runners-section)
+that configures the maximum log size in a runner. Jobs that exceed the runner limit
+continue to run, but the log is truncated when it hits the limit.
+
### Maximum number of active DAST profile schedules per project
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68551) in GitLab 14.3.
@@ -876,6 +882,10 @@ See the limits in the [Add a design to an issue](../user/project/issues/design_m
## Push Event Limits
+### Max push size
+
+The maximum allowed [push size](../user/admin_area/settings/account_and_limit_settings.md#max-push-size) is set to 5 GB.
+
### Webhooks and Project Services
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31009) in GitLab 12.4.
@@ -886,7 +896,7 @@ than the specified limit, hooks are not executed.
More information can be found in these docs:
- [Webhooks push events](../user/project/integrations/webhook_events.md#push-events)
-- [Project services push hooks limit](../user/project/integrations/overview.md#push-hooks-limit)
+- [Project services push hooks limit](../user/project/integrations/index.md#push-hooks-limit)
### Activities
diff --git a/doc/administration/integration/terminal.md b/doc/administration/integration/terminal.md
index 792afc6c3d7..88b320941de 100644
--- a/doc/administration/integration/terminal.md
+++ b/doc/administration/integration/terminal.md
@@ -6,11 +6,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Web terminals (DEPRECATED) **(FREE)**
-> [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+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 `certificate_based_clusters`.
+
- Read more about the non-deprecated [Web Terminals accessible through the Web IDE](../../user/project/web_ide/index.md).
- Read more about the non-deprecated [Web Terminals accessible from a running CI job](../../ci/interactive_web_terminal/index.md).
diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md
index 03a0162d526..2582df1b0c4 100644
--- a/doc/administration/job_artifacts.md
+++ b/doc/administration/job_artifacts.md
@@ -113,8 +113,6 @@ and then `object_store:`. On Omnibus GitLab installs they are prefixed by
|---------------------|---------|-------------|
| `enabled` | `false` | Enable or disable object storage. |
| `remote_directory` | | The bucket name where Artifacts are stored. Use the name only, do not include the path. |
-| `direct_upload` | `false` | Set to `true` to enable direct upload of Artifacts without the need of local shared storage. Option may be removed once we decide to support only single storage for all files. |
-| `background_upload` | `true` | Set to `false` to disable automatic upload. Option may be removed once upload is direct to S3. |
| `proxy_download` | `false` | 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. |
| `connection` | | Various connection options described below. |
@@ -181,67 +179,6 @@ _The artifacts are stored by default in
1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
1. [Migrate any existing local artifacts to the object storage](#migrating-to-object-storage).
-### OpenStack example
-
-See [the available connection settings for OpenStack](object_storage.md#openstack-compatible-connection-settings).
-
-**In Omnibus installations:**
-
-_The uploads are stored by default in
-`/var/opt/gitlab/gitlab-rails/shared/artifacts`._
-
-1. Edit `/etc/gitlab/gitlab.rb` and add the following lines, substituting
- the values you want:
-
- ```ruby
- gitlab_rails['artifacts_enabled'] = true
- gitlab_rails['artifacts_object_store_enabled'] = true
- gitlab_rails['artifacts_object_store_remote_directory'] = "artifacts"
- gitlab_rails['artifacts_object_store_connection'] = {
- 'provider' => 'OpenStack',
- 'openstack_username' => 'OS_USERNAME',
- 'openstack_api_key' => 'OS_PASSWORD',
- 'openstack_temp_url_key' => 'OS_TEMP_URL_KEY',
- 'openstack_auth_url' => 'https://auth.cloud.ovh.net',
- 'openstack_region' => 'GRA',
- 'openstack_tenant_id' => 'OS_TENANT_ID',
- }
- ```
-
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. [Migrate any existing local artifacts to the object storage](#migrating-to-object-storage).
-
----
-
-**In installations from source:**
-
-_The uploads are stored by default in
-`/home/git/gitlab/shared/artifacts`._
-
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
-
- ```yaml
- uploads:
- object_store:
- enabled: true
- direct_upload: false
- background_upload: true
- proxy_download: false
- remote_directory: "artifacts"
- connection:
- provider: OpenStack
- openstack_username: OS_USERNAME
- openstack_api_key: OS_PASSWORD
- openstack_temp_url_key: OS_TEMP_URL_KEY
- openstack_auth_url: 'https://auth.cloud.ovh.net'
- openstack_region: GRA
- openstack_tenant_id: OS_TENANT_ID
- ```
-
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
-1. [Migrate any existing local artifacts to the object storage](#migrating-to-object-storage).
-
### Migrating to object storage
After [configuring the object storage](#using-object-storage), use the following task to
@@ -610,7 +547,7 @@ Bucket names that include folder paths are not supported with [consolidated obje
For example, `bucket/path`. If a bucket name has a path in it, you might receive an error similar to:
```plaintext
-WARNING: Uploading artifacts as "archive" to coordinator... POST https://gitlab.example.com/api/v4/jobs/job_id/artifacts?artifact_format=zip&artifact_type=archive&expire_in=1+day: 500 Internal Server Error (Missing file)
+WARNING: Uploading artifacts as "archive" to coordinator... POST https://gitlab.example.com/api/v4/jobs/job_id/artifacts?artifact_format=zip&artifact_type=archive&expire_in=1+day: 500 Internal Server Error (Missing file)
FATAL: invalid argument
```
diff --git a/doc/administration/job_logs.md b/doc/administration/job_logs.md
index 5c6ea7f52eb..d2837bfa96e 100644
--- a/doc/administration/job_logs.md
+++ b/doc/administration/job_logs.md
@@ -177,7 +177,7 @@ Here is the detailed data flow:
### Limitations
-- [Redis cluster is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/224171).
+- [Redis Cluster is not supported](https://gitlab.com/gitlab-org/gitlab/-/issues/224171).
- You must configure [object storage for CI/CD artifacts, logs, and builds](job_artifacts.md#object-storage-settings)
before you enable the feature flag. After the flag is enabled, files cannot be written
to disk, and there is no protection against misconfiguration.
diff --git a/doc/administration/lfs/index.md b/doc/administration/lfs/index.md
index 3fe6a94ef13..0d75880bdd1 100644
--- a/doc/administration/lfs/index.md
+++ b/doc/administration/lfs/index.md
@@ -89,8 +89,6 @@ The following general settings are supported.
|---------------------|-------------|---------|
| `enabled` | Enable/disable object storage. | `false` |
| `remote_directory` | The bucket name where LFS objects are stored. | |
-| `direct_upload` | Set to true to enable direct upload of LFS without the need of local shared storage. Option may be removed after we decide to support only single storage for all files. | `false` |
-| `background_upload` | Set to false to disable automatic upload. Option may be removed once upload is direct to S3. | `true` |
| `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/logs.md b/doc/administration/logs.md
index 22e13270179..c89c485e7d3 100644
--- a/doc/administration/logs.md
+++ b/doc/administration/logs.md
@@ -385,7 +385,7 @@ Depending on your installation method, this file is located at:
- Omnibus GitLab: `/var/log/gitlab/gitlab-rails/integrations_json.log`
- Installations from source: `/home/git/gitlab/log/integrations_json.log`
-It contains information about [integration](../user/project/integrations/overview.md)
+It contains information about [integration](../user/project/integrations/index.md)
activities, such as Jira, Asana, and irker services. It uses JSON format,
like this example:
@@ -1107,7 +1107,7 @@ in `/var/log/gitlab/gitlab-kas/`.
For Omnibus GitLab installations, Praefect logs are in `/var/log/gitlab/praefect/`.
-GitLab also tracks [Prometheus metrics for Praefect](gitaly/#monitor-gitaly-cluster).
+GitLab also tracks [Prometheus metrics for Praefect](gitaly/monitoring.md#monitor-gitaly-cluster).
## Backup log
diff --git a/doc/administration/maintenance_mode/index.md b/doc/administration/maintenance_mode/index.md
index 50c0f0ecc63..41eed500594 100644
--- a/doc/administration/maintenance_mode/index.md
+++ b/doc/administration/maintenance_mode/index.md
@@ -116,11 +116,11 @@ For most JSON requests, POST, PUT, PATCH, and DELETE are blocked, and the API re
| POST | `/users/sign_in` | To allow users to log in. |
| POST | `/users/sign_out`| To allow users to log out. |
| POST | `/oauth/token` | To allow users to log in to a Geo secondary for the first time. |
-| POST | `/admin/session`, `/admin/session/destroy` | To allow [Administrator mode for GitLab administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158) |
+| POST | `/admin/session`, `/admin/session/destroy` | To allow [Admin Mode for GitLab administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158) |
| POST | Paths ending with `/compare`| Git revision routes. |
| POST | `.git/git-upload-pack` | To allow Git pull/clone. |
| POST | `/api/v4/internal` | [internal API routes](../../development/internal_api/index.md) |
-| POST | `/admin/sidekiq` | To allow management of background jobs in the Admin UI |
+| POST | `/admin/sidekiq` | To allow management of background jobs in the Admin Area |
| POST | `/admin/geo` | To allow updating Geo Nodes in the administrator UI |
| POST | `/api/v4/geo_replication`| To allow certain Geo-specific administrator UI actions on secondary sites |
@@ -166,7 +166,7 @@ Package Registry allows you to install but not publish packages.
Background jobs (cron jobs, Sidekiq) continue running as is, because background jobs are not automatically disabled.
-[During a planned Geo failover](../geo/disaster_recovery/planned_failover.md#prevent-updates-to-the-primary-node),
+[During a planned Geo failover](../geo/disaster_recovery/planned_failover.md#prevent-updates-to-the-primary-site),
it is recommended that you disable all cron jobs except for those related to Geo.
To monitor queues and disable jobs:
@@ -210,4 +210,4 @@ For the same reason we don't automatically block background jobs when Maintenanc
The resulting database writes are acceptable. Here, the trade-off is between more service degradation and the completion of replication.
-However, during a planned failover, we [ask users to turn off cron jobs that are not related to Geo, manually](../geo/disaster_recovery/planned_failover.md#prevent-updates-to-the-primary-node). In the absence of new database writes and non-Geo cron jobs, new background jobs would either not be created at all or be minimal.
+However, during a planned failover, we [ask users to turn off cron jobs that are not related to Geo, manually](../geo/disaster_recovery/planned_failover.md#prevent-updates-to-the-primary-site). In the absence of new database writes and non-Geo cron jobs, new background jobs would either not be created at all or be minimal.
diff --git a/doc/administration/merge_request_diffs.md b/doc/administration/merge_request_diffs.md
index 01576eb4abf..fe1c74b0e24 100644
--- a/doc/administration/merge_request_diffs.md
+++ b/doc/administration/merge_request_diffs.md
@@ -117,8 +117,6 @@ then `object_store:`. On Omnibus installations, they are prefixed by
|---------|-------------|---------|
| `enabled` | Enable/disable object storage | `false` |
| `remote_directory` | The bucket name where external diffs are stored| |
-| `direct_upload` | Set to `true` to enable direct upload of external diffs without the need of local shared storage. Option may be removed once we decide to support only single storage for all files. | `false` |
-| `background_upload` | Set to `false` to disable automatic upload. Option may be removed once upload is direct to S3 | `true` |
| `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/monitoring/performance/img/request_profile_result.png b/doc/administration/monitoring/performance/img/request_profile_result.png
deleted file mode 100644
index 9176a0b49fd..00000000000
--- a/doc/administration/monitoring/performance/img/request_profile_result.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/monitoring/performance/index.md b/doc/administration/monitoring/performance/index.md
index 20fad8baf91..b063a20dc7f 100644
--- a/doc/administration/monitoring/performance/index.md
+++ b/doc/administration/monitoring/performance/index.md
@@ -17,7 +17,6 @@ documents to understand and properly configure GitLab Performance Monitoring:
- [Prometheus documentation](../prometheus/index.md)
- [Grafana Install/Configuration](grafana_configuration.md)
- [Performance bar](performance_bar.md)
-- [Request profiling](request_profiling.md)
## Introduction to GitLab Performance Monitoring
diff --git a/doc/administration/monitoring/performance/request_profiling.md b/doc/administration/monitoring/performance/request_profiling.md
index 6cd20132092..d0d05c16ea0 100644
--- a/doc/administration/monitoring/performance/request_profiling.md
+++ b/doc/administration/monitoring/performance/request_profiling.md
@@ -2,43 +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-07-26'
+redirect_to: 'index.md'
---
-# Request profiling (DEPRECATED) **(FREE SELF)**
+# Request profiling (removed) **(FREE SELF)**
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352488) in GitLab 14.8, and planned for removal in GitLab 15.0.
-
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352488)
-in GitLab 14.8, and is planned for removal in GitLab 15.0.
-
-To profile a request:
-
-1. Sign in to GitLab as an Administrator or a user with the [Maintainer role](../../../user/permissions.md).
-1. In the navigation bar, click **Admin area**.
-1. Go to **Monitoring > Requests Profiles**.
-1. In the **Requests Profiles** section, copy the token.
-1. Pass the headers `X-Profile-Token: <token>` and `X-Profile-Mode: <mode>`(where
- `<mode>` can be `execution` or `memory`) to the request you want to profile. When
- passing headers, you can use:
-
- - Browser extensions such as the
- [ModHeader](https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj)
- Chrome extension.
- - `curl`. For example:
-
- ```shell
- curl --header 'X-Profile-Token: <token>' --header 'X-Profile-Mode: <mode>' "https://gitlab.example.com/group/project"
- ```
-
- Profiled requests can take longer than usual.
-
-After the request completes, you can view the profiling output from the
-**Monitoring > Requests Profiles** administration page:
-
-![Profiling output](img/request_profile_result.png)
-
-## Cleaning up profiled requests
-
-The output from profiled requests is cleared out once each day through a
-Sidekiq worker.
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352488) in GitLab 14.8
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/350152) in 15.0.
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 08f7d5095da..4f8fbd0c07e 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -156,7 +156,7 @@ The following metrics can be controlled by feature flags:
## Praefect metrics
You can [configure Praefect](../../gitaly/praefect.md#praefect) to report metrics. For information
-on available metrics, see the [relevant documentation](../../gitaly/index.md#monitor-gitaly-cluster).
+on available metrics, see the [relevant documentation](../../gitaly/monitoring.md#monitor-gitaly-cluster).
## Sidekiq metrics
diff --git a/doc/administration/nfs.md b/doc/administration/nfs.md
index ef5d26ac845..b0c50d63e78 100644
--- a/doc/administration/nfs.md
+++ b/doc/administration/nfs.md
@@ -24,9 +24,9 @@ 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.0 (tentatively May 22nd, 2022) 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.0, regardless of your GitLab version.
+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.
-Until the release of 15.0, 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:
+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:
- Performance issues or timeouts accessing Git data
- Commits or branches vanish
@@ -39,10 +39,10 @@ Assistance is limited to activities like:
- Verifying that NFS client mount options match our [documented recommendations](#mount-options)
- Analyzing the GitLab Workhorse and Rails logs, and determining that `500` errors being seen in the environment are caused by slow responses from Gitaly
-GitLab support is unable to continue with the investigation if:
+GitLab support is unable to continue with the investigation if both:
-- The date of the request is on or after the release of GitLab version 15.0, and
-- Support Engineers and Management determine that all reasonable non-NFS root causes have been exhausted
+- The date of the request is on or after the release of GitLab version 15.6.
+- Support Engineers and Management determine that all reasonable non-NFS root causes have been exhausted.
If the issue is reproducible, or if it happens intermittently but regularly, GitLab Support can investigate providing the issue reproduces without the use of NFS. In order to reproduce without NFS, the affected repositories should be migrated to a different Gitaly shard, such as Gitaly cluster or a standalone Gitaly VM, backed with block storage.
@@ -377,7 +377,7 @@ Any `Operation not permitted` errors means you should investigate your NFS serve
## NFS in a Firewalled Environment
-If the traffic between your NFS server and NFS client(s) is subject to port filtering
+If the traffic between your NFS server and NFS clients is subject to port filtering
by a firewall, then you need to reconfigure that firewall to allow NFS communication.
[This guide from The Linux Documentation Project (TDLP)](https://tldp.org/HOWTO/NFS-HOWTO/security.html#FIREWALLS)
@@ -482,3 +482,10 @@ On Ubuntu 16.04, use:
```shell
sudo perf trace --no-syscalls --event 'nfs4:*' -p $(pgrep -fd ',' puma)
```
+
+### Warnings `garbage found: .../repositories/@hashed/...git/objects/pack/.nfs...` in Gitaly logs
+
+If you find any warnings like `garbage found: .../repositories/@hashed/...git/objects/pack/.nfs...` in [Gitaly logs](logs.md#gitaly-logs),
+this problem occurs if `lookupcache=positive` is not set, which we recommend as an
+[NFS mount option](#mount-options).
+See [Gitaly issue #3175](https://gitlab.com/gitlab-org/gitaly/-/issues/3175) for more details.
diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md
index 6ea433f95e9..0560a8813df 100644
--- a/doc/administration/object_storage.md
+++ b/doc/administration/object_storage.md
@@ -19,7 +19,7 @@ GitLab has been tested by vendors and customers on a number of object storage pr
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatible mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors, whose list is not officially established.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -62,7 +62,7 @@ Using the consolidated object storage configuration has a number of advantages:
- It enables the use of [encrypted S3 buckets](#encrypted-s3-buckets).
- It [uploads files to S3 with proper `Content-MD5` headers](https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/222).
-Because [direct upload mode](../development/uploads/implementation.md#direct-upload)
+Because [direct upload mode](../development/uploads/index.md#direct-upload)
must be enabled, only the following providers can be used:
- [Amazon S3-compatible providers](#s3-compatible-connection-settings)
@@ -386,52 +386,6 @@ If you are using a custom Azure storage domain,
configuration. This information is exchanged in an API call between
GitLab Rails and Workhorse.
-#### OpenStack-compatible connection settings
-
-Although OpenStack Swift provides S3 compatibility, some users may want to use
-the [Swift API](https://docs.openstack.org/swift/latest/api/object_api_v1_overview.html).
-
-This isn't compatible with the consolidated object storage form. OpenStack Swift
-is supported only with the storage-specific form. If you want to use the
-consolidated form, see the [S3 settings](#s3-compatible-connection-settings).
-
-Here are the valid connection settings for the Swift API, provided by
-[fog-openstack](https://github.com/fog/fog-openstack):
-
-| Setting | Description | Default |
-|--------------------------|----------------------|---------|
-| `provider` | Always `OpenStack` for compatible hosts. | `OpenStack` |
-| `openstack_username` | OpenStack username. | |
-| `openstack_api_key` | OpenStack API key. | |
-| `openstack_temp_url_key` | OpenStack key for generating temporary URLs | |
-| `openstack_auth_url` | OpenStack authentication endpoint | |
-| `openstack_region` | OpenStack region. | |
-| `openstack_tenant` | OpenStack tenant ID. | |
-
-#### Rackspace Cloud Files
-
-The following table describes the valid connection parameters for
-Rackspace Cloud, provided by [fog-rackspace](https://github.com/fog/fog-rackspace/).
-
-This isn't compatible with the consolidated object storage form.
-Rackspace Cloud is supported only with the storage-specific form.
-
-| Setting | Description | Example |
-|--------------------------|----------------|-------------|
-| `provider` | Provider name. | `Rackspace` |
-| `rackspace_username` | Username of the Rackspace account with access to the container. | `joe.smith` |
-| `rackspace_api_key` | API key of the Rackspace account with access to the container. | `ABC123DEF456ABC123DEF456ABC123DE` |
-| `rackspace_region` | Rackspace storage region to use, a three letter code from the [list of service access endpoints](https://docs.rackspace.com/docs/cloud-files/v1/general-api-info/service-access/). | `iad` |
-| `rackspace_temp_url_key` | Private key you set in the Rackspace API for [temporary URLs](https://docs.rackspace.com/docs/cloud-files/v1/use-cases/public-access-to-your-cloud-files-account/#tempurl). | `ABC123DEF456ABC123DEF456ABC123DE` |
-
-Regardless of whether the container has public access enabled or disabled, Fog
-uses the TempURL method to grant access to LFS objects. If you see error
-messages in logs that refer to instantiating storage with a `temp-url-key`,
-be sure you have set the key properly both in the Rackspace API and in
-`gitlab.rb`. You can verify the value of the key Rackspace has set by sending a
-GET request with token header to the service access endpoint URL and comparing
-the output of the returned headers.
-
### Object-specific configuration
The following YAML shows how the `object_store` section defines
@@ -582,7 +536,6 @@ supported by consolidated configuration form, refer to the following guides:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| **{dotted-circle}** No |
| [Packages](packages/index.md#using-object-storage) (optional feature) | **{check-circle}** Yes |
| [Dependency Proxy](packages/dependency_proxy.md#using-object-storage) (optional feature) | **{check-circle}** Yes |
-| [Pseudonymizer](pseudonymizer.md) (optional feature) | **{dotted-circle}** No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | **{dotted-circle}** No |
| [Terraform state files](terraform_state.md#using-object-storage) | **{check-circle}** Yes |
| [Pages content](pages/index.md#using-object-storage) | **{check-circle}** Yes |
@@ -616,7 +569,7 @@ There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab
in the future.
Helm-based installs require separate buckets to
-[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer).
+[handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-terraform-state-dependency-proxy).
### S3 API compatibility issues
@@ -799,3 +752,46 @@ to run the following command:
```ruby
Feature.disable(:s3_multithreaded_uploads)
```
+
+## Migrate objects to a different object storage provider
+
+You may need to migrate GitLab data in object storage to a different object storage provider. The following steps show you how do this using [Rclone](https://rclone.org/).
+
+The steps assume you are moving the `uploads` bucket, but the same process works for other buckets.
+
+Prerequisites:
+
+- Choose the computer to run Rclone on. Depending on how much data you are migrating, Rclone may have to run for a long time so you should avoid using a laptop or desktop computer that can go into power saving. You can use your GitLab server to run Rclone.
+
+1. [Install](https://rclone.org/downloads/) Rclone.
+1. Configure Rclone by running the following:
+
+ ```shell
+ rclone config
+ ```
+
+ The configuration process is interactive. Add at least two "remotes": one for the object storage provider your data is currently on (`old`), and one for the provider you are moving to (`new`).
+
+1. Verify that you can read the old data. The following example refers to the `uploads` bucket , but your bucket may have a different name:
+
+ ```shell
+ rclone ls old:uploads | head
+ ```
+
+ This should print a partial list of the objects currently stored in your `uploads` bucket. If you get an error, or if
+ the list is empty, go back and update your Rclone configuration using `rclone config`.
+
+1. Perform an initial copy. You do not need to take your GitLab server offline for this step.
+
+ ```shell
+ rclone sync -P old:uploads new:uploads
+ ```
+
+1. After the first sync completes, use the web UI or command-line interface of your new object storage provider to
+ verify that there are objects in the new bucket. If there are none, or if you encounter an error while running `rclone
+ sync`, check your Rclone configuration and try again.
+
+After you have done at least one successful Rclone copy from the old location to the new location, schedule maintenance and take your GitLab server offline. During your maintenance window you must do two things:
+
+1. Perform a final `rclone sync` run, knowing that your users cannot add new objects so you will not leave any behind in the old bucket.
+1. Update the object storage configuration of your GitLab server to use the new provider for `uploads`.
diff --git a/doc/administration/operations/extra_sidekiq_processes.md b/doc/administration/operations/extra_sidekiq_processes.md
index fd04efe8473..75f2ad5ed26 100644
--- a/doc/administration/operations/extra_sidekiq_processes.md
+++ b/doc/administration/operations/extra_sidekiq_processes.md
@@ -354,7 +354,7 @@ file is written, but this can be changed by passing the `--pidfile` option to
```
Keep in mind that the PID file contains the PID of the `sidekiq-cluster`
-command and not the PID(s) of the started Sidekiq processes.
+command and not the PIDs of the started Sidekiq processes.
### Environment
diff --git a/doc/administration/operations/extra_sidekiq_routing.md b/doc/administration/operations/extra_sidekiq_routing.md
index bb8eb184302..cd3a53b7c63 100644
--- a/doc/administration/operations/extra_sidekiq_routing.md
+++ b/doc/administration/operations/extra_sidekiq_routing.md
@@ -88,8 +88,8 @@ components:
> [Introduced](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/261) in GitLab 13.1 (`tags`).
-Queue matching query works upon the worker attributes, described in [Sidekiq
-style guide](../../development/sidekiq_style_guide.md). We support querying
+Queue matching query works upon the worker attributes, described in
+[Sidekiq style guide](../../development/sidekiq/index.md). We support querying
based on a subset of worker attributes:
- `feature_category` - the [GitLab feature
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 477a11dd899..a3240a6041b 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -1,6 +1,6 @@
---
-stage: Enablement
-group: Distribution
+stage: Create
+group: Source Code
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -14,7 +14,7 @@ drop-in replacement.
Regular SSH operations become slow as the number of users grows because OpenSSH
searches for a key to authorize a user via a linear search. In the worst case,
-such as when the user is not authorized to access GitLab, OpenSSH will scan the
+such as when the user is not authorized to access GitLab, OpenSSH scans the
entire file to search for a key. This can take significant time and disk I/O,
which delays users attempting to push or pull to a repository. Making
matters worse, if users add or remove keys frequently, the operating system may
@@ -33,21 +33,22 @@ able to accept a fingerprint. Check the version of OpenSSH on your server with `
Unlike [Cloud Native GitLab](https://docs.gitlab.com/charts/), Omnibus GitLab by default
manages an `authorized_keys` file that is located in the
-`git` user's home directory. For most installations, this will be located under
-`/var/opt/gitlab/.ssh/authorized_keys`, but you can use the following command to locate the `authorized_keys` on your system:
+`git` user's home directory. For most installations, this file is located under
+`/var/opt/gitlab/.ssh/authorized_keys`, but you can use the following command to
+locate the `authorized_keys` on your system:
```shell
getent passwd git | cut -d: -f6 | awk '{print $1"/.ssh/authorized_keys"}'
```
The `authorized_keys` file contains all the public SSH keys for users allowed to access GitLab. However, to maintain a
-single source of truth, [Geo](../geo/index.md) needs to be configured to perform SSH fingerprint
+single source of truth, [Geo](../geo/index.md) must be configured to perform SSH fingerprint
lookups via database lookup.
As part of [setting up Geo](../geo/index.md#setup-instructions),
you are required to follow the steps outlined below for both the primary and
-secondary nodes, but the `Write to "authorized keys" file` checkbox
-only needs to be unchecked on the primary node since it is reflected
+secondary nodes, but **Write to "authorized keys" file**
+must be unchecked only on the primary node, because it is reflected
automatically on the secondary if database replication is working.
## Setting up fast lookup via GitLab Shell
@@ -56,8 +57,8 @@ GitLab Shell provides a way to authorize SSH users via a fast, indexed lookup
to the GitLab database. GitLab Shell uses the fingerprint of the SSH key to
check whether the user is authorized to access GitLab.
-Add the following to your `sshd_config` file. This is usually located at
-`/etc/ssh/sshd_config`, but it will be `/assets/sshd_config` if you're using
+Add the following to your `sshd_config` file. This file is usually located at
+`/etc/ssh/sshd_config`, but it is at `/assets/sshd_config` if you're using
Omnibus Docker:
```plaintext
@@ -84,17 +85,14 @@ file (start the line with a `#` to comment it), and from your local machine, att
ssh -T git@gitlab.example.com
```
-A successful pull or [welcome message](../../user/ssh.md#verify-that-you-can-connect) would mean that GitLab was able to find the key in the database,
-since it is not present in the file anymore.
-
-NOTE:
-For Omnibus Docker, `AuthorizedKeysCommand` is setup by default in
-GitLab 11.11 and later.
+A successful pull or [welcome message](../../user/ssh.md#verify-that-you-can-connect)
+means that GitLab was able to find the key in the database,
+as it is not present in the file.
NOTE:
For Installations from source, the command would be located at
`/home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check` if [the install from source](../../install/installation.md#install-gitlab-shell) instructions were followed.
-You might want to consider creating a wrapper script somewhere else since this command needs to be
+You might want to consider creating a wrapper script somewhere else, as this command must be
owned by `root` and not be writable by group or others. You could also consider changing the ownership of this command
as required, but that might require temporary ownership changes during `gitlab-shell` upgrades.
@@ -123,7 +121,7 @@ or for users to re-add their keys.
## How to go back to using the `authorized_keys` file
-This is a brief overview. Please refer to the above instructions for more context.
+This overview is brief. Refer to the above instructions for more context.
1. [Rebuild the `authorized_keys` file](../raketasks/maintenance.md#rebuild-authorized_keys-file).
1. Enable writes to the `authorized_keys` file.
@@ -136,27 +134,35 @@ This is a brief overview. Please refer to the above instructions for more contex
## Use `gitlab-sshd` instead of OpenSSH
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299109) in GitLab 14.5.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299109) in GitLab 14.5 as an **Alpha** release for self-managed customers.
WARNING:
`gitlab-sshd` is in [**Alpha**](../../policy/alpha-beta-support.md#alpha-features).
It is not ready for production use.
`gitlab-sshd` is [a standalone SSH server](https://gitlab.com/gitlab-org/gitlab-shell/-/tree/main/internal/sshd)
- written in Go. It is provided as a part of `gitlab-shell` package. It has a lower memory
- use as a OpenSSH alternative and supports
- [group access restriction by IP address](../../user/group/index.md) for applications
- running behind the proxy.
+written in Go. It is provided as a part of the `gitlab-shell` package. It has a lower memory
+use as a OpenSSH alternative, and supports
+[group access restriction by IP address](../../user/group/index.md) for applications
+running behind the proxy.
+
+`gitlab-sshd` is a lightweight alternative to OpenSSH for providing
+[SSH operations](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/71a7f34a476f778e62f8fe7a453d632d395eaf8f/doc/features.md).
+While OpenSSH uses a restricted shell approach, `gitlab-sshd` behaves more like a
+modern multi-threaded server application, responding to incoming requests. The major
+difference is that OpenSSH uses SSH as a transport protocol while `gitlab-sshd` uses Remote Procedure Calls (RPCs).
+
+The capabilities of GitLab Shell are not limited to Git operations.
If you are considering switching from OpenSSH to `gitlab-sshd`, consider these concerns:
- The `gitlab-sshd` component is only available for
[Cloud Native Helm Charts](https://docs.gitlab.com/charts/) deployments.
- `gitlab-sshd` supports the PROXY protocol. It can run behind proxy servers that rely
- on it, such as HAProxy.
-- `gitlab-sshd` does not share a SSH port with the system administrator's OpenSSH,
- and requires a bind to port 22.
-- `gitlab-sshd` **does not** support SSH certificates.
+ on it, such as HAProxy. The PROXY protocol not enabled by default, but can be enabled with a Helm chart setting.
+- By default, `gitlab-sshd` binds to port 22, but you can configure a different port in the Helm chart.
+- `gitlab-sshd` **does not** support SSH certificates. For more details, read
+ [issue #495](https://gitlab.com/gitlab-org/gitlab-shell/-/issues/495).
To switch from OpenSSH to `gitlab-sshd`:
@@ -178,7 +184,11 @@ GitLab supports `authorized_keys` database lookups with [SELinux](https://en.wik
Because the SELinux policy is static, GitLab doesn't support the ability to change
internal webserver ports at the moment. Administrators would have to create a special `.te`
-file for the environment, since it isn't generated dynamically.
+file for the environment, as it isn't generated dynamically.
+
+### Additional documentation
+
+Additional technical documentation for `gitlab-sshd` may be found on the [GitLab Shell](https://gitlab.com/gitlab-org/gitlab-shell/-/blob/main/README.md) documentation page.
## Troubleshooting
@@ -187,7 +197,8 @@ or causing high CPU load, be sure to check the size of `/var/log/btmp`, and ensu
If this file is very large, GitLab SSH fast lookup can cause the bottleneck to be hit more frequently, thus decreasing performance even further.
If you are able to, you may consider disabling [`UsePAM` in your `sshd_config`](https://linux.die.net/man/5/sshd_config) to avoid reading `/var/log/btmp` altogether.
-Running `strace` and `lsof` on a running `sshd: git` process can return useful debugging information. To get an `strace` on an in-progress Git over SSH connection for IP `x.x.x.x`, run:
+Running `strace` and `lsof` on a running `sshd: git` process returns debugging information.
+To get an `strace` on an in-progress Git over SSH connection for IP `x.x.x.x`, run:
```plaintext
sudo strace -s 10000 -p $(sudo netstat -tp | grep x.x.x.x | egrep 'ssh.*: git' | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')
diff --git a/doc/administration/operations/puma.md b/doc/administration/operations/puma.md
index c12f75989c3..12a8b2faadc 100644
--- a/doc/administration/operations/puma.md
+++ b/doc/administration/operations/puma.md
@@ -179,6 +179,46 @@ optimal configuration:
- To force Rugged to be used with multi-threaded Puma, you can use a
[feature flag](../../development/gitaly.md#legacy-rugged-code).
+## Configuring Puma to listen over SSL
+
+Puma, when deployed with Omnibus GitLab, listens over a Unix socket by
+default. To configure Puma to listen over an HTTPS port instead, follow the
+steps below:
+
+1. Generate an SSL certificate key-pair for the address where Puma will
+ listen. For the example below, this is `127.0.0.1`.
+
+ NOTE:
+ If using a self-signed certificate from a custom Certificate Authority (CA),
+ follow [the documentation](https://docs.gitlab.com/omnibus/settings/ssl.html#install-custom-public-certificates)
+ to make them trusted by other GitLab components.
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ puma['ssl_listen'] = '127.0.0.1'
+ puma['ssl_port'] = 9111
+ puma['ssl_certificate'] = '<path_to_certificate>'
+ puma['ssl_certificate_key'] = '<path_to_key>'
+
+ # Disable UNIX socket
+ puma['socket'] = ""
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+NOTE:
+In addition to the Unix socket, Puma also listens over HTTP on port 8080 for
+providing metrics to be scraped by Prometheus. It is not currently possible to
+make Prometheus scrape them over HTTPS, and support for it is being discussed
+[in this issue](https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6811).
+Hence, it is not technically possible to turn off this HTTP listener without
+losing Prometheus metrics.
+
## Switch from Unicorn to Puma
NOTE:
diff --git a/doc/administration/package_information/licensing.md b/doc/administration/package_information/licensing.md
index a7bf5c52d7b..d27c1df0ccf 100644
--- a/doc/administration/package_information/licensing.md
+++ b/doc/administration/package_information/licensing.md
@@ -66,7 +66,7 @@ This software is based in part on the work of the Independent JPEG Group.
## Trademark Usage
-Within the GitLab documentation, reference to third party technology(ies) and/or trademarks of third party entities, may be made. The inclusion of reference to third party technology and/or entities is solely for the purposes of example(s) of how GitLab software may interact with, or be used in conjunction with, such third party technology.
+Within the GitLab documentation, reference to third-party technologies and/or trademarks of third-party entities may be made. The inclusion of reference to third-party technology and/or entities is solely for the purposes of examples of how GitLab software may interact with, or be used in conjunction with, such third-party technology.
All trademarks, materials, documentation, and other intellectual property remain the property of any/all such third party.
### Trademark Requirements
diff --git a/doc/administration/package_information/postgresql_versions.md b/doc/administration/package_information/postgresql_versions.md
index c80437221c4..97f93663003 100644
--- a/doc/administration/package_information/postgresql_versions.md
+++ b/doc/administration/package_information/postgresql_versions.md
@@ -26,6 +26,7 @@ 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 | 13.6 | Users can manually upgrade to 13.6 following the [upgrade docs](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 |
| 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.). |
diff --git a/doc/administration/package_information/signed_packages.md b/doc/administration/package_information/signed_packages.md
index d7bcfa113ff..24857dcfc27 100644
--- a/doc/administration/package_information/signed_packages.md
+++ b/doc/administration/package_information/signed_packages.md
@@ -14,7 +14,7 @@ These packages are produced by the GitLab CI process, as found in the [Omnibus
## GnuPG Public Keys
-All packages are signed with [GnuPG](https://www.gnupg.org/), in a method appropriate for their format. The key used to sign these packages can be found on [pgp.mit.edu](https://pgp.mit.edu) at [0x3cfcf9baf27eab47](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x3CFCF9BAF27EAB47)
+All packages are signed with [GnuPG](https://www.gnupg.org/), in a method appropriate for their format. The key used to sign these packages can be found on [MIT PGP Public Key Server](https://pgp.mit.edu) at [0x3cfcf9baf27eab47](https://pgp.mit.edu/pks/lookup?op=vindex&search=0x3CFCF9BAF27EAB47)
## Verifying Signatures
diff --git a/doc/administration/packages/container_registry.md b/doc/administration/packages/container_registry.md
index d6f5588ebc9..0edad83cc18 100644
--- a/doc/administration/packages/container_registry.md
+++ b/doc/administration/packages/container_registry.md
@@ -158,7 +158,7 @@ If your certificate provider provides the CA Bundle certificates, append them to
An administrator may want the container registry listening on an arbitrary port such as `5678`.
However, the registry and application server are behind an AWS application load balancer that only
-listens on ports `80` and `443`. The admin may simply remove the port number for
+listens on ports `80` and `443`. The administrator may simply remove the port number for
`registry_external_url`, so HTTP or HTTPS is assumed. Then, the rules apply that map the load
balancer to the registry from ports `80` or `443` to the arbitrary port. This is important if users
rely on the `docker login` example in the container registry. Here's an example:
@@ -1244,9 +1244,9 @@ unauthorized: authentication required
GitLab has a default token expiration of 5 minutes for the registry. When pushing
larger images, or images that take longer than 5 minutes to push, users may
-encounter this error.
+encounter this error. On GitLab.com, the expiration time is 15 minutes.
-Administrators can increase the token duration in **Admin area > Settings >
+Administrators can increase the token duration in **Admin Area > Settings >
CI/CD > Container Registry > Authorization token duration (minutes)**.
### Docker login attempt fails with: 'token signed by untrusted key'
diff --git a/doc/administration/packages/dependency_proxy.md b/doc/administration/packages/dependency_proxy.md
index 4c50cfeeb0f..40c1b9d795a 100644
--- a/doc/administration/packages/dependency_proxy.md
+++ b/doc/administration/packages/dependency_proxy.md
@@ -140,8 +140,6 @@ This section describes the earlier configuration format.
gitlab_rails['dependency_proxy_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/dependency_proxy"
gitlab_rails['dependency_proxy_object_store_enabled'] = true
gitlab_rails['dependency_proxy_object_store_remote_directory'] = "dependency_proxy" # The bucket name.
- gitlab_rails['dependency_proxy_object_store_direct_upload'] = false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false).
- gitlab_rails['dependency_proxy_object_store_background_upload'] = true # Temporary option to limit automatic upload (Default: true).
gitlab_rails['dependency_proxy_object_store_proxy_download'] = false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage.
gitlab_rails['dependency_proxy_object_store_connection'] = {
##
@@ -177,8 +175,6 @@ This section describes the earlier configuration format.
object_store:
enabled: false
remote_directory: dependency_proxy # The bucket name.
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false).
- # background_upload: true # Temporary option to limit automatic upload (Default: true).
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage.
connection:
##
@@ -248,23 +244,6 @@ Verify that there are no files on disk in the `dependency_proxy` folder:
sudo find /var/opt/gitlab/gitlab-rails/shared/dependency_proxy -type f | grep -v tmp | wc -l
```
-## Disabling Authentication
-
-Authentication was introduced in 13.7 as part of [enabling private groups to use the
-Dependency Proxy](https://gitlab.com/gitlab-org/gitlab/-/issues/11582). If you
-previously used the Dependency Proxy without authentication and need to disable
-this feature while you update your workflow to [authenticate with the Dependency
-Proxy](../../user/packages/dependency_proxy/index.md#authenticate-with-the-dependency-proxy),
-the following commands can be issued in a Rails console:
-
-```ruby
-# Disable the authentication
-Feature.disable(:dependency_proxy_for_private_groups)
-
-# Re-enable the authentication
-Feature.enable(:dependency_proxy_for_private_groups)
-```
-
## Changing the JWT expiration
The Dependency Proxy follows the [Docker v2 token authentication flow](https://docs.docker.com/registry/spec/auth/token/),
@@ -280,7 +259,7 @@ ApplicationSetting.update(container_registry_token_expire_delay: 30)
The default expiration and the expiration on GitLab.com is 15 minutes.
## Using the dependency proxy behind a proxy
-
+
1. Edit `/etc/gitlab/gitlab.rb` and add the following lines:
```ruby
diff --git a/doc/administration/packages/index.md b/doc/administration/packages/index.md
index b122cb9db90..ef00127a70e 100644
--- a/doc/administration/packages/index.md
+++ b/doc/administration/packages/index.md
@@ -152,8 +152,6 @@ We recommend using the [consolidated object storage settings](../object_storage.
gitlab_rails['packages_enabled'] = true
gitlab_rails['packages_object_store_enabled'] = true
gitlab_rails['packages_object_store_remote_directory'] = "packages" # The bucket name.
- gitlab_rails['packages_object_store_direct_upload'] = false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false).
- gitlab_rails['packages_object_store_background_upload'] = true # Temporary option to limit automatic upload (Default: true).
gitlab_rails['packages_object_store_proxy_download'] = false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage.
gitlab_rails['packages_object_store_connection'] = {
##
@@ -192,8 +190,6 @@ We recommend using the [consolidated object storage settings](../object_storage.
object_store:
enabled: false
remote_directory: packages # The bucket name.
- # direct_upload: false # Use Object Storage directly for uploads instead of background uploads if enabled (Default: false).
- # background_upload: true # Temporary option to limit automatic upload (Default: true).
# proxy_download: false # Passthrough all downloads via GitLab instead of using Redirects to Object Storage.
connection:
##
diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md
index 114894c01f0..f144c60fcfe 100644
--- a/doc/administration/pages/index.md
+++ b/doc/administration/pages/index.md
@@ -97,10 +97,9 @@ IPv6 address. If you don't have IPv6, you can omit the `AAAA` record.
#### DNS configuration for custom domains
-If support for custom domains is needed, the Pages root domain and its subdomains should point to
-the secondary IP (which is dedicated for the Pages daemon). `<namespace>.<pages root domain>` should
-point at Pages directly. Without this, users aren't able to use `CNAME` records to point their
-custom domains to their GitLab Pages.
+If support for custom domains is needed, all subdomains of the Pages root domain should point to the
+secondary IP (which is dedicated for the Pages daemon). Without this configuration, users can't use
+`CNAME` records to point their custom domains to their GitLab Pages.
For example, an entry could look like this:
@@ -295,7 +294,7 @@ control over how the Pages daemon runs and serves content in your environment.
| `rate_limit_domain_burst` | Rate limit per domain maximum burst allowed per second. |
| `server_read_timeout` | Maximum duration to read the request headers and body. For no timeout, set to `0` or a negative value. Default: `5s` |
| `server_read_header_timeout` | Maximum duration to read the request headers. For no timeout, set to `0` or a negative value. Default: `1s` |
-| `server_write_timeout` | Maximum duration to write all files in the response. Larger files require more time. For no timeout, set to `0` or a negative value. Default: `5m` |
+| `server_write_timeout` | Maximum duration to write all files in the response. Larger files require more time. For no timeout, set to `0` or a negative value. Default: `0` |
| `server_keep_alive` | The `Keep-Alive` period for network connections accepted by this listener. If `0`, `Keep-Alive` is enabled if supported by the protocol and operating system. If negative, `Keep-Alive` is disabled. Default: `15s` |
## Advanced configuration
@@ -387,6 +386,12 @@ GitLab supports [custom domain verification](../../user/project/pages/custom_dom
When adding a custom domain, users are required to prove they own it by
adding a GitLab-controlled verification code to the DNS records for that domain.
+WARNING:
+Disabling domain verification is unsafe and can lead to various vulnerabilities.
+If you *do* disable it, either ensure that the Pages root domain itself does not point to the
+secondary IP or add the root domain as custom domain to a project; otherwise, any user can add this
+domain as a custom domain to their project.
+
If your user base is private or otherwise trusted, you can disable the
verification requirement:
@@ -1135,7 +1140,7 @@ Rate limits are enforced using the following:
- `rate_limit_source_ip`: Set the maximum threshold in number of requests per client IP per second. Set to 0 to disable this feature.
- `rate_limit_source_ip_burst`: Sets the maximum threshold of number of requests allowed in an initial outburst of requests per client IP.
For example, when you load a web page that loads a number of resources at the same time.
-- `rate_limit_domain_ip`: Set the maximum threshold in number of requests per hosted pages domain per second. Set to 0 to disable this feature.
+- `rate_limit_domain`: Set the maximum threshold in number of requests per hosted pages domain per second. Set to 0 to disable this feature.
- `rate_limit_domain_burst`: Sets the maximum threshold of number of requests allowed in an initial outburst of requests per hosted pages domain.
#### Enable source-IP rate limits
@@ -1339,6 +1344,27 @@ To stop `systemd` from cleaning the Pages related content:
sudo gitlab-ctl restart gitlab-pages
```
+### Unable to access GitLab Pages
+
+If you can't access your GitLab Pages (such as receiving `502 Bad Gateway` errors, or a login loop)
+and in your Pages log shows this error:
+
+```plaintext
+"error":"retrieval context done: context deadline exceeded","host":"root.docs-cit.otenet.gr","level":"error","msg":"could not fetch domain information from a source"
+```
+
+1. Add the following to `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_pages['internal_gitlab_server'] = 'http://localhost:8080'
+ ```
+
+1. Restart GitLab Pages:
+
+ ```shell
+ sudo gitlab-ctl restart gitlab-pages
+ ```
+
### 404 error after promoting a Geo secondary to a primary node
Pages files are not among the
diff --git a/doc/administration/postgresql/pgbouncer.md b/doc/administration/postgresql/pgbouncer.md
index a666c1fab95..ed3c662eba3 100644
--- a/doc/administration/postgresql/pgbouncer.md
+++ b/doc/administration/postgresql/pgbouncer.md
@@ -219,12 +219,12 @@ the database. Each of the listed services below use the following formula to def
- `puma` : `max_threads + headroom` (default `14`)
- `max_threads` is configured via: `gitlab['puma']['max_threads']` (default: `4`)
- - `headroom` can be configured via `DB_POOL_HEADROOM` env variable (default to `10`)
+ - `headroom` can be configured via `DB_POOL_HEADROOM` environment variable (default to `10`)
- `sidekiq` : `max_concurrency + 1 + headroom` (default: `61`)
- `max_concurrency` is configured via: `sidekiq['max_concurrency']` (default: `50`)
- - `headroom` can be configured via `DB_POOL_HEADROOM` env variable (default to `10`)
+ - `headroom` can be configured via `DB_POOL_HEADROOM` environment variable (default to `10`)
- `geo-logcursor`: `1+headroom` (default: `11`)
- - `headroom` can be configured via `DB_POOL_HEADROOM` env variable (default to `10`)
+ - `headroom` can be configured via `DB_POOL_HEADROOM` environment variable (default to `10`)
To calculate the `default_pool_size`, multiply the number of instances of `puma`, `sidekiq` and `geo-logcursor` by the
number of connections each can consume as per listed above. The total will be the suggested `default_pool_size`.
diff --git a/doc/administration/postgresql/replication_and_failover.md b/doc/administration/postgresql/replication_and_failover.md
index 8c7151606a5..84122149cb8 100644
--- a/doc/administration/postgresql/replication_and_failover.md
+++ b/doc/administration/postgresql/replication_and_failover.md
@@ -1123,25 +1123,36 @@ postgresql['trust_auth_cidr_addresses'] = %w(123.123.123.123/32 <other_cidrs>)
### Reinitialize a replica
-If replication is not occurring, it may be necessary to reinitialize a replica.
+If a replica cannot start or rejoin the cluster, or when it lags behind and can not catch up, it might be necessary to reinitialize the replica:
-1. On any server in the cluster, determine the Cluster and Member names,
- and check the replication lag by running `gitlab-ctl patroni members`. Here is an example:
+1. [Check the replication status](#check-replication-status) to confirm which server
+ needs to be reinitialized. For example:
```plaintext
- + Cluster: postgresql-ha (6970678148837286213) ------+---------+---------+----+-----------+
- | Member | Host | Role | State | TL | Lag in MB |
- +-------------------------------------+--------------+---------+---------+----+-----------+
- | gitlab-database-1.example.com | 172.18.0.111 | Replica | running | 5 | 0 |
- | gitlab-database-2.example.com | 172.18.0.112 | Replica | running | 5 | 100 |
- | gitlab-database-3.example.com | 172.18.0.113 | Leader | running | 5 | |
- +-------------------------------------+--------------+---------+---------+----+-----------+
+ + Cluster: postgresql-ha (6970678148837286213) ------+---------+--------------+----+-----------+
+ | Member | Host | Role | State | TL | Lag in MB |
+ +-------------------------------------+--------------+---------+--------------+----+-----------+
+ | gitlab-database-1.example.com | 172.18.0.111 | Replica | running | 55 | 0 |
+ | gitlab-database-2.example.com | 172.18.0.112 | Replica | start failed | | unknown |
+ | gitlab-database-3.example.com | 172.18.0.113 | Leader | running | 55 | |
+ +-------------------------------------+--------------+---------+--------------+----+-----------+
```
-1. Reinitialize the affected replica server:
+1. Sign in to the broken server and reinitialize the database and replication. Patroni will shut
+ down PostgreSQL on that server, remove the data directory, and reinitialize it from scratch:
- ```plaintext
- gitlab-ctl patroni reinitialize-replica postgresql-ha gitlab-database-2.example.com
+ ```shell
+ sudo gitlab-ctl patroni reinitialize-replica --member gitlab-database-2.example.com
+ ```
+
+ This can be run on any Patroni node, but be aware that `sudo gitlab-ctl patroni
+ reinitialize-replica` without `--member` will reinitialize the server it is run on.
+ It is recommended to run it locally on the broken server to reduce the risk of
+ unintended data loss.
+1. Monitor the logs:
+
+ ```shell
+ sudo gitlab-ctl tail patroni
```
### Reset the Patroni state in Consul
diff --git a/doc/administration/pseudonymizer.md b/doc/administration/pseudonymizer.md
index 24d9792dcb0..ad4cfd11474 100644
--- a/doc/administration/pseudonymizer.md
+++ b/doc/administration/pseudonymizer.md
@@ -2,127 +2,14 @@
stage: Enablement
group: Distribution
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+remove_date: '2022-08-22'
+redirect_to: 'index.md'
---
-# Pseudonymizer (DEPRECATED) **(ULTIMATE)**
+# Pseudonymizer (removed) **(ULTIMATE)**
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/219952) in GitLab 14.7.
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/219952) in
+> GitLab 14.7 and removed in 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/219952) in GitLab 14.7.
-
-Your GitLab database contains sensitive information. To protect sensitive information
-when you run analytics on your database, you can use the Pseudonymizer service, which:
-
-1. Uses `HMAC(SHA256)` to mutate fields containing sensitive information.
-1. Preserves references (referential integrity) between fields.
-1. Exports your GitLab data, scrubbed of sensitive material.
-
-WARNING:
-If the source data is available, users can compare and correlate the scrubbed data
-with the original.
-
-To generate a pseudonymized data set:
-
-1. [Configure Pseudonymizer](#configure-pseudonymizer) fields and output location.
-1. [Enable Pseudonymizer data collection](#enable-pseudonymizer-data-collection).
-1. Optional. [Generate a data set manually](#generate-data-set-manually).
-
-## Configure Pseudonymizer
-
-To use the Pseudonymizer, configure both the fields you want to anonymize, and the location to
-store the scrubbed data:
-
-1. **Create a manifest file**: This file describes the fields to include or pseudonymize.
- - **Default manifest** - GitLab provides a default manifest in your GitLab installation
- ([example `manifest.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/pseudonymizer.yml)).
- To use the example manifest file, use the `config/pseudonymizer.yml` relative path
- when you configure connection parameters.
- - **Custom manifest** - To use a custom manifest file, use the absolute path to
- the file when you configure the connection parameters.
-1. **Configure connection parameters**: In the configuration method appropriate for
- your version of GitLab, specify the [object storage](object_storage.md)
- connection parameters (`pseudonymizer.upload.connection`).
-
-**For Omnibus installations:**
-
-1. Edit `/etc/gitlab/gitlab.rb` and add the following lines by replacing with
- the values you want:
-
- ```ruby
- gitlab_rails['pseudonymizer_manifest'] = 'config/pseudonymizer.yml'
- gitlab_rails['pseudonymizer_upload_remote_directory'] = 'gitlab-elt' # bucket name
- gitlab_rails['pseudonymizer_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-central-1',
- 'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
- 'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY'
- }
- ```
-
- If you are using AWS IAM profiles, omit the AWS access key and secret access key/value pairs.
-
- ```ruby
- gitlab_rails['pseudonymizer_upload_connection'] = {
- 'provider' => 'AWS',
- 'region' => 'eu-central-1',
- 'use_iam_profile' => true
- }
- ```
-
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure)
- for the changes to take effect.
-
----
-
-**For installations from source:**
-
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
-
- ```yaml
- pseudonymizer:
- manifest: config/pseudonymizer.yml
- upload:
- remote_directory: 'gitlab-elt' # bucket name
- connection:
- provider: AWS
- aws_access_key_id: AWS_ACCESS_KEY_ID
- aws_secret_access_key: AWS_SECRET_ACCESS_KEY
- region: eu-central-1
- ```
-
-1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source)
- for the changes to take effect.
-
-## Enable Pseudonymizer data collection
-
-To enable data collection:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Metrics and Profiling**, then expand
- **Pseudonymizer data collection**.
-1. Select **Enable Pseudonymizer data collection**.
-1. Select **Save changes**.
-
-## Generate data set manually
-
-You can also run the Pseudonymizer manually:
-
-1. Set these environment variables:
- - `PSEUDONYMIZER_OUTPUT_DIR` - Where to store the output CSV files. Defaults to `/tmp`.
- These commands produce CSV files that can be quite large. Make sure the directory
- can store a file at least 10% of the size of your database.
- - `PSEUDONYMIZER_BATCH` - The batch size when querying the database. Defaults to `100000`.
-1. Run the command appropriate for your application:
- - **Omnibus GitLab**:
- `sudo gitlab-rake gitlab:db:pseudonymizer`
- - **Installations from source**:
- `sudo -u git -H bundle exec rake gitlab:db:pseudonymizer RAILS_ENV=production`
-
-After you run the command, upload the output CSV files to your configured object
-storage. After the upload completes, delete the output file from the local disk.
-
-## Related topics
-
-- [Using object storage with GitLab](object_storage.md).
diff --git a/doc/administration/raketasks/ldap.md b/doc/administration/raketasks/ldap.md
index cae2465fad8..cdad323733d 100644
--- a/doc/administration/raketasks/ldap.md
+++ b/doc/administration/raketasks/ldap.md
@@ -175,7 +175,7 @@ bundle exec rake gitlab:ldap:secret:show RAILS_ENV=production
```plaintext
main:
password: '123'
- user_bn: 'gitlab-adm'
+ bind_dn: 'gitlab-adm'
```
### Edit secret
diff --git a/doc/administration/raketasks/storage.md b/doc/administration/raketasks/storage.md
index 912cf260a03..689ed5c5824 100644
--- a/doc/administration/raketasks/storage.md
+++ b/doc/administration/raketasks/storage.md
@@ -79,7 +79,7 @@ In GitLab 13.0, [hashed storage](../repository_storage_types.md#hashed-storage)
is enabled by default and the legacy storage is deprecated.
GitLab 14.0 eliminates support for legacy storage. If you're on GitLab
13.0 and later, switching new projects to legacy storage is not possible.
-The option to choose between hashed and legacy storage in the admin area has
+The option to choose between hashed and legacy storage in the Admin Area has
been disabled.
This task must be run on any machine that has Rails/Sidekiq configured, and the task
@@ -132,7 +132,7 @@ In GitLab 13.0, [hashed storage](../repository_storage_types.md#hashed-storage)
is enabled by default and the legacy storage is deprecated.
GitLab 14.0 eliminates support for legacy storage. If you're on GitLab
13.0 and later, switching new projects to legacy storage is not possible.
-The option to choose between hashed and legacy storage in the admin area has
+The option to choose between hashed and legacy storage in the Admin Area has
been disabled.
This task schedules all your existing projects and associated attachments to be rolled back to the
@@ -169,3 +169,99 @@ Any error or warning is logged in Sidekiq's log file.
If you have a Geo setup, the rollback is not reflected automatically
on the **secondary** node. You may need to wait for a backfill operation to kick-in and remove
the remaining repositories from the special `@hashed/` folder manually.
+
+## Troubleshooting
+
+The Rake task might not be able to complete the migration to hashed storage.
+Checks on the instance will continue to report that there is legacy data:
+
+```plaintext
+* Found 1 projects using Legacy Storage
+- janedoe/testproject (id: 1234)
+```
+
+If you have a subscription, [raise a ticket with GitLab support](https://support.gitlab.com)
+as most of the fixes are relatively high risk, involving running code on the Rails console.
+
+### Read only projects
+
+If you have [set projects read only](../troubleshooting/gitlab_rails_cheat_sheet.md#make-a-project-read-only-can-only-be-done-in-the-console)
+they might fail to migrate.
+
+1. [Start a Rails console](../operations/rails_console.md#starting-a-rails-console-session).
+
+1. Check if the project is read only:
+
+ ```ruby
+ project = Project.find_by_full_path('janedoe/testproject')
+ project.repository_read_only
+ ```
+
+1. If it returns `true` (not `nil` or `false`), set it writable:
+
+ ```ruby
+ project.update!(repository_read_only: false)
+ ```
+
+1. [Re-run the migration Rake task](#migrate-to-hashed-storage).
+
+1. Set the project read-only again:
+
+ ```ruby
+ project.update!(repository_read_only: true)
+ ```
+
+### Projects pending deletion
+
+Check the project details in the Admin Area. If deleting the project failed
+it will show as `Marked For Deletion At ..`, `Scheduled Deletion At ..` and
+`pending removal`, but the dates will not be recent.
+
+Delete the project using the Rails console:
+
+1. [Start a Rails console](../operations/rails_console.md#starting-a-rails-console-session).
+
+1. With the following code, select the project to be deleted and account to action it:
+
+ ```ruby
+ project = Project.find_by_full_path('janedoe/testproject')
+ user = User.find_by_username('admin_handle')
+ puts "\nproject selected for deletion is:\nID: #{project.id}\nPATH: #{project.full_path}\nNAME: #{project.name}\n\n"
+ ```
+
+ - Replace `janedoe/testproject` with your project path from the Rake take output or from the Admin Area.
+ - Replace `admin_handle` with the handle of an instance administrator or with `root`.
+ - Verify the output before proceeding. **There are no other checks performed**.
+
+1. [Destroy the project](../troubleshooting/gitlab_rails_cheat_sheet.md#destroy-a-project) **immediately**:
+
+ ```ruby
+ Projects::DestroyService.new(project, user).execute
+ ```
+
+If destroying the project generates a stack trace relating to encryption or the error `OpenSSL::Cipher::CipherError`:
+
+1. [Verify your GitLab secrets](check.md#verify-database-values-can-be-decrypted-using-the-current-secrets).
+
+1. If the affected projects have secrets that cannot be decrypted it will be necessary to remove those specific secrets.
+ [Our documentation for dealing with lost secrets](../../raketasks/backup_restore.md#when-the-secrets-file-is-lost)
+ is for loss of all secrets, but it's possible for specific projects to be affected. For example,
+ to [reset specific runner registration tokens](../../raketasks/backup_restore.md#reset-runner-registration-tokens)
+ for a specific project ID:
+
+ ```sql
+ UPDATE projects SET runners_token = null, runners_token_encrypted = null where id = 1234;
+ ```
+
+### `Repository cannot be moved from` errors in Sidekiq log
+
+Projects might fail to migrate with errors in the Sidekiq log:
+
+```shell
+# grep 'Repository cannot be moved' /var/log/gitlab/sidekiq/current
+{"severity":"ERROR","time":"2021-02-29T02:29:02.021Z","message":"Repository cannot be moved from 'janedoe/testproject' to '@hashed<value>' (PROJECT_ID=1234)"}
+```
+
+This might be caused by [a bug](https://gitlab.com/gitlab-org/gitlab/-/issues/259605) in the original code for hashed storage migration.
+
+[There is a workaround for projects still affected by this issue](https://gitlab.com/-/snippets/2039252).
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index 2ca79bbeae4..f70912dbecb 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -39,7 +39,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -1351,11 +1351,18 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Praefect server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1364,7 +1371,6 @@ To configure the Praefect nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Praefect Configuration
praefect['enable'] = true
@@ -1391,8 +1397,8 @@ To configure the Praefect nodes, on each one:
praefect['database_host'] = '10.6.0.141'
praefect['database_port'] = 5432
# `no_proxy` settings must always be a direct connection for caching
- praefect['database_host_no_proxy'] = '10.6.0.141'
- praefect['database_port_no_proxy'] = 5432
+ praefect['database_direct_host'] = '10.6.0.141'
+ praefect['database_direct_port'] = 5432
praefect['database_dbname'] = 'praefect_production'
praefect['database_user'] = 'praefect'
praefect['database_password'] = '<praefect_postgresql_password>'
@@ -1495,10 +1501,18 @@ On each node:
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:
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1507,7 +1521,6 @@ On each node:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1693,11 +1706,18 @@ To configure the Sidekiq nodes, on each one:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Sidekiq server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
gitlab_workhorse['enable'] = false
prometheus['enable'] = false
@@ -1705,7 +1725,6 @@ To configure the Sidekiq nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# External URL
## This should match the URL of the external load balancer
@@ -2169,7 +2188,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -2202,7 +2221,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -2281,7 +2299,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -2293,7 +2311,7 @@ future with further specific cloud provider details.
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -2315,7 +2333,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
diff --git a/doc/administration/reference_architectures/1k_users.md b/doc/administration/reference_architectures/1k_users.md
index 7213a1eb92b..8d5afd732d9 100644
--- a/doc/administration/reference_architectures/1k_users.md
+++ b/doc/administration/reference_architectures/1k_users.md
@@ -62,7 +62,7 @@ monitor .[#7FFFD4,norank]--> redis
@enduml
```
-The diagram above shows that while GitLab can be installed on a single server, it is internally composed of multiple services. As a GitLab instance is scaled, each of these services are broken out and independently scaled according to the demands placed on them. In some cases PaaS can be leveraged for some services (e.g. Cloud Object Storage for some file systems). For the sake of redundancy some of the services become clusters of nodes storing the same data. In a horizontal configuration of GitLab there are various ancillary services required to coordinate clusters or discover of resources (e.g. PgBouncer for Postgres connection management, Consul for Prometheus end point discovery).
+The diagram above shows that while GitLab can be installed on a single server, it is internally composed of multiple services. As a GitLab instance is scaled, each of these services are broken out and independently scaled according to the demands placed on them. In some cases PaaS can be leveraged for some services (e.g. Cloud Object Storage for some file systems). For the sake of redundancy some of the services become clusters of nodes storing the same data. In a horizontal configuration of GitLab there are various ancillary services required to coordinate clusters or discover of resources (e.g. PgBouncer for PostgreSQL connection management, Consul for Prometheus end point discovery).
## Requirements
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 2a1d344508e..d9f349b59c7 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -39,7 +39,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -1355,11 +1355,18 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Praefect server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1368,7 +1375,6 @@ To configure the Praefect nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Praefect Configuration
praefect['enable'] = true
@@ -1395,8 +1401,8 @@ To configure the Praefect nodes, on each one:
praefect['database_host'] = '10.6.0.141'
praefect['database_port'] = 5432
# `no_proxy` settings must always be a direct connection for caching
- praefect['database_host_no_proxy'] = '10.6.0.141'
- praefect['database_port_no_proxy'] = 5432
+ praefect['database_direct_host'] = '10.6.0.141'
+ praefect['database_direct_port'] = 5432
praefect['database_dbname'] = 'praefect_production'
praefect['database_user'] = 'praefect'
praefect['database_password'] = '<praefect_postgresql_password>'
@@ -1499,10 +1505,18 @@ On each node:
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:
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1511,7 +1525,6 @@ On each node:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1697,11 +1710,18 @@ To configure the Sidekiq nodes, on each one:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Sidekiq server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
gitlab_workhorse['enable'] = false
prometheus['enable'] = false
@@ -1709,7 +1729,6 @@ To configure the Sidekiq nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# External URL
## This should match the URL of the external load balancer
@@ -2173,7 +2192,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -2206,7 +2225,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -2279,7 +2297,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -2291,7 +2309,7 @@ future with further specific cloud provider details.
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -2313,7 +2331,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index f417d1e2ab5..d029f356612 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -32,7 +32,7 @@ For a full list of reference architectures, see
<!-- 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.
-2. Can be optionally run as reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
<!-- markdownlint-enable MD029 -->
@@ -444,21 +444,18 @@ 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:
- <!-- Updates to following example must also be made at https://gitlab.com/gitlab-org/charts/gitlab/blob/master/doc/advanced/external-gitaly/external-omnibus-gitaly.md#configure-omnibus-gitlab -->
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
```ruby
- # /etc/gitlab/gitlab.rb
-
- # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
- # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
- # The following two values must be the same as their respective values
- # of the GitLab Rails application setup
- gitaly['auth_token'] = 'gitalysecret'
- gitlab_shell['secret_token'] = 'shellsecret'
-
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -467,7 +464,6 @@ To configure the Gitaly server, on the server node you want to use for Gitaly:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -486,6 +482,13 @@ To configure the Gitaly server, on the server node you want to use for Gitaly:
gitaly['listen_addr'] = "0.0.0.0:8075"
gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"
+ # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
+ # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
+ # The following two values must be the same as their respective values
+ # of the GitLab Rails application setup
+ gitaly['auth_token'] = 'gitalysecret'
+ gitlab_shell['secret_token'] = 'shellsecret'
+
# Set the network addresses that the exporters used for monitoring will listen on
node_exporter['listen_address'] = '0.0.0.0:9100'
@@ -891,7 +894,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -924,7 +927,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -1000,7 +1002,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -1012,7 +1014,7 @@ future with further specific cloud provider details.
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -1028,7 +1030,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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 9d8be3e90b6..14b8982766c 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -48,7 +48,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -1295,11 +1295,18 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Praefect server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1308,7 +1315,6 @@ To configure the Praefect nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Praefect Configuration
praefect['enable'] = true
@@ -1335,8 +1341,8 @@ To configure the Praefect nodes, on each one:
praefect['database_host'] = '10.6.0.141'
praefect['database_port'] = 5432
# `no_proxy` settings must always be a direct connection for caching
- praefect['database_host_no_proxy'] = '10.6.0.141'
- praefect['database_port_no_proxy'] = 5432
+ praefect['database_direct_host'] = '10.6.0.141'
+ praefect['database_direct_port'] = 5432
praefect['database_dbname'] = 'praefect_production'
praefect['database_user'] = 'praefect'
praefect['database_password'] = '<praefect_postgresql_password>'
@@ -1439,10 +1445,18 @@ On each node:
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:
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1451,7 +1465,6 @@ On each node:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1639,11 +1652,18 @@ To configure the Sidekiq nodes, one each one:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Sidekiq server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
gitlab_workhorse['enable'] = false
prometheus['enable'] = false
@@ -1651,7 +1671,6 @@ To configure the Sidekiq nodes, one each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# External URL
## This should match the URL of the external load balancer
@@ -2108,7 +2127,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -2141,7 +2160,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -2239,7 +2257,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -2251,7 +2269,7 @@ future with further specific cloud provider details.
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -2272,7 +2290,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 6c4e2227b18..078e3a289cc 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -39,7 +39,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -86,7 +86,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
@@ -1364,11 +1364,18 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Praefect server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1377,7 +1384,6 @@ To configure the Praefect nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Praefect Configuration
praefect['enable'] = true
@@ -1404,8 +1410,8 @@ To configure the Praefect nodes, on each one:
praefect['database_host'] = '10.6.0.141'
praefect['database_port'] = 5432
# `no_proxy` settings must always be a direct connection for caching
- praefect['database_host_no_proxy'] = '10.6.0.141'
- praefect['database_port_no_proxy'] = 5432
+ praefect['database_direct_host'] = '10.6.0.141'
+ praefect['database_direct_port'] = 5432
praefect['database_dbname'] = 'praefect_production'
praefect['database_user'] = 'praefect'
praefect['database_password'] = '<praefect_postgresql_password>'
@@ -1508,10 +1514,18 @@ On each node:
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:
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1520,7 +1534,6 @@ On each node:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1706,11 +1719,18 @@ To configure the Sidekiq nodes, on each one:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Sidekiq server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
gitlab_workhorse['enable'] = false
prometheus['enable'] = false
@@ -1718,7 +1738,6 @@ To configure the Sidekiq nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# External URL
## This should match the URL of the external load balancer
@@ -2189,7 +2208,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -2222,7 +2241,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -2295,7 +2313,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -2304,10 +2322,10 @@ future with further specific cloud provider details.
| Webservice | 16 | 32 vCPU, 28.8 GB memory | `n1-highcpu-32` | `m5.8xlarge` | 510 vCPU, 472 GB memory |
| Sidekiq | 4 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 15.5 vCPU, 50 GB memory |
| Supporting services such as NGINX, Prometheus | 2 | 4 vCPU, 15 GB memory | `n1-standard-4` | `m5.xlarge` | 7.75 vCPU, 25 GB memory |
-
+
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -2329,7 +2347,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -2377,7 +2395,7 @@ card "Database" as database {
card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347
-
+
redis_cache -[hidden]-> redis_persistent
}
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index dd7209a3a3a..d18c77902f6 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -45,7 +45,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
@@ -1293,11 +1293,18 @@ To configure the Praefect nodes, on each one:
on the page.
1. Edit the `/etc/gitlab/gitlab.rb` file to configure Praefect:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/administration/gitaly/praefect.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Praefect server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1306,7 +1313,6 @@ To configure the Praefect nodes, on each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Praefect Configuration
praefect['enable'] = true
@@ -1333,8 +1339,8 @@ To configure the Praefect nodes, on each one:
praefect['database_host'] = '10.6.0.141'
praefect['database_port'] = 5432
# `no_proxy` settings must always be a direct connection for caching
- praefect['database_host_no_proxy'] = '10.6.0.141'
- praefect['database_port_no_proxy'] = 5432
+ praefect['database_direct_host'] = '10.6.0.141'
+ praefect['database_direct_port'] = 5432
praefect['database_dbname'] = 'praefect_production'
praefect['database_user'] = 'praefect'
praefect['database_password'] = '<praefect_postgresql_password>'
@@ -1437,10 +1443,18 @@ On each node:
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:
+<!--
+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
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/gitaly/index.md#gitaly-server-configuration
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Gitaly server
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
sidekiq['enable'] = false
gitlab_workhorse['enable'] = false
@@ -1449,7 +1463,6 @@ On each node:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false
@@ -1635,11 +1648,18 @@ To configure the Sidekiq nodes, one each one:
on the page.
1. Create or edit `/etc/gitlab/gitlab.rb` and use the following configuration:
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+
```ruby
# Avoid running unnecessary services on the Sidekiq server
gitaly['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
gitlab_workhorse['enable'] = false
prometheus['enable'] = false
@@ -1647,7 +1667,6 @@ To configure the Sidekiq nodes, one each one:
grafana['enable'] = false
gitlab_exporter['enable'] = false
gitlab_kas['enable'] = false
- nginx['enable'] = false
# External URL
## This should match the URL of the external load balancer
@@ -2108,7 +2127,7 @@ GitLab has been tested on a number of object storage providers:
- [Google Cloud Storage](https://cloud.google.com/storage)
- [Digital Ocean Spaces](http://www.digitalocean.com/products/spaces)
- [Oracle Cloud Infrastructure](https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift](https://docs.openstack.org/swift/latest/s3_compat.html)
+- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
- [Azure Blob storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- On-premises hardware and appliances from various storage vendors.
- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
@@ -2141,7 +2160,6 @@ on what features you intend to use:
| [Mattermost](https://docs.mattermost.com/administration/config-settings.html#file-storage)| No |
| [Packages](../packages/index.md#using-object-storage) (optional feature) | Yes |
| [Dependency Proxy](../packages/dependency_proxy.md#using-object-storage) (optional feature) | Yes |
-| [Pseudonymizer](../pseudonymizer.md) (optional feature) | No |
| [Autoscale runner caching](https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching) (optional for improved performance) | No |
| [Terraform state files](../terraform_state.md#using-object-storage) | Yes |
@@ -2214,7 +2232,7 @@ The following tables and diagram detail the hybrid environment using the same fo
as the normal environment above.
First are the components that run in Kubernetes. The recommendation at this time is to
-use Google Cloud's Kubernetes Engine (GKE) and associated machine types, but the memory
+use Google Cloud's Kubernetes Engine (GKE) or AWS Elastic Kubernetes Service (EKS) and associated machine types, but the memory
and CPU requirements should translate to most other providers. We hope to update this in the
future with further specific cloud provider details.
@@ -2226,7 +2244,7 @@ future with further specific cloud provider details.
- For this setup, we **recommend** and regularly [test](index.md#validation-and-test-results)
[Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine) and [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/). Other Kubernetes services may also work, but your mileage may vary.
-- Nodes configuration is shown as it is forced to ensure pod vcpu / memory ratios and avoid scaling during **performance testing**.
+- Nodes configuration is shown as it is forced to ensure pod vCPU / memory ratios and avoid scaling during **performance testing**.
- In production deployments, there is no need to assign pods to nodes. A minimum of three nodes in three different availability zones is strongly recommended to align with resilient cloud architecture practices.
Next are the backend components that run on static compute VMs via Omnibus (or External PaaS
@@ -2247,7 +2265,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.
-2. Can be optionally run on reputable third-party external PaaS Redis solutions. Google Memorystore and AWS Elasticache are known to work.
+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.
5. Gitaly Cluster provides the benefits of fault tolerance, but comes with additional complexity of setup and management. Review the existing [technical limitations and considerations before deploying Gitaly Cluster](../gitaly/index.md#before-deploying-gitaly-cluster). If you want sharded Gitaly, use the same specs listed above for `Gitaly`.
diff --git a/doc/administration/reference_architectures/index.md b/doc/administration/reference_architectures/index.md
index bb741c39c08..089e8881d7d 100644
--- a/doc/administration/reference_architectures/index.md
+++ b/doc/administration/reference_architectures/index.md
@@ -157,7 +157,7 @@ table.test-coverage th {
</tr>
<tr>
<th scope="row">1k</th>
- <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/1k">Daily</a> (to be moved to Weekly)</td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/1k">Weekly</a></td>
<td></td>
<td></td>
<td></td>
@@ -165,7 +165,7 @@ table.test-coverage th {
</tr>
<tr>
<th scope="row">2k</th>
- <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k">Daily</a> (to be moved to Weekly)</td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k">Weekly</a></td>
<td></td>
<td></td>
<td></td>
@@ -176,7 +176,7 @@ table.test-coverage th {
<td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k">Weekly</a></td>
<td></td>
<td></td>
- <td></td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k_hybrid_aws_services">Weekly</a></td>
<td></td>
</tr>
<tr>
@@ -190,9 +190,9 @@ table.test-coverage th {
<tr>
<th scope="row">10k</th>
<td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k">Daily</a></td>
- <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Past-Results/10k-Cloud-Native-Hybrid">Ad-Hoc</a></td>
- <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Past-Results/10k">Ad-Hoc (inc Cloud Services)</a></td>
- <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Past-Results/10k-Cloud-Native-Hybrid">Ad-Hoc</a></td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k_hybrid">Weekly</a></td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k_aws">Weekly</a></td>
+ <td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k_hybrid_aws_services">Weekly</a></td>
<td><a href="https://gitlab.com/gitlab-org/quality/performance/-/wikis/Past-Results/10k">Ad-Hoc</a></td>
</tr>
<tr>
@@ -215,6 +215,8 @@ table.test-coverage th {
## Cost to run
+The following table details the cost to run the different reference architectures across GCP, AWS, and Azure. Bare-metal costs are not included here as it varies widely depending on each customer configuration.
+
<table class="test-coverage">
<col>
<colgroup span="2"></colgroup>
@@ -356,7 +358,7 @@ Additionally, the following cloud provider services are validated and supported
<tr>
<td>Redis</td>
<td></td>
- <td>✅ &nbsp; <a href="https://aws.amazon.com/elasticache/" target="_blank" rel="noopener noreferrer">Elasticache</a></td>
+ <td>✅ &nbsp; <a href="https://aws.amazon.com/elasticache/" target="_blank" rel="noopener noreferrer">ElastiCache</a></td>
<td></td>
</tr>
</tbody>
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index f33d494f638..1a593c8c6bd 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -75,7 +75,7 @@ translate between the human-readable project name and the hashed storage path. Y
Administrators can look up a project's hashed path from its name or ID using:
-- The [Admin area](../user/admin_area/index.md#administering-projects).
+- The [Admin Area](../user/admin_area/index.md#administering-projects).
- A Rails console.
To look up a project's hash path in the Admin Area:
@@ -154,6 +154,20 @@ WARNING:
Do not run `git prune` or `git gc` in object pool repositories, which are stored in the `@pools` directory.
This can cause data loss in the regular repositories that depend on the object pool.
+### Group wiki storage
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13195) in GitLab 13.5.
+
+Unlike project wikis that are stored in the `@hashed` directory, group wikis are stored in a directory called `@groups`.
+Like project wikis, group wikis follow the hashed storage folder convention, but use a hash of the group ID rather than the project ID.
+
+For example:
+
+```ruby
+# group wiki paths
+"@groups/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
+```
+
### Object storage support
This table shows which storable objects are storable in each storage type:
diff --git a/doc/administration/sidekiq.md b/doc/administration/sidekiq.md
index b6c1c6a704e..d9031e2221b 100644
--- a/doc/administration/sidekiq.md
+++ b/doc/administration/sidekiq.md
@@ -20,21 +20,13 @@ To configure Sidekiq:
1. Edit `/etc/gitlab/gitlab.rb` with the following information and make sure
to replace with your values:
- ```ruby
- ##
- ## To maintain uniformity of links across nodes, the
- ##`external_url` on the Sidekiq server should point to the external URL that users
- ## use to access GitLab. This can be either:
- ##
- ## - The `external_url` set on your application server.
- ## - The URL of a external load balancer, which routes traffic to the GitLab application server.
- ##
-
- external_url 'https://gitlab.example.com'
-
- ## Prevent database migrations from running on upgrade automatically
- gitlab_rails['auto_migrate'] = false
+<!--
+Updates to example must be made at:
+- https://gitlab.com/gitlab-org/gitlab/blob/master/doc/administration/sidekiq.md
+- all reference architecture pages
+-->
+ ```ruby
########################################
##### Services Disabled ###
########################################
@@ -45,32 +37,27 @@ To configure Sidekiq:
# Enable only the services you want to run on each
# specific server, while disabling all others.
#
- nginx['enable'] = false
- grafana['enable'] = false
- prometheus['enable'] = false
- gitlab_rails['auto_migrate'] = false
- alertmanager['enable'] = false
gitaly['enable'] = false
- gitlab_workhorse['enable'] = false
- nginx['enable'] = false
- postgres_exporter['enable'] = false
postgresql['enable'] = false
redis['enable'] = false
- redis_exporter['enable'] = false
+ nginx['enable'] = false
puma['enable'] = false
+ gitlab_workhorse['enable'] = false
+ prometheus['enable'] = false
+ alertmanager['enable'] = false
+ grafana['enable'] = false
gitlab_exporter['enable'] = false
+ gitlab_kas['enable'] = false
- #######################################
- ### Sidekiq configuration ###
- #######################################
- sidekiq['enable'] = true
- sidekiq['listen_address'] = "0.0.0.0"
-
- ## Set number of Sidekiq queue processes to the same number as available CPUs
- sidekiq['queue_groups'] = ['*'] * 4
-
- ## Set number of Sidekiq threads per queue process to the recommend number of 10
- sidekiq['max_concurrency'] = 10
+ ##
+ ## To maintain uniformity of links across nodes, the
+ ## `external_url` on the Sidekiq server should point to the external URL that users
+ ## use to access GitLab. This can be either:
+ ##
+ ## - The `external_url` set on your application server.
+ ## - The URL of a external load balancer, which routes traffic to the GitLab application server.
+ ##
+ external_url 'https://gitlab.example.com'
########################################
#### Redis ###
@@ -89,9 +76,11 @@ To configure Sidekiq:
## Replace <gitaly_token> with the one you set up, see
## https://docs.gitlab.com/ee/administration/gitaly/configure_gitaly.html#about-the-gitaly-token
git_data_dirs({
- 'default' => { 'gitaly_address' => 'tcp://gitaly:8075' },
+ "default" => {
+ "gitaly_address" => "tcp://gitaly:8075",
+ "gitaly_token" => "<gitaly_token>"
+ }
})
- gitlab_rails['gitaly_token'] = '<gitaly_token>'
#######################################
### Postgres ###
@@ -99,16 +88,28 @@ To configure Sidekiq:
# Replace <database_host> and <database_password>
gitlab_rails['db_host'] = '<database_host>'
- gitlab_rails['db_password'] = '<database_password>'
gitlab_rails['db_port'] = '5432'
- gitlab_rails['db_adapter'] = 'postgresql'
- gitlab_rails['db_encoding'] = 'unicode'
- gitlab_rails['auto_migrate'] = false
+ 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
+
+ #######################################
+ ### Sidekiq configuration ###
+ #######################################
+ sidekiq['enable'] = true
+ sidekiq['listen_address'] = "0.0.0.0"
+
+ ## Set number of Sidekiq queue processes to the same number as available CPUs
+ sidekiq['queue_groups'] = ['*'] * 4
+
+ ## Set number of Sidekiq threads per queue process to the recommend number of 10
+ sidekiq['max_concurrency'] = 10
```
1. Reconfigure GitLab:
@@ -192,12 +193,8 @@ To configure the metrics server:
## Configure health checks
-If you use health check probes to observe Sidekiq,
-you can set a separate port for health checks.
-Configuring health checks is only necessary if there is something that actually probes them.
-For more information about health checks, see the [Sidekiq health check page](sidekiq_health_check.md).
-
-To enable health checks for Sidekiq:
+If you use health check probes to observe Sidekiq, enable the Sidekiq health check server.
+To make health checks available from `localhost:8092`:
1. Edit `/etc/gitlab/gitlab.rb`:
@@ -207,16 +204,14 @@ To enable health checks for Sidekiq:
sidekiq['health_checks_listen_port'] = "8092"
```
- NOTE:
- If health check settings are not set, they default to the metrics exporter settings.
- This default is deprecated and is set to be removed in [GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/347509).
-
1. Reconfigure GitLab:
```shell
sudo gitlab-ctl reconfigure
```
+For more information about health checks, see the [Sidekiq health check page](sidekiq_health_check.md).
+
## Configure LDAP and user or group synchronization
If you use LDAP for user and group management, you must add the LDAP configuration to your Sidekiq node as well as the LDAP
diff --git a/doc/administration/sidekiq_health_check.md b/doc/administration/sidekiq_health_check.md
index ae02711f46f..3ff17d3682b 100644
--- a/doc/administration/sidekiq_health_check.md
+++ b/doc/administration/sidekiq_health_check.md
@@ -21,8 +21,7 @@ The readiness probe checks whether the Sidekiq workers are ready to process jobs
GET /readiness
```
-If you set Sidekiq's address as `localhost` and port as `8092`,
-here's an example request:
+If the server is bound to `localhost:8092`, the process cluster can be probed for readiness as follows:
```shell
curl "http://localhost:8092/readiness"
@@ -44,8 +43,7 @@ Checks whether the Sidekiq cluster is running.
GET /liveness
```
-If you set Sidekiq's address as `localhost` and port as `8092`,
-here's an example request:
+If the server is bound to `localhost:8092`, the process cluster can be probed for liveness as follows:
```shell
curl "http://localhost:8092/liveness"
diff --git a/doc/administration/terraform_state.md b/doc/administration/terraform_state.md
index 5e8f7cb18bb..14649b82ba8 100644
--- a/doc/administration/terraform_state.md
+++ b/doc/administration/terraform_state.md
@@ -18,7 +18,7 @@ The storage location of these files defaults to:
These locations can be configured using the options described below.
-Use [external object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-pseudonymizer-terraform-state-dependency-proxy) configuration for [GitLab Helm chart](https://docs.gitlab.com/charts/) installations.
+Use [external object storage](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-terraform-state-dependency-proxy) configuration for [GitLab Helm chart](https://docs.gitlab.com/charts/) installations.
## Disabling Terraform state
@@ -144,7 +144,7 @@ You can optionally track progress and verify that all packages migrated successf
Verify `objectstg` below (where `file_store=2`) has count of all states:
```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 terraform_states;
+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 terraform_state_versions;
total | filesystem | objectstg
------+------------+-----------
@@ -154,7 +154,7 @@ total | filesystem | objectstg
Verify that there are no files on disk in the `terraform_state` folder:
```shell
-sudo find /var/opt/gitlab/gitlab-rails/shared/terraform_state -type f | wc -l
+sudo find /var/opt/gitlab/gitlab-rails/shared/terraform_state -type f | grep -v tmp | wc -l
```
### S3-compatible connection settings
diff --git a/doc/administration/troubleshooting/diagnostics_tools.md b/doc/administration/troubleshooting/diagnostics_tools.md
index d510df5976c..479fdb963cb 100644
--- a/doc/administration/troubleshooting/diagnostics_tools.md
+++ b/doc/administration/troubleshooting/diagnostics_tools.md
@@ -26,4 +26,4 @@ and summarize raw `strace` data.
## kubesos
-The [`kubesos`](https://gitlab.com/gitlab-com/support/toolbox/kubesos/) utiltity retrieves GitLab cluster configuration and logs from GitLab Cloud Native chart deployments.
+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/elasticsearch.md b/doc/administration/troubleshooting/elasticsearch.md
index c45938ecd3f..97e625eb0a3 100644
--- a/doc/administration/troubleshooting/elasticsearch.md
+++ b/doc/administration/troubleshooting/elasticsearch.md
@@ -289,7 +289,7 @@ If the issue is:
Go indexer was a beta indexer which can be optionally turned on/off, but in 12.3 it reached stable status and is now the default.
- Not concerning the Go indexer, it is almost always an
Elasticsearch-side issue. This means you should reach out to your Elasticsearch administrator
- regarding the error(s) you are seeing. If you are unsure here, it never hurts to reach
+ regarding the errors you are seeing. If you are unsure here, it never hurts to reach
out to GitLab support.
Beyond that, review the error. If it is:
diff --git a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
index 54d934c8986..34481582d8b 100644
--- a/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
+++ b/doc/administration/troubleshooting/gitlab_rails_cheat_sheet.md
@@ -83,7 +83,7 @@ Notify.test_email(u.email, "Test email for #{u.name}", 'Test email').deliver_now
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:
```ruby
-puts ActiveRecord::Base.descendants; :ok
+puts ActiveRecord::Base.descendants; :ok
Project.select(&:pages_deployed?).each {|p| puts p.pages_url }; true
```
@@ -753,6 +753,21 @@ group.members_with_parents.count
parent.members_with_descendants.count
```
+### Find groups that are pending deletion
+
+```ruby
+#
+# This section lists all the groups which are pending deletion
+#
+Group.all.each do |g|
+ if g.marked_for_deletion?
+ puts "Group ID: #{g.id}"
+ puts "Group name: #{g.name}"
+ puts "Group path: #{g.full_path}"
+ end
+end
+```
+
### Delete a group
```ruby
@@ -798,6 +813,39 @@ To find features that can be toggled, run `pp p.project_feature`.
Available permission levels are listed in
[concerns/featurable.rb](https://gitlab.com/gitlab-org/gitlab/blob/master/app/models/concerns/featurable.rb).
+### Get all error messages associated with groups, subgroups, members, and requesters
+
+Collect error messages associated with groups, subgroups, members, and requesters. This
+captures error messages that may not appear in the Web interface. This can be especially helpful
+for troubleshooting issues with [LDAP group sync](../auth/ldap/ldap_synchronization.md#group-sync)
+and unexpected behavior with users and their membership in groups and subgroups.
+
+```ruby
+# Find the group and subgroup
+group = Group.find_by_full_path("parent_group")
+subgroup = Group.find_by_full_path("parent_group/child_group")
+
+# Group and subgroup errors
+group.valid?
+group.errors.map(&:full_messages)
+
+subgroup.valid?
+subgroup.errors.map(&:full_messages)
+
+# Group and subgroup errors for the members AND requesters
+group.requesters.map(&:valid?)
+group.requesters.map(&:errors).map(&:full_messages)
+group.members.map(&:valid?)
+group.members.map(&:errors).map(&:full_messages)
+group.members_and_requesters.map(&:errors).map(&:full_messages)
+
+subgroup.requesters.map(&:valid?)
+subgroup.requesters.map(&:errors).map(&:full_messages)
+subgroup.members.map(&:valid?)
+subgroup.members.map(&:errors).map(&:full_messages)
+subgroup.members_and_requesters.map(&:errors).map(&:full_messages)
+```
+
## Authentication
### Re-enable standard web sign-in form
@@ -1191,12 +1239,6 @@ This content has been converted to a Rake task, see [verify database values can
Geo::JobArtifactRegistry.failed
```
-#### Download artifact
-
-```ruby
-Gitlab::Geo::JobArtifactDownloader.new(:job_artifact, <artifact_id>).execute
-```
-
#### Get a count of the synced artifacts
```ruby
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png
index bc11e18fb6f..e002503ddc0 100644
--- a/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-basic-SAML_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png
index 78bb1725e9c..2b827e122a8 100644
--- a/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-claims_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png b/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png
index e665e23058c..8d6c5010670 100644
--- a/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png
+++ b/doc/administration/troubleshooting/img/GoogleWorkspace-linkscert_v14_10.png
Binary files differ
diff --git a/doc/administration/troubleshooting/index.md b/doc/administration/troubleshooting/index.md
index 75c5ce460e9..bc9c39d57ea 100644
--- a/doc/administration/troubleshooting/index.md
+++ b/doc/administration/troubleshooting/index.md
@@ -14,6 +14,7 @@ installation.
- [SSL](ssl.md)
- [Geo](../geo/replication/troubleshooting.md)
- [Elasticsearch](elasticsearch.md)
+- [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)
diff --git a/doc/administration/troubleshooting/log_parsing.md b/doc/administration/troubleshooting/log_parsing.md
index c5b1d302db2..9aa490f73ef 100644
--- a/doc/administration/troubleshooting/log_parsing.md
+++ b/doc/administration/troubleshooting/log_parsing.md
@@ -12,7 +12,7 @@ but if they are not available you can still quickly parse
(the default in GitLab 12.0 and later) using [`jq`](https://stedolan.github.io/jq/).
NOTE:
-Spefically for summarising error events and basic usage statistics,
+Specifically for summarizing error events and basic usage statistics,
the GitLab Support Team provides the specialised
[`fast-stats` tool](https://gitlab.com/gitlab-com/support/toolbox/fast-stats/#when-to-use-it).
@@ -81,7 +81,7 @@ jq 'select(.status >= 500)' <FILE>
#### Top 10 slowest requests
```shell
-jq -s 'sort_by(-.duration) | limit(10; .[])' <FILE>
+jq -s 'sort_by(-.duration_s) | limit(10; .[])' <FILE>
```
#### Find and pretty print all requests related to a project
@@ -93,7 +93,7 @@ grep <PROJECT_NAME> <FILE> | jq .
#### Find all requests with a total duration > 5 seconds
```shell
-jq 'select(.duration > 5000)' <FILE>
+jq 'select(.duration_s > 5000)' <FILE>
```
#### Find all project requests with more than 5 rugged calls
@@ -105,13 +105,13 @@ grep <PROJECT_NAME> <FILE> | jq 'select(.rugged_calls > 5)'
#### Find all requests with a Gitaly duration > 10 seconds
```shell
-jq 'select(.gitaly_duration > 10000)' <FILE>
+jq 'select(.gitaly_duration_s > 10000)' <FILE>
```
#### Find all requests with a queue duration > 10 seconds
```shell
-jq 'select(.queue_duration > 10000)' <FILE>
+jq 'select(.queue_duration_s > 10000)' <FILE>
```
#### Top 10 requests by # of Gitaly calls
@@ -125,7 +125,7 @@ jq -s 'map(select(.gitaly_calls != null)) | sort_by(-.gitaly_calls) | limit(10;
#### Print the top three controller methods by request volume and their three longest durations
```shell
-jq -s -r 'group_by(.controller+.action) | sort_by(-length) | limit(3; .[]) | sort_by(-.duration) | "CT: \(length)\tMETHOD: \(.[0].controller)#\(.[0].action)\tDURS: \(.[0].duration), \(.[1].duration), \(.[2].duration)"' production_json.log
+jq -s -r 'group_by(.controller+.action) | sort_by(-length) | limit(3; .[]) | sort_by(-.duration_s) | "CT: \(length)\tMETHOD: \(.[0].controller)#\(.[0].action)\tDURS: \(.[0].duration_s), \(.[1].duration_s), \(.[2].duration_s)"' production_json.log
```
**Example output**
@@ -141,7 +141,7 @@ CT: 1328 METHOD: Projects::NotesController#index DURS: 403.99, 386.29, 384.3
#### Print top three routes with request count and their three longest durations
```shell
-jq -s -r 'group_by(.route) | sort_by(-length) | limit(3; .[]) | sort_by(-.duration) | "CT: \(length)\tROUTE: \(.[0].route)\tDURS: \(.[0].duration), \(.[1].duration), \(.[2].duration)"' api_json.log
+jq -s -r 'group_by(.route) | sort_by(-length) | limit(3; .[]) | sort_by(-.duration_s) | "CT: \(length)\tROUTE: \(.[0].route)\tDURS: \(.[0].duration_s), \(.[1].duration_s), \(.[2].duration_s)"' api_json.log
```
**Example output**
diff --git a/doc/administration/troubleshooting/sidekiq.md b/doc/administration/troubleshooting/sidekiq.md
index 62ea3bcfa3c..7a64bcc9b87 100644
--- a/doc/administration/troubleshooting/sidekiq.md
+++ b/doc/administration/troubleshooting/sidekiq.md
@@ -315,7 +315,7 @@ queue.each { |job| job.delete if <condition>}
Have a look at the section below for cancelling running jobs.
-In the method above, `<queue-name>` is the name of the queue that contains the job(s) you want to delete and `<condition>` decides which jobs get deleted.
+In the method above, `<queue-name>` is the name of the queue that contains the jobs you want to delete and `<condition>` decides which jobs get deleted.
Commonly, `<condition>` references the job arguments, which depend on the type of job in question. To find the arguments for a specific queue, you can have a look at the `perform` function of the related worker file, commonly found at `/app/workers/<queue-name>_worker.rb`.
diff --git a/doc/administration/troubleshooting/test_environments.md b/doc/administration/troubleshooting/test_environments.md
index 5fe493a536c..0821f952d61 100644
--- a/doc/administration/troubleshooting/test_environments.md
+++ b/doc/administration/troubleshooting/test_environments.md
@@ -52,6 +52,8 @@ gitlab/gitlab-ee:11.5.3-ee.0
#### SAML for Authentication
+In the following examples, when replacing `<GITLAB_IP_OR_DOMAIN>` and `<SAML_IP_OR_DOMAIN>` it is important to prepend your IP or domain name, with the protocol (`http://` or `https://`) being used.
+
We can use the [`test-saml-idp` Docker image](https://hub.docker.com/r/jamedjo/test-saml-idp)
to do the work for us:
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index aba7b5fc318..d66aa5945b6 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -67,8 +67,6 @@ For source installations the following settings are nested under `uploads:` and
|---------|-------------|---------|
| `enabled` | Enable/disable object storage | `false` |
| `remote_directory` | The bucket name where Uploads will be stored| |
-| `direct_upload` | Set to `true` to remove Puma from the Upload path. Workhorse handles the actual Artifact Upload to Object Storage while Puma does minimal processing to keep track of the upload. There is no need for local shared storage. The option may be removed if support for a single storage type for all files is introduced. Read more on [direct upload](../development/uploads/implementation.md#direct-upload). | `false` |
-| `background_upload` | Set to `false` to disable automatic upload. Option may be removed once upload is direct to S3 (if `direct_upload` is set to `true` it will override `background_upload`) | `true` |
| `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 | |
@@ -130,60 +128,3 @@ _The uploads are stored by default in
1. Save the file and [restart GitLab](restart_gitlab.md#installations-from-source) for the changes to take effect.
1. Migrate any existing local uploads to the object storage using [`gitlab:uploads:migrate:all` Rake task](raketasks/uploads/migrate.md).
-
-#### OpenStack example
-
-**In Omnibus installations:**
-
-_The uploads are stored by default in
-`/var/opt/gitlab/gitlab-rails/uploads`._
-
-1. Edit `/etc/gitlab/gitlab.rb` and add the following lines by replacing with
- the values you want:
-
- ```ruby
- gitlab_rails['uploads_object_store_remote_directory'] = "OPENSTACK_OBJECT_CONTAINER_NAME"
- gitlab_rails['uploads_object_store_connection'] = {
- 'provider' => 'OpenStack',
- 'openstack_username' => 'OPENSTACK_USERNAME',
- 'openstack_api_key' => 'OPENSTACK_PASSWORD',
- 'openstack_temp_url_key' => 'OPENSTACK_TEMP_URL_KEY',
- 'openstack_auth_url' => 'https://auth.cloud.ovh.net/v2.0/',
- 'openstack_region' => 'DE1',
- 'openstack_tenant' => 'TENANT_ID',
- }
- ```
-
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. Migrate any existing local uploads to the object storage using [`gitlab:uploads:migrate:all` Rake task](raketasks/uploads/migrate.md).
-
----
-
-**In installations from source:**
-
-_The uploads are stored by default in
-`/home/git/gitlab/public/uploads`._
-
-1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following
- lines:
-
- ```yaml
- uploads:
- object_store:
- enabled: true
- direct_upload: false
- background_upload: true
- proxy_download: false
- remote_directory: OPENSTACK_OBJECT_CONTAINER_NAME
- connection:
- provider: OpenStack
- openstack_username: OPENSTACK_USERNAME
- openstack_api_key: OPENSTACK_PASSWORD
- openstack_temp_url_key: OPENSTACK_TEMP_URL_KEY
- openstack_auth_url: 'https://auth.cloud.ovh.net/v2.0/'
- openstack_region: DE1
- openstack_tenant: 'TENANT_ID'
- ```
-
-1. Save the file and [reconfigure GitLab](restart_gitlab.md#omnibus-gitlab-reconfigure) for the changes to take effect.
-1. Migrate any existing local uploads to the object storage using [`gitlab:uploads:migrate:all` Rake task](raketasks/uploads/migrate.md).
diff --git a/doc/api/api_resources.md b/doc/api/api_resources.md
index f6d1e554aae..9408e7c25a6 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](resource_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` |
@@ -70,7 +70,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/templates` |
+| [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/cluster_agents.md b/doc/api/cluster_agents.md
index 37cc4a24342..1c2a3b52761 100644
--- a/doc/api/cluster_agents.md
+++ b/doc/api/cluster_agents.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Agents API **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83270) in GitLab 14.10.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83270) in GitLab 14.10.
+> - Agent Tokens API [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
Use the Agents API to work with the GitLab agent for Kubernetes.
@@ -236,3 +237,216 @@ Example request:
```shell
curl --request DELETE --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/1
```
+
+## List tokens for an agent
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
+
+Returns a list of tokens for an agent.
+
+You must have at least the Developer role to use this endpoint.
+
+```plaintext
+GET /projects/:id/cluster_agents/:agent_id/tokens
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|------------|-------------------|-----------|------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `agent_id` | integer or string | yes | ID of the agent. |
+
+Response:
+
+The response is a list of tokens with the following fields:
+
+| Attribute | Type | Description |
+|----------------------|----------------|-------------------------------------------------------------------|
+| `id` | integer | ID of the token. |
+| `name` | string | Name of the token. |
+| `description` | string or null | Description of the token. |
+| `agent_id` | integer | ID of the agent the token belongs to. |
+| `status` | string | The status of the token. Valid values are `active` and `revoked`. |
+| `created_at` | string | ISO8601 datetime when the token was created. |
+| `created_by_user_id` | string | User ID of the user who created the token. |
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/5/tokens"
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "name": "abcd",
+ "description": "Some token",
+ "agent_id": 5,
+ "status": "active",
+ "created_at": "2022-03-25T14:12:11.497Z",
+ "created_by_user_id": 1
+ },
+ {
+ "id": 2,
+ "name": "foobar",
+ "description": null,
+ "agent_id": 5,
+ "status": "active",
+ "created_at": "2022-03-25T14:12:11.497Z",
+ "created_by_user_id": 1
+ }
+]
+```
+
+NOTE:
+The `last_used_at` field for a token is only returned when getting a single agent token.
+
+## Get a single agent token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
+
+Gets a single agent token.
+
+You must have at least the Developer role to use this endpoint.
+
+```shell
+GET /projects/:id/cluster_agents/:agent_id/tokens/:token_id
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|------------|-------------------|----------|-------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `agent_id` | integer | yes | ID of the agent. |
+| `token_id` | integer | yes | ID of the token. |
+
+Response:
+
+The response is a single token with the following fields:
+
+| Attribute | Type | Description |
+|----------------------|----------------|-------------------------------------------------------------------|
+| `id` | integer | ID of the token. |
+| `name` | string | Name of the token. |
+| `description` | string or null | Description of the token. |
+| `agent_id` | integer | ID of the agent the token belongs to. |
+| `status` | string | The status of the token. Valid values are `active` and `revoked`. |
+| `created_at` | string | ISO8601 datetime when the token was created. |
+| `created_by_user_id` | string | User ID of the user who created the token. |
+| `last_used_at` | string or null | ISO8601 datetime when the token was last used. |
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/5/token/1"
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "name": "abcd",
+ "description": "Some token",
+ "agent_id": 5,
+ "status": "active",
+ "created_at": "2022-03-25T14:12:11.497Z",
+ "created_by_user_id": 1,
+ "last_used_at": null
+}
+```
+
+## Create an agent token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
+
+Creates a new token for an agent.
+
+You must have at least the Maintainer role to use this endpoint.
+
+```shell
+POST /projects/:id/cluster_agents/:agent_id/tokens
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|---------------|-------------------|----------|------------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `agent_id` | integer | yes | ID of the agent. |
+| `name` | string | yes | Name for the token. |
+| `description` | string | no | Description for the token. |
+
+Response:
+
+The response is the new token with the following fields:
+
+| Attribute | Type | Description |
+|----------------------|----------------|-------------------------------------------------------------------|
+| `id` | integer | ID of the token. |
+| `name` | string | Name of the token. |
+| `description` | string or null | Description of the token. |
+| `agent_id` | integer | ID of the agent the token belongs to. |
+| `status` | string | The status of the token. Valid values are `active` and `revoked`. |
+| `created_at` | string | ISO8601 datetime when the token was created. |
+| `created_by_user_id` | string | User ID of the user who created the token. |
+| `last_used_at` | string or null | ISO8601 datetime when the token was last used. |
+| `token` | string | The secret token value. |
+
+NOTE:
+The `token` is only returned in the response of the `POST` endpoint and cannot be retrieved afterwards.
+
+Example request:
+
+```shell
+curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/5/tokens" \
+ -H "Content-Type:application/json" \
+ -X POST --data '{"name":"some-token"}'
+```
+
+Example response:
+
+```json
+{
+ "id": 1,
+ "name": "abcd",
+ "description": "Some token",
+ "agent_id": 5,
+ "status": "active",
+ "created_at": "2022-03-25T14:12:11.497Z",
+ "created_by_user_id": 1,
+ "last_used_at": null,
+ "token": "qeY8UVRisx9y3Loxo1scLxFuRxYcgeX3sxsdrpP_fR3Loq4xyg"
+}
+```
+
+## Revoke an agent token
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347046) in GitLab 15.0.
+
+Revokes an agent token.
+
+You must have at least the Maintainer role to use this endpoint.
+
+```plaintext
+DELETE /projects/:id/cluster_agents/:agent_id/tokens/:token_id
+```
+
+Supported attributes:
+
+| Attribute | Type | Required | Description |
+|------------|-------------------|----------|---------------------------------------------------------------------------------------------------------------- -|
+| `id` | integer or string | yes | ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) maintained by the authenticated user. |
+| `agent_id` | integer | yes | ID of the agent. |
+| `token_id` | integer | yes | ID of the token. |
+
+Example request:
+
+```shell
+curl --request DELETE --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/20/cluster_agents/5/tokens/1
+```
diff --git a/doc/api/container_registry.md b/doc/api/container_registry.md
index eb5a124c40c..0dd2106b4d1 100644
--- a/doc/api/container_registry.md
+++ b/doc/api/container_registry.md
@@ -127,6 +127,8 @@ Example response:
### Within a group
+> [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/336912) the `tags` and `tag_count` attributes in GitLab 15.0.
+
Get a list of registry repositories in a group.
```plaintext
@@ -136,12 +138,10 @@ GET /groups/:id/registry/repositories
| Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) accessible by the authenticated user. |
-| `tags` | boolean | no | If the parameter is included as true, each repository includes an array of `"tags"` in the response. |
-| `tags_count` | boolean | no | If the parameter is included as true, each repository includes `"tags_count"` in the response ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32141) in GitLab 13.1). |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" \
- "https://gitlab.example.com/api/v4/groups/2/registry/repositories?tags=1&tags_count=true"
+ "https://gitlab.example.com/api/v4/groups/2/registry/repositories"
```
Example response:
@@ -156,14 +156,6 @@ Example response:
"location": "gitlab.example.com:5000/group/project",
"created_at": "2019-01-10T13:38:57.391Z",
"cleanup_policy_started_at": "2020-08-17T03:12:35.489Z",
- "tags_count": 1,
- "tags": [
- {
- "name": "0.0.1",
- "path": "group/project:0.0.1",
- "location": "gitlab.example.com:5000/group/project:0.0.1"
- }
- ]
},
{
"id": 2,
@@ -173,24 +165,6 @@ Example response:
"location": "gitlab.example.com:5000/group/other_project",
"created_at": "2019-01-10T13:39:08.229Z",
"cleanup_policy_started_at": "2020-01-10T15:40:57.391Z",
- "tags_count": 3,
- "tags": [
- {
- "name": "0.0.1",
- "path": "group/other_project:0.0.1",
- "location": "gitlab.example.com:5000/group/other_project:0.0.1"
- },
- {
- "name": "0.0.2",
- "path": "group/other_project:0.0.2",
- "location": "gitlab.example.com:5000/group/other_project:0.0.2"
- },
- {
- "name": "latest",
- "path": "group/other_project:latest",
- "location": "gitlab.example.com:5000/group/other_project:latest"
- }
- ]
}
]
```
@@ -446,7 +420,7 @@ These are different from project or personal access tokens in the GitLab applica
GET /v2/_catalog
```
-To list all container repositories on your GitLab instance, admin credentials are required:
+To list all container repositories on your GitLab instance, administrator credentials are required:
```shell
$ curl --request GET --user "<admin-username>:<admin-password>" "https://gitlab.example.com/jwt/auth?service=container_registry&scope=registry:catalog:*"
diff --git a/doc/api/dora4_project_analytics.md b/doc/api/dora4_project_analytics.md
index c202b075c42..53170c3a77f 100644
--- a/doc/api/dora4_project_analytics.md
+++ b/doc/api/dora4_project_analytics.md
@@ -10,7 +10,7 @@ type: reference, api
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/279039) in GitLab 13.7.
WARNING:
-These endpoints are deprecated and will be removed in GitLab 14.0. Use the [DORA metrics API](dora/metrics.md) instead.
+These endpoints have been removed in GitLab 14.0. Use the [DORA metrics API](dora/metrics.md) instead.
All methods require reporter authorization.
diff --git a/doc/api/environments.md b/doc/api/environments.md
index 40d161485ff..bfc097d44ee 100644
--- a/doc/api/environments.md
+++ b/doc/api/environments.md
@@ -36,6 +36,7 @@ Example response:
"slug": "review-fix-foo-dfjre3",
"external_url": "https://review-fix-foo-dfjre3.gitlab.example.com",
"state": "available",
+ "tier": "development",
"created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z",
"enable_advanced_logs_querying": false,
@@ -147,6 +148,7 @@ Example of response
"slug": "review-fix-foo-dfjre3",
"external_url": "https://review-fix-foo-dfjre3.gitlab.example.com",
"state": "available",
+ "tier": "development",
"created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z",
"enable_advanced_logs_querying": false,
@@ -249,6 +251,7 @@ POST /projects/:id/environments
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the environment |
| `external_url` | string | no | Place to link to for this environment |
+| `tier` | string | no | The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other` |
```shell
curl --data "name=deploy&external_url=https://deploy.gitlab.example.com" \
@@ -264,6 +267,7 @@ Example response:
"slug": "deploy",
"external_url": "https://deploy.gitlab.example.com",
"state": "available",
+ "tier": "production",
"created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z"
}
@@ -285,6 +289,7 @@ PUT /projects/:id/environments/:environments_id
| `environment_id` | integer | yes | The ID of the environment |
| `name` | string | no | [Deprecated and will be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/338897) |
| `external_url` | string | no | The new `external_url` |
+| `tier` | string | no | The tier of the new environment. Allowed values are `production`, `staging`, `testing`, `development`, and `other` |
```shell
curl --request PUT --data "name=staging&external_url=https://staging.gitlab.example.com" \
@@ -300,6 +305,7 @@ Example response:
"slug": "staging",
"external_url": "https://staging.gitlab.example.com",
"state": "available",
+ "tier": "staging",
"created_at": "2019-05-25T18:55:13.252Z",
"updated_at": "2019-05-27T18:55:13.252Z"
}
diff --git a/doc/api/features.md b/doc/api/features.md
index 0ad76829651..346f4879358 100644
--- a/doc/api/features.md
+++ b/doc/api/features.md
@@ -129,11 +129,12 @@ POST /features/:name
| `feature_group` | string | no | A Feature group name |
| `user` | string | no | A GitLab username |
| `group` | string | no | A GitLab group's path, for example `gitlab-org` |
+| `namespace` | string | no | A GitLab group or user namespace's path, for example `gitlab-org` or username path. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353117) in GitLab 15.0. |
| `project` | string | no | A projects path, for example `gitlab-org/gitlab-foss` |
| `force` | boolean | no | Skip feature flag validation checks, such as a YAML definition |
You can enable or disable a feature for a `feature_group`, a `user`,
-a `group`, and a `project` in a single API call.
+a `group`, a `namespace` and a `project` in a single API call.
```shell
curl --data "value=30" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/features/new_library"
diff --git a/doc/api/graphql/index.md b/doc/api/graphql/index.md
index 457b083c217..2ad29e8cb45 100644
--- a/doc/api/graphql/index.md
+++ b/doc/api/graphql/index.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# GraphQL API **(FREE)**
-> [Generally available](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30444) in GitLab 12.1. [Feature flag `graphql`](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30444) removed.
+> Enabled and [made generally available](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30444) in GitLab 12.1. [Feature flag `graphql`](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30444) removed.
[GraphQL](https://graphql.org/) is a query language for APIs. You can use it to
request the exact data you need, and therefore limit the number of requests you need.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 7ef9897a170..97ef81b8bfa 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -181,29 +181,6 @@ Fields related to Instance Security Dashboard.
Returns [`InstanceSecurityDashboard`](#instancesecuritydashboard).
-### `Query.instanceStatisticsMeasurements`
-
-Get statistics on the instance.
-
-WARNING:
-**Deprecated** in 13.10.
-This was renamed.
-Use: [`Query.usageTrendsMeasurements`](#queryusagetrendsmeasurements).
-
-Returns [`UsageTrendsMeasurementConnection`](#usagetrendsmeasurementconnection).
-
-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="queryinstancestatisticsmeasurementsidentifier"></a>`identifier` | [`MeasurementIdentifier!`](#measurementidentifier) | Type of measurement or statistics to retrieve. |
-| <a id="queryinstancestatisticsmeasurementsrecordedafter"></a>`recordedAfter` | [`Time`](#time) | Measurement recorded after this date. |
-| <a id="queryinstancestatisticsmeasurementsrecordedbefore"></a>`recordedBefore` | [`Time`](#time) | Measurement recorded before this date. |
-
### `Query.issue`
Find an issue.
@@ -624,6 +601,7 @@ Input type: `AdminSidekiqQueuesDeleteJobsInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="mutationadminsidekiqqueuesdeletejobsartifactsize"></a>`artifactSize` | [`String`](#string) | Delete jobs matching artifact_size in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobscallerid"></a>`callerId` | [`String`](#string) | Delete jobs matching caller_id in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsclientid"></a>`clientId` | [`String`](#string) | Delete jobs matching client_id in the context metadata. |
| <a id="mutationadminsidekiqqueuesdeletejobsclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
@@ -872,6 +850,11 @@ Input type: `BulkEnableDevopsAdoptionNamespacesInput`
### `Mutation.ciCdSettingsUpdate`
+WARNING:
+**Deprecated** in 15.0.
+This was renamed.
+Use: `ProjectCiCdSettingsUpdate`.
+
Input type: `CiCdSettingsUpdateInput`
#### Arguments
@@ -973,28 +956,6 @@ Input type: `ClusterAgentTokenCreateInput`
| <a id="mutationclusteragenttokencreatesecret"></a>`secret` | [`String`](#string) | Token secret value. Make sure you save it - you won't be able to access it again. |
| <a id="mutationclusteragenttokencreatetoken"></a>`token` | [`ClusterAgentToken`](#clusteragenttoken) | Token created after mutation. |
-### `Mutation.clusterAgentTokenDelete`
-
-WARNING:
-**Deprecated** in 14.7.
-Tokens must be revoked with ClusterAgentTokenRevoke.
-
-Input type: `ClusterAgentTokenDeleteInput`
-
-#### Arguments
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationclusteragenttokendeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationclusteragenttokendeleteid"></a>`id` | [`ClustersAgentTokenID!`](#clustersagenttokenid) | Global ID of the cluster agent token that will be deleted. |
-
-#### Fields
-
-| Name | Type | Description |
-| ---- | ---- | ----------- |
-| <a id="mutationclusteragenttokendeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationclusteragenttokendeleteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
-
### `Mutation.clusterAgentTokenRevoke`
Input type: `ClusterAgentTokenRevokeInput`
@@ -1372,7 +1333,7 @@ Input type: `CreateEpicInput`
| ---- | ---- | ----------- |
| <a id="mutationcreateepicaddlabelids"></a>`addLabelIds` | [`[ID!]`](#id) | IDs 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` | [`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="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. |
| <a id="mutationcreateepicdescription"></a>`description` | [`String`](#string) | Description of the epic. |
| <a id="mutationcreateepicduedatefixed"></a>`dueDateFixed` | [`String`](#string) | End date of the epic. |
@@ -1611,6 +1572,7 @@ Input type: `CustomerRelationsContactUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationscontactupdateactive"></a>`active` | [`Boolean`](#boolean) | State of the contact. |
| <a id="mutationcustomerrelationscontactupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcustomerrelationscontactupdatedescription"></a>`description` | [`String`](#string) | Description of or notes for the contact. |
| <a id="mutationcustomerrelationscontactupdateemail"></a>`email` | [`String`](#string) | Email address of the contact. |
@@ -1658,6 +1620,7 @@ Input type: `CustomerRelationsOrganizationUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="mutationcustomerrelationsorganizationupdateactive"></a>`active` | [`Boolean`](#boolean) | State of the organization. |
| <a id="mutationcustomerrelationsorganizationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationcustomerrelationsorganizationupdatedefaultrate"></a>`defaultRate` | [`Float`](#float) | Standard billing rate for the organization. |
| <a id="mutationcustomerrelationsorganizationupdatedescription"></a>`description` | [`String`](#string) | Description of or notes for the organization. |
@@ -2708,7 +2671,7 @@ Input type: `ExternalAuditEventDestinationUpdateInput`
| ---- | ---- | ----------- |
| <a id="mutationexternalauditeventdestinationupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationexternalauditeventdestinationupdatedestinationurl"></a>`destinationUrl` | [`String`](#string) | Destination URL to change. |
-| <a id="mutationexternalauditeventdestinationupdateid"></a>`id` | [`AuditEventsExternalAuditEventDestinationID!`](#auditeventsexternalauditeventdestinationid) | ID of external audit event destination to destroy. |
+| <a id="mutationexternalauditeventdestinationupdateid"></a>`id` | [`AuditEventsExternalAuditEventDestinationID!`](#auditeventsexternalauditeventdestinationid) | ID of external audit event destination to update. |
#### Fields
@@ -3151,12 +3114,12 @@ Input type: `IterationCadenceCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationiterationcadencecreateactive"></a>`active` | [`Boolean!`](#boolean) | Whether the iteration cadence is active. |
-| <a id="mutationiterationcadencecreateautomatic"></a>`automatic` | [`Boolean!`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| <a id="mutationiterationcadencecreateautomatic"></a>`automatic` | [`Boolean!`](#boolean) | Whether the iteration cadence should automatically generate upcoming iterations. |
| <a id="mutationiterationcadencecreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationiterationcadencecreatedescription"></a>`description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. |
| <a id="mutationiterationcadencecreatedurationinweeks"></a>`durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
| <a id="mutationiterationcadencecreategrouppath"></a>`groupPath` | [`ID!`](#id) | Group where the iteration cadence is created. |
-| <a id="mutationiterationcadencecreateiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. |
+| <a id="mutationiterationcadencecreateiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Upcoming iterations to be created when iteration cadence is set to automatic. |
| <a id="mutationiterationcadencecreaterollover"></a>`rollOver` | [`Boolean`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. |
| <a id="mutationiterationcadencecreatestartdate"></a>`startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. |
| <a id="mutationiterationcadencecreatetitle"></a>`title` | [`String`](#string) | Title of the iteration cadence. |
@@ -3197,12 +3160,12 @@ Input type: `IterationCadenceUpdateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationiterationcadenceupdateactive"></a>`active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. |
-| <a id="mutationiterationcadenceupdateautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| <a id="mutationiterationcadenceupdateautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate upcoming iterations. |
| <a id="mutationiterationcadenceupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationiterationcadenceupdatedescription"></a>`description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. |
| <a id="mutationiterationcadenceupdatedurationinweeks"></a>`durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
| <a id="mutationiterationcadenceupdateid"></a>`id` | [`IterationsCadenceID!`](#iterationscadenceid) | Global ID of the iteration cadence. |
-| <a id="mutationiterationcadenceupdateiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. |
+| <a id="mutationiterationcadenceupdateiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Upcoming iterations to be created when iteration cadence is set to automatic. |
| <a id="mutationiterationcadenceupdaterollover"></a>`rollOver` | [`Boolean`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. |
| <a id="mutationiterationcadenceupdatestartdate"></a>`startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. |
| <a id="mutationiterationcadenceupdatetitle"></a>`title` | [`String`](#string) | Title of the iteration cadence. |
@@ -3481,6 +3444,48 @@ Input type: `MergeRequestCreateInput`
| <a id="mutationmergerequestcreateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationmergerequestcreatemergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request after mutation. |
+### `Mutation.mergeRequestRemoveAttentionRequest`
+
+Input type: `MergeRequestRemoveAttentionRequestInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationmergerequestremoveattentionrequestclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationmergerequestremoveattentionrequestiid"></a>`iid` | [`String!`](#string) | IID of the merge request to mutate. |
+| <a id="mutationmergerequestremoveattentionrequestprojectpath"></a>`projectPath` | [`ID!`](#id) | Project the merge request to mutate is in. |
+| <a id="mutationmergerequestremoveattentionrequestuserid"></a>`userId` | [`UserID!`](#userid) | User ID of the user for attention request removal. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationmergerequestremoveattentionrequestclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationmergerequestremoveattentionrequesterrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationmergerequestremoveattentionrequestmergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request after mutation. |
+
+### `Mutation.mergeRequestRequestAttention`
+
+Input type: `MergeRequestRequestAttentionInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationmergerequestrequestattentionclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationmergerequestrequestattentioniid"></a>`iid` | [`String!`](#string) | IID of the merge request to mutate. |
+| <a id="mutationmergerequestrequestattentionprojectpath"></a>`projectPath` | [`ID!`](#id) | Project the merge request to mutate is in. |
+| <a id="mutationmergerequestrequestattentionuserid"></a>`userId` | [`UserID!`](#userid) | User ID of the user to request attention. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationmergerequestrequestattentionclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationmergerequestrequestattentionerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationmergerequestrequestattentionmergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request after mutation. |
+
### `Mutation.mergeRequestReviewerRereview`
Input type: `MergeRequestReviewerRereviewInput`
@@ -3632,8 +3637,6 @@ Input type: `MergeRequestSetSubscriptionInput`
### `Mutation.mergeRequestToggleAttentionRequested`
-Available only when feature flag `mr_attention_requests` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice.
-
Input type: `MergeRequestToggleAttentionRequestedInput`
#### Arguments
@@ -3679,6 +3682,26 @@ 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.namespaceCiCdSettingsUpdate`
+
+Input type: `NamespaceCiCdSettingsUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationnamespacecicdsettingsupdateallowstalerunnerpruning"></a>`allowStaleRunnerPruning` | [`Boolean`](#boolean) | Indicates if stale runners directly belonging to this namespace should be periodically pruned. |
+| <a id="mutationnamespacecicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationnamespacecicdsettingsupdatefullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the namespace the settings belong to. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationnamespacecicdsettingsupdatecicdsettings"></a>`ciCdSettings` | [`NamespaceCiCdSetting!`](#namespacecicdsetting) | CI/CD settings after mutation. |
+| <a id="mutationnamespacecicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationnamespacecicdsettingsupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.namespaceIncreaseStorageTemporarily`
Input type: `NamespaceIncreaseStorageTemporarilyInput`
@@ -3890,6 +3913,29 @@ Input type: `PipelineRetryInput`
| <a id="mutationpipelineretryerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationpipelineretrypipeline"></a>`pipeline` | [`Pipeline`](#pipeline) | Pipeline after mutation. |
+### `Mutation.projectCiCdSettingsUpdate`
+
+Input type: `ProjectCiCdSettingsUpdateInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationprojectcicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationprojectcicdsettingsupdatefullpath"></a>`fullPath` | [`ID!`](#id) | Full Path of the project the settings belong to. |
+| <a id="mutationprojectcicdsettingsupdatejobtokenscopeenabled"></a>`jobTokenScopeEnabled` | [`Boolean`](#boolean) | Indicates CI job tokens generated in this project have restricted access to resources. |
+| <a id="mutationprojectcicdsettingsupdatekeeplatestartifact"></a>`keepLatestArtifact` | [`Boolean`](#boolean) | Indicates if the latest artifact should be kept for this project. |
+| <a id="mutationprojectcicdsettingsupdatemergepipelinesenabled"></a>`mergePipelinesEnabled` | [`Boolean`](#boolean) | Indicates if merge pipelines are enabled for the project. |
+| <a id="mutationprojectcicdsettingsupdatemergetrainsenabled"></a>`mergeTrainsEnabled` | [`Boolean`](#boolean) | Indicates if merge trains are enabled for the project. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationprojectcicdsettingsupdatecicdsettings"></a>`ciCdSettings` | [`ProjectCiCdSetting!`](#projectcicdsetting) | CI/CD settings after mutation. |
+| <a id="mutationprojectcicdsettingsupdateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationprojectcicdsettingsupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+
### `Mutation.projectSetComplianceFramework`
Assign (or unset) a compliance framework to a project.
@@ -4355,7 +4401,7 @@ Input type: `SecurityPolicyProjectAssignInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project or group. |
| <a id="mutationsecuritypolicyprojectassignprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
| <a id="mutationsecuritypolicyprojectassignsecuritypolicyprojectid"></a>`securityPolicyProjectId` | [`ProjectID!`](#projectid) | ID of the security policy project. |
@@ -4377,7 +4423,7 @@ Input type: `SecurityPolicyProjectCreateInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectcreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectcreatefullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectcreatefullpath"></a>`fullPath` | [`String`](#string) | Full path of the project or group. |
| <a id="mutationsecuritypolicyprojectcreateprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
#### Fields
@@ -4399,7 +4445,7 @@ Input type: `SecurityPolicyProjectUnassignInput`
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="mutationsecuritypolicyprojectunassignclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
-| <a id="mutationsecuritypolicyprojectunassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project. |
+| <a id="mutationsecuritypolicyprojectunassignfullpath"></a>`fullPath` | [`String`](#string) | Full path of the project or group. |
| <a id="mutationsecuritypolicyprojectunassignprojectpath"></a>`projectPath` **{warning-solid}** | [`ID`](#id) | **Deprecated:** Use `fullPath`. Deprecated in 14.10. |
#### Fields
@@ -4565,6 +4611,25 @@ Input type: `TimelineEventUpdateInput`
| <a id="mutationtimelineeventupdateerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationtimelineeventupdatetimelineevent"></a>`timelineEvent` | [`TimelineEventType`](#timelineeventtype) | Timeline event. |
+### `Mutation.timelogDelete`
+
+Input type: `TimelogDeleteInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationtimelogdeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationtimelogdeleteid"></a>`id` | [`TimelogID!`](#timelogid) | Global ID of the timelog. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationtimelogdeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationtimelogdeleteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationtimelogdeletetimelog"></a>`timelog` | [`Timelog`](#timelog) | Deleted timelog. |
+
### `Mutation.todoCreate`
Input type: `TodoCreateInput`
@@ -4850,7 +4915,7 @@ Input type: `UpdateEpicInput`
| ---- | ---- | ----------- |
| <a id="mutationupdateepicaddlabelids"></a>`addLabelIds` | [`[ID!]`](#id) | IDs 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` | [`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="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. |
| <a id="mutationupdateepicdescription"></a>`description` | [`String`](#string) | Description of the epic. |
| <a id="mutationupdateepicduedatefixed"></a>`dueDateFixed` | [`String`](#string) | End date of the epic. |
@@ -5348,6 +5413,29 @@ Input type: `WorkItemDeleteInput`
| <a id="mutationworkitemdeleteerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
| <a id="mutationworkitemdeleteproject"></a>`project` | [`Project`](#project) | Project the deleted work item belonged to. |
+### `Mutation.workItemDeleteTask`
+
+Deletes a task in a work item's description. Available only when feature flag `work_items` is enabled. This feature is experimental and is subject to change without notice.
+
+Input type: `WorkItemDeleteTaskInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationworkitemdeletetaskclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationworkitemdeletetaskid"></a>`id` | [`WorkItemID!`](#workitemid) | Global ID of the work item. |
+| <a id="mutationworkitemdeletetasklockversion"></a>`lockVersion` | [`Int!`](#int) | Current lock version of the work item containing the task in the description. |
+| <a id="mutationworkitemdeletetasktaskdata"></a>`taskData` | [`WorkItemDeletedTaskInput!`](#workitemdeletedtaskinput) | Arguments necessary to delete a task from a work item's description. |
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="mutationworkitemdeletetaskclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
+| <a id="mutationworkitemdeletetaskerrors"></a>`errors` | [`[String!]!`](#string) | Errors encountered during execution of the mutation. |
+| <a id="mutationworkitemdeletetaskworkitem"></a>`workItem` | [`WorkItem`](#workitem) | Updated work item. |
+
### `Mutation.workItemUpdate`
Updates a work item by Global ID. Available only when feature flag `work_items` is enabled. The feature is experimental and is subject to change without notice.
@@ -7358,6 +7446,30 @@ The edge type for [`OncallParticipantType`](#oncallparticipanttype).
| <a id="oncallparticipanttypeedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="oncallparticipanttypeedgenode"></a>`node` | [`OncallParticipantType`](#oncallparticipanttype) | The item at the end of the edge. |
+#### `PackageBaseConnection`
+
+The connection type for [`PackageBase`](#packagebase).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebaseconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
+| <a id="packagebaseconnectionedges"></a>`edges` | [`[PackageBaseEdge]`](#packagebaseedge) | A list of edges. |
+| <a id="packagebaseconnectionnodes"></a>`nodes` | [`[PackageBase]`](#packagebase) | A list of nodes. |
+| <a id="packagebaseconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `PackageBaseEdge`
+
+The edge type for [`PackageBase`](#packagebase).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebaseedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="packagebaseedgenode"></a>`node` | [`PackageBase`](#packagebase) | The item at the end of the edge. |
+
#### `PackageConnection`
The connection type for [`Package`](#package).
@@ -9266,6 +9378,7 @@ Represents the total number of issues and their weights for a particular day.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="ciconfigerrors"></a>`errors` | [`[String!]`](#string) | Linting errors. |
+| <a id="ciconfigincludes"></a>`includes` | [`[CiConfigInclude!]`](#ciconfiginclude) | List of included files. |
| <a id="ciconfigmergedyaml"></a>`mergedYaml` | [`String`](#string) | Merged CI configuration YAML. |
| <a id="ciconfigstages"></a>`stages` | [`CiConfigStageConnection`](#ciconfigstageconnection) | Stages of the pipeline. (see [Connections](#connections)) |
| <a id="ciconfigstatus"></a>`status` | [`CiConfigStatus`](#ciconfigstatus) | Status of linting, can be either valid or invalid. |
@@ -9281,6 +9394,20 @@ Represents the total number of issues and their weights for a particular day.
| <a id="ciconfiggroupname"></a>`name` | [`String`](#string) | Name of the job group. |
| <a id="ciconfiggroupsize"></a>`size` | [`Int`](#int) | Size of the job group. |
+### `CiConfigInclude`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="ciconfigincludeblob"></a>`blob` | [`String`](#string) | File blob location. It can be masked if it contains masked variables, e.g., "https://gitlab.com/gitlab-org/gitlab/-/blob/e52d6d0246d7375291850e61f0abc101fbda9dc2/.gitlab/ci/build-images.gitlab-ci.yml". |
+| <a id="ciconfigincludecontextproject"></a>`contextProject` | [`String`](#string) | Current project scope, e.g., "gitlab-org/gitlab". |
+| <a id="ciconfigincludecontextsha"></a>`contextSha` | [`String`](#string) | Current sha scope. |
+| <a id="ciconfigincludeextra"></a>`extra` | [`JSON`](#json) | Extra information for the `include`, which can contain `job_name`, `project`, and `ref`. Values can be masked if they contain masked variables. |
+| <a id="ciconfigincludelocation"></a>`location` | [`String`](#string) | File location. It can be masked if it contains masked variables, e.g., ".gitlab/ci/build-images.gitlab-ci.yml". |
+| <a id="ciconfigincluderaw"></a>`raw` | [`String`](#string) | File raw location. It can be masked if it contains masked variables, e.g., "https://gitlab.com/gitlab-org/gitlab/-/raw/e52d6d0246d7375291850e61f0abc101fbda9dc2/.gitlab/ci/build-images.gitlab-ci.yml". |
+| <a id="ciconfigincludetype"></a>`type` | [`CiConfigIncludeType`](#ciconfigincludetype) | Include type. |
+
### `CiConfigJob`
#### Fields
@@ -9407,8 +9534,8 @@ Represents the total number of issues and their weights for a particular day.
| <a id="ciminutesnamespacemonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Total number of minutes used by all projects in the namespace. |
| <a id="ciminutesnamespacemonthlyusagemonth"></a>`month` | [`String`](#string) | Month related to the usage data. |
| <a id="ciminutesnamespacemonthlyusagemonthiso8601"></a>`monthIso8601` | [`ISO8601Date`](#iso8601date) | Month related to the usage data in ISO 8601 date format. |
-| <a id="ciminutesnamespacemonthlyusageprojects"></a>`projects` | [`CiMinutesProjectMonthlyUsageConnection`](#ciminutesprojectmonthlyusageconnection) | CI minutes usage data for projects in the namespace. (see [Connections](#connections)) |
-| <a id="ciminutesnamespacemonthlyusagesharedrunnersduration"></a>`sharedRunnersDuration` | [`Int`](#int) | Total numbers of minutes used by the shared runners in the namespace. |
+| <a id="ciminutesnamespacemonthlyusageprojects"></a>`projects` | [`CiMinutesProjectMonthlyUsageConnection`](#ciminutesprojectmonthlyusageconnection) | CI/CD minutes usage data for projects in the namespace. (see [Connections](#connections)) |
+| <a id="ciminutesnamespacemonthlyusagesharedrunnersduration"></a>`sharedRunnersDuration` | [`Int`](#int) | Total duration (in seconds) of shared runners use by the namespace for the month. |
### `CiMinutesProjectMonthlyUsage`
@@ -9416,8 +9543,9 @@ Represents the total number of issues and their weights for a particular day.
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="ciminutesprojectmonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Number of CI minutes used by the project in the month. |
+| <a id="ciminutesprojectmonthlyusageminutes"></a>`minutes` | [`Int`](#int) | Number of CI/CD minutes used by the project in the month. |
| <a id="ciminutesprojectmonthlyusagename"></a>`name` | [`String`](#string) | Name of the project. |
+| <a id="ciminutesprojectmonthlyusagesharedrunnersduration"></a>`sharedRunnersDuration` | [`Int`](#int) | Total duration (in seconds) of shared runners use by the project for the month. |
### `CiRunner`
@@ -9428,18 +9556,21 @@ Represents the total number of issues and their weights for a particular day.
| <a id="cirunneraccesslevel"></a>`accessLevel` | [`CiRunnerAccessLevel!`](#cirunneraccesslevel) | Access level of the runner. |
| <a id="cirunneractive"></a>`active` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 14.8. Use paused. |
| <a id="cirunneradminurl"></a>`adminUrl` | [`String`](#string) | Admin URL of the runner. Only available for administrators. |
+| <a id="cirunnerarchitecturename"></a>`architectureName` | [`String`](#string) | Architecture provided by the the runner. |
| <a id="cirunnercontactedat"></a>`contactedAt` | [`Time`](#time) | Timestamp of last contact from this runner. |
| <a id="cirunnercreatedat"></a>`createdAt` | [`Time`](#time) | Timestamp of creation of this runner. |
| <a id="cirunnerdescription"></a>`description` | [`String`](#string) | Description of the runner. |
| <a id="cirunnereditadminurl"></a>`editAdminUrl` | [`String`](#string) | Admin form URL of the runner. Only available for administrators. |
-| <a id="cirunnerexecutorname"></a>`executorName` | [`String`](#string) | Executor last advertised by the runner. Available only when feature flag `graphql_ci_runner_executor` is enabled. This flag is disabled by default, because the feature is experimental and is subject to change without notice. |
+| <a id="cirunnerexecutorname"></a>`executorName` | [`String`](#string) | Executor last advertised by the runner. |
| <a id="cirunnergroups"></a>`groups` | [`GroupConnection`](#groupconnection) | Groups the runner is associated with. For group runners only. (see [Connections](#connections)) |
| <a id="cirunnerid"></a>`id` | [`CiRunnerID!`](#cirunnerid) | ID of the runner. |
| <a id="cirunneripaddress"></a>`ipAddress` | [`String`](#string) | IP address of the runner. |
| <a id="cirunnerjobcount"></a>`jobCount` | [`Int`](#int) | Number of jobs processed by the runner (limited to 1000, plus one to indicate that more items exist). |
| <a id="cirunnerlocked"></a>`locked` | [`Boolean`](#boolean) | Indicates the runner is locked. |
+| <a id="cirunnermaintenancenote"></a>`maintenanceNote` | [`String`](#string) | Runner's maintenance notes. |
| <a id="cirunnermaximumtimeout"></a>`maximumTimeout` | [`Int`](#int) | Maximum timeout (in seconds) for jobs processed by the runner. |
| <a id="cirunnerpaused"></a>`paused` | [`Boolean!`](#boolean) | Indicates the runner is paused and not available to run jobs. |
+| <a id="cirunnerplatformname"></a>`platformName` | [`String`](#string) | Platform provided by the runner. |
| <a id="cirunnerprivateprojectsminutescostfactor"></a>`privateProjectsMinutesCostFactor` | [`Float`](#float) | Private projects' "minutes cost factor" associated with the runner (GitLab.com only). |
| <a id="cirunnerprojectcount"></a>`projectCount` | [`Int`](#int) | Number of projects that the runner is associated with. |
| <a id="cirunnerprojects"></a>`projects` | [`ProjectConnection`](#projectconnection) | Projects the runner is associated with. For project runners only. (see [Connections](#connections)) |
@@ -9482,7 +9613,7 @@ Returns [`CiRunnerStatus!`](#cirunnerstatus).
| Name | Type | Description |
| ---- | ---- | ----------- |
-| <a id="cirunnerstatuslegacymode"></a>`legacyMode` **{warning-solid}** | [`String`](#string) | **Deprecated** in 14.6. Will be removed in 15.0. From that release onward, the field will behave as if legacyMode is null. |
+| <a id="cirunnerstatuslegacymode"></a>`legacyMode` **{warning-solid}** | [`String`](#string) | **Deprecated** in 15.0. Will be removed in 17.0. In GitLab 16.0 and later, the field will act as if `legacyMode` is null. |
### `CiStage`
@@ -9772,6 +9903,7 @@ A container repository.
| <a id="containerrepositoryexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. |
| <a id="containerrepositoryexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
| <a id="containerrepositoryid"></a>`id` | [`ID!`](#id) | ID of the container repository. |
+| <a id="containerrepositorylastcleanupdeletedtagscount"></a>`lastCleanupDeletedTagsCount` | [`Int`](#int) | Number of deleted tags from the last cleanup. |
| <a id="containerrepositorylocation"></a>`location` | [`String!`](#string) | URL of the container repository. |
| <a id="containerrepositorymigrationstate"></a>`migrationState` | [`String!`](#string) | Migration state of the container repository. |
| <a id="containerrepositoryname"></a>`name` | [`String!`](#string) | Name of the container repository. |
@@ -9794,6 +9926,7 @@ Details of a container repository.
| <a id="containerrepositorydetailsexpirationpolicycleanupstatus"></a>`expirationPolicyCleanupStatus` | [`ContainerRepositoryCleanupStatus`](#containerrepositorycleanupstatus) | Tags cleanup status for the container repository. |
| <a id="containerrepositorydetailsexpirationpolicystartedat"></a>`expirationPolicyStartedAt` | [`Time`](#time) | Timestamp when the cleanup done by the expiration policy was started on the container repository. |
| <a id="containerrepositorydetailsid"></a>`id` | [`ID!`](#id) | ID of the container repository. |
+| <a id="containerrepositorydetailslastcleanupdeletedtagscount"></a>`lastCleanupDeletedTagsCount` | [`Int`](#int) | Number of deleted tags from the last cleanup. |
| <a id="containerrepositorydetailslocation"></a>`location` | [`String!`](#string) | URL of the container repository. |
| <a id="containerrepositorydetailsmigrationstate"></a>`migrationState` | [`String!`](#string) | Migration state of the container repository. |
| <a id="containerrepositorydetailsname"></a>`name` | [`String!`](#string) | Name of the container repository. |
@@ -9896,6 +10029,7 @@ A custom emoji uploaded by user.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="customerrelationscontactactive"></a>`active` | [`Boolean!`](#boolean) | State of the contact. |
| <a id="customerrelationscontactcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the contact was created. |
| <a id="customerrelationscontactdescription"></a>`description` | [`String`](#string) | Description of or notes for the contact. |
| <a id="customerrelationscontactemail"></a>`email` | [`String`](#string) | Email address of the contact. |
@@ -9912,6 +10046,7 @@ A custom emoji uploaded by user.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="customerrelationsorganizationactive"></a>`active` | [`Boolean!`](#boolean) | State of the organization. |
| <a id="customerrelationsorganizationcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp the organization was created. |
| <a id="customerrelationsorganizationdefaultrate"></a>`defaultRate` | [`Float`](#float) | Standard billing rate for the organization. |
| <a id="customerrelationsorganizationdescription"></a>`description` | [`String`](#string) | Description of or notes for the organization. |
@@ -10529,7 +10664,7 @@ Returns [`[DoraMetric!]`](#dorametric).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="dorametricdate"></a>`date` | [`String`](#string) | Date of the data point. |
-| <a id="dorametricvalue"></a>`value` | [`Int`](#int) | Value of the data point. |
+| <a id="dorametricvalue"></a>`value` | [`Float`](#float) | Value of the data point. |
### `Environment`
@@ -11231,6 +11366,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| ---- | ---- | ----------- |
| <a id="groupactualrepositorysizelimit"></a>`actualRepositorySizeLimit` | [`Float`](#float) | Size limit for repositories in the namespace in bytes. |
| <a id="groupadditionalpurchasedstoragesize"></a>`additionalPurchasedStorageSize` | [`Float`](#float) | Additional storage purchased for the root namespace in bytes. |
+| <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="groupcontacts"></a>`contacts` | [`CustomerRelationsContactConnection`](#customerrelationscontactconnection) | Find contacts of this group. (see [Connections](#connections)) |
@@ -11489,6 +11625,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="groupgroupmembersaccesslevels"></a>`accessLevels` | [`[AccessLevelEnum!]`](#accesslevelenum) | Filter members by the given access levels. |
| <a id="groupgroupmembersrelations"></a>`relations` | [`[GroupMemberRelation!]`](#groupmemberrelation) | Filter members by the given member relations. |
| <a id="groupgroupmemberssearch"></a>`search` | [`String`](#string) | Search query. |
@@ -11515,6 +11652,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="groupissuesconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="groupissuescreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="groupissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
+| <a id="groupissuescrmcontactid"></a>`crmContactId` | [`String`](#string) | ID of a contact assigned to the issues. |
+| <a id="groupissuescrmorganizationid"></a>`crmOrganizationId` | [`String`](#string) | ID of an organization assigned to the issues. |
| <a id="groupissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="groupissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="groupissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
@@ -11551,7 +11690,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="groupiterationcadencesactive"></a>`active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. |
-| <a id="groupiterationcadencesautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| <a id="groupiterationcadencesautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate upcoming iterations. |
| <a id="groupiterationcadencesdurationinweeks"></a>`durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
| <a id="groupiterationcadencesid"></a>`id` | [`IterationsCadenceID`](#iterationscadenceid) | Global ID of the iteration cadence to look up. |
| <a id="groupiterationcadencesincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Whether to include ancestor groups to search iterations cadences in. |
@@ -11756,6 +11895,23 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <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. |
+##### `Group.scanExecutionPolicies`
+
+Scan Execution Policies of the namespace.
+
+Returns [`ScanExecutionPolicyConnection`](#scanexecutionpolicyconnection).
+
+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="groupscanexecutionpoliciesactionscantypes"></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="groupscanexecutionpoliciesrelationship"></a>`relationship` | [`SecurityPolicyRelationType`](#securitypolicyrelationtype) | Filter policies by the given policy relationship. |
+
##### `Group.timelogs`
Time logged on issues and merge requests in the group and its subgroups.
@@ -11922,6 +12078,17 @@ Contains release-related statistics about a group.
| <a id="groupreleasestatsreleasescount"></a>`releasesCount` | [`Int`](#int) | Total number of releases in all descendant projects of the group. |
| <a id="groupreleasestatsreleasespercentage"></a>`releasesPercentage` | [`Int`](#int) | Percentage of the group's descendant projects that have at least one release. |
+### `GroupSecurityPolicySource`
+
+Represents the source of a security policy belonging to a group.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="groupsecuritypolicysourceinherited"></a>`inherited` | [`Boolean!`](#boolean) | Indicates whether this policy is inherited from parent group. |
+| <a id="groupsecuritypolicysourcenamespace"></a>`namespace` | [`Namespace`](#namespace) | Project the policy is associated with. |
+
### `GroupStats`
Contains statistics about a group.
@@ -12260,11 +12427,11 @@ Represents an iteration cadence.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="iterationcadenceactive"></a>`active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. |
-| <a id="iterationcadenceautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| <a id="iterationcadenceautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate upcoming iterations. |
| <a id="iterationcadencedescription"></a>`description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. |
| <a id="iterationcadencedurationinweeks"></a>`durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
| <a id="iterationcadenceid"></a>`id` | [`IterationsCadenceID!`](#iterationscadenceid) | Global ID of the iteration cadence. |
-| <a id="iterationcadenceiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. |
+| <a id="iterationcadenceiterationsinadvance"></a>`iterationsInAdvance` | [`Int`](#int) | Upcoming iterations to be created when iteration cadence is set to automatic. |
| <a id="iterationcadencerollover"></a>`rollOver` | [`Boolean!`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. |
| <a id="iterationcadencestartdate"></a>`startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. |
| <a id="iterationcadencetitle"></a>`title` | [`String!`](#string) | Title of the iteration cadence. |
@@ -12464,7 +12631,6 @@ Maven metadata.
| <a id="mergerequestconflicts"></a>`conflicts` | [`Boolean!`](#boolean) | Indicates if the merge request has conflicts. |
| <a id="mergerequestcreatedat"></a>`createdAt` | [`Time!`](#time) | Timestamp of when the merge request was created. |
| <a id="mergerequestdefaultmergecommitmessage"></a>`defaultMergeCommitMessage` | [`String`](#string) | Default merge commit message of the merge request. |
-| <a id="mergerequestdefaultmergecommitmessagewithdescription"></a>`defaultMergeCommitMessageWithDescription` **{warning-solid}** | [`String`](#string) | **Deprecated** in 14.5. Define merge commit template in project and use `defaultMergeCommitMessage`. |
| <a id="mergerequestdefaultsquashcommitmessage"></a>`defaultSquashCommitMessage` | [`String`](#string) | Default squash commit message of the merge request. |
| <a id="mergerequestdescription"></a>`description` | [`String`](#string) | Description of the merge request (Markdown rendered as HTML for caching). |
| <a id="mergerequestdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
@@ -13748,6 +13914,32 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="namespaceprojectssearch"></a>`search` | [`String`](#string) | Search project with most similar names or paths. |
| <a id="namespaceprojectssort"></a>`sort` | [`NamespaceProjectSort`](#namespaceprojectsort) | Sort projects by this criteria. |
+##### `Namespace.scanExecutionPolicies`
+
+Scan Execution Policies of the namespace.
+
+Returns [`ScanExecutionPolicyConnection`](#scanexecutionpolicyconnection).
+
+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="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. |
+
+### `NamespaceCiCdSetting`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="namespacecicdsettingallowstalerunnerpruning"></a>`allowStaleRunnerPruning` | [`Boolean`](#boolean) | Indicates if stale runners directly belonging to this namespace should be periodically pruned. |
+| <a id="namespacecicdsettingnamespace"></a>`namespace` | [`Namespace`](#namespace) | Namespace the CI/CD settings belong to. |
+
### `NetworkPolicy`
Represents the network policy.
@@ -13853,7 +14045,7 @@ Active period time range for on-call rotation.
### `Package`
-Represents a package in the Package Registry. Note that this type is in beta and susceptible to changes.
+Represents a package with pipelines in the Package Registry.
#### Fields
@@ -13865,13 +14057,32 @@ Represents a package in the Package Registry. Note that this type is in beta and
| <a id="packagemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
| <a id="packagename"></a>`name` | [`String!`](#string) | Name of the package. |
| <a id="packagepackagetype"></a>`packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
-| <a id="packagepipelines"></a>`pipelines` **{warning-solid}** | [`PipelineConnection`](#pipelineconnection) | **Deprecated** in 14.6. Due to scalability concerns, this field is going to be removed. |
+| <a id="packagepipelines"></a>`pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines that built the package. Max page size 20. (see [Connections](#connections)) |
| <a id="packageproject"></a>`project` | [`Project!`](#project) | Project where the package is stored. |
| <a id="packagestatus"></a>`status` | [`PackageStatus!`](#packagestatus) | Package status. |
| <a id="packagetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
| <a id="packageupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
| <a id="packageversion"></a>`version` | [`String`](#string) | Version string. |
-| <a id="packageversions"></a>`versions` **{warning-solid}** | [`PackageConnection`](#packageconnection) | **Deprecated** in 13.11. This field is now only returned in the PackageDetailsType. |
+
+### `PackageBase`
+
+Represents a package in the Package Registry.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="packagebasecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
+| <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
+| <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
+| <a id="packagebasemetadata"></a>`metadata` | [`PackageMetadata`](#packagemetadata) | Package metadata. |
+| <a id="packagebasename"></a>`name` | [`String!`](#string) | Name of the package. |
+| <a id="packagebasepackagetype"></a>`packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
+| <a id="packagebaseproject"></a>`project` | [`Project!`](#project) | Project where the package is stored. |
+| <a id="packagebasestatus"></a>`status` | [`PackageStatus!`](#packagestatus) | Package status. |
+| <a id="packagebasetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
+| <a id="packagebaseupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
+| <a id="packagebaseversion"></a>`version` | [`String`](#string) | Version string. |
### `PackageComposerJsonType`
@@ -13913,7 +14124,7 @@ Represents a package dependency link.
### `PackageDetailsType`
-Represents a package details in the Package Registry. Note that this type is in beta and susceptible to changes.
+Represents a package details in the Package Registry.
#### Fields
@@ -13933,7 +14144,7 @@ Represents a package details in the Package Registry. Note that this type is in
| <a id="packagedetailstypenugeturl"></a>`nugetUrl` | [`String`](#string) | Url of the Nuget project endpoint. |
| <a id="packagedetailstypepackagefiles"></a>`packageFiles` | [`PackageFileConnection`](#packagefileconnection) | Package files. (see [Connections](#connections)) |
| <a id="packagedetailstypepackagetype"></a>`packageType` | [`PackageTypeEnum!`](#packagetypeenum) | Package type. |
-| <a id="packagedetailstypepipelines"></a>`pipelines` **{warning-solid}** | [`PipelineConnection`](#pipelineconnection) | **Deprecated** in 14.6. Due to scalability concerns, this field is going to be removed. |
+| <a id="packagedetailstypepipelines"></a>`pipelines` | [`PipelineConnection`](#pipelineconnection) | Pipelines that built the package. Max page size 20. (see [Connections](#connections)) |
| <a id="packagedetailstypeproject"></a>`project` | [`Project!`](#project) | Project where the package is stored. |
| <a id="packagedetailstypepypisetupurl"></a>`pypiSetupUrl` | [`String`](#string) | Url of the PyPi project setup endpoint. |
| <a id="packagedetailstypepypiurl"></a>`pypiUrl` | [`String`](#string) | Url of the PyPi project endpoint. |
@@ -13941,7 +14152,7 @@ Represents a package details in the Package Registry. Note that this type is in
| <a id="packagedetailstypetags"></a>`tags` | [`PackageTagConnection`](#packagetagconnection) | Package tags. (see [Connections](#connections)) |
| <a id="packagedetailstypeupdatedat"></a>`updatedAt` | [`Time!`](#time) | Date of most recent update. |
| <a id="packagedetailstypeversion"></a>`version` | [`String`](#string) | Version string. |
-| <a id="packagedetailstypeversions"></a>`versions` | [`PackageConnection`](#packageconnection) | Other versions of the package. (see [Connections](#connections)) |
+| <a id="packagedetailstypeversions"></a>`versions` | [`PackageBaseConnection`](#packagebaseconnection) | Other versions of the package. (see [Connections](#connections)) |
### `PackageFile`
@@ -14752,6 +14963,8 @@ Returns [`Issue`](#issue).
| <a id="projectissueconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuecreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuecreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
+| <a id="projectissuecrmcontactid"></a>`crmContactId` | [`String`](#string) | ID of a contact assigned to the issues. |
+| <a id="projectissuecrmorganizationid"></a>`crmOrganizationId` | [`String`](#string) | ID of an organization assigned to the issues. |
| <a id="projectissueepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissueiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissueiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
@@ -14792,6 +15005,8 @@ Returns [`IssueStatusCountsType`](#issuestatuscountstype).
| <a id="projectissuestatuscountsconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuestatuscountscreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuestatuscountscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
+| <a id="projectissuestatuscountscrmcontactid"></a>`crmContactId` | [`String`](#string) | ID of a contact assigned to the issues. |
+| <a id="projectissuestatuscountscrmorganizationid"></a>`crmOrganizationId` | [`String`](#string) | ID of an organization assigned to the issues. |
| <a id="projectissuestatuscountsiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissuestatuscountsiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
| <a id="projectissuestatuscountslabelname"></a>`labelName` | [`[String]`](#string) | Labels applied to this issue. |
@@ -14829,6 +15044,8 @@ four standard [pagination arguments](#connection-pagination-arguments):
| <a id="projectissuesconfidential"></a>`confidential` | [`Boolean`](#boolean) | Filter for confidential issues. If "false", excludes confidential issues. If "true", returns only confidential issues. |
| <a id="projectissuescreatedafter"></a>`createdAfter` | [`Time`](#time) | Issues created after this date. |
| <a id="projectissuescreatedbefore"></a>`createdBefore` | [`Time`](#time) | Issues created before this date. |
+| <a id="projectissuescrmcontactid"></a>`crmContactId` | [`String`](#string) | ID of a contact assigned to the issues. |
+| <a id="projectissuescrmorganizationid"></a>`crmOrganizationId` | [`String`](#string) | ID of an organization assigned to the issues. |
| <a id="projectissuesepicid"></a>`epicId` | [`String`](#string) | ID of an epic associated with the issues, "none" and "any" values are supported. |
| <a id="projectissuesiid"></a>`iid` | [`String`](#string) | IID of the issue. For example, "1". |
| <a id="projectissuesiids"></a>`iids` | [`[String!]`](#string) | List of IIDs of issues. For example, `["1", "2"]`. |
@@ -14865,7 +15082,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectiterationcadencesactive"></a>`active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. |
-| <a id="projectiterationcadencesautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. |
+| <a id="projectiterationcadencesautomatic"></a>`automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate upcoming iterations. |
| <a id="projectiterationcadencesdurationinweeks"></a>`durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. |
| <a id="projectiterationcadencesid"></a>`id` | [`IterationsCadenceID`](#iterationscadenceid) | Global ID of the iteration cadence to look up. |
| <a id="projectiterationcadencesincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Whether to include ancestor groups to search iterations cadences in. |
@@ -15019,7 +15236,7 @@ Network Policies of the project.
WARNING:
**Deprecated** in 14.8.
-Network policies are deprecated and will be removed in GitLab 15.0.
+Network policies are deprecated and will be removed in GitLab 16.0.
Returns [`NetworkPolicyConnection`](#networkpolicyconnection).
@@ -15203,6 +15420,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectscanexecutionpoliciesactionscantypes"></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="projectscanexecutionpoliciesrelationship"></a>`relationship` | [`SecurityPolicyRelationType`](#securitypolicyrelationtype) | Filter policies by the given policy relationship. |
##### `Project.securityTrainingProviders`
@@ -15227,6 +15445,7 @@ Returns [`[SecurityTrainingUrl!]`](#securitytrainingurl).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectsecuritytrainingurlsidentifierexternalids"></a>`identifierExternalIds` | [`[String!]!`](#string) | List of external IDs of vulnerability identifiers. |
+| <a id="projectsecuritytrainingurlslanguage"></a>`language` | [`String`](#string) | Desired language for training urls. |
##### `Project.sentryDetailedError`
@@ -15481,6 +15700,16 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction).
| <a id="projectpermissionsupdatewiki"></a>`updateWiki` | [`Boolean!`](#boolean) | Indicates the user can perform `update_wiki` on this resource. |
| <a id="projectpermissionsuploadfile"></a>`uploadFile` | [`Boolean!`](#boolean) | Indicates the user can perform `upload_file` on this resource. |
+### `ProjectSecurityPolicySource`
+
+Represents the source of a security policy belonging to a project.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="projectsecuritypolicysourceproject"></a>`project` | [`Project`](#project) | Project the policy is associated with. |
+
### `ProjectSecurityTraining`
#### Fields
@@ -15503,6 +15732,7 @@ Returns [`UserMergeRequestInteraction`](#usermergerequestinteraction).
| ---- | ---- | ----------- |
| <a id="projectstatisticsbuildartifactssize"></a>`buildArtifactsSize` | [`Float!`](#float) | Build artifacts size of the project in bytes. |
| <a id="projectstatisticscommitcount"></a>`commitCount` | [`Float!`](#float) | Commit count of the project. |
+| <a id="projectstatisticscontainerregistrysize"></a>`containerRegistrySize` | [`Float`](#float) | Container Registry size of the project in bytes. |
| <a id="projectstatisticslfsobjectssize"></a>`lfsObjectsSize` | [`Float!`](#float) | Large File Storage (LFS) object size of the project in bytes. |
| <a id="projectstatisticspackagessize"></a>`packagesSize` | [`Float!`](#float) | Packages size of the project in bytes. |
| <a id="projectstatisticspipelineartifactssize"></a>`pipelineArtifactsSize` | [`Float`](#float) | CI Pipeline artifacts size in bytes. |
@@ -15849,6 +16079,7 @@ Counts of requirements by their state.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="rootstoragestatisticsbuildartifactssize"></a>`buildArtifactsSize` | [`Float!`](#float) | CI artifacts size in bytes. |
+| <a id="rootstoragestatisticscontainerregistrysize"></a>`containerRegistrySize` | [`Float!`](#float) | Container Registry size in bytes. |
| <a id="rootstoragestatisticsdependencyproxysize"></a>`dependencyProxySize` | [`Float!`](#float) | Dependency Proxy sizes in bytes. |
| <a id="rootstoragestatisticslfsobjectssize"></a>`lfsObjectsSize` | [`Float!`](#float) | LFS objects size in bytes. |
| <a id="rootstoragestatisticspackagessize"></a>`packagesSize` | [`Float!`](#float) | Packages size in bytes. |
@@ -15985,6 +16216,7 @@ Represents the scan execution policy.
| <a id="scanexecutionpolicydescription"></a>`description` | [`String!`](#string) | Description of the policy. |
| <a id="scanexecutionpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether this policy is enabled. |
| <a id="scanexecutionpolicyname"></a>`name` | [`String!`](#string) | Name of the policy. |
+| <a id="scanexecutionpolicysource"></a>`source` | [`SecurityPolicySource!`](#securitypolicysource) | Source of the policy. Its fields depend on the source type. |
| <a id="scanexecutionpolicyupdatedat"></a>`updatedAt` | [`Time!`](#time) | Timestamp of when the policy YAML was last updated. |
| <a id="scanexecutionpolicyyaml"></a>`yaml` | [`String!`](#string) | YAML definition of the policy. |
@@ -16612,6 +16844,7 @@ Describes an incident management timeline event.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="timelogid"></a>`id` | [`ID!`](#id) | Internal ID of the timelog. |
| <a id="timelogissue"></a>`issue` | [`Issue`](#issue) | Issue that logged time was added to. |
| <a id="timelogmergerequest"></a>`mergeRequest` | [`MergeRequest`](#mergerequest) | Merge request that logged time was added to. |
| <a id="timelognote"></a>`note` | [`Note`](#note) | Note where the quick action was executed to add the logged time. |
@@ -16619,6 +16852,15 @@ Describes an incident management timeline event.
| <a id="timelogsummary"></a>`summary` | [`String`](#string) | Summary of how the time was spent. |
| <a id="timelogtimespent"></a>`timeSpent` | [`Int!`](#int) | Time spent displayed in seconds. |
| <a id="timeloguser"></a>`user` | [`UserCore!`](#usercore) | User that logged the time. |
+| <a id="timeloguserpermissions"></a>`userPermissions` | [`TimelogPermissions!`](#timelogpermissions) | Permissions for the current user on the resource. |
+
+### `TimelogPermissions`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="timelogpermissionsadmintimelog"></a>`adminTimelog` | [`Boolean!`](#boolean) | Indicates the user can perform `admin_timelog` on this resource. |
### `Todo`
@@ -16650,6 +16892,7 @@ Representing a to-do entry.
| <a id="topicdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `description`. |
| <a id="topicid"></a>`id` | [`ID!`](#id) | ID of the topic. |
| <a id="topicname"></a>`name` | [`String!`](#string) | Name of the topic. |
+| <a id="topictitle"></a>`title` | [`String!`](#string) | Title of the topic. |
### `Tree`
@@ -17582,8 +17825,21 @@ Represents vulnerability letter grades with associated projects.
| <a id="workitemstate"></a>`state` | [`WorkItemState!`](#workitemstate) | State of the work item. |
| <a id="workitemtitle"></a>`title` | [`String!`](#string) | Title of the work item. |
| <a id="workitemtitlehtml"></a>`titleHtml` | [`String`](#string) | The GitLab Flavored Markdown rendering of `title`. |
+| <a id="workitemuserpermissions"></a>`userPermissions` | [`WorkItemPermissions!`](#workitempermissions) | Permissions for the current user on the resource. |
| <a id="workitemworkitemtype"></a>`workItemType` | [`WorkItemType!`](#workitemtype) | Type assigned to the work item. |
+### `WorkItemPermissions`
+
+Check permissions for the current user on a work item.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitempermissionsdeleteworkitem"></a>`deleteWorkItem` | [`Boolean!`](#boolean) | Indicates the user can perform `delete_work_item` on this resource. |
+| <a id="workitempermissionsreadworkitem"></a>`readWorkItem` | [`Boolean!`](#boolean) | Indicates the user can perform `read_work_item` on this resource. |
+| <a id="workitempermissionsupdateworkitem"></a>`updateWorkItem` | [`Boolean!`](#boolean) | Indicates the user can perform `update_work_item` on this resource. |
+
### `WorkItemType`
#### Fields
@@ -17662,7 +17918,7 @@ Filters the alerts based on given domain.
| Value | Description |
| ----- | ----------- |
| <a id="alertmanagementdomainfilteroperations"></a>`operations` | Alerts for operations domain. |
-| <a id="alertmanagementdomainfilterthreat_monitoring"></a>`threat_monitoring` | Alerts for threat monitoring domain. |
+| <a id="alertmanagementdomainfilterthreat_monitoring"></a>`threat_monitoring` **{warning-solid}** | **Deprecated** in 15.0. Network policies are deprecated and will be removed in GitLab 16.0. |
### `AlertManagementIntegrationType`
@@ -17773,6 +18029,17 @@ Types of blob viewers.
| <a id="blobviewerstyperich"></a>`rich` | Rich blob viewers type. |
| <a id="blobviewerstypesimple"></a>`simple` | Simple blob viewers type. |
+### `CiConfigIncludeType`
+
+Include type.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="ciconfigincludetypefile"></a>`file` | Project file include. |
+| <a id="ciconfigincludetypelocal"></a>`local` | Local include. |
+| <a id="ciconfigincludetyperemote"></a>`remote` | Remote include. |
+| <a id="ciconfigincludetypetemplate"></a>`template` | Template include. |
+
### `CiConfigStatus`
Values for YAML processor result.
@@ -17830,12 +18097,11 @@ Values for sorting runners.
| Value | Description |
| ----- | ----------- |
| <a id="cirunnerstatusactive"></a>`ACTIVE` **{warning-solid}** | **Deprecated** in 14.6. This was renamed. Use: [`CiRunner.paused`](#cirunnerpaused). |
-| <a id="cirunnerstatusnever_contacted"></a>`NEVER_CONTACTED` | Runner that has never contacted this instance. Set legacyMode to null to utilize this value. Will replace NOT_CONNECTED starting in 15.0. |
-| <a id="cirunnerstatusnot_connected"></a>`NOT_CONNECTED` **{warning-solid}** | **Deprecated** in 14.6. Use NEVER_CONTACTED instead. NEVER_CONTACTED will have a slightly different scope starting in 15.0, with STALE being returned instead after 3 months of no contact. |
-| <a id="cirunnerstatusoffline"></a>`OFFLINE` **{warning-solid}** | **Deprecated** in 14.6. This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period offline. |
+| <a id="cirunnerstatusnever_contacted"></a>`NEVER_CONTACTED` | Runner that has never contacted this instance. |
+| <a id="cirunnerstatusoffline"></a>`OFFLINE` | Runner that has not contacted this instance within the last 2 hours. Will be considered `STALE` if offline for more than 3 months. |
| <a id="cirunnerstatusonline"></a>`ONLINE` | Runner that contacted this instance within the last 2 hours. |
| <a id="cirunnerstatuspaused"></a>`PAUSED` **{warning-solid}** | **Deprecated** in 14.6. This was renamed. Use: [`CiRunner.paused`](#cirunnerpaused). |
-| <a id="cirunnerstatusstale"></a>`STALE` | Runner that has not contacted this instance within the last 3 months. Only available if legacyMode is null. Will be a possible return value starting in 15.0. |
+| <a id="cirunnerstatusstale"></a>`STALE` | Runner that has not contacted this instance within the last 3 months. |
### `CiRunnerType`
@@ -17849,9 +18115,11 @@ Values for sorting runners.
| Value | Description |
| ----- | ----------- |
-| <a id="cirunnerupgradestatustypeavailable"></a>`AVAILABLE` | An update is available for the runner. |
-| <a id="cirunnerupgradestatustypenot_available"></a>`NOT_AVAILABLE` | An update is not available for the runner. |
-| <a id="cirunnerupgradestatustyperecommended"></a>`RECOMMENDED` | An update is available and recommended for the runner. |
+| <a id="cirunnerupgradestatustypeavailable"></a>`AVAILABLE` | Upgrade is available for the runner. |
+| <a id="cirunnerupgradestatustypeinvalid"></a>`INVALID` | Runner version is not valid. |
+| <a id="cirunnerupgradestatustypenot_available"></a>`NOT_AVAILABLE` | Upgrade is not available for the runner. |
+| <a id="cirunnerupgradestatustyperecommended"></a>`RECOMMENDED` | Upgrade is available and recommended for the runner. |
+| <a id="cirunnerupgradestatustypeunknown"></a>`UNKNOWN` | Upgrade status is unknown. |
### `CodeQualityDegradationSeverity`
@@ -18902,6 +19170,13 @@ The status of the security scan.
| <a id="scanstatusreport_error"></a>`REPORT_ERROR` | The report artifact provided by the CI build couldn't be parsed. |
| <a id="scanstatussucceeded"></a>`SUCCEEDED` | The report has been successfully prepared. |
+### `SecurityPolicyRelationType`
+
+| 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. |
+
### `SecurityReportTypeEnum`
| Value | Description |
@@ -19122,6 +19397,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumpersonal_access_token_expiry"></a>`PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for personal_access_token_expiry. |
| <a id="usercalloutfeaturenameenumpipeline_needs_banner"></a>`PIPELINE_NEEDS_BANNER` | Callout feature name for pipeline_needs_banner. |
| <a id="usercalloutfeaturenameenumpipeline_needs_hover_tip"></a>`PIPELINE_NEEDS_HOVER_TIP` | Callout feature name for pipeline_needs_hover_tip. |
+| <a id="usercalloutfeaturenameenumpreview_user_over_limit_free_plan_alert"></a>`PREVIEW_USER_OVER_LIMIT_FREE_PLAN_ALERT` | Callout feature name for preview_user_over_limit_free_plan_alert. |
| <a id="usercalloutfeaturenameenumprofile_personal_access_token_expiry"></a>`PROFILE_PERSONAL_ACCESS_TOKEN_EXPIRY` | Callout feature name for profile_personal_access_token_expiry. |
| <a id="usercalloutfeaturenameenumregistration_enabled_callout"></a>`REGISTRATION_ENABLED_CALLOUT` | Callout feature name for registration_enabled_callout. |
| <a id="usercalloutfeaturenameenumsecurity_configuration_devops_alert"></a>`SECURITY_CONFIGURATION_DEVOPS_ALERT` | Callout feature name for security_configuration_devops_alert. |
@@ -19142,6 +19418,7 @@ Name of the feature that the callout is for.
| <a id="usercalloutfeaturenameenumtwo_factor_auth_recovery_settings_check"></a>`TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK` | Callout feature name for two_factor_auth_recovery_settings_check. |
| <a id="usercalloutfeaturenameenumultimate_trial"></a>`ULTIMATE_TRIAL` | Callout feature name for ultimate_trial. |
| <a id="usercalloutfeaturenameenumunfinished_tag_cleanup_callout"></a>`UNFINISHED_TAG_CLEANUP_CALLOUT` | Callout feature name for unfinished_tag_cleanup_callout. |
+| <a id="usercalloutfeaturenameenumuser_reached_limit_free_plan_alert"></a>`USER_REACHED_LIMIT_FREE_PLAN_ALERT` | Callout feature name for user_reached_limit_free_plan_alert. |
| <a id="usercalloutfeaturenameenumverification_reminder"></a>`VERIFICATION_REMINDER` | Callout feature name for verification_reminder. |
| <a id="usercalloutfeaturenameenumweb_ide_alert_dismissed"></a>`WEB_IDE_ALERT_DISMISSED` | Callout feature name for web_ide_alert_dismissed. |
| <a id="usercalloutfeaturenameenumweb_ide_ci_environments_guidance"></a>`WEB_IDE_CI_ENVIRONMENTS_GUIDANCE` | Callout feature name for web_ide_ci_environments_guidance. |
@@ -19278,8 +19555,6 @@ Vulnerability sort values.
| <a id="vulnerabilitysortseverity_desc"></a>`severity_desc` | Severity in descending order. |
| <a id="vulnerabilitysortstate_asc"></a>`state_asc` | State in ascending order. |
| <a id="vulnerabilitysortstate_desc"></a>`state_desc` | State in descending order. |
-| <a id="vulnerabilitysorttitle_asc"></a>`title_asc` **{warning-solid}** | **Deprecated** in 14.2. Deprecated due to performance issues. |
-| <a id="vulnerabilitysorttitle_desc"></a>`title_desc` **{warning-solid}** | **Deprecated** in 14.2. Deprecated due to performance issues. |
### `VulnerabilityState`
@@ -19422,6 +19697,12 @@ A `ClustersClusterID` is a global ID. It is encoded as a string.
An example `ClustersClusterID` is: `"gid://gitlab/Clusters::Cluster/1"`.
+### `Color`
+
+Color represented as a hex code or named color.
+
+For example: "#fefefe".
+
### `ComplianceManagementFrameworkID`
A `ComplianceManagementFrameworkID` is a global ID. It is encoded as a string.
@@ -19825,6 +20106,12 @@ For example: "2021-03-09T14:58:50+00:00".
See `https://www.iso.org/iso-8601-date-and-time-format.html`.
+### `TimelogID`
+
+A `TimelogID` is a global ID. It is encoded as a string.
+
+An example `TimelogID` is: `"gid://gitlab/Timelog/1"`.
+
### `TodoID`
A `TodoID` is a global ID. It is encoded as a string.
@@ -19959,6 +20246,15 @@ One of:
- [`NugetMetadata`](#nugetmetadata)
- [`PypiMetadata`](#pypimetadata)
+#### `SecurityPolicySource`
+
+Represents a policy source. Its fields depend on the source type.
+
+One of:
+
+- [`GroupSecurityPolicySource`](#groupsecuritypolicysource)
+- [`ProjectSecurityPolicySource`](#projectsecuritypolicysource)
+
#### `VulnerabilityDetail`
Represents a vulnerability detail field. The fields with data will depend on the vulnerability detail type.
@@ -20954,3 +21250,13 @@ A time-frame defined as a closed inclusive range of two dates.
| <a id="workitemconverttaskinputlockversion"></a>`lockVersion` | [`Int!`](#int) | Current lock version of the work item containing the task in the description. |
| <a id="workitemconverttaskinputtitle"></a>`title` | [`String!`](#string) | Full string of the task to be replaced. New title for the created work item. |
| <a id="workitemconverttaskinputworkitemtypeid"></a>`workItemTypeId` | [`WorkItemsTypeID!`](#workitemstypeid) | Global ID of the work item type used to create the new work item. |
+
+### `WorkItemDeletedTaskInput`
+
+#### Arguments
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="workitemdeletedtaskinputid"></a>`id` | [`WorkItemID!`](#workitemid) | Global ID of the task referenced in the work item's description. |
+| <a id="workitemdeletedtaskinputlinenumberend"></a>`lineNumberEnd` | [`Int!`](#int) | Last line in the Markdown source that defines the list item task. |
+| <a id="workitemdeletedtaskinputlinenumberstart"></a>`lineNumberStart` | [`Int!`](#int) | First line in the Markdown source that defines the list item task. |
diff --git a/doc/api/graphql/removed_items.md b/doc/api/graphql/removed_items.md
index f70add0de45..6778a0c2aab 100644
--- a/doc/api/graphql/removed_items.md
+++ b/doc/api/graphql/removed_items.md
@@ -10,6 +10,32 @@ GraphQL is a versionless API, unlike the REST API.
Occasionally, items have to be updated or removed from the GraphQL API.
According to our [process for removing items](index.md#deprecation-and-removal-process), here are the items that have been removed.
+## GitLab 15.0
+
+Fields removed in GitLab 15.0.
+
+### GraphQL Mutations
+
+[Removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85382) in GitLab 15.0:
+
+| Argument name | Mutation | Deprecated in | Use instead |
+| -------------------- | -------------------- | ------------- | -------------------------- |
+| - | `clusterAgentTokenDelete`| 14.7 | `clusterAgentTokenRevoke` |
+
+### GraphQL Fields
+
+[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/342882) in GitLab 15.0:
+
+| Argument name | Field name | Deprecated in | Use instead |
+| -------------------- | --------------------| ------------- | -------------------------- |
+| - | `pipelines` | 14.5 | None |
+
+### GraphQL Types
+
+| Field name | GraphQL type | Deprecated in | Use instead |
+| ------------------------------------------ | ------------------------ | ------------- | ---------------------------------------------------------------------------------- |
+| `defaultMergeCommitMessageWithDescription` | `GraphQL::Types::String` | 14.5 | None. Define a [merge commit template](../../user/project/merge_requests/commit_templates.md) in your project and use `defaultMergeCommitMessage`. |
+
## GitLab 14.0
Fields [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63293) in GitLab 14.0:
diff --git a/doc/api/groups.md b/doc/api/groups.md
index e04e5207c95..b565e714285 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -455,7 +455,6 @@ Example response:
"public_jobs":true,
"build_timeout":3600,
"auto_cancel_pending_pipelines":"enabled",
- "build_coverage_regex":null,
"ci_config_path":null,
"shared_with_groups":[
{
@@ -837,6 +836,7 @@ The `default_branch_protection` attribute determines whether users with the Deve
| `0` | No protection. Users with the Developer or Maintainer role can: <br>- Push new commits<br>- Force push changes<br>- Delete the branch |
| `1` | Partial protection. Users with the Developer or Maintainer role can: <br>- Push new commits |
| `2` | Full protection. Only users with the Maintainer role can: <br>- Push new commits |
+| `3` | Protected against pushes. Users with the Maintainer role can: <br>- Push new commits<br>- Force push changes<br>- Accept merge requests<br>Users with the Developer role can:<br>- Accept merge requests|
## New Subgroup
diff --git a/doc/api/index.md b/doc/api/index.md
index f78a501fb11..78e5f980679 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -348,7 +348,7 @@ The following table shows the possible return codes for API requests.
| Return values | Description |
|--------------------------|-------------|
-| `200 OK` | The `GET`, `PUT` or `DELETE` request was successful, and the resource(s) itself is returned as JSON. |
+| `200 OK` | The `GET`, `PUT` or `DELETE` request was successful, and the resource itself is returned as JSON. |
| `204 No Content` | The server has successfully fulfilled the request, and there is no additional content to send in the response payload body. |
| `201 Created` | The `POST` request was successful, and the resource is returned as JSON. |
| `304 Not Modified` | The resource hasn't been modified since the last request. |
diff --git a/doc/api/integrations.md b/doc/api/integrations.md
index c1564826944..eaa826b3686 100644
--- a/doc/api/integrations.md
+++ b/doc/api/integrations.md
@@ -92,7 +92,6 @@ Parameters:
| --------- | ---- | -------- | ----------- |
| `api_key` | string | true | User API token. User must have access to task. All comments are attributed to this user. |
| `restrict_to_branch` | string | false | Comma-separated list of branches to be are automatically inspected. Leave blank to include all branches. |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Asana integration
@@ -128,7 +127,6 @@ Parameters:
| --------- | ---- | -------- | ----------- |
| `token` | string | true | The authentication token
| `subdomain` | string | false | The subdomain setting |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Assembla integration
@@ -169,7 +167,6 @@ Parameters:
| `build_key` | string | true | Bamboo build plan key like KEY |
| `username` | string | true | A user with API access, if applicable |
| `password` | string | true | Password of the user |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Atlassian Bamboo CI integration
@@ -206,9 +203,6 @@ Parameters:
| `new_issue_url` | string | true | New Issue URL |
| `issues_url` | string | true | Issue URL |
| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `title` | string | false | Title |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Bugzilla integration
@@ -246,6 +240,8 @@ Parameters:
| `project_url` | string | true | Pipeline URL. For example, `https://buildkite.com/example/pipeline` |
| `enable_ssl_verification` | boolean | false | DEPRECATED: This parameter has no effect since SSL verification is always enabled |
| `push_events` | boolean | false | Enable notifications for push events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
+| `tag_push_events` | boolean | false | Enable notifications for tag push events |
### Disable Buildkite integration
@@ -283,7 +279,6 @@ Parameters:
| `token` | string | true | Campfire API token. To find it, log into Campfire and select **My info**. |
| `subdomain` | string | false | Campfire subdomain. Text between `https://` and `.campfirenow.com` when you're logged in. |
| `room` | string | false | Campfire room. The last part of the URL when you're in a room. |
-| `push_events` | boolean | false | Enable notifications for push events. |
### Disable Campfire integration
@@ -452,9 +447,6 @@ Parameters:
| `new_issue_url` | string | true | New Issue URL |
| `issues_url` | string | true | Issue URL |
| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `title` | string | false | Title |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Custom Issue Tracker integration
@@ -709,7 +701,6 @@ Parameters:
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `token` | string | true | Flowdock Git source token |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Flowdock integration
@@ -832,7 +823,6 @@ Parameters:
| `server_host` | string | false | localhost |
| `server_port` | integer | false | 6659 |
| `colorize_messages` | boolean | false | Colorize messages |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Irker (IRC gateway) integration
@@ -1085,7 +1075,6 @@ Parameters:
| --------- | ---- | -------- | ----------- |
| `token` | string | true | The Pivotal Tracker token |
| `restrict_to_branch` | boolean | false | Comma-separated list of branches to automatically inspect. Leave blank to include all branches. |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Pivotal Tracker integration
@@ -1160,7 +1149,6 @@ Parameters:
| `priority` | string | true | The priority |
| `device` | string | false | Leave blank for all active devices |
| `sound` | string | false | The sound of the notification |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Pushover integration
@@ -1197,8 +1185,6 @@ Parameters:
| `new_issue_url` | string | true | New Issue URL |
| `project_url` | string | true | Project URL |
| `issues_url` | string | true | Issue URL |
-| `description` | string | false | Description |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable Redmine integration
@@ -1404,6 +1390,7 @@ Parameters:
| `username` | string | true | A user with permissions to trigger a manual build |
| `password` | string | true | The password of the user |
| `push_events` | boolean | false | Enable notifications for push events |
+| `merge_requests_events` | boolean | false | Enable notifications for merge request events |
### Disable JetBrains TeamCity CI integration
@@ -1554,8 +1541,6 @@ Parameters:
| --------- | ---- | -------- | ----------- |
| `issues_url` | string | true | Issue URL |
| `project_url` | string | true | Project URL |
-| `description` | string | false | Description |
-| `push_events` | boolean | false | Enable notifications for push events |
### Disable YouTrack integration
diff --git a/doc/api/issues.md b/doc/api/issues.md
index e82aa8da8ed..44b947f14dc 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -1166,7 +1166,7 @@ PUT /projects/:id/issues/:issue_iid
| Attribute | Type | Required | Description |
|----------------|---------|----------|------------------------------------------------------------------------------------------------------------|
| `add_labels` | string | no | Comma-separated label names to add to an issue. |
-| `assignee_ids` | integer array | no | The ID of the user(s) to assign the issue to. Set to `0` or provide an empty value to unassign all assignees. |
+| `assignee_ids` | integer array | no | The ID of the users to assign the issue to. Set to `0` or provide an empty value to unassign all assignees. |
| `confidential` | boolean | no | Updates an issue to be confidential |
| `description` | string | no | The description of an issue. Limited to 1,048,576 characters. |
| `discussion_locked` | boolean | no | Flag indicating if the issue's discussion is locked. If the discussion is locked only project members can add or edit comments. |
diff --git a/doc/api/job_artifacts.md b/doc/api/job_artifacts.md
index 517ffde0046..ee9f1678b18 100644
--- a/doc/api/job_artifacts.md
+++ b/doc/api/job_artifacts.md
@@ -171,6 +171,9 @@ Download a single artifact file for a specific job of the latest successful
pipeline for the given reference name from inside the job's artifacts archive.
The file is extracted from the archive and streamed to the client.
+The artifact file provides more detail than what is available in the
+[CSV export](../user/application_security/vulnerability_report/index.md#export-vulnerability-details).
+
In [GitLab 13.5](https://gitlab.com/gitlab-org/gitlab/-/issues/201784) and later, artifacts
for [parent and child pipelines](../ci/pipelines/parent_child_pipelines.md) are searched in hierarchical
order from parent to child. For example, if both parent and child pipelines have a
diff --git a/doc/api/linked_epics.md b/doc/api/linked_epics.md
index df302be0555..0d2176dfc61 100644
--- a/doc/api/linked_epics.md
+++ b/doc/api/linked_epics.md
@@ -6,10 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Linked epics API **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352493) in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `related_epics_widget`. 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 `related_epics_widget`. On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352493) in GitLab 14.9 [with a flag](../administration/feature_flags.md) named `related_epics_widget`. Enabled by default.
+> - [Feature flag `related_epics_widget`](https://gitlab.com/gitlab-org/gitlab/-/issues/357089) removed in GitLab 15.0.
If the Related Epics feature is not available in your GitLab plan, a `403` status code is returned.
diff --git a/doc/api/lint.md b/doc/api/lint.md
index a271b75c035..c0d0b69dc77 100644
--- a/doc/api/lint.md
+++ b/doc/api/lint.md
@@ -268,7 +268,7 @@ a JSON payload, you can use `jq`. For example, create a file named `example-gitl
```yaml
.api_test:
rules:
- - if: '$CI_PIPELINE_SOURCE=="merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE=="merge_request_event"
changes:
- src/api/*
deploy:
diff --git a/doc/api/managed_licenses.md b/doc/api/managed_licenses.md
index f2626574bf0..31f1cb41eb3 100644
--- a/doc/api/managed_licenses.md
+++ b/doc/api/managed_licenses.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Managed Licenses API **(ULTIMATE)**
WARNING:
-"approval" and "blacklisted" approval statuses are deprecated and scheduled to be changed to "allowed" and "denied" in GitLab 15.0.
+"approval" and "blacklisted" approval statuses are changed to "allowed" and "denied" in GitLab 15.0.
## List managed licenses
@@ -32,12 +32,12 @@ Example response:
{
"id": 1,
"name": "MIT",
- "approval_status": "approved"
+ "approval_status": "allowed"
},
{
"id": 3,
"name": "ISC",
- "approval_status": "blacklisted"
+ "approval_status": "denied"
}
]
```
@@ -65,7 +65,7 @@ Example response:
{
"id": 1,
"name": "MIT",
- "approval_status": "blacklisted"
+ "approval_status": "denied"
}
```
@@ -81,7 +81,7 @@ POST /projects/:id/managed_licenses
| ------------- | ------- | -------- | ---------------------------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `name` | string | yes | The name of the managed license |
-| `approval_status` | string | yes | The approval status of the license. "allowed" or "denied". "blacklisted" and "approved" are deprecated. |
+| `approval_status` | string | yes | The approval status of the license. "allowed" or "denied". |
```shell
curl --data "name=MIT&approval_status=denied" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/managed_licenses"
@@ -93,7 +93,7 @@ Example response:
{
"id": 1,
"name": "MIT",
- "approval_status": "approved"
+ "approval_status": "allowed"
}
```
@@ -128,7 +128,7 @@ PATCH /projects/:id/managed_licenses/:managed_license_id
| --------------- | ------- | --------------------------------- | ------------------------------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
| `managed_license_id` | integer/string | yes | The ID or URL-encoded name of the license belonging to the project |
-| `approval_status` | string | yes | The approval status of the license. "allowed" or "denied". "blacklisted" and "approved" are deprecated. |
+| `approval_status` | string | yes | The approval status of the license. "allowed" or "denied". |
```shell
curl --request PATCH --data "approval_status=denied" \
@@ -141,6 +141,6 @@ Example response:
{
"id": 1,
"name": "MIT",
- "approval_status": "blacklisted"
+ "approval_status": "denied"
}
```
diff --git a/doc/api/members.md b/doc/api/members.md
index 77a91436e6c..1db9714bfd1 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -367,6 +367,7 @@ Example response:
"web_url": "http://192.168.1.8:3000/root",
"last_activity_on": "2021-01-27",
"membership_type": "group_member",
+ "membership_state": "active",
"removable": true,
"created_at": "2021-01-03T12:16:02.000Z"
},
@@ -380,6 +381,7 @@ Example response:
"email": "john@example.com",
"last_activity_on": "2021-01-25",
"membership_type": "group_member",
+ "membership_state": "active",
"removable": true,
"created_at": "2021-01-04T18:46:42.000Z"
},
@@ -392,6 +394,7 @@ Example response:
"web_url": "http://192.168.1.8:3000/root",
"last_activity_on": "2021-01-20",
"membership_type": "group_invite",
+ "membership_state": "awaiting",
"removable": false,
"created_at": "2021-01-09T07:12:31.000Z"
}
@@ -480,6 +483,35 @@ DELETE /groups/:id/billable_members/:user_id
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/billable_members/:user_id"
```
+## Change membership state of a user in a group
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86705) in GitLab 15.0.
+
+Changes the membership state of a user in a group. The state is applied to
+all subgroups and projects.
+
+```plaintext
+PUT /groups/:id/members/:user_id/state
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) owned by the authenticated user. |
+| `user_id` | integer | yes | The user ID of the member. |
+| `state` | string | yes | The new state for the user. State is either `awaiting` or `active`. |
+
+```shell
+curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/members/:user_id/state?state=active"
+```
+
+Example response:
+
+```json
+{
+ "success":true
+}
+```
+
## Add a member to a group or project
Adds a member to a group or project.
diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md
index 721e4db3314..37a926366df 100644
--- a/doc/api/merge_request_approvals.md
+++ b/doc/api/merge_request_approvals.md
@@ -277,12 +277,7 @@ GET /projects/:id/approval_rules/:approval_rule_id
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11877) in GitLab 12.3.
> - Moved to GitLab Premium in 13.9.
-
-WARNING:
-The Vulnerability-Check feature, including the Vulnerability-Check attributes listed here, is in its
-end-of-life process. It is [deprecated](../update/deprecations.md#vulnerability-check)
-in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
-[Security Approval Policies](../user/application_security/policies/#scan-result-policy-editor).
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357300) the Vulnerability-Check feature in GitLab 15.0.
You can create project approval rules using the following endpoint:
@@ -301,11 +296,7 @@ POST /projects/:id/approval_rules
| `user_ids` | Array | no | The ids of users as approvers |
| `group_ids` | Array | no | The ids of groups as approvers |
| `protected_branch_ids` | Array | no | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
-| `report_type` | string | no | The report type required when the rule type is `report_approver`. The supported report types are: `vulnerability`, `license_scanning`, `code_coverage`. The `vulnerability` report type is part of the Vulnerability-Check feature, which deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `scanners` | Array | no | The security scanners the Vulnerability-Check approval rule considers. The supported scanners are: `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing`. Defaults to all supported scanners. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `severity_levels` | Array | no | The severity levels the Vulnerability-Check approval rule considers. The supported severity levels are: `info`, `unknown`, `low`, `medium`, `high`, `critical`. Defaults to `unknown`, `high`, and `critical`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `vulnerabilities_allowed` | integer | no | The number of vulnerabilities allowed for the Vulnerability-Check approval rule. Defaults to `0`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `vulnerability_states` | Array | no | The vulnerability states the Vulnerability-Check approval rule considers. The supported vulnerability states are: `newly_detected` (default), `detected`, `confirmed`, `resolved`, `dismissed`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
+| `report_type` | string | no | The report type required when the rule type is `report_approver`. The supported report types are: `license_scanning` and `code_coverage`.|
```json
{
@@ -409,12 +400,7 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" \
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11877) in GitLab 12.3.
> - Moved to GitLab Premium in 13.9.
-
-WARNING:
-The Vulnerability-Check feature, including the Vulnerability-Check attributes listed here, is in its
-end-of-life process. It is [deprecated](../update/deprecations.md#vulnerability-check)
-in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
-[Security Approval Policies](../user/application_security/policies/#scan-result-policy-editor).
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357300) the Vulnerability-Check feature in GitLab 15.0.
You can update project approval rules using the following endpoint:
@@ -435,10 +421,6 @@ PUT /projects/:id/approval_rules/:approval_rule_id
| `user_ids` | Array | no | The ids of users as approvers |
| `group_ids` | Array | no | The ids of groups as approvers |
| `protected_branch_ids` | Array | no | The IDs of protected branches to scope the rule by. To identify the ID, [use the API](protected_branches.md#list-protected-branches). |
-| `scanners` | Array | no | The security scanners the Vulnerability-Check approval rule considers. The supported scanners are: `sast`, `secret_detection`, `dependency_scanning`, `container_scanning`, `dast`, `coverage_fuzzing`, `api_fuzzing`. Defaults to all supported scanners. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `severity_levels` | Array | no | The severity levels the Vulnerability-Check approval rule considers. The supported severity levels are: `info`, `unknown`, `low`, `medium`, `high`, `critical`. Defaults to `unknown`, `high`, and `critical`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `vulnerabilities_allowed` | integer | no | The number of vulnerabilities allowed for the Vulnerability-Check approval rule. Defaults to `0`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
-| `vulnerability_states` | Array | no | The vulnerability states the Vulnerability-Check approval rule considers. The supported vulnerability states are: `newly_detected` (default), `detected`, `confirmed`, `resolved`, `dismissed`. Deprecated in GitLab 14.8, and planned for removal in GitLab 15.0. |
```json
{
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 0c065c0f2f5..abe9cb65f95 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -1103,8 +1103,8 @@ POST /projects/:id/merge_requests
| `target_branch` | string | yes | The target branch. |
| `title` | string | yes | Title of MR. |
| `assignee_id` | integer | no | Assignee user ID. |
-| `assignee_ids` | integer array | no | The ID of the user(s) to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
-| `reviewer_ids` | integer array | no | The ID of the user(s) added as a reviewer to the MR. If set to `0` or left empty, no reviewers are added. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
+| `assignee_ids` | integer array | no | The ID of the users to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
+| `reviewer_ids` | integer array | no | The ID of the users added as a reviewer to the MR. If set to `0` or left empty, no reviewers are added. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
| `description` | string | no | Description of MR. Limited to 1,048,576 characters. |
| `target_project_id` | integer | no | The target project (numeric ID). |
| `labels` | string | no | Labels for MR as a comma-separated list. |
@@ -1271,8 +1271,8 @@ PUT /projects/:id/merge_requests/:merge_request_iid
| `target_branch` | string | no | The target branch. |
| `title` | string | no | Title of MR. |
| `assignee_id` | integer | no | The ID of the user to assign the merge request to. Set to `0` or provide an empty value to unassign all assignees. |
-| `assignee_ids` | integer array | no | The ID of the user(s) to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
-| `reviewer_ids` | integer array | no | The ID of the user(s) set as a reviewer to the MR. Set the value to `0` or provide an empty value to unset all reviewers. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
+| `assignee_ids` | integer array | no | The ID of the users to assign the MR to. Set to `0` or provide an empty value to unassign all assignees. |
+| `reviewer_ids` | integer array | no | The ID of the users set as a reviewer to the MR. Set the value to `0` or provide an empty value to unset all reviewers. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
| `milestone_id` | integer | no | The global ID of a milestone to assign the merge request to. Set to `0` or provide an empty value to unassign a milestone.|
| `labels` | string | no | Comma-separated label names for a merge request. Set to an empty string to unassign all labels. |
| `add_labels` | string | no | Comma-separated label names to add to a merge request. |
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index 3c1e09eaace..48b6143a020 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -113,7 +113,9 @@ Parameters:
## Delete project milestone
-Only for users with the Developer role in the project.
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
+
+Only for users with at least the Reporter role in the project.
```plaintext
DELETE /projects/:id/milestones/:milestone_id
@@ -158,9 +160,9 @@ Parameters:
## Promote project milestone to a group milestone
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53861) in GitLab 11.9
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
-Only for users with the Developer role in the group.
+Only for users with at least the Reporter role in the group.
```plaintext
POST /projects/:id/milestones/:milestone_id/promote
diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md
index ad93d8033d0..aa9a86f33d5 100644
--- a/doc/api/oauth2.md
+++ b/doc/api/oauth2.md
@@ -33,7 +33,7 @@ Implicit grant and Resource Owner Password Credentials flows.
Refer to the [OAuth RFC](https://tools.ietf.org/html/rfc6749) to find out
how all those flows work and pick the right one for your use case.
-Both **authorization code** (with or without PKCE) and **implicit grant** flows require `application` to be
+Authorization code (with or without PKCE) flow requires `application` to be
registered first via the `/profile/applications` page in your user's account.
During registration, by enabling proper scopes, you can limit the range of
resources which the `application` can access. Upon creation, you obtain the
@@ -59,8 +59,6 @@ For development, GitLab allows insecure HTTP redirect URIs.
As OAuth 2.0 bases its security entirely on the transport layer, you should not use unprotected
URIs. For more information, see the [OAuth 2.0 RFC](https://tools.ietf.org/html/rfc6749#section-3.1.2.1)
and the [OAuth 2.0 Threat Model RFC](https://tools.ietf.org/html/rfc6819#section-4.4.2.1).
-These factors are particularly important when using the
-[Implicit grant flow](#implicit-grant-flow-deprecated), where actual credentials are included in the `redirect_uri`.
In the following sections you can find detailed instructions on how to obtain
authorization with each flow.
@@ -319,12 +317,13 @@ access_token = client.password.get_token('user@example.com', 'secret')
puts access_token.token
```
-### Implicit grant flow (DEPRECATED)
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
+
+### Implicit grant flow (removed)
-WARNING:
Implicit grant flow is inherently insecure and the IETF has removed it in [OAuth 2.1](https://oauth.net/2.1/).
-It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/288516) in GitLab 14.0, and is planned for
-[removal](https://gitlab.com/gitlab-org/gitlab/-/issues/344609) in GitLab 15.0.
+It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/288516) in GitLab 14.0 and is
+[removed](https://gitlab.com/gitlab-org/gitlab/-/issues/344609) in GitLab 15.0.
We recommend that you use [Authorization code with PKCE](#authorization-code-with-proof-key-for-code-exchange-pkce)
instead.
@@ -353,6 +352,8 @@ parameters, for example:
https://example.com/oauth/redirect#access_token=ABCDExyz123&state=YOUR_UNIQUE_STATE_HASH&token_type=bearer&expires_in=3600
```
+<!--- end_remove -->
+
## Access GitLab API with `access token`
The `access token` allows you to make requests to the API on behalf of a user.
diff --git a/doc/api/packages.md b/doc/api/packages.md
index 555b8d5e054..9d9c21546cd 100644
--- a/doc/api/packages.md
+++ b/doc/api/packages.md
@@ -14,6 +14,8 @@ This is the API documentation of [GitLab Packages](../administration/packages/in
Get a list of project packages. All package types are included in results. When
accessed without authentication, only packages of public projects are returned.
+By default, packages with `default` and `error` status are returned. Use the `status` parameter to view other
+packages.
```plaintext
GET /projects/:id/packages
@@ -27,7 +29,7 @@ GET /projects/:id/packages
| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, `helm`, `terraform_module`, or `golang`. (_Introduced in GitLab 12.9_)
| `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_Introduced in GitLab 12.9_)
| `include_versionless` | boolean | no | When set to true, versionless packages are included in the response. (_Introduced in GitLab 13.8_)
-| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, or `processing`. (_Introduced in GitLab 13.9_)
+| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, `processing`, `error`, or `pending_destruction`. (_Introduced in GitLab 13.9_)
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/:id/packages"
@@ -78,6 +80,8 @@ can result in malformed data or broken packages.
Get a list of project packages at the group level.
When accessed without authentication, only packages of public projects are returned.
+By default, packages with `default` and `error` status are returned. Use the `status` parameter to view other
+packages.
```plaintext
GET /groups/:id/packages
@@ -92,7 +96,7 @@ GET /groups/:id/packages
| `package_type` | string | no | Filter the returned packages by type. One of `conan`, `maven`, `npm`, `pypi`, `composer`, `nuget`, `helm`, or `golang`. (_Introduced in GitLab 12.9_) |
| `package_name` | string | no | Filter the project packages with a fuzzy search by name. (_[Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30980) in GitLab 13.0_)
| `include_versionless` | boolean | no | When set to true, versionless packages are included in the response. (_Introduced in GitLab 13.8_)
-| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, or `processing`. (_Introduced in GitLab 13.9_)
+| `status` | string | no | Filter the returned packages by status. One of `default` (default), `hidden`, `processing`, `error`, or `pending_destruction`. (_Introduced in GitLab 13.9_)
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/:id/packages?exclude_subgroups=false"
diff --git a/doc/api/pages_domains.md b/doc/api/pages_domains.md
index 610fd97c810..1c2cfef8e1b 100644
--- a/doc/api/pages_domains.md
+++ b/doc/api/pages_domains.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Pages domains API **(FREE)**
-Endpoints for connecting custom domain(s) and TLS certificates in [GitLab Pages](https://about.gitlab.com/stages-devops-lifecycle/pages/).
+Endpoints for connecting custom domains and TLS certificates in [GitLab Pages](https://about.gitlab.com/stages-devops-lifecycle/pages/).
The GitLab Pages feature must be enabled to use these endpoints. Find out more about [administering](../administration/pages/index.md) and [using](../user/project/pages/index.md) the feature.
diff --git a/doc/api/personal_access_tokens.md b/doc/api/personal_access_tokens.md
index b51866fe9b1..c49af2a745c 100644
--- a/doc/api/personal_access_tokens.md
+++ b/doc/api/personal_access_tokens.md
@@ -72,10 +72,17 @@ curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/a
## Revoke a personal access token
+Revoke a personal access token by either:
+
+- Using the ID of the personal access token.
+- Passing it to the API in a header.
+
+### Using a personal access token ID
+
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216004) in GitLab 13.3.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/270200) from GitLab Ultimate to GitLab Free in 13.6.
-Revoke a personal access token.
+Revoke a personal access token using its ID.
```plaintext
DELETE /personal_access_tokens/:id
@@ -92,10 +99,29 @@ Non-administrators can revoke their own tokens. Administrators can revoke tokens
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/personal_access_tokens/<personal_access_token_id>"
```
-### Responses
+#### Responses
+
+- `204: No Content` if successfully revoked.
+- `400: Bad Request` if not revoked successfully.
+
+### Using a request header
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/350240) in GitLab 15.0.
+
+Revokes a personal access token that is passed in using a request header.
+
+```plaintext
+DELETE /personal_access_tokens/self
+```
+
+```shell
+curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/personal_access_tokens/self"
+```
+
+#### Responses
- `204: No Content` if successfully revoked.
-- `400 Bad Request` if not revoked successfully.
+- `400: Bad Request` if not revoked successfully.
## Create a personal access token (administrator only)
diff --git a/doc/api/plan_limits.md b/doc/api/plan_limits.md
index 75c8d241513..0b6f89675d0 100644
--- a/doc/api/plan_limits.md
+++ b/doc/api/plan_limits.md
@@ -35,6 +35,14 @@ Example response:
```json
{
+ "ci_pipeline_size": 0,
+ "ci_active_jobs": 0,
+ "ci_active_pipelines": 0,
+ "ci_project_subscriptions": 2,
+ "ci_pipeline_schedules": 10,
+ "ci_needs_size_limit": 50,
+ "ci_registered_group_runners": 1000,
+ "ci_registered_project_runners": 1000,
"conan_max_file_size": 3221225472,
"generic_packages_max_file_size": 5368709120,
"helm_max_file_size": 5242880,
@@ -42,7 +50,8 @@ Example response:
"npm_max_file_size": 524288000,
"nuget_max_file_size": 524288000,
"pypi_max_file_size": 3221225472,
- "terraform_module_max_file_size": 1073741824
+ "terraform_module_max_file_size": 1073741824,
+ "storage_size_limit": 15000
}
```
@@ -57,6 +66,14 @@ PUT /application/plan_limits
| Attribute | Type | Required | Description |
| --------------------------------- | ------- | -------- | ----------- |
| `plan_name` | string | yes | Name of the plan to update. |
+| `ci_pipeline_size` | integer | no | Maximum number of jobs in a single pipeline. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_active_jobs` | integer | no | Total number of jobs in currently active pipelines. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_active_pipelines` | integer | no | Maximum number of active pipelines per project. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_project_subscriptions` | integer | no | Maximum number of pipeline subscriptions to and from a project. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_pipeline_schedules` | integer | no | Maximum number of pipeline schedules. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_needs_size_limit` | integer | no | Maximum number of [DAG](../ci/directed_acyclic_graph/index.md) dependencies that a job can have. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_registered_group_runners` | integer | no | Maximum number of runners registered per group. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
+| `ci_registered_project_runners` | integer | no | Maximum number of runners registered per project. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85895) in GitLab 15.0. |
| `conan_max_file_size` | integer | no | Maximum Conan package file size in bytes. |
| `generic_packages_max_file_size` | integer | no | Maximum generic package file size in bytes. |
| `helm_max_file_size` | integer | no | Maximum Helm chart file size in bytes. |
@@ -65,6 +82,7 @@ PUT /application/plan_limits
| `nuget_max_file_size` | integer | no | Maximum NuGet package file size in bytes. |
| `pypi_max_file_size` | integer | no | Maximum PyPI package file size in bytes. |
| `terraform_module_max_file_size` | integer | no | Maximum Terraform Module package file size in bytes. |
+| `storage_size_limit` | integer | no | Maximum storage size for the root namespace in megabytes. |
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/application/plan_limits?plan_name=default&conan_max_file_size=3221225472"
@@ -74,6 +92,14 @@ Example response:
```json
{
+ "ci_pipeline_size": 0,
+ "ci_active_jobs": 0,
+ "ci_active_pipelines": 0,
+ "ci_project_subscriptions": 2,
+ "ci_pipeline_schedules": 10,
+ "ci_needs_size_limit": 50,
+ "ci_registered_group_runners": 1000,
+ "ci_registered_project_runners": 1000,
"conan_max_file_size": 3221225472,
"generic_packages_max_file_size": 5368709120,
"helm_max_file_size": 5242880,
diff --git a/doc/api/project_clusters.md b/doc/api/project_clusters.md
index 437522b0946..5525000e336 100644
--- a/doc/api/project_clusters.md
+++ b/doc/api/project_clusters.md
@@ -302,7 +302,7 @@ Parameters:
NOTE:
`name`, `api_url`, `ca_cert` and `token` can only be updated if the cluster was added
-through the ["Add existing Kubernetes cluster"](../user/project/clusters/add_remove_clusters.md#add-existing-cluster) option or
+through the ["Add existing Kubernetes cluster"](../user/project/clusters/add_existing_cluster.md) option or
through the ["Add existing cluster to project"](#add-existing-cluster-to-project) endpoint.
Example request:
diff --git a/doc/api/project_import_export.md b/doc/api/project_import_export.md
index b9ebfa0fc5c..3f2cc09aa1e 100644
--- a/doc/api/project_import_export.md
+++ b/doc/api/project_import_export.md
@@ -49,6 +49,12 @@ curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitla
NOTE:
The upload request is sent with `Content-Type: application/gzip` header. Ensure that your pre-signed URL includes this as part of the signature.
+NOTE:
+As an administrator, you can modify the maximum export file size. By default,
+it is set to `0`, for unlimited. To change this value, edit `max_export_size`
+in the [Application settings API](settings.md#change-application-settings)
+or the [Admin UI](../user/admin_area/settings/account_and_limit_settings.md).
+
## Export status
Get the status of export.
@@ -184,7 +190,7 @@ requests.post(url, headers=headers, data=data, files=files)
NOTE:
The maximum import file size can be set by the Administrator, default is `0` (unlimited)..
-As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](settings.md#change-application-settings) or the [Admin UI](../user/admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8.
+As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](settings.md#change-application-settings) or the [Admin Area](../user/admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8.
## Import a file from a remote object storage
diff --git a/doc/api/projects.md b/doc/api/projects.md
index c40d39ee981..64a2e0d801b 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -36,6 +36,8 @@ There are three options for `merge_method` to choose from:
## List all projects
+> The `_links.cluster_agents` attribute in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 15.0.
+
Get a list of all visible projects across GitLab for the authenticated user.
When accessed without authentication, only public projects with _simple_ fields
are returned.
@@ -47,6 +49,7 @@ GET /projects
| Attribute | Type | Required | Description |
|--------------------------------------------|----------|------------------------|-------------|
| `archived` | boolean | **{dotted-circle}** No | Limit by archived status. |
+| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. (`deprecated`, it is [scheduled to be removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357401)) |
| `id_after` | integer | **{dotted-circle}** No | Limit results to projects with IDs greater than the specified ID. |
| `id_before` | integer | **{dotted-circle}** No | Limit results to projects with IDs less than the specified ID. |
| `imported` | boolean | **{dotted-circle}** No | Limit results to projects which were imported from external systems by current user. |
@@ -208,7 +211,8 @@ When the user is authenticated and `simple` is not set this returns something li
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
},
{
@@ -325,7 +329,8 @@ When the user is authenticated and `simple` is not set this returns something li
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
]
@@ -371,6 +376,8 @@ Keyset pagination supports only `order_by=id`. Other sorting options aren't avai
## List user projects
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Get a list of visible projects owned by the given user. When accessed without
authentication, only public projects are returned.
@@ -499,7 +506,8 @@ GET /users/:user_id/projects
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
},
{
@@ -616,7 +624,8 @@ GET /users/:user_id/projects
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
]
@@ -624,6 +633,8 @@ GET /users/:user_id/projects
## List projects starred by a user
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Get a list of visible projects starred by the given user. When accessed without
authentication, only public projects are returned.
@@ -744,7 +755,8 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
},
{
@@ -858,7 +870,8 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
]
@@ -866,6 +879,8 @@ Example response:
## Get single project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Get a specific project. This endpoint can be accessed without authentication if
the project is publicly accessible.
@@ -1032,7 +1047,8 @@ GET /projects/:id
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
```
@@ -1212,6 +1228,16 @@ where `password` is a public access key with the `api` scope enabled.
POST /projects
```
+Example request:
+
+```shell
+curl --request POST --header "PRIVATE-TOKEN: <your-token>" \
+ --header "Content-Type: application/json" --data '{
+ "name": "new_project", "description": "New Project", "path": "new_project",
+ "namespace_id": "42", "initialize_with_readme": "true"}' \
+ --url 'https://gitlab.example.com/api/v4/projects/'
+```
+
| Attribute | Type | Required | Description |
|-------------------------------------------------------------|---------|------------------------|-------------|
| `name` | string | **{check-circle}** Yes (if path isn't provided) | The name of the new project. Equals path if not provided. |
@@ -1224,7 +1250,6 @@ POST /projects
| `auto_devops_enabled` | boolean | **{dotted-circle}** No | Enable Auto DevOps for this project. |
| `autoclose_referenced_issues` | boolean | **{dotted-circle}** No | Set whether auto-closing referenced issues on default branch. |
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
-| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
@@ -1238,8 +1263,8 @@ POST /projects
| `external_authorization_classification_label` **(PREMIUM)** | string | **{dotted-circle}** No | The classification label for the project. |
| `forking_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `group_with_project_templates_id` **(PREMIUM)** | integer | **{dotted-circle}** No | For group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires `use_custom_template` to be true. |
-| `import_url` | string | **{dotted-circle}** No | URL to import repository from. |
-| `initialize_with_readme` | boolean | **{dotted-circle}** No | `false` by default. |
+| `import_url` | string | **{dotted-circle}** No | URL to import repository from. When this isn't empty, you must not set `initialize_with_readme` to `true`. Doing so might result in the [following error](https://gitlab.com/gitlab-org/gitlab/-/issues/360266): `not a git repository`. |
+| `initialize_with_readme` | boolean | **{dotted-circle}** No | Whether to create a Git repository with just a `README.md` file. Default is `false`. When this is true, you must not pass `import_url` or other attributes of this endpoint which specify alternative contents for the repository. Doing so might result in the [following error](https://gitlab.com/gitlab-org/gitlab/-/issues/360266): `not a git repository`. |
| `issues_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `issues_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable issues for this project. Use `issues_access_level` instead. |
| `jobs_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable jobs for this project. Use `builds_access_level` instead. |
@@ -1303,7 +1328,6 @@ POST /projects/user/:user_id
| `auto_devops_enabled` | boolean | **{dotted-circle}** No | Enable Auto DevOps for this project. |
| `autoclose_referenced_issues` | boolean | **{dotted-circle}** No | Set whether auto-closing referenced issues on default branch. |
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
-| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
@@ -1392,7 +1416,6 @@ Supported attributes:
| `auto_devops_enabled` | boolean | **{dotted-circle}** No | Enable Auto DevOps for this project. |
| `autoclose_referenced_issues` | boolean | **{dotted-circle}** No | Set whether auto-closing referenced issues on default branch. |
| `avatar` | mixed | **{dotted-circle}** No | Image file for avatar of the project. |
-| `build_coverage_regex` | string | **{dotted-circle}** No | Test coverage parsing. |
| `build_git_strategy` | string | **{dotted-circle}** No | The Git strategy. Defaults to `fetch`. |
| `build_timeout` | integer | **{dotted-circle}** No | The maximum amount of time, in seconds, that a job can run. |
| `builds_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
@@ -1407,7 +1430,7 @@ Supported attributes:
| `emails_disabled` | boolean | **{dotted-circle}** No | Disable email notifications. |
| `external_authorization_classification_label` **(PREMIUM)** | string | **{dotted-circle}** No | The classification label for the project. |
| `forking_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
-| `import_url` | string | **{dotted-circle}** No | URL to import repository from. |
+| `import_url` | string | **{dotted-circle}** No | URL the repository was imported from. |
| `issues_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. |
| `issues_enabled` | boolean | **{dotted-circle}** No | _(Deprecated)_ Enable issues for this project. Use `issues_access_level` instead. |
| `issues_template` **(PREMIUM)** | string | **{dotted-circle}** No | Default description for Issues. Description is parsed with GitLab Flavored Markdown. See [Templates for issues and merge requests](#templates-for-issues-and-merge-requests). |
@@ -1483,6 +1506,8 @@ POST /projects/:id/fork
## List forks of a project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
List the projects accessible to the calling user that have an established,
forked relationship with the specified project
@@ -1585,7 +1610,8 @@ Example responses:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
]
@@ -1593,6 +1619,8 @@ Example responses:
## Star a project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Stars a given project. Returns status code `304` if the project is already
starred.
@@ -1688,13 +1716,16 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
```
## Unstar a project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Unstars a given project. Returns status code `304` if the project is not starred.
```plaintext
@@ -1789,7 +1820,8 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
```
@@ -1869,6 +1901,8 @@ Example response:
## Archive a project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Archives the project if the user is either an administrator or the owner of this
project. This action is idempotent, thus archiving an already archived project
does not change the project.
@@ -1984,13 +2018,16 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
```
## Unarchive a project
+> The `_links.cluster_agents` attribute in the response [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 14.10.
+
Unarchives the project if the user is either an administrator or the owner of
this project. This action is idempotent, thus unarchiving a non-archived project
doesn't change the project.
@@ -2106,7 +2143,8 @@ Example response:
"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"
+ "members": "http://example.com/api/v4/projects/1/members",
+ "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents"
}
}
```
@@ -2507,7 +2545,7 @@ POST /projects/:id/housekeeping
### Get project push rules
-Get the [push rules](../user/project/repository/push_rules.md#enabling-push-rules) of a
+Get the [push rules](../user/project/repository/push_rules.md) of a
project.
```plaintext
@@ -2614,6 +2652,8 @@ DELETE /projects/:id/push_rule
## Transfer a project to a new namespace
+> 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)
for prerequisites to transfer a project.
@@ -2718,7 +2758,7 @@ Example response:
"public_jobs": true,
"build_timeout": 3600,
"auto_cancel_pending_pipelines": "enabled",
- "build_coverage_regex": null,
+ "build_coverage_regex": null, // deprecated, it is scheduled to be removed https://gitlab.com/gitlab-org/gitlab/-/issues/357401
"ci_config_path": null,
"shared_with_groups": [],
"only_allow_merge_if_pipeline_succeeds": false,
diff --git a/doc/api/protected_environments.md b/doc/api/protected_environments.md
index fc7eb5caf6d..fa099afd680 100644
--- a/doc/api/protected_environments.md
+++ b/doc/api/protected_environments.md
@@ -20,6 +20,16 @@ Currently, these levels are recognized:
60 => Admin access
```
+## Group inheritance types
+
+Group inheritance allows deploy access levels and access rules to take inherited group membership into account. The group inheritance types are defined by `ProtectedEnvironments::Authorizable::GROUP_INHERITANCE_TYPE`.
+The following types are recognized:
+
+```plaintext
+0 => Direct group membership only (default)
+1 => All inherited groups
+```
+
## List protected environments
Gets a list of protected environments from a project:
@@ -47,7 +57,8 @@ Example response:
"access_level":40,
"access_level_description":"Maintainers",
"user_id":null,
- "group_id":null
+ "group_id":null,
+ "group_inheritance_type": 0
}
],
"required_approval_count": 0
@@ -82,7 +93,8 @@ Example response:
"access_level": 40,
"access_level_description": "Maintainers",
"user_id": null,
- "group_id": null
+ "group_id": null,
+ "group_inheritance_type": 0
}
],
"required_approval_count": 0
@@ -114,7 +126,8 @@ curl --header 'Content-Type: application/json' --request POST \
Elements in the `deploy_access_levels` and `approval_rules` array should be one of `user_id`, `group_id` or
`access_level`, and take the form `{user_id: integer}`, `{group_id: integer}` or
-`{access_level: integer}`.
+`{access_level: integer}`. Optionally you can specify the `group_inheritance_type` on each as one of the [valid group inheritance types](#group-inheritance-types).
+
Each user must have access to the project and each group must [have this project shared](../user/project/members/share_project_with_groups.md).
Example response:
@@ -127,7 +140,8 @@ Example response:
"access_level": 40,
"access_level_description": "protected-access-group",
"user_id": null,
- "group_id": 9899826
+ "group_id": 9899826,
+ "group_inheritance_type": 0
}
],
"required_approval_count": 0,
@@ -137,14 +151,16 @@ Example response:
"group_id": 134,
"access_level": null,
"access_level_description": "qa-group",
- "required_approvals": 1
+ "required_approvals": 1,
+ "group_inheritance_type": 0
},
{
"user_id": null,
"group_id": 135,
"access_level": null,
"access_level_description": "security-group",
- "required_approvals": 2
+ "required_approvals": 2,
+ "group_inheritance_type": 0
}
]
}
diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md
index 1fdc48a6d92..8097fecea87 100644
--- a/doc/api/repository_files.md
+++ b/doc/api/repository_files.md
@@ -100,11 +100,14 @@ Allows you to receive blame information. Each blame range contains lines and cor
GET /projects/:id/repository/files/:file_path/blame
```
-| Attribute | Type | Required | Description |
-|-------------|----------------|----------|-----------------------------------------------------------------------------------------------------------------|
-| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
-| `file_path` | string | yes | URL encoded full path to new file. Ex. `lib%2Fclass%2Erb`. |
-| `ref` | string | yes | The name of branch, tag or commit |
+| Attribute | Type | Required | Description |
+|-----------------|-------------------|----------|--------------------------------------------------------------------------------------------------------------|
+| `id` | integer or string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+| `file_path` | string | yes | URL encoded full path to new file. Ex. `lib%2Fclass%2Erb`. |
+| `ref` | string | yes | The name of branch, tag or commit |
+| `range` | hash | no | Blame range |
+| `range[start]` | integer | yes | The first line of the range to blame |
+| `range[end]` | integer | yes | The last line of the range to blame |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master"
@@ -163,6 +166,41 @@ X-Gitlab-Execute-Filemode: false
...
```
+### Examples
+
+To request a blame range, specify `range[start]` and `range[end]` parameters with the start and end line numbers of the file.
+
+```shell
+curl --head --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/13083/repository/files/path%2Fto%2Ffile.rb/blame?ref=master&range[start]=1&range[end]=2"
+```
+
+Example response:
+
+```json
+[
+ {
+ "commit": {
+ "id": "d42409d56517157c48bf3bd97d3f75974dde19fb",
+ "message": "Add feature\n\nalso fix bug\n",
+ "parent_ids": [
+ "cc6e14f9328fa6d7b5a0d3c30dc2002a3f2a3822"
+ ],
+ "authored_date": "2015-12-18T08:12:22.000Z",
+ "author_name": "John Doe",
+ "author_email": "john.doe@example.com",
+ "committed_date": "2015-12-18T08:12:22.000Z",
+ "committer_name": "John Doe",
+ "committer_email": "john.doe@example.com"
+ },
+ "lines": [
+ "require 'fileutils'",
+ "require 'open3'"
+ ]
+ },
+ ...
+]
+```
+
## Get raw file from repository
```plaintext
diff --git a/doc/api/resource_access_tokens.md b/doc/api/resource_access_tokens.md
deleted file mode 100644
index a9c43625193..00000000000
--- a/doc/api/resource_access_tokens.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'project_access_tokens.md'
-remove_date: '2022-04-06'
----
-
-This document was moved to [another location](project_access_tokens.md).
-
-<!-- This redirect file can be deleted after <2022-04-06>. -->
-<!-- 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/api/resource_groups.md b/doc/api/resource_groups.md
index 237ba6e7d72..f70ad2f09e7 100644
--- a/doc/api/resource_groups.md
+++ b/doc/api/resource_groups.md
@@ -8,6 +8,34 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can read more about [controlling the job concurrency with resource groups](../ci/resource_groups/index.md).
+## Get all resource groups for a project
+
+```plaintext
+GET /projects/:id/resource_groups
+```
+
+| Attribute | Type | Required | Description |
+|-----------|---------|----------|---------------------|
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user |
+
+```shell
+curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/resource_groups"
+```
+
+Example of response
+
+```json
+[
+ {
+ "id": 3,
+ "key": "production",
+ "process_mode": "unordered",
+ "created_at": "2021-09-01T08:04:59.650Z",
+ "updated_at": "2021-09-01T08:04:59.650Z"
+ }
+]
+```
+
## Get a specific resource group
```plaintext
diff --git a/doc/api/runners.md b/doc/api/runners.md
index 304f2494f70..7519c3595b6 100644
--- a/doc/api/runners.md
+++ b/doc/api/runners.md
@@ -44,13 +44,13 @@ GET /runners?paused=true
GET /runners?tag_list=tag1,tag2
```
-| Attribute | Type | Required | Description |
-|------------|--------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online` and `offline`; showing all runners if none provided |
-| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
-| `status` | string | no | The status of runners to show, one of: `online`, `offline` and `not_connected`. `active` and `paused` are also possible values which were deprecated in GitLab 14.8 and will be removed in GitLab 16.0 |
-| `paused` | boolean | no | Whether to include only runners that are accepting or ignoring new jobs |
-| `tag_list` | string array | no | List of the runner's tags |
+| Attribute | Type | Required | Description |
+|------------|--------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `scope` | string | no | Deprecated: Use `type` or `status` instead. The scope of specific runners to show, one of: `active`, `paused`, `online` and `offline`; showing all runners if none provided |
+| `type` | string | no | The type of runners to show, one of: `instance_type`, `group_type`, `project_type` |
+| `status` | string | no | The status of runners to show, one of: `online`, `offline` and `never_contacted`. `active` and `paused` are also possible values which were deprecated in GitLab 14.8 and will be removed in GitLab 16.0 |
+| `paused` | boolean | no | Whether to include only runners that are accepting or ignoring new jobs |
+| `tag_list` | string array | no | List of the runner's tags |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/runners"
@@ -610,7 +610,7 @@ Example response:
"runner_type": "instance_type",
"name": "gitlab-runner",
"online": null,
- "status": "not_connected"
+ "status": "never_contacted"
},
{
"id": 6,
@@ -634,7 +634,7 @@ Example response:
"runner_type": "group_type",
"name": "gitlab-runner",
"online": null,
- "status": "not_connected"
+ "status": "never_contacted"
}
]
```
@@ -651,7 +651,7 @@ POST /runners
|--------------------|--------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `token` | string | yes | [Registration token](#registration-and-authentication-tokens) |
| `description` | string | no | Runner's description |
-| `info` | hash | no | Runner's metadata. You can include `name`, `version`, `revision`, `platform`, and `architecture`, but only `version` is displayed in the Admin area of the UI |
+| `info` | hash | no | Runner's metadata. You can include `name`, `version`, `revision`, `platform`, and `architecture`, but only `version` is displayed in the Admin Area of the UI |
| `active` | boolean | no | Deprecated: Use `:paused` instead. Whether the runner is allowed to receive jobs |
| `paused` | boolean | no | Whether the runner should ignore new jobs |
| `locked` | boolean | no | Whether the runner should be locked for current project |
diff --git a/doc/api/secure_files.md b/doc/api/secure_files.md
index 7d30cc0c4c7..3532b5a7aeb 100644
--- a/doc/api/secure_files.md
+++ b/doc/api/secure_files.md
@@ -11,7 +11,7 @@ type: reference, api
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_secure_files`. Limited to 100 secure files per project. Files must be smaller than 5 MB. The feature is not ready for production use.
+ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `ci_secure_files`. Limited to 100 secure files per project. Files must be smaller than 5 MB. The feature is not ready for production use.
## List project secure files
@@ -42,7 +42,6 @@ Example response:
"name": "myfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
"checksum_algorithm": "sha256",
- "permissions": "read_only",
"created_at": "2022-02-22T22:22:22.222Z"
},
{
@@ -50,7 +49,6 @@ Example response:
"name": "myotherfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aa2",
"checksum_algorithm": "sha256",
- "permissions": "execute",
"created_at": "2022-02-22T22:22:22.222Z"
}
]
@@ -85,7 +83,6 @@ Example response:
"name": "myfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
"checksum_algorithm": "sha256",
- "permissions": "read_only",
"created_at": "2022-02-22T22:22:22.222Z"
}
```
@@ -105,7 +102,6 @@ Supported attributes:
| `project_id` | integer/string | **{check-circle}** Yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `name` | string | **{check-circle}** Yes | The `name` of the file being uploaded. The file name must be unique within the project. |
| `file` | file | **{check-circle}** Yes | The `file` being uploaded (5 MB limit). |
-| `permissions` | string | **{dotted-circle}** No | The file is created with the specified permissions when created in the CI/CD job. Available types are: `read_only` (default), `read_write`, and `execute`. |
Example request:
@@ -122,7 +118,6 @@ Example response:
"name": "myfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
"checksum_algorithm": "sha256",
- "permissions": "read_only",
"created_at": "2022-02-22T22:22:22.222Z"
}
```
diff --git a/doc/api/settings.md b/doc/api/settings.md
index cc9df7917e2..193f18779f5 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -36,6 +36,7 @@ Example response:
"password_authentication_enabled_for_web" : true,
"after_sign_out_path" : null,
"max_attachment_size" : 10,
+ "max_export_size": 50,
"max_import_size": 50,
"user_oauth_applications" : true,
"updated_at" : "2016-01-04T15:44:55.176Z",
@@ -103,7 +104,7 @@ Example response:
```
Users on [GitLab Premium or Ultimate](https://about.gitlab.com/pricing/) may also see
-the `file_template_project_id`, `delayed_project_deletion`, `deletion_adjourned_period`, or the `geo_node_allowed_ips` parameters:
+the `file_template_project_id`, `delayed_project_deletion`, `delayed_group_deletion`, `deletion_adjourned_period`, or the `geo_node_allowed_ips` parameters:
```json
{
@@ -112,6 +113,7 @@ the `file_template_project_id`, `delayed_project_deletion`, `deletion_adjourned_
"file_template_project_id": 1,
"geo_node_allowed_ips": "0.0.0.0/0, ::/0",
"delayed_project_deletion": false,
+ "delayed_group_deletion": false,
"deletion_adjourned_period": 7,
...
}
@@ -146,6 +148,7 @@ Example response:
"default_branch_protection": 2,
"restricted_visibility_levels": [],
"max_attachment_size": 10,
+ "max_export_size": 50,
"max_import_size": 50,
"session_expire_delay": 10080,
"default_ci_config_path" : null,
@@ -216,7 +219,8 @@ these parameters:
- `file_template_project_id`
- `geo_node_allowed_ips`
- `geo_status_timeout`
-- `delayed_project_delection`
+- `delayed_project_deletion`
+- `delayed_group_deletion`
- `deletion_adjourned_period`
Example responses: **(PREMIUM SELF)**
@@ -249,8 +253,8 @@ listed in the descriptions of the relevant settings.
| `asset_proxy_enabled` | boolean | no | (**If enabled, requires:** `asset_proxy_url`) Enable proxying of assets. GitLab restart is required to apply changes. |
| `asset_proxy_secret_key` | string | no | Shared secret with the asset proxy server. GitLab restart is required to apply changes. |
| `asset_proxy_url` | string | no | URL of the asset proxy server. GitLab restart is required to apply changes. |
-| `asset_proxy_whitelist` | string or array of strings | no | (Deprecated: Use `asset_proxy_allowlist` instead) Assets that match these domain(s) are **not** proxied. Wildcards allowed. Your GitLab installation URL is automatically allowlisted. GitLab restart is required to apply changes. |
-| `asset_proxy_allowlist` | string or array of strings | no | Assets that match these domain(s) are **not** proxied. Wildcards allowed. Your GitLab installation URL is automatically allowlisted. GitLab restart is required to apply changes. |
+| `asset_proxy_whitelist` | string or array of strings | no | (Deprecated: Use `asset_proxy_allowlist` instead) Assets that match these domains are **not** proxied. Wildcards allowed. Your GitLab installation URL is automatically allowlisted. GitLab restart is required to apply changes. |
+| `asset_proxy_allowlist` | string or array of strings | no | Assets that match these domains are **not** proxied. Wildcards allowed. Your GitLab installation URL is automatically allowlisted. GitLab restart is required to apply changes. |
| `authorized_keys_enabled` | boolean | no | By default, we write to the `authorized_keys` file to support Git over SSH without additional configuration. GitLab can be optimized to authenticate SSH keys via the database file. Only disable this if you have configured your OpenSSH server to use the AuthorizedKeysCommand. |
| `auto_devops_domain` | string | no | Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages. |
| `auto_devops_enabled` | boolean | no | Enable Auto DevOps for projects by default. It automatically builds, tests, and deploys applications based on a predefined CI/CD configuration. |
@@ -274,8 +278,9 @@ listed in the descriptions of the relevant settings.
| `default_projects_limit` | integer | no | Project limit per user. Default is `100000`. |
| `default_snippet_visibility` | string | no | What visibility level new snippets receive. Can take `private`, `internal` and `public` as a parameter. Default is `private`. |
| `delayed_project_deletion` **(PREMIUM SELF)** | boolean | no | Enable delayed project deletion by default in new groups. Default is `false`. |
-| `delete_inactive_projects` | boolean | no | Enable inactive project deletion feature. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
-| `deletion_adjourned_period` **(PREMIUM SELF)** | integer | no | The number of days to wait before deleting a project or group that is marked for deletion. Value must be between 0 and 90.
+| `delayed_group_deletion` **(PREMIUM SELF)** | boolean | no | Enable delayed group deletion by default in new groups. Requires both `delayed_group_deletion` to be true and `deletion_adjourned_period` to be greater than 0. Default is `true`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/352959) in GitLab 15.0. |
+| `delete_inactive_projects` | boolean | no | Enable inactive project deletion feature. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. [Became operational](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0 (with feature flag `inactive_projects_deletion`, disabled by default). |
+| `deletion_adjourned_period` **(PREMIUM SELF)** | integer | no | The number of days to wait before deleting a project or group that is marked for deletion. Value must be between 0 and 90. On every update, a hook on `deletion_adjourned_period` sets the value of `delayed_group_deletion` to `true` if `deletion_adjourned_period` is greater than 0 and `false` if `deletion_adjourned_period` is 0.
| `diff_max_patch_bytes` | integer | no | Maximum [diff patch size](../user/admin_area/diff_limits.md), in bytes. |
| `diff_max_files` | integer | no | Maximum [files in a diff](../user/admin_area/diff_limits.md). |
| `diff_max_lines` | integer | no | Maximum [lines in a diff](../user/admin_area/diff_limits.md). |
@@ -283,7 +288,7 @@ listed in the descriptions of the relevant settings.
| `disabled_oauth_sign_in_sources` | array of strings | no | Disabled OAuth sign-in sources. |
| `dns_rebinding_protection_enabled` | boolean | no | Enforce DNS rebinding attack protection. |
| `domain_denylist_enabled` | boolean | no | (**If enabled, requires:** `domain_denylist`) Allows blocking sign-ups from emails from specific domains. |
-| `domain_denylist` | array of strings | no | Users with email addresses that match these domain(s) **cannot** sign up. Wildcards allowed. Use separate lines for multiple entries. Ex: `domain.com`, `*.domain.com`. |
+| `domain_denylist` | array of strings | no | Users with email addresses that match these domains **cannot** sign up. Wildcards allowed. Use separate lines for multiple entries. Ex: `domain.com`, `*.domain.com`. |
| `domain_allowlist` | array of strings | no | Force people to use only corporate emails for sign-up. Default is `null`, meaning there is no restriction. |
| `dsa_key_restriction` | integer | no | The minimum allowed bit length of an uploaded DSA key. Default is `0` (no restriction). `-1` disables DSA keys. |
| `ecdsa_key_restriction` | integer | no | The minimum allowed curve size (in bits) of an uploaded ECDSA key. Default is `0` (no restriction). `-1` disables ECDSA keys. |
@@ -351,9 +356,9 @@ listed in the descriptions of the relevant settings.
| `html_emails_enabled` | boolean | no | Enable HTML emails. |
| `import_sources` | array of strings | no | Sources to allow project import from, possible values: `github`, `bitbucket`, `bitbucket_server`, `gitlab`, `fogbugz`, `git`, `gitlab_project`, `gitea`, `manifest`, and `phabricator`. |
| `in_product_marketing_emails_enabled` | boolean | no | Enable [in-product marketing emails](../user/profile/notifications.md#global-notification-settings). Enabled by default. |
-| `inactive_projects_delete_after_months` | integer | no | If `delete_inactive_projects` is `true`, the time (in months) to wait before deleting inactive projects. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
-| `inactive_projects_min_size_mb` | integer | no | If `delete_inactive_projects` is `true`, the minimum repository size for projects to be checked for inactivity. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
-| `inactive_projects_send_warning_email_after_months` | integer | no | If `delete_inactive_projects` is `true`, sets the time (in months) to wait before emailing maintainers that the project will be deleted because it is inactive. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. |
+| `inactive_projects_delete_after_months` | integer | no | If `delete_inactive_projects` is `true`, the time (in months) to wait before deleting inactive projects. Default is `2`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. [Became operational](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0. |
+| `inactive_projects_min_size_mb` | integer | no | If `delete_inactive_projects` is `true`, the minimum repository size for projects to be checked for inactivity. Default is `0`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. [Became operational](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0. |
+| `inactive_projects_send_warning_email_after_months` | integer | no | If `delete_inactive_projects` is `true`, sets the time (in months) to wait before emailing maintainers that the project is scheduled be deleted because it is inactive. Default is `1`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84519) in GitLab 14.10. [Became operational](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85689) in GitLab 15.0. |
| `invisible_captcha_enabled` | boolean | no | Enable Invisible CAPTCHA spam detection during sign-up. Disabled by default. |
| `issues_create_limit` | integer | no | Max number of issue creation requests per minute per user. Disabled by default.|
| `keep_latest_artifact` | boolean | no | Prevent the deletion of the artifacts from the most recent successful jobs, regardless of the expiry time. Enabled by default. |
@@ -364,9 +369,10 @@ listed in the descriptions of the relevant settings.
| `maintenance_mode` **(PREMIUM)** | boolean | no | When instance is in maintenance mode, non-administrative users can sign in with read-only access and make read-only API requests. |
| `max_artifacts_size` | integer | no | Maximum artifacts size in MB. |
| `max_attachment_size` | integer | no | Limit attachment size in MB. |
+| `max_export_size` | integer | no | Maximum export size in MB. 0 for unlimited. Default = 0 (unlimited). |
| `max_import_size` | integer | no | Maximum import size in MB. 0 for unlimited. Default = 0 (unlimited) [Modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8. |
| `max_pages_size` | integer | no | Maximum size of pages repositories in MB. |
-| `max_personal_access_token_lifetime` **(ULTIMATE SELF)** | integer | no | Maximum allowable lifetime for personal access tokens in days. |
+| `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. |
| `mirror_available` | boolean | no | Allow repository mirroring to configured by project Maintainers. If disabled, only Administrators can configure repository mirroring. |
@@ -383,13 +389,13 @@ listed in the descriptions of the relevant settings.
| `performance_bar_allowed_group_path` | string | no | Path of the group that is allowed to toggle the performance bar. |
| `performance_bar_enabled` | boolean | no | (Deprecated: Pass `performance_bar_allowed_group_path: nil` instead) Allow enabling the performance bar. |
| `personal_access_token_prefix` | string | no | Prefix for all generated personal access tokens. |
+| `pipeline_limit_per_project_user_sha` | integer | no | Maximum number of pipeline creation requests per minute per user and commit. Disabled by default. |
| `plantuml_enabled` | boolean | no | (**If enabled, requires:** `plantuml_url`) Enable PlantUML integration. Default is `false`. |
| `plantuml_url` | string | required by: `plantuml_enabled` | The PlantUML instance URL for integration. |
| `polling_interval_multiplier` | decimal | no | Interval multiplier used by endpoints that perform polling. Set to `0` to disable polling. |
| `project_export_enabled` | boolean | no | Enable project export. |
| `prometheus_metrics_enabled` | boolean | no | Enable Prometheus metrics. |
| `protected_ci_variables` | boolean | no | CI/CD variables are protected by default. |
-| `pseudonymizer_enabled` **(PREMIUM)** | boolean | no | When enabled, GitLab runs a background job that produces pseudonymized CSVs of the GitLab database to upload to your configured object storage directory.
| `push_event_activities_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether individual push events or bulk push events are created. [Bulk push events are created](../user/admin_area/settings/push_event_activities_limit.md) if it surpasses that value. |
| `push_event_hooks_limit` | integer | no | Number of changes (branches or tags) in a single push to determine whether webhooks and services fire or not. Webhooks and services aren't submitted if it surpasses that value. |
| `rate_limiting_response_text` | string | no | When rate limiting is enabled via the `throttle_*` settings, send this plain text response when a rate limit is exceeded. 'Retry later' is sent if this is blank. |
@@ -423,6 +429,7 @@ listed in the descriptions of the relevant settings.
| `slack_app_enabled` **(PREMIUM)** | boolean | no | (**If enabled, requires:** `slack_app_id`, `slack_app_secret` and `slack_app_secret`) Enable Slack app. |
| `slack_app_id` **(PREMIUM)** | string | required by: `slack_app_enabled` | The app ID of the Slack-app. |
| `slack_app_secret` **(PREMIUM)** | string | required by: `slack_app_enabled` | The app secret of the Slack-app. |
+| `slack_app_signing_secret` **(PREMIUM)** | string | no | The signing secret of the Slack-app. |
| `slack_app_verification_token` **(PREMIUM)** | string | required by: `slack_app_enabled` | The verification token of the Slack-app. |
| `snippet_size_limit` | integer | no | Max snippet content size in **bytes**. Default: 52428800 Bytes (50MB).|
| `snowplow_app_id` | string | no | The Snowplow site name / application ID. (for example, `gitlab`) |
diff --git a/doc/api/status_checks.md b/doc/api/status_checks.md
index 3671ddbd138..92e003bf80d 100644
--- a/doc/api/status_checks.md
+++ b/doc/api/status_checks.md
@@ -31,7 +31,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/status_checks
"id": 2,
"name": "Rule 1",
"external_url": "https://gitlab.com/test-endpoint",
- "status": "pass"
+ "status": "passed"
},
{
"id": 1,
@@ -47,11 +47,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/status_checks
> - Introduced in GitLab 14.9, `passed` status to pass external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
> - Introduced in GitLab 14.9, `failed` status to fail external status checks. Introduced [with a flag](../administration/feature_flags.md) named `status_checks_add_status_field`. Disabled by default.
> - `pass` status to pass checks is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/339039) in GitLab 14.9. Replaced with `passed`.
-
-FLAG:
-On self-managed GitLab, by default setting `passed` instead of `pass` is unavailable. Also, setting `failed` is unavailable by default. To support
-setting `passed` and `failed` instead of only `pass`, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named
-`status_checks_add_status_field`. On GitLab.com, this feature is not available.
+> - Support for `failed` and `passed` [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/353836) in GitLab 15.0 and feature flag removed.
For a single merge request, use the API to inform GitLab that a merge request has passed a check by an external service.
To set the status of an external check, the personal access token used must belong to a user with at least the Developer role on the target project of the merge request.
@@ -64,14 +60,13 @@ POST /projects/:id/merge_requests/:merge_request_iid/status_check_responses
**Parameters:**
-| Attribute | Type | Required | Description |
-| -------------------------- | ------- | -------- | ---------------------------------------------------------------------------- |
-| `id` | integer | yes | ID of a project |
-| `merge_request_iid` | integer | yes | IID of a merge request |
-| `sha` | string | yes | SHA at `HEAD` of the source branch |
-| `external_status_check_id` | integer | yes | ID of an external status check |
-| `status` | string | no | Set to `passed` to pass the check or `failed` to fail it (GitLab 14.9 and later with feature flag `status_checks_add_status_field` enabled) |
-| `status` | string | no | Set to `pass` to pass the check (GitLab 14.0 to GitLab 14.8, and GitLab 14.9 and later with feature flag `status_checks_add_status_field` disabled) |
+| Attribute | Type | Required | Description |
+| -------------------------- | ------- | -------- |----------------------------------------------------------|
+| `id` | integer | yes | ID of a project |
+| `merge_request_iid` | integer | yes | IID of a merge request |
+| `sha` | string | yes | SHA at `HEAD` of the source branch |
+| `external_status_check_id` | integer | yes | ID of an external status check |
+| `status` | string | no | Set to `passed` to pass the check or `failed` to fail it |
NOTE:
`sha` must be the SHA at the `HEAD` of the merge request's source branch.
diff --git a/doc/api/topics.md b/doc/api/topics.md
index 1246e36f2cb..78f32fb8fa0 100644
--- a/doc/api/topics.md
+++ b/doc/api/topics.md
@@ -38,21 +38,24 @@ Example response:
[
{
"id": 1,
- "name": "GitLab",
+ "name": "gitlab",
+ "title": "GitLab",
"description": "GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more.",
"total_projects_count": 1000,
"avatar_url": "http://www.gravatar.com/avatar/a0d477b3ea21970ce6ffcbb817b0b435?s=80&d=identicon"
},
{
"id": 3,
- "name": "Git",
+ "name": "git",
+ "title": "Git",
"description": "Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.",
"total_projects_count": 900,
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon"
},
{
"id": 2,
- "name": "Git LFS",
+ "name": "git-lfs",
+ "title": "Git LFS",
"description": null,
"total_projects_count": 300,
"avatar_url": null
@@ -85,7 +88,8 @@ Example response:
```json
{
"id": 1,
- "name": "GitLab",
+ "name": "gitlab",
+ "title": "GitLab",
"description": "GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more.",
"total_projects_count": 1000,
"avatar_url": "http://www.gravatar.com/avatar/a0d477b3ea21970ce6ffcbb817b0b435?s=80&d=identicon"
@@ -112,7 +116,8 @@ Supported attributes:
| Attribute | Type | Required | Description |
| ------------- | ------- | ---------------------- | ----------- |
-| `name` | string | **{check-circle}** Yes | Name |
+| `name` | string | **{check-circle}** Yes | Slug (name) |
+| `title` | string | **{check-circle}** Yes | Title |
| `avatar` | file | **{dotted-circle}** No | Avatar |
| `description` | string | **{dotted-circle}** No | Description |
@@ -120,7 +125,7 @@ Example request:
```shell
curl --request POST \
- --data "name=topic1" \
+ --data "name=topic1&title=Topic 1" \
--header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/topics"
```
@@ -131,6 +136,7 @@ Example response:
{
"id": 1,
"name": "topic1",
+ "title": "Topic 1",
"description": null,
"total_projects_count": 0,
"avatar_url": null
@@ -152,7 +158,8 @@ Supported attributes:
| `id` | integer | **{check-circle}** Yes | ID of project topic |
| `avatar` | file | **{dotted-circle}** No | Avatar |
| `description` | string | **{dotted-circle}** No | Description |
-| `name` | string | **{dotted-circle}** No | Name |
+| `name` | string | **{dotted-circle}** No | Slug (name) |
+| `title` | string | **{dotted-circle}** No | Title |
Example request:
@@ -169,6 +176,7 @@ Example response:
{
"id": 1,
"name": "topic1",
+ "title": "Topic 1",
"description": null,
"total_projects_count": 0,
"avatar_url": null
diff --git a/doc/api/users.md b/doc/api/users.md
index 7b4962735e6..5e41a0f6258 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -105,7 +105,7 @@ parameter `without_project_bots=true`.
GET /users?without_project_bots=true
```
-### For admins
+### For administrators
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -309,11 +309,12 @@ Parameters:
"work_information": null,
"followers": 1,
"following": 1,
- "local_time": "3:38 PM"
+ "local_time": "3:38 PM",
+ "is_followed": false
}
```
-### For admin
+### For administrator
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -452,7 +453,7 @@ Parameters:
| Attribute | Required | Description |
| :----------------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `admin` | No | User is admin - true or false (default) |
+| `admin` | No | User is an administrator - true or false (default) |
| `avatar` | No | Image file for user's avatar |
| `bio` | No | User's biography |
| `can_create_group` | No | User can create groups - true or false |
@@ -466,7 +467,7 @@ Parameters:
| `linkedin` | No | LinkedIn |
| `location` | No | User's location |
| `name` | Yes | Name |
-| `note` | No | Admin notes for this user |
+| `note` | No | Administrator notes for this user |
| `organization` | No | Organization name |
| `password` | No | Password |
| `private_profile` | No | User's profile is private - true, false (default), or null (is converted to false) |
@@ -496,7 +497,7 @@ Parameters:
| Attribute | Required | Description |
| :----------------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `admin` | No | User is admin - true or false (default) |
+| `admin` | No | User is an administrator - true or false (default) |
| `avatar` | No | Image file for user's avatar |
| `bio` | No | User's biography |
| `can_create_group` | No | User can create groups - true or false |
@@ -510,7 +511,7 @@ Parameters:
| `linkedin` | No | LinkedIn |
| `location` | No | User's location |
| `name` | No | Name |
-| `note` | No | Admin notes for this user |
+| `note` | No | Administration notes for this user |
| `organization` | No | Organization name |
| `password` | No | Password |
| `private_profile` | No | User's profile is private - true, false (default), or null (is converted to false) |
@@ -618,7 +619,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 admins)
+## List current user (for administrators)
> The `namespace_id` field in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82045) in GitLab 14.10.
@@ -1894,7 +1895,7 @@ Example response:
}
```
-## Get user activities (admin only)
+## Get user activities (administrator only)
NOTE:
This API endpoint is only available on 8.15 (EE) and 9.1 (CE) and above.
@@ -1950,7 +1951,7 @@ Example response:
`last_activity_at` is deprecated. Use `last_activity_on` instead.
-## User memberships (admin only)
+## User memberships (administrator only)
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20532) in GitLab 12.8.
diff --git a/doc/api/wikis.md b/doc/api/wikis.md
index b7c9d0d6008..0122872becf 100644
--- a/doc/api/wikis.md
+++ b/doc/api/wikis.md
@@ -68,7 +68,7 @@ GET /projects/:id/wikis/:slug
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | --------------------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) |
-| `slug` | string | yes | URLencoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
+| `slug` | string | yes | URL encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` |
| `render_html` | boolean | no | Return the rendered HTML of the wiki page |
| `version` | string | no | Wiki page version sha |
diff --git a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
index 52e9b48419c..53ea56b8724 100644
--- a/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
+++ b/doc/architecture/blueprints/consolidating_groups_and_projects/index.md
@@ -105,7 +105,7 @@ essentially makes it available on all levels:
- projects
Various traversal queries are already available on `Namespaces` to query the
-group hierarchy. `Projects` represents the leaf nodes in the hierarchy, but with
+group hierarchy. `Projects` represent the leaf nodes in the hierarchy, but with
the introduction of `ProjectNamespace`, these traversal queries can be used to
retrieve projects as well.
@@ -132,7 +132,7 @@ epic.
The initial iteration will provide a framework to house features under `Namespaces`. Stage groups will eventually need to migrate their own features and functionality over to `Namespaces`. This may impact these features in unexpected ways. Therefore, to minimize UX debt and maintain product consistency, stage groups will have to consider a number of factors when migrating their features over to `Namespaces`:
1. **Conceptual model**: What are the current and future state conceptual models of these features ([see object modeling for designers](https://hpadkisson.medium.com/object-modeling-for-designers-an-introduction-7871bdcf8baf))? These should be documented in Pajamas (example: [merge requests](https://design.gitlab.com/objects/merge-request)).
-1. **Merge conflicts**: What inconsistencies are there across project, group, and admin levels? How might these be addressed? For an example of how we rationalized this for labels, please see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338820).
+1. **Merge conflicts**: What inconsistencies are there across project, group, and administrator levels? How might these be addressed? For an example of how we rationalized this for labels, please see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338820).
1. **Inheritance & information flow**: How is information inherited across our container hierarchy currently? How might this be impacted if complying with the new [inheritance behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/343316) framework?
1. **Settings**: Where can settings for this feature be found currently? How will these be impacted by `Namespaces`?
1. **Access**: Who can access this feature and is that impacted by the new container structure? Are there any role or privacy considerations?
diff --git a/doc/architecture/blueprints/container_registry_metadata_database/index.md b/doc/architecture/blueprints/container_registry_metadata_database/index.md
index 963977be549..5105f2e08e2 100644
--- a/doc/architecture/blueprints/container_registry_metadata_database/index.md
+++ b/doc/architecture/blueprints/container_registry_metadata_database/index.md
@@ -339,7 +339,7 @@ A more detailed list of all tasks, as well as periodic progress updates can be f
## Relevant Links
-- [Allow admin to run garbage collection with zero downtime](https://gitlab.com/groups/gitlab-org/-/epics/2313)
+- [Allow administrators to run garbage collection with zero downtime](https://gitlab.com/groups/gitlab-org/-/epics/2313)
- [Proposal for continuous, on-demand online garbage collection](https://gitlab.com/gitlab-org/container-registry/-/issues/199)
- [Gradual migration proposal for the GitLab.com container registry](https://gitlab.com/gitlab-org/container-registry/-/issues/191)
- [Create a self-serve registry deployment](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/316)
diff --git a/doc/architecture/blueprints/database/scalability/patterns/time_decay.md b/doc/architecture/blueprints/database/scalability/patterns/time_decay.md
index 9309c581d54..b4614cde9d4 100644
--- a/doc/architecture/blueprints/database/scalability/patterns/time_decay.md
+++ b/doc/architecture/blueprints/database/scalability/patterns/time_decay.md
@@ -133,8 +133,8 @@ You can find more information on table partitioning for PostgreSQL in the
[documentation page for table partitioning](https://www.postgresql.org/docs/12/ddl-partitioning.html).
Partitioning by date intervals (for example, month, year) allows us to create much smaller tables
-(partitions) for each date interval and only access the most recent partition(s) for any
-application related operation.
+(partitions) for each date interval and only access the most recent partitions for any
+application-related operation.
We have to set the partitioning key based on the date interval of interest, which may depend on two
factors:
@@ -214,7 +214,7 @@ offloading metadata but only for the case of old data.
In the simplest use case we can provide fast and direct access to recent data, while allowing users
to download an archive with older data. This is an option evaluated in the `audit_events` use case.
Depending on the country and industry, audit events may have a very long retention period, while
-only the past month(s) of data are actively accessed through GitLab interface.
+only the past months of data are actively accessed through GitLab interface.
Additional use cases may include exporting data to a data warehouse or other types of data stores as
they may be better suited for processing that type of data. An example can be JSON logs that we
diff --git a/doc/architecture/blueprints/database_scaling/size-limits.md b/doc/architecture/blueprints/database_scaling/size-limits.md
index d63aa3bd4e8..a0508488620 100644
--- a/doc/architecture/blueprints/database_scaling/size-limits.md
+++ b/doc/architecture/blueprints/database_scaling/size-limits.md
@@ -126,7 +126,7 @@ In order to maintain and improve operational stability and lessen development bu
This target is *pragmatic*: We understand table sizes depend on feature usage, code changes and other factors - which all change over time. We may not always find solutions where we can tightly limit the size of physical tables once and for all. That is acceptable though and we primarily aim to keep the situation on GitLab.com under control. We adapt our efforts to the situation present on GitLab.com and will re-evaluate frequently.
-While there are changes we can make that lead to a constant maximum physical table size over time, this doesn't need to be the case necessarily. Consider for example hash partitioniong, which breaks a table down into a static number of partitions. With data growth over time, individual partitions will also grow in size and may eventually reach the threshold size again. We strive to get constant table sizes, but it is acceptable to ship easier solutions that don't have this characteristic but improve the situation for a considerable amount of time.
+While there are changes we can make that lead to a constant maximum physical table size over time, this doesn't need to be the case necessarily. Consider for example hash partitioning, which breaks a table down into a static number of partitions. With data growth over time, individual partitions will also grow in size and may eventually reach the threshold size again. We strive to get constant table sizes, but it is acceptable to ship easier solutions that don't have this characteristic but improve the situation for a considerable amount of time.
As such, the target size of a physical table after refactoring depends on the situation and there is no hard rule for it. We suggest to consider historic data growth and forecast when physical tables will reach the threshold of 100 GB again. This allows us to understand how long a particular solution is expected to last until the model has to be revisited.
diff --git a/doc/architecture/blueprints/database_testing/index.md b/doc/architecture/blueprints/database_testing/index.md
index 8c0cb550d61..22857abf176 100644
--- a/doc/architecture/blueprints/database_testing/index.md
+++ b/doc/architecture/blueprints/database_testing/index.md
@@ -100,7 +100,7 @@ The short-term goal is detailed in [this epic](https://gitlab.com/groups/gitlab-
### Mid-term - Improved feedback, query testing and background migration testing
-Mid-term, we plan to expand the level of detail the testing pipeline reports back to the merge requet and expand its scope to cover query testing, too. By doing so, we use our experience from database code reviews and using thin-clone technology and bring this back closer to the GitLab workflow. Instead of reaching out to different tools (`postgres.ai`, `joe`, Slack, plan visualizations, and so on) we bring this back to GitLab and working directly on the merge request.
+Mid-term, we plan to expand the level of detail the testing pipeline reports back to the merge request and expand its scope to cover query testing, too. By doing so, we use our experience from database code reviews and using thin-clone technology and bring this back closer to the GitLab workflow. Instead of reaching out to different tools (`postgres.ai`, `joe`, Slack, plan visualizations, and so on) we bring this back to GitLab and working directly on the merge request.
Secondly, we plan to cover background migrations testing, too. These are typically data migrations that are scheduled to run over a long period of time. The success of both the scheduling phase and the job execution phase typically depends a lot on data distribution - which only surfaces when running these migrations on actual production data. In order to become confident about a background migration, we plan to provide the following feedback:
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md
index 777bbf6053f..88d59b1f223 100644
--- a/doc/ci/caching/index.md
+++ b/doc/ci/caching/index.md
@@ -2,12 +2,11 @@
stage: Verify
group: Pipeline Authoring
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: index, concepts, howto
---
# Caching in GitLab CI/CD **(FREE)**
-A cache is one or more files that a job downloads and saves. Subsequent jobs that use
+A cache is one or more files a job downloads and saves. Subsequent jobs that use
the same cache don't have to download the files again, so they execute more quickly.
To learn how to define the cache in your `.gitlab-ci.yml` file,
@@ -31,7 +30,7 @@ can't link to files outside it.
- Subsequent pipelines can use the cache.
- Subsequent jobs in the same pipeline can use the cache, if the dependencies are identical.
- Different projects cannot share the cache.
-- Protected and non-protected branches do not share the cache.
+- By default, protected and non-protected branches [do not share the cache](#cache-key-names). However, you can [change this behavior](#use-the-same-cache-for-all-branches).
### Artifacts
@@ -447,13 +446,11 @@ is stored on the machine where GitLab Runner is installed. The location also dep
If you use cache and artifacts to store the same path in your jobs, the cache might
be overwritten because caches are restored before artifacts.
-### Segregation of caches between protected and non-protected branches
+#### Cache key names
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/330047) in GitLab 15.0.
A suffix is added to the cache key, with the exception of the [fallback cache key](#use-a-fallback-cache-key).
-This is done in order to prevent cache poisoning that might occur through manipulation of the cache in a non-protected
-branch. Any subsequent protected-branch jobs would then potentially use a poisoned cache from the preceding job.
As an example, assuming that `cache.key` is set to `$CI_COMMIT_REF_SLUG`, and that we have two branches `main`
and `feature`, then the following table represents the resulting cache keys:
@@ -463,6 +460,24 @@ and `feature`, then the following table represents the resulting cache keys:
| `main` | `main-protected` |
| `feature` | `feature-non_protected` |
+##### Use the same cache for all branches
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361643) in GitLab 15.0.
+
+If you do not want to use [cache key names](#cache-key-names),
+you can have all branches (protected and unprotected) use the same cache.
+
+The cache separation with [cache key names](#cache-key-names) is a security feature
+and should only be disabled in an environment where all users with Developer role are highly trusted.
+
+To use the same cache for all branches:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+1. Clear the **Use separate caches for protected branches** checkbox.
+1. Select **Save changes**.
+
### How archiving and extracting works
This example shows two jobs in two consecutive stages:
@@ -552,12 +567,10 @@ The next time the pipeline runs, the cache is stored in a different location.
### Clear the cache manually
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/41249) in GitLab 10.4.
-
You can clear the cache in the GitLab UI:
1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **CI/CD > Pipelines** page.
+1. On the left sidebar, select **CI/CD > Pipelines**.
1. In the top right, select **Clear runner caches**.
On the next commit, your CI/CD jobs use a new cache.
@@ -576,7 +589,7 @@ If you have a cache mismatch, follow these steps to troubleshoot.
| You use multiple standalone runners (not in autoscale mode) attached to one project without a shared cache. | Use only one runner for your project or use multiple runners with distributed cache enabled. |
| You use runners in autoscale mode without a distributed cache enabled. | Configure the autoscale runner to use a distributed cache. |
| The machine the runner is installed on is low on disk space or, if you've set up distributed cache, the S3 bucket where the cache is stored doesn't have enough space. | Make sure you clear some space to allow new caches to be stored. There's no automatic way to do this. |
-| You use the same `key` for jobs where they cache different paths. | Use different cache keys to that the cache archive is stored to a different location and doesn't overwrite wrong caches. |
+| You use the same `key` for jobs where they cache different paths. | Use different cache keys so that the cache archive is stored to a different location and doesn't overwrite wrong caches. |
#### Cache mismatch example 1
diff --git a/doc/ci/chatops/index.md b/doc/ci/chatops/index.md
index c785e2f29ea..21b970536bc 100644
--- a/doc/ci/chatops/index.md
+++ b/doc/ci/chatops/index.md
@@ -73,7 +73,7 @@ stages:
hello-world:
stage: chatops
rules:
- - if: '$CI_PIPELINE_SOURCE == "chat"'
+ - if: $CI_PIPELINE_SOURCE == "chat"
script:
- echo "Hello World"
```
@@ -93,7 +93,7 @@ stages:
ls:
stage: chatops
rules:
- - if: '$CI_PIPELINE_SOURCE == "chat"'
+ - if: $CI_PIPELINE_SOURCE == "chat"
script:
- echo "This command will not be shown."
- echo -e "section_start:$( date +%s ):chat_reply\r\033[0K\n$( ls -la )\nsection_end:$( date +%s ):chat_reply\r\033[0K"
diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md
index 80e4d8fbe27..c89ce2675e4 100644
--- a/doc/ci/cloud_deployment/index.md
+++ b/doc/ci/cloud_deployment/index.md
@@ -59,7 +59,7 @@ Some credentials are required to be able to run `aws` commands:
| `AWS_DEFAULT_REGION` | Your region code |
NOTE:
- When you create a variable it's set to be [protected by default](../variables/index.md#protect-a-cicd-variable). If you want to use the `aws` commands on branches or tags that are not protected, make sure to uncheck the **Protect variable** checkbox.
+ When you create a variable it's set to be [protected by default](../variables/index.md#protected-cicd-variables). If you want to use the `aws` commands on branches or tags that are not protected, make sure to uncheck the **Protect variable** checkbox.
1. You can now use `aws` commands in the `.gitlab-ci.yml` file of this project:
diff --git a/doc/ci/cloud_services/aws/index.md b/doc/ci/cloud_services/aws/index.md
index aa38562c866..dc8dfd95899 100644
--- a/doc/ci/cloud_services/aws/index.md
+++ b/doc/ci/cloud_services/aws/index.md
@@ -90,3 +90,4 @@ This error can occur for multiple reasons:
- The cloud administrator has not configured the project to use OIDC with GitLab.
- The role is restricted from being run on the branch or tag. See [configure a conditional role](../index.md).
+- `StringEquals` is used instead of `StringLike` when using a wildcard condition. See [related issue](https://gitlab.com/guided-explorations/aws/configure-openid-connect-in-aws/-/issues/2#note_852901934).
diff --git a/doc/ci/enable_or_disable_ci.md b/doc/ci/enable_or_disable_ci.md
index 65c907b8e7b..2e514fd0f0a 100644
--- a/doc/ci/enable_or_disable_ci.md
+++ b/doc/ci/enable_or_disable_ci.md
@@ -31,7 +31,7 @@ If you disable GitLab CI/CD in a project:
- Existing jobs and pipelines are not deleted. Re-enable CI/CD to access them again.
The project or instance settings do not enable or disable pipelines run in an
-[external integration](../user/project/integrations/overview.md#integrations-listing).
+[external integration](../user/project/integrations/index.md#available-integrations).
## Enable CI/CD in a project
diff --git a/doc/ci/environments/deployment_approvals.md b/doc/ci/environments/deployment_approvals.md
index 2a5927a96c2..23fa5d45196 100644
--- a/doc/ci/environments/deployment_approvals.md
+++ b/doc/ci/environments/deployment_approvals.md
@@ -34,7 +34,7 @@ To configure deployment approvals for a project:
### Create a deployment job
-Create a deployment job in the `.gitlab-ci.yaml` file of the desired project. The job does **not** need to be manual (`when: manual`).
+Create a deployment job in the `.gitlab-ci.yml` file of the desired project. The job does **not** need to be manual (`when: manual`).
Example:
@@ -92,7 +92,8 @@ Maintainer role.
#### Multiple approval rules
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345678) in GitLab 14.10 with a flag named `deployment_approval_rules`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345678) in GitLab 14.10 with a flag named `deployment_approval_rules`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/345678) in GitLab 15.0. [Feature flag `deployment_approval_rules`](https://gitlab.com/gitlab-org/gitlab/-/issues/345678) removed.
1. Using the [REST API](../../api/group_protected_environments.md#protect-an-environment).
1. `deploy_access_levels` represents which entity can execute the deployment job.
@@ -138,7 +139,9 @@ To approve or reject a deployment to a protected environment using the UI:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Deployments > Environments**.
+1. Select the environment's name.
1. In the deployment's row, select **Approval options** (**{thumb-up}**).
+1. Optional. Add a comment which describes your reason for approving or rejecting the deployment.
1. Select **Approve** or **Reject**.
NOTE:
diff --git a/doc/ci/environments/deployment_safety.md b/doc/ci/environments/deployment_safety.md
index 0e73dc4f7cd..5b2e2045bdc 100644
--- a/doc/ci/environments/deployment_safety.md
+++ b/doc/ci/environments/deployment_safety.md
@@ -6,7 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Deployment safety **(FREE)**
-Deployment jobs can be more sensitive than other jobs in a pipeline,
+[Deployment jobs](../jobs/#deployment-jobs) are a specific kind of CI/CD
+job. They can be more sensitive than other jobs in a pipeline,
and might need to be treated with extra care. GitLab has several features
that help maintain deployment security and stability.
@@ -64,14 +65,14 @@ For more information, see [Resource Group documentation](../resource_groups/inde
## Skip outdated deployment jobs
-The execution order of pipeline jobs can vary from run to run, which could cause
-undesired behavior. For example, a deployment job in a newer pipeline could
-finish before a deployment job in an older pipeline.
-This creates a race condition where the older deployment finished later,
+The effective execution order of pipeline jobs can vary from run to run, which
+could cause undesired behavior. For example, a [deployment job](../jobs/#deployment-jobs)
+in a newer pipeline could finish before a deployment job in an older pipeline.
+This creates a race condition where the older deployment finishes later,
overwriting the "newer" deployment.
You can ensure that older deployment jobs are cancelled automatically when a newer deployment
-runs by enabling the [Skip outdated deployment jobs](../pipelines/settings.md#skip-outdated-deployment-jobs) feature.
+job is started by enabling the [Skip outdated deployment jobs](../pipelines/settings.md#skip-outdated-deployment-jobs) feature.
Example of a problematic pipeline flow **before** enabling Skip outdated deployment jobs:
@@ -85,7 +86,7 @@ The improved pipeline flow **after** enabling Skip outdated deployment jobs:
1. Pipeline-A is created on the default branch.
1. Later, Pipeline-B is created on the default branch (with a newer SHA).
1. The `deploy` job in Pipeline-B finishes first, and deploys the newer code.
-1. The `deploy` job in Pipeline-A is automatically cancelled, so that it doesn't overwrite the deployment from the newer pipeline.
+1. The `deploy` job in Pipeline-A was automatically cancelled, so that it doesn't overwrite the deployment from the newer pipeline.
## Prevent deployments during deploy freeze windows
@@ -111,7 +112,7 @@ for an explanation of these roles and the permissions of each.
Production secrets are needed to deploy successfully. For example, when deploying to the cloud,
cloud providers require these secrets to connect to their services. In the project settings, you can
-define and protect CI/CD variables for these secrets. [Protected variables](../variables/index.md#protect-a-cicd-variable)
+define and protect CI/CD variables for these secrets. [Protected variables](../variables/index.md#protected-cicd-variables)
are only passed to pipelines running on [protected branches](../../user/project/protected_branches.md)
or [protected tags](../../user/project/protected_tags.md).
The other pipelines don't get the protected variable. You can also
@@ -132,7 +133,7 @@ permission model that isolates the CD permissions from the original project and
original users with the Maintainer role for the project from accessing the production secret and CD configuration. You can
connect the CD project to your development projects by using [multi-project pipelines](../pipelines/multi_project_pipelines.md).
-## Protect `gitlab-ci.yml` from change
+## Protect `.gitlab-ci.yml` from change
A `.gitlab-ci.yml` may contain rules to deploy an application to the production server. This
deployment usually runs automatically after pushing a merge request. To prevent developers from
diff --git a/doc/ci/environments/incremental_rollouts.md b/doc/ci/environments/incremental_rollouts.md
index bc52fd1f16c..d359ed078ff 100644
--- a/doc/ci/environments/incremental_rollouts.md
+++ b/doc/ci/environments/incremental_rollouts.md
@@ -114,7 +114,7 @@ available, [demonstrating configuration of timed rollouts](https://gitlab.com/gl
## Blue-Green Deployment
NOTE:
-As of GitLab 13.7, teams can leverage an Ingress annotation and [set traffic weight](../../user/project/canary_deployments.md#how-to-change-the-traffic-weight-on-a-canary-ingress)
+As of GitLab 13.7, teams can leverage an Ingress annotation and [set traffic weight](../../user/project/canary_deployments.md#how-to-change-the-traffic-weight-on-a-canary-ingress-deprecated)
as an alternative approach to the blue-green deployment strategy documented here.
Also sometimes known as A/B deployment or red-black deployment, this technique is used to reduce
diff --git a/doc/ci/environments/index.md b/doc/ci/environments/index.md
index 3822b32181f..7e1ef5efaa5 100644
--- a/doc/ci/environments/index.md
+++ b/doc/ci/environments/index.md
@@ -560,11 +560,8 @@ GitLab automatically triggers the `stop_review_app` job to stop the environment.
#### Multiple stop actions for an environment
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22456) in GitLab 14.10 [with a flag](../../administration/feature_flags.md) named `environment_multiple_stop_actions`. 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 `environment_multiple_stop_actions`.
-On GitLab.com, this feature is not available. We are enabling in phases and the status can be tracked in [issue 358911](https://gitlab.com/gitlab-org/gitlab/-/issues/358911).
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/22456) in GitLab 14.10 [with a flag](../../administration/feature_flags.md) named `environment_multiple_stop_actions`. Disabled by default.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/358911) in GitLab 15.0. [Feature flag `environment_multiple_stop_actions`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86685) removed.
This feature is useful when you need to perform multiple **parallel** stop actions on an environment.
@@ -645,17 +642,14 @@ 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**.
-### Prepare an environment without creating a deployment
+### Access an environment for preparation or verification purposes
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208655) in GitLab 13.2.
-By default, when GitLab CI/CD runs a job for a specific environment, it
-triggers a deployment and [(optionally) cancels outdated
-deployments](deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time).
+You can define a job that accesses an environment for various purposes, such as verification or preparation. This
+effectively bypasses deployment creation, so that you can adjust your CD workflow more accurately.
-To use an environment without creating a new deployment, and without
-cancelling outdated deployments, append the keyword `action: prepare` to your
-job:
+To do so, add either `action: prepare`, `action: verify`, or `action: access` to the `environment` section of your job:
```yaml
build:
@@ -668,8 +662,8 @@ build:
url: https://staging.example.com
```
-This gives you access to [environment-scoped variables](#scope-environments-with-specs),
-and can be used to [protect builds from unauthorized access](protected_environments.md).
+This gives you access to environment-scoped variables, and can be used to protect builds from unauthorized access. Also,
+it's effective to avoid the [skip outdated deployment jobs](deployment_safety.md#skip-outdated-deployment-jobs) feature.
### Group similar environments
diff --git a/doc/ci/examples/semantic-release.md b/doc/ci/examples/semantic-release.md
index c74af852a9a..2e9e2dd33bf 100644
--- a/doc/ci/examples/semantic-release.md
+++ b/doc/ci/examples/semantic-release.md
@@ -35,7 +35,7 @@ You can also view or fork the complete [example source](https://gitlab.com/gitla
}
```
-1. Update the `files` key with glob pattern(s) that selects all files that should be included in the published module. More information about `files` can be found [in npm's documentation](https://docs.npmjs.com/cli/v6/configuring-npm/package-json/#files).
+1. Update the `files` key with glob patterns that selects all files that should be included in the published module. More information about `files` can be found [in npm's documentation](https://docs.npmjs.com/cli/v6/configuring-npm/package-json/#files).
1. Add a `.gitignore` file to the project to avoid committing `node_modules`:
diff --git a/doc/ci/git_submodules.md b/doc/ci/git_submodules.md
index 23055514839..5f22fb894e5 100644
--- a/doc/ci/git_submodules.md
+++ b/doc/ci/git_submodules.md
@@ -83,4 +83,4 @@ You can check documentation for your specific OS to learn how to find and displa
hidden files.
If there is no `.gitmodules` file, it's possible the submodule settings are in a
-[gitconfig](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-config) file.
+[`git config`](https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-config) file.
diff --git a/doc/ci/jobs/index.md b/doc/ci/jobs/index.md
index e589fd8b045..42827dc2d48 100644
--- a/doc/ci/jobs/index.md
+++ b/doc/ci/jobs/index.md
@@ -392,5 +392,5 @@ deploy me:
The behavior of deployment jobs can be controlled with
[deployment safety](../environments/deployment_safety.md) settings like
-[skipping outdated deployment jobs](../environments/deployment_safety.md#prevent-deployments-during-deploy-freeze-windows)
+[skipping outdated deployment jobs](../environments/deployment_safety.md#skip-outdated-deployment-jobs)
and [ensuring only one deployment job runs at a time](../environments/deployment_safety.md#ensure-only-one-deployment-job-runs-at-a-time).
diff --git a/doc/ci/jobs/job_control.md b/doc/ci/jobs/job_control.md
index 3a302cf352b..83747f36597 100644
--- a/doc/ci/jobs/job_control.md
+++ b/doc/ci/jobs/job_control.md
@@ -40,10 +40,10 @@ The following example uses `if` to define that the job runs in only two specific
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
allow_failure: true
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ - if: $CI_PIPELINE_SOURCE == "schedule"
```
- If the pipeline is for a merge request, the first rule matches, and the job
@@ -67,9 +67,9 @@ run them in all other cases:
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ - if: $CI_PIPELINE_SOURCE == "schedule"
when: never
- when: on_success
```
@@ -118,7 +118,7 @@ For example:
docker build:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- - if: '$VAR == "string value"'
+ - if: $VAR == "string value"
changes: # Include the job and set to when:manual if any of the follow paths match a modified file.
- Dockerfile
- docker/scripts/*
@@ -160,7 +160,7 @@ For example:
job:
script: echo "This job creates double pipelines!"
rules:
- - if: '$CUSTOM_VARIABLE == "false"'
+ - if: $CUSTOM_VARIABLE == "false"
when: never
- when: always
```
@@ -181,7 +181,7 @@ To avoid duplicate pipelines, you can:
job:
script: echo "This job does NOT create double pipelines!"
rules:
- - if: '$CUSTOM_VARIABLE == "true" && $CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CUSTOM_VARIABLE == "true" && $CI_PIPELINE_SOURCE == "merge_request_event"
```
You can also avoid duplicate pipelines by changing the job rules to avoid either push (branch)
@@ -195,7 +195,7 @@ without `workflow: rules`:
job:
script: echo "This job does NOT create double pipelines!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "push"'
+ - if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
```
@@ -207,8 +207,8 @@ You should not include both push and merge request pipelines in the same job wit
job:
script: echo "This job creates double pipelines!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "push"'
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "push"
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
```
Also, do not mix `only/except` jobs with `rules` jobs in the same pipeline.
@@ -222,7 +222,7 @@ job-with-no-rules:
job-with-rules:
script: echo "This job runs in merge request pipelines."
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
```
For every change pushed to the branch, duplicate pipelines run. One
@@ -259,10 +259,10 @@ add the job to any other pipeline type.
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ - if: $CI_PIPELINE_SOURCE == "schedule"
when: manual
allow_failure: true
- - if: '$CI_PIPELINE_SOURCE == "push"'
+ - if: $CI_PIPELINE_SOURCE == "push"
```
The following example runs the job as a `when: on_success` job in [merge request pipelines](../pipelines/merge_request_pipelines.md)
@@ -272,25 +272,25 @@ and scheduled pipelines. It does not run in any other pipeline type.
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ - if: $CI_PIPELINE_SOURCE == "schedule"
```
Other commonly used variables for `if` clauses:
- `if: $CI_COMMIT_TAG`: If changes are pushed for a tag.
- `if: $CI_COMMIT_BRANCH`: If changes are pushed to any branch.
-- `if: '$CI_COMMIT_BRANCH == "main"'`: If changes are pushed to `main`.
-- `if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'`: If changes are pushed to the default
+- `if: $CI_COMMIT_BRANCH == "main"`: If changes are pushed to `main`.
+- `if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH`: If changes are pushed to the default
branch. Use when you want to have the same configuration in multiple
projects with different default branches.
-- `if: '$CI_COMMIT_BRANCH =~ /regex-expression/'`: If the commit branch matches a regular expression.
+- `if: $CI_COMMIT_BRANCH =~ /regex-expression/`: If the commit branch matches a regular expression.
- `if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_TITLE =~ /Merge branch.*/`:
If the commit branch is the default branch and the commit message title matches a regular expression.
For example, the default commit message for a merge commit starts with `Merge branch`.
-- `if: '$CUSTOM_VARIABLE !~ /regex-expression/'`: If the [custom variable](../variables/index.md#custom-cicd-variables)
+- `if: $CUSTOM_VARIABLE !~ /regex-expression/`: If the [custom variable](../variables/index.md#custom-cicd-variables)
`CUSTOM_VARIABLE` does **not** match a regular expression.
-- `if: '$CUSTOM_VARIABLE == "value1"'`: If the custom variable `CUSTOM_VARIABLE` is
+- `if: $CUSTOM_VARIABLE == "value1"`: If the custom variable `CUSTOM_VARIABLE` is
exactly `value1`.
### Variables in `rules:changes`
@@ -643,7 +643,7 @@ timed rollout 10%:
To stop the active timer of a delayed job, select **Unschedule** (**{time-out}**).
This job can no longer be scheduled to run automatically. You can, however, execute the job manually.
-To start a delayed job immediately, select **Play** (**{play}**).
+To start a delayed job manually, select **Unschedule** (**{time-out}**) to stop the delay timer and then select **Play** (**{play}**).
Soon GitLab Runner starts the job.
## Parallelize large jobs
diff --git a/doc/ci/migration/circleci.md b/doc/ci/migration/circleci.md
index d95199a70d0..b1c4c62c465 100644
--- a/doc/ci/migration/circleci.md
+++ b/doc/ci/migration/circleci.md
@@ -21,7 +21,7 @@ For advanced CI/CD teams, [custom project templates](../../user/admin_area/custo
If you have questions that are not answered here, the [GitLab community forum](https://forum.gitlab.com/) can be a great resource.
-## `config.yml` vs `gitlab-ci.yml`
+## `config.yml` vs `.gitlab-ci.yml`
CircleCI's `config.yml` configuration file defines scripts, jobs, and workflows (known as "stages" in GitLab). In GitLab, a similar approach is used with a `.gitlab-ci.yml` file in the root directory of your repository.
@@ -166,7 +166,7 @@ job1:
script:
- make build
rules:
- - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == "try-schedule-workflow"'
+ - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == "try-schedule-workflow"
```
After the pipeline configuration is saved, you configure the cron schedule in the [GitLab UI](../pipelines/schedules.md#add-a-pipeline-schedule), and can enable or disable schedules in the UI as well.
@@ -221,7 +221,7 @@ deploy:
script:
- echo "Deploy job"
rules:
- - if: '$CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH =~ /^rc-/'
+ - if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH =~ /^rc-/
```
### Caching
diff --git a/doc/ci/migration/jenkins.md b/doc/ci/migration/jenkins.md
index 19b1a6cad1f..c59116ea8ed 100644
--- a/doc/ci/migration/jenkins.md
+++ b/doc/ci/migration/jenkins.md
@@ -305,7 +305,7 @@ my_job:
In GitLab, we use the [`variables` keyword](../yaml/index.md#variables) to define different variables at runtime.
These can also be set up through the GitLab UI, under CI/CD settings. See also our [general documentation on variables](../variables/index.md),
-including the section on [protected variables](../variables/index.md#protect-a-cicd-variable) which can be used
+including the section on [protected variables](../variables/index.md#protected-cicd-variables) which can be used
to limit access to certain variables to certain environments or runners:
```yaml
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index d72cb14681d..57a9d7a9358 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -19,6 +19,7 @@ From the pipeline editor page you can:
- [Validate](#validate-ci-configuration) your configuration syntax while editing the file.
- Do a deeper [lint](#lint-ci-configuration) of your configuration, that verifies it with any configuration
added with the [`include`](../yaml/index.md#include) keyword.
+- View a [list of the CI/CD configuration added with the `include` keyword](#view-included-cicd-configuration).
- See a [visualization](#visualize-ci-configuration) of the current configuration.
- View an [expanded](#view-expanded-configuration) version of your configuration.
- [Commit](#commit-changes-to-ci-configuration) the changes to a specific branch.
@@ -50,6 +51,20 @@ reflected in the CI lint. It displays the same results as the existing [CI Lint
![Linting errors in a CI configuration](img/pipeline_editor_lint_v13_8.png)
+## View included CI/CD configuration
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7064) in GitLab 15.0 [with a flag](../../administration/feature_flags.md) named `pipeline_editor_file_tree`. 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 `pipeline_editor_file_tree`.
+
+You can review configuration added with the [`include`](../yaml/index.md#include)
+keyword in the pipeline editor. In the top right, select the file tree (**{file-tree}**)
+to see a list of all included configuration files. Selected files open in a new tab
+for review.
+
## Visualize CI configuration
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241722) in GitLab 13.5.
diff --git a/doc/ci/pipelines/cicd_minutes.md b/doc/ci/pipelines/cicd_minutes.md
index f9d9a4f738b..2b18b1d353b 100644
--- a/doc/ci/pipelines/cicd_minutes.md
+++ b/doc/ci/pipelines/cicd_minutes.md
@@ -90,6 +90,8 @@ To view CI/CD minutes being used for your group:
## View CI/CD minutes used by a personal namespace
+> Displaying shared runners duration [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345795) in GitLab 15.0.
+
You can view the number of CI/CD minutes being used by a personal namespace:
1. On the top bar, in the top right corner, select your avatar.
@@ -103,7 +105,7 @@ These additional CI/CD minutes:
- Are used only after the monthly quota included in your subscription runs out.
- Are carried over to the next month, if any remain at the end of the month.
-- Don't expire.
+- Are valid for 12 months from date of purchase or until all minutes are consumed, whichever comes first. Expiry of minutes is not currently enforced.
If you use more CI/CD minutes than your monthly quota, when you purchase more,
those CI/CD minutes are deducted from your quota. For example, with a GitLab SaaS
@@ -191,17 +193,41 @@ The cost factor for a job running on a shared runner is:
### Additional costs on GitLab SaaS
-On GitLab SaaS, shared runners can have different cost factors depending on the cost involved
-in executing the runner. For example, a high spec shared runner could be set to have a cost factor of `2`.
-Conversely, a shared runner that executes jobs for public projects could have a low cost factor, like `0.008`.
+GitLab SaaS shared runners have different cost factors, depending on the runner type (Linux, Windows, macOS) and the virtual machine configuration.
+
+| GitLab SaaS runner type | Virtual machine configuration | CI/CD minutes cost factor |
+| :--------- | :------------------- | :--------- |
+| Linux OS + Docker executor| 1 vCPU, 3.75 GB RAM |1|
+| macOS + shell executor | 4 vCPU, 10 GB RAM| 6 |
### Monthly reset of CI/CD minutes
On the first day of each calendar month, the accumulated usage of CI/CD minutes is reset to `0`
-for all namespaces that use shared runners.
+for all namespaces that use shared runners. This means your full quota is available, and
+calculations start again from `0`.
+
+For example, if you have a monthly quota of `10,000` CI/CD minutes:
+
+- On **1st April**, you have `10,000` minutes.
+- During April, you use only `6,000` of the `10,000` minutes.
+- On **1st May**, the accumulated usage of minutes resets to `0`, and you have `10,000` minutes to use again
+ during May.
Usage data for the previous month is kept to show historical view of the consumption over time.
+### Monthly rollover of purchased CI/CD minutes
+
+If you purchase additional CI/CD minutes and don't use the full amount, the remaining amount rolls over to
+the next month.
+
+For example:
+
+- On **1st April**, you purchase `5,000` CI/CD minutes.
+- During April, you use only `3,000` of the `5,000` minutes.
+- On **1st May**, the remaining `2,000` minutes roll over and are added to your monthly quota.
+
+Additional CI/CD minutes are a one-time purchase and do not renew or refresh each month.
+
## What happens when you exceed the quota
When the quota of CI/CD minutes is used for the current month, GitLab stops
diff --git a/doc/ci/pipelines/img/downstream_pipeline_actions.png b/doc/ci/pipelines/img/downstream_pipeline_actions.png
new file mode 100644
index 00000000000..4c4384bab57
--- /dev/null
+++ b/doc/ci/pipelines/img/downstream_pipeline_actions.png
Binary files differ
diff --git a/doc/ci/pipelines/img/multi_pipeline_mini_graph.gif b/doc/ci/pipelines/img/multi_pipeline_mini_graph.gif
deleted file mode 100644
index de49ba5aa12..00000000000
--- a/doc/ci/pipelines/img/multi_pipeline_mini_graph.gif
+++ /dev/null
Binary files differ
diff --git a/doc/ci/pipelines/index.md b/doc/ci/pipelines/index.md
index 4d1af735b13..c6142ebefc5 100644
--- a/doc/ci/pipelines/index.md
+++ b/doc/ci/pipelines/index.md
@@ -449,6 +449,22 @@ Pipeline analytics are available on the [**CI/CD Analytics** page](../../user/an
Pipeline status and test coverage report badges are available and configurable for each project.
For information on adding pipeline badges to projects, see [Pipeline badges](settings.md#pipeline-badges).
+### Downstream pipelines
+
+> Cancel or retry downstream pipelines from the graph view [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354974) in GitLab 15.0 [with a flag](../../administration/feature_flags.md) named `downstream_retry_action`. Disabled by default.
+
+In the pipeline graph view, downstream pipelines ([Multi-project pipelines](multi_project_pipelines.md)
+and [Parent-child pipelines](parent_child_pipelines.md)) display as a list of cards
+on the right of the graph.
+
+To cancel a downstream pipeline that is still running, select **Cancel** (**{cancel}**)
+on the pipeline's card.
+
+To retry a failed downstream pipeline, select **Retry** (**{retry}**)
+on the pipeline's card.
+
+![downstream pipeline actions](img/downstream_pipeline_actions.png)
+
## Pipelines API
GitLab provides API endpoints to:
diff --git a/doc/ci/pipelines/merge_request_pipelines.md b/doc/ci/pipelines/merge_request_pipelines.md
index 75408de2721..89839de718b 100644
--- a/doc/ci/pipelines/merge_request_pipelines.md
+++ b/doc/ci/pipelines/merge_request_pipelines.md
@@ -20,7 +20,7 @@ Branch pipelines:
- Run when you push a new commit to a branch.
- Are the default type of pipeline.
- Have access to [some predefined variables](../variables/predefined_variables.md).
-- Have access to [protected variables](../variables/index.md#protect-a-cicd-variable) and [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
+- Have access to [protected variables](../variables/index.md#protected-cicd-variables) and [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Merge request pipelines:
@@ -33,7 +33,7 @@ Merge request pipelines:
- Do not run by default. The jobs in the CI/CD configuration file [must be configured](#prerequisites)
to run in merge request pipelines.
- Have access to [more predefined variables](#available-predefined-variables).
-- Do not have access to [protected variables](../variables/index.md#protect-a-cicd-variable) or [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
+- Do not have access to [protected variables](../variables/index.md#protected-cicd-variables) or [protected runners](../runners/configure_runners.md#prevent-runners-from-revealing-sensitive-information).
Both of these types of pipelines can appear on the **Pipelines** tab of a merge request.
@@ -127,12 +127,12 @@ Pipelines for forks display with the **fork** badge in the parent project:
### Run pipelines in the parent project **(PREMIUM)**
-Project members in the parent project can choose to run a merge request pipeline
+Project members in the parent project can trigger a merge request pipeline
for a merge request submitted from a fork project. This pipeline:
- Is created and runs in the parent (target) project, not the fork (source) project.
-- Uses the CI/CD configuration present in the fork project's branch
-- Uses the parent project's CI/CD configuration, resources, and project CI/CD variables.
+- Uses the CI/CD configuration present in the fork project's branch.
+- Uses the parent project's CI/CD settings, resources, and project CI/CD variables.
- Uses the permissions of the parent project member that triggers the pipeline.
Run pipelines in fork project MRs to ensure that the post-merge pipeline passes in
@@ -142,8 +142,12 @@ running the pipeline in the parent project uses the parent project's trusted run
WARNING:
Fork merge requests can contain malicious code that tries to steal secrets in the
parent project when the pipeline runs, even before merge. As a reviewer, carefully
-check the changes in the merge request before triggering the pipeline. GitLab shows
-a warning that you must accept before you can trigger the pipeline.
+check the changes in the merge request before triggering the pipeline. If you trigger
+the pipeline by selecting **Run pipeline** or applying a suggestion, GitLab shows
+a warning that you must accept before the pipeline runs. If you trigger the pipeline
+by using any other method, including the API, [`/rebase` quick action](../../user/project/quick_actions.md#issues-merge-requests-and-epics),
+or [**Rebase** option](../../user/project/merge_requests/methods/index.md#rebasing-in-semi-linear-merge-methods),
+**no warning displays**.
Prerequisites:
@@ -152,10 +156,10 @@ Prerequisites:
user running the pipeline. Otherwise, the **Pipelines** tab does not display
in the merge request.
-To run a pipeline in the parent project for a merge request from a fork project:
+To use the UI to run a pipeline in the parent project for a merge request from a fork project:
1. In the merge request, go to the **Pipelines** tab.
-1. Select **Run pipeline**. You must accept the warning, or the pipeline does not run.
+1. Select **Run pipeline**. You must read and accept the warning, or the pipeline does not run.
## Available predefined variables
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index 12ea3a70536..d200dde143c 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -24,7 +24,7 @@ requests, each waiting to be merged into the target branch.
Many merge requests can be added to the train. Each merge request runs its own merged results pipeline,
which includes the changes from all of the other merge requests in *front* of it on the train.
-All the pipelines run in parallel, to save time.
+All the pipelines run in parallel, to save time. The author of the internal merged result commit is always the user that initiated the merge.
If the pipeline for a merge request fails, the breaking changes are not merged, and the target
branch is unaffected. The merge request is removed from the train, and all pipelines behind it restart.
@@ -73,6 +73,9 @@ To enable merge trains:
- Your repository must be a GitLab repository, not an
[external repository](../ci_cd_for_external_repos/index.md).
+Merge trains do not work with [Semi-linear history merge requests](../../user/project/merge_requests/methods/index.md#merge-commit-with-semi-linear-history)
+or [fast-forward merge requests](../../user/project/merge_requests/methods/index.md#fast-forward-merge).
+
## Enable merge trains
To enable merge trains for your project:
@@ -84,7 +87,6 @@ To enable merge trains for your project:
1. On the left sidebar, select **Settings > General**.
1. Expand **Merge requests**.
1. In the **Merge method** section, verify that **Merge commit** is selected.
- You cannot use **Merge commit with semi-linear history** or **Fast-forward merge** with merge trains.
1. In the **Merge options** section, select **Enable merged results pipelines** (if not already selected) and **Enable merge trains**.
1. Select **Save changes**.
diff --git a/doc/ci/pipelines/merged_results_pipelines.md b/doc/ci/pipelines/merged_results_pipelines.md
index 7df9ea3f72f..9661d2f5263 100644
--- a/doc/ci/pipelines/merged_results_pipelines.md
+++ b/doc/ci/pipelines/merged_results_pipelines.md
@@ -12,7 +12,8 @@ A *merged results pipeline* is a type of [merge request pipeline](merge_request_
GitLab creates an internal commit with the merged results, so the pipeline can run
against it. This commit does not exist in either branch,
-but you can view it in the pipeline details.
+but you can view it in the pipeline details. The author of the internal commit is
+always the user that created the merge request.
The pipeline runs against the target branch as it exists at the moment you run the pipeline.
Over time, while you're working in the source branch, the target branch might change.
@@ -35,7 +36,7 @@ To use merged results pipelines:
- Your repository must be a GitLab repository, not an
[external repository](../ci_cd_for_external_repos/index.md).
- You must not be using [fast forward merges](../../user/project/merge_requests/fast_forward_merge.md).
- [An issue exits](https://gitlab.com/gitlab-org/gitlab/-/issues/26996) to change this behavior.
+ [An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/26996) to change this behavior.
## Enable merged results pipelines
diff --git a/doc/ci/pipelines/multi_project_pipelines.md b/doc/ci/pipelines/multi_project_pipelines.md
index e6af9292fe1..20184635e4a 100644
--- a/doc/ci/pipelines/multi_project_pipelines.md
+++ b/doc/ci/pipelines/multi_project_pipelines.md
@@ -308,7 +308,10 @@ When you configure GitLab CI/CD for your project, you can visualize the stages o
![Multi-project pipeline graph](img/multi_project_pipeline_graph_v14_3.png)
-In the merge request, on the **Pipelines** tab, multi-project pipeline mini-graphs are displayed.
-They expand and are shown adjacent to each other when hovering (or tapping on touchscreen devices).
+## Retry or cancel multi-project pipelines
-![Multi-project mini graph](img/multi_pipeline_mini_graph.gif)
+If you have permission to trigger pipelines in the downstream project, you can
+retry or cancel multi-project pipelines:
+
+- [In the main graph view](index.md#downstream-pipelines).
+- From the downstream pipeline's details page.
diff --git a/doc/ci/pipelines/parent_child_pipelines.md b/doc/ci/pipelines/parent_child_pipelines.md
index a3ded24e8c9..3206345d757 100644
--- a/doc/ci/pipelines/parent_child_pipelines.md
+++ b/doc/ci/pipelines/parent_child_pipelines.md
@@ -216,3 +216,10 @@ multi-project pipelines:
- [By using the `variable` keyword](multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-the-variables-keyword).
- [By using variable inheritance](multi_project_pipelines.md#pass-cicd-variables-to-a-downstream-pipeline-by-using-variable-inheritance).
+
+## Retry or cancel child pipelines
+
+You can retry or cancel child pipelines:
+
+- [In the main graph view](index.md#downstream-pipelines).
+- In the child pipeline's details page.
diff --git a/doc/ci/pipelines/pipeline_artifacts.md b/doc/ci/pipelines/pipeline_artifacts.md
index e9dd1b2a942..3a1367f4a8c 100644
--- a/doc/ci/pipelines/pipeline_artifacts.md
+++ b/doc/ci/pipelines/pipeline_artifacts.md
@@ -11,7 +11,7 @@ different to [job artifacts](job_artifacts.md) because they are not explicitly m
`.gitlab-ci.yml` definitions.
Pipeline artifacts are used by the [test coverage visualization feature](../../user/project/merge_requests/test_coverage_visualization.md)
-to collect coverage information. It uses the [`artifacts: reports`](../yaml/index.md#artifactsreports) CI/CD keyword.
+to collect coverage information.
## Storage
diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md
index b6ea16ae224..2a95a4e1421 100644
--- a/doc/ci/pipelines/settings.md
+++ b/doc/ci/pipelines/settings.md
@@ -222,36 +222,49 @@ averaged.
To add test coverage results to a merge request using the project's `.gitlab-ci.yml` file, provide a regular expression
using the [`coverage`](../yaml/index.md#coverage) keyword.
-Setting the regular expression this way takes precedence over project settings.
+<!-- start_remove The following content will be removed on remove_date: '2023-08-22' -->
-### Add test coverage results using project settings (DEPRECATED)
+### Add test coverage results using project settings (removed)
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 14.9. Replaced by [`coverage` keyword](../yaml/index.md#coverage).
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 14.8. Replaced by [`coverage` keyword](../yaml/index.md#coverage).
+> [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 15.0.
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/17633)
-in GitLab 14.9, and is planned for [removal](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 15.0.
+This feature is in its end-of-life process. It was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/17633)
+in GitLab 14.8. The feature is [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/17633) in GitLab 15.0.
-You can add test coverage results to merge requests using the Project's CI/CD settings:
+To migrate from a project setting to the `coverage` keyword, add the [former project setting](#locate-former-project-setting)
+to a CI/CD job. For example:
-- Set using the GitLab UI:
+- A Go test coverage project setting: `coverage: \d+.\d+% of statements`.
+- A CI/CD job with `coverage` keyword setting:
- 1. On the top bar, select **Menu > Projects** and find your project.
- 1. On the left sidebar, select **Settings > CI/CD**.
- 1. Expand **General pipelines**.
- 1. In the **Test coverage parsing** field, enter a regular expression. Leave blank to disable this feature.
+ ```yaml
+ unit-test:
+ stage: test
+ coverage: '/coverage: \d+.\d+% of statements/'
+ script:
+ - go test -cover
+ ```
-- Set when [editing a project](../../api/projects.md#edit-project) or [creating a project](../../api/projects.md#create-project)
- using the GitLab API with the `build_coverage_regex` attribute:
+The `.gitlab-ci.yml` job [`coverage`](../yaml/index.md#coverage) keyword must be:
- ```shell
- curl --request PUT --header "PRIVATE-TOKEN: <your-token>" \
- --url 'https://gitlab.com/api/v4/projects/<your-project-ID>' \
- --data "build_coverage_regex=<your-regular-expression>"
- ```
+- A regular expression starts and ends with the `/` character.
+- Defined as single-quoted string.
+
+You can verify correct syntax using the [pipeline editor](../pipeline_editor/index.md).
+
+#### Locate former project setting
+
+To migrate from the project coverage setting to the `coverage` keyword, use the
+regular expression displayed in the settings. Available in GitLab 14.10 and earlier:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > CI/CD**.
+1. Expand **General pipelines**.
+
+The regular expression you need is in the **Test coverage parsing** field.
-You can use <https://rubular.com> to test your regular expression. The regular expression returns the **last**
-match found in the output.
+<!-- end_remove -->
### Test coverage examples
@@ -266,6 +279,7 @@ Use this regex for commonly used test tools.
- gcovr (C/C++). Example: `^TOTAL.*\s+(\d+\%)$`.
- `tap --coverage-report=text-summary` (NodeJS). Example: `^Statements\s*:\s*([^%]+)`.
- `nyc npm test` (NodeJS). Example: `All files[^|]*\|[^|]*\s+([\d\.]+)`.
+- `jest --ci --coverage` (NodeJS). Example: `All files[^|]*\|[^|]*\s+([\d\.]+)`.
- excoveralls (Elixir). Example: `\[TOTAL\]\s+(\d+\.\d+)%`.
- `mix test --cover` (Elixir). Example: `\d+.\d+\%\s+\|\s+Total`.
- JaCoCo (Java/Kotlin). Example: `Total.*?([0-9]{1,3})%`.
diff --git a/doc/ci/quick_start/index.md b/doc/ci/quick_start/index.md
index fbdf226181b..e35a042a320 100644
--- a/doc/ci/quick_start/index.md
+++ b/doc/ci/quick_start/index.md
@@ -19,7 +19,7 @@ If you are migrating from another CI/CD tool, view this documentation:
- [Migrate from CircleCI](../migration/circleci.md).
- [Migrate from Jenkins](../migration/jenkins.md).
-> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch [First time GitLab & CI/CD](https://www.youtube.com/watch?v=kTNfi5z6Uvk&t=553s). This includes a quick introduction to GitLab, the first steps with CI/CD, building a Go project, running tests, using the CI/CD pipeline editor, detecting secrets and security vulnerabilities and offers more exercises for async practice.
+> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch [First time GitLab & CI/CD](https://www.youtube.com/watch?v=kTNfi5z6Uvk&t=553s). This includes a quick introduction to GitLab, the first steps with CI/CD, building a Go project, running tests, using the CI/CD pipeline editor, detecting secrets and security vulnerabilities and offers more exercises for asynchronous practice.
> - <i class="fa fa-youtube-play youtube" aria-hidden="true"></i>&nbsp;Watch [Intro to GitLab CI](https://www.youtube.com/watch?v=l5705U8s_nQ&t=358s). This workshop uses the Web IDE to quickly get going with building source code using CI/CD, and run unit tests.
## CI/CD process overview
@@ -27,6 +27,8 @@ If you are migrating from another CI/CD tool, view this documentation:
To use GitLab CI/CD:
1. [Ensure you have runners available](#ensure-you-have-runners-available) to run your jobs.
+ GitLab SaaS provides runners, so if you're using GitLab.com, you can skip this step.
+
If you don't have a runner, [install GitLab Runner](https://docs.gitlab.com/runner/install/)
and [register a runner](https://docs.gitlab.com/runner/register/) for your instance, project, or group.
1. [Create a `.gitlab-ci.yml` file](#create-a-gitlab-ciyml-file)
@@ -130,7 +132,7 @@ The pipeline starts when the commit is committed.
```yaml
default:
- image: ruby:2.7.4
+ image: ruby:2.7.5
```
This command tells the runner to use a Ruby image from Docker Hub
diff --git a/doc/ci/resource_groups/index.md b/doc/ci/resource_groups/index.md
index 9312f4a8850..e76c4621a0c 100644
--- a/doc/ci/resource_groups/index.md
+++ b/doc/ci/resource_groups/index.md
@@ -42,7 +42,7 @@ In this case, the `deploy` jobs across different pipelines could run concurrentl
to the `production` environment. Running multiple deployment scripts to the same
infrastructure could harm/confuse the instance and leave it in a corrupted state in the worst case.
-In order to ensure that a `deploy` job runs once at a time, you can specify
+To ensure that a `deploy` job runs once at a time, you can specify
[`resource_group` keyword](../yaml/index.md#resource_group) to the concurrency sensitive job:
```yaml
@@ -74,27 +74,27 @@ You can choose a process mode to strategically control the job concurrency for y
The following modes are supported:
- **Unordered:** This is the default process mode that limits the concurrency on running jobs.
- It's the easiest option to use and useful when you don't care about the execution order
+ It's the easiest option to use when you don't care about the execution order
of the jobs. It starts processing the jobs whenever a job ready to run.
- **Oldest first:** This process mode limits the concurrency of the jobs. When a resource is free,
it picks the first job from the list of upcoming jobs (`created`, `scheduled`, or `waiting_for_resource` state)
that are sorted by pipeline ID in ascending order.
- This mode is useful when you want to ensure that the jobs are executed from the oldest pipeline.
- This is less efficient compared to the `unordered` mode in terms of the pipeline efficiency,
+ This mode is efficient when you want to ensure that the jobs are executed from the oldest pipeline.
+ It is less efficient compared to the `unordered` mode in terms of the pipeline efficiency,
but safer for continuous deployments.
- **Newest first:** This process mode limits the concurrency of the jobs. When a resource is free,
it picks the first job from the list of upcoming jobs (`created`, `scheduled` or `waiting_for_resource` state)
that are sorted by pipeline ID in descending order.
- This mode is useful when you want to ensure that the jobs are executed from the newest pipeline and
+ This mode is efficient when you want to ensure that the jobs are executed from the newest pipeline and
cancel all of the old deploy jobs with the [skip outdated deployment jobs](../environments/deployment_safety.md#skip-outdated-deployment-jobs) feature.
This is the most efficient option in terms of the pipeline efficiency, but you must ensure that each deployment job is idempotent.
### Change the process mode
-To change the process mode of a resource group, you need to use the API and
+To change the process mode of a resource group, you must use the API and
send a request to [edit an existing resource group](../../api/resource_groups.md#edit-an-existing-resource-group)
by specifying the `process_mode`:
@@ -145,7 +145,7 @@ Depending on the process mode of the resource group:
You can define `resource_group` for downstream pipelines that are sensitive to concurrent
executions. The [`trigger` keyword](../yaml/index.md#trigger) can trigger downstream pipelines and the
-[`resource_group` keyword](../yaml/index.md#resource_group) can co-exist with it. `resource_group` is useful to control the
+[`resource_group` keyword](../yaml/index.md#resource_group) can co-exist with it. `resource_group` is efficient to control the
concurrency of deployment pipelines, while other jobs can continue to run concurrently.
The following example has two pipeline configurations in a project. When a pipeline starts running,
@@ -205,7 +205,7 @@ Read more how you can use GitLab for [safe deployments](../environments/deployme
### Avoid dead locks in pipeline configurations
-Since [`oldest_first` process mode](#process-modes) enforces the jobs to be executed in a pipeline order,
+Because [`oldest_first` process mode](#process-modes) enforces the jobs to be executed in a pipeline order,
there is a case that it doesn't work well with the other CI features.
For example, when you run [a child pipeline](../pipelines/parent_child_pipelines.md)
@@ -229,10 +229,10 @@ deploy:
In a parent pipeline, it runs the `test` job that subsequently runs a child pipeline,
and the [`strategy: depend` option](../yaml/index.md#triggerstrategy) makes the `test` job wait until the child pipeline has finished.
The parent pipeline runs the `deploy` job in the next stage, that requires a resource from the `production` resource group.
-If the process mode is `oldest_first`, it executes the jobs from the oldest pipelines, meaning the `deploy` job is going to be executed next.
+If the process mode is `oldest_first`, it executes the jobs from the oldest pipelines, meaning the `deploy` job is executed next.
However, a child pipeline also requires a resource from the `production` resource group.
-Since the child pipeline is newer than the parent pipeline, the child pipeline
+Because the child pipeline is newer than the parent pipeline, the child pipeline
waits until the `deploy` job is finished, something that will never happen.
In this case, you should specify the `resource_group` keyword in the parent pipeline configuration instead:
diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md
index 6b14cea51d6..e7165339ea0 100644
--- a/doc/ci/runners/configure_runners.md
+++ b/doc/ci/runners/configure_runners.md
@@ -148,7 +148,7 @@ different places.
### Determine the IP address of a shared runner
-To view the IP address of a shared runner you must have admin access to
+To view the IP address of a shared runner you must have administrator access to
the GitLab instance. To determine this:
1. On the top bar, select **Menu > Admin**.
@@ -302,6 +302,9 @@ globally or for individual jobs:
You can also use variables to configure how many times a runner
[attempts certain stages of job execution](#job-stages-attempts).
+When using the Kubernetes executor, you can use variables to
+[override Kubernetes CPU and memory allocations for requests and limits](https://docs.gitlab.com/runner/executors/kubernetes.html#overwriting-container-resources).
+
### Git strategy
> - Introduced in GitLab 8.9 as an experimental feature.
diff --git a/doc/ci/runners/saas/macos/codesigning.md b/doc/ci/runners/saas/macos/codesigning.md
new file mode 100644
index 00000000000..4f8316faf17
--- /dev/null
+++ b/doc/ci/runners/saas/macos/codesigning.md
@@ -0,0 +1,121 @@
+---
+stage: Verify
+group: Runner
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Code signing for SaaS runners on macOS
+
+> Introduced in GitLab 15.0.
+
+Before you can integrate GitLab with Apple services, install to a device, or deploy to the Apple App Store, you must [code sign](https://developer.apple.com/support/code-signing/) your application.
+
+To code sign an iOS project, you need the following files:
+
+- A certifcate issued by Apple.
+- A provisioning profile.
+
+## Code signing iOS Projects with fastlane
+
+When you use SaaS runners on macOS, each job runs on a VM. Included in each VM is [fastlane](https://fastlane.tools/),
+an open-source solution aimed at simplifying mobile app deployment.
+
+These steps outline the minimal setup required to use fastlane to code sign your application. Refer to the fastlane [getting started guide](https://docs.fastlane.tools/), [best practices for integrating with GitLab CI](https://docs.fastlane.tools/best-practices/continuous-integration/gitlab/) and the [fastlane code signing getting started guide](https://docs.fastlane.tools/codesigning/getting-started/) for installation instructions, and an overview of how to use fastlane to handle code signing.
+
+To use fastlane to code sign your application:
+
+1. At the root of your project repository, on your local development system, run this command:
+
+ ```plaintext
+ fastlane match init
+ ```
+
+ This command creates the `fastlane` directory and adds two files: `Fastfile` and `Appfile`.
+
+1. Open `Appfile` and edit it to include your Apple ID and app ID.
+
+ ```plaintext
+ app_identifier("APP IDENTIFIER") # The bundle identifier of your app
+
+ apple_id("APPLE ID") # Your Apple email address
+ ```
+
+1. Open `Fastfile`, which includes the fastlane build steps.
+ In the following snippet, the steps `get_certificates`, `get_provisioning_profile,match`, `gym`, and
+ `upload_to_testflight` are fastlane [actions](https://docs.fastlane.tools/actions/).
+
+ ```plaintext
+ # This file contains the fastlane.tools configuration
+ # You can find the documentation at https://docs.fastlane.tools
+
+ default_platform(:ios)
+
+ platform :ios do
+ desc "Build the application"
+ lane :beta do
+ increment_build_number(
+ build_number: latest_testflight_build_number + 1,
+ xcodeproj: "${PROJECT_NAME}.xcodeproj"
+ )
+ get_certificates
+ get_provisioning_profile
+ # match(type: "appstore",read_only: true)
+ gym
+ upload_to_testflight
+ end
+ end
+ ```
+
+The example configuration also includes an optional `Gymfile`. This file stores configuration
+parameters and is used by the fastlane [`gym`](https://docs.fastlane.tools/actions/gym/) action.
+
+## Using fastlane match
+
+To simplify the code signing process and implement the
+[Code Signing Best Practices Guide](https://codesigning.guide/) recommendations,
+use [fastlane match](https://docs.fastlane.tools/actions/match/).
+
+- Use one code signing identity shared across your team.
+- Store the required certificates and provisioning profiles in a separate GitLab project repository.
+
+Match automatically syncs iOS and macOS keys and provisioning profiles across all team members with access to the GitLab project. Each team member with access to the project can use the credentials for code signing.
+
+To use fastlane match:
+
+1. Initialize match in the project repository:
+
+ ```shell
+ bundle exec fastlane match init
+ ```
+
+1. Select `git` as your storage node.
+1. Enter the URL of the GitLab project you plan to use to store your code signing identities.
+1. Optional. To create a new certificate and provisioning profile, run:
+
+ ```shell
+ bundle exec fastlane match development
+ ```
+
+For different code signing identities' storage options, and for a complete step-by-step guide for using match,
+refer to the [match documentation](https://docs.fastlane.tools/actions/match/#usage).
+
+### Environment variables and authentication
+
+To complete the setup, you must configure environment variables to use with fastlane. The required variables are outlined in the [fastlane documentation](https://docs.fastlane.tools/best-practices/continuous-integration/#environment-variables-to-set).
+
+To support Apple's two factor authentication requirement, configure these variables:
+
+- `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD` and
+- `FASTLANE_SESSION`
+
+To authenticate fastlane with the App Store for the TestFlight upload, configure these variables:
+
+- `FASTLANE_USER` and
+- `FASTLANE_PASSWORD`
+
+View the [fastlane authentication with Apple Services guide](https://docs.fastlane.tools/getting-started/ios/authentication/) for an overview of authentication options.
+
+## Related topics
+
+- [Apple Developer Support - Code Signing](https://developer.apple.com/support/code-signing/)
+- [Code Signing Best Practice Guide](https://codesigning.guide/)
diff --git a/doc/ci/runners/saas/macos/environment.md b/doc/ci/runners/saas/macos/environment.md
index 4d209fe4cd6..edd897e4c23 100644
--- a/doc/ci/runners/saas/macos/environment.md
+++ b/doc/ci/runners/saas/macos/environment.md
@@ -9,12 +9,18 @@ info: To determine the technical writer assigned to the Stage/Group associated w
When you use SaaS runners on macOS:
- Each of your jobs runs in a newly provisioned VM, which is dedicated to the specific job.
-- The VM is active only for the duration of the job and immediately deleted.
+- The VM is active only for the duration of the job and immediately deleted. This means that any changes that your job makes to the virtual machine will not be available to a subsequent job.
+- The virtual machine where your job runs has `sudo` access with no password.
+
+NOTE:
+Each time you run a job that requires tooling or dependencies not available in the base image, those items must be added to the newly provisioned build VM. That process will likely increase the total job duration.
## VM types
-The virtual machine where your job runs has `sudo` access with no password.
-For the [Beta](../../../../policy/alpha-beta-support.md#beta-features), there is only one available machine type, `gbc-macos-large`.
+GitLab SaaS provides macOS build machines on Apple servers with Intel x86-64 processors.
+The expectation is that virtual machines running on the Apple M1 chip will be available in the second half of 2022.
+
+At this time there is only one available machine type offered, `gbc-macos-large`.
| Instance type | vCPUS | Memory (GB) |
| --------- | --- | ------- |
@@ -22,23 +28,34 @@ For the [Beta](../../../../policy/alpha-beta-support.md#beta-features), there is
## VM images
+### Image update policy
+
+GitLab expects to release new images based on this cadence:
+
+macOS updates:
+
+- **For new OS versions:** When Apple releases a new macOS version to developers (like macOS `12`), GitLab will plan to release an image based on the OS within the next 30 business days. The image is considered `beta` and the contents of the image (including tool versions) are subject to change until the first patch release (`12.1`). The long-term name will not include `beta` (for example, `macos-12-xcode-13`), so customers are moved automatically out of beta over time. GitLab will try to minimize breaking changes between the first two minor versions but makes no guarantees. Tooling often gets critical bug fixes after the first public release of an OS version.
+
+- **After the first patch release (`12.1`):**
+ - The image moves to `maintenance` mode. The tools GitLab builds into the image with Homebrew and asdf are frozen. GitLab continues making Xcode updates, security updates, and any non-breaking changes deemed necessary.
+ - The image for the previous OS version (`11`) moves to `frozen` mode. GitLab then does only unavoidable changes: security updates, runner version upgrades, and setting the production password.
+
+Both macOS and Xcode follow a yearly release cadence. As time goes on, GitLab increments their versions synchronously (meaning we build macOS 11 with Xcode 12, macOS 12 with Xcode 13, and so on).
+
+### Available images
+
You can execute your build on one of the following images.
You specify this image in your `.gitlab-ci.yml` file.
Each image is running a specific version of macOS and Xcode.
-| VM image | Included software |
-|---------------------------|--------------------|
-| macos-10.13-xcode-7 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
-| macos-10.13-xcode-8 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
-| macos-10.13-xcode-9 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
-| macos-10.14-xcode-10 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/mojave.yml> |
-| macos-10.15-xcode-11 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/catalina.yml> |
-| macos-11-xcode-12 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/big-sur.yml> |
-| macos-11-xcode-13 | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/monterey.yml>
-
-### Image update policy
-
-- Support for new macOS versions is planned.
-- Additional details on the support policy and image update release process are documented
- [in this project](https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/55bf59c8fa88712960afff2bf6ecc5daa879a8f5/docs/overview.md#os-images).
+| VM image | Status | Included software |
+|---------------------------|--------|--------------------|
+| `macos-10.13-xcode-7` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
+| `macos-10.13-xcode-8` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
+| `macos-10.13-xcode-9` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/high-sierra.yml> |
+| `macos-10.14-xcode-10` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/mojave.yml> |
+| `macos-10.15-xcode-11` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/catalina.yml> |
+| `macos-11-xcode-12` | `frozen` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/big-sur.yml> |
+| `macos-12-xcode-13` | `maintenance` | <https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/macstadium/orka/-/blob/main/toolchain/monterey.yml> |
+| (none, awaiting macOS 13) | `beta` | |
diff --git a/doc/ci/runners/saas/macos_saas_runner.md b/doc/ci/runners/saas/macos_saas_runner.md
index bad9da960b2..0ab2de36f10 100644
--- a/doc/ci/runners/saas/macos_saas_runner.md
+++ b/doc/ci/runners/saas/macos_saas_runner.md
@@ -4,10 +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 (beta) **(PREMIUM SAAS)**
+# SaaS runners on macOS (Limited Availability) **(PREMIUM SAAS)**
-SaaS runners on macOS are in [Beta](../../../policy/alpha-beta-support.md#beta-features)
-and shouldn't be relied upon for mission-critical production jobs.
+SaaS runners on macOS are now in [Limited Availability](../../../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).
@@ -15,11 +14,17 @@ Use these runners to build, test, and deploy apps for the Apple ecosystem (macOS
of all the capabilities of the GitLab single DevOps platform and not have to manage or operate a
build environment.
+CI/CD minutes used on GitLab SaaS macOS runners are included in your CI/CD minute consumption totals. CI jobs that run on macOS **will** consume CI minutes at a faster rate than CI jobs on the GitLab SaaS runners on Linux.
+
+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.
+
## Quickstart
-To start using SaaS runners on macOS, you must submit an access request [issue](https://gitlab.com/gitlab-com/macos-buildcloud-runners-beta/-/issues/new?issuable_template=beta_access_request). After your
-access has been granted and your build environment configured, you must configure your
-`.gitlab-ci.yml` pipeline file:
+To start using SaaS runners on macOS, you must be an active GitLab SaaS Premium or Ultimate customer. Participants in the GitLab Open Source program are also eligible to use the service.
+
+### Configuring your pipeline
+
+To start using the SaaS runners on macOS to run your CI jobs, you must configure your `.gitlab-ci.yml` file:
1. Add a `.gitlab-ci.yml` file to your project repository.
1. Specify the [image](macos/environment.md#vm-images) you want to use.
@@ -27,7 +32,7 @@ access has been granted and your build environment configured, you must configur
The runners automatically run your build.
-## Example `.gitlab-ci.yml` file
+### Example `.gitlab-ci.yml` file
The following sample `.gitlab-ci.yml` file shows how to start using the SaaS runners on macOS:
@@ -42,7 +47,7 @@ stages:
- test
before_script:
- - echo "started by ${GITLAB_USER_NAME}"
+ - echo "started by ${GITLAB_USER_NAME}"
build:
extends:
@@ -60,4 +65,13 @@ test:
```
NOTE:
-During the Beta period, the architecture of this solution will change. Rather than the jobs running on a specific VM instance, they will run on an ephemeral VM instance that is created by an autoscaling instance, known as the Runner Manager. We will notify all Beta participants of any downtime required to do this work.
+You can specify a different Xcode image to run a job. To do so, replace the value for the `image` keyword with the value of the [virtual machine image name](macos/environment.md#vm-images) from the list of available images.
+
+## SaaS runners on macOS service level objective
+
+In SaaS runners on macOS, the objective is to make 90% of CI jobs start executing in 120 seconds or less. The error rate should be less than 0.5%.
+
+## Known Limitations and Usage Constraints
+
+- If the VM image does not include the specific software version you need for your job, then the job execution time will increase as the required software needs to be fetched and installed.
+- At this time, it is not possible to bring your own OS image.
diff --git a/doc/ci/secure_files/index.md b/doc/ci/secure_files/index.md
index 3cc38a8b74c..2bf360e69f1 100644
--- a/doc/ci/secure_files/index.md
+++ b/doc/ci/secure_files/index.md
@@ -47,7 +47,6 @@ The response returns all of the metadata for the file you just uploaded. For exa
"name": "myfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
"checksum_algorithm": "sha256",
- "permissions": "read_only",
"created_at": "2022-02-22T22:22:22.222Z"
}
```
@@ -71,7 +70,6 @@ The response returns an array of all of the secure files in the project. For exa
"name": "myfile.jks",
"checksum": "16630b189ab34b2e3504f4758e1054d2e478deda510b2b08cc0ef38d12e80aac",
"checksum_algorithm": "sha256",
- "permissions": "read_only",
"created_at": "2022-02-22T22:22:22.222Z"
}]
```
diff --git a/doc/ci/services/index.md b/doc/ci/services/index.md
index e6406818b4c..e876c6d7326 100644
--- a/doc/ci/services/index.md
+++ b/doc/ci/services/index.md
@@ -80,7 +80,7 @@ As mentioned before, this feature is designed to provide **network accessible**
services. A database is the simplest example of such a service.
The services feature is not designed to, and does not, add any software from the
-defined `services` image(s) to the job's container.
+defined `services` images to the job's container.
For example, if you have the following `services` defined in your job, the `php`,
`node` or `go` commands are **not** available for your script, and the job fails:
diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md
index 81cb924532c..1757543be5b 100644
--- a/doc/ci/troubleshooting.md
+++ b/doc/ci/troubleshooting.md
@@ -16,7 +16,7 @@ This guide also lists common issues and possible solutions.
An early source of problems can be incorrect syntax. The pipeline shows a `yaml invalid`
badge and does not start running if any syntax or formatting problems are found.
-### Edit `gitlab-ci.yml` with the pipeline editor
+### Edit `.gitlab-ci.yml` with the pipeline editor
The [pipeline editor](pipeline_editor/index.md) is the recommended editing
experience (rather than the single file editor or the Web IDE). It includes:
@@ -331,6 +331,12 @@ busy_resources.pluck(:build_id)
busy_resources.update_all(build_id: nil)
```
+### Job log slow to update
+
+When you visit the job log page for a running job, there could be a delay of up to
+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.
+
## 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 30d53a340a9..90403351b11 100644
--- a/doc/ci/variables/index.md
+++ b/doc/ci/variables/index.md
@@ -168,7 +168,7 @@ To add or update variables in the project settings:
- **Type**: [`File` or `Variable`](#cicd-variable-types).
- **Environment scope**: Optional. `All`, or specific [environments](../environments/index.md).
- **Protect variable** Optional. If selected, the variable is only available
- in pipelines that run on protected branches or tags.
+ in pipelines that run on [protected branches](../../user/project/protected_branches.md) or [protected tags](../../user/project/protected_tags.md).
- **Mask variable** Optional. If selected, the variable's **Value** is masked
in job logs. The variable fails to save if the value does not meet the
[masking requirements](#mask-a-cicd-variable).
@@ -367,18 +367,21 @@ a large value to the trace log has the potential to be [revealed](https://gitlab
When using GitLab Runner 14.2, only the tail of the variable, characters beyond 4KiB in length, have the potential to
be revealed.
-### Protect a CI/CD variable
+### Protected CI/CD variables
-You can protect a project, group or instance CI/CD variable so it is only passed
-to pipelines running on [protected branches](../../user/project/protected_branches.md)
+You can configure a project, group, or instance CI/CD variable to be available
+only to pipelines that run on [protected branches](../../user/project/protected_branches.md)
or [protected tags](../../user/project/protected_tags.md).
-[Merge request pipelines](../pipelines/merge_request_pipelines.md) do not have access to protected variables.
-An [issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/28002) regarding this limitation.
+[Merged results pipelines](../pipelines/merge_request_pipelines.md#types-of-merge-request-pipelines), which run on a
+temporary merge commit, not a branch or tag, do not have access to these variables.
+
+Pipelines that run directly on the merge request's source branch, with no added merge commit, can access
+these variables if the source branch is a protected branch.
-To protect a variable:
+To mark a variable as protected:
-1. Go to **Settings > CI/CD** in the project, group or instance admin area.
+1. Go to **Settings > CI/CD** in the project, group or instance Admin Area.
1. Expand the **Variables** section.
1. Next to the variable you want to protect, select **Edit**.
1. Select the **Protect variable** checkbox.
@@ -729,7 +732,7 @@ the variable can be available for.
To learn more about scoping environments, see [Scoping environments with specs](../environments/index.md#scope-environments-with-specs).
To learn more about ensuring CI/CD variables are only exposed in pipelines running from protected
-branches or tags, see [Protect a CI/CD Variable](#protect-a-cicd-variable).
+branches or tags, see [Protected CI/CD variables](#protected-cicd-variables).
## Deployment variables
@@ -848,8 +851,8 @@ if [[ -d "/builds/gitlab-examples/ci-debug-trace/.git" ]]; then
++ CI_SERVER_PROTOCOL=https
++ export CI_SERVER_NAME=GitLab
++ CI_SERVER_NAME=GitLab
-++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
-++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,pseudonymizer,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
+++ export GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
+++ GITLAB_FEATURES=audit_events,burndown_charts,code_owners,contribution_analytics,description_diffs,elastic_search,group_bulk_edit,group_burndown_charts,group_webhooks,issuable_default_templates,issue_weights,jenkins_integration,ldap_group_sync,member_lock,merge_request_approvers,multiple_issue_assignees,multiple_ldap_servers,multiple_merge_request_assignees,protected_refs_for_users,push_rules,related_issues,repository_mirrors,repository_size_limit,scoped_issue_board,usage_quotas,visual_review_app,wip_limits,adjourned_deletion_for_projects_and_groups,admin_audit_log,auditor_user,batch_comments,blocking_merge_requests,board_assignee_lists,board_milestone_lists,ci_cd_projects,cluster_deployments,code_analytics,code_owner_approval_required,commit_committer_check,cross_project_pipelines,custom_file_templates,custom_file_templates_for_namespace,custom_project_templates,custom_prometheus_metrics,cycle_analytics_for_groups,db_load_balancing,default_project_deletion_protection,dependency_proxy,deploy_board,design_management,email_additional_text,extended_audit_events,external_authorization_service_api_management,feature_flags,file_locks,geo,github_project_service_integration,group_allowed_email_domains,group_project_templates,group_saml,issues_analytics,jira_dev_panel_integration,ldap_group_sync_filter,merge_pipelines,merge_request_performance_metrics,merge_trains,metrics_reports,multiple_approval_rules,multiple_group_issue_boards,object_storage,operations_dashboard,packages,productivity_analytics,project_aliases,protected_environments,reject_unsigned_commits,required_ci_templates,scoped_labels,service_desk,smartcard_auth,group_timelogs,type_of_work_analytics,unprotection_restrictions,ci_project_subscriptions,cluster_health,container_scanning,dast,dependency_scanning,epics,group_ip_restriction,incident_management,insights,license_management,personal_access_token_expiration_policy,pod_logs,prometheus_alerts,report_approver_rules,sast,security_dashboard,tracing,web_ide_terminal
++ export CI_PROJECT_ID=17893
++ CI_PROJECT_ID=17893
++ export CI_PROJECT_NAME=ci-debug-trace
diff --git a/doc/ci/variables/predefined_variables.md b/doc/ci/variables/predefined_variables.md
index 3b504b02fae..f8f775a6df4 100644
--- a/doc/ci/variables/predefined_variables.md
+++ b/doc/ci/variables/predefined_variables.md
@@ -14,8 +14,6 @@ Some variables are only available with more recent versions of [GitLab Runner](h
You can [output the values of all variables available for a job](index.md#list-all-environment-variables)
with a `script` command.
-There are also [Kubernetes-specific deployment variables (deprecated)](../../user/project/clusters/deploy_to_cluster.md#deployment-variables).
-
There are also a number of [variables you can use to configure runner behavior](../runners/configure_runners.md#configure-runner-behavior-with-variables) globally or for individual jobs.
| Variable | GitLab | Runner | Description |
diff --git a/doc/ci/yaml/artifacts_reports.md b/doc/ci/yaml/artifacts_reports.md
index b30b13e1ec0..289e8b91104 100644
--- a/doc/ci/yaml/artifacts_reports.md
+++ b/doc/ci/yaml/artifacts_reports.md
@@ -80,32 +80,30 @@ GitLab can display the results of one or more reports in:
- The [security dashboard](../../user/application_security/security_dashboard/index.md).
- The [Project Vulnerability report](../../user/application_security/vulnerability_report/index.md).
-## `artifacts:reports:cobertura` (DEPRECATED)
+<!--- start_remove The following content will be removed on remove_date: '2023-08-22' -->
+
+## `artifacts:reports:cobertura` (removed)
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3708) in GitLab 12.9.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78132) in GitLab 14.9.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/348980) in GitLab 15.0.
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78132) in GitLab
-14.9 and replaced with `artifacts:reports:coverage_report` in 14.10.
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78132) in GitLab 14.9 and
+[removed](https://gitlab.com/gitlab-org/gitlab/-/issues/348980) in GitLab 15.0. Use `artifacts:reports:coverage_report`
+instead.
-The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/test_coverage_visualization.md).
-The collected Cobertura coverage reports upload to GitLab as an artifact.
-
-GitLab can display the results of one or more reports in the merge request
-[diff annotations](../../user/project/merge_requests/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.
+<!--- end_remove -->
## `artifacts:reports:coverage_report`
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) in GitLab 14.9.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/344533) in GitLab 14.10.
-Use `coverage_report` to collect coverage report in Cobertura format, similar to `artifacts:reports:cobertura`.
+Use `coverage_report` to collect coverage report in Cobertura format.
-NOTE:
-`artifacts:reports:coverage_report` cannot be used at the same time with `artifacts:reports:cobertura`.
+The `cobertura` report collects [Cobertura coverage XML files](../../user/project/merge_requests/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.
```yaml
artifacts:
diff --git a/doc/ci/yaml/includes.md b/doc/ci/yaml/includes.md
index e5a543e7130..838710834ba 100644
--- a/doc/ci/yaml/includes.md
+++ b/doc/ci/yaml/includes.md
@@ -344,7 +344,7 @@ You can only use the following rules with `include` (and only with [certain vari
include:
- local: builds.yml
rules:
- - if: '$INCLUDE_BUILDS == "true"'
+ - if: $INCLUDE_BUILDS == "true"
- local: deploys.yml
rules:
- if: $CI_COMMIT_BRANCH == "main"
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index b335e8e8545..eb587db6d5f 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -5,7 +5,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
type: reference
---
-# Keyword reference for the `.gitlab-ci.yml` file **(FREE)**
+# `.gitlab-ci.yml` keyword reference **(FREE)**
This document lists the configuration options for your GitLab `.gitlab-ci.yml` file.
@@ -16,7 +16,7 @@ This document lists the configuration options for your GitLab `.gitlab-ci.yml` f
When you are editing your `.gitlab-ci.yml` file, you can validate it with the
[CI Lint](../lint.md) tool.
-If you are editing this page, make sure you follow the [CI/CD YAML reference style guide](../../development/cicd/cicd_reference_documentation_guide.md).
+If you are editing content on this page, follow the [instructions for documenting keywords](../../development/cicd/cicd_reference_documentation_guide.md).
## Keywords
@@ -561,7 +561,7 @@ This same warning is displayed when:
The default value for `allow_failure` is:
- `true` for [manual jobs](../jobs/job_control.md#create-a-job-that-must-be-run-manually).
-- `false` for manual jobs that also use [`rules`](#rules).
+- `false` for jobs that use `when: manual` inside [`rules`](#rules).
- `false` in all other cases.
**Keyword type**: Job keyword. You can use it only as part of a job.
@@ -1350,8 +1350,6 @@ In this example:
**Additional details**:
-- Coverage regular expressions set in `gitlab-ci.yml` take precedence over coverage regular expression set in the
- [GitLab UI](../pipelines/settings.md#add-test-coverage-results-using-project-settings-deprecated).
- If there is more than one matched line in the job output, the last line is used
(the first result of reverse search).
- If there are multiple matches in a single line, the last match is searched
@@ -1561,7 +1559,7 @@ environment.
#### `environment:action`
-Use the `action` keyword to specify jobs that prepare, start, or stop environments.
+Use the `action` keyword to specify how the job interacts with the environment.
**Keyword type**: Job keyword. You can use it only as part of a job.
@@ -1570,8 +1568,10 @@ Use the `action` keyword to specify jobs that prepare, start, or stop environmen
| **Value** | **Description** |
|:----------|:----------------|
| `start` | Default value. Indicates that the job starts the environment. The deployment is created after the job starts. |
-| `prepare` | Indicates that the job is only preparing the environment. It does not trigger deployments. [Read more about preparing environments](../environments/index.md#prepare-an-environment-without-creating-a-deployment). |
+| `prepare` | Indicates that the job is only preparing the environment. It does not trigger deployments. [Read more about preparing environments](../environments/index.md#access-an-environment-for-preparation-or-verification-purposes). |
| `stop` | Indicates that the job stops a deployment. For more detail, read [Stop an environment](../environments/index.md#stop-an-environment). |
+| `verify` | Indicates that the job is only verifying the environment. It does not trigger deployments. [Read more about verifying environments](../environments/index.md#access-an-environment-for-preparation-or-verification-purposes). |
+| `access` | Indicates that the job is only accessing the environment. It does not trigger deployments. [Read more about accessing environments](../environments/index.md#access-an-environment-for-preparation-or-verification-purposes). |
**Example of `environment:action`**:
@@ -3071,12 +3071,12 @@ to configure the job behavior, or with [`workflow`](#workflow) to configure the
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH'
+ - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
when: never
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/'
+ - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^feature/
when: manual
allow_failure: true
- - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME'
+ - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
```
**Additional details**:
@@ -3090,6 +3090,8 @@ job:
- Unlike variables in [`script`](../variables/index.md#use-cicd-variables-in-job-scripts)
sections, variables in rules expressions are always formatted as `$VARIABLE`.
- You can use `rules:if` with `include` to [conditionally include other configuration files](includes.md#use-rules-with-include).
+- In [GitLab 15.0 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/35438),
+ variables on the right side of `=~` and `!~` expressions are evaluated as regular expressions.
**Related topics**:
@@ -3122,7 +3124,7 @@ branch or merge request pipelines.
docker build:
script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
changes:
- Dockerfile
when: manual
@@ -3203,7 +3205,7 @@ job to run before continuing.
job:
script: echo "Hello, Rules!"
rules:
- - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+ - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
when: manual
allow_failure: true
```
@@ -3666,6 +3668,10 @@ trigger_job:
earlier, using them together causes the error `jobs:#{job-name} when should be on_success, on_failure or always`.
- In [GitLab 13.2 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/197140/), you can
view which job triggered a downstream pipeline in the [pipeline graph](../pipelines/index.md#visualize-pipelines).
+- [Manual pipeline variables](../variables/index.md#override-a-defined-cicd-variable)
+ and [scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule)
+ are not passed to downstream pipelines by default. Use [trigger:forward](#triggerforward)
+ to forward these variables to downstream pipelines.
**Related topics**:
@@ -3796,7 +3802,11 @@ deploy_review_job:
- All YAML-defined variables are also set to any linked [Docker service containers](../services/index.md).
- YAML-defined variables are meant for non-sensitive project configuration. Store sensitive information
- in [protected variables](../variables/index.md#protect-a-cicd-variable) or [CI/CD secrets](../secrets/index.md).
+ in [protected variables](../variables/index.md#protected-cicd-variables) or [CI/CD secrets](../secrets/index.md).
+- [Manual pipeline variables](../variables/index.md#override-a-defined-cicd-variable)
+ and [scheduled pipeline variables](../pipelines/schedules.md#add-a-pipeline-schedule)
+ are not passed to downstream pipelines by default. Use [trigger:forward](#triggerforward)
+ to forward these variables to downstream pipelines.
**Related topics**:
diff --git a/doc/ci/yaml/workflow.md b/doc/ci/yaml/workflow.md
index b46d504edfa..a985db14d08 100644
--- a/doc/ci/yaml/workflow.md
+++ b/doc/ci/yaml/workflow.md
@@ -38,7 +38,7 @@ workflow:
rules:
- if: $CI_COMMIT_MESSAGE =~ /-draft$/
when: never
- - if: '$CI_PIPELINE_SOURCE == "push"'
+ - if: $CI_PIPELINE_SOURCE == "push"
```
This example has strict rules, and pipelines do **not** run in any other case.
@@ -50,9 +50,9 @@ All other pipeline types run. For example:
```yaml
workflow:
rules:
- - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ - if: $CI_PIPELINE_SOURCE == "schedule"
when: never
- - if: '$CI_PIPELINE_SOURCE == "push"'
+ - if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
```
@@ -81,18 +81,20 @@ but does not run pipelines for any other case. It runs:
```yaml
workflow:
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
- - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
```
-If the pipeline is triggered by:
+If GitLab attempts to trigger:
-- A merge request, run a merge request pipeline. For example, a merge request pipeline
+- A merge request pipeline, start the pipeline. For example, a merge request pipeline
can be triggered by a push to a branch with an associated open merge request.
-- A change to a branch, but a merge request is open for that branch, do not run a branch pipeline.
-- A change to a branch, but without any open merge requests, run a branch pipeline.
+- A branch pipeline, but a merge request is open for that branch, do not run the branch pipeline.
+ For example, a branch pipeline can be triggered by a change to a branch, an API call,
+ a scheduled pipeline, and so on.
+- A branch pipeline, but there is no merge request open for the branch, run the branch pipeline.
You can also add a rule to an existing `workflow` section to switch from branch pipelines
to merge request pipelines when a merge request is created.
diff --git a/doc/development/adding_database_indexes.md b/doc/development/adding_database_indexes.md
index d263d9b5eb5..35dbd80e4d1 100644
--- a/doc/development/adding_database_indexes.md
+++ b/doc/development/adding_database_indexes.md
@@ -158,7 +158,7 @@ and should not be used. Some other points to consider:
### Why explicit names are required
As Rails is database agnostic, it generates an index name only
-from the required options of all indexes: table name and column name(s).
+from the required options of all indexes: table name and column names.
For example, imagine the following two indexes are created in a migration:
```ruby
@@ -173,7 +173,7 @@ 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.
-It considers only the table name, column name(s) and uniqueness specification
+It considers only the table name, column names, and uniqueness specification
of the index when making a comparison. Consider:
```ruby
@@ -284,8 +284,9 @@ production clone.
### Add a migration to create the index synchronously
After the index is verified to exist on the production database, create a second
-merge request that adds the index synchronously. The synchronous
-migration results in a no-op on GitLab.com, but you should still add the
+merge request that adds the index synchronously. The schema changes must be
+updated and committed to `structure.sql` in this second merge request.
+The synchronous migration results in a no-op on GitLab.com, but you should still add the
migration as expected for other installations. The below block
demonstrates how to create the second migration for the previous
asynchronous example.
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index 4f27e811b11..f807ed0f85e 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -97,7 +97,7 @@ discussed in [Nullable fields](#nullable-fields).
Fields that use the [`feature_flag` property](#feature_flag-property) and the flag is disabled by default are exempt
from the deprecation process, and can be removed at any time without notice.
-See the [deprecating fields, arguments, and enum values](#deprecating-fields-arguments-and-enum-values) section for how to deprecate items.
+See the [deprecating schema items](#deprecating-schema-items) section for how to deprecate items.
## Global IDs
@@ -540,19 +540,39 @@ def foo
end
```
-## Deprecating fields, arguments, and enum values
+## Deprecating schema items
The GitLab GraphQL API is versionless, which means we maintain backwards
compatibility with older versions of the API with every change.
-Rather than removing fields, arguments, or [enum values](#enums), they
-must be _deprecated_ instead.
+Rather than removing fields, arguments, [enum values](#enums), or [mutations](#mutations),
+they must be _deprecated_ instead.
The deprecated parts of the schema can then be removed in a future release
in accordance with the [GitLab deprecation process](../api/graphql/index.md#deprecation-and-removal-process).
-Fields, arguments, and enum values are deprecated using the `deprecated` property.
-The value of the property is a `Hash` of:
+To deprecate a schema item in GraphQL:
+
+1. [Create a deprecation issue](#create-a-deprecation-issue) for the item.
+1. [Mark the item as deprecated](#mark-the-item-as-deprecated) in the schema.
+
+See also:
+
+- [Aliasing and deprecating mutations](#aliasing-and-deprecating-mutations).
+- [How to filter Kibana for queries that used deprecated fields](graphql_guide/monitoring.md#queries-that-used-a-deprecated-field).
+
+### Create a deprecation issue
+
+Every GraphQL deprecation should have a deprecation issue created [using the `Deprecations` issue template](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Deprecations) to track its deprecation and removal.
+
+Apply these two labels to the deprecation issue:
+
+- `~GraphQL`
+- `~deprecation`
+
+### Mark the item as deprecated
+
+Fields, arguments, enum values, and mutations are deprecated using the `deprecated` property. The value of the property is a `Hash` of:
- `reason` - Reason for the deprecation.
- `milestone` - Milestone that the field was deprecated.
@@ -569,7 +589,7 @@ The original `description` of the things being deprecated should be maintained,
and should _not_ be updated to mention the deprecation. Instead, the `reason`
is appended to the `description`.
-### Deprecation reason style guide
+#### Deprecation reason style guide
Where the reason for deprecation is due to the field, argument, or enum value being
replaced, the `reason` must indicate the replacement. For example, the
@@ -601,7 +621,7 @@ end
If the field, argument, or enum value being deprecated is not being replaced,
a descriptive deprecation `reason` should be given.
-### Deprecate Global IDs
+#### Deprecate Global IDs
We use the [`rails/globalid`](https://github.com/rails/globalid) gem to generate and parse
Global IDs, so as such they are coupled to model names. When we rename a
@@ -698,11 +718,6 @@ aware of the support.
The documentation will mention that the old Global ID style is now deprecated.
-See also:
-
-- [Aliasing and deprecating mutations](#aliasing-and-deprecating-mutations).
-- [How to filter Kibana for queries that used deprecated fields](graphql_guide/monitoring.md#queries-that-used-a-deprecated-field).
-
## Enums
GitLab GraphQL enums are defined in `app/graphql/types`. When defining new enums, the
@@ -748,7 +763,7 @@ end
```
Enum values can be deprecated using the
-[`deprecated` keyword](#deprecating-fields-arguments-and-enum-values).
+[`deprecated` keyword](#deprecating-schema-items).
### Defining GraphQL enums dynamically from Rails enums
@@ -1713,7 +1728,7 @@ mount_aliased_mutation 'BarMutation', Mutations::FooMutation
```
This allows us to rename a mutation and continue to support the old name,
-when coupled with the [`deprecated`](#deprecating-fields-arguments-and-enum-values)
+when coupled with the [`deprecated`](#deprecating-schema-items)
argument.
Example:
diff --git a/doc/development/application_slis/index.md b/doc/development/application_slis/index.md
index a202bc419e1..2834723fc01 100644
--- a/doc/development/application_slis/index.md
+++ b/doc/development/application_slis/index.md
@@ -30,18 +30,33 @@ to be emitted from the rails application:
## Defining a new SLI
-An SLI can be defined using the `Gitlab::Metrics::Sli` class.
+An SLI can be defined using the `Gitlab::Metrics::Sli::Apdex` or
+`Gitlab::Metrics::Sli::ErrorRate` class. These work in broadly the same way, but
+for clarity, they define different metric names:
+
+1. `Gitlab::Metrics::Sli::Apdex.new('foo')` defines:
+ 1. `gitlab_sli:foo_apdex:total` for the total number of measurements.
+ 1. `gitlab_sli:foo_apdex:success_total` for the number of successful
+ measurements.
+1. `Gitlab::Metrics::Sli::ErrorRate.new('foo')` defines:
+ 1. `gitlab_sli:foo_error_rate:total` for the total number of measurements.
+ 1. `gitlab_sli:foo_error_rate:error_total` for the number of error
+ measurements - as this is an error rate, it's more natural to talk about
+ errors divided by the total.
+
+As shown in this example, they can share a base name (`foo` in this example). We
+recommend this when they refer to the same operation.
Before the first scrape, it is important to have [initialized the SLI
with all possible
label-combinations](https://prometheus.io/docs/practices/instrumentation/#avoid-missing-metrics). This
avoid confusing results when using these counters in calculations.
-To initialize an SLI, use the `.inilialize_sli` class method, for
+To initialize an SLI, use the `.initialize_sli` class method, for
example:
```ruby
-Gitlab::Metrics::Sli.initialize_sli(:received_email, [
+Gitlab::Metrics::Sli::Apdex.initialize_sli(:received_email, [
{
feature_category: :team_planning,
email_type: :create_issue
@@ -67,7 +82,7 @@ this adds is understood and acceptable.
Tracking an operation in the newly defined SLI can be done like this:
```ruby
-Gitlab::Metrics::Sli[:received_email].increment(
+Gitlab::Metrics::Sli::Apdex[:received_email].increment(
labels: {
feature_category: :service_desk,
email_type: :service_desk
@@ -79,20 +94,26 @@ Gitlab::Metrics::Sli[:received_email].increment(
Calling `#increment` on this SLI will increment the total Prometheus counter
```prometheus
-gitlab_sli:received_email:total{ feature_category='service_desk', email_type='service_desk' }
+gitlab_sli:received_email_apdex:total{ feature_category='service_desk', email_type='service_desk' }
```
-If the `success:` argument passed is truthy, then the success counter
-will also be incremented:
+If the `success:` argument passed is truthy, then the success counter will also
+be incremented:
```prometheus
-gitlab_sli:received_email:success_total{ feature_category='service_desk', email_type='service_desk' }
+gitlab_sli:received_email_apdex:success_total{ feature_category='service_desk', email_type='service_desk' }
```
-So far, only tracking `apdex` using a success rate is supported. If you
-need to track errors this way, please upvote
-[this issue](https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1395)
-and leave a comment so we can prioritize this.
+For error rate SLIs, the equivalent argument is called `error:`:
+
+```ruby
+Gitlab::Metrics::Sli::ErrorRate[:merge].increment(
+ labels: {
+ merge_type: :fast_forward
+ },
+ error: !merge_success?
+)
+```
## Using the SLI in service monitoring and alerts
diff --git a/doc/development/application_slis/rails_request_apdex.md b/doc/development/application_slis/rails_request_apdex.md
index 373589aaefc..f9613a14dd1 100644
--- a/doc/development/application_slis/rails_request_apdex.md
+++ b/doc/development/application_slis/rails_request_apdex.md
@@ -136,8 +136,19 @@ information in the logs to check:
1. The table loads information for the busiest endpoints by
default. To speed the response, add both:
- - A filter for `json.caller_id.keyword`.
- - The identifier you're interested in, such as `Projects::RawController#show`.
+
+ - A filter for `json.meta.caller_id.keyword`.
+ - The identifier you're interested in, for example:
+
+ ```ruby
+ Projects::RawController#show
+ ```
+
+ or:
+
+ ```plaintext
+ GET /api/:version/projects/:id/snippets/:snippet_id/raw
+ ```
1. Check the [appropriate percentile duration](#request-apdex-slo) for
the service handling the endpoint. The overall duration should
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
index dd432dd5e37..486ef6d27fc 100644
--- a/doc/development/architecture.md
+++ b/doc/development/architecture.md
@@ -347,7 +347,7 @@ Component statuses are linked to configuration documentation for each component.
| [Elasticsearch](#elasticsearch) | Improved search within GitLab | ⤓ | ⚙ | ⤓ | ⤓ | ✅ | ⤓ | ⚙ | EE Only |
| [Gitaly](#gitaly) | Git RPC service for handling all Git calls made by GitLab | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | CE & EE |
| [GitLab Exporter](#gitlab-exporter) | Generates a variety of GitLab metrics | ✅ | ✅ | ✅ | ✅ | ✅ | ⌠| ⌠| CE & EE |
-| [GitLab Geo Node](#gitlab-geo) | Geographically distributed GitLab nodes | ⚙ | ⚙ | ⌠| ⌠| ✅ | ⌠| ⚙ | EE Only |
+| [GitLab Geo](#gitlab-geo) | Geographically distributed GitLab site | ⚙ | ⚙ | ⌠| ⌠| ✅ | ⌠| ⚙ | EE Only |
| [GitLab Pages](#gitlab-pages) | Hosts static websites | ⚙ | ⚙ | ⌠| ⌠| ✅ | ⚙ | ⚙ | CE & EE |
| [GitLab agent](#gitlab-agent) | Integrate Kubernetes clusters in a cloud-native way | ⚙ | ⚙ | ⚙ | ⌠| ⌠| ⤓ | ⚙ | EE Only |
| [GitLab self-monitoring: Alertmanager](#alertmanager) | Deduplicates, groups, and routes alerts from Prometheus | ⚙ | ⚙ | ✅ | ⚙ | ✅ | ⌠| ⌠| CE & EE |
diff --git a/doc/development/audit_event_guide/index.md b/doc/development/audit_event_guide/index.md
index 34f78174e5b..0d62bcdc3b2 100644
--- a/doc/development/audit_event_guide/index.md
+++ b/doc/development/audit_event_guide/index.md
@@ -25,7 +25,7 @@ To instrument an audit event, the following attributes should be provided:
| `scope` | User, Project, Group | true | Scope which the audit event belongs to |
| `target` | Object | true | Target object being audited |
| `message` | String | true | Message describing the action |
-| `created_at` | DateTime | false | The time when the action occured. Defaults to `DateTime.current` |
+| `created_at` | DateTime | false | The time when the action occurred. Defaults to `DateTime.current` |
## How to instrument new Audit Events
diff --git a/doc/development/backend/create_source_code_be/gitaly_touch_points.md b/doc/development/backend/create_source_code_be/gitaly_touch_points.md
new file mode 100644
index 00000000000..5ac362e709f
--- /dev/null
+++ b/doc/development/backend/create_source_code_be/gitaly_touch_points.md
@@ -0,0 +1,27 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Source Code - Gitaly Touch Points
+
+## RPCs
+
+Gitaly is a wrapper around the `git` binary, running in a [Gitaly Cluster](../../../administration/gitaly/index.md). It provides managed access to the file system housing the `git` repositories, via Golang Remote Procedure Calls (RPCs). Other functions are access optimization, caching, and a form of pagination against the file system.
+
+The comprehensive [Beginner's guide to Gitaly contributions](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/beginners_guide.md) is focused on making updates to Gitaly, and offers many insights into how to understand the Gitaly code.
+
+All access to Gitaly from other parts of GitLab are through Create: Source Code endpoints:
+
+## The `Commit` model
+
+After a call is made to Gitaly, Git `commit` information is stored in memory. This information is wrapped by the [Ruby `Commit` Model](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/commit.rb), which is a wrapper around [`Gitlab::Git::Commit`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/git/commit.rb).
+
+The `Commit` model acts like an ActiveRecord object, but it does not have a PostgreSQL backend. Instead, it maps back to Gitaly RPCs.
+
+## Rugged Patches
+
+Historically in GitLab, access to the server-based `git` repositories was provided through the [rugged](https://github.com/libgit2/rugged) RubyGem, which provides Ruby bindings to `libgit2`. This was further extended by what is termed "Rugged Patches", [a set of extensions to the Rugged library](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/57317). Rugged implementations of some of the most commonly-used RPCs can be [enabled via feature flags](../../gitaly.md#legacy-rugged-code).
+
+Rugged access requires the use of a NFS file system, a direction GitLab is moving away from in favor of Gitaly Cluster. Rugged has been proposed for [deprecation and removal](https://gitlab.com/gitlab-org/gitaly/-/issues/1690). Several large customers are still using NFS, and a specific removal date is not planned at this point.
diff --git a/doc/development/backend/create_source_code_be/index.md b/doc/development/backend/create_source_code_be/index.md
index 8661d8b4d74..ad4e25dc815 100644
--- a/doc/development/backend/create_source_code_be/index.md
+++ b/doc/development/backend/create_source_code_be/index.md
@@ -35,107 +35,13 @@ for GitLab Shell.
## GitLab Rails
-### Source code API endpoints
+### Gitaly touch points
-| Endpoint | Threshold | Source |
-| -----------------------------------------------------------------------------------|---------------------------------------|--------------------------------------------------------------------------------------|
-| `DELETE /api/:version/projects/:id/protected_branches/:name` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
-| `GET /api/:version/internal/authorized_keys` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) | | |
-| `GET /api/:version/internal/lfs` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/lfs.rb)|
-| `GET /api/:version/projects/:id/approval_rules` | `:low` | |
-| `GET /api/:version/projects/:id/approval_settings` | default | |
-| `GET /api/:version/projects/:id/approvals` | default | |
-| `GET /api/:version/projects/:id/forks` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
-| `GET /api/:version/projects/:id/groups` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
-| `GET /api/:version/projects/:id/languages` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
-| `GET /api/:version/projects/:id/merge_request_approval_setting` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/merge_request_approval_settings.rb) |
-| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_rules` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/merge_request_approval_rules.rb) |
-| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_settings` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/project_approval_settings.rb) |
-| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_state` | `:low` | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
-| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approvals` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
-| `GET /api/:version/projects/:id/protected_branches` | default |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
-| `GET /api/:version/projects/:id/protected_branches/:name` | default |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
-| `GET /api/:version/projects/:id/protected_tags` | default | |
-| `GET /api/:version/projects/:id/protected_tags/:name` | default | |
-| `GET /api/:version/projects/:id/push_rule` | default | |
-| `GET /api/:version/projects/:id/remote_mirrors` | default | |
-| `GET /api/:version/projects/:id/repository/archive` | default | |
-| `GET /api/:version/projects/:id/repository/blobs/:sha` | default | |
-| `GET /api/:version/projects/:id/repository/blobs/:sha/raw` | default | |
-| `GET /api/:version/projects/:id/repository/branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/branches.rb) |
-| `GET /api/:version/projects/:id/repository/branches/:branch` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/branches.rb) |
-| `GET /api/:version/projects/:id/repository/commits` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
-| `GET /api/:version/projects/:id/repository/commits/:sha` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
-| `GET /api/:version/projects/:id/repository/commits/:sha/comments` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
-| `GET /api/:version/projects/:id/repository/commits/:sha/diff` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
-| `GET /api/:version/projects/:id/repository/commits/:sha/merge_requests` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
-| `GET /api/:version/projects/:id/repository/commits/:sha/refs` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
-| `GET /api/:version/projects/:id/repository/compare` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/repositories.rb) |
-| `GET /api/:version/projects/:id/repository/contributors` | default | |
-| `GET /api/:version/projects/:id/repository/files/:file_path` | default | |
-| `GET /api/:version/projects/:id/repository/files/:file_path/raw` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
-| `GET /api/:version/projects/:id/repository/tags` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/tags.rb) |
-| `GET /api/:version/projects/:id/repository/tree` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/repositories.rb) |
-| `GET /api/:version/projects/:id/statistics` | default | |
-| `GraphqlController#execute` | default | |
-| `HEAD /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
-| `HEAD /api/:version/projects/:id/repository/files/:file_path/raw` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
-| `POST /api/:version/internal/allowed` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
-| `POST /api/:version/internal/lfs_authenticate` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
-| `POST /api/:version/internal/post_receive` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
-| `POST /api/:version/internal/pre_receive` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
-| `POST /api/:version/projects/:id/approvals` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/project_approvals.rb) |
-| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/approvals` | `:low` | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
-| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/approve` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
-| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/unapprove` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb)|
-| `POST /api/:version/projects/:id/protected_branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb)|
-| `POST /api/:version/projects/:id/repository/commits` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
-| `POST /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
-| `PUT /api/:version/projects/:id/push_rule` | default | |
-| `PUT /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
-| `Projects::BlameController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blame_controller.rb) |
-| `Projects::BlobController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
-| `Projects::BlobController#diff` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
-| `Projects::BlobController#edit` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
-| `Projects::BlobController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
-| `Projects::BlobController#update` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
-| `Projects::BranchesController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
-| `Projects::BranchesController#destroy` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
-| `Projects::BranchesController#diverging_commit_counts` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
-| `Projects::BranchesController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
-| `Projects::BranchesController#new` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
-| `Projects::CommitController#branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
-| `Projects::CommitController#merge_requests` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
-| `Projects::CommitController#pipelines` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
-| `Projects::CommitController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
-| `Projects::CommitsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb)|
-| `Projects::CommitsController#signatures` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb) |
-| `Projects::CompareController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb) |
-| `Projects::CompareController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
-| `Projects::CompareController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
-| `Projects::CompareController#signatures` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
-| `Projects::FindFileController#list` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/find_file_controller.rb) |
-| `Projects::FindFileController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/find_file_controller.rb) |
-| `Projects::ForksController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/forks_controller.rb) |
-| `Projects::GraphsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/graphs_controller.rb) |
-| `Projects::NetworkController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/network_controller.rb) |
-| `Projects::PathLocksController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/controllers/projects/path_locks_controller.rb) |
-| `Projects::RawController#show` | default | |
-| `Projects::RefsController#logs_tree` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/refs_controller.rb) |
-| `Projects::RefsController#switch` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/refs_controller.rb) |
-| `Projects::RepositoriesController#archive` | default | |
-| `Projects::Settings::RepositoryController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/settings/repository_controller.rb) |
-| `Projects::TagsController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
-| `Projects::TagsController#new` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
-| `Projects::TagsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
-| `Projects::TemplatesController#names` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/templates_controller.rb) |
-| `Projects::TreeController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tree_controller.rb) |
-| `ProjectsController#refs` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects_controller.rb) |
-| `Repositories::GitHttpController#git_receive_pack` | default | |
-| `Repositories::GitHttpController#git_upload_pack` | default | |
-| `Repositories::GitHttpController#info_refs` | default | |
-| `Repositories::LfsApiController#batch` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_api_controller.rb) |
-| `Repositories::LfsLocksApiController#verify` | default | |
-| `Repositories::LfsStorageController#download` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
-| `Repositories::LfsStorageController#upload_authorize` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
-| `Repositories::LfsStorageController#upload_finalize` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
+Gitaly is a Golang RPC service which handles all the `git` calls made by GitLab.
+GitLab is not exposed directly, and all traffic comes through Create: Source Code.
+For more information, read [Gitaly touch points](gitaly_touch_points.md).
+
+### Source Code REST API Endpoints
+
+Create: Source Code has over 100 REST endpoints, being a mixture of Grape API endpoints and Rails controller endpoints.
+For a detailed list, refer to [Source Code REST Endpoints](rest_endpoints.md).
diff --git a/doc/development/backend/create_source_code_be/rest_endpoints.md b/doc/development/backend/create_source_code_be/rest_endpoints.md
new file mode 100644
index 00000000000..dd43bb914c9
--- /dev/null
+++ b/doc/development/backend/create_source_code_be/rest_endpoints.md
@@ -0,0 +1,112 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Source Code REST endpoints
+
+The Create :: Source Code team maintains these endpoints:
+
+| Endpoint | Threshold | Source |
+| -----------------------------------------------------------------------------------|---------------------------------------|--------------------------------------------------------------------------------------|
+| `DELETE /api/:version/projects/:id/protected_branches/:name` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
+| `GET /api/:version/internal/authorized_keys` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) | | |
+| `GET /api/:version/internal/lfs` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/lfs.rb)|
+| `GET /api/:version/projects/:id/approval_rules` | `:low` | |
+| `GET /api/:version/projects/:id/approval_settings` | default | |
+| `GET /api/:version/projects/:id/approvals` | default | |
+| `GET /api/:version/projects/:id/forks` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
+| `GET /api/:version/projects/:id/groups` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
+| `GET /api/:version/projects/:id/languages` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/projects.rb) |
+| `GET /api/:version/projects/:id/merge_request_approval_setting` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/merge_request_approval_settings.rb) |
+| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_rules` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/merge_request_approval_rules.rb) |
+| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_settings` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/project_approval_settings.rb) |
+| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approval_state` | `:low` | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
+| `GET /api/:version/projects/:id/merge_requests/:merge_request_iid/approvals` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
+| `GET /api/:version/projects/:id/protected_branches` | default |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
+| `GET /api/:version/projects/:id/protected_branches/:name` | default |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb) |
+| `GET /api/:version/projects/:id/protected_tags` | default | |
+| `GET /api/:version/projects/:id/protected_tags/:name` | default | |
+| `GET /api/:version/projects/:id/push_rule` | default | |
+| `GET /api/:version/projects/:id/remote_mirrors` | default | |
+| `GET /api/:version/projects/:id/repository/archive` | default | |
+| `GET /api/:version/projects/:id/repository/blobs/:sha` | default | |
+| `GET /api/:version/projects/:id/repository/blobs/:sha/raw` | default | |
+| `GET /api/:version/projects/:id/repository/branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/branches.rb) |
+| `GET /api/:version/projects/:id/repository/branches/:branch` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/branches.rb) |
+| `GET /api/:version/projects/:id/repository/commits` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
+| `GET /api/:version/projects/:id/repository/commits/:sha` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
+| `GET /api/:version/projects/:id/repository/commits/:sha/comments` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
+| `GET /api/:version/projects/:id/repository/commits/:sha/diff` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
+| `GET /api/:version/projects/:id/repository/commits/:sha/merge_requests` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
+| `GET /api/:version/projects/:id/repository/commits/:sha/refs` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb) |
+| `GET /api/:version/projects/:id/repository/compare` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/repositories.rb) |
+| `GET /api/:version/projects/:id/repository/contributors` | default | |
+| `GET /api/:version/projects/:id/repository/files/:file_path` | default | |
+| `GET /api/:version/projects/:id/repository/files/:file_path/raw` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
+| `GET /api/:version/projects/:id/repository/tags` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/tags.rb) |
+| `GET /api/:version/projects/:id/repository/tree` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/repositories.rb) |
+| `GET /api/:version/projects/:id/statistics` | default | |
+| `GraphqlController#execute` | default | |
+| `HEAD /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
+| `HEAD /api/:version/projects/:id/repository/files/:file_path/raw` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
+| `POST /api/:version/internal/allowed` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
+| `POST /api/:version/internal/lfs_authenticate` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
+| `POST /api/:version/internal/post_receive` | default | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
+| `POST /api/:version/internal/pre_receive` | `:high` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/internal/base.rb) |
+| `POST /api/:version/projects/:id/approvals` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/api/project_approvals.rb) |
+| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/approvals` | `:low` | [source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
+| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/approve` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb) |
+| `POST /api/:version/projects/:id/merge_requests/:merge_request_iid/unapprove` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/merge_request_approvals.rb)|
+| `POST /api/:version/projects/:id/protected_branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/protected_branches.rb)|
+| `POST /api/:version/projects/:id/repository/commits` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/commits.rb)|
+| `POST /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
+| `PUT /api/:version/projects/:id/push_rule` | default | |
+| `PUT /api/:version/projects/:id/repository/files/:file_path` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/files.rb) |
+| `Projects::BlameController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blame_controller.rb) |
+| `Projects::BlobController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
+| `Projects::BlobController#diff` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
+| `Projects::BlobController#edit` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
+| `Projects::BlobController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
+| `Projects::BlobController#update` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/blob_controller.rb) |
+| `Projects::BranchesController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
+| `Projects::BranchesController#destroy` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
+| `Projects::BranchesController#diverging_commit_counts` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
+| `Projects::BranchesController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
+| `Projects::BranchesController#new` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/branches_controller.rb) |
+| `Projects::CommitController#branches` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
+| `Projects::CommitController#merge_requests` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
+| `Projects::CommitController#pipelines` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
+| `Projects::CommitController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commit_controller.rb) |
+| `Projects::CommitsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb)|
+| `Projects::CommitsController#signatures` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb) |
+| `Projects::CompareController#create` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/commits_controller.rb) |
+| `Projects::CompareController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
+| `Projects::CompareController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
+| `Projects::CompareController#signatures` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/compare_controller.rb) |
+| `Projects::FindFileController#list` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/find_file_controller.rb) |
+| `Projects::FindFileController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/find_file_controller.rb) |
+| `Projects::ForksController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/forks_controller.rb) |
+| `Projects::GraphsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/graphs_controller.rb) |
+| `Projects::NetworkController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/network_controller.rb) |
+| `Projects::PathLocksController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/controllers/projects/path_locks_controller.rb) |
+| `Projects::RawController#show` | default | |
+| `Projects::RefsController#logs_tree` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/refs_controller.rb) |
+| `Projects::RefsController#switch` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/refs_controller.rb) |
+| `Projects::RepositoriesController#archive` | default | |
+| `Projects::Settings::RepositoryController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/settings/repository_controller.rb) |
+| `Projects::TagsController#index` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
+| `Projects::TagsController#new` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
+| `Projects::TagsController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tags_controller.rb) |
+| `Projects::TemplatesController#names` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/templates_controller.rb) |
+| `Projects::TreeController#show` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects/tree_controller.rb) |
+| `ProjectsController#refs` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/projects_controller.rb) |
+| `Repositories::GitHttpController#git_receive_pack` | default | |
+| `Repositories::GitHttpController#git_upload_pack` | default | |
+| `Repositories::GitHttpController#info_refs` | default | |
+| `Repositories::LfsApiController#batch` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_api_controller.rb) |
+| `Repositories::LfsLocksApiController#verify` | default | |
+| `Repositories::LfsStorageController#download` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
+| `Repositories::LfsStorageController#upload_authorize` | `:medium` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
+| `Repositories::LfsStorageController#upload_finalize` | `:low` |[source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/controllers/repositories/lfs_storage_controller.rb) |
diff --git a/doc/development/backend/ruby_style_guide.md b/doc/development/backend/ruby_style_guide.md
index 419db628b0d..6c8125a6157 100644
--- a/doc/development/backend/ruby_style_guide.md
+++ b/doc/development/backend/ruby_style_guide.md
@@ -13,7 +13,7 @@ Generally, if a style is not covered by [existing Rubocop rules or style guides]
Before adding a new cop to enforce a given style, make sure to discuss it with your team.
When the style is approved by a backend EM or by a BE staff eng, add a new section to this page to
document the new rule. For every new guideline, add it in a new section and link the discussion from the section's
-[version history note](../documentation/styleguide/index.md#version-text-in-the-version-history)
+[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.
diff --git a/doc/development/batched_background_migrations.md b/doc/development/batched_background_migrations.md
index e7703b5dd2b..f5f3655944b 100644
--- a/doc/development/batched_background_migrations.md
+++ b/doc/development/batched_background_migrations.md
@@ -1,319 +1,11 @@
---
-type: reference, dev
-stage: Enablement
-group: Database
-info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+redirect_to: 'database/batched_background_migrations.md'
+remove_date: '2022-07-26'
---
-# Batched background migrations
+This document was moved to [another location](database/batched_background_migrations.md).
-Batched Background Migrations should be used to perform data migrations whenever a
-migration exceeds [the time limits](migration_style_guide.md#how-long-a-migration-should-take)
-in our guidelines. For example, you can use batched background
-migrations to migrate data that's stored in a single JSON column
-to a separate table instead.
-
-## When to use batched background migrations
-
-Use a batched background migration when you migrate _data_ in tables containing
-so many rows that the process would exceed
-[the time limits in our guidelines](migration_style_guide.md#how-long-a-migration-should-take)
-if performed using a regular Rails migration.
-
-- Batched background migrations should be used when migrating data in
- [high-traffic tables](migration_style_guide.md#high-traffic-tables).
-- Batched background migrations may also be used when executing numerous single-row queries
- for every item on a large dataset. Typically, for single-record patterns, runtime is
- largely dependent on the size of the dataset. Split the dataset accordingly,
- and put it into background migrations.
-- Don't use batched background migrations to perform schema migrations.
-
-Background migrations can help when:
-
-- Migrating events from one table to multiple separate tables.
-- Populating one column based on JSON stored in another column.
-- Migrating data that depends on the output of external services. (For example, an API.)
-
-NOTE:
-If the batched background migration is part of an important upgrade, it must be announced
-in the release post. Discuss with your Project Manager if you're unsure if the migration falls
-into this category.
-
-## Isolation
-
-Batched background migrations must be isolated and can not use application code. (For example,
-models defined in `app/models`.). Because these migrations can take a long time to
-run, it's possible for new versions to deploy while the migrations are still running.
-
-## Idempotence
-
-Batched background migrations are executed in a context of a Sidekiq process.
-The usual Sidekiq rules apply, especially the rule that jobs should be small
-and idempotent. Make sure that in case that your migration job is retried, data
-integrity is guaranteed.
-
-See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
-for more details.
-
-## Batched background migrations for EE-only features
-
-All the background migration classes for EE-only features should be present in GitLab CE.
-For this purpose, create an empty class for GitLab CE, and extend it for GitLab EE
-as explained in the guidelines for
-[implementing Enterprise Edition features](ee_features.md#code-in-libgitlabbackground_migration).
-
-Batched Background migrations are simple classes that define a `perform` method. A
-Sidekiq worker then executes such a class, passing any arguments to it. All
-migration classes must be defined in the namespace
-`Gitlab::BackgroundMigration`. Place the files in the directory
-`lib/gitlab/background_migration/`.
-
-## Queueing
-
-Queueing a batched background migration should be done in a post-deployment
-migration. Use this `queue_batched_background_migration` example, queueing the
-migration to be executed in batches. Replace the class name and arguments with the values
-from your migration:
-
-```ruby
-queue_batched_background_migration(
- JOB_CLASS_NAME,
- TABLE_NAME,
- JOB_ARGUMENTS,
- JOB_INTERVAL
- )
-```
-
-Make sure the newly-created data is either migrated, or
-saved in both the old and new version upon creation. Removals in
-turn can be handled by defining foreign keys with cascading deletes.
-
-### Requeuing batched background migrations
-
-If one of the batched background migrations contains a bug that is fixed in a patch
-release, you must requeue the batched background migration so the migration
-repeats on systems that already performed the initial migration.
-
-When you requeue the batched background migration, turn the original
-queuing into a no-op by clearing up the `#up` and `#down` methods of the
-migration performing the requeuing. Otherwise, the batched background migration is
-queued multiple times on systems that are upgrading multiple patch releases at
-once.
-
-When you start the second post-deployment migration, delete the
-previously batched migration with the provided code:
-
-```ruby
-Gitlab::Database::BackgroundMigration::BatchedMigration
- .for_configuration(MIGRATION_NAME, TABLE_NAME, COLUMN, JOB_ARGUMENTS)
- .delete_all
-```
-
-## Cleaning up
-
-NOTE:
-Cleaning up any remaining background migrations must be done in either a major
-or minor release. You must not do this in a patch release.
-
-Because background migrations can take a long time, you can't immediately clean
-things up after queueing them. For example, you can't drop a column used in the
-migration process, as jobs would fail. You must add a separate _post-deployment_
-migration in a future release that finishes any remaining
-jobs before cleaning things up. (For example, removing a column.)
-
-To migrate the data from column `foo` (containing a big JSON blob) to column `bar`
-(containing a string), you would:
-
-1. Release A:
- 1. Create a migration class that performs the migration for a row with a given ID.
- 1. Update new rows using one of these techniques:
- - Create a new trigger for simple copy operations that don't need application logic.
- - Handle this operation in the model/service as the records are created or updated.
- - Create a new custom background job that updates the records.
- 1. Queue the batched background migration for all existing rows in a post-deployment migration.
-1. Release B:
- 1. Add a post-deployment migration that checks if the batched background migration is completed.
- 1. Deploy code so that the application starts using the new column and stops to update new records.
- 1. Remove the old column.
-
-Bump to the [import/export version](../user/project/settings/import_export.md) may
-be required, if importing a project from a prior version of GitLab requires the
-data to be in the new format.
-
-## Example
-
-The table `integrations` has a field called `properties`, stored in JSON. For all rows,
-extract the `url` key from this JSON object and store it in the `integrations.url`
-column. Millions of integrations exist, and parsing JSON is slow, so you can't
-do this work in a regular migration.
-
-1. Start by defining our migration class:
-
- ```ruby
- class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
- class Integration < ActiveRecord::Base
- self.table_name = 'integrations'
- end
-
- def perform(start_id, end_id)
- Integration.where(id: start_id..end_id).each do |integration|
- json = JSON.load(integration.properties)
-
- integration.update(url: json['url']) if json['url']
- rescue JSON::ParserError
- # If the JSON is invalid we don't want to keep the job around forever,
- # instead we'll just leave the "url" field to whatever the default value
- # is.
- next
- end
- end
- end
- ```
-
- NOTE:
- To get a `connection` in the batched background migration,use an inheritance
- relation using the following base class `Gitlab::BackgroundMigration::BaseJob`.
- For example: `class Gitlab::BackgroundMigration::ExtractIntegrationsUrl < Gitlab::BackgroundMigration::BaseJob`
-
-1. Add a new trigger to the database to update newly created and updated integrations,
- similar to this example:
-
- ```ruby
- execute(<<~SQL)
- CREATE OR REPLACE FUNCTION example() RETURNS trigger
- LANGUAGE plpgsql
- AS $$
- BEGIN
- NEW."url" := NEW.properties -> "url"
- RETURN NEW;
- END;
- $$;
- SQL
- ```
-
-1. Create a post-deployment migration that queues the migration for existing data:
-
- ```ruby
- class QueueExtractIntegrationsUrl < Gitlab::Database::Migration[1.0]
- disable_ddl_transaction!
-
- MIGRATION = 'ExtractIntegrationsUrl'
- DELAY_INTERVAL = 2.minutes
-
- def up
- queue_batched_background_migration(
- MIGRATION,
- :migrations,
- :id,
- job_interval: DELAY_INTERVAL
- )
- end
-
- def down
- Gitlab::Database::BackgroundMigration::BatchedMigration
- .for_configuration(MIGRATION, :migrations, :id, []).delete_all
- end
- end
- ```
-
- After deployment, our application:
- - Continues using the data as before.
- - Ensures that both existing and new data are migrated.
-
-1. In the next release, remove the trigger. We must also add a new post-deployment migration
- that checks that the batched background migration is completed. For example:
-
- ```ruby
- class FinalizeExtractIntegrationsUrlJobs < Gitlab::Database::Migration[1.0]
- MIGRATION = 'ExtractIntegrationsUrl'
- disable_ddl_transaction!
-
- def up
- ensure_batched_background_migration_is_finished(
- job_class_name: MIGRATION,
- table_name: :integrations,
- column_name: :id,
- job_arguments: []
- )
- end
-
- def down
- # no-op
- end
- end
- ```
-
- If the application does not depend on the data being 100% migrated (for
- instance, the data is advisory, and not mission-critical), then you can skip this
- final step. This step confirms that the migration is completed, and all of the rows were migrated.
-
-After the batched migration is completed, you can safely remove the `integrations.properties` column.
-
-## Testing
-
-Writing tests is required for:
-
-- The batched background migrations' queueing migration.
-- The batched background migration itself.
-- A cleanup migration.
-
-The `:migration` and `schema: :latest` RSpec tags are automatically set for
-background migration specs. Refer to the
-[Testing Rails migrations](testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
-style guide.
-
-Remember that `before` and `after` RSpec hooks
-migrate your database down and up. These hooks can result in other batched background
-migrations being called. Using `spy` test doubles with
-`have_received` is encouraged, instead of using regular test doubles, because
-your expectations defined in a `it` block can conflict with what is
-called in RSpec hooks. Refer to [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
-for more details.
-
-## Best practices
-
-1. Know how much data you're dealing with.
-1. Make sure the batched background migration jobs are idempotent.
-1. Confirm the tests you write are not false positives.
-1. If the data being migrated is critical and cannot be lost, the
- clean-up migration must also check the final state of the data before completing.
-1. Discuss the numbers with a database specialist. The migration may add
- more pressure on DB than you expect. Measure on staging,
- or ask someone to measure on production.
-1. Know how much time is required to run the batched background migration.
-
-## Additional tips and strategies
-
-### Viewing failure error logs
-
-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 production Sidekiq log and filter for:
-
- - `json.new_state: failed`
- - `json.job_class_name: <Batched Background Migration job class name>`
- - `json.job_arguments: <Batched Background Migration job class arguments>`
-
- 1. Review the `json.exception_class` and `json.exception_message` values to help
- understand why the jobs failed.
-
- 1. Remember the retry mechanism. Having a failure does not mean the job failed.
- Always check the last status of the job.
-
-- Via database:
-
- 1. Get the batched background migration `CLASS_NAME`.
- 1. Execute the following query in the PostgreSQL console:
-
- ```sql
- SELECT migration.id, migration.job_class_name, transition_logs.exception_class, transition_logs.exception_message
- FROM batched_background_migrations as migration
- INNER JOIN batched_background_migration_jobs as jobs
- ON jobs.batched_background_migration_id = migration.id
- INNER JOIN batched_background_migration_job_transition_logs as transition_logs
- ON transition_logs.batched_background_migration_job_id = jobs.id
- WHERE transition_logs.next_status = '2' AND migration.job_class_name = "CLASS_NAME";
- ```
+<!-- This redirect file can be deleted after <2022-07-26>. -->
+<!-- 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/changelog.md b/doc/development/changelog.md
index b98ed6cb109..c19c5b40382 100644
--- a/doc/development/changelog.md
+++ b/doc/development/changelog.md
@@ -100,7 +100,7 @@ EE: true
database records created during Cycle Analytics model spec."
- _Any_ contribution from a community member, no matter how small, **may** have
a changelog entry regardless of these guidelines if the contributor wants one.
-- Any [GLEX experiment](experiment_guide/gitlab_experiment.md) changes **should not** have a changelog entry.
+- Any [experiment](experiment_guide/index.md) changes **should not** have a changelog entry.
- An MR that includes only documentation changes **should not** have a changelog entry.
For more information, see
diff --git a/doc/development/chatops_on_gitlabcom.md b/doc/development/chatops_on_gitlabcom.md
index e18fcb0061b..2065021c61b 100644
--- a/doc/development/chatops_on_gitlabcom.md
+++ b/doc/development/chatops_on_gitlabcom.md
@@ -20,12 +20,10 @@ tasks such as:
To request access to ChatOps on GitLab.com:
1. Sign in to [Internal GitLab for Operations](https://ops.gitlab.net/users/sign_in)
- with one of the following methods:
+ with one of the following methods (Okta is not supported):
- - The same username you use on GitLab.com. You may have to choose a different
- username later.
+ - The same username you use on GitLab.com. You may have to choose a different username later.
- Clicking the **Sign in with Google** button to sign in with your GitLab.com email address.
- - Clicking the **Sign in with Okta** button to sign in with Okta.
1. Confirm that your username in [Internal GitLab for Operations](https://ops.gitlab.net/)
is the same as your username in [GitLab.com](https://gitlab.com/). If the usernames
diff --git a/doc/development/cicd/cicd_reference_documentation_guide.md b/doc/development/cicd/cicd_reference_documentation_guide.md
index e937220d208..0da1717f53c 100644
--- a/doc/development/cicd/cicd_reference_documentation_guide.md
+++ b/doc/development/cicd/cicd_reference_documentation_guide.md
@@ -4,7 +4,7 @@ group: Pipeline Authoring
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# CI/CD YAML reference style guide **(FREE)**
+# Documenting the `.gitlab-ci.yml` keywords **(FREE)**
The [CI/CD YAML reference](../../ci/yaml/index.md) uses a standard style to make it easier to use and update.
diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md
index c6f59a7e452..8d88e7155a2 100644
--- a/doc/development/cicd/templates.md
+++ b/doc/development/cicd/templates.md
@@ -342,32 +342,6 @@ include:
- remote: https://gitlab.com/gitlab-org/gitlab/-/raw/v13.0.1-ee/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
```
-### Use a feature flag to roll out a `latest` template
-
-With a major version release like 13.0 or 14.0, [stable templates](#stable-version) must be
-updated with their corresponding [latest template versions](#latest-version).
-It may be hard to gauge the impact of this change, so use the `redirect_to_latest_template_<name>`
-feature flag to test the impact on a subset of users. Using a feature flag can help
-reduce the risk of reverts or rollbacks on production.
-
-For example, to redirect the stable `Jobs/Deploy` template to its latest template in 25% of
-projects on `gitlab.com`:
-
-```shell
-/chatops run feature set redirect_to_latest_template_jobs_deploy 25 --actors
-```
-
-After you're confident the latest template can be moved to stable:
-
-1. Update the stable template with the content of the latest version.
-1. Remove the migration template from `Gitlab::Template::GitlabCiYmlTemplate::TEMPLATES_WITH_LATEST_VERSION` const.
-1. Remove the corresponding feature flag.
-
-NOTE:
-Feature flags are enabled by default in RSpec, so all tests are performed
-against the latest templates. You should also test the stable templates
-with `stub_feature_flags(redirect_to_latest_template_<name>: false)`.
-
### Further reading
There is an [open issue](https://gitlab.com/gitlab-org/gitlab/-/issues/17716) about
diff --git a/doc/development/code_intelligence/index.md b/doc/development/code_intelligence/index.md
index e1e2105298c..3a8845084c3 100644
--- a/doc/development/code_intelligence/index.md
+++ b/doc/development/code_intelligence/index.md
@@ -38,7 +38,7 @@ sequenceDiagram
1. The CI/CD job generates a document in an LSIF format (usually `dump.lsif`) using [an
indexer](https://lsif.dev) for the language of a project. The format
[describes](https://github.com/sourcegraph/sourcegraph/blob/main/doc/code_intelligence/explanations/writing_an_indexer.md)
- interactions between a method or function and its definition(s) or references. The
+ interactions between a method or function and its definitions or references. The
document is marked to be stored as an LSIF report artifact.
1. After receiving a request for storing the artifact, Workhorse asks
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 48bbe4c60ba..252bd1daf55 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -26,7 +26,7 @@ This is only a recommendation and the reviewer may be from a different team.
However, it is recommended to pick someone who is a [domain expert](#domain-experts).
If your merge request touches more than one domain (for example, Dynamic Analysis and GraphQL), ask for reviews from an expert from each domain.
-You can read more about the importance of involving reviewer(s) in the section on the responsibility of the author below.
+You can read more about the importance of involving reviewers in the section on the responsibility of the author below.
If you need some guidance (for example, it's your first merge request), feel free to ask
one of the [Merge request coaches](https://about.gitlab.com/company/team/).
@@ -107,7 +107,7 @@ For more information, review [the roulette README](https://gitlab.com/gitlab-org
### Approval guidelines
As described in the section on the responsibility of the maintainer below, you
-are recommended to get your merge request approved and merged by maintainer(s)
+are recommended to get your merge request approved and merged by maintainers
with [domain expertise](#domain-experts).
1. If your merge request includes backend changes (*1*), it must be
@@ -118,8 +118,7 @@ with [domain expertise](#domain-experts).
1. If your merge request includes frontend changes (*1*), it must be
**approved by a [frontend maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_frontend)**.
1. If your merge request includes user-facing changes (*3*), it must be
- **approved by a [Product Designer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_UX)**,
- based on assignments in the appropriate [DevOps stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages).
+ **approved by a [Product Designer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_UX)**.
See the [design and user interface guidelines](contributing/design.md) for details.
1. If your merge request includes adding a new JavaScript library (*1*)...
- If the library significantly increases the
@@ -155,7 +154,7 @@ with [domain expertise](#domain-experts).
#### Acceptance checklist
-This checklist encourages the authors, reviewers, and maintainers of merge requests (MRs) to confirm changes were analyzed for high-impact risks to quality, performance, reliability, security, and maintainability.
+This checklist encourages the authors, reviewers, and maintainers of merge requests (MRs) to confirm changes were analyzed for high-impact risks to quality, performance, reliability, security, observability, and maintainability.
Using checklists improves quality in software engineering. This checklist is a straightforward tool to support and bolster the skills of contributors to the GitLab codebase.
@@ -183,6 +182,10 @@ See the [test engineering process](https://about.gitlab.com/handbook/engineering
1. I have considered the scalability risk based on future predicted growth.
1. I have considered the performance, reliability, and availability impacts of this change on large customers who may have significantly more data than the average customer.
+##### Observability instrumentation
+
+1. I have included enough instrumentation to facilitate debugging and proactive performance improvements through observability.
+
##### Documentation
1. I have included changelog trailers, or I have decided that they are not needed.
@@ -220,7 +223,9 @@ should be confident that:
The best way to do this, and to avoid unnecessary back-and-forth with reviewers,
is to perform a self-review of your own merge request, following the
-[Code Review](#reviewing-a-merge-request) guidelines.
+[Code Review](#reviewing-a-merge-request) guidelines. During this self-review,
+try to include comments in the MR on lines
+where decisions or trade-offs were made, or where a contextual explanation might aid the reviewer in more easily understanding the code.
To reach the required level of confidence in their solution, an author is expected
to involve other people in the investigation and implementation processes as
@@ -258,7 +263,7 @@ Avoid:
[_explain why, not what_](https://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/).
- Requesting maintainer reviews of merge requests with failed tests. If the tests are failing and you have to request a review, ensure you leave a comment with an explanation.
- Excessively mentioning maintainers through email or Slack (if the maintainer is reachable
-through Slack). If you can't add a reviewer for a merge request, it's acceptable to `@` mention a maintainer in a comment. In all other cases, it's sufficient to add a reviewer or [request their attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) if they're already a reviewer.
+through Slack). If you can't add a reviewer for a merge request, `@` mentioning a maintainer in a comment is acceptable and in all other cases adding a reviewer is sufficient.
This saves reviewers time and helps authors catch mistakes earlier.
@@ -268,8 +273,10 @@ This saves reviewers time and helps authors catch mistakes earlier.
that it meets all requirements, you should:
- Click the Approve button.
-- Request a review from a maintainer or [request their attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) if they're already a reviewer. Default to requests for a maintainer with [domain expertise](#domain-experts),
+- `@` mention the author to generate a to-do notification, and advise them that their merge request has been reviewed and approved.
+- Request a review from a maintainer. Default to requests for a maintainer with [domain expertise](#domain-experts),
however, if one isn't available or you think the merge request doesn't need a review by a [domain expert](#domain-experts), feel free to follow the [Reviewer roulette](#reviewer-roulette) suggestion.
+- Remove yourself as a reviewer.
### The responsibility of the maintainer
@@ -297,7 +304,7 @@ If a developer who happens to also be a maintainer was involved in a merge reque
as a reviewer, it is recommended that they are not also picked as the maintainer to ultimately approve and merge it.
Maintainers should check before merging if the merge request is approved by the
-required approvers. If still awaiting further approvals from others, explain that in a comment and [request attention](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) from other reviewers as appropriate. Do not remove yourself as a reviewer.
+required approvers. If still awaiting further approvals from others, remove yourself as a reviewer then `@` mention the author and explain why in a comment. Stay as reviewer if you're merging the code.
Maintainers must check before merging if the merge request is introducing new
vulnerabilities, by inspecting the list in the merge request
@@ -319,20 +326,14 @@ After merging, a maintainer should stay as the reviewer listed on the merge requ
### Dogfooding the Reviewers feature
-Replaced with [dogfooding the attention request feature](#dogfooding-the-attention-request-feature).
-
-### Dogfooding the attention request feature
-
-In March of 2022, an updated process was put in place aimed at efficiently and consistently dogfooding the
-[attention requests feature](../user/project/merge_requests/index.md#request-attention-to-a-merge-request) under `Merge requests` -> `Need your attention`. This replaces previous guidance on [dogfooding the reviewers feature](#dogfooding-the-reviewers-feature).
+On March 18th 2021, an updated process was put in place aimed at efficiently and consistently dogfooding the Reviewers feature.
Here is a summary of the changes, also reflected in this section above.
-- Merge request authors and DRIs stay as assignees
-- Assignees request a review from reviewer(s) when they are expected to review
-- Reviewers stay assigned for the entire duration of the merge request
-- Reviewers request attention from the assignee or other reviewer(s) after they've done reviewing, depending on who needs to take action
-- Assignees request attention from the reviewer(s) when changes are made
+- Merge request authors and DRIs stay as Assignees
+- Authors request a review from Reviewers when they are expected to review
+- Reviewers remove themselves after they're done reviewing/approving
+- The last approver stays as Reviewer upon merging
## Best practices
@@ -443,7 +444,7 @@ experience, refactors the existing code). Then:
- For non-mandatory suggestions, decorate with (non-blocking) so the author knows they can
optionally resolve within the merge request or follow-up at a later stage.
- There's a [Chrome/Firefox add-on](https://gitlab.com/conventionalcomments/conventional-comments-button) which you can use to apply [Conventional Comment](https://conventionalcomments.org/) prefixes.
-- Ensure there are no open dependencies. Check [linked issues](../user/project/issues/related_issues.md) for blockers. Clarify with the author(s)
+- Ensure there are no open dependencies. Check [linked issues](../user/project/issues/related_issues.md) for blockers. Clarify with the authors
if necessary. If blocked by one or more open MRs, set an [MR dependency](../user/project/merge_requests/merge_request_dependencies.md).
- After a round of line notes, it can be helpful to post a summary note such as
"Looks good to me", or "Just a couple things to address."
@@ -696,10 +697,10 @@ Properties of customer critical merge requests:
- The [VP of Development](https://about.gitlab.com/job-families/engineering/development/management/vp/) ([@clefelhocz1](https://gitlab.com/clefelhocz1)) is the DRI for deciding if a merge request qualifies as customer critical.
- The DRI applies the `customer-critical-merge-request` label to the merge request.
-- It is required that the reviewer(s) and maintainer(s) involved with a customer critical merge request are engaged as soon as this decision is made.
+- It is required that the reviewers and maintainers involved with a customer critical merge request are engaged as soon as this decision is made.
- It is required to prioritize work for those involved on a customer critical merge request so that they have the time available necessary to focus on it.
- It is required to adhere to GitLab [values](https://about.gitlab.com/handbook/values/) and processes when working on customer critical merge requests, taking particular note of family and friends first/work second, definition of done, iteration, and release when it's ready.
-- Customer critical merge requests are required to not reduce security, introduce data-loss risk, reduce availability, nor break existing functionality per the process for [prioritizing technical decisions](https://about.gitlab.com/handbook/engineering/principles/#prioritizing-technical-decisions).
+- Customer critical merge requests are required to not reduce security, introduce data-loss risk, reduce availability, nor break existing functionality per the process for [prioritizing technical decisions](https://about.gitlab.com/handbook/engineering/development/principles/#prioritizing-technical-decisions).
- On customer critical requests, it is _recommended_ that those involved _consider_ coordinating synchronously (Zoom, Slack) in addition to asynchronously (merge requests comments) if they believe this may reduce the elapsed time to merge even though this _may_ sacrifice [efficiency](https://about.gitlab.com/company/culture/all-remote/asynchronous/#evaluating-efficiency.md).
- After a customer critical merge request is merged, a retrospective must be completed with the intention of reducing the frequency of future customer critical merge requests.
diff --git a/doc/development/contributing/design.md b/doc/development/contributing/design.md
index def39a960d8..7f5c800216a 100644
--- a/doc/development/contributing/design.md
+++ b/doc/development/contributing/design.md
@@ -117,7 +117,7 @@ At any moment, but usually _during_ or _after_ the design's implementation:
for additions or enhancements to the design system.
- Create issues with the [`~UX debt`](issue_workflow.md#technical-and-ux-debt)
label for intentional deviations from the agreed-upon UX requirements due to
- time or feasibility challenges, linking back to the corresponding issue(s) or
- MR(s).
+ time or feasibility challenges, linking back to the corresponding issues or
+ merge requests.
- Create issues for [feature additions or enhancements](issue_workflow.md#feature-proposals)
outside the agreed-upon UX requirements to avoid scope creep.
diff --git a/doc/development/contributing/index.md b/doc/development/contributing/index.md
index ea54f36a7e5..8a4b06840a4 100644
--- a/doc/development/contributing/index.md
+++ b/doc/development/contributing/index.md
@@ -33,9 +33,8 @@ GitLab Inc engineers should refer to the [engineering workflow document](https:/
## Security vulnerability disclosure
-Report suspected security vulnerabilities in private to
-`support@gitlab.com`, also see the
-[disclosure section on the GitLab.com website](https://about.gitlab.com/security/disclosure/).
+Report suspected security vulnerabilities by following the
+[disclosure process on the GitLab.com website](https://about.gitlab.com/security/disclosure/).
WARNING:
Do **NOT** create publicly viewable issues for suspected security vulnerabilities.
diff --git a/doc/development/contributing/issue_workflow.md b/doc/development/contributing/issue_workflow.md
index fe1549e7f34..97c8c179e09 100644
--- a/doc/development/contributing/issue_workflow.md
+++ b/doc/development/contributing/issue_workflow.md
@@ -108,7 +108,7 @@ Group labels specify which [groups](https://about.gitlab.com/company/team/struct
It's highly recommended to add a group label, as it's used by our triage
automation to
-[infer the correct stage label](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues).
+[infer the correct stage label](https://about.gitlab.com/handbook/engineering/quality/triage-operations/#auto-labelling-of-issues-and-merge-requests).
#### Naming and color convention
diff --git a/doc/development/contributing/merge_request_workflow.md b/doc/development/contributing/merge_request_workflow.md
index 5ed0885eed9..ee1ed744cd4 100644
--- a/doc/development/contributing/merge_request_workflow.md
+++ b/doc/development/contributing/merge_request_workflow.md
@@ -53,7 +53,7 @@ request is as follows:
1. If you have multiple commits, combine them into a few logically organized
commits by [squashing them](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#_squashing),
but do not change the commit history if you're working on shared branches though.
-1. Push the commit(s) to your working branch in your fork.
+1. Push the commits to your working branch in your fork.
1. Submit a merge request (MR) to the `main` branch in the main GitLab project.
1. Your merge request needs at least 1 approval, but depending on your changes
you might need additional approvals. Refer to the [Approval guidelines](../code_review.md#approval-guidelines).
@@ -65,7 +65,7 @@ request is as follows:
template already provided in the "Description" field.
1. If you are contributing documentation, choose `Documentation` from the
"Choose a template" menu and fill in the description according to the template.
- 1. Use the syntax `Solves #XXX`, `Closes #XXX`, or `Refs #XXX` to mention the issue(s) your merge
+ 1. Use the syntax `Solves #XXX`, `Closes #XXX`, or `Refs #XXX` to mention the issues your merge
request addresses. Referenced issues do not [close automatically](../../user/project/issues/managing_issues.md#closing-issues-automatically).
You must close them manually once the merge request is merged.
1. The MR must include *Before* and *After* screenshots if UI changes are made.
@@ -81,6 +81,7 @@ request is as follows:
1. If your MR touches code that executes shell commands, reads or opens files, or
handles paths to files on disk, make sure it adheres to the
[shell command guidelines](../shell_commands.md)
+1. [Code changes should include observability instrumentation](../code_review.md#observability-instrumentation).
1. If your code needs to handle file storage, see the [uploads documentation](../uploads/index.md).
1. If your merge request adds one or more migrations, make sure to execute all
migrations on a fresh database before the MR is reviewed. If the review leads
diff --git a/doc/development/contributing/verify/index.md b/doc/development/contributing/verify/index.md
index 828eb0a9598..01aacffd00f 100644
--- a/doc/development/contributing/verify/index.md
+++ b/doc/development/contributing/verify/index.md
@@ -231,5 +231,5 @@ building medical, aviation, and automotive software. Continuous Integration is
a mission critical part of software engineering.
When you are working on a subsystem for pipeline processing and transitioning
-CI/CD statuses, request an additional review from a domain expert and hold
-others accountable for doing the same.
+CI/CD statuses, request an additional opinion on the design from a domain expert
+as early as possible and hold others accountable for doing the same.
diff --git a/doc/development/dangerbot.md b/doc/development/dangerbot.md
index f941e0720c6..003df4fe078 100644
--- a/doc/development/dangerbot.md
+++ b/doc/development/dangerbot.md
@@ -66,7 +66,7 @@ continue to apply. However, there are a few things that deserve special emphasis
Danger is a powerful tool and flexible tool, but not always the most appropriate
way to solve a given problem or workflow.
-First, be aware of the GitLab [commitment to dogfooding](https://about.gitlab.com/handbook/engineering/principles/#dogfooding).
+First, be aware of the GitLab [commitment to dogfooding](https://about.gitlab.com/handbook/engineering/development/principles/#dogfooding).
The code we write for Danger is GitLab-specific, and it **may not** be most
appropriate place to implement functionality that addresses a need we encounter.
Our users, customers, and even our own satellite projects, such as [Gitaly](https://gitlab.com/gitlab-org/gitaly),
@@ -155,7 +155,7 @@ To enable the Dangerfile on another existing GitLab project, complete the follow
file:
- '/ci/danger-review.yml'
rules:
- - if: '$CI_SERVER_HOST == "gitlab.com"'
+ - if: $CI_SERVER_HOST == "gitlab.com"
```
1. If your project is in the `gitlab-org` group, you don't need to set up any token as the `DANGER_GITLAB_API_TOKEN`
@@ -196,10 +196,11 @@ is not shared to forks.
Contributors can configure Danger for their forks with the following steps:
-1. Add an [environment variable](../ci/variables/index.md) called `DANGER_GITLAB_API_TOKEN` with a
-[personal API token](https://gitlab.com/-/profile/personal_access_tokens?name=GitLab+Dangerbot&scopes=api)
-to your fork that has the `api` scope set.
-1. Making the variable [masked](../ci/variables/index.md#mask-a-cicd-variable) makes sure it
-doesn't show up in the job logs. The variable cannot be
-[protected](../ci/variables/index.md#protect-a-cicd-variable), as it needs
-to be present for all feature branches.
+1. Create a [personal API token](https://gitlab.com/-/profile/personal_access_tokens?name=GitLab+Dangerbot&scopes=api)
+ that has the `api` scope set (don't forget to copy it to the clipboard).
+1. In your fork, add a [project CI/CD variable](../ci/variables/index.md#add-a-cicd-variable-to-a-project)
+ called `DANGER_GITLAB_API_TOKEN` with the token copied in the previous step.
+1. Make the variable [masked](../ci/variables/index.md#mask-a-cicd-variable) so it
+ doesn't show up in the job logs. The variable cannot be
+ [protected](../ci/variables/index.md#protected-cicd-variables), because it needs
+ to be present for all branches.
diff --git a/doc/development/database/avoiding_downtime_in_migrations.md b/doc/development/database/avoiding_downtime_in_migrations.md
index ad2768397e6..3cf9ab1ab5c 100644
--- a/doc/development/database/avoiding_downtime_in_migrations.md
+++ b/doc/development/database/avoiding_downtime_in_migrations.md
@@ -68,10 +68,72 @@ In this example, the change to ignore the column went into release 12.5.
Continuing our example, dropping the column goes into a _post-deployment_ migration in release 12.6:
+Start by creating the **post-deployment migration**:
+
+```shell
+bundle exec rails g post_deployment_migration remove_users_updated_at_column
+```
+
+There are two scenarios that you need to consider
+to write a migration that removes a column:
+
+#### A. The removed column has no indexes or constraints that belong to it
+
+In this case, a **transactional migration** can be used. Something as simple as:
+
+```ruby
+class RemoveUsersUpdatedAtColumn < Gitlab::Database::Migration[2.0]
+ def up
+ remove_column :users, :updated_at
+ end
+
+ def down
+ add_column :users, :updated_at, :datetime
+ end
+end
+```
+
+You can consider [enabling lock retries](
+https://docs.gitlab.com/ee/development/migration_style_guide.html#usage-with-transactional-migrations
+) when you run a migration on big tables, because it might take some time to
+acquire a lock on this table.
+
+#### B. The removed column has an index or constraint that belongs to it
+
+If the `down` method requires adding back any dropped indexes or constraints, that cannot
+be done within a transactional migration, then the migration would look like this:
+
```ruby
- remove_column :user, :updated_at
+class RemoveUsersUpdatedAtColumn < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ remove_column :users, :updated_at
+ end
+
+ def down
+ unless column_exists?(:users, :updated_at)
+ add_column :users, :updated_at, :datetime
+ end
+
+ # Make sure to add back any indexes or constraints,
+ # that were dropped in the `up` method. For example:
+ add_concurrent_index(:users, :updated_at)
+ end
+end
```
+In the `down` method, we check to see if the column already exists before adding it again.
+We do this because the migration is non-transactional and might have failed while it was running.
+
+The [`disable_ddl_transaction!`](
+https://docs.gitlab.com/ee/development/migration_style_guide.html#usage-with-non-transactional-migrations-disable_ddl_transaction
+) is used to disable the transaction that wraps the whole migration.
+
+You can refer to the page [Migration Style Guide](
+https://docs.gitlab.com/ee/development/migration_style_guide.html
+) for more information about database migrations.
+
### Step 3: Removing the ignore rule (release M+2)
With the next release, in this example 12.7, we set up another merge request to remove the ignore rule.
@@ -272,7 +334,7 @@ Renaming a table is possible without downtime by following our multi-release
Adding foreign keys usually works in 3 steps:
1. Start a transaction
-1. Run `ALTER TABLE` to add the constraint(s)
+1. Run `ALTER TABLE` to add the constraints
1. Check all existing data
Because `ALTER TABLE` typically acquires an exclusive lock until the end of a
diff --git a/doc/development/database/background_migrations.md b/doc/development/database/background_migrations.md
index 1f7e0d76c89..80ba0336bda 100644
--- a/doc/development/database/background_migrations.md
+++ b/doc/development/database/background_migrations.md
@@ -7,7 +7,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Background migrations
WARNING:
-Background migrations are strongly discouraged in favor of the new [batched background migrations framework](../batched_background_migrations.md).
+Background migrations are strongly discouraged in favor of the new [batched background migrations framework](batched_background_migrations.md).
Please check that documentation and determine if that framework suits your needs and fall back
to these only if required.
@@ -45,13 +45,17 @@ into this category.
## Isolation
Background migrations must be isolated and can not use application code (for example,
-models defined in `app/models`). Since these migrations can take a long time to
-run it's possible for new versions to be deployed while they are still running.
+models defined in `app/models` except the `ApplicationRecord` classes). Since these migrations
+can take a long time to run it's possible for new versions to be deployed while they are still running.
It's also possible for different migrations to be executed at the same time.
This means that different background migrations should not migrate data in a
way that would cause conflicts.
+## Accessing data for multiple databases
+
+See [Accessing data for multiple databases of Batched Background Migrations](batched_background_migrations.md#accessing-data-for-multiple-databases) for more details.
+
## Idempotence
Background migrations are executed in a context of a Sidekiq process.
@@ -190,7 +194,7 @@ class:
```ruby
class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
- class Integration < ActiveRecord::Base
+ class Integration < ::ApplicationRecord
self.table_name = 'integrations'
end
@@ -214,7 +218,7 @@ created and updated integrations. We can do this using something along the lines
the following:
```ruby
-class Integration < ActiveRecord::Base
+class Integration < ::ApplicationRecord
after_commit :schedule_integration_migration, on: :update
after_commit :schedule_integration_migration, on: :create
diff --git a/doc/development/database/batched_background_migrations.md b/doc/development/database/batched_background_migrations.md
new file mode 100644
index 00000000000..3a0fa77eff9
--- /dev/null
+++ b/doc/development/database/batched_background_migrations.md
@@ -0,0 +1,371 @@
+---
+type: reference, dev
+stage: Enablement
+group: Database
+info: "See the Technical Writers assigned to Development Guidelines: https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-development-guidelines"
+---
+
+# Batched background migrations
+
+Batched Background Migrations should be used to perform data migrations whenever a
+migration exceeds [the time limits](../migration_style_guide.md#how-long-a-migration-should-take)
+in our guidelines. For example, you can use batched background
+migrations to migrate data that's stored in a single JSON column
+to a separate table instead.
+
+## When to use batched background migrations
+
+Use a batched background migration when you migrate _data_ in tables containing
+so many rows that the process would exceed
+[the time limits in our guidelines](../migration_style_guide.md#how-long-a-migration-should-take)
+if performed using a regular Rails migration.
+
+- Batched background migrations should be used when migrating data in
+ [high-traffic tables](../migration_style_guide.md#high-traffic-tables).
+- Batched background migrations may also be used when executing numerous single-row queries
+ for every item on a large dataset. Typically, for single-record patterns, runtime is
+ largely dependent on the size of the dataset. Split the dataset accordingly,
+ and put it into background migrations.
+- Don't use batched background migrations to perform schema migrations.
+
+Background migrations can help when:
+
+- Migrating events from one table to multiple separate tables.
+- Populating one column based on JSON stored in another column.
+- Migrating data that depends on the output of external services. (For example, an API.)
+
+NOTE:
+If the batched background migration is part of an important upgrade, it must be announced
+in the release post. Discuss with your Project Manager if you're unsure if the migration falls
+into this category.
+
+## Isolation
+
+Batched background migrations must be isolated and can not use application code (for example,
+models defined in `app/models` except the `ApplicationRecord` classes).
+Because these migrations can take a long time to run, it's possible
+for new versions to deploy while the migrations are still running.
+
+## Accessing data for multiple databases
+
+Background Migration contrary to regular migrations does have access to multiple databases
+and can be used to efficiently access and update data across them. To properly indicate
+a database to be used it is desired to create ActiveRecord model inline the migration code.
+Such model should use a correct [`ApplicationRecord`](multiple_databases.md#gitlab-schema)
+depending on which database the table is located. As such usage of `ActiveRecord::Base`
+is disallowed as it does not describe a explicitly database to be used to access given table.
+
+```ruby
+# good
+class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
+ class Project < ::ApplicationRecord
+ self.table_name = 'projects'
+ end
+
+ class Build < ::Ci::ApplicationRecord
+ self.table_name = 'ci_builds'
+ end
+end
+
+# bad
+class Gitlab::BackgroundMigration::ExtractIntegrationsUrl
+ class Project < ActiveRecord::Base
+ self.table_name = 'projects'
+ end
+
+ class Build < ActiveRecord::Base
+ self.table_name = 'ci_builds'
+ end
+end
+```
+
+Similarly the usage of `ActiveRecord::Base.connection` is disallowed and needs to be
+replaced preferably with the usage of model connection.
+
+```ruby
+# good
+Project.connection.execute("SELECT * FROM projects")
+
+# acceptable
+ApplicationRecord.connection.execute("SELECT * FROM projects")
+
+# bad
+ActiveRecord::Base.connection.execute("SELECT * FROM projects")
+```
+
+## Idempotence
+
+Batched background migrations are executed in a context of a Sidekiq process.
+The usual Sidekiq rules apply, especially the rule that jobs should be small
+and idempotent. Make sure that in case that your migration job is retried, data
+integrity is guaranteed.
+
+See [Sidekiq best practices guidelines](https://github.com/mperham/sidekiq/wiki/Best-Practices)
+for more details.
+
+## Batched background migrations for EE-only features
+
+All the background migration classes for EE-only features should be present in GitLab CE.
+For this purpose, create an empty class for GitLab CE, and extend it for GitLab EE
+as explained in the guidelines for
+[implementing Enterprise Edition features](../ee_features.md#code-in-libgitlabbackground_migration).
+
+Batched Background migrations are simple classes that define a `perform` method. A
+Sidekiq worker then executes such a class, passing any arguments to it. All
+migration classes must be defined in the namespace
+`Gitlab::BackgroundMigration`. Place the files in the directory
+`lib/gitlab/background_migration/`.
+
+## Queueing
+
+Queueing a batched background migration should be done in a post-deployment
+migration. Use this `queue_batched_background_migration` example, queueing the
+migration to be executed in batches. Replace the class name and arguments with the values
+from your migration:
+
+```ruby
+queue_batched_background_migration(
+ JOB_CLASS_NAME,
+ TABLE_NAME,
+ JOB_ARGUMENTS,
+ JOB_INTERVAL
+ )
+```
+
+Make sure the newly-created data is either migrated, or
+saved in both the old and new version upon creation. Removals in
+turn can be handled by defining foreign keys with cascading deletes.
+
+### Requeuing batched background migrations
+
+If one of the batched background migrations contains a bug that is fixed in a patch
+release, you must requeue the batched background migration so the migration
+repeats on systems that already performed the initial migration.
+
+When you requeue the batched background migration, turn the original
+queuing into a no-op by clearing up the `#up` and `#down` methods of the
+migration performing the requeuing. Otherwise, the batched background migration is
+queued multiple times on systems that are upgrading multiple patch releases at
+once.
+
+When you start the second post-deployment migration, delete the
+previously batched migration with the provided code:
+
+```ruby
+Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION_NAME, TABLE_NAME, COLUMN, JOB_ARGUMENTS)
+ .delete_all
+```
+
+## Cleaning up
+
+NOTE:
+Cleaning up any remaining background migrations must be done in either a major
+or minor release. You must not do this in a patch release.
+
+Because background migrations can take a long time, you can't immediately clean
+things up after queueing them. For example, you can't drop a column used in the
+migration process, as jobs would fail. You must add a separate _post-deployment_
+migration in a future release that finishes any remaining
+jobs before cleaning things up. (For example, removing a column.)
+
+To migrate the data from column `foo` (containing a big JSON blob) to column `bar`
+(containing a string), you would:
+
+1. Release A:
+ 1. Create a migration class that performs the migration for a row with a given ID.
+ 1. Update new rows using one of these techniques:
+ - Create a new trigger for simple copy operations that don't need application logic.
+ - Handle this operation in the model/service as the records are created or updated.
+ - Create a new custom background job that updates the records.
+ 1. Queue the batched background migration for all existing rows in a post-deployment migration.
+1. Release B:
+ 1. Add a post-deployment migration that checks if the batched background migration is completed.
+ 1. Deploy code so that the application starts using the new column and stops to update new records.
+ 1. Remove the old column.
+
+Bump to the [import/export version](../../user/project/settings/import_export.md) may
+be required, if importing a project from a prior version of GitLab requires the
+data to be in the new format.
+
+## Example
+
+The `routes` table has a `source_type` field that's used for a polymorphic relationship.
+As part of a database redesign, we're removing the polymorphic relationship. One step of
+the work will be migrating data from the `source_id` column into a new singular foreign key.
+Because we intend to delete old rows later, there's no need to update them as part of the
+background migration.
+
+1. Start by defining our migration class, which should inherit
+ from `Gitlab::BackgroundMigration::BatchedMigrationJob`:
+
+ ```ruby
+ class Gitlab::BackgroundMigration::BackfillRouteNamespaceId < BatchedMigrationJob
+ # For illustration purposes, if we were to use a local model we could
+ # define it like below, using an `ApplicationRecord` as the base class
+ # class Route < ::ApplicationRecord
+ # self.table_name = 'routes'
+ # end
+
+ def perform
+ each_sub_batch(
+ operation_name: :update_all,
+ batching_scope: -> (relation) { relation.where("source_type <> 'UnusedType'") }
+ ) do |sub_batch|
+ sub_batch.update_all('namespace_id = source_id')
+ end
+ end
+ end
+ ```
+
+ NOTE:
+ Job classes must be subclasses of `BatchedMigrationJob` to be
+ correctly handled by the batched migration framework. Any subclass of
+ `BatchedMigrationJob` will be initialized with necessary arguments to
+ execute the batch, as well as a connection to the tracking database.
+ Additional `job_arguments` set on the migration will be passed to the
+ job's `perform` method.
+
+1. Add a new trigger to the database to update newly created and updated routes,
+ similar to this example:
+
+ ```ruby
+ execute(<<~SQL)
+ CREATE OR REPLACE FUNCTION example() RETURNS trigger
+ LANGUAGE plpgsql
+ AS $$
+ BEGIN
+ NEW."namespace_id" = NEW."source_id"
+ RETURN NEW;
+ END;
+ $$;
+ SQL
+ ```
+
+1. Create a post-deployment migration that queues the migration for existing data:
+
+ ```ruby
+ class QueueBackfillRoutesNamespaceId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'BackfillRouteNamespaceId'
+ DELAY_INTERVAL = 2.minutes
+
+ def up
+ queue_batched_background_migration(
+ MIGRATION,
+ :routes,
+ :id,
+ job_interval: DELAY_INTERVAL
+ )
+ end
+
+ def down
+ Gitlab::Database::BackgroundMigration::BatchedMigration
+ .for_configuration(MIGRATION, :routes, :id, []).delete_all
+ end
+ end
+ ```
+
+ After deployment, our application:
+ - Continues using the data as before.
+ - Ensures that both existing and new data are migrated.
+
+1. In the next release, remove the trigger. We must also add a new post-deployment migration
+ that checks that the batched background migration is completed. For example:
+
+ ```ruby
+ class FinalizeBackfillRouteNamespaceId < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'BackfillRouteNamespaceId'
+ disable_ddl_transaction!
+
+ def up
+ ensure_batched_background_migration_is_finished(
+ job_class_name: MIGRATION,
+ table_name: :routes,
+ column_name: :id,
+ job_arguments: []
+ )
+ end
+
+ def down
+ # no-op
+ end
+ end
+ ```
+
+ If the application does not depend on the data being 100% migrated (for
+ instance, the data is advisory, and not mission-critical), then you can skip this
+ final step. This step confirms that the migration is completed, and all of the rows were migrated.
+
+After the batched migration is completed, you can safely depend on the
+data in `routes.namespace_id` being populated.
+
+## Testing
+
+Writing tests is required for:
+
+- The batched background migrations' queueing migration.
+- The batched background migration itself.
+- A cleanup migration.
+
+The `:migration` and `schema: :latest` RSpec tags are automatically set for
+background migration specs. Refer to the
+[Testing Rails migrations](../testing_guide/testing_migrations_guide.md#testing-a-non-activerecordmigration-class)
+style guide.
+
+Remember that `before` and `after` RSpec hooks
+migrate your database down and up. These hooks can result in other batched background
+migrations being called. Using `spy` test doubles with
+`have_received` is encouraged, instead of using regular test doubles, because
+your expectations defined in a `it` block can conflict with what is
+called in RSpec hooks. Refer to [issue #35351](https://gitlab.com/gitlab-org/gitlab/-/issues/18839)
+for more details.
+
+## Best practices
+
+1. Know how much data you're dealing with.
+1. Make sure the batched background migration jobs are idempotent.
+1. Confirm the tests you write are not false positives.
+1. If the data being migrated is critical and cannot be lost, the
+ clean-up migration must also check the final state of the data before completing.
+1. Discuss the numbers with a database specialist. The migration may add
+ more pressure on DB than you expect. Measure on staging,
+ or ask someone to measure on production.
+1. Know how much time is required to run the batched background migration.
+
+## Additional tips and strategies
+
+### Viewing failure error logs
+
+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 production Sidekiq log and filter for:
+
+ - `json.new_state: failed`
+ - `json.job_class_name: <Batched Background Migration job class name>`
+ - `json.job_arguments: <Batched Background Migration job class arguments>`
+
+ 1. Review the `json.exception_class` and `json.exception_message` values to help
+ understand why the jobs failed.
+
+ 1. Remember the retry mechanism. Having a failure does not mean the job failed.
+ Always check the last status of the job.
+
+- Via database:
+
+ 1. Get the batched background migration `CLASS_NAME`.
+ 1. Execute the following query in the PostgreSQL console:
+
+ ```sql
+ SELECT migration.id, migration.job_class_name, transition_logs.exception_class, transition_logs.exception_message
+ FROM batched_background_migrations as migration
+ INNER JOIN batched_background_migration_jobs as jobs
+ ON jobs.batched_background_migration_id = migration.id
+ INNER JOIN batched_background_migration_job_transition_logs as transition_logs
+ ON transition_logs.batched_background_migration_job_id = jobs.id
+ WHERE transition_logs.next_status = '2' AND migration.job_class_name = "CLASS_NAME";
+ ```
diff --git a/doc/development/database/loose_foreign_keys.md b/doc/development/database/loose_foreign_keys.md
index 2bcdc91202a..3db24793f1b 100644
--- a/doc/development/database/loose_foreign_keys.md
+++ b/doc/development/database/loose_foreign_keys.md
@@ -117,8 +117,8 @@ Showing cross-schema foreign keys (20):
18 | N | ci_job_token_project_scope_links | projects | target_project_id | cascade
19 | N | ci_project_monthly_usages | projects | project_id | cascade
-To match FK write one or many filters to match against FROM/TO/COLUMN:
-- scripts/decomposition/generate-loose-foreign-key <filter(s)...>
+To match foreign key (FK), write one or many filters to match against FROM/TO/COLUMN:
+- scripts/decomposition/generate-loose-foreign-key (filters...)
- scripts/decomposition/generate-loose-foreign-key ci_job_artifacts project_id
- scripts/decomposition/generate-loose-foreign-key dast_site_profiles_pipelines
```
@@ -593,7 +593,7 @@ Partitions: gitlab_partitions_dynamic.loose_foreign_keys_deleted_records_84 FOR
The `partition` column controls the insert direction, the `partition` value determines which
partition will get the deleted rows inserted via the trigger. Notice that the default value of
the `partition` table matches with the value of the list partition (84). In `INSERT` query
-within the trigger thevalue of the `partition` is omitted, the trigger always relies on the
+within the trigger the value of the `partition` is omitted, the trigger always relies on the
default value of the column.
Example `INSERT` query for the trigger:
@@ -605,7 +605,7 @@ SELECT TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, old_table.id FROM old_table;
```
The partition "sliding" process is controlled by two, regularly executed callbacks. These
-callbackes are defined within the `LooseForeignKeys::DeletedRecord` model.
+callbacks are defined within the `LooseForeignKeys::DeletedRecord` model.
The `next_partition_if` callback controls when to create a new partition. A new partition will
be created when the current partition has at least one record older than 24 hours. A new partition
@@ -805,7 +805,7 @@ Possible solutions:
- Long-term: invoke the worker more frequently. Parallelize the worker
For a one-time fix, we can run the cleanup worker several times from the rails console. The worker
-can run parallelly however, this can introduce lock contention and it could increase the worker
+can run in parallel however, this can introduce lock contention and it could increase the worker
runtime.
```ruby
diff --git a/doc/development/database/migrations_for_multiple_databases.md b/doc/development/database/migrations_for_multiple_databases.md
index 0ec4612e985..ce326a6ce4a 100644
--- a/doc/development/database/migrations_for_multiple_databases.md
+++ b/doc/development/database/migrations_for_multiple_databases.md
@@ -33,7 +33,7 @@ Depending on the used constructs, we can classify migrations to be either:
Migrations cannot mix **DDL** and **DML** changes as the application requires the structure
(as described by `db/structure.sql`) to be exactly the same across all decomposed databases.
-### Data Definition Language (DDL)
+### Data Definition Language (DDL)
The DDL migrations are all migrations that:
@@ -43,7 +43,7 @@ The DDL migrations are all migrations that:
1. Add or remove a column with or without a default value (for example, `add_column`).
1. Create or drop trigger functions (for example, `create_trigger_function`).
1. Attach or detach triggers from tables (for example, `track_record_deletions`, `untrack_record_deletions`).
-1. Prepare or not async indexes (for example, `prepare_async_index`, `unprepare_async_index_by_name`).
+1. Prepare or not asynchronous indexes (for example, `prepare_async_index`, `unprepare_async_index_by_name`).
As such DDL migrations **CANNOT**:
@@ -159,7 +159,7 @@ end
### The special purpose of `gitlab_shared`
-As described in [gitlab_schema](multiple_databases.md#the-special-purpose-of-gitlab_shared),
+As described in [`gitlab_schema`](multiple_databases.md#the-special-purpose-of-gitlab_shared),
the `gitlab_shared` tables are allowed to contain data across all databases. This implies
that such migrations should run across all databases to modify structure (DDL) or modify data (DML).
@@ -388,3 +388,32 @@ A Potential extension is to limit running DML migration only to specific environ
```ruby
restrict_gitlab_migration gitlab_schema: :gitlab_main, gitlab_env: :gitlab_com
```
+
+## Background migrations
+
+When you use:
+
+- Background migrations with `track_jobs` set to `true` or
+- Batched background migrations
+
+The migration has to write to a jobs table. All of the
+jobs tables used by background migrations are marked as `gitlab_shared`.
+You can use these migrations when migrating tables in any database.
+
+However, when queuing the batches, you must set `restrict_gitlab_migration` based on the
+table you are iterating over. If you are updating all `projects`, for example, then you would set
+`restrict_gitlab_migration gitlab_schema: :gitlab_main`. If, however, you are
+updating all `ci_pipelines`, you would set
+`restrict_gitlab_migration gitlab_schema: :gitlab_ci`.
+
+As with all DML migrations, you cannot query another database outside of
+`restrict_gitlab_migration` or `gitlab_shared`. If you need to query another database,
+you'll likely need to separate these into two migrations somehow.
+
+Because the actual migration logic (not the queueing step) for background
+migrations runs in a Sidekiq worker, the logic can perform DML queries on
+tables in any database, just like any ordinary Sidekiq worker can.
+
+## How to determine `gitlab_schema` for a given table
+
+See [GitLab Schema](multiple_databases.md#gitlab-schema).
diff --git a/doc/development/database/multiple_databases.md b/doc/development/database/multiple_databases.md
index 3b1b06b557c..c622d4f50ff 100644
--- a/doc/development/database/multiple_databases.md
+++ b/doc/development/database/multiple_databases.md
@@ -74,7 +74,14 @@ in GitLab 14.1. This feature is still under development, and is not ready for pr
### Configure single database
-By default, GDK is configured to run with multiple databases. To configure GDK to use a single database:
+By default, GDK is configured to run with multiple databases.
+
+WARNING:
+Switching back-and-forth between single and multiple databases in
+the same development instance is discouraged. Any data in the `ci`
+database will not be accessible in single database mode. For single database, you should use a separate development instance.
+
+To configure GDK to use a single database:
1. On the GDK root directory, run:
@@ -519,7 +526,7 @@ ci_build.update!(updated_at: Time.current) # CI DB
ci_build.project.update!(updated_at: Time.current) # Main DB
```
-##### Async processing
+##### Asynchronous processing
If we need more guarantee that an operation finishes the work consistently we can execute it
within a background job. A background job is scheduled asynchronously and retried several times
@@ -579,58 +586,6 @@ ensures that we forbid destroying the parent object if something is not cleaned
If all you need to do is clean up the child records themselves from PostgreSQL,
consider using [loose foreign keys](loose_foreign_keys.md).
-## `config/database.yml`
-
-GitLab is adding support to run multiple databases, for example to
-[separate tables for the continuous integration features](https://gitlab.com/groups/gitlab-org/-/epics/6167)
-from the main database. In order to prepare for this change, we
-[validate the structure of the configuration](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67877)
-in `database.yml` to ensure that only known databases are used.
-
-Previously, the `config/database.yml` looked like this:
-
-```yaml
-production:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- ...
-```
-
-With the support for many databases this
-syntax is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/338182)
-and will be removed in [15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/338182).
-
-The new `config/database.yml` needs to include a database name
-to define a database configuration. Only `main:` and `ci:` database
-names are supported. The `main:` database must always be a first
-entry in a hash. This change applies to decomposed and non-decomposed
-change. If an invalid or deprecated syntax is used the error
-or warning is printed during application start.
-
-```yaml
-# Non-decomposed database
-production:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- ...
-
-# Decomposed database
-production:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- ...
- ci:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production_ci
- ...
-```
-
## Foreign keys that cross databases
There are many places where we use foreign keys that reference across the two
diff --git a/doc/development/database/pagination_guidelines.md b/doc/development/database/pagination_guidelines.md
index 3a772b10a6d..08840124535 100644
--- a/doc/development/database/pagination_guidelines.md
+++ b/doc/development/database/pagination_guidelines.md
@@ -172,7 +172,7 @@ From the user point of view, this might not be always noticeable. As the user pa
When requesting a large page number, the database needs to read `PAGE * PAGE_SIZE` rows. This makes offset pagination **unsuitable for large database tables**.
-Example: listing users on the Admin page
+Example: listing users on the Admin Area
Listing users with a very simple SQL query:
diff --git a/doc/development/database/strings_and_the_text_data_type.md b/doc/development/database/strings_and_the_text_data_type.md
index 4ed7cf1b4de..7aa529e1518 100644
--- a/doc/development/database/strings_and_the_text_data_type.md
+++ b/doc/development/database/strings_and_the_text_data_type.md
@@ -206,7 +206,7 @@ class ScheduleCapTitleLengthOnIssues < Gitlab::Database::Migration[1.0]
disable_ddl_transaction!
- class Issue < ActiveRecord::Base
+ class Issue < ::ApplicationRecord
include EachBatch
self.table_name = 'issues'
diff --git a/doc/development/database/table_partitioning.md b/doc/development/database/table_partitioning.md
index ec768136404..34cb73978bc 100644
--- a/doc/development/database/table_partitioning.md
+++ b/doc/development/database/table_partitioning.md
@@ -43,7 +43,7 @@ problem.
First, a table is partitioned on a partition key, which is a column or
set of columns which determine how the data will be split across the
partitions. The partition key is used by the database when reading or
-writing data, to decide which partition(s) need to be accessed. The
+writing data, to decide which partitions need to be accessed. The
partition key should be a column that would be included in a `WHERE`
clause on almost all queries accessing that table.
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index 08e29e373f6..cafc40ccc68 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -21,8 +21,6 @@ deprecated.
## When can a feature be deprecated?
-A feature can be deprecated at any time, provided there is a viable alternative.
-
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).
@@ -37,3 +35,52 @@ For API removals, see the [GraphQL](../../api/graphql/index.md#deprecation-and-r
For configuration removals, see the [Omnibus deprecation policy](../../administration/package_information/deprecation_policy.md).
For versioning and upgrade details, see our [Release and Maintenance policy](../../policy/maintenance.md).
+
+## Update the deprecations and removals documentation
+
+The [deprecations](../../update/deprecations.md) and [removals](../../update/removals.md)
+documentation is generated from the YAML files located in
+[`gitlab/data/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/data).
+
+To update the deprecations and removals pages when an entry is added,
+edited, or removed:
+
+1. From the command line, navigate to your local clone of the [`gitlab-org/gitlab`](https://gitlab.com/gitlab-org/gitlab) project.
+1. Create, edit, or remove the YAML file under [deprecations](https://gitlab.com/gitlab-org/gitlab/-/tree/master/data/deprecations)
+ or [removals](https://gitlab.com/gitlab-org/gitlab/-/tree/master/data/removals).
+1. Compile the deprecation or removals documentation with the appropriate command:
+
+ - For deprecations:
+
+ ```shell
+ bin/rake gitlab:docs:compile_deprecations
+ ```
+
+ - For removals:
+
+ ```shell
+ bin/rake gitlab:docs:compile_removals
+ ```
+
+1. If needed, you can verify the docs are up to date with:
+
+ - For deprecations:
+
+ ```shell
+ bin/rake gitlab:docs:check_deprecations
+ ```
+
+ - For removals:
+
+ ```shell
+ bin/rake gitlab:docs:check_removals
+ ```
+
+1. Commit the updated documentation and push the changes.
+1. Create a merge request using the [Deprecations](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Deprecations.md)
+ or [Removals](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Removals.md) templates.
+
+Related Handbook pages:
+
+- <https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-removals-and-breaking-changes>
+- <https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-and-removals-docs>
diff --git a/doc/development/distributed_tracing.md b/doc/development/distributed_tracing.md
index 680ac71f857..b4f347449cc 100644
--- a/doc/development/distributed_tracing.md
+++ b/doc/development/distributed_tracing.md
@@ -71,9 +71,7 @@ GITLAB_TRACING=opentracing://<driver>?<param_name>=<param_value>&<param_name_2>=
In this example, we have the following hypothetical values:
-- `driver`: the driver. [GitLab supports
- `jaeger`](../operations/tracing.md). In future, other
- tracing implementations may also be supported.
+- `driver`: the driver such a jaegar.
- `param_name`, `param_value`: these are driver specific configuration values. Configuration
parameters for Jaeger are documented [further on in this
document](#2-configure-the-gitlab_tracing-environment-variable) they should be URL encoded.
diff --git a/doc/development/documentation/feature_flags.md b/doc/development/documentation/feature_flags.md
index fb58851e93f..c5ea1985fc7 100644
--- a/doc/development/documentation/feature_flags.md
+++ b/doc/development/documentation/feature_flags.md
@@ -45,7 +45,7 @@ You can combine entries if they happened in the same release:
## Use a note to describe the state of the feature flag
-Information about feature flags should be in a **Note** at the start of the topic (just below the version history).
+Information about feature flags should be in a `FLAG` note at the start of the topic (just below the version history).
The note has three parts, and follows this structure:
@@ -62,6 +62,7 @@ FLAG:
|--------------------------|---------------|
| Available | `On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
| Unavailable | `On self-managed GitLab, by default this feature is not available. To make it available, ask an administrator to [enable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
+| Available to some users | `On self-managed GitLab, by default this feature is available to a subset of users. To show or hide the feature for all, ask an administrator to [change the status of the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
| Available, per-group | `On self-managed GitLab, by default this feature is available. To hide the feature per group, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
| Unavailable, per-group | `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](<path to>/administration/feature_flags.md) named <flag name>.` |
| Available, per-project | `On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, ask an administrator to [disable the feature flag](<path to>/administration/feature_flags.md) named <flag name>.` |
@@ -71,11 +72,11 @@ FLAG:
### GitLab.com availability information
-| If the feature is... | Use this text |
-|-------------------------------------|---------------|
-| Available | `On GitLab.com, this feature is available.` |
-| Available to GitLab.com admins only | `On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.`
-| Unavailable | `On GitLab.com, this feature is not available.`|
+| If the feature is... | Use this text |
+|---------------------------------------------|---------------|
+| Available | `On GitLab.com, this feature is available.` |
+| Available to GitLab.com administrators only | `On GitLab.com, this feature is available but can be configured by GitLab.com administrators only.`
+| Unavailable | `On GitLab.com, this feature is not available.`|
### Optional information
diff --git a/doc/development/documentation/restful_api_styleguide.md b/doc/development/documentation/restful_api_styleguide.md
index 8a505ed84a8..0a24f9b67be 100644
--- a/doc/development/documentation/restful_api_styleguide.md
+++ b/doc/development/documentation/restful_api_styleguide.md
@@ -26,11 +26,12 @@ In the Markdown doc for a resource (AKA endpoint):
GET /projects/:id/repository/branches
```
-- Every method must have a detailed [description of the parameters](#method-description).
+- Every method must have a detailed [description of the attributes](#method-description).
- Every method must have a cURL example.
-- Every method must have a response body (in JSON format).
+- Every method must have a detailed [description of the response body](#response-body-description).
+- Every method must have a response body example (in JSON format).
- If an attribute is available only to higher level tiers than the other
- parameters, add the appropriate inline [tier badge](styleguide/index.md#product-tier-badges).
+ attributes, add the appropriate inline [tier badge](styleguide/index.md#product-tier-badges).
Put the badge in the **Attribute** column, like the
`**(<tier>)**` code in the following template.
@@ -59,6 +60,13 @@ Supported attributes:
| `attribute` | datatype | **{dotted-circle}** No | Detailed description. |
| `attribute` | datatype | **{dotted-circle}** No | Detailed description. |
+Response body attributes:
+
+| Attribute | Type | Description |
+|:-------------------------|:---------|:----------------------|
+| `attribute` | datatype | Detailed description. |
+| `attribute` **(<tier>)** | datatype | Detailed description. |
+
Example request:
```shell
@@ -75,7 +83,7 @@ Example response:
```
````
-Adjust the [version history note accordingly](styleguide/index.md#version-text-in-the-version-history)
+Adjust the [version history note accordingly](versions.md#add-a-version-history-item)
to describe the GitLab release that introduced the API call.
## Method description
@@ -86,23 +94,51 @@ always be in code blocks using backticks (`` ` ``).
Sort the table by required attributes first, then alphabetically.
```markdown
-| Attribute | Type | Required | Description |
-|:-----------------------------|:--------------|:-----------------------|:-----------------------------------------------------|
+| Attribute | Type | Required | Description |
+|:-----------------------------|:--------------|:-----------------------|:----------------------------------------------------|
| `title` | string | **{check-circle}** Yes | Title of the issue. |
-| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
+| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
| `confidential` | boolean | **{dotted-circle}** No | Sets the issue to confidential. Default is `false`. |
```
Rendered example:
-| Attribute | Type | Required | Description |
-|:-----------------------------|:--------------|:-----------------------|:-----------------------------------------------------|
+| Attribute | Type | Required | Description |
+|:-----------------------------|:--------------|:-----------------------|:----------------------------------------------------|
| `title` | string | **{check-circle}** Yes | Title of the issue. |
-| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
+| `assignee_ids` **(PREMIUM)** | integer array | **{dotted-circle}** No | IDs of the users to assign the issue to. |
| `confidential` | boolean | **{dotted-circle}** No | Sets the issue to confidential. Default is `false`. |
For information about writing attribute descriptions, see the [GraphQL API description style guide](../api_graphql_styleguide.md#description-style-guide).
+## Response body description
+
+Use the following table headers to describe the response bodies. Attributes should
+always be in code blocks using backticks (`` ` ``).
+
+If the attribute is a complex type, like another object, represent sub-attributes
+with dots (`.`), like `project.name` or `projects[].name` in case of an array.
+
+Sort the table alphabetically.
+
+```markdown
+| Attribute | Type | Description |
+|:-----------------------------|:--------------|:------------------------------------------|
+| `assignee_ids` **(PREMIUM)** | integer array | IDs of the users to assign the issue to. |
+| `confidential` | boolean | Whether the issue is confidential or not. |
+| `title` | string | Title of the issue. |
+```
+
+Rendered example:
+
+| Attribute | Type | Description |
+|:-----------------------------|:--------------|:------------------------------------------|
+| `assignee_ids` **(PREMIUM)** | integer array | IDs of the users to assign the issue to. |
+| `confidential` | boolean | Whether the issue is confidential or not. |
+| `title` | string | Title of the issue. |
+
+For information about writing attribute descriptions, see the [GraphQL API description style guide](../api_graphql_styleguide.md#description-style-guide).
+
## cURL commands
- Use `https://gitlab.example.com/api/v4/` as an endpoint.
@@ -116,9 +152,9 @@ For information about writing attribute descriptions, see the [GraphQL API descr
| Methods | Description |
|:------------------------------------------------|:-------------------------------------------------------|
| `--header "PRIVATE-TOKEN: <your_access_token>"` | Use this method as is, whenever authentication needed. |
-| `--request POST` | Use this method when creating new objects |
-| `--request PUT` | Use this method when updating existing objects |
-| `--request DELETE` | Use this method when removing existing objects |
+| `--request POST` | Use this method when creating new objects. |
+| `--request PUT` | Use this method when updating existing objects. |
+| `--request DELETE` | Use this method when removing existing objects. |
## cURL Examples
diff --git a/doc/development/documentation/site_architecture/index.md b/doc/development/documentation/site_architecture/index.md
index bdda15e2064..3566ab82379 100644
--- a/doc/development/documentation/site_architecture/index.md
+++ b/doc/development/documentation/site_architecture/index.md
@@ -22,25 +22,29 @@ from where content is sourced, the `gitlab-docs` project, and the published outp
```mermaid
graph LR
- A[gitlab/doc]
- B[gitlab-runner/docs]
- C[omnibus-gitlab/doc]
- D[charts/doc]
- E[gitlab-docs]
- A --> E
- B --> E
- C --> E
- D --> E
- E -- Build pipeline --> F
- F[docs.gitlab.com]
- H[/ee/]
- I[/runner/]
- J[/omnibus/]
- K[/charts/]
- F --> H
- F --> I
- F --> J
- F --> K
+ A[gitlab-org/gitlab/doc]
+ B[gitlab-org/gitlab-runner/docs]
+ C[gitlab-org/omnibus-gitlab/doc]
+ D[gitlab-org/charts/gitlab/doc]
+ E[gitlab-org/cloud-native/gitlab-operator/doc]
+ Y[gitlab-org/gitlab-docs]
+ A --> Y
+ B --> Y
+ C --> Y
+ D --> Y
+ E --> Y
+ Y -- Build pipeline --> Z
+ Z[docs.gitlab.com]
+ M[//ee/]
+ N[//runner/]
+ O[//omnibus/]
+ P[//charts/]
+ Q[//operator/]
+ Z --> M
+ Z --> N
+ Z --> O
+ Z --> P
+ Z --> Q
```
GitLab docs content isn't kept in the `gitlab-docs` repository.
@@ -48,9 +52,10 @@ All documentation files are hosted in the respective repository of each
product, and all together are pulled to generate the docs website:
- [GitLab](https://gitlab.com/gitlab-org/gitlab/-/tree/master/doc)
-- [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master/doc)
+- [Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/tree/master/doc)
- [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner/-/tree/main/docs)
-- [GitLab Chart](https://gitlab.com/charts/gitlab/tree/master/doc)
+- [GitLab Chart](https://gitlab.com/gitlab-org/charts/gitlab/-/tree/master/doc)
+- [GitLab Operator](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/tree/master/doc)
Learn more about [the docs folder structure](folder_structure.md).
@@ -231,31 +236,9 @@ If you don't specify `editor:`, the simple one is used by default.
## Algolia search engine
The docs site uses [Algolia DocSearch](https://community.algolia.com/docsearch/)
-for its search function. This is how it works:
-
-1. GitLab is a member of the [DocSearch program](https://community.algolia.com/docsearch/#join-docsearch-program),
- which is the free tier of [Algolia](https://www.algolia.com/).
-1. Algolia hosts a [DocSearch configuration](https://github.com/algolia/docsearch-configs/blob/master/configs/gitlab.json)
- for the GitLab docs site, and we've worked together to refine it.
-1. That [configuration](https://community.algolia.com/docsearch/config-file.html) is
- parsed by their [crawler](https://community.algolia.com/docsearch/crawler-overview.html)
- every 24h and [stores](https://community.algolia.com/docsearch/inside-the-engine.html)
- the [DocSearch index](https://community.algolia.com/docsearch/how-do-we-build-an-index.html)
- on [Algolia's servers](https://community.algolia.com/docsearch/faq.html#where-is-my-data-hosted%3F).
-1. On the docs side, we use a [DocSearch layout](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/layouts/docsearch.html) which
- is present on pretty much every page except <https://docs.gitlab.com/search/>,
- which uses its [own layout](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/layouts/instantsearch.html). In those layouts,
- there's a JavaScript snippet which initiates DocSearch by using an API key
- and an index name (`gitlab`) that are needed for Algolia to show the results.
-
-### Algolia notes for GitLab team members
-
-If you're a GitLab team member, find credentials for the Algolia dashboard
-in the shared [GitLab 1Password account](https://about.gitlab.com/handbook/security/#1password-for-teams).
-To receive weekly reports of the search usage, search the Google doc with
-title `Email, Slack, and GitLab Groups and Aliases`, search for `docsearch`,
-and add a comment with your email to be added to the alias that gets the weekly
-reports.
+for its search function.
+
+Learn more in <https://gitlab.com/gitlab-org/gitlab-docs/-/blob/main/doc/docsearch.md>.
## Monthly release process (versions)
diff --git a/doc/development/documentation/structure.md b/doc/development/documentation/structure.md
index 21368098f39..329fd279b99 100644
--- a/doc/development/documentation/structure.md
+++ b/doc/development/documentation/structure.md
@@ -237,7 +237,7 @@ consider using subsections for each distinct task.
### Related topics
If inline links are not sufficient, you can create a topic called **Related topics**
-and include a bulleted list of related topics. This topic should be above the Troubleshooting section.
+and include an unordered list of related topics. This topic should be above the Troubleshooting section.
```markdown
# Related topics
@@ -336,7 +336,7 @@ Consider the following guidelines when offering examples:
the reader to go directly to the good part. Consider offering an explanation
(for example, a comment, or a link to a resource) on why something is bad
practice.
-- Better and best cases can be considered part of the good case(s) code block.
+- Better and best cases can be considered part of the good cases' code block.
In the same code block, precede each with comments: `# Better` and `# Best`.
Although the bad-then-good approach is acceptable for the GitLab development
diff --git a/doc/development/documentation/styleguide/index.md b/doc/development/documentation/styleguide/index.md
index 7bfc0320d02..c11d1422167 100644
--- a/doc/development/documentation/styleguide/index.md
+++ b/doc/development/documentation/styleguide/index.md
@@ -276,7 +276,6 @@ You can use these fake tokens as examples:
| Trigger token | `be20d8dcc028677c931e04f3871a9b` |
| Webhook secret token | `6XhDroRcYPM5by_h-HLY` |
| Health check token | `Tu7BgjR9qeZTEyRzGG2P` |
-| Request profile token | `7VgpS4Ax5utVD2esNstz` |
### Contractions
@@ -401,6 +400,39 @@ Backticks are more precise than quotes. For example, in this string:
It's not clear whether the user should include the period in the string.
+### Inline code
+
+Inline code style is applied inline with regular text. Use inline code style:
+
+- For filenames or fragments of configuration files. For example, `.gitlab-ci.yml`, `CODEOWNERS`, and `only: [main]`.
+- For HTTP methods (`HTTP POST`) and HTTP status codes, both full (`404 File Not Found`) and abbreviated (`404`).
+ For example: Send a `DELETE` request to delete the runner. Send a `POST` request to create one.
+
+To apply inline code style, wrap the text in a single backtick (`` ` ``). For example, `this is inline code style`.
+
+### Code blocks
+
+Code block style separates code text from regular text. Use code block style for commands run in the command-line
+interface. Code block style is easier to copy and paste in a user's terminal window.
+
+To apply code block style, wrap the text in triple backticks (three `` ` ``) and add a syntax highlighting hint. For
+example:
+
+````plaintext
+```plaintext
+This is codeblock style
+```
+````
+
+When using code block style:
+
+- Use quadruple backticks (four `` ` ``) to apply code block style when the code block you are styling has triple
+ backticks in it. For example, when illustrating code block style.
+- Add a blank line above and below code blocks.
+- Syntax highlight hints are required for code blocks. See the
+ [list of supported languages and lexers](https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers)
+ for available syntax highlighters. Use `plaintext` if no better hint is available.
+
## Lists
- Always start list items with a capital letter, unless they're parameters or
@@ -622,7 +654,10 @@ In the Markdown document:
For the heading text, **do**:
- Be clear and direct. Make every word count.
-- Use active verbs for tasks. For example, `Configure GDK` instead of `Configuring GDK`.
+- Use active, imperative verbs for [tasks](../structure.md#task). For example, `Create an issue`.
+- Use `ing` (gerund) verbs only when you need a topic that introduces tasks. For example, `Configuring GDK`.
+- Use nouns for [concepts](../structure.md#concept). For example, `GDK dependency management`. If a noun is
+ ambiguous, you can add a gerund. For example, `Documenting versions` instead of `Versions`.
- Talk about what the product does, realistically but from a positive perspective. Instead of
`Limitations`, move the content near other similar information. If you must, you can
use the title `Known issues`.
@@ -695,7 +730,6 @@ We include guidance for links in these categories:
for authoritative sources.
- When to use [links requiring permissions](#links-requiring-permissions).
- How to set up a [link to a video](#link-to-video).
-- How to [include links with version text](#where-to-put-version-text).
- How to [link to specific lines of code](#link-to-specific-lines-of-code)
### Basic link criteria
@@ -949,7 +983,7 @@ If you are documenting multiple fields and only one field needs explanation, do
1. Expand **Push rules**.
1. Complete the fields. **Branch name** must be a regular expression.
-To describe multiple fields, use bullets:
+To describe multiple fields, use unordered list items:
1. Expand **General pipelines**.
1. Complete the fields.
@@ -1166,80 +1200,6 @@ different mobile devices.
`/help`, because the GitLab Markdown processor doesn't support iframes. It's
hidden on the documentation site, but is displayed by `/help`.
-## Code blocks
-
-- Always wrap code added to a sentence in inline code blocks (`` ` ``).
- For example, `.gitlab-ci.yml`, `git add .`, `CODEOWNERS`, or `only: [main]`.
- File names, commands, entries, and anything that refers to code should be
- added to code blocks. To make things easier for the user, always add a full
- code block for things that can be useful to copy and paste, as they can do it
- with the button on code blocks.
-- HTTP methods (`HTTP POST`) and HTTP status codes, both full (`404 File Not Found`)
- and abbreviated (`404`), should be wrapped in inline code blocks when used in sentences.
- For example: Send a `DELETE` request to delete the runner. Send a `POST` request to create one.
-- Add a blank line above and below code blocks.
-- When providing a shell command and its output, prefix the shell command with `$`
- and leave a blank line between the command and the output.
-- When providing a command without output, don't prefix the shell command with `$`.
-- If you need to include triple backticks inside a code block, use four backticks
- for the code block fences instead of three.
-- For regular fenced code blocks, always use a highlighting class corresponding to
- the language for better readability. Examples:
-
- ````markdown
- ```ruby
- Ruby code
- ```
-
- ```javascript
- JavaScript code
- ```
-
- ```markdown
- [Markdown code example](example.md)
- ```
-
- ```plaintext
- Code or text for which no specific highlighting class is available.
- ```
- ````
-
-Syntax highlighting is required for fenced code blocks added to the GitLab
-documentation. Refer to this table for the most common language classes,
-or check the [complete list](https://github.com/rouge-ruby/rouge/wiki/List-of-supported-languages-and-lexers)
-of available language classes:
-
-| Preferred language tags | Language aliases and notes |
-|-------------------------|------------------------------------------------------------------------------|
-| `asciidoc` | |
-| `dockerfile` | Alias: `docker`. |
-| `elixir` | |
-| `erb` | |
-| `golang` | Alias: `go`. |
-| `graphql` | |
-| `haml` | |
-| `html` | |
-| `ini` | For some simple configuration files that are not in TOML format. |
-| `javascript` | Alias `js`. |
-| `json` | |
-| `markdown` | Alias: `md`. |
-| `mermaid` | |
-| `nginx` | |
-| `perl` | |
-| `php` | |
-| `plaintext` | Examples with no defined language, such as output from shell commands or API calls. If a code block has no language, it defaults to `plaintext`. Alias: `text`.|
-| `prometheus` | Prometheus configuration examples. |
-| `python` | |
-| `ruby` | Alias: `rb`. |
-| `shell` | Aliases: `bash` or `sh`. |
-| `sql` | |
-| `toml` | Runner configuration examples, and other TOML-formatted configuration files. |
-| `typescript` | Alias: `ts`. |
-| `xml` | |
-| `yaml` | Alias: `yml`. |
-
-For a complete reference on code blocks, see the [Kramdown guide](https://about.gitlab.com/handbook/markdown-guide/#code-blocks).
-
## GitLab SVG icons
> [Introduced](https://gitlab.com/gitlab-org/gitlab-docs/-/issues/384) in GitLab 12.7.
@@ -1379,7 +1339,7 @@ you don't need to supply your username and password each time.
### Disclaimer
Use to describe future functionality only.
-For more information, see [Legal disclaimer for future features](#legal-disclaimer-for-future-features).
+For more information, see [Legal disclaimer for future features](../versions.md#legal-disclaimer-for-future-features).
## Blockquotes
@@ -1429,222 +1389,6 @@ application:
- For elements with a tooltip or hover label, use that label in bold with
matching case. For example, `Select **Add status emoji**`.
-## GitLab versions
-
-GitLab product documentation pages (not including [Contributor and Development](../../index.md)
-pages in the `/development` directory) can include version information to help
-users be aware of recent improvements or additions.
-
-The GitLab Technical Writing team determines which versions of
-documentation to display on this site based on the GitLab
-[Statement of Support](https://about.gitlab.com/support/statement-of-support.html#version-support).
-
-### View older GitLab documentation versions
-
-Older versions of GitLab may no longer have documentation available from `docs.gitlab.com`.
-If documentation for your version is no longer available from `docs.gitlab.com`, you can still view a
-tagged and released set of documentation for your installed version:
-
-- In the [documentation archives](https://docs.gitlab.com/archives/).
-- At the `/help` URL of your GitLab instance.
-- In the documentation repository based on the respective branch (for example,
- the [13.2 branch](https://gitlab.com/gitlab-org/gitlab/-/tree/13-2-stable-ee/doc)).
-
-### Where to put version text
-
-When a feature is added or updated, you can include its version information
-either as a **Version history** item or as an inline text reference.
-
-#### Version text in the **Version History**
-
-If all content in a section is related, add version text after the header for
-the section. The version information must:
-
-- Be surrounded by blank lines.
-- Start with `>`. If there are multiple bullets, each line must start with `> -`.
-- The string must include these words in this order (capitalization doesn't matter):
- - `introduced`, `enabled`, `deprecated`, `changed`, `moved`, `recommended` (as in the
- [feature flag documentation](../feature_flags.md)), `removed`, or `renamed`
- - `in` or `to`
- - `GitLab`
-- Whenever possible, include a link to the completed issue, merge request, or epic
- that introduced the feature. An issue is preferred over a merge request, and
- a merge request is preferred over an epic.
-- Do not include information about the tier, unless documenting a tier change
- (for example, `Feature X [moved](issue-link) to Premium in GitLab 19.2`).
-- Do not link to the pricing page.
- The tier is provided by the [product badge](#product-tier-badges) on the heading.
-
-```markdown
-## Feature name
-
-> [Introduced](<link-to-issue>) in GitLab 11.3.
-
-This feature does something.
-
-## Feature name 2
-
-> - [Introduced](<link-to-issue>) in GitLab 11.3.
-> - [Enabled by default](<link-to-issue>) in GitLab 11.4.
-
-This feature does something else.
-```
-
-If you're documenting elements of a feature, start with the feature name or a gerund:
-
-```markdown
-> - Notifications for expiring tokens [introduced](<link-to-issue>) in GitLab 11.3.
-> - Creating an issue from an issue board [introduced](<link-to-issue>) in GitLab 13.1.
-```
-
-If a feature is moved to another tier:
-
-```markdown
-> - [Moved](<link-to-issue>) from GitLab Ultimate to GitLab Premium in 11.8.
-> - [Moved](<link-to-issue>) from GitLab Premium to GitLab Free in 12.0.
-```
-
-#### Inline version text
-
-If you're adding content to an existing topic, you can add version information
-inline with the existing text.
-
-In this case, add `([introduced/deprecated](<link-to-issue>) in GitLab X.X)`.
-
-Including the issue link is encouraged, but isn't a requirement. For example:
-
-```markdown
-The voting strategy in GitLab 13.4 and later requires the primary and secondary
-voters to agree.
-```
-
-#### Deprecated features
-
-When a feature is deprecated, add `(DEPRECATED)` to the page title or to
-the heading of the section documenting the feature, immediately before
-the tier badge:
-
-```markdown
-<!-- Page title example: -->
-# Feature A (DEPRECATED) **(ALL TIERS)**
-
-<!-- Doc section example: -->
-## Feature B (DEPRECATED) **(PREMIUM SELF)**
-```
-
-Add the deprecation to the version history note (you can include a link
-to a replacement when available):
-
-```markdown
-> - [Deprecated](<link-to-issue>) in GitLab 11.3. Replaced by [meaningful text](<link-to-appropriate-documentation>).
-```
-
-You can also describe the replacement in surrounding text, if available. If the
-deprecation isn't obvious in existing text, you may want to include a warning:
-
-```markdown
-WARNING:
-This feature was [deprecated](link-to-issue) in GitLab 12.3 and replaced by
-[Feature name](link-to-feature-documentation).
-```
-
-If you add `(DEPRECATED)` to the page's title and the document is linked from the docs
-navigation, either remove the page from the nav or update the nav item to include the
-same text before the feature name:
-
-```yaml
- - doc_title: (DEPRECATED) Feature A
-```
-
-In the first major GitLab version after the feature was deprecated, be sure to
-remove information about that deprecated feature.
-
-#### End-of-life for features or products
-
-When a feature or product enters its end-of-life, indicate its status by
-creating a [warning alert](#alert-boxes) directly after its relevant header.
-If possible, link to its deprecation and removal issues.
-
-For example:
-
-```markdown
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](link-to-issue)
-in GitLab X.X, and is planned for [removal](link-to-issue) in GitLab X.X.
-```
-
-After the feature or product is officially deprecated and removed, remove
-its information from the GitLab documentation.
-
-### Versions in the past or future
-
-When describing functionality available in past or future versions, use:
-
-- Earlier, and not older or before.
-- Later, and not newer or after.
-
-For example:
-
-- Available in GitLab 13.1 and earlier.
-- Available in GitLab 12.4 and later.
-- In GitLab 12.2 and earlier, ...
-- In GitLab 11.6 and later, ...
-
-### Promising features in future versions
-
-Do not promise to deliver features in a future release. For example, avoid phrases like,
-"Support for this feature is planned."
-
-We cannot guarantee future feature work, and promises
-like these can raise legal issues. Instead, say that an issue exists.
-For example:
-
-- Support for improvements is tracked `[in this issue](LINK)`.
-- You cannot do this thing, but `[an issue exists](LINK)` to change this behavior.
-
-You can say that we plan to remove a feature.
-
-#### Legal disclaimer for future features
-
-If you **must** write about features we have not yet delivered, put this exact disclaimer near the content it applies to.
-
-```markdown
-DISCLAIMER:
-This page contains information related to upcoming products, features, and functionality.
-It is important to note that the information presented is for informational purposes only.
-Please do not rely on this information for purchasing or planning purposes.
-As with all projects, the items mentioned on this page are subject to change or delay.
-The development, release, and timing of any products, features, or functionality remain at the
-sole discretion of GitLab Inc.
-```
-
-It renders on the GitLab documentation site as:
-
-DISCLAIMER:
-This page contains information related to upcoming products, features, and functionality.
-It is important to note that the information presented is for informational purposes only.
-Please do not rely on this information for purchasing or planning purposes.
-As with all projects, the items mentioned on this page are subject to change or delay.
-The development, release, and timing of any products, features, or functionality remain at the
-sole discretion of GitLab Inc.
-
-If all of the content on the page is not available, use the disclaimer once at the top of the page.
-
-If the content in a topic is not ready, use the disclaimer in the topic.
-
-### Removing versions after each major release
-
-When a major GitLab release occurs, we remove all references
-to now-unsupported versions. This removal includes version-specific instructions. For example,
-if GitLab version 12.1 and later are supported,
-instructions for users of GitLab 11 should be removed.
-
-[View the list of supported versions](https://about.gitlab.com/support/statement-of-support.html#version-support).
-
-To view historical information about a feature, review GitLab
-[release posts](https://about.gitlab.com/releases/), or search for the issue or
-merge request where the work was done.
-
## Products and features
Refer to the information in this section when describing products and features
@@ -1664,7 +1408,7 @@ pricing page. For example:
You must assign a tier badge:
-- To all H1 topic headings.
+- To all H1 topic headings, except the pages under `doc/development/*`.
- To topic headings that don't apply to the same tier as the H1.
To add a tier badge to a heading, add the relevant tier badge
@@ -1692,10 +1436,15 @@ functionality is described.
| Only GitLab Premium SaaS and higher tiers (no self-managed instances) | `**(PREMIUM SAAS)**` |
| Only GitLab Ultimate SaaS (no self-managed instances) | `**(ULTIMATE SAAS)**` |
-Topics that mention the `gitlab.rb` file are referring to
-self-managed instances of GitLab. To prevent confusion, include the relevant `TIER SELF`
-tier badge on the highest applicable heading level on
-the page.
+Topics that are only for instance administrators should be badged `<TIER> SELF`. Instance
+administrator documentation often includes sections that mention:
+
+- Changing the `gitlab.rb` or `gitlab.yml` files.
+- Accessing the rails console or running Rake tasks.
+- Doing things in the Admin Area.
+
+These pages should also mention if the tasks can only be accomplished by an
+instance administrator.
## Specific sections
diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md
index 65f6a0a328b..e7d927de2cf 100644
--- a/doc/development/documentation/styleguide/word_list.md
+++ b/doc/development/documentation/styleguide/word_list.md
@@ -164,7 +164,15 @@ Use lowercase for **boards**, **issue boards**, and **epic boards**.
Use **text box** to refer to the UI field. Do not use **field** or **box**. For example:
-- In the **Variable name** text box, enter `my text`.
+- In the **Variable name** text box, enter a value.
+
+
+## bullet
+
+Don't refer to individual items in an ordered or unordered list as **bullets**. Use **list item** instead. If you need to be less ambiguous, you can use:
+
+- **Ordered list item** for items in an ordered list.
+- **Unordered list item** for items in an unordered list.
## button
@@ -318,7 +326,22 @@ Use **active** or **on** instead. ([Vale](../testing.md#vale) rule: [`InclusionA
## enter
-Use **enter** instead of **type** when talking about putting values into text boxes.
+In most cases, use **enter** rather than **type**.
+
+- **Enter** encompasses multiple ways to enter information, including speech and keyboard.
+- **Enter** assumes that the user puts a value in a field and then moves the cursor outside the field (or presses <kbd>Enter</kbd>).
+ **Enter** includes both the entering of the content and the action to validate the content.
+
+For example:
+
+- In the **Variable name** text box, enter a value.
+- In the **Variable name** text box, enter `my text`.
+
+When you use **Enter** to refer to the key on a keyboard, use the HTML `<kbd>` tag:
+
+- To view the list of results, press <kbd>Enter</kbd>.
+
+See also [**type**](#type).
## epic
@@ -356,7 +379,7 @@ Use **box** instead of **field** or **text box**.
Use:
-- In the **Variable name** box, enter `my text`.
+- In the **Variable name** text box, enter `my text`.
Instead of:
@@ -392,6 +415,13 @@ Do not make **GitLab** possessive (GitLab's). This guidance follows [GitLab Trad
**GitLab.com** refers to the GitLab instance managed by GitLab itself.
+## GitLab Flavored Markdown
+
+When possible, spell out [**GitLab Flavored Markdown**](../../../user/markdown.md).
+([Vale](../testing.md#vale) rule: [`GLFM.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/SubstitutionSuggestions.yml))
+
+If you must abbreviate, do not use **GFM**. Use **GLFM** instead.
+
## GitLab SaaS
**GitLab SaaS** refers to the product license that provides access to GitLab.com. It does not refer to the
@@ -518,6 +548,25 @@ Instead of:
Do not use **list** when referring to a [**dropdown list**](#dropdown-list).
Use the full phrase **dropdown list** instead.
+## license
+
+When writing about licenses:
+
+- Do not use variations such as **cloud license**, **offline license**, or **legacy license**.
+- Do not use interchangeably with **subscription**:
+ - A license grants users access to the subscription they purchased, and contains information such as the number of seats they purchased and subscription dates.
+ - A subscription is the subscription tier that the user purchases.
+
+Use:
+
+ - Add a license to your instance.
+ - Purchase a subscription.
+
+Instead of:
+
+ - Buy a license.
+ - Purchase a license.
+
## log in, log on
Do not use **log in** or **log on**. Use [sign in](#sign-in) instead. If the user interface has **Log in**, you can use it.
@@ -576,6 +625,11 @@ Use lowercase for **merge requests**. If you use **MR** as the acronym, spell it
Use lowercase for **milestones**.
+## n/a, N/A, not applicable
+
+When possible, use **not applicable**. Spelling out the phrase helps non-English speaking users and avoids
+capitalization inconsistencies.
+
## navigate
Do not use **navigate**. Use **go** instead. For example:
@@ -950,7 +1004,17 @@ Use [**2FA** and **two-factor authentication**](#2fa-two-factor-authentication)
## type
-Do not use **type** if you can avoid it. Use **enter** instead.
+Use **type** when the cursor remains in the field you're typing in. For example,
+in a search dialog, you begin typing and the field populates results. You do not
+click out of the field.
+
+For example:
+
+- To view all users named Alex, type `Al`.
+- To view all labels for the documentation team, type `doc`.
+- For a list of quick actions, type `/`.
+
+See also [**enter**](#enter).
## update
@@ -1031,7 +1095,7 @@ Sometimes you might need to use **yet** when writing a task. If you use
**yet**, ensure the surrounding phrases are written
in present tense, active voice.
-[View guidance about how to write about future features](index.md#promising-features-in-future-versions).
+[View guidance about how to write about future features](../versions.md#promising-features-in-future-versions).
([Vale](../testing.md#vale) rule: [`CurrentStatus.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/.vale/gitlab/CurrentStatus.yml))
## you, your, yours
diff --git a/doc/development/documentation/testing.md b/doc/development/documentation/testing.md
index 9facb22669b..81e1eca8724 100644
--- a/doc/development/documentation/testing.md
+++ b/doc/development/documentation/testing.md
@@ -23,6 +23,10 @@ in the relevant projects:
- <https://gitlab.com/gitlab-org/gitlab-runner/-/blob/main/.gitlab/ci/docs.gitlab-ci.yml>
- <https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/master/gitlab-ci-config/gitlab-com.yml>
- <https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/.gitlab-ci.yml>
+- <https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/master/.gitlab-ci.yml>
+
+We also run some documentation tests in the GitLab Development Kit project:
+<https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/.gitlab/ci/test.gitlab-ci.yml>.
## Run tests locally
@@ -144,6 +148,36 @@ synchronized to the other projects. In `omnibus-gitlab`, `gitlab-runner`, and `c
is hard coded for specific projects.
1. Create a merge request and submit it to a technical writer for review and merge.
+## Update linting images
+
+Lint tests run in CI/CD pipelines using images from the `gitlab-docs` [container registry](https://gitlab.com/gitlab-org/gitlab-docs/container_registry).
+
+If a new version of a dependency is released (like a new version of Ruby), we
+should update the images to use the newer version. Then, we can update the configuration
+files in each of our documentation projects to point to the new image.
+
+To update the linting images:
+
+1. In `gitlab-docs`, open a merge request to update `.gitlab-ci.yml` to use the new tooling
+ version. ([Example MR](https://gitlab.com/gitlab-org/gitlab-docs/-/merge_requests/2571))
+1. When merged, start a `Build docs.gitlab.com every 4 hours` [scheduled pipeline](https://gitlab.com/gitlab-org/gitlab-docs/-/pipeline_schedules).
+1. Go the pipeline you started, and manually run the relevant build-images job,
+ for example, `image:docs-lint-markdown`.
+1. In the job output, get the name of the new image.
+ ([Example job output](https://gitlab.com/gitlab-org/gitlab-docs/-/jobs/2335033884#L334))
+1. Verify that the new image was added to the container registry.
+1. Open merge requests to update each of these configuration files to point to the new image.
+ In each merge request, include a small doc update to trigger the job that uses the image.
+ - <https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/ci/docs.gitlab-ci.yml> ([Example MR](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85177))
+ - <https://gitlab.com/gitlab-org/gitlab-runner/-/blob/main/.gitlab/ci/test.gitlab-ci.yml> ([Example MR](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/3408))
+ - <https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/master/gitlab-ci-config/gitlab-com.yml> ([Example MR](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/6037))
+ - <https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/.gitlab-ci.yml> ([Example MR](https://gitlab.com/gitlab-org/charts/gitlab/-/merge_requests/2511))
+ - <https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/blob/master/.gitlab-ci.yml> ([Example MR](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator/-/merge_requests/462))
+ - <https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/.gitlab/ci/test.gitlab-ci.yml> ([Example MR](https://gitlab.com/gitlab-org/gitlab-development-kit/-/merge_requests/2417))
+1. In each merge request, check the relevant job output to confirm the updated image was
+ used for the test. ([Example job output](https://gitlab.com/gitlab-org/charts/gitlab/-/jobs/2335470260#L24))
+1. Assign the merge requests to any technical writer to review and merge.
+
## Local linters
To help adhere to the [documentation style guidelines](styleguide/index.md), and improve the content
@@ -173,6 +207,7 @@ markdownlint configuration is found in the following projects:
- [`omnibus-gitlab`](https://gitlab.com/gitlab-org/omnibus-gitlab)
- [`charts`](https://gitlab.com/gitlab-org/charts/gitlab)
- [`gitlab-development-kit`](https://gitlab.com/gitlab-org/gitlab-development-kit)
+- [`gitlab-operator`](https://gitlab.com/gitlab-org/cloud-native/gitlab-operator)
This configuration is also used in build pipelines.
@@ -311,7 +346,7 @@ To configure Vale in your editor, install one of the following as appropriate:
- 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).
- Vim [ALE plugin](https://github.com/dense-analysis/ale).
-- Jetbrains IDEs - No plugin exists, but
+- JetBrains IDEs - No plugin exists, but
[this issue comment](https://github.com/errata-ai/vale-server/issues/39#issuecomment-751714451)
contains tips for configuring an external tool.
- Emacs [Flycheck extension](https://github.com/flycheck/flycheck).
diff --git a/doc/development/documentation/versions.md b/doc/development/documentation/versions.md
new file mode 100644
index 00000000000..0f2bdca4c73
--- /dev/null
+++ b/doc/development/documentation/versions.md
@@ -0,0 +1,232 @@
+---
+info: For assistance with this Style Guide page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments-to-other-projects-and-subjects.
+stage: none
+group: unassigned
+description: 'Writing styles, markup, formatting, and other standards for GitLab Documentation.'
+---
+
+# Documenting product versions
+
+The GitLab product documentation includes version-specific information,
+including when features were introduced and when they were updated or removed.
+
+## View older documentation versions
+
+Previous versions of the documentation are available on `docs.gitlab.com`.
+To view a previous version, select the **Versions** button in the top right.
+
+To view versions that are not available on `docs.gitlab.com`:
+
+- View the [documentation archives](https://docs.gitlab.com/archives/).
+- Go to the GitLab repository and select the version-specific branch. For example,
+ the [13.2 branch](https://gitlab.com/gitlab-org/gitlab/-/tree/13-2-stable-ee/doc) has the
+ documentation for GitLab 13.2.
+
+## Documenting version-specific features
+
+When a feature is added or updated, you can include its version information
+either as a **Version history** bullet or as an inline text reference.
+
+You do not need to add version information on the pages in the `/development` directory.
+
+### Add a **Version history** item
+
+If all content in a topic is related, add a version history item after the topic heading.
+For example:
+
+```markdown
+## Feature name
+
+> [Introduced](<link-to-issue>) in GitLab 11.3.
+
+This feature does something.
+```
+
+The item text must include these words in order. Capitalization doesn't matter.
+
+- `introduced`, `enabled`, `deprecated`, `changed`, `moved`, `recommended`, `removed`, or `renamed`
+- `in` or `to`
+- `GitLab`
+
+If possible, include a link to the related issue, merge request, or epic.
+Do not link to the pricing page. Do not include the subscription tier.
+
+#### Introducing a new feature
+
+If you use `introduced`, start the sentence with the feature name or a gerund:
+
+```markdown
+> - Notifications for expiring tokens [introduced](<link-to-issue>) in GitLab 11.3.
+> - Creating an issue from an issue board [introduced](<link-to-issue>) in GitLab 13.1.
+```
+
+#### Moving subscription tiers
+
+If a feature is moved to another subscription tier, use `moved`:
+
+```markdown
+> - [Moved](<link-to-issue>) from GitLab Ultimate to GitLab Premium in 11.8.
+> - [Moved](<link-to-issue>) from GitLab Premium to GitLab Free in 12.0.
+```
+
+### Inline version text
+
+If you're adding content to an existing topic, you can add version information
+inline with the existing text. If possible, include a link to the related issue,
+merge request, or epic. For example:
+
+```markdown
+The voting strategy [in GitLab 13.4 and later](<link-to-issue>) requires the primary and secondary
+voters to agree.
+```
+
+## Deprecations and removals
+
+When features are deprecated and removed, update the related documentation.
+
+API documentation follows these guidelines, but the GraphQL docs use
+a [separate process](../api_graphql_styleguide.md#deprecating-schema-items).
+
+### Deprecate a page or topic
+
+To deprecate a page or topic:
+
+1. Add `(deprecated)` after the title. Use a warning to explain when it was deprecated,
+ when it will be removed, and the replacement feature.
+
+ ```markdown
+ ## Title (deprecated) **(ULTIMATE SELF)**
+
+ WARNING:
+ This feature was [deprecated](<link-to-issue>) in GitLab 14.8
+ and is planned for removal in 15.4. Use [feature X](<link-to-issue>) instead.
+ ```
+
+ If you're not sure when the feature will be removed or no
+ replacement feature exists, you don't need to add this information.
+
+1. If the deprecation is a breaking change, add this text:
+
+ ```markdown
+ This change is a breaking change.
+ ```
+
+ You can add any additional context-specific details that might help users.
+
+1. Open a merge request to add the word `(deprecated)` to the left nav, after the page title.
+
+### Remove a page
+
+Mark content as removed during the release the feature was removed.
+The title and a removed indicator remains until three months after the removal.
+
+To remove a page:
+
+1. Leave the page title. Remove all other content, including the version history items and the word `WARNING:`.
+1. After the title, change `(deprecated)` to `(removed)`.
+1. Update the YAML metadata:
+ - For `remove_date`, set the value to a date three months after
+ the release when the feature was removed.
+ - For the `redirect_to`, set a path to a file that makes sense. If no obvious
+ page exists, use the docs home page.
+
+ ```markdown
+ ---
+ stage: Enablement
+ group: Global Search
+ info: To 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-08-02'
+ redirect_to: '../newpath/to/file/index.md'
+ ---
+
+ # Title (removed) **(ULTIMATE SELF)**
+
+ This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8
+ and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in 15.0.
+ Use [feature X](<link-to-issue>) instead.
+ ```
+
+1. Remove the page's entry from the global navigation by editing [`navigation.yaml`](https://gitlab.com/gitlab-org/gitlab-docs/blob/main/content/_data/navigation.yaml) in `gitlab-docs`.
+
+This content is removed from the documentation as part of the Technical Writing team's
+[regularly scheduled tasks](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#regularly-scheduled-tasks).
+
+### Remove a topic
+
+To remove a topic:
+
+1. Leave the title and the details of the deprecation and removal. Remove all other content,
+ including the version history items and the word `WARNING:`.
+1. Add `(removed)` after the title.
+1. Add the following HTML comments above and below the topic.
+ For the `remove_date`, set a date three months after the release where it was removed.
+
+ ```markdown
+ <!--- start_remove The following content will be removed on remove_date: '2023-08-22' -->
+
+ ## Title (removed) **(ULTIMATE SELF)**
+
+ This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8
+ and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in 15.0.
+ Use [feature X](<link-to-issue>) instead.
+
+ <!--- end_remove -->
+ ```
+
+This content is removed from the documentation as part of the Technical Writing team's
+[regularly scheduled tasks](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#regularly-scheduled-tasks).
+
+## Which versions are removed
+
+GitLab supports the current major version and two previous major versions.
+For example, if 14.0 is the current major version, all major and minor releases of
+GitLab 14.0, 13.0 and 12.0 are supported.
+
+[View the list of supported versions](https://about.gitlab.com/support/statement-of-support.html#version-support).
+
+If you see version history items or inline text that refers to unsupported versions, you can remove it.
+
+Historical feature information is available in [release posts](https://about.gitlab.com/releases/)
+or by searching for the issue or merge request where the work was done.
+
+## Promising features in future versions
+
+Do not promise to deliver features in a future release. For example, avoid phrases like,
+"Support for this feature is planned."
+
+We cannot guarantee future feature work, and promises
+like these can raise legal issues. Instead, say that an issue exists.
+For example:
+
+- Support for improvements is tracked `[in this issue](LINK)`.
+- You cannot do this thing, but `[an issue exists](LINK)` to change this behavior.
+
+You can say that we plan to remove a feature.
+
+### Legal disclaimer for future features
+
+If you **must** write about features we have not yet delivered, put this exact disclaimer near the content it applies to.
+
+```markdown
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+```
+
+It renders on the GitLab documentation site as:
+
+DISCLAIMER:
+This page contains information related to upcoming products, features, and functionality.
+It is important to note that the information presented is for informational purposes only.
+Please do not rely on this information for purchasing or planning purposes.
+As with all projects, the items mentioned on this page are subject to change or delay.
+The development, release, and timing of any products, features, or functionality remain at the
+sole discretion of GitLab Inc.
+
+If all of the content on the page is not available, use the disclaimer once at the top of the page.
+
+If the content in a topic is not ready, use the disclaimer in the topic.
diff --git a/doc/development/documentation/workflow.md b/doc/development/documentation/workflow.md
index a12af51e436..fb43a2e995a 100644
--- a/doc/development/documentation/workflow.md
+++ b/doc/development/documentation/workflow.md
@@ -151,7 +151,7 @@ Remember:
Ensure the following if skipping an initial Technical Writer review:
- [Product badges](styleguide/index.md#product-tier-badges) are applied.
-- The GitLab [version](styleguide/index.md#gitlab-versions) that
+- The GitLab [version](versions.md) that
introduced the feature is included.
- Changes to headings don't affect in-app hyperlinks.
- Specific [user permissions](../../user/permissions.md) are documented.
diff --git a/doc/development/ee_features.md b/doc/development/ee_features.md
index 019dbb13599..28cf6d4e1e3 100644
--- a/doc/development/ee_features.md
+++ b/doc/development/ee_features.md
@@ -74,6 +74,30 @@ setting the [`FOSS_ONLY` environment variable](https://gitlab.com/gitlab-org/git
to something that evaluates as `true`. The same works for running tests
(for example `FOSS_ONLY=1 yarn jest`).
+### Running feature specs as CE
+
+When running [feature specs](testing_guide/best_practices.md#system--feature-tests)
+as CE, you should ensure that the edition of backend and frontend match.
+To do so:
+
+1. Set the `FOSS_ONLY=1` environment variable:
+
+ ```shell
+ export FOSS_ONLY=1
+ ```
+
+1. Start GDK:
+
+ ```shell
+ gdk start
+ ```
+
+1. Run feature specs:
+
+ ```shell
+ bin/rspec spec/features/<path_to_your_spec>
+ ```
+
## CI pipelines in a FOSS context
By default, merge request pipelines for development run in an EE-context only. If you are
diff --git a/doc/development/emails.md b/doc/development/emails.md
index b8e390988bd..a5c2789a3ea 100644
--- a/doc/development/emails.md
+++ b/doc/development/emails.md
@@ -86,7 +86,7 @@ See the [Rails guides](https://guides.rubyonrails.org/action_mailer_basics.html#
# The IDLE command timeout.
idle_timeout: 60
- # Whether to expunge (permanently remove) messages from the mailbox when they are deleted after delivery
+ # Whether to expunge (permanently remove) messages from the mailbox when they are marked as deleted after delivery
expunge_deleted: false
```
diff --git a/doc/development/event_store.md b/doc/development/event_store.md
index 967272dcf2e..afd5640271e 100644
--- a/doc/development/event_store.md
+++ b/doc/development/event_store.md
@@ -313,17 +313,17 @@ we have added helpers and shared examples to standardize the way we test subscri
```ruby
RSpec.describe MergeRequests::UpdateHeadPipelineWorker do
- let(:event) { Ci::PipelineCreatedEvent.new(data: ({ pipeline_id: pipeline.id })) }
+ let(:pipeline_created_event) { Ci::PipelineCreatedEvent.new(data: ({ pipeline_id: pipeline.id })) }
# This shared example ensures that an event is published and correctly processed by
# the current subscriber (`described_class`).
- it_behaves_like 'consumes the published event' do
- let(:event) { event }
+ it_behaves_like 'subscribes to event' do
+ let(:event) { pipeline_created_event }
end
it 'does something' do
# This helper directly executes `perform` ensuring that `handle_event` is called correctly.
- consume_event(subscriber: described_class, event: event)
+ consume_event(subscriber: described_class, event: pipeline_created_event)
# run expectations
end
diff --git a/doc/development/experiment_guide/experiment_code_reviews.md b/doc/development/experiment_guide/experiment_code_reviews.md
new file mode 100644
index 00000000000..fdde89caa34
--- /dev/null
+++ b/doc/development/experiment_guide/experiment_code_reviews.md
@@ -0,0 +1,25 @@
+---
+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
+---
+
+# Experiment code reviews
+
+Experiments' code quality can fail our standards for several reasons. These
+reasons can include not being added to the codebase for a long time, or because
+of fast iteration to retrieve data. However, having the experiment run (or not
+run) shouldn't impact GitLab availability. To avoid or identify issues,
+experiments are initially deployed to a small number of users. Regardless,
+experiments still need tests.
+
+Experiments must have corresponding [frontend or feature tests](../testing_guide/index.md) to ensure they
+exist in the application. These tests should help prevent the experiment code from
+being removed before the [experiment cleanup process](https://about.gitlab.com/handbook/engineering/development/growth/experimentation/#experiment-cleanup-issue) starts.
+
+If, as a reviewer or maintainer, you find code that would usually fail review
+but is acceptable for now, mention your concerns with a note that there's no
+need to change the code. The author can then add a comment to this piece of code
+and link to the issue that resolves the experiment. The author or reviewer can add a link to this concern in the
+experiment rollout issue under the `Experiment Successful Cleanup Concerns` section of the description.
+If the experiment is successful and becomes part of the product, any items that appear under this section will be addressed.
diff --git a/doc/development/experiment_guide/experiment_rollout.md b/doc/development/experiment_guide/experiment_rollout.md
new file mode 100644
index 00000000000..afa32d75221
--- /dev/null
+++ b/doc/development/experiment_guide/experiment_rollout.md
@@ -0,0 +1,77 @@
+---
+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
+---
+
+# Experiment rollouts and feature flags
+
+## Experiment rollout issue
+
+Each experiment should have an [experiment rollout](https://gitlab.com/groups/gitlab-org/-/boards/1352542) issue to track the experiment from rollout through to cleanup and removal.
+The rollout issue is similar to a feature flag rollout issue, and is also used to track the status of an experiment.
+
+When an experiment is deployed, the due date of the issue should be set (this depends on the experiment but can be up to a few weeks in the future).
+After the deadline, the issue needs to be resolved and either:
+
+- It was successful and the experiment becomes the new default.
+- It was not successful and all code related to the experiment is removed.
+
+In either case, an outcome of the experiment should be posted to the issue with the reasoning for the decision.
+
+## Turn off all experiments
+
+When there is a case on GitLab.com (SaaS) that necessitates turning off all experiments, we have this control.
+
+You can toggle experiments on SaaS on and off using the `gitlab_experiment` [feature flag](../feature_flags).
+
+This can be done via ChatOps:
+
+- [disable](../feature_flags/controls.md#disabling-feature-flags): `/chatops run feature set gitlab_experiment false`
+- [enable](../feature_flags/controls.md#process): `/chatops run feature delete gitlab_experiment`
+- This allows the `default_enabled` [value of true in the yml](https://gitlab.com/gitlab-org/gitlab/-/blob/016430f6751b0c34abb24f74608c80a1a8268f20/config/feature_flags/ops/gitlab_experiment.yml#L8) to be honored.
+
+## Notes on feature flags
+
+NOTE:
+We use the terms "enabled" and "disabled" here, even though it's against our
+[documentation style guide recommendations](../documentation/styleguide/word_list.md#enable)
+because these are the terms that the feature flag documentation uses.
+
+You may already be familiar with the concept of feature flags in GitLab, but using
+feature flags in experiments is a bit different. While in general terms, a feature flag
+is viewed as being either `on` or `off`, this isn't accurate for experiments.
+
+Generally, `off` means that when we ask if a feature flag is enabled, it will always
+return `false`, and `on` means that it will always return `true`. An interim state,
+considered `conditional`, also exists. We take advantage of this trinary state of
+feature flags. To understand this `conditional` aspect: consider that either of these
+settings puts a feature flag into this state:
+
+- Setting a `percentage_of_actors` of any percent greater than 0%.
+- Enabling it for a single user or group.
+
+Conditional means that it returns `true` in some situations, but not all situations.
+
+When a feature flag is disabled (meaning the state is `off`), the experiment is
+considered _inactive_. You can visualize this in the [decision tree diagram](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment#how-it-works)
+as reaching the first `Running?` node, and traversing the negative path.
+
+When a feature flag is rolled out to a `percentage_of_actors` or similar (meaning the
+state is `conditional`) the experiment is considered to be _running_
+where sometimes the control is assigned, and sometimes the candidate is assigned.
+We don't refer to this as being enabled, because that's a confusing and overloaded
+term here. In the experiment terms, our experiment is _running_, and the feature flag is
+`conditional`.
+
+When a feature flag is enabled (meaning the state is `on`), the candidate will always be
+assigned.
+
+We should try to be consistent with our terms, and so for experiments, we have an
+_inactive_ experiment until we set the feature flag to `conditional`. After which,
+our experiment is then considered _running_. If you choose to "enable" your feature flag,
+you should consider the experiment to be _resolved_, because everyone is assigned
+the candidate unless they've opted out of experimentation.
+
+As of GitLab 13.10, work is being done to improve this process and how we communicate
+about it.
diff --git a/doc/development/experiment_guide/experimentation.md b/doc/development/experiment_guide/experimentation.md
deleted file mode 100644
index 28100564555..00000000000
--- a/doc/development/experiment_guide/experimentation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'gitlab_experiment.md'
-remove_date: '2022-04-13'
----
-
-This document was moved to [another location](gitlab_experiment.md).
-
-<!-- This redirect file can be deleted after <2022-04-13>. -->
-<!-- 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/experiment_guide/gitlab_experiment.md b/doc/development/experiment_guide/gitlab_experiment.md
index 78e1f84d701..5ddbe9b3de9 100644
--- a/doc/development/experiment_guide/gitlab_experiment.md
+++ b/doc/development/experiment_guide/gitlab_experiment.md
@@ -1,586 +1,11 @@
---
-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
+redirect_to: 'index.md'
+remove_date: '2022-08-05'
---
-# Implementing an A/B/n experiment
+This document was moved to [another location](index.md).
-## Introduction
-
-Experiments in GitLab are tightly coupled with the concepts provided by
-[Feature flags in development of GitLab](../feature_flags/index.md). You're strongly encouraged
-to read and understand the [Feature flags in development of GitLab](../feature_flags/index.md)
-portion of the documentation before considering running experiments. Experiments add additional
-concepts which may seem confusing or advanced without understanding the underpinnings of how GitLab
-uses feature flags in development. One concept: experiments can be run with multiple variants,
-which are sometimes referred to as A/B/n tests.
-
-We use the [`gitlab-experiment` gem](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment),
-sometimes referred to as GLEX, to run our experiments. The gem exists in a separate repository
-so it can be shared across any GitLab property that uses Ruby. You should feel comfortable reading
-the documentation on that project if you want to dig into more advanced topics or open issues. Be
-aware that the documentation there reflects what's in the main branch and may not be the same as
-the version being used within GitLab.
-
-## Glossary of terms
-
-To ensure a shared language, you should understand these fundamental terms we use
-when communicating about experiments:
-
-- `experiment`: Any deviation of code paths we want to run at some times, but not others.
-- `context`: A consistent experience we provide in an experiment.
-- `control`: The default, or "original" code path.
-- `candidate`: Defines an experiment with only one code path.
-- `variant(s)`: Defines an experiment with multiple code paths.
-- `behaviors`: Used to reference all possible code paths of an experiment, including the control.
-
-## Implementing an experiment
-
-[Examples](https://gitlab.com/gitlab-org/growth/growth/-/wikis/GLEX-Framework-code-examples)
-
-Start by generating a feature flag using the `bin/feature-flag` command as you
-normally would for a development feature flag, making sure to use `experiment` for
-the type. For the sake of documentation let's name our feature flag (and experiment)
-"pill_color".
-
-```shell
-bin/feature-flag pill_color -t experiment
-```
-
-After you generate the desired feature flag, you can immediately implement an
-experiment in code. An experiment implementation can be as simple as:
-
-```ruby
-experiment(:pill_color, actor: current_user) do |e|
- e.control { 'control' }
- e.variant(:red) { 'red' }
- e.variant(:blue) { 'blue' }
-end
-```
-
-When this code executes, the experiment is run, a variant is assigned, and (if within a
-controller or view) a `window.gl.experiments.pill_color` object will be available in the
-client layer, with details like:
-
-- The assigned variant.
-- The context key for client tracking events.
-
-In addition, when an experiment runs, an event is tracked for
-the experiment `:assignment`. We cover more about events, tracking, and
-the client layer later.
-
-In local development, you can make the experiment active by using the feature flag
-interface. You can also target specific cases by providing the relevant experiment
-to the call to enable the feature flag:
-
-```ruby
-# Enable for everyone
-Feature.enable(:pill_color)
-
-# Get the `experiment` method -- already available in controllers, views, and mailers.
-include Gitlab::Experiment::Dsl
-# Enable for only the first user
-Feature.enable(:pill_color, experiment(:pill_color, actor: User.first))
-```
-
-To roll out your experiment feature flag on an environment, run
-the following command using ChatOps (which is covered in more depth in the
-[Feature flags in development of GitLab](../feature_flags/index.md) documentation).
-This command creates a scenario where half of everyone who encounters
-the experiment would be assigned the _control_, 25% would be assigned the _red_
-variant, and 25% would be assigned the _blue_ variant:
-
-```slack
-/chatops run feature set pill_color 50 --actors
-```
-
-For an even distribution in this example, change the command to set it to 66% instead
-of 50.
-
-NOTE:
-To immediately stop running an experiment, use the
-`/chatops run feature set pill_color false` command.
-
-WARNING:
-We strongly recommend using the `--actors` flag when using the ChatOps commands,
-as anything else may give odd behaviors due to how the caching of variant assignment is
-handled.
-
-We can also implement this experiment in a HAML file with HTML wrappings:
-
-```haml
-#cta-interface
- - experiment(:pill_color, actor: current_user) do |e|
- - e.control do
- .pill-button control
- - e.variant(:red) do
- .pill-button.red red
- - e.variant(:blue) do
- .pill-button.blue blue
-```
-
-### The importance of context
-
-In our previous example experiment, our context (this is an important term) is a hash
-that's set to `{ actor: current_user }`. Context must be unique based on how you
-want to run your experiment, and should be understood at a lower level.
-
-It's expected, and recommended, that you use some of these
-contexts to simplify reporting:
-
-- `{ actor: current_user }`: Assigns a variant and is "sticky" to each user
- (or "client" if `current_user` is nil) who enters the experiment.
-- `{ project: project }`: Assigns a variant and is "sticky" to the project currently
- being viewed. If running your experiment is more useful when viewing a project,
- rather than when a specific user is viewing any project, consider this approach.
-- `{ group: group }`: Similar to the project example, but applies to a wider
- scope of projects and users.
-- `{ actor: current_user, project: project }`: Assigns a variant and is "sticky"
- to the user who is viewing the given project. This creates a different variant
- assignment possibility for every project that `current_user` views. Understand this
- can create a large cache size if an experiment like this in a highly trafficked part
- of the application.
-- `{ wday: Time.current.wday }`: Assigns a variant based on the current day of the
- week. In this example, it would consistently assign one variant on Friday, and a
- potentially different variant on Saturday.
-
-Context is critical to how you define and report on your experiment. It's usually
-the most important aspect of how you choose to implement your experiment, so consider
-it carefully, and discuss it with the wider team if needed. Also, take into account
-that the context you choose affects our cache size.
-
-After the above examples, we can state the general case: *given a specific
-and consistent context, we can provide a consistent experience and track events for
-that experience.* To dive a bit deeper into the implementation details: a context key
-is generated from the context that's provided. Use this context key to:
-
-- Determine the assigned variant.
-- Identify events tracked against that context key.
-
-We can think about this as the experience that we've rendered, which is both dictated
-and tracked by the context key. The context key is used to track the interaction and
-results of the experience we've rendered to that context key. These concepts are
-somewhat abstract and hard to understand initially, but this approach enables us to
-communicate about experiments as something that's wider than just user behavior.
-
-NOTE:
-Using `actor:` utilizes cookies if the `current_user` is nil. If you don't need
-cookies though - meaning that the exposed functionality would only be visible to
-signed in users - `{ user: current_user }` would be just as effective.
-
-WARNING:
-The caching of variant assignment is done by using this context, and so consider
-your impact on the cache size when defining your experiment. If you use
-`{ time: Time.current }` you would be inflating the cache size every time the
-experiment is run. Not only that, your experiment would not be "sticky" and events
-wouldn't be resolvable.
-
-### Advanced experimentation
-
-There are two ways to implement an experiment:
-
-1. The simple experiment style described previously.
-1. A more advanced style where an experiment class is provided.
-
-The advanced style is handled by naming convention, and works similar to what you
-would expect in Rails.
-
-To generate a custom experiment class that can override the defaults in
-`ApplicationExperiment` use the Rails generator:
-
-```shell
-rails generate gitlab:experiment pill_color control red blue
-```
-
-This generates an experiment class in `app/experiments/pill_color_experiment.rb`
-with the _behaviors_ we've provided to the generator. Here's an example
-of how that class would look after migrating our previous example into it:
-
-```ruby
-class PillColorExperiment < ApplicationExperiment
- control { 'control' }
- variant(:red) { 'red' }
- variant(:blue) { 'blue' }
-end
-```
-
-We can now simplify where we run our experiment to the following call, instead of
-providing the block we were initially providing, by explicitly calling `run`:
-
-```ruby
-experiment(:pill_color, actor: current_user).run
-```
-
-The _behaviors_ we defined in our experiment class represent the default
-implementation. You can still use the block syntax to override these _behaviors_
-however, so the following would also be valid:
-
-```ruby
-experiment(:pill_color, actor: current_user) do |e|
- e.control { '<strong>control</strong>' }
-end
-```
-
-NOTE:
-When passing a block to the `experiment` method, it is implicitly invoked as
-if `run` has been called.
-
-#### Segmentation rules
-
-You can use runtime segmentation rules to, for instance, segment contexts into a specific
-variant. The `segment` method is a callback (like `before_action`) and so allows providing
-a block or method name.
-
-In this example, any user named `'Richard'` would always be assigned the _red_
-variant, and any account older than 2 weeks old would be assigned the _blue_ variant:
-
-```ruby
-class PillColorExperiment < ApplicationExperiment
- # ...registered behaviors
-
- segment(variant: :red) { context.actor.first_name == 'Richard' }
- segment :old_account?, variant: :blue
-
- private
-
- def old_account?
- context.actor.created_at < 2.weeks.ago
- end
-end
-```
-
-When an experiment runs, the segmentation rules are executed in the order they're
-defined. The first segmentation rule to produce a truthy result assigns the variant.
-
-In our example, any user named `'Richard'`, regardless of account age, will always
-be assigned the _red_ variant. If you want the opposite logic, flip the order.
-
-NOTE:
-Keep in mind when defining segmentation rules: after a truthy result, the remaining
-segmentation rules are skipped to achieve optimal performance.
-
-#### Exclusion rules
-
-Exclusion rules are similar to segmentation rules, but are intended to determine
-if a context should even be considered as something we should include in the experiment
-and track events toward. Exclusion means we don't care about the events in relation
-to the given context.
-
-These examples exclude all users named `'Richard'`, *and* any account
-older than 2 weeks old. Not only are they given the control behavior - which could
-be nothing - but no events are tracked in these cases as well.
-
-```ruby
-class PillColorExperiment < ApplicationExperiment
- # ...registered behaviors
-
- exclude :old_account?, ->{ context.actor.first_name == 'Richard' }
-
- private
-
- def old_account?
- context.actor.created_at < 2.weeks.ago
- end
-end
-```
-
-You may also need to check exclusion in custom tracking logic by calling `should_track?`:
-
-```ruby
-class PillColorExperiment < ApplicationExperiment
- # ...registered behaviors
-
- def expensive_tracking_logic
- return unless should_track?
-
- track(:my_event, value: expensive_method_call)
- end
-end
-```
-
-### Tracking events
-
-One of the most important aspects of experiments is gathering data and reporting on
-it. You can use the `track` method to track events across an experimental implementation.
-You can track events consistently to an experiment if you provide the same context between
-calls to your experiment. If you do not yet understand context, you should read
-about contexts now.
-
-We can assume we run the experiment in one or a few places, but
-track events potentially in many places. The tracking call remains the same, with
-the arguments you would normally use when
-[tracking events using snowplow](../snowplow/index.md). The easiest example
-of tracking an event in Ruby would be:
-
-```ruby
-experiment(:pill_color, actor: current_user).track(:clicked)
-```
-
-When you run an experiment with any of the examples so far, an `:assignment` event
-is tracked automatically by default. All events that are tracked from an
-experiment have a special
-[experiment context](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-3)
-added to the event. This can be used - typically by the data team - to create a connection
-between the events on a given experiment.
-
-If our current user hasn't encountered the experiment yet (meaning where the experiment
-is run), and we track an event for them, they are assigned a variant and see
-that variant if they ever encountered the experiment later, when an `:assignment`
-event would be tracked at that time for them.
-
-NOTE:
-GitLab tries to be sensitive and respectful of our customers regarding tracking,
-so our experimentation library allows us to implement an experiment without ever tracking identifying
-IDs. It's not always possible, though, based on experiment reporting requirements.
-You may be asked from time to time to track a specific record ID in experiments.
-The approach is largely up to the PM and engineer creating the implementation.
-No recommendations are provided here at this time.
-
-## Testing with RSpec
-
-In the course of working with experiments, you'll probably want to utilize the RSpec
-tooling that's built in. This happens automatically for files in `spec/experiments`, but
-for other files and specs you want to include it in, you can specify the `:experiment` type:
-
-```ruby
-it "tests experiments nicely", :experiment do
-end
-```
-
-### Stub helpers
-
-You can stub experiments using `stub_experiments`. Pass it a hash using experiment
-names as the keys, and the variants you want each to resolve to, as the values:
-
-```ruby
-# Ensures the experiments named `:example` & `:example2` are both "enabled" and
-# that each will resolve to the given variant (`:my_variant` and `:control`
-# respectively).
-stub_experiments(example: :my_variant, example2: :control)
-
-experiment(:example) do |e|
- e.enabled? # => true
- e.assigned.name # => 'my_variant'
-end
-
-experiment(:example2) do |e|
- e.enabled? # => true
- e.assigned.name # => 'control'
-end
-```
-
-### Exclusion, segmentation, and behavior matchers
-
-You can also test things like the registered behaviors, the exclusions, and
-segmentations using the matchers.
-
-```ruby
-class ExampleExperiment < ApplicationExperiment
- control { }
- candidate { '_candidate_' }
-
- exclude { context.actor.first_name == 'Richard' }
- segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
-end
-
-excluded = double(username: 'rdiggitty', first_name: 'Richard')
-segmented = double(username: 'jejacks0n', first_name: 'Jeremy')
-
-# register_behavior matcher
-expect(experiment(:example)).to register_behavior(:control)
-expect(experiment(:example)).to register_behavior(:candidate).with('_candidate_')
-
-# exclude matcher
-expect(experiment(:example)).to exclude(actor: excluded)
-expect(experiment(:example)).not_to exclude(actor: segmented)
-
-# segment matcher
-expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
-expect(experiment(:example)).not_to segment(actor: excluded)
-```
-
-### Tracking matcher
-
-Tracking events is a major aspect of experimentation. We try
-to provide a flexible way to ensure your tracking calls are covered.
-
-You can do this on the instance level or at an "any instance" level:
-
-```ruby
-subject = experiment(:example)
-
-expect(subject).to track(:my_event)
-
-subject.track(:my_event)
-```
-
-You can use the `on_next_instance` chain method to specify that it will happen
-on the next instance of the experiment. This helps you if you're calling
-`experiment(:example).track` downstream:
-
-```ruby
-expect(experiment(:example)).to track(:my_event).on_next_instance
-
-experiment(:example).track(:my_event)
-```
-
-A full example of the methods you can chain onto the `track` matcher:
-
-```ruby
-expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
- .on_next_instance
- .with_context(foo: :bar)
- .for(:variant_name)
-
-experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')
-```
-
-## Experiments in the client layer
-
-Any experiment that's been run in the request lifecycle surfaces in `window.gl.experiments`,
-and matches [this schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-3)
-so it can be used when resolving experimentation in the client layer.
-
-Given that we've defined a class for our experiment, and have defined the variants for it, we can publish that experiment in a couple ways.
-
-The first way is simply by running the experiment. Assuming the experiment has been run, it will surface in the client layer without having to do anything special.
-
-The second way doesn't run the experiment and is intended to be used if the experiment only needs to surface in the client layer. To accomplish this we can simply `.publish` the experiment. This won't run any logic, but does surface the experiment details in the client layer so they can be utilized there.
-
-An example might be to publish an experiment in a `before_action` in a controller. Assuming we've defined the `PillColorExperiment` class, like we have above, we can surface it to the client by publishing it instead of running it:
-
-```ruby
-before_action -> { experiment(:pill_color).publish }, only: [:show]
-```
-
-You can then see this surface in the JavaScript console:
-
-```javascript
-window.gl.experiments // => { pill_color: { excluded: false, experiment: "pill_color", key: "ca63ac02", variant: "candidate" } }
-```
-
-### Using experiments in Vue
-
-With the `gitlab-experiment` component, you can define slots that match the name of the
-variants pushed to `window.gl.experiments`.
-
-We can make use of the named slots in the Vue component, that match the behaviors defined in :
-
-```vue
-<script>
-import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-
-export default {
- components: { GitlabExperiment }
-}
-</script>
-
-<template>
- <gitlab-experiment name="pill_color">
- <template #control>
- <button class="bg-default">Click default button</button>
- </template>
-
- <template #red>
- <button class="bg-red">Click red button</button>
- </template>
-
- <template #blue>
- <button class="bg-blue">Click blue button</button>
- </template>
- </gitlab-experiment>
-</template>
-```
-
-NOTE:
-When there is no experiment data in the `window.gl.experiments` object for the given experiment name, the `control` slot will be used, if it exists.
-
-## Test with Jest
-
-### Stub Helpers
-
-You can stub experiments using the `stubExperiments` helper defined in `spec/frontend/__helpers__/experimentation_helper.js`.
-
-```javascript
-import { stubExperiments } from 'helpers/experimentation_helper';
-import { getExperimentData } from '~/experimentation/utils';
-
-describe('when my_experiment is enabled', () => {
- beforeEach(() => {
- stubExperiments({ my_experiment: 'candidate' });
- });
-
- it('sets the correct data', () => {
- expect(getExperimentData('my_experiment')).toEqual({ experiment: 'my_experiment', variant: 'candidate' });
- });
-});
-```
-
-NOTE:
-This method of stubbing in Jest specs will not automatically un-stub itself at the end of the test. We merge our stubbed experiment in with all the other global data in `window.gl`. If you need to remove the stubbed experiment(s) after your test or ensure a clean global object before your test, you'll need to manage the global object directly yourself:
-
-```javascript
-describe('tests that care about global state', () => {
- const originalObjects = [];
-
- beforeEach(() => {
- // For backwards compatibility for now, we're using both window.gon & window.gl
- originalObjects.push(window.gon, window.gl);
- });
-
- afterEach(() => {
- [window.gon, window.gl] = originalObjects;
- });
-
- it('stubs experiment in fresh global state', () => {
- stubExperiment({ my_experiment: 'candidate' });
- // ...
- });
-})
-```
-
-## Notes on feature flags
-
-NOTE:
-We use the terms "enabled" and "disabled" here, even though it's against our
-[documentation style guide recommendations](../documentation/styleguide/word_list.md#enable)
-because these are the terms that the feature flag documentation uses.
-
-You may already be familiar with the concept of feature flags in GitLab, but using
-feature flags in experiments is a bit different. While in general terms, a feature flag
-is viewed as being either `on` or `off`, this isn't accurate for experiments.
-
-Generally, `off` means that when we ask if a feature flag is enabled, it will always
-return `false`, and `on` means that it will always return `true`. An interim state,
-considered `conditional`, also exists. We take advantage of this trinary state of
-feature flags. To understand this `conditional` aspect: consider that either of these
-settings puts a feature flag into this state:
-
-- Setting a `percentage_of_actors` of any percent greater than 0%.
-- Enabling it for a single user or group.
-
-Conditional means that it returns `true` in some situations, but not all situations.
-
-When a feature flag is disabled (meaning the state is `off`), the experiment is
-considered _inactive_. You can visualize this in the [decision tree diagram](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment#how-it-works)
-as reaching the first `Running?` node, and traversing the negative path.
-
-When a feature flag is rolled out to a `percentage_of_actors` or similar (meaning the
-state is `conditional`) the experiment is considered to be _running_
-where sometimes the control is assigned, and sometimes the candidate is assigned.
-We don't refer to this as being enabled, because that's a confusing and overloaded
-term here. In the experiment terms, our experiment is _running_, and the feature flag is
-`conditional`.
-
-When a feature flag is enabled (meaning the state is `on`), the candidate will always be
-assigned.
-
-We should try to be consistent with our terms, and so for experiments, we have an
-_inactive_ experiment until we set the feature flag to `conditional`. After which,
-our experiment is then considered _running_. If you choose to "enable" your feature flag,
-you should consider the experiment to be _resolved_, because everyone is assigned
-the candidate unless they've opted out of experimentation.
-
-As of GitLab 13.10, work is being done to improve this process and how we communicate
-about it.
+<!-- This redirect file can be deleted after 2022-08-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/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
new file mode 100644
index 00000000000..3c33d015108
--- /dev/null
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -0,0 +1,369 @@
+---
+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
+---
+
+# Implementing an A/B/n experiment
+
+## Implementing an experiment
+
+[Examples](https://gitlab.com/gitlab-org/growth/growth/-/wikis/GLEX-Framework-code-examples)
+
+Start by generating a feature flag using the `bin/feature-flag` command as you
+normally would for a development feature flag, making sure to use `experiment` for
+the type. For the sake of documentation let's name our feature flag (and experiment)
+"pill_color".
+
+```shell
+bin/feature-flag pill_color -t experiment
+```
+
+After you generate the desired feature flag, you can immediately implement an
+experiment in code. An experiment implementation can be as simple as:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.control { 'control' }
+ e.variant(:red) { 'red' }
+ e.variant(:blue) { 'blue' }
+end
+```
+
+When this code executes, the experiment is run, a variant is assigned, and (if within a
+controller or view) a `window.gl.experiments.pill_color` object will be available in the
+client layer, with details like:
+
+- The assigned variant.
+- The context key for client tracking events.
+
+In addition, when an experiment runs, an event is tracked for
+the experiment `:assignment`. We cover more about events, tracking, and
+the client layer later.
+
+In local development, you can make the experiment active by using the feature flag
+interface. You can also target specific cases by providing the relevant experiment
+to the call to enable the feature flag:
+
+```ruby
+# Enable for everyone
+Feature.enable(:pill_color)
+
+# Get the `experiment` method -- already available in controllers, views, and mailers.
+include Gitlab::Experiment::Dsl
+# Enable for only the first user
+Feature.enable(:pill_color, experiment(:pill_color, actor: User.first))
+```
+
+To roll out your experiment feature flag on an environment, run
+the following command using ChatOps (which is covered in more depth in the
+[Feature flags in development of GitLab](../feature_flags/index.md) documentation).
+This command creates a scenario where half of everyone who encounters
+the experiment would be assigned the _control_, 25% would be assigned the _red_
+variant, and 25% would be assigned the _blue_ variant:
+
+```slack
+/chatops run feature set pill_color 50 --actors
+```
+
+For an even distribution in this example, change the command to set it to 66% instead
+of 50.
+
+NOTE:
+To immediately stop running an experiment, use the
+`/chatops run feature set pill_color false` command.
+
+WARNING:
+We strongly recommend using the `--actors` flag when using the ChatOps commands,
+as anything else may give odd behaviors due to how the caching of variant assignment is
+handled.
+
+We can also implement this experiment in a HAML file with HTML wrappings:
+
+```haml
+#cta-interface
+ - experiment(:pill_color, actor: current_user) do |e|
+ - e.control do
+ .pill-button control
+ - e.variant(:red) do
+ .pill-button.red red
+ - e.variant(:blue) do
+ .pill-button.blue blue
+```
+
+### The importance of context
+
+In our previous example experiment, our context (this is an important term) is a hash
+that's set to `{ actor: current_user }`. Context must be unique based on how you
+want to run your experiment, and should be understood at a lower level.
+
+It's expected, and recommended, that you use some of these
+contexts to simplify reporting:
+
+- `{ actor: current_user }`: Assigns a variant and is "sticky" to each user
+ (or "client" if `current_user` is nil) who enters the experiment.
+- `{ project: project }`: Assigns a variant and is "sticky" to the project currently
+ being viewed. If running your experiment is more useful when viewing a project,
+ rather than when a specific user is viewing any project, consider this approach.
+- `{ group: group }`: Similar to the project example, but applies to a wider
+ scope of projects and users.
+- `{ actor: current_user, project: project }`: Assigns a variant and is "sticky"
+ to the user who is viewing the given project. This creates a different variant
+ assignment possibility for every project that `current_user` views. Understand this
+ can create a large cache size if an experiment like this in a highly trafficked part
+ of the application.
+- `{ wday: Time.current.wday }`: Assigns a variant based on the current day of the
+ week. In this example, it would consistently assign one variant on Friday, and a
+ potentially different variant on Saturday.
+
+Context is critical to how you define and report on your experiment. It's usually
+the most important aspect of how you choose to implement your experiment, so consider
+it carefully, and discuss it with the wider team if needed. Also, take into account
+that the context you choose affects our cache size.
+
+After the above examples, we can state the general case: *given a specific
+and consistent context, we can provide a consistent experience and track events for
+that experience.* To dive a bit deeper into the implementation details: a context key
+is generated from the context that's provided. Use this context key to:
+
+- Determine the assigned variant.
+- Identify events tracked against that context key.
+
+We can think about this as the experience that we've rendered, which is both dictated
+and tracked by the context key. The context key is used to track the interaction and
+results of the experience we've rendered to that context key. These concepts are
+somewhat abstract and hard to understand initially, but this approach enables us to
+communicate about experiments as something that's wider than just user behavior.
+
+NOTE:
+Using `actor:` utilizes cookies if the `current_user` is nil. If you don't need
+cookies though - meaning that the exposed functionality would only be visible to
+signed in users - `{ user: current_user }` would be just as effective.
+
+WARNING:
+The caching of variant assignment is done by using this context, and so consider
+your impact on the cache size when defining your experiment. If you use
+`{ time: Time.current }` you would be inflating the cache size every time the
+experiment is run. Not only that, your experiment would not be "sticky" and events
+wouldn't be resolvable.
+
+### Advanced experimentation
+
+There are two ways to implement an experiment:
+
+1. The simple experiment style described previously.
+1. A more advanced style where an experiment class is provided.
+
+The advanced style is handled by naming convention, and works similar to what you
+would expect in Rails.
+
+To generate a custom experiment class that can override the defaults in
+`ApplicationExperiment` use the Rails generator:
+
+```shell
+rails generate gitlab:experiment pill_color control red blue
+```
+
+This generates an experiment class in `app/experiments/pill_color_experiment.rb`
+with the _behaviors_ we've provided to the generator. Here's an example
+of how that class would look after migrating our previous example into it:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ control { 'control' }
+ variant(:red) { 'red' }
+ variant(:blue) { 'blue' }
+end
+```
+
+We can now simplify where we run our experiment to the following call, instead of
+providing the block we were initially providing, by explicitly calling `run`:
+
+```ruby
+experiment(:pill_color, actor: current_user).run
+```
+
+The _behaviors_ we defined in our experiment class represent the default
+implementation. You can still use the block syntax to override these _behaviors_
+however, so the following would also be valid:
+
+```ruby
+experiment(:pill_color, actor: current_user) do |e|
+ e.control { '<strong>control</strong>' }
+end
+```
+
+NOTE:
+When passing a block to the `experiment` method, it is implicitly invoked as
+if `run` has been called.
+
+#### Segmentation rules
+
+You can use runtime segmentation rules to, for instance, segment contexts into a specific
+variant. The `segment` method is a callback (like `before_action`) and so allows providing
+a block or method name.
+
+In this example, any user named `'Richard'` would always be assigned the _red_
+variant, and any account older than 2 weeks old would be assigned the _blue_ variant:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ # ...registered behaviors
+
+ segment(variant: :red) { context.actor.first_name == 'Richard' }
+ segment :old_account?, variant: :blue
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+When an experiment runs, the segmentation rules are executed in the order they're
+defined. The first segmentation rule to produce a truthy result assigns the variant.
+
+In our example, any user named `'Richard'`, regardless of account age, will always
+be assigned the _red_ variant. If you want the opposite logic, flip the order.
+
+NOTE:
+Keep in mind when defining segmentation rules: after a truthy result, the remaining
+segmentation rules are skipped to achieve optimal performance.
+
+#### Exclusion rules
+
+Exclusion rules are similar to segmentation rules, but are intended to determine
+if a context should even be considered as something we should include in the experiment
+and track events toward. Exclusion means we don't care about the events in relation
+to the given context.
+
+These examples exclude all users named `'Richard'`, *and* any account
+older than 2 weeks old. Not only are they given the control behavior - which could
+be nothing - but no events are tracked in these cases as well.
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ # ...registered behaviors
+
+ exclude :old_account?, ->{ context.actor.first_name == 'Richard' }
+
+ private
+
+ def old_account?
+ context.actor.created_at < 2.weeks.ago
+ end
+end
+```
+
+You may also need to check exclusion in custom tracking logic by calling `should_track?`:
+
+```ruby
+class PillColorExperiment < ApplicationExperiment
+ # ...registered behaviors
+
+ def expensive_tracking_logic
+ return unless should_track?
+
+ track(:my_event, value: expensive_method_call)
+ end
+end
+```
+
+### Tracking events
+
+One of the most important aspects of experiments is gathering data and reporting on
+it. You can use the `track` method to track events across an experimental implementation.
+You can track events consistently to an experiment if you provide the same context between
+calls to your experiment. If you do not yet understand context, you should read
+about contexts now.
+
+We can assume we run the experiment in one or a few places, but
+track events potentially in many places. The tracking call remains the same, with
+the arguments you would normally use when
+[tracking events using snowplow](../snowplow/index.md). The easiest example
+of tracking an event in Ruby would be:
+
+```ruby
+experiment(:pill_color, actor: current_user).track(:clicked)
+```
+
+When you run an experiment with any of the examples so far, an `:assignment` event
+is tracked automatically by default. All events that are tracked from an
+experiment have a special
+[experiment context](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-3)
+added to the event. This can be used - typically by the data team - to create a connection
+between the events on a given experiment.
+
+If our current user hasn't encountered the experiment yet (meaning where the experiment
+is run), and we track an event for them, they are assigned a variant and see
+that variant if they ever encountered the experiment later, when an `:assignment`
+event would be tracked at that time for them.
+
+NOTE:
+GitLab tries to be sensitive and respectful of our customers regarding tracking,
+so our experimentation library allows us to implement an experiment without ever tracking identifying
+IDs. It's not always possible, though, based on experiment reporting requirements.
+You may be asked from time to time to track a specific record ID in experiments.
+The approach is largely up to the PM and engineer creating the implementation.
+No recommendations are provided here at this time.
+
+## Experiments in the client layer
+
+Any experiment that's been run in the request lifecycle surfaces in `window.gl.experiments`,
+and matches [this schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_experiment/jsonschema/1-0-3)
+so it can be used when resolving experimentation in the client layer.
+
+Given that we've defined a class for our experiment, and have defined the variants for it, we can publish that experiment in a couple ways.
+
+The first way is simply by running the experiment. Assuming the experiment has been run, it will surface in the client layer without having to do anything special.
+
+The second way doesn't run the experiment and is intended to be used if the experiment only needs to surface in the client layer. To accomplish this we can simply `.publish` the experiment. This won't run any logic, but does surface the experiment details in the client layer so they can be utilized there.
+
+An example might be to publish an experiment in a `before_action` in a controller. Assuming we've defined the `PillColorExperiment` class, like we have above, we can surface it to the client by publishing it instead of running it:
+
+```ruby
+before_action -> { experiment(:pill_color).publish }, only: [:show]
+```
+
+You can then see this surface in the JavaScript console:
+
+```javascript
+window.gl.experiments // => { pill_color: { excluded: false, experiment: "pill_color", key: "ca63ac02", variant: "candidate" } }
+```
+
+### Using experiments in Vue
+
+With the `gitlab-experiment` component, you can define slots that match the name of the
+variants pushed to `window.gl.experiments`.
+
+We can make use of the named slots in the Vue component, that match the behaviors defined in :
+
+```vue
+<script>
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
+
+export default {
+ components: { GitlabExperiment }
+}
+</script>
+
+<template>
+ <gitlab-experiment name="pill_color">
+ <template #control>
+ <button class="bg-default">Click default button</button>
+ </template>
+
+ <template #red>
+ <button class="bg-red">Click red button</button>
+ </template>
+
+ <template #blue>
+ <button class="bg-blue">Click blue button</button>
+ </template>
+ </gitlab-experiment>
+</template>
+```
+
+NOTE:
+When there is no experiment data in the `window.gl.experiments` object for the given experiment name, the `control` slot will be used, if it exists.
diff --git a/doc/development/experiment_guide/index.md b/doc/development/experiment_guide/index.md
index f7af1113b6e..b140cce34fc 100644
--- a/doc/development/experiment_guide/index.md
+++ b/doc/development/experiment_guide/index.md
@@ -6,47 +6,46 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Experiment Guide
-Experiments can be conducted by any GitLab team, most often the teams from the [Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/). Experiments are not tied to releases because they primarily target GitLab.com.
-
-Experiments are run as an A/B/n test, and are behind an [experiment feature flag](../feature_flags/#experiment-type) to turn the test on or off. Based on the data the experiment generates, the team decides if the experiment had a positive impact and should be made the new default, or rolled back.
-
-## Experiment rollout issue
-
-Each experiment should have an [experiment rollout](https://gitlab.com/groups/gitlab-org/-/boards/1352542) issue to track the experiment from rollout through to cleanup and removal.
-The rollout issue is similar to a feature flag rollout issue, and is also used to track the status of an experiment.
-When an experiment is deployed, the due date of the issue should be set (this depends on the experiment but can be up to a few weeks in the future).
-After the deadline, the issue needs to be resolved and either:
-
-- It was successful and the experiment becomes the new default.
-- It was not successful and all code related to the experiment is removed.
-
-In either case, an outcome of the experiment should be posted to the issue with the reasoning for the decision.
-
-## Code reviews
-
-Experiments' code quality can fail our standards for several reasons. These
-reasons can include not being added to the codebase for a long time, or because
-of fast iteration to retrieve data. However, having the experiment run (or not
-run) shouldn't impact GitLab availability. To avoid or identify issues,
-experiments are initially deployed to a small number of users. Regardless,
-experiments still need tests.
-
-Experiments must have corresponding [frontend or feature tests](../testing_guide/index.md) to ensure they
-exist in the application. These tests should help prevent the experiment code from
-being removed before the [experiment cleanup process](https://about.gitlab.com/handbook/engineering/development/growth/experimentation/#experiment-cleanup-issue) starts.
-
-If, as a reviewer or maintainer, you find code that would usually fail review
-but is acceptable for now, mention your concerns with a note that there's no
-need to change the code. The author can then add a comment to this piece of code
-and link to the issue that resolves the experiment. The author or reviewer can add a link to this concern in the
-experiment rollout issue under the `Experiment Successful Cleanup Concerns` section of the description.
-If the experiment is successful and becomes part of the product, any items that appear under this section will be addressed.
+Experiments can be conducted by any GitLab team, most often the teams from the
+[Growth Sub-department](https://about.gitlab.com/handbook/engineering/development/growth/).
+Experiments are not tied to releases because they primarily target GitLab.com.
+
+Experiments are run as an A/B/n test, and are behind an [experiment feature flag](../feature_flags/#experiment-type)
+to turn the test on or off. Based on the data the experiment generates, the team decides
+if the experiment had a positive impact and should be made the new default, or rolled back.
+
+Experiments in GitLab are tightly coupled with the concepts provided by
+[Feature flags in development of GitLab](../feature_flags/index.md). You're strongly encouraged
+to read and understand the [Feature flags in development of GitLab](../feature_flags/index.md)
+portion of the documentation before considering running experiments. Experiments add additional
+concepts which may seem confusing or advanced without understanding the underpinnings of how GitLab
+uses feature flags in development. One concept: experiments can be run with multiple variants,
+which are sometimes referred to as A/B/n tests.
+
+We use the [`gitlab-experiment` gem](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment),
+sometimes referred to as GLEX, to run our experiments. The gem exists in a separate repository
+so it can be shared across any GitLab property that uses Ruby. You should feel comfortable reading
+the documentation on that project if you want to dig into more advanced topics or open issues. Be
+aware that the documentation there reflects what's in the main branch and may not be the same as
+the version being used within GitLab.
+
+## Glossary of terms
+
+To ensure a shared language, you should understand these fundamental terms we use
+when communicating about experiments:
+
+- `experiment`: Any deviation of code paths we want to run at some times, but not others.
+- `context`: A consistent experience we provide in an experiment.
+- `control`: The default, or "original" code path.
+- `candidate`: Defines an experiment with only one code path.
+- `variant(s)`: Defines an experiment with multiple code paths.
+- `behaviors`: Used to reference all possible code paths of an experiment, including the control.
## Implementing an experiment
[`GLEX`](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment) - or `Gitlab::Experiment`, the `gitlab-experiment` gem - is the preferred option for implementing an experiment in GitLab.
-For more information, see [Implementing an A/B/n experiment using GLEX](gitlab_experiment.md).
+For more information, see [Implementing an A/B/n experiment using GLEX](implementing_experiments.md).
This uses [experiment](../feature_flags/index.md#experiment-type) feature flags.
@@ -64,15 +63,3 @@ We recommend the following workflow:
1. **If the experiment is a success**, designers add the new icon or illustration to the Pajamas UI kit as part of the cleanup process.
Engineers can then add it to the [SVG library](https://gitlab-org.gitlab.io/gitlab-svgs/) and modify the implementation based on the
[Frontend Development Guidelines](../fe_guide/icons.md#usage-in-hamlrails-2).
-
-## Turn off all experiments
-
-When there is a case on GitLab.com (SaaS) that necessitates turning off all experiments, we have this control.
-
-You can toggle experiments on SaaS on and off using the `gitlab_experiment` [feature flag](../feature_flags).
-
-This can be done via chatops:
-
-- [disable](../feature_flags/controls.md#disabling-feature-flags): `/chatops run feature set gitlab_experiment false`
-- [enable](../feature_flags/controls.md#process): `/chatops run feature delete gitlab_experiment`
- - This allows the `default_enabled` [value of true in the yml](https://gitlab.com/gitlab-org/gitlab/-/blob/016430f6751b0c34abb24f74608c80a1a8268f20/config/feature_flags/ops/gitlab_experiment.yml#L8) to be honored.
diff --git a/doc/development/experiment_guide/testing_experiments.md b/doc/development/experiment_guide/testing_experiments.md
new file mode 100644
index 00000000000..08ff91a3deb
--- /dev/null
+++ b/doc/development/experiment_guide/testing_experiments.md
@@ -0,0 +1,150 @@
+---
+stage: Growth
+group: Activation
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Testing experiments
+
+## Testing experiments with RSpec
+
+In the course of working with experiments, you'll probably want to utilize the RSpec
+tooling that's built in. This happens automatically for files in `spec/experiments`, but
+for other files and specs you want to include it in, you can specify the `:experiment` type:
+
+```ruby
+it "tests experiments nicely", :experiment do
+end
+```
+
+### Stub helpers
+
+You can stub experiments using `stub_experiments`. Pass it a hash using experiment
+names as the keys, and the variants you want each to resolve to, as the values:
+
+```ruby
+# Ensures the experiments named `:example` & `:example2` are both "enabled" and
+# that each will resolve to the given variant (`:my_variant` and `:control`
+# respectively).
+stub_experiments(example: :my_variant, example2: :control)
+
+experiment(:example) do |e|
+ e.enabled? # => true
+ e.assigned.name # => 'my_variant'
+end
+
+experiment(:example2) do |e|
+ e.enabled? # => true
+ e.assigned.name # => 'control'
+end
+```
+
+### Exclusion, segmentation, and behavior matchers
+
+You can also test things like the registered behaviors, the exclusions, and
+segmentations using the matchers.
+
+```ruby
+class ExampleExperiment < ApplicationExperiment
+ control { }
+ candidate { '_candidate_' }
+
+ exclude { context.actor.first_name == 'Richard' }
+ segment(variant: :candidate) { context.actor.username == 'jejacks0n' }
+end
+
+excluded = double(username: 'rdiggitty', first_name: 'Richard')
+segmented = double(username: 'jejacks0n', first_name: 'Jeremy')
+
+# register_behavior matcher
+expect(experiment(:example)).to register_behavior(:control)
+expect(experiment(:example)).to register_behavior(:candidate).with('_candidate_')
+
+# exclude matcher
+expect(experiment(:example)).to exclude(actor: excluded)
+expect(experiment(:example)).not_to exclude(actor: segmented)
+
+# segment matcher
+expect(experiment(:example)).to segment(actor: segmented).into(:candidate)
+expect(experiment(:example)).not_to segment(actor: excluded)
+```
+
+### Tracking matcher
+
+Tracking events is a major aspect of experimentation. We try
+to provide a flexible way to ensure your tracking calls are covered.
+
+You can do this on the instance level or at an "any instance" level:
+
+```ruby
+subject = experiment(:example)
+
+expect(subject).to track(:my_event)
+
+subject.track(:my_event)
+```
+
+You can use the `on_next_instance` chain method to specify that it will happen
+on the next instance of the experiment. This helps you if you're calling
+`experiment(:example).track` downstream:
+
+```ruby
+expect(experiment(:example)).to track(:my_event).on_next_instance
+
+experiment(:example).track(:my_event)
+```
+
+A full example of the methods you can chain onto the `track` matcher:
+
+```ruby
+expect(experiment(:example)).to track(:my_event, value: 1, property: '_property_')
+ .on_next_instance
+ .with_context(foo: :bar)
+ .for(:variant_name)
+
+experiment(:example, :variant_name, foo: :bar).track(:my_event, value: 1, property: '_property_')
+```
+
+## Test with Jest
+
+### Stub Helpers
+
+You can stub experiments using the `stubExperiments` helper defined in `spec/frontend/__helpers__/experimentation_helper.js`.
+
+```javascript
+import { stubExperiments } from 'helpers/experimentation_helper';
+import { getExperimentData } from '~/experimentation/utils';
+
+describe('when my_experiment is enabled', () => {
+ beforeEach(() => {
+ stubExperiments({ my_experiment: 'candidate' });
+ });
+
+ it('sets the correct data', () => {
+ expect(getExperimentData('my_experiment')).toEqual({ experiment: 'my_experiment', variant: 'candidate' });
+ });
+});
+```
+
+NOTE:
+This method of stubbing in Jest specs will not automatically un-stub itself at the end of the test. We merge our stubbed experiment in with all the other global data in `window.gl`. If you need to remove the stubbed experiments after your test or ensure a clean global object before your test, you'll need to manage the global object directly yourself:
+
+```javascript
+describe('tests that care about global state', () => {
+ const originalObjects = [];
+
+ beforeEach(() => {
+ // For backwards compatibility for now, we're using both window.gon & window.gl
+ originalObjects.push(window.gon, window.gl);
+ });
+
+ afterEach(() => {
+ [window.gon, window.gl] = originalObjects;
+ });
+
+ it('stubs experiment in fresh global state', () => {
+ stubExperiment({ my_experiment: 'candidate' });
+ // ...
+ });
+})
+```
diff --git a/doc/development/fe_guide/content_editor.md b/doc/development/fe_guide/content_editor.md
index 2e64f52651e..d4c29cb8a24 100644
--- a/doc/development/fe_guide/content_editor.md
+++ b/doc/development/fe_guide/content_editor.md
@@ -47,7 +47,7 @@ The Content Editor requires two properties:
- `renderMarkdown` is an asynchronous function that returns the response (String) of invoking the
[Markdown API](../../api/markdown.md).
-- `uploadsPath` is a URL that points to a [GitLab upload service](../uploads/implementation.md#upload-encodings)
+- `uploadsPath` is a URL that points to a [GitLab upload service](../uploads/index.md)
with `multipart/form-data` support.
See the [`WikiForm.vue`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/pages/shared/wikis/components/wiki_form.vue#L207)
diff --git a/doc/development/fe_guide/design_anti_patterns.md b/doc/development/fe_guide/design_anti_patterns.md
index 76825d6ff18..b7238bb2813 100644
--- a/doc/development/fe_guide/design_anti_patterns.md
+++ b/doc/development/fe_guide/design_anti_patterns.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
Anti-patterns may seem like good approaches at first, but it has been shown that they bring more ills than benefits. These should
generally be avoided.
-Throughout the GitLab codebase, there may be historic uses of these anti-patterns. Please [use discretion](https://about.gitlab.com/handbook/engineering/principles/#balance-refactoring-and-velocity)
+Throughout the GitLab codebase, there may be historic uses of these anti-patterns. Please [use discretion](https://about.gitlab.com/handbook/engineering/development/principles/#balance-refactoring-and-velocity)
when figuring out whether or not to refactor, when touching code that uses one of these legacy patterns.
NOTE:
diff --git a/doc/development/fe_guide/development_process.md b/doc/development/fe_guide/development_process.md
index 9921b851344..b4893fd4ef9 100644
--- a/doc/development/fe_guide/development_process.md
+++ b/doc/development/fe_guide/development_process.md
@@ -103,7 +103,7 @@ With the purpose of being [respectful of others' time](https://about.gitlab.com/
- Before assigning to a maintainer, assign to a reviewer.
- If you assigned a merge request or pinged someone directly, be patient because we work in different timezones and asynchronously. Unless the merge request is urgent (like fixing a broken default branch), please don't DM or reassign the merge request before waiting for a 24-hour window.
- If you have a question regarding your merge request/issue, make it on the merge request/issue. When we DM each other, we no longer have a SSOT and [no one else is able to contribute](https://about.gitlab.com/handbook/values/#public-by-default).
-- When you have a big **Draft** merge request with many changes, you're advised to get the review started before adding/removing significant code. Make sure it is assigned well before the release cut-off, as the reviewer(s)/maintainer(s) would always prioritize reviewing finished MRs before the **Draft** ones.
+- When you have a big **Draft** merge request with many changes, you're advised to get the review started before adding/removing significant code. Make sure it is assigned well before the release cut-off, as the reviewers/maintainers would always prioritize reviewing finished MRs before the **Draft** ones.
- Make sure to remove the `Draft:` title before the last round of review.
### Share your work early
diff --git a/doc/development/fe_guide/graphql.md b/doc/development/fe_guide/graphql.md
index ddd99f3614d..5cfdaff0448 100644
--- a/doc/development/fe_guide/graphql.md
+++ b/doc/development/fe_guide/graphql.md
@@ -400,7 +400,7 @@ We are still learning the best practices for both **type policies** and **reacti
Take a moment to improve this guide or [leave a comment](https://gitlab.com/gitlab-org/frontend/rfcs/-/issues/100)
if you use it!
-In the example below we define a `@client` query and its `typedefs`:
+In the example below we define a `@client` query and its `typedefs`:
```javascript
// ./graphql/typedefs.graphql
@@ -1987,7 +1987,7 @@ To improve performance, sometimes we want to make initial GraphQL queries early.
}
```
-- Add startup call(s) with correct variables to the HAML file that serves as a view
+- Add startup calls with correct variables to the HAML file that serves as a view
for your application. To add GraphQL startup calls, we use
`add_page_startup_graphql_call` helper where the first parameter is a path to the
query, the second one is an object containing query variables. Path to the query is
diff --git a/doc/development/fe_guide/registry_architecture.md b/doc/development/fe_guide/registry_architecture.md
index 47a6dc40e19..56d67e094b7 100644
--- a/doc/development/fe_guide/registry_architecture.md
+++ b/doc/development/fe_guide/registry_architecture.md
@@ -56,7 +56,7 @@ in the container components when needed. This makes it easier to:
[`delete_package.vue`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_package.vue)).
- Leverage [startup for GraphQL calls](graphql.md#making-initial-queries-early-with-graphql-startup-calls).
-## Shared compoenents library
+## Shared components library
Inside `vue_shared/components/registry` and `packages_and_registries/shared`, there's a set of
shared components that you can use to implement registry functionality. These components build the
diff --git a/doc/development/fe_guide/style/html.md b/doc/development/fe_guide/style/html.md
index 72492d56ee4..90ff88bc975 100644
--- a/doc/development/fe_guide/style/html.md
+++ b/doc/development/fe_guide/style/html.md
@@ -58,11 +58,9 @@ Button tags requires a `type` attribute according to the [W3C HTML specification
### Blank target
-Avoid forcing links to open in a new window as this reduces the control the user has over the link.
-However, it might be a good idea to use a blank target when replacing the current page with
-the link makes the user lose content or progress.
+Arbitrarily opening links in a new tab is not recommended, so refer to the [Pajamas guidelines on links](https://design.gitlab.com/product-foundations/interaction/#links) when considering adding `target="_blank"` to links.
-Use `rel="noopener noreferrer"` whenever your links open in a new window, that is, `target="_blank"`. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
+When using `target="_blank"` with `a` tags, you must also add the `rel="noopener noreferrer"` attribute. This prevents a security vulnerability [documented by JitBit](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/).
When using `gl-link`, using `target="_blank"` is sufficient as it automatically adds `rel="noopener noreferrer"` to the link.
diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md
index 1ab97d8a1f5..1c32647eefd 100644
--- a/doc/development/fe_guide/tooling.md
+++ b/doc/development/fe_guide/tooling.md
@@ -155,6 +155,13 @@ $ grep "eslint-disable.*import/no-deprecated" -r .
./app/assets/javascripts/issuable_form.js: // eslint-disable-next-line import/no-deprecated
```
+### GraphQL schema and operations validation
+
+We use [`@graphql-eslint/eslint-plugin`](https://www.npmjs.com/package/@graphql-eslint/eslint-plugin)
+to lint GraphQL schema and operations. This plugin requires the entire schema to function properly.
+It is thus recommended to generate an up-to-date dump of the schema when running ESLint locally.
+You can do this by running the `./scripts/dump_graphql_schema` script.
+
## Formatting with Prettier
> Support for `.graphql` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/227280) in GitLab 13.2.
diff --git a/doc/development/fe_guide/vue3_migration.md b/doc/development/fe_guide/vue3_migration.md
index 8c8bb36d962..068b0c5b475 100644
--- a/doc/development/fe_guide/vue3_migration.md
+++ b/doc/development/fe_guide/vue3_migration.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
The migration from Vue 2 to 3 is tracked in epic [&6252](https://gitlab.com/groups/gitlab-org/-/epics/6252).
-To ease migration to Vue 3.x, we have added [eslint rules](https://gitlab.com/gitlab-org/frontend/eslint-plugin/-/merge_requests/50)
+To ease migration to Vue 3.x, we have added [ESLint rules](https://gitlab.com/gitlab-org/frontend/eslint-plugin/-/merge_requests/50)
that prevent us from using the following deprecated features in the codebase.
## Vue filters
diff --git a/doc/development/feature_flags/controls.md b/doc/development/feature_flags/controls.md
index f8f03773c12..68c14c1b0c9 100644
--- a/doc/development/feature_flags/controls.md
+++ b/doc/development/feature_flags/controls.md
@@ -262,7 +262,7 @@ To disable a feature flag that has been globally enabled you can run:
To disable a feature flag that has been enabled for a specific project you can run:
```shell
-/chatops run feature set --group=gitlab-org some_feature false
+/chatops run feature set --project=gitlab-org/gitlab some_feature false
```
You cannot selectively disable feature flags for a specific project/group/user without applying a [specific method of implementing](index.md#selectively-disable-by-actor) the feature flags.
diff --git a/doc/development/feature_flags/index.md b/doc/development/feature_flags/index.md
index 4b417b26381..54158de6893 100644
--- a/doc/development/feature_flags/index.md
+++ b/doc/development/feature_flags/index.md
@@ -7,7 +7,7 @@ info: "See the Technical Writers assigned to Development Guidelines: https://abo
# Feature flags in the development of GitLab
-**NOTE**:
+NOTE:
The documentation below covers feature flags used by GitLab to deploy its own features, which **is not** the same
as the [feature flags offered as part of the product](../../operations/feature_flags.md).
@@ -154,7 +154,6 @@ This process is meant to ensure consistent feature flag usage in the codebase. A
- Be known. Only use feature flags that are explicitly defined.
- Not be defined twice. They have to be defined either in FOSS or EE, but not both.
- Use a valid and consistent `type:` across all invocations.
-- Use the same `default_enabled:` across all invocations.
- Have an owner.
All feature flags known to GitLab are self-documented in YAML files stored in:
@@ -168,7 +167,7 @@ Each feature flag is defined in a separate YAML file consisting of a number of f
|---------------------|----------|----------------------------------------------------------------|
| `name` | yes | Name of the feature flag. |
| `type` | yes | Type of feature flag. |
-| `default_enabled` | yes | The default state of the feature flag that is strictly validated, with `default_enabled:` passed as an argument. |
+| `default_enabled` | yes | The default state of the feature flag. |
| `introduced_by_url` | no | The URL to the merge request that introduced the feature flag. |
| `rollout_issue_url` | no | The URL to the Issue covering the feature flag rollout. |
| `milestone` | no | Milestone in which the feature was added. |
@@ -256,42 +255,10 @@ if Feature.disabled?(:my_feature_flag, project)
end
```
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: true)
- # execute code if feature flag is enabled
-else
- # execute code if feature flag is disabled
-end
-
-if Feature.disabled?(:my_feature_flag, project, default_enabled: true)
- # execute code if feature flag is disabled
-end
-```
-
-If not specified, `default_enabled` is `false`.
-
-To force reading the `default_enabled` value from the relative YAML definition file, use
-`default_enabled: :yaml`:
-
-```ruby
-if Feature.enabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is enabled
-end
-```
+Default behavior for not configured feature flags is controlled
+by `default_enabled:` in YAML definition.
-```ruby
-if Feature.disabled?(:feature_flag, project, default_enabled: :yaml)
- # execute code if feature flag is disabled
-end
-```
-
-This allows to use the same feature flag check across various parts of the codebase and
-maintain the status of `default_enabled` in the YAML definition file which is the SSOT.
-
-If `default_enabled: :yaml` is used, a YAML definition is expected or an error is raised
+If feature flag does not have a YAML definition an error will be raised
in development or test environment, while returning `false` on production.
If not specified, the default feature flag type for `Feature.enabled?` and `Feature.disabled?`
@@ -333,6 +300,17 @@ class MyClass
end
```
+#### Recursion detection
+
+When there are many feature flags, it is not always obvious where they are
+called. Avoid cycles where the evaluation of one feature flag requires the
+evaluation of other feature flags. If this causes a cycle, it will be broken
+and the default value will be returned.
+
+To enable this recursion detection to work correctly, always access feature values through
+`Feature::enabled?`, and avoid the low-level use of `Feature::get`. When this
+happens, we track a `Feature::RecursionError` exception to the error tracker.
+
### Frontend
When using a feature flag for UI elements, make sure to _also_ use a feature
@@ -370,16 +348,6 @@ so checking for `gon.features.vim_bindings` would not work.
See the [Vue guide](../fe_guide/vue.md#accessing-feature-flags) for details about
how to access feature flags in a Vue component.
-In rare cases you may want to make a feature enabled by default. If so, explain the reasoning
-in the merge request. Use `default_enabled: true` when checking the feature flag state:
-
-```ruby
-before_action do
- # Prefer to scope it per project or user e.g.
- push_frontend_feature_flag(:vim_bindings, project, default_enabled: true)
-end
-```
-
If not specified, the default feature flag type for `push_frontend_feature_flag`
is `type: development`. For all other feature flag types, you must specify the `type:`:
@@ -440,6 +408,22 @@ Feature.enabled?(:a_feature, project) && Feature.disabled?(:a_feature_override,
/chatops run feature set --project=gitlab-org/gitlab a_feature_override true
```
+#### Use actors for verifying in production
+
+WARNING:
+Using production as a testing environment is not recommended. Use our testing
+environments for testing features that are not production-ready.
+
+While the staging environment provides a way to test features in an environment
+that resembles production, it doesn't allow you to compare before-and-after
+performance metrics specific to production environment. It can be useful to have a
+project in production with your development feature flag enabled, to allow tools
+like Sitespeed reports to reveal the metrics of the new code under a feature flag.
+
+This approach is even more useful if you're already tracking the old codebase in
+Sitespeed, enabling you to compare performance accurately before and after the
+feature flag's rollout.
+
### Enable additional objects as actors
To use feature gates based on actors, the model needs to respond to
@@ -673,9 +657,7 @@ You can control whether the `Flipper::Adapters::Memory` or `ActiveRecord` mode i
#### `stub_feature_flags: true` (default and preferred)
In this mode Flipper is configured to use `Flipper::Adapters::Memory` and mark all feature
-flags to be on-by-default and persisted on a first use. This overwrites the `default_enabled:`
-of `Feature.enabled?` and `Feature.disabled?` returning always `true` unless feature flag
-is persisted.
+flags to be on-by-default and persisted on a first use.
Make sure behavior under feature flag doesn't go untested in some non-specific contexts.
diff --git a/doc/development/features_inside_dot_gitlab.md b/doc/development/features_inside_dot_gitlab.md
index 7b11b541b5a..ca7dbd6adde 100644
--- a/doc/development/features_inside_dot_gitlab.md
+++ b/doc/development/features_inside_dot_gitlab.md
@@ -16,7 +16,6 @@ When implementing new features, please refer to these existing features to avoid
- [CODEOWNERS](../user/project/code_owners.md#set-up-code-owners): `.gitlab/CODEOWNERS`.
- [Route Maps](../ci/review_apps/#route-maps): `.gitlab/route-map.yml`.
- [Customize Auto DevOps Helm Values](../topics/autodevops/customize.md#customize-values-for-helm-chart): `.gitlab/auto-deploy-values.yaml`.
-- [GitLab managed apps CI/CD](../user/clusters/applications.md#prerequisites): `.gitlab/managed-apps/config.yaml`.
- [Insights](../user/project/insights/index.md#configure-your-insights): `.gitlab/insights.yml`.
- [Service Desk Templates](../user/project/service_desk.md#using-customized-email-templates): `.gitlab/service_desk_templates/`.
- [Web IDE](../user/project/web_ide/#web-ide-configuration-file): `.gitlab/.gitlab-webide.yml`.
diff --git a/doc/development/fips_compliance.md b/doc/development/fips_compliance.md
index 8fe5af56f9d..d4274c6275b 100644
--- a/doc/development/fips_compliance.md
+++ b/doc/development/fips_compliance.md
@@ -97,3 +97,414 @@ 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
+```
+
+## 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).
+
+## 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.
+
+### 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/).
+
+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
+
+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
+
+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),
+ create a `data.tf` in your environment (for example, `gitlab-environment-toolkit/terraform/environments/gitlab-10k/inventory/data.tf`):
+
+ ```tf
+ data "aws_ami" "ubuntu_20_04_fips" {
+ count = 1
+
+ most_recent = true
+
+ filter {
+ name = "name"
+ values = ["ubuntu-pro-fips-server/images/hvm-ssd/ubuntu-focal-20.04-amd64-pro-fips-server-*"]
+ }
+
+ filter {
+ name = "virtualization-type"
+ values = ["hvm"]
+ }
+
+ owners = ["aws-marketplace"]
+ }
+ ```
+
+1. Add the custom `ami_id` to use this AMI in `environment.tf`. For
+ example, in `gitlab-environment-toolkit/terraform/environments/gitlab-10k/inventory/environment.tf`:
+
+ ```tf
+ module "gitlab_ref_arch_aws" {
+ source = "../../modules/gitlab_ref_arch_aws"
+
+ prefix = var.prefix
+ ami_id = data.aws_ami.ubuntu_20_04_fips[0].id
+ ...
+ ```
+
+NOTE:
+GET does not allow the AMI to change on EC2 instances after it has
+been deployed via `terraform apply`. Since an AMI change would tear down
+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
+
+The standard Omnibus GitLab releases build their own OpenSSL library,
+which is not FIPS-validated. However, we have nightly builds that create
+Omnibus packages that link against the operating system's OpenSSL library. To
+use this package, update the `gitlab_repo_script_url` field in the
+Ansible `vars.yml`. For example, you might modify
+`gitlab-environment-toolkit/ansible/environments/gitlab-10k/inventory/vars.yml`
+in this way:
+
+```yaml
+all:
+ vars:
+ ...
+ gitlab_repo_script_url: "https://packages.gitlab.com/install/repositories/gitlab/nightly-fips-builds/script.deb.sh"
+```
+
+### 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
+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
+
+Because Amazon does not yet publish a FIPS-enabled AMI, you have to
+build one yourself with Packer.
+
+Amazon publishes the following Git repositories with information about custom EKS AMIs:
+
+- [Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami)
+- [Sample EKS custom AMIs](https://github.com/aws-samples/amazon-eks-custom-amis/)
+
+This [GitHub pull request](https://github.com/awslabs/amazon-eks-ami/pull/898) makes
+it possible to create an Amazon Linux 2 EKS AMI with FIPS enabled for Kubernetes v1.21.
+To build an image:
+
+1. [Install Packer](https://learn.hashicorp.com/tutorials/packer/get-started-install-cli).
+1. Run the following:
+
+ ```shell
+ git clone https://github.com/awslabs/amazon-eks-ami
+ cd amazon-eks-ami
+ git fetch origin pull/898/head:fips-ami
+ git checkout fips-ami
+ AWS_DEFAULT_REGION=us-east-1 make 1.21-fips # Be sure to set the region accordingly
+ ```
+
+If you are using a different version of Kubernetes, adjust the `make`
+command and `Makefile` accordingly.
+
+When the AMI build is done, a new AMI should be created with a message
+such as the following:
+
+```plaintext
+==> Builds finished. The artifacts of successful builds are:
+--> amazon-ebs: AMIs were created:
+us-west-2: ami-0a25e760cd00b027e
+```
+
+In this example, the AMI ID is `ami-0a25e760cd00b027e`, but your value may
+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
+
+Now you can set the custom EKS AMI.
+
+1. In `environment.tf`, add `eks_ami_id = var.eks_ami_id` so you can pass this variable to the
+ AWS reference architecture module. For example, in
+ `gitlab-environment-toolkit/terraform/environments/gitlab-10k/inventory/environment.tf`:
+
+ ```tf
+ module "gitlab_ref_arch_aws" {
+ source = "../../modules/gitlab_ref_arch_aws"
+
+ prefix = var.prefix
+ ami_id = data.aws_ami.ubuntu_20_04_fips[0].id
+ eks_ami_id = var.eks_ami_id
+ ....
+ ```
+
+1. In `variables.tf`, define a `eks_ami_id` with the AMI ID in the
+ previous step:
+
+ ```tf
+ variable "eks_ami_id" {
+ default = "ami-0a25e760cd00b027e"
+ }
+ ```
+
+#### 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.
+
+To switch to UBI-based containers, edit the Ansible `vars.yml` to use custom
+Charts variables:
+
+```yaml
+all:
+ vars:
+ ...
+ gitlab_charts_custom_config_file: '/path/to/gitlab-environment-toolkit/ansible/environments/gitlab-10k/inventory/charts.yml'
+```
+
+Now create `charts.yml` in the location specified above and specify tags with a `-ubi8` suffix. For example:
+
+```yaml
+global:
+ image:
+ pullPolicy: Always
+ certificates:
+ image:
+ tag: master-ubi8
+
+gitlab:
+ gitaly:
+ image:
+ tag: master-ubi8
+ gitlab-exporter:
+ image:
+ tag: master-ubi8
+ gitlab-shell:
+ image:
+ tag: main-ubi8 # The default branch is main, not master
+ gitlab-mailroom:
+ image:
+ tag: master-ubi8
+ migrations:
+ image:
+ tag: master-ubi8
+ sidekiq:
+ image:
+ tag: master-ubi8
+ toolbox:
+ image:
+ tag: master-ubi8
+ webservice:
+ image:
+ tag: master-ubi8
+ workhorse:
+ tag: master-ubi8
+
+nginx-ingress:
+ controller:
+ image:
+ repository: registry.gitlab.com/stanhu/gitlab-test-images/k8s-staging-ingress-nginx/controller
+ tag: v1.2.0-beta.1
+ pullPolicy: Always
+ digest: sha256:ace38833689ad34db4a46bc1e099242696eb800def88f02200a8615530734116
+```
+
+The above example shows a FIPS-enabled [`nginx-ingress`](https://github.com/kubernetes/ingress-nginx) image.
+See [this issue](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/3153#note_917782207) for more details on
+how to build NGINX and the Ingress Controller.
+
+You can also use release tags, but the versioning is tricky because each
+component may use its own versioning scheme. For example, for GitLab v14.10:
+
+```yaml
+global:
+ certificates:
+ image:
+ tag: 20191127-r2-ubi8
+
+gitlab:
+ gitaly:
+ image:
+ tag: v14.10.0-ubi8
+ gitlab-exporter:
+ image:
+ tag: 11.14.0-ubi8
+ gitlab-shell:
+ image:
+ tag: v13.25.1-ubi8
+ gitlab-mailroom:
+ image:
+ tag: v14.10.0-ubi8
+ migrations:
+ image:
+ tag: v14.10.0-ubi8
+ sidekiq:
+ image:
+ tag: v14.10.0-ubi8
+ toolbox:
+ image:
+ tag: v14.10.0-ubi8
+ webservice:
+ image:
+ tag: v14.10.0-ubi8
+ workhorse:
+ tag: v14.10.0-ubi8
+```
+
+## Verify FIPS
+
+The following sections describe ways you can verify if FIPS is enabled.
+
+### Kernel
+
+```shell
+$ cat /proc/sys/crypto/fips_enabled
+1
+```
+
+### Ruby (Omnibus images)
+
+```ruby
+$ /opt/gitlab/embedded/bin/irb
+irb(main):001:0> require 'openssl'; OpenSSL.fips_mode
+=> true
+```
+
+### Ruby (CNG images)
+
+```ruby
+$ irb
+irb(main):001:0> require 'openssl'; OpenSSL.fips_mode
+=> true
+```
+
+### Go
+
+Google maintains a [`dev.boringcrypto` branch](https://github.com/golang/go/tree/dev.boringcrypto) in the Golang compiler
+that makes it possible to statically link BoringSSL, a FIPS-validated module forked from OpenSSL.
+However, BoringSSL is not intended for public use.
+
+We use [`golang-fips`](https://github.com/golang-fips/go), [a fork of the `dev.boringcrypto` branch](https://github.com/golang/go/blob/2fb6bf8a4a51f92f98c2ae127eff2b7ac392c08f/README.boringcrypto.md) to build Go programs that
+[dynamically link OpenSSL via `dlopen`](https://github.com/golang-fips/go/blob/go1.18.1-1-openssl-fips/src/crypto/internal/boring/boring.go#L47-L65). This has several advantages:
+
+- Using a FIPS-validated, system OpenSSL is straightforward.
+- This is the source code used by [Red Hat's go-toolset package](https://gitlab.com/redhat/centos-stream/rpms/golang#sources).
+- Unlike [go-toolset](https://developers.redhat.com/blog/2019/06/24/go-and-fips-140-2-on-red-hat-enterprise-linux#), this fork appears to keep up with the latest Go releases.
+
+However, [cgo](https://pkg.go.dev/cmd/cgo) must be enabled via `CGO_ENABLED=1` for this to work. There
+is a performance hit when calling into C code.
+
+Projects that are compiled with `golang-fips` on Linux x86 automatically
+get built the crypto routines that use OpenSSL. While the `boringcrypto`
+build tag is automatically present, no extra build tags are actually
+needed. There are [specific build tags](https://github.com/golang-fips/go/blob/go1.18.1-1-openssl-fips/src/crypto/internal/boring/boring.go#L6)
+that disable these crypto hooks.
+
+We can [check whether a given binary is using OpenSSL](https://go.googlesource.com/go/+/dev.boringcrypto/misc/boring/#caveat) via `go tool nm`
+and look for symbols named `Cfunc__goboringcrypto`. For example:
+
+```plaintext
+$ go tool nm nginx-ingress-controller | grep Cfunc__goboringcrypto | tail
+ 2a0b650 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA384_Final
+ 2a0b658 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA384_Init
+ 2a0b660 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA384_Update
+ 2a0b668 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA512_Final
+ 2a0b670 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA512_Init
+ 2a0b678 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_SHA512_Update
+ 2a0b680 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_internal_ECDSA_sign
+ 2a0b688 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_internal_ECDSA_verify
+ 2a0b690 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_internal_ERR_error_string_n
+ 2a0b698 D crypto/internal/boring._cgo_71ae3cd1ca33_Cfunc__goboringcrypto_internal_ERR_get_error
+```
+
+In addition, LabKit contains routines to [check whether FIPS is enabled](https://gitlab.com/gitlab-org/labkit/-/tree/master/fips).
+
+## How FIPS builds are created
+
+Many GitLab projects (for example: Gitaly, GitLab Pages) have
+standardized on using `FIPS_MODE=1 make` to build FIPS binaries locally.
+
+### Omnibus
+
+The Omnibus FIPS builds are triggered with the `USE_SYSTEM_SSL`
+environment variable set to `true`. When this environment variable is
+set, the Omnibus recipes dependencies such as `curl`, NGINX, and libgit2
+will link against the system OpenSSL. OpenSSL will NOT be included in
+the Omnibus build.
+
+The Omnibus builds are created using container images [that use the `golang-fips` compiler](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/blob/master/docker/snippets/go_fips). For
+example, [this job](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/jobs/2363742108) created
+the `registry.gitlab.com/gitlab-org/gitlab-omnibus-builder/centos_8_fips:3.3.1` image used to
+build packages for RHEL 8.
+
+#### Add a new FIPS build for another Linux distribution
+
+First, you need to make sure there is an Omnibus builder image for the
+desired Linux distribution. The images used to build Omnibus packages are
+created with [Omnibus Builder images](https://gitlab.com/gitlab-org/gitlab-omnibus-builder).
+
+Review [this merge request](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/merge_requests/218). A
+new image can be added by:
+
+1. Adding CI jobs with the `_fips` suffix (for example: `ubuntu_18.04_fips`).
+1. Making sure the `Dockerfile` uses `Snippets.new(fips: fips).populate` instead of `Snippets.new.populate`.
+
+After this image has been tagged, add a new [CI job to Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/-/blob/911fbaccc08398dfc4779be003ea18014b3e30e9/gitlab-ci-config/dev-gitlab-org.yml#L594-602).
+
+### Cloud Native GitLab (CNG)
+
+The Cloud Native GitLab CI pipeline generates images using several base images:
+
+- Debian
+- [Red Hat's Universal Base Image (UBI)](https://developers.redhat.com/products/rhel/ubi)
+
+UBI images ship with the same OpenSSL package as those used by
+RHEL. This makes it possible to build FIPS-compliant binaries without
+needing RHEL. Note that RHEL 8.2 ships a [FIPS-validated OpenSSL](https://access.redhat.com/articles/2918071), but 8.5 is in
+review for FIPS validation.
+
+[This merge request](https://gitlab.com/gitlab-org/build/CNG/-/merge_requests/981)
+introduces a FIPS pipeline for CNG images. Images tagged for FIPS have the `-fips` suffix. For example,
+the `webservice` container has the following tags:
+
+- `master`
+- `master-ubi8`
+- `master-fips`
diff --git a/doc/development/foreign_keys.md b/doc/development/foreign_keys.md
index db8367fe5f5..c20c70623ae 100644
--- a/doc/development/foreign_keys.md
+++ b/doc/development/foreign_keys.md
@@ -123,3 +123,7 @@ class UserConfig < ActiveRecord::Base
belongs_to :user
end
```
+
+Using a foreign key as primary key saves space but can make
+[batch counting](service_ping/implement.md#batch-counters) in [Service Ping](service_ping/index.md) less efficient.
+Consider using a regular `id` column if the table will be relevant for Service Ping.
diff --git a/doc/development/geo.md b/doc/development/geo.md
index f37901754aa..f62b2de30db 100644
--- a/doc/development/geo.md
+++ b/doc/development/geo.md
@@ -97,7 +97,7 @@ 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 panel](../user/admin_area/geo_nodes.md).
+ [Geo Admin Area](../user/admin_area/geo_nodes.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
@@ -118,17 +118,6 @@ 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.
-#### File Download Dispatch worker
-
-Also similar to the [Repository Sync worker](#repository-sync-worker),
-there is a `Geo::FileDownloadDispatchWorker` class that is run
-periodically to sync all uploads that aren't synced to the Geo
-**secondary** site yet.
-
-Files are copied via HTTP(s) and initiated via the
-`/api/v4/geo/transfers/:type/:id` endpoint,
-for example, `/api/v4/geo/transfers/lfs/123`.
-
## Authentication
To authenticate file transfers, each `GeoNode` record has two fields:
@@ -212,7 +201,7 @@ rails g geo_migration [args] [options]
To migrate the tracking database, run:
```shell
-bundle exec rake geo:db:migrate
+bundle exec rake db:migrate:geo
```
## Finders
@@ -259,7 +248,7 @@ 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 panel](../user/admin_area/geo_nodes.md).
+and the administrator can see this in the [Geo Admin Area](../user/admin_area/geo_nodes.md).
## Glossary
diff --git a/doc/development/geo/framework.md b/doc/development/geo/framework.md
index 778387986d8..055c2cd4ea8 100644
--- a/doc/development/geo/framework.md
+++ b/doc/development/geo/framework.md
@@ -93,12 +93,6 @@ module Geo
def self.model
::Packages::PackageFile
end
-
- # The feature flag follows the format `geo_#{replicable_name}_replication`,
- # so here it would be `geo_package_file_replication`
- def self.replication_enabled_by_default?
- false
- end
end
end
```
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index 275e9421983..0743a03ddac 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -63,8 +63,7 @@ in
This should make it easier to contribute for developers who are less
comfortable writing Go code.
-There is documentation for this approach in [the Gitaly
-repository](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/ruby_endpoint.md).
+For more information, see the [Beginner's guide to Gitaly contributions](https://gitlab.com/gitlab-org/gitaly/-/blob/master/doc/beginners_guide.md).
## Gitaly-Related Test Failures
@@ -372,3 +371,20 @@ the integration by using GDK:
```shell
curl --silent "http://localhost:9236/metrics" | grep go_find_all_tags
```
+
+## Using Praefect in test
+
+By default Praefect in test uses an in-memory election strategy. This strategy
+is deprecated and no longer used in production. It mainly is kept for
+unit-testing purposes.
+
+A more modern election strategy requires a connection with a PostgreSQL
+database. This behavior is disabled by default when running tests, but you can
+enable it by setting `GITALY_PRAEFECT_WITH_DB=1` in your environment.
+
+This requires you have PostgreSQL running, and you have the database created.
+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`
diff --git a/doc/development/gitlab_flavored_markdown/index.md b/doc/development/gitlab_flavored_markdown/index.md
index 682d8011cd8..7f7781cbc62 100644
--- a/doc/development/gitlab_flavored_markdown/index.md
+++ b/doc/development/gitlab_flavored_markdown/index.md
@@ -4,13 +4,13 @@ group: Editor
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Markdown developer documentation **(FREE)**
+# GitLab Flavored Markdown (GLFM) developer documentation **(FREE)**
-This page contains the MVC for the developer documentation for GitLab Flavored Markdown.
+This page contains the MVC for the developer documentation for GitLab Flavored Markdown (GLFM).
For the user documentation about Markdown in GitLab, refer to
[GitLab Flavored Markdown](../../user/markdown.md).
-## GitLab Flavored Markdown specification guide
+## GitLab Flavored Markdown (GLFM) specification guide
The [specification guide](specification_guide/index.md) includes:
@@ -18,3 +18,4 @@ The [specification guide](specification_guide/index.md) includes:
- [Parsing and rendering](specification_guide/index.md#parsing-and-rendering).
- [Goals](specification_guide/index.md#goals).
- [Implementation](specification_guide/index.md#implementation) of the spec.
+- [Workflows](specification_guide/index.md#workflows).
diff --git a/doc/development/gitlab_flavored_markdown/specification_guide/index.md b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
index 021f7bafce9..397d555c54f 100644
--- a/doc/development/gitlab_flavored_markdown/specification_guide/index.md
+++ b/doc/development/gitlab_flavored_markdown/specification_guide/index.md
@@ -64,7 +64,7 @@ serve as input to automated conformance tests. It is
[explained in the CommonMark specification](https://spec.commonmark.org/0.30/#about-this-document):
> This document attempts to specify Markdown syntax unambiguously. It contains many
-> examples with side-by-side Markdown and HTML. These are intended to double as conformance tests.
+> examples with side-by-side Markdown and HTML. These examples are intended to double as conformance tests.
The HTML-rendered versions of the specifications:
@@ -385,20 +385,61 @@ subgraph output:<br/>GLFM specification files
end
```
+#### `canonicalize-html.rb` script
+
+The `scripts/glfm/canonicalize-html.rb` handles the
+["canonicalization" of HTML](#canonicalization-of-html). It is a pipe-through
+helper script which takes as input a static or WYSIWYG HTML string containing
+extra HTML, and outputs a canonical HTML string.
+
+It is implemented as a standalone, modular, single-purpose script, based on the
+[Unix philosophy](https://en.wikipedia.org/wiki/Unix_philosophy#:~:text=The%20Unix%20philosophy%20emphasizes%20building,developers%20other%20than%20its%20creators.).
+It's easy to use when running the standard CommonMark `spec_tests.py`
+script, which expects canonical HTML, against the GitLab renderer implementations.
+
+#### `run-spec-tests.sh` script
+
+`scripts/glfm/run-spec-tests.sh` is a convenience shell script which runs
+conformance specs via the CommonMark standard `spec_tests.py` script,
+which uses the `glfm_specification/output/spec.txt` file and `scripts/glfm/canonicalize-html.rb`
+helper script to test the GLFM renderer implementations' support for rendering Markdown
+specification examples to canonical HTML.
+
+```mermaid
+graph LR
+subgraph scripts:
+ A{run-spec-tests.sh} --> C
+ subgraph specification testing process
+ B[canonicalize-html.sh] --> C
+ C[spec_tests.py]
+ end
+end
+subgraph input
+ D[spec.txt GLFM specification] --> C
+ E((GLFM static<br/>renderer implementation)) --> B
+ F((GLFM WYSIWYG<br/>renderer implementation)) --> B
+end
+subgraph output:<br/>test results/output
+ C --> G[spec_tests.py output]
+end
+```
+
#### `update-example-snapshots.rb` script
-The `scripts/glfm/update-example-snapshots.rb` script uses input specification
-files to update example snapshots:
+The `scripts/glfm/update-example-snapshots.rb` script uses the GLFM
+`glfm_specification/output/spec.txt` specification file and the
+`glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml`
+file to create and update the [example snapshot](#example-snapshot-files)
+YAML files:
```mermaid
graph LR
subgraph script:
A{update-example-snapshots.rb}
end
-subgraph input:<br/>input specification files
- B[downloaded gfm_spec_v_0.29.txt] --> A
- C[glfm_canonical_examples.txt] --> A
- D[glfm_example_status.yml] --> A
+subgraph input:<br/>input specification file
+ B[spec.txt] --> A
+ C[glfm_example_status.yml] --> A
end
subgraph output:<br/>example snapshot files
A --> E[examples_index.yml]
@@ -435,9 +476,11 @@ code. It contains only shell scripting commands for the relevant
```mermaid
graph LR
+subgraph tests:
+ B[relevant rspec+jest test files]
+end
subgraph script:
- A{run-snapshopt-tests.sh} --> B
- B[relevant rspec/jest test files]
+ A{run-snapshopt-tests.sh} -->|invokes| B
end
subgraph input:<br/>YAML
C[examples_index.yml] --> B
@@ -446,46 +489,7 @@ subgraph input:<br/>YAML
F[prosemirror_json.yml] --> B
end
subgraph output:<br/>test results/output
- B --> G[rspec/jest output]
-end
-```
-
-#### `canonicalize-html.rb` script
-
-The `scripts/glfm/canonicalize-html.rb` handles the
-["canonicalization" of HTML](#canonicalization-of-html). It is a pipe-through
-helper script which takes as input a static or WYSIWYG HTML string containing
-extra HTML, and outputs a canonical HTML string.
-
-It is implemented as a standalone, modular, single-purpose script, based on the
-[Unix philosophy](https://en.wikipedia.org/wiki/Unix_philosophy#:~:text=The%20Unix%20philosophy%20emphasizes%20building,developers%20other%20than%20its%20creators.).
-It's easy to use when running the standard CommonMark `spec_tests.py`
-script, which expects canonical HTML, against the GitLab renderer implementations.
-
-#### `run-spec-tests.sh` script
-
-`scripts/glfm/run-spec-tests.sh` is a convenience shell script which runs
-conformance specs via the CommonMark standard `spec_tests.py` script,
-which uses the `glfm_specification/output/spec.txt` file and `scripts/glfm/canonicalize-html.rb`
-helper script to test the GLFM renderer implementations' support for rendering Markdown
-specification examples to canonical HTML.
-
-```mermaid
-graph LR
-subgraph scripts:
- A{run-spec-tests.sh} --> C
- subgraph specification testing process
- B[canonicalize-html.sh] --> C
- C[spec_tests.py]
- end
-end
-subgraph input
- D[spec.txt GLFM specification] --> C
- E((GLFM static<br/>renderer implementation)) --> B
- F((GLFM WYSIWYG<br/>renderer implementation)) --> B
-end
-subgraph output:<br/>test results/output
- C --> G[spec_tests.py output]
+ B --> H[rspec+jest output]
end
```
@@ -506,21 +510,76 @@ They are either downloaded, as in the case of the
GFM `spec.txt` file, or manually
updated, as in the case of all GFM files.
-- `glfm_specification/input/github_flavored_markdown/gfm_spec_v_0.29.txt` -
- official latest [GFM spec.txt](https://github.com/github/cmark-gfm/blob/master/test/spec.txt),
- automatically downloaded and updated by `update-specification.rb` script.
-- `glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt` -
- Manually updated text of intro section for generated GLFM `spec.txt`.
- - Replaces GFM version of introductory
- section in `spec.txt`.
-- `glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt` -
- Manually updated canonical Markdown+HTML examples for GLFM extensions.
- - Standard backtick-delimited `spec.txt` examples format with Markdown + canonical HTML.
- - Inserted as a new section before the appendix of generated `spec.txt`.
-- `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` -
- Manually updated status of automatic generation of files based on Markdown
- examples.
- - Allows example snapshot generation, Markdown conformance tests, or
+##### GitHub Flavored Markdown specification
+
+[`glfm_specification/input/github_flavored_markdown/gfm_spec_v_0.29.txt`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/input/github_flavored_markdown/gfm_spec_v_0.29.txt)
+is the official latest [GFM `spec.txt`](https://github.com/github/cmark-gfm/blob/master/test/spec.txt).
+
+- It is automatically downloaded and updated by `update-specification.rb` script.
+- When it is downloaded, the version number is added to the filename.
+
+##### `glfm_intro.txt`
+
+[`glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt)
+is the GitLab-specific version of the prose in the introduction section of the GLFM specification.
+
+- It is manually updated.
+- The `update-specification.rb` script inserts it into the generated GLFM `spec.txt` to replace
+ the GitHub-specific GFM version of the introductory section.
+
+##### `glfm_canonical_examples.txt`
+
+[`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt)
+is the manually updated canonical Markdown+HTML examples for GLFM extensions.
+
+- It contains examples in the [standard backtick-delimited `spec.txt` format](#various-markdown-specifications),
+ each of which contain a Markdown example and the corresponding canonical HTML.
+- The `update-specification.rb` script inserts it as new sections before the appendix
+ of generated `spec.txt`.
+- It should consist of `H1` header sections, with all examples nested exactly 2 levels deep within `H2`
+ header sections.
+
+`glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt` sample entries:
+
+NOTE:
+All lines in this example are prefixed with a `|` character. This prefix helps avoid false
+errors when this file is checked by `markdownlint`, and possible errors in other Markdown editors.
+The actual file should not have these prefixed `|` characters.
+
+```plaintext
+|# First GitLab-Specific Section with Examples
+|
+|## Strong but with two asterisks
+|
+|```````````````````````````````` example
+|**bold**
+|.
+|<p><strong>bold</strong></p>
+|````````````````````````````````
+|
+|# Second GitLab-Specific Section with Examples
+|
+|## Strong but with HTML
+|
+|```````````````````````````````` example
+|<strong>
+|bold
+|</strong>
+|.
+|<p><strong>
+|bold
+|</strong></p>
+|````````````````````````````````
+```
+
+##### `glfm_example_status.yml`
+
+[`glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml)
+controls the behavior of the [scripts](#scripts) and [tests](#types-of-markdown-tests-driven-by-the-glfm-specification).
+
+- It is manually updated.
+- It controls the status of automatic generation of files based on Markdown examples.
+- It allows example snapshot generation, Markdown conformance tests, or
Markdown snapshot tests to be skipped for individual examples. For example, if
they are unimplemented, broken, or cannot be tested for some reason.
@@ -528,12 +587,14 @@ updated, as in the case of all GFM files.
```yaml
07_99_an_example_with_incomplete_wysiwyg_implementation_1:
- skip_update_example_snapshots: true
- skip_running_snapshot_static_html_tests: false
- skip_running_snapshot_wysiwyg_html_tests: true
- skip_running_snapshot_prosemirror_json_tests: true
+ skip_update_example_snapshots: false
+ skip_update_example_snapshot_html_static: false
+ skip_update_example_snapshot_html_wysiwyg: false
skip_running_conformance_static_tests: false
- skip_running_conformance_wysiwyg_tests: true
+ skip_running_conformance_wysiwyg_tests: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
```
#### Output specification files
@@ -541,28 +602,39 @@ updated, as in the case of all GFM files.
The `glfm_specification/output` directory contains the CommonMark standard format
`spec.txt` file which represents the canonical GLFM specification which is generated
by the `update-specification.rb` script. It also contains the rendered `spec.html`
-and `spec.pdf` which are generated from with the `spec.txt` as input.
-
-- `glfm_specification/output/spec.txt` - A Markdown file, in the standard format
- with prose and Markdown + canonical HTML examples, generated (or updated) by the
- `update-specification.rb` script.
-- `glfm_specification/output/spec.html` - An HTML file, rendered based on `spec.txt`,
- also generated (or updated) by the `update-specification.rb` script at the same time as
- `spec.txt`. It corresponds to the HTML-rendered versions of the
- "GitHub Flavored Markdown" (<abbr title="GitHub Flavored Markdown">GFM</abbr>)
- [specification](https://github.github.com/gfm/)
- and the [CommonMark specification](https://spec.commonmark.org/0.30/).
-
-These output `spec.**` files, which represent the official, canonical GLFM specification
+which is generated based on the `spec.txt` as input.
+
+These output `spec.*` files, which represent the official, canonical GLFM specification,
are colocated under the same parent folder `glfm_specification` with the other
`input` specification files. They're located here both for convenience, and because they are all
-a mix of manually edited and generated files. In GFM,
-`spec.txt` is [located in the test dir](https://github.com/github/cmark-gfm/blob/master/test/spec.txt),
-and in CommonMark it's located
-[in the project root](https://github.com/github/cmark-gfm/blob/master/test/spec.txt).
-No precedent exists for a standard location. In the future, we may decide to
+a mix of manually edited and generated files.
+
+In GFM, `spec.txt` is [located in the test dir](https://github.com/github/cmark-gfm/blob/master/test/spec.txt),
+and in CommonMark it's located [in the project root](https://github.com/github/cmark-gfm/blob/master/test/spec.txt). No precedent exists for a standard location. In the future, we may decide to
move or copy a hosted version of the rendered HTML `spec.html` version to another location or site.
+##### spec.txt
+
+[`glfm_specification/output/spec.txt`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output/spec.txt)
+is a Markdown specification file, in the standard format
+with prose and Markdown + canonical HTML examples. It is generated or updated by the
+`update-specification.rb` script.
+
+It also serves as input for other scripts such as `update-example-snapshots.rb`
+and `run-spec-tests.sh`.
+
+##### spec.html
+
+[`glfm_specification/output/spec.html`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/glfm_specification/output/spec.html)
+is an HTML file, rendered based on `spec.txt`. It is
+also generated (or updated) by the `update-specification.rb` script at the same time as
+`spec.txt`.
+
+It corresponds to the HTML-rendered versions of the
+"GitHub Flavored Markdown" (<abbr title="GitHub Flavored Markdown">GFM</abbr>)
+[specification](https://github.github.com/gfm/)
+and the [CommonMark specification](https://spec.commonmark.org/0.30/).
+
### Example snapshot files
The `example_snapshots` directory contains files which are generated by the
@@ -574,12 +646,13 @@ After the entire GLFM implementation is complete for both backend (Ruby) and
frontend (JavaScript), all of these YAML files can be automatically generated.
However, while the implementations are still in progress, the `skip_update_example_snapshots`
key in `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml`
-can be used to disable automatic generation of some examples, and they can instead
+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`
-`spec/fixtures/glfm/example_snapshots/examples_index.yml` is the main list of all
+[`spec/fixtures/glfm/example_snapshots/examples_index.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/spec/fixtures/glfm/example_snapshots/examples_index.yml)
+is the main list of all
CommonMark, GFM, and GLFM example names, each with a unique canonical name.
- It is generated from the hierarchical sections and examples in the
@@ -590,10 +663,15 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
the additional Section 7 in the GLFM `spec.txt`.
- It also contains extra metadata about each example, such as:
1. `spec_txt_example_position` - The position of the example in the generated GLFM `spec.txt` file.
+ - This value is the index order of each individual Markdown + HTML5 example in the file. It is _not_
+ the line number in the file.
+ - This value can be used to locate the example in the rendered `spec.html` file, because the standard
+ CommonMark tooling includes the index number for each example in the rendered HTML file.
+ For example: [https://spec.commonmark.org/0.30/#example-42](https://spec.commonmark.org/0.30/#example-42)
1. `source_specification` - Which specification the example originally came from:
`commonmark`, `github`, or `gitlab`.
- The naming convention for example entry names is based on nested header section
- names and example index within the header.
+ names and example index in the header.
- This naming convention should result in fairly stable names and example positions.
The CommonMark / GLFM specification rarely changes, and most GLFM
examples where multiple examples exist for the same Section 7 subsection are
@@ -621,7 +699,7 @@ CommonMark, GFM, and GLFM example names, each with a unique canonical name.
#### `spec/fixtures/glfm/example_snapshots/markdown.yml`
-`spec/fixtures/glfm/example_snapshots/markdown.yml` contains the original Markdown
+[`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`
- For CommonMark and GFM Markdown,
@@ -634,14 +712,14 @@ for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
`spec/fixtures/glfm/example_snapshots/markdown.yml` sample entry:
```yaml
-06_04_inlines_emphasis_and_strong_emphasis_1: |-
+06_04_inlines_emphasis_and_strong_emphasis_1: |
*foo bar*
```
#### `spec/fixtures/glfm/example_snapshots/html.yml`
-`spec/fixtures/glfm/example_snapshots/html.yml` contains the HTML for each entry in
-`spec/fixtures/glfm/example_snapshots/examples_index.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`
Three types of entries exist, with different HTML for each:
@@ -670,11 +748,11 @@ Any exceptions or failures which occur when generating HTML are replaced with an
```yaml
06_04_inlines_emphasis_and_strong_emphasis_1:
- canonical: |-
+ canonical: |
<p><em>foo bar</em></p>
- static: |-
+ static: |
<p data-sourcepos="1:1-1:9" dir="auto"><strong>foo bar</strong></p>
- wysiwyg: |-
+ wysiwyg: |
<p><strong>foo bar</strong></p>
```
@@ -684,8 +762,8 @@ depending on how the implementations evolve.
#### `spec/fixtures/glfm/example_snapshots/prosemirror_json.yml`
-`spec/fixtures/glfm/example_snapshots/prosemirror_json.yml` contains the ProseMirror
-JSON for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.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`
- 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.
@@ -715,3 +793,28 @@ JSON for each entry in `spec/fixtures/glfm/example_snapshots/examples_index.yml`
]
}
```
+
+## Workflows
+
+This section describes how the scripts can be used to manage the GLFM specification and tests.
+
+### Update the GLFM specification and run conformance tests
+
+1. Run [`update-specification.rb`](#update-specificationrb-script) to update the GLFM specification [output specification files](#output-specification-files).
+1. Visually inspect and confirm any resulting changes to the [output specification files](#output-specification-files).
+1. Run [`run-spec-tests.sh`](http://gdk.test:3005/ee/development/gitlab_flavored_markdown/specification_guide/index.html#run-spec-testssh-script) to run the conformance tests against the canonicalized GLFM specification.
+1. Commit any changes to the [output specification files](#output-specification-files).
+
+### Update the example snapshots and run snapshot tests
+
+1. If you are working on an in-progress feature or bug, make any necessary manual updates to the [input specification files](#input-specification-files). This may include:
+ 1. Updating the canonical Markdown or HTML examples in `glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt`.
+ 1. Updating `glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml` to reflect the current status of the examples or tests.
+1. Run [`update-specification.rb`](#update-specificationrb-script) to update the `spec.txt` to reflect any changes which were made to the [input specification files](#input-specification-files).
+1. Visually inspect and confirm any resulting changes to the [output specification files](#output-specification-files).
+1. Run [`update-example-snapshots.rb`](#update-example-snapshotsrb-script) to update the [example snapshot files](#example-snapshot-files).
+1. Visually inspect and confirm any resulting changes to the [example snapshot files](#example-snapshot-files).
+1. Run [`run-snapshot-tests.sh`](#run-snapshot-testssh-script) as a convenience script to run all relevant frontend (RSpec) and backend (Jest) tests which use the example snapshots.
+ 1. Any frontend or backend snapshot test may also be run individually.
+ 1. All frontend and backend tests are also run as part of the continuous integration suite, as they normally are.
+1. Commit any changes to the [input specification files](#input-specification-files), [output specification files](#output-specification-files), or [example snapshot files](#example-snapshot-files).
diff --git a/doc/development/go_guide/dependencies.md b/doc/development/go_guide/dependencies.md
index 8aa8f286edc..0c2ce4f2b48 100644
--- a/doc/development/go_guide/dependencies.md
+++ b/doc/development/go_guide/dependencies.md
@@ -102,7 +102,7 @@ malicious party without causing build failures.
Go 1.12+ can be configured to use a checksum database. If configured to do so,
when Go fetches a dependency and there is no corresponding entry in `go.sum`, Go
-queries the configured checksum database(s) for the checksum of the
+queries the configured checksum databases for the checksum of the
dependency instead of calculating it from the downloaded dependency. If the
dependency cannot be found in the checksum database, the build fails. If the
downloaded dependency's checksum does not match the result from the checksum
diff --git a/doc/development/go_guide/go_upgrade.md b/doc/development/go_guide/go_upgrade.md
index 3267d1262f0..4e2a0d95910 100644
--- a/doc/development/go_guide/go_upgrade.md
+++ b/doc/development/go_guide/go_upgrade.md
@@ -158,7 +158,7 @@ if you need help finding the correct person or labels:
| GitLab Quality Images | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-build-images/-/issues) |
| GitLab Shell | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab-shell/-/issues) |
| GitLab Workhorse | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
-| Labkit | [Issue Tracker](https://gitlab.com/gitlab-org/labkit/-/issues) |
+| LabKit | [Issue Tracker](https://gitlab.com/gitlab-org/labkit/-/issues) |
| [Node Exporter](https://github.com/prometheus/node_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
| [PgBouncer Exporter](https://github.com/prometheus-community/pgbouncer_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
| [Postgres Exporter](https://github.com/prometheus-community/postgres_exporter) | [Issue Tracker](https://gitlab.com/gitlab-org/gitlab/-/issues) |
diff --git a/doc/development/index.md b/doc/development/index.md
index 5c0cc7f9718..3d5ec24d3e2 100644
--- a/doc/development/index.md
+++ b/doc/development/index.md
@@ -21,7 +21,7 @@ For information on using GitLab to work on your own software projects, see the
For information on working with the GitLab APIs, see the [API documentation](../api/index.md).
For information about how to install, configure, update, and upgrade your own
-GitLab instance, see the [administration documentation](../administration/index.md).
+GitLab instance, see the [Administrator documentation](../administration/index.md).
## Get started
@@ -144,7 +144,7 @@ In these cases, use the following workflow:
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.
diff --git a/doc/development/integrations/index.md b/doc/development/integrations/index.md
index 34ac307c98a..e595fea6d96 100644
--- a/doc/development/integrations/index.md
+++ b/doc/development/integrations/index.md
@@ -134,7 +134,7 @@ By default, the integration form provides:
- Checkboxes for each of the trigger events returned from `Integration#configurable_events`.
You can also add help text at the top of the form by either overriding `Integration#help`,
-or providing a template in `app/views/projects/services/$INTEGRATION_NAME/_help.html.haml`.
+or providing a template in `app/views/shared/integrations/$INTEGRATION_NAME/_help.html.haml`.
To add your custom properties to the form, you can define the metadata for them in `Integration#fields`.
@@ -275,7 +275,7 @@ as described above in [Customize the frontend form](#customize-the-frontend-form
our [usability guidelines](https://design.gitlab.com/usability/helping-users) for help text.
For more detailed documentation, provide a page in `doc/user/project/integrations`,
-and link it from the [Integrations overview](../../user/project/integrations/overview.md).
+and link it from the [Integrations overview](../../user/project/integrations/index.md).
You can also refer to our general [documentation guidelines](../documentation/index.md).
diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md
index 5f7cccdab64..0f4fa1a97a8 100644
--- a/doc/development/integrations/secure.md
+++ b/doc/development/integrations/secure.md
@@ -290,9 +290,6 @@ useful when debugging. The default value for `SECURE_LOG_LEVEL` should be set
to `info`.
When executing command lines, scanners should use the `debug` level to log the command line and its output.
-For instance, the [bundler-audit](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit) scanner
-uses the `debug` level to log the command line `bundle audit check --quiet`,
-and what `bundle audit` writes to the standard output.
If the command line fails, then it should be logged with the `error` log level;
this makes it possible to debug the problem without having to change the log level to `debug` and rerun the scanning job.
@@ -679,7 +676,7 @@ The confidence ranges from `Low` to `Confirmed`, but it can also be `Unknown`,
Valid values are: `Ignore`, `Unknown`, `Experimental`, `Low`, `Medium`, `High`, or `Confirmed`
`Unknown` values means that data is unavailable to determine it's actual value. Therefore, it may be `high`, `medium`, or `low`,
-and needs to be investigated. We have [provided a chart](../../user/application_security/sast/analyzers.md#analyzers-data)
+and needs to be investigated. We have [provided a chart](../../user/application_security/sast/analyzers.md#data-provided-by-analyzers)
of the available SAST Analyzers and what data is currently available.
#### Remediations
diff --git a/doc/development/internal_api/index.md b/doc/development/internal_api/index.md
index cdbc674e0a5..dca71413564 100644
--- a/doc/development/internal_api/index.md
+++ b/doc/development/internal_api/index.md
@@ -478,28 +478,6 @@ curl --request POST --header "Gitlab-Kas-Api-Request: <JWT token>" --header "Con
--data '{"gitops_sync_count":1}' "http://localhost:3000/api/v4/internal/kubernetes/usage_metrics"
```
-### GitLab agent alert metrics
-
-Called from GitLab agent server (KAS) to save alerts derived from Cilium on Kubernetes
-Cluster.
-
-| Attribute | Type | Required | Description |
-|:----------|:-------|:---------|:------------|
-| `alert` | Hash | yes | Alerts detail. Same format as [3rd party alert](../../operations/incident_management/integrations.md#customize-the-alert-payload-outside-of-gitlab). |
-
-```plaintext
-POST internal/kubernetes/modules/cilium_alert
-```
-
-Example Request:
-
-```shell
-curl --request POST --header "Gitlab-Kas-Api-Request: <JWT token>" \
- --header "Authorization: Bearer <agent token>" --header "Content-Type: application/json" \
- --data '"{\"alert\":{\"title\":\"minimal\",\"message\":\"network problem\",\"evalMatches\":[{\"value\":1,\"metric\":\"Count\",\"tags\":{}}]}}"' \
- "http://localhost:3000/api/v4/internal/kubernetes/modules/cilium_alert"
-```
-
### Create Starboard vulnerability
Called from the GitLab agent server (`kas`) to create a security vulnerability
diff --git a/doc/development/kubernetes.md b/doc/development/kubernetes.md
index a6d9c754838..ee261769d82 100644
--- a/doc/development/kubernetes.md
+++ b/doc/development/kubernetes.md
@@ -54,7 +54,7 @@ webserver, and can lead to a denial-of-service (DoS) attack in GitLab as
the Kubernetes cluster response times are outside of our control.
The easiest way to ensure your calls happen a background process is to
-delegate any such work to happen in a [Sidekiq worker](sidekiq_style_guide.md).
+delegate any such work to happen in a [Sidekiq worker](sidekiq/index.md).
You may want to make calls to Kubernetes and return the response, but a background
worker isn't a good fit. Consider using
diff --git a/doc/development/maintenance_mode.md b/doc/development/maintenance_mode.md
index c2fd4bab605..a118d9cf0ad 100644
--- a/doc/development/maintenance_mode.md
+++ b/doc/development/maintenance_mode.md
@@ -11,8 +11,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab Maintenance Mode **only** blocks writes from HTTP and SSH requests at the application level in a few key places within the rails application.
[Search the codebase for `maintenance_mode?`.](https://gitlab.com/search?search=maintenance_mode%3F&group_id=9970&project_id=278964&scope=blobs&search_code=false&snippets=false&repository_ref=)
-- [the read-only database method](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/database.rb#L13), which toggles special behavior when we are not allowed to write to the database. [Search the codebase for `Gitlab::Database.read_only?`.](https://gitlab.com/search?search=Gitlab%3A%3ADatabase.read_only%3F&group_id=9970&project_id=278964&scope=blobs&search_code=false&snippets=false&repository_ref=)
-- [the read-only middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/middleware/read_only/controller.rb), where HTTP requests that cause database writes are blocked, unless explicitly allowed.
+- [the read-only database method](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/database.rb#L13), which toggles special behavior when we are not allowed to write to the database. We use this method for possible places where writes could occur in GET requests. [Search the codebase for `Gitlab::Database.read_only?`.](https://gitlab.com/search?search=Gitlab%3A%3ADatabase.read_only%3F&group_id=9970&project_id=278964&scope=blobs&search_code=false&snippets=false&repository_ref=)
+- [the read-only middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/ee/gitlab/middleware/read_only/controller.rb), where HTTP requests that cause database writes are blocked, unless explicitly allowed (for example, GET requests).
- [Git push access via SSH is denied](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/lib/ee/gitlab/git_access.rb#L13) by returning 401 when `gitlab-shell` POSTs to [`/internal/allowed`](internal_api/index.md) to [check if access is allowed](internal_api/index.md#git-authentication).
- [Container registry authentication service](https://gitlab.com/gitlab-org/gitlab/-/blob/2425e9de50c678413ceaad6ee3bf66f42b7e228c/ee/app/services/ee/auth/container_registry_authentication_service.rb#L12), where updates to the container registry are blocked.
diff --git a/doc/development/merge_request_application_and_rate_limit_guidelines.md b/doc/development/merge_request_application_and_rate_limit_guidelines.md
index 94ae126802a..62bf62f6275 100644
--- a/doc/development/merge_request_application_and_rate_limit_guidelines.md
+++ b/doc/development/merge_request_application_and_rate_limit_guidelines.md
@@ -14,7 +14,7 @@ Every new feature should have safe usage limits included in its implementation.
Limits are applicable for:
- System-level resource pools such as API requests, SSHD connections, database connections, storage, and so on.
-- Domain-level objects such as CI minutes, groups, sign-in attempts, and so on.
+- Domain-level objects such as CI/CD minutes, groups, sign-in attempts, and so on.
## When limits are required
diff --git a/doc/development/merge_request_performance_guidelines.md b/doc/development/merge_request_performance_guidelines.md
index fe8e730d64e..5e7fe9cc8fb 100644
--- a/doc/development/merge_request_performance_guidelines.md
+++ b/doc/development/merge_request_performance_guidelines.md
@@ -206,7 +206,7 @@ By default, this `Gitlab::SQL::CTE` class forces materialization through adding
(this behavior is implemented using a custom Arel node `Gitlab::Database::AsWithMaterialized` under the surface).
WARNING:
-We plan to drop the support for PostgreSQL 11. Upgrading to GitLab 14.0 requires PostgreSQL 12 or higher.
+Upgrading to GitLab 14.0 requires PostgreSQL 12 or higher.
## Cached Queries
@@ -526,7 +526,7 @@ end
The usage of shared temporary storage is required if your intent
is to persistent file for a disk-based storage, and not Object Storage.
-[Workhorse direct_upload](uploads/implementation.md#direct-upload) when accepting file
+[Workhorse direct_upload](uploads/index.md#direct-upload) when accepting file
can write it to shared storage, and later GitLab Rails can perform a move operation.
The move operation on the same destination is instantaneous.
The system instead of performing `copy` operation just re-attaches file into a new place.
@@ -550,7 +550,7 @@ that implements a seamless support for Shared and Object Storage-based persisten
#### Data access
Each feature that accepts data uploads or allows to download them needs to use
-[Workhorse direct_upload](uploads/implementation.md#direct-upload). It means that uploads needs to be
+[Workhorse direct_upload](uploads/index.md#direct-upload). It means that uploads needs to be
saved directly to Object Storage by Workhorse, and all downloads needs to be served
by Workhorse.
@@ -562,5 +562,5 @@ can time out, which is especially problematic for slow clients. If clients take
to upload/download the processing slot might be killed due to request processing
timeout (usually between 30s-60s).
-For the above reasons it is required that [Workhorse direct_upload](uploads/implementation.md#direct-upload) is implemented
+For the above reasons it is required that [Workhorse direct_upload](uploads/index.md#direct-upload) is implemented
for all file uploads and downloads.
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 086e061452b..aebecd90574 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -110,6 +110,11 @@ table, that column is added at the bottom. Please do not reorder
columns manually for existing tables as this causes confusion to
other people using `db/structure.sql` generated by Rails.
+NOTE:
+[Creating an index asynchronously requires two merge requests.](adding_database_indexes.md#add-a-migration-to-create-the-index-synchronously)
+When done, commit the schema change in the merge request
+that adds the index with `add_concurrent_index`.
+
When your local database in your GDK is diverging from the schema from
`main` it might be hard to cleanly commit the schema changes to
Git. In that case you can use the `scripts/regenerate-schema` script to
@@ -127,6 +132,24 @@ scripts/regenerate-schema
TARGET=12-9-stable-ee scripts/regenerate-schema
```
+The `scripts/regenerate-schema` script can create additional differences.
+If this happens, use a manual procedure where `<migration ID>` is the `DATETIME`
+part of the migration file.
+
+```shell
+# Rebase against master
+git rebase master
+
+# Rollback changes
+VERSION=<migration ID> bundle exec rails db:rollback:main
+
+# Checkout db/structure.sql from master
+git checkout origin/master db/structure.sql
+
+# Migrate changes
+VERSION=<migration ID> bundle exec rails db:migrate:main
+```
+
## Avoiding downtime
The document ["Avoiding downtime in migrations"](database/avoiding_downtime_in_migrations.md) specifies
@@ -487,7 +510,7 @@ end
### When to use the helper method
You can **only** use the `with_lock_retries` helper method when the execution is not already inside
-an open transaction (using Postgres subtransactions is discouraged). It can be used with
+an open transaction (using PostgreSQL subtransactions is discouraged). It can be used with
standard Rails migration helper methods. Calling more than one migration
helper is not a problem if they're executed on the same table.
@@ -602,7 +625,7 @@ end
```
You must explicitly name indexes that are created with more complex
-definitions beyond table name, column name(s) and uniqueness constraint.
+definitions beyond table name, column names, and uniqueness constraint.
Consult the [Adding Database Indexes](adding_database_indexes.md#requirements-for-naming-indexes)
guide for more details.
diff --git a/doc/development/new_fe_guide/development/performance.md b/doc/development/new_fe_guide/development/performance.md
index f34c407da84..ee853942cb9 100644
--- a/doc/development/new_fe_guide/development/performance.md
+++ b/doc/development/new_fe_guide/development/performance.md
@@ -8,15 +8,15 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Monitoring
-We have a performance dashboard available in one of our [Grafana instances](https://dashboards.gitlab.net/d/1EBTz3Dmz/sitespeed-page-summary?orgId=1). This dashboard automatically aggregates metric data from [sitespeed.io](https://www.sitespeed.io/) every 6 hours. These changes are displayed after a set number of pages are aggregated.
+We have a performance dashboard available in one of our [Grafana instances](https://dashboards.gitlab.net/d/000000043/sitespeed-page-summary?orgId=1). This dashboard automatically aggregates metric data from [sitespeed.io](https://www.sitespeed.io/) every 4 hours. These changes are displayed after a set number of pages are aggregated.
-These pages can be found inside a text file in the [`gitlab-build-images` repository](https://gitlab.com/gitlab-org/gitlab-build-images) called [`gitlab.txt`](https://gitlab.com/gitlab-org/gitlab-build-images/blob/master/scripts/gitlab.txt)
-Any frontend engineer can contribute to this dashboard. They can contribute by adding or removing URLs of pages from this text file. Please have a [frontend monitoring expert](https://about.gitlab.com/company/team/) review your changes before assigning to a maintainer of the `gitlab-build-images` project. The changes are pushed live on the next scheduled run after the changes are merged into `main`.
+These pages can be found inside text files in the [`sitespeed-measurement-setup` repository](https://gitlab.com/gitlab-org/frontend/sitespeed-measurement-setup) called [`gitlab`](https://gitlab.com/gitlab-org/frontend/sitespeed-measurement-setup/-/tree/master/gitlab)
+Any frontend engineer can contribute to this dashboard. They can contribute by adding or removing URLs of pages to the text files. The changes are pushed live on the next scheduled run after the changes are merged into `main`.
-There are 3 recommended high impact metrics to review on each page:
+There are 3 recommended high impact metrics (core web vitals) to review on each page:
-- [First visual change](https://web.dev/first-meaningful-paint/)
-- [Speed Index](https://github.com/WPO-Foundation/webpagetest-docs/blob/master/user/Metrics/SpeedIndex.md)
-- [Visual Complete 95%](https://github.com/WPO-Foundation/webpagetest-docs/blob/master/user/Metrics/SpeedIndex.md)
+- [Largest Contentful Paint](https://web.dev/lcp/)
+- [First Input Delay](https://web.dev/fid/)
+- [Cumulative Layout Shift](https://web.dev/cls/)
For these metrics, lower numbers are better as it means that the website is more performant.
diff --git a/doc/development/new_fe_guide/modules/widget_extensions.md b/doc/development/new_fe_guide/modules/widget_extensions.md
index 638a0a2a85b..d3be8981abb 100644
--- a/doc/development/new_fe_guide/modules/widget_extensions.md
+++ b/doc/development/new_fe_guide/modules/widget_extensions.md
@@ -36,6 +36,7 @@ export default {
},
expandEvent: '', // Optional: RedisHLL event name to track expanding content
enablePolling: false, // Optional: Tells extension to poll for data
+ modalComponent: null, // Optional: The component to use for the modal
computed: {
summary(data) {}, // Required: Level 1 summary text
statusIcon(data) {}, // Required: Level 1 status icon
@@ -128,6 +129,14 @@ mentioned below:
text: '', // Required: Text to be displayed inside badge
variant: '', // Optional: GitLab UI badge variant, defaults to info
},
+ link: { // Optional: Link to a URL displayed after text
+ text: '', // Required: Text of the link
+ href: '', // Optional: URL for the link
+ },
+ modal: { // Optional: Link to open a modal displayed after text
+ text: '', // Required: Text of the link
+ onClick: () => {} // Optional: Function to run when link is clicked, i.e. to set this.modalData
+ }
actions: [], // Optional: Action button for row
children: [], // Optional: Child content to render, structure matches the same structure
}
diff --git a/doc/development/packages.md b/doc/development/packages.md
index 35a93c77c7f..6526bdd45a1 100644
--- a/doc/development/packages.md
+++ b/doc/development/packages.md
@@ -151,7 +151,7 @@ During this phase, the idea is to collect as much information as possible about
1. Empty file structure (API file, base service for this package)
1. Authentication system for "logging in" to the package manager
1. Identify metadata and create applicable tables
- 1. Workhorse route for [object storage direct upload](uploads/implementation.md#direct-upload)
+ 1. Workhorse route for [object storage direct upload](uploads/index.md#direct-upload)
1. Endpoints required for upload/publish
1. Endpoints required for install/download
1. Endpoints required for required actions
@@ -210,7 +210,7 @@ File uploads should be handled by GitLab Workhorse using object accelerated uplo
the workhorse proxy that checks all incoming requests to GitLab intercept the upload request,
upload the file, and forward a request to the main GitLab codebase only containing the metadata
and file location rather than the file itself. An overview of this process can be found in the
-[development documentation](uploads/implementation.md#direct-upload).
+[development documentation](uploads/index.md#direct-upload).
In terms of code, this means a route must be added to the
[GitLab Workhorse project](https://gitlab.com/gitlab-org/gitlab-workhorse) for each upload endpoint being added
diff --git a/doc/development/performance.md b/doc/development/performance.md
index 1e3e0570206..6d0b833a2da 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -75,7 +75,6 @@ GitLab provides built-in tools to help improve performance and availability:
- [Profiling](profiling.md).
- [Distributed Tracing](distributed_tracing.md)
- [GitLab Performance Monitoring](../administration/monitoring/performance/index.md).
-- [Request Profiling](../administration/monitoring/performance/request_profiling.md).
- [QueryRecoder](query_recorder.md) for preventing `N+1` regressions.
- [Chaos endpoints](chaos_endpoints.md) for testing failure scenarios. Intended mainly for testing availability.
- [Service measurement](service_measurement.md) for measuring and logging service execution.
@@ -319,7 +318,7 @@ You can do this when using the [performance bar](profiling.md#speedscope-flamegr
and when [profiling code blocks](https://github.com/jlfwong/speedscope/wiki/Importing-from-stackprof-(ruby)).
This option isn't supported by `bin/rspec-stackprof`.
-You can profile speciific methods by using `--method method_name`:
+You can profile specific methods by using `--method method_name`:
```shell
$ stackprof tmp/project_policy_spec.rb.dump --method access_allowed_to
diff --git a/doc/development/permissions.md b/doc/development/permissions.md
index 47aebc2f4d2..f3818e92fec 100644
--- a/doc/development/permissions.md
+++ b/doc/development/permissions.md
@@ -86,10 +86,10 @@ module):
- Maintainer (`40`)
- Owner (`50`)
-If a user is the member of both a project and the project parent group(s), the
+If a user is the member of both a project and the project parent groups, the
higher permission is taken into account for the project.
-If a user is the member of a project, but not the parent group(s), they
+If a user is the member of a project, but not the parent groups, they
can still view the groups and their entities (like epics).
Project membership (where the group membership is already taken into account)
diff --git a/doc/development/pipelines.md b/doc/development/pipelines.md
index e0b236bc5fc..b70f07ea7d9 100644
--- a/doc/development/pipelines.md
+++ b/doc/development/pipelines.md
@@ -12,7 +12,7 @@ which itself includes files under
[`.gitlab/ci/`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/.gitlab/ci)
for easier maintenance.
-We're striving to [dogfood](https://about.gitlab.com/handbook/engineering/principles/#dogfooding)
+We're striving to [dogfood](https://about.gitlab.com/handbook/engineering/development/principles/#dogfooding)
GitLab [CI/CD features and best-practices](../ci/yaml/index.md)
as much as possible.
@@ -53,7 +53,7 @@ In summary:
To identify the minimal set of tests needed, we use the [`test_file_finder` gem](https://gitlab.com/gitlab-org/ci-cd/test_file_finder), with two strategies:
-- dynamic mapping from test coverage tracing (generated via the [Crystalball gem](https://github.com/toptal/crystalball))
+- dynamic mapping from test coverage tracing (generated via the [`Crystalball` gem](https://github.com/toptal/crystalball))
([see where it's used](https://gitlab.com/gitlab-org/gitlab/-/blob/47d507c93779675d73a05002e2ec9c3c467cd698/tooling/bin/find_tests#L15))
- static mapping maintained in the [`tests.yml` file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/tests.yml) for special cases that cannot
be mapped via coverage tracing ([see where it's used](https://gitlab.com/gitlab-org/gitlab/-/blob/47d507c93779675d73a05002e2ec9c3c467cd698/tooling/bin/find_tests#L12))
@@ -93,7 +93,7 @@ In addition, there are a few circumstances where we would always run the full Je
### Fork pipelines
We only run the minimal RSpec & Jest jobs for fork pipelines unless the `pipeline:run-all-rspec`
-label is set on the MR. The goal is to reduce the CI minutes consumed by fork pipelines.
+label is set on the MR. The goal is to reduce the CI/CD minutes consumed by fork pipelines.
See the [experiment issue](https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/1170).
@@ -160,7 +160,7 @@ Our current RSpec tests parallelization setup is as follows:
`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 `{}`.
-1. Each `[rspec|rspec-ee] [unit|integration|system|geo] n m` job are run 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`
since the "artifacts from all previous stages are passed by default".
@@ -170,7 +170,7 @@ Our current RSpec tests parallelization setup is as follows:
`Report specs`, not under `Leftover specs`.
1. The `update-tests-metadata` job (which only runs on scheduled pipelines for
[the canonical project](https://gitlab.com/gitlab-org/gitlab) takes all the
- `knapsack/rspec*_pg_*.json` files and merge them all together into a single
+ `knapsack/rspec*.json` files and merge them all together into a single
`knapsack/report-master.json` file that is saved as artifact.
After that, the next pipeline uses the up-to-date `knapsack/report-master.json` file.
@@ -247,12 +247,18 @@ The `* as-if-jh` jobs are run in addition to the regular EE-context jobs. The `j
The intent is to ensure that a change doesn't introduce a failure after `gitlab-org/gitlab` is synced to [GitLab JH](https://jihulab.com/gitlab-cn/gitlab).
+### When to consider applying `pipeline:run-as-if-jh` label
+
+If a Ruby file is renamed and there's a corresponding [`prepend_mod` line](jh_features_review.md#jh-features-based-on-ce-or-ee-features),
+it's likely that GitLab JH is relying on it and requires a corresponding
+change to rename the module or class it's prepending.
+
### Corresponding JH branch
You can create a corresponding JH branch on [GitLab JH](https://jihulab.com/gitlab-cn/gitlab) by
appending `-jh` to the branch name. If a corresponding JH branch is found,
`* as-if-jh` jobs grab the `jh` folder from the respective branch,
-rather than from the default branch.
+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.
@@ -345,7 +351,7 @@ We use the [`rules:`](../ci/yaml/index.md#rules) and [`needs:`](../ci/yaml/index
to determine the jobs that need to be run in a pipeline. Note that an MR that includes multiple types of changes would
have a pipelines that include jobs from multiple types (for example, a combination of docs-only and code-only pipelines).
-Following are graphs of the critical paths for each pipeline type. Jobs that aren't part of the critical path are ommitted.
+Following are graphs of the critical paths for each pipeline type. Jobs that aren't part of the critical path are omitted.
### Documentation pipeline
@@ -508,12 +514,9 @@ The current stages are:
- `test`: This stage includes most of the tests, and DB/migration jobs.
- `post-test`: This stage includes jobs that build reports or gather data from
the `test` stage's jobs (for example, coverage, Knapsack metadata, and so on).
-- `review-prepare`: This stage includes a job that build the CNG images that are
- later used by the (Helm) Review App deployment (see
- [Review Apps](testing_guide/review_apps.md) for details).
-- `review`: This stage includes jobs that deploy the GitLab and Docs Review Apps.
-- `dast`: This stage includes jobs that run a DAST full scan against the Review App
-that is deployed in stage `review`.
+- `review`: This stage includes jobs that build the CNG images, deploy them, and
+ run end-to-end tests against Review Apps (see [Review Apps](testing_guide/review_apps.md) for details).
+ It also includes Docs Review App jobs.
- `qa`: This stage includes jobs that perform QA tasks against the Review App
that is deployed in stage `review`.
- `post-qa`: This stage includes jobs that build reports or gather data from
diff --git a/doc/development/product_qualified_lead_guide/index.md b/doc/development/product_qualified_lead_guide/index.md
index 2395689ada2..dcd8b33e5c5 100644
--- a/doc/development/product_qualified_lead_guide/index.md
+++ b/doc/development/product_qualified_lead_guide/index.md
@@ -16,8 +16,8 @@ A hand-raise PQL is a user who requests to speak to sales from within the produc
1. Set up CustomersDot to talk to a staging instance of Platypus.
1. Set up CustomersDot using the [normal install instructions](https://gitlab.com/gitlab-org/customers-gitlab-com/-/blob/staging/doc/setup/installation_steps.md).
-1. Set the `CUSTOMER_PORTAL_URL` env var to your local (or ngrok) URL of your CustomersDot instance.
-1. Place `export CUSTOMER_PORTAL_URL='https://XXX.ngrok.io/'` in your shell rc script (~/.zshrc or ~/.bash_profile or ~/.bashrc) and restart GDK.
+1. Set the `CUSTOMER_PORTAL_URL` environment variable to your local (or ngrok) URL of your CustomersDot instance.
+1. Place `export CUSTOMER_PORTAL_URL='https://XXX.ngrok.io/'` in your shell rc script (`~/.zshrc` or `~/.bash_profile` or `~/.bashrc`) and restart GDK.
1. Enter the credentials on CustomersDot development to Platypus in your `/config/secrets.yml` and restart. Credentials for the Platypus Staging are in the 1Password Growth vault. The URL for staging is `https://staging.ci.nexus.gitlabenvironment.cloud`.
```yaml
diff --git a/doc/development/python_guide/index.md b/doc/development/python_guide/index.md
index fe5492c3bd8..77dd328b513 100644
--- a/doc/development/python_guide/index.md
+++ b/doc/development/python_guide/index.md
@@ -25,6 +25,18 @@ To install `pyenv` on macOS, you can use [Homebrew](https://brew.sh/) with:
brew install pyenv
```
+### Windows
+
+`pyenv` does not officially support Windows and does not work in Windows outside the Windows Subsystem for Linux. If you are a Windows user, you can use `pyenv-win`.
+
+To install `pyenv-win` on Windows, run the following PowerShell command:
+
+```shell
+Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
+```
+
+[Learn more about `pyenv-win`](https://github.com/pyenv-win/pyenv-win).
+
### Linux
To install `pyenv` on Linux, you can run the command below:
diff --git a/doc/development/rails_initializers.md b/doc/development/rails_initializers.md
index ee73dac2b72..9bf4109f1cb 100644
--- a/doc/development/rails_initializers.md
+++ b/doc/development/rails_initializers.md
@@ -20,3 +20,21 @@ Some examples where you would need to do this are:
1. Modifying Rails' `config.autoload_paths`
1. Changing configuration that Zeitwerk uses, for example, inflections
+
+## Database connections in initializers
+
+Ideally, database connections are not opened from Rails initializers. Opening a
+database connection (e.g. checking the database exists, or making a database
+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:
+
+```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)
+```
+
+If you wish to print out the full backtrace, set the
+`DEBUG_INITIALIZER_CONNECTIONS` environment variable.
diff --git a/doc/development/rails_update.md b/doc/development/rails_update.md
index 1a30e606c17..8999ac90f4c 100644
--- a/doc/development/rails_update.md
+++ b/doc/development/rails_update.md
@@ -88,7 +88,7 @@ To efficiently and quickly find which Rails change caused the spec failure you c
For example, `git bisect start v6.1.4.1 v6.1.3.2` if we're upgrading from version 6.1.3.2 to 6.1.4.1.
Replace `<NEW_VERSION_TAG>` with the tag where the spec is red and `<OLD_VERSION_TAG>` with the one with the green spec. For example, `git bisect start v6.1.4.1 v6.1.3.2` if we're upgrading from version 6.1.3.2 to 6.1.4.1.
In the output, you can see how many steps approximately it takes to find the commit.
-1. Start the `git bisect` process and pass spec's file name(s) to `scripts/rails-update-bisect` as an argument or arguments. It can be faster to pick only one example instead of an entire spec file.
+1. Start the `git bisect` process and pass spec's filenames to `scripts/rails-update-bisect` as arguments. It can be faster to pick only one example instead of an entire spec file.
```shell
git bisect run <GDK_FOLDER>/gitlab/scripts/rails-update-bisect spec/models/ability_spec.rb
diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md
index 1e9367ecee4..0538add59b5 100644
--- a/doc/development/rake_tasks.md
+++ b/doc/development/rake_tasks.md
@@ -366,8 +366,8 @@ The docs generator code comes from our side giving us more flexibility, like usi
To edit the content, you may need to edit the following:
-- The template. You can edit the template at `lib/gitlab/graphql/docs/templates/default.md.haml`.
- The actual renderer is at `Gitlab::Graphql::Docs::Renderer`.
+- The template. You can edit the template at `tooling/graphql/docs/templates/default.md.haml`.
+ The actual renderer is at `Tooling::Graphql::Docs::Renderer`.
- The applicable `description` field in the code, which
[Updates machine-readable schema files](#update-machine-readable-schema-files),
which is then used by the `rake` task described earlier.
diff --git a/doc/development/redis.md b/doc/development/redis.md
index 75170b8c746..d5f526f2d32 100644
--- a/doc/development/redis.md
+++ b/doc/development/redis.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
GitLab uses [Redis](https://redis.io) for the following distinct purposes:
- Caching (mostly via `Rails.cache`).
-- As a job processing queue with [Sidekiq](sidekiq_style_guide.md).
+- As a job processing queue with [Sidekiq](sidekiq/index.md).
- To manage the shared application state.
- To store CI trace chunks.
- As a Pub/Sub queue backend for ActionCable.
@@ -147,12 +147,11 @@ mostly for fine-grained control of Redis usage, so they wouldn't be used
in combination with the `Rails.cache` wrapper: we'd either use
`Rails.cache` or these classes and literal Redis commands.
-`Rails.cache` or these classes and literal Redis commands. We prefer
-using `Rails.cache` so we can reap the benefits of future optimizations
-done to Rails. It is worth noting that Ruby objects are
+We prefer using `Rails.cache` so we can reap the benefits of future
+optimizations done to Rails. Ruby objects are
[marshalled](https://github.com/rails/rails/blob/v6.0.3.1/activesupport/lib/active_support/cache/redis_cache_store.rb#L447)
-when written to Redis, so we need to pay attention to not to store huge
-objects, or untrusted user input.
+when written to Redis, so we must pay attention to store neither huge objects,
+nor untrusted user input.
Typically we would only use these classes when at least one of the
following is true:
diff --git a/doc/development/redis/new_redis_instance.md b/doc/development/redis/new_redis_instance.md
index 96f860f3890..389cddbb4e5 100644
--- a/doc/development/redis/new_redis_instance.md
+++ b/doc/development/redis/new_redis_instance.md
@@ -232,8 +232,8 @@ a developer will need to add an implementation for missing Redis commands before
| metrics name | type | labels | description |
|-------------------------------------------------|--------------------|------------------------|----------------------------------------------------|
-| gitlab_redis_multi_store_read_fallback_total | Prometheus Counter | command, instance_name | Client side Redis MultiStore reading fallback total|
-| gitlab_redis_multi_store_method_missing_total | Prometheus Counter | command, instance_name | Client side Redis MultiStore method missing total |
+| `gitlab_redis_multi_store_read_fallback_total` | Prometheus Counter | command, instance_name | Client side Redis MultiStore reading fallback total|
+| `gitlab_redis_multi_store_method_missing_total` | Prometheus Counter | command, instance_name | Client side Redis MultiStore method missing total |
## Step 4: clean up after the migration
diff --git a/doc/development/routing.md b/doc/development/routing.md
index 8fca9b00157..41961c2288f 100644
--- a/doc/development/routing.md
+++ b/doc/development/routing.md
@@ -31,6 +31,16 @@ we introduced the `/-/` scope. The purpose of it is to separate group or
project paths from the rest of the routes. Also it helps to reduce the
number of [reserved names](../user/reserved_names.md).
+## View all available routes
+
+You can view and find routes from the console by running:
+
+```shell
+rails routes | grep crm
+```
+
+You can also view routes in your browser by going to [http://gdk.test:3000/rails/info/routes](http://gdk.test:3000/rails/info/routes).
+
## Global routes
We have a number of global routes. For example:
diff --git a/doc/development/ruby_upgrade.md b/doc/development/ruby_upgrade.md
index a208a93e300..3b89a6fd1ea 100644
--- a/doc/development/ruby_upgrade.md
+++ b/doc/development/ruby_upgrade.md
@@ -144,7 +144,7 @@ A [build matrix definition](../ci/yaml/index.md#parallelmatrix) can do this effi
When upgrading Ruby, consider updating the following repositories:
- [Gitaly](https://gitlab.com/gitlab-org/gitaly) ([example](https://gitlab.com/gitlab-org/gitaly/-/merge_requests/3771))
-- [GitLab Labkit](https://gitlab.com/gitlab-org/labkit-ruby) ([example](https://gitlab.com/gitlab-org/labkit-ruby/-/merge_requests/79))
+- [GitLab LabKit](https://gitlab.com/gitlab-org/labkit-ruby) ([example](https://gitlab.com/gitlab-org/labkit-ruby/-/merge_requests/79))
- [GitLab Exporter](https://gitlab.com/gitlab-org/gitlab-exporter) ([example](https://gitlab.com/gitlab-org/gitlab-exporter/-/merge_requests/150))
- [GitLab Experiment](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment) ([example](https://gitlab.com/gitlab-org/ruby/gems/gitlab-experiment/-/merge_requests/128))
- [Gollum Lib](https://gitlab.com/gitlab-org/gollum-lib) ([example](https://gitlab.com/gitlab-org/gollum-lib/-/merge_requests/21))
@@ -272,4 +272,4 @@ and merged back independently.
- **Give yourself enough time to fix problems ahead of a milestone release.** GitLab moves fast.
As a Ruby upgrade requires many MRs to be sent and reviewed, make sure all changes are merged at least a week
before the 22nd. This gives us extra time to act if something breaks. If in doubt, it is better to
-postpone the upgrade to the following month, as we [prioritize availability over velocity](https://about.gitlab.com/handbook/engineering/principles/#prioritizing-technical-decisions).
+postpone the upgrade to the following month, as we [prioritize availability over velocity](https://about.gitlab.com/handbook/engineering/development/principles/#prioritizing-technical-decisions).
diff --git a/doc/development/secure_coding_guidelines.md b/doc/development/secure_coding_guidelines.md
index 8a86a46d1d3..3e46891d20e 100644
--- a/doc/development/secure_coding_guidelines.md
+++ b/doc/development/secure_coding_guidelines.md
@@ -461,7 +461,9 @@ References:
### Description
-Path Traversal vulnerabilities grant attackers access to arbitrary directories and files on the server that is executing an application, including data, code or credentials.
+Path Traversal vulnerabilities grant attackers access to arbitrary directories and files on the server that is executing an application. This data can include data, code or credentials.
+
+Traversal can occur when a path includes directories. A typical malicious example includes one or more `../`, which tells the file system to look in the parent directory. Supplying many of them in a path, for example `../../../../../../../etc/passwd`, usually resolves to `/etc/passwd`. If the file system is instructed to look back to the root directory and can't go back any further, then extra `../` are ignored. The file system then looks from the root, resulting in `/etc/passwd` - a file you definitely do not want exposed to a malicious attacker!
### Impact
@@ -510,6 +512,44 @@ requires :file_path, type: String, file_path: true
Absolute paths are not allowed by default. If allowing an absolute path is required, you
need to provide an array of paths to the parameter `allowlist`.
+### Misleading behavior
+
+Some methods used to construct file paths can have non-intuitive behavior. To properly validate user input, be aware
+of these behaviors.
+
+#### Ruby
+
+The Ruby method [`Pathname.join`](https://ruby-doc.org/stdlib-2.7.4/libdoc/pathname/rdoc/Pathname.html#method-i-join)
+joins path names. Using methods in a specific way can result in a path name typically prohibited in
+normal use. In the examples below, we see attempts to access `/etc/passwd`, which is a sensitive file:
+
+```ruby
+require 'pathname'
+
+p = Pathname.new('tmp')
+print(p.join('log', 'etc/passwd', 'foo'))
+# => tmp/log/etc/passwd/foo
+```
+
+Assuming the second parameter is user-supplied and not validated, submitting a new absolute path
+results in a different path:
+
+```ruby
+print(p.join('log', '/etc/passwd', ''))
+# renders the path to "/etc/passwd", which is not what we expect!
+```
+
+#### Golang
+
+Golang has similar behavior with [`path.Clean`](https://pkg.go.dev/path#example-Clean). Remember that with many file systems, using `../../../../` traverses up to the root directory. Any remaining `../` are ignored. This example may give an attacker access to `/etc/passwd`:
+
+```golang
+path.Clean("/../../etc/passwd")
+// renders the path to "etc/passwd"; the file path is relative to whatever the current directory is
+path.Clean("../../etc/passwd")
+// renders the path to "../../etc/passwd"; the file path will look back up to two parent directories!
+```
+
## OS command injection guidelines
Command injection is an issue in which an attacker is able to execute arbitrary commands on the host
@@ -620,7 +660,7 @@ cfg := &tls.Config{
}
```
-For **Ruby**, you can use [HTTParty](https://github.com/jnunemaker/httparty) and specify TLS 1.3 version as well as ciphers:
+For **Ruby**, you can use [`HTTParty`](https://github.com/jnunemaker/httparty) and specify TLS 1.3 version as well as ciphers:
Whenever possible this example should be **avoided** for security purposes:
@@ -665,7 +705,7 @@ tls.Config{
This example was taken [here](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/871b52dc700f1a66f6644fbb1e78a6d463a6ff83/internal/tool/tlstool/tlstool.go#L72).
-For **Ruby**, you can use again [HTTParty](https://github.com/jnunemaker/httparty) and specify this time TLS 1.2 version alongside with the recommended ciphers:
+For **Ruby**, you can use again [`HTTParty`](https://github.com/jnunemaker/httparty) and specify this time TLS 1.2 version alongside with the recommended ciphers:
```ruby
response = GitLab::HTTP.perform_request(Net::HTTP::Get, 'https://gitlab.com', ssl_version: :TLSv1_2, ciphers: ['ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-CHACHA20-POLY1305', 'ECDHE-RSA-CHACHA20-POLY1305'])
@@ -833,7 +873,7 @@ If a vulnerable application extracts an archive file with any of these file name
#### Ruby
-For zip files, the [rubyzip](https://rubygems.org/gems/rubyzip) Ruby gem is already patched against the Zip Slip vulnerability and will refuse to extract files that try to perform directory traversal, so for this vulnerable example we will extract a `tar.gz` file with `Gem::Package::TarReader`:
+For zip files, the [`rubyzip`](https://rubygems.org/gems/rubyzip) Ruby gem is already patched against the Zip Slip vulnerability and will refuse to extract files that try to perform directory traversal, so for this vulnerable example we will extract a `tar.gz` file with `Gem::Package::TarReader`:
```ruby
# Vulnerable tar.gz extraction example!
@@ -1032,7 +1072,7 @@ Symlink attacks makes it possible for an attacker to read the contents of arbitr
#### Ruby
-For zip files, the [rubyzip](https://rubygems.org/gems/rubyzip) Ruby gem is already patched against symlink attacks as it simply ignores symbolic links, so for this vulnerable example we will extract a `tar.gz` file with `Gem::Package::TarReader`:
+For zip files, the [`rubyzip`](https://rubygems.org/gems/rubyzip) Ruby gem is already patched against symlink attacks as it simply ignores symbolic links, so for this vulnerable example we will extract a `tar.gz` file with `Gem::Package::TarReader`:
```ruby
# Vulnerable tar.gz extraction example!
@@ -1210,3 +1250,36 @@ An example of well implemented `Gitlab::UrlBlocker.validate!` call that prevents
### Resources
- [CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition](https://cwe.mitre.org/data/definitions/367.html)
+
+## Handling credentials
+
+Credentials can be:
+
+- Login details like username and password.
+- Private keys.
+- Tokens (PAT, runner tokens, JWT token, CSRF tokens, project access tokens, etc).
+- Session cookies.
+- Any other piece of information that can be used for authentication or authorization purposes.
+
+This sensitive data must be handled carefully to avoid leaks which could lead to unauthorized access. If you have questions or need help with any of the following guidance, talk to the GitLab AppSec team on Slack (`#sec-appsec`).
+
+### At rest
+
+- Credentials must be encrypted while at rest (database or file) with `attr_encrypted`. See [issue #26243](https://gitlab.com/gitlab-org/gitlab/-/issues/26243) before using `attr_encrypted`.
+ - Store the encryption keys separately from the encrypted credentials with proper access control. For instance, store the keys in a vault, KMS, or file. Here is an [example](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/models/user.rb#L70-74) use of `attr_encrypted` for encryption with keys stored in separate access controlled file.
+ - When the intention is to only compare secrets, store only the salted hash of the secret instead of the encrypted value.
+- Never commit credentials to repositories.
+ - The [Gitleaks Git hook](https://gitlab.com/gitlab-com/gl-security/security-research/gitleaks-endpoint-installer) is recommended for preventing credentials from being committed.
+- Never log credentials under any circumstance. Issue [#353857](https://gitlab.com/gitlab-org/gitlab/-/issues/353857) is an example of credential leaks through log file.
+- When credentials are required in a CI/CD job, use [masked variables](../ci/variables/index.md#mask-a-cicd-variable) to help prevent accidental exposure in the job logs. Be aware that when [debug logging](../ci/variables/index.md#debug-logging) is enabled, all masked CI/CD variables are visible in job logs. Also consider using [protected variables](../ci/variables/index.md#protected-cicd-variables) when possible so that sensitive CI/CD variables are only available to pipelines running on protected branches or protected tags.
+- Proper scanners must be enabled depending on what data those credentials are protecting. See the [Application Security Inventory Policy](https://about.gitlab.com/handbook/engineering/security/security-engineering-and-research/application-security/inventory.html#policies) and our [Data Classification Standards](https://about.gitlab.com/handbook/engineering/security/data-classification-standard.html#data-classification-standards).
+- To store and/or share credentials between teams, refer to [1Password for Teams](https://about.gitlab.com/handbook/security/#1password-for-teams) and follow [the 1Password Guidelines](https://about.gitlab.com/handbook/security/#1password-guidelines).
+- If you need to share a secret with a team member, use 1Password. Do not share a secret over email, Slack, or other service on the Internet.
+
+### In transit
+
+- Use an encrypted channel like TLS to transmit credentials. See [our TLS minimum recommendation guidelines](#tls-minimum-recommended-version).
+- Avoid including credentials as part of an HTTP response unless it is absolutely necessary as part of the workflow. For example, generating a PAT for users.
+- 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).
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
index ca4a0158051..27bc4d2e8ca 100644
--- a/doc/development/service_ping/implement.md
+++ b/doc/development/service_ping/implement.md
@@ -268,10 +268,9 @@ Arguments:
#### Ordinary Redis counters
-Examples of implementation:
+Example of implementation:
-- Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
-- Using Redis methods [`HINCRBY`](https://redis.io/commands/hincrby), [`HGETALL`](https://redis.io/commands/hgetall), and [`Gitlab::UsageCounters::PodLogs`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_counters/pod_logs.rb)
+Using Redis methods [`INCR`](https://redis.io/commands/incr), [`GET`](https://redis.io/commands/get), and [`Gitlab::UsageDataCounters::WikiPageCounter`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/wiki_page_counter.rb)
##### `UsageData` API
@@ -287,9 +286,7 @@ Enabled by default in GitLab 13.7 and later.
Increment event count using an ordinary Redis counter, for a given event name.
API requests are protected by checking for a valid CSRF token.
-
- To increment the values, the related feature `usage_data_<event_name>` must be enabled.
-
+
```plaintext
POST /usage_data/increment_counter
```
@@ -366,7 +363,7 @@ Implemented using Redis methods [PFADD](https://redis.io/commands/pfadd) and [PF
aggregation.
- `aggregation`: may be set to a `:daily` or `:weekly` key. Defines how counting data is stored in Redis.
Aggregation on a `daily` basis does not pull more fine grained data.
- - `feature_flag`: optional `default_enabled: :yaml`. If no feature flag is set then the tracking is enabled. One feature flag can be used for multiple events. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
+ - `feature_flag`: if no feature flag is set then the tracking is enabled. One feature flag can be used for multiple events. For details, see our [GitLab internal Feature flags](../feature_flags/index.md) documentation. The feature flags are owned by the group adding the event tracking.
1. Use one of the following methods to track the event:
@@ -580,7 +577,6 @@ Example:
```ruby
# Redis Counters
redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
# Define events in common.yml https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/usage_data_counters/known_events/common.yml
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
index 14bb90537e7..1e09dada36e 100644
--- a/doc/development/service_ping/index.md
+++ b/doc/development/service_ping/index.md
@@ -22,7 +22,7 @@ and sales teams understand how GitLab is used. The data helps to:
Service Ping information is not anonymous. It's linked to the instance's hostname, but does
not contain project names, usernames, or any other specific data.
-Sending a Service Ping payload is optional and you can [disable](#disable-service-ping) it on any
+Sending a Service Ping payload is optional and you can [disable](../../user/admin_area/settings/usage_statistics.md#enable-or-disable-usage-statistics) it on any
self-managed instance. When Service Ping is enabled, GitLab gathers data from the other instances
and can show your instance's usage statistics to your users.
@@ -38,23 +38,6 @@ We use the following terminology to describe the Service Ping components:
- **MAU**: monthly active users.
- **WAU**: weekly active users.
-### Why enable Service Ping?
-
-The main purpose of Service Ping is to build a better GitLab. We collect data about how GitLab is used
-to understand feature or stage adoption and usage. This data gives an insight into how GitLab adds
-value and helps our team understand the reasons why people use GitLab, and with this knowledge we're able to
-make better product decisions.
-
-There are several other benefits to enabling Service Ping:
-
-- As a benefit of having Service Ping active, GitLab lets you analyze the users' activities over time of your GitLab installation.
-- As a benefit of having Service Ping active, GitLab provides you with [DevOps Score](../../user/admin_area/analytics/dev_ops_reports.md#devops-score), which gives you an overview of your entire instance's adoption of Concurrent DevOps from planning to monitoring.
-- You get better, more proactive support (assuming that our TAMs and support organization used the data to deliver more value).
-- You get insight and advice into how to get the most value out of your investment in GitLab. Wouldn't you want to know that a number of features or values are not being adopted in your organization?
-- You get a report that illustrates how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
-- Service Ping is enabled by default. To disable it, see [Disable Service Ping](#disable-service-ping).
-- When Service Ping is enabled, you have the option to participate in our [Registration Features Program](#registration-features-program) and receive free paid features.
-
### Limitations
- Service Ping does not track frontend events things like page views, link clicks, or user sessions.
@@ -65,107 +48,6 @@ Because of these limitations we recommend you:
- Instrument your products with Snowplow for more detailed analytics on GitLab.com.
- Use Service Ping to track aggregated backend events on self-managed instances.
-### Registration Features Program
-
-> Introduced in GitLab 14.1.
-
-In GitLab versions 14.1 and later, GitLab Free customers with a self-managed instance running
-[GitLab EE](../ee_features.md) can receive paid features by registering with GitLab and sending us
-activity data through Service Ping. Features introduced here do not remove the feature from its paid
-tier. Users can continue to access the features in a paid tier without sharing usage data.
-
-#### Features available in 14.1 and later
-
-1. [Email from GitLab](../../user/admin_area/email_from_gitlab.md).
-
-#### Features available in 14.4 and later
-
-1. [Repository size limit](../../user/admin_area/settings/account_and_limit_settings.md#repository-size-limit).
-1. [Restrict group access by IP address](../../user/group/index.md#restrict-group-access-by-ip-address).
-
-NOTE:
-Registration is not yet required for participation, but will be added in a future milestone.
-
-#### Enable Registration Features
-
-1. Sign in as a user with administrator access.
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. If not enabled, select the **Enable Service Ping** checkbox.
-1. Select the **Enable Registration Features** checkbox.
-1. Select **Save changes**.
-
-## View the Service Ping payload **(FREE SELF)**
-
-You can view the exact JSON payload sent to GitLab Inc. in the Admin Area. To view the payload:
-
-1. Sign in as a user with administrator access.
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Select **Preview payload**.
-
-For an example payload, see [Example Service Ping payload](#example-service-ping-payload).
-
-## Disable Service Ping **(FREE SELF)**
-
-NOTE:
-The method to disable Service Ping in the GitLab configuration file does not work in
-GitLab versions 9.3 to 13.12.3. See the [troubleshooting section](#cannot-disable-service-ping-using-the-configuration-file)
-on how to disable it.
-
-You can disable Service Ping either using the GitLab UI, or editing the GitLab
-configuration file.
-
-### Disable Service Ping using the UI
-
-To disable Service Ping in the GitLab UI:
-
-1. Sign in as a user with administrator access.
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Metrics and profiling**.
-1. Expand the **Usage statistics** section.
-1. Clear the **Enable Service Ping** checkbox.
-1. Select **Save changes**.
-
-### Disable Service Ping using the configuration file
-
-To disable Service Ping and prevent it from being configured in the future through
-the Admin Area:
-
-**For installations using the Linux package:**
-
-1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['usage_ping_enabled'] = false
- ```
-
-1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
-**For installations from source:**
-
-1. Edit `/home/git/gitlab/config/gitlab.yml`:
-
- ```yaml
- production: &base
- # ...
- gitlab:
- # ...
- usage_ping_enabled: false
- ```
-
-1. Restart GitLab:
-
- ```shell
- sudo service gitlab restart
- ```
-
## Service Ping request flow
The following example shows a basic request/response flow between a GitLab instance, the Versions Application, the License Application, Salesforce, the GitLab S3 Bucket, the GitLab Snowflake Data Warehouse, and Sisense:
@@ -211,23 +93,53 @@ sequenceDiagram
the required URL is <https://version.gitlab.com/>.
1. In case of an error, it will be reported to the Version application along with following pieces of information:
-- `uuid` - GitLab instance unique identifier
-- `hostname` - GitLab instance hostname
-- `version` - GitLab instance current versions
-- `elapsed` - Amount of time which passed since Service Ping report process started and moment of error occurrence
-- `message` - Error message
-
-<pre>
-<code>
-{
- "uuid"=>"02333324-1cd7-4c3b-a45b-a4993f05fb1d",
- "hostname"=>"127.0.0.1",
- "version"=>"14.7.0-pre",
- "elapsed"=>0.006946,
- "message"=>'PG::UndefinedColumn: ERROR: column \"non_existent_attribute\" does not exist\nLINE 1: SELECT COUNT(non_existent_attribute) FROM \"issues\" /*applica...'
-}
-</code>
-</pre>
+ - `uuid` - GitLab instance unique identifier
+ - `hostname` - GitLab instance hostname
+ - `version` - GitLab instance current versions
+ - `elapsed` - Amount of time which passed since Service Ping report process started and moment of error occurrence
+ - `message` - Error message
+
+ <pre>
+ <code>
+ {
+ "uuid"=>"02333324-1cd7-4c3b-a45b-a4993f05fb1d",
+ "hostname"=>"127.0.0.1",
+ "version"=>"14.7.0-pre",
+ "elapsed"=>0.006946,
+ "message"=>'PG::UndefinedColumn: ERROR: column \"non_existent_attribute\" does not exist\nLINE 1: SELECT COUNT(non_existent_attribute) FROM \"issues\" /*applica...'
+ }
+ </code>
+ </pre>
+
+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.
+
+```ruby
+ {"metadata"=>
+ {"metrics"=>
+ [{"name"=>"version", "time_elapsed"=>1.1811964213848114e-05},
+ {"name"=>"installation_type", "time_elapsed"=>0.00017242692410945892},
+ {"name"=>"license_billable_users", "time_elapsed"=>0.009520471096038818},
+ ....
+ {"name"=>"counts.clusters_platforms_eks",
+ "time_elapsed"=>0.05638605775311589},
+ {"name"=>"counts.clusters_platforms_gke",
+ "time_elapsed"=>0.40995341585949063},
+ {"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}
+ ]
+ }
+ }
+ ```
### On a Geo secondary site
@@ -251,6 +163,25 @@ 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.
@@ -513,7 +444,7 @@ To generate Service Ping, use [Teleport](https://goteleport.com/docs/) or a deta
```
1. Connect to console host:
-
+
```shell
ssh $USER-rails@console-01-sv-gprd.c.gitlab-production.internal
```
@@ -526,11 +457,15 @@ To generate Service Ping, use [Teleport](https://goteleport.com/docs/) or a deta
1. To detach from screen, press `ctrl + A`, `ctrl + D`.
1. Exit from bastion:
-
+
```shell
exit
```
+1. Get the metrics duration from logs:
+
+Search in Google Console logs for `time_elapsed`. Query example [here](https://cloudlogging.app.goo.gl/nWheZvD8D3nWazNe6).
+
### Verification (After approx 30 hours)
#### Verify with Teleport
@@ -560,7 +495,7 @@ To generate Service Ping, use [Teleport](https://goteleport.com/docs/) or a deta
```
1. Check the last payload in `raw_usage_data` table:
-
+
```shell
RawUsageData.last.payload
```
@@ -580,115 +515,10 @@ skip_db_write:
ServicePing::SubmitService.new(skip_db_write: true).execute
```
-## Manually upload Service Ping payload
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7388) in GitLab 14.8 with a flag named `admin_application_settings_service_usage_data_center`. Disabled by default.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83265) in GitLab 14.10.
-
-Service Ping payload can be uploaded to GitLab even if your application instance doesn't have access to the internet,
-or you don't have Service Ping [cron job](#how-service-ping-works) enabled.
-
-To upload payload manually:
-
-1. Sign in as a user with administrator access.
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > Service** usage data.
-1. Select **Download payload**.
-1. Save the JSON file.
-1. Visit [Service usage data center](https://version.gitlab.com/usage_data/new).
-1. Select **Choose file** and choose the file from p5.
-1. Select **Upload**.
-
-The uploaded file is encrypted and sent using secure [HTTPS protocol](https://en.wikipedia.org/wiki/HTTPS). HTTPS creates a secure
-communication channel between web browser and the server, and protects transmitted data against man-in-the-middle attacks.
-
## Monitoring
Service Ping reporting process state is monitored with [internal SiSense dashboard](https://app.periscopedata.com/app/gitlab/968489/Product-Intelligence---Service-Ping-Health).
-## Troubleshooting
-
-### Cannot disable Service Ping using the configuration file
-
-The method to disable Service Ping using the GitLab configuration file does not work in
-GitLab versions 9.3.0 to 13.12.3. To disable it, you must use the Admin Area in
-the GitLab UI instead. For more information, see
-[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333269).
-
-GitLab functionality and application settings cannot override or circumvent
-restrictions at the network layer. If Service Ping is blocked by your firewall,
-you are not impacted by this bug.
-
-#### Check if you are affected
-
-You can check if you were affected by this bug by using the Admin Area or by
-checking the configuration file of your GitLab instance:
-
-- Using the Admin Area:
-
- 1. On the top bar, select **Menu > Admin**.
- 1. On the left sidebar, select **Settings > Metrics and profiling**.
- 1. Expand **Usage Statistics**.
- 1. Are you able to check or uncheck the checkbox to disable Service Ping?
-
- - If _yes_, your GitLab instance is not affected by this bug.
- - If you can't check or uncheck the checkbox, you are affected by this bug.
- See the steps on [how to fix this](#how-to-fix-the-cannot-disable-service-ping-bug).
-
-- Checking your GitLab instance configuration file:
-
- To check whether you're impacted by this bug, check your instance configuration
- settings. The configuration file in which Service Ping can be disabled depends
- on your installation and deployment method, but is typically one of the following:
-
- - `/etc/gitlab/gitlab.rb` for Omnibus GitLab Linux Package and Docker.
- - `charts.yaml` for GitLab Helm and cloud-native Kubernetes deployments.
- - `gitlab.yml` for GitLab installations from source.
-
- To check the relevant configuration file for strings that indicate whether
- Service Ping is disabled, you can use `grep`:
-
- ```shell
- # Linux package
- grep "usage_ping_enabled'\] = false" /etc/gitlab/gitlab.rb
-
- # Kubernetes charts
- grep "enableUsagePing: false" values.yaml
-
- # From source
- grep "usage_ping_enabled'\] = false" gitlab/config.yml
- ```
-
- If you see any output after running the relevant command, your GitLab instance
- may be affected by the bug. Otherwise, your instance is not affected.
-
-#### How to fix the "Cannot disable Service Ping" bug
-
-To work around this bug, you have two options:
-
-- [Update](../../update/index.md) to GitLab 13.12.4 or newer to fix this bug.
-- If you can't update to GitLab 13.12.4 or newer, enable Service Ping in the
- configuration file, then disable Service Ping in the UI. For example, if you're
- using the Linux package:
-
- 1. Edit `/etc/gitlab/gitlab.rb`:
-
- ```ruby
- gitlab_rails['usage_ping_enabled'] = true
- ```
-
- 1. Reconfigure GitLab:
-
- ```shell
- sudo gitlab-ctl reconfigure
- ```
-
- 1. In GitLab, on the top bar, select **Menu > Admin**.
- 1. On the left sidebar, select **Settings > Metrics and profiling**.
- 1. Expand **Usage Statistics**.
- 1. Clear the **Enable Service Ping** checkbox.
- 1. Select **Save Changes**.
-
## Related topics
- [Product Intelligence Guide](https://about.gitlab.com/handbook/product/product-intelligence-guide/)
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
index ab3d301908b..ead11a412fa 100644
--- a/doc/development/service_ping/metrics_dictionary.md
+++ b/doc/development/service_ping/metrics_dictionary.md
@@ -25,7 +25,7 @@ All metrics are stored in YAML files:
- [`config/metrics`](https://gitlab.com/gitlab-org/gitlab/-/tree/master/config/metrics)
WARNING:
-Only metrics with a metric definition YAML are added to the Service Ping JSON payload.
+Only metrics with a metric definition YAML and whose status is not `removed` are added to the Service Ping JSON payload.
Each metric is defined in a separate YAML file consisting of a number of fields:
@@ -50,6 +50,7 @@ Each metric is defined in a separate YAML file consisting of a number of fields:
| `milestone` | no | The milestone when the metric is introduced and when it's available to self-managed instances with the official GitLab release. |
| `milestone_removed` | no | The milestone when the metric is removed. |
| `introduced_by_url` | no | The URL to the merge request that introduced the metric to be available for self-managed instances. |
+| `removed_by_url` | no | The URL to the merge request that removed the metric. |
| `repair_issue_url` | no | The URL of the issue that was created to repair a metric with a `broken` status. |
| `options` | no | `object`: options information needed to calculate the metric value. |
| `skip_validation` | no | This should **not** be set. [Used for imported metrics until we review, update and make them valid](https://gitlab.com/groups/gitlab-org/-/epics/5425). |
@@ -131,7 +132,7 @@ which has a related schema in `/config/metrics/objects_schemas/topology_schema.j
We use the following categories to classify a metric:
- `operational`: Required data for operational purposes.
-- `optional`: Default value for a metric. Data that is optional to collect. This can be [enabled or disabled](../service_ping/index.md#disable-service-ping) in the Admin Area.
+- `optional`: Default value for a metric. Data that is optional to collect. This can be [enabled or disabled](../../user/admin_area/settings/usage_statistics.md#enable-or-disable-usage-statistics) in the Admin Area.
- `subscription`: Data related to licensing.
- `standard`: Standard set of identifiers that are included when collecting data.
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
index 3d56f3e777f..e718d972fba 100644
--- a/doc/development/service_ping/metrics_instrumentation.md
+++ b/doc/development/service_ping/metrics_instrumentation.md
@@ -26,7 +26,7 @@ A metric definition has the [`instrumentation_class`](metrics_dictionary.md) fie
The defined instrumentation class should inherit one of the existing metric classes: `DatabaseMetric`, `RedisMetric`, `RedisHLLMetric`, or `GenericMetric`.
-The current convention is that a single instrumentation class corresponds to a single metric. On a rare occasions, there are exceptions to that convention like [Redis metrics](#redis-metrics). To use a single instrumentation class for more than one metric, please reach out to one of the `@gitlab-org/growth/product-intelligence/engineers` members to consult about your case.
+The current convention is that a single instrumentation class corresponds to a single metric. On a rare occasions, there are exceptions to that convention like [Redis metrics](#redis-metrics). To use a single instrumentation class for more than one metric, please reach out to one of the `@gitlab-org/growth/product-intelligence/engineers` members to consult about your case.
Using the instrumentation classes ensures that metrics can fail safe individually, without breaking the entire
process of Service Ping generation.
@@ -40,6 +40,7 @@ We have built a domain-specific language (DSL) to define the metrics instrumenta
- `start`: Specifies the start value of the batch counting, by default is `relation.minimum(:id)`.
- `finish`: Specifies the end value of the batch counting, by default is `relation.maximum(:id)`.
- `cache_start_and_finish_as`: Specifies the cache key for `start` and `finish` values and sets up caching them. Use this call when `start` and `finish` are expensive queries that should be reused between different metric calculations.
+- `available?`: Specifies whether the metric should be reported. The default is `true`.
[Example of a merge request that adds a database metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60022).
@@ -123,6 +124,37 @@ options:
counter_class: SourceCodeCounter
```
+### Availability-restrained Redis metrics
+
+If the Redis metric should only be available in the report under some conditions, then you must specify these conditions in a new class that is a child of the `RedisMetric` class.
+
+```ruby
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class MergeUsageCountRedisMetric < RedisMetric
+ available? { Feature.enabled?(:merge_usage_data_missing_key_paths) }
+ end
+ end
+ end
+ end
+end
+```
+
+You must also use the class's name in the YAML setup.
+
+```yaml
+time_frame: all
+data_source: redis
+instrumentation_class: 'MergeUsageCountRedisMetric'
+options:
+ event: pushes
+ counter_class: SourceCodeCounter
+```
+
## Redis HyperLogLog metrics
[Example of a merge request that adds a `RedisHLL` metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61685).
@@ -138,8 +170,42 @@ options:
- i_quickactions_approve
```
+### Availability-restrained Redis HyperLogLog metrics
+
+If the Redis HyperLogLog metric should only be available in the report under some conditions, then you must specify these conditions in a new class that is a child of the `RedisHLLMetric` class.
+
+```ruby
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class MergeUsageCountRedisHLLMetric < RedisHLLMetric
+ available? { Feature.enabled?(:merge_usage_data_missing_key_paths) }
+ end
+ end
+ end
+ end
+end
+```
+
+You must also use the class's name in the YAML setup.
+
+```yaml
+time_frame: 28d
+data_source: redis_hll
+instrumentation_class: 'MergeUsageCountRedisHLLMetric'
+options:
+ events:
+ - i_quickactions_approve
+```
+
## Generic metrics
+- `value`: Specifies the value of the metric.
+- `available?`: Specifies whether the metric should be reported. The default is `true`.
+
[Example of a merge request that adds a generic metric](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60256).
```ruby
diff --git a/doc/development/service_ping/metrics_lifecycle.md b/doc/development/service_ping/metrics_lifecycle.md
index 844c989c640..c9cc9a4f2d2 100644
--- a/doc/development/service_ping/metrics_lifecycle.md
+++ b/doc/development/service_ping/metrics_lifecycle.md
@@ -113,6 +113,7 @@ To remove a metric:
update the attributes of the metric's YAML definition:
- Set the `status:` to `removed`.
+ - Set `removed_by_url:` to the URL of the MR removing the metric
- Set `milestone_removed:` to the number of the
milestone in which the metric was removed.
diff --git a/doc/development/service_ping/troubleshooting.md b/doc/development/service_ping/troubleshooting.md
index 15bc01f1270..2764ef41f98 100644
--- a/doc/development/service_ping/troubleshooting.md
+++ b/doc/development/service_ping/troubleshooting.md
@@ -22,10 +22,91 @@ The alert compares the current daily value with the daily value from previous we
You can use [this query](https://gitlab.com/gitlab-org/gitlab/-/issues/347298#note_836685350) as an example, to start detecting when the drop started.
-### Troubleshooting GitLab application layer
+### Troubleshoot the GitLab application layer
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).
-### Troubleshooting data warehouse layer
+### 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).
+
+### Cannot disable Service Ping with the configuration file
+
+The method to disable Service Ping with the GitLab configuration file does not work in
+GitLab versions 9.3.0 to 13.12.3. To disable it, you must use the Admin Area in
+the GitLab UI instead. For more information, see
+[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/333269).
+
+GitLab functionality and application settings cannot override or circumvent
+restrictions at the network layer. If Service Ping is blocked by your firewall,
+you are not impacted by this bug.
+
+#### Check if you are affected
+
+You can check if you were affected by this bug by using the Admin Area or by
+checking the configuration file of your GitLab instance:
+
+- Using the Admin Area:
+
+ 1. On the top bar, select **Menu > Admin**.
+ 1. On the left sidebar, select **Settings > Metrics and profiling**.
+ 1. Expand **Usage Statistics**.
+ 1. Are you able to check or uncheck the checkbox to disable Service Ping?
+
+ - If _yes_, your GitLab instance is not affected by this bug.
+ - If you can't check or uncheck the checkbox, you are affected by this bug.
+ See the steps on [how to fix this](#how-to-fix-the-cannot-disable-service-ping-bug).
+
+- Checking your GitLab instance configuration file:
+
+ To check whether you're impacted by this bug, check your instance configuration
+ settings. The configuration file in which Service Ping can be disabled depends
+ on your installation and deployment method, but is typically one of the following:
+
+ - `/etc/gitlab/gitlab.rb` for Omnibus GitLab Linux Package and Docker.
+ - `charts.yaml` for GitLab Helm and cloud-native Kubernetes deployments.
+ - `gitlab.yml` for GitLab installations from source.
+
+ To check the relevant configuration file for strings that indicate whether
+ Service Ping is disabled, you can use `grep`:
+
+ ```shell
+ # Linux package
+ grep "usage_ping_enabled'\] = false" /etc/gitlab/gitlab.rb
+
+ # Kubernetes charts
+ grep "enableUsagePing: false" values.yaml
+
+ # From source
+ grep "usage_ping_enabled'\] = false" gitlab/config.yml
+ ```
+
+ If you see any output after running the relevant command, your GitLab instance
+ may be affected by the bug. Otherwise, your instance is not affected.
+
+#### How to fix the "Cannot disable Service Ping" bug
+
+To work around this bug, you have two options:
+
+- [Update](../../update/index.md) to GitLab 13.12.4 or newer to fix this bug.
+- If you can't update to GitLab 13.12.4 or newer, enable Service Ping in the
+ configuration file, then disable Service Ping in the UI. For example, if you're
+ using the Linux package:
+
+ 1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['usage_ping_enabled'] = true
+ ```
+
+ 1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+ 1. In GitLab, on the top bar, select **Menu > Admin**.
+ 1. On the left sidebar, select **Settings > Metrics and profiling**.
+ 1. Expand **Usage Statistics**.
+ 1. Clear the **Enable Service Ping** checkbox.
+ 1. Select **Save Changes**.
diff --git a/doc/development/sidekiq/idempotent_jobs.md b/doc/development/sidekiq/idempotent_jobs.md
index 38db22f8467..a5ae8737ad1 100644
--- a/doc/development/sidekiq/idempotent_jobs.md
+++ b/doc/development/sidekiq/idempotent_jobs.md
@@ -135,7 +135,7 @@ happened. See [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/342123)
GitLab doesn't skip jobs scheduled in the future, as we assume that
the state has changed by the time the job is scheduled to
-execute. Deduplication of jobs scheduled in the feature is possible
+execute. Deduplication of jobs scheduled in the future is possible
for both `until_executed` and `until_executing` strategies.
If you do want to deduplicate jobs scheduled in the future,
diff --git a/doc/development/sidekiq_style_guide.md b/doc/development/sidekiq_style_guide.md
deleted file mode 100644
index 1b5e7addf29..00000000000
--- a/doc/development/sidekiq_style_guide.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'sidekiq/index.md'
-remove_date: '2022-04-13'
----
-
-This document was moved to [another location](sidekiq/index.md).
-
-<!-- This redirect file can be deleted after <2022-04-13>. -->
-<!-- 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/snowplow/implementation.md b/doc/development/snowplow/implementation.md
index 162b77772f9..f4123e3ba86 100644
--- a/doc/development/snowplow/implementation.md
+++ b/doc/development/snowplow/implementation.md
@@ -36,7 +36,7 @@ as base:
_\* Undergoes a pseudonymization process at the collector level._
-These properties [are overriden](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/get_standard_context.js)
+These properties [are overridden](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/get_standard_context.js)
with frontend-specific values, like `source` (`gitlab-javascript`), `google_analytics_id`
and the custom `extra` object. You can modify this object for any subsequent
structured event that fires, although this is not recommended.
@@ -83,7 +83,7 @@ The following example shows `data-track-*` attributes assigned to a button:
| `data-track-action` | true | Action the user is taking. Clicks must be prepended with `click` and activations must be prepended with `activate`. For example, focusing a form field is `activate_form_input` and clicking a button is `click_button`. Replaces `data-track-event`, which was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290962) in GitLab 13.11. |
| `data-track-label` | false | The specific element or object to act on. This can be: the label of the element, for example, a tab labeled 'Create from template' for `create_from_template`; a unique identifier if no text is available, for example, `groups_dropdown_close` for closing the Groups dropdown in the top bar; or the name or title attribute of a record being created. |
| `data-track-property` | false | Any additional property of the element, or object being acted on. |
-| `data-track-value` | false | Describes a numeric value (decimal) directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. If omitted, this is the element's `value` property or `undefined`. For checkboxes, the default value is the element's checked attribute or `0` when unchecked. The value is parsed as numeric before sendind the event. |
+| `data-track-value` | false | Describes a numeric value (decimal) directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. If omitted, this is the element's `value` property or `undefined`. For checkboxes, the default value is the element's checked attribute or `0` when unchecked. The value is parsed as numeric before sending the event. |
| `data-track-extra` | false | A key-value pair object passed as a valid JSON string. This attribute is added to the `extra` property in our [`gitlab_standard`](schemas.md#gitlab_standard) schema. |
| `data-track-context` | false | To append a custom context object, passed as a valid JSON string. |
@@ -97,10 +97,12 @@ If click events stop propagating, you must implement listeners and [Vue componen
#### Helper methods
-You can use the following Ruby helper:
+You can use the following Ruby helpers:
```ruby
tracking_attrs(label, action, property) # { data: { track_label... } }
+
+tracking_attrs_data(label, action, property) # { track_label... }
```
You can also use it on HAML templates:
@@ -108,8 +110,8 @@ You can also use it on HAML templates:
```haml
%button{ **tracking_attrs('main_navigation', 'click_button', 'navigation') }
-// When adding additional data
-// %button{ data: { platform: "...", **tracking_attrs('main_navigation', 'click_button', 'navigation') } }
+// When merging with additional data
+// %button{ data: { platform: "...", **tracking_attrs_data('main_navigation', 'click_button', 'navigation') } }
```
If you use the GitLab helper method [`nav_link`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/tab_helper.rb#L76), you must wrap `html_options` under the `html_options` keyword argument. If you
diff --git a/doc/development/snowplow/troubleshooting.md b/doc/development/snowplow/troubleshooting.md
index 47d775d89aa..2a6db80a6f2 100644
--- a/doc/development/snowplow/troubleshooting.md
+++ b/doc/development/snowplow/troubleshooting.md
@@ -21,7 +21,7 @@ While on CloudWatch dashboard set time range to last 4 weeks, to get better pict
1. `ELB New Flow Count` and `Collector Auto Scaling Group Network In/Out` - they show in order: number of connections to collectors via load balancers and data volume (in bytes) processed by collectors. If there is drop visible there, it means less events were fired from the GitLab application. Proceed to [application layer guide](#troubleshooting-gitlab-application-layer) for more details
1. `Firehose Records to S3` - it shows how many event records were saved to S3 bucket, if there was drop on this chart but not on the charts from 1. it means that problem is located at AWS infrastructure layer, please refer to [AWS layer guide](#troubleshooting-aws-layer)
-1. If drop wasn't visible on any of previous charts it means that probelm is at data warehouse layer, please refer to [data warehouse layer guide](#troubleshooting-data-warehouse-layer)
+1. If drop wasn't visible on any of previous charts it means that problem is at data warehouse layer, please refer to [data warehouse layer guide](#troubleshooting-data-warehouse-layer)
### Troubleshooting GitLab application layer
@@ -48,3 +48,27 @@ Already conducted investigations:
### Troubleshooting data warehouse layer
Reach out to [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)
+
+## Delay in Snowplow Enrichers
+
+If there is an alert for **Snowplow Raw Good Stream Backing Up**, we receive an email notification. This sometimes happens because Snowplow Enrichers don't scale well enough for the amount of Snowplow events.
+
+If the delay goes over 48 hours, we lose data.
+
+### Contact SRE on-call
+
+Send a message in the [#infrastructure_lounge](https://gitlab.slack.com/archives/CB3LSMEJV) Slack channel using the following template:
+
+```markdown
+Hello team!
+
+We received an alert for [Snowplow Raw Good Stream Backing Up](https://us-east-1.console.aws.amazon.com/cloudwatch/home?region=us-east-1#alarmsV2:alarm/SnowPlow+Raw+Good+Stream+Backing+Up?).
+
+Enrichers are not scalling well for the amount of events we receive.
+
+See the [dashboard](https://us-east-1.console.aws.amazon.com/cloudwatch/home?region=us-east-1#dashboards:name=SnowPlow).
+
+Could we get assistance in order to fix the delay?
+
+Thank you!
+```
diff --git a/doc/development/testing_guide/end_to_end/beginners_guide.md b/doc/development/testing_guide/end_to_end/beginners_guide.md
index 27a87d25170..39a3e3445ea 100644
--- a/doc/development/testing_guide/end_to_end/beginners_guide.md
+++ b/doc/development/testing_guide/end_to_end/beginners_guide.md
@@ -49,7 +49,7 @@ For information about the distribution of tests per level in GitLab, see
- Review how often the feature changes. Stable features that don't change very often
might not be worth covering with end-to-end tests if they are already covered
in lower level tests.
-- Finally, discuss the proposed test with the developer(s) involved in implementing
+- Finally, discuss the proposed test with the developers involved in implementing
the feature and the lower-level tests.
WARNING:
diff --git a/doc/development/testing_guide/end_to_end/feature_flags.md b/doc/development/testing_guide/end_to_end/feature_flags.md
index 47ebef37a4d..b4ec9e8ccd3 100644
--- a/doc/development/testing_guide/end_to_end/feature_flags.md
+++ b/doc/development/testing_guide/end_to_end/feature_flags.md
@@ -23,7 +23,7 @@ Please be sure to include the `feature_flag` tag so that the test can be skipped
`name`
- Format: `feature_flag: { name: 'feature_flag_name' }`
-- Used only for informational purposes at this time. It should be included to help quickly determine what
+- Used only for informational purposes at this time. It should be included to help quickly determine what
feature flag is under test.
`scope`
@@ -31,28 +31,28 @@ feature flag is under test.
- Format: `feature_flag: { name: 'feature_flag_name', scope: :project }`
- When `scope` is set to `:global`, the test will be **skipped on all live .com environments**. This is to avoid issues with feature flag changes affecting other tests or users on that environment.
- When `scope` is set to any other value (such as `:project`, `:group` or `:user`), or if no `scope` is specified, the test will only be **skipped on canary and production**.
-This is due to the fact that admin access is not available there.
+This is due to the fact that administrator access is not available there.
**WARNING:** You are strongly advised to first try and [enable feature flags only for a group, project, user](../../feature_flags/index.md#feature-actors),
or [feature group](../../feature_flags/index.md#feature-groups).
-- If a global feature flag must be used, it is strongly recommended to apply `scope: :global` to the `feature_flag` metadata. This is, however, left up to the SET's discretion to determine the level of risk.
- - For example, a test uses a global feature flag that only affects a small area of the application and is also needed to check for critical issues on live environments.
- In such a scenario, it would be riskier to skip running the test. For cases like this, `scope` can be left out of the metadata so that it can still run in live environments
- with admin access, such as staging.
+- If a global feature flag must be used, it is strongly recommended to apply `scope: :global` to the `feature_flag` metadata. This is, however, left up to the SET's discretion to determine the level of risk.
+ - For example, a test uses a global feature flag that only affects a small area of the application and is also needed to check for critical issues on live environments.
+ In such a scenario, it would be riskier to skip running the test. For cases like this, `scope` can be left out of the metadata so that it can still run in live environments
+ with administrator access, such as staging.
-**Note on `requires_admin`:** This tag should still be applied if there are other actions within the test that require admin access that are unrelated to updating a
+**Note on `requires_admin`:** This tag should still be applied if there are other actions within the test that require administrator access that are unrelated to updating a
feature flag (ex: creating a user via the API).
The code below would enable a feature flag named `:feature_flag_name` for the project
created by the test:
```ruby
-RSpec.describe "with feature flag enabled", feature_flag: {
- name: 'feature_flag_name',
- scope: :project
+RSpec.describe "with feature flag enabled", feature_flag: {
+ name: 'feature_flag_name',
+ scope: :project
} do
-
+
let(:project) { Resource::Project.fabricate_via_api! }
before do
diff --git a/doc/development/testing_guide/end_to_end/index.md b/doc/development/testing_guide/end_to_end/index.md
index 1e7cba9d247..9730115fd9f 100644
--- a/doc/development/testing_guide/end_to_end/index.md
+++ b/doc/development/testing_guide/end_to_end/index.md
@@ -147,11 +147,11 @@ as well as these:
| Variable | Description |
|-|-|
| `QA_SCENARIO` | The scenario to run (default `Test::Instance::Image`) |
-| `QA_TESTS` | The test(s) to run (no default, which means run all the tests in the scenario). Use file paths as you would when running tests via RSpec, for example, `qa/specs/features/ee/browser_ui` would include all the `EE` UI tests. |
+| `QA_TESTS` | The tests to run (no default, which means run all the tests in the scenario). Use file paths as you would when running tests via RSpec, for example, `qa/specs/features/ee/browser_ui` would include all the `EE` UI tests. |
| `QA_RSPEC_TAGS` | The RSpec tags to add (no default) |
-For now [manual jobs with custom variables don't use the same variable
-when retried](https://gitlab.com/gitlab-org/gitlab/-/issues/31367), so if you want to run the same test(s) multiple times,
+For now, [manual jobs with custom variables don't use the same variable
+when retried](https://gitlab.com/gitlab-org/gitlab/-/issues/31367), so if you want to run the same tests multiple times,
specify the same variables in each `custom-parallel` job (up to as
many of the 10 available jobs that you want to run).
diff --git a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
index 45161404c73..0163f2e648c 100644
--- a/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
+++ b/doc/development/testing_guide/end_to_end/rspec_metadata_tests.md
@@ -21,8 +21,8 @@ This is a partial list of the [RSpec metadata](https://relishapp.com/rspec/rspec
| `:github` | The test requires a GitHub personal access token. |
| `:group_saml` | The test requires a GitLab instance that has SAML SSO enabled at the group level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
| `:instance_saml` | The test requires a GitLab instance that has SAML SSO enabled at the instance level. Interacts with an external SAML identity provider. Paired with the `:orchestrated` tag. |
-| `:integrations` | This aims to test the available [integrations](../../../user/project/integrations/overview.md#integrations-listing). The test requires Docker to be installed in the run context. It will provision the containers and can be run against a local instance or using the `gitlab-qa` scenario `Test::Integration::Integrations` |
-| `:service_ping_disabled` | The test interacts with the GitLab configuration service ping at the instance level to turn admin setting service ping checkbox on or off. This tag will have the test run only in the `service_ping_disabled` job and must be paired with the `:orchestrated` and `:requires_admin` tags. |
+| `:integrations` | This aims to test the available [integrations](../../../user/project/integrations/index.md#available-integrations). The test requires Docker to be installed in the run context. It will provision the containers and can be run against a local instance or using the `gitlab-qa` scenario `Test::Integration::Integrations` |
+| `:service_ping_disabled` | The test interacts with the GitLab configuration service ping at the instance level to turn Admin Area setting service ping checkbox on or off. This tag will have the test run only in the `service_ping_disabled` job and must be paired with the `:orchestrated` and `:requires_admin` tags. |
| `:jira` | The test requires a Jira Server. [GitLab-QA](https://gitlab.com/gitlab-org/gitlab-qa) provisions the Jira Server in a Docker container when the `Test::Integration::Jira` test scenario is run. |
| `:kubernetes` | The test includes a GitLab instance that is configured to be run behind an SSH tunnel, allowing a TLS-accessible GitLab. This test also includes provisioning of at least one Kubernetes cluster to test against. _This tag is often be paired with `:orchestrated`._ |
| `:ldap_no_server` | The test requires a GitLab instance to be configured to use LDAP. To be used with the `:orchestrated` tag. It does not spin up an LDAP server at orchestration time. Instead, it creates the LDAP server at runtime. |
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index d03a4976a8c..d91c53823e2 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -297,7 +297,7 @@ it('tests a promise rejection', async () => {
You can also simply return a promise from the test function.
Using the `done` and `done.fail` callbacks is discouraged when working with
-promises. They should only be used when testing callback-based code.
+promises. They should not be used.
**Bad**:
@@ -466,18 +466,22 @@ it('waits for an Ajax call', () => {
#### Vue rendering
-To wait until a Vue component is re-rendered, use either of the equivalent
-[`Vue.nextTick()`](https://vuejs.org/v2/api/#Vue-nextTick) or `vm.$nextTick()`.
+Use [`nextTick()`](https://vuejs.org/v2/api/#Vue-nextTick) to wait until a Vue component is
+re-rendered.
**in Jest:**
```javascript
-it('renders something', () => {
+import { nextTick } from 'vue';
+
+// ...
+
+it('renders something', async () => {
wrapper.setProps({ value: 'new value' });
- return wrapper.vm.$nextTick().then(() => {
- expect(wrapper.text()).toBe('new value');
- });
+ await nextTick();
+
+ expect(wrapper.text()).toBe('new value');
});
```
@@ -487,15 +491,17 @@ If the application triggers an event that you need to wait for in your test, reg
the assertions:
```javascript
-it('waits for an event', done => {
+it('waits for an event', () => {
eventHub.$once('someEvent', eventHandler);
someFunction();
- function eventHandler() {
- expect(something).toBe('done');
- done();
- }
+ return new Promise((resolve) => {
+ function expectEventHandler() {
+ expect(something).toBe('done');
+ resolve();
+ }
+ });
});
```
@@ -807,11 +813,14 @@ The following are examples of tests that work for Jest:
```javascript
it('uses some HTML element', () => {
- loadFixtures('some/page.html'); // loads spec/frontend/fixtures/some/page.html and adds it to the DOM
+ loadHTMLFixture('some/page.html'); // loads spec/frontend/fixtures/some/page.html and adds it to the DOM
const element = document.getElementById('#my-id');
// ...
+
+ // Jest does not clean up the DOM automatically
+ resetHTMLFixture();
});
```
diff --git a/doc/development/testing_guide/img/k9s.png b/doc/development/testing_guide/img/k9s.png
deleted file mode 100644
index 34585b2a43a..00000000000
--- a/doc/development/testing_guide/img/k9s.png
+++ /dev/null
Binary files differ
diff --git a/doc/development/testing_guide/review_apps.md b/doc/development/testing_guide/review_apps.md
index f5483a4b79c..ff4b77dec2c 100644
--- a/doc/development/testing_guide/review_apps.md
+++ b/doc/development/testing_guide/review_apps.md
@@ -16,6 +16,7 @@ For any of the following scenarios, the `start-review-app-pipeline` job would be
- for merge requests with frontend changes
- for merge requests with changes to `{,ee/,jh/}{app/controllers}/**/*`
- for merge requests with changes to `{,ee/,jh/}{app/models}/**/*`
+- for merge requests with changes to `{,ee/,jh/}lib/{,ee/,jh/}gitlab/**/*`
- for merge requests with QA changes
- for scheduled pipelines
- the MR has the `pipeline:run-review-app` label set
@@ -198,7 +199,7 @@ subgraph "CNG-mirror pipeline"
issue with a link to your merge request. Note that the deployment failure can
reveal an actual problem introduced in your merge request (that is, this isn't
necessarily a transient failure)!
-- If the `review-qa-smoke` or `review-qa-reliable` job keeps failing (note that we already retry them once),
+- If the `review-qa-smoke` or `review-qa-reliable` job keeps failing,
please check the job's logs: you could discover an actual problem introduced in
your merge request. You can also download the artifacts to see screenshots of
the page at the time the failures occurred. If you don't find the cause of the
diff --git a/doc/development/testing_guide/testing_migrations_guide.md b/doc/development/testing_guide/testing_migrations_guide.md
index 4092c1a2f6d..d71788e21f3 100644
--- a/doc/development/testing_guide/testing_migrations_guide.md
+++ b/doc/development/testing_guide/testing_migrations_guide.md
@@ -227,6 +227,18 @@ expect('MigrationClass').to have_scheduled_batched_migration(
)
```
+#### `be_finalize_background_migration_of`
+
+Verifies that a migration calls `finalize_background_migration` with the expected background migration class.
+
+```ruby
+# Migration
+finalize_background_migration('MigrationClass')
+
+# Spec
+expect(described_class).to be_finalize_background_migration_of('MigrationClass')
+```
+
### Examples of migration tests
Migration tests depend on what the migration does exactly, the most common types are data migrations and scheduling background migrations.
diff --git a/doc/development/uploads/background.md b/doc/development/uploads/background.md
index e68e4127b57..1ad1aec23f2 100644
--- a/doc/development/uploads/background.md
+++ b/doc/development/uploads/background.md
@@ -1,154 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'index.md'
+remove_date: '2022-07-25'
---
-# Uploads guide: Why GitLab uses custom upload logic
+This document was moved to [another location](index.md).
-This page is for developers trying to better understand the history behind GitLab uploads and the
-technical challenges associated with uploads.
-
-## Problem description
-
-GitLab and [GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) use special rules for handling file uploads,
-because in an ordinary Rails application file uploads can become expensive as files grow in size.
-Rails often sacrifices performance to provide a better developer experience, including how it handles
-`multipart/form-post` uploads. In any Rack server, Rails applications included, when such a request arrives at the application server,
-several things happen:
-
-1. A [Rack middleware](https://github.com/rack/rack/blob/main/lib/rack/multipart.rb) intercepts the request and parses the request body.
-1. The middleware writes each file in the multipart request to a temporary directory on disk.
-1. A `params` hash is constructed with entries pointing to the respective files on disk.
-1. A Rails controller acts on the file contents.
-
-While this is convenient for developers, it is costly for the Ruby server process to buffer large files on disk.
-Because of Ruby's [global interpreter lock](https://en.wikipedia.org/wiki/Global_interpreter_lock),
-only a single thread of execution of a given Ruby process can be on CPU. This means the amount of CPU
-time spent doing this is not available to other worker threads serving user requests.
-Buffering files to disk also means spending more time in I/O routines and mode switches, which are expensive operations.
-
-The following diagram shows how GitLab handled such a request prior to putting optimizations in place.
-
-```mermaid
-graph TB
- subgraph "load balancers"
- LB(Proxy)
- end
-
- subgraph "Shared storage"
- nfs(NFS)
- end
-
- subgraph "redis cluster"
- r(persisted redis)
- end
- LB-- 1 -->Workhorse
-
- subgraph "web or API fleet"
- Workhorse-- 2 -->rails
- end
- rails-- "3 (write files)" -->nfs
- rails-- "4 (schedule a job)" -->r
-
- subgraph sidekiq
- s(sidekiq)
- end
- s-- "5 (fetch a job)" -->r
- s-- "6 (read files)" -->nfs
-```
-
-We went through two major iterations of our uploads architecture to improve on these problems:
-
-1. [Moving disk buffering to Workhorse.](#moving-disk-buffering-to-workhorse)
-1. [Uploading to Object Storage from Workhorse.](#moving-to-object-storage-and-direct-uploads)
-
-### Moving disk buffering to Workhorse
-
-To address the performance issues resulting from buffering files in Ruby, we moved this logic to Workhorse instead,
-our reverse proxy fronting the GitLab Rails application.
-Workhorse is written in Go, and is much better at dealing with stream processing and I/O than Rails.
-
-There are two parts to this implementation:
-
-1. In Workhorse, a request handler detects `multipart/form-data` content in an incoming user request.
- If such a request is detected, Workhorse hijacks the request body before forwarding it to Rails.
- Workhorse writes all files to disk, rewrites the multipart form fields to point to the new locations, signs the
- request, then forwards it to Rails.
-1. In Rails, a [custom multipart Rack middleware](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/middleware/multipart.rb)
- identifies any signed multipart requests coming from Workhorse and prepares the `params` hash Rails
- would expect, now pointing to the files cached by Workhorse. This makes it a drop-in replacement for `Rack::Multipart`.
-
-The diagram below shows how GitLab handles such a request today:
-
-```mermaid
-graph TB
- subgraph "load balancers"
- LB(HA Proxy)
- end
-
- subgraph "Shared storage"
- nfs(NFS)
- end
-
- subgraph "redis cluster"
- r(persisted redis)
- end
- LB-- 1 -->Workhorse
-
- subgraph "web or API fleet"
- Workhorse-- "3 (without files)" -->rails
- end
- Workhorse -- "2 (write files)" -->nfs
- rails-- "4 (schedule a job)" -->r
-
- subgraph sidekiq
- s(sidekiq)
- end
- s-- "5 (fetch a job)" -->r
- s-- "6 (read files)" -->nfs
-```
-
-While this "one-size-fits-all" solution greatly improves performance for multipart uploads without compromising
-developer ergonomics, it severely limits GitLab [availability](#availability-challenges)
-and [scalability](#scalability-challenges).
-
-#### Availability challenges
-
-Moving file buffering to Workhorse addresses the immediate performance problems stemming from Ruby not being good at
-handling large file uploads. However, a remaining issue of this solution is its reliance on attached storage,
-whether via ordinary hard drives or network attached storage like NFS.
-NFS is a [single point of failure](https://en.wikipedia.org/wiki/Single_point_of_failure), and is unsuitable for
-deploying GitLab in highly available, cloud native environments.
-
-#### Scalability challenges
-
-NFS is not a part of cloud native installations, such as those running in Kubernetes.
-In Kubernetes, machine boundaries translate to pods, and without network-attached storage, disk-buffered uploads
-must be written directly to the pod's file system.
-
-Using disk buffering presents us with a scalability challenge here. If Workhorse can only
-write files to a pod's private file system, then these files are inaccessible outside of this particular pod.
-With disk buffering, a Rails controller will accept a file upload and enqueue it for upload in a Sidekiq
-background job. Therefore, Sidekiq requires access to these files.
-However, in a cloud native environment all Sidekiq instances run on separate pods, so they are
-not able to access files buffered to disk on a web server pod.
-
-Therefore, all features that involve Sidekiq uploading disk-buffered files severely limit the scalability of GitLab.
-
-## Moving to object storage and direct uploads
-
-To address these availability and scalability problems,
-instead of buffering files to disk, we have added support for uploading files directly
-from Workhorse to a given destination. While it remains possible to upload to local or network-attached storage
-this way, you should use a highly available
-[object store](https://en.wikipedia.org/wiki/Object_storage),
-such as AWS S3, Google GCS, or Azure, for scalability reasons.
-
-With direct uploads, Workhorse does not buffer files to disk. Instead, it first authorizes the request with
-the Rails application to find out where to upload it, then streams the file directly to its ultimate destination.
-
-To learn more about how disk buffering and direct uploads are implemented, see:
-
-- [How uploads work technically](implementation.md)
-- [Adding new uploads](working_with_uploads.md)
+<!-- This redirect file can be deleted after <2022-07-25>. -->
+<!-- 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/uploads/implementation.md b/doc/development/uploads/implementation.md
index 13a875cd1af..1ad1aec23f2 100644
--- a/doc/development/uploads/implementation.md
+++ b/doc/development/uploads/implementation.md
@@ -1,190 +1,11 @@
---
-stage: none
-group: unassigned
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'index.md'
+remove_date: '2022-07-25'
---
-# Uploads guide: How uploads work technically
+This document was moved to [another location](index.md).
-This page is for developers trying to better understand what kinds of uploads exist in GitLab and how they are implemented.
-
-## Kinds of uploads and how to choose between them
-
-We can identify three major use-cases for an upload:
-
-1. **storage:** if we are uploading for storing a file (like artifacts, packages, or discussion attachments). In this case [direct upload](#direct-upload) is the proper level as it's the less resource-intensive operation. Additional information can be found on [File Storage in GitLab](../file_storage.md).
-1. **in-controller/synchronous processing:** if we allow processing **small files** synchronously, using [disk buffered upload](#disk-buffered-upload) may speed up development.
-1. **Sidekiq/asynchronous processing:** Asynchronous processing must implement [direct upload](#direct-upload), the reason being that it's the only way to support Cloud Native deployments without a shared NFS.
-
-Selecting the proper acceleration is a tradeoff between speed of development and operational costs.
-
-For more details about currently broken feature see [epic &1802](https://gitlab.com/groups/gitlab-org/-/epics/1802).
-
-### Handling repository uploads
-
-Some features involves Git repository uploads without using a regular Git client.
-Some examples are uploading a repository file from the web interface and [design management](../../user/project/issues/design_management.md).
-
-Those uploads requires the rails controller to act as a Git client in lieu of the user.
-Those operation falls into _in-controller/synchronous processing_ category, but we have no warranties on the file size.
-
-In case of a LFS upload, the file pointer is committed synchronously, but file upload to object storage is performed asynchronously with Sidekiq.
-
-## Upload encodings
-
-By upload encoding we mean how the file is included within the incoming request.
-
-We have three kinds of file encoding in our uploads:
-
-1. <i class="fa fa-check-circle"></i> **multipart**: `multipart/form-data` is the most common, a file is encoded as a part of a multipart encoded request.
-1. <i class="fa fa-check-circle"></i> **body**: some APIs uploads files as the whole request body.
-1. <i class="fa fa-times-circle"></i> **JSON**: some JSON APIs upload files as base64-encoded strings. This requires a change to GitLab Workhorse,
- which is tracked [in this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/325068).
-
-## Uploading technologies
-
-By uploading technologies we mean how all the involved services interact with each other.
-
-GitLab supports 3 kinds of uploading technologies, here follows a brief description with a sequence diagram for each one. Diagrams are not meant to be exhaustive.
-
-### Rack Multipart upload
-
-This is the default kind of upload, and it's the most expensive in terms of resources.
-
-In this case, Workhorse is unaware of files being uploaded and acts as a regular proxy.
-
-When a multipart request reaches the rails application, `Rack::Multipart` leaves behind temporary files in `/tmp` and uses valuable Ruby process time to copy files around.
-
-```mermaid
-sequenceDiagram
- participant c as Client
- participant w as Workhorse
- participant r as Rails
-
- activate c
- c ->>+w: POST /some/url/upload
- w->>+r: POST /some/url/upload
-
- r->>r: save the incoming file on /tmp
- r->>r: read the file for processing
-
- r-->>-c: request result
- deactivate c
- deactivate w
-```
-
-### Disk buffered upload
-
-This kind of upload avoids wasting resources caused by handling upload writes to `/tmp` in rails.
-
-This optimization is not active by default on REST API requests.
-
-When enabled, Workhorse looks for files in multipart MIME requests, uploading
-any it finds to a temporary file on shared storage. The MIME data in the request
-is replaced with the path to the corresponding file before it is forwarded to
-Rails.
-
-To prevent abuse of this feature, Workhorse signs the modified request with a
-special header, stating which entries it modified. Rails ignores any
-unsigned path entries.
-
-```mermaid
-sequenceDiagram
- participant c as Client
- participant w as Workhorse
- participant r as Rails
- participant s as NFS
-
- activate c
- c ->>+w: POST /some/url/upload
-
- w->>+s: save the incoming file on a temporary location
- s-->>-w: request result
-
- w->>+r: POST /some/url/upload
- Note over w,r: file was replaced with its location<br>and other metadata
-
- opt requires async processing
- r->>+redis: schedule a job
- redis-->>-r: job is scheduled
- end
-
- r-->>-c: request result
- deactivate c
- w->>-w: cleanup
-
- opt requires async processing
- activate sidekiq
- sidekiq->>+redis: fetch a job
- redis-->>-sidekiq: job
-
- sidekiq->>+s: read file
- s-->>-sidekiq: file
-
- sidekiq->>sidekiq: process file
-
- deactivate sidekiq
- end
-```
-
-### Direct upload
-
-This is the more advanced acceleration technique we have in place.
-
-Workhorse asks Rails for temporary pre-signed object storage URLs and directly uploads to object storage.
-
-In this setup, an extra Rails route must be implemented in order to handle authorization. Examples of this can be found in:
-
-- [`Projects::LfsStorageController`](https://gitlab.com/gitlab-org/gitlab/-/blob/cc723071ad337573e0360a879cbf99bc4fb7adb9/app/controllers/projects/lfs_storage_controller.rb)
- and [its routes](https://gitlab.com/gitlab-org/gitlab/-/blob/cc723071ad337573e0360a879cbf99bc4fb7adb9/config/routes/git_http.rb#L31-32).
-- [API endpoints for uploading packages](../packages.md#file-uploads).
-
-Direct upload falls back to _disk buffered upload_ when `direct_upload` is disabled inside the [object storage setting](../../administration/uploads.md#object-storage-settings).
-The answer to the `/authorize` call contains only a file system path.
-
-```mermaid
-sequenceDiagram
- participant c as Client
- participant w as Workhorse
- participant r as Rails
- participant os as Object Storage
-
- activate c
- c ->>+w: POST /some/url/upload
-
- w ->>+r: POST /some/url/upload/authorize
- Note over w,r: this request has an empty body
- r-->>-w: presigned OS URL
-
- w->>+os: PUT file
- Note over w,os: file is stored on a temporary location. Rails select the destination
- os-->>-w: request result
-
- w->>+r: POST /some/url/upload
- Note over w,r: file was replaced with its location<br>and other metadata
-
- r->>+os: move object to final destination
- os-->>-r: request result
-
- opt requires async processing
- r->>+redis: schedule a job
- redis-->>-r: job is scheduled
- end
-
- r-->>-c: request result
- deactivate c
- w->>-w: cleanup
-
- opt requires async processing
- activate sidekiq
- sidekiq->>+redis: fetch a job
- redis-->>-sidekiq: job
-
- sidekiq->>+os: get object
- os-->>-sidekiq: file
-
- sidekiq->>sidekiq: process file
-
- deactivate sidekiq
- end
-```
+<!-- This redirect file can be deleted after <2022-07-25>. -->
+<!-- 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/uploads/index.md b/doc/development/uploads/index.md
index c486f2d3689..b8326489d40 100644
--- a/doc/development/uploads/index.md
+++ b/doc/development/uploads/index.md
@@ -6,9 +6,159 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Uploads development guide
-Uploads are an integral part of many GitLab features. To understand how GitLab handles uploads, refer to
-the following pages:
+Uploads are an integral part of many GitLab features. To understand how GitLab handles uploads, this page
+provides an overview of the key mechanisms for transferring files to a storage destination.
-- [Why GitLab uses custom upload logic.](background.md)
-- [How uploads work technically.](implementation.md)
-- [How to add new uploads.](working_with_uploads.md)
+GitLab uploads are configured by feature. All features that involve uploads provide the same configuration options,
+but they can be configured independently of one another. For example, Git LFS uploads can be configured
+independently of CI/CD build artifact uploads, but they both offer the same set of settings keys. These settings
+govern how an upload is processed, which can have a dramatic impact on performance and scalability.
+
+This page summarizes the upload settings that are important in deciding how such files are handled. The sections
+that follow then describe each of these mechanisms in more detail.
+
+## How upload settings drive upload flow
+
+Before we examine individual upload strategies in more detail, let's examine a high-level
+breakdown of which upload settings map to each of these strategies.
+
+Upload settings themselves are documented in [Uploads administration](../../administration/uploads.md).
+Here, we focus on how these settings drive the internals of GitLab upload logic.
+At the top level, we distinguish between two **destinations** for uploaded files:
+
+- [**Local storage**](#local-storage) - Files are stored on a volume attached to the web server node.
+- [**Object storage**](#object-storage) - Files are stored in a remote object store bucket.
+
+In this table, `x.y.z` specifies the path taken through `gitlab.yml`:
+
+| Setting | Value | Behavior |
+| -------------------------------------- | ------- | ------------------------------- |
+| `<feature>.object_store.enabled` | `false` | Files are stored locally in `<feature>.storage_path` |
+| `<feature>.object_store.enabled` | `true` | Files are stored remotely in `<feature>.object_store.remote_directory` |
+
+When using object storage, administrators can control how those files are moved into the respective bucket.
+This move can happen in one of these ways:
+
+- [Rails controller upload](#rails-controller-upload).
+- [Background upload](#background-upload).
+- [Direct upload](#direct-upload).
+
+These strategies activate as per the following `<feature>.object_store.*` settings:
+
+| | `background_upload` = `false` | `background_upload` = `true` |
+| ------------------------- | ----------------------------- | ------------------------------- |
+| `direct_upload` = `false` | Controller upload | Background upload |
+| `direct_upload` = `true` | Direct upload | Direct upload (takes precedence)|
+
+Individual Sidekiq workers might also store files in object storage, which is not something we cover here.
+More importantly, `background_upload` does not imply _all files are uploaded by Sidekiq._
+Sidekiq workers that store files in object storage could still exist when this setting is `false`.
+Those cases are never user-initiated uploads, but they might occur in response to another user-initiated
+action, such as exporting a GitLab repository.
+
+Finally, Workhorse assists most user-initiated uploads using an upload buffering mechanism to keep slow work out of Rails controllers.
+This mechanism is explained in [Workhorse assisted uploads](#workhorse-assisted-uploads),
+as it runs orthogonal to much of what we discuss beforehand.
+
+We now look at each case in more detail.
+
+## Local storage
+
+Local storage is the simplest path an upload can take. It was how GitLab treated uploads in its early days.
+It assumes a storage volume (like a disk or network attached storage) is accessible
+to the Rails application at `storage_path`. This file path is relative to the Rails root directory and,
+like any upload setting, configurable per feature.
+
+When a client sends a file upload, Workhorse first buffers the file to disk, a mechanism explained in more
+detail in [Workhorse assisted uploads](#workhorse-assisted-uploads). When the request reaches the Rails
+application, the file already exists on local storage, so Rails merely has to move it to the specified
+directory to finalize the transaction.
+
+Local storage cannot be used with cloud-native GitLab (CNG) installations. It is therefore not used for
+GitLab SaaS either.
+
+## Object storage
+
+To provide horizontally scalable storage, you must use an object store provider such as:
+
+- Amazon AWS.
+- Google Cloud Storage (GCS).
+- Azure Cloud Storage.
+
+Using object storage provides two main benefits:
+
+- Ease of adding more storage capacity: cloud providers do this for you automatically.
+- Enabling horizontal scaling of your GitLab installation: multiple GitLab application servers can access the same data
+ when it is stored in object storage.
+
+CNG installations including GitLab SaaS always use object storage (GCS in the case of GitLab SaaS.)
+
+A challenge with uploading to a remote object store is that it includes an outgoing HTTP request from
+GitLab to the object store provider. As mentioned above, there are three different strategies available for how
+this HTTP request is sent.
+
+- [Rails controller upload](#rails-controller-upload).
+- [Background upload](#background-upload).
+- [Direct upload](#direct-upload).
+
+### Rails controller upload
+
+When neither background upload nor direct upload are available, Rails uploads the file to object storage
+as part of the controller `create` action. Which controller is responsible depends on the kind of file uploaded.
+
+A Rails controller upload is very similar to uploading to local storage. The main difference: Rails must
+send an HTTP request to the object store. This happens via the [CarrierWave Fog](https://github.com/carrierwaveuploader/carrierwave#fog)
+uploader.
+
+As with local storage, this strategy benefits from [Workhorse assistance](#workhorse-assisted-uploads) to
+keep some of the costly I/O work out of Ruby and Rails. Direct upload does a better job at this because it also keeps the HTTP PUT requests to object storage outside Puma.
+
+This strategy is only suitable for small file uploads, as it is subject to Puma's 60 second request timeout.
+
+### Background upload
+
+WARNING:
+This strategy is deprecated in GitLab 14.9 and later, and is scheduled to [be removed in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/26600).
+
+With background uploads enabled:
+
+1. Files are uploaded as if they were to reside in local storage.
+1. When Rails saves the upload metadata and the transaction completes, a Sidekiq job is scheduled.
+1. The Sidekiq job transfers the file to the object store bucket.
+ - If the job completes, the upload record is updated to reflect the file's new location.
+ - If the job fails or gets lost, the upload stays in local storage and has the lifecycle of a normal local storage upload.
+
+As Rails and Sidekiq must cooperate to move the file to its final destination, it requires shared
+storage and as such is unsuitable for CNG installations. We do not use background upload in GitLab SaaS.
+
+As background upload is an extension of local storage, it benefits from the same [Workhorse assistance](#workhorse-assisted-uploads) to
+keep costly I/O work out of Ruby and Rails.
+
+### Direct upload
+
+Direct upload is the recommended way to move large files into object storage in CNG installations like GitLab SaaS.
+
+With direct upload enabled, Workhorse:
+
+1. Authorizes the request with Rails.
+1. Establishes a connection with the object store itself to transfer the file to a temporary location.
+1. When the transfer is complete, Workhorse finalizes the request with Rails. Rails issues an object store copy operation to put the file in its final location.
+1. Completes the upload by deleting the temporary file in object storage.
+
+This strategy is a different form of [Workhorse assistance](#workhorse-assisted-uploads). It does not rely on shared storage that is accessible by both Workhorse and Puma.
+
+Of all existing upload strategies, direct upload is best able to handle large (gigabyte) uploads. However, because Puma still does an object storage copy operation, which takes time proportional to the size of the upload, there remains a possibility of hitting Puma timeouts.
+
+## Workhorse assisted uploads
+
+Most uploads receive assistance from Workhorse in some way.
+
+- Often, Workhorse buffers the upload to a temporary file. Workhorse adds metadata to the request to tell
+ Puma the name and location of the temporary file. This requires shared temporary storage between Workhorse and Puma.
+ All GitLab installations (including CNG) have this shared temporary storage.
+- Workhorse sometimes pre-processes the file. For example, for CI artifact uploads, Workhorse creates a separate index
+ of the contents of the ZIP file. By doing this in Workhorse we bypass the Puma request timeout.
+ Compared to Sidekiq background processing, this has the advantage that the user does not see an intermediate state
+ where GitLab accepts the file but has not yet processed it.
+- With direct upload, Workhorse can both pre-process the file and upload it to object storage.
+ Uploading a large file to object storage takes time; by doing this in Workhorse we avoid the Puma request timeout.
diff --git a/doc/development/uploads/working_with_uploads.md b/doc/development/uploads/working_with_uploads.md
index 99c04888804..4e907530a9f 100644
--- a/doc/development/uploads/working_with_uploads.md
+++ b/doc/development/uploads/working_with_uploads.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Uploads guide: Adding new uploads
-In this section, we describe how to add a new upload route [accelerated](implementation.md#uploading-technologies) by Workhorse for [body and multipart](implementation.md#upload-encodings) encoded uploads.
+Here, we describe how to add a new upload route [accelerated](index.md#workhorse-assisted-uploads) by Workhorse.
Upload routes belong to one of these categories:
@@ -15,31 +15,31 @@ Upload routes belong to one of these categories:
1. GraphQL API: uploads handled by a GraphQL resolve function.
WARNING:
-GraphQL uploads do not support [direct upload](implementation.md#direct-upload) yet. Depending on the use case, the feature may not work on installations without NFS (like GitLab.com or Kubernetes installations). Uploading to object storage inside the GraphQL resolve function may result in timeout errors. For more details please follow [issue #280819](https://gitlab.com/gitlab-org/gitlab/-/issues/280819).
+GraphQL uploads do not support [direct upload](index.md#direct-upload). Depending on the use case, the feature may not work on installations without NFS (like GitLab.com or Kubernetes installations). Uploading to object storage inside the GraphQL resolve function may result in timeout errors. For more details, follow [issue #280819](https://gitlab.com/gitlab-org/gitlab/-/issues/280819).
## Update Workhorse for the new route
-For both the Rails controller and Grape API uploads, Workhorse has to be updated in order to get the
+For both the Rails controller and Grape API uploads, Workhorse must be updated to get the
support for the new upload route.
1. Open a new issue in the [Workhorse tracker](https://gitlab.com/gitlab-org/gitlab-workhorse/-/issues/new) describing precisely the new upload route:
- The route's URL.
- - The [upload encoding](implementation.md#upload-encodings).
+ - The upload encoding.
- If possible, provide a dump of the upload request.
1. Implement and get the MR merged for this issue above.
-1. Ask the Maintainers of [Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) to create a new release. You can do that in the MR
- directly during the maintainer review or ask for it in the `#workhorse` Slack channel.
+1. Ask the Maintainers of [Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse) to create a new release. You can do that in the merge request
+ directly during the maintainer review, or ask for it in the `#workhorse` Slack channel.
1. Bump the [Workhorse version file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/GITLAB_WORKHORSE_VERSION)
to the version you have from the previous points, or bump it in the same merge request that contains
- the Rails changes (see [Implementing the new route with a Rails controller](#implementing-the-new-route-with-a-rails-controller) or [Implementing the new route with a Grape API endpoint](#implementing-the-new-route-with-a-grape-api-endpoint) below).
+ the Rails changes. Refer to [Implementing the new route with a Rails controller](#implementing-the-new-route-with-a-rails-controller) or [Implementing the new route with a Grape API endpoint](#implementing-the-new-route-with-a-grape-api-endpoint) below.
## Implementing the new route with a Rails controller
-For a Rails controller upload, we usually have a [multipart](implementation.md#upload-encodings) upload and there are a
+For a Rails controller upload, we usually have a `multipart/form-data` upload and there are a
few things to do:
1. The upload is available under the parameter name you're using. For example, it could be an `artifact`
- or a nested parameter such as `user[avatar]`. Let's say that we have the upload under the
+ or a nested parameter such as `user[avatar]`. If you have the upload under the
`file` parameter, reading `params[:file]` should get you an [`UploadedFile`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/uploaded_file.rb) instance.
1. Generally speaking, it's a good idea to check if the instance is from the [`UploadedFile`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/uploaded_file.rb) class. For example, see how we checked
[that the parameter is indeed an `UploadedFile`](https://gitlab.com/gitlab-org/gitlab/-/commit/ea30fe8a71bf16ba07f1050ab4820607b5658719#51c0cc7a17b7f12c32bc41cfab3649ff2739b0eb_79_77).
@@ -53,7 +53,7 @@ builds automatically for you.
## Implementing the new route with a Grape API endpoint
-For a Grape API upload, we can have [body or a multipart](implementation.md#upload-encodings) upload. Things are slightly more complicated: two endpoints are needed. One for the
+For a Grape API upload, we can have a body or multipart upload. Things are slightly more complicated: two endpoints are needed. One for the
Workhorse pre-upload authorization and one for accepting the upload metadata from Workhorse:
1. Implement an endpoint with the URL + `/authorize` suffix that will:
@@ -70,8 +70,8 @@ use `requires :file, type: ::API::Validations::Types::WorkhorseFile`.
- Check that the request is coming from Workhorse with the `require_gitlab_workhorse!` from the
[API helpers](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/api/helpers.rb).
- Check the user permissions.
- - The remaining code of the processing. This is where the code must be reading the parameter (for
-our example, it would be `params[:file]`).
+ - The remaining code of the processing. In this step, the code must read the parameter. For
+our example, it would be `params[:file]`.
WARNING:
**Do not** call `UploadedFile#from_params` directly! Do not build an [`UploadedFile`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/uploaded_file.rb)
@@ -124,40 +124,40 @@ Therefore, document new uploads here by slotting them into the following tables:
### CarrierWave integration
-| File | Carrierwave usage | Categorized |
+| File | CarrierWave usage | Categorized |
|---------------------------------------------------------|----------------------------------------------------------------------------------|---------------------|
-| `app/models/project.rb` | `include Avatarable` | :white_check_mark: |
-| `app/models/projects/topic.rb` | `include Avatarable` | :white_check_mark: |
-| `app/models/group.rb` | `include Avatarable` | :white_check_mark: |
-| `app/models/user.rb` | `include Avatarable` | :white_check_mark: |
-| `app/models/terraform/state_version.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/ci/job_artifact.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/ci/pipeline_artifact.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/pages_deployment.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/lfs_object.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/dependency_proxy/blob.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/dependency_proxy/manifest.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/packages/composer/cache_file.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/packages/package_file.rb` | `include FileStoreMounter` | :white_check_mark: |
-| `app/models/concerns/packages/debian/component_file.rb` | `include FileStoreMounter` | :white_check_mark: |
+| `app/models/project.rb` | `include Avatarable` | **{check-circle}** Yes |
+| `app/models/projects/topic.rb` | `include Avatarable` | **{check-circle}** Yes |
+| `app/models/group.rb` | `include Avatarable` | **{check-circle}** Yes |
+| `app/models/user.rb` | `include Avatarable` | **{check-circle}** Yes |
+| `app/models/terraform/state_version.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/ci/job_artifact.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/ci/pipeline_artifact.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/pages_deployment.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/lfs_object.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/dependency_proxy/blob.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/dependency_proxy/manifest.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/packages/composer/cache_file.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/packages/package_file.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
+| `app/models/concerns/packages/debian/component_file.rb` | `include FileStoreMounter` | **{check-circle}** Yes |
| `ee/app/models/issuable_metric_image.rb` | `include FileStoreMounter` | |
| `ee/app/models/vulnerabilities/remediation.rb` | `include FileStoreMounter` | |
| `ee/app/models/vulnerabilities/export.rb` | `include FileStoreMounter` | |
-| `app/models/packages/debian/project_distribution.rb` | `include Packages::Debian::Distribution` | :white_check_mark: |
-| `app/models/packages/debian/group_distribution.rb` | `include Packages::Debian::Distribution` | :white_check_mark: |
-| `app/models/packages/debian/project_component_file.rb` | `include Packages::Debian::ComponentFile` | :white_check_mark: |
-| `app/models/packages/debian/group_component_file.rb` | `include Packages::Debian::ComponentFile` | :white_check_mark: |
-| `app/models/merge_request_diff.rb` | `mount_uploader :external_diff, ExternalDiffUploader` | :white_check_mark: |
-| `app/models/note.rb` | `mount_uploader :attachment, AttachmentUploader` | :white_check_mark: |
-| `app/models/appearance.rb` | `mount_uploader :logo, AttachmentUploader` | :white_check_mark: |
-| `app/models/appearance.rb` | `mount_uploader :header_logo, AttachmentUploader` | :white_check_mark: |
-| `app/models/appearance.rb` | `mount_uploader :favicon, FaviconUploader` | :white_check_mark: |
+| `app/models/packages/debian/project_distribution.rb` | `include Packages::Debian::Distribution` | **{check-circle}** Yes |
+| `app/models/packages/debian/group_distribution.rb` | `include Packages::Debian::Distribution` | **{check-circle}** Yes |
+| `app/models/packages/debian/project_component_file.rb` | `include Packages::Debian::ComponentFile` | **{check-circle}** Yes |
+| `app/models/packages/debian/group_component_file.rb` | `include Packages::Debian::ComponentFile` | **{check-circle}** Yes |
+| `app/models/merge_request_diff.rb` | `mount_uploader :external_diff, ExternalDiffUploader` | **{check-circle}** Yes |
+| `app/models/note.rb` | `mount_uploader :attachment, AttachmentUploader` | **{check-circle}** Yes |
+| `app/models/appearance.rb` | `mount_uploader :logo, AttachmentUploader` | **{check-circle}** Yes |
+| `app/models/appearance.rb` | `mount_uploader :header_logo, AttachmentUploader` | **{check-circle}** Yes |
+| `app/models/appearance.rb` | `mount_uploader :favicon, FaviconUploader` | **{check-circle}** Yes |
| `app/models/project.rb` | `mount_uploader :bfg_object_map, AttachmentUploader` | |
-| `app/models/import_export_upload.rb` | `mount_uploader :import_file, ImportExportUploader` | :white_check_mark: |
-| `app/models/import_export_upload.rb` | `mount_uploader :export_file, ImportExportUploader` | :white_check_mark: |
+| `app/models/import_export_upload.rb` | `mount_uploader :import_file, ImportExportUploader` | **{check-circle}** Yes |
+| `app/models/import_export_upload.rb` | `mount_uploader :export_file, ImportExportUploader` | **{check-circle}** Yes |
| `app/models/ci/deleted_object.rb` | `mount_uploader :file, DeletedObjectUploader` | |
-| `app/models/design_management/action.rb` | `mount_uploader :image_v432x230, DesignManagement::DesignV432x230Uploader` | :white_check_mark: |
-| `app/models/concerns/packages/debian/distribution.rb` | `mount_uploader :signed_file, Packages::Debian::DistributionReleaseFileUploader` | :white_check_mark: |
-| `app/models/bulk_imports/export_upload.rb` | `mount_uploader :export_file, ExportUploader` | :white_check_mark: |
+| `app/models/design_management/action.rb` | `mount_uploader :image_v432x230, DesignManagement::DesignV432x230Uploader` | **{check-circle}** Yes |
+| `app/models/concerns/packages/debian/distribution.rb` | `mount_uploader :signed_file, Packages::Debian::DistributionReleaseFileUploader` | **{check-circle}** Yes |
+| `app/models/bulk_imports/export_upload.rb` | `mount_uploader :export_file, ExportUploader` | **{check-circle}** Yes |
| `ee/app/models/user_permission_export_upload.rb` | `mount_uploader :file, AttachmentUploader` | |
| `app/models/ci/secure_file.rb` | `include FileStoreMounter` | |
diff --git a/doc/development/workhorse/configuration.md b/doc/development/workhorse/configuration.md
index 7f9331e6f1e..ce80a155489 100644
--- a/doc/development/workhorse/configuration.md
+++ b/doc/development/workhorse/configuration.md
@@ -128,6 +128,25 @@ relative URL in the `authBackend` setting:
gitlab-workhorse -authBackend http://localhost:8080/gitlab
```
+## TLS support
+
+A listener with TLS can be configured to be used for incoming requests.
+Paths to the files containing a certificate and matching private key for the server must be provided:
+
+```toml
+[[listeners]]
+network = "tcp"
+addr = "localhost:3443"
+[listeners.tls]
+ certificate = "/path/to/certificate"
+ key = "/path/to/private/key"
+ min_version = "tls1.2"
+ max_version = "tls1.3"
+```
+
+The `certificate` file should contain the concatenation
+of the server's certificate, any intermediates, and the CA's certificate.
+
## Interaction of authBackend and authSocket
The interaction between `authBackend` and `authSocket` can be confusing.
diff --git a/doc/development/workhorse/index.md b/doc/development/workhorse/index.md
index f7ca16e0f31..3aa7e945f53 100644
--- a/doc/development/workhorse/index.md
+++ b/doc/development/workhorse/index.md
@@ -44,7 +44,7 @@ On some operating systems, such as FreeBSD, you may have to use
### Run time dependencies
-Workhorse uses [Exiftool](https://www.sno.phy.queensu.ca/~phil/exiftool/) for
+Workhorse uses [ExifTool](https://www.sno.phy.queensu.ca/~phil/exiftool/) for
removing EXIF data (which may contain sensitive information) from uploaded
images. If you installed GitLab:
diff --git a/doc/install/aws/gitlab_hybrid_on_aws.md b/doc/install/aws/gitlab_hybrid_on_aws.md
index 2c40efd5909..055cb4c3efb 100644
--- a/doc/install/aws/gitlab_hybrid_on_aws.md
+++ b/doc/install/aws/gitlab_hybrid_on_aws.md
@@ -16,11 +16,11 @@ Amazon provides a managed Kubernetes service offering known as [Amazon Elastic K
| GitLab Cloud Native Hybrid Ref Arch | GitLab Baseline Perf Test Results Omnibus on Instances | AWS Bill of Materials (BOM) for CNH | AWS Build Performance Testing Results for [CNH](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt) | CNH Cost Estimate 3 AZs* |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| [2K Omnibus](../../administration/reference_architectures/2k_users.md) | [2K Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k) | [2K Cloud Native Hybrid on EKS](#2k-cloud-native-hybrid-on-eks) | GPT Test Results | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=544bcf1162beae6b8130ad257d081cdf9d4504e3)<br />(2 AZ Cost Estimate is in BOM Below) |
-| [3K](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [3k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k) | [3K Cloud Native Hybrid on EKS](#3k-cloud-native-hybrid-on-eks) | [3K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt)<br /><br />[3K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=f1294fec554e21be999711cddcdab9c5e7f83f14)<br />(2 AZ Cost Estimate is in BOM Below) |
-| [5K](../../administration/reference_architectures/5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [5k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k) | [5K Cloud Native Hybrid on EKS](#5k-cloud-native-hybrid-on-eks) | [5K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt)<br /><br />[5K AutoScale from 25% GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=330ee43c5b14662db5df6e52b34898d181a09e16) |
-| [10K](../../administration/reference_architectures/10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [10k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k) | [10K Cloud Native Hybrid on EKS](#10k-cloud-native-hybrid-on-eks) | [10K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](hhttps://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | [10K 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=5ac2e07a22e01c36ee76b5477c5a046cd1bea792) |
-| [50K](../../administration/reference_architectures/50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [50k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k) | [50K Cloud Native Hybrid on EKS](#50k-cloud-native-hybrid-on-eks) | [50K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | [50K 1 YR Ec2 Compute Savings + 1 YR RDS & Elasticache RIs](https://calculator.aws/#/estimate?id=b9c9d6ac1d4a7848011d2050cef3120931fb7c22) |
+| [2K Omnibus](../../administration/reference_architectures/2k_users.md) | [2K Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/2k) | [2K Cloud Native Hybrid on EKS](#2k-cloud-native-hybrid-on-eks) | GPT Test Results | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=544bcf1162beae6b8130ad257d081cdf9d4504e3)<br />(2 AZ Cost Estimate is in BOM Below) |
+| [3K](../../administration/reference_architectures/3k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [3k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/3k) | [3K Cloud Native Hybrid on EKS](#3k-cloud-native-hybrid-on-eks) | [3K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt)<br /><br />[3K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200/3k-QuickStart-AutoScale-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_194200_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=f1294fec554e21be999711cddcdab9c5e7f83f14)<br />(2 AZ Cost Estimate is in BOM Below) |
+| [5K](../../administration/reference_architectures/5k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [5k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/5k) | [5K Cloud Native Hybrid on EKS](#5k-cloud-native-hybrid-on-eks) | [5K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt)<br /><br />[5K AutoScale from 25% GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717/5k-QuickStart-AutoScale-From-25Percent-ARM-RDS-Redis_v13-12-3-ee_2021-07-24_102717_results.txt) | [1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=330ee43c5b14662db5df6e52b34898d181a09e16) |
+| [10K](../../administration/reference_architectures/10k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [10k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/10k) | [10K Cloud Native Hybrid on EKS](#10k-cloud-native-hybrid-on-eks) | [10K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](hhttps://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | [10K 1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=5ac2e07a22e01c36ee76b5477c5a046cd1bea792) |
+| [50K](../../administration/reference_architectures/50k_users.md#cloud-native-hybrid-reference-architecture-with-helm-charts-alternative) | [50k Baseline](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Benchmarks/Latest/50k) | [50K Cloud Native Hybrid on EKS](#50k-cloud-native-hybrid-on-eks) | [50K Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt)<br /><br />[10K Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | [50K 1 YR Ec2 Compute Savings + 1 YR RDS & ElastiCache RIs](https://calculator.aws/#/estimate?id=b9c9d6ac1d4a7848011d2050cef3120931fb7c22) |
\*Cost calculations for actual implementations are a rough guideline with the following considerations:
@@ -35,23 +35,24 @@ Amazon provides a managed Kubernetes service offering known as [Amazon Elastic K
The [AWS Quick Start for GitLab Cloud Native Hybrid on EKS](https://aws-quickstart.github.io/quickstart-eks-gitlab/) is developed by AWS, GitLab, and the community that contributes to AWS Quick Starts, whether directly to the GitLab Quick Start or to the underlying Quick Start dependencies GitLab inherits (for example, EKS Quick Start).
NOTE:
-This automation is in **Developer Preview**. GitLab is working with AWS on resolving [the outstanding issues](https://github.com/aws-quickstart/quickstart-eks-gitlab/issues?q=is%3Aissue+is%3Aopen+%5BHL%5D) before it is fully released. You can subscribe to this issue to be notified of progress and release announcements: [AWS Quick Start for GitLab Cloud Native Hybrid on EKS Status: DEVELOPER PREVIEW](https://gitlab.com/gitlab-com/alliances/aws/public-tracker/-/issues/11).<br><br>
-The developer preview deploys Aurora PostgreSQL, but the release version will deploy Amazon RDS PostgreSQL due to [known issues](https://gitlab.com/gitlab-com/alliances/aws/public-tracker/-/issues?label_name%5B%5D=AWS+Known+Issue) with Aurora. All performance testing results will also be redone after this change has been made.
+This automation is in **[Open Beta](https://about.gitlab.com/handbook/product/gitlab-the-product/#open-beta)**. GitLab is working with AWS on resolving [the outstanding issues](https://github.com/aws-quickstart/quickstart-eks-gitlab/issues?q=is%3Aissue+is%3Aopen+%5BHL%5D) before it is fully released. You can subscribe to this issue to be notified of progress and release announcements: [AWS Quick Start for GitLab Cloud Native Hybrid on EKS Status: Beta](https://gitlab.com/gitlab-com/alliances/aws/public-tracker/-/issues/11).<br><br>
+The Beta version deploys Aurora PostgreSQL, but the release version will deploy Amazon RDS PostgreSQL due to [known issues](https://gitlab.com/gitlab-com/alliances/aws/public-tracker/-/issues?label_name%5B%5D=AWS+Known+Issue) with Aurora. All performance testing results will also be redone after this change has been made.
The [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/tree/main) is an effort made by GitLab to create a multi-cloud, multi-GitLab (Omnibus + Cloud Native Hybrid) toolkit to provision GitLab. GET is developed by GitLab developers and is open to community contributions.
It is helpful to review the [GitLab Environment Toolkit (GET) Issues](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/issues) to understand if any of them may affect your provisioning plans.
| | [AWS Quick Start for GitLab Cloud Native Hybrid on EKS](https://aws-quickstart.github.io/quickstart-eks-gitlab/) | [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit) |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| Licensing | [Open Source (Apache 2.0)](https://github.com/aws-quickstart/quickstart-eks-gitlab/blob/main/LICENSE.txt) | [GitLab Enterprise Edition license](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/LICENSE) ([GitLab Premium tier](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/README.md)) |
| Overview and Vision | [AWS Quick Start](https://aws.amazon.com/quickstart/) | [GitLab Environment Toolkit](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/README.md) |
+| Licensing | [Open Source (Apache 2.0)](https://github.com/aws-quickstart/quickstart-eks-gitlab/blob/main/LICENSE.txt) | [GitLab Enterprise Edition license](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/LICENSE) ([GitLab Premium tier](https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/README.md)) |
+| GitLab Support | [GitLab Beta Support](../../policy/alpha-beta-support.md#beta-features) | [GitLab GA Support](../../policy/alpha-beta-support.md#generally-available-ga) |
| GitLab Reference Architecture Compliant | Yes | Yes |
| GitLab Performance Tool (GPT) Tested | Yes | Yes |
| Amazon Well Architected Compliant | Yes<br />(via Quick Start program) | Critical portions <br />reviewed by AWS |
| Target Cloud Platforms | AWS | AWS, Google, Azure |
| IaC Languages | CloudFormation (Quick Starts) | Terraform, Ansible |
| Community Contributions and Participation (EcoSystem) | <u>GitLab QSG</u>: Getting Started<br /><u>For QSG Dependencies (for example, EKS)</u>: Substantial | Getting Started |
-| Compatible with AWS Meta-Automation Services (via CloudFormation) | - [AWS Service Catalog](https://aws.amazon.com/servicecatalog/) (Direct Import)<br>- [ServiceNow via an AWS Service Catalog Connector](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/integrations-servicenow.html#integrations-servicenow)<br>- [Jira Service Manager via an AWS Service Catalog Connector](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/integrations-jiraservicedesk.html#integrations-jiraservicedesk)<br>- [AWS Control Tower](https://docs.aws.amazon.com/controltower/) ([Integration](https://aws.amazon.com/blogs/infrastructure-and-automation/deploy-aws-quick-start-to-multiple-accounts-using-aws-control-tower/))<br>- Quick Starts<br>- [AWS SaaS Factory](https://aws.amazon.com/partners/programs/saas-factory/) | No |
+| Compatible with AWS Meta-Automation Services (via CloudFormation) | - [AWS Service Catalog](https://aws.amazon.com/servicecatalog/) (Direct Import)<br>- [ServiceNow via an AWS Service Catalog Connector](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/integrations-servicenow.html#integrations-servicenow)<br>- [Jira Service Manager via an AWS Service Catalog Connector](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/integrations-jiraservicedesk.html#integrations-jiraservicedesk)<br>- [AWS Control Tower](https://docs.aws.amazon.com/controltower/) ([Integration](https://aws.amazon.com/blogs/infrastructure-and-automation/deploy-aws-quick-start-to-multiple-accounts-using-aws-control-tower/))<br>- Quick Starts<br>- [AWS SaaS Factory](https://aws.amazon.com/partners/programs/saas-factory/) | No |
| Results in a Ready-to-Use instance | Yes | Manual Actions or <br />Supplemental IaC Required |
| **<u>Configuration Features</u>** | | |
| Can deploy Omnibus GitLab (non-Kubernetes) | No | Yes |
@@ -98,7 +99,7 @@ Some services, such as log aggregation, outbound email are not specified by GitL
| ------------------------------------------------------------ | ------------------------------ | ------------------------------------------------------------ |
| <u>Tested PaaS Mentioned in Reference Architectures</u> | | |
| **PostgreSQL Database** | Amazon RDS PostgreSQL | Yes. |
-| **Redis Caching** | Redis Elasticache | Yes. |
+| **Redis Caching** | Redis ElastiCache | Yes. |
| **Gitaly Cluster (Git Repository Storage)**<br />(Including Praefect and PostgreSQL) | ASG and Instances | Yes - ASG and Instances<br />**Note: Gitaly cannot be put into a Kubernetes Cluster.** |
| **All GitLab storages besides Git Repository Storage**<br />(Includes Git-LFS which is S3 Compatible) | AWS S3 | Yes |
| | | |
@@ -152,7 +153,7 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Supporting services such as NGINX, Prometheus, etc | 2 vCPU, 8 GB | | |
| **GitLab Ref Arch Raw Total K8s Node Capacity** | 16 vCPU, 32 GB | | |
| One Node for Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 8 vCPU, 16GB | | |
-| **Grand Total w/ Overheads**<br />Minimum hosts = 3 | 24 vCPU, 48 GB | **c5.2xlarge** <br />(8vcpu/16GB) x 3 nodes<br />24 vCPU, 48 GB | $1.02/hr |
+| **Grand Total w/ Overheads**<br />Minimum hosts = 3 | 24 vCPU, 48 GB | **c5.2xlarge** <br />(8vCPU/16GB) x 3 nodes<br />24 vCPU, 48 GB | $1.02/hr |
| **Idle Configuration (Scaled-In)** | 16 vCPU, 32 GB | **c5.2xlarge** x 2 | $0.68/hr |
NOTE:
@@ -205,7 +206,7 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Supporting services such as NGINX, Prometheus, etc | [2 allocations](../../administration/reference_architectures/3k_users.md#cluster-topology) x ([2 vCPU and 7.5 GB](../../administration/reference_architectures/3k_users.md#cluster-topology)) = <br />4 vCPU, 15 GB | | |
| **GitLab Ref Arch Raw Total K8s Node Capacity** | 32 vCPU, 56 GB | | |
| One Node for Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 16 vCPU, 32GB | | |
-| **Grand Total w/ Overheads Full Scale**<br />Minimum hosts = 3 | 48 vCPU, 88 GB | **c5.2xlarge** (8vcpu/16GB) x 5 nodes<br />40 vCPU, 80 GB<br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt) | $1.70/hr |
+| **Grand Total w/ Overheads Full Scale**<br />Minimum hosts = 3 | 48 vCPU, 88 GB | **c5.2xlarge** (8vCPU/16GB) x 5 nodes<br />40 vCPU, 80 GB<br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/3K/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216/3k-QuickStart-ARM-RDS-Cache_v13-12-3-ee_2021-07-23_124216_results.txt) | $1.70/hr |
| **Possible Idle Configuration (Scaled-In 75% - round up)**<br />Pod autoscaling must be also adjusted to enable lower idling configuration. | 24 vCPU, 48 GB | c5.2xlarge x 4 | $1.36/hr |
Other combinations of node type and quantity can be used to meet the Grand Total. Due to the properties of pods, hosts that are overly small may have significant unused capacity.
@@ -259,10 +260,10 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Supporting services such as NGINX, Prometheus, etc | [2 allocations](../../administration/reference_architectures/5k_users.md#cluster-topology) x ([2 vCPU and 7.5 GB](../../administration/reference_architectures/5k_users.md#cluster-topology)) = <br />4 vCPU, 15 GB | | |
| **GitLab Ref Arch Raw Total K8s Node Capacity** | 62 vCPU, 96.5 GB | | |
| One Node for Quick Start Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 8 vCPU, 16GB | | |
-| **Grand Total w/ Overheads Full Scale**<br />Minimum hosts = 3 | 70 vCPU, 112.5 GB | **c5.2xlarge** (8vcpu/16GB) x 9 nodes<br />72 vCPU, 144 GB<br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt) | $2.38/hr |
+| **Grand Total w/ Overheads Full Scale**<br />Minimum hosts = 3 | 70 vCPU, 112.5 GB | **c5.2xlarge** (8vCPU/16GB) x 9 nodes<br />72 vCPU, 144 GB<br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/5K/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128/5k-QuickStart-ARM-RDS-Redis_v13-12-3-ee_2021-07-23_140128_results.txt) | $2.38/hr |
| **Possible Idle Configuration (Scaled-In 75% - round up)**<br />Pod autoscaling must be also adjusted to enable lower idling configuration. | 24 vCPU, 48 GB | c5.2xlarge x 7 | $1.85/hr |
-Other combinations of node type and quantity can be used to meet the Grand Total. Due to the cpu and memory requirements of pods, hosts that are overly small may have significant unused capacity.
+Other combinations of node type and quantity can be used to meet the Grand Total. Due to the CPU and memory requirements of pods, hosts that are overly small may have significant unused capacity.
NOTE:
If EKS node autoscaling is employed, it is likely that your average loading will run lower than this, especially during non-working hours and weekends.
@@ -312,10 +313,10 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Supporting services such as NGINX, Prometheus, etc | [2 allocations](../../administration/reference_architectures/10k_users.md#cluster-topology) x ([2 vCPU and 7.5 GB](../../administration/reference_architectures/10k_users.md#cluster-topology))<br />4 vCPU, 15 GB | | |
| **GitLab Ref Arch Raw Total K8s Node Capacity** | 128 vCPU, 158 GB | | |
| One Node for Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 16 vCPU, 32GB | | |
-| **Grand Total w/ Overheads Fully Scaled**<br />Minimum hosts = 3 | 142 vCPU, 190 GB | **c5.4xlarge** (16vcpu/32GB) x 9 nodes<br />144 vCPU, 288GB<br /><br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt) | $6.12/hr |
+| **Grand Total w/ Overheads Fully Scaled**<br />Minimum hosts = 3 | 142 vCPU, 190 GB | **c5.4xlarge** (16vCPU/32GB) x 9 nodes<br />144 vCPU, 288GB<br /><br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647/GL-CloudNative-10k-RDS-Graviton_v13-12-3-ee_2021-07-08_194647_results.txt) | $6.12/hr |
| **Possible Idle Configuration (Scaled-In 75% - round up)**<br />Pod autoscaling must be also adjusted to enable lower idling configuration. | 40 vCPU, 80 GB | c5.4xlarge x 7<br /><br />[Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/10K/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139/GL-CloudNative-10k-AutoScaling-Test_v13-12-3-ee_2021-07-09_115139_results.txt) | $4.76/hr |
-Other combinations of node type and quantity can be used to meet the Grand Total. Due to the cpu and memory requirements of pods, hosts that are overly small may have significant unused capacity.
+Other combinations of node type and quantity can be used to meet the Grand Total. Due to the CPU and memory requirements of pods, hosts that are overly small may have significant unused capacity.
NOTE:
If EKS node autoscaling is employed, it is likely that your average loading will run lower than this, especially during non-working hours and weekends.
@@ -365,10 +366,10 @@ On Demand pricing is used in this table for comparisons, but should not be used
| Supporting services such as NGINX, Prometheus, etc | [2 allocations](../../administration/reference_architectures/10k_users.md#cluster-topology) x ([2 vCPU and 7.5 GB](../../administration/reference_architectures/10k_users.md#cluster-topology))<br />4 vCPU, 15 GB | | |
| **GitLab Ref Arch Raw Total K8s Node Capacity** | 428 vCPU, 533 GB | | |
| One Node for Overhead and Miscellaneous (EKS Cluster AutoScaler, Grafana, Prometheus, etc) | + 16 vCPU, 32GB | | |
-| **Grand Total w/ Overheads Fully Scaled**<br />Minimum hosts = 3 | 444 vCPU, 565 GB | **c5.4xlarge** (16vcpu/32GB) x 28 nodes<br />448 vCPU, 896GB<br /><br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt) | $19.04/hr |
+| **Grand Total w/ Overheads Fully Scaled**<br />Minimum hosts = 3 | 444 vCPU, 565 GB | **c5.4xlarge** (16vCPU/32GB) x 28 nodes<br />448 vCPU, 896GB<br /><br />[Full Fixed Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819/50k-Fixed-Scale-Test_v13-12-3-ee_2021-08-13_172819_results.txt) | $19.04/hr |
| **Possible Idle Configuration (Scaled-In 75% - round up)**<br />Pod autoscaling must be also adjusted to enable lower idling configuration. | 40 vCPU, 80 GB | c5.2xlarge x 10<br /><br />[Elastic Auto Scale GPT Test Results](https://gitlab.com/guided-explorations/aws/implementation-patterns/gitlab-cloud-native-hybrid-on-eks/-/blob/master/gitlab-alliances-testing/50K/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633/50k-AutoScale-Test_v13-12-3-ee_2021-08-13_192633.txt) | $6.80/hr |
-Other combinations of node type and quantity can be used to meet the Grand Total. Due to the cpu and memory requirements of pods, hosts that are overly small may have significant unused capacity.
+Other combinations of node type and quantity can be used to meet the Grand Total. Due to the CPU and memory requirements of pods, hosts that are overly small may have significant unused capacity.
NOTE:
If EKS node autoscaling is employed, it is likely that your average loading will run lower than this, especially during non-working hours and weekends.
diff --git a/doc/install/aws/index.md b/doc/install/aws/index.md
index 8dbda7420b0..ee7279d72cd 100644
--- a/doc/install/aws/index.md
+++ b/doc/install/aws/index.md
@@ -63,7 +63,7 @@ When deploying a GitLab instance using the official AMI, the root password to th
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.
NOTE:
-Since any given GitLab upgrade might involve data disk updates or database schema upgrades, simply swapping out the AMI is not sufficent for taking upgrades.
+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.
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:
diff --git a/doc/install/docker.md b/doc/install/docker.md
index a25ed629681..d5ca2c2e29f 100644
--- a/doc/install/docker.md
+++ b/doc/install/docker.md
@@ -189,7 +189,7 @@ services:
external_url 'http://gitlab.example.com:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- - '8929:80'
+ - '8929:8929'
- '2224:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
@@ -198,7 +198,7 @@ services:
shm_size: '256m'
```
-This is the same as using `--publish 8929:80 --publish 2224:22`.
+This is the same as using `--publish 8929:8929 --publish 2224:22`.
### Install GitLab using Docker swarm mode
@@ -257,7 +257,7 @@ Here's an example that deploys GitLab with four runners as a [stack](https://doc
```ruby
external_url 'https://my.domain.com/'
- gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password')
+ gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
```
1. Create a `root_password.txt` file:
@@ -664,7 +664,7 @@ writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with un
writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
```
-Other than disabling the Prometheus Metrics from the Admin page, the recommended
+Other than disabling the Prometheus Metrics from the Admin Area, the recommended
solution to fix this problem is to increase the size of shared memory to at least 256MB.
If using `docker run`, this can be done by passing the flag `--shm-size 256m`.
If using a `docker-compose.yml` file, the `shm_size` key can be used for this
diff --git a/doc/install/index.md b/doc/install/index.md
index deb94031e44..52bc9062adc 100644
--- a/doc/install/index.md
+++ b/doc/install/index.md
@@ -28,10 +28,10 @@ install GitLab:
| Installation method | Description | When to choose |
|----------------------------------------------------------------|-------------|----------------|
| [Linux package](https://docs.gitlab.com/omnibus/installation/) | The official deb/rpm packages (also known as Omnibus GitLab) that contains a bundle of GitLab and the components it depends on, including PostgreSQL, Redis, and Sidekiq. | This method is recommended for getting started. The Linux packages are mature, scalable, and are used today on GitLab.com. If you need additional flexibility and resilience, we recommend deploying GitLab as described in the [reference architecture documentation](../administration/reference_architectures/index.md). |
-| [Helm charts](https://docs.gitlab.com/charts/) | The cloud native Helm chart for installing GitLab and all of its components on Kubernetes. | When installing GitLab on Kubernetes, there are some trade-offs that you need to be aware of: <br/>- Administration and troubleshooting requires Kubernetes knowledge.<br/>- It can be more expensive for smaller installations. The default installation requires more resources than a single node Linux package deployment, as most services are deployed in a redundant fashion.<br/><br/> Use this method if your infrastructure is built on Kubernetes and you're familiar with how it works. The methods for management, observability, and some concepts are different than traditional deployments. |
+| [Helm charts](https://docs.gitlab.com/charts/) | The cloud native Helm chart for installing GitLab and all of its components on Kubernetes. | When installing GitLab on Kubernetes, it has some trade-offs that you must be aware of: <br/>- Administration and troubleshooting requires Kubernetes knowledge.<br/>- It can be more expensive for smaller installations. The default installation requires more resources than a single node Linux package deployment, as most services are deployed in a redundant fashion.<br/><br/> Use this method if your infrastructure is built on Kubernetes and you're familiar with how it works. The methods for management, observability, and some concepts are different than traditional deployments. |
| [Docker](docker.md) | The GitLab packages, Dockerized. | Use this method if you're familiar with Docker. |
-| [Source](installation.md) | Install GitLab and all of its components from scratch. | Use this method if none of the previous methods are available for your platform. Useful for unsupported systems like \*BSD.|
-| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#documentation) | The GitLab Environment Toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Customers are very welcome to trial and evaluate GET today, however be aware of [key limitations](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#missing-features-to-be-aware-of) of the current iteration. For production environments further manual setup will be required based on your specific requirements. |
+| [Source](installation.md) | Install GitLab and all of its components from scratch. | Use this method if none of the previous methods are available for your platform. Can be used for unsupported systems like \*BSD.|
+| [GitLab Environment Toolkit (GET)](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#documentation) | The GitLab Environment toolkit provides a set of automation tools to deploy a [reference architecture](../administration/reference_architectures/index.md) on most major cloud providers. | Customers are very welcome to trial and evaluate GET today, however be aware of [key limitations](https://gitlab.com/gitlab-org/gitlab-environment-toolkit#missing-features-to-be-aware-of) of the current iteration. For production environments further manual setup is required based on your specific requirements. |
| [GitLab Operator](https://docs.gitlab.com/operator/) | The GitLab Operator provides an installation and management method for GitLab following the [Kubernetes Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). | Use the GitLab Operator to run GitLab in an [OpenShift](openshift_and_gitlab/index.md) environment. |
## Install GitLab on cloud providers
diff --git a/doc/install/installation.md b/doc/install/installation.md
index c03c600fe0b..e53ced6c88a 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -197,13 +197,9 @@ can install it with:
sudo apt-get install -y postfix
```
-Then select 'Internet Site' and press enter to confirm the hostname.
+Then select 'Internet Site' and press <kbd>Enter</kbd> to confirm the hostname.
-<!-- vale gitlab.Spelling = NO -->
-
-### Exiftool
-
-<!-- vale gitlab.Spelling = YES -->
+### ExifTool
[GitLab Workhorse](https://gitlab.com/gitlab-org/gitlab-workhorse#dependencies)
requires `exiftool` to remove EXIF data from uploaded images.
@@ -230,9 +226,9 @@ Download Ruby and compile it:
```shell
mkdir /tmp/ruby && cd /tmp/ruby
-curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.4.tar.gz"
-echo '3043099089608859fc8cce7f9fdccaa1f53a462457e3838ec3b25a7d609fbc5b ruby-2.7.4.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.4.tar.gz
-cd ruby-2.7.4
+curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.5.tar.gz"
+echo '2755b900a21235b443bb16dadd9032f784d4a88f143d852bc5d154f22b8781f1 ruby-2.7.5.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.5.tar.gz
+cd ruby-2.7.5
./configure --disable-install-rdoc --enable-shared
make
@@ -1049,13 +1045,6 @@ follow the normal directions and generate a self-signed SSL certificate:
sudo chmod o-r gitlab.key
```
-WARNING:
-The `self_signed_cert` variable is
-[deprecated and redundant](https://gitlab.com/gitlab-org/gitlab-shell/-/issues/120).
-It is set to `false` by default, but still accepts self-signed certificates. Setting
-this value to `true` allows any certificate to be accepted, and can make
-machine-in-the-middle attacks possible.
-
### Enable Reply by email
See the ["Reply by email" documentation](../administration/reply_by_email.md) for more information on how to set this up.
diff --git a/doc/install/requirements.md b/doc/install/requirements.md
index 8006b886414..83fce2f00f6 100644
--- a/doc/install/requirements.md
+++ b/doc/install/requirements.md
@@ -121,6 +121,8 @@ the following table) as these were used for development and testing:
|----------------|----------------------------|
| 13.0 | 11 |
| 14.0 | 12.10 |
+| 15.0 | 12.0 |
+| 16.0 (planned) | 13.0 |
You must also ensure the following extensions are loaded into every
GitLab database. [Read more about this requirement, and troubleshooting](postgresql_extensions.md).
@@ -132,7 +134,7 @@ GitLab database. [Read more about this requirement, and troubleshooting](postgre
| `plpgsql` | 11.7 |
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. For the schedule of transitioning to PostgreSQL 12, see [the related epic](https://gitlab.com/groups/gitlab-org/-/epics/2184).
+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.
#### Additional requirements for GitLab Geo
diff --git a/doc/integration/akismet.md b/doc/integration/akismet.md
index 5541c5914d5..9a85511836f 100644
--- a/doc/integration/akismet.md
+++ b/doc/integration/akismet.md
@@ -12,7 +12,7 @@ Akismet for review, and instance administrators can
[mark snippets as spam](../user/snippets.md#mark-snippet-as-spam).
Detected spam is rejected, and an entry is added in the **Spam Log** section of the
-Admin page.
+Admin Area.
Privacy note: GitLab submits the user's IP and user agent to Akismet.
diff --git a/doc/integration/alicloud.md b/doc/integration/alicloud.md
index 85e1e2d4154..1619bdc9504 100644
--- a/doc/integration/alicloud.md
+++ b/doc/integration/alicloud.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
@@ -28,7 +28,7 @@ Sign in to the AliCloud platform and create an application on it. AliCloud gener
Select **Save**.
1. Add OAuth scopes in the application details page:
-
+
1. Under the **Application Name** column, select the name of the application you created. The application's details page opens.
1. Under the **Application OAuth Scopes** tab, select **Add OAuth Scopes**.
1. Select the **aliuid** and **profile** checkboxes.
diff --git a/doc/integration/auth0.md b/doc/integration/auth0.md
index 8bac95c5f04..1e1ee9aebc5 100644
--- a/doc/integration/auth0.md
+++ b/doc/integration/auth0.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/azure.md b/doc/integration/azure.md
index 5749e638164..515e7406545 100644
--- a/doc/integration/azure.md
+++ b/doc/integration/azure.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md
index 2fc80aa1769..165d25c0d90 100644
--- a/doc/integration/bitbucket.md
+++ b/doc/integration/bitbucket.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
@@ -124,4 +124,4 @@ After the above configuration is set up, you can use Bitbucket to sign into
GitLab and [start importing your projects](../user/project/import/bitbucket.md).
If you want to import projects from Bitbucket, but don't want to enable signing in,
-you can [disable Sign-Ins in the admin panel](omniauth.md#enable-or-disable-sign-in-with-an-omniauth-provider-without-disabling-import-sources).
+you can [disable Sign-Ins in the Admin Area](omniauth.md#enable-or-disable-sign-in-with-an-omniauth-provider-without-disabling-import-sources).
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
index 9594836164a..a0cb6bd98cd 100644
--- a/doc/integration/cas.md
+++ b/doc/integration/cas.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/ding_talk.md b/doc/integration/ding_talk.md
index 2bc4f29298a..437648b1adf 100644
--- a/doc/integration/ding_talk.md
+++ b/doc/integration/ding_talk.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md
index 5197a191b8e..214bd845944 100644
--- a/doc/integration/elasticsearch.md
+++ b/doc/integration/elasticsearch.md
@@ -217,7 +217,7 @@ The following Elasticsearch settings are available:
| `Password` | The password of your Elasticsearch instance. |
| `Number of Elasticsearch shards` | Elasticsearch indexes are split into multiple shards for performance reasons. In general, you should use at least 5 shards, and indexes with tens of millions of documents need to have more shards ([see below](#guidance-on-choosing-optimal-cluster-configuration)). Changes to this value do not take effect until the index is recreated. You can read more about tradeoffs in the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/scalability.html). |
| `Number of Elasticsearch replicas` | Each Elasticsearch shard can have a number of replicas. These are a complete copy of the shard, and can provide increased query performance or resilience against hardware failure. Increasing this value increases total disk space required by the index. |
-| `Limit namespaces and projects that can be indexed` | Enabling this allows you to select namespaces and projects to index. All other namespaces and projects use database search instead. If you enable this option but do not select any namespaces or projects, none are indexed. [Read more below](#limit-namespaces-and-projects).
+| `Limit the number of namespaces and projects that can be indexed` | Enabling this allows you to select namespaces and projects to index. All other namespaces and projects use database search instead. If you enable this option but do not select any namespaces or projects, none are indexed. [Read more below](#limit-the-number-of-namespaces-and-projects-that-can-be-indexed).
| `Using AWS hosted Elasticsearch with IAM credentials` | Sign your Elasticsearch requests using [AWS IAM authorization](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html), [AWS EC2 Instance Profile Credentials](https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html#getting-started-create-iam-instance-profile-cli), or [AWS ECS Tasks Credentials](https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-iam-roles.html). Please refer to [Identity and Access Management in Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html) for details of AWS hosted OpenSearch domain access policy configuration. |
| `AWS Region` | The AWS region in which your OpenSearch Service is located. |
| `AWS Access Key` | The AWS access key. |
@@ -234,9 +234,10 @@ Sidekiq performance. Return them to their default values if you see increased `s
in your Sidekiq logs. For more information, see
[issue 322147](https://gitlab.com/gitlab-org/gitlab/-/issues/322147).
-### Limit namespaces and projects
+### Limit the number of namespaces and projects that can be indexed
-If you select `Limit namespaces and projects that can be indexed`, more options become available.
+If you check checkbox `Limit the number of namespaces and projects that can be indexed`
+under **Elasticsearch indexing restrictions** more options become available.
![limit namespaces and projects options](img/limit_namespaces_projects_options.png)
@@ -871,7 +872,7 @@ There are a couple of ways to achieve that:
This is always correctly identifying whether the current project/namespace
being searched is using Elasticsearch.
-- From the admin area under **Settings > Advanced Search** check that the
+- From the Admin Area under **Settings > Advanced Search** check that the
Advanced Search settings are checked.
Those same settings there can be obtained from the Rails console if necessary:
@@ -920,7 +921,7 @@ More [complex Elasticsearch API calls](https://www.elastic.co/guide/en/elasticse
It is important to understand at which level the problem is manifesting (UI, Rails code, Elasticsearch side) to be able to [troubleshoot further](../administration/troubleshooting/elasticsearch.md#search-results-workflow).
NOTE:
-The above instructions are not to be used for scenarios that only index a [subset of namespaces](#limit-namespaces-and-projects).
+The above instructions are not to be used for scenarios that only index a [subset of namespaces](#limit-the-number-of-namespaces-and-projects-that-can-be-indexed).
See [Elasticsearch Index Scopes](#advanced-search-index-scopes) for more information on searching for specific types of data.
@@ -1082,7 +1083,7 @@ If `ElasticCommitIndexerWorker` Sidekiq workers are failing with this error duri
### Indexing is very slow or fails with `rejected execution of coordinating operation` messages
-Bulk requests are getting rejected by the Elasticsearch node(s) likely due to load and lack of available memory.
+Bulk requests getting rejected by the Elasticsearch nodes are likely due to load and lack of available memory.
Ensure that your Elasticsearch cluster meets the [system requirements](#system-requirements) and has enough resources
to perform bulk operations. See also the error ["429 (Too Many Requests)"](#indexing-fails-with-error-elastic-error-429-too-many-requests).
diff --git a/doc/integration/facebook.md b/doc/integration/facebook.md
index b94fa24d290..c73a8d5e461 100644
--- a/doc/integration/facebook.md
+++ b/doc/integration/facebook.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/github.md b/doc/integration/github.md
index a265d5c67ed..3c14e8db4de 100644
--- a/doc/integration/github.md
+++ b/doc/integration/github.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md
index 132006ab996..68ba676b539 100644
--- a/doc/integration/gitlab.md
+++ b/doc/integration/gitlab.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/gitpod.md b/doc/integration/gitpod.md
index f54542ff43f..84294a99ef9 100644
--- a/doc/integration/gitpod.md
+++ b/doc/integration/gitpod.md
@@ -61,7 +61,7 @@ Your users can then [enable it for themselves](#enable-gitpod-in-your-user-setti
You can launch Gitpod directly from GitLab in one of these ways:
- *From your project's page:*
- 1. Go to your project, and navigate to the page you want to edit.
+ 1. Go to your project, then go to the page you want to edit.
1. Select the caret **(angle-down)** next to **Web IDE**, and select **Gitpod**
from the list:
@@ -69,13 +69,7 @@ You can launch Gitpod directly from GitLab in one of these ways:
1. Select **Open in Gitpod**.
- *From a merge request:*
- 1. Go to your merge request, and select **Overview** in the tab menu.
- 1. Scroll to the end of the merge request description.
- 1. Select the caret **(angle-down)** next to **Web IDE**, then select **Gitpod**
- from the list:
-
- ![Gitpod button on the merge request page](img/gitpod-button_v14_2.png)
-
- 1. Select **Open in Gitpod**.
+ 1. Go to your merge request.
+ 1. In the upper right corner, select **Code**, then select **Open in Gitpod**.
Gitpod builds your development environment for your branch.
diff --git a/doc/integration/google.md b/doc/integration/google.md
index d6a37dbf30f..596700822cd 100644
--- a/doc/integration/google.md
+++ b/doc/integration/google.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/img/gitpod-button_v14_2.png b/doc/integration/img/gitpod-button_v14_2.png
deleted file mode 100644
index 04dd5b50a7f..00000000000
--- a/doc/integration/img/gitpod-button_v14_2.png
+++ /dev/null
Binary files differ
diff --git a/doc/integration/img/limit_namespaces_projects_options.png b/doc/integration/img/limit_namespaces_projects_options.png
index fa666c7491e..a3cf9933b7e 100644
--- a/doc/integration/img/limit_namespaces_projects_options.png
+++ b/doc/integration/img/limit_namespaces_projects_options.png
Binary files differ
diff --git a/doc/integration/index.md b/doc/integration/index.md
index b26c841f943..f1d16dc409d 100644
--- a/doc/integration/index.md
+++ b/doc/integration/index.md
@@ -64,7 +64,7 @@ or [Kroki](../administration/integration/kroki.md) to use diagrams in AsciiDoc a
## Integrations
-Integration with services such as Campfire, Flowdock, Jira, Pivotal Tracker, and Slack are available as [Integrations](../user/project/integrations/overview.md).
+Integration with services such as Campfire, Flowdock, Jira, Pivotal Tracker, and Slack are available as [Integrations](../user/project/integrations/index.md).
## Troubleshooting
diff --git a/doc/integration/jenkins.md b/doc/integration/jenkins.md
index 54d235b5357..7b02580dac1 100644
--- a/doc/integration/jenkins.md
+++ b/doc/integration/jenkins.md
@@ -137,7 +137,7 @@ than the [webhook integration](#configure-a-webhook).
- Merge request
- Tag push
1. Enter the **Jenkins server URL**.
-1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](../user/project/integrations/overview.md#ssl-verification).
+1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](../user/project/integrations/index.md#manage-ssl-verification).
1. Enter the **Project name**.
The project name should be URL-friendly, where spaces are replaced with underscores. To ensure
@@ -201,7 +201,7 @@ This issue can occur when the request exceeds the
[webhook timeout](../user/project/integrations/webhooks.md#webhook-fails-or-multiple-webhook-requests-are-triggered),
which is set to 10 seconds by default.
-Check the [service hook logs](../user/project/integrations/overview.md#troubleshooting-integrations)
+Check the [service hook logs](../user/project/integrations/index.md#troubleshooting-integrations)
for request failures or check the `/var/log/gitlab/gitlab-rails/production.log`
file for messages like:
diff --git a/doc/integration/jira/issues.md b/doc/integration/jira/issues.md
index 28998851697..aaff5de767b 100644
--- a/doc/integration/jira/issues.md
+++ b/doc/integration/jira/issues.md
@@ -138,6 +138,10 @@ of these filters:
Enhancements to use these filters through the user interface
[are planned](https://gitlab.com/groups/gitlab-org/-/epics/3622).
+## Create a Jira issue for a vulnerability **(ULTIMATE)**
+
+You can create a Jira issue for a vulnerability from a [Vulnerability Page](../../user/application_security/vulnerabilities/index.md#create-a-jira-issue-for-a-vulnerability).
+
## Automatic issue transitions
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55773) in GitLab 13.11.
diff --git a/doc/integration/kerberos.md b/doc/integration/kerberos.md
index 17a81419ad0..73674b66f05 100644
--- a/doc/integration/kerberos.md
+++ b/doc/integration/kerberos.md
@@ -299,9 +299,11 @@ Kerberos ticket-based authentication.
## Upgrading from password-based to ticket-based Kerberos sign-ins
In previous versions of GitLab users had to submit their
-Kerberos username and password to GitLab when signing in. We plan to
-remove support for password-based Kerberos sign-ins in a future
-release, so we recommend that you upgrade to ticket-based sign-ins.
+Kerberos username and password to GitLab when signing in.
+
+We [deprecated](../update/deprecations.md#omniauth-kerberos-gem) password-based
+Kerberos sign-ins in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/2908)
+it in GitLab 15.0. You must switch to ticket-based sign in.
Depending on your existing GitLab configuration, the 'Sign in with:
Kerberos SPNEGO' button may already be visible on your GitLab sign-in
diff --git a/doc/integration/mattermost/index.md b/doc/integration/mattermost/index.md
index c8e2df1f88f..5ea723abba9 100644
--- a/doc/integration/mattermost/index.md
+++ b/doc/integration/mattermost/index.md
@@ -95,6 +95,7 @@ mattermost_external_url 'http://mattermost.example.com'
gitlab_rails['enable'] = false
redis['enable'] = false
postgres_exporter['enable'] = false
+grafana['enable'] = false
```
Then follow the appropriate steps in the [Authorize GitLab Mattermost section](#authorize-gitlab-mattermost). Last, to enable
diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md
index 3d44da8b4c8..e3ec1aa16a1 100644
--- a/doc/integration/oauth2_generic.md
+++ b/doc/integration/oauth2_generic.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md
index adfb2fad941..e33f874d35a 100644
--- a/doc/integration/oauth_provider.md
+++ b/doc/integration/oauth_provider.md
@@ -88,11 +88,13 @@ The user authorization step is automatically skipped for this application.
## Expiring access tokens
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21745) in GitLab 14.3.
+> - [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.
WARNING:
-The ability to opt-out of expiring access tokens [is deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/340848).
-All existing integrations should be updated to support access token refresh.
+The ability to opt-out of expiring access tokens was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/340848)
+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:
diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md
index f6e41e808af..296de9e511a 100644
--- a/doc/integration/omniauth.md
+++ b/doc/integration/omniauth.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/openid_connect_provider.md b/doc/integration/openid_connect_provider.md
index 1254b29bfb9..cc9c8ffd012 100644
--- a/doc/integration/openid_connect_provider.md
+++ b/doc/integration/openid_connect_provider.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/salesforce.md b/doc/integration/salesforce.md
index 8d4d8ff9f52..67c24415226 100644
--- a/doc/integration/salesforce.md
+++ b/doc/integration/salesforce.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/integration/saml.md b/doc/integration/saml.md
index c5383f9e34b..ee4c34bb924 100644
--- a/doc/integration/saml.md
+++ b/doc/integration/saml.md
@@ -391,7 +391,7 @@ The requirements are the same as the previous settings:
- The IdP must pass Group information to GitLab.
- GitLab should know where to look for the groups in the SAML response, as well as which
- group(s) entail that a given user is an [auditor user](../user/permissions.md#auditor-users).
+ groups include users with the [Auditor role](../user/permissions.md#auditor-users).
```yaml
{ name: 'saml',
@@ -853,7 +853,7 @@ When configuring the Google Workspace SAML app, be sure to record the following
| SSO URL | Depends | Google Identity Provider details. Set to the GitLab `idp_sso_target_url` setting. |
| Certificate | Downloadable | Run `openssl x509 -in <your_certificate.crt> -noout -fingerprint` to generate the SHA1 fingerprint that can be used in the `idp_cert_fingerprint` setting. |
-While the Google Workspace Admin provides IdP metadata, Entity ID, and SHA-256
+While the Google Workspace Administrator provides IdP metadata, Entity ID, and SHA-256
fingerprint, they are not required. GitLab does not need that information to
connect to the Google Workspace SAML app.
diff --git a/doc/integration/sourcegraph.md b/doc/integration/sourcegraph.md
index b2e5f7b4b7d..72ad0bcc32d 100644
--- a/doc/integration/sourcegraph.md
+++ b/doc/integration/sourcegraph.md
@@ -41,7 +41,7 @@ If you are using an HTTPS connection to GitLab, you must [configure HTTPS](https
### Connect your Sourcegraph instance to your GitLab instance
-1. Navigate to the site admin area in Sourcegraph.
+1. Navigate to the site Admin Area in Sourcegraph.
1. [Configure your GitLab external service](https://docs.sourcegraph.com/admin/external_service/gitlab).
You can skip this step if you already have your GitLab repositories searchable in Sourcegraph.
1. Validate that you can search your repositories from GitLab in your Sourcegraph instance by running a test query.
diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md
index 3aba6b70b94..a7facf76f05 100644
--- a/doc/integration/twitter.md
+++ b/doc/integration/twitter.md
@@ -1,6 +1,6 @@
---
-stage: Ecosystem
-group: Integrations
+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
---
diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md
index 907c59adacb..2a007eade99 100644
--- a/doc/operations/error_tracking.md
+++ b/doc/operations/error_tracking.md
@@ -1,6 +1,6 @@
---
stage: Monitor
-group: Respond
+group: Observability
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
@@ -32,7 +32,7 @@ For error tracking to work, you need two pieces:
### Deploying Sentry
-You can sign up to the cloud hosted [Sentry](https://sentry.io), deploy your own [on-premise instance](https://github.com/getsentry/onpremise/), or use GitLab to [install Sentry to a Kubernetes cluster](../user/clusters/applications.md#install-sentry-using-gitlab-cicd).
+You can sign up to the cloud hosted [Sentry](https://sentry.io), deploy your own [on-premise instance](https://github.com/getsentry/onpremise/), or use GitLab to [install Sentry to a Kubernetes cluster](../user/infrastructure/clusters/manage/management_project_applications/sentry.md).
### Enabling Sentry
diff --git a/doc/operations/feature_flags.md b/doc/operations/feature_flags.md
index e7d78beb0b9..4b503af2cf7 100644
--- a/doc/operations/feature_flags.md
+++ b/doc/operations/feature_flags.md
@@ -402,7 +402,7 @@ docker run \
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/251234) in GitLab 13.5.
> - Showing related feature flags in issues [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/220333) in GitLab 14.1.
-You can link related issues to a feature flag. In the **Linked issues** section,
+You can link related issues to a feature flag. In the Feature Flag **Linked issues** section,
click the `+` button and input the issue reference number or the full URL of the issue.
The issues then appear in the related feature flag and the other way round.
@@ -430,7 +430,7 @@ Please note that the polling rate is configurable in SDKs. Provided that all cli
For applications looking for more scalable solution, we recommend to use [Unleash Proxy](#unleash-proxy-example).
This proxy server sits between the server and clients. It requests to the server as a behalf of the client groups,
-so the nubmer of outbound requests can be greatly reduced.
+so the number of outbound requests can be greatly reduced.
There is also an [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/295472) to give more
capacity to the current rate limit.
diff --git a/doc/operations/incident_management/alerts.md b/doc/operations/incident_management/alerts.md
index 5eb0624be31..008e41f5d64 100644
--- a/doc/operations/incident_management/alerts.md
+++ b/doc/operations/incident_management/alerts.md
@@ -202,7 +202,7 @@ To assign an alert:
1. Select your desired alert to display its details.
- ![Alert Details View Assignee(s)](img/alert_details_assignees_v13_1.png)
+ ![Alert Details View Assignees](img/alert_details_assignees_v13_1.png)
1. If the right sidebar is not expanded, select
**Expand sidebar** (**{angle-double-right}**) to expand it.
diff --git a/doc/operations/incident_management/paging.md b/doc/operations/incident_management/paging.md
index d0c14ab6e59..420454d8d8a 100644
--- a/doc/operations/incident_management/paging.md
+++ b/doc/operations/incident_management/paging.md
@@ -38,7 +38,7 @@ a single email notification for new alerts.
## Paging **(PREMIUM)**
-In projects that have an [escalation policy](escalation_policies.md) configured, on-call responder(s)
+In projects that have an [escalation policy](escalation_policies.md) configured, on-call responders
can be automatically paged about critical problems through email.
### Escalating an alert
diff --git a/doc/operations/index.md b/doc/operations/index.md
index 61d38c3d6a9..88687c2faf1 100644
--- a/doc/operations/index.md
+++ b/doc/operations/index.md
@@ -11,11 +11,11 @@ your applications.
## Measure reliability and stability with metrics (DEPRECATED)
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.7.
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7.
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, and is planned for removal in GitLab 15.0.
+This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
Metrics help you understand the health and performance of your infrastructure,
applications, and systems by providing insights into your application's reliability,
@@ -77,13 +77,20 @@ 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)
+## Aggregate and store logs (DEPRECATED) **(FREE SELF)**
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.7.
+> - [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, and is planned for removal in GitLab 15.0.
+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
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
index 26ea7aa07eb..44b998dc3ee 100644
--- a/doc/operations/metrics/embed.md
+++ b/doc/operations/metrics/embed.md
@@ -6,6 +6,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Embedding metric charts within GitLab Flavored Markdown **(FREE)**
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7.
+
+WARNING:
+This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
+
You can display metrics charts within
[GitLab Flavored Markdown (GLFM)](../../user/markdown.md)
fields such as issue or merge request descriptions. The maximum number of embedded
diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md
index b04e19807f8..937bd329570 100644
--- a/doc/operations/metrics/index.md
+++ b/doc/operations/metrics/index.md
@@ -6,6 +6,12 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Monitor your environment's metrics **(FREE)**
+> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7.
+
+WARNING:
+This feature is in its end-of-life process. It is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541)
+for use in GitLab 14.7, and is planned for removal in GitLab 16.0.
+
GitLab helps your team monitor the health and performance of your applications
and infrastructure by turning statistics and log files into charts and graphs
that are easy to understand, especially when time is short and decisions are
@@ -116,7 +122,7 @@ dashboard is visible to authenticated and non-authenticated users.
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:
-- A [connected Kubernetes cluster](../../user/project/clusters/add_remove_clusters.md)
+- A [connected Kubernetes cluster](../../user/clusters/agent/index.md)
with the matching [environment scope](../../ci/environments/index.md#scope-environments-with-specs) is used and
[Prometheus installed on the cluster](../../user/project/integrations/prometheus.md#enabling-prometheus-integration).
- Prometheus is [manually configured](../../user/project/integrations/prometheus.md#manual-configuration-of-prometheus).
diff --git a/doc/operations/tracing.md b/doc/operations/tracing.md
index bbc05bb0f9a..e68d7077328 100644
--- a/doc/operations/tracing.md
+++ b/doc/operations/tracing.md
@@ -4,14 +4,21 @@ 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
---
-# Tracing (DEPRECATED) **(FREE)**
+# Tracing (DEPRECATED) **(FREE SELF)**
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/42645) from GitLab Ultimate to GitLab Free in 13.5.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346540) in GitLab 14.7.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/359904) behind a [feature flag](../administration/feature_flags.md) named `monitor_tracing` 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/346540)
-in GitLab 14.7, and is planned for removal in GitLab 15.0.
+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_tracing`.
+On GitLab.com, this feature is not available.
+This feature is not recommended for production use.
Tracing provides insight into the performance and health of a deployed application, tracking each
function or microservice that handles a given request. Tracing makes it easy to understand the
diff --git a/doc/policy/alpha-beta-support.md b/doc/policy/alpha-beta-support.md
index ba988b38af2..1e3b591735c 100644
--- a/doc/policy/alpha-beta-support.md
+++ b/doc/policy/alpha-beta-support.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
<!-- any changes made to this page should be reflected in https://about.gitlab.com/support/statement-of-support.html#alpha--beta-features and https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha-beta-ga -->
-# Support for Alpha, Beta, and Generally Available Features **(PREMIUM)**
+# 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).
@@ -34,6 +34,14 @@ Characteristics of beta features:
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.
+## Limited Availability (LA)
+
+Characteristics of limited availability features:
+
+- Ready for production use by a small set of customers.
+- Can be booked by Deal Desk as part of an order.
+- Fully documented and [supported](https://about.gitlab.com/support/statement-of-support/#starter-premium-and-ultimate-users).
+
## Generally Available (GA)
Generally Available features means that they passed the [Production Readiness Review](https://gitlab.com/gitlab-com/gl-infra/readiness/-/blob/master/.gitlab/issue_templates/production_readiness.md) for GitLab.com, and are:
diff --git a/doc/policy/maintenance.md b/doc/policy/maintenance.md
index f05eaa677c1..8ff4e4c5035 100644
--- a/doc/policy/maintenance.md
+++ b/doc/policy/maintenance.md
@@ -123,6 +123,9 @@ the current stable release, and two previous monthly releases. In rare cases a r
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.
+
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/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md
index 5458e9952fa..7ff03989c61 100644
--- a/doc/raketasks/backup_restore.md
+++ b/doc/raketasks/backup_restore.md
@@ -379,18 +379,24 @@ sudo -u git -H bundle exec rake gitlab:backup:create GITLAB_BACKUP_MAX_CONCURREN
> - 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 and this backup will be overwritten. You can use the `BACKUP=timestamp_of_backup` option to choose which backup will be used.
+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
+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`:
@@ -399,6 +405,27 @@ Incremental backups can also be created from [an untarred backup](#skipping-tar-
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
+```
+
#### Uploading backups to a remote (cloud) storage
You can let the backup script upload (using the [Fog library](http://fog.io/))
@@ -981,7 +1008,7 @@ This procedure assumes that:
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`. It needs to be owned by the `git` user.
+`/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/
@@ -1177,6 +1204,61 @@ project or group from there:
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
+```
+
## Alternative backup strategies
If your GitLab instance contains a lot of Git repository data, you may find the
@@ -1365,6 +1447,7 @@ To prepare the new server:
1. Copy the
[SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079)
from the old server to avoid man-in-the-middle attack warnings.
+ See [Manually replicate the primary site’s SSH host keys](../administration/geo/replication/configuration.md#step-2-manually-replicate-the-primary-sites-ssh-host-keys) for example steps.
1. [Install and configure GitLab](https://about.gitlab.com/install) except
[incoming email](../administration/incoming_email.md):
1. Install GitLab.
diff --git a/doc/security/asset_proxy.md b/doc/security/asset_proxy.md
index e4849b1b658..1ccc9bfd9be 100644
--- a/doc/security/asset_proxy.md
+++ b/doc/security/asset_proxy.md
@@ -48,11 +48,11 @@ To install a Camo server as an asset proxy:
| Attribute | Description |
|:-------------------------|:-------------------------------------------------------------------------------------------------------------------------------------|
- | `asset_proxy_enabled` | Enable proxying of assets. If enabled, requires: `asset_proxy_url`). |
+ | `asset_proxy_enabled` | Enable proxying of assets. If enabled, requires: `asset_proxy_url`. |
| `asset_proxy_secret_key` | Shared secret with the asset proxy server. |
| `asset_proxy_url` | URL of the asset proxy server. |
- | `asset_proxy_whitelist` | (Deprecated: Use `asset_proxy_allowlist` instead) Assets that match these domain(s) are NOT proxied. Wildcards allowed. Your GitLab installation URL is automatically allowed. |
- | `asset_proxy_allowlist` | Assets that match these domain(s) are NOT proxied. Wildcards allowed. Your GitLab installation URL is automatically allowed. |
+ | `asset_proxy_whitelist` | (Deprecated: Use `asset_proxy_allowlist` instead) Assets that match these domains are NOT proxied. Wildcards allowed. Your GitLab installation URL is automatically allowed. |
+ | `asset_proxy_allowlist` | Assets that match these domains are NOT proxied. Wildcards allowed. Your GitLab installation URL is automatically allowed. |
1. Restart the server for the changes to take effect. Each time you change any values for the asset
proxy, you need to restart the server.
diff --git a/doc/security/rate_limits.md b/doc/security/rate_limits.md
index cdf99e8377d..ac532ee491a 100644
--- a/doc/security/rate_limits.md
+++ b/doc/security/rate_limits.md
@@ -70,6 +70,26 @@ For configuration information, see
## Non-configurable limits
+### Git operations using SSH
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78373) in GitLab 14.7.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79419) in GitLab 14.8.
+
+GitLab rate limits Git operations using SSH by user account and project. If a request from a user for a Git operation
+on a project exceeds the rate limit, GitLab drops further connection requests from that user for the project.
+
+The rate limit applies at the Git command ([plumbing](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain)) level.
+Each command has a rate limit of 600 per minute. For example:
+
+- `git push` has a rate limit of 600 per minute.
+- `git pull` has its own rate limit of 600 per minute.
+
+Because the same commands are shared by `git-upload-pack`, `git pull`, and `git clone`, they share a rate limit.
+
+The requests/minute threshold for this rate limit is not configurable. Self-managed customers can disable this
+rate limit by [disabling the feature flag](../administration/feature_flags.md#enable-or-disable-the-feature)
+with `Feature.disable(:rate_limit_gitlab_shell)`.
+
### Repository archives
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25750) in GitLab 12.9.
diff --git a/doc/security/ssh_keys_restrictions.md b/doc/security/ssh_keys_restrictions.md
index 03bc0207cf5..272d840ef13 100644
--- a/doc/security/ssh_keys_restrictions.md
+++ b/doc/security/ssh_keys_restrictions.md
@@ -24,7 +24,7 @@ the minimum key length for each technology:
1. On the left sidebar, select **Settings > General** (`/admin/application_settings/general`).
1. Expand the **Visibility and access controls** section:
- ![SSH keys restriction admin settings](img/ssh_keys_restrictions_settings.png)
+ ![SSH keys restriction Admin Area settings](img/ssh_keys_restrictions_settings.png)
If a restriction is imposed on any key type, users cannot upload new SSH keys that don't meet the
requirement. Any existing keys that don't meet it are disabled but not removed and users cannot
diff --git a/doc/security/unlock_user.md b/doc/security/unlock_user.md
index f2ad6696b9a..efe9c5784ad 100644
--- a/doc/security/unlock_user.md
+++ b/doc/security/unlock_user.md
@@ -10,7 +10,7 @@ type: howto
Users are locked after ten failed sign-in attempts. These users remain locked:
- For 10 minutes, after which time they are automatically unlocked.
-- Until an admin unlocks them from the [Admin Area](../user/admin_area/index.md) or the command line in under 10 minutes.
+- Until an administrator unlocks them from the [Admin Area](../user/admin_area/index.md) or the command line in under 10 minutes.
## Unlock a user from the Admin Area
diff --git a/doc/security/webhooks.md b/doc/security/webhooks.md
index 07b35ccebe8..c3d445103c4 100644
--- a/doc/security/webhooks.md
+++ b/doc/security/webhooks.md
@@ -49,7 +49,7 @@ This behavior can be overridden:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Network**.
1. Expand the **Outbound requests** section:
- ![Outbound requests admin settings](img/outbound_requests_section_v12_2.png)
+ ![Outbound requests Admin Area settings](img/outbound_requests_section_v12_2.png)
1. Select **Allow requests to the local network from web hooks and services**.
NOTE:
diff --git a/doc/subscriptions/bronze_starter.md b/doc/subscriptions/bronze_starter.md
index 17eafb7633e..aaa6447cb6c 100644
--- a/doc/subscriptions/bronze_starter.md
+++ b/doc/subscriptions/bronze_starter.md
@@ -65,7 +65,7 @@ the tiers are no longer mentioned in GitLab documentation:
- Merge requests:
- [Full code quality reports in the code quality tab](../user/project/merge_requests/code_quality.md#code-quality-reports)
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
- - [Multiple assignees](../user/project/merge_requests/getting_started.md#multiple-assignees)
+ - [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)
- [Required Approvals](../user/project/merge_requests/approvals/index.md#required-approvals)
- [Code Owners as eligible approvers](../user/project/merge_requests/approvals/rules.md#code-owners-as-eligible-approvers)
diff --git a/doc/subscriptions/gitlab_dedicated/index.md b/doc/subscriptions/gitlab_dedicated/index.md
new file mode 100644
index 00000000000..7c768d1b403
--- /dev/null
+++ b/doc/subscriptions/gitlab_dedicated/index.md
@@ -0,0 +1,79 @@
+---
+stage: Enablement
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# GitLab Dedicated
+
+NOTE:
+GitLab Dedicated is currently in limited availability. Please [contact us](#contact-us) if you are interested.
+
+GitLab Dedicated is a fully isolated, single-tenant SaaS service that is:
+
+- Hosted and managed by GitLab, Inc.
+- Deployed in a region of choice on AWS.
+
+GitLab Dedicated enables you to offload the operational overhead of managing the DevOps Platform. It offers a high level of tenant isolation and deployment customization, ideal for enterprises in highly-regulated industries. By deploying your GitLab instance onto separate Cloud Infrastructure from other tenants, GitLab Dedicated helps you better meet your security and compliance requirements.
+
+## 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.
+- Networking:
+ - Public connectivity
+ - Optional. Private connectivity via [AWS PrivateLink](https://aws.amazon.com/privatelink/).
+ You can specify an AWS IAM Principal and preferred Availability Zones during onboarding to enable this functionality.
+- Upgrade strategy:
+ - Monthly upgrades tracking one release behind the latest (n-1), with the latest security release.
+ - Out of band security patches provided for high severity releases.
+- Backup strategy: regular backups taken and tested.
+- Choice of cloud region: upon onboarding, choose the cloud region where you want to deploy your instance. Some AWS regions have limited features and as a result, we are not able to deploy production instances to those regions. See below for the [full list of regions](#aws-regions-not-supported) not currently supported.
+- Security: Data encrypted at rest and in transit using latest encryption standards.
+- Application: Self-managed [Ultimate feature set](https://about.gitlab.com/pricing/self-managed/feature-comparison/) with the exception of the unsupported features [listed below](#features-not-available-at-launch).
+
+## Features not available at launch
+
+Features that are not available but we plan to support in the future:
+
+- LDAP, Smartcard, Kerberos authentication
+- Custom domain
+- Advanced Search
+- Pages
+- GitLab-managed runners
+- FortiAuthenticator/FortiToken 2FA
+- Reply-by email
+- Service desk
+
+Features that we do not plan to offer at all:
+
+- Mattermost
+- Server-side Git Hooks
+
+### AWS regions not supported
+
+The following AWS regions are not available at launch:
+
+- Jakarta (ap-southeast-3)
+- Bahrain (me-south-1)
+- Hong Kong (ap-east-1)
+- Cape Town (af-south-1)
+- Milan (eu-south-1)
+- Paris (eu-west-3)
+- GovCloud
+
+## Contact us
+
+Fill in the following form to contact us and learn more about this offering.
+
+<!-- markdownlint-disable -->
+
+<!-- NOTE: The following form only shows when the site is served under HTTPS,
+ so it will not appear when developing locally or in a review app.
+ See https://gitlab.com/gitlab-com/marketing/marketing-operations/-/issues/6238#note_923358643
+-->
+
+<script src="//page.gitlab.com/js/forms2/js/forms2.min.js"></script>
+<form id="mktoForm_3226"></form>
+<script>MktoForms2.loadForm("//page.gitlab.com", "194-VVC-221", 3226);</script>
+
+<!-- markdownlint-enable -->
diff --git a/doc/subscriptions/img/support_diagram_c.png b/doc/subscriptions/img/support_diagram_c.png
index a2fed80e912..e98baed8605 100644
--- a/doc/subscriptions/img/support_diagram_c.png
+++ b/doc/subscriptions/img/support_diagram_c.png
Binary files differ
diff --git a/doc/subscriptions/index.md b/doc/subscriptions/index.md
index 824fe0bacde..58af5787f2b 100644
--- a/doc/subscriptions/index.md
+++ b/doc/subscriptions/index.md
@@ -30,6 +30,7 @@ GitLab SaaS or GitLab self-managed:
- [GitLab SaaS](gitlab_com/index.md): The GitLab software-as-a-service offering.
You don't need to install anything to use GitLab SaaS, you only need to
[sign up](https://gitlab.com/users/sign_up) and start using GitLab straight away.
+- [GitLab Dedicated](gitlab_dedicated/index.md): a single-tenant SaaS service for highly regulated and large enterprises.
- [GitLab self-managed](self_managed/index.md): Install, administer, and maintain
your own GitLab instance.
diff --git a/doc/subscriptions/quarterly_reconciliation.md b/doc/subscriptions/quarterly_reconciliation.md
index 3398902da1b..78c844b897c 100644
--- a/doc/subscriptions/quarterly_reconciliation.md
+++ b/doc/subscriptions/quarterly_reconciliation.md
@@ -70,7 +70,7 @@ sent and subject to your terms.
### Self-managed instances
-Admins receive an email **six days after the reconciliation date**.
+Administrators receive an email **six days after the reconciliation date**.
This email communicates the [overage seat quantity](self_managed/index.md#users-over-license)
and expected invoice amount.
diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md
index 6765ca19518..ce49b5a9c05 100644
--- a/doc/subscriptions/self_managed/index.md
+++ b/doc/subscriptions/self_managed/index.md
@@ -425,7 +425,7 @@ an expiration message is displayed to all administrators.
For GitLab self-managed instances, you have a 14-day grace period
before this occurs.
-- To resume functionality, acticate a new license.
+- To resume functionality, activate a new license.
- To fall back to Free features, delete the expired license.
## Contact Support
diff --git a/doc/topics/autodevops/customize.md b/doc/topics/autodevops/customize.md
index 503774ef6b5..e2d984dbbff 100644
--- a/doc/topics/autodevops/customize.md
+++ b/doc/topics/autodevops/customize.md
@@ -26,7 +26,7 @@ used for the build.
Specify either:
-- The CI/CD variable `BUILDPACK_URL` according to [`pack`'s specifications](https://buildpacks.io/docs/app-developer-guide/specify-buildpacks/).
+- The CI/CD variable `BUILDPACK_URL` with any of [`pack`'s URI specification formats](https://buildpacks.io/docs/app-developer-guide/specify-buildpacks/).
- A [`project.toml` project descriptor](https://buildpacks.io/docs/app-developer-guide/using-project-descriptor/) with the buildpacks you would like to include.
### Custom buildpacks with Herokuish
@@ -431,7 +431,7 @@ applications.
| `HELM_UPGRADE_EXTRA_ARGS` | Allows extra options in `helm upgrade` commands when deploying the application. Note that using quotes doesn't prevent word splitting. |
| `INCREMENTAL_ROLLOUT_MODE` | If present, can be used to enable an [incremental rollout](#incremental-rollout-to-production) of your application for the production environment. Set to `manual` for manual deployment jobs or `timed` for automatic rollout deployments with a 5 minute delay each one. |
| `K8S_SECRET_*` | Any variable prefixed with [`K8S_SECRET_`](#application-secret-variables) is made available by Auto DevOps as environment variables to the deployed application. |
-| `KUBE_CONTEXT` | From GitLab 14.5, can be used to select a context to use from `KUBECONFIG`. When `KUBE_CONTEXT` is blank, the default context in `KUBECONFIG` (if any) is used. A context must be selected when used [with the agent for Kubernetes](../../user/clusters/agent/ci_cd_tunnel.md). |
+| `KUBE_CONTEXT` | From GitLab 14.5, can be used to select a context to use from `KUBECONFIG`. When `KUBE_CONTEXT` is blank, the default context in `KUBECONFIG` (if any) is used. A context must be selected when used [with the agent for Kubernetes](../../user/clusters/agent/ci_cd_workflow.md). |
| `KUBE_INGRESS_BASE_DOMAIN` | Can be used to set a domain per cluster. See [cluster domains](../../user/project/clusters/gitlab_managed_clusters.md#base-domain) for more information. |
| `KUBE_NAMESPACE` | The namespace used for deployments. When using certificate-based clusters, [this value should not be overwritten directly](../../user/project/clusters/deploy_to_cluster.md#custom-namespace). |
| `KUBECONFIG` | The kubeconfig to use for deployments. User-provided values take priority over GitLab-provided values. |
@@ -479,7 +479,6 @@ The following table lists variables used to disable jobs.
| `build_artifact` | `BUILD_DISABLED` | | If the variable is present, the job isn't created. |
| `bandit-sast` | `SAST_DISABLED` | | If the variable is present, the job isn't created. |
| `brakeman-sast` | `SAST_DISABLED` | | If the variable is present, the job isn't created. |
-| `bundler-audit-dependency_scanning` | `DEPENDENCY_SCANNING_DISABLED` | | If the variable is present, the job isn't created. |
| `canary` | `CANARY_ENABLED` | | This manual job is created if the variable is present. |
| `cluster_image_scanning` | `CLUSTER_IMAGE_SCANNING_DISABLED` | | If the variable is present, the job isn't created. |
| `code_intelligence` | `CODE_INTELLIGENCE_DISABLED` | From GitLab 13.6 | If the variable is present, the job isn't created. |
@@ -503,7 +502,6 @@ The following table lists variables used to disable jobs.
| `browser_performance` | `BROWSER_PERFORMANCE_DISABLED` | From GitLab 14.0 | Browser performance. If the variable is present, the job isn't created. Replaces `performance`. |
| `phpcs-security-audit-sast` | `SAST_DISABLED` | | If the variable is present, the job isn't created. |
| `pmd-apex-sast` | `SAST_DISABLED` | | If the variable is present, the job isn't created. |
-| `retire-js-dependency_scanning` | `DEPENDENCY_SCANNING_DISABLED` | | If the variable is present, the job isn't created. |
| `review` | `REVIEW_DISABLED` | | If the variable is present, the job isn't created. |
| `review:stop` | `REVIEW_DISABLED` | | Manual job. If the variable is present, the job isn't created. |
| `sast` | `SAST_DISABLED` | | If the variable is present, the job isn't created. |
diff --git a/doc/topics/autodevops/prepare_deployment.md b/doc/topics/autodevops/prepare_deployment.md
index c23774b1ffd..7c9bf5a770e 100644
--- a/doc/topics/autodevops/prepare_deployment.md
+++ b/doc/topics/autodevops/prepare_deployment.md
@@ -51,7 +51,7 @@ as other environment [variables](../../ci/variables/index.md#cicd-variable-prece
If you don't specify the base domain in your projects and groups, Auto DevOps uses the instance-wide **Auto DevOps domain**.
-Auto DevOps requires a wildcard DNS A record matching the base domain(s). For
+Auto DevOps requires a wildcard DNS A record matching the base domains. For
a base domain of `example.com`, you'd need a DNS entry like:
```plaintext
diff --git a/doc/topics/autodevops/quick_start_guide.md b/doc/topics/autodevops/quick_start_guide.md
index 13d831aa00d..8d1bf7adc7f 100644
--- a/doc/topics/autodevops/quick_start_guide.md
+++ b/doc/topics/autodevops/quick_start_guide.md
@@ -296,7 +296,8 @@ bin/rails test test/controllers/welcome_controller_test.rb:4
To fix the broken test:
-1. Return to the **Overview** page for your merge request, and select **Open in Web IDE**.
+1. Return to your merge request.
+1. In the upper right corner, select **Code**, then select **Open in Gitpod**.
1. In the left-hand directory of files, find the `test/controllers/welcome_controller_test.rb`
file, and select it to open it.
1. Change line 7 to say `You're on Rails! Powered by GitLab Auto DevOps.`
diff --git a/doc/topics/autodevops/requirements.md b/doc/topics/autodevops/requirements.md
index 816cbbece4f..039d98efd47 100644
--- a/doc/topics/autodevops/requirements.md
+++ b/doc/topics/autodevops/requirements.md
@@ -69,7 +69,7 @@ as other environment [variables](../../ci/variables/index.md#cicd-variable-prece
If you don't specify the base domain in your projects and groups, Auto DevOps uses the instance-wide **Auto DevOps domain**.
-Auto DevOps requires a wildcard DNS A record matching the base domain(s). For
+Auto DevOps requires a wildcard DNS `A` record that matches the base domains. For
a base domain of `example.com`, you'd need a DNS entry like:
```plaintext
diff --git a/doc/topics/autodevops/stages.md b/doc/topics/autodevops/stages.md
index 790b46b6310..a677787b980 100644
--- a/doc/topics/autodevops/stages.md
+++ b/doc/topics/autodevops/stages.md
@@ -50,7 +50,7 @@ the CI/CD variable `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER`.
Each buildpack requires your project's repository to contain certain files for
Auto Build to build your application successfully. The structure is
specific to the builder and buildpacks you have selected.
-For example, when using the Heroku's builder (the default), your application's
+For example, when using the Heroku builder (the default), your application's
root directory must contain the appropriate file for your application's
language:
@@ -240,7 +240,7 @@ To learn more about
[License Compliance](../../user/compliance/license_compliance/index.md), see the
documentation.
-## Auto Container Scanning **(ULTIMATE)**
+## Auto Container Scanning
Vulnerability static analysis for containers uses [Trivy](https://aquasecurity.github.io/trivy/latest/)
to check for potential security issues in Docker images. The Auto Container Scanning stage is
@@ -551,129 +551,6 @@ workers:
terminationGracePeriodSeconds: 60
```
-### Network Policy
-
-- [Introduced](https://gitlab.com/gitlab-org/charts/auto-deploy-app/-/merge_requests/30) in GitLab 12.7.
-- [Deprecated](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
-
-By default, all Kubernetes pods are
-[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
-and accept traffic to and from any source. You can use
-[NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
-to restrict connections to and from selected pods, namespaces, and the Internet.
-
-NOTE:
-You must use a Kubernetes network plugin that implements support for
-`NetworkPolicy`. The default network plugin for Kubernetes (`kubenet`)
-[does not implement](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)
-support for it. The [Cilium](https://cilium.io/) network plugin can be
-installed as a [cluster application](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
-to enable support for network policies.
-
-You can enable deployment of a network policy by setting the following
-in the `.gitlab/auto-deploy-values.yaml` file:
-
-```yaml
-networkPolicy:
- enabled: true
-```
-
-The default policy deployed by the Auto Deploy pipeline allows
-traffic within a local namespace, and from the `gitlab-managed-apps`
-namespace. All other inbound connections are blocked. Outbound
-traffic (for example, to the Internet) is not affected by the default policy.
-
-You can also provide a custom [policy specification](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
-in the `.gitlab/auto-deploy-values.yaml` file, for example:
-
-```yaml
-networkPolicy:
- enabled: true
- spec:
- podSelector:
- matchLabels:
- app.gitlab.com/env: staging
- ingress:
- - from:
- - podSelector:
- matchLabels: {}
- - namespaceSelector:
- matchLabels:
- app.gitlab.com/managed_by: gitlab
-```
-
-For more information on installing Network Policies, see
-[Use the Cluster Management Template to Install Cilium](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
-
-### Cilium Network Policy
-
-> [Introduced](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/merge_requests/184) in GitLab 13.9.
-
-By default, all Kubernetes pods are
-[non-isolated](https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods),
-and accept traffic to and from any source. You can use
-[CiliumNetworkPolicy](https://docs.cilium.io/en/v1.8/concepts/kubernetes/policy/#ciliumnetworkpolicy)
-to restrict connections to and from selected pods, namespaces, and the internet.
-
-#### Requirements
-
-As the default network plugin for Kubernetes (`kubenet`)
-[does not implement](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)
-support for it, you must have [Cilium](https://docs.cilium.io/en/v1.8/intro/) as your Kubernetes network plugin.
-
-The [Cilium](https://cilium.io/) network plugin can be
-installed with a [cluster management project template](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium)
-to enable support for network policies.
-
-#### Configuration
-
-You can enable deployment of a network policy by setting the following
-in the `.gitlab/auto-deploy-values.yaml` file:
-
-```yaml
-ciliumNetworkPolicy:
- enabled: true
-```
-
-The default policy deployed by the Auto Deploy pipeline allows
-traffic within a local namespace, and from the `gitlab-managed-apps`
-namespace. All other inbound connections are blocked. Outbound
-traffic (for example, to the internet) is not affected by the default policy.
-
-You can also provide a custom [policy specification](https://docs.cilium.io/en/v1.8/policy/language/#simple-ingress-allow)
-in the `.gitlab/auto-deploy-values.yaml` file, for example:
-
-```yaml
-ciliumNetworkPolicy:
- enabled: true
- spec:
- endpointSelector:
- matchLabels:
- app.gitlab.com/env: staging
- ingress:
- - fromEndpoints:
- - matchLabels:
- app.gitlab.com/managed_by: gitlab
-```
-
-#### Enabling Alerts
-
-You can also enable alerts. Network policies with alerts are considered only if
-the [agent](../../user/clusters/agent/index.md)
-has been integrated.
-
-You can enable alerts as follows:
-
-```yaml
-ciliumNetworkPolicy:
- enabled: true
- alerts:
- enabled: true
-```
-
-For more information on installing Network Policies, see
-[Use the Cluster Management Template to Install Cilium](../../user/project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
-
### Running commands in the container
Applications built with [Auto Build](#auto-build) using Herokuish, the default
diff --git a/doc/topics/git/feature_branching.md b/doc/topics/git/feature_branching.md
index f0ded5511ee..d3b2510f4e8 100644
--- a/doc/topics/git/feature_branching.md
+++ b/doc/topics/git/feature_branching.md
@@ -12,7 +12,7 @@ comments: false
- Keeps changes isolated
- Consider a 1-to-1 link to issues
- Push branches to the server frequently
- - Hint: This is a cheap backup for your work-in-progress code
+ - Hint: Pushing branches is a cheap backup for your work-in-progress code.
## Feature branching sample workflow
diff --git a/doc/topics/git/git_rebase.md b/doc/topics/git/git_rebase.md
index c0bc7ed4e5c..87fce0b29ff 100644
--- a/doc/topics/git/git_rebase.md
+++ b/doc/topics/git/git_rebase.md
@@ -17,7 +17,7 @@ Before diving into this document, make sure you are familiar with using
## Git rebase
[Rebasing](https://git-scm.com/docs/git-rebase) is a very common operation in
-Git. There are the following rebase options:
+Git, and has these options:
- [Regular rebase](#regular-rebase).
- [Interactive rebase](#interactive-rebase).
@@ -69,15 +69,15 @@ changes by resetting `my-feature-branch` against `my-feature-branch-backup`:
git reset --hard my-feature-branch-backup
```
-Note that if you added changes to `my-feature-branch` after creating the backup branch,
+If you added changes to `my-feature-branch` after creating the backup branch,
you lose them when resetting.
### Regular rebase
With a regular rebase you can update your feature branch with the default
branch (or any other branch).
-This is an important step for Git-based development strategies. You can
-ensure that the changes you're adding to the codebase do not break any
+This step is important for Git-based development strategies. You can
+ensure your new changes don't break any
existing changes added to the target branch _after_ you created your feature
branch.
@@ -148,7 +148,7 @@ executes it as soon as possible.
The user performing the rebase action is considered
a user that added commits to the merge request. When the merge request approvals setting
[**Prevent approvals by users who add commits**](../../user/project/merge_requests/approvals/settings.md#prevent-approvals-by-users-who-add-commits)
-is enabled, this setting prevents the user from also approving the merge request.
+is enabled, the user can't also approve the merge request.
### Interactive rebase
@@ -158,7 +158,7 @@ commits. Use a rebase for changing past commit messages,
and organizing the commit history of your branch to keep it clean.
NOTE:
-If you want to keep the default branch commit history clean, you don't need to
+Keeping the default branch commit history clean doesn't require you to
manually squash all your commits before merging every merge request.
With [Squash and Merge](../../user/project/merge_requests/squash_and_merge.md),
GitLab does it automatically.
@@ -176,18 +176,17 @@ git rebase -i HEAD~3
Git opens the last three commits in your terminal text editor and describes
all the interactive rebase options you can use. The default option is `pick`,
which maintains the commit unchanged. Replace the keyword `pick` according to
-the operation you want to perform in each commit. To do so, you need to edit
+the operation you want to perform in each commit. To do so, edit
the commits in your terminal's text editor.
-For example, if you're using [Vim](https://www.vim.org/) as the text editor in
-a macOS's `ZSH` shell, and you want to `squash` or `fixup` all the three commits
-(join them into one):
+For example, with [Vim](https://www.vim.org/) as the text editor in
+a macOS's `ZSH` shell, you can `squash` or `fixup` (combine) all three commits:
<!-- vale gitlab.FirstPerson = NO -->
1. Press <kbd>i</kbd>
on your keyboard to switch to Vim's editing mode.
-1. Navigate with your keyboard arrows to edit the **second** commit keyword
+1. Use your keyboard arrows to edit the **second** commit keyword
from `pick` to `squash` or `fixup` (or `s` or `f`). Do the same to the **third** commit.
The first commit should be left **unchanged** (`pick`) as we want to squash
the second and third into the first.
@@ -204,7 +203,7 @@ a macOS's `ZSH` shell, and you want to `squash` or `fixup` all the three commits
<!-- vale gitlab.FirstPerson = YES -->
-Note that the steps for editing through the command line can be slightly
+The steps for editing through the command line can be slightly
different depending on your operating system and the shell you're using.
See [Numerous undo possibilities in Git](numerous_undo_possibilities_in_git/index.md#undo-staged-local-changes-without-modifying-history)
@@ -226,8 +225,8 @@ Forcing an update is **not** recommended when you're working on shared
branches.
Alternatively, you can pass the flag [`--force-with-lease`](https://git-scm.com/docs/git-push#Documentation/git-push.txt---force-with-leaseltrefnamegt)
-instead. It is safer, as it does not overwrite any work on the remote
-branch if more commits were added to the remote branch by someone else:
+instead, as it is safer. This flag preserves any new commits added to the remote
+branch by other people:
```shell
git push --force-with-lease origin my-feature-branch
diff --git a/doc/topics/git/lfs/index.md b/doc/topics/git/lfs/index.md
index db63cee3523..410d2150de5 100644
--- a/doc/topics/git/lfs/index.md
+++ b/doc/topics/git/lfs/index.md
@@ -45,7 +45,7 @@ Documentation for GitLab instance administrators is under [LFS administration do
## Using Git LFS
-Let's take a look at the workflow when you need to check large files into your Git
+Let's take a look at the workflow for checking large files into your Git
repository with Git LFS. For example, if you want to upload a very large file and
check it into your Git repository:
@@ -130,10 +130,10 @@ Technical details about how this works can be found in the [development document
## Troubleshooting
-### Encountered `n` file(s) that should have been pointers, but weren't
+### Encountered `n` files that should have been pointers, but weren't
-This error indicates the file (or files) are expected to be tracked by LFS, but for
-some reason the repository is not tracking them as LFS. This issue can be one
+This error indicates the files are expected to be tracked by LFS, but
+the repository is not tracking them as LFS. This issue can be one
potential reason for this error:
[Files not tracked with LFS when uploaded through the web interface](https://gitlab.com/gitlab-org/gitlab/-/issues/326342#note_586820485)
@@ -160,7 +160,7 @@ To resolve the problem, migrate the affected file (or files) and push back to th
### error: Repository or object not found
-There are a couple of reasons why this error can occur:
+This error can occur for a few reasons, including:
- You don't have permissions to access certain LFS object
@@ -232,7 +232,7 @@ Git LFS authenticates the user with HTTP Basic Authentication on every push for
every object, so user HTTPS credentials are required.
By default, Git has support for remembering the credentials for each repository
-you use. This is described in [Git credentials man pages](https://git-scm.com/docs/gitcredentials).
+you use. To learn more, read the [Git credentials man pages](https://git-scm.com/docs/gitcredentials).
For example, you can tell Git to remember the password for a period of time in
which you expect to push the objects:
diff --git a/doc/topics/git/merge_conflicts.md b/doc/topics/git/merge_conflicts.md
index 47276ccb0b2..03b7c03c02a 100644
--- a/doc/topics/git/merge_conflicts.md
+++ b/doc/topics/git/merge_conflicts.md
@@ -14,12 +14,12 @@ comments: false
## Merge conflicts sample workflow
-1. Checkout a new branch and edit `conflicts.rb`. Add 'Line4' and 'Line5'.
+1. Check out a new branch and edit `conflicts.rb`. Add 'Line4' and 'Line5'.
1. Commit and push.
-1. Checkout master and edit `conflicts.rb`. Add 'Line6' and 'Line7' below 'Line3'.
-1. Commit and push to master.
+1. Check out `main` and edit `conflicts.rb`. Add 'Line6' and 'Line7' below 'Line3'.
+1. Commit and push to `main``.
1. Create a merge request and watch it fail.
-1. Rebase our new branch with master.
+1. Rebase our new branch with `main`.
1. Fix conflicts on the `conflicts.rb` file.
1. Stage the file and continue rebasing.
1. Force push the changes.
@@ -34,12 +34,12 @@ git checkout -b conflicts_branch
git commit -am "add line4 and line5"
git push origin conflicts_branch
-git checkout master
+git checkout main
# vi conflicts.rb
# Add 'Line6' and 'Line7'
git commit -am "add line6 and line7"
-git push origin master
+git push origin main
```
Create a merge request on the GitLab web UI, and a conflict warning displays.
@@ -47,7 +47,7 @@ Create a merge request on the GitLab web UI, and a conflict warning displays.
```shell
git checkout conflicts_branch
git fetch
-git rebase master
+git rebase main
# Fix conflicts by editing the files.
@@ -64,6 +64,6 @@ git push origin conflicts_branch -f
## Note
- When to use `git merge` and when to use `git rebase`
-- Rebase when updating your branch with master
-- Merge when bringing changes from feature to master
+- Rebase when updating your branch with `main`
+- Merge when bringing changes from feature to `main`
- Reference: <https://www.atlassian.com/git/tutorials/merging-vs-rebasing>
diff --git a/doc/topics/git/partial_clone.md b/doc/topics/git/partial_clone.md
index cad29d30af4..91ff4d69c2f 100644
--- a/doc/topics/git/partial_clone.md
+++ b/doc/topics/git/partial_clone.md
@@ -26,7 +26,7 @@ Git 2.22.0 or later is required.
Storing large binary files in Git is normally discouraged, because every large
file added is downloaded by everyone who clones or fetches changes
-thereafter. This is slow, if not a complete obstruction when working from a slow
+thereafter. These downloads are slow and problematic, especially when working from a slow
or unreliable internet connection.
Using partial clone with a file size filter solves this problem, by excluding
@@ -65,7 +65,7 @@ The output is longer because Git:
1. Clones the repository excluding files larger than 1 megabyte.
1. Downloads any missing large files needed to check out the default branch.
-When changing branches, Git may need to download more missing files.
+When changing branches, Git may download more missing files.
## Filter by object type
@@ -147,7 +147,7 @@ For more details, see the Git documentation for
```
1. Clone and filter by path. Support for `--filter=sparse:oid` using the
- clone command is not yet fully integrated with sparse checkout.
+ clone command is not fully integrated with sparse checkout.
```shell
@@ -162,8 +162,7 @@ For more details, see the Git documentation for
WARNING:
Git integrations with `bash`, `zsh`, etc and editors that automatically
show Git status information often run `git fetch` which fetches the
- entire repository. You many need to disable or reconfigure these
- integrations.
+ entire repository. Disabling or reconfiguring these integrations might be required.
## Remove partial clone filtering
diff --git a/doc/topics/git/stash.md b/doc/topics/git/stash.md
index d321795e034..638ab559bd3 100644
--- a/doc/topics/git/stash.md
+++ b/doc/topics/git/stash.md
@@ -7,8 +7,8 @@ comments: false
# Git Stash **(FREE)**
-We use `git stash` to store our changes when they are not ready to be committed
-and we need to change to a different branch.
+We use `git stash` to store our changes when they are not ready to be committed,
+but we must change to a different branch.
- Stash:
@@ -37,7 +37,7 @@ and we need to change to a different branch.
git stash list --stat
```
-- To clean our stack we need to manually remove them:
+- To clean our stack, manually remove them:
```shell
# drop top stash
@@ -54,7 +54,7 @@ and we need to change to a different branch.
git stash pop
```
-- If we meet conflicts we need to either reset or commit our changes.
+- If we meet conflicts, either reset or commit our changes.
- Conflicts through `pop` doesn't drop a stash afterwards.
## Git Stash sample workflow
diff --git a/doc/topics/git/tags.md b/doc/topics/git/tags.md
index 8576bcd09ed..d3237fda968 100644
--- a/doc/topics/git/tags.md
+++ b/doc/topics/git/tags.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Tags **(FREE)**
-Tags are useful for marking certain deployments and releases for later
+Tags help you mark certain deployments and releases for later
reference. Git supports two types of tags:
- Annotated tags: An unchangeable part of Git history.
diff --git a/doc/topics/git/terminology.md b/doc/topics/git/terminology.md
index 35814543934..4ce87aa2d11 100644
--- a/doc/topics/git/terminology.md
+++ b/doc/topics/git/terminology.md
@@ -30,7 +30,7 @@ When you want to contribute to someone else's repository, you make a copy of it.
This copy is called a [**fork**](../../user/project/repository/forking_workflow.md#creating-a-fork).
The process is called "creating a fork."
-When you fork a repo, you create a copy of the project in your own
+When you fork a repository, you create a copy of the project in your own
[namespace](../../user/group/#namespaces). You then have write permissions to modify the project files
and settings.
@@ -53,10 +53,10 @@ upload the changes to the remote repository on GitLab.
## Pull and push
After you save a local copy of a repository and modify the files on your computer, you can upload the
-changes to GitLab. This is referred to as **pushing** to the remote, because you use the command
+changes to GitLab. This action is known as **pushing** to the remote, because you use the command
[`git push`](../../gitlab-basics/start-using-git.md#send-changes-to-gitlabcom).
When the remote repository changes, your local copy is behind. You can update your local copy with the new
changes in the remote repository.
-This is referred to as **pulling** from the remote, because you use the command
+This action is known as **pulling** from the remote, because you use the command
[`git pull`](../../gitlab-basics/start-using-git.md#download-the-latest-changes-in-the-project).
diff --git a/doc/topics/git/troubleshooting_git.md b/doc/topics/git/troubleshooting_git.md
index 0aadde7f7c2..13962ad0376 100644
--- a/doc/topics/git/troubleshooting_git.md
+++ b/doc/topics/git/troubleshooting_git.md
@@ -214,7 +214,7 @@ apply more than one:
```shell
omnibus_gitconfig['system'] = {
# Set the http.postBuffer size, in bytes
- "http" => ["postBuffer => 524288000"]
+ "http" => ["postBuffer = 524288000"]
}
```
diff --git a/doc/topics/git/useful_git_commands.md b/doc/topics/git/useful_git_commands.md
index 61f170d934a..13a40dd58ca 100644
--- a/doc/topics/git/useful_git_commands.md
+++ b/doc/topics/git/useful_git_commands.md
@@ -8,7 +8,7 @@ type: reference
# Useful Git commands **(FREE)**
The GitLab support team has collected these commands to help you. You may not
-need to use them often.
+need them frequently.
## Remotes
@@ -42,7 +42,7 @@ git reset <filename>
### Revert a file to HEAD state and remove changes
-There are two options to revert changes to a file:
+To revert changes to a file, you can use either:
- `git checkout <filename>`
- `git reset --hard <filename>`
diff --git a/doc/topics/release_your_application.md b/doc/topics/release_your_application.md
index c791b1f7185..6c94e9e78f9 100644
--- a/doc/topics/release_your_application.md
+++ b/doc/topics/release_your_application.md
@@ -37,7 +37,7 @@ approach to manage Kubernetes deployments.
#### Deploy to Kubernetes from GitLab CI/CD
With the [GitLab agent for Kubernetes](../user/clusters/agent/install/index.md), you can perform [push-based
-deployments](../user/clusters/agent/ci_cd_tunnel.md) from GitLab CI/CD. The agent provides
+deployments](../user/clusters/agent/ci_cd_workflow.md) from GitLab CI/CD. The agent provides
a secure and reliable connection between GitLab and your Kubernetes cluster.
### Deploy to AWS with GitLab CI/CD
@@ -67,5 +67,5 @@ Use [feature flags](../operations/feature_flags.md) to control and strategically
## Deploy to Google Cloud
-GitLab [Cloud Seed](../cloud_seed/index.md) is an open-source Incubation Engineering program that
+GitLab [Cloud Seed](../cloud_seed/index.md) is an open-source Incubation Engineering program that
enables you to set up deployment credentials and deploy your application to Google Cloud Run with minimal friction.
diff --git a/doc/tutorials/img/branches_dropdown_v14_10.png b/doc/tutorials/img/branches_dropdown_v14_10.png
index 73d94f9823a..926baff0ff8 100644
--- a/doc/tutorials/img/branches_dropdown_v14_10.png
+++ b/doc/tutorials/img/branches_dropdown_v14_10.png
Binary files differ
diff --git a/doc/tutorials/index.md b/doc/tutorials/index.md
index cf3c23a99a7..55f8321b559 100644
--- a/doc/tutorials/index.md
+++ b/doc/tutorials/index.md
@@ -20,7 +20,7 @@ and running quickly.
| <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Use GitLab for DevOps](https://www.youtube.com/watch?v=7q9Y1Cv-ib0) (12m 34s) | Use GitLab through the entire DevOps lifecycle, from planning to monitoring. | **{star}** |
| [Use Markdown at GitLab](../user/markdown.md) | GitLab Flavored Markdown (GLFM) is used in many areas of GitLab, for example, in merge requests. | **{star}** |
| [GitLab 201](https://gitlab.edcast.com/pathways/ECL-44010cf6-7a9c-4b9b-b684-fa08508a3252) | Go beyond the basics to learn more about using GitLab for your work. | |
-| Learn GitLab project | You might already have the **Learn GitLab** project, which has tutorial-style issues to help you learn GitLab. If not, download [this export file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/project_templates/learn_gitlab_ultimate.tar.gz) and [import it to a new project](../user/project/settings/import_export.md#import-a-project-and-its-data). | |
+| <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Learn GitLab project walkthrough](https://www.youtube.com/watch?v=-oaI2WEKdI4&list=PL05JrBw4t0KofkHq4GZJ05FnNGa11PQ4d) (59m 2s) | Step through the tutorial-style issues in the **Learn GitLab** project. If you don't have this project, download [the export file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/project_templates/learn_gitlab_ultimate.tar.gz) and [import it to a new project](../user/project/settings/import_export.md#import-a-project-and-its-data). | |
| [Productivity tips](https://about.gitlab.com/blog/2021/02/18/improve-your-gitlab-productivity-with-these-10-tips/) | Get tips to help make you a productive GitLab user. | |
| <i class="fa fa-youtube-play youtube" aria-hidden="true"></i> [Structure a multi-team organization](https://www.youtube.com/watch?v=KmASFwSap7c) (37m 37s) | Learn to use issues, milestones, epics, labels, and more to plan and manage your work. | |
@@ -66,7 +66,7 @@ configure the infrastructure for your application.
| Topic | Description | Good for beginners |
|-------|-------------|--------------------|
-| [Connect with a Kubernetes cluster](https://about.gitlab.com/blog/2021/11/18/gitops-with-gitlab-connecting-the-cluster/) | Connect a Kubernetes cluster with GitLab for pull and push based deployments and security integrations. | |
+| [Use GitOps with GitLab](https://about.gitlab.com/blog/2022/04/07/the-ultimate-guide-to-gitops-with-gitlab/) | Learn how to provision and manage a base infrastructure, connect to a Kubernetes cluster, deploy third-party applications, and carry out other infrastructure automation tasks. | |
| [Use Auto DevOps to deploy an application](../topics/autodevops/quick_start_guide.md) | Deploy an application to Google Kubernetes Engine (GKE). | |
## Publish a static website
diff --git a/doc/tutorials/make_your_first_git_commit.md b/doc/tutorials/make_your_first_git_commit.md
index 4b88b528be6..fd153b51a2c 100644
--- a/doc/tutorials/make_your_first_git_commit.md
+++ b/doc/tutorials/make_your_first_git_commit.md
@@ -255,8 +255,6 @@ Let's look in the UI and confirm your changes. Go to your project.
![Commit message](img/commit_message_v14_10.png)
-- Above the file list, select **History** to view your commit details.
-
Now you can return to the command line and change back to your personal branch
(`git checkout example-tutorial-branch`). You can continue updating files or
creating new ones. Type `git status` to view the status
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index 7e8eaef2b4c..903ae9c714c 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -36,14 +36,112 @@ For deprecation reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-deprecations-doc
-->
+{::options parse_block_html="true" /}
+
View deprecations by the product versions in which they were announced.
Each deprecation has a **planned removal milestone** and indicates whether it is a breaking change.
Most of the deprecations are **planned for removal in 15.0**, and many of them are **breaking changes**.
+<div class="js-deprecation-filters"></div>
+
+<div class="announcement-milestone">
+
+## 15.0
+
+<div class="deprecation removal-160 breaking-change">
+
+### CiCdSettingsUpdate mutation renamed to ProjectCiCdSettingsUpdate
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The `CiCdSettingsUpdate` mutation was renamed to `ProjectCiCdSettingsUpdate` in GitLab 15.0.
+The `CiCdSettingsUpdate` mutation will be removed in GitLab 16.0.
+Any user scripts that use the `CiCdSettingsUpdate` mutation must be updated to use `ProjectCiCdSettingsUpdate`
+instead.
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### GraphQL API legacyMode argument for Runner status
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The `legacyMode` argument to the `status` field in `RunnerType` will be rendered non-functional in the 16.0 release
+as part of the deprecations details in the [issue](https://gitlab.com/gitlab-org/gitlab/-/issues/351109).
+
+In GitLab 16.0 and later, the `status` field will act as if `legacyMode` is null. The `legacyMode` argument will
+be present during the 16.x cycle to avoid breaking the API signature, and will be removed altogether in the
+17.0 release.
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### PostgreSQL 12 deprecated
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Support for PostgreSQL 12 is scheduled for removal in GitLab 16.0.
+In GitLab 16.0, PostgreSQL 13 becomes the minimum required PostgreSQL version.
+
+PostgreSQL 12 will be supported for the full GitLab 15 release cycle.
+PostgreSQL 13 will also be supported for instances that want to upgrade prior to GitLab 16.0.
+
+Upgrading to PostgreSQL 13 is not yet supported for GitLab instances with Geo enabled. Geo support for PostgreSQL 13 will be announced in a minor release version of GitLab 15, after the process is fully supported and validated. For more information, read the Geo related verifications on the [support epic for PostgreSQL 13](https://gitlab.com/groups/gitlab-org/-/epics/3832).
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-152">
+
+### Vulnerability Report sort by State
+
+The ability to sort the Vulnerability Report by the `State` column was disabled and put behind a feature flag in GitLab 14.10 due to a refactor
+of the underlying data model. The feature flag has remained off by default as further refactoring will be required to ensure sorting
+by this value remains performant. Due to very low usage of the `State` column for sorting, the feature flag will instead be removed in
+GitLab 15.2 to simplify the codebase and prevent any unwanted performance degradation.
+
+**Planned removal milestone: <span class="removal-milestone">15.2</span> (2022-07-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.10
+<div class="deprecation removal-150 breaking-change">
+
+### Dependency Scanning default Java version changed to 17
+
+WARNING:
+This feature will be changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GitLab 15.0, for Dependency Scanning, the default version of Java that the scanner expects will be updated from 11 to 17. Java 17 is [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). Dependency scanning continues to support the same [range of versions (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#supported-languages-and-package-managers), only the default version is changing. If your project uses the previous default of Java 11, be sure to [set the `DS_Java_Version` variable to match](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning).
+
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2021-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
### Manual iteration management
WARNING:
@@ -72,7 +170,10 @@ arguments will be removed:
For more information about iteration cadences, you can refer to
[the documentation of the feature](https://docs.gitlab.com/ee/user/group/iterations/#iteration-cadences).
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Outdated indices of Advanced Search migrations
@@ -84,7 +185,10 @@ changes to your code, settings, or workflow.
As Advanced Search migrations usually require support multiple code paths for a long period of time, it’s important to clean those up when we safely can. We use GitLab major version upgrades as a safe time to remove backward compatibility for indices that have not been fully migrated. See the [upgrade documentation](https://docs.gitlab.com/ee/update/index.html#upgrading-to-a-new-major-version) for details.
-**Planned removal milestone: 15.0 (2021-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2021-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### Toggle notes confidentiality on APIs
@@ -96,10 +200,16 @@ changes to your code, settings, or workflow.
Toggling notes confidentiality with REST and GraphQL APIs is being deprecated. Updating notes confidential attribute is no longer supported by any means. We are changing this to simplify the experience and prevent private information from being unintentionally exposed.
-**Planned removal milestone: 16.0 (2023-05-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.9
+<div class="deprecation removal-150 breaking-change">
+
### Background upload for object storage
WARNING:
@@ -117,19 +227,28 @@ This impacts a small subset of object storage providers:
GitLab will publish additional guidance to assist affected customers in migrating.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-151">
### Deprecate support for Debian 9
Long term service and support (LTSS) for [Debian 9 Stretch ends in July 2022](https://wiki.debian.org/LTS). Therefore, we will no longer support the Debian 9 distribution for the GitLab package. Users can upgrade to Debian 10 or Debian 11.
-**Planned removal milestone: 15.1 (2022-06-22)**
+**Planned removal milestone: <span class="removal-milestone">15.1</span> (2022-06-22)**
+</div>
+
+<div class="deprecation removal-150">
### GitLab Pages running as daemon
In 15.0, support for daemon mode for GitLab Pages will be removed.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### GitLab self-monitoring project
@@ -141,7 +260,10 @@ changes to your code, settings, or workflow.
GitLab self-monitoring gives administrators of self-hosted GitLab instances the tools to monitor the health of their instances. This feature is deprecated in GitLab 14.9, and is scheduled for removal in 16.0.
-**Planned removal milestone: 16.0 (2023-05-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### GraphQL permissions change for Package settings
@@ -160,18 +282,24 @@ The permissions model for GraphQL is being updated. After 15.0, users with the G
- [Dependency Proxy time-to-live policy](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxyimagettlgrouppolicy)
- [Enabling the Dependency Proxy for your group](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxysetting)
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Move `custom_hooks_dir` setting from GitLab Shell to Gitaly
The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and will be removed from GitLab Shell in GitLab 15.0.
-**Planned removal milestone: 15.0 ()**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-1410 breaking-change">
### Permissions change for downloading Composer dependencies
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 14.10
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
@@ -180,7 +308,10 @@ The GitLab Composer repository can be used to push, search, fetch metadata about
Downloading Composer dependencies without authentication is deprecated in GitLab 14.9, and will be removed in GitLab 15.0. Starting with GitLab 15.0, you must authenticate to download Composer dependencies.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">14.10</span> (2022-04-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### htpasswd Authentication for the Container Registry
@@ -194,7 +325,10 @@ The Container Registry supports [authentication](https://gitlab.com/gitlab-org/c
Since it isn't used in the context of GitLab (the product), `htpasswd` authentication will be deprecated in GitLab 14.9 and removed in GitLab 15.0.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### user_email_lookup_limit API field
@@ -208,21 +342,15 @@ The `user_email_lookup_limit` [API field](https://docs.gitlab.com/ee/api/setting
Any API calls attempting to change the rate limits for `user_email_lookup_limit` should use `search_rate_limit` instead.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
-## 14.8
-
-### Changes to the `CI_JOB_JWT`
-
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
+<div class="announcement-milestone">
-The `CI_JOB_JWT` will be updated to support a wider variety of cloud providers. It will be changed to match [`CI_JOB_JWT_V2`](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html), but this change may not be backwards compatible for all users, including Hashicorp Vault users. To maintain the current behavior, users can switch to using `CI_JOB_JWT_V1`, or update their configuration in GitLab 15.0 to use the improved `CI_JOB_JWT`.
+## 14.8
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-149">
### Configurable Gitaly `per_repository` election strategy
@@ -231,7 +359,10 @@ Configuring the `per_repository` Gitaly election strategy is [deprecated](https:
This change is part of regular maintenance to keep our codebase clean.
-**Planned removal milestone: 14.9 (2022-03-22)**
+**Planned removal milestone: <span class="removal-milestone">14.9</span> (2022-03-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Container Network and Host Security
@@ -241,7 +372,7 @@ as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#brea
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-All functionality related to GitLab's Container Network Security and Container Host Security categories is deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies into GitLab, add the desired Helm charts into your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through the GitLab [Secure CI/CD Tunnel](https://docs.gitlab.com/ee/user/clusters/agent/repository.html#run-kubectl-commands-using-the-cicd-tunnel).
+All functionality related to GitLab's Container Network Security and Container Host Security categories is deprecated in GitLab 14.8 and scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies into GitLab, add the desired Helm charts into your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through GitLab [CI/CD](https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html).
As part of this change, the following specific capabilities within GitLab are now deprecated, and are scheduled for removal in GitLab 15.0:
@@ -252,7 +383,10 @@ As part of this change, the following specific capabilities within GitLab are no
For additional context, or to provide feedback regarding this change, please reference our open [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/7476).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Dependency Scanning Python 3.9 and 3.6 image deprecation
@@ -282,13 +416,19 @@ gemnasium-python-dependency_scanning:
name: registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python:2-python-3.9
```
-**Planned removal milestone: 15.0 (2021-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2021-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Deprecate Geo Admin UI Routes
In GitLab 13.0, we introduced new project and design replication details routes in the Geo Admin UI. These routes are `/admin/geo/replication/projects` and `/admin/geo/replication/designs`. We kept the legacy routes and redirected them to the new routes. In GitLab 15.0, we will remove support for the legacy routes `/admin/geo/projects` and `/admin/geo/designs`. Please update any bookmarks or scripts that may use the legacy routes.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Deprecate custom Geo:db:* Rake tasks
@@ -313,7 +453,10 @@ The following `geo:db:*` tasks will be replaced with their corresponding `db:*:g
- `geo:db:test:load` -> `db:test:load:geo`
- `geo:db:test:purge` -> `db:test:purge:geo`
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Deprecate feature flag PUSH_RULES_SUPERSEDE_CODE_OWNERS
@@ -325,7 +468,10 @@ changes to your code, settings, or workflow.
The feature flag `PUSH_RULES_SUPERSEDE_CODE_OWNERS` is being removed in GitLab 15.0. Upon its removal, push rules will supersede CODEOWNERS. The CODEOWNERS feature will no longer be available for access control.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Deprecate legacy Gitaly configuration methods
@@ -341,7 +487,10 @@ These variables are being replaced with standard [`config.toml` Gitaly configura
GitLab instances that use `GIT_CONFIG_SYSTEM` and `GIT_CONFIG_GLOBAL` to configure Gitaly should switch to configuring using
`config.toml`.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Elasticsearch 6.8
@@ -357,7 +506,10 @@ We recommend using the latest version of Elasticsearch 7 to benefit from all Ela
Elasticsearch 6.8 is also incompatible with Amazon OpenSearch, which we [plan to support in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/327560).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### External status check API breaking changes
@@ -383,7 +535,10 @@ and set to `passed`. Requests that:
To align with this change, API calls to list external status checks will also return the value of `passed` rather than
`approved` for status checks that have passed.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### GraphQL ID and GlobalID compatibility
@@ -445,7 +600,10 @@ You should convert any queries in the first form (using `ID` as a named type in
to one of the other two forms (using the correct appropriate type in the signature, or using
an inline argument expression).
-**Planned removal milestone: 15.0 (2022-04-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-04-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### OAuth tokens without expiration
@@ -465,7 +623,10 @@ tokens before GitLab 15.0 is released:
1. Edit the application.
1. Select **Expire access tokens** to enable them. Tokens must be revoked or they don’t expire.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Optional enforcement of PAT expiration
@@ -479,7 +640,10 @@ The feature to disable enforcement of PAT expiration is unusual from a security
We have become concerned that this unusual feature could create unexpected behavior for users.
Unexpected behavior in a security feature is inherently dangerous, so we have decided to remove this feature.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Optional enforcement of SSH expiration
@@ -493,7 +657,10 @@ The feature to disable enforcement of SSH expiration is unusual from a security
We have become concerned that this unusual feature could create unexpected behavior for users.
Unexpected behavior in a security feature is inherently dangerous, so we have decided to remove this feature.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Out-of-the-box SAST support for Java 8
@@ -516,7 +683,10 @@ In GitLab 15.0, we will:
If you rely on Java 8 being present in the analyzer environment, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352549#breaking-change).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Querying Usage Trends via the `instanceStatisticsMeasurements` GraphQL node
@@ -528,7 +698,10 @@ changes to your code, settings, or workflow.
The `instanceStatisticsMeasurements` GraphQL node has been renamed to `usageTrendsMeasurements` in 13.10 and the old field name has been marked as deprecated. To fix the existing GraphQL queries, replace `instanceStatisticsMeasurements` with `usageTrendsMeasurements`.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### REST API Runner will not accept `status` filter values of `active` or `paused`
@@ -546,7 +719,10 @@ Status values `paused` or `active` will no longer be accepted and will be replac
When checking for paused runners, API users are advised to specify `paused=true` as the query parameter.
When checking for active runners, specify `paused=false`.
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### REST API endpoint to list group runners no longer accepts `project_type` value for `type` argument
@@ -558,7 +734,10 @@ changes to your code, settings, or workflow.
The `GET /groups/:id/runners?type=project_type` endpoint will be removed in GitLab 16.0. The endpoint always returned an empty collection.
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### REST and GraphQL API Runner usage of `active` replaced by `paused`
@@ -588,7 +767,10 @@ The 16.0 release of the GitLab Runner will start using the `paused` property whe
will only be compatible with GitLab 16.0 and later. Until 16.0, GitLab will accept the deprecated `active` flag from
existing runners.
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Request profiling
@@ -606,7 +788,10 @@ It also depends on a few third-party gems that are not actively maintained anymo
For more information, check the [summary section of the deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488#deprecation-summary).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Required pipeline configurations in Premium tier
@@ -623,7 +808,10 @@ This change to move the feature to GitLab's Ultimate tier is intended to help ou
This change will also help GitLab remain consistent in its tiering strategy with the other related Ultimate-tier features of:
[Security policies](https://docs.gitlab.com/ee/user/application_security/policies/) and [compliance framework pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Retire-JS Dependency Scanning tool
@@ -637,12 +825,15 @@ As of 14.8 the retire.js job is being deprecated from Dependency Scanning. It wi
If you have explicitly excluded retire.js using DS_EXCLUDED_ANALYZERS you will need to clean up (remove the reference) in 15.0. If you have customized your pipeline's Dependency Scanning configuration related to the `retire-js-dependency_scanning` job you will want to switch to gemnasium-dependency_scanning before the removal in 15.0, to prevent your pipeline from failing. If you have not used the DS_EXCLUDED_ANALYZERS to reference retire.js, or customized your template specifically for retire.js, you will not need to take action.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-152 breaking-change">
### SAST analyzer consolidation and CI/CD template changes
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 15.2
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
@@ -652,12 +843,15 @@ GitLab SAST uses various [analyzers](https://docs.gitlab.com/ee/user/application
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).
-In GitLab 15.0, GitLab SAST will no longer use the following analyzers:
+In GitLab 15.2, 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)
- [Bandit](https://gitlab.com/gitlab-org/security-products/analyzers/bandit) (Python)
+NOTE:
+This change was originally planned for GitLab 15.0 and has been postponed.
+
These analyzers will be removed from the [GitLab-managed SAST CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml) and replaced with the [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep).
They will no longer receive routine updates, except for security issues.
We will not delete container images previously published for these analyzers; any such change would be announced as a [deprecation, removal, or breaking change announcement](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-removals-and-breaking-changes).
@@ -666,9 +860,12 @@ We will also remove Java from the scope of the [SpotBugs](https://gitlab.com/git
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).
-If you applied customizations to any of the affected analyzers, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352554#breaking-change).
+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).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.2</span> (2022-07-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### SAST support for .NET 2.1
@@ -698,7 +895,10 @@ Version 3 was [announced in GitLab 14.6](https://about.gitlab.com/releases/2021/
If you rely on .NET 2.1 support being present in the analyzer image by default, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352553#breaking-change).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Secret Detection configuration variables deprecated
@@ -719,7 +919,10 @@ You'll still be able to configure historical scanning of your commit history by
For further details, see [the deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352565).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Secure and Protect analyzer images published in new location
@@ -745,7 +948,10 @@ Otherwise, you won't receive further updates.
See the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352564) for more details.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Secure and Protect analyzer major version update
@@ -788,7 +994,10 @@ Specifically, the following are being deprecated and will no longer be updated a
- `sobelow`: version 2
- `spotbugs`: version 2
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Support for gRPC-aware proxy deployed between Gitaly and rest of GitLab
@@ -810,7 +1019,10 @@ By sending some of our internal RPC traffic through a custom protocol (instead o
increase throughput and reduce Go garbage collection latency. For more information, see
the [relevant epic](https://gitlab.com/groups/gitlab-com/gl-infra/-/epics/463).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Test coverage project CI/CD setting
@@ -821,13 +1033,16 @@ Before updating GitLab, review the details carefully to determine if you need to
changes to your code, settings, or workflow.
To simplify setting a test coverage pattern, in GitLab 15.0 the
-[project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-using-project-settings-deprecated)
+[project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-using-project-settings-removed)
is being removed.
Instead, using the project’s `.gitlab-ci.yml`, provide a regular expression with the `coverage` keyword to set
testing coverage results in merge requests.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Vulnerability Check
@@ -846,7 +1061,10 @@ The new security approvals feature is similar to vulnerability check. For exampl
- A two-step approval process can be enforced for any desired changes to security approval rules.
- A single set of security policies can be applied to multiple development projects to allow for ease in maintaining a single, centralized ruleset.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### `CI_BUILD_*` predefined variables
@@ -873,7 +1091,10 @@ The predefined CI/CD variables that start with `CI_BUILD_*` were deprecated in G
| `CI_BUILD_TOKEN` | `CI_JOB_TOKEN` |
| `CI_BUILD_TRIGGERED` | `CI_PIPELINE_TRIGGERED` |
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-150">
### `fixup!` commit messages setting draft status of associated Merge Request
@@ -885,7 +1106,10 @@ messages, as part of our streamlining of the feature.
Support for `fixup!` is now considered deprecated, and will be
removed in GitLab 15.0.
-**Planned removal milestone: 15.0 (2022-06-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-06-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `projectFingerprint` in `PipelineSecurityReportFinding` GraphQL
@@ -900,7 +1124,10 @@ GraphQL object is being deprecated. This field contains a "fingerprint" of secur
The method for calculating fingerprints has changed, resulting in different values. Going forward, the new values will be
exposed in the UUID field. Data previously available in the projectFingerprint field will eventually be removed entirely.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `started` iterations API field
@@ -912,10 +1139,16 @@ changes to your code, settings, or workflow.
The `started` field in the [iterations API](https://docs.gitlab.com/ee/api/iterations.html#list-project-iterations) is being deprecated and will be removed in GitLab 15.0. This field is being replaced with the `current` field (already available) which aligns with the naming for other time-based entities, such as milestones.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.7
+<div class="deprecation removal-150">
+
### Container scanning schemas below 14.0.0
[Container scanning report schemas](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/releases)
@@ -929,7 +1162,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will displ
[warning](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Coverage guided fuzzing schemas below 14.0.0
@@ -947,7 +1183,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will displ
[warning](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### DAST schemas below 14.0.0
@@ -965,7 +1204,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will cause
[warning to be displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Dependency scanning schemas below 14.0.0
@@ -983,7 +1225,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will cause
[warning to be displayed](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Enforced validation of security report schemas
@@ -1001,7 +1246,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will displ
[warning](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Godep support in License Compliance
@@ -1010,7 +1258,10 @@ has been replaced with Go modules.
To reduce our maintenance cost we are deprecating License Compliance for Godep projects as of 14.7
and will remove it in GitLab 15.0
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Logging in GitLab
@@ -1022,7 +1273,10 @@ changes to your code, settings, or workflow.
The logging features in GitLab allow users to install the ELK stack (Elasticsearch, Logstash, and Kibana) to aggregate and manage application logs. Users can search for relevant logs in GitLab. However, since deprecating certificate-based integration with Kubernetes clusters and GitLab Managed Apps, we don't have a recommended solution for logging within GitLab. For more information, you can follow the issue for [integrating Opstrace with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### Monitor performance metrics through Prometheus
@@ -1035,7 +1289,10 @@ changes to your code, settings, or workflow.
By displaying data stored in a Prometheus instance, GitLab allows users to view performance metrics. GitLab also displays visualizations of these metrics in dashboards. The user can connect to a previously-configured external Prometheus instance, or set up Prometheus as a GitLab Managed App.
However, since certificate-based integration with Kubernetes clusters is deprecated in GitLab, the metrics functionality in GitLab that relies on Prometheus is also deprecated. This includes the metrics visualizations in dashboards. GitLab is working to develop a single user experience based on [Opstrace](https://about.gitlab.com/press/releases/2021-12-14-gitlab-acquires-opstrace-to-expand-its-devops-platform-with-open-source-observability-solution.html). An [issue exists](https://gitlab.com/groups/gitlab-org/-/epics/6976) for you to follow work on the Opstrace integration.
-**Planned removal milestone: 16.0 (2023-05-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Pseudonymizer
@@ -1044,7 +1301,10 @@ can cause production issues with large databases,
and can interfere with object storage development.
It is now considered deprecated, and will be removed in GitLab 15.0.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### SAST schemas below 14.0.0
@@ -1062,7 +1322,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will displ
[warning](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Secret detection schemas below 14.0.0
@@ -1080,7 +1343,10 @@ To help with the transition, from GitLab 14.10, non-compliant reports will displ
[warning](https://gitlab.com/gitlab-org/gitlab/-/issues/335789#note_672853791)
in the Vulnerability Report.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Sidekiq metrics and health checks configuration
@@ -1110,13 +1376,21 @@ and only run one server (not changing the current behaviour).
Only if they are both set and a different port is provided, a separate metrics server will spin up
to serve the Sidekiq metrics, similar to the way Sidekiq will behave in 15.0.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### Static Site Editor
-The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the Web IDE. Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects.
+The Static Site Editor will no longer be available starting in GitLab 15.0. Improvements to the Markdown editing experience across GitLab will deliver smiliar benefit but with a wider reach. Incoming requests to the Static Site Editor will be redirected to the [Web IDE](https://docs.gitlab.com/ee/user/project/web_ide/index.html).
+
+Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects.
+
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-150 breaking-change">
### Tracing in GitLab
@@ -1128,7 +1402,10 @@ changes to your code, settings, or workflow.
Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distributed tracing system. GitLab users can navigate to their Jaeger instance to gain insight into the performance of a deployed application, tracking each function or microservice that handles a given request. Tracing in GitLab is deprecated in GitLab 14.7, and scheduled for removal in 15.0. To track work on a possible replacement, see the issue for [Opstrace integration with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150">
### `artifacts:report:cobertura` keyword
@@ -1137,7 +1414,10 @@ Currently, test coverage visualizations in GitLab only support Cobertura reports
[`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.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### merged_by API field
@@ -1149,23 +1429,15 @@ changes to your code, settings, or workflow.
The `merged_by` field in the [merge request API](https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests) is being deprecated and will be removed in GitLab 15.0. This field is being replaced with the `merge_user` field (already present in GraphQL) which more correctly identifies who merged a merge request when performing actions (merge when pipeline succeeds, add to merge train) other than a simple merge.
-**Planned removal milestone: 15.0 (2022-05-22)**
-
-## 14.6
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
-### API: `stale` status returned instead of `offline` or `not_connected`
+<div class="announcement-milestone">
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
-
-A breaking change will occur for the Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints in 15.0.
-
-Instead of the GitLab Runner API endpoints returning `offline` and `not_connected` for runners that have not contacted the GitLab instance in the past three months, the API endpoints will return the `stale` value, which was introduced in 14.6.
+## 14.6
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-150 breaking-change">
### CI/CD job name length limit
@@ -1177,7 +1449,10 @@ changes to your code, settings, or workflow.
In GitLab 15.0 we are going to limit the number of characters in CI/CD job names to 255. Any pipeline with job names that exceed the 255 character limit will stop working after the 15.0 release.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Legacy approval status names from License Compliance API
@@ -1191,36 +1466,10 @@ We deprecated legacy names for approval status of license policy (blacklisted, a
If you are using our License Compliance API you should stop using the `approved` and `blacklisted` query parameters, they are now `allowed` and `denied`. In 15.0 the responses will also stop using `approved` and `blacklisted` so you need to adjust any of your custom tools to use the old and new values so they do not break with the 15.0 release.
-**Planned removal milestone: 15.0 (2022-05-22)**
-
-### Runner status `not_connected` API value
-
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
-
-The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
-will return `never_contacted` instead of `not_connected` as the status values in 15.0.
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
-Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
-
-**Planned removal milestone: 15.0 (2022-05-22)**
-
-### `pipelines` fields in the Package GraphQL types
-
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
-
-As part of the work to create a [Package Registry GraphQL API](https://gitlab.com/groups/gitlab-org/-/epics/6318), the Package group deprecated the `pipelines` fields in all Package-related GraphQL types. As of GitLab 14.6, the `pipelines` field is deprecated in [`Package`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#package) and [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#packagedetailstype) due to scalability and performance concerns.
-
-In milestone 15.0, we will completely remove `pipelines` from `Package` and `PackageDetailsType`. You can follow and contribute to work on a replacement in the epic [GitLab-#7214](https://gitlab.com/groups/gitlab-org/-/epics/7214).
-
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-150 breaking-change">
### `type` and `types` keyword in CI/CD configuration
@@ -1232,7 +1481,10 @@ changes to your code, settings, or workflow.
The `type` and `types` CI/CD keywords will be removed in GitLab 15.0. Pipelines that use these keywords will stop working, so you must switch to `stage` and `stages`, which have the same behavior.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### apiFuzzingCiConfigurationCreate GraphQL mutation
@@ -1246,7 +1498,10 @@ The API Fuzzing configuration snippet is now being generated client-side and doe
API request anymore. We are therefore deprecating the `apiFuzzingCiConfigurationCreate` mutation
which isn't being used in GitLab anymore.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### bundler-audit Dependency Scanning tool
@@ -1260,48 +1515,34 @@ As of 14.6 bundler-audit is being deprecated from Dependency Scanning. It will c
If you have explicitly excluded bundler-audit using DS_EXCLUDED_ANALYZERS you will need to clean up (remove the reference) in 15.0. If you have customized your pipeline's Dependency Scanning configuration, for example to edit the `bundler-audit-dependency_scanning` job, you will want to switch to gemnasium-dependency_scanning before removal in 15.0, to prevent your pipeline from failing. If you have not used the DS_EXCLUDED_ANALYZERS to reference bundler-audit, or customized your template specifically for bundler-audit, you will not need to take action.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.5
-### Certificate-based integration with Kubernetes
+<div class="deprecation removal-150 breaking-change">
+
+### Changing an instance (shared) runner to a project (specific) runner
WARNING:
-This feature will be changed or removed in 15.6
+This feature will be changed or removed in 15.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-[The certificate-based integration with Kubernetes will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
-
-If you are a self-managed customer, in GitLab 15.0, a feature flag will be introduced so you can keep
-certificate-based integration enabled. The flag will be disabled by default.
-The flag and the related code will be removed in GitLab 15.6.
-
-Until the final removal in 15.6, features built on the integration will continue to work, and
-GitLab will continue to fix security and critical issues.
-
-If you use GitLab.com, certificate-based integrations will cease functioning in 15.0.
-
-For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
-[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab.
-See the documentation for [how to migrate](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html).
-
-For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
-
-**Planned removal milestone: 15.6 (2022-11-22)**
+In GitLab 15.0, you can no longer change an instance (shared) runner to a project (specific) runner.
-### Converting an instance (shared) runner to a project (specific) runner
+Users often accidentally change instance runners to project runners, and they're unable to change them back. GitLab does not allow you to change a project runner to a shared runner because of the security implications. A runner meant for one project could be set to run jobs for an entire instance.
-WARNING:
-This feature will be changed or removed in 15.0
-as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
-Before updating GitLab, review the details carefully to determine if you need to make any
-changes to your code, settings, or workflow.
+Administrators who need to add runners for multiple projects can register a runner for one project, then go to the Admin view and choose additional projects.
-In GitLab 15.0, we will remove the feature that enables you to convert an instance (shared) runner to a project (specific) runner. Users who need to add a runner to only a particular project can register a runner to the project directly.
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-150 breaking-change">
### Known host required for GitLab Runner SSH executor
@@ -1315,7 +1556,10 @@ In [GitLab 14.3](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/30
In GitLab 15.0 and later, the default value for this configuration option will change from `true` to `false`. This means that strict host key checking will be enforced when using the GitLab Runner SSH executor.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Must explicitly assign `AuthenticationType` for `[runners.cache.s3]`
@@ -1329,21 +1573,27 @@ In GitLab 15.0 and later, to access the AWS S3 cache, you must specify the `Auth
Prior to 14.5, if you did not define the `AuthenticationType`, GitLab Runner chose a type for you.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
### Package pipelines in API payload is paginated
WARNING:
-This feature will be changed or removed in 15.0
+This feature will be changed or removed in 16.0
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
A request to the API for `/api/v4/projects/:id/packages` returns a paginated result of packages. Each package lists all of its pipelines in this response. This is a performance concern, as it's possible for a package to have hundreds or thousands of associated pipelines.
-In milestone 15.0, we will remove the `pipelines` attribute from the API response.
+In milestone 16.0, we will remove the `pipelines` attribute from the API response.
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
-**Planned removal milestone: 15.0 (2022-05-22)**
+<div class="deprecation removal-160 breaking-change">
### REST and GraphQL API Runner status will not return `paused`
@@ -1361,7 +1611,56 @@ A runner's status will only relate to runner contact status, such as:
When checking if a runner is `paused`, API users are advised to check the boolean attribute
`paused` to be `true` instead. When checking if a runner is `active`, check if `paused` is `false`.
-**Planned removal milestone: 16.0 (2023-04-22)**
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-04-22)**
+</div>
+
+<div class="deprecation removal-156 breaking-change">
+
+### SaaS certificate-based integration with Kubernetes
+
+WARNING:
+This feature will be changed or removed in 15.6
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The certificate-based integration with Kubernetes will be [deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/). As a GitLab SaaS customer, on new namespaces, you will no longer be able to integrate GitLab and your cluster using the certificate-based approach as of GitLab 15.0. The integration for current users will be enabled per namespace. The integrations are expected to be switched off completely on GitLab SaaS around 2022 November 22.
+
+For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
+[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
+
+For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
+GitLab self-managed customers can still use the feature [with a feature flag](https://docs.gitlab.com/ee/update/deprecations.html#self-managed-certificate-based-integration-with-kubernetes).
+
+**Planned removal milestone: <span class="removal-milestone">15.6</span> (2022-11-22)**
+</div>
+
+<div class="deprecation removal-160 breaking-change">
+
+### Self-managed certificate-based integration with Kubernetes
+
+WARNING:
+This feature will be changed or removed in 16.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The certificate-based integration with Kubernetes [will be deprecated and removed](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/).
+
+As a self-managed customer, we are introducing a feature flag in GitLab 15.0 so you can keep your certificate-based integration enabled. However, the feature flag will be disabled by default, so this change is a **breaking change**.
+
+In GitLab 16.0 we will remove both the feature and its related code. Until the final removal in 16.0, features built on this integration will continue to work, if you enable the feature flag. Until the feature is removed, GitLab will continue to fix security and critical issues as they arise.
+
+For a more robust, secure, forthcoming, and reliable integration with Kubernetes, we recommend you use the
+[agent for Kubernetes](https://docs.gitlab.com/ee/user/clusters/agent/) to connect Kubernetes clusters with GitLab. [How do I migrate?](https://docs.gitlab.com/ee/user/infrastructure/clusters/migrate_to_gitlab_agent.html)
+
+For updates and details about this deprecation, follow [this epic](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
+
+**Planned removal milestone: <span class="removal-milestone">16.0</span> (2023-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Support for SLES 12 SP2
@@ -1373,7 +1672,10 @@ changes to your code, settings, or workflow.
Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 SP2 [ended on March 31, 2021](https://www.suse.com/lifecycle/). The CA certificates on SP2 include the expired DST root certificate, and it's not getting new CA certificate package updates. We have implemented some [workarounds](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/merge_requests/191), but we will not be able to continue to keep the build running properly.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Update to the Container Registry group-level API
@@ -1387,7 +1689,10 @@ In milestone 15.0, support for the `tags` and `tags_count` parameters will be re
The `GET /groups/:id/registry/repositories` endpoint will remain, but won't return any info about tags. To get the info about tags, you can use the existing `GET /registry/repositories/:id` endpoint, which will continue to support the `tags` and `tag_count` options as it does today. The latter must be called once per image repository.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Value Stream Analytics filtering calculation change
@@ -1401,7 +1706,10 @@ We are changing how the date filter works in Value Stream Analytics. Instead of
If you monitor Value Stream Analytics metrics and rely on the date filter, to avoid losing data, you must save the data prior to this change.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `Versions` on base `PackageType`
@@ -1415,7 +1723,10 @@ As part of the work to create a [Package Registry GraphQL API](https://gitlab.co
In milestone 15.0, we will completely remove `Version` from `PackageType`.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `defaultMergeCommitMessageWithDescription` GraphQL API field
@@ -1427,7 +1738,10 @@ changes to your code, settings, or workflow.
The GraphQL API field `defaultMergeCommitMessageWithDescription` has been deprecated and will be removed in GitLab 15.0. For projects with a commit message template set, it will ignore the template.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `dependency_proxy_for_private_groups` feature flag
@@ -1441,7 +1755,10 @@ We added a feature flag because [GitLab-#11582](https://gitlab.com/gitlab-org/gi
In milestone 15.0, we will remove the feature flag entirely. Moving forward, you must authenticate when using the Dependency Proxy.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `pipelines` field from the `version` field
@@ -1458,7 +1775,10 @@ In GraphQL, there are two `pipelines` fields that you can use in a [`PackageDeta
To mitigate possible performance problems, we will remove the `versions` field's `pipelines` field in milestone 15.0. Although you will no longer be able to get all pipelines for all versions of a package, you can still get the pipelines of a single version through the remaining `pipelines` field for that version.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `promote-db` command from `gitlab-ctl`
@@ -1470,7 +1790,10 @@ changes to your code, settings, or workflow.
In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-db` which is used to promote database nodes in multi-node Geo secondary sites. `gitlab-ctl promote-db` will continue to function as-is and be available until GitLab 15.0. We recommend that Geo customers begin testing the new `gitlab-ctl promote` command in their staging environments and incorporating the new command in their failover procedures.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### `promote-to-primary-node` command from `gitlab-ctl`
@@ -1482,7 +1805,10 @@ changes to your code, settings, or workflow.
In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-to-primary-node` which was only usable for single-node Geo sites. `gitlab-ctl promote-to-primary-node` will continue to function as-is and be available until GitLab 15.0. We recommend that Geo customers begin testing the new `gitlab-ctl promote` command in their staging environments and incorporating the new command in their failover procedures.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-148">
### openSUSE Leap 15.2 packages
@@ -1490,10 +1816,16 @@ Distribution support and security updates for openSUSE Leap 15.2 are [ending Dec
Starting in 14.5 we are providing packages for openSUSE Leap 15.3, and will stop providing packages for openSUSE Leap 15.2 in the 14.8 milestone.
-**Planned removal milestone: 14.8 (2022-02-22)**
+**Planned removal milestone: <span class="removal-milestone">14.8</span> (2022-02-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.3
+<div class="deprecation removal-150 breaking-change">
+
### Audit events for repository push events
WARNING:
@@ -1502,13 +1834,16 @@ as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#brea
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated) are now deprecated and will be removed in GitLab 15.0.
+Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are now deprecated and will be removed in GitLab 15.0.
These events have always been disabled by default and had to be manually enabled with a
feature flag. Enabling them can cause too many events to be generated which can
dramatically slow down GitLab instances. For this reason, they are being removed.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### GitLab Serverless
@@ -1522,7 +1857,10 @@ changes to your code, settings, or workflow.
We decided to remove the GitLab Serverless features as they never really resonated with our users. Besides, given the continuous development of Kubernetes and Knative, our current implementations do not even work with recent versions.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### Legacy database configuration
@@ -1538,7 +1876,10 @@ supported using a single PostgreSQL adapter, whereas the new format is changing
This deprecation mainly impacts users compiling GitLab from source because Omnibus will handle this configuration automatically.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### OmniAuth Kerberos gem
@@ -1554,15 +1895,24 @@ This gem has not been maintained and has very little usage. We therefore plan to
Note that we are not deprecating the Kerberos SPNEGO integration, only the old password-based Kerberos integration.
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.2
+<div class="deprecation removal-146">
+
### Release CLI distributed as a generic package
The [release-cli](https://gitlab.com/gitlab-org/release-cli) will be released as a [generic package](https://gitlab.com/gitlab-org/release-cli/-/packages) starting in GitLab 14.2. We will continue to deploy it as a binary to S3 until GitLab 14.5 and stop distributing it in S3 in GitLab 14.6.
-**Planned removal milestone: 14.6 (2021-12-22)**
+**Planned removal milestone: <span class="removal-milestone">14.6</span> (2021-12-22)**
+</div>
+
+<div class="deprecation removal-145">
### Rename Task Runner pod to Toolbox
@@ -1570,10 +1920,16 @@ The Task Runner pod is used to execute periodic housekeeping tasks within the Gi
This will result in the rename of the sub-chart: `gitlab/task-runner` to `gitlab/toolbox`. Resulting pods will be named along the lines of `{{ .Release.Name }}-toolbox`, which will often be `gitlab-toolbox`. They will be locatable with the label `app=toolbox`.
-**Planned removal milestone: 14.5 (2021-11-22)**
+**Planned removal milestone: <span class="removal-milestone">14.5</span> (2021-11-22)**
+</div>
+</div>
+
+<div class="announcement-milestone">
## 14.0
+<div class="deprecation removal-156">
+
### NFS for Git repository storage
With the general availability of Gitaly Cluster ([introduced in GitLab 13.0](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/)), we have deprecated development (bugfixes, performance improvements, etc) for NFS for Git repository storage in GitLab 14.0. We will continue to provide technical support for NFS for Git repositories throughout 14.x, but we will remove all support for NFS on November 22, 2022. This was originally planned for May 22, 2022, but in an effort to allow continued maturity of Gitaly Cluster, we have chosen to extend our deprecation of support date. Please see our official [Statement of Support](https://about.gitlab.com/support/statement-of-support.html#gitaly-and-nfs) for further information.
@@ -1586,7 +1942,10 @@ Gitaly Cluster offers tremendous benefits for our customers such as:
We encourage customers currently using NFS for Git repositories to plan their migration by reviewing our documentation on [migrating to Gitaly Cluster](https://docs.gitlab.com/ee/administration/gitaly/index.html#migrate-to-gitaly-cluster).
-**Planned removal milestone: 15.6 (2022-11-22)**
+**Planned removal milestone: <span class="removal-milestone">15.6</span> (2022-11-22)**
+</div>
+
+<div class="deprecation removal-150 breaking-change">
### OAuth implicit grant
@@ -1598,4 +1957,6 @@ changes to your code, settings, or workflow.
The OAuth implicit grant authorization flow will be removed in our next major release, GitLab 15.0. Any applications that use OAuth implicit grant should switch to alternative [supported OAuth flows](https://docs.gitlab.com/ee/api/oauth2.html).
-**Planned removal milestone: 15.0 (2022-05-22)**
+**Planned removal milestone: <span class="removal-milestone">15.0</span> (2022-05-22)**
+</div>
+</div>
diff --git a/doc/update/index.md b/doc/update/index.md
index a21b55b0205..24afb01396a 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -193,8 +193,12 @@ pending_job_classes.each { |job_class| Gitlab::BackgroundMigration.steal(job_cla
GitLab 13.6 introduced an issue where a background migration named `BackfillJiraTrackerDeploymentType2` can be permanently stuck in a **pending** state across upgrades. To clean up this stuck migration, see the [13.6.0 version-specific instructions](#1360).
+GitLab 14.2 introduced an issue where a background migration named `BackfillDraftStatusOnMergeRequests` can be permanently stuck in a **pending** state across upgrades when the instance lacks records that match the migration's target. To clean up this stuck migration, see the [14.2.0 version-specific instructions](#1420).
+
GitLab 14.4 introduced an issue where a background migration named `PopulateTopicsTotalProjectsCountCache` can be permanently stuck in a **pending** state across upgrades when the instance lacks records that match the migration's target. To clean up this stuck migration, see the [14.4.0 version-specific instructions](#1440).
+GitLab 14.5 introduced an issue where a background migration named `UpdateVulnerabilityOccurrencesLocation` can be permanently stuck in a **pending** state across upgrades when the instance lacks records that match the migration's target. To clean up this stuck migration, see the [14.5.0 version-specific instructions](#1450).
+
GitLab 14.8 introduced an issue where a background migration named `PopulateTopicsNonPrivateProjectsCount` can be permanently stuck in a **pending** state across upgrades. To clean up this stuck migration, see the [14.8.0 version-specific instructions](#1480).
GitLab 14.9 introduced an issue where a background migration named `ResetDuplicateCiRunnersTokenValuesOnProjects` can be permanently stuck in a **pending** state across upgrades when the instance lacks records that match the migration's target. To clean up this stuck migration, see the [14.9.0 version-specific instructions](#1490).
@@ -325,7 +329,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` -> `13.0.14` -> [`13.1.11`](#1310) -> [`13.8.8`](#1388) -> [`13.12.15`](#13120) -> [`14.0.12`](#1400) -> [latest `14.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.9.0`](#1490) -> [latest `14.Y.Z`](https://gitlab.com/gitlab-org/gitlab/-/releases)
The following table, while not exhaustive, shows some examples of the supported
upgrade paths.
@@ -402,6 +406,17 @@ 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.0.0
+
+- Elasticsearch 6.8 [is no longer supported](../integration/elasticsearch.md#version-requirements). Before you upgrade to GitLab 15.0, [update Elasticsearch to any 7.x version](../integration/elasticsearch.md#upgrade-to-a-new-elasticsearch-major-version).
+
+### 14.10.0
+
+- Before upgrading to GitLab 14.10, you need to already have the latest 14.9.Z installed on your instance.
+ The upgrade to GitLab 14.10 executes a [concurrent index drop](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84308) of unneeded
+ entries from the `ci_job_artifacts` database table. This could potentially run for multiple minutes, especially if the table has a lot of
+ traffic and the migration is unable to acquire a lock. It is advised to let this process finish as restarting may result in data loss.
+
### 14.9.0
- Database changes made by the upgrade to GitLab 14.9 can take hours or days to complete on larger GitLab instances.
@@ -418,6 +433,17 @@ and [Helm Chart deployments](https://docs.gitlab.com/charts/). They come with ap
```plaintext
Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
```
+
+ Or
+
+ ```plaintext
+ Error executing action `run` on resource 'bash[migrate gitlab-rails database]'
+ ================================================================================
+
+ Mixlib::ShellOut::ShellCommandFailed
+ ------------------------------------
+ Command execution failed. STDOUT/STDERR suppressed for sensitive resource
+ ```
- GitLab 14.9.0 includes a
[background migration `ResetDuplicateCiRunnersTokenValuesOnProjects`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79140)
@@ -462,7 +488,7 @@ that may remain stuck permanently in a **pending** state.
```ruby
Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "PopulateTopicsNonPrivateProjectsCount").find_each do |job|
- puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("PopulateTopicsNonPrivateProjectsCountq", job.arguments)
+ puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("PopulateTopicsNonPrivateProjectsCount", job.arguments)
end
```
@@ -525,10 +551,22 @@ or [init scripts](upgrading_from_source.md#configure-sysv-init-script) by [follo
For more information, refer to [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/331823).
+- GitLab 14.5.0 includes a
+ [background migration `UpdateVulnerabilityOccurrencesLocation`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72788)
+ that may remain stuck permanently in a **pending** state when the instance lacks records that match the migration's target.
+
+ To clean up this stuck job, run the following in the [GitLab Rails Console](../administration/operations/rails_console.md):
+
+ ```ruby
+ Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "UpdateVulnerabilityOccurrencesLocation").find_each do |job|
+ puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("UpdateVulnerabilityOccurrencesLocation", job.arguments)
+ end
+ ```
+
### 14.4.4
- For [zero-downtime upgrades](zero_downtime.md) on a GitLab cluster with separate Web and API nodes, you need to enable the `paginated_tree_graphql_query` [feature flag](../administration/feature_flags.md#enable-or-disable-the-feature) _before_ upgrading GitLab Web nodes to 14.4.
- This is because we [enabled `paginated_tree_graphql_query by default in 14.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70913/diffs), so if GitLab UI is on 14.4 and its API is on 14.3, the frontend will have this feature enabled but the backend will have it disabled. This will result in the following error:
+ This is because we [enabled `paginated_tree_graphql_query` by default in 14.4](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/70913/diffs), so if GitLab UI is on 14.4 and its API is on 14.3, the frontend will have this feature enabled but the backend will have it disabled. This will result in the following error:
```shell
bundle.esm.js:63 Uncaught (in promise) Error: GraphQL error: Field 'paginatedTree' doesn't exist on type 'Repository'
@@ -610,6 +648,17 @@ for how to proceed.
```
- See [Maintenance mode issue in GitLab 13.9 to 14.4](#maintenance-mode-issue-in-gitlab-139-to-144).
+- GitLab 14.2.0 includes a
+ [background migration `BackfillDraftStatusOnMergeRequests`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67687)
+ that may remain stuck permanently in a **pending** state when the instance lacks records that match the migration's target.
+
+ To clean up this stuck job, run the following in the [GitLab Rails Console](../administration/operations/rails_console.md):
+
+ ```ruby
+ Gitlab::Database::BackgroundMigrationJob.pending.where(class_name: "BackfillDraftStatusOnMergeRequests").find_each do |job|
+ puts Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded("BackfillDraftStatusOnMergeRequests", job.arguments)
+ end
+ ```
### 14.1.0
@@ -630,6 +679,16 @@ for how to proceed.
### 14.0.0
+Prerequisites:
+
+- The [GitLab 14.0 release post contains several important notes](https://about.gitlab.com/releases/2021/06/22/gitlab-14-0-released/#upgrade)
+ about pre-requisites including [using Patroni instead of repmgr](../administration/postgresql/replication_and_failover.md#switching-from-repmgr-to-patroni),
+ migrating [to hashed storage](../administration/raketasks/storage.md#migrate-to-hashed-storage),
+ and [to Puma](../administration/operations/puma.md).
+- The support of PostgreSQL 11 [has been dropped](../install/requirements.md#database). Make sure to [update your database](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server) to version 12 before updating to GitLab 14.0.
+
+Long running batched background database migrations:
+
- Database changes made by the upgrade to GitLab 14.0 can take hours or days to complete on larger GitLab instances.
These [batched background migrations](#batched-background-migrations) update whole database tables to mitigate primary key overflow and must be finished before upgrading to GitLab 14.2 or higher.
- Due to an issue where `BatchedBackgroundMigrationWorkers` were
@@ -650,13 +709,12 @@ for how to proceed.
See how to [resolve this error](../user/admin_area/monitoring/background_migrations.md#database-migrations-failing-because-of-batched-background-migration-not-finished).
+Other issues:
+
- In GitLab 13.3 some [pipeline processing methods were deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/218536)
and this code was completely removed in GitLab 14.0. If you plan to upgrade from
- **GitLab 13.2 or older** directly to 14.0 ([unsupported](#upgrading-to-a-new-major-version)), you should not have any pipelines running
- when you upgrade or the pipelines might report the wrong status when the upgrade completes.
+ **GitLab 13.2 or older** directly to 14.0, this is [unsupported](#upgrading-to-a-new-major-version).
You should instead follow a [supported upgrade path](#upgrade-paths).
-- The support of PostgreSQL 11 [has been dropped](../install/requirements.md#database). Make sure to [update your database](https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server) to version 12 before updating to GitLab 14.0.
-
- See [Maintenance mode issue in GitLab 13.9 to 14.4](#maintenance-mode-issue-in-gitlab-139-to-144).
- See [Custom Rack Attack initializers](#custom-rack-attack-initializers) if you persist your own custom Rack Attack
initializers during upgrades.
@@ -673,7 +731,16 @@ for how to proceed.
### 13.12.0
-See [Maintenance mode issue in GitLab 13.9 to 14.4](#maintenance-mode-issue-in-gitlab-139-to-144).
+- See [Maintenance mode issue in GitLab 13.9 to 14.4](#maintenance-mode-issue-in-gitlab-139-to-144).
+
+- Check the GitLab database [has no references to legacy storage](../administration/raketasks/storage.md#on-legacy-storage).
+ The GitLab 14.0 pre-install check will cause the package update to fail if there is unmigrated data:
+
+ ```plaintext
+ Checking for unmigrated data on legacy storage
+
+ Legacy storage is no longer supported. Please migrate your data to hashed storage.
+ ```
### 13.11.0
@@ -846,6 +913,20 @@ supplied with GitLab during upgrades. We recommend you use these GitLab-supplied
If you persist your own Rack Attack initializers between upgrades, you might
[get `500` errors](https://gitlab.com/gitlab-org/gitlab/-/issues/334681) when [upgrading to GitLab 14.0 and later](#1400).
+### 12.10.0
+
+- 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:
+
+ - Upgrade to 12.10.13 instead.
+ - Upgrade to 13.0.14 as soon as possible.
+
+- [GitLab 13.0 requires PostgreSQL 11](https://about.gitlab.com/releases/2020/05/22/gitlab-13-0-released/#postgresql-11-is-now-the-minimum-required-version-to-install-gitlab).
+
+ - 12.10 is the final release that shipped with PostgreSQL 9.6, 10, and 11.
+ - You should make sure that your database is PostgreSQL 11 on GitLab 12.10 before upgrading to 13.0. This will require downtime.
+
### 12.2.0
In 12.2.0, we enabled Rails' authenticated cookie encryption. Old sessions are
@@ -884,7 +965,7 @@ for more information.
When [Maintenance mode](../administration/maintenance_mode/index.md) is enabled, users cannot sign in with SSO, SAML, or LDAP.
-Users who were signed in before Maintenance mode was enabled will continue to be signed in. If the admin who enabled Maintenance mode loses their session, then they will not be able to disable Maintenance mode via the UI. In that case, you can [disable Maintenance mode via the API or Rails console](../administration/maintenance_mode/#disable-maintenance-mode).
+Users who were signed in before Maintenance mode was enabled will continue to be signed in. If the administrator who enabled Maintenance mode loses their session, then they will not be able to disable Maintenance mode via the UI. In that case, you can [disable Maintenance mode via the API or Rails console](../administration/maintenance_mode/#disable-maintenance-mode).
[This bug](https://gitlab.com/gitlab-org/gitlab/-/issues/329261) was fixed in GitLab 14.5.0 and backported into 14.4.3 and 14.3.5.
diff --git a/doc/update/package/convert_to_ee.md b/doc/update/package/convert_to_ee.md
index d5a71ba3e80..8a0d55e34af 100644
--- a/doc/update/package/convert_to_ee.md
+++ b/doc/update/package/convert_to_ee.md
@@ -91,7 +91,7 @@ The steps can be summed up to:
sudo gitlab-ctl reconfigure
```
-1. Now go to the GitLab admin panel of your server (`/admin/subscription`) and
+1. Now go to the GitLab Admin Area of your server (`/admin/subscription`) and
[add your license](../../user/admin_area/license.md).
1. After you confirm that GitLab is working as expected, you may remove the old
diff --git a/doc/update/package/index.md b/doc/update/package/index.md
index b6417e10917..faca633f446 100644
--- a/doc/update/package/index.md
+++ b/doc/update/package/index.md
@@ -37,6 +37,7 @@ GitLab package.
Upgrading versions might need some manual intervention. For more information,
check the version your are upgrading to:
+- [GitLab 15](https://docs.gitlab.com/omnibus/update/gitlab_15_changes.html)
- [GitLab 14](https://docs.gitlab.com/omnibus/update/gitlab_14_changes.html)
- [GitLab 13](https://docs.gitlab.com/omnibus/update/gitlab_13_changes.html)
- [GitLab 12](https://docs.gitlab.com/omnibus/update/gitlab_12_changes.html)
@@ -126,7 +127,9 @@ or upgrade command:
```
1. Install the specific `gitlab-ee` package by using one of the following commands
- and replacing `<version>` with the version you found in the previous step:
+ and replacing `<version>` with the next supported version you would like to install
+ (make sure to review the [upgrade path](../index.md#upgrade-paths) to confirm the
+ version you're installing is part of a supported path):
```shell
# Ubuntu/Debian
@@ -296,3 +299,12 @@ 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).
+
+### Error `An error occurred during the signature verification` when running `apt-get update`
+
+To update the GPG key of the GitLab packages server run:
+
+```shell
+curl --silent "https://packages.gitlab.com/gpg.key" | apt-key add -
+apt-get update
+```
diff --git a/doc/update/plan_your_upgrade.md b/doc/update/plan_your_upgrade.md
index 6eebfd1b278..99812e7fdb2 100644
--- a/doc/update/plan_your_upgrade.md
+++ b/doc/update/plan_your_upgrade.md
@@ -14,7 +14,7 @@ General notes:
- If possible, we recommend you test out the upgrade in a test environment before
updating your production instance. Ideally, your test environment should mimic
your production environment as closely as possible.
-- If [working with Support](https://about.gitlab.com/support/scheduling-live-upgrade-assistance.html)
+- If [working with Support](https://about.gitlab.com/support/scheduling-upgrade-assistance.html)
to create your plan, share details of your architecture, including:
- How is GitLab installed?
- What is the operating system of the node?
diff --git a/doc/update/removals.md b/doc/update/removals.md
index 7e2b4f84fa1..4e653d5ab0a 100644
--- a/doc/update/removals.md
+++ b/doc/update/removals.md
@@ -28,6 +28,694 @@ For removal reviewers (Technical Writers only):
https://about.gitlab.com/handbook/marketing/blog/release-posts/#update-the-removals-doc
-->
+## 15.0
+
+### API: `stale` status returned instead of `offline` or `not_connected`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+A breaking change was made to the Runner [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
+in 15.0.
+
+Instead of the GitLab Runner API endpoints returning `offline` and `not_connected` for runners that have not
+contacted the GitLab instance in the past three months, the API endpoints now return the `stale` value,
+which was introduced in 14.6.
+
+### Audit events for repository push events
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are removed as of GitLab 15.0.
+
+Audit events for repository events were always disabled by default and had to be manually enabled with a feature flag.
+Enabling them could slow down GitLab instances by generating too many events. Therefore, they are removed.
+
+Please note that we will add high-volume audit events in the future as part of [streaming audit events](https://docs.gitlab.com/ee/administration/audit_event_streaming.html). An example of this is how we will send [Git fetch actions](https://gitlab.com/gitlab-org/gitlab/-/issues/343984) as a streaming audit event. If you would be interested in seeing repository push events or some other action as a streaming audit event, please reach out to us!
+
+### Background upload for object storage
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+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.
+
+This impacts a small 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).
+
+### Container Network and Host Security
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+All functionality related to the Container Network Security and Container Host Security categories was deprecated in GitLab 14.8 and is scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to evaluate the following open source projects as potential solutions that can be installed and managed outside of GitLab: [AppArmor](https://gitlab.com/apparmor/apparmor), [Cilium](https://github.com/cilium/cilium), [Falco](https://github.com/falcosecurity/falco), [FluentD](https://github.com/fluent/fluentd), [Pod Security Admission](https://kubernetes.io/docs/concepts/security/pod-security-admission/). To integrate these technologies with GitLab, add the desired Helm charts in your copy of the [Cluster Management Project Template](https://docs.gitlab.com/ee/user/clusters/management_project_template.html). Deploy these Helm charts in production by calling commands through GitLab [CI/CD](https://docs.gitlab.com/ee/user/clusters/agent/ci_cd_workflow.html).
+
+As part of this change, the following capabilities within GitLab are scheduled for removal in GitLab 15.0:
+
+- The **Security & Compliance > Threat Monitoring** page.
+- The Network Policy security policy type, as found on the **Security & Compliance > Policies** page.
+- The ability to manage integrations with the following technologies through GitLab: AppArmor, Cilium, Falco, FluentD, and Pod Security Policies.
+- All APIs related to the above functionality.
+
+For additional context, or to provide feedback regarding this change, please reference our [deprecation issue](https://gitlab.com/groups/gitlab-org/-/epics/7476).
+
+### Container registry authentication with htpasswd
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The Container Registry supports [authentication](https://gitlab.com/gitlab-org/container-registry/-/blob/master/docs/configuration.md#auth) with `htpasswd`. It relies on an [Apache `htpasswd` file](https://httpd.apache.org/docs/2.4/programs/htpasswd.html), with passwords hashed using `bcrypt`.
+
+Since it isn't used in the context of GitLab (the product), `htpasswd` authentication will be deprecated in GitLab 14.9 and removed in GitLab 15.0.
+
+### Custom `geo:db:*` Rake tasks are no longer available
+
+In GitLab 14.8, we [deprecated the `geo:db:*` Rake tasks and replaced them with built-in tasks](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77269/diffs) after [switching the Geo tracking database to use Rails' 6 support of multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6458).
+The following `geo:db:*` tasks have been removed from GitLab 15.0 and have been replaced with their corresponding `db:*:geo` tasks:
+
+- `geo:db:drop` -> `db:drop:geo`
+- `geo:db:create` -> `db:create:geo`
+- `geo:db:setup` -> `db:setup:geo`
+- `geo:db:migrate` -> `db:migrate:geo`
+- `geo:db:rollback` -> `db:rollback:geo`
+- `geo:db:version` -> `db:version:geo`
+- `geo:db:reset` -> `db:reset:geo`
+- `geo:db:seed` -> `db:seed:geo`
+- `geo:schema:load:geo` -> `db:schema:load:geo`
+- `geo:db:schema:dump` -> `db:schema:dump:geo`
+- `geo:db:migrate:up` -> `db:migrate:up:geo`
+- `geo:db:migrate:down` -> `db:migrate:down:geo`
+- `geo:db:migrate:redo` -> `db:migrate:redo:geo`
+- `geo:db:migrate:status` -> `db:migrate:status:geo`
+- `geo:db:test:prepare` -> `db:test:prepare:geo`
+- `geo:db:test:load` -> `db:test:load:geo`
+- `geo:db:test:purge` -> `db:test:purge:geo`
+
+### DS_DEFAULT_ANALYZERS environment variable
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We are removing the `DS_DEFAULT_ANALYZERS` environment variable from Dependency Scanning on May 22, 2022 in 15.0. After this removal, this variable's value will be ignored. To configure which analyzers to run with the default configuration, you should use the `DS_EXCLUDED_ANALYZERS` variable instead.
+
+### Dependency Scanning default Java version changed to 17
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+For Dependency Scanning, the default version of Java that the scanner expects will be updated from 11 to 17. Java 17 is [the most up-to-date Long Term Support (LTS) version](https://en.wikipedia.org/wiki/Java_version_history). Dependency Scanning continues to support the same [range of versions (8, 11, 13, 14, 15, 16, 17)](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#supported-languages-and-package-managers), only the default version is changing. If your project uses the previous default of Java 11, be sure to [set the `DS_JAVA_VERSION` variable to match](https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning). Please note that consequently the default version of Gradle is now 7.3.3.
+
+### ELK stack logging removed in GitLab 15.0
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The logging features in GitLab allow users to install the ELK stack (Elasticsearch, Logstash, and Kibana) to aggregate and manage application logs. Users could search for relevant logs in GitLab directly. However, since deprecating certificate-based integration with Kubernetes clusters and GitLab Managed Apps, this feature is no longer available. For more information on the future of logging and observability, you can follow the issue for [integrating Opstrace with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
+
+### Elasticsearch 6.8.x in GitLab 15.0
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Elasticsearch 6.8 support has been removed in GitLab 15.0. Elasticsearch 6.8 has reached [end of life](https://www.elastic.co/support/eol).
+If you use Elasticsearch 6.8, **you must upgrade your Elasticsearch version to 7.x** prior to upgrading to GitLab 15.0.
+You should not upgrade to Elasticsearch 8 until you have completed the GitLab 15.0 upgrade.
+
+View the [version requirements](https://docs.gitlab.com/ee/integration/elasticsearch.html#version-requirements) for details.
+
+### End of support for Python 3.6 in Dependency Scanning
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+For those using Dependency Scanning for Python projects, we are removing support for the default `gemnasium-python:2` image which uses Python 3.6, as well as the custom `gemnasium-python:2-python-3.9` image which uses Python 3.9. The new default image as of GitLab 15.0 will be for Python 3.9 as it is a [supported version](https://endoflife.date/python) and 3.6 [is no longer supported](https://endoflife.date/python).
+
+### External status check API breaking changes
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The [external status check API](https://docs.gitlab.com/ee/api/status_checks.html) was originally implemented to
+support pass-by-default requests to mark a status check as passing. Pass-by-default requests are now removed.
+Specifically, the following are removed:
+
+- Requests that do not contain the `status` field.
+- Requests that have the `status` field set to `approved`.
+
+From GitLab 15.0, status checks are only set to a passing state if the `status` field is both present
+and set to `passed`. Requests that:
+
+- Do not contain the `status` field will be rejected with a `400` error. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/338827).
+- Contain any value other than `passed`, such as `approved`, cause the status check to fail. For more information, see [the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/339039).
+
+To align with this change, API calls to list external status checks also return the value of `passed` rather than
+`approved` for status checks that have passed.
+
+### GitLab Serverless
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+All functionality related to GitLab Serverless was deprecated in GitLab 14.3 and is scheduled for removal in GitLab 15.0. Users who need a replacement for this functionality are encouraged to explore using the following technologies with GitLab CI/CD:
+
+- [Serverless Framework](https://www.serverless.com)
+- [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/deploying-using-gitlab.html)
+
+For additional context, or to provide feedback regarding this change, please reference our [deprecation issue](https://gitlab.com/groups/gitlab-org/configure/-/epics/6).
+
+### Gitaly nodes in virtual storage
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Configuring the Gitaly nodes directly in the virtual storage's root configuration object has been deprecated in GitLab 13.12 and is no longer supported in GitLab 15.0. You must move the Gitaly nodes under the `'nodes'` key as described in [the Praefect configuration](https://docs.gitlab.com/ee/administration/gitaly/praefect.html#praefect).
+
+### GraphQL permissions change for Package settings
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The GitLab Package stage offers a Package Registry, Container Registry, and Dependency Proxy to help you manage all of your dependencies using GitLab. Each of these product categories has a variety of settings that can be adjusted using the API.
+
+The permissions model for GraphQL is being updated. After 15.0, users with the Guest, Reporter, and Developer role can no longer update these settings:
+
+- [Package Registry settings](https://docs.gitlab.com/ee/api/graphql/reference/#packagesettings)
+- [Container Registry cleanup policy](https://docs.gitlab.com/ee/api/graphql/reference/#containerexpirationpolicy)
+- [Dependency Proxy time-to-live policy](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxyimagettlgrouppolicy)
+- [Enabling the Dependency Proxy for your group](https://docs.gitlab.com/ee/api/graphql/reference/#dependencyproxysetting)
+
+The issue for this removal is [GitLab-#350682](https://gitlab.com/gitlab-org/gitlab/-/issues/350682)
+
+### Jaeger integration removed in GitLab 15.0
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Tracing in GitLab is an integration with Jaeger, an open-source end-to-end distributed tracing system. GitLab users could previously navigate to their Jaeger instance to gain insight into the performance of a deployed application, tracking each function or microservice that handles a given request. Tracing in GitLab was deprecated in GitLab 14.7, and removed in 15.0. To track work on a possible replacement, see the issue for [Opstrace integration with GitLab](https://gitlab.com/groups/gitlab-org/-/epics/6976).
+
+### Known host required for GitLab Runner SSH executor
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In [GitLab 14.3](https://gitlab.com/gitlab-org/gitlab-runner/-/merge_requests/3074), we added a configuration setting in the GitLab Runner `config.toml`. This setting, [`[runners.ssh.disable_strict_host_key_checking]`](https://docs.gitlab.com/runner/executors/ssh.html#security), controls whether or not to use strict host key checking with the SSH executor.
+
+In GitLab 15.0, the default value for this configuration option has changed from `true` to `false`. This means that strict host key checking will be enforced when using the GitLab Runner SSH executor.
+
+### Legacy Geo Admin UI routes
+
+In GitLab 13.0, we introduced new project and design replication details routes in the Geo Admin UI. These routes are `/admin/geo/replication/projects` and `/admin/geo/replication/designs`. We kept the legacy routes and redirected them to the new routes. These legacy routes `/admin/geo/projects` and `/admin/geo/designs` have been removed in GitLab 15.0. Please update any bookmarks or scripts that may use the legacy routes.
+
+### Legacy approval status names in License Compliance API
+
+We have now removed the deprecated legacy names for approval status of license policy (`blacklisted`, `approved`) in the API queries and responses. If you are using our License Compliance API you should stop using the `approved` and `blacklisted` query parameters, they are now `allowed` and `denied`. In 15.0 the responses will also stop using `approved` and `blacklisted` so you may need to adjust any of your custom tools.
+
+### Move Gitaly Cluster Praefect `database_host_no_proxy` and `database_port_no_proxy configs`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The Gitaly Cluster configuration keys for `praefect['database_host_no_proxy']` and `praefect['database_port_no_proxy']` are replaced with `praefect['database_direct_host']` and `praefect['database_direct_port']`.
+
+### Move `custom_hooks_dir` setting from GitLab Shell to Gitaly
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The [`custom_hooks_dir`](https://docs.gitlab.com/ee/administration/server_hooks.html#create-a-global-server-hook-for-all-repositories) setting is now configured in Gitaly, and is removed from GitLab Shell in GitLab 15.0.
+
+### OAuth implicit grant
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The OAuth implicit grant authorization flow is no longer supported. Any applications that use OAuth implicit grant must switch to alternative [supported OAuth flows](https://docs.gitlab.com/ee/api/oauth2.html).
+
+### OAuth tokens without an expiration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+GitLab no longer supports OAuth tokens [without an expiration](https://docs.gitlab.com/ee/integration/oauth_provider.html#expiring-access-tokens).
+
+Any existing token without an expiration has one automatically generated and applied.
+
+### Optional enforcement of SSH expiration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Disabling SSH expiration enforcement is unusual from a security perspective and could create unusual situations where an expired
+key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so now we enforce
+expiration on all SSH keys.
+
+### Optional enforcement of personal access token expiration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Allowing expired personal access tokens to be used is unusual from a security perspective and could create unusual situations where an
+expired key is unintentionally able to be used. Unexpected behavior in a security feature is inherently dangerous and so we now do not let expired personal access tokens be used.
+
+### Out-of-the-box SAST (SpotBugs) support for Java 8
+
+The [GitLab SAST SpotBugs analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) scans [Java, Scala, Groovy, and Kotlin code](https://docs.gitlab.com/ee/user/application_security/sast/#supported-languages-and-frameworks) for security vulnerabilities.
+For technical reasons, the analyzer must first compile the code before scanning.
+Unless you use the [pre-compilation strategy](https://docs.gitlab.com/ee/user/application_security/sast/#pre-compilation), the analyzer attempts to automatically compile your project's code.
+
+In GitLab versions prior to 15.0, the analyzer image included Java 8 and Java 11 runtimes to facilitate compilation.
+
+As of GitLab 15.0, we've:
+
+- Removed Java 8 from the analyzer image to reduce the size of the image.
+- Added Java 17 to the analyzer image to make it easier to compile with Java 17.
+- Changed the default Java version from Java 8 to Java 17.
+
+If you rely on Java 8 being present in the analyzer environment, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352549#breaking-change).
+
+### Pseudonymizer
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The Pseudonymizer feature is generally unused, can cause production issues with large databases, and can interfere with object storage development.
+It was removed in GitLab 15.0.
+
+### Remove Versions from PackageType
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+As part of the work to create a [Package Registry GraphQL API](https://gitlab.com/groups/gitlab-org/-/epics/6318), the Package group deprecated the `Version` type for the basic `PackageType` type and moved it to [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/index.html#packagedetailstype).
+
+In GitLab 15.0, we will completely remove `Version` from `PackageType`.
+
+### Remove `promote-to-primary-node` command from `gitlab-ctl`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-to-primary-node` which was only usable for single-node Geo sites. `gitlab-ctl promote-to-primary-node` has been removed in GitLab 15.0.
+
+### Remove `type` and `types` keyword from CI/CD configuration
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The `type` and `types` CI/CD keywords is removed in GitLab 15.0, so pipelines that use these keywords fail with a syntax error. Switch to `stage` and `stages`, which have the same behavior.
+
+### Remove dependency_proxy_for_private_groups feature flag
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+A feature flag was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab 13.7 as part of the change to require authentication to use the Dependency Proxy. Before GitLab 13.7, you could use the Dependency Proxy without authentication.
+
+In GitLab 15.0, we will remove the feature flag, and you must always authenticate when you use the Dependency Proxy.
+
+### Remove pipelines field from the version field
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GraphQL, there are two `pipelines` fields that you can use in a [`PackageDetailsType`](https://docs.gitlab.com/ee/api/graphql/reference/#packagedetailstype) to get the pipelines for package versions:
+
+- The `versions` field's `pipelines` field. This returns all the pipelines associated with all the package's versions, which can pull an unbounded number of objects in memory and create performance concerns.
+- The `pipelines` field of a specific `version`. This returns only the pipelines associated with that single package version.
+
+To mitigate possible performance problems, we will remove the `versions` field's `pipelines` field in GitLab 15.0. Although you will no longer be able to get all pipelines for all versions of a package, you can still get the pipelines of a single version through the remaining `pipelines` field for that version.
+
+### Removed feature flag PUSH_RULES_SUPERSEDE_CODE_OWNERS
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The feature flag `PUSH_RULES_SUPERSEDE_CODE_OWNERS` has been removed in GitLab 15.0. From now on, push rules will supersede CODEOWNERS. The CODEOWNERS feature is no longer available for access control.
+
+### Request profiling
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+[Request profiling](https://docs.gitlab.com/ee/administration/monitoring/performance/request_profiling.html) has been removed in GitLab 15.0.
+
+We're working on [consolidating our profiling tools](https://gitlab.com/groups/gitlab-org/-/epics/7327) and making them more easily accessible.
+We [evaluated](https://gitlab.com/gitlab-org/gitlab/-/issues/350152) the use of this feature and we found that it is not widely used.
+It also depends on a few third-party gems that are not actively maintained anymore, have not been updated for the latest version of Ruby, or crash frequently when profiling heavy page loads.
+
+For more information, check the [summary section of the deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/352488#deprecation-summary).
+
+### Required pipeline configurations in Premium tier
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+[Required pipeline configuration](https://docs.gitlab.com/ee/user/admin_area/settings/continuous_integration.html#required-pipeline-configuration) helps to define and mandate organization-wide pipeline configurations and is a requirement at an executive and organizational level. To align better with our [pricing philosophy](https://about.gitlab.com/company/pricing/#three-tiers), this feature is removed from the Premium tier in GitLab 15.0. This feature continues to be available in the GitLab Ultimate tier.
+
+We recommend customers use [Compliance Pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration), also in GitLab Ultimate, as an alternative as it provides greater flexibility, allowing required pipelines to be assigned to specific compliance framework labels.
+
+This change also helps GitLab remain consistent in our tiering strategy with the other related Ultimate-tier features:
+
+- [Security policies](https://docs.gitlab.com/ee/user/application_security/policies/).
+- [Compliance framework pipelines](https://docs.gitlab.com/ee/user/project/settings/index.html#compliance-pipeline-configuration).
+
+### Retire-JS Dependency Scanning tool
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We have removed support for retire.js from Dependency Scanning as of May 22, 2022 in GitLab 15.0. JavaScript scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+If you have explicitly excluded retire.js using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to retire.js. If you have customized your pipeline’s Dependency Scanning configuration related to the `retire-js-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference retire.js, or customized your template specifically for retire.js, you will not need to take any action.
+
+### Runner status `not_connected` API value
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The GitLab Runner REST and GraphQL [API](https://docs.gitlab.com/ee/api/runners.html#runners-api) endpoints
+deprecated the `not_connected` status value in GitLab 14.6 and will start returning `never_contacted` in its place
+starting in GitLab 15.0.
+
+Runners that have never contacted the GitLab instance will also return `stale` if created more than 3 months ago.
+
+### SAST support for .NET 2.1
+
+The [GitLab SAST Security Code Scan analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan) scans .NET code for security vulnerabilities.
+For technical reasons, the analyzer must first build the code to scan it.
+
+In GitLab versions prior to 15.0, the default analyzer image (version 2) included support for:
+
+- .NET 2.1
+- .NET Core 3.1
+- .NET 5.0
+
+In GitLab 15.0, we've changed the default major version for this analyzer from version 2 to version 3. This change:
+
+- Adds [severity values for vulnerabilities](https://gitlab.com/gitlab-org/gitlab/-/issues/350408) along with [other new features and improvements](https://gitlab.com/gitlab-org/security-products/analyzers/security-code-scan/-/blob/master/CHANGELOG.md).
+- Removes .NET 2.1 support.
+- Adds support for .NET 6.0, Visual Studio 2019, and Visual Studio 2022.
+
+Version 3 was [announced in GitLab 14.6](https://about.gitlab.com/releases/2021/12/22/gitlab-14-6-released/#sast-support-for-net-6) and made available as an optional upgrade.
+
+If you rely on .NET 2.1 support being present in the analyzer image by default, you must take action as detailed in the [deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352553#breaking-change).
+
+### SUSE Linux Enterprise Server 12 SP2
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Long term service and support (LTSS) for SUSE Linux Enterprise Server (SLES) 12 SP2 [ended on March 31, 2021](https://www.suse.com/lifecycle/). The CA certificates on SP2 include the expired DST root certificate, and it's not getting new CA certificate package updates. We have implemented some [workarounds](https://gitlab.com/gitlab-org/gitlab-omnibus-builder/-/merge_requests/191), but we will not be able to continue to keep the build running properly.
+
+### Secret Detection configuration variables
+
+To make it simpler and more reliable to [customize GitLab Secret Detection](https://docs.gitlab.com/ee/user/application_security/secret_detection/#customizing-settings), we've removed some of the variables that you could previously set in your CI/CD configuration.
+
+The following variables previously allowed you to customize the options for historical scanning, but interacted poorly with the [GitLab-managed CI/CD template](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Secret-Detection.gitlab-ci.yml) and are now removed:
+
+- `SECRET_DETECTION_COMMIT_FROM`
+- `SECRET_DETECTION_COMMIT_TO`
+- `SECRET_DETECTION_COMMITS`
+- `SECRET_DETECTION_COMMITS_FILE`
+
+The `SECRET_DETECTION_ENTROPY_LEVEL` previously allowed you to configure rules that only considered the entropy level of strings in your codebase, and is now removed.
+This type of entropy-only rule created an unacceptable number of incorrect results (false positives).
+
+You can still customize the behavior of the Secret Detection analyzer using the [available CI/CD variables](https://docs.gitlab.com/ee/user/application_security/secret_detection/#available-cicd-variables).
+
+For further details, see [the deprecation issue for this change](https://gitlab.com/gitlab-org/gitlab/-/issues/352565).
+
+### Sidekiq configuration for metrics and health checks
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GitLab 15.0, you can no longer serve Sidekiq metrics and health checks over a single address and port.
+
+To improve stability, availability, and prevent data loss in edge cases, GitLab now serves
+[Sidekiq metrics and health checks from two separate servers](https://gitlab.com/groups/gitlab-org/-/epics/6409).
+
+When you use Omnibus or Helm charts, if GitLab is configured for both servers to bind to the same address,
+a configuration error occurs.
+To prevent this error, choose different ports for the metrics and health check servers:
+
+- [Configure Sidekiq health checks](https://docs.gitlab.com/ee/administration/sidekiq.html#configure-health-checks)
+- [Configure the Sidekiq metrics server](https://docs.gitlab.com/ee/administration/sidekiq.html#configure-the-sidekiq-metrics-server)
+
+If you installed GitLab from source, verify manually that both servers are configured to bind to separate addresses and ports.
+
+### Static Site Editor
+
+The Static Site Editor was deprecated in GitLab 14.7 and the feature is being removed in GitLab 15.0. Incoming requests to the Static Site Editor will be redirected and open the target file to edit in the Web IDE. Current users of the Static Site Editor can view the [documentation](https://docs.gitlab.com/ee/user/project/static_site_editor/) for more information, including how to remove the configuration files from existing projects. We will continue investing in improvements to the Markdown editing experience by [maturing the Content Editor](https://gitlab.com/groups/gitlab-org/-/epics/5401) and making it available as a way to edit content across GitLab.
+
+### Support for `gitaly['internal_socket_dir']`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+Gitaly introduced a new directory that holds all runtime data Gitaly requires to operate correctly. This new directory replaces the old internal socket directory, and consequentially the usage of `gitaly['internal_socket_dir']` was deprecated in favor of `gitaly['runtime_dir']`.
+
+### Support for legacy format of `config/database.yml` removed
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The syntax of [GitLab's database](https://docs.gitlab.com/omnibus/settings/database.html)
+configuration located in `database.yml` has changed and the legacy format has been removed.
+The legacy format supported a single PostgreSQL adapter, whereas the new format supports multiple databases.
+The `main:` database needs to be defined as a first configuration item.
+
+This change only impacts users compiling GitLab from source, all the other installation methods handle this configuration automatically.
+Instructions are available [in the source update documentation](https://docs.gitlab.com/ee/update/upgrading_from_source.html#new-configuration-options-for-databaseyml).
+
+### Test coverage project CI/CD setting
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+To specify a test coverage pattern, in GitLab 15.0 the
+[project setting for test coverage parsing](https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-to-a-merge-request-removed)
+has been removed.
+
+To set test coverage parsing, use the project’s `.gitlab-ci.yml` file by providing a regular expression with the
+[`coverage` keyword](https://docs.gitlab.com/ee/ci/yaml/index.html#coverage).
+
+### The `promote-db` command is no longer available from `gitlab-ctl`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GitLab 14.5, we introduced the command `gitlab-ctl promote` to promote any Geo secondary node to a primary during a failover. This command replaces `gitlab-ctl promote-db` which is used to promote database nodes in multi-node Geo secondary sites. The `gitlab-ctl promote-db` command has been removed in GitLab 15.0.
+
+### Update to the Container Registry group-level API
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+In GitLab 15.0, support for the `tags` and `tags_count` parameters will be removed from the Container Registry API that [gets registry repositories from a group](../api/container_registry.md#within-a-group).
+
+The `GET /groups/:id/registry/repositories` endpoint will remain, but won't return any info about tags. To get the info about tags, you can use the existing `GET /registry/repositories/:id` endpoint, which will continue to support the `tags` and `tag_count` options as it does today. The latter must be called once per image repository.
+
+### Vulnerability Check
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The vulnerability check feature was deprecated in GitLab 14.8 and is scheduled for removal in GitLab 15.0. We encourage you to migrate to the new security approvals feature instead. You can do so by navigating to **Security & Compliance > Policies** and creating a new Scan Result Policy.
+
+The new security approvals feature is similar to vulnerability check. For example, both can require approvals for MRs that contain security vulnerabilities. However, security approvals improve the previous experience in several ways:
+
+- Users can choose who is allowed to edit security approval rules. An independent security or compliance team can therefore manage rules in a way that prevents development project maintainers from modifying the rules.
+- Multiple rules can be created and chained together to allow for filtering on different severity thresholds for each scanner type.
+- A two-step approval process can be enforced for any desired changes to security approval rules.
+- A single set of security policies can be applied to multiple development projects to allow for ease in maintaining a single, centralized ruleset.
+
+### `Managed-Cluster-Applications.gitlab-ci.yml`
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+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
+
+As of GitLab 15.0, the [`artifacts:report: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.
+
+### `omniauth-kerberos` gem
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The `omniauth-kerberos` gem is no longer supported. This gem has not been maintained and has very little usage. Therefore, we
+removed support for this authentication method and recommend using [SPEGNO](https://en.wikipedia.org/wiki/SPNEGO) instead. You can
+follow the [upgrade instructions](https://docs.gitlab.com/ee/integration/kerberos.html#upgrading-from-password-based-to-ticket-based-kerberos-sign-ins)
+to upgrade from the removed integration to the new supported one.
+
+We are not removing Kerberos SPNEGO integration. We are removing the old password-based Kerberos.
+
+### bundler-audit Dependency Scanning tool
+
+WARNING:
+This feature was changed or removed in 15.0
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+We are removing bundler-audit from Dependency Scanning on May 22, 2022 in 15.0. After this removal, Ruby scanning functionality will not be affected as it is still being covered by Gemnasium.
+
+If you have explicitly excluded bundler-audit using the `DS_EXCLUDED_ANALYZERS` variable, then you will be able to remove the reference to bundler-audit. If you have customized your pipeline’s Dependency Scanning configuration related to the `bundler-audit-dependency_scanning` job, then you will want to switch to `gemnasium-dependency_scanning`. If you have not used the `DS_EXCLUDED_ANALYZERS` to reference bundler-audit or customized your template specifically for bundler-audit, you will not need to take any action.
+
+## 14.10
+
+### Permissions change for downloading Composer dependencies
+
+WARNING:
+This feature was changed or removed in 14.10
+as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
+Before updating GitLab, review the details carefully to determine if you need to make any
+changes to your code, settings, or workflow.
+
+The GitLab Composer repository can be used to push, search, fetch metadata about, and download PHP dependencies. All these actions require authentication, except for downloading dependencies.
+
+Downloading Composer dependencies without authentication is deprecated in GitLab 14.9, and will be removed in GitLab 15.0. Starting with GitLab 15.0, you must authenticate to download Composer dependencies.
+
## 14.9
### Integrated error tracking disabled by default
@@ -496,9 +1184,9 @@ as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#brea
Before updating GitLab, review the details carefully to determine if you need to make any
changes to your code, settings, or workflow.
-PostgreSQL 12 will be the minimum required version in GitLab 14.0. It offers [significant improvements](https://www.postgresql.org/about/news/postgresql-12-released-1976/) to indexing, partitioning, and general performance benefits.
+GitLab 14.0 requires PostgreSQL 12 or later. It offers [significant improvements](https://www.postgresql.org/about/news/postgresql-12-released-1976/) to indexing, partitioning, and general performance benefits.
-Starting in GitLab 13.7, all new installations default to version 12. From GitLab 13.8, single-node instances are automatically upgraded as well. If you aren't ready to upgrade, you can [opt out of automatic upgrades](https://docs.gitlab.com/omnibus/settings/database.html#opt-out-of-automatic-postgresql-upgrades).
+Starting in GitLab 13.7, all new installations default to PostgreSQL version 12. From GitLab 13.8, single-node instances are automatically upgraded as well. If you aren't ready to upgrade, you can [opt out of automatic upgrades](https://docs.gitlab.com/omnibus/settings/database.html#opt-out-of-automatic-postgresql-upgrades).
### Redundant timestamp field from DORA metrics API payload
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index 4537faaaead..485dbc1b0bc 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -7,10 +7,6 @@ comments: false
# Upgrading Community Edition and Enterprise Edition from source **(FREE SELF)**
-NOTE:
-Users wishing to upgrade to 12.0.0 must take some extra steps. See the
-version specific upgrade instructions for 12.0.0 for more details.
-
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.
@@ -73,9 +69,9 @@ Download Ruby and compile it:
```shell
mkdir /tmp/ruby && cd /tmp/ruby
-curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.4.tar.gz"
-echo '3043099089608859fc8cce7f9fdccaa1f53a462457e3838ec3b25a7d609fbc5b ruby-2.7.4.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.4.tar.gz
-cd ruby-2.7.4
+curl --remote-name --location --progress-bar "https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.5.tar.gz"
+echo '2755b900a21235b443bb16dadd9032f784d4a88f143d852bc5d154f22b8781f1 ruby-2.7.5.tar.gz' | sha256sum -c - && tar xzf ruby-2.7.5.tar.gz
+cd ruby-2.7.5
./configure --disable-install-rdoc --enable-shared
make
@@ -150,7 +146,7 @@ Remember to set `git -> bin_path` to `/usr/local/bin/git` in `config/gitlab.yml`
### 7. Update PostgreSQL
WARNING:
-From GitLab 14.0, you must use at least PostgreSQL 12.
+GitLab 14.0 requires at least PostgreSQL 12.
The latest version of GitLab might depend on a more recent PostgreSQL version
than what you are running. You may also have to enable some
@@ -421,6 +417,39 @@ Example:
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.
+The `main: database` must be first. If an invalid or deprecated syntax is used, an error is generated
+during application start:
+
+```plaintext
+ERROR: This installation of GitLab uses unsupported 'config/database.yml'.
+The main: database needs to be defined as a first configuration item instead of primary. (RuntimeError)
+```
+
+Previously, the `config/database.yml` file looked like the following:
+
+```yaml
+production:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_production
+ ...
+```
+
+Starting with GitLab 15.0, it needs to define a `main` database first:
+
+```yaml
+production:
+ main:
+ adapter: postgresql
+ encoding: unicode
+ database: gitlabhq_production
+ ...
+```
+
### 14.5.0
As part of [enabling real-time issue assignees](https://gitlab.com/gitlab-org/gitlab/-/issues/330117), Action Cable is now enabled by default, and requires `config/cable.yml` to be present.
diff --git a/doc/update/zero_downtime.md b/doc/update/zero_downtime.md
index 5aa80c12f11..99457ef98d6 100644
--- a/doc/update/zero_downtime.md
+++ b/doc/update/zero_downtime.md
@@ -557,7 +557,7 @@ On each **secondary** node, executing the following:
1. Run post-deployment database migrations, specific to the Geo database
```shell
- sudo gitlab-rake geo:db:migrate
+ sudo gitlab-rake db:migrate:geo
```
After all **secondary** nodes are updated, finalize
@@ -790,7 +790,7 @@ sudo touch /etc/gitlab/skip-auto-reconfigure
```shell
sudo gitlab-ctl reconfigure
- sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-rake geo:db:migrate
+ sudo SKIP_POST_DEPLOYMENT_MIGRATIONS=true gitlab-rake db:migrate:geo
```
1. If this deploy node is normally used to serve requests or perform
@@ -866,7 +866,7 @@ sudo gitlab-ctl restart geo-logcursor
1. Run post-deployment database migrations, specific to the Geo database:
```shell
- sudo gitlab-rake geo:db:migrate
+ sudo gitlab-rake db:migrate:geo
```
1. Verify Geo configuration and dependencies
diff --git a/doc/user/admin_area/broadcast_messages.md b/doc/user/admin_area/broadcast_messages.md
index 69cb2f04c4d..9d6dcf30908 100644
--- a/doc/user/admin_area/broadcast_messages.md
+++ b/doc/user/admin_area/broadcast_messages.md
@@ -20,7 +20,7 @@ Broadcast messages can be managed using the [broadcast messages API](../../api/b
Banners are shown on the top of a page and in Git remote responses.
-![Broadcast Message Banner](img/broadcast_messages_banner_v12_10.png)
+![Broadcast Message Banner](img/broadcast_messages_banner_v15_0.png)
```shell
$ git push
@@ -66,18 +66,13 @@ To add a broadcast message:
- `padding`
- `margin`
- `text-decoration`
-1. Select one of the suggested background colors, or add the hex code of a different color. The default color is orange.
+1. Select a **Theme**. The default theme is `indigo`.
1. Select the **Dismissable** checkbox to enable users to dismiss the broadcast message.
1. Optional. Select **Target roles** to only show the broadcast message to users with the selected roles. The message displays on group, subgroup, and project pages, and does not display in Git remote responses.
1. If required, add a **Target Path** to only show the broadcast message on URLs matching that path. You can use the wildcard character `*` to match multiple URLs, for example `mygroup/myproject*`.
1. Select a date for the message to start and end.
1. Select **Add broadcast message**.
-NOTE:
-The **Background color** field expects the value to be a hexadecimal code because
-the form uses the [color_field](https://api.rubyonrails.org/v6.0.3.4/classes/ActionView/Helpers/FormHelper.html#method-i-color_field)
-helper method, which generates the proper HTML to render.
-
When a broadcast message expires, it no longer displays in the user interface but is still listed in the
list of broadcast messages.
diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md
index 21ac0f720ec..4308b45df78 100644
--- a/doc/user/admin_area/credentials_inventory.md
+++ b/doc/user/admin_area/credentials_inventory.md
@@ -40,14 +40,11 @@ To access the Credentials inventory:
If you see a **Revoke** button, you can revoke that user's PAT. Whether you see a **Revoke** button depends on the token state, and if an expiration date has been set. For more information, see the following table:
-| Token state | [Token expiration enforced?](settings/account_and_limit_settings.md#allow-expired-personal-access-tokens-to-be-used-deprecated) | Show Revoke button? | Comments |
-|-------------|------------------------|--------------------|----------------------------------------------------------------------------|
-| Active | Yes | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
-| Active | No | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
-| Expired | Yes | No | PAT expires automatically |
-| Expired | No | Yes | The administrator may revoke the PAT to prevent indefinite use |
-| Revoked | Yes | No | Not applicable; token is already revoked |
-| Revoked | No | No | Not applicable; token is already revoked |
+| Token state | Show Revoke button? | Comments |
+|-------------|---------------------|----------------------------------------------------------------------------|
+| Active | Yes | Allows administrators to revoke the PAT, such as for a compromised account |
+| Expired | No | Not applicable; token is already expired |
+| Revoked | No | Not applicable; token is already revoked |
When a PAT is revoked from the credentials inventory, the instance notifies the user by email.
diff --git a/doc/user/admin_area/geo_nodes.md b/doc/user/admin_area/geo_nodes.md
index b3b2c14adbd..43dce1921f4 100644
--- a/doc/user/admin_area/geo_nodes.md
+++ b/doc/user/admin_area/geo_nodes.md
@@ -12,7 +12,7 @@ You can configure various settings for GitLab Geo sites. For more information, s
On either the primary or secondary site:
1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Geo > Nodes**.
+1. On the left sidebar, select **Geo > Sites**.
## Common settings
diff --git a/doc/user/admin_area/img/broadcast_messages_banner_v12_10.png b/doc/user/admin_area/img/broadcast_messages_banner_v12_10.png
deleted file mode 100644
index 2e893476bc6..00000000000
--- a/doc/user/admin_area/img/broadcast_messages_banner_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/admin_area/img/broadcast_messages_banner_v15_0.png b/doc/user/admin_area/img/broadcast_messages_banner_v15_0.png
new file mode 100644
index 00000000000..e1b350142b3
--- /dev/null
+++ b/doc/user/admin_area/img/broadcast_messages_banner_v15_0.png
Binary files differ
diff --git a/doc/user/admin_area/index.md b/doc/user/admin_area/index.md
index f57672d3d36..262bb2cc931 100644
--- a/doc/user/admin_area/index.md
+++ b/doc/user/admin_area/index.md
@@ -25,7 +25,7 @@ The Admin Area is made up of the following sections:
| Section | Description |
|:-----------------------------------------------|:------------|
| **{overview}** [Overview](#overview-section) | View your GitLab [Dashboard](#admin-area-dashboard), and administer [projects](#administering-projects), [users](#administering-users), [groups](#administering-groups), [topics](#administering-topics), [jobs](#administering-jobs), [runners](#administering-runners), and [Gitaly servers](#administering-gitaly-servers). |
-| **{monitor}** Monitoring | View GitLab [system information](#system-information), and information on [background jobs](#background-jobs), [logs](#logs), [health checks](monitoring/health_check.md), [requests profiles](#requests-profiles), and [audit events](#audit-events). |
+| **{monitor}** Monitoring | View GitLab [system information](#system-information), and information on [background jobs](#background-jobs), [logs](#logs), [health checks](monitoring/health_check.md), and [audit events](#audit-events). |
| **{messages}** Messages | Send and manage [broadcast messages](broadcast_messages.md) for your users. |
| **{hook}** System Hooks | Configure [system hooks](../../administration/system_hooks.md) for many events. |
| **{applications}** Applications | Create system [OAuth applications](../../integration/oauth_provider.md) for integrations with other services. |
@@ -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-admin-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-administrator-only).
Only the first 100,000 user accounts are exported.
@@ -326,7 +326,7 @@ To search runners' descriptions:
1. In the **Search or filter results...** field, type the description of the runner you want to
find.
-1. Press Enter.
+1. Press <kbd>Enter</kbd>.
You can also filter runners by status, type, and tag. To filter:
@@ -430,10 +430,6 @@ For details of these log files and their contents, see [Log system](../../admini
The content of each log file is listed in chronological order. To minimize performance issues, a maximum 2000 lines of each log file are shown.
-### Requests Profiles
-
-The **Requests Profiles** page contains the token required for profiling. For more details, see [Request Profiling](../../administration/monitoring/performance/request_profiling.md).
-
### Audit Events **(PREMIUM SELF)**
The **Audit Events** page lists changes made within the GitLab server. With this information you can control, analyze, and track every change.
diff --git a/doc/user/admin_area/license_file.md b/doc/user/admin_area/license_file.md
index 5999e774d26..ff9e87680f9 100644
--- a/doc/user/admin_area/license_file.md
+++ b/doc/user/admin_area/license_file.md
@@ -18,8 +18,7 @@ Otherwise, to add your license:
1. Sign in to GitLab as an administrator.
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**.
-1. In the **License file** area, select **Add a license**.
-1. Add a license by either uploading the file or pasting the key.
+1. In the **Add License** area, add a license by either uploading the file or entering the key.
1. Select the **Terms of Service** checkbox.
1. Select **Add license**.
diff --git a/doc/user/admin_area/moderate_users.md b/doc/user/admin_area/moderate_users.md
index e8db319df77..53c08d8cbc1 100644
--- a/doc/user/admin_area/moderate_users.md
+++ b/doc/user/admin_area/moderate_users.md
@@ -15,7 +15,7 @@ users.
A user in _pending approval_ state requires action by an administrator. A user sign up can be in a
pending approval state because an administrator has enabled any of the following options:
-- [Require admin approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
+- [Require administrator approval for new sign-ups](settings/sign_up_restrictions.md#require-administrator-approval-for-new-sign-ups) setting.
- [User cap](settings/sign_up_restrictions.md#user-cap).
- [Block auto-created users (OmniAuth)](../../integration/omniauth.md#configure-initial-settings)
- [Block auto-created users (LDAP)](../../administration/auth/ldap/index.md#basic-configuration-settings)
diff --git a/doc/user/admin_area/monitoring/background_migrations.md b/doc/user/admin_area/monitoring/background_migrations.md
index 726827054da..b666c0c5ad2 100644
--- a/doc/user/admin_area/monitoring/background_migrations.md
+++ b/doc/user/admin_area/monitoring/background_migrations.md
@@ -190,7 +190,7 @@ sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackground
In GitLab 14.8, the `BackfillNamespaceIdForNamespaceRoute` batched background migration job
may fail to complete. When retried, a `500 Server Error` is returned. This issue was
-[resolved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82387) in GitLab 14.9.
+[resolved](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82387) in GitLab 14.9.
To resolve this issue, [upgrade GitLab](../../../update/index.md) from 14.8 to 14.9.
You can ignore the failed batch migration until after you update to GitLab 14.9.
diff --git a/doc/user/admin_area/reporting/spamcheck.md b/doc/user/admin_area/reporting/spamcheck.md
index 559235fe322..b1ec203cffc 100644
--- a/doc/user/admin_area/reporting/spamcheck.md
+++ b/doc/user/admin_area/reporting/spamcheck.md
@@ -65,4 +65,4 @@ Spamcheck service on its own can not communicate directly over TLS with GitLab.
However, Spamcheck can be deployed behind a reverse proxy which performs TLS
termination. In such a scenario, GitLab can be made to communicate with
Spamcheck over TLS by specifying `tls://` scheme for the external Spamcheck URL
-instead of `grpc://` in the Admin settings.
+instead of `grpc://` in the Admin Area settings.
diff --git a/doc/user/admin_area/settings/account_and_limit_settings.md b/doc/user/admin_area/settings/account_and_limit_settings.md
index e6d8107ed9b..9905298784a 100644
--- a/doc/user/admin_area/settings/account_and_limit_settings.md
+++ b/doc/user/admin_area/settings/account_and_limit_settings.md
@@ -51,12 +51,14 @@ For GitLab.com repository size limits, read [accounts and limit settings](../../
## Max push size
-You can change the maximum push size for your repository:
+You can change the maximum push size for your instance:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**, then expand **Account and limit**.
1. Increase or decrease by changing the value in **Maximum push size (MB)**.
+For GitLab.com application limits, read [GitLab application limits](../../../administration/instance_limits.md#max-push-size).
+
NOTE:
When you [add files to a repository](../../project/repository/web_editor.md#create-a-file)
through the web UI, the maximum **attachment** size is the limiting factor,
@@ -64,9 +66,19 @@ because the [web server](../../../development/architecture.md#components)
must receive the file before GitLab can generate the commit.
Use [Git LFS](../../../topics/git/lfs/index.md) to add large files to a repository.
+## Max export size
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86124) in GitLab 15.0.
+
+To modify the maximum file size for exports in GitLab:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > General**, then expand **Account and limit**.
+1. Increase or decrease by changing the value in **Maximum export size (MB)**.
+
## Max import size
-> [Modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to unlimited in GitLab 13.8.
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50 MB to unlimited in GitLab 13.8.
To modify the maximum file size for imports in GitLab:
@@ -158,22 +170,6 @@ wiki, packages, or snippets. The repository size limit applies to both private a
For details on manually purging files, see [reducing the repository size using Git](../../project/repository/reducing_the_repo_size_using_git.md).
-## Troubleshooting
-
-### 413 Request Entity Too Large
-
-When attaching a file to a comment or reply in GitLab displays a `413 Request Entity Too Large`
-error, the [max attachment size](#max-attachment-size)
-is probably larger than the web server's allowed value.
-
-To increase the max attachment size to 200 MB in a
-[Omnibus GitLab](https://docs.gitlab.com/omnibus/) install, you may need to
-add the line below to `/etc/gitlab/gitlab.rb` before increasing the max attachment size:
-
-```ruby
-nginx['client_max_body_size'] = "200m"
-```
-
## Customize session duration for Git Operations when 2FA is enabled **(PREMIUM SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296669) in GitLab 13.9.
@@ -229,35 +225,28 @@ Once a lifetime for SSH keys is set, GitLab:
NOTE:
When a user's SSH key becomes invalid they can delete and re-add the same key again.
-## Allow expired SSH keys to be used (DEPRECATED) **(ULTIMATE SELF)**
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
+## Allow expired SSH keys to be used (removed) **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/250480) in GitLab 13.9.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/320970) in GitLab 14.0.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 15.0.
-WARNING:
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8.
+This feature was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 15.0.
+<!--- end_remove -->
-By default, expired SSH keys **are not usable**.
-
-To allow the use of expired SSH keys:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Uncheck the **Enforce SSH key expiration** checkbox.
-
-Disabling SSH key expiration immediately enables all expired SSH keys.
-
-## Limit the lifetime of personal access tokens **(ULTIMATE SELF)**
+## Limit the lifetime of access tokens **(ULTIMATE SELF)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/3649) in GitLab 12.6.
Users can optionally specify a lifetime for
-[personal access tokens](../../profile/personal_access_tokens.md).
+access tokens, this includes [personal](../../profile/personal_access_tokens.md),
+[group](../../group/settings/group_access_tokens.md), and [project](../../project/settings/project_access_tokens.md) access tokens.
This lifetime is not a requirement, and can be set to any arbitrary number of days.
-Personal access tokens are the only tokens needed for programmatic access to GitLab.
+Access tokens are the only tokens needed for programmatic access to GitLab.
However, organizations with security requirements may want to enforce more protection by
requiring the regular rotation of these tokens.
@@ -266,15 +255,15 @@ requiring the regular rotation of these tokens.
Only a GitLab administrator can set a lifetime. Leaving it empty means
there are no restrictions.
-To set a lifetime on how long personal access tokens are valid:
+To set a lifetime on how long access tokens are valid:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**.
1. Expand the **Account and limit** section.
-1. Fill in the **Maximum allowable lifetime for personal access tokens (days)** field.
+1. Fill in the **Maximum allowable lifetime for access tokens (days)** field.
1. Click **Save changes**.
-Once a lifetime for personal access tokens is set, GitLab:
+Once a lifetime for access tokens is set, GitLab:
- Applies the lifetime for new personal access tokens, and require users to set an expiration date
and a date no later than the allowed lifetime.
@@ -282,23 +271,17 @@ Once a lifetime for personal access tokens is set, GitLab:
allowed lifetime. Three hours is given to allow administrators to change the allowed lifetime,
or remove it, before revocation takes place.
-## Allow expired Personal Access Tokens to be used (DEPRECATED) **(ULTIMATE SELF)**
+<!-- start_remove The following content will be removed on remove_date: '2022-08-22' -->
+## Allow expired access tokens to be used (removed) **(ULTIMATE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214723) in GitLab 13.1.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/296881) in GitLab 13.9.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351962) in GitLab 14.8.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351962) in GitLab 15.0.
-WARNING:
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351962) in GitLab 14.8.
-
-By default, expired personal access tokens (PATs) **are not usable**.
-
-To allow the use of expired PATs:
-
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Settings > General**.
-1. Expand the **Account and limit** section.
-1. Uncheck the **Enforce personal access token expiration** checkbox.
+This feature was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351962) in GitLab 15.0.
+<!-- end_remove -->
## Disable user profile name changes **(PREMIUM SELF)**
@@ -314,5 +297,35 @@ To do this:
NOTE:
When this ability is disabled, GitLab administrators can still use the
-[Admin UI](../index.md#administering-users) or the
+[Admin Area](../index.md#administering-users) or the
[API](../../../api/users.md#user-modification) to update usernames.
+
+## Troubleshooting
+
+### 413 Request Entity Too Large
+
+When attaching a file to a comment or reply in GitLab displays a `413 Request Entity Too Large`
+error, the [max attachment size](#max-attachment-size)
+is probably larger than the web server's allowed value.
+
+To increase the max attachment size to 200 MB in a
+[Omnibus GitLab](https://docs.gitlab.com/omnibus/) install, you may need to
+add the line below to `/etc/gitlab/gitlab.rb` before increasing the max attachment size:
+
+```ruby
+nginx['client_max_body_size'] = "200m"
+```
+
+### This repository has exceeded its size limit
+
+If you receive intermittent push errors in your [Rails exceptions log](../../../administration/logs.md#exceptions_jsonlog), like this:
+
+```plaintext
+Your push has been rejected, because this repository has exceeded its size limit.
+```
+
+[Housekeeping](../../../administration/housekeeping.md) tasks may be causing your repository size to grow.
+To resolve this problem, either of these options helps in the short- to middle-term:
+
+- Increase the [repository size limit](#repository-size-limit).
+- [Reduce the repo size](../../project/repository/reducing_the_repo_size_using_git.md).
diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md
index 683c07460ee..170d3cf4c90 100644
--- a/doc/user/admin_area/settings/continuous_integration.md
+++ b/doc/user/admin_area/settings/continuous_integration.md
@@ -149,7 +149,7 @@ As an administrator you can set either a global or namespace-specific limit on t
## Archive jobs
-Archiving jobs is useful for reducing the CI/CD footprint on the system by removing some
+Archiving jobs is useful for reducing the CI/CD footprint on the system by removing some
of the capabilities of the jobs (metadata stored in the database needed to run the job),
but persisting the traces and artifacts for auditing purposes.
@@ -170,7 +170,7 @@ For the value set for GitLab.com, see [Scheduled job archiving](../../gitlab_com
## Protect CI/CD variables by default
To set all new [CI/CD variables](../../../ci/variables/index.md) as
-[protected](../../../ci/variables/index.md#protect-a-cicd-variable) by default:
+[protected](../../../ci/variables/index.md#protected-cicd-variables) by default:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > CI/CD**.
@@ -224,13 +224,9 @@ To enable or disable the banner:
1. Select or clear the **Enable pipeline suggestion banner** checkbox.
1. Select **Save changes**.
-## Required pipeline configuration **(PREMIUM SELF)**
+## Required pipeline configuration **(ULTIMATE SELF)**
-WARNING:
-Required pipeline configurations is in its end-of-life process for Premium users. It's
-[deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) in GitLab 14.8,
-and planned to be unavailable for Premium users in GitLab 15.0. This feature is planned to continue
-to be available for Ultimate users. Ultimate users are not impacted by this deprecation and removal.
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/352316) from GitLab Premium to GitLab Ultimate in 15.0.
NOTE:
An alternative [compliance solution](../../project/settings/index.md#compliance-pipeline-configuration)
diff --git a/doc/user/admin_area/settings/files_api_rate_limits.md b/doc/user/admin_area/settings/files_api_rate_limits.md
index 7305e49b0d2..544c81e0583 100644
--- a/doc/user/admin_area/settings/files_api_rate_limits.md
+++ b/doc/user/admin_area/settings/files_api_rate_limits.md
@@ -8,7 +8,7 @@ type: reference
# Rate limits on Repository files API **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68561) in GitLab 14.3.
-> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75918) in GitLab 14.6. [Feature flag files_api_throttling](https://gitlab.com/gitlab-org/gitlab/-/issues/338903) removed.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75918) in GitLab 14.6. [Feature flag `files_api_throttling`](https://gitlab.com/gitlab-org/gitlab/-/issues/338903) removed.
The [Repository files API](../../../api/repository_files.md) enables you to
fetch, create, update, and delete files in your repository. To improve the security
diff --git a/doc/user/admin_area/settings/index.md b/doc/user/admin_area/settings/index.md
index 052b6e26c07..970897fd8da 100644
--- a/doc/user/admin_area/settings/index.md
+++ b/doc/user/admin_area/settings/index.md
@@ -112,8 +112,6 @@ The **Metrics and profiling** settings contain:
- [Self monitoring](../../../administration/monitoring/gitlab_self_monitoring_project/index.md#create-the-self-monitoring-project) -
Enable or disable instance self monitoring.
- [Usage statistics](usage_statistics.md) - Enable or disable version check and Service Ping.
-- [Pseudonymizer data collection](../../../administration/pseudonymizer.md) -
- Enable or disable the Pseudonymizer data collection.
### Network
@@ -179,8 +177,10 @@ The **Repository** settings contain:
- Repository maintenance:
- [Repository checks](../../../administration/repository_checks.md) - Configure
automatic Git checks on repositories.
- - [Housekeeping](../../../administration/housekeeping.md)). Configure automatic
+ - [Housekeeping](../../../administration/housekeeping.md). Configure automatic
Git housekeeping on repositories.
+ - [Inactive project deletion](../../../administration/inactive_project_deletion.md). Configure inactive
+ project deletion.
- [Repository static objects](../../../administration/static_objects_external_storage.md) -
Serve repository static objects (for example, archives and blobs) from an external storage (for example, a CDN).
diff --git a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
index 50dd24de3fb..6c0c15243da 100644
--- a/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
+++ b/doc/user/admin_area/settings/rate_limit_on_issues_creation.md
@@ -15,7 +15,7 @@ To can change its value:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > Network**.
1. Expand **Issues Rate Limits**.
-1. Under **Max requests per minute per user**, enter the new value.
+1. Under **Max requests per minute**, enter the new value.
1. Select **Save changes**.
For example, if you set a limit of 300, requests using the
diff --git a/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
new file mode 100644
index 00000000000..2819a18d361
--- /dev/null
+++ b/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md
@@ -0,0 +1,33 @@
+---
+type: reference
+stage: Verify
+group: Pipeline Execution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Rate limits on pipeline creation **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/362475) in GitLab 15.0.
+
+You can set a limit so that users and processes can't request more than a certain number of pipelines each minute. This limit can help save resources and improve stability.
+
+For example, if you set a limit of `10`, and `11` requests are sent to the [trigger API](../../../ci/triggers/) 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, user, and commit.
+- Not applied per IP address.
+- Disabled by default.
+
+Requests that exceed the limit are logged in the `application_json.log` file.
+
+## Set a pipeline request limit
+
+To limit the number of pipeline requests:
+
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Network**.
+1. Expand **Pipelines Rate Limits**.
+1. Under **Max requests per minute**, enter a value greater than `0`.
+1. Select **Save changes**.
diff --git a/doc/user/admin_area/settings/sign_in_restrictions.md b/doc/user/admin_area/settings/sign_in_restrictions.md
index c63cd88eeb4..7316b1bdbb8 100644
--- a/doc/user/admin_area/settings/sign_in_restrictions.md
+++ b/doc/user/admin_area/settings/sign_in_restrictions.md
@@ -66,7 +66,7 @@ Git clients, and access RESTful API endpoints as administrators, without additio
authentication steps.
We may address these limitations in the future. For more information see the following epic:
-[Admin mode for GitLab Administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158).
+[Admin Mode for GitLab Administrators](https://gitlab.com/groups/gitlab-org/-/epics/2158).
### Troubleshooting Admin Mode
diff --git a/doc/user/admin_area/settings/sign_up_restrictions.md b/doc/user/admin_area/settings/sign_up_restrictions.md
index 8ce3b4f1c18..534450c1871 100644
--- a/doc/user/admin_area/settings/sign_up_restrictions.md
+++ b/doc/user/admin_area/settings/sign_up_restrictions.md
@@ -60,7 +60,7 @@ To enforce confirmation of the email address used for new sign ups:
1. On the top bar, select **Menu > Admin**.
1. On the left sidebar, select **Settings > General**, and expand **Sign-up restrictions**.
-1. Select the **Enable email restrictions for sign ups** checkbox, then select **Save changes**.
+1. Select the **Send confirmation email on sign-up** checkbox, then select **Save changes**.
## User cap
diff --git a/doc/user/admin_area/settings/usage_statistics.md b/doc/user/admin_area/settings/usage_statistics.md
index 923ea9e19c1..ce949999fb8 100644
--- a/doc/user/admin_area/settings/usage_statistics.md
+++ b/doc/user/admin_area/settings/usage_statistics.md
@@ -1,8 +1,7 @@
---
-stage: none
-group: unassigned
+stage: Growth
+group: Product Intelligence
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference
---
# Usage statistics **(FREE SELF)**
@@ -15,13 +14,54 @@ All usage statistics are [opt-out](#enable-or-disable-usage-statistics).
## Service Ping
Service Ping is a process that collects and sends a weekly payload to GitLab Inc.
-For more information, see the [Service Ping guide](../../../development/service_ping/index.md).
+For more information, see the [Service Ping guide](../../../development/service_ping/index.md). When Service Ping is enabled, GitLab gathers data from other instances and enables certain [instance-level analytics features](../analytics/index.md)
+that are dependent on Service Ping.
-### Instance-level analytics availability
+### Why enable Service Ping?
-When Service Ping is enabled, GitLab gathers data from other instances and
-enables certain [instance-level analytics features](../analytics/index.md)
-that are dependent on Service Ping.
+The main purpose of Service Ping is to build a better GitLab. We collect data about how GitLab is used
+to understand feature or stage adoption and usage. This data gives an insight into how GitLab adds
+value and helps our team understand the reasons why people use GitLab, and with this knowledge we're able to make better product decisions.
+
+There are several other benefits to enabling Service Ping:
+
+- Analyze the users' activities over time of your GitLab installation.
+- A [DevOps Score](../analytics/dev_ops_reports.md#devops-score) to give you an overview of your entire instance's adoption of concurrent DevOps from planning to monitoring.
+- More proactive support (assuming that our TAMs and support organization used the data to deliver more value).
+- Insight and advice into how to get the most value out of your investment in GitLab.
+- Reports that show how you compare against other similar organizations (anonymized), with specific advice and recommendations on how to improve your DevOps processes.
+- Participation in our [Registration Features Program](#registration-features-program) to receive free paid features.
+
+## Registration Features Program
+
+> Introduced in GitLab 14.1.
+
+In GitLab versions 14.1 and later, GitLab Free customers with a self-managed instance running
+GitLab Enterprise Edition can receive paid features by registering with GitLab and sending us
+activity data through Service Ping. Features introduced here do not remove the feature from its paid
+tier. Users can continue to access the features in a paid tier without sharing usage data.
+
+### Features available in 14.1 and later
+
+- [Email from GitLab](../email_from_gitlab.md).
+
+### Features available in 14.4 and later
+
+- [Repository size limit](../settings/account_and_limit_settings.md#repository-size-limit).
+- [Restrict group access by IP address](../../group/index.md#restrict-group-access-by-ip-address).
+
+NOTE:
+Registration is not yet required for participation, but may be added in a future milestone.
+
+### Enable registration features
+
+1. Sign in as a user with administrator access.
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. If not enabled, select the **Enable Service Ping** checkbox.
+1. Select the **Enable Registration Features** checkbox.
+1. Select **Save changes**.
## Version check
@@ -79,6 +119,81 @@ To enable or disable Service Ping and version check:
1. Select or clear the **Enable version check** and **Enable Service Ping** checkboxes.
1. Select **Save changes**.
+## Disable usage statistics with the configuration file
+
+NOTE:
+The method to disable Service Ping in the GitLab configuration file does not work in
+GitLab versions 9.3 to 13.12.3. For more information about how to disable it, see [troubleshooting](../../../development/service_ping/troubleshooting.md#cannot-disable-service-ping-with-the-configuration-file).
+
+To disable Service Ping and prevent it from being configured in the future through
+the Admin Area:
+
+**For installations using the Linux package:**
+
+1. Edit `/etc/gitlab/gitlab.rb`:
+
+ ```ruby
+ gitlab_rails['usage_ping_enabled'] = false
+ ```
+
+1. Reconfigure GitLab:
+
+ ```shell
+ sudo gitlab-ctl reconfigure
+ ```
+
+**For installations from source:**
+
+1. Edit `/home/git/gitlab/config/gitlab.yml`:
+
+ ```yaml
+ production: &base
+ # ...
+ gitlab:
+ # ...
+ usage_ping_enabled: false
+ ```
+
+1. Restart GitLab:
+
+ ```shell
+ sudo service gitlab restart
+ ```
+
+## View the Service Ping payload
+
+You can view the exact JSON payload sent to GitLab Inc. in the Admin Area. To view the payload:
+
+1. Sign in as a user with administrator access.
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Metrics and profiling**.
+1. Expand the **Usage statistics** section.
+1. Select **Preview payload**.
+
+For an example payload, see [Example Service Ping payload](../../../development/service_ping/index.md#example-service-ping-payload).
+
+## Manually upload Service Ping payload
+
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/7388) in GitLab 14.8 with a flag named `admin_application_settings_service_usage_data_center`. Disabled by default.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83265) in GitLab 14.10.
+
+You can upload the Service Ping payload to GitLab even if your instance doesn't have internet access,
+or if the Service Ping [cron job](../../../development/service_ping/index.md#how-service-ping-works) is not enabled.
+
+To upload the payload manually:
+
+1. Sign in as a user with administrator access.
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Settings > Service** usage data.
+1. Select **Download payload**.
+1. Save the JSON file.
+1. Visit [Service usage data center](https://version.gitlab.com/usage_data/new).
+1. Select **Choose file** and choose the file from p5.
+1. Select **Upload**.
+
+The uploaded file is encrypted and sent using secure HTTPS protocol. HTTPS creates a secure
+communication channel between web browser and the server, and protects transmitted data against man-in-the-middle attacks.
+
<!-- ## Troubleshooting
Include any troubleshooting steps that you can foresee. If you know beforehand what issues
diff --git a/doc/user/admin_area/settings/user_and_ip_rate_limits.md b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
index 56e240a8d39..bb3ee64abac 100644
--- a/doc/user/admin_area/settings/user_and_ip_rate_limits.md
+++ b/doc/user/admin_area/settings/user_and_ip_rate_limits.md
@@ -104,7 +104,7 @@ attached into the response headers.
| Header | Example | Description |
|:----------------------|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `RateLimit-Limit` | `60` | The request quota for the client **each minute**. If the rate limit period set in the admin area is different from 1 minute, the value of this header is adjusted to approximately the nearest 60-minute period. |
+| `RateLimit-Limit` | `60` | The request quota for the client **each minute**. If the rate limit period set in the Admin Area is different from 1 minute, the value of this header is adjusted to approximately the nearest 60-minute period. |
| `RateLimit-Name` | `throttle_authenticated_web` | Name of the throttle blocking the requests. |
| `RateLimit-Observed` | `67` | Number of requests associated to the client in the time window. |
| `RateLimit-Remaining` | `0` | Remaining quota in the time window. The result of `RateLimit-Limit` - `RateLimit-Observed`. |
diff --git a/doc/user/analytics/index.md b/doc/user/analytics/index.md
index 704476cdc90..017a0c46570 100644
--- a/doc/user/analytics/index.md
+++ b/doc/user/analytics/index.md
@@ -127,12 +127,6 @@ To retrieve metrics for change failure rate, use the [GraphQL](../../api/graphql
We use the following terms to describe GitLab analytics:
-- **Cycle time:** The duration of only the execution work. Cycle time is often displayed in combination with the lead time, which is longer than the cycle time. GitLab measures cycle time from the earliest commit of a [linked issue's merge request](../project/issues/crosslinking_issues.md) to when that issue is closed. The cycle time approach underestimates the lead time because merge request creation is always later than commit time. GitLab displays cycle time in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](../analytics/value_stream_analytics.md).
-- **Deploys:** The total number of successful deployments to production in the given time frame (across all applicable projects). GitLab displays deploys in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md) and [project-level Value Stream Analytics](value_stream_analytics.md).
-- **Lead time:** The duration of your value stream, from start to finish. Different to
-[Lead time for changes](#lead-time-for-changes). Often displayed in combination with "cycle time,"
-which is shorter. GitLab measures lead time from issue creation to issue close. GitLab displays lead
-time in [group-level Value Stream Analytics](../group/value_stream_analytics/index.md).
- **Mean Time to Change (MTTC):** The average duration between idea and delivery. GitLab measures
MTTC from issue creation to the issue's latest related merge request's deployment to production.
- **Mean Time to Detect (MTTD):** The average duration that a bug goes undetected in production.
@@ -142,11 +136,6 @@ merge request creation to merge request merge (and closed/un-merged merge reques
For more information, see [Merge Request Analytics](merge_request_analytics.md).
- **Mean Time to Recover/Repair/Resolution/Resolve/Restore (MTTR):** The average duration that a bug
is not fixed in production. GitLab measures MTTR from deployment of bug to deployment of fix.
-- **Throughput:** The number of issues closed or merge requests merged (not closed) in a period of
-time. Often measured per sprint. GitLab displays merge request throughput in [Merge Request Analytics](merge_request_analytics.md).
-- **Value Stream:** The entire work process that is followed to deliver value to customers. For example,
-the [DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/) is a value stream that starts
-with "plan" and ends with "monitor". GitLab helps you track your value stream using [Value Stream Analytics](value_stream_analytics.md).
- **Velocity:** The total issue burden completed in some period of time. The burden is usually measured
in points or weight, often per sprint. For example, your velocity may be "30 points per sprint". GitLab
measures velocity as the total points or weight of issues closed in a given period of time.
diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md
index 06774c3f16a..29f2ec79800 100644
--- a/doc/user/analytics/merge_request_analytics.md
+++ b/doc/user/analytics/merge_request_analytics.md
@@ -48,7 +48,8 @@ To view the number of merge requests merged per month:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
-The **Throughput** chart shows the number of merge requests merged per month.
+The **Throughput** chart shows issues closed or merge requests merged (not closed) over a period of
+time.
The table shows up to 20 merge requests per page, and includes
information about each merge request.
@@ -58,9 +59,10 @@ information about each merge request.
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229389) in GitLab 13.9.
Use the number in **Mean time to merge** to view the average time between when a merge request is
-created and when it's merged.
+created and when it's merged. Closed and un-merged merge requests are not included.
To view **Mean time to merge**:
1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Analytics > Merge request**.
+1. On the left sidebar, select **Analytics > Merge request**. The **Mean time to merge** number
+is shown on the dashboard.
diff --git a/doc/user/analytics/value_stream_analytics.md b/doc/user/analytics/value_stream_analytics.md
index 92c4d447ed9..039d33a1ad8 100644
--- a/doc/user/analytics/value_stream_analytics.md
+++ b/doc/user/analytics/value_stream_analytics.md
@@ -12,6 +12,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
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,
+the [DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/) is a value stream that starts
+with the Manage stage and ends with the Protect stage.
+
Use value stream analytics to identify:
- The amount of time it takes to go from an idea to production.
@@ -74,7 +78,7 @@ To view the median time spent in each stage:
Value stream analytics shows the lead time and cycle time for issues in your project:
- 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. Commits are associated with issues when users [cross-link them in the commit message](../project/issues/crosslinking_issues.md#from-commit-messages).
+- 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) 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:
diff --git a/doc/user/application_security/api_fuzzing/index.md b/doc/user/application_security/api_fuzzing/index.md
index ed94686b7a3..f97e09f33bb 100644
--- a/doc/user/application_security/api_fuzzing/index.md
+++ b/doc/user/application_security/api_fuzzing/index.md
@@ -139,7 +139,7 @@ OpenAPI 2.x lets you specify the accepted media types globally or per operation,
- In [GitLab 14.10 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/333304), the default behavior is to select one of the supported media types to use. The first supported media type is chosen from the list. This behavior is configurable.
- In GitLab 14.9 and earlier, the default behavior is to perform testing using all supported media types. This means if two media types are listed (for example, `application/json` and `application/xml`), tests are performed using JSON, and then the same tests using XML.
-Testing the same operation (for example, `POST /user`) using different media types (for example, `application/json` and `application/xml`) is not always desirable.
+Testing the same operation (for example, `POST /user`) using different media types (for example, `application/json` and `application/xml`) is not always desirable.
For example, if the target application executes the same code regardless of the request content type, it will take longer to finish the test session, and it may report duplicate vulnerabilities related to the request body depending on the target app.
The environment variable `FUZZAPI_OPENAPI_ALL_MEDIA_TYPES` lets you specify whether or not to use all supported media types instead of one when generating requests for a given operation. When the environmental variable `FUZZAPI_OPENAPI_ALL_MEDIA_TYPES` is set to any value, API Fuzzing will try to generate requests for all supported media types instead of one in a given operation. This will cause testing to take longer as testing is repeated for each provided media type.
@@ -1087,7 +1087,7 @@ You can provide the following properties to exclude specific parameters during t
- `body-json`: Use this property to exclude specific JSON nodes from a request that uses the media type `application/json`. The property's value is an array, each entry of the array is a [JSON Path](https://goessner.net/articles/JsonPath/) expression.
- `body-xml`: Use this property to exclude specific XML nodes from a request that uses media type `application/xml`. The property's value is an array, each entry of the array is a [XPath v2](https://www.w3.org/TR/xpath20/) expression.
-The following JSON document is an example of the expected structure to exclude parameters.
+The following JSON document is an example of the expected structure to exclude parameters.
```json
{
@@ -1155,11 +1155,11 @@ To exclude the `password` field in a request that uses `application/x-www-form-u
The exclude parameters uses `body-form` when the request uses a content type `application/x-www-form-urlencoded`.
-##### Excluding a specific JSON nodes using JSON Path
+##### Excluding a specific JSON nodes using JSON Path
To exclude the `schema` property in the root object, set the `body-json` property's value to an array with the JSON Path expression `[ "$.schema" ]`.
-The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
+The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
For instance, the JSON document looks like this:
```json
@@ -1168,13 +1168,13 @@ For instance, the JSON document looks like this:
}
```
-The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path, characters like `$`, `*`, `.` among others have special meaning.
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path, characters like `$`, `*`, `.` among others have special meaning.
-##### Excluding multiple JSON nodes using JSON Path
+##### Excluding multiple JSON nodes using JSON Path
To exclude the property `password` on each entry of an array of `users` at the root level, set the `body-json` property's value to an array with the JSON Path expression `[ "$.users[*].paswword" ]`.
-The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
+The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
For instance, the JSON document looks like this:
@@ -1184,7 +1184,7 @@ For instance, the JSON document looks like this:
}
```
-The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
##### Excluding an XML attribute
@@ -1196,17 +1196,17 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/@isEnabled"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions, characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions, characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
##### Excluding an XML element's text
-To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
+To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
In the XPath expression `/credentials/username/text()`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`. Last part has a `/` that refers to the current element, and uses a XPath function called `text()` which identifies the text of the current element.
@@ -1214,17 +1214,17 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/username/text()"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
##### Excluding an XML element
-To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
+To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
In the XPath expression `/credentials/username`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`.
@@ -1232,7 +1232,7 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/username"
]
}
@@ -1242,21 +1242,21 @@ The exclude parameters uses `body-xml` when the request uses a content type `app
##### Excluding an XML node with namespaces
-To exclude a XML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
+To exclude a XML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
-In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
+In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
The namespace name should have been defined in the XML document which is part of the body request. You may check the namespace in the specification document HAR, OpenAPI, or Postman Collection file.
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/s:login"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
#### Using a JSON string
@@ -1294,7 +1294,7 @@ variables:
FUZZAPI_EXCLUDE_PARAMETER_FILE: api-fuzzing-exclude-parameters.json
```
-The `api-fuzzing-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
+The `api-fuzzing-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
### Exclude URLS
@@ -1348,7 +1348,7 @@ variables:
##### Excluding URL using regular expressions
-In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
+In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
```yaml
variables:
@@ -1467,7 +1467,7 @@ reported.
Faults detected by API Fuzzing occur in the live web application, and require manual investigation
to determine if they are vulnerabilities. Fuzzing faults are included as vulnerabilities with a
severity of Unknown. To facilitate investigation of the fuzzing faults, detailed information is
-provided about the HTTP messages sent and received along with a description of the modification(s)
+provided about the HTTP messages sent and received along with a description of the modifications
made.
Follow these steps to view details of a fuzzing fault:
diff --git a/doc/user/application_security/cluster_image_scanning/index.md b/doc/user/application_security/cluster_image_scanning/index.md
index 293645b8de6..aba28a5ca89 100644
--- a/doc/user/application_security/cluster_image_scanning/index.md
+++ b/doc/user/application_security/cluster_image_scanning/index.md
@@ -28,10 +28,17 @@ To integrate GitLab with security scanners other than those listed here, see
You can use cluster image scanning through the following methods:
-- [The cluster image scanning analyzer](#use-the-cluster-image-scanning-analyzer)
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
+- [The cluster image scanning analyzer](#use-the-cluster-image-scanning-analyzer-removed) ([Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/356465) in GitLab 15.0. Use [the GitLab agent](#cluster-image-scanning-with-the-gitlab-agent) instead.)
+<!--- end_remove -->
- [The GitLab agent](#cluster-image-scanning-with-the-gitlab-agent)
-## Use the cluster image scanning analyzer
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
+
+## Use the cluster image scanning analyzer (removed)
+
+This feature was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/356465) in GitLab 15.0.
+Use [the GitLab agent](#cluster-image-scanning-with-the-gitlab-agent) instead.
You can use the cluster image scanning analyzer to run cluster image scanning with [GitLab CI/CD](../../../ci/index.md).
To enable the cluster image scanning analyzer, [include the CI job](#configuration)
@@ -277,6 +284,7 @@ Here's an example cluster image scanning report:
}
```
+<!--- end_remove -->
## Cluster image scanning with the GitLab agent
You can use the [GitLab agent](../../clusters/agent/index.md) to
@@ -284,14 +292,12 @@ scan images from within your Kubernetes cluster and record the vulnerabilities i
### Prerequisites
-- [Starboard Operator](https://aquasecurity.github.io/starboard/v0.10.3/operator/installation/kubectl/)
- installed and configured in your cluster.
- [GitLab agent](../../clusters/agent/install/index.md)
set up in GitLab, installed in your cluster, and configured using a configuration repository.
### Configuration
-The agent runs the cluster image scanning once the `cluster_image_scanning`
+The agent runs the cluster image scanning once the `starboard`
directive is added to your [agent's configuration repository](../../clusters/agent/vulnerabilities.md).
## Security Dashboard
@@ -304,9 +310,12 @@ the security vulnerabilities in your groups, projects, and pipelines.
After you find a vulnerability, you can address it in the [vulnerability report](../vulnerabilities/index.md)
or the [GitLab agent's](../../clusters/agent/vulnerabilities.md)
details section.
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
## Troubleshooting
### Getting warning message `gl-cluster-image-scanning-report.json: no matching files`
For information on this error, see the [general Application Security troubleshooting section](../../../ci/pipelines/job_artifacts.md#error-message-no-files-to-upload).
+
+<!--- end_remove -->
diff --git a/doc/user/application_security/container_scanning/index.md b/doc/user/application_security/container_scanning/index.md
index 64566e458ee..2828b56a5d1 100644
--- a/doc/user/application_security/container_scanning/index.md
+++ b/doc/user/application_security/container_scanning/index.md
@@ -5,7 +5,7 @@ group: Container Security
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Container Scanning **(ULTIMATE)**
+# Container Scanning **(FREE)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3672) in GitLab 10.4.
@@ -44,6 +44,26 @@ information directly in the merge request.
![Container Scanning Widget](img/container_scanning_v13_2.png)
+### Capabilities
+
+| Capability | In Free | In Ultimate |
+| --- | ------ | ------ |
+| [Configure Scanners](#configuration) | Yes | Yes |
+| Customize Settings ([Variables](#available-cicd-variables), [Overriding](#overriding-the-container-scanning-template), [offline environment support](#running-container-scanning-in-an-offline-environment), etc) | Yes | Yes |
+| [View JSON Report](#reports-json-format) as a CI job artifact | Yes | Yes |
+| Generation of a JSON report of [dependencies](#dependency-list) as a CI job artifact | Yes | Yes |
+| Ability to enable container scanning via an MR in the GitLab UI | Yes | Yes |
+| [UBI Image Support](#fips-enabled-images) | Yes | Yes |
+| Support for Trivy | Yes | Yes |
+| Support for Grype | Yes | Yes |
+| Inclusion of GitLab Advisory Database | Limited to the time-delayed content from GitLab [advisories-communities](https://gitlab.com/gitlab-org/advisories-community/) project | Yes - all the latest content from [Gemnasium DB](https://gitlab.com/gitlab-org/security-products/gemnasium-db) |
+| Presentation of Report data in Merge Request and Security tab of the CI pipeline job | No | Yes |
+| [Interaction with Vulnerabilities](#interacting-with-the-vulnerabilities) such as merge request approvals | No | Yes |
+| [Solutions for vulnerabilities (auto-remediation)](#solutions-for-vulnerabilities-auto-remediation) | No | Yes |
+| Support for the [vulnerability allow list](#vulnerability-allowlisting) | No | Yes |
+| [Access to Security Dashboard page](#security-dashboard) | No | Yes |
+| [Access to Dependency List page](../dependency_list/) | No | Yes |
+
## Requirements
To enable container scanning in your pipeline, you need the following:
@@ -164,8 +184,8 @@ include:
The `CS_DISABLE_DEPENDENCY_LIST` CI/CD variable controls whether the scan creates a
[Dependency List](../dependency_list/)
-report. The variable's default setting of `false` causes the scan to create the report. To disable
-the report, set the variable to `true`:
+report. This variable is currently only supported when the `trivy` analyzer is used. The variable's default setting of `"false"` causes the scan to create the report. To disable
+the report, set the variable to `"true"`:
For example:
@@ -205,8 +225,9 @@ container_scanning:
When you enable this feature, you may see [duplicate findings](../terminology/#duplicate-finding)
in the [Vulnerability Report](../vulnerability_report/)
if [Dependency Scanning](../dependency_scanning/)
-is enabled for your project. This happens because GitLab can't automatically deduplicate the
-findings reported by the two different analyzers.
+is enabled for your project. This happens because GitLab can't automatically deduplicate findings
+across different types of scanning tools. Please reference [this comparison](../dependency_scanning/#dependency-scanning-compared-to-container-scanning)
+between GitLab Dependency Scanning and Container Scanning for more details on which types of dependencies are likely to be duplicated.
#### Available CI/CD variables
@@ -217,7 +238,7 @@ You can [configure](#customizing-the-container-scanning-settings) analyzers by u
| `ADDITIONAL_CA_CERT_BUNDLE` | `""` | Bundle of CA certs that you want to trust. See [Using a custom SSL CA certificate authority](#using-a-custom-ssl-ca-certificate-authority) for more details. | All |
| `CI_APPLICATION_REPOSITORY` | `$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG` | Docker repository URL for the image to be scanned. | All |
| `CI_APPLICATION_TAG` | `$CI_COMMIT_SHA` | Docker repository tag for the image to be scanned. | All |
-| `CS_ANALYZER_IMAGE` | `registry.gitlab.com/security-products/container-scanning:4` | Docker image of the analyzer. | All |
+| `CS_ANALYZER_IMAGE` | `registry.gitlab.com/security-products/container-scanning:5` | Docker image of the analyzer. | All |
| `CS_DEFAULT_BRANCH_IMAGE` | `""` | The name of the `DOCKER_IMAGE` on the default branch. See [Setting the default branch image](#setting-the-default-branch-image) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/338877) in GitLab 14.5. | All |
| `CS_DISABLE_DEPENDENCY_LIST` | `"false"` | Disable Dependency Scanning for packages installed in the scanned image. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345434) in GitLab 14.6. | All |
| `CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN` | `"true"` | Disable scanning for language-specific packages installed in the scanned image. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345434) in GitLab 14.6. | All |
@@ -234,10 +255,24 @@ You can [configure](#customizing-the-container-scanning-settings) analyzers by u
### Supported distributions
-Support depends on the scanner:
-
-- [Grype](https://github.com/anchore/grype#grype)
-- [Trivy](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/os/) (Default).
+Support depends on which scanner is used:
+
+| Distribution | Grype | Trivy |
+| -------------- | ----- | ----- |
+| Alma Linux | | ✅ |
+| Alpine Linux | ✅ | |
+| Amazon Linux | ✅ | ✅ |
+| BusyBox | ✅ | |
+| CentOS | ✅ | ✅ |
+| CBL-Mariner | | ✅ |
+| Debian | ✅ | ✅ |
+| Distroless | ✅ | ✅ |
+| Oracle Linux | ✅ | ✅ |
+| Photon OS | | ✅ |
+| Red Hat (RHEL) | ✅ | ✅ |
+| Rocky Linux | | ✅ |
+| SUSE | | ✅ |
+| Ubuntu | ✅ | ✅ |
#### FIPS-enabled images
@@ -250,9 +285,9 @@ standard tag plus the `-fips` extension.
| Scanner name | `CS_ANALYZER_IMAGE` |
| --------------- | ------------------- |
-| Default (Trivy) | `registry.gitlab.com/security-products/container-scanning:4-fips` |
-| Grype | `registry.gitlab.com/security-products/container-scanning/grype:4-fips` |
-| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:4-fips` |
+| Default (Trivy) | `registry.gitlab.com/security-products/container-scanning:5-fips` |
+| Grype | `registry.gitlab.com/security-products/container-scanning/grype:5-fips` |
+| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:5-fips` |
NOTE:
Prior to GitLab 15.0, the `-ubi` image extension is also available. GitLab 15.0 and later only
@@ -305,9 +340,9 @@ The following options are available:
| Scanner name | `CS_ANALYZER_IMAGE` |
| ------------ | ------------------- |
-| Default ([Trivy](https://github.com/aquasecurity/trivy)) | `registry.gitlab.com/security-products/container-scanning:4` |
-| [Grype](https://github.com/anchore/grype) | `registry.gitlab.com/security-products/container-scanning/grype:4` |
-| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:4` |
+| Default ([Trivy](https://github.com/aquasecurity/trivy)) | `registry.gitlab.com/security-products/container-scanning:5` |
+| [Grype](https://github.com/anchore/grype) | `registry.gitlab.com/security-products/container-scanning/grype:5` |
+| Trivy | `registry.gitlab.com/security-products/container-scanning/trivy:5` |
If you're migrating from a GitLab 13.x release to a GitLab 14.x release and have customized the
`container_scanning` job or its CI variables, you might need to perform these migration steps in
@@ -320,7 +355,7 @@ your CI file:
- `SECURE_ANALYZERS_PREFIX`
1. Review the `CS_ANALYZER_IMAGE` variable. It no longer depends on the variables above and its new
- default value is `registry.gitlab.com/security-products/container-scanning:4`. If you have an
+ default value is `registry.gitlab.com/security-products/container-scanning:5`. If you have an
offline environment, see
[Running container scanning in an offline environment](#running-container-scanning-in-an-offline-environment).
@@ -405,7 +440,7 @@ container_scanning:
The `ADDITIONAL_CA_CERT_BUNDLE` value can also be configured as a [custom variable in the UI](../../../ci/variables/index.md#custom-cicd-variables), either as a `file`, which requires the path to the certificate, or as a variable, which requires the text representation of the certificate.
-### Vulnerability allowlisting
+### Vulnerability allowlisting **(ULTIMATE)**
To allowlist specific vulnerabilities, follow these steps:
@@ -532,9 +567,9 @@ For container scanning, import the following images from `registry.gitlab.com` i
[local Docker container registry](../../packages/container_registry/index.md):
```plaintext
-registry.gitlab.com/security-products/container-scanning:4
-registry.gitlab.com/security-products/container-scanning/grype:4
-registry.gitlab.com/security-products/container-scanning/trivy:4
+registry.gitlab.com/security-products/container-scanning:5
+registry.gitlab.com/security-products/container-scanning/grype:5
+registry.gitlab.com/security-products/container-scanning/trivy:5
```
The process for importing Docker images into a local offline Docker registry depends on
@@ -574,7 +609,7 @@ following `.gitlab-ci.yml` example as a template.
```yaml
variables:
- SOURCE_IMAGE: registry.gitlab.com/security-products/container-scanning:4
+ SOURCE_IMAGE: registry.gitlab.com/security-products/container-scanning:5
TARGET_IMAGE: $CI_REGISTRY/namespace/gitlab-container-scanning
image: docker:stable
@@ -753,15 +788,38 @@ Here's an example container scanning report:
The [Security Dashboard](../security_dashboard/index.md) shows you an overview of all
the security vulnerabilities in your groups, projects and pipelines.
-## Vulnerabilities database update
+## Vulnerabilities database
All analyzer images are [updated daily](https://gitlab.com/gitlab-org/security-products/analyzers/container-scanning/-/blob/master/README.md#image-updates).
-The images include the latest advisory database available for their respective scanner. Each
-scanner includes data from multiple sources:
-
-- [Grype](https://github.com/anchore/grype#grypes-database).
-- [Trivy](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/data-source/).
+The images use data from upstream advisory databases depending on which scanner is used:
+
+| Data Source | Trivy | Grype |
+| ------------------------------ | ----- | ----- |
+| AlmaLinux Security Advisory | ✅ | ✅ |
+| Amazon Linux Security Center | ✅ | ✅ |
+| Arch Linux Security Tracker | ✅ | |
+| SUSE CVRF | ✅ | ✅ |
+| CWE Advisories | ✅ | |
+| Debian Security Bug Tracker | ✅ | ✅ |
+| GitHub Security Advisory | ✅ | ✅ |
+| Go Vulnerability Database | ✅ | |
+| CBL-Mariner Vulnerability Data | ✅ | |
+| NVD | ✅ | ✅ |
+| OSV | ✅ | |
+| Red Hat OVAL v2 | ✅ | ✅ |
+| Red Hat Security Data API | ✅ | ✅ |
+| Photon Security Advisories | ✅ | |
+| Rocky Linux UpdateInfo | ✅ | |
+| Ubuntu CVE Tracker (only data sources from mid 2021 and later) | ✅ | ✅ |
+
+In addition to the sources provided by these scanners, GitLab maintains the following vulnerability databases:
+
+- The proprietary
+[GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db).
+- The open source [GitLab Advisory Database (Open Source Edition)](https://gitlab.com/gitlab-org/advisories-community).
+
+In the GitLab Ultimate tier, the data from the [GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db) is merged in to augment the data from the external sources. In the GitLab Premium and Free tiers, the data from the [GitLab Advisory Database (Open Source Edition)](https://gitlab.com/gitlab-org/advisories-community) is merged in to augment the data from the external sources. This augmentation currently only applies to the analyzer images for the Trivy scanner.
Database update information for other analyzers is available in the
[maintenance table](../index.md#vulnerability-scanner-maintenance).
@@ -770,7 +828,7 @@ Database update information for other analyzers is available in the
After a vulnerability is found, you can [address it](../vulnerabilities/index.md).
-## Solutions for vulnerabilities (auto-remediation)
+## Solutions for vulnerabilities (auto-remediation) **(ULTIMATE)**
Some vulnerabilities can be fixed by applying the solution that GitLab
automatically generates.
@@ -827,6 +885,7 @@ For information on this, see the [general Application Security troubleshooting s
as the default for container scanning, and also [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/326279)
an integration with [Grype](https://github.com/anchore/grype)
as an alternative scanner.
+- GitLab 15.0 changed the major analyzer version from `4` to `5`.
Other changes to the container scanning analyzer can be found in the project's
[changelog](https://gitlab.com/gitlab-org/security-products/analyzers/container-scanning/-/blob/master/CHANGELOG.md).
diff --git a/doc/user/application_security/dast/checks/16.3.md b/doc/user/application_security/dast/checks/16.3.md
index e4fc2468dae..6f80a2a32c6 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 28bb9f7ee4b..e03da3043ef 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 header(s) and version information of this website. By
+The target website returns AspNet headers 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 ddd3a10c5f8..9cbcde669a0 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 header(s) along with version information of this website. By
+The target website returns AspNet headers 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/359.1.md b/doc/user/application_security/dast/checks/359.1.md
new file mode 100644
index 00000000000..af1fdf8a596
--- /dev/null
+++ b/doc/user/application_security/dast/checks/359.1.md
@@ -0,0 +1,34 @@
+---
+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 Private Personal Information (PII) to an unauthorized actor (credit card)
+
+## Description
+
+The target application was found to return credit card information in the response. Organizations
+found returning such information may be in violation of industry regulations and could face fines.
+
+## Remediation
+
+PII such as credit cards should never be directly returned to the user. The majority of the information should masked except
+the last few digits or characters of the identifier. For example, credit card numbers should
+only return the last four digits: `****-****-****-1234`. Ensure this masking is done on the server
+and only then send the masked data back to the client. Do not rely on client side JavaScript or other methods
+to mask these values as the data could still be intercepted or unmasked.
+
+Additionally, credit card information should never be stored un-encrypted in files or databases.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 359.1 | true | 359 | Passive | Medium |
+
+## Links
+
+- [OWASP Top 10 A3 2017 - Sensitive Data Exposure](https://owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure)
+- [CWE](https://cwe.mitre.org/data/definitions/359.html)
+- [PCI-DSS](https://www.pcisecuritystandards.org/pdfs/pci_fs_data_storage.pdf)
diff --git a/doc/user/application_security/dast/checks/359.2.md b/doc/user/application_security/dast/checks/359.2.md
new file mode 100644
index 00000000000..beb99e26097
--- /dev/null
+++ b/doc/user/application_security/dast/checks/359.2.md
@@ -0,0 +1,34 @@
+---
+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 Private Personal Information (PII) to an unauthorized actor (United States social security number)
+
+## Description
+
+The target application was found to return social security number (SSN) information in the response. Organizations
+found returning such information may be in violation of (United States) state or federal laws and may face stiff penalties.
+
+## Remediation
+
+PII such as social security numbers should never be directly returned to the user. The majority of the information
+should masked except the last few digits or characters of the identifier. For example, social security numbers
+only be displayed with the last four digits: `***-**-1234`. Ensure this masking is done on the server
+and only then send the masked data back to the client. Do not rely on client side JavaScript or other methods
+to mask these values as the data could still be intercepted or unmasked.
+
+Additionally, social security numbers should never be stored un-encrypted in files or databases.
+
+## Details
+
+| ID | Aggregated | CWE | Type | Risk |
+|:---|:--------|:--------|:--------|:--------|
+| 359.2 | true | 359 | Passive | Medium |
+
+## Links
+
+- [OWASP Top 10 A3 2017 - Sensitive Data Exposure](https://owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure)
+- [CWE](https://cwe.mitre.org/data/definitions/359.html)
+- [Privacy Act (CMPPA)](https://www.ssa.gov/dataexchange/privacyinfo.html)
diff --git a/doc/user/application_security/dast/checks/index.md b/doc/user/application_security/dast/checks/index.md
index 764e3c4a839..629ff1c3a8d 100644
--- a/doc/user/application_security/dast/checks/index.md
+++ b/doc/user/application_security/dast/checks/index.md
@@ -18,6 +18,8 @@ The [DAST browser-based crawler](../browser_based.md) provides a number of vulne
| [16.5](16.5.md) | AspNet header exposes version information | Low | Passive |
| [16.6](16.6.md) | AspNetMvc header exposes version information | Low | Passive |
| [200.1](200.1.md) | Exposure of sensitive information to an unauthorized actor (private IP address) | Low | Passive |
+| [359.1](359.1.md) | Exposure of Private Personal Information (PII) to an unauthorized actor (credit card) | Medium | Passive |
+| [359.2](359.2.md) | Exposure of Private Personal Information (PII) to an unauthorized actor (United States social security number) | Medium | Passive |
| [548.1](548.1.md) | Exposure of information through directory listing | Low | Passive |
| [598.1](598.1.md) | Use of GET request method with sensitive query strings (session ID) | Medium | Passive |
| [598.2](598.2.md) | Use of GET request method with sensitive query strings (password) | Medium | Passive |
diff --git a/doc/user/application_security/dast/index.md b/doc/user/application_security/dast/index.md
index ee57803dfc7..1389db65713 100644
--- a/doc/user/application_security/dast/index.md
+++ b/doc/user/application_security/dast/index.md
@@ -627,7 +627,7 @@ These CI/CD variables are specific to DAST. They can be used to customize the be
| `DAST_AGGREGATE_VULNERABILITIES` | boolean | Vulnerability aggregation is set to `true` by default. To disable this feature and see each vulnerability individually set to `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254043) in GitLab 14.0. |
| `DAST_API_HOST_OVERRIDE` <sup>1</sup> | string | Used to override domains defined in API specification files. Only supported when importing the API specification from a URL. Example: `example.com:8080`. |
| `DAST_API_OPENAPI` | URL or string | The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
-| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/290241) in GitLab 13.12 and replaced by `DAST_API_OPENAPI`. To be removed in GitLab 15.0. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
+| `DAST_API_SPECIFICATION` <sup>1</sup> | URL or string | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/290241)** in GitLab 15.0. Replaced by `DAST_API_OPENAPI`. The API specification to import. The specification can be hosted at a URL, or the name of a file present in the `/zap/wrk` directory. The variable `DAST_WEBSITE` must be specified if this is omitted. |
| `DAST_AUTH_REPORT` <sup>2</sup> | boolean | Used in combination with exporting the `gl-dast-debug-auth-report.html` artifact to aid in debugging authentication issues. |
| `DAST_AUTH_EXCLUDE_URLS` <sup>2</sup> | URLs | **{warning}** **[Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/289959)** in GitLab 14.0. Replaced by `DAST_EXCLUDE_URLS`. The URLs to skip during the authenticated scan; comma-separated. Regular expression syntax can be used to match multiple URLs. For example, `.*` matches an arbitrary character sequence. Not supported for API scans. |
| `DAST_AUTH_URL` <sup>1,2</sup> | URL | The URL of the page containing the sign-in HTML form on the target website. `DAST_USERNAME` and `DAST_PASSWORD` are submitted with the login form to create an authenticated scan. Not supported for API scans. Example: `https://login.example.com`. |
@@ -1156,6 +1156,7 @@ A site profile contains the following:
- **Password**: The password used to authenticate to the website.
- **Username form field**: The name of username field at the sign-in HTML form.
- **Password form field**: The name of password field at the sign-in HTML form.
+ - **Submit form field**: The `id` or `name` of the element that when clicked submits the sign-in HTML form.
When an API site type is selected, a [host override](#host-override) is used to ensure the API being scanned is on the same host as the target. This is done to reduce the risk of running an active scan against the wrong API.
@@ -1199,7 +1200,14 @@ The site profile is created.
#### Edit a site profile
-To edit an existing site profile:
+If a site profile is linked to a security policy, a user cannot edit the profile from this page. See
+[Scan execution policies](../policies/scan-execution-policies.md)
+for more information.
+
+When a validated site profile's file, header, or meta tag is edited, the site's
+[validation status](#site-profile-validation) is revoked.
+
+To edit a site profile:
1. From your project's home page, go to **Security & Compliance > Configuration**.
1. In the **DAST Profiles** row select **Manage**.
@@ -1207,42 +1215,37 @@ To edit an existing site profile:
1. In the profile's row select the **More actions** (**{ellipsis_v}**) menu, then select **Edit**.
1. Edit the fields then select **Save profile**.
-If a site profile is linked to a security policy, a user cannot edit the profile from this page. See
-[Scan execution policies](../policies/scan-execution-policies.md)
-for more information.
-
#### Delete a site profile
-To delete an existing site profile:
+If a site profile is linked to a security policy, a user cannot delete the profile from this page.
+See [Scan execution policies](../policies/scan-execution-policies.md)
+for more information.
+
+To delete a site profile:
1. From your project's home page, go to **Security & Compliance > Configuration**.
1. In the **DAST Profiles** row select **Manage**.
1. Select the **Site Profiles** tab.
-1. In the profile's row select the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
+1. In the profile's row, select the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
1. Select **Delete** to confirm the deletion.
-If a site profile is linked to a security policy, a user cannot delete the profile from this page.
-See [Scan execution policies](../policies/scan-execution-policies.md)
-for more information.
-
#### Validate a site profile
-Prerequisites:
-
-- A site profile.
+Validating a site is required to run an active scan.
To validate a site profile:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Security & Compliance > Configuration**.
-1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage scans**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
1. Select the **Site Profiles** tab.
-1. In the profile's row select **Validate** or **Retry validation**.
+1. In the profile's row, select **Validate**.
1. Select the validation method.
1. For **Text file validation**:
1. Download the validation file listed in **Step 2**.
- 1. Upload the validation file to the host. Upload the file to the location in
- **Step 3** or any location you prefer.
+ 1. Upload the validation file to the host, to the location in **Step 3** or any location you
+ prefer.
+ 1. If required, edit the file location in **Step 3**.
1. Select **Validate**.
1. For **Header validation**:
1. Select the clipboard icon in **Step 2**.
@@ -1255,9 +1258,8 @@ To validate a site profile:
1. Select the input field in **Step 3** and enter the location of the meta tag.
1. Select **Validate**.
-The site is validated and an active scan can run against it.
-
-If a validated site profile's target URL is edited, the site's validation status is revoked.
+The site is validated and an active scan can run against it. A site profile's validation status is
+revoked only when it's revoked manually, or its file, header, or meta tag is edited.
#### Retry a failed validation
@@ -1265,22 +1267,28 @@ If a validated site profile's target URL is edited, the site's validation status
> - [Deployed behind the `dast_failed_site_validations` flag](../../../administration/feature_flags.md), enabled by default.
> - [Feature flag `dast_failed_site_validations` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323961) in GitLab 14.4.
-If a site profile's validation fails, you can retry it by selecting the **Retry validation** button
-in the profiles list.
+Failed site validation attempts are listed on the **Site profiles** tab of the **Manage profiles**
+page.
+
+To retry a site profile's failed validation:
-When loading the DAST profiles library, past failed validations are listed above the profiles
-list. You can also retry the validation from there by selecting the **Retry validation** link in
-the alert. You can also dismiss the alert to revoke failed validations.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Configuration**.
+1. In the **Dynamic Application Security Testing (DAST)** section, select **Manage profiles**.
+1. Select the **Site Profiles** tab.
+1. In the profile's row, select **Retry validation**.
#### Revoke a site profile's validation status
-Note that all site profiles with the same URL have their validation status revoked.
+WARNING:
+When a site profile's validation status is revoked, all site profiles that share the same URL also
+have their validation status revoked.
To revoke a site profile's validation status:
1. From your project's home page, go to **Security & Compliance > Configuration**.
1. In the **DAST Profiles** row select **Manage**.
-1. Select **Revoke validation** beside the validated profile.
+1. Beside the validated profile, select **Revoke validation**.
The site profile's validation status is revoked.
@@ -1348,40 +1356,40 @@ A scanner profile defines the scanner settings used to run an on-demand scan:
To create a scanner profile:
1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. In the **DAST Profiles** row select **Manage**.
+1. In the **DAST Profiles** row, select **Manage**.
1. Select **New > Scanner Profile**.
1. Complete the form. For details of each field, see [Scanner profile](#scanner-profile).
-1. Click **Save profile**.
+1. Select **Save profile**.
#### Edit a scanner profile
+If a scanner profile is linked to a security policy, a user cannot edit the profile from this page.
+See [Scan execution policies](../policies/scan-execution-policies.md)
+for more information.
+
To edit a scanner profile:
1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. Click **Manage** in the **DAST Profiles** row.
+1. In the **DAST Profiles** row, select **Manage**.
1. Select the **Scanner Profiles** tab.
-1. In the scanner's row select the **More actions** (**{ellipsis_v}**) menu, then select **Edit**.
+1. In the scanner's row, select the **More actions** (**{ellipsis_v}**) menu, then select **Edit**.
1. Edit the form.
1. Select **Save profile**.
-If a scanner profile is linked to a security policy, a user cannot edit the profile from this page.
-See [Scan execution policies](../policies/scan-execution-policies.md)
-for more information.
-
#### Delete a scanner profile
+If a scanner profile is linked to a security policy, a user cannot delete the profile from this
+page. See [Scan execution policies](../policies/scan-execution-policies.md)
+for more information.
+
To delete a scanner profile:
1. From your project's home page, go to **Security & Compliance > Configuration**.
-1. Click **Manage** in the **DAST Profiles** row.
+1. In the **DAST Profiles** row, select **Manage**.
1. Select the **Scanner Profiles** tab.
-1. In the scanner's row select the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
+1. In the scanner's row, select the **More actions** (**{ellipsis_v}**) menu, then select **Delete**.
1. Select **Delete**.
-If a scanner profile is linked to a security policy, a user cannot delete the profile from this
-page. See [Scan execution policies](../policies/scan-execution-policies.md)
-for more information.
-
## Auditing
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/217872) 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 a4908204b60..a1b19c52b20 100644
--- a/doc/user/application_security/dast_api/index.md
+++ b/doc/user/application_security/dast_api/index.md
@@ -1041,7 +1041,7 @@ You can provide the following properties to exclude specific parameters during t
- `body-json`: Use this property to exclude specific JSON nodes from a request that uses the media type `application/json`. The property's value is an array, each entry of the array is a [JSON Path](https://goessner.net/articles/JsonPath/) expression.
- `body-xml`: Use this property to exclude specific XML nodes from a request that uses media type `application/xml`. The property's value is an array, each entry of the array is a [XPath v2](https://www.w3.org/TR/xpath20/) expression.
-Thus, the following JSON document is an example of the expected structure to exclude parameters.
+Thus, the following JSON document is an example of the expected structure to exclude parameters.
```json
{
@@ -1109,11 +1109,11 @@ To exclude the `password` field in a request that uses `application/x-www-form-u
The exclude parameters uses `body-form` when the request uses a content type `application/x-www-form-urlencoded`.
-##### Excluding a specific JSON nodes using JSON Path
+##### Excluding a specific JSON nodes using JSON Path
To exclude the `schema` property in the root object, set the `body-json` property's value to an array with the JSON Path expression `[ "$.schema" ]`.
-The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
+The JSON Path expression uses special syntax to identify JSON nodes: `$` refers to the root of the JSON document, `.` refers to the current object (in our case the root object), and the text `schema` refers to a property name. Thus, the JSON path expression `$.schema` refers to a property `schema` in the root object.
For instance, the JSON document looks like this:
```json
@@ -1122,13 +1122,13 @@ For instance, the JSON document looks like this:
}
```
-The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
-##### Excluding multiple JSON nodes using JSON Path
+##### Excluding multiple JSON nodes using JSON Path
To exclude the property `password` on each entry of an array of `users` at the root level, set the `body-json` property's value to an array with the JSON Path expression `[ "$.users[*].paswword" ]`.
-The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
+The JSON Path expression starts with `$` to refer to the root node and uses `.` to refer to the current node. Then, it uses `users` to refer to a property and the characters `[` and `]` to enclose the index in the array you want to use, instead of providing a number as an index you use `*` to specify any index. After the index reference, we find `.` which now refers to any given selected index in the array, preceded by a property name `password`.
For instance, the JSON document looks like this:
@@ -1138,7 +1138,7 @@ For instance, the JSON document looks like this:
}
```
-The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
+The exclude parameters uses `body-json` when the request uses a content type `application/json`. Each entry in `body-json` is expected to be a [JSON Path expression](https://goessner.net/articles/JsonPath/). In JSON Path characters like `$`, `*`, `.` among others have special meaning.
##### Excluding a XML attribute
@@ -1150,17 +1150,17 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/@isEnabled"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
##### Excluding a XML text's element
-To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
+To exclude the text of the `username` element contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username/text()" ]`.
In the XPath expression `/credentials/username/text()`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`. Last part has a `/` that refers to the current element, and uses a XPath function called `text()` which identifies the text of the current element.
@@ -1168,17 +1168,17 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/username/text()"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
##### Excluding an XML element
-To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
+To exclude the element `username` contained in root node `credentials`, set the `body-xml` property's value to an array with the XPath expression `[/credentials/username" ]`.
In the XPath expression `/credentials/username`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `username`.
@@ -1186,31 +1186,31 @@ For instance, the JSON document looks like this:
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/username"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be a [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
##### Excluding an XML node with namespaces
-To exclude anXML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
+To exclude anXML element `login` which is defined in namespace `s`, and contained in `credentials` root node, set the `body-xml` property's value to an array with the XPath expression `[ "/credentials/s:login" ]`.
-In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
+In the XPath expression `/credentials/s:login`, the first character `/` refers to the root XML node, and then after it indicates an XML element's name `credentials`. Similarly, the character `/` refers to the current element, followed by a new XML element's name `s:login`. Notice that name contains the character `:`, this character separates the namespace from the node name.
The namespace name should have been defined in the XML document which is part of the body request. You may check the namespace in the specification document HAR, OpenAPI, or Postman Collection file.
```json
{
- "body-xml": [
+ "body-xml": [
"/credentials/s:login"
]
}
```
-The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath, expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
+The exclude parameters uses `body-xml` when the request uses a content type `application/xml`. Each entry in `body-xml` is expected to be an [XPath v2 expression](https://www.w3.org/TR/xpath20/). In XPath, expressions characters like `@`, `/`, `:`, `[`, `]` among others have special meanings.
#### Using a JSON string
@@ -1248,7 +1248,7 @@ variables:
DAST_API_EXCLUDE_PARAMETER_FILE: dast-api-exclude-parameters.json
```
-The `dast-api-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
+The `dast-api-exclude-parameters.json` is a JSON document that follows the structure of [exclude parameters document](#exclude-parameters-using-a-json-document).
### Exclude URLS
@@ -1302,7 +1302,7 @@ variables:
##### Excluding URL using regular expressions
-In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
+In order to exclude exactly `https://target/api/v1/user/create` and `https://target/api/v2/user/create` or any other version (`v3`,`v4`, and more). We could use `https://target/api/v.*/user/create$`, in the previous regular expression `.` indicates any character and `*` indicates zero or more times, additionally `$` indicates that the URL should end there.
```yaml
variables:
diff --git a/doc/user/application_security/dependency_scanning/analyzers.md b/doc/user/application_security/dependency_scanning/analyzers.md
index 665d29c4017..acbc94cba47 100644
--- a/doc/user/application_security/dependency_scanning/analyzers.md
+++ b/doc/user/application_security/dependency_scanning/analyzers.md
@@ -20,11 +20,9 @@ This is achieved by implementing the [common API](https://gitlab.com/gitlab-org/
Dependency Scanning supports the following official analyzers:
-- [`bundler-audit`](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit)
- [`gemnasium`](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium)
- [`gemnasium-maven`](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven)
- [`gemnasium-python`](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python)
-- [`retire.js`](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js)
The analyzers are published as Docker images, which Dependency Scanning uses
to launch dedicated containers for each analysis.
@@ -34,11 +32,13 @@ The Dependency Scanning analyzers' current major version number is 2.
Dependency Scanning is pre-configured with a set of **default images** that are
maintained by GitLab, but users can also integrate their own **custom images**.
-WARNING:
-The `bundler-audit` analyzer is deprecated and will be removed in GitLab 15.0 since it duplicates the functionality of the `gemnasium` analyzer. For more information, read the [deprecation announcement](../../../update/deprecations.md#bundler-audit-dependency-scanning-tool).
+<!--- start_remove The following content will be removed on remove_date: '2022-08-22' -->
-WARNING:
-The `retire.js` analyzer is deprecated and will be removed in GitLab 15.0 since it duplicates the functionality of the `gemnasium` analyzer. For more information, read the [deprecation announcement](../../../update/deprecations.md#retire-js-dependency-scanning-tool).
+The [`bundler-audit`](https://gitlab.com/gitlab-org/gitlab/-/issues/289832) and [`retire.js`](https://gitlab.com/gitlab-org/gitlab/-/issues/350510) analyzers were deprecated
+in GitLab 14.8 and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86704) in 15.0.
+Use Gemnasium instead.
+
+<!--- end_remove -->
## Official default analyzers
@@ -67,7 +67,7 @@ the official analyzers.
### Disable specific analyzers
You can select the official analyzers you don't want to run. Here's how to disable
-`bundler-audit` and `gemnasium` analyzers.
+the `gemnasium` analyzer.
In `.gitlab-ci.yml` define:
```yaml
@@ -75,7 +75,7 @@ include:
template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
- DS_EXCLUDED_ANALYZERS: "bundler-audit, gemnasium"
+ DS_EXCLUDED_ANALYZERS: "gemnasium"
```
### Disabling default analyzers
@@ -88,7 +88,7 @@ include:
template: Security/Dependency-Scanning.gitlab-ci.yml
variables:
- DS_EXCLUDED_ANALYZERS: "gemnasium, gemnasium-maven, gemnasium-python, bundler-audit, retire.js"
+ DS_EXCLUDED_ANALYZERS: "gemnasium, gemnasium-maven, gemnasium-python"
```
This is used when one totally relies on [custom analyzers](#custom-analyzers).
@@ -117,25 +117,25 @@ The [Security Scanner Integration](../../../development/integrations/secure.md)
## Analyzers data
-The following table lists the data available for each official analyzer.
-
-| Property \ Tool | Gemnasium | bundler-audit | Retire.js |
-|---------------------------------------|:------------------:|:------------------:|:------------------:|
-| Severity | ð„‚ | ✓ | ✓ |
-| Title | ✓ | ✓ | ✓ |
-| File | ✓ | ⚠ | ✓ |
-| Start line | ð„‚ | ð„‚ | ð„‚ |
-| End line | ð„‚ | ð„‚ | ð„‚ |
-| External ID (for example, CVE) | ✓ | ✓ | ⚠ |
-| URLs | ✓ | ✓ | ✓ |
-| Internal doc/explanation | ✓ | ð„‚ | ð„‚ |
-| Solution | ✓ | ✓ | ð„‚ |
-| Confidence | ð„‚ | ð„‚ | ð„‚ |
-| Affected item (for example, class or package) | ✓ | ✓ | ✓ |
-| Source code extract | ð„‚ | ð„‚ | ð„‚ |
-| Internal ID | ✓ | ð„‚ | ð„‚ |
-| Date | ✓ | ð„‚ | ð„‚ |
-| Credits | ✓ | ð„‚ | ð„‚ |
+The following table lists the data available for the Gemnasium analyzer.
+
+| Property \ Tool | Gemnasium |
+|---------------------------------------|:------------------:|
+| Severity | ð„‚ |
+| Title | ✓ |
+| File | ✓ |
+| Start line | ð„‚ |
+| End line | ð„‚ |
+| External ID (for example, CVE) | ✓ |
+| URLs | ✓ |
+| Internal doc/explanation | ✓ |
+| Solution | ✓ |
+| Confidence | ð„‚ |
+| Affected item (for example, class or package) | ✓ |
+| Source code extract | ð„‚ |
+| Internal ID | ✓ |
+| Date | ✓ |
+| Credits | ✓ |
- ✓ => we have that data
- âš  => we have that data, but it's partially reliable, or we need to extract that data from unstructured content
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 924e3838d91..87d49ffa324 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -17,9 +17,11 @@ aspects of inspecting the items your code uses. These items typically include ap
dependencies that are almost always imported from external sources, rather than sourced from items
you wrote yourself.
+## Dependency Scanning compared to Container Scanning
+
GitLab offers both Dependency Scanning and Container Scanning
to ensure coverage for all of these dependency types. To cover as much of your risk area as
-possible, we encourage you to use all of our security scanners:
+possible, we encourage you to use all of our security scanning tools:
- Dependency Scanning analyzes your project and tells you which software dependencies,
including upstream dependencies, have been included in your project, and what known
@@ -41,6 +43,21 @@ possible, we encourage you to use all of our security scanners:
efforts to de-duplicate these findings can be tracked in
[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/348655).
+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}** |
+
+1. Lock file must be present in the image to be detected.
+1. Binary file must be present in the image to be detected.
+
## Overview
If you're using [GitLab CI/CD](../../../ci/index.md), you can use dependency scanning to analyze
@@ -136,9 +153,9 @@ table.supported-languages ul {
</thead>
<tbody>
<tr>
- <td rowspan="2">Ruby</td>
- <td rowspan="2">N/A</td>
- <td rowspan="2"><a href="https://bundler.io/">Bundler</a></td>
+ <td>Ruby</td>
+ <td>N/A</td>
+ <td><a href="https://bundler.io/">Bundler</a></td>
<td>
<ul>
<li><code>Gemfile.lock</code></li>
@@ -149,11 +166,6 @@ table.supported-languages ul {
<td>Y</td>
</tr>
<tr>
- <td><code>Gemfile.lock</code></td>
- <td><a href="https://github.com/rubysec/bundler-audit">bundler-audit</a></td>
- <td>N</td>
- </tr>
- <tr>
<td>PHP</td>
<td>N/A</td>
<td><a href="https://getcomposer.org/">Composer</a></td>
@@ -200,9 +212,9 @@ table.supported-languages ul {
<td>N</td>
</tr>
<tr>
- <td rowspan="3">JavaScript</td>
- <td rowspan="2">N/A</td>
- <td rowspan="2"><a href="https://www.npmjs.com/">npm</a></td>
+ <td rowspan="2">JavaScript</td>
+ <td>N/A</td>
+ <td><a href="https://www.npmjs.com/">npm</a></td>
<td>
<ul>
<li><code>package-lock.json</code></li>
@@ -213,11 +225,6 @@ table.supported-languages ul {
<td>Y</td>
</tr>
<tr>
- <td><code>package.json</code></td>
- <td><a href="https://retirejs.github.io/retire.js/">Retire.js</a></td>
- <td>N</td>
- </tr>
- <tr>
<td>N/A</td>
<td><a href="https://classic.yarnpkg.com/en/">yarn</a></td>
<td><code>yarn.lock</code></td>
@@ -236,8 +243,8 @@ table.supported-languages ul {
<td>C#</td>
</tr>
<tr>
- <td rowspan="3">Python</td>
- <td rowspan="3">3.6</td>
+ <td rowspan="4">Python</td>
+ <td rowspan="4">3.9</td>
<td><a href="https://setuptools.readthedocs.io/en/latest/">setuptools</a></td>
<td><code>setup.py</code></td>
<td><a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">Gemnasium</a></td>
@@ -267,6 +274,12 @@ table.supported-languages ul {
<td>N</td>
</tr>
<tr>
+ <td><a href="https://python-poetry.org/">Poetry</a><sup><b><a href="#notes-regarding-supported-languages-and-package-managers-4">4</a></b></sup></td>
+ <td><code>poetry.lock</code></td>
+ <td><a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">Gemnasium</a></td>
+ <td>N</td>
+ </tr>
+ <tr>
<td>Scala</td>
<td>N/A</td>
<td><a href="https://www.scala-sbt.org/">sbt</a><sup><b><a href="#notes-regarding-supported-languages-and-package-managers-3">3</a></b></sup></td>
@@ -305,6 +318,14 @@ table.supported-languages ul {
Support for <a href="https://www.scala-sbt.org/">sbt</a> 1.3 and above was added in GitLab 13.9.
</p>
</li>
+ <li>
+ <a id="notes-regarding-supported-languages-and-package-managers-4"></a>
+ <p>
+ Support for <a href="https://python-poetry.org/">Poetry</a> projects with a <code>poetry.lock</code> file was <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/7006">added in GitLab 15.0</a>.
+ Support for projects without a <code>poetry.lock</code> file is tracked in issue:
+ <a href="https://gitlab.com/gitlab-org/gitlab/-/issues/32774">Poetry's pyproject.toml support for dependency scanning.</a>
+ </p>
+ </li>
</ol>
<!-- markdownlint-enable MD044 -->
@@ -321,13 +342,14 @@ The following package managers use lockfiles that GitLab analyzers are capable o
| Package Manager | Supported File Format Versions | Tested Versions |
| ------ | ------ | ------ |
-| Bundler | N/A | [1.17.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/ruby-bundler/main/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
-| Composer | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/php-composer/main/composer.lock) |
-| Conan | 0.4 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/c-conan/main/conan.lock) |
-| Go | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/main/go.sum) |
-| NuGet | v1 | [4.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/csharp-nuget-dotnetcore/main/src/web.api/packages.lock.json#L2) |
-| npm | v1, v2 | [6.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/main/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/lockfileVersion2/package-lock.json#L4) |
-| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/main/yarn.lock#L2) |
+| Bundler | N/A | [1.17.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/ruby-bundler/default/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
+| Composer | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/php-composer/default/composer.lock) |
+| Conan | 0.4 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/c-conan/default/conan.lock) |
+| Go | N/A | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/default/go.sum) |
+| NuGet | v1 | [4.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/csharp-nuget-dotnetcore/default/src/web.api/packages.lock.json#L2) |
+| npm | v1, v2 | [6.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/default/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/lockfileVersion2/package-lock.json#L4) |
+| yarn | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/default/yarn.lock#L2) |
+| Poetry | v1 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v3/qa/fixtures/python-poetry/default/poetry.lock) |
#### Obtaining dependency information by running a package manager to generate a parsable file
@@ -338,25 +360,18 @@ To support the following package managers, the GitLab analyzers proceed in two s
| Package Manager | Pre-installed Versions | Tested Versions |
| ------ | ------ | ------ |
-| Bundler | [2.1.4](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit/-/blob/v2.11.3/Dockerfile#L15)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup> | [1.17.3](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/master/Gemfile.lock#L118), [2.1.4](https://gitlab.com/gitlab-org/security-products/tests/ruby-bundler/-/blob/bundler2-FREEZE/Gemfile.lock#L118) |
| sbt | [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.24.6/config/.tool-versions#L4) | [1.0.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L443-447), [1.1.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L449-453), [1.2.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L455-459), [1.3.12](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L461-465), [1.4.6](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L467-471), [1.5.8](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L473-477), [1.6.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L479-483) |
| Maven | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) | [3.6.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L95-97) |
-| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.26.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L319-323), [6.7](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L286-288)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [6.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L331-335), [7.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L300-302)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup> |
+| Gradle | [6.7.1](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.23.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup>, [7.3.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.26.0/config/.tool-versions#L5)<sup><b><a href="#exported-dependency-information-notes-1">1</a></b></sup> | [5.6.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L319-323), [6.7](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L286-288)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup>, [6.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L331-335), [7.3](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/blob/v2.28.1/spec/image_spec.rb#L300-302)<sup><b><a href="#exported-dependency-information-notes-2">2</a></b></sup> |
| setuptools | [50.3.2](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L27) | [57.5.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L224-247) |
| pip | [20.2.4](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/v2.29.9/Dockerfile#L26) | [20.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L77-91) |
-| Pipenv | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.18.4/requirements.txt#L13) | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L168-191)<sup><b><a href="#exported-dependency-information-notes-4">4</a></b></sup>, [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L143-166) |
+| Pipenv | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.18.4/requirements.txt#L13) | [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L168-191)<sup><b><a href="#exported-dependency-information-notes-3">3</a></b></sup>, [2018.11.26](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/blob/v2.22.0/spec/image_spec.rb#L143-166) |
<!-- markdownlint-disable MD044 -->
<ol>
<li>
<a id="exported-dependency-information-notes-1"></a>
<p>
- The pre-installed and tested version of <code>Bundler</code> is only used for the <a href="https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit">bundler-audit</a> analyzer, and is not used for <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">gemnasium</a>.
- </p>
- </li>
- <li>
- <a id="exported-dependency-information-notes-2"></a>
- <p>
Different versions of Java require different versions of Gradle. The versions of Gradle listed in the above table are pre-installed
in the analyzer image. The version of Gradle used by the analyzer depends on whether your project uses a <code>gradlew</code>
(Gradle wrapper) file or not:
@@ -383,13 +398,13 @@ To support the following package managers, the GitLab analyzers proceed in two s
</ul>
</li>
<li>
- <a id="exported-dependency-information-notes-3"></a>
+ <a id="exported-dependency-information-notes-2"></a>
<p>
These tests confirm that if a <code>gradlew</code> file does not exist, the version of <code>Gradle</code> pre-installed in the analyzer image is used.
</p>
</li>
<li>
- <a id="exported-dependency-information-notes-4"></a>
+ <a id="exported-dependency-information-notes-3"></a>
<p>
This test confirms that if a <code>Pipfile.lock</code> file is found, it will be used by <a href="https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium">Gemnasium</a> to scan the exact package versions listed in this file.
</p>
@@ -411,35 +426,28 @@ NOTE:
If you've run into problems while scanning multiple files, please contribute a comment to
[this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337056).
-#### Ruby
-
-The following analyzers are executed, each of which have different behavior when processing multiple files:
-
-- [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium)
-
- Supports multiple lockfiles.
-
-- [bundler-audit](https://github.com/rubysec/bundler-audit)
-
- Does not support multiple lockfiles. When multiple lockfiles exist, `bundler-audit`
- analyzes the first lockfile discovered while traversing the directory tree in alphabetical order.
+#### Python
-WARNING:
-The `bundler-audit` analyzer is deprecated and will be removed in GitLab 15.0 since it duplicates the functionality of the `gemnasium` analyzer. For more information, read the [deprecation announcement](../../../update/deprecations.md#bundler-audit-dependency-scanning-tool).
+We only execute one installation in the directory where either a requirements file or a lock file has been detected. Dependencies are only analyzed by `gemnasium-python` for the first file that is detected. Files are searched for in the following order:
-#### Python
+1. `requirements.txt`, `requirements.pip`, or `requires.txt` for projects using Pip.
+1. `Pipfile` or `Pipfile.lock` for projects using Pipenv.
+1. `poetry.lock` for projects using Poetry.
+1. `setup.py` for project using Setuptools.
-We only execute one installation in the directory where a requirements file has been detected, such as `requirements.txt` or any
-variation of this file (for example, `requirements.pip` or `requires.txt`).
+The search begins with the root directory and then continues with subdirectories if no builds are found in the root directory. Consequently a Poetry lock file in the root directory would be detected before a Pipenv file in a subdirectory.
#### Java and Scala
-We only execute one build in the directory where a build file has been detected, such as `build.sbt` or `build.gradle`.
-Please note, we support the following types of Java project structures:
+We only execute one build in the directory where a build file has been detected. For large projects that include
+multiple Gradle, Maven, or sbt builds, or any combination of these, `gemnasium-maven` only analyzes dependencies for the first build file
+that is detected. Build files are searched for in the following order:
+
+1. `build.gradle` or `build.gradle.kts` for single or [multi-project](https://docs.gradle.org/current/userguide/intro_multi_project_builds.html) Gradle builds.
+1. `pom.xml` for single or [multi-module](https://maven.apache.org/pom.html#Aggregation) Maven projects.
+1. `build.sbt` for single or [multi-project](https://www.scala-sbt.org/1.x/docs/Multi-Project.html) sbt builds.
-- [multi-project sbt builds](https://www.scala-sbt.org/1.x/docs/Multi-Project.html)
-- [multi-project Gradle builds](https://docs.gradle.org/current/userguide/intro_multi_project_builds.html)
-- [multi-module maven projects](https://maven.apache.org/pom.html#Aggregation)
+The search begins with the root directory and then continues with subdirectories if no builds are found in the root directory. Consequently an sbt build file in the root directory would be detected before a Gradle build file in a subdirectory.
#### JavaScript
@@ -454,26 +462,20 @@ The following analyzers are executed, each of which have different behavior when
Does not support multiple lockfiles. When multiple lockfiles exist, `Retire.js`
analyzes the first lockfile discovered while traversing the directory tree in alphabetical order.
-From GitLab 14.8 the `Gemnasium` analyzer scans supported JavaScript projects for vendored libraries
+From GitLab 14.8 the `gemnasium` analyzer scans supported JavaScript projects for vendored libraries
(that is, those checked into the project but not managed by the package manager).
-WARNING:
-The `retire.js` analyzer is deprecated and will be removed in GitLab 15.0 since it duplicates the functionality of the `gemnasium` analyzer. For more information, read the [deprecation announcement](../../../update/deprecations.md#retire-js-dependency-scanning-tool).
-We execute both analyzers because they use different sources of vulnerability data. The result is more comprehensive analysis than if only one was executed.
-
-#### PHP, Go, C, C++, .NET, C&#35;
+#### PHP, Go, C, C++, .NET, C&#35;, Ruby, JavaScript
The analyzer for these languages supports multiple lockfiles.
-### Support for additional languages
+#### Support for additional languages
Support for additional languages, dependency managers, and dependency files are tracked in the following issues:
| Package Managers | Languages | Supported files | Scan tools | Issue |
| ------------------- | --------- | --------------- | ---------- | ----- |
-| [Poetry](https://python-poetry.org/) | Python | `poetry.lock` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) | [GitLab#7006](https://gitlab.com/gitlab-org/gitlab/-/issues/7006) |
-
-For workarounds, see the [Troubleshooting section](#troubleshooting).
+| [Poetry](https://python-poetry.org/) | Python | `pyproject.toml` | [Gemnasium](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) | [GitLab#32774](https://gitlab.com/gitlab-org/gitlab/-/issues/32774) |
## Contribute your scanner
@@ -506,7 +508,7 @@ always take the latest dependency scanning artifact available.
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4908) in GitLab 14.1 [with a flag](../../../administration/feature_flags.md) named `sec_dependency_scanning_ui_enable`. Enabled by default.
> - [Enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/282533) in GitLab 14.1.
-> - [Feature flag sec_dependency_scanning_ui_enable removed](https://gitlab.com/gitlab-org/gitlab/-/issues/326005) in GitLab 14.2.
+> - [Feature flag `sec_dependency_scanning_ui_enable` removed](https://gitlab.com/gitlab-org/gitlab/-/issues/326005) in GitLab 14.2.
To enable Dependency Scanning in a project, you can create a merge request:
@@ -577,9 +579,9 @@ The following variables allow configuration of global dependency scanning settin
| ----------------------------|------------ |
| `ADDITIONAL_CA_CERT_BUNDLE` | Bundle of CA certs to trust. The bundle of certificates provided here is also used by other tools during the scanning process, such as `git`, `yarn`, or `npm`. See [Using a custom SSL CA certificate authority](#using-a-custom-ssl-ca-certificate-authority) for more details. |
| `DS_EXCLUDED_ANALYZERS` | Specify the analyzers (by name) to exclude from Dependency Scanning. For more information, see [Dependency Scanning Analyzers](analyzers.md). |
-| `DS_DEFAULT_ANALYZERS` | ([**DEPRECATED - use `DS_EXCLUDED_ANALYZERS` instead**](https://gitlab.com/gitlab-org/gitlab/-/issues/287691)) Override the names of the official default images. For more information, see [Dependency Scanning Analyzers](analyzers.md). |
+| `DS_DEFAULT_ANALYZERS` | This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in GitLab 14.8 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/351963) in 15.0. Use `DS_EXCLUDED_ANALYZERS` instead. |
| `DS_EXCLUDED_PATHS` | Exclude files and directories from the scan based on the paths. A comma-separated list of patterns. Patterns can be globs, or file or folder paths (for example, `doc,spec`). Parent directories also match patterns. Default: `"spec, test, tests, tmp"`. |
-| `DS_IMAGE_SUFFIX` | Suffix added to the image name. If set to `-fips`, `FIPS-enabled` images are used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354796) in GitLab 14.10. |
+| `DS_IMAGE_SUFFIX` | Suffix added to the image name. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/354796) in GitLab 14.10.) Automatically set to `"-fips"` when FIPS mode is enabled. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357922) in GitLab 15.0.) |
| `SECURE_ANALYZERS_PREFIX` | Override the name of the Docker registry providing the official default images (proxy). Read more about [customizing analyzers](analyzers.md). |
| `SECURE_LOG_LEVEL` | 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. Default: `info`. |
@@ -589,16 +591,13 @@ The following variables are used for configuring specific analyzers (used for a
| CI/CD variable | Analyzer | Default | Description |
|--------------------------------------| ------------------ | ---------------------------- |------------ |
-| `BUNDLER_AUDIT_UPDATE_DISABLED` | `bundler-audit` | `"false"` | Disable automatic updates for the `bundler-audit` analyzer. Use if you're running dependency scanning in an offline, air-gapped environment.|
-| `BUNDLER_AUDIT_ADVISORY_DB_URL` | `bundler-audit` | `https://github.com/rubysec/ruby-advisory-db` | URL of the advisory database used by bundler-audit. |
-| `BUNDLER_AUDIT_ADVISORY_DB_REF_NAME` | `bundler-audit` | `master` | Git ref for the advisory database specified by `BUNDLER_AUDIT_ADVISORY_DB_URL`. |
| `GEMNASIUM_DB_LOCAL_PATH` | `gemnasium` | `/gemnasium-db` | Path to local Gemnasium database. |
| `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. |
| `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` | `11` | Version of Java. Available versions: `8`, `11`, `13`, `14`, `15`, `16`, `17`. |
+| `DS_JAVA_VERSION` | `gemnasium-maven` | `17` | Version of Java. Available versions: `8`, `11`, `13`, `14`, `15`, `16`, `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). |
| `GRADLE_CLI_OPTS` | `gemnasium-maven` | | List of command line arguments that are passed to `gradle` by the analyzer. |
| `SBT_CLI_OPTS` | `gemnasium-maven` | | List of command-line arguments that the analyzer passes to `sbt`. |
@@ -607,9 +606,6 @@ 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) |
-| `RETIREJS_JS_ADVISORY_DB` | `retire.js` | `https://raw.githubusercontent.com/RetireJS/retire.js/master/repository/jsrepository.json` | Path or URL to `retire.js` JS vulnerability data file. Note that if the URL hosting the data file uses a custom SSL certificate, for example in an offline installation, you can pass the certificate in the `ADDITIONAL_CA_CERT_BUNDLE` variable. |
-| `RETIREJS_NODE_ADVISORY_DB` | `retire.js` | `https://raw.githubusercontent.com/RetireJS/retire.js/master/repository/npmrepository.json` | Path or URL to `retire.js` node vulnerability data file. Note that if the URL hosting the data file uses a custom SSL certificate, for example in an offline installation, you can pass the certificate in the `ADDITIONAL_CA_CERT_BUNDLE` variable. |
-| `RETIREJS_ADVISORY_DB_INSECURE` | `retire.js` | `false` | Enable fetching remote JS and Node vulnerability data files (defined by the `RETIREJS_JS_ADVISORY_DB` and `RETIREJS_NODE_ADVISORY_DB` variables) from hosts using an insecure or self-signed SSL (TLS) certificate. |
#### Other variables
@@ -667,32 +663,10 @@ Read more on [how to use private Maven repositories](../index.md#using-private-m
GitLab also offers [FIPS-enabled Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
versions of the Gemnasium images. You can therefore replace standard images with FIPS-enabled images.
-To use FIPS-enabled images, set the `DS_IMAGE_SUFFIX` to `-fips`,
-and set `DS_EXCLUDED_ANALYZERS` to `bundler-audit, retire.js`
-to exclude the analyzers that don't support FIPS.
+Gemnasium scanning jobs automatically use FIPS-enabled image when FIPS mode is enabled in the GitLab instance.
+([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357922) in GitLab 15.0.)
-```yaml
-variables:
- DS_IMAGE_SUFFIX: "-fips"
- DS_EXCLUDED_ANALYZERS: "bundler-audit, retire.js"
-```
-
-If you want to execute `bundler-audit` or `retire.js` in your project pipeline, you can override the
-Gemnasium scanning jobs, and set `DS_IMAGE_SUFFIX` to `-fips` only for those jobs.
-
-```yaml
-gemnasium-dependency_scanning:
- variables:
- DS_IMAGE_SUFFIX: "-fips"
-
-gemnasium-maven-dependency_scanning:
- variables:
- DS_IMAGE_SUFFIX: "-fips"
-
-gemnasium-python-dependency_scanning:
- variables:
- DS_IMAGE_SUFFIX: "-fips"
-```
+To manually switch to FIPS-enabled images, set the variable `DS_IMAGE_SUFFIX` to `"-fips"`.
## Interacting with the vulnerabilities
@@ -944,9 +918,6 @@ Here are the requirements for using dependency scanning in an offline environmen
This advisory database is constantly being updated, so you must periodically sync your local copy with GitLab.
-- _Only if scanning Ruby projects_: Host an offline Git copy of the [advisory database](https://github.com/rubysec/ruby-advisory-db).
-- _Only if scanning npm/yarn projects_: Host an offline copy of the [`retire.js`](https://github.com/RetireJS/retire.js/) [node](https://github.com/RetireJS/retire.js/blob/master/repository/npmrepository.json) and [`js`](https://github.com/RetireJS/retire.js/blob/master/repository/jsrepository.json) advisory databases.
-
Note that GitLab Runner has a [default `pull policy` of `always`](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy),
meaning the runner tries to pull Docker images from the GitLab container registry even if a local
copy is available. The GitLab Runner [`pull_policy` can be set to `if-not-present`](https://docs.gitlab.com/runner/executors/docker.html#using-the-if-not-present-pull-policy)
@@ -961,11 +932,9 @@ import the following default dependency scanning analyzer images from `registry.
your [local Docker container registry](../../packages/container_registry/index.md):
```plaintext
-registry.gitlab.com/security-products/gemnasium:2
-registry.gitlab.com/security-products/gemnasium-maven:2
-registry.gitlab.com/security-products/gemnasium-python:2
-registry.gitlab.com/security-products/retire.js:2
-registry.gitlab.com/security-products/bundler-audit:2
+registry.gitlab.com/security-products/gemnasium:3
+registry.gitlab.com/security-products/gemnasium-maven:3
+registry.gitlab.com/security-products/gemnasium-python:3
```
The process for importing Docker images into a local offline Docker registry depends on
@@ -987,8 +956,6 @@ Support for custom certificate authorities was introduced in the following versi
| `gemnasium` | [v2.8.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/releases/v2.8.0) |
| `gemnasium-maven` | [v2.9.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/releases/v2.9.0) |
| `gemnasium-python` | [v2.7.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/releases/v2.7.0) |
-| `retire.js` | [v2.4.0](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js/-/releases/v2.4.0) |
-| `bundler-audit` | [v2.4.0](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit/-/releases/v2.4.0) |
### Set dependency scanning CI/CD job variables to use local dependency scanning analyzers
@@ -1121,22 +1088,6 @@ intended to obtain a private package from a private index. This only affects use
requires that the package does not already exist in the public index (and thus the attacker can put the package there with an arbitrary
version number).
-## Limitations
-
-### Referencing local dependencies using a path in JavaScript projects
-
-The [Retire.js](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js) analyzer
-doesn't support dependency references made with [local paths](https://docs.npmjs.com/cli/v6/configuring-npm/package-json/#local-paths)
-in the `package.json` of JavaScript projects. The dependency scan outputs the following error for
-such references:
-
-```plaintext
-ERROR: Could not find dependencies: <dependency-name>. You may need to run npm install
-```
-
-As a workaround, add the [`retire.js`](analyzers.md) analyzer to
-[`DS_EXCLUDED_ANALYZERS`](#configuring-dependency-scanning).
-
## Troubleshooting
### Working around missing support for certain languages or package managers
@@ -1156,9 +1107,8 @@ Generally, the approach is the following:
1. Add [`dependencies: [<your-converter-job>]`](../../../ci/yaml/index.md#dependencies)
to your `dependency_scanning` job to make use of the converted definitions files.
-For example, the unsupported `poetry.lock` file can be
-[converted](https://python-poetry.org/docs/cli/#export)
-to the supported `requirements.txt` as follows.
+For example, Poetry projects that _only_ have a `pyproject.toml`
+file can generate the `poetry.lock` file as follows.
```yaml
include:
@@ -1167,15 +1117,11 @@ include:
stages:
- test
-variables:
- PIP_REQUIREMENTS_FILE: "requirements-converted.txt"
-
gemnasium-python-dependency_scanning:
- # Work around https://gitlab.com/gitlab-org/gitlab/-/issues/7006
+ # Work around https://gitlab.com/gitlab-org/gitlab/-/issues/32774
before_script:
- - pip install poetry # Or via another method: https://python-poetry.org/docs/#installation
- - poetry export --output="$PIP_REQUIREMENTS_FILE"
- - rm poetry.lock pyproject.toml
+ - pip install "poetry>=1,<2" # Or via another method: https://python-poetry.org/docs/#installation
+ - poetry update --lock # Generates the lock file to be analyzed.
```
### `Error response from daemon: error processing tar file: docker-tar: relocation error`
@@ -1197,11 +1143,6 @@ syntax. This directive is limited to 10000 checks and always returns `true` afte
number. Because of this, and depending on the number of files in your repository, a dependency
scanning job might be triggered even if the scanner doesn't support your project.
-### Issues building projects with npm or yarn packages relying on Python 2
-
-[Python 2 was removed](https://www.python.org/doc/sunset-python-2/) from the `retire.js` analyzer in GitLab 13.7 (analyzer version 2.10.1). Projects using packages
-with a dependency on this version of Python should use `retire.js` version 2.10.0 or lower (for example, `registry.gitlab.com/gitlab-org/security-products/analyzers/retire.js:2.10.0`).
-
### Error: `dependency_scanning is used for configuration only, and its script should not be executed`
For information on this, see the [GitLab Secure troubleshooting section](../index.md#error-job-is-used-for-configuration-only-and-its-script-should-not-be-executed).
@@ -1260,7 +1201,7 @@ We recommend committing the lock files, which prevents this warning.
If you have manually set `DS_MAJOR_VERSION` or `DS_ANALYZER_IMAGE` for specific reasons,
and now must update your configuration to again get the latest patched versions of our
-analyzers, edit your `gitlab-ci.yml` file and either:
+analyzers, edit your `.gitlab-ci.yml` file and either:
- Set your `DS_MAJOR_VERSION` to match the latest version as seen in
[our current Dependency Scanning template](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml#L18).
@@ -1290,5 +1231,22 @@ To work around this error, downgrade the analyzer's version of `setuptools` (e.g
gemnasium-python-dependency_scanning:
before_script:
- pip install setuptools==57.5.0
- image: registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python:2-python-3.9
+```
+
+### Dependency Scanning of projects using psycopg2 fails with `pg_config executable not found` error
+
+Scanning a Python project that depends on `psycopg2` can fail with this message:
+
+```plaintext
+Error: pg_config executable not found.
+```
+
+[psycopg2](https://pypi.org/project/psycopg2/) depends on the `libpq-dev` Debian package,
+which is not installed in the `gemnasium-python` Docker image. To work around this error,
+install the `libpq-dev` package in a `before_script`:
+
+```yaml
+gemnasium-python-dependency_scanning:
+ before_script:
+ - apt-get update && apt-get install -y libpq-dev
```
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 3a6aa8e3485..b5d39f3b32a 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -10,7 +10,7 @@ GitLab can check your application for security vulnerabilities including:
- Unauthorized access.
- Data leaks.
-- Denial of service attacks.
+- Denial of Service (DoS) attacks.
Statistics and details on vulnerabilities are included in the merge request. Providing
actionable information _before_ changes are merged enables you to be proactive.
@@ -19,9 +19,6 @@ GitLab also provides high-level statistics of vulnerabilities across projects an
- The [Security Dashboard](security_dashboard/index.md) provides a
high-level view of vulnerabilities detected in your projects, pipeline, and groups.
-- The [Threat Monitoring](threat_monitoring/index.md) page provides runtime security metrics
- for application environments. With the information provided,
- you can immediately begin risk analysis and remediation.
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
For an overview of GitLab application security, see [Shifting Security Left](https://www.youtube.com/watch?v=XnYstHObqlA&t).
@@ -51,8 +48,8 @@ The following vulnerability scanners and their databases are regularly updated:
| Secure scanning tool | Vulnerabilities database updates |
|:----------------------------------------------------------------|:---------------------------------|
-| [Container Scanning](container_scanning/index.md) | A job runs on a daily basis to build new images with the latest vulnerability database updates from the upstream scanner. For more details, see [Vulnerabilities database update](container_scanning/index.md#vulnerabilities-database-update). |
-| [Dependency Scanning](dependency_scanning/index.md) | Relies on `bundler-audit` (for Ruby gems), `retire.js` (for npm packages), and `gemnasium` (the GitLab tool for all libraries). Both `bundler-audit` and `retire.js` fetch their vulnerabilities data from GitHub repositories, so vulnerabilities added to `ruby-advisory-db` and `retire.js` are immediately available. The tools themselves are updated once per month if there's a new version. The [GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db) is updated on a daily basis using [data from NVD, the `ruby-advisory-db` and the GitHub Advisory Database as data sources](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/blob/master/SOURCES.md). See our [current measurement of time from CVE being issued to our product being updated](https://about.gitlab.com/handbook/engineering/development/performance-indicators/#cve-issue-to-update). |
+| [Container Scanning](container_scanning/index.md) | A job runs on a daily basis to build new images with the latest vulnerability database updates from the upstream scanner. For more details, see [Vulnerabilities database update](container_scanning/index.md#vulnerabilities-database). |
+| [Dependency Scanning](dependency_scanning/index.md) | Relies on the [GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db). It is updated on a daily basis using [data from NVD, the `ruby-advisory-db` and the GitHub Advisory Database as data sources](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/blob/master/SOURCES.md). See our [current measurement of time from CVE being issued to our product being updated](https://about.gitlab.com/handbook/engineering/development/performance-indicators/#cve-issue-to-update). |
| [Dynamic Application Security Testing (DAST)](dast/index.md) | The scanning engine is updated on a periodic basis. See the [version of the underlying tool `zaproxy`](https://gitlab.com/gitlab-org/security-products/dast/blob/main/Dockerfile#L1). The scanning rules are downloaded at scan runtime. |
| [Static Application Security Testing (SAST)](sast/index.md) | Relies exclusively on [the tools GitLab wraps](sast/index.md#supported-languages-and-frameworks). The underlying analyzers are updated at least once per month if a relevant update is available. The vulnerabilities database is updated by the upstream tools. |
@@ -145,7 +142,7 @@ Jobs pass if they are able to complete a scan. A _pass_ result does NOT indicate
Jobs fail if they are unable to complete a scan. You can view the pipeline logs for more information.
-All jobs are permitted to fail by default. This means that if they fail it do not fail the pipeline.
+All jobs are permitted to fail by default. This means that if they fail, it does not fail the pipeline.
If you want to prevent vulnerabilities from being merged, you should do this by adding [Security Approvals in Merge Requests](#security-approvals-in-merge-requests) which prevents unknown, high or critical findings from being merged without an approval from a specific group of people that you choose.
@@ -174,7 +171,7 @@ reports are available to download. To download a report, select
A merge request contains a security widget which displays a summary of the NEW results. New results are determined by comparing the current findings against existing findings in the target (default) branch (if there are prior findings).
-We recommended you run a scan of the `default` branch before enabling feature branch scans for your developers. Otherwise, there is no base for comparison and all feature branches display the full scan results in the merge request security widget.
+We recommend you run a scan of the `default` branch before enabling feature branch scans for your developers. Otherwise, there is no base for comparison and all feature branches display the full scan results in the merge request security widget.
The merge request security widget displays only a subset of the vulnerabilities in the generated JSON artifact because it contains both NEW and EXISTING findings.
@@ -204,56 +201,24 @@ By default, the vulnerability report does not show vulnerabilities of `dismissed
## Security approvals in merge requests
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9928) in GitLab 12.2.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9928) in GitLab 12.2.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357300) the Vulnerability-Check feature in GitLab 15.0.
You can enforce an additional approval for merge requests that would introduce one of the following
security issues:
-- A security vulnerability. For more details, read
- [Vulnerability-Check rule](#vulnerability-check-rule).
+- A security vulnerability. For more details, read [Scan result policies](policies/scan-result-policies.md).
- 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).
-### Vulnerability-Check rule
+### Migration of existing Vulnerability-Check rules
-WARNING:
-This feature is in its end-of-life process. It is [deprecated](../../update/deprecations.md#vulnerability-check)
-in GitLab 14.8, and is planned for removal in GitLab 15.0. Users should migrate to the new
-[Security Approval Policies](policies/scan-result-policies.md).
+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.
-To prevent a merge request introducing a security vulnerability in a project, enable the
-Vulnerability-Check rule. While this rule is enabled, additional merge request approval by
-[eligible approvers](../project/merge_requests/approvals/rules.md#eligible-approvers)
-is required when the latest security report in a merge request:
-
-- Contains vulnerabilities with states (for example, `previously detected`, `dismissed`) matching the rule's vulnerability states. Only `newly detected` are considered if the target branch differs from the project default branch.
-- Contains vulnerabilities with severity levels (for example, `high`, `critical`, or `unknown`)
- matching the rule's severity levels.
-- Contains a vulnerability count higher than the rule allows.
-- Is not yet generated (until pipeline completion).
-
-An approval is optional when the security report:
-
-- Contains only vulnerabilities with states (for example, `newly detected`, `resolved`) **NOT** matching the rule's vulnerability states.
-- Contains only vulnerabilities with severity levels (for example, `low`, `medium`) **NOT** matching
- the rule's severity levels.
-- Contains a vulnerability count equal to or less than what the rule allows.
-
-Project members with at least the Maintainer role can enable or edit
-the Vulnerability-Check rule.
-
-#### Enable the Vulnerability-Check rule
-
-To enable or edit the Vulnerability-Check rule:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > General**.
-1. Expand **Merge request approvals**.
-1. Select **Activate** or **Edit** of the Vulnerability-Check.
-1. Complete the fields. **Approvals required** must be at least 1.
-1. Select **Add approval rule**.
-
-The approval rule is enabled for all merge requests. Any code changes reset the approvals required.
+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
@@ -443,7 +408,7 @@ You can interact with the results of the security scanning tools in several loca
For more details about which findings or vulnerabilities you can view in each of those locations,
select the respective link. Each page details the ways in which you can interact with the findings
-and vulnerabilities. As an example, in most cases findings start out as _detected_ status.
+and vulnerabilities. As an example, in most cases findings start out as a _detected_ status.
You have the option to:
@@ -507,7 +472,7 @@ Additional details about the differences between the two solutions are outlined
| ------ | ------ | ------ |
| **Flexibility** | Supports anything that can be done in a CI file. | Limited to only the items for which GitLab has explicitly added support. DAST, SAST, Secret Detection, and Container Scanning scans are supported. |
| **Usability** | Requires knowledge of CI YAML. | Follows a `rules` and `actions`-based YAML structure. |
-| **Inclusion in CI pipeline** | The compliance pipeline is executed instead of the project's `gitlab-ci.yml` file. To include the project's `gitlab-ci.yml` file, use an `include` statement. Defined variables aren't allowed to be overwritten by the included project's YAML file. | Forced inclusion of a new job into the CI pipeline. DAST jobs that must be customized on a per-project basis can have project-level Site Profiles and Scan Profiles defined. To ensure separation of duties, these profiles are immutable when referenced in a scan execution policy. All jobs can be customized as part of the security policy itself with the same variables that are normally available to the CI job. |
+| **Inclusion in CI pipeline** | The compliance pipeline is executed instead of the project's `.gitlab-ci.yml` file. To include the project's `.gitlab-ci.yml` file, use an `include` statement. Defined variables aren't allowed to be overwritten by the included project's YAML file. | Forced inclusion of a new job into the CI pipeline. DAST jobs that must be customized on a per-project basis can have project-level Site Profiles and Scan Profiles defined. To ensure separation of duties, these profiles are immutable when referenced in a scan execution policy. All jobs can be customized as part of the security policy itself with the same variables that are normally available to the CI job. |
| **Schedulable** | Can be scheduled through a scheduled pipeline on the group. | Can be scheduled natively through the policy configuration itself. |
| **Separation of Duties** | Only group owners can create compliance framework labels. Only project owners can apply compliance framework labels to projects. The ability to make or approve changes to the compliance pipeline definition is limited to individuals who are explicitly given access to the project that contains the compliance pipeline. | Only project owners can define a linked security policy project. The ability to make or approve changes to security policies is limited to individuals who are explicitly given access to the security policy project. |
| **Ability to apply one standard to multiple projects** | The same compliance framework label can be applied to multiple projects inside a group. | The same security policy project can be used for multiple projects across GitLab with no requirement of being located in the same group. |
@@ -657,7 +622,7 @@ involve pinning to the previous template versions, for example:
```
Additionally, we provide a dedicated project containing the versioned legacy templates.
-This can be used for offline setups or anyone wishing to use [Auto DevOps](../../topics/autodevops/index.md).
+This can be used for offline setups or for anyone wishing to use [Auto DevOps](../../topics/autodevops/index.md).
Instructions are available in the [legacy template project](https://gitlab.com/gitlab-org/auto-devops-v12-10).
@@ -694,3 +659,6 @@ These security pages can be populated by running the jobs from the manual step o
There is [an issue open to handle this scenario](https://gitlab.com/gitlab-org/gitlab/-/issues/346843).
Please upvote the issue to help with prioritization, and
[contributions are welcomed](https://about.gitlab.com/community/contribute/).
+ doc/user/project/merge_requests/approvals/settings.md
++
+0
diff --git a/doc/user/application_security/policies/img/policies_list_v14_3.png b/doc/user/application_security/policies/img/policies_list_v14_3.png
deleted file mode 100644
index 7a24860d4a7..00000000000
--- a/doc/user/application_security/policies/img/policies_list_v14_3.png
+++ /dev/null
Binary files differ
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
new file mode 100644
index 00000000000..4089c311fe4
--- /dev/null
+++ b/doc/user/application_security/policies/img/policies_list_v15_0.png
Binary files differ
diff --git a/doc/user/application_security/policies/index.md b/doc/user/application_security/policies/index.md
index 81d24104340..f790164d9a0 100644
--- a/doc/user/application_security/policies/index.md
+++ b/doc/user/application_security/policies/index.md
@@ -19,7 +19,6 @@ GitLab supports the following security policies:
- [Scan Execution Policy](scan-execution-policies.md)
- [Scan Result Policy](scan-result-policies.md)
-- [Container Network Policy](#container-network-policy) (DEPRECATED)
## Security policy project
@@ -42,8 +41,9 @@ stored there. Examples and schema information are available for the following po
- [Scan execution policy](scan-execution-policies.md#example-security-policies-project)
- [Scan result policy](scan-result-policies.md#example-security-scan-result-policies-project)
-Policies created in this project are applied through a background job that runs once every 10
-minutes. Allow up to 10 minutes for any policy changes committed to this project to take effect.
+Most policy changes take effect as soon as the merge request is merged. Any changes that
+do not go through a merge request and are committed directly to the default branch may require up to 10 minutes
+before the policy changes take effect.
### Managing the linked security policy project
@@ -81,22 +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_v14_3.png)
-
-Network policies are fetched directly from the selected environment's
-deployment platform while other policies are fetched from the project's
-security policy project. Changes performed outside of this tab are
-reflected upon refresh.
-
-By default, the policy list contains predefined network policies in a
-disabled state. Once enabled, a predefined policy deploys to the
-selected environment's deployment platform and you can manage it like
-the regular policies.
-
-Note that if you're using [Auto DevOps](../../../topics/autodevops/index.md)
-and change a policy in this section, your `auto-deploy-values.yaml` file doesn't update. Auto DevOps
-users must make changes by following the
-[Container Network Policy documentation](../../../topics/autodevops/stages.md#network-policy).
+![Policies List Page](img/policies_list_v15_0.png)
## Policy editor
@@ -144,111 +129,6 @@ See [Scan execution policies](scan-execution-policies.md).
See [Scan result policies](scan-result-policies.md).
-## Container Network Policy
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32365) in GitLab 12.9.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Container Network Policy is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-The **Container Network Policy** section provides packet flow metrics for
-your application's Kubernetes namespace. This section has the following
-prerequisites:
-
-- Your project contains at least one [environment](../../../ci/environments/index.md).
-- You've [installed Cilium](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
-- You've configured the [Prometheus service](../../project/integrations/prometheus.md#enabling-prometheus-integration).
-
-If you're using custom Helm values for Cilium, you must enable Hubble
-with flow metrics for each namespace by adding the following lines to
-your [Cilium values](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium):
-
-```yaml
-hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
-```
-
-The **Container Network Policy** section displays the following information
-about your packet flow:
-
-- The total amount of the inbound and outbound packets
-- The proportion of packets dropped according to the configured
- policies
-- The per-second average rate of the forwarded and dropped packets
- accumulated over time window for the requested time interval
-
-If a significant percentage of packets is dropped, you should
-investigate it for potential threats by
-examining the Cilium logs:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
-```
-
-### Change the status
-
-To change a network policy's status:
-
-- Select the network policy you want to update.
-- Select **Edit policy**.
-- Select the **Policy status** toggle to update the selected policy.
-- Select **Save changes** to deploy network policy changes.
-
-Disabled network policies have the `network-policy.gitlab.com/disabled_by: gitlab` selector inside
-the `podSelector` block. This narrows the scope of such a policy and as a result it doesn't affect
-any pods. The policy itself is still deployed to the corresponding deployment namespace.
-
-### Container Network Policy editor
-
-The policy editor only supports the [CiliumNetworkPolicy](https://docs.cilium.io/en/v1.8/policy/)
-specification. Regular Kubernetes [NetworkPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/#networkpolicy-v1-networking-k8s-io)
-resources aren't supported.
-
-Rule mode supports the following rule types:
-
-- [Labels](https://docs.cilium.io/en/v1.8/policy/language/#labels-based).
-- [Entities](https://docs.cilium.io/en/v1.8/policy/language/#entities-based).
-- [IP/CIDR](https://docs.cilium.io/en/v1.8/policy/language/#ip-cidr-based). Only
- the `toCIDR` block without `except` is supported.
-- [DNS](https://docs.cilium.io/en/v1.8/policy/language/#dns-based).
-- [Level 4](https://docs.cilium.io/en/v1.8/policy/language/#layer-4-examples)
- can be added to all other rules.
-
-Once your policy is complete, save it by selecting **Save policy**
-at the bottom of the editor. Existing policies can also be
-removed from the editor interface by selecting **Delete policy**
-at the bottom of the editor.
-
-### Configure a Network Policy Alert
-
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3438) and [enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/287676) in GitLab 13.9.
-> - The feature flag was removed and the Threat Monitoring Alerts Project was [made generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/287676) in GitLab 14.0.
-
-You can use policy alerts to track your policy's impact. Alerts are only available if you've
-[installed](../../clusters/agent/repository.md)
-and [configured](../../clusters/agent/install/index.md#register-the-agent-with-gitlab)
-an agent for this project.
-
-There are two ways to create policy alerts:
-
-- In the [policy editor UI](#container-network-policy-editor),
- by clicking **Add alert**.
-- In the policy editor's YAML mode, through the `metadata.annotations` property:
-
- ```yaml
- metadata:
- annotations:
- app.gitlab.com/alert: 'true'
- ```
-
-Once added, the UI updates and displays a warning about the dangers of too many alerts.
-
## Roadmap
See the [Category Direction page](https://about.gitlab.com/direction/protect/security_orchestration/)
diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md
index 7e8e60768b9..aa23ad30a73 100644
--- a/doc/user/application_security/policies/scan-execution-policies.md
+++ b/doc/user/application_security/policies/scan-execution-policies.md
@@ -35,8 +35,9 @@ policy project is automatically created. Existing policies can also be
removed from the editor interface by selecting **Delete policy**
at the bottom of the editor.
-All scan execution policy changes are applied through a background job that runs once every 10
-minutes. Allow up to 10 minutes for any policy changes committed to this project to take effect.
+Most policy changes take effect as soon as the merge request is merged. Any changes that
+do not go through a merge request and are committed directly to the default branch may require up to 10 minutes
+before the policy changes take effect.
![Scan Execution Policy Editor YAML Mode](img/scan_execution_policy_yaml_mode_v14_7.png)
@@ -84,9 +85,31 @@ 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. |
-| `clusters` | `object` | | 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. |
+| `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 -->
-### `cluster` schema
+GitLab supports the following types of CRON syntax for the `cadence` field:
+
+- A daily cadence of once per hour at a specified hour, for example: `0 18 * * *`
+- A weekly cadence of once per week on a specified day and at a specified hour, for example: `0 13 * * 0`
+
+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).
@@ -97,6 +120,8 @@ Use this schema to define `clusters` objects in the [`schedule` rule type](#sche
| `namespaces` | `array` of `string` | | The namespace that is scanned (only the first value is currently supported). |
| `kinds` | `array` of `string` | `deployment`/`daemonset` | The resource kind that should be scanned (only the first value is currently supported). |
+<!--- end_remove -->
+
## `scan` action type
This action executes the selected `scan` with additional parameters when conditions for at least one
diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md
index d2cce207bfd..232a5c9f91c 100644
--- a/doc/user/application_security/policies/scan-result-policies.md
+++ b/doc/user/application_security/policies/scan-result-policies.md
@@ -9,7 +9,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
You can use scan result policies to take action based on scan results. For example, one type of scan
result policy is a security approval policy that allows approval to be required based on the
findings of one or more security scan jobs. Scan result policies are evaluated after a CI scanning
-job is fully executed.
+job is fully executed. The following video gives you an overview of GitLab scan result policies:
+
+<div class="video-fallback">
+ See the video: <a href="https://youtu.be/w5I9gcUgr9U">Overview of GitLab Scan Result Policies</a>.
+</div>
+<figure class="video-container">
+ <iframe src="https://www.youtube.com/embed/w5I9gcUgr9U" frameborder="0" allowfullscreen="true"> </iframe>
+</figure>
## Scan result policy editor
@@ -25,8 +32,9 @@ If a security policy project doesn't link to your project, GitLab creates such a
Existing policies can also be removed from the editor interface by selecting **Delete policy** at
the bottom of the editor.
-All scan result policy changes are applied through a background job that runs once every 10 minutes.
-Allow up to 10 minutes for any policy changes committed to this project to take effect.
+Most policy changes take effect as soon as the merge request is merged. Any changes that
+do not go through a merge request and are committed directly to the default branch may require up to 10 minutes
+before the policy changes take effect.
The [policy editor](index.md#policy-editor) supports YAML mode and rule mode.
@@ -61,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 | The branch the given policy applies to (supports wildcard). |
+| `branches` | `array` of `string` | `[]` or the branch's name | Protected branches for this rule to consider. |
| `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. |
diff --git a/doc/user/application_security/sast/analyzers.md b/doc/user/application_security/sast/analyzers.md
index 7529bf90ccf..661f564828a 100644
--- a/doc/user/application_security/sast/analyzers.md
+++ b/doc/user/application_security/sast/analyzers.md
@@ -4,20 +4,25 @@ 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
---
-# SAST Analyzers **(FREE)**
+# SAST analyzers **(FREE)**
> [Moved](https://gitlab.com/groups/gitlab-org/-/epics/2098) from GitLab Ultimate to GitLab Free in 13.3.
-SAST relies on underlying third party tools that are wrapped into what we call
-"Analyzers". An analyzer is a
-[dedicated project](https://gitlab.com/gitlab-org/security-products/analyzers)
-that wraps a particular tool to:
+Static Application Security Testing (SAST) uses analyzers
+to detect vulnerabilities in source code. Each analyzer is a wrapper around a [scanner](../terminology/#scanner), a third-party code analysis tool.
-- Expose its detection logic.
-- Handle its execution.
-- Convert its output to the common format.
+The analyzers are published as Docker images that SAST uses to launch dedicated containers for each
+analysis.
-This is achieved by implementing the [common API](https://gitlab.com/gitlab-org/security-products/analyzers/common).
+SAST default images are maintained by GitLab, but you can also integrate your own custom image.
+
+For each scanner, an analyzer:
+
+- Exposes its detection logic.
+- Handles its execution.
+- Converts its output to a [standard format](../terminology/#secure-report-format).
+
+## SAST analyzers
SAST supports the following official analyzers:
@@ -36,12 +41,6 @@ SAST supports the following official analyzers:
- [`sobelow`](https://gitlab.com/gitlab-org/security-products/analyzers/sobelow) (Sobelow (Elixir Phoenix))
- [`spotbugs`](https://gitlab.com/gitlab-org/security-products/analyzers/spotbugs) (SpotBugs with the Find Sec Bugs plugin (Ant, Gradle and wrapper, Grails, Maven and wrapper, SBT))
-The analyzers are published as Docker images that SAST uses to launch
-dedicated containers for each analysis.
-
-SAST is pre-configured with a set of **default images** that are maintained by
-GitLab, but users can also integrate their own **custom images**.
-
## SAST analyzer features
For an analyzer to be considered Generally Available, it is expected to minimally
@@ -55,34 +54,140 @@ support the following features:
- [Emits JSON report format](index.md#reports-json-format)
- [SELinux support](index.md#running-sast-in-selinux)
-## Official default analyzers
+## Post analyzers
+
+Post analyzers enrich the report output by an analyzer. A post analyzer doesn't modify report
+content directly. Instead, it enhances the results with additional properties, including:
+
+- CWEs.
+- Location tracking fields.
+- A means of identifying false positives or insignificant findings. **(ULTIMATE)**
+
+## Data provided by analyzers
+
+Each analyzer provides data about the vulnerabilities it detects. The following table details the
+data available from each analyzer. The values provided by these tools are heterogeneous so they are sometimes
+normalized into common values, for example, `severity` and `confidence`.
+
+| Property / tool | Apex | Bandit | Brakeman | ESLint security | SpotBugs | Flawfinder | Gosec | Kubesec Scanner | MobSF | NodeJsScan | PHP CS Security Audit | Security code Scan (.NET) | Semgrep | Sobelow |
+|--------------------------------|------|--------|----------|-----------------|----------|------------|-------|-----------------|-------|------------|-----------------------|---------------------------|---------|---------|
+| Affected item (for example, class or package) | ✓ | ✗ | ✓ | ✗ | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
+| Confidence | ✗ | ✓ | ✓ | ✗ | ✓ | x | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✓ |
+| Description | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ |
+| End column | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
+| End line | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
+| External ID (for example, CVE) | ✗ | ✗ | ⚠ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
+| File | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
+| Internal doc/explanation | ✓ | ⚠ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
+| Internal ID | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ |
+| Severity | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ⚠ | ✗ |
+| Solution | ✓ | ✗ | ✗ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
+| Source code extract | ✗ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
+| Start column | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ |
+| Start line | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
+| Title | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
+| URLs | ✓ | ✗ | ✓ | ✗ | ⚠ | ✗ | ⚠ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
+
+- ✓ => Data is available.
+- âš  => Data is available, but it's partially reliable, or it has to be extracted from unstructured content.
+- ✗ => Data is not available or it would require specific, inefficient or unreliable, logic to obtain it.
+
+## Transition to Semgrep-based scanning
+
+SAST includes a [Semgrep-based analyzer](https://gitlab.com/gitlab-org/security-products/analyzers/semgrep) that covers [multiple languages](index.md#supported-languages-and-frameworks).
+GitLab maintains the analyzer and writes detection rules for it.
+
+If you use the [GitLab-managed CI/CD template](index.md#configuration), the Semgrep-based analyzer operates alongside other language-specific analyzers.
+It runs with GitLab-managed detection rules that mimic the other analyzers' detection rules.
+Work to remove language-specific analyzers and replace them with the Semgrep-based analyzer is tracked in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/5245).
+
+You can choose to disable the other analyzers early and use Semgrep-based scanning for supported languages before the default behavior changes. If you do so:
+
+- You'll enjoy significantly faster scanning, reduced CI minutes usage, and more customizable scanning rules.
+- However, vulnerabilities previously reported by language-specific analyzers will be reported again under certain conditions, including if you've dismissed the vulnerabilities before. 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](../vulnerability_report/).
+
+### Vulnerability translation
+
+When you switch analyzers for a language, vulnerabilities may not match up.
+
+The Vulnerability Management system automatically moves vulnerabilities from the old analyzer to Semgrep for certain languages:
+
+- For C, a vulnerability is moved if it has only ever been detected by Flawfinder in pipelines where Semgrep also detected it. Semgrep coverage for C was introduced by default into the CI/CD template in GitLab 14.4 (October 2021).
+- For Go, a vulnerability is moved if it has only ever been detected by Gosec in pipelines where Semgrep also detected it. Semgrep coverage for Go was introduced by default into the CI/CD template in GitLab 14.2 (August 2021).
+- For JavaScript and TypeScript, a vulnerability is moved if it has only ever been detected by ESLint in pipelines where Semgrep also detected it. Semgrep coverage for these languages was introduced into the CI/CD template in GitLab 13.12 (May 2021).
+
+However, you'll see old vulnerabilities re-created based on Semgrep results if:
+
+- A vulnerability was created by Bandit or SpotBugs and you disable those analyzers. We only recommend disabling Bandit and SpotBugs now if the analyzers aren’t working. Work to automatically translate Bandit and SpotBugs vulnerabilities to Semgrep is tracked in [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/328062).
+- A vulnerability was created by ESLint, Gosec, or Flawfinder in a default-branch pipeline where Semgrep scanning did not run successfully (before Semgrep coverage was introduced for the language, because you disabled Semgrep explicitly, or because the Semgrep scan failed in that pipeline). We do not currently plan to combine these vulnerabilities if they already exist.
-Any custom change to the official analyzers can be achieved by using a
-[CI/CD variable in your `.gitlab-ci.yml`](index.md#available-cicd-variables).
+When a vulnerability is re-created, the original vulnerability is marked as “no longer detected†in the Vulnerability Report.
+A new vulnerability is then created based on the Semgrep finding.
-### Using a custom Docker mirror
+### Activating Semgrep-based scanning early
-You can switch to a custom Docker registry that provides the official analyzer
-images under a different prefix. For instance, the following instructs
-SAST to pull `my-docker-registry/gl-images/sast/bandit`
-instead of `registry.gitlab.com/security-products/sast/bandit`.
-In `.gitlab-ci.yml` define:
+You can choose to use Semgrep-based scanning instead of language-specific analyzers before the default behavior changes.
+
+We recommend taking this approach if any of these cases applies:
+
+- You haven't used SAST before on a project, so you don't already have SAST vulnerabilities in your [Vulnerability Report](../vulnerability_report/).
+- You're having trouble configuring one of the analyzers whose coverage overlaps with Semgrep-based coverage. For example, you might have trouble setting up the SpotBugs-based analyzer to compile your code.
+- You've already seen and dismissed vulnerabilities created by ESLint, Gosec, or Flawfinder scanning, and you've kept the re-created vulnerabilities created by Semgrep.
+
+You can make a separate choice for each of the language-specific analyzers, or you can disable them all.
+
+#### Activate Semgrep-based scanning
+
+To switch to Semgrep-based scanning early, you can:
+
+1. Create a merge request (MR) to set the [`SAST_EXCLUDED_ANALYZERS` CI/CD variable](#disable-specific-default-analyzers) to `"bandit,gosec,eslint"`.
+ - If you also want to disable SpotBugs scanning, add `spotbugs` to the list. We only recommend this for Java projects. SpotBugs is the only current analyzer that can scan Groovy, Kotlin, and Scala.
+ - If you also want to disable Flawfinder scanning, add `flawfinder` to the list. We only recommend this for C projects. Flawfinder is the only current analyzer that can scan C++.
+1. Verify that scanning jobs succeed in the MR. You'll notice findings from the removed analyzers in _Fixed_ and findings from Semgrep in _New_. (Some findings may show different names, descriptions, and severities, since GitLab manages and edits the Semgrep rulesets.)
+1. Merge the MR and wait for the default-branch pipeline to run.
+1. Use the Vulnerability Report to dismiss the findings that are no longer detected by the language-specific analyzers.
+
+## Customize analyzers
+
+Use [CI/CD variables](index.md#available-cicd-variables)
+in your `.gitlab-ci.yml` file to customize the behavior of your analyzers.
+
+### Use a custom Docker mirror
+
+You can use a custom Docker registry, instead of the GitLab registry, to host the analyzers' images.
+
+Prerequisites:
+
+- The custom Docker registry must provide images for all the official analyzers.
+
+NOTE:
+This variable affects all Secure analyzers, not just the analyzers for SAST.
+
+To have GitLab download the analyzers' images from a custom Docker registry, define the prefix with
+the `SECURE_ANALYZERS_PREFIX` CI/CD variable.
+
+For example, the following instructs SAST to pull `my-docker-registry/gitlab-images/bandit` instead
+of `registry.gitlab.com/security-products/bandit`:
```yaml
include:
- template: Security/SAST.gitlab-ci.yml
variables:
- SECURE_ANALYZERS_PREFIX: my-docker-registry/gl-images
+ SECURE_ANALYZERS_PREFIX: my-docker-registry/gitlab-images
```
-This configuration requires that your custom registry provides images for all
-the official analyzers.
+### Disable all default analyzers
-### Disabling all default analyzers
+You can disable all default SAST analyzers, leaving only [custom analyzers](#custom-analyzers)
+enabled.
-Setting `SAST_DISABLED` to `true` disables all the official
-default analyzers. In `.gitlab-ci.yml` define:
+To disable all default analyzers, set the CI/CD variable `SAST_DISABLED` to `true` in your
+`.gitlab-ci.yml` file.
+
+Example:
```yaml
include:
@@ -92,13 +197,15 @@ variables:
SAST_DISABLED: true
```
-That's needed when one totally relies on [custom analyzers](#custom-analyzers).
+### Disable specific default analyzers
+
+Analyzers are run automatically according to the
+source code languages detected. However, you can disable select analyzers.
-### Disabling specific default analyzers
+To disable select analyzers, set the CI/CD variable `SAST_EXCLUDED_ANALYZERS` to a comma-delimited
+string listing the analyzers that you want to prevent running.
-Set `SAST_EXCLUDED_ANALYZERS` to a comma-delimited string that includes the official
-default analyzers that you want to avoid running. In `.gitlab-ci.yml` define the
-following to prevent the `eslint` analyzer from running:
+For example, to disable the `eslint` analyzer:
```yaml
include:
@@ -108,27 +215,21 @@ variables:
SAST_EXCLUDED_ANALYZERS: "eslint"
```
-## Post Analyzers **(ULTIMATE)**
+### Custom analyzers
-While analyzers are thin wrappers for executing scanners, post analyzers work to
-enrich the data generated within our reports.
+You can provide your own analyzers by defining jobs in your CI/CD configuration. For
+consistency with the default analyzers, you should add the suffix `-sast` to your custom
+SAST jobs.
-GitLab SAST post analyzers never modify report contents directly but work by
-augmenting results with additional properties (such as CWEs), location tracking fields,
-and a means of identifying false positives or insignificant findings.
+For more details on integrating a custom security scanner into GitLab, see [Security Scanner Integration](../../../development/integrations/secure.md).
-The implementation of post analyzers is determined by feature availability tiers, where
-simple data enrichment may occur within our free tier and most advanced processing is split
-into separate binaries or pipeline jobs.
+#### Example custom analyzer
-## Custom Analyzers
+This example shows how to add a scanning job that's based on the Docker image
+`my-docker-registry/analyzers/csharp`. It runs the script `/analyzer run` and outputs a SAST report
+`gl-sast-report.json`.
-You can provide your own analyzers by
-defining CI jobs in your CI configuration. For consistency, you should suffix your custom
-SAST jobs with `-sast`. Here's how to add a scanning job that's based on the
-Docker image `my-docker-registry/analyzers/csharp` and generates a SAST report
-`gl-sast-report.json` when `/analyzer run` is executed. Define the following in
-`.gitlab-ci.yml`:
+Define the following in your `.gitlab-ci.yml` file:
```yaml
csharp-sast:
@@ -140,33 +241,3 @@ csharp-sast:
reports:
sast: gl-sast-report.json
```
-
-The [Security Scanner Integration](../../../development/integrations/secure.md) documentation explains how to integrate custom security scanners into GitLab.
-
-## Analyzers Data
-
-| Property / Tool | Apex | Bandit | Brakeman | ESLint security | SpotBugs | Flawfinder | Gosec | Kubesec Scanner | MobSF | NodeJsScan | PHP CS Security Audit | Security code Scan (.NET) | Semgrep | Sobelow |
-|--------------------------------|------|--------|----------|-----------------|----------|------------|-------|-----------------|-------|------------|-----------------------|---------------------------|---------|---------|
-| Affected item (for example, class or package) | ✓ | ✗ | ✓ | ✗ | ✓ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
-| Confidence | ✗ | ✓ | ✓ | ✗ | ✓ | x | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✓ |
-| Description | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ |
-| End column | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
-| End line | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
-| External ID (for example, CVE) | ✗ | ✗ | ⚠ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
-| File | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
-| Internal doc/explanation | ✓ | ⚠ | ✓ | ✗ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
-| Internal ID | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ |
-| Severity | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ⚠ | ✗ |
-| Solution | ✓ | ✗ | ✗ | ✗ | ⚠ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ⚠ | ✗ |
-| Source code extract | ✗ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
-| Start column | ✓ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✗ |
-| Start line | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
-| Title | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
-| URLs | ✓ | ✗ | ✓ | ✗ | ⚠ | ✗ | ⚠ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
-
-- ✓ => we have that data
-- âš  => we have that data but it's partially reliable, or we need to extract it from unstructured content
-- ✗ => we don't have that data or it would need to develop specific or inefficient/unreliable logic to obtain it.
-
-The values provided by these tools are heterogeneous so they are sometimes
-normalized into common values (for example, `severity`, `confidence`, and so on).
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 8f006f258b6..38f26b7578d 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -13,12 +13,17 @@ The whitepaper ["A Seismic Shift in Application Security"](https://about.gitlab.
explains how 4 of the top 6 attacks were application based. Download it to learn how to protect your
organization.
-If you're using [GitLab CI/CD](../../../ci/index.md), you can use Static Application Security
-Testing (SAST) to check your source code for known vulnerabilities.
-If the pipeline is associated with a merge request, the SAST analysis is compared with the results of
-the target branch's analysis (if available). The results of that comparison are shown in the merge
-request. If the pipeline is running from the default branch, the results of the SAST
-analysis are available in the [security dashboards](../security_dashboard/index.md).
+If you’re using [GitLab CI/CD](../../../ci/index.md), you can use Static Application Security
+Testing (SAST) to check your source code for known vulnerabilities. You can run SAST analyzers in
+any GitLab tier. The analyzers output JSON-formatted reports as job artifacts.
+
+With GitLab Ultimate, SAST results are also processed so you can:
+
+- See them in merge requests.
+- Use them in approval workflows.
+- Review them in the security dashboard.
+
+For more details, see the [Summary of features per tier](#summary-of-features-per-tier).
![SAST results shown in the MR widget](img/sast_results_in_mr_v14_0.png)
@@ -543,7 +548,7 @@ Several passthrouh types generate a configuration for the target analyzer:
- Two `git` passthrough sections pull the head of branch
`refs/remotes/origin/test` from the `myrules` Git repository, and revision
- `97f7686` from the `sast-rules` Git repostory. From the `sast-rules` Git
+ `97f7686` from the `sast-rules` Git repository. From the `sast-rules` Git
repository, only data from the `go` subdirectory is considered.
- The `sast-rules` entry has a higher precedence because it appears later in
the configuration.
@@ -887,7 +892,7 @@ Some analyzers can be customized with CI/CD variables.
| `GRADLE_PATH` | SpotBugs | Path to the `gradle` executable. |
| `JAVA_OPTS` | SpotBugs | Additional arguments for the `java` executable. |
| `JAVA_PATH` | SpotBugs | Path to the `java` executable. |
-| `SAST_JAVA_VERSION` | SpotBugs | Which Java version to use. Supported versions are `8` and `11`. Defaults to `8`. |
+| `SAST_JAVA_VERSION` | SpotBugs | Which Java version to use. [Starting in GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/352549), supported versions are `11` and `17` (default). Before GitLab 15.0, supported versions are `8` (default) and `11`. |
| `MAVEN_CLI_OPTS` | SpotBugs | Additional arguments for the `mvn` or `mvnw` executable. |
| `MAVEN_PATH` | SpotBugs | Path to the `mvn` executable. |
| `MAVEN_REPO_PATH` | SpotBugs | Path to the Maven local repository (shortcut for the `maven.repo.local` property). |
@@ -977,19 +982,19 @@ import the following default SAST analyzer images from `registry.gitlab.com` int
[local Docker container registry](../../packages/container_registry/index.md):
```plaintext
-registry.gitlab.com/security-products/sast/bandit:2
-registry.gitlab.com/security-products/sast/brakeman:2
-registry.gitlab.com/security-products/sast/eslint:2
-registry.gitlab.com/security-products/sast/flawfinder:2
-registry.gitlab.com/security-products/sast/gosec:3
-registry.gitlab.com/security-products/sast/kubesec:2
-registry.gitlab.com/security-products/sast/nodejs-scan:2
-registry.gitlab.com/security-products/sast/phpcs-security-audit:2
-registry.gitlab.com/security-products/sast/pmd-apex:2
-registry.gitlab.com/security-products/sast/security-code-scan:2
-registry.gitlab.com/security-products/sast/semgrep:2
-registry.gitlab.com/security-products/sast/sobelow:2
-registry.gitlab.com/security-products/sast/spotbugs:2
+registry.gitlab.com/security-products/bandit:2
+registry.gitlab.com/security-products/brakeman:2
+registry.gitlab.com/security-products/eslint:2
+registry.gitlab.com/security-products/flawfinder:2
+registry.gitlab.com/security-products/gosec:3
+registry.gitlab.com/security-products/kubesec:2
+registry.gitlab.com/security-products/nodejs-scan:2
+registry.gitlab.com/security-products/phpcs-security-audit:2
+registry.gitlab.com/security-products/pmd-apex:2
+registry.gitlab.com/security-products/security-code-scan:2
+registry.gitlab.com/security-products/semgrep:2
+registry.gitlab.com/security-products/sobelow:2
+registry.gitlab.com/security-products/spotbugs:2
```
The process for importing Docker images into a local offline Docker registry depends on
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index 0a18e7d5f45..3937cbd77b6 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -195,13 +195,18 @@ Secret Detection can be customized by defining available CI/CD variables:
| CI/CD variable | Default value | Description |
|-----------------------------------|---------------|-------------|
-| `SECRET_DETECTION_COMMIT_FROM` | - | The commit a Gitleaks scan starts at. [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. Replaced with `SECRET_DETECTION_COMMITS`. |
-| `SECRET_DETECTION_COMMIT_TO` | - | The commit a Gitleaks scan ends at. [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. Replaced with `SECRET_DETECTION_COMMITS`. |
-| `SECRET_DETECTION_COMMITS` | - | The list of commits that Gitleaks should scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. |
| `SECRET_DETECTION_EXCLUDED_PATHS` | "" | Exclude vulnerabilities from output based on the paths. This is a comma-separated list of patterns. Patterns can be globs, or file or folder paths (for example, `doc,spec` ). Parent directories also match patterns. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225273) in GitLab 13.3. |
| `SECRET_DETECTION_HISTORIC_SCAN` | false | Flag to enable a historic Gitleaks scan. |
| `SECRET_DETECTION_IMAGE_SUFFIX` | Suffix added to the image name. If set to `-fips`, `FIPS-enabled` images are used for scan. See [FIPS-enabled images](#fips-enabled-images) for more details. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/355519) in GitLab 14.10. |
+In previous GitLab versions, the following variables were also available:
+
+| CI/CD variable | Default value | Description |
+|-----------------------------------|---------------|-------------|
+| `SECRET_DETECTION_COMMIT_FROM` | - | The commit a Gitleaks scan starts at. [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. Replaced with `SECRET_DETECTION_COMMITS`. |
+| `SECRET_DETECTION_COMMIT_TO` | - | The commit a Gitleaks scan ends at. [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. Replaced with `SECRET_DETECTION_COMMITS`. |
+| `SECRET_DETECTION_COMMITS` | - | The list of commits that Gitleaks should scan. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243564) in GitLab 13.5. [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/352565) in GitLab 15.0. |
+
### Custom rulesets **(ULTIMATE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/211387) in GitLab 13.5.
diff --git a/doc/user/application_security/secret_detection/post_processing.md b/doc/user/application_security/secret_detection/post_processing.md
index 643da47d876..9771658da4e 100644
--- a/doc/user/application_security/secret_detection/post_processing.md
+++ b/doc/user/application_security/secret_detection/post_processing.md
@@ -46,7 +46,7 @@ sequenceDiagram
Cloud Vendor-->>+RevocationAPI: ACCEPTED
```
-## Integrate your cloud provider service with GitLab Saas
+## Integrate your cloud provider service with GitLab SaaS
Third party cloud and SaaS providers can [express integration interest by filling out this form](https://forms.gle/wWpvrtLRK21Q2WJL9).
diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md
index 488ec336646..577606885ca 100644
--- a/doc/user/application_security/security_dashboard/index.md
+++ b/doc/user/application_security/security_dashboard/index.md
@@ -17,6 +17,7 @@ To use the Security Dashboards, you must:
- Configure jobs to use the [`reports` syntax](../../../ci/yaml/index.md#artifactsreports).
- Use [GitLab Runner](https://docs.gitlab.com/runner/) 11.5 or later. If you use the
shared runners on GitLab.com, you are using the correct version.
+- Have the [correct role](../../permissions.md) for the project or group.
## When Security Dashboards are updated
diff --git a/doc/user/application_security/threat_monitoring/img/threat_monitoring_policy_alert_list_v14_3.png b/doc/user/application_security/threat_monitoring/img/threat_monitoring_policy_alert_list_v14_3.png
deleted file mode 100644
index a11a7fafc4a..00000000000
--- a/doc/user/application_security/threat_monitoring/img/threat_monitoring_policy_alert_list_v14_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/application_security/threat_monitoring/index.md b/doc/user/application_security/threat_monitoring/index.md
deleted file mode 100644
index 9b8dd2825ea..00000000000
--- a/doc/user/application_security/threat_monitoring/index.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-type: reference, howto
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Threat Monitoring **(ULTIMATE)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14707) in GitLab 12.9.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Threat Monitoring is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-The **Threat Monitoring** page provides alerts and metrics
-for the GitLab application runtime security features. You can access
-these by navigating to your project's **Security & Compliance > Threat
-Monitoring** page.
-
-GitLab supports statistics for the following security features:
-
-- [Container Network Policies](../../../topics/autodevops/stages.md#network-policy)
-
-## Container Network Policy Alert list
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3438) in GitLab 13.9.
-
-The policy alert list displays your policy's alert activity. You can sort the list by these columns:
-
-- Date and time
-- Events
-- Status
-
-You can filter the list with the **Policy Name** filter and the **Status** filter at the top. Use
-the selector menu in the **Status** column to set the status for each alert:
-
-- Unreviewed
-- In review
-- Resolved
-- Dismissed
-
-By default, the list doesn't display resolved or dismissed alerts.
-
-![Policy Alert List](img/threat_monitoring_policy_alert_list_v14_3.png)
-
-Clicking an alert's row opens the alert drawer, which shows more information about the alert. A user
-can also create an incident from the alert and update the alert status in the alert drawer.
-
-Clicking an alert's name takes the user to the [alert details page](../../../operations/incident_management/alerts.md#alert-details-page).
diff --git a/doc/user/application_security/vulnerabilities/index.md b/doc/user/application_security/vulnerabilities/index.md
index 18b99e06299..87344e4ff65 100644
--- a/doc/user/application_security/vulnerabilities/index.md
+++ b/doc/user/application_security/vulnerabilities/index.md
@@ -42,7 +42,7 @@ A vulnerability's status can be one of the following:
| Dismissed | A user has seen this vulnerability and dismissed it because it is not accurate or otherwise not to be resolved. |
| Resolved | The vulnerability has been fixed or is no longer present. |
-Dismissed vulnerabilities are ignored if detected in subsequent scans. Resolved vulnerabilities that are reintroduced and detected by subsequent scans have a _new_ vulnerability record created. When an existing vulnerability is no longer detected in a project's `default` branch, you should change its status to Resolved. This ensures that if it is accidentally reintroduced in a future merge, it will be visible again as a new record. You can use the [Activity filter](../vulnerability_report/#activity-filter) to select all vulnerabilities that are no longer detected, and [change their status](../vulnerability_report#change-status-of-multiple-vulnerabilities).
+Dismissed vulnerabilities are ignored if detected in subsequent scans. Resolved vulnerabilities that are reintroduced and detected by subsequent scans have a _new_ vulnerability record created. When an existing vulnerability is no longer detected in a project's `default` branch, you should change its status to Resolved. This ensures that if it is accidentally reintroduced in a future merge, it will be visible again as a new record. You can use the [Activity filter](../vulnerability_report/#activity-filter) to select all vulnerabilities that are no longer detected, and [change their status](../vulnerability_report#change-status-of-vulnerabilities).
## Change vulnerability status
diff --git a/doc/user/application_security/vulnerabilities/severities.md b/doc/user/application_security/vulnerabilities/severities.md
index 89464064ea3..967a6d9fa89 100644
--- a/doc/user/application_security/vulnerabilities/severities.md
+++ b/doc/user/application_security/vulnerabilities/severities.md
@@ -56,8 +56,6 @@ the following tables:
| GitLab analyzer | Outputs severity levels? | Native severity level type | Native severity level example |
|------------------------------------------------------------------------------------------|------------------------------|----------------------------|-------------------------------------|
-| [`bundler-audit`](https://gitlab.com/gitlab-org/security-products/analyzers/bundler-audit) | **{check-circle}** Yes | String | `low`, `medium`, `high`, `critical` |
-| [`retire.js`](https://gitlab.com/gitlab-org/security-products/analyzers/retire.js) | **{check-circle}** Yes | String | `low`, `medium`, `high`, `critical` |
| [`gemnasium`](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) | **{check-circle}** Yes | CVSS v2.0 Rating and CVSS v3.1 Qualitative Severity Rating | `(AV:N/AC:L/Au:S/C:P/I:P/A:N)`, `CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H` |
## Container Scanning
diff --git a/doc/user/application_security/vulnerability_report/index.md b/doc/user/application_security/vulnerability_report/index.md
index a9cef15e3e8..e499ddbbd6b 100644
--- a/doc/user/application_security/vulnerability_report/index.md
+++ b/doc/user/application_security/vulnerability_report/index.md
@@ -11,7 +11,7 @@ The Vulnerability Report provides information about vulnerabilities from scans o
The scan results from a pipeline are only ingested after all the jobs in the pipeline complete. Partial results for a pipeline with jobs in progress can be seen in the pipeline security tab.
-The report is available for projects, groups, and the Security Center.
+The report is available for users with the [correct role](../../permissions.md) on projects, groups, and the Security Center.
At all levels, the Vulnerability Report contains:
@@ -34,13 +34,18 @@ in that row:
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/6165) in GitLab 11.1.
-The project-level Vulnerability Report also contains:
+At the project level, the Vulnerability Report also contains:
- A time stamp showing when it was updated, including a link to the latest pipeline.
- The number of failures that occurred in the most recent pipeline. Select the failure
notification to view the **Failed jobs** tab of the pipeline's page.
-To access the report, navigate to **Security & Compliance > Vulnerability Report**.
+### View the project-level vulnerability report
+
+To view the project-level vulnerability report:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Security & Compliance > Vulnerability report**.
## Vulnerability Report actions
@@ -56,17 +61,22 @@ From the Vulnerability Report you can:
## Vulnerability Report filters
-You can filter the vulnerabilities table by:
+You can filter the Vulnerability Report to narrow focus on only vulnerabilities matching specific
+criteria.
+
+The available filters are:
<!-- vale gitlab.SubstitutionWarning = NO -->
-| Filter | Available options |
-|:---------|:------------------|
-| Status | Detected, Confirmed, Dismissed, Resolved. |
-| Severity | Critical, High, Medium, Low, Info, Unknown. |
-| Tool | For more details, see [Tool filter](#tool-filter). |
-| Project | For more details, see [Project filter](#project-filter). |
-| Activity | For more details, see [Activity filter](#activity-filter). |
+- **Status**: Detected, Confirmed, Dismissed, Resolved.
+- **Severity**: Critical, High, Medium, Low, Info, Unknown.
+- **Tool**: For more details, see [Tool filter](#tool-filter).
+- **Project**: For more details, see [Project filter](#project-filter).
+- **Activity**: For more details, see [Activity filter](#activity-filter).
+
+The filters' criteria are combined to show only vulnerabilities matching all criteria.
+An exception to this behavior is the Activity filter. For more details about how it works, see
+[Activity filter](#activity-filter).
<!-- vale gitlab.SubstitutionWarning = YES -->
@@ -75,7 +85,7 @@ You can filter the vulnerabilities table by:
To filter the list of vulnerabilities:
1. Select a filter.
-1. Select values from the dropdown.
+1. Select values from the dropdown list.
1. Repeat the above steps for each desired filter.
After each filter is selected:
@@ -83,11 +93,9 @@ After each filter is selected:
- The list of matching vulnerabilities is updated.
- The vulnerability severity totals are updated.
-The filters' criteria are combined to show only vulnerabilities matching all criteria.
-An exception to this behavior is the Activity filter. For more details about how it works, see
-[Activity filter](#activity-filter).
+### Tool filter
-## Tool filter
+> The third-party tool filter was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229661) in GitLab 13.12.
The tool filter allows you to focus on vulnerabilities detected by selected tools.
@@ -95,7 +103,7 @@ When using the tool filter, you can choose:
- **All tools** (default).
- Individual GitLab-provided tools.
-- Any integrated 3rd-party tool. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229661) in GitLab 13.12.
+- Any integrated third-party tool.
For details of each of the available tools, see [Security scanning tools](../index.md#security-scanning-tools).
@@ -103,11 +111,9 @@ For details of each of the available tools, see [Security scanning tools](../ind
The content of the Project filter depends on the current level:
-| Level | Content of the Project filter |
-|:---------------|:------------------------------|
-| Security Center | Only projects you've [added to your personal Security Center](../security_dashboard/index.md#add-projects-to-the-security-center). |
-| Group level | All projects in the group. |
-| Project level | Not applicable. |
+- **Security Center**: Only projects you've [added to your personal Security Center](../security_dashboard/index.md#add-projects-to-the-security-center).
+- **Group level**: All projects in the group.
+- **Project level**: Not applicable.
### Activity filter
@@ -119,13 +125,11 @@ all options can be selected in combination.
Selection behavior when using the Activity filter:
-| Activity selection | Results displayed |
-|:------------------------------------|:------------------|
-| All | Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this deselects any other Activity filter options. |
-| No activity | Only vulnerabilities without either an associated Issue or that are no longer detected. Selecting this deselects any other Activity filter options. |
-| With issues | Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected. |
-| No longer detected | Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues. |
-| With issues and No longer detected | Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch. |
+- **All**: Vulnerabilities with any Activity status (same as ignoring this filter). Selecting this deselects any other Activity filter options.
+- **No activity**: Only vulnerabilities without either an associated issue or that are no longer detected. Selecting this deselects any other Activity filter options.
+- **With issues**: Only vulnerabilities with one or more associated issues. Does not include vulnerabilities that also are no longer detected.
+- **No longer detected**: Only vulnerabilities that are no longer detected in the latest pipeline scan of the `default` branch. Does not include vulnerabilities with one or more associated issues.
+- **With issues** and **No longer detected**: Only vulnerabilities that have one or more associated issues and also are no longer detected in the latest pipeline scan of the `default` branch.
## View details of a vulnerability
@@ -155,23 +159,32 @@ If Jira issue support is enabled, the issue link found in the Activity entry lin
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292636) in GitLab 13.10, all statuses became selectable.
+From the Vulnerability Report you can change the status of one or more vulnerabilities.
+
To change the status of vulnerabilities in the table:
-1. Select the checkbox for each vulnerability you want to update the status of.
-1. In the dropdown that appears select the desired status, then select **Change status**.
+1. Select the checkbox beside each vulnerability you want to update the status of. To select all,
+ select the checkbox in the table header.
+1. In the **Set status** dropdown list, select the desired status.
+1. Select **Change status**.
![Project Vulnerability Report](img/project_security_dashboard_status_change_v14_2.png)
-### Change status of multiple vulnerabilities
+## Dismissing a vulnerability
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35816) in GitLab 12.9.
+When you evaluate a vulnerability and decide it requires no more action, you can mark it
+as **Dismissed**. Dismissed vulnerabilities don't appear in the merge request security widget
+when detected in future scans.
-You can change the status of multiple vulnerabilities at once:
+When a vulnerability is dismissed, a record is made of:
-1. In the list of vulnerabilities, select the checkbox for each vulnerability you want to update.
- To select all, select the checkbox in the table header.
-1. Above the table, select a new status.
-1. Click **Change status** to save.
+- Who dismissed it.
+- Date and time when it was dismissed.
+- Optionally, a reason why it was dismissed.
+
+Vulnerability records cannot be deleted, so a permanent record always remains.
+
+If a vulnerability is dismissed in error, reverse the dismissal by changing its status.
## Export vulnerability details
@@ -190,13 +203,19 @@ Fields included are:
- Scanner name
- Status
- Vulnerability
-- Details
+- Basic details
- Additional information
- Severity
- [CVE](https://cve.mitre.org/) (Common Vulnerabilities and Exposures)
- [CWE](https://cwe.mitre.org/) (Common Weakness Enumeration)
- Other identifiers
+NOTE:
+Full details are available through our
+[Job Artifacts API](../../../api/job_artifacts.md#download-a-single-artifact-file-from-specific-tag-or-branch).
+Use one of the `gl-*-report.json` report filenames in place of `*artifact_path`
+to obtain, for example, the path of files in which vulnerabilities were detected.
+
### Export details in CSV format
To export details of all vulnerabilities listed in the Vulnerability Report, select **Export**.
@@ -224,6 +243,7 @@ To undo this action, select a different status from the same menu.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/301003) in GitLab 14.9. Disabled by default.
> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/353796) in GitLab 14.10.
+> - [Feature flag `new_vulnerability_form`](https://gitlab.com/gitlab-org/gitlab/-/issues/359049) removed in GitLab 15.0.
To add a new vulnerability finding from your project level Vulnerability Report page:
diff --git a/doc/user/clusters/agent/ci_cd_tunnel.md b/doc/user/clusters/agent/ci_cd_tunnel.md
index c15041f6b0d..1b99fcf9739 100644
--- a/doc/user/clusters/agent/ci_cd_tunnel.md
+++ b/doc/user/clusters/agent/ci_cd_tunnel.md
@@ -1,261 +1,11 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'ci_cd_workflow.md'
+remove_date: '2022-07-20'
---
-# Using a GitLab CI/CD workflow for Kubernetes **(FREE)**
+This document was moved to [another location](ci_cd_workflow.md).
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327409) in GitLab 14.1.
-> - The pre-configured `KUBECONFIG` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) in GitLab 14.2.
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) the `ci_access` attribute in GitLab 14.3.
-> - The ability to authorize groups was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
-> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/6290) to GitLab Free in 14.5.
-> - Support for Omnibus installations was [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5686) in GitLab 14.5.
-> - The ability to switch between certificate-based clusters and agents was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335089) in GitLab 14.9. The certificate-based cluster context is always called `gitlab-deploy`.
-
-You can use a GitLab CI/CD workflow to safely deploy to and update your Kubernetes clusters.
-
-To do so, you must first [install an agent in your cluster](install/index.md). When done, you have a Kubernetes context and can
-run Kubernetes API commands in your GitLab CI/CD pipeline.
-
-To ensure access to your cluster is safe:
-
-- Each agent has a separate context (`kubecontext`).
-- Only the project where the agent is configured, and any additional projects you authorize, can access the agent in your cluster.
-
-You do not need to have a runner in the cluster with the agent.
-
-## GitLab CI/CD workflow steps
-
-To update a Kubernetes cluster by using GitLab CI/CD, complete the following steps.
-
-1. Ensure you have a working Kubernetes cluster and the manifests are in a GitLab project.
-1. In the same GitLab project, [register and install the GitLab agent](install/index.md).
-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.
-
-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. [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.
-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).
-
-### Authorize the agent to access your projects
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327850) in GitLab 14.4.
-
-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. Edit the file. Under the `ci_access` keyword, add the `projects` attribute.
-1. For the `id`, add the path:
-
- ```yaml
- ci_access:
- projects:
- - id: path/to/project
- ```
-
- - The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
- - You can install additional agents into the same cluster to accommodate additional hierarchies.
- - You can authorize up to 100 projects.
-
-All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
-Choose the context to run `kubectl` commands from your CI/CD scripts.
-
-### Authorize the agent to access projects in your groups
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
-
-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. Edit the file. Under the `ci_access` keyword, add the `groups` attribute.
-1. For the `id`, add the path:
-
- ```yaml
- ci_access:
- groups:
- - id: path/to/group/subgroup
- ```
-
- - The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
- - You can install additional agents into the same cluster to accommodate additional hierarchies.
- - All of the subgroups of an authorized group also have access to the same agent (without being specified individually).
- - You can authorize up to 100 groups.
-
-All the projects that belong to the group and its subgroups are now authorized to access the agent.
-All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
-Choose the context to run `kubectl` commands from your CI/CD scripts.
-
-## Update your `.gitlab-ci.yml` file to run `kubectl` commands
-
-In the project where you want to run Kubernetes commands, edit your project's `.gitlab-ci.yml` file.
-
-In the first command under the `script` keyword, set your agent's context.
-Use the format `path/to/agent/repository:agent-name`. For example:
-
-```yaml
- deploy:
- image:
- name: bitnami/kubectl:latest
- entrypoint: [""]
- script:
- - kubectl config get-contexts
- - kubectl config use-context path/to/agent/repository:agent-name
- - kubectl get pods
-```
-
-If you are not sure what your agent's context is, open a terminal and connect to your cluster.
-Run `kubectl config get-contexts`.
-
-### Environments with both certificate-based and agent-based connections
-
-When you deploy to an environment that has both a [certificate-based
-cluster](../../infrastructure/clusters/index.md) (deprecated) and an agent connection:
-
-- The certificate-based cluster's context is called `gitlab-deploy`. This context
- is always selected by default.
-- In GitLab 14.9 and later, agent contexts are included in the
- `KUBECONFIG`. You can select them by using `kubectl config use-context
- path/to/agent/repository:agent-name`.
-- In GitLab 14.8 and earlier, you can still use agent connections, but for environments that
- already have a certificate-based cluster, the agent connections are not included in the `KUBECONFIG`.
-
-To use an agent connection when certificate-based connections are present, you can manually configure a new `kubectl`
-configuration context. For example:
-
- ```yaml
- deploy:
- variables:
- KUBE_CONTEXT: my-context # The name to use for the new context
- AGENT_ID: 1234 # replace with your agent's numeric ID
- K8S_PROXY_URL: wss://kas.gitlab.com/k8s-proxy/ # replace with your agent server (KAS) Kubernetes proxy URL
- # ... any other variables you have configured
- before_script:
- - kubectl config set-credentials agent:$AGENT_ID --token="ci:${AGENT_ID}:${CI_JOB_TOKEN}"
- - kubectl config set-cluster gitlab --server="${K8S_PROXY_URL}"
- - kubectl config set-context "$KUBE_CONTEXT" --cluster=gitlab --user="agent:${AGENT_ID}"
- - kubectl config use-context "$KUBE_CONTEXT"
- # ... rest of your job configuration
- ```
-
-## Use impersonation to restrict project and group access **(PREMIUM)**
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345014) in GitLab 14.5.
-
-By default, your CI/CD job inherits all the permissions from the service account used to install the
-agent in the cluster.
-To restrict access to your cluster, you can use [impersonation](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation).
-
-To specify impersonations, use the `access_as` attribute in your agent configuration file and use Kubernetes RBAC rules to manage impersonated account permissions.
-
-You can impersonate:
-
-- The agent itself (default).
-- The CI/CD job that accesses the cluster.
-- A specific user or system account defined within the cluster.
-
-### Impersonate the agent
-
-The agent is impersonated by default. You don't need to do anything to impersonate it.
-
-### Impersonate the CI/CD job that accesses the cluster
-
-To impersonate the CI/CD job that accesses the cluster, under the `access_as` key, add the `ci_job: {}` key-value.
-
-When the agent makes the request to the actual Kubernetes API, it sets the
-impersonation credentials in the following way:
-
-- `UserName` is set to `gitlab:ci_job:<job id>`. Example: `gitlab:ci_job:1074499489`.
-- `Groups` is set to:
- - `gitlab:ci_job` to identify all requests coming from CI jobs.
- - The list of IDs of groups the project is in.
- - The project ID.
- - The slug of the environment this job belongs to.
-
- Example: for a CI job in `group1/group1-1/project1` where:
-
- - Group `group1` has ID 23.
- - Group `group1/group1-1` has ID 25.
- - Project `group1/group1-1/project1` has ID 150.
- - Job running in a prod environment.
-
- Group list would be `[gitlab:ci_job, gitlab:group:23, gitlab:group:25, gitlab:project:150, gitlab:project_env:150:prod]`.
-
-- `Extra` carries extra information about the request. The following properties are set on the impersonated identity:
-
-| Property | Description |
-| -------- | ----------- |
-| `agent.gitlab.com/id` | Contains the agent ID. |
-| `agent.gitlab.com/config_project_id` | Contains the agent's configuration project ID. |
-| `agent.gitlab.com/project_id` | Contains the CI project ID. |
-| `agent.gitlab.com/ci_pipeline_id` | Contains the CI pipeline ID. |
-| `agent.gitlab.com/ci_job_id` | Contains the CI job ID. |
-| `agent.gitlab.com/username` | Contains the username of the user the CI job is running as. |
-| `agent.gitlab.com/environment_slug` | Contains the slug of the environment. Only set if running in an environment. |
-
-Example to restrict access by the CI/CD job's identity:
-
-```yaml
-ci_access:
- projects:
- - id: path/to/project
- access_as:
- ci_job: {}
-```
-
-### Impersonate a static identity
-
-For a given connection, you can use a static identity for the impersonation.
-
-Under the `access_as` key, add the `impersonate` key to make the request using the provided identity.
-
-The identity can be specified with the following keys:
-
-- `username` (required)
-- `uid`
-- `groups`
-- `extra`
-
-See the [official Kubernetes documentation for details](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation).
-
-## Troubleshooting
-
-### `kubectl` commands not supported
-
-The commands `kubectl exec`, `kubectl cp`, and `kubectl attach` are not supported.
-Anything that uses these API endpoints does not work, because they use the deprecated
-SPDY protocol.
-[An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/346248) to add support for these commands.
-
-### Grant write permissions to `~/.kube/cache`
-
-Tools like `kubectl`, Helm, `kpt`, and `kustomize` cache information about
-the cluster in `~/.kube/cache`. If this directory is not writable, the tool fetches information on each invocation,
-making interactions slower and creating unnecessary load on the cluster. For the best experience, in the
-image you use in your .`gitlab-ci.yml` file, ensure this directory is writable.
-
-### Enable TLS
-
-If you are on a self-managed GitLab instance, ensure your instance is configured with Transport Layer Security (TLS).
-
-If you attempt to use `kubectl` without TLS, you might get an error like:
-
-```shell
-$ kubectl get pods
-error: You must be logged in to the server (the server has asked for the client to provide credentials)
-```
+<!-- This redirect file can be deleted after <2022-07-20>. -->
+<!-- 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/user/clusters/agent/ci_cd_workflow.md b/doc/user/clusters/agent/ci_cd_workflow.md
new file mode 100644
index 00000000000..644a753e282
--- /dev/null
+++ b/doc/user/clusters/agent/ci_cd_workflow.md
@@ -0,0 +1,263 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Using GitLab CI/CD with a Kubernetes cluster **(FREE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327409) in GitLab 14.1.
+> - The pre-configured `KUBECONFIG` was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/324275) in GitLab 14.2.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) the `ci_access` attribute in GitLab 14.3.
+> - The ability to authorize groups was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
+> - [Moved](https://gitlab.com/groups/gitlab-org/-/epics/6290) to GitLab Free in 14.5.
+> - Support for Omnibus installations was [introduced](https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/5686) in GitLab 14.5.
+> - The ability to switch between certificate-based clusters and agents was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335089) in GitLab 14.9. The certificate-based cluster context is always called `gitlab-deploy`.
+> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80508) from _CI/CD tunnel_ to _CI/CD workflow_ in GitLab 14.9.
+
+You can use a GitLab CI/CD workflow to safely deploy to and update your Kubernetes clusters.
+
+To do so, you must first [install an agent in your cluster](install/index.md). When done, you have a Kubernetes context and can
+run Kubernetes API commands in your GitLab CI/CD pipeline.
+
+To ensure access to your cluster is safe:
+
+- Each agent has a separate context (`kubecontext`).
+- Only the project where the agent is configured, and any additional projects you authorize, can access the agent in your cluster.
+
+You do not need to have a runner in the cluster with the agent.
+
+## GitLab CI/CD workflow steps
+
+To update a Kubernetes cluster by using GitLab CI/CD, complete the following steps.
+
+1. Ensure you have a working Kubernetes cluster and the manifests are in a GitLab project.
+1. In the same GitLab project, [register and install the GitLab agent](install/index.md).
+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.
+
+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. [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.
+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).
+
+### Authorize the agent to access your projects
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327850) in GitLab 14.4.
+
+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. Edit the `config.yaml` file. Under the `ci_access` keyword, add the `projects` attribute.
+1. For the `id`, add the path:
+
+ ```yaml
+ ci_access:
+ projects:
+ - id: path/to/project
+ ```
+
+ - The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
+ - You can install additional agents into the same cluster to accommodate additional hierarchies.
+ - You can authorize up to 100 projects.
+
+All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
+Choose the context to run `kubectl` commands from your CI/CD scripts.
+
+### Authorize the agent to access projects in your groups
+
+> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
+
+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. Edit the `config.yaml` file. Under the `ci_access` keyword, add the `groups` attribute.
+1. For the `id`, add the path:
+
+ ```yaml
+ ci_access:
+ groups:
+ - id: path/to/group/subgroup
+ ```
+
+ - The Kubernetes projects must be in the same group hierarchy as the project where the agent's configuration is.
+ - You can install additional agents into the same cluster to accommodate additional hierarchies.
+ - All of the subgroups of an authorized group also have access to the same agent (without being specified individually).
+ - You can authorize up to 100 groups.
+
+All the projects that belong to the group and its subgroups are now authorized to access the agent.
+All CI/CD jobs now include a `KUBECONFIG` with contexts for every shared agent connection.
+Choose the context to run `kubectl` commands from your CI/CD scripts.
+
+## Update your `.gitlab-ci.yml` file to run `kubectl` commands
+
+In the project where you want to run Kubernetes commands, edit your project's `.gitlab-ci.yml` file.
+
+In the first command under the `script` keyword, set your agent's context.
+Use the format `path/to/agent/repository:agent-name`. For example:
+
+```yaml
+deploy:
+ image:
+ name: bitnami/kubectl:latest
+ entrypoint: ['']
+ script:
+ - kubectl config get-contexts
+ - kubectl config use-context path/to/agent/repository:agent-name
+ - kubectl get pods
+```
+
+If you are not sure what your agent's context is, open a terminal and connect to your cluster.
+Run `kubectl config get-contexts`.
+
+### Environments with both certificate-based and agent-based connections
+
+When you deploy to an environment that has both a [certificate-based
+cluster](../../infrastructure/clusters/index.md) (deprecated) and an agent connection:
+
+- The certificate-based cluster's context is called `gitlab-deploy`. This context
+ is always selected by default.
+- In GitLab 14.9 and later, agent contexts are included in the
+ `KUBECONFIG`. You can select them by using `kubectl config use-context path/to/agent/repository:agent-name`.
+- In GitLab 14.8 and earlier, you can still use agent connections, but for environments that
+ already have a certificate-based cluster, the agent connections are not included in the `KUBECONFIG`.
+
+To use an agent connection when certificate-based connections are present, you can manually configure a new `kubectl`
+configuration context. For example:
+
+```yaml
+deploy:
+ variables:
+ KUBE_CONTEXT: my-context # The name to use for the new context
+ AGENT_ID: 1234 # replace with your agent's numeric ID
+ K8S_PROXY_URL: https://<KAS_DOMAIN>/k8s-proxy/ # For agent server (KAS) deployed in Kubernetes cluster (for gitlab.com use kas.gitlab.com); replace with your URL
+ # K8S_PROXY_URL: https://<GITLAB_DOMAIN>/-/kubernetes-agent/k8s-proxy/ # For agent server (KAS) in Omnibus
+ # ... any other variables you have configured
+ before_script:
+ - kubectl config set-credentials agent:$AGENT_ID --token="ci:${AGENT_ID}:${CI_JOB_TOKEN}"
+ - kubectl config set-cluster gitlab --server="${K8S_PROXY_URL}"
+ - kubectl config set-context "$KUBE_CONTEXT" --cluster=gitlab --user="agent:${AGENT_ID}"
+ - kubectl config use-context "$KUBE_CONTEXT"
+ # ... rest of your job configuration
+```
+
+## Use impersonation to restrict project and group access **(PREMIUM)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/345014) in GitLab 14.5.
+
+By default, your CI/CD job inherits all the permissions from the service account used to install the
+agent in the cluster.
+To restrict access to your cluster, you can use [impersonation](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation).
+
+To specify impersonations, use the `access_as` attribute in your agent configuration file and use Kubernetes RBAC rules to manage impersonated account permissions.
+
+You can impersonate:
+
+- The agent itself (default).
+- The CI/CD job that accesses the cluster.
+- A specific user or system account defined within the cluster.
+
+### Impersonate the agent
+
+The agent is impersonated by default. You don't need to do anything to impersonate it.
+
+### Impersonate the CI/CD job that accesses the cluster
+
+To impersonate the CI/CD job that accesses the cluster, under the `access_as` key, add the `ci_job: {}` key-value.
+
+When the agent makes the request to the actual Kubernetes API, it sets the
+impersonation credentials in the following way:
+
+- `UserName` is set to `gitlab:ci_job:<job id>`. Example: `gitlab:ci_job:1074499489`.
+- `Groups` is set to:
+
+ - `gitlab:ci_job` to identify all requests coming from CI jobs.
+ - The list of IDs of groups the project is in.
+ - The project ID.
+ - The slug of the environment this job belongs to.
+
+ Example: for a CI job in `group1/group1-1/project1` where:
+
+ - Group `group1` has ID 23.
+ - Group `group1/group1-1` has ID 25.
+ - Project `group1/group1-1/project1` has ID 150.
+ - Job running in a prod environment.
+
+ Group list would be `[gitlab:ci_job, gitlab:group:23, gitlab:group:25, gitlab:project:150, gitlab:project_env:150:prod]`.
+
+- `Extra` carries extra information about the request. The following properties are set on the impersonated identity:
+
+| Property | Description |
+| ------------------------------------ | ---------------------------------------------------------------------------- |
+| `agent.gitlab.com/id` | Contains the agent ID. |
+| `agent.gitlab.com/config_project_id` | Contains the agent's configuration project ID. |
+| `agent.gitlab.com/project_id` | Contains the CI project ID. |
+| `agent.gitlab.com/ci_pipeline_id` | Contains the CI pipeline ID. |
+| `agent.gitlab.com/ci_job_id` | Contains the CI job ID. |
+| `agent.gitlab.com/username` | Contains the username of the user the CI job is running as. |
+| `agent.gitlab.com/environment_slug` | Contains the slug of the environment. Only set if running in an environment. |
+
+Example `config.yaml` to restrict access by the CI/CD job's identity:
+
+```yaml
+ci_access:
+ projects:
+ - id: path/to/project
+ access_as:
+ ci_job: {}
+```
+
+### Impersonate a static identity
+
+For a given connection, you can use a static identity for the impersonation.
+
+Under the `access_as` key, add the `impersonate` key to make the request using the provided identity.
+
+The identity can be specified with the following keys:
+
+- `username` (required)
+- `uid`
+- `groups`
+- `extra`
+
+See the [official Kubernetes documentation for details](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation).
+
+## Troubleshooting
+
+### `kubectl` commands not supported
+
+The commands `kubectl exec`, `kubectl cp`, `kubectl attach`, `kubectl run --attach=true` and `kubectl port-forward` are not supported.
+Anything that uses these API endpoints does not work, because they use the deprecated
+SPDY protocol.
+[An issue exists](https://gitlab.com/gitlab-org/gitlab/-/issues/346248) to add support for these commands.
+
+### Grant write permissions to `~/.kube/cache`
+
+Tools like `kubectl`, Helm, `kpt`, and `kustomize` cache information about
+the cluster in `~/.kube/cache`. If this directory is not writable, the tool fetches information on each invocation,
+making interactions slower and creating unnecessary load on the cluster. For the best experience, in the
+image you use in your `.gitlab-ci.yml` file, ensure this directory is writable.
+
+### Enable TLS
+
+If you are on a self-managed GitLab instance, ensure your instance is configured with Transport Layer Security (TLS).
+
+If you attempt to use `kubectl` without TLS, you might get an error like:
+
+```shell
+$ kubectl get pods
+error: You must be logged in to the server (the server has asked for the client to provide credentials)
+```
diff --git a/doc/user/clusters/agent/gitops.md b/doc/user/clusters/agent/gitops.md
index e99e3b00ec7..6ca9d855b44 100644
--- a/doc/user/clusters/agent/gitops.md
+++ b/doc/user/clusters/agent/gitops.md
@@ -4,7 +4,7 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Using a GitOps workflow for Kubernetes **(PREMIUM)**
+# Using GitOps with a Kubernetes cluster **(PREMIUM)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/332227) in GitLab 14.0, the `resource_inclusions` and `resource_exclusions` attributes were removed and `reconcile_timeout`, `dry_run_strategy`, `prune`, `prune_timeout`, `prune_propagation_policy`, and `inventory_policy` attributes were added.
diff --git a/doc/user/clusters/agent/index.md b/doc/user/clusters/agent/index.md
index bab3f3137fe..d54d432f0f5 100644
--- a/doc/user/clusters/agent/index.md
+++ b/doc/user/clusters/agent/index.md
@@ -35,7 +35,7 @@ In a [**GitOps** workflow](gitops.md), you keep your Kubernetes manifests in Git
any time you update your manifests, the agent updates the cluster. This workflow is fully driven with Git and is considered pull-based,
because the cluster is pulling updates from your GitLab repository.
-In a [**CI/CD** workflow](ci_cd_tunnel.md), you use GitLab CI/CD to query and update your cluster by using the Kubernetes API.
+In a [**CI/CD** workflow](ci_cd_workflow.md), you use GitLab CI/CD to query and update your cluster by using the Kubernetes API.
This workflow is considered push-based, because GitLab is pushing requests from GitLab CI/CD to your cluster.
## Supported cluster versions
@@ -43,6 +43,7 @@ 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)
@@ -65,7 +66,7 @@ Read about how to [migrate to the agent for Kubernetes](../../infrastructure/clu
## Related topics
- [GitOps workflow](gitops.md)
-- [GitLab CI/CD workflow](ci_cd_tunnel.md)
+- [GitLab CI/CD workflow](ci_cd_workflow.md)
- [Install the agent](install/index.md)
- [Work with the agent](repository.md)
- [Troubleshooting](troubleshooting.md)
diff --git a/doc/user/clusters/agent/install/index.md b/doc/user/clusters/agent/install/index.md
index e76ef9e827d..f747c6c0e25 100644
--- a/doc/user/clusters/agent/install/index.md
+++ b/doc/user/clusters/agent/install/index.md
@@ -20,39 +20,51 @@ Before you can install the agent in your cluster, you need:
- [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine/docs/quickstart)
- [Amazon Elastic Kubernetes Service (EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)
- [Digital Ocean](https://docs.digitalocean.com/products/kubernetes/quickstart/)
-- On self-managed GitLab instances, a GitLab administrator must set up the [agent server](../../../../administration/clusters/kas.md).
+- On self-managed GitLab instances, a GitLab administrator must set up the [agent server](../../../../administration/clusters/kas.md). Then it will be available by default at `wss://gitlab.example.com/-/kubernetes-agent/`.
On GitLab.com, the agent server is available at `wss://kas.gitlab.com`.
## Installation steps
To install the agent in your cluster:
+1. [Choose a name for the agent](#agent-naming-convention).
1. [Register the agent with GitLab](#register-the-agent-with-gitlab).
1. [Install the agent in your cluster](#install-the-agent-in-the-cluster).
<i class="fa fa-youtube-play youtube" aria-hidden="true"></i> Watch a GitLab 14.2 [walk-through of this process](https://www.youtube.com/watch?v=XuBpKtsgGkE).
+### Agent naming convention
+
+The agent name must follow the [DNS label standard from RFC 1123](https://tools.ietf.org/html/rfc1123).
+The name must:
+
+- Be unique in the project.
+- Contain at most 63 characters.
+- Contain only lowercase alphanumeric characters or `-`.
+- Start with an alphanumeric character.
+- End with an alphanumeric character.
+
### Register the agent with GitLab
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5786) in GitLab 14.1, you can create a new agent record directly from the GitLab UI.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347240) in GitLab 14.9, the agent can be registered without creating an agent configuration file.
-You must register an agent with GitLab.
-
FLAG:
In GitLab 14.10, a [flag](../../../../administration/feature_flags.md) named `certificate_based_clusters` changed the **Actions** menu to focus on the agent rather than certificates. The flag is [enabled on GitLab.com and self-managed](https://gitlab.com/groups/gitlab-org/configure/-/epics/8).
Prerequisites:
-- For a [GitLab CI/CD workflow](../ci_cd_tunnel.md), ensure that
+- For a [GitLab CI/CD workflow](../ci_cd_workflow.md), ensure that
[GitLab CI/CD is enabled](../../../../ci/enable_or_disable_ci.md#enable-cicd-in-a-project).
-To register an agent with GitLab:
+You must register an agent before you can install the agent in your cluster. To register an agent:
1. On the top bar, select **Menu > Projects** and find your project.
+ If you have an [agent configuration file](#create-an-agent-configuration-file),
+ it must be in this project. Your cluster manifest files should also be in this project.
1. From the left sidebar, select **Infrastructure > Kubernetes clusters**.
1. Select **Connect a cluster (agent)**.
- - If you want to create a configuration with CI/CD defaults, type a name for the agent.
+ - If you want to create a configuration with CI/CD defaults, type a name that meets [the naming convention](#agent-naming-convention).
- 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 in your cluster and to [update the agent](#update-the-agent-version) to another version.
@@ -63,24 +75,23 @@ To register an agent with GitLab:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/259669) in GitLab 13.7, the agent configuration file can be added to multiple directories (or subdirectories) of the repository.
> - Group authorization was [introduced](https://gitlab.com/groups/gitlab-org/-/epics/5784) in GitLab 14.3.
-The agent is configured through a configuration file. This file is optional. Without a configuration file, you can still use the CI/CD workflow in the project where the agent is registered.
-
-You need a configuration file if:
+The agent uses a YAML file for configuration settings. You need a configuration file if:
- You want to use [a GitOps workflow](../gitops.md#gitops-configuration-reference).
-- You want to authorize a different project to use the agent for a [GitLab CI/CD workflow](../ci_cd_tunnel.md#authorize-the-agent).
+- You want to authorize a different project to use the agent for a [GitLab CI/CD workflow](../ci_cd_workflow.md#authorize-the-agent).
-To create an agent configuration file, go to the GitLab project. In the repository, create a file called `config.yaml` at this path:
+To create an agent configuration file:
-```plaintext
-.gitlab/agents/<agent-name>/config.yaml
-```
+1. In the repository, create a directory in this location. The `<agent-name>` must meet [the naming convention](#agent-naming-convention).
+
+ ```plaintext
+ .gitlab/agents/<agent-name>
+ ```
-- Ensure the agent name follows the [naming convention](https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent/-/blob/master/doc/identity_and_auth.md#agent-identity-and-name).
-- Ensure the filename has the `.yaml` file extension (`config.yaml`). The `.yml` extension is not accepted.
-- Add content to the `config.yaml` file:
- - For a GitOps workflow, view [the configuration reference](../gitops.md#gitops-configuration-reference) for details.
- - For a GitLab CI/CD workflow, you can leave the file blank for now.
+1. In the directory, create a `config.yaml` file. Ensure the filename ends in `.yaml`, not `.yml`.
+1. Add content to the `config.yaml` file:
+ - For a GitOps workflow, view [the configuration reference](../gitops.md#gitops-configuration-reference) for details.
+ - For a GitLab CI/CD workflow, view [the configuration reference](../ci_cd_workflow.md) for details.
### Install the agent in the cluster
@@ -98,9 +109,9 @@ If you do not know which one to choose, we recommend starting with Helm.
To install the agent on your cluster using Helm:
-1. [Install Helm](https://helm.sh/docs/intro/install/)
+1. [Install Helm](https://helm.sh/docs/intro/install/).
1. In your computer, open a terminal and [connect to your cluster](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/).
-1. Run the command you copied when registering your agent with GitLab.
+1. Run the command you copied when you [registered your agent with GitLab](#register-the-agent-with-gitlab).
Optionally, you can [customize the Helm installation](#customize-the-helm-installation).
diff --git a/doc/user/clusters/agent/repository.md b/doc/user/clusters/agent/repository.md
index 2087c804e26..8f3a8830202 100644
--- a/doc/user/clusters/agent/repository.md
+++ b/doc/user/clusters/agent/repository.md
@@ -1,210 +1,11 @@
---
-stage: Configure
-group: Configure
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+redirect_to: 'work_with_agent.md'
+remove_date: '2022-07-19'
---
-# Working with the agent for Kubernetes **(FREE)**
+This document was moved to [another location](work_with_agent.md).
-Use the following tasks when working with the agent for Kubernetes.
-
-## View your agents
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340882) in GitLab 14.8, the installed `agentk` version is displayed on the **Agent** tab.
-
-Prerequisite:
-
-- You must have at least the Developer role.
-
-To view the list of agents:
-
-1. On the top bar, select **Menu > Projects** and find the project that contains your agent configuration file.
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select **Agent** tab to view clusters connected to GitLab through the agent.
-
-On this page, you can view:
-
-- All the registered agents for the current project.
-- The connection status.
-- The version of `agentk` installed on your cluster.
-- The path to each agent configuration file.
-
-## View an agent's activity information
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/277323) in GitLab 14.6.
-
-The activity logs help you to identify problems and get the information
-you need for troubleshooting. You can see events from a week before the
-current date. To view an agent's activity:
-
-1. On the top bar, select **Menu > Projects** and find the project that contains your agent configuration file.
-1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. Select the agent you want to see activity for.
-
-The activity list includes:
-
-- Agent registration events: When a new token is **created**.
-- Connection events: When an agent is successfully **connected** to a cluster.
-
-The connection status is logged when you connect an agent for
-the first time or after more than an hour of inactivity.
-
-View and provide feedback about the UI in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/4739).
-
-## Debug the agent
-
-To debug the cluster-side component (`agentk`) of the agent, set the log
-level according to the available options:
-
-- `off`
-- `warning`
-- `error`
-- `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:
-
-```yaml
-observability:
- logging:
- level: debug
-```
-
-## Reset the agent token
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327152) in GitLab 14.9.
-
-To reset the agent token without downtime:
-
-1. Create a new token:
- 1. On the top bar, select **Menu > Projects** and find your project.
- 1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
- 1. Select the agent you want to create a token for.
- 1. On the **Tokens** tab, select **Create token**.
- 1. Enter token's name and description (optional) and select **Create token**.
-1. Securely store the generated token.
-1. Use the token to [install the agent in your cluster](install/index.md#install-the-agent-in-the-cluster) and to [update the agent](install/index.md#update-the-agent-version) to another version.
-1. Delete the token you're no longer using.
-
-## Remove an agent
-
-You can remove an agent by using the [GitLab UI](#remove-an-agent-through-the-gitlab-ui) or the
-[GraphQL API](#remove-an-agent-with-the-gitlab-graphql-api). The agent and any associated tokens
-are removed from GitLab, but no changes are made in your Kubernetes cluster. You must
-clean up those resources manually.
-
-### Remove an agent through the GitLab UI
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323055) in GitLab 14.7.
-
-To remove an agent from the UI:
-
-1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file.
-1. From the left sidebar, select **Infrastructure > Kubernetes clusters**.
-1. In the table, in the row for your agent, in the **Options** column, select the vertical ellipsis (**{ellipsis_v}**).
-1. Select **Delete agent**.
-
-### Remove an agent with the GitLab GraphQL API
-
-1. Get the `<cluster-agent-token-id>` from a query in the interactive GraphQL explorer.
- - For GitLab.com, go to <https://gitlab.com/-/graphql-explorer> to open GraphQL Explorer.
- - For self-managed GitLab, go to `https://gitlab.example.com/-/graphql-explorer`, replacing `gitlab.example.com` with your instance's URL.
-
- ```graphql
- query{
- project(fullPath: "<full-path-to-agent-configuration-project>") {
- clusterAgent(name: "<agent-name>") {
- id
- tokens {
- edges {
- node {
- id
- }
- }
- }
- }
- }
- }
- ```
-
-1. Remove an agent record with GraphQL by deleting the `clusterAgentToken`.
-
- ```graphql
- mutation deleteAgent {
- clusterAgentDelete(input: { id: "<cluster-agent-id>" } ) {
- errors
- }
- }
-
- mutation deleteToken {
- clusterAgentTokenDelete(input: { id: "<cluster-agent-token-id>" }) {
- errors
- }
- }
- ```
-
-1. Verify whether the removal occurred successfully. If the output in the Pod logs includes `unauthenticated`, it means that the agent was successfully removed:
-
- ```json
- {
- "level": "warn",
- "time": "2021-04-29T23:44:07.598Z",
- "msg": "GetConfiguration.Recv failed",
- "error": "rpc error: code = Unauthenticated desc = unauthenticated"
- }
- ```
-
-1. Delete the agent in your cluster:
-
- ```shell
- kubectl delete -n gitlab-kubernetes-agent -f ./resources.yml
- ```
-
-## Surface network security alerts from cluster to GitLab **(ULTIMATE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Cilium integration is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-The agent for Kubernetes also provides an integration with Cilium. This integration provides a simple way to
-generate network policy-related alerts and to surface those alerts in GitLab.
-
-Several components work in concert for the agent to generate the alerts:
-
-- A working Kubernetes cluster.
-- Cilium integration through either of these options:
- - Installation through [cluster management template](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium).
- - Enablement of [hubble-relay](https://docs.cilium.io/en/v1.8/concepts/overview/#hubble) on an
- existing installation.
-- One or more network policies through any of these options:
- - Use the [Container Network Policy editor](../../application_security/policies/index.md#container-network-policy-editor) to create and manage policies.
- - Use an [AutoDevOps](../../application_security/policies/index.md#container-network-policy) configuration.
- - Add the required labels and annotations to existing network policies.
-- A configuration repository with [Cilium configured in `config.yaml`](repository.md#surface-network-security-alerts-from-cluster-to-gitlab)
-
-The setup process follows the same [agent's installation steps](install/index.md),
-with the following differences:
-
-- When you define a configuration repository, you must do so with [Cilium settings](repository.md#surface-network-security-alerts-from-cluster-to-gitlab).
-- You do not need to specify the `gitops` configuration section.
-
-To integrate, add a top-level `cilium` section to your `config.yml` file. Currently, the
-only configuration option is the Hubble relay address:
-
-```yaml
-cilium:
- hubble_relay_address: "<hubble-relay-host>:<hubble-relay-port>"
-```
-
-If your Cilium integration was performed through [GitLab Managed Apps](../applications.md#install-cilium-using-gitlab-cicd) or the
-[cluster management template](../../project/clusters/protect/container_network_security/quick_start_guide.md#use-the-cluster-management-template-to-install-cilium),
-you can use `hubble-relay.gitlab-managed-apps.svc.cluster.local:80` as the address:
-
-```yaml
-cilium:
- hubble_relay_address: "hubble-relay.gitlab-managed-apps.svc.cluster.local:80"
-```
+<!-- This redirect file can be deleted after <2022-07-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/user/clusters/agent/troubleshooting.md b/doc/user/clusters/agent/troubleshooting.md
index c5c7e46c078..0932e9179f9 100644
--- a/doc/user/clusters/agent/troubleshooting.md
+++ b/doc/user/clusters/agent/troubleshooting.md
@@ -11,7 +11,7 @@ When you are using the GitLab agent for Kubernetes, you might experience issues
You can start by viewing the service logs:
```shell
-kubectl logs -f -l=app=gitlab-agent -n gitlab-kubernetes-agent
+kubectl logs -f -l=app=gitlab-agent -n gitlab-agent
```
If you are a GitLab administrator, you can also view the [GitLab agent server logs](../../../administration/clusters/kas.md#troubleshooting).
@@ -113,14 +113,14 @@ will be picked up automatically.
For example, if your internal CA certificate is `myCA.pem`:
```plaintext
-kubectl -n gitlab-kubernetes-agent create configmap ca-pemstore --from-file=myCA.pem
+kubectl -n gitlab-agent create configmap ca-pemstore --from-file=myCA.pem
```
Then in `resources.yml`:
```yaml
spec:
- serviceAccountName: gitlab-kubernetes-agent
+ serviceAccountName: gitlab-agent
containers:
- name: agent
image: "registry.gitlab.com/gitlab-org/cluster-integration/gitlab-agent/agentk:<version>"
@@ -140,7 +140,7 @@ Then in `resources.yml`:
volumes:
- name: token-volume
secret:
- secretName: gitlab-kubernetes-agent-token
+ secretName: gitlab-agent-token
- name: ca-pemstore-volume
configMap:
name: ca-pemstore
diff --git a/doc/user/clusters/agent/vulnerabilities.md b/doc/user/clusters/agent/vulnerabilities.md
index 480b09ff2ab..69f5b1d9063 100644
--- a/doc/user/clusters/agent/vulnerabilities.md
+++ b/doc/user/clusters/agent/vulnerabilities.md
@@ -34,80 +34,34 @@ You can use [cluster image scanning](../../application_security/cluster_image_sc
to scan container images in your cluster for security vulnerabilities.
To begin scanning all resources in your cluster, add a `starboard`
-configuration block to your agent configuration file with no `filters`:
+configuration block to your agent configuration with a `cadence` field
+containing a CRON expression for when the scans will be run.
```yaml
starboard:
vulnerability_report:
- filters: []
+ cadence: '0 0 * * *' # Daily at 00:00 (Kubernetes cluster time)
```
-The namespaces that are able to be scanned depend on the [Starboard Operator install mode](https://aquasecurity.github.io/starboard/latest/operator/configuration/#install-modes).
-By default, the Starboard Operator only scans resources in the `default` namespace. To change this
-behavior, edit the `STARBOARD_OPERATOR` environment variable in the `starboard-operator` deployment
-definition.
+The `cadence` field is required. GitLab supports the following types of CRON syntax for the cadence field:
-By adding filters, you can limit scans by:
+- A daily cadence of once per hour at a specified hour, for example: `0 18 * * *`
+- A weekly cadence of once per week on a specified day and at a specified hour, for example: `0 13 * * 0`
-- Resource name
-- Kind
-- Container name
-- Namespace
+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.
-```yaml
-starboard:
- vulnerability_report:
- filters:
- - namespaces:
- - staging
- - production
- kinds:
- - Deployment
- - DaemonSet
- containers:
- - ruby
- - postgres
- - nginx
- resources:
- - my-app-name
- - postgres
- - ingress-nginx
-```
-
-A resource is scanned if the resource matches any of the given names and all of the given filter
-types (`namespaces`, `kinds`, `containers`, `resources`). If a filter type is omitted, then all
-names are scanned. In this example, a resource isn't scanned unless it has a container named `ruby`,
-`postgres`, or `nginx`, and it's a `Deployment`:
-
-```yaml
-starboard:
- vulnerability_report:
- filters:
- - kinds:
- - Deployment
- containers:
- - ruby
- - postgres
- - nginx
-```
-
-There is also a global `namespaces` field that applies to all filters:
+By default, cluster image 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`
+namespaces, you can use this configuration:
```yaml
starboard:
vulnerability_report:
+ cadence: '0 0 * * *'
namespaces:
- - production
- filters:
- - kinds:
- - Deployment
- - kinds:
- - DaemonSet
- resources:
- - log-collector
+ - development
+ - staging
+ - production
```
-
-In this example, the following resources are scanned:
-
-- All deployments (`Deployment`) in the `production` namespace.
-- All daemon sets (`DaemonSet`) named `log-collector` in the `production` namespace.
diff --git a/doc/user/clusters/agent/work_with_agent.md b/doc/user/clusters/agent/work_with_agent.md
new file mode 100644
index 00000000000..8872ecf7ce5
--- /dev/null
+++ b/doc/user/clusters/agent/work_with_agent.md
@@ -0,0 +1,163 @@
+---
+stage: Configure
+group: Configure
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Working with the agent for Kubernetes **(FREE)**
+
+Use the following tasks when working with the agent for Kubernetes.
+
+## View your agents
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340882) in GitLab 14.8, the installed `agentk` version is displayed on the **Agent** tab.
+
+Prerequisite:
+
+- You must have at least the Developer role.
+
+To view the list of agents:
+
+1. On the top bar, select **Menu > Projects** and find the project that contains your agent configuration file.
+1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. Select **Agent** tab to view clusters connected to GitLab through the agent.
+
+On this page, you can view:
+
+- All the registered agents for the current project.
+- The connection status.
+- The version of `agentk` installed on your cluster.
+- The path to each agent configuration file.
+
+## View an agent's activity information
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/277323) in GitLab 14.6.
+
+The activity logs help you to identify problems and get the information
+you need for troubleshooting. You can see events from a week before the
+current date. To view an agent's activity:
+
+1. On the top bar, select **Menu > Projects** and find the project that contains your agent configuration file.
+1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. Select the agent you want to see activity for.
+
+The activity list includes:
+
+- Agent registration events: When a new token is **created**.
+- Connection events: When an agent is successfully **connected** to a cluster.
+
+The connection status is logged when you connect an agent for
+the first time or after more than an hour of inactivity.
+
+View and provide feedback about the UI in [this epic](https://gitlab.com/groups/gitlab-org/-/epics/4739).
+
+## Debug the agent
+
+To debug the cluster-side component (`agentk`) of the agent, set the log
+level according to the available options:
+
+- `off`
+- `warning`
+- `error`
+- `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:
+
+```yaml
+observability:
+ logging:
+ level: debug
+```
+
+## Reset the agent token
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327152) in GitLab 14.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336641) in GitLab 14.10, the agent token can be revoked from the UI.
+
+To reset the agent token without downtime:
+
+1. Create a new token:
+ 1. On the top bar, select **Menu > Projects** and find your project.
+ 1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
+ 1. Select the agent you want to create a token for.
+ 1. On the **Access tokens** tab, select **Create token**.
+ 1. Enter token's name and description (optional) and select **Create token**.
+1. Securely store the generated token.
+1. Use the token to [install the agent in your cluster](install/index.md#install-the-agent-in-the-cluster) and to [update the agent](install/index.md#update-the-agent-version) to another version.
+1. To delete the token you're no longer using, return to the token list and select **Revoke** (**{remove}**).
+
+## Remove an agent
+
+You can remove an agent by using the [GitLab UI](#remove-an-agent-through-the-gitlab-ui) or the
+[GraphQL API](#remove-an-agent-with-the-gitlab-graphql-api). The agent and any associated tokens
+are removed from GitLab, but no changes are made in your Kubernetes cluster. You must
+clean up those resources manually.
+
+### Remove an agent through the GitLab UI
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/323055) in GitLab 14.7.
+
+To remove an agent from the UI:
+
+1. On the top bar, select **Menu > Projects** and find the project that contains the agent configuration file.
+1. From the left sidebar, select **Infrastructure > Kubernetes clusters**.
+1. In the table, in the row for your agent, in the **Options** column, select the vertical ellipsis (**{ellipsis_v}**).
+1. Select **Delete agent**.
+
+### Remove an agent with the GitLab GraphQL API
+
+1. Get the `<cluster-agent-token-id>` from a query in the interactive GraphQL explorer.
+ - For GitLab.com, go to <https://gitlab.com/-/graphql-explorer> to open GraphQL Explorer.
+ - For self-managed GitLab, go to `https://gitlab.example.com/-/graphql-explorer`, replacing `gitlab.example.com` with your instance's URL.
+
+ ```graphql
+ query{
+ project(fullPath: "<full-path-to-agent-configuration-project>") {
+ clusterAgent(name: "<agent-name>") {
+ id
+ tokens {
+ edges {
+ node {
+ id
+ }
+ }
+ }
+ }
+ }
+ }
+ ```
+
+1. Remove an agent record with GraphQL by deleting the `clusterAgentToken`.
+
+ ```graphql
+ mutation deleteAgent {
+ clusterAgentDelete(input: { id: "<cluster-agent-id>" } ) {
+ errors
+ }
+ }
+
+ mutation deleteToken {
+ clusterAgentTokenDelete(input: { id: "<cluster-agent-token-id>" }) {
+ errors
+ }
+ }
+ ```
+
+1. Verify whether the removal occurred successfully. If the output in the Pod logs includes `unauthenticated`, it means that the agent was successfully removed:
+
+ ```json
+ {
+ "level": "warn",
+ "time": "2021-04-29T23:44:07.598Z",
+ "msg": "GetConfiguration.Recv failed",
+ "error": "rpc error: code = Unauthenticated desc = unauthenticated"
+ }
+ ```
+
+1. Delete the agent in your cluster:
+
+ ```shell
+ kubectl delete -n gitlab-kubernetes-agent -f ./resources.yml
+ ```
diff --git a/doc/user/clusters/applications.md b/doc/user/clusters/applications.md
index 2bcfea50ee3..7b5ea7d12fd 100644
--- a/doc/user/clusters/applications.md
+++ b/doc/user/clusters/applications.md
@@ -2,1134 +2,12 @@
stage: Configure
group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+remove_date: '2022-08-22'
+redirect_to: '../../update/removals.md#managed-cluster-applicationsgitlab-ciyml'
---
-# GitLab Managed Apps (DEPRECATED) **(FREE)**
+# GitLab Managed Apps (removed) **(FREE)**
-NOTE:
-The new recommended way to manage cluster applications is to use the [cluster management project template](management_project_template.md).
-If you want to migrate your GitLab managed apps management to this template, reference to [migrating from GitLab managed apps to project template](migrating_from_gma_to_project_template.md).
-
-**GitLab Managed Apps** was created to help you configure applications in your
-cluster directly from GitLab. You could use this feature through two different
-methods: "one-click install" and "CI/CD template". Both methods are **deprecated**:
-
-- The **one-click install** method was [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63348) in GitLab 14.0.
-- The **CI/CD template method** was deprecated in GitLab 13.12 and is scheduled
- to be removed in GitLab 15.0.
-
-Both methods were limiting as you couldn't fully customize your third-party apps installed
-through GitLab Managed Apps. Therefore, we decided to deprecate this feature and provide
-better [GitOps-driven alternatives](https://about.gitlab.com/direction/configure/kubernetes_management/#gitlab-managed-applications) to our users, such as [cluster integrations](integrations.md) and [cluster management project](management_project.md).
-
-## Install using GitLab CI/CD (DEPRECATED)
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/20822) in GitLab 12.6.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-WARNING:
-The GitLab Managed Apps CI/CD installation method was [deprecated in 13.12](https://gitlab.com/gitlab-org/gitlab/-/issues/327908).
-Your applications continue to work. However, we no longer support and maintain the GitLab CI/CD template for
-Managed Apps (`Managed-Cluster-Applications.gitlab-ci.yml`).
-The new recommended way to manage cluster applications is to use the [cluster management project template](management_project_template.md).
-If you want to migrate your GitLab managed apps management to this template, reference to [migrating from GitLab managed apps to project template](migrating_from_gma_to_project_template.md).
-
-The CI/CD template was the primary method for installing applications to clusters via GitLab Managed Apps
-and customize them through Helm.
-
-Supported applications:
-
-- [Ingress](#install-ingress-using-gitlab-cicd)
-- [cert-manager](#install-cert-manager-using-gitlab-cicd)
-- [Sentry](#install-sentry-using-gitlab-cicd)
-- [GitLab Runner](#install-gitlab-runner-using-gitlab-cicd)
-- [Cilium](#install-cilium-using-gitlab-cicd)
-- [Falco](#install-falco-using-gitlab-cicd)
-- [Vault](#install-vault-using-gitlab-cicd)
-- [JupyterHub](#install-jupyterhub-using-gitlab-cicd)
-- [Elastic Stack](#install-elastic-stack-using-gitlab-cicd)
-- [Crossplane](#install-crossplane-using-gitlab-cicd)
-- [Fluentd](#install-fluentd-using-gitlab-cicd)
-- [Knative](#install-knative-using-gitlab-cicd)
-- [PostHog](#install-posthog-using-gitlab-cicd)
-- [Prometheus](#install-prometheus-using-gitlab-cicd)
-
-### Prerequisites
-
-You can find and import all the files referenced below
-in the [example cluster applications
-project](https://gitlab.com/gitlab-org/cluster-integration/example-cluster-applications/).
-
-To install applications using GitLab CI/CD:
-
-1. Connect the cluster to a [cluster management project](management_project.md).
-1. In that project, add a `.gitlab-ci.yml` file with the following content:
-
- ```yaml
- include:
- - template: Managed-Cluster-Applications.gitlab-ci.yml
- ```
-
- The job provided by this template connects to the `*` (default) cluster using tools provided
- in a custom Docker image. It requires that you have a runner registered with the Docker,
- Kubernetes, or Docker Machine executor.
-
- To install to a specific cluster, read
- [Use the template with a custom environment](#use-the-template-with-a-custom-environment).
-
-1. Add a `.gitlab/managed-apps/config.yaml` file to define which
- applications you would like to install. Define the `installed` key as
- `true` to install the application and `false` to uninstall the
- application. For example, to install Ingress:
-
- ```yaml
- ingress:
- installed: true
- ```
-
-1. Optionally, define `.gitlab/managed-apps/<application>/values.yaml` file to
- customize values for the installed application.
-
-A GitLab CI/CD pipeline runs on the default branch to install the
-applications you have configured. In case of pipeline failure, the
-output of the [Helm Tiller](https://v2.helm.sh/docs/install/#running-tiller-locally) binary
-is saved as a [CI job artifact](../../ci/pipelines/job_artifacts.md).
-
-#### Prerequisites in GitLab versions earlier than 13.5
-
-For GitLab versions 13.5 and earlier, the Ingress, Fluentd, Prometheus, and Sentry
-apps were fetched from the central Helm stable repository (`https://kubernetes-charts.storage.googleapis.com/`).
-This repository [was deleted](https://github.com/helm/charts#deprecation-timeline)
-on November 13, 2020. This causes the installation CI/CD pipeline to
-fail. Upgrade to GitLab 13.6, or alternatively, you can
-use the following `.gitlab-ci.yml`, which has been tested in GitLab 13.5:
-
-```yaml
-include:
- - template: Managed-Cluster-Applications.gitlab-ci.yml
-
-apply:
- image: "registry.gitlab.com/gitlab-org/cluster-integration/cluster-applications:v0.37.0"
-```
-
-### Use the template with a custom environment
-
-If you only want apps to be installed on a specific cluster, or if your cluster's
-scope does not match `production`, you can override the environment name in your `.gitlab-ci.yml`
-file:
-
-```yaml
-include:
- - template: Managed-Cluster-Applications.gitlab-ci.yml
-
-apply:
- except:
- variables:
- - '$CI_JOB_NAME == "apply"'
-
-.managed-apps:
- extends: apply
-
-example-install:
- extends: .managed-apps
- environment:
- name: example/production
-```
-
-### Important notes
-
-Note the following:
-
-- We recommend using the cluster management project exclusively for managing deployments to a cluster.
- Do not add your application's source code to such projects.
-- When you set the value for `installed` key back to `false`, the application is
- unprovisioned from the cluster.
-- If you update `.gitlab/managed-apps/<application>/values.yaml` with new values, the
- application is redeployed.
-
-### Install Ingress using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-To install Ingress, define the `.gitlab/managed-apps/config.yaml` file
-with:
-
-```yaml
-ingress:
- installed: true
-```
-
-Ingress is installed into the `gitlab-managed-apps` namespace
-of your cluster.
-
-You can customize the installation of Ingress by defining a
-`.gitlab/managed-apps/ingress/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://github.com/helm/charts/tree/master/stable/nginx-ingress)
-for the available configuration options.
-
-Support for installing the Ingress managed application is provided by the GitLab Configure group.
-If you run into unknown issues, [open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new),
-and ping at least 2 people from the
-[Configure group](https://about.gitlab.com/handbook/product/categories/#configure-group).
-
-### Install cert-manager using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-cert-manager is installed using GitLab CI/CD by defining configuration in
-`.gitlab/managed-apps/config.yaml`.
-
-cert-manager:
-
-- Is installed into the `gitlab-managed-apps` namespace of your cluster.
-- Can be installed with or without a default
- [Let's Encrypt `ClusterIssuer`](https://cert-manager.io/docs/configuration/acme/), which requires an
- email address to be specified. The email address is used by Let's Encrypt to
- contact you about expiring certificates and issues related to your account.
-
-The following configuration is required to install cert-manager using GitLab CI/CD:
-
-```yaml
-certManager:
- installed: true
- letsEncryptClusterIssuer:
- installed: true
- email: "user@example.com"
-```
-
-The following installs cert-manager using GitLab CI/CD without the default `ClusterIssuer`:
-
-```yaml
-certManager:
- installed: true
- letsEncryptClusterIssuer:
- installed: false
-```
-
-You can customize the installation of cert-manager by defining a
-`.gitlab/managed-apps/cert-manager/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://github.com/jetstack/cert-manager) for the
-available configuration options.
-
-Support for installing the Cert Manager managed application is provided by the
-GitLab Configure group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Configure group](https://about.gitlab.com/handbook/product/categories/#configure-group).
-
-### Install Sentry using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-The Sentry Helm chart [recommends](https://github.com/helm/charts/blob/f6e5784f265dd459c5a77430185d0302ed372665/stable/sentry/values.yaml#L284-L285)
-at least 3 GB of available RAM for database migrations.
-
-To install Sentry, define the `.gitlab/managed-apps/config.yaml` file
-with:
-
-```yaml
-sentry:
- installed: true
-```
-
-Sentry is installed into the `gitlab-managed-apps` namespace
-of your cluster.
-
-You can customize the installation of Sentry by defining
-`.gitlab/managed-apps/sentry/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://github.com/helm/charts/tree/master/stable/sentry)
-for the available configuration options.
-
-We recommend you pay close attention to the following configuration options:
-
-- `email`. Needed to invite users to your Sentry instance and to send error emails.
-- `user`. Where you can set the login credentials for the default administrator user.
-- `postgresql`. For a PostgreSQL password that can be used when running future updates.
-
-When upgrading, it's important to provide the existing PostgreSQL password (given
-using the `postgresql.postgresqlPassword` key) to avoid authentication errors.
-Read the [PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade)
-for more information.
-
-Here is an example configuration for Sentry:
-
-```yaml
-# Admin user to create
-user:
- # Indicated to create the admin user or not,
- # Default is true as the initial installation.
- create: true
- email: "<your email>"
- password: "<your password>"
-
-email:
- from_address: "<your from email>"
- host: smtp
- port: 25
- use_tls: false
- user: "<your email username>"
- password: "<your email password>"
- enable_replies: false
-
-ingress:
- enabled: true
- hostname: "<sentry.example.com>"
-
-# Needs to be here between runs.
-# See https://github.com/helm/charts/tree/master/stable/postgresql#upgrade for more info
-postgresql:
- postgresqlPassword: example-postgresql-password
-```
-
-Support for installing the Sentry managed application is provided by the
-GitLab Monitor group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Monitor group](https://about.gitlab.com/handbook/product/categories/#monitor-group).
-
-### Install PostHog using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-[PostHog](https://posthog.com) 🦔 is a developer-friendly, open-source product analytics platform.
-
-To install PostHog into the `gitlab-managed-apps` namespace of your cluster,
-define the `.gitlab/managed-apps/config.yaml` file with:
-
-```yaml
-posthog:
- installed: true
-```
-
-You can customize the installation of PostHog by defining `.gitlab/managed-apps/posthog/values.yaml`
-in your cluster management project. Refer to the
-[Configuration section](https://github.com/PostHog/charts/tree/master/charts/posthog)
-of the PostHog chart's README for the available configuration options.
-
-You must provide a PostgreSQL password in `postgresql.postgresqlPassword`
-to avoid authentication errors. Read the
-[PostgreSQL chart documentation](https://github.com/helm/charts/tree/master/stable/postgresql#upgrade)
-for more information.
-
-Redis pods are restarted between upgrades. To prevent downtime, provide a Redis
-password using the `redis.password` key. This prevents a new password from
-being generated on each restart.
-
-Here is an example configuration for PostHog:
-
-```yaml
-ingress:
- enabled: true
- hostname: "<posthog.example.com>"
-
-# This will be autogenerated if you skip it. Include if you have 2 or more web replicas
-posthogSecret: 'long-secret-key-used-to-sign-cookies'
-
-# Needs to be here between runs.
-# See https://github.com/helm/charts/tree/master/stable/postgresql#upgrade for more info
-postgresql:
- postgresqlPassword: example-postgresql-password
-
-# Recommended to set this to a value to redis prevent downtime between upgrades
-redis:
- password: example-redis-password
-```
-
-Support for the PostHog managed application is provided by the PostHog team.
-If you run into issues,
-[open a support ticket](https://github.com/PostHog/posthog/issues/new/choose) directly.
-
-### Install Prometheus using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25138) in GitLab 12.8.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-[Prometheus](https://prometheus.io/docs/introduction/overview/) is an
-open-source monitoring and alerting system for supervising your
-deployed applications.
-
-To install Prometheus into the `gitlab-managed-apps` namespace of your cluster,
-define the `.gitlab/managed-apps/config.yaml` file with:
-
-```yaml
-prometheus:
- installed: true
-```
-
-You can customize the installation of Prometheus by defining
-`.gitlab/managed-apps/prometheus/values.yaml` in your cluster management
-project. Refer to the
-[Configuration section](https://github.com/helm/charts/tree/master/stable/prometheus#configuration)
-of the Prometheus chart's README for the available configuration options.
-
-Support for installing the Prometheus managed application is provided by the
-GitLab Monitor group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the [Monitor group](https://about.gitlab.com/handbook/product/categories/#monitor-group).
-
-### Install GitLab Runner using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-GitLab Runner is installed using GitLab CI/CD by defining configuration in
-`.gitlab/managed-apps/config.yaml`.
-
-The following configuration is required to install GitLab Runner using GitLab CI/CD:
-
-```yaml
-gitlabRunner:
- installed: true
-```
-
-GitLab Runner is installed into the `gitlab-managed-apps` namespace of your cluster.
-
-For GitLab Runner to function, you _must_ specify the following:
-
-- `gitlabUrl`: The GitLab server full URL (for example, `https://gitlab.example.com`)
- to register the Runner against.
-- `runnerRegistrationToken`: The registration token for adding new runners to GitLab.
- This must be [retrieved from your GitLab instance](../../ci/runners/index.md).
-
-These values can be specified using [CI/CD variables](../../ci/variables/index.md):
-
-- `GITLAB_RUNNER_GITLAB_URL` is used for `gitlabUrl`.
-- `GITLAB_RUNNER_REGISTRATION_TOKEN` is used for `runnerRegistrationToken`
-
-The methods of specifying these values are mutually exclusive. Either specify variables `GITLAB_RUNNER_REGISTRATION_TOKEN` and `GITLAB_RUNNER_TOKEN` as CI variables (recommended) or provide values for `runnerRegistrationToken:` and `runnerToken:` in `.gitlab/managed-apps/gitlab-runner/values.yaml`. If you choose to use CI variables, comment out or remove `runnerRegistrationToken:` and `runnerToken:` from `.gitlab/managed-apps/gitlab-runner/values`.
-
-The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../ci/variables/index.md#protect-a-cicd-variable) and [masked variable](../../ci/variables/index.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml` file.
-
-You can customize the installation of GitLab Runner by defining
-`.gitlab/managed-apps/gitlab-runner/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://gitlab.com/gitlab-org/charts/gitlab-runner) for the
-available configuration options.
-
-Support for installing the GitLab Runner managed application is provided by the
-GitLab Runner group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Runner group](https://about.gitlab.com/handbook/product/categories/#runner-group).
-
-### Install Cilium using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/22) in GitLab 12.8.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-[Cilium](https://cilium.io/) is a networking plugin for Kubernetes that you can use to implement
-support for [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
-resources. For more information, see [Network Policies](../../topics/autodevops/stages.md#network-policy).
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see the
-[Container Network Security Demo for GitLab 12.8](https://www.youtube.com/watch?v=pgUEdhdhoUI).
-
-Enable Cilium in the `.gitlab/managed-apps/config.yaml` file to install it:
-
-```yaml
-# possible values are gke or eks
-clusterType: gke
-
-cilium:
- installed: true
-```
-
-The `clusterType` variable enables the recommended Helm variables for a corresponding cluster type.
-You can check the recommended variables for each cluster type in the official documentation:
-
-- [Google GKE](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-gke/#deploy-cilium)
-- [AWS EKS](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-eks/#deploy-cilium)
-
-Do not use `clusterType` for sandbox environments like [minikube](https://minikube.sigs.k8s.io/docs/).
-
-You can customize Cilium's Helm variables by defining the
-`.gitlab/managed-apps/cilium/values.yaml` file in your cluster
-management project. Refer to the
-[Cilium chart](https://github.com/cilium/cilium/tree/master/install/kubernetes/cilium)
-for the available configuration options.
-
-You can check Cilium's installation status on the cluster management page:
-
-- [Project-level cluster](../project/clusters/index.md): Navigate to your project's
- **Infrastructure > Kubernetes clusters** page.
-- [Group-level cluster](../group/clusters/index.md): Navigate to your group's
- **Kubernetes** page.
-
-WARNING:
-Installation and removal of the Cilium requires a **manual**
-[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/#restart-unmanaged-pods)
-of all affected pods in all namespaces to ensure that they are
-[managed](https://docs.cilium.io/en/v1.8/operations/troubleshooting/#ensure-managed-pod)
-by the correct networking plugin. Whenever Hubble is enabled, its related pod might require a
-restart depending on whether it started prior to Cilium. For more information, see
-[Failed Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deployment)
-in the Kubernetes docs.
-
-NOTE:
-Major upgrades might require additional setup steps. For more information, see
-the official [upgrade guide](https://docs.cilium.io/en/v1.8/operations/upgrade/).
-
-By default, Cilium's
-[audit mode](https://docs.cilium.io/en/v1.8/gettingstarted/policy-creation/#enable-policy-audit-mode)
-is enabled. In audit mode, Cilium doesn't drop disallowed packets. You
-can use `policy-verdict` log to observe policy-related decisions. You
-can disable audit mode by adding the following to
-`.gitlab/managed-apps/cilium/values.yaml`:
-
-```yaml
-config:
- policyAuditMode: false
-
-agent:
- monitor:
- eventTypes: ["drop"] # Note: possible values are documented at https://docs.cilium.io/en/stable/cmdref/cilium_monitor/
-```
-
-The Cilium monitor log for traffic is logged out by the
-`cilium-monitor` sidecar container. You can check these logs with the following command:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
-```
-
-You can disable the monitor log in `.gitlab/managed-apps/cilium/values.yaml`:
-
-```yaml
-agent:
- monitor:
- enabled: false
-```
-
-The [Hubble](https://github.com/cilium/hubble) monitoring daemon is enabled by default
-and it's set to collect per namespace flow metrics. This metrics are accessible on the
-[Threat Monitoring](../application_security/threat_monitoring/index.md)
-dashboard. You can disable Hubble by adding the following to
-`.gitlab/managed-apps/cilium/values.yaml`:
-
-```yaml
-global:
- hubble:
- enabled: false
-```
-
-You can also adjust Helm values for Hubble by using
-`.gitlab/managed-apps/cilium/values.yaml`:
-
-```yaml
-global:
- hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
-```
-
-Support for installing the Cilium managed application is provided by the
-GitLab Container Security group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
-
-### Install Falco using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/91) in GitLab 13.1.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-GitLab Container Host Security Monitoring uses [Falco](https://falco.org/)
-as a runtime security tool that listens to the Linux kernel using eBPF. Falco parses system calls
-and asserts the stream against a configurable rules engine in real-time. For more information, see
-[Falco's Documentation](https://falco.org/docs/).
-
-You can enable Falco in the
-`.gitlab/managed-apps/config.yaml` file:
-
-```yaml
-falco:
- installed: true
-```
-
-You can customize Falco's Helm variables by defining the
-`.gitlab/managed-apps/falco/values.yaml` file in your cluster
-management project. Refer to the
-[Falco chart](https://github.com/falcosecurity/charts/tree/master/falco)
-for the available configuration options.
-
-WARNING:
-By default eBPF support is enabled and Falco uses an
-[eBPF probe](https://falco.org/docs/event-sources/drivers/#using-the-ebpf-probe)
-to pass system calls to user space. If your cluster doesn't support this, you can
-configure it to use Falco kernel module instead by adding the following to
-`.gitlab/managed-apps/falco/values.yaml`:
-
-```yaml
-ebpf:
- enabled: false
-```
-
-In rare cases where probe installation on your cluster isn't possible and the kernel/probe
-isn't pre-compiled, you may need to manually prepare the kernel module or eBPF probe with
-[`driverkit`](https://github.com/falcosecurity/driverkit#against-a-kubernetes-cluster)
-and install it on each cluster node.
-
-By default, Falco is deployed with a limited set of rules. To add more rules, add
-the following to `.gitlab/managed-apps/falco/values.yaml` (you can get examples from
-[Cloud Native Security Hub](https://securityhub.dev/)):
-
-```yaml
-customRules:
- file-integrity.yaml: |-
- - rule: Detect New File
- desc: detect new file created
- condition: >
- evt.type = chmod or evt.type = fchmod
- output: >
- File below a known directory opened for writing (user=%user.name
- command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2])
- priority: ERROR
- tags: [filesystem]
- - rule: Detect New Directory
- desc: detect new directory created
- condition: >
- mkdir
- output: >
- File below a known directory opened for writing (user=%user.name
- command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2])
- priority: ERROR
- tags: [filesystem]
-```
-
-By default, Falco only outputs security events to logs as JSON objects. To set it to output to an
-[external API](https://falco.org/docs/alerts/#https-output-send-alerts-to-an-https-end-point)
-or [application](https://falco.org/docs/alerts/#program-output),
-add the following to `.gitlab/managed-apps/falco/values.yaml`:
-
-```yaml
-falco:
- programOutput:
- enabled: true
- keepAlive: false
- program: mail -s "Falco Notification" someone@example.com
-
- httpOutput:
- enabled: true
- url: http://some.url
-```
-
-You can check these logs with the following command:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l app=falco
-```
-
-Support for installing the Falco managed application is provided by the
-GitLab Container Security group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
-
-### Install Vault using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/9982) in GitLab 12.9.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-[HashiCorp Vault](https://www.vaultproject.io/) is a secrets management solution which
-can be used to safely manage and store passwords, credentials, certificates, and more. A Vault
-installation could be leveraged to provide a single secure data store for credentials
-used in your applications, GitLab CI/CD jobs, and more. It could also serve as a way of
-providing SSL/TLS certificates to systems and deployments in your infrastructure. Leveraging
-Vault as a single source for all these credentials allows greater security by having
-a single source of access, control, and auditability around all your sensitive
-credentials and certificates. This feature requires giving GitLab the highest level of access and
-control. Therefore, if GitLab is compromised, the security of this Vault instance is as well. To
-avoid this security risk, GitLab recommends using your own HashiCorp Vault to leverage
-[external secrets with CI](../../ci/secrets/index.md).
-
-To install Vault, enable it in the `.gitlab/managed-apps/config.yaml` file:
-
-```yaml
-vault:
- installed: true
-```
-
-By default you receive a basic Vault setup with no scalable storage backend. This
-is enough for simple testing and small-scale deployments, though has limits
-to how much it can scale, and as it's a single instance deployment, upgrading the
-Vault application causes downtime.
-
-To optimally use Vault in a production environment, it's ideal to have a good understanding
-of the internals of Vault and how to configure it. This can be done by reading
-the [Vault Configuration guide](../../ci/secrets/#configure-your-vault-server),
-the [Vault documentation](https://www.vaultproject.io/docs/internals) and
-the Vault Helm chart [`values.yaml` file](https://github.com/hashicorp/vault-helm/blob/v0.3.3/values.yaml).
-
-At a minimum, most users set up:
-
-- A [seal](https://www.vaultproject.io/docs/configuration/seal) for extra encryption
- of the main key.
-- A [storage backend](https://www.vaultproject.io/docs/configuration/storage) that's
- suitable for environment and storage security requirements.
-- [HA Mode](https://www.vaultproject.io/docs/concepts/ha).
-- The [Vault UI](https://www.vaultproject.io/docs/configuration/ui).
-
-The following is an example values file (`.gitlab/managed-apps/vault/values.yaml`)
-that configures Google Key Management Service for auto-unseal, using a Google Cloud Storage backend, enabling
-the Vault UI, and enabling HA with 3 pod replicas. The `storage` and `seal` stanzas
-below are examples and should be replaced with settings specific to your environment.
-
-```yaml
-# Enable the Vault WebUI
-ui:
- enabled: true
-server:
- # Disable the built in data storage volume as it's not safe for High Availability mode
- dataStorage:
- enabled: false
- # Enable High Availability Mode
- ha:
- enabled: true
- # Configure Vault to listen on port 8200 for normal traffic and port 8201 for inter-cluster traffic
- config: |
- listener "tcp" {
- tls_disable = 1
- address = "[::]:8200"
- cluster_address = "[::]:8201"
- }
- # Configure Vault to store its data in a GCS Bucket backend
- storage "gcs" {
- path = "gcs://my-vault-storage/vault-bucket"
- ha_enabled = "true"
- }
- # Configure Vault to unseal storage using a GKMS key
- seal "gcpckms" {
- project = "vault-helm-dev-246514"
- region = "global"
- key_ring = "vault-helm-unseal-kr"
- crypto_key = "vault-helm-unseal-key"
- }
-```
-
-After you have successfully installed Vault, you must
-[initialize the Vault](https://learn.hashicorp.com/tutorials/vault/getting-started-deploy#initializing-the-vault)
-and obtain the initial root token. You need access to your Kubernetes cluster that
-Vault has been deployed into in order to do this. To initialize the Vault, get a
-shell to one of the Vault pods running inside Kubernetes (typically this is done
-by using the `kubectl` command line tool). After you have a shell into the pod,
-run the `vault operator init` command:
-
-```shell
-kubectl -n gitlab-managed-apps exec -it vault-0 sh
-/ $ vault operator init
-```
-
-This should give you your unseal keys and initial root token. Make sure to note these down
-and keep these safe, as they're required to unseal the Vault throughout its lifecycle.
-
-Support for installing the Vault managed application is provided by the
-GitLab Release Management group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Release Management group](https://about.gitlab.com/handbook/product/categories/#release-management-group).
-
-### Install JupyterHub using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/40) in GitLab 12.8.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-JupyterHub is installed using GitLab CI/CD by defining configuration in
-`.gitlab/managed-apps/config.yaml` as follows:
-
-```yaml
-jupyterhub:
- installed: true
- gitlabProjectIdWhitelist: []
- gitlabGroupWhitelist: []
-```
-
-In the configuration:
-
-- `gitlabProjectIdWhitelist` restricts GitLab authentication to only members of the specified projects.
-- `gitlabGroupWhitelist` restricts GitLab authentication to only members of the specified groups.
-- Specifying an empty array for both allows any user on the GitLab instance to sign in.
-
-JupyterHub is installed into the `gitlab-managed-apps` namespace of your cluster.
-
-For JupyterHub to function, you must set up an [OAuth Application](../../integration/oauth_provider.md).
-Set:
-
-- "Redirect URI" to `http://<JupyterHub Host>/hub/oauth_callback`.
-- "Scope" to `api read_repository write_repository`.
-
-In addition, the following variables must be specified using [CI/CD variables](../../ci/variables/index.md):
-
-- `JUPYTERHUB_PROXY_SECRET_TOKEN` - Secure string used for signing communications
- from the hub. Read [`proxy.secretToken`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#proxy-secrettoken).
-- `JUPYTERHUB_COOKIE_SECRET` - Secure string used for signing secure cookies. Read
- [`hub.cookieSecret`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#hub-cookiesecret).
-- `JUPYTERHUB_HOST` - Hostname used for the installation. For example, `jupyter.gitlab.example.com`.
-- `JUPYTERHUB_GITLAB_HOST` - Hostname of the GitLab instance used for authentication.
- For example, `gitlab.example.com`.
-- `JUPYTERHUB_AUTH_CRYPTO_KEY` - A 32-byte encryption key used to set
- [`auth.state.cryptoKey`](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html#auth-state-cryptokey).
-- `JUPYTERHUB_AUTH_GITLAB_CLIENT_ID` - "Application ID" for the OAuth Application.
-- `JUPYTERHUB_AUTH_GITLAB_CLIENT_SECRET` - "Secret" for the OAuth Application.
-
-By default, JupyterHub is installed using a
-[default values file](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/blob/master/src/default-data/jupyterhub/values.yaml.gotmpl).
-You can customize the installation of JupyterHub by defining a
-`.gitlab/managed-apps/jupyterhub/values.yaml` file in your cluster management project.
-
-Refer to the
-[chart reference](https://zero-to-jupyterhub.readthedocs.io/en/stable/reference/reference.html) for the
-available configuration options.
-
-Support for installing the JupyterHub managed application is provided by the GitLab Configure group.
-If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Configure group](https://about.gitlab.com/handbook/product/categories/#configure-group).
-
-### Install Elastic Stack using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25138) in GitLab 12.8.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-Elastic Stack is installed using GitLab CI/CD by defining configuration in
-`.gitlab/managed-apps/config.yaml`.
-
-The following configuration is required to install Elastic Stack using GitLab CI/CD:
-
-```yaml
-elasticStack:
- installed: true
-```
-
-Elastic Stack is installed into the `gitlab-managed-apps` namespace of your cluster.
-
-You can check the default
-[`values.yaml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/vendor/elastic_stack/values.yaml)
-we set for this chart.
-
-You can customize the installation of Elastic Stack by defining
-`.gitlab/managed-apps/elastic-stack/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://gitlab.com/gitlab-org/charts/elastic-stack) for all
-available configuration options.
-
-Support for installing the Elastic Stack managed application is provided by the
-GitLab Monitor group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the [Monitor group](https://about.gitlab.com/handbook/product/categories/#monitor-group).
-
-### Install Crossplane using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/35675) in GitLab 12.9.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-Crossplane is installed using GitLab CI/CD by defining configuration in
-`.gitlab/managed-apps/config.yaml`.
-
-The following configuration is required to install Crossplane using GitLab CI/CD:
-
-```yaml
-Crossplane:
- installed: true
-```
-
-Crossplane is installed into the `gitlab-managed-apps` namespace of your cluster.
-
-You can check the default
-[`values.yaml`](https://github.com/crossplane/crossplane/blob/master/cluster/charts/crossplane/values.yaml.tmpl)
-we set for this chart.
-
-You can customize the installation of Crossplane by defining
-`.gitlab/managed-apps/crossplane/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://github.com/crossplane/crossplane/tree/master/cluster/charts/crossplane#configuration)
-for the available configuration options. Note that this link points to the documentation
-for the current development release, which may differ from the version you have installed.
-
-Support for the Crossplane managed application is provided by the Crossplane team.
-If you run into issues,
-[open a support ticket](https://github.com/crossplane/crossplane/issues/new/choose) directly.
-
-### Install Fluentd using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/76) in GitLab 12.10.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-To install Fluentd into the `gitlab-managed-apps` namespace of your cluster using
-GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
-
-```yaml
-Fluentd:
- installed: true
-```
-
-You can also review the default values set for this chart in the
-[`values.yaml`](https://github.com/helm/charts/blob/master/stable/fluentd/values.yaml) file.
-
-You can customize the installation of Fluentd by defining
-`.gitlab/managed-apps/fluentd/values.yaml` file in your cluster management
-project. Refer to the
-[configuration chart](https://github.com/helm/charts/tree/master/stable/fluentd#configuration)
-for the current development release of Fluentd for all available configuration options.
-
-The configuration chart link points to the current development release, which
-may differ from the version you have installed. To ensure compatibility, switch
-to the specific branch or tag you are using.
-
-Support for installing the Fluentd managed application is provided by the
-GitLab Container Security group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
-
-### Install Knative using GitLab CI/CD
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-To install Knative, define the `.gitlab/managed-apps/config.yaml` file
-with:
-
-```yaml
-knative:
- installed: true
-```
-
-You can customize the installation of Knative by defining `.gitlab/managed-apps/knative/values.yaml`
-file in your cluster management project. Refer to the [chart](https://gitlab.com/gitlab-org/charts/knative)
-for all available configuration options.
-
-Here is an example configuration for Knative:
-
-```yaml
-domain: 'my.wildcard.A.record.dns'
-```
-
-If you plan to use GitLab Serverless capabilities, be sure to set an `A record`
-wildcard domain on your custom configuration.
-
-Support for installing the Knative managed application is provided by the
-GitLab Configure group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Configure group](https://about.gitlab.com/handbook/product/categories/#configure-group).
-
-#### Knative Metrics
-
-GitLab provides [Invocation Metrics](../project/clusters/serverless/index.md#invocation-metrics)
-for your functions. To collect these metrics, you must have:
-
-1. Knative and Prometheus managed applications installed on your cluster.
-1. Manually applied the custom metrics on your cluster by running the following command:
-
- ```shell
- kubectl apply -f https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/raw/02c8231e30ef5b6725e6ba368bc63863ceb3c07d/src/default-data/knative/istio-metrics.yaml
- ```
-
-#### Uninstall Knative
-
-To uninstall Knative, you must first manually remove any custom metrics you have added
-by running the following command:
-
-```shell
-kubectl delete -f https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/raw/02c8231e30ef5b6725e6ba368bc63863ceb3c07d/src/default-data/knative/istio-metrics.yaml
-```
-
-### Install AppArmor using GitLab CI/CD
-
-> - [Introduced](https://gitlab.com/gitlab-org/cluster-integration/cluster-applications/-/merge_requests/100) in GitLab 13.1.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
-
-To install AppArmor into the `gitlab-managed-apps` namespace of your cluster using
-GitLab CI/CD, define the following configuration in `.gitlab/managed-apps/config.yaml`:
-
-```yaml
-apparmor:
- installed: true
-```
-
-You can define one or more AppArmor profiles by adding them into
-`.gitlab/managed-apps/apparmor/values.yaml` as the following:
-
-```yaml
-profiles:
- profile-one: |-
- profile profile-one {
- file,
- }
-```
-
-Refer to the [AppArmor chart](https://gitlab.com/gitlab-org/charts/apparmor) for more information on this chart.
-
-#### Using AppArmor profiles in your deployments
-
-After installing AppAmor, you can use profiles by adding Pod Annotations. If you're using
-Auto DevOps, you can [customize `auto-deploy-values.yaml`](../../topics/autodevops/customize.md#customize-values-for-helm-chart)
-to annotate your pods. Although it's helpful to be aware of the
-[list of custom attributes](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/tree/master/assets/auto-deploy-app#gitlabs-auto-deploy-helm-chart),
-you're only required to set `podAnnotations` as follows:
-
-```yaml
-podAnnotations:
- container.apparmor.security.beta.kubernetes.io/auto-deploy-app: localhost/profile-one
-```
-
-The only information to be changed here is the profile name which is `profile-one`
-in this example. Refer to the
-[AppArmor tutorial](https://kubernetes.io/docs/tutorials/security/apparmor/#securing-a-pod)
-for more information on how AppArmor is integrated in Kubernetes.
-
-#### Using PodSecurityPolicy in your deployments
-
-To enable AppArmor annotations on a Pod Security Policy you must first
-load the corresponding AppArmor profile.
-
-[Pod Security Policies](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) are
-resources at the cluster level that control security-related
-properties of deployed pods. You can use such a policy to enable
-loaded AppArmor profiles and apply necessary pod restrictions across a
-cluster. You can deploy a new policy by adding the following
-to`.gitlab/managed-apps/apparmor/values.yaml`:
-
-```yaml
-securityPolicies:
- example:
- defaultProfile: profile-one
- allowedProfiles:
- - profile-one
- - profile-two
- spec:
- privileged: false
- seLinux:
- rule: RunAsAny
- supplementalGroups:
- rule: RunAsAny
- runAsUser:
- rule: RunAsAny
- fsGroup:
- rule: RunAsAny
- volumes:
- - '*'
-```
-
-This example creates a single policy named `example` with the provided specification,
-and enables [AppArmor annotations](https://kubernetes.io/docs/tutorials/security/apparmor/#podsecuritypolicy-annotations) on it.
-
-Support for installing the AppArmor managed application is provided by the
-GitLab Container Security group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping
-at least 2 people from the
-[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
-
-## Install with one click (REMOVED)
-
-> [Removed](https://gitlab.com/groups/gitlab-org/-/epics/4280) in GitLab 14.0.
-
-The one-click installation method was deprecated in GitLab 13.9 and removed in [GitLab 14.0](https://gitlab.com/groups/gitlab-org/-/epics/4280).
-The removal does not break nor uninstall any apps you have installed, it only
-removes the "Applications" tab from the cluster page.
-The new recommended way to manage cluster applications is to use the [cluster management project template](management_project_template.md).
-
-- If you want to migrate your GitLab managed apps management to this template, read
- [migrating from GitLab managed apps to project template](migrating_from_gma_to_project_template.md).
-- If you don't want to use the template, you can also manually manage your applications.
- For that, follow the process to
- [take ownership of your GitLab Managed Apps](#take-ownership-of-your-gitlab-managed-apps).
-
-If you are not yet on GitLab 14.0 or later, you can refer to [an older version of this document](https://docs.gitlab.com/13.12/ee/user/clusters/applications.html#install-with-one-click-deprecated).
-
-## Browse applications logs
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/36769) in GitLab 13.2.
-
-Logs produced by pods running **GitLab Managed Apps** can be browsed using
-[**Log Explorer**](../project/clusters/kubernetes_pod_logs.md).
-
-## Take ownership of your GitLab Managed Apps
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327803) in GitLab 13.12.
-
-With the removal of the One-click install method in GitLab 14.0,
-the **Applications** tab (under your project's **Infrastructure > Kubernetes clusters**)
-is no longer displayed:
-
-![GitLab Managed Apps - Applications tab](img/applications_tab_v13_12.png)
-
-This tab was dedicated to installing and maintaining GitLab Managed Apps.
-To continue managing your installed applications, one of the possible ways is to
-install [Helm](https://helm.sh/) locally, as described below.
-
-### View installed applications
-
-To view the applications you have installed in your cluster through GitLab Managed Apps,
-you need to verify the resources you have in the `gitlab-managed-apps` namespace.
-On your computer, [configure `kubectl`](https://kubernetes.io/docs/reference/kubectl/overview/)
-to connect to your cluster, open the terminal and run:
-
-```shell
-kubectl get all -n gitlab-managed-apps
-```
-
-If there is no output or the namespace does not exist, you do not have any applications
-installed through GitLab Managed Apps. If this is the case, you have nothing else to do.
-
-### Identify the Helm version
-
-Next, verify which Helm version GitLab used to install your applications.
-
-#### For apps installed with Helm v3
-
-To list your apps installed with Helm v3, run:
-
-```shell
-kubectl get secrets -n gitlab-managed-apps | grep 'helm.sh/release'
-```
-
-You can manage these applications with Helm v3 and you don't need any further steps.
-
-All applications not listed with the command above were installed with Helm v2.
-
-#### For apps installed with Helm v2
-
-If you have apps installed with Helm v2, you can either:
-
-- A. Install Helm v3 and [upgrade your apps to Helm v3](https://helm.sh/docs/topics/v2_v3_migration/).
-- B. Install Helm v2 and keep using this Helm version, which is not recommended as Helm v2 was deprecated in favor of
-Helm v3.
-
-If you choose to keep using Helm v2 (B), follow the steps below to manage your apps:
-
-1. Install [Helm v2](https://v2.helm.sh/docs/install/) in your computer.
-1. Start a local Tiller server:
-
- ```shell
- export TILLER_NAMESPACE=gitlab-managed-apps
- tiller -listen localhost:44134
- ```
-
-1. In another tab, initialize your Helm client:
-
- ```shell
- export HELM_HOST="localhost:44134"
- helm init --client-only
- ```
-
-1. Now your environment is ready to manage your apps with Helm v2. For example, to list your releases:
-
- ```shell
- helm ls
- ```
-
-### Cluster integrations
-
-Some applications were not only installed in your cluster by GitLab through
-Managed Apps but were also directly integrated with GitLab. If you had one of
-these applications installed before GitLab 14.0, then a corresponding [cluster
-integration](integrations.md) has been automatically enabled:
-
-- [Prometheus cluster integration](integrations.md#prometheus-cluster-integration)
-- [Elastic Stack cluster integration](integrations.md#elastic-stack-cluster-integration)
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 13.12.
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/333610) in GitLab 15.0.
+Use the [cluster management project template](management_project_template.md) instead.
diff --git a/doc/user/clusters/cost_management.md b/doc/user/clusters/cost_management.md
index c99eef385ce..47dc9c42797 100644
--- a/doc/user/clusters/cost_management.md
+++ b/doc/user/clusters/cost_management.md
@@ -8,10 +8,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216737) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.5.
> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+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 `certificate_based_clusters`.
+
Cluster cost management provides insights into cluster resource usage. GitLab provides an example
[`kubecost-cost-model`](https://gitlab.com/gitlab-examples/kubecost-cost-model/)
project that uses the GitLab Prometheus integration and
diff --git a/doc/user/clusters/crossplane.md b/doc/user/clusters/crossplane.md
index 9e4c672ac45..3f38a473128 100644
--- a/doc/user/clusters/crossplane.md
+++ b/doc/user/clusters/crossplane.md
@@ -2,289 +2,12 @@
stage: Configure
group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+remove_date: '2022-08-22'
+redirect_to: '../../update/removals.md#managed-cluster-applicationsgitlab-ciyml'
---
-# Crossplane configuration (DEPRECATED) **(FREE)**
+# Crossplane configuration (removed) **(FREE)**
-> [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
-
-After [installing](applications.md#install-crossplane-using-gitlab-cicd) Crossplane, you must configure it for use.
-The process of configuring Crossplane includes:
-
-1. [Configure RBAC permissions](#configure-rbac-permissions).
-1. [Configure Crossplane with a cloud provider](#configure-crossplane-with-a-cloud-provider).
-1. [Configure managed service access](#configure-managed-service-access).
-1. [Set up Resource classes](#setting-up-resource-classes).
-1. Use [Auto DevOps configuration options](#auto-devops-configuration-options).
-1. [Connect to the PostgreSQL instance](#connect-to-the-postgresql-instance).
-
-To allow Crossplane to provision cloud services such as PostgreSQL, the cloud provider
-stack must be configured with a user account. For example:
-
-- A service account for GCP.
-- An IAM user for AWS.
-
-Some important notes:
-
-- This guide uses GCP as an example, but the processes for AWS and Azure are similar.
-- Crossplane requires the Kubernetes cluster to be VPC native with Alias IPs enabled,
- so the IP addresses of the pods can be routed within the GCP network.
-
-First, declare some environment variables with configuration for use in this guide:
-
-```shell
-export PROJECT_ID=crossplane-playground # the GCP project where all resources reside.
-export NETWORK_NAME=default # the GCP network where your GKE is provisioned.
-export REGION=us-central1 # the GCP region where the GKE cluster is provisioned.
-```
-
-## Configure RBAC permissions
-
-For GitLab-managed clusters, role-based access control (RBAC) is configured automatically.
-
-For non-GitLab managed clusters, ensure that the service account for the token
-provided can manage resources in the `database.crossplane.io` API group:
-
-1. Save the following YAML as `crossplane-database-role.yaml`:
-
- ```yaml
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRole
- metadata:
- name: crossplane-database-role
- labels:
- rbac.authorization.k8s.io/aggregate-to-edit: "true"
- rules:
- - apiGroups:
- - database.crossplane.io
- resources:
- - postgresqlinstances
- verbs:
- - get
- - list
- - create
- - update
- - delete
- - patch
- - watch
- ```
-
-1. Apply the cluster role to the cluster:
-
- ```shell
- kubectl apply -f crossplane-database-role.yaml
- ```
-
-## Configure Crossplane with a cloud provider
-
-See [Configure Your Cloud Provider Account](https://crossplane.github.io/docs/v1.6/)
-to configure the installed cloud provider stack with a user account.
-
-The Secret, and the Provider resource referencing the Secret, must be
-applied to the `gitlab-managed-apps` namespace in the guide. Make sure you change that
-while following the process.
-
-## Configure Managed Service Access
-
-Next, configure connectivity between the PostgreSQL database and the GKE cluster
-by either:
-
-- Using Crossplane as demonstrated below.
-- Directly in the GCP console by
- [configuring private services access](https://cloud.google.com/vpc/docs/configure-private-services-access).
-
-1. Run the following command, which creates a `network.yaml` file, and configures
- `GlobalAddress` and connection resources:
-
- ```plaintext
- cat > network.yaml <<EOF
- ---
- # gitlab-ad-globaladdress defines the IP range that will be allocated
- # for cloud services connecting to the instances in the given Network.
-
- apiVersion: compute.gcp.crossplane.io/v1alpha3
- kind: GlobalAddress
- metadata:
- name: gitlab-ad-globaladdress
- spec:
- providerRef:
- name: gcp-provider
- reclaimPolicy: Delete
- name: gitlab-ad-globaladdress
- purpose: VPC_PEERING
- addressType: INTERNAL
- prefixLength: 16
- network: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
- ---
- # gitlab-ad-connection is what allows cloud services to use the allocated
- # GlobalAddress for communication. Behind the scenes, it creates a VPC peering
- # to the network that those service instances actually live.
-
- apiVersion: servicenetworking.gcp.crossplane.io/v1alpha3
- kind: Connection
- metadata:
- name: gitlab-ad-connection
- spec:
- providerRef:
- name: gcp-provider
- reclaimPolicy: Delete
- parent: services/servicenetworking.googleapis.com
- network: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
- reservedPeeringRangeRefs:
- - name: gitlab-ad-globaladdress
- EOF
- ```
-
-1. Apply the settings specified in the file with the following command:
-
- ```shell
- kubectl apply -f network.yaml
- ```
-
-1. Verify the creation of the network resources, and that both resources are ready and synced.
-
- ```shell
- kubectl describe connection.servicenetworking.gcp.crossplane.io gitlab-ad-connection
- kubectl describe globaladdress.compute.gcp.crossplane.io gitlab-ad-globaladdress
- ```
-
-## Setting up Resource classes
-
-Use resource classes to define a configuration for the required managed service.
-This example defines the PostgreSQL Resource class:
-
-1. Run the following command, which define a `gcp-postgres-standard.yaml` resource
- class containing a default `CloudSQLInstanceClass` with labels:
-
- ```plaintext
- cat > gcp-postgres-standard.yaml <<EOF
- apiVersion: database.gcp.crossplane.io/v1beta1
- kind: CloudSQLInstanceClass
- metadata:
- name: cloudsqlinstancepostgresql-standard
- labels:
- gitlab-ad-demo: "true"
- specTemplate:
- writeConnectionSecretsToNamespace: gitlab-managed-apps
- forProvider:
- databaseVersion: POSTGRES_11_7
- region: $REGION
- settings:
- tier: db-custom-1-3840
- dataDiskType: PD_SSD
- dataDiskSizeGb: 10
- ipConfiguration:
- privateNetwork: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
- # this should match the name of the provider created in the above step
- providerRef:
- name: gcp-provider
- reclaimPolicy: Delete
- ---
- apiVersion: database.gcp.crossplane.io/v1beta1
- kind: CloudSQLInstanceClass
- metadata:
- name: cloudsqlinstancepostgresql-standard-default
- annotations:
- resourceclass.crossplane.io/is-default-class: "true"
- specTemplate:
- writeConnectionSecretsToNamespace: gitlab-managed-apps
- forProvider:
- databaseVersion: POSTGRES_11_7
- region: $REGION
- settings:
- tier: db-custom-1-3840
- dataDiskType: PD_SSD
- dataDiskSizeGb: 10
- ipConfiguration:
- privateNetwork: projects/$PROJECT_ID/global/networks/$NETWORK_NAME
- # this should match the name of the provider created in the above step
- providerRef:
- name: gcp-provider
- reclaimPolicy: Delete
- EOF
- ```
-
-1. Apply the resource class configuration with the following command:
-
- ```shell
- kubectl apply -f gcp-postgres-standard.yaml
- ```
-
-1. Verify creation of the Resource class with the following command:
-
- ```shell
- kubectl get cloudsqlinstanceclasses
- ```
-
-The Resource Classes allow you to define classes of service for a managed service.
-We could create another `CloudSQLInstanceClass` which requests for a larger or a
-faster disk. It could also request for a specific version of the database.
-
-## Auto DevOps Configuration Options
-
-You can run the Auto DevOps pipeline with either of the following options:
-
-- Setting the Environment variables `AUTO_DEVOPS_POSTGRES_MANAGED` and
- `AUTO_DEVOPS_POSTGRES_MANAGED_CLASS_SELECTOR` to provision PostgreSQL using Crossplane.
-- Overriding values for the Helm chart:
- - Set `postgres.managed` to `true`, which selects a default resource class.
- Mark the resource class with the annotation
- `resourceclass.crossplane.io/is-default-class: "true"`. The CloudSQLInstanceClass
- `cloudsqlinstancepostgresql-standard-default` is used to satisfy the claim.
- - Set `postgres.managed` to `true` with `postgres.managedClassSelector`
- providing the resource class to choose, based on labels. In this case, the
- value of `postgres.managedClassSelector.matchLabels.gitlab-ad-demo="true"`
- selects the CloudSQLInstance class `cloudsqlinstancepostgresql-standard`
- to satisfy the claim request.
-
-The Auto DevOps pipeline should provision a PostgresqlInstance when it runs successfully.
-
-To verify the PostgreSQL instance was created, run this command. When the `STATUS`
-field of the PostgresqlInstance changes to `BOUND`, it's successfully provisioned:
-
-```shell
-$ kubectl get postgresqlinstance
-
-NAME STATUS CLASS-KIND CLASS-NAME RESOURCE-KIND RESOURCE-NAME AGE
-staging-test8 Bound CloudSQLInstanceClass cloudsqlinstancepostgresql-standard CloudSQLInstance xp-ad-demo-24-staging-staging-test8-jj55c 9m
-```
-
-The endpoint of the PostgreSQL instance, and the user credentials, are present in
-a secret called `app-postgres` within the same project namespace. You can verify the
-secret with the following command:
-
-```shell
-$ kubectl describe secret app-postgres
-
-Name: app-postgres
-Namespace: xp-ad-demo-24-staging
-Labels: <none>
-Annotations: crossplane.io/propagate-from-name: 108e460e-06c7-11ea-b907-42010a8000bd
- crossplane.io/propagate-from-namespace: gitlab-managed-apps
- crossplane.io/propagate-from-uid: 10c79605-06c7-11ea-b907-42010a8000bd
-
-Type: Opaque
-
-Data
-====
-privateIP: 8 bytes
-publicIP: 13 bytes
-serverCACertificateCert: 1272 bytes
-serverCACertificateCertSerialNumber: 1 bytes
-serverCACertificateCreateTime: 24 bytes
-serverCACertificateExpirationTime: 24 bytes
-username: 8 bytes
-endpoint: 8 bytes
-password: 27 bytes
-serverCACertificateCommonName: 98 bytes
-serverCACertificateInstance: 41 bytes
-serverCACertificateSha1Fingerprint: 40 bytes
-```
-
-## Connect to the PostgreSQL instance
-
-Follow this [GCP guide](https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine) if you
-would like to connect to the newly provisioned PostgreSQL database instance on CloudSQL.
+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/333610)
+in GitLab 15.0. Use [crossplane](http://crossplane.io/) directly instead.
diff --git a/doc/user/clusters/environments.md b/doc/user/clusters/environments.md
index 71eb08ee640..4ba0de3bf55 100644
--- a/doc/user/clusters/environments.md
+++ b/doc/user/clusters/environments.md
@@ -9,10 +9,14 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13392) in GitLab 12.3 for group-level clusters.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14809) in GitLab 12.4 for instance-level clusters.
> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+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 `certificate_based_clusters`.
+
Cluster environments provide a consolidated view of which CI [environments](../../ci/environments/index.md) are
deployed to the Kubernetes cluster and it:
diff --git a/doc/user/clusters/img/applications_tab_v13_12.png b/doc/user/clusters/img/applications_tab_v13_12.png
deleted file mode 100644
index c4f1a8862e8..00000000000
--- a/doc/user/clusters/img/applications_tab_v13_12.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/clusters/integrations.md b/doc/user/clusters/integrations.md
index 74f6ec283ea..a6dbb5fe0d7 100644
--- a/doc/user/clusters/integrations.md
+++ b/doc/user/clusters/integrations.md
@@ -6,16 +6,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Cluster integrations (DEPRECATED) **(FREE)**
-> [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+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 `certificate_based_clusters`.
+
GitLab provides several ways to integrate applications to your
Kubernetes cluster.
To enable cluster integrations, first add a Kubernetes cluster to a GitLab
-[project](../project/clusters/add_remove_clusters.md) or
+[project](../project/clusters/index.md) or
[group](../group/clusters/index.md) or
[instance](../instance/clusters/index.md).
@@ -97,9 +101,21 @@ To enable the Prometheus integration for your cluster:
1. Click **Save changes**.
1. Go to the **Health** tab to see your cluster's metrics.
-## Elastic Stack cluster integration
+## 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.
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61077) in GitLab 13.12.
+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
diff --git a/doc/user/clusters/management_project.md b/doc/user/clusters/management_project.md
index 7658bc41dd9..d59edb1e2c2 100644
--- a/doc/user/clusters/management_project.md
+++ b/doc/user/clusters/management_project.md
@@ -8,12 +8,16 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/32810) in GitLab 12.5.
> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
The cluster management project was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
To manage cluster applications, use the [GitLab agent](agent/index.md)
with the [Cluster Management Project Template](management_project_template.md).
+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 `certificate_based_clusters`.
+
A project can be designated as the management project for a cluster.
A management project can be used to run deployment jobs with
Kubernetes
diff --git a/doc/user/clusters/management_project_template.md b/doc/user/clusters/management_project_template.md
index ab17e462c6a..8ca1bf5d57f 100644
--- a/doc/user/clusters/management_project_template.md
+++ b/doc/user/clusters/management_project_template.md
@@ -32,7 +32,7 @@ If you have already configured the agent and connected a cluster with GitLab:
1. [Create a project from the cluster management project template](#create-a-project-based-on-the-cluster-management-project-template).
1. In the project where you configured your agent,
- [grant the agent access to the new project](agent/ci_cd_tunnel.md#authorize-the-agent).
+ [grant the agent access to the new project](agent/ci_cd_workflow.md#authorize-the-agent).
1. In the new project, create an
[environment variable](../../ci/variables/index.md#add-a-cicd-variable-to-a-project) named `$KUBE_CONTEXT`
and set the value to `path/to/agent-configuration-project:your-agent-name`.
@@ -78,7 +78,7 @@ This image contains a set of Bash utility scripts to support [Helm v3 releases](
The template contains a [Helmfile](https://github.com/roboll/helmfile) you can use to manage
cluster applications with [Helm v3](https://helm.sh/).
-This file has a list of paths to other Helmfiles for each app. They're all commented out by default, so you must uncomment
+This file has a list of paths to other Helm files for each app. They're all commented out by default, so you must uncomment
the paths for the apps that you would like to use in your cluster.
By default, each `helmfile.yaml` in these sub-paths has the attribute `installed: true`. This means that every time
@@ -93,12 +93,7 @@ application in the template.
The [built-in supported applications](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/tree/master/applications) are:
-- [Apparmor](../infrastructure/clusters/manage/management_project_applications/apparmor.md)
- [Cert-manager](../infrastructure/clusters/manage/management_project_applications/certmanager.md)
-- [Cilium](../infrastructure/clusters/manage/management_project_applications/cilium.md)
-- [Elastic Stack](../infrastructure/clusters/manage/management_project_applications/elasticstack.md)
-- [Falco](../infrastructure/clusters/manage/management_project_applications/falco.md)
-- [Fluentd](../infrastructure/clusters/manage/management_project_applications/fluentd.md)
- [GitLab Runner](../infrastructure/clusters/manage/management_project_applications/runner.md)
- [Ingress](../infrastructure/clusters/manage/management_project_applications/ingress.md)
- [Prometheus](../infrastructure/clusters/manage/management_project_applications/prometheus.md)
diff --git a/doc/user/clusters/migrating_from_gma_to_project_template.md b/doc/user/clusters/migrating_from_gma_to_project_template.md
index 09453262fbb..9a59d135fa0 100644
--- a/doc/user/clusters/migrating_from_gma_to_project_template.md
+++ b/doc/user/clusters/migrating_from_gma_to_project_template.md
@@ -6,8 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Migrate from GitLab Managed Apps to Cluster Management Projects **(FREE)**
-The [GitLab Managed Apps](applications.md) were deprecated in GitLab 14.0
-in favor of [Cluster Management Projects](management_project.md).
+The GitLab Managed Apps were deprecated in GitLab 14.0
+in favor of user-controlled Cluster Management projects.
Managing your cluster applications through a project enables you a
lot more flexibility to manage your cluster than through the late GitLab Managed Apps.
To migrate to the cluster management project you need
@@ -21,8 +21,10 @@ follow the steps below.
See also [video walk-throughs](#video-walk-throughs) with examples.
1. Create a new project based on the [Cluster Management Project template](management_project_template.md#create-a-project-based-on-the-cluster-management-project-template).
-1. [Associate your new Cluster Management Project with your cluster](management_project.md#associate-the-cluster-management-project-with-the-cluster).
+1. [Install an agent](agent/install/index.md) for this project in your cluster.
+1. Set the `KUBE_CONTEXT` CI/CD variable to the newly installed agent's context, as instructed in the `.gitlab-ci.yml` from the Project Template.
1. Detect apps deployed through Helm v2 releases by using the pre-configured [`.gitlab-ci.yml`](management_project_template.md#the-gitlab-ciyml-file) file:
+
- In case you had overwritten the default GitLab Managed Apps namespace, edit `.gitlab-ci.yml`,
and make sure the script is receiving the correct namespace as an argument:
@@ -92,6 +94,7 @@ See also [video walk-throughs](#video-walk-throughs) with examples.
chart version proposed in `applications/vault/values.yaml`.
- Cert-manager:
+
- For users on Kubernetes version 1.20 or above, the deprecated cert-manager v0.10 is no longer valid
and the upgrade includes a breaking change. So we suggest that you [backup and uninstall cert-manager v0.10](#backup-and-uninstall-cert-manager-v010),
and install the latest cert-manager instead. To install this version, uncomment `applications/cert-manager/helmfile.yaml`
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
index a2172b72572..659c0326728 100644
--- a/doc/user/compliance/license_compliance/index.md
+++ b/doc/user/compliance/license_compliance/index.md
@@ -134,7 +134,7 @@ License Compliance can be configured using CI/CD variables.
| `ASDF_PYTHON_VERSION` | no | Version of Python to use for the scan. [Configuration](#selecting-the-version-of-python) |
| `ASDF_RUBY_VERSION` | no | Version of Ruby to use for the scan. |
| `GRADLE_CLI_OPTS` | no | Additional arguments for the Gradle executable. If not supplied, defaults to `--exclude-task=test`. |
-| `LICENSE_FINDER_CLI_OPTS` | no | Additional arguments for the `license_finder` executable. For example, if you have multiple projects in nested directories, you can update your `.gitlab-ci-yml` template to specify a recursive scan, like `LICENSE_FINDER_CLI_OPTS: '--recursive'`. |
+| `LICENSE_FINDER_CLI_OPTS` | no | Additional arguments for the `license_finder` executable. For example, if you have multiple projects in nested directories, you can update your `.gitlab-ci.yml` template to specify a recursive scan, like `LICENSE_FINDER_CLI_OPTS: '--recursive'`. |
| `LM_JAVA_VERSION` | no | Version of Java. If set to `11`, Maven and Gradle use Java 11 instead of Java 8. [Configuration](#selecting-the-version-of-java) |
| `LM_PYTHON_VERSION` | no | Version of Python. If set to `3`, dependencies are installed using Python 3 instead of Python 2.7. [Configuration](#selecting-the-version-of-python) |
| `MAVEN_CLI_OPTS` | no | Additional arguments for the `mvn` executable. If not supplied, defaults to `-DskipTests`. |
@@ -506,7 +506,7 @@ example:
}
```
-If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/index.md#protect-a-cicd-variable)
+If credentials are required to authenticate then you can configure a [protected CI/CD variable](../../../ci/variables/index.md#protected-cicd-variables)
following the naming convention described in the [`CONAN_LOGIN_USERNAME` documentation](https://docs.conan.io/en/latest/reference/env_vars.html#conan-login-username-conan-login-username-remote-name).
#### Custom root certificates for Conan
@@ -853,7 +853,7 @@ A full list of variables can be found in [CI/CD variables](#available-cicd-varia
To find out what tools are pre-installed in the `license_scanning` Docker image use the following command:
```shell
-$ docker run --entrypoint='' registry.gitlab.com/security-products/license-finder:3 /bin/bash -lc 'asdf list'
+$ docker run --entrypoint='' registry.gitlab.com/security-products/license-finder:4 /bin/bash -lc 'asdf list'
golang
1.14
gradle
@@ -880,7 +880,7 @@ sbt
To interact with the `license_scanning` runtime environment use the following command:
```shell
-$ docker run -it --entrypoint='' registry.gitlab.com/security-products/license-finder:3 /bin/bash -l
+$ docker run -it --entrypoint='' registry.gitlab.com/security-products/license-finder:4 /bin/bash -l
root@6abb70e9f193:~#
```
diff --git a/doc/user/crm/index.md b/doc/user/crm/index.md
index 7fc11add2cd..7a400205e30 100644
--- a/doc/user/crm/index.md
+++ b/doc/user/crm/index.md
@@ -6,12 +6,13 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Customer relations management (CRM) **(FREE)**
-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 `customer_relations`.
-On GitLab.com, this feature is not available.
-
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2256) in GitLab 14.6 [with a flag](../../administration/feature_flags.md) named `customer_relations`. Disabled by default.
> - In GitLab 14.8 and later, you can [create contacts and organizations only in root groups](https://gitlab.com/gitlab-org/gitlab/-/issues/350634).
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/346082) 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 `customer_relations`.
+On GitLab.com, this feature is available.
With customer relations management (CRM) you can create a record of contacts
(individuals) and organizations (companies) and relate them to issues.
@@ -118,7 +119,7 @@ organizations using the GraphQL API.
### View issues linked to a contact
-To view a contact's issues:
+To view a contact's issues, select a contact from the issue sidebar, or:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Customer relations > Contacts**.
@@ -166,11 +167,12 @@ API.
## Autocomplete contacts **(FREE SELF)**
-> [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.
+> - [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 not available. To make it available, ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `contacts_autocomplete`.
-On GitLab.com, this feature is not available.
+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.
This feature is not ready for production use.
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/add_internal_note_v15_0.png b/doc/user/discussions/img/add_internal_note_v15_0.png
new file mode 100644
index 00000000000..cf052edd5e7
--- /dev/null
+++ b/doc/user/discussions/img/add_internal_note_v15_0.png
Binary files differ
diff --git a/doc/user/discussions/img/confidential_comments_v13_9.png b/doc/user/discussions/img/confidential_comments_v13_9.png
deleted file mode 100644
index b5be5a622a9..00000000000
--- a/doc/user/discussions/img/confidential_comments_v13_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/create-new-issue_v14_3.png b/doc/user/discussions/img/create-new-issue_v14_3.png
deleted file mode 100644
index d76fed6cb42..00000000000
--- a/doc/user/discussions/img/create-new-issue_v14_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/create-new-issue_v15.png b/doc/user/discussions/img/create-new-issue_v15.png
new file mode 100644
index 00000000000..779196b6ba4
--- /dev/null
+++ b/doc/user/discussions/img/create-new-issue_v15.png
Binary files differ
diff --git a/doc/user/discussions/img/unresolved_threads_v14_1.png b/doc/user/discussions/img/unresolved_threads_v14_1.png
deleted file mode 100644
index 806dfdc995c..00000000000
--- a/doc/user/discussions/img/unresolved_threads_v14_1.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/discussions/img/unresolved_threads_v15.png b/doc/user/discussions/img/unresolved_threads_v15.png
new file mode 100644
index 00000000000..113af20effc
--- /dev/null
+++ b/doc/user/discussions/img/unresolved_threads_v15.png
Binary files differ
diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md
index 8537856ef25..97c3d5f1058 100644
--- a/doc/user/discussions/index.md
+++ b/doc/user/discussions/index.md
@@ -150,42 +150,45 @@ Notes are added to the page details.
If an issue or merge request is locked and closed, you cannot reopen it.
-## Mark a comment as confidential **(FREE SELF)**
+## Add an internal note
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207473) in GitLab 13.9 [with a flag](../../administration/feature_flags.md) named `confidential_notes`. Disabled by default.
> - [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 not available. To make it available,
-ask an administrator to [enable the feature flag](../../administration/feature_flags.md) named `confidential_notes`.
-On GitLab.com, this feature is not available.
-You should not use this feature for production environments.
+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.
-You can make a comment **in an issue or an epic** confidential, so that it is visible only to you (the commenting user) and
-the project members who have at least the Reporter role.
+You can add an internal note **to an issue or an epic**. It's then visible only to the following people:
+
+- Project members who have at least the Reporter role
+- Issue or epic author
+- Users assigned to the issue or epic
Keep in mind:
-- You can only mark comments as confidential when you create them.
-- You can't change the confidentiality of existing comments.
-- Replies to comments use same confidentiality as the original comment.
+- Replies to internal notes are also internal.
+- You can not turn an internal note into a regular comment.
Prerequisites:
- You must either:
- Have at least the Reporter role for the project.
- - Be the issue assignee.
- - Be the issue author.
+ - Be the issue or epic assignee.
+ - Be the issue or epic author.
-To mark a comment as confidential:
+To add an internal note:
1. Start adding a new comment.
-1. Below the comment, select the **Make this comment confidential** checkbox.
-1. Select **Comment**.
+1. Below the comment, select the **Make this an internal note** checkbox.
+1. Select **Add internal note**.
-![Confidential comments](img/confidential_comments_v13_9.png)
+![Internal notes](img/add_internal_note_v15_0.png)
-You can also make an [entire issue confidential](../project/issues/confidential_issues.md).
+You can also mark an [issue as confidential](../project/issues/confidential_issues.md).
## Show only comments
@@ -300,7 +303,7 @@ To resolve a thread:
At the top of the page, the number of unresolved threads is updated:
-![Count of unresolved threads](img/unresolved_threads_v14_1.png)
+![Count of unresolved threads](img/unresolved_threads_v15.png)
### Move all unresolved threads in a merge request to an issue
@@ -308,7 +311,7 @@ If you have multiple unresolved threads in a merge request, you can
create an issue to resolve them separately. In the merge request, at the top of the page,
select **Create issue to resolve all threads** (**{issue-new}**):
-![Open new issue for all unresolved threads](img/create-new-issue_v14_3.png)
+![Open new issue for all unresolved threads](img/create-new-issue_v15.png)
All threads are marked as resolved, and a link is added from the merge request to
the newly created issue.
@@ -327,12 +330,13 @@ the newly created issue.
### Prevent merge unless all threads are resolved
You can prevent merge requests from being merged until all threads are
-resolved.
+resolved. When this setting is enabled, the **Unresolved threads** counter in a merge request
+is shown in orange when at least one thread remains unresolved.
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Settings > General**.
1. Expand **Merge requests**.
-1. Under **Merge checks**, select the **All discussions must be resolved** checkbox.
+1. Under **Merge checks**, select the **All threads must be resolved** checkbox.
1. Select **Save changes**.
### Automatically resolve threads in a merge request when they become outdated
@@ -344,7 +348,7 @@ with a new push.
1. On the left sidebar, select **Settings > General**.
1. Expand **Merge requests**.
1. Under **Merge options**, select the
- **Automatically resolve merge request diff discussions when they become outdated** checkbox.
+ **Automatically resolve merge request diff threads when they become outdated** checkbox.
1. Select **Save changes**.
Threads are now resolved if a push makes a diff section outdated.
diff --git a/doc/user/free_user_limit.md b/doc/user/free_user_limit.md
new file mode 100644
index 00000000000..2340ef254f6
--- /dev/null
+++ b/doc/user/free_user_limit.md
@@ -0,0 +1,60 @@
+---
+stage: Growth
+group: Conversion
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+---
+
+# Free user limit **(FREE SAAS)**
+
+In GitLab 15.1 (June 22, 2022) and later, namespaces in GitLab.com on the Free tier
+will be limited to five (5) members per [namespace](group/index.md#namespaces).
+This limit applies to top-level groups and personal namespaces.
+
+In a personal namespace, the limit applies across all projects in your personal
+namespace.
+
+On the transition date, if your namespace has six or more unique members:
+
+- Five members will keep a status of `Active`.
+- Remaining members will get a status of `Over limit` and lose access to the
+ group.
+- Members invited through a group or project invitation outside of the namespace
+ will be removed. You can add these members back by inviting them through their
+ username or email address on the **Members** page for your group or project.
+
+## How active members are determined
+
+On the transition date, we'll automatically select the members who keep their `Active` status
+in the following order, until we reach a total of five:
+
+1. Members with the Owner or Maintainer role.
+1. The most recently active members.
+
+## Manage members in your namespace
+
+To help manage your free user limit,
+you can view and manage the total number of members across all projects and groups
+in your namespace.
+
+Prerequisite:
+
+- You must have the Owner role for the group.
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > Usage Quotas**.
+1. To view all members, select the **Seats** tab.
+1. To remove a member, select **Remove user**.
+
+NOTE:
+The **Usage Quotas** page is not available for personal namespaces. You can
+view and [remove members](project/members/index.md#remove-a-member-from-a-project)
+in each project instead. The five user limit includes all
+unique members across all projects in your personal namespace.
+
+If you need more time to manage your members, or to try GitLab features
+with a team of more than five members, you can [start a trial](https://about.gitlab.com/free-trial/).
+A trial lasts for 30 days and includes an unlimited number of members.
+
+## Related topics
+
+- [GitLab SaaS Free tier frequently asked questions](https://about.gitlab.com/pricing/faq-efficient-free-tier/)
diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md
index 6bb45575fc3..e88777a7223 100644
--- a/doc/user/gitlab_com/index.md
+++ b/doc/user/gitlab_com/index.md
@@ -9,6 +9,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
This page contains information about the settings that are used on GitLab.com, available to
[GitLab SaaS](https://about.gitlab.com/pricing/) customers.
+See some of these settings on the [instance configuration page](https://gitlab.com/help/instance_configuration) of GitLab.com.
+
## Password requirements
GitLab.com has the following requirements for passwords on new accounts and password changes:
@@ -97,6 +99,10 @@ If you are on:
- Premium tier and above, you can disable this by changing the [group setting](../group/index.md#enable-delayed-project-deletion).
- Free tier, you cannot disable this setting or restore projects.
+## Inactive project deletion
+
+[Inactive project deletion](../../administration/inactive_project_deletion.md) is disabled on GitLab.com.
+
## Alternative SSH port
GitLab.com can be reached by using a [different SSH port](https://about.gitlab.com/blog/2016/02/18/gitlab-dot-com-now-supports-an-alternate-git-plus-ssh-port/) for `git+ssh`.
@@ -127,9 +133,9 @@ Below are the settings for [GitLab Pages](https://about.gitlab.com/stages-devops
| IP address | `35.185.44.232` | - |
| Custom domains support | **{check-circle}** Yes | **{dotted-circle}** No |
| TLS certificates support | **{check-circle}** Yes | **{dotted-circle}** No |
-| Maximum size (compressed) | 1 GB | 100 MB |
+| [Maximum size](../../administration/pages/index.md#set-global-maximum-pages-size-per-project) (compressed) | 1 GB | 100 MB |
-The maximum size of your Pages site is regulated by the artifacts maximum size,
+The maximum size of your Pages site is also regulated by the artifacts maximum size,
which is part of [GitLab CI/CD](#gitlab-cicd).
There are also [rate limits set for GitLab Pages](#gitlabcom-specific-rate-limits).
@@ -330,7 +336,7 @@ after the limits change in January, 2021:
| **Authenticated** API traffic (for a given **user**) | **2,000** requests per minute | **2,000** requests per minute |
| **Authenticated** non-API HTTP traffic (for a given **user**) | **1,000** requests per minute | **1,000** requests per minute |
| **All** traffic (from a given **IP address**) | **2,000** requests per minute | **2,000** requests per minute |
-| **Issue creation** | **300** requests per minute | **300** requests per minute |
+| **Issue creation** | **300** requests per minute | **200** requests per minute |
| **Note creation** (on issues and merge requests) | **60** requests per minute | **60** requests per minute |
| **Advanced, project, and group search** API (for a given **IP address**) | **10** requests per minute | **10** requests per minute |
| **GitLab Pages** requests (for a given **IP address**) | | **1000** requests per **50 seconds** |
diff --git a/doc/user/group/epics/linked_epics.md b/doc/user/group/epics/linked_epics.md
index b695bae39e4..89699661efa 100644
--- a/doc/user/group/epics/linked_epics.md
+++ b/doc/user/group/epics/linked_epics.md
@@ -6,12 +6,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Linked epics **(ULTIMATE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353473) in GitLab 14.9 [with a flag](../../../administration/feature_flags.md) named `related_epics_widget`. 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 `related_epics_widget`. On GitLab.com, this feature is available.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/353473) in GitLab 14.9 [with a flag](../../../administration/feature_flags.md) named `related_epics_widget`. Enabled by default.
+> - [Feature flag `related_epics_widget`](https://gitlab.com/gitlab-org/gitlab/-/issues/357089) removed in GitLab 15.0.
Linked epics are a bi-directional relationship between any two epics and appear in a block below
the epic description. You can link epics in different groups.
@@ -38,7 +34,11 @@ To link one epic to another:
- **relates to**
- **[blocks](#blocking-epics)**
- **[is blocked by](#blocking-epics)**
-1. Enter the epic number or paste in the full URL of the epic.
+1. To enter the linked epic, either:
+
+ - Enter `&`, followed by the epic's number. For example, `&123`.
+ - Enter `&`, followed by a word from the epic's title. For example, `&Deliver`.
+ - Paste in the epic's full URL.
![Adding a related epic](img/related_epics_add_v14_9.png)
diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md
index 0185cb9cfdf..6967815bf22 100644
--- a/doc/user/group/import/index.md
+++ b/doc/user/group/import/index.md
@@ -132,6 +132,8 @@ migrated:
- image URL
- Boards
- Board Lists
+- Releases
+ - Milestones ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339422) in GitLab 15.0).
## Troubleshooting Group Migration
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 085cd054c14..87146329031 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -53,7 +53,7 @@ For example, consider a user named Alex:
| 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 cases is `alex-team`. |
+| 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`. |
## Create a group
@@ -279,7 +279,7 @@ To view the activity feed in Atom format, select the
Similar to how you [share a project with a group](../project/members/share_project_with_groups.md),
you can share a group with another group. To invite a group, you must be a member of it. Members get direct access
-to the shared group. This includes members who inherited group membership from a parent group.
+to the shared group. This includes members who inherited group membership from a parent group.
To share a given group, for example, `Frontend` with another group, for example,
`Engineering`:
@@ -456,25 +456,28 @@ To restore a group that is marked for deletion:
## Prevent group sharing outside the group hierarchy
-This setting is only available on top-level groups. It affects all subgroups.
+You can configure a top-level group so its subgroups and projects
+cannot invite other groups outside of the top-level group's hierarchy.
+This option is only available for top-level groups.
-When checked, any group in the top-level group hierarchy can be shared only with other groups in the hierarchy.
+For example, in the following group and project hierarchy:
-For example, with these groups:
-
-- **Animals > Dogs**
+- **Animals > Dogs > Dog Project**
- **Animals > Cats**
- **Plants > Trees**
-If you select this setting in the **Animals** group:
+If you prevent group sharing outside the hierarchy for the **Animals** group:
-- **Dogs** can be shared with **Cats**.
-- **Dogs** cannot be shared with **Trees**.
+- **Dogs** can invite the group **Cats**.
+- **Dogs** cannot invite the group **Trees**.
+- **Dog Project** can invite the group **Cats**.
+- **Dog Project** cannot invite the group **Trees**.
To prevent sharing outside of the group's hierarchy:
-1. Go to the group's **Settings > General** page.
-1. Expand the **Permissions and group features** section.
+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 **Save changes**.
@@ -610,15 +613,16 @@ applies to:
You should consider these security implications before configuring IP address restrictions:
-- **SSH requests**: While you can restrict HTTP traffic on GitLab.com with IP address restrictions,
+- **SSH requests, including `git` operations will fail from all IP addresses**: While you can restrict HTTP traffic on GitLab.com with IP address restrictions,
they cause SSH requests, including Git operations over SSH, to fail. For more information,
read [issue 271673](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
-- **Administrators and group owners**: Users with these permission levels can always
+- **Administrators and group owners can access group settings from any IP address**: Users with these permission levels can always
access the group settings, regardless of IP restriction, but they cannot access projects
belonging to the group when accessing from a disallowed IP address.
-- **GitLab API and runner activities**: Only the [group](../../api/groups.md) (including all
+- **Some GitLab API endpoints will remain accessible from any IP**: Only the [group](../../api/groups.md) (including all
[group resources](../../api/api_resources.md#group-resources)) APIs and [project](../../api/api_resources.md#project-resources)
(including all [project resources](../../api/api_resources.md#project-resources)) APIs are protected by IP address restrictions.
+- **Activities performed by GitLab Runners are not bound by IP restrictions**:
When you register a runner, it is not bound by the IP restrictions. When the runner
requests a new job or an update to a job's state, it is also not bound by
the IP restrictions. But when the running CI/CD job sends Git requests from a
diff --git a/doc/user/group/iterations/index.md b/doc/user/group/iterations/index.md
index 1c316f2157d..858b13b87b8 100644
--- a/doc/user/group/iterations/index.md
+++ b/doc/user/group/iterations/index.md
@@ -41,7 +41,8 @@ From there you can create a new iteration or select an iteration to get a more d
## Create an iteration
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
WARNING:
Manual iteration management is in its end-of-life process. Creating an iteration is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
@@ -49,7 +50,7 @@ in GitLab 14.10, and is planned for removal in GitLab 16.0.
Prerequisites:
-- You must have at least the Developer role for a group.
+- You must have at least the Reporter role for a group.
To create an iteration:
@@ -63,6 +64,7 @@ To create an iteration:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218277) in GitLab 13.2.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
WARNING:
Editing all attributes, with the exception of `description` is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
@@ -71,7 +73,7 @@ In the future only editing an iteration's `description` will be allowed.
Prerequisites:
-- You must have at least the Developer role for a group.
+- You must have at least the Reporter role for a group.
To edit an iteration, select the three-dot menu (**{ellipsis_v}**) > **Edit**.
@@ -79,6 +81,7 @@ To edit an iteration, select the three-dot menu (**{ellipsis_v}**) > **Edit**.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/292268) in GitLab 14.3.
> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069) in GitLab 14.10.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
WARNING:
Manual iteration management is in its end-of-life process. Deleting an iteration is [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/356069)
@@ -86,7 +89,7 @@ in GitLab 14.10, and is planned for removal in GitLab 16.0.
Prerequisites:
-- You must have at least the Developer role for a group.
+- You must have at least the Reporter role for a group.
To delete an iteration, select the three-dot menu (**{ellipsis_v}**) > **Delete**.
@@ -169,37 +172,65 @@ To group issues by label:
## Iteration cadences
-> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5077) in GitLab 14.1.
-> - Deployed behind a [feature flag](../../feature_flags.md), named `iteration_cadences`, 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
-`iteration_cadences` for a root group.
-On GitLab.com, this feature is not available. This feature is not ready for production use.
+> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/5077) in GitLab 14.1 [with a flag](../../../administration/feature_flags.md), named `iteration_cadences`. Disabled by default.
+> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/354977) in GitLab 15.0: All scheduled iterations must start on the same day of the week as the cadence start day. Start date of cadence cannot be edited after the first iteration starts.
+> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/354878) in GitLab 15.0.
Iteration cadences automate iteration scheduling. You can use them to
-automate creating iterations every 1, 2, 3, 4, or 6 weeks. You can also
+automate creating iterations every 1, 2, 3, or 4 weeks. You can also
configure iteration cadences to automatically roll over incomplete issues to the next iteration.
### Create an iteration cadence
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
+
Prerequisites:
-- You must have at least the Developer role for a group.
+- You must have at least the Reporter role for a group.
To create an iteration cadence:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Issues > Iterations**.
1. Select **New iteration cadence**.
-1. Fill out required fields, and select **Create iteration cadence**. The cadence list page opens.
+1. Complete the fields.
+ - Enter the title and description of the iteration cadence.
+ - Enter the first iteration start date of the iteration cadence. Iterations will be scheduled to
+ begin on the same day of the week as the day of the week of the start date.
+ - From the **Duration** dropdown list, select how many weeks each iteration should last.
+ - From the **Upcoming iterations** dropdown list, select how many upcoming iterations should be
+ created and maintained by GitLab.
+ - Optional. To move incomplete issues to the next iteration, select **Roll over issues**.
+1. Select **Create cadence**. The cadence list page opens.
+
+### Edit an iteration cadence
+
+Prerequisites:
+
+- You must have at least the Developer role for a group.
+
+To edit an iteration cadence:
+
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Issues > Iterations**.
+1. Select **Edit iteration cadence**.
+
+When you edit the **Duration**, **Upcoming iterations**, or **First iteration start date** fields,
+only upcoming iterations are affected.
+
+You can edit the first iteration start date of a cadence if the cadence has not started yet.
+
+Editing **Upcoming iterations** is a non-destructive action.
+If ten upcoming iterations already exist, changing the number under **Upcoming iterations** to `2`
+doesn't delete the eight existing upcoming iterations.
### Delete an iteration cadence
+> [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
+
Prerequisites:
-- You must have at least the Developer role for a group.
+- You must have at least the Reporter role for a group.
Deleting an iteration cadence also deletes all iterations within that cadence.
@@ -210,18 +241,67 @@ To delete an iteration cadence:
1. Select the three-dot menu (**{ellipsis_v}**) > **Delete cadence** for the cadence you want to delete.
1. Select **Delete cadence** in the confirmation modal.
-### Convert manual cadence to use automatic scheduling
+### Manual iteration cadences
+
+When you **enable** the iteration cadences feature, all previously
+created iterations are added to a default iteration cadence.
+You can continue to add, edit, and remove iterations in
+this default cadence.
+
+#### Convert a manual cadence to use automatic scheduling
WARNING:
-The upgrade is irreversible. After it's done, manual iteration cadences cannot be created.
+The upgrade is irreversible. After it's done, a new manual iteration cadence cannot be created.
-When you **enable** the iteration cadences feature, all iterations are added
-to a default iteration cadence.
-In this default iteration cadence, you can continue to add, edit, and remove iterations.
+Prerequisites:
+- You must have created [iterations](#iterations) without cadences before enabling iteration cadences for your group.
To upgrade the iteration cadence to use the automation features:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Issues > Iterations**.
1. Select the three-dot menu (**{ellipsis_v}**) > **Edit cadence** for the cadence you want to upgrade.
-1. Fill out required fields, and select **Save changes**.
+1. Complete the required fields **Duration** and **Upcoming iterations**.
+1. Select **Save changes**.
+
+#### Start dates of converted cadences
+
+The first iteration start date of your converted cadence is set to the start date of its
+**first** existing iteration.
+
+If you attempt to set a new start date, the conversion fails with an error message.
+If your manual cadence is empty, converting it to use automatic scheduling is effectively
+the same as creating a new automated cadence.
+
+GitLab will start scheduling new iterations on the same day of the week as the start date,
+starting from the nearest such day from the current date.
+
+During the conversion process GitLab does not delete or modify existing **ongoing** or
+**closed** iterations. If you have iterations with start dates in the future,
+they are updated to fit your cadence settings.
+
+#### Converted cadences example
+
+For example, suppose it's Friday, April 15, and you have three iterations in a manual cadence:
+
+- Monday, April 4 - Friday, April 8 (closed)
+- Tuesday, April 12 - Friday, April 15 (ongoing)
+- Tuesday, May 3 - Friday, May 6 (upcoming)
+
+On Friday, April 15, you convert the manual cadence
+to automate scheduling iterations every week, up to two upcoming iterations.
+
+The first iteration is closed, and the second iteration is ongoing,
+so they aren't deleted or modified in the conversion process.
+
+To observe the weekly duration, the third iteration is updated so that it:
+
+- Starts on Monday, April 18 - which is the nearest date that is Monday.
+- Ends on Sunday, April 24.
+
+Finally, to always have two upcoming iterations, an additional iteration is scheduled:
+
+- Monday, April 4 - Friday, April 8 (closed)
+- Tuesday, April 12 - Friday, April 15 (ongoing)
+- Monday, April 18 - Sunday, April 24 (upcoming)
+- Monday, April 25 - Sunday, May 1 (upcoming)
diff --git a/doc/user/group/roadmap/index.md b/doc/user/group/roadmap/index.md
index 89c5c6ed466..10ca6d139ad 100644
--- a/doc/user/group/roadmap/index.md
+++ b/doc/user/group/roadmap/index.md
@@ -1,5 +1,4 @@
---
-type: reference
stage: Plan
group: Product Planning
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
@@ -7,7 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Roadmap **(PREMIUM)**
-> - Introduced in GitLab 10.5.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/198062) from GitLab Ultimate to GitLab Premium in 12.9.
> - In [GitLab 12.9](https://gitlab.com/gitlab-org/gitlab/-/issues/5164) and later, the epic bars show epics' title, progress, and completed weight percentage.
> - Milestones appear in roadmaps in [GitLab 12.10](https://gitlab.com/gitlab-org/gitlab/-/issues/6802), and later.
@@ -27,10 +25,10 @@ You can expand epics that contain child epics to show their child epics in the r
You can select the chevron (**{chevron-down}**) next to the epic title to expand and collapse the
child epics.
-On top of the milestone bars, you can see their title.
-When you hover over a milestone bar or title, a popover appears with its title, start date, and due
-date. You can also select the chevron (**{chevron-down}**) next to the **Milestones** heading to
-toggle the list of the milestone bars.
+On top of the milestone bars, you can see their title. When you point to a
+milestone bar or title, a popover appears with its title, start date, and due
+date. You can also select the chevron (**{chevron-down}**) next to the **Milestones**
+heading to toggle the list of the milestone bars.
![roadmap view](img/roadmap_view_v14_3.png)
@@ -41,8 +39,8 @@ toggle the list of the milestone bars.
> - Filtering by epic [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218623) in GitLab 13.11.
> - Filtering by milestone [feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/323917) in GitLab 14.5.
-WARNING:
-Filtering roadmaps by milestone might not be available to you. Check the **version history** note above for details.
+NOTE:
+Filtering roadmaps by milestone might not be available to you. Be sure to review this section's version history for details.
When you want to explore a roadmap, there are several ways to make it easier by sorting epics or
filtering them by what's important for you.
@@ -52,8 +50,9 @@ You can sort epics in the Roadmap view by:
- Start date
- Due date
-Each option contains a button that toggles the sort order between **ascending** and **descending**.
-The sort option and order persist when browsing Epics, including the [epics list view](../epics/index.md).
+Each option contains a button that toggles the sort order between **ascending**
+and **descending**. The sort option and order persist when browsing Epics, including
+the [epics list view](../epics/index.md).
You can also filter epics in the Roadmap view by the epics':
@@ -66,7 +65,7 @@ You can also filter epics in the Roadmap view by the epics':
![roadmap date range in weeks](img/roadmap_filters_v13_11.png)
-Roadmaps can also be [visualized inside an epic](../epics/index.md#roadmap-in-epics).
+You can also [visualize roadmaps inside of an epic](../epics/index.md#roadmap-in-epics).
### Roadmap settings
@@ -78,38 +77,40 @@ When you enable the roadmap settings sidebar, you can use it to refine epics sho
You can configure the following:
- Select date range.
-- Turn milestones on or off and select whether to show all, group, subgroup, or project milestones.
+- Turn milestones on or off, and select whether to show all, group, subgroup, or
+ project milestones.
- Show all, open, or closed epics.
- Turn progress tracking for child issues on or off and select whether
to use issue weights or counts.
- The progress tracking setting is not saved in user preferences but is saved or shared using URL parameters.
+The progress tracking setting isn't saved in user preferences, but is saved or
+shared using URL parameters.
## Timeline duration
-> - Introduced in GitLab 11.0.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/198062) from GitLab Ultimate to GitLab Premium in 12.9.
+> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/198062) from GitLab Ultimate to GitLab Premium in 12.9.
### Date range presets
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/204994) in GitLab 14.3. [Deployed behind the `roadmap_daterange_filter` flag](../../../administration/feature_flags.md), disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/204994) in GitLab 14.3 [with a flag](../../../administration/feature_flags.md) named `roadmap_daterange_filter`. Disabled by default.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/323917) in GitLab 14.3.
-> - [Feature flag `roadmap_daterange_filter` removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72419) in GitLab 14.5.
+> - Generally available in GitLab 14.5. [Feature flag `roadmap_daterange_filter`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72419) removed.
-Roadmap provides three date range options, each with predetermined timeline duration:
+Roadmap provides these date range options, each with a predetermined timeline duration:
-- **This quarter**: includes weeks present in current quarter.
-- **This year**: includes weeks or months present in current year.
-- **Within 3 years**: includes weeks, months, or quarters present in the previous 18 months and
- upcoming 18 months (that is, three years in total).
+- **This quarter**: Includes the weeks present in the current quarter.
+- **This year**: Includes the weeks or months present in the current year.
+- **Within 3 years**: Includes the weeks, months, or quarters present both in
+ the previous 18 months and the upcoming 18 months (three years in total).
### Layout presets
-Depending on selected [date range preset](#date-range-presets), Roadmap supports the following layout presets:
+Depending on selected [date range preset](#date-range-presets), Roadmap supports
+these layout presets:
-- **Quarters**: only available when the "Within 3 years" date range is selected.
-- **Months**: available when either "This year" or "Within 3 years" date range is selected.
-- **Weeks** (default): available for all the date range presets.
+- **Quarters**: Available only when the **Within 3 years** date range is selected.
+- **Months**: Available when either **This year** or **Within 3 years** date range is selected.
+- **Weeks** (default): Available for all the date range presets.
### Quarters
@@ -125,12 +126,11 @@ the timeline header represent the month of the quarter.
![roadmap date range in months](img/roadmap_timeline_months.png)
-In the **Months** preset, roadmap shows epics and milestones which have start or due dates
-**falling within** or
-**going through** currently selected date range preset, where **today**
-is shown by the vertical red line in the timeline. The sub-headers underneath the month name on
-the timeline header represent the date on starting day (Sunday) of the week. This preset is
-selected by default.
+In the **Months** preset, roadmap shows epics and milestones which have start or
+due dates **falling within** or **going through** currently selected date range
+preset, where **today** is shown by the vertical red line in the timeline. The
+sub-headers underneath the month name on the timeline header represent the date
+on the start day (Sunday) of the week. This preset is selected by default.
### Weeks
diff --git a/doc/user/group/saml_sso/group_managed_accounts.md b/doc/user/group/saml_sso/group_managed_accounts.md
index bffaef40800..6771ff8739a 100644
--- a/doc/user/group/saml_sso/group_managed_accounts.md
+++ b/doc/user/group/saml_sso/group_managed_accounts.md
@@ -107,14 +107,14 @@ Since personal access tokens are the only token needed for programmatic access t
### Set a limit
Only a GitLab administrator or an owner of a group-managed account can set a limit. When this field
-is left empty, the [instance-level restriction](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens)
+is left empty, the [instance-level restriction](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens)
on the lifetime of personal access tokens apply.
To set a limit on how long personal access tokens are valid for users in a group managed account:
1. Navigate to the **Settings > General** page in your group's sidebar.
1. Expand the **Permissions and group features** section.
-1. Fill in the **Maximum allowable lifetime for personal access tokens (days)** field.
+1. Fill in the **Maximum allowable lifetime for access tokens (days)** field.
1. Click **Save changes**.
Once a lifetime for personal access tokens is set:
diff --git a/doc/user/group/saml_sso/index.md b/doc/user/group/saml_sso/index.md
index 4d122e337db..1b480a52920 100644
--- a/doc/user/group/saml_sso/index.md
+++ b/doc/user/group/saml_sso/index.md
@@ -129,7 +129,7 @@ SSO has the following effects when enabled:
- For Git activity over SSH and HTTPS, users must have at least one active session signed-in through SSO before they can push to or
pull from a GitLab repository.
- Git activity originating from CI/CD jobs do not have the SSO check enforced.
-- Credentials that are not tied to regular users (for example, access tokens and deploy keys) do not have the SSO check enforced.
+- Credentials that are not tied to regular users (for example, project and group access tokens, and deploy keys) do not have the SSO check enforced.
- Users must be signed-in through SSO before they can pull images using the [Dependency Proxy](../../packages/dependency_proxy/index.md).
When SSO is enforced, users are not immediately revoked. If the user:
@@ -589,7 +589,7 @@ Here are possible causes and solutions:
| Cause | Solution |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| You've tried to link multiple SAML identities to the same user, for a given identity provider. | Change the identity that you sign in with. To do so, [unlink the previous SAML identity](#unlinking-accounts) from this GitLab account before attempting to sign in again. |
-| The NameID changes everytime the user requests SSO identification | Check the NameID is not set with `Transient` format, or the NameID is not changing on subsequent requests.|
+| The NameID changes every time the user requests SSO identification | Check the NameID is not set with `Transient` format, or the NameID is not changing on subsequent requests.|
### Message: "SAML authentication failed: Email has already been taken"
diff --git a/doc/user/group/saml_sso/scim_setup.md b/doc/user/group/saml_sso/scim_setup.md
index 3960c97142e..bc1799c2e54 100644
--- a/doc/user/group/saml_sso/scim_setup.md
+++ b/doc/user/group/saml_sso/scim_setup.md
@@ -110,7 +110,7 @@ Before you start this section:
After the above steps are complete:
1. Sign in to Okta.
-1. Ensure you are in the Admin section by selecting the **Admin** button located in the top right. The admin button is not visible from the admin page.
+1. Ensure you are in the Admin Area by selecting the **Admin** button located in the top right. The button is not visible from the Admin Area.
1. In the **Application** tab, select **Browse App Catalog**.
1. Search for **GitLab**, find and select on the 'GitLab' application.
1. On the GitLab application overview page, select **Add**.
diff --git a/doc/user/group/settings/group_access_tokens.md b/doc/user/group/settings/group_access_tokens.md
index 0666303bcf8..4b791d5a221 100644
--- a/doc/user/group/settings/group_access_tokens.md
+++ b/doc/user/group/settings/group_access_tokens.md
@@ -25,7 +25,7 @@ Group access tokens are similar to [project access tokens](../../project/setting
and [personal access tokens](../../profile/personal_access_tokens.md), except they are
associated with a group rather than a project or user.
-In self-managed instances, group access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) as personal access tokens if the limit is set.
+In self-managed instances, group access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) as personal access tokens if the limit is set.
You can use group access tokens:
@@ -50,7 +50,7 @@ To create a group access token:
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Settings > Access Tokens**.
1. Enter a name. The token name is visible to any user with permissions to view the group.
-1. Optional. Enter an expiry date for the token. The token will expire on that date at midnight UTC. An instance-wide [maximum lifetime](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) setting can limit the maximum allowable lifetime in self-managed instances.
+1. Optional. Enter an expiry date for the token. The token will expire on that date at midnight UTC. An instance-wide [maximum lifetime](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) setting can limit the maximum allowable lifetime in self-managed instances.
1. Select a role for the token.
1. Select the [desired scopes](#scopes-for-a-group-access-token).
1. Select **Create group access token**.
diff --git a/doc/user/group/settings/import_export.md b/doc/user/group/settings/import_export.md
index 7b63466656d..23a638fb98c 100644
--- a/doc/user/group/settings/import_export.md
+++ b/doc/user/group/settings/import_export.md
@@ -86,7 +86,7 @@ To export the contents of a group:
NOTE:
The maximum import file size can be set by the Administrator, default is `0` (unlimited).
-As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](../../../api/settings.md#change-application-settings) or the [Admin UI](../../admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8.
+As an administrator, you can modify the maximum import file size. To do so, use the `max_import_size` option in the [Application settings API](../../../api/settings.md#change-application-settings) or the [Admin Area](../../admin_area/settings/account_and_limit_settings.md). Default [modified](https://gitlab.com/gitlab-org/gitlab/-/issues/251106) from 50MB to 0 in GitLab 13.8.
You can also use the [group import/export API](../../../api/group_import_export.md).
diff --git a/doc/user/group/value_stream_analytics/img/new_value_stream_v13_12.png b/doc/user/group/value_stream_analytics/img/new_value_stream_v13_12.png
deleted file mode 100644
index d64ec31aabf..00000000000
--- a/doc/user/group/value_stream_analytics/img/new_value_stream_v13_12.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png b/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png
deleted file mode 100644
index 5ad8026b8fd..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_aggregated_data_toggle_v14_9.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png b/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png
deleted file mode 100644
index 9345c4023de..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_custom_stage_v13_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png b/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png
deleted file mode 100644
index a29689a2c18..00000000000
--- a/doc/user/group/value_stream_analytics/img/vsa_default_stage_v13_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/group/value_stream_analytics/index.md b/doc/user/group/value_stream_analytics/index.md
index 3fce9baa9ce..4be97779603 100644
--- a/doc/user/group/value_stream_analytics/index.md
+++ b/doc/user/group/value_stream_analytics/index.md
@@ -11,6 +11,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
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,
+the [DevOps lifecycle](https://about.gitlab.com/stages-devops-lifecycle/) is a value stream that starts
+with the "manage" stage and ends with the "protect" stage.
+
Use value stream analytics to identify:
- The amount of time it takes to go from an idea to production.
@@ -30,7 +34,7 @@ Value stream analytics is also available for [projects](../../analytics/value_st
Prerequisite:
- You must have at least the Reporter role to view value stream analytics for groups.
-- You must create a [custom value stream](#custom-value-streams). Value stream analytics only shows custom value streams created for your group.
+- You must create a [custom value stream](#create-a-value-stream-with-gitlab-default-stages). Value stream analytics only shows custom value streams created for your group.
To view value stream analytics for your group:
@@ -41,9 +45,6 @@ To view value stream analytics for your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
- 1. Select whether to view metrics for items with a start or stop event:
- - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
- - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date. The charts and list show workflow items created
@@ -78,9 +79,6 @@ To view the median time spent in each stage by a group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
- 1. Select whether to view metrics for items with a start or stop event:
- - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
- - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -91,7 +89,10 @@ To view the median time spent in each stage by a group:
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. Commits are associated with issues when users [cross-link them in the commit message](../../project/issues/crosslinking_issues.md#from-commit-messages).
+- 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:
@@ -101,9 +102,6 @@ To view the lead time and cycle time for issues:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
- 1. Select whether to view metrics for items with a start or stop event:
- - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
- - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -124,9 +122,6 @@ To view the lead time for changes for merge requests in your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
- 1. Select whether to view metrics for items with a start or stop event:
- - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
- - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
@@ -140,7 +135,7 @@ The **Lead Time for Changes** metrics display below the **Filter results** text
To view deployment metrics, you must have a
[production environment configured](../../../ci/environments/index.md#deployment-tier-of-environments).
-Value stream analytics shows the following deployment metrics for your group:
+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.
@@ -153,13 +148,14 @@ To view deployment metrics for your group:
1. Select the **Filter results** text box.
1. Select a parameter.
1. Select a value or enter text to refine the results.
- 1. Select whether to view metrics for items with a start or stop event:
- - To view items with a stop event in the date range, turn on the **Filter by stop date** toggle. Enabled by default.
- - To view items with a start event in the date range, turn off the **Filter by stop date** toggle.
1. To adjust the date range:
- In the **From** field, select a start date.
- In the **To** field, select an end date.
+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 **Deploys** and **Deployment Frequency** metrics display below the **Filter results** text box.
Deployment metrics are calculated based on data from the
@@ -174,19 +170,22 @@ In GitLab 13.8 and earlier, metrics are calculated based on when the deployment
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335391) in GitLab 14.5 [with a flag](../../../administration/feature_flags.md) named `use_vsa_aggregated_tables`. Disabled by default.
> - Filter by stop date toggle [added](https://gitlab.com/gitlab-org/gitlab/-/issues/352428) in GitLab 14.9
> - Data refresh badge [added](https://gitlab.com/gitlab-org/gitlab/-/issues/341739) in GitLab 14.9
+> - Filter by stop date toggle [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84356) in GitLab 14.9
+> - Enable filtering by stop date [added](https://gitlab.com/gitlab-org/gitlab/-/issues/355000) in GitLab 15.0
-Plans for value stream analytics to filter items by stop event instead of start event are tracked in this [epic](https://gitlab.com/groups/gitlab-org/-/epics/6046). With the completion of this work, value stream analytics will only display items with a stop event in the date range.
-
-To preview this functionality, you can use the **Filter by stop date** toggle to enable or disable this filter until the [default filtering mode is introduced](../../../update/deprecations.md#value-stream-analytics-filtering-calculation-change) and the toggle is removed.
+Value stream analytics uses a backend process to collect and aggregate stage-level data, which
+ensures it can scale for large groups with a high number of issues and merge requests. Due to this process,
+there may be a slight delay between when an action is taken (for example, closing an issue) and when the data
+displays on the value stream analytics page.
-If you turn on the **Filter by stop date** toggle, the results show items with a stop event within the date range. When this function is enabled, it may take up to 10 minutes for results to show due to data aggregation. There are occasions when it may take longer than 10 minutes for results to display:
+It may take up to 10 minutes to process the data and display results. Data collection may take
+longer than 10 minutes in the following cases:
-- If this is the first time you are viewing value stream analytics and have not yet [created a value stream](#create-a-value-stream).
+- If this is the first time you are viewing value stream analytics and have not yet [created a value stream](#create-a-value-stream-with-gitlab-default-stages).
- If the group hierarchy has been re-arranged.
- If there have been bulk updates on issues and merge requests.
-To view when the data was most recently updated, in the right corner next to **Edit**, hover over the **Last updated** badge. This badge is only available if you have turned on the **Filter by start date** toggle.
-![Aggregated data toggle](img/vsa_aggregated_data_toggle_v14_9.png "Aggregated data toggle")
+To view when the data was most recently updated, in the right corner next to **Edit**, hover over the **Last updated** badge.
## How value stream analytics measures stages
@@ -261,80 +260,58 @@ These patterns are not case-sensitive.
You can change the name of a project environment in your GitLab CI/CD configuration.
-## Custom value streams
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/12196) in GitLab 12.9.
-
-Use custom value streams to create custom stages that align with your own development processes,
-and hide default stages. The dashboard depicts stages as a horizontal process
-flow.
-
-### Create a value stream
+## Create a value stream with GitLab default stages
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221202) in GitLab 13.3
-A default value stream is readily available for each group. You can create additional value streams
-based on the different areas of work that you would like to measure.
-
-Once created, a new value stream includes the stages that follow
-[GitLab workflow](../../../topics/gitlab_flow.md)
-best practices. You can customize this flow by adding, hiding or re-ordering stages.
-
-To create a value stream:
+When you create a value stream, you can use GitLab default stages and hide or re-order them to customize. You can also
+create custom stages in addition to those provided in the default template.
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Analytics > Value Stream**.
-1. If this is the first time you are creating a value stream, select **Create custom value stream**. Otherwise, in the top right, select the dropdown list and then **Create new Value Stream**.
-1. Enter a name for the new Value Stream.
- - You can [customize the stages](#create-a-value-stream-with-stages).
-1. Select **Create Value Stream**.
-
-![New value stream](img/new_value_stream_v13_12.png "Creating a new value stream")
+1. Select **Create new Value Stream**.
+1. Enter a name for the value stream.
+1. Select **Create from default template**.
+1. Customize the default stages:
+ - To re-order stages, select the up or down arrows.
+ - To hide a stage, select **Hide** (**{eye-slash}**).
+1. To add a custom stage, select **Add another stage**.
+ - Enter a name for the stage.
+ - Select a **Start event** and a **Stop event**.
+1. Select **Create value stream**.
NOTE:
If you have recently upgraded to GitLab Premium, it can take up to 30 minutes for data to collect and display.
-### Create a value stream with stages
+## Create a value stream with custom stages
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/50229) in GitLab 13.7.
> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55572) in GitLab 13.10.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/294190) in GitLab 13.11.
-You can create value streams with stages, starting with a default or a blank template. You can
-add stages as desired.
-
-To create a value stream with stages:
+When you create a value stream, you can create and add custom stages that align with your own development workflows.
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Analytics > Value Stream**.
-1. If this is the first time you are creating a value stream, select **Create custom value stream**. Otherwise, in the top right, select the dropdown list and then **Create new Value Stream**.
-1. Select either **Create from default template** or **Create from no template**.
- - You can hide or re-order default stages in the value stream.
-
- ![Default stage actions](img/vsa_default_stage_v13_10.png "Default stage actions")
-
- - You can add new stages by selecting **Add another stage**.
- - You can select the name and start and end events for the stage.
-
- ![Custom stage actions](img/vsa_custom_stage_v13_10.png "Custom stage actions")
-1. Select **Create Value Stream**.
-
-### Label-based stages
-
-The pre-defined start and end events can cover many use cases involving both issues and merge requests.
+1. Select **Create value stream**.
+1. For each stage:
+ - Enter a name for the stage.
+ - Select a **Start event** and a **Stop event**.
+1. To add another stage, select **Add another stage**.
+1. To re-order the stages, select the up or down arrows.
+1. Select **Create value stream**.
-In more complex workflows, use stages based on group labels. These events are based on
-added or removed labels. In particular, [scoped labels](../../project/labels.md#scoped-labels)
-are useful for complex workflows.
+### Label-based stages for custom value streams
-In this example, we'd like to measure times for deployment from a staging environment to production. The workflow is the following:
+To measure complex workflows, you can use [scoped labels](../../project/labels.md#scoped-labels). For example, to measure deployment
+time from a staging environment to production, you could use the following labels:
- When the code is deployed to staging, the `workflow::staging` label is added to the merge request.
- When the code is deployed to production, the `workflow::production` label is added to the merge request.
![Label-based value stream analytics stage](img/vsa_label_based_stage_v14_0.png "Creating a label-based value stream analytics stage")
-### Edit a value stream
+## Edit a value stream
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/267537) in GitLab 13.10.
@@ -342,19 +319,18 @@ After you create a value stream, you can customize it to suit your purposes. To
1. On the top bar, select **Menu > Groups** and find your group.
1. On the left sidebar, select **Analytics > Value Stream**.
-1. In the top right, select the dropdown list and then select the relevant value stream.
+1. In the top right, select the dropdown list, and select a value stream.
1. Next to the value stream dropdown list, select **Edit**.
- The edit form is populated with the value stream details.
1. Optional:
- Rename the value stream.
- Hide or re-order default stages.
- Remove existing custom stages.
- - Add new stages by selecting the 'Add another stage' button
+ - To add new stages, select **Add another stage**.
- Select the start and end events for the stage.
1. Optional. To undo any modifications, select **Restore value stream defaults**.
1. Select **Save Value Stream**.
-### Delete a value stream
+## Delete a value stream
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/221205) in GitLab 13.4.
diff --git a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
index ab04187284d..be58b4565a1 100644
--- a/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
+++ b/doc/user/infrastructure/clusters/connect/new_gke_cluster.md
@@ -97,6 +97,8 @@ Use CI/CD environment variables to configure your project.
1. Expand **Variables**.
1. Set the variable `BASE64_GOOGLE_CREDENTIALS` to the `base64` encoded JSON file you just created.
1. Set the variable `TF_VAR_gcp_project` to your GCP's `project` name.
+1. Set the variable `TF_VAR_agent_token` to the agent token displayed in the previous task.
+1. Set the variable `TF_VAR_kas_address` to the agent server address displayed in the previous task.
**Optional configuration:**
diff --git a/doc/user/infrastructure/clusters/index.md b/doc/user/infrastructure/clusters/index.md
index cd7c5feb284..933b310ff3f 100644
--- a/doc/user/infrastructure/clusters/index.md
+++ b/doc/user/infrastructure/clusters/index.md
@@ -18,7 +18,7 @@ as well as its related [features](#deprecated-features).
The certificate-based Kubernetes integration with GitLab is deprecated.
It had the following issues:
-- There were security issues as it required direct access to the Kube API by GitLab.
+- There were security issues as it required direct access to the Kubernetes API by GitLab.
- The configuration options weren't flexible.
- The integration was flaky.
- Users were constantly reporting issues with features based on this model.
@@ -42,22 +42,18 @@ the GitLab agent model on the [agent's blueprint documentation](../../../archite
## Deprecated features
-- [Create a new cluster through cluster certificates](../../project/clusters/add_remove_clusters.md)
- [Connect an existing cluster through cluster certificates](../../project/clusters/add_existing_cluster.md)
- [Access controls](../../project/clusters/cluster_access.md)
- [GitLab-managed clusters](../../project/clusters/gitlab_managed_clusters.md)
-- [GitLab Managed Apps](../../clusters/applications.md)
- [Deploy applications through certificate-based connection](../../project/clusters/deploy_to_cluster.md)
- [Cluster Management Project](../../clusters/management_project.md)
- [Cluster integrations](../../clusters/integrations.md)
- [Cluster cost management](../../clusters/cost_management.md)
- [Cluster environments](../../clusters/environments.md)
-- [Advanced traffic control with Canary Ingress](../../project/canary_deployments.md#advanced-traffic-control-with-canary-ingress-deprecated)
-- [Serverless](../../project/clusters/serverless/index.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)
-- [Crossplane integration](../../clusters/crossplane.md)
- [Web terminals](../../../administration/integration/terminal.md)
### Cluster levels
@@ -67,5 +63,5 @@ The concept of [project-level](../../project/clusters/index.md),
[instance-level](../../instance/clusters/index.md) clusters becomes
extinct in the new model, although the functionality remains to some extent.
-The agent is always configured in a single GitLab project and you can expose the cluster connection to other projects and groups to [access it from GitLab CI/CD](../../clusters/agent/ci_cd_tunnel.md).
+The agent is always configured in a single GitLab project and you can expose the cluster connection to other projects and groups to [access it from GitLab CI/CD](../../clusters/agent/ci_cd_workflow.md).
By doing so, you are granting these projects and groups access to the same cluster, which is similar to group-level clusters' use case.
diff --git a/doc/user/infrastructure/clusters/manage/clusters_health.md b/doc/user/infrastructure/clusters/manage/clusters_health.md
index eeb931f392f..0eefae3f550 100644
--- a/doc/user/infrastructure/clusters/manage/clusters_health.md
+++ b/doc/user/infrastructure/clusters/manage/clusters_health.md
@@ -4,10 +4,15 @@ group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
-# Clusters health **(FREE)**
+# Clusters health (DEPRECATED) **(FREE)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4701) in GitLab 10.6.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/208224) from GitLab Ultimate to GitLab Free in 13.2.
+> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5. However, you can **still use** Prometheus
+for Kubernetes clusters connected to GitLab by [enabling Prometheus manually](../../../project/integrations/prometheus.md#manual-configuration-of-prometheus).
When [the Prometheus cluster integration is enabled](../../../clusters/integrations.md#prometheus-cluster-integration), GitLab monitors the cluster's health. At the top of the cluster settings page, CPU and Memory utilization is displayed, along with the total amount available. Keeping an eye on cluster resources can be important, if the cluster runs out of memory pods may be shutdown or fail to start.
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md b/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md
deleted file mode 100644
index ae335a180e8..00000000000
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Install AppArmor with a cluster management project **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
-[management project template](../../../../../user/clusters/management_project_template.md), to install AppArmor you should
-uncomment this line from your `helmfile.yaml`:
-
-```yaml
- - path: applications/apparmor/helmfile.yaml
-```
-
-You can define one or more AppArmor profiles by adding them into
-`applications/apparmor/values.yaml` as the following:
-
-```yaml
-profiles:
- profile-one: |-
- profile profile-one {
- file,
- }
-```
-
-Refer to the [AppArmor chart](https://gitlab.com/gitlab-org/charts/apparmor) for more information on this chart.
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md b/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md
index 58de5f5e368..5ad1fb81a39 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md
@@ -10,7 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - Support for cert-manager v1.4 was [introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/69405) in GitLab 14.3.
> - [Upgraded](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/23) to cert-manager 1.7 in GitLab 14.8.
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install cert-manager you should
uncomment this line from your `helmfile.yaml`:
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md b/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md
deleted file mode 100644
index 5d704a2c6df..00000000000
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Install Cilium with a cluster management project **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-
-[Cilium](https://cilium.io/) is a networking plugin for Kubernetes that you can use to implement
-support for [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
-resources. For more information, see [Network Policies](../../../../../topics/autodevops/stages.md#network-policy).
-
-<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
-For an overview, see the
-[Container Network Security Demo for GitLab 12.8](https://www.youtube.com/watch?v=pgUEdhdhoUI).
-
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
-[management project template](../../../../../user/clusters/management_project_template.md), to install cilium you should
-uncomment this line from your `helmfile.yaml`:
-
-```yaml
- - path: applications/cilium/helmfile.yaml
-```
-
-and update the `applications/cilium/values.yaml` to set the `clusterType`:
-
-```yaml
-# possible values are gke or eks
-clusterType: gke
-```
-
-The `clusterType` variable enables the recommended Helm variables for a corresponding cluster type.
-You can check the recommended variables for each cluster type in the official documentation:
-
-- [Google GKE](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-gke/#deploy-cilium)
-- [AWS EKS](https://docs.cilium.io/en/v1.8/gettingstarted/k8s-install-eks/#deploy-cilium)
-
-Do not use `clusterType` for sandbox environments like [minikube](https://minikube.sigs.k8s.io/docs/).
-
-You can customize Cilium's Helm variables by defining the
-`applications/cilium/values.yaml` file in your cluster
-management project. Refer to the
-[Cilium chart](https://github.com/cilium/cilium/tree/master/install/kubernetes/cilium)
-for the available configuration options.
-
-You can check Cilium's installation status on the cluster management page:
-
-- [Project-level cluster](../../../../project/clusters/index.md): Navigate to your project's
- **Infrastructure > Kubernetes clusters** page.
-- [Group-level cluster](../../../../group/clusters/index.md): Navigate to your group's
- **Kubernetes** page.
-
-WARNING:
-Installation and removal of the Cilium requires a **manual**
-[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/#restart-unmanaged-pods)
-of all affected pods in all namespaces to ensure that they are
-[managed](https://docs.cilium.io/en/v1.8/operations/troubleshooting/#ensure-managed-pod)
-by the correct networking plugin. Whenever Hubble is enabled, its related pod might require a
-restart depending on whether it started prior to Cilium. For more information, see
-[Failed Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deployment)
-in the Kubernetes docs.
-
-NOTE:
-Major upgrades might require additional setup steps. For more information, see
-the official [upgrade guide](https://docs.cilium.io/en/v1.8/operations/upgrade/).
-
-By default, Cilium's
-[audit mode](https://docs.cilium.io/en/v1.8/gettingstarted/policy-creation/#enable-policy-audit-mode)
-is enabled. In audit mode, Cilium doesn't drop disallowed packets. You
-can use `policy-verdict` log to observe policy-related decisions. You
-can disable audit mode by adding the following to
-`applications/cilium/values.yaml`:
-
-```yaml
-config:
- policyAuditMode: false
-
-agent:
- monitor:
- eventTypes: ["drop"]
-```
-
-The Cilium monitor log for traffic is logged out by the
-`cilium-monitor` sidecar container. You can check these logs with the following command:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
-```
-
-You can disable the monitor log in `.gitlab/managed-apps/cilium/values.yaml`:
-
-```yaml
-agent:
- monitor:
- enabled: false
-```
-
-The [Hubble](https://github.com/cilium/hubble) monitoring daemon is enabled by default
-and it's set to collect per namespace flow metrics. This metrics are accessible on the
-[Threat Monitoring](../../../../application_security/threat_monitoring/index.md)
-dashboard. You can disable Hubble by adding the following to
-`applications/cilium/values.yaml`:
-
-```yaml
-global:
- hubble:
- enabled: false
-```
-
-You can also adjust Helm values for Hubble by using
-`applications/cilium/values.yaml`:
-
-```yaml
-global:
- hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
-```
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md b/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md
index f9d0948a2bb..7ab99ab3875 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md
@@ -2,28 +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-08-22'
+redirect_to: '../../index.md'
---
-# Install Elastic Stack with a cluster management project **(FREE)**
+# Install Elastic Stack with a cluster management project (removed) **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
-[management project template](../../../../../user/clusters/management_project_template.md), to install Elastic Stack you should
-uncomment this line from your `helmfile.yaml`:
-
-```yaml
- - path: applications/elastic-stack/helmfile.yaml
-```
-
-Elastic Stack is installed by default into the `gitlab-managed-apps` namespace of your cluster.
-
-You can check the default
-[`values.yaml`](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/blob/master/applications/elastic-stack/values.yaml)
-we set for this chart.
-
-You can customize the installation of Elastic Stack by updating the
-`applications/elastic-stack/values.yaml` file in your cluster
-management project. Refer to the
-[chart](https://gitlab.com/gitlab-org/charts/elastic-stack) for all
-available configuration options.
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346485) in GitLab 14.8
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/360182) in 15.0.
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md b/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md
deleted file mode 100644
index 50401e9a391..00000000000
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/falco.md
+++ /dev/null
@@ -1,95 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Install Falco with a cluster management project **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-
-GitLab Container Host Security Monitoring uses [Falco](https://falco.org/)
-as a runtime security tool that listens to the Linux kernel using eBPF. Falco parses system calls
-and asserts the stream against a configurable rules engine in real-time. For more information, see
-[Falco's Documentation](https://falco.org/docs/).
-
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
-[management project template](../../../../../user/clusters/management_project_template.md), to install Falco you should
-uncomment this line from your `helmfile.yaml`:
-
-```yaml
- - path: applications/falco/helmfile.yaml
-```
-
-You can customize Falco's Helm variables by defining the
-`applications/falco/values.yaml` file in your cluster
-management project. Refer to the
-[Falco chart](https://github.com/falcosecurity/charts/tree/master/falco)
-for the available configuration options.
-
-WARNING:
-By default eBPF support is enabled and Falco uses an
-[eBPF probe](https://falco.org/docs/event-sources/drivers/#using-the-ebpf-probe)
-to pass system calls to user space. If your cluster doesn't support this, you can
-configure it to use Falco kernel module instead by adding the following to
-`applications/falco/values.yaml`:
-
-```yaml
-ebpf:
- enabled: false
-```
-
-In rare cases where probe installation on your cluster isn't possible and the kernel/probe
-isn't pre-compiled, you may need to manually prepare the kernel module or eBPF probe with
-[`driverkit`](https://github.com/falcosecurity/driverkit#against-a-kubernetes-cluster)
-and install it on each cluster node.
-
-By default, Falco is deployed with a limited set of rules. To add more rules, add
-the following to `applications/falco/values.yaml` (you can get examples from
-[Cloud Native Security Hub](https://securityhub.dev/)):
-
-```yaml
-customRules:
- file-integrity.yaml: |-
- - rule: Detect New File
- desc: detect new file created
- condition: >
- evt.type = chmod or evt.type = fchmod
- output: >
- File below a known directory opened for writing (user=%user.name
- command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2])
- priority: ERROR
- tags: [filesystem]
- - rule: Detect New Directory
- desc: detect new directory created
- condition: >
- mkdir
- output: >
- File below a known directory opened for writing (user=%user.name
- command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline gparent=%proc.aname[2])
- priority: ERROR
- tags: [filesystem]
-```
-
-By default, Falco only outputs security events to logs as JSON objects. To set it to output to an
-[external API](https://falco.org/docs/alerts/#https-output-send-alerts-to-an-https-end-point)
-or [application](https://falco.org/docs/alerts/#program-output),
-add the following to `applications/falco/values.yaml`:
-
-```yaml
-falco:
- programOutput:
- enabled: true
- keepAlive: false
- program: mail -s "Falco Notification" someone@example.com
-
- httpOutput:
- enabled: true
- url: http://some.url
-```
-
-You can check these logs with the following command:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l app=falco
-```
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md b/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md
deleted file mode 100644
index ea3a3503f9b..00000000000
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Install Fluentd with a cluster management project **(FREE)**
-
-> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
-[management project template](../../../../../user/clusters/management_project_template.md), to install Fluentd you should
-uncomment this line from your `helmfile.yaml`:
-
-```yaml
- - path: applications/fluentd/helmfile.yaml
-```
-
-You can also review the default values set for this chart in the
-[`values.yaml`](https://github.com/helm/charts/blob/master/stable/fluentd/values.yaml) file.
-
-You can customize the installation of Fluentd by defining
-`applications/fluentd/values.yaml` file in your cluster management
-project. Refer to the
-[configuration chart](https://github.com/helm/charts/tree/master/stable/fluentd#configuration)
-for the current development release of Fluentd for all available configuration options.
-
-The configuration chart link points to the current development release, which
-may differ from the version you have installed. To ensure compatibility, switch
-to the specific branch or tag you are using.
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md b/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md
index 503f077df14..7983a640577 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install Ingress you should
uncomment this line from your `helmfile.yaml`:
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md b/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md
index f76c7363a83..383e857bb20 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md
@@ -12,7 +12,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
open-source monitoring and alerting system for supervising your
deployed applications.
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install Prometheus you should
uncomment this line from your `helmfile.yaml`:
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
index 4faf5f46418..ef7c4637607 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/gitlab-org/project-templates/cluster-management/-/merge_requests/5) in GitLab 14.0.
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install GitLab Runner you should
uncomment this line from your `helmfile.yaml`:
@@ -35,7 +35,7 @@ These values can be specified using [CI/CD variables](../../../../../ci/variable
The methods of specifying these values are mutually exclusive. Either specify variables `GITLAB_RUNNER_REGISTRATION_TOKEN` and `CI_SERVER_URL` as CI variables (recommended) or provide values for `runnerRegistrationToken:` and `gitlabUrl:` in `applications/gitlab-runner/values.yaml.gotmpl`.
-The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../../../../ci/variables/index.md#protect-a-cicd-variable) and [masked variable](../../../../../ci/variables/index.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml.gotmpl` file.
+The runner registration token allows connection to a project by a runner and therefore should be treated as a secret to prevent malicious use and code exfiltration through a runner. For this reason, we recommend that you specify the runner registration token as a [protected variable](../../../../../ci/variables/index.md#protected-cicd-variables) and [masked variable](../../../../../ci/variables/index.md#mask-a-cicd-variable) and do not commit them to the Git repository in the `values.yaml.gotmpl` file.
You can customize the installation of GitLab Runner by defining
`applications/gitlab-runner/values.yaml.gotmpl` file in your cluster
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md b/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md
index b968e63d632..d2d314b649e 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
The Sentry Helm chart [recommends](https://github.com/helm/charts/blob/f6e5784f265dd459c5a77430185d0302ed372665/stable/sentry/values.yaml#L284-L285)
at least 3 GB of available RAM for database migrations.
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install Sentry you should
uncomment this line from your `helmfile.yaml`:
diff --git a/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md b/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
index 4618a95f986..06e67b78c91 100644
--- a/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
+++ b/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md
@@ -20,7 +20,7 @@ control. Therefore, if GitLab is compromised, the security of this Vault instanc
avoid this security risk, GitLab recommends using your own HashiCorp Vault to leverage
[external secrets with CI](../../../../../ci/secrets/index.md).
-Assuming you already have a [Cluster management project](../../../../../user/clusters/management_project.md) created from a
+Assuming you already have a project created from a
[management project template](../../../../../user/clusters/management_project_template.md), to install Vault you should
uncomment this line from your `helmfile.yaml`:
diff --git a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
index 61ec0a559f0..7b2b5b4afd4 100644
--- a/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
+++ b/doc/user/infrastructure/clusters/migrate_to_gitlab_agent.md
@@ -9,19 +9,20 @@ info: To determine the technical writer assigned to the Stage/Group associated w
To connect your Kubernetes cluster with GitLab, you can use:
- [A GitOps workflow](../../clusters/agent/gitops.md).
-- [A GitLab CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md).
+- [A GitLab CI/CD workflow](../../clusters/agent/ci_cd_workflow.md).
- [A certificate-based integration](index.md).
The certificate-based integration is
[**deprecated**](https://about.gitlab.com/blog/2021/11/15/deprecating-the-cert-based-kubernetes-integration/)
-in GitLab 14.5. It is expected to be
-[turned off by default in 15.0](../../../update/deprecations.md#certificate-based-integration-with-kubernetes)
-and removed in GitLab 15.6.
+in GitLab 14.5. The sunsetting plans are described:
+
+- for [GitLab.com customers](../../../update/deprecations.md#saas-certificate-based-integration-with-kubernetes).
+- for [Self-managed customers](../../../update/deprecations.md#self-managed-certificate-based-integration-with-kubernetes).
If you are using the certificate-based integration, you should move to another workflow as soon as possible.
As a general rule, to migrate clusters that rely on GitLab CI/CD,
-you can use the [CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md).
+you can use the [CI/CD workflow](../../clusters/agent/ci_cd_workflow.md).
This workflow uses an agent to connect to your cluster. The agent:
- Is not exposed to the internet.
@@ -39,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_tunnel.md#use-impersonation-to-restrict-project-and-group-access)
+The GitLab agent uses [impersonation](../../clusters/agent/ci_cd_workflow.md#use-impersonation-to-restrict-project-and-group-access)
strategies to deploy to your cluster with restricted account access. To do so:
1. Choose the impersonation strategy that suits your needs.
@@ -48,30 +49,55 @@ strategies to deploy to your cluster with restricted account access. To do so:
### Migrate from Auto DevOps
-To configure your Auto DevOps project to use the GitLab agent:
-
-1. Follow the steps to [install an agent](../../clusters/agent/install/index.md) in your cluster.
-1. Go to the project where you use Auto DevOps.
-1. On the left sidebar, select **Settings > CI/CD** and expand **Variables**.
-1. Select **Add new variable**.
-1. Add `KUBE_CONTEXT` as the key, `path/to/agent/project:agent-name` as the value, and select the environment scope of your choice.
+In your Auto DevOps project, you can use the GitLab agent to connect with your Kubernetes cluster.
+
+1. [Install an agent](../../clusters/agent/install/index.md) in your cluster.
+1. In GitLab, go to the project where you use Auto DevOps.
+1. Add three variables. 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.
+ - Add a key called `KUBE_CONTEXT` with a value like `path/to/agent/project:agent-name`.
+ Select the environment scope of your choice.
+ If you are not sure what your agent’s context is, edit your `.gitlab-ci.yml` file and add a job to see the available contexts:
+
+ ```yaml
+ deploy:
+ image:
+ name: bitnami/kubectl:latest
+ entrypoint: [""]
+ script:
+ - kubectl config get-contexts
+ ```
+
+ - Add a key called `KUBE_NAMESPACE` with a value of the Kubernetes namespace for your deployments to target. Set the same environment scope.
1. Select **Add variable**.
-1. Repeat the process to add another variable, `KUBE_NAMESPACE`, setting the value for the Kubernetes namespace you want your deployments to target, and set the same environment scope from the previous step.
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
1. From the certificate-based clusters section, open the cluster that serves the same environment scope.
1. Select the **Details** tab and disable the cluster.
-1. To activate the changes, on the left sidebar, select **CI/CD > Pipelines** and then **Run pipeline**.
+1. Edit your `.gitlab-ci.yml` file and ensure it's using the Auto DevOps template. For example:
+
+ ```yaml
+ include:
+ template: Auto-DevOps.gitlab-ci.yml
+
+ variables:
+ KUBE_INGRESS_BASE_DOMAIN: 74.220.23.215.nip.io
+ KUBE_CONTEXT: "gitlab-examples/ops/gitops-demo/k8s-agents:demo-agent"
+ KUBE_NAMESPACE: "demo-agent"
+ ```
+
+1. To test your pipeline, on the left sidebar, select **CI/CD > Pipelines** and then **Run pipeline**.
For an example, [view this project](https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service).
### Migrate generic deployments
-Follow the process for the [CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md).
+Follow the process for the [CI/CD workflow](../../clusters/agent/ci_cd_workflow.md).
## Migrate from GitLab Managed applications
-[GitLab Managed Apps (GMA)](../../clusters/applications.md#gitlab-managed-apps-deprecated) were deprecated in GitLab 14.0, and
-the agent for Kubernetes does not support them. To migrate from GMA to the agent, go through the following steps:
+GitLab Managed Apps (GMA) were deprecated in GitLab 14.0, and removed in GitLab 15.0.
+The agent for Kubernetes does not support them. To migrate from GMA to the
+agent, go through the following steps:
1. [Migrate from GitLab Managed Apps to a cluster management project](../../clusters/migrating_from_gma_to_project_template.md).
1. [Migrate the cluster management project to use the agent](../../clusters/management_project_template.md).
diff --git a/doc/user/infrastructure/iac/img/terraform_list_view_v13_8.png b/doc/user/infrastructure/iac/img/terraform_list_view_v13_8.png
deleted file mode 100644
index 6eb85285e81..00000000000
--- a/doc/user/infrastructure/iac/img/terraform_list_view_v13_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/infrastructure/iac/index.md b/doc/user/infrastructure/iac/index.md
index bc7a3c0d069..0f7965a3527 100644
--- a/doc/user/infrastructure/iac/index.md
+++ b/doc/user/infrastructure/iac/index.md
@@ -86,7 +86,7 @@ To use a Terraform template:
# TF_ROOT: terraform/production
```
-1. (Optional) Override in your `.gitlab-ci.yaml` file the attributes present
+1. (Optional) Override in your `.gitlab-ci.yml` file the attributes present
in the template you fetched to customize your configuration.
## GitLab-managed Terraform state
@@ -107,13 +107,9 @@ workflows.
## The GitLab Terraform provider
-NOTE:
-The GitLab Terraform provider is released separately from GitLab.
-We are working on migrating the GitLab Terraform provider to GitLab.com.
-
-The [GitLab Terraform provider](https://github.com/gitlabhq/terraform-provider-gitlab) is a plugin for Terraform to facilitate
-managing of GitLab resources such as users, groups, and projects.
-Its documentation is available on [Terraform](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs).
+The [GitLab Terraform provider](https://github.com/gitlabhq/terraform-provider-gitlab) is a Terraform plugin to facilitate
+managing of GitLab resources such as users, groups, and projects. It is released separately from GitLab
+and its documentation is available on [Terraform](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs).
## Create a new cluster through IaC
diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md
index 60f97f522cf..f56fe92ec01 100644
--- a/doc/user/infrastructure/iac/terraform_state.md
+++ b/doc/user/infrastructure/iac/terraform_state.md
@@ -8,58 +8,43 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0.
-[Terraform remote backends](https://www.terraform.io/language/settings/backends)
-enable you to store the state file in a remote, shared store. GitLab uses the
-[Terraform HTTP backend](https://www.terraform.io/language/settings/backends/http)
-to securely store the state files in local storage (the default) or
-[the remote store of your choice](../../../administration/terraform_state.md).
+Terraform uses state files to store details about your infrastructure configuration.
+With Terraform remote [backends](https://www.terraform.io/language/settings/backends),
+you can store the state file in a remote and shared store.
-WARNING:
-Using local storage (the default) on clustered deployments of GitLab will result in
-a split state across nodes, making subsequent executions of Terraform inconsistent.
-You are highly advised to use a remote storage resource in that case.
-
-The GitLab-managed Terraform state backend can store your Terraform state easily and
-securely, and spares you from setting up additional remote resources like
-Amazon S3 or Google Cloud Storage. Its features include:
-
-- Versioning of Terraform state files.
-- Supporting encryption of the state file both in transit and at rest.
-- Locking and unlocking state.
-- Remote Terraform plan and apply execution.
-
-A GitLab **administrator** must [set up the Terraform state storage configuration](../../../administration/terraform_state.md)
-before using this feature.
+GitLab provides a [Terraform HTTP backend](https://www.terraform.io/language/settings/backends/http)
+to securely store your state files with minimal configuration.
-## Permissions for using Terraform
+In GitLab, you can:
-In GitLab version 13.1, at least the Maintainer role was required to use a
-GitLab managed Terraform state backend.
+- Version your Terraform state files.
+- Encrypt the state file both in transit and at rest.
+- Lock and unlock states.
+- Remotely execute `terraform plan` and `terraform apply` commands.
-In GitLab versions 13.2 and later, at least:
+For self-managed instances, before you can use GitLab for your Terraform state files,
+an administrator must [set up Terraform state storage](../../../administration/terraform_state.md).
-- The Maintainer role is required to lock, unlock, and write to the state (using `terraform apply`).
-- The Developer role is required to read the state (using `terraform plan -lock=false`).
+## Initialize a Terraform state as a backend by using GitLab CI/CD
-## Set up GitLab-managed Terraform state
+After you execute the `terraform init` command, you can use GitLab CI/CD
+to run `terraform` commands.
-To get started with a GitLab-managed Terraform state, there are two different options:
+Prerequisites:
-- [Use a local machine](#get-started-using-local-development).
-- [Use GitLab CI](#get-started-using-gitlab-ci).
+- To lock, unlock, and write to the state by using `terraform apply`, you must have at least the Maintainer role.
+- To read the state by using `terraform plan -lock=false`, you must have at least the Developer role.
-Terraform States can be found by navigating to a Project's
-**{cloud-gear}** **Infrastructure > Terraform** page.
-
-### Get started using local development
+WARNING:
+Like any other job artifact, Terraform plan data is viewable by anyone with the Guest role on the repository.
+Neither Terraform nor GitLab encrypts the plan file by default. If your Terraform plan
+includes sensitive data, like passwords, access tokens, or certificates, you should
+encrypt plan output or modify the project visibility settings.
-If you plan to only run `terraform plan` and `terraform apply` commands from your
-local machine, this is a simple way to get started:
+To configure GitLab CI/CD as a backend:
-1. Create your project on your GitLab instance.
-1. Navigate to **Settings > General** and note your **Project name**
- and **Project ID**.
-1. Define the Terraform backend in your Terraform project to be:
+1. In your Terraform project, in a `.tf` file like `backend.tf`,
+ define the [HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html):
```hcl
terraform {
@@ -68,172 +53,51 @@ local machine, this is a simple way to get started:
}
```
-1. Create a [Personal Access Token](../../profile/personal_access_tokens.md) with
- the `api` scope.
-
-1. On your local machine, run `terraform init`, passing in the following options,
- replacing `<YOUR-STATE-NAME>`, `<YOUR-PROJECT-ID>`, `<YOUR-USERNAME>` and
- `<YOUR-ACCESS-TOKEN>` with the relevant values. This command initializes your
- Terraform state, and stores that state in your GitLab project. This example
- uses `gitlab.com`:
-
- ```shell
- terraform init \
- -backend-config="address=https://gitlab.com/api/v4/projects/<YOUR-PROJECT-ID>/terraform/state/<YOUR-STATE-NAME>" \
- -backend-config="lock_address=https://gitlab.com/api/v4/projects/<YOUR-PROJECT-ID>/terraform/state/<YOUR-STATE-NAME>/lock" \
- -backend-config="unlock_address=https://gitlab.com/api/v4/projects/<YOUR-PROJECT-ID>/terraform/state/<YOUR-STATE-NAME>/lock" \
- -backend-config="username=<YOUR-USERNAME>" \
- -backend-config="password=<YOUR-ACCESS-TOKEN>" \
- -backend-config="lock_method=POST" \
- -backend-config="unlock_method=DELETE" \
- -backend-config="retry_wait_min=5"
- ```
-
- WARNING:
- The name of your state can contain only uppercase and lowercase letters, decimal digits,
- hyphens, and underscores.
-
-If you already have a GitLab-managed Terraform state, you can use the `terraform init` command
-with the pre-populated parameters values:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Infrastructure > Terraform**.
-1. Next to the environment you want to use, select the [Actions menu](#managing-state-files)
- **{ellipsis_v}** and select **Copy Terraform init command**.
-
-You can now run `terraform plan` and `terraform apply` as you normally would.
-
-### Get started using GitLab CI
-
-If you don't want to start with local development, you can also use GitLab CI to
-run your `terraform plan` and `terraform apply` commands.
-
-Next, [configure the backend](#configure-the-backend).
-
-#### Configure the backend
+1. In the root directory of your project repository, create a `.gitlab-ci.yml` file. Use
+ [this file](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml)
+ to populate it.
+
+1. Push your project to GitLab. This action triggers a pipeline, which
+ runs the `gitlab-terraform init`, `gitlab-terraform validate`, and
+ `gitlab-terraform plan` commands.
+1. Trigger the manual `terraform apply` job from the previous pipeline to provision the defined infrastructure.
-After executing the `terraform init` command, you must configure the Terraform backend
-and the CI YAML file:
+The output from the above `terraform` commands should be viewable in the job logs.
-1. In your Terraform project, define the [HTTP backend](https://www.terraform.io/docs/language/settings/backends/http.html)
- by adding the following code block in a `.tf` file (such as `backend.tf`) to
- define the remote backend:
+## Access the state from your local machine
- ```hcl
- terraform {
- backend "http" {
- }
- }
- ```
+You can access the GitLab-managed Terraform state from your local machine.
-1. In the root directory of your project repository, configure a
- `.gitlab-ci.yml` file. This example uses a pre-built image which includes a
- `gitlab-terraform` helper. For supported Terraform versions, see the [GitLab
- Terraform Images project](https://gitlab.com/gitlab-org/terraform-images).
+WARNING:
+On clustered deployments of GitLab, you should not use local storage.
+A split state can occur across nodes, making subsequent Terraform executions
+inconsistent. Instead, use a remote storage resource.
- ```yaml
- image: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
- ```
+1. Ensure the Terraform state has been
+ [initialized for CI/CD](#initialize-a-terraform-state-as-a-backend-by-using-gitlab-cicd).
+1. Copy a pre-populated Terraform `init` command:
-1. In the `.gitlab-ci.yml` file, define some CI/CD variables to ease
- development. In this example, `TF_ROOT` is the directory where the Terraform
- commands must be executed, `TF_ADDRESS` is the URL to the state on the GitLab
- instance where this pipeline runs, and the final path segment in `TF_ADDRESS`
- is the name of the Terraform state. Projects may have multiple states, and
- this name is arbitrary, so in this example we set it to `example-production`
- which corresponds with the directory we're using as our `TF_ROOT`, and we
- ensure that the `.terraform` directory is cached between jobs in the pipeline
- using a cache key based on the state name (`example-production`):
-
- ```yaml
- variables:
- TF_ROOT: ${CI_PROJECT_DIR}/environments/example/production
- TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/example-production
-
- cache:
- key: example-production
- paths:
- - ${TF_ROOT}/.terraform
- ```
+ 1. On the top bar, select **Menu > Projects** and find your project.
+ 1. On the left sidebar, select **Infrastructure > Terraform**.
+ 1. Next to the environment you want to use, select **Actions**
+ (**{ellipsis_v}**) and select **Copy Terraform init command**.
-1. In a `before_script`, change to your `TF_ROOT`:
-
- ```yaml
- before_script:
- - cd ${TF_ROOT}
-
- stages:
- - prepare
- - validate
- - build
- - deploy
-
- init:
- stage: prepare
- script:
- - gitlab-terraform init
-
- validate:
- stage: validate
- script:
- - gitlab-terraform validate
-
- plan:
- stage: build
- script:
- - gitlab-terraform plan
- - gitlab-terraform plan-json
- artifacts:
- name: plan
- paths:
- - ${TF_ROOT}/plan.cache
- reports:
- terraform: ${TF_ROOT}/plan.json
-
- apply:
- stage: deploy
- environment:
- name: production
- script:
- - gitlab-terraform apply
- dependencies:
- - plan
- when: manual
- only:
- - master
- ```
-
-1. Push your project to GitLab, which triggers a CI job pipeline. This pipeline
- runs the `gitlab-terraform init`, `gitlab-terraform validate`, and
- `gitlab-terraform plan` commands.
+1. Open a terminal and run this command on your local machine.
-The output from the above `terraform` commands should be viewable in the job logs.
+## Migrate to a GitLab-managed Terraform state
-WARNING:
-Like any other job artifact, Terraform plan data is viewable by anyone with the Guest role on the repository.
-Neither Terraform nor GitLab encrypts the plan file by default. If your Terraform plan
-includes sensitive data such as passwords, access tokens, or certificates, GitLab strongly
-recommends encrypting plan output or modifying the project visibility settings.
+Terraform supports copying the state when the backend changes or is
+reconfigured. Use these actions to migrate from another backend to
+GitLab-managed Terraform state.
-### Example project
+You should use a local terminal to run the commands needed for migrating to GitLab-managed Terraform state.
-See [this reference project](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-aws) using GitLab and Terraform to deploy a basic AWS EC2 in a custom VPC.
+The following example demonstrates how to change the state name. The same workflow is needed to migrate to GitLab-managed Terraform state from a different state storage backend.
-## Using a GitLab-managed Terraform state backend as a remote data source
+## Use your GitLab backend as a remote data source
-You can use a GitLab-managed Terraform state as a
+You can use a GitLab-managed Terraform state backend as a
[Terraform data source](https://www.terraform.io/language/state/remote-state-data).
-To use your existing Terraform state backend as a data source, provide the following details
-as [Terraform input variables](https://www.terraform.io/language/values/variables):
-
-- **address**: The URL of the remote state backend you want to use as a data source.
- For example, `https://gitlab.com/api/v4/projects/<TARGET-PROJECT-ID>/terraform/state/<TARGET-STATE-NAME>`.
-- **username**: The username to authenticate with the data source. If you are using a [Personal Access Token](../../profile/personal_access_tokens.md) for
- authentication, this is your GitLab username. If you are using GitLab CI, this is `'gitlab-ci-token'`.
-- **password**: The password to authenticate with the data source. If you are using a Personal Access Token for
- authentication, this is the token value. If you are using GitLab CI, it is the contents of the `${CI_JOB_TOKEN}` CI/CD variable.
-
-An example setup is shown below:
1. Create a file named `example.auto.tfvars` with the following contents:
@@ -243,7 +107,7 @@ An example setup is shown below:
example_access_token=<GitLab Personal Access Token>
```
-1. Define the data source by adding the following code block in a `.tf` file (such as `data.tf`):
+1. In a `.tf` file, define the data source by using [Terraform input variables](https://www.terraform.io/language/values/variables):
```hcl
data "terraform_remote_state" "example" {
@@ -257,21 +121,20 @@ An example setup is shown below:
}
```
+ - **address**: The URL of the remote state backend you want to use as a data source.
+ For example, `https://gitlab.com/api/v4/projects/<TARGET-PROJECT-ID>/terraform/state/<TARGET-STATE-NAME>`.
+ - **username**: The username to authenticate with the data source. If you are using
+ 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.
+
Outputs from the data source can now be referenced in your Terraform resources
using `data.terraform_remote_state.example.outputs.<OUTPUT-NAME>`.
-You need at least the Developer role in the target project
-to read the Terraform state.
+To read the Terraform state in the target project, you need at least the Developer role.
-## Migrating to GitLab-managed Terraform state
-
-Terraform supports copying the state when the backend is changed or
-reconfigured. This can be useful if you need to migrate from another backend to
-GitLab-managed Terraform state. Using a local terminal is recommended to run the commands needed for migrating to GitLab-managed Terraform state.
-
-The following example demonstrates how to change the state name, the same workflow is needed to migrate to GitLab-managed Terraform state from a different state storage backend.
-
-### Setting up the initial backend
+### Set up the initial backend
```shell
PROJECT_ID="<gitlab-project-id>"
@@ -309,7 +172,7 @@ re-run this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```
-### Changing the backend
+### Change the backend
Now that `terraform init` has created a `.terraform/` directory that knows where
the old state is, you can tell it about the new location:
@@ -366,94 +229,54 @@ commands will detect it and remind you to do so if necessary.
If you type `yes`, it copies your state from the old location to the new
location. You can then go back to running it in GitLab CI/CD.
-## Managing state files
+## Manage Terraform state files
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/273592) in GitLab 13.8.
-Users with at least the Developer role can view the
-state files attached to a project at **Infrastructure > Terraform**. Users with the
-Maintainer role can perform commands on the state files. The user interface
-contains these fields:
-
-![Terraform state list](img/terraform_list_view_v13_8.png)
+To view Terraform state files:
-- **Name**: The name of the environment, with a locked (**{lock}**) icon if the
- state file is locked.
-- **Pipeline**: A link to the most recent pipeline and its status.
-- **Details**: Information about when the state file was created or changed.
-- **Actions**: Actions you can take on the state file, including copying the `terraform init` command,
- downloading, locking, unlocking, or [removing](#remove-a-state-file) the state file and versions.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Infrastructure > Terraform**.
-NOTE:
-Additional improvements to the
-[graphical interface for managing state files](https://gitlab.com/groups/gitlab-org/-/epics/4563)
-are planned.
+[An epic exists](https://gitlab.com/groups/gitlab-org/-/epics/4563) to track improvements to this UI.
-## Manage individual Terraform state versions
+### Manage individual Terraform state versions
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207347) in GitLab 13.4.
Individual state versions can be managed using the GitLab REST API.
-Users with the [Developer role](../../permissions.md) can retrieve state versions using their serial number. To retrieve a version:
+If you have at least the Developer role, you can retrieve state versions by using their serial number::
```shell
curl --header "Private-Token: <your_access_token>" "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>/versions/<version-serial>"
```
-Users with the [Maintainer role](../../permissions.md) can remove state versions using their serial number. To remove a version:
+If you have at least the Maintainer role, you can remove state versions by using their serial number:
```shell
curl --header "Private-Token: <your_access_token>" --request DELETE "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>/versions/<version-serial>"
```
-## Remove a state file
-
-Users with at least the Maintainer role can use the
-following options to remove a state file:
+### Remove a state file
-- **GitLab UI**: Go to **Infrastructure > Terraform**. In the **Actions** column,
- click the vertical ellipsis (**{ellipsis_v}**) button and select
- **Remove state file and versions**.
-- **GitLab REST API**: You can remove a state file by making a request to the
- REST API. For example:
+If you have at least the Maintainer role, you can remove a state file.
- ```shell
- curl --header "Private-Token: <your_access_token>" --request DELETE "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>"
- ```
-
-- [GitLab GraphQL API](#remove-a-state-file-with-the-gitlab-graphql-api).
-
-### Remove a state file with the GitLab GraphQL API
-
-You can remove a state file by making a GraphQL API request. For example:
+1. On the left sidebar, select **Infrastructure > Terraform**.
+1. In the **Actions** column, select **Actions** (**{ellipsis_v}**) and then **Remove state file and versions**.
-```shell
-mutation deleteState {
- terraformStateDelete(input: { id: "<global_id_for_the_state>" }) {
- errors
- }
-}
-```
+### Remove a state file by using the API
-You can obtain the `<global_id_for_the_state>` by querying the list of states:
+You can remove a state file by making a request to the REST API. For example:
```shell
-query ProjectTerraformStates {
- project(fullPath: "<your_project_path>") {
- terraformStates {
- nodes {
- id
- name
- }
- }
- }
-}
+curl --header "Private-Token: <your_access_token>" --request DELETE "https://gitlab.example.com/api/v4/projects/<your_project_id>/terraform/state/<your_state_name>"
```
-For those new to the GitLab GraphQL API, read
-[Getting started with GitLab GraphQL API](../../../api/graphql/getting_started.md).
+You can also use [the GraphQL API](../../../api/graphql/reference/index.md#mutationterraformstatedelete).
## Related topics
- [Troubleshooting GitLab-managed Terraform state](troubleshooting.md).
+- To use GitLab and Terraform to deploy an AWS EC2 instance in a custom VPC,
+ see [this sample project](https://gitlab.com/gitlab-org/configure/examples/gitlab-terraform-aws).
diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md
index bc0aa39bc70..9dfe58396e2 100644
--- a/doc/user/infrastructure/iac/troubleshooting.md
+++ b/doc/user/infrastructure/iac/troubleshooting.md
@@ -38,33 +38,37 @@ To workaround this issue, make sure to apply one of the following conditions:
1. Grant Maintainer or Owner role to the `terraform-user` user on `subgroup-B`.
1. The `terraform-user` inherited access to `subgroup-B` and `subgroup-B` contains at least one project.
-### Invalid CI/CD syntax error when using the `latest` base template
+### Invalid CI/CD syntax error when using the base template
-On GitLab 14.2 and later, you might get a CI/CD syntax error when using the
-`latest` Base Terraform template:
+You might encounter a CI/CD syntax error when using the Terraform templates:
+
+- On GitLab 14.2 and later, using the `latest` template.
+- On GitLab 15.0 and later, using any version of the template.
+
+For example:
```yaml
include:
+ # On 14.2 and later, when using either of the following:
- template: Terraform/Base.latest.gitlab-ci.yml
+ - template: Terraform.latest.gitlab-ci.yml
+ # On 15.0 and later, the following templates have also been updated:
+ - template: Terraform/Base.gitlab-ci.yml
+ - template: Terraform.gitlab-ci.yml
-my-Terraform-job:
- extends: .init
+my-terraform-job:
+ extends: .apply
```
-The base template's [jobs were renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67719/)
-with better Terraform-specific names. To resolve the syntax error, you can:
-
-- Use the stable `Terraform/Base.gitlab-ci.yml` template, which has not changed.
-- Update your pipeline configuration to use the new job names in
- `https://gitlab.com/gitlab-org/gitlab/-/tree/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml`.
- For example:
+There are two different causes for the error:
- ```yaml
- include:
- - template: Terraform/Base.latest.gitlab-ci.yml
+- In the case of `.init`, the error occurs because the init stage and jobs [were removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/71188) from the templates, since they are no longer required. To resolve the syntax error, you can safely remove any jobs extending `.init`.
+- For all other jobs, the reason for the failure is that the base jobs have been [renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/67719): A `.terraform:` prefix has been added to every job name. For example, `.apply` became `.terraform:apply`. To fix this error, you can update the base job names. For example:
- my-Terraform-job:
- extends: .terraform:init # The updated name.
+ ```diff
+ my-terraform-job:
+ - extends: .apply
+ + extends: .terraform:apply
```
## Troubleshooting Terraform state
@@ -80,7 +84,7 @@ This happens because the value of `$CI_JOB_TOKEN` is only valid for the duration
As a workaround, use [http backend configuration variables](https://www.terraform.io/docs/language/settings/backends/http.html#configuration-variables) in your CI job,
which is what happens behind the scenes when following the
-[Get started using GitLab CI](terraform_state.md#get-started-using-gitlab-ci) instructions.
+[Get started using GitLab CI](terraform_state.md#initialize-a-terraform-state-as-a-backend-by-using-gitlab-cicd) instructions.
### Error: "address": required field is not set
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index fc2f1de5ce2..bbcb0f62a5c 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -8,9 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> The abbreviation [changed](https://gitlab.com/gitlab-org/gitlab/-/issues/24592) from `GFM` to `GLFM` in GitLab 14.10.
-GitLab automatically renders Markdown content. For example, when you add a comment to an issue,
-you type the text in the Markdown language. When you save the issue, the text is rendered
-with a set of styles. These styles are described on this page.
+When you enter text in the GitLab UI, GitLab assumes the text is in the Markdown language.
+The text is rendered with a set of styles. These styles are called *GitLab Flavored Markdown*.
For example, in Markdown, an unordered list looks like this:
diff --git a/doc/user/packages/container_registry/index.md b/doc/user/packages/container_registry/index.md
index 59bb4a89b0b..fe7a41aa542 100644
--- a/doc/user/packages/container_registry/index.md
+++ b/doc/user/packages/container_registry/index.md
@@ -626,10 +626,10 @@ Use your own URLs to complete the following steps:
docker pull gitlab.example.com/org/build/sample_project/cr:v2.9.1
```
-NOTE:
-For container registry authentication, use either a
-[personal access token](../../profile/personal_access_tokens.md) or a
-[deploy token](../../project/deploy_tokens/index.md).
+ NOTE:
+ For container registry authentication, use either a
+ [personal access token](../../profile/personal_access_tokens.md) or a
+ [deploy token](../../project/deploy_tokens/index.md).
1. Rename the images to match the new project name:
@@ -695,7 +695,7 @@ There may be some errors not properly cached. Follow these steps to investigate
`200 OK`, the body might have the error `AccessDenied`. This indicates a permission problem from
the S3 side.
-1. Ensure your S3 configuration has the `deleteObject` permisson scope. Here's an
+1. Ensure your S3 configuration has the `deleteObject` permission scope. Here's an
[example role for an S3 bucket](../../../administration/object_storage.md#iam-permissions).
Once adjusted, trigger another tag deletion. You should be able to successfully delete tags.
diff --git a/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md b/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
index 5f678a661f8..9dcb4d7127d 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_data_transfer.md
@@ -7,11 +7,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Reduce Container Registry data transfers **(FREE)**
Depending on the frequency with which images or tags are downloaded from the Container Registry,
-data transfers can exceed the GitLab limit. This page offers several recommendations and tips for
+data transfers can exceed the GitLab.com limit. This page offers several recommendations and tips for
reducing the amount of data you transfer with the Container Registry.
-are downloaded from the Container Registry, data transfers can exceed the GitLab limit. This page
-offers several recommendations and tips for reducing the amount of data you transfer with the
-Container Registry.
## Check data transfer use
@@ -115,9 +112,15 @@ images can be specified as a cache source by using multiple `--cache-from` argum
up your builds and reduce the amount of data transferred. For more information, see the
[documentation on Docker layer caching](../../../ci/docker/using_docker_build.md#make-docker-in-docker-builds-faster-with-docker-layer-caching).
+## Check automation frequency
+
+We often create automation scripts bundled into container images to perform regular tasks on specific intervals.
+You can reduce the frequency of those intervals in cases where the automation is pulling container images from
+the GitLab Registry to a service outside of GitLab.com.
+
## Move to GitLab Premium or Ultimate
-GitLab data transfer limits are set at the tier level. If you need a higher limit, consider
+GitLab.com data transfer limits are set at the tier level. If you need a higher limit, consider
upgrading to [GitLab Premium or Ultimate](https://about.gitlab.com/upgrade/).
## Purchase additional data transfer
diff --git a/doc/user/packages/container_registry/reduce_container_registry_storage.md b/doc/user/packages/container_registry/reduce_container_registry_storage.md
index 2cfe99876fa..7b52a6a8ce3 100644
--- a/doc/user/packages/container_registry/reduce_container_registry_storage.md
+++ b/doc/user/packages/container_registry/reduce_container_registry_storage.md
@@ -24,6 +24,7 @@ which doesn't include the Container Registry. To track work on this, see the epi
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15398) in GitLab 12.8.
> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/218737) from "expiration policy" to "cleanup policy" in GitLab 13.2.
+> - [Required permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/350682) changed from developer to maintainer in GitLab 15.0.
The cleanup policy is a scheduled job you can use to remove tags from the Container Registry.
For the project where it's defined, tags matching the regex pattern are removed.
@@ -158,12 +159,8 @@ Here are examples of regex patterns you may want to use:
### Set cleanup limits to conserve resources
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/288812) in GitLab 13.9 [with a flag](../../../administration/feature_flags.md) named `container_registry_expiration_policies_throttling`. Disabled by default.
-> - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80815) in GitLab 14.9.
-
-FLAG:
-By default this feature is available in GitLab 14.9. To disable the feature, an administrator can
-[disable the feature flag](../../../administration/feature_flags.md)
-named `container_registry_expiration_policies_throttling`.
+> - [Enabled by default](https://gitlab.com/groups/gitlab-org/-/epics/2270) in GitLab 14.9.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/84996) the feature flag `container_registry_expiration_policies_throttling` in GitLab 15.0.
Cleanup policies are executed as a background process. This process is complex, and depending on the number of tags to delete,
the process can take time to finish.
diff --git a/doc/user/packages/dependency_proxy/index.md b/doc/user/packages/dependency_proxy/index.md
index 5e66c8ed7a5..af54d928bec 100644
--- a/doc/user/packages/dependency_proxy/index.md
+++ b/doc/user/packages/dependency_proxy/index.md
@@ -37,7 +37,8 @@ For a list of planned additions, view the
To enable or turn off the Dependency Proxy for a group:
-1. Go to your group's **Settings > Packages & Registries**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Settings > Packages & Registries**.
1. Expand the **Dependency Proxy** section.
1. To enable the proxy, turn on **Enable Proxy**. To turn it off, turn the toggle off.
@@ -49,7 +50,8 @@ for the entire GitLab instance.
To view the Dependency Proxy:
-- Go to your group's **Packages & Registries > Dependency Proxy**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Packages & Registries > Dependency Proxy**.
The Dependency Proxy is not available for projects.
@@ -63,17 +65,8 @@ Prerequisites:
### Authenticate with the Dependency Proxy
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab 13.7.
-> - It's [deployed behind a feature flag](../../feature_flags.md), enabled by default.
-> - It's enabled on GitLab.com.
-> - It's recommended for production use.
-> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](../../../administration/packages/dependency_proxy.md#disabling-authentication). **(FREE SELF)**
-
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
-The requirement to authenticate is a breaking change added in 13.7. An [administrator can temporarily
-disable it](../../../administration/packages/dependency_proxy.md#disabling-authentication) if it
-has disrupted your existing Dependency Proxy usage.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/11582) in GitLab 13.7 [with a flag](../../../administration/feature_flags.md) named `dependency_proxy_for_private_groups`. Enabled by default.
+> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/276777) the feature flag `dependency_proxy_for_private_groups` in GitLab 15.0.
Because the Dependency Proxy is storing Docker images in a space associated with your group,
you must authenticate against the Dependency Proxy.
@@ -182,8 +175,9 @@ You can also use [custom CI/CD variables](../../../ci/variables/index.md#custom-
To store a Docker image in Dependency Proxy storage:
-1. Go to your group's **Packages & Registries > Dependency Proxy**.
-1. Copy the **Dependency Proxy URL**.
+1. On the top bar, select **Menu > Groups** and find your group.
+1. On the left sidebar, select **Packages & Registries > Dependency Proxy**.
+1. Copy the **Dependency Proxy image prefix**.
1. Use one of these commands. In these examples, the image is `alpine:latest`.
1. You can also pull images by digest to specify exactly which version of an image to pull.
diff --git a/doc/user/packages/dependency_proxy/reduce_dependency_proxy_storage.md b/doc/user/packages/dependency_proxy/reduce_dependency_proxy_storage.md
index cd04d2e696b..839684da875 100644
--- a/doc/user/packages/dependency_proxy/reduce_dependency_proxy_storage.md
+++ b/doc/user/packages/dependency_proxy/reduce_dependency_proxy_storage.md
@@ -26,6 +26,8 @@ image or tag from Docker Hub.
## Cleanup policies
+> [Required permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/350682) changed from developer to maintainer in GitLab 15.0.
+
### Enable cleanup policies from within GitLab
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/340777) in GitLab 14.6
diff --git a/doc/user/packages/generic_packages/index.md b/doc/user/packages/generic_packages/index.md
index 9dc859a37e2..37e1f0c3eb1 100644
--- a/doc/user/packages/generic_packages/index.md
+++ b/doc/user/packages/generic_packages/index.md
@@ -101,7 +101,8 @@ API or the UI.
#### Do not allow duplicate Generic packages
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293755) in GitLab 13.12.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/293755) in GitLab 13.12.
+> - [Required permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/350682) changed from developer to maintainer in GitLab 15.0.
To prevent users from publishing duplicate generic packages, you can use the [GraphQl API](../../../api/graphql/reference/index.md#packagesettings)
or the UI.
diff --git a/doc/user/packages/go_proxy/index.md b/doc/user/packages/go_proxy/index.md
index 29455fdbb35..d2edfcb94c5 100644
--- a/doc/user/packages/go_proxy/index.md
+++ b/doc/user/packages/go_proxy/index.md
@@ -106,6 +106,11 @@ the scope set to `api` or `read_api`.
Open your [`~/.netrc`](https://everything.curl.dev/usingcurl/netrc) file
and add the following text. Replace the variables in `< >` with your values.
+WARNING:
+If you use an environment variable called `NETRC`, Go will use its value
+as a filename and ignore `~/.netrc`. If you intend to use `~/.netrc` in
+the GitLab CI **do not use `NETRC` as an environment variable name**.
+
```plaintext
machine <url> login <username> password <token>
```
diff --git a/doc/user/packages/maven_repository/index.md b/doc/user/packages/maven_repository/index.md
index 6a515b78fc1..1e3b5bdc323 100644
--- a/doc/user/packages/maven_repository/index.md
+++ b/doc/user/packages/maven_repository/index.md
@@ -184,7 +184,7 @@ published to the GitLab Package Registry.
Project name (default: test):
```
-1. Enter a project name or press Enter to use the directory name as project name.
+1. Enter a project name or press <kbd>Enter</kbd> to use the directory name as project name.
## Authenticate to the Package Registry with Maven
@@ -617,7 +617,8 @@ To delete these older package versions, consider using the Packages API or the U
#### Do not allow duplicate Maven packages
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296895) in GitLab 13.9.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/296895) in GitLab 13.9.
+> - [Required permissions](https://gitlab.com/gitlab-org/gitlab/-/issues/350682) changed from developer to maintainer in GitLab 15.0.
To prevent users from publishing duplicate Maven packages, you can use the [GraphQl API](../../../api/graphql/reference/index.md#packagesettings) or the UI.
diff --git a/doc/user/packages/pypi_repository/index.md b/doc/user/packages/pypi_repository/index.md
index 4d46032d229..eee6d55a3ce 100644
--- a/doc/user/packages/pypi_repository/index.md
+++ b/doc/user/packages/pypi_repository/index.md
@@ -325,7 +325,8 @@ python -m twine upload --repository <source_name> dist/<package_file>
### Publishing packages with the same name or version
You cannot publish a package if a package of the same name and version already exists.
-You must delete the existing package first. If you attempt to publish the same package
+You must [delete the existing package](../../packages/package_registry/reduce_package_registry_storage.md#delete-a-package) first.
+If you attempt to publish the same package
more than once, a `400 Bad Request` error occurs.
## Install a PyPI package
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index 2282a7d876e..d28cf75d11f 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -67,13 +67,12 @@ The following table lists project permissions available for each role:
| [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>View [threats list](application_security/threat_monitoring/index.md#threat-monitoring) | | | ✓ | ✓ | ✓ |
| [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) | | | ✓ | ✓ | ✓ |
+| [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) | | | | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Push an image to the Container Registry | | | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Pull an image from the Container Registry | ✓ (*20*) | ✓ (*20*) | ✓ | ✓ | ✓ |
| [Container Registry](packages/container_registry/index.md):<br>Remove a Container Registry image | | | ✓ | ✓ | ✓ |
@@ -144,7 +143,7 @@ The following table lists project permissions available for each role:
| [Projects](project/index.md):<br>Create [snippets](snippets.md) | | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Manage labels | | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>View [project traffic statistics](../api/project_statistics.md) | | ✓ | ✓ | ✓ | ✓ |
-| [Projects](project/index.md):<br>Create, edit, delete [milestones](project/milestones/index.md). | | | ✓ | ✓ | ✓ |
+| [Projects](project/index.md):<br>Create, edit, delete [milestones](project/milestones/index.md). | | ✓ | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Create, edit, delete [releases](project/releases/index.md) | | | ✓ (*12*) | ✓ (*12*) | ✓ (*12*) |
| [Projects](project/index.md):<br>Create, edit [wiki](project/wiki/index.md) pages | | | ✓ | ✓ | ✓ |
| [Projects](project/index.md):<br>Enable [Review Apps](../ci/review_apps/index.md) | | | ✓ | ✓ | ✓ |
@@ -391,6 +390,7 @@ The following table lists group permissions available for each role:
| Publish [packages](packages/index.md) | | | ✓ | ✓ | ✓ |
| Pull [packages](packages/index.md) | | ✓ | ✓ | ✓ | ✓ |
| Delete [packages](packages/index.md) | | | | ✓ | ✓ |
+| Create/edit/delete [Maven and generic package duplicate settings](packages/generic_packages/index.md#do-not-allow-duplicate-generic-packages) | | | | ✓ | ✓ |
| Pull a Container Registry image | ✓ (7) | ✓ | ✓ | ✓ | ✓ |
| Remove a Container Registry image | | | ✓ | ✓ | ✓ |
| View [Group DevOps Adoption](group/devops_adoption/index.md) | | ✓ | ✓ | ✓ | ✓ |
@@ -398,11 +398,12 @@ The following table lists group permissions available for each role:
| View [Productivity analytics](analytics/productivity_analytics.md) | | ✓ | ✓ | ✓ | ✓ |
| Create and edit [group wiki](project/wiki/group.md) pages | | | ✓ | ✓ | ✓ |
| Create project in group | | | ✓ (3)(5) | ✓ (3) | ✓ (3) |
-| Create/edit/delete group milestones | | | ✓ | ✓ | ✓ |
-| Create/edit/delete iterations | | | ✓ | ✓ | ✓ |
+| Create/edit/delete group milestones | | ✓ | ✓ | ✓ | ✓ |
+| Create/edit/delete iterations | | ✓ | ✓ | ✓ | ✓ |
| Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
-| Enable/disable a dependency proxy | | | ✓ | ✓ | ✓ |
+| Enable/disable a dependency proxy | | | | ✓ | ✓ |
| Purge the dependency proxy for a group | | | | | ✓ |
+| Create/edit/delete dependency proxy [cleanup policies](packages/dependency_proxy/reduce_dependency_proxy_storage.md#cleanup-policies) | | | | ✓ | ✓ |
| Use [security dashboard](application_security/security_dashboard/index.md) | | | ✓ | ✓ | ✓ |
| View group Audit Events | | | ✓ (7) | ✓ (7) | ✓ |
| Create subgroup | | | | ✓ (1) | ✓ |
@@ -445,7 +446,7 @@ The following table lists group permissions available for each role:
### Subgroup permissions
When you add a member to a subgroup, they inherit the membership and
-permission level from the parent group(s). This model allows access to
+permission level from the parent groups. This model allows access to
nested groups if you have membership in one of its parents.
To learn more, read through the documentation on
@@ -549,7 +550,7 @@ Auditor users are given read-only access to all projects, groups, and other
resources on the GitLab instance.
An Auditor user should be able to access all projects and groups of a GitLab instance
-with the permissions described on the documentation on [auditor users permissions](../administration/auditor_users.md#permissions-and-restrictions-of-an-auditor-user).
+with the permissions described on the documentation on [auditor users permissions](../administration/auditor_users.md#auditor-user-permissions-and-restrictions).
[Read more about Auditor users.](../administration/auditor_users.md)
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index a86968654c7..d7eb5040416 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -381,6 +381,34 @@ Each of these contribution events is tracked:
- Design
- Wiki page
+### Retrieve user activity as a feed
+
+GitLab provides RSS feeds of user activity. To subscribe to the
+RSS feed of a user's activity:
+
+1. Go to the [user's profile](#access-your-user-profile).
+1. In the top right, select the feed symbol **{rss}** to display the results as an RSS feed in Atom format.
+
+The URL of the result contains both a feed token, and
+the user's activity that you're authorized to view.
+You can add this URL to your feed reader.
+
+### Reset the user activity feed token
+
+Feed tokens are sensitive and can reveal information from confidential issues.
+If you think your feed token has been exposed, you should reset it.
+
+To reset your feed token:
+
+1. On the top bar, in the top right corner, select your avatar.
+1. Select **Edit profile**.
+1. On the left sidebar, select **Access Tokens**.
+1. Scroll down. In the **Feed token** section, select the
+ **reset this token** link.
+1. On the confirmation box, select **OK**.
+
+A new token is generated.
+
## Troubleshooting
### Why do I keep getting signed out?
diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md
index d0e9b427f1c..3eda363d108 100644
--- a/doc/user/profile/notifications.md
+++ b/doc/user/profile/notifications.md
@@ -7,6 +7,10 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Notification emails **(FREE)**
+> Enhanced email styling [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78604) in GitLab 14.9 [with a feature flag](../../administration/feature_flags.md) named `enhanced_notify_css`. Disabled by default.
+> Enhanced email styling [enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/355907) in GitLab 14.9.
+> Enhanced email styling [enabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/355907) in GitLab 15.0.
+
Stay informed about what's happening in GitLab with email notifications.
You can receive updates about activity in issues, merge requests, epics, and designs.
@@ -24,7 +28,7 @@ You might receive notifications for one of the following reasons:
or edit, or someone mentions <sup>1</sup> you.
- You've [enabled notifications in an issue, merge request, or epic](#notifications-on-issues-merge-requests-and-epics).
- You've configured notifications for the [project](#change-level-of-project-notifications) or [group](#group-notifications).
-- You're subscribed to group or project pipeline notifications via the pipeline emails [integration](../project/integrations/overview.md).
+- You're subscribed to group or project pipeline notifications via the pipeline emails [integration](../project/integrations/index.md).
1. GitLab doesn't send a notification when
[a comment is edited to include a user mention](../discussions/index.md#editing-a-comment-to-add-a-mention).
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 4c132094d24..09e71ce9133 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -23,7 +23,7 @@ Personal access tokens are:
- Required when [two-factor authentication (2FA)](account/two_factor_authentication.md) is enabled.
- Used with a GitLab username to authenticate with GitLab features that require usernames. For example,
- [GitLab managed Terraform state backend](../infrastructure/iac/terraform_state.md#using-a-gitlab-managed-terraform-state-backend-as-a-remote-data-source)
+ [GitLab-managed Terraform state backend](../infrastructure/iac/terraform_state.md#use-your-gitlab-backend-as-a-remote-data-source)
and [Docker container registry](../packages/container_registry/index.md#authenticate-with-the-container-registry),
- Similar to [project access tokens](../project/settings/project_access_tokens.md) and [group access tokens](../group/settings/group_access_tokens.md), but are attached
to a user rather than a project or group.
@@ -109,9 +109,7 @@ Personal access tokens expire on the date you define, at midnight UTC.
- GitLab runs a check at 01:00 AM UTC every day to identify personal access tokens that expire in the next seven days. The owners of these tokens are notified by email.
- GitLab runs a check at 02:00 AM UTC every day to identify personal access tokens that expire on the current date. The owners of these tokens are notified by email.
- In GitLab Ultimate, administrators can
- [limit the lifetime of personal access tokens](../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens).
-- In GitLab Ultimate, administrators can choose whether or not to
- [enforce personal access token expiration](../admin_area/settings/account_and_limit_settings.md#allow-expired-personal-access-tokens-to-be-used-deprecated).
+ [limit the lifetime of access tokens](../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens).
## Create a personal access token programmatically **(FREE SELF)**
diff --git a/doc/user/profile/preferences.md b/doc/user/profile/preferences.md
index ecd6e83efa1..c654eb2b0e8 100644
--- a/doc/user/profile/preferences.md
+++ b/doc/user/profile/preferences.md
@@ -91,8 +91,8 @@ Introduced in GitLab 13.6, the themes [Solarized](https://gitlab.com/gitlab-org/
## Diff colors
-A diff compares the old/removed content with the new/added content (e.g. when
-[reviewing a merge request](../project/merge_requests/reviews/index.md#review-a-merge-request) or in a
+A diff compares the old/removed content with the new/added content (e.g. when
+[reviewing a merge request](../project/merge_requests/reviews/index.md#review-a-merge-request) or in a
[Markdown inline diff](../markdown.md#inline-diff)).
Typically, the colors red and green are used for removed and added lines in diffs.
The exact colors depend on the selected [syntax highlighting theme](#syntax-highlighting-theme).
diff --git a/doc/user/project/canary_deployments.md b/doc/user/project/canary_deployments.md
index 344caed7449..a76517a7341 100644
--- a/doc/user/project/canary_deployments.md
+++ b/doc/user/project/canary_deployments.md
@@ -25,9 +25,6 @@ If there is a problem with the new version of the application, only a small
percentage of users are affected and the change can either be fixed or quickly
reverted.
-Leveraging [Kubernetes' Canary deployments](https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments), visualize your canary
-deployments right inside the [deploy board](deploy_boards.md), without the need to leave GitLab.
-
## Use cases
Canary deployments can be used when you want to ship features to only a portion of
@@ -45,38 +42,7 @@ may want to consider [setting `service.spec.sessionAffinity` to `ClientIP` in
your Kubernetes service definitions](https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies), but that is beyond the scope of
this document.
-## Enabling Canary Deployments
-
-Canary deployments require that you properly configure deploy boards:
-
-1. Follow the steps to [enable deploy boards](deploy_boards.md#enabling-deploy-boards).
-1. To track canary deployments you must label your Kubernetes deployments and
- pods with `track: canary`. To get started quickly, you can use the [Auto Deploy](../../topics/autodevops/stages.md#auto-deploy)
- template for canary deployments that GitLab provides.
-
-Depending on the deploy, the label should be either `stable` or `canary`.
-GitLab assumes the track label is `stable` if the label is blank or missing.
-Any other track label is considered `canary` (temporary).
-This allows GitLab to discover whether a deployment is stable or canary (temporary).
-
-Once all of the above are set up and the pipeline has run at least once,
-Go to the environments page under **Pipelines > Environments**.
-As the pipeline executes, deploy boards clearly mark canary pods, enabling
-quick and clear insight into the status of each environment and deployment.
-
-Canary deployments are marked with a yellow dot in the deploy board so that you
-can quickly notice them.
-
-![Canary deployments on deploy board](img/deploy_boards_canary_deployments.png)
-
-### Advanced traffic control with Canary Ingress (DEPRECATED)
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215501) in GitLab 13.6.
-> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212320) from GitLab Premium to GitLab Free in 13.8.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
-
-WARNING:
-This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+## Advanced traffic control with Canary Ingress
Canary deployments can be more strategic with [Canary Ingress](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary),
which is an advanced traffic routing service that controls incoming HTTP
@@ -84,7 +50,7 @@ requests between stable and canary deployments based on factors such as weight,
and others. GitLab uses this service in its [Auto Deploy architecture](../../topics/autodevops/upgrading_auto_deploy_dependencies.md#v2-chart-resource-architecture)
to let users quickly and safely roll out their new deployments.
-#### How to set up a Canary Ingress in a canary deployment
+### How to set up a Canary Ingress in a canary deployment
A Canary Ingress is installed by default if your Auto DevOps pipeline uses
[`v2.0.0+` of `auto-deploy-image`](../../topics/autodevops/upgrading_auto_deploy_dependencies.md#verify-dependency-versions).
@@ -106,14 +72,51 @@ Here's an example setup flow from scratch:
1. [Run a new Auto DevOps pipeline](../../ci/pipelines/index.md#run-a-pipeline-manually)
and make sure that the `canary` job succeeds and creates a canary deployment with Canary Ingress.
-#### How to check the current traffic weight on a Canary Ingress
+### Show Canary Ingress deployments on deploy boards (deprecated)
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/215501) in GitLab 13.6.
+> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212320) from GitLab Premium to GitLab Free in 13.8.
+> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+
+To view canary deployments you must properly configure deploy boards:
+
+1. Follow the steps to [enable deploy boards](deploy_boards.md#enabling-deploy-boards).
+1. To track canary deployments you must label your Kubernetes deployments and
+ pods with `track: canary`. To get started quickly, you can use the [Auto Deploy](../../topics/autodevops/stages.md#auto-deploy)
+ template for canary deployments that GitLab provides.
+
+Depending on the deploy, the label should be either `stable` or `canary`.
+GitLab assumes the track label is `stable` if the label is blank or missing.
+Any other track label is considered `canary` (temporary).
+This allows GitLab to discover whether a deployment is stable or canary (temporary).
+
+Once all of the above are set up and the pipeline has run at least once,
+Go to the environments page under **Pipelines > Environments**.
+As the pipeline executes, deploy boards clearly mark canary pods, enabling
+quick and clear insight into the status of each environment and deployment.
+
+Canary deployments are marked with a yellow dot in the deploy board so that you
+can quickly notice them.
+
+![Canary deployments on deploy board](img/deploy_boards_canary_deployments.png)
+
+#### How to check the current traffic weight on a Canary Ingress (deprecated)
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
1. Visit the [deploy board](../../user/project/deploy_boards.md).
1. View the current weights on the right.
![Rollout Status Canary Ingress](img/canary_weight.png)
-#### How to change the traffic weight on a Canary Ingress
+#### How to change the traffic weight on a Canary Ingress (deprecated)
+
+WARNING:
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
You can change the traffic weight in your environment's deploy board by using [GraphiQL](../../api/graphql/getting_started.md#graphiql),
or by sending requests to the [GraphQL API](../../api/graphql/getting_started.md#command-line).
diff --git a/doc/user/project/clusters/add_eks_clusters.md b/doc/user/project/clusters/add_eks_clusters.md
index 82106c9d1a9..935bc01bae7 100644
--- a/doc/user/project/clusters/add_eks_clusters.md
+++ b/doc/user/project/clusters/add_eks_clusters.md
@@ -226,7 +226,7 @@ on the running pod.
If you are using a self-managed GitLab instance, you need to configure
Amazon credentials. GitLab uses these credentials to assume an Amazon IAM role to create your cluster.
-Create an IAM user and ensure it has permissions to assume the role(s) that
+Create an IAM user and ensure it has permissions to assume the roles that
your users need to create EKS clusters.
For example, the following policy document allows assuming a role whose name starts with
diff --git a/doc/user/project/clusters/add_existing_cluster.md b/doc/user/project/clusters/add_existing_cluster.md
index f2d537513b7..c55c11151ce 100644
--- a/doc/user/project/clusters/add_existing_cluster.md
+++ b/doc/user/project/clusters/add_existing_cluster.md
@@ -27,7 +27,7 @@ To add any cluster to GitLab, you need:
- Either a GitLab.com account or an account for a self-managed installation
running GitLab 12.5 or later.
- The Maintainer role for group-level and project-level clusters.
-- Access to the Admin area for instance-level clusters.
+- Access to the Admin Area for instance-level clusters.
- A Kubernetes cluster.
- Cluster administration access to the cluster with `kubectl`.
@@ -230,3 +230,22 @@ kubectl create clusterrolebinding permissive-binding \
--user=kubelet \
--group=system:serviceaccounts
```
+
+## Troubleshooting
+
+### `There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid`
+
+If you encounter this error while connecting a Kubernetes cluster, ensure you're
+properly pasting the service token. Some shells may add a line break to the
+service token, making it invalid. Ensure that there are no line breaks by
+pasting your token into an editor and removing any additional spaces.
+
+You may also experience this error if your certificate is not valid. To check that your certificate's
+subject alternative names contain the correct domain for your cluster's API, run this command:
+
+```shell
+echo | openssl s_client -showcerts -connect kubernetes.example.com:443 2>/dev/null |
+openssl x509 -inform pem -noout -text
+```
+
+The `-connect` argument expects a `host:port` combination. For example, `https://kubernetes.example.com` would be `kubernetes.example.com:443`.
diff --git a/doc/user/project/clusters/add_remove_clusters.md b/doc/user/project/clusters/add_remove_clusters.md
index a4f6dc325c8..8cdd1792e7f 100644
--- a/doc/user/project/clusters/add_remove_clusters.md
+++ b/doc/user/project/clusters/add_remove_clusters.md
@@ -10,60 +10,11 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
-To create a new cluster use [Infrastructure as Code](../../infrastructure/iac/index.md#create-a-new-cluster-through-iac).
-
-NOTE:
-Every new Google Cloud Platform (GCP) account receives
-[$300 in credit upon sign up](https://console.cloud.google.com/freetrial).
-In partnership with Google, GitLab is able to offer an additional $200 for new GCP
-accounts to get started with the GitLab integration with Google Kubernetes Engine.
-[Follow this link](https://cloud.google.com/partners/partnercredit/?pcn_code=0014M00001h35gDQAQ#contact-form)
-to apply for credit.
-
-NOTE:
-Watch the webcast [Scalable app deployment with GitLab and Google Cloud Platform](https://about.gitlab.com/webcast/scalable-app-deploy/)
-and learn how to spin up a Kubernetes cluster managed by Google Cloud Platform (GCP)
-in a few clicks.
-
-## Create new cluster
-
-> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/327908) in GitLab 14.0.
-
-As of GitLab 14.0, use [Infrastructure as Code](../../infrastructure/iac/index.md#create-a-new-cluster-through-iac)
-to **safely create new clusters from GitLab**.
-
-Creating clusters from GitLab using cluster certificates is still available on the
-GitLab UI but was **deprecated** in GitLab 14.0 and is scheduled for removal in
-GitLab 15.0. We don't recommend using this method.
-
-You can create a new cluster hosted in EKS, GKE, on premises, and with other
-providers using cluster certificates:
-
-- [New cluster hosted on Google Kubernetes Engine (GKE)](add_gke_clusters.md).
-- [New cluster hosted on Amazon Elastic Kubernetes Service (EKS)](add_eks_clusters.md).
-
-To host them on premises and with other providers, you can use Terraform
-or your preferred tool of choice to create and connect a cluster with GitLab.
-The [GitLab Terraform provider](https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs/resources/project_cluster)
-supports connecting existing clusters using the certificate-based connection method.
-
-## Add existing cluster
-
-As of GitLab 14.0, use the [GitLab agent](../../clusters/agent/index.md)
-to connect your cluster to GitLab.
-
-Alternatively, you can [add an existing cluster](add_existing_cluster.md)
-through the certificate-based method, but we don't recommend using this method for [security implications](../../infrastructure/clusters/connect/index.md#security-implications-for-clusters-connected-with-certificates).
-
-## Configure your cluster
-
-As of GitLab 14.0, use the [GitLab agent](../../clusters/agent/index.md)
-to configure your cluster.
+To create and manage a new cluster use [Infrastructure as Code](../../infrastructure/iac/index.md#create-a-new-cluster-through-iac).
## Disable a cluster
-When you successfully create a new Kubernetes cluster or add an existing
-one to GitLab, the cluster connection to GitLab becomes enabled. To disable it:
+When you successfully connect an existing cluster using cluster certificates, the cluster connection to GitLab becomes enabled. To disable it:
1. Go to your:
- Project's **{cloud-gear}** **Infrastructure > Kubernetes clusters** page, for a project-level cluster.
@@ -95,26 +46,3 @@ To remove the Kubernetes cluster integration:
1. Go to your cluster details page.
1. Select the **Advanced Settings** tab.
1. Select either **Remove integration** or **Remove integration and resources**.
-
-## Access controls
-
-See [cluster access controls (RBAC or ABAC)](cluster_access.md).
-
-## Troubleshooting
-
-### There was a problem authenticating with your cluster. Please ensure your CA Certificate and Token are valid
-
-If you encounter this error while adding a Kubernetes cluster, ensure you're
-properly pasting the service token. Some shells may add a line break to the
-service token, making it invalid. Ensure that there are no line breaks by
-pasting your token into an editor and removing any additional spaces.
-
-You may also experience this error if your certificate is not valid. To check that your certificate's
-subject alternative names contain the correct domain for your cluster's API, run this:
-
-```shell
-echo | openssl s_client -showcerts -connect kubernetes.example.com:443 2>/dev/null |
-openssl x509 -inform pem -noout -text
-```
-
-Note that the `-connect` argument expects a `host:port` combination. For example, `https://kubernetes.example.com` would be `kubernetes.example.com:443`.
diff --git a/doc/user/project/clusters/cluster_access.md b/doc/user/project/clusters/cluster_access.md
index 8ff0a275649..43ceb3673d8 100644
--- a/doc/user/project/clusters/cluster_access.md
+++ b/doc/user/project/clusters/cluster_access.md
@@ -28,7 +28,7 @@ Helm also creates additional service accounts and other resources for each
installed application. Consult the documentation of the Helm charts for each application
for details.
-If you are [adding an existing Kubernetes cluster](add_remove_clusters.md#add-existing-cluster),
+If you are [adding an existing Kubernetes cluster](add_existing_cluster.md),
ensure the token of the account has administrator privileges for the cluster.
The resources created by GitLab differ depending on the type of cluster.
diff --git a/doc/user/project/clusters/deploy_to_cluster.md b/doc/user/project/clusters/deploy_to_cluster.md
index c1cdf754c11..fc41533b17c 100644
--- a/doc/user/project/clusters/deploy_to_cluster.md
+++ b/doc/user/project/clusters/deploy_to_cluster.md
@@ -11,7 +11,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
To connect your cluster to GitLab, use the [GitLab agent](../../clusters/agent/index.md).
-To deploy with the agent, use the [CI/CD workflow](../../clusters/agent/ci_cd_tunnel.md).
+To deploy with the agent, use the [CI/CD workflow](../../clusters/agent/ci_cd_workflow.md).
A Kubernetes cluster can be the destination for a deployment job. If
diff --git a/doc/user/project/clusters/gitlab_managed_clusters.md b/doc/user/project/clusters/gitlab_managed_clusters.md
index 9c5cc14f720..e295abf8d31 100644
--- a/doc/user/project/clusters/gitlab_managed_clusters.md
+++ b/doc/user/project/clusters/gitlab_managed_clusters.md
@@ -9,15 +9,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22011) in GitLab 11.5.
> - Became [optional](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/26565) in GitLab 11.11.
> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
To connect your cluster to GitLab, use the [GitLab agent](../../../user/clusters/agent/index.md).
To manage applications, use the [Cluster Project Management Template](../../../user/clusters/management_project_template.md).
+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 `certificate_based_clusters`.
+
You can choose to allow GitLab to manage your cluster for you. If your cluster
is managed by GitLab, resources for your projects are automatically created. See
-the [Access controls](add_remove_clusters.md#access-controls) section for
+the [Access controls](cluster_access.md) section for
details about the created resources.
If you choose to manage your own cluster, project-specific resources aren't created
diff --git a/doc/user/project/clusters/kubernetes_pod_logs.md b/doc/user/project/clusters/kubernetes_pod_logs.md
index b5e2a1bad51..b1158be9fb6 100644
--- a/doc/user/project/clusters/kubernetes_pod_logs.md
+++ b/doc/user/project/clusters/kubernetes_pod_logs.md
@@ -4,14 +4,23 @@ 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
---
-# Kubernetes Logs (DEPRECATED) **(FREE)**
+# Kubernetes Logs (DEPRECATED) **(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
diff --git a/doc/user/project/clusters/protect/container_host_security/index.md b/doc/user/project/clusters/protect/container_host_security/index.md
deleted file mode 100644
index c897100f14e..00000000000
--- a/doc/user/project/clusters/protect/container_host_security/index.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Container Host Security **(FREE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Container Host Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-Container Host Security in GitLab provides Intrusion Detection and Prevention capabilities that can
-monitor and (optionally) block activity inside the containers themselves. This is done by leveraging
-an integration with Falco to provide the monitoring capabilities and an integration with Pod
-Security Policies and AppArmor to provide blocking capabilities.
-
-## Overview
-
-Container Host Security can be used to monitor and block activity inside a container as well as to
-enforce security policies across the entire Kubernetes cluster. Falco profiles allow for users to
-define the activity they want to monitor for and detect. Among other things, this can include system
-log entries, process starts, file activity, and network ports opened. AppArmor is used to block any
-undesired activity via AppArmor profiles. These profiles are loaded into the cluster when
-referenced by Pod Security Policies.
-
-By default, Container Host Security is deployed into the cluster in monitor mode only, with no
-default profiles or rules running out-of-the-box. Activity monitoring and blocking begins only when
-users define profiles for these technologies.
-
-## Installation
-
-See the [installation guide](quick_start_guide.md) for the recommended steps to install the
-Container Host Security capabilities. This guide shows the recommended way of installing Container
-Host Security through the Cluster Management Project. However, it's also possible to do a manual
-installation through our Helm chart.
-
-## Features
-
-- Prevent containers from starting as root.
-- Limit the privileges and system calls available to containers.
-- Monitor system logs, process starts, files read/written/deleted, and network ports opened.
-- Optionally block processes from starting or files from being read/written/deleted.
-
-## Supported container orchestrators
-
-Kubernetes v1.14+ is the only supported container orchestrator. OpenShift and other container
-orchestrators aren't supported.
-
-## Supported Kubernetes providers
-
-The following cloud providers are supported:
-
-- Amazon EKS
-- Google GKE
-
-Although Container Host Security may function on Azure or self-managed Kubernetes instances, it isn't
-officially tested and supported on those providers.
-
-## Roadmap
-
-See the [Category Direction page](https://about.gitlab.com/direction/protect/container_host_security/)
-for more information on the product direction of Container Host Security.
diff --git a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
deleted file mode 100644
index af3128e3006..00000000000
--- a/doc/user/project/clusters/protect/container_host_security/quick_start_guide.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Getting started with Container Host Security **(FREE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Container Host Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-The following steps are recommended for installing Container Host Security.
-
-## Installation steps
-
-The following steps are recommended to install and use Container Host Security through GitLab:
-
-1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-group).
-1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
-1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
-
-1. Install and configure an Ingress node:
-
- - [Install the Ingress node via CI/CD (Cluster Management Project)](../../../../clusters/applications.md#install-ingress-using-gitlab-cicd).
- - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../gitlab_managed_clusters.md#base-domain)
- into the **Base domain** field on the **Details** tab. Save the changes to the Kubernetes
- cluster.
-
-1. [Install and configure Falco](../../../../clusters/applications.md#install-falco-using-gitlab-cicd)
- for activity monitoring.
-1. [Install and configure AppArmor](../../../../clusters/applications.md#install-apparmor-using-gitlab-cicd)
- for activity blocking.
-1. [Configure Pod Security Policies](../../../../clusters/applications.md#using-podsecuritypolicy-in-your-deployments)
- (required to be able to load AppArmor profiles).
-
-It's possible to install and manage Falco and AppArmor in other ways, such as installing them
-manually in a Kubernetes cluster and then connecting it back to GitLab. These methods aren't
-supported or documented.
-
-## Viewing the logs
-
-Falco logs can be viewed by running the following command in your Kubernetes cluster:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l app=falco
-```
-
-## Troubleshooting
-
-### Trouble connecting to the cluster
-
-Your CI/CD pipeline may occasionally fail or have trouble connecting to the cluster. Here are some
-initial troubleshooting steps that resolve the most common problems:
-
-1. [Clear the cluster cache](../../gitlab_managed_clusters.md#clearing-the-cluster-cache)
-1. If things still aren't working, a more assertive set of actions may help get things back to a
- good state:
-
- - Stop and [delete the problematic environment](../../../../../ci/environments/#delete-a-stopped-environment)
- in GitLab.
- - Delete the relevant namespace in Kubernetes by running
- `kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
- - Rerun the application project pipeline to redeploy the application.
-
-**Related documentation links:**
-
-- [Cluster Management Project](../../../../clusters/management_project.md)
diff --git a/doc/user/project/clusters/protect/container_network_security/index.md b/doc/user/project/clusters/protect/container_network_security/index.md
deleted file mode 100644
index b294859c660..00000000000
--- a/doc/user/project/clusters/protect/container_network_security/index.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Container Network Security **(FREE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Container Network Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-Container Network Security in GitLab provides basic firewall functionality by leveraging Cilium
-NetworkPolicies to filter traffic going in and out of the cluster as well as traffic between pods
-inside the cluster. Container Network Security can be used to enforce L3, L4, and L7 policies and
-can prevent an attacker with control over one pod from spreading laterally to access other pods in
-the same cluster. Both Ingress and Egress rules are supported.
-
-By default, Cilium is deployed in Detection-only mode and only logs attack attempts. GitLab provides
-a set of out-of-the-box policies as examples and to help users get started. These policies are
-disabled by default, as they must usually be customized to match application-specific needs.
-
-## Installation
-
-See the [installation guide](quick_start_guide.md) for the recommended steps to install GitLab
-Container Network Security. This guide shows the recommended way of installing Container Network
-Security through the Cluster Management Project. However, it's also possible to install Cilium
-manually through our Helm chart.
-
-## Features
-
-- GitLab managed installation of Cilium.
-- Support for L3, L4, and L7 policies.
-- Ability to export logs to a SIEM.
-- Statistics page showing volume of packets processed and dropped over time (Ultimate users only).
-- Management of NetworkPolicies through code in a project (Available for auto DevOps users only).
-- Management of CiliumNetworkPolicies through a UI policy manager (Ultimate users only).
-
-## Supported container orchestrators
-
-Kubernetes v1.14+ is the only supported container orchestrator. OpenShift and other container
-orchestrators aren't supported.
-
-## Supported Kubernetes providers
-
-The following cloud providers are supported:
-
-- Amazon EKS
-- Google GKE
-
-Although Container Network Security may function on Azure or self-managed Kubernetes instances, it
-isn't officially tested and supported on those providers.
-
-## Supported NetworkPolicies
-
-GitLab only supports the use of CiliumNetworkPolicies. Although generic Kubernetes NetworkPolicies
-or other kinds of NetworkPolicies may work, GitLab doesn't test or support them.
-
-## Managing NetworkPolicies through GitLab vs your cloud provider
-
-Some cloud providers offer integrations with Cilium or offer other ways to manage NetworkPolicies in
-Kubernetes. GitLab Container Network Security doesn't support deployments that have NetworkPolicies
-managed by an external provider. By choosing to manage NetworkPolicies through GitLab, you can take
-advantage of the following benefits:
-
-- Support for handling NetworkPolicy infrastructure as code.
-- Full revision history and audit log of all changes made.
-- Ability to revert back to a previous version at any time.
-
-## Roadmap
-
-See the [Category Direction page](https://about.gitlab.com/direction/protect/container_network_security/)
-for more information on the product direction of Container Network Security.
diff --git a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md b/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
deleted file mode 100644
index 7671ed7eb73..00000000000
--- a/doc/user/project/clusters/protect/container_network_security/quick_start_guide.md
+++ /dev/null
@@ -1,230 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Getting started with Container Network Security **(FREE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-Container Network Security is in its end-of-life process. It's [deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-The following steps are recommended for installing Container Network Security.
-
-## Installation steps
-
-The following steps are recommended to install and use Container Network Security through GitLab:
-
-1. [Install at least one runner and connect it to GitLab](https://docs.gitlab.com/runner/).
-1. [Create a group](../../../../group/#create-a-group).
-1. [Connect a Kubernetes cluster to the group](../../add_remove_clusters.md).
-1. [Create a cluster management project and associate it with the Kubernetes cluster](../../../../clusters/management_project.md).
-
-1. Install and configure an Ingress node:
-
- - [Install the Ingress node via CI/CD (Cluster Management Project)](../../../../clusters/applications.md#install-ingress-using-gitlab-cicd).
- - Navigate to the Kubernetes page and enter the [DNS address for the external endpoint](../../gitlab_managed_clusters.md#base-domain)
- into the **Base domain** field on the **Details** tab. Save the changes to the Kubernetes
- cluster.
-
-1. [Install and configure Cilium](#use-the-cluster-management-template-to-install-cilium).
-1. Be sure to restart all pods that were running before Cilium was installed by running this command
- in your cluster:
-
- `kubectl get pods --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HOSTNETWORK:.spec.hostNetwork --no-headers=true | grep '<none>' | awk '{print "-n "$1" "$2}' | xargs -L 1 -r kubectl delete pod`
-
- You can skip this step if `nodeinit.restartPods` is set to `true` on your Helm chart.
-
-It's possible to install and manage Cilium in other ways. For example, you could use the GitLab Helm
-chart to install Cilium manually in a Kubernetes cluster, and then connect it back to GitLab.
-However, such methods aren't documented or officially supported by GitLab.
-
-### Use the Cluster Management template to install Cilium
-
-[Cilium](https://cilium.io/) is a networking plug-in for Kubernetes that you can use to implement
-support for [`NetworkPolicy`](https://kubernetes.io/docs/concepts/services-networking/network-policies/)
-resources. For more information, see [Network Policies](../../../../../topics/autodevops/stages.md#network-policy).
-
-You can use the [Cluster Management Project Template](../../../../clusters/management_project_template.md)
-to install Cilium in your Kubernetes cluster.
-
-1. In your cluster management project, go to `helmfile.yaml` and uncomment `- path: applications/cilium/helmfile.yaml`.
-1. In `applications/cilium/helmfile.yaml`, set `clusterType` to either `gke` or `eks` based on which Kubernetes provider your are using.
-
- ```yaml
- environments:
- default:
- values:
- # Set to "gke" or "eks" based on your cluster type
- - clusterType: ""
- ```
-
-1. Merge or push these changes to the default branch of your cluster management project,
-and [GitLab CI/CD](../../../../../ci/index.md) will automatically install Cilium.
-
-WARNING:
-Installation and removal of the Cilium requires a **manual**
-[restart](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/#restart-unmanaged-pods)
-of all affected pods in all namespaces to ensure that they are
-[managed](https://docs.cilium.io/en/stable/operations/troubleshooting/#ensure-managed-pod)
-by the correct networking plug-in. When Hubble is enabled, its related pod might require a
-restart depending on whether it started prior to Cilium. For more information, see
-[Failed Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deployment)
-in the Kubernetes docs.
-
-NOTE:
-Major upgrades might require additional setup steps. For more information, see
-the official [upgrade guide](https://docs.cilium.io/en/stable/operations/upgrade/).
-
-Support for installing the Cilium application is provided by the
-GitLab Container Security group. If you run into unknown issues,
-[open a new issue](https://gitlab.com/gitlab-org/gitlab/-/issues/new), and ping at
-least 2 people from the
-[Container Security group](https://about.gitlab.com/handbook/product/categories/#container-security-group).
-
-### Configure the Cilium Helm chart
-
-You can customize Cilium's Helm variables by editing the `applications/cilium/values.yaml`
-file in your cluster management project. Refer to the [Cilium Helm reference](https://docs.cilium.io/en/stable/helm-reference/)
-for the available configuration options.
-
-By default, Cilium's
-[audit mode](https://docs.cilium.io/en/stable/gettingstarted/policy-creation/#enable-policy-audit-mode)
-is enabled. In audit mode, Cilium doesn't drop disallowed packets. You
-can use `policy-verdict` log to observe policy-related decisions. You
-can disable audit mode by setting `policyAuditMode: false` in
-`applications/cilium/values.yaml`.
-
-The Cilium monitor log for traffic is logged out by the
-`cilium-monitor` sidecar container. You can check these logs with the following command:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
-```
-
-You can disable the monitor log in `application/cilium/values.yaml`:
-
-```yaml
-monitor:
- enabled: false
-```
-
-The [Hubble](https://github.com/cilium/hubble) monitoring daemon is enabled by default
-and it's set to collect per namespace flow metrics. This metrics are accessible on the
-[Threat Monitoring](../../../../application_security/threat_monitoring/index.md)
-dashboard. You can disable Hubble by adding the following to
-`applications/cilium/values.yaml`:
-
-```yaml
-hubble:
- enabled: false
-```
-
-You can also adjust Helm values for Hubble by using
-`applications/cilium/values.yaml`:
-
-```yaml
-hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
-```
-
-## Managing Network Policies
-
-Managing NetworkPolicies through GitLab is advantageous over managing the policies in Kubernetes
-directly. Kubernetes doesn't provide a GUI editor, a change control process, or a revision history.
-Network Policies can be managed through GitLab in one of two ways:
-
-- Management through a YAML file in each application's project (for projects using Auto DevOps). For
- more information, see the [Network Policy documentation](../../../../../topics/autodevops/stages.md#network-policy).
-- Management through the GitLab Policy management UI (for projects not using Auto DevOps). For more
- information, see the [Container Network Policy documentation](../../../../application_security/policies/index.md#container-network-policy) (Ultimate only).
-
-Each method has benefits and drawbacks:
-
-| | YAML method | UI method (Ultimate only) |
-|--|:------------|:-------------------------------|
-| **Benefits** | A change control process is possible by requiring [MR Approvals](../../../merge_requests/approvals/index.md). All changes are fully tracked and audited in the same way that Git tracks the history of any file in its repository. | The UI provides a simple rules editor for users who are less familiar with the YAML syntax of NetworkPolicies. This view is a live representation of the policies currently deployed in the Kubernetes cluster. The UI also allows for multiple network policies to be created per environment. |
-| **Drawbacks** | Only one network policy can be deployed per environment (although that policy can be as detailed as needed). Also, if changes were made in Kubernetes directly rather than through the `auto-deploy-values.yaml` file, the YAML file's contents don't represent the actual state of policies deployed in Kubernetes. | Policy changes aren't audited and a change control process isn't available. |
-
-Users are encouraged to choose one of the two methods to manage their policies. If users attempt to
-use both methods simultaneously, when the application project pipeline runs the contents of the
-NetworkPolicy in the `auto-deploy-values.yaml` file may override policies configured in the UI
-editor.
-
-## Monitoring throughput **(ULTIMATE)**
-
-To view statistics for Container Network Security, you must follow the installation steps above and
-configure GitLab integration with Prometheus. Also, if you use custom Helm values for Cilium, you
-must enable Hubble with flow metrics for each namespace by adding the following lines to
-your [Cilium values](#use-the-cluster-management-template-to-install-cilium):
-
-```yaml
-hubble:
- enabled: true
- metrics:
- enabled:
- - 'flow:sourceContext=namespace;destinationContext=namespace'
-```
-
-Additional information about the statistics page is available in the
-[documentation that describes the Threat Management UI](../../../../application_security/policies/index.md#container-network-policy).
-
-## Forwarding logs to a SIEM
-
-Cilium logs can be forwarded to a SIEM or an external logging system through syslog protocol by
-installing and configuring Fluentd. Fluentd can be installed through the GitLab
-[Cluster Management Project](../../../../clusters/applications.md#install-fluentd-using-gitlab-cicd).
-
-## Viewing the logs
-
-Cilium logs can be viewed by running the following command in your Kubernetes cluster:
-
-```shell
-kubectl -n gitlab-managed-apps logs -l k8s-app=cilium -c cilium-monitor
-```
-
-## Troubleshooting
-
-### Traffic is not being blocked as expected
-
-By default, Cilium is installed in Audit mode only, meaning that NetworkPolicies log policy
-violations but don't block any traffic. To set Cilium to Blocking mode, you must add the following
-lines to the `applications/cilium/values.yaml` file in your cluster management project:
-
-```yaml
-policyEnforcementMode: "always"
-
-monitor:
- eventTypes: ["drop", "policy-verdict"]
-```
-
-### Traffic is not being allowed as expected
-
-Keep in mind that when Cilium is set to blocking mode (rather than Audit mode), NetworkPolicies
-operate on an allow-list basis. If one or more NetworkPolicies apply to a node, then all traffic
-that doesn't match at least one Policy is blocked. To resolve, add NetworkPolicies defining the
-traffic that you want to allow in the node.
-
-### Trouble connecting to the cluster
-
-Occasionally, your CI/CD pipeline may fail or have trouble connecting to the cluster. Here are some
-initial troubleshooting steps that resolve the most common problems:
-
-1. [Clear the cluster cache](../../gitlab_managed_clusters.md#clearing-the-cluster-cache).
-1. If things still aren't working, a more assertive set of actions may help get things back into a
- good state:
-
- - Stop and [delete the problematic environment](../../../../../ci/environments/index.md#delete-a-stopped-environment) in GitLab.
- - Delete the relevant namespace in Kubernetes by running `kubectl delete namespaces <insert-some-namespace-name>` in your Kubernetes cluster.
- - Rerun the application project pipeline to redeploy the application.
-
-**Related documentation links:**
-
-- [Cluster Management Project](../../../../clusters/management_project.md)
diff --git a/doc/user/project/clusters/protect/index.md b/doc/user/project/clusters/protect/index.md
deleted file mode 100644
index 6b89f7f1557..00000000000
--- a/doc/user/project/clusters/protect/index.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-stage: Protect
-group: Container Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
----
-
-# Protecting your deployed applications **(FREE)**
-
-> [Deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476) in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477) in GitLab 15.0.
-
-WARNING:
-The Container Network Security and Container Host Security features are in their end-of-life
-processes. They're
-[deprecated](https://gitlab.com/groups/gitlab-org/-/epics/7476)
-in GitLab 14.8, and planned for [removal](https://gitlab.com/groups/gitlab-org/-/epics/7477)
-in GitLab 15.0.
-
-GitLab makes it straightforward to protect applications deployed in [connected Kubernetes clusters](index.md).
-These protections are available in the Kubernetes network layer and in the container itself. At
-the network layer, the Container Network Security capabilities in GitLab provide basic firewall
-functionality by leveraging Cilium NetworkPolicies to filter traffic going in and out of the cluster
-and traffic between pods inside the cluster. Inside the container, Container Host Security provides
-Intrusion Detection and Prevention capabilities that can monitor and block activity inside the
-containers themselves.
-
-## Capabilities
-
-The following capabilities are available to protect deployed applications in Kubernetes:
-
-- Container Network Security
- - [Overview](container_network_security/index.md)
- - [Installation guide](container_network_security/quick_start_guide.md)
-- Container Host Security
- - [Overview](container_host_security/index.md)
- - [Installation guide](container_host_security/quick_start_guide.md)
diff --git a/doc/user/project/clusters/runbooks/index.md b/doc/user/project/clusters/runbooks/index.md
index 9d623518f72..086e1fccf6c 100644
--- a/doc/user/project/clusters/runbooks/index.md
+++ b/doc/user/project/clusters/runbooks/index.md
@@ -40,8 +40,8 @@ for an overview of how this is accomplished in GitLab!
To create an executable runbook, you need:
- **Kubernetes** - A Kubernetes cluster is required to deploy the rest of the
- applications. The simplest way to get started is to add a cluster using one
- of the [GitLab integrations](../add_remove_clusters.md#create-new-cluster).
+ applications. The simplest way to get started is to connect a cluster using the
+ [GitLab agent](../../../clusters/agent/index.md).
- **Ingress** - Ingress can provide load balancing, SSL termination, and name-based
virtual hosting. It acts as a web proxy for your applications.
- **JupyterHub** - [JupyterHub](https://jupyterhub.readthedocs.io/) is a multi-user
diff --git a/doc/user/project/clusters/serverless/aws.md b/doc/user/project/clusters/serverless/aws.md
index cf571abbf8a..93bc41dc24c 100644
--- a/doc/user/project/clusters/serverless/aws.md
+++ b/doc/user/project/clusters/serverless/aws.md
@@ -2,506 +2,10 @@
stage: Configure
group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+remove_date: '2022-08-22'
+redirect_to: '../../../../update/removals.md#gitlab-serverless'
---
-# Deploying AWS Lambda function using GitLab CI/CD **(FREE)**
+# Deploying AWS Lambda function using GitLab CI/CD (removed) **(FREE)**
-GitLab allows users to easily deploy AWS Lambda functions and create rich serverless applications.
-
-GitLab supports deployment of AWS Lambda functions through GitLab CI/CD using the following Serverless frameworks:
-
-- [Serverless Framework with AWS](#serverless-framework)
-- [AWS' Serverless Application Model (SAM)](#aws-serverless-application-model)
-
-## Serverless Framework
-
-The [Serverless Framework can deploy to AWS](https://www.serverless.com/framework/docs/providers/aws/).
-
-We have prepared an example with a step-by-step guide to create a simple function and deploy it on AWS.
-
-Additionally, in the [How To section](#how-to), you can read about different use cases like:
-
-- Running a function locally.
-- Working with secrets.
-- Setting up CORS.
-
-Alternatively, you can quickly [create a new project with a template](../../working_with_projects.md#create-a-project). The [`Serverless Framework/JS` template](https://gitlab.com/gitlab-org/project-templates/serverless-framework/) already includes all parts described below.
-
-### Example
-
-This example shows you how to:
-
-1. Create a basic AWS Lambda Node.js function.
-1. Link the function to an API Gateway `GET` endpoint.
-
-#### Steps
-
-The example consists of the following steps:
-
-1. Creating a Lambda handler function.
-1. Creating a `serverless.yml` file.
-1. Crafting the `.gitlab-ci.yml` file.
-1. Setting up your AWS credentials with your GitLab account.
-1. Deploying your function.
-1. Testing the deployed function.
-
-Lets take it step by step.
-
-#### Creating a Lambda handler function
-
-Your Lambda function is the primary handler of requests. In this case, create a very simple Node.js `hello` function:
-
-```javascript
-'use strict';
-
-module.exports.hello = async event => {
- return {
- statusCode: 200,
- body: JSON.stringify(
- {
- message: 'Your function executed successfully!'
- },
- null,
- 2
- ),
- };
-};
-```
-
-Place this code in the file `src/handler.js`.
-
-`src` is the standard location for serverless functions, but is customizable should you desire that.
-
-In our case, `module.exports.hello` defines the `hello` handler to reference later in the `serverless.yml`.
-
-You can learn more about the [AWS Lambda Node.js function handler](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html) and all its various options in its documentation.
-
-#### Creating a `serverless.yml` file
-
-In the root of your project, create a `serverless.yml` file containing configuration specifics for the Serverless Framework.
-
-Put the following code in the file:
-
-```yaml
-service: gitlab-example
-provider:
- name: aws
- runtime: nodejs14.x
-
-functions:
- hello:
- handler: src/handler.hello
- events:
- - http: GET hello
-```
-
-Our function contains a handler and a event.
-
-The handler definition provisions the Lambda function using the source code located `src/handler.hello`.
-
-The `events` declaration creates an AWS API Gateway `GET` endpoint to receive external requests and hand them over to the Lambda function via a service integration.
-
-You can read more about the [available properties and additional configuration possibilities](https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/) of the Serverless Framework.
-
-#### Crafting the `.gitlab-ci.yml` file
-
-In a `.gitlab-ci.yml` file in the root of your project, place the following code:
-
-```yaml
-image: node:latest
-
-stages:
- - deploy
-
-production:
- stage: deploy
- before_script:
- - npm config set prefix /usr/local
- - npm install -g serverless
- script:
- - serverless deploy --stage production --verbose
- environment: production
-```
-
-This example code does the following:
-
-1. Uses the `node:latest` image for all GitLab CI/CD builds
-1. The `deploy` stage:
- - Installs the Serverless Framework.
- - Deploys the serverless function to your AWS account using the AWS credentials
- defined above.
-
-#### Setting up your AWS credentials with your GitLab account
-
-In order to interact with your AWS account, the GitLab CI/CD pipelines require both `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be defined in your GitLab settings under **Settings > CI/CD > Variables**.
-For more information please see [Create a custom variable in the UI](../../../../ci/variables/index.md#custom-variables-validated-by-gitlab).
-
- The AWS credentials you provide must include IAM policies that provision correct
- access control to AWS Lambda, API Gateway, CloudFormation, and IAM resources.
-
-#### Deploying your function
-
-`git push` the changes to your GitLab repository and the GitLab build pipeline deploys your function.
-
-Your GitLab deploy stage log contains output containing your AWS Lambda endpoint URL,
-with log lines similar to this:
-
-```plaintext
-endpoints:
- GET - https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello
-```
-
-#### Manually testing your function
-
-Running the following `curl` command should trigger your function.
-Your URL should be the one retrieved from the GitLab deploy stage log:
-
-```shell
-curl "https://u768nzby1j.execute-api.us-east-1.amazonaws.com/production/hello"
-```
-
-That should output:
-
-```json
-{
- "message": "Your function executed successfully!"
-}
-```
-
-Hooray! You now have a AWS Lambda function deployed via GitLab CI/CD.
-
-Nice work!
-
-### How To
-
-In this section, we show you how to build on the basic example to:
-
-- Run the function locally.
-- Set up secret variables.
-- Set up CORS.
-
-#### Running function locally
-
-The `serverless-offline` plugin allows to run your code locally. To run your code locally:
-
-1. Add the following to your `serverless.yml`:
-
- ```yaml
- plugins:
- - serverless-offline
- ```
-
-1. Start the service by running the following command:
-
- ```shell
- serverless offline
- ```
-
-Running the following `curl` command should trigger your function.
-
-```shell
-curl "http://localhost:3000/hello"
-```
-
-It should output:
-
-```json
-{
- "message": "Your function executed successfully!"
-}
-```
-
-#### Secret variables
-
-Secrets are injected into your functions using environment variables.
-
-By defining variables in the provider section of the `serverless.yml`, you add them to
-the environment of the deployed function:
-
-```yaml
-provider:
- # Other configuration omitted
- # ...
- environment:
- A_VARIABLE: ${env:A_VARIABLE}
-```
-
-From there, you can reference them in your functions as well.
-Remember to add `A_VARIABLE` to your GitLab CI/CD variables under **Settings > CI/CD > Variables** to be picked up and deployed with your function.
-
-NOTE:
-Anyone with access to the AWS environment may be able to see the values of those
-variables persisted in the lambda definition.
-
-#### Setting up CORS
-
-If you want to set up a web page that makes calls to your function, like we have done in the [template](https://gitlab.com/gitlab-org/project-templates/serverless-framework/), you need to deal with the Cross-Origin Resource Sharing (CORS).
-
-The quick way to do that is to add the `cors: true` flag to the HTTP endpoint in your `serverless.yml`:
-
-```yaml
-functions:
- hello:
- handler: src/handler.hello
- events:
- - http: # Rewrite this part to enable CORS
- path: hello
- method: get
- cors: true # <-- CORS here
-```
-
-You also need to return CORS specific headers in your function response:
-
-```javascript
-'use strict';
-
-module.exports.hello = async event => {
- return {
- statusCode: 200,
- headers: {
- // Uncomment the line below if you need access to cookies or authentication
- // 'Access-Control-Allow-Credentials': true,
- 'Access-Control-Allow-Origin': '*'
- },
- body: JSON.stringify(
- {
- message: 'Your function executed successfully!'
- },
- null,
- 2
- ),
- };
-};
-```
-
-For more information, see the [Your CORS and API Gateway survival guide](https://www.serverless.com/blog/cors-api-gateway-survival-guide/)
-blog post written by the Serverless Framework team.
-
-#### Writing automated tests
-
-The [Serverless Framework](https://gitlab.com/gitlab-org/project-templates/serverless-framework/)
-example project shows how to use Jest, Axios, and `serverless-offline` plugin to do
-automated testing of both local and deployed serverless function.
-
-### Examples and template
-
-The example code is available:
-
-- As a [clonable repository](https://gitlab.com/gitlab-org/serverless/examples/serverless-framework-js).
-- In a version with [tests and secret variables](https://gitlab.com/gitlab-org/project-templates/serverless-framework/).
-
-You can also use a [template](../../working_with_projects.md#create-a-project)
-(based on the version with tests and secret variables) from within the GitLab UI (see
-the `Serverless Framework/JS` template).
-
-## AWS Serverless Application Model
-
-AWS Serverless Application Model is an open source framework for building serverless
-applications. It makes it easier to build and deploy serverless applications. For more
-details, please take a look at AWS documentation on [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/).
-
-### Deploying AWS Lambda function using AWS SAM and GitLab CI/CD
-
-GitLab allows developers to build and deploy serverless applications using the combination of:
-
-- [AWS Serverless Application Model (AWS SAM)](https://aws.amazon.com/serverless/sam/).
-- GitLab CI/CD.
-
-### Example
-
-This example shows you how to:
-
-- Install SAM CLI.
-- Create a sample SAM application including a Lambda function and API Gateway.
-- Build and deploy the application to your AWS account using GitLab CI/CD.
-
-### Steps
-
-The example consists of the following steps:
-
-1. Installing SAM CLI.
-1. Creating an AWS SAM application using SAM CLI.
-1. Crafting the `.gitlab-ci.yml` file.
-1. Setting up your AWS credentials with your GitLab account.
-1. Deploying your application.
-1. Testing the deployed function.
-
-### Installing SAM CLI
-
-AWS SAM provides a CLI called AWS SAM CLI to make it easier to create and manage
-applications.
-
-Some steps in this documentation use SAM CLI. Follow the instructions for
-[installing SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
-to install and configure SAM CLI.
-
-If you use [AWS Cloud9](https://aws.amazon.com/cloud9/) as your integrated development
-environment (IDE), the following are installed for you:
-
-- [AWS Command Line Interface](https://docs.aws.amazon.com/en_pv/cli/latest/userguide/cli-chap-install.html)
-- [SAM CLI](https://docs.aws.amazon.com/en_pv/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
-- [Docker](https://docs.docker.com/install/) and necessary Docker images.
-
-### Creating an AWS SAM application using SAM CLI
-
-To create a new AWS SAM application:
-
-1. Create a new GitLab project.
-1. `git clone` the project into your local environment.
-1. Change to the newly cloned project and create a new SAM app using the following command:
-
- ```shell
- sam init -r python3.8 -n gitlabpoc --app-template "hello-world"
- ```
-
-1. `git push` the application back to the GitLab project.
-
-This creates a SAM app named `gitlabpoc` using the default configuration, a single
-Python 3.8 function invoked by an [Amazon API Gateway](https://aws.amazon.com/api-gateway/)
-endpoint. To see additional runtimes supported by SAM and options for `sam init`, run:
-
-```shell
-sam init -h
-```
-
-### Setting up your AWS credentials with your GitLab account
-
-In order to interact with your AWS account, the GitLab CI/CD pipelines require both
-`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` to be set in the project's CI/CD variables.
-
-To set these:
-
-1. Navigate to the project's **Settings > CI/CD**.
-1. Expand the **Variables** section and create entries for `AWS_ACCESS_KEY_ID` and
- `AWS_SECRET_ACCESS_KEY`.
-1. Mask the credentials so they do not show in logs using the **Masked** toggle.
-
-The AWS credentials you provide must include IAM policies that provision correct access
-control to AWS Lambda, API Gateway, CloudFormation, and IAM resources.
-
-### Crafting the `.gitlab-ci.yml` file
-
-In a [`.gitlab-ci.yml`](../../../../ci/yaml/index.md) file in the root of your project,
-add the following and replace `<S3_bucket_name>` with the name of the S3 bucket where you
-want to store your package:
-
-```yaml
-image: python:latest
-
-stages:
- - deploy
-
-production:
- stage: deploy
- before_script:
- - apt-get update
- - apt-get install -y python3-pip
- - pip3 install awscli --upgrade
- - pip3 install aws-sam-cli --upgrade
- script:
- - sam build
- - sam package --output-template-file packaged.yaml --s3-bucket <S3_bucket_name>
- - sam deploy --template-file packaged.yaml --stack-name gitlabpoc --s3-bucket <S3_bucket_name> --capabilities CAPABILITY_IAM --region us-east-1
- environment: production
-```
-
-Let's examine the configuration file more closely:
-
-- `image` specifies the Docker image to use for this build. This is the latest Python
- image since the sample application is written in Python.
-- AWS CLI and AWS SAM CLI are installed in the `before_script` section.
-- SAM build, package, and deploy commands are used to build, package, and deploy the
- application.
-
-### Deploying your application
-
-Push changes to your GitLab repository and the GitLab build pipeline
-deploys your application. If your:
-
-- Build and deploy are successful, [test your deployed application](#testing-the-deployed-application).
-- Build fails, look at the build log to see why the build failed. Some common reasons
- the build might fail are:
-
- - Incompatible versions of software. For example, Python runtime version might be
- different from the Python on the build machine. Address this by installing the
- required versions of the software.
- - You may not be able to access your AWS account from GitLab. Check the CI/CD variables
- you set up with AWS credentials.
- - You may not have permission to deploy a serverless application. Make sure you
- provide all required permissions to deploy a serverless application.
-
-### Testing the deployed application
-
-To test the application you deployed, please go to the build log and follow the following steps:
-
-1. Click on "Show complete raw" on the upper right-hand corner:
-
- ![SAM complete raw](img/sam-complete-raw.png)
-
-1. Look for HelloWorldApi – API Gateway endpoint similar to shown below:
-
- ![SAM API endpoint](img/sam-api-endpoint.png)
-
-1. Use curl to test the API. For example:
-
- ```shell
- curl "https://py4rg7qtlg.execute-api.us-east-1.amazonaws.com/Prod/hello/"
- ```
-
-Output should be:
-
-```json
-{"message": "hello world"}
-```
-
-### Testing Locally
-
-AWS SAM provides functionality to test your applications locally. You must have AWS SAM
-CLI installed locally for you to test locally.
-
-First, test the function.
-
-SAM provides a default event in `events/event.json` that includes a message body of:
-
-```plaintext
-{\"message\": \"hello world\"}
-```
-
-If you pass that event into the `HelloWorldFunction`, it should respond with the same
-body.
-
-Invoke the function by running:
-
-```shell
-sam local invoke HelloWorldFunction -e events/event.json
-```
-
-Output should be:
-
-```json
-{"message": "hello world"}
-```
-
-After you confirm that Lambda function is working as expected, test the API Gateway
-using following steps.
-
-Start the API locally by running:
-
-```shell
-sam local start-api
-```
-
-SAM again launches a Docker container, this time with a mocked Amazon API Gateway
-listening on `localhost:3000`.
-
-Call the `hello` API by running:
-
-```shell
-curl "http://127.0.0.1:3000/hello"
-```
-
-Output again should be:
-
-```json
-{"message": "hello world"}
-```
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/6) in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267) in GitLab 15.0.
diff --git a/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png b/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png
deleted file mode 100644
index a19d236fc39..00000000000
--- a/doc/user/project/clusters/serverless/img/function-details-loaded_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/function-endpoint.png b/doc/user/project/clusters/serverless/img/function-endpoint.png
deleted file mode 100644
index a38fe2cb6c2..00000000000
--- a/doc/user/project/clusters/serverless/img/function-endpoint.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/function-execution.png b/doc/user/project/clusters/serverless/img/function-execution.png
deleted file mode 100644
index f60dd277081..00000000000
--- a/doc/user/project/clusters/serverless/img/function-execution.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/function-list_v12_7.png b/doc/user/project/clusters/serverless/img/function-list_v12_7.png
deleted file mode 100644
index f2a27ce7b0f..00000000000
--- a/doc/user/project/clusters/serverless/img/function-list_v12_7.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/sam-api-endpoint.png b/doc/user/project/clusters/serverless/img/sam-api-endpoint.png
deleted file mode 100644
index 3407b2684fd..00000000000
--- a/doc/user/project/clusters/serverless/img/sam-api-endpoint.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/sam-complete-raw.png b/doc/user/project/clusters/serverless/img/sam-complete-raw.png
deleted file mode 100644
index 1130cd29d56..00000000000
--- a/doc/user/project/clusters/serverless/img/sam-complete-raw.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png b/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png
deleted file mode 100644
index f88eb4bdcd2..00000000000
--- a/doc/user/project/clusters/serverless/img/serverless-page_v14_0.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/clusters/serverless/index.md b/doc/user/project/clusters/serverless/index.md
index 29164da307b..432caa8476f 100644
--- a/doc/user/project/clusters/serverless/index.md
+++ b/doc/user/project/clusters/serverless/index.md
@@ -2,818 +2,10 @@
stage: Configure
group: Configure
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+remove_date: '2022-08-22'
+redirect_to: '../../../../update/removals.md#gitlab-serverless'
---
-# Serverless (DEPRECATED) **(FREE)**
+# Serverless (removed) **(FREE)**
-> - Introduced in GitLab 11.5.
-> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/6) in GitLab 14.3.
-
-WARNING:
-Serverless is currently in [alpha](../../../../policy/alpha-beta-support.md#alpha-features).
-
-## Overview
-
-Serverless architectures offer Operators and Developers the ability write highly scalable applications without provisioning a single server.
-
-GitLab supports several ways deploy Serverless applications in both Kubernetes Environments and also major cloud Function as a Service (FaaS) environments.
-
-Currently we support:
-
-- [Knative](#knative): Build Knative applications with Knative and `gitlabktl` on GKE and EKS.
-- [AWS Lambda](aws.md): Create serverless applications via the Serverless Framework and GitLab CI/CD.
-
-## Knative
-
-Run serverless workloads on Kubernetes using [Knative](https://cloud.google.com/knative/).
-
-Knative extends Kubernetes to provide a set of middleware components that are useful to build
-modern, source-centric, container-based applications. Knative brings some significant benefits out
-of the box through its main components:
-
-- [Serving](https://github.com/knative/serving): Request-driven compute that can scale to zero.
-- [Eventing](https://github.com/knative/eventing): Management and delivery of events.
-
-For more information on Knative, visit the [Knative docs repository](https://github.com/knative/docs).
-
-With GitLab Serverless, you can deploy both FaaS and serverless applications.
-
-## Prerequisites
-
-To run Knative on GitLab, you need:
-
-1. **Existing GitLab project:** You need a GitLab project to associate all resources. The simplest way to get started:
- - If you are planning on [deploying functions](#deploying-functions),
- clone the [functions example project](https://gitlab.com/knative-examples/functions) to get
- started.
- - If you are planning on [deploying a serverless application](#deploying-serverless-applications),
- clone the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app) to get
- started.
-1. **Kubernetes Cluster:** An RBAC-enabled Kubernetes cluster is required to deploy Knative.
- The simplest way to get started is to add a cluster using the GitLab [GKE integration](../add_remove_clusters.md).
- The set of minimum recommended cluster specifications to run Knative is 3 nodes, 6 vCPUs, and 22.50 GB memory.
-1. **GitLab Runner:** A runner is required to run the CI jobs that deploy serverless
- applications or functions onto your cluster. You can install GitLab Runner
- onto the [existing Kubernetes cluster](https://docs.gitlab.com/runner/install/kubernetes.html).
-1. **Domain Name:** Knative provides its own load balancer using Istio, and an
- external IP address or hostname for all the applications served by Knative. Enter a
- wildcard domain to serve your applications. Configure your DNS server to use the
- external IP address or hostname for that domain.
-1. **`.gitlab-ci.yml`:** GitLab uses [Kaniko](https://github.com/GoogleContainerTools/kaniko)
- to build the application. We also use [GitLab Knative tool](https://gitlab.com/gitlab-org/gitlabktl)
- CLI to simplify the deployment of services and functions to Knative.
-1. **`serverless.yml`** (for [functions only](#deploying-functions)): When using serverless to deploy functions, the `serverless.yml` file
- contains the information for all the functions being hosted in the repository as well as a reference
- to the runtime being used.
-1. **`Dockerfile`** (for [applications only](#deploying-serverless-applications)): Knative requires a
- `Dockerfile` in order to build your applications. It should be included at the root of your
- project's repository and expose port `8080`. `Dockerfile` is not require if you plan to build serverless functions
- using our [runtimes](https://gitlab.com/gitlab-org/serverless/runtimes).
-1. **Prometheus** (optional): The [Prometheus cluster integration](../../../clusters/integrations.md#prometheus-cluster-integration)
- allows you to monitor the scale and traffic of your serverless function/application.
-1. **Logging** (optional): Configuring logging allows you to view and search request logs for your serverless function/application.
- See [Configuring logging](#configuring-logging) for more information.
-
-## Configuring Knative
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/58941) in GitLab 12.0.
-
-1. Follow the steps to
- [add a Kubernetes
- cluster](../add_remove_clusters.md).
-
-1. Ensure GitLab can manage Knative:
- - For a non-GitLab managed cluster, ensure that the service account for the token
- provided can manage resources in the `serving.knative.dev` API group.
- - For a GitLab managed cluster, if you added the cluster in [GitLab 12.1 or later](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/30235),
- then GitLab already has the required access and you can proceed to the next step.
-
- Otherwise, you need to manually grant the GitLab service account the ability to manage
- resources in the `serving.knative.dev` API group. Since every GitLab service account
- has the `edit` cluster role, the simplest way to do this is with an
- [aggregated ClusterRole](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles)
- adding rules to the default `edit` cluster role: First, save the following YAML as
- `knative-serving-only-role.yaml`:
-
- ```yaml
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRole
- metadata:
- name: knative-serving-only-role
- labels:
- rbac.authorization.k8s.io/aggregate-to-edit: "true"
- rules:
- - apiGroups:
- - serving.knative.dev
- resources:
- - configurations
- - configurationgenerations
- - routes
- - revisions
- - revisionuids
- - autoscalers
- - services
- verbs:
- - get
- - list
- - create
- - update
- - delete
- - patch
- - watch
- ```
-
- Then run the following command:
-
- ```shell
- kubectl apply -f knative-serving-only-role.yaml
- ```
-
- Alternatively, permissions can be granted on a per-service account basis
- using `Role`s and `RoleBinding`s (see the [Kubernetes RBAC
- documentation](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
- for more information).
-
-1. Follow the steps to deploy [functions](#deploying-functions)
- or [serverless applications](#deploying-serverless-applications) onto your
- cluster.
-
-1. **Optional:** For invocation metrics to show in GitLab, additional Istio metrics need to be configured in your cluster. For example, with Knative v0.9.0, you can use [this manifest](https://gitlab.com/gitlab-org/charts/knative/-/raw/v0.10.0/vendor/istio-metrics.yml).
-
-## Supported runtimes
-
-Serverless functions for GitLab can be run using:
-
-- [GitLab-managed](#gitlab-managed-runtimes) runtimes.
-- [OpenFaaS](#openfaas-runtimes) runtimes.
-
-If a runtime is not available for the required programming language, consider deploying a
-[serverless application](#deploying-serverless-applications).
-
-### GitLab-managed runtimes
-
-The following GitLab-managed [runtimes](https://gitlab.com/gitlab-org/serverless/runtimes)
-are available:
-
-- `go` (proof of concept)
-- `nodejs`
-- `ruby`
-
-You must provide a `Dockerfile` to run serverless functions if no runtime is specified.
-
-### OpenFaaS runtimes
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29253) in GitLab 12.5.
-
-[OpenFaaS classic runtimes](https://github.com/openfaas/templates#templates-in-store) can be used with GitLab serverless.
-
-OpenFaas runtimes are available for the following languages:
-
-- C#
-- Go
-- NodeJS
-- PHP
-- Python
-- Ruby
-
-Runtimes are specified using the pattern: `openfaas/classic/<template_name>`. The following
-example shows how to define a function in `serverless.yml` using an OpenFaaS runtime:
-
-```yaml
-hello:
- source: ./hello
- runtime: openfaas/classic/ruby
- description: "Ruby function using OpenFaaS classic runtime"
-```
-
-`handler` is not needed for OpenFaaS functions. The location of the handler is defined
-by the conventions of the runtime.
-
-See the [`ruby-openfaas-function`](https://gitlab.com/knative-examples/ruby-openfaas-function)
-project for an example of a function using an OpenFaaS runtime.
-
-## Deploying functions
-
-> Introduced in GitLab 11.6.
-
-You can find and import all the files referenced in this doc in the
-**[functions example project](https://gitlab.com/knative-examples/functions)**.
-
-Follow these steps to deploy a function using the Node.js runtime to your
-Knative instance (you can skip these steps if you've cloned the example
-project):
-
-1. Create a directory to house the function. In this example we will
- create a directory called `echo` at the root of the project.
-
-1. Create the file to contain the function code. In this example, our file is called `echo.js` and is located inside the `echo` directory. If your project is:
- - Public, continue to the next step.
- - Private, you must [create a GitLab deploy token](../../deploy_tokens/index.md#creating-a-deploy-token) with `gitlab-deploy-token` as the name and the `read_registry` scope.
-
-1. `.gitlab-ci.yml`: this defines a pipeline used to deploy your functions.
- It must be included at the root of your repository:
-
- ```yaml
- include:
- - template: Serverless.gitlab-ci.yml
-
- functions:build:
- extends: .serverless:build:functions
- environment: production
-
- functions:deploy:
- extends: .serverless:deploy:functions
- environment: production
- ```
-
- This `.gitlab-ci.yml` creates jobs that invoke some predefined commands to
- build and deploy your functions to your cluster.
-
- `Serverless.gitlab-ci.yml` is a template that allows customization.
- You can either import it with `include` parameter and use `extends` to
- customize your jobs, or you can inline the entire template by choosing it
- from **Apply a template** dropdown when editing the `.gitlab-ci.yml` file through
- the user interface.
-
-1. `serverless.yml`: this file contains the metadata for your functions,
- such as name, runtime, and environment.
-
- It must be included at the root of your repository.
- The following is a sample `echo` function which shows the required structure
- for the file.
-
- You can find the relevant files for this project in the [functions example project](https://gitlab.com/knative-examples/functions).
-
- ```yaml
- service: functions
- description: "GitLab Serverless functions using Knative"
-
- provider:
- name: triggermesh
- envs:
- FOO: value
- secrets:
- - my-secrets
-
- functions:
- echo-js:
- handler: echo-js
- source: ./echo-js
- runtime: gitlab/runtimes/nodejs
- description: "node.js runtime function"
- envs:
- MY_FUNCTION: echo-js
- secrets:
- - my-secrets
- ```
-
-Explanation of the fields used above:
-
-### `service`
-
-| Parameter | Description |
-|-----------|-------------|
-| `service` | Name for the Knative service which serves the function. |
-| `description` | A short description of the `service`. |
-
-### `provider`
-
-| Parameter | Description |
-|-----------|-------------|
-| `name` | Indicates which provider is used to execute the `serverless.yml` file. In this case, the TriggerMesh middleware. |
-| `envs` | Includes the environment variables to be passed as part of function execution for **all** functions in the file, where `FOO` is the variable name and `BAR` are the variable contents. You may replace this with your own variables. |
-| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for **all** functions in the file. The secrets are expected in `INI` format. |
-
-### `functions`
-
-In the `serverless.yml` example above, the function name is `echo` and the
-subsequent lines contain the function attributes.
-
-| Parameter | Description |
-|-----------|-------------|
-| `handler` | The function's name. |
-| `source` | Directory with sources of a functions. |
-| `runtime` (optional)| The runtime to be used to execute the function. This can be a runtime alias (see [Runtime aliases](#runtime-aliases)), or it can be a full URL to a custom runtime repository. When the runtime is not specified, we assume that `Dockerfile` is present in the function directory specified by `source`. |
-| `description` | A short description of the function. |
-| `envs` | Sets an environment variable for the specific function only. |
-| `secrets` | Includes the contents of the Kubernetes secret as environment variables accessible to be passed as part of function execution for the specific function only. The secrets are expected in `INI` format. |
-
-### Deployment
-
-#### Runtime aliases
-
-The optional `runtime` parameter can refer to one of the following runtime aliases (also see [Supported runtimes](#supported-runtimes)):
-
-| Runtime alias | Maintained by |
-|-------------|---------------|
-| `gitlab/runtimes/go` | GitLab |
-| `gitlab/runtimes/nodejs` | GitLab |
-| `gitlab/runtimes/ruby` | GitLab |
-| `openfaas/classic/csharp` | OpenFaaS |
-| `openfaas/classic/go` | OpenFaaS |
-| `openfaas/classic/node` | OpenFaaS |
-| `openfaas/classic/php7` | OpenFaaS |
-| `openfaas/classic/python` | OpenFaaS |
-| `openfaas/classic/python3` | OpenFaaS |
-| `openfaas/classic/ruby` | OpenFaaS |
-
-After the `.gitlab-ci.yml` template has been added and the `serverless.yml` file
-has been created, pushing a commit to your project results in a CI pipeline
-being executed which deploys each function as a Knative service. After the
-deploy stage has finished, additional details for the function display
-under **Infrastructure > Serverless platform**.
-
-![serverless page](img/serverless-page_v14_0.png)
-
-This page contains all functions available for the project, the description for
-accessing the function, and, if available, the function's runtime information.
-The details are derived from the Knative installation inside each of the project's
-Kubernetes cluster. Click on each function to obtain detailed scale and invocation data.
-
-The function details can be retrieved directly from Knative on the cluster:
-
-```shell
-kubectl -n "$KUBE_NAMESPACE" get services.serving.knative.dev
-```
-
-The sample function can now be triggered from any HTTP client using a simple `POST` call:
-
- 1. Using curl (replace the URL on the last line with the URL of your application):
-
- ```shell
- curl \
- --header "Content-Type: application/json" \
- --request POST \
- --data '{"GitLab":"FaaS"}' \
- "http://functions-echo.functions-1.functions.example.com/"
- ```
-
- 1. Using a web-based tool (such as Postman or Restlet)
-
- ![function execution](img/function-execution.png)
-
-### Secrets
-
-To access your Kubernetes secrets from within your function, the secrets should be created under the namespace of your serverless deployment and specified in your `serverless.yml` file as above.
-You can create secrets in several ways. The following sections show some examples.
-
-#### CLI example
-
-```shell
-kubectl create secret generic my-secrets -n "$KUBE_NAMESPACE" --from-literal MY_SECRET=imverysecure
-```
-
-#### Part of deployment job
-
-You can extend your `.gitlab-ci.yml` to create the secrets during deployment using the [CI/CD variables](../../../../ci/variables/index.md)
-stored securely under your GitLab project.
-
-```yaml
-deploy:function:
- stage: deploy
- environment: production
- extends: .serverless:deploy:functions
- before_script:
- - kubectl create secret generic my-secret
- --from-literal MY_SECRET="$GITLAB_SECRET_VARIABLE"
- --namespace "$KUBE_NAMESPACE"
- --dry-run -o yaml | kubectl apply -f -
-```
-
-### Running functions locally
-
-Running a function locally is a good way to quickly verify behavior during development.
-
-Running functions locally requires:
-
-- Go 1.12 or newer installed.
-- Docker Engine installed and running.
-- `gitlabktl` installed using the Go package manager:
-
- ```shell
- GO111MODULE=on go get gitlab.com/gitlab-org/gitlabktl
- ```
-
-To run a function locally:
-
-1. Navigate to the root of your GitLab serverless project.
-1. Build your function into a Docker image:
-
- ```shell
- gitlabktl serverless build
- ```
-
-1. Run your function in Docker:
-
- ```shell
- docker run -itp 8080:8080 <your_function_name>
- ```
-
-1. Invoke your function:
-
- ```shell
- curl "http://localhost:8080"
- ```
-
-## Deploying Serverless applications
-
-> Introduced in GitLab 11.5.
-
-Serverless applications are an alternative to [serverless functions](#deploying-functions).
-They're useful in scenarios where an existing runtime does not meet the needs of
-an application, such as one written in a language that has no runtime available.
-Note though that serverless applications should be stateless.
-
-You can reference and import the sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app)
-to get started. Add the following `.gitlab-ci.yml` to the root of your repository
-(you may skip this step if you've previously cloned the previously mentioned,
-sample [Knative Ruby App](https://gitlab.com/knative-examples/knative-ruby-app)):
-
-```yaml
-include:
- - template: Serverless.gitlab-ci.yml
-
-build:
- extends: .serverless:build:image
-
-deploy:
- extends: .serverless:deploy:image
-```
-
-`Serverless.gitlab-ci.yml` is a template that allows customization.
-You can either import it with `include` parameter and use `extends` to
-customize your jobs, or you can inline the entire template by choosing it
-from **Apply a template** dropdown when editing the `.gitlab-ci.yml` file through
-the user interface.
-
-A `serverless.yml` file is not required when deploying serverless applications.
-
-### Deploy the application with Knative
-
-With all the pieces in place, the next time a CI pipeline runs the Knative application deploys. Navigate to
-**CI/CD > Pipelines** and click the most recent pipeline.
-
-### Function details
-
-Go to the **Infrastructure > Serverless platform** page to see the final URL of your functions.
-
-![function_details](img/function-list_v12_7.png)
-
-### Invocation metrics
-
-On the same page as above, click on one of the function
-rows to bring up the function details page.
-
-![function_details](img/function-details-loaded_v14_0.png)
-
-The pod count gives you the number of pods running the serverless function instances on a given cluster.
-
-For the Knative function invocations to appear, the
-[Prometheus cluster integration must be enabled](../../../clusters/integrations.md#prometheus-cluster-integration).
-
-Once Prometheus is enabled, a message may appear indicating that the metrics data _is
-loading or is not available at this time._ It appears upon the first access of the
-page, but should go away after a few seconds. If the message does not disappear, then it
-is possible that GitLab is unable to connect to the Prometheus instance running on the
-cluster.
-
-## Configuring logging
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33330) in GitLab 12.5.
-
-### Prerequisites
-
-- A GitLab-managed cluster.
-- `kubectl` installed and working.
-
-Running `kubectl` commands on your cluster requires setting up access to the
-cluster first. For clusters created on:
-
-- GKE, see [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl)
-- Other platforms, see [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/).
-
-### Enable request log template
-
-Run the following command to enable request logs:
-
-```shell
-kubectl edit cm -n knative-serving config-observability
-```
-
-Copy the `logging.request-log-template` from the `data._example` field to the data field one level up in the hierarchy.
-
-### Enable request logs
-
-Run the following commands to install Elasticsearch, Kibana, and Filebeat into a `kube-logging` namespace and configure all nodes to forward logs using Filebeat:
-
-```shell
-kubectl apply -f https://gitlab.com/gitlab-org/serverless/configurations/knative/raw/v0.7.0/kube-logging-filebeat.yaml
-kubectl label nodes --all beta.kubernetes.io/filebeat-ready="true"
-```
-
-### Viewing request logs
-
-To view request logs:
-
-1. Run `kubectl proxy`.
-1. Navigate to [Kibana UI](http://localhost:8001/api/v1/namespaces/kube-logging/services/kibana/proxy/app/kibana).
-
-Or:
-
-1. Open the [Kibana UI](http://localhost:8001/api/v1/namespaces/kube-logging/services/kibana/proxy/app/kibana).
-1. Click on **Discover**, then select `filebeat-*` from the dropdown on the left.
-1. Enter `kubernetes.container.name:"queue-proxy" AND message:/httpRequest/` into the search box.
-
-## Enabling TLS for Knative services
-
-By default, a GitLab serverless deployment is served over `http`. To serve
-over `https`, you must manually obtain and install TLS certificates.
-
-The simplest way to accomplish this is to use Certbot to
-[manually obtain Let's Encrypt certificates](https://knative.dev/docs/serving/using-a-tls-cert/#using-certbot-to-manually-obtain-let-s-encrypt-certificates).
-Certbot is a free, open source software tool for automatically using Let's Encrypt
-certificates on manually-administered websites to enable HTTPS.
-
-The following instructions relate to installing and running Certbot on a Linux
-server that has Python 3 installed, and may not work on other operating systems
-or with other versions of Python.
-
-1. Install Certbot by running the
- [`certbot-auto` wrapper script](https://eff-certbot.readthedocs.io/install.html#certbot-auto).
- On the command line of your server, run the following commands:
-
- ```shell
- wget https://dl.eff.org/certbot-auto
- sudo mv certbot-auto /usr/local/bin/certbot-auto
- sudo chown root /usr/local/bin/certbot-auto
- sudo chmod 0755 /usr/local/bin/certbot-auto
- /usr/local/bin/certbot-auto --help
- ```
-
- To check the integrity of the `certbot-auto` script, run:
-
- ```shell
- wget -N https://dl.eff.org/certbot-auto.asc
- gpg2 --keyserver ipv4.pool.sks-keyservers.net --recv-key A2CFB51FA275A7286234E7B24D17C995CD9775F2
- gpg2 --trusted-key 4D17C995CD9775F2 --verify certbot-auto.asc /usr/local/bin/certbot-auto
- ```
-
- The output of the last command should look something like:
-
- ```shell
- gpg: Signature made Mon 10 Jun 2019 06:24:40 PM EDT
- gpg: using RSA key A2CFB51FA275A7286234E7B24D17C995CD9775F2
- gpg: key 4D17C995CD9775F2 marked as ultimately trusted
- gpg: checking the trustdb
- gpg: marginals needed: 3 completes needed: 1 trust model: pgp
- gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
- gpg: next trustdb check due at 2027-11-22
- gpg: Good signature from "Let's Encrypt Client Team <letsencrypt-client@eff.org>" [ultimate]
- ```
-
-1. Run the following command to use Certbot to request a certificate
- using DNS challenge during authorization:
-
- ```shell
- /usr/local/bin/certbot-auto certonly --manual --preferred-challenges dns -d '*.<namespace>.example.com'
- ```
-
- Where `<namespace>` is the namespace created by GitLab for your serverless project (composed of `<project_name>-<project_id>-<environment>`) and
- `example.com` is the domain being used for your project. If you are unsure what the namespace of your project is, navigate
- to the **Infrastructure > Serverless platform** page of your project and inspect
- the endpoint provided for your function/app.
-
- ![function_endpoint](img/function-endpoint.png)
-
- In the above image, the namespace for the project is `node-function-11909507` and the domain is `knative.info`, thus
- certificate request line would look like this:
-
- ```shell
- ./certbot-auto certonly --manual --preferred-challenges dns -d '*.node-function-11909507.knative.info'
- ```
-
- The Certbot tool walks you through the steps of validating that you own each domain that you specify by creating TXT records in those domains.
- After this process is complete, the output should look something like this:
-
- ```shell
- IMPORTANT NOTES:
- - Congratulations! Your certificate and chain have been saved at:
- /etc/letsencrypt/live/namespace.example.com/fullchain.pem
- Your key file has been saved at:
- /etc/letsencrypt/live/namespace.example/privkey.pem
- Your cert will expire on 2019-09-19. To obtain a new or tweaked
- version of this certificate in the future, simply run certbot-auto
- again. To non-interactively renew *all* of your certificates, run
- "certbot-auto renew"
- -----BEGIN PRIVATE KEY-----
- - Your account credentials have been saved in your Certbot
- configuration directory at /etc/letsencrypt. You should make a
- secure backup of this folder now. This configuration directory will
- also contain certificates and private keys obtained by Certbot so
- making regular backups of this folder is ideal.
- ```
-
-1. Create certificate and private key files. Using the contents of the files
- returned by Certbot, create two files in order to create the
- Kubernetes secret:
-
- Run the following command to see the contents of `fullchain.pem`:
-
- ```shell
- sudo cat /etc/letsencrypt/live/node-function-11909507.knative.info/fullchain.pem
- ```
-
- Output should look like this:
-
- ```shell
- -----BEGIN CERTIFICATE-----
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b4ag==
- -----END CERTIFICATE-----
- -----BEGIN CERTIFICATE-----
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- K2fcb195768c39e9a94cec2c2e30Qg==
- -----END CERTIFICATE-----
- ```
-
- Create a file with the name `cert.pem` with the contents of the entire output.
-
- Once `cert.pem` is created, run the following command to see the contents of `privkey.pem`:
-
- ```shell
- sudo cat /etc/letsencrypt/live/namespace.example/privkey.pem
- ```
-
- Output should look like this:
-
- ```shell
- -----BEGIN PRIVATE KEY-----
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- 2fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 04f294d1eaca42b8692017b426d53bbc8fe75f827734f0260710b83a556082df
- -----BEGIN CERTIFICATE-----
- fcb195768c39e9a94cec2c2e32c59c0aad7a3365c10892e8116b5d83d4096b6
- 4f294d1eaca42b8692017b4262==
- -----END PRIVATE KEY-----
- ```
-
- Create a new file with the name `cert.pk` with the contents of the entire output.
-
-1. Create a Kubernetes secret to hold your TLS certificate, `cert.pem`, and
- the private key `cert.pk`:
-
- NOTE:
- Running `kubectl` commands on your cluster requires setting up access to the cluster first.
- For clusters created on GKE, see
- [GKE Cluster Access](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl).
- For other platforms, [install `kubectl`](https://kubernetes.io/docs/tasks/tools/).
-
- ```shell
- kubectl create --namespace istio-system secret tls istio-ingressgateway-certs \
- --key cert.pk \
- --cert cert.pem
- ```
-
- Where `cert.pem` and `cert.pk` are your certificate and private key files. Note that the `istio-ingressgateway-certs` secret name is required.
-
-1. Configure Knative to use the new secret that you created for HTTPS
- connections. Run the
- following command to open the Knative shared `gateway` in edit mode:
-
- ```shell
- kubectl edit gateway knative-ingress-gateway --namespace knative-serving
- ```
-
- Update the gateway to include the following `tls:` section and configuration:
-
- ```shell
- tls:
- mode: SIMPLE
- privateKey: /etc/istio/ingressgateway-certs/tls.key
- serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
- ```
-
- Example:
-
- ```shell
- apiVersion: networking.istio.io/v1alpha3
- kind: Gateway
- metadata:
- # ... skipped ...
- spec:
- selector:
- istio: ingressgateway
- servers:
- - hosts:
- - "*"
- port:
- name: http
- number: 80
- protocol: HTTP
- - hosts:
- - "*"
- port:
- name: https
- number: 443
- protocol: HTTPS
- tls:
- mode: SIMPLE
- privateKey: /etc/istio/ingressgateway-certs/tls.key
- serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
- ```
-
- After your changes are running on your Knative cluster, you can begin using the HTTPS protocol for secure access your deployed Knative services.
- In the event a mistake is made during this process and you need to update the cert, you must edit the gateway `knative-ingress-gateway`
- to switch back to `PASSTHROUGH` mode. Once corrections are made, edit the file again so the gateway uses the new certificates.
-
-## Using an older version of `gitlabktl`
-
-There may be situations where you want to run an older version of `gitlabktl`. This
-requires setting an older version of the `gitlabktl` image in the `.gitlab-ci.yml` file.
-
-To set an older version, add `image:` to the `functions:deploy` block. For example:
-
-```yaml
-functions:deploy:
- extends: .serverless:deploy:functions
- environment: production
- image: registry.gitlab.com/gitlab-org/gitlabktl:0.5.0
-```
-
-Different versions are available by changing the version tag at the end of the registry URL in the
-format `registry.gitlab.com/gitlab-org/gitlabktl:<version>`.
-
-For a full inventory of available `gitlabktl` versions, see the `gitlabktl` project's
-[container registry](https://gitlab.com/gitlab-org/gitlabktl/container_registry).
+This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/6) in GitLab 14.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86267) in GitLab 15.0.
diff --git a/doc/user/project/deploy_boards.md b/doc/user/project/deploy_boards.md
index 567c15c7d5f..42c1b8b0a62 100644
--- a/doc/user/project/deploy_boards.md
+++ b/doc/user/project/deploy_boards.md
@@ -16,12 +16,16 @@ type: howto, reference
> This is [fixed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60525) in
> GitLab 13.12.
> - [Deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
+> - [Disabled on self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/353410) in GitLab 15.0.
WARNING:
This feature was [deprecated](https://gitlab.com/groups/gitlab-org/configure/-/epics/8) in GitLab 14.5.
[An epic exists](https://gitlab.com/groups/gitlab-org/-/epics/2493)
to add this functionality to the [agent](../index.md).
+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 `certificate_based_clusters`.
+
GitLab deploy boards offer a consolidated view of the current health and
status of each CI [environment](../../ci/environments/index.md) running on [Kubernetes](https://kubernetes.io), displaying the status
of the pods in the deployment. Developers and other teammates can view the
diff --git a/doc/user/project/import/cvs.md b/doc/user/project/import/cvs.md
index 8bb716d8122..17d717bdc61 100644
--- a/doc/user/project/import/cvs.md
+++ b/doc/user/project/import/cvs.md
@@ -24,8 +24,8 @@ The following list illustrates the main differences between CVS and Git:
whole, or they fail without any changes. In CVS, commits (and other operations)
are not atomic. If an operation on the repository is interrupted in the middle,
the repository can be left in an inconsistent state.
-- **Storage method.** Changes in CVS are per file (changeset), while in Git
- a committed file(s) is stored in its entirety (snapshot). That means it's
+- **Storage method.** Changes in CVS are per file (changeset), while in Git,
+ committed files are stored in their entirety (snapshot). This means it is
very easy in Git to revert or undo a whole change.
- **Revision IDs.** The fact that in CVS changes are per files, the revision ID
is depicted by version numbers, for example `1.4` reflects how many times a
diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md
index 329d91916e8..a190edb179d 100644
--- a/doc/user/project/import/github.md
+++ b/doc/user/project/import/github.md
@@ -7,66 +7,56 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Import your project from GitHub to GitLab **(FREE)**
-Using the importer, you can import your GitHub repositories to GitLab.com or to
-your self-managed GitLab instance.
-
-The following aspects of a project are imported:
-
-- Repository description (GitLab.com & 7.7+)
-- Git repository data (GitLab.com & 7.7+)
-- Issues (GitLab.com & 7.7+)
-- Pull requests (GitLab.com & 8.4+)
-- Wiki pages (GitLab.com & 8.4+)
-- Milestones (GitLab.com & 8.7+)
-- Labels (GitLab.com & 8.7+)
-- Release note descriptions (GitLab.com & 8.12+)
-- Pull request review comments (GitLab.com & 10.2+)
-- Pull request reviews (GitLab.com & 13.7+)
-- Pull request "merged by" information (GitLab.com & 13.7+)
-- Regular issue and pull request comments
-- [Git Large File Storage (LFS) Objects](../../../topics/git/lfs/index.md)
-- Pull request comments replies in discussions ([GitLab.com & 14.5+](https://gitlab.com/gitlab-org/gitlab/-/issues/336596))
-- Diff Notes suggestions ([GitLab.com & 14.7+](https://gitlab.com/gitlab-org/gitlab/-/issues/340624))
-
-References to pull requests and issues are preserved (GitLab.com & 8.7+), and
-each imported repository maintains visibility level unless that [visibility
-level is restricted](../../public_access.md#restrict-use-of-public-or-internal-projects),
-in which case it defaults to the default project visibility.
-
-The namespace is a user or group in GitLab, such as `gitlab.com/janedoe` or
-`gitlab.com/customer-success`. You can do some bulk actions to move projects to
-different namespaces in the rails console.
-
-This process does not migrate or import any types of groups or organizations
-from GitHub to GitLab.
-
-## Use cases
-
-The steps you take depend on whether you are importing from GitHub.com or
-GitHub Enterprise. The steps also depend on whether you are importing to GitLab.com or
-self-managed GitLab instance.
-
-- If you're importing to GitLab.com, you can alternatively import GitHub repositories
- using a [personal access token](#use-a-github-token). We do not recommend
- this method, as it does not associate all user activity (such as issues and
- pull requests) with matching GitLab users.
-- If you're importing to a self-managed GitLab instance, you can alternatively use the
- [GitHub Rake task](../../../administration/raketasks/github_import.md) to import
- projects without the constraints of a [Sidekiq](../../../development/sidekiq_style_guide.md) worker.
-- If you're importing from GitHub Enterprise to your self-managed GitLab instance:
- - You must first enable [GitHub integration](../../../integration/github.md).
- - To import projects from GitHub Enterprise to GitLab.com, use the [Import API](../../../api/import.md).
- - If GitLab is behind a HTTP/HTTPS proxy you must populate the [allowlist for local requests](../../../security/webhooks.md#allowlist-for-local-requests)
- with `github.com` and `api.github.com` to solve the hostname. For more information, read the issue
- [Importing a GitHub project requires DNS resolution even when behind a proxy](https://gitlab.com/gitlab-org/gitlab/-/issues/37941)
-- If you're importing from GitHub.com to your self-managed GitLab instance,
- setting up GitHub integration is not required. You can use the [Import API](../../../api/import.md).
-
-## How it works
+You can import your GitHub repositories:
+
+- From either GitHub.com or GitHub Enterprise.
+- To either GitLab.com or a self-managed GitLab instance.
+
+This process does not migrate or import any types of groups or organizations from GitHub to GitLab.
+
+The namespace is a user or group in GitLab, such as `gitlab.com/sidney-jones` or
+`gitlab.com/customer-success`. You can use bulk actions in the rails console to move projects to
+different namespaces.
+
+If you are importing to a self-managed GitLab instance, you can use the
+[GitHub Rake task](../../../administration/raketasks/github_import.md) instead. This allows you to import projects
+without the constraints of a [Sidekiq](../../../development/sidekiq/index.md) worker.
+
+If you are importing from GitHub Enterprise to a self-managed GitLab instance:
+
+- You must first enable [GitHub integration](../../../integration/github.md).
+- To import projects from GitHub Enterprise to GitLab.com, use the [Import API](../../../api/import.md).
+- If GitLab is behind a HTTP/HTTPS proxy, you must populate the [allowlist for local requests](../../../security/webhooks.md#allowlist-for-local-requests)
+ with `github.com` and `api.github.com` to solve the hostname. For more information, read the issue
+ [Importing a GitHub project requires DNS resolution even when behind a proxy](https://gitlab.com/gitlab-org/gitlab/-/issues/37941).
+
+If you are importing from GitHub.com to a self-managed GitLab instance:
+
+- Setting up GitHub integration is not required.
+- You can use the [Import API](../../../api/import.md).
+
+When importing projects:
+
+- If a user referenced in the project is not found in the GitLab database, the project creator is set as the author and
+ assignee. The project creator is usually the user that initiated the import process. A note on the issue mentioning the
+ original GitHub author is added.
+- The importer creates any new namespaces (or groups) if they do not exist, or, if the namespace is taken, the
+ repository is imported under the namespace of the user who initiated the import process. The namespace or repository
+ name can also be edited, with the proper permissions.
+- The importer also imports branches on forks of projects related to open pull requests. These branches are
+ imported with a naming scheme similar to `GH-SHA-username/pull-request-number/fork-name/branch`. This may lead to
+ a discrepancy in branches compared to those of the GitHub repository.
+
+For additional technical details, refer to the [GitHub Importer](../../../development/github_importer.md)
+developer documentation.
+
+For an overview of the import process, see the video [Migrating from GitHub to GitLab](https://youtu.be/VYOXuOg9tQI).
+
+## Prerequisites
When issues and pull requests are being imported, the importer attempts to find
-their GitHub authors and assignees in the database of the GitLab instance (note
-that pull requests are called "merge requests" in GitLab).
+their GitHub authors and assignees in the database of the GitLab instance. Pull requests are called _merge requests_ in
+GitLab.
For this association to succeed, each GitHub author and assignee in the repository
must meet one of the following conditions prior to the import:
@@ -75,32 +65,9 @@ must meet one of the following conditions prior to the import:
- Have a GitHub account with a [public-facing email address](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-email-preferences/setting-your-commit-email-address)
that matches their GitLab account's email address.
- NOTE:
- GitLab content imports that use GitHub accounts require that the GitHub
- public-facing email address is populated so that all comments and
- contributions are properly mapped to the same user in GitLab. GitHub
- Enterprise (on premise) does not require this field to be populated to use the
- product, so you may have to add it on existing accounts for the imported
- content to be properly mapped to the user in the new system. Refer to GitHub
- documentation for instructions on how to add this email address.
-
-If a user referenced in the project is not found in the GitLab database, the project creator (typically the user
-that initiated the import process) is set as the author/assignee, but a note on the issue mentioning the original
-GitHub author is added.
-
-The importer creates any new namespaces (groups) if they do not exist, or, if the namespace is taken, the
-repository is imported under the namespace of the user who initiated the import process. The namespace/repository
-name can also be edited, with the proper permissions.
-
-The importer will also import branches on forks of projects related to open pull requests. These branches will be
-imported with a naming scheme similar to `GH-SHA-username/pull-request-number/fork-name/branch`. This may lead to
-a discrepancy in branches compared to those of the GitHub repository.
-
-For additional technical details, you can refer to the
-[GitHub Importer](../../../development/github_importer.md "Working with the GitHub importer")
-developer documentation.
-
-For an overview of the import process, see the video [Migrating from GitHub to GitLab](https://youtu.be/VYOXuOg9tQI).
+GitLab content imports that use GitHub accounts require that the GitHub public-facing email address is populated. This means
+all comments and contributions are properly mapped to the same user in GitLab. GitHub Enterprise does not require this
+field to be populated so you may have to add it on existing accounts.
## Import your GitHub repository into GitLab
@@ -108,10 +75,12 @@ For an overview of the import process, see the video [Migrating from GitHub to G
Before you begin, ensure that any GitHub users who you want to map to GitLab users have either:
-- A GitLab account that has logged in using the GitHub icon
- \- or -
+- A GitLab account that has logged in using the GitHub icon.
- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/reference/users#get-a-user) in the profile of the GitHub user
+If you are importing to GitLab.com, you can alternatively import GitHub repositories using a [personal access token](#use-a-github-token).
+We do not recommend this method, as it does not associate all user activity (such as issues and pull requests) with matching GitLab users.
+
User-matching attempts occur in that order, and if a user is not identified either way, the activity is associated with
the user account that is performing the import.
@@ -119,10 +88,10 @@ NOTE:
If you are using a self-managed GitLab instance or if you are importing from GitHub Enterprise, this process requires that you have configured
[GitHub integration](../../../integration/github.md).
-1. From the top navigation bar, click **+** and select **New project**.
+1. From the top navigation bar, select **+** and select **New project**.
1. Select the **Import project** tab and then select **GitHub**.
1. Select the first button to **List your GitHub repositories**. You are redirected to a page on [GitHub](https://github.com) to authorize the GitLab application.
-1. Click **Authorize GitlabHQ**. You are redirected back to the GitLab Import page and all of your GitHub repositories are listed.
+1. Select **Authorize GitlabHQ**. You are redirected back to the GitLab Import page and all of your GitHub repositories are listed.
1. Continue on to [selecting which repositories to import](#select-which-repositories-to-import).
### Use a GitHub token
@@ -134,14 +103,13 @@ associate all user activity (such as issues and pull requests) with matching Git
If you are an administrator of a self-managed GitLab instance or if you are importing from
GitHub Enterprise, you cannot use a personal access token.
The [GitHub integration method (above)](#use-the-github-integration) is recommended for all users.
-Read more in the [How it works](#how-it-works) section.
If you are not using the GitHub integration, you can still perform an authorization with GitHub to grant GitLab access your repositories:
1. Go to <https://github.com/settings/tokens/new>
1. Enter a token description.
1. Select the repository scope.
-1. Click **Generate token**.
+1. Select **Generate token**.
1. Copy the token hash.
1. Go back to GitLab and provide the token to the GitHub importer.
1. Hit the **List Your GitHub Repositories** button and wait while GitLab reads your repositories' information.
@@ -161,7 +129,7 @@ your GitHub repositories are listed.
you can filter projects by name. If filter is applied, **Import all repositories** only imports matched repositories.
1. The **Status** column shows the import status of each repository. You can choose to leave the page open and it will
update in real-time or you can return to it later.
-1. Once a repository has been imported, click its GitLab path to open its GitLab URL.
+1. Once a repository has been imported, select its GitLab path to open its GitLab URL.
![GitHub importer page](img/import_projects_from_github_importer_v12_3.png)
@@ -197,6 +165,30 @@ Reducing the time spent in cloning a repository can be done by increasing networ
performance (by using high performance SSDs, for example) of the disks that store the Git repositories (for your GitLab instance).
Increasing the number of Sidekiq workers does *not* reduce the time spent cloning repositories.
+## Imported data
+
+The following items of a project are imported:
+
+- Repository description.
+- Git repository data.
+- Issues.
+- Pull requests.
+- Wiki pages.
+- Milestones.
+- Labels.
+- Release note descriptions.
+- Pull request review comments.
+- Regular issue and pull request comments.
+- [Git Large File Storage (LFS) Objects](../../../topics/git/lfs/index.md).
+- Pull request reviews (GitLab.com and GitLab 13.7 and later).
+- Pull request "merged by" information (GitLab.com and GitLab 13.7 and later).
+- Pull request comments replies in discussions ([GitLab.com and GitLab 14.5 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/336596)).
+- Diff Notes suggestions ([GitLab.com and GitLab 14.7 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/340624)).
+
+References to pull requests and issues are preserved. Each imported repository maintains visibility level unless that
+[visibility level is restricted](../../public_access.md#restrict-use-of-public-or-internal-projects), in which case it
+defaults to the default project visibility.
+
## Alternative way to import notes and diff notes
When GitHub Importer runs on extremely large projects not all notes & diff notes can be imported due to GitHub API `issues_comments` & `pull_requests_comments` endpoints limitation.
diff --git a/doc/user/project/import/img/gitlab_import_history_page_v14_10.png b/doc/user/project/import/img/gitlab_import_history_page_v14_10.png
index c93b5ed2b27..812696a8faa 100644
--- a/doc/user/project/import/img/gitlab_import_history_page_v14_10.png
+++ b/doc/user/project/import/img/gitlab_import_history_page_v14_10.png
Binary files differ
diff --git a/doc/user/project/integrations/bamboo.md b/doc/user/project/integrations/bamboo.md
index bf343078634..22e6d45dd96 100644
--- a/doc/user/project/integrations/bamboo.md
+++ b/doc/user/project/integrations/bamboo.md
@@ -46,7 +46,7 @@ integration in GitLab.
1. Select **Atlassian Bamboo**.
1. Ensure the **Active** checkbox is selected.
1. Enter the base URL of your Bamboo server. For example, `https://bamboo.example.com`.
-1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](overview.md#ssl-verification).
+1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](index.md#manage-ssl-verification).
1. Enter the [build key](#identify-the-bamboo-build-plan-build-key) from your Bamboo
build plan.
1. If necessary, enter a username and password for a Bamboo user that has
@@ -71,7 +71,7 @@ Bamboo. For example, `https://bamboo.example.com/browse/PROJ-PLAN`.
### Builds not triggered
If builds are not triggered, ensure you entered the right GitLab IP address in
-Bamboo under **Trigger IP addresses**. Also check [service hook logs](overview.md#troubleshooting-integrations) for request failures.
+Bamboo under **Trigger IP addresses**. Also check [service hook logs](index.md#troubleshooting-integrations) for request failures.
### Advanced Atlassian Bamboo features not available in GitLab UI
diff --git a/doc/user/project/integrations/bugzilla.md b/doc/user/project/integrations/bugzilla.md
index 4a9a8d62098..0f7ce182e1a 100644
--- a/doc/user/project/integrations/bugzilla.md
+++ b/doc/user/project/integrations/bugzilla.md
@@ -57,4 +57,4 @@ internal issue tracker, the internal issue is linked.
## Troubleshooting
-To see recent service hook deliveries, check [service hook logs](overview.md#troubleshooting-integrations).
+To see recent service hook deliveries, check [service hook logs](index.md#troubleshooting-integrations).
diff --git a/doc/user/project/integrations/gitlab_slack_application.md b/doc/user/project/integrations/gitlab_slack_application.md
index 2dae02dc093..dc56c2669f8 100644
--- a/doc/user/project/integrations/gitlab_slack_application.md
+++ b/doc/user/project/integrations/gitlab_slack_application.md
@@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
NOTE:
The GitLab Slack application is only configurable for GitLab.com. It will **not**
work for on-premises installations where you can configure the
-[Slack slash commands](slack_slash_commands.md) service instead. We're planning
+[Slack slash commands](slack_slash_commands.md) integration instead. We're planning
to make this configurable for all GitLab installations, but there's
no ETA - see [#28164](https://gitlab.com/gitlab-org/gitlab/-/issues/28164).
@@ -31,17 +31,21 @@ Alternatively, you can configure the Slack application with a project's
integration settings.
Keep in mind that you must have the appropriate permissions for your Slack
-team to be able to install a new application, read more in Slack's
+workspace to be able to install a new application. Read more in Slack's
documentation on [Adding an app to your workspace](https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace).
-To enable the GitLab service for your Slack team:
+To enable the GitLab integration for your Slack workspace:
1. Go to your project's **Settings > Integration > Slack application** (only
visible on GitLab.com).
-1. Select **Add to Slack**.
+1. Select **Install Slack app**.
+1. Select **Allow** on Slack's confirmation screen.
That's all! You can now start using the Slack slash commands.
+You can also select **Reinstall Slack app** to update the app in your Slack workspace
+to the latest version. See the [Version history](#version-history) for details.
+
## Create a project alias for Slack
To create a project alias on GitLab.com for Slack integration:
@@ -62,7 +66,7 @@ GitLab error: project or alias not found
## Usage
-After confirming the installation, you, and everyone else in your Slack team,
+After confirming the installation, you, and everyone else in your Slack workspace,
can use all the [slash commands](../../../integration/slash_commands.md).
When you perform your first slash command, you are asked to authorize your
@@ -78,3 +82,11 @@ project, you would do:
```plaintext
/gitlab gitlab-org/gitlab issue show 1001
```
+
+## Version history
+
+### 15.0+
+
+In GitLab 15.0 the Slack app is updated to [Slack's new granular permissions app model](https://medium.com/slack-developer-blog/more-precision-less-restrictions-a3550006f9c3).
+
+There is no change in functionality. A reinstall is not required but recommended.
diff --git a/doc/user/project/integrations/index.md b/doc/user/project/integrations/index.md
index 9764c4d44a0..7af2e431157 100644
--- a/doc/user/project/integrations/index.md
+++ b/doc/user/project/integrations/index.md
@@ -6,26 +6,114 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Project integrations **(FREE)**
-You can find the available integrations under your project's
-**Settings > Integrations** page. You need to have at least
-the Maintainer role on the project.
+You can integrate your GitLab projects with other applications. Integrations are
+like plugins, and give you the freedom to add
+functionality to GitLab.
-## Integrations
+## View project integrations
-Like plugins, integrations allow you to integrate GitLab with other applications, adding additional features.
-For more information, read the
-[overview of integrations](overview.md) or learn how to manage your integrations:
+Prerequisites:
-- *For GitLab 13.3 and later,* read [Project integration management](../../admin_area/settings/project_integration_management.md).
-- *For GitLab 13.2 and earlier,* read [Integration Management](../../admin_area/settings/project_integration_management.md),
- which replaced the deprecated Service Templates [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268032)
- in GitLab 14.0.
+- You must have at least the Maintainer role for the project.
-## Project webhooks
+To view the available integrations for your project:
-Project 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. GitLab sends a POST request with data
-to the webhook URL.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Integrations**.
+
+You can also view and manage integration settings across [all projects in an instance or group](../../admin_area/settings/project_integration_management.md).
+For a single project, you can choose to inherit the instance or group configuration,
+or provide custom settings.
+
+NOTE:
+Instance and group-based integration management replaces service templates, which
+were [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/268032) in GitLab 14.0.
+
+## Manage SSL verification
+
+By default, the SSL certificate for outgoing HTTP requests is verified based on
+an internal list of Certificate Authorities. This means the certificate cannot
+be self-signed.
+
+You can turn off SSL verification in the configuration settings for [webhooks](webhooks.md#configure-a-webhook-in-gitlab)
+and some integrations.
+
+## Available integrations
+
+You can configure the following integrations.
+
+| Integration | Description | Integration hooks |
+|-----------------------------------------------------------------------------|-----------------------------------------------------------------------|------------------------|
+| [Asana](asana.md) | Add commit messages as comments to Asana tasks. | **{dotted-circle}** No |
+| Assembla | Manage projects. | **{dotted-circle}** No |
+| [Atlassian Bamboo CI](bamboo.md) | Run CI/CD pipelines with Atlassian Bamboo. | **{check-circle}** Yes |
+| [Bugzilla](bugzilla.md) | Use Bugzilla as the issue tracker. | **{dotted-circle}** No |
+| Buildkite | Run CI/CD pipelines with Buildkite. | **{check-circle}** Yes |
+| Campfire | Connect to chat. | **{dotted-circle}** No |
+| [Confluence Workspace](../../../api/integrations.md#confluence-integration) | Use Confluence Cloud Workspace as an internal wiki. | **{dotted-circle}** No |
+| [Custom issue tracker](custom_issue_tracker.md) | Use a custom issue tracker. | **{dotted-circle}** No |
+| [Datadog](../../../integration/datadog.md) | Trace your GitLab pipelines with Datadog. | **{check-circle}** Yes |
+| [Discord Notifications](discord_notifications.md) | Send notifications about project events to a Discord channel. | **{dotted-circle}** No |
+| Drone CI | Run CI/CD pipelines with Drone. | **{check-circle}** Yes |
+| [Emails on push](emails_on_push.md) | Send commits and diff of each push by email. | **{dotted-circle}** No |
+| [EWM](ewm.md) | Use IBM Engineering Workflow Management as the issue tracker. | **{dotted-circle}** No |
+| [External wiki](../wiki/index.md#link-an-external-wiki) | Link an external wiki. | **{dotted-circle}** No |
+| [Flowdock](../../../api/integrations.md#flowdock) | Send notifications from GitLab to Flowdock flows. | **{dotted-circle}** No |
+| [GitHub](github.md) | Obtain statuses for commits and pull requests. | **{dotted-circle}** No |
+| [Google Chat](hangouts_chat.md) | Send notifications from your GitLab project to a room in Google Chat. | **{dotted-circle}** No |
+| [Harbor](harbor.md) | Use Harbor as the container registry. | **{dotted-circle}** No |
+| [irker (IRC gateway)](irker.md) | Send IRC messages. | **{dotted-circle}** No |
+| [Jenkins](../../../integration/jenkins.md) | Run CI/CD pipelines with Jenkins. | **{check-circle}** Yes |
+| JetBrains TeamCity CI | Run CI/CD pipelines with TeamCity. | **{check-circle}** Yes |
+| [Jira](../../../integration/jira/index.md) | Use Jira as the issue tracker. | **{dotted-circle}** No |
+| [Mattermost notifications](mattermost.md) | Send notifications about project events to Mattermost channels. | **{dotted-circle}** No |
+| [Mattermost slash commands](mattermost_slash_commands.md) | Perform common tasks with slash commands. | **{dotted-circle}** No |
+| [Microsoft Teams notifications](microsoft_teams.md) | Receive event notifications. | **{dotted-circle}** No |
+| Packagist | Keep your PHP dependencies updated on Packagist. | **{check-circle}** Yes |
+| [Pipelines emails](pipeline_status_emails.md) | Send the pipeline status to a list of recipients by email. | **{dotted-circle}** No |
+| [Pivotal Tracker](pivotal_tracker.md) | Add commit messages as comments to Pivotal Tracker stories. | **{dotted-circle}** No |
+| [Prometheus](prometheus.md) | Monitor application metrics. | **{dotted-circle}** No |
+| Pushover | Get real-time notifications on your device. | **{dotted-circle}** No |
+| [Redmine](redmine.md) | Use Redmine as the issue tracker. | **{dotted-circle}** No |
+| [Slack application](gitlab_slack_application.md) | Use Slack's official GitLab application. | **{dotted-circle}** No |
+| [Slack notifications](slack.md) | Send notifications about project events to Slack. | **{dotted-circle}** No |
+| [Slack slash commands](slack_slash_commands.md) | Enable slash commands in a workspace. | **{dotted-circle}** No |
+| [Unify Circuit](unify_circuit.md) | Send notifications about project events to Unify Circuit. | **{dotted-circle}** No |
+| [Webex Teams](webex_teams.md) | Receive events notifications. | **{dotted-circle}** No |
+| [YouTrack](youtrack.md) | Use YouTrack as the issue tracker. | **{dotted-circle}** No |
+| [ZenTao](zentao.md) | Use ZenTao as the issue tracker. | **{dotted-circle}** No |
+
+### Project webhooks
+
+You can configure a project webhook to listen for specific events
+like pushes, issues, or merge requests. When the webhook is triggered, GitLab
+sends a POST request with data to a specified webhook URL.
Learn more [about webhooks](webhooks.md).
+
+## Push hooks limit
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17874) in GitLab 12.4.
+
+If a single push includes changes to more than three branches or tags, integrations
+supported by `push_hooks` and `tag_push_hooks` events aren't executed.
+
+You can change the number of supported branches or tags by changing the
+[`push_event_hooks_limit` application setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
+
+## Troubleshooting integrations
+
+Some integrations use hooks to integrate with external applications. To confirm which ones use integration hooks, see the [available integrations](#available-integrations). Learn more about [troubleshooting integration hooks](webhooks.md#troubleshoot-webhooks).
+
+### `Test Failed. Save Anyway` error
+
+Some integrations fail with an error `Test Failed. Save Anyway` when you set them
+up on uninitialized repositories. This error occurs because the integration uses
+push data to build the test payload, and there are no push events in the project.
+
+To resolve this error, initialize the repository by pushing a test file to the project
+and set up the integration again.
+
+## Contribute to integrations
+
+To add a new integration, see the [Integrations development guide](../../../development/integrations/index.md).
diff --git a/doc/user/project/integrations/overview.md b/doc/user/project/integrations/overview.md
index 081780e6277..9625edcd8f9 100644
--- a/doc/user/project/integrations/overview.md
+++ b/doc/user/project/integrations/overview.md
@@ -1,117 +1,11 @@
---
-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
+redirect_to: 'index.md'
+remove_date: '2022-07-20'
---
-# Integrations **(FREE)**
+This document was moved to [another location](index.md).
-Integrations allow you to integrate GitLab with other applications. They
-are a bit like plugins in that they allow a lot of freedom in adding
-functionality to GitLab.
-
-## Accessing integrations
-
-To find the available integrations for your project:
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > Integrations**.
-
-There are more than 20 integrations to integrate with. Select the one that you
-want to configure.
-
-## Integrations listing
-
-Click on the integration links to see further configuration instructions and details.
-
-| Integration | Description | Integration hooks |
-| --------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------- |
-| [Asana](asana.md) | Add commit messages as comments to Asana tasks. | **{dotted-circle}** No |
-| Assembla | Manage projects. | **{dotted-circle}** No |
-| [Atlassian Bamboo CI](bamboo.md) | Run CI/CD pipelines with Atlassian Bamboo. | **{check-circle}** Yes |
-| [Bugzilla](bugzilla.md) | Use Bugzilla as the issue tracker. | **{dotted-circle}** No |
-| Buildkite | Run CI/CD pipelines with Buildkite. | **{check-circle}** Yes |
-| Campfire | Connect to chat. | **{dotted-circle}** No |
-| [Confluence Workspace](../../../api/integrations.md#confluence-integration) | Replace the link to the internal wiki with a link to a Confluence Cloud Workspace. | **{dotted-circle}** No |
-| [Custom issue tracker](custom_issue_tracker.md) | Use a custom issue tracker. | **{dotted-circle}** No |
-| [Datadog](../../../integration/datadog.md) | Trace your GitLab pipelines with Datadog. | **{check-circle}** Yes |
-| [Discord Notifications](discord_notifications.md) | Send notifications about project events to a Discord channel. | **{dotted-circle}** No |
-| Drone CI | Run CI/CD pipelines with Drone. | **{check-circle}** Yes |
-| [Emails on push](emails_on_push.md) | Send commits and diff of each push by email. | **{dotted-circle}** No |
-| [EWM](ewm.md) | Use IBM Engineering Workflow Management as the issue tracker. | **{dotted-circle}** No |
-| [External wiki](../wiki/index.md#link-an-external-wiki) | Link an external wiki. | **{dotted-circle}** No |
-| [Flowdock](../../../api/integrations.md#flowdock) | Send notifications from GitLab to Flowdock flows. | **{dotted-circle}** No |
-| [GitHub](github.md) | Obtain statuses for commits and pull requests. | **{dotted-circle}** No |
-| [Google Chat](hangouts_chat.md) | Send notifications from your GitLab project to a room in Google Chat.| **{dotted-circle}** No |
-| [Harbor](harbor.md) | Use Harbor as the container registry. | **{dotted-circle}** No |
-| [irker (IRC gateway)](irker.md) | Send IRC messages. | **{dotted-circle}** No |
-| [Jenkins](../../../integration/jenkins.md) | Run CI/CD pipelines with Jenkins. | **{check-circle}** Yes |
-| JetBrains TeamCity CI | Run CI/CD pipelines with TeamCity. | **{check-circle}** Yes |
-| [Jira](../../../integration/jira/index.md) | Use Jira as the issue tracker. | **{dotted-circle}** No |
-| [Mattermost notifications](mattermost.md) | Send notifications about project events to Mattermost channels. | **{dotted-circle}** No |
-| [Mattermost slash commands](mattermost_slash_commands.md) | Perform common tasks with slash commands. | **{dotted-circle}** No |
-| [Microsoft Teams notifications](microsoft_teams.md) | Receive event notifications. | **{dotted-circle}** No |
-| Packagist | Keep your PHP dependencies updated on Packagist. | **{check-circle}** Yes |
-| [Pipelines emails](pipeline_status_emails.md) | Send the pipeline status to a list of recipients by email. | **{dotted-circle}** No |
-| [Pivotal Tracker](pivotal_tracker.md) | Add commit messages as comments to Pivotal Tracker stories. | **{dotted-circle}** No |
-| [Prometheus](prometheus.md) | Monitor application metrics. | **{dotted-circle}** No |
-| Pushover | Get real-time notifications on your device. | **{dotted-circle}** No |
-| [Redmine](redmine.md) | Use Redmine as the issue tracker. | **{dotted-circle}** No |
-| [Slack application](gitlab_slack_application.md) | Use Slack's official GitLab application. | **{dotted-circle}** No |
-| [Slack notifications](slack.md) | Send notifications about project events to Slack. | **{dotted-circle}** No |
-| [Slack slash commands](slack_slash_commands.md) | Enable slash commands in workspace. | **{dotted-circle}** No |
-| [Unify Circuit](unify_circuit.md) | Send notifications about project events to Unify Circuit. | **{dotted-circle}** No |
-| [Webex Teams](webex_teams.md) | Receive events notifications. | **{dotted-circle}** No |
-| [YouTrack](youtrack.md) | Use YouTrack as the issue tracker. | **{dotted-circle}** No |
-| [ZenTao](zentao.md) | Use ZenTao as the issue tracker. | **{dotted-circle}** No |
-
-## Push hooks limit
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/17874) in GitLab 12.4.
-
-If a single push includes changes to more than three branches or tags, integrations
-supported by `push_hooks` and `tag_push_hooks` events aren't executed.
-
-The number of branches or tags supported can be changed via
-[`push_event_hooks_limit` application setting](../../../api/settings.md#list-of-settings-that-can-be-accessed-via-api-calls).
-
-## Project integration management
-
-Project integration management lets you control integration settings across all projects
-of an instance. On the project level, administrators you can choose whether to inherit the
-instance configuration or provide custom settings.
-
-Read more about [Project integration management](../../admin_area/settings/project_integration_management.md).
-
-## SSL verification
-
-By default, the SSL certificate for outgoing HTTP requests is verified based on
-an internal list of Certificate Authorities. This means the certificate cannot
-be self-signed.
-
-You can turn off SSL verification in the configuration settings for [webhooks](webhooks.md#configure-a-webhook-in-gitlab)
-and some integrations.
-
-## Troubleshooting integrations
-
-Some integrations use hooks for integration with external applications. To confirm which ones use integration hooks, see the [integrations listing](#integrations-listing) above. Learn more about [troubleshooting integration hooks](webhooks.md#troubleshoot-webhooks).
-
-### Uninitialized repositories
-
-Some integrations fail with an error `Test Failed. Save Anyway` when you attempt to set them up on
-uninitialized repositories. Some integrations use push data to build the test payload,
-and this error occurs when no push events exist in the project yet.
-
-To resolve this error, initialize the repository by pushing a test file to the project and set up
-the integration again.
-
-## Contributing to integrations
-
-Because GitLab is open source we can ship with the code and tests for all
-plugins. This allows the community to keep the plugins up to date so that they
-always work in newer GitLab versions.
-
-For an overview of what integrations are available, please see the
-[integrations source directory](https://gitlab.com/gitlab-org/gitlab/-/tree/master/app/models/integrations).
-
-Contributions are welcome!
+<!-- This redirect file can be deleted after 2022-07-20. -->
+<!-- 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/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index f4f5b3f545b..ac7d447961c 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -57,7 +57,7 @@ You can configure a webhook for a group or a project.
The URL must be percent-encoded if it contains one or more special characters.
1. In **Secret token**, enter the [secret token](#validate-payloads-by-using-a-secret-token) to validate payloads.
1. In the **Trigger** section, select the [events](webhook_events.md) to trigger the webhook.
-1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](overview.md#ssl-verification).
+1. Optional. Clear the **Enable SSL verification** checkbox to disable [SSL verification](index.md#manage-ssl-verification).
1. Select **Add webhook**.
## Configure your webhook receiver endpoint
@@ -244,7 +244,7 @@ To view the table:
- **Failed to connect** if it is misconfigured, and needs manual intervention to re-enable it.
- **Fails to connect** if it is temporarily disabled and will retry later.
-
+
![Badges on failing webhooks](img/failed_badges.png)
1. Select **Edit** for the webhook you want to view.
diff --git a/doc/user/project/issues/confidential_issues.md b/doc/user/project/issues/confidential_issues.md
index 15130523da6..9d23a63b940 100644
--- a/doc/user/project/issues/confidential_issues.md
+++ b/doc/user/project/issues/confidential_issues.md
@@ -36,7 +36,7 @@ The second way is to locate the Confidentiality section in the sidebar and click
| Turn off confidentiality | Turn on confidentiality |
| :-----------: | :----------: |
-| ![Turn off confidentiality](img/turn_off_confidentiality.png) | ![Turn on confidentiality](img/turn_on_confidentiality.png) |
+| ![Turn off confidentiality](img/turn_off_confidentiality_v15_0.png) | ![Turn on confidentiality](img/turn_on_confidentiality_v15_0.png) |
Every change from regular to confidential and vice versa, is indicated by a
system note in the issue's comments.
@@ -97,5 +97,5 @@ sees in the project's search results respectively.
- [Merge requests for confidential issues](../merge_requests/confidential.md)
- [Make an epic confidential](../../group/epics/manage_epics.md#make-an-epic-confidential)
-- [Mark a comment as confidential](../../discussions/index.md#mark-a-comment-as-confidential)
+- [Add an internal note](../../discussions/index.md#add-an-internal-note)
- [Security practices for confidential merge requests](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md#security-releases-critical-non-critical-as-a-developer) at GitLab
diff --git a/doc/user/project/issues/csv_import.md b/doc/user/project/issues/csv_import.md
index e4b8efd27ed..a3f6ee5e61e 100644
--- a/doc/user/project/issues/csv_import.md
+++ b/doc/user/project/issues/csv_import.md
@@ -6,8 +6,6 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Importing issues from CSV **(FREE)**
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23532) in GitLab 11.7.
-
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).
@@ -25,33 +23,29 @@ You must have at least the Developer role for a project to import issues.
To import issues:
-1. Navigate to a project's Issues list page.
-1. If existing issues are present, click the import icon at the top right, next to the **Edit issues** button.
-1. For a project without any issues, click the button labeled **Import CSV** in the middle of the page.
-1. Select the file and click the **Import issues** button.
+1. Go to your project's Issues list page.
+1. Open the import feature, depending if the project has issues:
+ - Existing issues are present: Select the import icon at the top right, next to **Edit issues**.
+ - Project has no issues: Select **Import CSV** in the middle of the page.
+1. Select the file you want to import, and then select **Import issues**.
-The file is processed in the background and a notification email is sent
-to you once the import is complete.
+The file is processed in the background, and a notification email is sent
+to you after the import is complete.
## CSV file format
-When importing issues from a CSV file, it must be formatted in a certain way:
+To import issues, GitLab requires CSV files have a specific format:
-- **header row:** CSV files must include the following headers:
-`title` and `description`. The case of the headers does not matter.
-- **columns:** Data from columns beyond `title` and `description` are not imported.
-- **separators:** The column separator is automatically detected from the header row.
- Supported separator characters are: commas (`,`), semicolons (`;`), and tabs (`\t`).
- The row separator can be either `CRLF` or `LF`.
-- **double-quote character:** The double-quote (`"`) character is used to quote fields,
- enabling the use of the column separator within a field (see the third line in the
- sample CSV data below). To insert a double-quote (`"`) within a quoted
- field, use two double-quote characters in succession (`""`).
-- **data rows:** After the header row, succeeding rows must follow the same column
- order. The issue title is required while the description is optional.
+| Element | Format |
+|------------------------|--------|
+| header row | CSV files must include the following headers: `title` and `description`. The case of the headers does not matter. |
+| columns | Data from columns beyond `title` and `description` are not imported. |
+| separators | The column separator is detected from the header row. Supported separator characters are commas (`,`), semicolons (`;`), and tabs (`\t`). The row separator can be either `CRLF` or `LF`. |
+| 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 _within_ a field, (such as `\n` or `,`),
-wrap the characters in double quotes.
+If you have special characters in a field, (such as `\n` or `,`), surround the
+characters with double quotes (`"`).
Sample CSV data:
@@ -64,6 +58,7 @@ Another Title,"A description, with a comma"
### File size
-The limit depends on the configuration value of Max Attachment Size for the GitLab instance.
+The limit depends on how your GitLab instance is hosted:
-For GitLab.com, it is set to 10 MB.
+- Self-managed: Set by the configuration value of `Max Attachment Size` for the GitLab instance.
+- GitLab SaaS: On GitLab.com, it's set to 10 MB.
diff --git a/doc/user/project/issues/img/confidential_issues_issue_page.png b/doc/user/project/issues/img/confidential_issues_issue_page.png
index 0f5c774d258..b349149aa98 100644
--- a/doc/user/project/issues/img/confidential_issues_issue_page.png
+++ b/doc/user/project/issues/img/confidential_issues_issue_page.png
Binary files differ
diff --git a/doc/user/project/issues/img/design_management_v14_10.png b/doc/user/project/issues/img/design_management_v14_10.png
index a10be15eafd..133c0a52d6b 100644
--- a/doc/user/project/issues/img/design_management_v14_10.png
+++ b/doc/user/project/issues/img/design_management_v14_10.png
Binary files differ
diff --git a/doc/user/project/issues/img/sidebar_confidential_issue.png b/doc/user/project/issues/img/sidebar_confidential_issue.png
index a320f4dcfe5..0ef61c7f1b0 100644
--- a/doc/user/project/issues/img/sidebar_confidential_issue.png
+++ b/doc/user/project/issues/img/sidebar_confidential_issue.png
Binary files differ
diff --git a/doc/user/project/issues/img/turn_off_confidentiality.png b/doc/user/project/issues/img/turn_off_confidentiality.png
deleted file mode 100644
index 04a85933071..00000000000
--- a/doc/user/project/issues/img/turn_off_confidentiality.png
+++ /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
new file mode 100644
index 00000000000..37cbe0f4fd9
--- /dev/null
+++ b/doc/user/project/issues/img/turn_off_confidentiality_v15_0.png
Binary files differ
diff --git a/doc/user/project/issues/img/turn_on_confidentiality.png b/doc/user/project/issues/img/turn_on_confidentiality.png
deleted file mode 100644
index fac360ca6dc..00000000000
--- a/doc/user/project/issues/img/turn_on_confidentiality.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
new file mode 100644
index 00000000000..498867d1933
--- /dev/null
+++ b/doc/user/project/issues/img/turn_on_confidentiality_v15_0.png
Binary files differ
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 4508ef30ac5..7db66dd013b 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -225,6 +225,8 @@ When you're creating a new issue, you can complete the following fields:
## Edit an issue
+> Reordering list items [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15260) in GitLab 15.0.
+
You can edit an issue's title and description.
Prerequisites:
@@ -237,6 +239,14 @@ To edit an issue:
1. Edit the available fields.
1. Select **Save changes**.
+You can also reorder list items, which include bullet, numerical, and task list items.
+To reorder list items:
+
+1. Hover over the list item row to make the drag icon visible.
+1. Click and hold the drag icon.
+1. Drag the row to the new position in the list.
+1. Release the drag icon.
+
### Bulk edit issues from a project
> - Assigning epic [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/210470) in GitLab 13.2.
diff --git a/doc/user/project/members/index.md b/doc/user/project/members/index.md
index ff4677eddde..28bd353d8cc 100644
--- a/doc/user/project/members/index.md
+++ b/doc/user/project/members/index.md
@@ -189,7 +189,7 @@ You can filter and sort members in a project.
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Project information > Members**.
1. In the **Filter members** box, select `Membership` `=` `Inherited`.
-1. Press Enter.
+1. Press <kbd>Enter</kbd>.
![Project members filter inherited](img/project_members_filter_inherited_v14_4.png)
@@ -198,7 +198,7 @@ You can filter and sort members in a project.
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Project information > Members**.
1. In the **Filter members** box, select `Membership` `=` `Direct`.
-1. Press Enter.
+1. Press <kbd>Enter</kbd>.
![Project members filter direct](img/project_members_filter_direct_v14_4.png)
diff --git a/doc/user/project/merge_requests/allow_collaboration.md b/doc/user/project/merge_requests/allow_collaboration.md
index 5826ebcab49..d06c8182e22 100644
--- a/doc/user/project/merge_requests/allow_collaboration.md
+++ b/doc/user/project/merge_requests/allow_collaboration.md
@@ -60,10 +60,10 @@ In the following example:
To change or add a commit to the contributor's merge request:
-1. Open the merge request page, and select the **Overview** tab.
-1. Scroll to the merge request widget, and select **Check out branch**.
+1. Go to the merge request.
+1. In the upper right corner, select **Code**, then select **Check out branch**.
1. In the modal window, select **Copy** (**{copy-to-clipboard}**).
-1. In your terminal, navigate to your cloned version of the repository, and
+1. In your terminal, go to your cloned version of the repository, and
paste the commands. For example:
```shell
diff --git a/doc/user/project/merge_requests/approvals/img/security_approvals_v15_0.png b/doc/user/project/merge_requests/approvals/img/security_approvals_v15_0.png
new file mode 100644
index 00000000000..b28d216f180
--- /dev/null
+++ b/doc/user/project/merge_requests/approvals/img/security_approvals_v15_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/approvals/index.md b/doc/user/project/merge_requests/approvals/index.md
index e940426dc67..f0ab4d606ad 100644
--- a/doc/user/project/merge_requests/approvals/index.md
+++ b/doc/user/project/merge_requests/approvals/index.md
@@ -102,8 +102,8 @@ Without the approvals, the work cannot merge. Required approvals enable multiple
- Use the [code owners of changed files](rules.md#code-owners-as-eligible-approvers),
to determine who should review the work.
- Require an [approval before merging code that causes test coverage to decline](../../../../ci/pipelines/settings.md#coverage-check-approval-rule)
-- [Require approval from a security team](../../../application_security/index.md#security-approvals-in-merge-requests)
- before merging code that could introduce a vulnerability.
+- Users on GitLab Ultimate can also [require approval from a security team](../../../application_security/index.md#security-approvals-in-merge-requests)
+ before merging code that could introduce a vulnerability.
## Related topics
diff --git a/doc/user/project/merge_requests/approvals/rules.md b/doc/user/project/merge_requests/approvals/rules.md
index 01772e59127..17a42e1b540 100644
--- a/doc/user/project/merge_requests/approvals/rules.md
+++ b/doc/user/project/merge_requests/approvals/rules.md
@@ -242,3 +242,14 @@ the API.
For more information about this validation error, read
[issue 285129](https://gitlab.com/gitlab-org/gitlab/-/issues/285129).
+
+## Security Approvals **(ULTIMATE)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/357021) in GitLab 15.0.
+
+You can use [scan result policies](../../../application_security/policies/scan-result-policies.md#scan-result-policy-editor) to define security approvals based on the status of vulnerabilities in the merge request and the default branch.
+Details for each security policy is shown in the Security Approvals section of your Merge Request configuration.
+
+![Security Approvals](img/security_approvals_v15_0.png)
+
+These policies are both created and edited in the [security policy editor](../../../application_security/policies/index.md#policy-editor).
diff --git a/doc/user/project/merge_requests/approvals/settings.md b/doc/user/project/merge_requests/approvals/settings.md
index 0ede9310393..9c2b54888fb 100644
--- a/doc/user/project/merge_requests/approvals/settings.md
+++ b/doc/user/project/merge_requests/approvals/settings.md
@@ -119,16 +119,9 @@ 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](../fast_forward_merge.md)
+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.
-## Security approvals in merge requests **(ULTIMATE)**
-
-You can require that a member of your security team approves a merge request if a
-merge request could introduce a vulnerability.
-
-To learn more, see [Security approvals in merge requests](../../../application_security/index.md#security-approvals-in-merge-requests).
-
## Code coverage check approvals
You can require specific approvals if a merge request would result in a decline in code test
diff --git a/doc/user/project/merge_requests/changes.md b/doc/user/project/merge_requests/changes.md
index 8796ea0635b..5016a33ed28 100644
--- a/doc/user/project/merge_requests/changes.md
+++ b/doc/user/project/merge_requests/changes.md
@@ -14,7 +14,7 @@ changes.
By default, the diff view compares the versions of files in the merge request source branch
to the files in the target branch, and shows only the parts of a file that have changed.
-![Example screenshot of a source code diff](img/mr-diff-example_v14_8.png)
+![Example screenshot of a source code diff](img/mr-diff-example_v15.png)
## Show all changes in a merge request
diff --git a/doc/user/project/merge_requests/code_quality.md b/doc/user/project/merge_requests/code_quality.md
index 10fc778d5ae..7e8ef9272d4 100644
--- a/doc/user/project/merge_requests/code_quality.md
+++ b/doc/user/project/merge_requests/code_quality.md
@@ -72,7 +72,7 @@ This example shows how to run Code Quality on your code by using GitLab CI/CD an
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 in your CI configuration:
+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:
@@ -257,9 +257,9 @@ The template has these [`rules`](../../../ci/yaml/index.md#rules) for the `code
```yaml
code_quality:
rules:
- - if: '$CODE_QUALITY_DISABLED'
+ - if: $CODE_QUALITY_DISABLED
when: never
- - if: '$CI_COMMIT_TAG || $CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_TAG || $CI_COMMIT_BRANCH
```
If you are using merge request pipelines, your `rules` (or [`workflow: rules`](../../../ci/yaml/index.md#workflow))
@@ -268,9 +268,9 @@ 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
+ - 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`
@@ -282,11 +282,11 @@ include:
code_quality:
rules:
- - if: '$CODE_QUALITY_DISABLED'
+ - 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
+ - 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
@@ -541,7 +541,7 @@ This can be due to multiple reasons:
- 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 artifact(s) to expire faster than desired.
+ 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).
diff --git a/doc/user/project/merge_requests/confidential.md b/doc/user/project/merge_requests/confidential.md
index 6900880417f..5b17ec009e4 100644
--- a/doc/user/project/merge_requests/confidential.md
+++ b/doc/user/project/merge_requests/confidential.md
@@ -74,5 +74,5 @@ Open a merge request
- [Confidential issues](../issues/confidential_issues.md)
- [Make an epic confidential](../../group/epics/manage_epics.md#make-an-epic-confidential)
-- [Mark a comment as confidential](../../discussions/index.md#mark-a-comment-as-confidential)
+- [Add an internal note](../../discussions/index.md#add-an-internal-note)
- [Security practices for confidential merge requests](https://gitlab.com/gitlab-org/release/docs/blob/master/general/security/developer.md#security-releases-critical-non-critical-as-a-developer) at GitLab
diff --git a/doc/user/project/merge_requests/fast_forward_merge.md b/doc/user/project/merge_requests/fast_forward_merge.md
index 77162aa0b83..048421a3a5b 100644
--- a/doc/user/project/merge_requests/fast_forward_merge.md
+++ b/doc/user/project/merge_requests/fast_forward_merge.md
@@ -1,74 +1,11 @@
---
-stage: Create
-group: Source Code
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
-type: reference, concepts
+redirect_to: 'methods/index.md'
+remove_date: '2022-08-09'
---
-# Fast-forward merge requests **(FREE)**
+This document was moved to [another location](methods/index.md).
-Sometimes, a workflow policy might mandate a clean commit history without
-merge commits. In such cases, the fast-forward merge is the perfect candidate.
-
-With fast-forward merge requests, you can retain a linear Git history and a way
-to accept merge requests without creating merge commits.
-
-When the fast-forward merge
-([`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only)) setting
-is enabled, no merge commits are created and all merges are fast-forwarded,
-which means that merging is only allowed if the branch can be fast-forwarded.
-
-When a fast-forward merge is not possible, the user is given the option to rebase.
-
-NOTE:
-Projects using the fast-forward merge strategy can't filter merge requests
-[by deployment date](../../search/index.md#filtering-merge-requests-by-environment-or-deployment-date),
-because no merge commit is created.
-
-## Enabling fast-forward merges
-
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > General**.
-1. Expand **Merge requests**.
-1. In the **Merge method** section, select **Fast-forward merge**.
-1. Select **Save changes**.
-
-Now, when you visit the merge request page, you can accept it
-**only if a fast-forward merge is possible**.
-
-![Fast forward merge request](img/ff_merge_mr.png)
-
-If a fast-forward merge is not possible but a conflict free rebase is possible,
-a rebase button is offered.
-
-You can also rebase without running a CI/CD pipeline.
-[Introduced in](https://gitlab.com/gitlab-org/gitlab/-/issues/118825) GitLab 14.7.
-
-The rebase action is also available as a [quick action command: `/rebase`](../../../topics/git/git_rebase.md#rebase-from-the-gitlab-ui).
-
-![Fast forward merge request](img/ff_merge_rebase_v14_9.png)
-
-If the target branch is ahead of the source branch and a conflict free rebase is
-not possible, you need to rebase the
-source branch locally before you can do a fast-forward merge.
-
-![Fast forward merge rebase locally](img/ff_merge_rebase_locally.png)
-
-## Fast-forward merges prevent squashing commits
-
-If your project has enabled fast-forward merges, to merge cleanly, the code in a
-merge request cannot use [squashing during merge](squash_and_merge.md). Squashing
-is available only when accepting a merge request. Rebasing may be required before
-squashing, even though squashing can itself be considered equivalent to rebasing.
-
-<!-- ## 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-08-09>. -->
+<!-- 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/getting_started.md b/doc/user/project/merge_requests/getting_started.md
index fd1751585d5..c1986a80ca0 100644
--- a/doc/user/project/merge_requests/getting_started.md
+++ b/doc/user/project/merge_requests/getting_started.md
@@ -51,9 +51,9 @@ Learn the various ways to [create a merge request](creating_merge_requests.md).
When you start a new merge request, you can immediately include the following
options. You can also add them later by either selecting **Edit** on the merge
request's page at the top-right side, or by using
-[keyboard shortcuts for merge requests](../../shortcuts.md#issues-and-merge-requests):
+[keyboard shortcuts for merge requests](../../shortcuts.md#merge-requests):
-- [Assign](#assignee) the merge request to a colleague for review. With [multiple assignees](#multiple-assignees), you can assign it to more than one person at a time.
+- [Assign](index.md#assign-a-user-to-a-merge-request) the merge request to a colleague for review. With [multiple assignees](index.md#assign-multiple-users), you can assign it to more than one person at a time.
- Set a [milestone](../milestones/index.md) to track time-sensitive changes.
- Add [labels](../labels.md) to help contextualize and filter your merge requests over time.
- [Require approval](approvals/index.md#required-approvals) from your team.
@@ -76,43 +76,11 @@ After you have created the merge request, you can also:
Many of these options can be set:
-- From the merge request page, with [keyboard shortcuts](../../shortcuts.md#issues-and-merge-requests).
+- From the merge request page, with [keyboard shortcuts](../../shortcuts.md#merge-requests).
- When pushing changes from the command line, with [Git push options](../push_options.md).
See also other [features associated to merge requests](reviews/index.md#associated-features).
-### Assignee
-
-Choose an assignee to designate someone as the person responsible
-for the first [review of the merge request](reviews/index.md).
-Open the drop down box to search for the user you wish to assign,
-and the merge request is added to their
-[assigned merge request list](../../search/index.md#search-issues-and-merge-requests).
-
-#### Multiple assignees **(PREMIUM)**
-
-> Moved to GitLab Premium in 13.9
-
-Multiple people often review merge requests at the same time.
-GitLab allows you to have multiple assignees for merge requests
-to indicate everyone that is reviewing or accountable for it.
-
-![multiple assignees for merge requests sidebar](img/multiple_assignees_for_merge_requests_sidebar.png)
-
-To assign multiple assignees to a merge request:
-
-1. From a merge request, expand the right sidebar and locate the **Assignees** section.
-1. Click on **Edit** and from the dropdown menu, select as many users as you want
- to assign the merge request to.
-
-Similarly, assignees are removed by deselecting them from the same
-dropdown menu.
-
-It is also possible to manage multiple assignees:
-
-- When creating a merge request.
-- Using [quick actions](../quick_actions.md#issues-merge-requests-and-epics).
-
### Reviewer
WARNING:
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
new file mode 100644
index 00000000000..323fd03ffa2
--- /dev/null
+++ b/doc/user/project/merge_requests/img/merge_method_ff_v15_0.png
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
new file mode 100644
index 00000000000..b880c2c0e04
--- /dev/null
+++ b/doc/user/project/merge_requests/img/merge_method_merge_commit_v15_0.png
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
new file mode 100644
index 00000000000..9eab71e9d3c
--- /dev/null
+++ b/doc/user/project/merge_requests/img/merge_method_merge_commit_with_semi_linear_history_v15_0.png
Binary files differ
diff --git a/doc/user/project/merge_requests/img/mr-diff-example_v14_8.png b/doc/user/project/merge_requests/img/mr-diff-example_v14_8.png
deleted file mode 100644
index 1984defde9a..00000000000
--- a/doc/user/project/merge_requests/img/mr-diff-example_v14_8.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/merge_requests/img/mr-diff-example_v15.png b/doc/user/project/merge_requests/img/mr-diff-example_v15.png
new file mode 100644
index 00000000000..8fdf3935906
--- /dev/null
+++ b/doc/user/project/merge_requests/img/mr-diff-example_v15.png
Binary files differ
diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md
index a3b9fb52f0d..510dcd82907 100644
--- a/doc/user/project/merge_requests/index.md
+++ b/doc/user/project/merge_requests/index.md
@@ -70,6 +70,72 @@ change and whether you need access to a development environment:
- [Push changes from the command line](../../../gitlab-basics/start-using-git.md), if you are
familiar with Git and the command line.
+## Assign a user to a merge request
+
+When a merge request is created, it's assigned by default to the person who created it.
+This person owns the merge request, but isn't responsible for [reviewing it](reviews/index.md).
+To assign the merge request to someone else, use the `/assign @user`
+[quick action](../quick_actions.md#issues-merge-requests-and-epics) in a text area in
+a merge request, or:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Merge requests** and find your merge request.
+1. On the right sidebar, expand the right sidebar and locate the **Assignees** section.
+1. Select **Edit**.
+1. Search for the user you want to assign, and select the user.
+
+The merge request is added to the user's
+[assigned merge request list](../../search/index.md#search-issues-and-merge-requests).
+
+### Assign multiple users **(PREMIUM)**
+
+> Moved to GitLab Premium in 13.9.
+
+GitLab enables multiple assignees for merge requests, if multiple people are
+accountable for it:
+
+![multiple assignees for merge requests sidebar](img/multiple_assignees_for_merge_requests_sidebar.png)
+
+To assign multiple assignees to a merge request, use the `/assign @user`
+[quick action](../quick_actions.md#issues-merge-requests-and-epics) in a text area, or:
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Merge requests** and find your merge request.
+1. On the right sidebar, expand the right sidebar and locate the **Assignees** section.
+1. Select **Edit** and, from the dropdown list, select all users you want
+ to assign the merge request to.
+
+To remove an assignee, clear the user from the same dropdown list.
+
+## Close a merge request
+
+If you decide to permanently stop work on a merge request,
+GitLab recommends you close the merge request rather than
+[delete it](#delete-a-merge-request). The author and assignees of a merge request, and users with
+Developer, Maintainer, or Owner [roles](../../permissions.md) in a project
+can close merge requests in the project:
+
+1. Go to the merge request you want to close.
+1. Scroll to the comment box at the bottom of the page.
+1. Following the comment box, select **Close merge request**.
+
+GitLab closes the merge request, but preserves records of the merge request,
+its comments, and any associated pipelines.
+
+### Delete a merge request
+
+GitLab recommends you close, rather than delete, merge requests.
+
+WARNING:
+You cannot undo the deletion of a merge request.
+
+To delete a merge request:
+
+1. Sign in to GitLab as a user with the project Owner role.
+ Only users with this role can delete merge requests in a project.
+1. Go to the merge request you want to delete, and select **Edit**.
+1. Scroll to the bottom of the page, and select **Delete merge request**.
+
## 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.
@@ -117,35 +183,6 @@ 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.
-## Close a merge request
-
-If you decide to permanently stop work on a merge request,
-GitLab recommends you close the merge request rather than
-[delete it](#delete-a-merge-request). The author and assignees of a merge request, and users with
-Developer, Maintainer, or Owner [roles](../../permissions.md) in a project
-can close merge requests in the project:
-
-1. Go to the merge request you want to close.
-1. Scroll to the comment box at the bottom of the page.
-1. Following the comment box, select **Close merge request**.
-
-GitLab closes the merge request, but preserves records of the merge request,
-its comments, and any associated pipelines.
-
-### Delete a merge request
-
-GitLab recommends you close, rather than delete, merge requests.
-
-WARNING:
-You cannot undo the deletion of a merge request.
-
-To delete a merge request:
-
-1. Sign in to GitLab as a user with the project Owner role.
- Only users with this role can delete merge requests in a project.
-1. Go to the merge request you want to delete, and select **Edit**.
-1. Scroll to the bottom of the page, and select **Delete merge request**.
-
## Merge request workflows
For a software developer working in a team:
diff --git a/doc/user/project/merge_requests/load_performance_testing.md b/doc/user/project/merge_requests/load_performance_testing.md
index 7861e1e28fc..a5fff4a38be 100644
--- a/doc/user/project/merge_requests/load_performance_testing.md
+++ b/doc/user/project/merge_requests/load_performance_testing.md
@@ -189,7 +189,7 @@ review:
paths:
- review.env
rules:
- - if: '$CI_COMMIT_BRANCH' # Modify to match your pipeline rules, or use `only/except` if needed.
+ - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
load_performance:
dependencies:
@@ -197,5 +197,5 @@ load_performance:
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.
+ - if: $CI_COMMIT_BRANCH # Modify to match your pipeline rules, or use `only/except` if needed.
```
diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
index 256dde4fa17..ac1c61f2e72 100644
--- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
+++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md
@@ -50,7 +50,7 @@ You can prevent merge requests from being merged if:
This works for both:
- GitLab CI/CD pipelines
-- Pipelines run from an [external CI integration](../integrations/overview.md#integrations-listing)
+- Pipelines run from an [external CI integration](../integrations/index.md#available-integrations)
As a result, [disabling GitLab CI/CD pipelines](../../../ci/enable_or_disable_ci.md)
does not disable this feature, as it is possible to use pipelines from external
@@ -81,13 +81,13 @@ it could allow code that fails tests to be merged:
```yaml
branch-pipeline-job:
rules:
- - if: '$CI_PIPELINE_SOURCE == "push"'
+ - if: $CI_PIPELINE_SOURCE == "push"
script:
- echo "Code testing scripts here, for example."
merge-request-pipeline-job:
rules:
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- echo "No tests run, but this pipeline always succeeds and enables merge."
- echo true
diff --git a/doc/user/project/merge_requests/methods/index.md b/doc/user/project/merge_requests/methods/index.md
new file mode 100644
index 00000000000..adfa5288f81
--- /dev/null
+++ b/doc/user/project/merge_requests/methods/index.md
@@ -0,0 +1,116 @@
+---
+stage: Create
+group: Source Code
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+type: reference, concepts
+---
+
+# Merge methods **(FREE)**
+
+The merge method you select for your project determines how the changes in your
+merge requests are merged into an existing branch.
+
+## Configure a project's merge method
+
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Merge requests**.
+1. In the **Merge method** section, select your desired merge method.
+1. Select **Save changes**.
+
+## Merge commit
+
+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)
+
+- 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:
+
+ ```shell
+ git checkout `git merge-base <source-branch> <target-branch>`
+ git merge --squash <source-branch>
+ SOURCE_SHA=`git rev-parse HEAD`
+ git checkout <target-branch>
+ git merge --no-ff $SOURCE_SHA
+ ```
+
+## Merge commit with semi-linear history
+
+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)
+
+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**.
+When a fast-forward merge is not possible, the user is given the option to rebase, see
+[Rebasing in (semi-)linear merge methods](#rebasing-in-semi-linear-merge-methods).
+
+This method is equivalent to the same Git commands as in the **Merge commit** method. However,
+if your source branch is based on an out-of-date version of the target branch (such as `main`),
+you must rebase your source branch.
+This merge method creates a cleaner-looking history, while still enabling you to
+see where every branch began and was merged.
+
+## Fast-forward merge
+
+Sometimes, a workflow policy might mandate a clean commit history without
+merge commits. In such cases, the fast-forward merge is appropriate. With
+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)
+
+This method is equivalent to `git merge --ff <source-branch>` for regular merges, and to
+`git merge -squash <source-branch>` for squash merges.
+
+When the fast-forward merge
+([`--ff-only`](https://git-scm.com/docs/git-merge#git-merge---ff-only)) setting
+is enabled, no merge commits are created and all merges are fast-forwarded,
+which means that merging is only allowed if the branch can be fast-forwarded.
+When a fast-forward merge is not possible, the user is given the option to rebase, see
+[Rebasing in (semi-)linear merge methods](#rebasing-in-semi-linear-merge-methods).
+
+NOTE:
+Projects using the fast-forward merge strategy can't filter merge requests
+[by deployment date](../../../search/index.md#filtering-merge-requests-by-environment-or-deployment-date),
+because no merge commit is created.
+
+When you visit the merge request page with `Fast-forward merge`
+method selected, you can accept it **only if a fast-forward merge is possible**.
+
+![Fast-forward merge request](../img/ff_merge_mr.png)
+
+## Rebasing in (semi-)linear merge methods
+
+> Rebasing without running a CI/CD pipeline [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/118825) in GitLab 14.7.
+
+In these merge methods, you can merge only when your source branch is up-to-date with the target branch:
+
+- Merge commit with semi-linear history.
+- Fast-forward merge.
+
+If a fast-forward merge is not possible but a conflict-free rebase is possible,
+GitLab offers you the [`/rebase` quick action](../../../../topics/git/git_rebase.md#rebase-from-the-gitlab-ui),
+and the ability to **Rebase** from the user interface:
+
+![Fast forward merge request](../img/ff_merge_rebase_v14_9.png)
+
+In [GitLab 14.7](https://gitlab.com/gitlab-org/gitlab/-/issues/118825) and later, you can also rebase without running a CI/CD pipeline.
+
+If the target branch is ahead of the source branch and a conflict-free rebase is
+not possible, you must rebase the source branch locally before you can do a fast-forward merge.
+
+![Fast forward merge rebase locally](../img/ff_merge_rebase_locally.png)
+
+Rebasing may be required before squashing, even though squashing can itself be
+considered equivalent to rebasing.
+
+## Related topics
+
+- [Commits history](../commits.md)
+- [Squash and merge](../squash_and_merge.md)
diff --git a/doc/user/project/merge_requests/revert_changes.md b/doc/user/project/merge_requests/revert_changes.md
index 6441ccb73fe..7b4a41f9339 100644
--- a/doc/user/project/merge_requests/revert_changes.md
+++ b/doc/user/project/merge_requests/revert_changes.md
@@ -14,7 +14,7 @@ by clicking the **Revert** button in merge requests and commit details.
NOTE:
The **Revert** button is shown only for projects that use the
merge method "Merge Commit", which can be set under the project's
-**Settings > General > Merge request**. [Fast-forward commits](fast_forward_merge.md)
+**Settings > General > Merge request**. [Fast-forward commits](methods/index.md#fast-forward-merge)
can not be reverted by using the merge request view.
After the merge request has been merged, use the **Revert** button
diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md
index 512faae82a9..eb5a54e6119 100644
--- a/doc/user/project/merge_requests/reviews/index.md
+++ b/doc/user/project/merge_requests/reviews/index.md
@@ -131,17 +131,6 @@ the author of the merge request can request a new review from the reviewer:
GitLab creates a new [to-do item](../../../todos.md) for the reviewer, and sends
them a notification email.
-## Semi-linear history merge requests
-
-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.
-
-1. Go to your project and select **Settings > General**.
-1. Expand **Merge requests**.
-1. In the **Merge method** section, select **Merge commit with semi-linear history**.
-1. Select **Save changes**.
-
## Comment on multiple lines
> - [Introduced](https://gitlab.com/gitlab-org/ux-research/-/issues/870) in GitLab 13.2.
@@ -211,17 +200,17 @@ These features are associated with merge requests:
- [Cherry-pick changes](../cherry_pick_changes.md):
Cherry-pick any commit in the UI by selecting the **Cherry-pick** button in a merged merge requests or a commit.
-- [Fast-forward merge requests](../fast_forward_merge.md):
+- [Fast-forward merge requests](../methods/index.md#fast-forward-merge):
For a linear Git history and a way to accept merge requests without creating merge commits
- [Find the merge request that introduced a change](../versions.md):
- When viewing the commit details page, GitLab links to the merge request(s) containing that commit.
+ When viewing the commit details page, GitLab links to the merge requests containing that commit.
- [Merge requests versions](../versions.md):
Select and compare the different versions of merge request diffs
- [Resolve conflicts](../conflicts.md):
GitLab can provide the option to resolve certain merge request conflicts in the GitLab UI.
- [Revert changes](../revert_changes.md):
Revert changes from any commit from a merge request.
-- [Keyboard shortcuts](../../../shortcuts.md#issues-and-merge-requests):
+- [Keyboard shortcuts](../../../shortcuts.md#merge-requests):
Access and modify specific parts of a merge request with keyboard commands.
## Troubleshooting
@@ -365,3 +354,7 @@ All the above can be done with the [`git-mr`](https://gitlab.com/glensc/git-mr)
In a group, the sidebar displays the total count of open merge requests. This value is cached if it's greater than
than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours.
+
+## Related topics
+
+- [Merge methods](../methods/index.md)
diff --git a/doc/user/project/merge_requests/squash_and_merge.md b/doc/user/project/merge_requests/squash_and_merge.md
index a1d6959b75e..7e37990b9bf 100644
--- a/doc/user/project/merge_requests/squash_and_merge.md
+++ b/doc/user/project/merge_requests/squash_and_merge.md
@@ -18,8 +18,8 @@ in your Git repository by using the _squash and merge_ strategy.
Each time a branch merges into your base branch, up to two commits are added:
- The single commit created by squashing the commits from the branch.
-- A merge commit, unless you have [enabled fast-forward merges](fast_forward_merge.md#enabling-fast-forward-merges)
- in your project. Fast-forward merges disable both merge commits and squashing.
+- A merge commit, unless you have enabled [fast-forward merges](methods/index.md#fast-forward-merge)
+ in your project. Fast-forward merges disable merge commits.
By default, squashed commits contain the following metadata:
@@ -74,7 +74,7 @@ To configure the default squashing behavior for all merge requests in your proje
## Related topics
- [Commit message templates](commit_templates.md)
-- [Fast-forward merges](fast_forward_merge.md)
+- [Merge methods](methods/index.md)
<!-- ## Troubleshooting
diff --git a/doc/user/project/merge_requests/test_coverage_visualization.md b/doc/user/project/merge_requests/test_coverage_visualization.md
index 9f1e5ae7046..85b5bbea284 100644
--- a/doc/user/project/merge_requests/test_coverage_visualization.md
+++ b/doc/user/project/merge_requests/test_coverage_visualization.md
@@ -28,7 +28,7 @@ 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:cobertura`](../../../ci/yaml/artifacts_reports.md#artifactsreportscobertura-deprecated).
+[`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:
@@ -196,7 +196,9 @@ coverage-jdk11:
needs: ["test-jdk11"]
artifacts:
reports:
- cobertura: target/site/cobertura.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: target/site/cobertura.xml
```
#### Gradle example
@@ -232,7 +234,9 @@ coverage-jdk11:
needs: ["test-jdk11"]
artifacts:
reports:
- cobertura: build/cobertura.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: build/cobertura.xml
```
### Python example
@@ -251,9 +255,12 @@ run tests:
- coverage run -m pytest
- coverage report
- coverage xml
+ coverage: '/TOTAL.*\s([.\d]+)%/'
artifacts:
reports:
- cobertura: coverage.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.xml
```
### PHP example
@@ -263,7 +270,7 @@ 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:
+generate the `coverage.xml`:
```yaml
run tests:
@@ -283,7 +290,9 @@ run tests:
- php ./vendor/bin/phpunit --coverage-text --coverage-cobertura=coverage.cobertura.xml
artifacts:
reports:
- cobertura: coverage.cobertura.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.cobertura.xml
```
[Codeception](https://codeception.com/), through PHPUnit, also supports generating Cobertura report with
@@ -318,7 +327,9 @@ run tests:
name: ${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}
expire_in: 2 days
reports:
- cobertura: build/coverage.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: build/coverage.xml
```
### Go example
@@ -345,7 +356,9 @@ run tests:
- go run github.com/boumenot/gocover-cobertura < coverage.txt > coverage.xml
artifacts:
reports:
- cobertura: coverage.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage.xml
```
### Ruby example
@@ -372,5 +385,7 @@ run tests:
- bundle exec rspec
artifacts:
reports:
- cobertura: coverage/coverage.xml
+ coverage_report:
+ coverage_format: cobertura
+ path: coverage/coverage.xml
```
diff --git a/doc/user/project/milestones/index.md b/doc/user/project/milestones/index.md
index 4501cf500b0..c2b85a2183c 100644
--- a/doc/user/project/milestones/index.md
+++ b/doc/user/project/milestones/index.md
@@ -53,10 +53,14 @@ If you're in a project and select **Issues > Milestones**, GitLab displays only
## Creating milestones
-Users with at least the Developer role can create milestones.
+> [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.
+Prerequisites:
+
+- You must have at least the Reporter role for a group.
+
To create a milestone:
1. On the top bar, select **Menu > Projects** and find your project or **Menu > Groups** and find your group.
@@ -69,7 +73,13 @@ To create a milestone:
## Editing milestones
-Users with at least the Developer role can edit milestones.
+> [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.
To edit a milestone:
diff --git a/doc/user/project/pages/getting_started/pages_from_scratch.md b/doc/user/project/pages/getting_started/pages_from_scratch.md
index f08afc924f3..5fd17b5c07e 100644
--- a/doc/user/project/pages/getting_started/pages_from_scratch.md
+++ b/doc/user/project/pages/getting_started/pages_from_scratch.md
@@ -202,7 +202,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
pages:
script:
@@ -222,7 +222,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
pages:
script:
@@ -233,7 +233,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: $CI_COMMIT_BRANCH == "main"
```
### Specify a stage to deploy
@@ -253,7 +253,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
pages:
stage: deploy
@@ -265,7 +265,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: $CI_COMMIT_BRANCH == "main"
```
Now add another job to the CI file, telling it to
@@ -276,7 +276,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
pages:
stage: deploy
@@ -288,7 +288,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: $CI_COMMIT_BRANCH == "main"
test:
stage: test
@@ -300,7 +300,7 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "main"'
+ - if: $CI_COMMIT_BRANCH != "main"
```
When the `test` job runs in the `test` stage, Jekyll
@@ -327,7 +327,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
before_script:
- gem install bundler
@@ -341,7 +341,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: $CI_COMMIT_BRANCH == "main"
test:
stage: test
@@ -351,7 +351,7 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "main"'
+ - if: $CI_COMMIT_BRANCH != "main"
```
### Build faster with cached dependencies
@@ -367,7 +367,7 @@ image: ruby:2.7
workflow:
rules:
- - if: '$CI_COMMIT_BRANCH'
+ - if: $CI_COMMIT_BRANCH
cache:
paths:
@@ -385,7 +385,7 @@ pages:
paths:
- public
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: $CI_COMMIT_BRANCH == "main"
test:
stage: test
@@ -395,7 +395,7 @@ test:
paths:
- test
rules:
- - if: '$CI_COMMIT_BRANCH != "main"'
+ - if: $CI_COMMIT_BRANCH != "main"
```
In this case, you need to exclude the `/vendor`
diff --git a/doc/user/project/pages/introduction.md b/doc/user/project/pages/introduction.md
index f274338c2fd..5846ceeb1b6 100644
--- a/doc/user/project/pages/introduction.md
+++ b/doc/user/project/pages/introduction.md
@@ -304,7 +304,7 @@ Find more details in the [Pages administration documentation](../../../administr
Safari requires the web server to support the [Range request header](https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/CreatingVideoforSafarioniPhone/CreatingVideoforSafarioniPhone.html#//apple_ref/doc/uid/TP40006514-SW6)
in order to play your media content. For GitLab Pages to serve
-HTTP Range requests, you should use the following two variables in your `.gitlab-ci.yaml` file:
+HTTP Range requests, you should use the following two variables in your `.gitlab-ci.yml` file:
```yaml
pages:
diff --git a/doc/user/project/protected_branches.md b/doc/user/project/protected_branches.md
index 06396b5cd62..56f5a2d24ff 100644
--- a/doc/user/project/protected_branches.md
+++ b/doc/user/project/protected_branches.md
@@ -10,7 +10,7 @@ In GitLab, [permissions](../permissions.md) are fundamentally defined around the
idea of having read or write permission to the repository and branches. To impose
further restrictions on certain branches, they can be protected.
-The default branch for your repository is protected by default.
+The [default branch](repository/branches/default.md) for your repository is protected by default.
## Who can modify a protected branch
@@ -39,7 +39,8 @@ Prerequisite:
To protect a branch:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to merge** list, select a role, or group that can merge into this branch. In GitLab Premium, you can also add users.
@@ -50,13 +51,18 @@ The protected branch displays in the list of protected branches.
## Configure multiple protected branches by using a wildcard
+If both a specific rule and a wildcard rule apply to the same branch, the most
+permissive rule controls how the branch behaves. For merge controls to work properly,
+set **Allowed to push** to a broader set of users than **Allowed to merge**.
+
Prerequisite:
- You must have at least the Maintainer role.
To protect multiple branches at the same time:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, type the branch name and a wildcard.
For example:
@@ -88,7 +94,8 @@ from the command line or from a Git client application.
To create a new branch through the user interface:
-1. Go to **Repository > Branches**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Repository > Branches**.
1. Select **New branch**.
1. Fill in the branch name and select an existing branch, tag, or commit to
base the new branch on. Only existing protected branches and commits
@@ -96,21 +103,28 @@ To create a new branch through the user interface:
## Require everyone to submit merge requests for a protected branch
-You can force everyone to submit a merge request, rather than allowing them to check in directly
-to a protected branch. This is compatible with workflows like the [GitLab workflow](../../topics/gitlab_flow.md).
+You can force everyone to submit a merge request, rather than allowing them to
+check in directly to a protected branch. This setting is compatible with workflows
+like the [GitLab workflow](../../topics/gitlab_flow.md).
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to merge** list, select **Developers + Maintainers**.
1. From the **Allowed to push** list, select **No one**.
+
+ NOTE:
+ Setting a role, group or user as **Allowed to push** also allows those users to merge.
+
1. Select **Protect**.
## Allow everyone to push directly to a protected branch
You can allow everyone with write access to push to the protected branch.
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to push** list, select **Developers + Maintainers**.
@@ -137,7 +151,8 @@ Prerequisites:
To allow a deploy key to push to a protected branch:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to push** list, select the deploy key.
@@ -155,7 +170,8 @@ protected branches.
To protect a new branch and enable force push:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to push** and **Allowed to merge** lists, select the settings you want.
@@ -166,7 +182,8 @@ To protect a new branch and enable force push:
To enable force pushes on branches that are already protected:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. In the list of protected branches, next to the branch, turn on the **Allowed to force push** toggle.
@@ -181,7 +198,8 @@ For a protected branch, you can require at least one approval by a [Code Owner](
To protect a new branch and enable Code Owner's approval:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. From the **Branch** dropdown list, select the branch you want to protect.
1. From the **Allowed to push** and **Allowed to merge** lists, select the settings you want.
@@ -190,7 +208,8 @@ To protect a new branch and enable Code Owner's approval:
To enable Code Owner's approval on branches that are already protected:
-1. Go to your project and select **Settings > Repository**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
1. Expand **Protected branches**.
1. In the list of protected branches, next to the branch, turn on the **Code owner approval** toggle.
@@ -221,9 +240,11 @@ for details about the pipelines security model.
Users with at least the Maintainer role can manually delete protected
branches by using the GitLab web interface:
-1. Go to **Repository > Branches**.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Repository > Branches**.
1. Next to the branch you want to delete, select **Delete** (**{remove}**).
-1. On the confirmation dialog, type the branch name and select **Delete protected branch**.
+1. On the confirmation dialog, type the branch name.
+1. Select **Yes, delete protected branch**.
Protected branches can only be deleted by using GitLab either from the UI or API.
This prevents accidentally deleting a branch through local Git commands or
diff --git a/doc/user/project/push_options.md b/doc/user/project/push_options.md
index d04f79d11c7..6ef8477b6b6 100644
--- a/doc/user/project/push_options.md
+++ b/doc/user/project/push_options.md
@@ -63,6 +63,7 @@ time as pushing changes:
| `merge_request.remove_source_branch` | Set the merge request to remove the source branch when it's merged. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.title="<title>"` | Set the title of the merge request. Ex: `git push -o merge_request.title="The title I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
| `merge_request.description="<description>"` | Set the description of the merge request. Ex: `git push -o merge_request.description="The description I want"`. | [12.2](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/64320) |
+| `merge_request.draft` | Mark the merge request as a draft. Ex: `git push -o merge_request.draft`. | [15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/296673) |
| `merge_request.milestone="<milestone>"` | Set the milestone of the merge request. Ex: `git push -o merge_request.milestone="3.0"`. | [14.1](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63960) |
| `merge_request.label="<label>"` | Add labels to the merge request. If the label does not exist, it is created. For example, for two labels: `git push -o merge_request.label="label1" -o merge_request.label="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
| `merge_request.unlabel="<label>"` | Remove labels from the merge request. For example, for two labels: `git push -o merge_request.unlabel="label1" -o merge_request.unlabel="label2"`. | [12.3](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31831) |
diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md
index 26b36198bde..c0a6fa9c301 100644
--- a/doc/user/project/releases/index.md
+++ b/doc/user/project/releases/index.md
@@ -91,6 +91,7 @@ To create a release in the Releases page:
- [Title](#title).
- [Milestones](#associate-milestones-with-a-release).
- [Release notes](#release-notes-description).
+ - Whether or not to include the [Tag message](../../../topics/git/tags.md).
- [Asset links](#links).
1. Select **Create release**.
@@ -439,8 +440,11 @@ Every release has a description. You can add any text you like, but we recommend
including a changelog to describe the content of your release. This helps users
quickly scan the differences between each release you publish.
-[Git's tagging messages](https://git-scm.com/book/en/v2/Git-Basics-Tagging) and
-Release note descriptions are unrelated. Description supports [Markdown](../../markdown.md).
+[Git's tagging messages](https://git-scm.com/book/en/v2/Git-Basics-Tagging) can
+be included in Release note descriptions by selecting **Include tag message in
+the release notes**.
+
+Description supports [Markdown](../../markdown.md).
### Release assets
@@ -529,7 +533,7 @@ The physical location of the asset can change at any time and the direct link re
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/16821) in GitLab 14.9.
-The `filepath` from [permanent links to release assets](#permanent-links-to-release-assets) can be used in combination with [permanent link to the latest release](#permanent-link-to-latest-release). It is useful when we want to link a permanant URL to download an asset from the *latest release*.
+The `filepath` from [permanent links to release assets](#permanent-links-to-release-assets) can be used in combination with [permanent link to the latest release](#permanent-link-to-latest-release). It is useful when we want to link a permanent URL to download an asset from the *latest release*.
The format of the URL is:
diff --git a/doc/user/project/repository/gpg_signed_commits/index.md b/doc/user/project/repository/gpg_signed_commits/index.md
index 00998c9a227..b2a6c8848ce 100644
--- a/doc/user/project/repository/gpg_signed_commits/index.md
+++ b/doc/user/project/repository/gpg_signed_commits/index.md
@@ -11,7 +11,7 @@ GPG ([GNU Privacy Guard](https://gnupg.org/)) key. When you add a cryptographic
signature to your commit, you provide extra assurance that a commit
originated from you, rather than an impersonator. If GitLab can verify a commit
author's identity with a public GPG key, the commit is marked **Verified** in the
-GitLab UI. You can then configure [push rules](../push_rules.md#enabling-push-rules)
+GitLab UI. You can then configure [push rules](../push_rules.md)
for your project to reject individual commits not signed with GPG, or reject all
commits from unverified users.
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 6ece6e3e4e0..02b5639cae8 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -244,6 +244,11 @@ When you [rename a user](../../profile/index.md#change-your-username),
- The redirects are available as long as the original path is not claimed by
another group, user, or project.
+WARNING:
+The [CI/CD `includes` keyword](../../../ci/yaml/includes.md) can't follow project
+redirects. Pipelines fail with a syntax error when configured to use `includes`
+to fetch configuration from a project that is renamed or moved.
+
## Related topics
- [GitLab Workflow VS Code extension](vscode.md).
diff --git a/doc/user/project/repository/jupyter_notebooks/index.md b/doc/user/project/repository/jupyter_notebooks/index.md
index 39b57f89ceb..d013d2802bf 100644
--- a/doc/user/project/repository/jupyter_notebooks/index.md
+++ b/doc/user/project/repository/jupyter_notebooks/index.md
@@ -23,21 +23,25 @@ it's rendered into HTML when you view it:
Interactive features, including JavaScript plots, don't work when viewed in
GitLab.
-## Cleaner diffs
+## Cleaner diffs and raw diffs
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/6589) in GitLab 14.5 as an [Alpha](../../../../policy/alpha-beta-support.md#alpha-features) release [with a flag](../../../../administration/feature_flags.md) named `jupyter_clean_diffs`. Enabled by default.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/75500) in GitLab 14.9. Feature flag `jupyter_clean_diffs` removed.
> - [Reintroduced toggle](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85079) in GitLab 15.0 [with a flag](../../../../administration/feature_flags.md) named `ipynb_semantic_diff`. Enabled by default.
+> - Selecting between raw and cleaner diffs [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85203) in GitLab 15.0 [with a flag](../../../../administration/feature_flags.md) named `rendered_diffs_viewer`. 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 `ipynb_semantic_diff`.
+On self-managed GitLab, by default semantic diffs are available. To hide the feature, ask an administrator to [disable the feature flag](../../../../administration/feature_flags.md) named `ipynb_semantic_diff`.
On GitLab.com, this feature is available.
-This feature is ready for production use.
+
+FLAG:
+On self-managed GitLab, by default the ability to switch between raw and rendered diffs is available. To hide the feature, ask an administrator to [disable the feature flag](../../../../administration/feature_flags.md)named `rendered_diffs_viewer`. On GitLab.com, this feature is available.
When commits include changes to Jupyter Notebook files, GitLab:
- Transforms the machine-readable `.ipynb` file into a human-readable Markdown file.
- Displays a cleaner version of the diff that includes syntax highlighting.
+- Enables switching between raw and rendered diffs on the Commit and Compare pages. (Not available on merge request pages.)
Code suggestions are not available on diffs and merge requests for `.ipynb` files.
diff --git a/doc/user/project/repository/managing_large_repositories.md b/doc/user/project/repository/managing_large_repositories.md
new file mode 100644
index 00000000000..d6f88697c54
--- /dev/null
+++ b/doc/user/project/repository/managing_large_repositories.md
@@ -0,0 +1,51 @@
+---
+stage: Enablement
+group: Distribution
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
+description: "Documentation on large repositories."
+---
+
+# Managing large repositories **(FREE SELF)**
+
+GitLab, like any Git based system, is subject to similar performance restraints when it comes to large
+repositories that size into the gigabytes.
+
+On this page we detail several best practices to improve performance with these large repositories on GitLab.
+
+## Large File System (LFS)
+
+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 info](../../../topics/git/lfs/index.md).
+
+## Gitaly Pack Objects Cache
+
+Gitaly, the service that provides storage for Git repositories, can be configured to cache a short rolling window of Git fetch responses. This is recommended for large repositories as it can notably reduce server load when your server receives lots of fetch traffic.
+
+Refer to the [Gitaly Pack Objects Cache for more info](../../../administration/gitaly/configure_gitaly.md#pack-objects-cache).
+
+## Reference Architectures
+
+Large repositories tend to be found in larger organisations with many users. The GitLab Quality and Support teams provide several [Reference Architectures](../../../administration/reference_architectures/index.md) that are the recommended way to deploy GitLab at scale.
+
+In these types of setups it's recommended that the GitLab environment used matches a Reference Architecture to improve performance.
+
+## Gitaly Cluster
+
+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 info](../../../administration/gitaly/index.md), specifically the [Before deploying Gitaly Cluster](../../../administration/gitaly/index.md#before-deploying-gitaly-cluster) section.
+
+## Keep GitLab up to date
+
+Performance improvements and fixes are added continuously in GitLab. As such, it's recommended you keep GitLab updated to the latest version where possible to benefit from these.
+
+## Reduce concurrent clones in CI/CD
+
+Large repositories tend to be monorepos. This in turn typically means that these repositories get a lot of traffic not only from users, but from CI/CD.
+
+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.
+
+There's several other actions that can be explored to improve CI/CD performance with large repositories. Refer to the [Runner docs for more info](../../../ci/large_repositories/index.md).
diff --git a/doc/user/project/repository/mirror/index.md b/doc/user/project/repository/mirror/index.md
index e1017e78437..1645cf7244e 100644
--- a/doc/user/project/repository/mirror/index.md
+++ b/doc/user/project/repository/mirror/index.md
@@ -228,10 +228,19 @@ This error can occur when a firewall performs a `Deep SSH Inspection` on outgoin
If you receive this error after creating a new project using
[GitLab CI/CD for external repositories](../../../../ci/ci_cd_for_external_repos/):
-```plaintext
-"2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org':
-terminal prompts disabled\n": exit status 128."
-```
+- In Bitbucket Cloud:
+
+ ```plaintext
+ "2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org':
+ terminal prompts disabled\n": exit status 128."
+ ```
+
+- In Bitbucket Server (self-managed):
+
+ ```plaintext
+ "2:fetch remote: "fatal: could not read Username for 'https://lab.example.com':
+ terminal prompts disabled\n": exit status 128.
+ ```
Check if the repository owner is specified in the URL of your mirrored repository:
@@ -239,13 +248,21 @@ Check if the repository owner is specified in the URL of your mirrored repositor
1. On the left sidebar, select **Settings > Repository**.
1. Expand **Mirroring repositories**.
1. If no repository owner is specified, delete and add the URL again in this format,
- replacing `OWNER`, `ACCOUNTNAME`, and `REPONAME` with your values:
+ replacing `OWNER`, `ACCOUNTNAME`, `PATH_TO_REPO`, and `REPONAME` with your values:
- ```plaintext
- https://OWNER@bitbucket.org/ACCOUNTNAME/REPONAME.git
- ```
+ - In Bitbucket Cloud:
+
+ ```plaintext
+ https://OWNER@bitbucket.org/ACCOUNTNAME/REPONAME.git
+ ```
+
+ - In Bitbucket Server (self-managed):
+
+ ```plaintext
+ https://OWNER@lab.example.com/PATH_TO_REPO/REPONAME.git
+ ```
-When connecting to the repository for mirroring, Bitbucket requires the repository owner in the string.
+When connecting to the Cloud or self-managed Bitbucket repository for mirroring, the repository owner is required in the string.
### Pull mirror is missing LFS files
@@ -257,3 +274,31 @@ In some cases, pull mirroring does not transfer LFS files. This issue occurs whe
[Fixed](https://gitlab.com/gitlab-org/gitlab/-/issues/335123) in GitLab 14.0.6.
- You mirror an external repository using object storage.
An issue exists [to fix this problem](https://gitlab.com/gitlab-org/gitlab/-/issues/335495).
+
+### `The repository is being updated`, but neither fails nor succeeds visibly
+
+In rare cases, mirroring slots on Redis can become exhausted,
+possibly because Sidekiq workers are reaped due to out-of-memory (OoM) events.
+When this occurs, mirroring jobs start and complete quickly, but they neither
+fail nor succeed. They also do not leave a clear log. To check for this problem:
+
+1. Enter the [Rails console](../../../../administration/operations/rails_console.md)
+ and check Redis' mirroring capacity:
+
+ ```ruby
+ current = Gitlab::Redis::SharedState.with { |redis| redis.scard('MIRROR_PULL_CAPACITY') }.to_i
+ maximum = Gitlab::CurrentSettings.mirror_max_capacity
+ available = maximum - current
+ ```
+
+1. If the mirroring capacity is `0` or very low, you can drain all stuck jobs with:
+
+ ```ruby
+ Gitlab::Redis::SharedState.with { |redis| redis.smembers('MIRROR_PULL_CAPACITY') }.each do |pid|
+ Gitlab::Redis::SharedState.with { |redis| redis.srem('MIRROR_PULL_CAPACITY', pid) }
+ end
+ ```
+
+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).
diff --git a/doc/user/project/repository/mirror/pull.md b/doc/user/project/repository/mirror/pull.md
index 4c437d0f8c8..73103a9af3d 100644
--- a/doc/user/project/repository/mirror/pull.md
+++ b/doc/user/project/repository/mirror/pull.md
@@ -62,7 +62,8 @@ Prerequisite:
1. Enter the **Git repository URL**. Include the username
in the URL, if required: `https://MYUSERNAME@github.com/GROUPNAME/PROJECTNAME.git`
1. In **Mirror direction**, select **Pull**.
-1. In **Authentication method**, select your authentication method.
+1. In **Authentication method**, select your authentication method. To learn more, read
+ [Authentication methods for mirrors](index.md#authentication-methods-for-mirrors).
1. Select any of the options you need:
- [**Overwrite diverged branches**](#overwrite-diverged-branches)
- [**Trigger pipelines for mirror updates**](#trigger-pipelines-for-mirror-updates)
@@ -114,6 +115,21 @@ and mirroring attempts stop. This failure is visible in either the:
To resume project mirroring, [force an update](index.md#force-an-update).
+If many projects are affected by this problem, such as after a long network or
+server outage, you can use the [Rails console](../../../../administration/operations/rails_console.md)
+to identify and update all affected projects with this command:
+
+```ruby
+Project.find_each do |p|
+ if p.import_state && p.import_state.retry_count >= 14
+ puts "Resetting mirroring operation for #{p.full_path}"
+ p.import_state.reset_retry_count
+ p.import_state.set_next_execution_to_now(prioritized: true)
+ p.import_state.save!
+ end
+end
+```
+
## Related topics
- Configure [pull mirroring intervals](../../../../administration/instance_limits.md#pull-mirroring-interval)
diff --git a/doc/user/project/repository/mirror/push.md b/doc/user/project/repository/mirror/push.md
index ebc4430ac53..c00ebf415c9 100644
--- a/doc/user/project/repository/mirror/push.md
+++ b/doc/user/project/repository/mirror/push.md
@@ -38,8 +38,8 @@ To set up push mirroring for an existing project:
1. Expand **Mirroring repositories**.
1. Enter a repository URL.
1. In the **Mirror direction** dropdown list, select **Push**.
-1. Select an **Authentication method**.
- You can authenticate with either a password or an [SSH key](index.md#ssh-authentication).
+1. Select an **Authentication method**. To learn more, read
+ [Authentication methods for mirrors](index.md#authentication-methods-for-mirrors).
1. Select **Only mirror protected branches**, if necessary.
1. Select **Keep divergent refs**, if desired.
1. To save the configuration, select **Mirror repository**.
diff --git a/doc/user/project/repository/push_rules.md b/doc/user/project/repository/push_rules.md
index bb473a2830b..994cf78d98a 100644
--- a/doc/user/project/repository/push_rules.md
+++ b/doc/user/project/repository/push_rules.md
@@ -6,148 +6,136 @@ info: "To determine the technical writer assigned to the Stage/Group associated
# Push rules **(PREMIUM)**
-Gain additional control over what can and can't be pushed to your repository by using
-regular expressions to reject pushes based on commit contents, branch names or file details.
-
-GitLab already offers [protected branches](../protected_branches.md), but there are
-cases when you need some specific rules. Some common scenarios: preventing Git tag removal, or
-enforcing a special format for commit messages.
-
Push rules are [pre-receive Git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) you
-can enable in a user-friendly interface. They are defined either:
+can enable in a user-friendly interface. Push rules give you more control over what
+can and can't be pushed to your repository. While GitLab offers
+[protected branches](../protected_branches.md), you may need more specific rules, such as:
-- Globally if you are an administrator.
-- Per project, so you can have different rules applied to different
- projects depending on your needs.
+- Evaluating the contents of a commit.
+- Confirming commit messages match expected formats.
+- Enforcing branch name rules.
+- Evaluating the details of files.
+- Preventing Git tag removal.
-## Use cases
+GitLab uses [RE2 syntax](https://github.com/google/re2/wiki/Syntax) for regular expressions
+in push rules. You can test them at the [regex101 regex tester](https://regex101.com/).
-Every push rule could have its own use case, but let's consider some examples.
+For custom push rules use [server hooks](../../../administration/server_hooks.md).
-### Commit messages with a specific reference
+## Enable global push rules
-Let's assume you have the following requirements for your workflow:
+You can create push rules for all new projects to inherit, but they can be overridden
+at the project level or the [group level](../../group/index.md#group-push-rules).
-- every commit should reference a Jira issue, for example: `Refactored css. Fixes JIRA-123.`
-- users should not be able to remove Git tags with `git push`
+Prerequisite:
-Write a regular expression that requires the mention
-of a Jira issue in the commit message, like `JIRA\-\d+`.
+- You must be an administrator.
-Now when a user tries to push a commit with a message `Bugfix`, their push is
-declined. Only pushing commits with messages like `Bugfix according to JIRA-123`
-is accepted.
+To create global push rules:
-### Restrict branch names
+1. On the top bar, select **Menu > Admin**.
+1. On the left sidebar, select **Push Rules**.
+1. Expand **Push rules**.
+1. Set the rule you want.
+1. Select **Save push rules**.
-If your company has a strict policy for branch names, you may want the branches to start
-with a certain name. This approach enables different
-GitLab CI/CD jobs (such as `feature`, `hotfix`, `docker`, `android`) that rely on the
-branch name.
+## Override global push rules per project
-Your developers may not remember that policy, so they might push to
-various branches, and CI pipelines might not work as expected. By restricting the
-branch names globally in Push Rules, such mistakes are prevented.
-All branch names that don't match your push rule are rejected.
+The push rule of an individual project overrides the global push rule.
+To override global push rules for a specific project:
-Note that the name of your default branch is always allowed, regardless of the branch naming
-regular expression (regex) specified. GitLab is configured this way
-because merges typically have the default branch as their target.
-If you have other target branches, include them in your regex. (See [Enabling push rules](#enabling-push-rules)).
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > Repository**.
+1. Expand **Push rules**.
+1. Set the rule you want.
+1. Select **Save push rules**.
-The default branch also defaults to being a [protected branch](../protected_branches.md),
-which already limits users from pushing directly.
+## Verify users
-Some example regular expressions you can use in push rules:
+Use these rules to validate users who make commits.
-- `^JIRA-` Branches must start with `JIRA-`.
-- `-JIRA$` Branches must end with `-JIRA`.
-- `^[a-z0-9\\-]{4,15}$` Branches must be between `4` and `15` characters long,
- accepting only lowercase letters, numbers and dashes.
+- **Reject unverified users**: Users must have a [confirmed email address](../../../security/user_email_confirmation.md).
+- **Check whether the commit author is a GitLab user**: The commit author and committer must have an email address that's been verified by GitLab.
+- **Commit author's email**: Both the author's and committer's email addresses must match the regular expression.
+ To allow any email address, leave empty.
-#### Default restricted branch names
+## Validate commit messages
-> Introduced in GitLab 12.10.
+Use these rules for your commit messages.
-By default, GitLab restricts certain formats of branch names for security purposes.
-40-character hexadecimal names, similar to Git commit hashes, are prohibited.
+- **Require expression in commit messages**: Messages must match the
+ expression. To allow any commit message, leave empty.
+ Uses multiline mode, which can be disabled by using `(?-m)`.
-### Custom Push Rules **(PREMIUM SELF)**
+ For example, if every commit should reference a Jira issue
+ (like `Refactored css. Fixes JIRA-123.`), the regular expression would be
+ `JIRA\-\d+`.
+- **Reject expression in commit messages**: Commit messages must not match
+ the expression. To allow any commit message, leave empty.
+ Uses multiline mode, which can be disabled by using `(?-m)`.
-It's possible to create custom push rules rather than the push rules available in
-**Admin Area > Push Rules** by using more advanced server hooks.
+## Validate branch names
-See [server hooks](../../../administration/server_hooks.md) for more information.
+To validate your branch names, enter a regular expression for **Branch name**.
+To allow any branch name, leave empty. Your
+[default branch](branches/default.md) is always allowed.
-## Enabling push rules
+Examples:
-You can create push rules for all new projects to inherit, but they can be overridden
-at the project level or the [group level](../../group/index.md#group-push-rules).
+- Branches must start with `JIRA-`.
-To create global push rules:
+ ```plaintext
+ `^JIRA-`
+ ```
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Push Rules**.
+- Branches must end with `-JIRA`.
-To override global push rules in a project's settings:
+ ```plaintext
+ `-JIRA$`
+ ```
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > Repository**.
-1. Expand **Push rules**.
-1. Set the rule you want.
-1. Select **Save push rules**.
+- Branches must be between `4` and `15` characters long,
+ accepting only lowercase letters, numbers and dashes.
-The following options are available:
+ ```plaintext
+ `^[a-z0-9\\-]{4,15}$`
+ ```
-| Push rule | Description |
-|---------------------------------|-------------|
-| Removal of tags with `git push` | Forbid users to remove Git tags with `git push`. Tags can be deleted through the web UI. |
-| Check whether the commit author is a GitLab user | Restrict commits to existing GitLab users (checked against their emails). <sup>1</sup> |
-| Reject unverified users | GitLab rejects any commit that was not committed by the same user as the user who pushed it, or where the committer's email address is not [confirmed](../../../security/user_email_confirmation.md). |
-| Check whether commit is signed through GPG | Reject commit when it is not signed through GPG. Read [signing commits with GPG](gpg_signed_commits/index.md). |
-| Prevent pushing secret files | GitLab rejects any files that are likely to contain secrets. See the [forbidden file names](#prevent-pushing-secrets-to-the-repository). |
-| Require expression in commit messages | Only commit messages that match this regular expression are allowed to be pushed. <sup>2</sup> Leave empty to allow any commit message. Uses multiline mode, which can be disabled using `(?-m)`. |
-| Reject expression in commit messages | Only commit messages that do not match this regular expression are allowed to be pushed. <sup>2</sup> Leave empty to allow any commit message. Uses multiline mode, which can be disabled using `(?-m)`. |
-| Restrict by branch name | Only branch names that match this regular expression are allowed to be pushed. <sup>2</sup> Leave empty to allow all branch names. |
-| Restrict by commit author's email | Only commit author's email that match this regular expression are allowed to be pushed. <sup>1</sup> <sup>2</sup> Leave empty to allow any email. |
-| Prohibited file names | Any committed filenames that match this regular expression and do not already exist in the repository are not allowed to be pushed. <sup>2</sup> Leave empty to allow any filenames. See [common examples](#prohibited-file-names). |
-| Maximum file size | Pushes that contain added or updated files that exceed this file size (in MB) are rejected. Set to 0 to allow files of any size. Files tracked by Git LFS are exempted. |
+NOTE:
+In GitLab 12.10 and later, certain formats of branch names are restricted by
+default for security purposes. 40-character hexadecimal names, similar to Git
+commit hashes, are prohibited.
-1. Checks both the commit author and committer.
-1. GitLab uses [RE2 syntax](https://github.com/google/re2/wiki/Syntax) for regular expressions in push rules, and you can test them at the [regex101 regex tester](https://regex101.com/).
+## Prevent unintended consequences
-### Caveat to "Reject unsigned commits" push rule
+Use these rules to prevent unintended consequences.
-This push rule ignores commits that are authenticated and created by GitLab
-(either through the UI or API). When the **Reject unsigned commits** push rule is
-enabled, unsigned commits may still show up in the commit history if a commit was
-created **in** GitLab itself. As expected, commits created outside GitLab and
-pushed to the repository are rejected. For more information about how GitLab
-plans to fix this issue, read [issue #19185](https://gitlab.com/gitlab-org/gitlab/-/issues/19185).
+- **Reject unsigned commits**: Commit must be signed through [GPG](gpg_signed_commits/index.md). This rule
+ can block some legitimate commits [created in the Web IDE](#reject-unsigned-commits-push-rule-disables-web-ide),
+ and allow [unsigned commits created in the GitLab UI](#unsigned-commits-created-in-the-gitlab-ui).
+- **Do not allow users to remove Git tags with `git push`**: Users cannot use `git push` to remove Git tags.
+ Users can still delete tags in the UI.
-#### "Reject unsigned commits" push rule disables Web IDE
+## Validate files
-In 13.10, if a project has the "Reject unsigned commits" push rule, the user is not allowed to
-commit through GitLab Web IDE.
+Use these rules to validate files contained in the commit.
-To allow committing through the Web IDE on a project with this push rule, a GitLab administrator
-must disable the feature flag `reject_unsigned_commits_by_gitlab`. This can be done through a
-[rails console](../../../administration/operations/rails_console.md) and running:
+- **Prevent pushing secret files**: Files must not contain [secrets](#prevent-pushing-secrets-to-the-repository).
+- **Prohibited file names**: Files that do not exist in the repository
+ must not match the regular expression. To allow all file names, leave empty. See [common examples](#prohibit-files-by-name).
+- **Maximum file size**: Added or updated files must not exceed this
+ file size (in MB). To allow files of any size, set to `0`. Files tracked by Git LFS are exempted.
-```ruby
-Feature.disable(:reject_unsigned_commits_by_gitlab)
-```
-
-## Prevent pushing secrets to the repository
+### Prevent pushing secrets to the repository
> Moved to GitLab Premium in 13.9.
-Secrets, such as credential files and SSH private keys, should never be committed to a version control
+Never commit secrets, such as credential files and SSH private keys, to a version control
system. In GitLab, you can use a predefined list of files to block those files from a
-repository. Any merge request containing a file matching the list is blocked from being merged.
-Files already committed to the repository are not restricted by this push rule.
+repository. Merge requests that contain a file that matches the list are blocked.
+This push rule does not restrict files already committed to the repository.
-Files blocked by this rule are listed below. For a complete list of criteria, see
+Files blocked by this rule are listed below. For a complete list of criteria, refer to
[`files_denylist.yml`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/gitlab/checks/files_denylist.yml).
- AWS CLI credential blobs:
@@ -211,78 +199,85 @@ Files blocked by this rule are listed below. For a complete list of criteria, se
- `*.history`
- `*_history`
-### Prevent pushing secrets to all projects
+### Prohibit files by name
-To set a global push rule to prevent pushing secrets to all projects:
+> Moved to GitLab Premium in 13.9.
-1. On the top bar, select **Menu > Admin**.
-1. On the left sidebar, select **Push Rules**.
-1. Expand **Push rules**.
-1. Select **Prevent pushing secret files**.
-1. Select **Save push rules**.
+In Git, filenames include both the file's name, and all directories preceding the name.
+When you `git push`, each filename in the push is compared to the regular expression
+in **Prohibited file names**.
-### Prevent pushing secrets to a project
+The regular expression in your **Prohibited file names** push rule can contain multiple,
+independent matches to exclude. You can match file names broadly to any location in
+your repository, or restrict only in certain locations. Filename matches can also
+be partial, and exclude file types by extension.
-The push rule of a project overrides the global push rule.
+These examples use regex (regular expressions) string boundary characters to match
+the beginning of a string (`^`), and its end (`$`). They also include instances
+where either the directory path or the filename can include `.` or `/`. Both of
+these special regex characters must be escaped with a backslash `\\` if you want
+to use them as normal characters in a match condition.
-To prevent pushing secrets to a project:
+- **Prevent pushing `.exe` files to any location in the repository** - This regex
+ matches any filename that contains `.exe` at the end:
-1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings > Repository**.
-1. Expand **Push rules**.
-1. Select **Prevent pushing secret files**.
-1. Select **Save push rules**.
+ ```plaintext
+ \.exe$
+ ```
-## Prohibited file names
+- **Prevent pushing a specific configuration file in the repository root**
-> Moved to GitLab Premium in 13.9.
+ ```plaintext
+ ^config\.yml$
+ ```
-Each filename contained in a Git push is compared to the regular expression in this field. Filenames in Git consist of both the file's name and any directory that may precede it. A singular regular expression can contain multiple independent matches used as exclusions. File names can be broadly matched to any location in the repository, or restricted to specific locations. Filenames can also be partial matches used to exclude file types by extension.
+- **Prevent pushing a specific configuration file in a known directory**
-The following examples make use of regex string boundary characters which match the beginning of a string (`^`), and the end (`$`). They also include instances where either the directory path or the filename can include `.` or `/`. Both of these special regex characters have to be escaped with a backslash `\\` to be used as normal characters in a match condition.
+ ```plaintext
+ ^directory-name\/config\.yml$
+ ```
-Example: prevent pushing any `.exe` files to any location in the repository. This uses a partial match, which matches any filename that contains `.exe` at the end:
+- **Prevent pushing a specific file to any location in the repository** - This example tests
+ for any file named `install.exe`. The parenthesized expression `(^|\/)` matches either
+ a file following a directory separator, or a file in the root directory of the repository:
-```plaintext
-\.exe$
-```
+ ```plaintext
+ (^|\/)install\.exe$
+ ```
-Example: prevent a specific configuration file in the repository root from being pushed:
+- **Combine all previous expressions into one expression** - The preceding expressions rely
+ on the end-of-string character `$`. We can move that part of each expression to the
+ end of the grouped collection of match conditions, where it is appended to all matches:
-```plaintext
-^config\.yml$
-```
+ ```plaintext
+ (\.exe|^config\.yml|^directory-name\/config\.yml|(^|\/)install\.exe)$
+ ```
-Example: prevent a specific configuration file in a known directory from being pushed:
+## Related topics
-```plaintext
-^directory-name\/config\.yml$
-```
+- [Server hooks](../../../administration/server_hooks.md), to create complex custom push rules
+- [Signing commits with GPG](gpg_signed_commits/index.md)
+- [Protected branches](../protected_branches.md)
-Example: prevent the specific file named `install.exe` from being pushed to any
-location in the repository. The parenthesized expression `(^|\/)` matches either
-a file following a directory separator or a file in the root directory of the repository:
+## Troubleshooting
-```plaintext
-(^|\/)install\.exe$
-```
+### Reject unsigned commits push rule disables Web IDE
-Example: combining all of the above in a single expression. The preceding expressions rely
-on the end-of-string character `$`. We can move that part of each expression to the
-end of the grouped collection of match conditions where it is appended to all matches:
+In GitLab 13.10, if a project has the **Reject unsigned commits** push rule, the user cannot
+create commits through the GitLab Web IDE.
-```plaintext
-(\.exe|^config\.yml|^directory-name\/config\.yml|(^|\/)install\.exe)$
-```
+To allow committing through the Web IDE on a project with this push rule, a GitLab administrator
+must disable the feature flag `reject_unsigned_commits_by_gitlab`. [with a flag](../../../administration/feature_flags.md)
-<!-- ## Troubleshooting
+```ruby
+Feature.disable(:reject_unsigned_commits_by_gitlab)
+```
-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.
+### Unsigned commits created in the GitLab UI
-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. -->
+The **Reject unsigned commits** push rule ignores commits that are authenticated
+and created by GitLab (either through the UI or API). When this push rule is
+enabled, unsigned commits may still appear in the commit history if a commit was
+created in GitLab itself. As expected, commits created outside GitLab and
+pushed to the repository are rejected. For more information about this issue,
+read [issue #19185](https://gitlab.com/gitlab-org/gitlab/-/issues/19185).
diff --git a/doc/user/project/repository/web_editor.md b/doc/user/project/repository/web_editor.md
index 6eed1717507..747bd690911 100644
--- a/doc/user/project/repository/web_editor.md
+++ b/doc/user/project/repository/web_editor.md
@@ -159,7 +159,7 @@ repository project, GitLab performs these actions:
- Creates a default branch.
- Commits a blank `README.md` file to it.
- Creates and redirects you to a new branch based on the issue title.
-- _If your project is [configured with a deployment service](../integrations/overview.md) like Kubernetes,_
+- _If your project is [configured with a deployment service](../integrations/index.md) like Kubernetes,_
GitLab prompts you to set up [auto deploy](../../../topics/autodevops/stages.md#auto-deploy)
by helping you create a `.gitlab-ci.yml` file.
diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md
index 30261ed5082..9b37e147a52 100644
--- a/doc/user/project/settings/import_export.md
+++ b/doc/user/project/settings/import_export.md
@@ -41,7 +41,7 @@ Prerequisites:
To export a project and its data, follow these steps:
1. On the top bar, select **Menu > Projects** and find your project.
-1. On the left sidebar, select **Settings**.
+1. On the left sidebar, select **Settings > General**.
1. Expand **Advanced**.
1. Select **Export project**.
1. After the export is generated, you should receive an email with a link to download the file.
@@ -82,6 +82,7 @@ The following items are **not** exported:
- Merge Request Approvers and [the number of required approvals](https://gitlab.com/gitlab-org/gitlab/-/issues/221088)
- Repository size limits
- Deploy keys allowed to push to protected branches
+- Secure Files
These content rules also apply to creating projects from templates on the
[group](../../group/custom_project_templates.md)
diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md
index 31cda756a78..1e63472763d 100644
--- a/doc/user/project/settings/index.md
+++ b/doc/user/project/settings/index.md
@@ -88,11 +88,11 @@ read-only view to discourage this behavior.
Compliance framework pipelines allow group owners to define
a compliance pipeline in a separate repository that gets
-executed in place of the local project's `gitlab-ci.yml` file. As part of this pipeline, an
-`include` statement can reference the local project's `gitlab-ci.yml` file. This way, the compliance
+executed in place of the local project's `.gitlab-ci.yml` file. As part of this pipeline, an
+`include` statement can reference the local project's `.gitlab-ci.yml` file. This way, the compliance
pipeline jobs can run alongside the project-specific jobs any time the pipeline runs.
Jobs and variables defined in the compliance
-pipeline can't be changed by variables in the local project's `gitlab-ci.yml` file.
+pipeline can't be changed by variables in the local project's `.gitlab-ci.yml` file.
When you set up the compliance framework, use the **Compliance pipeline configuration** box to link
the compliance framework to specific CI/CD configuration. Use the
@@ -314,7 +314,7 @@ related to the project by selecting the **Disable email notifications** checkbox
Set up your project's merge request settings:
-- Set up the merge request method (merge commit, [fast-forward merge](../merge_requests/fast_forward_merge.md)).
+- 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).
- Enable [merge request approvals](../merge_requests/approvals/index.md).
- Enable [status checks](../merge_requests/status_checks.md).
@@ -409,10 +409,13 @@ NOTE:
Only project owners and administrators have the [permissions](../../permissions.md#project-members-permissions)
to transfer a project.
-You can transfer an existing project into a [group](../../group/index.md).
+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.
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.
@@ -423,15 +426,15 @@ Prerequisites:
To transfer a project:
-1. Navigate to your project's **Settings > General**.
-1. Under **Advanced**, click **Expand**.
-1. Under "Transfer project", choose the namespace you want to transfer the
- project to.
-1. Confirm the transfer by typing the project's path as instructed.
+1. On the top bar, select **Menu > Projects** and find your project.
+1. On the left sidebar, select **Settings > General**.
+1. Expand **Advanced**.
+1. Under **Transfer project**, choose the namespace to transfer the project to.
+1. Select **Transfer project**.
+1. Enter the project's name and select **Confirm**.
-Once done, you are redirected to the new project's namespace. At this point,
-read what happens with the
-[redirects from the old project to the new one](../repository/index.md#what-happens-when-a-repository-path-changes).
+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).
NOTE:
GitLab administrators can use the [administration interface](../../admin_area/index.md#administering-projects)
@@ -520,7 +523,8 @@ If you want to use the fork for yourself and don't need to send
you can safely remove the fork relationship.
WARNING:
-Once removed, the fork relationship cannot be restored. You can't send merge requests to the source, and if anyone has forked your project, their fork also loses the relationship.
+Once removed, you can't send merge requests to the source, and 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:
@@ -556,10 +560,6 @@ Automatically [create](../../../operations/incident_management/incidents.md#crea
Configure Error Tracking to discover and view [Sentry errors within GitLab](../../../operations/error_tracking.md).
-### Jaeger tracing
-
-Add the URL of a Jaeger server to allow your users to [easily access the Jaeger UI from within GitLab](../../../operations/tracing.md).
-
### Status Page **(ULTIMATE)**
[Add Storage credentials](../../../operations/incident_management/status_page.md#sync-incidents-to-the-status-page)
diff --git a/doc/user/project/settings/project_access_tokens.md b/doc/user/project/settings/project_access_tokens.md
index b66913b7223..e332b74f908 100644
--- a/doc/user/project/settings/project_access_tokens.md
+++ b/doc/user/project/settings/project_access_tokens.md
@@ -25,7 +25,7 @@ Use a project access token to authenticate:
Project access tokens are similar to [group access tokens](../../group/settings/group_access_tokens.md)
and [personal access tokens](../../profile/personal_access_tokens.md).
-In self-managed instances, project access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) as personal access tokens if the limit is set.
+In self-managed instances, project access tokens are subject to the same [maximum lifetime limits](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) as personal access tokens if the limit is set.
You can use project access tokens:
@@ -48,7 +48,7 @@ To create a project access token:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Settings > Access Tokens**.
1. Enter a name. The token name is visible to any user with permissions to view the project.
-1. Optional. Enter an expiry date for the token. The token expires on that date at midnight UTC. An instance-wide [maximum lifetime](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-personal-access-tokens) setting can limit the maximum allowable lifetime in self-managed instances.
+1. Optional. Enter an expiry date for the token. The token expires on that date at midnight UTC. An instance-wide [maximum lifetime](../../admin_area/settings/account_and_limit_settings.md#limit-the-lifetime-of-access-tokens) setting can limit the maximum allowable lifetime in self-managed instances.
1. Select a role for the token.
1. Select the [desired scopes](#scopes-for-a-project-access-token).
diff --git a/doc/user/project/static_site_editor/img/edit_this_page_button_v12_10.png b/doc/user/project/static_site_editor/img/edit_this_page_button_v12_10.png
deleted file mode 100644
index 380d96f1db9..00000000000
--- a/doc/user/project/static_site_editor/img/edit_this_page_button_v12_10.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/static_site_editor/img/front_matter_ui_v13_4.png b/doc/user/project/static_site_editor/img/front_matter_ui_v13_4.png
deleted file mode 100644
index 89864858ed3..00000000000
--- a/doc/user/project/static_site_editor/img/front_matter_ui_v13_4.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/static_site_editor/img/wysiwyg_editor_v13_3.png b/doc/user/project/static_site_editor/img/wysiwyg_editor_v13_3.png
deleted file mode 100644
index 52776c6a290..00000000000
--- a/doc/user/project/static_site_editor/img/wysiwyg_editor_v13_3.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/static_site_editor/index.md b/doc/user/project/static_site_editor/index.md
index 220623d0372..343482757f5 100644
--- a/doc/user/project/static_site_editor/index.md
+++ b/doc/user/project/static_site_editor/index.md
@@ -2,35 +2,15 @@
stage: Create
group: Editor
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, how-to
-description: "The static site editor enables users to edit content on static websites without prior knowledge of the underlying templating language, site architecture or Git commands."
+remove_date: '2022-08-03'
+redirect_to: '../web_ide/index.md'
---
-# Static Site Editor **(FREE)**
+# Static Site Editor (removed) **(FREE)**
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/28758) in GitLab 12.10.
-> - WYSIWYG editor [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214559) in GitLab 13.0.
-> - Non-Markdown content blocks not editable on the WYSIWYG mode [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216836) in GitLab 13.3.
-> - Formatting Markdown [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49052) in GitLab 13.7.
-> - [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77246) in GitLab 14.7.
-
-WARNING:
-This feature is in its end-of-life process. It is
-[deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77246)
-in GitLab 14.7, and is planned for
-[removal](https://gitlab.com/groups/gitlab-org/-/epics/7351) in GitLab 14.10.
-Users should instead use the [Web Editor](../repository/web_editor.md) or [Web IDE](../web_ide/index.md). [Removal instructions](#remove-the-static-site-editor) for existing projects are included on this page.
-
-Static Site Editor (SSE) enables users to edit content on static websites without
-prior knowledge of the underlying templating language, site architecture, or
-Git commands. A contributor to your project can quickly edit a Markdown page
-and submit the changes for review. For example:
-
-- Non-technical collaborators can edit a page directly from the browser.
- They don't need to know Git and the details of your project to contribute.
-- Recently hired team members can quickly edit content.
-- Temporary collaborators can jump from project to project and quickly edit pages instead
- of having to clone or fork every single project they need to submit changes to.
+This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77246) in GitLab 14.7
+and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/352505) in 15.0.
+Use the [Web Editor](../repository/web_editor.md) or [Web IDE](../web_ide/index.md) instead.
## Remove the Static Site Editor
@@ -68,235 +48,3 @@ from an existing project, remove links that point back to the editor:
`/helpers/custom_helpers.rb` entirely.
1. Clean up any extraneous configuration files.
1. Commit and push your changes.
-
-## Requirements
-
-- In order use the Static Site Editor feature, your project needs to be
- pre-configured with the [Static Site Editor Middleman template](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman).
-- You need to be logged into GitLab and be a member of the
- project (with Developer or higher permission levels).
-
-## How it works
-
-The Static Site Editor is in an early stage of development and only supports
-Middleman sites for now. You have to use a specific site template to start
-using it. The project template is configured to deploy a [Middleman](https://middlemanapp.com/)
-static website with [GitLab Pages](../pages/index.md).
-
-Once your website is up and running, an **Edit this page** button displays on
-the bottom-left corner of its pages:
-
-![Edit this page button](img/edit_this_page_button_v12_10.png)
-
-When you click it, GitLab opens up an editor window from which the content
-can be directly edited. When you're ready, you can submit your changes in a
-click of a button:
-
-![Static Site Editor](img/wysiwyg_editor_v13_3.png)
-
-When an editor submits their changes, these are the following actions that GitLab
-performs automatically in the background:
-
-1. Creates a new branch.
-1. Commits their changes.
- 1. Fixes formatting according to the [Handbook Markdown Style Guide](https://about.gitlab.com/handbook/markdown-guide/)
- style guide and add them through another commit.
-1. Opens a merge request against the default branch.
-
-The editor can then navigate to the merge request to assign it to a colleague for review.
-
-## Set up your project
-
-First, set up the project. Once done, you can use the Static Site Editor to
-[edit your content](#edit-content).
-
-1. To get started, create a new project from the [Static Site Editor - Middleman](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman)
- template. You can either [fork it](../repository/forking_workflow.md#creating-a-fork)
- or [create a new project from a template](../working_with_projects.md#create-a-project-from-a-built-in-template).
-1. Edit the [`data/config.yml`](#static-site-generator-configuration) configuration file
- to replace `<username>` and `<project-name>` with the proper values for
- your project's path.
-1. Optional. Edit the [`.gitlab/static-site-editor.yml`](#static-site-editor-configuration-file) file
- to customize the behavior of the Static Site Editor.
-1. When you submit your changes, GitLab triggers a CI/CD pipeline to deploy your project with GitLab Pages.
-1. When the pipeline finishes, from your project's left-side menu, go to **Settings > Pages** to find the URL of your new website.
-1. Visit your website and look at the bottom-left corner of the screen to see the new **Edit this page** button.
-
-Anyone satisfying the [requirements](#requirements) can edit the
-content of the pages without prior knowledge of Git or of your site's
-codebase.
-
-## Edit content
-
-> - Support for modifying the default merge request title and description [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216861) in GitLab 13.5.
-> - Support for selecting a merge request template [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/263252) in GitLab 13.6.
-
-After setting up your project, you can start editing content directly from the Static Site Editor.
-
-To edit a file:
-
-1. Visit the page you want to edit.
-1. Select **Edit this page**.
-1. The file is opened in the Static Site Editor in **WYSIWYG** mode. If you
- wish to edit the raw Markdown instead, you can toggle the **Markdown** mode
- in the bottom-right corner.
-1. When you're done, click **Submit changes...**.
-1. Optional. Adjust the default title and description of the merge request, to submit
- with your changes. Alternatively, select a [merge request template](../../../user/project/description_templates.md#create-a-merge-request-template)
- from the dropdown menu and edit it accordingly.
-1. Select **Submit changes**.
-1. A new merge request is automatically created and you can assign a colleague for review.
-
-### Text
-
-> Support for `*.md.erb` files [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223171) in GitLab 13.2.
-
-The Static Site Editors supports Markdown files (`.md`, `.md.erb`) for editing text.
-
-### Images
-
-> - Support for adding images through the WYSIWYG editor [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216640) in GitLab 13.1.
-> - Support for uploading images via the WYSIWYG editor [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218529) in GitLab 13.6.
-
-#### Upload an image
-
-You can upload image files via the WYSIWYG editor directly to the repository to default upload directory
-`source/images`. To do so:
-
-1. Select the image icon (**{doc-image}**).
-1. Select the **Upload file** tab.
-1. To select a file from your computer, select **Choose file**.
-1. Optional. Add a description to the image for SEO and accessibility ([ALT text](https://moz.com/learn/seo/alt-text)).
-1. Select **Insert image**.
-
-The selected file can be any supported image file (`.png`, `.jpg`, `.jpeg`, `.gif`). The editor renders
-thumbnail previews so you can verify the correct image is included and there aren't any references to
-missing images.
-
-#### Link to an image
-
-You can also link to an image if you'd like:
-
-1. Select the image icon (**{doc-image}**).
-1. Select the **Link to an image** tab.
-1. Add the link to the image into the **Image URL** field (use the full path; relative paths are not supported yet).
-1. Optional. Add a description to the image for SEO and accessibility ([ALT text](https://moz.com/learn/seo/alt-text)).
-1. Select **Insert image**.
-
-The link can reference images already hosted in your project, an asset hosted
-externally on a content delivery network, or any other external URL. The editor renders thumbnail previews
-so you can verify the correct image is included and there aren't any references to missing images.
-
-### Videos
-
-> - Support for embedding YouTube videos through the WYSIWYG editor [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216642) in GitLab 13.5.
-
-You can embed YouTube videos on the WYSIWYG mode by clicking the video icon (**{live-preview}**).
-The following URL/ID formats are supported:
-
-- **YouTube watch URLs**: `https://www.youtube.com/watch?v=0t1DgySidms`
-- **YouTube embed URLs**: `https://www.youtube.com/embed/0t1DgySidms`
-- **YouTube video IDs**: `0t1DgySidms`
-
-### Front matter
-
-> - Markdown front matter hidden on the WYSIWYG editor [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/216834) in GitLab 13.1.
-> - Ability to edit page front matter [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/235921) in GitLab 13.5.
-
-Front matter is a flexible and convenient way to define page-specific variables in data files
-intended to be parsed by a static site generator. Use it to set a page's
-title, layout template, or author. You can also pass any kind of metadata to the
-generator as the page renders out to HTML. Included at the very top of each data file, the
-front matter is often formatted as YAML or JSON, and requires consistent and accurate syntax.
-
-To edit the front matter from the Static Site Editor you can use the GitLab regular file editor,
-the Web IDE, or update the data directly from the WYSIWYG editor:
-
-1. Click the **Page settings** button on the bottom-right to reveal a web form with the data you
- have on the page's front matter. The form is populated with the current data:
-
- ![Editing page front matter in the Static Site Editor](img/front_matter_ui_v13_4.png)
-
-1. Update the values as you wish and close the panel.
-1. When you're done, click **Submit changes...**.
-1. Describe your changes (add a commit message).
-1. Click **Submit changes**.
-1. Click **View merge request** to view it.
-
-Adding new attributes to the page's front matter from the form is not supported.
-To add new attributes:
-
-- Edit the file locally
-- Edit the file with the GitLab regular file editor.
-- Edit the file with the Web IDE.
-
-After adding an attribute, the form loads the new fields.
-
-## Configuration files
-
-You can customize the behavior of a project which uses the Static Site Editor with
-the following configuration files:
-
-- The [`.gitlab/static-site-editor.yml`](#static-site-editor-configuration-file), which customizes the
- behavior of the Static Site Editor.
-- [Static Site Generator configuration files](#static-site-generator-configuration),
- such as `data/config.yml`, which configures the Static Site Generator itself.
- It also controls the **Edit this page** button when the site is generated.
-
-### Static Site Editor configuration file
-
-> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/4267) in GitLab 13.6.
-
-The `.gitlab/static-site-editor.yml` configuration file contains entries you can
-use to customize behavior of the Static Site Editor (SSE). If the file does not exist,
-default values which support a default Middleman project configuration are used.
-The [Static Site Editor - Middleman](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman) project template generates a file pre-populated with these defaults.
-
-To customize the behavior of the SSE, edit `.gitlab/static-site-editor.yml`'s entries,
-according to your project's needs. Make sure to respect YAML syntax.
-
-After the table, see an [example of the SSE configuration file](#gitlabstatic-site-editoryml-example).
-
-| Entry | GitLab version | Type | Default value | Description |
-|---|---|---|---|---|
-| `image_upload_path` | [13.6](https://gitlab.com/gitlab-org/gitlab/-/issues/216641) | String | `source/images` | Directory for images uploaded from the WYSIWYG editor. |
-
-#### `.gitlab/static-site-editor.yml` example
-
-```yaml
-image_upload_path: 'source/images' # Relative path to the project's root. Don't include leading or trailing slashes.
-```
-
-### Static Site Generator configuration
-
-The Static Site Editor uses Middleman's configuration file, `data/config.yml`
-to customize the behavior of the project itself. This file also controls the
-**Edit this page** button, rendered through the file
-[`layout.erb`](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman/-/blob/master/source/layouts/layout.erb).
-
-To [configure the project template to your own project](#set-up-your-project),
-you must replace the `<username>` and `<project-name>` in the `data/config.yml`
-file with the proper values for your project's path.
-
-[Other Static Site Generators](#using-other-static-site-generators) used with
-the Static Site Editor may use different configuration files or approaches.
-
-## Using Other Static Site Generators
-
-Although Middleman is the only Static Site Generator officially supported
-by the Static Site Editor, you can configure your project's build and deployment
-to use a different Static Site Generator. In this case, use the Middleman layout
-as an example, and follow a similar approach to properly render an **Edit this page**
-button in your Static Site Generator's layout.
-
-## Upgrade from GitLab 12.10 to 13.0
-
-In GitLab 13.0, we [introduced breaking changes](https://gitlab.com/gitlab-org/gitlab/-/issues/213282)
-to the URL structure of the Static Site Editor. Follow the instructions in this
-[snippet](https://gitlab.com/gitlab-org/project-templates/static-site-editor-middleman/snippets/1976539)
-to update your project with the 13.0 changes.
-
-## Limitations
-
-- The Static Site Editor still cannot be quickly added to existing Middleman sites.
- Follow this [epic](https://gitlab.com/groups/gitlab-org/-/epics/2784) for updates.
diff --git a/doc/user/project/time_tracking.md b/doc/user/project/time_tracking.md
index 5f747d99ce7..0891e02f3f7 100644
--- a/doc/user/project/time_tracking.md
+++ b/doc/user/project/time_tracking.md
@@ -114,6 +114,18 @@ so if you remove more time than already entered, GitLab ignores the subtraction.
To remove all the time spent at once, use the `/remove_time_spent` [quick action](quick_actions.md).
+### Delete time spent
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/356796) in GitLab 15.0.
+
+A timelog is a single entry of time spent, either positive or negative.
+
+Prerequisites:
+
+- You must be the author of the timelog or have at least the Maintainer role for the project.
+
+You can [delete timelogs](../../api/graphql/reference/index.md#mutationtimelogdelete) using the GraphQL API.
+
## View a time tracking report
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/271409) in GitLab 13.12.
diff --git a/doc/user/project/web_ide/img/command_palette_v13_6.png b/doc/user/project/web_ide/img/command_palette_v13_6.png
deleted file mode 100644
index 54580a79ebd..00000000000
--- a/doc/user/project/web_ide/img/command_palette_v13_6.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/project/web_ide/index.md b/doc/user/project/web_ide/index.md
index 8f9486633d5..9db30ee2ab6 100644
--- a/doc/user/project/web_ide/index.md
+++ b/doc/user/project/web_ide/index.md
@@ -23,13 +23,8 @@ and from merge requests:
1. Select **Open in Web IDE** from the list to display it as the editing option.
1. Select **Open in Web IDE** to open the editor.
- *When viewing a merge request* -
- 1. Go to your merge request, and select the **Overview** tab.
- 1. Scroll to the widgets section, after the merge request description.
- 1. Select **Open in Web IDE** if it is visible.
- 1. If **Open in Web IDE** is not visible:
- 1. Select the **(angle-down)** next to **Open in Gitpod**.
- 1. Select **Open in Web IDE** from the list to display it as the editing option.
- 1. Select **Open in Web IDE** to open the editor.
+ 1. Go to your merge request.
+ 1. In the upper right corner, select **Code**, then select **Open in Gitpod**.
## File finder
@@ -52,7 +47,8 @@ Some commands have a keyboard shortcut assigned to them. The command palette
displays this shortcut next to each command. You can use this shortcut to invoke
the command without having to select it in the command palette.
-![Command palette](img/command_palette_v13_6.png)
+For a full list of keyboard shortcuts in the Web IDE, refer to the
+[Keyboard shortcuts](../../shortcuts.md#web-ide) list.
## Syntax highlighting
diff --git a/doc/user/project/wiki/group.md b/doc/user/project/wiki/group.md
index 37f2ef8fc6a..dc448fed970 100644
--- a/doc/user/project/wiki/group.md
+++ b/doc/user/project/wiki/group.md
@@ -1,8 +1,7 @@
---
stage: Create
group: Editor
-info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
-type: reference, how-to
+info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
---
# Group wikis **(PREMIUM)**
@@ -61,6 +60,24 @@ available, you have to:
All files in the wiki are available in this Git repository.
+## Configure group wiki visibility
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/208412) in GitLab 15.0.
+
+Wikis are enabled by default in GitLab. Group [administrators](../../permissions.md)
+can enable or disable a group wiki through the group settings.
+
+To open group settings:
+
+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. Scroll to **Wiki** and select one of these options:
+ - **Enabled**: Everyone who can access the group can access the wiki.
+ - **Private**: Only group members can access the wiki.
+ - **Disabled**: The wiki isn't accessible, and cannot be downloaded.
+1. Select **Save changes**.
+
## Related topics
- [Wiki settings for administrators](../../../administration/wikis/index.md)
diff --git a/doc/user/project/wiki/index.md b/doc/user/project/wiki/index.md
index 7d155ea9b06..fe6c7ae62b8 100644
--- a/doc/user/project/wiki/index.md
+++ b/doc/user/project/wiki/index.md
@@ -275,7 +275,7 @@ can enable or disable a project wiki by following the instructions in
Administrators for self-managed GitLab installs can
[configure additional wiki settings](../../../administration/wikis/index.md).
-You can't disable [group wikis](group.md) from the GitLab user interface.
+You can disable group wikis from the [group settings](group.md#configure-group-wiki-visibility)
## Link an external wiki
diff --git a/doc/user/project/working_with_projects.md b/doc/user/project/working_with_projects.md
index 03530b59e9b..bfc83aa22f5 100644
--- a/doc/user/project/working_with_projects.md
+++ b/doc/user/project/working_with_projects.md
@@ -275,6 +275,18 @@ To add a star to a project:
- Number of open merge requests.
- Number of open issues.
+## View personal projects
+
+Personal projects are projects created under your personal namespace.
+
+For example, if you create an account with the username `alex`, and create a project
+called `my-project` under your username, the project is created at `https://gitlab.example.com/alex/my-project`.
+
+To view your personal projects:
+
+1. On the top bar, select **Menu > Projects > Your Projects**.
+1. Under **Your projects**, select **Personal**.
+
## Delete a project
After you delete a project, projects in personal namespaces are deleted immediately. To delay deletion of projects in a group
diff --git a/doc/user/report_abuse.md b/doc/user/report_abuse.md
index c0fb29b435a..93d9a1e773e 100644
--- a/doc/user/report_abuse.md
+++ b/doc/user/report_abuse.md
@@ -53,10 +53,8 @@ A URL to the reported user's comment is pre-filled in the abuse report's
## Report abuse from a merge request
-1. On the merge request, in the top right corner, either:
- - Select **Report abuse**. This option is displayed if you do not have permission to close the merge request.
- - Next to **Mark as draft**, select the down arrow (**{chevron-down}**) and then select **Report abuse**.
- This option is displayed if you have permission to close the merge request.
+1. On the merge request, in the top right corner, select the vertical ellipsis (**{ellipsis_v}**).
+1. Select **Report abuse**.
1. Submit an abuse report.
1. Select **Send report**.
diff --git a/doc/user/reserved_names.md b/doc/user/reserved_names.md
index 45c5f53e33c..3cf379243e3 100644
--- a/doc/user/reserved_names.md
+++ b/doc/user/reserved_names.md
@@ -63,7 +63,6 @@ Currently, the following names are reserved as top level groups:
- `503.html`
- `admin`
- `api`
-- `apple-touch-icon-precomposed.png`
- `apple-touch-icon.png`
- `assets`
- `dashboard`
diff --git a/doc/user/search/global_search/advanced_search_syntax.md b/doc/user/search/global_search/advanced_search_syntax.md
index 962aa00eea8..3aa016f0bff 100644
--- a/doc/user/search/global_search/advanced_search_syntax.md
+++ b/doc/user/search/global_search/advanced_search_syntax.md
@@ -1,49 +1,51 @@
---
stage: Enablement
group: Global Search
-info: "To 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
---
# Advanced Search syntax **(PREMIUM)**
With [Advanced Search](../advanced_search.md), you can perform a thorough
-search through your entire GitLab instance.
+search of your entire GitLab instance.
The Advanced Search syntax supports fuzzy or exact search queries with prefixes,
-boolean operators, and much more. Advanced Search uses
+boolean operators, and more. Advanced Search uses
[Elasticsearch's syntax](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html#simple-query-string-syntax).
WARNING:
-Advanced Search searches projects' default branches only.
-
-See query examples on the tables below and their respective expected output.
-The examples link to a search on GitLab.com to help you visualize the output.
+Advanced Search searches default project branches only.
## General search
-| Query example | Expected output |
-|---|---|
-[`“display bugâ€`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=%22display+bug%22&group_id=9970&project_id=278964) | Returns the **exact phrase** _display bug_ (stemming still applies). |
-[`bug -display`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+-display&group_id=9970&project_id=278964) | Results include _bug_, and **exclude** _display_. |
-[<code>bug &#124; display</code>](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+banner&group_id=9970&project_id=278964) | Results include _bug_ **or** _display_. |
-[<code>bug &#124; (display +banner)</code>](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+%28display+%2Bbanner%29&group_id=9970&project_id=278964) | Results include _bug_ **or** _display_ **and** _banner_. |
-| [`bug error 50*`](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+error+50*&group_id=9970&project_id=278964) | `*` finds **partial matches**. Results include _bug_, _error_, and the partial _50_ (looking for any 500 errors, for example). |
-| [`bug \-display`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=argument+%5C-last&group_id=9970&project_id=278964) | `\` **scapes symbols**. Results include _bug_ **and** _-display_. |
+<!-- markdownlint-disable -->
+
+| Use | Description | Example |
+|-----|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
+| `"` | Exact search | [`"gem sidekiq"`](https://gitlab.com/search?group_id=9970&project_id=278964&scope=blobs&search=%22gem+sidekiq%22) |
+| <code>&#124;</code> | Or | [<code>display &#124; banner</code>](https://gitlab.com/search?group_id=9970&project_id=278964&scope=blobs&search=display+%7C+banner) |
+| `+` | And | [`display +banner`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=display+%2Bbanner&snippets=) |
+| `-` | Exclude | [`display -banner`](https://gitlab.com/search?group_id=9970&project_id=278964&scope=blobs&search=display+-banner) |
+| `*` | Partial | [`bug error 50*`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=bug+error+50%2A&snippets=) |
+| `\` | Escape | [`\*md`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=%5C*md&group_id=9970&project_id=278964) |
+
+## Code search
-## Code Search
+| Use | Description | Example |
+|--------------|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `filename:` | File name | [`filename:*spec.rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=filename%3A*spec.rb&group_id=9970&project_id=278964) |
+| `path:` | Repository location | [`path:spec/workers/`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=path%3Aspec%2Fworkers&snippets=) |
+| `extension:` | File extension, without the `.` | [`extension:js`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=extension%3Ajs&snippets=) |
+| `blob:` | Git object ID | [`blob:998707*`](https://gitlab.com/search?snippets=false&scope=blobs&repository_ref=&search=blob%3A998707*&group_id=9970) |
-| Query example | Expected output | Notes |
-|---|---|---|
-| [`filename:*spec.rb`](https://gitlab.com/search?snippets=&scope=blobs&repository_ref=&search=filename%3A*spec.rb&group_id=9970&project_id=278964) | Returns the specified filename. | Use `*` for fuzzy matching. |
-| [`path:spec/controllers/`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=path%3Aspec%2Fcontrollers%2F&snippets=) | Returns the specified path location of the repository. | Use `*` for fuzzy matching. |
-| [`extension:js`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=extension%3Ajs&snippets=) | Returns the specified file extension. | **Do not** include a leading dot. This only works with exact matches for the extension. |
-| [`blob:998707b421c89b*`](https://gitlab.com/search?snippets=false&scope=blobs&repository_ref=&search=blob%3A998707b421c89b*&group_id=9970) | Returns the specified Git object ID. | This only works with exact matches. |
+`extension` and `blob` return exact matches only.
-## Excluding filters
+## Examples
-Filters can also be inverted to filter out results from the result set by prefixing the filter name with a `-` (hyphen) character.
+| Example | Description |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|
+| [`rails -filename:gemfile.lock`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=rails+-filename%3Agemfile.lock&snippets=) | Show _rails_ in all files except the _`gemfile.lock`_ file. |
+| [`RSpec.describe Resolvers -*builder`](https://gitlab.com/search?group_id=9970&project_id=278964&scope=blobs&search=RSpec.describe+Resolvers+-*builder) | Show all _RSpec.describe Resolvers_ that don't start with _builder_. |
+| [<code>bug &#124; (display +banner)</code>](https://gitlab.com/search?snippets=&scope=issues&repository_ref=&search=bug+%7C+%28display+%2Bbanner%29&group_id=9970&project_id=278964) | Show _bug_ **or** _display_ **and** _banner_. |
-| Query example | Expected output |
-|---|---|
-| [`rails -filename:gemfile.lock`](https://gitlab.com/search?group_id=9970&project_id=278964&repository_ref=&scope=blobs&search=rails+-filename%3Agemfile.lock&snippets=) | Results include _`rails`_ in all files except the _`gemfile.lock`_ file. |
+<!-- markdownlint-enable -->
diff --git a/doc/user/search/img/issue_search_by_id.png b/doc/user/search/img/issue_search_by_id.png
deleted file mode 100644
index 96c0b5c31e1..00000000000
--- a/doc/user/search/img/issue_search_by_id.png
+++ /dev/null
Binary files differ
diff --git a/doc/user/search/img/issue_search_by_id_v15_0.png b/doc/user/search/img/issue_search_by_id_v15_0.png
new file mode 100644
index 00000000000..411cebc0ccb
--- /dev/null
+++ b/doc/user/search/img/issue_search_by_id_v15_0.png
Binary files differ
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index de5f469498e..171d8a63d2d 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -108,7 +108,7 @@ You can add this URL to your feed reader.
You can filter the **Issues** list to individual instances by their ID. For example, enter filter `#10` to return only issue 10. The same applies to the **Merge requests** list. Enter filter `#30` to return only merge request 30.
-![filter issues by specific ID](img/issue_search_by_id.png)
+![filter issues by specific ID](img/issue_search_by_id_v15_0.png)
### Filtering merge requests by approvers **(PREMIUM)**
diff --git a/doc/user/shortcuts.md b/doc/user/shortcuts.md
index e5285d63cf4..2d753fa042a 100644
--- a/doc/user/shortcuts.md
+++ b/doc/user/shortcuts.md
@@ -25,21 +25,23 @@ explained in each section.
These shortcuts are available in most areas of GitLab:
-| Keyboard shortcut | Description |
-|---------------------------------|-------------|
-| <kbd>?</kbd> | Show or hide the shortcut reference sheet. |
-| <kbd>Shift</kbd> + <kbd>p</kbd> | Go to your Projects page. |
-| <kbd>Shift</kbd> + <kbd>g</kbd> | Go to your Groups page. |
-| <kbd>Shift</kbd> + <kbd>a</kbd> | Go to your Activity page. |
-| <kbd>Shift</kbd> + <kbd>l</kbd> | Go to your Milestones page. |
-| <kbd>Shift</kbd> + <kbd>s</kbd> | Go to your Snippets page. |
-| <kbd>s</kbd> / <kbd>/</kbd> | Put cursor in the search bar. |
-| <kbd>Shift</kbd> + <kbd>i</kbd> | Go to your Issues page. |
-| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your [Merge requests](project/merge_requests/index.md) page. |
-| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
-| <kbd>p</kbd> then <kbd>b</kbd> | Show or hide the Performance Bar. |
-| <kbd>g</kbd> then <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
-| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
+| Keyboard shortcut | Description |
+|------------------------------------|-------------|
+| <kbd>?</kbd> | Show or hide the shortcut reference sheet. |
+| <kbd>Shift</kbd> + <kbd>p</kbd> | Go to your Projects page. |
+| <kbd>Shift</kbd> + <kbd>g</kbd> | Go to your Groups page. |
+| <kbd>Shift</kbd> + <kbd>a</kbd> | Go to your Activity page. |
+| <kbd>Shift</kbd> + <kbd>l</kbd> | Go to your Milestones page. |
+| <kbd>Shift</kbd> + <kbd>s</kbd> | Go to your Snippets page. |
+| <kbd>s</kbd> / <kbd>/</kbd> | Put cursor in the search bar. |
+| <kbd>f</kbd> | Put cursor in the filter bar. |
+| <kbd>Shift</kbd> + <kbd>i</kbd> | Go to your Issues page. |
+| <kbd>Shift</kbd> + <kbd>m</kbd> | Go to your [Merge requests](project/merge_requests/index.md) page. |
+| <kbd>Shift</kbd> + <kbd>t</kbd> | Go to your To-Do List page. |
+| <kbd>p</kbd>, then <kbd>b</kbd> | Show or hide the Performance Bar. |
+| <kbd>Escape</kbd> | Hide tooltips or popovers. |
+| <kbd>g</kbd>, then <kbd>x</kbd> | Toggle between [GitLab](https://gitlab.com/) and [GitLab Next](https://next.gitlab.com/) (GitLab SaaS only). |
+| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
Additionally, the following shortcuts are available when editing text in text
fields (for example, comments, replies, issue descriptions, and merge request
@@ -51,7 +53,7 @@ descriptions):
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>p</kbd> | Toggle Markdown preview when editing text in a text field that has **Write** and **Preview** tabs at the top. |
| <kbd>Command</kbd> + <kbd>b</kbd> | <kbd>Control</kbd> + <kbd>b</kbd> | Bold the selected text (surround it with `**`). |
| <kbd>Command</kbd> + <kbd>i</kbd> | <kbd>Control</kbd> + <kbd>i</kbd> | Italicize the selected text (surround it with `_`). |
-| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>s</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>s</kbd> | Strike through the selected text (surround it with `~~`). |
+| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>x</kbd> | Strike through the selected text (surround it with `~~`). |
| <kbd>Command</kbd> + <kbd>k</kbd> | <kbd>Control</kbd> + <kbd>k</kbd> | Add a link (surround the selected text with `[]()`). |
The shortcuts for editing in text fields are always enabled, even if other
@@ -79,13 +81,14 @@ relatively quickly to work, and they take you to another page in the project.
| <kbd>g</kbd> + <kbd>j</kbd> | Go to the CI/CD jobs list (**CI/CD > Jobs**). |
| <kbd>g</kbd> + <kbd>l</kbd> | Go to the project metrics (**Monitor > Metrics**). |
| <kbd>g</kbd> + <kbd>e</kbd> | Go to the project environments (**Deployments > Environments**). |
-| <kbd>g</kbd> + <kbd>k</kbd> | Go to the project Kubernetes cluster integration page (**Infrastructure > Kubernetes clusters**). Note that you must have at least [`maintainer` permissions](permissions.md) to access this page. |
+| <kbd>g</kbd> + <kbd>k</kbd> | Go to the project Kubernetes cluster integration page (**Infrastructure > Kubernetes clusters**). You must have at least [`maintainer` permissions](permissions.md) to access this page. |
| <kbd>g</kbd> + <kbd>s</kbd> | Go to the project snippets list (**Snippets**). |
| <kbd>g</kbd> + <kbd>w</kbd> | Go to the [project wiki](project/wiki/index.md) (**Wiki**), if enabled. |
+| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
-### Issues and merge requests
+### Issues
-These shortcuts are available when viewing issues and [merge requests](project/merge_requests/index.md):
+These shortcuts are available when viewing issues:
| Keyboard shortcut | Description |
|------------------------------|-------------|
@@ -94,18 +97,26 @@ These shortcuts are available when viewing issues and [merge requests](project/m
| <kbd>m</kbd> | Change milestone. |
| <kbd>l</kbd> | Change label. |
| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
-| <kbd>n</kbd> | Move to next unresolved discussion (merge requests only). |
-| <kbd>p</kbd> | Move to previous unresolved discussion (merge requests only). |
-| <kbd>]</kbd> or <kbd>j</kbd> | Move to next file (merge requests only). |
-| <kbd>[</kbd> or <kbd>k</kbd> | Move to previous file (merge requests only). |
-| <kbd>b</kbd> | Copy source branch name (merge requests only). |
| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
-
-Merge requests additionally support the following shortcuts:
-
-| macOS shortcut | Windows shortcut | Description |
-|---------------------------------|---------------------|-------------|
-| <kbd>Command</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then jump to a file for review. |
+| <kbd>→</kbd> | Go to the next design. |
+| <kbd>â†</kbd> | Go to the previous design. |
+| <kbd>Escape</kbd> | Close the design. |
+
+### Merge requests
+
+These shortcuts are available when viewing [merge requests](project/merge_requests/index.md):
+
+| macOS shortcut | Windows shortcut | Description |
+|-----------------------------------|---------------------|-------------|
+| <kbd>]</kbd> or <kbd>j</kbd> | | Move to next file. |
+| <kbd>&#91;</kbd> or <kbd>k</kbd> | | Move to previous file. |
+| <kbd>Command</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then jump to a file for review. |
+| <kbd>n</kbd> | | Move to next unresolved discussion. |
+| <kbd>p</kbd> | | Move to previous unresolved discussion. |
+| <kbd>b</kbd> | | Copy source branch name. |
+| <kbd>r</kbd> | | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
+| <kbd>c</kbd> | | Move to next commit. |
+| <kbd>x</kbd> | | Move to previous commit. |
### Project files
@@ -119,15 +130,88 @@ These shortcuts are available when browsing the files in a project (go to
| <kbd>Enter</kbd> | Open selection. |
| <kbd>Escape</kbd> | Go back to file list screen (only while searching for files, **Repository > Files**, then select **Find File**). |
| <kbd>y</kbd> | Go to file permalink (only while viewing a file). |
-| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
+| <kbd>.</kbd> | Open the [Web IDE](project/web_ide/index.md). |
### Web IDE
These shortcuts are available when editing a file with the [Web IDE](project/web_ide/index.md):
-| macOS shortcut | Windows shortcut | Description |
+| macOS shortcut | Windows/Linux shortcut | Description |
|---------------------------------|---------------------|-------------|
-| <kbd>Command</kbd> + <kbd>p</kbd> | <kbd>Control</kbd> + <kbd>p</kbd> | Search for, and then open another file for editing. |
+| <kbd>Option</kbd> + <kbd>Command</kbd> + <kbd>↑</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>↑</kbd> | Add cursor above |
+| <kbd>Option</kbd> + <kbd>Command</kbd> + <kbd>↓</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>↓</kbd> | Add cursor below |
+| <kbd>Shift</kbd> + <kbd>Option</kbd> + <kbd>I</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>I</kbd> | Add cursors to line ends |
+| <kbd>Command</kbd> + <kbd>K</kbd>, <kbd>Command</kbd> + <kbd>C</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, <kbd>Control</kbd> + <kbd>C</kbd> _or_ <kbd>Control</kbd> + <kbd>/</kbd> | Add line comment |
+| <kbd>Command</kbd> + <kbd>D</kbd> | <kbd>Control</kbd> + <kbd>D</kbd> | Add selection to next find match |
+| <kbd>Command</kbd> + <kbd>F2</kbd> | <kbd>Control</kbd> + <kbd>F2</kbd> | Change all occurrences |
+| <kbd>F1</kbd> | <kbd>F1</kbd> | Command palette |
+| <kbd>Shift</kbd> + <kbd>Option</kbd> + <kbd>↓</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>↓</kbd> | Copy line down |
+| <kbd>Shift</kbd> + <kbd>Option</kbd> + <kbd>↑</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>↑</kbd> | Copy line up [(Linux note)](#linux-shortcuts) |
+| <kbd>Command</kbd> + <kbd>U</kbd> | <kbd>Control</kbd> + <kbd>U</kbd> | Cursor undo |
+| <kbd>Command</kbd> + <kbd>Backspace</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Backspace</kbd> | Delete all left |
+| <kbd>Control</kbd> + <kbd>K</kbd> | | Delete all right |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>K</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd> | Delete line |
+| | <kbd>Control</kbd> + <kbd>Backspace</kbd> | Delete word |
+| <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>→</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>→</kbd> | Expand selection |
+| <kbd>Command</kbd> + <kbd>P</kbd> | <kbd>Control</kbd> + <kbd>P</kbd> | File finder |
+| <kbd>Command</kbd> + <kbd>F</kbd> | <kbd>Control</kbd> + <kbd>F</kbd> | Find |
+| <kbd>Enter</kbd> | <kbd>Enter</kbd> or <kbd>F3</kbd> | Find next |
+| <kbd>Command</kbd> + <kbd>F3</kbd> | <kbd>F3</kbd> | Find next selection [(Linux note)](#linux-shortcuts) |
+| <kbd>Shift</kbd> + <kbd>Enter</kbd> + <kbd>F3</kbd> | <kbd>Shift</kbd> + <kbd>F3</kbd> | Find previous |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>F3</kbd> | <kbd>Shift</kbd> + <kbd>F3</kbd> | Find previous selection |
+| <kbd>Command</kbd> + <kbd>E</kbd> | | Find with selection |
+| <kbd>Option</kbd> + <kbd>Command</kbd> + <kbd>&#91;</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>&#91;</kbd> | Fold |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>O</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>O</kbd> | Fold all |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>/</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>/</kbd> | Fold all block comments |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>8</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>8</kbd> | Fold all regions |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>-</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>-</kbd> | Fold all regions except selected |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>1</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>1</kbd> | Fold level 1 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>2</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>2</kbd> | Fold level 2 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>3</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>3</kbd> | Fold level 3 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>4</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>4</kbd> | Fold level 4 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>5</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>5</kbd> | Fold level 5 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>6</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>6</kbd> | Fold level 6 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>7</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>7</kbd> | Fold level 7 |
+| <kbd>Command</kbd> + <kbd>K</kbd> , then <kbd>Command</kbd> + <kbd>&#91;</kbd> | <kbd>Control</kbd> + <kbd>K</kbd> , then <kbd>Control</kbd> + <kbd>&#91;</kbd> | Fold recursively |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>&#92;</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>&#92;</kbd> | Go to bracket |
+| <kbd>Control</kbd> + <kbd>G</kbd> | <kbd>Control</kbd> + <kbd>G</kbd> | Go to line or column |
+| <kbd>Option</kbd> + <kbd>F8</kbd> | <kbd>Alt</kbd> + <kbd>F8</kbd> | Go to next problem (error, warning, information) |
+| <kbd>F8</kbd> | <kbd>F8</kbd> | Go to next problem in files (error, warning, information) |
+| <kbd>Shift</kbd> + <kbd>Option</kbd> + <kbd>F8</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>F8</kbd> | Go to previous problem (error, warning, information) |
+| <kbd>Shift</kbd> + <kbd>F8</kbd> | <kbd>Shift</kbd> + <kbd>F8</kbd> | Go to previous problem in files (error, warning, information) |
+| <kbd>Command</kbd> + <kbd>&#93;</kbd> | <kbd>Control</kbd> + <kbd>&#93;</kbd> | Indent line |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Enter</kbd> | Insert line above |
+| <kbd>Command</kbd> + <kbd>Enter</kbd> | <kbd>Control</kbd> + <kbd>Enter</kbd> | Insert line below |
+| <kbd>Control</kbd> + <kbd>J</kbd> | <kbd>Control</kbd> + <kbd>J</kbd> | Join lines [(Linux note)](#linux-shortcuts) |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>D</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>D</kbd> | Move last selection to next find match |
+| <kbd>Option</kbd> + <kbd>↓</kbd> | <kbd>Alt</kbd> + <kbd>↓</kbd> | Move line down |
+| <kbd>Option</kbd> + <kbd>↑</kbd> | <kbd>Alt</kbd> + <kbd>↑</kbd> | Move line up |
+| <kbd>Command</kbd> + <kbd>&#91;</kbd> | <kbd>Control</kbd> + <kbd>&#91;</kbd> | Outdent line |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>P</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> | Preview Markdown [(Linux note)](#linux-shortcuts) |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>U</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>U</kbd> or <kbd>Control</kbd> + <kbd>/</kbd> | Remove line comment |
+| <kbd>Option</kbd> + <kbd>Command</kbd> + <kbd>F</kbd> | <kbd>Control</kbd> + <kbd>F</kbd> | Replace |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>.</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>.</kbd> | Replace with next value |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>,</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>,</kbd> | Replace with previous value |
+| <kbd>Command</kbd> + <kbd>S</kbd> | <kbd>Control</kbd> + <kbd>S</kbd> | Save files |
+| <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>L</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd> | Select all occurrences of find match |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>B</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>B</kbd> | Set selection anchor |
+| <kbd>Option</kbd> + <kbd>F1</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>F1</kbd> | Show accessibility help |
+| <kbd>Shift</kbd> + <kbd>F10</kbd> | <kbd>Shift</kbd> + <kbd>F10</kbd> | Show editor context menu |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>I</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>I</kbd> | Show hover |
+| <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>Command</kbd> + <kbd>â†</kbd> | <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>â†</kbd> | Shrink selection |
+| <kbd>Shift</kbd> + <kbd>Option</kbd> + <kbd>A</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>A</kbd> | Toggle block comment |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>L</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>L</kbd> | Toggle fold |
+| <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd> | <kbd>Control</kbd> + <kbd>M</kbd> | Toggle Tab key moves focus |
+| <kbd>Command</kbd> + <kbd>/</kbd> | <kbd>Control</kbd> + <kbd>/</kbd> | Toggle line comment |
+| <kbd>Control</kbd> + <kbd>T</kbd> | | Transpose letters |
+| <kbd>Control</kbd> + <kbd>Space</kbd> | <kbd>Control</kbd> + <kbd>Space</kbd> | Trigger Suggest |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>X</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>X</kbd> | Trim trailing whitespace |
+| <kbd>Option</kbd> + <kbd>Command</kbd> + <kbd>&#93;</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>&#93;</kbd> | Unfold |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>J</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>J</kbd> | Unfold all |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>9</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>9</kbd> | Unfold all regions |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>=</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>=</kbd> | Unfold all regions except selected |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>&#93;</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>&#93;</kbd> | Unfold recursively |
+| <kbd>Command</kbd> + <kbd>K</kbd>, then <kbd>Command</kbd> + <kbd>X</kbd> | <kbd>Control</kbd> + <kbd>K</kbd>, then <kbd>Control</kbd> + <kbd>X</kbd> | Trim trailing whitespace |
| <kbd>Command</kbd> + <kbd>Enter</kbd> | <kbd>Control</kbd> + <kbd>Enter</kbd> | Commit (when editing the commit message). |
### Repository graph
@@ -148,8 +232,8 @@ page (go to **Repository > Graph**):
This shortcut is available when viewing a [wiki page](project/wiki/index.md):
-| Keyboard shortcut | Description |
-|-------------------|-------------|
+| Keyboard shortcut | Description |
+|-------------------|-----------------|
| <kbd>e</kbd> | Edit wiki page. |
### Content editor
@@ -183,7 +267,7 @@ These shortcuts are available when editing a file with the
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>5</kbd> | <kbd>Control</kbd> + <kbd>Alt</kbd> + <kbd>5</kbd> | Apply heading style 5 |
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>6</kbd> | <kbd>Control</kbd> + <kbd>Alt</kbd> + <kbd>6</kbd> | Apply heading style 6 |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>7</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>7</kbd> | Ordered list |
-| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>8</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>8</kbd> | Bullet list |
+| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>8</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>8</kbd> | Unordered list |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>9</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>9</kbd> | Task list |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>b</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>b</kbd> | Blockquote |
| <kbd>Command</kbd> + <kbd>Alt</kbd> + <kbd>c</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>c</kbd> | Code block |
@@ -194,13 +278,13 @@ These shortcuts are available when editing a file with the
#### Text selection
-| macOS shortcut | Windows shortcut | Description |
-|----------------|------------------|-------------|
-| <kbd>Command</kbd> + <kbd>a</kbd> | <kbd>Control</kbd> + <kbd>a</kbd> | Select all |
-| <kbd>Shift</kbd> + <kbd>â†</kbd> | <kbd>Shift</kbd> + <kbd>â†</kbd> | Extend selection one character to left |
-| <kbd>Shift</kbd> + <kbd>→</kbd> | <kbd>Shift</kbd> + <kbd>→</kbd> | Extend selection one character to right |
-| <kbd>Shift</kbd> + <kbd>↑</kbd> | <kbd>Shift</kbd> + <kbd>↑</kbd> | Extend selection one line up |
-| <kbd>Shift</kbd> + <kbd>↓</kbd> | <kbd>Shift</kbd> + <kbd>↓</kbd> | Extend selection one line down |
+| macOS shortcut | Windows shortcut | Description |
+|-----------------------------------|-----------------------------------|-------------|
+| <kbd>Command</kbd> + <kbd>a</kbd> | <kbd>Control</kbd> + <kbd>a</kbd> | Select all |
+| <kbd>Shift</kbd> + <kbd>â†</kbd> | <kbd>Shift</kbd> + <kbd>â†</kbd> | Extend selection one character to left |
+| <kbd>Shift</kbd> + <kbd>→</kbd> | <kbd>Shift</kbd> + <kbd>→</kbd> | Extend selection one character to right |
+| <kbd>Shift</kbd> + <kbd>↑</kbd> | <kbd>Shift</kbd> + <kbd>↑</kbd> | Extend selection one line up |
+| <kbd>Shift</kbd> + <kbd>↓</kbd> | <kbd>Shift</kbd> + <kbd>↓</kbd> | Extend selection one line down |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>↑</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>↑</kbd> | Extend selection to the beginning of the document |
| <kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>↓</kbd> | <kbd>Control</kbd> + <kbd>Shift</kbd> + <kbd>↓</kbd> | Extend selection to the end of the document |
@@ -217,11 +301,23 @@ These shortcuts are available when using a [filtered search input](search/index.
These shortcuts are available when viewing [epics](group/epics/index.md):
-| Keyboard shortcut | Description |
-|-------------------|-------------|
+| Keyboard shortcut | Description |
+|-------------------|-------------------|
| <kbd>r</kbd> | Start writing a comment. Pre-selected text is quoted in the comment. Can't be used to reply in a thread. |
| <kbd>e</kbd> | Edit description. |
-| <kbd>l</kbd> | Change label. |
+| <kbd>l</kbd> | Change label. |
+
+## Metrics
+
+These shortcuts are available when using metrics:
+
+| Keyboard shortcut | Description |
+|-------------------|---------------------|
+| <kbd>e</kbd> | Expand panel. |
+| <kbd>l</kbd> | View logs. |
+| <kbd>d</kbd> | Download CSV. |
+| <kbd>c</kbd> | Copy link to chart. |
+| <kbd>a</kbd> | Alerts. |
## Disable keyboard shortcuts
@@ -232,3 +328,10 @@ To disable keyboard shortcuts:
1. While viewing a page that supports keyboard shortcuts, and outside a text box,
press <kbd>?</kbd> to display the list of shortcuts.
1. Select **Toggle shortcuts**.
+
+## Troubleshooting
+
+### Linux shortcuts
+
+Linux users may encounter GitLab keyboard shortcuts that are overridden by
+their operating system, or their browser.
diff --git a/doc/user/ssh.md b/doc/user/ssh.md
index 54d4722ee2b..27bb7124afe 100644
--- a/doc/user/ssh.md
+++ b/doc/user/ssh.md
@@ -1,8 +1,7 @@
---
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"
-type: howto, 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
---
# Use SSH keys to communicate with GitLab **(FREE)**
@@ -41,7 +40,7 @@ Administrators can [restrict which keys are permitted and their minimum lengths]
The book [Practical Cryptography With Go](https://leanpub.com/gocrypto/read#leanpub-auto-chapter-5-digital-signatures)
suggests that [ED25519](https://ed25519.cr.yp.to/) keys are more secure and performant than RSA keys.
-OpenSSH 6.5 introduced ED25519 SSH keys in 2014 and they should be available on most
+OpenSSH 6.5 introduced ED25519 SSH keys in 2014, and they should be available on most
operating systems.
### ED25519_SK SSH keys
@@ -60,7 +59,7 @@ must have [OpenSSH 8.2](https://www.openssh.com/releasenotes.html#8.2) or later
### RSA SSH keys
-Available documentation suggests that ED25519 is more secure than RSA.
+Available documentation suggests ED25519 is more secure than RSA.
If you use an RSA key, the US National Institute of Science and Technology in
[Publication 800-57 Part 3 (PDF)](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57Pt3r1.pdf)
@@ -71,27 +70,27 @@ Review the `man` page for your installed `ssh-keygen` command for details.
Before you create a key pair, see if a key pair already exists.
-1. On Windows, Linux, or macOS, go to your home directory.
+1. Go to your home directory.
1. Go to the `.ssh/` subdirectory. If the `.ssh/` subdirectory doesn't exist,
you are either not in the home directory, or you haven't used `ssh` before.
In the latter case, you need to [generate an SSH key pair](#generate-an-ssh-key-pair).
1. See if a file with one of the following formats exists:
- | Algorithm | Public key | Private key |
- | --------- | ---------- | ----------- |
+ | Algorithm | Public key | Private key |
+ |-----------------------|------------|-------------|
| ED25519 (preferred) | `id_ed25519.pub` | `id_ed25519` |
- | ED25519_SK | `id_ed25519_sk.pub` | `id_ed25519_sk` |
- | ECDSA_SK | `id_ecdsa_sk.pub` | `id_ecdsa_sk` |
- | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
- | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
- | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
+ | ED25519_SK | `id_ed25519_sk.pub` | `id_ed25519_sk` |
+ | ECDSA_SK | `id_ecdsa_sk.pub` | `id_ecdsa_sk` |
+ | RSA (at least 2048-bit key size) | `id_rsa.pub` | `id_rsa` |
+ | DSA (deprecated) | `id_dsa.pub` | `id_dsa` |
+ | ECDSA | `id_ecdsa.pub` | `id_ecdsa` |
## Generate an SSH key pair
-If you do not have an existing SSH key pair, generate a new one.
+If you do not have an existing SSH key pair, generate a new one:
1. Open a terminal.
-1. Type `ssh-keygen -t` followed by the key type and an optional comment.
+1. Run `ssh-keygen -t` followed by the key type and an optional comment.
This comment is included in the `.pub` file that's created.
You may want to use an email address for the comment.
@@ -107,7 +106,7 @@ If you do not have an existing SSH key pair, generate a new one.
ssh-keygen -t rsa -b 2048 -C "<comment>"
```
-1. Press Enter. Output similar to the following is displayed:
+1. Press <kbd>Enter</kbd>. Output similar to the following is displayed:
```plaintext
Generating public/private ed25519 key pair.
@@ -126,11 +125,10 @@ If you do not have an existing SSH key pair, generate a new one.
Enter same passphrase again:
```
-1. A confirmation is displayed, including information about where your files are stored.
+ A confirmation is displayed, including information about where your files are stored.
-A public and private key are generated.
-[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account) and keep
-the private key secure.
+A public and private key are generated. [Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account)
+and keep the private key secure.
### Configure SSH to point to a different directory
@@ -158,7 +156,7 @@ configure your SSH client to point to the directory where the private key is sto
IdentityFile ~/.ssh/example_com_rsa
```
- For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
+For more information on these settings, see the [`man ssh_config`](https://man.openbsd.org/ssh_config) page in the SSH configuration manual.
Public SSH keys must be unique to GitLab because they bind to your account.
Your SSH key is the only identifier you have when you push code with SSH.
@@ -166,7 +164,7 @@ It must uniquely map to a single user.
### Update your SSH key passphrase
-You can update the passphrase for your SSH key.
+You can update the passphrase for your SSH key:
1. Open a terminal and run this command:
@@ -174,34 +172,32 @@ You can update the passphrase for your SSH key.
ssh-keygen -p -f /path/to/ssh_key
```
-1. At the prompts, type the passphrase and press Enter.
+1. At the prompts, enter the passphrase and then press <kbd>Enter</kbd>.
### Upgrade your RSA key pair to a more secure format
-If your version of OpenSSH is between 6.5 and 7.8,
-you can save your private RSA SSH keys in a more secure
-OpenSSH format.
-
-1. Open a terminal and run this command:
+If your version of OpenSSH is between 6.5 and 7.8, you can save your private
+RSA SSH keys in a more secure OpenSSH format by opening a terminal and running
+this command:
- ```shell
- ssh-keygen -o -f ~/.ssh/id_rsa
- ```
+```shell
+ssh-keygen -o -f ~/.ssh/id_rsa
+```
- Alternatively, you can generate a new RSA key with the more secure encryption format with
- the following command:
+Alternatively, you can generate a new RSA key with the more secure encryption format with
+the following command:
- ```shell
- ssh-keygen -o -t rsa -b 4096 -C "<comment>"
- ```
+```shell
+ssh-keygen -o -t rsa -b 4096 -C "<comment>"
+```
## Generate an SSH key pair for a FIDO/U2F hardware security key
-To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later.
+To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later:
1. Insert a hardware security key into your computer.
1. Open a terminal.
-1. Type `ssh-keygen -t` followed by the key type and an optional comment.
+1. Run `ssh-keygen -t` followed by the key type and an optional comment.
This comment is included in the `.pub` file that's created.
You may want to use an email address for the comment.
@@ -229,7 +225,7 @@ To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later.
from the security key by [`ssh-add -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-add.1#K)
or [`ssh-keygen -K`](https://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-keygen#K).
-1. Select Enter. Output similar to the following is displayed:
+1. Press <kbd>Enter</kbd>. Output similar to the following is displayed:
```plaintext
Generating public/private ed25519-sk key pair.
@@ -251,31 +247,31 @@ To generate ED25519_SK or ECDSA_SK SSH keys, you must use OpenSSH 8.2 or later.
Enter same passphrase again:
```
-1. A confirmation is displayed, including information about where your files are stored.
+ A confirmation is displayed, including information about where your files are stored.
A public and private key are generated.
[Add the public SSH key to your GitLab account](#add-an-ssh-key-to-your-gitlab-account).
## Add an SSH key to your GitLab account
-To use SSH with GitLab, copy your public key to your GitLab account.
+To use SSH with GitLab, copy your public key to your GitLab account:
1. Copy the contents of your public key file. You can do this manually or use a script.
For example, to copy an ED25519 key to the clipboard:
- **macOS:**
+ **macOS**
```shell
tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy
```
- **Linux** (requires the `xclip` package):
+ **Linux** (requires the `xclip` package)
```shell
xclip -sel clip < ~/.ssh/id_ed25519.pub
```
- **Git Bash on Windows:**
+ **Git Bash on Windows**
```shell
cat ~/.ssh/id_ed25519.pub | clip
@@ -298,8 +294,6 @@ To use SSH with GitLab, copy your public key to your GitLab account.
- GitLab 13.12 and earlier, the expiration date is informational only. It doesn't prevent
you from using the key. Administrators can view expiration dates and use them for
guidance when [deleting keys](admin_area/credentials_inventory.md#delete-a-users-ssh-key).
- - GitLab 14.0 and later, the expiration date is enforced. Administrators can
- [allow expired keys to be used](admin_area/settings/account_and_limit_settings.md#allow-expired-ssh-keys-to-be-used-deprecated).
- GitLab checks all SSH keys at 02:00 AM UTC every day. It emails an expiration notice for all SSH keys that expire on the current date. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
- GitLab checks all SSH keys at 01:00 AM UTC every day. It emails an expiration notice for all SSH keys that are scheduled to expire seven days from now. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/322637) in GitLab 13.11.)
1. Select **Add key**.
@@ -308,9 +302,12 @@ To use SSH with GitLab, copy your public key to your GitLab account.
Verify that your SSH key was added correctly.
+The following commands use the example hostname `gitlab.example.com`. Replace this example hostname with your GitLab instance's hostname, for example, `git@gitlab.com`.
+
1. For GitLab.com, to ensure you're connecting to the correct server, confirm the
[SSH host keys fingerprints](gitlab_com/index.md#ssh-host-keys-fingerprints).
-1. Open a terminal and run this command, replacing `gitlab.example.com` with your GitLab instance URL:
+1. Open a terminal and run this command, replacing `gitlab.example.com` with your
+ GitLab instance URL:
```shell
ssh -T git@gitlab.example.com
@@ -326,7 +323,7 @@ Verify that your SSH key was added correctly.
Warning: Permanently added 'gitlab.example.com' (ECDSA) to the list of known hosts.
```
- Type `yes` and press Enter.
+ Type `yes` and press <kbd>Enter</kbd>.
1. Run the `ssh -T git@gitlab.example.com` command again. You should receive a _Welcome to GitLab, `@username`!_ message.
@@ -352,10 +349,10 @@ on `ssh` command options, see the `man` pages for both `ssh` and `ssh_config`.
## Use different accounts on a single GitLab instance
-You can use multiple accounts to connect to a single instance of GitLab.
-You can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
-However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an `IdentityFile` exists
-outside of a `Host` block.
+You can use multiple accounts to connect to a single instance of GitLab. You
+can do this by using the command in the [previous topic](#use-different-keys-for-different-repositories).
+However, even if you set `IdentitiesOnly` to `yes`, you cannot sign in if an
+`IdentityFile` exists outside of a `Host` block.
Instead, you can assign aliases to hosts in the `~.ssh/config` file.
diff --git a/doc/user/todos.md b/doc/user/todos.md
index 5cea619c830..c261d719da0 100644
--- a/doc/user/todos.md
+++ b/doc/user/todos.md
@@ -84,28 +84,25 @@ You can manually add an item to your To-Do List.
![Adding a to-do item from the issuable sidebar](img/todos_add_todo_sidebar_v14_1.png)
-## Create a to-do item by directly addressing someone
+## Create a to-do item by mentioning someone
-You can create a to-do item by directly addressing someone at the start of a line.
-For example, in the following comment:
+You can create a to-do item by mentioning someone anywhere except for a code block. Mentioning a user many times in one message only creates one to-do item.
-```markdown
+For example, from the following comment, everyone except `frank` gets a to-do item created for them:
+
+````markdown
@alice What do you think? cc: @bob
- @carol can you please have a look?
> @dan what do you think?
-@erin @frank thank you!
-```
-
-The people who receive to-do items are `@alice`, `@erin`, and
-`@frank`.
+Hey @erin, this is what they said:
-To view to-do items where a user was directly addressed, go to the To-Do List and
-from the **Action** filter, select **Directly addressed**.
-
-Mentioning a user many times only creates one to-do item.
+```
+Hi, please message @frank :incoming_envelope:
+```
+````
## Actions that mark a to-do item as done
diff --git a/doc/user/usage_quotas.md b/doc/user/usage_quotas.md
index 84a2449f481..21aa93d3f8b 100644
--- a/doc/user/usage_quotas.md
+++ b/doc/user/usage_quotas.md
@@ -48,6 +48,19 @@ The following storage usage statistics are available to a maintainer:
- Total excess storage used: Total amount of storage used that exceeds their allocated storage.
- Purchased storage available: Total storage that has been purchased but is not yet used.
+## Manage your storage usage
+
+You can use several methods to manage and reduce your usage for some storage types.
+
+For more information, see the following pages:
+
+- [Reduce package registry storage](packages/package_registry/reduce_package_registry_storage.md)
+- [Reduce dependency proxy storage](packages/dependency_proxy/reduce_dependency_proxy_storage.md)
+- [Reduce repository size](project/repository/reducing_the_repo_size_using_git.md)
+- [Reduce container registry storage](packages/container_registry/reduce_container_registry_storage.md)
+- [Reduce container registry data transfers](packages/container_registry/reduce_container_registry_data_transfer.md)
+- [Reduce wiki repository size](../administration/wikis/index.md#reduce-wiki-repository-size)
+
## Excess storage usage
Excess storage usage is the amount that a project's repository exceeds the free storage quota. If no
diff --git a/glfm_specification/README.md b/glfm_specification/README.md
new file mode 100644
index 00000000000..02bed2d9058
--- /dev/null
+++ b/glfm_specification/README.md
@@ -0,0 +1,5 @@
+This directory contains the GitLab Flavored Markdown (GLFM) specification.
+
+See the GitLab Flavored Markdown Specification Guide developer documentation for more information:
+
+https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/#specification-files
diff --git a/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt b/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt
new file mode 100644
index 00000000000..582131d700a
--- /dev/null
+++ b/glfm_specification/input/github_flavored_markdown/ghfm_spec_v_0.29.txt
@@ -0,0 +1,10227 @@
+---
+title: GitHub Flavored Markdown Spec
+version: 0.29
+date: '2019-04-06'
+license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)'
+...
+
+# Introduction
+
+## What is GitHub Flavored Markdown?
+
+GitHub Flavored Markdown, often shortened as GFM, is the dialect of Markdown
+that is currently supported for user content on GitHub.com and GitHub
+Enterprise.
+
+This formal specification, based on the CommonMark Spec, defines the syntax and
+semantics of this dialect.
+
+GFM is a strict superset of CommonMark. All the features which are supported in
+GitHub user content and that are not specified on the original CommonMark Spec
+are hence known as **extensions**, and highlighted as such.
+
+While GFM supports a wide range of inputs, it's worth noting that GitHub.com
+and GitHub Enterprise perform additional post-processing and sanitization after
+GFM is converted to HTML to ensure security and consistency of the website.
+
+## What is Markdown?
+
+Markdown is a plain text format for writing structured documents,
+based on conventions for indicating formatting in email
+and usenet posts. It was developed by John Gruber (with
+help from Aaron Swartz) and released in 2004 in the form of a
+[syntax description](http://daringfireball.net/projects/markdown/syntax)
+and a Perl script (`Markdown.pl`) for converting Markdown to
+HTML. In the next decade, dozens of implementations were
+developed in many languages. Some extended the original
+Markdown syntax with conventions for footnotes, tables, and
+other document elements. Some allowed Markdown documents to be
+rendered in formats other than HTML. Websites like Reddit,
+StackOverflow, and GitHub had millions of people using Markdown.
+And Markdown started to be used beyond the web, to author books,
+articles, slide shows, letters, and lecture notes.
+
+What distinguishes Markdown from many other lightweight markup
+syntaxes, which are often easier to write, is its readability.
+As Gruber writes:
+
+> The overriding design goal for Markdown's formatting syntax is
+> to make it as readable as possible. The idea is that a
+> Markdown-formatted document should be publishable as-is, as
+> plain text, without looking like it's been marked up with tags
+> or formatting instructions.
+> (<http://daringfireball.net/projects/markdown/>)
+
+The point can be illustrated by comparing a sample of
+[AsciiDoc](http://www.methods.co.nz/asciidoc/) with
+an equivalent sample of Markdown. Here is a sample of
+AsciiDoc from the AsciiDoc manual:
+
+```
+1. List item one.
++
+List item one continued with a second paragraph followed by an
+Indented block.
++
+.................
+$ ls *.sh
+$ mv *.sh ~/tmp
+.................
++
+List item continued with a third paragraph.
+
+2. List item two continued with an open block.
++
+--
+This paragraph is part of the preceding list item.
+
+a. This list is nested and does not require explicit item
+continuation.
++
+This paragraph is part of the preceding list item.
+
+b. List item b.
+
+This paragraph belongs to item two of the outer list.
+--
+```
+
+And here is the equivalent in Markdown:
+```
+1. List item one.
+
+ List item one continued with a second paragraph followed by an
+ Indented block.
+
+ $ ls *.sh
+ $ mv *.sh ~/tmp
+
+ List item continued with a third paragraph.
+
+2. List item two continued with an open block.
+
+ This paragraph is part of the preceding list item.
+
+ 1. This list is nested and does not require explicit item continuation.
+
+ This paragraph is part of the preceding list item.
+
+ 2. List item b.
+
+ This paragraph belongs to item two of the outer list.
+```
+
+The AsciiDoc version is, arguably, easier to write. You don't need
+to worry about indentation. But the Markdown version is much easier
+to read. The nesting of list items is apparent to the eye in the
+source, not just in the processed document.
+
+## Why is a spec needed?
+
+John Gruber's [canonical description of Markdown's
+syntax](http://daringfireball.net/projects/markdown/syntax)
+does not specify the syntax unambiguously. Here are some examples of
+questions it does not answer:
+
+1. How much indentation is needed for a sublist? The spec says that
+ continuation paragraphs need to be indented four spaces, but is
+ not fully explicit about sublists. It is natural to think that
+ they, too, must be indented four spaces, but `Markdown.pl` does
+ not require that. This is hardly a "corner case," and divergences
+ between implementations on this issue often lead to surprises for
+ users in real documents. (See [this comment by John
+ Gruber](http://article.gmane.org/gmane.text.markdown.general/1997).)
+
+2. Is a blank line needed before a block quote or heading?
+ Most implementations do not require the blank line. However,
+ this can lead to unexpected results in hard-wrapped text, and
+ also to ambiguities in parsing (note that some implementations
+ put the heading inside the blockquote, while others do not).
+ (John Gruber has also spoken [in favor of requiring the blank
+ lines](http://article.gmane.org/gmane.text.markdown.general/2146).)
+
+3. Is a blank line needed before an indented code block?
+ (`Markdown.pl` requires it, but this is not mentioned in the
+ documentation, and some implementations do not require it.)
+
+ ``` markdown
+ paragraph
+ code?
+ ```
+
+4. What is the exact rule for determining when list items get
+ wrapped in `<p>` tags? Can a list be partially "loose" and partially
+ "tight"? What should we do with a list like this?
+
+ ``` markdown
+ 1. one
+
+ 2. two
+ 3. three
+ ```
+
+ Or this?
+
+ ``` markdown
+ 1. one
+ - a
+
+ - b
+ 2. two
+ ```
+
+ (There are some relevant comments by John Gruber
+ [here](http://article.gmane.org/gmane.text.markdown.general/2554).)
+
+5. Can list markers be indented? Can ordered list markers be right-aligned?
+
+ ``` markdown
+ 8. item 1
+ 9. item 2
+ 10. item 2a
+ ```
+
+6. Is this one list with a thematic break in its second item,
+ or two lists separated by a thematic break?
+
+ ``` markdown
+ * a
+ * * * * *
+ * b
+ ```
+
+7. When list markers change from numbers to bullets, do we have
+ two lists or one? (The Markdown syntax description suggests two,
+ but the perl scripts and many other implementations produce one.)
+
+ ``` markdown
+ 1. fee
+ 2. fie
+ - foe
+ - fum
+ ```
+
+8. What are the precedence rules for the markers of inline structure?
+ For example, is the following a valid link, or does the code span
+ take precedence ?
+
+ ``` markdown
+ [a backtick (`)](/url) and [another backtick (`)](/url).
+ ```
+
+9. What are the precedence rules for markers of emphasis and strong
+ emphasis? For example, how should the following be parsed?
+
+ ``` markdown
+ *foo *bar* baz*
+ ```
+
+10. What are the precedence rules between block-level and inline-level
+ structure? For example, how should the following be parsed?
+
+ ``` markdown
+ - `a long code span can contain a hyphen like this
+ - and it can screw things up`
+ ```
+
+11. Can list items include section headings? (`Markdown.pl` does not
+ allow this, but does allow blockquotes to include headings.)
+
+ ``` markdown
+ - # Heading
+ ```
+
+12. Can list items be empty?
+
+ ``` markdown
+ * a
+ *
+ * b
+ ```
+
+13. Can link references be defined inside block quotes or list items?
+
+ ``` markdown
+ > Blockquote [foo].
+ >
+ > [foo]: /url
+ ```
+
+14. If there are multiple definitions for the same reference, which takes
+ precedence?
+
+ ``` markdown
+ [foo]: /url1
+ [foo]: /url2
+
+ [foo][]
+ ```
+
+In the absence of a spec, early implementers consulted `Markdown.pl`
+to resolve these ambiguities. But `Markdown.pl` was quite buggy, and
+gave manifestly bad results in many cases, so it was not a
+satisfactory replacement for a spec.
+
+Because there is no unambiguous spec, implementations have diverged
+considerably. As a result, users are often surprised to find that
+a document that renders one way on one system (say, a GitHub wiki)
+renders differently on another (say, converting to docbook using
+pandoc). To make matters worse, because nothing in Markdown counts
+as a "syntax error," the divergence often isn't discovered right away.
+
+## About this document
+
+This document attempts to specify Markdown syntax unambiguously.
+It contains many examples with side-by-side Markdown and
+HTML. These are intended to double as conformance tests. An
+accompanying script `spec_tests.py` can be used to run the tests
+against any Markdown program:
+
+ python test/spec_tests.py --spec spec.txt --program PROGRAM
+
+Since this document describes how Markdown is to be parsed into
+an abstract syntax tree, it would have made sense to use an abstract
+representation of the syntax tree instead of HTML. But HTML is capable
+of representing the structural distinctions we need to make, and the
+choice of HTML for the tests makes it possible to run the tests against
+an implementation without writing an abstract syntax tree renderer.
+
+This document is generated from a text file, `spec.txt`, written
+in Markdown with a small extension for the side-by-side tests.
+The script `tools/makespec.py` can be used to convert `spec.txt` into
+HTML or CommonMark (which can then be converted into other formats).
+
+In the examples, the `→` character is used to represent tabs.
+
+# Preliminaries
+
+## Characters and lines
+
+Any sequence of [characters] is a valid CommonMark
+document.
+
+A [character](@) is a Unicode code point. Although some
+code points (for example, combining accents) do not correspond to
+characters in an intuitive sense, all code points count as characters
+for purposes of this spec.
+
+This spec does not specify an encoding; it thinks of lines as composed
+of [characters] rather than bytes. A conforming parser may be limited
+to a certain encoding.
+
+A [line](@) is a sequence of zero or more [characters]
+other than newline (`U+000A`) or carriage return (`U+000D`),
+followed by a [line ending] or by the end of file.
+
+A [line ending](@) is a newline (`U+000A`), a carriage return
+(`U+000D`) not followed by a newline, or a carriage return and a
+following newline.
+
+A line containing no characters, or a line containing only spaces
+(`U+0020`) or tabs (`U+0009`), is called a [blank line](@).
+
+The following definitions of character classes will be used in this spec:
+
+A [whitespace character](@) is a space
+(`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`),
+form feed (`U+000C`), or carriage return (`U+000D`).
+
+[Whitespace](@) is a sequence of one or more [whitespace
+characters].
+
+A [Unicode whitespace character](@) is
+any code point in the Unicode `Zs` general category, or a tab (`U+0009`),
+carriage return (`U+000D`), newline (`U+000A`), or form feed
+(`U+000C`).
+
+[Unicode whitespace](@) is a sequence of one
+or more [Unicode whitespace characters].
+
+A [space](@) is `U+0020`.
+
+A [non-whitespace character](@) is any character
+that is not a [whitespace character].
+
+An [ASCII punctuation character](@)
+is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`,
+`*`, `+`, `,`, `-`, `.`, `/` (U+0021–2F),
+`:`, `;`, `<`, `=`, `>`, `?`, `@` (U+003A–0040),
+`[`, `\`, `]`, `^`, `_`, `` ` `` (U+005B–0060),
+`{`, `|`, `}`, or `~` (U+007B–007E).
+
+A [punctuation character](@) is an [ASCII
+punctuation character] or anything in
+the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`.
+
+## Tabs
+
+Tabs in lines are not expanded to [spaces]. However,
+in contexts where whitespace helps to define block structure,
+tabs behave as if they were replaced by spaces with a tab stop
+of 4 characters.
+
+Thus, for example, a tab can be used instead of four spaces
+in an indented code block. (Note, however, that internal
+tabs are passed through as literal tabs, not expanded to
+spaces.)
+
+```````````````````````````````` example
+→foo→baz→→bim
+.
+<pre><code>foo→baz→→bim
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ →foo→baz→→bim
+.
+<pre><code>foo→baz→→bim
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ a→a
+ á½â†’a
+.
+<pre><code>a→a
+á½â†’a
+</code></pre>
+````````````````````````````````
+
+In the following example, a continuation paragraph of a list
+item is indented with a tab; this has exactly the same effect
+as indentation with four spaces would:
+
+```````````````````````````````` example
+ - foo
+
+→bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+- foo
+
+→→bar
+.
+<ul>
+<li>
+<p>foo</p>
+<pre><code> bar
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+Normally the `>` that begins a block quote may be followed
+optionally by a space, which is not considered part of the
+content. In the following case `>` is followed by a tab,
+which is treated as if it were expanded into three spaces.
+Since one of these spaces is considered part of the
+delimiter, `foo` is considered to be indented six spaces
+inside the block quote context, so we get an indented
+code block starting with two spaces.
+
+```````````````````````````````` example
+>→→foo
+.
+<blockquote>
+<pre><code> foo
+</code></pre>
+</blockquote>
+````````````````````````````````
+
+```````````````````````````````` example
+-→→foo
+.
+<ul>
+<li>
+<pre><code> foo
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ foo
+→bar
+.
+<pre><code>foo
+bar
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ - foo
+ - bar
+→ - baz
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>baz</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+#→Foo
+.
+<h1>Foo</h1>
+````````````````````````````````
+
+```````````````````````````````` example
+*→*→*→
+.
+<hr />
+````````````````````````````````
+
+
+## Insecure characters
+
+For security reasons, the Unicode character `U+0000` must be replaced
+with the REPLACEMENT CHARACTER (`U+FFFD`).
+
+# Blocks and inlines
+
+We can think of a document as a sequence of
+[blocks](@)---structural elements like paragraphs, block
+quotations, lists, headings, rules, and code blocks. Some blocks (like
+block quotes and list items) contain other blocks; others (like
+headings and paragraphs) contain [inline](@) content---text,
+links, emphasized text, images, code spans, and so on.
+
+## Precedence
+
+Indicators of block structure always take precedence over indicators
+of inline structure. So, for example, the following is a list with
+two items, not a list with one item containing a code span:
+
+```````````````````````````````` example
+- `one
+- two`
+.
+<ul>
+<li>`one</li>
+<li>two`</li>
+</ul>
+````````````````````````````````
+
+
+This means that parsing can proceed in two steps: first, the block
+structure of the document can be discerned; second, text lines inside
+paragraphs, headings, and other block constructs can be parsed for inline
+structure. The second step requires information about link reference
+definitions that will be available only at the end of the first
+step. Note that the first step requires processing lines in sequence,
+but the second can be parallelized, since the inline parsing of
+one block element does not affect the inline parsing of any other.
+
+## Container blocks and leaf blocks
+
+We can divide blocks into two types:
+[container blocks](@),
+which can contain other blocks, and [leaf blocks](@),
+which cannot.
+
+# Leaf blocks
+
+This section describes the different kinds of leaf block that make up a
+Markdown document.
+
+## Thematic breaks
+
+A line consisting of 0-3 spaces of indentation, followed by a sequence
+of three or more matching `-`, `_`, or `*` characters, each followed
+optionally by any number of spaces or tabs, forms a
+[thematic break](@).
+
+```````````````````````````````` example
+***
+---
+___
+.
+<hr />
+<hr />
+<hr />
+````````````````````````````````
+
+
+Wrong characters:
+
+```````````````````````````````` example
++++
+.
+<p>+++</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+===
+.
+<p>===</p>
+````````````````````````````````
+
+
+Not enough characters:
+
+```````````````````````````````` example
+--
+**
+__
+.
+<p>--
+**
+__</p>
+````````````````````````````````
+
+
+One to three spaces indent are allowed:
+
+```````````````````````````````` example
+ ***
+ ***
+ ***
+.
+<hr />
+<hr />
+<hr />
+````````````````````````````````
+
+
+Four spaces is too many:
+
+```````````````````````````````` example
+ ***
+.
+<pre><code>***
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo
+ ***
+.
+<p>Foo
+***</p>
+````````````````````````````````
+
+
+More than three characters may be used:
+
+```````````````````````````````` example
+_____________________________________
+.
+<hr />
+````````````````````````````````
+
+
+Spaces are allowed between the characters:
+
+```````````````````````````````` example
+ - - -
+.
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ** * ** * ** * **
+.
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+- - - -
+.
+<hr />
+````````````````````````````````
+
+
+Spaces are allowed at the end:
+
+```````````````````````````````` example
+- - - -
+.
+<hr />
+````````````````````````````````
+
+
+However, no other characters may occur in the line:
+
+```````````````````````````````` example
+_ _ _ _ a
+
+a------
+
+---a---
+.
+<p>_ _ _ _ a</p>
+<p>a------</p>
+<p>---a---</p>
+````````````````````````````````
+
+
+It is required that all of the [non-whitespace characters] be the same.
+So, this is not a thematic break:
+
+```````````````````````````````` example
+ *-*
+.
+<p><em>-</em></p>
+````````````````````````````````
+
+
+Thematic breaks do not need blank lines before or after:
+
+```````````````````````````````` example
+- foo
+***
+- bar
+.
+<ul>
+<li>foo</li>
+</ul>
+<hr />
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+Thematic breaks can interrupt a paragraph:
+
+```````````````````````````````` example
+Foo
+***
+bar
+.
+<p>Foo</p>
+<hr />
+<p>bar</p>
+````````````````````````````````
+
+
+If a line of dashes that meets the above conditions for being a
+thematic break could also be interpreted as the underline of a [setext
+heading], the interpretation as a
+[setext heading] takes precedence. Thus, for example,
+this is a setext heading, not a paragraph followed by a thematic break:
+
+```````````````````````````````` example
+Foo
+---
+bar
+.
+<h2>Foo</h2>
+<p>bar</p>
+````````````````````````````````
+
+
+When both a thematic break and a list item are possible
+interpretations of a line, the thematic break takes precedence:
+
+```````````````````````````````` example
+* Foo
+* * *
+* Bar
+.
+<ul>
+<li>Foo</li>
+</ul>
+<hr />
+<ul>
+<li>Bar</li>
+</ul>
+````````````````````````````````
+
+
+If you want a thematic break in a list item, use a different bullet:
+
+```````````````````````````````` example
+- Foo
+- * * *
+.
+<ul>
+<li>Foo</li>
+<li>
+<hr />
+</li>
+</ul>
+````````````````````````````````
+
+
+## ATX headings
+
+An [ATX heading](@)
+consists of a string of characters, parsed as inline content, between an
+opening sequence of 1--6 unescaped `#` characters and an optional
+closing sequence of any number of unescaped `#` characters.
+The opening sequence of `#` characters must be followed by a
+[space] or by the end of line. The optional closing sequence of `#`s must be
+preceded by a [space] and may be followed by spaces only. The opening
+`#` character may be indented 0-3 spaces. The raw contents of the
+heading are stripped of leading and trailing spaces before being parsed
+as inline content. The heading level is equal to the number of `#`
+characters in the opening sequence.
+
+Simple headings:
+
+```````````````````````````````` example
+# foo
+## foo
+### foo
+#### foo
+##### foo
+###### foo
+.
+<h1>foo</h1>
+<h2>foo</h2>
+<h3>foo</h3>
+<h4>foo</h4>
+<h5>foo</h5>
+<h6>foo</h6>
+````````````````````````````````
+
+
+More than six `#` characters is not a heading:
+
+```````````````````````````````` example
+####### foo
+.
+<p>####### foo</p>
+````````````````````````````````
+
+
+At least one space is required between the `#` characters and the
+heading's contents, unless the heading is empty. Note that many
+implementations currently do not require the space. However, the
+space was required by the
+[original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py),
+and it helps prevent things like the following from being parsed as
+headings:
+
+```````````````````````````````` example
+#5 bolt
+
+#hashtag
+.
+<p>#5 bolt</p>
+<p>#hashtag</p>
+````````````````````````````````
+
+
+This is not a heading, because the first `#` is escaped:
+
+```````````````````````````````` example
+\## foo
+.
+<p>## foo</p>
+````````````````````````````````
+
+
+Contents are parsed as inlines:
+
+```````````````````````````````` example
+# foo *bar* \*baz\*
+.
+<h1>foo <em>bar</em> *baz*</h1>
+````````````````````````````````
+
+
+Leading and trailing [whitespace] is ignored in parsing inline content:
+
+```````````````````````````````` example
+# foo
+.
+<h1>foo</h1>
+````````````````````````````````
+
+
+One to three spaces indentation are allowed:
+
+```````````````````````````````` example
+ ### foo
+ ## foo
+ # foo
+.
+<h3>foo</h3>
+<h2>foo</h2>
+<h1>foo</h1>
+````````````````````````````````
+
+
+Four spaces are too much:
+
+```````````````````````````````` example
+ # foo
+.
+<pre><code># foo
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+ # bar
+.
+<p>foo
+# bar</p>
+````````````````````````````````
+
+
+A closing sequence of `#` characters is optional:
+
+```````````````````````````````` example
+## foo ##
+ ### bar ###
+.
+<h2>foo</h2>
+<h3>bar</h3>
+````````````````````````````````
+
+
+It need not be the same length as the opening sequence:
+
+```````````````````````````````` example
+# foo ##################################
+##### foo ##
+.
+<h1>foo</h1>
+<h5>foo</h5>
+````````````````````````````````
+
+
+Spaces are allowed after the closing sequence:
+
+```````````````````````````````` example
+### foo ###
+.
+<h3>foo</h3>
+````````````````````````````````
+
+
+A sequence of `#` characters with anything but [spaces] following it
+is not a closing sequence, but counts as part of the contents of the
+heading:
+
+```````````````````````````````` example
+### foo ### b
+.
+<h3>foo ### b</h3>
+````````````````````````````````
+
+
+The closing sequence must be preceded by a space:
+
+```````````````````````````````` example
+# foo#
+.
+<h1>foo#</h1>
+````````````````````````````````
+
+
+Backslash-escaped `#` characters do not count as part
+of the closing sequence:
+
+```````````````````````````````` example
+### foo \###
+## foo #\##
+# foo \#
+.
+<h3>foo ###</h3>
+<h2>foo ###</h2>
+<h1>foo #</h1>
+````````````````````````````````
+
+
+ATX headings need not be separated from surrounding content by blank
+lines, and they can interrupt paragraphs:
+
+```````````````````````````````` example
+****
+## foo
+****
+.
+<hr />
+<h2>foo</h2>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo bar
+# baz
+Bar foo
+.
+<p>Foo bar</p>
+<h1>baz</h1>
+<p>Bar foo</p>
+````````````````````````````````
+
+
+ATX headings can be empty:
+
+```````````````````````````````` example
+##
+#
+### ###
+.
+<h2></h2>
+<h1></h1>
+<h3></h3>
+````````````````````````````````
+
+
+## Setext headings
+
+A [setext heading](@) consists of one or more
+lines of text, each containing at least one [non-whitespace
+character], with no more than 3 spaces indentation, followed by
+a [setext heading underline]. The lines of text must be such
+that, were they not followed by the setext heading underline,
+they would be interpreted as a paragraph: they cannot be
+interpretable as a [code fence], [ATX heading][ATX headings],
+[block quote][block quotes], [thematic break][thematic breaks],
+[list item][list items], or [HTML block][HTML blocks].
+
+A [setext heading underline](@) is a sequence of
+`=` characters or a sequence of `-` characters, with no more than 3
+spaces indentation and any number of trailing spaces. If a line
+containing a single `-` can be interpreted as an
+empty [list items], it should be interpreted this way
+and not as a [setext heading underline].
+
+The heading is a level 1 heading if `=` characters are used in
+the [setext heading underline], and a level 2 heading if `-`
+characters are used. The contents of the heading are the result
+of parsing the preceding lines of text as CommonMark inline
+content.
+
+In general, a setext heading need not be preceded or followed by a
+blank line. However, it cannot interrupt a paragraph, so when a
+setext heading comes after a paragraph, a blank line is needed between
+them.
+
+Simple examples:
+
+```````````````````````````````` example
+Foo *bar*
+=========
+
+Foo *bar*
+---------
+.
+<h1>Foo <em>bar</em></h1>
+<h2>Foo <em>bar</em></h2>
+````````````````````````````````
+
+
+The content of the header may span more than one line:
+
+```````````````````````````````` example
+Foo *bar
+baz*
+====
+.
+<h1>Foo <em>bar
+baz</em></h1>
+````````````````````````````````
+
+The contents are the result of parsing the headings's raw
+content as inlines. The heading's raw content is formed by
+concatenating the lines and removing initial and final
+[whitespace].
+
+```````````````````````````````` example
+ Foo *bar
+baz*→
+====
+.
+<h1>Foo <em>bar
+baz</em></h1>
+````````````````````````````````
+
+
+The underlining can be any length:
+
+```````````````````````````````` example
+Foo
+-------------------------
+
+Foo
+=
+.
+<h2>Foo</h2>
+<h1>Foo</h1>
+````````````````````````````````
+
+
+The heading content can be indented up to three spaces, and need
+not line up with the underlining:
+
+```````````````````````````````` example
+ Foo
+---
+
+ Foo
+-----
+
+ Foo
+ ===
+.
+<h2>Foo</h2>
+<h2>Foo</h2>
+<h1>Foo</h1>
+````````````````````````````````
+
+
+Four spaces indent is too much:
+
+```````````````````````````````` example
+ Foo
+ ---
+
+ Foo
+---
+.
+<pre><code>Foo
+---
+
+Foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+The setext heading underline can be indented up to three spaces, and
+may have trailing spaces:
+
+```````````````````````````````` example
+Foo
+ ----
+.
+<h2>Foo</h2>
+````````````````````````````````
+
+
+Four spaces is too much:
+
+```````````````````````````````` example
+Foo
+ ---
+.
+<p>Foo
+---</p>
+````````````````````````````````
+
+
+The setext heading underline cannot contain internal spaces:
+
+```````````````````````````````` example
+Foo
+= =
+
+Foo
+--- -
+.
+<p>Foo
+= =</p>
+<p>Foo</p>
+<hr />
+````````````````````````````````
+
+
+Trailing spaces in the content line do not cause a line break:
+
+```````````````````````````````` example
+Foo
+-----
+.
+<h2>Foo</h2>
+````````````````````````````````
+
+
+Nor does a backslash at the end:
+
+```````````````````````````````` example
+Foo\
+----
+.
+<h2>Foo\</h2>
+````````````````````````````````
+
+
+Since indicators of block structure take precedence over
+indicators of inline structure, the following are setext headings:
+
+```````````````````````````````` example
+`Foo
+----
+`
+
+<a title="a lot
+---
+of dashes"/>
+.
+<h2>`Foo</h2>
+<p>`</p>
+<h2>&lt;a title=&quot;a lot</h2>
+<p>of dashes&quot;/&gt;</p>
+````````````````````````````````
+
+
+The setext heading underline cannot be a [lazy continuation
+line] in a list item or block quote:
+
+```````````````````````````````` example
+> Foo
+---
+.
+<blockquote>
+<p>Foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+> foo
+bar
+===
+.
+<blockquote>
+<p>foo
+bar
+===</p>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- Foo
+---
+.
+<ul>
+<li>Foo</li>
+</ul>
+<hr />
+````````````````````````````````
+
+
+A blank line is needed between a paragraph and a following
+setext heading, since otherwise the paragraph becomes part
+of the heading's content:
+
+```````````````````````````````` example
+Foo
+Bar
+---
+.
+<h2>Foo
+Bar</h2>
+````````````````````````````````
+
+
+But in general a blank line is not required before or after
+setext headings:
+
+```````````````````````````````` example
+---
+Foo
+---
+Bar
+---
+Baz
+.
+<hr />
+<h2>Foo</h2>
+<h2>Bar</h2>
+<p>Baz</p>
+````````````````````````````````
+
+
+Setext headings cannot be empty:
+
+```````````````````````````````` example
+
+====
+.
+<p>====</p>
+````````````````````````````````
+
+
+Setext heading text lines must not be interpretable as block
+constructs other than paragraphs. So, the line of dashes
+in these examples gets interpreted as a thematic break:
+
+```````````````````````````````` example
+---
+---
+.
+<hr />
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+-----
+.
+<ul>
+<li>foo</li>
+</ul>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+ foo
+---
+.
+<pre><code>foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+> foo
+-----
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+If you want a heading with `> foo` as its literal text, you can
+use backslash escapes:
+
+```````````````````````````````` example
+\> foo
+------
+.
+<h2>&gt; foo</h2>
+````````````````````````````````
+
+
+**Compatibility note:** Most existing Markdown implementations
+do not allow the text of setext headings to span multiple lines.
+But there is no consensus about how to interpret
+
+``` markdown
+Foo
+bar
+---
+baz
+```
+
+One can find four different interpretations:
+
+1. paragraph "Foo", heading "bar", paragraph "baz"
+2. paragraph "Foo bar", thematic break, paragraph "baz"
+3. paragraph "Foo bar --- baz"
+4. heading "Foo bar", paragraph "baz"
+
+We find interpretation 4 most natural, and interpretation 4
+increases the expressive power of CommonMark, by allowing
+multiline headings. Authors who want interpretation 1 can
+put a blank line after the first paragraph:
+
+```````````````````````````````` example
+Foo
+
+bar
+---
+baz
+.
+<p>Foo</p>
+<h2>bar</h2>
+<p>baz</p>
+````````````````````````````````
+
+
+Authors who want interpretation 2 can put blank lines around
+the thematic break,
+
+```````````````````````````````` example
+Foo
+bar
+
+---
+
+baz
+.
+<p>Foo
+bar</p>
+<hr />
+<p>baz</p>
+````````````````````````````````
+
+
+or use a thematic break that cannot count as a [setext heading
+underline], such as
+
+```````````````````````````````` example
+Foo
+bar
+* * *
+baz
+.
+<p>Foo
+bar</p>
+<hr />
+<p>baz</p>
+````````````````````````````````
+
+
+Authors who want interpretation 3 can use backslash escapes:
+
+```````````````````````````````` example
+Foo
+bar
+\---
+baz
+.
+<p>Foo
+bar
+---
+baz</p>
+````````````````````````````````
+
+
+## Indented code blocks
+
+An [indented code block](@) is composed of one or more
+[indented chunks] separated by blank lines.
+An [indented chunk](@) is a sequence of non-blank lines,
+each indented four or more spaces. The contents of the code block are
+the literal contents of the lines, including trailing
+[line endings], minus four spaces of indentation.
+An indented code block has no [info string].
+
+An indented code block cannot interrupt a paragraph, so there must be
+a blank line between a paragraph and a following indented code block.
+(A blank line is not needed, however, between a code block and a following
+paragraph.)
+
+```````````````````````````````` example
+ a simple
+ indented code block
+.
+<pre><code>a simple
+ indented code block
+</code></pre>
+````````````````````````````````
+
+
+If there is any ambiguity between an interpretation of indentation
+as a code block and as indicating that material belongs to a [list
+item][list items], the list item interpretation takes precedence:
+
+```````````````````````````````` example
+ - foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. foo
+
+ - bar
+.
+<ol>
+<li>
+<p>foo</p>
+<ul>
+<li>bar</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+
+The contents of a code block are literal text, and do not get parsed
+as Markdown:
+
+```````````````````````````````` example
+ <a/>
+ *hi*
+
+ - one
+.
+<pre><code>&lt;a/&gt;
+*hi*
+
+- one
+</code></pre>
+````````````````````````````````
+
+
+Here we have three chunks separated by blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+
+
+
+ chunk3
+.
+<pre><code>chunk1
+
+chunk2
+
+
+
+chunk3
+</code></pre>
+````````````````````````````````
+
+
+Any initial spaces beyond four will be included in the content, even
+in interior blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+.
+<pre><code>chunk1
+
+ chunk2
+</code></pre>
+````````````````````````````````
+
+
+An indented code block cannot interrupt a paragraph. (This
+allows hanging indents and the like.)
+
+```````````````````````````````` example
+Foo
+ bar
+
+.
+<p>Foo
+bar</p>
+````````````````````````````````
+
+
+However, any non-blank line with fewer than four leading spaces ends
+the code block immediately. So a paragraph may occur immediately
+after indented code:
+
+```````````````````````````````` example
+ foo
+bar
+.
+<pre><code>foo
+</code></pre>
+<p>bar</p>
+````````````````````````````````
+
+
+And indented code can occur immediately before and after other kinds of
+blocks:
+
+```````````````````````````````` example
+# Heading
+ foo
+Heading
+------
+ foo
+----
+.
+<h1>Heading</h1>
+<pre><code>foo
+</code></pre>
+<h2>Heading</h2>
+<pre><code>foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+The first line can be indented more than four spaces:
+
+```````````````````````````````` example
+ foo
+ bar
+.
+<pre><code> foo
+bar
+</code></pre>
+````````````````````````````````
+
+
+Blank lines preceding or following an indented code block
+are not included in it:
+
+```````````````````````````````` example
+
+
+ foo
+
+
+.
+<pre><code>foo
+</code></pre>
+````````````````````````````````
+
+
+Trailing spaces are included in the code block's content:
+
+```````````````````````````````` example
+ foo
+.
+<pre><code>foo
+</code></pre>
+````````````````````````````````
+
+
+
+## Fenced code blocks
+
+A [code fence](@) is a sequence
+of at least three consecutive backtick characters (`` ` ``) or
+tildes (`~`). (Tildes and backticks cannot be mixed.)
+A [fenced code block](@)
+begins with a code fence, indented no more than three spaces.
+
+The line with the opening code fence may optionally contain some text
+following the code fence; this is trimmed of leading and trailing
+whitespace and called the [info string](@). If the [info string] comes
+after a backtick fence, it may not contain any backtick
+characters. (The reason for this restriction is that otherwise
+some inline code would be incorrectly interpreted as the
+beginning of a fenced code block.)
+
+The content of the code block consists of all subsequent lines, until
+a closing [code fence] of the same type as the code block
+began with (backticks or tildes), and with at least as many backticks
+or tildes as the opening code fence. If the leading code fence is
+indented N spaces, then up to N spaces of indentation are removed from
+each line of the content (if present). (If a content line is not
+indented, it is preserved unchanged. If it is indented less than N
+spaces, all of the indentation is removed.)
+
+The closing code fence may be indented up to three spaces, and may be
+followed only by spaces, which are ignored. If the end of the
+containing block (or document) is reached and no closing code fence
+has been found, the code block contains all of the lines after the
+opening code fence until the end of the containing block (or
+document). (An alternative spec would require backtracking in the
+event that a closing code fence is not found. But this makes parsing
+much less efficient, and there seems to be no real down side to the
+behavior described here.)
+
+A fenced code block may interrupt a paragraph, and does not require
+a blank line either before or after.
+
+The content of a code fence is treated as literal text, not parsed
+as inlines. The first word of the [info string] is typically used to
+specify the language of the code sample, and rendered in the `class`
+attribute of the `code` tag. However, this spec does not mandate any
+particular treatment of the [info string].
+
+Here is a simple example with backticks:
+
+```````````````````````````````` example
+```
+<
+ >
+```
+.
+<pre><code>&lt;
+ &gt;
+</code></pre>
+````````````````````````````````
+
+
+With tildes:
+
+```````````````````````````````` example
+~~~
+<
+ >
+~~~
+.
+<pre><code>&lt;
+ &gt;
+</code></pre>
+````````````````````````````````
+
+Fewer than three backticks is not enough:
+
+```````````````````````````````` example
+``
+foo
+``
+.
+<p><code>foo</code></p>
+````````````````````````````````
+
+The closing code fence must use the same character as the opening
+fence:
+
+```````````````````````````````` example
+```
+aaa
+~~~
+```
+.
+<pre><code>aaa
+~~~
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+aaa
+```
+~~~
+.
+<pre><code>aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+The closing code fence must be at least as long as the opening fence:
+
+```````````````````````````````` example
+````
+aaa
+```
+``````
+.
+<pre><code>aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~
+aaa
+~~~
+~~~~
+.
+<pre><code>aaa
+~~~
+</code></pre>
+````````````````````````````````
+
+
+Unclosed code blocks are closed by the end of the document
+(or the enclosing [block quote][block quotes] or [list item][list items]):
+
+```````````````````````````````` example
+```
+.
+<pre><code></code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`````
+
+```
+aaa
+.
+<pre><code>
+```
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+> aaa
+
+bbb
+.
+<blockquote>
+<pre><code>aaa
+</code></pre>
+</blockquote>
+<p>bbb</p>
+````````````````````````````````
+
+
+A code block can have all empty lines as its content:
+
+```````````````````````````````` example
+```
+
+
+```
+.
+<pre><code>
+
+</code></pre>
+````````````````````````````````
+
+
+A code block can be empty:
+
+```````````````````````````````` example
+```
+```
+.
+<pre><code></code></pre>
+````````````````````````````````
+
+
+Fences can be indented. If the opening fence is indented,
+content lines will have equivalent opening indentation removed,
+if present:
+
+```````````````````````````````` example
+ ```
+ aaa
+aaa
+```
+.
+<pre><code>aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ aaa
+aaa
+ ```
+.
+<pre><code>aaa
+aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+.
+<pre><code>aaa
+ aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+Four spaces indentation produces an indented code block:
+
+```````````````````````````````` example
+ ```
+ aaa
+ ```
+.
+<pre><code>```
+aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+Closing fences may be indented by 0-3 spaces, and their indentation
+need not match that of the opening fence:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+<pre><code>aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ ```
+.
+<pre><code>aaa
+</code></pre>
+````````````````````````````````
+
+
+This is not a closing fence, because it is indented 4 spaces:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+<pre><code>aaa
+ ```
+</code></pre>
+````````````````````````````````
+
+
+
+Code fences (opening and closing) cannot contain internal spaces:
+
+```````````````````````````````` example
+``` ```
+aaa
+.
+<p><code> </code>
+aaa</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~~~
+aaa
+~~~ ~~
+.
+<pre><code>aaa
+~~~ ~~
+</code></pre>
+````````````````````````````````
+
+
+Fenced code blocks can interrupt paragraphs, and can be followed
+directly by paragraphs, without a blank line between:
+
+```````````````````````````````` example
+foo
+```
+bar
+```
+baz
+.
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+<p>baz</p>
+````````````````````````````````
+
+
+Other blocks can also occur before and after fenced code blocks
+without an intervening blank line:
+
+```````````````````````````````` example
+foo
+---
+~~~
+bar
+~~~
+# baz
+.
+<h2>foo</h2>
+<pre><code>bar
+</code></pre>
+<h1>baz</h1>
+````````````````````````````````
+
+
+An [info string] can be provided after the opening code fence.
+Although this spec doesn't mandate any particular treatment of
+the info string, the first word is typically used to specify
+the language of the code block. In HTML output, the language is
+normally indicated by adding a class to the `code` element consisting
+of `language-` followed by the language name.
+
+```````````````````````````````` example
+```ruby
+def foo(x)
+ return 3
+end
+```
+.
+<pre><code class="language-ruby">def foo(x)
+ return 3
+end
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~ ruby startline=3 $%@#$
+def foo(x)
+ return 3
+end
+~~~~~~~
+.
+<pre><code class="language-ruby">def foo(x)
+ return 3
+end
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+````;
+````
+.
+<pre><code class="language-;"></code></pre>
+````````````````````````````````
+
+
+[Info strings] for backtick code blocks cannot contain backticks:
+
+```````````````````````````````` example
+``` aa ```
+foo
+.
+<p><code>aa</code>
+foo</p>
+````````````````````````````````
+
+
+[Info strings] for tilde code blocks can contain backticks and tildes:
+
+```````````````````````````````` example
+~~~ aa ``` ~~~
+foo
+~~~
+.
+<pre><code class="language-aa">foo
+</code></pre>
+````````````````````````````````
+
+
+Closing code fences cannot have [info strings]:
+
+```````````````````````````````` example
+```
+``` aaa
+```
+.
+<pre><code>``` aaa
+</code></pre>
+````````````````````````````````
+
+
+
+## HTML blocks
+
+An [HTML block](@) is a group of lines that is treated
+as raw HTML (and will not be escaped in HTML output).
+
+There are seven kinds of [HTML block], which can be defined by their
+start and end conditions. The block begins with a line that meets a
+[start condition](@) (after up to three spaces optional indentation).
+It ends with the first subsequent line that meets a matching [end
+condition](@), or the last line of the document, or the last line of
+the [container block](#container-blocks) containing the current HTML
+block, if no line is encountered that meets the [end condition]. If
+the first line meets both the [start condition] and the [end
+condition], the block will contain just that line.
+
+1. **Start condition:** line begins with the string `<script`,
+`<pre`, or `<style` (case-insensitive), followed by whitespace,
+the string `>`, or the end of the line.\
+**End condition:** line contains an end tag
+`</script>`, `</pre>`, or `</style>` (case-insensitive; it
+need not match the start tag).
+
+2. **Start condition:** line begins with the string `<!--`.\
+**End condition:** line contains the string `-->`.
+
+3. **Start condition:** line begins with the string `<?`.\
+**End condition:** line contains the string `?>`.
+
+4. **Start condition:** line begins with the string `<!`
+followed by an uppercase ASCII letter.\
+**End condition:** line contains the character `>`.
+
+5. **Start condition:** line begins with the string
+`<![CDATA[`.\
+**End condition:** line contains the string `]]>`.
+
+6. **Start condition:** line begins the string `<` or `</`
+followed by one of the strings (case-insensitive) `address`,
+`article`, `aside`, `base`, `basefont`, `blockquote`, `body`,
+`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`,
+`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`,
+`footer`, `form`, `frame`, `frameset`,
+`h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`,
+`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
+`nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`,
+`section`, `source`, `summary`, `table`, `tbody`, `td`,
+`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed
+by [whitespace], the end of the line, the string `>`, or
+the string `/>`.\
+**End condition:** line is followed by a [blank line].
+
+7. **Start condition:** line begins with a complete [open tag]
+(with any [tag name] other than `script`,
+`style`, or `pre`) or a complete [closing tag],
+followed only by [whitespace] or the end of the line.\
+**End condition:** line is followed by a [blank line].
+
+HTML blocks continue until they are closed by their appropriate
+[end condition], or the last line of the document or other [container
+block](#container-blocks). This means any HTML **within an HTML
+block** that might otherwise be recognised as a start condition will
+be ignored by the parser and passed through as-is, without changing
+the parser's state.
+
+For instance, `<pre>` within a HTML block started by `<table>` will not affect
+the parser state; as the HTML block was started in by start condition 6, it
+will end at any blank line. This can be surprising:
+
+```````````````````````````````` example
+<table><tr><td>
+<pre>
+**Hello**,
+
+_world_.
+</pre>
+</td></tr></table>
+.
+<table><tr><td>
+<pre>
+**Hello**,
+<p><em>world</em>.
+</pre></p>
+</td></tr></table>
+````````````````````````````````
+
+In this case, the HTML block is terminated by the newline — the `**Hello**`
+text remains verbatim — and regular parsing resumes, with a paragraph,
+emphasised `world` and inline and block HTML following.
+
+All types of [HTML blocks] except type 7 may interrupt
+a paragraph. Blocks of type 7 may not interrupt a paragraph.
+(This restriction is intended to prevent unwanted interpretation
+of long tags inside a wrapped paragraph as starting HTML blocks.)
+
+Some simple examples follow. Here are some basic HTML blocks
+of type 6:
+
+```````````````````````````````` example
+<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+
+okay.
+.
+<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+<p>okay.</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ <div>
+ *hello*
+ <foo><a>
+.
+ <div>
+ *hello*
+ <foo><a>
+````````````````````````````````
+
+
+A block can also start with a closing tag:
+
+```````````````````````````````` example
+</div>
+*foo*
+.
+</div>
+*foo*
+````````````````````````````````
+
+
+Here we have two HTML blocks with a Markdown paragraph between them:
+
+```````````````````````````````` example
+<DIV CLASS="foo">
+
+*Markdown*
+
+</DIV>
+.
+<DIV CLASS="foo">
+<p><em>Markdown</em></p>
+</DIV>
+````````````````````````````````
+
+
+The tag on the first line can be partial, as long
+as it is split where there would be whitespace:
+
+```````````````````````````````` example
+<div id="foo"
+ class="bar">
+</div>
+.
+<div id="foo"
+ class="bar">
+</div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div id="foo" class="bar
+ baz">
+</div>
+.
+<div id="foo" class="bar
+ baz">
+</div>
+````````````````````````````````
+
+
+An open tag need not be closed:
+```````````````````````````````` example
+<div>
+*foo*
+
+*bar*
+.
+<div>
+*foo*
+<p><em>bar</em></p>
+````````````````````````````````
+
+
+
+A partial tag need not even be completed (garbage
+in, garbage out):
+
+```````````````````````````````` example
+<div id="foo"
+*hi*
+.
+<div id="foo"
+*hi*
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div class
+foo
+.
+<div class
+foo
+````````````````````````````````
+
+
+The initial tag doesn't even need to be a valid
+tag, as long as it starts like one:
+
+```````````````````````````````` example
+<div *???-&&&-<---
+*foo*
+.
+<div *???-&&&-<---
+*foo*
+````````````````````````````````
+
+
+In type 6 blocks, the initial tag need not be on a line by
+itself:
+
+```````````````````````````````` example
+<div><a href="bar">*foo*</a></div>
+.
+<div><a href="bar">*foo*</a></div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<table><tr><td>
+foo
+</td></tr></table>
+.
+<table><tr><td>
+foo
+</td></tr></table>
+````````````````````````````````
+
+
+Everything until the next blank line or end of document
+gets included in the HTML block. So, in the following
+example, what looks like a Markdown code block
+is actually part of the HTML block, which continues until a blank
+line or the end of the document is reached:
+
+```````````````````````````````` example
+<div></div>
+``` c
+int x = 33;
+```
+.
+<div></div>
+``` c
+int x = 33;
+```
+````````````````````````````````
+
+
+To start an [HTML block] with a tag that is *not* in the
+list of block-level tags in (6), you must put the tag by
+itself on the first line (and it must be complete):
+
+```````````````````````````````` example
+<a href="foo">
+*bar*
+</a>
+.
+<a href="foo">
+*bar*
+</a>
+````````````````````````````````
+
+
+In type 7 blocks, the [tag name] can be anything:
+
+```````````````````````````````` example
+<Warning>
+*bar*
+</Warning>
+.
+<Warning>
+*bar*
+</Warning>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<i class="foo">
+*bar*
+</i>
+.
+<i class="foo">
+*bar*
+</i>
+````````````````````````````````
+
+
+```````````````````````````````` example
+</ins>
+*bar*
+.
+</ins>
+*bar*
+````````````````````````````````
+
+
+These rules are designed to allow us to work with tags that
+can function as either block-level or inline-level tags.
+The `<del>` tag is a nice example. We can surround content with
+`<del>` tags in three different ways. In this case, we get a raw
+HTML block, because the `<del>` tag is on a line by itself:
+
+```````````````````````````````` example
+<del>
+*foo*
+</del>
+.
+<del>
+*foo*
+</del>
+````````````````````````````````
+
+
+In this case, we get a raw HTML block that just includes
+the `<del>` tag (because it ends with the following blank
+line). So the contents get interpreted as CommonMark:
+
+```````````````````````````````` example
+<del>
+
+*foo*
+
+</del>
+.
+<del>
+<p><em>foo</em></p>
+</del>
+````````````````````````````````
+
+
+Finally, in this case, the `<del>` tags are interpreted
+as [raw HTML] *inside* the CommonMark paragraph. (Because
+the tag is not on a line by itself, we get inline HTML
+rather than an [HTML block].)
+
+```````````````````````````````` example
+<del>*foo*</del>
+.
+<p><del><em>foo</em></del></p>
+````````````````````````````````
+
+
+HTML tags designed to contain literal content
+(`script`, `style`, `pre`), comments, processing instructions,
+and declarations are treated somewhat differently.
+Instead of ending at the first blank line, these blocks
+end at the first line containing a corresponding end tag.
+As a result, these blocks can contain blank lines:
+
+A pre tag (type 1):
+
+```````````````````````````````` example
+<pre language="haskell"><code>
+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+</code></pre>
+okay
+.
+<pre language="haskell"><code>
+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+</code></pre>
+<p>okay</p>
+````````````````````````````````
+
+
+A script tag (type 1):
+
+```````````````````````````````` example
+<script type="text/javascript">
+// JavaScript example
+
+document.getElementById("demo").innerHTML = "Hello JavaScript!";
+</script>
+okay
+.
+<script type="text/javascript">
+// JavaScript example
+
+document.getElementById("demo").innerHTML = "Hello JavaScript!";
+</script>
+<p>okay</p>
+````````````````````````````````
+
+
+A style tag (type 1):
+
+```````````````````````````````` example
+<style
+ type="text/css">
+h1 {color:red;}
+
+p {color:blue;}
+</style>
+okay
+.
+<style
+ type="text/css">
+h1 {color:red;}
+
+p {color:blue;}
+</style>
+<p>okay</p>
+````````````````````````````````
+
+
+If there is no matching end tag, the block will end at the
+end of the document (or the enclosing [block quote][block quotes]
+or [list item][list items]):
+
+```````````````````````````````` example
+<style
+ type="text/css">
+
+foo
+.
+<style
+ type="text/css">
+
+foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+> <div>
+> foo
+
+bar
+.
+<blockquote>
+<div>
+foo
+</blockquote>
+<p>bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- <div>
+- foo
+.
+<ul>
+<li>
+<div>
+</li>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+
+The end tag can occur on the same line as the start tag:
+
+```````````````````````````````` example
+<style>p{color:red;}</style>
+*foo*
+.
+<style>p{color:red;}</style>
+<p><em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<!-- foo -->*bar*
+*baz*
+.
+<!-- foo -->*bar*
+<p><em>baz</em></p>
+````````````````````````````````
+
+
+Note that anything on the last line after the
+end tag will be included in the [HTML block]:
+
+```````````````````````````````` example
+<script>
+foo
+</script>1. *bar*
+.
+<script>
+foo
+</script>1. *bar*
+````````````````````````````````
+
+
+A comment (type 2):
+
+```````````````````````````````` example
+<!-- Foo
+
+bar
+ baz -->
+okay
+.
+<!-- Foo
+
+bar
+ baz -->
+<p>okay</p>
+````````````````````````````````
+
+
+
+A processing instruction (type 3):
+
+```````````````````````````````` example
+<?php
+
+ echo '>';
+
+?>
+okay
+.
+<?php
+
+ echo '>';
+
+?>
+<p>okay</p>
+````````````````````````````````
+
+
+A declaration (type 4):
+
+```````````````````````````````` example
+<!DOCTYPE html>
+.
+<!DOCTYPE html>
+````````````````````````````````
+
+
+CDATA (type 5):
+
+```````````````````````````````` example
+<![CDATA[
+function matchwo(a,b)
+{
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+}
+]]>
+okay
+.
+<![CDATA[
+function matchwo(a,b)
+{
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+}
+]]>
+<p>okay</p>
+````````````````````````````````
+
+
+The opening tag can be indented 1-3 spaces, but not 4:
+
+```````````````````````````````` example
+ <!-- foo -->
+
+ <!-- foo -->
+.
+ <!-- foo -->
+<pre><code>&lt;!-- foo --&gt;
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ <div>
+
+ <div>
+.
+ <div>
+<pre><code>&lt;div&gt;
+</code></pre>
+````````````````````````````````
+
+
+An HTML block of types 1--6 can interrupt a paragraph, and need not be
+preceded by a blank line.
+
+```````````````````````````````` example
+Foo
+<div>
+bar
+</div>
+.
+<p>Foo</p>
+<div>
+bar
+</div>
+````````````````````````````````
+
+
+However, a following blank line is needed, except at the end of
+a document, and except for blocks of types 1--5, [above][HTML
+block]:
+
+```````````````````````````````` example
+<div>
+bar
+</div>
+*foo*
+.
+<div>
+bar
+</div>
+*foo*
+````````````````````````````````
+
+
+HTML blocks of type 7 cannot interrupt a paragraph:
+
+```````````````````````````````` example
+Foo
+<a href="bar">
+baz
+.
+<p>Foo
+<a href="bar">
+baz</p>
+````````````````````````````````
+
+
+This rule differs from John Gruber's original Markdown syntax
+specification, which says:
+
+> The only restrictions are that block-level HTML elements —
+> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from
+> surrounding content by blank lines, and the start and end tags of the
+> block should not be indented with tabs or spaces.
+
+In some ways Gruber's rule is more restrictive than the one given
+here:
+
+- It requires that an HTML block be preceded by a blank line.
+- It does not allow the start tag to be indented.
+- It requires a matching end tag, which it also does not allow to
+ be indented.
+
+Most Markdown implementations (including some of Gruber's own) do not
+respect all of these restrictions.
+
+There is one respect, however, in which Gruber's rule is more liberal
+than the one given here, since it allows blank lines to occur inside
+an HTML block. There are two reasons for disallowing them here.
+First, it removes the need to parse balanced tags, which is
+expensive and can require backtracking from the end of the document
+if no matching end tag is found. Second, it provides a very simple
+and flexible way of including Markdown content inside HTML tags:
+simply separate the Markdown from the HTML using blank lines:
+
+Compare:
+
+```````````````````````````````` example
+<div>
+
+*Emphasized* text.
+
+</div>
+.
+<div>
+<p><em>Emphasized</em> text.</p>
+</div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div>
+*Emphasized* text.
+</div>
+.
+<div>
+*Emphasized* text.
+</div>
+````````````````````````````````
+
+
+Some Markdown implementations have adopted a convention of
+interpreting content inside tags as text if the open tag has
+the attribute `markdown=1`. The rule given above seems a simpler and
+more elegant way of achieving the same expressive power, which is also
+much simpler to parse.
+
+The main potential drawback is that one can no longer paste HTML
+blocks into Markdown documents with 100% reliability. However,
+*in most cases* this will work fine, because the blank lines in
+HTML are usually followed by HTML block tags. For example:
+
+```````````````````````````````` example
+<table>
+
+<tr>
+
+<td>
+Hi
+</td>
+
+</tr>
+
+</table>
+.
+<table>
+<tr>
+<td>
+Hi
+</td>
+</tr>
+</table>
+````````````````````````````````
+
+
+There are problems, however, if the inner tags are indented
+*and* separated by spaces, as then they will be interpreted as
+an indented code block:
+
+```````````````````````````````` example
+<table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+</table>
+.
+<table>
+ <tr>
+<pre><code>&lt;td&gt;
+ Hi
+&lt;/td&gt;
+</code></pre>
+ </tr>
+</table>
+````````````````````````````````
+
+
+Fortunately, blank lines are usually not necessary and can be
+deleted. The exception is inside `<pre>` tags, but as described
+[above][HTML blocks], raw HTML blocks starting with `<pre>`
+*can* contain blank lines.
+
+## Link reference definitions
+
+A [link reference definition](@)
+consists of a [link label], indented up to three spaces, followed
+by a colon (`:`), optional [whitespace] (including up to one
+[line ending]), a [link destination],
+optional [whitespace] (including up to one
+[line ending]), and an optional [link
+title], which if it is present must be separated
+from the [link destination] by [whitespace].
+No further [non-whitespace characters] may occur on the line.
+
+A [link reference definition]
+does not correspond to a structural element of a document. Instead, it
+defines a label which can be used in [reference links]
+and reference-style [images] elsewhere in the document. [Link
+reference definitions] can come either before or after the links that use
+them.
+
+```````````````````````````````` example
+[foo]: /url "title"
+
+[foo]
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ [foo]:
+ /url
+ 'the title'
+
+[foo]
+.
+<p><a href="/url" title="the title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[Foo*bar\]]:my_(url) 'title (with parens)'
+
+[Foo*bar\]]
+.
+<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[Foo bar]:
+<my url>
+'title'
+
+[Foo bar]
+.
+<p><a href="my%20url" title="title">Foo bar</a></p>
+````````````````````````````````
+
+
+The title may extend over multiple lines:
+
+```````````````````````````````` example
+[foo]: /url '
+title
+line1
+line2
+'
+
+[foo]
+.
+<p><a href="/url" title="
+title
+line1
+line2
+">foo</a></p>
+````````````````````````````````
+
+
+However, it may not contain a [blank line]:
+
+```````````````````````````````` example
+[foo]: /url 'title
+
+with blank line'
+
+[foo]
+.
+<p>[foo]: /url 'title</p>
+<p>with blank line'</p>
+<p>[foo]</p>
+````````````````````````````````
+
+
+The title may be omitted:
+
+```````````````````````````````` example
+[foo]:
+/url
+
+[foo]
+.
+<p><a href="/url">foo</a></p>
+````````````````````````````````
+
+
+The link destination may not be omitted:
+
+```````````````````````````````` example
+[foo]:
+
+[foo]
+.
+<p>[foo]:</p>
+<p>[foo]</p>
+````````````````````````````````
+
+ However, an empty link destination may be specified using
+ angle brackets:
+
+```````````````````````````````` example
+[foo]: <>
+
+[foo]
+.
+<p><a href="">foo</a></p>
+````````````````````````````````
+
+The title must be separated from the link destination by
+whitespace:
+
+```````````````````````````````` example
+[foo]: <bar>(baz)
+
+[foo]
+.
+<p>[foo]: <bar>(baz)</p>
+<p>[foo]</p>
+````````````````````````````````
+
+
+Both title and destination can contain backslash escapes
+and literal backslashes:
+
+```````````````````````````````` example
+[foo]: /url\bar\*baz "foo\"bar\baz"
+
+[foo]
+.
+<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
+````````````````````````````````
+
+
+A link can come before its corresponding definition:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: url
+.
+<p><a href="url">foo</a></p>
+````````````````````````````````
+
+
+If there are several matching definitions, the first one takes
+precedence:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: first
+[foo]: second
+.
+<p><a href="first">foo</a></p>
+````````````````````````````````
+
+
+As noted in the section on [Links], matching of labels is
+case-insensitive (see [matches]).
+
+```````````````````````````````` example
+[FOO]: /url
+
+[Foo]
+.
+<p><a href="/url">Foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[ΑΓΩ]: /φου
+
+[αγω]
+.
+<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+````````````````````````````````
+
+
+Here is a link reference definition with no corresponding link.
+It contributes nothing to the document.
+
+```````````````````````````````` example
+[foo]: /url
+.
+````````````````````````````````
+
+
+Here is another one:
+
+```````````````````````````````` example
+[
+foo
+]: /url
+bar
+.
+<p>bar</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because there are
+[non-whitespace characters] after the title:
+
+```````````````````````````````` example
+[foo]: /url "title" ok
+.
+<p>[foo]: /url &quot;title&quot; ok</p>
+````````````````````````````````
+
+
+This is a link reference definition, but it has no title:
+
+```````````````````````````````` example
+[foo]: /url
+"title" ok
+.
+<p>&quot;title&quot; ok</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because it is indented
+four spaces:
+
+```````````````````````````````` example
+ [foo]: /url "title"
+
+[foo]
+.
+<pre><code>[foo]: /url &quot;title&quot;
+</code></pre>
+<p>[foo]</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because it occurs inside
+a code block:
+
+```````````````````````````````` example
+```
+[foo]: /url
+```
+
+[foo]
+.
+<pre><code>[foo]: /url
+</code></pre>
+<p>[foo]</p>
+````````````````````````````````
+
+
+A [link reference definition] cannot interrupt a paragraph.
+
+```````````````````````````````` example
+Foo
+[bar]: /baz
+
+[bar]
+.
+<p>Foo
+[bar]: /baz</p>
+<p>[bar]</p>
+````````````````````````````````
+
+
+However, it can directly follow other block elements, such as headings
+and thematic breaks, and it need not be followed by a blank line.
+
+```````````````````````````````` example
+# [Foo]
+[foo]: /url
+> bar
+.
+<h1><a href="/url">Foo</a></h1>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo]: /url
+bar
+===
+[foo]
+.
+<h1>bar</h1>
+<p><a href="/url">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo]: /url
+===
+[foo]
+.
+<p>===
+<a href="/url">foo</a></p>
+````````````````````````````````
+
+
+Several [link reference definitions]
+can occur one after another, without intervening blank lines.
+
+```````````````````````````````` example
+[foo]: /foo-url "foo"
+[bar]: /bar-url
+ "bar"
+[baz]: /baz-url
+
+[foo],
+[bar],
+[baz]
+.
+<p><a href="/foo-url" title="foo">foo</a>,
+<a href="/bar-url" title="bar">bar</a>,
+<a href="/baz-url">baz</a></p>
+````````````````````````````````
+
+
+[Link reference definitions] can occur
+inside block containers, like lists and block quotations. They
+affect the entire document, not just the container in which they
+are defined:
+
+```````````````````````````````` example
+[foo]
+
+> [foo]: /url
+.
+<p><a href="/url">foo</a></p>
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Whether something is a [link reference definition] is
+independent of whether the link reference it defines is
+used in the document. Thus, for example, the following
+document contains just a link reference definition, and
+no visible content:
+
+```````````````````````````````` example
+[foo]: /url
+.
+````````````````````````````````
+
+
+## Paragraphs
+
+A sequence of non-blank lines that cannot be interpreted as other
+kinds of blocks forms a [paragraph](@).
+The contents of the paragraph are the result of parsing the
+paragraph's raw content as inlines. The paragraph's raw content
+is formed by concatenating the lines and removing initial and final
+[whitespace].
+
+A simple example with two paragraphs:
+
+```````````````````````````````` example
+aaa
+
+bbb
+.
+<p>aaa</p>
+<p>bbb</p>
+````````````````````````````````
+
+
+Paragraphs can contain multiple lines, but no blank lines:
+
+```````````````````````````````` example
+aaa
+bbb
+
+ccc
+ddd
+.
+<p>aaa
+bbb</p>
+<p>ccc
+ddd</p>
+````````````````````````````````
+
+
+Multiple blank lines between paragraph have no effect:
+
+```````````````````````````````` example
+aaa
+
+
+bbb
+.
+<p>aaa</p>
+<p>bbb</p>
+````````````````````````````````
+
+
+Leading spaces are skipped:
+
+```````````````````````````````` example
+ aaa
+ bbb
+.
+<p>aaa
+bbb</p>
+````````````````````````````````
+
+
+Lines after the first may be indented any amount, since indented
+code blocks cannot interrupt paragraphs.
+
+```````````````````````````````` example
+aaa
+ bbb
+ ccc
+.
+<p>aaa
+bbb
+ccc</p>
+````````````````````````````````
+
+
+However, the first line may be indented at most three spaces,
+or an indented code block will be triggered:
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+<p>aaa
+bbb</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+<pre><code>aaa
+</code></pre>
+<p>bbb</p>
+````````````````````````````````
+
+
+Final spaces are stripped before inline parsing, so a paragraph
+that ends with two or more spaces will not end with a [hard line
+break]:
+
+```````````````````````````````` example
+aaa
+bbb
+.
+<p>aaa<br />
+bbb</p>
+````````````````````````````````
+
+
+## Blank lines
+
+[Blank lines] between block-level elements are ignored,
+except for the role they play in determining whether a [list]
+is [tight] or [loose].
+
+Blank lines at the beginning and end of the document are also ignored.
+
+```````````````````````````````` example
+
+
+aaa
+
+
+# aaa
+
+
+.
+<p>aaa</p>
+<h1>aaa</h1>
+````````````````````````````````
+
+<div class="extension">
+
+## Tables (extension)
+
+GFM enables the `table` extension, where an additional leaf block type is
+available.
+
+A [table](@) is an arrangement of data with rows and columns, consisting of a
+single header row, a [delimiter row] separating the header from the data, and
+zero or more data rows.
+
+Each row consists of cells containing arbitrary text, in which [inlines] are
+parsed, separated by pipes (`|`). A leading and trailing pipe is also
+recommended for clarity of reading, and if there's otherwise parsing ambiguity.
+Spaces between pipes and cell content are trimmed. Block-level elements cannot
+be inserted in a table.
+
+The [delimiter row](@) consists of cells whose only content are hyphens (`-`),
+and optionally, a leading or trailing colon (`:`), or both, to indicate left,
+right, or center alignment respectively.
+
+```````````````````````````````` example table
+| foo | bar |
+| --- | --- |
+| baz | bim |
+.
+<table>
+<thead>
+<tr>
+<th>foo</th>
+<th>bar</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>baz</td>
+<td>bim</td>
+</tr>
+</tbody>
+</table>
+````````````````````````````````
+
+Cells in one column don't need to match length, though it's easier to read if
+they are. Likewise, use of leading and trailing pipes may be inconsistent:
+
+```````````````````````````````` example table
+| abc | defghi |
+:-: | -----------:
+bar | baz
+.
+<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>
+````````````````````````````````
+
+Include a pipe in a cell's content by escaping it, including inside other
+inline spans:
+
+```````````````````````````````` example table
+| f\|oo |
+| ------ |
+| b `\|` az |
+| b **\|** im |
+.
+<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>
+````````````````````````````````
+
+The table is broken at the first empty line, or beginning of another
+block-level structure:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar | baz |
+> bar
+.
+<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>
+````````````````````````````````
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar | baz |
+bar
+
+bar
+.
+<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>
+````````````````````````````````
+
+The header row must match the [delimiter row] in the number of cells. If not,
+a table will not be recognized:
+
+```````````````````````````````` example table
+| abc | def |
+| --- |
+| bar |
+.
+<p>| abc | def |
+| --- |
+| bar |</p>
+````````````````````````````````
+
+The remainder of the table's rows may vary in the number of cells. If there
+are a number of cells fewer than the number of cells in the header row, empty
+cells are inserted. If there are greater, the excess is ignored:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar |
+| bar | baz | boo |
+.
+<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>
+````````````````````````````````
+
+If there are no rows in the body, no `<tbody>` is generated in HTML output:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+.
+<table>
+<thead>
+<tr>
+<th>abc</th>
+<th>def</th>
+</tr>
+</thead>
+</table>
+````````````````````````````````
+
+</div>
+
+# Container blocks
+
+A [container block](#container-blocks) is a block that has other
+blocks as its contents. There are two basic kinds of container blocks:
+[block quotes] and [list items].
+[Lists] are meta-containers for [list items].
+
+We define the syntax for container blocks recursively. The general
+form of the definition is:
+
+> If X is a sequence of blocks, then the result of
+> transforming X in such-and-such a way is a container of type Y
+> with these blocks as its content.
+
+So, we explain what counts as a block quote or list item by explaining
+how these can be *generated* from their contents. This should suffice
+to define the syntax, although it does not give a recipe for *parsing*
+these constructions. (A recipe is provided below in the section entitled
+[A parsing strategy](#appendix-a-parsing-strategy).)
+
+## Block quotes
+
+A [block quote marker](@)
+consists of 0-3 spaces of initial indent, plus (a) the character `>` together
+with a following space, or (b) a single character `>` not followed by a space.
+
+The following rules define [block quotes]:
+
+1. **Basic case.** If a string of lines *Ls* constitute a sequence
+ of blocks *Bs*, then the result of prepending a [block quote
+ marker] to the beginning of each line in *Ls*
+ is a [block quote](#block-quotes) containing *Bs*.
+
+2. **Laziness.** If a string of lines *Ls* constitute a [block
+ quote](#block-quotes) with contents *Bs*, then the result of deleting
+ the initial [block quote marker] from one or
+ more lines in which the next [non-whitespace character] after the [block
+ quote marker] is [paragraph continuation
+ text] is a block quote with *Bs* as its content.
+ [Paragraph continuation text](@) is text
+ that will be parsed as part of the content of a paragraph, but does
+ not occur at the beginning of the paragraph.
+
+3. **Consecutiveness.** A document cannot contain two [block
+ quotes] in a row unless there is a [blank line] between them.
+
+Nothing else counts as a [block quote](#block-quotes).
+
+Here is a simple example:
+
+```````````````````````````````` example
+> # Foo
+> bar
+> baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+The spaces after the `>` characters can be omitted:
+
+```````````````````````````````` example
+># Foo
+>bar
+> baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+The `>` characters can be indented 1-3 spaces:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+Four spaces gives us a code block:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+<pre><code>&gt; # Foo
+&gt; bar
+&gt; baz
+</code></pre>
+````````````````````````````````
+
+
+The Laziness clause allows us to omit the `>` before
+[paragraph continuation text]:
+
+```````````````````````````````` example
+> # Foo
+> bar
+baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+A block quote can contain some lazy and some non-lazy
+continuation lines:
+
+```````````````````````````````` example
+> bar
+baz
+> foo
+.
+<blockquote>
+<p>bar
+baz
+foo</p>
+</blockquote>
+````````````````````````````````
+
+
+Laziness only applies to lines that would have been continuations of
+paragraphs had they been prepended with [block quote markers].
+For example, the `> ` cannot be omitted in the second line of
+
+``` markdown
+> foo
+> ---
+```
+
+without changing the meaning:
+
+```````````````````````````````` example
+> foo
+---
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+Similarly, if we omit the `> ` in the second line of
+
+``` markdown
+> - foo
+> - bar
+```
+
+then the block quote ends after the first line:
+
+```````````````````````````````` example
+> - foo
+- bar
+.
+<blockquote>
+<ul>
+<li>foo</li>
+</ul>
+</blockquote>
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+For the same reason, we can't omit the `> ` in front of
+subsequent lines of an indented or fenced code block:
+
+```````````````````````````````` example
+> foo
+ bar
+.
+<blockquote>
+<pre><code>foo
+</code></pre>
+</blockquote>
+<pre><code>bar
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+foo
+```
+.
+<blockquote>
+<pre><code></code></pre>
+</blockquote>
+<p>foo</p>
+<pre><code></code></pre>
+````````````````````````````````
+
+
+Note that in the following case, we have a [lazy
+continuation line]:
+
+```````````````````````````````` example
+> foo
+ - bar
+.
+<blockquote>
+<p>foo
+- bar</p>
+</blockquote>
+````````````````````````````````
+
+
+To see why, note that in
+
+```markdown
+> foo
+> - bar
+```
+
+the `- bar` is indented too far to start a list, and can't
+be an indented code block because indented code blocks cannot
+interrupt paragraphs, so it is [paragraph continuation text].
+
+A block quote can be empty:
+
+```````````````````````````````` example
+>
+.
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+>
+>
+>
+.
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+A block quote can have initial or final blank lines:
+
+```````````````````````````````` example
+>
+> foo
+>
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+````````````````````````````````
+
+
+A blank line always separates block quotes:
+
+```````````````````````````````` example
+> foo
+
+> bar
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+(Most current Markdown implementations, including John Gruber's
+original `Markdown.pl`, will parse this example as a single block quote
+with two paragraphs. But it seems better to allow the author to decide
+whether two block quotes or one are wanted.)
+
+Consecutiveness means that if we put these block quotes together,
+we get a single block quote:
+
+```````````````````````````````` example
+> foo
+> bar
+.
+<blockquote>
+<p>foo
+bar</p>
+</blockquote>
+````````````````````````````````
+
+
+To get a block quote with two paragraphs, use:
+
+```````````````````````````````` example
+> foo
+>
+> bar
+.
+<blockquote>
+<p>foo</p>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+Block quotes can interrupt paragraphs:
+
+```````````````````````````````` example
+foo
+> bar
+.
+<p>foo</p>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+In general, blank lines are not needed before or after block
+quotes:
+
+```````````````````````````````` example
+> aaa
+***
+> bbb
+.
+<blockquote>
+<p>aaa</p>
+</blockquote>
+<hr />
+<blockquote>
+<p>bbb</p>
+</blockquote>
+````````````````````````````````
+
+
+However, because of laziness, a blank line is needed between
+a block quote and a following paragraph:
+
+```````````````````````````````` example
+> bar
+baz
+.
+<blockquote>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+
+baz
+.
+<blockquote>
+<p>bar</p>
+</blockquote>
+<p>baz</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+>
+baz
+.
+<blockquote>
+<p>bar</p>
+</blockquote>
+<p>baz</p>
+````````````````````````````````
+
+
+It is a consequence of the Laziness rule that any number
+of initial `>`s may be omitted on a continuation line of a
+nested block quote:
+
+```````````````````````````````` example
+> > > foo
+bar
+.
+<blockquote>
+<blockquote>
+<blockquote>
+<p>foo
+bar</p>
+</blockquote>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+>>> foo
+> bar
+>>baz
+.
+<blockquote>
+<blockquote>
+<blockquote>
+<p>foo
+bar
+baz</p>
+</blockquote>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+When including an indented code block in a block quote,
+remember that the [block quote marker] includes
+both the `>` and a following space. So *five spaces* are needed after
+the `>`:
+
+```````````````````````````````` example
+> code
+
+> not code
+.
+<blockquote>
+<pre><code>code
+</code></pre>
+</blockquote>
+<blockquote>
+<p>not code</p>
+</blockquote>
+````````````````````````````````
+
+
+
+## List items
+
+A [list marker](@) is a
+[bullet list marker] or an [ordered list marker].
+
+A [bullet list marker](@)
+is a `-`, `+`, or `*` character.
+
+An [ordered list marker](@)
+is a sequence of 1--9 arabic digits (`0-9`), followed by either a
+`.` character or a `)` character. (The reason for the length
+limit is that with 10 digits we start seeing integer overflows
+in some browsers.)
+
+The following rules define [list items]:
+
+1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of
+ blocks *Bs* starting with a [non-whitespace character], and *M* is a
+ list marker of width *W* followed by 1 ≤ *N* ≤ 4 spaces, then the result
+ of prepending *M* and the following spaces to the first line of
+ *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a
+ list item with *Bs* as its contents. The type of the list item
+ (bullet or ordered) is determined by the type of its list marker.
+ If the list item is ordered, then it is also assigned a start
+ number, based on the ordered list marker.
+
+ Exceptions:
+
+ 1. When the first list item in a [list] interrupts
+ a paragraph---that is, when it starts on a line that would
+ otherwise count as [paragraph continuation text]---then (a)
+ the lines *Ls* must not begin with a blank line, and (b) if
+ the list item is ordered, the start number must be 1.
+ 2. If any line is a [thematic break][thematic breaks] then
+ that line is not a list item.
+
+For example, let *Ls* be the lines
+
+```````````````````````````````` example
+A paragraph
+with two lines.
+
+ indented code
+
+> A block quote.
+.
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+````````````````````````````````
+
+
+And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says
+that the following is an ordered list item with start number 1,
+and the same contents as *Ls*:
+
+```````````````````````````````` example
+1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+The most important thing to notice is that the position of
+the text after the list marker determines how much indentation
+is needed in subsequent blocks in the list item. If the list
+marker takes up two spaces, and there are three spaces between
+the list marker and the next [non-whitespace character], then blocks
+must be indented five spaces in order to fall under the list
+item.
+
+Here are some examples showing how far content must be indented to be
+put under the list item:
+
+```````````````````````````````` example
+- one
+
+ two
+.
+<ul>
+<li>one</li>
+</ul>
+<p>two</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- one
+
+ two
+.
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+<ul>
+<li>one</li>
+</ul>
+<pre><code> two
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+It is tempting to think of this in terms of columns: the continuation
+blocks must be indented at least to the column of the first
+[non-whitespace character] after the list marker. However, that is not quite right.
+The spaces after the list marker determine how much relative indentation
+is needed. Which column this indentation reaches will depend on
+how the list item is embedded in other constructions, as shown by
+this example:
+
+```````````````````````````````` example
+ > > 1. one
+>>
+>> two
+.
+<blockquote>
+<blockquote>
+<ol>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ol>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Here `two` occurs in the same column as the list marker `1.`,
+but is actually contained in the list item, because there is
+sufficient indentation after the last containing blockquote marker.
+
+The converse is also possible. In the following example, the word `two`
+occurs far to the right of the initial text of the list item, `one`, but
+it is not considered part of the list item, because it is not indented
+far enough past the blockquote marker:
+
+```````````````````````````````` example
+>>- one
+>>
+ > > two
+.
+<blockquote>
+<blockquote>
+<ul>
+<li>one</li>
+</ul>
+<p>two</p>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Note that at least one space is needed between the list marker and
+any following content, so these are not list items:
+
+```````````````````````````````` example
+-one
+
+2.two
+.
+<p>-one</p>
+<p>2.two</p>
+````````````````````````````````
+
+
+A list item may contain blocks that are separated by more than
+one blank line.
+
+```````````````````````````````` example
+- foo
+
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+A list item may contain any kind of block:
+
+```````````````````````````````` example
+1. foo
+
+ ```
+ bar
+ ```
+
+ baz
+
+ > bam
+.
+<ol>
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+<p>baz</p>
+<blockquote>
+<p>bam</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+A list item that contains an indented code block will preserve
+empty lines within the code block verbatim.
+
+```````````````````````````````` example
+- Foo
+
+ bar
+
+
+ baz
+.
+<ul>
+<li>
+<p>Foo</p>
+<pre><code>bar
+
+
+baz
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+Note that ordered list start numbers must be nine digits or less:
+
+```````````````````````````````` example
+123456789. ok
+.
+<ol start="123456789">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1234567890. not ok
+.
+<p>1234567890. not ok</p>
+````````````````````````````````
+
+
+A start number may begin with 0s:
+
+```````````````````````````````` example
+0. ok
+.
+<ol start="0">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+```````````````````````````````` example
+003. ok
+.
+<ol start="3">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+A start number may not be negative:
+
+```````````````````````````````` example
+-1. not ok
+.
+<p>-1. not ok</p>
+````````````````````````````````
+
+
+
+2. **Item starting with indented code.** If a sequence of lines *Ls*
+ constitute a sequence of blocks *Bs* starting with an indented code
+ block, and *M* is a list marker of width *W* followed by
+ one space, then the result of prepending *M* and the following
+ space to the first line of *Ls*, and indenting subsequent lines of
+ *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+An indented code block will have to be indented four spaces beyond
+the edge of the region where text will be included in the list item.
+In the following case that is 6 spaces:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+
+And in this case it is 11 spaces:
+
+```````````````````````````````` example
+ 10. foo
+
+ bar
+.
+<ol start="10">
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+If the *first* block in the list item is an indented code block,
+then by rule #2, the contents must be indented *one* space after the
+list marker:
+
+```````````````````````````````` example
+ indented code
+
+paragraph
+
+ more code
+.
+<pre><code>indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+<ol>
+<li>
+<pre><code>indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+Note that an additional space indent is interpreted as space
+inside the code block:
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+<ol>
+<li>
+<pre><code> indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+Note that rules #1 and #2 only apply to two cases: (a) cases
+in which the lines to be included in a list item begin with a
+[non-whitespace character], and (b) cases in which
+they begin with an indented code
+block. In a case like the following, where the first block begins with
+a three-space indent, the rules do not allow us to form a list item by
+indenting the whole thing and prepending a list marker:
+
+```````````````````````````````` example
+ foo
+
+bar
+.
+<p>foo</p>
+<p>bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>foo</li>
+</ul>
+<p>bar</p>
+````````````````````````````````
+
+
+This is not a significant restriction, because when a block begins
+with 1-3 spaces indent, the indentation can always be removed without
+a change in interpretation, allowing rule #1 to be applied. So, in
+the above case:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+3. **Item starting with a blank line.** If a sequence of lines *Ls*
+ starting with a single [blank line] constitute a (possibly empty)
+ sequence of blocks *Bs*, not separated from each other by more than
+ one blank line, and *M* is a list marker of width *W*,
+ then the result of prepending *M* to the first line of *Ls*, and
+ indenting subsequent lines of *Ls* by *W + 1* spaces, is a list
+ item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+Here are some list items that start with a blank line but are not empty:
+
+```````````````````````````````` example
+-
+ foo
+-
+ ```
+ bar
+ ```
+-
+ baz
+.
+<ul>
+<li>foo</li>
+<li>
+<pre><code>bar
+</code></pre>
+</li>
+<li>
+<pre><code>baz
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+When the list item starts with a blank line, the number of spaces
+following the list marker doesn't change the required indentation:
+
+```````````````````````````````` example
+-
+ foo
+.
+<ul>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+
+A list item can begin with at most one blank line.
+In the following example, `foo` is not part of the list
+item:
+
+```````````````````````````````` example
+-
+
+ foo
+.
+<ul>
+<li></li>
+</ul>
+<p>foo</p>
+````````````````````````````````
+
+
+Here is an empty bullet list item:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+<ul>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+It does not matter whether there are spaces following the [list marker]:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+<ul>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+Here is an empty ordered list item:
+
+```````````````````````````````` example
+1. foo
+2.
+3. bar
+.
+<ol>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ol>
+````````````````````````````````
+
+
+A list may start or end with an empty list item:
+
+```````````````````````````````` example
+*
+.
+<ul>
+<li></li>
+</ul>
+````````````````````````````````
+
+However, an empty list item cannot interrupt a paragraph:
+
+```````````````````````````````` example
+foo
+*
+
+foo
+1.
+.
+<p>foo
+*</p>
+<p>foo
+1.</p>
+````````````````````````````````
+
+
+4. **Indentation.** If a sequence of lines *Ls* constitutes a list item
+ according to rule #1, #2, or #3, then the result of indenting each line
+ of *Ls* by 1-3 spaces (the same for each line) also constitutes a
+ list item with the same contents and attributes. If a line is
+ empty, then it need not be indented.
+
+Indented one space:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indented two spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indented three spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Four spaces indent gives a code block:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<pre><code>1. A paragraph
+ with two lines.
+
+ indented code
+
+ &gt; A block quote.
+</code></pre>
+````````````````````````````````
+
+
+
+5. **Laziness.** If a string of lines *Ls* constitute a [list
+ item](#list-items) with contents *Bs*, then the result of deleting
+ some or all of the indentation from one or more lines in which the
+ next [non-whitespace character] after the indentation is
+ [paragraph continuation text] is a
+ list item with the same contents and attributes. The unindented
+ lines are called
+ [lazy continuation line](@)s.
+
+Here is an example with [lazy continuation lines]:
+
+```````````````````````````````` example
+ 1. A paragraph
+with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indentation can be partially deleted:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+.
+<ol>
+<li>A paragraph
+with two lines.</li>
+</ol>
+````````````````````````````````
+
+
+These examples show how laziness can work in nested structures:
+
+```````````````````````````````` example
+> 1. > Blockquote
+continued here.
+.
+<blockquote>
+<ol>
+<li>
+<blockquote>
+<p>Blockquote
+continued here.</p>
+</blockquote>
+</li>
+</ol>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> 1. > Blockquote
+> continued here.
+.
+<blockquote>
+<ol>
+<li>
+<blockquote>
+<p>Blockquote
+continued here.</p>
+</blockquote>
+</li>
+</ol>
+</blockquote>
+````````````````````````````````
+
+
+
+6. **That's all.** Nothing that is not counted as a list item by rules
+ #1--5 counts as a [list item](#list-items).
+
+The rules for sublists follow from the general rules
+[above][List items]. A sublist must be indented the same number
+of spaces a paragraph would need to be in order to be included
+in the list item.
+
+So, in this case we need two spaces indent:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>baz
+<ul>
+<li>boo</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+One is not enough:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+<li>baz</li>
+<li>boo</li>
+</ul>
+````````````````````````````````
+
+
+Here we need four, because the list marker is wider:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+<ol start="10">
+<li>foo
+<ul>
+<li>bar</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+Three is not enough:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+<ol start="10">
+<li>foo</li>
+</ol>
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+A list may be the first block in a list item:
+
+```````````````````````````````` example
+- - foo
+.
+<ul>
+<li>
+<ul>
+<li>foo</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. - 2. foo
+.
+<ol>
+<li>
+<ul>
+<li>
+<ol start="2">
+<li>foo</li>
+</ol>
+</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+A list item can contain a heading:
+
+```````````````````````````````` example
+- # Foo
+- Bar
+ ---
+ baz
+.
+<ul>
+<li>
+<h1>Foo</h1>
+</li>
+<li>
+<h2>Bar</h2>
+baz</li>
+</ul>
+````````````````````````````````
+
+
+### Motivation
+
+John Gruber's Markdown spec says the following about list items:
+
+1. "List markers typically start at the left margin, but may be indented
+ by up to three spaces. List markers must be followed by one or more
+ spaces or a tab."
+
+2. "To make lists look nice, you can wrap items with hanging indents....
+ But if you don't want to, you don't have to."
+
+3. "List items may consist of multiple paragraphs. Each subsequent
+ paragraph in a list item must be indented by either 4 spaces or one
+ tab."
+
+4. "It looks nice if you indent every line of the subsequent paragraphs,
+ but here again, Markdown will allow you to be lazy."
+
+5. "To put a blockquote within a list item, the blockquote's `>`
+ delimiters need to be indented."
+
+6. "To put a code block within a list item, the code block needs to be
+ indented twice — 8 spaces or two tabs."
+
+These rules specify that a paragraph under a list item must be indented
+four spaces (presumably, from the left margin, rather than the start of
+the list marker, but this is not said), and that code under a list item
+must be indented eight spaces instead of the usual four. They also say
+that a block quote must be indented, but not by how much; however, the
+example given has four spaces indentation. Although nothing is said
+about other kinds of block-level content, it is certainly reasonable to
+infer that *all* block elements under a list item, including other
+lists, must be indented four spaces. This principle has been called the
+*four-space rule*.
+
+The four-space rule is clear and principled, and if the reference
+implementation `Markdown.pl` had followed it, it probably would have
+become the standard. However, `Markdown.pl` allowed paragraphs and
+sublists to start with only two spaces indentation, at least on the
+outer level. Worse, its behavior was inconsistent: a sublist of an
+outer-level list needed two spaces indentation, but a sublist of this
+sublist needed three spaces. It is not surprising, then, that different
+implementations of Markdown have developed very different rules for
+determining what comes under a list item. (Pandoc and python-Markdown,
+for example, stuck with Gruber's syntax description and the four-space
+rule, while discount, redcarpet, marked, PHP Markdown, and others
+followed `Markdown.pl`'s behavior more closely.)
+
+Unfortunately, given the divergences between implementations, there
+is no way to give a spec for list items that will be guaranteed not
+to break any existing documents. However, the spec given here should
+correctly handle lists formatted with either the four-space rule or
+the more forgiving `Markdown.pl` behavior, provided they are laid out
+in a way that is natural for a human to read.
+
+The strategy here is to let the width and indentation of the list marker
+determine the indentation necessary for blocks to fall under the list
+item, rather than having a fixed and arbitrary number. The writer can
+think of the body of the list item as a unit which gets indented to the
+right enough to fit the list marker (and any indentation on the list
+marker). (The laziness rule, #5, then allows continuation lines to be
+unindented if needed.)
+
+This rule is superior, we claim, to any rule requiring a fixed level of
+indentation from the margin. The four-space rule is clear but
+unnatural. It is quite unintuitive that
+
+``` markdown
+- foo
+
+ bar
+
+ - baz
+```
+
+should be parsed as two lists with an intervening paragraph,
+
+``` html
+<ul>
+<li>foo</li>
+</ul>
+<p>bar</p>
+<ul>
+<li>baz</li>
+</ul>
+```
+
+as the four-space rule demands, rather than a single list,
+
+``` html
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+<ul>
+<li>baz</li>
+</ul>
+</li>
+</ul>
+```
+
+The choice of four spaces is arbitrary. It can be learned, but it is
+not likely to be guessed, and it trips up beginners regularly.
+
+Would it help to adopt a two-space rule? The problem is that such
+a rule, together with the rule allowing 1--3 spaces indentation of the
+initial list marker, allows text that is indented *less than* the
+original list marker to be included in the list item. For example,
+`Markdown.pl` parses
+
+``` markdown
+ - one
+
+ two
+```
+
+as a single list item, with `two` a continuation paragraph:
+
+``` html
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+```
+
+and similarly
+
+``` markdown
+> - one
+>
+> two
+```
+
+as
+
+``` html
+<blockquote>
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+</blockquote>
+```
+
+This is extremely unintuitive.
+
+Rather than requiring a fixed indent from the margin, we could require
+a fixed indent (say, two spaces, or even one space) from the list marker (which
+may itself be indented). This proposal would remove the last anomaly
+discussed. Unlike the spec presented above, it would count the following
+as a list item with a subparagraph, even though the paragraph `bar`
+is not indented as far as the first paragraph `foo`:
+
+``` markdown
+ 10. foo
+
+ bar
+```
+
+Arguably this text does read like a list item with `bar` as a subparagraph,
+which may count in favor of the proposal. However, on this proposal indented
+code would have to be indented six spaces after the list marker. And this
+would break a lot of existing Markdown, which has the pattern:
+
+``` markdown
+1. foo
+
+ indented code
+```
+
+where the code is indented eight spaces. The spec above, by contrast, will
+parse this text as expected, since the code block's indentation is measured
+from the beginning of `foo`.
+
+The one case that needs special treatment is a list item that *starts*
+with indented code. How much indentation is required in that case, since
+we don't have a "first paragraph" to measure from? Rule #2 simply stipulates
+that in such cases, we require one space indentation from the list marker
+(and then the normal four spaces for the indented code). This will match the
+four-space rule in cases where the list marker plus its initial indentation
+takes four spaces (a common case), but diverge in other cases.
+
+<div class="extension">
+
+## Task list items (extension)
+
+GFM enables the `tasklist` extension, where an additional processing step is
+performed on [list items].
+
+A [task list item](@) is a [list item][list items] where the first block in it
+is a paragraph which begins with a [task list item marker] and at least one
+whitespace character before any other content.
+
+A [task list item marker](@) consists of an optional number of spaces, a left
+bracket (`[`), either a whitespace character or the letter `x` in either
+lowercase or uppercase, and then a right bracket (`]`).
+
+When rendered, the [task list item marker] is replaced with a semantic checkbox element;
+in an HTML output, this would be an `<input type="checkbox">` element.
+
+If the character between the brackets is a whitespace character, the checkbox
+is unchecked. Otherwise, the checkbox is checked.
+
+This spec does not define how the checkbox elements are interacted with: in practice,
+implementors are free to render the checkboxes as disabled or inmutable elements,
+or they may dynamically handle dynamic interactions (i.e. checking, unchecking) in
+the final rendered document.
+
+```````````````````````````````` example disabled
+- [ ] foo
+- [x] bar
+.
+<ul>
+<li><input disabled="" type="checkbox"> foo</li>
+<li><input checked="" disabled="" type="checkbox"> bar</li>
+</ul>
+````````````````````````````````
+
+Task lists can be arbitrarily nested:
+
+```````````````````````````````` example disabled
+- [x] foo
+ - [ ] bar
+ - [x] baz
+- [ ] bim
+.
+<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>
+````````````````````````````````
+
+</div>
+
+## Lists
+
+A [list](@) is a sequence of one or more
+list items [of the same type]. The list items
+may be separated by any number of blank lines.
+
+Two list items are [of the same type](@)
+if they begin with a [list marker] of the same type.
+Two list markers are of the
+same type if (a) they are bullet list markers using the same character
+(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same
+delimiter (either `.` or `)`).
+
+A list is an [ordered list](@)
+if its constituent list items begin with
+[ordered list markers], and a
+[bullet list](@) if its constituent list
+items begin with [bullet list markers].
+
+The [start number](@)
+of an [ordered list] is determined by the list number of
+its initial list item. The numbers of subsequent list items are
+disregarded.
+
+A list is [loose](@) if any of its constituent
+list items are separated by blank lines, or if any of its constituent
+list items directly contain two block-level elements with a blank line
+between them. Otherwise a list is [tight](@).
+(The difference in HTML output is that paragraphs in a loose list are
+wrapped in `<p>` tags, while paragraphs in a tight list are not.)
+
+Changing the bullet or ordered list delimiter starts a new list:
+
+```````````````````````````````` example
+- foo
+- bar
++ baz
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+</ul>
+<ul>
+<li>baz</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. foo
+2. bar
+3) baz
+.
+<ol>
+<li>foo</li>
+<li>bar</li>
+</ol>
+<ol start="3">
+<li>baz</li>
+</ol>
+````````````````````````````````
+
+
+In CommonMark, a list can interrupt a paragraph. That is,
+no blank line is needed to separate a paragraph from a following
+list:
+
+```````````````````````````````` example
+Foo
+- bar
+- baz
+.
+<p>Foo</p>
+<ul>
+<li>bar</li>
+<li>baz</li>
+</ul>
+````````````````````````````````
+
+`Markdown.pl` does not allow this, through fear of triggering a list
+via a numeral in a hard-wrapped line:
+
+``` markdown
+The number of windows in my house is
+14. The number of doors is 6.
+```
+
+Oddly, though, `Markdown.pl` *does* allow a blockquote to
+interrupt a paragraph, even though the same considerations might
+apply.
+
+In CommonMark, we do allow lists to interrupt paragraphs, for
+two reasons. First, it is natural and not uncommon for people
+to start lists without blank lines:
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+Second, we are attracted to a
+
+> [principle of uniformity](@):
+> if a chunk of text has a certain
+> meaning, it will continue to have the same meaning when put into a
+> container block (such as a list item or blockquote).
+
+(Indeed, the spec for [list items] and [block quotes] presupposes
+this principle.) This principle implies that if
+
+``` markdown
+ * I need to buy
+ - new shoes
+ - a coat
+ - a plane ticket
+```
+
+is a list item containing a paragraph followed by a nested sublist,
+as all Markdown implementations agree it is (though the paragraph
+may be rendered without `<p>` tags, since the list is "tight"),
+then
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+by itself should be a paragraph followed by a nested sublist.
+
+Since it is well established Markdown practice to allow lists to
+interrupt paragraphs inside list items, the [principle of
+uniformity] requires us to allow this outside list items as
+well. ([reStructuredText](http://docutils.sourceforge.net/rst.html)
+takes a different approach, requiring blank lines before lists
+even inside other list items.)
+
+In order to solve of unwanted lists in paragraphs with
+hard-wrapped numerals, we allow only lists starting with `1` to
+interrupt paragraphs. Thus,
+
+```````````````````````````````` example
+The number of windows in my house is
+14. The number of doors is 6.
+.
+<p>The number of windows in my house is
+14. The number of doors is 6.</p>
+````````````````````````````````
+
+We may still get an unintended result in cases like
+
+```````````````````````````````` example
+The number of windows in my house is
+1. The number of doors is 6.
+.
+<p>The number of windows in my house is</p>
+<ol>
+<li>The number of doors is 6.</li>
+</ol>
+````````````````````````````````
+
+but this rule should prevent most spurious list captures.
+
+There can be any number of blank lines between items:
+
+```````````````````````````````` example
+- foo
+
+- bar
+
+
+- baz
+.
+<ul>
+<li>
+<p>foo</p>
+</li>
+<li>
+<p>bar</p>
+</li>
+<li>
+<p>baz</p>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+
+
+ bim
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>
+<p>baz</p>
+<p>bim</p>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+To separate consecutive lists of the same type, or to separate a
+list from an indented code block that would otherwise be parsed
+as a subparagraph of the final list item, you can insert a blank HTML
+comment:
+
+```````````````````````````````` example
+- foo
+- bar
+
+<!-- -->
+
+- baz
+- bim
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+</ul>
+<!-- -->
+<ul>
+<li>baz</li>
+<li>bim</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+
+ notcode
+
+- foo
+
+<!-- -->
+
+ code
+.
+<ul>
+<li>
+<p>foo</p>
+<p>notcode</p>
+</li>
+<li>
+<p>foo</p>
+</li>
+</ul>
+<!-- -->
+<pre><code>code
+</code></pre>
+````````````````````````````````
+
+
+List items need not be indented to the same level. The following
+list items will be treated as items at the same list level,
+since none is indented enough to belong to the previous list
+item:
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+ - d
+ - e
+ - f
+- g
+.
+<ul>
+<li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d</li>
+<li>e</li>
+<li>f</li>
+<li>g</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. a
+
+ 2. b
+
+ 3. c
+.
+<ol>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>c</p>
+</li>
+</ol>
+````````````````````````````````
+
+Note, however, that list items may not be indented more than
+three spaces. Here `- e` is treated as a paragraph continuation
+line, because it is indented more than three spaces:
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+ - d
+ - e
+.
+<ul>
+<li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d
+- e</li>
+</ul>
+````````````````````````````````
+
+And here, `3. c` is treated as in indented code block,
+because it is indented four spaces and preceded by a
+blank line.
+
+```````````````````````````````` example
+1. a
+
+ 2. b
+
+ 3. c
+.
+<ol>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+</ol>
+<pre><code>3. c
+</code></pre>
+````````````````````````````````
+
+
+This is a loose list, because there is a blank line between
+two of the list items:
+
+```````````````````````````````` example
+- a
+- b
+
+- c
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>c</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+So is this, with a empty second item:
+
+```````````````````````````````` example
+* a
+*
+
+* c
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li></li>
+<li>
+<p>c</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+These are loose lists, even though there is no space between the items,
+because one of the items directly contains two block-level elements
+with a blank line between them:
+
+```````````````````````````````` example
+- a
+- b
+
+ c
+- d
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+<p>c</p>
+</li>
+<li>
+<p>d</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+- b
+
+ [ref]: /url
+- d
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>d</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank lines are in a code block:
+
+```````````````````````````````` example
+- a
+- ```
+ b
+
+
+ ```
+- c
+.
+<ul>
+<li>a</li>
+<li>
+<pre><code>b
+
+
+</code></pre>
+</li>
+<li>c</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank line is between two
+paragraphs of a sublist. So the sublist is loose while
+the outer list is tight:
+
+```````````````````````````````` example
+- a
+ - b
+
+ c
+- d
+.
+<ul>
+<li>a
+<ul>
+<li>
+<p>b</p>
+<p>c</p>
+</li>
+</ul>
+</li>
+<li>d</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank line is inside the
+block quote:
+
+```````````````````````````````` example
+* a
+ > b
+ >
+* c
+.
+<ul>
+<li>a
+<blockquote>
+<p>b</p>
+</blockquote>
+</li>
+<li>c</li>
+</ul>
+````````````````````````````````
+
+
+This list is tight, because the consecutive block elements
+are not separated by blank lines:
+
+```````````````````````````````` example
+- a
+ > b
+ ```
+ c
+ ```
+- d
+.
+<ul>
+<li>a
+<blockquote>
+<p>b</p>
+</blockquote>
+<pre><code>c
+</code></pre>
+</li>
+<li>d</li>
+</ul>
+````````````````````````````````
+
+
+A single-paragraph list is tight:
+
+```````````````````````````````` example
+- a
+.
+<ul>
+<li>a</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+.
+<ul>
+<li>a
+<ul>
+<li>b</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+This list is loose, because of the blank line between the
+two block elements in the list item:
+
+```````````````````````````````` example
+1. ```
+ foo
+ ```
+
+ bar
+.
+<ol>
+<li>
+<pre><code>foo
+</code></pre>
+<p>bar</p>
+</li>
+</ol>
+````````````````````````````````
+
+
+Here the outer list is loose, the inner list tight:
+
+```````````````````````````````` example
+* foo
+ * bar
+
+ baz
+.
+<ul>
+<li>
+<p>foo</p>
+<ul>
+<li>bar</li>
+</ul>
+<p>baz</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+
+- d
+ - e
+ - f
+.
+<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>
+````````````````````````````````
+
+
+# Inlines
+
+Inlines are parsed sequentially from the beginning of the character
+stream to the end (left to right, in left-to-right languages).
+Thus, for example, in
+
+```````````````````````````````` example
+`hi`lo`
+.
+<p><code>hi</code>lo`</p>
+````````````````````````````````
+
+`hi` is parsed as code, leaving the backtick at the end as a literal
+backtick.
+
+
+## Backslash escapes
+
+Any ASCII punctuation character may be backslash-escaped:
+
+```````````````````````````````` example
+\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
+.
+<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
+````````````````````````````````
+
+
+Backslashes before other characters are treated as literal
+backslashes:
+
+```````````````````````````````` example
+\→\A\a\ \3\φ\«
+.
+<p>\→\A\a\ \3\φ\«</p>
+````````````````````````````````
+
+
+Escaped characters are treated as regular characters and do
+not have their usual Markdown meanings:
+
+```````````````````````````````` example
+\*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
+.
+<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>
+````````````````````````````````
+
+
+If a backslash is itself escaped, the following character is not:
+
+```````````````````````````````` example
+\\*emphasis*
+.
+<p>\<em>emphasis</em></p>
+````````````````````````````````
+
+
+A backslash at the end of the line is a [hard line break]:
+
+```````````````````````````````` example
+foo\
+bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+Backslash escapes do not work in code blocks, code spans, autolinks, or
+raw HTML:
+
+```````````````````````````````` example
+`` \[\` ``
+.
+<p><code>\[\`</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ \[\]
+.
+<pre><code>\[\]
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+\[\]
+~~~
+.
+<pre><code>\[\]
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://example.com?find=\*>
+.
+<p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="/bar\/)">
+.
+<a href="/bar\/)">
+````````````````````````````````
+
+
+But they work in all other contexts, including URLs and link titles,
+link references, and [info strings] in [fenced code blocks]:
+
+```````````````````````````````` example
+[foo](/bar\* "ti\*tle")
+.
+<p><a href="/bar*" title="ti*tle">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /bar\* "ti\*tle"
+.
+<p><a href="/bar*" title="ti*tle">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+``` foo\+bar
+foo
+```
+.
+<pre><code class="language-foo+bar">foo
+</code></pre>
+````````````````````````````````
+
+
+
+## Entity and numeric character references
+
+Valid HTML entity references and numeric character references
+can be used in place of the corresponding Unicode character,
+with the following exceptions:
+
+- Entity and character references are not recognized in code
+ blocks and code spans.
+
+- Entity and character references cannot stand in place of
+ special characters that define structural elements in
+ CommonMark. For example, although `&#42;` can be used
+ in place of a literal `*` character, `&#42;` cannot replace
+ `*` in emphasis delimiters, bullet list markers, or thematic
+ breaks.
+
+Conforming CommonMark parsers need not store information about
+whether a particular character was represented in the source
+using a Unicode character or an entity reference.
+
+[Entity references](@) consist of `&` + any of the valid
+HTML5 entity names + `;`. The
+document <https://html.spec.whatwg.org/multipage/entities.json>
+is used as an authoritative source for the valid entity
+references and their corresponding code points.
+
+```````````````````````````````` example
+&nbsp; &amp; &copy; &AElig; &Dcaron;
+&frac34; &HilbertSpace; &DifferentialD;
+&ClockwiseContourIntegral; &ngE;
+.
+<p>  &amp; © Æ Ď
+¾ ℋ ⅆ
+∲ ≧̸</p>
+````````````````````````````````
+
+
+[Decimal numeric character
+references](@)
+consist of `&#` + a string of 1--7 arabic digits + `;`. A
+numeric character reference is parsed as the corresponding
+Unicode character. Invalid Unicode code points will be replaced by
+the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons,
+the code point `U+0000` will also be replaced by `U+FFFD`.
+
+```````````````````````````````` example
+&#35; &#1234; &#992; &#0;
+.
+<p># Ӓ Ϡ �</p>
+````````````````````````````````
+
+
+[Hexadecimal numeric character
+references](@) consist of `&#` +
+either `X` or `x` + a string of 1-6 hexadecimal digits + `;`.
+They too are parsed as the corresponding Unicode character (this
+time specified with a hexadecimal numeral instead of decimal).
+
+```````````````````````````````` example
+&#X22; &#XD06; &#xcab;
+.
+<p>&quot; ആ ಫ</p>
+````````````````````````````````
+
+
+Here are some nonentities:
+
+```````````````````````````````` example
+&nbsp &x; &#; &#x;
+&#987654321;
+&#abcdef0;
+&ThisIsNotDefined; &hi?;
+.
+<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
+&amp;#987654321;
+&amp;#abcdef0;
+&amp;ThisIsNotDefined; &amp;hi?;</p>
+````````````````````````````````
+
+
+Although HTML5 does accept some entity references
+without a trailing semicolon (such as `&copy`), these are not
+recognized here, because it makes the grammar too ambiguous:
+
+```````````````````````````````` example
+&copy
+.
+<p>&amp;copy</p>
+````````````````````````````````
+
+
+Strings that are not on the list of HTML5 named entities are not
+recognized as entity references either:
+
+```````````````````````````````` example
+&MadeUpEntity;
+.
+<p>&amp;MadeUpEntity;</p>
+````````````````````````````````
+
+
+Entity and numeric character references are recognized in any
+context besides code spans or code blocks, including
+URLs, [link titles], and [fenced code block][] [info strings]:
+
+```````````````````````````````` example
+<a href="&ouml;&ouml;.html">
+.
+<a href="&ouml;&ouml;.html">
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo](/f&ouml;&ouml; "f&ouml;&ouml;")
+.
+<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
+.
+<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+``` f&ouml;&ouml;
+foo
+```
+.
+<pre><code class="language-föö">foo
+</code></pre>
+````````````````````````````````
+
+
+Entity and numeric character references are treated as literal
+text in code spans and code blocks:
+
+```````````````````````````````` example
+`f&ouml;&ouml;`
+.
+<p><code>f&amp;ouml;&amp;ouml;</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ f&ouml;f&ouml;
+.
+<pre><code>f&amp;ouml;f&amp;ouml;
+</code></pre>
+````````````````````````````````
+
+
+Entity and numeric character references cannot be used
+in place of symbols indicating structure in CommonMark
+documents.
+
+```````````````````````````````` example
+&#42;foo&#42;
+*foo*
+.
+<p>*foo*
+<em>foo</em></p>
+````````````````````````````````
+
+```````````````````````````````` example
+&#42; foo
+
+* foo
+.
+<p>* foo</p>
+<ul>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+foo&#10;&#10;bar
+.
+<p>foo
+
+bar</p>
+````````````````````````````````
+
+```````````````````````````````` example
+&#9;foo
+.
+<p>→foo</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[a](url &quot;tit&quot;)
+.
+<p>[a](url &quot;tit&quot;)</p>
+````````````````````````````````
+
+
+## Code spans
+
+A [backtick string](@)
+is a string of one or more backtick characters (`` ` ``) that is neither
+preceded nor followed by a backtick.
+
+A [code span](@) begins with a backtick string and ends with
+a backtick string of equal length. The contents of the code span are
+the characters between the two backtick strings, normalized in the
+following ways:
+
+- First, [line endings] are converted to [spaces].
+- If the resulting string both begins *and* ends with a [space]
+ character, but does not consist entirely of [space]
+ characters, a single [space] character is removed from the
+ front and back. This allows you to include code that begins
+ or ends with backtick characters, which must be separated by
+ whitespace from the opening or closing backtick strings.
+
+This is a simple code span:
+
+```````````````````````````````` example
+`foo`
+.
+<p><code>foo</code></p>
+````````````````````````````````
+
+
+Here two backticks are used, because the code contains a backtick.
+This example also illustrates stripping of a single leading and
+trailing space:
+
+```````````````````````````````` example
+`` foo ` bar ``
+.
+<p><code>foo ` bar</code></p>
+````````````````````````````````
+
+
+This example shows the motivation for stripping leading and trailing
+spaces:
+
+```````````````````````````````` example
+` `` `
+.
+<p><code>``</code></p>
+````````````````````````````````
+
+Note that only *one* space is stripped:
+
+```````````````````````````````` example
+` `` `
+.
+<p><code> `` </code></p>
+````````````````````````````````
+
+The stripping only happens if the space is on both
+sides of the string:
+
+```````````````````````````````` example
+` a`
+.
+<p><code> a</code></p>
+````````````````````````````````
+
+Only [spaces], and not [unicode whitespace] in general, are
+stripped in this way:
+
+```````````````````````````````` example
+` b `
+.
+<p><code> b </code></p>
+````````````````````````````````
+
+No stripping occurs if the code span contains only spaces:
+
+```````````````````````````````` example
+` `
+` `
+.
+<p><code> </code>
+<code> </code></p>
+````````````````````````````````
+
+
+[Line endings] are treated like spaces:
+
+```````````````````````````````` example
+``
+foo
+bar
+baz
+``
+.
+<p><code>foo bar baz</code></p>
+````````````````````````````````
+
+```````````````````````````````` example
+``
+foo
+``
+.
+<p><code>foo </code></p>
+````````````````````````````````
+
+
+Interior spaces are not collapsed:
+
+```````````````````````````````` example
+`foo bar
+baz`
+.
+<p><code>foo bar baz</code></p>
+````````````````````````````````
+
+Note that browsers will typically collapse consecutive spaces
+when rendering `<code>` elements, so it is recommended that
+the following CSS be used:
+
+ code{white-space: pre-wrap;}
+
+
+Note that backslash escapes do not work in code spans. All backslashes
+are treated literally:
+
+```````````````````````````````` example
+`foo\`bar`
+.
+<p><code>foo\</code>bar`</p>
+````````````````````````````````
+
+
+Backslash escapes are never needed, because one can always choose a
+string of *n* backtick characters as delimiters, where the code does
+not contain any strings of exactly *n* backtick characters.
+
+```````````````````````````````` example
+``foo`bar``
+.
+<p><code>foo`bar</code></p>
+````````````````````````````````
+
+```````````````````````````````` example
+` foo `` bar `
+.
+<p><code>foo `` bar</code></p>
+````````````````````````````````
+
+
+Code span backticks have higher precedence than any other inline
+constructs except HTML tags and autolinks. Thus, for example, this is
+not parsed as emphasized text, since the second `*` is part of a code
+span:
+
+```````````````````````````````` example
+*foo`*`
+.
+<p>*foo<code>*</code></p>
+````````````````````````````````
+
+
+And this is not parsed as a link:
+
+```````````````````````````````` example
+[not a `link](/foo`)
+.
+<p>[not a <code>link](/foo</code>)</p>
+````````````````````````````````
+
+
+Code spans, HTML tags, and autolinks have the same precedence.
+Thus, this is code:
+
+```````````````````````````````` example
+`<a href="`">`
+.
+<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>
+````````````````````````````````
+
+
+But this is an HTML tag:
+
+```````````````````````````````` example
+<a href="`">`
+.
+<p><a href="`">`</p>
+````````````````````````````````
+
+
+And this is code:
+
+```````````````````````````````` example
+`<http://foo.bar.`baz>`
+.
+<p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+````````````````````````````````
+
+
+But this is an autolink:
+
+```````````````````````````````` example
+<http://foo.bar.`baz>`
+.
+<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
+````````````````````````````````
+
+
+When a backtick string is not closed by a matching backtick string,
+we just have literal backticks:
+
+```````````````````````````````` example
+```foo``
+.
+<p>```foo``</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`foo
+.
+<p>`foo</p>
+````````````````````````````````
+
+The following case also illustrates the need for opening and
+closing backtick strings to be equal in length:
+
+```````````````````````````````` example
+`foo``bar``
+.
+<p>`foo<code>bar</code></p>
+````````````````````````````````
+
+
+## Emphasis and strong emphasis
+
+John Gruber's original [Markdown syntax
+description](http://daringfireball.net/projects/markdown/syntax#em) says:
+
+> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
+> emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML
+> `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>`
+> tag.
+
+This is enough for most users, but these rules leave much undecided,
+especially when it comes to nested emphasis. The original
+`Markdown.pl` test suite makes it clear that triple `***` and
+`___` delimiters can be used for strong emphasis, and most
+implementations have also allowed the following patterns:
+
+``` markdown
+***strong emph***
+***strong** in emph*
+***emph* in strong**
+**in strong *emph***
+*in emph **strong***
+```
+
+The following patterns are less widely supported, but the intent
+is clear and they are useful (especially in contexts like bibliography
+entries):
+
+``` markdown
+*emph *with emph* in it*
+**strong **with strong** in it**
+```
+
+Many implementations have also restricted intraword emphasis to
+the `*` forms, to avoid unwanted emphasis in words containing
+internal underscores. (It is best practice to put these in code
+spans, but users often do not.)
+
+``` markdown
+internal emphasis: foo*bar*baz
+no emphasis: foo_bar_baz
+```
+
+The rules given below capture all of these patterns, while allowing
+for efficient parsing strategies that do not backtrack.
+
+First, some definitions. A [delimiter run](@) is either
+a sequence of one or more `*` characters that is not preceded or
+followed by a non-backslash-escaped `*` character, or a sequence
+of one or more `_` characters that is not preceded or followed by
+a non-backslash-escaped `_` character.
+
+A [left-flanking delimiter run](@) is
+a [delimiter run] that is (1) not followed by [Unicode whitespace],
+and either (2a) not followed by a [punctuation character], or
+(2b) followed by a [punctuation character] and
+preceded by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+A [right-flanking delimiter run](@) is
+a [delimiter run] that is (1) not preceded by [Unicode whitespace],
+and either (2a) not preceded by a [punctuation character], or
+(2b) preceded by a [punctuation character] and
+followed by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+Here are some examples of delimiter runs.
+
+ - left-flanking but not right-flanking:
+
+ ```
+ ***abc
+ _abc
+ **"abc"
+ _"abc"
+ ```
+
+ - right-flanking but not left-flanking:
+
+ ```
+ abc***
+ abc_
+ "abc"**
+ "abc"_
+ ```
+
+ - Both left and right-flanking:
+
+ ```
+ abc***def
+ "abc"_"def"
+ ```
+
+ - Neither left nor right-flanking:
+
+ ```
+ abc *** def
+ a _ b
+ ```
+
+(The idea of distinguishing left-flanking and right-flanking
+delimiter runs based on the character before and the character
+after comes from Roopesh Chander's
+[vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags).
+vfmd uses the terminology "emphasis indicator string" instead of "delimiter
+run," and its rules for distinguishing left- and right-flanking runs
+are a bit more complex than the ones given here.)
+
+The following rules define emphasis and strong emphasis:
+
+1. A single `*` character [can open emphasis](@)
+ iff (if and only if) it is part of a [left-flanking delimiter run].
+
+2. A single `_` character [can open emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+3. A single `*` character [can close emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+4. A single `_` character [can close emphasis] iff
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+5. A double `**` [can open strong emphasis](@)
+ iff it is part of a [left-flanking delimiter run].
+
+6. A double `__` [can open strong emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+7. A double `**` [can close strong emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+8. A double `__` [can close strong emphasis] iff
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+9. Emphasis begins with a delimiter that [can open emphasis] and ends
+ with a delimiter that [can close emphasis], and that uses the same
+ character (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both
+ open and close emphasis, then the sum of the lengths of the
+ delimiter runs containing the opening and closing delimiters
+ must not be a multiple of 3 unless both lengths are
+ multiples of 3.
+
+10. Strong emphasis begins with a delimiter that
+ [can open strong emphasis] and ends with a delimiter that
+ [can close strong emphasis], and that uses the same character
+ (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both open
+ and close strong emphasis, then the sum of the lengths of
+ the delimiter runs containing the opening and closing
+ delimiters must not be a multiple of 3 unless both lengths
+ are multiples of 3.
+
+11. A literal `*` character cannot occur at the beginning or end of
+ `*`-delimited emphasis or `**`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+12. A literal `_` character cannot occur at the beginning or end of
+ `_`-delimited emphasis or `__`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+Where rules 1--12 above are compatible with multiple parsings,
+the following principles resolve ambiguity:
+
+13. The number of nestings should be minimized. Thus, for example,
+ an interpretation `<strong>...</strong>` is always preferred to
+ `<em><em>...</em></em>`.
+
+14. An interpretation `<em><strong>...</strong></em>` is always
+ preferred to `<strong><em>...</em></strong>`.
+
+15. When two potential emphasis or strong emphasis spans overlap,
+ so that the second begins before the first ends and ends after
+ the first ends, the first takes precedence. Thus, for example,
+ `*foo _bar* baz_` is parsed as `<em>foo _bar</em> baz_` rather
+ than `*foo <em>bar* baz</em>`.
+
+16. When there are two potential emphasis or strong emphasis spans
+ with the same closing delimiter, the shorter one (the one that
+ opens later) takes precedence. Thus, for example,
+ `**foo **bar baz**` is parsed as `**foo <strong>bar baz</strong>`
+ rather than `<strong>foo **bar baz</strong>`.
+
+17. Inline code spans, links, images, and HTML tags group more tightly
+ than emphasis. So, when there is a choice between an interpretation
+ that contains one of these elements and one that does not, the
+ former always wins. Thus, for example, `*[foo*](bar)` is
+ parsed as `*<a href="bar">foo*</a>` rather than as
+ `<em>[foo</em>](bar)`.
+
+These rules can be illustrated through a series of examples.
+
+Rule 1:
+
+```````````````````````````````` example
+*foo bar*
+.
+<p><em>foo bar</em></p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is followed by
+whitespace, and hence not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a * foo bar*
+.
+<p>a * foo bar*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a*"foo"*
+.
+<p>a*&quot;foo&quot;*</p>
+````````````````````````````````
+
+
+Unicode nonbreaking spaces count as whitespace, too:
+
+```````````````````````````````` example
+* a *
+.
+<p>* a *</p>
+````````````````````````````````
+
+
+Intraword emphasis with `*` is permitted:
+
+```````````````````````````````` example
+foo*bar*
+.
+<p>foo<em>bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5*6*78
+.
+<p>5<em>6</em>78</p>
+````````````````````````````````
+
+
+Rule 2:
+
+```````````````````````````````` example
+_foo bar_
+.
+<p><em>foo bar</em></p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is followed by
+whitespace:
+
+```````````````````````````````` example
+_ foo bar_
+.
+<p>_ foo bar_</p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a_"foo"_
+.
+<p>a_&quot;foo&quot;_</p>
+````````````````````````````````
+
+
+Emphasis with `_` is not allowed inside words:
+
+```````````````````````````````` example
+foo_bar_
+.
+<p>foo_bar_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5_6_78
+.
+<p>5_6_78</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+приÑтанÑм_ÑтремÑÑ‚ÑÑ_
+.
+<p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+````````````````````````````````
+
+
+Here `_` does not generate emphasis, because the first delimiter run
+is right-flanking and the second left-flanking:
+
+```````````````````````````````` example
+aa_"bb"_cc
+.
+<p>aa_&quot;bb&quot;_cc</p>
+````````````````````````````````
+
+
+This is emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-_(bar)_
+.
+<p>foo-<em>(bar)</em></p>
+````````````````````````````````
+
+
+Rule 3:
+
+This is not emphasis, because the closing delimiter does
+not match the opening delimiter:
+
+```````````````````````````````` example
+_foo*
+.
+<p>_foo*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the closing `*` is preceded by
+whitespace:
+
+```````````````````````````````` example
+*foo bar *
+.
+<p>*foo bar *</p>
+````````````````````````````````
+
+
+A newline also counts as whitespace:
+
+```````````````````````````````` example
+*foo bar
+*
+.
+<p>*foo bar
+*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the second `*` is
+preceded by punctuation and followed by an alphanumeric
+(hence it is not part of a [right-flanking delimiter run]:
+
+```````````````````````````````` example
+*(*foo)
+.
+<p>*(*foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+*(*foo*)*
+.
+<p><em>(<em>foo</em>)</em></p>
+````````````````````````````````
+
+
+Intraword emphasis with `*` is allowed:
+
+```````````````````````````````` example
+*foo*bar
+.
+<p><em>foo</em>bar</p>
+````````````````````````````````
+
+
+
+Rule 4:
+
+This is not emphasis, because the closing `_` is preceded by
+whitespace:
+
+```````````````````````````````` example
+_foo bar _
+.
+<p>_foo bar _</p>
+````````````````````````````````
+
+
+This is not emphasis, because the second `_` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+_(_foo)
+.
+<p>_(_foo)</p>
+````````````````````````````````
+
+
+This is emphasis within emphasis:
+
+```````````````````````````````` example
+_(_foo_)_
+.
+<p><em>(<em>foo</em>)</em></p>
+````````````````````````````````
+
+
+Intraword emphasis is disallowed for `_`:
+
+```````````````````````````````` example
+_foo_bar
+.
+<p>_foo_bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_приÑтанÑм_ÑтремÑÑ‚ÑÑ
+.
+<p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo_bar_baz_
+.
+<p><em>foo_bar_baz</em></p>
+````````````````````````````````
+
+
+This is emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+_(bar)_.
+.
+<p><em>(bar)</em>.</p>
+````````````````````````````````
+
+
+Rule 5:
+
+```````````````````````````````` example
+**foo bar**
+.
+<p><strong>foo bar</strong></p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+** foo bar**
+.
+<p>** foo bar**</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `**` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a**"foo"**
+.
+<p>a**&quot;foo&quot;**</p>
+````````````````````````````````
+
+
+Intraword strong emphasis with `**` is permitted:
+
+```````````````````````````````` example
+foo**bar**
+.
+<p>foo<strong>bar</strong></p>
+````````````````````````````````
+
+
+Rule 6:
+
+```````````````````````````````` example
+__foo bar__
+.
+<p><strong>foo bar</strong></p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+__ foo bar__
+.
+<p>__ foo bar__</p>
+````````````````````````````````
+
+
+A newline counts as whitespace:
+```````````````````````````````` example
+__
+foo bar__
+.
+<p>__
+foo bar__</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `__` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a__"foo"__
+.
+<p>a__&quot;foo&quot;__</p>
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+foo__bar__
+.
+<p>foo__bar__</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5__6__78
+.
+<p>5__6__78</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+приÑтанÑм__ÑтремÑÑ‚ÑÑ__
+.
+<p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo, __bar__, baz__
+.
+<p><strong>foo, <strong>bar</strong>, baz</strong></p>
+````````````````````````````````
+
+
+This is strong emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-__(bar)__
+.
+<p>foo-<strong>(bar)</strong></p>
+````````````````````````````````
+
+
+
+Rule 7:
+
+This is not strong emphasis, because the closing delimiter is preceded
+by whitespace:
+
+```````````````````````````````` example
+**foo bar **
+.
+<p>**foo bar **</p>
+````````````````````````````````
+
+
+(Nor can it be interpreted as an emphasized `*foo bar *`, because of
+Rule 11.)
+
+This is not strong emphasis, because the second `**` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+**(**foo)
+.
+<p>**(**foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with these examples:
+
+```````````````````````````````` example
+*(**foo**)*
+.
+<p><em>(<strong>foo</strong>)</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**Gomphocarpus (*Gomphocarpus physocarpus*, syn.
+*Asclepias physocarpa*)**
+.
+<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+<em>Asclepias physocarpa</em>)</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo "*bar*" foo**
+.
+<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>
+````````````````````````````````
+
+
+Intraword emphasis:
+
+```````````````````````````````` example
+**foo**bar
+.
+<p><strong>foo</strong>bar</p>
+````````````````````````````````
+
+
+Rule 8:
+
+This is not strong emphasis, because the closing delimiter is
+preceded by whitespace:
+
+```````````````````````````````` example
+__foo bar __
+.
+<p>__foo bar __</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the second `__` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+__(__foo)
+.
+<p>__(__foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+_(__foo__)_
+.
+<p><em>(<strong>foo</strong>)</em></p>
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+__foo__bar
+.
+<p>__foo__bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__приÑтанÑм__ÑтремÑÑ‚ÑÑ
+.
+<p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__bar__baz__
+.
+<p><strong>foo__bar__baz</strong></p>
+````````````````````````````````
+
+
+This is strong emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+__(bar)__.
+.
+<p><strong>(bar)</strong>.</p>
+````````````````````````````````
+
+
+Rule 9:
+
+Any nonempty sequence of inline elements can be the contents of an
+emphasized span.
+
+```````````````````````````````` example
+*foo [bar](/url)*
+.
+<p><em>foo <a href="/url">bar</a></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo
+bar*
+.
+<p><em>foo
+bar</em></p>
+````````````````````````````````
+
+
+In particular, emphasis and strong emphasis can be nested
+inside emphasis:
+
+```````````````````````````````` example
+_foo __bar__ baz_
+.
+<p><em>foo <strong>bar</strong> baz</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo _bar_ baz_
+.
+<p><em>foo <em>bar</em> baz</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_ bar_
+.
+<p><em><em>foo</em> bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo *bar**
+.
+<p><em>foo <em>bar</em></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar** baz*
+.
+<p><em>foo <strong>bar</strong> baz</em></p>
+````````````````````````````````
+
+```````````````````````````````` example
+*foo**bar**baz*
+.
+<p><em>foo<strong>bar</strong>baz</em></p>
+````````````````````````````````
+
+Note that in the preceding case, the interpretation
+
+``` markdown
+<p><em>foo</em><em>bar<em></em>baz</em></p>
+```
+
+
+is precluded by the condition that a delimiter that
+can both open and close (like the `*` after `foo`)
+cannot form emphasis if the sum of the lengths of
+the delimiter runs containing the opening and
+closing delimiters is a multiple of 3 unless
+both lengths are multiples of 3.
+
+
+For the same reason, we don't get two consecutive
+emphasis sections in this example:
+
+```````````````````````````````` example
+*foo**bar*
+.
+<p><em>foo**bar</em></p>
+````````````````````````````````
+
+
+The same condition ensures that the following
+cases are all strong emphasis nested inside
+emphasis, even when the interior spaces are
+omitted:
+
+
+```````````````````````````````` example
+***foo** bar*
+.
+<p><em><strong>foo</strong> bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar***
+.
+<p><em>foo <strong>bar</strong></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**bar***
+.
+<p><em>foo<strong>bar</strong></em></p>
+````````````````````````````````
+
+
+When the lengths of the interior closing and opening
+delimiter runs are *both* multiples of 3, though,
+they can match to create emphasis:
+
+```````````````````````````````` example
+foo***bar***baz
+.
+<p>foo<em><strong>bar</strong></em>baz</p>
+````````````````````````````````
+
+```````````````````````````````` example
+foo******bar*********baz
+.
+<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
+````````````````````````````````
+
+
+Indefinite levels of nesting are possible:
+
+```````````````````````````````` example
+*foo **bar *baz* bim** bop*
+.
+<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo [*bar*](/url)*
+.
+<p><em>foo <a href="/url"><em>bar</em></a></em></p>
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+** is not an empty emphasis
+.
+<p>** is not an empty emphasis</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**** is not an empty strong emphasis
+.
+<p>**** is not an empty strong emphasis</p>
+````````````````````````````````
+
+
+
+Rule 10:
+
+Any nonempty sequence of inline elements can be the contents of an
+strongly emphasized span.
+
+```````````````````````````````` example
+**foo [bar](/url)**
+.
+<p><strong>foo <a href="/url">bar</a></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo
+bar**
+.
+<p><strong>foo
+bar</strong></p>
+````````````````````````````````
+
+
+In particular, emphasis and strong emphasis can be nested
+inside strong emphasis:
+
+```````````````````````````````` example
+__foo _bar_ baz__
+.
+<p><strong>foo <em>bar</em> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo __bar__ baz__
+.
+<p><strong>foo <strong>bar</strong> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo__ bar__
+.
+<p><strong><strong>foo</strong> bar</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo **bar****
+.
+<p><strong>foo <strong>bar</strong></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo *bar* baz**
+.
+<p><strong>foo <em>bar</em> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo*bar*baz**
+.
+<p><strong>foo<em>bar</em>baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+***foo* bar**
+.
+<p><strong><em>foo</em> bar</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo *bar***
+.
+<p><strong>foo <em>bar</em></strong></p>
+````````````````````````````````
+
+
+Indefinite levels of nesting are possible:
+
+```````````````````````````````` example
+**foo *bar **baz**
+bim* bop**
+.
+<p><strong>foo <em>bar <strong>baz</strong>
+bim</em> bop</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo [*bar*](/url)**
+.
+<p><strong>foo <a href="/url"><em>bar</em></a></strong></p>
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+__ is not an empty emphasis
+.
+<p>__ is not an empty emphasis</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____ is not an empty strong emphasis
+.
+<p>____ is not an empty strong emphasis</p>
+````````````````````````````````
+
+
+
+Rule 11:
+
+```````````````````````````````` example
+foo ***
+.
+<p>foo ***</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *\**
+.
+<p>foo <em>*</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *_*
+.
+<p>foo <em>_</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *****
+.
+<p>foo *****</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **\***
+.
+<p>foo <strong>*</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **_**
+.
+<p>foo <strong>_</strong></p>
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 11 determines
+that the excess literal `*` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+**foo*
+.
+<p>*<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**
+.
+<p><em>foo</em>*</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+***foo**
+.
+<p>*<strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+****foo*
+.
+<p>***<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo***
+.
+<p><strong>foo</strong>*</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo****
+.
+<p><em>foo</em>***</p>
+````````````````````````````````
+
+
+
+Rule 12:
+
+```````````````````````````````` example
+foo ___
+.
+<p>foo ___</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _\__
+.
+<p>foo <em>_</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _*_
+.
+<p>foo <em>*</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _____
+.
+<p>foo _____</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __\___
+.
+<p>foo <strong>_</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __*__
+.
+<p>foo <strong>*</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_
+.
+<p>_<em>foo</em></p>
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 12 determines
+that the excess literal `_` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+_foo__
+.
+<p><em>foo</em>_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+___foo__
+.
+<p>_<strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo_
+.
+<p>___<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo___
+.
+<p><strong>foo</strong>_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo____
+.
+<p><em>foo</em>___</p>
+````````````````````````````````
+
+
+Rule 13 implies that if you want emphasis nested directly inside
+emphasis, you must use different delimiters:
+
+```````````````````````````````` example
+**foo**
+.
+<p><strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*_foo_*
+.
+<p><em><em>foo</em></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__
+.
+<p><strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_*foo*_
+.
+<p><em><em>foo</em></em></p>
+````````````````````````````````
+
+
+However, strong emphasis within strong emphasis is possible without
+switching delimiters:
+
+```````````````````````````````` example
+****foo****
+.
+<p><strong><strong>foo</strong></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo____
+.
+<p><strong><strong>foo</strong></strong></p>
+````````````````````````````````
+
+
+
+Rule 13 can be applied to arbitrarily long sequences of
+delimiters:
+
+```````````````````````````````` example
+******foo******
+.
+<p><strong><strong><strong>foo</strong></strong></strong></p>
+````````````````````````````````
+
+
+Rule 14:
+
+```````````````````````````````` example
+***foo***
+.
+<p><em><strong>foo</strong></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_____foo_____
+.
+<p><em><strong><strong>foo</strong></strong></em></p>
+````````````````````````````````
+
+
+Rule 15:
+
+```````````````````````````````` example
+*foo _bar* baz_
+.
+<p><em>foo _bar</em> baz_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo __bar *baz bim__ bam*
+.
+<p><em>foo <strong>bar *baz bim</strong> bam</em></p>
+````````````````````````````````
+
+
+Rule 16:
+
+```````````````````````````````` example
+**foo **bar baz**
+.
+<p>**foo <strong>bar baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo *bar baz*
+.
+<p>*foo <em>bar baz</em></p>
+````````````````````````````````
+
+
+Rule 17:
+
+```````````````````````````````` example
+*[bar*](/url)
+.
+<p>*<a href="/url">bar*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo [bar_](/url)
+.
+<p>_foo <a href="/url">bar_</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*<img src="foo" title="*"/>
+.
+<p>*<img src="foo" title="*"/></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**<a href="**">
+.
+<p>**<a href="**"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__<a href="__">
+.
+<p>__<a href="__"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*a `*`*
+.
+<p><em>a <code>*</code></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_a `_`_
+.
+<p><em>a <code>_</code></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**a<http://foo.bar/?q=**>
+.
+<p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__a<http://foo.bar/?q=__>
+.
+<p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
+````````````````````````````````
+
+
+<div class="extension">
+
+## Strikethrough (extension)
+
+GFM enables the `strikethrough` extension, where an additional emphasis type is
+available.
+
+Strikethrough text is any text wrapped in two tildes (`~`).
+
+```````````````````````````````` example strikethrough
+~~Hi~~ Hello, world!
+.
+<p><del>Hi</del> Hello, world!</p>
+````````````````````````````````
+
+As with regular emphasis delimiters, a new paragraph will cause strikethrough
+parsing to cease:
+
+```````````````````````````````` example strikethrough
+This ~~has a
+
+new paragraph~~.
+.
+<p>This ~~has a</p>
+<p>new paragraph~~.</p>
+````````````````````````````````
+
+</div>
+
+## Links
+
+A link contains [link text] (the visible text), a [link destination]
+(the URI that is the link destination), and optionally a [link title].
+There are two basic kinds of links in Markdown. In [inline links] the
+destination and title are given immediately after the link text. In
+[reference links] the destination and title are defined elsewhere in
+the document.
+
+A [link text](@) consists of a sequence of zero or more
+inline elements enclosed by square brackets (`[` and `]`). The
+following rules apply:
+
+- Links may not contain other links, at any level of nesting. If
+ multiple otherwise valid link definitions appear nested inside each
+ other, the inner-most definition is used.
+
+- Brackets are allowed in the [link text] only if (a) they
+ are backslash-escaped or (b) they appear as a matched pair of brackets,
+ with an open bracket `[`, a sequence of zero or more inlines, and
+ a close bracket `]`.
+
+- Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly
+ than the brackets in link text. Thus, for example,
+ `` [foo`]` `` could not be a link text, since the second `]`
+ is part of a code span.
+
+- The brackets in link text bind more tightly than markers for
+ [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link.
+
+A [link destination](@) consists of either
+
+- a sequence of zero or more characters between an opening `<` and a
+ closing `>` that contains no line breaks or unescaped
+ `<` or `>` characters, or
+
+- a nonempty sequence of characters that does not start with
+ `<`, does not include ASCII space or control characters, and
+ includes parentheses only if (a) they are backslash-escaped or
+ (b) they are part of a balanced pair of unescaped parentheses.
+ (Implementations may impose limits on parentheses nesting to
+ avoid performance issues, but at least three levels of nesting
+ should be supported.)
+
+A [link title](@) consists of either
+
+- a sequence of zero or more characters between straight double-quote
+ characters (`"`), including a `"` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between straight single-quote
+ characters (`'`), including a `'` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between matching parentheses
+ (`(...)`), including a `(` or `)` character only if it is
+ backslash-escaped.
+
+Although [link titles] may span multiple lines, they may not contain
+a [blank line].
+
+An [inline link](@) consists of a [link text] followed immediately
+by a left parenthesis `(`, optional [whitespace], an optional
+[link destination], an optional [link title] separated from the link
+destination by [whitespace], optional [whitespace], and a right
+parenthesis `)`. The link's text consists of the inlines contained
+in the [link text] (excluding the enclosing square brackets).
+The link's URI consists of the link destination, excluding enclosing
+`<...>` if present, with backslash-escapes in effect as described
+above. The link's title consists of the link title, excluding its
+enclosing delimiters, with backslash-escapes in effect as described
+above.
+
+Here is a simple inline link:
+
+```````````````````````````````` example
+[link](/uri "title")
+.
+<p><a href="/uri" title="title">link</a></p>
+````````````````````````````````
+
+
+The title may be omitted:
+
+```````````````````````````````` example
+[link](/uri)
+.
+<p><a href="/uri">link</a></p>
+````````````````````````````````
+
+
+Both the title and the destination may be omitted:
+
+```````````````````````````````` example
+[link]()
+.
+<p><a href="">link</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](<>)
+.
+<p><a href="">link</a></p>
+````````````````````````````````
+
+The destination can only contain spaces if it is
+enclosed in pointy brackets:
+
+```````````````````````````````` example
+[link](/my uri)
+.
+<p>[link](/my uri)</p>
+````````````````````````````````
+
+```````````````````````````````` example
+[link](</my uri>)
+.
+<p><a href="/my%20uri">link</a></p>
+````````````````````````````````
+
+The destination cannot contain line breaks,
+even if enclosed in pointy brackets:
+
+```````````````````````````````` example
+[link](foo
+bar)
+.
+<p>[link](foo
+bar)</p>
+````````````````````````````````
+
+```````````````````````````````` example
+[link](<foo
+bar>)
+.
+<p>[link](<foo
+bar>)</p>
+````````````````````````````````
+
+The destination can contain `)` if it is enclosed
+in pointy brackets:
+
+```````````````````````````````` example
+[a](<b)c>)
+.
+<p><a href="b)c">a</a></p>
+````````````````````````````````
+
+Pointy brackets that enclose links must be unescaped:
+
+```````````````````````````````` example
+[link](<foo\>)
+.
+<p>[link](&lt;foo&gt;)</p>
+````````````````````````````````
+
+These are not links, because the opening pointy bracket
+is not matched properly:
+
+```````````````````````````````` example
+[a](<b)c
+[a](<b)c>
+[a](<b>c)
+.
+<p>[a](&lt;b)c
+[a](&lt;b)c&gt;
+[a](<b>c)</p>
+````````````````````````````````
+
+Parentheses inside the link destination may be escaped:
+
+```````````````````````````````` example
+[link](\(foo\))
+.
+<p><a href="(foo)">link</a></p>
+````````````````````````````````
+
+Any number of parentheses are allowed without escaping, as long as they are
+balanced:
+
+```````````````````````````````` example
+[link](foo(and(bar)))
+.
+<p><a href="foo(and(bar))">link</a></p>
+````````````````````````````````
+
+However, if you have unbalanced parentheses, you need to escape or use the
+`<...>` form:
+
+```````````````````````````````` example
+[link](foo\(and\(bar\))
+.
+<p><a href="foo(and(bar)">link</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](<foo(and(bar)>)
+.
+<p><a href="foo(and(bar)">link</a></p>
+````````````````````````````````
+
+
+Parentheses and other symbols can also be escaped, as usual
+in Markdown:
+
+```````````````````````````````` example
+[link](foo\)\:)
+.
+<p><a href="foo):">link</a></p>
+````````````````````````````````
+
+
+A link can contain fragment identifiers and queries:
+
+```````````````````````````````` example
+[link](#fragment)
+
+[link](http://example.com#fragment)
+
+[link](http://example.com?foo=3#frag)
+.
+<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>
+````````````````````````````````
+
+
+Note that a backslash before a non-escapable character is
+just a backslash:
+
+```````````````````````````````` example
+[link](foo\bar)
+.
+<p><a href="foo%5Cbar">link</a></p>
+````````````````````````````````
+
+
+URL-escaping should be left alone inside the destination, as all
+URL-escaped characters are also valid URL characters. Entity and
+numerical character references in the destination will be parsed
+into the corresponding Unicode code points, as usual. These may
+be optionally URL-escaped when written as HTML, but this spec
+does not enforce any particular policy for rendering URLs in
+HTML or other formats. Renderers may make different decisions
+about how to escape or normalize URLs in the output.
+
+```````````````````````````````` example
+[link](foo%20b&auml;)
+.
+<p><a href="foo%20b%C3%A4">link</a></p>
+````````````````````````````````
+
+
+Note that, because titles can often be parsed as destinations,
+if you try to omit the destination and keep the title, you'll
+get unexpected results:
+
+```````````````````````````````` example
+[link]("title")
+.
+<p><a href="%22title%22">link</a></p>
+````````````````````````````````
+
+
+Titles may be in single quotes, double quotes, or parentheses:
+
+```````````````````````````````` example
+[link](/url "title")
+[link](/url 'title')
+[link](/url (title))
+.
+<p><a href="/url" title="title">link</a>
+<a href="/url" title="title">link</a>
+<a href="/url" title="title">link</a></p>
+````````````````````````````````
+
+
+Backslash escapes and entity and numeric character references
+may be used in titles:
+
+```````````````````````````````` example
+[link](/url "title \"&quot;")
+.
+<p><a href="/url" title="title &quot;&quot;">link</a></p>
+````````````````````````````````
+
+
+Titles must be separated from the link using a [whitespace].
+Other [Unicode whitespace] like non-breaking space doesn't work.
+
+```````````````````````````````` example
+[link](/url "title")
+.
+<p><a href="/url%C2%A0%22title%22">link</a></p>
+````````````````````````````````
+
+
+Nested balanced quotes are not allowed without escaping:
+
+```````````````````````````````` example
+[link](/url "title "and" title")
+.
+<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>
+````````````````````````````````
+
+
+But it is easy to work around this by using a different quote type:
+
+```````````````````````````````` example
+[link](/url 'title "and" title')
+.
+<p><a href="/url" title="title &quot;and&quot; title">link</a></p>
+````````````````````````````````
+
+
+(Note: `Markdown.pl` did allow double quotes inside a double-quoted
+title, and its test suite included a test demonstrating this.
+But it is hard to see a good rationale for the extra complexity this
+brings, since there are already many ways---backslash escaping,
+entity and numeric character references, or using a different
+quote type for the enclosing title---to write titles containing
+double quotes. `Markdown.pl`'s handling of titles has a number
+of other strange features. For example, it allows single-quoted
+titles in inline links, but not reference links. And, in
+reference links but not inline links, it allows a title to begin
+with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows
+titles with no closing quotation mark, though 1.0.2b8 does not.
+It seems preferable to adopt a simple, rational rule that works
+the same way in inline links and link reference definitions.)
+
+[Whitespace] is allowed around the destination and title:
+
+```````````````````````````````` example
+[link]( /uri
+ "title" )
+.
+<p><a href="/uri" title="title">link</a></p>
+````````````````````````````````
+
+
+But it is not allowed between the link text and the
+following parenthesis:
+
+```````````````````````````````` example
+[link] (/uri)
+.
+<p>[link] (/uri)</p>
+````````````````````````````````
+
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]](/uri)
+.
+<p><a href="/uri">link [foo [bar]]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link] bar](/uri)
+.
+<p>[link] bar](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link [bar](/uri)
+.
+<p>[link <a href="/uri">bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link \[bar](/uri)
+.
+<p><a href="/uri">link [bar</a></p>
+````````````````````````````````
+
+
+The link text may contain inline content:
+
+```````````````````````````````` example
+[link *foo **bar** `#`*](/uri)
+.
+<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[![moon](moon.jpg)](/uri)
+.
+<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)](/uri)
+.
+<p>[foo <a href="/uri">bar</a>](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *[bar [baz](/uri)](/uri)*](/uri)
+.
+<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![[[foo](uri1)](uri2)](uri3)
+.
+<p><img src="uri3" alt="[foo](uri2)" /></p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*](/uri)
+.
+<p>*<a href="/uri">foo*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar](baz*)
+.
+<p><a href="baz*">foo *bar</a></p>
+````````````````````````````````
+
+
+Note that brackets that *aren't* part of links do not take
+precedence:
+
+```````````````````````````````` example
+*foo [bar* baz]
+.
+<p><em>foo [bar</em> baz]</p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo <bar attr="](baz)">
+.
+<p>[foo <bar attr="](baz)"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo`](/uri)`
+.
+<p>[foo<code>](/uri)</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo<http://example.com/?search=](uri)>
+.
+<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
+````````````````````````````````
+
+
+There are three kinds of [reference link](@)s:
+[full](#full-reference-link), [collapsed](#collapsed-reference-link),
+and [shortcut](#shortcut-reference-link).
+
+A [full reference link](@)
+consists of a [link text] immediately followed by a [link label]
+that [matches] a [link reference definition] elsewhere in the document.
+
+A [link label](@) begins with a left bracket (`[`) and ends
+with the first right bracket (`]`) that is not backslash-escaped.
+Between these brackets there must be at least one [non-whitespace character].
+Unescaped square bracket characters are not allowed inside the
+opening and closing square brackets of [link labels]. A link
+label can have at most 999 characters inside the square
+brackets.
+
+One label [matches](@)
+another just in case their normalized forms are equal. To normalize a
+label, strip off the opening and closing brackets,
+perform the *Unicode case fold*, strip leading and trailing
+[whitespace] and collapse consecutive internal
+[whitespace] to a single space. If there are multiple
+matching reference link definitions, the one that comes first in the
+document is used. (It is desirable in such cases to emit a warning.)
+
+The contents of the first link label are parsed as inlines, which are
+used as the link's text. The link's URI and title are provided by the
+matching [link reference definition].
+
+Here is a simple example:
+
+```````````````````````````````` example
+[foo][bar]
+
+[bar]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+The rules for the [link text] are the same as with
+[inline links]. Thus:
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link [foo [bar]]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link \[bar][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link [bar</a></p>
+````````````````````````````````
+
+
+The link text may contain inline content:
+
+```````````````````````````````` example
+[link *foo **bar** `#`*][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[![moon](moon.jpg)][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)][ref]
+
+[ref]: /uri
+.
+<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar [baz][ref]*][ref]
+
+[ref]: /uri
+.
+<p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
+````````````````````````````````
+
+
+(In the examples above, we have two [shortcut reference links]
+instead of one [full reference link].)
+
+The following cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*][ref]
+
+[ref]: /uri
+.
+<p>*<a href="/uri">foo*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">foo *bar</a></p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo <bar attr="][ref]">
+
+[ref]: /uri
+.
+<p>[foo <bar attr="][ref]"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo`][ref]`
+
+[ref]: /uri
+.
+<p>[foo<code>][ref]</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo<http://example.com/?search=][ref]>
+
+[ref]: /uri
+.
+<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
+````````````````````````````````
+
+
+Matching is case-insensitive:
+
+```````````````````````````````` example
+[foo][BaR]
+
+[bar]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+Unicode case fold is used:
+
+```````````````````````````````` example
+[Толпой][Толпой] is a Russian word.
+
+[ТОЛПОЙ]: /url
+.
+<p><a href="/url">Толпой</a> is a Russian word.</p>
+````````````````````````````````
+
+
+Consecutive internal [whitespace] is treated as one space for
+purposes of determining matching:
+
+```````````````````````````````` example
+[Foo
+ bar]: /url
+
+[Baz][Foo bar]
+.
+<p><a href="/url">Baz</a></p>
+````````````````````````````````
+
+
+No [whitespace] is allowed between the [link text] and the
+[link label]:
+
+```````````````````````````````` example
+[foo] [bar]
+
+[bar]: /url "title"
+.
+<p>[foo] <a href="/url" title="title">bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+[bar]
+
+[bar]: /url "title"
+.
+<p>[foo]
+<a href="/url" title="title">bar</a></p>
+````````````````````````````````
+
+
+This is a departure from John Gruber's original Markdown syntax
+description, which explicitly allows whitespace between the link
+text and the link label. It brings reference links in line with
+[inline links], which (according to both original Markdown and
+this spec) cannot have whitespace after the link text. More
+importantly, it prevents inadvertent capture of consecutive
+[shortcut reference links]. If whitespace is allowed between the
+link text and the link label, then in the following we will have
+a single reference link, not two shortcut reference links, as
+intended:
+
+``` markdown
+[foo]
+[bar]
+
+[foo]: /url1
+[bar]: /url2
+```
+
+(Note that [shortcut reference links] were introduced by Gruber
+himself in a beta version of `Markdown.pl`, but never included
+in the official syntax description. Without shortcut reference
+links, it is harmless to allow space between the link text and
+link label; but once shortcut references are introduced, it is
+too dangerous to allow this, as it frequently leads to
+unintended results.)
+
+When there are multiple matching [link reference definitions],
+the first is used:
+
+```````````````````````````````` example
+[foo]: /url1
+
+[foo]: /url2
+
+[bar][foo]
+.
+<p><a href="/url1">bar</a></p>
+````````````````````````````````
+
+
+Note that matching is performed on normalized strings, not parsed
+inline content. So the following does not match, even though the
+labels define equivalent inline content:
+
+```````````````````````````````` example
+[bar][foo\!]
+
+[foo!]: /url
+.
+<p>[bar][foo!]</p>
+````````````````````````````````
+
+
+[Link labels] cannot contain brackets, unless they are
+backslash-escaped:
+
+```````````````````````````````` example
+[foo][ref[]
+
+[ref[]: /uri
+.
+<p>[foo][ref[]</p>
+<p>[ref[]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo][ref[bar]]
+
+[ref[bar]]: /uri
+.
+<p>[foo][ref[bar]]</p>
+<p>[ref[bar]]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[[foo]]]
+
+[[[foo]]]: /url
+.
+<p>[[[foo]]]</p>
+<p>[[[foo]]]: /url</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo][ref\[]
+
+[ref\[]: /uri
+.
+<p><a href="/uri">foo</a></p>
+````````````````````````````````
+
+
+Note that in this example `]` is not backslash-escaped:
+
+```````````````````````````````` example
+[bar\\]: /uri
+
+[bar\\]
+.
+<p><a href="/uri">bar\</a></p>
+````````````````````````````````
+
+
+A [link label] must contain at least one [non-whitespace character]:
+
+```````````````````````````````` example
+[]
+
+[]: /uri
+.
+<p>[]</p>
+<p>[]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[
+ ]
+
+[
+ ]: /uri
+.
+<p>[
+]</p>
+<p>[
+]: /uri</p>
+````````````````````````````````
+
+
+A [collapsed reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document, followed by the string `[]`.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title are
+provided by the matching reference link definition. Thus,
+`[foo][]` is equivalent to `[foo][foo]`.
+
+```````````````````````````````` example
+[foo][]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[*foo* bar][]
+
+[*foo* bar]: /url "title"
+.
+<p><a href="/url" title="title"><em>foo</em> bar</a></p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+[Foo][]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">Foo</a></p>
+````````````````````````````````
+
+
+
+As with full reference links, [whitespace] is not
+allowed between the two sets of brackets:
+
+```````````````````````````````` example
+[foo]
+[]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a>
+[]</p>
+````````````````````````````````
+
+
+A [shortcut reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document and is not followed by `[]` or a link label.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title
+are provided by the matching link reference definition.
+Thus, `[foo]` is equivalent to `[foo][]`.
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[*foo* bar]
+
+[*foo* bar]: /url "title"
+.
+<p><a href="/url" title="title"><em>foo</em> bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[*foo* bar]]
+
+[*foo* bar]: /url "title"
+.
+<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[bar [foo]
+
+[foo]: /url
+.
+<p>[[bar <a href="/url">foo</a></p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+[Foo]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">Foo</a></p>
+````````````````````````````````
+
+
+A space after the link text should be preserved:
+
+```````````````````````````````` example
+[foo] bar
+
+[foo]: /url
+.
+<p><a href="/url">foo</a> bar</p>
+````````````````````````````````
+
+
+If you just want bracketed text, you can backslash-escape the
+opening bracket to avoid links:
+
+```````````````````````````````` example
+\[foo]
+
+[foo]: /url "title"
+.
+<p>[foo]</p>
+````````````````````````````````
+
+
+Note that this is a link, because a link label ends with the first
+following closing bracket:
+
+```````````````````````````````` example
+[foo*]: /url
+
+*[foo*]
+.
+<p>*<a href="/url">foo*</a></p>
+````````````````````````````````
+
+
+Full and compact references take precedence over shortcut
+references:
+
+```````````````````````````````` example
+[foo][bar]
+
+[foo]: /url1
+[bar]: /url2
+.
+<p><a href="/url2">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo][]
+
+[foo]: /url1
+.
+<p><a href="/url1">foo</a></p>
+````````````````````````````````
+
+Inline links also take precedence:
+
+```````````````````````````````` example
+[foo]()
+
+[foo]: /url1
+.
+<p><a href="">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo](not a link)
+
+[foo]: /url1
+.
+<p><a href="/url1">foo</a>(not a link)</p>
+````````````````````````````````
+
+In the following case `[bar][baz]` is parsed as a reference,
+`[foo]` as normal text:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url
+.
+<p>[foo]<a href="/url">bar</a></p>
+````````````````````````````````
+
+
+Here, though, `[foo][bar]` is parsed as a reference, since
+`[bar]` is defined:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[bar]: /url2
+.
+<p><a href="/url2">foo</a><a href="/url1">baz</a></p>
+````````````````````````````````
+
+
+Here `[foo]` is not parsed as a shortcut reference, because it
+is followed by a link label (even though `[bar]` is not defined):
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[foo]: /url2
+.
+<p>[foo]<a href="/url1">bar</a></p>
+````````````````````````````````
+
+
+
+## Images
+
+Syntax for images is like the syntax for links, with one
+difference. Instead of [link text], we have an
+[image description](@). The rules for this are the
+same as for [link text], except that (a) an
+image description starts with `![` rather than `[`, and
+(b) an image description may contain links.
+An image description has inline elements
+as its contents. When an image is rendered to HTML,
+this is standardly used as the image's `alt` attribute.
+
+```````````````````````````````` example
+![foo](/url "title")
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo ![bar](/url)](/url2)
+.
+<p><img src="/url2" alt="foo bar" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo [bar](/url)](/url2)
+.
+<p><img src="/url2" alt="foo bar" /></p>
+````````````````````````````````
+
+
+Though this spec is concerned with parsing, not rendering, it is
+recommended that in rendering to HTML, only the plain string content
+of the [image description] be used. Note that in
+the above example, the alt attribute's value is `foo bar`, not `foo
+[bar](/url)` or `foo <a href="/url">bar</a>`. Only the plain string
+content is rendered, without formatting.
+
+```````````````````````````````` example
+![foo *bar*][]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*][foobar]
+
+[FOOBAR]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo](train.jpg)
+.
+<p><img src="train.jpg" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+My ![foo bar](/path/to/train.jpg "title" )
+.
+<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo](<url>)
+.
+<p><img src="url" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![](/url)
+.
+<p><img src="/url" alt="" /></p>
+````````````````````````````````
+
+
+Reference-style:
+
+```````````````````````````````` example
+![foo][bar]
+
+[bar]: /url
+.
+<p><img src="/url" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo][bar]
+
+[BAR]: /url
+.
+<p><img src="/url" alt="foo" /></p>
+````````````````````````````````
+
+
+Collapsed:
+
+```````````````````````````````` example
+![foo][]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar][]
+
+[*foo* bar]: /url "title"
+.
+<p><img src="/url" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+The labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo][]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="Foo" title="title" /></p>
+````````````````````````````````
+
+
+As with reference links, [whitespace] is not allowed
+between the two sets of brackets:
+
+```````````````````````````````` example
+![foo]
+[]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" />
+[]</p>
+````````````````````````````````
+
+
+Shortcut:
+
+```````````````````````````````` example
+![foo]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar]
+
+[*foo* bar]: /url "title"
+.
+<p><img src="/url" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+Note that link labels cannot contain unescaped brackets:
+
+```````````````````````````````` example
+![[foo]]
+
+[[foo]]: /url "title"
+.
+<p>![[foo]]</p>
+<p>[[foo]]: /url &quot;title&quot;</p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="Foo" title="title" /></p>
+````````````````````````````````
+
+
+If you just want a literal `!` followed by bracketed text, you can
+backslash-escape the opening `[`:
+
+```````````````````````````````` example
+!\[foo]
+
+[foo]: /url "title"
+.
+<p>![foo]</p>
+````````````````````````````````
+
+
+If you want a link after a literal `!`, backslash-escape the
+`!`:
+
+```````````````````````````````` example
+\![foo]
+
+[foo]: /url "title"
+.
+<p>!<a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+## Autolinks
+
+[Autolink](@)s are absolute URIs and email addresses inside
+`<` and `>`. They are parsed as links, with the URL or email address
+as the link label.
+
+A [URI autolink](@) consists of `<`, followed by an
+[absolute URI] followed by `>`. It is parsed as
+a link to the URI, with the URI as the link's label.
+
+An [absolute URI](@),
+for these purposes, consists of a [scheme] followed by a colon (`:`)
+followed by zero or more characters other than ASCII
+[whitespace] and control characters, `<`, and `>`. If
+the URI includes these characters, they must be percent-encoded
+(e.g. `%20` for a space).
+
+For purposes of this spec, a [scheme](@) is any sequence
+of 2--32 characters beginning with an ASCII letter and followed
+by any combination of ASCII letters, digits, or the symbols plus
+("+"), period ("."), or hyphen ("-").
+
+Here are some valid autolinks:
+
+```````````````````````````````` example
+<http://foo.bar.baz>
+.
+<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://foo.bar.baz/test?q=hello&id=22&boolean>
+.
+<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>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<irc://foo.bar:2233/baz>
+.
+<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
+````````````````````````````````
+
+
+Uppercase is also fine:
+
+```````````````````````````````` example
+<MAILTO:FOO@BAR.BAZ>
+.
+<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+````````````````````````````````
+
+
+Note that many strings that count as [absolute URIs] for
+purposes of this spec are not valid URIs, because their
+schemes are not registered or because of other problems
+with their syntax:
+
+```````````````````````````````` example
+<a+b+c:d>
+.
+<p><a href="a+b+c:d">a+b+c:d</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<made-up-scheme://foo,bar>
+.
+<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://../>
+.
+<p><a href="http://../">http://../</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<localhost:5001/foo>
+.
+<p><a href="localhost:5001/foo">localhost:5001/foo</a></p>
+````````````````````````````````
+
+
+Spaces are not allowed in autolinks:
+
+```````````````````````````````` example
+<http://foo.bar/baz bim>
+.
+<p>&lt;http://foo.bar/baz bim&gt;</p>
+````````````````````````````````
+
+
+Backslash-escapes do not work inside autolinks:
+
+```````````````````````````````` example
+<http://example.com/\[\>
+.
+<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
+````````````````````````````````
+
+
+An [email autolink](@)
+consists of `<`, followed by an [email address],
+followed by `>`. The link's label is the email address,
+and the URL is `mailto:` followed by the email address.
+
+An [email address](@),
+for these purposes, is anything that matches
+the [non-normative regex from the HTML5
+spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email)):
+
+ /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
+ (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
+
+Examples of email autolinks:
+
+```````````````````````````````` example
+<foo@bar.example.com>
+.
+<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<foo+special@Bar.baz-bar0.com>
+.
+<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+````````````````````````````````
+
+
+Backslash-escapes do not work inside email autolinks:
+
+```````````````````````````````` example
+<foo\+@bar.example.com>
+.
+<p>&lt;foo+@bar.example.com&gt;</p>
+````````````````````````````````
+
+
+These are not autolinks:
+
+```````````````````````````````` example
+<>
+.
+<p>&lt;&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+< http://foo.bar >
+.
+<p>&lt; http://foo.bar &gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<m:abc>
+.
+<p>&lt;m:abc&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<foo.bar.baz>
+.
+<p>&lt;foo.bar.baz&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+http://example.com
+.
+<p>http://example.com</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo@bar.example.com
+.
+<p>foo@bar.example.com</p>
+````````````````````````````````
+
+<div class="extension">
+
+## Autolinks (extension)
+
+GFM enables the `autolink` extension, where autolinks will be recognised in a
+greater number of conditions.
+
+[Autolink]s can also be constructed without requiring the use of `<` and to `>`
+to delimit them, although they will be recognized under a smaller set of
+circumstances. All such recognized autolinks can only come at the beginning of
+a line, after whitespace, or any of the delimiting characters `*`, `_`, `~`,
+and `(`.
+
+An [extended www autolink](@) will be recognized
+when the text `www.` is found followed by a [valid domain].
+A [valid domain](@) consists of segments
+of alphanumeric characters, underscores (`_`) and hyphens (`-`)
+separated by periods (`.`).
+There must be at least one period,
+and no underscores may be present in the last two segments of the domain.
+
+The scheme `http` will be inserted automatically:
+
+```````````````````````````````` example autolink
+www.commonmark.org
+.
+<p><a href="http://www.commonmark.org">www.commonmark.org</a></p>
+````````````````````````````````
+
+After a [valid domain], zero or more non-space non-`<` characters may follow:
+
+```````````````````````````````` example autolink
+Visit www.commonmark.org/help for more information.
+.
+<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
+````````````````````````````````
+
+We then apply [extended autolink path validation](@) as follows:
+
+Trailing punctuation (specifically, `?`, `!`, `.`, `,`, `:`, `*`, `_`, and `~`)
+will not be considered part of the autolink, though they may be included in the
+interior of the link:
+
+```````````````````````````````` example autolink
+Visit www.commonmark.org.
+
+Visit www.commonmark.org/a.b.
+.
+<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>
+````````````````````````````````
+
+When an autolink ends in `)`, we scan the entire autolink for the total number
+of parentheses. If there is a greater number of closing parentheses than
+opening ones, we don't consider the unmatched trailing parentheses part of the
+autolink, in order to facilitate including an autolink inside a parenthesis:
+
+```````````````````````````````` example autolink
+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)
+.
+<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>
+````````````````````````````````
+
+This check is only done when the link ends in a closing parentheses `)`, so if
+the only parentheses are in the interior of the autolink, no special rules are
+applied:
+
+```````````````````````````````` example autolink
+www.google.com/search?q=(business))+ok
+.
+<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
+````````````````````````````````
+
+If an autolink ends in a semicolon (`;`), we check to see if it appears to
+resemble an [entity reference][entity references]; if the preceding text is `&`
+followed by one or more alphanumeric characters. If so, it is excluded from
+the autolink:
+
+```````````````````````````````` example autolink
+www.google.com/search?q=commonmark&hl=en
+
+www.google.com/search?q=commonmark&hl;
+.
+<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>
+````````````````````````````````
+
+`<` immediately ends an autolink.
+
+```````````````````````````````` example autolink
+www.commonmark.org/he<lp
+.
+<p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
+````````````````````````````````
+
+An [extended url autolink](@) will be recognised when one of the schemes
+`http://`, `https://`, or `ftp://`, followed by a [valid domain], then zero or
+more non-space non-`<` characters according to
+[extended autolink path validation]:
+
+```````````````````````````````` example autolink
+http://commonmark.org
+
+(Visit https://encrypted.google.com/search?q=Markup+(business))
+
+Anonymous FTP is available at ftp://foo.bar.baz.
+.
+<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>
+````````````````````````````````
+
+
+An [extended email autolink](@) will be recognised when an email address is
+recognised within any text node. Email addresses are recognised according to
+the following rules:
+
+* One ore more characters which are alphanumeric, or `.`, `-`, `_`, or `+`.
+* An `@` symbol.
+* One or more characters which are alphanumeric, or `-` or `_`,
+ separated by periods (`.`).
+ There must be at least one period.
+ The last character must not be one of `-` or `_`.
+
+The scheme `mailto:` will automatically be added to the generated link:
+
+```````````````````````````````` example autolink
+foo@bar.baz
+.
+<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+````````````````````````````````
+
+`+` can occur before the `@`, but not after.
+
+```````````````````````````````` example autolink
+hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.
+.
+<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+````````````````````````````````
+
+`.`, `-`, and `_` can occur on both sides of the `@`, but only `.` may occur at
+the end of the email address, in which case it will not be considered part of
+the address:
+
+```````````````````````````````` example autolink
+a.b-c_d@a.b
+
+a.b-c_d@a.b.
+
+a.b-c_d@a.b-
+
+a.b-c_d@a.b_
+.
+<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>
+````````````````````````````````
+
+</div>
+
+## Raw HTML
+
+Text between `<` and `>` that looks like an HTML tag is parsed as a
+raw HTML tag and will be rendered in HTML without escaping.
+Tag and attribute names are not limited to current HTML tags,
+so custom tags (and even, say, DocBook tags) may be used.
+
+Here is the grammar for tags:
+
+A [tag name](@) consists of an ASCII letter
+followed by zero or more ASCII letters, digits, or
+hyphens (`-`).
+
+An [attribute](@) consists of [whitespace],
+an [attribute name], and an optional
+[attribute value specification].
+
+An [attribute name](@)
+consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII
+letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML
+specification restricted to ASCII. HTML5 is laxer.)
+
+An [attribute value specification](@)
+consists of optional [whitespace],
+a `=` character, optional [whitespace], and an [attribute
+value].
+
+An [attribute value](@)
+consists of an [unquoted attribute value],
+a [single-quoted attribute value], or a [double-quoted attribute value].
+
+An [unquoted attribute value](@)
+is a nonempty string of characters not
+including [whitespace], `"`, `'`, `=`, `<`, `>`, or `` ` ``.
+
+A [single-quoted attribute value](@)
+consists of `'`, zero or more
+characters not including `'`, and a final `'`.
+
+A [double-quoted attribute value](@)
+consists of `"`, zero or more
+characters not including `"`, and a final `"`.
+
+An [open tag](@) consists of a `<` character, a [tag name],
+zero or more [attributes], optional [whitespace], an optional `/`
+character, and a `>` character.
+
+A [closing tag](@) consists of the string `</`, a
+[tag name], optional [whitespace], and the character `>`.
+
+An [HTML comment](@) consists of `<!--` + *text* + `-->`,
+where *text* does not start with `>` or `->`, does not end with `-`,
+and does not contain `--`. (See the
+[HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).)
+
+A [processing instruction](@)
+consists of the string `<?`, a string
+of characters not including the string `?>`, and the string
+`?>`.
+
+A [declaration](@) consists of the
+string `<!`, a name consisting of one or more uppercase ASCII letters,
+[whitespace], a string of characters not including the
+character `>`, and the character `>`.
+
+A [CDATA section](@) consists of
+the string `<![CDATA[`, a string of characters not including the string
+`]]>`, and the string `]]>`.
+
+An [HTML tag](@) consists of an [open tag], a [closing tag],
+an [HTML comment], a [processing instruction], a [declaration],
+or a [CDATA section].
+
+Here are some simple open tags:
+
+```````````````````````````````` example
+<a><bab><c2c>
+.
+<p><a><bab><c2c></p>
+````````````````````````````````
+
+
+Empty elements:
+
+```````````````````````````````` example
+<a/><b2/>
+.
+<p><a/><b2/></p>
+````````````````````````````````
+
+
+[Whitespace] is allowed:
+
+```````````````````````````````` example
+<a /><b2
+data="foo" >
+.
+<p><a /><b2
+data="foo" ></p>
+````````````````````````````````
+
+
+With attributes:
+
+```````````````````````````````` example
+<a foo="bar" bam = 'baz <em>"</em>'
+_boolean zoop:33=zoop:33 />
+.
+<p><a foo="bar" bam = 'baz <em>"</em>'
+_boolean zoop:33=zoop:33 /></p>
+````````````````````````````````
+
+
+Custom tag names can be used:
+
+```````````````````````````````` example
+Foo <responsive-image src="foo.jpg" />
+.
+<p>Foo <responsive-image src="foo.jpg" /></p>
+````````````````````````````````
+
+
+Illegal tag names, not parsed as HTML:
+
+```````````````````````````````` example
+<33> <__>
+.
+<p>&lt;33&gt; &lt;__&gt;</p>
+````````````````````````````````
+
+
+Illegal attribute names:
+
+```````````````````````````````` example
+<a h*#ref="hi">
+.
+<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>
+````````````````````````````````
+
+
+Illegal attribute values:
+
+```````````````````````````````` example
+<a href="hi'> <a href=hi'>
+.
+<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>
+````````````````````````````````
+
+
+Illegal [whitespace]:
+
+```````````````````````````````` example
+< a><
+foo><bar/ >
+<foo bar=baz
+bim!bop />
+.
+<p>&lt; a&gt;&lt;
+foo&gt;&lt;bar/ &gt;
+&lt;foo bar=baz
+bim!bop /&gt;</p>
+````````````````````````````````
+
+
+Missing [whitespace]:
+
+```````````````````````````````` example
+<a href='bar'title=title>
+.
+<p>&lt;a href='bar'title=title&gt;</p>
+````````````````````````````````
+
+
+Closing tags:
+
+```````````````````````````````` example
+</a></foo >
+.
+<p></a></foo ></p>
+````````````````````````````````
+
+
+Illegal attributes in closing tag:
+
+```````````````````````````````` example
+</a href="foo">
+.
+<p>&lt;/a href=&quot;foo&quot;&gt;</p>
+````````````````````````````````
+
+
+Comments:
+
+```````````````````````````````` example
+foo <!-- this is a
+comment - with hyphen -->
+.
+<p>foo <!-- this is a
+comment - with hyphen --></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo <!-- not a comment -- two hyphens -->
+.
+<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+````````````````````````````````
+
+
+Not comments:
+
+```````````````````````````````` example
+foo <!--> foo -->
+
+foo <!-- foo--->
+.
+<p>foo &lt;!--&gt; foo --&gt;</p>
+<p>foo &lt;!-- foo---&gt;</p>
+````````````````````````````````
+
+
+Processing instructions:
+
+```````````````````````````````` example
+foo <?php echo $a; ?>
+.
+<p>foo <?php echo $a; ?></p>
+````````````````````````````````
+
+
+Declarations:
+
+```````````````````````````````` example
+foo <!ELEMENT br EMPTY>
+.
+<p>foo <!ELEMENT br EMPTY></p>
+````````````````````````````````
+
+
+CDATA sections:
+
+```````````````````````````````` example
+foo <![CDATA[>&<]]>
+.
+<p>foo <![CDATA[>&<]]></p>
+````````````````````````````````
+
+
+Entity and numeric character references are preserved in HTML
+attributes:
+
+```````````````````````````````` example
+foo <a href="&ouml;">
+.
+<p>foo <a href="&ouml;"></p>
+````````````````````````````````
+
+
+Backslash escapes do not work in HTML attributes:
+
+```````````````````````````````` example
+foo <a href="\*">
+.
+<p>foo <a href="\*"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="\"">
+.
+<p>&lt;a href=&quot;&quot;&quot;&gt;</p>
+````````````````````````````````
+
+
+<div class="extension">
+
+## Disallowed Raw HTML (extension)
+
+GFM enables the `tagfilter` extension, where the following HTML tags will be
+filtered when rendering HTML output:
+
+* `<title>`
+* `<textarea>`
+* `<style>`
+* `<xmp>`
+* `<iframe>`
+* `<noembed>`
+* `<noframes>`
+* `<script>`
+* `<plaintext>`
+
+Filtering is done by replacing the leading `<` with the entity `&lt;`. These
+tags are chosen in particular as they change how HTML is interpreted in a way
+unique to them (i.e. nested HTML is interpreted differently), and this is
+usually undesireable in the context of other rendered Markdown content.
+
+All other HTML tags are left untouched.
+
+```````````````````````````````` example tagfilter
+<strong> <title> <style> <em>
+
+<blockquote>
+ <xmp> is disallowed. <XMP> is also disallowed.
+</blockquote>
+.
+<p><strong> &lt;title> &lt;style> <em></p>
+<blockquote>
+ &lt;xmp> is disallowed. &lt;XMP> is also disallowed.
+</blockquote>
+````````````````````````````````
+
+</div>
+
+## Hard line breaks
+
+A line break (not in a code span or HTML tag) that is preceded
+by two or more spaces and does not occur at the end of a block
+is parsed as a [hard line break](@) (rendered
+in HTML as a `<br />` tag):
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+For a more visible alternative, a backslash before the
+[line ending] may be used instead of two spaces:
+
+```````````````````````````````` example
+foo\
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+More than two spaces can be used:
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+Leading spaces at the beginning of the next line are ignored:
+
+```````````````````````````````` example
+foo
+ bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo\
+ bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+Line breaks can occur inside emphasis, links, and other constructs
+that allow inline content:
+
+```````````````````````````````` example
+*foo
+bar*
+.
+<p><em>foo<br />
+bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo\
+bar*
+.
+<p><em>foo<br />
+bar</em></p>
+````````````````````````````````
+
+
+Line breaks do not occur inside code spans
+
+```````````````````````````````` example
+`code
+span`
+.
+<p><code>code span</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`code\
+span`
+.
+<p><code>code\ span</code></p>
+````````````````````````````````
+
+
+or HTML tags:
+
+```````````````````````````````` example
+<a href="foo
+bar">
+.
+<p><a href="foo
+bar"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="foo\
+bar">
+.
+<p><a href="foo\
+bar"></p>
+````````````````````````````````
+
+
+Hard line breaks are for separating inline content within a block.
+Neither syntax for hard line breaks works at the end of a paragraph or
+other block element:
+
+```````````````````````````````` example
+foo\
+.
+<p>foo\</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+.
+<p>foo</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo\
+.
+<h3>foo\</h3>
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo
+.
+<h3>foo</h3>
+````````````````````````````````
+
+
+## Soft line breaks
+
+A regular line break (not in a code span or HTML tag) that is not
+preceded by two or more spaces or a backslash is parsed as a
+[softbreak](@). (A softbreak may be rendered in HTML either as a
+[line ending] or as a space. The result will be the same in
+browsers. In the examples here, a [line ending] will be used.)
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo
+baz</p>
+````````````````````````````````
+
+
+Spaces at the end of the line and beginning of the next line are
+removed:
+
+```````````````````````````````` example
+foo
+ baz
+.
+<p>foo
+baz</p>
+````````````````````````````````
+
+
+A conforming parser may render a soft line break in HTML either as a
+line break or as a space.
+
+A renderer may also provide an option to render soft line breaks
+as hard line breaks.
+
+## Textual content
+
+Any characters not given an interpretation by the above rules will
+be parsed as plain textual content.
+
+```````````````````````````````` example
+hello $.;'there
+.
+<p>hello $.;'there</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo χÏῆν
+.
+<p>Foo χÏῆν</p>
+````````````````````````````````
+
+
+Internal spaces are preserved verbatim:
+
+```````````````````````````````` example
+Multiple spaces
+.
+<p>Multiple spaces</p>
+````````````````````````````````
+
+
+<!-- END TESTS -->
+
+# Appendix: A parsing strategy
+
+In this appendix we describe some features of the parsing strategy
+used in the CommonMark reference implementations.
+
+## Overview
+
+Parsing has two phases:
+
+1. In the first phase, lines of input are consumed and the block
+structure of the document---its division into paragraphs, block quotes,
+list items, and so on---is constructed. Text is assigned to these
+blocks but not parsed. Link reference definitions are parsed and a
+map of links is constructed.
+
+2. In the second phase, the raw text contents of paragraphs and headings
+are parsed into sequences of Markdown inline elements (strings,
+code spans, links, emphasis, and so on), using the map of link
+references constructed in phase 1.
+
+At each point in processing, the document is represented as a tree of
+**blocks**. The root of the tree is a `document` block. The `document`
+may have any number of other blocks as **children**. These children
+may, in turn, have other blocks as children. The last child of a block
+is normally considered **open**, meaning that subsequent lines of input
+can alter its contents. (Blocks that are not open are **closed**.)
+Here, for example, is a possible document tree, with the open blocks
+marked by arrows:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 1: block structure
+
+Each line that is processed has an effect on this tree. The line is
+analyzed and, depending on its contents, the document may be altered
+in one or more of the following ways:
+
+1. One or more open blocks may be closed.
+2. One or more new blocks may be created as children of the
+ last open block.
+3. Text may be added to the last (deepest) open block remaining
+ on the tree.
+
+Once a line has been incorporated into the tree in this way,
+it can be discarded, so input can be read in a stream.
+
+For each line, we follow this procedure:
+
+1. First we iterate through the open blocks, starting with the
+root document, and descending through last children down to the last
+open block. Each block imposes a condition that the line must satisfy
+if the block is to remain open. For example, a block quote requires a
+`>` character. A paragraph requires a non-blank line.
+In this phase we may match all or just some of the open
+blocks. But we cannot close unmatched blocks yet, because we may have a
+[lazy continuation line].
+
+2. Next, after consuming the continuation markers for existing
+blocks, we look for new block starts (e.g. `>` for a block quote).
+If we encounter a new block start, we close any blocks unmatched
+in step 1 before creating the new block as a child of the last
+matched block.
+
+3. Finally, we look at the remainder of the line (after block
+markers like `>`, list markers, and indentation have been consumed).
+This is text that can be incorporated into the last open
+block (a paragraph, code block, heading, or raw HTML).
+
+Setext headings are formed when we see a line of a paragraph
+that is a [setext heading underline].
+
+Reference link definitions are detected when a paragraph is closed;
+the accumulated text lines are parsed to see if they begin with
+one or more reference link definitions. Any remainder becomes a
+normal paragraph.
+
+We can see how this works by considering how the tree above is
+generated by four lines of Markdown:
+
+``` markdown
+> Lorem ipsum dolor
+sit amet.
+> - Qui *quodsi iracundia*
+> - aliquando id
+```
+
+At the outset, our document model is just
+
+``` tree
+-> document
+```
+
+The first line of our text,
+
+``` markdown
+> Lorem ipsum dolor
+```
+
+causes a `block_quote` block to be created as a child of our
+open `document` block, and a `paragraph` block as a child of
+the `block_quote`. Then the text is added to the last open
+block, the `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor"
+```
+
+The next line,
+
+``` markdown
+sit amet.
+```
+
+is a "lazy continuation" of the open `paragraph`, so it gets added
+to the paragraph's text:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor\nsit amet."
+```
+
+The third line,
+
+``` markdown
+> - Qui *quodsi iracundia*
+```
+
+causes the `paragraph` block to be closed, and a new `list` block
+opened as a child of the `block_quote`. A `list_item` is also
+added as a child of the `list`, and a `paragraph` as a child of
+the `list_item`. The text is then added to the new `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ -> list_item
+ -> paragraph
+ "Qui *quodsi iracundia*"
+```
+
+The fourth line,
+
+``` markdown
+> - aliquando id
+```
+
+causes the `list_item` (and its child the `paragraph`) to be closed,
+and a new `list_item` opened up as child of the `list`. A `paragraph`
+is added as a child of the new `list_item`, to contain the text.
+We thus obtain the final tree:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 2: inline structure
+
+Once all of the input has been parsed, all open blocks are closed.
+
+We then "walk the tree," visiting every node, and parse raw
+string contents of paragraphs and headings as inlines. At this
+point we have seen all the link reference definitions, so we can
+resolve reference links as we go.
+
+``` tree
+document
+ block_quote
+ paragraph
+ str "Lorem ipsum dolor"
+ softbreak
+ str "sit amet."
+ list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ str "Qui "
+ emph
+ str "quodsi iracundia"
+ list_item
+ paragraph
+ str "aliquando id"
+```
+
+Notice how the [line ending] in the first paragraph has
+been parsed as a `softbreak`, and the asterisks in the first list item
+have become an `emph`.
+
+### An algorithm for parsing nested emphasis and links
+
+By far the trickiest part of inline parsing is handling emphasis,
+strong emphasis, links, and images. This is done using the following
+algorithm.
+
+When we're parsing inlines and we hit either
+
+- a run of `*` or `_` characters, or
+- a `[` or `![`
+
+we insert a text node with these symbols as its literal content, and we
+add a pointer to this text node to the [delimiter stack](@).
+
+The [delimiter stack] is a doubly linked list. Each
+element contains a pointer to a text node, plus information about
+
+- the type of delimiter (`[`, `![`, `*`, `_`)
+- the number of delimiters,
+- whether the delimiter is "active" (all are active to start), and
+- whether the delimiter is a potential opener, a potential closer,
+ or both (which depends on what sort of characters precede
+ and follow the delimiters).
+
+When we hit a `]` character, we call the *look for link or image*
+procedure (see below).
+
+When we hit the end of the input, we call the *process emphasis*
+procedure (see below), with `stack_bottom` = NULL.
+
+#### *look for link or image*
+
+Starting at the top of the delimiter stack, we look backwards
+through the stack for an opening `[` or `![` delimiter.
+
+- If we don't find one, we return a literal text node `]`.
+
+- If we do find one, but it's not *active*, we remove the inactive
+ delimiter from the stack, and return a literal text node `]`.
+
+- If we find one and it's active, then we parse ahead to see if
+ we have an inline link/image, reference link/image, compact reference
+ link/image, or shortcut reference link/image.
+
+ + If we don't, then we remove the opening delimiter from the
+ delimiter stack and return a literal text node `]`.
+
+ + If we do, then
+
+ * We return a link or image node whose children are the inlines
+ after the text node pointed to by the opening delimiter.
+
+ * We run *process emphasis* on these inlines, with the `[` opener
+ as `stack_bottom`.
+
+ * We remove the opening delimiter.
+
+ * If we have a link (and not an image), we also set all
+ `[` delimiters before the opening delimiter to *inactive*. (This
+ will prevent us from getting links within links.)
+
+#### *process emphasis*
+
+Parameter `stack_bottom` sets a lower bound to how far we
+descend in the [delimiter stack]. If it is NULL, we can
+go all the way to the bottom. Otherwise, we stop before
+visiting `stack_bottom`.
+
+Let `current_position` point to the element on the [delimiter stack]
+just above `stack_bottom` (or the first element if `stack_bottom`
+is NULL).
+
+We keep track of the `openers_bottom` for each delimiter
+type (`*`, `_`) and each length of the closing delimiter run
+(modulo 3). Initialize this to `stack_bottom`.
+
+Then we repeat the following until we run out of potential
+closers:
+
+- Move `current_position` forward in the delimiter stack (if needed)
+ until we find the first potential closer with delimiter `*` or `_`.
+ (This will be the potential closer closest
+ to the beginning of the input -- the first one in parse order.)
+
+- Now, look back in the stack (staying above `stack_bottom` and
+ the `openers_bottom` for this delimiter type) for the
+ first matching potential opener ("matching" means same delimiter).
+
+- If one is found:
+
+ + Figure out whether we have emphasis or strong emphasis:
+ if both closer and opener spans have length >= 2, we have
+ strong, otherwise regular.
+
+ + Insert an emph or strong emph node accordingly, after
+ the text node corresponding to the opener.
+
+ + Remove any delimiters between the opener and closer from
+ the delimiter stack.
+
+ + Remove 1 (for regular emph) or 2 (for strong emph) delimiters
+ from the opening and closing text nodes. If they become empty
+ as a result, remove them and remove the corresponding element
+ of the delimiter stack. If the closing node is removed, reset
+ `current_position` to the next element in the stack.
+
+- If none is found:
+
+ + Set `openers_bottom` to the element before `current_position`.
+ (We know that there are no openers for this kind of closer up to and
+ including this point, so this puts a lower bound on future searches.)
+
+ + If the closer at `current_position` is not a potential opener,
+ remove it from the delimiter stack (since we know it can't
+ be a closer either).
+
+ + Advance `current_position` to the next element in the stack.
+
+After we're done, we remove all delimiters above `stack_bottom` from the
+delimiter stack.
+
diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt b/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt
new file mode 100644
index 00000000000..91cc9c3b4d7
--- /dev/null
+++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_canonical_examples.txt
@@ -0,0 +1,23 @@
+# First GitLab-Specific Section with Examples
+
+## Strong but with two asterisks
+
+```````````````````````````````` example
+**bold**
+.
+<p><strong>bold</strong></p>
+````````````````````````````````
+
+# Second GitLab-Specific Section with Examples
+
+## Strong but with HTML
+
+```````````````````````````````` example
+<strong>
+bold
+</strong>
+.
+<p><strong>
+bold
+</strong></p>
+````````````````````````````````
diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml
new file mode 100644
index 00000000000..3124da068c3
--- /dev/null
+++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_example_status.yml
@@ -0,0 +1,17 @@
+---
+- 06_05__inlines__emphasis_and_strong_emphasis__37:
+ skip_update_example_snapshots: 'Psych YAML library has a problem with dumping "5__6__78", it thinks its an invalid integer'
+- 07_01_first_gitlab_specific_section_with_examples_strong_but_with_two_asterisks:
+ skip_update_example_snapshots: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: false
+- 07_02_first_gitlab_specific_section_with_examples_strong_but_with_html:
+ skip_update_example_snapshots: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: false
diff --git a/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt b/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt
new file mode 100644
index 00000000000..b5351bf37de
--- /dev/null
+++ b/glfm_specification/input/gitlab_flavored_markdown/glfm_intro.txt
@@ -0,0 +1,3 @@
+# Introduction
+
+TODO: Write a GitLab-specific version of the GitHub Flavored Markdown intro section.
diff --git a/glfm_specification/output/spec.html b/glfm_specification/output/spec.html
new file mode 100644
index 00000000000..b8315390200
--- /dev/null
+++ b/glfm_specification/output/spec.html
@@ -0,0 +1 @@
+PLACEHOLDER FILE. Actual contents will be added in a future MR.
diff --git a/glfm_specification/output/spec.txt b/glfm_specification/output/spec.txt
new file mode 100644
index 00000000000..059a934ee32
--- /dev/null
+++ b/glfm_specification/output/spec.txt
@@ -0,0 +1,9965 @@
+---
+title: GitLab Flavored Markdown (GLFM) Spec
+version: alpha
+...
+
+# Introduction
+
+TODO: Write a GitLab-specific version of the GitHub Flavored Markdown intro section.
+
+# Preliminaries
+
+## Characters and lines
+
+Any sequence of [characters] is a valid CommonMark
+document.
+
+A [character](@) is a Unicode code point. Although some
+code points (for example, combining accents) do not correspond to
+characters in an intuitive sense, all code points count as characters
+for purposes of this spec.
+
+This spec does not specify an encoding; it thinks of lines as composed
+of [characters] rather than bytes. A conforming parser may be limited
+to a certain encoding.
+
+A [line](@) is a sequence of zero or more [characters]
+other than newline (`U+000A`) or carriage return (`U+000D`),
+followed by a [line ending] or by the end of file.
+
+A [line ending](@) is a newline (`U+000A`), a carriage return
+(`U+000D`) not followed by a newline, or a carriage return and a
+following newline.
+
+A line containing no characters, or a line containing only spaces
+(`U+0020`) or tabs (`U+0009`), is called a [blank line](@).
+
+The following definitions of character classes will be used in this spec:
+
+A [whitespace character](@) is a space
+(`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`),
+form feed (`U+000C`), or carriage return (`U+000D`).
+
+[Whitespace](@) is a sequence of one or more [whitespace
+characters].
+
+A [Unicode whitespace character](@) is
+any code point in the Unicode `Zs` general category, or a tab (`U+0009`),
+carriage return (`U+000D`), newline (`U+000A`), or form feed
+(`U+000C`).
+
+[Unicode whitespace](@) is a sequence of one
+or more [Unicode whitespace characters].
+
+A [space](@) is `U+0020`.
+
+A [non-whitespace character](@) is any character
+that is not a [whitespace character].
+
+An [ASCII punctuation character](@)
+is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`,
+`*`, `+`, `,`, `-`, `.`, `/` (U+0021–2F),
+`:`, `;`, `<`, `=`, `>`, `?`, `@` (U+003A–0040),
+`[`, `\`, `]`, `^`, `_`, `` ` `` (U+005B–0060),
+`{`, `|`, `}`, or `~` (U+007B–007E).
+
+A [punctuation character](@) is an [ASCII
+punctuation character] or anything in
+the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`.
+
+## Tabs
+
+Tabs in lines are not expanded to [spaces]. However,
+in contexts where whitespace helps to define block structure,
+tabs behave as if they were replaced by spaces with a tab stop
+of 4 characters.
+
+Thus, for example, a tab can be used instead of four spaces
+in an indented code block. (Note, however, that internal
+tabs are passed through as literal tabs, not expanded to
+spaces.)
+
+```````````````````````````````` example
+→foo→baz→→bim
+.
+<pre><code>foo→baz→→bim
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ →foo→baz→→bim
+.
+<pre><code>foo→baz→→bim
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ a→a
+ á½â†’a
+.
+<pre><code>a→a
+á½â†’a
+</code></pre>
+````````````````````````````````
+
+In the following example, a continuation paragraph of a list
+item is indented with a tab; this has exactly the same effect
+as indentation with four spaces would:
+
+```````````````````````````````` example
+ - foo
+
+→bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+- foo
+
+→→bar
+.
+<ul>
+<li>
+<p>foo</p>
+<pre><code> bar
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+Normally the `>` that begins a block quote may be followed
+optionally by a space, which is not considered part of the
+content. In the following case `>` is followed by a tab,
+which is treated as if it were expanded into three spaces.
+Since one of these spaces is considered part of the
+delimiter, `foo` is considered to be indented six spaces
+inside the block quote context, so we get an indented
+code block starting with two spaces.
+
+```````````````````````````````` example
+>→→foo
+.
+<blockquote>
+<pre><code> foo
+</code></pre>
+</blockquote>
+````````````````````````````````
+
+```````````````````````````````` example
+-→→foo
+.
+<ul>
+<li>
+<pre><code> foo
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ foo
+→bar
+.
+<pre><code>foo
+bar
+</code></pre>
+````````````````````````````````
+
+```````````````````````````````` example
+ - foo
+ - bar
+→ - baz
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>baz</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+#→Foo
+.
+<h1>Foo</h1>
+````````````````````````````````
+
+```````````````````````````````` example
+*→*→*→
+.
+<hr />
+````````````````````````````````
+
+
+## Insecure characters
+
+For security reasons, the Unicode character `U+0000` must be replaced
+with the REPLACEMENT CHARACTER (`U+FFFD`).
+
+# Blocks and inlines
+
+We can think of a document as a sequence of
+[blocks](@)---structural elements like paragraphs, block
+quotations, lists, headings, rules, and code blocks. Some blocks (like
+block quotes and list items) contain other blocks; others (like
+headings and paragraphs) contain [inline](@) content---text,
+links, emphasized text, images, code spans, and so on.
+
+## Precedence
+
+Indicators of block structure always take precedence over indicators
+of inline structure. So, for example, the following is a list with
+two items, not a list with one item containing a code span:
+
+```````````````````````````````` example
+- `one
+- two`
+.
+<ul>
+<li>`one</li>
+<li>two`</li>
+</ul>
+````````````````````````````````
+
+
+This means that parsing can proceed in two steps: first, the block
+structure of the document can be discerned; second, text lines inside
+paragraphs, headings, and other block constructs can be parsed for inline
+structure. The second step requires information about link reference
+definitions that will be available only at the end of the first
+step. Note that the first step requires processing lines in sequence,
+but the second can be parallelized, since the inline parsing of
+one block element does not affect the inline parsing of any other.
+
+## Container blocks and leaf blocks
+
+We can divide blocks into two types:
+[container blocks](@),
+which can contain other blocks, and [leaf blocks](@),
+which cannot.
+
+# Leaf blocks
+
+This section describes the different kinds of leaf block that make up a
+Markdown document.
+
+## Thematic breaks
+
+A line consisting of 0-3 spaces of indentation, followed by a sequence
+of three or more matching `-`, `_`, or `*` characters, each followed
+optionally by any number of spaces or tabs, forms a
+[thematic break](@).
+
+```````````````````````````````` example
+***
+---
+___
+.
+<hr />
+<hr />
+<hr />
+````````````````````````````````
+
+
+Wrong characters:
+
+```````````````````````````````` example
++++
+.
+<p>+++</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+===
+.
+<p>===</p>
+````````````````````````````````
+
+
+Not enough characters:
+
+```````````````````````````````` example
+--
+**
+__
+.
+<p>--
+**
+__</p>
+````````````````````````````````
+
+
+One to three spaces indent are allowed:
+
+```````````````````````````````` example
+ ***
+ ***
+ ***
+.
+<hr />
+<hr />
+<hr />
+````````````````````````````````
+
+
+Four spaces is too many:
+
+```````````````````````````````` example
+ ***
+.
+<pre><code>***
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo
+ ***
+.
+<p>Foo
+***</p>
+````````````````````````````````
+
+
+More than three characters may be used:
+
+```````````````````````````````` example
+_____________________________________
+.
+<hr />
+````````````````````````````````
+
+
+Spaces are allowed between the characters:
+
+```````````````````````````````` example
+ - - -
+.
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ** * ** * ** * **
+.
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+- - - -
+.
+<hr />
+````````````````````````````````
+
+
+Spaces are allowed at the end:
+
+```````````````````````````````` example
+- - - -
+.
+<hr />
+````````````````````````````````
+
+
+However, no other characters may occur in the line:
+
+```````````````````````````````` example
+_ _ _ _ a
+
+a------
+
+---a---
+.
+<p>_ _ _ _ a</p>
+<p>a------</p>
+<p>---a---</p>
+````````````````````````````````
+
+
+It is required that all of the [non-whitespace characters] be the same.
+So, this is not a thematic break:
+
+```````````````````````````````` example
+ *-*
+.
+<p><em>-</em></p>
+````````````````````````````````
+
+
+Thematic breaks do not need blank lines before or after:
+
+```````````````````````````````` example
+- foo
+***
+- bar
+.
+<ul>
+<li>foo</li>
+</ul>
+<hr />
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+Thematic breaks can interrupt a paragraph:
+
+```````````````````````````````` example
+Foo
+***
+bar
+.
+<p>Foo</p>
+<hr />
+<p>bar</p>
+````````````````````````````````
+
+
+If a line of dashes that meets the above conditions for being a
+thematic break could also be interpreted as the underline of a [setext
+heading], the interpretation as a
+[setext heading] takes precedence. Thus, for example,
+this is a setext heading, not a paragraph followed by a thematic break:
+
+```````````````````````````````` example
+Foo
+---
+bar
+.
+<h2>Foo</h2>
+<p>bar</p>
+````````````````````````````````
+
+
+When both a thematic break and a list item are possible
+interpretations of a line, the thematic break takes precedence:
+
+```````````````````````````````` example
+* Foo
+* * *
+* Bar
+.
+<ul>
+<li>Foo</li>
+</ul>
+<hr />
+<ul>
+<li>Bar</li>
+</ul>
+````````````````````````````````
+
+
+If you want a thematic break in a list item, use a different bullet:
+
+```````````````````````````````` example
+- Foo
+- * * *
+.
+<ul>
+<li>Foo</li>
+<li>
+<hr />
+</li>
+</ul>
+````````````````````````````````
+
+
+## ATX headings
+
+An [ATX heading](@)
+consists of a string of characters, parsed as inline content, between an
+opening sequence of 1--6 unescaped `#` characters and an optional
+closing sequence of any number of unescaped `#` characters.
+The opening sequence of `#` characters must be followed by a
+[space] or by the end of line. The optional closing sequence of `#`s must be
+preceded by a [space] and may be followed by spaces only. The opening
+`#` character may be indented 0-3 spaces. The raw contents of the
+heading are stripped of leading and trailing spaces before being parsed
+as inline content. The heading level is equal to the number of `#`
+characters in the opening sequence.
+
+Simple headings:
+
+```````````````````````````````` example
+# foo
+## foo
+### foo
+#### foo
+##### foo
+###### foo
+.
+<h1>foo</h1>
+<h2>foo</h2>
+<h3>foo</h3>
+<h4>foo</h4>
+<h5>foo</h5>
+<h6>foo</h6>
+````````````````````````````````
+
+
+More than six `#` characters is not a heading:
+
+```````````````````````````````` example
+####### foo
+.
+<p>####### foo</p>
+````````````````````````````````
+
+
+At least one space is required between the `#` characters and the
+heading's contents, unless the heading is empty. Note that many
+implementations currently do not require the space. However, the
+space was required by the
+[original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py),
+and it helps prevent things like the following from being parsed as
+headings:
+
+```````````````````````````````` example
+#5 bolt
+
+#hashtag
+.
+<p>#5 bolt</p>
+<p>#hashtag</p>
+````````````````````````````````
+
+
+This is not a heading, because the first `#` is escaped:
+
+```````````````````````````````` example
+\## foo
+.
+<p>## foo</p>
+````````````````````````````````
+
+
+Contents are parsed as inlines:
+
+```````````````````````````````` example
+# foo *bar* \*baz\*
+.
+<h1>foo <em>bar</em> *baz*</h1>
+````````````````````````````````
+
+
+Leading and trailing [whitespace] is ignored in parsing inline content:
+
+```````````````````````````````` example
+# foo
+.
+<h1>foo</h1>
+````````````````````````````````
+
+
+One to three spaces indentation are allowed:
+
+```````````````````````````````` example
+ ### foo
+ ## foo
+ # foo
+.
+<h3>foo</h3>
+<h2>foo</h2>
+<h1>foo</h1>
+````````````````````````````````
+
+
+Four spaces are too much:
+
+```````````````````````````````` example
+ # foo
+.
+<pre><code># foo
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+ # bar
+.
+<p>foo
+# bar</p>
+````````````````````````````````
+
+
+A closing sequence of `#` characters is optional:
+
+```````````````````````````````` example
+## foo ##
+ ### bar ###
+.
+<h2>foo</h2>
+<h3>bar</h3>
+````````````````````````````````
+
+
+It need not be the same length as the opening sequence:
+
+```````````````````````````````` example
+# foo ##################################
+##### foo ##
+.
+<h1>foo</h1>
+<h5>foo</h5>
+````````````````````````````````
+
+
+Spaces are allowed after the closing sequence:
+
+```````````````````````````````` example
+### foo ###
+.
+<h3>foo</h3>
+````````````````````````````````
+
+
+A sequence of `#` characters with anything but [spaces] following it
+is not a closing sequence, but counts as part of the contents of the
+heading:
+
+```````````````````````````````` example
+### foo ### b
+.
+<h3>foo ### b</h3>
+````````````````````````````````
+
+
+The closing sequence must be preceded by a space:
+
+```````````````````````````````` example
+# foo#
+.
+<h1>foo#</h1>
+````````````````````````````````
+
+
+Backslash-escaped `#` characters do not count as part
+of the closing sequence:
+
+```````````````````````````````` example
+### foo \###
+## foo #\##
+# foo \#
+.
+<h3>foo ###</h3>
+<h2>foo ###</h2>
+<h1>foo #</h1>
+````````````````````````````````
+
+
+ATX headings need not be separated from surrounding content by blank
+lines, and they can interrupt paragraphs:
+
+```````````````````````````````` example
+****
+## foo
+****
+.
+<hr />
+<h2>foo</h2>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo bar
+# baz
+Bar foo
+.
+<p>Foo bar</p>
+<h1>baz</h1>
+<p>Bar foo</p>
+````````````````````````````````
+
+
+ATX headings can be empty:
+
+```````````````````````````````` example
+##
+#
+### ###
+.
+<h2></h2>
+<h1></h1>
+<h3></h3>
+````````````````````````````````
+
+
+## Setext headings
+
+A [setext heading](@) consists of one or more
+lines of text, each containing at least one [non-whitespace
+character], with no more than 3 spaces indentation, followed by
+a [setext heading underline]. The lines of text must be such
+that, were they not followed by the setext heading underline,
+they would be interpreted as a paragraph: they cannot be
+interpretable as a [code fence], [ATX heading][ATX headings],
+[block quote][block quotes], [thematic break][thematic breaks],
+[list item][list items], or [HTML block][HTML blocks].
+
+A [setext heading underline](@) is a sequence of
+`=` characters or a sequence of `-` characters, with no more than 3
+spaces indentation and any number of trailing spaces. If a line
+containing a single `-` can be interpreted as an
+empty [list items], it should be interpreted this way
+and not as a [setext heading underline].
+
+The heading is a level 1 heading if `=` characters are used in
+the [setext heading underline], and a level 2 heading if `-`
+characters are used. The contents of the heading are the result
+of parsing the preceding lines of text as CommonMark inline
+content.
+
+In general, a setext heading need not be preceded or followed by a
+blank line. However, it cannot interrupt a paragraph, so when a
+setext heading comes after a paragraph, a blank line is needed between
+them.
+
+Simple examples:
+
+```````````````````````````````` example
+Foo *bar*
+=========
+
+Foo *bar*
+---------
+.
+<h1>Foo <em>bar</em></h1>
+<h2>Foo <em>bar</em></h2>
+````````````````````````````````
+
+
+The content of the header may span more than one line:
+
+```````````````````````````````` example
+Foo *bar
+baz*
+====
+.
+<h1>Foo <em>bar
+baz</em></h1>
+````````````````````````````````
+
+The contents are the result of parsing the headings's raw
+content as inlines. The heading's raw content is formed by
+concatenating the lines and removing initial and final
+[whitespace].
+
+```````````````````````````````` example
+ Foo *bar
+baz*→
+====
+.
+<h1>Foo <em>bar
+baz</em></h1>
+````````````````````````````````
+
+
+The underlining can be any length:
+
+```````````````````````````````` example
+Foo
+-------------------------
+
+Foo
+=
+.
+<h2>Foo</h2>
+<h1>Foo</h1>
+````````````````````````````````
+
+
+The heading content can be indented up to three spaces, and need
+not line up with the underlining:
+
+```````````````````````````````` example
+ Foo
+---
+
+ Foo
+-----
+
+ Foo
+ ===
+.
+<h2>Foo</h2>
+<h2>Foo</h2>
+<h1>Foo</h1>
+````````````````````````````````
+
+
+Four spaces indent is too much:
+
+```````````````````````````````` example
+ Foo
+ ---
+
+ Foo
+---
+.
+<pre><code>Foo
+---
+
+Foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+The setext heading underline can be indented up to three spaces, and
+may have trailing spaces:
+
+```````````````````````````````` example
+Foo
+ ----
+.
+<h2>Foo</h2>
+````````````````````````````````
+
+
+Four spaces is too much:
+
+```````````````````````````````` example
+Foo
+ ---
+.
+<p>Foo
+---</p>
+````````````````````````````````
+
+
+The setext heading underline cannot contain internal spaces:
+
+```````````````````````````````` example
+Foo
+= =
+
+Foo
+--- -
+.
+<p>Foo
+= =</p>
+<p>Foo</p>
+<hr />
+````````````````````````````````
+
+
+Trailing spaces in the content line do not cause a line break:
+
+```````````````````````````````` example
+Foo
+-----
+.
+<h2>Foo</h2>
+````````````````````````````````
+
+
+Nor does a backslash at the end:
+
+```````````````````````````````` example
+Foo\
+----
+.
+<h2>Foo\</h2>
+````````````````````````````````
+
+
+Since indicators of block structure take precedence over
+indicators of inline structure, the following are setext headings:
+
+```````````````````````````````` example
+`Foo
+----
+`
+
+<a title="a lot
+---
+of dashes"/>
+.
+<h2>`Foo</h2>
+<p>`</p>
+<h2>&lt;a title=&quot;a lot</h2>
+<p>of dashes&quot;/&gt;</p>
+````````````````````````````````
+
+
+The setext heading underline cannot be a [lazy continuation
+line] in a list item or block quote:
+
+```````````````````````````````` example
+> Foo
+---
+.
+<blockquote>
+<p>Foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+> foo
+bar
+===
+.
+<blockquote>
+<p>foo
+bar
+===</p>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- Foo
+---
+.
+<ul>
+<li>Foo</li>
+</ul>
+<hr />
+````````````````````````````````
+
+
+A blank line is needed between a paragraph and a following
+setext heading, since otherwise the paragraph becomes part
+of the heading's content:
+
+```````````````````````````````` example
+Foo
+Bar
+---
+.
+<h2>Foo
+Bar</h2>
+````````````````````````````````
+
+
+But in general a blank line is not required before or after
+setext headings:
+
+```````````````````````````````` example
+---
+Foo
+---
+Bar
+---
+Baz
+.
+<hr />
+<h2>Foo</h2>
+<h2>Bar</h2>
+<p>Baz</p>
+````````````````````````````````
+
+
+Setext headings cannot be empty:
+
+```````````````````````````````` example
+
+====
+.
+<p>====</p>
+````````````````````````````````
+
+
+Setext heading text lines must not be interpretable as block
+constructs other than paragraphs. So, the line of dashes
+in these examples gets interpreted as a thematic break:
+
+```````````````````````````````` example
+---
+---
+.
+<hr />
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+-----
+.
+<ul>
+<li>foo</li>
+</ul>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+ foo
+---
+.
+<pre><code>foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+```````````````````````````````` example
+> foo
+-----
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+If you want a heading with `> foo` as its literal text, you can
+use backslash escapes:
+
+```````````````````````````````` example
+\> foo
+------
+.
+<h2>&gt; foo</h2>
+````````````````````````````````
+
+
+**Compatibility note:** Most existing Markdown implementations
+do not allow the text of setext headings to span multiple lines.
+But there is no consensus about how to interpret
+
+``` markdown
+Foo
+bar
+---
+baz
+```
+
+One can find four different interpretations:
+
+1. paragraph "Foo", heading "bar", paragraph "baz"
+2. paragraph "Foo bar", thematic break, paragraph "baz"
+3. paragraph "Foo bar --- baz"
+4. heading "Foo bar", paragraph "baz"
+
+We find interpretation 4 most natural, and interpretation 4
+increases the expressive power of CommonMark, by allowing
+multiline headings. Authors who want interpretation 1 can
+put a blank line after the first paragraph:
+
+```````````````````````````````` example
+Foo
+
+bar
+---
+baz
+.
+<p>Foo</p>
+<h2>bar</h2>
+<p>baz</p>
+````````````````````````````````
+
+
+Authors who want interpretation 2 can put blank lines around
+the thematic break,
+
+```````````````````````````````` example
+Foo
+bar
+
+---
+
+baz
+.
+<p>Foo
+bar</p>
+<hr />
+<p>baz</p>
+````````````````````````````````
+
+
+or use a thematic break that cannot count as a [setext heading
+underline], such as
+
+```````````````````````````````` example
+Foo
+bar
+* * *
+baz
+.
+<p>Foo
+bar</p>
+<hr />
+<p>baz</p>
+````````````````````````````````
+
+
+Authors who want interpretation 3 can use backslash escapes:
+
+```````````````````````````````` example
+Foo
+bar
+\---
+baz
+.
+<p>Foo
+bar
+---
+baz</p>
+````````````````````````````````
+
+
+## Indented code blocks
+
+An [indented code block](@) is composed of one or more
+[indented chunks] separated by blank lines.
+An [indented chunk](@) is a sequence of non-blank lines,
+each indented four or more spaces. The contents of the code block are
+the literal contents of the lines, including trailing
+[line endings], minus four spaces of indentation.
+An indented code block has no [info string].
+
+An indented code block cannot interrupt a paragraph, so there must be
+a blank line between a paragraph and a following indented code block.
+(A blank line is not needed, however, between a code block and a following
+paragraph.)
+
+```````````````````````````````` example
+ a simple
+ indented code block
+.
+<pre><code>a simple
+ indented code block
+</code></pre>
+````````````````````````````````
+
+
+If there is any ambiguity between an interpretation of indentation
+as a code block and as indicating that material belongs to a [list
+item][list items], the list item interpretation takes precedence:
+
+```````````````````````````````` example
+ - foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. foo
+
+ - bar
+.
+<ol>
+<li>
+<p>foo</p>
+<ul>
+<li>bar</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+
+The contents of a code block are literal text, and do not get parsed
+as Markdown:
+
+```````````````````````````````` example
+ <a/>
+ *hi*
+
+ - one
+.
+<pre><code>&lt;a/&gt;
+*hi*
+
+- one
+</code></pre>
+````````````````````````````````
+
+
+Here we have three chunks separated by blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+
+
+
+ chunk3
+.
+<pre><code>chunk1
+
+chunk2
+
+
+
+chunk3
+</code></pre>
+````````````````````````````````
+
+
+Any initial spaces beyond four will be included in the content, even
+in interior blank lines:
+
+```````````````````````````````` example
+ chunk1
+
+ chunk2
+.
+<pre><code>chunk1
+
+ chunk2
+</code></pre>
+````````````````````````````````
+
+
+An indented code block cannot interrupt a paragraph. (This
+allows hanging indents and the like.)
+
+```````````````````````````````` example
+Foo
+ bar
+
+.
+<p>Foo
+bar</p>
+````````````````````````````````
+
+
+However, any non-blank line with fewer than four leading spaces ends
+the code block immediately. So a paragraph may occur immediately
+after indented code:
+
+```````````````````````````````` example
+ foo
+bar
+.
+<pre><code>foo
+</code></pre>
+<p>bar</p>
+````````````````````````````````
+
+
+And indented code can occur immediately before and after other kinds of
+blocks:
+
+```````````````````````````````` example
+# Heading
+ foo
+Heading
+------
+ foo
+----
+.
+<h1>Heading</h1>
+<pre><code>foo
+</code></pre>
+<h2>Heading</h2>
+<pre><code>foo
+</code></pre>
+<hr />
+````````````````````````````````
+
+
+The first line can be indented more than four spaces:
+
+```````````````````````````````` example
+ foo
+ bar
+.
+<pre><code> foo
+bar
+</code></pre>
+````````````````````````````````
+
+
+Blank lines preceding or following an indented code block
+are not included in it:
+
+```````````````````````````````` example
+
+
+ foo
+
+
+.
+<pre><code>foo
+</code></pre>
+````````````````````````````````
+
+
+Trailing spaces are included in the code block's content:
+
+```````````````````````````````` example
+ foo
+.
+<pre><code>foo
+</code></pre>
+````````````````````````````````
+
+
+
+## Fenced code blocks
+
+A [code fence](@) is a sequence
+of at least three consecutive backtick characters (`` ` ``) or
+tildes (`~`). (Tildes and backticks cannot be mixed.)
+A [fenced code block](@)
+begins with a code fence, indented no more than three spaces.
+
+The line with the opening code fence may optionally contain some text
+following the code fence; this is trimmed of leading and trailing
+whitespace and called the [info string](@). If the [info string] comes
+after a backtick fence, it may not contain any backtick
+characters. (The reason for this restriction is that otherwise
+some inline code would be incorrectly interpreted as the
+beginning of a fenced code block.)
+
+The content of the code block consists of all subsequent lines, until
+a closing [code fence] of the same type as the code block
+began with (backticks or tildes), and with at least as many backticks
+or tildes as the opening code fence. If the leading code fence is
+indented N spaces, then up to N spaces of indentation are removed from
+each line of the content (if present). (If a content line is not
+indented, it is preserved unchanged. If it is indented less than N
+spaces, all of the indentation is removed.)
+
+The closing code fence may be indented up to three spaces, and may be
+followed only by spaces, which are ignored. If the end of the
+containing block (or document) is reached and no closing code fence
+has been found, the code block contains all of the lines after the
+opening code fence until the end of the containing block (or
+document). (An alternative spec would require backtracking in the
+event that a closing code fence is not found. But this makes parsing
+much less efficient, and there seems to be no real down side to the
+behavior described here.)
+
+A fenced code block may interrupt a paragraph, and does not require
+a blank line either before or after.
+
+The content of a code fence is treated as literal text, not parsed
+as inlines. The first word of the [info string] is typically used to
+specify the language of the code sample, and rendered in the `class`
+attribute of the `code` tag. However, this spec does not mandate any
+particular treatment of the [info string].
+
+Here is a simple example with backticks:
+
+```````````````````````````````` example
+```
+<
+ >
+```
+.
+<pre><code>&lt;
+ &gt;
+</code></pre>
+````````````````````````````````
+
+
+With tildes:
+
+```````````````````````````````` example
+~~~
+<
+ >
+~~~
+.
+<pre><code>&lt;
+ &gt;
+</code></pre>
+````````````````````````````````
+
+Fewer than three backticks is not enough:
+
+```````````````````````````````` example
+``
+foo
+``
+.
+<p><code>foo</code></p>
+````````````````````````````````
+
+The closing code fence must use the same character as the opening
+fence:
+
+```````````````````````````````` example
+```
+aaa
+~~~
+```
+.
+<pre><code>aaa
+~~~
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+aaa
+```
+~~~
+.
+<pre><code>aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+The closing code fence must be at least as long as the opening fence:
+
+```````````````````````````````` example
+````
+aaa
+```
+``````
+.
+<pre><code>aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~
+aaa
+~~~
+~~~~
+.
+<pre><code>aaa
+~~~
+</code></pre>
+````````````````````````````````
+
+
+Unclosed code blocks are closed by the end of the document
+(or the enclosing [block quote][block quotes] or [list item][list items]):
+
+```````````````````````````````` example
+```
+.
+<pre><code></code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`````
+
+```
+aaa
+.
+<pre><code>
+```
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+> aaa
+
+bbb
+.
+<blockquote>
+<pre><code>aaa
+</code></pre>
+</blockquote>
+<p>bbb</p>
+````````````````````````````````
+
+
+A code block can have all empty lines as its content:
+
+```````````````````````````````` example
+```
+
+
+```
+.
+<pre><code>
+
+</code></pre>
+````````````````````````````````
+
+
+A code block can be empty:
+
+```````````````````````````````` example
+```
+```
+.
+<pre><code></code></pre>
+````````````````````````````````
+
+
+Fences can be indented. If the opening fence is indented,
+content lines will have equivalent opening indentation removed,
+if present:
+
+```````````````````````````````` example
+ ```
+ aaa
+aaa
+```
+.
+<pre><code>aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ aaa
+aaa
+ ```
+.
+<pre><code>aaa
+aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+.
+<pre><code>aaa
+ aaa
+aaa
+</code></pre>
+````````````````````````````````
+
+
+Four spaces indentation produces an indented code block:
+
+```````````````````````````````` example
+ ```
+ aaa
+ ```
+.
+<pre><code>```
+aaa
+```
+</code></pre>
+````````````````````````````````
+
+
+Closing fences may be indented by 0-3 spaces, and their indentation
+need not match that of the opening fence:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+<pre><code>aaa
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ ```
+aaa
+ ```
+.
+<pre><code>aaa
+</code></pre>
+````````````````````````````````
+
+
+This is not a closing fence, because it is indented 4 spaces:
+
+```````````````````````````````` example
+```
+aaa
+ ```
+.
+<pre><code>aaa
+ ```
+</code></pre>
+````````````````````````````````
+
+
+
+Code fences (opening and closing) cannot contain internal spaces:
+
+```````````````````````````````` example
+``` ```
+aaa
+.
+<p><code> </code>
+aaa</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~~~
+aaa
+~~~ ~~
+.
+<pre><code>aaa
+~~~ ~~
+</code></pre>
+````````````````````````````````
+
+
+Fenced code blocks can interrupt paragraphs, and can be followed
+directly by paragraphs, without a blank line between:
+
+```````````````````````````````` example
+foo
+```
+bar
+```
+baz
+.
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+<p>baz</p>
+````````````````````````````````
+
+
+Other blocks can also occur before and after fenced code blocks
+without an intervening blank line:
+
+```````````````````````````````` example
+foo
+---
+~~~
+bar
+~~~
+# baz
+.
+<h2>foo</h2>
+<pre><code>bar
+</code></pre>
+<h1>baz</h1>
+````````````````````````````````
+
+
+An [info string] can be provided after the opening code fence.
+Although this spec doesn't mandate any particular treatment of
+the info string, the first word is typically used to specify
+the language of the code block. In HTML output, the language is
+normally indicated by adding a class to the `code` element consisting
+of `language-` followed by the language name.
+
+```````````````````````````````` example
+```ruby
+def foo(x)
+ return 3
+end
+```
+.
+<pre><code class="language-ruby">def foo(x)
+ return 3
+end
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~~ ruby startline=3 $%@#$
+def foo(x)
+ return 3
+end
+~~~~~~~
+.
+<pre><code class="language-ruby">def foo(x)
+ return 3
+end
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+````;
+````
+.
+<pre><code class="language-;"></code></pre>
+````````````````````````````````
+
+
+[Info strings] for backtick code blocks cannot contain backticks:
+
+```````````````````````````````` example
+``` aa ```
+foo
+.
+<p><code>aa</code>
+foo</p>
+````````````````````````````````
+
+
+[Info strings] for tilde code blocks can contain backticks and tildes:
+
+```````````````````````````````` example
+~~~ aa ``` ~~~
+foo
+~~~
+.
+<pre><code class="language-aa">foo
+</code></pre>
+````````````````````````````````
+
+
+Closing code fences cannot have [info strings]:
+
+```````````````````````````````` example
+```
+``` aaa
+```
+.
+<pre><code>``` aaa
+</code></pre>
+````````````````````````````````
+
+
+
+## HTML blocks
+
+An [HTML block](@) is a group of lines that is treated
+as raw HTML (and will not be escaped in HTML output).
+
+There are seven kinds of [HTML block], which can be defined by their
+start and end conditions. The block begins with a line that meets a
+[start condition](@) (after up to three spaces optional indentation).
+It ends with the first subsequent line that meets a matching [end
+condition](@), or the last line of the document, or the last line of
+the [container block](#container-blocks) containing the current HTML
+block, if no line is encountered that meets the [end condition]. If
+the first line meets both the [start condition] and the [end
+condition], the block will contain just that line.
+
+1. **Start condition:** line begins with the string `<script`,
+`<pre`, or `<style` (case-insensitive), followed by whitespace,
+the string `>`, or the end of the line.\
+**End condition:** line contains an end tag
+`</script>`, `</pre>`, or `</style>` (case-insensitive; it
+need not match the start tag).
+
+2. **Start condition:** line begins with the string `<!--`.\
+**End condition:** line contains the string `-->`.
+
+3. **Start condition:** line begins with the string `<?`.\
+**End condition:** line contains the string `?>`.
+
+4. **Start condition:** line begins with the string `<!`
+followed by an uppercase ASCII letter.\
+**End condition:** line contains the character `>`.
+
+5. **Start condition:** line begins with the string
+`<![CDATA[`.\
+**End condition:** line contains the string `]]>`.
+
+6. **Start condition:** line begins the string `<` or `</`
+followed by one of the strings (case-insensitive) `address`,
+`article`, `aside`, `base`, `basefont`, `blockquote`, `body`,
+`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`,
+`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`,
+`footer`, `form`, `frame`, `frameset`,
+`h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`,
+`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
+`nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`,
+`section`, `source`, `summary`, `table`, `tbody`, `td`,
+`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed
+by [whitespace], the end of the line, the string `>`, or
+the string `/>`.\
+**End condition:** line is followed by a [blank line].
+
+7. **Start condition:** line begins with a complete [open tag]
+(with any [tag name] other than `script`,
+`style`, or `pre`) or a complete [closing tag],
+followed only by [whitespace] or the end of the line.\
+**End condition:** line is followed by a [blank line].
+
+HTML blocks continue until they are closed by their appropriate
+[end condition], or the last line of the document or other [container
+block](#container-blocks). This means any HTML **within an HTML
+block** that might otherwise be recognised as a start condition will
+be ignored by the parser and passed through as-is, without changing
+the parser's state.
+
+For instance, `<pre>` within a HTML block started by `<table>` will not affect
+the parser state; as the HTML block was started in by start condition 6, it
+will end at any blank line. This can be surprising:
+
+```````````````````````````````` example
+<table><tr><td>
+<pre>
+**Hello**,
+
+_world_.
+</pre>
+</td></tr></table>
+.
+<table><tr><td>
+<pre>
+**Hello**,
+<p><em>world</em>.
+</pre></p>
+</td></tr></table>
+````````````````````````````````
+
+In this case, the HTML block is terminated by the newline — the `**Hello**`
+text remains verbatim — and regular parsing resumes, with a paragraph,
+emphasised `world` and inline and block HTML following.
+
+All types of [HTML blocks] except type 7 may interrupt
+a paragraph. Blocks of type 7 may not interrupt a paragraph.
+(This restriction is intended to prevent unwanted interpretation
+of long tags inside a wrapped paragraph as starting HTML blocks.)
+
+Some simple examples follow. Here are some basic HTML blocks
+of type 6:
+
+```````````````````````````````` example
+<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+
+okay.
+.
+<table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+</table>
+<p>okay.</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ <div>
+ *hello*
+ <foo><a>
+.
+ <div>
+ *hello*
+ <foo><a>
+````````````````````````````````
+
+
+A block can also start with a closing tag:
+
+```````````````````````````````` example
+</div>
+*foo*
+.
+</div>
+*foo*
+````````````````````````````````
+
+
+Here we have two HTML blocks with a Markdown paragraph between them:
+
+```````````````````````````````` example
+<DIV CLASS="foo">
+
+*Markdown*
+
+</DIV>
+.
+<DIV CLASS="foo">
+<p><em>Markdown</em></p>
+</DIV>
+````````````````````````````````
+
+
+The tag on the first line can be partial, as long
+as it is split where there would be whitespace:
+
+```````````````````````````````` example
+<div id="foo"
+ class="bar">
+</div>
+.
+<div id="foo"
+ class="bar">
+</div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div id="foo" class="bar
+ baz">
+</div>
+.
+<div id="foo" class="bar
+ baz">
+</div>
+````````````````````````````````
+
+
+An open tag need not be closed:
+```````````````````````````````` example
+<div>
+*foo*
+
+*bar*
+.
+<div>
+*foo*
+<p><em>bar</em></p>
+````````````````````````````````
+
+
+
+A partial tag need not even be completed (garbage
+in, garbage out):
+
+```````````````````````````````` example
+<div id="foo"
+*hi*
+.
+<div id="foo"
+*hi*
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div class
+foo
+.
+<div class
+foo
+````````````````````````````````
+
+
+The initial tag doesn't even need to be a valid
+tag, as long as it starts like one:
+
+```````````````````````````````` example
+<div *???-&&&-<---
+*foo*
+.
+<div *???-&&&-<---
+*foo*
+````````````````````````````````
+
+
+In type 6 blocks, the initial tag need not be on a line by
+itself:
+
+```````````````````````````````` example
+<div><a href="bar">*foo*</a></div>
+.
+<div><a href="bar">*foo*</a></div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<table><tr><td>
+foo
+</td></tr></table>
+.
+<table><tr><td>
+foo
+</td></tr></table>
+````````````````````````````````
+
+
+Everything until the next blank line or end of document
+gets included in the HTML block. So, in the following
+example, what looks like a Markdown code block
+is actually part of the HTML block, which continues until a blank
+line or the end of the document is reached:
+
+```````````````````````````````` example
+<div></div>
+``` c
+int x = 33;
+```
+.
+<div></div>
+``` c
+int x = 33;
+```
+````````````````````````````````
+
+
+To start an [HTML block] with a tag that is *not* in the
+list of block-level tags in (6), you must put the tag by
+itself on the first line (and it must be complete):
+
+```````````````````````````````` example
+<a href="foo">
+*bar*
+</a>
+.
+<a href="foo">
+*bar*
+</a>
+````````````````````````````````
+
+
+In type 7 blocks, the [tag name] can be anything:
+
+```````````````````````````````` example
+<Warning>
+*bar*
+</Warning>
+.
+<Warning>
+*bar*
+</Warning>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<i class="foo">
+*bar*
+</i>
+.
+<i class="foo">
+*bar*
+</i>
+````````````````````````````````
+
+
+```````````````````````````````` example
+</ins>
+*bar*
+.
+</ins>
+*bar*
+````````````````````````````````
+
+
+These rules are designed to allow us to work with tags that
+can function as either block-level or inline-level tags.
+The `<del>` tag is a nice example. We can surround content with
+`<del>` tags in three different ways. In this case, we get a raw
+HTML block, because the `<del>` tag is on a line by itself:
+
+```````````````````````````````` example
+<del>
+*foo*
+</del>
+.
+<del>
+*foo*
+</del>
+````````````````````````````````
+
+
+In this case, we get a raw HTML block that just includes
+the `<del>` tag (because it ends with the following blank
+line). So the contents get interpreted as CommonMark:
+
+```````````````````````````````` example
+<del>
+
+*foo*
+
+</del>
+.
+<del>
+<p><em>foo</em></p>
+</del>
+````````````````````````````````
+
+
+Finally, in this case, the `<del>` tags are interpreted
+as [raw HTML] *inside* the CommonMark paragraph. (Because
+the tag is not on a line by itself, we get inline HTML
+rather than an [HTML block].)
+
+```````````````````````````````` example
+<del>*foo*</del>
+.
+<p><del><em>foo</em></del></p>
+````````````````````````````````
+
+
+HTML tags designed to contain literal content
+(`script`, `style`, `pre`), comments, processing instructions,
+and declarations are treated somewhat differently.
+Instead of ending at the first blank line, these blocks
+end at the first line containing a corresponding end tag.
+As a result, these blocks can contain blank lines:
+
+A pre tag (type 1):
+
+```````````````````````````````` example
+<pre language="haskell"><code>
+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+</code></pre>
+okay
+.
+<pre language="haskell"><code>
+import Text.HTML.TagSoup
+
+main :: IO ()
+main = print $ parseTags tags
+</code></pre>
+<p>okay</p>
+````````````````````````````````
+
+
+A script tag (type 1):
+
+```````````````````````````````` example
+<script type="text/javascript">
+// JavaScript example
+
+document.getElementById("demo").innerHTML = "Hello JavaScript!";
+</script>
+okay
+.
+<script type="text/javascript">
+// JavaScript example
+
+document.getElementById("demo").innerHTML = "Hello JavaScript!";
+</script>
+<p>okay</p>
+````````````````````````````````
+
+
+A style tag (type 1):
+
+```````````````````````````````` example
+<style
+ type="text/css">
+h1 {color:red;}
+
+p {color:blue;}
+</style>
+okay
+.
+<style
+ type="text/css">
+h1 {color:red;}
+
+p {color:blue;}
+</style>
+<p>okay</p>
+````````````````````````````````
+
+
+If there is no matching end tag, the block will end at the
+end of the document (or the enclosing [block quote][block quotes]
+or [list item][list items]):
+
+```````````````````````````````` example
+<style
+ type="text/css">
+
+foo
+.
+<style
+ type="text/css">
+
+foo
+````````````````````````````````
+
+
+```````````````````````````````` example
+> <div>
+> foo
+
+bar
+.
+<blockquote>
+<div>
+foo
+</blockquote>
+<p>bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- <div>
+- foo
+.
+<ul>
+<li>
+<div>
+</li>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+
+The end tag can occur on the same line as the start tag:
+
+```````````````````````````````` example
+<style>p{color:red;}</style>
+*foo*
+.
+<style>p{color:red;}</style>
+<p><em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<!-- foo -->*bar*
+*baz*
+.
+<!-- foo -->*bar*
+<p><em>baz</em></p>
+````````````````````````````````
+
+
+Note that anything on the last line after the
+end tag will be included in the [HTML block]:
+
+```````````````````````````````` example
+<script>
+foo
+</script>1. *bar*
+.
+<script>
+foo
+</script>1. *bar*
+````````````````````````````````
+
+
+A comment (type 2):
+
+```````````````````````````````` example
+<!-- Foo
+
+bar
+ baz -->
+okay
+.
+<!-- Foo
+
+bar
+ baz -->
+<p>okay</p>
+````````````````````````````````
+
+
+
+A processing instruction (type 3):
+
+```````````````````````````````` example
+<?php
+
+ echo '>';
+
+?>
+okay
+.
+<?php
+
+ echo '>';
+
+?>
+<p>okay</p>
+````````````````````````````````
+
+
+A declaration (type 4):
+
+```````````````````````````````` example
+<!DOCTYPE html>
+.
+<!DOCTYPE html>
+````````````````````````````````
+
+
+CDATA (type 5):
+
+```````````````````````````````` example
+<![CDATA[
+function matchwo(a,b)
+{
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+}
+]]>
+okay
+.
+<![CDATA[
+function matchwo(a,b)
+{
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+}
+]]>
+<p>okay</p>
+````````````````````````````````
+
+
+The opening tag can be indented 1-3 spaces, but not 4:
+
+```````````````````````````````` example
+ <!-- foo -->
+
+ <!-- foo -->
+.
+ <!-- foo -->
+<pre><code>&lt;!-- foo --&gt;
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ <div>
+
+ <div>
+.
+ <div>
+<pre><code>&lt;div&gt;
+</code></pre>
+````````````````````````````````
+
+
+An HTML block of types 1--6 can interrupt a paragraph, and need not be
+preceded by a blank line.
+
+```````````````````````````````` example
+Foo
+<div>
+bar
+</div>
+.
+<p>Foo</p>
+<div>
+bar
+</div>
+````````````````````````````````
+
+
+However, a following blank line is needed, except at the end of
+a document, and except for blocks of types 1--5, [above][HTML
+block]:
+
+```````````````````````````````` example
+<div>
+bar
+</div>
+*foo*
+.
+<div>
+bar
+</div>
+*foo*
+````````````````````````````````
+
+
+HTML blocks of type 7 cannot interrupt a paragraph:
+
+```````````````````````````````` example
+Foo
+<a href="bar">
+baz
+.
+<p>Foo
+<a href="bar">
+baz</p>
+````````````````````````````````
+
+
+This rule differs from John Gruber's original Markdown syntax
+specification, which says:
+
+> The only restrictions are that block-level HTML elements —
+> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from
+> surrounding content by blank lines, and the start and end tags of the
+> block should not be indented with tabs or spaces.
+
+In some ways Gruber's rule is more restrictive than the one given
+here:
+
+- It requires that an HTML block be preceded by a blank line.
+- It does not allow the start tag to be indented.
+- It requires a matching end tag, which it also does not allow to
+ be indented.
+
+Most Markdown implementations (including some of Gruber's own) do not
+respect all of these restrictions.
+
+There is one respect, however, in which Gruber's rule is more liberal
+than the one given here, since it allows blank lines to occur inside
+an HTML block. There are two reasons for disallowing them here.
+First, it removes the need to parse balanced tags, which is
+expensive and can require backtracking from the end of the document
+if no matching end tag is found. Second, it provides a very simple
+and flexible way of including Markdown content inside HTML tags:
+simply separate the Markdown from the HTML using blank lines:
+
+Compare:
+
+```````````````````````````````` example
+<div>
+
+*Emphasized* text.
+
+</div>
+.
+<div>
+<p><em>Emphasized</em> text.</p>
+</div>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<div>
+*Emphasized* text.
+</div>
+.
+<div>
+*Emphasized* text.
+</div>
+````````````````````````````````
+
+
+Some Markdown implementations have adopted a convention of
+interpreting content inside tags as text if the open tag has
+the attribute `markdown=1`. The rule given above seems a simpler and
+more elegant way of achieving the same expressive power, which is also
+much simpler to parse.
+
+The main potential drawback is that one can no longer paste HTML
+blocks into Markdown documents with 100% reliability. However,
+*in most cases* this will work fine, because the blank lines in
+HTML are usually followed by HTML block tags. For example:
+
+```````````````````````````````` example
+<table>
+
+<tr>
+
+<td>
+Hi
+</td>
+
+</tr>
+
+</table>
+.
+<table>
+<tr>
+<td>
+Hi
+</td>
+</tr>
+</table>
+````````````````````````````````
+
+
+There are problems, however, if the inner tags are indented
+*and* separated by spaces, as then they will be interpreted as
+an indented code block:
+
+```````````````````````````````` example
+<table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+</table>
+.
+<table>
+ <tr>
+<pre><code>&lt;td&gt;
+ Hi
+&lt;/td&gt;
+</code></pre>
+ </tr>
+</table>
+````````````````````````````````
+
+
+Fortunately, blank lines are usually not necessary and can be
+deleted. The exception is inside `<pre>` tags, but as described
+[above][HTML blocks], raw HTML blocks starting with `<pre>`
+*can* contain blank lines.
+
+## Link reference definitions
+
+A [link reference definition](@)
+consists of a [link label], indented up to three spaces, followed
+by a colon (`:`), optional [whitespace] (including up to one
+[line ending]), a [link destination],
+optional [whitespace] (including up to one
+[line ending]), and an optional [link
+title], which if it is present must be separated
+from the [link destination] by [whitespace].
+No further [non-whitespace characters] may occur on the line.
+
+A [link reference definition]
+does not correspond to a structural element of a document. Instead, it
+defines a label which can be used in [reference links]
+and reference-style [images] elsewhere in the document. [Link
+reference definitions] can come either before or after the links that use
+them.
+
+```````````````````````````````` example
+[foo]: /url "title"
+
+[foo]
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ [foo]:
+ /url
+ 'the title'
+
+[foo]
+.
+<p><a href="/url" title="the title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[Foo*bar\]]:my_(url) 'title (with parens)'
+
+[Foo*bar\]]
+.
+<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[Foo bar]:
+<my url>
+'title'
+
+[Foo bar]
+.
+<p><a href="my%20url" title="title">Foo bar</a></p>
+````````````````````````````````
+
+
+The title may extend over multiple lines:
+
+```````````````````````````````` example
+[foo]: /url '
+title
+line1
+line2
+'
+
+[foo]
+.
+<p><a href="/url" title="
+title
+line1
+line2
+">foo</a></p>
+````````````````````````````````
+
+
+However, it may not contain a [blank line]:
+
+```````````````````````````````` example
+[foo]: /url 'title
+
+with blank line'
+
+[foo]
+.
+<p>[foo]: /url 'title</p>
+<p>with blank line'</p>
+<p>[foo]</p>
+````````````````````````````````
+
+
+The title may be omitted:
+
+```````````````````````````````` example
+[foo]:
+/url
+
+[foo]
+.
+<p><a href="/url">foo</a></p>
+````````````````````````````````
+
+
+The link destination may not be omitted:
+
+```````````````````````````````` example
+[foo]:
+
+[foo]
+.
+<p>[foo]:</p>
+<p>[foo]</p>
+````````````````````````````````
+
+ However, an empty link destination may be specified using
+ angle brackets:
+
+```````````````````````````````` example
+[foo]: <>
+
+[foo]
+.
+<p><a href="">foo</a></p>
+````````````````````````````````
+
+The title must be separated from the link destination by
+whitespace:
+
+```````````````````````````````` example
+[foo]: <bar>(baz)
+
+[foo]
+.
+<p>[foo]: <bar>(baz)</p>
+<p>[foo]</p>
+````````````````````````````````
+
+
+Both title and destination can contain backslash escapes
+and literal backslashes:
+
+```````````````````````````````` example
+[foo]: /url\bar\*baz "foo\"bar\baz"
+
+[foo]
+.
+<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
+````````````````````````````````
+
+
+A link can come before its corresponding definition:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: url
+.
+<p><a href="url">foo</a></p>
+````````````````````````````````
+
+
+If there are several matching definitions, the first one takes
+precedence:
+
+```````````````````````````````` example
+[foo]
+
+[foo]: first
+[foo]: second
+.
+<p><a href="first">foo</a></p>
+````````````````````````````````
+
+
+As noted in the section on [Links], matching of labels is
+case-insensitive (see [matches]).
+
+```````````````````````````````` example
+[FOO]: /url
+
+[Foo]
+.
+<p><a href="/url">Foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[ΑΓΩ]: /φου
+
+[αγω]
+.
+<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
+````````````````````````````````
+
+
+Here is a link reference definition with no corresponding link.
+It contributes nothing to the document.
+
+```````````````````````````````` example
+[foo]: /url
+.
+````````````````````````````````
+
+
+Here is another one:
+
+```````````````````````````````` example
+[
+foo
+]: /url
+bar
+.
+<p>bar</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because there are
+[non-whitespace characters] after the title:
+
+```````````````````````````````` example
+[foo]: /url "title" ok
+.
+<p>[foo]: /url &quot;title&quot; ok</p>
+````````````````````````````````
+
+
+This is a link reference definition, but it has no title:
+
+```````````````````````````````` example
+[foo]: /url
+"title" ok
+.
+<p>&quot;title&quot; ok</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because it is indented
+four spaces:
+
+```````````````````````````````` example
+ [foo]: /url "title"
+
+[foo]
+.
+<pre><code>[foo]: /url &quot;title&quot;
+</code></pre>
+<p>[foo]</p>
+````````````````````````````````
+
+
+This is not a link reference definition, because it occurs inside
+a code block:
+
+```````````````````````````````` example
+```
+[foo]: /url
+```
+
+[foo]
+.
+<pre><code>[foo]: /url
+</code></pre>
+<p>[foo]</p>
+````````````````````````````````
+
+
+A [link reference definition] cannot interrupt a paragraph.
+
+```````````````````````````````` example
+Foo
+[bar]: /baz
+
+[bar]
+.
+<p>Foo
+[bar]: /baz</p>
+<p>[bar]</p>
+````````````````````````````````
+
+
+However, it can directly follow other block elements, such as headings
+and thematic breaks, and it need not be followed by a blank line.
+
+```````````````````````````````` example
+# [Foo]
+[foo]: /url
+> bar
+.
+<h1><a href="/url">Foo</a></h1>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo]: /url
+bar
+===
+[foo]
+.
+<h1>bar</h1>
+<p><a href="/url">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo]: /url
+===
+[foo]
+.
+<p>===
+<a href="/url">foo</a></p>
+````````````````````````````````
+
+
+Several [link reference definitions]
+can occur one after another, without intervening blank lines.
+
+```````````````````````````````` example
+[foo]: /foo-url "foo"
+[bar]: /bar-url
+ "bar"
+[baz]: /baz-url
+
+[foo],
+[bar],
+[baz]
+.
+<p><a href="/foo-url" title="foo">foo</a>,
+<a href="/bar-url" title="bar">bar</a>,
+<a href="/baz-url">baz</a></p>
+````````````````````````````````
+
+
+[Link reference definitions] can occur
+inside block containers, like lists and block quotations. They
+affect the entire document, not just the container in which they
+are defined:
+
+```````````````````````````````` example
+[foo]
+
+> [foo]: /url
+.
+<p><a href="/url">foo</a></p>
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Whether something is a [link reference definition] is
+independent of whether the link reference it defines is
+used in the document. Thus, for example, the following
+document contains just a link reference definition, and
+no visible content:
+
+```````````````````````````````` example
+[foo]: /url
+.
+````````````````````````````````
+
+
+## Paragraphs
+
+A sequence of non-blank lines that cannot be interpreted as other
+kinds of blocks forms a [paragraph](@).
+The contents of the paragraph are the result of parsing the
+paragraph's raw content as inlines. The paragraph's raw content
+is formed by concatenating the lines and removing initial and final
+[whitespace].
+
+A simple example with two paragraphs:
+
+```````````````````````````````` example
+aaa
+
+bbb
+.
+<p>aaa</p>
+<p>bbb</p>
+````````````````````````````````
+
+
+Paragraphs can contain multiple lines, but no blank lines:
+
+```````````````````````````````` example
+aaa
+bbb
+
+ccc
+ddd
+.
+<p>aaa
+bbb</p>
+<p>ccc
+ddd</p>
+````````````````````````````````
+
+
+Multiple blank lines between paragraph have no effect:
+
+```````````````````````````````` example
+aaa
+
+
+bbb
+.
+<p>aaa</p>
+<p>bbb</p>
+````````````````````````````````
+
+
+Leading spaces are skipped:
+
+```````````````````````````````` example
+ aaa
+ bbb
+.
+<p>aaa
+bbb</p>
+````````````````````````````````
+
+
+Lines after the first may be indented any amount, since indented
+code blocks cannot interrupt paragraphs.
+
+```````````````````````````````` example
+aaa
+ bbb
+ ccc
+.
+<p>aaa
+bbb
+ccc</p>
+````````````````````````````````
+
+
+However, the first line may be indented at most three spaces,
+or an indented code block will be triggered:
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+<p>aaa
+bbb</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ aaa
+bbb
+.
+<pre><code>aaa
+</code></pre>
+<p>bbb</p>
+````````````````````````````````
+
+
+Final spaces are stripped before inline parsing, so a paragraph
+that ends with two or more spaces will not end with a [hard line
+break]:
+
+```````````````````````````````` example
+aaa
+bbb
+.
+<p>aaa<br />
+bbb</p>
+````````````````````````````````
+
+
+## Blank lines
+
+[Blank lines] between block-level elements are ignored,
+except for the role they play in determining whether a [list]
+is [tight] or [loose].
+
+Blank lines at the beginning and end of the document are also ignored.
+
+```````````````````````````````` example
+
+
+aaa
+
+
+# aaa
+
+
+.
+<p>aaa</p>
+<h1>aaa</h1>
+````````````````````````````````
+
+<div class="extension">
+
+## Tables (extension)
+
+GFM enables the `table` extension, where an additional leaf block type is
+available.
+
+A [table](@) is an arrangement of data with rows and columns, consisting of a
+single header row, a [delimiter row] separating the header from the data, and
+zero or more data rows.
+
+Each row consists of cells containing arbitrary text, in which [inlines] are
+parsed, separated by pipes (`|`). A leading and trailing pipe is also
+recommended for clarity of reading, and if there's otherwise parsing ambiguity.
+Spaces between pipes and cell content are trimmed. Block-level elements cannot
+be inserted in a table.
+
+The [delimiter row](@) consists of cells whose only content are hyphens (`-`),
+and optionally, a leading or trailing colon (`:`), or both, to indicate left,
+right, or center alignment respectively.
+
+```````````````````````````````` example table
+| foo | bar |
+| --- | --- |
+| baz | bim |
+.
+<table>
+<thead>
+<tr>
+<th>foo</th>
+<th>bar</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>baz</td>
+<td>bim</td>
+</tr>
+</tbody>
+</table>
+````````````````````````````````
+
+Cells in one column don't need to match length, though it's easier to read if
+they are. Likewise, use of leading and trailing pipes may be inconsistent:
+
+```````````````````````````````` example table
+| abc | defghi |
+:-: | -----------:
+bar | baz
+.
+<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>
+````````````````````````````````
+
+Include a pipe in a cell's content by escaping it, including inside other
+inline spans:
+
+```````````````````````````````` example table
+| f\|oo |
+| ------ |
+| b `\|` az |
+| b **\|** im |
+.
+<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>
+````````````````````````````````
+
+The table is broken at the first empty line, or beginning of another
+block-level structure:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar | baz |
+> bar
+.
+<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>
+````````````````````````````````
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar | baz |
+bar
+
+bar
+.
+<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>
+````````````````````````````````
+
+The header row must match the [delimiter row] in the number of cells. If not,
+a table will not be recognized:
+
+```````````````````````````````` example table
+| abc | def |
+| --- |
+| bar |
+.
+<p>| abc | def |
+| --- |
+| bar |</p>
+````````````````````````````````
+
+The remainder of the table's rows may vary in the number of cells. If there
+are a number of cells fewer than the number of cells in the header row, empty
+cells are inserted. If there are greater, the excess is ignored:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+| bar |
+| bar | baz | boo |
+.
+<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>
+````````````````````````````````
+
+If there are no rows in the body, no `<tbody>` is generated in HTML output:
+
+```````````````````````````````` example table
+| abc | def |
+| --- | --- |
+.
+<table>
+<thead>
+<tr>
+<th>abc</th>
+<th>def</th>
+</tr>
+</thead>
+</table>
+````````````````````````````````
+
+</div>
+
+# Container blocks
+
+A [container block](#container-blocks) is a block that has other
+blocks as its contents. There are two basic kinds of container blocks:
+[block quotes] and [list items].
+[Lists] are meta-containers for [list items].
+
+We define the syntax for container blocks recursively. The general
+form of the definition is:
+
+> If X is a sequence of blocks, then the result of
+> transforming X in such-and-such a way is a container of type Y
+> with these blocks as its content.
+
+So, we explain what counts as a block quote or list item by explaining
+how these can be *generated* from their contents. This should suffice
+to define the syntax, although it does not give a recipe for *parsing*
+these constructions. (A recipe is provided below in the section entitled
+[A parsing strategy](#appendix-a-parsing-strategy).)
+
+## Block quotes
+
+A [block quote marker](@)
+consists of 0-3 spaces of initial indent, plus (a) the character `>` together
+with a following space, or (b) a single character `>` not followed by a space.
+
+The following rules define [block quotes]:
+
+1. **Basic case.** If a string of lines *Ls* constitute a sequence
+ of blocks *Bs*, then the result of prepending a [block quote
+ marker] to the beginning of each line in *Ls*
+ is a [block quote](#block-quotes) containing *Bs*.
+
+2. **Laziness.** If a string of lines *Ls* constitute a [block
+ quote](#block-quotes) with contents *Bs*, then the result of deleting
+ the initial [block quote marker] from one or
+ more lines in which the next [non-whitespace character] after the [block
+ quote marker] is [paragraph continuation
+ text] is a block quote with *Bs* as its content.
+ [Paragraph continuation text](@) is text
+ that will be parsed as part of the content of a paragraph, but does
+ not occur at the beginning of the paragraph.
+
+3. **Consecutiveness.** A document cannot contain two [block
+ quotes] in a row unless there is a [blank line] between them.
+
+Nothing else counts as a [block quote](#block-quotes).
+
+Here is a simple example:
+
+```````````````````````````````` example
+> # Foo
+> bar
+> baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+The spaces after the `>` characters can be omitted:
+
+```````````````````````````````` example
+># Foo
+>bar
+> baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+The `>` characters can be indented 1-3 spaces:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+Four spaces gives us a code block:
+
+```````````````````````````````` example
+ > # Foo
+ > bar
+ > baz
+.
+<pre><code>&gt; # Foo
+&gt; bar
+&gt; baz
+</code></pre>
+````````````````````````````````
+
+
+The Laziness clause allows us to omit the `>` before
+[paragraph continuation text]:
+
+```````````````````````````````` example
+> # Foo
+> bar
+baz
+.
+<blockquote>
+<h1>Foo</h1>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+A block quote can contain some lazy and some non-lazy
+continuation lines:
+
+```````````````````````````````` example
+> bar
+baz
+> foo
+.
+<blockquote>
+<p>bar
+baz
+foo</p>
+</blockquote>
+````````````````````````````````
+
+
+Laziness only applies to lines that would have been continuations of
+paragraphs had they been prepended with [block quote markers].
+For example, the `> ` cannot be omitted in the second line of
+
+``` markdown
+> foo
+> ---
+```
+
+without changing the meaning:
+
+```````````````````````````````` example
+> foo
+---
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<hr />
+````````````````````````````````
+
+
+Similarly, if we omit the `> ` in the second line of
+
+``` markdown
+> - foo
+> - bar
+```
+
+then the block quote ends after the first line:
+
+```````````````````````````````` example
+> - foo
+- bar
+.
+<blockquote>
+<ul>
+<li>foo</li>
+</ul>
+</blockquote>
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+For the same reason, we can't omit the `> ` in front of
+subsequent lines of an indented or fenced code block:
+
+```````````````````````````````` example
+> foo
+ bar
+.
+<blockquote>
+<pre><code>foo
+</code></pre>
+</blockquote>
+<pre><code>bar
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> ```
+foo
+```
+.
+<blockquote>
+<pre><code></code></pre>
+</blockquote>
+<p>foo</p>
+<pre><code></code></pre>
+````````````````````````````````
+
+
+Note that in the following case, we have a [lazy
+continuation line]:
+
+```````````````````````````````` example
+> foo
+ - bar
+.
+<blockquote>
+<p>foo
+- bar</p>
+</blockquote>
+````````````````````````````````
+
+
+To see why, note that in
+
+```markdown
+> foo
+> - bar
+```
+
+the `- bar` is indented too far to start a list, and can't
+be an indented code block because indented code blocks cannot
+interrupt paragraphs, so it is [paragraph continuation text].
+
+A block quote can be empty:
+
+```````````````````````````````` example
+>
+.
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+>
+>
+>
+.
+<blockquote>
+</blockquote>
+````````````````````````````````
+
+
+A block quote can have initial or final blank lines:
+
+```````````````````````````````` example
+>
+> foo
+>
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+````````````````````````````````
+
+
+A blank line always separates block quotes:
+
+```````````````````````````````` example
+> foo
+
+> bar
+.
+<blockquote>
+<p>foo</p>
+</blockquote>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+(Most current Markdown implementations, including John Gruber's
+original `Markdown.pl`, will parse this example as a single block quote
+with two paragraphs. But it seems better to allow the author to decide
+whether two block quotes or one are wanted.)
+
+Consecutiveness means that if we put these block quotes together,
+we get a single block quote:
+
+```````````````````````````````` example
+> foo
+> bar
+.
+<blockquote>
+<p>foo
+bar</p>
+</blockquote>
+````````````````````````````````
+
+
+To get a block quote with two paragraphs, use:
+
+```````````````````````````````` example
+> foo
+>
+> bar
+.
+<blockquote>
+<p>foo</p>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+Block quotes can interrupt paragraphs:
+
+```````````````````````````````` example
+foo
+> bar
+.
+<p>foo</p>
+<blockquote>
+<p>bar</p>
+</blockquote>
+````````````````````````````````
+
+
+In general, blank lines are not needed before or after block
+quotes:
+
+```````````````````````````````` example
+> aaa
+***
+> bbb
+.
+<blockquote>
+<p>aaa</p>
+</blockquote>
+<hr />
+<blockquote>
+<p>bbb</p>
+</blockquote>
+````````````````````````````````
+
+
+However, because of laziness, a blank line is needed between
+a block quote and a following paragraph:
+
+```````````````````````````````` example
+> bar
+baz
+.
+<blockquote>
+<p>bar
+baz</p>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+
+baz
+.
+<blockquote>
+<p>bar</p>
+</blockquote>
+<p>baz</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> bar
+>
+baz
+.
+<blockquote>
+<p>bar</p>
+</blockquote>
+<p>baz</p>
+````````````````````````````````
+
+
+It is a consequence of the Laziness rule that any number
+of initial `>`s may be omitted on a continuation line of a
+nested block quote:
+
+```````````````````````````````` example
+> > > foo
+bar
+.
+<blockquote>
+<blockquote>
+<blockquote>
+<p>foo
+bar</p>
+</blockquote>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+>>> foo
+> bar
+>>baz
+.
+<blockquote>
+<blockquote>
+<blockquote>
+<p>foo
+bar
+baz</p>
+</blockquote>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+When including an indented code block in a block quote,
+remember that the [block quote marker] includes
+both the `>` and a following space. So *five spaces* are needed after
+the `>`:
+
+```````````````````````````````` example
+> code
+
+> not code
+.
+<blockquote>
+<pre><code>code
+</code></pre>
+</blockquote>
+<blockquote>
+<p>not code</p>
+</blockquote>
+````````````````````````````````
+
+
+
+## List items
+
+A [list marker](@) is a
+[bullet list marker] or an [ordered list marker].
+
+A [bullet list marker](@)
+is a `-`, `+`, or `*` character.
+
+An [ordered list marker](@)
+is a sequence of 1--9 arabic digits (`0-9`), followed by either a
+`.` character or a `)` character. (The reason for the length
+limit is that with 10 digits we start seeing integer overflows
+in some browsers.)
+
+The following rules define [list items]:
+
+1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of
+ blocks *Bs* starting with a [non-whitespace character], and *M* is a
+ list marker of width *W* followed by 1 ≤ *N* ≤ 4 spaces, then the result
+ of prepending *M* and the following spaces to the first line of
+ *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a
+ list item with *Bs* as its contents. The type of the list item
+ (bullet or ordered) is determined by the type of its list marker.
+ If the list item is ordered, then it is also assigned a start
+ number, based on the ordered list marker.
+
+ Exceptions:
+
+ 1. When the first list item in a [list] interrupts
+ a paragraph---that is, when it starts on a line that would
+ otherwise count as [paragraph continuation text]---then (a)
+ the lines *Ls* must not begin with a blank line, and (b) if
+ the list item is ordered, the start number must be 1.
+ 2. If any line is a [thematic break][thematic breaks] then
+ that line is not a list item.
+
+For example, let *Ls* be the lines
+
+```````````````````````````````` example
+A paragraph
+with two lines.
+
+ indented code
+
+> A block quote.
+.
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+````````````````````````````````
+
+
+And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says
+that the following is an ordered list item with start number 1,
+and the same contents as *Ls*:
+
+```````````````````````````````` example
+1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+The most important thing to notice is that the position of
+the text after the list marker determines how much indentation
+is needed in subsequent blocks in the list item. If the list
+marker takes up two spaces, and there are three spaces between
+the list marker and the next [non-whitespace character], then blocks
+must be indented five spaces in order to fall under the list
+item.
+
+Here are some examples showing how far content must be indented to be
+put under the list item:
+
+```````````````````````````````` example
+- one
+
+ two
+.
+<ul>
+<li>one</li>
+</ul>
+<p>two</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- one
+
+ two
+.
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+<ul>
+<li>one</li>
+</ul>
+<pre><code> two
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ - one
+
+ two
+.
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+It is tempting to think of this in terms of columns: the continuation
+blocks must be indented at least to the column of the first
+[non-whitespace character] after the list marker. However, that is not quite right.
+The spaces after the list marker determine how much relative indentation
+is needed. Which column this indentation reaches will depend on
+how the list item is embedded in other constructions, as shown by
+this example:
+
+```````````````````````````````` example
+ > > 1. one
+>>
+>> two
+.
+<blockquote>
+<blockquote>
+<ol>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ol>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Here `two` occurs in the same column as the list marker `1.`,
+but is actually contained in the list item, because there is
+sufficient indentation after the last containing blockquote marker.
+
+The converse is also possible. In the following example, the word `two`
+occurs far to the right of the initial text of the list item, `one`, but
+it is not considered part of the list item, because it is not indented
+far enough past the blockquote marker:
+
+```````````````````````````````` example
+>>- one
+>>
+ > > two
+.
+<blockquote>
+<blockquote>
+<ul>
+<li>one</li>
+</ul>
+<p>two</p>
+</blockquote>
+</blockquote>
+````````````````````````````````
+
+
+Note that at least one space is needed between the list marker and
+any following content, so these are not list items:
+
+```````````````````````````````` example
+-one
+
+2.two
+.
+<p>-one</p>
+<p>2.two</p>
+````````````````````````````````
+
+
+A list item may contain blocks that are separated by more than
+one blank line.
+
+```````````````````````````````` example
+- foo
+
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+A list item may contain any kind of block:
+
+```````````````````````````````` example
+1. foo
+
+ ```
+ bar
+ ```
+
+ baz
+
+ > bam
+.
+<ol>
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+<p>baz</p>
+<blockquote>
+<p>bam</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+A list item that contains an indented code block will preserve
+empty lines within the code block verbatim.
+
+```````````````````````````````` example
+- Foo
+
+ bar
+
+
+ baz
+.
+<ul>
+<li>
+<p>Foo</p>
+<pre><code>bar
+
+
+baz
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+Note that ordered list start numbers must be nine digits or less:
+
+```````````````````````````````` example
+123456789. ok
+.
+<ol start="123456789">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1234567890. not ok
+.
+<p>1234567890. not ok</p>
+````````````````````````````````
+
+
+A start number may begin with 0s:
+
+```````````````````````````````` example
+0. ok
+.
+<ol start="0">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+```````````````````````````````` example
+003. ok
+.
+<ol start="3">
+<li>ok</li>
+</ol>
+````````````````````````````````
+
+
+A start number may not be negative:
+
+```````````````````````````````` example
+-1. not ok
+.
+<p>-1. not ok</p>
+````````````````````````````````
+
+
+
+2. **Item starting with indented code.** If a sequence of lines *Ls*
+ constitute a sequence of blocks *Bs* starting with an indented code
+ block, and *M* is a list marker of width *W* followed by
+ one space, then the result of prepending *M* and the following
+ space to the first line of *Ls*, and indenting subsequent lines of
+ *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+An indented code block will have to be indented four spaces beyond
+the edge of the region where text will be included in the list item.
+In the following case that is 6 spaces:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+
+And in this case it is 11 spaces:
+
+```````````````````````````````` example
+ 10. foo
+
+ bar
+.
+<ol start="10">
+<li>
+<p>foo</p>
+<pre><code>bar
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+If the *first* block in the list item is an indented code block,
+then by rule #2, the contents must be indented *one* space after the
+list marker:
+
+```````````````````````````````` example
+ indented code
+
+paragraph
+
+ more code
+.
+<pre><code>indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+<ol>
+<li>
+<pre><code>indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+Note that an additional space indent is interpreted as space
+inside the code block:
+
+```````````````````````````````` example
+1. indented code
+
+ paragraph
+
+ more code
+.
+<ol>
+<li>
+<pre><code> indented code
+</code></pre>
+<p>paragraph</p>
+<pre><code>more code
+</code></pre>
+</li>
+</ol>
+````````````````````````````````
+
+
+Note that rules #1 and #2 only apply to two cases: (a) cases
+in which the lines to be included in a list item begin with a
+[non-whitespace character], and (b) cases in which
+they begin with an indented code
+block. In a case like the following, where the first block begins with
+a three-space indent, the rules do not allow us to form a list item by
+indenting the whole thing and prepending a list marker:
+
+```````````````````````````````` example
+ foo
+
+bar
+.
+<p>foo</p>
+<p>bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>foo</li>
+</ul>
+<p>bar</p>
+````````````````````````````````
+
+
+This is not a significant restriction, because when a block begins
+with 1-3 spaces indent, the indentation can always be removed without
+a change in interpretation, allowing rule #1 to be applied. So, in
+the above case:
+
+```````````````````````````````` example
+- foo
+
+ bar
+.
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+3. **Item starting with a blank line.** If a sequence of lines *Ls*
+ starting with a single [blank line] constitute a (possibly empty)
+ sequence of blocks *Bs*, not separated from each other by more than
+ one blank line, and *M* is a list marker of width *W*,
+ then the result of prepending *M* to the first line of *Ls*, and
+ indenting subsequent lines of *Ls* by *W + 1* spaces, is a list
+ item with *Bs* as its contents.
+ If a line is empty, then it need not be indented. The type of the
+ list item (bullet or ordered) is determined by the type of its list
+ marker. If the list item is ordered, then it is also assigned a
+ start number, based on the ordered list marker.
+
+Here are some list items that start with a blank line but are not empty:
+
+```````````````````````````````` example
+-
+ foo
+-
+ ```
+ bar
+ ```
+-
+ baz
+.
+<ul>
+<li>foo</li>
+<li>
+<pre><code>bar
+</code></pre>
+</li>
+<li>
+<pre><code>baz
+</code></pre>
+</li>
+</ul>
+````````````````````````````````
+
+When the list item starts with a blank line, the number of spaces
+following the list marker doesn't change the required indentation:
+
+```````````````````````````````` example
+-
+ foo
+.
+<ul>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+
+A list item can begin with at most one blank line.
+In the following example, `foo` is not part of the list
+item:
+
+```````````````````````````````` example
+-
+
+ foo
+.
+<ul>
+<li></li>
+</ul>
+<p>foo</p>
+````````````````````````````````
+
+
+Here is an empty bullet list item:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+<ul>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+It does not matter whether there are spaces following the [list marker]:
+
+```````````````````````````````` example
+- foo
+-
+- bar
+.
+<ul>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+Here is an empty ordered list item:
+
+```````````````````````````````` example
+1. foo
+2.
+3. bar
+.
+<ol>
+<li>foo</li>
+<li></li>
+<li>bar</li>
+</ol>
+````````````````````````````````
+
+
+A list may start or end with an empty list item:
+
+```````````````````````````````` example
+*
+.
+<ul>
+<li></li>
+</ul>
+````````````````````````````````
+
+However, an empty list item cannot interrupt a paragraph:
+
+```````````````````````````````` example
+foo
+*
+
+foo
+1.
+.
+<p>foo
+*</p>
+<p>foo
+1.</p>
+````````````````````````````````
+
+
+4. **Indentation.** If a sequence of lines *Ls* constitutes a list item
+ according to rule #1, #2, or #3, then the result of indenting each line
+ of *Ls* by 1-3 spaces (the same for each line) also constitutes a
+ list item with the same contents and attributes. If a line is
+ empty, then it need not be indented.
+
+Indented one space:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indented two spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indented three spaces:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Four spaces indent gives a code block:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<pre><code>1. A paragraph
+ with two lines.
+
+ indented code
+
+ &gt; A block quote.
+</code></pre>
+````````````````````````````````
+
+
+
+5. **Laziness.** If a string of lines *Ls* constitute a [list
+ item](#list-items) with contents *Bs*, then the result of deleting
+ some or all of the indentation from one or more lines in which the
+ next [non-whitespace character] after the indentation is
+ [paragraph continuation text] is a
+ list item with the same contents and attributes. The unindented
+ lines are called
+ [lazy continuation line](@)s.
+
+Here is an example with [lazy continuation lines]:
+
+```````````````````````````````` example
+ 1. A paragraph
+with two lines.
+
+ indented code
+
+ > A block quote.
+.
+<ol>
+<li>
+<p>A paragraph
+with two lines.</p>
+<pre><code>indented code
+</code></pre>
+<blockquote>
+<p>A block quote.</p>
+</blockquote>
+</li>
+</ol>
+````````````````````````````````
+
+
+Indentation can be partially deleted:
+
+```````````````````````````````` example
+ 1. A paragraph
+ with two lines.
+.
+<ol>
+<li>A paragraph
+with two lines.</li>
+</ol>
+````````````````````````````````
+
+
+These examples show how laziness can work in nested structures:
+
+```````````````````````````````` example
+> 1. > Blockquote
+continued here.
+.
+<blockquote>
+<ol>
+<li>
+<blockquote>
+<p>Blockquote
+continued here.</p>
+</blockquote>
+</li>
+</ol>
+</blockquote>
+````````````````````````````````
+
+
+```````````````````````````````` example
+> 1. > Blockquote
+> continued here.
+.
+<blockquote>
+<ol>
+<li>
+<blockquote>
+<p>Blockquote
+continued here.</p>
+</blockquote>
+</li>
+</ol>
+</blockquote>
+````````````````````````````````
+
+
+
+6. **That's all.** Nothing that is not counted as a list item by rules
+ #1--5 counts as a [list item](#list-items).
+
+The rules for sublists follow from the general rules
+[above][List items]. A sublist must be indented the same number
+of spaces a paragraph would need to be in order to be included
+in the list item.
+
+So, in this case we need two spaces indent:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>baz
+<ul>
+<li>boo</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+One is not enough:
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+ - boo
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+<li>baz</li>
+<li>boo</li>
+</ul>
+````````````````````````````````
+
+
+Here we need four, because the list marker is wider:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+<ol start="10">
+<li>foo
+<ul>
+<li>bar</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+Three is not enough:
+
+```````````````````````````````` example
+10) foo
+ - bar
+.
+<ol start="10">
+<li>foo</li>
+</ol>
+<ul>
+<li>bar</li>
+</ul>
+````````````````````````````````
+
+
+A list may be the first block in a list item:
+
+```````````````````````````````` example
+- - foo
+.
+<ul>
+<li>
+<ul>
+<li>foo</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. - 2. foo
+.
+<ol>
+<li>
+<ul>
+<li>
+<ol start="2">
+<li>foo</li>
+</ol>
+</li>
+</ul>
+</li>
+</ol>
+````````````````````````````````
+
+
+A list item can contain a heading:
+
+```````````````````````````````` example
+- # Foo
+- Bar
+ ---
+ baz
+.
+<ul>
+<li>
+<h1>Foo</h1>
+</li>
+<li>
+<h2>Bar</h2>
+baz</li>
+</ul>
+````````````````````````````````
+
+
+### Motivation
+
+John Gruber's Markdown spec says the following about list items:
+
+1. "List markers typically start at the left margin, but may be indented
+ by up to three spaces. List markers must be followed by one or more
+ spaces or a tab."
+
+2. "To make lists look nice, you can wrap items with hanging indents....
+ But if you don't want to, you don't have to."
+
+3. "List items may consist of multiple paragraphs. Each subsequent
+ paragraph in a list item must be indented by either 4 spaces or one
+ tab."
+
+4. "It looks nice if you indent every line of the subsequent paragraphs,
+ but here again, Markdown will allow you to be lazy."
+
+5. "To put a blockquote within a list item, the blockquote's `>`
+ delimiters need to be indented."
+
+6. "To put a code block within a list item, the code block needs to be
+ indented twice — 8 spaces or two tabs."
+
+These rules specify that a paragraph under a list item must be indented
+four spaces (presumably, from the left margin, rather than the start of
+the list marker, but this is not said), and that code under a list item
+must be indented eight spaces instead of the usual four. They also say
+that a block quote must be indented, but not by how much; however, the
+example given has four spaces indentation. Although nothing is said
+about other kinds of block-level content, it is certainly reasonable to
+infer that *all* block elements under a list item, including other
+lists, must be indented four spaces. This principle has been called the
+*four-space rule*.
+
+The four-space rule is clear and principled, and if the reference
+implementation `Markdown.pl` had followed it, it probably would have
+become the standard. However, `Markdown.pl` allowed paragraphs and
+sublists to start with only two spaces indentation, at least on the
+outer level. Worse, its behavior was inconsistent: a sublist of an
+outer-level list needed two spaces indentation, but a sublist of this
+sublist needed three spaces. It is not surprising, then, that different
+implementations of Markdown have developed very different rules for
+determining what comes under a list item. (Pandoc and python-Markdown,
+for example, stuck with Gruber's syntax description and the four-space
+rule, while discount, redcarpet, marked, PHP Markdown, and others
+followed `Markdown.pl`'s behavior more closely.)
+
+Unfortunately, given the divergences between implementations, there
+is no way to give a spec for list items that will be guaranteed not
+to break any existing documents. However, the spec given here should
+correctly handle lists formatted with either the four-space rule or
+the more forgiving `Markdown.pl` behavior, provided they are laid out
+in a way that is natural for a human to read.
+
+The strategy here is to let the width and indentation of the list marker
+determine the indentation necessary for blocks to fall under the list
+item, rather than having a fixed and arbitrary number. The writer can
+think of the body of the list item as a unit which gets indented to the
+right enough to fit the list marker (and any indentation on the list
+marker). (The laziness rule, #5, then allows continuation lines to be
+unindented if needed.)
+
+This rule is superior, we claim, to any rule requiring a fixed level of
+indentation from the margin. The four-space rule is clear but
+unnatural. It is quite unintuitive that
+
+``` markdown
+- foo
+
+ bar
+
+ - baz
+```
+
+should be parsed as two lists with an intervening paragraph,
+
+``` html
+<ul>
+<li>foo</li>
+</ul>
+<p>bar</p>
+<ul>
+<li>baz</li>
+</ul>
+```
+
+as the four-space rule demands, rather than a single list,
+
+``` html
+<ul>
+<li>
+<p>foo</p>
+<p>bar</p>
+<ul>
+<li>baz</li>
+</ul>
+</li>
+</ul>
+```
+
+The choice of four spaces is arbitrary. It can be learned, but it is
+not likely to be guessed, and it trips up beginners regularly.
+
+Would it help to adopt a two-space rule? The problem is that such
+a rule, together with the rule allowing 1--3 spaces indentation of the
+initial list marker, allows text that is indented *less than* the
+original list marker to be included in the list item. For example,
+`Markdown.pl` parses
+
+``` markdown
+ - one
+
+ two
+```
+
+as a single list item, with `two` a continuation paragraph:
+
+``` html
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+```
+
+and similarly
+
+``` markdown
+> - one
+>
+> two
+```
+
+as
+
+``` html
+<blockquote>
+<ul>
+<li>
+<p>one</p>
+<p>two</p>
+</li>
+</ul>
+</blockquote>
+```
+
+This is extremely unintuitive.
+
+Rather than requiring a fixed indent from the margin, we could require
+a fixed indent (say, two spaces, or even one space) from the list marker (which
+may itself be indented). This proposal would remove the last anomaly
+discussed. Unlike the spec presented above, it would count the following
+as a list item with a subparagraph, even though the paragraph `bar`
+is not indented as far as the first paragraph `foo`:
+
+``` markdown
+ 10. foo
+
+ bar
+```
+
+Arguably this text does read like a list item with `bar` as a subparagraph,
+which may count in favor of the proposal. However, on this proposal indented
+code would have to be indented six spaces after the list marker. And this
+would break a lot of existing Markdown, which has the pattern:
+
+``` markdown
+1. foo
+
+ indented code
+```
+
+where the code is indented eight spaces. The spec above, by contrast, will
+parse this text as expected, since the code block's indentation is measured
+from the beginning of `foo`.
+
+The one case that needs special treatment is a list item that *starts*
+with indented code. How much indentation is required in that case, since
+we don't have a "first paragraph" to measure from? Rule #2 simply stipulates
+that in such cases, we require one space indentation from the list marker
+(and then the normal four spaces for the indented code). This will match the
+four-space rule in cases where the list marker plus its initial indentation
+takes four spaces (a common case), but diverge in other cases.
+
+<div class="extension">
+
+## Task list items (extension)
+
+GFM enables the `tasklist` extension, where an additional processing step is
+performed on [list items].
+
+A [task list item](@) is a [list item][list items] where the first block in it
+is a paragraph which begins with a [task list item marker] and at least one
+whitespace character before any other content.
+
+A [task list item marker](@) consists of an optional number of spaces, a left
+bracket (`[`), either a whitespace character or the letter `x` in either
+lowercase or uppercase, and then a right bracket (`]`).
+
+When rendered, the [task list item marker] is replaced with a semantic checkbox element;
+in an HTML output, this would be an `<input type="checkbox">` element.
+
+If the character between the brackets is a whitespace character, the checkbox
+is unchecked. Otherwise, the checkbox is checked.
+
+This spec does not define how the checkbox elements are interacted with: in practice,
+implementors are free to render the checkboxes as disabled or inmutable elements,
+or they may dynamically handle dynamic interactions (i.e. checking, unchecking) in
+the final rendered document.
+
+```````````````````````````````` example disabled
+- [ ] foo
+- [x] bar
+.
+<ul>
+<li><input disabled="" type="checkbox"> foo</li>
+<li><input checked="" disabled="" type="checkbox"> bar</li>
+</ul>
+````````````````````````````````
+
+Task lists can be arbitrarily nested:
+
+```````````````````````````````` example disabled
+- [x] foo
+ - [ ] bar
+ - [x] baz
+- [ ] bim
+.
+<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>
+````````````````````````````````
+
+</div>
+
+## Lists
+
+A [list](@) is a sequence of one or more
+list items [of the same type]. The list items
+may be separated by any number of blank lines.
+
+Two list items are [of the same type](@)
+if they begin with a [list marker] of the same type.
+Two list markers are of the
+same type if (a) they are bullet list markers using the same character
+(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same
+delimiter (either `.` or `)`).
+
+A list is an [ordered list](@)
+if its constituent list items begin with
+[ordered list markers], and a
+[bullet list](@) if its constituent list
+items begin with [bullet list markers].
+
+The [start number](@)
+of an [ordered list] is determined by the list number of
+its initial list item. The numbers of subsequent list items are
+disregarded.
+
+A list is [loose](@) if any of its constituent
+list items are separated by blank lines, or if any of its constituent
+list items directly contain two block-level elements with a blank line
+between them. Otherwise a list is [tight](@).
+(The difference in HTML output is that paragraphs in a loose list are
+wrapped in `<p>` tags, while paragraphs in a tight list are not.)
+
+Changing the bullet or ordered list delimiter starts a new list:
+
+```````````````````````````````` example
+- foo
+- bar
++ baz
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+</ul>
+<ul>
+<li>baz</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. foo
+2. bar
+3) baz
+.
+<ol>
+<li>foo</li>
+<li>bar</li>
+</ol>
+<ol start="3">
+<li>baz</li>
+</ol>
+````````````````````````````````
+
+
+In CommonMark, a list can interrupt a paragraph. That is,
+no blank line is needed to separate a paragraph from a following
+list:
+
+```````````````````````````````` example
+Foo
+- bar
+- baz
+.
+<p>Foo</p>
+<ul>
+<li>bar</li>
+<li>baz</li>
+</ul>
+````````````````````````````````
+
+`Markdown.pl` does not allow this, through fear of triggering a list
+via a numeral in a hard-wrapped line:
+
+``` markdown
+The number of windows in my house is
+14. The number of doors is 6.
+```
+
+Oddly, though, `Markdown.pl` *does* allow a blockquote to
+interrupt a paragraph, even though the same considerations might
+apply.
+
+In CommonMark, we do allow lists to interrupt paragraphs, for
+two reasons. First, it is natural and not uncommon for people
+to start lists without blank lines:
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+Second, we are attracted to a
+
+> [principle of uniformity](@):
+> if a chunk of text has a certain
+> meaning, it will continue to have the same meaning when put into a
+> container block (such as a list item or blockquote).
+
+(Indeed, the spec for [list items] and [block quotes] presupposes
+this principle.) This principle implies that if
+
+``` markdown
+ * I need to buy
+ - new shoes
+ - a coat
+ - a plane ticket
+```
+
+is a list item containing a paragraph followed by a nested sublist,
+as all Markdown implementations agree it is (though the paragraph
+may be rendered without `<p>` tags, since the list is "tight"),
+then
+
+``` markdown
+I need to buy
+- new shoes
+- a coat
+- a plane ticket
+```
+
+by itself should be a paragraph followed by a nested sublist.
+
+Since it is well established Markdown practice to allow lists to
+interrupt paragraphs inside list items, the [principle of
+uniformity] requires us to allow this outside list items as
+well. ([reStructuredText](http://docutils.sourceforge.net/rst.html)
+takes a different approach, requiring blank lines before lists
+even inside other list items.)
+
+In order to solve of unwanted lists in paragraphs with
+hard-wrapped numerals, we allow only lists starting with `1` to
+interrupt paragraphs. Thus,
+
+```````````````````````````````` example
+The number of windows in my house is
+14. The number of doors is 6.
+.
+<p>The number of windows in my house is
+14. The number of doors is 6.</p>
+````````````````````````````````
+
+We may still get an unintended result in cases like
+
+```````````````````````````````` example
+The number of windows in my house is
+1. The number of doors is 6.
+.
+<p>The number of windows in my house is</p>
+<ol>
+<li>The number of doors is 6.</li>
+</ol>
+````````````````````````````````
+
+but this rule should prevent most spurious list captures.
+
+There can be any number of blank lines between items:
+
+```````````````````````````````` example
+- foo
+
+- bar
+
+
+- baz
+.
+<ul>
+<li>
+<p>foo</p>
+</li>
+<li>
+<p>bar</p>
+</li>
+<li>
+<p>baz</p>
+</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+- foo
+ - bar
+ - baz
+
+
+ bim
+.
+<ul>
+<li>foo
+<ul>
+<li>bar
+<ul>
+<li>
+<p>baz</p>
+<p>bim</p>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+To separate consecutive lists of the same type, or to separate a
+list from an indented code block that would otherwise be parsed
+as a subparagraph of the final list item, you can insert a blank HTML
+comment:
+
+```````````````````````````````` example
+- foo
+- bar
+
+<!-- -->
+
+- baz
+- bim
+.
+<ul>
+<li>foo</li>
+<li>bar</li>
+</ul>
+<!-- -->
+<ul>
+<li>baz</li>
+<li>bim</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- foo
+
+ notcode
+
+- foo
+
+<!-- -->
+
+ code
+.
+<ul>
+<li>
+<p>foo</p>
+<p>notcode</p>
+</li>
+<li>
+<p>foo</p>
+</li>
+</ul>
+<!-- -->
+<pre><code>code
+</code></pre>
+````````````````````````````````
+
+
+List items need not be indented to the same level. The following
+list items will be treated as items at the same list level,
+since none is indented enough to belong to the previous list
+item:
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+ - d
+ - e
+ - f
+- g
+.
+<ul>
+<li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d</li>
+<li>e</li>
+<li>f</li>
+<li>g</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+1. a
+
+ 2. b
+
+ 3. c
+.
+<ol>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>c</p>
+</li>
+</ol>
+````````````````````````````````
+
+Note, however, that list items may not be indented more than
+three spaces. Here `- e` is treated as a paragraph continuation
+line, because it is indented more than three spaces:
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+ - d
+ - e
+.
+<ul>
+<li>a</li>
+<li>b</li>
+<li>c</li>
+<li>d
+- e</li>
+</ul>
+````````````````````````````````
+
+And here, `3. c` is treated as in indented code block,
+because it is indented four spaces and preceded by a
+blank line.
+
+```````````````````````````````` example
+1. a
+
+ 2. b
+
+ 3. c
+.
+<ol>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+</ol>
+<pre><code>3. c
+</code></pre>
+````````````````````````````````
+
+
+This is a loose list, because there is a blank line between
+two of the list items:
+
+```````````````````````````````` example
+- a
+- b
+
+- c
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>c</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+So is this, with a empty second item:
+
+```````````````````````````````` example
+* a
+*
+
+* c
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li></li>
+<li>
+<p>c</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+These are loose lists, even though there is no space between the items,
+because one of the items directly contains two block-level elements
+with a blank line between them:
+
+```````````````````````````````` example
+- a
+- b
+
+ c
+- d
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+<p>c</p>
+</li>
+<li>
+<p>d</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+- b
+
+ [ref]: /url
+- d
+.
+<ul>
+<li>
+<p>a</p>
+</li>
+<li>
+<p>b</p>
+</li>
+<li>
+<p>d</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank lines are in a code block:
+
+```````````````````````````````` example
+- a
+- ```
+ b
+
+
+ ```
+- c
+.
+<ul>
+<li>a</li>
+<li>
+<pre><code>b
+
+
+</code></pre>
+</li>
+<li>c</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank line is between two
+paragraphs of a sublist. So the sublist is loose while
+the outer list is tight:
+
+```````````````````````````````` example
+- a
+ - b
+
+ c
+- d
+.
+<ul>
+<li>a
+<ul>
+<li>
+<p>b</p>
+<p>c</p>
+</li>
+</ul>
+</li>
+<li>d</li>
+</ul>
+````````````````````````````````
+
+
+This is a tight list, because the blank line is inside the
+block quote:
+
+```````````````````````````````` example
+* a
+ > b
+ >
+* c
+.
+<ul>
+<li>a
+<blockquote>
+<p>b</p>
+</blockquote>
+</li>
+<li>c</li>
+</ul>
+````````````````````````````````
+
+
+This list is tight, because the consecutive block elements
+are not separated by blank lines:
+
+```````````````````````````````` example
+- a
+ > b
+ ```
+ c
+ ```
+- d
+.
+<ul>
+<li>a
+<blockquote>
+<p>b</p>
+</blockquote>
+<pre><code>c
+</code></pre>
+</li>
+<li>d</li>
+</ul>
+````````````````````````````````
+
+
+A single-paragraph list is tight:
+
+```````````````````````````````` example
+- a
+.
+<ul>
+<li>a</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+.
+<ul>
+<li>a
+<ul>
+<li>b</li>
+</ul>
+</li>
+</ul>
+````````````````````````````````
+
+
+This list is loose, because of the blank line between the
+two block elements in the list item:
+
+```````````````````````````````` example
+1. ```
+ foo
+ ```
+
+ bar
+.
+<ol>
+<li>
+<pre><code>foo
+</code></pre>
+<p>bar</p>
+</li>
+</ol>
+````````````````````````````````
+
+
+Here the outer list is loose, the inner list tight:
+
+```````````````````````````````` example
+* foo
+ * bar
+
+ baz
+.
+<ul>
+<li>
+<p>foo</p>
+<ul>
+<li>bar</li>
+</ul>
+<p>baz</p>
+</li>
+</ul>
+````````````````````````````````
+
+
+```````````````````````````````` example
+- a
+ - b
+ - c
+
+- d
+ - e
+ - f
+.
+<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>
+````````````````````````````````
+
+
+# Inlines
+
+Inlines are parsed sequentially from the beginning of the character
+stream to the end (left to right, in left-to-right languages).
+Thus, for example, in
+
+```````````````````````````````` example
+`hi`lo`
+.
+<p><code>hi</code>lo`</p>
+````````````````````````````````
+
+`hi` is parsed as code, leaving the backtick at the end as a literal
+backtick.
+
+
+## Backslash escapes
+
+Any ASCII punctuation character may be backslash-escaped:
+
+```````````````````````````````` example
+\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
+.
+<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>
+````````````````````````````````
+
+
+Backslashes before other characters are treated as literal
+backslashes:
+
+```````````````````````````````` example
+\→\A\a\ \3\φ\«
+.
+<p>\→\A\a\ \3\φ\«</p>
+````````````````````````````````
+
+
+Escaped characters are treated as regular characters and do
+not have their usual Markdown meanings:
+
+```````````````````````````````` example
+\*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
+.
+<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>
+````````````````````````````````
+
+
+If a backslash is itself escaped, the following character is not:
+
+```````````````````````````````` example
+\\*emphasis*
+.
+<p>\<em>emphasis</em></p>
+````````````````````````````````
+
+
+A backslash at the end of the line is a [hard line break]:
+
+```````````````````````````````` example
+foo\
+bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+Backslash escapes do not work in code blocks, code spans, autolinks, or
+raw HTML:
+
+```````````````````````````````` example
+`` \[\` ``
+.
+<p><code>\[\`</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ \[\]
+.
+<pre><code>\[\]
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+~~~
+\[\]
+~~~
+.
+<pre><code>\[\]
+</code></pre>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://example.com?find=\*>
+.
+<p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="/bar\/)">
+.
+<a href="/bar\/)">
+````````````````````````````````
+
+
+But they work in all other contexts, including URLs and link titles,
+link references, and [info strings] in [fenced code blocks]:
+
+```````````````````````````````` example
+[foo](/bar\* "ti\*tle")
+.
+<p><a href="/bar*" title="ti*tle">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /bar\* "ti\*tle"
+.
+<p><a href="/bar*" title="ti*tle">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+``` foo\+bar
+foo
+```
+.
+<pre><code class="language-foo+bar">foo
+</code></pre>
+````````````````````````````````
+
+
+
+## Entity and numeric character references
+
+Valid HTML entity references and numeric character references
+can be used in place of the corresponding Unicode character,
+with the following exceptions:
+
+- Entity and character references are not recognized in code
+ blocks and code spans.
+
+- Entity and character references cannot stand in place of
+ special characters that define structural elements in
+ CommonMark. For example, although `&#42;` can be used
+ in place of a literal `*` character, `&#42;` cannot replace
+ `*` in emphasis delimiters, bullet list markers, or thematic
+ breaks.
+
+Conforming CommonMark parsers need not store information about
+whether a particular character was represented in the source
+using a Unicode character or an entity reference.
+
+[Entity references](@) consist of `&` + any of the valid
+HTML5 entity names + `;`. The
+document <https://html.spec.whatwg.org/multipage/entities.json>
+is used as an authoritative source for the valid entity
+references and their corresponding code points.
+
+```````````````````````````````` example
+&nbsp; &amp; &copy; &AElig; &Dcaron;
+&frac34; &HilbertSpace; &DifferentialD;
+&ClockwiseContourIntegral; &ngE;
+.
+<p>  &amp; © Æ Ď
+¾ ℋ ⅆ
+∲ ≧̸</p>
+````````````````````````````````
+
+
+[Decimal numeric character
+references](@)
+consist of `&#` + a string of 1--7 arabic digits + `;`. A
+numeric character reference is parsed as the corresponding
+Unicode character. Invalid Unicode code points will be replaced by
+the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons,
+the code point `U+0000` will also be replaced by `U+FFFD`.
+
+```````````````````````````````` example
+&#35; &#1234; &#992; &#0;
+.
+<p># Ӓ Ϡ �</p>
+````````````````````````````````
+
+
+[Hexadecimal numeric character
+references](@) consist of `&#` +
+either `X` or `x` + a string of 1-6 hexadecimal digits + `;`.
+They too are parsed as the corresponding Unicode character (this
+time specified with a hexadecimal numeral instead of decimal).
+
+```````````````````````````````` example
+&#X22; &#XD06; &#xcab;
+.
+<p>&quot; ആ ಫ</p>
+````````````````````````````````
+
+
+Here are some nonentities:
+
+```````````````````````````````` example
+&nbsp &x; &#; &#x;
+&#987654321;
+&#abcdef0;
+&ThisIsNotDefined; &hi?;
+.
+<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
+&amp;#987654321;
+&amp;#abcdef0;
+&amp;ThisIsNotDefined; &amp;hi?;</p>
+````````````````````````````````
+
+
+Although HTML5 does accept some entity references
+without a trailing semicolon (such as `&copy`), these are not
+recognized here, because it makes the grammar too ambiguous:
+
+```````````````````````````````` example
+&copy
+.
+<p>&amp;copy</p>
+````````````````````````````````
+
+
+Strings that are not on the list of HTML5 named entities are not
+recognized as entity references either:
+
+```````````````````````````````` example
+&MadeUpEntity;
+.
+<p>&amp;MadeUpEntity;</p>
+````````````````````````````````
+
+
+Entity and numeric character references are recognized in any
+context besides code spans or code blocks, including
+URLs, [link titles], and [fenced code block][] [info strings]:
+
+```````````````````````````````` example
+<a href="&ouml;&ouml;.html">
+.
+<a href="&ouml;&ouml;.html">
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo](/f&ouml;&ouml; "f&ouml;&ouml;")
+.
+<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
+.
+<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+``` f&ouml;&ouml;
+foo
+```
+.
+<pre><code class="language-föö">foo
+</code></pre>
+````````````````````````````````
+
+
+Entity and numeric character references are treated as literal
+text in code spans and code blocks:
+
+```````````````````````````````` example
+`f&ouml;&ouml;`
+.
+<p><code>f&amp;ouml;&amp;ouml;</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+ f&ouml;f&ouml;
+.
+<pre><code>f&amp;ouml;f&amp;ouml;
+</code></pre>
+````````````````````````````````
+
+
+Entity and numeric character references cannot be used
+in place of symbols indicating structure in CommonMark
+documents.
+
+```````````````````````````````` example
+&#42;foo&#42;
+*foo*
+.
+<p>*foo*
+<em>foo</em></p>
+````````````````````````````````
+
+```````````````````````````````` example
+&#42; foo
+
+* foo
+.
+<p>* foo</p>
+<ul>
+<li>foo</li>
+</ul>
+````````````````````````````````
+
+```````````````````````````````` example
+foo&#10;&#10;bar
+.
+<p>foo
+
+bar</p>
+````````````````````````````````
+
+```````````````````````````````` example
+&#9;foo
+.
+<p>→foo</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[a](url &quot;tit&quot;)
+.
+<p>[a](url &quot;tit&quot;)</p>
+````````````````````````````````
+
+
+## Code spans
+
+A [backtick string](@)
+is a string of one or more backtick characters (`` ` ``) that is neither
+preceded nor followed by a backtick.
+
+A [code span](@) begins with a backtick string and ends with
+a backtick string of equal length. The contents of the code span are
+the characters between the two backtick strings, normalized in the
+following ways:
+
+- First, [line endings] are converted to [spaces].
+- If the resulting string both begins *and* ends with a [space]
+ character, but does not consist entirely of [space]
+ characters, a single [space] character is removed from the
+ front and back. This allows you to include code that begins
+ or ends with backtick characters, which must be separated by
+ whitespace from the opening or closing backtick strings.
+
+This is a simple code span:
+
+```````````````````````````````` example
+`foo`
+.
+<p><code>foo</code></p>
+````````````````````````````````
+
+
+Here two backticks are used, because the code contains a backtick.
+This example also illustrates stripping of a single leading and
+trailing space:
+
+```````````````````````````````` example
+`` foo ` bar ``
+.
+<p><code>foo ` bar</code></p>
+````````````````````````````````
+
+
+This example shows the motivation for stripping leading and trailing
+spaces:
+
+```````````````````````````````` example
+` `` `
+.
+<p><code>``</code></p>
+````````````````````````````````
+
+Note that only *one* space is stripped:
+
+```````````````````````````````` example
+` `` `
+.
+<p><code> `` </code></p>
+````````````````````````````````
+
+The stripping only happens if the space is on both
+sides of the string:
+
+```````````````````````````````` example
+` a`
+.
+<p><code> a</code></p>
+````````````````````````````````
+
+Only [spaces], and not [unicode whitespace] in general, are
+stripped in this way:
+
+```````````````````````````````` example
+` b `
+.
+<p><code> b </code></p>
+````````````````````````````````
+
+No stripping occurs if the code span contains only spaces:
+
+```````````````````````````````` example
+` `
+` `
+.
+<p><code> </code>
+<code> </code></p>
+````````````````````````````````
+
+
+[Line endings] are treated like spaces:
+
+```````````````````````````````` example
+``
+foo
+bar
+baz
+``
+.
+<p><code>foo bar baz</code></p>
+````````````````````````````````
+
+```````````````````````````````` example
+``
+foo
+``
+.
+<p><code>foo </code></p>
+````````````````````````````````
+
+
+Interior spaces are not collapsed:
+
+```````````````````````````````` example
+`foo bar
+baz`
+.
+<p><code>foo bar baz</code></p>
+````````````````````````````````
+
+Note that browsers will typically collapse consecutive spaces
+when rendering `<code>` elements, so it is recommended that
+the following CSS be used:
+
+ code{white-space: pre-wrap;}
+
+
+Note that backslash escapes do not work in code spans. All backslashes
+are treated literally:
+
+```````````````````````````````` example
+`foo\`bar`
+.
+<p><code>foo\</code>bar`</p>
+````````````````````````````````
+
+
+Backslash escapes are never needed, because one can always choose a
+string of *n* backtick characters as delimiters, where the code does
+not contain any strings of exactly *n* backtick characters.
+
+```````````````````````````````` example
+``foo`bar``
+.
+<p><code>foo`bar</code></p>
+````````````````````````````````
+
+```````````````````````````````` example
+` foo `` bar `
+.
+<p><code>foo `` bar</code></p>
+````````````````````````````````
+
+
+Code span backticks have higher precedence than any other inline
+constructs except HTML tags and autolinks. Thus, for example, this is
+not parsed as emphasized text, since the second `*` is part of a code
+span:
+
+```````````````````````````````` example
+*foo`*`
+.
+<p>*foo<code>*</code></p>
+````````````````````````````````
+
+
+And this is not parsed as a link:
+
+```````````````````````````````` example
+[not a `link](/foo`)
+.
+<p>[not a <code>link](/foo</code>)</p>
+````````````````````````````````
+
+
+Code spans, HTML tags, and autolinks have the same precedence.
+Thus, this is code:
+
+```````````````````````````````` example
+`<a href="`">`
+.
+<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>
+````````````````````````````````
+
+
+But this is an HTML tag:
+
+```````````````````````````````` example
+<a href="`">`
+.
+<p><a href="`">`</p>
+````````````````````````````````
+
+
+And this is code:
+
+```````````````````````````````` example
+`<http://foo.bar.`baz>`
+.
+<p><code>&lt;http://foo.bar.</code>baz&gt;`</p>
+````````````````````````````````
+
+
+But this is an autolink:
+
+```````````````````````````````` example
+<http://foo.bar.`baz>`
+.
+<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p>
+````````````````````````````````
+
+
+When a backtick string is not closed by a matching backtick string,
+we just have literal backticks:
+
+```````````````````````````````` example
+```foo``
+.
+<p>```foo``</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`foo
+.
+<p>`foo</p>
+````````````````````````````````
+
+The following case also illustrates the need for opening and
+closing backtick strings to be equal in length:
+
+```````````````````````````````` example
+`foo``bar``
+.
+<p>`foo<code>bar</code></p>
+````````````````````````````````
+
+
+## Emphasis and strong emphasis
+
+John Gruber's original [Markdown syntax
+description](http://daringfireball.net/projects/markdown/syntax#em) says:
+
+> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
+> emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML
+> `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>`
+> tag.
+
+This is enough for most users, but these rules leave much undecided,
+especially when it comes to nested emphasis. The original
+`Markdown.pl` test suite makes it clear that triple `***` and
+`___` delimiters can be used for strong emphasis, and most
+implementations have also allowed the following patterns:
+
+``` markdown
+***strong emph***
+***strong** in emph*
+***emph* in strong**
+**in strong *emph***
+*in emph **strong***
+```
+
+The following patterns are less widely supported, but the intent
+is clear and they are useful (especially in contexts like bibliography
+entries):
+
+``` markdown
+*emph *with emph* in it*
+**strong **with strong** in it**
+```
+
+Many implementations have also restricted intraword emphasis to
+the `*` forms, to avoid unwanted emphasis in words containing
+internal underscores. (It is best practice to put these in code
+spans, but users often do not.)
+
+``` markdown
+internal emphasis: foo*bar*baz
+no emphasis: foo_bar_baz
+```
+
+The rules given below capture all of these patterns, while allowing
+for efficient parsing strategies that do not backtrack.
+
+First, some definitions. A [delimiter run](@) is either
+a sequence of one or more `*` characters that is not preceded or
+followed by a non-backslash-escaped `*` character, or a sequence
+of one or more `_` characters that is not preceded or followed by
+a non-backslash-escaped `_` character.
+
+A [left-flanking delimiter run](@) is
+a [delimiter run] that is (1) not followed by [Unicode whitespace],
+and either (2a) not followed by a [punctuation character], or
+(2b) followed by a [punctuation character] and
+preceded by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+A [right-flanking delimiter run](@) is
+a [delimiter run] that is (1) not preceded by [Unicode whitespace],
+and either (2a) not preceded by a [punctuation character], or
+(2b) preceded by a [punctuation character] and
+followed by [Unicode whitespace] or a [punctuation character].
+For purposes of this definition, the beginning and the end of
+the line count as Unicode whitespace.
+
+Here are some examples of delimiter runs.
+
+ - left-flanking but not right-flanking:
+
+ ```
+ ***abc
+ _abc
+ **"abc"
+ _"abc"
+ ```
+
+ - right-flanking but not left-flanking:
+
+ ```
+ abc***
+ abc_
+ "abc"**
+ "abc"_
+ ```
+
+ - Both left and right-flanking:
+
+ ```
+ abc***def
+ "abc"_"def"
+ ```
+
+ - Neither left nor right-flanking:
+
+ ```
+ abc *** def
+ a _ b
+ ```
+
+(The idea of distinguishing left-flanking and right-flanking
+delimiter runs based on the character before and the character
+after comes from Roopesh Chander's
+[vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags).
+vfmd uses the terminology "emphasis indicator string" instead of "delimiter
+run," and its rules for distinguishing left- and right-flanking runs
+are a bit more complex than the ones given here.)
+
+The following rules define emphasis and strong emphasis:
+
+1. A single `*` character [can open emphasis](@)
+ iff (if and only if) it is part of a [left-flanking delimiter run].
+
+2. A single `_` character [can open emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+3. A single `*` character [can close emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+4. A single `_` character [can close emphasis] iff
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+5. A double `**` [can open strong emphasis](@)
+ iff it is part of a [left-flanking delimiter run].
+
+6. A double `__` [can open strong emphasis] iff
+ it is part of a [left-flanking delimiter run]
+ and either (a) not part of a [right-flanking delimiter run]
+ or (b) part of a [right-flanking delimiter run]
+ preceded by punctuation.
+
+7. A double `**` [can close strong emphasis](@)
+ iff it is part of a [right-flanking delimiter run].
+
+8. A double `__` [can close strong emphasis] iff
+ it is part of a [right-flanking delimiter run]
+ and either (a) not part of a [left-flanking delimiter run]
+ or (b) part of a [left-flanking delimiter run]
+ followed by punctuation.
+
+9. Emphasis begins with a delimiter that [can open emphasis] and ends
+ with a delimiter that [can close emphasis], and that uses the same
+ character (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both
+ open and close emphasis, then the sum of the lengths of the
+ delimiter runs containing the opening and closing delimiters
+ must not be a multiple of 3 unless both lengths are
+ multiples of 3.
+
+10. Strong emphasis begins with a delimiter that
+ [can open strong emphasis] and ends with a delimiter that
+ [can close strong emphasis], and that uses the same character
+ (`_` or `*`) as the opening delimiter. The
+ opening and closing delimiters must belong to separate
+ [delimiter runs]. If one of the delimiters can both open
+ and close strong emphasis, then the sum of the lengths of
+ the delimiter runs containing the opening and closing
+ delimiters must not be a multiple of 3 unless both lengths
+ are multiples of 3.
+
+11. A literal `*` character cannot occur at the beginning or end of
+ `*`-delimited emphasis or `**`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+12. A literal `_` character cannot occur at the beginning or end of
+ `_`-delimited emphasis or `__`-delimited strong emphasis, unless it
+ is backslash-escaped.
+
+Where rules 1--12 above are compatible with multiple parsings,
+the following principles resolve ambiguity:
+
+13. The number of nestings should be minimized. Thus, for example,
+ an interpretation `<strong>...</strong>` is always preferred to
+ `<em><em>...</em></em>`.
+
+14. An interpretation `<em><strong>...</strong></em>` is always
+ preferred to `<strong><em>...</em></strong>`.
+
+15. When two potential emphasis or strong emphasis spans overlap,
+ so that the second begins before the first ends and ends after
+ the first ends, the first takes precedence. Thus, for example,
+ `*foo _bar* baz_` is parsed as `<em>foo _bar</em> baz_` rather
+ than `*foo <em>bar* baz</em>`.
+
+16. When there are two potential emphasis or strong emphasis spans
+ with the same closing delimiter, the shorter one (the one that
+ opens later) takes precedence. Thus, for example,
+ `**foo **bar baz**` is parsed as `**foo <strong>bar baz</strong>`
+ rather than `<strong>foo **bar baz</strong>`.
+
+17. Inline code spans, links, images, and HTML tags group more tightly
+ than emphasis. So, when there is a choice between an interpretation
+ that contains one of these elements and one that does not, the
+ former always wins. Thus, for example, `*[foo*](bar)` is
+ parsed as `*<a href="bar">foo*</a>` rather than as
+ `<em>[foo</em>](bar)`.
+
+These rules can be illustrated through a series of examples.
+
+Rule 1:
+
+```````````````````````````````` example
+*foo bar*
+.
+<p><em>foo bar</em></p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is followed by
+whitespace, and hence not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a * foo bar*
+.
+<p>a * foo bar*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `*` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a*"foo"*
+.
+<p>a*&quot;foo&quot;*</p>
+````````````````````````````````
+
+
+Unicode nonbreaking spaces count as whitespace, too:
+
+```````````````````````````````` example
+* a *
+.
+<p>* a *</p>
+````````````````````````````````
+
+
+Intraword emphasis with `*` is permitted:
+
+```````````````````````````````` example
+foo*bar*
+.
+<p>foo<em>bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5*6*78
+.
+<p>5<em>6</em>78</p>
+````````````````````````````````
+
+
+Rule 2:
+
+```````````````````````````````` example
+_foo bar_
+.
+<p><em>foo bar</em></p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is followed by
+whitespace:
+
+```````````````````````````````` example
+_ foo bar_
+.
+<p>_ foo bar_</p>
+````````````````````````````````
+
+
+This is not emphasis, because the opening `_` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a_"foo"_
+.
+<p>a_&quot;foo&quot;_</p>
+````````````````````````````````
+
+
+Emphasis with `_` is not allowed inside words:
+
+```````````````````````````````` example
+foo_bar_
+.
+<p>foo_bar_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5_6_78
+.
+<p>5_6_78</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+приÑтанÑм_ÑтремÑÑ‚ÑÑ_
+.
+<p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+````````````````````````````````
+
+
+Here `_` does not generate emphasis, because the first delimiter run
+is right-flanking and the second left-flanking:
+
+```````````````````````````````` example
+aa_"bb"_cc
+.
+<p>aa_&quot;bb&quot;_cc</p>
+````````````````````````````````
+
+
+This is emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-_(bar)_
+.
+<p>foo-<em>(bar)</em></p>
+````````````````````````````````
+
+
+Rule 3:
+
+This is not emphasis, because the closing delimiter does
+not match the opening delimiter:
+
+```````````````````````````````` example
+_foo*
+.
+<p>_foo*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the closing `*` is preceded by
+whitespace:
+
+```````````````````````````````` example
+*foo bar *
+.
+<p>*foo bar *</p>
+````````````````````````````````
+
+
+A newline also counts as whitespace:
+
+```````````````````````````````` example
+*foo bar
+*
+.
+<p>*foo bar
+*</p>
+````````````````````````````````
+
+
+This is not emphasis, because the second `*` is
+preceded by punctuation and followed by an alphanumeric
+(hence it is not part of a [right-flanking delimiter run]:
+
+```````````````````````````````` example
+*(*foo)
+.
+<p>*(*foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+*(*foo*)*
+.
+<p><em>(<em>foo</em>)</em></p>
+````````````````````````````````
+
+
+Intraword emphasis with `*` is allowed:
+
+```````````````````````````````` example
+*foo*bar
+.
+<p><em>foo</em>bar</p>
+````````````````````````````````
+
+
+
+Rule 4:
+
+This is not emphasis, because the closing `_` is preceded by
+whitespace:
+
+```````````````````````````````` example
+_foo bar _
+.
+<p>_foo bar _</p>
+````````````````````````````````
+
+
+This is not emphasis, because the second `_` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+_(_foo)
+.
+<p>_(_foo)</p>
+````````````````````````````````
+
+
+This is emphasis within emphasis:
+
+```````````````````````````````` example
+_(_foo_)_
+.
+<p><em>(<em>foo</em>)</em></p>
+````````````````````````````````
+
+
+Intraword emphasis is disallowed for `_`:
+
+```````````````````````````````` example
+_foo_bar
+.
+<p>_foo_bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_приÑтанÑм_ÑтремÑÑ‚ÑÑ
+.
+<p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo_bar_baz_
+.
+<p><em>foo_bar_baz</em></p>
+````````````````````````````````
+
+
+This is emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+_(bar)_.
+.
+<p><em>(bar)</em>.</p>
+````````````````````````````````
+
+
+Rule 5:
+
+```````````````````````````````` example
+**foo bar**
+.
+<p><strong>foo bar</strong></p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+** foo bar**
+.
+<p>** foo bar**</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `**` is preceded
+by an alphanumeric and followed by punctuation, and hence
+not part of a [left-flanking delimiter run]:
+
+```````````````````````````````` example
+a**"foo"**
+.
+<p>a**&quot;foo&quot;**</p>
+````````````````````````````````
+
+
+Intraword strong emphasis with `**` is permitted:
+
+```````````````````````````````` example
+foo**bar**
+.
+<p>foo<strong>bar</strong></p>
+````````````````````````````````
+
+
+Rule 6:
+
+```````````````````````````````` example
+__foo bar__
+.
+<p><strong>foo bar</strong></p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening delimiter is
+followed by whitespace:
+
+```````````````````````````````` example
+__ foo bar__
+.
+<p>__ foo bar__</p>
+````````````````````````````````
+
+
+A newline counts as whitespace:
+```````````````````````````````` example
+__
+foo bar__
+.
+<p>__
+foo bar__</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the opening `__` is preceded
+by an alphanumeric and followed by punctuation:
+
+```````````````````````````````` example
+a__"foo"__
+.
+<p>a__&quot;foo&quot;__</p>
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+foo__bar__
+.
+<p>foo__bar__</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+5__6__78
+.
+<p>5__6__78</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+приÑтанÑм__ÑтремÑÑ‚ÑÑ__
+.
+<p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo, __bar__, baz__
+.
+<p><strong>foo, <strong>bar</strong>, baz</strong></p>
+````````````````````````````````
+
+
+This is strong emphasis, even though the opening delimiter is
+both left- and right-flanking, because it is preceded by
+punctuation:
+
+```````````````````````````````` example
+foo-__(bar)__
+.
+<p>foo-<strong>(bar)</strong></p>
+````````````````````````````````
+
+
+
+Rule 7:
+
+This is not strong emphasis, because the closing delimiter is preceded
+by whitespace:
+
+```````````````````````````````` example
+**foo bar **
+.
+<p>**foo bar **</p>
+````````````````````````````````
+
+
+(Nor can it be interpreted as an emphasized `*foo bar *`, because of
+Rule 11.)
+
+This is not strong emphasis, because the second `**` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+**(**foo)
+.
+<p>**(**foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with these examples:
+
+```````````````````````````````` example
+*(**foo**)*
+.
+<p><em>(<strong>foo</strong>)</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**Gomphocarpus (*Gomphocarpus physocarpus*, syn.
+*Asclepias physocarpa*)**
+.
+<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
+<em>Asclepias physocarpa</em>)</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo "*bar*" foo**
+.
+<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>
+````````````````````````````````
+
+
+Intraword emphasis:
+
+```````````````````````````````` example
+**foo**bar
+.
+<p><strong>foo</strong>bar</p>
+````````````````````````````````
+
+
+Rule 8:
+
+This is not strong emphasis, because the closing delimiter is
+preceded by whitespace:
+
+```````````````````````````````` example
+__foo bar __
+.
+<p>__foo bar __</p>
+````````````````````````````````
+
+
+This is not strong emphasis, because the second `__` is
+preceded by punctuation and followed by an alphanumeric:
+
+```````````````````````````````` example
+__(__foo)
+.
+<p>__(__foo)</p>
+````````````````````````````````
+
+
+The point of this restriction is more easily appreciated
+with this example:
+
+```````````````````````````````` example
+_(__foo__)_
+.
+<p><em>(<strong>foo</strong>)</em></p>
+````````````````````````````````
+
+
+Intraword strong emphasis is forbidden with `__`:
+
+```````````````````````````````` example
+__foo__bar
+.
+<p>__foo__bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__приÑтанÑм__ÑтремÑÑ‚ÑÑ
+.
+<p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__bar__baz__
+.
+<p><strong>foo__bar__baz</strong></p>
+````````````````````````````````
+
+
+This is strong emphasis, even though the closing delimiter is
+both left- and right-flanking, because it is followed by
+punctuation:
+
+```````````````````````````````` example
+__(bar)__.
+.
+<p><strong>(bar)</strong>.</p>
+````````````````````````````````
+
+
+Rule 9:
+
+Any nonempty sequence of inline elements can be the contents of an
+emphasized span.
+
+```````````````````````````````` example
+*foo [bar](/url)*
+.
+<p><em>foo <a href="/url">bar</a></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo
+bar*
+.
+<p><em>foo
+bar</em></p>
+````````````````````````````````
+
+
+In particular, emphasis and strong emphasis can be nested
+inside emphasis:
+
+```````````````````````````````` example
+_foo __bar__ baz_
+.
+<p><em>foo <strong>bar</strong> baz</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo _bar_ baz_
+.
+<p><em>foo <em>bar</em> baz</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_ bar_
+.
+<p><em><em>foo</em> bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo *bar**
+.
+<p><em>foo <em>bar</em></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar** baz*
+.
+<p><em>foo <strong>bar</strong> baz</em></p>
+````````````````````````````````
+
+```````````````````````````````` example
+*foo**bar**baz*
+.
+<p><em>foo<strong>bar</strong>baz</em></p>
+````````````````````````````````
+
+Note that in the preceding case, the interpretation
+
+``` markdown
+<p><em>foo</em><em>bar<em></em>baz</em></p>
+```
+
+
+is precluded by the condition that a delimiter that
+can both open and close (like the `*` after `foo`)
+cannot form emphasis if the sum of the lengths of
+the delimiter runs containing the opening and
+closing delimiters is a multiple of 3 unless
+both lengths are multiples of 3.
+
+
+For the same reason, we don't get two consecutive
+emphasis sections in this example:
+
+```````````````````````````````` example
+*foo**bar*
+.
+<p><em>foo**bar</em></p>
+````````````````````````````````
+
+
+The same condition ensures that the following
+cases are all strong emphasis nested inside
+emphasis, even when the interior spaces are
+omitted:
+
+
+```````````````````````````````` example
+***foo** bar*
+.
+<p><em><strong>foo</strong> bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo **bar***
+.
+<p><em>foo <strong>bar</strong></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**bar***
+.
+<p><em>foo<strong>bar</strong></em></p>
+````````````````````````````````
+
+
+When the lengths of the interior closing and opening
+delimiter runs are *both* multiples of 3, though,
+they can match to create emphasis:
+
+```````````````````````````````` example
+foo***bar***baz
+.
+<p>foo<em><strong>bar</strong></em>baz</p>
+````````````````````````````````
+
+```````````````````````````````` example
+foo******bar*********baz
+.
+<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
+````````````````````````````````
+
+
+Indefinite levels of nesting are possible:
+
+```````````````````````````````` example
+*foo **bar *baz* bim** bop*
+.
+<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo [*bar*](/url)*
+.
+<p><em>foo <a href="/url"><em>bar</em></a></em></p>
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+** is not an empty emphasis
+.
+<p>** is not an empty emphasis</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**** is not an empty strong emphasis
+.
+<p>**** is not an empty strong emphasis</p>
+````````````````````````````````
+
+
+
+Rule 10:
+
+Any nonempty sequence of inline elements can be the contents of an
+strongly emphasized span.
+
+```````````````````````````````` example
+**foo [bar](/url)**
+.
+<p><strong>foo <a href="/url">bar</a></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo
+bar**
+.
+<p><strong>foo
+bar</strong></p>
+````````````````````````````````
+
+
+In particular, emphasis and strong emphasis can be nested
+inside strong emphasis:
+
+```````````````````````````````` example
+__foo _bar_ baz__
+.
+<p><strong>foo <em>bar</em> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo __bar__ baz__
+.
+<p><strong>foo <strong>bar</strong> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo__ bar__
+.
+<p><strong><strong>foo</strong> bar</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo **bar****
+.
+<p><strong>foo <strong>bar</strong></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo *bar* baz**
+.
+<p><strong>foo <em>bar</em> baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo*bar*baz**
+.
+<p><strong>foo<em>bar</em>baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+***foo* bar**
+.
+<p><strong><em>foo</em> bar</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo *bar***
+.
+<p><strong>foo <em>bar</em></strong></p>
+````````````````````````````````
+
+
+Indefinite levels of nesting are possible:
+
+```````````````````````````````` example
+**foo *bar **baz**
+bim* bop**
+.
+<p><strong>foo <em>bar <strong>baz</strong>
+bim</em> bop</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo [*bar*](/url)**
+.
+<p><strong>foo <a href="/url"><em>bar</em></a></strong></p>
+````````````````````````````````
+
+
+There can be no empty emphasis or strong emphasis:
+
+```````````````````````````````` example
+__ is not an empty emphasis
+.
+<p>__ is not an empty emphasis</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____ is not an empty strong emphasis
+.
+<p>____ is not an empty strong emphasis</p>
+````````````````````````````````
+
+
+
+Rule 11:
+
+```````````````````````````````` example
+foo ***
+.
+<p>foo ***</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *\**
+.
+<p>foo <em>*</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *_*
+.
+<p>foo <em>_</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo *****
+.
+<p>foo *****</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **\***
+.
+<p>foo <strong>*</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo **_**
+.
+<p>foo <strong>_</strong></p>
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 11 determines
+that the excess literal `*` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+**foo*
+.
+<p>*<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo**
+.
+<p><em>foo</em>*</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+***foo**
+.
+<p>*<strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+****foo*
+.
+<p>***<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**foo***
+.
+<p><strong>foo</strong>*</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo****
+.
+<p><em>foo</em>***</p>
+````````````````````````````````
+
+
+
+Rule 12:
+
+```````````````````````````````` example
+foo ___
+.
+<p>foo ___</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _\__
+.
+<p>foo <em>_</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _*_
+.
+<p>foo <em>*</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo _____
+.
+<p>foo _____</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __\___
+.
+<p>foo <strong>_</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo __*__
+.
+<p>foo <strong>*</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo_
+.
+<p>_<em>foo</em></p>
+````````````````````````````````
+
+
+Note that when delimiters do not match evenly, Rule 12 determines
+that the excess literal `_` characters will appear outside of the
+emphasis, rather than inside it:
+
+```````````````````````````````` example
+_foo__
+.
+<p><em>foo</em>_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+___foo__
+.
+<p>_<strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo_
+.
+<p>___<em>foo</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo___
+.
+<p><strong>foo</strong>_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo____
+.
+<p><em>foo</em>___</p>
+````````````````````````````````
+
+
+Rule 13 implies that if you want emphasis nested directly inside
+emphasis, you must use different delimiters:
+
+```````````````````````````````` example
+**foo**
+.
+<p><strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*_foo_*
+.
+<p><em><em>foo</em></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__foo__
+.
+<p><strong>foo</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_*foo*_
+.
+<p><em><em>foo</em></em></p>
+````````````````````````````````
+
+
+However, strong emphasis within strong emphasis is possible without
+switching delimiters:
+
+```````````````````````````````` example
+****foo****
+.
+<p><strong><strong>foo</strong></strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+____foo____
+.
+<p><strong><strong>foo</strong></strong></p>
+````````````````````````````````
+
+
+
+Rule 13 can be applied to arbitrarily long sequences of
+delimiters:
+
+```````````````````````````````` example
+******foo******
+.
+<p><strong><strong><strong>foo</strong></strong></strong></p>
+````````````````````````````````
+
+
+Rule 14:
+
+```````````````````````````````` example
+***foo***
+.
+<p><em><strong>foo</strong></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_____foo_____
+.
+<p><em><strong><strong>foo</strong></strong></em></p>
+````````````````````````````````
+
+
+Rule 15:
+
+```````````````````````````````` example
+*foo _bar* baz_
+.
+<p><em>foo _bar</em> baz_</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo __bar *baz bim__ bam*
+.
+<p><em>foo <strong>bar *baz bim</strong> bam</em></p>
+````````````````````````````````
+
+
+Rule 16:
+
+```````````````````````````````` example
+**foo **bar baz**
+.
+<p>**foo <strong>bar baz</strong></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo *bar baz*
+.
+<p>*foo <em>bar baz</em></p>
+````````````````````````````````
+
+
+Rule 17:
+
+```````````````````````````````` example
+*[bar*](/url)
+.
+<p>*<a href="/url">bar*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_foo [bar_](/url)
+.
+<p>_foo <a href="/url">bar_</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*<img src="foo" title="*"/>
+.
+<p>*<img src="foo" title="*"/></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**<a href="**">
+.
+<p>**<a href="**"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__<a href="__">
+.
+<p>__<a href="__"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*a `*`*
+.
+<p><em>a <code>*</code></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+_a `_`_
+.
+<p><em>a <code>_</code></em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+**a<http://foo.bar/?q=**>
+.
+<p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+__a<http://foo.bar/?q=__>
+.
+<p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
+````````````````````````````````
+
+
+<div class="extension">
+
+## Strikethrough (extension)
+
+GFM enables the `strikethrough` extension, where an additional emphasis type is
+available.
+
+Strikethrough text is any text wrapped in two tildes (`~`).
+
+```````````````````````````````` example strikethrough
+~~Hi~~ Hello, world!
+.
+<p><del>Hi</del> Hello, world!</p>
+````````````````````````````````
+
+As with regular emphasis delimiters, a new paragraph will cause strikethrough
+parsing to cease:
+
+```````````````````````````````` example strikethrough
+This ~~has a
+
+new paragraph~~.
+.
+<p>This ~~has a</p>
+<p>new paragraph~~.</p>
+````````````````````````````````
+
+</div>
+
+## Links
+
+A link contains [link text] (the visible text), a [link destination]
+(the URI that is the link destination), and optionally a [link title].
+There are two basic kinds of links in Markdown. In [inline links] the
+destination and title are given immediately after the link text. In
+[reference links] the destination and title are defined elsewhere in
+the document.
+
+A [link text](@) consists of a sequence of zero or more
+inline elements enclosed by square brackets (`[` and `]`). The
+following rules apply:
+
+- Links may not contain other links, at any level of nesting. If
+ multiple otherwise valid link definitions appear nested inside each
+ other, the inner-most definition is used.
+
+- Brackets are allowed in the [link text] only if (a) they
+ are backslash-escaped or (b) they appear as a matched pair of brackets,
+ with an open bracket `[`, a sequence of zero or more inlines, and
+ a close bracket `]`.
+
+- Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly
+ than the brackets in link text. Thus, for example,
+ `` [foo`]` `` could not be a link text, since the second `]`
+ is part of a code span.
+
+- The brackets in link text bind more tightly than markers for
+ [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link.
+
+A [link destination](@) consists of either
+
+- a sequence of zero or more characters between an opening `<` and a
+ closing `>` that contains no line breaks or unescaped
+ `<` or `>` characters, or
+
+- a nonempty sequence of characters that does not start with
+ `<`, does not include ASCII space or control characters, and
+ includes parentheses only if (a) they are backslash-escaped or
+ (b) they are part of a balanced pair of unescaped parentheses.
+ (Implementations may impose limits on parentheses nesting to
+ avoid performance issues, but at least three levels of nesting
+ should be supported.)
+
+A [link title](@) consists of either
+
+- a sequence of zero or more characters between straight double-quote
+ characters (`"`), including a `"` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between straight single-quote
+ characters (`'`), including a `'` character only if it is
+ backslash-escaped, or
+
+- a sequence of zero or more characters between matching parentheses
+ (`(...)`), including a `(` or `)` character only if it is
+ backslash-escaped.
+
+Although [link titles] may span multiple lines, they may not contain
+a [blank line].
+
+An [inline link](@) consists of a [link text] followed immediately
+by a left parenthesis `(`, optional [whitespace], an optional
+[link destination], an optional [link title] separated from the link
+destination by [whitespace], optional [whitespace], and a right
+parenthesis `)`. The link's text consists of the inlines contained
+in the [link text] (excluding the enclosing square brackets).
+The link's URI consists of the link destination, excluding enclosing
+`<...>` if present, with backslash-escapes in effect as described
+above. The link's title consists of the link title, excluding its
+enclosing delimiters, with backslash-escapes in effect as described
+above.
+
+Here is a simple inline link:
+
+```````````````````````````````` example
+[link](/uri "title")
+.
+<p><a href="/uri" title="title">link</a></p>
+````````````````````````````````
+
+
+The title may be omitted:
+
+```````````````````````````````` example
+[link](/uri)
+.
+<p><a href="/uri">link</a></p>
+````````````````````````````````
+
+
+Both the title and the destination may be omitted:
+
+```````````````````````````````` example
+[link]()
+.
+<p><a href="">link</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](<>)
+.
+<p><a href="">link</a></p>
+````````````````````````````````
+
+The destination can only contain spaces if it is
+enclosed in pointy brackets:
+
+```````````````````````````````` example
+[link](/my uri)
+.
+<p>[link](/my uri)</p>
+````````````````````````````````
+
+```````````````````````````````` example
+[link](</my uri>)
+.
+<p><a href="/my%20uri">link</a></p>
+````````````````````````````````
+
+The destination cannot contain line breaks,
+even if enclosed in pointy brackets:
+
+```````````````````````````````` example
+[link](foo
+bar)
+.
+<p>[link](foo
+bar)</p>
+````````````````````````````````
+
+```````````````````````````````` example
+[link](<foo
+bar>)
+.
+<p>[link](<foo
+bar>)</p>
+````````````````````````````````
+
+The destination can contain `)` if it is enclosed
+in pointy brackets:
+
+```````````````````````````````` example
+[a](<b)c>)
+.
+<p><a href="b)c">a</a></p>
+````````````````````````````````
+
+Pointy brackets that enclose links must be unescaped:
+
+```````````````````````````````` example
+[link](<foo\>)
+.
+<p>[link](&lt;foo&gt;)</p>
+````````````````````````````````
+
+These are not links, because the opening pointy bracket
+is not matched properly:
+
+```````````````````````````````` example
+[a](<b)c
+[a](<b)c>
+[a](<b>c)
+.
+<p>[a](&lt;b)c
+[a](&lt;b)c&gt;
+[a](<b>c)</p>
+````````````````````````````````
+
+Parentheses inside the link destination may be escaped:
+
+```````````````````````````````` example
+[link](\(foo\))
+.
+<p><a href="(foo)">link</a></p>
+````````````````````````````````
+
+Any number of parentheses are allowed without escaping, as long as they are
+balanced:
+
+```````````````````````````````` example
+[link](foo(and(bar)))
+.
+<p><a href="foo(and(bar))">link</a></p>
+````````````````````````````````
+
+However, if you have unbalanced parentheses, you need to escape or use the
+`<...>` form:
+
+```````````````````````````````` example
+[link](foo\(and\(bar\))
+.
+<p><a href="foo(and(bar)">link</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link](<foo(and(bar)>)
+.
+<p><a href="foo(and(bar)">link</a></p>
+````````````````````````````````
+
+
+Parentheses and other symbols can also be escaped, as usual
+in Markdown:
+
+```````````````````````````````` example
+[link](foo\)\:)
+.
+<p><a href="foo):">link</a></p>
+````````````````````````````````
+
+
+A link can contain fragment identifiers and queries:
+
+```````````````````````````````` example
+[link](#fragment)
+
+[link](http://example.com#fragment)
+
+[link](http://example.com?foo=3#frag)
+.
+<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>
+````````````````````````````````
+
+
+Note that a backslash before a non-escapable character is
+just a backslash:
+
+```````````````````````````````` example
+[link](foo\bar)
+.
+<p><a href="foo%5Cbar">link</a></p>
+````````````````````````````````
+
+
+URL-escaping should be left alone inside the destination, as all
+URL-escaped characters are also valid URL characters. Entity and
+numerical character references in the destination will be parsed
+into the corresponding Unicode code points, as usual. These may
+be optionally URL-escaped when written as HTML, but this spec
+does not enforce any particular policy for rendering URLs in
+HTML or other formats. Renderers may make different decisions
+about how to escape or normalize URLs in the output.
+
+```````````````````````````````` example
+[link](foo%20b&auml;)
+.
+<p><a href="foo%20b%C3%A4">link</a></p>
+````````````````````````````````
+
+
+Note that, because titles can often be parsed as destinations,
+if you try to omit the destination and keep the title, you'll
+get unexpected results:
+
+```````````````````````````````` example
+[link]("title")
+.
+<p><a href="%22title%22">link</a></p>
+````````````````````````````````
+
+
+Titles may be in single quotes, double quotes, or parentheses:
+
+```````````````````````````````` example
+[link](/url "title")
+[link](/url 'title')
+[link](/url (title))
+.
+<p><a href="/url" title="title">link</a>
+<a href="/url" title="title">link</a>
+<a href="/url" title="title">link</a></p>
+````````````````````````````````
+
+
+Backslash escapes and entity and numeric character references
+may be used in titles:
+
+```````````````````````````````` example
+[link](/url "title \"&quot;")
+.
+<p><a href="/url" title="title &quot;&quot;">link</a></p>
+````````````````````````````````
+
+
+Titles must be separated from the link using a [whitespace].
+Other [Unicode whitespace] like non-breaking space doesn't work.
+
+```````````````````````````````` example
+[link](/url "title")
+.
+<p><a href="/url%C2%A0%22title%22">link</a></p>
+````````````````````````````````
+
+
+Nested balanced quotes are not allowed without escaping:
+
+```````````````````````````````` example
+[link](/url "title "and" title")
+.
+<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>
+````````````````````````````````
+
+
+But it is easy to work around this by using a different quote type:
+
+```````````````````````````````` example
+[link](/url 'title "and" title')
+.
+<p><a href="/url" title="title &quot;and&quot; title">link</a></p>
+````````````````````````````````
+
+
+(Note: `Markdown.pl` did allow double quotes inside a double-quoted
+title, and its test suite included a test demonstrating this.
+But it is hard to see a good rationale for the extra complexity this
+brings, since there are already many ways---backslash escaping,
+entity and numeric character references, or using a different
+quote type for the enclosing title---to write titles containing
+double quotes. `Markdown.pl`'s handling of titles has a number
+of other strange features. For example, it allows single-quoted
+titles in inline links, but not reference links. And, in
+reference links but not inline links, it allows a title to begin
+with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows
+titles with no closing quotation mark, though 1.0.2b8 does not.
+It seems preferable to adopt a simple, rational rule that works
+the same way in inline links and link reference definitions.)
+
+[Whitespace] is allowed around the destination and title:
+
+```````````````````````````````` example
+[link]( /uri
+ "title" )
+.
+<p><a href="/uri" title="title">link</a></p>
+````````````````````````````````
+
+
+But it is not allowed between the link text and the
+following parenthesis:
+
+```````````````````````````````` example
+[link] (/uri)
+.
+<p>[link] (/uri)</p>
+````````````````````````````````
+
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]](/uri)
+.
+<p><a href="/uri">link [foo [bar]]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link] bar](/uri)
+.
+<p>[link] bar](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link [bar](/uri)
+.
+<p>[link <a href="/uri">bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link \[bar](/uri)
+.
+<p><a href="/uri">link [bar</a></p>
+````````````````````````````````
+
+
+The link text may contain inline content:
+
+```````````````````````````````` example
+[link *foo **bar** `#`*](/uri)
+.
+<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[![moon](moon.jpg)](/uri)
+.
+<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)](/uri)
+.
+<p>[foo <a href="/uri">bar</a>](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *[bar [baz](/uri)](/uri)*](/uri)
+.
+<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![[[foo](uri1)](uri2)](uri3)
+.
+<p><img src="uri3" alt="[foo](uri2)" /></p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*](/uri)
+.
+<p>*<a href="/uri">foo*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar](baz*)
+.
+<p><a href="baz*">foo *bar</a></p>
+````````````````````````````````
+
+
+Note that brackets that *aren't* part of links do not take
+precedence:
+
+```````````````````````````````` example
+*foo [bar* baz]
+.
+<p><em>foo [bar</em> baz]</p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo <bar attr="](baz)">
+.
+<p>[foo <bar attr="](baz)"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo`](/uri)`
+.
+<p>[foo<code>](/uri)</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo<http://example.com/?search=](uri)>
+.
+<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
+````````````````````````````````
+
+
+There are three kinds of [reference link](@)s:
+[full](#full-reference-link), [collapsed](#collapsed-reference-link),
+and [shortcut](#shortcut-reference-link).
+
+A [full reference link](@)
+consists of a [link text] immediately followed by a [link label]
+that [matches] a [link reference definition] elsewhere in the document.
+
+A [link label](@) begins with a left bracket (`[`) and ends
+with the first right bracket (`]`) that is not backslash-escaped.
+Between these brackets there must be at least one [non-whitespace character].
+Unescaped square bracket characters are not allowed inside the
+opening and closing square brackets of [link labels]. A link
+label can have at most 999 characters inside the square
+brackets.
+
+One label [matches](@)
+another just in case their normalized forms are equal. To normalize a
+label, strip off the opening and closing brackets,
+perform the *Unicode case fold*, strip leading and trailing
+[whitespace] and collapse consecutive internal
+[whitespace] to a single space. If there are multiple
+matching reference link definitions, the one that comes first in the
+document is used. (It is desirable in such cases to emit a warning.)
+
+The contents of the first link label are parsed as inlines, which are
+used as the link's text. The link's URI and title are provided by the
+matching [link reference definition].
+
+Here is a simple example:
+
+```````````````````````````````` example
+[foo][bar]
+
+[bar]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+The rules for the [link text] are the same as with
+[inline links]. Thus:
+
+The link text may contain balanced brackets, but not unbalanced ones,
+unless they are escaped:
+
+```````````````````````````````` example
+[link [foo [bar]]][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link [foo [bar]]</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[link \[bar][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link [bar</a></p>
+````````````````````````````````
+
+
+The link text may contain inline content:
+
+```````````````````````````````` example
+[link *foo **bar** `#`*][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[![moon](moon.jpg)][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
+````````````````````````````````
+
+
+However, links may not contain other links, at any level of nesting.
+
+```````````````````````````````` example
+[foo [bar](/uri)][ref]
+
+[ref]: /uri
+.
+<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar [baz][ref]*][ref]
+
+[ref]: /uri
+.
+<p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
+````````````````````````````````
+
+
+(In the examples above, we have two [shortcut reference links]
+instead of one [full reference link].)
+
+The following cases illustrate the precedence of link text grouping over
+emphasis grouping:
+
+```````````````````````````````` example
+*[foo*][ref]
+
+[ref]: /uri
+.
+<p>*<a href="/uri">foo*</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo *bar][ref]
+
+[ref]: /uri
+.
+<p><a href="/uri">foo *bar</a></p>
+````````````````````````````````
+
+
+These cases illustrate the precedence of HTML tags, code spans,
+and autolinks over link grouping:
+
+```````````````````````````````` example
+[foo <bar attr="][ref]">
+
+[ref]: /uri
+.
+<p>[foo <bar attr="][ref]"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo`][ref]`
+
+[ref]: /uri
+.
+<p>[foo<code>][ref]</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo<http://example.com/?search=][ref]>
+
+[ref]: /uri
+.
+<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
+````````````````````````````````
+
+
+Matching is case-insensitive:
+
+```````````````````````````````` example
+[foo][BaR]
+
+[bar]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+Unicode case fold is used:
+
+```````````````````````````````` example
+[Толпой][Толпой] is a Russian word.
+
+[ТОЛПОЙ]: /url
+.
+<p><a href="/url">Толпой</a> is a Russian word.</p>
+````````````````````````````````
+
+
+Consecutive internal [whitespace] is treated as one space for
+purposes of determining matching:
+
+```````````````````````````````` example
+[Foo
+ bar]: /url
+
+[Baz][Foo bar]
+.
+<p><a href="/url">Baz</a></p>
+````````````````````````````````
+
+
+No [whitespace] is allowed between the [link text] and the
+[link label]:
+
+```````````````````````````````` example
+[foo] [bar]
+
+[bar]: /url "title"
+.
+<p>[foo] <a href="/url" title="title">bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo]
+[bar]
+
+[bar]: /url "title"
+.
+<p>[foo]
+<a href="/url" title="title">bar</a></p>
+````````````````````````````````
+
+
+This is a departure from John Gruber's original Markdown syntax
+description, which explicitly allows whitespace between the link
+text and the link label. It brings reference links in line with
+[inline links], which (according to both original Markdown and
+this spec) cannot have whitespace after the link text. More
+importantly, it prevents inadvertent capture of consecutive
+[shortcut reference links]. If whitespace is allowed between the
+link text and the link label, then in the following we will have
+a single reference link, not two shortcut reference links, as
+intended:
+
+``` markdown
+[foo]
+[bar]
+
+[foo]: /url1
+[bar]: /url2
+```
+
+(Note that [shortcut reference links] were introduced by Gruber
+himself in a beta version of `Markdown.pl`, but never included
+in the official syntax description. Without shortcut reference
+links, it is harmless to allow space between the link text and
+link label; but once shortcut references are introduced, it is
+too dangerous to allow this, as it frequently leads to
+unintended results.)
+
+When there are multiple matching [link reference definitions],
+the first is used:
+
+```````````````````````````````` example
+[foo]: /url1
+
+[foo]: /url2
+
+[bar][foo]
+.
+<p><a href="/url1">bar</a></p>
+````````````````````````````````
+
+
+Note that matching is performed on normalized strings, not parsed
+inline content. So the following does not match, even though the
+labels define equivalent inline content:
+
+```````````````````````````````` example
+[bar][foo\!]
+
+[foo!]: /url
+.
+<p>[bar][foo!]</p>
+````````````````````````````````
+
+
+[Link labels] cannot contain brackets, unless they are
+backslash-escaped:
+
+```````````````````````````````` example
+[foo][ref[]
+
+[ref[]: /uri
+.
+<p>[foo][ref[]</p>
+<p>[ref[]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo][ref[bar]]
+
+[ref[bar]]: /uri
+.
+<p>[foo][ref[bar]]</p>
+<p>[ref[bar]]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[[foo]]]
+
+[[[foo]]]: /url
+.
+<p>[[[foo]]]</p>
+<p>[[[foo]]]: /url</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[foo][ref\[]
+
+[ref\[]: /uri
+.
+<p><a href="/uri">foo</a></p>
+````````````````````````````````
+
+
+Note that in this example `]` is not backslash-escaped:
+
+```````````````````````````````` example
+[bar\\]: /uri
+
+[bar\\]
+.
+<p><a href="/uri">bar\</a></p>
+````````````````````````````````
+
+
+A [link label] must contain at least one [non-whitespace character]:
+
+```````````````````````````````` example
+[]
+
+[]: /uri
+.
+<p>[]</p>
+<p>[]: /uri</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[
+ ]
+
+[
+ ]: /uri
+.
+<p>[
+]</p>
+<p>[
+]: /uri</p>
+````````````````````````````````
+
+
+A [collapsed reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document, followed by the string `[]`.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title are
+provided by the matching reference link definition. Thus,
+`[foo][]` is equivalent to `[foo][foo]`.
+
+```````````````````````````````` example
+[foo][]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[*foo* bar][]
+
+[*foo* bar]: /url "title"
+.
+<p><a href="/url" title="title"><em>foo</em> bar</a></p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+[Foo][]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">Foo</a></p>
+````````````````````````````````
+
+
+
+As with full reference links, [whitespace] is not
+allowed between the two sets of brackets:
+
+```````````````````````````````` example
+[foo]
+[]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a>
+[]</p>
+````````````````````````````````
+
+
+A [shortcut reference link](@)
+consists of a [link label] that [matches] a
+[link reference definition] elsewhere in the
+document and is not followed by `[]` or a link label.
+The contents of the first link label are parsed as inlines,
+which are used as the link's text. The link's URI and title
+are provided by the matching link reference definition.
+Thus, `[foo]` is equivalent to `[foo][]`.
+
+```````````````````````````````` example
+[foo]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[*foo* bar]
+
+[*foo* bar]: /url "title"
+.
+<p><a href="/url" title="title"><em>foo</em> bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[*foo* bar]]
+
+[*foo* bar]: /url "title"
+.
+<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+[[bar [foo]
+
+[foo]: /url
+.
+<p>[[bar <a href="/url">foo</a></p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+[Foo]
+
+[foo]: /url "title"
+.
+<p><a href="/url" title="title">Foo</a></p>
+````````````````````````````````
+
+
+A space after the link text should be preserved:
+
+```````````````````````````````` example
+[foo] bar
+
+[foo]: /url
+.
+<p><a href="/url">foo</a> bar</p>
+````````````````````````````````
+
+
+If you just want bracketed text, you can backslash-escape the
+opening bracket to avoid links:
+
+```````````````````````````````` example
+\[foo]
+
+[foo]: /url "title"
+.
+<p>[foo]</p>
+````````````````````````````````
+
+
+Note that this is a link, because a link label ends with the first
+following closing bracket:
+
+```````````````````````````````` example
+[foo*]: /url
+
+*[foo*]
+.
+<p>*<a href="/url">foo*</a></p>
+````````````````````````````````
+
+
+Full and compact references take precedence over shortcut
+references:
+
+```````````````````````````````` example
+[foo][bar]
+
+[foo]: /url1
+[bar]: /url2
+.
+<p><a href="/url2">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo][]
+
+[foo]: /url1
+.
+<p><a href="/url1">foo</a></p>
+````````````````````````````````
+
+Inline links also take precedence:
+
+```````````````````````````````` example
+[foo]()
+
+[foo]: /url1
+.
+<p><a href="">foo</a></p>
+````````````````````````````````
+
+```````````````````````````````` example
+[foo](not a link)
+
+[foo]: /url1
+.
+<p><a href="/url1">foo</a>(not a link)</p>
+````````````````````````````````
+
+In the following case `[bar][baz]` is parsed as a reference,
+`[foo]` as normal text:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url
+.
+<p>[foo]<a href="/url">bar</a></p>
+````````````````````````````````
+
+
+Here, though, `[foo][bar]` is parsed as a reference, since
+`[bar]` is defined:
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[bar]: /url2
+.
+<p><a href="/url2">foo</a><a href="/url1">baz</a></p>
+````````````````````````````````
+
+
+Here `[foo]` is not parsed as a shortcut reference, because it
+is followed by a link label (even though `[bar]` is not defined):
+
+```````````````````````````````` example
+[foo][bar][baz]
+
+[baz]: /url1
+[foo]: /url2
+.
+<p>[foo]<a href="/url1">bar</a></p>
+````````````````````````````````
+
+
+
+## Images
+
+Syntax for images is like the syntax for links, with one
+difference. Instead of [link text], we have an
+[image description](@). The rules for this are the
+same as for [link text], except that (a) an
+image description starts with `![` rather than `[`, and
+(b) an image description may contain links.
+An image description has inline elements
+as its contents. When an image is rendered to HTML,
+this is standardly used as the image's `alt` attribute.
+
+```````````````````````````````` example
+![foo](/url "title")
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo ![bar](/url)](/url2)
+.
+<p><img src="/url2" alt="foo bar" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo [bar](/url)](/url2)
+.
+<p><img src="/url2" alt="foo bar" /></p>
+````````````````````````````````
+
+
+Though this spec is concerned with parsing, not rendering, it is
+recommended that in rendering to HTML, only the plain string content
+of the [image description] be used. Note that in
+the above example, the alt attribute's value is `foo bar`, not `foo
+[bar](/url)` or `foo <a href="/url">bar</a>`. Only the plain string
+content is rendered, without formatting.
+
+```````````````````````````````` example
+![foo *bar*][]
+
+[foo *bar*]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo *bar*][foobar]
+
+[FOOBAR]: train.jpg "train & tracks"
+.
+<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo](train.jpg)
+.
+<p><img src="train.jpg" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+My ![foo bar](/path/to/train.jpg "title" )
+.
+<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo](<url>)
+.
+<p><img src="url" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![](/url)
+.
+<p><img src="/url" alt="" /></p>
+````````````````````````````````
+
+
+Reference-style:
+
+```````````````````````````````` example
+![foo][bar]
+
+[bar]: /url
+.
+<p><img src="/url" alt="foo" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![foo][bar]
+
+[BAR]: /url
+.
+<p><img src="/url" alt="foo" /></p>
+````````````````````````````````
+
+
+Collapsed:
+
+```````````````````````````````` example
+![foo][]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar][]
+
+[*foo* bar]: /url "title"
+.
+<p><img src="/url" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+The labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo][]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="Foo" title="title" /></p>
+````````````````````````````````
+
+
+As with reference links, [whitespace] is not allowed
+between the two sets of brackets:
+
+```````````````````````````````` example
+![foo]
+[]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" />
+[]</p>
+````````````````````````````````
+
+
+Shortcut:
+
+```````````````````````````````` example
+![foo]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="foo" title="title" /></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+![*foo* bar]
+
+[*foo* bar]: /url "title"
+.
+<p><img src="/url" alt="foo bar" title="title" /></p>
+````````````````````````````````
+
+
+Note that link labels cannot contain unescaped brackets:
+
+```````````````````````````````` example
+![[foo]]
+
+[[foo]]: /url "title"
+.
+<p>![[foo]]</p>
+<p>[[foo]]: /url &quot;title&quot;</p>
+````````````````````````````````
+
+
+The link labels are case-insensitive:
+
+```````````````````````````````` example
+![Foo]
+
+[foo]: /url "title"
+.
+<p><img src="/url" alt="Foo" title="title" /></p>
+````````````````````````````````
+
+
+If you just want a literal `!` followed by bracketed text, you can
+backslash-escape the opening `[`:
+
+```````````````````````````````` example
+!\[foo]
+
+[foo]: /url "title"
+.
+<p>![foo]</p>
+````````````````````````````````
+
+
+If you want a link after a literal `!`, backslash-escape the
+`!`:
+
+```````````````````````````````` example
+\![foo]
+
+[foo]: /url "title"
+.
+<p>!<a href="/url" title="title">foo</a></p>
+````````````````````````````````
+
+
+## Autolinks
+
+[Autolink](@)s are absolute URIs and email addresses inside
+`<` and `>`. They are parsed as links, with the URL or email address
+as the link label.
+
+A [URI autolink](@) consists of `<`, followed by an
+[absolute URI] followed by `>`. It is parsed as
+a link to the URI, with the URI as the link's label.
+
+An [absolute URI](@),
+for these purposes, consists of a [scheme] followed by a colon (`:`)
+followed by zero or more characters other than ASCII
+[whitespace] and control characters, `<`, and `>`. If
+the URI includes these characters, they must be percent-encoded
+(e.g. `%20` for a space).
+
+For purposes of this spec, a [scheme](@) is any sequence
+of 2--32 characters beginning with an ASCII letter and followed
+by any combination of ASCII letters, digits, or the symbols plus
+("+"), period ("."), or hyphen ("-").
+
+Here are some valid autolinks:
+
+```````````````````````````````` example
+<http://foo.bar.baz>
+.
+<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://foo.bar.baz/test?q=hello&id=22&boolean>
+.
+<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>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<irc://foo.bar:2233/baz>
+.
+<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
+````````````````````````````````
+
+
+Uppercase is also fine:
+
+```````````````````````````````` example
+<MAILTO:FOO@BAR.BAZ>
+.
+<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
+````````````````````````````````
+
+
+Note that many strings that count as [absolute URIs] for
+purposes of this spec are not valid URIs, because their
+schemes are not registered or because of other problems
+with their syntax:
+
+```````````````````````````````` example
+<a+b+c:d>
+.
+<p><a href="a+b+c:d">a+b+c:d</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<made-up-scheme://foo,bar>
+.
+<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<http://../>
+.
+<p><a href="http://../">http://../</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<localhost:5001/foo>
+.
+<p><a href="localhost:5001/foo">localhost:5001/foo</a></p>
+````````````````````````````````
+
+
+Spaces are not allowed in autolinks:
+
+```````````````````````````````` example
+<http://foo.bar/baz bim>
+.
+<p>&lt;http://foo.bar/baz bim&gt;</p>
+````````````````````````````````
+
+
+Backslash-escapes do not work inside autolinks:
+
+```````````````````````````````` example
+<http://example.com/\[\>
+.
+<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
+````````````````````````````````
+
+
+An [email autolink](@)
+consists of `<`, followed by an [email address],
+followed by `>`. The link's label is the email address,
+and the URL is `mailto:` followed by the email address.
+
+An [email address](@),
+for these purposes, is anything that matches
+the [non-normative regex from the HTML5
+spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email)):
+
+ /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
+ (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
+
+Examples of email autolinks:
+
+```````````````````````````````` example
+<foo@bar.example.com>
+.
+<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<foo+special@Bar.baz-bar0.com>
+.
+<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
+````````````````````````````````
+
+
+Backslash-escapes do not work inside email autolinks:
+
+```````````````````````````````` example
+<foo\+@bar.example.com>
+.
+<p>&lt;foo+@bar.example.com&gt;</p>
+````````````````````````````````
+
+
+These are not autolinks:
+
+```````````````````````````````` example
+<>
+.
+<p>&lt;&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+< http://foo.bar >
+.
+<p>&lt; http://foo.bar &gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<m:abc>
+.
+<p>&lt;m:abc&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<foo.bar.baz>
+.
+<p>&lt;foo.bar.baz&gt;</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+http://example.com
+.
+<p>http://example.com</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo@bar.example.com
+.
+<p>foo@bar.example.com</p>
+````````````````````````````````
+
+<div class="extension">
+
+## Autolinks (extension)
+
+GFM enables the `autolink` extension, where autolinks will be recognised in a
+greater number of conditions.
+
+[Autolink]s can also be constructed without requiring the use of `<` and to `>`
+to delimit them, although they will be recognized under a smaller set of
+circumstances. All such recognized autolinks can only come at the beginning of
+a line, after whitespace, or any of the delimiting characters `*`, `_`, `~`,
+and `(`.
+
+An [extended www autolink](@) will be recognized
+when the text `www.` is found followed by a [valid domain].
+A [valid domain](@) consists of segments
+of alphanumeric characters, underscores (`_`) and hyphens (`-`)
+separated by periods (`.`).
+There must be at least one period,
+and no underscores may be present in the last two segments of the domain.
+
+The scheme `http` will be inserted automatically:
+
+```````````````````````````````` example autolink
+www.commonmark.org
+.
+<p><a href="http://www.commonmark.org">www.commonmark.org</a></p>
+````````````````````````````````
+
+After a [valid domain], zero or more non-space non-`<` characters may follow:
+
+```````````````````````````````` example autolink
+Visit www.commonmark.org/help for more information.
+.
+<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help</a> for more information.</p>
+````````````````````````````````
+
+We then apply [extended autolink path validation](@) as follows:
+
+Trailing punctuation (specifically, `?`, `!`, `.`, `,`, `:`, `*`, `_`, and `~`)
+will not be considered part of the autolink, though they may be included in the
+interior of the link:
+
+```````````````````````````````` example autolink
+Visit www.commonmark.org.
+
+Visit www.commonmark.org/a.b.
+.
+<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>
+````````````````````````````````
+
+When an autolink ends in `)`, we scan the entire autolink for the total number
+of parentheses. If there is a greater number of closing parentheses than
+opening ones, we don't consider the unmatched trailing parentheses part of the
+autolink, in order to facilitate including an autolink inside a parenthesis:
+
+```````````````````````````````` example autolink
+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)
+.
+<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>
+````````````````````````````````
+
+This check is only done when the link ends in a closing parentheses `)`, so if
+the only parentheses are in the interior of the autolink, no special rules are
+applied:
+
+```````````````````````````````` example autolink
+www.google.com/search?q=(business))+ok
+.
+<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
+````````````````````````````````
+
+If an autolink ends in a semicolon (`;`), we check to see if it appears to
+resemble an [entity reference][entity references]; if the preceding text is `&`
+followed by one or more alphanumeric characters. If so, it is excluded from
+the autolink:
+
+```````````````````````````````` example autolink
+www.google.com/search?q=commonmark&hl=en
+
+www.google.com/search?q=commonmark&hl;
+.
+<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>
+````````````````````````````````
+
+`<` immediately ends an autolink.
+
+```````````````````````````````` example autolink
+www.commonmark.org/he<lp
+.
+<p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
+````````````````````````````````
+
+An [extended url autolink](@) will be recognised when one of the schemes
+`http://`, `https://`, or `ftp://`, followed by a [valid domain], then zero or
+more non-space non-`<` characters according to
+[extended autolink path validation]:
+
+```````````````````````````````` example autolink
+http://commonmark.org
+
+(Visit https://encrypted.google.com/search?q=Markup+(business))
+
+Anonymous FTP is available at ftp://foo.bar.baz.
+.
+<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>
+````````````````````````````````
+
+
+An [extended email autolink](@) will be recognised when an email address is
+recognised within any text node. Email addresses are recognised according to
+the following rules:
+
+* One ore more characters which are alphanumeric, or `.`, `-`, `_`, or `+`.
+* An `@` symbol.
+* One or more characters which are alphanumeric, or `-` or `_`,
+ separated by periods (`.`).
+ There must be at least one period.
+ The last character must not be one of `-` or `_`.
+
+The scheme `mailto:` will automatically be added to the generated link:
+
+```````````````````````````````` example autolink
+foo@bar.baz
+.
+<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
+````````````````````````````````
+
+`+` can occur before the `@`, but not after.
+
+```````````````````````````````` example autolink
+hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.
+.
+<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example</a> is.</p>
+````````````````````````````````
+
+`.`, `-`, and `_` can occur on both sides of the `@`, but only `.` may occur at
+the end of the email address, in which case it will not be considered part of
+the address:
+
+```````````````````````````````` example autolink
+a.b-c_d@a.b
+
+a.b-c_d@a.b.
+
+a.b-c_d@a.b-
+
+a.b-c_d@a.b_
+.
+<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>
+````````````````````````````````
+
+</div>
+
+## Raw HTML
+
+Text between `<` and `>` that looks like an HTML tag is parsed as a
+raw HTML tag and will be rendered in HTML without escaping.
+Tag and attribute names are not limited to current HTML tags,
+so custom tags (and even, say, DocBook tags) may be used.
+
+Here is the grammar for tags:
+
+A [tag name](@) consists of an ASCII letter
+followed by zero or more ASCII letters, digits, or
+hyphens (`-`).
+
+An [attribute](@) consists of [whitespace],
+an [attribute name], and an optional
+[attribute value specification].
+
+An [attribute name](@)
+consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII
+letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML
+specification restricted to ASCII. HTML5 is laxer.)
+
+An [attribute value specification](@)
+consists of optional [whitespace],
+a `=` character, optional [whitespace], and an [attribute
+value].
+
+An [attribute value](@)
+consists of an [unquoted attribute value],
+a [single-quoted attribute value], or a [double-quoted attribute value].
+
+An [unquoted attribute value](@)
+is a nonempty string of characters not
+including [whitespace], `"`, `'`, `=`, `<`, `>`, or `` ` ``.
+
+A [single-quoted attribute value](@)
+consists of `'`, zero or more
+characters not including `'`, and a final `'`.
+
+A [double-quoted attribute value](@)
+consists of `"`, zero or more
+characters not including `"`, and a final `"`.
+
+An [open tag](@) consists of a `<` character, a [tag name],
+zero or more [attributes], optional [whitespace], an optional `/`
+character, and a `>` character.
+
+A [closing tag](@) consists of the string `</`, a
+[tag name], optional [whitespace], and the character `>`.
+
+An [HTML comment](@) consists of `<!--` + *text* + `-->`,
+where *text* does not start with `>` or `->`, does not end with `-`,
+and does not contain `--`. (See the
+[HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).)
+
+A [processing instruction](@)
+consists of the string `<?`, a string
+of characters not including the string `?>`, and the string
+`?>`.
+
+A [declaration](@) consists of the
+string `<!`, a name consisting of one or more uppercase ASCII letters,
+[whitespace], a string of characters not including the
+character `>`, and the character `>`.
+
+A [CDATA section](@) consists of
+the string `<![CDATA[`, a string of characters not including the string
+`]]>`, and the string `]]>`.
+
+An [HTML tag](@) consists of an [open tag], a [closing tag],
+an [HTML comment], a [processing instruction], a [declaration],
+or a [CDATA section].
+
+Here are some simple open tags:
+
+```````````````````````````````` example
+<a><bab><c2c>
+.
+<p><a><bab><c2c></p>
+````````````````````````````````
+
+
+Empty elements:
+
+```````````````````````````````` example
+<a/><b2/>
+.
+<p><a/><b2/></p>
+````````````````````````````````
+
+
+[Whitespace] is allowed:
+
+```````````````````````````````` example
+<a /><b2
+data="foo" >
+.
+<p><a /><b2
+data="foo" ></p>
+````````````````````````````````
+
+
+With attributes:
+
+```````````````````````````````` example
+<a foo="bar" bam = 'baz <em>"</em>'
+_boolean zoop:33=zoop:33 />
+.
+<p><a foo="bar" bam = 'baz <em>"</em>'
+_boolean zoop:33=zoop:33 /></p>
+````````````````````````````````
+
+
+Custom tag names can be used:
+
+```````````````````````````````` example
+Foo <responsive-image src="foo.jpg" />
+.
+<p>Foo <responsive-image src="foo.jpg" /></p>
+````````````````````````````````
+
+
+Illegal tag names, not parsed as HTML:
+
+```````````````````````````````` example
+<33> <__>
+.
+<p>&lt;33&gt; &lt;__&gt;</p>
+````````````````````````````````
+
+
+Illegal attribute names:
+
+```````````````````````````````` example
+<a h*#ref="hi">
+.
+<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>
+````````````````````````````````
+
+
+Illegal attribute values:
+
+```````````````````````````````` example
+<a href="hi'> <a href=hi'>
+.
+<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>
+````````````````````````````````
+
+
+Illegal [whitespace]:
+
+```````````````````````````````` example
+< a><
+foo><bar/ >
+<foo bar=baz
+bim!bop />
+.
+<p>&lt; a&gt;&lt;
+foo&gt;&lt;bar/ &gt;
+&lt;foo bar=baz
+bim!bop /&gt;</p>
+````````````````````````````````
+
+
+Missing [whitespace]:
+
+```````````````````````````````` example
+<a href='bar'title=title>
+.
+<p>&lt;a href='bar'title=title&gt;</p>
+````````````````````````````````
+
+
+Closing tags:
+
+```````````````````````````````` example
+</a></foo >
+.
+<p></a></foo ></p>
+````````````````````````````````
+
+
+Illegal attributes in closing tag:
+
+```````````````````````````````` example
+</a href="foo">
+.
+<p>&lt;/a href=&quot;foo&quot;&gt;</p>
+````````````````````````````````
+
+
+Comments:
+
+```````````````````````````````` example
+foo <!-- this is a
+comment - with hyphen -->
+.
+<p>foo <!-- this is a
+comment - with hyphen --></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo <!-- not a comment -- two hyphens -->
+.
+<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
+````````````````````````````````
+
+
+Not comments:
+
+```````````````````````````````` example
+foo <!--> foo -->
+
+foo <!-- foo--->
+.
+<p>foo &lt;!--&gt; foo --&gt;</p>
+<p>foo &lt;!-- foo---&gt;</p>
+````````````````````````````````
+
+
+Processing instructions:
+
+```````````````````````````````` example
+foo <?php echo $a; ?>
+.
+<p>foo <?php echo $a; ?></p>
+````````````````````````````````
+
+
+Declarations:
+
+```````````````````````````````` example
+foo <!ELEMENT br EMPTY>
+.
+<p>foo <!ELEMENT br EMPTY></p>
+````````````````````````````````
+
+
+CDATA sections:
+
+```````````````````````````````` example
+foo <![CDATA[>&<]]>
+.
+<p>foo <![CDATA[>&<]]></p>
+````````````````````````````````
+
+
+Entity and numeric character references are preserved in HTML
+attributes:
+
+```````````````````````````````` example
+foo <a href="&ouml;">
+.
+<p>foo <a href="&ouml;"></p>
+````````````````````````````````
+
+
+Backslash escapes do not work in HTML attributes:
+
+```````````````````````````````` example
+foo <a href="\*">
+.
+<p>foo <a href="\*"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="\"">
+.
+<p>&lt;a href=&quot;&quot;&quot;&gt;</p>
+````````````````````````````````
+
+
+<div class="extension">
+
+## Disallowed Raw HTML (extension)
+
+GFM enables the `tagfilter` extension, where the following HTML tags will be
+filtered when rendering HTML output:
+
+* `<title>`
+* `<textarea>`
+* `<style>`
+* `<xmp>`
+* `<iframe>`
+* `<noembed>`
+* `<noframes>`
+* `<script>`
+* `<plaintext>`
+
+Filtering is done by replacing the leading `<` with the entity `&lt;`. These
+tags are chosen in particular as they change how HTML is interpreted in a way
+unique to them (i.e. nested HTML is interpreted differently), and this is
+usually undesireable in the context of other rendered Markdown content.
+
+All other HTML tags are left untouched.
+
+```````````````````````````````` example tagfilter
+<strong> <title> <style> <em>
+
+<blockquote>
+ <xmp> is disallowed. <XMP> is also disallowed.
+</blockquote>
+.
+<p><strong> &lt;title> &lt;style> <em></p>
+<blockquote>
+ &lt;xmp> is disallowed. &lt;XMP> is also disallowed.
+</blockquote>
+````````````````````````````````
+
+</div>
+
+## Hard line breaks
+
+A line break (not in a code span or HTML tag) that is preceded
+by two or more spaces and does not occur at the end of a block
+is parsed as a [hard line break](@) (rendered
+in HTML as a `<br />` tag):
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+For a more visible alternative, a backslash before the
+[line ending] may be used instead of two spaces:
+
+```````````````````````````````` example
+foo\
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+More than two spaces can be used:
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo<br />
+baz</p>
+````````````````````````````````
+
+
+Leading spaces at the beginning of the next line are ignored:
+
+```````````````````````````````` example
+foo
+ bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo\
+ bar
+.
+<p>foo<br />
+bar</p>
+````````````````````````````````
+
+
+Line breaks can occur inside emphasis, links, and other constructs
+that allow inline content:
+
+```````````````````````````````` example
+*foo
+bar*
+.
+<p><em>foo<br />
+bar</em></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+*foo\
+bar*
+.
+<p><em>foo<br />
+bar</em></p>
+````````````````````````````````
+
+
+Line breaks do not occur inside code spans
+
+```````````````````````````````` example
+`code
+span`
+.
+<p><code>code span</code></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+`code\
+span`
+.
+<p><code>code\ span</code></p>
+````````````````````````````````
+
+
+or HTML tags:
+
+```````````````````````````````` example
+<a href="foo
+bar">
+.
+<p><a href="foo
+bar"></p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+<a href="foo\
+bar">
+.
+<p><a href="foo\
+bar"></p>
+````````````````````````````````
+
+
+Hard line breaks are for separating inline content within a block.
+Neither syntax for hard line breaks works at the end of a paragraph or
+other block element:
+
+```````````````````````````````` example
+foo\
+.
+<p>foo\</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+foo
+.
+<p>foo</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo\
+.
+<h3>foo\</h3>
+````````````````````````````````
+
+
+```````````````````````````````` example
+### foo
+.
+<h3>foo</h3>
+````````````````````````````````
+
+
+## Soft line breaks
+
+A regular line break (not in a code span or HTML tag) that is not
+preceded by two or more spaces or a backslash is parsed as a
+[softbreak](@). (A softbreak may be rendered in HTML either as a
+[line ending] or as a space. The result will be the same in
+browsers. In the examples here, a [line ending] will be used.)
+
+```````````````````````````````` example
+foo
+baz
+.
+<p>foo
+baz</p>
+````````````````````````````````
+
+
+Spaces at the end of the line and beginning of the next line are
+removed:
+
+```````````````````````````````` example
+foo
+ baz
+.
+<p>foo
+baz</p>
+````````````````````````````````
+
+
+A conforming parser may render a soft line break in HTML either as a
+line break or as a space.
+
+A renderer may also provide an option to render soft line breaks
+as hard line breaks.
+
+## Textual content
+
+Any characters not given an interpretation by the above rules will
+be parsed as plain textual content.
+
+```````````````````````````````` example
+hello $.;'there
+.
+<p>hello $.;'there</p>
+````````````````````````````````
+
+
+```````````````````````````````` example
+Foo χÏῆν
+.
+<p>Foo χÏῆν</p>
+````````````````````````````````
+
+
+Internal spaces are preserved verbatim:
+
+```````````````````````````````` example
+Multiple spaces
+.
+<p>Multiple spaces</p>
+````````````````````````````````
+
+
+# First GitLab-Specific Section with Examples
+
+## Strong but with two asterisks
+
+```````````````````````````````` example
+**bold**
+.
+<p><strong>bold</strong></p>
+````````````````````````````````
+
+# Second GitLab-Specific Section with Examples
+
+## Strong but with HTML
+
+```````````````````````````````` example
+<strong>
+bold
+</strong>
+.
+<p><strong>
+bold
+</strong></p>
+````````````````````````````````
+
+<!-- END TESTS -->
+
+# Appendix: A parsing strategy
+
+In this appendix we describe some features of the parsing strategy
+used in the CommonMark reference implementations.
+
+## Overview
+
+Parsing has two phases:
+
+1. In the first phase, lines of input are consumed and the block
+structure of the document---its division into paragraphs, block quotes,
+list items, and so on---is constructed. Text is assigned to these
+blocks but not parsed. Link reference definitions are parsed and a
+map of links is constructed.
+
+2. In the second phase, the raw text contents of paragraphs and headings
+are parsed into sequences of Markdown inline elements (strings,
+code spans, links, emphasis, and so on), using the map of link
+references constructed in phase 1.
+
+At each point in processing, the document is represented as a tree of
+**blocks**. The root of the tree is a `document` block. The `document`
+may have any number of other blocks as **children**. These children
+may, in turn, have other blocks as children. The last child of a block
+is normally considered **open**, meaning that subsequent lines of input
+can alter its contents. (Blocks that are not open are **closed**.)
+Here, for example, is a possible document tree, with the open blocks
+marked by arrows:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 1: block structure
+
+Each line that is processed has an effect on this tree. The line is
+analyzed and, depending on its contents, the document may be altered
+in one or more of the following ways:
+
+1. One or more open blocks may be closed.
+2. One or more new blocks may be created as children of the
+ last open block.
+3. Text may be added to the last (deepest) open block remaining
+ on the tree.
+
+Once a line has been incorporated into the tree in this way,
+it can be discarded, so input can be read in a stream.
+
+For each line, we follow this procedure:
+
+1. First we iterate through the open blocks, starting with the
+root document, and descending through last children down to the last
+open block. Each block imposes a condition that the line must satisfy
+if the block is to remain open. For example, a block quote requires a
+`>` character. A paragraph requires a non-blank line.
+In this phase we may match all or just some of the open
+blocks. But we cannot close unmatched blocks yet, because we may have a
+[lazy continuation line].
+
+2. Next, after consuming the continuation markers for existing
+blocks, we look for new block starts (e.g. `>` for a block quote).
+If we encounter a new block start, we close any blocks unmatched
+in step 1 before creating the new block as a child of the last
+matched block.
+
+3. Finally, we look at the remainder of the line (after block
+markers like `>`, list markers, and indentation have been consumed).
+This is text that can be incorporated into the last open
+block (a paragraph, code block, heading, or raw HTML).
+
+Setext headings are formed when we see a line of a paragraph
+that is a [setext heading underline].
+
+Reference link definitions are detected when a paragraph is closed;
+the accumulated text lines are parsed to see if they begin with
+one or more reference link definitions. Any remainder becomes a
+normal paragraph.
+
+We can see how this works by considering how the tree above is
+generated by four lines of Markdown:
+
+``` markdown
+> Lorem ipsum dolor
+sit amet.
+> - Qui *quodsi iracundia*
+> - aliquando id
+```
+
+At the outset, our document model is just
+
+``` tree
+-> document
+```
+
+The first line of our text,
+
+``` markdown
+> Lorem ipsum dolor
+```
+
+causes a `block_quote` block to be created as a child of our
+open `document` block, and a `paragraph` block as a child of
+the `block_quote`. Then the text is added to the last open
+block, the `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor"
+```
+
+The next line,
+
+``` markdown
+sit amet.
+```
+
+is a "lazy continuation" of the open `paragraph`, so it gets added
+to the paragraph's text:
+
+``` tree
+-> document
+ -> block_quote
+ -> paragraph
+ "Lorem ipsum dolor\nsit amet."
+```
+
+The third line,
+
+``` markdown
+> - Qui *quodsi iracundia*
+```
+
+causes the `paragraph` block to be closed, and a new `list` block
+opened as a child of the `block_quote`. A `list_item` is also
+added as a child of the `list`, and a `paragraph` as a child of
+the `list_item`. The text is then added to the new `paragraph`:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ -> list_item
+ -> paragraph
+ "Qui *quodsi iracundia*"
+```
+
+The fourth line,
+
+``` markdown
+> - aliquando id
+```
+
+causes the `list_item` (and its child the `paragraph`) to be closed,
+and a new `list_item` opened up as child of the `list`. A `paragraph`
+is added as a child of the new `list_item`, to contain the text.
+We thus obtain the final tree:
+
+``` tree
+-> document
+ -> block_quote
+ paragraph
+ "Lorem ipsum dolor\nsit amet."
+ -> list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ "Qui *quodsi iracundia*"
+ -> list_item
+ -> paragraph
+ "aliquando id"
+```
+
+## Phase 2: inline structure
+
+Once all of the input has been parsed, all open blocks are closed.
+
+We then "walk the tree," visiting every node, and parse raw
+string contents of paragraphs and headings as inlines. At this
+point we have seen all the link reference definitions, so we can
+resolve reference links as we go.
+
+``` tree
+document
+ block_quote
+ paragraph
+ str "Lorem ipsum dolor"
+ softbreak
+ str "sit amet."
+ list (type=bullet tight=true bullet_char=-)
+ list_item
+ paragraph
+ str "Qui "
+ emph
+ str "quodsi iracundia"
+ list_item
+ paragraph
+ str "aliquando id"
+```
+
+Notice how the [line ending] in the first paragraph has
+been parsed as a `softbreak`, and the asterisks in the first list item
+have become an `emph`.
+
+### An algorithm for parsing nested emphasis and links
+
+By far the trickiest part of inline parsing is handling emphasis,
+strong emphasis, links, and images. This is done using the following
+algorithm.
+
+When we're parsing inlines and we hit either
+
+- a run of `*` or `_` characters, or
+- a `[` or `![`
+
+we insert a text node with these symbols as its literal content, and we
+add a pointer to this text node to the [delimiter stack](@).
+
+The [delimiter stack] is a doubly linked list. Each
+element contains a pointer to a text node, plus information about
+
+- the type of delimiter (`[`, `![`, `*`, `_`)
+- the number of delimiters,
+- whether the delimiter is "active" (all are active to start), and
+- whether the delimiter is a potential opener, a potential closer,
+ or both (which depends on what sort of characters precede
+ and follow the delimiters).
+
+When we hit a `]` character, we call the *look for link or image*
+procedure (see below).
+
+When we hit the end of the input, we call the *process emphasis*
+procedure (see below), with `stack_bottom` = NULL.
+
+#### *look for link or image*
+
+Starting at the top of the delimiter stack, we look backwards
+through the stack for an opening `[` or `![` delimiter.
+
+- If we don't find one, we return a literal text node `]`.
+
+- If we do find one, but it's not *active*, we remove the inactive
+ delimiter from the stack, and return a literal text node `]`.
+
+- If we find one and it's active, then we parse ahead to see if
+ we have an inline link/image, reference link/image, compact reference
+ link/image, or shortcut reference link/image.
+
+ + If we don't, then we remove the opening delimiter from the
+ delimiter stack and return a literal text node `]`.
+
+ + If we do, then
+
+ * We return a link or image node whose children are the inlines
+ after the text node pointed to by the opening delimiter.
+
+ * We run *process emphasis* on these inlines, with the `[` opener
+ as `stack_bottom`.
+
+ * We remove the opening delimiter.
+
+ * If we have a link (and not an image), we also set all
+ `[` delimiters before the opening delimiter to *inactive*. (This
+ will prevent us from getting links within links.)
+
+#### *process emphasis*
+
+Parameter `stack_bottom` sets a lower bound to how far we
+descend in the [delimiter stack]. If it is NULL, we can
+go all the way to the bottom. Otherwise, we stop before
+visiting `stack_bottom`.
+
+Let `current_position` point to the element on the [delimiter stack]
+just above `stack_bottom` (or the first element if `stack_bottom`
+is NULL).
+
+We keep track of the `openers_bottom` for each delimiter
+type (`*`, `_`) and each length of the closing delimiter run
+(modulo 3). Initialize this to `stack_bottom`.
+
+Then we repeat the following until we run out of potential
+closers:
+
+- Move `current_position` forward in the delimiter stack (if needed)
+ until we find the first potential closer with delimiter `*` or `_`.
+ (This will be the potential closer closest
+ to the beginning of the input -- the first one in parse order.)
+
+- Now, look back in the stack (staying above `stack_bottom` and
+ the `openers_bottom` for this delimiter type) for the
+ first matching potential opener ("matching" means same delimiter).
+
+- If one is found:
+
+ + Figure out whether we have emphasis or strong emphasis:
+ if both closer and opener spans have length >= 2, we have
+ strong, otherwise regular.
+
+ + Insert an emph or strong emph node accordingly, after
+ the text node corresponding to the opener.
+
+ + Remove any delimiters between the opener and closer from
+ the delimiter stack.
+
+ + Remove 1 (for regular emph) or 2 (for strong emph) delimiters
+ from the opening and closing text nodes. If they become empty
+ as a result, remove them and remove the corresponding element
+ of the delimiter stack. If the closing node is removed, reset
+ `current_position` to the next element in the stack.
+
+- If none is found:
+
+ + Set `openers_bottom` to the element before `current_position`.
+ (We know that there are no openers for this kind of closer up to and
+ including this point, so this puts a lower bound on future searches.)
+
+ + If the closer at `current_position` is not a potential opener,
+ remove it from the delimiter stack (since we know it can't
+ be a closer either).
+
+ + Advance `current_position` to the next element in the stack.
+
+After we're done, we remove all delimiters above `stack_bottom` from the
+delimiter stack.
+
diff --git a/haml_lint/inline_javascript.rb b/haml_lint/inline_javascript.rb
deleted file mode 100644
index c87d77d7a4b..00000000000
--- a/haml_lint/inline_javascript.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-unless Rails.env.production?
- require 'haml_lint/haml_visitor'
- require 'haml_lint/linter'
- require 'haml_lint/linter_registry'
-
- module HamlLint
- class Linter::InlineJavaScript < Linter
- include ::HamlLint::LinterRegistry
-
- def visit_filter(node)
- return unless node.filter_type == 'javascript'
-
- record_lint(node, 'Inline JavaScript is discouraged (https://docs.gitlab.com/ee/development/gotchas.html#do-not-use-inline-javascript-in-views)')
- end
-
- def visit_tag(node)
- return unless node.tag_name == 'script'
-
- record_lint(node, 'Inline JavaScript is discouraged (https://docs.gitlab.com/ee/development/gotchas.html#do-not-use-inline-javascript-in-views)')
- end
- end
- end
-end
diff --git a/haml_lint/linter/inline_javascript.rb b/haml_lint/linter/inline_javascript.rb
new file mode 100644
index 00000000000..f7672c98347
--- /dev/null
+++ b/haml_lint/linter/inline_javascript.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module HamlLint
+ class Linter
+ class InlineJavaScript < Linter
+ include ::HamlLint::LinterRegistry
+
+ MSG = 'Inline JavaScript is discouraged (https://docs.gitlab.com/ee/development/gotchas.html#do-not-use-inline-javascript-in-views)'
+
+ def visit_filter(node)
+ return unless node.filter_type == 'javascript'
+
+ record_lint(node, MSG)
+ end
+
+ def visit_tag(node)
+ return unless node.tag_name == 'script'
+
+ record_lint(node, MSG)
+ end
+ end
+ end
+end
diff --git a/lefthook.yml b/lefthook.yml
index e79df94c708..ff57725dac6 100644
--- a/lefthook.yml
+++ b/lefthook.yml
@@ -12,7 +12,7 @@ pre-push:
tags: view haml style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: '*.html.haml'
- run: bundle exec haml-lint --config .haml-lint.yml {files}
+ run: REVEAL_RUBOCOP_TODO=0 bundle exec haml-lint --config .haml-lint.yml {files}
markdownlint:
tags: documentation style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
@@ -31,14 +31,14 @@ pre-push:
rubocop:
tags: backend style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
- glob: '*.rb'
+ glob: '*.{rb,rake}'
run: REVEAL_RUBOCOP_TODO=0 bundle exec rubocop --parallel --force-exclusion {files}
graphql_docs:
tags: documentation
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: '{app/graphql/**/*.rb,ee/app/graphql/**/*.rb}'
run: bundle exec rake gitlab:graphql:check_docs
- vale: # Requires Vale: https://docs.gitlab.com/ee/development/documentation/#install-linters
+ vale: # Requires Vale: https://docs.gitlab.com/ee/development/documentation/testing.html#install-linters
tags: documentation style
files: git diff --name-only --diff-filter=d $(git merge-base origin/master HEAD)..HEAD
glob: 'doc/*.md'
diff --git a/lib/api/admin/instance_clusters.rb b/lib/api/admin/instance_clusters.rb
index d6c212a9886..7163225777a 100644
--- a/lib/api/admin/instance_clusters.rb
+++ b/lib/api/admin/instance_clusters.rb
@@ -6,6 +6,7 @@ module API
include PaginationParams
feature_category :kubernetes_management
+ urgency :low
before do
authenticated_as_admin!
@@ -136,7 +137,7 @@ module API
end
def ensure_feature_enabled!
- not_found! unless Feature.enabled?(:certificate_based_clusters, clusterable_instance, default_enabled: :yaml, type: :ops)
+ not_found! unless clusterable_instance.certificate_based_clusters_enabled?
end
end
end
diff --git a/lib/api/admin/plan_limits.rb b/lib/api/admin/plan_limits.rb
index 99be30809d2..7ce70d85d46 100644
--- a/lib/api/admin/plan_limits.rb
+++ b/lib/api/admin/plan_limits.rb
@@ -35,6 +35,14 @@ module API
params do
requires :plan_name, type: String, values: Plan.all_plans, desc: 'Name of the plan'
+ optional :ci_pipeline_size, type: Integer, desc: 'Maximum number of jobs in a single pipeline'
+ optional :ci_active_jobs, type: Integer, desc: 'Total number of jobs in currently active pipelines'
+ optional :ci_active_pipelines, type: Integer, desc: 'Maximum number of active pipelines per project'
+ optional :ci_project_subscriptions, type: Integer, desc: 'Maximum number of pipeline subscriptions to and from a project'
+ optional :ci_pipeline_schedules, type: Integer, desc: 'Maximum number of pipeline schedules'
+ optional :ci_needs_size_limit, type: Integer, desc: 'Maximum number of DAG dependencies that a job can have'
+ optional :ci_registered_group_runners, type: Integer, desc: 'Maximum number of runners registered per group'
+ optional :ci_registered_project_runners, type: Integer, desc: 'Maximum number of runners registered per project'
optional :conan_max_file_size, type: Integer, desc: 'Maximum Conan package file size in bytes'
optional :generic_packages_max_file_size, type: Integer, desc: 'Maximum generic package file size in bytes'
optional :helm_max_file_size, type: Integer, desc: 'Maximum Helm chart file size in bytes'
@@ -43,6 +51,7 @@ module API
optional :nuget_max_file_size, type: Integer, desc: 'Maximum NuGet package file size in bytes'
optional :pypi_max_file_size, type: Integer, desc: 'Maximum PyPI package file size in bytes'
optional :terraform_module_max_file_size, type: Integer, desc: 'Maximum Terraform Module package file size in bytes'
+ optional :storage_size_limit, type: Integer, desc: 'Maximum storage size for the root namespace in megabytes'
end
put "application/plan_limits" do
params = declared_params(include_missing: false)
diff --git a/lib/api/alert_management_alerts.rb b/lib/api/alert_management_alerts.rb
index 88230c86247..bbb7e7280c9 100644
--- a/lib/api/alert_management_alerts.rb
+++ b/lib/api/alert_management_alerts.rb
@@ -3,6 +3,7 @@
module API
class AlertManagementAlerts < ::API::Base
feature_category :incident_management
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
@@ -83,8 +84,6 @@ module API
authorize!(:update_alert_management_metric_image, alert)
- render_api_error!('Feature not available', 403) unless alert.metric_images_available?
-
metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
render_api_error!('Metric image not found', 404) unless metric_image
@@ -107,8 +106,6 @@ module API
authorize!(:destroy_alert_management_metric_image, alert)
- render_api_error!('Feature not available', 403) unless alert.metric_images_available?
-
metric_image = alert.metric_images.find_by_id(params[:metric_image_id])
render_api_error!('Metric image not found', 404) unless metric_image
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 4dca47efdf2..0d74bc841b1 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -175,8 +175,8 @@ module API
mount ::API::BulkImports
mount ::API::Ci::JobArtifacts
mount ::API::Ci::Jobs
- mount ::API::Ci::Pipelines
mount ::API::Ci::PipelineSchedules
+ mount ::API::Ci::Pipelines
mount ::API::Ci::ResourceGroups
mount ::API::Ci::Runner
mount ::API::Ci::Runners
@@ -184,14 +184,21 @@ module API
mount ::API::Ci::Triggers
mount ::API::Ci::Variables
mount ::API::Clusters::Agents
- mount ::API::Commits
+ mount ::API::Clusters::AgentTokens
mount ::API::CommitStatuses
+ mount ::API::Commits
+ mount ::API::ComposerPackages
+ mount ::API::ConanInstancePackages
+ mount ::API::ConanProjectPackages
mount ::API::ContainerRegistryEvent
mount ::API::ContainerRepositories
+ mount ::API::DebianGroupPackages
+ mount ::API::DebianProjectPackages
mount ::API::DependencyProxy
mount ::API::DeployKeys
mount ::API::DeployTokens
mount ::API::Deployments
+ mount ::API::Discussions
mount ::API::Environments
mount ::API::ErrorTracking::ClientKeys
mount ::API::ErrorTracking::Collector
@@ -202,87 +209,79 @@ module API
mount ::API::Features
mount ::API::Files
mount ::API::FreezePeriods
+ mount ::API::GenericPackages
mount ::API::Geo
+ mount ::API::GoProxy
mount ::API::GroupAvatar
mount ::API::GroupBoards
mount ::API::GroupClusters
+ mount ::API::GroupContainerRepositories
+ mount ::API::GroupDebianDistributions
mount ::API::GroupExport
mount ::API::GroupImport
mount ::API::GroupLabels
mount ::API::GroupMilestones
- mount ::API::Groups
- mount ::API::GroupContainerRepositories
- mount ::API::GroupDebianDistributions
+ mount ::API::GroupPackages
mount ::API::GroupVariables
+ mount ::API::Groups
+ mount ::API::HelmPackages
mount ::API::ImportBitbucketServer
mount ::API::ImportGithub
- mount ::API::IssueLinks
+ mount ::API::Integrations
+ mount ::API::Integrations::JiraConnect::Subscriptions
mount ::API::Invitations
+ mount ::API::IssueLinks
mount ::API::Issues
mount ::API::Keys
mount ::API::Labels
mount ::API::Lint
mount ::API::Markdown
+ mount ::API::MavenPackages
mount ::API::Members
+ mount ::API::MergeRequestApprovals
mount ::API::MergeRequestDiffs
mount ::API::MergeRequests
- mount ::API::MergeRequestApprovals
mount ::API::Metrics::Dashboard::Annotations
mount ::API::Metrics::UserStarredDashboards
mount ::API::Namespaces
mount ::API::Notes
- mount ::API::Discussions
- mount ::API::ResourceLabelEvents
- mount ::API::ResourceMilestoneEvents
- mount ::API::ResourceStateEvents
mount ::API::NotificationSettings
- mount ::API::ProjectPackages
- mount ::API::GroupPackages
- mount ::API::PackageFiles
- mount ::API::NugetProjectPackages
- mount ::API::NugetGroupPackages
- mount ::API::PypiPackages
- mount ::API::ComposerPackages
- mount ::API::ConanProjectPackages
- mount ::API::ConanInstancePackages
- mount ::API::DebianGroupPackages
- mount ::API::DebianProjectPackages
- mount ::API::MavenPackages
- mount ::API::NpmProjectPackages
mount ::API::NpmInstancePackages
- mount ::API::GenericPackages
- mount ::API::GoProxy
- mount ::API::HelmPackages
+ mount ::API::NpmProjectPackages
+ mount ::API::NugetGroupPackages
+ mount ::API::NugetProjectPackages
+ mount ::API::PackageFiles
mount ::API::Pages
mount ::API::PagesDomains
+ mount ::API::PersonalAccessTokens
mount ::API::ProjectClusters
mount ::API::ProjectContainerRepositories
mount ::API::ProjectDebianDistributions
mount ::API::ProjectEvents
mount ::API::ProjectExport
- mount ::API::ProjectImport
mount ::API::ProjectHooks
+ mount ::API::ProjectImport
mount ::API::ProjectMilestones
+ mount ::API::ProjectPackages
mount ::API::ProjectRepositoryStorageMoves
- mount ::API::Projects
mount ::API::ProjectSnapshots
mount ::API::ProjectSnippets
mount ::API::ProjectStatistics
mount ::API::ProjectTemplates
- mount ::API::Terraform::State
- mount ::API::Terraform::StateVersion
- mount ::API::Terraform::Modules::V1::Packages
- mount ::API::PersonalAccessTokens
+ mount ::API::Projects
mount ::API::ProtectedBranches
mount ::API::ProtectedTags
- mount ::API::Releases
+ mount ::API::PypiPackages
mount ::API::Release::Links
+ mount ::API::Releases
mount ::API::RemoteMirrors
mount ::API::Repositories
mount ::API::ResourceAccessTokens
+ mount ::API::ResourceLabelEvents
+ mount ::API::ResourceMilestoneEvents
+ mount ::API::ResourceStateEvents
mount ::API::RubygemPackages
mount ::API::Search
- mount ::API::Integrations
mount ::API::Settings
mount ::API::SidekiqMetrics
mount ::API::SnippetRepositoryStorageMoves
@@ -294,12 +293,15 @@ module API
mount ::API::SystemHooks
mount ::API::Tags
mount ::API::Templates
+ mount ::API::Terraform::Modules::V1::Packages
+ mount ::API::Terraform::State
+ mount ::API::Terraform::StateVersion
mount ::API::Todos
mount ::API::Topics
mount ::API::Unleash
mount ::API::UsageData
- mount ::API::UsageDataQueries
mount ::API::UsageDataNonSqlMetrics
+ mount ::API::UsageDataQueries
mount ::API::UserCounts
mount ::API::Users
mount ::API::Version
diff --git a/lib/api/avatar.rb b/lib/api/avatar.rb
index a42d89ddf83..bd9fb37e18b 100644
--- a/lib/api/avatar.rb
+++ b/lib/api/avatar.rb
@@ -3,6 +3,7 @@
module API
class Avatar < ::API::Base
feature_category :users
+ urgency :high
resource :avatar do
desc 'Return avatar url for a user' do
diff --git a/lib/api/badges.rb b/lib/api/badges.rb
index d7c850c2f40..68095fb2975 100644
--- a/lib/api/badges.rb
+++ b/lib/api/badges.rb
@@ -32,7 +32,7 @@ module API
params do
use :pagination
end
- get ":id/badges" do
+ get ":id/badges", urgency: :default do
source = find_source(source_type, params[:id])
badges = source.badges
@@ -72,7 +72,10 @@ module API
params do
requires :badge_id, type: Integer, desc: 'The badge ID'
end
- get ":id/badges/:badge_id" do
+ # TODO: Set PUT /projects/:id/badges/:badge_id to low urgency and GET to default urgency
+ # after different urgencies are supported for different HTTP verbs.
+ # See https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1670
+ get ":id/badges/:badge_id", urgency: :low do
source = find_source(source_type, params[:id])
badge = find_badge(source)
@@ -88,7 +91,7 @@ module API
requires :image_url, type: String, desc: 'URL of the badge image'
optional :name, type: String, desc: 'Name for the badge'
end
- post ":id/badges" do
+ post ":id/badges", urgency: :default do
source = find_source_if_admin(source_type)
badge = ::Badges::CreateService.new(declared_params(include_missing: false)).execute(source)
diff --git a/lib/api/boards.rb b/lib/api/boards.rb
index 56633c07774..6e3005ce676 100644
--- a/lib/api/boards.rb
+++ b/lib/api/boards.rb
@@ -8,6 +8,7 @@ module API
prepend_mod_with('API::BoardsResponses') # rubocop: disable Cop/InjectEnterpriseEditionModule
feature_category :team_planning
+ urgency :low
before { authenticate! }
diff --git a/lib/api/branches.rb b/lib/api/branches.rb
index a2c9020ac84..b8444351029 100644
--- a/lib/api/branches.rb
+++ b/lib/api/branches.rb
@@ -52,7 +52,7 @@ module API
merged_branch_names = repository.merged_branch_names(branches.map(&:name))
- if Feature.enabled?(:api_caching_branches, user_project, type: :development, default_enabled: :yaml)
+ if Feature.enabled?(:api_caching_branches, user_project, type: :development)
present_cached(
branches,
with: Entities::Branch,
diff --git a/lib/api/bulk_imports.rb b/lib/api/bulk_imports.rb
index 53967e0af5d..766e05eca23 100644
--- a/lib/api/bulk_imports.rb
+++ b/lib/api/bulk_imports.rb
@@ -5,6 +5,7 @@ module API
include PaginationParams
feature_category :importers
+ urgency :low
helpers do
def bulk_imports
diff --git a/lib/api/ci/helpers/runner.rb b/lib/api/ci/helpers/runner.rb
index 173cfc9a59a..72e36d95dc5 100644
--- a/lib/api/ci/helpers/runner.rb
+++ b/lib/api/ci/helpers/runner.rb
@@ -53,7 +53,7 @@ module API
# https://gitlab.com/gitlab-org/gitlab/-/issues/327703
forbidden! unless job
- forbidden! unless job_token_valid?(job)
+ forbidden! unless job.valid_token?(job_token)
forbidden!('Project has been deleted!') if job.project.nil? || job.project.pending_delete?
forbidden!('Job has been erased!') if job.erased?
@@ -77,6 +77,12 @@ module API
job
end
+ def authenticate_job_via_dependent_job!
+ forbidden! unless current_authenticated_job
+ forbidden! unless current_job
+ forbidden! unless can?(current_authenticated_job.user, :read_build, current_job)
+ end
+
def current_job
id = params[:id]
@@ -91,9 +97,28 @@ module API
end
end
- def job_token_valid?(job)
- token = (params[JOB_TOKEN_PARAM] || env[JOB_TOKEN_HEADER]).to_s
- token && job.valid_token?(token)
+ # TODO: Replace this with `#current_authenticated_job from API::Helpers`
+ # after the feature flag `ci_authenticate_running_job_token_for_artifacts`
+ # is removed.
+ #
+ # For the time being, this needs to be overridden because the API
+ # GET api/v4/jobs/:id/artifacts
+ # needs to allow requests using token whose job is not running.
+ #
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83713#note_942368526
+ def current_authenticated_job
+ strong_memoize(:current_authenticated_job) do
+ ::Ci::AuthJobFinder.new(token: job_token).execute
+ end
+ end
+
+ # The token used by runner to authenticate a request.
+ # In most cases, the runner uses the token belonging to the requested job.
+ # However, when requesting for job artifacts, the runner would use
+ # the token that belongs to downstream jobs that depend on the job that owns
+ # the artifacts.
+ def job_token
+ @job_token ||= (params[JOB_TOKEN_PARAM] || env[JOB_TOKEN_HEADER]).to_s
end
def job_forbidden!(job, reason)
@@ -111,11 +136,19 @@ module API
# noop: overridden in EE
end
+ def log_artifact_size(artifact)
+ Gitlab::ApplicationContext.push(artifact: artifact)
+ end
+
private
def get_runner_config_from_request
{ config: attributes_for_keys(%w(gpus), params.dig('info', 'config')) }
end
+
+ def request_using_running_job_token?
+ current_job.present? && current_authenticated_job.present? && current_job != current_authenticated_job
+ end
end
end
end
diff --git a/lib/api/ci/jobs.rb b/lib/api/ci/jobs.rb
index 86897eb61ae..04999b5fb44 100644
--- a/lib/api/ci/jobs.rb
+++ b/lib/api/ci/jobs.rb
@@ -190,7 +190,7 @@ module API
detail 'Retrieves a list of agents for the given job token'
end
route_setting :authentication, job_token_allowed: true
- get '/allowed_agents', feature_category: :kubernetes_management do
+ get '/allowed_agents', urgency: :low, feature_category: :kubernetes_management do
validate_current_authenticated_job
status 200
diff --git a/lib/api/ci/pipeline_schedules.rb b/lib/api/ci/pipeline_schedules.rb
index 6030fe86f00..4b522f37524 100644
--- a/lib/api/ci/pipeline_schedules.rb
+++ b/lib/api/ci/pipeline_schedules.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :continuous_integration
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/ci/pipelines.rb b/lib/api/ci/pipelines.rb
index 8d2c58dabdf..4253a9eb4d7 100644
--- a/lib/api/ci/pipelines.rb
+++ b/lib/api/ci/pipelines.rb
@@ -51,7 +51,7 @@ module API
desc: 'Sort pipelines'
optional :source, type: String, values: ::Ci::Pipeline.sources.keys
end
- get ':id/pipelines', feature_category: :continuous_integration do
+ get ':id/pipelines', urgency: :low, feature_category: :continuous_integration do
authorize! :read_pipeline, user_project
authorize! :read_build, user_project
@@ -67,7 +67,7 @@ module API
requires :ref, type: String, desc: 'Reference'
optional :variables, Array, desc: 'Array of variables available in the pipeline'
end
- post ':id/pipeline', feature_category: :continuous_integration do
+ post ':id/pipeline', urgency: :low, feature_category: :continuous_integration do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20711')
authorize! :create_pipeline, user_project
@@ -94,7 +94,7 @@ module API
params do
optional :ref, type: String, desc: 'branch ref of pipeline'
end
- get ':id/pipelines/latest', feature_category: :continuous_integration do
+ get ':id/pipelines/latest', urgency: :low, feature_category: :continuous_integration do
authorize! :read_pipeline, latest_pipeline
present latest_pipeline, with: Entities::Ci::Pipeline
@@ -107,7 +107,7 @@ module API
params do
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
end
- get ':id/pipelines/:pipeline_id', feature_category: :continuous_integration do
+ get ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
authorize! :read_pipeline, pipeline
present pipeline, with: Entities::Ci::Pipeline
@@ -205,7 +205,7 @@ module API
params do
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
end
- delete ':id/pipelines/:pipeline_id', feature_category: :continuous_integration do
+ delete ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
authorize! :destroy_pipeline, pipeline
destroy_conditionally!(pipeline) do
@@ -220,7 +220,7 @@ module API
params do
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
end
- post ':id/pipelines/:pipeline_id/retry', feature_category: :continuous_integration do
+ post ':id/pipelines/:pipeline_id/retry', urgency: :low, feature_category: :continuous_integration do
authorize! :update_pipeline, pipeline
response = pipeline.retry_failed(current_user)
@@ -239,7 +239,7 @@ module API
params do
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
end
- post ':id/pipelines/:pipeline_id/cancel', feature_category: :continuous_integration do
+ post ':id/pipelines/:pipeline_id/cancel', urgency: :low, feature_category: :continuous_integration do
authorize! :update_pipeline, pipeline
pipeline.cancel_running
diff --git a/lib/api/ci/resource_groups.rb b/lib/api/ci/resource_groups.rb
index 616bec499d4..e3fd887475a 100644
--- a/lib/api/ci/resource_groups.rb
+++ b/lib/api/ci/resource_groups.rb
@@ -3,14 +3,29 @@
module API
module Ci
class ResourceGroups < ::API::Base
+ include PaginationParams
+
before { authenticate! }
feature_category :continuous_delivery
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ desc 'Get all resource groups for this project' do
+ success Entities::Ci::ResourceGroup
+ end
+ params do
+ use :pagination
+ end
+ get ':id/resource_groups' do
+ authorize! :read_resource_group, user_project
+
+ present paginate(user_project.resource_groups), with: Entities::Ci::ResourceGroup
+ end
+
desc 'Get a single resource group' do
success Entities::Ci::ResourceGroup
end
diff --git a/lib/api/ci/runner.rb b/lib/api/ci/runner.rb
index 0e3b295396b..4381309fb9e 100644
--- a/lib/api/ci/runner.rb
+++ b/lib/api/ci/runner.rb
@@ -29,7 +29,7 @@ module API
mutually_exclusive :maintainer_note, :maintainer_note
mutually_exclusive :active, :paused
end
- post '/', feature_category: :runner do
+ post '/', urgency: :low, feature_category: :runner do
attributes = attributes_for_keys(%i[description maintainer_note maintenance_note active paused locked run_untagged tag_list access_level maximum_timeout])
.merge(get_runner_details_from_request)
@@ -54,7 +54,7 @@ module API
params do
requires :token, type: String, desc: %q(Runner's authentication token)
end
- delete '/', feature_category: :runner do
+ delete '/', urgency: :low, feature_category: :runner do
authenticate_runner!
destroy_conditionally!(current_runner) { ::Ci::Runners::UnregisterRunnerService.new(current_runner, params[:token]).execute }
@@ -66,7 +66,7 @@ module API
params do
requires :token, type: String, desc: %q(Runner's authentication token)
end
- post '/verify', feature_category: :runner do
+ post '/verify', urgency: :low, feature_category: :runner do
authenticate_runner!
status 200
body "200"
@@ -78,7 +78,7 @@ module API
params do
requires :token, type: String, desc: 'The current authentication token of the runner'
end
- post '/reset_authentication_token', feature_category: :runner do
+ post '/reset_authentication_token', urgency: :low, feature_category: :runner do
authenticate_runner!
current_runner.reset_token!
@@ -212,7 +212,7 @@ module API
requires :id, type: Integer, desc: %q(Job's ID)
optional :token, type: String, desc: %q(Job's authentication token)
end
- patch '/:id/trace', urgency: :default, feature_category: :continuous_integration do
+ patch '/:id/trace', urgency: :low, feature_category: :continuous_integration do
job = authenticate_job!(heartbeat_runner: true)
error!('400 Missing header Content-Range', 400) unless request.headers.key?('Content-Range')
@@ -305,6 +305,7 @@ module API
result = ::Ci::JobArtifacts::CreateService.new(job).execute(artifacts, params, metadata_file: metadata)
if result[:status] == :success
+ log_artifact_size(result[:artifact])
status :created
body "201"
else
@@ -323,9 +324,13 @@ module API
optional :direct_download, default: false, type: Boolean, desc: %q(Perform direct download from remote storage instead of proxying artifacts)
end
get '/:id/artifacts', feature_category: :build_artifacts do
- job = authenticate_job!(require_running: false)
+ if request_using_running_job_token?
+ authenticate_job_via_dependent_job!
+ else
+ authenticate_job!(require_running: false)
+ end
- present_carrierwave_file!(job.artifacts_file, supports_direct_download: params[:direct_download])
+ present_carrierwave_file!(current_job.artifacts_file, supports_direct_download: params[:direct_download])
end
end
end
diff --git a/lib/api/ci/runners.rb b/lib/api/ci/runners.rb
index 3c9e887e751..7863cfd1e79 100644
--- a/lib/api/ci/runners.rb
+++ b/lib/api/ci/runners.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :runner
+ urgency :low
resource :runners do
desc 'Get runners available for user' do
diff --git a/lib/api/ci/secure_files.rb b/lib/api/ci/secure_files.rb
index ee39bdfd90c..6c7f502b428 100644
--- a/lib/api/ci/secure_files.rb
+++ b/lib/api/ci/secure_files.rb
@@ -62,13 +62,11 @@ module API
params do
requires :name, type: String, desc: 'The name of the file'
requires :file, types: [Rack::Multipart::UploadedFile, ::API::Validations::Types::WorkhorseFile], desc: 'The secure file to be uploaded'
- optional :permissions, type: String, desc: 'The file permissions', default: 'read_only', values: %w[read_only read_write execute]
end
route_setting :authentication, basic_auth_personal_access_token: true, job_token_allowed: true
post ':id/secure_files' do
secure_file = user_project.secure_files.new(
- name: params[:name],
- permissions: params[:permissions] || :read_only
+ name: params[:name]
)
secure_file.file = params[:file]
@@ -96,11 +94,11 @@ module API
helpers do
def feature_flag_enabled?
- service_unavailable! unless Feature.enabled?(:ci_secure_files, user_project, default_enabled: :yaml)
+ service_unavailable! unless Feature.enabled?(:ci_secure_files, user_project)
end
def read_only_feature_flag_enabled?
- service_unavailable! if Feature.enabled?(:ci_secure_files_read_only, user_project, type: :ops, default_enabled: :yaml)
+ service_unavailable! if Feature.enabled?(:ci_secure_files_read_only, user_project, type: :ops)
end
end
end
diff --git a/lib/api/ci/triggers.rb b/lib/api/ci/triggers.rb
index ae89b475ef8..c49f1c9e9e1 100644
--- a/lib/api/ci/triggers.rb
+++ b/lib/api/ci/triggers.rb
@@ -8,6 +8,7 @@ module API
HTTP_GITLAB_EVENT_HEADER = "HTTP_#{::Gitlab::WebHooks::GITLAB_EVENT_HEADER}".underscore.upcase
feature_category :continuous_integration
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/ci/variables.rb b/lib/api/ci/variables.rb
index ec9951aba0d..f9707960b9d 100644
--- a/lib/api/ci/variables.rb
+++ b/lib/api/ci/variables.rb
@@ -35,7 +35,7 @@ module API
requires :key, type: String, desc: 'The key of the variable'
end
# rubocop: disable CodeReuse/ActiveRecord
- get ':id/variables/:key' do
+ get ':id/variables/:key', urgency: :low do
variable = find_variable(user_project, params)
not_found!('Variable') unless variable
diff --git a/lib/api/clusters/agent_tokens.rb b/lib/api/clusters/agent_tokens.rb
new file mode 100644
index 00000000000..1e52790f26b
--- /dev/null
+++ b/lib/api/clusters/agent_tokens.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+module API
+ module Clusters
+ class AgentTokens < ::API::Base
+ include PaginationParams
+
+ before { authenticate! }
+
+ feature_category :kubernetes_management
+
+ params do
+ requires :id, type: String, desc: 'The ID of a project'
+ end
+ resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
+ params do
+ requires :agent_id, type: Integer, desc: 'The ID of an agent'
+ end
+ resource ':id/cluster_agents/:agent_id' do
+ resource :tokens do
+ desc 'List agent tokens' do
+ detail 'This feature was introduced in GitLab 15.0.'
+ success Entities::Clusters::AgentTokenBasic
+ end
+ params do
+ use :pagination
+ end
+ get do
+ authorize! :read_cluster, user_project
+
+ agent = user_project.cluster_agents.find(params[:agent_id])
+
+ present paginate(agent.agent_tokens), with: Entities::Clusters::AgentTokenBasic
+ end
+
+ desc 'Get a single agent token' do
+ detail 'This feature was introduced in GitLab 15.0.'
+ success Entities::Clusters::AgentToken
+ end
+ params do
+ requires :token_id, type: Integer, desc: 'The ID of the agent token'
+ end
+ get ':token_id' do
+ authorize! :read_cluster, user_project
+
+ agent = user_project.cluster_agents.find(params[:agent_id])
+ token = agent.agent_tokens.find(params[:token_id])
+
+ present token, with: Entities::Clusters::AgentToken
+ end
+
+ desc 'Create an agent token' do
+ detail 'This feature was introduced in GitLab 15.0.'
+ success Entities::Clusters::AgentTokenWithToken
+ end
+ params do
+ requires :name, type: String, desc: 'The name for the token'
+ optional :description, type: String, desc: 'The description for the token'
+ end
+ post do
+ authorize! :create_cluster, user_project
+
+ token_params = declared_params(include_missing: false)
+
+ agent = user_project.cluster_agents.find(params[:agent_id])
+
+ result = ::Clusters::AgentTokens::CreateService.new(
+ container: agent.project, current_user: current_user, params: token_params.merge(agent_id: agent.id)
+ ).execute
+
+ bad_request!(result[:message]) if result[:status] == :error
+
+ present result[:token], with: Entities::Clusters::AgentTokenWithToken
+ end
+
+ desc 'Revoke an agent token' do
+ detail 'This feature was introduced in GitLab 15.0.'
+ end
+ params do
+ requires :token_id, type: Integer, desc: 'The ID of the agent token'
+ end
+ delete ':token_id' do
+ authorize! :admin_cluster, user_project
+
+ agent = user_project.cluster_agents.find(params[:agent_id])
+ token = agent.agent_tokens.find(params[:token_id])
+
+ # Skipping explicit error handling and relying on exceptions
+ token.revoked!
+
+ status :no_content
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/clusters/agents.rb b/lib/api/clusters/agents.rb
index 6c1bf21b952..0fa556d2da9 100644
--- a/lib/api/clusters/agents.rb
+++ b/lib/api/clusters/agents.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :kubernetes_management
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb
index c89abf72e2d..5a6d06dcdd9 100644
--- a/lib/api/commit_statuses.rb
+++ b/lib/api/commit_statuses.rb
@@ -5,6 +5,7 @@ require 'mime/types'
module API
class CommitStatuses < ::API::Base
feature_category :continuous_integration
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/composer_packages.rb b/lib/api/composer_packages.rb
index c311b34a697..de59cb4a7c3 100644
--- a/lib/api/composer_packages.rb
+++ b/lib/api/composer_packages.rb
@@ -71,7 +71,7 @@ module API
desc 'Composer packages endpoint at group level'
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
- get ':id/-/packages/composer/packages' do
+ get ':id/-/packages/composer/packages', urgency: :low do
presenter.root
end
@@ -80,7 +80,7 @@ module API
requires :sha, type: String, desc: 'Shasum of current json'
end
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
- get ':id/-/packages/composer/p/:sha' do
+ get ':id/-/packages/composer/p/:sha', urgency: :low do
presenter.provider
end
@@ -89,7 +89,7 @@ module API
requires :package_name, type: String, file_path: true, desc: 'The Composer package name'
end
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
- get ':id/-/packages/composer/p2/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true do
+ get ':id/-/packages/composer/p2/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true, urgency: :low do
not_found! if packages.empty?
presenter.package_versions
@@ -100,7 +100,7 @@ module API
requires :package_name, type: String, file_path: true, desc: 'The Composer package name'
end
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
- get ':id/-/packages/composer/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true do
+ get ':id/-/packages/composer/*package_name', requirements: COMPOSER_ENDPOINT_REQUIREMENTS, file_path: true, urgency: :low do
not_found! if packages.empty?
not_found! if params[:sha].blank?
@@ -122,7 +122,7 @@ module API
optional :tag, type: String, desc: 'The name of the tag'
exactly_one_of :tag, :branch
end
- post do
+ post urgency: :low do
authorize_create_package!(authorized_user_project)
if params[:branch].present?
@@ -147,7 +147,7 @@ module API
requires :package_name, type: String, file_path: true, desc: 'The Composer package name'
end
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true, deploy_token_allowed: true
- get 'archives/*package_name' do
+ get 'archives/*package_name', urgency: :default do
authorize_read_package!(authorized_user_project)
metadata = authorized_user_project
diff --git a/lib/api/concerns/packages/conan_endpoints.rb b/lib/api/concerns/packages/conan_endpoints.rb
index e241633fa8b..d1cc35b16d8 100644
--- a/lib/api/concerns/packages/conan_endpoints.rb
+++ b/lib/api/concerns/packages/conan_endpoints.rb
@@ -56,7 +56,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'ping' do
+ get 'ping', urgency: :default do
header 'X-Conan-Server-Capabilities', [].join(',')
end
@@ -70,7 +70,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'conans/search' do
+ get 'conans/search', urgency: :low do
service = ::Packages::Conan::SearchService.new(current_user, query: params[:q]).execute
service.payload
end
@@ -89,7 +89,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'authenticate' do
+ get 'authenticate', urgency: :low do
unauthorized! unless token
token.to_jwt
@@ -101,7 +101,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'check_credentials' do
+ get 'check_credentials', urgency: :default do
authenticate!
:ok
end
@@ -133,7 +133,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'packages/:conan_package_reference' do
+ get 'packages/:conan_package_reference', urgency: :low do
authorize!(:read_package, project)
presenter = ::Packages::Conan::PackagePresenter.new(
@@ -152,7 +152,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get do
+ get urgency: :low do
authorize!(:read_package, project)
presenter = ::Packages::Conan::PackagePresenter.new(package, current_user, project)
@@ -174,7 +174,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'packages/:conan_package_reference/digest' do
+ get 'packages/:conan_package_reference/digest', urgency: :low do
present_package_download_urls
end
@@ -184,7 +184,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'digest' do
+ get 'digest', urgency: :low do
present_recipe_download_urls
end
@@ -204,7 +204,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'packages/:conan_package_reference/download_urls' do
+ get 'packages/:conan_package_reference/download_urls', urgency: :low do
present_package_download_urls
end
@@ -214,7 +214,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get 'download_urls' do
+ get 'download_urls', urgency: :low do
present_recipe_download_urls
end
@@ -235,7 +235,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- post 'packages/:conan_package_reference/upload_urls' do
+ post 'packages/:conan_package_reference/upload_urls', urgency: :low do
authorize!(:read_package, project)
status 200
@@ -248,7 +248,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- post 'upload_urls' do
+ post 'upload_urls', urgency: :low do
authorize!(:read_package, project)
status 200
@@ -261,7 +261,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- delete do
+ delete urgency: :low do
authorize!(:destroy_package, project)
track_package_event('delete_package', :conan, category: 'API::ConanPackages', user: current_user, project: project, namespace: project.namespace)
@@ -297,7 +297,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get do
+ get urgency: :low do
download_package_file(:recipe_file)
end
@@ -311,7 +311,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- put do
+ put urgency: :low do
upload_package_file(:recipe_file)
end
@@ -321,7 +321,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- put 'authorize' do
+ put 'authorize', urgency: :low do
authorize_workhorse!(subject: project, maximum_size: project.actual_limits.conan_max_file_size)
end
end
@@ -338,7 +338,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- get do
+ get urgency: :low do
download_package_file(:package_file)
end
@@ -348,7 +348,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- put 'authorize' do
+ put 'authorize', urgency: :low do
authorize_workhorse!(subject: project, maximum_size: project.actual_limits.conan_max_file_size)
end
@@ -362,7 +362,7 @@ module API
route_setting :authentication, job_token_allowed: true, basic_auth_personal_access_token: true
- put do
+ put urgency: :low do
upload_package_file(:package_file)
end
end
diff --git a/lib/api/concerns/packages/debian_distribution_endpoints.rb b/lib/api/concerns/packages/debian_distribution_endpoints.rb
index ddc83d0f747..e01f3adbb06 100644
--- a/lib/api/concerns/packages/debian_distribution_endpoints.rb
+++ b/lib/api/concerns/packages/debian_distribution_endpoints.rb
@@ -10,6 +10,7 @@ module API
include PaginationParams
feature_category :package_registry
+ urgency :low
helpers ::API::Helpers::PackagesHelpers
helpers ::API::Helpers::Packages::BasicAuthHelpers
diff --git a/lib/api/concerns/packages/debian_package_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb
index d083643f3d0..e8d27448f02 100644
--- a/lib/api/concerns/packages/debian_package_endpoints.rb
+++ b/lib/api/concerns/packages/debian_package_endpoints.rb
@@ -16,6 +16,7 @@ module API
included do
feature_category :package_registry
+ urgency :low
helpers ::API::Helpers::PackagesHelpers
helpers ::API::Helpers::Packages::BasicAuthHelpers
diff --git a/lib/api/concerns/packages/nuget_endpoints.rb b/lib/api/concerns/packages/nuget_endpoints.rb
index 208daeb3037..e0328e488c6 100644
--- a/lib/api/concerns/packages/nuget_endpoints.rb
+++ b/lib/api/concerns/packages/nuget_endpoints.rb
@@ -56,7 +56,7 @@ module API
desc 'The NuGet Service Index' do
detail 'This feature was introduced in GitLab 12.6'
end
- get 'index', format: :json do
+ get 'index', format: :json, urgency: :default do
authorize_read_package!(project_or_group)
track_package_event('cli_metadata', :nuget, **snowplow_gitlab_standard_context.merge(category: 'API::NugetPackages'))
@@ -77,7 +77,7 @@ module API
desc 'The NuGet Metadata Service - Package name level' do
detail 'This feature was introduced in GitLab 12.8'
end
- get 'index', format: :json do
+ get 'index', format: :json, urgency: :low do
present ::Packages::Nuget::PackagesMetadataPresenter.new(find_packages(params[:package_name])),
with: ::API::Entities::Nuget::PackagesMetadata
end
@@ -88,7 +88,7 @@ module API
params do
requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
end
- get '*package_version', format: :json do
+ get '*package_version', format: :json, urgency: :low do
present ::Packages::Nuget::PackageMetadataPresenter.new(find_package(params[:package_name], params[:package_version])),
with: ::API::Entities::Nuget::PackageMetadata
end
@@ -109,7 +109,7 @@ module API
desc 'The NuGet Search Service' do
detail 'This feature was introduced in GitLab 12.8'
end
- get format: :json do
+ get format: :json, urgency: :low do
search_options = {
include_prerelease_versions: params[:prerelease],
per_page: params[:take],
diff --git a/lib/api/container_registry_event.rb b/lib/api/container_registry_event.rb
index 9bad31f6661..66689f8d7c8 100644
--- a/lib/api/container_registry_event.rb
+++ b/lib/api/container_registry_event.rb
@@ -4,7 +4,8 @@ module API
class ContainerRegistryEvent < ::API::Base
DOCKER_DISTRIBUTION_EVENTS_V1_JSON = 'application/vnd.docker.distribution.events.v1+json'
- feature_category :package_registry
+ feature_category :container_registry
+ urgency :low
before { authenticate_registry_notification! }
diff --git a/lib/api/container_repositories.rb b/lib/api/container_repositories.rb
index 17d667fb6df..d4fa6153a92 100644
--- a/lib/api/container_repositories.rb
+++ b/lib/api/container_repositories.rb
@@ -10,6 +10,7 @@ module API
before { authenticate! }
feature_category :container_registry
+ urgency :low
namespace 'registry' do
params do
diff --git a/lib/api/dependency_proxy.rb b/lib/api/dependency_proxy.rb
index 9d0b1bf4423..290a90934d7 100644
--- a/lib/api/dependency_proxy.rb
+++ b/lib/api/dependency_proxy.rb
@@ -5,6 +5,7 @@ module API
helpers ::API::Helpers::PackagesHelpers
feature_category :dependency_proxy
+ urgency :low
after_validation do
authorize! :admin_group, user_group
diff --git a/lib/api/deploy_keys.rb b/lib/api/deploy_keys.rb
index 0ab9fe6644c..ca13db8701e 100644
--- a/lib/api/deploy_keys.rb
+++ b/lib/api/deploy_keys.rb
@@ -7,6 +7,7 @@ module API
before { authenticate! }
feature_category :continuous_delivery
+ urgency :low
helpers do
def add_deploy_keys_project(project, attrs = {})
diff --git a/lib/api/deploy_tokens.rb b/lib/api/deploy_tokens.rb
index 074c307e881..3e0411d2e91 100644
--- a/lib/api/deploy_tokens.rb
+++ b/lib/api/deploy_tokens.rb
@@ -5,6 +5,7 @@ module API
include PaginationParams
feature_category :continuous_delivery
+ urgency :low
helpers do
def scope_params
diff --git a/lib/api/deployments.rb b/lib/api/deployments.rb
index 6939853c06b..8db5f54b45a 100644
--- a/lib/api/deployments.rb
+++ b/lib/api/deployments.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :continuous_delivery
+ urgency :low
params do
requires :id, type: String, desc: 'The project ID'
diff --git a/lib/api/entities/ci/job_request/dependency.rb b/lib/api/entities/ci/job_request/dependency.rb
index 2672a4a245b..63c1552de8a 100644
--- a/lib/api/entities/ci/job_request/dependency.rb
+++ b/lib/api/entities/ci/job_request/dependency.rb
@@ -5,7 +5,12 @@ module API
module Ci
module JobRequest
class Dependency < Grape::Entity
- expose :id, :name, :token
+ expose :id, :name
+
+ expose :token do |job, options|
+ options[:running_job]&.token
+ end
+
expose :artifacts_file, using: Entities::Ci::JobArtifactFile, if: ->(job, _) { job.available_artifacts? }
end
end
diff --git a/lib/api/entities/ci/job_request/response.rb b/lib/api/entities/ci/job_request/response.rb
index 86c945cb236..9de415ebacb 100644
--- a/lib/api/entities/ci/job_request/response.rb
+++ b/lib/api/entities/ci/job_request/response.rb
@@ -28,8 +28,10 @@ module API
expose :artifacts, using: Entities::Ci::JobRequest::Artifacts
expose :cache, using: Entities::Ci::JobRequest::Cache
expose :credentials, using: Entities::Ci::JobRequest::Credentials
- expose :all_dependencies, as: :dependencies, using: Entities::Ci::JobRequest::Dependency
expose :features
+ expose :dependencies do |job, options|
+ Entities::Ci::JobRequest::Dependency.represent(job.all_dependencies, options.merge(running_job: job))
+ end
end
end
end
diff --git a/lib/api/entities/ci/lint/result.rb b/lib/api/entities/ci/lint/result.rb
index 39039868bba..b44a6e13463 100644
--- a/lib/api/entities/ci/lint/result.rb
+++ b/lib/api/entities/ci/lint/result.rb
@@ -9,6 +9,7 @@ module API
expose :errors
expose :warnings
expose :merged_yaml
+ expose :includes
expose :jobs, if: -> (result, options) { options[:include_jobs] }
end
end
diff --git a/lib/api/entities/ci/secure_file.rb b/lib/api/entities/ci/secure_file.rb
index b60a1a6ac90..639615e5779 100644
--- a/lib/api/entities/ci/secure_file.rb
+++ b/lib/api/entities/ci/secure_file.rb
@@ -6,7 +6,6 @@ module API
class SecureFile < Grape::Entity
expose :id
expose :name
- expose :permissions
expose :checksum
expose :checksum_algorithm
expose :created_at
diff --git a/lib/api/entities/clusters/agent_token.rb b/lib/api/entities/clusters/agent_token.rb
new file mode 100644
index 00000000000..e8cc1009361
--- /dev/null
+++ b/lib/api/entities/clusters/agent_token.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Clusters
+ class AgentToken < AgentTokenBasic
+ expose :last_used_at
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/clusters/agent_token_basic.rb b/lib/api/entities/clusters/agent_token_basic.rb
new file mode 100644
index 00000000000..793ec8188b7
--- /dev/null
+++ b/lib/api/entities/clusters/agent_token_basic.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Clusters
+ class AgentTokenBasic < Grape::Entity
+ expose :id
+ expose :name
+ expose :description
+ expose :agent_id
+ expose :status
+ expose :created_at
+ expose :created_by_user_id
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/clusters/agent_token_with_token.rb b/lib/api/entities/clusters/agent_token_with_token.rb
new file mode 100644
index 00000000000..8b84c80795f
--- /dev/null
+++ b/lib/api/entities/clusters/agent_token_with_token.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module API
+ module Entities
+ module Clusters
+ class AgentTokenWithToken < AgentToken
+ expose :token
+ end
+ end
+ end
+end
diff --git a/lib/api/entities/environment.rb b/lib/api/entities/environment.rb
index 91867f3403d..b1a720ac6bb 100644
--- a/lib/api/entities/environment.rb
+++ b/lib/api/entities/environment.rb
@@ -6,6 +6,7 @@ module API
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
diff --git a/lib/api/entities/plan_limit.rb b/lib/api/entities/plan_limit.rb
index 9f4d1635998..94e50f19b35 100644
--- a/lib/api/entities/plan_limit.rb
+++ b/lib/api/entities/plan_limit.rb
@@ -3,6 +3,14 @@
module API
module Entities
class PlanLimit < Grape::Entity
+ expose :ci_pipeline_size
+ expose :ci_active_jobs
+ expose :ci_active_pipelines
+ expose :ci_project_subscriptions
+ expose :ci_pipeline_schedules
+ expose :ci_needs_size_limit
+ expose :ci_registered_group_runners
+ expose :ci_registered_project_runners
expose :conan_max_file_size
expose :generic_packages_max_file_size
expose :helm_max_file_size
@@ -11,6 +19,7 @@ module API
expose :nuget_max_file_size
expose :pypi_max_file_size
expose :terraform_module_max_file_size
+ expose :storage_size_limit
end
end
end
diff --git a/lib/api/entities/project.rb b/lib/api/entities/project.rb
index 60cc5167c41..9e216b0aed5 100644
--- a/lib/api/entities/project.rb
+++ b/lib/api/entities/project.rb
@@ -35,6 +35,10 @@ module API
expose :members do |project|
expose_url(api_v4_projects_members_path(id: project.id))
end
+
+ expose :cluster_agents do |project|
+ expose_url(api_v4_projects_cluster_agents_path(id: project.id))
+ end
end
expose :packages_enabled
@@ -99,6 +103,7 @@ module API
expose :ci_default_git_depth
expose :ci_forward_deployment_enabled
expose :ci_job_token_scope_enabled
+ expose :ci_separated_caches
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'
@@ -121,6 +126,7 @@ module API
expose :printing_merge_request_link_enabled
expose :merge_method
expose :squash_option
+ expose :enforce_auth_checks_on_uploads
expose :suggestion_commit_message
expose :merge_commit_template
expose :squash_commit_template
diff --git a/lib/api/entities/projects/topic.rb b/lib/api/entities/projects/topic.rb
index d3d1cbec81c..976c307382a 100644
--- a/lib/api/entities/projects/topic.rb
+++ b/lib/api/entities/projects/topic.rb
@@ -6,6 +6,7 @@ module API
class Topic < Grape::Entity
expose :id
expose :name
+ expose :title
expose :description
expose :total_projects_count
expose :avatar_url do |topic, options|
diff --git a/lib/api/entities/user.rb b/lib/api/entities/user.rb
index ff711b4dec2..2366d137cc2 100644
--- a/lib/api/entities/user.rb
+++ b/lib/api/entities/user.rb
@@ -18,6 +18,9 @@ module API
expose :following, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) } do |user|
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)
+ end
expose :local_time do |user|
local_time(user.timezone)
end
diff --git a/lib/api/environments.rb b/lib/api/environments.rb
index 19b48c1e3cf..11f1cab0c72 100644
--- a/lib/api/environments.rb
+++ b/lib/api/environments.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :continuous_delivery
+ urgency :low
params do
requires :id, type: String, desc: 'The project ID'
@@ -29,6 +30,8 @@ module API
environments = ::Environments::EnvironmentsFinder.new(user_project, current_user, params).execute
present paginate(environments), with: Entities::Environment, current_user: current_user
+ rescue ::Environments::EnvironmentsFinder::InvalidStatesError => exception
+ bad_request!(exception.message)
end
desc 'Creates a new environment' do
@@ -39,6 +42,7 @@ module API
requires :name, type: String, desc: 'The name of the environment to be created'
optional :external_url, type: String, desc: 'URL on which this deployment is viewable'
optional :slug, absence: { message: "is automatically generated and cannot be changed" }
+ optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the environment to be created'
end
post ':id/environments' do
authorize! :create_environment, user_project
@@ -62,13 +66,14 @@ module API
optional :name, type: String, desc: 'DEPRECATED: Renaming environment can lead to errors, this will be removed in 15.0'
optional :external_url, type: String, desc: 'The new URL on which this deployment is viewable'
optional :slug, absence: { message: "is automatically generated and cannot be changed" }
+ optional :tier, type: String, values: Environment.tiers.keys, desc: 'The tier of the environment to be created'
end
put ':id/environments/:environment_id' do
authorize! :update_environment, user_project
environment = user_project.environments.find(params[:environment_id])
- update_params = declared_params(include_missing: false).extract!(:name, :external_url)
+ update_params = declared_params(include_missing: false).extract!(:name, :external_url, :tier)
if environment.update(update_params)
present environment, with: Entities::Environment, current_user: current_user
else
diff --git a/lib/api/error_tracking/client_keys.rb b/lib/api/error_tracking/client_keys.rb
index e97df03b6f0..d92cf220433 100644
--- a/lib/api/error_tracking/client_keys.rb
+++ b/lib/api/error_tracking/client_keys.rb
@@ -43,6 +43,8 @@ module API
delete '/client_keys/:key_id' do
key = user_project.error_tracking_client_keys.find(params[:key_id])
key.destroy!
+
+ present key, with: Entities::ErrorTracking::ClientKey
end
end
end
diff --git a/lib/api/error_tracking/collector.rb b/lib/api/error_tracking/collector.rb
index 22a4e04a91c..29b213eaffb 100644
--- a/lib/api/error_tracking/collector.rb
+++ b/lib/api/error_tracking/collector.rb
@@ -12,7 +12,7 @@ module API
content_type :txt, 'text/plain'
default_format :envelope
- rescue_from ActiveRecord::RecordInvalid do |e|
+ rescue_from Gitlab::ErrorTracking::ErrorRepository::DatabaseError do |e|
render_api_error!(e.message, 400)
end
diff --git a/lib/api/events.rb b/lib/api/events.rb
index db5ed7b7e6e..0a0141484ef 100644
--- a/lib/api/events.rb
+++ b/lib/api/events.rb
@@ -9,6 +9,7 @@ module API
allow_access_with_scope :read_user, if: -> (request) { request.get? || request.head? }
feature_category :users
+ urgency :low
resource :events do
desc "List currently authenticated user's events" do
diff --git a/lib/api/feature_flags.rb b/lib/api/feature_flags.rb
index c1f958ac007..42050888c14 100644
--- a/lib/api/feature_flags.rb
+++ b/lib/api/feature_flags.rb
@@ -8,6 +8,7 @@ module API
.merge(name: API::NO_SLASH_URL_PART_REGEX)
feature_category :feature_flags
+ urgency :low
before do
authorize_read_feature_flags!
diff --git a/lib/api/feature_flags_user_lists.rb b/lib/api/feature_flags_user_lists.rb
index 8577da173b1..854719db4a1 100644
--- a/lib/api/feature_flags_user_lists.rb
+++ b/lib/api/feature_flags_user_lists.rb
@@ -9,6 +9,7 @@ module API
}
feature_category :feature_flags
+ urgency :low
before do
authorize_admin_feature_flags_user_lists!
diff --git a/lib/api/features.rb b/lib/api/features.rb
index 398e57794c8..bff2817a2ec 100644
--- a/lib/api/features.rb
+++ b/lib/api/features.rb
@@ -5,6 +5,7 @@ module API
before { authenticated_as_admin! }
feature_category :feature_flags
+ urgency :low
helpers do
def gate_value(params)
@@ -69,12 +70,14 @@ module API
optional :feature_group, type: String, desc: 'A Feature group name'
optional :user, type: String, desc: 'A GitLab username'
optional :group, type: String, desc: "A GitLab group's path, such as 'gitlab-org'"
+ optional :namespace, type: String, desc: "A GitLab group or user namespace path, such as 'gitlab-org'"
optional :project, type: String, desc: 'A projects path, like gitlab-org/gitlab-ce'
optional :force, type: Boolean, desc: 'Skip feature flag validation checks, ie. YAML definition'
mutually_exclusive :key, :feature_group
mutually_exclusive :key, :user
mutually_exclusive :key, :group
+ mutually_exclusive :key, :namespace
mutually_exclusive :key, :project
end
post ':name' do
diff --git a/lib/api/files.rb b/lib/api/files.rb
index 41a8e899614..fd574ca865b 100644
--- a/lib/api/files.rb
+++ b/lib/api/files.rb
@@ -56,6 +56,16 @@ module API
end
end
+ def fetch_blame_range(blame_params)
+ return if blame_params[:range].blank?
+
+ range = Range.new(blame_params[:range][:start], blame_params[:range][:end])
+
+ render_api_error!('range[start] must be less than or equal to range[end]', 400) if range.begin > range.end
+
+ range
+ end
+
def blob_data
{
file_name: @blob.name,
@@ -110,13 +120,19 @@ module API
params do
requires :file_path, type: String, file_path: true, desc: 'The url encoded path to the file. Ex. lib%2Fclass%2Erb'
requires :ref, type: String, desc: 'The name of branch, tag or commit', allow_blank: false
+ optional :range, type: Hash do
+ requires :start, type: Integer, desc: 'The first line of the range to blame', allow_blank: false, values: ->(v) { v > 0 }
+ requires :end, type: Integer, desc: 'The last line of the range to blame', allow_blank: false, values: ->(v) { v > 0 }
+ end
end
get ":id/repository/files/:file_path/blame", requirements: FILE_ENDPOINT_REQUIREMENTS do
+ blame_params = declared_params(include_missing: false)
+
assign_file_vars!
set_http_headers(blob_data)
- blame_ranges = Gitlab::Blame.new(@blob, @commit).groups(highlight: false)
+ blame_ranges = Gitlab::Blame.new(@blob, @commit, range: fetch_blame_range(blame_params)).groups(highlight: false)
present blame_ranges, with: Entities::BlameRange
end
diff --git a/lib/api/freeze_periods.rb b/lib/api/freeze_periods.rb
index d001ced8581..e69baeee97f 100644
--- a/lib/api/freeze_periods.rb
+++ b/lib/api/freeze_periods.rb
@@ -7,6 +7,7 @@ module API
before { authenticate! }
feature_category :continuous_delivery
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/generic_packages.rb b/lib/api/generic_packages.rb
index 97230976482..0b1c06b3c26 100644
--- a/lib/api/generic_packages.rb
+++ b/lib/api/generic_packages.rb
@@ -10,6 +10,7 @@ module API
ALLOWED_STATUSES = %w[default hidden].freeze
feature_category :package_registry
+ urgency :low
before do
require_packages_enabled!
diff --git a/lib/api/geo.rb b/lib/api/geo.rb
index 9fc610c9b32..85f242cd135 100644
--- a/lib/api/geo.rb
+++ b/lib/api/geo.rb
@@ -3,6 +3,7 @@
module API
class Geo < ::API::Base
feature_category :geo_replication
+ urgency :low
helpers do
# Overridden in EE
diff --git a/lib/api/go_proxy.rb b/lib/api/go_proxy.rb
index ea30f17522e..2d9c0cd6ce1 100755
--- a/lib/api/go_proxy.rb
+++ b/lib/api/go_proxy.rb
@@ -5,6 +5,7 @@ module API
helpers ::API::Helpers::PackagesHelpers
feature_category :package_registry
+ urgency :low
# basic semver, except case encoded (A => !a)
MODULE_VERSION_REGEX = /v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([-.!a-z0-9]+))?(?:\+([-.!a-z0-9]+))?/.freeze
diff --git a/lib/api/group_boards.rb b/lib/api/group_boards.rb
index e9350da555c..180b6110cf2 100644
--- a/lib/api/group_boards.rb
+++ b/lib/api/group_boards.rb
@@ -8,6 +8,7 @@ module API
prepend_mod_with('API::BoardsResponses') # rubocop: disable Cop/InjectEnterpriseEditionModule
feature_category :team_planning
+ urgency :low
before { authenticate! }
diff --git a/lib/api/group_clusters.rb b/lib/api/group_clusters.rb
index a5a60ce8741..edaa32c26c4 100644
--- a/lib/api/group_clusters.rb
+++ b/lib/api/group_clusters.rb
@@ -10,6 +10,7 @@ module API
end
feature_category :kubernetes_management
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of the group'
@@ -138,7 +139,7 @@ module API
end
def ensure_feature_enabled!
- not_found! unless Feature.enabled?(:certificate_based_clusters, user_group, default_enabled: :yaml, type: :ops)
+ not_found! unless user_group.certificate_based_clusters_enabled?
end
end
end
diff --git a/lib/api/group_container_repositories.rb b/lib/api/group_container_repositories.rb
index 55e18fd1370..b834d177a12 100644
--- a/lib/api/group_container_repositories.rb
+++ b/lib/api/group_container_repositories.rb
@@ -9,7 +9,8 @@ module API
before { authorize_read_group_container_images! }
- feature_category :package_registry
+ feature_category :container_registry
+ urgency :low
REPOSITORY_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(
tag_name: API::NO_SLASH_URL_PART_REGEX)
@@ -24,8 +25,6 @@ module API
end
params do
use :pagination
- optional :tags, type: Boolean, default: false, desc: 'Determines if tags should be included'
- optional :tags_count, type: Boolean, default: false, desc: 'Determines if the tags count should be included'
end
get ':id/registry/repositories' do
repositories = ContainerRepositoriesFinder.new(
@@ -34,7 +33,7 @@ module API
track_package_event('list_repositories', :container, user: current_user, namespace: user_group)
- present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: params[:tags], tags_count: params[:tags_count]
+ present paginate(repositories), with: Entities::ContainerRegistry::Repository, tags: false, tags_count: false
end
end
diff --git a/lib/api/group_export.rb b/lib/api/group_export.rb
index 5754eceda97..2948960a9b4 100644
--- a/lib/api/group_export.rb
+++ b/lib/api/group_export.rb
@@ -7,6 +7,7 @@ module API
end
feature_category :importers
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a group'
diff --git a/lib/api/group_import.rb b/lib/api/group_import.rb
index 4a752732652..abb8c10efc6 100644
--- a/lib/api/group_import.rb
+++ b/lib/api/group_import.rb
@@ -3,6 +3,7 @@
module API
class GroupImport < ::API::Base
feature_category :importers
+ urgency :low
helpers Helpers::FileUploadHelpers
diff --git a/lib/api/group_labels.rb b/lib/api/group_labels.rb
index 7c1f23be828..e4cbe442f58 100644
--- a/lib/api/group_labels.rb
+++ b/lib/api/group_labels.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a group'
diff --git a/lib/api/group_milestones.rb b/lib/api/group_milestones.rb
index b097022e9c1..0096e466bef 100644
--- a/lib/api/group_milestones.rb
+++ b/lib/api/group_milestones.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a group'
diff --git a/lib/api/group_packages.rb b/lib/api/group_packages.rb
index e396c9608cf..af6e2b1e422 100644
--- a/lib/api/group_packages.rb
+++ b/lib/api/group_packages.rb
@@ -9,6 +9,7 @@ module API
end
feature_category :package_registry
+ urgency :low
helpers ::API::Helpers::PackagesHelpers
diff --git a/lib/api/group_variables.rb b/lib/api/group_variables.rb
index e726f9b61cc..2235746b254 100644
--- a/lib/api/group_variables.rb
+++ b/lib/api/group_variables.rb
@@ -21,7 +21,7 @@ module API
params do
use :pagination
end
- get ':id/variables' do
+ get ':id/variables', urgency: :low do
variables = user_group.variables
present paginate(variables), with: Entities::Ci::Variable
end
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index 0ed14476c61..60bb51bf48f 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -196,7 +196,7 @@ module API
use :optional_params
end
- post feature_category: :subgroups do
+ post feature_category: :subgroups, urgency: :low do
parent_group = find_group!(params[:parent_id]) if params[:parent_id].present?
if parent_group
authorize! :create_subgroup, parent_group
@@ -229,7 +229,7 @@ module API
use :optional_update_params
use :optional_update_params_ee
end
- put ':id', feature_category: :subgroups do
+ put ':id', feature_category: :subgroups, urgency: :low do
group = find_group!(params[:id])
group.preload_shared_group_links
@@ -266,7 +266,7 @@ module API
end
desc 'Remove a group.'
- delete ":id", feature_category: :subgroups do
+ delete ":id", feature_category: :subgroups, urgency: :low do
group = find_group!(params[:id])
authorize! :admin_group, group
check_subscription! group
@@ -361,7 +361,7 @@ module API
use :group_list_params
use :with_custom_attributes
end
- get ":id/descendant_groups", feature_category: :subgroups do
+ get ":id/descendant_groups", feature_category: :subgroups, urgency: :low do
finder_params = declared_params(include_missing: false).merge(include_parent_descendants: true)
groups = find_groups(finder_params, params[:id])
present_groups params, groups
@@ -418,7 +418,6 @@ module API
optional :expires_at, type: Date, desc: 'Share expiration date'
end
post ":id/share", feature_category: :subgroups do
- shared_group = find_group!(params[:id])
shared_with_group = find_group!(params[:group_id])
group_link_create_params = {
@@ -426,11 +425,11 @@ module API
expires_at: params[:expires_at]
}
- result = ::Groups::GroupLinks::CreateService.new(shared_group, shared_with_group, current_user, group_link_create_params).execute
- shared_group.preload_shared_group_links
+ result = ::Groups::GroupLinks::CreateService.new(user_group, shared_with_group, current_user, group_link_create_params).execute
+ user_group.preload_shared_group_links
if result[:status] == :success
- present shared_group, with: Entities::GroupDetail, current_user: current_user
+ present user_group, with: Entities::GroupDetail, current_user: current_user
else
render_api_error!(result[:message], result[:http_status])
end
diff --git a/lib/api/helm_packages.rb b/lib/api/helm_packages.rb
index 4278d17e003..e0e4e02fa55 100644
--- a/lib/api/helm_packages.rb
+++ b/lib/api/helm_packages.rb
@@ -9,6 +9,7 @@ module API
include ::API::Helpers::Authentication
feature_category :package_registry
+ urgency :low
PACKAGE_FILENAME = 'package.tgz'
HELM_REQUIREMENTS = {
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index ee0520df8ff..a079c591519 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -144,7 +144,7 @@ module API
return true unless job_token_authentication?
return true unless route_authentication_setting[:job_token_scope] == :project
- ::Feature.enabled?(:ci_job_token_scope, project, default_enabled: :yaml) &&
+ ::Feature.enabled?(:ci_job_token_scope, project) &&
current_authenticated_job.project == project
end
@@ -160,7 +160,17 @@ module API
def find_group!(id)
group = find_group(id)
+ check_group_access(group)
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def find_group_by_full_path!(full_path)
+ group = Group.find_by_full_path(full_path)
+ check_group_access(group)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ def check_group_access(group)
return group if can?(current_user, :read_group, group)
return unauthorized! if authenticate_non_public?
@@ -384,7 +394,14 @@ module API
end
def order_options_with_tie_breaker
- order_options = { params[:order_by] => params[:sort] }
+ order_by = if Feature.enabled?(:replace_order_by_created_at_with_id) &&
+ params[:order_by] == 'created_at'
+ 'id'
+ else
+ params[:order_by]
+ end
+
+ order_options = { order_by => params[:sort] }
order_options['id'] ||= params[:sort] || 'asc'
order_options
end
@@ -555,6 +572,8 @@ module API
def present_carrierwave_file!(file, supports_direct_download: true)
return not_found! unless file&.exists?
+ log_artifact_size(file) if file.is_a?(JobArtifactUploader)
+
if file.file_storage?
present_disk_file!(file.path, file.filename)
elsif supports_direct_download && file.class.direct_download_enabled?
@@ -567,9 +586,6 @@ module API
end
def increment_counter(event_name)
- feature_name = "usage_data_#{event_name}"
- return unless Feature.enabled?(feature_name, default_enabled: :yaml)
-
Gitlab::UsageDataCounters.count(event_name)
rescue StandardError => error
Gitlab::AppLogger.warn("Redis tracking event failed for event: #{event_name}, message: #{error.message}")
@@ -708,16 +724,23 @@ module API
# Deprecated. Use `send_artifacts_entry` instead.
def legacy_send_artifacts_entry(file, entry)
header(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+ log_artifact_size(file)
body ''
end
def send_artifacts_entry(file, entry)
header(*Gitlab::Workhorse.send_artifacts_entry(file, entry))
+ header(*Gitlab::Workhorse.detect_content_type)
+ log_artifact_size(file)
body ''
end
+ def log_artifact_size(file)
+ Gitlab::ApplicationContext.push(artifact: file.model)
+ end
+
# The Grape Error Middleware only has access to `env` but not `params` nor
# `request`. We workaround this by defining methods that returns the right
# values.
diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb
index 46685df0989..e03f029a6ef 100644
--- a/lib/api/helpers/internal_helpers.rb
+++ b/lib/api/helpers/internal_helpers.rb
@@ -124,8 +124,7 @@ module API
repository: repository.gitaly_repository.to_h,
address: Gitlab::GitalyClient.address(repository.shard),
token: Gitlab::GitalyClient.token(repository.shard),
- features: Feature::Gitaly.server_feature_flags(repository.project),
- use_sidechannel: Feature.enabled?(:gitlab_shell_upload_pack_sidechannel, repository.project, default_enabled: :yaml)
+ features: Feature::Gitaly.server_feature_flags(repository.project)
}
end
end
diff --git a/lib/api/helpers/members_helpers.rb b/lib/api/helpers/members_helpers.rb
index f26ac1318b1..c91e153c7b9 100644
--- a/lib/api/helpers/members_helpers.rb
+++ b/lib/api/helpers/members_helpers.rb
@@ -63,7 +63,7 @@ module API
def add_single_member_by_user_id(create_service_params)
source = create_service_params[:source]
- user_id = create_service_params[:user_ids]
+ user_id = create_service_params[:user_id]
user = User.find_by(id: user_id) # rubocop: disable CodeReuse/ActiveRecord
if user
diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb
index f1125899f8c..7a9dd78e4ed 100644
--- a/lib/api/helpers/projects_helpers.rb
+++ b/lib/api/helpers/projects_helpers.rb
@@ -13,7 +13,6 @@ module API
optional :build_git_strategy, type: String, values: %w(fetch clone), desc: 'The Git strategy. Defaults to `fetch`'
optional :build_timeout, type: Integer, desc: 'Build timeout'
optional :auto_cancel_pending_pipelines, type: String, values: %w(disabled enabled), desc: 'Auto-cancel pending pipelines'
- optional :build_coverage_regex, type: String, desc: 'Test coverage parsing'
optional :ci_config_path, type: String, desc: 'The path to CI config file. Defaults to `.gitlab-ci.yml`'
optional :service_desk_enabled, type: Boolean, desc: 'Disable or enable the service desk'
optional :keep_latest_artifact, type: Boolean, desc: 'Indicates if the latest artifact should be kept for this project.'
@@ -41,8 +40,9 @@ module API
optional :emails_disabled, type: Boolean, desc: 'Disable email notifications'
optional :show_default_award_emojis, type: Boolean, desc: 'Show default award emojis'
optional :warn_about_potentially_unwanted_characters, type: Boolean, desc: 'Warn about Potentially Unwanted Characters'
+ optional :enforce_auth_checks_on_uploads, type: Boolean, desc: 'Enforce auth check on uploads'
optional :shared_runners_enabled, type: Boolean, desc: 'Flag indication if shared runners are enabled for that project'
- optional :resolve_outdated_diff_discussions, type: Boolean, desc: 'Automatically resolve merge request diffs discussions on lines changed with a push'
+ optional :resolve_outdated_diff_discussions, type: Boolean, desc: 'Automatically resolve merge request diff threads on lines changed with a push'
optional :remove_source_branch_after_merge, type: Boolean, desc: 'Remove the source branch by default after merge'
optional :container_registry_enabled, type: Boolean, desc: 'Deprecated: Use :container_registry_access_level instead. Flag indication if the container registry is enabled for that project'
optional :container_expiration_policy_attributes, type: Hash do
@@ -54,7 +54,7 @@ module API
optional :request_access_enabled, type: Boolean, desc: 'Allow users to request member access'
optional :only_allow_merge_if_pipeline_succeeds, type: Boolean, desc: 'Only allow to merge if builds succeed'
optional :allow_merge_on_skipped_pipeline, type: Boolean, desc: 'Allow to merge if pipeline is skipped'
- optional :only_allow_merge_if_all_discussions_are_resolved, type: Boolean, desc: 'Only allow to merge if all discussions are resolved'
+ optional :only_allow_merge_if_all_discussions_are_resolved, type: Boolean, desc: 'Only allow to merge if all threads are resolved'
optional :tag_list, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'Deprecated: Use :topics instead'
optional :topics, type: Array[String], coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, desc: 'The list of topics for a project'
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab/issues/14960
@@ -124,7 +124,6 @@ module API
:auto_devops_enabled,
:auto_devops_deploy_strategy,
:auto_cancel_pending_pipelines,
- :build_coverage_regex,
:build_git_strategy,
:build_timeout,
:builds_access_level,
@@ -175,6 +174,7 @@ module API
:service_desk_enabled,
:keep_latest_artifact,
:mr_default_target_self,
+ :enforce_auth_checks_on_uploads,
# TODO: remove in API v5, replaced by *_access_level
:issues_enabled,
@@ -192,8 +192,6 @@ module API
def validate_git_import_url!(import_url)
return if import_url.blank?
- yield if block_given?
-
result = Import::ValidateRemoteGitEndpointService.new(url: import_url).execute # network call
if result.error?
diff --git a/lib/api/import_bitbucket_server.rb b/lib/api/import_bitbucket_server.rb
index 0f0d62dcbfb..0f2d6239d0d 100644
--- a/lib/api/import_bitbucket_server.rb
+++ b/lib/api/import_bitbucket_server.rb
@@ -3,10 +3,7 @@
module API
class ImportBitbucketServer < ::API::Base
feature_category :importers
-
- before do
- forbidden! unless Gitlab::CurrentSettings.import_sources&.include?('bitbucket_server')
- end
+ urgency :low
helpers do
def client
diff --git a/lib/api/import_github.rb b/lib/api/import_github.rb
index c91a7700f58..46ca8e4c428 100644
--- a/lib/api/import_github.rb
+++ b/lib/api/import_github.rb
@@ -3,19 +3,16 @@
module API
class ImportGithub < ::API::Base
feature_category :importers
+ urgency :low
rescue_from Octokit::Unauthorized, with: :provider_unauthorized
- before do
- forbidden! unless Gitlab::CurrentSettings.import_sources&.include?('github')
- end
-
helpers do
def client
@client ||= if Feature.enabled?(:remove_legacy_github_client)
Gitlab::GithubImport::Client.new(params[:personal_access_token], host: params[:github_hostname])
else
- Gitlab::LegacyGithubImport::Client.new(params[:personal_access_token], client_options)
+ Gitlab::LegacyGithubImport::Client.new(params[:personal_access_token], **client_options)
end
end
diff --git a/lib/api/integrations/jira_connect/subscriptions.rb b/lib/api/integrations/jira_connect/subscriptions.rb
new file mode 100644
index 00000000000..fa19dc2be3f
--- /dev/null
+++ b/lib/api/integrations/jira_connect/subscriptions.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module API
+ class Integrations
+ module JiraConnect
+ class Subscriptions < ::API::Base
+ feature_category :integrations
+
+ before { authenticate! }
+
+ namespace :integrations do
+ namespace :jira_connect do
+ resource :subscriptions do
+ desc 'Subscribe a namespace to a JiraConnectInstallation'
+ params do
+ requires :jwt, type: String, desc: 'JWT token for authorization with the Jira Connect installation'
+ requires :namespace_path, type: String, desc: 'Path for the namespace that should be subscribed'
+ end
+ post do
+ not_found! unless Feature.enabled?(:jira_connect_oauth, current_user)
+
+ jwt = Atlassian::JiraConnect::Jwt::Symmetric.new(params[:jwt])
+ installation = JiraConnectInstallation.find_by_client_key(jwt.iss_claim)
+
+ if !installation || !jwt.valid?(installation.shared_secret) || !jwt.verify_context_qsh_claim
+ unauthorized!
+ end
+
+ jira_user = installation.client.user_info(jwt.sub_claim)
+
+ result = ::JiraConnectSubscriptions::CreateService.new(
+ installation,
+ current_user,
+ namespace_path: params['namespace_path'],
+ jira_user: jira_user
+ ).execute
+
+ if result[:status] == :success
+ status :created
+ { success: true }
+ else
+ render_api_error!(result[:message], result[:http_status])
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index 2ab5d482295..b53f855c3a2 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -43,7 +43,7 @@ module API
# This is a separate method so that EE can alter its behaviour more
# easily.
- if Feature.enabled?(:rate_limit_gitlab_shell, default_enabled: :yaml)
+ if Feature.enabled?(:rate_limit_gitlab_shell)
check_rate_limit!(:gitlab_shell_operation, scope: [params[:action], params[:project], actor.key_or_user])
end
@@ -123,10 +123,19 @@ module API
'Could not find a user for the given key' unless actor.user
end
+ # TODO: backwards compatibility; remove after https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/454 is merged
def two_factor_otp_check
{ success: false, message: 'Feature is not available' }
end
+ def two_factor_manual_otp_check
+ { success: false, message: 'Feature is not available' }
+ end
+
+ def two_factor_push_otp_check
+ { success: false, message: 'Feature is not available' }
+ end
+
def with_admin_mode_bypass!(actor_id)
return yield unless Gitlab::CurrentSettings.admin_mode
@@ -320,10 +329,23 @@ module API
end
end
+ # TODO: backwards compatibility; remove after https://gitlab.com/gitlab-org/gitlab-shell/-/merge_requests/454 is merged
post '/two_factor_otp_check', feature_category: :authentication_and_authorization do
status 200
- two_factor_otp_check
+ two_factor_manual_otp_check
+ end
+
+ post '/two_factor_push_otp_check', feature_category: :authentication_and_authorization do
+ status 200
+
+ two_factor_push_otp_check
+ end
+
+ post '/two_factor_manual_otp_check', feature_category: :authentication_and_authorization do
+ status 200
+
+ two_factor_manual_otp_check
end
end
end
diff --git a/lib/api/internal/container_registry/migration.rb b/lib/api/internal/container_registry/migration.rb
index b84e14c6f31..c750db94dab 100644
--- a/lib/api/internal/container_registry/migration.rb
+++ b/lib/api/internal/container_registry/migration.rb
@@ -5,6 +5,7 @@ module API
module ContainerRegistry
class Migration < ::API::Base
feature_category :container_registry
+ urgency :low
STATUS_PRE_IMPORT_COMPLETE = 'pre_import_complete'
STATUS_PRE_IMPORT_FAILED = 'pre_import_failed'
@@ -36,23 +37,25 @@ module API
requires :status, type: String, values: POSSIBLE_VALUES, desc: 'The migration step status'
end
put 'internal/registry/repositories/*repository_path/migration/status' do
- repository = find_repository!(declared_params[:repository_path])
+ ::Gitlab::Database::LoadBalancing::Session.current.use_primary do
+ repository = find_repository!(declared_params[:repository_path])
- unless repository.migration_in_active_state?
- bad_request!("Wrong migration state (#{repository.migration_state})")
- end
-
- case declared_params[:status]
- when STATUS_PRE_IMPORT_COMPLETE
- unless repository.finish_pre_import_and_start_import
- bad_request!("Couldn't transition from pre_importing to importing")
+ unless repository.migration_in_active_state?
+ bad_request!("Wrong migration state (#{repository.migration_state})")
end
- when STATUS_IMPORT_COMPLETE
- unless repository.finish_import
- bad_request!("Couldn't transition from importing to import_done")
+
+ case declared_params[:status]
+ when STATUS_PRE_IMPORT_COMPLETE
+ unless repository.finish_pre_import_and_start_import
+ bad_request!("Couldn't transition from pre_importing to importing")
+ end
+ when STATUS_IMPORT_COMPLETE
+ unless repository.finish_import
+ bad_request!("Couldn't transition from importing to import_done")
+ end
+ when STATUS_IMPORT_FAILED, STATUS_PRE_IMPORT_FAILED
+ repository.abort_import!
end
- when STATUS_IMPORT_FAILED, STATUS_PRE_IMPORT_FAILED
- repository.abort_import
end
status 200
diff --git a/lib/api/internal/kubernetes.rb b/lib/api/internal/kubernetes.rb
index 59bc917a602..34acfac4cb1 100644
--- a/lib/api/internal/kubernetes.rb
+++ b/lib/api/internal/kubernetes.rb
@@ -5,7 +5,6 @@ module API
module Internal
class Kubernetes < ::API::Base
feature_category :kubernetes_management
-
before do
check_feature_enabled
authenticate_gitlab_kas_request!
@@ -48,7 +47,7 @@ module API
end
def check_feature_enabled
- not_found! unless Feature.enabled?(:kubernetes_agent_internal_api, default_enabled: true, type: :ops)
+ not_found! unless Feature.enabled?(:kubernetes_agent_internal_api, type: :ops)
end
def check_agent_token
@@ -68,7 +67,7 @@ module API
detail 'Retrieves agent info for the given token'
end
route_setting :authentication, cluster_agent_token_allowed: true
- get '/agent_info' do
+ get '/agent_info', urgency: :low do
project = agent.project
status 200
@@ -82,7 +81,7 @@ module API
end
end
- namespace 'kubernetes/agent_configuration' do
+ namespace 'kubernetes/agent_configuration', urgency: :low do
desc 'POST agent configuration' do
detail 'Store configuration for an agent'
end
diff --git a/lib/api/invitations.rb b/lib/api/invitations.rb
index 75f63a5d98f..6fb3eca0ba8 100644
--- a/lib/api/invitations.rb
+++ b/lib/api/invitations.rb
@@ -28,7 +28,7 @@ module API
optional :tasks_to_be_done, type: Array[String], coerce_with: Validations::Types::CommaSeparatedToArray.coerce, desc: 'Tasks the inviter wants the member to do'
optional :tasks_project_id, type: Integer, desc: 'The project ID in which to create the task issues'
end
- post ":id/invitations" do
+ post ":id/invitations", urgency: :low do
::Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/354016')
bad_request!('Must provide either email or user_id as a parameter') if params[:email].blank? && params[:user_id].blank?
@@ -36,7 +36,7 @@ module API
source = find_source(source_type, params[:id])
authorize_admin_source!(source_type, source)
- create_service_params = params.except(:user_id).merge({ user_ids: params[:user_id], source: source })
+ create_service_params = params.merge(source: source)
::Members::InviteService.new(current_user, create_service_params).execute
end
diff --git a/lib/api/issue_links.rb b/lib/api/issue_links.rb
index 0e93a4adb65..cf075af8373 100644
--- a/lib/api/issue_links.rb
+++ b/lib/api/issue_links.rb
@@ -7,6 +7,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index e9bb9fe7a97..971163c18db 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -9,6 +9,7 @@ module API
before { authenticate_non_get! }
feature_category :team_planning
+ urgency :low
helpers do
params :negatable_issue_filter_params do
diff --git a/lib/api/labels.rb b/lib/api/labels.rb
index e3253d15c15..e2d4f5d823a 100644
--- a/lib/api/labels.rb
+++ b/lib/api/labels.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
LABEL_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(
name: API::NO_SLASH_URL_PART_REGEX,
diff --git a/lib/api/maven_packages.rb b/lib/api/maven_packages.rb
index 5245cd10564..2fed724f947 100644
--- a/lib/api/maven_packages.rb
+++ b/lib/api/maven_packages.rb
@@ -6,6 +6,7 @@ module API
}.freeze
feature_category :package_registry
+ urgency :low
content_type :md5, 'text/plain'
content_type :sha1, 'text/plain'
diff --git a/lib/api/members.rb b/lib/api/members.rb
index 01e859c94c4..e2045c6def7 100644
--- a/lib/api/members.rb
+++ b/lib/api/members.rb
@@ -6,12 +6,14 @@ module API
before { authenticate! }
- feature_category :authentication_and_authorization
urgency :low
helpers ::API::Helpers::MembersHelpers
- %w[group project].each do |source_type|
+ {
+ "group" => :subgroups,
+ "project" => :projects
+ }.each do |source_type, feature_category|
params do
requires :id, type: String, desc: "The #{source_type} ID"
end
@@ -27,7 +29,7 @@ module API
use :pagination
end
- get ":id/members" do
+ get ":id/members", feature_category: feature_category do
source = find_source(source_type, params[:id])
members = paginate(retrieve_members(source, params: params))
@@ -46,7 +48,7 @@ module API
use :pagination
end
- get ":id/members/all" do
+ get ":id/members/all", feature_category: feature_category do
source = find_source(source_type, params[:id])
members = paginate(retrieve_members(source, params: params, deep: true))
@@ -61,7 +63,7 @@ module API
requires :user_id, type: Integer, desc: 'The user ID of the member'
end
# rubocop: disable CodeReuse/ActiveRecord
- get ":id/members/:user_id" do
+ get ":id/members/:user_id", feature_category: feature_category do
source = find_source(source_type, params[:id])
members = source_members(source)
@@ -78,7 +80,7 @@ module API
requires :user_id, type: Integer, desc: 'The user ID of the member'
end
# rubocop: disable CodeReuse/ActiveRecord
- get ":id/members/all/:user_id" do
+ get ":id/members/all/:user_id", feature_category: feature_category do
source = find_source(source_type, params[:id])
members = find_all_members(source)
@@ -100,16 +102,15 @@ module API
optional :tasks_project_id, type: Integer, desc: 'The project ID in which to create the task issues'
end
- post ":id/members" do
+ post ":id/members", feature_category: feature_category do
source = find_source(source_type, params[:id])
authorize_admin_source!(source_type, source)
- user_id = params[:user_id].to_s
- create_service_params = params.except(:user_id).merge({ user_ids: user_id, source: source })
+ create_service_params = params.merge(source: source)
- if add_multiple_members?(user_id)
+ if add_multiple_members?(params[:user_id].to_s)
::Members::CreateService.new(current_user, create_service_params).execute
- elsif add_single_member?(user_id)
+ elsif add_single_member?(params[:user_id].to_s)
add_single_member_by_user_id(create_service_params)
end
end
@@ -123,7 +124,7 @@ module API
optional :expires_at, type: DateTime, desc: 'Date string in the format YEAR-MONTH-DAY'
end
# rubocop: disable CodeReuse/ActiveRecord
- put ":id/members/:user_id" do
+ put ":id/members/:user_id", feature_category: feature_category do
source = find_source(source_type, params.delete(:id))
authorize_admin_source!(source_type, source)
@@ -152,7 +153,7 @@ module API
desc: 'Flag indicating if the removed member should be unassigned from any issues or merge requests within given group or project'
end
# rubocop: disable CodeReuse/ActiveRecord
- delete ":id/members/:user_id" do
+ delete ":id/members/:user_id", feature_category: feature_category do
source = find_source(source_type, params[:id])
member = source_members(source).find_by!(user_id: params[:user_id])
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index de9a2a198d9..730baae63a2 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -373,7 +373,7 @@ module API
desc 'Get the merge request pipelines' do
success Entities::Ci::PipelineBasic
end
- get ':id/merge_requests/:merge_request_iid/pipelines', feature_category: :continuous_integration do
+ get ':id/merge_requests/:merge_request_iid/pipelines', urgency: :low, feature_category: :continuous_integration do
pipelines = merge_request_pipelines_with_access
present paginate(pipelines), with: Entities::Ci::PipelineBasic
@@ -382,7 +382,7 @@ module API
desc 'Create a pipeline for merge request' do
success ::API::Entities::Ci::Pipeline
end
- post ':id/merge_requests/:merge_request_iid/pipelines', feature_category: :continuous_integration do
+ post ':id/merge_requests/:merge_request_iid/pipelines', urgency: :low, feature_category: :continuous_integration do
pipeline = ::MergeRequests::CreatePipelineService
.new(project: user_project, current_user: current_user, params: { allow_duplicate: true })
.execute(find_merge_request_with_access(params[:merge_request_iid]))
diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb
index 1f3516e0667..4ff7096b5d9 100644
--- a/lib/api/namespaces.rb
+++ b/lib/api/namespaces.rb
@@ -30,7 +30,7 @@ module API
use :pagination
use :optional_list_params_ee
end
- get feature_category: :subgroups do
+ get feature_category: :subgroups, urgency: :low do
owned_only = params[:owned_only] == true
namespaces = current_user.admin ? Namespace.all : current_user.namespaces(owned_only: owned_only)
@@ -52,7 +52,7 @@ module API
params do
requires :id, type: String, desc: "Namespace's ID or path"
end
- get ':id', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups do
+ get ':id', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups, urgency: :low do
user_namespace = find_namespace!(params[:id])
present user_namespace, with: Entities::Namespace, current_user: current_user
@@ -65,7 +65,7 @@ module API
requires :namespace, type: String, desc: "Namespace's path"
optional :parent_id, type: Integer, desc: "The ID of the parent namespace. If no ID is specified, only top-level namespaces are considered."
end
- get ':namespace/exists', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups do
+ get ':namespace/exists', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS, feature_category: :subgroups, urgency: :low do
namespace_path = params[:namespace]
exists = Namespace.without_project_namespaces.by_parent(params[:parent_id]).filter_by_path(namespace_path).exists?
diff --git a/lib/api/notes.rb b/lib/api/notes.rb
index c12b3bf5562..2a854bd785e 100644
--- a/lib/api/notes.rb
+++ b/lib/api/notes.rb
@@ -94,7 +94,7 @@ module API
note = create_note(noteable, opts)
- if note.errors.attribute_names == [:commands_only]
+ if note.errors.attribute_names == [:commands_only, :command_names]
status 202
present note, with: Entities::NoteCommands
elsif note.valid?
diff --git a/lib/api/notification_settings.rb b/lib/api/notification_settings.rb
index 420eabb41db..8cd72d2ab15 100644
--- a/lib/api/notification_settings.rb
+++ b/lib/api/notification_settings.rb
@@ -6,6 +6,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
helpers ::API::Helpers::MembersHelpers
diff --git a/lib/api/npm_instance_packages.rb b/lib/api/npm_instance_packages.rb
index 12fc008e00f..e387dd65e41 100644
--- a/lib/api/npm_instance_packages.rb
+++ b/lib/api/npm_instance_packages.rb
@@ -4,6 +4,7 @@ module API
helpers ::API::Helpers::Packages::Npm
feature_category :package_registry
+ urgency :low
rescue_from ActiveRecord::RecordInvalid do |e|
render_api_error!(e.message, 400)
diff --git a/lib/api/npm_project_packages.rb b/lib/api/npm_project_packages.rb
index dbfc0a61577..21bb2e69799 100644
--- a/lib/api/npm_project_packages.rb
+++ b/lib/api/npm_project_packages.rb
@@ -4,6 +4,7 @@ module API
helpers ::API::Helpers::Packages::Npm
feature_category :package_registry
+ urgency :low
rescue_from ActiveRecord::RecordInvalid do |e|
render_api_error!(e.message, 400)
diff --git a/lib/api/nuget_project_packages.rb b/lib/api/nuget_project_packages.rb
index 03d1492908d..1e630cffea1 100644
--- a/lib/api/nuget_project_packages.rb
+++ b/lib/api/nuget_project_packages.rb
@@ -105,7 +105,7 @@ module API
params do
use :file_params
end
- put do
+ put urgency: :low do
upload_nuget_package_file do |package|
track_package_event(
'push_package',
@@ -121,7 +121,7 @@ module API
forbidden!
end
- put 'authorize' do
+ put 'authorize', urgency: :low do
authorize_nuget_upload
end
@@ -133,7 +133,7 @@ module API
params do
use :file_params
end
- put 'symbolpackage' do
+ put 'symbolpackage', urgency: :low do
upload_nuget_package_file(symbol_package: true) do |package|
track_package_event(
'push_symbol_package',
@@ -149,7 +149,7 @@ module API
forbidden!
end
- put 'symbolpackage/authorize' do
+ put 'symbolpackage/authorize', urgency: :low do
authorize_nuget_upload
end
@@ -165,7 +165,7 @@ module API
desc 'The NuGet Content Service - index request' do
detail 'This feature was introduced in GitLab 12.8'
end
- get 'index', format: :json do
+ get 'index', format: :json, urgency: :low do
present ::Packages::Nuget::PackagesVersionsPresenter.new(find_packages(params[:package_name])),
with: ::API::Entities::Nuget::PackagesVersions
end
@@ -177,7 +177,7 @@ module API
requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
requires :package_filename, type: String, desc: 'The NuGet package filename', regexp: API::NO_SLASH_URL_PART_REGEX
end
- get '*package_version/*package_filename', format: [:nupkg, :snupkg] do
+ get '*package_version/*package_filename', format: [:nupkg, :snupkg], urgency: :low do
filename = "#{params[:package_filename]}.#{params[:format]}"
package_file = ::Packages::PackageFileFinder.new(find_package(params[:package_name], params[:package_version]), filename, with_file_name_like: true)
.execute
diff --git a/lib/api/package_files.rb b/lib/api/package_files.rb
index 4861c0c740e..278dc4c2044 100644
--- a/lib/api/package_files.rb
+++ b/lib/api/package_files.rb
@@ -9,6 +9,7 @@ module API
end
feature_category :package_registry
+ urgency :low
helpers ::API::Helpers::PackagesHelpers
diff --git a/lib/api/personal_access_tokens.rb b/lib/api/personal_access_tokens.rb
index 56590bb9a8f..40e6486dae9 100644
--- a/lib/api/personal_access_tokens.rb
+++ b/lib/api/personal_access_tokens.rb
@@ -39,6 +39,12 @@ module API
def find_token(id)
PersonalAccessToken.find(id) || not_found!
end
+
+ def revoke_token(token)
+ service = ::PersonalAccessTokens::RevokeService.new(current_user, token: token).execute
+
+ service.success? ? no_content! : bad_request!(nil)
+ end
end
resources :personal_access_tokens do
@@ -48,13 +54,14 @@ module API
present paginate(tokens), with: Entities::PersonalAccessToken
end
+ delete 'self' do
+ revoke_token(access_token)
+ end
+
delete ':id' do
- service = ::PersonalAccessTokens::RevokeService.new(
- current_user,
- token: find_token(params[:id])
- ).execute
+ token = find_token(params[:id])
- service.success? ? no_content! : bad_request!(nil)
+ revoke_token(token)
end
end
end
diff --git a/lib/api/project_clusters.rb b/lib/api/project_clusters.rb
index 8bba67a53af..4644d38ea80 100644
--- a/lib/api/project_clusters.rb
+++ b/lib/api/project_clusters.rb
@@ -10,6 +10,7 @@ module API
end
feature_category :kubernetes_management
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of the project'
@@ -143,7 +144,9 @@ module API
end
def ensure_feature_enabled!
- not_found! unless Feature.enabled?(:certificate_based_clusters, user_project, default_enabled: :yaml, type: :ops)
+ namespace = user_project.namespace
+
+ not_found! unless namespace.certificate_based_clusters_enabled?
end
end
end
diff --git a/lib/api/project_container_repositories.rb b/lib/api/project_container_repositories.rb
index d4efca6e8f2..6a6275ed02a 100644
--- a/lib/api/project_container_repositories.rb
+++ b/lib/api/project_container_repositories.rb
@@ -13,6 +13,7 @@ module API
before { authorize_read_container_images! }
feature_category :package_registry
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
@@ -91,7 +92,7 @@ module API
# rubocop:disable CodeReuse/Worker
CleanupContainerRepositoryWorker.perform_async(current_user.id, repository.id,
- declared_params.except(:repository_id).merge(container_expiration_policy: false))
+ declared_params.except(:repository_id))
# rubocop:enable CodeReuse/Worker
track_package_event('delete_tag_bulk', :container, user: current_user, project: user_project, namespace: user_project.namespace)
diff --git a/lib/api/project_export.rb b/lib/api/project_export.rb
index 8b27d8d2163..d610b5e4f95 100644
--- a/lib/api/project_export.rb
+++ b/lib/api/project_export.rb
@@ -3,6 +3,7 @@
module API
class ProjectExport < ::API::Base
feature_category :importers
+ urgency :low
before do
not_found! unless Gitlab::CurrentSettings.project_export_enabled?
@@ -65,9 +66,13 @@ module API
if export_strategy&.invalid?
render_validation_error!(export_strategy)
else
- user_project.add_export_job(current_user: current_user,
- after_export_strategy: export_strategy,
- params: project_export_params)
+ begin
+ user_project.add_export_job(current_user: current_user,
+ after_export_strategy: export_strategy,
+ params: project_export_params)
+ rescue Project::ExportLimitExceeded => e
+ render_api_error!(e.message, 400)
+ end
end
accepted!
@@ -75,7 +80,7 @@ module API
resource do
before do
- not_found! unless ::Feature.enabled?(:bulk_import, default_enabled: :yaml)
+ not_found! unless ::Feature.enabled?(:bulk_import)
end
desc 'Start relations export' do
diff --git a/lib/api/project_import.rb b/lib/api/project_import.rb
index bd8faefa803..7a66044c5b6 100644
--- a/lib/api/project_import.rb
+++ b/lib/api/project_import.rb
@@ -8,6 +8,7 @@ module API
helpers Helpers::FileUploadHelpers
feature_category :importers
+ urgency :low
before { authenticate! unless route.settings[:skip_authentication] }
@@ -178,7 +179,7 @@ module API
success Entities::ProjectImportStatus
end
post 'remote-import-s3' do
- not_found! unless ::Feature.enabled?(:import_project_from_remote_file_s3, default_enabled: :yaml)
+ not_found! unless ::Feature.enabled?(:import_project_from_remote_file_s3)
check_rate_limit! :project_import, scope: [current_user, :project_import]
diff --git a/lib/api/project_milestones.rb b/lib/api/project_milestones.rb
index 435e4bed776..9f82dbf9813 100644
--- a/lib/api/project_milestones.rb
+++ b/lib/api/project_milestones.rb
@@ -8,6 +8,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/project_packages.rb b/lib/api/project_packages.rb
index c997afea865..79a5ca531e1 100644
--- a/lib/api/project_packages.rb
+++ b/lib/api/project_packages.rb
@@ -9,6 +9,7 @@ module API
end
feature_category :package_registry
+ urgency :low
helpers ::API::Helpers::PackagesHelpers
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 9f7b3f9b088..44b1acaca88 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -76,7 +76,7 @@ module API
# Temporarily introduced for upload API: https://gitlab.com/gitlab-org/gitlab/-/issues/325788
def project_attachment_size(user_project)
return PROJECT_ATTACHMENT_SIZE_EXEMPT if exempt_from_global_attachment_size?(user_project)
- return user_project.max_attachment_size if Feature.enabled?(:enforce_max_attachment_size_upload_api, user_project, default_enabled: :yaml)
+ return user_project.max_attachment_size if Feature.enabled?(:enforce_max_attachment_size_upload_api, user_project)
PROJECT_ATTACHMENT_SIZE_EXEMPT
end
@@ -90,10 +90,6 @@ module API
Gitlab::AppLogger.info({ message: "File exceeds maximum size", file_bytes: file.size, project_id: user_project.id, project_path: user_project.full_path, upload_allowed: allowed })
end
end
-
- def check_import_by_url_is_enabled
- Gitlab::CurrentSettings.import_sources&.include?('git') || forbidden!
- end
end
helpers do
@@ -202,6 +198,11 @@ module API
params[:builds_enabled] = params.delete(:jobs_enabled) if params.key?(:jobs_enabled)
params
end
+
+ def add_import_params(params)
+ params[:import_type] = 'git' if params[:import_url]&.present?
+ params
+ end
end
resource :users, requirements: API::USER_REQUIREMENTS do
@@ -214,7 +215,7 @@ module API
use :statistics_params
use :with_custom_attributes
end
- get ":user_id/projects", feature_category: :projects, urgency: :default do
+ get ":user_id/projects", feature_category: :projects, urgency: :low do
user = find_user(params[:user_id])
not_found!('User') unless user
@@ -231,7 +232,7 @@ module API
use :collection_params
use :statistics_params
end
- get ":user_id/starred_projects", feature_category: :projects do
+ get ":user_id/starred_projects", feature_category: :projects, urgency: :low do
user = find_user(params[:user_id])
not_found!('User') unless user
@@ -267,13 +268,14 @@ module API
use :optional_create_project_params
use :create_params
end
- post do
+ post urgency: :low do
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/issues/21139')
attrs = declared_params(include_missing: false)
attrs = translate_params_for_compatibility(attrs)
+ attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs)
- validate_git_import_url!(params[:import_url]) { check_import_by_url_is_enabled }
+ validate_git_import_url!(params[:import_url])
project = ::Projects::CreateService.new(current_user, attrs).execute
@@ -286,6 +288,8 @@ module API
error!(project.errors[:limit_reached], 403)
end
+ forbidden! if project.errors[:import_source_disabled].present?
+
render_validation_error!(project)
end
end
@@ -311,6 +315,7 @@ module API
attrs = declared_params(include_missing: false)
attrs = translate_params_for_compatibility(attrs)
+ attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs)
validate_git_import_url!(params[:import_url])
@@ -321,6 +326,8 @@ module API
user_can_admin_project: can?(current_user, :admin_project, project),
current_user: current_user
else
+ forbidden! if project.errors[:import_source_disabled].present?
+
render_validation_error!(project)
end
end
@@ -342,7 +349,7 @@ module API
desc: 'Include project license data'
end
# TODO: Set higher urgency https://gitlab.com/gitlab-org/gitlab/-/issues/357622
- get ":id", feature_category: :projects, urgency: :default do
+ get ":id", feature_category: :projects, urgency: :low do
options = {
with: current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails,
current_user: current_user,
@@ -441,6 +448,7 @@ module API
authorize! :change_visibility_level, user_project if user_project.visibility_attribute_present?(attrs)
attrs = translate_params_for_compatibility(attrs)
+ attrs = add_import_params(attrs)
filter_attributes_using_license!(attrs)
verify_update_project_attrs!(user_project, attrs)
@@ -469,7 +477,7 @@ module API
desc 'Unarchive a project' do
success Entities::Project
end
- post ':id/unarchive', feature_category: :projects do
+ post ':id/unarchive', feature_category: :projects, urgency: :default do
authorize!(:archive_project, user_project)
::Projects::UpdateService.new(user_project, current_user, archived: false).execute
@@ -575,14 +583,14 @@ module API
end
post ":id/share", feature_category: :authentication_and_authorization do
authorize! :admin_project, user_project
- group = Group.find_by_id(params[:group_id])
+ shared_with_group = Group.find_by_id(params[:group_id])
unless user_project.allowed_to_share_with_group?
break render_api_error!("The project sharing with group is disabled", 400)
end
- result = ::Projects::GroupLinks::CreateService.new(user_project, current_user, declared_params(include_missing: false))
- .execute(group)
+ result = ::Projects::GroupLinks::CreateService
+ .new(user_project, shared_with_group, current_user, declared_params(include_missing: false)).execute
if result[:status] == :success
present result[:link], with: Entities::ProjectGroupLink
@@ -663,7 +671,7 @@ module API
optional :skip_users, type: Array[Integer], coerce_with: ::API::Validations::Types::CommaSeparatedToIntegerArray.coerce, desc: 'Filter out users with the specified IDs'
use :pagination
end
- get ':id/users', feature_category: :authentication_and_authorization do
+ get ':id/users', urgency: :low, feature_category: :authentication_and_authorization do
users = DeclarativePolicy.subject_scope { user_project.team.users }
users = users.search(params[:search]) if params[:search].present?
users = users.where_not_in(params[:skip_users]) if params[:skip_users].present?
@@ -706,6 +714,17 @@ module API
end
end
+ desc 'Start a task to recalculate repository size for a project' do
+ detail 'This feature was introduced in GitLab 15.0.'
+ end
+ post ':id/repository_size', feature_category: :source_code_management do
+ authorize_admin_project
+
+ user_project.repository.expire_statistics_caches
+
+ ::Projects::UpdateStatisticsService.new(user_project, nil, statistics: [:repository_size, :lfs_objects_size]).execute
+ end
+
desc 'Transfer a project to a new namespace'
params do
requires :namespace, type: String, desc: 'The ID or path of the new namespace'
@@ -729,7 +748,7 @@ module API
params do
requires :id, type: String, desc: 'ID of a project'
end
- get ':id/storage', feature_category: :projects do
+ get ':id/storage', feature_category: :source_code_management do
authenticated_as_admin!
present user_project, with: Entities::ProjectRepositoryStorage, current_user: current_user
diff --git a/lib/api/pypi_packages.rb b/lib/api/pypi_packages.rb
index d4f51beb2e5..f11270457c9 100644
--- a/lib/api/pypi_packages.rb
+++ b/lib/api/pypi_packages.rb
@@ -14,6 +14,7 @@ module API
include ::API::Helpers::Packages::BasicAuthHelpers::Constants
feature_category :package_registry
+ urgency :low
default_format :json
diff --git a/lib/api/release/links.rb b/lib/api/release/links.rb
index 52c73104bb4..bc5ffe5b21f 100644
--- a/lib/api/release/links.rb
+++ b/lib/api/release/links.rb
@@ -11,6 +11,7 @@ module API
before { authorize! :read_release, user_project }
feature_category :release_orchestration
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a project'
diff --git a/lib/api/releases.rb b/lib/api/releases.rb
index 9e085a91a7c..c69f45f1f38 100644
--- a/lib/api/releases.rb
+++ b/lib/api/releases.rb
@@ -9,6 +9,7 @@ module API
RELEASE_CLI_USER_AGENT = 'GitLab-release-cli'
feature_category :release_orchestration
+ urgency :low
params do
requires :id, type: String, desc: 'The ID of a group'
@@ -29,8 +30,6 @@ module API
use :pagination
end
get ":id/releases" do
- not_found! unless Feature.enabled?(:group_releases_finder_inoperator)
-
finder_options = {
sort: params[:sort]
}
diff --git a/lib/api/rubygem_packages.rb b/lib/api/rubygem_packages.rb
index 6ac5ad0518b..e6c54faebd9 100644
--- a/lib/api/rubygem_packages.rb
+++ b/lib/api/rubygem_packages.rb
@@ -8,6 +8,7 @@ module API
helpers ::API::Helpers::PackagesHelpers
feature_category :package_registry
+ urgency :low
# The Marshal version can be found by "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
# Updating the version should require a GitLab API version change.
diff --git a/lib/api/search.rb b/lib/api/search.rb
index 4ef8fef329c..fd4d46cf77d 100644
--- a/lib/api/search.rb
+++ b/lib/api/search.rb
@@ -11,6 +11,7 @@ module API
end
feature_category :global_search
+ urgency :low
rescue_from ActiveRecord::QueryCanceled do |e|
render_api_error!({ error: 'Request timed out' }, 408)
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 774ab472f2d..c25a56d5f08 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -95,6 +95,7 @@ module API
optional :invisible_captcha_enabled, type: Boolean, desc: 'Enable Invisible Captcha spam detection during signup.'
optional :max_artifacts_size, type: Integer, desc: "Set the maximum file size for each job's artifacts"
optional :max_attachment_size, type: Integer, desc: 'Maximum attachment size in MB'
+ optional :max_export_size, type: Integer, desc: 'Maximum export size in MB'
optional :max_import_size, type: Integer, desc: 'Maximum import size in MB'
optional :max_pages_size, type: Integer, desc: 'Maximum size of pages in MB'
optional :metrics_method_call_threshold, type: Integer, desc: 'A method call is only tracked when it takes longer to complete than the given amount of milliseconds.'
@@ -180,6 +181,7 @@ module API
optional :runner_token_expiration_interval, type: Integer, desc: 'Token expiration interval for shared runners, in seconds'
optional :group_runner_token_expiration_interval, type: Integer, desc: 'Token expiration interval for group runners, in seconds'
optional :project_runner_token_expiration_interval, type: Integer, desc: 'Token expiration interval for project runners, in seconds'
+ optional :pipeline_limit_per_project_user_sha, type: Integer, desc: "Maximum number of pipeline creation requests allowed per minute per user and commit. Set to 0 for unlimited requests per minute."
Gitlab::SSHPublicKey.supported_types.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/api/sidekiq_metrics.rb b/lib/api/sidekiq_metrics.rb
index c30b9d7583a..bca1376d489 100644
--- a/lib/api/sidekiq_metrics.rb
+++ b/lib/api/sidekiq_metrics.rb
@@ -10,7 +10,8 @@ module API
helpers do
def queue_metrics
- Sidekiq::Queue.all.each_with_object({}) do |queue, hash|
+ ::Gitlab::SidekiqConfig.routing_queues.each_with_object({}) do |queue_name, hash|
+ queue = Sidekiq::Queue.new(queue_name)
hash[queue.name] = {
backlog: queue.size,
latency: queue.latency.to_i
diff --git a/lib/api/terraform/modules/v1/packages.rb b/lib/api/terraform/modules/v1/packages.rb
index 797b4aad033..8da77ba18ae 100644
--- a/lib/api/terraform/modules/v1/packages.rb
+++ b/lib/api/terraform/modules/v1/packages.rb
@@ -22,6 +22,7 @@ module API
}.freeze
feature_category :infrastructure_as_code
+ urgency :low
after_validation do
require_packages_enabled!
diff --git a/lib/api/terraform/state.rb b/lib/api/terraform/state.rb
index 29e71611092..7b111451b9f 100644
--- a/lib/api/terraform/state.rb
+++ b/lib/api/terraform/state.rb
@@ -8,6 +8,7 @@ module API
include ::Gitlab::Utils::StrongMemoize
feature_category :infrastructure_as_code
+ urgency :low
default_format :json
diff --git a/lib/api/terraform/state_version.rb b/lib/api/terraform/state_version.rb
index d3680323b9f..ca37c786666 100644
--- a/lib/api/terraform/state_version.rb
+++ b/lib/api/terraform/state_version.rb
@@ -6,6 +6,7 @@ module API
default_format :json
feature_category :infrastructure_as_code
+ urgency :low
before do
authenticate!
diff --git a/lib/api/todos.rb b/lib/api/todos.rb
index 1bc3e25a46c..f1779df7cc6 100644
--- a/lib/api/todos.rb
+++ b/lib/api/todos.rb
@@ -7,6 +7,7 @@ module API
before { authenticate! }
feature_category :team_planning
+ urgency :low
ISSUABLE_TYPES = {
'merge_requests' => ->(iid) { find_merge_request_with_access(iid) },
diff --git a/lib/api/topics.rb b/lib/api/topics.rb
index e4a1fa2367e..15f79e75be3 100644
--- a/lib/api/topics.rb
+++ b/lib/api/topics.rb
@@ -38,7 +38,8 @@ module API
success Entities::Projects::Topic
end
params do
- requires :name, type: String, desc: 'Name'
+ requires :name, type: String, desc: 'Slug (name)'
+ requires :title, type: String, desc: 'Title'
optional :description, type: String, desc: 'Description'
optional :avatar, type: ::API::Validations::Types::WorkhorseFile, desc: 'Avatar image for topic'
end
@@ -60,7 +61,8 @@ module API
end
params do
requires :id, type: Integer, desc: 'ID of project topic'
- optional :name, type: String, desc: 'Name'
+ optional :name, type: String, desc: 'Slug (name)'
+ optional :title, type: String, desc: 'Title'
optional :description, type: String, desc: 'Description'
optional :avatar, type: ::API::Validations::Types::WorkhorseFile, desc: 'Avatar image for topic'
end
diff --git a/lib/api/unleash.rb b/lib/api/unleash.rb
index 6dadaf4fc54..37fe540cde1 100644
--- a/lib/api/unleash.rb
+++ b/lib/api/unleash.rb
@@ -30,7 +30,7 @@ module API
end
desc 'Get a list of features'
- get 'client/features', urgency: :medium do
+ get 'client/features' do
present :version, 1
present :features, feature_flags, with: ::API::Entities::UnleashFeature
end
diff --git a/lib/api/usage_data.rb b/lib/api/usage_data.rb
index 43c75206b88..6e81a578d4a 100644
--- a/lib/api/usage_data.rb
+++ b/lib/api/usage_data.rb
@@ -8,7 +8,7 @@ module API
namespace 'usage_data' do
before do
- not_found! unless Feature.enabled?(:usage_data_api, default_enabled: :yaml, type: :ops)
+ not_found! unless Feature.enabled?(:usage_data_api, type: :ops)
forbidden!('Invalid CSRF token is provided') unless verified_request?
end
@@ -40,7 +40,7 @@ module API
desc 'Get a list of all metric definitions' do
detail 'This feature was introduced in GitLab 13.11.'
end
- get 'metric_definitions' do
+ get 'metric_definitions', urgency: :low do
content_type 'application/yaml'
env['api.format'] = :binary
diff --git a/lib/api/usage_data_non_sql_metrics.rb b/lib/api/usage_data_non_sql_metrics.rb
index 983038e0263..41f369a43b8 100644
--- a/lib/api/usage_data_non_sql_metrics.rb
+++ b/lib/api/usage_data_non_sql_metrics.rb
@@ -5,10 +5,11 @@ module API
before { authenticated_as_admin! }
feature_category :service_ping
+ urgency :low
namespace 'usage_data' do
before do
- not_found! unless Feature.enabled?(:usage_data_non_sql_metrics, default_enabled: :yaml, type: :ops)
+ not_found! unless Feature.enabled?(:usage_data_non_sql_metrics, type: :ops)
end
desc 'Get Non SQL usage ping metrics' do
diff --git a/lib/api/usage_data_queries.rb b/lib/api/usage_data_queries.rb
index 3432e71eb28..fe972942111 100644
--- a/lib/api/usage_data_queries.rb
+++ b/lib/api/usage_data_queries.rb
@@ -5,10 +5,11 @@ module API
before { authenticated_as_admin! }
feature_category :service_ping
+ urgency :low
namespace 'usage_data' do
before do
- not_found! unless Feature.enabled?(:usage_data_queries_api, default_enabled: :yaml, type: :ops)
+ not_found! unless Feature.enabled?(:usage_data_queries_api, type: :ops)
end
desc 'Get raw SQL queries for usage data SQL metrics' do
diff --git a/lib/api/user_counts.rb b/lib/api/user_counts.rb
index e5dfac3b1a1..756901c5717 100644
--- a/lib/api/user_counts.rb
+++ b/lib/api/user_counts.rb
@@ -19,7 +19,7 @@ module API
todos: current_user.todos_pending_count
}
- if Feature.enabled?(:mr_attention_requests, default_enabled: :yaml)
+ if current_user&.mr_attention_requests_enabled?
counts[:attention_requests] = current_user.attention_requested_open_merge_requests_count
end
diff --git a/lib/api/users.rb b/lib/api/users.rb
index b26611cfe03..b10458c4358 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -10,6 +10,8 @@ module API
feature_category :users, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
+ urgency :high, ['/users/:id/custom_attributes', '/users/:id/custom_attributes/:key']
+
resource :users, requirements: { uid: /[0-9]*/, id: /[0-9]*/ } do
include CustomAttributesEndpoints
@@ -99,7 +101,7 @@ module API
use :optional_index_params_ee
end
# rubocop: disable CodeReuse/ActiveRecord
- get feature_category: :users, urgency: :default do
+ get feature_category: :users, urgency: :low do
authenticated_as_admin! if params[:extern_uid].present? && params[:provider].present?
unless current_user&.admin?
@@ -781,7 +783,7 @@ module API
optional :type, type: String, values: %w[Project Namespace]
use :pagination
end
- get ":user_id/memberships", feature_category: :users do
+ get ":user_id/memberships", feature_category: :users, urgency: :high do
authenticated_as_admin!
user = find_user_by_id(params)
@@ -1078,7 +1080,7 @@ module API
params do
use :pagination
end
- get "emails", feature_category: :users do
+ get "emails", feature_category: :users, urgency: :high do
present paginate(current_user.emails), with: Entities::Email
end
@@ -1120,7 +1122,7 @@ module API
optional :show_whitespace_in_diffs, type: Boolean, desc: 'Flag indicating the user sees whitespace changes in diffs'
at_least_one_of :view_diffs_file_by_file, :show_whitespace_in_diffs
end
- put "preferences", feature_category: :users do
+ put "preferences", feature_category: :users, urgency: :high do
authenticate!
preferences = current_user.user_preference
diff --git a/lib/atlassian/jira_connect/asymmetric_jwt.rb b/lib/atlassian/jira_connect/asymmetric_jwt.rb
deleted file mode 100644
index a5668701965..00000000000
--- a/lib/atlassian/jira_connect/asymmetric_jwt.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-module Atlassian
- module JiraConnect
- # See documentation about Atlassian asymmetric JWT verification:
- # https://developer.atlassian.com/cloud/jira/platform/understanding-jwt-for-connect-apps/#verifying-a-asymmetric-jwt-token-for-install-callbacks
-
- class AsymmetricJwt
- include Gitlab::Utils::StrongMemoize
-
- KeyFetchError = Class.new(StandardError)
-
- ALGORITHM = 'RS256'
- PUBLIC_KEY_CDN_URL = 'https://connect-install-keys.atlassian.com/'
- UUID4_REGEX = /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/.freeze
-
- def initialize(token, verification_claims)
- @token = token
- @verification_claims = verification_claims
- end
-
- def valid?
- claims.present? && claims['qsh'] == verification_qsh
- end
-
- def iss_claim
- return unless claims
-
- claims['iss']
- end
-
- private
-
- def claims
- strong_memoize(:claims) do
- _, jwt_headers = decode_token
- public_key = retrieve_public_key(jwt_headers['kid'])
- decoded_claims, _ = decode_token(public_key, true, **relevant_claims, verify_aud: true, verify_iss: true, algorithm: ALGORITHM)
-
- decoded_claims
- rescue JWT::DecodeError, OpenSSL::PKey::PKeyError, KeyFetchError
- end
- end
-
- def decode_token(key = nil, verify = false, **claims)
- Atlassian::Jwt.decode(@token, key, verify, **claims)
- end
-
- def retrieve_public_key(key_id)
- raise KeyFetchError unless UUID4_REGEX.match?(key_id)
-
- public_key = Gitlab::HTTP.try_get(PUBLIC_KEY_CDN_URL + key_id).try(:body)
-
- raise KeyFetchError if public_key.blank?
-
- OpenSSL::PKey.read(public_key)
- end
-
- def relevant_claims
- @verification_claims.slice(:aud, :iss)
- end
-
- def verification_qsh
- @verification_claims[:qsh]
- end
- end
- end
-end
diff --git a/lib/atlassian/jira_connect/jwt/asymmetric.rb b/lib/atlassian/jira_connect/jwt/asymmetric.rb
new file mode 100644
index 00000000000..0611a17c005
--- /dev/null
+++ b/lib/atlassian/jira_connect/jwt/asymmetric.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+module Atlassian
+ module JiraConnect
+ module Jwt
+ # See documentation about Atlassian asymmetric JWT verification:
+ # https://developer.atlassian.com/cloud/jira/platform/understanding-jwt-for-connect-apps/#verifying-a-asymmetric-jwt-token-for-install-callbacks
+
+ class Asymmetric
+ include Gitlab::Utils::StrongMemoize
+
+ KeyFetchError = Class.new(StandardError)
+
+ ALGORITHM = 'RS256'
+ PUBLIC_KEY_CDN_URL = 'https://connect-install-keys.atlassian.com/'
+ UUID4_REGEX = /\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/.freeze
+
+ def initialize(token, verification_claims)
+ @token = token
+ @verification_claims = verification_claims
+ end
+
+ def valid?
+ claims.present? && claims['qsh'] == verification_qsh
+ end
+
+ def iss_claim
+ return unless claims
+
+ claims['iss']
+ end
+
+ private
+
+ def claims
+ strong_memoize(:claims) do
+ _, jwt_headers = decode_token
+ public_key = retrieve_public_key(jwt_headers['kid'])
+
+ decoded_claims(public_key)
+ rescue JWT::DecodeError, OpenSSL::PKey::PKeyError, KeyFetchError
+ end
+ end
+
+ def decoded_claims(public_key)
+ decode_token(
+ public_key,
+ true,
+ **relevant_claims,
+ verify_aud: true,
+ verify_iss: true,
+ algorithm: ALGORITHM
+ ).first
+ end
+
+ def decode_token(key = nil, verify = false, **claims)
+ Atlassian::Jwt.decode(@token, key, verify, **claims)
+ end
+
+ def retrieve_public_key(key_id)
+ raise KeyFetchError unless UUID4_REGEX.match?(key_id)
+
+ public_key = Gitlab::HTTP.try_get(PUBLIC_KEY_CDN_URL + key_id).try(:body)
+
+ raise KeyFetchError if public_key.blank?
+
+ OpenSSL::PKey.read(public_key)
+ end
+
+ def relevant_claims
+ @verification_claims.slice(:aud, :iss)
+ end
+
+ def verification_qsh
+ @verification_claims[:qsh]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/atlassian/jira_connect/jwt/symmetric.rb b/lib/atlassian/jira_connect/jwt/symmetric.rb
new file mode 100644
index 00000000000..61e5bd923a4
--- /dev/null
+++ b/lib/atlassian/jira_connect/jwt/symmetric.rb
@@ -0,0 +1,55 @@
+# frozen_string_literal: true
+
+module Atlassian
+ module JiraConnect
+ module Jwt
+ class Symmetric
+ include Gitlab::Utils::StrongMemoize
+
+ CONTEXT_QSH_STRING = 'context-qsh'
+
+ def initialize(jwt)
+ @jwt = jwt
+ end
+
+ def iss_claim
+ jwt_headers['iss']
+ end
+
+ def sub_claim
+ jwt_headers['sub']
+ end
+
+ def valid?(shared_secret)
+ Atlassian::Jwt.decode(@jwt, shared_secret).present?
+ rescue JWT::DecodeError
+ false
+ end
+
+ def verify_qsh_claim(url_with_query, method, url)
+ qsh_claim == Atlassian::Jwt.create_query_string_hash(url_with_query, method, url)
+ rescue StandardError
+ false
+ end
+
+ def verify_context_qsh_claim
+ qsh_claim == CONTEXT_QSH_STRING
+ end
+
+ private
+
+ def qsh_claim
+ jwt_headers['qsh']
+ end
+
+ def jwt_headers
+ strong_memoize(:jwt_headers) do
+ Atlassian::Jwt.decode(@jwt, nil, false).first
+ rescue JWT::DecodeError
+ {}
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/backup/gitaly_backup.rb b/lib/backup/gitaly_backup.rb
index 93342e789e9..a8b0e7ad157 100644
--- a/lib/backup/gitaly_backup.rb
+++ b/lib/backup/gitaly_backup.rb
@@ -31,7 +31,7 @@ module Backup
args = []
args += ['-parallel', @max_parallelism.to_s] if @max_parallelism
args += ['-parallel-storage', @storage_parallelism.to_s] if @storage_parallelism
- if Feature.enabled?(:incremental_repository_backup, default_enabled: :yaml)
+ if Feature.enabled?(:incremental_repository_backup)
args += ['-layout', 'pointer']
if type == :create
args += ['-incremental'] if @incremental
diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb
index 403b2d9f16c..0991177d044 100644
--- a/lib/backup/manager.rb
+++ b/lib/backup/manager.rb
@@ -9,6 +9,11 @@ module Backup
# if some of these files are still there, we don't need them in the backup
LEGACY_PAGES_TMP_PATH = '@pages.tmp'
+ LIST_ENVS = {
+ skipped: 'SKIP',
+ repositories_storages: 'REPOSITORIES_STORAGES'
+ }.freeze
+
TaskDefinition = Struct.new(
:enabled, # `true` if the task can be used. Treated as `true` when not specified.
:human_name, # Name of the task used for logging.
@@ -29,20 +34,23 @@ module Backup
@progress = progress
@incremental = Feature.feature_flags_available? &&
- Feature.enabled?(:incremental_repository_backup, default_enabled: :yaml) &&
+ Feature.enabled?(:incremental_repository_backup) &&
Gitlab::Utils.to_boolean(ENV['INCREMENTAL'], default: false)
- @definitions = definitions || build_definitions
+ @definitions = definitions
end
def create
if incremental?
- unpack
+ unpack(ENV.fetch('PREVIOUS_BACKUP', ENV['BACKUP']))
read_backup_information
verify_backup_version
+ update_backup_information
end
- @definitions.keys.each do |task_name|
+ build_backup_information
+
+ definitions.keys.each do |task_name|
run_create_task(task_name)
end
@@ -64,10 +72,10 @@ module Backup
end
def run_create_task(task_name)
- definition = @definitions[task_name]
-
build_backup_information
+ definition = definitions[task_name]
+
unless definition.enabled?
puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "[DISABLED]".color(:cyan)
return
@@ -79,7 +87,7 @@ module Backup
end
puts_time "Dumping #{definition.human_name} ... ".color(:blue)
- definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path), backup_id)
+ definition.task.dump(File.join(Gitlab.config.backup.path, definition.destination_path), full_backup_id)
puts_time "Dumping #{definition.human_name} ... ".color(:blue) + "done".color(:green)
rescue Backup::DatabaseBackupError, Backup::FileBackupError => e
@@ -87,11 +95,11 @@ module Backup
end
def restore
- cleanup_required = unpack
+ cleanup_required = unpack(ENV['BACKUP'])
read_backup_information
verify_backup_version
- @definitions.keys.each do |task_name|
+ definitions.keys.each do |task_name|
run_restore_task(task_name) if !skipped?(task_name) && enabled_task?(task_name)
end
@@ -110,7 +118,9 @@ module Backup
end
def run_restore_task(task_name)
- definition = @definitions[task_name]
+ read_backup_information
+
+ definition = definitions[task_name]
unless definition.enabled?
puts_time "Restoring #{definition.human_name} ... ".color(:blue) + "[DISABLED]".color(:cyan)
@@ -142,6 +152,10 @@ module Backup
private
+ def definitions
+ @definitions ||= build_definitions
+ end
+
def build_definitions
{
'db' => TaskDefinition.new(
@@ -211,7 +225,7 @@ module Backup
max_storage_concurrency = ENV['GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY'].presence
strategy = Backup::GitalyBackup.new(progress, incremental: incremental?, max_parallelism: max_concurrency, storage_parallelism: max_storage_concurrency)
- Repositories.new(progress, strategy: strategy)
+ Repositories.new(progress, strategy: strategy, storages: repositories_storages)
end
def build_files_task(app_files_dir, excludes: [])
@@ -244,10 +258,24 @@ module Backup
gitlab_version: Gitlab::VERSION,
tar_version: tar_version,
installation_type: Gitlab::INSTALLATION_TYPE,
- skipped: ENV["SKIP"]
+ skipped: ENV['SKIP'],
+ repositories_storages: ENV['REPOSITORIES_STORAGES']
}
end
+ def update_backup_information
+ @backup_information.merge!(
+ full_backup_id: full_backup_id,
+ db_version: ActiveRecord::Migrator.current_version.to_s,
+ backup_created_at: Time.zone.now,
+ gitlab_version: Gitlab::VERSION,
+ tar_version: tar_version,
+ installation_type: Gitlab::INSTALLATION_TYPE,
+ skipped: list_env(:skipped).join(','),
+ repositories_storages: list_env(:repositories_storages).join(',')
+ )
+ end
+
def backup_information
raise Backup::Error, "#{MANIFEST_NAME} not yet loaded" unless @backup_information
@@ -297,7 +325,7 @@ module Backup
puts_time "Deleting tar staging files ... ".color(:blue)
remove_backup_path(MANIFEST_NAME)
- @definitions.each do |_, definition|
+ definitions.each do |_, definition|
remove_backup_path(definition.cleanup_path || definition.destination_path)
end
@@ -374,8 +402,8 @@ module Backup
end
end
- def unpack
- if ENV['BACKUP'].blank? && non_tarred_backup?
+ def unpack(source_backup_id)
+ if source_backup_id.blank? && non_tarred_backup?
puts_time "Non tarred backup found in #{backup_path}, using that"
return false
@@ -387,14 +415,14 @@ module Backup
puts_time "No backups found in #{backup_path}"
puts_time "Please make sure that file name ends with #{FILE_NAME_SUFFIX}"
exit 1
- elsif backup_file_list.many? && ENV["BACKUP"].nil?
+ elsif backup_file_list.many? && source_backup_id.nil?
puts_time 'Found more than one backup:'
# print list of available backups
puts_time " " + available_timestamps.join("\n ")
if incremental?
puts_time 'Please specify which one you want to create an incremental backup for:'
- puts_time 'rake gitlab:backup:create INCREMENTAL=true BACKUP=timestamp_of_backup'
+ puts_time 'rake gitlab:backup:create INCREMENTAL=true PREVIOUS_BACKUP=timestamp_of_backup'
else
puts_time 'Please specify which one you want to restore:'
puts_time 'rake gitlab:backup:restore BACKUP=timestamp_of_backup'
@@ -403,8 +431,8 @@ module Backup
exit 1
end
- tar_file = if ENV['BACKUP'].present?
- File.basename(ENV['BACKUP']) + FILE_NAME_SUFFIX
+ tar_file = if source_backup_id.present?
+ File.basename(source_backup_id) + FILE_NAME_SUFFIX
else
backup_file_list.first
end
@@ -431,12 +459,26 @@ module Backup
end
def skipped?(item)
- ENV.fetch('SKIP', '').include?(item) ||
- backup_information[:skipped] && backup_information[:skipped].include?(item)
+ skipped.include?(item)
+ end
+
+ def skipped
+ @skipped ||= list_env(:skipped)
+ end
+
+ def repositories_storages
+ @repositories_storages ||= list_env(:repositories_storages)
+ end
+
+ def list_env(name)
+ list = ENV.fetch(LIST_ENVS[name], '').split(',')
+ list += backup_information[name].split(',') if backup_information[name]
+ list.uniq!
+ list
end
def enabled_task?(task_name)
- @definitions[task_name].enabled?
+ definitions[task_name].enabled?
end
def backup_file?(file)
@@ -491,7 +533,7 @@ module Backup
end
def backup_contents
- [MANIFEST_NAME] + @definitions.reject do |name, definition|
+ [MANIFEST_NAME] + definitions.reject do |name, definition|
skipped?(name) || !enabled_task?(name) ||
(definition.destination_optional && !File.exist?(File.join(backup_path, definition.destination_path)))
end.values.map(&:destination_path)
@@ -501,12 +543,19 @@ module Backup
@tar_file ||= "#{backup_id}#{FILE_NAME_SUFFIX}"
end
+ def full_backup_id
+ full_backup_id = backup_information[:full_backup_id]
+ full_backup_id ||= File.basename(ENV['PREVIOUS_BACKUP']) if ENV['PREVIOUS_BACKUP'].present?
+ full_backup_id ||= backup_id
+ full_backup_id
+ end
+
def backup_id
- @backup_id ||= if ENV['BACKUP'].present?
- File.basename(ENV['BACKUP'])
- else
- "#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}"
- end
+ if ENV['BACKUP'].present?
+ File.basename(ENV['BACKUP'])
+ else
+ "#{backup_information[:backup_created_at].strftime('%s_%Y_%m_%d_')}#{backup_information[:gitlab_version]}"
+ end
end
def create_attributes
diff --git a/lib/backup/repositories.rb b/lib/backup/repositories.rb
index 11bed84e356..4a31e87b969 100644
--- a/lib/backup/repositories.rb
+++ b/lib/backup/repositories.rb
@@ -6,10 +6,11 @@ module Backup
class Repositories < Task
extend ::Gitlab::Utils::Override
- def initialize(progress, strategy:)
+ def initialize(progress, strategy:, storages: [])
super(progress)
@strategy = strategy
+ @storages = storages
end
override :dump
@@ -35,7 +36,7 @@ module Backup
private
- attr_reader :strategy
+ attr_reader :strategy, :storages
def enqueue_consecutive
enqueue_consecutive_projects
@@ -49,7 +50,7 @@ module Backup
end
def enqueue_consecutive_snippets
- Snippet.find_each(batch_size: 1000) { |snippet| enqueue_snippet(snippet) }
+ snippet_relation.find_each(batch_size: 1000) { |snippet| enqueue_snippet(snippet) }
end
def enqueue_project(project)
@@ -63,7 +64,15 @@ module Backup
end
def project_relation
- Project.includes(:route, :group, namespace: :owner)
+ scope = Project.includes(:route, :group, namespace: :owner)
+ scope = scope.id_in(ProjectRepository.for_repository_storage(storages).select(:project_id)) if storages.any?
+ scope
+ end
+
+ def snippet_relation
+ scope = Snippet.all
+ scope = scope.id_in(SnippetRepository.for_repository_storage(storages).select(:snippet_id)) if storages.any?
+ scope
end
def restore_object_pools
@@ -88,7 +97,7 @@ module Backup
def cleanup_snippets_without_repositories
invalid_snippets = []
- Snippet.find_each(batch_size: 1000).each do |snippet|
+ snippet_relation.find_each(batch_size: 1000).each do |snippet|
response = Snippets::RepositoryValidationService.new(nil, snippet).execute
next if response.success?
diff --git a/lib/banzai/filter/image_lazy_load_filter.rb b/lib/banzai/filter/image_lazy_load_filter.rb
index 916c135b777..a8a275d2039 100644
--- a/lib/banzai/filter/image_lazy_load_filter.rb
+++ b/lib/banzai/filter/image_lazy_load_filter.rb
@@ -4,13 +4,15 @@
module Banzai
module Filter
# HTML filter that moves the value of image `src` attributes to `data-src`
- # so they can be lazy loaded.
+ # so they can be lazy loaded. Also sets decoding to 'async' so that the
+ # decoding of images doesn't block the loading of other content.
class ImageLazyLoadFilter < HTML::Pipeline::Filter
CSS = 'img'
XPATH = Gitlab::Utils::Nokogiri.css_to_xpath(CSS).freeze
def call
doc.xpath(XPATH).each do |img|
+ img['decoding'] = 'async'
img.add_class('lazy')
img['data-src'] = img['src']
img['src'] = LazyImageTagHelper.placeholder_image
diff --git a/lib/banzai/filter/references/abstract_reference_filter.rb b/lib/banzai/filter/references/abstract_reference_filter.rb
index a34519799d5..521fd7bf4cc 100644
--- a/lib/banzai/filter/references/abstract_reference_filter.rb
+++ b/lib/banzai/filter/references/abstract_reference_filter.rb
@@ -206,6 +206,7 @@ module Banzai
link_content: !!link_content,
link_reference: link_reference)
data_attributes[:reference_format] = matches[:format] if matches.names.include?("format")
+ data_attributes.merge!(additional_object_attributes(object))
data = data_attribute(data_attributes)
@@ -294,6 +295,10 @@ module Banzai
placeholder_data[Regexp.last_match(1).to_i]
end
end
+
+ def additional_object_attributes(object)
+ {}
+ end
end
end
end
diff --git a/lib/banzai/filter/references/issue_reference_filter.rb b/lib/banzai/filter/references/issue_reference_filter.rb
index 1053501de7b..337075b7ff8 100644
--- a/lib/banzai/filter/references/issue_reference_filter.rb
+++ b/lib/banzai/filter/references/issue_reference_filter.rb
@@ -31,6 +31,10 @@ module Banzai
private
+ def additional_object_attributes(issue)
+ { issue_type: issue.issue_type }
+ end
+
def issue_path(issue, project)
Gitlab::Routing.url_helpers.namespace_project_issue_path(namespace_id: project.namespace, project_id: project, id: issue.iid)
end
diff --git a/lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb b/lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb
new file mode 100644
index 00000000000..01ee3f5d9e8
--- /dev/null
+++ b/lib/banzai/pipeline/incident_management/timeline_event_pipeline.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Banzai
+ module Pipeline
+ module IncidentManagement
+ class TimelineEventPipeline < PlainMarkdownPipeline
+ ALLOWLIST = Banzai::Filter::SanitizationFilter::LIMITED.deep_dup.merge(
+ elements: %w(p b i strong em pre code a img)
+ ).freeze
+
+ def self.filters
+ @filters ||= FilterArray[
+ *super,
+ *Banzai::Pipeline::GfmPipeline.reference_filters,
+ Filter::EmojiFilter,
+ Filter::SanitizationFilter,
+ Filter::ExternalLinkFilter,
+ Filter::ImageLinkFilter
+ ]
+ end
+
+ def self.transform_context(context)
+ Filter::AssetProxyFilter.transform_context(context).merge(
+ only_path: true,
+ no_sourcepos: true,
+ allowlist: ALLOWLIST,
+ link_replaces_image: true
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bitbucket/representation/repo.rb b/lib/bitbucket/representation/repo.rb
index fa4780dd8de..8d5b15e299a 100644
--- a/lib/bitbucket/representation/repo.rb
+++ b/lib/bitbucket/representation/repo.rb
@@ -3,10 +3,6 @@
module Bitbucket
module Representation
class Repo < Representation::Base
- def initialize(raw)
- super(raw)
- end
-
def owner_and_slug
@owner_and_slug ||= full_name.split('/', 2)
end
diff --git a/lib/bitbucket_server/representation/repo.rb b/lib/bitbucket_server/representation/repo.rb
index 4cd5b75bbed..a3c5f387941 100644
--- a/lib/bitbucket_server/representation/repo.rb
+++ b/lib/bitbucket_server/representation/repo.rb
@@ -3,10 +3,6 @@
module BitbucketServer
module Representation
class Repo < Representation::Base
- def initialize(raw)
- super(raw)
- end
-
def project_key
raw.dig('project', 'key')
end
diff --git a/lib/bulk_imports/common/extractors/json_extractor.rb b/lib/bulk_imports/common/extractors/json_extractor.rb
new file mode 100644
index 00000000000..45a48cedce8
--- /dev/null
+++ b/lib/bulk_imports/common/extractors/json_extractor.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Common
+ module Extractors
+ class JsonExtractor
+ def initialize(relation:)
+ @relation = relation
+ @tmpdir = Dir.mktmpdir
+ end
+
+ def extract(context)
+ download_service(context).execute
+ decompression_service.execute
+
+ attributes = ndjson_reader.consume_attributes(relation)
+
+ BulkImports::Pipeline::ExtractedData.new(data: attributes)
+ end
+
+ def remove_tmpdir
+ FileUtils.remove_entry(tmpdir) if Dir.exist?(tmpdir)
+ end
+
+ private
+
+ attr_reader :relation, :tmpdir
+
+ def filename
+ "#{relation}.json.gz"
+ end
+
+ def download_service(context)
+ @download_service ||= BulkImports::FileDownloadService.new(
+ configuration: context.configuration,
+ relative_url: context.entity.relation_download_url_path(relation),
+ tmpdir: tmpdir,
+ filename: filename
+ )
+ end
+
+ def decompression_service
+ @decompression_service ||= BulkImports::FileDecompressionService.new(tmpdir: tmpdir, filename: filename)
+ end
+
+ def ndjson_reader
+ @ndjson_reader ||= Gitlab::ImportExport::Json::NdjsonReader.new(tmpdir)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/common/pipelines/entity_finisher.rb b/lib/bulk_imports/common/pipelines/entity_finisher.rb
index 0f4def3b17a..915dcf1b455 100644
--- a/lib/bulk_imports/common/pipelines/entity_finisher.rb
+++ b/lib/bulk_imports/common/pipelines/entity_finisher.rb
@@ -4,7 +4,7 @@ module BulkImports
module Common
module Pipelines
class EntityFinisher
- def self.ndjson_pipeline?
+ def self.file_extraction_pipeline?
false
end
diff --git a/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb b/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb
new file mode 100644
index 00000000000..d4f5901e971
--- /dev/null
+++ b/lib/bulk_imports/groups/pipelines/group_attributes_pipeline.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Pipelines
+ class GroupAttributesPipeline
+ include Pipeline
+
+ file_extraction_pipeline!
+
+ relation_name BulkImports::FileTransfer::BaseConfig::SELF_RELATION
+
+ extractor ::BulkImports::Common::Extractors::JsonExtractor, relation: relation
+
+ transformer ::BulkImports::Common::Transformers::ProhibitedAttributesTransformer
+
+ def transform(_context, data)
+ return unless data
+
+ data.symbolize_keys.slice(:membership_lock)
+ end
+
+ def load(_context, data)
+ return unless data
+
+ ::Groups::UpdateService.new(portable, current_user, data).execute
+ end
+
+ def after_run(_context)
+ extractor.remove_tmpdir
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb b/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb
new file mode 100644
index 00000000000..1bd6486b413
--- /dev/null
+++ b/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Groups
+ module Pipelines
+ class NamespaceSettingsPipeline
+ include Pipeline
+
+ file_extraction_pipeline!
+
+ relation_name 'namespace_settings'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+
+ transformer ::BulkImports::Common::Transformers::ProhibitedAttributesTransformer
+
+ def transform(_context, data)
+ return unless data
+
+ data.first.symbolize_keys.slice(*allowed_attributes)
+ end
+
+ def load(_context, data)
+ return unless data
+
+ ::Groups::UpdateService.new(portable, current_user, data).execute
+ end
+
+ def after_run(_context)
+ extractor.remove_tmpdir
+ end
+
+ private
+
+ def allowed_attributes
+ Gitlab::ImportExport::Config.new(
+ config: Gitlab::ImportExport.group_config_file
+ ).to_h.dig(:included_attributes, :namespace_settings)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/groups/stage.rb b/lib/bulk_imports/groups/stage.rb
index 97a423b6ea9..c4db53424fd 100644
--- a/lib/bulk_imports/groups/stage.rb
+++ b/lib/bulk_imports/groups/stage.rb
@@ -11,10 +11,18 @@ module BulkImports
pipeline: BulkImports::Groups::Pipelines::GroupPipeline,
stage: 0
},
+ group_attributes: {
+ pipeline: BulkImports::Groups::Pipelines::GroupAttributesPipeline,
+ stage: 1
+ },
subgroups: {
pipeline: BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline,
stage: 1
},
+ namespace_settings: {
+ pipeline: BulkImports::Groups::Pipelines::NamespaceSettingsPipeline,
+ stage: 1
+ },
members: {
pipeline: BulkImports::Common::Pipelines::MembersPipeline,
stage: 1
@@ -69,9 +77,9 @@ module BulkImports
if destination_namespace.present?
root_ancestor = Namespace.find_by_full_path(destination_namespace)&.root_ancestor
- ::Feature.enabled?(:bulk_import_projects, root_ancestor, default_enabled: :yaml)
+ ::Feature.enabled?(:bulk_import_projects, root_ancestor)
else
- ::Feature.enabled?(:bulk_import_projects, default_enabled: :yaml)
+ ::Feature.enabled?(:bulk_import_projects)
end
end
end
diff --git a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
index 23e898a7bb2..df27275b664 100644
--- a/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/group_attributes_transformer.rb
@@ -8,7 +8,6 @@ module BulkImports
import_entity = context.entity
data
- .then { |data| transform_name(import_entity, data) }
.then { |data| transform_path(import_entity, data) }
.then { |data| transform_full_path(data) }
.then { |data| transform_parent(context, import_entity, data) }
@@ -19,11 +18,6 @@ module BulkImports
private
- def transform_name(import_entity, data)
- data['name'] = import_entity.destination_name
- data
- end
-
def transform_path(import_entity, data)
data['path'] = import_entity.destination_name.parameterize
data
diff --git a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
index 676a6ca8d2a..d8fb937ecd2 100644
--- a/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
+++ b/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer.rb
@@ -8,7 +8,7 @@ module BulkImports
{
source_type: :group_entity,
source_full_path: entry['full_path'],
- destination_name: entry['name'],
+ destination_name: entry['path'],
destination_namespace: context.entity.group.full_path,
parent_id: context.entity.id
}
diff --git a/lib/bulk_imports/ndjson_pipeline.rb b/lib/bulk_imports/ndjson_pipeline.rb
index d85e51984df..05d724a5e42 100644
--- a/lib/bulk_imports/ndjson_pipeline.rb
+++ b/lib/bulk_imports/ndjson_pipeline.rb
@@ -7,7 +7,7 @@ module BulkImports
include Pipeline
included do
- ndjson_pipeline!
+ file_extraction_pipeline!
def transform(context, data)
return unless data
diff --git a/lib/bulk_imports/pipeline.rb b/lib/bulk_imports/pipeline.rb
index 6798936576b..dc2ebdddd14 100644
--- a/lib/bulk_imports/pipeline.rb
+++ b/lib/bulk_imports/pipeline.rb
@@ -170,12 +170,12 @@ module BulkImports
class_attributes[:abort_on_failure]
end
- def ndjson_pipeline!
- class_attributes[:ndjson_pipeline] = true
+ def file_extraction_pipeline!
+ class_attributes[:file_extraction_pipeline] = true
end
- def ndjson_pipeline?
- class_attributes[:ndjson_pipeline]
+ def file_extraction_pipeline?
+ class_attributes[:file_extraction_pipeline]
end
def relation_name(name)
diff --git a/lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb b/lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb
index 2492a023cbe..1754f27137c 100644
--- a/lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb
+++ b/lib/bulk_imports/projects/pipelines/project_attributes_pipeline.rb
@@ -6,6 +6,10 @@ module BulkImports
class ProjectAttributesPipeline
include Pipeline
+ file_extraction_pipeline!
+
+ relation_name BulkImports::FileTransfer::BaseConfig::SELF_RELATION
+
transformer ::BulkImports::Common::Transformers::ProhibitedAttributesTransformer
def extract(_context)
@@ -55,7 +59,7 @@ module BulkImports
def download_service
@download_service ||= BulkImports::FileDownloadService.new(
configuration: context.configuration,
- relative_url: context.entity.relation_download_url_path(BulkImports::FileTransfer::BaseConfig::SELF_RELATION),
+ relative_url: context.entity.relation_download_url_path(self.class.relation),
tmpdir: tmpdir,
filename: compressed_filename
)
@@ -70,7 +74,7 @@ module BulkImports
end
def filename
- "#{BulkImports::FileTransfer::BaseConfig::SELF_RELATION}.json"
+ "#{self.class.relation}.json"
end
def json_decode(string)
diff --git a/lib/bulk_imports/projects/pipelines/releases_pipeline.rb b/lib/bulk_imports/projects/pipelines/releases_pipeline.rb
new file mode 100644
index 00000000000..8f9c6a5749f
--- /dev/null
+++ b/lib/bulk_imports/projects/pipelines/releases_pipeline.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module BulkImports
+ module Projects
+ module Pipelines
+ class ReleasesPipeline
+ include NdjsonPipeline
+
+ relation_name 'releases'
+
+ extractor ::BulkImports::Common::Extractors::NdjsonExtractor, relation: relation
+ end
+ end
+ end
+end
diff --git a/lib/bulk_imports/projects/stage.rb b/lib/bulk_imports/projects/stage.rb
index b920c1bf355..229df9c410d 100644
--- a/lib/bulk_imports/projects/stage.rb
+++ b/lib/bulk_imports/projects/stage.rb
@@ -63,10 +63,6 @@ module BulkImports
pipeline: BulkImports::Projects::Pipelines::ProtectedBranchesPipeline,
stage: 4
},
- ci_pipelines: {
- pipeline: BulkImports::Projects::Pipelines::CiPipelinesPipeline,
- stage: 4
- },
project_feature: {
pipeline: BulkImports::Projects::Pipelines::ProjectFeaturePipeline,
stage: 4
@@ -79,6 +75,14 @@ module BulkImports
pipeline: BulkImports::Projects::Pipelines::ServiceDeskSettingPipeline,
stage: 4
},
+ releases: {
+ pipeline: BulkImports::Projects::Pipelines::ReleasesPipeline,
+ stage: 4
+ },
+ ci_pipelines: {
+ pipeline: BulkImports::Projects::Pipelines::CiPipelinesPipeline,
+ stage: 5
+ },
wiki: {
pipeline: BulkImports::Common::Pipelines::WikiPipeline,
stage: 5
diff --git a/lib/constraints/feature_constrainer.rb b/lib/constraints/feature_constrainer.rb
deleted file mode 100644
index cd246cf37a4..00000000000
--- a/lib/constraints/feature_constrainer.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Constraints
- class FeatureConstrainer
- attr_reader :args
-
- def initialize(*args)
- @args = args
- end
-
- def matches?(_request)
- Feature.enabled?(*args)
- end
- end
-end
diff --git a/lib/container_registry/base_client.rb b/lib/container_registry/base_client.rb
index bb9422ae048..66bc934d1ef 100644
--- a/lib/container_registry/base_client.rb
+++ b/lib/container_registry/base_client.rb
@@ -31,9 +31,6 @@ module ContainerRegistry
end
}.freeze
- # Taken from: FaradayMiddleware::FollowRedirects
- REDIRECT_CODES = Set.new [301, 302, 303, 307]
-
class << self
private
@@ -98,23 +95,10 @@ module ContainerRegistry
conn.adapter :net_http
end
- def response_body(response, allow_redirect: false)
- if allow_redirect && REDIRECT_CODES.include?(response.status)
- response = redirect_response(response.headers['location'])
- end
-
+ def response_body(response)
response.body if response && response.success?
end
- def redirect_response(location)
- return unless location
-
- uri = URI(@base_uri).merge(location)
- raise ArgumentError, "Invalid scheme for #{location}" unless %w[http https].include?(uri.scheme)
-
- faraday_redirect.get(uri)
- end
-
def configure_connection(conn)
conn.headers['Accept'] = ACCEPTED_TYPES
@@ -125,18 +109,6 @@ module ContainerRegistry
conn.response :json, content_type: OCI_MANIFEST_V1_TYPE
end
- # Create a new request to make sure the Authorization header is not inserted
- # via the Faraday middleware
- def faraday_redirect
- @faraday_redirect ||= faraday_base do |conn|
- conn.request :json
-
- conn.request(:retry, RETRY_OPTIONS)
- conn.request(:gitlab_error_callback, ERROR_CALLBACK_OPTIONS)
- conn.adapter :net_http
- end
- end
-
def delete_if_exists(path)
result = faraday.delete(path)
diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb
index 4b2250d089d..498bc11b168 100644
--- a/lib/container_registry/client.rb
+++ b/lib/container_registry/client.rb
@@ -130,7 +130,7 @@ module ContainerRegistry
def blob(name, digest, type = nil)
type ||= 'application/octet-stream'
- response_body faraday_blob.get("/v2/#{name}/blobs/#{digest}", nil, 'Accept' => type), allow_redirect: true
+ response_body faraday_blob.get("/v2/#{name}/blobs/#{digest}", nil, 'Accept' => type)
end
def delete_blob(name, digest)
@@ -152,9 +152,7 @@ module ContainerRegistry
@faraday_blob ||= faraday_base do |conn|
initialize_connection(conn, @options)
- if Feature.enabled?(:container_registry_follow_redirects_middleware, default_enabled: :yaml)
- conn.use ::FaradayMiddleware::FollowRedirects, REDIRECT_OPTIONS
- end
+ conn.use ::FaradayMiddleware::FollowRedirects, REDIRECT_OPTIONS
end
end
end
diff --git a/lib/container_registry/migration.rb b/lib/container_registry/migration.rb
index 005ef880034..8377190c83c 100644
--- a/lib/container_registry/migration.rb
+++ b/lib/container_registry/migration.rb
@@ -20,6 +20,8 @@ module ContainerRegistry
delegate :container_registry_import_max_step_duration, to: ::Gitlab::CurrentSettings
delegate :container_registry_import_target_plan, to: ::Gitlab::CurrentSettings
delegate :container_registry_import_created_before, to: ::Gitlab::CurrentSettings
+ delegate :container_registry_pre_import_timeout, to: ::Gitlab::CurrentSettings
+ delegate :container_registry_import_timeout, to: ::Gitlab::CurrentSettings
alias_method :max_tags_count, :container_registry_import_max_tags_count
alias_method :max_retries, :container_registry_import_max_retries
@@ -27,6 +29,8 @@ module ContainerRegistry
alias_method :max_step_duration, :container_registry_import_max_step_duration
alias_method :target_plan_name, :container_registry_import_target_plan
alias_method :created_before, :container_registry_import_created_before
+ alias_method :pre_import_timeout, :container_registry_pre_import_timeout
+ alias_method :import_timeout, :container_registry_import_timeout
end
def self.enabled?
@@ -52,6 +56,8 @@ module ContainerRegistry
#
return 25 if Feature.enabled?(:container_registry_migration_phase2_capacity_25)
return 10 if Feature.enabled?(:container_registry_migration_phase2_capacity_10)
+ return 5 if Feature.enabled?(:container_registry_migration_phase2_capacity_5)
+ return 2 if Feature.enabled?(:container_registry_migration_phase2_capacity_2)
return 1 if Feature.enabled?(:container_registry_migration_phase2_capacity_1)
0
@@ -64,5 +70,13 @@ module ContainerRegistry
def self.all_plans?
Feature.enabled?(:container_registry_migration_phase2_all_plans)
end
+
+ def self.enqueue_twice?
+ Feature.enabled?(:container_registry_migration_phase2_enqueue_twice)
+ end
+
+ def self.enqueuer_loop?
+ Feature.enabled?(:container_registry_migration_phase2_enqueuer_loop)
+ end
end
end
diff --git a/lib/event_filter.rb b/lib/event_filter.rb
index 8833207dd1d..8c3377fdb80 100644
--- a/lib/event_filter.rb
+++ b/lib/event_filter.rb
@@ -15,6 +15,8 @@ class EventFilter
WIKI = 'wiki'
DESIGNS = 'designs'
+ PROJECT_ONLY_EVENT_TYPES = [PUSH, MERGED, TEAM, ISSUE, DESIGNS].freeze
+
def initialize(filter)
# Split using comma to maintain backward compatibility Ex/ "filter1,filter2"
filter = filter.to_s.split(',')[0].to_s
@@ -49,13 +51,15 @@ class EventFilter
# rubocop: disable Metrics/CyclomaticComplexity
# This method build specialized in-operator optimized queries based on different
# filter parameters. All queries will benefit from the index covering the following columns:
- # author_id target_type action id
+ # * author_id target_type action id
+ # * project_id target_type action id
+ # * group_id target_type action id
#
# More context: https://docs.gitlab.com/ee/development/database/efficient_in_operator_queries.html#the-inoperatoroptimization-module
- def in_operator_query_builder_params(user_ids)
+ def in_operator_query_builder_params(array_data)
case filter
when ALL
- in_operator_params(array_scope_ids: user_ids)
+ in_operator_params(array_data: array_data)
when PUSH
# Here we need to add an order hint column to force the correct index usage.
# Without the order hint, the following conditions will use the `index_events_on_author_id_and_id`
@@ -66,25 +70,25 @@ class EventFilter
# to use the correct index:
# > target_type IS NULL AND action = 5 AND author_id = X ORDER BY target_type DESC, id DESC
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.where(target_type: nil).pushed_action,
order_hint_column: :target_type
)
when MERGED
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.where(target_type: MergeRequest.to_s).merged_action
)
when COMMENTS
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.commented_action,
in_column: :target_type,
in_values: [Note, *Note.descendants].map(&:name) # To make the query efficient we need to list all Note classes
)
when TEAM
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.where(target_type: nil),
order_hint_column: :target_type,
in_column: :action,
@@ -92,34 +96,34 @@ class EventFilter
)
when ISSUE
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.where(target_type: Issue.name),
in_column: :action,
in_values: Event.actions.values_at(*Event::ISSUE_ACTIONS)
)
when WIKI
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.for_wiki_page,
in_column: :action,
in_values: Event.actions.values_at(*Event::WIKI_ACTIONS)
)
when DESIGNS
in_operator_params(
- array_scope_ids: user_ids,
+ array_data: array_data,
scope: Event.for_design,
in_column: :action,
in_values: Event.actions.values_at(*Event::DESIGN_ACTIONS)
)
else
- in_operator_params(array_scope_ids: user_ids)
+ in_operator_params(array_data: array_data)
end
end
# rubocop: enable Metrics/CyclomaticComplexity
private
- def in_operator_params(array_scope_ids:, scope: nil, in_column: nil, in_values: nil, order_hint_column: nil)
+ def in_operator_params(array_data:, scope: nil, in_column: nil, in_values: nil, order_hint_column: nil)
base_scope = Event.all
base_scope = base_scope.merge(scope) if scope
@@ -146,8 +150,8 @@ class EventFilter
base_scope = base_scope.reorder(order)
array_params = in_operator_array_params(
- array_scope_ids: array_scope_ids,
scope: base_scope,
+ array_data: array_data,
in_column: in_column,
in_values: in_values
)
@@ -161,22 +165,30 @@ class EventFilter
# This method builds the array_ parameters
# without in_column parameter: uses one IN filter: author_id
# with in_column: two IN filters: author_id, (target_type OR action)
- def in_operator_array_params(scope:, array_scope_ids:, in_column: nil, in_values: nil)
+ # @param array_data [Hash] Must contain the scope_ids, scope_model, mapping_column keys
+ def in_operator_array_params(scope:, array_data:, in_column: nil, in_values: nil)
+ array_scope_ids = array_data[:scope_ids]
+ array_scope_model = array_data[:scope_model]
+ array_mapping_column = array_data[:mapping_column]
+
+ # Adding non-existent record to generate valid SQL if array_scope_ids is empty
+ array_scope_ids << 0 if array_scope_ids.empty?
+
if in_column
- # Builds Carthesian product of the in_values and the array_scope_ids (in this case: user_ids).
+ # Builds Cartesian product of the in_values and the array_scope_ids (in this case: user_ids).
# The process is described here: https://docs.gitlab.com/ee/development/database/efficient_in_operator_queries.html#multiple-in-queries
# VALUES ((array_scope_ids[0], in_values[0]), (array_scope_ids[1], in_values[0]) ...)
cartesian = array_scope_ids.product(in_values)
- user_with_column_list = Arel::Nodes::ValuesList.new(cartesian)
+ column_list = Arel::Nodes::ValuesList.new(cartesian)
as = "array_ids(id, #{Event.connection.quote_column_name(in_column)})"
- from = Arel::Nodes::Grouping.new(user_with_column_list).as(as)
+ from = Arel::Nodes::Grouping.new(column_list).as(as)
{
- array_scope: User.select(:id, in_column).from(from),
- array_mapping_scope: -> (author_id_expression, in_column_expression) do
+ array_scope: array_scope_model.select(:id, in_column).from(from),
+ array_mapping_scope: -> (primary_id_expression, in_column_expression) do
Event
.merge(scope)
- .where(Event.arel_table[:author_id].eq(author_id_expression))
+ .where(Event.arel_table[array_mapping_column].eq(primary_id_expression))
.where(Event.arel_table[in_column].eq(in_column_expression))
end
}
@@ -186,11 +198,11 @@ class EventFilter
array_ids_list = Arel::Nodes::ValuesList.new(array_scope_ids.map { |id| [id] })
from = Arel::Nodes::Grouping.new(array_ids_list).as('array_ids(id)')
{
- array_scope: User.select(:id).from(from),
- array_mapping_scope: -> (author_id_expression) do
+ array_scope: array_scope_model.select(:id).from(from),
+ array_mapping_scope: -> (primary_id_expression) do
Event
.merge(scope)
- .where(Event.arel_table[:author_id].eq(author_id_expression))
+ .where(Event.arel_table[array_mapping_column].eq(primary_id_expression))
end
}
end
diff --git a/lib/feature.rb b/lib/feature.rb
index 47fee23c7ea..b5a97ee8f9b 100644
--- a/lib/feature.rb
+++ b/lib/feature.rb
@@ -42,8 +42,10 @@ class Feature
flipper.features.to_a
end
+ RecursionError = Class.new(RuntimeError)
+
def get(key)
- flipper.feature(key)
+ with_feature(key, &:itself)
end
def persisted_names
@@ -65,34 +67,29 @@ class Feature
persisted_names.include?(feature_name.to_s)
end
- # use `default_enabled: true` to default the flag to being `enabled`
- # unless set explicitly. The default is `disabled`
- # TODO: remove the `default_enabled:` and read it from the `definition_yaml`
- # check: https://gitlab.com/gitlab-org/gitlab/-/issues/30228
- def enabled?(key, thing = nil, type: :development, default_enabled: false)
+ # The default state of feature flag is read from `YAML`:
+ # 1. If feature flag does not have YAML it will fallback to `default_enabled: false`
+ # in production environment, but raise exception in development or tests.
+ # 2. The `default_enabled_if_undefined:` is tech debt related to Gitaly flags
+ # and should not be used outside of Gitaly's `lib/feature/gitaly.rb`
+ def enabled?(key, thing = nil, type: :development, default_enabled_if_undefined: nil)
if check_feature_flags_definition?
if thing && !thing.respond_to?(:flipper_id)
raise InvalidFeatureFlagError,
"The thing '#{thing.class.name}' for feature flag '#{key}' needs to include `FeatureGate` or implement `flipper_id`"
end
- Feature::Definition.valid_usage!(key, type: type, default_enabled: default_enabled)
+ Feature::Definition.valid_usage!(key, type: type)
end
- # If `default_enabled: :yaml` we fetch the value from the YAML definition instead.
- default_enabled = Feature::Definition.default_enabled?(key) if default_enabled == :yaml
-
- # During setup the database does not exist yet. So we haven't stored a value
- # for the feature yet and return the default.
- return default_enabled unless ApplicationRecord.database.exists?
+ default_enabled = Feature::Definition.default_enabled?(key, default_enabled_if_undefined: default_enabled_if_undefined)
- feature = get(key)
+ feature_value = with_feature(key) do |feature|
+ feature_value = current_feature_value(feature, thing, default_enabled: default_enabled)
+ end
- # If we're not default enabling the flag or the feature has been set, always evaluate.
- # `persisted?` can potentially generate DB queries and also checks for inclusion
- # in an array of feature names (177 at last count), possibly reducing performance by half.
- # So we only perform the `persisted` check if `default_enabled: true`
- feature_value = !default_enabled || Feature.persisted_name?(feature.name) ? feature.enabled?(thing) : true
+ # If not yielded, then either recursion is happening, or the database does not exist yet, so use default_enabled.
+ feature_value = default_enabled if feature_value.nil?
# If we don't filter out this flag here we will enter an infinite loop
log_feature_flag_state(key, feature_value) if log_feature_flag_states?(key)
@@ -100,46 +97,46 @@ class Feature
feature_value
end
- def disabled?(key, thing = nil, type: :development, default_enabled: false)
+ def disabled?(key, thing = nil, type: :development, default_enabled_if_undefined: nil)
# we need to make different method calls to make it easy to mock / define expectations in test mode
- thing.nil? ? !enabled?(key, type: type, default_enabled: default_enabled) : !enabled?(key, thing, type: type, default_enabled: default_enabled)
+ thing.nil? ? !enabled?(key, type: type, default_enabled_if_undefined: default_enabled_if_undefined) : !enabled?(key, thing, type: type, default_enabled_if_undefined: default_enabled_if_undefined)
end
def enable(key, thing = true)
log(key: key, action: __method__, thing: thing)
- get(key).enable(thing)
+ with_feature(key) { _1.enable(thing) }
end
def disable(key, thing = false)
log(key: key, action: __method__, thing: thing)
- get(key).disable(thing)
+ with_feature(key) { _1.disable(thing) }
end
def enable_percentage_of_time(key, percentage)
log(key: key, action: __method__, percentage: percentage)
- get(key).enable_percentage_of_time(percentage)
+ with_feature(key) { _1.enable_percentage_of_time(percentage) }
end
def disable_percentage_of_time(key)
log(key: key, action: __method__)
- get(key).disable_percentage_of_time
+ with_feature(key, &:disable_percentage_of_time)
end
def enable_percentage_of_actors(key, percentage)
log(key: key, action: __method__, percentage: percentage)
- get(key).enable_percentage_of_actors(percentage)
+ with_feature(key) { _1.enable_percentage_of_actors(percentage) }
end
def disable_percentage_of_actors(key)
log(key: key, action: __method__)
- get(key).disable_percentage_of_actors
+ with_feature(key, &:disable_percentage_of_actors)
end
def remove(key)
return unless persisted_name?(key)
log(key: key, action: __method__)
- get(key).remove
+ with_feature(key, &:remove)
end
def reset
@@ -181,6 +178,52 @@ class Feature
private
+ # Evaluate if `default enabled: false` or the feature has been persisted.
+ # `persisted_name?` can potentially generate DB queries and also checks for inclusion
+ # in an array of feature names (177 at last count), possibly reducing performance by half.
+ # So we only perform the `persisted` check if `default_enabled: true`
+ def current_feature_value(feature, thing, default_enabled:)
+ return true if default_enabled && !Feature.persisted_name?(feature.name)
+
+ feature.enabled?(thing)
+ end
+
+ # NOTE: it is not safe to call `Flipper::Feature#enabled?` outside the block
+ def with_feature(key)
+ feature = unsafe_get(key)
+ yield feature if feature.present?
+ ensure
+ pop_recursion_stack
+ end
+
+ def unsafe_get(key)
+ # During setup the database does not exist yet. So we haven't stored a value
+ # for the feature yet and return the default.
+ return unless ApplicationRecord.database.exists?
+
+ flag_stack = ::Thread.current[:feature_flag_recursion_check] || []
+ Thread.current[:feature_flag_recursion_check] = flag_stack
+
+ # Prevent more than 10 levels of recursion. This limit was chosen as a fairly
+ # low limit while allowing some nesting of flag evaluation. We have not seen
+ # this limit hit in production.
+ if flag_stack.size > 10
+ Gitlab::ErrorTracking.track_exception(RecursionError.new('deep recursion'), stack: flag_stack)
+ return
+ elsif flag_stack.include?(key)
+ Gitlab::ErrorTracking.track_exception(RecursionError.new('self recursion'), stack: flag_stack)
+ return
+ end
+
+ flag_stack.push(key)
+ flipper.feature(key)
+ end
+
+ def pop_recursion_stack
+ flag_stack = Thread.current[:feature_flag_recursion_check]
+ flag_stack.pop if flag_stack
+ end
+
def flipper
if Gitlab::SafeRequestStore.active?
Gitlab::SafeRequestStore[:flipper] ||= build_flipper_instance(memoize: true)
diff --git a/lib/feature/definition.rb b/lib/feature/definition.rb
index 61f7e395769..1551af730db 100644
--- a/lib/feature/definition.rb
+++ b/lib/feature/definition.rb
@@ -63,19 +63,13 @@ class Feature
end
end
- def valid_usage!(type_in_code:, default_enabled_in_code:)
+ def valid_usage!(type_in_code:)
unless Array(type).include?(type_in_code.to_s)
# Raise exception in test and dev
raise Feature::InvalidFeatureFlagError, "The `type:` of `#{key}` is not equal to config: " \
"#{type_in_code} vs #{type}. Ensure to use valid type in #{path} or ensure that you use " \
"a valid syntax: #{TYPES.dig(type, :example)}"
end
-
- unless default_enabled_in_code == :yaml || default_enabled == default_enabled_in_code
- # Raise exception in test and dev
- raise Feature::InvalidFeatureFlagError, "The `default_enabled:` of `#{key}` is not equal to config: " \
- "#{default_enabled_in_code} vs #{default_enabled}. Ensure to update #{path}"
- end
end
def to_h
@@ -124,9 +118,9 @@ class Feature
feature.force_log_state_changes? || feature.for_upcoming_milestone?
end
- def valid_usage!(key, type:, default_enabled:)
+ def valid_usage!(key, type:)
if definition = get(key)
- definition.valid_usage!(type_in_code: type, default_enabled_in_code: default_enabled)
+ definition.valid_usage!(type_in_code: type)
elsif type_definition = self::TYPES[type]
raise InvalidFeatureFlagError, "Missing feature definition for `#{key}`" unless type_definition[:optional]
else
@@ -134,9 +128,11 @@ class Feature
end
end
- def default_enabled?(key)
+ def default_enabled?(key, default_enabled_if_undefined: nil)
if definition = get(key)
definition.default_enabled
+ elsif !default_enabled_if_undefined.nil?
+ default_enabled_if_undefined
else
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
InvalidFeatureFlagError.new("The feature flag YAML definition for '#{key}' does not exist"))
diff --git a/lib/feature/gitaly.rb b/lib/feature/gitaly.rb
index a1f7dc0ee39..04ed78b8a51 100644
--- a/lib/feature/gitaly.rb
+++ b/lib/feature/gitaly.rb
@@ -8,7 +8,7 @@ class Feature
def enabled?(feature_flag, project = nil)
return false unless Feature::FlipperFeature.table_exists?
- Feature.enabled?("#{PREFIX}#{feature_flag}", project)
+ Feature.enabled?("#{PREFIX}#{feature_flag}", project, type: :undefined, default_enabled_if_undefined: false)
rescue ActiveRecord::NoDatabaseError, PG::ConnectionBad
false
end
diff --git a/lib/feature/shared.rb b/lib/feature/shared.rb
index 2ce078b2f02..40f21fc4f50 100644
--- a/lib/feature/shared.rb
+++ b/lib/feature/shared.rb
@@ -28,8 +28,8 @@ class Feature
},
ops: {
description: "Long-lived feature flags that control operational aspects of GitLab's behavior",
- optional: true,
- rollout_issue: false,
+ optional: false,
+ rollout_issue: true,
ee_only: false,
default_enabled: false,
example: <<-EOS
@@ -37,6 +37,14 @@ class Feature
push_frontend_feature_flag(:my_ops_flag, project, type: :ops)
EOS
},
+ undefined: {
+ description: "Feature flags that are undefined in GitLab codebase (should not be used)",
+ optional: true,
+ rollout_issue: false,
+ ee_only: false,
+ default_enabled: false,
+ example: ''
+ },
experiment: {
description: 'Short lived, used specifically to run A/B/n experiments.',
optional: true,
diff --git a/lib/gitlab/alert_management/payload.rb b/lib/gitlab/alert_management/payload.rb
index 1b67b91e839..de34a0f5d47 100644
--- a/lib/gitlab/alert_management/payload.rb
+++ b/lib/gitlab/alert_management/payload.rb
@@ -4,8 +4,7 @@ module Gitlab
module AlertManagement
module Payload
MONITORING_TOOLS = {
- prometheus: 'Prometheus',
- cilium: 'Cilium'
+ prometheus: 'Prometheus'
}.freeze
class << self
@@ -48,5 +47,3 @@ module Gitlab
end
end
end
-
-Gitlab::AlertManagement::Payload.prepend_mod_with('Gitlab::AlertManagement::Payload')
diff --git a/lib/gitlab/analytics/cycle_analytics/request_params.rb b/lib/gitlab/analytics/cycle_analytics/request_params.rb
index af695c5cfa4..d0d8d68362e 100644
--- a/lib/gitlab/analytics/cycle_analytics/request_params.rb
+++ b/lib/gitlab/analytics/cycle_analytics/request_params.rb
@@ -107,7 +107,7 @@ module Gitlab
def use_aggregated_backend?
group.present? && # for now it's only available on the group-level
aggregation.enabled &&
- Feature.enabled?(:use_vsa_aggregated_tables, group, default_enabled: :yaml)
+ Feature.enabled?(:use_vsa_aggregated_tables, group)
end
def aggregation_attributes
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
index b10330914ca..6ef5a1e2cd8 100644
--- a/lib/gitlab/application_context.rb
+++ b/lib/gitlab/application_context.rb
@@ -19,7 +19,8 @@ module Gitlab
:job_id,
:pipeline_id,
:related_class,
- :feature_category
+ :feature_category,
+ :artifact_size
].freeze
private_constant :KNOWN_KEYS
@@ -32,7 +33,8 @@ module Gitlab
Attribute.new(:remote_ip, String),
Attribute.new(:job, ::Ci::Build),
Attribute.new(:related_class, String),
- Attribute.new(:feature_category, String)
+ Attribute.new(:feature_category, String),
+ Attribute.new(:artifact, ::Ci::JobArtifact)
].freeze
def self.known_keys
@@ -74,6 +76,8 @@ module Gitlab
assign_attributes(args)
end
+ # rubocop: disable Metrics/CyclomaticComplexity
+ # rubocop: disable Metrics/PerceivedComplexity
def to_lazy_hash
{}.tap do |hash|
hash[:user] = -> { username } if include_user?
@@ -86,8 +90,11 @@ module Gitlab
hash[:feature_category] = feature_category if set_values.include?(:feature_category)
hash[:pipeline_id] = -> { job&.pipeline_id } if set_values.include?(:job)
hash[:job_id] = -> { job&.id } if set_values.include?(:job)
+ hash[:artifact_size] = -> { artifact&.size } if set_values.include?(:artifact)
end
end
+ # rubocop: enable Metrics/CyclomaticComplexity
+ # rubocop: enable Metrics/PerceivedComplexity
def use
Labkit::Context.with_context(to_lazy_hash) { yield }
diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb
index 09775297def..41a6cbc2543 100644
--- a/lib/gitlab/application_rate_limiter.rb
+++ b/lib/gitlab/application_rate_limiter.rb
@@ -59,6 +59,8 @@ module Gitlab
def throttled?(key, scope:, threshold: nil, users_allowlist: nil, peek: false)
raise InvalidKeyError unless rate_limits[key]
+ ::Gitlab::Instrumentation::RateLimitingGates.track(key)
+
return false if scoped_user_in_allowlist?(scope, users_allowlist)
threshold_value = threshold || threshold(key)
diff --git a/lib/gitlab/audit/deploy_token_author.rb b/lib/gitlab/audit/deploy_token_author.rb
new file mode 100644
index 00000000000..69b42034826
--- /dev/null
+++ b/lib/gitlab/audit/deploy_token_author.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Audit
+ class DeployTokenAuthor < Gitlab::Audit::NullAuthor
+ def initialize(name: nil)
+ super(id: -2, name: name)
+ end
+
+ # Events that are authored by a deploy token, should be
+ # shown as authored by `Deploy Token` in the UI.
+ def name
+ @name || _('Deploy Token')
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/audit/null_author.rb b/lib/gitlab/audit/null_author.rb
index 80e0c4ddf58..08be6ae6d9f 100644
--- a/lib/gitlab/audit/null_author.rb
+++ b/lib/gitlab/audit/null_author.rb
@@ -13,8 +13,8 @@ module Gitlab
#
# @param [Integer] id
# @param [String] name
- #
- # @return [Gitlab::Audit::UnauthenticatedAuthor, Gitlab::Audit::DeletedAuthor, Gitlab::Audit::CiRunnerTokenAuthor]
+ # rubocop: disable Layout/LineLength
+ # @return [Gitlab::Audit::UnauthenticatedAuthor, Gitlab::Audit::DeletedAuthor, Gitlab::Audit::CiRunnerTokenAuthor, Gitlab::Audit::DeployTokenAuthor]
def self.for(id, audit_event)
name = audit_event[:author_name] || audit_event.details[:author_name]
@@ -22,6 +22,8 @@ module Gitlab
Gitlab::Audit::CiRunnerTokenAuthor.new(audit_event)
elsif id == -1
Gitlab::Audit::UnauthenticatedAuthor.new(name: name)
+ elsif id == -2
+ Gitlab::Audit::DeployTokenAuthor.new(name: name)
else
Gitlab::Audit::DeletedAuthor.new(id: id, name: name)
end
diff --git a/lib/gitlab/auth/otp/strategies/forti_authenticator.rb b/lib/gitlab/auth/otp/strategies/forti_authenticator.rb
deleted file mode 100644
index c1433f05db2..00000000000
--- a/lib/gitlab/auth/otp/strategies/forti_authenticator.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Auth
- module Otp
- module Strategies
- class FortiAuthenticator < Base
- def validate(otp_code)
- body = { username: user.username,
- token_code: otp_code }
-
- response = Gitlab::HTTP.post(
- auth_url,
- headers: { 'Content-Type': 'application/json' },
- body: body.to_json,
- basic_auth: api_credentials)
-
- # Successful authentication results in HTTP 200: OK
- # https://docs.fortinet.com/document/fortiauthenticator/6.2.0/rest-api-solution-guide/704555/authentication-auth
- response.ok? ? success : error_from_response(response)
- rescue StandardError => ex
- Gitlab::AppLogger.error(ex)
- error(ex.message)
- end
-
- private
-
- def auth_url
- host = ::Gitlab.config.forti_authenticator.host
- port = ::Gitlab.config.forti_authenticator.port
- path = 'api/v1/auth/'
-
- "https://#{host}:#{port}/#{path}"
- end
-
- def api_credentials
- { username: ::Gitlab.config.forti_authenticator.username,
- password: ::Gitlab.config.forti_authenticator.access_token }
- end
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb b/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb
new file mode 100644
index 00000000000..9cf1b2247a7
--- /dev/null
+++ b/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Auth
+ module Otp
+ module Strategies
+ module FortiAuthenticator
+ class ManualOtp < Base
+ def validate(otp_code)
+ @otp_code = otp_code
+
+ response = Gitlab::HTTP.post(
+ auth_url,
+ headers: { 'Content-Type': 'application/json' },
+ body: body.to_json,
+ basic_auth: api_credentials)
+
+ # Successful authentication results in HTTP 200: OK
+ # Manual OTP - https://docs.fortinet.com/document/fortiauthenticator/6.2.0/rest-api-solution-guide/704555/authentication-auth
+ response.ok? ? success : error_from_response(response)
+ rescue StandardError => ex
+ Gitlab::AppLogger.error(ex)
+ error(ex.message)
+ end
+
+ private
+
+ def auth_url
+ host = ::Gitlab.config.forti_authenticator.host
+ port = ::Gitlab.config.forti_authenticator.port
+ path = 'api/v1/auth/'
+
+ "https://#{host}:#{port}/#{path}"
+ end
+
+ def body
+ { username: user.username,
+ token_code: @otp_code }
+ end
+
+ def api_credentials
+ { username: ::Gitlab.config.forti_authenticator.username,
+ password: ::Gitlab.config.forti_authenticator.access_token }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp.rb b/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp.rb
new file mode 100644
index 00000000000..03cc648f7b0
--- /dev/null
+++ b/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Auth
+ module Otp
+ module Strategies
+ module FortiAuthenticator
+ class PushOtp < Base
+ def validate
+ response = Gitlab::HTTP.post(
+ auth_url,
+ headers: { 'Content-Type': 'application/json' },
+ body: body.to_json,
+ basic_auth: api_credentials)
+
+ # Successful authentication results in HTTP 200: OK
+ # Push - https://docs.fortinet.com/document/fortiauthenticator/6.2.1/rest-api-solution-guide/943094/push-authentication-pushauth
+ response.ok? ? success : error_from_response(response)
+ rescue StandardError => ex
+ Gitlab::AppLogger.error(ex)
+ error(ex.message)
+ end
+
+ private
+
+ def auth_url
+ host = ::Gitlab.config.forti_authenticator.host
+ port = ::Gitlab.config.forti_authenticator.port
+ path = 'api/v1/pushauth/'
+
+ "https://#{host}:#{port}/#{path}"
+ end
+
+ def body
+ { username: user.username }
+ end
+
+ def api_credentials
+ { username: ::Gitlab.config.forti_authenticator.username,
+ password: ::Gitlab.config.forti_authenticator.access_token }
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/auth/saml/config.rb b/lib/gitlab/auth/saml/config.rb
index 3f13a264b0a..815130aeee2 100644
--- a/lib/gitlab/auth/saml/config.rb
+++ b/lib/gitlab/auth/saml/config.rb
@@ -5,6 +5,10 @@ module Gitlab
module Saml
class Config
class << self
+ def enabled?
+ ::AuthHelper.saml_providers.any?
+ end
+
def options
Gitlab::Auth::OAuth::Provider.config_for('saml')
end
diff --git a/lib/gitlab/auth/saml/identity_linker.rb b/lib/gitlab/auth/saml/identity_linker.rb
index 93195c3189f..a44a9c2fca5 100644
--- a/lib/gitlab/auth/saml/identity_linker.rb
+++ b/lib/gitlab/auth/saml/identity_linker.rb
@@ -32,3 +32,5 @@ module Gitlab
end
end
end
+
+Gitlab::Auth::Saml::IdentityLinker.prepend_mod
diff --git a/lib/gitlab/background_migration/.rubocop.yml b/lib/gitlab/background_migration/.rubocop.yml
index 50112a51675..116c84c3759 100644
--- a/lib/gitlab/background_migration/.rubocop.yml
+++ b/lib/gitlab/background_migration/.rubocop.yml
@@ -50,3 +50,12 @@ Style/FrozenStringLiteralComment:
Enabled: true
Details: >-
This removes the need for calling "freeze", reducing noise in the code.
+
+Migration/BackgroundMigrationBaseClass:
+ Enabled: true
+ Exclude:
+ - 'batching_strategies/**/*.rb'
+ - 'job_coordinator.rb'
+ - 'base_job.rb'
+ - 'batched_migration_job.rb'
+ - 'logger.rb'
diff --git a/lib/gitlab/background_migration/backfill_artifact_expiry_date.rb b/lib/gitlab/background_migration/backfill_artifact_expiry_date.rb
deleted file mode 100644
index f6b36571c90..00000000000
--- a/lib/gitlab/background_migration/backfill_artifact_expiry_date.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module BackgroundMigration
- # Backfill expire_at for a range of Ci::JobArtifact
- class BackfillArtifactExpiryDate
- include Gitlab::Utils::StrongMemoize
-
- SWITCH_DATE = Date.new(2020, 06, 22).freeze
- OLD_ARTIFACT_AGE = 15.months
- BATCH_SIZE = 1_000
- OLD_ARTIFACT_EXPIRY_OFFSET = 3.months
- RECENT_ARTIFACT_EXPIRY_OFFSET = 1.year
-
- # Ci::JobArtifact model
- class Ci::JobArtifact < ActiveRecord::Base
- include ::EachBatch
-
- self.table_name = 'ci_job_artifacts'
-
- scope :without_expiry_date, -> { where(expire_at: nil) }
- scope :before_switch, -> { where("date(created_at AT TIME ZONE 'UTC') < ?::date", SWITCH_DATE) }
- scope :between, -> (start_id, end_id) { where(id: start_id..end_id) }
- scope :old, -> { where(self.arel_table[:created_at].lt(OLD_ARTIFACT_AGE.ago)) }
- scope :recent, -> { where(self.arel_table[:created_at].gt(OLD_ARTIFACT_AGE.ago)) }
- end
-
- def perform(start_id, end_id)
- Ci::JobArtifact
- .without_expiry_date.before_switch
- .between(start_id, end_id)
- .each_batch(of: BATCH_SIZE) do |batch|
- batch.old.update_all(expire_at: old_artifact_expiry_date)
- batch.recent.update_all(expire_at: recent_artifact_expiry_date)
- end
- end
-
- private
-
- def offset_date
- strong_memoize(:offset_date) do
- current_date = Time.current
- target_date = Time.zone.local(current_date.year, current_date.month, 22, 0, 0, 0)
-
- current_date.day < 22 ? target_date : target_date.next_month
- end
- end
-
- def old_artifact_expiry_date
- offset_date + OLD_ARTIFACT_EXPIRY_OFFSET
- end
-
- def recent_artifact_expiry_date
- offset_date + RECENT_ARTIFACT_EXPIRY_OFFSET
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex.rb b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex.rb
new file mode 100644
index 00000000000..b9151343d6a
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Backfill draft column on open merge requests based on regex parsing of
+ # their titles.
+ #
+ class BackfillDraftStatusOnMergeRequestsWithCorrectedRegex # rubocop:disable Migration/BackgroundMigrationBaseClass
+ # Migration only version of MergeRequest table
+ class MergeRequest < ::ApplicationRecord
+ include EachBatch
+
+ CORRECTED_REGEXP_STR = "^(\\[draft\\]|\\(draft\\)|draft:|draft|\\[WIP\\]|WIP:|WIP)"
+
+ self.table_name = 'merge_requests'
+
+ def self.eligible
+ where(state_id: 1)
+ .where(draft: false)
+ .where("title ~* ?", CORRECTED_REGEXP_STR)
+ end
+ end
+
+ def perform(start_id, end_id)
+ eligible_mrs = MergeRequest.eligible.where(id: start_id..end_id).pluck(:id)
+
+ eligible_mrs.each_slice(10) do |slice|
+ MergeRequest.where(id: slice).update_all(draft: true)
+ end
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ 'BackfillDraftStatusOnMergeRequestsWithCorrectedRegex',
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_group_features.rb b/lib/gitlab/background_migration/backfill_group_features.rb
index 084c788c8cb..4c3af7be319 100644
--- a/lib/gitlab/background_migration/backfill_group_features.rb
+++ b/lib/gitlab/background_migration/backfill_group_features.rb
@@ -3,34 +3,19 @@
module Gitlab
module BackgroundMigration
# Backfill group_features for an array of groups
- class BackfillGroupFeatures < ::Gitlab::BackgroundMigration::BaseJob
- include Gitlab::Database::DynamicModelHelpers
-
- def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms, batch_size)
- pause_ms = 0 if pause_ms < 0
-
- parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
- parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size, order_hint: :type) do |sub_batch|
- batch_metrics.time_operation(:upsert_group_features) do
- upsert_group_features(sub_batch, batch_size)
- end
-
- sleep(pause_ms * 0.001)
+ class BackfillGroupFeatures < ::Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform(batch_size)
+ each_sub_batch(
+ operation_name: :upsert_group_features,
+ batching_arguments: { order_hint: :type },
+ batching_scope: ->(relation) { relation.where(type: 'Group') }
+ ) do |sub_batch|
+ upsert_group_features(sub_batch, batch_size)
end
end
- def batch_metrics
- @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
- end
-
private
- def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
- define_batchable_model(source_table, connection: connection)
- .where(source_key_column => start_id..stop_id)
- .where(type: 'Group')
- end
-
def upsert_group_features(relation, batch_size)
connection.execute(
<<~SQL
diff --git a/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb b/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb
new file mode 100644
index 00000000000..de52629522b
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Enable SSL verification for CI integrations with known-good hostnames.
+ class BackfillIntegrationsEnableSslVerification
+ INTEGRATIONS = {
+ # This matches the logic in `Integrations::DroneCi#url_is_saas?`
+ # - https://gitlab.com/gitlab-org/gitlab/blob/65b7fc1ad1ad33247890324e9a3396993b7718a1/app/models/integrations/drone_ci.rb#L122-127
+ # - https://docs.drone.io/pipeline/environment/reference/drone-system-hostname/
+ 'Integrations::DroneCi' => [
+ :drone_url,
+ /\Acloud\.drone\.io\z/i.freeze
+ ],
+ # This matches the logic in `Integrations::Teamcity#url_is_saas?`
+ # - https://gitlab.com/gitlab-org/gitlab/blob/65b7fc1ad1ad33247890324e9a3396993b7718a1/app/models/integrations/teamcity.rb#L117-122
+ # - https://www.jetbrains.com/help/teamcity/cloud/migrate-from-teamcity-on-premises-to-teamcity-cloud.html#Migration+Process
+ 'Integrations::Teamcity' => [
+ :teamcity_url,
+ /\A[^\.]+\.teamcity\.com\z/i.freeze
+ ]
+
+ # Other CI integrations which don't seem to have a SaaS offering:
+ # - Atlassian Bamboo (the SaaS offering is Bitbucket Pipelines)
+ # - Jenkins (self-hosted only)
+ # - MockCi (development only)
+ }.freeze
+
+ # Define the `Integration` model
+ class Integration < ::ApplicationRecord
+ include IgnorableColumns
+
+ self.table_name = :integrations
+ self.inheritance_column = :_type_disabled
+
+ ignore_column :template, remove_with: '15.0', remove_after: '2022-04-22'
+ ignore_column :type, remove_with: '15.0', remove_after: '2022-04-22'
+ ignore_column :properties, remove_with: '15.1', remove_after: '2022-05-22'
+
+ scope :affected, -> { where(type_new: INTEGRATIONS.keys).where.not(encrypted_properties: nil) }
+
+ attr_encrypted :properties,
+ mode: :per_attribute_iv,
+ key: Settings.attr_encrypted_db_key_base_32,
+ algorithm: 'aes-256-gcm',
+ marshal: true,
+ marshaler: ::Gitlab::Json,
+ encode: false,
+ encode_iv: false
+
+ # Handle assignment of props with symbol keys.
+ # To do this correctly, we need to call the method generated by attr_encrypted.
+ alias_method :attr_encrypted_props=, :properties=
+ private :attr_encrypted_props=
+
+ def properties=(props)
+ self.attr_encrypted_props = props&.with_indifferent_access&.freeze
+ end
+ end
+
+ def perform(start_id, stop_id)
+ integration_ids = Integration
+ .affected
+ .where(id: (start_id..stop_id))
+ .pluck(:id)
+
+ integration_ids.each do |id|
+ Integration.transaction do
+ integration = Integration.lock.find(id)
+ process_integration(integration)
+ end
+ end
+
+ mark_job_as_succeeded(start_id, stop_id)
+ end
+
+ private
+
+ def process_integration(integration)
+ url_field, known_hostnames = INTEGRATIONS.fetch(integration.type_new)
+
+ url = integration.properties[url_field.to_s] if integration.properties.present?
+ return unless url.present?
+
+ parsed_url = Addressable::URI.parse(url)
+ return unless parsed_url.scheme == 'https' && parsed_url.hostname =~ known_hostnames
+
+ integration.properties = integration.properties.merge('enable_ssl_verification' => true)
+
+ integration.save!(touch: false)
+ rescue Addressable::URI::InvalidURIError, ActiveRecord::RecordInvalid
+ # Don't change the configuration if the record is invalid, in this case
+ # they will just keep having SSL verification disabled.
+ end
+
+ def mark_job_as_succeeded(*arguments)
+ Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_integrations_type_new.rb b/lib/gitlab/background_migration/backfill_integrations_type_new.rb
index a234cebfce5..6f33472af7d 100644
--- a/lib/gitlab/background_migration/backfill_integrations_type_new.rb
+++ b/lib/gitlab/background_migration/backfill_integrations_type_new.rb
@@ -22,7 +22,7 @@ module Gitlab
private
def connection
- ActiveRecord::Base.connection
+ ApplicationRecord.connection
end
def process_sub_batch(sub_batch)
diff --git a/lib/gitlab/background_migration/backfill_issue_search_data.rb b/lib/gitlab/background_migration/backfill_issue_search_data.rb
index ec206cbfd41..e408fd0cda6 100644
--- a/lib/gitlab/background_migration/backfill_issue_search_data.rb
+++ b/lib/gitlab/background_migration/backfill_issue_search_data.rb
@@ -9,7 +9,7 @@ module Gitlab
include Gitlab::Database::DynamicModelHelpers
def perform(start_id, stop_id, batch_table, batch_column, sub_batch_size, pause_ms)
- define_batchable_model(batch_table, connection: ActiveRecord::Base.connection).where(batch_column => start_id..stop_id).each_batch(of: sub_batch_size) do |sub_batch|
+ define_batchable_model(batch_table, connection: ApplicationRecord.connection).where(batch_column => start_id..stop_id).each_batch(of: sub_batch_size) do |sub_batch|
update_search_data(sub_batch)
sleep(pause_ms * 0.001)
diff --git a/lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb b/lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb
index 1ed147d67c7..5f3d830c48d 100644
--- a/lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb
+++ b/lib/gitlab/background_migration/backfill_member_namespace_for_group_members.rb
@@ -26,7 +26,7 @@ module Gitlab
private
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
- define_batchable_model(source_table, connection: ActiveRecord::Base.connection)
+ define_batchable_model(source_table, connection: ApplicationRecord.connection)
.joins('INNER JOIN namespaces ON members.source_id = namespaces.id')
.where(source_key_column => start_id..stop_id)
.where(type: 'GroupMember')
diff --git a/lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb b/lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb
index fe3edd3322b..0585924cb7b 100644
--- a/lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb
+++ b/lib/gitlab/background_migration/backfill_namespace_id_for_namespace_route.rb
@@ -27,7 +27,7 @@ module Gitlab
private
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
- define_batchable_model(source_table, connection: ActiveRecord::Base.connection)
+ define_batchable_model(source_table, connection: ApplicationRecord.connection)
.joins('inner join namespaces on routes.source_id = namespaces.id')
.where(source_key_column => start_id..stop_id)
.where(namespace_id: nil)
diff --git a/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb b/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb
index f6c8fb060f8..0282531ae17 100644
--- a/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb
+++ b/lib/gitlab/background_migration/backfill_namespace_id_for_project_route.rb
@@ -13,7 +13,7 @@ module Gitlab
cleanup_gin_index('routes')
batch_metrics.time_operation(:update_all) do
- ActiveRecord::Base.connection.execute <<~SQL
+ ApplicationRecord.connection.execute <<~SQL
WITH route_and_ns(route_id, project_namespace_id) AS #{::Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
#{sub_batch.to_sql}
)
@@ -48,7 +48,7 @@ module Gitlab
end
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
- define_batchable_model(source_table, connection: ActiveRecord::Base.connection)
+ define_batchable_model(source_table, connection: ApplicationRecord.connection)
.joins('INNER JOIN projects ON routes.source_id = projects.id')
.where(source_key_column => start_id..stop_id)
.where(namespace_id: nil)
diff --git a/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb b/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb
index 79e7a2f2279..587de1bcb5a 100644
--- a/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb
+++ b/lib/gitlab/background_migration/backfill_namespace_traversal_ids_children.rb
@@ -29,7 +29,7 @@ module Gitlab
WHERE namespaces.id = calculated_ids.id
AND namespaces.traversal_ids = '{}'
SQL
- ActiveRecord::Base.connection.execute(update_sql)
+ ApplicationRecord.connection.execute(update_sql)
sleep PAUSE_SECONDS
end
diff --git a/lib/gitlab/background_migration/backfill_note_discussion_id.rb b/lib/gitlab/background_migration/backfill_note_discussion_id.rb
new file mode 100644
index 00000000000..da2c31ebd11
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_note_discussion_id.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Fixes notes with NULL discussion_ids due to a bug when importing from GitHub
+ # Bug was fixed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76517
+ class BackfillNoteDiscussionId
+ SUB_BATCH_SIZE = 300
+
+ # Migration only version of notes model
+ class Note < ApplicationRecord
+ include EachBatch
+
+ self.table_name = 'notes'
+
+ # Based on https://gitlab.com/gitlab-org/gitlab/blob/117c14d0c79403e169cf52922b48f69d1dcf6a85/app/models/discussion.rb#L62-74
+ def generate_discussion_id
+ Digest::SHA1.hexdigest(
+ [:discussion, noteable_type.try(:underscore), noteable_id || commit_id, SecureRandom.hex].join('-')
+ )
+ end
+ end
+
+ def perform(start_id, stop_id)
+ notes = Note.select(:id, :noteable_type, :noteable_id, :commit_id)
+ .where(discussion_id: nil, id: start_id..stop_id)
+
+ notes.each_batch(of: SUB_BATCH_SIZE) do |relation|
+ update_discussion_ids(relation)
+ end
+ end
+
+ private
+
+ def update_discussion_ids(notes)
+ mapping = notes.each_with_object({}) do |note, hash|
+ hash[note] = { discussion_id: note.generate_discussion_id }
+ end
+
+ Gitlab::Database::BulkUpdate.execute(%i(discussion_id), mapping)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_project_settings.rb b/lib/gitlab/background_migration/backfill_project_settings.rb
new file mode 100644
index 00000000000..7ede8de7bd6
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_project_settings.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Back-fill project settings for projects that do not yet have one.
+ class BackfillProjectSettings
+ include Gitlab::Database::DynamicModelHelpers
+
+ def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms)
+ batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
+
+ batch_relation.each_batch(column: batch_column, of: sub_batch_size) do |sub_batch|
+ insert_sql = <<~SQL
+ INSERT INTO project_settings (project_id, created_at, updated_at)
+ #{sub_batch.where(project_settings: { project_id: nil })
+ .select('projects.id, NOW(), NOW()')
+ .to_sql}
+ ON CONFLICT (project_id) DO NOTHING
+ SQL
+
+ connection.execute(insert_sql)
+
+ pause_ms = 0 if pause_ms < 0
+ sleep(pause_ms * 0.001)
+ end
+ end
+
+ private
+
+ def connection
+ ApplicationRecord.connection
+ end
+
+ def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
+ define_batchable_model(:projects, connection: connection)
+ .where(source_key_column => start_id..stop_id)
+ .joins("LEFT OUTER JOIN project_settings ON project_settings.project_id = projects.id")
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_topics_title.rb b/lib/gitlab/background_migration/backfill_topics_title.rb
new file mode 100644
index 00000000000..19a1eff5b58
--- /dev/null
+++ b/lib/gitlab/background_migration/backfill_topics_title.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # The class to backfill the topic title
+ class BackfillTopicsTitle
+ # Temporary AR model for topics
+ class Topic < ActiveRecord::Base
+ self.table_name = 'topics'
+ end
+
+ def perform(start_id, end_id)
+ Topic.where(id: start_id..end_id).where(title: nil).update_all('title = name')
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb b/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
index 170af90805a..3bf6bf993dd 100644
--- a/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
+++ b/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
@@ -16,7 +16,7 @@ module Gitlab
private
def execute(sql)
- @connection ||= ::ActiveRecord::Base.connection
+ @connection ||= ApplicationRecord.connection
@connection.execute(sql)
end
diff --git a/lib/gitlab/background_migration/backfill_user_namespace.rb b/lib/gitlab/background_migration/backfill_user_namespace.rb
index ab569e236fb..df6b1f083c3 100644
--- a/lib/gitlab/background_migration/backfill_user_namespace.rb
+++ b/lib/gitlab/background_migration/backfill_user_namespace.rb
@@ -25,7 +25,7 @@ module Gitlab
private
def connection
- ActiveRecord::Base.connection
+ ApplicationRecord.connection
end
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
diff --git a/lib/gitlab/background_migration/batched_migration_job.rb b/lib/gitlab/background_migration/batched_migration_job.rb
new file mode 100644
index 00000000000..442eab0673e
--- /dev/null
+++ b/lib/gitlab/background_migration/batched_migration_job.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Base class for batched background migrations. Subclasses should implement the `#perform`
+ # method as the entry point for the job's execution, which will be called with the migration
+ # arguments (if any).
+ class BatchedMigrationJob
+ include Gitlab::Database::DynamicModelHelpers
+
+ def initialize(start_id:, end_id:, batch_table:, batch_column:, sub_batch_size:, pause_ms:, connection:)
+ @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
+
+ def perform(*job_arguments)
+ raise NotImplementedError, "subclasses of #{self.class.name} must implement #{__method__}"
+ end
+
+ def batch_metrics
+ @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
+ end
+
+ private
+
+ attr_reader :start_id, :end_id, :batch_table, :batch_column, :sub_batch_size, :pause_ms, :connection
+
+ def each_sub_batch(operation_name: :default, batching_arguments: {}, batching_scope: nil)
+ all_batching_arguments = { column: batch_column, of: sub_batch_size }.merge(batching_arguments)
+
+ parent_relation = parent_batch_relation(batching_scope)
+
+ parent_relation.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)
+ parent_relation = define_batchable_model(batch_table, connection: connection)
+ .where(batch_column => start_id..end_id)
+
+ return parent_relation unless batching_scope
+
+ batching_scope.call(parent_relation)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
index 137b4d4bc4e..826845935b8 100644
--- a/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
+++ b/lib/gitlab/background_migration/copy_column_using_background_migration_job.rb
@@ -13,50 +13,25 @@ module Gitlab
# - We skip the NULL checks as they may result in not using an index scan
# - The table that is migrated does _not_ need `id` as the primary key
# We use the provided primary_key column to perform the update.
- class CopyColumnUsingBackgroundMigrationJob < BaseJob
- include Gitlab::Database::DynamicModelHelpers
+ class CopyColumnUsingBackgroundMigrationJob < BatchedMigrationJob
+ def perform(copy_from, copy_to)
+ assignment_clauses = build_assignment_clauses(copy_from, copy_to)
- # start_id - The start ID of the range of rows to update.
- # end_id - The end ID of the range of rows to update.
- # batch_table - The name of the table that contains the columns.
- # batch_column - The name of the column we use to batch over the table.
- # sub_batch_size - We don't want updates to take more than ~100ms
- # This allows us to run multiple smaller batches during
- # the minimum 2.minute interval that we can schedule jobs
- # pause_ms - The number of milliseconds to sleep between each subbatch execution.
- # copy_from - List of columns containing the data to copy.
- # copy_to - List of columns to copy the data to. Order must match the order in `copy_from`.
- def perform(start_id, end_id, batch_table, batch_column, sub_batch_size, pause_ms, copy_from, copy_to)
- copy_from = Array.wrap(copy_from)
- copy_to = Array.wrap(copy_to)
-
- raise ArgumentError, 'number of source and destination columns must match' unless copy_from.count == copy_to.count
-
- assignment_clauses = column_assignment_clauses(copy_from, copy_to)
-
- parent_batch_relation = relation_scoped_to_range(batch_table, batch_column, start_id, end_id)
-
- parent_batch_relation.each_batch(column: batch_column, of: sub_batch_size) do |sub_batch|
- batch_metrics.time_operation(:update_all) do
- sub_batch.update_all(assignment_clauses)
- end
-
- pause_ms = 0 if pause_ms < 0
- sleep(pause_ms * 0.001)
+ each_sub_batch(operation_name: :update_all) do |relation|
+ relation.update_all(assignment_clauses)
end
end
- def batch_metrics
- @batch_metrics ||= Gitlab::Database::BackgroundMigration::BatchMetrics.new
- end
-
private
- def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
- define_batchable_model(source_table, connection: connection).where(source_key_column => start_id..stop_id)
- end
+ def build_assignment_clauses(copy_from, copy_to)
+ copy_from = Array.wrap(copy_from)
+ copy_to = Array.wrap(copy_to)
+
+ unless copy_from.count == copy_to.count
+ raise ArgumentError, 'number of source and destination columns must match'
+ end
- def column_assignment_clauses(copy_from, copy_to)
assignments = copy_from.zip(copy_to).map do |from_column, to_column|
from_column = connection.quote_column_name(from_column)
to_column = connection.quote_column_name(to_column)
diff --git a/lib/gitlab/background_migration/delete_orphaned_deployments.rb b/lib/gitlab/background_migration/delete_orphaned_deployments.rb
index 5d41a46c8cd..4a3a12ab53d 100644
--- a/lib/gitlab/background_migration/delete_orphaned_deployments.rb
+++ b/lib/gitlab/background_migration/delete_orphaned_deployments.rb
@@ -15,7 +15,7 @@ module Gitlab
end
def orphaned_deployments
- define_batchable_model('deployments', connection: ActiveRecord::Base.connection)
+ define_batchable_model('deployments', connection: ApplicationRecord.connection)
.where('NOT EXISTS (SELECT 1 FROM environments WHERE deployments.environment_id = environments.id)')
end
diff --git a/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb b/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb
index 9a88eb8ea06..dad5da875ab 100644
--- a/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb
+++ b/lib/gitlab/background_migration/disable_expiration_policies_linked_to_no_container_images.rb
@@ -32,7 +32,7 @@ module Gitlab
private
def execute(sql)
- ActiveRecord::Base
+ ApplicationRecord
.connection
.execute(sql)
end
diff --git a/lib/gitlab/background_migration/expire_o_auth_tokens.rb b/lib/gitlab/background_migration/expire_o_auth_tokens.rb
new file mode 100644
index 00000000000..595e4ac9dc8
--- /dev/null
+++ b/lib/gitlab/background_migration/expire_o_auth_tokens.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # Add expiry to all OAuth access tokens
+ class ExpireOAuthTokens < ::Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform
+ each_sub_batch(
+ operation_name: :update_oauth_tokens,
+ batching_scope: ->(relation) { relation.where(expires_in: nil) }
+ ) do |sub_batch|
+ update_oauth_tokens(sub_batch)
+ end
+ end
+
+ private
+
+ def update_oauth_tokens(relation)
+ relation.update_all(expires_in: 7_200)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb b/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
index defd9ea832b..3772430d0b7 100644
--- a/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
+++ b/lib/gitlab/background_migration/fix_duplicate_project_name_and_path.rb
@@ -21,7 +21,7 @@ module Gitlab
backfill_project_namespaces_service.cleanup_gin_index('projects')
project_ids.each_slice(SUB_BATCH_SIZE) do |ids|
- ActiveRecord::Base.connection.execute(update_projects_name_and_path_sql(ids))
+ ApplicationRecord.connection.execute(update_projects_name_and_path_sql(ids))
end
backfill_project_namespaces_service.backfill_project_namespaces
diff --git a/lib/gitlab/background_migration/fix_projects_without_project_feature.rb b/lib/gitlab/background_migration/fix_projects_without_project_feature.rb
index 83c01afa432..c21f9c1d50f 100644
--- a/lib/gitlab/background_migration/fix_projects_without_project_feature.rb
+++ b/lib/gitlab/background_migration/fix_projects_without_project_feature.rb
@@ -14,7 +14,7 @@ module Gitlab
private
def create_missing!(from_id, to_id)
- result = ActiveRecord::Base.connection.select_one(sql(from_id, to_id))
+ result = ApplicationRecord.connection.select_one(sql(from_id, to_id))
return 0 unless result
result['number_of_created_records']
diff --git a/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb b/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
index b8e4562b3bf..496ec0bd0a1 100644
--- a/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
+++ b/lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb
@@ -120,14 +120,14 @@ module Gitlab
end
def create_missing(from_id, to_id)
- result = ActiveRecord::Base.connection.select_one(create_sql(from_id, to_id))
+ result = ApplicationRecord.connection.select_one(create_sql(from_id, to_id))
return unless result
logger.info(message: "#{self.class}: created missing services for #{result['number_of_created_records']} projects in id=#{from_id}...#{to_id}")
end
def update_inconsistent(from_id, to_id)
- result = ActiveRecord::Base.connection.select_one(update_sql(from_id, to_id))
+ result = ApplicationRecord.connection.select_one(update_sql(from_id, to_id))
return unless result
logger.info(message: "#{self.class}: updated inconsistent services for #{result['number_of_updated_records']} projects in id=#{from_id}...#{to_id}")
diff --git a/lib/gitlab/background_migration/job_coordinator.rb b/lib/gitlab/background_migration/job_coordinator.rb
index acbb5f76ad8..c440db58b94 100644
--- a/lib/gitlab/background_migration/job_coordinator.rb
+++ b/lib/gitlab/background_migration/job_coordinator.rb
@@ -14,7 +14,7 @@ module Gitlab
worker_class = worker_for_tracking_database[tracking_database]
if worker_class.nil?
- raise ArgumentError, "tracking_database must be one of [#{worker_for_tracking_database.keys.join(', ')}]"
+ raise ArgumentError, "The '#{tracking_database}' must be one of #{worker_for_tracking_database.keys.to_a}"
end
new(worker_class)
diff --git a/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb b/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb
index ec4631d1e34..d7d24960a41 100644
--- a/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb
+++ b/lib/gitlab/background_migration/migrate_shimo_confluence_integration_category.rb
@@ -7,7 +7,7 @@ module Gitlab
include Gitlab::Database::DynamicModelHelpers
def perform(start_id, end_id)
- define_batchable_model('integrations', connection: ::ActiveRecord::Base.connection)
+ define_batchable_model('integrations', connection: ApplicationRecord.connection)
.where(id: start_id..end_id, type_new: %w[Integrations::Confluence Integrations::Shimo])
.update_all(category: 'third_party_wiki')
diff --git a/lib/gitlab/background_migration/migrate_stage_status.rb b/lib/gitlab/background_migration/migrate_stage_status.rb
deleted file mode 100644
index 6a29a632577..00000000000
--- a/lib/gitlab/background_migration/migrate_stage_status.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# frozen_string_literal: true
-# rubocop:disable Metrics/AbcSize
-# rubocop:disable Style/Documentation
-
-module Gitlab
- module BackgroundMigration
- class MigrateStageStatus
- STATUSES = { created: 0, pending: 1, running: 2, success: 3,
- failed: 4, canceled: 5, skipped: 6, manual: 7 }.freeze
-
- class Build < ActiveRecord::Base
- self.table_name = 'ci_builds'
-
- scope :latest, -> { where(retried: [false, nil]) }
- scope :created, -> { where(status: 'created') }
- scope :running, -> { where(status: 'running') }
- scope :pending, -> { where(status: 'pending') }
- scope :success, -> { where(status: 'success') }
- scope :failed, -> { where(status: 'failed') }
- scope :canceled, -> { where(status: 'canceled') }
- scope :skipped, -> { where(status: 'skipped') }
- scope :manual, -> { where(status: 'manual') }
-
- scope :failed_but_allowed, -> do
- where(allow_failure: true, status: [:failed, :canceled])
- end
-
- scope :exclude_ignored, -> do
- where("allow_failure = ? OR status IN (?)",
- false, %w[created pending running success skipped])
- end
-
- def self.status_sql
- scope_relevant = latest.exclude_ignored
- scope_warnings = latest.failed_but_allowed
-
- builds = scope_relevant.select('count(*)').to_sql
- created = scope_relevant.created.select('count(*)').to_sql
- success = scope_relevant.success.select('count(*)').to_sql
- manual = scope_relevant.manual.select('count(*)').to_sql
- pending = scope_relevant.pending.select('count(*)').to_sql
- running = scope_relevant.running.select('count(*)').to_sql
- skipped = scope_relevant.skipped.select('count(*)').to_sql
- canceled = scope_relevant.canceled.select('count(*)').to_sql
- warnings = scope_warnings.select('count(*) > 0').to_sql
-
- <<-SQL.strip_heredoc
- (CASE
- WHEN (#{builds}) = (#{skipped}) AND (#{warnings}) THEN #{STATUSES[:success]}
- WHEN (#{builds}) = (#{skipped}) THEN #{STATUSES[:skipped]}
- WHEN (#{builds}) = (#{success}) THEN #{STATUSES[:success]}
- WHEN (#{builds}) = (#{created}) THEN #{STATUSES[:created]}
- WHEN (#{builds}) = (#{success}) + (#{skipped}) THEN #{STATUSES[:success]}
- WHEN (#{builds}) = (#{success}) + (#{skipped}) + (#{canceled}) THEN #{STATUSES[:canceled]}
- WHEN (#{builds}) = (#{created}) + (#{skipped}) + (#{pending}) THEN #{STATUSES[:pending]}
- WHEN (#{running}) + (#{pending}) > 0 THEN #{STATUSES[:running]}
- WHEN (#{manual}) > 0 THEN #{STATUSES[:manual]}
- WHEN (#{created}) > 0 THEN #{STATUSES[:running]}
- ELSE #{STATUSES[:failed]}
- END)
- SQL
- end
- end
-
- def perform(start_id, stop_id)
- status_sql = Build
- .where('ci_builds.commit_id = ci_stages.pipeline_id')
- .where('ci_builds.stage = ci_stages.name')
- .status_sql
-
- sql = <<-SQL
- UPDATE ci_stages SET status = (#{status_sql})
- WHERE ci_stages.status IS NULL
- AND ci_stages.id BETWEEN #{start_id.to_i} AND #{stop_id.to_i}
- SQL
-
- ActiveRecord::Base.connection.execute(sql)
- end
- end
- end
-end
diff --git a/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb b/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb
index c01545e5dca..06422ed282f 100644
--- a/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb
+++ b/lib/gitlab/background_migration/move_container_registry_enabled_to_project_feature.rb
@@ -22,7 +22,7 @@ module Gitlab
private
def process_batch(from_id, to_id)
- ActiveRecord::Base.connection.execute(update_sql(from_id, to_id))
+ ApplicationRecord.connection.execute(update_sql(from_id, to_id))
logger.info(message: "#{self.class}: Copied container_registry_enabled values for projects with IDs between #{from_id}..#{to_id}")
end
diff --git a/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb b/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb
index 78e897d9ae1..36d4e649271 100644
--- a/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb
+++ b/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds.rb
@@ -26,7 +26,7 @@ module Gitlab
private
def connection
- ActiveRecord::Base.connection
+ ::Ci::ApplicationRecord.connection
end
def relation_scoped_to_range(source_table, source_key_column, start_id, stop_id)
diff --git a/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb b/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb
index 9e102ea1517..a9611e9814c 100644
--- a/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb
+++ b/lib/gitlab/background_migration/populate_container_repository_migration_plan.rb
@@ -33,7 +33,7 @@ module Gitlab
private
def connection
- @connection ||= ::ActiveRecord::Base.connection
+ @connection ||= ApplicationRecord.connection
end
def execute(sql)
diff --git a/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb b/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb
index 769ca4be7f3..1f2b55004e4 100644
--- a/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb
+++ b/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb
@@ -15,7 +15,7 @@ module Gitlab
def perform(start_id, stop_id)
Topic.where(id: start_id..stop_id).each_batch(of: SUB_BATCH_SIZE) do |batch|
- ActiveRecord::Base.connection.execute(<<~SQL)
+ ApplicationRecord.connection.execute(<<~SQL)
WITH batched_relation AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (#{batch.select(:id).limit(SUB_BATCH_SIZE).to_sql})
UPDATE topics
SET non_private_projects_count = (
diff --git a/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb b/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
index 1d96872d445..2495cb51364 100644
--- a/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
+++ b/lib/gitlab/background_migration/populate_topics_total_projects_count_cache.rb
@@ -15,7 +15,7 @@ module Gitlab
def perform(start_id, stop_id)
Topic.where(id: start_id..stop_id).each_batch(of: SUB_BATCH_SIZE) do |batch|
- ActiveRecord::Base.connection.execute(<<~SQL)
+ ApplicationRecord.connection.execute(<<~SQL)
WITH batched_relation AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (#{batch.select(:id).limit(SUB_BATCH_SIZE).to_sql})
UPDATE topics
SET total_projects_count = (SELECT COUNT(*) FROM project_topics WHERE topic_id = batched_relation.id)
diff --git a/lib/gitlab/background_migration/populate_vulnerability_reads.rb b/lib/gitlab/background_migration/populate_vulnerability_reads.rb
index 7b6d4c1ff81..5e6475a3d1a 100644
--- a/lib/gitlab/background_migration/populate_vulnerability_reads.rb
+++ b/lib/gitlab/background_migration/populate_vulnerability_reads.rb
@@ -26,7 +26,7 @@ module Gitlab
end
def connection
- ActiveRecord::Base.connection
+ ApplicationRecord.connection
end
def insert_query(start_id, end_id)
diff --git a/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb b/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
index c13dbd76630..2b27bad3497 100644
--- a/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
+++ b/lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb
@@ -58,7 +58,7 @@ module Gitlab
index_names = ApplicationRecord.connection.select_values("select indexname::text from pg_indexes where tablename = '#{table_name}' and indexdef ilike '%using gin%'")
index_names.each do |index_name|
- ActiveRecord::Base.connection.execute("select gin_clean_pending_list('#{index_name}')")
+ ApplicationRecord.connection.execute("select gin_clean_pending_list('#{index_name}')")
end
end
@@ -77,7 +77,7 @@ module Gitlab
projects = IsolatedModels::Project.where(id: project_ids)
.select("projects.id, projects.name, projects.path, projects.namespace_id, projects.visibility_level, shared_runners_enabled, '#{PROJECT_NAMESPACE_STI_NAME}', now(), now()")
- ActiveRecord::Base.connection.execute <<~SQL
+ ApplicationRecord.connection.execute <<~SQL
INSERT INTO namespaces (tmp_project_id, name, path, parent_id, visibility_level, shared_runners_enabled, type, created_at, updated_at)
#{projects.to_sql}
ON CONFLICT DO NOTHING;
@@ -89,7 +89,7 @@ module Gitlab
.joins("INNER JOIN namespaces ON projects.id = namespaces.tmp_project_id")
.select("namespaces.id, namespaces.tmp_project_id")
- ActiveRecord::Base.connection.execute <<~SQL
+ ApplicationRecord.connection.execute <<~SQL
WITH cte(project_namespace_id, project_id) AS #{::Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
#{projects.to_sql}
)
@@ -105,7 +105,7 @@ module Gitlab
.joins("INNER JOIN namespaces n2 ON namespaces.parent_id = n2.id")
.select("namespaces.id as project_namespace_id, n2.traversal_ids")
- ActiveRecord::Base.connection.execute <<~SQL
+ ApplicationRecord.connection.execute <<~SQL
UPDATE namespaces
SET traversal_ids = array_append(project_namespaces.traversal_ids, project_namespaces.project_namespace_id)
FROM (#{namespaces.to_sql}) as project_namespaces(project_namespace_id, traversal_ids)
diff --git a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
index c1b8de1f6aa..db7afd59f4d 100644
--- a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
+++ b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb
@@ -79,7 +79,7 @@ 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, default_enabled: true)
+ 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
diff --git a/lib/gitlab/background_migration/remove_vulnerability_finding_links.rb b/lib/gitlab/background_migration/remove_vulnerability_finding_links.rb
index 323f109449b..4acef9029f9 100644
--- a/lib/gitlab/background_migration/remove_vulnerability_finding_links.rb
+++ b/lib/gitlab/background_migration/remove_vulnerability_finding_links.rb
@@ -10,7 +10,7 @@ module Gitlab
include Gitlab::Database::DynamicModelHelpers
def perform(start_id, stop_id)
- define_batchable_model('vulnerability_finding_links', connection: ActiveRecord::Base.connection)
+ define_batchable_model('vulnerability_finding_links', connection: ApplicationRecord.connection)
.where(id: start_id..stop_id)
.delete_all
end
diff --git a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
index 80ca76ef37f..190e2fc22fb 100644
--- a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
+++ b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb
@@ -5,24 +5,24 @@ module Gitlab
# A job to nullify duplicate runners_token_encrypted values in projects table in batches
class ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects
class Project < ActiveRecord::Base # rubocop:disable Style/Documentation
- include ::EachBatch
+ include EachBatch
self.table_name = 'projects'
- scope :base_query, -> do
- where.not(runners_token_encrypted: nil)
- end
+ scope :base_query, -> { where.not(runners_token_encrypted: nil) }
end
def perform(start_id, end_id)
# Reset duplicate runner tokens that would prevent creating an unique index.
+ batch_records = Project.base_query.where(id: start_id..end_id)
+
duplicate_tokens = Project.base_query
- .where(id: start_id..end_id)
+ .where(runners_token_encrypted: batch_records.select(:runners_token_encrypted).distinct)
.group(:runners_token_encrypted)
.having('COUNT(*) > 1')
.pluck(:runners_token_encrypted)
- Project.where(runners_token_encrypted: duplicate_tokens).update_all(runners_token_encrypted: nil) if duplicate_tokens.any?
+ batch_records.where(runners_token_encrypted: duplicate_tokens).update_all(runners_token_encrypted: nil) if duplicate_tokens.any?
mark_job_as_succeeded(start_id, end_id)
end
@@ -30,7 +30,10 @@ module Gitlab
private
def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded('ResetDuplicateCiRunnersTokenEncryptedValuesOnProjects', arguments)
+ ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
end
end
end
diff --git a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb
index d87ce6c88d3..b58eefa0ab3 100644
--- a/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb
+++ b/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects.rb
@@ -5,24 +5,24 @@ module Gitlab
# A job to nullify duplicate ci_runners_token values in projects table in batches
class ResetDuplicateCiRunnersTokenValuesOnProjects
class Project < ActiveRecord::Base # rubocop:disable Style/Documentation
- include ::EachBatch
+ include EachBatch
self.table_name = 'projects'
- scope :base_query, -> do
- where.not(runners_token: nil)
- end
+ scope :base_query, -> { where.not(runners_token: nil) }
end
def perform(start_id, end_id)
# Reset duplicate runner tokens that would prevent creating an unique index.
+ batch_records = Project.base_query.where(id: start_id..end_id)
+
duplicate_tokens = Project.base_query
- .where(id: start_id..end_id)
+ .where(runners_token: batch_records.select(:runners_token).distinct)
.group(:runners_token)
.having('COUNT(*) > 1')
.pluck(:runners_token)
- Project.where(runners_token: duplicate_tokens).update_all(runners_token: nil) if duplicate_tokens.any?
+ batch_records.where(runners_token: duplicate_tokens).update_all(runners_token: nil) if duplicate_tokens.any?
mark_job_as_succeeded(start_id, end_id)
end
@@ -30,7 +30,10 @@ module Gitlab
private
def mark_job_as_succeeded(*arguments)
- Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded('ResetDuplicateCiRunnerValuesTokensOnProjects', arguments)
+ ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
end
end
end
diff --git a/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports.rb b/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports.rb
new file mode 100644
index 00000000000..83a7eb0b4cc
--- /dev/null
+++ b/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # A job to reset container_repositories that were skipped in the phase 2 registry
+ # migration due to too many tags.
+ class ResetTooManyTagsSkippedRegistryImports # rubocop:disable Migration/BackgroundMigrationBaseClass
+ class ContainerRepository < ::ApplicationRecord # rubocop:disable Style/Documentation
+ include EachBatch
+
+ self.table_name = 'container_repositories'
+
+ scope :base_query, -> { where(migration_state: 'import_skipped', migration_skipped_reason: 2) }
+ end
+
+ def perform(start_id, end_id)
+ ContainerRepository.base_query.where(id: start_id..end_id).each_batch(of: 100) do |sub_batch|
+ sub_batch.update_all(
+ migration_pre_import_started_at: nil,
+ migration_pre_import_done_at: nil,
+ migration_import_started_at: nil,
+ migration_import_done_at: nil,
+ migration_aborted_at: nil,
+ migration_skipped_at: nil,
+ migration_retries_count: 0,
+ migration_skipped_reason: nil,
+ migration_state: 'default',
+ migration_aborted_in_state: nil
+ )
+ end
+
+ mark_job_as_succeeded(start_id, end_id)
+ end
+
+ private
+
+ def mark_job_as_succeeded(*arguments)
+ ::Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(
+ self.class.name.demodulize,
+ arguments
+ )
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb b/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
index f54bb8256d0..38932e52bb0 100644
--- a/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
+++ b/lib/gitlab/background_migration/update_timelogs_null_spent_at.rb
@@ -28,7 +28,7 @@ module Gitlab
end
def connection
- @connection ||= ::ActiveRecord::Base.connection
+ @connection ||= ApplicationRecord.connection
end
def execute(sql)
diff --git a/lib/gitlab/background_migration/update_timelogs_project_id.rb b/lib/gitlab/background_migration/update_timelogs_project_id.rb
index 24c9967b88e..69bb5cf6e6d 100644
--- a/lib/gitlab/background_migration/update_timelogs_project_id.rb
+++ b/lib/gitlab/background_migration/update_timelogs_project_id.rb
@@ -36,7 +36,7 @@ module Gitlab
end
def execute(sql)
- @connection ||= ::ActiveRecord::Base.connection
+ @connection ||= ApplicationRecord.connection
@connection.execute(sql)
end
end
diff --git a/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb b/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb
index f5ba9e63333..10db9f5064a 100644
--- a/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb
+++ b/lib/gitlab/background_migration/update_users_where_two_factor_auth_required_from_group.rb
@@ -5,7 +5,7 @@ module Gitlab
module BackgroundMigration
class UpdateUsersWhereTwoFactorAuthRequiredFromGroup # rubocop:disable Metrics/ClassLength
def perform(start_id, stop_id)
- ActiveRecord::Base.connection.execute <<~SQL
+ ApplicationRecord.connection.execute <<~SQL
UPDATE
users
SET
diff --git a/lib/gitlab/backtrace_cleaner.rb b/lib/gitlab/backtrace_cleaner.rb
index caea05c720d..d2ca2057eb6 100644
--- a/lib/gitlab/backtrace_cleaner.rb
+++ b/lib/gitlab/backtrace_cleaner.rb
@@ -17,7 +17,6 @@ module Gitlab
lib/gitlab/profiler.rb
lib/gitlab/query_limiting/
lib/gitlab/request_context.rb
- lib/gitlab/request_profiler/
lib/gitlab/sidekiq_logging/
lib/gitlab/sidekiq_middleware/
lib/gitlab/sidekiq_status/
diff --git a/lib/gitlab/chat.rb b/lib/gitlab/chat.rb
index 23d4fb36b66..30e9989d270 100644
--- a/lib/gitlab/chat.rb
+++ b/lib/gitlab/chat.rb
@@ -4,7 +4,7 @@ module Gitlab
module Chat
# Returns `true` if Chatops is available for the current instance.
def self.available?
- ::Feature.enabled?(:chatops, default_enabled: true)
+ ::Feature.enabled?(:chatops)
end
end
end
diff --git a/lib/gitlab/checks/changes_access.rb b/lib/gitlab/checks/changes_access.rb
index 84c01cf4baf..2e469aabeb2 100644
--- a/lib/gitlab/checks/changes_access.rb
+++ b/lib/gitlab/checks/changes_access.rb
@@ -3,6 +3,8 @@
module Gitlab
module Checks
class ChangesAccess
+ include Gitlab::Utils::StrongMemoize
+
ATTRIBUTES = %i[user_access project protocol changes logger].freeze
attr_reader(*ATTRIBUTES)
@@ -33,29 +35,37 @@ module Gitlab
# changes. This set may also contain commits which are not referenced by
# any of the new revisions.
def commits
- allow_quarantine = true
+ strong_memoize(:commits) do
+ allow_quarantine = true
+
+ newrevs = @changes.map do |change|
+ oldrev = change[:oldrev]
+ newrev = change[:newrev]
- newrevs = @changes.map do |change|
- oldrev = change[:oldrev]
- newrev = change[:newrev]
+ next if blank_rev?(newrev)
- next if blank_rev?(newrev)
+ # In case any of the old revisions is blank, then we cannot reliably
+ # detect which commits are new for a given change when enumerating
+ # objects via the object quarantine directory given that the client
+ # may have pushed too many commits, and we don't know when to
+ # terminate the walk. We thus fall back to using `git rev-list --not
+ # --all`, which is a lot less efficient but at least can only ever
+ # returns commits which really are new.
+ allow_quarantine = false if allow_quarantine && blank_rev?(oldrev)
- # In case any of the old revisions is blank, then we cannot reliably
- # detect which commits are new for a given change when enumerating
- # objects via the object quarantine directory given that the client
- # may have pushed too many commits, and we don't know when to
- # terminate the walk. We thus fall back to using `git rev-list --not
- # --all`, which is a lot less efficient but at least can only ever
- # returns commits which really are new.
- allow_quarantine = false if allow_quarantine && blank_rev?(oldrev)
+ newrev
+ end.compact
- newrev
- end.compact
+ next [] if newrevs.empty?
- return [] if newrevs.empty?
+ # When filtering quarantined commits we can enable usage of the object
+ # quarantine no matter whether we have an `oldrev` or not.
+ if Feature.enabled?(:filter_quarantined_commits)
+ allow_quarantine = true
+ end
- @commits ||= project.repository.new_commits(newrevs, allow_quarantine: allow_quarantine)
+ project.repository.new_commits(newrevs, allow_quarantine: allow_quarantine)
+ end
end
# All commits which have been newly introduced via the given revision.
diff --git a/lib/gitlab/checks/lfs_check.rb b/lib/gitlab/checks/lfs_check.rb
index 84069a1249b..1d1d24c8fcc 100644
--- a/lib/gitlab/checks/lfs_check.rb
+++ b/lib/gitlab/checks/lfs_check.rb
@@ -9,7 +9,7 @@ module Gitlab
def validate!
# This feature flag is used for disabling integrity check on some envs
# because these costy calculations may cause performance issues
- return unless Feature.enabled?(:lfs_check, project, default_enabled: :yaml)
+ return unless Feature.enabled?(:lfs_check, project)
return unless project.lfs_enabled?
diff --git a/lib/gitlab/checks/single_change_access.rb b/lib/gitlab/checks/single_change_access.rb
index 2fd48dfbfe2..8e12801daee 100644
--- a/lib/gitlab/checks/single_change_access.rb
+++ b/lib/gitlab/checks/single_change_access.rb
@@ -35,7 +35,8 @@ module Gitlab
end
def commits
- @commits ||= project.repository.new_commits(newrev)
+ @commits ||= project.repository.new_commits(newrev,
+ allow_quarantine: Feature.enabled?(:filter_quarantined_commits))
end
protected
diff --git a/lib/gitlab/ci/badge/coverage/template.rb b/lib/gitlab/ci/badge/coverage/template.rb
index f12b4f2dbfb..18db4861dc9 100644
--- a/lib/gitlab/ci/badge/coverage/template.rb
+++ b/lib/gitlab/ci/badge/coverage/template.rb
@@ -23,13 +23,11 @@ module Gitlab::Ci
MIN_MEDIUM_DEFAULT = 75
def initialize(badge)
- @entity = badge.entity
@status = badge.status
- @key_text = badge.customization.dig(:key_text)
- @key_width = badge.customization.dig(:key_width)
@min_good = badge.customization.dig(:min_good)
@min_acceptable = badge.customization.dig(:min_acceptable)
@min_medium = badge.customization.dig(:min_medium)
+ super
end
def value_text
diff --git a/lib/gitlab/ci/badge/pipeline/template.rb b/lib/gitlab/ci/badge/pipeline/template.rb
index c39f96e4a34..417fff252a3 100644
--- a/lib/gitlab/ci/badge/pipeline/template.rb
+++ b/lib/gitlab/ci/badge/pipeline/template.rb
@@ -22,10 +22,8 @@ module Gitlab::Ci
}.freeze
def initialize(badge)
- @entity = badge.entity
@status = badge.status
- @key_text = badge.customization.dig(:key_text)
- @key_width = badge.customization.dig(:key_width)
+ super
end
def value_text
diff --git a/lib/gitlab/ci/badge/release/template.rb b/lib/gitlab/ci/badge/release/template.rb
index 65bff4371cf..354be6276fa 100644
--- a/lib/gitlab/ci/badge/release/template.rb
+++ b/lib/gitlab/ci/badge/release/template.rb
@@ -13,10 +13,8 @@ module Gitlab::Ci
VALUE_WIDTH_DEFAULT = 54
def initialize(badge)
- @entity = badge.entity
@tag = badge.tag || "none"
- @key_width = badge.customization.dig(:key_width)
- @key_text = badge.customization.dig(:key_text)
+ super
end
def key_text
diff --git a/lib/gitlab/ci/badge/template.rb b/lib/gitlab/ci/badge/template.rb
index d514a8577bd..b185fadc3a2 100644
--- a/lib/gitlab/ci/badge/template.rb
+++ b/lib/gitlab/ci/badge/template.rb
@@ -12,7 +12,8 @@ module Gitlab::Ci
def initialize(badge)
@entity = badge.entity
- @status = badge.status
+ @key_text = badge.customization.dig(:key_text)
+ @key_width = badge.customization.dig(:key_width)
end
def key_text
diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb
index 2c9524c89ff..15a4ff91c1b 100644
--- a/lib/gitlab/ci/config.rb
+++ b/lib/gitlab/ci/config.rb
@@ -26,11 +26,8 @@ module Gitlab
@source_ref_path = pipeline&.source_ref_path
@project = project
- if use_config_variables?
- pipeline ||= ::Ci::Pipeline.new(project: project, sha: sha, user: user, source: source)
- end
-
@context = self.logger.instrument(:config_build_context) do
+ pipeline ||= ::Ci::Pipeline.new(project: project, sha: sha, user: user, source: source)
build_context(project: project, pipeline: pipeline, sha: sha, user: user, parent_pipeline: parent_pipeline)
end
@@ -94,7 +91,8 @@ module Gitlab
def metadata
{
- includes: @context.includes
+ includes: @context.includes,
+ merged_yaml: @config&.deep_stringify_keys&.to_yaml
}
end
@@ -148,46 +146,15 @@ module Gitlab
sha: sha || find_sha(project),
user: user,
parent_pipeline: parent_pipeline,
- variables: build_variables(project: project, pipeline: pipeline),
+ variables: build_variables(pipeline: pipeline),
logger: logger)
end
- def build_variables(project:, pipeline:)
+ def build_variables(pipeline:)
logger.instrument(:config_build_variables) do
- build_variables_without_instrumentation(
- project: project,
- pipeline: pipeline
- )
- end
- end
-
- def build_variables_without_instrumentation(project:, pipeline:)
- if use_config_variables?
- return pipeline.variables_builder.config_variables
- end
-
- Gitlab::Ci::Variables::Collection.new.tap do |variables|
- break variables unless project
-
- # The order of the following lines is important as priority of CI variables is
- # defined globally within GitLab.
- #
- # See more detail in the docs: https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
- variables.concat(project.predefined_variables)
- variables.concat(pipeline.predefined_variables) if pipeline
- variables.concat(secret_variables(project: project, pipeline: pipeline))
- variables.concat(project.group.ci_variables_for(source_ref_path, project)) if project.group
- variables.concat(project.ci_variables_for(ref: source_ref_path))
- variables.concat(pipeline.variables) if pipeline
- variables.concat(pipeline.pipeline_schedule.job_variables) if pipeline&.pipeline_schedule
- end
- end
-
- def secret_variables(project:, pipeline:)
- if pipeline
- pipeline.variables_builder.secret_instance_variables
- else
- Gitlab::Ci::Variables::Builder::Instance.new.secret_variables
+ pipeline
+ .variables_builder
+ .config_variables
end
end
@@ -195,12 +162,6 @@ module Gitlab
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error, @context.sentry_payload)
end
- def use_config_variables?
- strong_memoize(:use_config_variables) do
- ::Feature.enabled?(:ci_variables_builder_config_variables, @project, default_enabled: :yaml)
- end
- end
-
# Overridden in EE
def rescue_errors
RESCUE_ERRORS
diff --git a/lib/gitlab/ci/config/entry/environment.rb b/lib/gitlab/ci/config/entry/environment.rb
index 2066e9be3b1..bc39abfe977 100644
--- a/lib/gitlab/ci/config/entry/environment.rb
+++ b/lib/gitlab/ci/config/entry/environment.rb
@@ -44,7 +44,7 @@ module Gitlab
validates :action,
type: String,
- inclusion: { in: %w[start stop prepare], message: 'should be start, stop or prepare' },
+ inclusion: { in: %w[start stop prepare verify access], message: 'should be start, stop, prepare, verify, or access' },
allow_nil: true
validates :deployment_tier,
diff --git a/lib/gitlab/ci/config/entry/job.rb b/lib/gitlab/ci/config/entry/job.rb
index 06c81fd65dd..7513936a18a 100644
--- a/lib/gitlab/ci/config/entry/job.rb
+++ b/lib/gitlab/ci/config/entry/job.rb
@@ -11,7 +11,7 @@ module Gitlab
include ::Gitlab::Ci::Config::Entry::Processable
ALLOWED_WHEN = %w[on_success on_failure always manual delayed].freeze
- ALLOWED_KEYS = %i[tags script type image services start_in artifacts
+ ALLOWED_KEYS = %i[tags script image services start_in artifacts
cache dependencies before_script after_script
environment coverage retry parallel interruptible timeout
release].freeze
@@ -55,11 +55,6 @@ module Gitlab
description: 'Commands that will be executed in this job.',
inherit: false
- entry :type, Entry::Stage,
- description: 'Deprecated: stage this job will be executed into.',
- inherit: false,
- deprecation: { deprecated: '9.0', warning: '14.8', removed: '15.0' }
-
entry :after_script, Entry::Commands,
description: 'Commands that will be executed when finishing job.',
inherit: true
@@ -135,19 +130,6 @@ module Gitlab
true
end
- def compose!(deps = nil)
- super do
- # The type keyword will be removed in 15.0:
- # https://gitlab.com/gitlab-org/gitlab/-/issues/346823
- if type_defined? && !stage_defined?
- @entries[:stage] = @entries[:type]
- log_and_warn_deprecated_entry(@entries[:type])
- end
-
- @entries.delete(:type)
- end
- end
-
def delayed?
self.when == 'delayed'
end
diff --git a/lib/gitlab/ci/config/entry/reports.rb b/lib/gitlab/ci/config/entry/reports.rb
index f8fce1abc06..d5d204bb995 100644
--- a/lib/gitlab/ci/config/entry/reports.rb
+++ b/lib/gitlab/ci/config/entry/reports.rb
@@ -15,7 +15,7 @@ module Gitlab
ALLOWED_KEYS =
%i[junit codequality sast secret_detection dependency_scanning container_scanning
dast performance browser_performance load_performance license_scanning metrics lsif
- dotenv cobertura terraform accessibility cluster_applications
+ dotenv terraform accessibility
requirements coverage_fuzzing api_fuzzing cluster_image_scanning
coverage_report].freeze
@@ -45,14 +45,10 @@ module Gitlab
validates :metrics, array_of_strings_or_string: true
validates :lsif, array_of_strings_or_string: true
validates :dotenv, array_of_strings_or_string: true
- validates :cobertura, array_of_strings_or_string: true
validates :terraform, array_of_strings_or_string: true
validates :accessibility, array_of_strings_or_string: true
- validates :cluster_applications, array_of_strings_or_string: true # DEPRECATED: https://gitlab.com/gitlab-org/gitlab/-/issues/333441
validates :requirements, array_of_strings_or_string: true
end
-
- validates :config, mutually_exclusive_keys: [:coverage_report, :cobertura]
end
def value
diff --git a/lib/gitlab/ci/config/entry/root.rb b/lib/gitlab/ci/config/entry/root.rb
index 7b58ef0b8ab..ff11c757dfa 100644
--- a/lib/gitlab/ci/config/entry/root.rb
+++ b/lib/gitlab/ci/config/entry/root.rb
@@ -12,7 +12,7 @@ module Gitlab
include ::Gitlab::Config::Entry::Configurable
ALLOWED_KEYS = %i[default include before_script image services
- after_script variables stages types cache workflow].freeze
+ after_script variables stages cache workflow].freeze
validations do
validates :config, allowed_keys: ALLOWED_KEYS
@@ -57,11 +57,6 @@ module Gitlab
description: 'Configuration of stages for this pipeline.',
reserved: true
- entry :types, Entry::Stages,
- description: 'Deprecated: stages for this pipeline.',
- reserved: true,
- deprecation: { deprecated: '9.0', warning: '14.8', removed: '15.0' }
-
entry :cache, Entry::Caches,
description: 'Configure caching between build jobs.',
reserved: true
@@ -100,7 +95,6 @@ module Gitlab
def compose!(_deps = nil)
super(self) do
- compose_deprecated_entries!
compose_jobs!
end
end
@@ -118,21 +112,6 @@ module Gitlab
end
# rubocop: enable CodeReuse/ActiveRecord
- def compose_deprecated_entries!
- ##
- # Deprecated `:types` key workaround - if types are defined and
- # stages are not defined we use types definition as stages.
- # This keyword will be removed in 15.0:
- # https://gitlab.com/gitlab-org/gitlab/-/issues/346823
- #
- if types_defined?
- @entries[:stages] = @entries[:types] unless stages_defined?
- log_and_warn_deprecated_entry(@entries[:types])
- end
-
- @entries.delete(:types)
- end
-
def filter_jobs!
return unless @config.is_a?(Hash)
diff --git a/lib/gitlab/ci/config/extendable/entry.rb b/lib/gitlab/ci/config/extendable/entry.rb
index 0001a259281..169d329fe02 100644
--- a/lib/gitlab/ci/config/extendable/entry.rb
+++ b/lib/gitlab/ci/config/extendable/entry.rb
@@ -99,7 +99,7 @@ module Gitlab
end
def circular_dependency?
- ancestors.include?(key)
+ ancestors.include?(key) # rubocop:disable Performance/AncestorsInclude
end
def unknown_extensions
diff --git a/lib/gitlab/ci/config/external/file/local.rb b/lib/gitlab/ci/config/external/file/local.rb
index ee9cc1552fe..feb2cbb19ad 100644
--- a/lib/gitlab/ci/config/external/file/local.rb
+++ b/lib/gitlab/ci/config/external/file/local.rb
@@ -23,6 +23,8 @@ module Gitlab
super.merge(
type: :local,
location: masked_location,
+ blob: masked_blob,
+ raw: masked_raw,
extra: {}
)
end
@@ -57,6 +59,24 @@ module Gitlab
variables: context.variables
}
end
+
+ def masked_blob
+ strong_memoize(:masked_blob) do
+ context.mask_variables_from(
+ Gitlab::Routing.url_helpers.project_blob_url(context.project, ::File.join(context.sha, location))
+ )
+ end
+ end
+
+ def masked_raw
+ return unless context.project
+
+ strong_memoize(:masked_raw) do
+ context.mask_variables_from(
+ Gitlab::Routing.url_helpers.project_raw_url(context.project, ::File.join(context.sha, location))
+ )
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/project.rb b/lib/gitlab/ci/config/external/file/project.rb
index 3d4436530a8..09c36a1bcb6 100644
--- a/lib/gitlab/ci/config/external/file/project.rb
+++ b/lib/gitlab/ci/config/external/file/project.rb
@@ -31,6 +31,8 @@ module Gitlab
super.merge(
type: :file,
location: masked_location,
+ blob: masked_blob,
+ raw: masked_raw,
extra: { project: masked_project_name, ref: masked_ref_name }
)
end
@@ -69,6 +71,8 @@ module Gitlab
end
def sha
+ return unless project
+
strong_memoize(:sha) do
project.commit(ref_name).try(:sha)
end
@@ -96,6 +100,26 @@ module Gitlab
context.mask_variables_from(ref_name)
end
end
+
+ def masked_blob
+ return unless project
+
+ strong_memoize(:masked_blob) do
+ context.mask_variables_from(
+ Gitlab::Routing.url_helpers.project_blob_url(project, ::File.join(sha, location))
+ )
+ end
+ end
+
+ def masked_raw
+ return unless project
+
+ strong_memoize(:masked_raw) do
+ context.mask_variables_from(
+ Gitlab::Routing.url_helpers.project_raw_url(project, ::File.join(sha, location))
+ )
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/external/file/remote.rb b/lib/gitlab/ci/config/external/file/remote.rb
index e7b007b4d8d..7d3a2362246 100644
--- a/lib/gitlab/ci/config/external/file/remote.rb
+++ b/lib/gitlab/ci/config/external/file/remote.rb
@@ -22,6 +22,8 @@ module Gitlab
super.merge(
type: :remote,
location: masked_location,
+ blob: nil,
+ raw: masked_location,
extra: {}
)
end
diff --git a/lib/gitlab/ci/config/external/file/template.rb b/lib/gitlab/ci/config/external/file/template.rb
index 9469f09ce13..58b81b259cb 100644
--- a/lib/gitlab/ci/config/external/file/template.rb
+++ b/lib/gitlab/ci/config/external/file/template.rb
@@ -9,6 +9,7 @@ module Gitlab
attr_reader :location
SUFFIX = '.gitlab-ci.yml'
+ HOST = 'https://gitlab.com/gitlab-org/gitlab/-/raw/master'
def initialize(params, context)
@location = params[:template]
@@ -24,6 +25,8 @@ module Gitlab
super.merge(
type: :template,
location: masked_location,
+ blob: nil,
+ raw: masked_raw,
extra: {}
)
end
@@ -51,6 +54,14 @@ module Gitlab
def fetch_template_content
Gitlab::Template::GitlabCiYmlTemplate.find(template_name, context.project)&.content
end
+
+ def masked_raw
+ strong_memoize(:masked_raw) do
+ context.mask_variables_from(
+ "#{HOST}/#{Gitlab::Template::GitlabCiYmlTemplate::BASE_DIR}/#{location}"
+ )
+ end
+ end
end
end
end
diff --git a/lib/gitlab/ci/jwt.rb b/lib/gitlab/ci/jwt.rb
index 3fb86b8b3e8..97774bc5e13 100644
--- a/lib/gitlab/ci/jwt.rb
+++ b/lib/gitlab/ci/jwt.rb
@@ -73,7 +73,7 @@ module Gitlab
def key
@key ||= begin
- key_data = if Feature.enabled?(:ci_jwt_signing_key, build.project, default_enabled: true)
+ key_data = if Feature.enabled?(:ci_jwt_signing_key, build.project)
Gitlab::CurrentSettings.ci_jwt_signing_key
else
Rails.application.secrets.openid_connect_signing_key
diff --git a/lib/gitlab/ci/lint.rb b/lib/gitlab/ci/lint.rb
index 5591ed62436..51743a1f273 100644
--- a/lib/gitlab/ci/lint.rb
+++ b/lib/gitlab/ci/lint.rb
@@ -4,18 +4,23 @@ module Gitlab
module Ci
class Lint
class Result
- attr_reader :jobs, :merged_yaml, :errors, :warnings
+ attr_reader :jobs, :merged_yaml, :errors, :warnings, :includes
- def initialize(jobs:, merged_yaml:, errors:, warnings:)
+ def initialize(jobs:, merged_yaml:, errors:, warnings:, includes:)
@jobs = jobs
@merged_yaml = merged_yaml
@errors = errors
@warnings = warnings
+ @includes = includes
end
def valid?
@errors.empty?
end
+
+ def status
+ valid? ? :valid : :invalid
+ end
end
LOG_MAX_DURATION_THRESHOLD = 2.seconds
@@ -44,9 +49,10 @@ module Gitlab
Result.new(
jobs: dry_run_convert_to_jobs(pipeline.stages),
- merged_yaml: pipeline.merged_yaml,
+ merged_yaml: pipeline.config_metadata.try(:[], :merged_yaml),
errors: pipeline.error_messages.map(&:content),
- warnings: pipeline.warning_messages(limit: ::Gitlab::Ci::Warnings::MAX_LIMIT).map(&:content)
+ warnings: pipeline.warning_messages(limit: ::Gitlab::Ci::Warnings::MAX_LIMIT).map(&:content),
+ includes: pipeline.config_metadata.try(:[], :includes)
)
end
@@ -57,9 +63,10 @@ module Gitlab
Result.new(
jobs: static_validation_convert_to_jobs(result),
- merged_yaml: result.merged_yaml,
+ merged_yaml: result.config_metadata[:merged_yaml],
errors: result.errors,
- warnings: result.warnings.take(::Gitlab::Ci::Warnings::MAX_LIMIT) # rubocop: disable CodeReuse/ActiveRecord
+ warnings: result.warnings.take(::Gitlab::Ci::Warnings::MAX_LIMIT), # rubocop: disable CodeReuse/ActiveRecord
+ includes: result.config_metadata[:includes]
)
ensure
logger.commit(pipeline: ::Ci::Pipeline.new, caller: self.class.name)
diff --git a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
index cef029bd749..4460843545e 100644
--- a/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
+++ b/lib/gitlab/ci/parsers/security/validators/schema_validator.rb
@@ -6,39 +6,28 @@ module Gitlab
module Security
module Validators
class SchemaValidator
- # https://docs.gitlab.com/ee/update/deprecations.html#147
SUPPORTED_VERSIONS = {
- cluster_image_scanning: %w[14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- container_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- coverage_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- dast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- api_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- dependency_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- sast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1],
- secret_detection: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1]
+ cluster_image_scanning: %w[14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ container_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ coverage_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ dast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ api_fuzzing: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ dependency_scanning: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ sast: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2],
+ secret_detection: %w[14.0.0 14.0.1 14.0.2 14.0.3 14.0.4 14.0.5 14.0.6 14.1.0 14.1.1 14.1.2]
}.freeze
- # https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/tags
- PREVIOUS_RELEASES = %w[10.0.0 12.0.0 12.1.0 13.0.0
- 13.1.0 2.3.0-rc1 2.3.0-rc1 2.3.1-rc1 2.3.2-rc1 2.3.3-rc1
- 2.4.0-rc1 3.0.0 3.0.0-rc1 3.1.0-rc1 4.0.0-rc1 5.0.0-rc1
- 5.0.1-rc1 6.0.0-rc1 6.0.1-rc1 6.1.0-rc1 7.0.0-rc1 7.0.1-rc1
- 8.0.0-rc1 8.0.1-rc1 8.1.0-rc1 9.0.0-rc1].freeze
-
- # These come from https://app.periscopedata.com/app/gitlab/895813/Secure-Scan-metrics?widget=12248944&udv=1385516
- KNOWN_VERSIONS_TO_REMOVE = %w[0.1 1.0 1.0.0 1.2 1.3 10.0.0 12.1.0 13.1.0 2.0 2.1 2.1.0 2.3 2.3.0 2.4 3.0 3.0.0 3.0.6 3.13.2 V2.7.0].freeze
-
- VERSIONS_TO_REMOVE_IN_15_0 = (PREVIOUS_RELEASES + KNOWN_VERSIONS_TO_REMOVE).freeze
+ VERSIONS_TO_REMOVE_IN_16_0 = [].freeze
DEPRECATED_VERSIONS = {
- cluster_image_scanning: VERSIONS_TO_REMOVE_IN_15_0,
- container_scanning: VERSIONS_TO_REMOVE_IN_15_0,
- coverage_fuzzing: VERSIONS_TO_REMOVE_IN_15_0,
- dast: VERSIONS_TO_REMOVE_IN_15_0,
- api_fuzzing: VERSIONS_TO_REMOVE_IN_15_0,
- dependency_scanning: VERSIONS_TO_REMOVE_IN_15_0,
- sast: VERSIONS_TO_REMOVE_IN_15_0,
- secret_detection: VERSIONS_TO_REMOVE_IN_15_0
+ cluster_image_scanning: VERSIONS_TO_REMOVE_IN_16_0,
+ container_scanning: VERSIONS_TO_REMOVE_IN_16_0,
+ coverage_fuzzing: VERSIONS_TO_REMOVE_IN_16_0,
+ dast: VERSIONS_TO_REMOVE_IN_16_0,
+ api_fuzzing: VERSIONS_TO_REMOVE_IN_16_0,
+ dependency_scanning: VERSIONS_TO_REMOVE_IN_16_0,
+ sast: VERSIONS_TO_REMOVE_IN_16_0,
+ secret_detection: VERSIONS_TO_REMOVE_IN_16_0
}.freeze
class Schema
@@ -165,7 +154,6 @@ module Gitlab
def handle_unsupported_report_version(treat_as:)
if report_version.nil?
message = "Report version not provided, #{report_type} report type supports versions: #{supported_schema_versions}"
- add_message_as(level: treat_as, message: message)
else
message = "Version #{report_version} for report type #{report_type} is unsupported, supported versions for this report type are: #{supported_schema_versions}"
end
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/cluster-image-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/cluster-image-scanning-report-format.json
new file mode 100644
index 00000000000..31840a7e914
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/cluster-image-scanning-report-format.json
@@ -0,0 +1,977 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Cluster Image Scanning",
+ "description": "This schema provides the the report format for Cluster Image Scanning (https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "cluster_image_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "dependency",
+ "image",
+ "kubernetes_resource"
+ ],
+ "properties": {
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ },
+ "operating_system": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The operating system that contains the vulnerable package."
+ },
+ "image": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The analyzed Docker image.",
+ "examples": [
+ "index.docker.io/library/nginx:1.21"
+ ]
+ },
+ "kubernetes_resource": {
+ "type": "object",
+ "description": "The specific Kubernetes resource that was scanned.",
+ "required": [
+ "namespace",
+ "kind",
+ "name",
+ "container_name"
+ ],
+ "properties": {
+ "namespace": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The Kubernetes namespace the resource that had its image scanned.",
+ "examples": [
+ "default",
+ "staging",
+ "production"
+ ]
+ },
+ "kind": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The Kubernetes kind the resource that had its image scanned.",
+ "examples": [
+ "Deployment",
+ "DaemonSet"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The name of the resource that had its image scanned.",
+ "examples": [
+ "nginx-ingress"
+ ]
+ },
+ "container_name": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The name of the container that had its image scanned.",
+ "examples": [
+ "nginx"
+ ]
+ },
+ "agent_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The GitLab ID of the Kubernetes Agent which performed the scan.",
+ "examples": [
+ "1234"
+ ]
+ },
+ "cluster_id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 255,
+ "description": "The GitLab ID of the Kubernetes cluster when using cluster integration.",
+ "examples": [
+ "1234"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/container-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/container-scanning-report-format.json
new file mode 100644
index 00000000000..c70628a0949
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/container-scanning-report-format.json
@@ -0,0 +1,911 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Container Scanning",
+ "description": "This schema provides the the report format for Container Scanning (https://docs.gitlab.com/ee/user/application_security/container_scanning).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "container_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "dependency",
+ "operating_system",
+ "image"
+ ],
+ "properties": {
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ },
+ "operating_system": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The operating system that contains the vulnerable package."
+ },
+ "image": {
+ "type": "string",
+ "minLength": 1,
+ "pattern": "^[^:]+(:\\d+[^:]*)?:[^:]+$",
+ "description": "The analyzed Docker image."
+ },
+ "default_branch_image": {
+ "type": "string",
+ "maxLength": 255,
+ "pattern": "^[a-zA-Z0-9/_.-]+(:\\d+[a-zA-Z0-9/_.-]*)?:[a-zA-Z0-9_.-]+$",
+ "description": "The name of the image on the default branch."
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/coverage-fuzzing-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/coverage-fuzzing-report-format.json
new file mode 100644
index 00000000000..fbc7b4ea733
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/coverage-fuzzing-report-format.json
@@ -0,0 +1,874 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Fuzz Testing",
+ "description": "This schema provides the report format for Coverage Guided Fuzz Testing (https://docs.gitlab.com/ee/user/application_security/coverage_fuzzing).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "coverage_fuzzing"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "description": "The location of the error",
+ "type": "object",
+ "properties": {
+ "crash_address": {
+ "type": "string",
+ "description": "The relative address in memory were the crash occurred.",
+ "examples": [
+ "0xabababab"
+ ]
+ },
+ "stacktrace_snippet": {
+ "type": "string",
+ "description": "The stack trace recorded during fuzzing resulting the crash.",
+ "examples": [
+ "func_a+0xabcd\nfunc_b+0xabcc"
+ ]
+ },
+ "crash_state": {
+ "type": "string",
+ "description": "Minimised and normalized crash stack-trace (called crash_state).",
+ "examples": [
+ "func_a+0xa\nfunc_b+0xb\nfunc_c+0xc"
+ ]
+ },
+ "crash_type": {
+ "type": "string",
+ "description": "Type of the crash.",
+ "examples": [
+ "Heap-Buffer-overflow",
+ "Division-by-zero"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dast-report-format.json
new file mode 100644
index 00000000000..3c9db0546b1
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dast-report-format.json
@@ -0,0 +1,1287 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab DAST",
+ "description": "This schema provides the the report format for Dynamic Application Security Testing (https://docs.gitlab.com/ee/user/application_security/dast).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanned_resources",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "dast",
+ "api_fuzzing"
+ ]
+ },
+ "scanned_resources": {
+ "type": "array",
+ "description": "The attack surface scanned by DAST.",
+ "items": {
+ "type": "object",
+ "required": [
+ "method",
+ "url",
+ "type"
+ ],
+ "properties": {
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method of the scanned resource.",
+ "examples": [
+ "GET",
+ "POST",
+ "HEAD"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the scanned resource.",
+ "examples": [
+ "http://my.site.com/a-page"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Type of the scanned resource, for DAST, this must be 'url'.",
+ "examples": [
+ "url"
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "evidence": {
+ "type": "object",
+ "properties": {
+ "source": {
+ "type": "object",
+ "description": "Source of evidence",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Unique source identifier",
+ "examples": [
+ "assert:LogAnalysis",
+ "assert:StatusCode"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Source display name",
+ "examples": [
+ "Log Analysis",
+ "Status Code"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "Link to additional information",
+ "examples": [
+ "https://docs.gitlab.com/ee/development/integrations/secure.html"
+ ]
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "description": "Human readable string containing evidence of the vulnerability.",
+ "examples": [
+ "Credit card 4111111111111111 found",
+ "Server leaked information nginx/1.17.6"
+ ]
+ },
+ "request": {
+ "type": "object",
+ "description": "An HTTP request.",
+ "required": [
+ "headers",
+ "method",
+ "url"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method used in the request.",
+ "examples": [
+ "GET",
+ "POST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the request.",
+ "examples": [
+ "http://my.site.com/vulnerable-endpoint?show-credit-card"
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the request for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "user=jsmith&first=%27&last=smith"
+ ]
+ }
+ }
+ },
+ "response": {
+ "type": "object",
+ "description": "An HTTP response.",
+ "required": [
+ "headers",
+ "reason_phrase",
+ "status_code"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "reason_phrase": {
+ "type": "string",
+ "description": "HTTP reason phrase of the response.",
+ "examples": [
+ "OK",
+ "Internal Server Error"
+ ]
+ },
+ "status_code": {
+ "type": "integer",
+ "description": "HTTP status code of the response.",
+ "examples": [
+ 200,
+ 500
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the response for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "{\"user_id\": 2}"
+ ]
+ }
+ }
+ },
+ "supporting_messages": {
+ "type": "array",
+ "description": "Array of supporting http messages.",
+ "items": {
+ "type": "object",
+ "description": "A supporting http message.",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Message display name.",
+ "examples": [
+ "Unmodified",
+ "Recorded"
+ ]
+ },
+ "request": {
+ "type": "object",
+ "description": "An HTTP request.",
+ "required": [
+ "headers",
+ "method",
+ "url"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "method": {
+ "type": "string",
+ "minLength": 1,
+ "description": "HTTP method used in the request.",
+ "examples": [
+ "GET",
+ "POST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "URL of the request.",
+ "examples": [
+ "http://my.site.com/vulnerable-endpoint?show-credit-card"
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the request for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "user=jsmith&first=%27&last=smith"
+ ]
+ }
+ }
+ },
+ "response": {
+ "type": "object",
+ "description": "An HTTP response.",
+ "required": [
+ "headers",
+ "reason_phrase",
+ "status_code"
+ ],
+ "properties": {
+ "headers": {
+ "type": "array",
+ "description": "HTTP headers present on the request.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "value"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Name of the HTTP header.",
+ "examples": [
+ "Accept",
+ "Content-Length",
+ "Content-Type"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the HTTP header.",
+ "examples": [
+ "*/*",
+ "560",
+ "application/json; charset=utf-8"
+ ]
+ }
+ }
+ }
+ },
+ "reason_phrase": {
+ "type": "string",
+ "description": "HTTP reason phrase of the response.",
+ "examples": [
+ "OK",
+ "Internal Server Error"
+ ]
+ },
+ "status_code": {
+ "type": "integer",
+ "description": "HTTP status code of the response.",
+ "examples": [
+ 200,
+ 500
+ ]
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the response for display purposes. Body must be suitable for display (not binary), and truncated to a reasonable size.",
+ "examples": [
+ "{\"user_id\": 2}"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "properties": {
+ "hostname": {
+ "type": "string",
+ "description": "The protocol, domain, and port of the application where the vulnerability was found."
+ },
+ "method": {
+ "type": "string",
+ "description": "The HTTP method that was used to request the URL where the vulnerability was found."
+ },
+ "param": {
+ "type": "string",
+ "description": "A value provided by a vulnerability rule related to the found vulnerability. Examples include a header value, or a parameter used in a HTTP POST."
+ },
+ "path": {
+ "type": "string",
+ "description": "The path of the URL where the vulnerability was found. Typically, this would start with a forward slash."
+ }
+ }
+ },
+ "assets": {
+ "type": "array",
+ "description": "Array of build assets associated with vulnerability.",
+ "items": {
+ "type": "object",
+ "description": "Describes an asset associated with vulnerability.",
+ "required": [
+ "type",
+ "name",
+ "url"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "The type of asset",
+ "enum": [
+ "http_session",
+ "postman"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Display name for asset",
+ "examples": [
+ "HTTP Messages",
+ "Postman Collection"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Link to asset in build artifacts",
+ "examples": [
+ "https://gitlab.com/gitlab-org/security-products/dast/-/jobs/626397001/artifacts/file//output/zap_session.data"
+ ]
+ }
+ }
+ }
+ },
+ "discovered_at": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss.sss, representing when the vulnerability was discovered",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}\\.\\d{3}$",
+ "examples": [
+ "2020-01-28T03:26:02.956"
+ ]
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dependency-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dependency-scanning-report-format.json
new file mode 100644
index 00000000000..c7459216faf
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/dependency-scanning-report-format.json
@@ -0,0 +1,968 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Dependency Scanning",
+ "description": "This schema provides the the report format for Dependency Scanning analyzers (https://docs.gitlab.com/ee/user/application_security/dependency_scanning).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "dependency_files",
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "dependency_scanning"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "required": [
+ "file",
+ "dependency"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Path to the manifest or lock file where the dependency is declared (such as yarn.lock)."
+ },
+ "dependency": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ },
+ "dependency_files": {
+ "type": "array",
+ "description": "List of dependency files identified in the project.",
+ "items": {
+ "type": "object",
+ "required": [
+ "path",
+ "package_manager",
+ "dependencies"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1
+ },
+ "package_manager": {
+ "type": "string",
+ "minLength": 1
+ },
+ "dependencies": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Describes the dependency of a project where the vulnerability is located.",
+ "properties": {
+ "package": {
+ "type": "object",
+ "description": "Provides information on the package where the vulnerability is located.",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the package where the vulnerability is located."
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "Version of the vulnerable package."
+ },
+ "iid": {
+ "description": "ID that identifies the dependency in the scope of a dependency file.",
+ "type": "number"
+ },
+ "direct": {
+ "type": "boolean",
+ "description": "Tells whether this is a direct, top-level dependency of the scanned project."
+ },
+ "dependency_path": {
+ "type": "array",
+ "description": "Ancestors of the dependency, starting from a direct project dependency, and ending with an immediate parent of the dependency. The dependency itself is excluded from the path. Direct dependencies have no path.",
+ "items": {
+ "type": "object",
+ "required": [
+ "iid"
+ ],
+ "properties": {
+ "iid": {
+ "type": "number",
+ "description": "ID that is unique in the scope of a parent object, and specific to the resource type."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/sast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/sast-report-format.json
new file mode 100644
index 00000000000..20818792652
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/sast-report-format.json
@@ -0,0 +1,869 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab SAST",
+ "description": "This schema provides the report format for Static Application Security Testing analyzers (https://docs.gitlab.com/ee/user/application_security/sast).",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "sast"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "type": "object",
+ "description": "Identifies the vulnerability's location.",
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the code affected by the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the code affected by the vulnerability."
+ },
+ "class": {
+ "type": "string",
+ "description": "Provides the name of the class where the vulnerability is located."
+ },
+ "method": {
+ "type": "string",
+ "description": "Provides the name of the method where the vulnerability is located."
+ }
+ }
+ },
+ "raw_source_code_extract": {
+ "type": "string",
+ "description": "Provides an unsanitized excerpt of the affected source code."
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/secret-detection-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/secret-detection-report-format.json
new file mode 100644
index 00000000000..12386d2c1d4
--- /dev/null
+++ b/lib/gitlab/ci/parsers/security/validators/schemas/14.1.2/secret-detection-report-format.json
@@ -0,0 +1,892 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "Report format for GitLab Secret Detection",
+ "description": "This schema provides the the report format for the Secret Detection analyzer (https://docs.gitlab.com/ee/user/application_security/secret_detection)",
+ "definitions": {
+ "detail_type": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/named_list"
+ },
+ {
+ "$ref": "#/definitions/list"
+ },
+ {
+ "$ref": "#/definitions/table"
+ },
+ {
+ "$ref": "#/definitions/text"
+ },
+ {
+ "$ref": "#/definitions/url"
+ },
+ {
+ "$ref": "#/definitions/code"
+ },
+ {
+ "$ref": "#/definitions/value"
+ },
+ {
+ "$ref": "#/definitions/diff"
+ },
+ {
+ "$ref": "#/definitions/markdown"
+ },
+ {
+ "$ref": "#/definitions/commit"
+ },
+ {
+ "$ref": "#/definitions/file_location"
+ },
+ {
+ "$ref": "#/definitions/module_location"
+ }
+ ]
+ },
+ "text_value": {
+ "type": "string"
+ },
+ "named_field": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "$ref": "#/definitions/text_value",
+ "minLength": 1
+ },
+ "description": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "named_list": {
+ "type": "object",
+ "description": "An object with named and typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "named-list"
+ },
+ "items": {
+ "type": "object",
+ "patternProperties": {
+ "^.*$": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/named_field"
+ },
+ {
+ "$ref": "#/definitions/detail_type"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "list": {
+ "type": "object",
+ "description": "A list of typed fields",
+ "required": [
+ "type",
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "list"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "description": "A table of typed fields",
+ "required": [
+ "type",
+ "rows"
+ ],
+ "properties": {
+ "type": {
+ "const": "table"
+ },
+ "header": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ },
+ "rows": {
+ "type": "array",
+ "items": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/detail_type"
+ }
+ }
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "Raw text",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "text"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value"
+ }
+ }
+ },
+ "url": {
+ "type": "object",
+ "description": "A single URL",
+ "required": [
+ "type",
+ "href"
+ ],
+ "properties": {
+ "type": {
+ "const": "url"
+ },
+ "text": {
+ "$ref": "#/definitions/text_value"
+ },
+ "href": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "http://mysite.com"
+ ]
+ }
+ }
+ },
+ "code": {
+ "type": "object",
+ "description": "A codeblock",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "code"
+ },
+ "value": {
+ "type": "string"
+ },
+ "lang": {
+ "type": "string",
+ "description": "A programming language"
+ }
+ }
+ },
+ "value": {
+ "type": "object",
+ "description": "A field that can store a range of types of value",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "value"
+ },
+ "value": {
+ "type": [
+ "number",
+ "string",
+ "boolean"
+ ]
+ }
+ }
+ },
+ "diff": {
+ "type": "object",
+ "description": "A diff",
+ "required": [
+ "type",
+ "before",
+ "after"
+ ],
+ "properties": {
+ "type": {
+ "const": "diff"
+ },
+ "before": {
+ "type": "string"
+ },
+ "after": {
+ "type": "string"
+ }
+ }
+ },
+ "markdown": {
+ "type": "object",
+ "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "markdown"
+ },
+ "value": {
+ "$ref": "#/definitions/text_value",
+ "examples": [
+ "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
+ ]
+ }
+ }
+ },
+ "commit": {
+ "type": "object",
+ "description": "A commit/tag/branch within the GitLab project",
+ "required": [
+ "type",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "const": "commit"
+ },
+ "value": {
+ "type": "string",
+ "description": "The commit SHA",
+ "minLength": 1
+ }
+ }
+ },
+ "file_location": {
+ "type": "object",
+ "description": "A location within a file in the project",
+ "required": [
+ "type",
+ "file_name",
+ "line_start"
+ ],
+ "properties": {
+ "type": {
+ "const": "file-location"
+ },
+ "file_name": {
+ "type": "string",
+ "minLength": 1
+ },
+ "line_start": {
+ "type": "integer"
+ },
+ "line_end": {
+ "type": "integer"
+ }
+ }
+ },
+ "module_location": {
+ "type": "object",
+ "description": "A location within a binary module of the form module+relative_offset",
+ "required": [
+ "type",
+ "module_name",
+ "offset"
+ ],
+ "properties": {
+ "type": {
+ "const": "module-location"
+ },
+ "module_name": {
+ "type": "string",
+ "minLength": 1,
+ "examples": [
+ "compiled_binary"
+ ]
+ },
+ "offset": {
+ "type": "integer",
+ "examples": [
+ 100
+ ]
+ }
+ }
+ }
+ },
+ "self": {
+ "version": "14.1.2"
+ },
+ "required": [
+ "version",
+ "vulnerabilities"
+ ],
+ "additionalProperties": true,
+ "properties": {
+ "scan": {
+ "type": "object",
+ "required": [
+ "end_time",
+ "scanner",
+ "start_time",
+ "status",
+ "type"
+ ],
+ "properties": {
+ "end_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-01-28T03:26:02"
+ ]
+ },
+ "messages": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Communication intended for the initiator of a scan.",
+ "required": [
+ "level",
+ "value"
+ ],
+ "properties": {
+ "level": {
+ "type": "string",
+ "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
+ "enum": [
+ "info",
+ "warn",
+ "fatal"
+ ],
+ "examples": [
+ "info"
+ ]
+ },
+ "value": {
+ "type": "string",
+ "description": "The message to communicate.",
+ "minLength": 1,
+ "examples": [
+ "Permission denied, scanning aborted"
+ ]
+ }
+ }
+ }
+ },
+ "analyzer": {
+ "type": "object",
+ "description": "Object defining the analyzer used to perform the scan. Analyzers typically delegate to an underlying scanner to run the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "gitlab-dast"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the analyzer, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "GitLab DAST"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "format": "uri",
+ "pattern": "^https?://.+",
+ "description": "A link to more information about the analyzer.",
+ "examples": [
+ "https://docs.gitlab.com/ee/user/application_security/dast"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the analyzer.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the analyzer.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ }
+ }
+ },
+ "scanner": {
+ "type": "object",
+ "description": "Object defining the scanner used to perform the scan.",
+ "required": [
+ "id",
+ "name",
+ "version",
+ "vendor"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique id that identifies the scanner.",
+ "minLength": 1,
+ "examples": [
+ "my-sast-scanner"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "A human readable value that identifies the scanner, not required to be unique.",
+ "minLength": 1,
+ "examples": [
+ "My SAST Scanner"
+ ]
+ },
+ "url": {
+ "type": "string",
+ "description": "A link to more information about the scanner.",
+ "examples": [
+ "https://scanner.url"
+ ]
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the scanner.",
+ "minLength": 1,
+ "examples": [
+ "1.0.2"
+ ]
+ },
+ "vendor": {
+ "description": "The vendor/maintainer of the scanner.",
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the vendor.",
+ "minLength": 1,
+ "examples": [
+ "GitLab"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "start_time": {
+ "type": "string",
+ "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
+ "examples": [
+ "2020-02-14T16:01:59"
+ ]
+ },
+ "status": {
+ "type": "string",
+ "description": "Result of the scan.",
+ "enum": [
+ "success",
+ "failure"
+ ]
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of the scan.",
+ "enum": [
+ "secret_detection"
+ ]
+ }
+ }
+ },
+ "schema": {
+ "type": "string",
+ "description": "URI pointing to the validating security report schema.",
+ "format": "uri"
+ },
+ "version": {
+ "type": "string",
+ "description": "The version of the schema to which the JSON report conforms.",
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
+ },
+ "vulnerabilities": {
+ "type": "array",
+ "description": "Array of vulnerability objects.",
+ "items": {
+ "type": "object",
+ "description": "Describes the vulnerability using GitLab Flavored Markdown",
+ "required": [
+ "category",
+ "cve",
+ "identifiers",
+ "location",
+ "scanner"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
+ "examples": [
+ "642735a5-1425-428d-8d4e-3c854885a3c9"
+ ]
+ },
+ "category": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the vulnerability. This must not include the finding's specific information."
+ },
+ "message": {
+ "type": "string",
+ "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
+ },
+ "description": {
+ "type": "string",
+ "description": "A long text section describing the vulnerability more fully."
+ },
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ },
+ "severity": {
+ "type": "string",
+ "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Info",
+ "Unknown",
+ "Low",
+ "Medium",
+ "High",
+ "Critical"
+ ]
+ },
+ "confidence": {
+ "type": "string",
+ "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
+ "enum": [
+ "Ignore",
+ "Unknown",
+ "Experimental",
+ "Low",
+ "Medium",
+ "High",
+ "Confirmed"
+ ]
+ },
+ "solution": {
+ "type": "string",
+ "description": "Explanation of how to fix the vulnerability."
+ },
+ "scanner": {
+ "description": "Describes the scanner used to find this vulnerability.",
+ "type": "object",
+ "required": [
+ "id",
+ "name"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "description": "The scanner's ID, as a snake_case string."
+ },
+ "name": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Human-readable name of the scanner."
+ }
+ }
+ },
+ "identifiers": {
+ "type": "array",
+ "minItems": 1,
+ "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type",
+ "name",
+ "value"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
+ "minLength": 1
+ },
+ "name": {
+ "type": "string",
+ "description": "Human-readable name of the identifier.",
+ "minLength": 1
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the identifier's documentation.",
+ "format": "uri"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value of the identifier, for matching purpose.",
+ "minLength": 1
+ }
+ }
+ }
+ },
+ "links": {
+ "type": "array",
+ "description": "An array of references to external documentation or articles that describe the vulnerability.",
+ "items": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the vulnerability details link."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the vulnerability details document.",
+ "format": "uri"
+ }
+ }
+ }
+ },
+ "details": {
+ "$ref": "#/definitions/named_list/properties/items"
+ },
+ "tracking": {
+ "description": "Describes how this vulnerability should be tracked as the project changes.",
+ "oneOf": [
+ {
+ "description": "Declares that a series of items should be tracked using source-specific tracking methods.",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "type": {
+ "const": "source"
+ },
+ "items": {
+ "type": "array",
+ "items": {
+ "description": "An item that should be tracked using source-specific tracking methods.",
+ "type": "object",
+ "required": [
+ "signatures"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located."
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the file that includes the vulnerability."
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the file that includes the vulnerability."
+ },
+ "signatures": {
+ "type": "array",
+ "description": "An array of calculated tracking signatures for this tracking item.",
+ "minItems": 1,
+ "items": {
+ "description": "A calculated tracking signature value and metadata.",
+ "required": [
+ "algorithm",
+ "value"
+ ],
+ "properties": {
+ "algorithm": {
+ "type": "string",
+ "description": "The algorithm used to generate the signature."
+ },
+ "value": {
+ "type": "string",
+ "description": "The result of this signature algorithm."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "description": "Each tracking type must declare its own type."
+ }
+ }
+ },
+ "flags": {
+ "description": "Flags that can be attached to vulnerabilities.",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "description": "Informational flags identified and assigned to a vulnerability.",
+ "required": [
+ "type",
+ "origin",
+ "description"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "minLength": 1,
+ "description": "Result of the scan.",
+ "enum": [
+ "flagged-as-likely-false-positive"
+ ]
+ },
+ "origin": {
+ "minLength": 1,
+ "description": "Tool that issued the flag.",
+ "type": "string"
+ },
+ "description": {
+ "minLength": 1,
+ "description": "What the flag is about.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "location": {
+ "required": [
+ "commit"
+ ],
+ "properties": {
+ "file": {
+ "type": "string",
+ "description": "Path to the file where the vulnerability is located"
+ },
+ "commit": {
+ "type": "object",
+ "description": "Represents the commit in which the vulnerability was detected",
+ "required": [
+ "sha"
+ ],
+ "properties": {
+ "author": {
+ "type": "string"
+ },
+ "date": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "sha": {
+ "type": "string",
+ "minLength": 1
+ }
+ }
+ },
+ "start_line": {
+ "type": "number",
+ "description": "The first line of the code affected by the vulnerability"
+ },
+ "end_line": {
+ "type": "number",
+ "description": "The last line of the code affected by the vulnerability"
+ },
+ "class": {
+ "type": "string",
+ "description": "Provides the name of the class where the vulnerability is located"
+ },
+ "method": {
+ "type": "string",
+ "description": "Provides the name of the method where the vulnerability is located"
+ }
+ }
+ },
+ "raw_source_code_extract": {
+ "type": "string",
+ "description": "Provides an unsanitized excerpt of the affected source code."
+ }
+ }
+ }
+ },
+ "remediations": {
+ "type": "array",
+ "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
+ "items": {
+ "type": "object",
+ "required": [
+ "fixes",
+ "summary",
+ "diff"
+ ],
+ "properties": {
+ "fixes": {
+ "type": "array",
+ "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
+ "items": {
+ "type": "object",
+ "required": [
+ "cve"
+ ],
+ "properties": {
+ "cve": {
+ "type": "string",
+ "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
+ }
+ }
+ }
+ },
+ "summary": {
+ "type": "string",
+ "minLength": 1,
+ "description": "An overview of how the vulnerabilities were fixed."
+ },
+ "diff": {
+ "type": "string",
+ "minLength": 1,
+ "description": "A base64-encoded remediation code diff, compatible with git apply."
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/dependency-scanning-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/dependency-scanning-report-format.json
deleted file mode 120000
index 11e0a6846fb..00000000000
--- a/lib/gitlab/ci/parsers/security/validators/schemas/dependency-scanning-report-format.json
+++ /dev/null
@@ -1 +0,0 @@
-14.0.0/dependency-scanning-report-format.json \ No newline at end of file
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/sast-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/sast-report-format.json
deleted file mode 100644
index a7159be0190..00000000000
--- a/lib/gitlab/ci/parsers/security/validators/schemas/sast-report-format.json
+++ /dev/null
@@ -1,706 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "title": "Report format for GitLab SAST",
- "description": "This schema provides the report format for Static Application Security Testing analyzers (https://docs.gitlab.com/ee/user/application_security/sast).",
- "definitions": {
- "detail_type": {
- "oneOf": [
- {
- "$ref": "#/definitions/named_list"
- },
- {
- "$ref": "#/definitions/list"
- },
- {
- "$ref": "#/definitions/table"
- },
- {
- "$ref": "#/definitions/text"
- },
- {
- "$ref": "#/definitions/url"
- },
- {
- "$ref": "#/definitions/code"
- },
- {
- "$ref": "#/definitions/value"
- },
- {
- "$ref": "#/definitions/diff"
- },
- {
- "$ref": "#/definitions/markdown"
- },
- {
- "$ref": "#/definitions/commit"
- },
- {
- "$ref": "#/definitions/file_location"
- },
- {
- "$ref": "#/definitions/module_location"
- }
- ]
- },
- "text_value": {
- "type": "string"
- },
- "named_field": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "$ref": "#/definitions/text_value",
- "minLength": 1
- },
- "description": {
- "$ref": "#/definitions/text_value"
- }
- }
- },
- "named_list": {
- "type": "object",
- "description": "An object with named and typed fields",
- "required": [
- "type",
- "items"
- ],
- "properties": {
- "type": {
- "const": "named-list"
- },
- "items": {
- "type": "object",
- "patternProperties": {
- "^.*$": {
- "allOf": [
- {
- "$ref": "#/definitions/named_field"
- },
- {
- "$ref": "#/definitions/detail_type"
- }
- ]
- }
- }
- }
- }
- },
- "list": {
- "type": "object",
- "description": "A list of typed fields",
- "required": [
- "type",
- "items"
- ],
- "properties": {
- "type": {
- "const": "list"
- },
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- }
- }
- },
- "table": {
- "type": "object",
- "description": "A table of typed fields",
- "required": [
- "type",
- "rows"
- ],
- "properties": {
- "type": {
- "const": "table"
- },
- "header": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- },
- "rows": {
- "type": "array",
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- }
- }
- }
- },
- "text": {
- "type": "object",
- "description": "Raw text",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "text"
- },
- "value": {
- "$ref": "#/definitions/text_value"
- }
- }
- },
- "url": {
- "type": "object",
- "description": "A single URL",
- "required": [
- "type",
- "href"
- ],
- "properties": {
- "type": {
- "const": "url"
- },
- "text": {
- "$ref": "#/definitions/text_value"
- },
- "href": {
- "type": "string",
- "minLength": 1,
- "examples": [
- "http://mysite.com"
- ]
- }
- }
- },
- "code": {
- "type": "object",
- "description": "A codeblock",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "code"
- },
- "value": {
- "type": "string"
- },
- "lang": {
- "type": "string",
- "description": "A programming language"
- }
- }
- },
- "value": {
- "type": "object",
- "description": "A field that can store a range of types of value",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "value"
- },
- "value": {
- "type": [
- "number",
- "string",
- "boolean"
- ]
- }
- }
- },
- "diff": {
- "type": "object",
- "description": "A diff",
- "required": [
- "type",
- "before",
- "after"
- ],
- "properties": {
- "type": {
- "const": "diff"
- },
- "before": {
- "type": "string"
- },
- "after": {
- "type": "string"
- }
- }
- },
- "markdown": {
- "type": "object",
- "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "markdown"
- },
- "value": {
- "$ref": "#/definitions/text_value",
- "examples": [
- "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
- ]
- }
- }
- },
- "commit": {
- "type": "object",
- "description": "A commit/tag/branch within the GitLab project",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "commit"
- },
- "value": {
- "type": "string",
- "description": "The commit SHA",
- "minLength": 1
- }
- }
- },
- "file_location": {
- "type": "object",
- "description": "A location within a file in the project",
- "required": [
- "type",
- "file_name",
- "line_start"
- ],
- "properties": {
- "type": {
- "const": "file-location"
- },
- "file_name": {
- "type": "string",
- "minLength": 1
- },
- "line_start": {
- "type": "integer"
- },
- "line_end": {
- "type": "integer"
- }
- }
- },
- "module_location": {
- "type": "object",
- "description": "A location within a binary module of the form module+relative_offset",
- "required": [
- "type",
- "module_name",
- "offset"
- ],
- "properties": {
- "type": {
- "const": "module-location"
- },
- "module_name": {
- "type": "string",
- "minLength": 1,
- "examples": [
- "compiled_binary"
- ]
- },
- "offset": {
- "type": "integer",
- "examples": [
- 100
- ]
- }
- }
- }
- },
- "self": {
- "version": "14.0.0"
- },
- "required": [
- "version",
- "vulnerabilities"
- ],
- "additionalProperties": true,
- "properties": {
- "scan": {
- "type": "object",
- "required": [
- "end_time",
- "scanner",
- "start_time",
- "status",
- "type"
- ],
- "properties": {
- "end_time": {
- "type": "string",
- "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
- "examples": [
- "2020-01-28T03:26:02"
- ]
- },
- "messages": {
- "type": "array",
- "items": {
- "type": "object",
- "description": "Communication intended for the initiator of a scan.",
- "required": [
- "level",
- "value"
- ],
- "properties": {
- "level": {
- "type": "string",
- "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
- "enum": [
- "info",
- "warn",
- "fatal"
- ],
- "examples": [
- "info"
- ]
- },
- "value": {
- "type": "string",
- "description": "The message to communicate.",
- "minLength": 1,
- "examples": [
- "Permission denied, scanning aborted"
- ]
- }
- }
- }
- },
- "scanner": {
- "type": "object",
- "description": "Object defining the scanner used to perform the scan.",
- "required": [
- "id",
- "name",
- "version",
- "vendor"
- ],
- "properties": {
- "id": {
- "type": "string",
- "description": "Unique id that identifies the scanner.",
- "minLength": 1,
- "examples": [
- "my-sast-scanner"
- ]
- },
- "name": {
- "type": "string",
- "description": "A human readable value that identifies the scanner, not required to be unique.",
- "minLength": 1,
- "examples": [
- "My SAST Scanner"
- ]
- },
- "url": {
- "type": "string",
- "description": "A link to more information about the scanner.",
- "examples": [
- "https://scanner.url"
- ]
- },
- "version": {
- "type": "string",
- "description": "The version of the scanner.",
- "minLength": 1,
- "examples": [
- "1.0.2"
- ]
- },
- "vendor": {
- "type": "object",
- "description": "The vendor/maintainer of the scanner.",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "description": "The name of the vendor.",
- "minLength": 1,
- "examples": [
- "GitLab"
- ]
- }
- }
- }
- }
- },
- "start_time": {
- "type": "string",
- "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
- "examples": [
- "2020-02-14T16:01:59"
- ]
- },
- "status": {
- "type": "string",
- "description": "Result of the scan.",
- "enum": [
- "success",
- "failure"
- ]
- },
- "type": {
- "type": "string",
- "description": "Type of the scan.",
- "enum": [
- "sast"
- ]
- }
- }
- },
- "schema": {
- "type": "string",
- "description": "URI pointing to the validating security report schema.",
- "format": "uri"
- },
- "version": {
- "type": "string",
- "description": "The version of the schema to which the JSON report conforms.",
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
- },
- "vulnerabilities": {
- "type": "array",
- "description": "Array of vulnerability objects.",
- "items": {
- "type": "object",
- "description": "Describes the vulnerability.",
- "required": [
- "category",
- "cve",
- "identifiers",
- "location",
- "scanner"
- ],
- "properties": {
- "id": {
- "type": "string",
- "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
- "examples": [
- "642735a5-1425-428d-8d4e-3c854885a3c9"
- ]
- },
- "category": {
- "type": "string",
- "minLength": 1,
- "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
- },
- "name": {
- "type": "string",
- "description": "The name of the vulnerability. This must not include the finding's specific information."
- },
- "message": {
- "type": "string",
- "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
- },
- "description": {
- "type": "string",
- "description": "A long text section describing the vulnerability more fully."
- },
- "cve": {
- "type": "string",
- "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
- },
- "severity": {
- "type": "string",
- "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
- "enum": [
- "Info",
- "Unknown",
- "Low",
- "Medium",
- "High",
- "Critical"
- ]
- },
- "confidence": {
- "type": "string",
- "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
- "enum": [
- "Ignore",
- "Unknown",
- "Experimental",
- "Low",
- "Medium",
- "High",
- "Confirmed"
- ]
- },
- "solution": {
- "type": "string",
- "description": "Explanation of how to fix the vulnerability."
- },
- "scanner": {
- "description": "Describes the scanner used to find this vulnerability.",
- "type": "object",
- "required": [
- "id",
- "name"
- ],
- "properties": {
- "id": {
- "type": "string",
- "minLength": 1,
- "description": "The scanner's ID, as a snake_case string."
- },
- "name": {
- "type": "string",
- "minLength": 1,
- "description": "Human-readable name of the scanner."
- }
- }
- },
- "identifiers": {
- "type": "array",
- "minItems": 1,
- "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
- "items": {
- "type": "object",
- "required": [
- "type",
- "name",
- "value"
- ],
- "properties": {
- "type": {
- "type": "string",
- "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
- "minLength": 1
- },
- "name": {
- "type": "string",
- "description": "Human-readable name of the identifier.",
- "minLength": 1
- },
- "url": {
- "type": "string",
- "description": "URL of the identifier's documentation.",
- "format": "uri"
- },
- "value": {
- "type": "string",
- "description": "Value of the identifier, for matching purpose.",
- "minLength": 1
- }
- }
- }
- },
- "links": {
- "type": "array",
- "description": "An array of references to external documentation or articles that describe the vulnerability.",
- "items": {
- "type": "object",
- "required": [
- "url"
- ],
- "properties": {
- "name": {
- "type": "string",
- "description": "Name of the vulnerability details link."
- },
- "url": {
- "type": "string",
- "description": "URL of the vulnerability details document.",
- "format": "uri"
- }
- }
- }
- },
- "details": {
- "$ref": "#/definitions/named_list/properties/items"
- },
- "location": {
- "type": "object",
- "description": "Identifies the vulnerability's location.",
- "properties": {
- "file": {
- "type": "string",
- "description": "Path to the file where the vulnerability is located."
- },
- "start_line": {
- "type": "number",
- "description": "The first line of the code affected by the vulnerability."
- },
- "end_line": {
- "type": "number",
- "description": "The last line of the code affected by the vulnerability."
- },
- "class": {
- "type": "string",
- "description": "Provides the name of the class where the vulnerability is located."
- },
- "method": {
- "type": "string",
- "description": "Provides the name of the method where the vulnerability is located."
- }
- }
- },
- "raw_source_code_extract": {
- "type": "string",
- "description": "Provides an unsanitized excerpt of the affected source code."
- }
- }
- }
- },
- "remediations": {
- "type": "array",
- "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
- "items": {
- "type": "object",
- "required": [
- "fixes",
- "summary",
- "diff"
- ],
- "properties": {
- "fixes": {
- "type": "array",
- "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
- "items": {
- "type": "object",
- "required": [
- "cve"
- ],
- "properties": {
- "cve": {
- "type": "string",
- "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
- }
- }
- }
- },
- "summary": {
- "type": "string",
- "minLength": 1,
- "description": "An overview of how the vulnerabilities were fixed."
- },
- "diff": {
- "type": "string",
- "minLength": 1,
- "description": "A base64-encoded remediation code diff, compatible with git apply."
- }
- }
- }
- }
- }
-}
diff --git a/lib/gitlab/ci/parsers/security/validators/schemas/secret-detection-report-format.json b/lib/gitlab/ci/parsers/security/validators/schemas/secret-detection-report-format.json
deleted file mode 100644
index 462e23a151c..00000000000
--- a/lib/gitlab/ci/parsers/security/validators/schemas/secret-detection-report-format.json
+++ /dev/null
@@ -1,729 +0,0 @@
-{
- "$schema": "http://json-schema.org/draft-07/schema#",
- "title": "Report format for GitLab Secret Detection",
- "description": "This schema provides the the report format for the Secret Detection analyzer (https://docs.gitlab.com/ee/user/application_security/secret_detection)",
- "definitions": {
- "detail_type": {
- "oneOf": [
- {
- "$ref": "#/definitions/named_list"
- },
- {
- "$ref": "#/definitions/list"
- },
- {
- "$ref": "#/definitions/table"
- },
- {
- "$ref": "#/definitions/text"
- },
- {
- "$ref": "#/definitions/url"
- },
- {
- "$ref": "#/definitions/code"
- },
- {
- "$ref": "#/definitions/value"
- },
- {
- "$ref": "#/definitions/diff"
- },
- {
- "$ref": "#/definitions/markdown"
- },
- {
- "$ref": "#/definitions/commit"
- },
- {
- "$ref": "#/definitions/file_location"
- },
- {
- "$ref": "#/definitions/module_location"
- }
- ]
- },
- "text_value": {
- "type": "string"
- },
- "named_field": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "$ref": "#/definitions/text_value",
- "minLength": 1
- },
- "description": {
- "$ref": "#/definitions/text_value"
- }
- }
- },
- "named_list": {
- "type": "object",
- "description": "An object with named and typed fields",
- "required": [
- "type",
- "items"
- ],
- "properties": {
- "type": {
- "const": "named-list"
- },
- "items": {
- "type": "object",
- "patternProperties": {
- "^.*$": {
- "allOf": [
- {
- "$ref": "#/definitions/named_field"
- },
- {
- "$ref": "#/definitions/detail_type"
- }
- ]
- }
- }
- }
- }
- },
- "list": {
- "type": "object",
- "description": "A list of typed fields",
- "required": [
- "type",
- "items"
- ],
- "properties": {
- "type": {
- "const": "list"
- },
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- }
- }
- },
- "table": {
- "type": "object",
- "description": "A table of typed fields",
- "required": [
- "type",
- "rows"
- ],
- "properties": {
- "type": {
- "const": "table"
- },
- "header": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- },
- "rows": {
- "type": "array",
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/detail_type"
- }
- }
- }
- }
- },
- "text": {
- "type": "object",
- "description": "Raw text",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "text"
- },
- "value": {
- "$ref": "#/definitions/text_value"
- }
- }
- },
- "url": {
- "type": "object",
- "description": "A single URL",
- "required": [
- "type",
- "href"
- ],
- "properties": {
- "type": {
- "const": "url"
- },
- "text": {
- "$ref": "#/definitions/text_value"
- },
- "href": {
- "type": "string",
- "minLength": 1,
- "examples": [
- "http://mysite.com"
- ]
- }
- }
- },
- "code": {
- "type": "object",
- "description": "A codeblock",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "code"
- },
- "value": {
- "type": "string"
- },
- "lang": {
- "type": "string",
- "description": "A programming language"
- }
- }
- },
- "value": {
- "type": "object",
- "description": "A field that can store a range of types of value",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "value"
- },
- "value": {
- "type": [
- "number",
- "string",
- "boolean"
- ]
- }
- }
- },
- "diff": {
- "type": "object",
- "description": "A diff",
- "required": [
- "type",
- "before",
- "after"
- ],
- "properties": {
- "type": {
- "const": "diff"
- },
- "before": {
- "type": "string"
- },
- "after": {
- "type": "string"
- }
- }
- },
- "markdown": {
- "type": "object",
- "description": "GitLab flavoured markdown, see https://docs.gitlab.com/ee/user/markdown.html",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "markdown"
- },
- "value": {
- "$ref": "#/definitions/text_value",
- "examples": [
- "Here is markdown `inline code` #1 [test](gitlab.com)\n\n![GitLab Logo](https://about.gitlab.com/images/press/logo/preview/gitlab-logo-white-preview.png)"
- ]
- }
- }
- },
- "commit": {
- "type": "object",
- "description": "A commit/tag/branch within the GitLab project",
- "required": [
- "type",
- "value"
- ],
- "properties": {
- "type": {
- "const": "commit"
- },
- "value": {
- "type": "string",
- "description": "The commit SHA",
- "minLength": 1
- }
- }
- },
- "file_location": {
- "type": "object",
- "description": "A location within a file in the project",
- "required": [
- "type",
- "file_name",
- "line_start"
- ],
- "properties": {
- "type": {
- "const": "file-location"
- },
- "file_name": {
- "type": "string",
- "minLength": 1
- },
- "line_start": {
- "type": "integer"
- },
- "line_end": {
- "type": "integer"
- }
- }
- },
- "module_location": {
- "type": "object",
- "description": "A location within a binary module of the form module+relative_offset",
- "required": [
- "type",
- "module_name",
- "offset"
- ],
- "properties": {
- "type": {
- "const": "module-location"
- },
- "module_name": {
- "type": "string",
- "minLength": 1,
- "examples": [
- "compiled_binary"
- ]
- },
- "offset": {
- "type": "integer",
- "examples": [
- 100
- ]
- }
- }
- }
- },
- "self": {
- "version": "14.0.0"
- },
- "required": [
- "version",
- "vulnerabilities"
- ],
- "additionalProperties": true,
- "properties": {
- "scan": {
- "type": "object",
- "required": [
- "end_time",
- "scanner",
- "start_time",
- "status",
- "type"
- ],
- "properties": {
- "end_time": {
- "type": "string",
- "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan finished.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
- "examples": [
- "2020-01-28T03:26:02"
- ]
- },
- "messages": {
- "type": "array",
- "items": {
- "type": "object",
- "description": "Communication intended for the initiator of a scan.",
- "required": [
- "level",
- "value"
- ],
- "properties": {
- "level": {
- "type": "string",
- "description": "Describes the severity of the communication. Use info to communicate normal scan behaviour; warn to communicate a potentially recoverable problem, or a partial error; fatal to communicate an issue that causes the scan to halt.",
- "enum": [
- "info",
- "warn",
- "fatal"
- ],
- "examples": [
- "info"
- ]
- },
- "value": {
- "type": "string",
- "description": "The message to communicate.",
- "minLength": 1,
- "examples": [
- "Permission denied, scanning aborted"
- ]
- }
- }
- }
- },
- "scanner": {
- "type": "object",
- "description": "Object defining the scanner used to perform the scan.",
- "required": [
- "id",
- "name",
- "version",
- "vendor"
- ],
- "properties": {
- "id": {
- "type": "string",
- "description": "Unique id that identifies the scanner.",
- "minLength": 1,
- "examples": [
- "my-sast-scanner"
- ]
- },
- "name": {
- "type": "string",
- "description": "A human readable value that identifies the scanner, not required to be unique.",
- "minLength": 1,
- "examples": [
- "My SAST Scanner"
- ]
- },
- "url": {
- "type": "string",
- "description": "A link to more information about the scanner.",
- "examples": [
- "https://scanner.url"
- ]
- },
- "version": {
- "type": "string",
- "description": "The version of the scanner.",
- "minLength": 1,
- "examples": [
- "1.0.2"
- ]
- },
- "vendor": {
- "type": "object",
- "description": "The vendor/maintainer of the scanner.",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "description": "The name of the vendor.",
- "minLength": 1,
- "examples": [
- "GitLab"
- ]
- }
- }
- }
- }
- },
- "start_time": {
- "type": "string",
- "description": "ISO8601 UTC value with format yyyy-mm-ddThh:mm:ss, representing when the scan started.",
- "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}\\:\\d{2}\\:\\d{2}$",
- "examples": [
- "2020-02-14T16:01:59"
- ]
- },
- "status": {
- "type": "string",
- "description": "Result of the scan.",
- "enum": [
- "success",
- "failure"
- ]
- },
- "type": {
- "type": "string",
- "description": "Type of the scan.",
- "enum": [
- "secret_detection"
- ]
- }
- }
- },
- "schema": {
- "type": "string",
- "description": "URI pointing to the validating security report schema.",
- "format": "uri"
- },
- "version": {
- "type": "string",
- "description": "The version of the schema to which the JSON report conforms.",
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
- },
- "vulnerabilities": {
- "type": "array",
- "description": "Array of vulnerability objects.",
- "items": {
- "type": "object",
- "description": "Describes the vulnerability.",
- "required": [
- "category",
- "cve",
- "identifiers",
- "location",
- "scanner"
- ],
- "properties": {
- "id": {
- "type": "string",
- "description": "Unique identifier of the vulnerability. This is recommended to be a UUID.",
- "examples": [
- "642735a5-1425-428d-8d4e-3c854885a3c9"
- ]
- },
- "category": {
- "type": "string",
- "minLength": 1,
- "description": "Describes where this vulnerability belongs (for example, SAST, Dependency Scanning, and so on)."
- },
- "name": {
- "type": "string",
- "description": "The name of the vulnerability. This must not include the finding's specific information."
- },
- "message": {
- "type": "string",
- "description": "A short text section that describes the vulnerability. This may include the finding's specific information."
- },
- "description": {
- "type": "string",
- "description": "A long text section describing the vulnerability more fully."
- },
- "cve": {
- "type": "string",
- "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
- },
- "severity": {
- "type": "string",
- "description": "How much the vulnerability impacts the software. Possible values are Info, Unknown, Low, Medium, High, or Critical. Note that some analyzers may not report all these possible values.",
- "enum": [
- "Info",
- "Unknown",
- "Low",
- "Medium",
- "High",
- "Critical"
- ]
- },
- "confidence": {
- "type": "string",
- "description": "How reliable the vulnerability's assessment is. Possible values are Ignore, Unknown, Experimental, Low, Medium, High, and Confirmed. Note that some analyzers may not report all these possible values.",
- "enum": [
- "Ignore",
- "Unknown",
- "Experimental",
- "Low",
- "Medium",
- "High",
- "Confirmed"
- ]
- },
- "solution": {
- "type": "string",
- "description": "Explanation of how to fix the vulnerability."
- },
- "scanner": {
- "description": "Describes the scanner used to find this vulnerability.",
- "type": "object",
- "required": [
- "id",
- "name"
- ],
- "properties": {
- "id": {
- "type": "string",
- "minLength": 1,
- "description": "The scanner's ID, as a snake_case string."
- },
- "name": {
- "type": "string",
- "minLength": 1,
- "description": "Human-readable name of the scanner."
- }
- }
- },
- "identifiers": {
- "type": "array",
- "minItems": 1,
- "description": "An ordered array of references that identify a vulnerability on internal or external databases. The first identifier is the Primary Identifier, which has special meaning.",
- "items": {
- "type": "object",
- "required": [
- "type",
- "name",
- "value"
- ],
- "properties": {
- "type": {
- "type": "string",
- "description": "for example, cve, cwe, osvdb, usn, or an analyzer-dependent type such as gemnasium).",
- "minLength": 1
- },
- "name": {
- "type": "string",
- "description": "Human-readable name of the identifier.",
- "minLength": 1
- },
- "url": {
- "type": "string",
- "description": "URL of the identifier's documentation.",
- "format": "uri"
- },
- "value": {
- "type": "string",
- "description": "Value of the identifier, for matching purpose.",
- "minLength": 1
- }
- }
- }
- },
- "links": {
- "type": "array",
- "description": "An array of references to external documentation or articles that describe the vulnerability.",
- "items": {
- "type": "object",
- "required": [
- "url"
- ],
- "properties": {
- "name": {
- "type": "string",
- "description": "Name of the vulnerability details link."
- },
- "url": {
- "type": "string",
- "description": "URL of the vulnerability details document.",
- "format": "uri"
- }
- }
- }
- },
- "details": {
- "$ref": "#/definitions/named_list/properties/items"
- },
- "location": {
- "required": [
- "commit"
- ],
- "properties": {
- "file": {
- "type": "string",
- "description": "Path to the file where the vulnerability is located"
- },
- "commit": {
- "type": "object",
- "description": "Represents the commit in which the vulnerability was detected",
- "required": [
- "sha"
- ],
- "properties": {
- "author": {
- "type": "string"
- },
- "date": {
- "type": "string"
- },
- "message": {
- "type": "string"
- },
- "sha": {
- "type": "string",
- "minLength": 1
- }
- }
- },
- "start_line": {
- "type": "number",
- "description": "The first line of the code affected by the vulnerability"
- },
- "end_line": {
- "type": "number",
- "description": "The last line of the code affected by the vulnerability"
- },
- "class": {
- "type": "string",
- "description": "Provides the name of the class where the vulnerability is located"
- },
- "method": {
- "type": "string",
- "description": "Provides the name of the method where the vulnerability is located"
- }
- }
- },
- "raw_source_code_extract": {
- "type": "string",
- "description": "Provides an unsanitized excerpt of the affected source code."
- }
- }
- }
- },
- "remediations": {
- "type": "array",
- "description": "An array of objects containing information on available remediations, along with patch diffs to apply.",
- "items": {
- "type": "object",
- "required": [
- "fixes",
- "summary",
- "diff"
- ],
- "properties": {
- "fixes": {
- "type": "array",
- "description": "An array of strings that represent references to vulnerabilities fixed by this remediation.",
- "items": {
- "type": "object",
- "required": [
- "cve"
- ],
- "properties": {
- "cve": {
- "type": "string",
- "description": "(Deprecated - use vulnerabilities[].id instead) A fingerprint string value that represents a concrete finding. This is used to determine whether two findings are same, which may not be 100% accurate. Note that this is NOT a CVE as described by https://cve.mitre.org/."
- }
- }
- }
- },
- "summary": {
- "type": "string",
- "minLength": 1,
- "description": "An overview of how the vulnerabilities were fixed."
- },
- "diff": {
- "type": "string",
- "minLength": 1,
- "description": "A base64-encoded remediation code diff, compatible with git apply."
- }
- }
- }
- }
- }
-}
diff --git a/lib/gitlab/ci/pipeline/chain/command.rb b/lib/gitlab/ci/pipeline/chain/command.rb
index c466b8b36d0..0a6f6fd740c 100644
--- a/lib/gitlab/ci/pipeline/chain/command.rb
+++ b/lib/gitlab/ci/pipeline/chain/command.rb
@@ -96,7 +96,7 @@ module Gitlab
step = step_class.name.underscore.parameterize(separator: '_')
logger.observe("pipeline_step_#{step}_duration_s", duration)
- if Feature.enabled?(:ci_pipeline_creation_step_duration_tracking, type: :ops, default_enabled: :yaml)
+ if Feature.enabled?(:ci_pipeline_creation_step_duration_tracking, type: :ops)
metrics.pipeline_creation_step_duration_histogram
.observe({ step: step_class.name }, duration.seconds)
end
diff --git a/lib/gitlab/ci/pipeline/chain/config/process.rb b/lib/gitlab/ci/pipeline/chain/config/process.rb
index 64d1b001e3c..5548fca320f 100644
--- a/lib/gitlab/ci/pipeline/chain/config/process.rb
+++ b/lib/gitlab/ci/pipeline/chain/config/process.rb
@@ -35,7 +35,7 @@ module Gitlab
error(result.errors.first, config_error: true)
end
- @pipeline.merged_yaml = result.merged_yaml
+ @pipeline.config_metadata = result.config_metadata
rescue StandardError => ex
Gitlab::ErrorTracking.track_exception(ex,
diff --git a/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
index cb02f09f819..17ebf56985b 100644
--- a/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
+++ b/lib/gitlab/ci/pipeline/chain/limit/rate_limit.rb
@@ -54,15 +54,13 @@ module Gitlab
def throttle_enabled?
::Feature.enabled?(
:ci_throttle_pipelines_creation,
- project,
- default_enabled: :yaml)
+ project)
end
def dry_run?
::Feature.enabled?(
:ci_throttle_pipelines_creation_dry_run,
- project,
- default_enabled: :yaml)
+ project)
end
end
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb b/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
index 4d65b914d8d..6efb3a4f16a 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/matches.rb
@@ -11,8 +11,15 @@ module Gitlab
def evaluate(variables = {})
text = @left.evaluate(variables)
regexp = @right.evaluate(variables)
+
return false unless regexp
+ if ::Feature.enabled?(:ci_fix_rules_if_comparison_with_regexp_variable)
+ # All variables are evaluated as strings, even if they are regexp strings.
+ # So, we need to convert them to regexp objects.
+ regexp = Lexeme::Pattern.build_and_evaluate(regexp, variables)
+ end
+
regexp.scan(text.to_s).present?
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb b/lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb
index 29c5aa5d753..a72e5dbc822 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/not_matches.rb
@@ -11,8 +11,15 @@ module Gitlab
def evaluate(variables = {})
text = @left.evaluate(variables)
regexp = @right.evaluate(variables)
+
return true unless regexp
+ if ::Feature.enabled?(:ci_fix_rules_if_comparison_with_regexp_variable)
+ # All variables are evaluated as strings, even if they are regexp strings.
+ # So, we need to convert them to regexp objects.
+ regexp = Lexeme::Pattern.build_and_evaluate(regexp, variables)
+ end
+
regexp.scan(text.to_s).empty?
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb b/lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb
index c7106f3ec39..cd4106b16bb 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/pattern.rb
@@ -35,6 +35,18 @@ module Gitlab
def self.build(string)
new(string)
end
+
+ def self.build_and_evaluate(data, variables = {})
+ return data if data.is_a?(Gitlab::UntrustedRegexp)
+
+ begin
+ new_pattern = build(data)
+ rescue Lexer::SyntaxError
+ return data
+ end
+
+ new_pattern.evaluate(variables)
+ end
end
end
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/string.rb b/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
index e90e764bcd9..798cea34db6 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/string.rb
@@ -8,10 +8,6 @@ module Gitlab
class String < Lexeme::Value
PATTERN = /("(?<string>.*?)")|('(?<string>.*?)')/.freeze
- def initialize(value)
- super(value)
- end
-
def evaluate(variables = {})
@value.to_s
end
diff --git a/lib/gitlab/ci/pipeline/expression/lexeme/value.rb b/lib/gitlab/ci/pipeline/expression/lexeme/value.rb
index 6d872fee39d..fa82bbe3275 100644
--- a/lib/gitlab/ci/pipeline/expression/lexeme/value.rb
+++ b/lib/gitlab/ci/pipeline/expression/lexeme/value.rb
@@ -10,6 +10,8 @@ module Gitlab
:value
end
+ attr_reader :value
+
def initialize(value)
@value = value
end
diff --git a/lib/gitlab/ci/pipeline/logger.rb b/lib/gitlab/ci/pipeline/logger.rb
index ee6c3898592..44d905faced 100644
--- a/lib/gitlab/ci/pipeline/logger.rb
+++ b/lib/gitlab/ci/pipeline/logger.rb
@@ -110,7 +110,7 @@ module Gitlab
def enabled?
strong_memoize(:enabled) do
- ::Feature.enabled?(:ci_pipeline_creation_logger, project, type: :ops, default_enabled: :yaml)
+ ::Feature.enabled?(:ci_pipeline_creation_logger, project, type: :ops)
end
end
diff --git a/lib/gitlab/ci/pipeline/metrics.rb b/lib/gitlab/ci/pipeline/metrics.rb
index b5e48f210ad..33b9ac9b641 100644
--- a/lib/gitlab/ci/pipeline/metrics.rb
+++ b/lib/gitlab/ci/pipeline/metrics.rb
@@ -46,7 +46,7 @@ module Gitlab
name = :gitlab_ci_active_jobs
comment = 'Total amount of active jobs'
labels = { plan: nil }
- buckets = [0, 200, 500, 1_000, 2_000, 5_000, 10_000]
+ buckets = [0, 200, 500, 1_000, 2_000, 5_000, 10_000, 15_000, 20_000, 30_000, 40_000]
::Gitlab::Metrics.histogram(name, comment, labels, buckets)
end
diff --git a/lib/gitlab/ci/queue/metrics.rb b/lib/gitlab/ci/queue/metrics.rb
index 54fb1d19ea8..7d8303214a5 100644
--- a/lib/gitlab/ci/queue/metrics.rb
+++ b/lib/gitlab/ci/queue/metrics.rb
@@ -74,7 +74,7 @@ module Gitlab
end
def observe_queue_depth(queue, size)
- return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics)
if !Rails.env.production? && !QUEUE_DEPTH_HISTOGRAMS.include?(queue)
raise ArgumentError, "unknown queue depth label: #{queue}"
@@ -84,7 +84,7 @@ module Gitlab
end
def observe_queue_size(size_proc, runner_type)
- return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics)
size = size_proc.call.to_f
self.class.queue_size_total.observe({ runner_type: runner_type }, size)
@@ -96,7 +96,7 @@ module Gitlab
result = yield
- return result unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+ return result unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics)
seconds = ::Gitlab::Metrics::System.monotonic_time - start_time
@@ -121,7 +121,7 @@ module Gitlab
end
def self.observe_active_runners(runners_proc)
- return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics, default_enabled: false)
+ return unless Feature.enabled?(:gitlab_ci_builds_queuing_metrics)
queue_active_runners_total.observe({}, runners_proc.call.to_f)
end
@@ -250,7 +250,7 @@ module Gitlab
end
def running_jobs_relation(job)
- if ::Feature.enabled?(:ci_pending_builds_maintain_denormalized_data, default_enabled: :yaml)
+ 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)
diff --git a/lib/gitlab/ci/runner_instructions.rb b/lib/gitlab/ci/runner_instructions.rb
index 365864d3317..68c911d3dbb 100644
--- a/lib/gitlab/ci/runner_instructions.rb
+++ b/lib/gitlab/ci/runner_instructions.rb
@@ -25,7 +25,7 @@ module Gitlab
amd64: "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64"
},
install_script_template_path: "lib/gitlab/ci/runner_instructions/templates/osx/install.sh",
- runner_executable: "sudo gitlab-runner"
+ runner_executable: "gitlab-runner"
},
windows: {
human_readable_name: "Windows",
diff --git a/lib/gitlab/ci/runner_upgrade_check.rb b/lib/gitlab/ci/runner_upgrade_check.rb
index baf041fc358..46b41ed3c6c 100644
--- a/lib/gitlab/ci/runner_upgrade_check.rb
+++ b/lib/gitlab/ci/runner_upgrade_check.rb
@@ -5,12 +5,19 @@ 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 :unknown unless runner_version
+ return :invalid unless runner_version
releases = RunnerReleases.instance.releases
parsed_runner_version = runner_version.is_a?(::Gitlab::VersionInfo) ? runner_version : ::Gitlab::VersionInfo.parse(runner_version)
diff --git a/lib/gitlab/ci/status/bridge/common.rb b/lib/gitlab/ci/status/bridge/common.rb
index eaa87157716..263fd9d1052 100644
--- a/lib/gitlab/ci/status/bridge/common.rb
+++ b/lib/gitlab/ci/status/bridge/common.rb
@@ -16,7 +16,7 @@ module Gitlab
def details_path
return unless can?(user, :read_pipeline, downstream_pipeline)
- if Feature.enabled?(:ci_retry_downstream_pipeline, subject.project, default_enabled: :yaml)
+ if Feature.enabled?(:ci_retry_downstream_pipeline, subject.project)
project_job_path(subject.project, subject)
else
project_pipeline_path(downstream_project, downstream_pipeline)
diff --git a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
index 8020ffee36f..fddcc1492a8 100644
--- a/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Auto-DevOps.gitlab-ci.yml
@@ -178,7 +178,6 @@ include:
- template: Jobs/Helm-2to3.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Helm-2to3.gitlab-ci.yml
- template: Security/DAST.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
- - template: Security/Cluster-Image-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/License-Scanning.gitlab-ci.yml
- template: Security/SAST.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml
diff --git a/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml
index f3d2e293c86..8c63019d743 100644
--- a/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_BUILD_IMAGE_VERSION: 'v1.9.1'
+ AUTO_BUILD_IMAGE_VERSION: 'v1.14.0'
build:
stage: build
diff --git a/lib/gitlab/ci/templates/Jobs/Build.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Build.latest.gitlab-ci.yml
index f3d2e293c86..8c63019d743 100644
--- a/lib/gitlab/ci/templates/Jobs/Build.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Build.latest.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_BUILD_IMAGE_VERSION: 'v1.9.1'
+ AUTO_BUILD_IMAGE_VERSION: 'v1.14.0'
build:
stage: build
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 0cc5090f85e..04b1c4a6f73 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
@@ -1,5 +1,5 @@
variables:
- DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.0'
+ DAST_AUTO_DEPLOY_IMAGE_VERSION: 'v2.25.0'
.dast-auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${DAST_AUTO_DEPLOY_IMAGE_VERSION}"
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 d41182ec9be..5c56594da78 100644
--- a/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml
@@ -12,10 +12,9 @@ variables:
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
- DS_DEFAULT_ANALYZERS: "bundler-audit, retire.js, gemnasium, gemnasium-maven, gemnasium-python"
DS_EXCLUDED_ANALYZERS: ""
DS_EXCLUDED_PATHS: "spec, test, tests, tmp"
- DS_MAJOR_VERSION: 2
+ DS_MAJOR_VERSION: 3
dependency_scanning:
stage: test
@@ -52,6 +51,18 @@ dependency_scanning:
paths:
- "**/cyclonedx-*.json"
+.gemnasium-shared-rule:
+ exists:
+ - '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
+ - '{composer.lock,*/composer.lock,*/*/composer.lock}'
+ - '{gems.locked,*/gems.locked,*/*/gems.locked}'
+ - '{go.sum,*/go.sum,*/*/go.sum}'
+ - '{npm-shrinkwrap.json,*/npm-shrinkwrap.json,*/*/npm-shrinkwrap.json}'
+ - '{package-lock.json,*/package-lock.json,*/*/package-lock.json}'
+ - '{yarn.lock,*/yarn.lock,*/*/yarn.lock}'
+ - '{packages.lock.json,*/packages.lock.json,*/*/packages.lock.json}'
+ - '{conan.lock,*/conan.lock,*/*/conan.lock}'
+
gemnasium-dependency_scanning:
extends:
- .ds-analyzer
@@ -66,17 +77,20 @@ gemnasium-dependency_scanning:
when: never
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /gemnasium([^-]|$)/
- exists:
- - '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
- - '{composer.lock,*/composer.lock,*/*/composer.lock}'
- - '{gems.locked,*/gems.locked,*/*/gems.locked}'
- - '{go.sum,*/go.sum,*/*/go.sum}'
- - '{npm-shrinkwrap.json,*/npm-shrinkwrap.json,*/*/npm-shrinkwrap.json}'
- - '{package-lock.json,*/package-lock.json,*/*/package-lock.json}'
- - '{yarn.lock,*/yarn.lock,*/*/yarn.lock}'
- - '{packages.lock.json,*/packages.lock.json,*/*/packages.lock.json}'
- - '{conan.lock,*/conan.lock,*/*/conan.lock}'
+ $CI_GITLAB_FIPS_MODE == "true"
+ exists: !reference [.gemnasium-shared-rule, exists]
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+ - if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bdependency_scanning\b/
+ exists: !reference [.gemnasium-shared-rule, exists]
+
+.gemnasium-maven-shared-rule:
+ exists:
+ - '{build.gradle,*/build.gradle,*/*/build.gradle}'
+ - '{build.gradle.kts,*/build.gradle.kts,*/*/build.gradle.kts}'
+ - '{build.sbt,*/build.sbt,*/*/build.sbt}'
+ - '{pom.xml,*/pom.xml,*/*/pom.xml}'
gemnasium-maven-dependency_scanning:
extends:
@@ -84,9 +98,6 @@ gemnasium-maven-dependency_scanning:
- .cyclone-dx-reports
variables:
DS_ANALYZER_NAME: "gemnasium-maven"
- # Stop reporting Gradle as "maven".
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/338252
- DS_REPORT_PACKAGE_MANAGER_MAVEN_WHEN_JAVA: "false"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
when: never
@@ -94,12 +105,22 @@ gemnasium-maven-dependency_scanning:
when: never
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /gemnasium-maven/
- exists:
- - '{build.gradle,*/build.gradle,*/*/build.gradle}'
- - '{build.gradle.kts,*/build.gradle.kts,*/*/build.gradle.kts}'
- - '{build.sbt,*/build.sbt,*/*/build.sbt}'
- - '{pom.xml,*/pom.xml,*/*/pom.xml}'
+ $CI_GITLAB_FIPS_MODE == "true"
+ exists: !reference [.gemnasium-maven-shared-rule, exists]
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+ - if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bdependency_scanning\b/
+ exists: !reference [.gemnasium-maven-shared-rule, exists]
+
+.gemnasium-python-shared-rule:
+ exists:
+ - '{requirements.txt,*/requirements.txt,*/*/requirements.txt}'
+ - '{requirements.pip,*/requirements.pip,*/*/requirements.pip}'
+ - '{Pipfile,*/Pipfile,*/*/Pipfile}'
+ - '{requires.txt,*/requires.txt,*/*/requires.txt}'
+ - '{setup.py,*/setup.py,*/*/setup.py}'
+ - '{poetry.lock,*/poetry.lock,*/*/poetry.lock}'
gemnasium-python-dependency_scanning:
extends:
@@ -107,9 +128,6 @@ gemnasium-python-dependency_scanning:
- .cyclone-dx-reports
variables:
DS_ANALYZER_NAME: "gemnasium-python"
- # Stop reporting Pipenv and Setuptools as "pip".
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/338252
- DS_REPORT_PACKAGE_MANAGER_PIP_WHEN_PYTHON: "false"
rules:
- if: $DEPENDENCY_SCANNING_DISABLED
when: never
@@ -117,46 +135,39 @@ gemnasium-python-dependency_scanning:
when: never
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /gemnasium-python/
- exists:
- - '{requirements.txt,*/requirements.txt,*/*/requirements.txt}'
- - '{requirements.pip,*/requirements.pip,*/*/requirements.pip}'
- - '{Pipfile,*/Pipfile,*/*/Pipfile}'
- - '{requires.txt,*/requires.txt,*/*/requires.txt}'
- - '{setup.py,*/setup.py,*/*/setup.py}'
- # Support passing of $PIP_REQUIREMENTS_FILE
- # See https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning
+ $CI_GITLAB_FIPS_MODE == "true"
+ exists: !reference [.gemnasium-python-shared-rule, exists]
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
+ - if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bdependency_scanning\b/
+ exists: !reference [.gemnasium-python-shared-rule, exists]
+ # Support passing of $PIP_REQUIREMENTS_FILE
+ # See https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#configuring-specific-analyzers-used-by-dependency-scanning
+ - if: $CI_COMMIT_BRANCH &&
+ $GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
+ $PIP_REQUIREMENTS_FILE &&
+ $CI_GITLAB_FIPS_MODE == "true"
+ variables:
+ DS_IMAGE_SUFFIX: "-fips"
- if: $CI_COMMIT_BRANCH &&
$GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /gemnasium-python/ &&
$PIP_REQUIREMENTS_FILE
bundler-audit-dependency_scanning:
extends: .ds-analyzer
- variables:
- DS_ANALYZER_NAME: "bundler-audit"
+ script:
+ - echo "This job was deprecated in GitLab 14.8 and removed in GitLab 15.0"
+ - echo "For more information see https://gitlab.com/gitlab-org/gitlab/-/issues/347491"
+ - exit 1
rules:
- - if: $DEPENDENCY_SCANNING_DISABLED
- when: never
- - if: $DS_EXCLUDED_ANALYZERS =~ /bundler-audit/
- when: never
- - if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /bundler-audit/
- exists:
- - '{Gemfile.lock,*/Gemfile.lock,*/*/Gemfile.lock}'
+ - when: never
retire-js-dependency_scanning:
extends: .ds-analyzer
- variables:
- DS_ANALYZER_NAME: "retire.js"
+ script:
+ - echo "This job was deprecated in GitLab 14.8 and removed in GitLab 15.0"
+ - echo "For more information see https://gitlab.com/gitlab-org/gitlab/-/issues/289830"
+ - exit 1
rules:
- - if: $DEPENDENCY_SCANNING_DISABLED
- when: never
- - if: $DS_EXCLUDED_ANALYZERS =~ /retire.js/
- when: never
- - if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bdependency_scanning\b/ &&
- $DS_DEFAULT_ANALYZERS =~ /retire.js/
- exists:
- - '{package.json,*/package.json,*/*/package.json}'
+ - when: never
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
index 89eb91c981f..c29b5b74bfc 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.25.0'
.auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
index 78f28b59aa5..d09bb53a5b1 100644
--- a/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Deploy.latest.gitlab-ci.yml
@@ -1,5 +1,5 @@
variables:
- AUTO_DEPLOY_IMAGE_VERSION: 'v2.23.0'
+ AUTO_DEPLOY_IMAGE_VERSION: 'v2.25.0'
.auto-deploy:
image: "registry.gitlab.com/gitlab-org/cluster-integration/auto-deploy-image:${AUTO_DEPLOY_IMAGE_VERSION}"
diff --git a/lib/gitlab/ci/templates/Jobs/License-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/License-Scanning.gitlab-ci.yml
index 89a44eddefd..f7945b46a59 100644
--- a/lib/gitlab/ci/templates/Jobs/License-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/License-Scanning.gitlab-ci.yml
@@ -14,7 +14,7 @@ variables:
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
LICENSE_MANAGEMENT_SETUP_CMD: '' # If needed, specify a command to setup your environment with a custom package manager.
- LICENSE_MANAGEMENT_VERSION: 3
+ LICENSE_MANAGEMENT_VERSION: 4
license_scanning:
stage: test
diff --git a/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
new file mode 100644
index 00000000000..b6358eb0831
--- /dev/null
+++ b/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
@@ -0,0 +1,41 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/iac_scanning/
+#
+# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# List of available variables: https://docs.gitlab.com/ee/user/application_security/iac_scanning/index.html
+
+variables:
+ # Setting this variable will affect all Security templates
+ # (SAST, Dependency Scanning, ...)
+ SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SAST_IMAGE_SUFFIX: ""
+
+ SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
+
+iac-sast:
+ stage: test
+ artifacts:
+ reports:
+ sast: gl-sast-report.json
+ rules:
+ - when: never
+ # `rules` must be overridden explicitly by each child job
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/218444
+ variables:
+ SEARCH_MAX_DEPTH: 4
+ allow_failure: true
+ script:
+ - /analyzer run
+
+kics-iac-sast:
+ extends: iac-sast
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kics:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /kics/
+ when: never
+ - if: $CI_COMMIT_BRANCH
diff --git a/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
index 488e7ec72fd..b6358eb0831 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
@@ -31,7 +31,7 @@ kics-iac-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 1
+ SAST_ANALYZER_IMAGE_TAG: 2
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kics:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
rules:
- if: $SAST_DISABLED
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
index 7415fa3104c..be41553450c 100644
--- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml
@@ -55,7 +55,7 @@ brakeman-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/brakeman:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -92,7 +92,7 @@ flawfinder-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/flawfinder:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -113,7 +113,7 @@ kubesec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kubesec:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -144,7 +144,7 @@ gosec-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/mobsf:$SAST_ANALYZER_IMAGE_TAG"
mobsf-android-sast:
@@ -178,7 +178,7 @@ nodejs-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -194,7 +194,7 @@ phpcs-security-audit-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/phpcs-security-audit:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -210,7 +210,7 @@ pmd-apex-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/pmd-apex:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -226,22 +226,14 @@ security-code-scan-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: '2'
+ SAST_ANALYZER_IMAGE_TAG: '3'
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/security-code-scan:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
when: never
- if: $SAST_EXCLUDED_ANALYZERS =~ /security-code-scan/
when: never
- # This rule shim will be removed in %15.0,
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/350935
- - if: $CI_COMMIT_BRANCH && $CI_SERVER_VERSION_MAJOR == '14'
- exists:
- - '**/*.csproj'
- - '**/*.vbproj'
- if: $CI_COMMIT_BRANCH
- variables:
- SAST_ANALYZER_IMAGE_TAG: '3'
exists:
- '**/*.csproj'
- '**/*.vbproj'
@@ -252,7 +244,7 @@ semgrep-sast:
name: "$SAST_ANALYZER_IMAGE"
variables:
SEARCH_MAX_DEPTH: 20
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
rules:
- if: $SAST_DISABLED
@@ -275,7 +267,7 @@ sobelow-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/sobelow:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_DISABLED
@@ -291,7 +283,7 @@ spotbugs-sast:
image:
name: "$SAST_ANALYZER_IMAGE"
variables:
- SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE_TAG: 3
SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/spotbugs:$SAST_ANALYZER_IMAGE_TAG"
rules:
- if: $SAST_EXCLUDED_ANALYZERS =~ /spotbugs/
diff --git a/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml
new file mode 100644
index 00000000000..f8e6e152ab9
--- /dev/null
+++ b/lib/gitlab/ci/templates/Jobs/SAST.latest.gitlab-ci.yml
@@ -0,0 +1,407 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/sast/
+#
+# Configure SAST with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# List of available variables: https://docs.gitlab.com/ee/user/application_security/sast/index.html#available-variables
+
+variables:
+ # Setting this variable will affect all Security templates
+ # (SAST, Dependency Scanning, ...)
+ SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SAST_IMAGE_SUFFIX: ""
+
+ SAST_EXCLUDED_ANALYZERS: ""
+ SAST_EXCLUDED_PATHS: "spec, test, tests, tmp"
+ SCAN_KUBERNETES_MANIFESTS: "false"
+
+sast:
+ stage: test
+ artifacts:
+ reports:
+ sast: gl-sast-report.json
+ rules:
+ - when: never
+ variables:
+ SEARCH_MAX_DEPTH: 4
+ script:
+ - echo "$CI_JOB_NAME is used for configuration only, and its script should not be executed"
+ - exit 1
+
+.sast-analyzer:
+ extends: sast
+ allow_failure: true
+ # `rules` must be overridden explicitly by each child job
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/218444
+ script:
+ - /analyzer run
+
+bandit-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/bandit:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /bandit/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.py'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.py'
+
+brakeman-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/brakeman:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /brakeman/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.rb'
+ - '**/Gemfile'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.rb'
+ - '**/Gemfile'
+
+eslint-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 2
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/eslint:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /eslint/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.html'
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.html'
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+
+flawfinder-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/flawfinder:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /flawfinder/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.c'
+ - '**/*.cc'
+ - '**/*.cpp'
+ - '**/*.c++'
+ - '**/*.cp'
+ - '**/*.cxx'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.c'
+ - '**/*.cc'
+ - '**/*.cpp'
+ - '**/*.c++'
+ - '**/*.cp'
+ - '**/*.cxx'
+
+kubesec-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/kubesec:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /kubesec/
+ when: never
+ # Add the job to merge request pipelines if there's an open merge request.
+ - if: $CI_MERGE_REQUEST_IID &&
+ $SCAN_KUBERNETES_MANIFESTS == 'true'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ # If there's no open merge request, add it to a *branch* pipeline instead.
+ - if: $CI_COMMIT_BRANCH &&
+ $SCAN_KUBERNETES_MANIFESTS == 'true'
+
+gosec-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/gosec:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /gosec/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.go'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.go'
+
+.mobsf-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/mobsf:$SAST_ANALYZER_IMAGE_TAG"
+
+mobsf-android-sast:
+ extends: .mobsf-sast
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /mobsf/
+ when: never
+ # Add the job to merge request pipelines if there's an open merge request.
+ - if: $CI_MERGE_REQUEST_IID &&
+ $SAST_EXPERIMENTAL_FEATURES == 'true'
+ exists:
+ - '**/*.apk'
+ - '**/AndroidManifest.xml'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ # If there's no open merge request, add it to a *branch* pipeline instead.
+ - if: $CI_COMMIT_BRANCH &&
+ $SAST_EXPERIMENTAL_FEATURES == 'true'
+ exists:
+ - '**/*.apk'
+ - '**/AndroidManifest.xml'
+
+mobsf-ios-sast:
+ extends: .mobsf-sast
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /mobsf/
+ when: never
+ # Add the job to merge request pipelines if there's an open merge request.
+ - if: $CI_MERGE_REQUEST_IID &&
+ $SAST_EXPERIMENTAL_FEATURES == 'true'
+ exists:
+ - '**/*.ipa'
+ - '**/*.xcodeproj/*'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ # If there's no open merge request, add it to a *branch* pipeline instead.
+ - if: $CI_COMMIT_BRANCH &&
+ $SAST_EXPERIMENTAL_FEATURES == 'true'
+ exists:
+ - '**/*.ipa'
+ - '**/*.xcodeproj/*'
+
+nodejs-scan-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /nodejs-scan/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/package.json'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/package.json'
+
+phpcs-security-audit-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/phpcs-security-audit:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /phpcs-security-audit/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.php'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.php'
+
+pmd-apex-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/pmd-apex:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /pmd-apex/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.cls'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.cls'
+
+security-code-scan-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/security-code-scan:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /security-code-scan/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.csproj'
+ - '**/*.vbproj'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.csproj'
+ - '**/*.vbproj'
+
+semgrep-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SERACH_MAX_DEPTH: 20
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/semgrep:$SAST_ANALYZER_IMAGE_TAG$SAST_IMAGE_SUFFIX"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /semgrep/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.py'
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+ - '**/*.c'
+ - '**/*.go'
+ - '**/*.java'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.py'
+ - '**/*.js'
+ - '**/*.jsx'
+ - '**/*.ts'
+ - '**/*.tsx'
+ - '**/*.c'
+ - '**/*.go'
+ - '**/*.java'
+
+sobelow-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/sobelow:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_DISABLED
+ when: never
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /sobelow/
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - 'mix.exs'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - 'mix.exs'
+
+spotbugs-sast:
+ extends: .sast-analyzer
+ image:
+ name: "$SAST_ANALYZER_IMAGE"
+ variables:
+ SAST_ANALYZER_IMAGE_TAG: 3
+ SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/spotbugs:$SAST_ANALYZER_IMAGE_TAG"
+ rules:
+ - if: $SAST_EXCLUDED_ANALYZERS =~ /spotbugs/
+ when: never
+ - if: $SAST_EXPERIMENTAL_FEATURES == 'true'
+ exists:
+ - '**/AndroidManifest.xml'
+ when: never
+ - if: $SAST_DISABLED
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ exists:
+ - '**/*.groovy'
+ - '**/*.java'
+ - '**/*.scala'
+ - '**/*.kt'
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ exists:
+ - '**/*.groovy'
+ - '**/*.java'
+ - '**/*.scala'
+ - '**/*.kt'
diff --git a/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
index 6aacd082fd7..3f18237a525 100644
--- a/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml
@@ -8,7 +8,7 @@ variables:
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
SECRET_DETECTION_IMAGE_SUFFIX: ""
- SECRETS_ANALYZER_VERSION: "3"
+ SECRETS_ANALYZER_VERSION: "4"
SECRET_DETECTION_EXCLUDED_PATHS: ""
.secret-analyzer:
@@ -31,37 +31,4 @@ secret_detection:
when: never
- if: $CI_COMMIT_BRANCH
script:
- - if [ -n "$CI_COMMIT_TAG" ]; then echo "Skipping Secret Detection for tags. No code changes have occurred."; exit 0; fi
- # Historic scan
- - if [ "$SECRET_DETECTION_HISTORIC_SCAN" == "true" ]; then echo "Running Secret Detection Historic Scan"; /analyzer run; exit; fi
- # Default branch scan
- - if [ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]; then echo "Running Secret Detection on default branch."; /analyzer run; exit; fi
- # Push event
- - |
- if [ "$CI_COMMIT_BEFORE_SHA" == "0000000000000000000000000000000000000000" ];
- then
- # first commit on a new branch
- echo ${CI_COMMIT_SHA} >${CI_COMMIT_SHA}_commit_list.txt
- git fetch --depth=2 origin $CI_COMMIT_REF_NAME
- else
- # determine commit range so that we can fetch the appropriate depth
- # check the exit code to determine if we need to limit the commit_list.txt to CI_COMMIT_SHA.
- if ! git log --pretty=format:"%H" ${CI_COMMIT_BEFORE_SHA}..${CI_COMMIT_SHA} >${CI_COMMIT_SHA}_commit_list.txt;
- then
- echo "unable to determine commit range, limiting to ${CI_COMMIT_SHA}"
- echo ${CI_COMMIT_SHA} >${CI_COMMIT_SHA}_commit_list.txt
- else
- # append newline to to list since `git log` does not end with a
- # newline, this is to keep the log messages consistent
- echo >> ${CI_COMMIT_SHA}_commit_list.txt
- fi
-
- # we need to extend the git fetch depth to the number of commits + 1 for the following reasons:
- # to include the parent commit of the base commit in this MR/Push event. This is needed because
- # `git diff -p` needs something to compare changes in that commit against
- git fetch --depth=$(($(wc -l <${CI_COMMIT_SHA}_commit_list.txt) + 1)) origin $CI_COMMIT_REF_NAME
- fi
- echo "scanning $(($(wc -l <${CI_COMMIT_SHA}_commit_list.txt))) commits for a push event"
- export SECRET_DETECTION_COMMITS_FILE=${CI_COMMIT_SHA}_commit_list.txt
- /analyzer run
- - rm "$CI_COMMIT_SHA"_commit_list.txt
diff --git a/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml
new file mode 100644
index 00000000000..e81e06d1a1d
--- /dev/null
+++ b/lib/gitlab/ci/templates/Jobs/Secret-Detection.latest.gitlab-ci.yml
@@ -0,0 +1,36 @@
+# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/secret_detection
+#
+# Configure the scanning tool through the environment variables.
+# List of the variables: https://docs.gitlab.com/ee/user/application_security/secret_detection/#available-variables
+# How to set: https://docs.gitlab.com/ee/ci/yaml/#variables
+
+variables:
+ SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
+ SECRET_DETECTION_IMAGE_SUFFIX: ""
+ SECRETS_ANALYZER_VERSION: "4"
+ SECRET_DETECTION_EXCLUDED_PATHS: ""
+
+.secret-analyzer:
+ stage: test
+ image: "$SECURE_ANALYZERS_PREFIX/secrets:$SECRETS_ANALYZER_VERSION$SECRET_DETECTION_IMAGE_SUFFIX"
+ services: []
+ allow_failure: true
+ variables:
+ GIT_DEPTH: "50"
+ # `rules` must be overridden explicitly by each child job
+ # see https://gitlab.com/gitlab-org/gitlab/-/issues/218444
+ artifacts:
+ reports:
+ secret_detection: gl-secret-detection-report.json
+
+secret_detection:
+ extends: .secret-analyzer
+ rules:
+ - if: $SECRET_DETECTION_DISABLED
+ when: never
+ - if: $CI_MERGE_REQUEST_IID # Add the job to merge request pipelines if there's an open merge request.
+ - if: $CI_OPEN_MERGE_REQUESTS # Don't add it to a *branch* pipeline if it's already in a merge request pipeline.
+ when: never
+ - if: $CI_COMMIT_BRANCH # If there's no open merge request, add it to a *branch* pipeline instead.
+ script:
+ - /analyzer run
diff --git a/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml b/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
index 67c69115948..64a063388b2 100644
--- a/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/MATLAB.gitlab-ci.yml
@@ -6,7 +6,7 @@
# Use this template to run MATLAB and Simulink as part of your CI/CD pipeline. The template has three jobs:
# - `command`: Run MATLAB scripts, functions, and statements.
# - `test`: Run tests authored using the MATLAB unit testing framework or Simulink Test.
-# - `test_artifacts_job`: Run MATLAB and Simulink tests, and generate test and coverage artifacts.
+# - `test_artifacts`: Run MATLAB and Simulink tests, and generate test and coverage artifacts.
#
# You can copy and paste one or more jobs in this template into your `.gitlab-ci.yml` file.
# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
@@ -17,20 +17,20 @@
# - The jobs in this template use the `matlab -batch` syntax to start MATLAB. The `-batch` option is supported
# in MATLAB R2019a and later.
-# The `command` runs MATLAB scripts, functions, and statements. To use the job in your pipeline,
-# substitute `command` with the code you want to run.
+# The `command` job runs MATLAB scripts, functions, and statements. To use the job in your pipeline,
+# substitute `mycommand` with the code you want to run.
#
command:
- script: matlab -batch command
+ script: matlab -batch mycommand
-# If the value of `command` is the name of a MATLAB script or function, do not specify the file extension.
-# For example, to run a script named `myscript.m` in the root of your repository, specify the `command` like this:
+# If the value of `mycommand` is the name of a MATLAB script or function, do not specify the file extension.
+# For example, to run a script named `myscript.m` in the root of your repository, specify `mycommand` like this:
#
# "myscript"
#
# If you specify more than one script, function, or statement, use a comma or semicolon to separate them.
# For example, to run `myscript.m` in a folder named `myfolder` located in the root of the repository,
-# you can specify the `command` like this:
+# you can specify `mycommand` like this:
#
# "addpath('myfolder'), myscript"
#
@@ -41,7 +41,7 @@ command:
# [1] https://www.mathworks.com/help/matlab/ref/assert.html
# [2] https://www.mathworks.com/help/matlab/ref/error.html
-# The `test` runs the MATLAB and Simulink tests in your project. It calls the [`runtests`][3] function
+# The `test` job runs the MATLAB and Simulink tests in your project. It calls the [`runtests`][3] function
# to run the tests and then the [`assertSuccess`][4] method to fail the job if any of the tests fail.
#
test:
@@ -55,12 +55,12 @@ test:
# [4] https://www.mathworks.com/help/matlab/ref/matlab.unittest.testresult.assertsuccess.html
# [5] https://www.mathworks.com/help/matlab/projects.html
-# The `test_artifacts_job` runs your tests and additionally generates test and coverage artifacts.
+# The `test_artifacts` job runs your tests and additionally generates test and coverage artifacts.
# It uses the plugin classes in the [`matlab.unittest.plugins`][6] package to generate a JUnit test results
-# report and a Cobertura code coverage report. Like the `run_tests` job, this job runs all the tests in your
+# report and a Cobertura code coverage report. Like the `test` job, this job runs all the tests in your
# project and fails the build if any of the tests fail.
#
-test_artifacts_job:
+test_artifacts:
script: |
matlab -batch "
import matlab.unittest.TestRunner
@@ -84,11 +84,13 @@ test_artifacts_job:
artifacts:
reports:
junit: "./artifacts/results.xml"
- cobertura: "./artifacts/cobertura.xml"
+ coverage_report:
+ coverage_format: cobertura
+ path: "./artifacts/cobertura.xml"
paths:
- "./artifacts"
-# You can modify the contents of the `test_artifacts_job` depending on your goals. For more
+# You can modify the contents of the `test_artifacts` job depending on your goals. For more
# information on how to customize the test runner and generate various test and coverage artifacts,
# see [Generate Artifacts Using MATLAB Unit Test Plugins][7].
#
diff --git a/lib/gitlab/ci/templates/Managed-Cluster-Applications.gitlab-ci.yml b/lib/gitlab/ci/templates/Managed-Cluster-Applications.gitlab-ci.yml
deleted file mode 100644
index ca63e942130..00000000000
--- a/lib/gitlab/ci/templates/Managed-Cluster-Applications.gitlab-ci.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-################################################################################
-# WARNING
-################################################################################
-#
-# This template is DEPRECATED and scheduled for removal in GitLab 15.0
-# See https://gitlab.com/gitlab-org/gitlab/-/issues/333610 for more context.
-#
-# To get started with a Cluster Management Project, we instead recommend
-# using the updated project template:
-#
-# - Documentation: https://docs.gitlab.com/ee/user/clusters/management_project_template.html
-# - Source code: https://gitlab.com/gitlab-org/project-templates/cluster-management/
-#
-################################################################################
-
-apply:
- stage: deploy
- image: "registry.gitlab.com/gitlab-org/cluster-integration/cluster-applications:v0.43.1"
- environment:
- name: production
- variables:
- TILLER_NAMESPACE: gitlab-managed-apps
- GITLAB_MANAGED_APPS_FILE: $CI_PROJECT_DIR/.gitlab/managed-apps/config.yaml
- script:
- - gitlab-managed-apps /usr/local/share/gitlab-managed-apps/helmfile.yaml
- only:
- variables:
- - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- artifacts:
- when: on_failure
- paths:
- - tiller.log
diff --git a/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml b/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
index 6dbd0ce9561..60707dd0df0 100644
--- a/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Qualys-IaC-Security.gitlab-ci.yml
@@ -3,7 +3,8 @@
#
# This template shows how to use Qualys IaC Scan with a GitLab CI/CD pipeline.
# Qualys and GitLab users can use this to scan their IaC templates for misconfigurations.
-# Documentation about this integration: https://www.qualys.com/documentation/qualys-iac-gitlab-integration.pdf
+# The IaC templates are uploaded to Qualys Platform for scanning, which returns the results to GitLab for reporting.
+# Documentation about this integration: https://www.qualys.com/docs/qualys-iac-security-integration-gitlab.pdf
#
# This template should not need editing to work in your project.
# It is not designed to be included in an existing CI/CD configuration with the "include:" keyword.
diff --git a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
index 33c0928db6f..44f959468a8 100644
--- a/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
@@ -29,7 +29,7 @@ before_script:
- ruby -v # Print out ruby version for debugging
# Uncomment next line if your rails app needs a JS runtime:
# - apt-get update -q && apt-get install nodejs -yqq
- - bundle config set path 'vendor' # Install dependencies into ./vendor/ruby
+ - bundle config set --local deployment true # Install dependencies into ./vendor/ruby
- bundle install -j $(nproc)
# Optional - Delete if not using `rubocop`
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
index aff8b6cb7fa..2fd5b409f5e 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
@@ -3,19 +3,36 @@
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/API-Fuzzing.gitlab-ci.yml
+# To use this template, add the following to your .gitlab-ci.yml file:
+#
+# include:
+# template: API-Fuzzing.gitlab-ci.yml
+#
+# You also need to add a `fuzz` stage to your `stages:` configuration. A sample configuration for API Fuzzing:
+#
+# stages:
+# - build
+# - test
+# - deploy
+# - fuzz
+
# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/
#
-# Configure API fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
+# Configure API Fuzzing with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
# List of available variables: https://docs.gitlab.com/ee/user/application_security/api_fuzzing/#available-cicd-variables
variables:
- FUZZAPI_VERSION: "1"
+ # Setting this variable affects all Security templates
+ # (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
- FUZZAPI_IMAGE: ${SECURE_ANALYZERS_PREFIX}/api-fuzzing:${FUZZAPI_VERSION}
+ #
+ FUZZAPI_VERSION: "2"
+ FUZZAPI_IMAGE_SUFFIX: ""
+ FUZZAPI_IMAGE: api-security
apifuzzer_fuzz:
stage: fuzz
- image: $FUZZAPI_IMAGE
+ image: $SECURE_ANALYZERS_PREFIX/$FUZZAPI_IMAGE:$FUZZAPI_VERSION$FUZZAPI_IMAGE_SUFFIX
allow_failure: true
rules:
- if: $API_FUZZING_DISABLED
@@ -23,6 +40,10 @@ apifuzzer_fuzz:
- if: $API_FUZZING_DISABLED_FOR_DEFAULT_BRANCH &&
$CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
when: never
+ - if: $CI_COMMIT_BRANCH &&
+ $CI_GITLAB_FIPS_MODE == "true"
+ variables:
+ FUZZAPI_IMAGE_SUFFIX: "-fips"
- if: $CI_COMMIT_BRANCH
script:
- /peach/analyzer-fuzz-api
diff --git a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
index b6e811aa84f..450969fcdab 100644
--- a/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/API-Fuzzing.latest.gitlab-ci.yml
@@ -26,9 +26,9 @@ variables:
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
#
- FUZZAPI_VERSION: "1"
+ FUZZAPI_VERSION: "2"
FUZZAPI_IMAGE_SUFFIX: ""
- FUZZAPI_IMAGE: api-fuzzing
+ FUZZAPI_IMAGE: api-security
apifuzzer_fuzz:
stage: fuzz
diff --git a/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml
deleted file mode 100644
index 6b861510eef..00000000000
--- a/lib/gitlab/ci/templates/Security/Cluster-Image-Scanning.gitlab-ci.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-# Use this template to enable cluster image scanning in your project.
-# You should add this template to an existing `.gitlab-ci.yml` file by using the `include:`
-# keyword.
-# The template should work without modifications but you can customize the template settings if
-# needed: https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/#customize-the-container-scanning-settings
-#
-# Requirements:
-# - A `test` stage to be present in the pipeline.
-# - You must define the `CIS_KUBECONFIG` variable to allow analyzer to connect to your Kubernetes cluster and fetch found vulnerabilities.
-#
-# Configure container scanning with CI/CD variables (https://docs.gitlab.com/ee/ci/variables/index.html).
-# List of available variables: https://docs.gitlab.com/ee/user/application_security/cluster_image_scanning/#available-variables
-
-variables:
- CIS_ANALYZER_IMAGE: registry.gitlab.com/security-products/cluster-image-scanning:0
-
-cluster_image_scanning:
- image: "$CIS_ANALYZER_IMAGE"
- stage: test
- allow_failure: true
- artifacts:
- reports:
- cluster_image_scanning: gl-cluster-image-scanning-report.json
- paths: [gl-cluster-image-scanning-report.json]
- dependencies: []
- script:
- - /analyzer run
- rules:
- - if: $CLUSTER_IMAGE_SCANNING_DISABLED
- when: never
- - if: '($KUBECONFIG == null || $KUBECONFIG == "") && ($CIS_KUBECONFIG == null || $CIS_KUBECONFIG == "")'
- when: never
- - if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bcluster_image_scanning\b/
diff --git a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
index 66db311f897..bec269e2933 100644
--- a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml
@@ -22,7 +22,7 @@
# List of available variables: https://docs.gitlab.com/ee/user/application_security/container_scanning/#available-variables
variables:
- CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning:4
+ CS_ANALYZER_IMAGE: registry.gitlab.com/security-products/container-scanning:5
container_scanning:
image: "$CS_ANALYZER_IMAGE$CS_IMAGE_SUFFIX"
@@ -47,10 +47,8 @@ container_scanning:
- if: $CONTAINER_SCANNING_DISABLED
when: never
- if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bcontainer_scanning\b/ &&
$CI_GITLAB_FIPS_MODE == "true" &&
$CS_ANALYZER_IMAGE !~ /-(fips|ubi)\z/
variables:
CS_IMAGE_SUFFIX: -fips
- - if: $CI_COMMIT_BRANCH &&
- $GITLAB_FEATURES =~ /\bcontainer_scanning\b/
+ - if: $CI_COMMIT_BRANCH
diff --git a/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
index d82f9f06f8d..893098d33c4 100644
--- a/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-API.gitlab-ci.yml
@@ -26,12 +26,13 @@ variables:
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
#
- DAST_API_VERSION: "1"
- DAST_API_IMAGE: $SECURE_ANALYZERS_PREFIX/api-fuzzing:$DAST_API_VERSION
+ DAST_API_VERSION: "2"
+ DAST_API_IMAGE_SUFFIX: ""
+ DAST_API_IMAGE: api-security
dast_api:
stage: dast
- image: $DAST_API_IMAGE
+ image: $SECURE_ANALYZERS_PREFIX/$DAST_API_IMAGE:$DAST_API_VERSION$DAST_API_IMAGE_SUFFIX
allow_failure: true
rules:
- if: $DAST_API_DISABLED
@@ -39,6 +40,10 @@ dast_api:
- if: $DAST_API_DISABLED_FOR_DEFAULT_BRANCH &&
$CI_DEFAULT_BRANCH == $CI_COMMIT_REF_NAME
when: never
+ - if: $CI_COMMIT_BRANCH &&
+ $CI_GITLAB_FIPS_MODE == "true"
+ variables:
+ DAST_API_IMAGE_SUFFIX: "-fips"
- if: $CI_COMMIT_BRANCH
script:
- /peach/analyzer-dast-api
@@ -50,3 +55,5 @@ dast_api:
- gl-*.log
reports:
dast: gl-dast-api-report.json
+
+# end
diff --git a/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
index b491b3e3c0c..3acc3b06031 100644
--- a/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-API.latest.gitlab-ci.yml
@@ -1,7 +1,7 @@
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dast-API.gitlab-ci.yml
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Security/Dast-API.latest.gitlab-ci.yml
# To use this template, add the following to your .gitlab-ci.yml file:
#
@@ -26,9 +26,9 @@ variables:
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
#
- DAST_API_VERSION: "1"
+ DAST_API_VERSION: "2"
DAST_API_IMAGE_SUFFIX: ""
- DAST_API_IMAGE: api-fuzzing
+ DAST_API_IMAGE: api-security
dast_api:
stage: dast
diff --git a/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
index 998425aa141..c71a1b1873a 100644
--- a/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST-On-Demand-Scan.gitlab-ci.yml
@@ -10,7 +10,7 @@ stages:
- dast
variables:
- DAST_VERSION: 2
+ DAST_VERSION: 3
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
diff --git a/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
index e8e7fe62e70..3bc44fe5e1b 100644
--- a/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST.gitlab-ci.yml
@@ -22,7 +22,7 @@
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast/#available-variables
variables:
- DAST_VERSION: 2
+ DAST_VERSION: 3
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
diff --git a/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
index c755211ec11..e5ac5099546 100644
--- a/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/DAST.latest.gitlab-ci.yml
@@ -22,7 +22,7 @@
# List of available variables: https://docs.gitlab.com/ee/user/application_security/dast/#available-variables
variables:
- DAST_VERSION: 2
+ DAST_VERSION: 3
# Setting this variable will affect all Security templates
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
diff --git a/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml
new file mode 100644
index 00000000000..2207d4ec17a
--- /dev/null
+++ b/lib/gitlab/ci/templates/Security/SAST-IaC.gitlab-ci.yml
@@ -0,0 +1,2 @@
+include:
+ template: Jobs/SAST-IaC.gitlab-ci.yml
diff --git a/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
index a6fd070ec34..b34bfe2a53c 100644
--- a/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Security/Secure-Binaries.gitlab-ci.yml
@@ -18,8 +18,7 @@ variables:
# (SAST, Dependency Scanning, ...)
SECURE_ANALYZERS_PREFIX: "registry.gitlab.com/security-products"
SECURE_BINARIES_ANALYZERS: >-
- bandit, brakeman, gosec, spotbugs, flawfinder, phpcs-security-audit, security-code-scan, nodejs-scan, eslint, secrets, sobelow, pmd-apex, kics, kubesec, semgrep,
- bundler-audit, retire.js, gemnasium, gemnasium-maven, gemnasium-python,
+ bandit, brakeman, gosec, spotbugs, flawfinder, phpcs-security-audit, security-code-scan, nodejs-scan, eslint, secrets, sobelow, pmd-apex, kics, kubesec, semgrep, gemnasium, gemnasium-maven, gemnasium-python,
license-finder,
dast, dast-runner-validation, api-fuzzing
@@ -68,6 +67,8 @@ variables:
bandit:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "2"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -75,6 +76,8 @@ bandit:
brakeman:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -91,6 +94,8 @@ gosec:
spotbugs:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -98,6 +103,8 @@ spotbugs:
flawfinder:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -105,6 +112,8 @@ flawfinder:
phpcs-security-audit:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -121,6 +130,8 @@ security-code-scan:
nodejs-scan:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -128,6 +139,8 @@ nodejs-scan:
eslint:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "2"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -140,10 +153,12 @@ secrets:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
$SECURE_BINARIES_ANALYZERS =~ /\bsecrets\b/
variables:
- SECURE_BINARIES_ANALYZER_VERSION: "3"
+ SECURE_BINARIES_ANALYZER_VERSION: "4"
semgrep:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -151,6 +166,8 @@ semgrep:
sobelow:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -158,6 +175,8 @@ sobelow:
pmd-apex:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -165,6 +184,8 @@ pmd-apex:
kubesec:
extends: .download_images
+ variables:
+ SECURE_BINARIES_ANALYZER_VERSION: "3"
only:
variables:
- $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
@@ -174,20 +195,6 @@ kubesec:
# Dependency Scanning jobs
#
-bundler-audit:
- extends: .download_images
- only:
- variables:
- - $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
- $SECURE_BINARIES_ANALYZERS =~ /\bbundler-audit\b/
-
-retire.js:
- extends: .download_images
- only:
- variables:
- - $SECURE_BINARIES_DOWNLOAD_IMAGES == "true" &&
- $SECURE_BINARIES_ANALYZERS =~ /\bretire\.js\b/
-
gemnasium:
extends: .download_images
only:
diff --git a/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml b/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
deleted file mode 100644
index 55648437191..00000000000
--- a/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-# To contribute improvements to CI/CD templates, please follow the Development guide at:
-# https://docs.gitlab.com/ee/development/cicd/templates.html
-# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Serverless.gitlab-ci.yml
-
-# GitLab Serverless template
-
-image: alpine:latest
-
-stages:
- - build
- - test
- - deploy
-
-.serverless:build:image:
- image: registry.gitlab.com/gitlab-org/gitlabktl:latest
- stage: build
- script: /usr/bin/gitlabktl app build
-
-.serverless:deploy:image:
- image: registry.gitlab.com/gitlab-org/gitlabktl:latest
- stage: deploy
- environment: development
- script: /usr/bin/gitlabktl app deploy
-
-.serverless:build:functions:
- image: registry.gitlab.com/gitlab-org/gitlabktl:latest
- stage: build
- script: /usr/bin/gitlabktl serverless build
-
-.serverless:deploy:functions:
- image: registry.gitlab.com/gitlab-org/gitlabktl:latest
- stage: deploy
- environment: development
- script: /usr/bin/gitlabktl serverless deploy
diff --git a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
index 1a857ef3eb3..56151a6bcdf 100644
--- a/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
@@ -1,27 +1,32 @@
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
include:
- - template: Terraform/Base.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+ - template: Terraform/Base.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
+ - template: Jobs/SAST-IaC.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml
stages:
- - init
- validate
+ - test
- build
- deploy
-init:
- extends: .init
+fmt:
+ extends: .terraform:fmt
+ needs: []
validate:
- extends: .validate
+ extends: .terraform:validate
+ needs: []
build:
- extends: .build
+ extends: .terraform:build
deploy:
- extends: .deploy
+ extends: .terraform:deploy
dependencies:
- build
+ environment:
+ name: $TF_STATE_NAME
diff --git a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
index 12c987a8d37..019b970bc30 100644
--- a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
@@ -5,7 +5,7 @@
include:
- template: Terraform/Base.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
- - template: Jobs/SAST-IaC.latest.gitlab-ci.yml
+ - template: Jobs/SAST-IaC.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.latest.gitlab-ci.yml
stages:
- validate
diff --git a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
index 84a962e1541..49bdd4b7713 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml
@@ -1,4 +1,4 @@
-# Terraform/Base.latest
+# Terraform/Base
#
# The purpose of this template is to provide flexibility to the user so
# they are able to only include the jobs that they find interesting.
@@ -7,10 +7,9 @@
# create hidden jobs. See: https://docs.gitlab.com/ee/ci/yaml/#hide-jobs
#
# There is a more opinionated template which we suggest the users to abide,
-# which is the lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml
-
+# which is the lib/gitlab/ci/templates/Terraform.gitlab-ci.yml
image:
- name: registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.0.3
+ name: registry.gitlab.com/gitlab-org/terraform-images/releases/terraform:1.1.9
variables:
TF_ROOT: ${CI_PROJECT_DIR} # The relative path to the root directory of the Terraform project
@@ -21,43 +20,46 @@ cache:
paths:
- ${TF_ROOT}/.terraform/
-.init: &init
- stage: init
+.terraform:fmt: &terraform_fmt
+ stage: validate
script:
- cd "${TF_ROOT}"
- - gitlab-terraform init
+ - gitlab-terraform fmt
+ allow_failure: true
-.validate: &validate
+.terraform:validate: &terraform_validate
stage: validate
script:
- cd "${TF_ROOT}"
- gitlab-terraform validate
-.build: &build
+.terraform:build: &terraform_build
stage: build
script:
- cd "${TF_ROOT}"
- gitlab-terraform plan
- gitlab-terraform plan-json
+ resource_group: ${TF_STATE_NAME}
artifacts:
paths:
- ${TF_ROOT}/plan.cache
reports:
terraform: ${TF_ROOT}/plan.json
-.deploy: &deploy
+.terraform:deploy: &terraform_deploy
stage: deploy
script:
- cd "${TF_ROOT}"
- gitlab-terraform apply
- when: manual
- only:
- variables:
- - $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ resource_group: ${TF_STATE_NAME}
+ rules:
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+ when: manual
-.destroy: &destroy
+.terraform:destroy: &terraform_destroy
stage: cleanup
script:
- cd "${TF_ROOT}"
- gitlab-terraform destroy
+ resource_group: ${TF_STATE_NAME}
when: manual
diff --git a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
index a0ec07e61e1..9ba009a5bca 100644
--- a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml
@@ -24,20 +24,20 @@ cache:
.terraform:fmt: &terraform_fmt
stage: validate
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform fmt
allow_failure: true
.terraform:validate: &terraform_validate
stage: validate
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform validate
.terraform:build: &terraform_build
stage: build
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform plan
- gitlab-terraform plan-json
resource_group: ${TF_STATE_NAME}
@@ -50,7 +50,7 @@ cache:
.terraform:deploy: &terraform_deploy
stage: deploy
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform apply
resource_group: ${TF_STATE_NAME}
rules:
@@ -60,7 +60,7 @@ cache:
.terraform:destroy: &terraform_destroy
stage: cleanup
script:
- - cd ${TF_ROOT}
+ - cd "${TF_ROOT}"
- gitlab-terraform destroy
resource_group: ${TF_STATE_NAME}
when: manual
diff --git a/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
index 5ea2bc07ffa..2b5e86f4066 100644
--- a/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Accessibility.gitlab-ci.yml
@@ -13,7 +13,7 @@ stages:
a11y:
stage: accessibility
- image: registry.gitlab.com/gitlab-org/ci-cd/accessibility:6.1.1
+ image: registry.gitlab.com/gitlab-org/ci-cd/accessibility:6.2.3
script:
- /gitlab-accessibility.sh "$a11y_urls"
allow_failure: true
diff --git a/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml b/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
index 09fce67db2d..b8d284532bd 100644
--- a/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
@@ -1,7 +1,7 @@
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
-# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET-Core.yml
+# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/dotNET-Core.gitlab-ci.yml
# This is a simple example illustrating how to build and test .NET Core project
# with GitLab Continuous Integration / Continuous Delivery.
diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb
index 7d08f0230fc..e93bd75a9fa 100644
--- a/lib/gitlab/ci/trace.rb
+++ b/lib/gitlab/ci/trace.rb
@@ -74,11 +74,11 @@ module Gitlab
end
def exist?
- archived_trace_exist? || live_trace_exist?
+ archived? || live_trace_exist?
end
- def archived_trace_exist?
- archived?
+ def archived?
+ trace_artifact&.stored?
end
def live_trace_exist?
@@ -218,12 +218,6 @@ module Gitlab
end
end
- def archived?
- # TODO check checksum to ensure archive completed successfully
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/259619
- trace_artifact&.archived_trace_exists?
- end
-
def destroy_any_orphan_trace_data!
return unless trace_artifact
@@ -312,7 +306,7 @@ module Gitlab
end
def consistent_archived_trace?(build)
- ::Feature.enabled?(:gitlab_ci_archived_trace_consistent_reads, build.project, default_enabled: false)
+ ::Feature.enabled?(:gitlab_ci_archived_trace_consistent_reads, build.project)
end
def being_watched_cache_key
diff --git a/lib/gitlab/ci/variables/builder.rb b/lib/gitlab/ci/variables/builder.rb
index bcb1fe83ea2..a452cb197ae 100644
--- a/lib/gitlab/ci/variables/builder.rb
+++ b/lib/gitlab/ci/variables/builder.rb
@@ -52,7 +52,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(job).execute
+ template = ::Ci::GenerateKubeconfigService.new(pipeline, token: job.token).execute
kubeconfig_yaml = collection['KUBECONFIG']&.value
template.merge_yaml(kubeconfig_yaml) if kubeconfig_yaml.present?
diff --git a/lib/gitlab/ci/yaml_processor/result.rb b/lib/gitlab/ci/yaml_processor/result.rb
index f14279dca2d..576fb509d47 100644
--- a/lib/gitlab/ci/yaml_processor/result.rb
+++ b/lib/gitlab/ci/yaml_processor/result.rb
@@ -103,10 +103,6 @@ module Gitlab
}.compact }.compact
end
- def merged_yaml
- @ci_config&.to_hash&.deep_stringify_keys&.to_yaml
- end
-
def variables_with_data
@ci_config.variables_with_data
end
@@ -127,6 +123,10 @@ module Gitlab
jobs.dig(job_name, :stage)
end
+ def config_metadata
+ @ci_config&.metadata || {}
+ end
+
private
def variables
diff --git a/lib/gitlab/color.rb b/lib/gitlab/color.rb
index e0caabb0ec6..01c534c15a0 100644
--- a/lib/gitlab/color.rb
+++ b/lib/gitlab/color.rb
@@ -170,6 +170,11 @@ module Gitlab
Constants::COLOR_NAME_TO_HEX[color.downcase] || new(color)
end
+ # Generate a hex color based on hex-encoded value
+ def self.color_for(value)
+ Color.new("##{Digest::SHA256.hexdigest(value.to_s)[0..5]}")
+ end
+
def to_s
@value.to_s
end
diff --git a/lib/gitlab/config/entry/validator.rb b/lib/gitlab/config/entry/validator.rb
index e5efd4a7b0a..297645a65c1 100644
--- a/lib/gitlab/config/entry/validator.rb
+++ b/lib/gitlab/config/entry/validator.rb
@@ -7,10 +7,6 @@ module Gitlab
include ActiveModel::Validations
include Entry::Validators
- def initialize(entry)
- super(entry)
- end
-
def messages
errors.full_messages.map do |error|
"#{location} #{error}".downcase
diff --git a/lib/gitlab/config/loader/yaml.rb b/lib/gitlab/config/loader/yaml.rb
index f3a3818f010..0559c85647d 100644
--- a/lib/gitlab/config/loader/yaml.rb
+++ b/lib/gitlab/config/loader/yaml.rb
@@ -41,7 +41,7 @@ module Gitlab
end
def too_big?
- return false unless Feature.enabled?(:ci_yaml_limit_size, default_enabled: true)
+ return false unless Feature.enabled?(:ci_yaml_limit_size)
!deep_size.valid?
end
diff --git a/lib/gitlab/content_security_policy/config_loader.rb b/lib/gitlab/content_security_policy/config_loader.rb
index 22a4ba8ac7a..521dec110a8 100644
--- a/lib/gitlab/content_security_policy/config_loader.rb
+++ b/lib/gitlab/content_security_policy/config_loader.rb
@@ -61,7 +61,9 @@ module Gitlab
end
def initialize(csp_directives)
- @csp_directives = HashWithIndifferentAccess.new(csp_directives)
+ @merged_csp_directives =
+ HashWithIndifferentAccess.new(csp_directives)
+ .reverse_merge(::Gitlab::ContentSecurityPolicy::ConfigLoader.default_directives)
end
def load(policy)
@@ -77,8 +79,9 @@ module Gitlab
private
def arguments_for(directive)
- arguments = @csp_directives[directive.to_s]
-
+ # In order to disable a directive, the user can explicitly
+ # set a falsy value like nil, false or empty string
+ arguments = @merged_csp_directives[directive]
return unless arguments.present? && arguments.is_a?(String)
arguments.strip.split(' ').map(&:strip)
diff --git a/lib/gitlab/cycle_analytics/summary/deployment_frequency.rb b/lib/gitlab/cycle_analytics/summary/deployment_frequency.rb
index 2b1529bdc1a..83ff61bbef2 100644
--- a/lib/gitlab/cycle_analytics/summary/deployment_frequency.rb
+++ b/lib/gitlab/cycle_analytics/summary/deployment_frequency.rb
@@ -21,7 +21,7 @@ module Gitlab
end
def unit
- _('per day')
+ _('/day')
end
def links
diff --git a/lib/gitlab/data_builder/issuable.rb b/lib/gitlab/data_builder/issuable.rb
new file mode 100644
index 00000000000..9a0b964915c
--- /dev/null
+++ b/lib/gitlab/data_builder/issuable.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DataBuilder
+ class Issuable
+ CHANGES_KEYS = %i[previous current].freeze
+
+ attr_reader :issuable
+
+ def initialize(issuable)
+ @issuable = issuable
+ end
+
+ def build(user: nil, changes: {})
+ hook_data = {
+ object_kind: object_kind,
+ event_type: event_type,
+ user: user.hook_attrs,
+ project: issuable.project.hook_attrs,
+ object_attributes: issuable_builder.new(issuable).build,
+ labels: issuable.labels.map(&:hook_attrs),
+ changes: final_changes(changes.slice(*safe_keys)),
+ # DEPRECATED
+ repository: issuable.project.hook_attrs.slice(:name, :url, :description, :homepage)
+ }
+
+ hook_data[:assignees] = issuable.assignees.map(&:hook_attrs) if issuable.assignees.any?
+
+ hook_data
+ end
+
+ def safe_keys
+ issuable_builder.safe_hook_attributes + issuable_builder.safe_hook_relations
+ end
+
+ private
+
+ def object_kind
+ issuable.class.name.underscore
+ end
+
+ def event_type
+ if issuable.try(:confidential?)
+ "confidential_#{object_kind}"
+ else
+ object_kind
+ end
+ end
+
+ def issuable_builder
+ case issuable
+ when Issue
+ Gitlab::HookData::IssueBuilder
+ when MergeRequest
+ Gitlab::HookData::MergeRequestBuilder
+ end
+ end
+
+ def final_changes(changes_hash)
+ changes_hash.transform_values { |changes_array| Hash[CHANGES_KEYS.zip(changes_array)] }
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 1895f0fab32..677b4485288 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -49,7 +49,7 @@ module Gitlab
# It does not include the default public schema
EXTRA_SCHEMAS = [DYNAMIC_PARTITIONS_SCHEMA, STATIC_PARTITIONS_SCHEMA].freeze
- PRIMARY_DATABASE_NAME = ActiveRecord::Base.connection_db_config.name.to_sym
+ PRIMARY_DATABASE_NAME = ActiveRecord::Base.connection_db_config.name.to_sym # rubocop:disable Database/MultipleDatabases
def self.database_base_models
@database_base_models ||= {
@@ -94,21 +94,6 @@ module Gitlab
Gitlab::Application.config.database_configuration[Rails.env].include?(database_name.to_s)
end
- def self.main_database?(name)
- # The database is `main` if it is a first entry in `database.yml`
- # Rails internally names them `primary` to avoid confusion
- # with broad `primary` usage we use `main` instead
- #
- # TODO: The explicit `== 'main'` is needed in a transition period till
- # the `database.yml` is not migrated into `main:` syntax
- # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65243
- ActiveRecord::Base.configurations.primary?(name.to_s) || name.to_s == 'main'
- end
-
- def self.ci_database?(name)
- name.to_s == CI_DATABASE_NAME
- end
-
class PgUser < ApplicationRecord
self.table_name = 'pg_user'
self.primary_key = :usename
diff --git a/lib/gitlab/database/background_migration/batch_optimizer.rb b/lib/gitlab/database/background_migration/batch_optimizer.rb
index 58c4a214077..c8fdf8281cd 100644
--- a/lib/gitlab/database/background_migration/batch_optimizer.rb
+++ b/lib/gitlab/database/background_migration/batch_optimizer.rb
@@ -41,7 +41,7 @@ module Gitlab
end
def optimize!
- return unless Feature.enabled?(:optimize_batched_migrations, type: :ops, default_enabled: :yaml)
+ return unless Feature.enabled?(:optimize_batched_migrations, type: :ops)
if multiplier = batch_size_multiplier
max_batch = migration.max_batch_size || MAX_BATCH_SIZE
diff --git a/lib/gitlab/database/background_migration/batched_migration.rb b/lib/gitlab/database/background_migration/batched_migration.rb
index d94bf060d05..a90cae7aea2 100644
--- a/lib/gitlab/database/background_migration/batched_migration.rb
+++ b/lib/gitlab/database/background_migration/batched_migration.rb
@@ -28,6 +28,8 @@ module Gitlab
# on_hold_until is a temporary runtime status which puts execution "on hold"
scope :executable, -> { with_status(:active).where('on_hold_until IS NULL OR on_hold_until < NOW()') }
+ scope :created_after, ->(time) { where('created_at > ?', time) }
+
scope :for_configuration, ->(job_class_name, table_name, column_name, job_arguments) do
where(job_class_name: job_class_name, table_name: table_name, column_name: column_name)
.where("job_arguments = ?", job_arguments.to_json) # rubocop:disable Rails/WhereEquals
diff --git a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
index ec68f401ca2..5f4b2be3da8 100644
--- a/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
+++ b/lib/gitlab/database/background_migration/batched_migration_wrapper.rb
@@ -39,7 +39,40 @@ module Gitlab
end
def execute_batch(tracking_record)
- job_instance = migration_instance_for(tracking_record.migration_job_class)
+ job_instance = execute_job(tracking_record)
+
+ if job_instance.respond_to?(:batch_metrics)
+ tracking_record.metrics = job_instance.batch_metrics
+ end
+ end
+
+ def execute_job(tracking_record)
+ job_class = tracking_record.migration_job_class
+
+ if job_class < Gitlab::BackgroundMigration::BatchedMigrationJob
+ execute_batched_migration_job(job_class, tracking_record)
+ else
+ execute_legacy_job(job_class, tracking_record)
+ end
+ end
+
+ def execute_batched_migration_job(job_class, tracking_record)
+ job_instance = job_class.new(
+ start_id: tracking_record.min_value,
+ end_id: tracking_record.max_value,
+ batch_table: tracking_record.migration_table_name,
+ batch_column: tracking_record.migration_column_name,
+ sub_batch_size: tracking_record.sub_batch_size,
+ pause_ms: tracking_record.pause_ms,
+ connection: connection)
+
+ job_instance.perform(*tracking_record.migration_job_arguments)
+
+ job_instance
+ end
+
+ def execute_legacy_job(job_class, tracking_record)
+ job_instance = job_class.new
job_instance.perform(
tracking_record.min_value,
@@ -50,17 +83,7 @@ module Gitlab
tracking_record.pause_ms,
*tracking_record.migration_job_arguments)
- if job_instance.respond_to?(:batch_metrics)
- tracking_record.metrics = job_instance.batch_metrics
- end
- end
-
- def migration_instance_for(job_class)
- if job_class < Gitlab::BackgroundMigration::BaseJob
- job_class.new(connection: connection)
- else
- job_class.new
- end
+ job_instance
end
end
end
diff --git a/lib/gitlab/database/gitlab_schemas.yml b/lib/gitlab/database/gitlab_schemas.yml
index ae0ea919b62..036ce7d7631 100644
--- a/lib/gitlab/database/gitlab_schemas.yml
+++ b/lib/gitlab/database/gitlab_schemas.yml
@@ -217,7 +217,6 @@ geo_event_log: :gitlab_main
geo_events: :gitlab_main
geo_hashed_storage_attachments_events: :gitlab_main
geo_hashed_storage_migrated_events: :gitlab_main
-geo_job_artifact_deleted_events: :gitlab_main
geo_lfs_object_deleted_events: :gitlab_main
geo_node_namespace_links: :gitlab_main
geo_nodes: :gitlab_main
@@ -327,6 +326,7 @@ namespace_aggregation_schedules: :gitlab_main
namespace_limits: :gitlab_main
namespace_package_settings: :gitlab_main
namespace_root_storage_statistics: :gitlab_main
+namespace_ci_cd_settings: :gitlab_main
namespace_settings: :gitlab_main
namespaces: :gitlab_main
namespaces_sync_events: :gitlab_main
@@ -348,6 +348,7 @@ operations_strategies: :gitlab_main
operations_strategies_user_lists: :gitlab_main
operations_user_lists: :gitlab_main
packages_build_infos: :gitlab_main
+packages_cleanup_policies: :gitlab_main
packages_composer_cache_files: :gitlab_main
packages_composer_metadata: :gitlab_main
packages_conan_file_metadata: :gitlab_main
@@ -388,6 +389,7 @@ plan_limits: :gitlab_main
plans: :gitlab_main
pool_repositories: :gitlab_main
postgres_async_indexes: :gitlab_shared
+postgres_autovacuum_activity: :gitlab_shared
postgres_foreign_keys: :gitlab_shared
postgres_index_bloat_estimates: :gitlab_shared
postgres_indexes: :gitlab_shared
diff --git a/lib/gitlab/database/load_balancing/configuration.rb b/lib/gitlab/database/load_balancing/configuration.rb
index 3f03d9e2c12..0ddc745ebae 100644
--- a/lib/gitlab/database/load_balancing/configuration.rb
+++ b/lib/gitlab/database/load_balancing/configuration.rb
@@ -90,7 +90,7 @@ module Gitlab
return false unless ::Gitlab::SafeRequestStore.active?
::Gitlab::SafeRequestStore.fetch(:force_no_sharing_primary_model) do
- ::Feature::FlipperFeature.table_exists? && ::Feature.enabled?(:force_no_sharing_primary_model, default_enabled: :yaml)
+ ::Feature::FlipperFeature.table_exists? && ::Feature.enabled?(:force_no_sharing_primary_model)
end
end
diff --git a/lib/gitlab/database/load_balancing/load_balancer.rb b/lib/gitlab/database/load_balancing/load_balancer.rb
index 1e27bcfc55d..191ebe18b8a 100644
--- a/lib/gitlab/database/load_balancing/load_balancer.rb
+++ b/lib/gitlab/database/load_balancing/load_balancer.rb
@@ -255,6 +255,7 @@ module Gitlab
# ActiveRecord::ConnectionAdapters::ConnectionHandler handles fetching,
# and caching for connections pools for each "connection", so we
# leverage that.
+ # rubocop:disable Database/MultipleDatabases
def pool
ActiveRecord::Base.connection_handler.retrieve_connection_pool(
@configuration.primary_connection_specification_name,
@@ -262,6 +263,7 @@ module Gitlab
shard: ActiveRecord::Base.default_shard
) || raise(::ActiveRecord::ConnectionNotEstablished)
end
+ # rubocop:enable Database/MultipleDatabases
def wal_diff(location1, location2)
read_write do |connection|
diff --git a/lib/gitlab/database/migration.rb b/lib/gitlab/database/migration.rb
index dc695a74a4b..038af570dbc 100644
--- a/lib/gitlab/database/migration.rb
+++ b/lib/gitlab/database/migration.rb
@@ -37,18 +37,19 @@ module Gitlab
class V1_0 < ActiveRecord::Migration[6.1] # rubocop:disable Naming/ClassAndModuleCamelCase
include LockRetriesConcern
include Gitlab::Database::MigrationHelpers::V2
- end
-
- class V2_0 < V1_0 # rubocop:disable Naming/ClassAndModuleCamelCase
- include Gitlab::Database::MigrationHelpers::RestrictGitlabSchema
# When running migrations, the `db:migrate` switches connection of
# ActiveRecord::Base depending where the migration runs.
# This helper class is provided to avoid confusion using `ActiveRecord::Base`
class MigrationRecord < ActiveRecord::Base
+ self.abstract_class = true # Prevent STI behavior
end
end
+ class V2_0 < V1_0 # rubocop:disable Naming/ClassAndModuleCamelCase
+ include Gitlab::Database::MigrationHelpers::RestrictGitlabSchema
+ end
+
def self.[](version)
version = version.to_s
name = "V#{version.tr('.', '_')}"
diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb
index d016dea224b..0453b81d67d 100644
--- a/lib/gitlab/database/migration_helpers.rb
+++ b/lib/gitlab/database/migration_helpers.rb
@@ -3,6 +3,7 @@
module Gitlab
module Database
module MigrationHelpers
+ include Migrations::ReestablishedConnectionStack
include Migrations::BackgroundMigrationHelpers
include Migrations::BatchedBackgroundMigrationHelpers
include DynamicModelHelpers
@@ -943,7 +944,7 @@ module Gitlab
execute("DELETE FROM batched_background_migrations WHERE #{conditions}")
end
- def ensure_batched_background_migration_is_finished(job_class_name:, table_name:, column_name:, job_arguments:)
+ def ensure_batched_background_migration_is_finished(job_class_name:, table_name:, column_name:, job_arguments:, finalize: true)
migration = Gitlab::Database::BackgroundMigration::BatchedMigration
.for_configuration(job_class_name, table_name, column_name, job_arguments).first
@@ -954,14 +955,18 @@ module Gitlab
job_arguments: job_arguments
}
- if migration.nil?
- Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}"
- elsif !migration.finished?
+ return Gitlab::AppLogger.warn "Could not find batched background migration for the given configuration: #{configuration}" if migration.nil?
+
+ return if migration.finished?
+
+ finalize_batched_background_migration(job_class_name: job_class_name, table_name: table_name, column_name: column_name, job_arguments: job_arguments) if finalize
+
+ unless migration.reload.finished? # rubocop:disable Cop/ActiveRecordAssociationReload
raise "Expected batched background migration for the given configuration to be marked as 'finished', " \
"but it is '#{migration.status_name}':" \
"\t#{configuration}" \
"\n\n" \
- "Finalize it manualy by running" \
+ "Finalize it manually by running" \
"\n\n" \
"\tsudo gitlab-rake gitlab:background_migrations:finalize[#{job_class_name},#{table_name},#{column_name},'#{job_arguments.to_json.gsub(',', '\,')}']" \
"\n\n" \
diff --git a/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb b/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
index 5a25128f3a9..d8d07fcaf2d 100644
--- a/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
+++ b/lib/gitlab/database/migration_helpers/restrict_gitlab_schema.rb
@@ -27,7 +27,7 @@ module Gitlab
return
end
- Gitlab::Database::QueryAnalyzer.instance.within([validator_class]) do
+ Gitlab::Database::QueryAnalyzer.instance.within([validator_class, connection_validator_class]) do
validator_class.allowed_gitlab_schemas = self.allowed_gitlab_schemas
super
@@ -45,6 +45,10 @@ module Gitlab
Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas
end
+ def connection_validator_class
+ Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection
+ end
+
def unmatched_schemas
(self.allowed_gitlab_schemas || []) - allowed_schemas_for_connection
end
diff --git a/lib/gitlab/database/migrations/background_migration_helpers.rb b/lib/gitlab/database/migrations/background_migration_helpers.rb
index 7e5c002d072..9bffed43077 100644
--- a/lib/gitlab/database/migrations/background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/background_migration_helpers.rb
@@ -41,6 +41,25 @@ module Gitlab
# end
# end
def queue_background_migration_jobs_by_range_at_intervals(model_class, job_class_name, delay_interval, batch_size: BATCH_SIZE, other_job_arguments: [], initial_delay: 0, track_jobs: false, primary_column_name: :id)
+ if transaction_open?
+ raise 'The `#queue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
+ # Background Migrations do not work well for in cases requiring to update `gitlab_shared`
+ # Once the decomposition is done, enqueued jobs for `gitlab_shared` tables (on CI database)
+ # will not be executed since the queue (which is stored in Redis) is tied to main database, not to schema.
+ # The batched background migrations do not have those limitations since the tracking tables
+ # are properly database-only.
+ if background_migration_restrict_gitlab_migration_schemas&.include?(:gitlab_shared)
+ raise 'The `#queue_background_migration_jobs_by_range_at_intervals` cannot " \
+ "use `restrict_gitlab_migration:` " with `:gitlab_shared`. ' \
+ 'Background migrations do encode migration worker which is tied to a given database. ' \
+ 'After split this worker will not be properly duplicated into decomposed database. ' \
+ 'Use batched background migrations instead that do support well working across all databases.'
+ end
+
raise "#{model_class} does not have an ID column of #{primary_column_name} to use for batch ranges" unless model_class.column_names.include?(primary_column_name.to_s)
raise "#{primary_column_name} is not an integer or string column" unless [:integer, :string].include?(model_class.columns_hash[primary_column_name.to_s].type)
@@ -90,6 +109,18 @@ module Gitlab
# delay_interval - The duration between each job's scheduled time
# batch_size - The maximum number of jobs to fetch to memory from the database.
def requeue_background_migration_jobs_by_range_at_intervals(job_class_name, delay_interval, batch_size: BATCH_SIZE, initial_delay: 0)
+ if transaction_open?
+ raise 'The `#requeue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
+ if background_migration_restrict_gitlab_migration_schemas&.any?
+ raise 'The `#requeue_background_migration_jobs_by_range_at_intervals` cannot use `restrict_gitlab_migration:`. ' \
+ 'The `#requeue_background_migration_jobs_by_range_at_intervals` needs to be executed on all databases since ' \
+ 'each database has its own queue of background migrations.'
+ end
+
job_coordinator = coordinator_for_tracking_database
# To not overload the worker too much we enforce a minimum interval both
@@ -133,23 +164,40 @@ module Gitlab
# This method does not garauntee that all jobs completed successfully.
# It can only be used if the previous background migration used the queue_background_migration_jobs_by_range_at_intervals helper.
def finalize_background_migration(class_name, delete_tracking_jobs: ['succeeded'])
+ if transaction_open?
+ raise 'The `#finalize_background_migration` can not be run inside a transaction, ' \
+ 'you can disable transactions by calling disable_ddl_transaction! ' \
+ 'in the body of your migration class'
+ end
+
+ if background_migration_restrict_gitlab_migration_schemas&.any?
+ raise 'The `#finalize_background_migration` cannot use `restrict_gitlab_migration:`. ' \
+ 'The `#finalize_background_migration` needs to be executed on all databases since ' \
+ 'each database has its own queue of background migrations.'
+ end
+
job_coordinator = coordinator_for_tracking_database
- # Empty the sidekiq queue.
- job_coordinator.steal(class_name)
+ with_restored_connection_stack do
+ # Since we are running trusted code (background migration class) allow to execute any type of finalize
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.with_suppressed do
+ # Empty the sidekiq queue.
+ job_coordinator.steal(class_name)
- # Process pending tracked jobs.
- jobs = Gitlab::Database::BackgroundMigrationJob.pending.for_migration_class(class_name)
+ # Process pending tracked jobs.
+ jobs = Gitlab::Database::BackgroundMigrationJob.pending.for_migration_class(class_name)
- jobs.find_each do |job|
- job_coordinator.perform(job.class_name, job.arguments)
- end
+ jobs.find_each do |job|
+ job_coordinator.perform(job.class_name, job.arguments)
+ end
- # Empty the sidekiq queue.
- job_coordinator.steal(class_name)
+ # Empty the sidekiq queue.
+ job_coordinator.steal(class_name)
- # Delete job tracking rows.
- delete_job_tracking(class_name, status: delete_tracking_jobs) if delete_tracking_jobs
+ # Delete job tracking rows.
+ delete_job_tracking(class_name, status: delete_tracking_jobs) if delete_tracking_jobs
+ end
+ end
end
def migrate_in(*args, coordinator: coordinator_for_tracking_database)
@@ -174,6 +222,10 @@ module Gitlab
private
+ def background_migration_restrict_gitlab_migration_schemas
+ self.allowed_gitlab_schemas if self.respond_to?(:allowed_gitlab_schemas)
+ end
+
def with_migration_context(&block)
Gitlab::ApplicationContext.with_context(caller_id: self.class.to_s, &block)
end
@@ -183,11 +235,9 @@ module Gitlab
end
def coordinator_for_tracking_database
- Gitlab::BackgroundMigration.coordinator_for_database(tracking_database)
- end
+ tracking_database = Gitlab::Database.db_config_name(connection)
- def tracking_database
- Gitlab::BackgroundMigration::DEFAULT_TRACKING_DATABASE
+ Gitlab::BackgroundMigration.coordinator_for_database(tracking_database)
end
end
end
diff --git a/lib/gitlab/database/migrations/base_background_runner.rb b/lib/gitlab/database/migrations/base_background_runner.rb
new file mode 100644
index 00000000000..2772502140e
--- /dev/null
+++ b/lib/gitlab/database/migrations/base_background_runner.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ class BaseBackgroundRunner
+ attr_reader :result_dir
+
+ def initialize(result_dir:)
+ @result_dir = result_dir
+ end
+
+ def jobs_by_migration_name
+ raise NotImplementedError, 'subclass must implement'
+ end
+
+ def run_job(job)
+ raise NotImplementedError, 'subclass must implement'
+ end
+
+ def run_jobs(for_duration:)
+ jobs_to_run = jobs_by_migration_name
+ return if jobs_to_run.empty?
+
+ # without .to_f, we do integer division
+ # For example, 3.minutes / 2 == 1.minute whereas 3.minutes / 2.to_f == (1.minute + 30.seconds)
+ duration_per_migration_type = for_duration / jobs_to_run.count.to_f
+ jobs_to_run.each do |migration_name, jobs|
+ run_until = duration_per_migration_type.from_now
+
+ run_jobs_for_migration(migration_name: migration_name, jobs: jobs, run_until: run_until)
+ end
+ end
+
+ private
+
+ def run_jobs_for_migration(migration_name:, jobs:, run_until:)
+ per_background_migration_result_dir = File.join(@result_dir, migration_name)
+
+ instrumentation = Instrumentation.new(result_dir: per_background_migration_result_dir)
+ batch_names = (1..).each.lazy.map { |i| "batch_#{i}"}
+
+ jobs.shuffle.each do |j|
+ break if run_until <= Time.current
+
+ instrumentation.observe(version: nil,
+ name: batch_names.next,
+ connection: ActiveRecord::Migration.connection) do
+ run_job(j)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
index 0261ade0fe7..7113c3686f1 100644
--- a/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
+++ b/lib/gitlab/database/migrations/batched_background_migration_helpers.rb
@@ -122,6 +122,22 @@ module Gitlab
migration.save!
migration
end
+
+ def finalize_batched_background_migration(job_class_name:, table_name:, column_name:, job_arguments:)
+ database_name = Gitlab::Database.db_config_name(connection)
+
+ unless ActiveRecord::Base.configurations.primary?(database_name)
+ raise 'The `#finalize_background_migration` is currently not supported when running in decomposed database, ' \
+ 'and this database is not `main:`. For more information visit: ' \
+ 'https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html'
+ end
+
+ migration = Gitlab::Database::BackgroundMigration::BatchedMigration.find_for_configuration(job_class_name, table_name, column_name, job_arguments)
+
+ raise 'Could not find batched background migration' if migration.nil?
+
+ Gitlab::Database::BackgroundMigration::BatchedMigrationRunner.finalize(job_class_name, table_name, column_name, job_arguments, connection: connection)
+ end
end
end
end
diff --git a/lib/gitlab/database/migrations/observers/query_log.rb b/lib/gitlab/database/migrations/observers/query_log.rb
index 8ca57bb7df9..543e6b8e302 100644
--- a/lib/gitlab/database/migrations/observers/query_log.rb
+++ b/lib/gitlab/database/migrations/observers/query_log.rb
@@ -6,7 +6,7 @@ module Gitlab
module Observers
class QueryLog < MigrationObserver
def before
- @logger_was = ActiveRecord::Base.logger
+ @logger_was = ActiveRecord::Base.logger # rubocop:disable Database/MultipleDatabases
file_path = File.join(output_dir, "migration.log")
@logger = Logger.new(file_path)
ActiveRecord::Base.logger = @logger
diff --git a/lib/gitlab/database/migrations/observers/query_statistics.rb b/lib/gitlab/database/migrations/observers/query_statistics.rb
index 54504646a79..2d026f0c8d2 100644
--- a/lib/gitlab/database/migrations/observers/query_statistics.rb
+++ b/lib/gitlab/database/migrations/observers/query_statistics.rb
@@ -22,6 +22,7 @@ module Gitlab
observation.query_statistics = connection.execute(<<~SQL)
SELECT query, calls, total_time, max_time, mean_time, rows
FROM pg_stat_statements
+ WHERE pg_get_userbyid(userid) = current_user
ORDER BY total_time DESC
SQL
end
diff --git a/lib/gitlab/database/migrations/reestablished_connection_stack.rb b/lib/gitlab/database/migrations/reestablished_connection_stack.rb
new file mode 100644
index 00000000000..d7cf482c32a
--- /dev/null
+++ b/lib/gitlab/database/migrations/reestablished_connection_stack.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ module ReestablishedConnectionStack
+ # This is workaround for `db:migrate` that switches `ActiveRecord::Base.connection`
+ # depending on execution. This is subject to be removed once proper fix is implemented:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/362341
+ #
+ # In some cases when we run application code we need to restore application connection stack:
+ # - ApplicationRecord (in fact ActiveRecord::Base): points to main
+ # - Ci::ApplicationRecord: points to ci
+ #
+ # rubocop:disable Database/MultipleDatabases
+ def with_restored_connection_stack(&block)
+ original_handler = ActiveRecord::Base.connection_handler
+
+ original_db_config = ActiveRecord::Base.connection_db_config
+ return yield if ActiveRecord::Base.configurations.primary?(original_db_config.name)
+
+ # If the `ActiveRecord::Base` connection is different than `:main`
+ # re-establish and configure `SharedModel` context accordingly
+ # to previously established `ActiveRecord::Base` to allow the application
+ # code to use `ApplicationRecord` and `Ci::ApplicationRecord` usual way.
+ # We swap a connection handler as migration context does hold an actual
+ # connection which we cannot close.
+ base_model = Gitlab::Database.database_base_models.fetch(original_db_config.name.to_sym)
+
+ # copy connections over to new connection handler
+ db_configs = original_handler.connection_pool_names.map do |connection_pool_name|
+ [connection_pool_name.constantize, connection_pool_name.constantize.connection_db_config]
+ end
+
+ new_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
+ ActiveRecord::Base.connection_handler = new_handler
+
+ db_configs.each do |klass, db_config|
+ new_handler.establish_connection(db_config, owner_name: klass)
+ end
+
+ # re-establish ActiveRecord::Base to main
+ ActiveRecord::Base.establish_connection :main # rubocop:disable Database/EstablishConnection
+
+ Gitlab::Database::SharedModel.using_connection(base_model.connection) do
+ yield
+ end
+ ensure
+ ActiveRecord::Base.connection_handler = original_handler
+ new_handler&.clear_all_connections!
+ end
+ # rubocop:enable Database/MultipleDatabases
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/migrations/runner.rb b/lib/gitlab/database/migrations/runner.rb
index 3b6f52b43a8..4404b5bf961 100644
--- a/lib/gitlab/database/migrations/runner.rb
+++ b/lib/gitlab/database/migrations/runner.rb
@@ -21,6 +21,18 @@ module Gitlab
TestBackgroundRunner.new(result_dir: BASE_RESULT_DIR.join('background_migrations'))
end
+ def batched_background_migrations(for_database:)
+ runner = nil
+
+ # Only one loop iteration since we pass `only:` here
+ Gitlab::Database::EachDatabase.each_database_connection(only: for_database) do |connection|
+ runner = Gitlab::Database::Migrations::TestBatchedBackgroundRunner
+ .new(result_dir: BASE_RESULT_DIR.join('background_migrations'), connection: connection)
+ end
+
+ runner
+ end
+
def migration_context
@migration_context ||= ApplicationRecord.connection.migration_context
end
diff --git a/lib/gitlab/database/migrations/test_background_runner.rb b/lib/gitlab/database/migrations/test_background_runner.rb
index 74e54d62e05..f7713237b38 100644
--- a/lib/gitlab/database/migrations/test_background_runner.rb
+++ b/lib/gitlab/database/migrations/test_background_runner.rb
@@ -3,11 +3,9 @@
module Gitlab
module Database
module Migrations
- class TestBackgroundRunner
- attr_reader :result_dir
-
+ class TestBackgroundRunner < BaseBackgroundRunner
def initialize(result_dir:)
- @result_dir = result_dir
+ super(result_dir: result_dir)
@job_coordinator = Gitlab::BackgroundMigration.coordinator_for_database(Gitlab::Database::MAIN_DATABASE_NAME)
end
@@ -15,37 +13,12 @@ module Gitlab
@job_coordinator.pending_jobs
end
- def run_jobs(for_duration:)
- jobs_to_run = traditional_background_migrations.group_by { |j| class_name_for_job(j) }
- return if jobs_to_run.empty?
-
- # without .to_f, we do integer division
- # For example, 3.minutes / 2 == 1.minute whereas 3.minutes / 2.to_f == (1.minute + 30.seconds)
- duration_per_migration_type = for_duration / jobs_to_run.count.to_f
- jobs_to_run.each do |migration_name, jobs|
- run_until = duration_per_migration_type.from_now
-
- run_jobs_for_migration(migration_name: migration_name, jobs: jobs, run_until: run_until)
- end
+ def jobs_by_migration_name
+ traditional_background_migrations.group_by { |j| class_name_for_job(j) }
end
private
- def run_jobs_for_migration(migration_name:, jobs:, run_until:)
- per_background_migration_result_dir = File.join(@result_dir, migration_name)
-
- instrumentation = Instrumentation.new(result_dir: per_background_migration_result_dir)
- batch_names = (1..).each.lazy.map { |i| "batch_#{i}"}
-
- jobs.shuffle.each do |j|
- break if run_until <= Time.current
-
- instrumentation.observe(version: nil, name: batch_names.next, connection: ActiveRecord::Migration.connection) do
- run_job(j)
- end
- end
- end
-
def run_job(job)
Gitlab::BackgroundMigration.perform(job.args[0], job.args[1])
end
diff --git a/lib/gitlab/database/migrations/test_batched_background_runner.rb b/lib/gitlab/database/migrations/test_batched_background_runner.rb
new file mode 100644
index 00000000000..0c6a8d3d856
--- /dev/null
+++ b/lib/gitlab/database/migrations/test_batched_background_runner.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module Migrations
+ class TestBatchedBackgroundRunner < BaseBackgroundRunner
+ attr_reader :connection
+
+ def initialize(result_dir:, connection:)
+ super(result_dir: result_dir)
+ @connection = connection
+ end
+
+ 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
+ .to_h do |migration|
+ batching_strategy = migration.batch_class.new(connection: connection)
+
+ all_migration_jobs = []
+
+ min_value = migration.next_min_value
+
+ while (next_bounds = batching_strategy.next_batch(
+ migration.table_name,
+ migration.column_name,
+ batch_min_value: min_value,
+ batch_size: migration.batch_size,
+ job_arguments: migration.job_arguments
+ ))
+
+ batch_min, batch_max = next_bounds
+
+ all_migration_jobs << migration.create_batched_job!(batch_min, batch_max)
+ min_value = batch_max + 1
+ end
+
+ [migration.job_class_name, all_migration_jobs]
+ end
+ end
+
+ def run_job(job)
+ Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper.new(connection: connection).perform(job)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
index 034e18ec9f4..a541ecf5316 100644
--- a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
+++ b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb
@@ -6,7 +6,6 @@ module Gitlab
module TableManagementHelpers
include ::Gitlab::Database::SchemaHelpers
include ::Gitlab::Database::MigrationHelpers
- include ::Gitlab::Database::Migrations::BackgroundMigrationHelpers
ALLOWED_TABLES = %w[audit_events web_hook_logs].freeze
ERROR_SCOPE = 'table partitioning'
diff --git a/lib/gitlab/database/query_analyzer.rb b/lib/gitlab/database/query_analyzer.rb
index 0c78dda734c..6f64d04270f 100644
--- a/lib/gitlab/database/query_analyzer.rb
+++ b/lib/gitlab/database/query_analyzer.rb
@@ -30,52 +30,25 @@ module Gitlab
end
end
- def within(user_analyzers = nil)
- # Due to singleton nature of analyzers
- # only an outer invocation of the `.within`
- # is allowed to initialize them
- if already_within?
- raise 'Query analyzers are already defined, cannot re-define them.' if user_analyzers
-
- return yield
- end
-
- begin!(user_analyzers || all_analyzers)
+ def within(analyzers = all_analyzers)
+ newly_enabled_analyzers = begin!(analyzers)
begin
yield
ensure
- end!
+ end!(newly_enabled_analyzers)
end
end
- def already_within?
- # If analyzers are set they are already configured
- !enabled_analyzers.nil?
- end
+ # Enable query analyzers (only the ones that were not yet enabled)
+ # Returns a list of newly enabled analyzers
+ def begin!(analyzers)
+ analyzers.select do |analyzer|
+ next if enabled_analyzers.include?(analyzer)
- def process_sql(sql, connection)
- analyzers = enabled_analyzers
- return unless analyzers&.any?
-
- parsed = parse(sql, connection)
- return unless parsed
-
- analyzers.each do |analyzer|
- next if analyzer.suppressed? && !analyzer.requires_tracking?(parsed)
-
- analyzer.analyze(parsed)
- rescue StandardError, ::Gitlab::Database::QueryAnalyzers::Base::QueryAnalyzerError => e
- # We catch all standard errors to prevent validation errors to introduce fatal errors in production
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
- end
- end
-
- # Enable query analyzers
- def begin!(analyzers = all_analyzers)
- analyzers = analyzers.select do |analyzer|
if analyzer.enabled?
analyzer.begin!
+ enabled_analyzers.append(analyzer)
true
end
@@ -84,25 +57,40 @@ module Gitlab
false
end
-
- Thread.current[:query_analyzer_enabled_analyzers] = analyzers
end
- # Disable enabled query analyzers
- def end!
- enabled_analyzers.select do |analyzer|
+ # Disable enabled query analyzers (only the ones that were enabled previously)
+ def end!(analyzers)
+ analyzers.each do |analyzer|
+ next unless enabled_analyzers.delete(analyzer)
+
analyzer.end!
rescue StandardError, ::Gitlab::Database::QueryAnalyzers::Base::QueryAnalyzerError => e
Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
end
-
- Thread.current[:query_analyzer_enabled_analyzers] = nil
end
private
def enabled_analyzers
- Thread.current[:query_analyzer_enabled_analyzers]
+ Thread.current[:query_analyzer_enabled_analyzers] ||= []
+ end
+
+ def process_sql(sql, connection)
+ analyzers = enabled_analyzers
+ return unless analyzers&.any?
+
+ parsed = parse(sql, connection)
+ return unless parsed
+
+ analyzers.each do |analyzer|
+ next if analyzer.suppressed? && !analyzer.requires_tracking?(parsed)
+
+ analyzer.analyze(parsed)
+ rescue StandardError, ::Gitlab::Database::QueryAnalyzers::Base::QueryAnalyzerError => e
+ # We catch all standard errors to prevent validation errors to introduce fatal errors in production
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ end
end
def parse(sql, connection)
diff --git a/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb b/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb
new file mode 100644
index 00000000000..3de9e8011fb
--- /dev/null
+++ b/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Database
+ module QueryAnalyzers
+ # The purpose of this analyzer is to validate if tables observed
+ # are properly used according to schema used by current connection
+ class GitlabSchemasValidateConnection < Base
+ CrossSchemaAccessError = Class.new(QueryAnalyzerError)
+
+ class << self
+ def enabled?
+ true
+ end
+
+ def analyze(parsed)
+ tables = parsed.pg.select_tables + parsed.pg.dml_tables
+ table_schemas = ::Gitlab::Database::GitlabSchema.table_schemas(tables)
+ return if table_schemas.empty?
+
+ allowed_schemas = ::Gitlab::Database.gitlab_schemas_for_connection(parsed.connection)
+ return unless allowed_schemas
+
+ invalid_schemas = table_schemas - allowed_schemas
+ if invalid_schemas.any?
+ message = "The query tried to access #{tables} (of #{table_schemas.to_a}) "
+ message += "which is outside of allowed schemas (#{allowed_schemas}) "
+ message += "for the current connection '#{Gitlab::Database.db_config_name(parsed.connection)}'"
+
+ raise CrossSchemaAccessError, message
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb b/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
index a53da514df2..e0cb803b872 100644
--- a/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
+++ b/lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb
@@ -33,7 +33,7 @@ module Gitlab
def self.enabled?
::Feature::FlipperFeature.table_exists? &&
- Feature.enabled?(:detect_cross_database_modification, default_enabled: :yaml)
+ Feature.enabled?(:detect_cross_database_modification)
end
def self.requires_tracking?(parsed)
diff --git a/lib/gitlab/database/reindexing.rb b/lib/gitlab/database/reindexing.rb
index 91c3fcc7d72..e13dd3b2058 100644
--- a/lib/gitlab/database/reindexing.rb
+++ b/lib/gitlab/database/reindexing.rb
@@ -16,7 +16,7 @@ module Gitlab
REMOVE_INDEX_RETRY_CONFIG = [[1.minute, 9.minutes]] * 30
def self.enabled?
- Feature.enabled?(:database_reindexing, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:database_reindexing, type: :ops)
end
def self.invoke(database = nil)
diff --git a/lib/gitlab/database/shared_model.rb b/lib/gitlab/database/shared_model.rb
index 563fab692ef..f4c8fca8fa2 100644
--- a/lib/gitlab/database/shared_model.rb
+++ b/lib/gitlab/database/shared_model.rb
@@ -15,14 +15,16 @@ module Gitlab
previous_connection = self.overriding_connection
unless previous_connection.nil? || previous_connection.equal?(connection)
- raise 'cannot nest connection overrides for shared models with different connections'
+ raise "Cannot change connection for Gitlab::Database::SharedModel "\
+ "from '#{Gitlab::Database.db_config_name(previous_connection)}' "\
+ "to '#{Gitlab::Database.db_config_name(connection)}'"
end
self.overriding_connection = connection
yield
ensure
- self.overriding_connection = nil unless previous_connection.equal?(self.overriding_connection)
+ self.overriding_connection = previous_connection
end
def connection
diff --git a/lib/gitlab/database_importers/work_items/base_type_importer.rb b/lib/gitlab/database_importers/work_items/base_type_importer.rb
index 2d9700cb2bc..1e29ae7761b 100644
--- a/lib/gitlab/database_importers/work_items/base_type_importer.rb
+++ b/lib/gitlab/database_importers/work_items/base_type_importer.rb
@@ -4,10 +4,18 @@ module Gitlab
module DatabaseImporters
module WorkItems
module BaseTypeImporter
- def self.import
- ::WorkItems::Type::BASE_TYPES.each do |type, attributes|
- ::WorkItems::Type.create!(base_type: type, **attributes.slice(:name, :icon_name))
+ def self.upsert_types
+ current_time = Time.current
+
+ base_types = ::WorkItems::Type::BASE_TYPES.map do |type, attributes|
+ attributes.slice(:name, :icon_name)
+ .merge(created_at: current_time, updated_at: current_time, base_type: type)
end
+
+ ::WorkItems::Type.upsert_all(
+ base_types,
+ unique_by: :idx_work_item_types_on_namespace_id_and_name_null_namespace
+ )
end
end
end
diff --git a/lib/gitlab/default_branch.rb b/lib/gitlab/default_branch.rb
index 6bd9a5675c4..bb540b93a58 100644
--- a/lib/gitlab/default_branch.rb
+++ b/lib/gitlab/default_branch.rb
@@ -4,7 +4,7 @@
module Gitlab
module DefaultBranch
def self.value(object: nil)
- Feature.enabled?(:main_branch_over_master, object, default_enabled: :yaml) ? 'main' : 'master'
+ Feature.enabled?(:main_branch_over_master, object) ? 'main' : 'master'
end
end
end
diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb
index 61bb0c797b4..d6ee21b93b6 100644
--- a/lib/gitlab/diff/file.rb
+++ b/lib/gitlab/diff/file.rb
@@ -50,11 +50,11 @@ module Gitlab
end
def use_semantic_ipynb_diff?
- strong_memoize(:_use_semantic_ipynb_diff) { Feature.enabled?(:ipynb_semantic_diff, repository.project, default_enabled: :yaml) }
+ strong_memoize(:_use_semantic_ipynb_diff) { Feature.enabled?(:ipynb_semantic_diff, repository.project) }
end
def use_renderable_diff?
- strong_memoize(:_renderable_diff_enabled) { Feature.enabled?(:rendered_diffs_viewer, repository.project, default_enabled: :yaml) }
+ strong_memoize(:_renderable_diff_enabled) { Feature.enabled?(:rendered_diffs_viewer, repository.project) }
end
def has_renderable?
@@ -386,6 +386,10 @@ module Gitlab
strong_memoize(:rendered) { Rendered::Notebook::DiffFile.new(self) }
end
+ def ipynb?
+ file_path.ends_with?('.ipynb')
+ end
+
private
def diffable_by_attribute?
@@ -415,10 +419,6 @@ module Gitlab
new_file? || deleted_file? || content_changed?
end
- def ipynb?
- file_path.ends_with?('.ipynb')
- end
-
# We can't use Object#try because Blob doesn't inherit from Object, but
# from BasicObject (via SimpleDelegator).
def try_blobs(meth)
diff --git a/lib/gitlab/diff/highlight.rb b/lib/gitlab/diff/highlight.rb
index 47f3324752d..225b4f7cf86 100644
--- a/lib/gitlab/diff/highlight.rb
+++ b/lib/gitlab/diff/highlight.rb
@@ -24,7 +24,7 @@ module Gitlab
end
def highlight
- populate_marker_ranges if Feature.enabled?(:use_marker_ranges, project, default_enabled: :yaml)
+ populate_marker_ranges if Feature.enabled?(:use_marker_ranges, project)
@diff_lines.map.with_index do |diff_line, index|
diff_line = diff_line.dup
@@ -61,7 +61,7 @@ module Gitlab
end
def apply_marker_ranges_highlight(diff_line, rich_line, index)
- marker_ranges = if Feature.enabled?(:use_marker_ranges, project, default_enabled: :yaml)
+ marker_ranges = if Feature.enabled?(:use_marker_ranges, project)
diff_line.marker_ranges
else
inline_diffs[index]
@@ -83,7 +83,7 @@ module Gitlab
return unless diff_file && diff_file.diff_refs
return diff_line_highlighting(diff_line, plain: true) if blobs_too_large?
- if Feature.enabled?(:diff_line_syntax_highlighting, project, default_enabled: :yaml)
+ if Feature.enabled?(:diff_line_syntax_highlighting, project)
diff_line_highlighting(diff_line)
else
blob_highlighting(diff_line)
diff --git a/lib/gitlab/diff/highlight_cache.rb b/lib/gitlab/diff/highlight_cache.rb
index 12ed11b0140..f950d01fdf0 100644
--- a/lib/gitlab/diff/highlight_cache.rb
+++ b/lib/gitlab/diff/highlight_cache.rb
@@ -74,8 +74,8 @@ module Gitlab
diffable.cache_key,
VERSION,
diff_options,
- Feature.enabled?(:use_marker_ranges, diffable.project, default_enabled: :yaml),
- Feature.enabled?(:diff_line_syntax_highlighting, diffable.project, default_enabled: :yaml)
+ Feature.enabled?(:use_marker_ranges, diffable.project),
+ Feature.enabled?(:diff_line_syntax_highlighting, diffable.project)
].join(":")
end
end
diff --git a/lib/gitlab/diff/rendered/notebook/diff_file.rb b/lib/gitlab/diff/rendered/notebook/diff_file.rb
index cf97569ca31..1f064d8af50 100644
--- a/lib/gitlab/diff/rendered/notebook/diff_file.rb
+++ b/lib/gitlab/diff/rendered/notebook/diff_file.rb
@@ -13,6 +13,7 @@ module Gitlab
LOG_IPYNBDIFF_GENERATED = 'IPYNB_DIFF_GENERATED'
LOG_IPYNBDIFF_TIMEOUT = 'IPYNB_DIFF_TIMEOUT'
LOG_IPYNBDIFF_INVALID = 'IPYNB_DIFF_INVALID'
+ LOG_IPYNBDIFF_TRUNCATED = 'IPYNB_DIFF_TRUNCATED'
attr_reader :source_diff
@@ -60,9 +61,16 @@ module Gitlab
def notebook_diff
strong_memoize(:notebook_diff) do
+ if source_diff.old_blob&.truncated? || source_diff.new_blob&.truncated?
+ log_event(LOG_IPYNBDIFF_TRUNCATED)
+ next
+ end
+
Timeout.timeout(timeout_time) do
IpynbDiff.diff(source_diff.old_blob&.data, source_diff.new_blob&.data,
- raise_if_invalid_nb: true, diffy_opts: { include_diff_info: true })&.tap do
+ raise_if_invalid_nb: true,
+ hide_images: true,
+ diffy_opts: { include_diff_info: true })&.tap do
log_event(LOG_IPYNBDIFF_GENERATED)
end
end
@@ -141,7 +149,7 @@ module Gitlab
def log_event(message, error = nil)
Gitlab::AppLogger.info({ message: message })
- Gitlab::ErrorTracking.track_exception(error) if error
+ Gitlab::ErrorTracking.log_exception(error) if error
nil
end
end
diff --git a/lib/gitlab/doctor/secrets.rb b/lib/gitlab/doctor/secrets.rb
index 44f5c97c70c..cd075569d10 100644
--- a/lib/gitlab/doctor/secrets.rb
+++ b/lib/gitlab/doctor/secrets.rb
@@ -30,14 +30,35 @@ module Gitlab
private
+ # Skipping initializers may be needed if those attempt to access
+ # encrypted data on initialization and could fail because of it.
+ #
+ # format example:
+ # {
+ # model_class => {
+ # [
+ # { action: :create, filters: [:before, :filter_name1] },
+ # { action: :update, filters: [:after, :filter_name2] }
+ # ]
+ # }
+ # }
+ MODEL_INITIALIZERS_TO_SKIP = {
+ Integration => [
+ { action: :initialize, filters: [:after, :initialize_properties] }
+ ]
+ }.freeze
+
def check_model_attributes(models_with_attributes)
running_failures = 0
models_with_attributes.each do |model, attributes|
failures_per_row = Hash.new { |h, k| h[k] = [] }
- model.find_each do |data|
- attributes.each do |att|
- failures_per_row[data.id] << att unless valid_attribute?(data, att)
+
+ with_skipped_callbacks_for(model) do
+ model.find_each do |data|
+ attributes.each do |att|
+ failures_per_row[data.id] << att unless valid_attribute?(data, att)
+ end
end
end
@@ -82,6 +103,32 @@ module Gitlab
false
end
+
+ # WARNING: using this logic in other places than a Rake task will need a
+ # different approach, as simply setting the callback again is not thread-safe
+ def with_skipped_callbacks_for(model)
+ raise StandardError, 'can only be used in a Rake environment' unless Gitlab::Runtime.rake?
+
+ skip_callbacks_for_model(model)
+
+ yield
+
+ skip_callbacks_for_model(model, reset: true)
+ end
+
+ def skip_callbacks_for_model(model, reset: false)
+ MODEL_INITIALIZERS_TO_SKIP.each do |klass, initializers|
+ next unless model <= klass
+
+ initializers.each do |initializer|
+ if reset
+ model.set_callback(initializer[:action], *initializer[:filters])
+ else
+ model.skip_callback(initializer[:action], *initializer[:filters])
+ end
+ end
+ end
+ end
end
end
end
diff --git a/lib/gitlab/email/message/build_ios_app_guide.rb b/lib/gitlab/email/message/build_ios_app_guide.rb
new file mode 100644
index 00000000000..4acf558a6a2
--- /dev/null
+++ b/lib/gitlab/email/message/build_ios_app_guide.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Email
+ module Message
+ class BuildIosAppGuide
+ include Gitlab::Email::Message::InProductMarketing::Helper
+ include Gitlab::Routing
+
+ attr_accessor :format
+
+ def initialize(format: :html)
+ @format = format
+ end
+
+ def subject_line
+ s_('InProductMarketing|Get set up to build for iOS')
+ end
+
+ def title
+ s_("InProductMarketing|Building for iOS? We've got you covered.")
+ end
+
+ def body_line1
+ s_(
+ '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.'
+ )
+ end
+
+ def cta_text
+ s_('InProductMarketing|Learn how to build for iOS')
+ end
+
+ def cta_link
+ action_link(cta_text, 'https://about.gitlab.com/blog/2019/03/06/ios-publishing-with-gitlab-and-fastlane/')
+ end
+
+ def cta2_text
+ s_('InProductMarketing|Watch iOS building in action.')
+ end
+
+ def cta2_link
+ action_link(cta2_text, 'https://www.youtube.com/watch?v=325FyJt7ZG8')
+ end
+
+ def logo_path
+ 'mailers/in_product_marketing/create-0.png'
+ end
+
+ def unsubscribe
+ unsubscribe_message
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/email/message/in_product_marketing/base.rb b/lib/gitlab/email/message/in_product_marketing/base.rb
index 9b50d86de58..bd20b7e5fc7 100644
--- a/lib/gitlab/email/message/in_product_marketing/base.rb
+++ b/lib/gitlab/email/message/in_product_marketing/base.rb
@@ -70,14 +70,8 @@ module Gitlab
end
def unsubscribe
- parts = Gitlab.com? ? unsubscribe_com : unsubscribe_self_managed(track, series)
-
- case format
- when :html
- parts.join(' ')
- else
- parts.join("\n" + ' ' * 16)
- end
+ self_managed_preferences_link = marketing_preference_link(track, series)
+ unsubscribe_message(self_managed_preferences_link)
end
def progress(current: series + 1, total: total_series, track_name: track.to_s.humanize)
@@ -110,26 +104,6 @@ module Gitlab
Namespaces::InProductMarketingEmailsService::TRACKS[track][:interval_days].size
end
- def unsubscribe_com
- [
- s_('InProductMarketing|If you no longer wish to receive marketing emails from us,'),
- s_('InProductMarketing|you may %{unsubscribe_link} at any time.') % { unsubscribe_link: unsubscribe_link }
- ]
- end
-
- def unsubscribe_self_managed(track, series)
- [
- s_('InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}.') % { unsubscribe_link: unsubscribe_link },
- s_("InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}.") % { marketing_preference_link: marketing_preference_link(track, series) }
- ]
- end
-
- def unsubscribe_link
- unsubscribe_url = Gitlab.com? ? '%tag_unsubscribe_url%' : profile_notifications_url
-
- link(s_('InProductMarketing|unsubscribe'), unsubscribe_url)
- end
-
def marketing_preference_link(track, series)
params = {
utm_source: 'SM',
diff --git a/lib/gitlab/email/message/in_product_marketing/helper.rb b/lib/gitlab/email/message/in_product_marketing/helper.rb
index 329cace9e9d..0a0e55c2999 100644
--- a/lib/gitlab/email/message/in_product_marketing/helper.rb
+++ b/lib/gitlab/email/message/in_product_marketing/helper.rb
@@ -31,8 +31,39 @@ module Gitlab
s_('InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA').html_safe % strong_options
end
+ def unsubscribe_message(self_managed_preferences_link = nil)
+ parts = Gitlab.com? ? unsubscribe_com : unsubscribe_self_managed(self_managed_preferences_link)
+
+ case format
+ when :html
+ parts.join(' ')
+ else
+ parts.join("\n" + ' ' * 16)
+ end
+ end
+
private
+ def unsubscribe_link
+ unsubscribe_url = Gitlab.com? ? '%tag_unsubscribe_url%' : profile_notifications_url
+
+ link(s_('InProductMarketing|unsubscribe'), unsubscribe_url)
+ end
+
+ def unsubscribe_com
+ [
+ s_('InProductMarketing|If you no longer wish to receive marketing emails from us,'),
+ s_('InProductMarketing|you may %{unsubscribe_link} at any time.') % { unsubscribe_link: unsubscribe_link }
+ ]
+ end
+
+ def unsubscribe_self_managed(preferences_link)
+ [
+ s_('InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}.') % { unsubscribe_link: unsubscribe_link },
+ s_("InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}.") % { marketing_preference_link: preferences_link }
+ ]
+ end
+
def list(array)
case format
when :html
diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb
index 58e7b2f1b44..4da112bc5a0 100644
--- a/lib/gitlab/email/receiver.rb
+++ b/lib/gitlab/email/receiver.rb
@@ -148,7 +148,7 @@ module Gitlab
end
def find_first_key_from_received_headers
- return unless ::Feature.enabled?(:use_received_header_for_incoming_emails, default_enabled: :yaml)
+ return unless ::Feature.enabled?(:use_received_header_for_incoming_emails)
recipients_from_received_headers.find do |email|
key = email_class.key_from_address(email)
diff --git a/lib/gitlab/encrypted_ldap_command.rb b/lib/gitlab/encrypted_ldap_command.rb
index 3675646185e..5e1eabe7ec6 100644
--- a/lib/gitlab/encrypted_ldap_command.rb
+++ b/lib/gitlab/encrypted_ldap_command.rb
@@ -15,7 +15,7 @@ module Gitlab
<<~YAML
# main:
# password: '123'
- # user_dn: 'gitlab-adm'
+ # bind_dn: 'gitlab-adm'
YAML
end
end
diff --git a/lib/gitlab/error_tracking.rb b/lib/gitlab/error_tracking.rb
index d71f9b5e7cf..f9959d5677b 100644
--- a/lib/gitlab/error_tracking.rb
+++ b/lib/gitlab/error_tracking.rb
@@ -116,13 +116,13 @@ module Gitlab
private
def before_send_raven(event, hint)
- return unless Feature.enabled?(:enable_old_sentry_integration, default_enabled: :yaml)
+ return unless Feature.enabled?(:enable_old_sentry_integration)
before_send(event, hint)
end
def before_send_sentry(event, hint)
- return unless Feature.enabled?(:enable_new_sentry_integration, default_enabled: :yaml)
+ return unless Feature.enabled?(:enable_new_sentry_integration)
before_send(event, hint)
end
diff --git a/lib/gitlab/error_tracking/error_repository.rb b/lib/gitlab/error_tracking/error_repository.rb
new file mode 100644
index 00000000000..4ec636703d9
--- /dev/null
+++ b/lib/gitlab/error_tracking/error_repository.rb
@@ -0,0 +1,113 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ # Data access layer for errors and events related to Error Tracking feature.
+ class ErrorRepository
+ Pagination = Struct.new(:next, :prev)
+
+ # Generic database error
+ DatabaseError = Class.new(StandardError)
+ # Record was invalid
+ RecordInvalidError = Class.new(DatabaseError)
+
+ # Builds an instance of error repository backed by a strategy.
+ #
+ # @return [self]
+ def self.build(project)
+ strategy = ActiveRecordStrategy.new(project)
+
+ new(strategy)
+ end
+
+ # @private
+ def initialize(strategy)
+ @strategy = strategy
+ end
+
+ # Stores an error and the related error event.
+ #
+ # @param name [String] name of the error
+ # @param description [String] description of the error
+ # @param actor [String] culprit (class/method/function) which triggered this error
+ # @param platform [String] platform on which the error occurred
+ # @param environment [String] environment on which the error occurred
+ # @param level [String] severity of this error
+ # @param occurred_at [Time] timestamp when the error occurred
+ # @param payload [Hash] original error payload
+ #
+ # @return [void] nothing
+ #
+ # @raise [RecordInvalidError] if passed attributes were invalid to store an error or error event
+ # @raise [DatabaseError] if generic error occurred
+ def report_error(
+ name:, description:, actor:, platform:,
+ environment:, level:, occurred_at: Time.zone.now, payload: {}
+ )
+ strategy.report_error(
+ name: name,
+ description: description,
+ actor: actor,
+ platform: platform,
+ environment: environment,
+ level: level,
+ occurred_at: occurred_at,
+ payload: payload
+ )
+
+ nil
+ end
+
+ # Finds an error by +id+.
+ #
+ # @param id [Integer, String] unique error identifier
+ #
+ # @return [Gitlab::ErrorTracking::DetailedError] a detail error
+ def find_error(id)
+ strategy.find_error(id)
+ end
+
+ # Lists errors.
+ #
+ # @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
+ # @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: {})
+ limit = [limit.to_i, 100].min
+
+ strategy.list_errors(filters: filters, sort: sort, limit: limit, cursor: cursor)
+ end
+
+ # Fetches last event for error +id+.
+ #
+ # @param id [Integer, String] unique error identifier
+ #
+ # @return [Gitlab::ErrorTracking::ErrorEvent]
+ #
+ # @raise [DatabaseError] if generic error occurred
+ def last_event_for(id)
+ strategy.last_event_for(id)
+ end
+
+ # Updates attributes of an error.
+ #
+ # @param id [Integer, String] unique error identifier
+ # @param status [String] error status
+ #
+ # @return [true, false] if update was successful
+ #
+ # @raise [DatabaseError] if generic error occurred
+ def update_error(id, status:)
+ strategy.update_error(id, status: status)
+ end
+
+ private
+
+ attr_reader :strategy
+ end
+ end
+end
diff --git a/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb b/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
new file mode 100644
index 00000000000..e5b532ee0f0
--- /dev/null
+++ b/lib/gitlab/error_tracking/error_repository/active_record_strategy.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ class ErrorRepository
+ class ActiveRecordStrategy
+ def initialize(project)
+ @project = project
+ end
+
+ def report_error(
+ name:, description:, actor:, platform:,
+ environment:, level:, occurred_at:, payload:
+ )
+ error = project_errors.report_error(
+ name: name, # Example: ActionView::MissingTemplate
+ description: description, # Example: Missing template posts/show in...
+ actor: actor, # Example: PostsController#show
+ platform: platform, # Example: ruby
+ timestamp: occurred_at
+ )
+
+ # The payload field contains all the data on error including stacktrace in jsonb.
+ # Together with occurred_at these are 2 main attributes that we need to save here.
+ error.events.create!(
+ environment: environment,
+ description: description,
+ level: level,
+ occurred_at: occurred_at,
+ payload: payload
+ )
+ rescue ActiveRecord::ActiveRecordError => e
+ handle_exceptions(e)
+ end
+
+ def find_error(id)
+ project_error(id).to_sentry_detailed_error
+ rescue ActiveRecord::ActiveRecordError => e
+ handle_exceptions(e)
+ end
+
+ def list_errors(filters:, 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)
+
+ pagination = ErrorRepository::Pagination.new(errors.cursor_for_next_page, errors.cursor_for_previous_page)
+
+ [errors.map(&:to_sentry_error), pagination]
+ end
+
+ def last_event_for(id)
+ project_error(id).last_event&.to_sentry_error_event
+ rescue ActiveRecord::ActiveRecordError => e
+ handle_exceptions(e)
+ end
+
+ def update_error(id, **attributes)
+ project_error(id).update(attributes)
+ end
+
+ private
+
+ attr_reader :project
+
+ def project_errors
+ ::ErrorTracking::Error.where(project: project) # rubocop:disable CodeReuse/ActiveRecord
+ end
+
+ def project_error(id)
+ project_errors.find(id)
+ end
+
+ def filter_by_status(errors, status)
+ return errors unless ::ErrorTracking::Error.statuses.key?(status)
+
+ errors.for_status(status)
+ end
+
+ def sort(errors, sort)
+ return errors.order_id_desc unless sort
+
+ errors.sort_by_attribute(sort)
+ end
+
+ def handle_exceptions(exception)
+ case exception
+ when ActiveRecord::RecordInvalid
+ raise RecordInvalidError, exception.message
+ else
+ raise DatabaseError, exception.message
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/experiment/rollout/feature.rb b/lib/gitlab/experiment/rollout/feature.rb
index 4bef92f5c23..bf31dfe08a0 100644
--- a/lib/gitlab/experiment/rollout/feature.rb
+++ b/lib/gitlab/experiment/rollout/feature.rb
@@ -14,7 +14,7 @@ module Gitlab
def enabled?
return false unless feature_flag_defined?
return false unless Gitlab.com?
- return false unless ::Feature.enabled?(:gitlab_experiment, type: :ops, default_enabled: :yaml)
+ return false unless ::Feature.enabled?(:gitlab_experiment, type: :ops)
feature_flag_instance.state != :off
end
@@ -29,7 +29,7 @@ module Gitlab
# which will assign the control. Otherwise we call super, which will
# assign a variant evenly, or based on our provided distribution rules.
def execute_assignment
- super if ::Feature.enabled?(feature_flag_name, self, type: :experiment, default_enabled: :yaml)
+ super if ::Feature.enabled?(feature_flag_name, self, type: :experiment)
end
# This is what's provided to the `Feature.enabled?` call that will be
diff --git a/lib/gitlab/experimentation/controller_concern.rb b/lib/gitlab/experimentation/controller_concern.rb
index a68e2db4dac..b09d67b8d5f 100644
--- a/lib/gitlab/experimentation/controller_concern.rb
+++ b/lib/gitlab/experimentation/controller_concern.rb
@@ -146,9 +146,9 @@ module Gitlab
return experimentation_subject_id if subject.blank?
if subject.respond_to?(:to_global_id)
- Digest::MD5.hexdigest(subject.to_global_id.to_s)
+ Digest::SHA256.hexdigest(subject.to_global_id.to_s)
else
- Digest::MD5.hexdigest(subject.to_s)
+ Digest::SHA256.hexdigest(subject.to_s)
end
end
end
diff --git a/lib/gitlab/experimentation/experiment.rb b/lib/gitlab/experimentation/experiment.rb
index b13f55e7969..0c7091d19e3 100644
--- a/lib/gitlab/experimentation/experiment.rb
+++ b/lib/gitlab/experimentation/experiment.rb
@@ -16,7 +16,7 @@ module Gitlab
def active?
# TODO: just touch a feature flag
# Temporary change, we will change `experiment_percentage` in future to `Feature.enabled?
- Feature.enabled?(feature_flag_name, type: :experiment, default_enabled: :yaml)
+ Feature.enabled?(feature_flag_name, type: :experiment)
::Gitlab.com? && experiment_percentage > 0
end
diff --git a/lib/gitlab/git/branch.rb b/lib/gitlab/git/branch.rb
index fbe52db9c0b..9637f8756b1 100644
--- a/lib/gitlab/git/branch.rb
+++ b/lib/gitlab/git/branch.rb
@@ -13,10 +13,6 @@ module Gitlab
end
end
- def initialize(repository, name, target, target_commit)
- super(repository, name, target, target_commit)
- end
-
def active?
self.dereferenced_target.committed_date >= STALE_BRANCH_THRESHOLD.ago
end
diff --git a/lib/gitlab/git/diff.rb b/lib/gitlab/git/diff.rb
index a66517b4ca0..c473fe6973d 100644
--- a/lib/gitlab/git/diff.rb
+++ b/lib/gitlab/git/diff.rb
@@ -230,12 +230,16 @@ module Gitlab
private
def encode_diff_to_utf8(replace_invalid_utf8_chars)
- return unless Feature.enabled?(:convert_diff_to_utf8_with_replacement_symbol, default_enabled: :yaml)
- return unless replace_invalid_utf8_chars && !detect_binary?(@diff)
+ return unless Feature.enabled?(:convert_diff_to_utf8_with_replacement_symbol)
+ return unless replace_invalid_utf8_chars && diff_should_be_converted?
@diff = Gitlab::EncodingHelper.encode_utf8_with_replacement_character(@diff)
end
+ def diff_should_be_converted?
+ !detect_binary?(@diff) || !@diff&.valid_encoding?
+ end
+
def init_from_hash(hash)
raw_diff = hash.symbolize_keys
diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb
index f98fb66ad21..cba63b3c6c7 100644
--- a/lib/gitlab/git_access.rb
+++ b/lib/gitlab/git_access.rb
@@ -177,8 +177,10 @@ module Gitlab
def check_valid_actor!
return unless key?
- unless actor.valid?
+ if !actor.valid?
raise ForbiddenError, "Your SSH key #{actor.errors[:key].first}."
+ elsif actor.expired?
+ raise ForbiddenError, "Your SSH key has expired."
end
end
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index 4fe5c8df36f..5e1f92ae835 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -276,7 +276,36 @@ module Gitlab
)
response = GitalyClient.call(@repository.storage, :commit_service, :list_all_commits, request, timeout: GitalyClient.medium_timeout)
- consume_commits_response(response)
+
+ quarantined_commits = consume_commits_response(response)
+
+ if Feature.enabled?(:filter_quarantined_commits)
+ quarantined_commit_ids = quarantined_commits.map(&:id)
+
+ # While in general the quarantine directory would only contain objects
+ # which are actually new, this is not guaranteed by Git. In fact,
+ # git-push(1) may sometimes push objects which already exist in the
+ # target repository. We do not want to return those from this method
+ # though given that they're not actually new.
+ #
+ # To fix this edge-case we thus have to filter commits down to those
+ # which don't yet exist. To do so, we must check for object existence
+ # in the main repository, but the object directory of our repository
+ # points into the object quarantine. This can be fixed by unsetting
+ # it, which will cause us to use the normal repository as indicated by
+ # its relative path again.
+ main_repo = @gitaly_repo.dup
+ main_repo.git_object_directory = ""
+
+ # Check object existence of all quarantined commits' IDs.
+ quarantined_commit_existence = object_existence_map(quarantined_commit_ids, gitaly_repo: main_repo)
+
+ # And then we reject all quarantined commits which exist in the main
+ # repository already.
+ quarantined_commits.reject! { |c| quarantined_commit_existence[c.id] }
+ end
+
+ quarantined_commits
else
list_commits(Array.wrap(revisions) + %w[--not --all])
end
@@ -387,6 +416,35 @@ module Gitlab
consume_commits_response(response)
end
+ # Check whether the given revisions exist. Returns a hash mapping the revision name to either `true` if the
+ # revision exists, or `false` otherwise. This function accepts all revisions as specified by
+ # gitrevisions(1).
+ def object_existence_map(revisions, gitaly_repo: @gitaly_repo)
+ enum = Enumerator.new do |y|
+ # This is a bug in Gitaly: revisions of the initial request are ignored. This will be fixed in v15.0 via
+ # https://gitlab.com/gitlab-org/gitaly/-/merge_requests/4510, so we can merge initial request and the initial
+ # set of revisions starting with v15.1.
+ y.yield Gitaly::CheckObjectsExistRequest.new(repository: gitaly_repo)
+
+ revisions.each_slice(100) do |revisions_subset|
+ y.yield Gitaly::CheckObjectsExistRequest.new(revisions: revisions_subset)
+ end
+ end
+
+ response = GitalyClient.call(
+ @repository.storage, :commit_service, :check_objects_exist, enum, timeout: GitalyClient.medium_timeout
+ )
+
+ existence_by_revision = {}
+ response.each do |message|
+ message.revisions.each do |revision|
+ existence_by_revision[revision.name] = revision.exists
+ end
+ end
+
+ existence_by_revision
+ end
+
def filter_shas_with_signatures(shas)
request = Gitaly::FilterShasWithSignaturesRequest.new(repository: @gitaly_repo)
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 1e199a55b5a..5adb8d946a0 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -48,7 +48,7 @@ module Gitlab
def repository_size
request = Gitaly::RepositorySizeRequest.new(repository: @gitaly_repo)
- response = GitalyClient.call(@storage, :repository_service, :repository_size, request, timeout: GitalyClient.medium_timeout)
+ response = GitalyClient.call(@storage, :repository_service, :repository_size, request, timeout: GitalyClient.long_timeout)
response.size
end
diff --git a/lib/gitlab/github_import.rb b/lib/gitlab/github_import.rb
index 7ac0d875512..9556a9e98ba 100644
--- a/lib/gitlab/github_import.rb
+++ b/lib/gitlab/github_import.rb
@@ -36,7 +36,7 @@ module Gitlab
end
def self.per_page(project)
- if project.group.present? && Feature.enabled?(:github_importer_lower_per_page_limit, project.group, type: :ops, default_enabled: :yaml)
+ if project.group.present? && Feature.enabled?(:github_importer_lower_per_page_limit, project.group, type: :ops)
Gitlab::GithubImport::Client::LOWER_PER_PAGE
else
Gitlab::GithubImport::Client::DEFAULT_PER_PAGE
diff --git a/lib/gitlab/github_import/issuable_finder.rb b/lib/gitlab/github_import/issuable_finder.rb
index 5298a3d81ea..da205ebd345 100644
--- a/lib/gitlab/github_import/issuable_finder.rb
+++ b/lib/gitlab/github_import/issuable_finder.rb
@@ -78,7 +78,7 @@ module Gitlab
end
def timeout
- if project.group.present? && ::Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops, default_enabled: :yaml)
+ if project.group.present? && ::Feature.enabled?(:github_importer_single_endpoint_notes_import, project.group, type: :ops)
Gitlab::Cache::Import::Caching::LONGER_TIMEOUT
else
Gitlab::Cache::Import::Caching::TIMEOUT
diff --git a/lib/gitlab/github_import/parallel_scheduling.rb b/lib/gitlab/github_import/parallel_scheduling.rb
index 97de2a49e72..ab20b372d53 100644
--- a/lib/gitlab/github_import/parallel_scheduling.rb
+++ b/lib/gitlab/github_import/parallel_scheduling.rb
@@ -207,13 +207,8 @@ module Gitlab
end
# Default batch settings for parallel import (can be redefined in Importer classes)
- # Example: { size: 100, delay: 1.minute }
def parallel_import_batch
- if Feature.enabled?(:distribute_github_parallel_import, default_enabled: :yaml)
- { size: 1000, delay: 1.minute }
- else
- {}
- end
+ { size: 1000, delay: 1.minute }
end
def abort_on_failure
diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb
index 3c85d56874f..98570c02e3d 100644
--- a/lib/gitlab/gon_helper.rb
+++ b/lib/gitlab/gon_helper.rb
@@ -51,15 +51,14 @@ module Gitlab
# Initialize gon.features with any flags that should be
# made globally available to the frontend
- push_frontend_feature_flag(:usage_data_api, type: :ops, default_enabled: :yaml)
- push_frontend_feature_flag(:security_auto_fix, default_enabled: false)
- push_frontend_feature_flag(:new_header_search, default_enabled: :yaml)
- push_frontend_feature_flag(:bootstrap_confirmation_modals, default_enabled: :yaml)
- push_frontend_feature_flag(:sandboxed_mermaid, default_enabled: :yaml)
- push_frontend_feature_flag(:source_editor_toolbar, default_enabled: :yaml)
- push_frontend_feature_flag(:gl_avatar_for_all_user_avatars, default_enabled: :yaml)
- push_frontend_feature_flag(:mr_attention_requests, default_enabled: :yaml)
- push_frontend_feature_flag(:markdown_continue_lists, default_enabled: :yaml)
+ push_frontend_feature_flag(:usage_data_api, type: :ops)
+ push_frontend_feature_flag(:security_auto_fix)
+ push_frontend_feature_flag(:new_header_search)
+ push_frontend_feature_flag(:bootstrap_confirmation_modals)
+ push_frontend_feature_flag(:sandboxed_mermaid)
+ push_frontend_feature_flag(:source_editor_toolbar)
+ push_frontend_feature_flag(:gl_avatar_for_all_user_avatars)
+ push_frontend_feature_flag(:mr_attention_requests, current_user)
end
# Exposes the state of a feature flag to the frontend code.
diff --git a/lib/gitlab/graphql/find_argument_in_parent.rb b/lib/gitlab/graphql/find_argument_in_parent.rb
deleted file mode 100644
index 1f83f8fce7a..00000000000
--- a/lib/gitlab/graphql/find_argument_in_parent.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Graphql
- module FindArgumentInParent
- # Searches up the GraphQL AST and returns the first matching argument
- # passed to a node
- def self.find(parent, argument, limit_depth: nil)
- argument = argument.to_s.camelize(:lower).to_sym
- depth = 0
-
- while parent.respond_to?(:parent)
- args = node_args(parent)
- return args[argument] if args.key?(argument)
-
- depth += 1
- return if limit_depth && depth >= limit_depth
-
- parent = parent.parent
- end
- end
-
- class << self
- private
-
- def node_args(node)
- node.irep_node.arguments
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/graphql/global_id_compatibility.rb b/lib/gitlab/graphql/global_id_compatibility.rb
deleted file mode 100644
index a96e4c4b976..00000000000
--- a/lib/gitlab/graphql/global_id_compatibility.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Graphql
- module GlobalIDCompatibility
- # TODO: remove this module once the compatibility layer is no longer needed.
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
- def coerce_global_id_arguments!(args)
- global_id_arguments = self.class.arguments.values.select do |arg|
- arg.type.is_a?(Class) && arg.type <= ::Types::GlobalIDType
- end
-
- global_id_arguments.each do |arg|
- k = arg.keyword
- args[k] &&= arg.type.coerce_isolated_input(args[k])
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
index bf9b73d918a..9beb40ddd7e 100644
--- a/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
+++ b/lib/gitlab/graphql/pagination/keyset/generic_keyset_pagination.rb
@@ -68,7 +68,7 @@ module Gitlab
def items
original_items = super
- return original_items if Feature.disabled?(:new_graphql_keyset_pagination, default_enabled: :yaml) || Gitlab::Pagination::Keyset::Order.keyset_aware?(original_items)
+ return original_items if Feature.disabled?(:new_graphql_keyset_pagination) || Gitlab::Pagination::Keyset::Order.keyset_aware?(original_items)
strong_memoize(:generic_keyset_pagination_items) do
rebuilt_items_with_keyset_order, success = Gitlab::Pagination::Keyset::SimpleOrderBuilder.build(original_items)
diff --git a/lib/gitlab/graphql/queries.rb b/lib/gitlab/graphql/queries.rb
index 5d3a9245427..cf06a2729d9 100644
--- a/lib/gitlab/graphql/queries.rb
+++ b/lib/gitlab/graphql/queries.rb
@@ -240,6 +240,9 @@ module Gitlab
end
end
+ # TODO: some queries live under app/graphql/queries - we should look there if/when we add fragments there
+ # See: https://gitlab.com/gitlab-org/gitlab/-/issues/361079
+ # for fragments too.
class Fragments
def initialize(root, dir = 'app/assets/javascripts')
@root = root
@@ -278,7 +281,7 @@ module Gitlab
def self.all
['.', 'ee'].flat_map do |prefix|
- find(Rails.root / prefix / 'app/assets/javascripts')
+ find(Rails.root / prefix / 'app/assets/javascripts') + find(Rails.root / prefix / 'app/graphql/queries')
end
end
diff --git a/lib/gitlab/health_checks/middleware.rb b/lib/gitlab/health_checks/middleware.rb
new file mode 100644
index 00000000000..3fe065147c8
--- /dev/null
+++ b/lib/gitlab/health_checks/middleware.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module HealthChecks
+ class Middleware
+ def initialize(app, readiness_probe, liveness_probe)
+ @app = app
+ @readiness_probe = readiness_probe
+ @liveness_probe = liveness_probe
+ end
+
+ def call(env)
+ case env['PATH_INFO']
+ when '/readiness' then render_probe(@readiness_probe)
+ when '/liveness' then render_probe(@liveness_probe)
+ else @app.call(env)
+ end
+ end
+
+ private
+
+ def render_probe(probe)
+ result = probe.execute
+
+ [
+ result.http_status,
+ { 'Content-Type' => 'application/json; charset=utf-8' },
+ [result.json.to_json]
+ ]
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/health_checks/server.rb b/lib/gitlab/health_checks/server.rb
new file mode 100644
index 00000000000..d747b64a221
--- /dev/null
+++ b/lib/gitlab/health_checks/server.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'webrick'
+
+module Gitlab
+ module HealthChecks
+ class Server < Daemon
+ def initialize(address:, port:, **options)
+ super(**options)
+
+ @address = address
+ @port = port
+ end
+
+ private
+
+ def start_working
+ @server = ::WEBrick::HTTPServer.new(
+ Port: @port, BindAddress: @address, AccessLog: []
+ )
+ @server.mount '/', Rack::Handler::WEBrick, rack_app
+
+ true
+ end
+
+ def run_thread
+ @server&.start
+ rescue IOError
+ # ignore forcibily closed servers
+ end
+
+ def stop_working
+ if @server
+ # we close sockets if thread is not longer running
+ # this happens, when the process forks
+ if thread.alive?
+ @server.shutdown
+ else
+ @server.listeners.each(&:close)
+ end
+ end
+
+ @server = nil
+ end
+
+ def rack_app
+ readiness = new_probe
+ liveness = new_probe
+
+ Rack::Builder.app do
+ use Rack::Deflater
+ use HealthChecks::Middleware, readiness, liveness
+ run -> (env) { [404, {}, ['']] }
+ end
+ end
+
+ def new_probe
+ ::Gitlab::HealthChecks::Probes::Collection.new
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/hook_data/issuable_builder.rb b/lib/gitlab/hook_data/issuable_builder.rb
deleted file mode 100644
index add9e880475..00000000000
--- a/lib/gitlab/hook_data/issuable_builder.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module HookData
- class IssuableBuilder < BaseBuilder
- CHANGES_KEYS = %i[previous current].freeze
-
- alias_method :issuable, :object
-
- def build(user: nil, changes: {})
- hook_data = {
- object_kind: object_kind,
- event_type: event_type,
- user: user.hook_attrs,
- project: issuable.project.hook_attrs,
- object_attributes: issuable_builder.new(issuable).build,
- labels: issuable.labels.map(&:hook_attrs),
- changes: final_changes(changes.slice(*safe_keys)),
- # DEPRECATED
- repository: issuable.project.hook_attrs.slice(:name, :url, :description, :homepage)
- }
-
- hook_data[:assignees] = issuable.assignees.map(&:hook_attrs) if issuable.assignees.any?
-
- hook_data
- end
-
- def safe_keys
- issuable_builder.safe_hook_attributes + issuable_builder.safe_hook_relations
- end
-
- private
-
- def object_kind
- issuable.class.name.underscore
- end
-
- def event_type
- if issuable.try(:confidential?)
- "confidential_#{object_kind}"
- else
- object_kind
- end
- end
-
- def issuable_builder
- case issuable
- when Issue
- Gitlab::HookData::IssueBuilder
- when MergeRequest
- Gitlab::HookData::MergeRequestBuilder
- end
- end
-
- def final_changes(changes_hash)
- changes_hash.transform_values { |changes_array| Hash[CHANGES_KEYS.zip(changes_array)] }
- end
- end
- end
-end
diff --git a/lib/gitlab/hotlinking_detector.rb b/lib/gitlab/hotlinking_detector.rb
index 44901297870..dd58f6aca26 100644
--- a/lib/gitlab/hotlinking_detector.rb
+++ b/lib/gitlab/hotlinking_detector.rb
@@ -12,7 +12,7 @@ module Gitlab
def intercept_hotlinking?(request)
request_accepts = parse_request_accepts(request)
- return false unless Feature.enabled?(:repository_archive_hotlinking_interception, default_enabled: true)
+ return false unless Feature.enabled?(:repository_archive_hotlinking_interception)
# Block attempts to embed as JS
return true if sec_fetch_invalid?(request)
diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb
index 8b775d567c8..c8239c9e308 100644
--- a/lib/gitlab/i18n.rb
+++ b/lib/gitlab/i18n.rb
@@ -43,7 +43,7 @@ module Gitlab
TRANSLATION_LEVELS = {
'bg' => 0,
'cs_CZ' => 0,
- 'da_DK' => 44,
+ 'da_DK' => 43,
'de' => 14,
'en' => 100,
'eo' => 0,
@@ -53,17 +53,17 @@ module Gitlab
'gl_ES' => 0,
'id_ID' => 0,
'it' => 1,
- 'ja' => 34,
+ 'ja' => 33,
'ko' => 12,
'nb_NO' => 29,
'nl_NL' => 0,
'pl_PL' => 4,
'pt_BR' => 50,
- 'ro_RO' => 36,
- 'ru' => 31,
+ 'ro_RO' => 58,
+ 'ru' => 30,
'tr_TR' => 13,
- 'uk' => 46,
- 'zh_CN' => 97,
+ 'uk' => 47,
+ 'zh_CN' => 96,
'zh_HK' => 2,
'zh_TW' => 2
}.freeze
diff --git a/lib/gitlab/i18n/po_linter.rb b/lib/gitlab/i18n/po_linter.rb
index 74be56df221..3ad01ef2257 100644
--- a/lib/gitlab/i18n/po_linter.rb
+++ b/lib/gitlab/i18n/po_linter.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'securerandom'
+
module Gitlab
module I18n
class PoLinter
@@ -245,16 +247,24 @@ module Gitlab
[]
elsif variables.any? { |variable| unnamed_variable?(variable) }
variables.map do |variable|
- variable == '%d' ? Random.rand(1000) : Gitlab::Utils.random_string
+ variable == '%d' ? random_number : random_string
end
else
variables.each_with_object({}) do |variable, hash|
variable_name = variable[/\w+/]
- hash[variable_name] = Gitlab::Utils.random_string
+ hash[variable_name] = random_string
end
end
end
+ def random_number
+ Random.rand(1000)
+ end
+
+ def random_string
+ SecureRandom.alphanumeric(64)
+ end
+
def validate_unnamed_variables(errors, variables)
unnamed_variables, named_variables = variables.partition { |name| unnamed_variable?(name) }
diff --git a/lib/gitlab/import_export/file_importer.rb b/lib/gitlab/import_export/file_importer.rb
index 829b3771518..1878b5b1a30 100644
--- a/lib/gitlab/import_export/file_importer.rb
+++ b/lib/gitlab/import_export/file_importer.rb
@@ -28,7 +28,7 @@ module Gitlab
copy_archive
wait_for_archived_file do
- validate_decompressed_archive_size if Feature.enabled?(:validate_import_decompressed_archive_size, default_enabled: :yaml)
+ validate_decompressed_archive_size if Feature.enabled?(:validate_import_decompressed_archive_size)
decompress_archive
end
rescue StandardError => e
diff --git a/lib/gitlab/import_export/group/import_export.yml b/lib/gitlab/import_export/group/import_export.yml
index f7ab1677001..8df5d52bf77 100644
--- a/lib/gitlab/import_export/group/import_export.yml
+++ b/lib/gitlab/import_export/group/import_export.yml
@@ -16,6 +16,7 @@ tree:
- :board
- members:
- :user
+ - :namespace_settings
included_attributes:
user:
@@ -24,6 +25,8 @@ included_attributes:
- :username
author:
- :name
+ namespace_settings:
+ - :prevent_sharing_groups_outside_hierarchy
excluded_attributes:
group:
@@ -38,6 +41,7 @@ excluded_attributes:
- :shared_runners_minute_limit
- :extra_shared_runners_minutes_limit
- :repository_size_limit
+ - :max_pages_size
epics:
- :state_id
diff --git a/lib/gitlab/import_export/group/relation_factory.rb b/lib/gitlab/import_export/group/relation_factory.rb
index adbbd37ce10..258078d595b 100644
--- a/lib/gitlab/import_export/group/relation_factory.rb
+++ b/lib/gitlab/import_export/group/relation_factory.rb
@@ -30,6 +30,10 @@ module Gitlab
update_group_references
end
+ def invalid_relation?
+ @relation_name == :namespace_settings
+ end
+
def update_group_references
return unless self.class.existing_object_relations.include?(@relation_name)
return unless @relation_hash['group_id']
diff --git a/lib/gitlab/import_export/group/relation_tree_restorer.rb b/lib/gitlab/import_export/group/relation_tree_restorer.rb
index b44874f598c..4b28dd831fc 100644
--- a/lib/gitlab/import_export/group/relation_tree_restorer.rb
+++ b/lib/gitlab/import_export/group/relation_tree_restorer.rb
@@ -89,7 +89,7 @@ module Gitlab
end
def save_relation_object(relation_object, relation_key, relation_definition, relation_index)
- if Feature.enabled?(:import_relation_object_persistence, default_enabled: :yaml) && relation_object.new_record?
+ if Feature.enabled?(:import_relation_object_persistence) && relation_object.new_record?
Gitlab::ImportExport::Base::RelationObjectSaver.new(
relation_object: relation_object,
relation_key: relation_key,
diff --git a/lib/gitlab/import_export/project/import_export.yml b/lib/gitlab/import_export/project/import_export.yml
index 7dcf26ca89a..1625c39595c 100644
--- a/lib/gitlab/import_export/project/import_export.yml
+++ b/lib/gitlab/import_export/project/import_export.yml
@@ -48,6 +48,8 @@ tree:
- :award_emoji
- releases:
- :links
+ - milestone_releases:
+ - :milestone
- project_members:
- :user
- merge_requests:
@@ -752,6 +754,7 @@ excluded_attributes:
- :compliance_framework_setting
- :show_default_award_emojis
- :warn_about_potentially_unwanted_characters
+ - :enforce_auth_checks_on_uploads
- :services
- :exported_protected_branches
- :repository_size_limit
@@ -957,6 +960,9 @@ excluded_attributes:
system_note_metadata:
- :description_version_id
- :note_id
+ milestone_releases:
+ - :milestone_id
+ - :release_id
methods:
notes:
- :type
diff --git a/lib/gitlab/import_export/project/tree_restorer.rb b/lib/gitlab/import_export/project/tree_restorer.rb
index d8992061524..47f82a901b7 100644
--- a/lib/gitlab/import_export/project/tree_restorer.rb
+++ b/lib/gitlab/import_export/project/tree_restorer.rb
@@ -54,7 +54,7 @@ module Gitlab
end
def ndjson_relation_reader
- return unless Feature.enabled?(:project_import_ndjson, project.namespace, default_enabled: true)
+ return unless Feature.enabled?(:project_import_ndjson, project.namespace)
ImportExport::Json::NdjsonReader.new(
File.join(shared.export_path, 'tree')
diff --git a/lib/gitlab/import_export/project/tree_saver.rb b/lib/gitlab/import_export/project/tree_saver.rb
index 63c5afa9595..05dcfa5282c 100644
--- a/lib/gitlab/import_export/project/tree_saver.rb
+++ b/lib/gitlab/import_export/project/tree_saver.rb
@@ -80,7 +80,7 @@ module Gitlab
def json_writer
@json_writer ||= begin
- if ::Feature.enabled?(:project_export_as_ndjson, @project.namespace, default_enabled: true)
+ if ::Feature.enabled?(:project_export_as_ndjson, @project.namespace)
full_path = File.join(@shared.export_path, 'tree')
Gitlab::ImportExport::Json::NdjsonWriter.new(full_path)
else
diff --git a/lib/gitlab/inactive_projects_deletion_warning_tracker.rb b/lib/gitlab/inactive_projects_deletion_warning_tracker.rb
new file mode 100644
index 00000000000..f3f8e774b4b
--- /dev/null
+++ b/lib/gitlab/inactive_projects_deletion_warning_tracker.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class InactiveProjectsDeletionWarningTracker
+ attr_reader :project_id
+
+ DELETION_TRACKING_REDIS_KEY = 'inactive_projects_deletion_warning_email_notified'
+
+ # Redis key 'inactive_projects_deletion_warning_email_notified' is a hash. It stores the date when the
+ # deletion warning notification email was sent for an inactive project. The fields and values look like:
+ # {"project:1"=>"2022-04-22", "project:5"=>"2022-04-22", "project:7"=>"2022-04-25"}
+ # @return [Hash]
+ def self.notified_projects
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hgetall(DELETION_TRACKING_REDIS_KEY)
+ end
+ end
+
+ def self.reset_all
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.del(DELETION_TRACKING_REDIS_KEY)
+ end
+ end
+
+ def initialize(project_id)
+ @project_id = project_id
+ end
+
+ def notified?
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hexists(DELETION_TRACKING_REDIS_KEY, "project:#{project_id}")
+ end
+ end
+
+ def mark_notified
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hset(DELETION_TRACKING_REDIS_KEY, "project:#{project_id}", Date.current)
+ end
+ end
+
+ def reset
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hdel(DELETION_TRACKING_REDIS_KEY, "project:#{project_id}")
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/instrumentation/rate_limiting_gates.rb b/lib/gitlab/instrumentation/rate_limiting_gates.rb
new file mode 100644
index 00000000000..960b6995030
--- /dev/null
+++ b/lib/gitlab/instrumentation/rate_limiting_gates.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Instrumentation
+ class RateLimitingGates
+ GATES = :rate_limiting_gates
+
+ class << self
+ def track(key)
+ if ::Gitlab::SafeRequestStore.active?
+ gates_set << key
+ end
+ end
+
+ def gates
+ gates_set.to_a
+ end
+
+ def payload
+ {
+ GATES => gates
+ }
+ end
+
+ private
+
+ def gates_set
+ ::Gitlab::SafeRequestStore[GATES] ||= Set.new
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/instrumentation_helper.rb b/lib/gitlab/instrumentation_helper.rb
index 155e365d04c..379c27caeb7 100644
--- a/lib/gitlab/instrumentation_helper.rb
+++ b/lib/gitlab/instrumentation_helper.rb
@@ -32,6 +32,7 @@ module Gitlab
instrument_load_balancing(payload)
instrument_pid(payload)
instrument_uploads(payload)
+ instrument_rate_limiting_gates(payload)
end
def instrument_gitaly(payload)
@@ -121,6 +122,10 @@ module Gitlab
payload.merge! ::Gitlab::Instrumentation::Uploads.payload
end
+ def instrument_rate_limiting_gates(payload)
+ payload.merge!(::Gitlab::Instrumentation::RateLimitingGates.payload)
+ end
+
# Returns the queuing duration for a Sidekiq job in seconds, as a float, if the
# `enqueued_at` field or `created_at` field is available.
#
diff --git a/lib/gitlab/integrations/sti_type.rb b/lib/gitlab/integrations/sti_type.rb
deleted file mode 100644
index f347db7bc8c..00000000000
--- a/lib/gitlab/integrations/sti_type.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Integrations
- class StiType < ActiveRecord::Type::String
- NAMESPACED_INTEGRATIONS = %w[
- Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
- Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Harbor Irker Jenkins Jira Mattermost
- MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
- Prometheus Pushover Redmine Shimo Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
- ].to_set.freeze
-
- def self.namespaced_integrations
- NAMESPACED_INTEGRATIONS
- end
-
- def cast(value)
- new_cast(value) || super
- end
-
- def serialize(value)
- new_serialize(value) || super
- end
-
- def deserialize(value)
- value
- end
-
- def changed?(original_value, value, _new_value_before_type_cast)
- original_value != serialize(value)
- end
-
- def changed_in_place?(original_value_for_database, value)
- original_value_for_database != serialize(value)
- end
-
- private
-
- def new_cast(value)
- value = prepare_value(value)
- return unless value
-
- stripped_name = value.delete_suffix('Service')
- return unless self.class.namespaced_integrations.include?(stripped_name)
-
- "Integrations::#{stripped_name}"
- end
-
- def new_serialize(value)
- value = prepare_value(value)
- return unless value&.starts_with?('Integrations::')
-
- "#{value.delete_prefix('Integrations::')}Service"
- end
-
- # Returns value cast to a `String`, or `nil` if value is `nil`.
- def prepare_value(value)
- return value if value.nil? || value.is_a?(String)
-
- value.to_s
- end
- end
- end
-end
-
-Gitlab::Integrations::StiType.prepend_mod
diff --git a/lib/gitlab/integrations_logger.rb b/lib/gitlab/integrations_logger.rb
new file mode 100644
index 00000000000..c62a5f6d321
--- /dev/null
+++ b/lib/gitlab/integrations_logger.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class IntegrationsLogger < Gitlab::JsonLogger
+ def self.file_name_noext
+ 'integrations_json'
+ end
+ end
+end
diff --git a/lib/gitlab/jira/http_client.rb b/lib/gitlab/jira/http_client.rb
index 7abfe8e38e8..02b0c902a70 100644
--- a/lib/gitlab/jira/http_client.rb
+++ b/lib/gitlab/jira/http_client.rb
@@ -35,6 +35,12 @@ module Gitlab
request_params[:base_uri] = uri.to_s
request_params.merge!(auth_params)
+ if Feature.enabled?(:jira_raise_timeouts, type: :ops)
+ request_params[:open_timeout] = 2.minutes
+ request_params[:read_timeout] = 2.minutes
+ request_params[:write_timeout] = 2.minutes
+ end
+
result = Gitlab::HTTP.public_send(http_method, path, **request_params) # rubocop:disable GitlabSecurity/PublicSend
@authenticated = result.response.is_a?(Net::HTTPOK)
store_cookies(result) if options[:use_cookies]
diff --git a/lib/gitlab/json.rb b/lib/gitlab/json.rb
index 9824b46554f..512936bb4f4 100644
--- a/lib/gitlab/json.rb
+++ b/lib/gitlab/json.rb
@@ -160,7 +160,7 @@ module Gitlab
# @raise [JSON::ParserError]
def handle_legacy_mode!(data)
return data unless feature_table_exists?
- return data unless Feature.enabled?(:json_wrapper_legacy_mode, default_enabled: true)
+ return data unless Feature.enabled?(:json_wrapper_legacy_mode)
raise parser_error if INVALID_LEGACY_TYPES.any? { |type| data.is_a?(type) }
end
diff --git a/lib/gitlab/kas.rb b/lib/gitlab/kas.rb
index ed7787ffc49..bf7b7f2d089 100644
--- a/lib/gitlab/kas.rb
+++ b/lib/gitlab/kas.rb
@@ -33,6 +33,10 @@ module Gitlab
@_version ||= Rails.root.join(VERSION_FILE).read.chomp
end
+ def version_info
+ Gitlab::VersionInfo.parse(version)
+ end
+
# Return GitLab KAS external_url
#
# @return [String] external_url
diff --git a/lib/gitlab/kubernetes/cilium_network_policy.rb b/lib/gitlab/kubernetes/cilium_network_policy.rb
deleted file mode 100644
index 8a31e068c30..00000000000
--- a/lib/gitlab/kubernetes/cilium_network_policy.rb
+++ /dev/null
@@ -1,141 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Kubernetes
- class CiliumNetworkPolicy
- include NetworkPolicyCommon
- extend ::Gitlab::Utils::Override
-
- API_VERSION = "cilium.io/v2"
- KIND = 'CiliumNetworkPolicy'
-
- PREDEFINED_POLICIES = {
- 'allow-inbound-http' => <<~YAML.rstrip,
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- metadata:
- name: allow-inbound-http
- spec:
- endpointSelector:
- matchLabels:
- network-policy.gitlab.com/disabled_by: gitlab
- ingress:
- - toPorts:
- - ports:
- - port: '80'
- - port: '443'
- YAML
- 'drop-outbound' => <<~YAML.rstrip
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- metadata:
- name: drop-outbound
- spec:
- endpointSelector:
- matchLabels:
- network-policy.gitlab.com/disabled_by: gitlab
- egress:
- - {}
- YAML
- }.freeze
-
- # We are modeling existing kubernetes resource and don't have
- # control over amount of parameters.
- # rubocop:disable Metrics/ParameterLists
- def initialize(name:, namespace:, selector:, ingress:, resource_version: nil, description: nil, labels: nil, creation_timestamp: nil, egress: nil, annotations: nil, environment_ids: [])
- @name = name
- @description = description
- @namespace = namespace
- @labels = labels
- @creation_timestamp = creation_timestamp
- @selector = selector
- @resource_version = resource_version
- @ingress = ingress
- @egress = egress
- @annotations = annotations
- @environment_ids = environment_ids
- end
- # rubocop:enable Metrics/ParameterLists
-
- def self.from_yaml(manifest)
- return unless manifest
-
- policy = YAML.safe_load(manifest, symbolize_names: true)
- return if !policy[:metadata] || !policy[:spec]
-
- metadata = policy[:metadata]
- spec = policy[:spec]
- self.new(
- name: metadata[:name],
- description: policy[:description],
- namespace: metadata[:namespace],
- annotations: metadata[:annotations],
- resource_version: metadata[:resourceVersion],
- labels: metadata[:labels],
- selector: spec[:endpointSelector],
- ingress: spec[:ingress],
- egress: spec[:egress]
- )
- rescue Psych::SyntaxError, Psych::DisallowedClass
- nil
- end
-
- def self.from_resource(resource, environment_ids = [])
- return unless resource
- return if !resource[:metadata] || !resource[:spec]
-
- metadata = resource[:metadata]
- spec = resource[:spec].to_h
- self.new(
- name: metadata[:name],
- description: resource[:description],
- namespace: metadata[:namespace],
- annotations: metadata[:annotations]&.to_h,
- resource_version: metadata[:resourceVersion],
- labels: metadata[:labels]&.to_h,
- creation_timestamp: metadata[:creationTimestamp],
- selector: spec[:endpointSelector],
- ingress: spec[:ingress],
- egress: spec[:egress],
- environment_ids: environment_ids
- )
- end
-
- override :resource
- def resource
- resource = {
- apiVersion: API_VERSION,
- kind: KIND,
- metadata: metadata,
- spec: spec
- }
- resource[:description] = description if description
- resource
- end
-
- private
-
- attr_reader :name, :description, :namespace, :labels, :creation_timestamp, :resource_version, :ingress, :egress, :annotations, :environment_ids
-
- def selector
- @selector ||= {}
- end
-
- def metadata
- meta = { name: name, namespace: namespace }
- meta[:labels] = labels if labels
- meta[:resourceVersion] = resource_version if resource_version
- meta[:annotations] = annotations if annotations
- meta
- end
-
- def spec
- {
- endpointSelector: selector,
- ingress: ingress,
- egress: egress
- }.compact
- end
- end
- end
-end
diff --git a/lib/gitlab/kubernetes/kube_client.rb b/lib/gitlab/kubernetes/kube_client.rb
index 6caebf445e5..cd03e332175 100644
--- a/lib/gitlab/kubernetes/kube_client.rb
+++ b/lib/gitlab/kubernetes/kube_client.rb
@@ -81,24 +81,6 @@ module Gitlab
:update_gateway,
to: :istio_client
- # NetworkPolicy methods delegate to the apis/networking.k8s.io api
- # group client
- delegate :create_network_policy,
- :get_network_policies,
- :get_network_policy,
- :update_network_policy,
- :delete_network_policy,
- to: :networking_client
-
- # CiliumNetworkPolicy methods delegate to the apis/cilium.io api
- # group client
- delegate :create_cilium_network_policy,
- :get_cilium_network_policies,
- :get_cilium_network_policy,
- :update_cilium_network_policy,
- :delete_cilium_network_policy,
- to: :cilium_networking_client
-
attr_reader :api_prefix, :kubeclient_options
DEFAULT_KUBECLIENT_OPTIONS = {
diff --git a/lib/gitlab/kubernetes/network_policy.rb b/lib/gitlab/kubernetes/network_policy.rb
deleted file mode 100644
index e6111db5b17..00000000000
--- a/lib/gitlab/kubernetes/network_policy.rb
+++ /dev/null
@@ -1,98 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Kubernetes
- class NetworkPolicy
- include NetworkPolicyCommon
- extend ::Gitlab::Utils::Override
-
- KIND = 'NetworkPolicy'
-
- # rubocop:disable Metrics/ParameterLists
- def initialize(name:, namespace:, selector:, ingress:, labels: nil, creation_timestamp: nil, policy_types: ["Ingress"], egress: nil, environment_ids: [])
- @name = name
- @namespace = namespace
- @labels = labels
- @creation_timestamp = creation_timestamp
- @selector = selector
- @policy_types = policy_types
- @ingress = ingress
- @egress = egress
- @environment_ids = environment_ids
- end
- # rubocop:enable Metrics/ParameterLists
-
- def self.from_yaml(manifest)
- return unless manifest
-
- policy = YAML.safe_load(manifest, symbolize_names: true)
- return if !policy[:metadata] || !policy[:spec]
-
- metadata = policy[:metadata]
- spec = policy[:spec]
- self.new(
- name: metadata[:name],
- namespace: metadata[:namespace],
- labels: metadata[:labels],
- selector: spec[:podSelector],
- policy_types: spec[:policyTypes],
- ingress: spec[:ingress],
- egress: spec[:egress]
- )
- rescue Psych::SyntaxError, Psych::DisallowedClass
- nil
- end
-
- def self.from_resource(resource, environment_ids = [])
- return unless resource
- return if !resource[:metadata] || !resource[:spec]
-
- metadata = resource[:metadata]
- spec = resource[:spec].to_h
- self.new(
- name: metadata[:name],
- namespace: metadata[:namespace],
- labels: metadata[:labels]&.to_h,
- creation_timestamp: metadata[:creationTimestamp],
- selector: spec[:podSelector],
- policy_types: spec[:policyTypes],
- ingress: spec[:ingress],
- egress: spec[:egress],
- environment_ids: environment_ids
- )
- end
-
- override :resource
- def resource
- {
- kind: KIND,
- metadata: metadata,
- spec: spec
- }
- end
-
- private
-
- attr_reader :name, :namespace, :labels, :creation_timestamp, :policy_types, :ingress, :egress, :environment_ids
-
- def selector
- @selector ||= {}
- end
-
- def metadata
- meta = { name: name, namespace: namespace }
- meta[:labels] = labels if labels
- meta
- end
-
- def spec
- {
- podSelector: selector,
- policyTypes: policy_types,
- ingress: ingress,
- egress: egress
- }
- end
- end
- end
-end
diff --git a/lib/gitlab/kubernetes/network_policy_common.rb b/lib/gitlab/kubernetes/network_policy_common.rb
deleted file mode 100644
index de91833b734..00000000000
--- a/lib/gitlab/kubernetes/network_policy_common.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Kubernetes
- module NetworkPolicyCommon
- DISABLED_BY_LABEL = :'network-policy.gitlab.com/disabled_by'
-
- def generate
- ::Kubeclient::Resource.new(resource)
- end
-
- def as_json(opts = nil)
- {
- name: name,
- namespace: namespace,
- creation_timestamp: creation_timestamp,
- manifest: manifest,
- is_autodevops: autodevops?,
- is_enabled: enabled?,
- environment_ids: environment_ids
- }
- end
-
- def autodevops?
- return false unless labels
-
- !labels[:chart].nil? && labels[:chart].start_with?('auto-deploy-app-')
- end
-
- # selector selects pods that should be targeted by this
- # policy. It can represent podSelector, nodeSelector or
- # endpointSelector We can narrow selection by requiring
- # this policy to match our custom labels. Since DISABLED_BY
- # label will not be on any pod a policy will be effectively disabled.
- def enabled?
- return true unless selector&.key?(:matchLabels)
-
- !selector[:matchLabels]&.key?(DISABLED_BY_LABEL)
- end
-
- def enable
- return if enabled?
-
- selector[:matchLabels].delete(DISABLED_BY_LABEL)
- end
-
- def disable
- selector[:matchLabels] ||= {}
- selector[:matchLabels].merge!(DISABLED_BY_LABEL => 'gitlab')
- end
-
- private
-
- def resource
- raise NotImplementedError
- end
-
- def manifest
- YAML.dump(resource.deep_stringify_keys)
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb b/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
index 8a176be30a2..e2b43798b22 100644
--- a/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
+++ b/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
@@ -33,7 +33,6 @@ module Gitlab
def import
delete_stale_metrics
create_or_update_metrics
- update_prometheus_environments
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -47,8 +46,6 @@ module Gitlab
affected_metric_ids << prometheus_metric.id
end
-
- @affected_environment_ids += find_alerts(affected_metric_ids).get_environment_id
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -62,24 +59,9 @@ module Gitlab
return unless stale_metrics.exists?
- delete_stale_alerts(stale_metrics)
stale_metrics.each_batch { |batch| batch.delete_all }
end
- def delete_stale_alerts(stale_metrics)
- stale_alerts = find_alerts(stale_metrics)
-
- affected_environment_ids = stale_alerts.get_environment_id
- return unless affected_environment_ids.present?
-
- @affected_environment_ids += affected_environment_ids
- stale_alerts.each_batch { |batch| batch.delete_all }
- end
-
- def find_alerts(metrics)
- Projects::Prometheus::AlertsFinder.new(project: project, metric: metrics).execute
- end
-
def prometheus_metrics_attributes
@prometheus_metrics_attributes ||= begin
Dashboard::Transformers::Yml::V1::PrometheusMetrics.new(
@@ -89,19 +71,6 @@ module Gitlab
).execute
end
end
-
- def update_prometheus_environments
- affected_environments = ::Environment.for_id(@affected_environment_ids.flatten.uniq).for_project(project)
-
- return unless affected_environments.exists?
-
- affected_environments.each do |affected_environment|
- ::Clusters::Applications::ScheduleUpdateService.new(
- affected_environment.cluster_prometheus_adapter,
- project
- ).execute
- end
- end
end
end
end
diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb
index 2aea8d655fa..ba2eb729d7b 100644
--- a/lib/gitlab/metrics/exporter/base_exporter.rb
+++ b/lib/gitlab/metrics/exporter/base_exporter.rb
@@ -71,28 +71,17 @@ module Gitlab
end
def rack_app
- readiness = readiness_probe
- liveness = liveness_probe
pid = thread_name
gc_requests = @gc_requests
Rack::Builder.app do
use Rack::Deflater
use Gitlab::Metrics::Exporter::MetricsMiddleware, pid
- use Gitlab::Metrics::Exporter::HealthChecksMiddleware, readiness, liveness
use Gitlab::Metrics::Exporter::GcRequestMiddleware if gc_requests
use ::Prometheus::Client::Rack::Exporter if ::Gitlab::Metrics.metrics_folder_present?
run -> (env) { [404, {}, ['']] }
end
end
-
- def readiness_probe
- ::Gitlab::HealthChecks::Probes::Collection.new
- end
-
- def liveness_probe
- ::Gitlab::HealthChecks::Probes::Collection.new
- end
end
end
end
diff --git a/lib/gitlab/metrics/exporter/health_checks_middleware.rb b/lib/gitlab/metrics/exporter/health_checks_middleware.rb
deleted file mode 100644
index c43b8004b72..00000000000
--- a/lib/gitlab/metrics/exporter/health_checks_middleware.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Metrics
- module Exporter
- class HealthChecksMiddleware
- def initialize(app, readiness_probe, liveness_probe)
- @app = app
- @readiness_probe = readiness_probe
- @liveness_probe = liveness_probe
- end
-
- def call(env)
- case env['PATH_INFO']
- when '/readiness' then render_probe(@readiness_probe)
- when '/liveness' then render_probe(@liveness_probe)
- else @app.call(env)
- end
- end
-
- private
-
- def render_probe(probe)
- result = probe.execute
-
- [
- result.http_status,
- { 'Content-Type' => 'application/json; charset=utf-8' },
- [result.json.to_json]
- ]
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/methods.rb b/lib/gitlab/metrics/methods.rb
index dc9a7ed1312..0aad865085b 100644
--- a/lib/gitlab/metrics/methods.rb
+++ b/lib/gitlab/metrics/methods.rb
@@ -56,7 +56,8 @@ module Gitlab
end
def disabled_by_feature(options)
- options.with_feature && !::Feature.enabled?(options.with_feature, type: :ops)
+ options.with_feature && !::Feature.enabled?(options.with_feature,
+ type: :undefined, default_enabled_if_undefined: false)
end
def build_metric!(type, name, options)
diff --git a/lib/gitlab/metrics/rails_slis.rb b/lib/gitlab/metrics/rails_slis.rb
index c4f305dbdc4..71da0085c8c 100644
--- a/lib/gitlab/metrics/rails_slis.rb
+++ b/lib/gitlab/metrics/rails_slis.rb
@@ -5,16 +5,16 @@ module Gitlab
module RailsSlis
class << self
def initialize_request_slis!
- Gitlab::Metrics::Sli.initialize_sli(:rails_request_apdex, possible_request_labels) unless Gitlab::Metrics::Sli.initialized?(:rails_request_apdex)
- Gitlab::Metrics::Sli.initialize_sli(:graphql_query_apdex, possible_graphql_query_labels) unless Gitlab::Metrics::Sli.initialized?(:graphql_query_apdex)
+ Gitlab::Metrics::Sli::Apdex.initialize_sli(:rails_request, possible_request_labels)
+ Gitlab::Metrics::Sli::Apdex.initialize_sli(:graphql_query, possible_graphql_query_labels)
end
def request_apdex
- Gitlab::Metrics::Sli[:rails_request_apdex]
+ Gitlab::Metrics::Sli::Apdex[:rails_request]
end
def graphql_query_apdex
- Gitlab::Metrics::Sli[:graphql_query_apdex]
+ Gitlab::Metrics::Sli::Apdex[:graphql_query]
end
private
diff --git a/lib/gitlab/metrics/sli.rb b/lib/gitlab/metrics/sli.rb
index de73db0755d..fcd893b675f 100644
--- a/lib/gitlab/metrics/sli.rb
+++ b/lib/gitlab/metrics/sli.rb
@@ -2,12 +2,10 @@
module Gitlab
module Metrics
- class Sli
- SliNotInitializedError = Class.new(StandardError)
-
+ module Sli
COUNTER_PREFIX = 'gitlab_sli'
- class << self
+ module ClassMethods
INITIALIZATION_MUTEX = Mutex.new
def [](name)
@@ -16,6 +14,8 @@ module Gitlab
def initialize_sli(name, possible_label_combinations)
INITIALIZATION_MUTEX.synchronize do
+ next known_slis[name] if initialized?(name)
+
sli = new(name)
sli.initialize_counters(possible_label_combinations)
known_slis[name] = sli
@@ -33,6 +33,10 @@ module Gitlab
end
end
+ def self.included(mod)
+ mod.extend(ClassMethods)
+ end
+
attr_reader :name
def initialize(name)
@@ -41,16 +45,17 @@ module Gitlab
end
def initialize_counters(possible_label_combinations)
- @initialized_with_combinations = possible_label_combinations.any?
+ # This module is effectively an abstract class
+ @initialized_with_combinations = possible_label_combinations.any? # rubocop:disable Gitlab/ModuleWithInstanceVariables
possible_label_combinations.each do |label_combination|
total_counter.get(label_combination)
- success_counter.get(label_combination)
+ numerator_counter.get(label_combination)
end
end
- def increment(labels:, success:)
+ def increment(labels:, increment_numerator:)
total_counter.increment(labels)
- success_counter.increment(labels) if success
+ numerator_counter.increment(labels) if increment_numerator
end
def initialized?
@@ -60,23 +65,43 @@ module Gitlab
private
def total_counter
- prometheus.counter(total_counter_name.to_sym, "Total number of measurements for #{name}")
+ prometheus.counter(counter_name('total'), "Total number of measurements for #{name}")
end
- def success_counter
- prometheus.counter(success_counter_name.to_sym, "Number of successful measurements for #{name}")
+ def counter_name(suffix)
+ :"#{COUNTER_PREFIX}:#{name}_#{self.class.name.demodulize.underscore}:#{suffix}"
end
- def total_counter_name
- "#{COUNTER_PREFIX}:#{name}:total"
+ def prometheus
+ Gitlab::Metrics
end
- def success_counter_name
- "#{COUNTER_PREFIX}:#{name}:success_total"
+ class Apdex
+ include Sli
+
+ def increment(labels:, success:)
+ super(labels: labels, increment_numerator: success)
+ end
+
+ private
+
+ def numerator_counter
+ prometheus.counter(counter_name('success_total'), "Number of successful measurements for #{name}")
+ end
end
- def prometheus
- Gitlab::Metrics
+ class ErrorRate
+ include Sli
+
+ def increment(labels:, error:)
+ super(labels: labels, increment_numerator: error)
+ end
+
+ private
+
+ def numerator_counter
+ prometheus.counter(counter_name('error_total'), "Number of error measurements for #{name}")
+ end
end
end
end
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 12576cabb19..7c22ce64ea2 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -185,15 +185,17 @@ module Gitlab
counters << compose_metric_key(metric, role)
end
- ::Gitlab::Database.db_config_names.each do |config_name|
- counters << compose_metric_key(metric, nil, config_name) # main
- counters << compose_metric_key(metric, nil, config_name + ::Gitlab::Database::LoadBalancing::LoadBalancer::REPLICA_SUFFIX) # main_replica
+ ::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 + ::Gitlab::Database::LoadBalancing::LoadBalancer::REPLICA_SUFFIX) # main_replica / ci_replica
end
end
counters
end
+ private_class_method :load_balancing_metric_keys
+
def compose_metric_key(metric, db_role = nil, db_config_name = nil)
self.class.compose_metric_key(metric, db_role, db_config_name)
end
diff --git a/lib/gitlab/metrics/subscribers/rack_attack.rb b/lib/gitlab/metrics/subscribers/rack_attack.rb
index 70dcc6fad90..e6cf14a6c8c 100644
--- a/lib/gitlab/metrics/subscribers/rack_attack.rb
+++ b/lib/gitlab/metrics/subscribers/rack_attack.rb
@@ -15,22 +15,6 @@ module Gitlab
INSTRUMENTATION_STORE_KEY = :rack_attack_instrumentation
- THROTTLES_WITH_USER_INFORMATION = [
- :throttle_authenticated_api,
- :throttle_authenticated_web,
- :throttle_authenticated_protected_paths_api,
- :throttle_authenticated_protected_paths_web,
- :throttle_authenticated_packages_api,
- :throttle_authenticated_git_lfs,
- :throttle_authenticated_files_api,
- :throttle_authenticated_deprecated_api
- ].freeze
-
- PAYLOAD_KEYS = [
- :rack_attack_redis_count,
- :rack_attack_redis_duration_s
- ].freeze
-
def self.payload
Gitlab::SafeRequestStore[INSTRUMENTATION_STORE_KEY] ||= {
rack_attack_redis_count: 0,
@@ -49,20 +33,20 @@ module Gitlab
end
def throttle(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: 429)
end
def blocklist(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: 403)
end
def track(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: nil)
end
private
- def log_into_auth_logger(event)
+ def log_into_auth_logger(event, status:)
req = event.payload[:request]
rack_attack_info = {
message: 'Rack_Attack',
@@ -73,6 +57,10 @@ module Gitlab
matched: req.env['rack.attack.matched']
}
+ if status
+ rack_attack_info[:status] = status
+ end
+
discriminator = req.env['rack.attack.match_discriminator'].to_s
discriminator_id = discriminator.split(':').last
diff --git a/lib/gitlab/middleware/go.rb b/lib/gitlab/middleware/go.rb
index bfa4e4cf5f8..dcbb4557377 100644
--- a/lib/gitlab/middleware/go.rb
+++ b/lib/gitlab/middleware/go.rb
@@ -21,6 +21,7 @@ module Gitlab
rescue Gitlab::Auth::IpBlacklisted
Gitlab::AuthLogger.error(
message: 'Rack_Attack',
+ status: 403,
env: :blocklist,
remote_ip: request.ip,
request_method: request.request_method,
diff --git a/lib/gitlab/omniauth_initializer.rb b/lib/gitlab/omniauth_initializer.rb
index 51277497c99..b78cd2a6b95 100644
--- a/lib/gitlab/omniauth_initializer.rb
+++ b/lib/gitlab/omniauth_initializer.rb
@@ -136,8 +136,6 @@ module Gitlab
def setup_provider(provider)
case provider
- when :kerberos
- require 'omniauth-kerberos'
when *omniauth_customized_providers
require_dependency "omni_auth/strategies/#{provider}"
end
diff --git a/lib/gitlab/pagination/gitaly_keyset_pager.rb b/lib/gitlab/pagination/gitaly_keyset_pager.rb
index e76cab688cc..8bbc9a93610 100644
--- a/lib/gitlab/pagination/gitaly_keyset_pager.rb
+++ b/lib/gitlab/pagination/gitaly_keyset_pager.rb
@@ -30,11 +30,11 @@ module Gitlab
return false unless params[:pagination] == "keyset"
if finder.is_a?(BranchesFinder)
- Feature.enabled?(:branch_list_keyset_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:branch_list_keyset_pagination, project)
elsif finder.is_a?(TagsFinder)
- Feature.enabled?(:tag_list_keyset_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:tag_list_keyset_pagination, project)
elsif finder.is_a?(::Repositories::TreeFinder)
- Feature.enabled?(:repository_tree_gitaly_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:repository_tree_gitaly_pagination, project)
else
false
end
@@ -44,11 +44,11 @@ module Gitlab
return false unless params[:page].blank? || params[:page].to_i == 1
if finder.is_a?(BranchesFinder)
- Feature.enabled?(:branch_list_keyset_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:branch_list_keyset_pagination, project)
elsif finder.is_a?(TagsFinder)
- Feature.enabled?(:tag_list_keyset_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:tag_list_keyset_pagination, project)
elsif finder.is_a?(::Repositories::TreeFinder)
- Feature.enabled?(:repository_tree_gitaly_pagination, project, default_enabled: :yaml)
+ Feature.enabled?(:repository_tree_gitaly_pagination, project)
else
false
end
diff --git a/lib/gitlab/patch/database_config.rb b/lib/gitlab/patch/database_config.rb
index 702e8d404b1..c5c73d50518 100644
--- a/lib/gitlab/patch/database_config.rb
+++ b/lib/gitlab/patch/database_config.rb
@@ -31,10 +31,6 @@ module Gitlab
module DatabaseConfig
extend ActiveSupport::Concern
- prepended do
- attr_reader :uses_legacy_database_config
- end
-
def load_database_yaml
return super unless Gitlab.ee?
@@ -70,24 +66,7 @@ module Gitlab
end
def database_configuration
- @uses_legacy_database_config = false # rubocop:disable Gitlab/ModuleWithInstanceVariables
-
super.to_h do |env, configs|
- # TODO: To be removed in 15.0. See https://gitlab.com/gitlab-org/gitlab/-/issues/338182
- # This preload is needed to convert legacy `database.yml`
- # from `production: adapter: postgresql`
- # into a `production: main: adapter: postgresql`
- unless Gitlab::Utils.to_boolean(ENV['SKIP_DATABASE_CONFIG_VALIDATION'], default: false)
- # This check is taken from Rails where the transformation
- # of a flat database.yml is done into `primary:`
- # https://github.com/rails/rails/blob/v6.1.4/activerecord/lib/active_record/database_configurations.rb#L169
- if configs.is_a?(Hash) && !configs.all? { |_, v| v.is_a?(Hash) }
- configs = { "main" => configs }
-
- @uses_legacy_database_config = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
- end
- end
-
if Gitlab.ee?
if !configs.key?("geo") && File.exist?(Rails.root.join("config/database_geo.yml"))
configs["geo"] = Rails.application.config_for(:database_geo).stringify_keys
diff --git a/lib/gitlab/path_regex.rb b/lib/gitlab/path_regex.rb
index 6f497c6376d..b05d7160a4b 100644
--- a/lib/gitlab/path_regex.rb
+++ b/lib/gitlab/path_regex.rb
@@ -23,7 +23,6 @@ module Gitlab
503.html
admin
api
- apple-touch-icon-precomposed.png
apple-touch-icon.png
assets
dashboard
diff --git a/lib/gitlab/phabricator_import.rb b/lib/gitlab/phabricator_import.rb
index 4c9d54a93ce..3885a9934d5 100644
--- a/lib/gitlab/phabricator_import.rb
+++ b/lib/gitlab/phabricator_import.rb
@@ -5,7 +5,7 @@ module Gitlab
BaseError = Class.new(StandardError)
def self.available?
- Feature.enabled?(:phabricator_import, default_enabled: :yaml) &&
+ Feature.enabled?(:phabricator_import) &&
Gitlab::CurrentSettings.import_sources.include?('phabricator')
end
end
diff --git a/lib/gitlab/process_supervisor.rb b/lib/gitlab/process_supervisor.rb
index 18fd24aa582..714034f043d 100644
--- a/lib/gitlab/process_supervisor.rb
+++ b/lib/gitlab/process_supervisor.rb
@@ -20,7 +20,7 @@ module Gitlab
health_check_interval_seconds: DEFAULT_HEALTH_CHECK_INTERVAL_SECONDS,
check_terminate_interval_seconds: DEFAULT_TERMINATE_INTERVAL_SECONDS,
terminate_timeout_seconds: DEFAULT_TERMINATE_TIMEOUT_SECONDS,
- term_signals: %i(INT TERM),
+ term_signals: [],
forwarded_signals: [],
**options)
super(**options)
@@ -31,7 +31,7 @@ module Gitlab
@check_terminate_interval_seconds = check_terminate_interval_seconds
@terminate_timeout_seconds = terminate_timeout_seconds
- @pids = []
+ @pids = Set.new
@alive = false
end
@@ -43,7 +43,7 @@ module Gitlab
# If the block returns a non-empty list of IDs, the supervisor will
# start observing those processes instead. Otherwise it will shut down.
def supervise(pid_or_pids, &on_process_death)
- @pids = Array(pid_or_pids)
+ @pids = Array(pid_or_pids).to_set
@on_process_death = on_process_death
trap_signals!
@@ -56,7 +56,6 @@ module Gitlab
return unless @alive
stop_processes(signal)
- stop
end
def supervised_pids
@@ -75,26 +74,25 @@ module Gitlab
def run_thread
while @alive
- sleep(@health_check_interval_seconds)
-
check_process_health
+
+ sleep(@health_check_interval_seconds)
end
end
def check_process_health
unless all_alive?
- existing_pids = live_pids # Capture this value for the duration of the block.
+ existing_pids = live_pids.to_set # Capture this value for the duration of the block.
dead_pids = @pids - existing_pids
- new_pids = Array(@on_process_death.call(dead_pids))
- @pids = existing_pids + new_pids
- @alive = @pids.any?
+ new_pids = Array(@on_process_death.call(dead_pids.to_a))
+ @pids = existing_pids + new_pids.to_set
end
end
def stop_processes(signal)
# Set this prior to shutting down so that shutdown hooks which read `alive`
# know the supervisor is about to shut down.
- @alive = false
+ stop_working
# Shut down supervised processes.
signal_all(signal)
diff --git a/lib/gitlab/profiler.rb b/lib/gitlab/profiler.rb
index 3a5f1a1d480..d15b57eb888 100644
--- a/lib/gitlab/profiler.rb
+++ b/lib/gitlab/profiler.rb
@@ -16,7 +16,6 @@ module Gitlab
lib/gitlab/middleware/
ee/lib/gitlab/middleware/
lib/gitlab/performance_bar/
- lib/gitlab/request_profiler/
lib/gitlab/query_limiting/
lib/gitlab/tracing/
lib/gitlab/profiler.rb
diff --git a/lib/gitlab/project_service_logger.rb b/lib/gitlab/project_service_logger.rb
deleted file mode 100644
index 9b0357d3161..00000000000
--- a/lib/gitlab/project_service_logger.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- class ProjectServiceLogger < Gitlab::JsonLogger
- def self.file_name_noext
- 'integrations_json'
- end
- end
-end
diff --git a/lib/gitlab/push_options.rb b/lib/gitlab/push_options.rb
index 9d954a74948..8a1dcc083e8 100644
--- a/lib/gitlab/push_options.rb
+++ b/lib/gitlab/push_options.rb
@@ -8,6 +8,7 @@ module Gitlab
:assign,
:create,
:description,
+ :draft,
:label,
:merge_when_pipeline_succeeds,
:milestone,
diff --git a/lib/gitlab/query_limiting/active_support_subscriber.rb b/lib/gitlab/query_limiting/active_support_subscriber.rb
index 4bfd526914b..49f76ce7814 100644
--- a/lib/gitlab/query_limiting/active_support_subscriber.rb
+++ b/lib/gitlab/query_limiting/active_support_subscriber.rb
@@ -8,7 +8,7 @@ module Gitlab
def sql(event)
return if !::Gitlab::QueryLimiting::Transaction.current || event.payload.fetch(:cached, event.payload[:name] == 'CACHE')
- ::Gitlab::QueryLimiting::Transaction.current.increment
+ ::Gitlab::QueryLimiting::Transaction.current.increment(event.payload[:sql])
::Gitlab::QueryLimiting::Transaction.current.executed_sql(event.payload[:sql])
end
end
diff --git a/lib/gitlab/query_limiting/transaction.rb b/lib/gitlab/query_limiting/transaction.rb
index 643b2540c37..2e31849caaa 100644
--- a/lib/gitlab/query_limiting/transaction.rb
+++ b/lib/gitlab/query_limiting/transaction.rb
@@ -57,12 +57,28 @@ module Gitlab
raise(error) if raise_error?
end
- def increment
- @count += 1 if enabled?
+ def increment(sql = nil)
+ @count += 1 if enabled? && !ignorable?(sql)
+ end
+
+ GEO_NODES_LOAD = 'SELECT 1 AS one FROM "geo_nodes" LIMIT 1'
+ LICENSES_LOAD = 'SELECT "licenses".* FROM "licenses" ORDER BY "licenses"."id"'
+ ATTR_INTROSPECTION = %r/SELECT .*\ba.attname\b.* (FROM|JOIN) pg_attribute a/m.freeze
+
+ # queries can be safely ignored if they are amoritized in regular usage
+ # (i.e. only requested occasionally and otherwise cached).
+ def ignorable?(sql)
+ return true if sql&.include?(GEO_NODES_LOAD)
+ return true if sql&.include?(LICENSES_LOAD)
+ return true if ATTR_INTROSPECTION =~ sql
+
+ false
end
def executed_sql(sql)
- @sql_executed << sql if @count <= LOG_THRESHOLD
+ return if @count > LOG_THRESHOLD || ignorable?(sql)
+
+ @sql_executed << sql
end
def raise_error?
diff --git a/lib/gitlab/quick_actions/merge_request_actions.rb b/lib/gitlab/quick_actions/merge_request_actions.rb
index 4efa29337d1..abf55f56c73 100644
--- a/lib/gitlab/quick_actions/merge_request_actions.rb
+++ b/lib/gitlab/quick_actions/merge_request_actions.rb
@@ -285,7 +285,7 @@ module Gitlab
end
types MergeRequest
condition do
- Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml) &&
+ current_user.mr_attention_requests_enabled? &&
current_user.can?(:"admin_#{quick_action_target.to_ability_name}", project)
end
parse_params do |attention_param|
@@ -321,7 +321,7 @@ module Gitlab
end
types MergeRequest
condition do
- Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml) &&
+ current_user.mr_attention_requests_enabled? &&
current_user.can?(:"admin_#{quick_action_target.to_ability_name}", project)
end
parse_params do |attention_param|
diff --git a/lib/gitlab/reactive_cache_set_cache.rb b/lib/gitlab/reactive_cache_set_cache.rb
index e4a92ed5122..7ccbeadfd8a 100644
--- a/lib/gitlab/reactive_cache_set_cache.rb
+++ b/lib/gitlab/reactive_cache_set_cache.rb
@@ -10,10 +10,6 @@ module Gitlab
@expires_in = expires_in
end
- def cache_key(key)
- super(key)
- end
-
def clear_cache!(key)
with do |redis|
keys = read(key).map { |value| "#{cache_namespace}:#{value}" }
diff --git a/lib/gitlab/repository_archive_rate_limiter.rb b/lib/gitlab/repository_archive_rate_limiter.rb
index d395b1aba7f..31a3dc34bf6 100644
--- a/lib/gitlab/repository_archive_rate_limiter.rb
+++ b/lib/gitlab/repository_archive_rate_limiter.rb
@@ -3,7 +3,7 @@
module Gitlab
module RepositoryArchiveRateLimiter
def check_archive_rate_limit!(current_user, project, &block)
- return unless Feature.enabled?(:archive_rate_limit, default_enabled: :yaml)
+ return unless Feature.enabled?(:archive_rate_limit)
threshold = current_user ? nil : 100
diff --git a/lib/gitlab/request_profiler.rb b/lib/gitlab/request_profiler.rb
deleted file mode 100644
index 541d505e735..00000000000
--- a/lib/gitlab/request_profiler.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'fileutils'
-
-module Gitlab
- module RequestProfiler
- PROFILES_DIR = "#{Gitlab.config.shared.path}/tmp/requests_profiles"
-
- def all
- Dir["#{PROFILES_DIR}/*.{html,txt}"].map do |path|
- Profile.new(File.basename(path))
- end.select(&:valid?)
- end
- module_function :all # rubocop: disable Style/AccessModifierDeclarations
-
- def find(name)
- file_path = File.join(PROFILES_DIR, name)
- return unless File.exist?(file_path)
-
- Profile.new(name)
- end
- module_function :find # rubocop: disable Style/AccessModifierDeclarations
-
- def profile_token
- Rails.cache.fetch('profile-token') do
- Devise.friendly_token
- end
- end
- module_function :profile_token # rubocop: disable Style/AccessModifierDeclarations
-
- def remove_all_profiles
- FileUtils.rm_rf(PROFILES_DIR)
- end
- module_function :remove_all_profiles # rubocop: disable Style/AccessModifierDeclarations
- end
-end
diff --git a/lib/gitlab/request_profiler/middleware.rb b/lib/gitlab/request_profiler/middleware.rb
deleted file mode 100644
index acdf8d4541f..00000000000
--- a/lib/gitlab/request_profiler/middleware.rb
+++ /dev/null
@@ -1,107 +0,0 @@
-# frozen_string_literal: true
-
-require 'ruby-prof'
-require 'memory_profiler'
-
-module Gitlab
- module RequestProfiler
- class Middleware
- def initialize(app)
- @app = app
- end
-
- def call(env)
- if profile?(env)
- call_with_profiling(env)
- else
- @app.call(env)
- end
- end
-
- def profile?(env)
- header_token = env['HTTP_X_PROFILE_TOKEN']
- return unless header_token.present?
-
- profile_token = Gitlab::RequestProfiler.profile_token
- return unless profile_token.present?
-
- header_token == profile_token
- end
-
- def call_with_profiling(env)
- case env['HTTP_X_PROFILE_MODE']
- when 'execution', nil
- call_with_call_stack_profiling(env)
- when 'memory'
- call_with_memory_profiling(env)
- else
- raise ActionController::BadRequest, invalid_profile_mode(env)
- end
- end
-
- def invalid_profile_mode(env)
- <<~HEREDOC
- Invalid X-Profile-Mode: #{env['HTTP_X_PROFILE_MODE']}.
- Supported profile mode request header:
- - X-Profile-Mode: execution
- - X-Profile-Mode: memory
- HEREDOC
- end
-
- def call_with_call_stack_profiling(env)
- ret = nil
- report = RubyProf::Profile.profile do
- ret = catch(:warden) do # rubocop:disable Cop/BanCatchThrow
- @app.call(env)
- end
- end
-
- generate_report(env, 'execution', 'html') do |file|
- printer = RubyProf::CallStackPrinter.new(report)
- printer.print(file)
- end
-
- handle_request_ret(ret)
- end
-
- def call_with_memory_profiling(env)
- ret = nil
- report = MemoryProfiler.report do
- ret = catch(:warden) do # rubocop:disable Cop/BanCatchThrow
- @app.call(env)
- end
- end
-
- generate_report(env, 'memory', 'txt') do |file|
- report.pretty_print(to_file: file)
- end
-
- handle_request_ret(ret)
- end
-
- def generate_report(env, report_type, extension)
- file_name = "#{env['PATH_INFO'].tr('/', '|')}_#{Time.current.to_i}"\
- "_#{report_type}.#{extension}"
- file_path = "#{PROFILES_DIR}/#{file_name}"
-
- FileUtils.mkdir_p(PROFILES_DIR)
-
- begin
- File.open(file_path, 'wb') do |file|
- yield(file)
- end
- rescue StandardError
- FileUtils.rm(file_path)
- end
- end
-
- def handle_request_ret(ret)
- if ret.is_a?(Array)
- ret
- else
- throw(:warden, ret) # rubocop:disable Cop/BanCatchThrow
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/request_profiler/profile.rb b/lib/gitlab/request_profiler/profile.rb
deleted file mode 100644
index 76c675658b1..00000000000
--- a/lib/gitlab/request_profiler/profile.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module RequestProfiler
- class Profile
- attr_reader :name, :time, :file_path, :request_path, :profile_mode, :type
-
- alias_method :to_param, :name
-
- def initialize(name)
- @name = name
- @file_path = File.join(PROFILES_DIR, name)
-
- set_attributes
- end
-
- def valid?
- @request_path.present?
- end
-
- def content_type
- case type
- when 'html'
- 'text/html'
- when 'txt'
- 'text/plain'
- end
- end
-
- private
-
- def set_attributes
- matches = name.match(/^(?<path>.*)_(?<timestamp>\d+)(_(?<profile_mode>\w+))?\.(?<type>html|txt)$/)
- return unless matches
-
- @request_path = matches[:path].tr('|', '/')
- @time = Time.at(matches[:timestamp].to_i).utc
- @profile_mode = matches[:profile_mode] || 'unknown'
- @type = matches[:type]
- end
- end
- end
-end
diff --git a/lib/gitlab/safe_request_purger.rb b/lib/gitlab/safe_request_purger.rb
new file mode 100644
index 00000000000..b8795f1cc88
--- /dev/null
+++ b/lib/gitlab/safe_request_purger.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module Gitlab
+ class SafeRequestPurger
+ def self.execute(args)
+ new(**args).execute
+ end
+
+ def initialize(resource_key:, resource_ids:)
+ @resource_key = resource_key
+ @resource_ids = resource_ids.uniq
+ @resource_data = {}
+ end
+
+ def execute
+ load_resource_data
+ purge_resource_ids
+ write_resource_data_to_store
+ end
+
+ private
+
+ attr_reader :resource_key, :resource_ids, :resource_data
+
+ def load_resource_data
+ @resource_data = Gitlab::SafeRequestStore.fetch(resource_key) { resource_data }
+ end
+
+ def purge_resource_ids
+ @resource_data.delete_if { |id| resource_ids.include?(id) }
+ end
+
+ def write_resource_data_to_store
+ Gitlab::SafeRequestStore.write(resource_key, resource_data)
+ end
+ end
+end
diff --git a/lib/gitlab/setup_helper.rb b/lib/gitlab/setup_helper.rb
index a498e329c3f..1e42003b203 100644
--- a/lib/gitlab/setup_helper.rb
+++ b/lib/gitlab/setup_helper.rb
@@ -149,28 +149,47 @@ module Gitlab
module Praefect
extend Gitlab::SetupHelper
class << self
- def configuration_toml(gitaly_dir, _, _)
+ def configuration_toml(gitaly_dir, _storage_paths, options)
+ raise 'This configuration is only intended for test' unless Rails.env.test?
+
nodes = [{ storage: 'default', address: "unix:#{gitaly_dir}/gitaly.socket", primary: true, token: 'secret' }]
second_storage_nodes = [{ storage: 'test_second_storage', address: "unix:#{gitaly_dir}/gitaly2.socket", primary: true, token: 'secret' }]
storages = [{ name: 'default', node: nodes }, { name: 'test_second_storage', node: second_storage_nodes }]
- failover = { enabled: false, election_strategy: 'local' }
+
config = {
- i_understand_my_election_strategy_is_unsupported_and_will_be_removed_without_warning: true,
socket_path: "#{gitaly_dir}/praefect.socket",
- memory_queue_enabled: true,
virtual_storage: storages,
- failover: failover
+ token: 'secret'
}
- config[:token] = 'secret' if Rails.env.test?
+
+ if options[:per_repository]
+ failover = { enabled: true, election_strategy: 'per_repository' }
+ database = { host: options.fetch(:pghost),
+ port: options.fetch(:pgport).to_i,
+ user: options.fetch(:pguser),
+ dbname: options.fetch(:dbname, 'praefect_test') }
+
+ config.merge!(database: database,
+ failover: failover)
+ else
+ failover = { enabled: false, election_strategy: 'local' }
+
+ config.merge!(
+ i_understand_my_election_strategy_is_unsupported_and_will_be_removed_without_warning: true,
+ memory_queue_enabled: true,
+ failover: failover
+ )
+ end
TomlRB.dump(config)
end
private
- def get_config_path(dir, _)
- File.join(dir, 'praefect.config.toml')
+ def get_config_path(dir, options)
+ config_filename = options[:config_filename] || 'praefect.config.toml'
+ File.join(dir, config_filename)
end
end
end
diff --git a/lib/gitlab/sidekiq_config.rb b/lib/gitlab/sidekiq_config.rb
index 3eef41a2ca2..ac9a7d25fc2 100644
--- a/lib/gitlab/sidekiq_config.rb
+++ b/lib/gitlab/sidekiq_config.rb
@@ -141,6 +141,20 @@ module Gitlab
.to_h
end
+ # Get the list of queues from all available workers following queue
+ # routing rules. Sidekiq::Queue.all fetches the list of queues from Redis.
+ # It may contain some redundant, obsolete queues from previous iterations
+ # of GitLab.
+ def routing_queues
+ @routing_queues ||= workers.map do |worker|
+ if worker.klass.is_a?(Gitlab::SidekiqConfig::DummyWorker)
+ worker.queue
+ else
+ ::Gitlab::SidekiqConfig::WorkerRouter.global.route(worker.klass)
+ end
+ end.uniq.sort
+ end
+
private
def find_workers(root, ee:, jh:)
diff --git a/lib/gitlab/sidekiq_config/dummy_worker.rb b/lib/gitlab/sidekiq_config/dummy_worker.rb
index 8a2ea1acaab..ba1f2b8d2ab 100644
--- a/lib/gitlab/sidekiq_config/dummy_worker.rb
+++ b/lib/gitlab/sidekiq_config/dummy_worker.rb
@@ -22,6 +22,10 @@ module Gitlab
@attributes[:queue]
end
+ def queue
+ @attributes[:queue]
+ end
+
def queue_namespace
nil
end
diff --git a/lib/gitlab/sidekiq_config/worker.rb b/lib/gitlab/sidekiq_config/worker.rb
index 1e3fb675ca7..1abdcde6a15 100644
--- a/lib/gitlab/sidekiq_config/worker.rb
+++ b/lib/gitlab/sidekiq_config/worker.rb
@@ -9,7 +9,7 @@ module Gitlab
delegate :feature_category_not_owned?, :generated_queue_name, :get_feature_category,
:get_sidekiq_options, :get_tags, :get_urgency, :get_weight,
- :get_worker_resource_boundary, :idempotent?, :queue_namespace,
+ :get_worker_resource_boundary, :idempotent?, :queue_namespace, :queue,
:worker_has_external_dependencies?,
to: :klass
diff --git a/lib/gitlab/sidekiq_middleware/server_metrics.rb b/lib/gitlab/sidekiq_middleware/server_metrics.rb
index f3e1d0af2aa..dc5481289da 100644
--- a/lib/gitlab/sidekiq_middleware/server_metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/server_metrics.rb
@@ -43,7 +43,7 @@ module Gitlab
metrics[:sidekiq_concurrency].set({}, Sidekiq.options[:concurrency].to_i)
- return unless ::Feature.enabled?(:sidekiq_job_completion_metric_initialize, default_enabled: :yaml)
+ return unless ::Feature.enabled?(:sidekiq_job_completion_metric_initialize)
::Gitlab::SidekiqConfig.current_worker_queue_mappings.each do |worker, queue|
worker_class = worker.safe_constantize
diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb
index 581d6b738f3..b77f48d1a2c 100644
--- a/lib/gitlab/snippet_search_results.rb
+++ b/lib/gitlab/snippet_search_results.rb
@@ -4,10 +4,6 @@ module Gitlab
class SnippetSearchResults < SearchResults
include SnippetsHelper
- def initialize(current_user, query)
- super(current_user, query)
- end
-
def objects(scope, page: nil, per_page: DEFAULT_PER_PAGE, preload_method: nil)
paginated_objects(snippet_titles, page, per_page)
end
diff --git a/lib/gitlab/sourcegraph.rb b/lib/gitlab/sourcegraph.rb
index 892c4468107..8369e6fbe9b 100644
--- a/lib/gitlab/sourcegraph.rb
+++ b/lib/gitlab/sourcegraph.rb
@@ -15,7 +15,7 @@ module Gitlab
def feature_enabled?(actor = nil)
# Some CI jobs grep for Feature.enabled? in our codebase, so it is important this reference stays around.
- Feature.enabled?(:sourcegraph, actor, default_enabled: :yaml)
+ Feature.enabled?(:sourcegraph, actor)
end
private
diff --git a/lib/gitlab/subscription_portal.rb b/lib/gitlab/subscription_portal.rb
index b8d124541f9..7ef1be6ff44 100644
--- a/lib/gitlab/subscription_portal.rb
+++ b/lib/gitlab/subscription_portal.rb
@@ -18,6 +18,10 @@ module Gitlab
"#{self.subscriptions_url}/payment_forms/cc_validation"
end
+ def self.payment_validation_form_id
+ "payment_method_validation"
+ end
+
def self.registration_validation_form_url
"#{self.subscriptions_url}/payment_forms/cc_registration_validation"
end
@@ -75,7 +79,7 @@ module Gitlab
end
def self.renewal_service_email
- 'renewals-support@gitlab.com'
+ 'renewals-service@customers.gitlab.com'
end
end
end
@@ -83,5 +87,6 @@ end
Gitlab::SubscriptionPortal.prepend_mod
Gitlab::SubscriptionPortal::SUBSCRIPTIONS_URL = Gitlab::SubscriptionPortal.subscriptions_url.freeze
Gitlab::SubscriptionPortal::PAYMENT_FORM_URL = Gitlab::SubscriptionPortal.payment_form_url.freeze
+Gitlab::SubscriptionPortal::PAYMENT_VALIDATION_FORM_ID = Gitlab::SubscriptionPortal.payment_validation_form_id.freeze
Gitlab::SubscriptionPortal::RENEWAL_SERVICE_EMAIL = Gitlab::SubscriptionPortal.renewal_service_email.freeze
Gitlab::SubscriptionPortal::REGISTRATION_VALIDATION_FORM_URL = Gitlab::SubscriptionPortal.registration_validation_form_url.freeze
diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb
index 323f59d3373..5496bd5f682 100644
--- a/lib/gitlab/template/gitlab_ci_yml_template.rb
+++ b/lib/gitlab/template/gitlab_ci_yml_template.rb
@@ -4,8 +4,7 @@ module Gitlab
module Template
class GitlabCiYmlTemplate < BaseTemplate
BASE_EXCLUDED_PATTERNS = [%r{\.latest\.}].freeze
-
- TEMPLATES_WITH_LATEST_VERSION = {}.freeze
+ BASE_DIR = 'lib/gitlab/ci/templates'
def description
"# This file is a template, and might need editing before it works on your project."
@@ -45,7 +44,7 @@ module Gitlab
end
def base_dir
- Rails.root.join('lib/gitlab/ci/templates')
+ Rails.root.join(BASE_DIR)
end
def finder(project = nil)
@@ -57,31 +56,6 @@ module Gitlab
excluded_patterns: self.excluded_patterns
)
end
-
- override :find
- def find(key, project = nil)
- if try_redirect_to_latest?(key, project)
- key += '.latest'
- end
-
- super(key, project)
- end
-
- private
-
- # To gauge the impact of the latest template,
- # you can redirect the stable template to the latest template by enabling the feature flag.
- # See https://docs.gitlab.com/ee/development/cicd/templates.html#versioning for more information.
- def try_redirect_to_latest?(key, project)
- return false unless templates_with_latest_version[key]
-
- flag_name = "redirect_to_latest_template_#{key.underscore.tr('/', '_')}"
- ::Feature.enabled?(flag_name, project, default_enabled: :yaml)
- end
-
- def templates_with_latest_version
- TEMPLATES_WITH_LATEST_VERSION
- end
end
end
end
diff --git a/lib/gitlab/testing/clear_process_memory_cache_middleware.rb b/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
index 1e69e5e142d..39bcad271be 100644
--- a/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
+++ b/lib/gitlab/testing/clear_process_memory_cache_middleware.rb
@@ -11,6 +11,8 @@ module Gitlab
Gitlab::ProcessMemoryCache.cache_backend.clear
@app.call(env)
+ ensure
+ Gitlab::ProcessMemoryCache.cache_backend.clear
end
end
end
diff --git a/lib/gitlab/tracking/event_definition.rb b/lib/gitlab/tracking/event_definition.rb
index 8f70c8ecab7..928eb6338f6 100644
--- a/lib/gitlab/tracking/event_definition.rb
+++ b/lib/gitlab/tracking/event_definition.rb
@@ -6,7 +6,6 @@ module Gitlab
class EventDefinition
EVENT_SCHEMA_PATH = Rails.root.join('config', 'events', 'schema.json')
- BASE_REPO_PATH = 'https://gitlab.com/gitlab-org/gitlab/-/blob/master'
SCHEMA = ::JSONSchemer.schema(Pathname.new(EVENT_SCHEMA_PATH))
attr_reader :path
diff --git a/lib/gitlab/untrusted_regexp.rb b/lib/gitlab/untrusted_regexp.rb
index c0730e7bd59..96e74f00c78 100644
--- a/lib/gitlab/untrusted_regexp.rb
+++ b/lib/gitlab/untrusted_regexp.rb
@@ -61,9 +61,9 @@ module Gitlab
def self.with_fallback(pattern, multiline: false)
UntrustedRegexp.new(pattern, multiline: multiline)
rescue RegexpError
- raise if Feature.enabled?(:disable_unsafe_regexp, default_enabled: :yaml)
+ raise if Feature.enabled?(:disable_unsafe_regexp)
- if Feature.enabled?(:ci_unsafe_regexp_logger, type: :ops, default_enabled: :yaml)
+ if Feature.enabled?(:ci_unsafe_regexp_logger, type: :ops)
Gitlab::AppJsonLogger.info(
class: self.name,
regexp: pattern.to_s,
diff --git a/lib/gitlab/url_builder.rb b/lib/gitlab/url_builder.rb
index c00a0e1bcb4..a6d6cffec17 100644
--- a/lib/gitlab/url_builder.rb
+++ b/lib/gitlab/url_builder.rb
@@ -28,6 +28,8 @@ module Gitlab
compare_url(object, **options)
when Group
instance.group_canonical_url(object, **options)
+ when WorkItem
+ instance.work_item_url(object, **options)
when Issue
instance.issue_url(object, **options)
when MergeRequest
diff --git a/lib/gitlab/usage/metric.rb b/lib/gitlab/usage/metric.rb
index 24e044c5740..cf48aa49938 100644
--- a/lib/gitlab/usage/metric.rb
+++ b/lib/gitlab/usage/metric.rb
@@ -18,19 +18,25 @@ module Gitlab
end
def with_value
- unflatten_key_path(intrumentation_object.value)
+ with_availability(proc { instrumentation_object.value })
end
def with_instrumentation
- unflatten_key_path(intrumentation_object.instrumentation)
+ with_availability(proc { instrumentation_object.instrumentation })
end
def with_suggested_name
- unflatten_key_path(intrumentation_object.suggested_name)
+ with_availability(proc { instrumentation_object.suggested_name })
end
private
+ def with_availability(value_proc)
+ return {} unless instrumentation_object.available?
+
+ unflatten_key_path(value_proc.call)
+ end
+
def unflatten_key_path(value)
::Gitlab::Usage::Metrics::KeyPathProcessor.process(definition.key_path, value)
end
@@ -39,8 +45,8 @@ module Gitlab
"Gitlab::Usage::Metrics::Instrumentations::#{definition.instrumentation_class}"
end
- def intrumentation_object
- instrumentation_class.constantize.new(
+ def instrumentation_object
+ @instrumentation_object ||= instrumentation_class.constantize.new(
time_frame: definition.time_frame,
options: definition.attributes[:options]
)
diff --git a/lib/gitlab/usage/metric_definition.rb b/lib/gitlab/usage/metric_definition.rb
index 1031f38792b..2c50678c6bf 100644
--- a/lib/gitlab/usage/metric_definition.rb
+++ b/lib/gitlab/usage/metric_definition.rb
@@ -4,9 +4,9 @@ module Gitlab
module Usage
class MetricDefinition
METRIC_SCHEMA_PATH = Rails.root.join('config', 'metrics', 'schema.json')
- BASE_REPO_PATH = 'https://gitlab.com/gitlab-org/gitlab/-/blob/master'
SKIP_VALIDATION_STATUSES = %w[deprecated removed].to_set.freeze
- AVAILABLE_STATUSES = %w[active data_available implemented deprecated].freeze
+ AVAILABLE_STATUSES = %w[active data_available implemented deprecated].to_set.freeze
+ VALID_SERVICE_PING_STATUSES = %w[active data_available implemented deprecated broken].to_set.freeze
InvalidError = Class.new(RuntimeError)
@@ -26,20 +26,22 @@ module Gitlab
attributes
end
+ def json_schema
+ return unless has_json_schema?
+
+ @json_schema ||= Gitlab::Json.parse(File.read(json_schema_path))
+ end
+
def json_schema_path
return '' unless has_json_schema?
- "#{BASE_REPO_PATH}/#{attributes[:value_json_schema]}"
+ Rails.root.join(attributes[:value_json_schema])
end
def has_json_schema?
attributes[:value_type] == 'object' && attributes[:value_json_schema].present?
end
- def yaml_path
- "#{BASE_REPO_PATH}#{path.delete_prefix(Rails.root.to_s)}"
- end
-
def validate!
unless skip_validation?
self.class.schemer.validate(attributes.stringify_keys).each do |error|
@@ -64,6 +66,10 @@ module Gitlab
AVAILABLE_STATUSES.include?(attributes[:status])
end
+ def valid_service_ping_status?
+ VALID_SERVICE_PING_STATUSES.include?(attributes[:status])
+ end
+
alias_method :to_dictionary, :to_h
class << self
diff --git a/lib/gitlab/usage/metrics/aggregates/aggregate.rb b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
index 2545a505984..11e2fd22638 100644
--- a/lib/gitlab/usage/metrics/aggregates/aggregate.rb
+++ b/lib/gitlab/usage/metrics/aggregates/aggregate.rb
@@ -30,7 +30,7 @@ module Gitlab
def aggregated_metrics_data(start_date:, end_date:, time_frame:)
aggregated_metrics.each_with_object({}) do |aggregation, data|
- next if aggregation[:feature_flag] && Feature.disabled?(aggregation[:feature_flag], default_enabled: :yaml, type: :development)
+ next if aggregation[:feature_flag] && Feature.disabled?(aggregation[:feature_flag], type: :development)
next unless aggregation[:time_frame].include?(time_frame)
case aggregation[:source]
diff --git a/lib/gitlab/usage/metrics/instrumentations/base_metric.rb b/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
index a264f9484f3..f76ed1753b2 100644
--- a/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/base_metric.rb
@@ -11,6 +11,18 @@ module Gitlab
attr_reader :time_frame
attr_reader :options
+ class << self
+ def available?(&block)
+ return @metric_available = block if block_given?
+
+ return @metric_available.call if instance_variable_defined?('@metric_available')
+
+ true
+ end
+
+ attr_reader :metric_available
+ end
+
def initialize(time_frame:, options: {})
@time_frame = time_frame
@options = options
@@ -19,6 +31,10 @@ module Gitlab
def instrumentation
value
end
+
+ def available?
+ self.class.available?
+ end
end
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/cert_based_clusters_ff_metric.rb b/lib/gitlab/usage/metrics/instrumentations/cert_based_clusters_ff_metric.rb
index 6df6fef5d3a..d42250c9297 100644
--- a/lib/gitlab/usage/metrics/instrumentations/cert_based_clusters_ff_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/cert_based_clusters_ff_metric.rb
@@ -6,7 +6,7 @@ module Gitlab
module Instrumentations
class CertBasedClustersFfMetric < GenericMetric
value do
- Feature.enabled?(:certificate_based_clusters, default_enabled: :yaml, type: :ops)
+ Feature.enabled?(:certificate_based_clusters, type: :ops)
end
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb b/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb
index ee51180973c..51be4bf3ccf 100644
--- a/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric.rb
@@ -6,7 +6,7 @@ module Gitlab
module Instrumentations
class CollectedDataCategoriesMetric < GenericMetric
value do
- ::ServicePing::PermitDataCategoriesService.new.execute.to_a
+ ::ServicePing::PermitDataCategories.new.execute.to_a
end
end
end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric.rb
new file mode 100644
index 00000000000..c0d53b1b21a
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountBulkImportsEntitiesMetric < DatabaseMetric
+ operation :count
+
+ def initialize(time_frame:, options: {})
+ super
+
+ if source_type.present? && !source_type.in?(allowed_source_types)
+ raise ArgumentError, "source_type '#{source_type}' must be one of: #{allowed_source_types.join(', ')}"
+ end
+ end
+
+ relation { ::BulkImports::Entity }
+
+ private
+
+ def relation
+ return super.where(source_type: source_type) if source_type.present? # rubocop: disable CodeReuse/ActiveRecord
+
+ super
+ end
+
+ def source_type
+ options[:source_type].to_s
+ end
+
+ def allowed_source_types
+ BulkImports::Entity.source_types.keys.map(&:to_s)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric.rb b/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric.rb
new file mode 100644
index 00000000000..c5498ce530f
--- /dev/null
+++ b/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module Metrics
+ module Instrumentations
+ class CountImportedProjectsMetric < DatabaseMetric
+ operation :count
+
+ def initialize(time_frame:, options: {})
+ super
+
+ raise ArgumentError, "import_type options attribute is required" unless import_type.present?
+ end
+
+ relation { ::Project }
+
+ start do |time_constraints|
+ unless time_constraints.nil?
+ start = time_constraints[:created_at]&.first
+
+ unless start.nil?
+ ::Project
+ .select(:id)
+ .where(Project.arel_table[:created_at].gteq(start)) # rubocop:disable UsageData/LargeTable
+ .order(created_at: :asc).limit(1).first&.id
+ end
+ end
+ end
+
+ finish do |time_constraints|
+ unless time_constraints.nil?
+ finish = time_constraints[:created_at]&.last
+
+ unless finish.nil?
+ ::Project
+ .select(:id)
+ .where(Project.arel_table[:created_at].lteq(finish)) # rubocop:disable UsageData/LargeTable
+ .order(created_at: :desc).limit(1).first&.id
+ end
+ end
+ end
+
+ private
+
+ def relation
+ super.imported_from(import_type) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ def import_type
+ options[:import_type]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/metrics/instrumentations/database_metric.rb b/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
index 34a8bfd08b5..a000b4509c6 100644
--- a/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
+++ b/lib/gitlab/usage/metrics/instrumentations/database_metric.rb
@@ -14,7 +14,14 @@ module Gitlab
# ::Issue.where(database_time_constraints)
# end
# end
+
+ UnimplementedOperationError = Class.new(StandardError) # rubocop:disable UsageData/InstrumentationSuperclass
+
class << self
+ IMPLEMENTED_OPERATIONS = %i(count distinct_count estimate_batch_distinct_count).freeze
+
+ private_constant :IMPLEMENTED_OPERATIONS
+
def start(&block)
return @metric_start&.call unless block_given?
@@ -40,6 +47,8 @@ module Gitlab
end
def operation(symbol, column: nil, &block)
+ raise UnimplementedOperationError unless symbol.in?(IMPLEMENTED_OPERATIONS)
+
@metric_operation = symbol
@column = column
@metric_operation_block = block if block_given?
@@ -82,6 +91,14 @@ module Gitlab
private
+ def start
+ self.class.metric_start&.call(time_constraints)
+ end
+
+ def finish
+ self.class.metric_finish&.call(time_constraints)
+ end
+
def relation
self.class.metric_relation.call.where(time_constraints)
end
@@ -100,19 +117,19 @@ module Gitlab
end
def get_or_cache_batch_ids
- return [self.class.start, self.class.finish] unless self.class.cache_key.present?
+ return [start, finish] unless self.class.cache_key.present?
key_name = "metric_instrumentation/#{self.class.cache_key}"
- start = Gitlab::Cache.fetch_once("#{key_name}_minimum_id", expires_in: 1.day) do
- self.class.start
+ cached_start = Gitlab::Cache.fetch_once("#{key_name}_minimum_id", expires_in: 1.day) do
+ start
end
- finish = Gitlab::Cache.fetch_once("#{key_name}_maximum_id", expires_in: 1.day) do
- self.class.finish
+ cached_finish = Gitlab::Cache.fetch_once("#{key_name}_maximum_id", expires_in: 1.day) do
+ finish
end
- [start, finish]
+ [cached_start, cached_finish]
end
end
end
diff --git a/lib/gitlab/usage/metrics/query.rb b/lib/gitlab/usage/metrics/query.rb
index f6947c4c8ff..851aa7a50e8 100644
--- a/lib/gitlab/usage/metrics/query.rb
+++ b/lib/gitlab/usage/metrics/query.rb
@@ -61,9 +61,31 @@ module Gitlab
end
# rubocop: enable CodeReuse/ActiveRecord
+ # rubocop: disable CodeReuse/ActiveRecord
def raw_sql(relation, column, distinct = false)
column ||= relation.primary_key
- relation.select(relation.all.table[column].count(distinct)).to_sql
+ node = node_to_count(relation, column)
+
+ relation.unscope(:order).select(node.count(distinct)).to_sql
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def node_to_count(relation, column)
+ if join_relation?(relation) && joined_column?(column)
+ table_name, column_name = column.split(".")
+ Arel::Table.new(table_name)[column_name]
+ else
+ relation.all.table[column]
+ end
+ end
+
+ def join_relation?(relation)
+ relation.is_a?(ActiveRecord::Relation) && relation.joins_values.present?
+ end
+
+ # checks if the passed column is of format "table.column"
+ def joined_column?(column)
+ column.is_a?(String) && column.include?(".")
end
end
end
diff --git a/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb b/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb
new file mode 100644
index 00000000000..e32dcd3777b
--- /dev/null
+++ b/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Usage
+ module ServicePing
+ class LegacyMetricTimingDecorator < SimpleDelegator
+ attr_reader :duration
+
+ delegate :class, :is_a?, :kind_of?, to: :__getobj__
+
+ def initialize(value, duration)
+ @duration = duration
+ super(value)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage/service_ping_report.rb b/lib/gitlab/usage/service_ping_report.rb
index 3e653b186a0..e73200cbd4a 100644
--- a/lib/gitlab/usage/service_ping_report.rb
+++ b/lib/gitlab/usage/service_ping_report.rb
@@ -3,6 +3,8 @@
module Gitlab
module Usage
class ServicePingReport
+ CACHE_KEY = 'usage_data'
+
class << self
def for(output:, cached: false)
case output.to_sym
@@ -26,7 +28,7 @@ module Gitlab
end
def all_metrics_values(cached)
- Rails.cache.fetch('usage_data', force: !cached, expires_in: 2.weeks) do
+ Rails.cache.fetch(CACHE_KEY, force: !cached, expires_in: 2.weeks) do
Gitlab::UsageData.data
end
end
diff --git a/lib/gitlab/usage_counters/common.rb b/lib/gitlab/usage_counters/common.rb
deleted file mode 100644
index a5bdac430f4..00000000000
--- a/lib/gitlab/usage_counters/common.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module UsageCounters
- class Common
- class << self
- def increment(project_id)
- Gitlab::Redis::SharedState.with { |redis| redis.hincrby(base_key, project_id, 1) }
- end
-
- def usage_totals
- Gitlab::Redis::SharedState.with do |redis|
- total_sum = 0
-
- totals = redis.hgetall(base_key).each_with_object({}) do |(project_id, count), result|
- total_sum += result[project_id.to_i] = count.to_i
- end
-
- totals[:total] = total_sum
- totals
- end
- end
-
- def base_key
- raise NotImplementedError
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/usage_counters/pod_logs.rb b/lib/gitlab/usage_counters/pod_logs.rb
deleted file mode 100644
index 94e29d2fad7..00000000000
--- a/lib/gitlab/usage_counters/pod_logs.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module UsageCounters
- class PodLogs < Common
- def self.base_key
- 'POD_LOGS_USAGE_COUNTS'
- end
- end
- end
-end
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index b465d4bcc9b..7a17288e5e5 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -9,7 +9,7 @@
# active_user_count: count(User.active)
# alt_usage_data { Gitlab::VERSION }
# redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-# redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
+# redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_expanding_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
# NOTE:
# Implementing metrics direct in `usage_data.rb` is deprecated,
@@ -308,7 +308,7 @@ module Gitlab
Settings[component]['object_store']
end
- if config
+ if config.present?
{
enabled: alt_usage_data { Settings[component]['enabled'] },
object_store: {
@@ -684,6 +684,17 @@ module Gitlab
.merge!(ide_monthly_active_users(date_range))
end
+ def with_duration
+ return yield unless Feature.enabled?(:measure_service_ping_metric_collection)
+
+ result = nil
+ duration = Benchmark.realtime do
+ result = yield
+ end
+
+ ::Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator.new(result, duration)
+ end
+
private
def stage_manage_events(time_period)
@@ -855,16 +866,17 @@ module Gitlab
end
def project_imports(time_period)
+ time_frame = metric_time_period(time_period)
counters = {
- gitlab_project: projects_imported_count('gitlab_project', time_period),
- gitlab: projects_imported_count('gitlab', time_period),
- github: projects_imported_count('github', time_period),
- bitbucket: projects_imported_count('bitbucket', time_period),
- bitbucket_server: projects_imported_count('bitbucket_server', time_period),
- gitea: projects_imported_count('gitea', time_period),
- git: projects_imported_count('git', time_period),
- manifest: projects_imported_count('manifest', time_period),
- gitlab_migration: count(::BulkImports::Entity.where(time_period).project_entity) # rubocop: disable CodeReuse/ActiveRecord
+ gitlab_project: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'gitlab_project' }),
+ gitlab: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'gitlab' }),
+ github: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'github' }),
+ bitbucket: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'bitbucket' }),
+ bitbucket_server: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'bitbucket_server' }),
+ gitea: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'gitea' }),
+ git: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'git' }),
+ manifest: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'manifest' }),
+ gitlab_migration: add_metric('CountBulkImportsEntitiesMetric', time_frame: time_frame, options: { source_type: :project_entity })
}
counters[:total] = add(*counters.values)
@@ -872,46 +884,21 @@ module Gitlab
counters
end
- def projects_imported_count(from, time_period)
- # rubocop:disable CodeReuse/ActiveRecord
- relation = ::Project.imported_from(from).where.not(import_type: nil) # rubocop:disable UsageData/LargeTable
- if time_period.empty?
- count(relation)
- else
- @project_import_id ||= {}
- start = time_period[:created_at].first
- finish = time_period[:created_at].last
-
- # can be nil values here if no records are in our range and it is possible the same instance
- # is called with different time periods since it is passed in as a variable
- unless @project_import_id.key?(start)
- @project_import_id[start] = ::Project.select(:id).where(Project.arel_table[:created_at].gteq(start)) # rubocop:disable UsageData/LargeTable
- .order(created_at: :asc).limit(1).first&.id
- end
-
- unless @project_import_id.key?(finish)
- @project_import_id[finish] = ::Project.select(:id).where(Project.arel_table[:created_at].lteq(finish)) # rubocop:disable UsageData/LargeTable
- .order(created_at: :desc).limit(1).first&.id
- end
-
- count(relation, start: @project_import_id[start], finish: @project_import_id[finish])
- end
- # rubocop:enable CodeReuse/ActiveRecord
- end
-
def issue_imports(time_period)
+ time_frame = metric_time_period(time_period)
{
jira: count(::JiraImportState.where(time_period)), # rubocop: disable CodeReuse/ActiveRecord
- fogbugz: projects_imported_count('fogbugz', time_period),
- phabricator: projects_imported_count('phabricator', time_period),
+ fogbugz: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'fogbugz' }),
+ phabricator: add_metric('CountImportedProjectsMetric', time_frame: time_frame, options: { import_type: 'phabricator' }),
csv: count(::Issues::CsvImport.where(time_period)) # rubocop: disable CodeReuse/ActiveRecord
}
end
def group_imports(time_period)
+ time_frame = metric_time_period(time_period)
{
group_import: count(::GroupImportState.where(time_period)), # rubocop: disable CodeReuse/ActiveRecord
- gitlab_migration: count(::BulkImports::Entity.where(time_period).group_entity) # rubocop: disable CodeReuse/ActiveRecord
+ gitlab_migration: add_metric('CountBulkImportsEntitiesMetric', time_frame: time_frame, options: { source_type: :group_entity })
}
end
diff --git a/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb b/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
index cf3caf3f0c7..61c071c8738 100644
--- a/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/ci_template_unique_counter.rb
@@ -15,7 +15,7 @@ module Gitlab::UsageDataCounters
)
namespace = project.namespace
- if Feature.enabled?(:route_hll_to_snowplow, namespace, default_enabled: :yaml)
+ if Feature.enabled?(:route_hll_to_snowplow, namespace)
Gitlab::Tracking.event(name, 'ci_templates_unique', namespace: namespace, user: user, project: project)
end
end
diff --git a/lib/gitlab/usage_data_counters/editor_unique_counter.rb b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
index bc0126cd893..f97ebdccecf 100644
--- a/lib/gitlab/usage_data_counters/editor_unique_counter.rb
+++ b/lib/gitlab/usage_data_counters/editor_unique_counter.rb
@@ -8,6 +8,7 @@ module Gitlab
EDIT_BY_WEB_IDE = 'g_edit_by_web_ide'
EDIT_BY_SSE = 'g_edit_by_sse'
EDIT_CATEGORY = 'ide_edit'
+ EDIT_BY_LIVE_PREVIEW = 'g_edit_by_live_preview'
class << self
def track_web_ide_edit_action(author:, time: Time.zone.now)
@@ -47,6 +48,10 @@ module Gitlab
count_unique(EDIT_BY_SSE, 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)
+ end
+
private
def track_unique_action(action, author, time)
diff --git a/lib/gitlab/usage_data_counters/hll_redis_counter.rb b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
index 3b34cd77cf5..0ace6e99c59 100644
--- a/lib/gitlab/usage_data_counters/hll_redis_counter.rb
+++ b/lib/gitlab/usage_data_counters/hll_redis_counter.rb
@@ -185,7 +185,7 @@ module Gitlab
def feature_enabled?(event)
return true if event[:feature_flag].blank?
- Feature.enabled?(event[:feature_flag], default_enabled: :yaml) && Feature.enabled?(:redis_hll_tracking, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(event[:feature_flag]) && Feature.enabled?(:redis_hll_tracking, type: :ops)
end
# Allow to add totals for events that are in the same redis slot, category and have the same aggregation level
diff --git a/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter.rb b/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter.rb
new file mode 100644
index 00000000000..a34ae909c82
--- /dev/null
+++ b/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# noinspection RubyConstantNamingConvention
+module Gitlab
+ module UsageDataCounters
+ module IpynbDiffActivityCounter
+ NOTE_CREATED_IN_IPYNB_DIFF_ACTION = 'i_code_review_create_note_in_ipynb_diff'
+ USER_CREATED_NOTE_IN_IPYNB_DIFF_ACTION = 'i_code_review_user_create_note_in_ipynb_diff'
+ NOTE_CREATED_IN_IPYNB_DIFF_MR_ACTION = 'i_code_review_create_note_in_ipynb_diff_mr'
+ USER_CREATED_NOTE_IN_IPYNB_DIFF_MR_ACTION = 'i_code_review_user_create_note_in_ipynb_diff_mr'
+ NOTE_CREATED_IN_IPYNB_DIFF_COMMIT_ACTION = 'i_code_review_create_note_in_ipynb_diff_commit'
+ USER_CREATED_NOTE_IN_IPYNB_DIFF_COMMIT_ACTION = 'i_code_review_user_create_note_in_ipynb_diff_commit'
+
+ class << self
+ def note_created(note)
+ return unless note.for_merge_request? || note.for_commit?
+
+ if note.for_merge_request?
+ track(NOTE_CREATED_IN_IPYNB_DIFF_MR_ACTION, USER_CREATED_NOTE_IN_IPYNB_DIFF_MR_ACTION, note)
+ else
+ track(NOTE_CREATED_IN_IPYNB_DIFF_COMMIT_ACTION, USER_CREATED_NOTE_IN_IPYNB_DIFF_COMMIT_ACTION, note)
+ end
+
+ track(NOTE_CREATED_IN_IPYNB_DIFF_ACTION, USER_CREATED_NOTE_IN_IPYNB_DIFF_ACTION, note)
+ end
+
+ private
+
+ def track(action, per_user_action, note)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_usage_event(action, note.id)
+ Gitlab::UsageDataCounters::HLLRedisCounter.track_usage_event(per_user_action, note.author_id)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
index f179f6d679d..3b883e505f8 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml
@@ -127,6 +127,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_security_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_security_dependency_scanning
category: ci_templates
redis_slot: ci_templates
@@ -147,10 +151,6 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_security_cluster_image_scanning
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
- name: p_ci_templates_qualys_iac_security
category: ci_templates
redis_slot: ci_templates
@@ -187,6 +187,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_liquibase
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_flutter
category: ci_templates
redis_slot: ci_templates
@@ -207,10 +211,6 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_managed_cluster_applications
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
- name: p_ci_templates_php
category: ci_templates
redis_slot: ci_templates
@@ -231,10 +231,6 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_serverless
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
- name: p_ci_templates_go
category: ci_templates
redis_slot: ci_templates
@@ -255,6 +251,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_matlab
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_deploy_ecs
category: ci_templates
redis_slot: ci_templates
@@ -331,6 +331,18 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_jobs_sast_latest
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
+- name: p_ci_templates_jobs_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
+- name: p_ci_templates_jobs_secret_detection_latest
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_jobs_dependency_scanning
category: ci_templates
redis_slot: ci_templates
@@ -523,6 +535,18 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_implicit_jobs_sast_latest
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
+- name: p_ci_templates_implicit_jobs_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
+- name: p_ci_templates_implicit_jobs_secret_detection_latest
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_implicit_jobs_dependency_scanning
category: ci_templates
redis_slot: ci_templates
@@ -595,6 +619,10 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
+- name: p_ci_templates_implicit_security_sast_iac
+ category: ci_templates
+ redis_slot: ci_templates
+ aggregation: weekly
- name: p_ci_templates_implicit_security_dependency_scanning
category: ci_templates
redis_slot: ci_templates
@@ -615,15 +643,3 @@
category: ci_templates
redis_slot: ci_templates
aggregation: weekly
-- name: p_ci_templates_implicit_security_cluster_image_scanning
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-- name: p_ci_templates_liquibase
- category: ci_templates
- redis_slot: ci_templates
- aggregation: weekly
-- name: p_ci_templates_matlab
- category: ci_templates
- redis_slot: ci_templates
- 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 63498a35858..5159dcf62ab 100644
--- a/lib/gitlab/usage_data_counters/known_events/ci_users.yml
+++ b/lib/gitlab/usage_data_counters/known_events/ci_users.yml
@@ -2,4 +2,4 @@
category: ci_users
redis_slot: ci_users
aggregation: weekly
- feature_flag: job_deployment_count
+ feature_flag:
diff --git a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
index df2864bba89..e3bb3f6fef3 100644
--- a/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/code_review_events.yml
@@ -173,6 +173,30 @@
redis_slot: code_review
category: code_review
aggregation: weekly
+- name: i_code_review_create_note_in_ipynb_diff
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+- name: i_code_review_user_create_note_in_ipynb_diff
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+- name: i_code_review_create_note_in_ipynb_diff_mr
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+- name: i_code_review_user_create_note_in_ipynb_diff_mr
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+- name: i_code_review_create_note_in_ipynb_diff_commit
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
+- name: i_code_review_user_create_note_in_ipynb_diff_commit
+ redis_slot: code_review
+ category: code_review
+ aggregation: weekly
# Diff settings events
- name: i_code_review_click_diff_view_setting
redis_slot: code_review
@@ -234,6 +258,7 @@
redis_slot: code_review
category: code_review
aggregation: weekly
+ feature_flag: usage_data_diff_searches
- name: i_code_review_total_suggestions_applied
redis_slot: code_review
category: code_review
diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml
index 0d89a5181ec..448ed4c66e1 100644
--- a/lib/gitlab/usage_data_counters/known_events/common.yml
+++ b/lib/gitlab/usage_data_counters/known_events/common.yml
@@ -40,6 +40,11 @@
redis_slot: edit
expiry: 29
aggregation: daily
+- name: g_edit_by_live_preview
+ category: ide_edit
+ redis_slot: edit
+ expiry: 29
+ aggregation: daily
- name: i_search_total
category: search
redis_slot: search
diff --git a/lib/gitlab/usage_data_counters/known_events/epic_events.yml b/lib/gitlab/usage_data_counters/known_events/epic_events.yml
index 82787b7bf29..dd6625a9cc9 100644
--- a/lib/gitlab/usage_data_counters/known_events/epic_events.yml
+++ b/lib/gitlab/usage_data_counters/known_events/epic_events.yml
@@ -218,3 +218,10 @@
redis_slot: project_management
aggregation: daily
feature_flag: track_epics_activity
+
+- name: g_project_management_epic_blocked_removed
+ category: epics_usage
+ redis_slot: project_management
+ aggregation: daily
+ feature_flag: track_epics_activity
+
diff --git a/lib/gitlab/usage_data_non_sql_metrics.rb b/lib/gitlab/usage_data_non_sql_metrics.rb
index 1661a1b6987..79d4b45a1ce 100644
--- a/lib/gitlab/usage_data_non_sql_metrics.rb
+++ b/lib/gitlab/usage_data_non_sql_metrics.rb
@@ -31,6 +31,10 @@ module Gitlab
SQL_METRIC_DEFAULT
end
+ def add(*args)
+ SQL_METRIC_DEFAULT
+ end
+
def maximum_id(model, column = nil)
end
diff --git a/lib/gitlab/usage_data_queries.rb b/lib/gitlab/usage_data_queries.rb
index 977cc3549d8..b2d74b1f0dd 100644
--- a/lib/gitlab/usage_data_queries.rb
+++ b/lib/gitlab/usage_data_queries.rb
@@ -5,6 +5,10 @@ module Gitlab
# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41091
class UsageDataQueries < UsageData
class << self
+ def with_duration
+ yield
+ end
+
def add_metric(metric, time_frame: 'none', options: {})
metric_class = "Gitlab::Usage::Metrics::Instrumentations::#{metric}".constantize
diff --git a/lib/gitlab/user_access.rb b/lib/gitlab/user_access.rb
index a4a1cccf9d5..c2f61741cc5 100644
--- a/lib/gitlab/user_access.rb
+++ b/lib/gitlab/user_access.rb
@@ -103,9 +103,7 @@ module Gitlab
def branch_allows_collaboration_for?(ref)
return false if skip_collaboration_check
- # Checking for an internal project or group to prevent an infinite loop:
- # https://gitlab.com/gitlab-org/gitlab/issues/36805
- (!project.internal? && project.branch_allows_collaboration?(user, ref))
+ project.branch_allows_collaboration?(user, ref)
end
def permission_cache
diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb
index 816ede4136a..a67a0758257 100644
--- a/lib/gitlab/utils.rb
+++ b/lib/gitlab/utils.rb
@@ -128,10 +128,6 @@ module Gitlab
end
end
- def random_string
- Random.rand(Float::MAX.to_i).to_s(36)
- end
-
# Behaves like `which` on Linux machines: given PATH, try to resolve the given
# executable name to an absolute path, or return nil.
#
diff --git a/lib/gitlab/utils/usage_data.rb b/lib/gitlab/utils/usage_data.rb
index 6c182f98dd0..633f4683b6b 100644
--- a/lib/gitlab/utils/usage_data.rb
+++ b/lib/gitlab/utils/usage_data.rb
@@ -31,7 +31,7 @@
#
# Examples:
# redis_usage_data(Gitlab::UsageDataCounters::WikiPageCounter)
-# redis_usage_data { ::Gitlab::UsageCounters::PodLogs.usage_totals[:total] }
+# redis_usage_data { Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(event_names: 'users_expanding_vulnerabilities', start_date: 28.days.ago, end_date: Date.current) }
module Gitlab
module Utils
@@ -44,57 +44,64 @@ module Gitlab
DISTRIBUTED_HLL_FALLBACK = -2
MAX_BUCKET_SIZE = 100
+ def with_duration
+ yield
+ end
+
def add_metric(metric, time_frame: 'none', options: {})
metric_class = "Gitlab::Usage::Metrics::Instrumentations::#{metric}".constantize
metric_class.new(time_frame: time_frame, options: options).value
end
- def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
- if batch
- Gitlab::Database::BatchCount.batch_count(relation, column, batch_size: batch_size, start: start, finish: finish)
- else
- relation.count
+ def count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil, start_at: Time.current)
+ with_duration do
+ if batch
+ Gitlab::Database::BatchCount.batch_count(relation, column, batch_size: batch_size, start: start, finish: finish)
+ else
+ relation.count
+ end
+ rescue ActiveRecord::StatementInvalid => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ FALLBACK
end
- rescue ActiveRecord::StatementInvalid => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- FALLBACK
end
def distinct_count(relation, column = nil, batch: true, batch_size: nil, start: nil, finish: nil)
- if batch
- Gitlab::Database::BatchCount.batch_distinct_count(relation, column, batch_size: batch_size, start: start, finish: finish)
- else
- relation.distinct_count_by(column)
+ with_duration do
+ if batch
+ Gitlab::Database::BatchCount.batch_distinct_count(relation, column, batch_size: batch_size, start: start, finish: finish)
+ else
+ relation.distinct_count_by(column)
+ end
+ rescue ActiveRecord::StatementInvalid => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ FALLBACK
end
- rescue ActiveRecord::StatementInvalid => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- FALLBACK
end
def estimate_batch_distinct_count(relation, column = nil, batch_size: nil, start: nil, finish: nil)
- buckets = Gitlab::Database::PostgresHll::BatchDistinctCounter
- .new(relation, column)
- .execute(batch_size: batch_size, start: start, finish: finish)
+ with_duration do
+ buckets = Gitlab::Database::PostgresHll::BatchDistinctCounter
+ .new(relation, column)
+ .execute(batch_size: batch_size, start: start, finish: finish)
- yield buckets if block_given?
+ yield buckets if block_given?
- buckets.estimated_distinct_count
- rescue ActiveRecord::StatementInvalid => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- FALLBACK
- # catch all rescue should be removed as a part of feature flag rollout issue
- # https://gitlab.com/gitlab-org/gitlab/-/issues/285485
- rescue StandardError => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- DISTRIBUTED_HLL_FALLBACK
+ buckets.estimated_distinct_count
+ rescue ActiveRecord::StatementInvalid => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ FALLBACK
+ end
end
def sum(relation, column, batch_size: nil, start: nil, finish: nil)
- Gitlab::Database::BatchCount.batch_sum(relation, column, batch_size: batch_size, start: start, finish: finish)
- rescue ActiveRecord::StatementInvalid => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- FALLBACK
+ with_duration do
+ Gitlab::Database::BatchCount.batch_sum(relation, column, batch_size: batch_size, start: start, finish: finish)
+ rescue ActiveRecord::StatementInvalid => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ FALLBACK
+ end
end
# We don't support batching with histograms.
@@ -103,103 +110,113 @@ module Gitlab
#
# rubocop: disable CodeReuse/ActiveRecord
def histogram(relation, column, buckets:, bucket_size: buckets.size)
- # Using lambda to avoid exposing histogram specific methods
- parameters_valid = lambda do
- error_message =
- if buckets.first == buckets.last
- 'Lower bucket bound cannot equal to upper bucket bound'
- elsif bucket_size == 0
- 'Bucket size cannot be zero'
- elsif bucket_size > MAX_BUCKET_SIZE
- "Bucket size #{bucket_size} exceeds the limit of #{MAX_BUCKET_SIZE}"
- end
-
- return true unless error_message
-
- exception = ArgumentError.new(error_message)
- exception.set_backtrace(caller)
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception)
+ with_duration do
+ # Using lambda to avoid exposing histogram specific methods
+ parameters_valid = lambda do
+ error_message =
+ if buckets.first == buckets.last
+ 'Lower bucket bound cannot equal to upper bucket bound'
+ elsif bucket_size == 0
+ 'Bucket size cannot be zero'
+ elsif bucket_size > MAX_BUCKET_SIZE
+ "Bucket size #{bucket_size} exceeds the limit of #{MAX_BUCKET_SIZE}"
+ end
+
+ break true unless error_message
+
+ exception = ArgumentError.new(error_message)
+ exception.set_backtrace(caller)
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception)
+
+ false
+ end
- false
+ break HISTOGRAM_FALLBACK unless parameters_valid.call
+
+ count_grouped = relation.group(column).select(Arel.star.count.as('count_grouped'))
+ cte = Gitlab::SQL::CTE.new(:count_cte, count_grouped)
+
+ # For example, 9 segments gives 10 buckets
+ bucket_segments = bucket_size - 1
+
+ width_bucket = Arel::Nodes::NamedFunction
+ .new('WIDTH_BUCKET', [cte.table[:count_grouped], buckets.first, buckets.last, bucket_segments])
+ .as('buckets')
+
+ query = cte
+ .table
+ .project(width_bucket, cte.table[:count])
+ .group('buckets')
+ .order('buckets')
+ .with(cte.to_arel)
+
+ # Return the histogram as a Hash because buckets are unique.
+ relation
+ .connection
+ .exec_query(query.to_sql)
+ .rows
+ .to_h
+ # Keys are converted to strings in Usage Ping JSON
+ .stringify_keys
+ rescue ActiveRecord::StatementInvalid => e
+ Gitlab::AppJsonLogger.error(
+ event: 'histogram',
+ relation: relation.table_name,
+ operation: 'histogram',
+ operation_args: [column, buckets.first, buckets.last, bucket_segments],
+ query: query.to_sql,
+ message: e.message
+ )
+ # Raises error for dev env
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
+ HISTOGRAM_FALLBACK
end
-
- return HISTOGRAM_FALLBACK unless parameters_valid.call
-
- count_grouped = relation.group(column).select(Arel.star.count.as('count_grouped'))
- cte = Gitlab::SQL::CTE.new(:count_cte, count_grouped)
-
- # For example, 9 segments gives 10 buckets
- bucket_segments = bucket_size - 1
-
- width_bucket = Arel::Nodes::NamedFunction
- .new('WIDTH_BUCKET', [cte.table[:count_grouped], buckets.first, buckets.last, bucket_segments])
- .as('buckets')
-
- query = cte
- .table
- .project(width_bucket, cte.table[:count])
- .group('buckets')
- .order('buckets')
- .with(cte.to_arel)
-
- # Return the histogram as a Hash because buckets are unique.
- relation
- .connection
- .exec_query(query.to_sql)
- .rows
- .to_h
- # Keys are converted to strings in Usage Ping JSON
- .stringify_keys
- rescue ActiveRecord::StatementInvalid => e
- Gitlab::AppJsonLogger.error(
- event: 'histogram',
- relation: relation.table_name,
- operation: 'histogram',
- operation_args: [column, buckets.first, buckets.last, bucket_segments],
- query: query.to_sql,
- message: e.message
- )
- # Raises error for dev env
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
- HISTOGRAM_FALLBACK
end
# rubocop: enable CodeReuse/ActiveRecord
def add(*args)
- return -1 if args.any?(&:negative?)
+ with_duration do
+ break -1 if args.any?(&:negative?)
- args.sum
- rescue StandardError => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- FALLBACK
+ args.sum
+ rescue StandardError => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ FALLBACK
+ end
end
def alt_usage_data(value = nil, fallback: FALLBACK, &block)
- if block_given?
- yield
- else
- value
+ with_duration do
+ if block_given?
+ yield
+ else
+ value
+ end
+ rescue StandardError => error
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
+ fallback
end
- rescue StandardError => error
- Gitlab::ErrorTracking.track_and_raise_for_dev_exception(error)
- fallback
end
def redis_usage_data(counter = nil, &block)
- if block_given?
- redis_usage_counter(&block)
- elsif counter.present?
- redis_usage_data_totals(counter)
+ with_duration do
+ if block_given?
+ redis_usage_counter(&block)
+ elsif counter.present?
+ redis_usage_data_totals(counter)
+ end
end
end
def with_prometheus_client(fallback: {}, verify: true)
- client = prometheus_client(verify: verify)
- return fallback unless client
+ with_duration do
+ client = prometheus_client(verify: verify)
+ break fallback unless client
- yield client
- rescue StandardError
- fallback
+ yield client
+ rescue StandardError
+ fallback
+ end
end
def measure_duration
@@ -231,25 +248,28 @@ module Gitlab
# rubocop: disable UsageData/LargeTable:
def jira_integration_data
- data = {
- projects_jira_server_active: 0,
- projects_jira_cloud_active: 0
- }
-
- # rubocop: disable CodeReuse/ActiveRecord
- ::Integrations::Jira.active.includes(:jira_tracker_data).find_in_batches(batch_size: 100) do |services|
- counts = services.group_by do |service|
- # TODO: Simplify as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
- service_url = service.data_fields&.url || (service.properties && service.properties['url'])
- service_url&.include?('.atlassian.net') ? :cloud : :server
+ with_duration do
+ data = {
+ projects_jira_server_active: 0,
+ projects_jira_cloud_active: 0
+ }
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ ::Integrations::Jira.active.includes(:jira_tracker_data).find_in_batches(batch_size: 100) do |services|
+ counts = services.group_by do |service|
+ # TODO: Simplify as part of https://gitlab.com/gitlab-org/gitlab/issues/29404
+ service_url = service.data_fields&.url || (service.properties && service.properties['url'])
+ service_url&.include?('.atlassian.net') ? :cloud : :server
+ end
+
+ data[:projects_jira_server_active] += counts[:server].size if counts[:server]
+ data[:projects_jira_cloud_active] += counts[:cloud].size if counts[:cloud]
end
- data[:projects_jira_server_active] += counts[:server].size if counts[:server]
- data[:projects_jira_cloud_active] += counts[:cloud].size if counts[:cloud]
+ data
end
-
- data
end
+
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: enable UsageData/LargeTable:
@@ -263,9 +283,11 @@ module Gitlab
end
def epics_deepest_relationship_level
- # rubocop: disable UsageData/LargeTable
- { epics_deepest_relationship_level: ::Epic.deepest_relationship_level.to_i }
- # rubocop: enable UsageData/LargeTable
+ with_duration do
+ # rubocop: disable UsageData/LargeTable
+ { epics_deepest_relationship_level: ::Epic.deepest_relationship_level.to_i }
+ # rubocop: enable UsageData/LargeTable
+ end
end
private
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb
index 19d30daa577..e81670ce89a 100644
--- a/lib/gitlab/workhorse.rb
+++ b/lib/gitlab/workhorse.rb
@@ -33,8 +33,7 @@ module Gitlab
GitalyServer: {
address: Gitlab::GitalyClient.address(repository.storage),
token: Gitlab::GitalyClient.token(repository.storage),
- features: Feature::Gitaly.server_feature_flags(repository.project),
- sidechannel: Feature.enabled?(:workhorse_use_sidechannel, repository.project, default_enabled: :yaml)
+ features: Feature::Gitaly.server_feature_flags(repository.project)
}
}
@@ -226,6 +225,13 @@ module Gitlab
end
end
+ def detect_content_type
+ [
+ Gitlab::Workhorse::DETECT_HEADER,
+ 'true'
+ ]
+ end
+
protected
# This is the outermost encoding of a senddata: header. It is safe for
diff --git a/lib/gitlab/zentao/client.rb b/lib/gitlab/zentao/client.rb
index 8acfb4913f3..4da4631eecf 100644
--- a/lib/gitlab/zentao/client.rb
+++ b/lib/gitlab/zentao/client.rb
@@ -58,7 +58,7 @@ module Gitlab
def url(path)
host = integration.api_url.presence || integration.url
- URI.join(host, '/api.php/v1/', path)
+ URI.parse(Gitlab::Utils.append_path(host, "api.php/v1/#{path}"))
end
def headers
diff --git a/lib/product_analytics/collector_app.rb b/lib/product_analytics/collector_app.rb
index cf971eef4b6..1008d2f264c 100644
--- a/lib/product_analytics/collector_app.rb
+++ b/lib/product_analytics/collector_app.rb
@@ -14,7 +14,7 @@ module ProductAnalytics
# for project without the feature enabled. During increase of feature adoption, this
# check will be removed for better performance.
project = Project.find(params['aid'].to_i)
- return not_found unless Feature.enabled?(:product_analytics, project, default_enabled: false)
+ return not_found unless Feature.enabled?(:product_analytics, project)
# Snowplow tracker has own format of events.
# We need to convert them to match the schema of our database.
diff --git a/lib/service_ping/build_payload.rb b/lib/service_ping/build_payload.rb
new file mode 100644
index 00000000000..4d3b32a1fc0
--- /dev/null
+++ b/lib/service_ping/build_payload.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class BuildPayload
+ def execute
+ return {} unless ServicePingSettings.product_intelligence_enabled?
+
+ filtered_usage_data
+ end
+
+ private
+
+ def raw_payload
+ @raw_payload ||= ::Gitlab::Usage::ServicePingReport.for(output: :all_metrics_values)
+ end
+
+ def filtered_usage_data(payload = raw_payload, parents = [])
+ return unless payload.is_a?(Hash)
+
+ payload.keep_if do |label, node|
+ key_path = parents.dup.append(label).join('.')
+
+ if has_metric_definition?(key_path)
+ include_metric?(key_path)
+ else
+ filtered_usage_data(node, parents.dup << label) if node.is_a?(Hash)
+ end
+ end
+ end
+
+ def include_metric?(key_path)
+ valid_metric_status?(key_path) && permitted_metric?(key_path)
+ end
+
+ def valid_metric_status?(key_path)
+ metric_definitions[key_path]&.valid_service_ping_status?
+ end
+
+ def permitted_categories
+ @permitted_categories ||= ::ServicePing::PermitDataCategories.new.execute
+ end
+
+ def permitted_metric?(key_path)
+ permitted_categories.include?(metric_category(key_path))
+ end
+
+ def has_metric_definition?(key_path)
+ metric_definitions[key_path].present?
+ end
+
+ def metric_category(key_path)
+ metric_definitions[key_path]
+ &.attributes
+ &.fetch(:data_category, ::ServicePing::PermitDataCategories::OPTIONAL_CATEGORY)
+ end
+
+ def metric_definitions
+ @metric_definitions ||= ::Gitlab::Usage::MetricDefinition.definitions
+ end
+ end
+end
+
+ServicePing::BuildPayload.prepend_mod_with('ServicePing::BuildPayload')
diff --git a/lib/service_ping/devops_report.rb b/lib/service_ping/devops_report.rb
new file mode 100644
index 00000000000..2444dfa1d21
--- /dev/null
+++ b/lib/service_ping/devops_report.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class DevopsReport
+ def initialize(data)
+ @data = data
+ end
+
+ def execute
+ # `conv_index` was previously named `dev_ops_score` in
+ # version-gitlab-com, so we check both for backwards compatibility.
+ metrics = @data['conv_index'] || @data['dev_ops_score']
+
+ # Do not attempt to save a report for the first Service Ping
+ # response for a given GitLab instance, which comes without
+ # metrics.
+ return if metrics.keys == ['usage_data_id']
+
+ report = DevOpsReport::Metric.create(
+ metrics.slice(*DevOpsReport::Metric::METRICS)
+ )
+
+ unless report.persisted?
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(
+ ActiveRecord::RecordInvalid.new(report)
+ )
+ end
+ end
+ end
+end
diff --git a/lib/service_ping/permit_data_categories.rb b/lib/service_ping/permit_data_categories.rb
new file mode 100644
index 00000000000..51eec0808cb
--- /dev/null
+++ b/lib/service_ping/permit_data_categories.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module ServicePing
+ class PermitDataCategories
+ STANDARD_CATEGORY = 'standard'
+ SUBSCRIPTION_CATEGORY = 'subscription'
+ OPERATIONAL_CATEGORY = 'operational'
+ OPTIONAL_CATEGORY = 'optional'
+ CATEGORIES = [
+ STANDARD_CATEGORY,
+ SUBSCRIPTION_CATEGORY,
+ OPERATIONAL_CATEGORY,
+ OPTIONAL_CATEGORY
+ ].to_set.freeze
+
+ def execute
+ return [] unless ServicePingSettings.product_intelligence_enabled?
+
+ CATEGORIES
+ end
+ end
+end
+
+ServicePing::PermitDataCategories.prepend_mod_with('ServicePing::PermitDataCategories')
diff --git a/app/services/service_ping/service_ping_settings.rb b/lib/service_ping/service_ping_settings.rb
index 6964210b1db..6964210b1db 100644
--- a/app/services/service_ping/service_ping_settings.rb
+++ b/lib/service_ping/service_ping_settings.rb
diff --git a/lib/sidebars/groups/menus/ci_cd_menu.rb b/lib/sidebars/groups/menus/ci_cd_menu.rb
index c1d80458f49..0c2995f95e6 100644
--- a/lib/sidebars/groups/menus/ci_cd_menu.rb
+++ b/lib/sidebars/groups/menus/ci_cd_menu.rb
@@ -35,8 +35,7 @@ module Sidebars
end
def show_runners?
- can?(context.current_user, :read_group_runners, context.group) &&
- Feature.enabled?(:runner_list_group_view_vue_ui, context.group, default_enabled: :yaml)
+ can?(context.current_user, :read_group_runners, context.group)
end
end
end
diff --git a/lib/sidebars/groups/menus/kubernetes_menu.rb b/lib/sidebars/groups/menus/kubernetes_menu.rb
index 98ca7865995..0d845978a93 100644
--- a/lib/sidebars/groups/menus/kubernetes_menu.rb
+++ b/lib/sidebars/groups/menus/kubernetes_menu.rb
@@ -23,7 +23,7 @@ module Sidebars
def render?
clusterable = context.group
- Feature.enabled?(:certificate_based_clusters, clusterable, default_enabled: :yaml, type: :ops) &&
+ clusterable.certificate_based_clusters_enabled? &&
can?(context.current_user, :read_cluster, clusterable)
end
diff --git a/lib/sidebars/groups/menus/settings_menu.rb b/lib/sidebars/groups/menus/settings_menu.rb
index 09226256476..18ff3ebc714 100644
--- a/lib/sidebars/groups/menus/settings_menu.rb
+++ b/lib/sidebars/groups/menus/settings_menu.rb
@@ -89,16 +89,10 @@ module Sidebars
end
def ci_cd_menu_item
- active_routes_path = if Feature.enabled?(:runner_list_group_view_vue_ui, context.group, default_enabled: :yaml)
- 'ci_cd#show'
- else
- %w[ci_cd#show groups/runners#show groups/runners#edit]
- end
-
::Sidebars::MenuItem.new(
title: _('CI/CD'),
link: group_settings_ci_cd_path(context.group),
- active_routes: { path: active_routes_path },
+ active_routes: { path: 'ci_cd#show' },
item_id: :ci_cd
)
end
diff --git a/lib/sidebars/projects/menus/infrastructure_menu.rb b/lib/sidebars/projects/menus/infrastructure_menu.rb
index 7bd9ac91efa..a98cc20d51a 100644
--- a/lib/sidebars/projects/menus/infrastructure_menu.rb
+++ b/lib/sidebars/projects/menus/infrastructure_menu.rb
@@ -9,7 +9,6 @@ module Sidebars
return false unless context.project.feature_available?(:operations, context.current_user)
add_item(kubernetes_menu_item)
- add_item(serverless_menu_item)
add_item(terraform_menu_item)
add_item(google_cloud_menu_item)
@@ -63,19 +62,6 @@ module Sidebars
auto_devops_help_path: help_page_path('topics/autodevops/index.md') } }
end
- def serverless_menu_item
- unless Feature.enabled?(:deprecated_serverless, context.project, default_enabled: :yaml, type: :ops) && can?(context.current_user, :read_cluster, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :serverless)
- end
-
- ::Sidebars::MenuItem.new(
- title: _('Serverless platform'),
- link: project_serverless_functions_path(context.project),
- active_routes: { controller: :functions },
- item_id: :serverless
- )
- end
-
def terraform_menu_item
unless can?(context.current_user, :read_terraform_state, context.project)
return ::Sidebars::NilMenuItem.new(item_id: :terraform)
diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb
index 59554726263..c35bc1f5481 100644
--- a/lib/sidebars/projects/menus/monitor_menu.rb
+++ b/lib/sidebars/projects/menus/monitor_menu.rb
@@ -58,7 +58,8 @@ module Sidebars
end
def logs_menu_item
- if !can?(context.current_user, :read_environment, context.project) ||
+ 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
@@ -72,7 +73,8 @@ module Sidebars
end
def tracing_menu_item
- if !can?(context.current_user, :read_environment, context.project) ||
+ 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
diff --git a/lib/sidebars/projects/menus/settings_menu.rb b/lib/sidebars/projects/menus/settings_menu.rb
index 2411ca8263a..2b5b3cdbb22 100644
--- a/lib/sidebars/projects/menus/settings_menu.rb
+++ b/lib/sidebars/projects/menus/settings_menu.rb
@@ -14,9 +14,9 @@ module Sidebars
add_item(access_tokens_menu_item)
add_item(repository_menu_item)
add_item(ci_cd_menu_item)
- add_item(monitor_menu_item)
- add_item(pages_menu_item)
add_item(packages_and_registries_menu_item)
+ add_item(pages_menu_item)
+ add_item(monitor_menu_item)
add_item(usage_quotas_menu_item)
true
@@ -103,16 +103,17 @@ module Sidebars
)
end
- def monitor_menu_item
- if context.project.archived? || !can?(context.current_user, :admin_operations, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :monitor)
+ def packages_and_registries_menu_item
+ if !Gitlab.config.registry.enabled ||
+ !can?(context.current_user, :destroy_container_image, context.project)
+ return ::Sidebars::NilMenuItem.new(item_id: :packages_and_registries)
end
::Sidebars::MenuItem.new(
- title: _('Monitor'),
- link: project_settings_operations_path(context.project),
- active_routes: { path: 'operations#show' },
- item_id: :monitor
+ title: _('Packages & Registries'),
+ link: project_settings_packages_and_registries_path(context.project),
+ active_routes: { path: 'packages_and_registries#index' },
+ item_id: :packages_and_registries
)
end
@@ -129,17 +130,16 @@ module Sidebars
)
end
- def packages_and_registries_menu_item
- if !Gitlab.config.registry.enabled ||
- !can?(context.current_user, :destroy_container_image, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :packages_and_registries)
+ def monitor_menu_item
+ if context.project.archived? || !can?(context.current_user, :admin_operations, context.project)
+ return ::Sidebars::NilMenuItem.new(item_id: :monitor)
end
::Sidebars::MenuItem.new(
- title: _('Packages & Registries'),
- link: project_settings_packages_and_registries_path(context.project),
- active_routes: { path: 'packages_and_registries#index' },
- item_id: :packages_and_registries
+ title: _('Monitor'),
+ link: project_settings_operations_path(context.project),
+ active_routes: { path: 'operations#show' },
+ item_id: :monitor
)
end
diff --git a/lib/sidebars/projects/panel.rb b/lib/sidebars/projects/panel.rb
index 6bb4fb52e2a..1af8e14f034 100644
--- a/lib/sidebars/projects/panel.rb
+++ b/lib/sidebars/projects/panel.rb
@@ -28,9 +28,9 @@ module Sidebars
add_menu(Sidebars::Projects::Menus::CiCdMenu.new(context))
add_menu(Sidebars::Projects::Menus::SecurityComplianceMenu.new(context))
add_menu(Sidebars::Projects::Menus::DeploymentsMenu.new(context))
- add_menu(Sidebars::Projects::Menus::MonitorMenu.new(context))
- add_menu(Sidebars::Projects::Menus::InfrastructureMenu.new(context))
add_menu(Sidebars::Projects::Menus::PackagesRegistriesMenu.new(context))
+ add_menu(Sidebars::Projects::Menus::InfrastructureMenu.new(context))
+ add_menu(Sidebars::Projects::Menus::MonitorMenu.new(context))
add_menu(Sidebars::Projects::Menus::AnalyticsMenu.new(context))
add_wiki_menus
add_menu(Sidebars::Projects::Menus::SnippetsMenu.new(context))
diff --git a/lib/support/systemd/gitlab-sidekiq.service b/lib/support/systemd/gitlab-sidekiq.service
index 81046f5348a..7d09944c862 100644
--- a/lib/support/systemd/gitlab-sidekiq.service
+++ b/lib/support/systemd/gitlab-sidekiq.service
@@ -6,7 +6,7 @@ After=network.target
JoinsNamespaceOf=gitlab-puma.service
[Service]
-Type=simple
+Type=notify
User=git
WorkingDirectory=/home/git/gitlab
Environment=RAILS_ENV=production
@@ -17,6 +17,7 @@ Restart=on-failure
RestartSec=1
SyslogIdentifier=gitlab-sidekiq
Slice=gitlab.slice
+WatchdogSec=10
[Install]
WantedBy=gitlab.target
diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake
index 42b12cd0ae3..08a11100431 100644
--- a/lib/tasks/dev.rake
+++ b/lib/tasks/dev.rake
@@ -58,9 +58,13 @@ namespace :dev do
namespace :copy_db do
ALLOWED_DATABASES = %w[ci].freeze
+ defined_copy_db_tasks = []
+
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
next unless ALLOWED_DATABASES.include?(name)
+ defined_copy_db_tasks << name
+
desc "Copies the #{name} database from the main database"
task name => :environment do
Rake::Task["dev:terminate_all_connections"].invoke
@@ -72,5 +76,16 @@ namespace :dev do
warn "Database '#{db_config.database}' already exists"
end
end
+
+ ALLOWED_DATABASES.each do |name|
+ next if defined_copy_db_tasks.include?(name)
+
+ # :nocov: we cannot mock ActiveRecord::Tasks::DatabaseTasks in time
+ # Workaround for GDK issue, see
+ # https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/1464
+ desc "No-op task"
+ task name
+ # :nocov:
+ end
end
end
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index 3a7e53a27e4..068dc463d16 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -282,7 +282,7 @@ namespace :gitlab do
puts "There are #{Gitlab::Database::Reindexing::QueuedAction.queued.size} queued actions in total."
end
- unless Feature.enabled?(:database_reindexing, type: :ops, default_enabled: :yaml)
+ unless Feature.enabled?(:database_reindexing, type: :ops)
puts <<~NOTE.color(:yellow)
Note: database_reindexing feature is currently disabled.
@@ -328,6 +328,15 @@ namespace :gitlab do
Gitlab::Database::Migrations::Runner.background_migrations.run_jobs(for_duration: duration)
end
+
+ desc 'Sample batched background migrations with instrumentation'
+ task :sample_batched_background_migrations, [:database, :duration_s] => [:environment] do |_t, args|
+ database_name = args[:database] || 'main'
+ duration = args[:duration_s]&.to_i&.seconds || 30.minutes # Default of 30 minutes
+
+ Gitlab::Database::Migrations::Runner.batched_background_migrations(for_database: database_name)
+ .run_jobs(for_duration: duration)
+ end
end
desc 'Run all pending batched migrations'
diff --git a/lib/tasks/gitlab/db/validate_config.rake b/lib/tasks/gitlab/db/validate_config.rake
index cc5f6bb6e09..66aa949cc94 100644
--- a/lib/tasks/gitlab/db/validate_config.rake
+++ b/lib/tasks/gitlab/db/validate_config.rake
@@ -6,7 +6,7 @@ namespace :gitlab do
namespace :db do
desc 'Validates `config/database.yml` to ensure a correct behavior is configured'
task validate_config: :environment do
- original_db_config = ActiveRecord::Base.connection_db_config
+ original_db_config = ActiveRecord::Base.connection_db_config # rubocop:disable Database/MultipleDatabases
# The include_replicas: is a legacy name to fetch all hidden entries (replica: true or database_tasks: false)
# Once we upgrade to Rails 7.x this should be changed to `include_hidden: true`
@@ -15,6 +15,7 @@ namespace :gitlab do
db_configs = db_configs.reject(&:replica?)
# Map each database connection into unique identifier of system+database
+ # rubocop:disable Database/MultipleDatabases
all_connections = db_configs.map do |db_config|
identifier =
begin
@@ -32,6 +33,7 @@ namespace :gitlab do
identifier: identifier
}
end.compact
+ # rubocop:enable Database/MultipleDatabases
unique_connections = all_connections.group_by { |connection| connection[:identifier] }
primary_connection = all_connections.find { |connection| ActiveRecord::Base.configurations.primary?(connection[:name]) }
diff --git a/lib/tasks/gitlab/metrics_exporter.rake b/lib/tasks/gitlab/metrics_exporter.rake
new file mode 100644
index 00000000000..d9dd80b8eeb
--- /dev/null
+++ b/lib/tasks/gitlab/metrics_exporter.rake
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+require_relative Rails.root.join('metrics_server', 'dependencies')
+require_relative Rails.root.join('metrics_server', 'metrics_server')
+
+namespace :gitlab do
+ namespace :metrics_exporter do
+ REPO = 'https://gitlab.com/gitlab-org/gitlab-metrics-exporter.git'
+
+ desc "GitLab | Metrics Exporter | Install or upgrade gitlab-metrics-exporter"
+ task :install, [:dir] => :gitlab_environment do |t, args|
+ unless args.dir.present?
+ abort %(Please specify the directory where you want to install the exporter
+Usage: rake "gitlab:metrics_exporter:install[/installation/dir]")
+ end
+
+ version = ENV['GITLAB_METRICS_EXPORTER_VERSION'] || MetricsServer.version
+ make = Gitlab::Utils.which('gmake') || Gitlab::Utils.which('make')
+
+ abort "Couldn't find a 'make' binary" unless make
+
+ checkout_or_clone_version(version: version, repo: REPO, target_dir: args.dir, clone_opts: %w[--depth 1])
+
+ Dir.chdir(args.dir) { run_command!([make]) }
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/seed/group_seed.rake b/lib/tasks/gitlab/seed/group_seed.rake
index a9a350fb6c3..4f5df7841e2 100644
--- a/lib/tasks/gitlab/seed/group_seed.rake
+++ b/lib/tasks/gitlab/seed/group_seed.rake
@@ -158,7 +158,7 @@ class GroupSeeder
group = Group.find(group_id)
label_title = FFaker::Product.brand
- Labels::CreateService.new(title: label_title, color: "##{Digest::MD5.hexdigest(label_title)[0..5]}").execute(group: group)
+ Labels::CreateService.new(title: label_title, color: "#{::Gitlab::Color.color_for(label_title)}").execute(group: group)
end
end
end
diff --git a/lib/tasks/gitlab/shell.rake b/lib/tasks/gitlab/shell.rake
index b3abc48f8e0..8627a326247 100644
--- a/lib/tasks/gitlab/shell.rake
+++ b/lib/tasks/gitlab/shell.rake
@@ -21,7 +21,6 @@ namespace :gitlab do
config = {
user: Gitlab.config.gitlab.user,
gitlab_url: gitlab_url,
- http_settings: { self_signed_cert: false }.stringify_keys,
auth_file: File.join(user_home, ".ssh", "authorized_keys"),
log_level: "INFO",
audit_usernames: false
diff --git a/lib/tasks/gitlab/tw/codeowners.rake b/lib/tasks/gitlab/tw/codeowners.rake
index 0aed017c84a..6574bfd2549 100644
--- a/lib/tasks/gitlab/tw/codeowners.rake
+++ b/lib/tasks/gitlab/tw/codeowners.rake
@@ -17,16 +17,16 @@ namespace :tw do
CodeOwnerRule.new('Code Review', '@aqualls'),
CodeOwnerRule.new('Compliance', '@eread'),
CodeOwnerRule.new('Composition Analysis', '@rdickenson'),
- CodeOwnerRule.new('Configure', '@marcia'),
+ CodeOwnerRule.new('Configure', '@sselhorn'),
CodeOwnerRule.new('Container Security', '@claytoncornell'),
CodeOwnerRule.new('Contributor Experience', '@eread'),
CodeOwnerRule.new('Conversion', '@kpaizee'),
- CodeOwnerRule.new('Database', '@marcia'),
- CodeOwnerRule.new('Development', '@marcia'),
+ CodeOwnerRule.new('Database', '@aqualls'),
+ CodeOwnerRule.new('Development', '@sselhorn'),
CodeOwnerRule.new('Distribution', '@axil'),
CodeOwnerRule.new('Distribution (Charts)', '@axil'),
CodeOwnerRule.new('Distribution (Omnibus)', '@axil'),
- CodeOwnerRule.new('Documentation Guidelines', '@cnorris'),
+ CodeOwnerRule.new('Documentation Guidelines', '@sselhorn'),
CodeOwnerRule.new('Dynamic Analysis', '@rdickenson'),
CodeOwnerRule.new('Ecosystem', '@kpaizee'),
CodeOwnerRule.new('Editor', '@aqualls'),
@@ -35,13 +35,12 @@ namespace :tw do
CodeOwnerRule.new('Fuzz Testing', '@rdickenson'),
CodeOwnerRule.new('Geo', '@axil'),
CodeOwnerRule.new('Gitaly', '@eread'),
- CodeOwnerRule.new('Global Search', '@marcia'),
+ CodeOwnerRule.new('Global Search', '@sselhorn'),
CodeOwnerRule.new('Import', '@eread'),
- CodeOwnerRule.new('Infrastructure', '@marcia'),
+ CodeOwnerRule.new('Infrastructure', '@sselhorn'),
CodeOwnerRule.new('Integrations', '@kpaizee'),
CodeOwnerRule.new('Knowledge', '@aqualls'),
- CodeOwnerRule.new('License', '@sselhorn'),
- CodeOwnerRule.new('Memory', '@marcia'),
+ CodeOwnerRule.new('Memory', '@sselhorn'),
CodeOwnerRule.new('Monitor', '@msedlakjakubowski'),
CodeOwnerRule.new('Observability', 'msedlakjakubowski'),
CodeOwnerRule.new('Optimize', '@fneill'),
@@ -53,20 +52,20 @@ namespace :tw do
CodeOwnerRule.new('Product Intelligence', '@claytoncornell'),
CodeOwnerRule.new('Product Planning', '@msedlakjakubowski'),
CodeOwnerRule.new('Project Management', '@msedlakjakubowski'),
- CodeOwnerRule.new('Provision', '@sselhorn'),
- CodeOwnerRule.new('Purchase', '@sselhorn'),
+ CodeOwnerRule.new('Provision', '@fneill'),
+ CodeOwnerRule.new('Purchase', '@fneill'),
CodeOwnerRule.new('Redirect', 'Redirect'),
CodeOwnerRule.new('Release', '@rdickenson'),
CodeOwnerRule.new('Respond', '@msedlakjakubowski'),
CodeOwnerRule.new('Runner', '@sselhorn'),
- CodeOwnerRule.new('Sharding', '@marcia'),
+ CodeOwnerRule.new('Sharding', '@sselhorn'),
CodeOwnerRule.new('Source Code', '@aqualls'),
CodeOwnerRule.new('Static Analysis', '@rdickenson'),
CodeOwnerRule.new('Static Site Editor', '@aqualls'),
CodeOwnerRule.new('Style Guide', '@sselhorn'),
CodeOwnerRule.new('Testing', '@eread'),
CodeOwnerRule.new('Threat Insights', '@claytoncornell'),
- CodeOwnerRule.new('Utilization', '@sselhorn'),
+ CodeOwnerRule.new('Utilization', '@fneill'),
CodeOwnerRule.new('Vulnerability Research', '@claytoncornell'),
CodeOwnerRule.new('Workspace', '@fneill')
].freeze
diff --git a/lib/tasks/gitlab/update_templates.rake b/lib/tasks/gitlab/update_templates.rake
index 247897bed0b..07dd5ebeacb 100644
--- a/lib/tasks/gitlab/update_templates.rake
+++ b/lib/tasks/gitlab/update_templates.rake
@@ -79,7 +79,7 @@ namespace :gitlab do
Gitlab::TaskHelpers.run_command!(['tar', 'xf', 'archive.tar.gz'])
extracted_project_basename = Dir['*/'].first
Dir.chdir(extracted_project_basename) do
- Gitlab::TaskHelpers.run_command!(%w(git init))
+ Gitlab::TaskHelpers.run_command!(%w(git init --initial-branch=master))
Gitlab::TaskHelpers.run_command!(%w(git add .))
Gitlab::TaskHelpers.run_command!(['git', 'commit', '--author', 'GitLab <root@localhost>', '--message', commit_message])
diff --git a/lib/tasks/haml-lint.rake b/lib/tasks/haml-lint.rake
index 71e84d3795f..29589571344 100644
--- a/lib/tasks/haml-lint.rake
+++ b/lib/tasks/haml-lint.rake
@@ -2,7 +2,6 @@
unless Rails.env.production?
require 'haml_lint/rake_task'
- require Rails.root.join('haml_lint/inline_javascript')
HamlLint::RakeTask.new
end
diff --git a/locale/am_ET/gitlab.po b/locale/am_ET/gitlab.po
index 6b5a7be6cff..27e9346af61 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d ሰከንድ"
msgstr[1] "%d ሰከንዶች"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} እንደገና á‹á‹­áˆ ለመጫን ይሞ
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 "%{extra} ተጨማሪ downstream pipelines"
@@ -781,9 +774,6 @@ msgstr "%{level_name} በ%{group_level_name} ቡድን á‹áˆµáŒ¥ አይáˆá‰€á‹µ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "የá•áˆ®áŒ€áŠ­á‰± fork áˆáŠ•áŒ­ á‹á‰…ተኛ እይታ ስላለዠ%{level_name} የተከለከለ áŠá‹á¢"
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po
index ea51f7ff683..296ef224185 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:09\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -421,15 +421,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -637,15 +628,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -835,7 +817,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -1000,6 +982,9 @@ 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 ""
@@ -1129,9 +1114,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -1141,9 +1123,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1327,9 +1306,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1687,9 +1663,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1759,6 +1732,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1975,6 +1951,9 @@ msgstr[5] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1987,6 +1966,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -2062,9 +2044,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2110,9 +2089,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -2137,6 +2113,9 @@ 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 ""
@@ -2488,9 +2467,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2506,12 +2482,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2632,9 +2602,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2683,6 +2650,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2842,15 +2812,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -3103,12 +3073,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -3145,6 +3109,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -3157,12 +3124,39 @@ 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 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 ""
@@ -3172,12 +3166,24 @@ 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|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 ""
@@ -3208,18 +3214,39 @@ 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|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 ""
@@ -3229,6 +3256,9 @@ 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|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 ""
@@ -3259,9 +3289,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -4135,6 +4183,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -4150,13 +4201,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -4198,9 +4255,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -4216,9 +4270,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4588,6 +4639,9 @@ 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 ""
@@ -4666,9 +4720,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4735,9 +4786,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4768,6 +4816,9 @@ 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 ""
@@ -4846,12 +4897,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4897,37 +4963,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4936,22 +4999,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -5011,9 +5074,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -5221,15 +5281,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5773,7 +5824,7 @@ 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."
+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"
@@ -5812,6 +5863,9 @@ 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 ""
@@ -5998,7 +6052,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -6151,7 +6205,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -6181,9 +6235,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6289,12 +6340,21 @@ 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|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 ""
@@ -6322,22 +6382,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6352,15 +6418,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6385,9 +6457,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6793,9 +6862,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6853,9 +6919,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6916,6 +6979,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6931,6 +6997,9 @@ 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 ""
@@ -6955,9 +7024,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -7084,9 +7150,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -7102,6 +7165,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -7117,6 +7183,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -7192,7 +7261,7 @@ 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."
+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."
@@ -7360,6 +7429,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7594,9 +7669,15 @@ 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 ""
@@ -7615,6 +7696,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7684,6 +7768,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7912,6 +7999,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7978,6 +8068,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8005,9 +8098,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -8194,6 +8284,15 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8398,6 +8497,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8455,13 +8557,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8470,6 +8572,9 @@ 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 ""
@@ -8491,12 +8596,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8560,13 +8659,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8578,7 +8677,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8602,6 +8701,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8614,9 +8722,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8626,19 +8731,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8647,7 +8755,7 @@ 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}"
+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}."
@@ -8659,21 +8767,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
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 ""
@@ -8692,7 +8794,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8851,9 +8953,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9367,6 +9466,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9400,7 +9502,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9574,9 +9676,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9703,9 +9802,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9808,9 +9904,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -10171,9 +10264,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -10204,9 +10294,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10342,6 +10429,9 @@ 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 ""
@@ -10537,9 +10627,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10576,6 +10663,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10684,9 +10774,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10702,6 +10789,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10744,6 +10834,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -11050,6 +11143,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11536,7 +11632,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11710,6 +11809,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11728,6 +11830,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11737,6 +11842,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -12121,6 +12229,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -12211,25 +12325,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -12250,13 +12364,13 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12538,6 +12652,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12649,6 +12766,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12787,9 +12907,15 @@ 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 ""
@@ -12799,9 +12925,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12817,6 +12940,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -13087,6 +13213,9 @@ 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 ""
@@ -13240,10 +13369,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13642,6 +13777,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13657,6 +13795,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13684,9 +13825,18 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+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 ""
@@ -13729,9 +13879,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13744,6 +13891,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13882,7 +14032,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13969,9 +14119,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -14059,9 +14206,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -14215,6 +14368,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -14269,9 +14425,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14332,9 +14485,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14344,6 +14494,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14440,13 +14593,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14470,18 +14623,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14563,12 +14710,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14614,12 +14755,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14686,7 +14821,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14789,13 +14924,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -15055,6 +15184,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -15079,9 +15211,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -15184,6 +15313,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15439,9 +15571,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15778,6 +15907,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -16081,6 +16213,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -16111,6 +16246,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -16267,7 +16405,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16516,6 +16654,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16543,9 +16684,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16672,9 +16810,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16795,9 +16930,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -17026,6 +17158,24 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -17059,6 +17209,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -17080,6 +17233,12 @@ 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 ""
@@ -17089,9 +17248,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -17104,6 +17278,9 @@ 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 ""
@@ -17125,9 +17302,21 @@ 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 ""
@@ -17137,24 +17326,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -17167,6 +17368,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -17191,21 +17395,39 @@ 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 ""
@@ -17215,6 +17437,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -17227,6 +17452,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -17248,6 +17476,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -17290,6 +17521,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -17317,15 +17551,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17359,6 +17617,12 @@ 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 ""
@@ -17371,9 +17635,21 @@ 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 ""
@@ -17383,12 +17659,18 @@ 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 ""
@@ -17413,6 +17695,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17428,7 +17713,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17584,7 +17869,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17755,6 +18040,15 @@ 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 ""
@@ -18628,9 +18922,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18748,9 +19039,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -19165,6 +19453,9 @@ 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 ""
@@ -19177,9 +19468,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -19336,12 +19624,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19474,6 +19756,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19513,15 +19798,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19534,9 +19816,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19828,9 +20107,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19912,6 +20188,9 @@ 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 ""
@@ -20032,6 +20311,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -20143,6 +20425,9 @@ 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 ""
@@ -20326,9 +20611,15 @@ 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 ""
@@ -20470,6 +20761,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20593,18 +20887,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -21082,9 +21364,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -21127,9 +21406,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -21139,6 +21415,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -21190,6 +21469,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -21265,9 +21547,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21823,12 +22102,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21838,9 +22123,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21964,9 +22255,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -22072,7 +22360,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -22123,9 +22411,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -22207,6 +22492,9 @@ 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 ""
@@ -22261,6 +22549,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -22273,6 +22564,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22816,6 +23110,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22996,6 +23293,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -23005,6 +23305,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -23029,6 +23332,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -23233,10 +23539,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -23284,24 +23587,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23488,9 +23782,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23545,6 +23836,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23848,6 +24142,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23887,6 +24184,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23944,7 +24244,7 @@ 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 28px tall header logo"
+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."
@@ -24211,6 +24511,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -24331,6 +24634,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24577,6 +24883,18 @@ 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 ""
@@ -25099,10 +25417,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -25330,9 +25648,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -25354,12 +25669,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25435,19 +25744,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25552,75 +25861,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25630,87 +25873,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25996,9 +26164,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -26206,9 +26371,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26395,6 +26557,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26431,9 +26596,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26575,6 +26737,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26629,9 +26827,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26674,6 +26869,9 @@ 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 ""
@@ -26830,9 +27028,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26854,22 +27061,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26884,6 +27106,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26917,19 +27142,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26962,6 +27193,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26974,6 +27208,9 @@ 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 ""
@@ -27040,9 +27277,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27487,6 +27721,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27589,9 +27829,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27664,6 +27901,12 @@ 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 ""
@@ -27787,13 +28030,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27880,7 +28123,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -28066,9 +28309,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -28138,6 +28378,12 @@ 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 ""
@@ -28867,6 +29113,9 @@ 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 ""
@@ -28906,9 +29155,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28966,6 +29212,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -29050,6 +29299,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -29059,6 +29314,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -29095,6 +29356,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -29194,9 +29458,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29815,9 +30076,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30445,7 +30703,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31495,9 +31753,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31582,9 +31837,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31693,9 +31945,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -32176,9 +32425,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -32218,9 +32464,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -32332,6 +32575,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -32362,6 +32608,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32536,9 +32785,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32557,9 +32803,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32569,9 +32812,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32611,9 +32851,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32827,9 +33064,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32851,6 +33085,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32980,6 +33217,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -33022,10 +33262,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -33043,9 +33283,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -33112,9 +33349,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -33175,6 +33409,9 @@ 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|Group"
msgstr ""
@@ -33370,6 +33607,9 @@ 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 ""
@@ -33454,9 +33694,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33469,9 +33706,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33982,9 +34216,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -34006,9 +34237,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -34195,6 +34423,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -34210,6 +34441,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -34225,10 +34459,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -34237,16 +34468,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+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|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -34255,7 +34510,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -34273,28 +34528,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -34318,6 +34561,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -34327,6 +34573,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -34336,15 +34585,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -34357,6 +34609,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -34393,6 +34648,9 @@ 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 ""
@@ -34408,6 +34666,9 @@ 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 ""
@@ -34423,6 +34684,9 @@ 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 ""
@@ -34447,10 +34711,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34504,10 +34768,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34726,7 +34990,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34912,6 +35176,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34927,9 +35194,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34972,9 +35236,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -35023,9 +35284,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -35227,13 +35485,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -35383,9 +35641,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -35422,18 +35677,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35536,9 +35785,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -36445,6 +36691,12 @@ 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 ""
@@ -36967,6 +37219,12 @@ 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 ""
@@ -37093,27 +37351,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -37306,6 +37543,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -37321,6 +37564,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -37339,6 +37588,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -37381,7 +37633,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -37390,9 +37642,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -37417,6 +37666,9 @@ 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 ""
@@ -37426,7 +37678,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37489,9 +37744,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37576,9 +37828,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37744,6 +37993,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37957,10 +38209,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -38041,6 +38290,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -38050,9 +38302,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -38314,9 +38563,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38629,9 +38875,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38743,7 +38986,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38923,12 +39166,21 @@ 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 ""
@@ -38980,12 +39232,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -39034,9 +39280,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -39052,9 +39295,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -39298,6 +39538,9 @@ 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 ""
@@ -39409,7 +39652,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39556,9 +39799,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39712,9 +39952,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39883,9 +40120,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -40054,10 +40288,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -40138,6 +40372,9 @@ 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 ""
@@ -40147,6 +40384,9 @@ 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 ""
@@ -40198,9 +40438,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -40447,7 +40684,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40687,7 +40927,7 @@ 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."
+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."
@@ -40726,6 +40966,9 @@ 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 ""
@@ -40768,9 +41011,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40822,9 +41062,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40930,6 +41167,9 @@ 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 ""
@@ -41209,9 +41449,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -41260,9 +41497,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -41368,6 +41602,12 @@ 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 ""
@@ -41377,7 +41617,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -41428,6 +41668,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41476,6 +41719,12 @@ 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 ""
@@ -41488,9 +41737,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41641,7 +41887,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -42037,7 +42283,7 @@ 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."
+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."
@@ -42232,9 +42478,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42790,7 +43033,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42901,9 +43144,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -43051,7 +43291,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -43246,9 +43486,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -43258,9 +43495,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -43288,7 +43522,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -43297,9 +43531,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -43345,7 +43576,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43579,12 +43810,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43594,6 +43831,9 @@ 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 ""
@@ -43609,6 +43849,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43672,6 +43915,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43768,7 +44020,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43939,6 +44191,9 @@ 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 ""
@@ -44317,6 +44572,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44650,15 +44908,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44758,9 +45016,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44818,6 +45073,15 @@ 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 ""
@@ -44959,6 +45223,9 @@ 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 ""
@@ -45715,7 +45982,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45727,6 +45994,12 @@ 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 ""
@@ -45736,6 +46009,12 @@ 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 ""
@@ -45814,9 +46093,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45862,9 +46138,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45979,9 +46252,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46129,6 +46399,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -46144,9 +46417,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -46162,6 +46432,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -46228,9 +46504,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -46372,6 +46645,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/as_IN/gitlab.po b/locale/as_IN/gitlab.po
index 6060f25f386..3aba978f911 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/az_AZ/gitlab.po b/locale/az_AZ/gitlab.po
index 1c92fa9a5f5..dcd233fac6a 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ba_RU/gitlab.po b/locale/ba_RU/gitlab.po
index 29d89739d08..c9a1679428d 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ 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 ""
@@ -694,9 +689,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3500,6 +3558,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,13 +3576,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 ""
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index 89ca0e01668..85912a31a95 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Отказ"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr "Подадено от"
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr "Име на папката"
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr "ОÑвежаването започна уÑпешно"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Шаблон за интервала"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "ИзнеÑените данни на проекта не могат да
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "ИзнеÑените данни на проекта бÑха изтрити."
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "ЗаÑвка за доÑтъп"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr "нова заÑвка за Ñливане"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po
index 760609395e2..49d5d9479e4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po
index 0a719de4492..d3ebdc7c2a1 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/br_FR/gitlab.po b/locale/br_FR/gitlab.po
index cdc2172d971..e9bcf7ce7df 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -382,14 +382,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -574,14 +566,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -754,7 +738,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -913,6 +897,9 @@ 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 ""
@@ -1042,9 +1029,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -1054,9 +1038,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1236,9 +1217,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1585,9 +1563,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1655,6 +1630,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1848,6 +1826,9 @@ msgstr[4] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1860,6 +1841,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1935,9 +1919,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1983,9 +1964,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -2010,6 +1988,9 @@ 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 ""
@@ -2361,9 +2342,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2379,12 +2357,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2505,9 +2477,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2556,6 +2525,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2715,15 +2687,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2976,12 +2948,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -3018,6 +2984,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -3030,12 +2999,39 @@ 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 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 ""
@@ -3045,12 +3041,24 @@ 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|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 ""
@@ -3081,18 +3089,39 @@ 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|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 ""
@@ -3102,6 +3131,9 @@ 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|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 ""
@@ -3132,9 +3164,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -4008,6 +4058,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -4023,13 +4076,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -4071,9 +4130,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -4089,9 +4145,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4461,6 +4514,9 @@ 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 ""
@@ -4538,9 +4594,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4607,9 +4660,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4640,6 +4690,9 @@ 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 ""
@@ -4718,12 +4771,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4767,37 +4835,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4806,22 +4871,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4880,9 +4945,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -5086,15 +5148,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5635,7 +5688,7 @@ 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."
+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"
@@ -5674,6 +5727,9 @@ 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 ""
@@ -5860,7 +5916,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -6013,7 +6069,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -6043,9 +6099,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6151,12 +6204,21 @@ 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|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 ""
@@ -6184,22 +6246,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6214,15 +6282,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6247,9 +6321,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6652,9 +6723,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6712,9 +6780,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6775,6 +6840,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6790,6 +6858,9 @@ 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 ""
@@ -6814,9 +6885,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6943,9 +7011,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6961,6 +7026,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6976,6 +7044,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -7050,7 +7121,7 @@ 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."
+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."
@@ -7218,6 +7289,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7452,9 +7529,15 @@ 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 ""
@@ -7473,6 +7556,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7542,6 +7628,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7768,6 +7857,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7834,6 +7926,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7861,9 +7956,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -8050,6 +8142,14 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8254,6 +8354,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8311,13 +8414,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8326,6 +8429,9 @@ 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 ""
@@ -8347,12 +8453,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8416,13 +8516,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8434,7 +8534,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8458,6 +8558,14 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8470,9 +8578,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8482,19 +8587,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8503,7 +8611,7 @@ 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}"
+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}."
@@ -8515,20 +8623,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-
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 ""
@@ -8547,7 +8650,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8706,9 +8809,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9222,6 +9322,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9255,7 +9358,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9429,9 +9532,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9557,9 +9657,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9662,9 +9759,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -10025,9 +10119,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -10058,9 +10149,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10194,6 +10282,9 @@ 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 ""
@@ -10388,9 +10479,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10427,6 +10515,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10535,9 +10626,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10553,6 +10641,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10595,6 +10686,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10901,6 +10995,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11387,7 +11484,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11561,6 +11661,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11579,6 +11682,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11588,6 +11694,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11970,6 +12079,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -12060,25 +12175,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -12098,13 +12213,13 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12386,6 +12501,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12497,6 +12615,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12632,9 +12753,15 @@ 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 ""
@@ -12644,9 +12771,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12662,6 +12786,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12929,6 +13056,9 @@ 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 ""
@@ -13081,10 +13211,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13482,6 +13618,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13497,6 +13636,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13522,9 +13664,18 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+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 ""
@@ -13566,9 +13717,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13581,6 +13729,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13718,7 +13869,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13805,9 +13956,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13895,9 +14043,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -14051,6 +14205,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -14105,9 +14262,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14168,9 +14322,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14180,6 +14331,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14276,13 +14430,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14306,18 +14460,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14399,12 +14547,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14450,12 +14592,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14522,7 +14658,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14625,12 +14761,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14890,6 +15021,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14914,9 +15048,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -15019,6 +15150,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15274,9 +15408,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15612,6 +15743,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15914,6 +16048,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15944,6 +16081,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -16100,7 +16240,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16348,6 +16488,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16375,9 +16518,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16504,9 +16644,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16627,9 +16764,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16858,6 +16992,22 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16891,6 +17041,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16912,6 +17065,12 @@ 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 ""
@@ -16921,9 +17080,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16936,6 +17110,9 @@ 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 ""
@@ -16957,9 +17134,21 @@ 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 ""
@@ -16969,24 +17158,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16999,6 +17200,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -17023,21 +17227,39 @@ 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 ""
@@ -17047,6 +17269,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -17059,6 +17284,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -17080,6 +17308,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -17122,6 +17353,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -17149,15 +17383,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17191,6 +17449,12 @@ 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 ""
@@ -17203,9 +17467,21 @@ 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 ""
@@ -17215,12 +17491,18 @@ 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 ""
@@ -17245,6 +17527,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17260,7 +17545,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17416,7 +17701,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17587,6 +17872,15 @@ 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 ""
@@ -18460,9 +18754,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18580,9 +18871,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18995,6 +19283,9 @@ 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 ""
@@ -19007,9 +19298,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -19164,12 +19452,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19302,6 +19584,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19341,15 +19626,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19362,9 +19644,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19653,9 +19932,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19737,6 +20013,9 @@ 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 ""
@@ -19857,6 +20136,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19968,6 +20250,9 @@ 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 ""
@@ -20151,9 +20436,15 @@ 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 ""
@@ -20295,6 +20586,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20418,18 +20712,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20906,9 +21188,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20951,9 +21230,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20963,6 +21239,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -21014,6 +21293,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -21089,9 +21371,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21647,12 +21926,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21662,9 +21947,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21788,9 +22079,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21896,7 +22184,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21947,9 +22235,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -22031,6 +22316,9 @@ 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 ""
@@ -22085,6 +22373,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -22097,6 +22388,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22639,6 +22933,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22819,6 +23116,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22828,6 +23128,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22852,6 +23155,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -23049,10 +23355,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -23100,24 +23403,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23304,9 +23598,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23361,6 +23652,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23664,6 +23958,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23703,6 +24000,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23760,7 +24060,7 @@ 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 28px tall header logo"
+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."
@@ -24025,6 +24325,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -24145,6 +24448,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24391,6 +24697,18 @@ 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 ""
@@ -24911,10 +25229,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -25142,9 +25460,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -25166,12 +25481,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25246,19 +25555,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25363,75 +25672,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25441,87 +25684,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25806,9 +25974,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -26016,9 +26181,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26204,6 +26366,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26240,9 +26405,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26380,6 +26542,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26434,9 +26632,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26479,6 +26674,9 @@ 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 ""
@@ -26635,9 +26833,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26659,22 +26866,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26689,6 +26911,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26722,19 +26947,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26767,6 +26998,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26779,6 +27013,9 @@ 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 ""
@@ -26844,9 +27081,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27291,6 +27525,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27392,9 +27632,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27467,6 +27704,12 @@ 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 ""
@@ -27590,13 +27833,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27683,7 +27926,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27869,9 +28112,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27941,6 +28181,12 @@ 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 ""
@@ -28670,6 +28916,9 @@ 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 ""
@@ -28709,9 +28958,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28769,6 +29015,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28853,6 +29102,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28862,6 +29117,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28898,6 +29159,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28997,9 +29261,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29618,9 +29879,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30248,7 +30506,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31298,9 +31556,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31385,9 +31640,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31495,9 +31747,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31977,9 +32226,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -32019,9 +32265,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -32128,6 +32371,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -32158,6 +32404,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32332,9 +32581,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32353,9 +32599,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32365,9 +32608,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32407,9 +32647,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32621,9 +32858,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32645,6 +32879,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32772,6 +33009,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32814,10 +33054,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32835,9 +33075,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32902,9 +33139,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32964,6 +33198,9 @@ 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|Group"
msgstr ""
@@ -33158,6 +33395,9 @@ 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 ""
@@ -33242,9 +33482,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33257,9 +33494,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33759,9 +33993,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33783,9 +34014,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33972,6 +34200,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33987,6 +34218,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -34002,10 +34236,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -34014,16 +34245,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -34032,7 +34287,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -34050,28 +34305,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -34095,6 +34338,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -34104,6 +34350,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -34113,15 +34362,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -34134,6 +34386,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -34170,6 +34425,9 @@ 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 ""
@@ -34185,6 +34443,9 @@ 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 ""
@@ -34200,6 +34461,9 @@ 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 ""
@@ -34224,10 +34488,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34281,10 +34545,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34503,7 +34767,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34689,6 +34953,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34704,9 +34971,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34749,9 +35013,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34800,9 +35061,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -35004,13 +35262,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -35160,9 +35418,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -35199,18 +35454,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35312,9 +35561,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -36220,6 +36466,12 @@ 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 ""
@@ -36742,6 +36994,12 @@ 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 ""
@@ -36868,27 +37126,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -37081,6 +37318,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -37096,6 +37339,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -37114,6 +37363,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -37156,7 +37408,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -37165,9 +37417,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -37192,6 +37441,9 @@ 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 ""
@@ -37201,7 +37453,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37263,9 +37518,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37350,9 +37602,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37518,6 +37767,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37727,10 +37979,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37811,6 +38060,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37820,9 +38072,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -38081,9 +38330,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38395,9 +38641,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38509,7 +38752,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38689,12 +38932,21 @@ 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 ""
@@ -38746,12 +38998,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38800,9 +39046,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38818,9 +39061,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -39064,6 +39304,9 @@ 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 ""
@@ -39175,7 +39418,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39322,9 +39565,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39478,9 +39718,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39649,9 +39886,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39820,10 +40054,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39902,6 +40136,9 @@ 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 ""
@@ -39911,6 +40148,9 @@ 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 ""
@@ -39962,9 +40202,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -40211,7 +40448,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40451,7 +40691,7 @@ 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."
+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."
@@ -40490,6 +40730,9 @@ 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 ""
@@ -40532,9 +40775,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40586,9 +40826,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40694,6 +40931,9 @@ 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 ""
@@ -40973,9 +41213,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -41024,9 +41261,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -41132,6 +41366,12 @@ 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 ""
@@ -41141,7 +41381,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -41192,6 +41432,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41240,6 +41483,12 @@ 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 ""
@@ -41252,9 +41501,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41405,7 +41651,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41801,7 +42047,7 @@ 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."
+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."
@@ -41996,9 +42242,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42551,7 +42794,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42662,9 +42905,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42812,7 +43052,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -43007,9 +43247,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -43019,9 +43256,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -43049,7 +43283,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -43058,9 +43292,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -43105,7 +43336,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43339,12 +43570,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43354,6 +43591,9 @@ 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 ""
@@ -43369,6 +43609,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43432,6 +43675,14 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43528,7 +43779,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43699,6 +43950,9 @@ 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 ""
@@ -44076,6 +44330,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44408,15 +44665,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44514,9 +44771,6 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44573,6 +44827,15 @@ 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 ""
@@ -44713,6 +44976,9 @@ 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 ""
@@ -45459,7 +45725,7 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45471,6 +45737,12 @@ 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 ""
@@ -45480,6 +45752,12 @@ 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 ""
@@ -45558,9 +45836,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45605,9 +45880,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45721,9 +45993,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45871,6 +46140,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45886,9 +46158,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45904,6 +46173,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45968,9 +46243,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -46109,6 +46381,9 @@ msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/bs_BA/gitlab.po b/locale/bs_BA/gitlab.po
index 7052daa90a2..626901ab7b9 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -304,12 +304,6 @@ msgstr[0] "%d grupa"
msgstr[1] "%d grupe"
msgstr[2] "%d grupa"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d grupa odabrana"
-msgstr[1] "%d grupe odabrane"
-msgstr[2] "%d grupa odabrano"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d sat"
@@ -448,12 +442,6 @@ msgstr[0] "%d sekunda"
msgstr[1] "%d sekunde"
msgstr[2] "%d sekundi"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -592,7 +580,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -739,6 +727,9 @@ 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 ""
@@ -868,9 +859,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -880,9 +868,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1054,9 +1039,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1381,9 +1363,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1447,6 +1426,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1594,6 +1576,9 @@ msgstr[2] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1606,6 +1591,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1681,9 +1669,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1729,9 +1714,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1756,6 +1738,9 @@ 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 ""
@@ -2107,9 +2092,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2125,12 +2107,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2251,9 +2227,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2302,6 +2275,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2461,15 +2437,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2722,12 +2698,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2764,6 +2734,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2776,12 +2749,39 @@ 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 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 ""
@@ -2791,12 +2791,24 @@ 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|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 ""
@@ -2827,18 +2839,39 @@ 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|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 ""
@@ -2848,6 +2881,9 @@ 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|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 ""
@@ -2878,9 +2914,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3754,6 +3808,9 @@ msgstr "Svi projekti"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3769,13 +3826,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3817,9 +3880,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3835,9 +3895,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4207,6 +4264,9 @@ 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 ""
@@ -4282,9 +4342,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4351,9 +4408,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4384,6 +4438,9 @@ 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 ""
@@ -4462,12 +4519,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4507,37 +4579,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4546,22 +4615,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4618,9 +4687,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4816,15 +4882,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5359,7 +5416,7 @@ 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."
+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"
@@ -5398,6 +5455,9 @@ 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 ""
@@ -5584,7 +5644,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5737,7 +5797,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5767,9 +5827,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5875,12 +5932,21 @@ 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|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 ""
@@ -5908,22 +5974,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5938,15 +6010,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5971,9 +6049,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6370,9 +6445,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6430,9 +6502,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6493,6 +6562,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6508,6 +6580,9 @@ 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 ""
@@ -6532,9 +6607,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6661,9 +6733,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6679,6 +6748,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6694,6 +6766,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6766,7 +6841,7 @@ 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."
+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."
@@ -6934,6 +7009,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7168,9 +7249,15 @@ 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 ""
@@ -7189,6 +7276,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7258,6 +7348,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7480,6 +7573,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7546,6 +7642,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7573,9 +7672,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7762,6 +7858,12 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7966,6 +8068,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8023,13 +8128,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8038,6 +8143,9 @@ 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 ""
@@ -8059,12 +8167,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8128,13 +8230,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8146,7 +8248,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8170,6 +8272,12 @@ 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] ""
+msgstr[2] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8182,9 +8290,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8194,19 +8299,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8215,7 +8323,7 @@ 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}"
+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}."
@@ -8227,18 +8335,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
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 ""
@@ -8257,7 +8362,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8416,9 +8521,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8932,6 +9034,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8965,7 +9070,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9139,9 +9244,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9265,9 +9367,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9370,9 +9469,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9733,9 +9829,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9766,9 +9859,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9898,6 +9988,9 @@ 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 ""
@@ -10090,9 +10183,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10129,6 +10219,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10237,9 +10330,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10255,6 +10345,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10297,6 +10390,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10603,6 +10699,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11089,7 +11188,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11263,6 +11365,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11281,6 +11386,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11290,6 +11398,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11668,6 +11779,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11758,25 +11875,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11794,13 +11911,13 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12082,6 +12199,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12193,6 +12313,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12322,9 +12445,15 @@ 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 ""
@@ -12334,9 +12463,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12352,6 +12478,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12613,6 +12742,9 @@ 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 ""
@@ -12763,10 +12895,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13162,6 +13300,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13177,6 +13318,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13198,9 +13342,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+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 ""
@@ -13240,9 +13393,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13255,6 +13405,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13390,7 +13543,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13477,9 +13630,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13567,9 +13717,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13723,6 +13879,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Uredi zadatke"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13777,9 +13936,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13840,9 +13996,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13852,6 +14005,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13948,13 +14104,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13978,18 +14134,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14071,12 +14221,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14122,12 +14266,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14194,7 +14332,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14297,10 +14435,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14560,6 +14695,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14584,9 +14722,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr "Epici i Zadaci"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14689,6 +14824,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14944,9 +15082,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15280,6 +15415,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15580,6 +15718,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15610,6 +15751,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15766,7 +15910,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16012,6 +16156,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16039,9 +16186,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16168,9 +16312,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16291,9 +16432,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16522,6 +16660,18 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16555,6 +16705,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16576,6 +16729,12 @@ 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 ""
@@ -16585,9 +16744,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16600,6 +16774,9 @@ 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 ""
@@ -16621,9 +16798,21 @@ 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 ""
@@ -16633,24 +16822,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16663,6 +16864,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16687,21 +16891,39 @@ 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 ""
@@ -16711,6 +16933,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16723,6 +16948,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16744,6 +16972,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16786,6 +17017,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16813,15 +17047,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16855,6 +17113,12 @@ 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 ""
@@ -16867,9 +17131,21 @@ 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 ""
@@ -16879,12 +17155,18 @@ 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 ""
@@ -16909,6 +17191,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16924,7 +17209,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17080,7 +17365,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17251,6 +17536,15 @@ 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 ""
@@ -18124,9 +18418,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18244,9 +18535,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18655,6 +18943,9 @@ 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 ""
@@ -18667,9 +18958,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18820,12 +19108,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18958,6 +19240,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18997,15 +19282,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19018,9 +19300,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19303,9 +19582,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19387,6 +19663,9 @@ 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 ""
@@ -19507,6 +19786,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19618,6 +19900,9 @@ 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 ""
@@ -19801,9 +20086,15 @@ 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 ""
@@ -19945,6 +20236,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20068,18 +20362,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20554,9 +20836,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20599,9 +20878,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20611,6 +20887,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20662,6 +20941,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20737,9 +21019,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21295,12 +21574,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21310,9 +21595,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21436,9 +21727,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21544,7 +21832,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21595,9 +21883,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21679,6 +21964,9 @@ 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 ""
@@ -21733,6 +22021,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21745,6 +22036,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22285,6 +22579,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22465,6 +22762,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22474,6 +22774,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22498,6 +22801,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22681,10 +22987,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22732,24 +23035,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22936,9 +23230,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22993,6 +23284,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23296,6 +23590,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23335,6 +23632,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23392,7 +23692,7 @@ 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 28px tall header logo"
+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."
@@ -23653,6 +23953,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23773,6 +24076,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24019,6 +24325,18 @@ 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 ""
@@ -24535,10 +24853,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24766,9 +25084,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24790,12 +25105,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24868,19 +25177,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24985,75 +25294,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25063,87 +25306,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25426,9 +25594,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25636,9 +25801,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25822,6 +25984,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25858,9 +26023,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25990,6 +26152,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26044,9 +26242,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26089,6 +26284,9 @@ 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 ""
@@ -26245,9 +26443,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26269,22 +26476,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26299,6 +26521,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26332,19 +26557,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26377,6 +26608,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26389,6 +26623,9 @@ 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 ""
@@ -26452,9 +26689,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26899,6 +27133,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26998,9 +27238,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27073,6 +27310,12 @@ 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 ""
@@ -27196,13 +27439,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27289,7 +27532,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27475,9 +27718,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27547,6 +27787,12 @@ 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 ""
@@ -28276,6 +28522,9 @@ 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 ""
@@ -28315,9 +28564,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28375,6 +28621,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28459,6 +28708,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28468,6 +28723,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28504,6 +28765,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28603,9 +28867,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29224,9 +29485,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29854,7 +30112,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30904,9 +31162,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30991,9 +31246,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31099,9 +31351,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31579,9 +31828,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31621,9 +31867,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31720,6 +31963,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31750,6 +31996,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31924,9 +32173,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31945,9 +32191,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31957,9 +32200,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31999,9 +32239,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32209,9 +32446,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32233,6 +32467,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32356,6 +32593,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32398,10 +32638,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32419,9 +32659,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32482,9 +32719,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32542,6 +32776,9 @@ 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|Group"
msgstr ""
@@ -32734,6 +32971,9 @@ 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 ""
@@ -32818,9 +33058,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32833,9 +33070,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33313,9 +33547,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33337,9 +33568,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33526,6 +33754,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33541,6 +33772,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33556,10 +33790,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33568,16 +33799,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+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|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33586,7 +33841,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33604,28 +33859,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33649,6 +33892,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33658,6 +33904,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33667,15 +33916,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33688,6 +33940,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33724,6 +33979,9 @@ 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 ""
@@ -33739,6 +33997,9 @@ 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 ""
@@ -33754,6 +34015,9 @@ 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 ""
@@ -33778,10 +34042,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33835,10 +34099,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34057,7 +34321,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34243,6 +34507,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34258,9 +34525,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34303,9 +34567,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34354,9 +34615,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34558,13 +34816,13 @@ msgstr "TehniÄka PodrÅ¡ka"
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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34714,9 +34972,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34753,18 +35008,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34864,9 +35113,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35770,6 +36016,12 @@ 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 ""
@@ -36292,6 +36544,12 @@ 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 ""
@@ -36418,27 +36676,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36631,6 +36868,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36646,6 +36889,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36664,6 +36913,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36706,7 +36958,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36715,9 +36967,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36742,6 +36991,9 @@ 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 ""
@@ -36751,7 +37003,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36811,9 +37066,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36898,9 +37150,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37066,6 +37315,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37267,10 +37519,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37351,6 +37600,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37360,9 +37612,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37615,9 +37864,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37927,9 +38173,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38041,7 +38284,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38221,12 +38464,21 @@ 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 ""
@@ -38278,12 +38530,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38332,9 +38578,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38350,9 +38593,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38596,6 +38836,9 @@ 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 ""
@@ -38707,7 +38950,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38854,9 +39097,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39010,9 +39250,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39181,9 +39418,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39352,10 +39586,10 @@ msgstr "maloprije"
msgid "Timeago|right now"
msgstr "upravo sada"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39430,6 +39664,9 @@ 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 ""
@@ -39439,6 +39676,9 @@ 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 ""
@@ -39490,9 +39730,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39739,7 +39976,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39979,7 +40219,7 @@ 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."
+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."
@@ -40018,6 +40258,9 @@ 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 ""
@@ -40060,9 +40303,6 @@ msgstr ""
msgid "Tuesday"
msgstr "Utorak"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40114,9 +40354,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40222,6 +40459,9 @@ 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 ""
@@ -40501,9 +40741,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40552,9 +40789,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40660,6 +40894,12 @@ 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 ""
@@ -40669,7 +40909,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40720,6 +40960,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40768,6 +41011,12 @@ 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 ""
@@ -40780,9 +41029,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40933,7 +41179,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41329,7 +41575,7 @@ 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."
+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."
@@ -41524,9 +41770,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42073,7 +42316,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42184,9 +42427,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42334,7 +42574,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42529,9 +42769,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42541,9 +42778,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42571,7 +42805,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42580,9 +42814,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42625,7 +42856,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42859,12 +43090,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42874,6 +43111,9 @@ 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 ""
@@ -42889,6 +43129,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42952,6 +43195,12 @@ 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] ""
+msgstr[2] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43048,7 +43297,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43219,6 +43468,9 @@ 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 ""
@@ -43594,6 +43846,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43924,15 +44179,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44026,9 +44281,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44083,6 +44335,15 @@ 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 ""
@@ -44221,6 +44482,9 @@ 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 ""
@@ -44947,7 +45211,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44959,6 +45223,12 @@ 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 ""
@@ -44968,6 +45238,12 @@ 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 ""
@@ -45046,9 +45322,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45091,9 +45364,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45205,9 +45475,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45355,6 +45622,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45370,9 +45640,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45388,6 +45655,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45448,9 +45721,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45583,6 +45853,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po
index 94817104543..7675aa8ee9b 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr " Des de %{start} fins %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr "Analítiques"
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 "Verificació contra el correu brossa"
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr "Aplicació: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "agost"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr "Mostra les branques actives"
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr "fusionada"
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Cancel·la"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Trieu un color."
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Continua"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr "Nom del directori"
msgid "Disable"
msgstr "Desactiva"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr "Desactiva per a aquest projecte"
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr "Activa"
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Error"
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Plantilles de fitxers"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 "Fallit"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 "Mai"
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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identificador"
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr "Petició de fusió"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "Mètriques"
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Xarxa"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 425f35b9d75..fb8ff4f94e4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -343,13 +343,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -511,13 +504,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ 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 ""
@@ -955,9 +944,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1483,9 +1463,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1551,6 +1528,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "1. příspěvek!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1808,9 +1794,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ 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 ""
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2429,6 +2400,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2588,15 +2562,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 ""
@@ -2918,12 +2916,24 @@ 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|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 ""
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3881,6 +3933,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4334,6 +4389,9 @@ 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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ msgstr "Srpen"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr "Přehled"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr "Zobrazit aktivní větve"
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr "nastavení projektu"
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr "Kopírovat název větve"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po
index 02da3d5f07e..e86ce67e919 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr " %{start} i %{end}"
@@ -421,15 +421,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -637,15 +628,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -835,7 +817,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -1000,6 +982,9 @@ msgstr "%{edit_in_new_fork_notice} Ceisiwch lwytho ffeil eto."
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 ""
@@ -1129,9 +1114,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -1141,9 +1123,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1327,9 +1306,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1687,9 +1663,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1759,6 +1732,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1975,6 +1951,9 @@ msgstr[5] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1987,6 +1966,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -2062,9 +2044,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -2110,9 +2089,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -2137,6 +2113,9 @@ 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 ""
@@ -2488,9 +2467,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2506,12 +2482,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2632,9 +2602,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2683,6 +2650,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2842,15 +2812,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -3103,12 +3073,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -3145,6 +3109,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -3157,12 +3124,39 @@ 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 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 ""
@@ -3172,12 +3166,24 @@ 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|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 ""
@@ -3208,18 +3214,39 @@ 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|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 ""
@@ -3229,6 +3256,9 @@ 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|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 ""
@@ -3259,9 +3289,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -4135,6 +4183,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -4150,13 +4201,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -4198,9 +4255,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -4216,9 +4270,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4588,6 +4639,9 @@ 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 ""
@@ -4666,9 +4720,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4735,9 +4786,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4768,6 +4816,9 @@ 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 ""
@@ -4846,12 +4897,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4897,37 +4963,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4936,22 +4999,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -5011,9 +5074,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -5221,15 +5281,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5773,7 +5824,7 @@ 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."
+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"
@@ -5812,6 +5863,9 @@ 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 ""
@@ -5998,7 +6052,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -6151,7 +6205,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -6181,9 +6235,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6289,12 +6340,21 @@ 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|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 ""
@@ -6322,22 +6382,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6352,15 +6418,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6385,9 +6457,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6793,9 +6862,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6853,9 +6919,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6916,6 +6979,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6931,6 +6997,9 @@ 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 ""
@@ -6955,9 +7024,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -7084,9 +7150,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -7102,6 +7165,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -7117,6 +7183,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -7192,7 +7261,7 @@ 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."
+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."
@@ -7360,6 +7429,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7594,9 +7669,15 @@ 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 ""
@@ -7615,6 +7696,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7684,6 +7768,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7912,6 +7999,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7978,6 +8068,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -8005,9 +8098,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -8194,6 +8284,15 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8398,6 +8497,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8455,13 +8557,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8470,6 +8572,9 @@ 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 ""
@@ -8491,12 +8596,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8560,13 +8659,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8578,7 +8677,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8602,6 +8701,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8614,9 +8722,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8626,19 +8731,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8647,7 +8755,7 @@ 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}"
+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}."
@@ -8659,21 +8767,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
-
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 ""
@@ -8692,7 +8794,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8851,9 +8953,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9367,6 +9466,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9400,7 +9502,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9574,9 +9676,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9703,9 +9802,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9808,9 +9904,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -10171,9 +10264,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -10204,9 +10294,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10342,6 +10429,9 @@ 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 ""
@@ -10537,9 +10627,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10576,6 +10663,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10684,9 +10774,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10702,6 +10789,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10744,6 +10834,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -11050,6 +11143,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11536,7 +11632,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11710,6 +11809,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11728,6 +11830,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11737,6 +11842,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -12121,6 +12229,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -12211,25 +12325,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -12250,13 +12364,13 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12538,6 +12652,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12649,6 +12766,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12787,9 +12907,15 @@ 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 ""
@@ -12799,9 +12925,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12817,6 +12940,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -13087,6 +13213,9 @@ 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 ""
@@ -13240,10 +13369,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13642,6 +13777,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13657,6 +13795,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13684,9 +13825,18 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+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 ""
@@ -13729,9 +13879,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13744,6 +13891,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13882,7 +14032,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13969,9 +14119,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -14059,9 +14206,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -14215,6 +14368,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -14269,9 +14425,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14332,9 +14485,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14344,6 +14494,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14440,13 +14593,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14470,18 +14623,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14563,12 +14710,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14614,12 +14755,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14686,7 +14821,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14789,13 +14924,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -15055,6 +15184,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -15079,9 +15211,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -15184,6 +15313,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15439,9 +15571,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15778,6 +15907,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -16081,6 +16213,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -16111,6 +16246,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -16267,7 +16405,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16516,6 +16654,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16543,9 +16684,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16672,9 +16810,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16795,9 +16930,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -17026,6 +17158,24 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -17059,6 +17209,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -17080,6 +17233,12 @@ 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 ""
@@ -17089,9 +17248,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -17104,6 +17278,9 @@ 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 ""
@@ -17125,9 +17302,21 @@ 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 ""
@@ -17137,24 +17326,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -17167,6 +17368,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -17191,21 +17395,39 @@ 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 ""
@@ -17215,6 +17437,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -17227,6 +17452,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -17248,6 +17476,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -17290,6 +17521,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -17317,15 +17551,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17359,6 +17617,12 @@ 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 ""
@@ -17371,9 +17635,21 @@ 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 ""
@@ -17383,12 +17659,18 @@ 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 ""
@@ -17413,6 +17695,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17428,7 +17713,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17584,7 +17869,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17755,6 +18040,15 @@ 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 ""
@@ -18628,9 +18922,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18748,9 +19039,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -19165,6 +19453,9 @@ 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 ""
@@ -19177,9 +19468,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -19336,12 +19624,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19474,6 +19756,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19513,15 +19798,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19534,9 +19816,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19828,9 +20107,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19912,6 +20188,9 @@ 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 ""
@@ -20032,6 +20311,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -20143,6 +20425,9 @@ 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 ""
@@ -20326,9 +20611,15 @@ 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 ""
@@ -20470,6 +20761,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20593,18 +20887,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -21082,9 +21364,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -21127,9 +21406,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -21139,6 +21415,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -21190,6 +21469,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -21265,9 +21547,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21823,12 +22102,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21838,9 +22123,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21964,9 +22255,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -22072,7 +22360,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -22123,9 +22411,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -22207,6 +22492,9 @@ 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 ""
@@ -22261,6 +22549,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -22273,6 +22564,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22816,6 +23110,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22996,6 +23293,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -23005,6 +23305,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -23029,6 +23332,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -23233,10 +23539,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -23284,24 +23587,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23488,9 +23782,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23545,6 +23836,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23848,6 +24142,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23887,6 +24184,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23944,7 +24244,7 @@ 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 28px tall header logo"
+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."
@@ -24211,6 +24511,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -24331,6 +24634,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24577,6 +24883,18 @@ 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 ""
@@ -25099,10 +25417,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -25330,9 +25648,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -25354,12 +25669,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25435,19 +25744,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25552,75 +25861,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25630,87 +25873,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25996,9 +26164,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -26206,9 +26371,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26395,6 +26557,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26431,9 +26596,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26575,6 +26737,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26629,9 +26827,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26674,6 +26869,9 @@ 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 ""
@@ -26830,9 +27028,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26854,22 +27061,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26884,6 +27106,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26917,19 +27142,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26962,6 +27193,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26974,6 +27208,9 @@ 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 ""
@@ -27040,9 +27277,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27487,6 +27721,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27589,9 +27829,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27664,6 +27901,12 @@ 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 ""
@@ -27787,13 +28030,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27880,7 +28123,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -28066,9 +28309,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -28138,6 +28378,12 @@ 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 ""
@@ -28867,6 +29113,9 @@ 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 ""
@@ -28906,9 +29155,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28966,6 +29212,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -29050,6 +29299,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -29059,6 +29314,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -29095,6 +29356,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -29194,9 +29458,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29815,9 +30076,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30445,7 +30703,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31495,9 +31753,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31582,9 +31837,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31693,9 +31945,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -32176,9 +32425,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -32218,9 +32464,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -32332,6 +32575,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -32362,6 +32608,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32536,9 +32785,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32557,9 +32803,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32569,9 +32812,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32611,9 +32851,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32827,9 +33064,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32851,6 +33085,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32980,6 +33217,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -33022,10 +33262,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -33043,9 +33283,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -33112,9 +33349,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -33175,6 +33409,9 @@ 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|Group"
msgstr ""
@@ -33370,6 +33607,9 @@ 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 ""
@@ -33454,9 +33694,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33469,9 +33706,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33982,9 +34216,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -34006,9 +34237,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -34195,6 +34423,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -34210,6 +34441,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -34225,10 +34459,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -34237,16 +34468,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+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|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -34255,7 +34510,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -34273,28 +34528,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -34318,6 +34561,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -34327,6 +34573,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -34336,15 +34585,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -34357,6 +34609,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -34393,6 +34648,9 @@ 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 ""
@@ -34408,6 +34666,9 @@ 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 ""
@@ -34423,6 +34684,9 @@ 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 ""
@@ -34447,10 +34711,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34504,10 +34768,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34726,7 +34990,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34912,6 +35176,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34927,9 +35194,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34972,9 +35236,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -35023,9 +35284,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -35227,13 +35485,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -35383,9 +35641,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -35422,18 +35677,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35536,9 +35785,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -36445,6 +36691,12 @@ 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 ""
@@ -36967,6 +37219,12 @@ 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 ""
@@ -37093,27 +37351,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -37306,6 +37543,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -37321,6 +37564,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -37339,6 +37588,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -37381,7 +37633,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -37390,9 +37642,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -37417,6 +37666,9 @@ 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 ""
@@ -37426,7 +37678,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37489,9 +37744,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37576,9 +37828,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37744,6 +37993,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37957,10 +38209,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -38041,6 +38290,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -38050,9 +38302,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -38314,9 +38563,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38629,9 +38875,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38743,7 +38986,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38923,12 +39166,21 @@ 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 ""
@@ -38980,12 +39232,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -39034,9 +39280,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -39052,9 +39295,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -39298,6 +39538,9 @@ 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 ""
@@ -39409,7 +39652,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39556,9 +39799,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39712,9 +39952,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39883,9 +40120,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -40054,10 +40288,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -40138,6 +40372,9 @@ 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 ""
@@ -40147,6 +40384,9 @@ 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 ""
@@ -40198,9 +40438,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -40447,7 +40684,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40687,7 +40927,7 @@ 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."
+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."
@@ -40726,6 +40966,9 @@ 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 ""
@@ -40768,9 +41011,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40822,9 +41062,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40930,6 +41167,9 @@ 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 ""
@@ -41209,9 +41449,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -41260,9 +41497,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -41368,6 +41602,12 @@ 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 ""
@@ -41377,7 +41617,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -41428,6 +41668,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41476,6 +41719,12 @@ 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 ""
@@ -41488,9 +41737,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41641,7 +41887,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -42037,7 +42283,7 @@ 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."
+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."
@@ -42232,9 +42478,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42790,7 +43033,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42901,9 +43144,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -43051,7 +43291,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -43246,9 +43486,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -43258,9 +43495,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -43288,7 +43522,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -43297,9 +43531,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -43345,7 +43576,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43579,12 +43810,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43594,6 +43831,9 @@ 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 ""
@@ -43609,6 +43849,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43672,6 +43915,15 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+msgstr[4] ""
+msgstr[5] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43768,7 +44020,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43939,6 +44191,9 @@ 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 ""
@@ -44317,6 +44572,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44650,15 +44908,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44758,9 +45016,6 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44818,6 +45073,15 @@ 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 ""
@@ -44959,6 +45223,9 @@ 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 ""
@@ -45715,7 +45982,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45727,6 +45994,12 @@ 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 ""
@@ -45736,6 +46009,12 @@ 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 ""
@@ -45814,9 +46093,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45862,9 +46138,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45979,9 +46252,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -46129,6 +46399,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -46144,9 +46417,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -46162,6 +46432,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -46228,9 +46504,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -46372,6 +46645,9 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po
index 542179841ea..94d027f7dc0 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d gruppe"
msgstr[1] "%d grupper"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d gruppe valgt"
-msgstr[1] "%d grupper valgt"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d time"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d shard valgt"
-msgstr[1] "%d shards valgt"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,8 +501,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}Maskeret:%{code_close} Skjult i joblogge. Skal matche maskeringskrav."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Beskyttede:%{code_close} vises kun for beskyttede grene eller mærkater."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} forfattede %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Prøv at uploade en fil igen."
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} downstream-pipelines mere"
@@ -781,9 +774,6 @@ msgstr "%{level_name} er ikke tilladt i en %{group_level_name}-gruppe."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} er ikke tilladt eftersom forgreningskildeprojektet har lavere synlighed."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ msgstr "%{link_start}Fjern præfikset %{draft_snippet}%{link_end} fra titlen, nÃ
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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Hvilke informationer indsamler GitLab Inc.?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow} og %{awardsListLength} mere"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] "%{securityScanner} resultat er ikke tilgængeligt fordi en pipeline ikke er blevet kørt siden den blev aktiveret. %{linkStart}Kør en pipeline%{linkEnd}"
msgstr[1] "%{securityScanner} resultater er ikke tilgængelige fordi en pipeline ikke er blevet kørt siden de blev aktiverede. %{linkStart}Kør en pipeline%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}Hvilke informationer deles med GitLab Inc.?%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] "+%d mere"
msgstr[1] "+%d mere"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} godkendere mere"
-
msgid "+%{extra} more"
msgstr "+%{extra} mere"
@@ -1343,6 +1324,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 byte"
@@ -1467,6 +1451,9 @@ msgstr[1] "%d år tilbage"
msgid "1-9 contributions"
msgstr "1-9 bidrag"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 bidrag"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Første bidrag!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 bidrag"
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr "Menupunktet målingsbetjeningspanel vises i afsnittet overvågning i administratorområdet."
-
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"
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Et medlem af misbrugsteamet gennemgår din rapport hurtigt muligt."
-msgid "A merge request hasn't yet been merged"
-msgstr "En sammenlægningsanmodning er endnu ikke blevet sammenlagt"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ msgstr ""
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "En ikke-fortrolig epic kan ikke tildeles til en fortrolig forælderepic"
+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 "Et ren HTML-websted som bruger Netlify til CI/CD frem for GitLab, men stadigvæk med alle de andre gode GitLab-funktioner"
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr "Tilføj en linje"
msgid "Add a link"
msgstr "Tilføj et link"
-msgid "Add a link to Grafana"
-msgstr "Tilføj et link til Grafana"
-
msgid "Add a new issue"
msgstr "Tilføj en ny problemstilling"
@@ -2175,6 +2150,9 @@ msgstr "Tilføj godkendelsesregel"
msgid "Add approvers"
msgstr "Tilføj godkendere"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Tilføj fed tekst"
@@ -2334,15 +2312,15 @@ msgstr "Tilføj commits, som tidligere er blevet sammenlagt"
msgid "AddContextCommits|Add/remove"
msgstr "Tilføj/fjern"
-msgid "AddMember|Emails cannot be blank"
-msgstr "E-mails må ikke være tomme"
-
msgid "AddMember|Invite email is invalid"
msgstr "Invitations e-mail er ugyldig"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Invitationsgrænse på %{daily_invites} pr. dag overskredet"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "Ingen invitationskilde angivet."
@@ -2595,12 +2573,6 @@ msgstr "Du er ved at stoppe alle job. Det standser alle nuværende job som køre
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Fejl ved indlæsning af statistikken. Prøv venligst igen"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Konfigurer Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "Deaktivér feedtoken"
@@ -2649,12 +2624,39 @@ 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 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 "Aktivér delte runnere til nye projekter"
+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 "Feedtoken"
@@ -2664,12 +2666,24 @@ msgstr "Jeg har læst og accepteret Let's Encrypts %{link_start}Vilkår for tjen
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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
msgid "AdminSettings|Let's Encrypt email"
msgstr "E-mail for Let's Encrypt"
+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 "Maksimale varighed på en session for Git-handlinger når 2FA er aktiveret."
@@ -2700,18 +2714,39 @@ msgstr "Nye CI-/CD-variabler i projekter og grupper indstilles som standard til
msgid "AdminSettings|No required pipeline"
msgstr "Ingen krævet pipeline"
+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 "Beskyt CI-/CD-variabler som standard"
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Kræv at brugere beviser ejerskab for tilpassede domæner"
msgid "AdminSettings|Required pipeline configuration"
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 "Vælg en CI-/CD-skabelon"
@@ -2721,6 +2756,9 @@ 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|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 "Sessionsvarighed for Git-handlinger når 2FA er aktiveret (minutter)"
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Aktive brugere"
@@ -3627,6 +3683,9 @@ msgstr "Alle projekter"
msgid "All projects selected"
msgstr "Alle projekter valgt"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Alle tråde løst"
@@ -3642,14 +3701,20 @@ 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"
msgid "Allow access to the following IP addresses"
msgstr "Tillad adgang for følgende IP-adresser"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Tillad commits fra medlemmer, som kan sammenlægge til målgrenen."
+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 "Tillad gruppeejere at håndtere LDAP-relaterede indstillinger"
@@ -3690,9 +3755,6 @@ msgstr "Tillad undergrupper at indstille deres egne regler for totrinsgodkendels
msgid "Allow this key to push to this repository"
msgstr "Tillad nøglen at bruge push til depotet"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr "Tillad brug af licenserede EE-funktioner"
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr "Tilladt"
-msgid "Allowed Geo IP"
-msgstr "Tilladte Geo-IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Tilladte tegn: +, 0-9, - og mellemrum."
@@ -4080,6 +4139,9 @@ msgstr "Der opstod en fejl under fortolkning af filen."
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 "Der opstod en fejl under fjernelse af epics."
@@ -4154,9 +4216,6 @@ msgstr "Der opstod en fejl under opdatering af underretningsindstillingerne. PrÃ
msgid "An error occurred while uploading the file. Please try again."
msgstr "Der opstod en fejl under upload af filen. Prøv venligst igen."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "Der opstod en fejl under upload af billedet. Prøv venligst igen."
-
msgid "An error occurred while validating group path"
msgstr "Der opstod en fejl under validering af gruppesti"
@@ -4223,9 +4282,6 @@ msgstr "Der opstod en ukendt fejl."
msgid "Analytics"
msgstr "Analyse"
-msgid "Analyze a review version of your web application."
-msgstr "Analyser en kontrolversion af dit webprogram."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analyser dine afhængigheder for kendte sårbarheder."
@@ -4256,6 +4312,9 @@ msgstr "En anden handling er i øjeblikket i gang"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "En anden problemstillingsporing er allerede i brug. Kun én problemstillingsporingstjeneste kan være aktiv ad gangen"
+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 "Bekræftelse af anti-spam"
@@ -4334,12 +4393,27 @@ msgstr "Programmet blev opdateret."
msgid "Application: %{name}"
msgstr "Program: %{name}"
-msgid "ApplicationSettings|After sign up text"
-msgstr "Tekst efter tilmelding"
+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 "Tilladte domæner ved tilmeldinger"
+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] "Godkend %d bruger"
@@ -4377,37 +4451,34 @@ msgstr "Restriktioner for e-mail"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restriktioner for e-mail ved tilmeldinger"
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
-msgstr "Aktivér restriktioner for e-mail ved tilmeldinger"
-
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown aktiveret"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
+msgstr ""
-msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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 "Kræv administratorgodkendelse ved nye tilmeldinger"
-msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 "Gem ændringer"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,24 +4487,24 @@ msgstr "Send bekræftelses e-mail ved tilmelding"
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Tilmelding aktiveret"
+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 "Brugerloft"
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+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) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+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, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
-msgstr ""
-
-msgid "ApplicationSettings|When enabled, any user visiting %{host} will be able to create an account."
-msgstr "Når den er aktiveret, så vil brugere der besøger %{host} være i stand til at oprette en konto."
-
msgid "ApplicationSettings|domain.com"
msgstr "domain.com"
@@ -4487,9 +4558,6 @@ msgstr "Anvender forslag ..."
msgid "Applying suggestions..."
msgstr "Anvender forslag ..."
-msgid "Approval Status"
-msgstr "Godkendelsesstatus"
-
msgid "Approval rules"
msgstr "Godkendelsesregler"
@@ -4681,15 +4749,6 @@ msgstr "Indstillingen er konfigureret på instansniveau og kan kun ændres af en
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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr "Godkendelser er valgfrie."
@@ -5221,7 +5280,7 @@ msgstr "August"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr ""
msgid "Authentication Log"
msgstr "Godkendelseslog"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Godkendelse mislykkedes: %{error_message}"
@@ -5446,8 +5508,8 @@ msgstr "Tilgængeligt id"
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
-msgstr "Tilgængelige runnere: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "Tilgængelige delte runnere:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr "Baseret på"
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Nedenunder finder du alle de grupper, som er offentlige."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ msgstr "Ved at forlænge din prøveperiode vil du modtage yderligere 30 dage med
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
msgstr "Ved at genaktivere din prøveperiode vil du modtage yderligere 30 dage med %{planName}. Din prøveperiode kan kun aktiveres én gang."
+msgid "Billings|Error validating card details"
+msgstr ""
+
msgid "Billings|Extend trial"
msgstr "Forlæng plan"
msgid "Billings|Reactivate trial"
msgstr "Genaktivér prøveperiode"
+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 "Delte runnere kan ikke aktiveres indtil et gyldigt kreditkort er blevet registreret."
@@ -5770,22 +5838,28 @@ 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 "En e-mailadresse er kun synlig for brugere med offentlige e-mails."
msgid "Billing|An error occurred while approving %{user}"
msgstr ""
-msgid "Billing|An error occurred while getting a billable member details"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr "Direkte medlemskaber"
msgid "Billing|Enter at least three characters to search."
msgstr "Indtast mindst tre tegn for at søge."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "Eksportér liste"
-msgid "Billing|Group"
-msgstr "Gruppe"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
msgid "Billing|Group invite"
msgstr "Gruppeinvitation"
+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 ""
@@ -5833,9 +5913,6 @@ msgstr "Skriv %{username} for at bekræfte"
msgid "Billing|User was successfully removed"
msgstr "Bruger blev fjernet"
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Oversigt"
msgid "Branches|Please type the following to confirm:"
msgstr "Skriv venligst følgende for at bekræfte:"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Beskyttede grene kan håndteres i %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Vis aktive grene"
@@ -6289,9 +6363,6 @@ msgstr "afviget fra upstream"
msgid "Branches|merged"
msgstr "sammenlagt"
-msgid "Branches|project settings"
-msgstr "projektindstillinger"
-
msgid "Branches|protected"
msgstr "beskyttet"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Eksisterende grupper"
@@ -6367,6 +6441,9 @@ msgstr "Fra kildegruppe"
msgid "BulkImport|Group import history"
msgstr "Historik for gruppeimport"
+msgid "BulkImport|History"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6391,9 +6468,6 @@ msgstr "Navnet findes allerede."
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr "Ny gruppe"
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr "CI-indstillinger"
msgid "CI variables"
msgstr "CI-variabler"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI vil køre med de legitimationsoplysninger som er tildelt ovenover."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "CI-/CD-konfiguration"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr "Ingen projekter er blevet tilføjet til omfanget"
@@ -6553,6 +6627,9 @@ msgstr "Udsendelseshyppighed"
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,8 +6701,8 @@ msgstr ""
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr ""
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr "Auto DevOps-pipelinen kører som standard i alle projekter som ikke har en CI-/CD-konfigurationsfil."
+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 ""
@@ -6792,6 +6869,12 @@ msgstr "Annuller"
msgid "Cancel and close"
msgstr "Annuller og luk"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Annuller sletning af indeks"
@@ -7026,9 +7109,15 @@ msgstr ""
msgid "Changed assignee(s)."
msgstr "Ændrede tildeler(e)."
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
msgid "Changed reviewer(s)."
msgstr "Ændrede kontrollanter."
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
msgid "Changed the title to \"%{title_param}\"."
msgstr "Ændrede titlen til \"%{title_param}\"."
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr "Ændrer titlen til \"%{title_param}\"."
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Tjek igen"
msgid "Check feature availability on namespace plan"
msgstr "Tjek tilgængeligheden af funktioner på navnerumsplan"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr "Abonnementsdetaljer"
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Afgift"
@@ -7402,6 +7500,9 @@ msgstr "Underepicen findes ikke."
msgid "Child epic doesn't exist."
msgstr "Underepicen findes ikke."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "Understøttelse af kinesisk sprog med"
@@ -7429,9 +7530,6 @@ msgstr "Vælg en farve."
msgid "Choose file…"
msgstr "Vælg fil …"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Ryd"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr ""
-
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "Der opstod en fejl under indlæsning af din agent"
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ msgstr "Der opstod en ukendt fejl. Prøv venligst igen."
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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ msgstr "Aldrig"
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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr "Anbefalet installationsmetode"
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "ClusterAgents|This agent has no tokens"
msgstr "Agenten har ingen tokens"
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Valgmuligheden giver dig mulighed for at installere programmer på RBAC-klynger."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ msgstr "Ukendt fejl"
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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr "Kommasepareret liste over e-mailadresser."
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr "Kommando"
@@ -9119,9 +9222,6 @@ msgstr "Ingen relaterede sammenlægningsanmodninger fundet"
msgid "Committed by"
msgstr "Committed af"
-msgid "Commit…"
-msgstr "Commit …"
-
msgid "Community forum"
msgstr "Fællesskabsforum"
@@ -9224,9 +9324,6 @@ msgstr "Overholdelsesframework"
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr "oprettet af:"
-
msgid "ComplianceFrameworks|Add framework"
msgstr "Tilføj framework"
@@ -9587,9 +9684,6 @@ msgstr "Fejl ved forbindelse"
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr "Beholderregister er ikke aktiveret på GitLab-instansen. Spørg en admin
msgid "Container repositories"
msgstr "Beholderdepoter"
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr "Beholderdepot"
@@ -9750,6 +9841,9 @@ msgstr "Sletning af aftryksdepot mislykkedes"
msgid "ContainerRegistry|Image repository not found"
msgstr "Aftryksdepot ikke fundet"
+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 "Aftryksdepot vil blive slettet"
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "Du er ved at fjerne mærkaterne %{item}. Er du sikker?"
@@ -9980,6 +10071,9 @@ msgstr "Kunne ikke slette sammenhængscommits. Prøv venligst igen."
msgid "Continue"
msgstr "Fortsæt"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Fortsæt til det næste trin"
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr "Kopiér id"
-msgid "Copy IP Address"
-msgstr "Kopiér IP-adresse"
-
msgid "Copy KRB5 clone URL"
msgstr "Kopiér klonings-URL for KRB5"
@@ -10106,6 +10197,9 @@ msgstr "Kopiér URL"
msgid "Copy branch name"
msgstr "Kopiér grennavn"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "Kopiér koder"
@@ -10148,6 +10242,9 @@ msgstr "Kopiér etiketter og milepæl fra anden problemstilling eller sammenlæg
msgid "Copy link"
msgstr "Kopiér link"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Kopiér link til diagram"
@@ -10454,6 +10551,9 @@ msgstr "Opret branch"
msgid "Create commit"
msgstr "Opret commit"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,8 +11040,11 @@ msgstr "Præferencer"
msgid "CurrentUser|Start an Ultimate trial"
msgstr "Start en Ultimate-prøveperiode"
-msgid "CurrentUser|Upgrade"
-msgstr "Opgrader"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "Tilpassede attributter"
@@ -11114,6 +11217,9 @@ msgstr "skal være under en gruppe"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} valgte (%{maxLabels} maks.)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Dato"
@@ -11141,6 +11250,9 @@ msgstr "Vis diagramfiltre"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "MÃ¥l-URL"
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr "Slet artefakter"
msgid "Delete badge"
msgstr "Slet badge"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Slet kolonne"
@@ -12041,6 +12162,9 @@ msgstr "Slettede chatkaldenavn: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "Slettede projekter kan ikke gendannes!"
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr "Afhængighedsproxy"
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr "Udsendelseshyppighed"
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
+msgstr ""
+
msgid "Deployment Target|Project deployment target (optional)"
msgstr ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr "Modtog du ikke en bekræftelses e-mail?"
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diff-grænser"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ msgid_plural "Diffs|%d deletions"
msgstr[0] "%d sletning"
msgstr[1] "%d sletninger"
+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 "Vis %{unfoldCount} linjer"
@@ -13077,9 +13231,6 @@ msgstr "Mappenavn"
msgid "Disable"
msgstr "Deaktivér"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr "Deaktivér totrinsgodkendelse"
@@ -13092,6 +13243,9 @@ 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 ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr "Vis kilde"
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "Download artefakter"
-msgid "Download as"
-msgstr "Download som"
-
msgid "Download codes"
msgstr "Download koder"
@@ -13403,9 +13554,15 @@ msgstr "Forfaldsdato"
msgid "Due date"
msgstr "Forfaldsdato"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "Varighed"
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr "Rediger indlejret"
msgid "Edit issues"
msgstr "Rediger problemstillinger"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr "Rediger sammenlægningsanmodninger"
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr "E-mail kunne ikke sendes"
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr "Send e-mail fra GitLab - send e-mail til brugere direkte fra administratorområdet. %{link_start}Lær mere%{link_end}."
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-mail ikke verificeret. Verificer venligst din e-mail i Salesforce."
@@ -13688,6 +13842,9 @@ msgstr "E-mail-underretning for ukendte indlogninger"
msgid "Email patch"
msgstr "E-mail-patch"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "E-mail sendt"
@@ -13784,15 +13941,15 @@ msgstr "Tom fil"
msgid "Enable"
msgstr "Aktivér"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Aktivér Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Aktivér Gitpod"
@@ -13814,18 +13971,12 @@ msgstr "Aktivér PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr "Aktivér SSL-verificering"
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr "Aktivér tjenesteping"
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Aktivér integrering"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr "Aktivér delte runnere for gruppen"
msgid "Enable shared runners for this project"
msgstr "Aktivér delte runnere for projektet"
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Aktivér totrinsgodkendelse"
@@ -14030,7 +14169,7 @@ msgstr "Slutter: %{endsAt}"
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr "beskyttet"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Epic"
@@ -14419,9 +14559,6 @@ msgstr "Epics"
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr "Epics og problemstillinger"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr "start"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Fejl"
@@ -14779,9 +14919,6 @@ msgstr "Fejl"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Fejl:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr "Udløbsdato (valgfrit)"
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "Udløbet"
@@ -15413,6 +15553,9 @@ msgstr "Kunne ikke installere."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr "Kunne ikke indlæse tildelere."
@@ -15443,6 +15586,9 @@ msgstr "Kunne ikke indlæse gruppeaktivitetsmålinger. Prøv venligst igen."
msgid "Failed to load groups, users and deploy keys."
msgstr "Kunne ikke indlæse grupper, brugere og udsendelsesnøgler."
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr "Kunne ikke indlæse gennemløb."
@@ -15599,7 +15745,7 @@ msgstr "Favicon fjernes. Er du sikker?"
msgid "Feature Flags"
msgstr "Funktionsflag"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr "Filhooks"
msgid "File Hooks (%{count})"
msgstr "Filhooks (%{count})"
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Fil tilføjet"
@@ -15871,9 +16020,6 @@ msgstr "Fil omdøbt uden ændringer."
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Filskabeloner"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr "Færdige"
-msgid "Finished at"
-msgstr "Færdig kl."
-
msgid "First Name"
msgstr "Fornavn"
@@ -16123,9 +16266,6 @@ msgstr "For mere information, gå til "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr "Se dokumentationen om %{deactivating_service_ping_link_start}deaktivering af tjenesteping%{deactivating_service_ping_link_end} for mere information."
-
msgid "Forgot your password?"
msgstr "Glemt din adgangskode?"
@@ -16354,6 +16494,16 @@ msgstr ""
msgid "Geo sites"
msgstr "Geo-websteder"
+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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "Tilføj websted"
@@ -16408,6 +16561,12 @@ msgstr "Alle projekter er ved at blive planlagt til gensynkronisering"
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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 "Forbindelsestimeout må ikke være tomt"
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ msgstr "Matcher ikke den primære lagerkonfiguration"
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 "Mislykket"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr "Filtrér efter navn"
msgid "Geo|Filter by status"
msgstr "Filtrér efter status"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geostatus"
+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 "Geo-websteder"
msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
-msgid "Geo|Geo supports replication of many data types."
-msgstr "Geo understøtter replikering af mange datatyper."
-
msgid "Geo|Go to the primary site"
msgstr "Gå til det primære websted"
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
msgid "Geo|Healthy"
msgstr "Sund"
+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 "Hvis du vil foretage ændringer, så skal du besøge det primære websted."
@@ -16495,6 +16696,9 @@ msgstr "Er synkroniseret"
msgid "Geo|Internal URL"
msgstr "Intern URL"
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr "Sidste begivenheds-id fra primære"
@@ -16519,21 +16723,39 @@ msgstr "Lær mere om Geo"
msgid "Geo|Learn more about Geo site statuses"
msgstr "Lær mere om Geo-webstedsstatusser"
+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 "Aldrig"
msgid "Geo|Next sync scheduled at"
msgstr ""
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr "Ingen tilgængelige replikationspladser"
msgid "Geo|Not synced yet"
msgstr "Ikke synkroniseret endnu"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr "Intet at synkronisere"
msgid "Geo|Nothing to verify"
msgstr "Intet at verificere"
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr "Offline"
@@ -16555,6 +16780,9 @@ msgstr "Afventende synkronisering"
msgid "Geo|Pending verification"
msgstr "Afventer verificering"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "Primære knudepunkt"
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr "Sat i kø"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Download igen"
@@ -16618,6 +16849,9 @@ msgstr "Replikationsstatus"
msgid "Geo|Replication summary"
msgstr "Replikationsopsummering"
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Synkroniser igen"
@@ -16645,15 +16879,39 @@ msgstr "Verificer alle projekter igen"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
msgstr "Sekundære knudepunkt"
msgid "Geo|Secondary site"
msgstr "Sekundært websted"
+msgid "Geo|Select groups to replicate"
+msgstr ""
+
+msgid "Geo|Select shards to replicate"
+msgstr ""
+
msgid "Geo|Selective (%{syncLabel})"
msgstr "Selektiv (%{syncLabel})"
+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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ msgstr "Synkroniseringsindstillinger"
msgid "Geo|Synchronization status"
msgstr "Synkroniseringsstatus"
+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 "Databasen er i øjeblikket %{db_lag} bagefter det primære websted."
@@ -16699,9 +16963,21 @@ msgstr "Der er ingen %{replicable_type} at vise"
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 "Det vil synkronisere alle %{replicableType} igen. Det kan tage noget tid af fuldføre. Er du sikker på, at du vil fortsætte?"
@@ -16711,12 +16987,18 @@ msgstr "Det vil synkronisere alle projekter igen. Det kan tage noget tid af fuld
msgid "Geo|This will reverify all projects. It may take some time to complete. Are you sure you want to continue?"
msgstr "Det vil verificere alle projekter igen. Det kan tage noget tid af fuldføre. Er du sikker på, at du vil fortsætte?"
+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 "URL'en må ikke være tom"
@@ -16741,6 +17023,9 @@ msgstr "Opdateret %{timeAgo}"
msgid "Geo|Verification"
msgstr "Verificering"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Verificering mislykkedes - %{error}"
@@ -16756,7 +17041,7 @@ msgstr "Verificeret"
msgid "Geo|Waiting for scheduler"
msgstr "Venter på planlægger"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr "GitLab-eksport"
msgid "GitLab group: %{source_link}"
msgstr "GitLab-gruppe: %{source_link}"
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr "URL for Gitea-vært"
msgid "Gitea Import"
msgstr "Gitea-import"
+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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr "Grupper som skal synkroniseres"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Ofte besøgte"
@@ -18485,6 +18773,9 @@ msgstr "Hjælper med at forhindre botter i at udføre brute-force-angreb."
msgid "Helps prevent bots from creating accounts."
msgstr "Hjælper med at forhindre botter i at oprette kontoer."
+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 "Hjælper med at forhindre botter i at oprette problemstillinger."
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr "Her findes seneste sammenlægningsanmodningsaktivitet"
-
msgid "Hi %{username}!"
msgstr "Hej %{username}!"
@@ -18648,12 +18936,6 @@ msgstr "Husarbejde startet"
msgid "How do I configure Akismet?"
msgstr "Hvordan konfigurerer jeg Akismet?"
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr "Hvordan konfigurerer jeg den?"
-
msgid "How do I configure runners?"
msgstr "Hvordan konfigurerer jeg runnere?"
@@ -18786,6 +19068,9 @@ msgstr "IP-adresser pr. bruger"
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ msgstr ""
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "Hvis den er tilvalgt, så kan nye gruppemedlemskaber og -tilladelser kun tilføjes via LDAP-synkronisering"
-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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ msgstr "Hvis YouTube-URL'en er https://www.youtube.com/watch?v=0t1DgySidms så e
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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr "Hvis e-mailen blev tilføjet ved en fejl, så kan du fjerne den her:"
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr "Forbedr kundesupport med serviceskranke"
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ msgstr "Blog"
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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr "Kom godt i gang i dag"
@@ -19443,6 +19725,9 @@ msgstr ""
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
msgstr "Start GitLab CI/CD på 20 minutter eller mindre"
+msgid "InProductMarketing|Learn how to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Lower cost of development"
msgstr ""
@@ -19626,9 +19911,15 @@ msgstr "Meget nemt"
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 ""
@@ -19770,6 +20061,9 @@ msgstr "Hændelse"
msgid "IncidentManagement|Incidents"
msgstr "Hændelser"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Lav - S4"
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr "Skal begynde med http eller https"
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr "Brug standardindstillinger"
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr "Du kan nu lukke vinduet og vende tilbage til GitLab for Jira-programmet."
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr "Interne - gruppen og interne projekter kan vises af brugere som er logge
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr "Interne - projektet kan tilgås af brugere som er logget ind, undtagen eksterne brugere."
-msgid "Internal URL (optional)"
-msgstr "Intern URL (valgfrit)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Interne brugere"
msgid "Internal users cannot be deactivated"
msgstr "Interne brugere kan ikke deaktiveres"
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervalmønster"
@@ -20486,6 +20765,9 @@ msgstr "Ugyldigt filformat med angivne filtype"
msgid "Invalid file."
msgstr "Ugyldig fil."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr "Ugyldig hash"
@@ -20561,9 +20843,6 @@ msgstr "Inviter medlemmer"
msgid "Invite a group"
msgstr "Inviter en gruppe"
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr "Inviter medlemmer"
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
msgstr "Kadencenavn"
+msgid "Iterations|Cancel"
+msgstr ""
+
msgid "Iterations|Couldn't find iteration cadence"
msgstr "Kunne ikke finde gennemløbskadence"
msgid "Iterations|Create cadence"
msgstr "Opret kadence"
+msgid "Iterations|Create iteration"
+msgstr ""
+
msgid "Iterations|Delete cadence"
msgstr "Slet kadence"
@@ -21134,9 +21419,15 @@ msgstr "Slet gennemløbskadence?"
msgid "Iterations|Delete iteration?"
msgstr "Slet gennemløb?"
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Varighed"
@@ -21260,9 +21551,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 "I’m joining my team who’s already on GitLab"
-msgstr "Jeg deltager i mit team som allerede er på GitLab"
-
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -21368,7 +21656,7 @@ msgstr "Grund-URL for Jira-instansen."
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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr "Jira-kommentarer oprettes når der refereres til en problemstilling i en sammenlægningsanmodning."
-msgid "JiraService|Jira issue type"
-msgstr "Jira-problemstillingstype"
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr "Er du sikker på, at du vil fortsætte?"
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr "Jobbet sidder fast. Tjek runnere."
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr "Kun prøveperiode"
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Forlad"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr "Komponenter"
msgid "Licenses|Detected in Project"
msgstr "Tegistreret i projekt"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr "LÃ¥st af %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "LÃ¥ste debatten."
-msgid "Locked to current projects"
-msgstr "Låst til nuværende projekter"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Låse gør det muligt at låse en bestemte fil eller mappe."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "Maks. 100.000 begivenheder"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr "Maksimale filstørrelse for Terraform-modulpakke i byte"
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,8 +23508,8 @@ msgstr "Maksimale filstørrelse indekseret (KiB)"
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
msgstr "Den maksimale filstørrelse er 1 MB. Billedstørrelsen skal være 32 x 32 pixels. Tilladte billedformater er %{favicon_extension_whitelist}."
-msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
-msgstr "Maksimale filstørrelse er 1 MB. Pages er optimeret til et headerlogo med en højde på 28px"
+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 "Maksimale filstørrelse er 1 MB. Pages er optimeret til et logo på 640x360 px."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "Filtrér medlemmer"
@@ -23587,6 +23890,9 @@ msgstr "Sammenlægningsanmodning"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "Sammenlægningsanmodningen %{mr_link} blev kontrolleret af %{mr_author}"
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr "Sammenlægningsanalyse"
@@ -23833,6 +24139,18 @@ msgstr "Der er ingen data tilgængelig. Ændr venligst din markering."
msgid "MetricChart|There is too much data to calculate. Please change your selection."
msgstr "Der er for meget data at udregne. Ændr venligst din markering."
+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 "MÃ¥linger"
@@ -24347,10 +24665,10 @@ msgstr "Problemstillinger som har fået fjernet deres stjerne (åbne og utildelt
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr "Multiprojekt"
-msgid "Multi-project Runners cannot be removed"
-msgstr "Multiprojekt-runnere kan ikke fjernes"
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr "Skal matche %{codeStart}external_url%{codeEnd} i %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Netværk"
msgid "Network:"
msgstr "Netværk:"
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr "%{action} %{labelStart}herefter%{labelEnd} %{spanStart}netværkstrafikken%{spanEnd}."
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr "%{strongOpen}alle%{strongClose} pods"
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ".yaml-tilstand"
-
-msgid "NetworkPolicies|Add alert"
-msgstr "Tilføj alertbesked"
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr "Alle valgte"
-
-msgid "NetworkPolicies|Allow"
-msgstr "Tillad"
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr "Er du sikker på, at du vil slette regelsættet? Handlingen kan ikke fortrydes."
-
-msgid "NetworkPolicies|Create policy"
-msgstr "Opret regelsæt"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "Slet regelsæt"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr "Slet regelsæt: %{policy}"
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr "Afvis al trafik"
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "Rediger regelsæt"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Ugyldigt eller tomt regelsæt"
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Fejl ved Kubernetes: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr "Netværk"
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr "Netværkstrafik"
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr "Regeltilstand"
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "Gem ændringer"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "Noget gik galt. Kunne ikke opdatere regelsæt"
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr "Noget gik galt. Kunne ikke hente regelsæt"
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr "Alle DNS-navne"
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr "alle IP-adresser"
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr "domænenavn"
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr "pod med etiketter"
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr "pods med etiketter"
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr "Regelsæt"
@@ -25236,9 +25404,6 @@ msgstr "Ingen milepæl"
msgid "No Scopes"
msgstr "Ingen omfang"
-msgid "No Tag"
-msgstr "Intet mærkat"
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr "Ingen profiler fundet"
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ msgstr "Kommentaren er fortrolig og kun synlig for projektmedlemmer"
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 found…"
-msgstr "Intet fundet …"
-
msgid "Nothing to preview."
msgstr "Intet at forhåndsvise."
@@ -25795,6 +25957,42 @@ msgstr "Underretninger til"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov."
@@ -25849,9 +26047,6 @@ msgstr "Antal shards"
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ msgstr "Vagtplaner"
msgid "On-call schedules"
msgstr "Vagtplaner"
+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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ msgstr ""
msgid "OnDemandScans|Create new site profile"
msgstr "Opret ny webstedsprofil"
+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 "Beskrivelse (valgfrit)"
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,21 +26362,27 @@ 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 "Skannerprofil"
-msgid "OnDemandScans|Schedule scan"
-msgstr ""
-
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr "Brug eksisterende skannerprofil"
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr "Slet pakkeversion"
msgid "PackageRegistry|Delete package"
msgstr "Slet pakke"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr "Pip-kommando"
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ msgstr "Der er endnu ingen pakker"
msgid "PackageRegistry|There was a problem fetching the details for this package."
msgstr "Der var problemer med at hente detaljerne for pakken."
+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 ""
@@ -26999,15 +27242,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "Deltagere"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr "Bestået"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pause"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr "Pipeline %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr "Der opstod en fejl ved fortolkning af dataene for diagrammerne."
msgid "PipelineCharts|Total:"
msgstr "I alt:"
+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 ""
@@ -28079,6 +28325,9 @@ msgstr "Udfyld venligst med et beskrivende navn på dit gruppe."
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 "Udfyld venligst feltet."
@@ -28118,9 +28367,6 @@ msgstr "Angiv venligst attributter for at opdatere"
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-msgstr "Se venligst %{docs_url}"
-
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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "Vent venligst et øjeblik. Siden opdateres automatisk når den er klar."
@@ -28262,6 +28511,12 @@ msgstr "Vælg hvilket indhold du vil se på et projekts oversigtsside."
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Vælg det indhold du vil se på din startside."
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Konfigurer hvordan datoer og klokkeslæt vises for dig."
@@ -28271,6 +28526,12 @@ 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 colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr "Vis klokkeslæt i 24-timers format"
@@ -28307,6 +28568,9 @@ msgstr "Skal være et tal fra %{min} til %{max}"
msgid "Preferences|Navigation theme"
msgstr "Tema for navigation"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Indhold for projektoversigt"
@@ -28406,9 +28670,6 @@ msgstr "Forrige fil i diff"
msgid "Previous unresolved discussion"
msgstr "Forrige uløste debat"
-msgid "Primary"
-msgstr "Primær"
-
msgid "Primary Action"
msgstr "Primær handling"
@@ -29027,9 +29288,6 @@ msgstr "Projekteksport kunne ikke slettes."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "Projekteksport aktiveret"
-
msgid "Project export has been deleted."
msgstr "Projekteksport er blevet slettet."
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Brugere kan kopiere depotet til et nyt projekt."
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr "Genimportér"
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr "Læs dokumentation"
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Seneste søgninger"
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Tilmeld med totrinsprogram"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr "Genåbnede denne %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Genåbner denne %{quick_action_target}."
-msgid "Repeats"
-msgstr "Gentager"
-
msgid "Replace"
msgstr "Erstat"
@@ -31422,9 +31668,6 @@ msgstr "Besvar …"
msgid "Repo by URL"
msgstr "Depot efter URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "Rapportér misbrug"
@@ -31516,6 +31759,9 @@ msgstr "Mislykkedes"
msgid "Reports|Filename"
msgstr "Filnavn"
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr "Skanner"
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Anmod om adgang"
msgid "Request a new one"
msgstr "Anmod om en ny"
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr "Anmodningsdetaljer"
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr "Anmodninger"
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Prøv igen"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Vejkort"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Rolle"
@@ -32190,12 +32430,12 @@ msgstr "Kør tests mod din kode live med webterminalen"
msgid "Run untagged jobs"
msgstr "Kør job uden mærkater"
+msgid "Runner"
+msgstr ""
+
msgid "Runner API"
msgstr "Runner API"
-msgid "Runner cannot be deleted, please contact your administrator."
-msgstr ""
-
msgid "Runner tokens"
msgstr "Runnertokens"
@@ -32211,9 +32451,6 @@ msgstr "Runnere"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ msgstr "Download seneste programfil"
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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ msgstr "Runnere"
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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 "Du kan opsat en bestemt runner til at blive brugt af flere projekter men du kan ikke gøre den til en delt runner."
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr "gruppe"
-msgid "Runners|locked"
-msgstr "låst"
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr "Sekundær"
-
msgid "Secondary email:"
msgstr "Sekundære e-mail:"
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Alle regelsæt"
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,25 +33576,49 @@ 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 "Beskrivelse"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
-msgstr ""
-
msgid "SecurityOrchestration|Edit policy"
msgstr "Rediger regelsæt"
msgid "SecurityOrchestration|Edit policy project"
msgstr "Rediger regelsætprojekt"
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr "Netværk"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "Nyt regelsæt"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr "Kun ejere kan opdatere sikkerhedsregelsætprojekt"
msgid "SecurityOrchestration|Policies"
msgstr "Regelsæt"
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr "Regelsætbeskrivelse"
@@ -33444,15 +33693,18 @@ msgstr "Regelsæteditor"
msgid "SecurityOrchestration|Policy status"
msgstr "Regelsætstatus"
-msgid "SecurityOrchestration|Policy summary"
-msgstr ""
-
msgid "SecurityOrchestration|Policy type"
msgstr "Regelsættype"
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 "Regler"
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 "Sikkerhedsregelsætprojekt blev linket"
@@ -33516,6 +33774,9 @@ msgstr ""
msgid "SecurityOrchestration|Select security project"
msgstr "Vælg sikkerhedsprojekt"
+msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
+msgstr ""
+
msgid "SecurityOrchestration|Sorry, your filter produced no results."
msgstr "Beklager, dit filter gav ingen resultater."
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,12 +33876,12 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr "+%{count} mere"
-msgid "SecurityPolicies|Environment(s)"
-msgstr "Miljøer"
-
msgid "SecurityPolicies|Policy type"
msgstr "Regelsættype"
+msgid "SecurityReports|%{count} Selected"
+msgstr ""
+
msgid "SecurityReports|%{count}+ projects"
msgstr ""
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr "Vælg gren"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr "Vælg forfaldsdato"
@@ -34035,9 +34302,6 @@ msgstr "Vælg gruppe"
msgid "Select group or project"
msgstr "Vælg gruppe eller projekt"
-msgid "Select groups to replicate"
-msgstr "Vælg grupper som skal replikeres"
-
msgid "Select health status"
msgstr "Vælg helbredsstatus"
@@ -34080,9 +34344,6 @@ msgstr "Vælg projekter"
msgid "Select reviewer(s)"
msgstr "Vælg kontrollanter"
-msgid "Select shards to replicate"
-msgstr "Vælg shards som skal replikeres"
-
msgid "Select source"
msgstr "Vælg kilde"
@@ -34131,9 +34392,6 @@ msgstr "Valgte projekter"
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 "Valg af en GitLab-bruger vil tilføje et link til GitLab-brugeren i beskrivelserne af problemstillinger og kommentarer (f.eks. \"Af %{link_open}@ronnierev%{link_close}\"). Det vil også tilknytte og/eller tildele problemstillingerne og kommentarerne med den valgte bruger."
-msgid "Selective synchronization"
-msgstr "Selektiv synkronisering"
-
msgid "Self monitoring"
msgstr "Selvovervågning"
@@ -34335,13 +34593,13 @@ msgstr "Serviceskranke"
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 "Serviceskranke giver personer mulighed for at oprette problemstillinger i din GitLab-instans uden deres egen brugerkonto. Det giver en unik e-mailadressen til slutbrugeren som kan bruges til at oprette problemstillinger i et projekt. Svar kan enten sendes gennem GitLab-grænsefladen eller med e-mail. Kun slutbrugere ser tråde via e-mail."
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 "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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "Indstil vægt"
msgid "Set weight to %{weight}."
msgstr "Indstil vægt til %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr "Indstil hvad der skal replikeres af det sekundære websted."
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Der vises en indikator ved siden af dit navn og din avatar"
@@ -34640,9 +34889,6 @@ msgstr "Alvorlighed: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr "Der opstod en fejl under opdatering af alvorlighed."
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "Del"
@@ -35545,6 +35791,12 @@ msgstr "Kilde-IP"
msgid "Source branch"
msgstr "Kildegren"
+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 "Kildegren: %{source_branch_open}%{source_branch}%{source_branch_close}"
@@ -36067,6 +36319,12 @@ msgstr "Gennemstreget"
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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr "Tilføj sæder"
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr "Mørk koral"
@@ -36421,6 +36664,12 @@ msgstr "Mørkeviolet"
msgid "SuggestedColors|Deep violet"
msgstr "Dyb violet"
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr "Grå"
@@ -36439,6 +36688,9 @@ msgstr "Magentapink"
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr "Rød"
@@ -36481,8 +36733,8 @@ msgstr "Aktivér abonnement"
msgid "SuperSonics|Activation code"
msgstr "Aktiveringskode"
-msgid "SuperSonics|An error occurred while activating your subscription."
-msgstr "Der opstod en fejl under aktivering af dit abonnement."
+msgid "SuperSonics|An error occurred while adding your subscription."
+msgstr ""
msgid "SuperSonics|Billable users"
msgstr ""
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr "Køb abonnement"
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ msgstr ""
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr "Lær at %{linkStart}aktivere dit abonnement%{linkEnd}."
+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 "Licenseret til"
@@ -36526,7 +36778,10 @@ msgstr "HÃ¥ndter"
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ msgstr "Brugere over abonnement"
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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr "Synkroniser nu"
msgid "Synced"
msgstr "Synkroniseret"
-msgid "Synchronization settings"
-msgstr "Synkroniseringsindstillinger"
-
msgid "Synchronize LDAP"
msgstr "Synkroniser LDAP"
@@ -36840,6 +37089,9 @@ msgstr "Udgivelsesnoter"
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Mærkater"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr "Generering af rapporten forårsagede en fejl."
-msgid "Terraform|Get started with Terraform"
-msgstr "Kom godt i gang med Terraform"
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "Test"
@@ -37130,9 +37382,6 @@ msgstr "Testsager"
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr "Committen findes ikke"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr "Sammenligningsvisningen kan være upræcis pga. sammenlægningskonflikter."
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr "Projektet blev forgrenet."
msgid "The project was successfully imported."
msgstr "Projektet blev importeret."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 "Der var problemer med at hente projekterne"
msgid "There was a problem fetching users."
msgstr "Der var problemer med at hente brugere."
+msgid "There was a problem handling the pipeline data."
+msgstr ""
+
msgid "There was a problem sending the confirmation email"
msgstr "Der var problemer med at sende bekræftelses e-mailen"
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "Der opstod en fejl ved hentning af %{replicableType}"
-msgid "There was an error fetching the Geo Settings"
-msgstr "Der opstod en fejl ved hentning af Geo-indstillingerne"
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr "Der opstod en fejl under hentning af udsendelsesfrysningerne."
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr "Der opstod en fejl ved indhentning af Jira-brugerne."
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "Der opstod en fejl ved gemning af dine ændringer."
@@ -38116,9 +38359,6 @@ msgstr "Der opstod en fejl ved synkronisering af %{replicableType}"
msgid "There was an error trying to validate your query"
msgstr "Der opstod en fejl under forsøg på at validere din forespørgsel"
-msgid "There was an error updating the Geo Settings"
-msgstr "Der opstod en fejl ved opdatering af Geo-indstillingerne"
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
msgstr "Epicen findes ikke eller du har ikke tilstrækkelig tilladelse."
+msgid "This epic would exceed maximum number of related epics."
+msgstr ""
+
msgid "This feature requires local storage to be enabled"
msgstr ""
@@ -38473,7 +38716,7 @@ msgstr "Problemstillingen er skjult fordi dens forfatter er blevet udelukket"
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr "Navnerummet er allerede blevet taget! Vælg venligst et andet."
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr "Valgmuligheden er kun tilgængelig på GitLab.com"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Siden er utilgængelig fordi du ikke har tilladelse til at læse information på tværs af flere projekter."
@@ -38776,9 +39016,6 @@ msgstr "Det vil fjerne forgreningsrelationen mellem projektet og andre projekter
msgid "Thread to reply to cannot be found"
msgstr "Kan ikke finde tråden som skal besvares"
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr "Alertbeskeddetaljer"
@@ -38947,9 +39184,6 @@ msgstr "Tid fra første commit til første kommentar"
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr "Tid i sekunder"
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "lige nu"
msgid "Timeago|right now"
msgstr "lige nu"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 "Skriv %{phrase_code} for at bekræfte"
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr "Kom i gang ved at bruge linket nedenunder for at bekræfte din konto."
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ msgstr "Fejlsøg og overvåg dit program med tracing"
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 "Prøv igen"
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr "Tirsdag"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr "Sluk"
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Type"
-msgid "Type/State"
-msgstr "Type/tilstand"
-
msgid "U2F Devices (%{length})"
msgstr "U2F-enheder (%{length})"
@@ -39986,6 +40223,9 @@ 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 "Kan ikke generere nyt instans-id"
@@ -40265,9 +40505,6 @@ msgstr "Opdatering mislykkedes"
msgid "Update it"
msgstr "Opdater den"
-msgid "Update iteration"
-msgstr "Opdater gennemløb"
-
msgid "Update milestone"
msgstr "Opdater milepæl"
@@ -40316,9 +40553,6 @@ msgstr "Opdateret %{updated_at} af %{updated_by}"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr "Opdateringer"
-
msgid "Updating"
msgstr "Opdaterer"
@@ -40424,6 +40658,12 @@ msgstr "Forbrug af CI-minutter pr. måned"
msgid "UsageQuota|CI minutes usage by project"
msgstr "Forbrug af CI-minutter efter projekt"
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
msgid "UsageQuota|Code packages and container images."
msgstr "Kodepakker og beholderaftryk."
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr "Sæder"
msgid "UsageQuota|Shared bits of code and text."
msgstr "Delte stykker med kode og tekst."
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Udklip"
@@ -40532,6 +40775,12 @@ msgstr "Forbrugskvoter"
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 ""
@@ -40544,9 +40793,6 @@ msgstr "Forbrug af ressourcer på tværs af dine projekter"
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "Forbrug siden"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Brugere kan starte et udviklingsmiljø fra et GitLab-browserfaneblad når %{linkStart}Gitpod%{linkEnd}-integreringen er aktiveret."
-msgid "Users can reactivate their account by signing in."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr "Billede"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr "Hjælp for webhooks"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr "Hvad gør kommandoen?"
-msgid "What is Auto DevOps?"
-msgstr "Hvad er Auto DevOps?"
-
msgid "What is Markdown?"
msgstr "Hvad er Markdown?"
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr "Hvad er squashing?"
-msgid "What is time tracking?"
-msgstr "Hvad er tidssporing?"
-
msgid "What is your job title? (optional)"
msgstr "Hvad er din jobtitel? (valgfrit)"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "Når sammenlægningsanmodningen accepteres"
@@ -42385,8 +42616,8 @@ msgstr "Hvem vil komme til at bruge GitLab-prøveperioden?"
msgid "Who will be using this group?"
msgstr "Hvem vil komme til at bruge gruppen?"
-msgid "Why are you signing up? (Optional)"
-msgstr "Hvorfor tilmelder du dig? (valgfrit)"
+msgid "Why are you signing up? (optional)"
+msgstr ""
msgid "Wiki"
msgstr "Wiki"
@@ -42619,12 +42850,18 @@ msgstr "Igangværende arbejde (åbne og tildelte)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "Vil du oprette en ny gren?"
@@ -42712,6 +42955,11 @@ msgstr ""
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr "Du er ved at tilføje %{usersTag} personer til debatten. De vil alle modtage en underretning."
+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 ""
@@ -42808,8 +43056,8 @@ msgstr "Du er på en skrivebeskyttet GitLab-instans."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
-msgstr "Du er logget ind på GitLab som %{user_link}"
+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 "Du prøver på at uploade noget andet end et billede. Upload venligst en .png, .jpg, .jpeg, .gif, .bmp, .tiff eller .ico."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr "godkendt af: "
-
msgid "archived"
msgstr "arkiveret"
@@ -43838,6 +44089,15 @@ 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 "kan kun ændres af en gruppeadministrator."
@@ -43975,6 +44235,9 @@ msgstr "Alle alvorligheder"
msgid "ciReport|All tools"
msgstr "Alle værktøjer"
+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 "Anvend automatisk patchen i en ny gren"
@@ -44691,8 +44954,8 @@ msgid_plural "merge requests"
msgstr[0] "sammenlægningsanmodning"
msgstr[1] "sammenlægningsanmodninger"
-msgid "merged %{timeAgo}"
-msgstr "sammenlagt %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44703,6 +44966,12 @@ msgstr "mangler"
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 "1 sammenlægningscommit"
@@ -44712,6 +44981,12 @@ 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 "Sammenlægningsanmodningen indeholder ingen ændringer."
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr "Annuller automatisk sammenlægning"
-msgid "mrWidget|Check out branch"
-msgstr "Check out gren"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr "Tjekker om sammenlægningsanmodning kan sammenlægges …"
@@ -44834,9 +45106,6 @@ msgstr "Afskedig"
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "E-mail-patches"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Kunne ikke indlæse udsendelsesstatistik"
@@ -44947,9 +45216,6 @@ msgstr "Ã…bn i Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Ã…bn i web-IDE"
-msgid "mrWidget|Plain diff"
-msgstr "Ren diff"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr "min-fantastiske-gruppe"
msgid "my-channel"
msgstr "min-kanal"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "behøver opmærksomhed"
@@ -45112,9 +45381,6 @@ msgstr "udløber aldrig"
msgid "new merge request"
msgstr "ny sammenlægningsanmodning"
-msgid "no approvers"
-msgstr "ingen godkendere"
-
msgid "no expiration"
msgstr "ingen undtagelse"
@@ -45130,6 +45396,12 @@ msgstr "ingen omfang valgt"
msgid "none"
msgstr "ingen"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "ikke fundet"
@@ -45188,9 +45460,6 @@ msgstr "afventende kommentar"
msgid "pending deletion"
msgstr "afventende sletning"
-msgid "per day"
-msgstr "pr. dag"
-
msgid "personal access token"
msgstr "personlig adgangstoken"
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "svar"
msgstr[1] "svar"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index 92659cc7218..b730a904659 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr " %{start} bis %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d Gruppe"
msgstr[1] "%d Gruppen"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d Gruppe ausgewählt"
-msgstr[1] "%d Gruppen ausgewählt"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d Stunde"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d Sekunde"
msgstr[1] "%d Sekunden"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d Fragment ausgewählt"
-msgstr[1] "%d Fragmente ausgewählt"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,8 +501,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
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 tags."
-msgstr "%{code_open}Geschützt:%{code_close} Nur für geschützte Branches oder Tags sichtbar."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} verfasste %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Versuche erneut, eine Datei hochzuladen."
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 "%{extra} weitere Downstream-Pipelines"
@@ -781,9 +774,6 @@ msgstr "%{level_name} ist in einer %{group_level_name} -Gruppe nicht erlaubt."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ist nicht zulässig, da das Fork-Quellprojekt eine geringere Sichtbarkeit hat."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}Weiterlernen.%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ msgstr "%{link_start}Entferne das %{draft_snippet} Präfix%{link_end} aus dem Ti
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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Welche Informationen sammelt GitLab Inc.?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow} und %{awardsListLength} weitere"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] "Kein Ergebnis aus %{securityScanner} verfügbar, da keine Pipeline seit der Aktivierung ausgeführt wurde. %{linkStart}Eine Pipeline ausführen%{linkEnd}"
msgstr[1] "%{securityScanner}-Ergebnisse sind nicht verfügbar, da keine Pipeline seit der Aktivierung ausgeführt wurde. %{linkStart}Eine Pipeline ausführen%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}Welche Informationen werden mit GitLab Inc. geteilt.?%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} weitere Genehmigungsberechtigte"
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr "1-9 Beiträge"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 Beiträge"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Erster Beitrag!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 Beiträge"
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
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"
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Deinen Bericht wird so schnell wie möglich von einer zuständigen Person überprüfen."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr "Einen Link hinzufügen"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr "Füge Zustimmungsregel hinzu"
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Fetten Text hinzufügen"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-msgstr ""
-
msgid "AddMember|Invite email is invalid"
msgstr "Einladungs-E-Mail ist ungültig"
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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Fehler beim Laden der Statistik. Bitte versuche es erneut"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 "'Geteilte Runner' für neue Projekte aktivieren"
+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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr "Keine Pipeline erforderlich"
+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 "Erforderliche Pipeline-Konfiguration"
+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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Aktive Benutzer(innen)"
@@ -3627,6 +3683,9 @@ msgstr "Alle Projekte"
msgid "All projects selected"
msgstr "Alle Projekte ausgewählt"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,14 +3701,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr "Erlaube Zugriff auf die folgenden IP-Adressen"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Erlaube Commits von Mitgliedern die zum Zielbranch mergen können."
+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 "Gruppenbesitzer erlauben, LDAP-bezogene Einstellungen zu verwalten"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 "Beim Entfernen des Epics ist ein Fehler aufgetreten."
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr "Analysen"
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 "Anti-Spam-Überprüfung"
@@ -4334,12 +4393,27 @@ msgstr "Anwendung wurde erfolgreich aktualisiert."
msgid "Application: %{name}"
msgstr "Anwendung: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "August"
msgid "Authenticate"
msgstr "Authentifizieren"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr ""
msgid "Authentication Log"
msgstr "Authentifizierungsprotokoll"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Authentifizierung fehlgeschlagen: %{error_message}"
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Unten findest du alle Gruppen, die öffentlich sind."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Ãœbersicht"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Geschützte Branches können in %{project_settings_link} verwaltet werden."
-
msgid "Branches|Show active branches"
msgstr "Aktive Branches anzeigen"
@@ -6289,9 +6363,6 @@ msgstr "weicht vom Upstream ab"
msgid "Branches|merged"
msgstr "merged"
-msgid "Branches|project settings"
-msgstr "Projekteinstellungen"
-
msgid "Branches|protected"
msgstr "geschützt"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr "CI-Variablen"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI wird mit den oben angegebenen Anmeldeinformationen ausgeführt."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "CI/CD-Konfiguration"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Abbrechen"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Erneut prüfen"
msgid "Check feature availability on namespace plan"
msgstr "Überprüfe die Verfügbarkeit der Funktion im Namensraum"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr "Abonnementbedingungen"
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr "Untergeordnetes Epic existiert nicht."
msgid "Child epic doesn't exist."
msgstr "Untergeordnetes Epic existiert nicht."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Wähle eine Farbe."
msgid "Choose file…"
msgstr "Datei auswählen…"
-msgid "Choose specific groups or storage shards"
-msgstr "Wählen Sie bestimmte Gruppen oder Speicherfragmente aus"
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Leeren"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+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|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Mit dieser Option kannst du Anwendungen auf RBAC-Clustern installieren."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr "Befehl"
@@ -9119,9 +9222,6 @@ msgstr "Keine zugehörigen Merge-Requests gefunden"
msgid "Committed by"
msgstr "Committed von"
-msgid "Commit…"
-msgstr "Commit…"
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr "Verbindungsfehler"
msgid "Connection timed out"
msgstr "Zeitüberschreitung der Verbindung"
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Fortsetzen"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Fahre mit dem nächsten Schritt fort"
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr "ID kopieren"
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr "URL kopieren"
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr "Link kopieren"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr "Branch erstellen"
msgid "Create commit"
msgstr "Commit erstellen"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr "Einstellungen"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr "Diagrammfilter anzeigen"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diff-Grenzen"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 "Kein Dateiname verfügbar"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr ""
@@ -13077,9 +13231,6 @@ msgstr "Verzeichnisname"
msgid "Disable"
msgstr "Deaktivieren"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ 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"
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "Artefakte herunterladen"
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr "Codes herunterladen"
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr "Fälligkeitsdatum"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Tickets bearbeiten"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr "Indizierungsbeschränkungen für Elasticsearch"
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr "E-Mail-Anzeigename"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr "E-Mail-Patch"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,15 +13941,15 @@ msgstr ""
msgid "Enable"
msgstr "Aktivieren"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Auto-DevOps aktivieren"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr ""
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Aktiviere die Pseudonymizer-Datensammlung"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Zwei-Faktor-Authentifizierung aktivieren"
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr "Umgebung hat keine Bereitstellungen"
@@ -14395,6 +14532,9 @@ msgstr "geschützt"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Epic"
@@ -14419,9 +14559,6 @@ msgstr "Epics"
msgid "Epics Roadmap"
msgstr "Epics Roadmap"
-msgid "Epics and Issues"
-msgstr "Epics und Tickets"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Mit Epics kannst du deine Projekte effizienter und mit weniger Aufwand verwalten"
@@ -14524,6 +14661,9 @@ msgstr "fällig"
msgid "Epics|start"
msgstr "starten"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Fehler"
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Fehler:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Dateivorlagen"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr "Fertiggestellt"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr "Für mehr Informationen, gehe zu "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 "Tracking-Eintrag für ein vorhandenes Projekt konnte nicht entfernt werden."
@@ -16453,9 +16630,21 @@ 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 "Fehlgeschlagen"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
msgstr "Nach Status filtern"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo-Status"
+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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr "Wird synchronisiert"
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 "Nie"
msgid "Geo|Next sync scheduled at"
msgstr "Nächste Synchronisierung geplant um"
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
msgid "Geo|Not synced yet"
msgstr "Noch nicht synchronisiert"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr "Ausstehende Synchronisation"
msgid "Geo|Pending verification"
msgstr "Ausstehende Überprüfung"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr "Projekte in bestimmten Speicherfragmenten"
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Erneuter Download"
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Resynchronisation"
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 "Tracking-Eintrag für Projekt (%{project_id}) wurde erfolgreich entfernt."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Überprüfung fehlgeschlagen - %{error}"
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "Warte auf den Scheduler"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr "Gitea-Host-URL"
msgid "Gitea Import"
msgstr "Gitea-Import"
+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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Häufig besucht"
@@ -18485,6 +18773,9 @@ msgstr ""
msgid "Helps prevent bots from creating accounts."
msgstr "Hilft zu verhindern, dass Bots sich Konten erstellen."
+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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr "Bereinigung erfolgreich gestartet"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identifikator"
@@ -18825,13 +19110,10 @@ 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."
-msgstr "Wenn diese Option deaktiviert ist, wird ein abweichender lokaler Branch nicht automatisch mit Commits von seinem remote Gegenstück aktualisiert, um lokalen Datenverlust zu verhindern. Wenn der Standardbranch (%{default_branch}) abweicht und nicht aktualisiert werden kann, schlägt die Spiegelung fehl. Andere abweichende Branches werden ohne Meldung ignoriert."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Interne Benutzer(innen)"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervallmuster"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Verlassen"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr "Komponenten"
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr "Lizenzdetails für dein Projekt anzeigen"
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr "Auf aktuelle Projekte beschränkt"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Sperrungen bieten die Möglichkeit, bestimmte Dateien oder Ordner zu sperren."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr "Merge-Request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "Metriken"
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Netzwerk"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ msgstr "Benachrichtigungen ein"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "Teil der Merge-Request-Änderungen"
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pausieren"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Insgesamt:"
+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 ""
@@ -28079,6 +28325,9 @@ msgstr "Bitte gib einen beschreibenden Namen für deine Gruppe ein."
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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ msgstr "Wähle aus, welche Inhalte du auf der Projektübersichtsseite sehen möc
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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 "Uhrzeit im 24h-Format anzeigen"
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr "Navigationsthema"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Inhalt der Projektübersicht"
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "Primär"
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "Der Export des Projekts konnte nicht gelöscht werden."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "Der Export des Projekts wurde gelöscht."
@@ -29657,8 +29915,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-msgstr "Benutzer(innen) können nur Commits in dieses Repository pushen die mit einer ihrer eigenen verifizierten E-Mail-Adressen committet wurden."
+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 ""
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Zuletzt gesucht"
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "Repo via URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr "Fehlschlag"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Repository-Speicher"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Anfrage auf Zugriff"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-msgstr "Fordert Profile an"
-
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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Wiederholen"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Roadmap"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr "Unmarkierte Jobs ausführen"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr "Runners"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "Runner derzeit online: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Runners-Seite."
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 ""
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 "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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr "Zu synchronisierende Fragmente"
-
msgid "Share"
msgstr "Teilen"
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr "Versionshinweise"
msgid "TagsPage|Repository has no tags yet."
msgstr "Repository hat noch keine Tags."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Tags"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "Test"
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-msgstr "Testabdeckung analysieren"
-
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] ""
@@ -37382,9 +37631,6 @@ msgstr "Der Commit existiert nicht"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Diese Seite ist nicht verfügbar, da du nicht Informationen über mehrere Projekte hinweg lesen darfst."
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "vor kurzem"
msgid "Timeago|right now"
msgstr "gerade jetzt"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr "Gib zunächst deine Gitea-Host-URL und einen %{link_to_personal_token} e
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ msgstr ""
msgid "Trigger pipelines for mirror updates"
msgstr "Pipelines für Mirror-Updates auslösen"
-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."
+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."
@@ -39782,6 +40022,9 @@ 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 "Wiederholen"
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr "Dienstag"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Typ"
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr "Aktualisiert %{updated_at} von %{updated_by}"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "Aktualisiere"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr "Verschiedene E-Mail-Einstellungen."
msgid "Various settings that affect GitLab performance."
msgstr "Verschiedene Einstellungen, die sich auf die GitLab-Leistung auswirken."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr "Bezeichner"
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr "Du bist auf einer GitLab-Instanz, die nur Lesezugriff erlaubt."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ msgstr "Du kannst deine .gitlab-ci.yml mit %{linkStart}CI Lint%{linkEnd} testen.
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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr "archiviert"
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] "Merge-Request"
msgstr[1] "Merge-Requests"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ msgstr "fehlt"
msgid "most recent deployment"
msgstr "letzte Bereitstellung"
+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 "1 Merge-Commit"
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "Branch auschecken"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "E-Mail-Patches"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Fehler beim Laden der Bereitstellungsstatistiken"
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "In Web-IDE öffnen"
-msgid "mrWidget|Plain diff"
-msgstr "Unformatiertes Diff"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "erfordern Beachtung"
@@ -45112,9 +45381,6 @@ msgstr "verfällt nie"
msgid "new merge request"
msgstr "Neuer Merge-Request"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr "Keine"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "nicht gefunden"
@@ -45188,9 +45460,6 @@ msgstr "ausstehender Kommentar"
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr "pro Tag"
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "Antwort"
msgstr[1] "Antworten"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po
index 77b9ffed530..888702022a1 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index c6490d66a85..a2805284af3 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Nuligi"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr "Enmetita de"
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr "Nomo de dosierujo"
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr "La refreÅigo komenciÄis sukcese"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervala Åablono"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totalo:"
+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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "Ne eblas forigi la projektan elporton."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "La projekta elporto estis forigita."
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Peti atingeblon"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr "novan peton pri kunfando"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 2a1ec0a0901..04e54459464 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr " %{start} hasta %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d grupo"
msgstr[1] "%d grupos"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d grupo seleccionado"
-msgstr[1] "%d grupos seleccionados"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hora"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d shard seleccionado"
-msgstr[1] "%d shards seleccionados"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,8 +501,8 @@ msgstr "%{codeStart}types%{codeEnd} está obsoleto y se eliminará en la versió
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."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Protegido:%{code_close} Sólo expuesto a etiquetas o ramas protegidas."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} creado %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Intente subir un archivo de nuevo."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@empresa.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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} más downstream pipelines"
@@ -781,9 +774,6 @@ msgstr "%{level_name} no está permitido en un grupo de %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} no está permitido debido a que el fork del proyecto origen tiene menor visibilidad."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}Más información.%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, y %{awardsListLength} más"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] "+%d más"
msgstr[1] "+%d más"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} aprobadores más"
-
msgid "+%{extra} more"
msgstr "+%{extra} más"
@@ -1343,6 +1324,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bytes"
@@ -1467,6 +1451,9 @@ msgstr[1] "Quedan %d años"
msgid "1-9 contributions"
msgstr "1-9 contribuciones"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 contribuciones"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "¡1ra contribución!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 contribuciones"
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr "Un elemento de menú del tablero de métricas aparece en la sección de monitorización del área de administración."
-
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"
@@ -1602,9 +1589,6 @@ msgstr "Un control administrativo, operativo o técnico (es decir, salvaguarda o
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Un miembro del equipo revisará su informe tan pronto como sea posible."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr "Se ha creado un nuevo pipeline de Auto DevOps,diríjase a la página de Pipelines para ver más detalles"
@@ -1629,6 +1613,9 @@ msgstr ""
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Una tarea épica no confidencial no se puede asignar a una tarea épica padre confidencial"
+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 "Un sitio HTML simple que utiliza Netlify para CI/CD en lugar de GitLab, pero que mantiene todas las otras excelentes características de GitLab"
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr "Cancelar suscripción"
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr "Puede %{unsubscribe_link} en cualquier momento."
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr "Añadir una línea"
msgid "Add a link"
msgstr "Añadir un enlace"
-msgid "Add a link to Grafana"
-msgstr "Añsdir un enlace a Grafana"
-
msgid "Add a new issue"
msgstr "Añadir una nueva incidencia"
@@ -2175,6 +2150,9 @@ msgstr "Añadir una regla de aprobación"
msgid "Add approvers"
msgstr "Añadir aprobadores"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Añadir texto en negrita"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr "AddContextCommits|Añadir/eliminar"
-msgid "AddMember|Emails cannot be blank"
-msgstr "Los correos electrónicos no pueden estar en blanco"
-
msgid "AddMember|Invite email is invalid"
msgstr "El correo electrónico de invitación no es válido"
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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Se ha producido un error al cargar las estadísticas. Por favor, inténtalo de nuevo"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "Deshabilitar el token del feed"
@@ -2649,12 +2624,39 @@ 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 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 "Habilitar ejecutores compartidos para los nuevos proyectos"
+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 ""
@@ -2664,12 +2666,24 @@ msgstr "He leído y acepto los %{link_start}términos de servicio%{link_end}(PDF
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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Mantener los últimos artefactos para todos los trabajos en los últimos pipelines ejecutados correctamente"
msgid "AdminSettings|Let's Encrypt email"
msgstr "Correo electrónico de Let's Encrypt"
+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 ""
@@ -2700,18 +2714,39 @@ msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr "No se requiere un pipeline"
+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 "Proteger las variables de CI/CD de forma predeterminada"
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr ""
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuración del pipeline requerida"
+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 "Seleccionar una plantilla de CI/CD"
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Usuarios activos"
@@ -3627,6 +3683,9 @@ msgstr "Todos los proyectos"
msgid "All projects selected"
msgstr "Todos los proyectos seleccionados"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Todos los hilos resueltos"
@@ -3642,14 +3701,20 @@ 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"
msgid "Allow access to the following IP addresses"
msgstr "Permitir el acceso a las siguientes direcciones IP"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Permitir commits de los miembros que pueden hacer merge con la rama de destino."
+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 "Permitir a los propietarios de los grupos administrar configuraciones relacionadas con LDAP"
@@ -3690,9 +3755,6 @@ msgstr "Permitir que los subgrupos configuren sus propias reglas de autenticaciÃ
msgid "Allow this key to push to this repository"
msgstr "Permitir a esta clave hacer push a este repositorio"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr "Permitir a los usuarios solicitar acceso (si la visibilidad es pública
msgid "Allowed"
msgstr "Permitido"
-msgid "Allowed Geo IP"
-msgstr "Geo IP permitida"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Caracteres permitidos: +, 0-9, - y espacios."
@@ -4080,6 +4139,9 @@ msgstr "Se ha producido un error al analizar el archivo."
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 "Se ha producido un error al eliminar las tareas épicas."
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr "Se ha producido un error al subir el archivo. Por favor, inténtelo de nuevo."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "Se ha producido un error al subir la imagen. Por favor, inténtelo de nuevo."
-
msgid "An error occurred while validating group path"
msgstr "Se ha producido un error al validar la ruta del grupo"
@@ -4223,9 +4282,6 @@ msgstr "Se ha producido un error desconocido."
msgid "Analytics"
msgstr "Analíticas"
-msgid "Analyze a review version of your web application."
-msgstr "Analizar una revisión de la versión de la aplicación web."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analizar sus dependencias en busca de vulnerabilidades conocidas."
@@ -4256,6 +4312,9 @@ msgstr "Hay una acción en curso actualmente"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Ya hay otro gestor de incidencias ya está en uso. Sólo puede estar activo un servicio de gestión de incidencias al mismo tiempo"
+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 "Verificación de correo no deseado"
@@ -4334,12 +4393,27 @@ msgstr "Se ha actualizado correctamente la aplicación."
msgid "Application: %{name}"
msgstr "Aplicación: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] "Aprobar %d usuario"
@@ -4377,37 +4451,34 @@ msgstr "Restricciones de correo electrónico"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restricciones de correo electrónico para los registros"
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown habilitado"
-
-msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 "Guardar cambios"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
-msgstr "Límite de usuarios"
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+msgid "ApplicationSettings|User cap"
+msgstr "Límite de usuarios"
+
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr "Aplicando sugerencia..."
msgid "Applying suggestions..."
msgstr "Aplicando sugerencias..."
-msgid "Approval Status"
-msgstr "Estado de aprobación"
-
msgid "Approval rules"
msgstr "Reglas de aprobación"
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "Agosto"
msgid "Authenticate"
msgstr "Autenticar"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr "Error de autenticación"
msgid "Authentication Log"
msgstr "Registro de Autenticación"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Error de autenticación: %{error_message}"
@@ -5446,8 +5508,8 @@ msgstr "ID disponible"
msgid "Available group runners: %{runners}"
msgstr "Grupo de ejecutores disponible: %{runners}"
-msgid "Available runners: %{runners}"
-msgstr "Ejecutores disponibles: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "Ejecutores compartidos disponibles:"
@@ -5599,8 +5661,8 @@ msgstr ""
msgid "Based on"
msgstr "Basado en"
-msgid "Basic information"
-msgstr "Información básica"
+msgid "Batch size"
+msgstr ""
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."
@@ -5629,9 +5691,6 @@ msgstr "A continuación se muestran los ajustes relativos a %{link_to_gitlab_pag
msgid "Below you will find all the groups that are public."
msgstr "A continuación encontrará todos los grupos públicos."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "Cobertura de código quincenal"
@@ -5737,12 +5796,21 @@ 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 "Extender el periodo de prueba"
msgid "Billings|Reactivate trial"
msgstr "Reactivar el periodo de prueba"
+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 "No se pueden habilitar los ejecutores compartidos hasta que se registre una tarjeta de crédito válida."
@@ -5770,23 +5838,29 @@ msgstr "Su cuenta ha sido validada"
msgid "Billing|%{user} was successfully approved"
msgstr "%{user} fue aprobado con éxito"
+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 "Se ha producido un error al aprobar %{user}"
-msgid "Billing|An error occurred while getting a billable member details"
+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 "Se ha producido un error al cargar la lista de miembros facturables"
+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 "Se ha producido un error al eliminar un miembro facturable"
+msgid "Billing|An error occurred while removing a billable member."
+msgstr ""
msgid "Billing|Awaiting member signup"
msgstr ""
@@ -5800,15 +5874,21 @@ msgstr "Membresías directas"
msgid "Billing|Enter at least three characters to search."
msgstr "Introduzca al menos tres caracteres para buscar."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "Exportar lista"
-msgid "Billing|Group"
-msgstr "Grupo"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
msgid "Billing|Group invite"
msgstr "Invitación de grupo"
+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 ""
@@ -5833,9 +5913,6 @@ msgstr "Escriba el %{username} para confirmar"
msgid "Billing|User was successfully removed"
msgstr "Se ha eliminado correctamente a este usuario"
-msgid "Billing|Users occupying seats in"
-msgstr "Usuarios que ocupan asientos en"
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Descripción general"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Puede gestionar las ramas protegidas desde %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Mostrar ramas activas"
@@ -6289,9 +6363,6 @@ msgstr "Divergido desde el servidor"
msgid "Branches|merged"
msgstr "fusionado"
-msgid "Branches|project settings"
-msgstr "configuración del proyecto"
-
msgid "Branches|protected"
msgstr "protegido"
@@ -6352,6 +6423,9 @@ msgstr "%{feature} (requiere v%{version})"
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Grupos existentes"
@@ -6367,6 +6441,9 @@ msgstr "Del grupo de origen"
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 "Importación fallida: el destino no puede ser un subgrupo del grupo de origen. Por favor, cambie el destino y vuelva a intentarlo."
@@ -6391,9 +6468,6 @@ msgstr "El nombre ya existe."
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr "Configuración de CI"
msgid "CI variables"
msgstr "Variables de CI/CD"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI/CD se ejecutará utilizando las credenciales asignadas anteriormente."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "Configuración de CI/CD"
msgid "CI/CD configuration file"
msgstr "Archivo de configuración de CI/CD"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr "Tiempo de espera"
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Cancelar"
msgid "Cancel and close"
msgstr "Cancelar y cerrar"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Cancelar la eliminación de índice"
@@ -7026,9 +7109,15 @@ msgstr ""
msgid "Changed assignee(s)."
msgstr "Asignado(s) cambiado(s)."
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
msgid "Changed reviewer(s)."
msgstr "Revisores cambiados."
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
msgid "Changed the title to \"%{title_param}\"."
msgstr "Título cambiado a \"%{title_param}\"."
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr "No se han guardado los cambios en el título"
@@ -7116,6 +7208,9 @@ msgstr "Verficar de nuevo"
msgid "Check feature availability on namespace plan"
msgstr "Compruebe la disponibilidad de la función en el plan de espacio de nombres"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr "Detalles de la suscripción"
msgid "Checkout|Subtotal"
msgstr "Subtotal"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Impuestos"
@@ -7402,6 +7500,9 @@ msgstr "La subtarea épica no existe."
msgid "Child epic doesn't exist."
msgstr "La subtarea épica no existe."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "Soporte para el idioma chino utilizando"
@@ -7429,9 +7530,6 @@ msgstr "Elegir cualquier color."
msgid "Choose file…"
msgstr "Seleccione un archivo…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr "Seleccione el ejecutor preferido y rellene el AWS CFT."
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Limpiar"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr "Borrar todas las comprobaciones del repositorio"
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,14 +7985,14 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr "Todos"
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr ""
-
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "Se ha producido un error al cargar su agente"
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr "Se ha producido un error al recuperar la actividad del agente de GitLab. Recargue la página para volver a intentarlo."
+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 "Se ha producido un error desconocido. Por favor, inténtelo de nuevo."
@@ -7894,6 +8000,9 @@ msgstr "Se ha producido un error desconocido. Por favor, inténtelo de nuevo."
msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo this."
msgstr "¿Está seguro de que desea eliminar este agente? Esta acción no se puede deshacer."
+msgid "ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action."
+msgstr ""
+
msgid "ClusterAgents|Certificate"
msgstr "Certificado"
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Conectar a un clúster existente"
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr "Conectar con el agente de GitLab"
-
msgid "ClusterAgents|Connected"
msgstr "Conectado"
@@ -7984,14 +8087,14 @@ msgstr ""
msgid "ClusterAgents|Failed to register an agent"
msgstr "Se ha producido un error al registrar un agente"
-msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+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 "Agente de GitLab"
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr "Agente de GitLab para Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr "Dar su opinión"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ msgstr "Nunca"
msgid "ClusterAgents|Never connected"
msgstr "Nunca se ha conectado"
+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 ""
@@ -8038,9 +8146,6 @@ msgstr "No está conectado"
msgid "ClusterAgents|Recommended"
msgstr "Recomendado"
-msgid "ClusterAgents|Recommended installation method"
-msgstr "Método de instalación recomendado"
-
msgid "ClusterAgents|Register"
msgstr "Registrar"
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr "Seguridad"
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ msgstr ""
msgid "ClusterAgents|Tell us what you think"
msgstr "Diganos lo que piensa"
-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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "ClusterAgents|This agent has no tokens"
msgstr "Este agente no tiene tokens"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Para eliminar el agente, escriba %{name} para confirmar:"
+msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
+msgstr ""
+
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Token creado por %{userName}"
@@ -8112,7 +8218,7 @@ msgstr "Ver todos los %{number} clústeres"
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr "Nos encantaría saber más sobre su experiencia con GitLab Agent."
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr "Conectar con un certificado"
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Esta opción le permitirá instalar aplicaciones en clústeres RBAC."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ msgstr "Error desconocido"
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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr "ComboSearch no está definido"
msgid "Comma-separated list of email addresses."
msgstr "Lista de direcciones de correo electrónico separadas por comas."
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "Separados por comas, ej. '1.1.1.1, 2.2.2.0/24'"
-
msgid "Command"
msgstr "Comando"
@@ -9119,9 +9222,6 @@ msgstr "No se encontraron merge requests relacionados"
msgid "Committed by"
msgstr "Enviado por"
-msgid "Commit…"
-msgstr "Commit..."
-
msgid "Community forum"
msgstr "Foro de la comunidad"
@@ -9224,9 +9324,6 @@ msgstr "Framework de cumplimiento"
msgid "Compliance report"
msgstr "Informe de cumplimiento"
-msgid "ComplianceDashboard|created by:"
-msgstr "Creado por:"
-
msgid "ComplianceFrameworks|Add framework"
msgstr "Añadir framework"
@@ -9587,9 +9684,6 @@ msgstr "Error de conexión"
msgid "Connection timed out"
msgstr "Tiempo de espera agotado"
-msgid "Connection timeout"
-msgstr "Tiempo de espera de conexión agotado"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr "El registro de contenedores no está activado en esta instancia de GitLa
msgid "Container repositories"
msgstr "Repositorios de contenedores"
-msgid "Container repositories synchronization concurrency limit"
-msgstr "Límite de sincronización de repositorios de contenedores"
-
msgid "Container repository"
msgstr "Repositorio de contenedores"
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ msgstr "Con el registro de contenedores, cada proyecto puede tener su propio esp
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 "Con el registro de contenedores, cada proyecto puede tener su propio espacio para almacenar sus imágenes de Docker. Envíe al menos una imagen de Docker a uno de los proyectos de este grupo para que aparezca aquí. %{docLinkStart}Más información%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Continuar"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Continuar con el siguiente paso"
@@ -10088,9 +10182,6 @@ msgstr "Copiar ID externo al portapapeles"
msgid "Copy ID"
msgstr "Copiar el ID"
-msgid "Copy IP Address"
-msgstr "Copiar dirección IP"
-
msgid "Copy KRB5 clone URL"
msgstr "Copiar la URL de clonado KRB5"
@@ -10106,6 +10197,9 @@ msgstr "Copiar la URL"
msgid "Copy branch name"
msgstr "Copiar el nombre de rama"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "Copiar códigos"
@@ -10148,6 +10242,9 @@ msgstr "Copiar las etiquetas y los hitos desde otras incidencias ó merge reques
msgid "Copy link"
msgstr "Copiar enlace"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Copiar enlace al gráfico"
@@ -10454,6 +10551,9 @@ msgstr "Crear rama"
msgid "Create commit"
msgstr "Crear commit"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,8 +11040,11 @@ msgstr "Preferencias"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
-msgstr "Actualizar"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "Atributos personalizados"
@@ -11114,6 +11217,9 @@ msgstr "debe estar bajo un grupo"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Fecha"
@@ -11141,6 +11250,9 @@ msgstr "Mostrar filtros de gráficos"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr "Tipo de sitio"
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "URL de destino"
@@ -11607,26 +11725,26 @@ msgstr "Reintentar validación"
msgid "DastSiteValidation|Revoke validation"
msgstr "Revocar validación"
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
-msgstr "Paso 1 - Elija el método de validación del sitio"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
-msgstr "Paso 2 - Añada la siguiente cabecera HTTP a su sitio"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
-msgstr "Paso 2 - Añada el siguiente texto al sitio de destino"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
-msgstr "Paso 3 - Confirme la ubicación del encabezado y valide"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
-msgstr "Paso 3 - Confirme la ubicación de archivo de texto y valide"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
+msgstr ""
msgid "DastSiteValidation|Text file validation"
msgstr ""
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 "Validar"
-msgid "DastSiteValidation|Validate target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr "Eliminar artefactos"
msgid "Delete badge"
msgstr "Eliminar insignia"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Eliminar columna"
@@ -12041,6 +12162,9 @@ msgstr "¡Eliminado el nick del chat %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "¡Los proyectos eliminados no se pueden recuperar!"
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ msgstr "Escaneo de dependencias"
msgid "Dependency list"
msgstr ""
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
+msgstr ""
+
msgid "DependencyProxy|Cached %{time}"
msgstr "En caché %{time}"
+msgid "DependencyProxy|Clear cache"
+msgstr ""
+
msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
msgstr ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr "Frecuencia de despliegue"
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
+msgstr ""
+
msgid "Deployment Target|Project deployment target (optional)"
msgstr ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr "Su puntuación"
msgid "DevopsReport|Your usage"
msgstr "Su uso"
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr "¿No ha recibido un correo electrónico de confirmación?"
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Límites del diff"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "Diferencia entre la fecha de inicio y ahora"
@@ -13036,9 +13181,18 @@ 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 "Sin nombre de archivo disponible"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr ""
@@ -13077,9 +13231,6 @@ msgstr "Nombre del directorio"
msgid "Disable"
msgstr "Deshabilitar"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr "Deshabilitar la autenticación de doble factor"
@@ -13092,6 +13243,9 @@ 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"
@@ -13226,7 +13380,7 @@ msgstr "Mostrar el archivo renderizado"
msgid "Display source"
msgstr "Mostrar fuente"
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "Descargar artefactos"
-msgid "Download as"
-msgstr "Descargar como"
-
msgid "Download codes"
msgstr "Descargar codigos"
@@ -13403,9 +13554,15 @@ msgstr "Fecha de vencimiento"
msgid "Due date"
msgstr "Fecha de vencimiento"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "Duración"
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Editar incidencias"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr "Credenciales IAM de AWS Elasticsearch"
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr "Indexando Elasticsearch"
-
msgid "Elasticsearch indexing restrictions"
msgstr "Restricciones en la indexación de Elasticsearch"
@@ -13676,9 +13833,6 @@ msgstr "No se ha podido enviar el correo electrónico"
msgid "Email display name"
msgstr "Nombre para mostrar en el correo electrónico"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Correo electrónico no verificado. Por favor, verifique su correo electrónico en Salesforce."
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr "Enviar parche por correo electrónico"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "Correo enviado"
@@ -13784,15 +13941,15 @@ msgstr "Archivo vacío"
msgid "Enable"
msgstr "Habilitar"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Activar Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Habilitar Gitpod"
@@ -13814,18 +13971,12 @@ msgstr "Habilitar PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr "Habilitar la recolección de datos Pseudonymizer"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr "Habilitar verificación SSL"
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Habilitar integración"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Habilitar la autenticación de dos factores"
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr "Empresa"
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr "El entorno no tiene implementaciones"
@@ -14395,6 +14532,9 @@ msgstr "protegido"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Épica"
@@ -14419,9 +14559,6 @@ msgstr "Épicas"
msgid "Epics Roadmap"
msgstr "Hoja de ruta de tareas épicas"
-msgid "Epics and Issues"
-msgstr "Tareas épicas e incidencias"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Las tareas épicas le permiten administrar sus proyectos de manera más eficiente y con menos esfuerzo"
@@ -14524,6 +14661,9 @@ msgstr "vencimiento"
msgid "Epics|start"
msgstr "Inicio"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Error"
@@ -14779,9 +14919,6 @@ msgstr "Errores"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Errores:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr "Fecha de vencimiento (opcional)"
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "Caducó"
@@ -15413,6 +15553,9 @@ msgstr "Se ha producido un error al instalar."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr "Se eliminará el favicon. ¿Seguro que quieres hacerlo?"
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Archivo añadido"
@@ -15871,9 +16020,6 @@ msgstr "Archivo renombrado sin cambios."
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Plantillas de archivos"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr "Finalizado"
-msgid "Finished at"
-msgstr "Terminado en"
-
msgid "First Name"
msgstr "Primer nombre"
@@ -16123,9 +16266,6 @@ msgstr "Para obtener más información, vaya a "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "¿Olvidó su contraseña?"
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "Añadir sitio"
@@ -16408,6 +16561,12 @@ msgstr "Todos los proyectos están programados para volver a sincronizar"
msgid "Geo|All projects are being scheduled for reverify"
msgstr "Todos los proyectos están programados para volver a verificar"
+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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 "No se puede eliminar la entrada de seguimiento para un proyecto existente."
@@ -16453,9 +16630,21 @@ msgstr "No coincide con la configuración de almacenamiento primaria"
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 "Fallido"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr "Filtrar por nombre"
msgid "Geo|Filter by status"
msgstr "Filtrar por estado"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Estado de Geo"
-msgid "Geo|Geo sites"
+msgid "Geo|Geo allows you to choose specific groups or storage shards to replicate."
msgstr ""
-msgid "Geo|Geo sites are paused using a command run on the site"
+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 supports replication of many data types."
+msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
msgid "Geo|Go to the primary site"
msgstr "Ir al sitio principal"
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
msgid "Geo|Healthy"
msgstr "Saludable"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr "Sincronizado"
msgid "Geo|Internal URL"
msgstr "URL interna"
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ msgstr "Más información acerca de Geo"
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 "Nunca"
msgid "Geo|Next sync scheduled at"
msgstr "Próxima sincronización programada en"
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
msgid "Geo|Not synced yet"
msgstr "Sin sincronizar aún"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr "No hay nada que sincronizar"
msgid "Geo|Nothing to verify"
msgstr "No hay nada que verificar"
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr "Sincronización pendiente"
msgid "Geo|Pending verification"
msgstr "Pendiente de verificación"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "Nodo principal"
@@ -16576,6 +16804,9 @@ msgstr "Proyectos en determinados grupos de almacenamiento"
msgid "Geo|Queued"
msgstr "En cola"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Volver a descargar"
@@ -16618,6 +16849,9 @@ msgstr "Estado de replicación"
msgid "Geo|Replication summary"
msgstr "Resumen de replicación"
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Resincronizar"
@@ -16645,15 +16879,39 @@ msgstr "Volver a comprobar todos los proyectos"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
msgstr "Nodo secundario"
msgid "Geo|Secondary site"
msgstr "Sitio secundario"
+msgid "Geo|Select groups to replicate"
+msgstr ""
+
+msgid "Geo|Select shards to replicate"
+msgstr ""
+
msgid "Geo|Selective (%{syncLabel})"
msgstr "Selectivo (%{syncLabel})"
+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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ msgstr "Configuración de sincronización"
msgid "Geo|Synchronization status"
msgstr "Estado de la sincronización"
+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 ""
@@ -16699,9 +16963,21 @@ msgstr "No hay %{replicable_type} para mostrar"
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 ""
@@ -16711,12 +16987,18 @@ 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 "La entrada de seguimiento del proyecto (%{project_id}) se eliminó correctamente."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr "La URL no puede estar en blanco"
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr "Verificación"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Se ha producido un error durante la verificación - %{error}"
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "Esperando por el programador"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr "URL del host de Gitea"
msgid "Gitea Import"
msgstr "Importar desde Gitea"
+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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr "¡Se ha generado el token de registro para los nuevos ejecutores!"
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr "Grupos para sincronizar"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Más visitado"
@@ -18485,6 +18773,9 @@ msgstr "Ayuda a evitar que los bots realicen ataques de fuerza bruta."
msgid "Helps prevent bots from creating accounts."
msgstr "Ayuda a evitar que los bots creen nuevas cuentas."
+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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr "Hola %{username}!"
@@ -18648,12 +18936,6 @@ msgstr "Servicio de limpieza iniciado con éxito"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr "¿Cómo configuro los ejecutores?"
@@ -18786,6 +19068,9 @@ msgstr "Direcciones IP por usuario"
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "La restricción de la subred IP solo está permitida en grupos de nivel superior"
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identificador"
@@ -18825,15 +19110,12 @@ msgstr "Si está marcado, los propietarios de grupos pueden administrar enlaces
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "Si se marca, las nuevas miembros del grupo y los permisos sólo se pueden añadir a través de la sincronización vía 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-msgstr "Mejora el rendimiento de clonado de Git."
-
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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr "Obtenga nuestras guías de importación"
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr "Comience hoy"
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr "Incidente"
msgid "IncidentManagement|Incidents"
msgstr "Incidentes"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Bajo - S4"
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr "Debe comenzar con http o https"
-msgid "Incidents|There was an issue deleting the image."
-msgstr "Se ha producido un problema al eliminar la imagen."
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr "Se ha producido un problema al cargar las métricas de las imágenes."
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr "Se ha producido un problema al cargar su imagen."
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr "URL interna (opcional)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Usuarios internos"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Patrón de intervalo"
@@ -20486,6 +20765,9 @@ msgstr "Formato de archivo no válido con el tipo de archivo especificado"
msgid "Invalid file."
msgstr "Archivo no válido."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr "Hash no válido"
@@ -20561,9 +20843,6 @@ msgstr "Invitar miembros"
msgid "Invite a group"
msgstr "Invitar a un grupo"
-msgid "Invite email has already been taken"
-msgstr "El correo electrónico de invitación ya está en uso"
-
msgid "Invite members"
msgstr "Invitar miembros"
@@ -21119,12 +21398,18 @@ msgstr "La configuración de la cadencia no es válida."
msgid "Iterations|Cadence name"
msgstr "Nombre de la cadencia"
+msgid "Iterations|Cancel"
+msgstr ""
+
msgid "Iterations|Couldn't find iteration cadence"
msgstr "No se pudo encontrar la cadencia de iteración"
msgid "Iterations|Create cadence"
msgstr "Crear cadencia"
+msgid "Iterations|Create iteration"
+msgstr ""
+
msgid "Iterations|Delete cadence"
msgstr "Eliminar cadencia"
@@ -21134,9 +21419,15 @@ msgstr "¿Eliminar la cadencia de la iteración?"
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duración"
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr "Me estoy uniendo a mi equipo que ya está en GitLab"
-
msgid "Jaeger URL"
msgstr "URL de Jaeger"
@@ -21368,7 +21656,7 @@ msgstr "URL base de la instancia de Jira."
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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr "Tipo de incidencia de Jira"
-
msgid "JiraService|Jira issues"
msgstr "Incidencias de Jira"
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr "¿Está seguro de que desea proceder?"
@@ -21569,6 +21860,9 @@ msgstr "Crear archivo de configuración de CI/CD"
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Abandonar"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr "Componentes"
msgid "Licenses|Detected in Project"
msgstr "Detectado en proyecto"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr "Ver los detalles de la licencia para su proyecto"
msgid "Limit display of time tracking units to hours."
msgstr "Limitar la visualización de las unidades de seguimiento de tiempo a horas."
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr "Bloqueado por %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "Bloqueó la discusión."
-msgid "Locked to current projects"
-msgstr "Bloqueado a los proyectos actuales"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Los bloqueos brindan la capacidad de bloquear archivos o carpetas específicos."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr "Hay vulnerabilidades bajas presentes"
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "Máx. 100.000 eventos"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "Filtrar miembros"
@@ -23587,6 +23890,9 @@ msgstr "Merge request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "Métricas"
@@ -24347,12 +24665,12 @@ msgstr "Incidencias no iniciadas (abiertas y no asignadas)"
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 "Capacidad mínima que debe estar disponible antes de que programemos más mirrors de forma preventiva."
-msgid "Minimum interval in days"
-msgstr "Intervalo mínimo en días"
-
msgid "Minutes"
msgstr "Minutos"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr "Multi-proyecto"
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr "Se encontraron varios tipos de cargadores: %{uploader_types}"
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Red"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr "modo .yaml"
-
-msgid "NetworkPolicies|Add alert"
-msgstr "Añadir alerta"
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr "Todo seleccionado"
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr "Crear política"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr "Definir la ubicación, las condiciones y las acciones de esta política."
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "Eliminar política"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr "Eliminar política: %{policy}"
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr "Denegar todo el tráfico"
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "Editar política"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr "El entorno no tiene plataforma de despliegue"
-msgid "NetworkPolicies|IP/subnet"
-msgstr "IP/subred"
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Política no válida o vacía"
@@ -24874,87 +25117,12 @@ msgstr "Tipo de política no válida o no soportada"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Error de Kubernetes: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr "Red"
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr "Las políticas de red se pueden utilizar para limitar qué tráfico de red está permitido entre contenedores dentro del cluster."
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr "La política de red se puede crear después de que el entorno se cargue correctamente."
-
-msgid "NetworkPolicies|Network traffic"
-msgstr "Tráfico de red"
-
-msgid "NetworkPolicies|None selected"
-msgstr "Ninguna seleccionada"
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr "Definición de la política"
-
-msgid "NetworkPolicies|Rule mode"
-msgstr "Modo de la regla"
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "Guardar cambios"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "Algo salió mal, se ha producido un error al actualizar la política"
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr "Algo salió mal, se ha producido un error al obtener las políticas"
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr "Todos los nombres de DNS"
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr "cualquier pod"
-
-msgid "NetworkPolicies|any port"
-msgstr "cualquier puerto"
-
-msgid "NetworkPolicies|domain name"
-msgstr "nombre de dominio"
-
-msgid "NetworkPolicies|entity"
-msgstr "entidad"
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr "en ninguna parte"
-
-msgid "NetworkPolicies|outbound from"
-msgstr "saliente desde"
-
-msgid "NetworkPolicies|pod with labels"
-msgstr "pod con etiquetas"
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr "pods %{pods}"
-
-msgid "NetworkPolicies|pods with labels"
-msgstr "pods con etiquetas"
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr "pods %{ports}"
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr "puertos/protocolos"
-
msgid "NetworkPolicy|Policy"
msgstr "Política"
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr "Sin alcances"
-msgid "No Tag"
-msgstr "Sin etiquetas"
-
msgid "No active admin user found"
msgstr "No se ha encontrado ningún usuario administrador activo"
@@ -25446,9 +25611,6 @@ msgstr "No hay vista previa para este tipo de archivo"
msgid "No prioritized labels with such name or description"
msgstr "No hay etiquetas priorizadas con dicho nombre o descripción"
-msgid "No profiles found"
-msgstr "No se encontraron perfiles"
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Nota"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr "Nada encontrado…"
-
msgid "Nothing to preview."
msgstr "Nada para previsualizar."
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr "Replicación del almacenamiento de objetos"
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "El objeto no existe en el servidor o no tiene permisos para acceder a él"
@@ -25894,6 +26089,9 @@ msgstr "Horarios de guardia"
msgid "On-call schedules"
msgstr "Horarios de guardia"
+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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 "Eliminar perfil"
msgid "OnDemandScans|Description (optional)"
msgstr "Descripción (opcional)"
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr "Editar perfil"
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,21 +26362,27 @@ msgstr "Guardar y ejecutar análisis"
msgid "OnDemandScans|Save scan"
msgstr "Guardar análisis"
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr "Nombre del análisis"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
+msgstr ""
+
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
msgid "OnDemandScans|Scan type"
msgstr "Tipo de análisis"
msgid "OnDemandScans|Scanner profile"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
-msgstr "Programar análisis"
-
msgid "OnDemandScans|Select one of the existing profiles"
msgstr "Seleccione uno de los perfiles existentes"
@@ -26182,6 +26413,9 @@ msgstr "No hay ningún análisis guardado."
msgid "OnDemandScans|There are no scheduled scans."
msgstr "No hay ningún análisis programado."
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ msgstr "Ver resultados"
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 "Una vez importados, los repositorios se pueden replicar vía de SSH. Para obtener más información, haga clic %{link_start}aquí%{link_end}."
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr "Eliminar la versión del paquete"
msgid "PackageRegistry|Delete package"
msgstr "Eliminar paquete"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr "Comando Pip"
msgid "PackageRegistry|Project-level"
msgstr "Nivel de proyecto"
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ msgstr "Todavía no hay paquetes"
msgid "PackageRegistry|There was a problem fetching the details for this package."
msgstr "Se ha producido un error al obtener los detalles de este paquete."
+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 ""
@@ -26999,15 +27242,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "Parte de los cambios de los merge requests"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "Participantes"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr "Pasado"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pausar"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr "Pipeline %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "Pipeline %{label} para \"%{dataTitle}\""
-msgid "Pipeline Editor"
-msgstr "Editor de pipelines"
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total:"
+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 ""
@@ -28079,6 +28325,9 @@ msgstr "Por favor ingrese un nombre descriptivo para su grupo."
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 ""
@@ -28118,9 +28367,6 @@ msgstr "Por favor, proporcione atributos para actualizar"
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr "Contacte con nosotros si tiene alguna pregunta y estaremos encantados de ayudarle."
-msgid "Please refer to %{docs_url}"
-msgstr "Por favor, consulte %{docs_url}"
-
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 ""
@@ -28178,6 +28424,9 @@ msgstr "Por favor, escriba %{phrase_code} para continuar o cierre esta ventana m
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "Utilice este formulario para informar a los administradores sobre los usuarios que crean spam en las incidencias, en los comentarios o se comportan de una manera inadecuada."
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "Espere un momento; esta página se actualizará automáticamente cuando esté lista."
@@ -28262,6 +28511,12 @@ msgstr "Seleccione que contenido desea ver en la página de resumen de un proyec
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Seleccione qué contenido desea ver en su página de inicio."
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ 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 colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr "Mostrar tiempo en formato 24 horas"
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr "Tema de navegación"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Resumen del contenido del proyecto"
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "Principal"
-
msgid "Primary Action"
msgstr "Acción primaria"
@@ -29027,9 +29288,6 @@ msgstr "No se pudo eliminar la exportación del proyecto."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "Exportación de proyecto habilitada"
-
msgid "Project export has been deleted."
msgstr "La exportación del proyecto ha sido eliminada."
@@ -29657,8 +29915,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-msgstr "Solamente pueden hacer push commit a este repositorio los usuarios cuyos commits se crearon mediante la utilización de correos electrónicos verificados."
+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 ""
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr "El servicio de búsquedas recientes no está disponible"
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Búsquedas recientes"
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Registrarse con la aplicación de dos factores"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr "Reabrió este %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Reabrir este %{quick_action_target}."
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "Reemplazar"
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "Repo por URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "Informar de un abuso"
@@ -31516,6 +31759,9 @@ msgstr "Fallo"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Almacenamiento del repositorio"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Solicitar acceso"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr "Peticiones"
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Reintentar"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Hoja de ruta"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Rol"
@@ -32190,10 +32430,10 @@ msgstr "Ejecutar las pruebas contra su código a través del terminal web"
msgid "Run untagged jobs"
msgstr "Ejecutar trabajos no etiquetados"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr "Runners"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "Ejecutores actualmente en línea: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Página de ejecutores."
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr "grupo"
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr "Secundario"
-
msgid "Secondary email:"
msgstr "Correo secundario:"
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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 "Seleccione un proyecto"
-msgid "SecurityOrchestration|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr "Editar la política del proyecto"
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ msgstr "Forzar la seguridad para este proyecto. %{linkStart}Más información%{l
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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr "Seleccione la rama"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr "Seleccione un grupo o proyecto"
-msgid "Select groups to replicate"
-msgstr "Seleccionar grupos a replicar"
-
msgid "Select health status"
msgstr "Seleccionar estado de salud"
@@ -34080,9 +34344,6 @@ msgstr "Seleccione los proyectos"
msgid "Select reviewer(s)"
msgstr "Seleccionar revisor(es)"
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr "Sincronización selectiva"
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 ""
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 "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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "Establecer el peso"
msgid "Set weight to %{weight}."
msgstr "Establecer el peso a %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "Compartir"
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr "Gris"
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr "Rojo"
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr "Sincronizado"
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr "Notas de la versión"
msgid "TagsPage|Repository has no tags yet."
msgstr "El repositorio todavía no tiene etiquetas."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Etiquetas"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr "La generación del informe provocó un error."
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "Probar"
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-msgstr "Análisis de cobertura de las pruebas"
-
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] ""
@@ -37382,9 +37631,6 @@ msgstr "El commit no existe"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr "El proyecto se ha importado correctamente."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 "Se ha producido un error al recuperar los usuarios."
+msgid "There was a problem handling the pipeline data."
+msgstr ""
+
msgid "There was a problem sending the confirmation email"
msgstr "Se ha producido un error al enviar el correo electrónico de confirmación"
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "Se ha producido un error al obtener el %{replicableType}"
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr "Se ha producido un error al restablecer los minutos de ejecución de los
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "Se ha producido un error al guardar sus cambios."
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "Se ha producido un error al intentar validar su consulta"
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
msgstr "Esta tarea épica no existe o no tiene permisos suficientes."
+msgid "This epic would exceed maximum number of related epics."
+msgstr ""
+
msgid "This feature requires local storage to be enabled"
msgstr "Esta característica requiere que el almacenamiento local esté activado"
@@ -38473,8 +38716,8 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
-msgstr "Este trabajo depende de otros trabajos con artefactos caducados o borrados: %{invalid_dependencies}"
+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 "Este trabajo depende de trabajos anteriores que se deben ejecutar correctamente, antes de que este trabajo se active"
@@ -38620,9 +38863,6 @@ msgstr "Este espacio de nombres ya esta en uso. Por favor, elija otro diferente.
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr "Esta opción sólo está disponible en GitLab.com"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Esta página no está disponible porque no se le permite leer la información a través de múltiples proyectos."
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr "Tiempo desde el primer cambio hasta el primer comentario"
msgid "Time from last commit to merge"
msgstr "Tiempo desde el último commit al merge"
-msgid "Time in seconds"
-msgstr "Tiempo en segundos"
-
msgid "Time of import: %{importTime}"
msgstr "Tiempo de importación: %{importTime}"
@@ -39118,11 +39352,11 @@ msgstr "solo ahora"
msgid "Timeago|right now"
msgstr "justo ahora"
-msgid "Timeline|Turn timeline view off"
-msgstr "Desactivar la vista de línea de tiempo"
+msgid "Timeline|Turn recent updates view off"
+msgstr ""
-msgid "Timeline|Turn timeline view on"
-msgstr "Activar la vista de la línea de tiempo"
+msgid "Timeline|Turn recent updates view on"
+msgstr ""
msgid "Timeout"
msgstr "Tiempo de espera"
@@ -39194,6 +39428,9 @@ msgstr "Para aceptar esta invitación, inicie sesión."
msgid "To access this domain create a new DNS record"
msgstr "Para acceder a este dominio, cree un nuevo registro DNS"
+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 ""
@@ -39203,6 +39440,9 @@ msgstr "Para añadir la entrada manualmente, proporcione los siguientes detalles
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 "Para confirmar, escriba %{phrase_code}"
@@ -39254,9 +39494,6 @@ msgstr "Para comenzar, introduzca la URL de su servidor de Gitea y un %{link_to_
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ msgstr ""
msgid "Trigger pipelines for mirror updates"
msgstr "Ejecutar pipelines para la actualización de las replicas"
-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."
+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."
@@ -39782,6 +40022,9 @@ msgstr "Solucione problemas y supervise su aplicación con el seguimiento"
msgid "Trusted"
msgstr "Confiable"
+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 "Inténtelo de nuevo"
@@ -39824,9 +40067,6 @@ msgstr "Intentando comunicarse con su dispositivo. Conéctelo (si aún no lo ha
msgid "Tuesday"
msgstr "Martes"
-msgid "Tuning settings"
-msgstr "Ajustes"
-
msgid "Turn off"
msgstr "Desactivar"
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Tipo"
-msgid "Type/State"
-msgstr "Tipo/Estado"
-
msgid "U2F Devices (%{length})"
msgstr "Dispositivos U2F (%{length})"
@@ -39986,6 +40223,9 @@ 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."
+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 "No se puede generar un nuevo ID de instancia"
@@ -40265,9 +40505,6 @@ msgstr "Se ha producido un error en la actualización"
msgid "Update it"
msgstr "Actualícelo"
-msgid "Update iteration"
-msgstr "Actualizar la iteración"
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr "Actualizado %{updated_at} por %{updated_by}"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr "Actualizaciones"
-
msgid "Updating"
msgstr "Actualizando"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr "Periodo actual de uso"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Fragmentos de código"
@@ -40532,6 +40775,12 @@ msgstr "Cuotas de uso"
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 "Uso de los recursos del grupo a través de los proyectos en el grupo %{strong_start}%{group_name}%{strong_end}"
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "Uso desde"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr "Utilizar almacenamiento hash"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr "Varias opciones de configuración de correo electrónico."
msgid "Various settings that affect GitLab performance."
msgstr "Varias opciones de configuración que afectan el rendimiento de GitLab."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "Estado de la verificación"
@@ -41834,7 +42077,7 @@ msgstr "Identificadores"
msgid "Vulnerability|Image"
msgstr "Imagen"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr "Actualmente no podemos obtener datos para este gráfico."
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr "Actualmente no podemos obtener datos para este pipeline."
-
msgid "We could not determine the path to remove the epic"
msgstr "No es posible determinar la ruta para eliminar esta tarea épica"
@@ -42095,7 +42335,7 @@ msgstr "Ayuda de Webhooks"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr "¿Qué hace este comando?"
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr "¿Qué es Markdown?"
@@ -42302,9 +42539,6 @@ msgstr "¿Qué es la duplicación de repositorios?"
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr "¿Cuál es su cargo? (opcional)"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "Cuando el merge request sea aceptado"
@@ -42385,7 +42616,7 @@ msgstr "¿Quién utilizará esta versión de prueba de GitLab?"
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr "Trabajo en curso (abierto y sin asignar)"
msgid "Work in progress Limit"
msgstr "Límite de trabajo en progreso"
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ msgstr "Ya tiene una tarea pendiente para esta alerta"
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr "Está a punto de añadir %{usersTag} personas a la discusión. Todas ellas recibirán una notificación."
+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 ""
@@ -42808,7 +43056,7 @@ msgstr "Está en una instancia de sólo lectura GitLab."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "Está recibiendo este mensaje porque es un administrador de GitLab para %{url}."
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ msgstr "Puede probar su archivo .gitlab-ci.yml en %{linkStart}CI Lint%{linkEnd}.
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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr "archivado"
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ msgstr "Todos los niveles de gravedad"
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 "Aplicar automáticamente el parche en una nueva rama"
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] "merge request"
msgstr[1] "merge requests"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ msgstr "falta"
msgid "most recent deployment"
msgstr "despliegue más reciente"
+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 "1 merge commit"
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "Check-out"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "Enviar parches por correo electrónico"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Error al cargar las estadísticas de despliegue"
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Abrir en Web IDE"
-msgid "mrWidget|Plain diff"
-msgstr "Diff normal"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr "mi-asombroso-grupo"
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "necesita atención"
@@ -45112,9 +45381,6 @@ msgstr "nunca caduca"
msgid "new merge request"
msgstr "nueva solicitud de fusión"
-msgid "no approvers"
-msgstr "sin aprobadores"
-
msgid "no expiration"
msgstr "Sin fecha de vencimiento"
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr "ninguno"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "no encontrado"
@@ -45188,9 +45460,6 @@ msgstr "comentario pendiente"
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr "por día."
-
msgid "personal access token"
msgstr "token de acceso personal"
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "respuesta"
msgstr[1] "respuestas"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po
index ce21d0c43f2..d7ee332b851 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/fa_IR/gitlab.po b/locale/fa_IR/gitlab.po
index a03befccd8e..df68bff2902 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/fi_FI/gitlab.po b/locale/fi_FI/gitlab.po
index 3fa1ae3a894..b63fa0303ca 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 510f96cf164..efc763b9b26 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:17\n"
+"PO-Revision-Date: 2022-05-01 06:58\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index 2f83ab88439..7ebfb43ae3e 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr " %{start} à %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d groupe"
msgstr[1] "%d groupes"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d groupe sélectionné"
-msgstr[1] "%d groupes sélectionnés"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d heure"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d seconde"
msgstr[1] "%d secondes"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d fragment sélectionné"
-msgstr[1] "%d fragments sélectionnés"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d étoile"
@@ -511,8 +501,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}Masqué :%{code_close} Masqué dans les journaux des logs. Doit correspondre aux exigences de masquage."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Protégé :%{code_close} Exposé uniquement aux branches ou tags protégées."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} a écrit %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Réessayez de téléverser un fichier."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@societe.fr"
+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 ""
@@ -781,9 +774,6 @@ msgstr "%{level_name} n'est pas autorisé dans un groupe %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} n'est pas autorisé car le projet divergent a une visibilité inférieure."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ msgstr "%{link_start}Supprimez le %{draft_snippet} préfixe%{link_end} du titre
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Débutez le titre avec %{draft_snippet}%{link_end} pour empêcher un brouillon de demande de fusion d'être fusionné avant qu'il ne soit prêt."
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Quelles informations GitLab Inc. recueille-t-il ?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, et %{awardsListLength} de plus"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "1ʳᵉ contribution !"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr "Ajouter un lien"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Ajouter du texte en gras"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erreur lors du chargement des statistiques. Veuillez réessayer"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,14 +3701,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Autoriser les commits des membres qui peuvent fusionner dans la branche cible."
+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 ""
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr "Analyse"
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 "Vérification antiâ€pourriel"
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr "Application : %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "août"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr ""
msgid "Authentication Log"
msgstr "Journal d’authentification"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Vous trouverez ciâ€dessous tous les groupes publics."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Vue d’ensemble"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Les branches protégées peuvent être gérées dans %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Afficher les branches actives"
@@ -6289,9 +6363,6 @@ msgstr "en divergence du dépôt en amont"
msgid "Branches|merged"
msgstr "fusionnée"
-msgid "Branches|project settings"
-msgstr "paramètres du projet"
-
msgid "Branches|protected"
msgstr "protégée"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr "L’intégration continue fonctionnera avec les paramètres d’authentification ciâ€dessus."
-
msgid "CI/CD"
msgstr "Intégration et livraison continues"
@@ -6538,6 +6609,9 @@ msgstr "Configuration de l’intégration et de la livraison continues"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Annuler"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Choisissez n’importe quelle couleur."
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Cette option vous permettra d’installer des applications sur des grappes de serveurs avec contrôle d’accès basé sur le rôle (RBAC)."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr "Aucune demande de fusion associée trouvée"
msgid "Committed by"
msgstr "Commit de"
-msgid "Commit…"
-msgstr "Commit…"
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Continuer"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Passer à l’étape suivante"
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr "Copier le lien"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr "Créer une branche"
msgid "Create commit"
msgstr "Créer un commit"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Limites du diff"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 "Aucun nom de fichier disponible"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr ""
@@ -13077,9 +13231,6 @@ msgstr "Nom du dossier"
msgid "Disable"
msgstr "Désactiver"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr "Désactiver pour ce projet"
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr "Date d’échéance"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr "Correctif par courriel"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,15 +13941,15 @@ msgstr ""
msgid "Enable"
msgstr "Activer"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Activer Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr ""
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Activer la collecte de données Pseudonymizer"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr "protégé"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Épopée"
@@ -14419,9 +14559,6 @@ msgstr "Épopées"
msgid "Epics Roadmap"
msgstr "Feuille de route des épopées"
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Les épopées vous permettent de gérer votre portefeuille de projets plus efficacement et avec moins d’efforts"
@@ -14524,6 +14661,9 @@ msgstr "Échéance"
msgid "Epics|start"
msgstr "commence"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Erreur"
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Indicateurs de fonctionnalités"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Modèles de fichiers"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr "Terminé"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr "Pour plus d’informations, consultez "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 "Impossible de supprimer l’entrée de suivi d’un projet existant."
@@ -16453,9 +16630,21 @@ 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 "En échec"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
msgstr ""
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "État de Geo"
+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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr "Synchronisé"
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 "Jamais"
msgid "Geo|Next sync scheduled at"
msgstr "Prochaine synchro programmée à"
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
msgid "Geo|Not synced yet"
msgstr "Pas encore synchronisé"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr "En attente de synchronisation"
msgid "Geo|Pending verification"
msgstr "En attente de vérification"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr "Projets dans certains fragments de stockage"
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Reâ€télécharger"
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Reâ€synchroniser"
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 "L’entrée de suivi du projet (%{project_id}) a été supprimée avec succès."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Vérification en échec — %{error}"
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "En attente de planification"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr "URL de l’hôte Gitea"
msgid "Gitea Import"
msgstr "Importation depuis Gitea"
+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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Fréquemment consultés"
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr "Maintenance démarrée avec succès"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identifiant"
@@ -18825,13 +19110,10 @@ 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."
-msgstr "Si cette option est désactivée, une branche locale divergente ne sera pas automatiquement mise à jour avec les commits de son homologue distant, afin d’éviter toute perte de données locales. Si la branche par défaut (%{default_branch}) a divergé et ne peut pas être mise à jour, la mise en miroir échouera. Les autres branches divergentes sont ignorées silencieusement."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Utilisateurs internes"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Modèle d’intervalle"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL Jaeger"
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Quitter"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr "Verrouillé aux projets en cours"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Les verrous permettent de verrouiller un fichier ou un dossier spécifique."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr "Demande de fusion"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "Métriques"
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Réseau"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ msgstr "Notifications activées"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "nov."
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr "Bibliothèque de numérisation"
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "Partie des modifications de la demande de fusion"
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pause"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total :"
+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 ""
@@ -28079,6 +28325,9 @@ msgstr "Veuillez saisir un nom descriptif pour votre groupe."
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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr "Thème de navigation"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "Principal"
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "L’exportation du projet n’a pas pu être supprimée."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "L’exportation du projet a été supprimée."
@@ -29657,8 +29915,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-msgstr "Les utilisateurs et utilisatrices ne peuvent uniquement pousser sur ce dépôt que des commits qui ont été effectués avec une de leurs adresses de courriel vérifiées."
+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 ""
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Recherches récentes"
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "Dépôt par URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr "Échec"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Stockage du dépôt"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Demander l’accès"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-msgstr "Profils de requêtes"
-
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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Réessayer"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Feuille de route"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr "Exécuter les tâches non étiquetées"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr "Exécuteurs"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "Exécuteurs actuellement en ligne : %{active_runners_count}"
-
msgid "Runners page."
msgstr "Page des exécuteurs."
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ msgstr "Service d’assistance"
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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "Partager"
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr "Notes de version"
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 ""
+
msgid "TagsPage|Tags"
msgstr "Étiquettes"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-msgstr "Analyse de la couverture des tests"
-
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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Cette page n’est pas disponible car vous n’êtes pas autorisé à lire des informations à travers de multiples projets."
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "à l’instant"
msgid "Timeago|right now"
msgstr "immédiatement"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr "Pour commencer, entrez l’URL de votre hôte Gitea et un %{link_to_pers
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ msgstr ""
msgid "Trigger pipelines for mirror updates"
msgstr "Déclencher des pipelines pour les mises à jour de miroirs"
-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."
+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."
@@ -39782,6 +40022,9 @@ msgstr "Dépanner et surveiller votre application grâce au traçage"
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 "Veuillez réessayer"
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Type"
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "Mise à jour en cours"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr "Divers paramètres de courriel."
msgid "Various settings that affect GitLab performance."
msgstr "Divers paramètres qui affectent les performances de GitLab."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr "Identifiants"
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41970,7 +42210,7 @@ msgid "We created a sandbox project that will help you learn the basics of GitLa
msgstr ""
msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
-msgstr "Nous avons détecté un potentiel courriel indésirable dans %{humanized_resource_name}. Veuillez résoudre le reCAPTCHA pour continuer."
+msgstr "Nous avons détecté un potentiel indésirable dans %{humanized_resource_name}. Veuillez résoudre le reCAPTCHA pour continuer."
msgid "We don't have enough data to show this stage."
msgstr "Nous n’avons pas suffisamment de données pour afficher cette étape."
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr "Vous êtes sur une instance GitLab en lecture seule."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ msgstr "Vous pouvez tester votre fichier « .gitlab-ci.yml » avec %{linkStart
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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] "demande de fusion"
msgstr[1] "demandes de fusion"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "Récupérer la branche"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "Patchs par courriel"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Impossible de charger les statistiques de déploiement"
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Ouvrir dans l’EDI Web"
-msgid "mrWidget|Plain diff"
-msgstr "Diff simple"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr "nouvelle demande de fusion"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "réponse"
msgstr[1] "réponses"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index fa3357c723f..96137675f03 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -225,11 +225,6 @@ msgid_plural "%d errors"
msgstr[0] ""
msgstr[1] ""
-msgid "%d error found:"
-msgid_plural "%d errors found:"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d exporter"
msgid_plural "%d exporters"
msgstr[0] ""
@@ -265,11 +260,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -335,11 +325,6 @@ msgid_plural "%d more comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d new license"
-msgid_plural "%d new licenses"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d open issue"
msgid_plural "%d open issues"
msgstr[0] ""
@@ -375,21 +360,11 @@ msgid_plural "%d projects selected"
msgstr[0] ""
msgstr[1] ""
-msgid "%d removed license"
-msgid_plural "%d removed licenses"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -405,11 +380,6 @@ msgid_plural "%d tags per image name"
msgstr[0] ""
msgstr[1] ""
-msgid "%d token has expired"
-msgid_plural "%d tokens have expired"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d unassigned issue"
msgid_plural "%d unassigned issues"
msgstr[0] ""
@@ -484,6 +454,9 @@ 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 ""
@@ -511,7 +484,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -784,12 +757,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
-msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
-msgstr ""
-
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
msgstr ""
@@ -805,21 +772,24 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
-msgid "%{markdownDocsLinkStart}Markdown%{markdownDocsLinkEnd} and %{quickActionsDocsLinkStart}quick actions%{quickActionsDocsLinkEnd} are supported"
-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 ""
@@ -888,6 +858,9 @@ msgstr ""
msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr ""
+msgid "%{percentageUsed}%% used"
+msgstr ""
+
msgid "%{percentage}%% issues closed"
msgstr ""
@@ -909,6 +882,9 @@ 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 ""
@@ -929,7 +905,7 @@ msgstr ""
msgid "%{reportType} detected %{totalStart}%{total}%{totalEnd} potential %{vulnMessage}"
msgstr ""
-msgid "%{reportType} detected %{totalStart}no%{totalEnd} vulnerabilities."
+msgid "%{reportType} detected no %{totalStart}new%{totalEnd} vulnerabilities."
msgstr ""
msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}attach a new file%{newFileButtonEnd}."
@@ -1303,17 +1279,35 @@ 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 ""
@@ -1322,6 +1316,9 @@ 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 ""
@@ -1337,6 +1334,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1476,7 +1476,7 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
-msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgid "2. Before July 1, 2022, all free tier public open source projects must %{enrollment_link} to continue to receive GitLab Ultimate benefits."
msgstr ""
msgid "20-29 contributions"
@@ -1518,6 +1518,12 @@ 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 ""
@@ -1581,6 +1587,9 @@ 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 ""
@@ -1623,6 +1632,9 @@ 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 ""
@@ -1860,9 +1872,6 @@ msgstr ""
msgid "Access to '%{classification_label}' not allowed"
msgstr ""
-msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
-msgstr ""
-
msgid "AccessDropdown|Deploy Keys"
msgstr ""
@@ -1974,9 +1983,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1992,12 +1998,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2100,6 +2100,9 @@ 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 ""
@@ -2166,6 +2169,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2220,6 +2226,9 @@ msgstr ""
msgid "Add image comment"
msgstr ""
+msgid "Add internal note"
+msgstr ""
+
msgid "Add italic text"
msgstr ""
@@ -2238,6 +2247,9 @@ msgstr ""
msgid "Add new directory"
msgstr ""
+msgid "Add or remove a user."
+msgstr ""
+
msgid "Add or remove previously merged commits"
msgstr ""
@@ -2586,12 +2598,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2610,6 +2616,9 @@ 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 ""
@@ -2628,6 +2637,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2640,6 +2652,9 @@ 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 ""
@@ -2649,12 +2664,30 @@ 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 ""
@@ -2664,6 +2697,12 @@ 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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
@@ -2673,6 +2712,9 @@ 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 ""
@@ -2703,10 +2745,16 @@ 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 enabled"
+msgid "AdminSettings|Project export"
msgstr ""
msgid "AdminSettings|Protect CI/CD variables by default"
@@ -2727,6 +2775,9 @@ msgstr ""
msgid "AdminSettings|Save %{name} limits"
msgstr ""
+msgid "AdminSettings|Search with Elasticsearch enabled"
+msgstr ""
+
msgid "AdminSettings|Select a CI/CD template"
msgstr ""
@@ -2769,6 +2820,9 @@ 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 ""
@@ -2778,6 +2832,12 @@ 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|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 ""
@@ -3219,6 +3279,9 @@ msgstr ""
msgid "Advanced export options"
msgstr ""
+msgid "AdvancedSearch|Elasticsearch version not compatible"
+msgstr ""
+
msgid "AdvancedSearch|Reindex required"
msgstr ""
@@ -3546,9 +3609,6 @@ msgstr ""
msgid "AlertSettings|You can map default GitLab alert fields to your payload keys in the dropdowns below."
msgstr ""
-msgid "AlertSettings|You can now set up alert endpoints for manually configured Prometheus instances in the Alerts section on the Operations settings page. Alert endpoint fields on this page have been deprecated."
-msgstr ""
-
msgid "AlertSettings|{ \"events\": [{ \"application\": \"Name of application\" }] }"
msgstr ""
@@ -3654,7 +3714,10 @@ msgstr ""
msgid "All projects selected"
msgstr ""
-msgid "All threads resolved"
+msgid "All protected branches"
+msgstr ""
+
+msgid "All threads resolved!"
msgstr ""
msgid "All users must accept the Terms of Service and Privacy Policy to access GitLab"
@@ -3723,9 +3786,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3741,9 +3801,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3801,9 +3858,6 @@ msgstr ""
msgid "Amazon Web Services Logo"
msgstr ""
-msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
-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 ""
@@ -4113,6 +4167,9 @@ 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 ""
@@ -4154,12 +4211,18 @@ 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 ""
@@ -4370,12 +4433,21 @@ msgstr ""
msgid "ApplicationSettings|Add a link to Grafana"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4413,37 +4485,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4452,22 +4521,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4552,33 +4621,12 @@ msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCoun
msgstr[0] ""
msgstr[1] ""
-msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr ""
-
msgid "ApprovalRule|A merge request author collaborating with a merge request approver"
msgstr ""
msgid "ApprovalRule|Add approvers"
msgstr ""
-msgid "ApprovalRule|All scanners"
-msgstr ""
-
-msgid "ApprovalRule|All severity levels"
-msgstr ""
-
-msgid "ApprovalRule|All vulnerability states"
-msgstr ""
-
-msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
-msgstr ""
-
-msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
-msgstr ""
-
-msgid "ApprovalRule|Apply this approval rule to consider only the selected vulnerability states."
-msgstr ""
-
msgid "ApprovalRule|Approval rules"
msgstr ""
@@ -4615,21 +4663,6 @@ msgstr ""
msgid "ApprovalRule|Newly detected"
msgstr ""
-msgid "ApprovalRule|Number of vulnerabilities allowed before approval rule is triggered."
-msgstr ""
-
-msgid "ApprovalRule|Please enter a number equal or greater than zero"
-msgstr ""
-
-msgid "ApprovalRule|Please select at least one security scanner"
-msgstr ""
-
-msgid "ApprovalRule|Please select at least one severity level"
-msgstr ""
-
-msgid "ApprovalRule|Please select at least one vulnerability state"
-msgstr ""
-
msgid "ApprovalRule|Previously detected"
msgstr ""
@@ -4642,39 +4675,15 @@ msgstr ""
msgid "ApprovalRule|Rule name"
msgstr ""
-msgid "ApprovalRule|Security scanners"
-msgstr ""
-
-msgid "ApprovalRule|Select All"
-msgstr ""
-
msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
msgstr ""
-msgid "ApprovalRule|Select scanners"
-msgstr ""
-
-msgid "ApprovalRule|Select severity levels"
-msgstr ""
-
-msgid "ApprovalRule|Select vulnerability states"
-msgstr ""
-
-msgid "ApprovalRule|Severity levels"
-msgstr ""
-
msgid "ApprovalRule|Target branch"
msgstr ""
msgid "ApprovalRule|Try for free"
msgstr ""
-msgid "ApprovalRule|Vulnerabilities allowed"
-msgstr ""
-
-msgid "ApprovalRule|Vulnerability states"
-msgstr ""
-
msgid "ApprovalSettings|Merge request approval settings have been updated."
msgstr ""
@@ -4741,6 +4750,9 @@ msgstr ""
msgid "Approved-By"
msgstr ""
+msgid "Approved. Your attention request was removed."
+msgstr ""
+
msgid "Approver"
msgstr ""
@@ -4813,7 +4825,7 @@ msgstr ""
msgid "Are you sure you want to attempt to merge?"
msgstr ""
-msgid "Are you sure you want to cancel editing this comment?"
+msgid "Are you sure you want to cancel editing this %{commentType}?"
msgstr ""
msgid "Are you sure you want to close this blocked issue?"
@@ -4825,7 +4837,7 @@ msgstr ""
msgid "Are you sure you want to delete these artifacts?"
msgstr ""
-msgid "Are you sure you want to delete this %{typeOfComment}?"
+msgid "Are you sure you want to delete this %{commentType}?"
msgstr ""
msgid "Are you sure you want to delete this SSH key?"
@@ -5070,6 +5082,9 @@ msgstr ""
msgid "Assigned to you"
msgstr ""
+msgid "Assigned user(s). Your attention request was removed."
+msgstr ""
+
msgid "Assignee"
msgid_plural "%d Assignees"
msgstr[0] ""
@@ -5102,10 +5117,10 @@ 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, but expiration enforcement is disabled. %{generate_new}"
+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, but expiration enforcement is disabled. %{generate_new}"
+msgid "At least one of your Personal Access Tokens will expire soon. %{generate_new}"
msgstr ""
msgid "At risk"
@@ -5272,9 +5287,6 @@ msgstr ""
msgid "Authenticated web requests"
msgstr ""
-msgid "Authenticating"
-msgstr ""
-
msgid "Authentication"
msgstr ""
@@ -5320,9 +5332,6 @@ msgstr ""
msgid "Authorization code:"
msgstr ""
-msgid "Authorization key"
-msgstr ""
-
msgid "Authorization required"
msgstr ""
@@ -5476,9 +5485,6 @@ msgstr ""
msgid "Available on-demand"
msgstr ""
-msgid "Available runners: %{runners}"
-msgstr ""
-
msgid "Available shared runners:"
msgstr ""
@@ -5524,6 +5530,27 @@ 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 ""
@@ -5635,7 +5662,79 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+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."
@@ -5665,9 +5764,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5677,24 +5773,84 @@ msgstr ""
msgid "Billing"
msgstr ""
-msgid "BillingPlans|%{group_name} is currently using the %{plan_name}."
+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 ""
@@ -5704,21 +5860,84 @@ 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 ""
@@ -5734,6 +5953,9 @@ 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 ""
@@ -5752,6 +5974,9 @@ msgstr ""
msgid "BillingPlans|per user"
msgstr ""
+msgid "BillingPlans|per user/month"
+msgstr ""
+
msgid "BillingPlan|Upgrade"
msgstr ""
@@ -5773,18 +5998,33 @@ 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|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 ""
@@ -5800,6 +6040,9 @@ 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'll now be able to take advantage of free CI/CD minutes on shared runners."
msgstr ""
@@ -5845,12 +6088,24 @@ 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 ""
@@ -5881,6 +6136,9 @@ 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 "Bitbucket Server Import"
msgstr ""
@@ -5955,6 +6213,9 @@ 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 ""
@@ -5988,6 +6249,9 @@ msgstr ""
msgid "BoardScope|Current iteration"
msgstr ""
+msgid "BoardScope|Don't filter milestone"
+msgstr ""
+
msgid "BoardScope|Edit"
msgstr ""
@@ -6208,6 +6472,9 @@ 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 ""
@@ -6256,9 +6523,6 @@ msgstr ""
msgid "Branches|No branches to show"
msgstr ""
-msgid "Branches|Once you confirm and press %{strongStart}%{buttonText},%{strongEnd} it cannot be undone or recovered."
-msgstr ""
-
msgid "Branches|Only a project maintainer or owner can delete a protected branch"
msgstr ""
@@ -6298,7 +6562,7 @@ 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."
+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."
@@ -6313,10 +6577,10 @@ msgstr ""
msgid "Branches|Yes, delete protected branch"
msgstr ""
-msgid "Branches|You're about to permanently delete the branch %{strongStart}%{branchName}.%{strongEnd}"
+msgid "Branches|You're about to permanently delete the branch %{branchName}."
msgstr ""
-msgid "Branches|You're about to permanently delete the protected branch %{strongStart}%{branchName}.%{strongEnd}"
+msgid "Branches|You're about to permanently delete the protected branch %{branchName}."
msgstr ""
msgid "Branches|diverged from upstream"
@@ -6385,6 +6649,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6400,6 +6667,9 @@ 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 ""
@@ -6424,9 +6694,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6568,6 +6835,12 @@ 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 ""
@@ -6583,6 +6856,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6648,6 +6924,9 @@ msgstr ""
msgid "CICD|Jobs"
msgstr ""
+msgid "CICD|Limit"
+msgstr ""
+
msgid "CICD|Limit CI_JOB_TOKEN access"
msgstr ""
@@ -6660,6 +6939,15 @@ 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 ""
@@ -6822,6 +7110,9 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
msgid "Cancel editing"
msgstr ""
@@ -6954,6 +7245,9 @@ msgstr ""
msgid "Certificate Subject"
msgstr ""
+msgid "Change Failure Rate"
+msgstr ""
+
msgid "Change assignee"
msgstr ""
@@ -7065,6 +7359,9 @@ msgstr ""
msgid "Changed reviewer(s)."
msgstr ""
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
msgid "Changed the title to \"%{title_param}\"."
msgstr ""
@@ -7155,6 +7452,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7474,9 +7774,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7872,6 +8169,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7935,7 +8235,7 @@ msgstr ""
msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7944,6 +8244,9 @@ 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 ""
@@ -7980,12 +8283,6 @@ msgstr ""
msgid "ClusterAgents|Create a cluster"
msgstr ""
-msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
-msgstr ""
-
-msgid "ClusterAgents|Create a cluster (deprecated)"
-msgstr ""
-
msgid "ClusterAgents|Create agent access token"
msgstr ""
@@ -8070,6 +8367,11 @@ 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 ""
@@ -8094,10 +8396,19 @@ 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 such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8118,17 +8429,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8147,7 +8456,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8174,9 +8483,6 @@ msgstr ""
msgid "ClusterAgent|You have insufficient permissions to delete this cluster agent"
msgstr ""
-msgid "ClusterApplicationsRemoved|One-click application management was removed in GitLab 14.0. Your applications are still installed in your cluster, and integrations continue working."
-msgstr ""
-
msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr ""
@@ -8210,9 +8516,6 @@ msgstr ""
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster’s integration"
msgstr ""
-msgid "ClusterIntegration|Allow GitLab to manage namespace and service accounts for this cluster. %{linkStart}More information%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster."
msgstr ""
@@ -8225,18 +8528,6 @@ msgstr ""
msgid "ClusterIntegration|Amazon EKS"
msgstr ""
-msgid "ClusterIntegration|An error occurred when trying to contact the Google Cloud API. Please try again later."
-msgstr ""
-
-msgid "ClusterIntegration|An error occurred while trying to fetch project zones: %{error}"
-msgstr ""
-
-msgid "ClusterIntegration|An error occurred while trying to fetch your projects: %{error}"
-msgstr ""
-
-msgid "ClusterIntegration|An error occurred while trying to fetch zone machine types: %{error}"
-msgstr ""
-
msgid "ClusterIntegration|An unknown error occurred while attempting to connect to Kubernetes."
msgstr ""
@@ -8246,12 +8537,6 @@ msgstr ""
msgid "ClusterIntegration|Apply for credit"
msgstr ""
-msgid "ClusterIntegration|Authenticate with AWS"
-msgstr ""
-
-msgid "ClusterIntegration|Authenticate with Amazon Web Services"
-msgstr ""
-
msgid "ClusterIntegration|Authentication Error"
msgstr ""
@@ -8273,15 +8558,6 @@ msgstr ""
msgid "ClusterIntegration|Check your token"
msgstr ""
-msgid "ClusterIntegration|Choose the %{linkStart}security group%{linkEnd} to apply to the EKS-managed Elastic Network Interfaces that are created in your worker node subnets."
-msgstr ""
-
-msgid "ClusterIntegration|Choose the %{linkStart}subnets %{linkEnd} in your VPC where your worker nodes will run."
-msgstr ""
-
-msgid "ClusterIntegration|Choose the worker node %{linkStart}instance type%{linkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your environments will use this cluster."
msgstr ""
@@ -8291,9 +8567,6 @@ msgstr ""
msgid "ClusterIntegration|Clear the local cache of namespace and service accounts."
msgstr ""
-msgid "ClusterIntegration|Cluster Region"
-msgstr ""
-
msgid "ClusterIntegration|Cluster management project"
msgstr ""
@@ -8321,57 +8594,21 @@ msgstr ""
msgid "ClusterIntegration|Copy Kubernetes cluster name"
msgstr ""
-msgid "ClusterIntegration|Could not load IAM roles"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load Key Pairs"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load VPCs for the selected region"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load instance types"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load networks"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load security groups for the selected VPC"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load subnets for the selected VPC"
-msgstr ""
-
-msgid "ClusterIntegration|Could not load subnetworks"
-msgstr ""
-
-msgid "ClusterIntegration|Create Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Create a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Creating Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Deletes all GitLab resources attached to this cluster during removal"
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|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. %{linkStart}More information%{linkEnd}"
-msgstr ""
-
msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Elastic Kubernetes Service"
msgstr ""
-msgid "ClusterIntegration|Enable Cloud Run for Anthos"
-msgstr ""
-
msgid "ClusterIntegration|Enable Elastic Stack integration"
msgstr ""
@@ -8390,12 +8627,6 @@ msgstr ""
msgid "ClusterIntegration|Enter new Service Token"
msgstr ""
-msgid "ClusterIntegration|Enter the details for your Amazon EKS Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Enter your Kubernetes cluster certificate details"
msgstr ""
@@ -8423,15 +8654,6 @@ msgstr ""
msgid "ClusterIntegration|Failed to run Kubeclient: %{message}"
msgstr ""
-msgid "ClusterIntegration|Fetching machine types"
-msgstr ""
-
-msgid "ClusterIntegration|Fetching projects"
-msgstr ""
-
-msgid "ClusterIntegration|Fetching zones"
-msgstr ""
-
msgid "ClusterIntegration|GitLab Integration"
msgstr ""
@@ -8444,18 +8666,12 @@ msgstr ""
msgid "ClusterIntegration|GitLab-managed cluster"
msgstr ""
-msgid "ClusterIntegration|Google Cloud Platform project"
-msgstr ""
-
msgid "ClusterIntegration|Google GKE"
msgstr ""
msgid "ClusterIntegration|Google Kubernetes Engine"
msgstr ""
-msgid "ClusterIntegration|Google Kubernetes Engine project"
-msgstr ""
-
msgid "ClusterIntegration|Group cluster"
msgstr ""
@@ -8471,9 +8687,6 @@ msgstr ""
msgid "ClusterIntegration|Instance cluster"
msgstr ""
-msgid "ClusterIntegration|Instance type"
-msgstr ""
-
msgid "ClusterIntegration|Integration disabled"
msgstr ""
@@ -8483,9 +8696,6 @@ msgstr ""
msgid "ClusterIntegration|Integrations allow you to use applications installed in your cluster as part of your GitLab workflow."
msgstr ""
-msgid "ClusterIntegration|Key pair name"
-msgstr ""
-
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr ""
@@ -8495,18 +8705,6 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster was successfully created."
msgstr ""
-msgid "ClusterIntegration|Kubernetes version"
-msgstr ""
-
-msgid "ClusterIntegration|Kubernetes version not found"
-msgstr ""
-
-msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
-msgstr ""
-
-msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
-msgstr ""
-
msgid "ClusterIntegration|Learn more about Kubernetes."
msgstr ""
@@ -8516,93 +8714,18 @@ msgstr ""
msgid "ClusterIntegration|Learn more about instance Kubernetes clusters"
msgstr ""
-msgid "ClusterIntegration|Loading IAM Roles"
-msgstr ""
-
-msgid "ClusterIntegration|Loading Key Pairs"
-msgstr ""
-
-msgid "ClusterIntegration|Loading VPCs"
-msgstr ""
-
-msgid "ClusterIntegration|Loading instance types"
-msgstr ""
-
-msgid "ClusterIntegration|Loading networks"
-msgstr ""
-
-msgid "ClusterIntegration|Loading security groups"
-msgstr ""
-
-msgid "ClusterIntegration|Loading subnets"
-msgstr ""
-
-msgid "ClusterIntegration|Loading subnetworks"
-msgstr ""
-
-msgid "ClusterIntegration|Machine type"
-msgstr ""
-
msgid "ClusterIntegration|Make sure your API endpoint is correct"
msgstr ""
-msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
-msgstr ""
-
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{provider_link}"
msgstr ""
msgid "ClusterIntegration|Namespace per environment"
msgstr ""
-msgid "ClusterIntegration|No IAM Roles found"
-msgstr ""
-
-msgid "ClusterIntegration|No Key Pairs found"
-msgstr ""
-
-msgid "ClusterIntegration|No VPCs found"
-msgstr ""
-
-msgid "ClusterIntegration|No instance type found"
-msgstr ""
-
-msgid "ClusterIntegration|No machine types matched your search"
-msgstr ""
-
-msgid "ClusterIntegration|No networks found"
-msgstr ""
-
-msgid "ClusterIntegration|No projects found"
-msgstr ""
-
-msgid "ClusterIntegration|No projects matched your search"
-msgstr ""
-
-msgid "ClusterIntegration|No security group found"
-msgstr ""
-
-msgid "ClusterIntegration|No subnet found"
-msgstr ""
-
-msgid "ClusterIntegration|No subnetworks found"
-msgstr ""
-
-msgid "ClusterIntegration|No zones matched your search"
-msgstr ""
-
msgid "ClusterIntegration|Node calculations use the Kubernetes Metrics API. Make sure your cluster has metrics installed"
msgstr ""
-msgid "ClusterIntegration|Number of nodes"
-msgstr ""
-
-msgid "ClusterIntegration|Number of nodes must be a numerical value."
-msgstr ""
-
-msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
-
msgid "ClusterIntegration|Project cluster"
msgstr ""
@@ -8615,18 +8738,9 @@ msgstr ""
msgid "ClusterIntegration|Provider details"
msgstr ""
-msgid "ClusterIntegration|Provision Role ARN"
-msgstr ""
-
msgid "ClusterIntegration|RBAC-enabled cluster"
msgstr ""
-msgid "ClusterIntegration|Read our %{linkStart}help page%{linkEnd} on Kubernetes cluster integration."
-msgstr ""
-
-msgid "ClusterIntegration|Read our %{link_start}help page%{link_end} on Kubernetes cluster integration."
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -8651,120 +8765,12 @@ msgstr ""
msgid "ClusterIntegration|Save changes"
msgstr ""
-msgid "ClusterIntegration|Search IAM Roles"
-msgstr ""
-
-msgid "ClusterIntegration|Search Key Pairs"
-msgstr ""
-
-msgid "ClusterIntegration|Search VPCs"
-msgstr ""
-
-msgid "ClusterIntegration|Search instance types"
-msgstr ""
-
-msgid "ClusterIntegration|Search machine types"
-msgstr ""
-
-msgid "ClusterIntegration|Search networks"
-msgstr ""
-
-msgid "ClusterIntegration|Search projects"
-msgstr ""
-
-msgid "ClusterIntegration|Search security groups"
-msgstr ""
-
-msgid "ClusterIntegration|Search subnets"
-msgstr ""
-
-msgid "ClusterIntegration|Search subnetworks"
-msgstr ""
-
-msgid "ClusterIntegration|Search zones"
-msgstr ""
-
-msgid "ClusterIntegration|Security group"
-msgstr ""
-
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Select a VPC"
-msgstr ""
-
-msgid "ClusterIntegration|Select a VPC to choose a security group"
-msgstr ""
-
-msgid "ClusterIntegration|Select a VPC to choose a subnet"
-msgstr ""
-
-msgid "ClusterIntegration|Select a VPC to use for your EKS Cluster resources. To use a new VPC, first create one on %{linkStart}Amazon Web Services %{linkEnd}."
-msgstr ""
-
-msgid "ClusterIntegration|Select a network"
-msgstr ""
-
-msgid "ClusterIntegration|Select a network to choose a subnetwork"
-msgstr ""
-
-msgid "ClusterIntegration|Select a region to choose a Key Pair"
-msgstr ""
-
-msgid "ClusterIntegration|Select a region to choose a VPC"
-msgstr ""
-
-msgid "ClusterIntegration|Select a security group"
-msgstr ""
-
-msgid "ClusterIntegration|Select a subnet"
-msgstr ""
-
-msgid "ClusterIntegration|Select a subnetwork"
-msgstr ""
-
-msgid "ClusterIntegration|Select a zone to choose a network"
-msgstr ""
-
-msgid "ClusterIntegration|Select an instance type"
-msgstr ""
-
-msgid "ClusterIntegration|Select key pair"
-msgstr ""
-
-msgid "ClusterIntegration|Select machine type"
-msgstr ""
-
-msgid "ClusterIntegration|Select project"
-msgstr ""
-
-msgid "ClusterIntegration|Select project and zone to choose machine type"
-msgstr ""
-
-msgid "ClusterIntegration|Select project to choose zone"
-msgstr ""
-
-msgid "ClusterIntegration|Select service role"
-msgstr ""
-
-msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
-msgstr ""
-
-msgid "ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}."
-msgstr ""
-
-msgid "ClusterIntegration|Select zone"
-msgstr ""
-
-msgid "ClusterIntegration|Select zone to choose machine type"
-msgstr ""
-
msgid "ClusterIntegration|Service Token"
msgstr ""
-msgid "ClusterIntegration|Service role"
-msgstr ""
-
msgid "ClusterIntegration|Service token is required."
msgstr ""
@@ -8780,12 +8786,6 @@ msgstr ""
msgid "ClusterIntegration|Specifying a domain will allow you to use Auto Review Apps and Auto Deploy stages for %{linkStart}Auto DevOps.%{linkEnd} The domain should have a wildcard DNS configured matching the domain. "
msgstr ""
-msgid "ClusterIntegration|Subnets"
-msgstr ""
-
-msgid "ClusterIntegration|The Amazon Resource Name (ARN) associated with your role. If you do not have a provisioned role, first create one on %{awsLinkStart}Amazon Web Services %{awsLinkEnd} using the above account and external IDs. %{moreInfoStart}More information%{moreInfoEnd}"
-msgstr ""
-
msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster."
msgstr ""
@@ -8798,18 +8798,12 @@ msgstr ""
msgid "ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, logs, and Web terminals."
msgstr ""
-msgid "ClusterIntegration|The region the new cluster will be created in. You must reauthenticate to change regions."
-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 account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
-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 ""
@@ -8822,24 +8816,15 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
-msgstr ""
-
msgid "ClusterIntegration|This will permanently delete the following resources:"
msgstr ""
-msgid "ClusterIntegration|To create a cluster, first create a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-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|To use a new project, first create one on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Troubleshooting tips:"
msgstr ""
@@ -8858,24 +8843,9 @@ 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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
-msgstr ""
-
msgid "ClusterIntegration|Using AutoDevOps with multiple clusters? %{help_link_start}Read this first.%{help_link_end}"
msgstr ""
-msgid "ClusterIntegration|VPC"
-msgstr ""
-
-msgid "ClusterIntegration|Validating project billing status"
-msgstr ""
-
-msgid "ClusterIntegration|We could not verify that one of your projects on GCP has billing enabled. Please try again."
-msgstr ""
-
-msgid "ClusterIntegration|We were unable to fetch any projects. Ensure that you have a project on %{docsLinkStart}Google Cloud Platform%{docsLinkEnd}."
-msgstr ""
-
msgid "ClusterIntegration|Where do you want to create a cluster?"
msgstr ""
@@ -8885,30 +8855,9 @@ msgstr ""
msgid "ClusterIntegration|You are about to remove your cluster integration."
msgstr ""
-msgid "ClusterIntegration|You must grant access to your organization’s AWS resources in order to create a new EKS cluster. To grant access, create a provision role using the account and external ID below and provide us the ARN."
-msgstr ""
-
-msgid "ClusterIntegration|You should select at least two subnets"
-msgstr ""
-
-msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
-msgstr ""
-
msgid "ClusterIntegration|Your cluster API is unreachable. Please ensure your API URL is correct."
msgstr ""
-msgid "ClusterIntegration|Your service role is distinct from the provision role used when authenticating. It will allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf. To use a new role, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
-msgstr ""
-
-msgid "ClusterIntegration|Zone"
-msgstr ""
-
-msgid "ClusterIntegration|access to Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|meets the requirements"
-msgstr ""
-
msgid "ClusterIntegration|sign up"
msgstr ""
@@ -9029,9 +8978,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9616,9 +9562,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9649,9 +9592,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9716,12 +9656,6 @@ msgstr ""
msgid "ContainerRegistry|Cleanup ran but some tags were not removed"
msgstr ""
-msgid "ContainerRegistry|Cleanup timed out"
-msgstr ""
-
-msgid "ContainerRegistry|Cleanup timed out before it could delete all tags"
-msgstr ""
-
msgid "ContainerRegistry|Cleanup will run %{time}"
msgstr ""
@@ -9824,6 +9758,9 @@ 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 ""
@@ -9922,6 +9859,9 @@ 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 ""
@@ -9973,9 +9913,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10114,18 +10051,9 @@ msgstr ""
msgid "Copy %{type}"
msgstr ""
-msgid "Copy Account ID to clipboard"
-msgstr ""
-
-msgid "Copy External ID to clipboard"
-msgstr ""
-
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10138,9 +10066,15 @@ msgstr ""
msgid "Copy URL"
msgstr ""
+msgid "Copy audio URL"
+msgstr ""
+
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10168,6 +10102,9 @@ msgstr ""
msgid "Copy file path"
msgstr ""
+msgid "Copy image URL"
+msgstr ""
+
msgid "Copy issue URL to clipboard"
msgstr ""
@@ -10183,6 +10120,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10213,6 +10153,9 @@ msgstr ""
msgid "Copy value"
msgstr ""
+msgid "Copy video URL"
+msgstr ""
+
msgid "Corpus Management"
msgstr ""
@@ -10585,6 +10528,9 @@ msgstr ""
msgid "Create one"
msgstr ""
+msgid "Create or close an issue."
+msgstr ""
+
msgid "Create or import your first project"
msgstr ""
@@ -10624,6 +10570,9 @@ msgstr ""
msgid "Create your group"
msgstr ""
+msgid "Create, update, or delete a merge request."
+msgstr ""
+
msgid "Create/import your first project"
msgstr ""
@@ -10897,9 +10846,15 @@ 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 ""
@@ -10978,6 +10933,9 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
msgid "Custom (%{language})"
msgstr ""
@@ -11044,9 +11002,6 @@ msgstr ""
msgid "Customize name"
msgstr ""
-msgid "Customize your pipeline configuration and coverage report."
-msgstr ""
-
msgid "Customize your pipeline configuration."
msgstr ""
@@ -11155,13 +11110,10 @@ msgstr ""
msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
msgstr ""
-msgid "CycleAnalytics|Aggregation disabled"
-msgstr ""
-
-msgid "CycleAnalytics|Aggregation enabled"
+msgid "CycleAnalytics|Average time to completion"
msgstr ""
-msgid "CycleAnalytics|Average time to completion"
+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."
@@ -11182,9 +11134,6 @@ msgstr ""
msgid "CycleAnalytics|Display chart filters"
msgstr ""
-msgid "CycleAnalytics|Filter by stop date"
-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 ""
@@ -11240,7 +11189,7 @@ msgstr ""
msgid "CycleAnalytics|There is no data for 'Total time' available. Adjust the current filters."
msgstr ""
-msgid "CycleAnalytics|There was an error updating the aggregation status, please try again."
+msgid "CycleAnalytics|Time to Restore Service"
msgstr ""
msgid "CycleAnalytics|Total time"
@@ -11249,9 +11198,6 @@ msgstr ""
msgid "CycleAnalytics|Type of work"
msgstr ""
-msgid "CycleAnalytics|When enabled, the results show items with a stop event within the date range. When disabled, the results show items with a start event within the date range."
-msgstr ""
-
msgid "CycleAnalytics|group dropdown filter"
msgstr ""
@@ -11375,6 +11321,9 @@ 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 ""
@@ -11384,6 +11333,12 @@ 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 ""
@@ -11486,15 +11441,24 @@ 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 ""
@@ -11510,6 +11474,9 @@ msgstr ""
msgid "DastProfiles|Password form field"
msgstr ""
+msgid "DastProfiles|Profile is being used by this on-demand scan"
+msgstr ""
+
msgid "DastProfiles|Profile name"
msgstr ""
@@ -11543,9 +11510,24 @@ 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 ""
@@ -11558,12 +11540,21 @@ 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 ""
@@ -11654,25 +11645,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11689,13 +11680,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11959,6 +11950,12 @@ msgstr ""
msgid "Delete Comment"
msgstr ""
+msgid "Delete File"
+msgstr ""
+
+msgid "Delete Internal Note"
+msgstr ""
+
msgid "Delete Key"
msgstr ""
@@ -11974,6 +11971,9 @@ msgstr ""
msgid "Delete artifacts"
msgstr ""
+msgid "Delete audio"
+msgstr ""
+
msgid "Delete badge"
msgstr ""
@@ -11995,6 +11995,9 @@ msgstr ""
msgid "Delete file"
msgstr ""
+msgid "Delete image"
+msgstr ""
+
msgid "Delete image repository"
msgstr ""
@@ -12049,6 +12052,9 @@ msgstr ""
msgid "Delete variable"
msgstr ""
+msgid "Delete video"
+msgstr ""
+
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
msgstr ""
@@ -12091,6 +12097,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12235,15 +12244,9 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
-msgid "DependencyProxy|Dependency Proxy feature is limited to public groups for now."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy image prefix"
msgstr ""
@@ -12253,6 +12256,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12283,6 +12289,9 @@ msgstr[1] ""
msgid "Deploy Keys"
msgstr ""
+msgid "Deploy Token"
+msgstr ""
+
msgid "Deploy container based web apps on Google managed clusters"
msgstr ""
@@ -12663,6 +12672,12 @@ 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 logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
msgstr ""
@@ -12672,9 +12687,6 @@ msgstr ""
msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
msgstr ""
-msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
-msgstr ""
-
msgid "Deprioritize label"
msgstr ""
@@ -12687,6 +12699,9 @@ msgstr ""
msgid "Description"
msgstr ""
+msgid "Description (alt text)"
+msgstr ""
+
msgid "Description (optional)"
msgstr ""
@@ -13067,6 +13082,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13104,9 +13122,18 @@ 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 ""
@@ -13145,9 +13172,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13229,6 +13253,12 @@ 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 ""
@@ -13384,9 +13414,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13474,9 +13501,21 @@ 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 "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13564,6 +13603,9 @@ msgstr ""
msgid "Edit Pipeline Schedule"
msgstr ""
+msgid "Edit Profile"
+msgstr ""
+
msgid "Edit Release"
msgstr ""
@@ -13582,6 +13624,9 @@ msgstr ""
msgid "Edit application"
msgstr ""
+msgid "Edit audio description"
+msgstr ""
+
msgid "Edit comment"
msgstr ""
@@ -13618,6 +13663,9 @@ msgstr ""
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Edit image description"
+msgstr ""
+
msgid "Edit in pipeline editor"
msgstr ""
@@ -13630,6 +13678,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13657,6 +13708,9 @@ msgstr ""
msgid "Edit user: %{user_name}"
msgstr ""
+msgid "Edit video description"
+msgstr ""
+
msgid "Edit wiki page"
msgstr ""
@@ -13684,9 +13738,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13756,6 +13807,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13879,9 +13933,6 @@ msgstr ""
msgid "Enable PlantUML"
msgstr ""
-msgid "Enable Pseudonymizer data collection"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
@@ -13900,15 +13951,9 @@ msgstr ""
msgid "Enable What's new: Current tier only"
msgstr ""
-msgid "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."
-msgstr ""
-
msgid "Enable access to the performance bar for non-administrators in a given group."
msgstr ""
-msgid "Enable access tokens to expire after 2 hours. If disabled, tokens do not expire."
-msgstr ""
-
msgid "Enable admin mode"
msgstr ""
@@ -13969,12 +14014,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13987,9 +14026,6 @@ 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 the Pseudonymizer data collection."
-msgstr ""
-
msgid "Enable or disable version check and Service Ping."
msgstr ""
@@ -14020,12 +14056,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14089,12 +14119,6 @@ msgstr ""
msgid "Ends: %{endsAt}"
msgstr ""
-msgid "Enforce SSH key expiration"
-msgstr ""
-
-msgid "Enforce personal access token expiration"
-msgstr ""
-
msgid "Enforce two-factor authentication"
msgstr ""
@@ -14195,9 +14219,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14211,9 +14233,6 @@ msgstr ""
msgid "Environment scope"
msgstr ""
-msgid "Environment variable %{environment_variable} does not exist or is not pointing to a valid directory."
-msgstr ""
-
msgid "Environment variables are configured by your administrator to be %{link_start}protected%{link_end} by default."
msgstr ""
@@ -14586,6 +14605,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14841,9 +14863,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14994,6 +15013,9 @@ msgstr ""
msgid "Events"
msgstr ""
+msgid "Events API"
+msgstr ""
+
msgid "Every %{action} attempt has failed: %{job_error_message}. Please try again."
msgstr ""
@@ -15176,9 +15198,6 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
-msgid "Expire access tokens"
-msgstr ""
-
msgid "Expired"
msgstr ""
@@ -15272,9 +15291,6 @@ msgstr ""
msgid "Exported requirements"
msgstr ""
-msgid "External ID"
-msgstr ""
-
msgid "External URL"
msgstr ""
@@ -15589,9 +15605,6 @@ msgstr ""
msgid "Failed to request attention because no user was found."
msgstr ""
-msgid "Failed to reset key. Please try again."
-msgstr ""
-
msgid "Failed to retrieve page"
msgstr ""
@@ -15915,6 +15928,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15942,10 +15958,10 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
+msgid "File templates"
msgstr ""
-msgid "File templates"
+msgid "File too large. Secure Files must be less than %{limit} MB."
msgstr ""
msgid "File upload error."
@@ -16071,9 +16087,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16191,6 +16204,9 @@ 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 ""
@@ -16329,6 +16345,9 @@ 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 ""
@@ -16377,15 +16396,9 @@ msgstr ""
msgid "Generate group access tokens scoped to this group for your applications that need access to the GitLab API."
msgstr ""
-msgid "Generate key"
-msgstr ""
-
msgid "Generate new export"
msgstr ""
-msgid "Generate new token"
-msgstr ""
-
msgid "Generate project access tokens scoped to this project for your applications that need access to the GitLab API."
msgstr ""
@@ -16422,6 +16435,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16452,7 +16475,7 @@ msgstr ""
msgid "Geo|%{title} checksum progress"
msgstr ""
-msgid "Geo|(%{timeAgo})"
+msgid "Geo|Add New Site"
msgstr ""
msgid "Geo|Add site"
@@ -16476,6 +16499,12 @@ 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 ""
@@ -16485,9 +16514,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16500,6 +16544,9 @@ 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 ""
@@ -16521,12 +16568,21 @@ 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 ""
@@ -16536,24 +16592,39 @@ 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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16566,6 +16637,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16590,9 +16664,21 @@ 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 ""
@@ -16608,6 +16694,9 @@ msgstr ""
msgid "Geo|Not synced yet"
msgstr ""
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16617,10 +16706,10 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
-msgid "Geo|Offline"
+msgid "Geo|Object Storage replication"
msgstr ""
-msgid "Geo|Open replications"
+msgid "Geo|Offline"
msgstr ""
msgid "Geo|Pending synchronization"
@@ -16629,6 +16718,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16650,6 +16742,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16692,6 +16787,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16719,15 +16817,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16761,6 +16883,12 @@ 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 ""
@@ -16773,9 +16901,21 @@ 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 ""
@@ -16785,12 +16925,18 @@ 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 ""
@@ -16815,6 +16961,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16830,7 +16979,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16926,6 +17075,9 @@ msgstr ""
msgid "GitLab"
msgstr ""
+msgid "GitLab (self-managed)"
+msgstr ""
+
msgid "GitLab / Unsubscribe"
msgstr ""
@@ -17019,9 +17171,6 @@ msgstr ""
msgid "GitLab project export"
msgstr ""
-msgid "GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
-msgstr ""
-
msgid "GitLab single sign-on URL"
msgstr ""
@@ -17043,6 +17192,9 @@ msgstr ""
msgid "GitLab.com"
msgstr ""
+msgid "GitLab.com (SaaS)"
+msgstr ""
+
msgid "GitLab.com import"
msgstr ""
@@ -17097,6 +17249,12 @@ msgstr ""
msgid "GitLabPages|Remove"
msgstr ""
+msgid "GitLabPages|Remove certificate"
+msgstr ""
+
+msgid "GitLabPages|Remove domain"
+msgstr ""
+
msgid "GitLabPages|Remove pages"
msgstr ""
@@ -17373,6 +17531,9 @@ 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 ""
@@ -17439,9 +17600,6 @@ msgstr ""
msgid "Google Cloud project required"
msgstr ""
-msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
-
msgid "GoogleCloud|Cancel"
msgstr ""
@@ -17847,7 +18005,7 @@ msgstr ""
msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management."
msgstr ""
-msgid "GroupSAML|Identity"
+msgid "GroupSAML|Identifier"
msgstr ""
msgid "GroupSAML|Identity provider single sign-on URL"
@@ -18039,9 +18197,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18159,9 +18314,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18216,15 +18368,15 @@ 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|Export groups with all their related data and move to a new GitLab instance."
-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 ""
@@ -18565,6 +18717,9 @@ msgstr ""
msgid "Help"
msgstr ""
+msgid "Help translate GitLab into your language"
+msgstr ""
+
msgid "Helps prevent bots from brute-force attacks."
msgstr ""
@@ -18589,12 +18744,18 @@ 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 ""
@@ -18761,9 +18922,6 @@ msgstr ""
msgid "How do I use file templates?"
msgstr ""
-msgid "How many days need to pass between marking entity for deletion and actual removing it."
-msgstr ""
-
msgid "How many seconds an IP counts toward the IP address limit."
msgstr ""
@@ -18866,6 +19024,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18911,9 +19072,6 @@ msgstr ""
msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
-msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18926,9 +19084,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19208,6 +19363,9 @@ 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 ""
@@ -19217,9 +19375,15 @@ 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 ""
@@ -19289,6 +19453,9 @@ 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 ""
@@ -19409,6 +19576,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19520,6 +19690,9 @@ 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 ""
@@ -19631,6 +19804,9 @@ 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 ""
@@ -19703,9 +19879,15 @@ 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 ""
@@ -20326,6 +20508,9 @@ 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 ""
@@ -20473,6 +20658,12 @@ msgstr ""
msgid "Integrations|can't exceed %{recipients_limit}"
msgstr ""
+msgid "IntelliJ IDEA (HTTPS)"
+msgstr ""
+
+msgid "IntelliJ IDEA (SSH)"
+msgstr ""
+
msgid "Interactive mode"
msgstr ""
@@ -20488,10 +20679,10 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
+msgid "Internal error occurred while delivering this webhook."
msgstr ""
-msgid "Internal error occurred while delivering this webhook."
+msgid "Internal note"
msgstr ""
msgid "Internal users"
@@ -20500,6 +20691,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20680,6 +20874,9 @@ 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 ""
@@ -20701,10 +20898,10 @@ msgstr ""
msgid "InviteMembersModal|Create issues for your new team member to work on (optional)"
msgstr ""
-msgid "InviteMembersModal|GitLab is better with colleagues!"
+msgid "InviteMembersModal|Explore paid plans"
msgstr ""
-msgid "InviteMembersModal|GitLab member or email address"
+msgid "InviteMembersModal|GitLab is better with colleagues!"
msgstr ""
msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
@@ -20719,10 +20916,10 @@ msgstr ""
msgid "InviteMembersModal|Invite members"
msgstr ""
-msgid "InviteMembersModal|Members were successfully added"
+msgid "InviteMembersModal|Manage members"
msgstr ""
-msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
+msgid "InviteMembersModal|Members were successfully added"
msgstr ""
msgid "InviteMembersModal|Search for a group to invite"
@@ -20740,12 +20937,21 @@ msgstr ""
msgid "InviteMembersModal|Something went wrong"
msgstr ""
+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|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 ""
@@ -20833,9 +21039,6 @@ msgstr ""
msgid "Invited"
msgstr ""
-msgid "Invocations"
-msgstr ""
-
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
msgstr ""
@@ -21169,7 +21372,7 @@ msgstr ""
msgid "Iterations"
msgstr ""
-msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
+msgid "Iterations|Add a duration, and number of upcoming iterations in order to convert this cadence to automatic scheduling."
msgstr ""
msgid "Iterations|Add iteration"
@@ -21229,7 +21432,7 @@ msgstr ""
msgid "Iterations|Error loading iteration cadences."
msgstr ""
-msgid "Iterations|Future iterations"
+msgid "Iterations|First iteration start date"
msgstr ""
msgid "Iterations|Iteration cadences"
@@ -21244,7 +21447,7 @@ msgstr ""
msgid "Iterations|Learn more about automatic scheduling"
msgstr ""
-msgid "Iterations|Move incomplete issues to the next iteration"
+msgid "Iterations|Move incomplete issues to the next iteration."
msgstr ""
msgid "Iterations|New iteration"
@@ -21265,10 +21468,13 @@ 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 future iterations you would like to have scheduled"
+msgid "Iterations|Number of upcoming iterations that should be scheduled at a time."
msgstr ""
msgid "Iterations|Open"
@@ -21298,13 +21504,13 @@ msgstr ""
msgid "Iterations|Start date"
msgstr ""
-msgid "Iterations|The duration for each iteration (in weeks)"
+msgid "Iterations|The duration of each iteration (in weeks)."
msgstr ""
msgid "Iterations|The iteration has been deleted."
msgstr ""
-msgid "Iterations|The start date of your first iteration"
+msgid "Iterations|The start date of the first iteration determines when your cadence begins."
msgstr ""
msgid "Iterations|This cadence requires an update"
@@ -21328,6 +21534,9 @@ msgstr ""
msgid "Iterations|Unable to save cadence. Please try again."
msgstr ""
+msgid "Iterations|Upcoming iterations"
+msgstr ""
+
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -21439,6 +21648,9 @@ 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 ""
@@ -21472,9 +21684,15 @@ 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 ""
@@ -21523,6 +21741,9 @@ 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 ""
@@ -21565,6 +21786,12 @@ 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 ""
@@ -21589,12 +21816,6 @@ msgstr ""
msgid "Job Failed #%{build_id}"
msgstr ""
-msgid "Job artifact"
-msgstr ""
-
-msgid "Job artifacts"
-msgstr ""
-
msgid "Job has been erased"
msgstr ""
@@ -21634,6 +21855,9 @@ 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 ""
@@ -21664,6 +21888,9 @@ 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 ""
@@ -21766,6 +21993,9 @@ 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 ""
@@ -21823,6 +22053,9 @@ msgstr ""
msgid "Jump to next unresolved thread"
msgstr ""
+msgid "Jump to previous unresolved thread"
+msgstr ""
+
msgid "Jun"
msgstr ""
@@ -22371,6 +22604,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22380,6 +22616,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22428,9 +22667,6 @@ msgstr ""
msgid "License compliance"
msgstr ""
-msgid "License file"
-msgstr ""
-
msgid "License key"
msgstr ""
@@ -22503,11 +22739,6 @@ msgid_plural "LicenseCompliance|License Compliance detected %d new licenses and
msgstr[0] ""
msgstr[1] ""
-msgid "LicenseCompliance|License Compliance detected %d removed license"
-msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr ""
@@ -22634,16 +22865,13 @@ msgstr ""
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
+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."
@@ -22661,9 +22889,6 @@ msgstr ""
msgid "Link (optional)"
msgstr ""
-msgid "Link Prometheus monitoring to GitLab."
-msgstr ""
-
msgid "Link Sentry to GitLab to discover and view the errors your application generates."
msgstr ""
@@ -22730,7 +22955,7 @@ msgstr ""
msgid "List of suitable GCP locations"
msgstr ""
-msgid "List of users allowed to exceed the rate limit."
+msgid "List of users who are allowed to exceed the rate limit. Example: username1, username2"
msgstr ""
msgid "List options"
@@ -22742,6 +22967,9 @@ 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 ""
@@ -22769,9 +22997,6 @@ msgstr ""
msgid "Loading files, directories, and submodules in the path %{path} for commit reference %{ref}"
msgstr ""
-msgid "Loading functions timed out. Please reload the page to try again."
-msgstr ""
-
msgid "Loading more"
msgstr ""
@@ -22808,6 +23033,9 @@ msgstr ""
msgid "Lock memberships to LDAP synchronization"
msgstr ""
+msgid "Lock merge request"
+msgstr ""
+
msgid "Lock not found"
msgstr ""
@@ -22970,6 +23198,9 @@ msgstr ""
msgid "Makes this issue confidential."
msgstr ""
+msgid "Manage"
+msgstr ""
+
msgid "Manage %{workspace} labels"
msgstr ""
@@ -23072,18 +23303,12 @@ msgstr ""
msgid "Mark to do as done"
msgstr ""
-msgid "Markdown"
-msgstr ""
-
msgid "Markdown Help"
msgstr ""
msgid "Markdown enabled."
msgstr ""
-msgid "Markdown is supported"
-msgstr ""
-
msgid "Markdown supported."
msgstr ""
@@ -23111,6 +23336,9 @@ 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 ""
@@ -23192,6 +23420,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23231,6 +23462,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23279,6 +23513,12 @@ msgstr ""
msgid "Maximum duration of a session."
msgstr ""
+msgid "Maximum export size"
+msgstr ""
+
+msgid "Maximum export size (MB)"
+msgstr ""
+
msgid "Maximum field length"
msgstr ""
@@ -23345,6 +23585,9 @@ 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 ""
@@ -23357,6 +23600,9 @@ msgstr ""
msgid "Maximum number of unique IP addresses per user."
msgstr ""
+msgid "Maximum of 255 characters"
+msgstr ""
+
msgid "Maximum page reached"
msgstr ""
@@ -23396,6 +23642,9 @@ msgstr ""
msgid "Maximum size of Elasticsearch bulk indexing requests."
msgstr ""
+msgid "Maximum size of export files."
+msgstr ""
+
msgid "Maximum size of import files."
msgstr ""
@@ -23670,6 +23919,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24442,10 +24694,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24592,6 +24844,9 @@ msgstr ""
msgid "More topics"
msgstr ""
+msgid "Most common"
+msgstr ""
+
msgid "Most relevant"
msgstr ""
@@ -24673,9 +24928,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24697,12 +24949,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24891,165 +25137,6 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
-msgid "NetworkPolicies|Environment does not have deployment platform"
-msgstr ""
-
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
-msgid "NetworkPolicies|Invalid or empty policy"
-msgstr ""
-
-msgid "NetworkPolicies|Invalid or unsupported policy kind"
-msgstr ""
-
-msgid "NetworkPolicies|Kubernetes error: %{error}"
-msgstr ""
-
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
-msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
-msgstr ""
-
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
-msgid "NetworkPolicies|Something went wrong, failed to update policy"
-msgstr ""
-
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25331,9 +25418,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25496,9 +25580,6 @@ msgstr ""
msgid "No matching results..."
msgstr ""
-msgid "No member provided"
-msgstr ""
-
msgid "No members found"
msgstr ""
@@ -25541,9 +25622,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25613,6 +25691,9 @@ msgstr ""
msgid "No triggers exist yet. Use the form above to create one."
msgstr ""
+msgid "No user provided"
+msgstr ""
+
msgid "No vulnerabilities present"
msgstr ""
@@ -25726,22 +25807,28 @@ 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|Confidential comments are only visible to members with the role of Reporter or higher"
+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 comment confidential"
+msgid "Notes|Make this an internal note"
msgstr ""
msgid "Notes|Show all activity"
@@ -25756,18 +25843,12 @@ 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 comment is confidential and only visible to group members"
-msgstr ""
-
-msgid "Notes|This comment is confidential and only visible to project members"
+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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25983,9 +26064,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26001,6 +26079,9 @@ msgstr ""
msgid "Off"
msgstr ""
+msgid "Offline"
+msgstr ""
+
msgid "Oh no!"
msgstr ""
@@ -26187,9 +26268,21 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
msgstr ""
+msgid "OnDemandScans|%{scannerType} 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 ""
@@ -26211,22 +26304,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26238,12 +26346,24 @@ msgstr ""
msgid "OnDemandScans|My daily scan"
msgstr ""
+msgid "OnDemandScans|New %{scannerType} 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 %{scannerType} 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 ""
@@ -26274,19 +26394,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26295,6 +26421,9 @@ 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 ""
@@ -26319,6 +26448,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26331,6 +26463,9 @@ 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 ""
@@ -26369,6 +26504,9 @@ 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}."
+msgstr ""
+
msgid "Only 'Reporter' roles and above on tiers Premium and above can see Value Stream Analytics."
msgstr ""
@@ -26393,7 +26531,7 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
+msgid "Only group members with at least Reporter role can view or be notified about this epic."
msgstr ""
msgid "Only include features new to your current subscription tier."
@@ -26453,6 +26591,9 @@ msgstr ""
msgid "Open in your IDE"
msgstr ""
+msgid "Open new window"
+msgstr ""
+
msgid "Open raw"
msgstr ""
@@ -26840,6 +26981,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26938,9 +27085,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27013,6 +27157,12 @@ 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 ""
@@ -27145,9 +27295,6 @@ msgstr ""
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr ""
@@ -27232,7 +27379,10 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause indexing and upgrade Elasticsearch to a supported version."
+msgstr ""
+
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27379,9 +27529,6 @@ msgstr ""
msgid "Personal Access Token prefix"
msgstr ""
-msgid "Personal access tokens are not revoked upon expiration."
-msgstr ""
-
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
msgstr ""
@@ -27418,9 +27565,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27439,6 +27583,9 @@ msgstr ""
msgid "Pipeline URL"
msgstr ""
+msgid "Pipeline creation rate limits"
+msgstr ""
+
msgid "Pipeline durations for the last 30 commits"
msgstr ""
@@ -27490,6 +27637,12 @@ 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 ""
@@ -27694,6 +27847,12 @@ 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 ""
@@ -27706,16 +27865,19 @@ 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|By revoking a trigger you will break any processes making use of it. Are you sure?"
+msgid "Pipelines|Building for iOS?"
msgstr ""
-msgid "Pipelines|CI lint"
+msgid "Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?"
msgstr ""
-msgid "Pipelines|CI/CD template to test and deploy your %{name} project."
+msgid "Pipelines|CI lint"
msgstr ""
msgid "Pipelines|Child pipeline (%{link_start}parent%{link_end})"
@@ -27727,6 +27889,12 @@ 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 ""
@@ -27739,12 +27907,18 @@ 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 ""
@@ -27754,6 +27928,9 @@ 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 ""
@@ -27772,6 +27949,9 @@ 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 ""
@@ -27787,12 +27967,18 @@ 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 ""
@@ -27811,6 +27997,9 @@ 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 ""
@@ -27892,6 +28081,15 @@ 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 ""
@@ -28219,6 +28417,9 @@ 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 ""
@@ -28258,9 +28459,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28318,9 +28516,6 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
-msgid "Please visit the %{faq_link} for more information."
-msgstr ""
-
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28348,7 +28543,7 @@ msgstr ""
msgid "Policy '%{escalation_policy_name}' does not exist."
msgstr ""
-msgid "Policy management project does have any policies in %{policy_path}"
+msgid "Policy management project does not have any policies in %{policy_path}"
msgstr ""
msgid "Policy project doesn't exist"
@@ -28489,7 +28684,7 @@ msgstr ""
msgid "Preferences|Tab width"
msgstr ""
-msgid "Preferences|This feature is experimental and translations are not complete yet"
+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."
@@ -28564,9 +28759,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28825,9 +29017,6 @@ msgstr ""
msgid "Profiles|Expiration date"
msgstr ""
-msgid "Profiles|Expired key is not valid."
-msgstr ""
-
msgid "Profiles|Expired:"
msgstr ""
@@ -28855,9 +29044,6 @@ msgstr ""
msgid "Profiles|Increase your account's security by enabling Two-Factor Authentication (2FA)"
msgstr ""
-msgid "Profiles|Invalid key."
-msgstr ""
-
msgid "Profiles|Invalid password"
msgstr ""
@@ -28876,15 +29062,9 @@ msgstr ""
msgid "Profiles|Key becomes invalid on this date. Maximum lifetime for SSH keys is %{max_ssh_key_lifetime} days"
msgstr ""
-msgid "Profiles|Key can still be used after expiration."
-msgstr ""
-
msgid "Profiles|Key titles are publicly visible."
msgstr ""
-msgid "Profiles|Key usable beyond expiration date."
-msgstr ""
-
msgid "Profiles|Last used:"
msgstr ""
@@ -29500,7 +29680,7 @@ msgstr ""
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
msgstr ""
-msgid "ProjectSettings|All discussions must be resolved"
+msgid "ProjectSettings|All threads must be resolved"
msgstr ""
msgid "ProjectSettings|Allow"
@@ -29512,7 +29692,7 @@ msgstr ""
msgid "ProjectSettings|Analytics"
msgstr ""
-msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
+msgid "ProjectSettings|Automatically resolve merge request diff threads when they become outdated"
msgstr ""
msgid "ProjectSettings|Badges"
@@ -29614,6 +29794,9 @@ 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 ""
@@ -29629,9 +29812,6 @@ msgstr ""
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
msgstr ""
-msgid "ProjectSettings|Learn about commit history."
-msgstr ""
-
msgid "ProjectSettings|Leave empty to use default template."
msgstr ""
@@ -29956,6 +30136,9 @@ msgstr ""
msgid "Projects (%{count})"
msgstr ""
+msgid "Projects API"
+msgstr ""
+
msgid "Projects Successfully Retrieved"
msgstr ""
@@ -30103,9 +30286,6 @@ msgstr ""
msgid "ProjectsNew|Want to house several dependent projects under the same namespace? %{link_start}Create a group.%{link_end}"
msgstr ""
-msgid "Prometheus"
-msgstr ""
-
msgid "PrometheusAlerts|exceeded"
msgstr ""
@@ -30202,9 +30382,6 @@ msgstr ""
msgid "PrometheusService|Waiting for your first deployment to an environment to find common metrics"
msgstr ""
-msgid "PrometheusService|You can now manage your Prometheus settings on the %{operations_link_start}Operations%{operations_link_end} page. Fields on this page have been deprecated."
-msgstr ""
-
msgid "PrometheusService|You have a cluster with the Prometheus integration enabled."
msgstr ""
@@ -30607,12 +30784,6 @@ msgstr ""
msgid "Proxy support for this API is not available currently"
msgstr ""
-msgid "Pseudonymized data collection is disabled. When enabled, GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
-msgstr ""
-
-msgid "Pseudonymizer data collection"
-msgstr ""
-
msgid "Public"
msgstr ""
@@ -30685,6 +30856,9 @@ 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 ""
@@ -30871,9 +31045,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30931,9 +31102,6 @@ msgstr ""
msgid "Receive a %{strongOpen}$50 gift card%{strongClose} as a thank you for your time."
msgstr ""
-msgid "Receive alerts from manually configured Prometheus servers."
-msgstr ""
-
msgid "Receive any notifications from GitLab."
msgstr ""
@@ -30958,9 +31126,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31217,6 +31382,12 @@ 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 ""
@@ -31226,6 +31397,12 @@ 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 ""
@@ -31541,9 +31718,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31556,9 +31730,18 @@ 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 ""
@@ -31571,6 +31754,9 @@ msgstr ""
msgid "Reply by email"
msgstr ""
+msgid "Reply internally"
+msgstr ""
+
msgid "Reply to comment"
msgstr ""
@@ -31583,9 +31769,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31677,6 +31860,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31707,6 +31893,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31881,9 +32070,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31902,9 +32088,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31914,9 +32097,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31944,19 +32124,22 @@ 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 states are invalid"
+msgid "Requested review. Your attention request was removed."
msgstr ""
-msgid "Requests"
+msgid "Requested states are invalid"
msgstr ""
-msgid "Requests Profiles"
+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}"
@@ -32047,12 +32230,6 @@ msgstr ""
msgid "Reset"
msgstr ""
-msgid "Reset authorization key"
-msgstr ""
-
-msgid "Reset authorization key?"
-msgstr ""
-
msgid "Reset file"
msgstr ""
@@ -32062,9 +32239,6 @@ msgstr ""
msgid "Reset health check access token"
msgstr ""
-msgid "Reset key"
-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 ""
@@ -32080,9 +32254,6 @@ msgstr ""
msgid "Reset to project defaults"
msgstr ""
-msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key."
-msgstr ""
-
msgid "Resolve"
msgstr ""
@@ -32185,6 +32356,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32351,10 +32525,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32372,9 +32546,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32433,9 +32604,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32492,6 +32660,9 @@ 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|Group"
msgstr ""
@@ -32683,6 +32854,9 @@ 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 ""
@@ -32767,9 +32941,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32782,9 +32953,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32905,6 +33073,9 @@ msgstr ""
msgid "Save deploy freeze"
msgstr ""
+msgid "Save internal note"
+msgstr ""
+
msgid "Save password"
msgstr ""
@@ -33251,9 +33422,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33278,6 +33446,15 @@ 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 ""
@@ -33302,9 +33479,6 @@ msgstr ""
msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
msgstr ""
-msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability."
-msgstr ""
-
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
msgstr ""
@@ -33320,9 +33494,6 @@ msgstr ""
msgid "SecurityApprovals|Learn more about License-Check"
msgstr ""
-msgid "SecurityApprovals|Learn more about Vulnerability-Check"
-msgstr ""
-
msgid "SecurityApprovals|License-Check"
msgstr ""
@@ -33332,12 +33503,6 @@ msgstr ""
msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
-msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
-msgid "SecurityApprovals|Vulnerability-Check"
-msgstr ""
-
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
msgstr ""
@@ -33479,6 +33644,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33494,28 +33662,46 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
+msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr ""
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
msgstr ""
-msgid "SecurityOrchestration|An error occurred assigning your security policy project"
+msgid "SecurityOrchestration|An error occurred while fetching the scan result policies."
msgstr ""
-msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
+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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+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|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33524,7 +33710,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33542,28 +33728,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33596,6 +33770,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33605,15 +33782,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33626,6 +33806,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33662,6 +33845,9 @@ 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 ""
@@ -33677,6 +33863,9 @@ 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 ""
@@ -33719,10 +33908,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33776,10 +33965,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33956,6 +34145,9 @@ 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 ""
@@ -34103,9 +34295,6 @@ msgstr ""
msgid "See the affected projects in the GitLab admin panel"
msgstr ""
-msgid "See the list of available commands in Slack after setting up this service by entering"
-msgstr ""
-
msgid "See vulnerability %{vulnerability_link} for any Remediation details."
msgstr ""
@@ -34124,6 +34313,9 @@ msgstr ""
msgid "Select Page"
msgstr ""
+msgid "Select Profile"
+msgstr ""
+
msgid "Select a branch"
msgstr ""
@@ -34184,6 +34376,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34199,9 +34394,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34226,12 +34418,6 @@ msgstr ""
msgid "Select project"
msgstr ""
-msgid "Select project and zone to choose machine type"
-msgstr ""
-
-msgid "Select project to choose zone"
-msgstr ""
-
msgid "Select project to create %{type}"
msgstr ""
@@ -34244,9 +34430,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34292,10 +34475,10 @@ msgstr ""
msgid "Selected projects"
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."
+msgid "Selected tag is already in use. Choose another option."
msgstr ""
-msgid "Selective synchronization"
+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"
@@ -34409,78 +34592,6 @@ msgstr ""
msgid "Server version"
msgstr ""
-msgid "Serverless"
-msgstr ""
-
-msgid "Serverless platform"
-msgstr ""
-
-msgid "ServerlessDetails|Configure cluster."
-msgstr ""
-
-msgid "ServerlessDetails|Function invocation metrics require the Prometheus cluster integration."
-msgstr ""
-
-msgid "ServerlessDetails|Invocation metrics loading or not available at this time."
-msgstr ""
-
-msgid "ServerlessDetails|Invocations"
-msgstr ""
-
-msgid "ServerlessDetails|Kubernetes Pods"
-msgstr ""
-
-msgid "ServerlessDetails|More information"
-msgstr ""
-
-msgid "ServerlessDetails|No pods loaded at this time."
-msgstr ""
-
-msgid "ServerlessDetails|Number of Kubernetes pods in use over time based on necessity."
-msgstr ""
-
-msgid "ServerlessDetails|pod in use"
-msgstr ""
-
-msgid "ServerlessDetails|pods in use"
-msgstr ""
-
-msgid "ServerlessURL|Copy URL"
-msgstr ""
-
-msgid "Serverless|Getting started with serverless"
-msgstr ""
-
-msgid "Serverless|If you believe none of these apply, please check back later as the function data may be in the process of becoming available."
-msgstr ""
-
-msgid "Serverless|Learn more about Serverless"
-msgstr ""
-
-msgid "Serverless|No functions available"
-msgstr ""
-
-msgid "Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3."
-msgstr ""
-
-msgid "Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
-msgid "Serverless|The deploy job has not finished."
-msgstr ""
-
-msgid "Serverless|The functions listed in the %{startTag}serverless.yml%{endTag} file don't match the namespace of your cluster."
-msgstr ""
-
-msgid "Serverless|There is currently no function data available from Knative. This could be for a variety of reasons including:"
-msgstr ""
-
-msgid "Serverless|Your %{startTag}.gitlab-ci.yml%{endTag} file is not properly configured."
-msgstr ""
-
-msgid "Serverless|Your repository does not have a corresponding %{startTag}serverless.yml%{endTag} file."
-msgstr ""
-
msgid "Service"
msgstr ""
@@ -34655,9 +34766,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34667,6 +34775,9 @@ msgstr ""
msgid "Set time estimate to %{time_estimate}."
msgstr ""
+msgid "Set to 0 for no size limit."
+msgstr ""
+
msgid "Set up CI/CD"
msgstr ""
@@ -34688,24 +34799,15 @@ msgstr ""
msgid "Set up new password"
msgstr ""
-msgid "Set up shared runner availability"
-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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34804,9 +34906,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35199,27 +35298,42 @@ 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|To set up this integration press \"Add to Slack\""
+msgid "SlackIntegration|This integration allows users to perform common operations on this project by entering slash commands in Slack."
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 ""
@@ -35298,6 +35412,9 @@ 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 ""
@@ -35709,6 +35826,12 @@ 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 ""
@@ -35916,6 +36039,9 @@ 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 ""
@@ -36231,6 +36357,12 @@ 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 ""
@@ -36357,27 +36489,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36660,7 +36771,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36669,6 +36780,9 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
+msgid "SuperSonics|Cannot activate instance due to a connectivity issue."
+msgstr ""
+
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36684,15 +36798,15 @@ msgstr ""
msgid "SuperSonics|Free trial"
msgstr ""
-msgid "SuperSonics|Get help for the most common connectivity issues by %{linkStart}troubleshooting the activation code%{linkEnd}."
-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 ""
@@ -36747,7 +36861,7 @@ 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, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
+msgid "SuperSonics|To activate your subscription, your instance needs to connect to GitLab. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
msgstr ""
msgid "SuperSonics|User in subscription"
@@ -36764,7 +36878,7 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
+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}."
@@ -36800,6 +36914,9 @@ 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 ""
@@ -36851,9 +36968,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36932,7 +37046,7 @@ msgstr ""
msgid "Tag name"
msgstr ""
-msgid "Tag name is required"
+msgid "Tag name is required."
msgstr ""
msgid "Tag push"
@@ -37312,9 +37426,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37424,6 +37535,9 @@ msgstr ""
msgid "TestReports|No test cases were found in the test report."
msgstr ""
+msgid "TestReports|Test details are populated by job artifacts. The job artifacts from this pipeline are expired."
+msgstr ""
+
msgid "TestReports|Tests"
msgstr ""
@@ -37677,9 +37791,6 @@ msgstr[1] ""
msgid "The fork relationship has been removed."
msgstr ""
-msgid "The form contains the following errors:"
-msgstr ""
-
msgid "The form contains the following warning:"
msgstr ""
@@ -37818,6 +37929,9 @@ 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 ""
@@ -37866,13 +37980,13 @@ msgstr ""
msgid "The project is still being deleted. Please try again later."
msgstr ""
-msgid "The project was successfully forked."
+msgid "The project size exceeds the export limit."
msgstr ""
-msgid "The project was successfully imported."
+msgid "The project was successfully forked."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
+msgid "The project was successfully imported."
msgstr ""
msgid "The related CI build failed."
@@ -37989,9 +38103,6 @@ msgstr ""
msgid "Theme"
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
-msgstr ""
-
msgid "There are currently no events."
msgstr ""
@@ -38235,12 +38346,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38289,9 +38394,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38307,9 +38409,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38379,9 +38478,6 @@ msgstr ""
msgid "This %{issuableDisplayName} is locked. Only project members can comment."
msgstr ""
-msgid "This %{issuableType} is confidential"
-msgstr ""
-
msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_close} can comment."
msgstr ""
@@ -38529,6 +38625,12 @@ 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 ""
@@ -38553,6 +38655,9 @@ 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 ""
@@ -38664,7 +38769,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38811,9 +38916,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38901,9 +39003,6 @@ msgstr ""
msgid "This runner will only run on pipelines triggered on protected branches"
msgstr ""
-msgid "This service allows users to perform common operations on this project by entering slash commands in Slack."
-msgstr ""
-
msgid "This setting can be overridden in each project."
msgstr ""
@@ -38967,42 +39066,18 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
msgid "ThreatMonitoring|Alerts"
msgstr ""
-msgid "ThreatMonitoring|All Environments"
-msgstr ""
-
-msgid "ThreatMonitoring|Anomalous Requests"
-msgstr ""
-
-msgid "ThreatMonitoring|Container Network Policies are not installed or have been disabled. To view this data, ensure your Network Policies are installed and enabled for your cluster."
-msgstr ""
-
-msgid "ThreatMonitoring|Container Network Policy"
-msgstr ""
-
-msgid "ThreatMonitoring|Container NetworkPolicies not detected"
-msgstr ""
-
msgid "ThreatMonitoring|Date and time"
msgstr ""
msgid "ThreatMonitoring|Dismissed"
msgstr ""
-msgid "ThreatMonitoring|Dropped Packets"
-msgstr ""
-
-msgid "ThreatMonitoring|Environment"
-msgstr ""
-
msgid "ThreatMonitoring|Events"
msgstr ""
@@ -39027,33 +39102,9 @@ msgstr ""
msgid "ThreatMonitoring|No alerts to display."
msgstr ""
-msgid "ThreatMonitoring|No environments detected"
-msgstr ""
-
-msgid "ThreatMonitoring|Operations Per Second"
-msgstr ""
-
-msgid "ThreatMonitoring|Packet Activity"
-msgstr ""
-
-msgid "ThreatMonitoring|Requests"
-msgstr ""
-
msgid "ThreatMonitoring|Resolved"
msgstr ""
-msgid "ThreatMonitoring|Show last"
-msgstr ""
-
-msgid "ThreatMonitoring|Something went wrong, unable to fetch environments"
-msgstr ""
-
-msgid "ThreatMonitoring|Something went wrong, unable to fetch statistics"
-msgstr ""
-
-msgid "ThreatMonitoring|Statistics"
-msgstr ""
-
msgid "ThreatMonitoring|Status"
msgstr ""
@@ -39069,18 +39120,6 @@ msgstr ""
msgid "ThreatMonitoring|Threat Monitoring help page link"
msgstr ""
-msgid "ThreatMonitoring|Time"
-msgstr ""
-
-msgid "ThreatMonitoring|To view this data, ensure you have configured an environment for this project and that at least one threat monitoring feature is enabled. %{linkStart}More information%{linkEnd}"
-msgstr ""
-
-msgid "ThreatMonitoring|Total Packets"
-msgstr ""
-
-msgid "ThreatMonitoring|Total Requests"
-msgstr ""
-
msgid "ThreatMonitoring|Unreviewed"
msgstr ""
@@ -39138,9 +39177,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39150,6 +39186,9 @@ msgstr ""
msgid "Time spent"
msgstr ""
+msgid "Time to Restore Service"
+msgstr ""
+
msgid "Time to merge"
msgstr ""
@@ -39427,6 +39466,12 @@ 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 ""
@@ -39496,9 +39541,6 @@ msgstr ""
msgid "To reactivate your account, sign in to GitLab at %{gitlab_url}."
msgstr ""
-msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab."
-msgstr ""
-
msgid "To 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 ""
@@ -39553,6 +39595,9 @@ msgstr ""
msgid "To widen your search, change or remove filters above."
msgstr ""
+msgid "To-Do"
+msgstr ""
+
msgid "To-Do List"
msgstr ""
@@ -39664,9 +39709,6 @@ msgstr ""
msgid "Token name"
msgstr ""
-msgid "Token valid until revoked"
-msgstr ""
-
msgid "Tokens|Scopes set the permission levels granted to the token."
msgstr ""
@@ -39697,7 +39739,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39931,6 +39976,9 @@ 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 ""
@@ -39976,6 +40024,9 @@ 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 ""
@@ -40018,15 +40069,18 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
+msgid "Turn off"
msgstr ""
-msgid "Turn off"
+msgid "Turn off notifications"
msgstr ""
msgid "Turn on"
msgstr ""
+msgid "Turn on notifications"
+msgstr ""
+
msgid "Twitter"
msgstr ""
@@ -40072,9 +40126,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40333,6 +40384,9 @@ msgstr ""
msgid "Unlock account"
msgstr ""
+msgid "Unlock merge request"
+msgstr ""
+
msgid "Unlock more features with GitLab Ultimate"
msgstr ""
@@ -40408,9 +40462,6 @@ msgstr ""
msgid "Unsupported todo type passed. Supported todo types are: %{todo_types}"
msgstr ""
-msgid "Until revoked, expired personal access tokens pose a security risk."
-msgstr ""
-
msgid "Unused"
msgstr ""
@@ -40570,6 +40621,9 @@ msgstr ""
msgid "Uploading changes to terminal"
msgstr ""
+msgid "Uploading..."
+msgstr ""
+
msgid "Upstream"
msgstr ""
@@ -40588,6 +40642,9 @@ 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 ""
@@ -40609,22 +40666,34 @@ 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|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. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40645,6 +40714,15 @@ 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 ""
@@ -40663,9 +40741,15 @@ 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|Repository"
msgstr ""
@@ -40675,9 +40759,15 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+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 ""
@@ -40723,6 +40813,12 @@ 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 ""
@@ -40735,7 +40831,7 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
+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."
@@ -40888,7 +40984,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41404,13 +41500,19 @@ 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|Items in Value Stream Analytics are currently filtered by their creation time. There is an %{epic_link_start}epic%{epic_link_end} that will change the Value Stream Analytics date filter to use the end event time for the selected stage."
+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."
@@ -41428,6 +41530,9 @@ msgstr ""
msgid "ValueStreamAnalytics|Number of new issues created."
msgstr ""
+msgid "ValueStreamAnalytics|Percentage of deployments that cause an incident in production."
+msgstr ""
+
msgid "ValueStreamAnalytics|There was an error while fetching value stream analytics %{requestTypeName} data."
msgstr ""
@@ -41479,9 +41584,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41548,6 +41650,9 @@ msgstr ""
msgid "View all issues"
msgstr ""
+msgid "View all personal projects"
+msgstr ""
+
msgid "View blame"
msgstr ""
@@ -41686,6 +41791,9 @@ 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 ""
@@ -41746,9 +41854,6 @@ msgstr ""
msgid "VisibilityLevel|Unknown"
msgstr ""
-msgid "Visit settings page"
-msgstr ""
-
msgid "Visual Studio Code (HTTPS)"
msgstr ""
@@ -42094,9 +42199,6 @@ msgstr ""
msgid "Vulnerability|View training"
msgstr ""
-msgid "WARNING:"
-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 ""
@@ -42136,9 +42238,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42517,7 +42616,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42526,9 +42625,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42570,7 +42666,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42840,9 +42936,6 @@ msgstr ""
msgid "WorkItem|Type"
msgstr ""
-msgid "WorkItem|Work Item"
-msgstr ""
-
msgid "WorkItem|Work Items"
msgstr ""
@@ -42870,6 +42963,9 @@ msgstr ""
msgid "Write a description…"
msgstr ""
+msgid "Write an internal note or drag your files here…"
+msgstr ""
+
msgid "Write milestone description..."
msgstr ""
@@ -42947,6 +43043,9 @@ 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 ""
@@ -42965,7 +43064,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 team members with %{strongStart}at least Reporter access%{strongEnd} will be able to see and leave comments on the %{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 not allowed to %{action} a user"
@@ -43118,6 +43217,9 @@ 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 ""
@@ -43154,6 +43256,9 @@ 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 ""
@@ -43196,6 +43301,9 @@ 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 ""
@@ -43226,6 +43334,9 @@ 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 ""
@@ -43247,6 +43358,9 @@ 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 ""
@@ -43537,6 +43651,9 @@ 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 your personal projects"
+msgstr ""
+
msgid "You've rejected %{user}"
msgstr ""
@@ -44233,11 +44350,15 @@ msgstr ""
msgid "ciReport|Code Quality test metrics results are being parsed"
msgstr ""
-msgid "ciReport|Code quality degraded"
-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"
-msgstr ""
+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 ""
@@ -44305,6 +44426,9 @@ msgstr ""
msgid "ciReport|Found %{issuesWithCount}"
msgstr ""
+msgid "ciReport|Full Report"
+msgstr ""
+
msgid "ciReport|IaC Scanning"
msgstr ""
@@ -44343,6 +44467,9 @@ msgstr ""
msgid "ciReport|Loading Code Quality report"
msgstr ""
+msgid "ciReport|Manage Licenses"
+msgstr ""
+
msgid "ciReport|Manage licenses"
msgstr ""
@@ -44426,6 +44553,9 @@ msgstr[1] ""
msgid "ciReport|View full report"
msgstr ""
+msgid "ciReport|in"
+msgstr ""
+
msgid "ciReport|is loading"
msgstr ""
@@ -44583,9 +44713,6 @@ msgstr ""
msgid "entries cannot contain HTML tags"
msgstr ""
-msgid "environment_id parameter is required when type is container_policy"
-msgstr ""
-
msgid "epic"
msgstr ""
@@ -44745,6 +44872,9 @@ msgid_plural "instances completed"
msgstr[0] ""
msgstr[1] ""
+msgid "internal note"
+msgstr ""
+
msgid "invalid milestone state `%{state}`"
msgstr ""
@@ -44911,6 +45041,9 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
+
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44920,6 +45053,12 @@ 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 ""
@@ -44929,6 +45068,12 @@ 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 ""
@@ -45007,9 +45152,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45051,9 +45193,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45164,9 +45303,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45314,6 +45450,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45408,9 +45547,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45435,6 +45571,9 @@ 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 "pod_name can contain only lowercase letters, digits, '-', and '.' and must start and end with an alphanumeric character"
msgstr ""
@@ -45487,9 +45626,6 @@ msgstr ""
msgid "projects"
msgstr ""
-msgid "quick actions"
-msgstr ""
-
msgid "reCAPTCHA"
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 7506416cba4..85380f76af0 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr " %{start} a %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po
index 5356cd4c3bf..54004130902 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:13\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -343,13 +343,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -511,13 +504,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ 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 ""
@@ -955,9 +944,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1483,9 +1463,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1551,6 +1528,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10â€-19 תרומות"
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "תרומה ר×שונה!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20â€-29 תרומות"
@@ -1808,9 +1794,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ 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 ""
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr "הוספת שורה"
msgid "Add a link"
msgstr "הוספת קישור"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2429,6 +2400,9 @@ msgstr ""
msgid "Add approvers"
msgstr "הוספת מ×שרי×"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "הוספת טקסט מודגש"
@@ -2588,15 +2562,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 ""
@@ -2918,12 +2916,24 @@ 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|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 ""
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3881,6 +3933,9 @@ msgstr "כל המיזמי×"
msgid "All projects selected"
msgstr "כל ×”×ž×™×–×ž×™× × ×‘×—×¨×•"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4334,6 +4389,9 @@ 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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po
index 9ac4b25c567..87eddbb2ef4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po
index bf9579e52f1..c43619669e4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -448,12 +442,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -592,7 +580,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -739,6 +727,9 @@ 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 ""
@@ -868,9 +859,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -880,9 +868,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1054,9 +1039,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1381,9 +1363,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1447,6 +1426,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1594,6 +1576,9 @@ msgstr[2] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1606,6 +1591,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1681,9 +1669,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1729,9 +1714,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1756,6 +1738,9 @@ 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 ""
@@ -2107,9 +2092,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2125,12 +2107,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2251,9 +2227,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2302,6 +2275,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2461,15 +2437,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2722,12 +2698,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2764,6 +2734,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2776,12 +2749,39 @@ 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 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 ""
@@ -2791,12 +2791,24 @@ 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|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 ""
@@ -2827,18 +2839,39 @@ 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|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 ""
@@ -2848,6 +2881,9 @@ 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|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 ""
@@ -2878,9 +2914,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3754,6 +3808,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3769,13 +3826,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3817,9 +3880,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3835,9 +3895,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4207,6 +4264,9 @@ 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 ""
@@ -4282,9 +4342,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4351,9 +4408,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4384,6 +4438,9 @@ 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 ""
@@ -4462,12 +4519,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4507,37 +4579,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4546,22 +4615,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4618,9 +4687,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4816,15 +4882,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5359,7 +5416,7 @@ 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."
+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"
@@ -5398,6 +5455,9 @@ 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 ""
@@ -5584,7 +5644,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5737,7 +5797,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5767,9 +5827,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5875,12 +5932,21 @@ 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|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 ""
@@ -5908,22 +5974,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5938,15 +6010,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5971,9 +6049,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6370,9 +6445,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6430,9 +6502,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6493,6 +6562,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6508,6 +6580,9 @@ 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 ""
@@ -6532,9 +6607,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6661,9 +6733,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6679,6 +6748,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6694,6 +6766,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6766,7 +6841,7 @@ 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."
+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."
@@ -6934,6 +7009,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7168,9 +7249,15 @@ 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 ""
@@ -7189,6 +7276,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7258,6 +7348,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7480,6 +7573,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7546,6 +7642,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7573,9 +7672,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7762,6 +7858,12 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7966,6 +8068,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8023,13 +8128,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8038,6 +8143,9 @@ 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 ""
@@ -8059,12 +8167,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8128,13 +8230,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8146,7 +8248,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8170,6 +8272,12 @@ 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] ""
+msgstr[2] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8182,9 +8290,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8194,19 +8299,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8215,7 +8323,7 @@ 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}"
+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}."
@@ -8227,18 +8335,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
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 ""
@@ -8257,7 +8362,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8416,9 +8521,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8932,6 +9034,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8965,7 +9070,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9139,9 +9244,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9265,9 +9367,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9370,9 +9469,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9733,9 +9829,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9766,9 +9859,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9898,6 +9988,9 @@ 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 ""
@@ -10090,9 +10183,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10129,6 +10219,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10237,9 +10330,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10255,6 +10345,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10297,6 +10390,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10603,6 +10699,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11089,7 +11188,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11263,6 +11365,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11281,6 +11386,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11290,6 +11398,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11668,6 +11779,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11758,25 +11875,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11794,13 +11911,13 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12082,6 +12199,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12193,6 +12313,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12322,9 +12445,15 @@ 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 ""
@@ -12334,9 +12463,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12352,6 +12478,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12613,6 +12742,9 @@ 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 ""
@@ -12763,10 +12895,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13162,6 +13300,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13177,6 +13318,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13198,9 +13342,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+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 ""
@@ -13240,9 +13393,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13255,6 +13405,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13390,7 +13543,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13477,9 +13630,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13567,9 +13717,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13723,6 +13879,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13777,9 +13936,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13840,9 +13996,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13852,6 +14005,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13948,13 +14104,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13978,18 +14134,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14071,12 +14221,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14122,12 +14266,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14194,7 +14332,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14297,10 +14435,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14560,6 +14695,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14584,9 +14722,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14689,6 +14824,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14944,9 +15082,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15280,6 +15415,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15580,6 +15718,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15610,6 +15751,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15766,7 +15910,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16012,6 +16156,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16039,9 +16186,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16168,9 +16312,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16291,9 +16432,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16522,6 +16660,18 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16555,6 +16705,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16576,6 +16729,12 @@ 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 ""
@@ -16585,9 +16744,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16600,6 +16774,9 @@ 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 ""
@@ -16621,9 +16798,21 @@ 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 ""
@@ -16633,24 +16822,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16663,6 +16864,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16687,21 +16891,39 @@ 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 ""
@@ -16711,6 +16933,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16723,6 +16948,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16744,6 +16972,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16786,6 +17017,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16813,15 +17047,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16855,6 +17113,12 @@ 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 ""
@@ -16867,9 +17131,21 @@ 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 ""
@@ -16879,12 +17155,18 @@ 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 ""
@@ -16909,6 +17191,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16924,7 +17209,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17080,7 +17365,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17251,6 +17536,15 @@ 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 ""
@@ -18124,9 +18418,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18244,9 +18535,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18655,6 +18943,9 @@ 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 ""
@@ -18667,9 +18958,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18820,12 +19108,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18958,6 +19240,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18997,15 +19282,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19018,9 +19300,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19303,9 +19582,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19387,6 +19663,9 @@ 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 ""
@@ -19507,6 +19786,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19618,6 +19900,9 @@ 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 ""
@@ -19801,9 +20086,15 @@ 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 ""
@@ -19945,6 +20236,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20068,18 +20362,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20554,9 +20836,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20599,9 +20878,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20611,6 +20887,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20662,6 +20941,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20737,9 +21019,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21295,12 +21574,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21310,9 +21595,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21436,9 +21727,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21544,7 +21832,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21595,9 +21883,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21679,6 +21964,9 @@ 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 ""
@@ -21733,6 +22021,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21745,6 +22036,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22285,6 +22579,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22465,6 +22762,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22474,6 +22774,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22498,6 +22801,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22681,10 +22987,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22732,24 +23035,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22936,9 +23230,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22993,6 +23284,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23296,6 +23590,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23335,6 +23632,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23392,7 +23692,7 @@ 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 28px tall header logo"
+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."
@@ -23653,6 +23953,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23773,6 +24076,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24019,6 +24325,18 @@ 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 ""
@@ -24535,10 +24853,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24766,9 +25084,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24790,12 +25105,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24868,19 +25177,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24985,75 +25294,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25063,87 +25306,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25426,9 +25594,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25636,9 +25801,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25822,6 +25984,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25858,9 +26023,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25990,6 +26152,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26044,9 +26242,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26089,6 +26284,9 @@ 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 ""
@@ -26245,9 +26443,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26269,22 +26476,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26299,6 +26521,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26332,19 +26557,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26377,6 +26608,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26389,6 +26623,9 @@ 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 ""
@@ -26452,9 +26689,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26899,6 +27133,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26998,9 +27238,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27073,6 +27310,12 @@ 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 ""
@@ -27196,13 +27439,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27289,7 +27532,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27475,9 +27718,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27547,6 +27787,12 @@ 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 ""
@@ -28276,6 +28522,9 @@ 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 ""
@@ -28315,9 +28564,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28375,6 +28621,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28459,6 +28708,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28468,6 +28723,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28504,6 +28765,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28603,9 +28867,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29224,9 +29485,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29854,7 +30112,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30904,9 +31162,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30991,9 +31246,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31099,9 +31351,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31579,9 +31828,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31621,9 +31867,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31720,6 +31963,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31750,6 +31996,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31924,9 +32173,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31945,9 +32191,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31957,9 +32200,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31999,9 +32239,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32209,9 +32446,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32233,6 +32467,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32356,6 +32593,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32398,10 +32638,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32419,9 +32659,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32482,9 +32719,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32542,6 +32776,9 @@ 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|Group"
msgstr ""
@@ -32734,6 +32971,9 @@ 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 ""
@@ -32818,9 +33058,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32833,9 +33070,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33313,9 +33547,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33337,9 +33568,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33526,6 +33754,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33541,6 +33772,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33556,10 +33790,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33568,16 +33799,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33586,7 +33841,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33604,28 +33859,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33649,6 +33892,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33658,6 +33904,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33667,15 +33916,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33688,6 +33940,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33724,6 +33979,9 @@ 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 ""
@@ -33739,6 +33997,9 @@ 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 ""
@@ -33754,6 +34015,9 @@ 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 ""
@@ -33778,10 +34042,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33835,10 +34099,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34057,7 +34321,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34243,6 +34507,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34258,9 +34525,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34303,9 +34567,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34354,9 +34615,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34558,13 +34816,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34714,9 +34972,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34753,18 +35008,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34864,9 +35113,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35770,6 +36016,12 @@ 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 ""
@@ -36292,6 +36544,12 @@ 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 ""
@@ -36418,27 +36676,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36631,6 +36868,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36646,6 +36889,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36664,6 +36913,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36706,7 +36958,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36715,9 +36967,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36742,6 +36991,9 @@ 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 ""
@@ -36751,7 +37003,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36811,9 +37066,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36898,9 +37150,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37066,6 +37315,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37267,10 +37519,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37351,6 +37600,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37360,9 +37612,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37615,9 +37864,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37927,9 +38173,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38041,7 +38284,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38221,12 +38464,21 @@ 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 ""
@@ -38278,12 +38530,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38332,9 +38578,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38350,9 +38593,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38596,6 +38836,9 @@ 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 ""
@@ -38707,7 +38950,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38854,9 +39097,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39010,9 +39250,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39181,9 +39418,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39352,10 +39586,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39430,6 +39664,9 @@ 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 ""
@@ -39439,6 +39676,9 @@ 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 ""
@@ -39490,9 +39730,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39739,7 +39976,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39979,7 +40219,7 @@ 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."
+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."
@@ -40018,6 +40258,9 @@ 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 ""
@@ -40060,9 +40303,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40114,9 +40354,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40222,6 +40459,9 @@ 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 ""
@@ -40501,9 +40741,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40552,9 +40789,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40660,6 +40894,12 @@ 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 ""
@@ -40669,7 +40909,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40720,6 +40960,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40768,6 +41011,12 @@ 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 ""
@@ -40780,9 +41029,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40933,7 +41179,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41329,7 +41575,7 @@ 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."
+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."
@@ -41524,9 +41770,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42073,7 +42316,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42184,9 +42427,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42334,7 +42574,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42529,9 +42769,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42541,9 +42778,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42571,7 +42805,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42580,9 +42814,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42625,7 +42856,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42859,12 +43090,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42874,6 +43111,9 @@ 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 ""
@@ -42889,6 +43129,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42952,6 +43195,12 @@ 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] ""
+msgstr[2] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43048,7 +43297,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43219,6 +43468,9 @@ 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 ""
@@ -43594,6 +43846,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43924,15 +44179,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44026,9 +44281,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44083,6 +44335,15 @@ 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 ""
@@ -44221,6 +44482,9 @@ 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 ""
@@ -44947,7 +45211,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44959,6 +45223,12 @@ 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 ""
@@ -44968,6 +45238,12 @@ 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 ""
@@ -45046,9 +45322,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45091,9 +45364,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45205,9 +45475,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45355,6 +45622,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45370,9 +45640,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45388,6 +45655,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45448,9 +45721,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45583,6 +45853,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po
index cd211b32336..8f0c9fc48ea 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/hy_AM/gitlab.po b/locale/hy_AM/gitlab.po
index e65669e8e52..fe3eb531f0c 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index c861962a11b..244c948e458 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ 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 ""
@@ -694,9 +689,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3500,6 +3558,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,13 +3576,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 ""
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ig_NG/gitlab.po b/locale/ig_NG/gitlab.po
index 5a765695121..e07a4dabdd0 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ 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 ""
@@ -694,9 +689,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3500,6 +3558,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,13 +3576,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 ""
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/is_IS/gitlab.po b/locale/is_IS/gitlab.po
index 71b88d517d4..6d6bdab4639 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index f3d4e247c66..bd8214706c9 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr "%{level_name} non è consentito in un gruppo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr "1-9 contributi"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 contributi"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Primo contributo!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 contributi"
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "Agosto"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr ""
msgid "Authentication Log"
msgstr "Log di autenticazione"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr "mergiata"
-msgid "Branches|project settings"
-msgstr "Impostazioni"
-
msgid "Branches|protected"
msgstr "Protetta"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Cancella"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr "Nome cartella"
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr "Housekeeping iniziato con successo"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,13 +19110,10 @@ 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."
-msgstr "Se disabilitato, un ramo locale divergente non verrà automaticamente aggiornato con i commit dalla sua controparte remota, per prevenire la perdita locale dei dati. Se il ramo predefinito (%{default_branch}) è divergente e non può essere aggiornato, il mirroring fallirà. Altri rami divergenti vengono silenziosamente ignorati."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervallo di Pattern"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr "Richiesta di merge"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totale:"
+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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "L'esportazione del progetto non può essere eliminata."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "L'esportazione del progetto è stata eliminata."
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Richiedi accesso"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "poco fa"
msgid "Timeago|right now"
msgstr "adesso"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr "Nuova richiesta di merge"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index 65b79162bbd..98f0d00d880 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr " %{start} ã‹ã‚‰ %{end} ã¾ã§"
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] "%d グループ"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d 件ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžæ¸ˆã¿"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d 時間"
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d 秒"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d 件ã®ã‚·ãƒ£ãƒ¼ãƒ‰ã‚’é¸æŠžæ¸ˆã¿"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d 件ã®ã‚¹ã‚¿ãƒ¼"
@@ -430,8 +422,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}マスク:%{code_close} ジョブログã§éžè¡¨ç¤ºã«ã—ã¾ã™ã€‚マスキングã®è¦ä»¶ã‚’満ãŸã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}ä¿è­·:%{code_close} ä¿è­·ãƒ–ランãƒã‚„ä¿è­·ã‚¿ã‚°ã«ã®ã¿å…¬é–‹ã•ã‚Œã¾ã™ã€‚"
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} ㌠%{commit_authored_timeago} ã«ã‚³ãƒŸãƒƒãƒˆã—ã¾ã—ãŸ"
@@ -565,6 +557,9 @@ msgstr "%{edit_in_new_fork_notice} ã‚‚ã†ä¸€åº¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’アップロード
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} 個ã®ãƒ€ã‚¦ãƒ³ã‚¹ãƒˆãƒªãƒ¼ãƒ ãƒ‘イプライン"
@@ -694,9 +689,6 @@ msgstr "%{level_name} 㯠%{group_level_name} グループã«å«ã‚られã¾ã›ã
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。フォークã—ãŸã‚½ãƒ¼ã‚¹ãƒ—ロジェクトã¯ã‚ˆã‚Šå¯è¦–性ãŒä½Žã„ã‹ã‚‰ã§ã™ã€‚"
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}詳細ã¯ã“ã¡ã‚‰ã€‚%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ msgstr "タイトルã‹ã‚‰ %{link_start} %{draft_snippet} ã®ãƒ—レフィックã
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "タイトルã®å…ˆé ­ã« %{link_start} %{draft_snippet} %{link_end} を書ã„ã¦ã€ä½œæ¥­ä¸­ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒæº–å‚™ãŒã§ãã‚‹ã¾ã§ãƒžãƒ¼ã‚¸ã•ã‚Œãªã„よã†ã«ã—ã¾ã™ã€‚"
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}GitLab Inc.ã¯ã©ã®ã‚ˆã†ãªæƒ…報をåŽé›†ã—ã¦ã„ã¾ã™ã‹ï¼Ÿ%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}ã€ãã—ã¦ã•ã‚‰ã« %{awardsListLength} 個。"
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner} ã®çµæžœã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。パイプラインãŒæœ‰åŠ¹ã«ãªã£ã¦ã‹ã‚‰ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„ãŸã‚ã§ã™ã€‚ %{linkStart}パイプラインを実行%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}ã©ã®ã‚ˆã†ãªæƒ…å ±ãŒGitLab Inc.ã¨å…±æœ‰ã•ã‚Œã¾ã™ã‹ï¼Ÿ%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "%d 以上"
-msgid "+%{approvers} more approvers"
-msgstr "%{approvers} 人以上ã®æ‰¿èªè€…"
-
msgid "+%{extra} more"
msgstr "+%{extra} 件以上"
@@ -1239,6 +1222,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 ãƒã‚¤ãƒˆ"
@@ -1340,6 +1326,9 @@ msgstr[0] "残り %d 年"
msgid "1-9 contributions"
msgstr "貢献 1-9 件"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "貢献 10-19 件"
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "最åˆã®è²¢çŒ®!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "貢献 20-29 件"
@@ -1427,9 +1419,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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を使用ã™ã‚‹åŸºæœ¬çš„ãªãƒšãƒ¼ã‚¸ã¨ã‚µãƒ¼ãƒãƒ¼ãƒ¬ã‚¹é–¢æ•°"
@@ -1475,9 +1464,6 @@ msgstr "通常ã®æƒ…報システムã«ç›¸å½“ã¾ãŸã¯åŒç­‰ã®ä¿è­·ã‚’æä¾›ã™
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "ãŸã ã¡ã«ä¸æ­£åˆ©ç”¨å¯¾å¿œãƒãƒ¼ãƒ ãƒ¡ãƒ³ãƒãƒ¼ã§ã„ãŸã ã„ãŸãƒ¬ãƒãƒ¼ãƒˆã‚’æ‹èª­ã—å‚考ã«ã•ã›ã¦ã„ãŸã ãã¾ã™ã€‚"
-msgid "A merge request hasn't yet been merged"
-msgstr "マージリクエストã¯ã¾ã ãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã„ã¾ã›ã‚“"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr "æ–°ã—ã„Auto DevOps パイプラインãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚詳細ã«ã¤ã„ã¦ã¯ã€ パイプラインページ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
@@ -1502,6 +1488,9 @@ 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 "プレーンHTMLã®ã‚µã‚¤ãƒˆã§GitLabã®ä»£ã‚ã‚Šã«Netlifyã‚’CI/CDã§ä½¿ç”¨ã—ã¦ã„ãŸã¨ã—ã¦ã‚‚ã€GitLabã«ã¯ã»ã‹ã«ã‚‚素晴らã—ã„機能ãŒãŸãã•ã‚“ã‚ã‚Šã¾ã™ã€‚"
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr "行を追加"
msgid "Add a link"
msgstr "リンクを追加"
-msgid "Add a link to Grafana"
-msgstr "Grafanaã¸ã®ãƒªãƒ³ã‚¯ã‚’追加"
-
msgid "Add a new issue"
msgstr "æ–°ã—ã„イシューを作æˆã™ã‚‹"
@@ -2048,6 +2025,9 @@ msgstr "承èªãƒ«ãƒ¼ãƒ«ã®è¿½åŠ "
msgid "Add approvers"
msgstr "承èªè€…を追加"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "太字ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’追加"
@@ -2207,15 +2187,15 @@ msgstr "以å‰ã«ãƒžãƒ¼ã‚¸ã—ãŸã‚³ãƒŸãƒƒãƒˆã‚’追加"
msgid "AddContextCommits|Add/remove"
msgstr "追加/削除"
-msgid "AddMember|Emails cannot be blank"
-msgstr "メールを空白ã«ã§ãã¾ã›ã‚“"
-
msgid "AddMember|Invite email is invalid"
msgstr "招待メールãŒç„¡åŠ¹ã§ã™"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "1æ—¥ã‚ãŸã‚Šã®æ‹›å¾…制é™æ•° %{daily_invites} を超ãˆã¾ã—ãŸ"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "招待元ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "統計ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 "æ–°ã—ã„プロジェクトã§å…±æœ‰ Runner を有効ã«ã™ã‚‹"
+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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "アクティブユーザー"
@@ -3500,6 +3558,9 @@ msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクト"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,14 +3576,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-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 "グループオーナー㌠LDAP 関連ã®è¨­å®šã‚’管ç†ã§ãるよã†ã«ã™ã‚‹"
@@ -3563,9 +3630,6 @@ msgstr "サブグループãŒç‹¬è‡ªã®2è¦ç´ èªè¨¼ãƒ«ãƒ¼ãƒ«ã‚’設定ã§ãã‚‹ã‚
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr "ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹ã‚’リクエストã§ãるよã†ã«ã™ã‚‹(å
msgid "Allowed"
msgstr "許å¯"
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 "エピックã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr "ファイルã®ã‚¢ãƒƒãƒ—ロード中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "グループパスã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr "分æž"
-msgid "Analyze a review version of your web application."
-msgstr "Webアプリケーションã®ãƒ¬ãƒ“ューãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’分æžã—ã¾ã™ã€‚"
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "ä¾å­˜é–¢ä¿‚ã«å«ã¾ã‚Œã¦ã„る既知ã®è„†å¼±æ€§ã‚’分æžã—ã¾ã™ã€‚"
@@ -4128,6 +4186,9 @@ msgstr "別ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’æ—¢ã«å®Ÿè¡Œã—ã¦ã„ã¾ã™ã€‚"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "別ã®ã‚¤ã‚·ãƒ¥ãƒ¼ãƒˆãƒ©ãƒƒã‚«ãƒ¼ã‚’ã™ã§ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚一度ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã§ãるイシュートラッカーサービスã¯1ã¤ã ã‘ã§ã™"
+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 "スパム対策ã®æ¤œè¨¼"
@@ -4206,12 +4267,27 @@ msgstr "アプリケーションã¯æ­£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚"
msgid "Application: %{name}"
msgstr "アプリケーション:%{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr "æ案をé©ç”¨..."
msgid "Applying suggestions..."
msgstr "æ案をé©ç”¨..."
-msgid "Approval Status"
-msgstr "承èªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
-
msgid "Approval rules"
msgstr "承èªãƒ«ãƒ¼ãƒ«"
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ msgstr "8月"
msgid "Authenticate"
msgstr "èªè¨¼"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5122,6 +5183,9 @@ 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 "èªè¨¼å¤±æ•—: %{error_message}"
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "以下ã«å…¬é–‹ã•ã‚Œã¦ã„る全グループを表示ã—ã¾ã™ã€‚"
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr "概è¦"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "ä¿è­·ãƒ–ランãƒã¯ %{project_settings_link} ã‹ã‚‰è¨­å®šå¤‰æ›´ã§ãã¾ã™ã€‚"
-
msgid "Branches|Show active branches"
msgstr "アクティブブランãƒã‚’表示"
@@ -6148,9 +6224,6 @@ msgstr "アップストリームã‹ã‚‰åˆ†å²"
msgid "Branches|merged"
msgstr "マージ済ã¿"
-msgid "Branches|project settings"
-msgstr "プロジェクト設定"
-
msgid "Branches|protected"
msgstr "ä¿è­·"
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr "CI設定"
msgid "CI variables"
msgstr "CI 変数"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI ã¯ä¸Šè¨˜ã§å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸè³‡æ ¼æƒ…報を元ã«å®Ÿè¡Œã—ã¾ã™ã€‚"
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6397,6 +6470,9 @@ msgstr "CI/CD 設定"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr "キャンセル"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 "タイトルを \"%{title_param}\" ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚"
@@ -6905,6 +6996,9 @@ msgstr "変更ã¯æŠ‘制ã•ã‚Œã¾ã—ãŸã€‚クリックã—ã¦è¡¨ç¤º"
msgid "Changes the title to \"%{title_param}\"."
msgstr "タイトルを \"%{title_param}\" ã«å¤‰æ›´ã—ã¾ã™ã€‚"
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr "å†ãƒã‚§ãƒƒã‚¯"
msgid "Check feature availability on namespace plan"
msgstr "åå‰ç©ºé–“ã®è¨ˆç”»ã§æ©Ÿèƒ½ãŒåˆ©ç”¨ã§ãã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr "サブスクリプションã®è©³ç´°"
msgid "Checkout|Subtotal"
msgstr "å°è¨ˆ"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "税"
@@ -7258,6 +7358,9 @@ msgstr "å­ã‚¨ãƒ”ックã¯å­˜åœ¨ã—ã¾ã›ã‚“。"
msgid "Child epic doesn't exist."
msgstr "å­ã‚¨ãƒ”ックãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr "カラーをé¸æŠžã—ã¦ãã ã•ã„。"
msgid "Choose file…"
msgstr "ファイルをé¸æŠž..."
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr "クリア"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨ã€ã‚ãªãŸã¯ã‚¢ãƒ—リケーションを RBAC クラスター上ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ãã¾ã™ã€‚"
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr "ComboSearch ãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr "コマンド"
@@ -8973,9 +9077,6 @@ msgstr "関連ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
msgid "Committed by"
msgstr "コミット担当者: "
-msgid "Commit…"
-msgstr "コミット"
-
msgid "Community forum"
msgstr "コミュニティフォーラム"
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr "コンプライアンスレãƒãƒ¼ãƒˆ"
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr "接続ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Connection timed out"
msgstr "接続タイムアウト"
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr "コンテナレジストリã¯ã€ã“ã® GitLab インスタンスã§æœ‰å
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ msgstr "コンテナレジストリã§ã€å„プロジェクトã¯Dockerイメー
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 "コンテナレジストリを使用ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—ロジェクトã«Dockerイメージをä¿å­˜ã™ã‚‹ãŸã‚ã®ç‹¬è‡ªã®ã‚¹ãƒšãƒ¼ã‚¹ã‚’確ä¿ã§ãã¾ã™ã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトã®1ã¤ã«å°‘ãªãã¨ã‚‚1ã¤ã®Dockerイメージをプッシュã—ã¦ã€ã“ã“ã«è¡¨ç¤ºã—ã¾ã™ã€‚ %{docLinkStart}詳細情報%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "ã‚ãªãŸã¯ %{item} tag を削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr "続行"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "次ã®ã‚¹ãƒ†ãƒƒãƒ—ã«é€²ã¿ã¾ã™"
@@ -9939,9 +10034,6 @@ msgstr "クリップボードã«å¤–部 ID をコピー"
msgid "Copy ID"
msgstr "IDをコピー"
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr "KRB5用クローンURLをコピー"
@@ -9957,6 +10049,9 @@ msgstr "URL をコピー"
msgid "Copy branch name"
msgstr "ブランãƒåをコピー"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr "ã“ã®ãƒ—ロジェクトã®ä»–ã®ã‚¤ã‚·ãƒ¥ãƒ¼ã¾ãŸã¯ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨
msgid "Copy link"
msgstr "リンクをコピー"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "ãƒãƒ£ãƒ¼ãƒˆã¸ã®ãƒªãƒ³ã‚¯ã‚’コピー"
@@ -10305,6 +10403,9 @@ msgstr "ブランãƒä½œæˆ"
msgid "Create commit"
msgstr "コミットã®ä½œæˆ"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr "設定"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr "グループã®ä¸‹ã«ã‚ã‚‹ã¹ãã§ã™"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} 件é¸æŠžæ¸ˆã¿ (最大 %{maxLabels} 件)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "日付"
@@ -10992,6 +11102,9 @@ msgstr "ãƒãƒ£ãƒ¼ãƒˆãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®è¡¨ç¤º"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr "アーãƒãƒ•ã‚¡ã‚¯ãƒˆã‚’削除"
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr "ãƒãƒ£ãƒƒãƒˆãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã‚’削除ã—ã¾ã—ãŸï¼š %{chat_name}ï¼"
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr "差分ã®åˆ¶é™"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "開始日ã¨ç¾åœ¨ã®é•ã„"
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr "ディレクトリå"
msgid "Disable"
msgstr "無効"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ç„¡åŠ¹ã«ã™ã‚‹"
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã‚’無効ã«ã™ã‚‹"
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "アーティファクトã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
-msgid "Download as"
-msgstr "別åã§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
-
msgid "Download codes"
msgstr "コードをダウンロード"
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr "期é™"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "期間"
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr "イシューを編集"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr "Elasticsearch AWS IAMèªè¨¼æƒ…å ±"
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr "Elasticsearchã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä½œæˆã®åˆ¶é™"
@@ -13512,9 +13670,6 @@ msgstr "メールをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Email display name"
msgstr "メールã®è¡¨ç¤ºå"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "メールãŒç¢ºèªã§ãã¦ã„ã¾ã›ã‚“。 Salesforce ã§ãƒ¡ãƒ¼ãƒ«ã‚’確èªã—ã¦ãã ã•ã„。"
@@ -13524,6 +13679,9 @@ msgstr "ä¸æ˜Žãªã‚µã‚¤ãƒ³ã‚¤ãƒ³ã®ãƒ¡ãƒ¼ãƒ«é€šçŸ¥"
msgid "Email patch"
msgstr "パッãƒã‚’メールã™ã‚‹"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "メールé€ä¿¡å®Œäº†"
@@ -13620,15 +13778,15 @@ msgstr "空ã®ãƒ•ã‚¡ã‚¤ãƒ«"
msgid "Enable"
msgstr "有効化ã™ã‚‹"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Auto DevOps を有効ã«ã™ã‚‹"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr ""
@@ -13650,18 +13808,12 @@ msgstr "PlantUML を有効化"
msgid "Enable Pseudonymizer data collection"
msgstr "匿å化データã®åŽé›†ã‚’有効ã«ã—ã¾ã™"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "2è¦ç´ èªè¨¼ã‚’有効ã«ã™ã‚‹"
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr "ä¿è­·"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "エピック"
@@ -14254,9 +14396,6 @@ msgstr "エピック"
msgid "Epics Roadmap"
msgstr "エピック ロードマップ"
-msgid "Epics and Issues"
-msgstr "エピックã¨ã‚¤ã‚·ãƒ¥ãƒ¼"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "エピックを使用ã™ã‚‹ã¨ã€ãƒ—ロジェクトã®ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒªã‚ªã‚’より効率的ã‹ã¤å°‘ãªã„労力ã§ç®¡ç†ã§ãã¾ã™"
@@ -14359,6 +14498,9 @@ msgstr "期日"
msgid "Epics|start"
msgstr "開始"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "エラー"
@@ -14614,9 +14756,6 @@ msgstr "エラー"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "有効期é™åˆ‡ã‚Œ"
@@ -15246,6 +15388,9 @@ msgstr "インストールã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "機能フラグ"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr "ファイルフック"
msgid "File Hooks (%{count})"
msgstr "ファイルフック (%{count})"
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "ファイルã®è¿½åŠ "
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "ファイルテンプレート"
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr "完了"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr "詳ã—ã„情報ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ•ãƒƒã‚¯ã®æ–‡æ›¸ã‚’ã”覧ãã ã•ã„"
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "パスワードを忘れã¾ã—ãŸã‹ï¼Ÿ"
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 "既存ã®ãƒ—ロジェクトã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr "åŒæœŸ"
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr "åŒæœŸã®ãƒšãƒ³ãƒ‡ã‚£ãƒ³ã‚°"
msgid "Geo|Pending verification"
msgstr "確èªã‚’ä¿ç•™ä¸­"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr "特定ストレージシャード内ã®ãƒ—ロジェクト"
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "å†ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "å†åŒæœŸ"
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 "プロジェクト(%{project_id})ã®ãƒˆãƒ©ãƒƒã‚­ãƒ³ã‚°ã‚¨ãƒ³ãƒˆãƒªãŒæ­£å¸¸ã«å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "åŒæœŸã«å¤±æ•—ã—ã¾ã—㟠- %{error}"
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "スケジューラ待ã¡"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ msgstr "Gitea ホスト㮠URL"
msgid "Gitea Import"
msgstr "Gitea インãƒãƒ¼ãƒˆ"
+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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr "æ–°ã—ã„ランナー登録トークンを生æˆã—ã¾ã—ãŸï¼"
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "ã“ã®è¨­å®šã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ã‚µãƒ–グループã€ãŠã‚ˆã³ãƒ—ロジェクトã®ã™ã¹ã¦ã®ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼é€šçŸ¥è¨­å®šã‚’上書ãã—ã¾ã™ã€‚"
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr "よã使ã†ã‚°ãƒ«ãƒ¼ãƒ—"
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr "よã†ã“ã%{username}!"
@@ -18476,12 +18764,6 @@ msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã¯æ­£å¸¸ã«èµ·å‹•ã—ã¾ã—ãŸã€‚"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "IPサブãƒãƒƒãƒˆåˆ¶é™ã¯æœ€ä¸Šä½ã‚°ãƒ«ãƒ¼ãƒ—ã«ã®ã¿è¨±å¯ã•ã‚Œã¾ã™"
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "識別å­"
@@ -18653,13 +18938,10 @@ msgstr "ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã‚°ãƒ«ãƒ¼ãƒ—オーナー㯠LDAP グループリ
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "ãƒã‚§ãƒƒã‚¯ã—ãŸå ´åˆã€æ–°ã—ã„グループメンãƒãƒ¼ã‚·ãƒƒãƒ—ã¨ãƒ‘ーミッションを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."
-msgstr "無効ã«ã™ã‚‹ã¨ã€åˆ†å²ã—ãŸãƒ­ãƒ¼ã‚«ãƒ«ãƒ–ランãƒã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ‡ãƒ¼ã‚¿æ失を防ããŸã‚ã«ã€ãƒªãƒ¢ãƒ¼ãƒˆã®å¯¾å¿œã™ã‚‹ãƒ–ランãƒã‹ã‚‰ã®ã‚³ãƒŸãƒƒãƒˆã§è‡ªå‹•çš„ã«æ›´æ–°ã•ã‚Œã¾ã›ã‚“。デフォルトã®ãƒ–ランム(%{default_branch}) ãŒåˆ†å²ã—ã¦æ›´æ–°ã§ããªã„å ´åˆã€ãƒŸãƒ©ãƒ¼ãƒªãƒ³ã‚°ã¯å¤±æ•—ã—ã¾ã™ã€‚ä»–ã®åˆ†ã‹ã‚ŒãŸãƒ–ランãƒã¯ãã®ã¾ã¾ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr "http ã¾ãŸã¯ https ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr "内部URL(オプション)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr "内部ユーザー"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "é–“éš”ã®ãƒ‘ターン"
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr "無効ãªãƒ•ã‚¡ã‚¤ãƒ«ã§ã™ã€‚"
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr "グループã«æ‹›å¾…"
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr "メンãƒãƒ¼ã‚’招待"
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "500年以上先ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger URL"
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "離れる"
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ"
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr "プロジェクトã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒãƒªã‚·ãƒ¼ã«æº–æ‹ ã—ã¦ã„ãªã„〠検出ã•ã‚ŒãŸãƒ©ã‚¤ã‚»ãƒ³ã‚¹"
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr "プロジェクトã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹è©³ç´°ã‚’表示"
msgid "Limit display of time tracking units to hours."
msgstr "タイムトラッキングã®å˜ä½è¡¨ç¤ºã‚’1時間å˜ä½ã«åˆ¶é™ã™ã‚‹ã€‚"
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr "%{fileLockUserName} ã«ã‚ˆã£ã¦ ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "Locked the discussion."
msgstr "ロックã—ãŸè­°è«–"
-msgid "Locked to current projects"
-msgstr "ç¾åœ¨ã®ãƒ—ロジェクトã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "ロックã¯ã€ç‰¹å®šã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„フォルダをロックã™ã‚‹æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚"
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr "å¼±ã„脆弱性ã®å­˜åœ¨"
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr "パーソナルアクセストークンã®æœ€é•·è¨±å®¹å¯¿å‘½(日数)"
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr "マージリクエスト"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "マージリクエスト %{mr_link} 㯠%{mr_author}ã«ã‚ˆã£ã¦ãƒ¬ãƒ“ューã•ã‚Œã¾ã—ãŸ"
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 "メトリクス"
@@ -24159,12 +24477,12 @@ 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 "Minimum interval in days"
-msgstr ""
-
msgid "Minutes"
msgstr "分"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr "複数ã®ã‚¢ãƒƒãƒ—ローダーãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: %{uploader_types
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "変更をä¿å­˜"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr "マイルストーンãªã—"
msgid "No Scopes"
msgstr "スコープãªã—"
-msgid "No Tag"
-msgstr "ã‚¿ã‚°ãªã—"
-
msgid "No active admin user found"
msgstr "アクティブãªç®¡ç†ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
@@ -25256,9 +25421,6 @@ msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—ã¯ãƒ—レビューã—ã¾ã›ã‚“"
msgid "No prioritized labels with such name or description"
msgstr "ãã®åå‰ã¾ãŸã¯ãã®èª¬æ˜Žã‚’ã‚‚ã£ãŸã€å„ªå…ˆãƒ©ãƒ™ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“"
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "メモ"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr "何も見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸâ€¦"
-
msgid "Nothing to preview."
msgstr "プレビューã§ãã‚‹ã‚‚ã®ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。"
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "11月"
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr "オブジェクトストレージã®ãƒ¬ãƒ—リケーション"
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "オブジェクトãŒã‚µãƒ¼ãƒãƒ¼ã«å­˜åœ¨ã—ã¾ã›ã‚“ã€ã¾ãŸã¯ã€ãã‚Œã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,24 +26086,39 @@ 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 on-demand DAST scan"
msgstr "オンデマンドDASTスキャンを編集"
+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 "例:ログインページã§SQLインジェクションã®ãƒ†ã‚¹ãƒˆã‚’ã—ã¾ã™"
-msgid "OnDemandScans|Manage DAST scans"
-msgstr ""
-
msgid "OnDemandScans|Manage scanner profiles"
msgstr ""
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "æ–°è¦ã‚ªãƒ³ãƒ‡ãƒžãƒ³ãƒ‰DASTスキャン"
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 "インãƒãƒ¼ãƒˆã™ã‚‹ã¨ã€ãƒªãƒã‚¸ãƒˆãƒªã¯SSHã«ã‚ˆã‚ŠãƒŸãƒ©ãƒ¼ãƒªãƒ³ã‚°ã§ãã¾ã™ã€‚詳細㯠%{link_start}ã“ã¡ã‚‰%{link_end} ã‚’ã”覧ãã ã•ã„。"
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr "パッケージãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®å‰Šé™¤"
msgid "PackageRegistry|Delete package"
msgstr "パッケージã®å‰Šé™¤"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr "pip コマンド"
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,15 +27045,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "マージリクエストã§ã®å¤‰æ›´ç®‡æ‰€"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "å‚加者"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr ""
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr "åœæ­¢"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr "パイプライン %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "%{dataTitle} ã®ãƒ‘イプライン %{label}"
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr "続行ã™ã‚‹ã«ã¯ %{phrase_code} を入力ã—ã¦ãã ã•ã„。キャãƒ
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "イシューやコメントã¸ã®ã‚¹ãƒ‘ム行為ã€ã¾ãŸä¸é©åˆ‡ãªæŒ™å‹•ã‚’ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¤ã„ã¦ã¯ã€ã“ã¡ã‚‰ã®ãƒ•ã‚©ãƒ¼ãƒ ã‹ã‚‰ç®¡ç†è€…ã«å ±å‘Šã—ã¦ãã ã•ã„。"
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "少々ãŠå¾…ã¡ãã ã•ã„。準備ãŒæ•´ã„次第ã“ã®ãƒšãƒ¼ã‚¸ã¯è‡ªå‹•çš„ã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr "日付ã¨æ™‚刻ã®è¡¨ç¤ºæ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
@@ -28074,6 +28329,12 @@ msgstr "サードパーティã®ã‚µãƒ¼ãƒ“スã¨ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 "時間を24時間形å¼ã§è¡¨ç¤ºã™ã‚‹"
@@ -28110,6 +28371,9 @@ msgstr " %{min} ã‹ã‚‰ %{max} ã¾ã§ã®æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
msgid "Preferences|Navigation theme"
msgstr "ナビゲーションテーマ"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "プロジェクト概è¦ã®å†…容"
@@ -28209,9 +28473,6 @@ msgstr "差分ã®ã‚ã‚‹å‰ã®ãƒ•ã‚¡ã‚¤ãƒ«"
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "プライマリ"
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸ
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã¯æœ‰åŠ¹"
-
msgid "Project export has been deleted."
msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’削除ã—ã¾ã—ãŸã€‚"
@@ -29460,8 +29718,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-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 ""
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr "最近ã®æ¤œç´¢ã‚µãƒ¼ãƒ“スã¯åˆ©ç”¨ã§ãã¾ã›ã‚“"
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "最近ã®æ¤œç´¢"
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "2è¦ç´ èªè¨¼ã‚¢ãƒ—リã§ç™»éŒ²"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã„ãŸã€‚"
msgid "Reopens this %{quick_action_target}."
msgstr "ã“ã® %{quick_action_target} ã‚’å†ã³é–‹ã。"
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "ç½®ãæ›ãˆ"
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "リãƒã‚¸ãƒˆãƒª URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "ä¸æ­£åˆ©ç”¨ã‚’報告"
@@ -31312,6 +31555,9 @@ msgstr "失敗"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr "アクセス権é™ã‚’リクエストã™ã‚‹"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr "リクエストã•ã‚ŒãŸçŠ¶æ…‹ã¯ç„¡åŠ¹ã§ã™"
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr "å†è©¦è¡Œ"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr "ロードマップ"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "役割"
@@ -31982,10 +32222,10 @@ msgstr "Webターミナルを使用ã—ã¦ãƒ†ã‚¹ãƒˆã‚’実行"
msgid "Run untagged jobs"
msgstr "ã‚¿ã‚°ã®ãªã„ジョブã®å®Ÿè¡Œ"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr "Runner"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "ç¾åœ¨ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã®Runner: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Runner ã®ãƒšãƒ¼ã‚¸ã€‚"
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr "ブランãƒã®é¸æŠž"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr "グループã¾ãŸã¯ãƒ—ロジェクトをé¸æŠž"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr "プロジェクトã®é¸æŠž"
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "ウェイトを設定"
msgid "Set weight to %{weight}."
msgstr "ウェイトを %{weight} ã«è¨­å®š"
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "共有"
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 "サブグループ情報"
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr "åŒæœŸæ¸ˆã¿"
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr "リリースノート"
msgid "TagsPage|Repository has no tags yet."
msgstr "リãƒã‚¸ãƒˆãƒªã«ã¯ã¾ã ã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。"
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "タグ一覧"
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "テスト"
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr "コミットãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr "プロジェクトã¯æ­£å¸¸ã«ãƒ•ã‚©ãƒ¼ã‚¯ã•ã‚Œã¾ã—ãŸã€‚"
msgid "The project was successfully imported."
msgstr "プロジェクトを正常ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ãã¾ã—ãŸã€‚"
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 "確èªãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr "ユーザーã®ãƒ‘イプライン時間ã®ãƒªã‚»ãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒ
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "ã‚ãªãŸã®å¤‰æ›´ã®ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "クエリを検証ã™ã‚‹é–“ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,8 +38482,8 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
-msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã€æœŸé™åˆ‡ã‚Œ/消去済ã¿ã®ã‚¢ãƒ¼ãƒ†ã‚£ãƒ•ã‚¡ã‚¯ãƒˆã‚’æŒã¤ä»–ã®ã‚¸ãƒ§ãƒ–ã«ä¾å­˜ã—ã¦ã„ã¾ã™ï¼š%{invalid_dependencies}"
+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 "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã€å‰å·¥ç¨‹ã®ã‚¸ãƒ§ãƒ–ãŒæ­£å¸¸çµ‚了ã™ã‚‹ã“ã¨ã§å®Ÿè¡Œã•ã‚Œã¾ã™"
@@ -38386,9 +38629,6 @@ msgstr "ã“ã®åå‰ç©ºé–“ã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚別ã®åå‰ã«ã—
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr "ã“ã®ã‚ªãƒ—ション㯠GitLab.com ã§ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "複数ã®ãƒ—ロジェクト間ã§èª­ã¿è¾¼ã¿ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。"
@@ -38542,9 +38782,6 @@ msgstr "ã“ã®æ“作ã¯ã€ã“ã®ãƒ—ロジェクトã¨ãƒ•ã‚©ãƒ¼ã‚¯ãƒãƒƒãƒˆãƒ¯ãƒ¼
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr "最åˆã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰æœ€åˆã®ã‚³ãƒ¡ãƒ³ãƒˆã¾ã§ã®æ™‚é–“"
msgid "Time from last commit to merge"
msgstr "ç›´å‰ã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰ãƒžãƒ¼ã‚¸ã¾ã§ã®æ™‚é–“"
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr "ãŸã£ãŸä»Š"
msgid "Timeago|right now"
msgstr "今"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr "ã“ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€æ–°ã—ã„DNSレコードを作æˆã—ã¦ãã ã•ã„"
+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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr "開始ã™ã‚‹ã«ã¯ã€Gitea Host ã® URL 㨠%{link_to_personal_token} ã‚
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 "å†è©¦è¡Œ"
@@ -39588,9 +39831,6 @@ msgstr "デãƒã‚¤ã‚¹ã¨é€šä¿¡ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚(ã¾ã æº–å‚™ã§ãã
msgid "Tuesday"
msgstr "ç«æ›œæ—¥"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr "タイプ"
-msgid "Type/State"
-msgstr "タイプ/状態"
-
msgid "U2F Devices (%{length})"
msgstr "2è¦ç´ èªè¨¼ãƒ‡ãƒã‚¤ã‚¹ (%{length})"
@@ -39750,6 +39987,9 @@ 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 "æ–°ã—ã„インスタンスIDを生æˆã§ãã¾ã›ã‚“"
@@ -40029,9 +40269,6 @@ msgstr "更新失敗"
msgid "Update it"
msgstr "æ›´æ–°!"
-msgid "Update iteration"
-msgstr "イテレーションã®æ›´æ–°"
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr "%{updated_by} ã«ã‚ˆã£ã¦%{updated_at} ã«æ›´æ–°"
msgid "Updated date"
msgstr "更新日時"
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "更新中"
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr "ç¾åœ¨ã®ä½¿ç”¨çŠ¶æ³"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "スニペット"
@@ -40296,6 +40539,12 @@ 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 "%{strong_start}%{group_name}%{strong_end} グループã®ãƒ—ロジェクト全体ã§ã®ã‚°ãƒ«ãƒ¼ãƒ—リソースã®ä½¿ç”¨çŽ‡"
@@ -40308,9 +40557,6 @@ msgstr "ã‚ãªãŸã®ãƒ—ロジェクトã§ã®ãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨çŠ¶æ³"
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr "ãƒãƒƒã‚·ãƒ¥ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚’使ã†"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr "å„種メール設定。"
msgid "Various settings that affect GitLab performance."
msgstr "GitLab ã®ãƒ‘フォーマンスã«å½±éŸ¿ã™ã‚‹å„種設定。"
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "検証ステータス"
@@ -41595,7 +41838,7 @@ msgstr "識別å­"
msgid "Vulnerability|Image"
msgstr "イメージ"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr "エピックを削除ã™ã‚‹ãƒ‘スを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr "プロジェクト監査イベントã¨ã¯ä½•ã§ã™ã‹?"
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "マージリクエストãŒæ‰¿èªã•ã‚ŒãŸã¨ã"
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr "作業中(オープンã‹ã¤æœªå‰²ã‚Šå½“ã¦ï¼‰"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr "読ã¿å–り専用 GitLab インスタンスをå‚照中ã§ã™ã€‚"
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "ã‚ãªãŸã¯ %{url} ã®GitLab管ç†è€…ã§ã‚ã‚‹ãŸã‚ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã£ã¦ã„ã¾ã™ã€‚"
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ msgstr "%{linkStart} CI Lint %{linkEnd} ã§.gitlab-ci.ymlをテストã™ã‚‹ã“ã
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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr "アーカイブ済ã¿"
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 "自動的ã«æ–°ã—ã„ブランãƒã«ã“ã®ãƒ‘ッãƒã‚’é©ç”¨ã™ã‚‹"
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "マージリクエスト"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 "1マージコミット"
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "ブランãƒã®ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "メールパッãƒ"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "デプロイ統計ã®ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDE ã§é–‹ã"
-msgid "mrWidget|Plain diff"
-msgstr "テキスト差分"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr "無期é™"
msgid "new merge request"
msgstr "æ–°è¦ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr "有効期é™ãªã—"
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr "ãªã—"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
@@ -44928,9 +45199,6 @@ msgstr "ä¿ç•™ä¸­ã®ã‚³ãƒ¡ãƒ³ãƒˆ 件"
msgid "pending deletion"
msgstr "削除ã®ä¿ç•™ä¸­"
-msgid "per day"
-msgstr "1æ—¥ã‚ãŸã‚Š"
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] "返信"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po
index e101b93165e..73078cb4f73 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/kab/gitlab.po b/locale/kab/gitlab.po
index 62e0056043c..59822303dc5 100644
--- a/locale/kab/gitlab.po
+++ b/locale/kab/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: kab\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:17\n"
+"PO-Revision-Date: 2022-05-01 06:58\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 6e6d1128e66..4556d7e171d 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr " %{start}부터 %{end}까지"
@@ -65,10 +65,10 @@ msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit
msgstr ""
msgid "#%{issueIid} (closed)"
-msgstr ""
+msgstr "#%{issueIid} (닫힘)"
msgid "#general, #development"
-msgstr ""
+msgstr "#ì¼ë°˜, #개발"
msgid "%d Alert"
msgid_plural "%d Alerts"
@@ -84,7 +84,7 @@ msgstr[0] "%dê±´ì˜ ìŠ¹ì¸"
msgid "%d Module"
msgid_plural "%d Modules"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ëª¨ë“ˆ"
msgid "%d Other"
msgid_plural "%d Others"
@@ -92,7 +92,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"
@@ -104,15 +104,15 @@ msgstr[0] "%dê°œì˜ URL 검사ë¨"
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"
@@ -128,7 +128,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"
@@ -226,13 +226,9 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] "%dê°œì˜ ê·¸ë£¹"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "그룹 %dê°œ ì„ íƒë¨"
-
msgid "%d hour"
msgid_plural "%d hours"
-msgstr[0] ""
+msgstr[0] "%d시간"
msgid "%d inaccessible merge request"
msgid_plural "%d inaccessible merge requests"
@@ -284,7 +280,7 @@ msgstr[0] "%d 댓글 ë” ë³´ê¸°"
msgid "%d new license"
msgid_plural "%d new licenses"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ìƒˆë¡œìš´ ë¼ì´ì„ ìŠ¤"
msgid "%d open issue"
msgid_plural "%d open issues"
@@ -300,7 +296,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"
@@ -316,16 +312,12 @@ msgstr[0] "%dê°œì˜ í”„ë¡œì íŠ¸ê°€ ì„ íƒë¨"
msgid "%d removed license"
msgid_plural "%d removed licenses"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ì‚­ì œëœ ë¼ì´ì„ ìŠ¤"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d ì´ˆ"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%dê°œì˜ ì¡°ê°ì´ ì„ íƒë¨"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%dê°œì˜ ìŠ¤íƒ€"
@@ -344,7 +336,7 @@ 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"
@@ -360,11 +352,11 @@ 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"
@@ -372,7 +364,7 @@ msgstr[0] ""
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:"
@@ -386,19 +378,19 @@ 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 "%{author_link}(ì´)ê°€ 작성:"
@@ -430,8 +422,8 @@ msgstr ""
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 tags."
-msgstr "%{code_open}보호ëœ%{code_close} 정보는 ë³´í˜¸ëœ ë¸Œë Œì¹˜ë‚˜ 태그ì—만 보입니다."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_authored_timeago} ì— %{commit_author_link} ë‹˜ì´ ì»¤ë°‹í–ˆìŠµë‹ˆë‹¤."
@@ -473,7 +465,7 @@ msgstr "%{name}께서 %{count} ê±´ì˜ ìŠ¹ì¸"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
+msgstr[0] "%{count}ê°œì˜ ì—°ë½ì²˜"
msgid "%{count} files touched"
msgstr "%{count} 파ì¼ì´ 변경ë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -530,10 +522,10 @@ msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last
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 "%{ref_elem}ì´(ê°€) 기본 브랜치가 아니기 ë•Œë¬¸ì— %{doc_link_start}고급 검색%{doc_link_end}ì´ ë¹„í™œì„±í™”ë˜ì—ˆìŠµë‹ˆë‹¤. %{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 ""
@@ -565,6 +557,9 @@ msgstr "%{edit_in_new_fork_notice} 파ì¼ì„ 다시 업로드하십시오."
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -626,7 +621,7 @@ msgid "%{issuesSize} with a limit of %{maxIssueCount}"
msgstr ""
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 ""
@@ -694,9 +689,6 @@ msgstr "%{group_level_name} 그룹ì—는 %{level_name} ì´ í—ˆìš©ë˜ì§€ 않습ë‹
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "Forkí•œ ì›ë³¸ 프로ì íŠ¸ê°€ ë” ë‚®ì€ ê³µê°œ 수준으로 설정ë˜ì–´ 있으므로 %{level_name} ìˆ˜ì¤€ì´ í—ˆìš©ë˜ì§€ 않습니다."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+%d개"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers}ëª…ì˜ ì¶”ê°€ 승ì¸ìž"
-
msgid "+%{extra} more"
msgstr ""
@@ -1199,7 +1182,7 @@ msgid "+%{tags} more"
msgstr "+%{tags}개"
msgid ", "
-msgstr ""
+msgstr ", "
msgid ", or "
msgstr ", ë˜ëŠ” "
@@ -1239,6 +1222,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr "1 ê°œ ì´ìƒ 참여"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10 ê°œ ì´ìƒ 참여"
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "첫번째 기여!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 회 참여"
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "Let's Encrypt SSL ì¸ì¦ì„œëŠ” ë„ë©”ì¸ì´ ì¸ì¦ë˜ê¸° ì „ì—는 사용할 수 없습니다."
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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를 사용합니다"
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "사ì´ë²„ í­ë ¥ ë°©ì§€íŒ€ì´ ìµœëŒ€í•œ 빨리 ê·€í•˜ì˜ ë¦¬í¬íŠ¸ë¥¼ 검토할 것 입니다."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1953,7 +1933,7 @@ msgid "Add a %{type}"
msgstr ""
msgid "Add a GCP region"
-msgstr ""
+msgstr "GCP 리전 추가"
msgid "Add a GPG key"
msgstr "GPG 키 추가"
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr "ë§í¬ 추가"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr "ì´ìŠˆ 추가"
@@ -2048,6 +2025,9 @@ msgstr "ìŠ¹ì¸ ê·œì¹™ 추가"
msgid "Add approvers"
msgstr "승ì¸ìž 추가"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "êµµì€ ë¬¸ìžì—´ 추가"
@@ -2196,7 +2176,7 @@ msgid "Add webhook"
msgstr "웹훅 추가"
msgid "Add your team members and others to GitLab."
-msgstr ""
+msgstr "팀ì›ê³¼ 다른 ì‚¬ëžŒë“¤ì„ GitLabì— ì¶”ê°€í•˜ì„¸ìš”."
msgid "Add/remove"
msgstr "추가/제거"
@@ -2207,15 +2187,15 @@ msgstr "ì´ì „ì— ë¨¸ì§€ëœ ì»¤ë°‹ 추가"
msgid "AddContextCommits|Add/remove"
msgstr "추가/제거"
-msgid "AddMember|Emails cannot be blank"
-msgstr ""
-
msgid "AddMember|Invite email is invalid"
msgstr "초대 ì´ë©”ì¼ì´ 유효하지 않습니다"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "ì¼ì¼ 초대 í•œë„ %{daily_invites} 초과"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "초대 소스가 제공ë˜ì§€ 않았습니다."
@@ -2379,7 +2359,7 @@ msgid "AdminArea|Included Free in license"
msgstr ""
msgid "AdminArea|Instance OAuth applications"
-msgstr ""
+msgstr "ì¸ìŠ¤í„´ìŠ¤ OAuth 어플리케ì´ì…˜"
msgid "AdminArea|Latest groups"
msgstr "최근 그룹"
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Let's Encrypt 설정"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "피드 í† í° ë¹„í™œì„±í™”"
@@ -2522,12 +2499,39 @@ 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 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 "피드 토í°"
@@ -2537,12 +2541,24 @@ 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 "그룹 ë˜ëŠ” ì¸ìŠ¤í„´ìŠ¤ 수준ì—ì„œ 지정ë˜ì§€ ì•Šì€ ê²½ìš° ê¸°ë³¸ê°’ì€ %{default_initial_branch_name}입니다. 기존 ì €ìž¥ì†Œì— ì˜í–¥ì„ 주지 않습니다."
+msgid "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
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 ""
+
+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 ""
@@ -2573,18 +2589,39 @@ msgstr "프로ì íŠ¸ ë° ê·¸ë£¹ì˜ ìƒˆ CI/CD 변수는 기본ì ìœ¼ë¡œ 보호ë¨
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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -2814,7 +2872,7 @@ 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 ""
+msgstr "ì´ í”„ë¡œì„¸ìŠ¤ì— ëŒ€í•´ ì§ˆë¬¸ì´ ìžˆëŠ” 경우 %{doc_link} ë˜ëŠ” %{support_link}ì— ë¬¸ì˜í•´ì£¼ì„¸ìš”."
msgid "AdminUsers|Important information about usage on your GitLab instance"
msgstr ""
@@ -3015,7 +3073,7 @@ msgid "AdminUsers|approve them"
msgstr ""
msgid "AdminUsers|contact our support team"
-msgstr ""
+msgstr "지ì›íŒ€ì— 문ì˜"
msgid "AdminUsers|docs"
msgstr ""
@@ -3057,7 +3115,7 @@ msgid "Advanced"
msgstr "고급"
msgid "Advanced Search"
-msgstr ""
+msgstr "고급 검색"
msgid "Advanced Settings"
msgstr "고급 설정"
@@ -3500,6 +3558,9 @@ msgstr "모든 프로ì íŠ¸"
msgid "All projects selected"
msgstr "모든 프로ì íŠ¸ê°€ ì„ íƒë¨"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "모든 스레드가 í•´ê²°ë¨"
@@ -3515,14 +3576,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-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 "그룹 소유ìžê°€ LDAP 관련 ì„¤ì •ì„ ê´€ë¦¬í•˜ë„ë¡ í—ˆìš©"
@@ -3563,9 +3630,6 @@ msgstr "하위 ê·¸ë£¹ì´ ìžì²´ 2단계 ì¸ì¦ ê·œì¹™ì„ ì„¤ì •í•˜ë„ë¡ í—ˆìš©í
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr "í—ˆìš©ëœ Geo IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 "ì—í”½ì„ ì‚­ì œí•˜ëŠ” ë„중 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr "파ì¼ì„ 업로드하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주세요."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "ì´ë¯¸ì§€ë¥¼ 업로드하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주세요."
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr "ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "Analytics"
msgstr "분ì„"
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 "안티 스팸 ê²€ì¦"
@@ -4206,12 +4267,27 @@ msgstr "어플리케ì´ì…˜ì´ 성공ì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Application: %{name}"
msgstr "애플리케ì´ì…˜: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr "제안 ì ìš© 중..."
msgid "Applying suggestions..."
msgstr "제안 ì ìš© 중..."
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr "ìŠ¹ì¸ ê·œì¹™"
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ msgstr "8ì›”"
msgid "Authenticate"
msgstr "ì¸ì¦"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5122,6 +5183,9 @@ 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 "ì¸ì¦ 실패: %{error_message}"
@@ -5308,7 +5372,7 @@ msgstr "사용 가능한 ID"
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "공개 ëœ ëª¨ë“  ê·¸ë£¹ì„ ì•„ëž˜ì—ì„œ ì°¾ì„ ìˆ˜ 있습니다."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr "개요"
msgid "Branches|Please type the following to confirm:"
msgstr "다ìŒì— 있는 ë‚´ìš©ì„ ìž…ë ¥í•˜ì—¬ 확ì¸í•˜ì„¸ìš”."
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "ë³´í˜¸ëœ ë¸Œëžœì¹˜ëŠ” %{project_settings_link} ì—ì„œ 관리할 수 있습니다."
-
msgid "Branches|Show active branches"
msgstr "í™œì„±ëœ ë¸Œëžœì¹˜ 보기"
@@ -6148,9 +6224,6 @@ msgstr "업스트림ì—ì„œ 분기ë¨"
msgid "Branches|merged"
msgstr "머지ë¨"
-msgid "Branches|project settings"
-msgstr "프로ì íŠ¸ 설정"
-
msgid "Branches|protected"
msgstr "보호ë¨"
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr "CI 설정"
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr "ìœ„ì˜ ìžê²© ì¦ëª…ì„ ì‚¬ìš©í•˜ì—¬ CIê°€ 실행ë©ë‹ˆë‹¤."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6397,6 +6470,9 @@ msgstr "CI/CD 구성"
msgid "CI/CD configuration file"
msgstr "CI/CD 설정 파ì¼"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr "취소"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr "ì—…ë°ì´íŠ¸ê°€ 반려ë˜ì—ˆìŠµë‹ˆë‹¤. í´ë¦­í•˜ì—¬ 확ì¸í•©ë‹ˆë‹¤."
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr "다시 확ì¸"
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr "하위 ì—í”½ì´ ì¡´ìž¬í•˜ì§€ 않습니다."
msgid "Child epic doesn't exist."
msgstr "하위 ì—í”½ì´ ì¡´ìž¬í•˜ì§€ 않습니다."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr "아무 색ìƒì„ ì„ íƒí•´ 주세요."
msgid "Choose file…"
msgstr "íŒŒì¼ ì„ íƒâ€¦"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr "지우기"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7586,7 +7690,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 "ì‚­ì œ 대기 ì¤‘ì¸ í”„ë¡œì íŠ¸ì— ì´ìŠˆë¥¼ 복제할 수 없습니다."
msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr "ê´€ë ¨ëœ ë¨¸ì§€ 리퀘스트(MR)ê°€ 없습니다."
msgid "Committed by"
msgstr "커밋한 사용ìž"
-msgid "Commit…"
-msgstr "커밋..."
-
msgid "Community forum"
msgstr "커뮤니티 í¬ëŸ¼"
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9202,7 +9300,7 @@ msgid "Configuration help"
msgstr ""
msgid "Configure %{italic_start}What's new%{italic_end} drawer and content."
-msgstr ""
+msgstr "%{italic_start}새로운 기능%{italic_end} 메뉴 내용 구성"
msgid "Configure %{link} to track events. %{link_start}Learn more.%{link_end}"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr "연결 실패"
msgid "Connection timed out"
msgstr "ì—°ê²° ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤."
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr "계ì†"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "ë‹¤ìŒ ë‹¨ê³„ë¡œ 진행"
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr "ID 복사"
-msgid "Copy IP Address"
-msgstr "IP 주소 복사"
-
msgid "Copy KRB5 clone URL"
msgstr "KRB5 í´ë¡  URL 복사"
@@ -9957,6 +10049,9 @@ msgstr "URL 복사"
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr "ë§í¬ 복사"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr "브랜치 ìƒì„±"
msgid "Create commit"
msgstr "커밋 ìƒì„±"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr "환경설정"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -11905,7 +12030,7 @@ msgid "Deleting the project will delete its repository and all related resources
msgstr ""
msgid "Deletion pending. This project will be deleted on %{date}. Repository and other project resources are read-only."
-msgstr ""
+msgstr "ì‚­ì œ 대기 중. ì´ í”„ë¡œì íŠ¸ëŠ” %{date}ì— ì‚­ì œë©ë‹ˆë‹¤. 저장소와 다른 프로ì íŠ¸ 리소스는 ì½ê¸° 전용입니다."
msgid "Denied"
msgstr ""
@@ -11992,7 +12117,7 @@ msgid "Dependencies|Toggle vulnerability list"
msgstr ""
msgid "Dependencies|Unsupported file(s) detected"
-msgstr ""
+msgstr "지ì›ë˜ì§€ 않는 파ì¼(들)ì´ ê°ì§€ë¨"
msgid "Dependencies|Vulnerable components"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diff 제한"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,14 +13069,11 @@ msgstr "디렉토리 ì´ë¦„"
msgid "Disable"
msgstr "사용 안 함"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
msgid "Disable What's new"
-msgstr ""
+msgstr "새로운 기능 메뉴 비활성화"
msgid "Disable for this project"
msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용 중지"
@@ -12929,6 +13081,9 @@ msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용 중지"
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr "코드 다운로드"
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr "마ê°ì¼"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr "ì´ìŠˆ 편집"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr "패치를 ì´ë©”ì¼ë¡œ 보냄"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,15 +13778,15 @@ msgstr "빈 파ì¼"
msgid "Enable"
msgstr "사용"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "ìžë™ DevOps 활성화"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr ""
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr "Pseudonymizer ë°ì´í„° 수집 사용"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13669,10 +13821,10 @@ msgid "Enable Spam Check via external API endpoint"
msgstr ""
msgid "Enable What's new: All tiers"
-msgstr ""
+msgstr "새로운 기능 메뉴 활성화: 모든 티어"
msgid "Enable What's new: Current tier only"
-msgstr ""
+msgstr "새로운 기능 메뉴 활성화: 현재 티어 전용"
msgid "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."
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "2단계 ì¸ì¦ 활성화"
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] "환경"
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr "보호ë¨"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "ì—픽"
@@ -14254,9 +14396,6 @@ msgstr "ì—픽"
msgid "Epics Roadmap"
msgstr "ì—픽 로드맵"
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr "시작"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "ì—러"
@@ -14614,9 +14756,6 @@ msgstr "오류"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "만료ë¨"
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "기능 플래그"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "íŒŒì¼ ì¶”ê°€ë¨"
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "íŒŒì¼ í…œí”Œë¦¿"
@@ -15764,10 +15912,10 @@ msgid "Filter by milestone"
msgstr ""
msgid "Filter by milestone name"
-msgstr ""
+msgstr "마ì¼ìŠ¤í†¤ ì´ë¦„으로 í•„í„°ë§"
msgid "Filter by name"
-msgstr ""
+msgstr "ì´ë¦„으로 í•„í„°ë§"
msgid "Filter by test cases that are currently archived."
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr "완료"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr "Geo 사ì´íŠ¸"
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "사ì´íŠ¸ 추가"
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ msgstr ""
msgid "Geo|Consult Geo troubleshooting information"
msgstr "Geo 문제 í•´ê²° 문서 확ì¸í•˜ê¸°"
+msgid "Geo|Container repositories synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Could not remove tracking entry for an existing project."
msgstr ""
@@ -16285,36 +16462,60 @@ 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 ""
+msgstr "ì´ë¦„으로 í•„í„°ë§"
msgid "Geo|Filter by status"
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 "Geo 사ì´íŠ¸"
msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
-msgid "Geo|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "다시 다운로드"
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr "%{timeAgo} ì „ ì—…ë°ì´íŠ¸ ë¨"
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "í™•ì¸ ì‹¤íŒ¨- %{error}"
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "스케줄러 대기 중"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ msgstr "Gitea 호스트 URL"
msgid "Gitea Import"
msgstr "Gitea 가져오기"
+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 ""
@@ -16973,55 +17267,55 @@ msgid "Global notification settings"
msgstr ""
msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow keys to navigate search results list."
-msgstr ""
+msgstr "%{count}ê°œì˜ ê¸°ë³¸ 결과가 제공ë˜ì—ˆìŠµë‹ˆë‹¤. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ì„¸ìš”."
msgid "GlobalSearch|Issues I've created"
-msgstr ""
+msgstr "ë‚´ê°€ 만든 ì´ìŠˆ"
msgid "GlobalSearch|Issues assigned to me"
-msgstr ""
+msgstr "나ì—게 í• ë‹¹ëœ ì´ìŠˆ"
msgid "GlobalSearch|Merge requests I've created"
-msgstr ""
+msgstr "내가 만든 머지 리퀘스트"
msgid "GlobalSearch|Merge requests assigned to me"
-msgstr ""
+msgstr "나ì—게 í• ë‹¹ëœ ë¨¸ì§€ 리퀘스트"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
-msgstr ""
+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 "결과가 ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤. %{count}ê°œì˜ ê²°ê³¼ë¥¼ 사용할 수 있습니다. 위/아래 화살표 키를 사용하여 검색 결과를 íƒìƒ‰í•˜ê±°ë‚˜ 엔터 키를 눌러 제출하세요."
msgid "GlobalSearch|Search GitLab"
-msgstr ""
+msgstr "GitLab 검색"
msgid "GlobalSearch|Search for projects, issues, etc."
-msgstr ""
+msgstr "프로ì íŠ¸, ì´ìŠˆ, 기타 검색"
msgid "GlobalSearch|Search results are loading"
-msgstr ""
+msgstr "검색 결과가 로드 중입니다."
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
-msgstr ""
+msgstr "검색 ìžë™ 완성 ì œì•ˆì„ ê°€ì ¸ì˜¤ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "GlobalSearch|Type and press the enter key to submit search."
-msgstr ""
+msgstr "입력하고 엔터 키를 눌러 검색하세요."
msgid "GlobalSearch|Type for new suggestions to appear below."
-msgstr ""
+msgstr "ì•„ëž˜ì— í‘œì‹œí•  새 ì œì•ˆì„ ìž…ë ¥í•˜ì„¸ìš”."
msgid "GlobalSearch|What are you searching for?"
-msgstr ""
+msgstr "ë¬´ì—‡ì„ ì°¾ê³  있나요?"
msgid "GlobalSearch|in all GitLab"
-msgstr ""
+msgstr "- GitLab ì „ì²´ì—ì„œ 검색"
msgid "GlobalSearch|in group"
-msgstr ""
+msgstr "- 그룹ì—ì„œ 검색"
msgid "GlobalSearch|in project"
-msgstr ""
+msgstr "- 프로ì íŠ¸ì—ì„œ 검색"
msgid "Go Back"
msgstr "ì´ì „으로"
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr "정리가 성공ì ìœ¼ë¡œ 시작ë˜ì—ˆìŠµë‹ˆë‹¤"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "ì‹ë³„ìž"
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr "내부 사용ìž"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "주기 패턴"
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "나가기"
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr "현재 프로ì íŠ¸ì— ìž ê¹€"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22818,10 +23112,10 @@ msgid "Markdown enabled."
msgstr ""
msgid "Markdown is supported"
-msgstr ""
+msgstr "Markdownì´ ì§€ì›ë©ë‹ˆë‹¤."
msgid "Markdown supported."
-msgstr ""
+msgstr "Markdown ì§€ì› ë¨"
msgid "MarkdownEditor|Add a link (%{modifierKey}K)"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr "머지 리퀘스트(MR)"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr "네트워í¬"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -24945,7 +25113,7 @@ msgid "New project pages"
msgstr ""
msgid "New project/repository"
-msgstr ""
+msgstr "새 프로ì íŠ¸/저장소"
msgid "New public deploy key"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr "태그 ì—†ìŒ"
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25408,7 +25570,7 @@ msgid "Not started"
msgstr ""
msgid "Not supported"
-msgstr ""
+msgstr "지ì›ë˜ì§€ ì•ŠìŒ"
msgid "Note"
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "11ì›”"
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr "확ì¸"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26079,7 +26313,7 @@ msgid "Only projects created under a Ultimate license are available in Security
msgstr ""
msgid "Only reCAPTCHA v2 is supported:"
-msgstr ""
+msgstr "reCAPTCHA v2만 지ì›ë©ë‹ˆë‹¤:"
msgid "Only required if not using role instance credentials."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "머지 리퀘스트(MR) 변경 사항 중 ì¼ë¶€"
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr "중지"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -26911,13 +27154,13 @@ msgid "Pending"
msgstr "대기중"
msgid "Pending Deletion"
-msgstr ""
+msgstr "삭제 대기 중"
msgid "Pending comments"
msgstr ""
msgid "Pending deletion"
-msgstr ""
+msgstr "삭제 대기 중"
msgid "Pending owner approval"
msgstr ""
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr "%{min}와 %{max} 사ì´ì˜ 숫ìžì—¬ì•¼ 합니다."
msgid "Preferences|Navigation theme"
msgstr "테마 íƒìƒ‰"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "주"
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr "프로ì íŠ¸ 내보내기를 삭제할 수 없습니다."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "프로ì íŠ¸ 내보내기가 ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -29460,8 +29718,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-msgstr "사용ìžëŠ” ì´ ì €ìž¥ì†Œì— ì¸ì¦ëœ ì´ë©”ì¼ë¡œ ì»¤ë°‹ëœ ì»¤ë°‹ë§Œì„ push í•  수 있습니다."
+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 ""
@@ -29995,7 +30253,7 @@ msgid "Promotions|Upgrade plan"
msgstr "업그레ì´ë“œ 플랜"
msgid "Promotions|Upgrade your plan to activate Advanced Search."
-msgstr ""
+msgstr "í”Œëžœì„ ì—…ê·¸ë ˆì´ë“œí•˜ê³  고급 ê²€ìƒ‰ì„ í™œì„±í™”í•˜ì„¸ìš”."
msgid "Promotions|Upgrade your plan to activate Audit Events."
msgstr ""
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "최근 검색"
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31089,10 +31338,10 @@ msgid "Removed upload with id %{id}"
msgstr ""
msgid "RemovedProjects|No projects pending deletion found"
-msgstr ""
+msgstr "ì‚­ì œ 대기 ì¤‘ì¸ í”„ë¡œì íŠ¸ê°€ 없습니다."
msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
-msgstr ""
+msgstr "ë‚´ê°€ 접근할 수 있는 ì‚­ì œ 대기 ì¤‘ì¸ í”„ë¡œì íŠ¸ê°€ ì—¬ê¸°ì— í‘œì‹œë©ë‹ˆë‹¤."
msgid "Removes %{assignee_text} %{assignee_references}."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "저장소 URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr "실패"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr "ì €ìž¥ì†Œì˜ ì €ìž¥ê³µê°„"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr "액세스 요청"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr "재시ë„"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr "로드맵"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr "태그없는 작업 실행"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr "Runners"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr "Runners 페ì´ì§€."
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr "프로ì íŠ¸ ì„ íƒ"
msgid "Select reviewer(s)"
msgstr "리뷰어 ì„ íƒí•˜ê¸°"
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "공유"
@@ -35320,6 +35566,12 @@ msgstr "소스 IP"
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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35894,7 +36152,7 @@ msgid "Submit changes..."
msgstr ""
msgid "Submit feedback"
-msgstr ""
+msgstr "피드백 보내기"
msgid "Submit review"
msgstr ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36408,13 +36660,13 @@ msgid "SuperSonics|past subscriptions"
msgstr ""
msgid "Support"
-msgstr ""
+msgstr "지ì›"
msgid "Support for custom certificates is disabled. Ask your system's administrator to enable it."
msgstr ""
msgid "Support page URL"
-msgstr ""
+msgstr "ì§€ì› íŽ˜ì´ì§€ URL"
msgid "Survey Response"
msgstr ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr "릴리즈 노트"
msgid "TagsPage|Repository has no tags yet."
msgstr "ì €ìž¥ì†Œì— ì•„ì§ íƒœê·¸ê°€ 없습니다."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "태그"
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr "ìƒíƒœ íŒŒì¼ %{name}ì„(를) 제거하려고 합니다. ì´ë ‡ê²Œ 하ë©
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "테스트"
@@ -36900,9 +37152,6 @@ msgstr "테스트 ì¼€ì´ìŠ¤"
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "변경 ì‚¬í•­ì„ ì €ìž¥í•˜ëŠ” ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38147,7 +38390,7 @@ 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 ""
+msgstr "ì´ ê·¸ë£¹ê³¼ 서브 그룹, 그리고 프로ì íŠ¸ê°€ 'ì‚­ì œ 대기 중' ìƒíƒœë¡œ %{deletion_adjourned_period} ë™ì•ˆ 표시ë˜ê³ , %{date}ì— ì™„ì „ížˆ ì‚­ì œë©ë‹ˆë‹¤. 완전히 ì‚­ì œë˜ê¸° ì „ì— ê·¸ë£¹ì„ ì™„ì „ížˆ 복구할 수 있습니다."
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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "여러 프로ì íŠ¸ì—ì„œ 정보를 ì½ì„ 수 없으므로 ì´ íŽ˜ì´ì§€ë¥¼ 사용할 수 없습니다."
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr "방금 전"
msgid "Timeago|right now"
msgstr "지금"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr "시작하려면 아래 ë§í¬ë¥¼ 사용하여 ê³„ì •ì„ í™•ì¸í•˜ì„¸ìš”."
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 "다시 ì‹œë„하십시오"
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr "유형/ìƒíƒœ"
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr "마ì¼ìŠ¤í†¤ ì—…ë°ì´íŠ¸"
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "ì—…ë°ì´íŠ¸ì¤‘..."
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr "ì´ë²ˆ ê²°ì œ 주기 사용량"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "스니펫"
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr "ë‚´ 프로ì íŠ¸ì˜ 리소스 사용량"
msgid "UsageQuota|Usage quotas help link"
msgstr "사용량 제한 ë„움 ë§í¬"
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr "여러가지 ì´ë©”ì¼ ì„¤ì •."
msgid "Various settings that affect GitLab performance."
msgstr "GitLab ì„±ëŠ¥ì— ì˜í–¥ì„ 주는 여러가지 설정."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr "ì´ë¯¸ì§€"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr "웹훅 ë„움ë§"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42079,7 +42313,7 @@ msgid "What would you like to do?"
msgstr ""
msgid "What's new"
-msgstr ""
+msgstr "새로운 기능"
msgid "When a deployment job is successful, skip older deployment jobs that are still pending."
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "ì´ ë¨¸ì§€ 리퀘스트(MR)ê°€ 승ì¸ëì„ ë•Œ"
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr "ì½ê¸°ì „ìš© GitLab ì¸ìŠ¤í„´ìŠ¤ë¥¼ 사용중입니다."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43224,7 +43477,7 @@ msgid "Your authorized applications"
msgstr "승ì¸ëœ 애플리케ì´ì…˜"
msgid "Your browser does not support iFrames"
-msgstr ""
+msgstr "브ë¼ìš°ì €ê°€ iFrames를 지ì›í•˜ì§€ 않습니다"
msgid "Your browser doesn't support U2F. Please use Google Chrome desktop (version 41 or newer)."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,8 +44697,8 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "머지 리퀘스트(MR)"
-msgid "merged %{timeAgo}"
-msgstr "%{timeAgo} ì „ 머지ë¨"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "브랜치 ì²´í¬ì•„웃"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "ì´ë©”ì¼ íŒ¨ì¹˜"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "ë°°í¬ í†µê³„ë¥¼ ë¡œë“œí•˜ëŠ”ë° ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤."
@@ -44684,14 +44952,11 @@ msgid "mrWidget|More information"
msgstr ""
msgid "mrWidget|Open in Gitpod"
-msgstr "Gitpot 으로 열기"
+msgstr "Gitpodì—ì„œ 열기"
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDEì—ì„œ 열기"
-msgid "mrWidget|Plain diff"
-msgstr "Plain diff"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr "새 머지 리퀘스트(MR)"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr "ì—†ìŒ"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "ì°¾ì„ ìˆ˜ ì—†ìŒ"
@@ -44926,10 +45197,7 @@ msgid "pending comment"
msgstr ""
msgid "pending deletion"
-msgstr ""
-
-msgid "per day"
-msgstr ""
+msgstr "삭제 대기 중"
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] "답변"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
@@ -45229,7 +45500,7 @@ msgid "updated %{timeAgo}"
msgstr "%{timeAgo} ì „ ì—…ë°ì´íŠ¸ ë¨"
msgid "updated %{time_ago}"
-msgstr ""
+msgstr "%{time_ago} ì „ ì—…ë°ì´íŠ¸ë¨"
msgid "uploads"
msgstr "업로드"
diff --git a/locale/ku_TR/gitlab.po b/locale/ku_TR/gitlab.po
index 0e78a83de67..9521be78d48 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ky_KG/gitlab.po b/locale/ky_KG/gitlab.po
index 86b158fb64f..a0c5a642797 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/lt_LT/gitlab.po b/locale/lt_LT/gitlab.po
index 9eff350b43c..4e54ea175d4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -343,13 +343,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -511,13 +504,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ 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 ""
@@ -955,9 +944,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1483,9 +1463,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1551,6 +1528,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1808,9 +1794,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ 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 ""
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2429,6 +2400,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2588,15 +2562,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 ""
@@ -2918,12 +2916,24 @@ 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|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 ""
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3881,6 +3933,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4334,6 +4389,9 @@ 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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/mk_MK/gitlab.po b/locale/mk_MK/gitlab.po
index 5e906d4a097..86a45abdf28 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ml_IN/gitlab.po b/locale/ml_IN/gitlab.po
index 4ce624fdd62..a3128f387c0 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:17\n"
+"PO-Revision-Date: 2022-05-01 06:58\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po
index 2268717764d..3fbc830706f 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po
index 076b3c7a21a..c41e505fe4d 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr " %{start} til %{end}"
@@ -65,20 +65,20 @@ msgid "\"%{repository_name}\" size (%{repository_size}) is larger than the limit
msgstr "«%{repository_name}» sin størrelse (%{repository_size}) er større enn grensen på %{limit}."
msgid "#%{issueIid} (closed)"
-msgstr ""
+msgstr "#%{issueIid} (lukket)"
msgid "#general, #development"
msgstr ""
msgid "%d Alert"
msgid_plural "%d Alerts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d varsel"
+msgstr[1] "%d varsler"
msgid "%d Alert:"
msgid_plural "%d Alerts:"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d varsel:"
+msgstr[1] "%d varsler:"
msgid "%d Approval"
msgid_plural "%d Approvals"
@@ -187,8 +187,8 @@ msgstr[1] "%d commits"
msgid "%d commit author"
msgid_plural "%d commit authors"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d commit-forfatter"
+msgstr[1] "%d commit-forfattere"
msgid "%d commit behind"
msgid_plural "%d commits behind"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d gruppe"
msgstr[1] "%d grupper"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d gruppe valgt"
-msgstr[1] "%d grupper valgt"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d time"
@@ -312,8 +307,8 @@ msgstr[1] "%d fletteforespørsler som du ikke har tilgang til."
msgid "%d merge requests"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d fletteforespørsel"
+msgstr[1] "%d fletteforespørsler"
msgid "%d metric"
msgid_plural "%d metrics"
@@ -385,15 +380,10 @@ msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d skår valgt"
-msgstr[1] "%d skår valgt"
-
msgid "%d star"
msgid_plural "%d stars"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d stjerne"
+msgstr[1] "%d stjerner"
msgid "%d tag"
msgid_plural "%d tags"
@@ -511,8 +501,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}Maskert:%{code_close} Skjult i jobblogger. MÃ¥ oppfylle kravene til maskering."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Beskyttet:%{code_close} Eksponeres bare for beskyttede grener eller etiketter."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr ""
@@ -556,8 +546,8 @@ msgstr "%{count} godkjennelser fra %{name}"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} kontakt"
+msgstr[1] "%{count} kontakter"
msgid "%{count} files touched"
msgstr "%{count} filer berørt"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Prøv å laste opp en fil igjen."
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} flere nedstrømsrørledninger"
@@ -770,7 +763,7 @@ msgid "%{learn_more_link}."
msgstr ""
msgid "%{lessThan} 1 hour"
-msgstr ""
+msgstr "%{lessThan} 1 time"
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 ""
@@ -781,21 +774,15 @@ msgstr "%{level_name} er ikke tillatt i en %{group_level_name}-gruppe."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} er ikke tillatt siden utgreiningskildeprosjektet har lavere synlighet."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
+msgstr "%{link_start}Fjern %{draft_snippet} prefiksen%{link_end} fra tittelen for å tillate at denne fletteforespørselen blir innflettet når den er klar."
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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -948,7 +935,7 @@ msgid "%{scope} results for term '%{term}'"
msgstr ""
msgid "%{search} %{description} %{scope}"
-msgstr ""
+msgstr "%{search} %{description} %{scope}"
msgid "%{seconds}s"
msgstr "%{seconds}s"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] "%{securityScanner}-resultatet er ikke tilgjengelig fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
msgstr[1] "%{securityScanner}-resultater er ikke tilgjengelige fordi en rørledning ikke er kjørt siden den ble aktivert. %{linkStart}Kjør en rørledning%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1103,7 +1087,7 @@ msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} advarsler funnet: viser første %{warningsDisplayed}"
msgid "%{type} only supports %{name} name"
-msgstr ""
+msgstr "%{type} støtter kun %{name} navn"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (kan ikke flette)"
@@ -1136,10 +1120,10 @@ msgid "%{user} created a merge request: %{mr_link}"
msgstr "%{user} opprettet en fletteforespørsel: %{mr_link}"
msgid "%{user} created an epic: %{epic_link}"
-msgstr ""
+msgstr "%{user} opprettet et epos: %{epic_link}"
msgid "%{user} created an issue: %{issue_link}"
-msgstr ""
+msgstr "%{user} opprettet en sak: %{issue_link}"
msgid "%{value} is not included in the list"
msgstr "%{value} er ikke inkludert i listen"
@@ -1251,7 +1235,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "(this user)"
-msgstr ""
+msgstr "(denne brukeren)"
msgid "(we need your current password to confirm your changes)"
msgstr ""
@@ -1260,7 +1244,7 @@ msgid "* All times are in UTC unless specified"
msgstr ""
msgid "*Required"
-msgstr ""
+msgstr "*Obligatorisk"
msgid "+ %{amount} more"
msgstr "+ %{amount} til"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] "+%d til"
msgstr[1] "+%d til"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} flere godkjennere"
-
msgid "+%{extra} more"
msgstr "+%{extra} til"
@@ -1301,7 +1282,7 @@ msgid "+%{tags} more"
msgstr "+%{tags} til"
msgid ", "
-msgstr ""
+msgstr ", "
msgid ", or "
msgstr ", eller "
@@ -1341,6 +1322,9 @@ msgid "."
msgstr "."
msgid "/"
+msgstr "/"
+
+msgid "/day"
msgstr ""
msgid "0 bytes"
@@ -1467,6 +1451,9 @@ msgstr[1] "%d år igjen"
msgid "1-9 contributions"
msgstr "1-9 bidrag"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 bidrag"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Første bidrag!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 bidrag"
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Et medlem av misbruksteamet vil vurdere rapporten din så snart som mulig."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2068,7 +2046,7 @@ msgid "Add License"
msgstr ""
msgid "Add New Site"
-msgstr ""
+msgstr "Legg til nytt nettsted"
msgid "Add README"
msgstr "Legg til README"
@@ -2124,9 +2102,6 @@ msgstr "Legg til en linje"
msgid "Add a link"
msgstr "Legg til lenke"
-msgid "Add a link to Grafana"
-msgstr "Legg til en lenke til Grafana"
-
msgid "Add a new issue"
msgstr "Legg til en ny sak"
@@ -2175,6 +2150,9 @@ msgstr "Legg til godkjenningsregel"
msgid "Add approvers"
msgstr "Legg til godkjennere"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Legg til fet tekst"
@@ -2334,15 +2312,15 @@ msgstr "Legg til tidligere innflettede commiter"
msgid "AddContextCommits|Add/remove"
msgstr "Legg til/Fjern"
-msgid "AddMember|Emails cannot be blank"
-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 "Ingen invitasjonskilde ble spesifisert."
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Feil under innlasting av statistikken. Vennligst prøv igjen"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Konfigurer «Let's Encrypt»"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
msgid "AdminSettings|Let's Encrypt email"
msgstr "«Let's Encrypt»-E-post"
+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 ""
@@ -2700,18 +2714,39 @@ msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr "Ingen påkrevd rørledning"
+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 "Påkrevd rørledningsoppsett"
+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 "Velg en CI/CD-mal"
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Aktive brukere"
@@ -3226,7 +3282,7 @@ msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr ""
msgid "Alert"
-msgstr ""
+msgstr "Varsel"
msgid "AlertManagement|Acknowledged"
msgstr "Anerkjent"
@@ -3627,6 +3683,9 @@ msgstr "Alle prosjekter"
msgid "All projects selected"
msgstr "Alle prosjekter valgt"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Alle tråder er oppklart"
@@ -3642,14 +3701,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr "Gi tilgang til følgende IP-adresser"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Tillat commits fra medlemmer som kan flette inn til målgrenen."
+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 "Tillat gruppeeiere å behandle LDAP-relaterte innstillinger"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr "Tillat brukere å be om tilgang (dersom synligheten er offentlig eller i
msgid "Allowed"
msgstr "Tillatt"
-msgid "Allowed Geo IP"
-msgstr "Tillatt Geo-IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Tillatte tegn: +, 0-9, -, og mellomrom."
@@ -4080,6 +4139,9 @@ msgstr "En feil oppstod under behandling av filen."
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 "En feil oppstod under fjerning av eposer."
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "En feil oppstod under validering av gruppebanen"
@@ -4194,7 +4253,7 @@ msgid "An unauthenticated user"
msgstr "En uautentisert bruker"
msgid "An unexpected error occurred"
-msgstr ""
+msgstr "En uventet feil oppstod"
msgid "An unexpected error occurred while checking the project environment."
msgstr "En uventet feil oppstod under sjekking av prosjektmiljøet."
@@ -4223,9 +4282,6 @@ msgstr "En ukjent feil har oppstått."
msgid "Analytics"
msgstr "Analyser"
-msgid "Analyze a review version of your web application."
-msgstr "Analyser en gjennomgangsversjon av nettapplikasjonen din."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analyser avhengighetene dine for kjente sårbarheter."
@@ -4256,6 +4312,9 @@ msgstr "En annen handling pågår for øyeblikket"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "En annen sakssporer er allerede i bruk. Bare én sakssporingstjeneste kan være aktiv om gangen"
+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 "Anti-spam verifisering"
@@ -4334,12 +4393,27 @@ msgstr "Prosjektet ble vellykket oppdatert."
msgid "Application: %{name}"
msgstr "Applikasjon: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr "E-postbegrensninger"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown er skrudd på"
-
-msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 "Lagre endringer"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
-msgstr "Brukergrense"
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+msgid "ApplicationSettings|User cap"
+msgstr "Brukergrense"
+
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr "Benytter forslag …"
msgid "Applying suggestions..."
msgstr "Benytter forslag …"
-msgid "Approval Status"
-msgstr "Godkjenningsstatus"
-
msgid "Approval rules"
msgstr "Godkjenningsregler"
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr "Godkjenninger er valgfrie."
@@ -4808,7 +4867,7 @@ msgid "Are you sure you want to delete this SSH key?"
msgstr "Er du sikker på at du vil slette denne SSH-nøkkelen?"
msgid "Are you sure you want to delete this comment?"
-msgstr ""
+msgstr "Er du sikker på at du vil slette denne kommentaren?"
msgid "Are you sure you want to delete this deploy key?"
msgstr ""
@@ -5105,7 +5164,7 @@ msgid "Attaching the file failed."
msgstr "Vedlegging av filen mislyktes."
msgid "Attention"
-msgstr ""
+msgstr "Oppmerksomhet"
msgid "Attention requested"
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "August"
msgid "Authenticate"
msgstr "Autentisere"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr "Autentiseringsfeil"
msgid "Authentication Log"
msgstr "Autentiseringslogg"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Autentisering mislyktes: %{error_message}"
@@ -5446,7 +5508,7 @@ msgstr "Tilgjengelig ID"
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr "Basert på"
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Nedenfor vil du finne alle de gruppene som er offentlige."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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 "Forleng prøveperioden"
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 ""
@@ -5770,22 +5838,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr "Direkte medlemskap"
msgid "Billing|Enter at least three characters to search."
msgstr "Skriv inn minst tre tegn for å søke."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "Eksporter liste"
-msgid "Billing|Group"
-msgstr "Gruppe"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
msgid "Billing|Group invite"
msgstr "Gruppeinvitasjon"
+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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Oversikt"
msgid "Branches|Please type the following to confirm:"
msgstr "Vennligst skriv inn det følgende for å bekrefte:"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Beskyttede grener kan behandles i %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Vis aktive grener"
@@ -6289,9 +6363,6 @@ msgstr "avveket fra oppstrøm"
msgid "Branches|merged"
msgstr "flettet"
-msgid "Branches|project settings"
-msgstr "prosjektinnstillinger"
-
msgid "Branches|protected"
msgstr "beskyttet"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "Eksisterende grupper"
@@ -6367,6 +6441,9 @@ msgstr "Fra kildegruppe"
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 ""
@@ -6391,9 +6468,6 @@ msgstr "Navnet finnes allerede."
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr "CI-innstillinger"
msgid "CI variables"
msgstr "CI-variabler"
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "CI/CD-konfigurasjon"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Avbryt"
msgid "Cancel and close"
msgstr "Avbryt og lukk"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Avbryt indekssletting"
@@ -7021,14 +7104,20 @@ msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because
msgstr ""
msgid "Changed"
-msgstr ""
+msgstr "Endret"
msgid "Changed assignee(s)."
msgstr "Endret tilordnet person(er)."
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
msgid "Changed reviewer(s)."
msgstr "Endret anmelder(e)."
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
msgid "Changed the title to \"%{title_param}\"."
msgstr "Endret tittelen til «%{title_param}»."
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Sjekk igjen"
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr "Abonnementsdetaljer"
msgid "Checkout|Subtotal"
msgstr "Delsum"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Avgift"
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Velg hvilken som helst farge."
msgid "Choose file…"
msgstr "Velg fil …"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Nullstill"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr "Fjern alle kodelagersjekkinger"
@@ -7790,7 +7893,7 @@ msgid "Closes this %{quick_action_target}."
msgstr "Lukker denne %{quick_action_target}."
msgid "Cloud Run"
-msgstr ""
+msgstr "Cloud Run"
msgid "Cloud Storage"
msgstr ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ msgstr "En ukjent feil oppstod. Vennligst prøv igjen."
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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ msgstr "Aldri"
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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr "Klynger brukes ved å velge nærmeste forfader med et samsvarende miljø
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Dette alternativet lar deg installere applikasjoner på RBAC-klynger."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr "Dette prosjektet har ikke fakturering aktivert. For å opprette en klynge, %{linkToBillingStart}skru på fakturering%{linkToBillingEnd} og prøv igjen."
@@ -8820,7 +8926,7 @@ msgstr "Ukjent feil"
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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr "ComboSearch er ikke definert"
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "Kommaseparert, f.eks. '1.1.1.1, 2.2.2.0/24'"
-
msgid "Command"
msgstr "Kommando"
@@ -9119,9 +9222,6 @@ msgstr "Ingen relaterte fletteforespørsler ble funnet"
msgid "Committed by"
msgstr "Loggført av"
-msgid "Commit…"
-msgstr "Loggfør…"
-
msgid "Community forum"
msgstr "Samfunnsforum"
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr "opprettet av:"
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr "Feil ved tilkobling"
msgid "Connection timed out"
msgstr "Tilkoblingen ble tidsavbrutt"
-msgid "Connection timeout"
-msgstr "Tidsavbrudd på tilkobling"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9597,7 +9691,7 @@ msgid "Contact support"
msgstr "Kontakt kundestøtte"
msgid "Contacts"
-msgstr ""
+msgstr "Kontakter"
msgid "Container Registry"
msgstr "Container-register"
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr "Container-kodelagre"
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr "Container-kodelager"
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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 "Med container-registeret kan hvert prosjekt ha sin egen plass til å lagre sine Docker-bilder. Push minst ett Docker-bilde i et av gruppens prosjekter for at den skal dukke opp her. %{docLinkStart}Mer informasjon%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "Du er i ferd med å fjerne %{item} etiketter. Er du sikker?"
@@ -9980,6 +10071,9 @@ msgstr "Mislyktes i å slette sammenhengscommiter. Vennligst prøv igjen."
msgid "Continue"
msgstr "Fortsett"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Fortsett til neste trinn"
@@ -10088,9 +10182,6 @@ msgstr "Kopier ekstern ID til utklippstavlen"
msgid "Copy ID"
msgstr "Kopier ID"
-msgid "Copy IP Address"
-msgstr "Kopier IP-adresse"
-
msgid "Copy KRB5 clone URL"
msgstr "Kopier KRB5-klone-URL"
@@ -10106,6 +10197,9 @@ msgstr "Kopier nettadresse"
msgid "Copy branch name"
msgstr "Kopier gren-navn"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "Kopier koder"
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr "Kopier lenke"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Kopier lenke til diagram"
@@ -10365,7 +10462,7 @@ msgid "Couldn't assign policy to project or group"
msgstr ""
msgid "Country"
-msgstr ""
+msgstr "Land"
msgid "Coverage"
msgstr "Dekning"
@@ -10410,7 +10507,7 @@ msgid "Create a cluster"
msgstr ""
msgid "Create a group"
-msgstr ""
+msgstr "Lag en gruppe"
msgid "Create a merge request"
msgstr "Opprett en fletteforespørsel"
@@ -10428,7 +10525,7 @@ msgid "Create a new issue"
msgstr "Opprett et nytt sak"
msgid "Create a new project"
-msgstr ""
+msgstr "Lag et nytt prosjekt"
msgid "Create a new repository"
msgstr "Opprett et nytt kodelager"
@@ -10454,6 +10551,9 @@ msgstr "Opprett gren"
msgid "Create commit"
msgstr "Opprett en commit"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10800,7 +10900,7 @@ msgid "Creation date"
msgstr "Opprettelsesdato"
msgid "Creator"
-msgstr ""
+msgstr "Opprettet av"
msgid "Credentials"
msgstr "Legitimasjon"
@@ -10940,8 +11040,11 @@ msgstr "Innstillinger"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
-msgstr "Oppgrader"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "Tilpassede attributter"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} valgt (%{maxLabels} max)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Dato"
@@ -11141,6 +11250,9 @@ msgstr "Vis diagramfiltre"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr "Nettstedstype"
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "MÃ¥l-URL"
@@ -11607,25 +11725,25 @@ msgstr "Prøv å validere på nytt"
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 "Valider"
-msgid "DastSiteValidation|Validate target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11916,7 +12034,7 @@ msgid "Delete Key"
msgstr "Slett nøkkel"
msgid "Delete Selected"
-msgstr ""
+msgstr "Slett valgte"
msgid "Delete Value Stream"
msgstr ""
@@ -11930,6 +12048,9 @@ msgstr "Slett artefakter"
msgid "Delete badge"
msgstr "Slett merke"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Slett kolonne"
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ msgstr "Avhengighetsskanning"
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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr "Din score"
msgid "DevopsReport|Your usage"
msgstr "Din bruk"
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diff-grenser"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 "Ingen filnavn tilgjengelig"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr "Vis %{unfoldCount} linjer"
@@ -13077,9 +13231,6 @@ msgstr "Katalognavn"
msgid "Disable"
msgstr "Skru av"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ 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"
@@ -13206,7 +13360,7 @@ msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr ""
msgid "Display"
-msgstr ""
+msgstr "Skjerm"
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr "Vis kilden"
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "Last ned artefakter"
-msgid "Download as"
-msgstr "Last ned som"
-
msgid "Download codes"
msgstr "Last ned koder"
@@ -13403,47 +13554,53 @@ msgstr "MÃ¥ldato"
msgid "Due date"
msgstr "Forfallsdato"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "Varighet"
-msgid "Duration|%s days"
+msgid "Duration (min)"
msgstr ""
+msgid "Duration|%s days"
+msgstr "%s dager"
+
msgid "Duration|%s hours"
-msgstr ""
+msgstr "%s timer"
msgid "Duration|%s minutes"
-msgstr ""
+msgstr "%s minutter"
msgid "Duration|%s months"
-msgstr ""
+msgstr "%s måneder"
msgid "Duration|%s seconds"
-msgstr ""
+msgstr "%s sekunder"
msgid "Duration|%s weeks"
-msgstr ""
+msgstr "%s uker"
msgid "Duration|%s years"
-msgstr ""
+msgstr "%s år"
msgid "Duration|1 day"
-msgstr ""
+msgstr "1 dag"
msgid "Duration|1 hour"
-msgstr ""
+msgstr "1 time"
msgid "Duration|1 minute"
-msgstr ""
+msgstr "1 minutt"
msgid "Duration|1 month"
-msgstr ""
+msgstr "1 måned"
msgid "Duration|1 week"
-msgstr ""
+msgstr "1 uke"
msgid "Duration|1 year"
-msgstr ""
+msgstr "1 år"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Rediger saker"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr "E-post kunne ikke sendes"
msgid "Email display name"
msgstr "E-postvisningsnavn"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-post er ikke bekreftet. Vennligst bekreft din e-post i Salesforce."
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr "Send e-post om programrettelse"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "E-post sendt"
@@ -13784,15 +13941,15 @@ msgstr "Tom fil"
msgid "Enable"
msgstr "Slå på"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Aktiver Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Skru på Gitpod"
@@ -13814,18 +13971,12 @@ msgstr "Skru på PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr "Skru på SSL-verifisering"
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Skru på integrering"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Skru på 2-trinnsautentisering"
@@ -14030,7 +14169,7 @@ msgstr "Slutter: %{endsAt}"
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr "Bedrift"
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr "beskyttet"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Epos"
@@ -14419,9 +14559,6 @@ msgstr "Eposer"
msgid "Epics Roadmap"
msgstr "Epos-veikart"
-msgid "Epics and Issues"
-msgstr "Eposer og saker"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr "forfall"
msgid "Epics|start"
msgstr "start"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Feil"
@@ -14779,9 +14919,6 @@ msgstr "Feil"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Feil:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15028,7 +15165,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr "Eksempel: @sub\\.firma\\.com$"
msgid "Examples"
-msgstr ""
+msgstr "Eksempler"
msgid "Except policy:"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "Utløpt"
@@ -15130,7 +15270,7 @@ msgid "Expires in %{expires_at}"
msgstr "Utløper om %{expires_at}"
msgid "Expires on"
-msgstr ""
+msgstr "Utløper den"
msgid "Expires:"
msgstr "Utløper:"
@@ -15160,7 +15300,7 @@ msgid "Explore public groups"
msgstr "Utforsk offentlige grupper"
msgid "Explore public projects"
-msgstr ""
+msgstr "Utforsk offentlige prosjekter"
msgid "Explore snippets"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr "Mislyktes i å installere."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr "Mislyktes i å laste inn iterasjoner."
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Funksjonsflagg"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr "Filkroker"
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Lagt til fil"
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Fil-maler"
@@ -16000,11 +16146,8 @@ msgstr ""
msgid "Finished"
msgstr "Fullført"
-msgid "Finished at"
-msgstr "Fullført den"
-
msgid "First Name"
-msgstr ""
+msgstr "Fornavn"
msgid "First Seen"
msgstr "Først sett"
@@ -16123,9 +16266,6 @@ msgstr "For mer informasjon, gå til "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "Glemt passordet ditt?"
@@ -16244,7 +16384,7 @@ msgid "Frequency"
msgstr "Frekvens"
msgid "Frequently searched"
-msgstr ""
+msgstr "Ofte søkt etter"
msgid "Friday"
msgstr "Fredag"
@@ -16301,7 +16441,7 @@ msgid "General pipelines"
msgstr "Generelle rørledninger"
msgid "General settings"
-msgstr ""
+msgstr "Hovedinnstillinger"
msgid "Generate a default set of labels"
msgstr "Generer et standardsett med stempler"
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "Legg til nettsted"
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 "Mislykket"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr "Filtrer etter navn"
msgid "Geo|Filter by status"
msgstr "Filtrer etter status"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo Status"
-msgid "Geo|Geo sites"
+msgid "Geo|Geo allows you to choose specific groups or storage shards to replicate."
msgstr ""
-msgid "Geo|Geo sites are paused using a command run on the site"
+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 supports replication of many data types."
+msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
msgid "Geo|Go to the primary site"
msgstr "GÃ¥ til hovednettstedet"
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
msgid "Geo|Healthy"
msgstr "Sunn"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr "Synkronisert"
msgid "Geo|Internal URL"
msgstr "Intern URL"
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ msgstr "Lær mer om Geo"
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 "Gjør alle på teamet ditt mer produktive, uansett hvor de befinner seg. GitLab Geo oppretter skrivebeskyttede speilinger av din GitLab-instans, slik at du kan redusere tiden det tar å klone og hente store kodelagre."
+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 "Aldri"
msgid "Geo|Next sync scheduled at"
msgstr "Neste synkronisering er planlagt kl."
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
msgid "Geo|Not synced yet"
msgstr "Ikke synkronisert enda"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr "Ingenting å verifisere"
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr "Frakoblet"
@@ -16555,6 +16780,9 @@ msgstr "Avventer synkronisering"
msgid "Geo|Pending verification"
msgstr "Venter verifikasjon"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "Hovednode"
@@ -16576,6 +16804,9 @@ msgstr "Prosjekter i visse lagringsskår"
msgid "Geo|Queued"
msgstr "Stilt i kø"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Laste ned på nytt"
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Synkroniser på nytt"
@@ -16645,15 +16879,39 @@ msgstr "Verifiser alle prosjekter på nytt"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
msgstr "Sekundær node"
msgid "Geo|Secondary site"
msgstr "Sekundært nettsted"
+msgid "Geo|Select groups to replicate"
+msgstr ""
+
+msgid "Geo|Select shards to replicate"
+msgstr ""
+
msgid "Geo|Selective (%{syncLabel})"
msgstr "Selektiv (%{syncLabel})"
+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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ msgstr "Synkroniseringsinnstillinger"
msgid "Geo|Synchronization status"
msgstr "Synkroniseringsstatus"
+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 ""
@@ -16699,9 +16963,21 @@ msgstr "Det er ingen %{replicable_type} å vise"
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 ""
@@ -16711,12 +16987,18 @@ 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 "URL-en kan ikke være blank"
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr "Verifisering"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Verifisering mislyktes - %{error}"
@@ -16756,7 +17041,7 @@ msgstr "Verifisert"
msgid "Geo|Waiting for scheduler"
msgstr "Venter på planlegger"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr "GitLab-eksport"
msgid "GitLab group: %{source_link}"
msgstr "GitLab-gruppe: %{source_link}"
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr ""
msgid "Gitea Import"
msgstr "Gitea-importering"
+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 ""
@@ -17144,22 +17438,22 @@ msgid "GlobalSearch|%{count} default results provided. Use the up and down arrow
msgstr ""
msgid "GlobalSearch|Issues I've created"
-msgstr ""
+msgstr "Saker jeg har opprettet"
msgid "GlobalSearch|Issues assigned to me"
-msgstr ""
+msgstr "Saker tildelt til meg"
msgid "GlobalSearch|Merge requests I've created"
-msgstr ""
+msgstr "Fletteforespørsler jeg har opprettet"
msgid "GlobalSearch|Merge requests assigned to me"
-msgstr ""
+msgstr "Fletteforespørsler tildelt til meg"
msgid "GlobalSearch|Merge requests that I'm a reviewer"
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 "Resultatene er oppdatert. %{count} resultater tilgjengelig. Bruk ↑- og ↓-piltastene for å navigere i søkeresultatlisten, eller ENTER for å sende inn."
msgid "GlobalSearch|Search GitLab"
msgstr ""
@@ -17171,19 +17465,19 @@ msgid "GlobalSearch|Search results are loading"
msgstr ""
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
-msgstr ""
+msgstr "Det oppsto en feil under henting av forslag til autofullføring av søk."
msgid "GlobalSearch|Type and press the enter key to submit search."
-msgstr ""
+msgstr "Skriv inn og trykk Enter-tasten for å sende inn et søk."
msgid "GlobalSearch|Type for new suggestions to appear below."
-msgstr ""
+msgstr "Skriv inn for at nye forslag skal vises nedenfor."
msgid "GlobalSearch|What are you searching for?"
-msgstr ""
+msgstr "Hva søker du etter?"
msgid "GlobalSearch|in all GitLab"
-msgstr ""
+msgstr "på hele GitLab"
msgid "GlobalSearch|in group"
msgstr ""
@@ -17447,7 +17741,7 @@ msgid "GraphViewType|Stage"
msgstr "Trinn"
msgid "Graphs"
-msgstr ""
+msgstr "Grafer"
msgid "Gravatar"
msgstr "Gravatar"
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr "Grupper å synkronise"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Ofte besøkt"
@@ -18408,7 +18696,7 @@ msgid "HeaderAction|issue"
msgstr ""
msgid "Headers"
-msgstr ""
+msgstr "Meldingshoder"
msgid "Heading 1"
msgstr "Overskrift 1"
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,14 +18788,11 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr "Hei, %{username}!"
msgid "Hidden"
-msgstr ""
+msgstr "Skjult"
msgid "Hide"
msgstr "Skjul"
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identifikator"
@@ -18825,13 +19110,10 @@ 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."
-msgstr "Hvis det er deaktivert, vil en avvikende lokal gren ikke automatisk bli oppdatert med forpliktelser fra den eksterne motparten, for å forhindre lokalt datatap. Hvis standardgrenen (%{default_branch}) har avveket og ikke kan oppdateres, vil speiling mislykkes. Andre avvikende grener ignoreres lydløst."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ msgstr "Blogg"
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 ""
@@ -19222,7 +19501,7 @@ msgid "InProductMarketing|Click on the number below that corresponds with your a
msgstr ""
msgid "InProductMarketing|Code owners"
-msgstr ""
+msgstr "Kodeeiere"
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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr "Sett i gang i dag"
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ msgstr "Veldig enkelt"
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 ""
@@ -19770,6 +20061,9 @@ msgstr "Hendelse"
msgid "IncidentManagement|Incidents"
msgstr "Hendelser"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Lav - S4"
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr "MÃ¥ begynne med http eller https"
-msgid "Incidents|There was an issue deleting the image."
-msgstr "Det oppstod et problem med å slette bildet."
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr "Det oppstod et problem med å laste opp bildet ditt."
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr "Bruk forvalgte innstillinger"
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr "Intern URL (valgfritt)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Interne brukere"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Intervallmønster"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr "Ugyldig fil."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr "Inviter medlemmer"
msgid "Invite a group"
msgstr "Inviter en gruppe"
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr "Inviter medlemmer"
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Varighet"
@@ -21260,9 +21551,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 "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "Jaeger-URL"
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21980,7 +22274,7 @@ msgid "Last Activity"
msgstr "Nyeste aktivitet"
msgid "Last Name"
-msgstr ""
+msgstr "Etternavn"
msgid "Last Pipeline"
msgstr "Nyeste rørledning"
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr "Ledetid"
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22196,7 +22493,7 @@ msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
msgstr ""
msgid "LearnGitLab|Add code owners"
-msgstr ""
+msgstr "Legg til kodeeiere"
msgid "LearnGitLab|Add merge request approval"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr "OK, da setter vi i gang"
msgid "LearnGitlab|Trial only"
msgstr "Kun prøveperiode"
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Forlat"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr "Komponenter"
msgid "Licenses|Detected in Project"
msgstr "Oppdaget i prosjektet"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr "LÃ¥st av %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "LÃ¥ste diskusjonen."
-msgid "Locked to current projects"
-msgstr "Låst til nåværende prosjekter"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22792,7 +23083,7 @@ msgid "LoggedOutMarketingHeader|Talk to an expert"
msgstr ""
msgid "Login"
-msgstr ""
+msgstr "Innlogging"
msgid "Login with smartcard"
msgstr "Logg på med et smartkort"
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "Max 100 000 hendelser"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr "Maks antall brukere"
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23405,7 +23705,7 @@ msgstr[0] ""
msgstr[1] ""
msgid "Membership"
-msgstr ""
+msgstr "Medlemskap"
msgid "Members|%{time} by %{user}"
msgstr "%{time} av %{user}"
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "Filtrer medlemmer"
@@ -23587,6 +23890,9 @@ msgstr "Fletteforespørsel"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "Fletteforespørselen %{mr_link} ble gjennomgått av %{mr_author}"
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23633,7 +23939,7 @@ msgid "Merge when pipeline succeeds"
msgstr ""
msgid "Merge..."
-msgstr ""
+msgstr "Flett …"
msgid "MergeConflict|Commit to source branch"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "MÃ¥ltall"
@@ -24347,11 +24665,11 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
-msgstr "Minimumsintervall i dager"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgstr ""
msgid "Minutes"
msgstr "Minutter"
@@ -24465,7 +24783,7 @@ msgid "Months"
msgstr "MÃ¥neder"
msgid "More Details"
-msgstr ""
+msgstr "Mer detaljer"
msgid "More Information"
msgstr "Mer informasjon"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr "Multi-prosjekt"
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr "Nettverk"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}hvis%{ifLabelEnd} %{ruleType} %{isLabelStart}er%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}og er innkommende fra en%{directionLabelEnd} %{rule} %{portsLabelStart}på%{portsLabelEnd} %{ports}"
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}hvis%{ifLabelEnd} %{ruleType} %{isLabelStart}er%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}og er utgående fra en%{directionLabelEnd} %{rule} %{portsLabelStart}på%{portsLabelEnd} %{ports}"
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr "%{number} valgt"
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr "%{strongOpen}alle%{strongClose} podder"
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr "%{strongOpen}enhver%{strongClose} port"
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ".yaml-modus"
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr "Alle valgt"
-
-msgid "NetworkPolicies|Allow"
-msgstr "Tillat"
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr "Opprett retningslinje"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "Slett retningslinje"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr "Avvis all trafikk"
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "Rediger retningslinje"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr "IP/undernett"
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Ugyldig eller tom retningslinje"
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Kubernetes-feil: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr "Nettverk"
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr "Nettverkstrafikk"
-
-msgid "NetworkPolicies|None selected"
-msgstr "Ingen valgt"
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr "%{policyName}-retningslinjen ble vellykket endret"
-msgid "NetworkPolicies|Policy definition"
-msgstr "Retningslinjedefinisjon"
-
-msgid "NetworkPolicies|Rule mode"
-msgstr "Regelmodus"
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "Lagre endringer"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr "alle DNS-navn"
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr "alle IP-adresser"
-
-msgid "NetworkPolicies|any pod"
-msgstr "enhver pod"
-
-msgid "NetworkPolicies|any port"
-msgstr "enhver port"
-
-msgid "NetworkPolicies|domain name"
-msgstr "domenenavn"
-
-msgid "NetworkPolicies|entity"
-msgstr "enhet"
-
-msgid "NetworkPolicies|inbound to"
-msgstr "innkommende til"
-
-msgid "NetworkPolicies|nowhere"
-msgstr "ingensteds"
-
-msgid "NetworkPolicies|outbound from"
-msgstr "utgående fra"
-
-msgid "NetworkPolicies|pod with labels"
-msgstr "pod med etiketter"
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr "podder %{pods}"
-
-msgid "NetworkPolicies|pods with labels"
-msgstr "podder med etiketter"
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr "porter %{ports}"
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr "porter/protokoller"
-
msgid "NetworkPolicy|Policy"
msgstr "Retningslinje"
@@ -25117,7 +25285,7 @@ msgid "New milestone"
msgstr "New milestone"
msgid "New name"
-msgstr ""
+msgstr "Nytt navn"
msgid "New password"
msgstr "Nytt passord"
@@ -25236,9 +25404,6 @@ msgstr "Ingen milepæl"
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr "Ingen etikett"
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr "Ingen forhåndsvisning for denne filtypen"
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr "Ingen profiler ble funnet"
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25584,7 +25746,7 @@ msgid "Not confidential"
msgstr "Ikke konfidensiell"
msgid "Not found"
-msgstr ""
+msgstr "Ikke funnet"
msgid "Not found."
msgstr "Ikke funnet."
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Notis"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr "Ingenting ble funnet …"
-
msgid "Nothing to preview."
msgstr "Ingenting å forhåndsvise."
@@ -25795,6 +25957,42 @@ msgstr "Varsling på"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -25829,7 +26027,7 @@ msgid "Number of commits per MR"
msgstr "Antall commiter per FF"
msgid "Number of employees"
-msgstr ""
+msgstr "Antall ansatte"
msgid "Number of events"
msgstr "Antall hendelser"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 "Beskrivelse (valgfritt)"
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,21 +26362,27 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr "Lagre skanning"
+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 "Skannerprofil"
-msgid "OnDemandScans|Schedule scan"
-msgstr ""
-
msgid "OnDemandScans|Select one of the existing profiles"
msgstr "Velg en av de eksisterende profilene"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26305,10 +26539,10 @@ msgid "Open errors"
msgstr "Ã…pne feil"
msgid "Open in Gitpod"
-msgstr ""
+msgstr "Ã…pne i Gitpod"
msgid "Open in Web IDE"
-msgstr ""
+msgstr "Ã…pne i nett-IDE"
msgid "Open in file view"
msgstr "Ã…pne i filvisning"
@@ -26347,7 +26581,7 @@ msgid "Opens in a new window"
msgstr "Ã…pnes i et nytt vindu"
msgid "Opens new window"
-msgstr ""
+msgstr "Ã…pner et nytt vindu"
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
msgstr ""
@@ -26359,7 +26593,7 @@ msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
msgstr ""
msgid "Operations"
-msgstr ""
+msgstr "Handlinger"
msgid "Operations Dashboard"
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr "Slett pakkeversjonen"
msgid "PackageRegistry|Delete package"
msgstr "Slett pakke"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr "Pip-kommando"
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "Publiser og del pakker for en rekke vanlige pakkebehandlere. %{docLinkStart}Mere informasjon%{docLinkEnd}"
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ msgstr "Det er ingen pakker enda"
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 ""
@@ -26999,15 +27242,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "Deltakere"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr "Bestått"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pause"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27114,7 +27357,7 @@ msgid "Pending comments"
msgstr "Avventende kommentarer"
msgid "Pending deletion"
-msgstr ""
+msgstr "Venter på sletting"
msgid "Pending owner approval"
msgstr ""
@@ -27219,7 +27462,7 @@ msgid "Period in seconds"
msgstr "Periode i sekunder"
msgid "Permalink"
-msgstr ""
+msgstr "Permalenke"
msgid "Permanently remove group"
msgstr ""
@@ -27261,7 +27504,7 @@ msgid "Phabricator Tasks"
msgstr ""
msgid "Phone"
-msgstr ""
+msgstr "Telefon"
msgid "Pick a name"
msgstr "Velg et navn"
@@ -27278,9 +27521,6 @@ msgstr "Rørledning %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "Rørledning %{label} for «%{dataTitle}»"
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Totalt:"
+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 ""
@@ -27957,7 +28203,7 @@ msgid "Plain-text response to send to clients that hit a rate limit"
msgstr ""
msgid "Plan"
-msgstr ""
+msgstr "Plan"
msgid "Plan:"
msgstr "Plan:"
@@ -28079,6 +28325,9 @@ msgstr "Vennligst skriv inn et beskrivende navn på gruppen din."
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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "Vennligst vent et øyeblikk, denne siden vil automatisk oppfriskes når det er klart."
@@ -28262,6 +28511,12 @@ msgstr "Velg hvilket innhold du vil se på et prosjekts oversiktsside."
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Velg hva slags innhold du vil se på hjemmesiden din."
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Konfigurer hvordan datoer og klokkeslett vises for deg."
@@ -28271,6 +28526,12 @@ 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 colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr "Vis tid i 24-timersformat"
@@ -28307,6 +28568,9 @@ msgstr "Må være et nummer mellom %{min} og %{max}"
msgid "Preferences|Navigation theme"
msgstr "Navigasjonstema"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Prosjektoversikts-innhold"
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr "Forrige uoppklarte diskusjon"
-msgid "Primary"
-msgstr "Primær"
-
msgid "Primary Action"
msgstr "Hovedhandling"
@@ -29027,9 +29288,6 @@ msgstr "Prosjekteksporteringen kunne ikke slettes."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "Prosjekteksport skrudd på"
-
msgid "Project export has been deleted."
msgstr "Prosjekteksport har blitt slettet."
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30537,7 +30795,7 @@ msgid "Push project from command line"
msgstr ""
msgid "Push rules"
-msgstr ""
+msgstr "Push-regler"
msgid "Push the target branch up to GitLab."
msgstr ""
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr "Les dokumentasjonen"
@@ -30794,9 +31049,6 @@ msgstr "Tjeneste for nylige søk er ikke tilgjengelig"
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Nylige søk"
@@ -30866,7 +31118,7 @@ msgid "Regex pattern"
msgstr "Regex-mønster"
msgid "Region"
-msgstr ""
+msgstr "Region"
msgid "Regions"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "Registrer med 2-trinnsapp"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -30971,7 +31220,7 @@ msgid "Reindexing Status: %{status} (Slice multiplier: %{multiplier}, Maximum ru
msgstr ""
msgid "Reject"
-msgstr ""
+msgstr "Avvis"
msgid "Rejected (closed)"
msgstr "Avslått (lukket)"
@@ -31380,9 +31629,6 @@ msgstr "Gjenåpnet denne %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Gjenåpner denne %{quick_action_target}."
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "Erstatt"
@@ -31422,9 +31668,6 @@ msgstr "Svar …"
msgid "Repo by URL"
msgstr "Kodelager utifra URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "Rapporter misbruk"
@@ -31516,6 +31759,9 @@ msgstr "Feilede"
msgid "Reports|Filename"
msgstr "Filnavn"
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr "Skanner"
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Kodelager-lagring"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31733,7 +31979,7 @@ msgid "RepositorySettingsAccessLevel|Select"
msgstr "Velg"
msgid "Request"
-msgstr ""
+msgstr "Forespørsel"
msgid "Request Access"
msgstr "Be om tilgang"
@@ -31741,9 +31987,6 @@ msgstr "Be om tilgang"
msgid "Request a new one"
msgstr "Be om en ny en"
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr "Be om detaljer"
@@ -31795,9 +32035,6 @@ msgstr "De forespurte tilstandene er ugyldige"
msgid "Requests"
msgstr "Forespørsler"
-msgid "Requests Profiles"
-msgstr "Forespørselsprofiler"
-
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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Forsøk igjen"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Veikart"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Rolle"
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr "Løpere"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ msgstr "Løpere"
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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr "gruppe"
-msgid "Runners|locked"
-msgstr "låst"
-
msgid "Runners|never contacted"
msgstr ""
@@ -32910,7 +33144,7 @@ msgid "Search for a user"
msgstr "Søk etter en bruker"
msgid "Search for an emoji"
-msgstr ""
+msgstr "Søk etter en emoji"
msgid "Search for projects, issues, etc."
msgstr "Søk etter prosjekter, saker, etc."
@@ -32922,7 +33156,7 @@ msgid "Search forks"
msgstr "Velg utgreininger"
msgid "Search groups"
-msgstr ""
+msgstr "Søk etter grupper"
msgid "Search iterations"
msgstr "Søk blant iterasjoner"
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr "Sekundær"
-
msgid "Secondary email:"
msgstr "Sekundær E-post:"
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Alle retningslinjer"
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,25 +33576,49 @@ 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 "Beskrivelse"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
-msgstr ""
-
msgid "SecurityOrchestration|Edit policy"
msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr "Hvis du bruker Auto DevOps, vil ikke din %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd}-filen bli oppdatert hvis du endrer en retningslinje i denne delen. Auto DevOps-brukere bør gjøre endringer ved å følge dokumentasjonen for %{linkStart}Container-nettverksretningslinjer%{linkEnd}."
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr "Nettverk"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "Ny retningslinje"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,12 +33876,12 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr "+%{count} til"
-msgid "SecurityPolicies|Environment(s)"
-msgstr ""
-
msgid "SecurityPolicies|Policy type"
msgstr "Retningslinjetype"
+msgid "SecurityReports|%{count} Selected"
+msgstr ""
+
msgid "SecurityReports|%{count}+ projects"
msgstr ""
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr "Ta undersøkelse"
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr "Velg gren"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr "Velg måldato"
@@ -34035,9 +34302,6 @@ msgstr "Velg gruppe"
msgid "Select group or project"
msgstr "Velg gruppe eller prosjekt"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr "Velg helsestatus"
@@ -34080,9 +34344,6 @@ msgstr "Velg prosjekter"
msgid "Select reviewer(s)"
msgstr "Velg anmelder(e)"
-msgid "Select shards to replicate"
-msgstr "Velg skår å replikere"
-
msgid "Select source"
msgstr "Velg kilde"
@@ -34131,9 +34392,6 @@ msgstr "Utvalgte prosjekter"
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 "Å velge en GitLab-bruker vil legge til en lenke til GitLab-brukeren i beskrivelsene av saker og kommentarer (f.eks. \"Av %{link_open}@johnsmith%{link_close}\"). Det vil også knytte og/eller tildele disse sakene og kommentarene til den valgte brukeren."
-msgid "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34216,7 +34474,7 @@ msgid "Send service data"
msgstr "Send tjenestedata"
msgid "Sentry"
-msgstr ""
+msgstr "Sentry"
msgid "Sentry API URL"
msgstr "Sentry-API-URL"
@@ -34335,13 +34593,13 @@ msgstr "Tjenestedesk"
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 "Tjenestedesken lar folk opprette saksrapporter i din GitLab-forekomst uten å ha sin egen brukerkonto. Det sørger for en unik e-postadresse for sluttbrukere til å opprette saksrapporter i et prosjekt. Svar kan sendes enten via GitLab-grensesnittet eller via e-post. Sluttbrukere ser kun tråden via e-post."
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34384,7 +34642,7 @@ msgid "ServicePing|Turn on service ping to review instance-level analytics."
msgstr ""
msgid "Services"
-msgstr ""
+msgstr "Tjenester"
msgid "Session ID"
msgstr "Økt-ID"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "Bestem vektlegging"
msgid "Set weight to %{weight}."
msgstr "Sett vektlegging til %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr "Alvorlighetsgrad: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr "Skår å synkronise"
-
msgid "Share"
msgstr "Del"
@@ -34994,7 +35240,7 @@ msgid "Site profile not found for given parameters"
msgstr ""
msgid "Sites"
-msgstr ""
+msgstr "Nettsteder"
msgid "Size"
msgstr "Størrelse"
@@ -35545,6 +35791,12 @@ msgstr "Kilde-IP"
msgid "Source branch"
msgstr "Kildegren"
+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 "Kildegren: %{source_branch_open}%{source_branch}%{source_branch_close}"
@@ -36067,6 +36319,12 @@ msgstr "Gjennomstrek"
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 "Undergruppe-informasjon"
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr "Legg til seter"
@@ -36406,6 +36643,12 @@ msgstr "Koksgrå"
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36416,11 +36659,17 @@ msgid "SuggestedColors|Dark sea green"
msgstr ""
msgid "SuggestedColors|Dark violet"
-msgstr ""
+msgstr "Mørkefiolett"
msgid "SuggestedColors|Deep violet"
msgstr "Dyp fiolett"
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr "Grå"
@@ -36439,6 +36688,9 @@ msgstr "Magenta-rosa"
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr "Rød"
@@ -36481,8 +36733,8 @@ msgstr "Aktiver abonnement"
msgid "SuperSonics|Activation code"
msgstr "Aktiveringskode"
-msgid "SuperSonics|An error occurred while activating your subscription."
-msgstr "Det oppstod en feil under aktivering av abonnementet ditt."
+msgid "SuperSonics|An error occurred while adding your subscription."
+msgstr ""
msgid "SuperSonics|Billable users"
msgstr "Fakturerbare brukere"
@@ -36490,9 +36742,6 @@ msgstr "Fakturerbare brukere"
msgid "SuperSonics|Buy subscription"
msgstr "Kjøp abonnement"
-msgid "SuperSonics|Cloud license"
-msgstr "Skylisens"
-
msgid "SuperSonics|Cloud licensing"
msgstr "Skylisensiering"
@@ -36517,6 +36766,9 @@ 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 "Lisensiert til"
@@ -36526,7 +36778,10 @@ msgstr "Behandle"
msgid "SuperSonics|Maximum users"
msgstr "Maks antall brukere"
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr "Synkroniser nå"
msgid "Synced"
msgstr "Synkronisert"
-msgid "Synchronization settings"
-msgstr "Synkroniseringsinnstillinger"
-
msgid "Synchronize LDAP"
msgstr "Synkroniser LDAP"
@@ -36840,6 +37089,9 @@ msgstr "Utgivelsesbeskrivelser"
msgid "TagsPage|Repository has no tags yet."
msgstr "Kodelageret har ingen etiketter enda."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Tagger"
@@ -36883,7 +37135,7 @@ msgid "Target-Branch"
msgstr "MÃ¥lgren"
msgid "Task"
-msgstr ""
+msgstr "Oppgave"
msgid "Task ID: %{elastic_task}"
msgstr "Oppgave-ID: %{elastic_task}"
@@ -36910,7 +37162,7 @@ msgid "TeamcityIntegration|Trigger TeamCity CI after every push to the repositor
msgstr ""
msgid "Telephone number"
-msgstr ""
+msgstr "Telefonnummer"
msgid "Template"
msgstr "Mal"
@@ -36955,7 +37207,7 @@ msgid "Terms of Service and Privacy Policy"
msgstr "Bruksvilkår og personvern"
msgid "Terms of service"
-msgstr ""
+msgstr "Vilkår for bruk"
msgid "Terraform"
msgstr "Terraform"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr "Genereringen av prosjektet forårsaket en feil."
-msgid "Terraform|Get started with Terraform"
-msgstr "Kom i gang med Terraform"
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "Test"
@@ -37130,9 +37382,6 @@ msgstr "Testtilfeller"
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr "Commiten finnes ikke"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr "Prosjektet ble vellykket utgreinet."
msgid "The project was successfully imported."
msgstr "Prosjektet ble vellykket importert."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 "En feil oppstod under innhenting av brukere."
+msgid "There was a problem handling the pipeline data."
+msgstr ""
+
msgid "There was a problem sending the confirmation email"
msgstr ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "En feil oppstod under innhenting av %{replicableType}"
-msgid "There was an error fetching the Geo Settings"
-msgstr "Det oppstod en feil under innhenting av Geo-innstillingene"
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "En feil oppstod under lagring av endringene dine."
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr "Det oppstod en feil under oppdatering av Geo-innstillingene"
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr "Denne innstillingen er kun tilgjengelig på GitLab.com"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr "Alarmdetaljer"
@@ -38947,9 +39184,6 @@ msgstr "Tid fra første commit til første kommentar"
msgid "Time from last commit to merge"
msgstr "Tid fra siste commit til innfletting"
-msgid "Time in seconds"
-msgstr "Tid i sekunder"
-
msgid "Time of import: %{importTime}"
msgstr "Importeringstid: %{importTime}"
@@ -39118,11 +39352,11 @@ msgstr "nå nettopp"
msgid "Timeago|right now"
msgstr "akkurat nå"
-msgid "Timeline|Turn timeline view off"
-msgstr "Skru av tidslinjevisningen"
+msgid "Timeline|Turn recent updates view off"
+msgstr ""
-msgid "Timeline|Turn timeline view on"
-msgstr "Skru på tidslinjevisningen"
+msgid "Timeline|Turn recent updates view on"
+msgstr ""
msgid "Timeout"
msgstr "Tidsavbrudd"
@@ -39194,6 +39428,9 @@ msgstr "For å godta denne invitasjonen, må du logge på."
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 ""
@@ -39203,6 +39440,9 @@ 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 "For å bekrefte, skriv %{phrase_code}"
@@ -39234,7 +39474,7 @@ msgid "To ensure no loss of personal content, this account should only be used f
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 ""
+msgstr "For å finne tilstanden til dette prosjektets kodelager på tidspunktet til noen av disse versjonene, se i %{link_start}etikettene%{link_end}"
msgid "To further protect your account, consider configuring a %{mfa_link_start}two-factor authentication%{mfa_link_end} method."
msgstr "For å beskytte kontoen din ytterligere, bør du vurdere å konfigurere en %{mfa_link_start}2-trinnsautentiserings%{mfa_link_end}metode."
@@ -39254,9 +39494,6 @@ msgstr "For å komme i gang, skriv inn din Gitea-verts-URL og en %{link_to_perso
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,14 +39740,17 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
msgstr ""
msgid "Topics"
-msgstr ""
+msgstr "Emner"
msgid "Total"
msgstr "Totalt"
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ msgstr ""
msgid "Trusted"
msgstr "Betrodd"
+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 "Prøv igjen"
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr "Tirsdag"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr "Slå av"
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Type"
-msgid "Type/State"
-msgstr "Type/Tilstand"
-
msgid "U2F Devices (%{length})"
msgstr "U2F-enheter (%{length})"
@@ -39986,6 +40223,9 @@ msgstr "Klarte ikke å innhente sårbare prosjekter"
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 "Klarte ikke å generere ny instans-ID"
@@ -40265,9 +40505,6 @@ msgstr "Oppdatering mislyktes"
msgid "Update it"
msgstr "Oppdater den"
-msgid "Update iteration"
-msgstr "Oppdater iterasjon"
-
msgid "Update milestone"
msgstr "Oppdater milepæl"
@@ -40316,9 +40553,6 @@ msgstr "Oppdatert %{updated_at} av %{updated_by}"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr "Oppdateringer"
-
msgid "Updating"
msgstr "Oppdaterer"
@@ -40374,7 +40608,7 @@ msgid "UploadLink|click to upload"
msgstr "klikk for å laste opp"
msgid "Uploaded"
-msgstr ""
+msgstr "Lastet opp"
msgid "Uploading changes to terminal"
msgstr "Laster opp endringer til terminalen"
@@ -40424,6 +40658,12 @@ msgstr "CI-minuttbruk per måned"
msgid "UsageQuota|CI minutes usage by project"
msgstr "CI-minuttbruk per prosjekt"
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
msgid "UsageQuota|Code packages and container images."
msgstr ""
@@ -40433,7 +40673,7 @@ msgstr "Bruk i nåværende periode"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr "Seter"
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Utdrag"
@@ -40532,6 +40775,12 @@ msgstr "Brukskvoter"
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 ""
@@ -40544,9 +40793,6 @@ msgstr "Ressursbruk på tvers av prosjektene dine"
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "Benyttelse siden"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr "Bruk saltet lagring"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Brukere kan starte opp et utviklingsmiljø fra en GitLab-nettleserfane hvis %{linkStart}Gitpod%{linkEnd}-integrasjonen er skrudd på."
-msgid "Users can reactivate their account by signing in."
+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."
@@ -41163,7 +41409,7 @@ msgid "Validated at"
msgstr ""
msgid "Validated at:"
-msgstr ""
+msgstr "Validert den:"
msgid "Validated:"
msgstr ""
@@ -41288,9 +41534,6 @@ msgstr "Ulike e-postinnstillinger."
msgid "Various settings that affect GitLab performance."
msgstr "Diverse innstillinger som påvirker GitLab-ytelsen."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "Verifiseringsstatus"
@@ -41834,7 +42077,7 @@ msgstr "identifikatorer"
msgid "Vulnerability|Image"
msgstr "Bilde"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr "Webhook-hjelp"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42240,7 +42480,7 @@ msgid "Webhooks|Wiki page events"
msgstr "Wiki-sidehendelser"
msgid "Website"
-msgstr ""
+msgstr "Nettsted"
msgid "Website:"
msgstr "Nettsted:"
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr "Hva er Markdown?"
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr "Hva er tidssporing?"
-
msgid "What is your job title? (optional)"
msgstr "Hva er jobbtittelen din? (valgfritt)"
@@ -42315,7 +42549,7 @@ msgid "What will you use this group for?"
msgstr ""
msgid "What would you like to do?"
-msgstr ""
+msgstr "Hva vil du gjøre?"
msgid "What's new"
msgstr "Hva er nytt"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "Når denne fletteforespørselen godtas"
@@ -42385,7 +42616,7 @@ msgstr "Hvem skal bruke denne GitLab-prøveversjonen?"
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "Du mottar denne meldingen fordi du er en GitLab-administrator for %{url}."
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr "godkjent av: "
-
msgid "archived"
msgstr "arkivert"
@@ -43824,7 +44075,7 @@ msgid "branch name"
msgstr "grennavn"
msgid "builds"
-msgstr ""
+msgstr "byggversjoner"
msgid "by"
msgstr "av"
@@ -43838,6 +44089,15 @@ msgstr ""
msgid "can contain only lowercase letters, digits, and '_'."
msgstr "kan bare inneholde små bokstaver, sifre, og '_'."
+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 ""
@@ -43906,8 +44166,8 @@ msgstr "kan ikke flette"
msgid "change"
msgid_plural "changes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "endre"
+msgstr[1] "forandringer"
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
msgstr ""
@@ -43975,6 +44235,9 @@ msgstr "Alle alvorlighetsgrader"
msgid "ciReport|All tools"
msgstr "Alle verktøy"
+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 ""
@@ -44282,7 +44545,7 @@ msgid "data"
msgstr "data"
msgid "database"
-msgstr ""
+msgstr "database"
msgid "date must not be after 9999-12-31"
msgstr ""
@@ -44691,8 +44954,8 @@ msgid_plural "merge requests"
msgstr[0] "fletteforespørsel"
msgstr[1] "fletteforespørsler"
-msgid "merged %{timeAgo}"
-msgstr "flettet %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44703,6 +44966,12 @@ msgstr "mangler"
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 "1 innflettings-commit"
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr "Avbryt auto-innfletting"
-msgid "mrWidget|Check out branch"
-msgstr "Sjekk ut grenen"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "Send e-post ved programrettelser"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr "Ã…pne i Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Ã…pne i nett-IDE"
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr "min-kule-gruppe"
msgid "my-channel"
msgstr "min-kanal"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "trenger oppmerksomhet"
@@ -45112,9 +45381,6 @@ msgstr "utløper aldri"
msgid "new merge request"
msgstr "ny fletteforespørsel"
-msgid "no approvers"
-msgstr "ingen godkjennere"
-
msgid "no expiration"
msgstr "ingen utløpsdato"
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr "ingen"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "ikke funnet"
@@ -45188,9 +45460,6 @@ msgstr "avventende kommentar"
msgid "pending deletion"
msgstr "avventer sletting"
-msgid "per day"
-msgstr "per dag"
-
msgid "personal access token"
msgstr ""
@@ -45320,9 +45589,12 @@ msgid_plural "replies"
msgstr[0] "svar"
msgstr[1] "svar"
-msgid "repositories"
+msgid "reply should have same confidentiality as top-level note"
msgstr ""
+msgid "repositories"
+msgstr "kodelagre"
+
msgid "repository:"
msgstr "kodelager:"
@@ -45599,5 +45871,5 @@ msgid "{project}"
msgstr ""
msgid "✔"
-msgstr ""
+msgstr "✔"
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 52214299ecd..578734b253c 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "1e bijdrage!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Annuleren"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr "Gecommit door"
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/or_IN/gitlab.po b/locale/or_IN/gitlab.po
index 54dcfa7fa04..a6fc7b0065d 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po
index 1d0c5b83e5f..d0562d9c385 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index ad0d4efa7db..1ab96b848a1 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:14\n"
+"PO-Revision-Date: 2022-05-01 06:55\n"
msgid " %{start} to %{end}"
msgstr " %{start} do %{end}"
@@ -343,13 +343,6 @@ msgstr[1] "%d grupy"
msgstr[2] "%d grup"
msgstr[3] "%d grupy"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d zaznaczona grupa"
-msgstr[1] "%d zaznaczone grupy"
-msgstr[2] "%d zaznaczonych grup"
-msgstr[3] "%d zaznaczonej grupy"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d godzina"
@@ -511,13 +504,6 @@ msgstr[1] "%d sekundy"
msgstr[2] "%d sekund"
msgstr[3] "%d sekundy"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d wybrany fragment"
-msgstr[1] "%d wybrane fragmenty"
-msgstr[2] "%d wybranych fragmentów"
-msgstr[3] "%d wybranego fragmentu"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,8 +659,8 @@ msgstr ""
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open} Maskowanie:%{code_close} Ukryte w logu zadań. Musi spełnić wymagania maskowania."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Chronione%{code_close} Widoczne tylko dla chronionych branchy lub tagów."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr ""
@@ -826,6 +812,9 @@ msgstr "%{edit_in_new_fork_notice} Spróbuj ponownie wysłać plik."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@firma.pl"
+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 "%{extra} więcej potoków downstream"
@@ -955,9 +944,6 @@ msgstr "%{level_name} nie jest dozwolone w grupie %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie zosta
msgstr[2] "Wyniki %{securityScanner} są niedostępne, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
msgstr[3] "Wyniki %{securityScanner} jest niedostępnych, ponieważ potok nie został uruchomiony od czasu jego włączenia. %{linkStart}Uruchom potok%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1483,9 +1463,6 @@ msgstr[1] "+%d więcej"
msgstr[2] "+%d więcej"
msgstr[3] "+%d więcej"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} więcej osób zatwierdzających"
-
msgid "+%{extra} more"
msgstr "+%{extra} więcej"
@@ -1551,6 +1528,9 @@ msgstr "."
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bajtów"
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Pierwszy wkład!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 wkładów"
@@ -1808,9 +1794,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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"
@@ -1856,9 +1839,6 @@ msgstr "ZarzÄ…dzanie i kontrola operacyjna lub techniczna (tzn. kontrola zabezpi
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Członek zespołu ds. nadużyć zweryfikuje Twoje zgłoszenie tak szybko, jak to możliwe."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ msgstr ""
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "Niepoufny epik nie może być przypisany do poufnego epika nadrzędnego"
+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 "Zwykła strona HTML, która używa Netlify dla CI/CD zamiast GitLab'a, ale nadal ze wszystkimi innymi wspaniałymi funkcjami GitLab"
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr "Dodaj liniÄ™"
msgid "Add a link"
msgstr "Dodaj link"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr "Dodaj nowe zgłoszenie"
@@ -2429,6 +2400,9 @@ msgstr "Dodaj regułę zatwierdzania"
msgid "Add approvers"
msgstr "Dodaj zatwierdzajÄ…cych"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Dodaj pogrubiony tekst"
@@ -2588,15 +2562,15 @@ msgstr "Dodaj wcześniej zmergowane commity"
msgid "AddContextCommits|Add/remove"
msgstr "Dodaj/usuń"
-msgid "AddMember|Emails cannot be blank"
-msgstr "E-maile nie mogą być puste"
-
msgid "AddMember|Invite email is invalid"
msgstr "Zapraszający e-mail jest nieprawidłowy"
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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 "Token kanału informacyjnego"
@@ -2918,12 +2916,24 @@ 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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Zachowaj ostatnie artefakty dla wszystkich zadań w ostatnich udanych potokach"
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 "Maksymalny czas trwania sesji dla operacji Git, gdy włączone jest uwierzytelnianie dwuskładnikowe"
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Aktywni użytkownicy"
@@ -3881,6 +3933,9 @@ msgstr "Wszystkie projekty"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Wszystkie wÄ…tki rozwiÄ…zane"
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr "Zezwalaj na dostęp do następujących adresów IP"
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr "Zezwalaj podgrupom na ustawianie własnych reguł uwierzytelniania dwusk
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr "Pozwól użytkownikom prosić o dostęp (jeśli widoczność jest public
msgid "Allowed"
msgstr "Dozwolone"
-msgid "Allowed Geo IP"
-msgstr "Geo IP dozwolone"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Dozwolone znaki: +, 0-9, - i spacje."
@@ -4334,6 +4389,9 @@ msgstr "Wystąpił błąd podczas przetwarzania pliku."
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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr "Aplikacja została pomyślnie zaktualizowana."
msgid "Application: %{name}"
msgstr "Aplikacja: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown włączony"
-
-msgid "ApplicationSettings|Minimum password length (number of characters)"
+msgid "ApplicationSettings|Enter denylist manually"
msgstr ""
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr ""
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 "Zapisz zmiany"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
-msgstr "Limit użytkownika"
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+msgid "ApplicationSettings|User cap"
+msgstr "Limit użytkownika"
+
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-msgstr "Profile Żądań"
-
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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr "Harmonogram"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr "Uruchom nieoznaczone zadania"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr "Robotnicy"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "Liczba Robotników online: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Strona robotników."
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-msgstr "Przetwarzanie pokrycia testowego"
-
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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 549569e15bd..a1a0368896a 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr " %{start} até %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d grupo"
msgstr[1] "%d grupos"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d grupo selecionado"
-msgstr[1] "%d grupos selecionados"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d hora"
@@ -337,8 +332,8 @@ msgstr[1] "mais %d comentários"
msgid "%d new license"
msgid_plural "%d new licenses"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d nova licença"
+msgstr[1] "%d novas licenças"
msgid "%d open issue"
msgid_plural "%d open issues"
@@ -377,19 +372,14 @@ msgstr[1] "%d projetos selecionados"
msgid "%d removed license"
msgid_plural "%d removed licenses"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d licença removida"
+msgstr[1] "%d licenças removidas"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d segundo"
msgstr[1] "%d segundos"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d shard selecionado"
-msgstr[1] "%d shards selecionados"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -442,8 +432,8 @@ msgstr[1] "%d vulnerabilidades definidas como confirmadas"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d vulnerabilidade definida para triagem de necessidades"
+msgstr[1] "%d vulnerabilidades definidas para triagem de necessidades"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
@@ -503,16 +493,16 @@ msgstr[0] "%{bold_start}%{count}%{bold_end} solicitação de mesclagem aberta"
msgstr[1] "%{bold_start}%{count}%{bold_end} solicitações de mesclagem abertas"
msgid "%{codeStart}type%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stage%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
-msgstr "%{codeStart}type%{codeEnd} está obsoleto e será removido na versão 15.0. Use %{codeStart}stage%{codeEnd} em vez disso. %{linkStart}Saiba mais %{linkEnd}"
+msgstr "%{codeStart}type%{codeEnd} está descontinuado e será removido na versão 15.0. Use %{codeStart}stage%{codeEnd} em vez disso. %{linkStart}Saiba mais %{linkEnd}"
msgid "%{codeStart}types%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stages%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
-msgstr "%{codeStart}types%{codeEnd} está obsoleto e será removido na versão 15.0. Use %{codeStart}stages%{codeEnd} em vez disso. %{linkStart}Saiba mais %{linkEnd}"
+msgstr "%{codeStart}types%{codeEnd} está descontinuado e será removido na versão 15.0. Use %{codeStart}stages%{codeEnd} em vez disso. %{linkStart}Saiba mais %{linkEnd}"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}Mascarado:%{code_close} Escondidos nos logs de tarefas. Deve corresponder a requisitos de mascaramento."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Protegido:%{code_close} Somente exposto a ramificações ou tags protegidas."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} criou %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Tente carregar um arquivo novamente."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@empresa.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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} mais downstream pipelines"
@@ -781,21 +774,15 @@ msgstr "%{level_name} não é permitido em um grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido, pois o projeto de origem do fork possui menor visibilidade."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}Saiba mais.%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr ""
+msgstr "%{link_start}Remova o %{draft_snippet} prefixo%{link_end} do título para permitir que este merge seja feito assim que estiver disponível."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
msgstr "%{link_start}Inicie o título com %{draft_snippet}%{link_end} para evitar que uma solicitação de mesclagem de código de um trabalho em andamento seja executada antes de estar pronta."
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Quais informações o GitLab Inc. coleta?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, e %{awardsListLength} mais"
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] "+%d mais"
msgstr[1] "+%d mais"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} mais aprovadores"
-
msgid "+%{extra} more"
msgstr "+%{extra} mais"
@@ -1343,6 +1324,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bytes"
@@ -1467,6 +1451,9 @@ msgstr[1] "%d anos restantes"
msgid "1-9 contributions"
msgstr "1-9 contribuições"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 contribuições"
@@ -1479,6 +1466,9 @@ msgstr "192.168.0.0/24 ou 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "1ª contribuição!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 contribuições"
@@ -1554,9 +1544,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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"
@@ -1602,9 +1589,6 @@ msgstr "Uma controle de gestão, operacional ou técnico (ou seja, salvaguarda o
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Um membro da equipe de abusos irá rever a sua avaliação assim que possível."
-msgid "A merge request hasn't yet been merged"
-msgstr "Uma solicitação de mesclagem ainda não foi mesclada"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1615,7 +1599,7 @@ msgid "A new Release %{tag} for %{name} was published. Visit the Releases page t
msgstr ""
msgid "A new email address has been added to your GitLab account: %{email}"
-msgstr ""
+msgstr "Um novo endereço de e-mail foi adicionado à sua conta do GitLab: %{email}"
msgid "A new impersonation token has been created."
msgstr "Um novo token de representação foi criado."
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1819,7 +1806,7 @@ msgid "About this feature"
msgstr "Sobre essa funcionalidade"
msgid "About your company"
-msgstr ""
+msgstr "Sobre a sua empresa"
msgid "Abuse Reports"
msgstr "Relatórios de abuso"
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ msgstr "Validar sua conta"
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 "AccountValidation|unsubscribe"
-msgstr "cancelar inscrição"
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr "Adicionar uma linha"
msgid "Add a link"
msgstr "Adicionar um link"
-msgid "Add a link to Grafana"
-msgstr "Adicionar um link para Grafana"
-
msgid "Add a new issue"
msgstr "Adicionar uma nova issue"
@@ -2175,6 +2150,9 @@ msgstr "Adicionar regra de aprovação"
msgid "Add approvers"
msgstr "Adicionar aprovadores"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Adicionar texto em negrito"
@@ -2197,7 +2175,7 @@ msgid "Add commit messages as comments to Asana tasks. %{docs_link}"
msgstr "Adicione mensagens de commit como comentários às tarefas Asana. %{docs_link}"
msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
-msgstr ""
+msgstr "Adicione mensagens de confirmação como comentários às histórias do Pivotal Tracker. %{docs_link}"
msgid "Add customer relation contact(s)."
msgstr ""
@@ -2281,7 +2259,7 @@ msgid "Add system hook"
msgstr "Adicionar system hook"
msgid "Add text to the sign-in page. Markdown enabled."
-msgstr ""
+msgstr "Adicione texto à página de entrada. Markdown ativado."
msgid "Add to board"
msgstr "Adicionar ao painel"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr "Adicionar/remover"
-msgid "AddMember|Emails cannot be blank"
-msgstr "E-mail não pode ficar em branco"
-
msgid "AddMember|Invite email is invalid"
msgstr "E-mail de Convite é inválido"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Excedido o limite de convite de %{daily_invites} por dia"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "Nenhuma fonte de convite fornecida."
@@ -2506,7 +2484,7 @@ msgid "AdminArea|Included Free in license"
msgstr "Incluído gratuitamente na licença"
msgid "AdminArea|Instance OAuth applications"
-msgstr ""
+msgstr "Instância de aplicativos OAuth"
msgid "AdminArea|Latest groups"
msgstr "Grupos recentes"
@@ -2536,7 +2514,7 @@ msgid "AdminArea|New user"
msgstr "Novo usuário"
msgid "AdminArea|No applications found"
-msgstr ""
+msgstr "Nenhum aplicativo encontrado"
msgid "AdminArea|Owner"
msgstr "Proprietário"
@@ -2595,12 +2573,6 @@ msgstr "Você parará todas as tarefas. Os processos em execução serão abrupt
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Erro ao carregar as estatísticas. Por favor, tente novamente"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr "A URL do site primário é usada internalmente por sites secundários."
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr "A URL do site secundário é usada internalmente pelo site primário."
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2632,11 +2604,14 @@ msgid "AdminSettings|Auto DevOps domain"
msgstr "Domínio de Auto DevOps"
msgid "AdminSettings|CI/CD limits"
-msgstr ""
+msgstr "Limites de CI/CD"
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurar Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "Desativar token de feed"
@@ -2649,12 +2624,39 @@ msgstr "Mostre um banner em solicitações de mesclagem em projetos sem pipeline
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 "A verificação de domínio é uma medida de segurança essencial para sites GitLab públicos. Os usuários devem demonstrar que controlam um domínio antes de habilitá-lo. %{link_start}Saiba mais.%{link_end}"
+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 kuromoji custom analyzer: Indexing"
+msgstr ""
+
+msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
+msgstr ""
+
msgid "AdminSettings|Enable pipeline suggestion banner"
msgstr "Ativar banner de sugestão de pipeline"
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Ativar executores compartilhados para novos projetos"
+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 "Token de feed"
@@ -2664,12 +2666,24 @@ msgstr "Li e concordo com os termos de serviço%{link_end} %{link_start}(PDF) de
msgid "AdminSettings|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 "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Manter os artefatos mais recentes para todas as tarefas nos pipelines de sucesso mais recentes"
msgid "AdminSettings|Let's Encrypt email"
msgstr "E-mail de Let's Encrypt"
+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 "Duração máxima de uma sessão para operações Git quando o 2FA está ativado."
@@ -2677,22 +2691,22 @@ msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
msgstr ""
msgid "AdminSettings|Maximum number of active pipelines per project"
-msgstr ""
+msgstr "Número máximo de pipelines ativos por projeto"
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
-msgstr ""
+msgstr "Número máximo de tarefas em um único pipeline"
msgid "AdminSettings|Maximum number of pipeline schedules"
-msgstr ""
+msgstr "Número máximo de agendamentos de pipeline"
msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
msgstr ""
msgid "AdminSettings|Maximum number of runners registered per group"
-msgstr ""
+msgstr "Número máximo de executores registrados por grupo"
msgid "AdminSettings|Maximum number of runners registered per project"
-msgstr ""
+msgstr "Número máximo de executores registrados por projeto"
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "Novas variáveis CI/CD em projetos e grupos padrão para protegidos."
@@ -2700,16 +2714,37 @@ msgstr "Novas variáveis CI/CD em projetos e grupos padrão para protegidos."
msgid "AdminSettings|No required pipeline"
msgstr "Nenhum pipeline necessário"
+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 "Proteger variáveis CI/CD por padrão"
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
msgstr "Exigir que os usuários comprovem a propriedade de domínios personalizados"
msgid "AdminSettings|Required pipeline configuration"
msgstr "Configuração de pipeline necessária"
+msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "AdminSettings|Save %{name} limits"
+msgstr "Salvar limites de %{name}"
+
+msgid "AdminSettings|Search with Elasticsearch enabled"
msgstr ""
msgid "AdminSettings|Select a CI/CD template"
@@ -2721,6 +2756,9 @@ msgstr "Selecione um grupo para usar como fonte para modelos de projeto em níve
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|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 "Duração da sessão para operações do Git quando 2FA está ativado (minutos)"
@@ -2728,13 +2766,13 @@ msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration
msgstr ""
msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
+msgstr "Defina o limite como 0 para desativá-lo."
msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
msgstr "Defina o nome inicial e as proteções para a ramificação padrão dos novos repositórios criados na instância."
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
-msgstr ""
+msgstr "Defina o tamanho máximo de páginas GitLab por projeto (0 para ilimitado). %{link_start}. Saiba mais.%{link_end}"
msgid "AdminSettings|Size and domain settings for Pages static sites."
msgstr "Configurações de tamanho e domínio para sites estáticos do Pages."
@@ -2751,7 +2789,25 @@ 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 "Número total de tarefas em pipelines ativos no momento"
+
+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|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 "AdminStatistics|Active Users"
@@ -2827,7 +2883,7 @@ msgid "AdminUsers|Active"
msgstr "Ativo"
msgid "AdminUsers|Adjust the user cap setting on your instance"
-msgstr ""
+msgstr "Ajuste a configuração do limite do usuário na sua instância"
msgid "AdminUsers|Admin"
msgstr "Administrador"
@@ -3154,7 +3210,7 @@ msgid "Administration"
msgstr "Administração"
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 ""
+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}."
msgid "Admin|Admin notes"
msgstr "Notas de administrador"
@@ -3627,6 +3683,9 @@ msgstr "Todos os projetos"
msgid "All projects selected"
msgstr "Todos os projetos selecionados"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Todos tópicos resolvidos"
@@ -3642,14 +3701,20 @@ 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 ""
+
+msgid "Allow access to everyone"
+msgstr ""
+
msgid "Allow access to members of the following group"
msgstr "Permitir o acesoaos membros do seguinte grupo"
msgid "Allow access to the following IP addresses"
msgstr "Permitir acesso aos seguintes endereços de IP"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Permitir commits de membros que podem mesclar na ramificação de destino."
+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 "Permitir que proprietários de grupos gerenciem configurações relacionadas ao LDAP"
@@ -3690,9 +3755,6 @@ msgstr "Permitir que subgrupos configurem suas próprias regras de autenticaçã
msgid "Allow this key to push to this repository"
msgstr "Permitir que esta chave faça push para este repositório"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr "Permitir o uso de funcionalidades da licença EE"
@@ -3708,9 +3770,6 @@ msgstr "Permitir que os usuários requisitar acesso (se a visibilidade for públ
msgid "Allowed"
msgstr "Permitido"
-msgid "Allowed Geo IP"
-msgstr "Geo IP permitido"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Caracteres permitidos: +, 0-9, - e espaços."
@@ -3754,7 +3813,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 de suporte alternativo para a página de Ajuda e lista suspensa de Ajuda."
msgid "Alternatively, you can convert your account to a managed account by the %{group_name} group."
msgstr ""
@@ -4080,6 +4139,9 @@ msgstr "Ocorreu um erro ao analisar o arquivo."
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 "Ocorreu um erro ao remover épicos."
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr "Ocorreu um erro ao enviar o arquivo. Por favor, tente novamente."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "Ocorreu um erro ao enviar a imagem. Por favor, tente novamente"
-
msgid "An error occurred while validating group path"
msgstr "Ocorreu um erro ao validar o caminho do grupo"
@@ -4223,9 +4282,6 @@ msgstr "Ocorreu um erro desconhecido."
msgid "Analytics"
msgstr "Telemetria"
-msgid "Analyze a review version of your web application."
-msgstr "Analise uma versão de revisão da sua aplicação web."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analise suas dependências em busca de vulnerabilidades conhecidas."
@@ -4256,6 +4312,9 @@ msgstr "Outra ação está atualmente em progresso"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Outro rastreador de issue já está em uso. Somente um serviço de rastreador de issue pode estar ativo por vez"
+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 "Verificação anti-spam"
@@ -4334,12 +4393,27 @@ msgstr "Aplicação foi atualizada com sucesso."
msgid "Application: %{name}"
msgstr "Aplicativo: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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 "Domínios permitidos para inscrições"
+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] "Aprovar %d usuário"
@@ -4366,7 +4440,7 @@ msgid "ApplicationSettings|Denied domains for sign-ups"
msgstr "Domínios negados para inscrições"
msgid "ApplicationSettings|Denylist file"
-msgstr ""
+msgstr "Arquivo de lista de restrição"
msgid "ApplicationSettings|Domain denylist"
msgstr "Lista de restrição de domínio"
@@ -4377,61 +4451,58 @@ msgstr "Restrições de e-mail"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restrições de e-mail para cadastro"
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
-msgstr "Ativar lista de restrição de domínio para cadastro"
+msgid "ApplicationSettings|Enable Slack application"
+msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
-msgstr "Ativar restrições de e-mail para cadastro"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
+msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown ativado"
+msgid "ApplicationSettings|Enter denylist manually"
+msgstr "Inserir lista de restrição manualmente"
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "Comprimento mínimo de senha (número de caracteres)"
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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 ""
+msgstr "Requer aprovação do administrador para novos cadastros"
-msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 "Salvar mudanças"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr "Enviar e-mail de confirmação no cadastro"
msgid "ApplicationSettings|Sign-up enabled"
+msgstr "Cadastro ativado"
+
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
+msgid "ApplicationSettings|Upload denylist file"
+msgstr "Carregar arquivo de lista de restrição"
+
msgid "ApplicationSettings|User cap"
msgstr "Limite de usuários"
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
-msgstr "Os usuários com endereços de e-mail que correspondam a esses domínios NÃO poderão se inscrever. Caracteres curinga permitidos. Use linhas ou vírgulas separadas para várias entradas."
-
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr "Aplicando sugestão..."
msgid "Applying suggestions..."
msgstr "Aplicando sugestões..."
-msgid "Approval Status"
-msgstr "Status de aprovação"
-
msgid "Approval rules"
msgstr "Regra de aprovação"
@@ -4681,15 +4749,6 @@ msgstr "Esta configuração está caracterizada no nível de instância e pode s
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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr "As aprovações são opcionais."
@@ -4805,7 +4864,7 @@ msgid "Are you sure you want to delete this %{typeOfComment}?"
msgstr "Tem certeza de que deseja excluir este %{typeOfComment}?"
msgid "Are you sure you want to delete this SSH key?"
-msgstr ""
+msgstr "Tem certeza que deseja excluir esta chave SSH?"
msgid "Are you sure you want to delete this comment?"
msgstr "Você realmente deseja excluir este comentário?"
@@ -5221,7 +5280,7 @@ msgstr "Agosto"
msgid "Authenticate"
msgstr "Autenticar"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr "Falha de autenticação"
msgid "Authentication Log"
msgstr "Registro de autenticação"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Autenticação falhou: %{error_message}"
@@ -5446,8 +5508,8 @@ msgstr "ID disponível"
msgid "Available group runners: %{runners}"
msgstr "Executores de grupo disponíveis: %{runners}"
-msgid "Available runners: %{runners}"
-msgstr "Executores disponíveis: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "Executores compartilhados disponíveis:"
@@ -5599,8 +5661,8 @@ msgstr ""
msgid "Based on"
msgstr "Baseado em"
-msgid "Basic information"
-msgstr "Informação básica"
+msgid "Batch size"
+msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr "Cuidado. Alterar o espaço de nome do projeto pode ter efeitos colaterais indesejados."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Abaixo você encontrará todos os grupos que são públicos."
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "Cobertura semestral de código"
@@ -5737,12 +5796,21 @@ msgstr "Ao estender a sua avaliação, você receberá 30 dias adicionais de %{p
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
msgstr "Ao reativar a sua avaliação, você receberá 30 dias adicionais de %{planName}. Sua avaliação só pode ser reativada uma vez."
+msgid "Billings|Error validating card details"
+msgstr ""
+
msgid "Billings|Extend trial"
msgstr "Estender avaliação"
msgid "Billings|Reactivate trial"
msgstr "Reativar avaliação"
+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 "Executores compartilhados não podem ser ativados até que um cartão de crédito válido seja registrado."
@@ -5770,22 +5838,28 @@ msgstr "A sua conta foi validada."
msgid "Billing|%{user} was successfully approved"
msgstr "O %{user} foi aprovado com sucesso"
+msgid "Billing|Add seats"
+msgstr ""
+
msgid "Billing|An email address is only visible for users with public emails."
msgstr "Um endereço de e-mail só é visível para usuários com e-mails públicos."
msgid "Billing|An error occurred while approving %{user}"
msgstr "Ocorreu um erro ao aprovar o %{user}"
-msgid "Billing|An error occurred while getting a billable member details"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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 "Ocorreu um erro ao carregar a lista de membros pendentes."
-msgid "Billing|An error occurred while removing a billable member"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr "Membros diretos"
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "Exportar lista"
-msgid "Billing|Group"
-msgstr "Grupo"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
msgid "Billing|Group invite"
msgstr "Convite de grupo"
+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 ""
@@ -5833,9 +5913,6 @@ msgstr "Digite %{username} para confirmar"
msgid "Billing|User was successfully removed"
msgstr "O usuário foi removido com sucesso"
-msgid "Billing|Users occupying seats in"
-msgstr "Usuários que ocupam assentos em"
-
msgid "Billing|View pending approvals"
msgstr "Ver aprovações pendentes"
@@ -5917,7 +5994,7 @@ msgid "BoardNewIssue|Select a project"
msgstr "Selecione um projeto"
msgid "BoardScope|An error occurred while getting iterations. Please try again."
-msgstr ""
+msgstr "Ocorreu um erro ao obter iterações. Por favor, tente novamente."
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "Ocorreu um erro ao obter os marcos, por favor, tente novamente."
@@ -5935,7 +6012,7 @@ msgid "BoardScope|Any assignee"
msgstr "Qualquer responsável"
msgid "BoardScope|Any iteration"
-msgstr ""
+msgstr "Qualquer iteração"
msgid "BoardScope|Any label"
msgstr "Qualquer etiqueta"
@@ -5947,13 +6024,13 @@ msgid "BoardScope|Choose labels"
msgstr "Escolher etiqueta"
msgid "BoardScope|Current iteration"
-msgstr ""
+msgstr "Iteração atual"
msgid "BoardScope|Edit"
msgstr "Editar"
msgid "BoardScope|Iteration"
-msgstr ""
+msgstr "Iteração"
msgid "BoardScope|Labels"
msgstr "Etiqueta"
@@ -5962,13 +6039,13 @@ msgid "BoardScope|Milestone"
msgstr "Marco"
msgid "BoardScope|No iteration"
-msgstr ""
+msgstr "Nenhuma interação"
msgid "BoardScope|No milestone"
msgstr "Nenhum marco"
msgid "BoardScope|Search iterations"
-msgstr ""
+msgstr "Pesquisar iterações"
msgid "BoardScope|Search milestones"
msgstr "Buscar marco"
@@ -5977,7 +6054,7 @@ msgid "BoardScope|Select assignee"
msgstr "Selecionar responsável"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "Selecionar iteração"
msgid "BoardScope|Select labels"
msgstr "Selecionar etiquetas"
@@ -6229,9 +6306,6 @@ msgstr "Visão Geral"
msgid "Branches|Please type the following to confirm:"
msgstr "Por favor, digite o seguinte para confirmar"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Ramificações protegidas podem ser gerenciadas em %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Mostrar branches ativas"
@@ -6289,9 +6363,6 @@ msgstr "divergido do upstream"
msgid "Branches|merged"
msgstr "mesclado"
-msgid "Branches|project settings"
-msgstr "configurações do projeto"
-
msgid "Branches|protected"
msgstr "protegido"
@@ -6350,6 +6421,9 @@ msgid "BulkImport|%{feature} (require v%{version})"
msgstr ""
msgid "BulkImport|Destination"
+msgstr "Destino"
+
+msgid "BulkImport|Destination group"
msgstr ""
msgid "BulkImport|Existing groups"
@@ -6367,6 +6441,9 @@ msgstr "Do grupo de origem"
msgid "BulkImport|Group import history"
msgstr "Histórico de importação de grupo"
+msgid "BulkImport|History"
+msgstr ""
+
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
msgstr ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr "Novo grupo"
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6404,7 +6478,7 @@ msgid "BulkImport|No parent"
msgstr ""
msgid "BulkImport|Project import history"
-msgstr ""
+msgstr "Histórico de importação do projeto"
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
msgstr ""
@@ -6419,7 +6493,7 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter
msgstr ""
msgid "BulkImport|Source"
-msgstr ""
+msgstr "Fonte"
msgid "BulkImport|Source group"
msgstr "Grupo de fonte"
@@ -6520,9 +6594,6 @@ msgstr "Configurações de CI"
msgid "CI variables"
msgstr "Variáveis de CI"
-msgid "CI will run using the credentials assigned above."
-msgstr "O CI será executado usando as credenciais atribuídas acima."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "Configuração de CI/CD"
msgid "CI/CD configuration file"
msgstr "Arquivo de configuração de CI/CD"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr "Frequência de implantação"
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,8 +6701,8 @@ msgstr "Limite de acesso de CI_JOB_TOKEN"
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr "Selecione projetos que podem ser acessados por solicitações de API autenticadas com a variável CI_JOB_TOKEN deste projeto."
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr "O pipeline Auto DevOps é executado por padrão em todos os projetos sem arquivo de configuração CI/CD."
+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 "O pipeline de Auto DevOps será executado se nenhum arquivo de configuração de CI alternativo for encontrado."
@@ -6792,6 +6869,12 @@ msgstr "Cancelar"
msgid "Cancel and close"
msgstr "Cancelar e fechar"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Cancelar exclusão do índice"
@@ -7026,9 +7109,15 @@ msgstr "Alterado"
msgid "Changed assignee(s)."
msgstr ""
+msgid "Changed merge method to %{merge_method}"
+msgstr ""
+
msgid "Changed reviewer(s)."
msgstr "Revisor(es) alterados."
+msgid "Changed squash option to %{squash_option}"
+msgstr ""
+
msgid "Changed the title to \"%{title_param}\"."
msgstr "Alterou o título para \"%{title_param}\"."
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Verifique Novamente"
msgid "Check feature availability on namespace plan"
msgstr "Verificar disponibilidade de funcionalidades no plano de espaço de nome"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr "Detalhes da assinatura"
msgid "Checkout|Subtotal"
msgstr "Subtotal"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Impostos"
@@ -7402,6 +7500,9 @@ msgstr "O épico filho não existe."
msgid "Child epic doesn't exist."
msgstr "O épico filho não existe."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Escolha qualquer cor."
msgid "Choose file…"
msgstr "Escolher arquivo…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Limpar"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr "Limpar todas as verificações de repositório"
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "%{number} de %{total} agentes"
@@ -7859,7 +7965,7 @@ msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "Agente %{strongStart}conectado%{strongEnd}"
msgid "ClusterAgents|Agent access token:"
-msgstr ""
+msgstr "Token de acesso do agente:"
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "O agente pode não estar conectado ao GitLab"
@@ -7879,14 +7985,14 @@ msgstr "Atualização de versão do agente necessária"
msgid "ClusterAgents|All"
msgstr "Todos"
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr "Ocorreu um erro ao carregar seu agente."
-
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "Ocorreu um erro ao carregar seu agente."
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr "Ocorreu um erro ao recuperar a atividade do GitLab Agent. Recarregue a página para tentar novamente."
+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 "Ocorreu um erro desconhecido. Por favor, tente novamente."
@@ -7894,6 +8000,9 @@ msgstr "Ocorreu um erro desconhecido. Por favor, tente novamente."
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 "Certificado"
@@ -7901,25 +8010,19 @@ msgid "ClusterAgents|Configuration"
msgstr "Configuração"
msgid "ClusterAgents|Connect a Kubernetes cluster"
-msgstr ""
+msgstr "Conectar um cluster Kubernetes"
msgid "ClusterAgents|Connect a cluster"
-msgstr ""
+msgstr "Conectar um cluster"
msgid "ClusterAgents|Connect a cluster (agent)"
-msgstr ""
+msgstr "Conectar um cluster (agente)"
msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "Conectar um cluster (certificado - descontinuado)"
msgid "ClusterAgents|Connect a cluster (deprecated)"
-msgstr ""
-
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Conectar um cluster existente"
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr "Conectar com o GitLab Agent"
+msgstr "Conectar um cluster (descontinuado)"
msgid "ClusterAgents|Connected"
msgstr "Conectado"
@@ -7934,13 +8037,13 @@ msgid "ClusterAgents|Copy token"
msgstr "Copiar token"
msgid "ClusterAgents|Create a cluster"
-msgstr ""
+msgstr "Criar um cluster"
msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "Criar um cluster (certificado - descontinuado)"
msgid "ClusterAgents|Create a cluster (deprecated)"
-msgstr ""
+msgstr "Criar um cluster (descontinuado)"
msgid "ClusterAgents|Create agent access token"
msgstr ""
@@ -7970,7 +8073,7 @@ msgid "ClusterAgents|Delete agent"
msgstr "Excluir agente"
msgid "ClusterAgents|Deprecated"
-msgstr "Obsoleto"
+msgstr "Descontinuado"
msgid "ClusterAgents|Description"
msgstr "Descrição"
@@ -7984,14 +8087,14 @@ msgstr "Falha ao criar um token"
msgid "ClusterAgents|Failed to register an agent"
msgstr "Falha ao registrar um agente"
-msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+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 "GitLab Agent"
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr "GitLab Agent para Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr "Dar feedback"
@@ -8002,8 +8105,8 @@ msgstr "Como registrar um agente?"
msgid "ClusterAgents|How to update an agent?"
msgstr "Como atualizar um agente?"
-msgid "ClusterAgents|Install a new agent"
-msgstr "Instalar um novo agente"
+msgid "ClusterAgents|Install using Helm (recommended)"
+msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "Última conexão %{timeAgo}."
@@ -8026,6 +8129,11 @@ msgstr "Nunca"
msgid "ClusterAgents|Never connected"
msgstr "Nunca conectado"
+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 "Sem agentes"
@@ -8038,9 +8146,6 @@ msgstr "Não conectado"
msgid "ClusterAgents|Recommended"
msgstr "Recomendado"
-msgid "ClusterAgents|Recommended installation method"
-msgstr "Método de instalação recomendado"
-
msgid "ClusterAgents|Register"
msgstr "Registrar"
@@ -8050,20 +8155,23 @@ msgstr "Registrando agente"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "Requer um mantenedor ou função superior para excluir agentes"
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr "Requer um mantenedor ou função superior para excluir agentes"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr "Requer um mantenedor ou função superior para excluir agentes"
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-msgstr "Requer um mantenedor ou função superior para excluir agentes"
+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 "Segurança"
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
-msgstr "Consulte atualizações de atividade do agente, como tokens criados ou revogados e clusters conectados ou não conectados."
+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 "Selecione um agente ou digite um nome para criar um novo"
@@ -8071,7 +8179,7 @@ msgstr "Selecione um agente ou digite um nome para criar um novo"
msgid "ClusterAgents|Tell us what you think"
msgstr "Diga-nos o que você pensa"
-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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "ClusterAgents|This agent has no tokens"
msgstr "Este agente não tem tokens"
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 "Token criado por %{userName}"
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr "Conectar um cluster Kubernetes"
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr "Conecte-se com um certificado"
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr "Conecte seu cluster ao GitLab por meio de %{linkStart}certificados de cluster%{linkEnd}."
@@ -8761,7 +8864,7 @@ 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 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}obsoleto%{linkEnd}no 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."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Esta opção permite-lhe instalar aplicações em clusters RBAC."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,8 +8926,8 @@ msgstr "Erro desconhecido"
msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
msgstr "Use o GitLab para implantar em seu cluster, executar tarefas, usar aplicativos de revisão e muito mais."
-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 "Use o %{linkStart}GitLab Agent%{linkEnd} para conectar com segurança seus clusters deKubernetes ao GitLab. Você pode implantar seus aplicativos, executar seus pipelines, usar aplicativos de revisão e muito mais."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "Usa os complementos Cloud Run, Istio, e Balanceamento de Carga HTTP para este cluster."
@@ -8994,9 +9100,6 @@ msgstr "ComboSearch não está definido"
msgid "Comma-separated list of email addresses."
msgstr "Lista de endereços de e-mail separados por vírgula."
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr "Comando"
@@ -9119,9 +9222,6 @@ msgstr "Nenhuma solicitação de mesclagem relacionada foi encontrada"
msgid "Committed by"
msgstr "Commit feito por"
-msgid "Commit…"
-msgstr "Commit…"
-
msgid "Community forum"
msgstr "Fórum da comunidade"
@@ -9224,9 +9324,6 @@ msgstr "Framework de conformidade"
msgid "Compliance report"
msgstr "Relatório de conformidade"
-msgid "ComplianceDashboard|created by:"
-msgstr "Criado por"
-
msgid "ComplianceFrameworks|Add framework"
msgstr "Adicionar framework"
@@ -9420,7 +9517,7 @@ msgid "Configure existing installation"
msgstr "Configurar instalação existente"
msgid "Configure pipeline"
-msgstr ""
+msgstr "Configurar pipeline"
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9468,7 +9565,7 @@ msgid "Configure which lists are shown for anyone who visits this board"
msgstr "Configure quais listas são mostradas para qualquer pessoa que visita este painel"
msgid "Configure with a merge request"
-msgstr ""
+msgstr "Configurar com uma solicitação de mesclagem"
msgid "Configure your environments to be deployed to specific geographical regions"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr "Falha na conexão"
msgid "Connection timed out"
msgstr "A conexão expirou"
-msgid "Connection timeout"
-msgstr "Conexão expirada"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr "O registro de contêiner não está ativado nesta instância do GitLab.
msgid "Container repositories"
msgstr "Repositórios do container"
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr "Repositório do container"
@@ -9736,7 +9827,7 @@ msgid "ContainerRegistry|Enable expiration policy"
msgstr "Ativar política de expiração"
msgid "ContainerRegistry|Expiration policy is disabled."
-msgstr ""
+msgstr "Política de expiração está desativada."
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Política de expiração será executada em %{time}"
@@ -9750,6 +9841,9 @@ msgstr "Falha na exclusão do repositório de imagens"
msgid "ContainerRegistry|Image repository not found"
msgstr "Repositório de imagem não encontrado"
+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 "O repositório de imagens será excluído"
@@ -9831,7 +9925,7 @@ msgid "ContainerRegistry|Run cleanup:"
msgstr "Executar limpeza:"
msgid "ContainerRegistry|Set up cleanup"
-msgstr ""
+msgstr "Configurar limpeza"
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Algumas tag não foram excluídas"
@@ -9941,9 +10035,6 @@ msgstr "Com o registro de contêiner, cada projeto pode ter seu próprio espaço
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 "Com o registro de contêiner, cada projeto pode ter seu próprio espaço para armazenar suas imagens do Docker. Envie pelo menos uma imagem Docker em um dos projetos deste grupo para aparecer aqui. %{docLinkStart}Mais informações%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "Com o registro de contêiner do GitLab, cada projeto pode ter seu próprio espaço para armazenar imagens. %{docLinkStart}Mais informações%{docLinkEnd}"
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Continuar"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Continuar para a próxima etapa"
@@ -10088,9 +10182,6 @@ msgstr "Copiar ID externo para a área de transferência"
msgid "Copy ID"
msgstr "Copiar ID"
-msgid "Copy IP Address"
-msgstr "Copiar endereço de IP"
-
msgid "Copy KRB5 clone URL"
msgstr "Copiar URL de clone do KRB5"
@@ -10106,6 +10197,9 @@ msgstr "Copiar URL"
msgid "Copy branch name"
msgstr "Copiar nome do branch"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "Copiar código"
@@ -10148,6 +10242,9 @@ msgstr "Copiar etiquetas e marco de outra issue ou merge request neste projeto"
msgid "Copy link"
msgstr "Copiar link"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Copiar link para o gráfico"
@@ -10227,7 +10324,7 @@ msgid "CorpusManagement|Manage your fuzz testing corpus files"
msgstr ""
msgid "CorpusManagement|New corpus"
-msgstr ""
+msgstr "Novo corpus"
msgid "CorpusManagement|New upload"
msgstr "Novo envio"
@@ -10362,7 +10459,7 @@ msgid "Could not upload your designs as one or more files uploaded are not suppo
msgstr ""
msgid "Couldn't assign policy to project or group"
-msgstr ""
+msgstr "Não foi possível atribuir política ao projeto ou grupo"
msgid "Country"
msgstr "País"
@@ -10454,6 +10551,9 @@ msgstr "Criar a branch"
msgid "Create commit"
msgstr "Criar commit"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr "Crie arquivos comuns mais rapidamente e padronize seu formato."
@@ -10545,7 +10645,7 @@ msgid "Create new project"
msgstr "Criar novo projeto"
msgid "Create one"
-msgstr ""
+msgstr "Criar um"
msgid "Create or import your first project"
msgstr "Criar ou importar seu primeiro projeto"
@@ -10830,10 +10930,10 @@ msgid "Critical vulnerabilities present"
msgstr "Vulnerabilidades críticas presentes"
msgid "Crm|Contact has been added."
-msgstr ""
+msgstr "Contato foi adicionado"
msgid "Crm|Contact has been updated."
-msgstr ""
+msgstr "Contato foi atualizado."
msgid "Crm|Customer relations contacts"
msgstr ""
@@ -10848,7 +10948,7 @@ msgid "Crm|Edit contact"
msgstr "Editar contato"
msgid "Crm|Edit organization"
-msgstr ""
+msgstr "Editar organização"
msgid "Crm|New contact"
msgstr "Novo contato"
@@ -10914,13 +11014,13 @@ msgid "Current password"
msgstr "Senha atual"
msgid "Current sign-in IP:"
-msgstr ""
+msgstr "IP de entrada atual:"
msgid "Current sign-in at:"
-msgstr ""
+msgstr "Entrada atual em:"
msgid "Current sign-in ip"
-msgstr ""
+msgstr "IP de entrada atual"
msgid "Current vulnerabilities count"
msgstr "Contador de vulnerabilidades"
@@ -10940,8 +11040,11 @@ msgstr "Preferências"
msgid "CurrentUser|Start an Ultimate trial"
msgstr "Iniciar uma avaliação do Ultimate"
-msgid "CurrentUser|Upgrade"
-msgstr "Atualizar"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "Atributos personalizados"
@@ -11114,6 +11217,9 @@ msgstr "deve estar em um grupo"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} selecionado (%{maxLabels} max)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Data"
@@ -11141,6 +11250,9 @@ msgstr "Mostrar filtros de gráficos"
msgid "CycleAnalytics|Filter by stop date"
msgstr "Filtrar por data de finalização"
+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 ""
@@ -11173,7 +11285,7 @@ msgid "CycleAnalytics|Showing data for group '%{groupName}' from %{createdAfter}
msgstr "Mostrando dados para o grupo '%{groupName}' de %{createdAfter} a %{createdBefore}"
msgid "CycleAnalytics|Stage time: %{title}"
-msgstr ""
+msgstr "Tempo de estágio: %{title}"
msgid "CycleAnalytics|Tasks by type"
msgstr "Tarefas por tipo"
@@ -11517,6 +11629,12 @@ msgstr "Tipo de site"
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "URL alvo"
@@ -11607,25 +11725,25 @@ msgstr "Tentar novamente a validação"
msgid "DastSiteValidation|Revoke validation"
msgstr "Revogar validação"
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 "Validar"
-msgid "DastSiteValidation|Validate target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr "Excluir artefatos"
msgid "Delete badge"
msgstr "Excluir selo"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Excluir coluna"
@@ -12041,6 +12162,9 @@ msgstr "Apelido de bate-papo excluído: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "Projetos excluídos não podem ser restaurados!"
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr "Excluir ramificação de origem"
@@ -12167,9 +12291,15 @@ msgstr "Verificação de dependência"
msgid "Dependency list"
msgstr "Lista de dependências"
+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 "Limpar o cache do proxy de dependência automaticamente"
@@ -12179,9 +12309,6 @@ msgstr "Contém %{count} blobs de imagens (%{size})"
msgid "DependencyProxy|Copy prefix"
msgstr "Copiar prefixo"
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr "Crie um proxy local para armazenar imagens upstream usadas com frequência. %{docLinkStart}Saiba mais%{docLinkEnd} sobre proxies de dependências."
-
msgid "DependencyProxy|Dependency Proxy"
msgstr "Proxy de dependências"
@@ -12197,6 +12324,9 @@ msgstr "Ativar proxy de dependências"
msgid "DependencyProxy|Image list"
msgstr "Lista de imagens"
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr "Configurações de armazenamento"
@@ -12348,7 +12478,7 @@ msgid "DeployTokens|Allows read-only access to registry images."
msgstr "Permite acesso somente-leitura às imagens do registro."
msgid "DeployTokens|Allows read-only access to the package registry."
-msgstr ""
+msgstr "Permite acesso somente leitura ao registro do pacote."
msgid "DeployTokens|Allows read-only access to the repository."
msgstr "Permite acesso somente-leitura ao repositório."
@@ -12455,9 +12585,12 @@ msgstr "Implantação"
msgid "Deployment Frequency"
msgstr "Frequência de implantação"
-msgid "Deployment Target|Project deployment target (optional)"
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
msgstr ""
+msgid "Deployment Target|Project deployment target (optional)"
+msgstr "Destino da implantação do projeto (opcional)"
+
msgid "Deployment Target|Select the deployment target"
msgstr "Selecione o alvo de implantação"
@@ -12495,37 +12628,37 @@ msgid "DeploymentTarget|GitLab Pages"
msgstr "GitLab Pages"
msgid "DeploymentTarget|Heroku"
-msgstr ""
+msgstr "Heroku"
msgid "DeploymentTarget|Infrastructure provider (Terraform, Cloudformation, and so on)"
-msgstr ""
+msgstr "Provedor de infraestrutura (Terraform, Cloudformation e outros)"
msgid "DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)"
-msgstr ""
+msgstr "Kubernetes (GKE, EKS, OpenShift e outros)"
msgid "DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)"
-msgstr ""
+msgstr "Ambiente de execução do contêiner (Fargate, Cloud Run, DigitalOcean App)"
msgid "DeploymentTarget|Mobile app store"
-msgstr ""
+msgstr "Loja de aplicativos"
msgid "DeploymentTarget|No deployment planned"
-msgstr ""
+msgstr "Nenhuma implantação planejada"
msgid "DeploymentTarget|Other hosting service"
-msgstr ""
+msgstr "Outro serviço de hospedagem"
msgid "DeploymentTarget|Registry (package or container)"
-msgstr ""
+msgstr "Repositório (pacote ou contêiner)"
msgid "DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)"
-msgstr ""
+msgstr "Gerenciador automático de contêiners (Podman, Docker Swarm, Docker Compose)"
msgid "DeploymentTarget|Serverless backend (Lambda, Cloud functions)"
msgstr ""
msgid "DeploymentTarget|Virtual machine (for example, EC2)"
-msgstr ""
+msgstr "Máquina virtual (EC2, por exemplo)"
msgid "Deployments"
msgstr "Implementações"
@@ -12604,11 +12737,17 @@ msgstr "Remoção e depreciação de funcionalidades"
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr "As métricas, 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 %{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 ""
-msgid "Deprecations|The metrics, 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 "As métricas, 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. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgstr ""
msgid "Deprioritize label"
msgstr "Despriorizar etiqueta"
@@ -13002,6 +13141,9 @@ msgstr "Sua pontuação"
msgid "DevopsReport|Your usage"
msgstr "Seu uso"
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr "Não recebeu um e-mail de confirmação?"
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diferenciar limites"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "Diferença entre a data de início e agora"
@@ -13036,9 +13181,18 @@ msgid_plural "Diffs|%d deletions"
msgstr[0] "%d exclusão"
msgstr[1] "%d exclusões"
+msgid "Diffs|Expand all lines"
+msgstr ""
+
+msgid "Diffs|Next 20 lines"
+msgstr ""
+
msgid "Diffs|No file name available"
msgstr "Nenhum nome de arquivo disponível"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr "Mostrar %{unfoldCount} linhas"
@@ -13077,9 +13231,6 @@ msgstr "Nome do diretório"
msgid "Disable"
msgstr "Desabilitar"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr "Desativar o Elasticsearch até que a indexação seja concluída."
-
msgid "Disable Two-factor Authentication"
msgstr "Desativar a autenticação de dois fatores"
@@ -13092,6 +13243,9 @@ msgstr "Desativar para este projeto"
msgid "Disable group runners"
msgstr "Desativar executores de grupo"
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr "Desativar autenticação de dois fatores"
@@ -13226,7 +13380,7 @@ msgstr "Exibir arquivo renderizado"
msgid "Display source"
msgstr "Exibir fonte"
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13248,7 +13402,7 @@ msgid "Documentation for popular identity providers"
msgstr "Documentação para provedores de identidade populares"
msgid "Documentation pages URL"
-msgstr ""
+msgstr "URL das páginas de documentação"
msgid "Documents reindexed: %{processed_documents} (%{percentage}%%)"
msgstr ""
@@ -13266,7 +13420,7 @@ msgid "Domain Name"
msgstr "Nome do domínio"
msgid "Don't have a group?"
-msgstr ""
+msgstr "Você não tem um grupo?"
msgid "Don't have an account yet?"
msgstr "Ainda não possui uma conta?"
@@ -13313,9 +13467,6 @@ msgstr "Baixar PDF"
msgid "Download artifacts"
msgstr "Baixar artefatos"
-msgid "Download as"
-msgstr "Baixar como"
-
msgid "Download codes"
msgstr "Baixar códigos"
@@ -13403,47 +13554,53 @@ msgstr "Validade"
msgid "Due date"
msgstr "Validade"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "Duração"
-msgid "Duration|%s days"
+msgid "Duration (min)"
msgstr ""
+msgid "Duration|%s days"
+msgstr "%s dias"
+
msgid "Duration|%s hours"
-msgstr ""
+msgstr "%s horas"
msgid "Duration|%s minutes"
-msgstr ""
+msgstr "%s minutos"
msgid "Duration|%s months"
-msgstr ""
+msgstr "%s messes"
msgid "Duration|%s seconds"
-msgstr ""
+msgstr "%s segundos"
msgid "Duration|%s weeks"
-msgstr ""
+msgstr "%s semanas"
msgid "Duration|%s years"
-msgstr ""
+msgstr "%s anos"
msgid "Duration|1 day"
-msgstr ""
+msgstr "1 dia"
msgid "Duration|1 hour"
-msgstr ""
+msgstr "1 hora"
msgid "Duration|1 minute"
-msgstr ""
+msgstr "1 minuto"
msgid "Duration|1 month"
-msgstr ""
+msgstr "1mês"
msgid "Duration|1 week"
-msgstr ""
+msgstr "1 semana"
msgid "Duration|1 year"
-msgstr ""
+msgstr "1 ano"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Durante esse processo, você será perguntado por URLs do lado do GitLab. Use os URLs mostrados abaixo."
@@ -13559,6 +13716,9 @@ msgstr "Editar inline"
msgid "Edit issues"
msgstr "Editar issues"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr "Editar solicitação de mesclagem"
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,18 +13833,18 @@ msgstr "E-mail não pode ser enviado"
msgid "Email display name"
msgstr "Nome de exibição no e-mail"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr "E-mail do GitLab - e-mail de usuários diretamente da área do administrador. %{link_start}Saiba mais%{link_end}."
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "E-mail não verificado. Por favor, verifique o seu email no Salesforce."
msgid "Email notification for unknown sign-ins"
-msgstr ""
+msgstr "Notificação por e-mail para entradas desconhecidas"
msgid "Email patch"
msgstr "Patch de email"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "E-mail enviado"
@@ -13749,16 +13906,16 @@ msgid "Emails sent to %{email} are also supported."
msgstr "E-mails enviados para %{email} também são suportados."
msgid "EmailsOnPushService|Disable code diffs"
-msgstr ""
+msgstr "Desabilitar diffs de códigos"
msgid "EmailsOnPushService|Don't include possibly sensitive code diffs in notification body."
-msgstr ""
+msgstr "Não incluir no corpo da notificação diffs de códigos possivelmente sensíveis."
msgid "EmailsOnPushService|Email the commits and diff of each push to a list of recipients."
msgstr "Enviar por e-mail os commits e diff de cada push para uma lista de destinatários."
msgid "EmailsOnPushService|Emails on push"
-msgstr ""
+msgstr "E-mails no push"
msgid "EmailsOnPushService|Emails separated by whitespace."
msgstr "E-mails separados por espaço em branco."
@@ -13767,10 +13924,10 @@ msgid "EmailsOnPushService|Send from committer"
msgstr "Enviar do committer"
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 ""
+msgstr "Enviar notificações do endereço de e-mail do committer se o domínio corresponder ao domínio usado por sua instância GitLab (como em %{domains})."
msgid "EmailsOnPushService|tanuki@example.com gitlab@example.com"
-msgstr ""
+msgstr "tanooki@exemplo.com gitlab@exemplo.com"
msgid "Embed"
msgstr "Embutido"
@@ -13784,15 +13941,15 @@ msgstr "Arquivo vazio"
msgid "Enable"
msgstr "Ativar"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr "Ativar integração da Amazon EKS"
msgid "Enable Auto DevOps"
msgstr "Ativar Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Ativar Gitpod"
@@ -13814,18 +13971,12 @@ msgstr "Ativar PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr "Ativar coleção de dados Pseudonymizer"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr "Ativar verificação SSL"
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr "Ativar o serviço de ping"
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Ativar integração"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr "Ativar coleta de registros"
@@ -13958,12 +14103,6 @@ msgstr "Ativar executores compartilhados para este grupo"
msgid "Enable shared runners for this project"
msgstr "Ativar executores compartilhados para este projeto"
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Ativar autenticação de dois fatores"
@@ -14030,8 +14169,8 @@ msgstr "Termina em: %{endsAt}"
msgid "Enforce SSH key expiration"
msgstr "Forçar expiração de chave SSH"
-msgid "Enforce personal access token expiration"
-msgstr "Forçar expiração do token de acesso pessoal"
+msgid "Enforce access token expiration"
+msgstr ""
msgid "Enforce two-factor authentication"
msgstr "Forçar autenticação de dois fatores"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr "Empresa"
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] "Ambiente"
-msgstr[1] "Ambientes"
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14282,7 +14419,7 @@ msgid "Environments|Environments are places where code gets deployed, such as st
msgstr "Ambientes são locais onde a implantação é feita, tais como homologação ou produção."
msgid "Environments|How do I create an environment?"
-msgstr ""
+msgstr "Como criar um ambiente?"
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr ""
@@ -14381,10 +14518,10 @@ msgid "Environments|Updated"
msgstr "Atualizado"
msgid "Environments|You don't have any environments."
-msgstr ""
+msgstr "Você não tem nenhum ambiente."
msgid "Environments|You don't have any stopped environments."
-msgstr ""
+msgstr "Você não tem nenhum ambiente parado."
msgid "Environments|by %{avatar}"
msgstr "por %{avatar}"
@@ -14395,6 +14532,9 @@ msgstr "protegido"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Épico"
@@ -14419,9 +14559,6 @@ msgstr "Épicos"
msgid "Epics Roadmap"
msgstr "Planejamento de épicos"
-msgid "Epics and Issues"
-msgstr "Épicos e issues"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Epics permitem gerenciar seu portfólio de projetos de forma mais eficiente e com menos esforço"
@@ -14524,6 +14661,9 @@ msgstr "prazo"
msgid "Epics|start"
msgstr "Iniciar"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Erro"
@@ -14735,7 +14875,7 @@ msgid "ErrorTracking|Active"
msgstr "Ativo"
msgid "ErrorTracking|After adding your Auth Token, select the Connect button to load projects."
-msgstr ""
+msgstr "Depois de adicionar o seu token de autenticação, use o botão \"Conectar\" para carregar os projetos."
msgid "ErrorTracking|Auth Token"
msgstr "Token de autenticação"
@@ -14753,7 +14893,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 "Se você auto-hospeda o Sentry, insira o URL completo da sua instância do Sentry. Se você usa a solução hospedada do Sentry, digite 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 ""
@@ -14768,10 +14908,10 @@ msgid "ErrorTracking|Select project"
msgstr "Selecionar projeto"
msgid "ErrorTracking|To enable project selection, enter a valid Auth Token."
-msgstr ""
+msgstr "Para ativar a seleção do projeto, insira um token de autenticação válido."
msgid "ErrorTracking|View project settings"
-msgstr ""
+msgstr "Ver configurações do projeto"
msgid "Errors"
msgstr "Erros"
@@ -14779,9 +14919,6 @@ msgstr "Erros"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Erros:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15013,7 +15150,7 @@ msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Jekyll"
msgid "Everything you need to create a GitLab Pages site using Middleman"
-msgstr ""
+msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando o Middleman."
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "Tudo o que você precisa para criar um site do GitLab Pages usando HTML simples"
@@ -15028,7 +15165,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr "Exemplo: @sub\\.company\\.com$"
msgid "Examples"
-msgstr ""
+msgstr "Exemplos"
msgid "Except policy:"
msgstr "Exceto da política:"
@@ -15114,6 +15251,9 @@ msgstr "Data de expiração (opcional)"
msgid "Expiration date:"
msgstr "Data de expiração:"
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "Expirado"
@@ -15151,7 +15291,7 @@ msgid "Explore groups"
msgstr "Explorar grupos"
msgid "Explore paid plans"
-msgstr ""
+msgstr "Explorar os planos pagos"
msgid "Explore projects"
msgstr "Explorar projetos"
@@ -15413,6 +15553,9 @@ msgstr "Falha ao instalar."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr "Falha ao carregar os responsáveis"
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr "Falha ao carregar as iterações."
@@ -15585,7 +15731,7 @@ msgid "Fast-forward merge without a merge commit"
msgstr "Fast-forward merge sem um merge commit"
msgid "Faster releases. Better code. Less pain."
-msgstr ""
+msgstr "Lançamentos mais rápidos. Melhor código. Menos dor."
msgid "Favicon"
msgstr "Favicon"
@@ -15599,8 +15745,8 @@ msgstr "Favicon será removido. Você tem certeza?"
msgid "Feature Flags"
msgstr "Feature flag"
-msgid "Feature deprecation and removal"
-msgstr "Remoção e depreciação de funcionalidades"
+msgid "Feature deprecation"
+msgstr ""
msgid "Feature flag status"
msgstr "Status de feature flag"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Arquivo adicionado"
@@ -15871,9 +16020,6 @@ msgstr "Arquivo renomeado sem alterações."
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Modelos de arquivos"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr "Finalizado"
-msgid "Finished at"
-msgstr "Finalizado em"
-
msgid "First Name"
msgstr "Primeiro nome"
@@ -16123,9 +16266,6 @@ msgstr "Para mais informações, vá para o "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "Esqueceu sua senha?"
@@ -16199,7 +16339,7 @@ msgid "ForkSuggestion|Fork"
msgstr "Fork"
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 ""
+msgstr "Você não pode %{edit_start}editar%{edit_end} arquivos diretamente nesse projeto. Faça um fork nesse projeto e envie um merge request com suas alterações."
msgid "ForkedFromProjectPath|Forked from"
msgstr "Fork criado a partir de"
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr "em (%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "Adicionar site"
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 "O tempo limite de conexão não pode ficar em branco"
@@ -16432,6 +16606,9 @@ 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 "Não foi possível remover o registro de rastreamento de um projeto existente."
@@ -16453,9 +16630,21 @@ 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 "Falha"
+msgid "Geo|File synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Filter Geo sites"
msgstr ""
@@ -16465,24 +16654,36 @@ msgstr "Filtrar por nome"
msgid "Geo|Filter by status"
msgstr "Filtrar por status"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo Status"
-msgid "Geo|Geo sites"
+msgid "Geo|Geo allows you to choose specific groups or storage shards to replicate."
msgstr ""
-msgid "Geo|Geo sites are paused using a command run on the site"
+msgid "Geo|Geo can replicate objects stored in Object Storage (AWS S3, or other compatible object storage)."
msgstr ""
-msgid "Geo|Geo supports replication of many data types."
+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 "Ir para o site primário"
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
msgid "Geo|Healthy"
msgstr "Saudável"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr "Em sincronia"
msgid "Geo|Internal URL"
msgstr "URL interna"
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ msgstr "Saiba mais sobre o Geo"
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 "Nunca"
msgid "Geo|Next sync scheduled at"
msgstr "Próxima sincronização programada às"
+msgid "Geo|No Geo site found"
+msgstr ""
+
msgid "Geo|No available replication slots"
msgstr ""
msgid "Geo|Not synced yet"
msgstr "Ainda não sincronizado"
+msgid "Geo|Nothing found…"
+msgstr ""
+
msgid "Geo|Nothing to checksum"
msgstr ""
@@ -16543,6 +16765,9 @@ msgstr "Nada para sincronizar"
msgid "Geo|Nothing to verify"
msgstr "Nada para verificar"
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr "Off-line"
@@ -16555,6 +16780,9 @@ msgstr "Sincronização pendente"
msgid "Geo|Pending verification"
msgstr "Verificação pendente"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "Nó primário"
@@ -16576,6 +16804,9 @@ msgstr "Projetos em certos pedaços de armazenamento"
msgid "Geo|Queued"
msgstr "Na fila"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Baixar novamente"
@@ -16618,6 +16849,9 @@ msgstr "Status da replicação"
msgid "Geo|Replication summary"
msgstr "Resumo da replicação"
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Ressincronizar"
@@ -16645,15 +16879,39 @@ msgstr "Reverificar todos os projetos"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
msgstr "Nó secundário"
msgid "Geo|Secondary site"
msgstr "Site secundário"
+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|Site name can't be blank"
msgstr "O nome do site não pode ficar em branco"
@@ -16687,6 +16945,12 @@ msgstr "Configurações de sincronização"
msgid "Geo|Synchronization status"
msgstr "Status da sincronização"
+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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 "O registro de rastreamento do projeto (%{project_id}) foi removido com êxito."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -16741,6 +17023,9 @@ msgstr "Atualizado em %{timeAgo}"
msgid "Geo|Verification"
msgstr "Verificação"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Falha na verificação - %{error}"
@@ -16756,7 +17041,7 @@ msgstr "Verificado"
msgid "Geo|Waiting for scheduler"
msgstr "Aguardando o agendador"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16829,7 +17114,7 @@ msgid "Git revision"
msgstr "Revisão do Git"
msgid "Git shallow clone"
-msgstr ""
+msgstr "Clone superficial"
msgid "Git strategy"
msgstr "Estratégia de Git"
@@ -16886,7 +17171,7 @@ msgid "GitLab Team Member"
msgstr ""
msgid "GitLab Ultimate trial"
-msgstr ""
+msgstr "Avaliação do GitLab Ultimate"
msgid "GitLab User"
msgstr "Usuário GitLab"
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr "Grupo do GitLab: %{source_link}"
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr "URL do host do Gitea"
msgid "Gitea Import"
msgstr "Importação do Gitea"
+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 "Crie um %{token_link_start}token de acesso pessoal%{token_link_end} com acessos %{status_html} concedidos e cole-o aqui."
@@ -17180,7 +17474,7 @@ msgid "GlobalSearch|Type for new suggestions to appear below."
msgstr ""
msgid "GlobalSearch|What are you searching for?"
-msgstr ""
+msgstr "O que você está procurando?"
msgid "GlobalSearch|in all GitLab"
msgstr "em todo o GitLab"
@@ -17956,9 +18250,6 @@ msgstr "Se não for especificado no nível de grupo ou instância, o padrão é
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|New runners registration token has been generated!"
-msgstr "Um novo token de registro de executores foi gerado!"
-
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."
@@ -18076,9 +18367,6 @@ msgstr "Os grupos são uma ótima maneira de organizar projetos e pessoas."
msgid "Groups are the best way to manage projects and members."
msgstr "Os grupos são a melhor maneira de gerenciar projetos e membros."
-msgid "Groups to synchronize"
-msgstr "Grupos para sincronizar"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Visitados frequentemente"
@@ -18113,7 +18401,7 @@ msgid "GroupsEmptyState|You can manage your group member’s permissions and acc
msgstr "Você pode gerenciar permissões de membros e acesso do seu grupo para cada projeto no grupo."
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}Grupos%{linkEnd} permitem que você gerencie e colabore em vários projetos. Os membros de um grupo têm acesso a todos os seus projetos."
msgid "GroupsNew|Assemble related projects together and grant members access to several projects at once."
msgstr "Reúne projetos relacionados e concede aos membros acesso a vários projetos ao mesmo tempo."
@@ -18122,7 +18410,7 @@ msgid "GroupsNew|Connect instance"
msgstr "Conectar instância"
msgid "GroupsNew|Contact an administrator to enable options for importing your group."
-msgstr ""
+msgstr "Contate um administrador para habilitar opções para importar seu grupo."
msgid "GroupsNew|Create group"
msgstr "Criar grupo"
@@ -18152,7 +18440,7 @@ msgid "GroupsNew|My Awesome Group"
msgstr "Meu grupo incrível"
msgid "GroupsNew|No import options available"
-msgstr ""
+msgstr "Nenhuma opção de importação disponível"
msgid "GroupsNew|Not all related objects are migrated. %{docs_link_start}More info%{docs_link_end}."
msgstr "Nem todos os objetos relacionados são migrados. %{docs_link_start}Mais informações%{docs_link_end}."
@@ -18173,7 +18461,7 @@ msgid "GroupsNew|This feature is deprecated and replaced by %{docs_link_start}gr
msgstr "Este recurso foi descontinuado e substituído por %{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 ""
+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."
msgid "GroupsNew|Upload file"
msgstr "Enviar arquivo"
@@ -18330,7 +18618,7 @@ msgid "HarborRegistry|Invalid tag: missing manifest digest"
msgstr ""
msgid "HarborRegistry|Last updated %{time}"
-msgstr ""
+msgstr "Última atualização em %{time}"
msgid "HarborRegistry|Manifest digest: %{digest}"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr "Olá %{username}!"
@@ -18536,7 +18824,7 @@ msgid "Hide list"
msgstr "Ocultar lista"
msgid "Hide marketing-related entries from the Help page"
-msgstr ""
+msgstr "Ocultar entradas relacionadas a marketing da página de Ajuda"
msgid "Hide payload"
msgstr "Ocultar carga"
@@ -18648,17 +18936,11 @@ msgstr "Manutenção iniciada com sucesso"
msgid "How do I configure Akismet?"
msgstr "Como eu configuro o Akismet?"
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr "Como eu configuro os executores?"
msgid "How do I configure this integration?"
-msgstr ""
+msgstr "Como configuro esta integração?"
msgid "How do I generate it?"
msgstr "Como faço para gerar?"
@@ -18786,6 +19068,9 @@ msgstr "Endereços de IP por usuário"
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Identificador"
@@ -18825,13 +19110,10 @@ msgstr "Se marcado, os proprietários de grupos podem gerenciar links de grupo L
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "Se marcado, novas inscrições de grupo e permissões só podem ser adicionadas através da sincronização 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."
-msgstr "Se desativada, um branch local divergente não será atualizada automaticamente com commits de sua contraparte remota, para evitar a perda de dados locais. Se o branch padrão (%{default_branch}) tiver divergido e não puder ser atualizado, o espelhamento falhará. Outras branches divergentes são silenciosamente ignoradas."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18871,7 +19150,7 @@ msgid "If you are added to a project, it will be displayed here."
msgstr "Se você for adicionado a um projeto, ele será exibido aqui."
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 ""
+msgstr "Se você não iniciou essas tentativas de entrada, entre em contato com seu administrador ou ative a autenticação de dois fatores (2FA) em sua conta."
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ msgstr "Blog"
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 "Gravar gráficos para cima/para baixo"
@@ -19249,7 +19528,7 @@ msgid "InProductMarketing|Create well-defined workflows by using scoped labels o
msgstr "Crie fluxos de trabalho bem definidos usando etiqueta com escopo em issues, solicitações de mesclagem e épicos. Etiqueta com o mesmo escopo não podem ser usados juntos, o que evita conflitos."
msgid "InProductMarketing|Create your first project!"
-msgstr ""
+msgstr "Crie seu primeiro projeto!"
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 "Define quem possui arquivos ou diretórios específicos, para que os revisores corretos sejam sugeridos quando uma solicitação de mesclagem introduz alterações nesses arquivos."
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19405,7 +19687,7 @@ msgid "InProductMarketing|Improve app security with a 30-day trial"
msgstr ""
msgid "InProductMarketing|Improve code quality and streamline reviews"
-msgstr ""
+msgstr "Melhore a qualidade do código e simplifique as revisões"
msgid "InProductMarketing|Increase Operational Efficiencies"
msgstr ""
@@ -19443,6 +19725,9 @@ msgstr "Mantenha a qualidade do seu código alta definindo quem deve aprovar as
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 "Menor custo de desenvolvimento"
@@ -19626,9 +19911,15 @@ msgstr "Muito fácil"
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 ""
@@ -19732,7 +20023,7 @@ msgid "IncidentManagement|All alerts promoted to incidents are automatically dis
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 ""
+msgstr "Todos os alertas promovidos a incidentes são exibidos automaticamente na lista. Você também pode criar um novo incidente usando o botão abaixo."
msgid "IncidentManagement|An error occurred while fetching the incident status. Please reload the page."
msgstr ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr "Deve começar com http ou https"
-msgid "Incidents|There was an issue deleting the image."
-msgstr "Ocorreu um problema ao excluir a imagem."
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr "Ocorreu um problema ao atualizar sua imagem."
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr "Ocorreu um problema ao enviar sua imagem."
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20346,7 +20628,7 @@ msgid "Integrations|Send notifications about project events to Unify Circuit."
msgstr "Envie notificações sobre eventos de projeto para Unify Circuit."
msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
-msgstr ""
+msgstr "Envie notificações sobre eventos do projeto para uma conversa do Unify Circuit. %{docs_link}"
msgid "Integrations|Sign in to GitLab"
msgstr "Entrar no GitLab"
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
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."
-msgid "Internal URL (optional)"
-msgstr "URL interno (opcional)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr "Usuários internos"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Padrão de intervalo"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr "Arquivo inválido."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr "Convidar membros"
msgid "Invite a group"
msgstr "Convidar um grupo"
-msgid "Invite email has already been taken"
-msgstr "O e-mail de convite já está em uso"
-
msgid "Invite members"
msgstr "Convidar membros"
@@ -20772,7 +21051,7 @@ msgid "Invocations"
msgstr ""
msgid "IrkerService|Channels and users separated by whitespaces. %{recipients_docs_link}"
-msgstr ""
+msgstr "Canais e usuários separados por espaços em branco. %{recipients_docs_link}"
msgid "IrkerService|Default IRC URI (optional)"
msgstr ""
@@ -20787,7 +21066,7 @@ msgid "IrkerService|Send update messages to an irker server."
msgstr "Envie mensagens de atualização para um servidor 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 "Enviar mensagens de atualização para um servidor irker. Antes de poder usar isso, você precisa configurar o daemon irker. %{docs_link}"
msgid "IrkerService|Server host (optional)"
msgstr "Host do servidor (opcional)"
@@ -20796,7 +21075,7 @@ msgid "IrkerService|Server port (optional)"
msgstr "Porta do servidor (opcional)"
msgid "IrkerService|URI to add before each recipient."
-msgstr ""
+msgstr "URI para adicionar antes de cada destinatário."
msgid "IrkerService|irker (IRC gateway)"
msgstr ""
@@ -20955,16 +21234,16 @@ 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 ""
+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 ""
+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 ""
+msgstr "A URL para visualizar um problema no rastreador de problemas externo. Deve conter %{colon_id}."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
msgstr "Use o Bugzilla como rastreador de issue deste projeto."
@@ -20979,13 +21258,13 @@ msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's is
msgstr "Use o IBM Engineering Workflow Management como o rastreador de issues deste projeto. %{docs_link}"
msgid "IssueTracker|Use Redmine as the issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Use Redmine como o rastreador de issue. %{docs_link}"
msgid "IssueTracker|Use Redmine as this project's issue tracker."
msgstr "Use o Redmine como rastreador de issue deste projeto."
msgid "IssueTracker|Use YouTrack as this project's issue tracker."
-msgstr ""
+msgstr "Use o YouTrack como rastreador de issue deste projeto."
msgid "IssueTracker|Use YouTrack as this project's issue tracker. %{docs_link}"
msgstr "Use o YouTrack como rastreador de issue deste projeto. %{docs_link}"
@@ -20994,7 +21273,7 @@ msgid "IssueTracker|Use a custom issue tracker as this project's issue tracker."
msgstr "Use o um rastreador personalizado de issue deste projeto."
msgid "IssueTracker|Use a custom issue tracker that is not in the integration list. %{docs_link}"
-msgstr ""
+msgstr "Use um rastreador de issues personalizada que não esteja na lista de integração. %{docs_link}"
msgid "Issues"
msgstr "Issues"
@@ -21015,7 +21294,7 @@ msgid "Issues closed"
msgstr "Issues fechadas"
msgid "Issues must match this scope to appear in this list."
-msgstr ""
+msgstr "As issues devem corresponder a este escopo para aparecer nesta lista."
msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities"
msgstr "Issues com comentários, solicitações de mesclagem com diffs e comentários, etiquetas, marcos, snippets e outras entidades do projeto"
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr "Excluir iteração?"
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "Duração"
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL Jaeger"
@@ -21368,7 +21656,7 @@ msgstr "URL base da instância do Jira."
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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr "Tipo de issue do Jira"
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21552,11 +21840,14 @@ msgid "Jobs"
msgstr "Tarefas"
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 ""
+msgstr "As tarefas falharão se elas executarem mais do que o tempo de expiração. O valor de entrada é em segundos por padrão. Entrada legível também é aceite, por exemplo, %{code_open}1 hora%{code_close}."
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|Are you sure you want to proceed?"
msgstr "Tem certeza que deseja prosseguir?"
@@ -21569,6 +21860,9 @@ msgstr "Criar arquivo de configuração de CI/CD"
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21582,7 +21876,7 @@ msgid "Jobs|Raw text search is not currently supported for the jobs filtered sea
msgstr ""
msgid "Jobs|Status"
-msgstr ""
+msgstr "Status"
msgid "Jobs|Use jobs to automate your tasks"
msgstr "Use trabalhos para automatizar suas tarefas"
@@ -21618,7 +21912,7 @@ msgid "Job|Complete Raw"
msgstr "Raw completo"
msgid "Job|Created"
-msgstr ""
+msgstr "Criado"
msgid "Job|Download"
msgstr "Baixar"
@@ -21651,16 +21945,16 @@ msgid "Job|Passed"
msgstr ""
msgid "Job|Pending"
-msgstr ""
+msgstr "Pendente"
msgid "Job|Preparing"
-msgstr ""
+msgstr "Preparando"
msgid "Job|Retry"
msgstr ""
msgid "Job|Running"
-msgstr ""
+msgstr "Executando"
msgid "Job|Scheduled"
msgstr ""
@@ -21702,7 +21996,7 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr ""
msgid "Job|Waiting for resource"
-msgstr ""
+msgstr "Aguardando recurso"
msgid "Job|allowed to fail"
msgstr "permitido falhar"
@@ -21729,7 +22023,7 @@ msgid "Joined %{time_ago}"
msgstr ""
msgid "Joined %{user_created_time}"
-msgstr ""
+msgstr "Entrou em %{user_created_time}"
msgid "Joined projects (%{projects_count})"
msgstr ""
@@ -22037,10 +22331,10 @@ msgid "Last sign-in"
msgstr "Último login"
msgid "Last sign-in IP:"
-msgstr ""
+msgstr "Último IP de entrada:"
msgid "Last sign-in at:"
-msgstr ""
+msgstr "Última data de entrada:"
msgid "Last successful sync"
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr "Fluido"
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr "Ok, vamos lá"
msgid "LearnGitlab|Trial only"
msgstr "Apenas avaliação"
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Sair"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr "Gráfico de burndown legado"
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22337,7 +22643,7 @@ msgid "License Compliance"
msgstr "License Compliance"
msgid "License Compliance| Used by"
-msgstr ""
+msgstr "Usado por"
msgid "License compliance"
msgstr "Conformidade de licença"
@@ -22358,7 +22664,7 @@ msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inact
msgstr ""
msgid "LicenseCompliance|Acceptable for use in this project"
-msgstr ""
+msgstr "Aceitável para uso neste projeto"
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr ""
@@ -22453,7 +22759,7 @@ msgid "LicenseCompliance|This license already exists in this project."
msgstr ""
msgid "LicenseCompliance|Uncategorized"
-msgstr ""
+msgstr "Sem categoria"
msgid "LicenseCompliance|Update approvals"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr "Componentes"
msgid "Licenses|Detected in Project"
msgstr "Detectado no projeto"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr "Ver os detalhes da licença do seu projeto"
msgid "Limit display of time tracking units to hours."
msgstr "Limita a exibição de unidades de acompanhamento de tempo a horas."
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr "Bloqueado por %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "Bloqueou a discussão."
-msgid "Locked to current projects"
-msgstr "Travado para projetos existentes"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Travas possibilitam travar um arquivo ou uma pasta específica."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22921,7 +23215,7 @@ msgid "Manage labels"
msgstr "Gerenciar etiquetas"
msgid "Manage members"
-msgstr ""
+msgstr "Gerenciar membros"
msgid "Manage milestones"
msgstr "Gerenciar marcos"
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "Máximo de 100.000 eventos"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "Filtrar membros"
@@ -23587,6 +23890,9 @@ msgstr "Solicitação de mesclagem"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "A solicitação de mesclagem %{mr_link} foi revisada por %{mr_author}"
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr "Análise de solicitação de mesclagem"
@@ -23833,6 +24139,18 @@ msgstr "Não há dados disponíveis. Por favor mude sua seleção."
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 "Métricas"
@@ -24347,12 +24665,12 @@ msgstr "Issues não iniciadas (abertas e não atribuídas)"
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 "Capacidade mínima para estar disponível antes de agendar mais espelhos preventivamente."
-msgid "Minimum interval in days"
-msgstr "Intervalo mínimo em dias"
-
msgid "Minutes"
msgstr "Minutos"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr "Meu grupo incrível"
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24710,7 +25019,7 @@ msgid "NamespaceUserCap|Pending users must be reviewed and approved by a group o
msgstr ""
msgid "NamespaceUserCap|View pending approvals"
-msgstr ""
+msgstr "Ver aprovações pendentes"
msgid "NamespaceUserCap|Your group has reached its billable member limit"
msgstr ""
@@ -24796,75 +25105,9 @@ msgstr "Rede"
msgid "Network:"
msgstr "Rede:"
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}se%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and está entrando de um%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}se%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}e é saída para um%{directionLabelEnd} %{rule} %{portsLabelStart}em%{portsLabelEnd} %{ports}"
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr "%{labelStart}E%{labelEnd} %{spanStart}enviar um alerta para Gitlab.%{spanEnd}"
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr "%{labelStart}Então%{labelEnd} %{action} %{spanStart}o tráfego da rede.%{spanEnd}"
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr "%{number} selecionado(s)"
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr "%{strongOpen}todos%{strongClose} pods"
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr "%{strongOpen}qualquer%{strongClose} port"
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr "Modo .yaml"
-
-msgid "NetworkPolicies|Add alert"
-msgstr "Adicionar alerta"
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr "Todos selecionados"
-
-msgid "NetworkPolicies|Allow"
-msgstr "Permitir"
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr "Permite todo o tráfego de entrada para %{selector} de %{ruleSelector} em %{ports}"
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr "Permite todo o tráfego de saída de %{selector} para %{ruleSelector} em %{ports}"
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr "Criar política"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "Excluir política"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr "Excluir política: %{policy}"
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr "Negar todo o tráfego"
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "Editar política"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr "O ambiente não possui plataforma de implantação"
-msgid "NetworkPolicies|IP/subnet"
-msgstr "IP/sub-redes"
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "Política inválida ou vazia"
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Erro de Kubernetes: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr "Rede"
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr "Políticas de rede podem ser usadas para limitar o tráfego de rede permitido entre os contêineres dentro do cluster."
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr "Tráfego de rede"
-
-msgid "NetworkPolicies|None selected"
-msgstr "Nenhum selecionado"
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr "Definição de política"
-
-msgid "NetworkPolicies|Rule mode"
-msgstr "Modo de regra"
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "Salvar alterações"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr "todos os nomes de DNS"
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr "todos os endereços de IP"
-
-msgid "NetworkPolicies|any pod"
-msgstr "qualquer pod"
-
-msgid "NetworkPolicies|any port"
-msgstr "qualquer porta"
-
-msgid "NetworkPolicies|domain name"
-msgstr "nome de domínio"
-
-msgid "NetworkPolicies|entity"
-msgstr "entidade"
-
-msgid "NetworkPolicies|inbound to"
-msgstr "entrada para"
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr "saída para"
-
-msgid "NetworkPolicies|pod with labels"
-msgstr "pod com etiquetas"
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr "pods %{pods}"
-
-msgid "NetworkPolicies|pods with labels"
-msgstr "pods com etiquetas"
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr "portas %{ports}"
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr "portas/protocolos"
-
msgid "NetworkPolicy|Policy"
msgstr "Política"
@@ -25236,9 +25404,6 @@ msgstr "Nenhum marco"
msgid "No Scopes"
msgstr "Nenhum escopo"
-msgid "No Tag"
-msgstr "Nenhuma tag"
-
msgid "No active admin user found"
msgstr "Nenhum usuário administrador ativo encontrado"
@@ -25446,9 +25611,6 @@ msgstr "Nenhuma pré-visualização disponível para este tipo de arquivo"
msgid "No prioritized labels with such name or description"
msgstr "Sem etiquetas priorizadas com esse nome ou descrição"
-msgid "No profiles found"
-msgstr "Nenhum perfil encontrado"
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Nota"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25659,7 +25824,7 @@ msgid "Notes|This comment has changed since you started editing, please review t
msgstr "Esse comentário foi alterado desde que você começou a editá-lo. Por favor, reveja o %{open_link}comentário atualizado%{close_link} para garantir que nenhuma informação seja perdida"
msgid "Notes|This comment is confidential and only visible to group members"
-msgstr ""
+msgstr "Este comentário é confidencial e visível apenas para membros do grupo"
msgid "Notes|This comment is confidential and only visible to project members"
msgstr "Esse comentário é confidencial e só está visível para os membros do projeto"
@@ -25667,9 +25832,6 @@ msgstr "Esse comentário é confidencial e só está visível para os membros do
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 found…"
-msgstr "Nada encontrado…"
-
msgid "Nothing to preview."
msgstr "Nada para pré-visualizar."
@@ -25795,6 +25957,42 @@ msgstr "Notificações ligadas"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Nov"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr "Replicação de armazenamento de objeto"
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "O objeto não existe no servidor ou você não tem permissão para acessá-lo"
@@ -25894,6 +26089,9 @@ msgstr "Agendamento de plantão"
msgid "On-call schedules"
msgstr "Agendamento de plantão"
+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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,24 +26281,39 @@ msgstr "Criar novo perfil de verificação"
msgid "OnDemandScans|Create new site profile"
msgstr "Criar novo perfil de site"
+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 "Excluir perfil"
msgid "OnDemandScans|Description (optional)"
msgstr "Descrição (opcional)"
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
+msgstr ""
+
msgid "OnDemandScans|Edit on-demand DAST scan"
msgstr "Editar verificação DAST sob demanda"
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr "Editar perfil"
+msgid "OnDemandScans|Enable scan schedule"
+msgstr ""
+
msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr "Por exemplo: testa a página de login para injeções de SQL"
-msgid "OnDemandScans|Manage DAST scans"
-msgstr "Gerenciar verificações de DAST"
-
msgid "OnDemandScans|Manage scanner profiles"
msgstr "Gerenciar perfis de verificação"
@@ -26104,9 +26326,12 @@ msgstr "Minha verificação diária"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "Nova verificação DAST sob demanda"
-msgid "OnDemandScans|New scan"
+msgid "OnDemandScans|New on-demand scan"
msgstr ""
+msgid "OnDemandScans|New scan"
+msgstr "Nova verificação"
+
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "Não há nenhum perfil ainda. Para criar uma nova verificação, você precisa ter pelo menos um perfil completo de verificação."
@@ -26137,21 +26362,27 @@ msgstr "Salvar verificação e executar"
msgid "OnDemandScans|Save scan"
msgstr "Salvar verificação"
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr "Verificar"
msgid "OnDemandScans|Scan name"
msgstr "Nome da verificação"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
+msgstr ""
+
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
msgid "OnDemandScans|Scan type"
msgstr "Tipo de verificação"
msgid "OnDemandScans|Scanner profile"
msgstr "Perfil de verificação"
-msgid "OnDemandScans|Schedule scan"
-msgstr "Verificação agendada"
-
msgid "OnDemandScans|Select one of the existing profiles"
msgstr ""
@@ -26182,6 +26413,9 @@ msgstr "Não há verificações salvas."
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ msgstr "Ver resultados"
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 "Uma vez importados, os repositórios podem ser espelhados por SSH. Leia mais %{link_start}aqui%{link_end}."
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr "Inclua apenas novos recursos no seu nível de assinatura atual."
@@ -26341,7 +26575,7 @@ msgid "Opened issues"
msgstr "Issues abertas"
msgid "OpenedNDaysAgo|Created"
-msgstr ""
+msgstr "Criado"
msgid "Opens in a new window"
msgstr "Abrir em nova janela"
@@ -26703,6 +26937,12 @@ msgstr "Excluir versão do pacote"
msgid "PackageRegistry|Delete package"
msgstr "Excluir pacote"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr "Nível do projeto"
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "Publique e compartilhe pacotes para uma variedade de gerenciadores de pacotes comuns. %{docLinkStart}Mais informações%{docLinkEnd}"
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ msgstr "Ainda não há pacotes"
msgid "PackageRegistry|There was a problem fetching the details for this package."
msgstr "Houve um problema ao buscar os detalhes deste pacote."
+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 ""
@@ -26999,15 +27242,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "Parte das mudanças da solicitação de mesclagem"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "Participantes"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr "Passou"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr "Pausar"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27108,13 +27351,13 @@ msgid "Pending"
msgstr "Pendente"
msgid "Pending Deletion"
-msgstr ""
+msgstr "Exclusão pendente"
msgid "Pending comments"
msgstr ""
msgid "Pending deletion"
-msgstr ""
+msgstr "Exclusão pendente"
msgid "Pending owner approval"
msgstr ""
@@ -27261,7 +27504,7 @@ msgid "Phabricator Tasks"
msgstr ""
msgid "Phone"
-msgstr ""
+msgstr "Telefone"
msgid "Pick a name"
msgstr "Escolha um nome"
@@ -27278,9 +27521,6 @@ msgstr "Pipeline %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "Pipeline %{label} para \"%{dataTitle}\""
-msgid "Pipeline Editor"
-msgstr "Editor de pipeline"
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Total:"
+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 ""
@@ -27942,7 +28188,7 @@ msgid "Pipeline|with stages"
msgstr "com estágios"
msgid "PivotalTrackerService|Add commit messages as comments to Pivotal Tracker stories."
-msgstr ""
+msgstr "Adicione mensagens de confirmação como comentários às histórias do Pivotal Tracker."
msgid "PivotalTrackerService|Comma-separated list of branches to automatically inspect. Leave blank to include all branches."
msgstr ""
@@ -28079,6 +28325,9 @@ msgstr "Por favor, preencha um nome descritivo para o seu grupo."
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 "Por favor, preencha este campo."
@@ -28118,9 +28367,6 @@ msgstr "Por favor, forneça atributos para atualizar"
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr "Por favor, entre em contato se você tiver alguma dúvida, e nós ficaremos felizes em ajudar."
-msgid "Please refer to %{docs_url}"
-msgstr "Por favor, consulte %{docs_url}"
-
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 ""
@@ -28178,6 +28424,9 @@ msgstr "Por favor, digite %{phrase_code} para continuar ou feche este modal para
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "Por favor, use este formulário para denunciar aos administradores as contas que criam spam em issues, comentários ou se comportam de maneira inapropriada."
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "Por favor, espere um momento, essa página será atualizada automaticamente."
@@ -28262,6 +28511,12 @@ msgstr "Escolha o conteúdo que você quer ver na página de visão geral de um
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Escolha o conteúdo que você quer ver na página inicial."
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+msgstr ""
+
msgid "Preferences|Configure how dates and times display for you."
msgstr "Configure como as datas e horas são exibidas para você."
@@ -28271,6 +28526,12 @@ 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 colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr "Exibir a hora no formato de 24 horas"
@@ -28307,6 +28568,9 @@ msgstr "Deve ser um número entre %{min} e %{max}"
msgid "Preferences|Navigation theme"
msgstr "Tema de navegação"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Conteúdo da visão geral do projeto"
@@ -28406,9 +28670,6 @@ msgstr "Arquivo anterior em diff"
msgid "Previous unresolved discussion"
msgstr "Discussão anterior não resolvida"
-msgid "Primary"
-msgstr "Primário"
-
msgid "Primary Action"
msgstr "Ação primária"
@@ -28647,7 +28908,7 @@ msgid "Profiles|Edit Profile"
msgstr "Editar perfil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
-msgstr ""
+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"
@@ -28662,7 +28923,7 @@ 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|Example: MacBook key"
-msgstr ""
+msgstr "Exemplo: tecla do MacBook"
msgid "Profiles|Expiration date"
msgstr "Data de expiração"
@@ -28722,7 +28983,7 @@ msgid "Profiles|Key can still be used after expiration."
msgstr ""
msgid "Profiles|Key titles are publicly visible."
-msgstr ""
+msgstr "Títulos-chave são publicamente visíveis."
msgid "Profiles|Key usable beyond expiration date."
msgstr ""
@@ -28830,7 +29091,7 @@ msgid "Profiles|Time settings"
msgstr "Configurações de hora"
msgid "Profiles|Title"
-msgstr ""
+msgstr "Título"
msgid "Profiles|Two-Factor Authentication"
msgstr "Autenticação de dois fatores"
@@ -29027,9 +29288,6 @@ msgstr "A exportação do projeto não pôde ser excluída."
msgid "Project export download requests"
msgstr "Requisições de download de exportação de projeto"
-msgid "Project export enabled"
-msgstr "Exportação de projetos ativada"
-
msgid "Project export has been deleted."
msgstr "Exportação do projeto excluída."
@@ -29418,7 +29676,7 @@ msgid "ProjectSettings|Every project can have its own space to store its Docker
msgstr "Cada projeto pode ter seu próprio espaço de armazenar suas imagens Docker"
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 ""
+msgstr "Cada projeto pode ter seu próprio espaço para armazenar seus pacotes. Nota: O registro do pacote está sempre visível quando um projeto é público."
msgid "ProjectSettings|Everyone"
msgstr "Todos"
@@ -29451,13 +29709,13 @@ msgid "ProjectSettings|Global"
msgstr "Global"
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 ""
+msgstr "Destaque o uso de caracteres unicode ocultos. Esses têm usos inocentes para idiomas da direita para a esquerda, mas também podem ser usados em possíveis explorações."
msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and delete."
msgstr "Manutenção, exportação, arquivamento, alteração de caminho, transferência e exclusão."
msgid "ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts."
-msgstr ""
+msgstr "Se os trens de mesclagem estiverem habilitados, a mesclagem só será possível se a ramificação puder ser rebaseada sem conflitos."
msgid "ProjectSettings|Internal"
msgstr "Interno"
@@ -29517,7 +29775,7 @@ msgid "ProjectSettings|Merge suggestions"
msgstr "Sugestões de mesclagem"
msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
-msgstr ""
+msgstr "Mesclar só é permitido quando a ramificação de origem está atualizada com seu destino."
msgid "ProjectSettings|No merge commits are created."
msgstr "Nenhum commit de mesclagem foi criado."
@@ -29657,8 +29915,8 @@ msgstr "Usado para cada nova solicitação de mesclagem."
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 that were committed with one of their own verified emails."
-msgstr "Usuários só podem fazer push para este repositório com commits que contenham um de seus e-mails verificados."
+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 "Usuários podem solicitar acesso"
@@ -29691,7 +29949,7 @@ msgid "ProjectSettings|When merge request pipelines are enabled in the CI/CD con
msgstr ""
msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
-msgstr ""
+msgstr "Quando a mesclagem semi-linear não é possível, o usuário tem a opção de rebase."
msgid "ProjectSettings|When there is a merge conflict, the user is given the option to rebase."
msgstr "Quando há um conflito de mesclagem, o usuário tem a opção de rebase."
@@ -29808,7 +30066,7 @@ msgid "Projects are organized into groups"
msgstr "Os projetos são organizados em grupos"
msgid "Projects are where you store your code, access issues, wiki and other features of GitLab."
-msgstr ""
+msgstr "Os projetos são onde você armazena seu código, problemas de acesso, wiki e outros recursos do GitLab."
msgid "Projects contributed to"
msgstr ""
@@ -29922,10 +30180,10 @@ msgid "ProjectsNew|No import options available"
msgstr "Nenhuma opção de importação disponível"
msgid "ProjectsNew|Pick a group or namespace"
-msgstr ""
+msgstr "Escolha um grupo ou espaço de nome"
msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
-msgstr ""
+msgstr "Escolha um grupo ou espaço de nome onde você deseja criar este projeto."
msgid "ProjectsNew|Project Configuration"
msgstr "Configuração do projeto"
@@ -30006,7 +30264,7 @@ msgid "PrometheusService|Missing environment variable"
msgstr "Variável de ambiente ausente"
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
-msgstr ""
+msgstr "Monitore saúde dos aplicativos com métricas e painéis do Prometheus"
msgid "PrometheusService|More information"
msgstr "Mais informações"
@@ -30027,7 +30285,7 @@ msgid "PrometheusService|Select this checkbox to override the auto configuration
msgstr "Selecione esta caixa de seleção para substituir as configurações automáticas pelas suas próprias configurações."
msgid "PrometheusService|The ID of the IAP-secured resource."
-msgstr ""
+msgstr "O ID do recurso protegido por IAP."
msgid "PrometheusService|The Prometheus API base URL."
msgstr "A URL da base da API do Prometheus."
@@ -30477,7 +30735,7 @@ msgid "Public projects Minutes cost factor"
msgstr ""
msgid "Public projects are an easy way to allow everyone to have read-only access."
-msgstr ""
+msgstr "Os projectos públicos são uma forma fácil de permitir que todos tenham acesso apenas à leitura."
msgid "Publish to status page"
msgstr "Publicar na página de status"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr "Ler a documentação"
@@ -30794,9 +31049,6 @@ msgstr "O serviço de pesquisas recentes está indisponível"
msgid "Recent events"
msgstr "Eventos recentes"
-msgid "Recent jobs served by this runner"
-msgstr "Tarefas recentes servidos por este executor"
-
msgid "Recent searches"
msgstr "Pesquisas recentes"
@@ -30901,9 +31153,6 @@ msgstr "Registre o executor com este URL:"
msgid "Register with two-factor app"
msgstr "Registre-se com aplicativo de dois fatores"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31288,7 +31537,7 @@ msgid "Removed upload with id %{id}"
msgstr ""
msgid "RemovedProjects|No projects pending deletion found"
-msgstr ""
+msgstr "Nenhum projeto com exclusão pendente encontrado"
msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr "%{quick_action_target} foi reaberto."
msgid "Reopens this %{quick_action_target}."
msgstr "Reabre este %{quick_action_target}."
-msgid "Repeats"
-msgstr "Repetir"
-
msgid "Replace"
msgstr "Substituir"
@@ -31422,9 +31668,6 @@ msgstr "Responder…"
msgid "Repo by URL"
msgstr "Repositório por URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "Denunciar abuso"
@@ -31516,9 +31759,12 @@ msgstr "Falha"
msgid "Reports|Filename"
msgstr "Nome do arquivo"
-msgid "Reports|Full report"
+msgid "Reports|Fixed"
msgstr ""
+msgid "Reports|Full report"
+msgstr "Relatório completo"
+
msgid "Reports|Head report parsing error:"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31562,13 +31811,13 @@ msgid "Reports|Test summary failed loading results"
msgstr "Resumo do teste falhou ao carregar os resultados"
msgid "Reports|Test summary failed to load results"
-msgstr ""
+msgstr "Resumo do teste falhou ao carregar os resultados"
msgid "Reports|Test summary results are being parsed"
msgstr "Os resultados do resumo de teste estão sendo analisados"
msgid "Reports|Test summary results are loading"
-msgstr ""
+msgstr "Os resultados do resumo de teste estão sendo carregados"
msgid "Reports|Tool"
msgstr "Ferramenta"
@@ -31667,13 +31916,13 @@ msgid "Repository already read-only"
msgstr ""
msgid "Repository check"
-msgstr ""
+msgstr "Verificação do repositório"
msgid "Repository check was triggered."
msgstr ""
msgid "Repository checks"
-msgstr ""
+msgstr "Verificações do repositório"
msgid "Repository cleanup"
msgstr "Limpeza do repositório"
@@ -31720,9 +31969,6 @@ msgstr "Limite de tamanho do repositório (MB)"
msgid "Repository storage"
msgstr "Armazenamento do Repositório"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "Solicitar acesso"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-msgstr "Solicita Perfis"
-
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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr "Restringir a participação por domínio de e-mail"
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr "Tentar novamente"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Planejamento"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Cargo"
@@ -32190,10 +32430,10 @@ msgstr "Execute testes no seu código ao vivo usando o terminal web"
msgid "Run untagged jobs"
msgstr "Rodar tarefas sem tags"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr "Executores"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr "Executores são processos que selecionam e executam Tarefas de CI /CD para o GitLab."
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "Executores online no momento: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Página de executores."
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32282,7 +32516,7 @@ msgid "Runners|Choose your preferred GitLab Runner"
msgstr ""
msgid "Runners|Clear selection"
-msgstr ""
+msgstr "Limpar seleção"
msgid "Runners|Command to register runner"
msgstr "Comando para registrar o executor"
@@ -32308,7 +32542,7 @@ msgid "Runners|Delete runner %{name}?"
msgstr ""
msgid "Runners|Delete selected"
-msgstr ""
+msgstr "Excluir selecionado"
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr ""
@@ -32331,6 +32565,9 @@ msgstr "Baixar o último binário"
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|Group"
msgstr "Grupo"
@@ -32359,7 +32596,7 @@ msgid "Runners|Members of the %{type} can register runners"
msgstr ""
msgid "Runners|Multi-project runners cannot be deleted"
-msgstr ""
+msgstr "Executores de vários projetos não podem ser excluídos"
msgid "Runners|Name"
msgstr "Nome"
@@ -32368,7 +32605,7 @@ msgid "Runners|Never contacted"
msgstr ""
msgid "Runners|Never contacted:"
-msgstr ""
+msgstr "Nunca contatados:"
msgid "Runners|New group runners view"
msgstr "Visualização dos novos executores no grupo"
@@ -32522,6 +32759,9 @@ msgstr "Executores"
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 ""
@@ -32529,7 +32769,7 @@ msgid "Runners|Show runner installation and registration instructions"
msgstr "Mostrar instruções de instalação e registro do executor"
msgid "Runners|Show runner installation instructions"
-msgstr ""
+msgstr "Mostrar instruções de instalação do executor"
msgid "Runners|Something went wrong while fetching runner data."
msgstr ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr "grupo"
-msgid "Runners|locked"
-msgstr "bloqueado"
-
msgid "Runners|never contacted"
msgstr ""
@@ -33009,16 +33243,16 @@ msgid "SearchCodeResults|of %{link_to_project}"
msgstr "de %{link_to_project}"
msgid "SearchResults|Showing %{count} %{scope} for %{term_element}"
-msgstr ""
+msgstr "Mostrando %{count} %{scope} para %{term_element}"
msgid "SearchResults|Showing %{count} %{scope} for %{term_element} in your personal and project snippets"
-msgstr ""
+msgstr "Mostrando %{count} %{scope} para %{term_element} para seus snippets pessoais e de projeto"
msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element}"
-msgstr ""
+msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para %{term_element}"
msgid "SearchResults|Showing %{from} - %{to} of %{count} %{scope} for %{term_element} in your personal and project snippets"
-msgstr ""
+msgstr "Mostrando %{from} - %{to} de %{count} %{scope} para %{term_element} em seus trechos pessoais de snippets de projeto"
msgid "SearchResults|code result"
msgid_plural "SearchResults|code results"
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr "Secundário"
-
msgid "Secondary email:"
msgstr "E-mail Secundário:"
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33244,7 +33472,7 @@ msgid "SecurityConfiguration|Immediately begin risk analysis and remediation wit
msgstr "Comece imediatamente a análise de risco e remediação com recursos de segurança da aplicação. Comece com SAST e detecção secreta, disponível para todos os planos. Atualize para o Ultimate para obter todos os recursos, incluindo:"
msgid "SecurityConfiguration|Learn more about vulnerability training"
-msgstr ""
+msgstr "Saiba mais sobre treinamento de vulnerabilidade"
msgid "SecurityConfiguration|Manage corpus"
msgstr "Gerenciar corpus"
@@ -33253,7 +33481,7 @@ msgid "SecurityConfiguration|Manage corpus files used as seed inputs with covera
msgstr ""
msgid "SecurityConfiguration|Manage profiles"
-msgstr ""
+msgstr "Gerenciar perfis"
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "Gerenciar perfis para uso pelas verificações de DAST."
@@ -33303,6 +33531,9 @@ msgstr "Gerenciamento de vulnerabilidades"
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr "Detalhes de vulnerabilidade e estatísticas na solicitação de mesclagem"
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr "ou "
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr "Todas as políticas"
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,25 +33576,49 @@ 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 "Descrição"
msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
-msgstr ""
-
msgid "SecurityOrchestration|Edit policy"
msgstr "Editar política"
msgid "SecurityOrchestration|Edit policy project"
msgstr "Editar projeto de política"
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,32 +33636,20 @@ msgstr "Aplicar segurança para este projeto. %{linkStart}Mais informações.%{l
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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr "Rede"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "Nova política"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
-msgstr ""
+msgstr "Nova política de resultados de verificação"
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr ""
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr "Políticas"
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr "Descrição da política"
@@ -33444,15 +33693,18 @@ msgstr "Editor de política"
msgid "SecurityOrchestration|Policy status"
msgstr "Status da política"
-msgid "SecurityOrchestration|Policy summary"
-msgstr ""
-
msgid "SecurityOrchestration|Policy type"
msgstr "Tipo de política"
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 "Regras"
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr "Execução de verificação"
@@ -33478,7 +33733,7 @@ msgid "SecurityOrchestration|Scan execution policies can only be created by proj
msgstr ""
msgid "SecurityOrchestration|Scan execution policy"
-msgstr ""
+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 ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33511,11 +33769,14 @@ msgid "SecurityOrchestration|Select a project to store your security policies in
msgstr ""
msgid "SecurityOrchestration|Select policy"
-msgstr ""
+msgstr "Selecionar política"
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 ""
@@ -33531,6 +33792,9 @@ msgstr ""
msgid "SecurityOrchestration|Summary"
msgstr "Resumo"
+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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,12 +33876,12 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr "+%{count} mais"
-msgid "SecurityPolicies|Environment(s)"
-msgstr "Ambiente(s)"
-
msgid "SecurityPolicies|Policy type"
msgstr "Tipo de política"
+msgid "SecurityReports|%{count} Selected"
+msgstr ""
+
msgid "SecurityReports|%{count}+ projects"
msgstr ""
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr "Responder pesquisa"
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33934,7 +34198,7 @@ msgid "See metrics"
msgstr "Ver métricas"
msgid "See our website for help"
-msgstr ""
+msgstr "Consulte nosso site para obter ajuda"
msgid "See the affected projects in the GitLab admin panel"
msgstr "Veja os projetos afetados no painel de administração do GitLab"
@@ -34020,6 +34284,9 @@ msgstr "Selecionar responsável"
msgid "Select branch"
msgstr "Selecionar ramificação"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr "Selecionar validade"
@@ -34035,9 +34302,6 @@ msgstr "Selecionar grupo"
msgid "Select group or project"
msgstr "Selecionar grupo ou projeto"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr "Selecione um status de saúde"
@@ -34072,7 +34336,7 @@ msgid "Select project to create %{type}"
msgstr "Selecione o projeto para criar %{type}"
msgid "Select project to create issue"
-msgstr ""
+msgstr "Selecione o projeto para criar a issue"
msgid "Select projects"
msgstr "Selecionar projetos"
@@ -34080,9 +34344,6 @@ msgstr "Selecionar projetos"
msgid "Select reviewer(s)"
msgstr "Selecionar revisor(es)"
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr "Selecionar fonte"
@@ -34131,9 +34392,6 @@ msgstr "Projetos selecionados"
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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr "Automonitoramento"
@@ -34297,10 +34555,10 @@ msgid "Serverless|No functions available"
msgstr "Nenhuma função disponível"
msgid "Serverless|Serverless was %{linkStart}deprecated%{linkEnd} in GitLab 14.3."
-msgstr "Serverless foi %{linkStart}obsoleto%{linkEnd} no GitLab 14.3."
+msgstr "Serverless foi %{linkStart}descontinuado%{linkEnd} no GitLab 14.3."
msgid "Serverless|Serverless was %{postLinkStart}deprecated%{postLinkEnd}. But if you opt to use it, you must install Knative in your Kubernetes cluster first. %{linkStart}Learn more.%{linkEnd}"
-msgstr "Serverless foi %{postLinkStart}obsoleto%{postLinkEnd}. Mas se você optar por usá-lo, primeiro instale o Knative em seu cluster Kubernetes. %{linkStart}Saiba mais.%{linkEnd}"
+msgstr "Serverless foi %{postLinkStart}descontinuado%{postLinkEnd}. Mas se você optar por usá-lo, primeiro instale o Knative em seu cluster Kubernetes. %{linkStart}Saiba mais.%{linkEnd}"
msgid "Serverless|The deploy job has not finished."
msgstr "A tarefa de implantação ainda não terminou."
@@ -34335,15 +34593,15 @@ msgstr "Central de serviços"
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 "Contas de serviço"
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
-msgstr ""
-
msgid "Service usage data"
msgstr ""
@@ -34453,7 +34711,7 @@ msgid "Set severity"
msgstr "Definir severidade"
msgid "Set sign-in restrictions for all users."
-msgstr ""
+msgstr "Defina restrições de entrada para todos os usuários."
msgid "Set size limits for displaying diffs in the browser."
msgstr ""
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ msgstr "Configurar disponibilidade de executor compartilhado"
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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "Definir peso"
msgid "Set weight to %{weight}."
msgstr "Define o peso para %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Um indicador aparece ao lado do seu nome e avatar"
@@ -34640,9 +34889,6 @@ msgstr "Severidade: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "Compartilhar"
@@ -34925,7 +35171,7 @@ msgid "Sign-in and Help page"
msgstr "Página de entrada e ajuda"
msgid "Sign-in count:"
-msgstr ""
+msgstr "Contagem de entrada:"
msgid "Sign-in page"
msgstr "Página de entrada"
@@ -35051,7 +35297,7 @@ msgid "SlackIntegration|Team name"
msgstr ""
msgid "SlackIntegration|To set up this integration press \"Add to Slack\""
-msgstr ""
+msgstr "Para configurar esta integração, pressione \"Adicionar ao Slack\""
msgid "SlackIntegration|You can now close this window and go to your Slack workspace."
msgstr ""
@@ -35545,6 +35791,12 @@ msgstr ""
msgid "Source branch"
msgstr "Ramificação de origem"
+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 "Branch de origem: %{source_branch_open}%{source_branch}%{source_branch_close}"
@@ -35732,7 +35984,7 @@ msgid "Start a new merge request"
msgstr "Iniciar uma nova solicitação de mesclagem"
msgid "Start a new merge request with these changes"
-msgstr ""
+msgstr "Iniciar uma nova solicitação de mesclagem com essas alterações"
msgid "Start a review"
msgstr "Iniciar uma revisão"
@@ -35870,7 +36122,7 @@ msgid "StaticSiteEditor|To see your changes live you will need to do the followi
msgstr ""
msgid "StaticSiteEditor|Update %{sourcePath} file"
-msgstr ""
+msgstr "Atualizar arquivo %{sourcePath}"
msgid "StaticSiteEditor|View documentation"
msgstr "Ver documentação"
@@ -36067,6 +36319,12 @@ 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 "Informação do subgrupo"
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr "Caro %{customer_name},"
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr "Equipe de cobrança do GitLab"
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr "Adicionar lugares"
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr "Código de ativação"
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr "Usuários faturáveis"
msgid "SuperSonics|Buy subscription"
msgstr "Comprar assinatura"
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr "Gerenciar"
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 "Os usuários com um cargo de convidado ou aqueles que não pertencem a um projeto ou grupo não usarão uma licença de sua licença."
-msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr "Sincronizar LDAP"
@@ -36840,6 +37089,9 @@ msgstr "Release notes"
msgid "TagsPage|Repository has no tags yet."
msgstr "Repositório ainda não tem tags."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Tags"
@@ -36862,7 +37114,7 @@ msgid "TagsPage|protected"
msgstr "protegido"
msgid "Take a look at the documentation to discover all of GitLab’s capabilities."
-msgstr ""
+msgstr "Dê uma olhada na documentação para descobrir todos os recursos do GitLab."
msgid "Target Branch"
msgstr "Ramificação de destino"
@@ -37037,11 +37289,8 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr "Primeiros passos com Terraform"
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
-msgstr "Como usar o Terraform State gerenciado pelo GitLab?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
+msgstr ""
msgid "Terraform|Job status"
msgstr ""
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "Teste"
@@ -37130,9 +37382,6 @@ msgstr "Casos de teste"
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-msgstr "Análise de cobertura de teste"
-
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] ""
@@ -37382,9 +37631,6 @@ msgstr "O commit não existe."
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr "O relatório de conformidade captura mudanças mescladas que violam as melhores práticas de conformidade."
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37637,7 +37883,7 @@ msgid "The name of the Jenkins project. Copy the name from the end of the URL to
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 ""
+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 merge requests merged by month."
msgstr "O número de solicitações de mesclagem mescladas por mês."
@@ -37667,7 +37913,7 @@ msgid "The pipelines schedule runs pipelines in the future, repeatedly, for spec
msgstr "Os agendamentos de pipelines rodam pipelines no futuro, de forma repetida, para branchs ou tags específicas. Esses agendamentos de pipeline terão acesso limitado com base no seu usuário associado."
msgid "The project can be accessed by any logged in user except external users."
-msgstr ""
+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 ""
@@ -37693,9 +37939,6 @@ msgstr "Fork do projeto realizado com sucesso."
msgid "The project was successfully imported."
msgstr "O projeto foi importado com sucesso."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 "Houve um problema ao enviar o e-mail de confirmação"
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "Ocorreu um erro ao salvar suas alterações."
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38180,7 +38420,7 @@ msgid "These will be sent to %{email} in an attachment once finished."
msgstr "Estes serão enviados para %{email} em um anexo quando terminado."
msgid "Things to be aware of before transferring:"
-msgstr ""
+msgstr "Coisas para estar ciente antes de transferir:"
msgid "Third Party Advisory Link"
msgstr ""
@@ -38228,13 +38468,13 @@ msgid "This action can lead to data loss. To prevent accidental actions we ask y
msgstr "Essa ação pode levar à perda de dados. Para evitar ações acidentais, pedimos que você confirme sua intenção."
msgid "This action cannot be undone, and will permanently delete the %{key} SSH key"
-msgstr ""
+msgstr "Esta ação não pode ser desfeita e excluirá permanentemente a chave %{key} SSH"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} and everything this project contains. %{strongOpen}There is no going back.%{strongClose}"
-msgstr ""
+msgstr "Esta ação exclui %{codeOpen}%{project_path_with_namespace}%{codeClose} e tudo o que este projeto contém. %{strongOpen}Não há volta.%{strongClose}"
msgid "This action deletes %{codeOpen}%{project_path_with_namespace}%{codeClose} on %{date} and everything this project contains."
-msgstr ""
+msgstr "Esta ação exclui %{codeOpen}%{project_path_with_namespace}%{codeClose} rm %{date} e tudo o que este projeto contém."
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 "Esta ação exclui %{codeOpen}%{project_path_with_namespace}%{codeClose} rm %{date} e tudo o que este projeto contém. %{strongOpen}Não há volta.%{strongClose}"
@@ -38362,6 +38602,9 @@ msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
msgstr "Esse épico não existe ou você não tem permissão suficiente."
+msgid "This epic would exceed maximum number of related epics."
+msgstr ""
+
msgid "This feature requires local storage to be enabled"
msgstr "Esta funcionalidade requer que o armazenamento local esteja ativado"
@@ -38473,7 +38716,7 @@ msgstr "Essa issue está oculta porque seu autor foi banido"
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Esta página não está disponível porque você não tem permissão para ler informações de vários projetos."
@@ -38726,7 +38966,7 @@ msgid "This suggestion already matches its content."
msgstr ""
msgid "This title already exists."
-msgstr ""
+msgstr "Este título já existe!"
msgid "This user cannot be unlocked manually from GitLab"
msgstr "Este usuário não pode ser desbloqueado manualmente a partir do GitLab"
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr "Monitoramento de ameaças"
-
msgid "ThreatMonitoring|Alert Details"
msgstr "Detalhes de alerta"
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "agora"
msgid "Timeago|right now"
msgstr "agora mesmo"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ msgstr "Para aceitar este convite, entre."
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 ""
+
msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
msgstr ""
@@ -39203,6 +39440,9 @@ msgstr "Para adicionar a entrada manualmente, forneça os seguintes detalhes ao
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 ""
@@ -39254,9 +39494,6 @@ msgstr "Para começar, insira seu URL de Host do Gitea e um %{link_to_personal_t
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39384,7 +39621,7 @@ msgid "Todos|Filter by project"
msgstr "Filtrar por projeto"
msgid "Todos|It's how you always know what to work on next."
-msgstr ""
+msgstr "É assim que você sempre sabe no que trabalhar a seguir."
msgid "Todos|Mark all as done"
msgstr "Marcar tudo como concluído"
@@ -39396,13 +39633,13 @@ 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 ""
+msgstr "Quando uma issue ou solicitação de mesclagem é atribuído a você, ou quando você recebe um %{strongStart}@menção%{strongEnd} em um comentário, isso aciona automaticamente um novo item em sua lista de tarefas."
msgid "Todos|You're all done!"
msgstr ""
msgid "Todos|Your To-Do List shows what to work on next"
-msgstr ""
+msgstr "Sua lista de tarefas mostra o que fazer a seguir"
msgid "Toggle GitLab Next"
msgstr "Alternar para o GitLab Next"
@@ -39503,8 +39740,11 @@ msgstr "Avatar do tópico"
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
-msgstr "Nome do tópico"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
+msgstr ""
msgid "Topic was successfully updated."
msgstr "Trópico foi atualizando com sucesso"
@@ -39743,14 +39983,14 @@ msgstr ""
msgid "Trigger pipelines for mirror updates"
msgstr "Pipelines de disparo para atualizações de espelho"
-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."
+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 "Gatilho removido."
msgid "Trigger repository check"
-msgstr ""
+msgstr "Ativar a verificação do repositório"
msgid "Trigger this manual action"
msgstr "Acionar esta ação manual"
@@ -39782,6 +40022,9 @@ msgstr "Solucionar problemas e monitorar sua aplicação com rastreamento"
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 "Tente novamente"
@@ -39824,9 +40067,6 @@ msgstr "Tentando se comunicar com seu dispositivo. Conecte (se você ainda não
msgid "Tuesday"
msgstr "Terça-feira"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39873,14 +40113,11 @@ msgid "Two-factor authentication is not enabled for this user"
msgstr "A autenticação de dois fatores não está ativado para este usuário"
msgid "Two-factor grace period"
-msgstr ""
+msgstr "Período de tolerância de dois fatores"
msgid "Type"
msgstr "Tipo"
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr "Dispositivos U2F (%{length})"
@@ -39986,6 +40223,9 @@ 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 "Não foi possível gerar um novo ID de instância"
@@ -40265,9 +40505,6 @@ msgstr "Falha na atualização"
msgid "Update it"
msgstr "Atualizar"
-msgid "Update iteration"
-msgstr "Atualizar iteração"
-
msgid "Update milestone"
msgstr "Atualizar marco"
@@ -40316,9 +40553,6 @@ msgstr "Atualizado em %{updated_at} por %{updated_by}"
msgid "Updated date"
msgstr "Data de atualização"
-msgid "Updates"
-msgstr "Atualizações"
-
msgid "Updating"
msgstr "Atualizando"
@@ -40424,6 +40658,12 @@ msgstr "Uso de minutos de CI por mês"
msgid "UsageQuota|CI minutes usage by project"
msgstr "Uso de minutos de CI por projeto"
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
msgid "UsageQuota|Code packages and container images."
msgstr "Pacotes de código e imagens de contêiner."
@@ -40433,7 +40673,7 @@ msgstr "Uso do período atual"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "Anexos de arquivo e gráficos de design menores."
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr "Assentos"
msgid "UsageQuota|Shared bits of code and text."
msgstr "Bits compartilhados de código e texto."
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Snippets"
@@ -40532,6 +40775,12 @@ msgstr "Cotas de uso"
msgid "UsageQuota|Usage breakdown"
msgstr "Análise de uso"
+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 "Uso de recursos de grupo entre os projetos no grupo %{strong_start}%{group_name}%{strong_end}"
@@ -40544,9 +40793,6 @@ msgstr "Uso de recursos em seus projetos"
msgid "UsageQuota|Usage quotas help link"
msgstr "Link de ajuda de cotas de uso"
-msgid "UsageQuota|Usage since"
-msgstr "Uso desde"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr "Usar armazenamento hash"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40788,10 +41034,10 @@ msgid "User and IP rate limits"
msgstr "Limite de taxa do usuário e IP"
msgid "User cap"
-msgstr ""
+msgstr "Limite de usuários"
msgid "User cap cannot be enabled. The group or one of its subgroups or projects is shared externally."
-msgstr ""
+msgstr "O limite de usuários não pode ser ativado. O grupo ou um de seus subgrupos ou projetos é compartilhado externamente."
msgid "User created at"
msgstr "Usuário criado em"
@@ -41093,7 +41339,7 @@ msgstr ""
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "Usuários podem iniciar um ambiente de desenvolvimento a partir de uma guia do GitLab quando a integração %{linkStart}Gitpod%{linkEnd} está ativada."
-msgid "Users can reactivate their account by signing in."
+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."
@@ -41288,9 +41534,6 @@ msgstr "Várias configurações de email."
msgid "Various settings that affect GitLab performance."
msgstr "Várias configurações que afetam o desempenho do GitLab."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "Status de verificação"
@@ -41834,7 +42077,7 @@ msgstr "Identificadores"
msgid "Vulnerability|Image"
msgstr "Imagem"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr "No momento, não podemos buscar dados para este gráfico."
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr "Não conseguimos determinar o caminho para remover o épico"
@@ -41955,13 +42195,13 @@ msgid "We could not determine the path to remove the issue"
msgstr ""
msgid "We couldn't find any %{scope} matching %{term}"
-msgstr ""
+msgstr "Não conseguimos encontrar nenhum %{scope} que correspondesse a %{term}"
msgid "We couldn't find any %{scope} matching %{term} in group %{group}"
-msgstr ""
+msgstr "Nós não conseguimos encontrar qualquer %{scope} correspondência %{term} no grupo %{group}"
msgid "We couldn't find any %{scope} matching %{term} in project %{project}"
-msgstr ""
+msgstr "Não encontramos nenhum %{scope} correspondente a %{term} no projeto %{project}"
msgid "We couldn't reach the Prometheus server. Either the server no longer exists or the configuration details need updating."
msgstr ""
@@ -42093,16 +42333,16 @@ msgid "Webhooks Help"
msgstr "Ajuda do Webhooks"
msgid "Webhooks|A comment is added to a confidential issue."
-msgstr ""
+msgstr "Um comentário é adicionado a uma issue confidencial."
-msgid "Webhooks|A comment is added to an issue."
-msgstr "Um comentário é adicionado a uma issue."
+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 "Uma issue confidencial é criada, atualizada, fechada ou reaberta."
msgid "Webhooks|A deployment starts, finishes, fails, or is canceled."
-msgstr ""
+msgstr "Uma implantação inicia, termina, falha ou é cancelada."
msgid "Webhooks|A feature flag is turned on or off."
msgstr ""
@@ -42111,16 +42351,16 @@ msgid "Webhooks|A group member is created, updated, or removed."
msgstr ""
msgid "Webhooks|A job's status changes."
-msgstr ""
+msgstr "O status de uma tarefa muda."
msgid "Webhooks|A merge request is created, updated, or merged."
-msgstr ""
+msgstr "Uma solicitação de mesclagem é criada, atualizada ou mesclada."
msgid "Webhooks|A new tag is pushed to the repository."
msgstr "Uma nova tag é enviada para o repositório."
msgid "Webhooks|A pipeline's status changes."
-msgstr ""
+msgstr "O status de um pipeline muda."
msgid "Webhooks|A release is created or updated."
msgstr ""
@@ -42153,7 +42393,7 @@ msgid "Webhooks|Confidential issues events"
msgstr "Eventos de issue confidencial"
msgid "Webhooks|Delete webhook"
-msgstr ""
+msgstr "Excluir webhook"
msgid "Webhooks|Deployment events"
msgstr "Eventos de implantação"
@@ -42222,10 +42462,10 @@ msgid "Webhooks|URL"
msgstr "URL"
msgid "Webhooks|URL must be percent-encoded if it contains one or more special characters."
-msgstr ""
+msgstr "URL deve ser codificado por porcentagem se contiver um ou mais caracteres especiais."
msgid "Webhooks|Used to validate received payloads. Sent with the request in the %{code_start}X-Gitlab-Token HTTP%{code_end} header."
-msgstr ""
+msgstr "Usado para validar as cargas recebidas. Enviado com a solicitação no cabeçalho %{code_start}X-Gitlab-Token HTTP%{code_end}."
msgid "Webhooks|Webhook failed to connect"
msgstr ""
@@ -42240,7 +42480,7 @@ msgid "Webhooks|Wiki page events"
msgstr "Eventos da página Wiki"
msgid "Website"
-msgstr ""
+msgstr "Site"
msgid "Website:"
msgstr "Site:"
@@ -42290,9 +42530,6 @@ msgstr "O que são eventos de auditoria de projetos?"
msgid "What does this command do?"
msgstr "O que este comando faz?"
-msgid "What is Auto DevOps?"
-msgstr "O que é Auto DevOps?"
-
msgid "What is Markdown?"
msgstr "O que é Markdown?"
@@ -42302,9 +42539,6 @@ msgstr "O que é o espelhamento de repositório?"
msgid "What is squashing?"
msgstr "O que é o esmagamento?"
-msgid "What is time tracking?"
-msgstr "O que é o acompanhamento do tempo?"
-
msgid "What is your job title? (optional)"
msgstr "Qual é o título do seu trabalho? (opcional)"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "Quando as solicitações de mesclagem e commits na ramificação padrão são fechadas, todas as issues aos quais eles fazem referência também são encerrados."
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42353,7 +42584,7 @@ msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{
msgstr "Quando usar os protocolos %{code_open}http://%{code_close} ou %{code_open}https://%{code_close}, por favor forneça o URL exato do repositório. Redirecionamentos HTTP não serão seguidos."
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 ""
+msgstr "Ao transferir seu projeto para um grupo, você pode gerenciar facilmente vários projetos, visualizar cotas de uso para armazenamento, minutos de pipeline e usuários e iniciar uma avaliação ou atualizar para um nível pago."
msgid "When:"
msgstr "Quando:"
@@ -42385,14 +42616,14 @@ msgstr "Quem vai usar essa avaliação do GitLab?"
msgid "Who will be using this group?"
msgstr "Quem usará esse grupo?"
-msgid "Why are you signing up? (Optional)"
-msgstr "Por que você está se inscrevendo? (Opcional)"
+msgid "Why are you signing up? (optional)"
+msgstr ""
msgid "Wiki"
msgstr "Wiki"
msgid "Wiki page"
-msgstr ""
+msgstr "Página da wiki"
msgid "Wiki page was successfully created."
msgstr "Página Wiki criada com sucesso."
@@ -42539,7 +42770,7 @@ msgid "WikiPage|Save changes"
msgstr "Salvar alterações"
msgid "WikiPage|Tip: You can move this page by adding the path to the beginning of the title."
-msgstr ""
+msgstr "Dica: Você pode mover esta página adicionando o caminho para o início do título."
msgid "WikiPage|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
msgstr "Dica: Você pode especificar o caminho completo para o novo arquivo. Nós vamos criar automaticamente quaisquer diretórios ainda não existentes."
@@ -42619,21 +42850,30 @@ msgstr "Trabalho em andamento (aberto e não atribuído)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
msgid "WorkItem|Select type"
-msgstr ""
+msgstr "Selecione o tipo"
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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 "Você está prestes a excluir este projeto com fork que contém:"
@@ -42808,7 +43056,7 @@ msgstr "Você está em uma instância somente-leitura do GitLab."
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "Você está recebendo esta mensagem porque você é um administrador do GitLab para %{url}."
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ msgstr "Você pode testar o seu .gitlab-ci.yml no %{linkStart}CI Lint%{linkEnd}.
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "Você pode ver a fonte ou %{linkStart}%{cloneIcon} clonar o repositório%{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 ""
+
msgid "You cannot %{action} %{state} users."
msgstr ""
@@ -43013,7 +43264,7 @@ msgid "You cannot write to this read-only GitLab instance."
msgstr "Você não pode escrever nesta instância somente-leitura do GitLab."
msgid "You can’t edit files directly in this project. Fork this project and submit a merge request with your changes."
-msgstr ""
+msgstr "Você não pode editar arquivos diretamente nesse projeto. Faça um fork nesse projeto e envie um merge request com suas alterações."
msgid "You could not create a new trigger."
msgstr "Você não pôde criar um novo gatilho."
@@ -43049,7 +43300,7 @@ msgid "You don't have any U2F devices registered yet."
msgstr "Você ainda não tem nenhum dispositivo U2F registrado."
msgid "You don't have any WebAuthn devices registered yet."
-msgstr ""
+msgstr "Você ainda não tem nenhum dispositivo WebAuthn registrado."
msgid "You don't have any active chat names."
msgstr "Você não tem nenhum nome de bate-papo ativo."
@@ -43114,7 +43365,7 @@ msgid "You have been unsubscribed from this thread."
msgstr "Você não está mais inscrito neste tópico."
msgid "You have declined the invitation to join %{title} %{name}."
-msgstr ""
+msgstr "Você recusou o convite para ingressar em %{title} %{name}."
msgid "You have imported from this project %{numberOfPreviousImports} times before. Each new import will create duplicate issues."
msgstr ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43522,7 +43776,7 @@ msgid "Your device needs to be set up. Plug it in (if needed) and click the butt
msgstr "Seu dispositivo precisa ser configurado. Conecte (se necessário) e clique no botão à esquerda."
msgid "Your device was successfully set up! Give it a name and register it with the GitLab server."
-msgstr ""
+msgstr "Seu dispositivo foi configurado com sucesso! Dê um nome e registre-o no servidor do 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 "Seu arquivo deve conter uma coluna chamada %{codeStart}title%{codeEnd}. Uma coluna de %{codeStart}description%{codeEnd} é opcional. O tamanho máximo de arquivo permitido é 10 MB."
@@ -43636,7 +43890,7 @@ msgid "Your search timed out"
msgstr "Sua pesquisa expirou"
msgid "Your sign-in page is %{url}."
-msgstr ""
+msgstr "Sua página de entrada é %{url}."
msgid "Your snippets"
msgstr ""
@@ -43674,7 +43928,7 @@ 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 ""
+msgstr "Antes de ativar esta integração, você deve configurar o ZenTao. Para mais detalhes, leia a documentação de integração do %{link_start}ZenTao%{link_end}."
msgid "ZentaoIntegration|Enter new ZenTao API token"
msgstr ""
@@ -43682,13 +43936,13 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr "Se for diferente do URL da web."
-msgid "ZentaoIntegration|Issue list"
-msgstr ""
-
msgid "ZentaoIntegration|Open ZenTao"
msgstr ""
msgid "ZentaoIntegration|Use ZenTao as this project's issue tracker."
+msgstr "Use ZenTao como o rastreador de issues deste projeto."
+
+msgid "ZentaoIntegration|ZenTao"
msgstr ""
msgid "ZentaoIntegration|ZenTao API URL (optional)"
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr "aprovado por: "
-
msgid "archived"
msgstr ""
@@ -43795,7 +44046,7 @@ msgid "artifacts"
msgstr "artefatos"
msgid "assign yourself"
-msgstr ""
+msgstr "atribuir a si mesmo"
msgid "at"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ msgstr ""
msgid "ciReport|All tools"
msgstr "Todas as ferramentas"
+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 ""
@@ -44005,13 +44268,13 @@ msgid "ciReport|Cluster Image Scanning"
msgstr ""
msgid "ciReport|Code Quality"
-msgstr ""
+msgstr "Qualidade de código"
msgid "ciReport|Code Quality failed loading results"
-msgstr ""
+msgstr "Qualidade de código falhou ao carregar resultados"
msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr ""
+msgstr "Os resultados das métricas de teste de qualidade de código estão sendo analisados"
msgid "ciReport|Code quality degraded"
msgstr ""
@@ -44092,7 +44355,7 @@ msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr ""
msgid "ciReport|License Compliance"
-msgstr ""
+msgstr "Conformidade de licença"
msgid "ciReport|License Compliance failed loading results"
msgstr ""
@@ -44127,7 +44390,7 @@ msgid "ciReport|Manage licenses"
msgstr "Gerenciar licenças"
msgid "ciReport|Manually Added"
-msgstr ""
+msgstr "Adicionado manualmente"
msgid "ciReport|New"
msgstr ""
@@ -44343,7 +44606,7 @@ msgid "email '%{email}' is not a verified email."
msgstr ""
msgid "email address settings"
-msgstr ""
+msgstr "configurações de endereço de email"
msgid "enabled"
msgstr "habilitado"
@@ -44683,16 +44946,16 @@ msgstr ""
msgid "member"
msgid_plural "members"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "membro"
+msgstr[1] "membros"
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "solicitação de mesclagem"
msgstr[1] "solicitações de mesclagem"
-msgid "merged %{timeAgo}"
-msgstr "mesclado em %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44703,6 +44966,12 @@ 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 "1 merge commit"
@@ -44712,6 +44981,12 @@ msgstr "Adiciona %{commitCount} e %{mergeCommitCount} to %{targetBranch}%{squash
msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
msgstr "Adiciona %{commitCount} para %{targetBranch}."
+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 "Essa solicitação de mesclagem não contém alterações"
@@ -44782,17 +45057,14 @@ msgid "mrWidget|Approved by you and others"
msgstr "Aprovado por você e outros"
msgid "mrWidget|Assign yourself to these issues"
-msgstr ""
+msgstr "mrWidget|Atribuir-se a essas issues"
msgid "mrWidget|Assign yourself to this issue"
-msgstr ""
+msgstr "Atribuir-se a essa issue"
msgid "mrWidget|Cancel auto-merge"
msgstr "Cancelar mesclagem automática"
-msgid "mrWidget|Check out branch"
-msgstr "Checkout branch"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr "Verificando se a solicitação de mesclagem pode ser feito a mesclagem…"
@@ -44834,9 +45106,6 @@ msgstr "Dispensar"
msgid "mrWidget|Does not delete the source branch"
msgstr "Não exclui a ramificação de origem"
-msgid "mrWidget|Email patches"
-msgstr "Email patches"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Falha ao carregar estatísticas de implantação"
@@ -44947,9 +45216,6 @@ msgstr "Abrir no Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Abrir no IDE Web"
-msgid "mrWidget|Plain diff"
-msgstr "Diff em texto"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr "meu-grupo-incrível"
msgid "my-channel"
msgstr "meu-canal"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr "nunca expira"
msgid "new merge request"
msgstr "nova solicitação de mesclagem"
-msgid "no approvers"
-msgstr "Nenhum aprovadores"
-
msgid "no expiration"
msgstr "nenhuma expiração"
@@ -45130,6 +45396,12 @@ msgstr "nenhum escopo selecionado"
msgid "none"
msgstr "nenhum"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "não encontrado"
@@ -45188,9 +45460,6 @@ msgstr "comentário pendente"
msgid "pending deletion"
msgstr "exclusão pendente"
-msgid "per day"
-msgstr "por dia"
-
msgid "personal access token"
msgstr "token de acesso pessoal"
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "resposta"
msgstr[1] "respostas"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr "repositórios"
@@ -45474,7 +45746,7 @@ msgid "triggered"
msgstr ""
msgid "two-factor authentication settings"
-msgstr ""
+msgstr "configurações de autenticação de dois fatores"
msgid "type must be Debian"
msgstr ""
@@ -45575,7 +45847,7 @@ msgid "was scheduled to merge after pipeline succeeds by"
msgstr ""
msgid "wiki page"
-msgstr ""
+msgstr "página da wiki"
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "com %{additions} adições, %{deletions} remoções."
diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po
index b78303533c3..080d0604603 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr "%{level_name} não é permitido num grupo %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} não é permitido uma vez que o projeto de origem do fork tem uma visibilidade mais baixa."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr "1-9 contribuições"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 contribuições"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "1ª contribuição!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 contribuições"
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Um membro da equipa de abuso irá, rever a tua denúncia assim que possível."
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr "Adicionar um link"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Adicionar texto em negrito"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 "Ativar executadores compartilhados aos novos projetos"
+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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr "Nenhum pipeline necessário"
+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 "Configuração de pipeline necessária"
+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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr "Todos os projetos"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,14 +3701,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Permitir envios de membros que podem mesclar ao ramo de destino."
+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 "Permitir que proprietários de grupos gerenciem as definições relacionadas ao LDAP"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 "Ocorreu um erro ao remover épicos."
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr "Estatísticas"
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 "Verificação de anti-spam"
@@ -4334,12 +4393,27 @@ msgstr "A aplicação foi atualizada com sucesso."
msgid "Application: %{name}"
msgstr "Aplicação: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "agosto"
msgid "Authenticate"
msgstr ""
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr ""
msgid "Authentication Log"
msgstr "Registo de Autenticação"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Falha na autenticação: %{error_message}"
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr "Abaixo vais encontrar todos os grupos que são públicos."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Visão Geral"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Ramos protegidos podem ser geridos em %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Mostrar ramos ativos"
@@ -6289,9 +6363,6 @@ msgstr "divergiu da upstream"
msgid "Branches|merged"
msgstr "mesclado"
-msgid "Branches|project settings"
-msgstr "definições do projeto"
-
msgid "Branches|protected"
msgstr "protegido"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr "Variáveis de CI"
-msgid "CI will run using the credentials assigned above."
-msgstr "O CI será executado ao usar as credenciais atribuídas acima."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "Configuração de CI/CD"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Cancelar"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Verifica Novamente"
msgid "Check feature availability on namespace plan"
msgstr "Verificar disponibilidade de recursos no plano do espaço de nomes"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Escolhe qualquer cor."
msgid "Choose file…"
msgstr "Escolher um ficheiro…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Limpar"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Esta opção permite-te instalar aplicações no RBAC clusters."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
msgstr ""
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Estado Geo"
+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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "A atualizar"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po
index 95fce14648a..b633d37ebe6 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:09\n"
+"PO-Revision-Date: 2022-05-01 07:37\n"
msgid " %{start} to %{end}"
msgstr " de la %{start} până la %{end}"
@@ -304,12 +304,6 @@ msgstr[0] "%d grup"
msgstr[1] "%d grupuri"
msgstr[2] "%d de grupuri"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d grup selectat"
-msgstr[1] "%d grupuri selectate"
-msgstr[2] "%d de grupuri selectate"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d oră"
@@ -360,9 +354,9 @@ msgstr[2] "%d de merge request-uri la care nu aveți acces."
msgid "%d merge requests"
msgid_plural "%d merge requests"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d merge request"
+msgstr[1] "%d merge request-uri"
+msgstr[2] "%d de merge request-uri"
msgid "%d metric"
msgid_plural "%d metrics"
@@ -390,9 +384,9 @@ msgstr[2] "Încă %d de comentarii"
msgid "%d new license"
msgid_plural "%d new licenses"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d licență nouă"
+msgstr[1] "%d licențe noi"
+msgstr[2] "%d de licențe noi"
msgid "%d open issue"
msgid_plural "%d open issues"
@@ -438,9 +432,9 @@ msgstr[2] "%d de proiecte selectate"
msgid "%d removed license"
msgid_plural "%d removed licenses"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d licență înlăturată"
+msgstr[1] "%d licențe înlăturate"
+msgstr[2] "%d de licențe înlăturate"
msgid "%d second"
msgid_plural "%d seconds"
@@ -448,17 +442,11 @@ msgstr[0] "%d secundă"
msgstr[1] "%d secunde"
msgstr[2] "%d de secunde"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d fragment selectat"
-msgstr[1] "%d fragmente selectate"
-msgstr[2] "%d de fragmente selectate"
-
msgid "%d star"
msgid_plural "%d stars"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d stea"
+msgstr[1] "%d stele"
+msgstr[2] "%d de stele"
msgid "%d tag"
msgid_plural "%d tags"
@@ -510,9 +498,9 @@ msgstr[2] ""
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d vulnerabilitate setată ca fiind respinsă"
+msgstr[1] "%d vulnerabilități setate ca fiind respinse"
+msgstr[2] "%d de vulnerabilități setate ca fiind respinse"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
@@ -542,10 +530,10 @@ msgid "%{actionText} & %{openOrClose} %{noteable}"
msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{actionText} & close %{noteable}"
-msgstr ""
+msgstr "%{actionText} & închide %{noteable}"
msgid "%{actionText} & reopen %{noteable}"
-msgstr ""
+msgstr "%{actionText} & redeschide %{noteable}"
msgid "%{address} is an invalid IP address range"
msgstr "%{address} este un interval de adrese IP invalid"
@@ -579,24 +567,24 @@ msgstr[2] "%{bold_start}%{count}%{bold_end} de membrii"
msgid "%{bold_start}%{count}%{bold_end} opened merge request"
msgid_plural "%{bold_start}%{count}%{bold_end} opened merge requests"
-msgstr[0] "%{bold_start}%{count}%{bold_end} merge request deschis"
-msgstr[1] "%{bold_start}%{count}%{bold_end} cereri de îmbinare deschise"
-msgstr[2] "%{bold_start}%{count}%{bold_end} de cereri de îmbinare deschise"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
msgid "%{codeStart}type%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stage%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
msgstr "%{codeStart}type%{codeEnd} este depreciat și va fi înlăturat în 15.0. Utilizați în schimb %{codeStart}stagiu%{codeEnd}. %{linkStart}Aflați mai multe %{linkEnd}"
msgid "%{codeStart}types%{codeEnd} is deprecated and will be removed in 15.0. Use %{codeStart}stages%{codeEnd} instead. %{linkStart}Learn More %{linkEnd}"
-msgstr ""
+msgstr "%{codeStart}types%{codeEnd} este depreciat și va fi eliminat în 15.0. Utilizați în schimb %{codeStart}stages%{codeEnd}. %{linkStart}Aflați mai multe %{linkEnd}"
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}Mascat:%{code_close} Ascuns în log-urile de joburi. Trebuie să corespundă cerințelor de mascare."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Protejat:%{code_close} Este expus numai la ramurile sau etichetele protejate."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
-msgstr "%{commit_author_link} redactat %{commit_authored_timeago}"
+msgstr "%{commit_author_link} a redactat %{commit_authored_timeago}"
msgid "%{commit_author_link} authored %{commit_authored_timeago} and %{commit_committer_avatar} %{commit_committer_link} committed %{commit_committer_timeago}"
msgstr "%{commit_author_link} a redactat %{commit_authored_timeago} și %{commit_committer_avatar}%{commit_committer_link} a făcut commit %{commit_committer_timeago}"
@@ -639,9 +627,9 @@ msgstr "%{count} aprobări de la %{name}"
msgid "%{count} contact"
msgid_plural "%{count} contacts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{count} contact"
+msgstr[1] "%{count} contacte"
+msgstr[2] "%{count} de contacte"
msgid "%{count} files touched"
msgstr "%{count} fișiere atinse"
@@ -704,7 +692,7 @@ msgid "%{description}- Sentry event: %{errorUrl}- First seen: %{firstSeen}- Last
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}"
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}Cercetare avansată%{doc_link_end} este dezactivată deoarece %{ref_elem} nu este ramura implicită. %{docs_link}"
msgid "%{doc_link_start}Advanced search%{doc_link_end} is enabled."
msgstr "%{doc_link_start}Căutarea avansată%{doc_link_end} este activată."
@@ -739,6 +727,9 @@ msgstr "%{edit_in_new_fork_notice} Încercați să încărcați iar un fișier."
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} mai multe pipeline-uri downstream"
@@ -752,7 +743,7 @@ msgid "%{firstMilestoneName} + %{numberOfOtherMilestones} more"
msgstr "%{firstMilestoneName} + %{numberOfOtherMilestones} mai mult"
msgid "%{gitlab_experience_text}. Don't worry, this information isn't shared outside of your self-managed GitLab instance."
-msgstr "%{gitlab_experience_text}. Nu vă faceți griji, aceste informații nu sunt partajate în afara instanței GitLab autogestionate."
+msgstr "%{gitlab_experience_text}. Nu vă faceți griji, aceste informații nu sunt partajate în afara instanței dvs. autogestionată GitLab."
msgid "%{gitlab_experience_text}. We won't share this information with anyone."
msgstr "%{gitlab_experience_text}. Nu vom împărtăși aceste informații cu nimeni."
@@ -767,7 +758,7 @@ msgid "%{group_name} group members"
msgstr "Membrii grupului %{group_name}"
msgid "%{group_name} is approaching the limit of available seats"
-msgstr ""
+msgstr "%{group_name} se apropie de limita de seat-uri disponibile"
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} utilizează conturi gestionate de grup. Trebuie să creați un nou cont GitLab care va fi gestionat de %{group_name}."
@@ -815,10 +806,10 @@ msgid "%{labelStart}Class:%{labelEnd} %{class}"
msgstr "%{labelStart}Clasa:%{labelEnd} %{class}"
msgid "%{labelStart}Crash Address:%{labelEnd} %{crash_address}"
-msgstr "%{labelStart}Adresa conflictului:%{labelEnd} %{crash_address}"
+msgstr "%{labelStart}Adresa incidentului:%{labelEnd} %{crash_address}"
msgid "%{labelStart}Crash State:%{labelEnd} %{stacktrace_snippet}"
-msgstr "%{labelStart}Starea de avarie:%{labelEnd} %{stacktrace_snippet}"
+msgstr "%{labelStart}Starea incidentului:%{labelEnd} %{stacktrace_snippet}"
msgid "%{labelStart}Evidence:%{labelEnd} %{evidence}"
msgstr "%{labelStart}Evidență:%{labelEnd} %{evidence}"
@@ -868,21 +859,15 @@ msgstr "%{level_name} nu este permisă într-un grup %{group_level_name}."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} nu este permis, deoarece proiectul sursă al bifurcației are o vizibilitate mai mică."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr "%{link_start}Adăugați o licență%{link_end} pe care ați primit-o de la GitLab Inc."
msgid "%{link_start}Remove the %{draft_snippet} prefix%{link_end} from the title to allow this merge request to be merged when it's ready."
-msgstr "%{link_start}Înlăturați %{draft_snippet} prefixul%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat atunci când este gata."
+msgstr "%{link_start}Înlăturați prefixul %{draft_snippet}%{link_end} din titlu pentru a permite ca acest merge request să fie îmbinat atunci când este gata."
msgid "%{link_start}Start the title with %{draft_snippet}%{link_end} to prevent a merge request draft from merging before it's ready."
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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Ce informații colectează GitLab Inc.?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, și încă %{awardsListLength} mai multe"
@@ -932,7 +917,7 @@ msgid "%{name} is already being used for another emoji"
msgstr "%{name} este deja folosit pentru un alt emoji"
msgid "%{name} is reserved for %{type} report type"
-msgstr ""
+msgstr "%{name} este rezervat pentru tipul de raport %{type}"
msgid "%{name} is scheduled for %{action}"
msgstr "%{name} este programat pentru %{action}"
@@ -950,7 +935,7 @@ msgid "%{name}, confirm your email address now!"
msgstr "%{name}, confirmați-vă adresa de e-mail acum!"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}: %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -974,7 +959,7 @@ msgid "%{openedEpics} open, %{closedEpics} closed"
msgstr "%{openedEpics} deschise, %{closedEpics} închise"
msgid "%{openedIssues} open, %{closedIssues} closed"
-msgstr "%{openedIssues} deschis, %{closedIssues} închis"
+msgstr "%{openedIssues} deschise, %{closedIssues} închise"
msgid "%{percentage}%% issues closed"
msgstr ""
@@ -995,10 +980,10 @@ msgid "%{placeholder} is not a valid theme"
msgstr "%{placeholder} nu este o temă validă"
msgid "%{policy_link} (notifying after %{elapsed_time} minutes unless %{status})"
-msgstr ""
+msgstr "%{policy_link} (notificare după %{elapsed_time} minute, dacă nu este %{status})"
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} este un proiect pe care îl puteți utiliza pentru a adăuga un README la profilul GitLab. Creați un proiect public și inițializați repozitoriul cu un README pentru a începe. %{help_link_start}Aflați mai multe.%{help_link_end}"
msgid "%{ref} cannot be added: %{error}"
msgstr "%{ref} nu poate fi adăugat: %{error}"
@@ -1031,7 +1016,7 @@ msgid "%{rotation} has been recalculated with the remaining participants. Please
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."
msgid "%{runner} created %{timeago}"
-msgstr ""
+msgstr "%{runner} creat %{timeago}"
msgid "%{scope} results for term '%{term}'"
msgstr "%{scope} rezultate pentru termenul „%{term}â€"
@@ -1054,9 +1039,6 @@ msgstr[0] "Rezultatul %{securityScanner} nu este disponibil deoarece nu a fost r
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}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}Ce informații sunt partajate cu GitLab Inc.?%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1070,7 +1052,7 @@ msgid "%{size} MiB"
msgstr "%{size} MiB"
msgid "%{size} bytes"
-msgstr "%{size} biți"
+msgstr "%{size} octeți"
msgid "%{sourceBranch} into %{targetBranch}"
msgstr "%{sourceBranch} în %{targetBranch}"
@@ -1172,7 +1154,7 @@ 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."
msgid "%{timebox_type} does not support burnup charts"
-msgstr "%{timebox_type} nu acceptă diagrame burnup"
+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ă"
@@ -1202,7 +1184,7 @@ msgid "%{total} warnings found: showing first %{warningsDisplayed}"
msgstr "%{total} avertismente găsite: se afișează primul %{warningsDisplayed}"
msgid "%{type} only supports %{name} name"
-msgstr ""
+msgstr "%{type} acceptă numai numele %{name}"
msgid "%{userName} (cannot merge)"
msgstr "%{userName} (nu se poate îmbina)"
@@ -1214,25 +1196,25 @@ msgid "%{user_name} (%{user_username}) was removed from %{rotation} in %{schedul
msgstr "%{user_name} (%{user_username}) a fost înlăturat din %{rotation} în %{schedule} din %{project}. "
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project_link}: "
-msgstr ""
+msgstr "%{user_name} (%{user_username}) a fost eliminat din următoarele politici de escaladare în %{project_link}: "
msgid "%{user_name} (%{user_username}) was removed from the following escalation policies in %{project}:"
-msgstr ""
+msgstr "%{user_name} (%{user_username}) a fost eliminat din următoarele politici de escaladare în %{project}:"
msgid "%{user_name} profile page"
-msgstr "%{user_name} pagină profil"
+msgstr "Pagina de profil %{user_name}"
msgid "%{username} changed the draft status of merge request %{mr_link}"
-msgstr "%{username} a schimbat statutul de schiță al merge request-ului %{mr_link}"
+msgstr "%{username} a schimbat statutul de draft al merge request-ului %{mr_link}"
msgid "%{username} has asked for a GitLab account on your instance %{host}:"
-msgstr "%{username} a solicitat un cont GitLab în instanța dvs. %{host}:"
+msgstr "%{username} a solicitat un cont GitLab pe instanța dvs. %{host}:"
msgid "%{username}'s avatar"
msgstr "Avatarul lui %{username}"
msgid "%{user} created a merge request: %{mr_link}"
-msgstr "%{user} a creat o cerere de îmbinare: %{mr_link}"
+msgstr "%{user} a creat un merge request: %{mr_link}"
msgid "%{user} created an epic: %{epic_link}"
msgstr "%{user} a creat o epică: %{epic_link}"
@@ -1256,7 +1238,7 @@ msgid "%{webhooks_link_start}%{webhook_type}%{link_end} enable you to send notif
msgstr "%{webhooks_link_start}%{webhook_type}%{link_end} vă permit să trimiteți notificări aplicațiilor web ca răspuns la evenimente dintr-un grup sau proiect. Vă recomandăm să utilizați o %{integrations_link_start}integrație%{link_end} de preferință față de un webhook."
msgid "%{widget} options"
-msgstr ""
+msgstr "Opțiuni de %{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 "%{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."
@@ -1352,16 +1334,16 @@ msgstr[1] ""
msgstr[2] ""
msgid "(this user)"
-msgstr ""
+msgstr "(acest utilizator)"
msgid "(we need your current password to confirm your changes)"
msgstr "(avem nevoie de parola curentă pentru a confirma modificările)"
msgid "* All times are in UTC unless specified"
-msgstr ""
+msgstr "* Toate orele sunt în UTC, cu excepția cazului în care se specifică"
msgid "*Required"
-msgstr ""
+msgstr "*Obligatoriu"
msgid "+ %{amount} more"
msgstr "+ %{amount} mai mult"
@@ -1381,9 +1363,6 @@ msgstr[0] "+%d mai mult"
msgstr[1] "+%d mai multe"
msgstr[2] "+%d mai multe"
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} mai mulți aprobatori"
-
msgid "+%{extra} more"
msgstr "+%{extra} mai mult"
@@ -1409,7 +1388,7 @@ msgid ", or "
msgstr ", sau "
msgid "- %{policy_name} (notifying after %{elapsed_time} minutes unless %{status})"
-msgstr ""
+msgstr "- %{policy_name} (notificare după %{elapsed_time} minute, dacă nu este %{status})"
msgid "- Available to run jobs."
msgstr "- Disponibil pentru a executa joburi."
@@ -1424,7 +1403,7 @@ msgid "- Not available to run jobs."
msgstr "- Nedisponibil pentru a executa joburi."
msgid "- Select -"
-msgstr ""
+msgstr "- Selectați -"
msgid "- User"
msgid_plural "- Users"
@@ -1447,6 +1426,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 octeți"
@@ -1594,6 +1576,9 @@ msgstr[2] "%d de ani rămași"
msgid "1-9 contributions"
msgstr "1-9 contribuții"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 contribuții"
@@ -1606,6 +1591,9 @@ msgstr "192.168.0.0/24 sau 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "Prima contribuție!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 contribuții"
@@ -1661,7 +1649,7 @@ msgid "A .NET Core console application template, customizable for any .NET Core
msgstr "Un șablon de aplicație consolă .NET Core, personalizabil pentru orice proiect .NET Core"
msgid "A CI/CD pipeline must run and be successful before merge."
-msgstr "O conductă CI/CD trebuie să ruleze și să aibă succes înainte de îmbinare."
+msgstr "Un pipeline CI/CD trebuie să ruleze și să aibă succes înainte de îmbinare."
msgid "A GitBook site that uses Netlify for CI/CD instead of GitLab, but still with all the other great GitLab features"
msgstr "Un site GitBook care folosește Netlify pentru CI/CD în loc de GitLab, dar cu toate celelalte funcții excelente ale GitLab."
@@ -1681,9 +1669,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr "Un element de meniu din „Tabloul de bord al metricilor†apare în secțiunea de „Monitorizare†din Zona Admin."
-
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"
@@ -1729,11 +1714,8 @@ msgstr "Un control managerial, operațional sau tehnic (adică o măsură de pro
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "Un membru al echipei de combatere a abuzurilor va analiza raportul dumneavoastră cât mai curând posibil."
-msgid "A merge request hasn't yet been merged"
-msgstr "O cerere de îmbinare nu a fost încă îmbinată"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
-msgstr ""
+msgstr "A fost creat un nou pipeline Auto DevOps, accesați pagina de Pipeline-uri pentru detalii."
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 "A fost publicată o nouă versiune %{tag} pentru %{name}. Vizitați pagina %{release_link_start}pagina Lansări%{release_link_end} pentru a citi mai multe despre aceasta."
@@ -1742,7 +1724,7 @@ msgid "A new Release %{tag} for %{name} was published. Visit the Releases page t
msgstr "A fost publicată o nouă versiune %{tag} pentru %{name}. Vizitați pagina Lansări pentru a citi mai multe despre aceasta:"
msgid "A new email address has been added to your GitLab account: %{email}"
-msgstr ""
+msgstr "O nouă adresă de e-mail a fost adăugată la contul dvs. GitLab: %{email}"
msgid "A new impersonation token has been created."
msgstr "A fost creat un nou token de impersonare."
@@ -1756,6 +1738,9 @@ msgstr "A fost creat un nou token de acces personal, numit %{token_name}."
msgid "A non-confidential epic cannot be assigned to a confidential parent epic"
msgstr "O epică neconfidențială nu poate fi atribuită unei epice părinte confidențială"
+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 "Un site HTML simplu care folosește Netlify pentru CI/CD în loc de GitLab, dar cu toate celelalte funcții GitLab."
@@ -1775,7 +1760,7 @@ msgid "A project’s repository name defines its URL (the one you use to access
msgstr "Numele de repozitoriu al unui proiect îi definește URL-ul (cel pe care îl folosiți pentru a accesa proiectul via un browser) și locul său pe discul de fișier unde este instalat GitLab. %{link_start}Aflați mai multe.%{link_end}"
msgid "A quarterly reconciliation is due on %{date}"
-msgstr ""
+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"
@@ -1793,7 +1778,7 @@ msgid "A title is required"
msgstr "Este necesar un titlu"
msgid "A user with write access to the source branch selected this option"
-msgstr "Un utilizator cu acces de scriere la ramura sursă a selectat această opțiune"
+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}'"
@@ -1802,10 +1787,10 @@ msgid "API"
msgstr "API"
msgid "API Fuzzing"
-msgstr "Fuzzing API"
+msgstr "Fuzzing de API"
msgid "API Fuzzing Configuration"
-msgstr "Configurare Fuzzing API"
+msgstr "Configurare de Fuzzing de API"
msgid "API Help"
msgstr "Ajutor API"
@@ -1826,7 +1811,7 @@ msgid "APIFuzzing|$VARIABLE_WITH_USERNAME"
msgstr "$VARIABLE_WITH_USERNAME"
msgid "APIFuzzing|API Fuzzing Configuration"
-msgstr "Configurare Fuzzing API"
+msgstr "Configurare de Fuzzing de API"
msgid "APIFuzzing|Base URL of API testing target. For example, http://www.example.com."
msgstr "Adresa URL de bază a țintei de testare API. De exemplu, http://www.example.com."
@@ -1841,7 +1826,7 @@ msgid "APIFuzzing|Configure HTTP basic authentication values. Other authenticati
msgstr "Configurați valorile de autentificare de bază HTTP. Sunt acceptate și alte metode de autentificare. %{linkStart}Aflați mai multe%{linkEnd}."
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 "Personalizați opțiunile de configurare pentru fuzzing API ale proiectului dvs. și copiați fragmentul de cod în fișierul .gitlab-ci.yml pentru a aplica orice modificări. Rețineți că acest instrument nu reflectă sau actualizează automat fișierul .gitlab-ci.yml. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{docsLinkStart}documentația GitLab API Fuzzing%{docsLinkEnd}."
+msgstr "Personalizați opțiunile de configurare pentru fuzzing API ale proiectului dvs. și copiați fragmentul de cod în fișierul .gitlab-ci.yml pentru a aplica orice modificări. Rețineți că acest instrument nu reflectă sau actualizează automat fișierul .gitlab-ci.yml. Pentru detalii despre opțiunile de configurare mai avansate, consultați %{docsLinkStart}documentația GitLab pentru Fuzzing de API%{docsLinkEnd}."
msgid "APIFuzzing|Enable authentication"
msgstr "Activați autentificarea"
@@ -1898,16 +1883,16 @@ msgid "APIFuzzing|Tip: Insert this part below all stages"
msgstr "Sfat: Introduceți această parte dedesubtul tuturor etapelor"
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 "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o variabilă %{ciVariablesLinkStart}CI%{ciVariablesLinkEnd}. Un utilizator cu drepturi de acces de întreținător poate gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}. Am detectat că nu sunteți un întreținător. Faceți un commit al modificărilor dvs. și atribuiți-le unui întreținător pentru a actualiza acreditările înainte de îmbinare."
+msgstr "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o %{ciVariablesLinkStart}variabilă CI%{ciVariablesLinkEnd}. Un utilizator cu drepturi de acces de tip întreținător poate gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}. Am detectat că nu sunteți un întreținător. Confirmați modificările și atribuiți-le unui întreținător pentru a actualiza acreditările înainte de îmbinare."
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 "Pentru a preveni o breșă de securitate, informațiile de autentificare trebuie adăugate ca o %{ciVariablesLinkStart}variabilă CI%{ciVariablesLinkEnd}. În calitate de utilizator cu drepturi de acces de întreținător, puteți gestiona variabilele CI în zona %{ciSettingsLinkStart}Setări%{ciSettingsLinkEnd}."
msgid "APIFuzzing|Username for basic authentication"
-msgstr "Nume utilizator pentru autentificare de bază"
+msgstr "Numele de utilizator pentru autentificarea de bază"
msgid "APIFuzzing|You may need a maintainer's help to secure your credentials."
-msgstr "Este posibil să aveți nevoie de ajutorul unui întreținător pentru a vă securiza acreditările."
+msgstr "Este posibil să aveți nevoie de ajutorul unui întreținător pentru a vă proteja acreditările."
msgid "APIFuzzing|folder/example.postman_collection.json"
msgstr "dosar/example.postman_collection.json"
@@ -1916,7 +1901,7 @@ msgid "APIFuzzing|folder/example_fuzz.har"
msgstr "dosar/example_fuzz.har"
msgid "APIFuzzing|folder/openapi.json"
-msgstr ""
+msgstr "dosar/openapi.json"
msgid "AWS Access Key"
msgstr "Cheia de acces AWS"
@@ -1946,7 +1931,7 @@ msgid "About this feature"
msgstr "Despre această funcție"
msgid "About your company"
-msgstr ""
+msgstr "Despre compania dumneavoastră"
msgid "Abuse Reports"
msgstr "Rapoarte abuz"
@@ -1994,7 +1979,7 @@ msgid "Access to '%{classification_label}' not allowed"
msgstr "Accesul la \"%{classification_label}\" nu este permis"
msgid "Access tokens expire after 2 hours. A refresh token may be used at any time to generate a new access token. Non-expiring access tokens are deprecated. Clear this setting to enable backward compatibility."
-msgstr ""
+msgstr "Tokenurile de acces expiră după 2 ore. Un token de reîmprospătare poate fi utilizat în orice moment pentru a genera un nou token de acces. Tokenurile de acces fără expirare sunt depreciate. Debifați această setare pentru a activa compatibilitatea retroactivă."
msgid "AccessDropdown|Deploy Keys"
msgstr "Chei de implementare"
@@ -2009,52 +1994,52 @@ msgid "AccessDropdown|Users"
msgstr "Utilizatori"
msgid "AccessTokens|Access Tokens"
-msgstr "Token-uri de access"
+msgstr "Tokenuri de acces"
msgid "AccessTokens|Are you sure?"
msgstr "Sunteți sigur?"
msgid "AccessTokens|Are you sure? Any RSS or calendar URLs currently in use will stop working."
-msgstr "Sunteți sigur? Orice URL RSS sau calendar utilizat în prezent nu va mai funcționa."
+msgstr "Orice URL-uri RSS sau calendar utilizate în prezent nu vor mai funcționa."
msgid "AccessTokens|Are you sure? Any issue email addresses currently in use will stop working."
-msgstr "Sunteți sigur? Orice adresă de e-mail folosită în prezent nu va mai funcționa."
+msgstr "Sunteți sigur? Toate adresele de e-mail utilizate în prezent nu vor mai funcționa."
msgid "AccessTokens|Copy feed token"
-msgstr ""
+msgstr "Copiați tokenul de fluxuri"
msgid "AccessTokens|Copy incoming email token"
-msgstr ""
+msgstr "Copiați tokenul de e-mail primit"
msgid "AccessTokens|Copy static object token"
-msgstr ""
+msgstr "Copiați tokenul obiectului static"
msgid "AccessTokens|Created"
-msgstr "Create"
+msgstr "Creat"
msgid "AccessTokens|Feed token"
-msgstr "Token flux"
+msgstr "Token de flux"
msgid "AccessTokens|Incoming email token"
-msgstr "Token e-mail primit"
+msgstr "Token de e-mail primit"
msgid "AccessTokens|It cannot be used to access any other data."
-msgstr "Nu poate fi utilizat pentru a accesa alte date."
+msgstr "Acesta nu poate fi utilizat pentru a accesa alte date."
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 ""
+msgstr "Păstrați acest token secret. Oricine îl deține poate accesa obiectele statice ale repozitoriului ca și cum ar fi în locul dumneavoastră. Dacă se întâmplă vreodată acest lucru, %{linkStart}resetați acest token%{linkEnd}."
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 ""
+msgstr "Păstrați acest token secret. Oricine îl are poate crea probleme ca și cum ar fi în locul dvs. Dacă se întâmplă acest lucru, %{linkStart}resetați acest token%{linkEnd}."
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 ""
+msgstr "Păstrați acest token secret. Oricine îl are poate citi fluxurile RSS de activități și de probleme sau fluxul de calendar ca și cum ar fi în locul dumneavoastră. Dacă se întâmplă acest lucru, %{linkStart}resetați acest token%{linkEnd}."
msgid "AccessTokens|Personal Access Tokens"
-msgstr "Token-uri de acces personal"
+msgstr "Tokenuri de acces personal"
msgid "AccessTokens|Static object token"
-msgstr "Token obiect static"
+msgstr "Token de obiect static"
msgid "AccessTokens|They are the only accepted password when you have Two-Factor Authentication (2FA) enabled."
msgstr "Acestea sunt singurele parole acceptate atunci când autentificarea cu doi factori (2FA) este activată."
@@ -2102,34 +2087,25 @@ msgid "Account: %{account}"
msgstr "Cont: %{account}"
msgid "AccountValidation|Fix your pipelines by validating your account"
-msgstr ""
+msgstr "Reparați-vă pipeline-urile prin validarea contului dumneavoastră"
msgid "AccountValidation|I'll bring my own runners"
-msgstr ""
-
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-msgstr ""
+msgstr "ÃŽmi voi aduce proprii executori"
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 "Pentru a utiliza minutele CI/CD gratuite pe runner partajate, va trebui să vă validați contul utilizând una dintre opțiunile noastre de verificare. Dacă preferați să nu o faceți, puteți rula pipeline-uri aducându-vă proprii executori și dezactivând executorii partajați pentru proiectul dvs."
msgid "AccountValidation|Learn more."
-msgstr ""
+msgstr "Aflați mai multe."
msgid "AccountValidation|Looks like you’ll need to validate your account to use free CI/CD minutes"
-msgstr ""
+msgstr "Se pare că va trebui să vă validați contul pentru a utiliza minutele gratuite de CI/CD"
msgid "AccountValidation|Validate your account"
-msgstr ""
+msgstr "Validați-vă contul"
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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
+msgstr "Verificarea este necesară pentru a descuraja și a reduce abuzurile asupra infrastructurii GitLab. Dacă verificați cu un card de credit sau de debit, %{strong_start}GitLab nu vă va debita cardul, acesta va fi folosit doar pentru validare.%{strong_end} %{learn_more_link}"
msgid "Acknowledge"
msgstr "Confirmare"
@@ -2144,10 +2120,10 @@ msgid "Actions"
msgstr "Acțiuni"
msgid "Activate Service Desk"
-msgstr "Activați Biroul de Servicii"
+msgstr "Activați Service Desk"
msgid "Activated on"
-msgstr ""
+msgstr "S-a activat pe"
msgid "Active"
msgstr "Activ"
@@ -2159,7 +2135,7 @@ msgid "Active Sessions"
msgstr "Sesiuni active"
msgid "Active chat names (%{count})"
-msgstr ""
+msgstr "Nume de chat active (%{count})"
msgid "Activity"
msgstr "Activitate"
@@ -2195,13 +2171,13 @@ msgid "Add License"
msgstr "Adăugați Licență"
msgid "Add New Site"
-msgstr ""
+msgstr "Adăugați un site nou"
msgid "Add README"
msgstr "Adăugați README"
msgid "Add Zoom meeting"
-msgstr "Adăugați o întâlnire Zoom"
+msgstr "Adăugați o reuniune Zoom."
msgid "Add a %{type}"
msgstr "Adăugați un %{type}"
@@ -2213,7 +2189,7 @@ msgid "Add a GPG key"
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 ""
+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}."
@@ -2251,9 +2227,6 @@ msgstr "Adăugați o linie"
msgid "Add a link"
msgstr "Adăugați un link"
-msgid "Add a link to Grafana"
-msgstr "Adăugați un link către Grafana"
-
msgid "Add a new issue"
msgstr "Adăugați o nouă problemă"
@@ -2267,7 +2240,7 @@ msgid "Add a related issue"
msgstr "Adăugați o problemă conexă"
msgid "Add a suffix to Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Adăugați un sufix la adresa de e-mail Service Desk. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "Add a table"
msgstr "Adăugați un tabel"
@@ -2276,7 +2249,7 @@ msgid "Add a task list"
msgstr "Adăugați o listă de sarcini"
msgid "Add a title..."
-msgstr ""
+msgstr "Adăugați un titlu..."
msgid "Add a to do"
msgstr ""
@@ -2285,7 +2258,7 @@ msgid "Add an SSH key"
msgstr "Adăugați o cheie SSH"
msgid "Add an SSH key for secure access to GitLab. %{help_link_start}Learn more.%{help_link_end}"
-msgstr ""
+msgstr "Adăugați o cheie SSH pentru acces securizat la GitLab. %{help_link_start}Aflați mai multe.%{help_link_end}"
msgid "Add an existing issue"
msgstr "Adăugați o problemă existentă"
@@ -2302,6 +2275,9 @@ msgstr "Adăugați o regulă de aprobare"
msgid "Add approvers"
msgstr "Adăugați aprobatori"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Adăugați text bold"
@@ -2327,10 +2303,10 @@ msgid "Add commit messages as comments to Pivotal Tracker stories. %{docs_link}"
msgstr "Adăugați mesaje de comitere ca și comentarii la povești Pivotal Tracker. %{docs_link}"
msgid "Add customer relation contact(s)."
-msgstr ""
+msgstr "Adăugați contacte de relații cu clienții."
msgid "Add customer relation contacts"
-msgstr ""
+msgstr "Adăugați contacte de relații cu clienții"
msgid "Add deploy freeze"
msgstr "Adăugați înghețarea implementării"
@@ -2429,7 +2405,7 @@ msgid "Add to tree"
msgstr "Adăugare la arbore"
msgid "Add topics to projects to help users find them."
-msgstr ""
+msgstr "Adăugați subiecte la proiecte pentru a ajuta utilizatorii să le găsească."
msgid "Add trigger"
msgstr "Adăugare declanșator"
@@ -2444,7 +2420,7 @@ msgid "Add variable"
msgstr "Adăugare variabilă"
msgid "Add vulnerability finding"
-msgstr ""
+msgstr "Adăugați descoperirea vulnerabilității"
msgid "Add webhook"
msgstr "Adăugare webhook"
@@ -2461,15 +2437,15 @@ msgstr "Adăugați commit-urile îmbinate anterior"
msgid "AddContextCommits|Add/remove"
msgstr "Adăugare/înlăturare"
-msgid "AddMember|Emails cannot be blank"
-msgstr "E-mail-urile nu pot fi goale"
-
msgid "AddMember|Invite email is invalid"
msgstr "E-mailul de invitație nu este valid"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Limita de invitații de %{daily_invites} pe zi a fost depășită"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "Nu a fost furnizată nicio sursă de invitație."
@@ -2501,7 +2477,7 @@ msgid "Added in this version"
msgstr "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 noi aplicații este dezactivată în instanța dvs. GitLab. Contactați administratorul dvs. GitLab pentru a obține permisiunea"
+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"
@@ -2537,7 +2513,7 @@ msgid "Adds %{labels} %{label_text}."
msgstr "Adaugă %{labels} %{label_text}."
msgid "Adds a Zoom meeting."
-msgstr ""
+msgstr "Adăugați o reuniune Zoom."
msgid "Adds a to do."
msgstr ""
@@ -2546,7 +2522,7 @@ msgid "Adds an issue to an epic."
msgstr "Adăugați o problemă la o epică."
msgid "Adds email participant(s)."
-msgstr ""
+msgstr "Adăugați 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"
@@ -2594,7 +2570,7 @@ msgid "Admin notes"
msgstr "Note Admin"
msgid "AdminArea|%{billable_users_link_start}Learn more%{billable_users_link_end} about what defines a billable user"
-msgstr "%{billable_users_link_start}Aflați mai multe%{billable_users_link_end} despre ce definește un utilizator facturabil"
+msgstr "%{billable_users_link_start}Aflați mai multe%{billable_users_link_end} despre ceea ce definește un utilizator facturabil"
msgid "AdminArea|Active users"
msgstr "Utilizatori activi"
@@ -2621,7 +2597,7 @@ msgid "AdminArea|Features"
msgstr "Funcții"
msgid "AdminArea|Get security updates from GitLab and stay up to date"
-msgstr ""
+msgstr "Obțineți actualizări de securitate de la GitLab și rămâneți la curent cu noutățile"
msgid "AdminArea|Groups"
msgstr "Grupuri"
@@ -2630,28 +2606,28 @@ msgid "AdminArea|Guest"
msgstr "Invitat"
msgid "AdminArea|Included Free in license"
-msgstr "Inclus gratuit în licență"
+msgstr "Inclus Gratuit în licență"
msgid "AdminArea|Instance OAuth applications"
-msgstr ""
+msgstr "Aplicațiile OAuth ale instanței"
msgid "AdminArea|Latest groups"
-msgstr "Ultimele grupuri"
+msgstr "Cele mai recente grupuri"
msgid "AdminArea|Latest projects"
-msgstr "Ultimele proiecte"
+msgstr "Cele mai recente proiecte"
msgid "AdminArea|Latest users"
-msgstr "Ultimii utilizatori"
+msgstr "Cei mai recenți utilizatori"
msgid "AdminArea|Maintainer"
msgstr "Întreținător"
msgid "AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}."
-msgstr ""
+msgstr "Gestionați-vă aplicațiile din instanța dvs. care pot folosi GitLab ca %{docs_link_start}furnizor OAuth%{docs_link_end}."
msgid "AdminArea|Minimal access"
-msgstr ""
+msgstr "Acces minim"
msgid "AdminArea|New group"
msgstr "Grup nou"
@@ -2663,7 +2639,7 @@ msgid "AdminArea|New user"
msgstr "Utilizator nou"
msgid "AdminArea|No applications found"
-msgstr ""
+msgstr "Nu au fost găsite aplicații"
msgid "AdminArea|Owner"
msgstr "Proprietar"
@@ -2675,10 +2651,10 @@ msgid "AdminArea|Reporter"
msgstr "Reporter"
msgid "AdminArea|Sign up for the GitLab Security Newsletter to get notified for security updates."
-msgstr ""
+msgstr "Înscrieți-vă la Buletinul informativ de securitate GitLab pentru a primi notificări privind actualizările de securitate."
msgid "AdminArea|Sign up for the GitLab newsletter"
-msgstr ""
+msgstr "Înscrieți-vă pentru buletinul informativ GitLab"
msgid "AdminArea|Stop all jobs"
msgstr "Opriți toate joburile"
@@ -2702,43 +2678,37 @@ msgid "AdminArea|Users statistics"
msgstr "Statisticile utilizatorilor"
msgid "AdminArea|Users with highest role"
-msgstr "Utilizatori cu cel mai mare rol"
+msgstr "Utilizatorii cu cel mai mare rol"
msgid "AdminArea|Users without a Group and Project"
-msgstr "Utilizatori fără grup și proiect"
+msgstr "Utilizatorii fără grup și proiect"
msgid "AdminArea|View latest groups"
-msgstr "Vizualizați cele mai recente grupuri"
+msgstr "Vedeți cele mai recente grupuri"
msgid "AdminArea|View latest projects"
-msgstr "Vizualizați cele mai recente proiecte"
+msgstr "Vedeți cele mai recente proiecte"
msgid "AdminArea|View latest users"
-msgstr "Vizualizați ultimii utilizatori"
+msgstr "Vedeți cei mai noi utilizatori"
msgid "AdminArea|You’re about to stop all jobs. This will halt all current jobs that are running."
-msgstr "Sunteți pe cale de a opri toate joburile. Acest lucru va opri toate joburile care rulează acum."
+msgstr "Sunteți pe cale să opriți toate joburile. Acest lucru va opri toate joburile curente care sunt în curs de execuție."
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Eroare la încărcarea statisticilor. Vă rugăm încercați din nou"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
-msgstr ""
+msgstr "Definiți setul dvs. implicit de etichete de proiect"
msgid "AdminLabels|Labels created here will be automatically added to new projects."
-msgstr ""
+msgstr "Etichetele create aici vor fi adăugate automat la noile proiecte."
msgid "AdminLabels|They can be used to categorize issues and merge requests."
-msgstr ""
+msgstr "Acestea pot fi utilizate pentru a clasifica problemele și merge request-urile."
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 "Sunteți pe punctul de a șterge definitiv proiectul %{projectName}, repozitoriul acestuia și toate resursele aferente, inclusiv problemele și merge request-urile. După ce confirmați și apăsați %{strong_start}Ștergere proiect%{strong_end}, acțiunea nu mai poate fi anulată sau proiectul recuperat."
msgid "AdminProjects|Delete"
msgstr "Ștergeți"
@@ -2756,32 +2726,62 @@ msgid "AdminSettings|All new projects can use the instance's shared runners by d
msgstr "Toate proiectele noi pot folosi executorii partajați ai acestei instanțe în mod implicit."
msgid "AdminSettings|Auto DevOps domain"
-msgstr "Domeniu Auto DevOps"
+msgstr "Domeniul Auto DevOps"
msgid "AdminSettings|CI/CD limits"
-msgstr ""
+msgstr "Limitele CI/CD"
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Configurați Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr "Dezactivați Elasticsearch până la finalizarea indexării."
+
msgid "AdminSettings|Disable feed token"
-msgstr "Dezactivare token de fluxuri"
+msgstr "Dezactivați tokenul de flux"
msgid "AdminSettings|Disable public access to Pages sites"
msgstr "Dezactivați accesul public la site-urile 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 "Afișează un banner pe merge request-urile din proiectele fără pipeline-uri pentru a iniția etapele de adăugare a unui fișier .gitlab-ci.yml."
+msgstr "Afișează un banner pentru merge request-urile din proiectele fără pipeline-uri pentru a iniția etapele de adăugare a unui fișier .gitlab-ci.yml."
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 "Verificarea de domeniu este o măsură de securitate esențială pentru site-urile publice GitLab. Utilizatorii trebuie să demonstreze că dețin controlul asupra unui domeniu înainte ca acesta să fie activat. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Verificarea domeniului este o măsură de securitate esențială pentru site-urile publice GitLab. Utilizatorii trebuie să demonstreze că dețin controlul asupra unui domeniu înainte ca acesta să fie activat. %{link_start}Aflați mai multe.%{link_end}"
+
+msgid "AdminSettings|Elasticsearch indexing"
+msgstr "Indexarea Elasticsearch"
+
+msgid "AdminSettings|Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
+msgstr "E-mail din GitLab - trimiteți e-mailuri utilizatorilor direct din Zona Admin. %{link_start}Aflați mai multe%{link_end}."
+
+msgid "AdminSettings|Enable Registration Features"
+msgstr "Activați funcțiile de înregistrare"
+
+msgid "AdminSettings|Enable Service Ping"
+msgstr "Activați serviciul Ping"
+
+msgid "AdminSettings|Enable kuromoji custom analyzer: Indexing"
+msgstr "Activați analizatorul personalizat kuromoji: Indexare"
+
+msgid "AdminSettings|Enable kuromoji custom analyzer: Search"
+msgstr "Activați analizatorul personalizat kuromoji: Căutare"
msgid "AdminSettings|Enable pipeline suggestion banner"
-msgstr "Activare banner de sugestie pentru pipeline"
+msgstr "Activați bannerul de sugestie pentru pipeline"
msgid "AdminSettings|Enable shared runners for new projects"
msgstr "Activați executorii partajați pentru proiecte noi"
+msgid "AdminSettings|Enable smartcn custom analyzer: Indexing"
+msgstr "Activați analizatorul personalizat smartcn: Indexare"
+
+msgid "AdminSettings|Enable smartcn custom analyzer: Search"
+msgstr "Activați analizatorul personalizat smartcn: Căutare"
+
+msgid "AdminSettings|Enabled"
+msgstr "Activat"
+
msgid "AdminSettings|Feed token"
msgstr "Token de fluxuri"
@@ -2791,52 +2791,85 @@ msgstr "Am citit și sunt de acord cu %{link_start}Termenii de utilizare%{link_e
msgid "AdminSettings|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."
+msgid "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr "Dacă nu există niciun index existent, GitLab creează unul."
+
+msgid "AdminSettings|Import sources"
+msgstr "Surse de import"
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Păstrați cele mai recente artefacte pentru toate joburile din cele mai recente pipeline-uri de succes"
msgid "AdminSettings|Let's Encrypt email"
msgstr "E-mailul Let's Encrypt"
+msgid "AdminSettings|Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
+msgstr "Limitați dimensiunea proiectului la nivel global, de grup și de proiect. %{link_start}Aflați mai multe%{link_end}."
+
+msgid "AdminSettings|Limit the number of namespaces and projects that can be indexed."
+msgstr "Limitați numărul de spații de nume și proiecte care pot fi indexate."
+
msgid "AdminSettings|Maximum duration of a session for Git operations when 2FA is enabled."
-msgstr "Durata maximă a unei sesiuni pentru operațiunile Git atunci când este activată funcția 2FA."
+msgstr "Durata maximă a unei sesiuni pentru operațiunile Git atunci când este activată 2FA."
msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
-msgstr ""
+msgstr "Numărul maxim de dependențe DAG pe care le poate avea un job"
msgid "AdminSettings|Maximum number of active pipelines per project"
-msgstr ""
+msgstr "Numărul maxim de pipeline-uri active pe proiect"
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
-msgstr ""
+msgstr "Numărul maxim de joburi într-un singur pipeline"
msgid "AdminSettings|Maximum number of pipeline schedules"
-msgstr ""
+msgstr "Numărul maxim de programe pipeline"
msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
-msgstr ""
+msgstr "Numărul maxim de abonamente la pipeline către și de la un proiect"
msgid "AdminSettings|Maximum number of runners registered per group"
-msgstr ""
+msgstr "Numărul maxim de executori înregistrați pe grup"
msgid "AdminSettings|Maximum number of runners registered per project"
-msgstr ""
+msgstr "Numărul maxim de executori înregistrați pe proiect"
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
-msgstr "Variabilele CI/CD noi din proiecte și grupuri sunt în mod implicit protejate."
+msgstr "Noile variabile CI/CD din proiecte și grupuri sunt implicit protejate"
msgid "AdminSettings|No required pipeline"
-msgstr "Nu este necesar niciun pipeline"
+msgstr "Nu este nevoie de niciun pipeline"
+
+msgid "AdminSettings|Only enable search after installing the plugin, enabling indexing, and recreating the index."
+msgstr "Activați căutarea numai după instalarea pluginului, activarea indexării și recrearea indexului."
+
+msgid "AdminSettings|Pause Elasticsearch indexing"
+msgstr "Întrerupeți indexarea Elasticsearch"
+
+msgid "AdminSettings|Preview payload"
+msgstr "Previzualizare payload"
+
+msgid "AdminSettings|Project export"
+msgstr "Export de proiecte"
msgid "AdminSettings|Protect CI/CD variables by default"
msgstr "Protejați în mod implicit variabilele CI/CD"
+msgid "AdminSettings|Registration Features include:"
+msgstr ""
+
msgid "AdminSettings|Require users to prove ownership of custom domains"
-msgstr "Solicită utilizatorilor să dovedească proprietatea asupra domeniilor personalizate"
+msgstr "Solicitați utilizatorilor să dovedească proprietatea asupra domeniilor personalizate"
msgid "AdminSettings|Required pipeline configuration"
-msgstr "Configurație pipeline necesară"
+msgstr "Configurația pipeline este obligatorie"
+
+msgid "AdminSettings|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
msgid "AdminSettings|Save %{name} limits"
+msgstr "Salvați limitele %{name}"
+
+msgid "AdminSettings|Search with Elasticsearch enabled"
msgstr ""
msgid "AdminSettings|Select a CI/CD template"
@@ -2846,7 +2879,10 @@ msgid "AdminSettings|Select a group to use as the source for instance-level proj
msgstr "Selectați un grup care să fie utilizat ca sursă pentru șabloanele de proiect la nivel de instanță."
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 "Selectați pentru a dezactiva accesul public pentru site-urile Pages, care necesită ca utilizatorii să se înregistreze pentru a avea acces la site-urile Pages din instanța dvs. %{link_start}Aflați mai multe.%{link_end}"
+msgstr "Selectați această opțiune pentru a dezactiva accesul public pentru site-urile Pages, care necesită ca utilizatorii să se înregistreze pentru a avea acces la site-urile Pages din instanța dvs. %{link_start}Aflați mai multe.%{link_end}"
+
+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 "Durata sesiunii pentru operațiunile Git atunci când este activată funcția 2FA (minute)"
@@ -2855,10 +2891,10 @@ msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration
msgstr "Setați un șablon CI/CD ca fiind configurația necesară de pipeline pentru toate proiectele din instanță. Configurația CI/CD a proiectului se îmbină în configurația necesară a pipeline-ului atunci când se execută pipeline-ul. %{link_start}Ce este o configurație de pipeline necesară?%{link_end}"
msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
+msgstr "Setați limita la 0 pentru a o dezactiva."
msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
-msgstr "Stabiliți numele și protecțiile inițiale pentru ramura implicită a noilor repozitorii create în instanță."
+msgstr "Setați numele și protecțiile inițiale pentru ramura implicită a noilor repozitorii create în instanță."
msgid "AdminSettings|Set the maximum size of GitLab Pages per project (0 for unlimited). %{link_start}Learn more.%{link_end}"
msgstr "Setați dimensiunea maximă a GitLab Pages per proiect (0 pentru nelimitat). %{link_start}Aflați mai multe.%{link_end}"
@@ -2878,7 +2914,25 @@ msgstr "Proiectele din acest grup pot fi selectate ca șabloane pentru proiectel
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 "Șablonul pentru configurația pipeline necesară poate fi unul dintre șabloanele furnizate de GitLab sau un șablon personalizat adăugat la un repozitoriu de șabloane de instanță. %{link_start}Cum se creează un repozitoriu de șabloane de instanță?%{link_end}"
+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 "Numărul total de joburi în pipeline-urile active în prezent"
+
+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|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 "AdminStatistics|Active Users"
@@ -2921,16 +2975,16 @@ msgid "AdminUsers|(Internal)"
msgstr "(Intern)"
msgid "AdminUsers|(Locked)"
-msgstr ""
+msgstr "(Blocat)"
msgid "AdminUsers|(Pending approval)"
msgstr "(Aprobare în așteptare)"
msgid "AdminUsers|2FA Disabled"
-msgstr "2FA dezactivată"
+msgstr "2FA Dezactivat"
msgid "AdminUsers|2FA Enabled"
-msgstr "2FA activată"
+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."
@@ -2957,10 +3011,10 @@ msgid "AdminUsers|Adjust the user cap setting on your instance"
msgstr "Ajustați setarea plafonului de utilizatori pe instanța dvs."
msgid "AdminUsers|Admin"
-msgstr "Administrator"
+msgstr "Admin"
msgid "AdminUsers|Administrator"
-msgstr ""
+msgstr "Administrator"
msgid "AdminUsers|Admins"
msgstr "Administratori"
@@ -2975,16 +3029,16 @@ msgid "AdminUsers|Approved users can:"
msgstr "Utilizatorii aprobați pot:"
msgid "AdminUsers|Auditor"
-msgstr ""
+msgstr "Auditor"
msgid "AdminUsers|Auditors have read-only access to all groups, projects, and users."
-msgstr ""
+msgstr "Auditorii au acces numai în citire la toate grupurile, proiectele și utilizatorii."
msgid "AdminUsers|Automatically marked as default internal user"
msgstr "Marcat automat ca utilizator intern implicit"
msgid "AdminUsers|Ban user"
-msgstr "Interzicere utilizator"
+msgstr "Interziceți utilizatorul"
msgid "AdminUsers|Ban user %{username}?"
msgstr "Interziceți utilizatorul %{username}?"
@@ -3008,13 +3062,13 @@ msgid "AdminUsers|Blocked"
msgstr "Blocat"
msgid "AdminUsers|Blocking user has the following effects:"
-msgstr "Blocarea unui utilizator are următoarele efecte:"
+msgstr "Blocarea utilizatorului are următoarele efecte:"
msgid "AdminUsers|Cannot sign in or access instance information"
-msgstr "Nu puteți să vă conectați sau să accesați informațiile despre instanță"
+msgstr "Nu poate să se conecteze sau să acceseze informațiile despre instanță"
msgid "AdminUsers|Cannot unblock LDAP blocked users"
-msgstr "Nu se pot debloca utilizatorii blocați prin LDAP"
+msgstr "Nu poate debloca utilizatorii blocați LDAP"
msgid "AdminUsers|Cohorts"
msgstr "Cohorte"
@@ -3032,7 +3086,7 @@ msgid "AdminUsers|Deactivate"
msgstr "Dezactivați"
msgid "AdminUsers|Deactivate user %{username}?"
-msgstr "Deactivați utilizatorul %{username}?"
+msgstr "Dezactivați utilizatorul %{username}?"
msgid "AdminUsers|Deactivated"
msgstr "Dezactivat"
@@ -3041,7 +3095,7 @@ msgid "AdminUsers|Deactivating a user has the following effects:"
msgstr "Dezactivarea unui utilizator are următoarele efecte:"
msgid "AdminUsers|Delete User %{username} and contributions?"
-msgstr "Ștergeți utilizatorul %{username} și contribuțiile?"
+msgstr "Ștergeți utilizatorul %{username} și contribuțiile sale?"
msgid "AdminUsers|Delete User %{username}?"
msgstr "Ștergeți utilizatorul %{username}?"
@@ -3050,10 +3104,10 @@ msgid "AdminUsers|Delete user"
msgstr "Ștergeți utilizatorul"
msgid "AdminUsers|Delete user and contributions"
-msgstr "Ștergeți utilizatorul și contribuțiile"
+msgstr "Ștergeți utilizatorul și contribuțiile sale"
msgid "AdminUsers|Export permissions as CSV (max 100,000 users)"
-msgstr ""
+msgstr "Exportați permisiunile în format CSV (max. 100.000 de utilizatori)"
msgid "AdminUsers|External"
msgstr "Extern"
@@ -3062,31 +3116,31 @@ msgid "AdminUsers|External users cannot see internal or private projects unless
msgstr "Utilizatorii externi nu pot vedea proiectele interne sau private decât dacă accesul este acordat în mod explicit. De asemenea, utilizatorii externi nu pot crea proiecte, grupuri sau fragmente de cod personale."
msgid "AdminUsers|For more information, please refer to the %{link_start}user account deletion documentation.%{link_end}"
-msgstr "Pentru mai multe informații, vă rugăm să consultați %{link_start}documentația de ștergere a contului de utilizator.%{link_end}"
+msgstr "Pentru mai multe informații, vă rugăm să consultați %{link_start}documentația privind ștergerea contului de utilizator.%{link_end}"
msgid "AdminUsers|Here are some helpful links to help you manage your instance:"
msgstr "Iată câteva linkuri utile pentru a vă ajuta să vă administrați instanța:"
msgid "AdminUsers|If you have any questions about this process please consult our %{doc_link} or %{support_link}."
-msgstr "Dacă aveți întrebări cu privire la acest proces, vă rugăm să consultați %{doc_link} sau %{support_link}."
+msgstr "Dacă aveți întrebări cu privire la acest proces, vă rugăm să consultați %{doc_link} nostru sau %{support_link}."
msgid "AdminUsers|Important information about usage on your GitLab instance"
msgstr "Informații importante despre utilizarea instanței dvs. GitLab"
msgid "AdminUsers|Is using seat"
-msgstr "Utilizează locul"
+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 altor utilizatori."
+msgstr "Problemele create de acest utilizator sunt ascunse pentru ceilalți utilizatori."
msgid "AdminUsers|It's you!"
-msgstr "Dvs. sunteți!"
+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|Locked"
-msgstr ""
+msgstr "Blocat"
msgid "AdminUsers|Log in"
msgstr "Autentificare"
@@ -3119,10 +3173,10 @@ msgid "AdminUsers|Regular"
msgstr "Regular"
msgid "AdminUsers|Regular users have access to their groups and projects."
-msgstr ""
+msgstr "Utilizatorii obișnuiți au acces la grupurile și proiectele lor."
msgid "AdminUsers|Reject"
-msgstr "Respingere"
+msgstr "Respingeți"
msgid "AdminUsers|Reject user %{username}?"
msgstr "Respingeți utilizatorul %{username}?"
@@ -3134,7 +3188,7 @@ 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."
msgid "AdminUsers|Search by name, email or username"
-msgstr "Căutare după nume, e-mail sau nume de utilizator"
+msgstr "Căutați după nume, e-mail sau nume de utilizator"
msgid "AdminUsers|Search users"
msgstr "Căutați utilizatori"
@@ -3143,22 +3197,22 @@ msgid "AdminUsers|Send email to users"
msgstr "Trimiteți e-mail utilizatorilor"
msgid "AdminUsers|Sort by"
-msgstr "Sortează după"
+msgstr "Sortare după"
msgid "AdminUsers|The user can't access git repositories."
-msgstr "Acest utilizator nu poate accesa repozitorii git."
+msgstr "Utilizatorul nu poate accesa repozitoriile git."
msgid "AdminUsers|The user can't log in."
-msgstr "Acest utilizator nu se poate autentifica."
+msgstr "Utilizatorul nu se poate autentifica."
msgid "AdminUsers|The user has unlimited access to all groups, projects, users, and features."
-msgstr ""
+msgstr "Utilizatorul are acces nelimitat la toate grupurile, proiectele, utilizatorii și funcțiile."
msgid "AdminUsers|The user will be logged out"
msgstr "Utilizatorul va fi deconectat"
msgid "AdminUsers|The user will not be able to access git repositories"
-msgstr "Utilizatorul nu va putea accesa repozitorii git"
+msgstr "Utilizatorul nu va putea accesa repozitoriile git"
msgid "AdminUsers|The user will not be able to access the API"
msgstr "Utilizatorul nu va putea accesa API-ul"
@@ -3176,10 +3230,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "Pentru a confirma, tastați %{username}"
msgid "AdminUsers|Unban user"
-msgstr "Deblocați utilizatorul"
+msgstr "Anulați interdicția utilizatorului"
msgid "AdminUsers|Unban user %{username}?"
-msgstr "Deblocați utilizatorul %{username}?"
+msgstr "Anulați interdicția utilizatorului %{username}?"
msgid "AdminUsers|Unblock"
msgstr "Deblocare"
@@ -3191,22 +3245,22 @@ msgid "AdminUsers|Unlock user %{username}?"
msgstr "Deblocați utilizatorul %{username}?"
msgid "AdminUsers|User administration"
-msgstr "Administrație utilizator"
+msgstr "Managementul utilizatorilor"
msgid "AdminUsers|User is validated and can use free CI minutes on shared runners."
-msgstr "Utilizatorul este validat și poate utiliza minutele gratuite CI pe executori partajați."
+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"
msgid "AdminUsers|User will not be able to login"
-msgstr "Utilizatorul nu se va putea autentifica"
+msgstr "Utilizatorul nu va putea să se conecteze"
msgid "AdminUsers|Users"
msgstr "Utilizatori"
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 "Utilizatorii pot fi invitați în continuare la instanța dvs. și/sau se pot adăuga singuri, dacă acest lucru este permis în funcție de setările dvs. Aceștia nu vor avea acces la instanța dvs. și nici nu vor fi luați în calcul pentru numărul de locuri abonate până când nu %{approve_link}."
+msgstr "Utilizatorii pot fi în continuare invitați în instanță și/sau se pot adăuga singuri, dacă acest lucru este permis în funcție de setările dumneavoastră. Aceștia nu vor avea acces la instanța dvs. și nici nu vor fi luați în calcul pentru numărul de seat-uri abonate până când nu %{approve_link}."
msgid "AdminUsers|Validate user account"
msgstr "Validați contul de utilizator"
@@ -3221,10 +3275,10 @@ msgid "AdminUsers|What does this mean?"
msgstr "Ce înseamnă acest lucru?"
msgid "AdminUsers|When banned:"
-msgstr "În timpul blocării:"
+msgstr "Când este interzis:"
msgid "AdminUsers|When the user logs back in, their account will reactivate as a fully active account"
-msgstr "Când utilizatorul se autentifică din nou, contul său va fi reactivat ca un cont complet activ"
+msgstr "Când utilizatorul se conectează din nou, contul său va fi reactivat ca un cont complet activ."
msgid "AdminUsers|Will be deleted"
msgstr "Va fi șters"
@@ -3233,10 +3287,10 @@ msgid "AdminUsers|Without projects"
msgstr "Fără proiecte"
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 "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Problemele, merge request-urile și grupurile legate de acestea vor fi transferate către un „Utilizator-fantomă†la nivel de sistem. Pentru a evita pierderea de date, luați în considerare utilizarea în schimb a funcției %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați folosit funcția %{strongStart}Ștergere utilizator%{strongEnd}, aceasta nu mai poate anulată sau contul recuperat."
+msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Problemele, merge request-urile și grupurile legate de acestea vor fi transferate către un „Utilizator-fantomă†la nivel de sistem. Pentru a evita pierderea de date, luați în considerare utilizarea în schimb a funcției %{strongStart}blocare utilizator%{strongEnd}. Odată ce %{strongStart}Ștergeți utilizatorul%{strongEnd}, această operațiune nu mai poate fi anulată, nici contul recuperat."
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 "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Aceasta va șterge toate problemele, merge request-urile și grupurile legate de acesta. Pentru a evita pierderea de date, luați în considerare posibilitatea de a utiliza în schimb funcția %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați folosit funcția %{strongStart}Ștergere utilizator%{strongEnd}, aceasta nu mai poate fi anulată sau contul recuperat."
+msgstr "Sunteți pe cale să ștergeți definitiv utilizatorul %{username}. Aceasta va șterge toate problemele, merge request-urile și grupurile legate de acesta. Pentru a evita pierderea de date, luați în considerare posibilitatea de a utiliza în schimb funcția %{strongStart}blocare utilizator%{strongEnd}. Odată ce ați folosit %{strongStart}Ștergeți utilizator%{strongEnd}, aceasta operațiune nu mai poate fi anulată sau contul recuperat."
msgid "AdminUsers|You can always block their account again if needed."
msgstr "Puteți oricând să le blocați din nou contul, dacă este necesar."
@@ -3257,7 +3311,7 @@ msgid "AdminUsers|You can unban their account in the future. Their data remains
msgstr "Puteți să le deblocați contul în viitor. Datele lor rămân intacte."
msgid "AdminUsers|You cannot remove your own administrator access."
-msgstr ""
+msgstr "Nu vă puteți elimina propriul acces de administrator."
msgid "AdminUsers|You must transfer ownership or delete the groups owned by this user before you can delete their account"
msgstr "Trebuie să transferați proprietatea sau să ștergeți grupurile deținute de acest utilizator înainte de a le șterge contul."
@@ -3275,7 +3329,7 @@ msgid "AdminUsers|docs"
msgstr "documente"
msgid "AdminUsers|user cap"
-msgstr "limită utilizator"
+msgstr "limita de utilizare"
msgid "Administration"
msgstr "Administrație"
@@ -3299,7 +3353,7 @@ msgid "Admin|The number of max seats in your namespace exceeds the number of sea
msgstr "Numărul maxim de seat-uri din spațiul de nume al dvs. depășește numărul de seat-uri din abonament. La %{qrtlyDate}, are loc o reconciliere trimestrială și vi se va factura automat o sumă proporțională pentru depășirea numărului de seat-uri. Nu este necesară nicio acțiune din partea dvs. Dacă aveți un card de credit la dosar, acesta va fi debitat. În caz contrar, veți primi o factură. Pentru mai multe informații despre calendarul procesului de facturare, consultați documentația."
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 ""
+msgstr "Numărul maxim de utilizatori din instanța dvs. depășește numărul de utilizatori din licență. La %{qrtlyDate}, are loc o reconciliere trimestrială și vi se va factura automat o sumă proporțională pentru depășire. Nu este necesară nicio acțiune din partea dumneavoastră. Dacă aveți un card de credit la dosar, acesta va fi debitat. În caz contrar, veți primi o factură. Pentru mai multe informații despre calendarul procesului de facturare, consultați documentația."
msgid "Admin|View pending user approvals"
msgstr "Vizualizați aprobările în așteptare ale utilizatorilor"
@@ -3320,7 +3374,7 @@ msgid "Advanced export options"
msgstr "Opțiuni avansate de export"
msgid "AdvancedSearch|Reindex required"
-msgstr ""
+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."
@@ -3329,19 +3383,19 @@ msgid "After a successful password update, you will be redirected to the login p
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ă."
msgid "After it expires, you can't use merge approvals, code quality, or many other features."
-msgstr ""
+msgstr "După expirare, nu mai puteți utiliza aprobările de îmbinare, calitatea codului sau multe alte caracteristici."
msgid "After it expires, you can't use merge approvals, epics, or many other features."
-msgstr ""
+msgstr "După expirare, nu mai puteți utiliza aprobările de îmbinare, epicele sau multe alte caracteristici."
msgid "After it expires, you can't use merge approvals, epics, or many security features."
-msgstr ""
+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 ""
+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."
msgid "After you've reviewed these contribution guidelines, you'll be all set to"
-msgstr "După ce ați examinat aceste reguli privind contribuțiile, veți fi gata să"
+msgstr "După revizuirea acestor orientări privind contribuțiile, veți fi gata să"
msgid "Akismet"
msgstr "Akismet"
@@ -3350,7 +3404,7 @@ msgid "Akismet API Key"
msgstr "Cheia API Akismet"
msgid "Akismet helps prevent the creation of spam issues in public projects."
-msgstr ""
+msgstr "Akismet ajută la prevenirea creării de probleme spam în proiectele publice."
msgid "Alert"
msgstr ""
@@ -3710,7 +3764,7 @@ msgid "All (default)"
msgstr "Toate (implicit)"
msgid "All GitLab"
-msgstr ""
+msgstr "Peste tot în GitLab"
msgid "All Members"
msgstr "Toți membrii"
@@ -3731,7 +3785,7 @@ msgid "All groups and projects"
msgstr "Toate grupurile și proiectele"
msgid "All issues"
-msgstr ""
+msgstr "Toate problemele"
msgid "All issues for this milestone are closed."
msgstr "Toate problemele pentru acest obiectiv sunt închise."
@@ -3746,7 +3800,7 @@ msgid "All merge request dependencies have been merged"
msgstr "Toate dependențele din merge request au fost îmbinate."
msgid "All paths are relative to the GitLab URL. Do not include %{relative_url_link_start}relative URLs%{relative_url_link_end}."
-msgstr ""
+msgstr "Toate căile sunt relative la URL-ul GitLab. Nu includeți %{relative_url_link_start} URL-uri relative%{relative_url_link_end}."
msgid "All projects"
msgstr "Toate proiectele"
@@ -3754,6 +3808,9 @@ msgstr "Toate proiectele"
msgid "All projects selected"
msgstr "Toate proiectele selectate"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Toate subiectele sunt rezolvate"
@@ -3764,25 +3821,31 @@ msgid "All users must have a name."
msgstr "Toți utilizatorii trebuie să aibă un nume."
msgid "All users with matching cards"
-msgstr ""
+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 ""
+
+msgid "Allow access to everyone"
+msgstr ""
+
msgid "Allow access to members of the following group"
msgstr "Permiteți accesul membrilor din grupul următor"
msgid "Allow access to the following IP addresses"
msgstr "Permiteți accesul la următoarele adrese IP"
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Permiteți commit-uri de la membri care pot îmbina la ramura țintă."
+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 "Permiteți proprietarilor de grup să gestioneze setările legate de LDAP"
msgid "Allow non-administrators access to the performance bar"
-msgstr ""
+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."
@@ -3817,11 +3880,8 @@ msgstr "Permiteți subgrupurilor să își configureze propriile reguli de auten
msgid "Allow this key to push to this repository"
msgstr "Permiteți acestei chei să facă push către acest repozitoriu"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
-msgstr ""
+msgstr "Permiteți utilizarea funcțiilor EE licențiate"
msgid "Allow users to dismiss the broadcast message"
msgstr "Permiteți utilizatorilor să respingă mesajul difuzat"
@@ -3835,9 +3895,6 @@ msgstr "Permiteți utilizatorilor să solicite accesul (dacă vizibilitatea este
msgid "Allowed"
msgstr "Permis"
-msgid "Allowed Geo IP"
-msgstr "Geo IP permis"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Caracterele permise: +, 0-9, - și spații."
@@ -3896,7 +3953,7 @@ msgid "Amazon Web Services Logo"
msgstr "Logo Amazon Web Services"
msgid "Amazon authentication is not %{link_start}correctly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
-msgstr "Autentificarea Amazon nu este %{link_start}configurată corect%{link_end}. Întrebați administratorul GitLab dacă doriți să utilizați acest serviciu."
+msgstr "Autentificarea Amazon nu este %{link_start}configurată corect%{link_end}. Întrebați administratorul dvs. GitLab dacă doriți să utilizați acest serviciu."
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 "O alertă %{link_start}alert%{link_end} cu aceeași amprentă digitală este deja deschisă. Pentru a schimba statutul acestei alerte, rezolvați alerta legată."
@@ -3923,7 +3980,7 @@ msgid "An email notification was recently sent from the admin panel. Please wait
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."
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 "Un câmp gol al utilizatorului GitLab va adăuga numele complet al utilizatorului FogBugz (de ex. \"de John Smith\") în descrierea tuturor problemelor și comentariilor. De asemenea, va asocia și / sau va atribui aceste probleme și comentarii cu creatorul de proiect."
+msgstr "Un câmp gol de utilizator GitLab va adăuga numele complet al utilizatorului FogBugz (de ex. „de John Smithâ€) în descrierea tuturor problemelor È™i comentariilor. De asemenea, va asocia È™i/sau atribui aceste probleme È™i comentarii cu creatorul proiectului."
msgid "An error has occurred"
msgstr "A apărut o eroare"
@@ -3932,10 +3989,10 @@ msgid "An error in reporting in which a test result incorrectly indicates the pr
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ă."
msgid "An error occurred adding a draft to the thread."
-msgstr "S-a produs o eroare la adăugarea unei schițe la subiect."
+msgstr "S-a produs o eroare la adăugarea unui draft la subiect."
msgid "An error occurred adding a new draft."
-msgstr "A apărut o eroare la adăugarea unei noi schițe."
+msgstr "A apărut o eroare la adăugarea unui nou draft."
msgid "An error occurred creating the new branch."
msgstr "A apărut o eroare creând ramura nouă."
@@ -3953,19 +4010,19 @@ msgid "An error occurred fetching the project authors."
msgstr "A apărut o eroare preluând autorii proiectului."
msgid "An error occurred fetching the public deploy keys. Please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării cheilor publice de implementare. Vă rugăm să încercați din nou."
msgid "An error occurred previewing the blob"
msgstr "A apărut o eroare de previzualizare a blobului"
msgid "An error occurred when loading the user verification challenge. Refresh to try again."
-msgstr ""
+msgstr "A survenit o eroare la încărcarea provocării de verificare a utilizatorului. Actualizați pentru a încerca din nou."
msgid "An error occurred when updating the title"
msgstr "A apărut o eroare la actualizarea titlului"
msgid "An error occurred while acknowledging the notification. Refresh the page and try again."
-msgstr "A apărut o eroare la confirmarea notificării. Reîmprospătați pagina și încercați din nou."
+msgstr "A survenit o eroare la confirmarea notificării. Reîmprospătați pagina și încercați din nou."
msgid "An error occurred while adding approvers"
msgstr "A apărut o eroare în timpul adăugării aprobatorilor"
@@ -3977,7 +4034,7 @@ msgid "An error occurred while authorizing your role"
msgstr "A apărut o eroare în timpul autorizării rolului dvs."
msgid "An error occurred while checking group path. Please refresh and try again."
-msgstr "A apărut o eroare în timpul verificării căii grupului. Vă rugăm reîmprospătați și să încercați din nou."
+msgstr "A survenit o eroare în timpul verificării căii grupului. Vă rugăm să reîmprospătați și să încercați din nou."
msgid "An error occurred while decoding the file."
msgstr "A apărut o eroare în timpul decodării fișierului."
@@ -3995,40 +4052,40 @@ msgid "An error occurred while detecting host keys"
msgstr "A apărut o eroare la detectarea cheilor gazdă"
msgid "An error occurred while disabling Service Desk."
-msgstr "A apărut o eroare la dezactivarea Biroului de Servicii."
+msgstr "A apărut o eroare la dezactivarea Service Desk."
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
-msgstr "A apărut o eroare la respingerea alertei. Reîmprospătați pagina și încercați din nou."
+msgstr "A survenit o eroare în timpul respingerii alertei. Actualizați pagina și încercați din nou."
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
-msgstr "A apărut o eroare la respingerea evidențierii funcțiilor. Reîmprospătați pagina și încercați din nou."
+msgstr "A survenit o eroare în timpul respingerii evidențierii caracteristicii. Reîmprospătați pagina și încercați să respingeți din nou."
msgid "An error occurred while drawing job relationship links."
msgstr "S-a produs o eroare în timpul trasării linkurilor de relaționare a joburilor."
msgid "An error occurred while enabling Service Desk."
-msgstr "A apărut o eroare la activarea Biroului de Servicii."
+msgstr "A survenit o eroare la activarea Service Desk."
msgid "An error occurred while fetching Markdown preview"
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării previzualizării Markdown"
msgid "An error occurred while fetching ancestors"
msgstr "A apărut o eroare în timpul obținerii predecesorilor"
msgid "An error occurred while fetching branches. Retry the search."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării ramurilor. Reîncercați căutarea."
msgid "An error occurred while fetching codequality mr diff reports."
msgstr "S-a produs o eroare în timpul preluării rapoartelor codequality care au creat diff în mr."
msgid "An error occurred while fetching commit data."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării datelor commit-urilor."
msgid "An error occurred while fetching commits. Retry the search."
-msgstr ""
+msgstr "A apărut o eroare în timpul preluării commit-urilor. Reîncercați căutarea."
msgid "An error occurred while fetching coverage reports."
-msgstr "S-a produs o eroare în timpul obținerii rapoartelor de acoperire."
+msgstr "S-a produs o eroare în timpul obținerii rapoartelor coverage"
msgid "An error occurred while fetching environments."
msgstr "S-a produs o eroare în timpul preluării mediilor."
@@ -4109,10 +4166,10 @@ msgid "An error occurred while loading all the files."
msgstr "A apărut o eroare în timpul încărcării tuturor fișierelor."
msgid "An error occurred while loading chart data"
-msgstr "A apărut o eroare la încărcarea datelor din diagramă"
+msgstr "A apărut o eroare la încărcarea datelor graficului"
msgid "An error occurred while loading code owners."
-msgstr ""
+msgstr "A apărut o eroare în timpul încărcării proprietarilor de coduri."
msgid "An error occurred while loading commit signatures"
msgstr "A apărut o eroare la încărcarea semnăturilor commit-ului"
@@ -4136,7 +4193,7 @@ msgid "An error occurred while loading merge requests."
msgstr "S-a produs o eroare în timpul încărcării merge request-urilor."
msgid "An error occurred while loading projects."
-msgstr ""
+msgstr "A apărut o eroare în timpul încărcării proiectelor."
msgid "An error occurred while loading the Jobs tab."
msgstr ""
@@ -4151,7 +4208,7 @@ msgid "An error occurred while loading the access tokens form, please try again.
msgstr "A apărut o eroare în timpul încărcării formularului cu token-uri de acces, vă rugăm să încercați din nou."
msgid "An error occurred while loading the blob controls."
-msgstr ""
+msgstr "A apărut o eroare în timpul încărcării controalelor pentru blob."
msgid "An error occurred while loading the data. Please try again."
msgstr "S-a produs o eroare în timpul încărcării datelor. Vă rugăm să încercați din nou."
@@ -4207,6 +4264,9 @@ msgstr "A apărut o eroare în timpul analizării fișierului."
msgid "An error occurred while pasting text in the editor. Please try again."
msgstr "A apărut o eroare în timpul lipirii textului în editor. Vă rugăm să încercați din nou."
+msgid "An error occurred while performing this action."
+msgstr ""
+
msgid "An error occurred while removing epics."
msgstr "A apărut o eroare la eliminarea epicelor."
@@ -4239,9 +4299,9 @@ msgstr "A apărut o eroare în timpul salvării modificărilor: %{error}"
msgid "An error occurred while saving the setting"
msgid_plural "An error occurred while saving the settings"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+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 subscribing to notifications."
msgstr "A apărut o eroare la abonarea la notificări."
@@ -4282,9 +4342,6 @@ msgstr "A apărut o eroare la actualizarea setărilor de notificare. Vă rugăm
msgid "An error occurred while uploading the file. Please try again."
msgstr "S-a întâmplat o eroare în timpul încărcării fișierului. Vă rugăm încercați din nou."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "S-a întâmplat o eroare în timpul încărcării imaginii. Vă rugăm încercați din nou."
-
msgid "An error occurred while validating group path"
msgstr "A apărut o eroare în timpul validării căii de acces la grup"
@@ -4307,13 +4364,13 @@ 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"
msgid "An incident has been resolved in %{project_path}."
-msgstr ""
+msgstr "Un incident a fost rezolvat în %{project_path}."
msgid "An incident has been triggered in %{project_path}."
-msgstr ""
+msgstr "A fost declanșat un incident în %{project_path}."
msgid "An integer value is required for seconds"
-msgstr ""
+msgstr "Valoarea pentru secunde trebuie să fie un număr întreg"
msgid "An issue already exists"
msgstr "Există deja o problemă"
@@ -4351,9 +4408,6 @@ msgstr "A apărut o eroare necunoscută."
msgid "Analytics"
msgstr "Statistici"
-msgid "Analyze a review version of your web application."
-msgstr "Analizează o versiune de revizuire a aplicației dvs. web."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Analizează dependențele dvs. pentru vulnerabilități cunoscute."
@@ -4384,6 +4438,9 @@ msgstr "O altă acțiune este în curs de desfășurare"
msgid "Another issue tracker is already in use. Only one issue tracker service can be active at a time"
msgstr "Un alt sistem de urmărire a problemelor este deja în uz. Un singur serviciu de urmărire a problemelor poate fi activ în același timp"
+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 "Verificare anti-spam"
@@ -4462,12 +4519,27 @@ msgstr "Aplicația a fost actualizată cu succes."
msgid "Application: %{name}"
msgstr "Aplicație: %{name}"
-msgid "ApplicationSettings|After sign up text"
-msgstr "Text după înscriere"
+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 "Domenii permise pentru înscrieri"
+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] "Aprobați %d utilizator"
@@ -4507,38 +4579,35 @@ msgstr "Restricții de e-mail"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "Restricții de e-mail pentru înscrieri"
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
-msgstr "Activați lista de domenii refuzate pentru înscrieri"
+msgid "ApplicationSettings|Enable Slack application"
+msgstr ""
+
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
+msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
-msgstr "Activați restricțiile de e-mail pentru înscrieri"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
+msgstr ""
msgid "ApplicationSettings|Enter denylist manually"
msgstr "Completați manual lista de refuzări"
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown activat"
-
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "Lungimea minimă a parolei (număr de caractere)"
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "NUMAI utilizatorii cu adrese de e-mail care corespund acestor domenii se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
-msgstr "După ce instanța atinge limita de utilizatori, orice utilizator care este adăugat sau solicită acces va trebui să fie aprobat de un administrator. Lăsați câmpul gol pentru nelimitat."
+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 "Necesită aprobarea administratorului pentru noile înscrieri"
-msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
-msgstr "Limitează înscrierile pentru adresele de e-mail care se potrivesc cu regex-ul dat. Pentru mai multe informații, consultați %{linkStart}sintaxa acceptată %{linkEnd}."
+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 "Salvare modificări"
-msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}"
-msgstr "Consultați%{linkStart}Ghidul politicii privind parolele%{linkEnd} GitLab"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
+msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr "Trimiteți un e-mail de confirmare la înscriere"
@@ -4546,23 +4615,23 @@ msgstr "Trimiteți un e-mail de confirmare la înscriere"
msgid "ApplicationSettings|Sign-up enabled"
msgstr "Înregistrare activată"
+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 "Încărcați fișierul cu lista de refuzări"
msgid "ApplicationSettings|User cap"
msgstr "Limită utilizatori"
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate pentru intrări multiple. Ex: domain.com, *.domain.com"
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
-msgstr "Utilizatorii cu adrese de e-mail care se potrivesc cu aceste domenii NU se vor putea înscrie. Sunt permise caractere wildcard. Folosiți linii separate sau virgule pentru intrări multiple."
-
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
-msgstr "Atunci când este activat, orice utilizator care vizitează %{host} și creează un cont va trebui să fie aprobat în mod explicit de către un administrator înainte de a se putea conecta. Această setare este eficientă numai înscrierile sunt activate."
+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|When enabled, any user visiting %{host} will be able to create an account."
-msgstr "Când este activat, orice utilizator care vizitează %{host} va putea crea un cont."
+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 "domain.com"
@@ -4595,7 +4664,7 @@ msgid "Apply template"
msgstr "Aplicați șablonul"
msgid "Apply this approval rule to all branches or a specific protected branch."
-msgstr ""
+msgstr "Aplicați această regulă de aprobare la toate ramurile sau la o anumită ramură protejată."
msgid "Applying"
msgstr "Aplicare"
@@ -4618,9 +4687,6 @@ msgstr "Aplicarea sugestiei..."
msgid "Applying suggestions..."
msgstr "Aplicarea sugestiilor..."
-msgid "Approval Status"
-msgstr "Statusul de aprobare"
-
msgid "Approval rules"
msgstr "Reguli de aprobare"
@@ -4655,10 +4721,10 @@ msgstr[1] "%{count} aprobări necesare de la %{membersCount}"
msgstr[2] "%{count} de aprobări necesare de la %{membersCount}"
msgid "ApprovalRule|%{firstLabel} +%{numberOfAdditionalLabels} more"
-msgstr "%{firstLabel} + încă %{numberOfAdditionalLabels}"
+msgstr "%{firstLabel} + %{numberOfAdditionalLabels} în plus"
msgid "ApprovalRule|A merge request author collaborating with a merge request approver"
-msgstr ""
+msgstr "Un autor de merge request care colaborează cu un aprobator de merge request"
msgid "ApprovalRule|Add approvers"
msgstr "Adăugați aprobatori"
@@ -4670,22 +4736,22 @@ msgid "ApprovalRule|All severity levels"
msgstr "Toate nivelele de severitate"
msgid "ApprovalRule|All vulnerability states"
-msgstr ""
+msgstr "Toate stările de vulnerabilitate"
msgid "ApprovalRule|Apply this approval rule to consider only the selected security scanners."
-msgstr "Aplicați această regulă de aprobare pentru a lua în considerare doar scanerele de securitate selectate."
+msgstr "Aplicați această regulă de aprobare pentru a lua în considerare numai scanerele de securitate selectate."
msgid "ApprovalRule|Apply this approval rule to consider only the selected severity levels."
-msgstr "Aplicați această regulă de aprobare pentru a considera doar nivelele de severitate selectate."
+msgstr "Aplicați această regulă de aprobare pentru a considera numai nivelele de severitate selectate."
msgid "ApprovalRule|Apply this approval rule to consider only the selected vulnerability states."
-msgstr ""
+msgstr "Aplicați această regulă de aprobare pentru a lua în considerare numai stările de vulnerabilitate selectate."
msgid "ApprovalRule|Approval rules"
msgstr "Reguli de aprobare"
msgid "ApprovalRule|Approvals required"
-msgstr "Aprobări necesare"
+msgstr "Numărul de aprobări necesare"
msgid "ApprovalRule|Approver Type"
msgstr "Tipul de aprobator"
@@ -4694,28 +4760,28 @@ msgid "ApprovalRule|Approvers"
msgstr "Aprobatori"
msgid "ApprovalRule|Confirmed"
-msgstr ""
+msgstr "Confirmat"
msgid "ApprovalRule|Dismissed"
-msgstr ""
+msgstr "Respins"
msgid "ApprovalRule|Examples: QA, Security."
msgstr "Exemple: QA, Securitate."
msgid "ApprovalRule|Improve your organization's code review with required approvals."
-msgstr ""
+msgstr "Îmbunătățiți revizuirea codului organizației dvs. cu aprobări obligatorii."
msgid "ApprovalRule|Increase quality and maintain standards."
-msgstr ""
+msgstr "Sporesc calitatea și mențin standardele."
msgid "ApprovalRule|Learn more about merge request approval rules."
-msgstr "Aflați mai multe despre regulile de aprobare a merge request-ului."
+msgstr "Aflați mai multe despre regulile de aprobare pentru merge request-urilor."
msgid "ApprovalRule|Name"
msgstr "Nume"
msgid "ApprovalRule|Newly detected"
-msgstr ""
+msgstr "Detectate recent"
msgid "ApprovalRule|Number of vulnerabilities allowed before approval rule is triggered."
msgstr "Numărul de vulnerabilități permise înainte de declanșarea regulii de aprobare."
@@ -4727,19 +4793,19 @@ msgid "ApprovalRule|Please select at least one security scanner"
msgstr "Vă rugăm să selectați cel puțin un scaner de securitate"
msgid "ApprovalRule|Please select at least one severity level"
-msgstr "Vă rugăm selectați cel puțin un nivel de severitate"
+msgstr "Vă rugăm să selectați cel puțin un nivel de severitate"
msgid "ApprovalRule|Please select at least one vulnerability state"
-msgstr ""
+msgstr "Vă rugăm să selectați cel puțin o stare de vulnerabilitate"
msgid "ApprovalRule|Previously detected"
-msgstr ""
+msgstr "Detectate anterior"
msgid "ApprovalRule|Reduce your time to merge."
-msgstr ""
+msgstr "Reduceți timpul de îmbinare."
msgid "ApprovalRule|Resolved"
-msgstr ""
+msgstr "Rezolvat"
msgid "ApprovalRule|Rule name"
msgstr "Numele regulii"
@@ -4751,7 +4817,7 @@ msgid "ApprovalRule|Select All"
msgstr "Selectați tot"
msgid "ApprovalRule|Select eligible approvers by expertise or files changed."
-msgstr ""
+msgstr "Selectați aprobatorii eligibili în funcție de expertiză sau de fișierele modificate."
msgid "ApprovalRule|Select scanners"
msgstr "Selectați scanerele"
@@ -4760,7 +4826,7 @@ msgid "ApprovalRule|Select severity levels"
msgstr "Selectați nivelele de severitate"
msgid "ApprovalRule|Select vulnerability states"
-msgstr ""
+msgstr "Selectați stările de vulnerabilitate"
msgid "ApprovalRule|Severity levels"
msgstr "Nivele de severitate"
@@ -4769,61 +4835,52 @@ msgid "ApprovalRule|Target branch"
msgstr "Ramura țintă"
msgid "ApprovalRule|Try for free"
-msgstr ""
+msgstr "Încercați gratuit"
msgid "ApprovalRule|Vulnerabilities allowed"
msgstr "Vulnerabilități permise"
msgid "ApprovalRule|Vulnerability states"
-msgstr ""
+msgstr "Stări de vulnerabilitate"
msgid "ApprovalSettings|Merge request approval settings have been updated."
-msgstr "Setările de aprobare a cererilor de îmbinare au fost actualizate."
+msgstr "Setările de aprobare a merge request-urilor au fost actualizate."
msgid "ApprovalSettings|Prevent approval by author"
-msgstr ""
+msgstr "Împiedicați aprobarea de către autor"
msgid "ApprovalSettings|Prevent approval by author."
-msgstr "Prevenire a aprobării de către autor."
+msgstr "Împiedicați aprobarea de către autor."
msgid "ApprovalSettings|Prevent approvals by users who add commits"
-msgstr ""
+msgstr "Împiedicați aprobările de către utilizatorii care adaugă commit-uri"
msgid "ApprovalSettings|Prevent approvals by users who add commits."
-msgstr "Preveniți aprobări de la utilizatori care adaugă commit-uri."
+msgstr "Împiedicați aprobările de către utilizatorii care adaugă commit-uri."
msgid "ApprovalSettings|Prevent editing approval rules in merge requests"
-msgstr ""
+msgstr "Împiedicați editarea regulilor de aprobare în merge request-uri"
msgid "ApprovalSettings|Prevent editing approval rules in projects and merge requests."
-msgstr "Preveniți editarea regulilor de aprobare în proiecte și merge request-uri."
+msgstr "Împiedicați editarea regulilor de aprobare în proiecte și merge request-uri."
msgid "ApprovalSettings|Remove all approvals when commits are added to the source branch"
-msgstr ""
+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 ""
+msgstr "Cereți parola utilizatorului pentru a aproba"
msgid "ApprovalSettings|There was an error loading merge request approval settings."
-msgstr "S-a întâmplat o eroare încărcând setările de aprobare a cererilor de îmbinare."
+msgstr "S-a produs o eroare la încărcarea setărilor de aprobare a merge request-urilor."
msgid "ApprovalSettings|There was an error updating merge request approval settings."
msgstr "S-a produs o eroare la actualizarea setărilor de aprobare a merge request-urilor."
msgid "ApprovalSettings|This setting is configured at the instance level and can only be changed by an administrator."
-msgstr "Această setare este configurată la nivel de instanță și poate fi schimbată doar de un administrator."
+msgstr "Această setare este configurată la nivel de instanță și poate fi modificată numai de către un administrator."
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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr "Aderă la separarea sarcinilor"
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr "Cel puțin o regulă nu respectă separarea sarcinilor"
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr "Nu respectă separarea sarcinilor"
+msgstr "Această setare este configurată în %{groupName} și poate fi modificată în setările grupului numai de către un administrator sau proprietarul grupului."
msgid "Approvals are optional."
msgstr "Aprobările sunt opționale."
@@ -4892,13 +4949,13 @@ msgid "Archived in this version"
msgstr "Arhivat în această versiune"
msgid "Archived project! Repository and other project resources are read-only"
-msgstr "Proiect arhivat! Depozitul și alte resurse ale proiectului sunt doar-citire"
+msgstr "Proiect arhivat! Repozitoriul și alte resurse ale proiectului sunt doar în citire"
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}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}"
+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 "Are you ABSOLUTELY SURE you wish to remove this group?"
msgstr "Sunteți ABSOLUT SIGUR că doriți să înlăturați acest grup?"
@@ -4919,7 +4976,7 @@ msgid "Are you sure you want to %{action} %{name}?"
msgstr "Sunteți sigur că doriți să %{action} %{name}?"
msgid "Are you sure you want to approve %{user}?"
-msgstr ""
+msgstr "Sunteți sigur că vreți să aprobați pe %{user}?"
msgid "Are you sure you want to attempt to merge?"
msgstr "Sunteți sigur că vreți să încercați să îmbinați?"
@@ -4946,7 +5003,7 @@ msgid "Are you sure you want to delete this comment?"
msgstr ""
msgid "Are you sure you want to delete this deploy key?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți această cheie de implementare?"
msgid "Are you sure you want to delete this device? This action cannot be undone."
msgstr "Sunteți sigur că doriți să ștergeți acest dispozitiv? Această acțiune nu poate fi anulată."
@@ -5021,7 +5078,7 @@ 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 health check token?"
-msgstr "Sunteți sigur că doriți să resetați tokenul de verificare a sănătății?"
+msgstr "Sunteți sigur că doriți să resetați tokenul pentru verificarea de sănătate?"
msgid "Are you sure you want to reset the registration token?"
msgstr "Sunteți sigur că doriți să resetați token-ul de înregistrare?"
@@ -5066,7 +5123,7 @@ msgid "Are you sure? The device will be signed out of GitLab and all remember me
msgstr "Sunteți sigur? Dispozitivul va fi deconectat de la GitLab și toate tokenurile de tip „amintiți-vă de mine†vor fi revocate."
msgid "Arrange charts"
-msgstr "Aranjați diagramele"
+msgstr "Aranjați graficele"
msgid "Artifact"
msgstr "Artefact"
@@ -5141,7 +5198,7 @@ msgid "Assign reviewer(s)"
msgstr "Atribuiți evaluator(i)"
msgid "Assign severity"
-msgstr ""
+msgstr "Atribuiți severitatea"
msgid "Assign some issues to this milestone."
msgstr "Atribuire de câteva probleme la acest obiectiv."
@@ -5153,7 +5210,7 @@ msgid "Assign to commenting user"
msgstr "Atribuire unui utilizator comentator"
msgid "Assign to me"
-msgstr ""
+msgstr "Atribuiți-mi mie"
msgid "Assigned %{assignee_users_sentence}."
msgstr "Atribuit %{assignee_users_sentence}."
@@ -5207,7 +5264,7 @@ msgid "Assigns %{reviewer_users_sentence} as %{reviewer_text}."
msgstr "Se atribuie %{reviewer_users_sentence} ca %{reviewer_text}."
msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules."
-msgstr "Cel puțin o aprobare din partea unui proprietar de cod este necesară pentru a schimba fișierele care corespund regulilor respective CODEOWNER."
+msgstr "Este necesară cel puțin o aprobare din partea unui proprietar de cod pentru a modifica fișierele care se potrivesc cu regulile CODEOWNER respective."
msgid "At least one field of %{one_of_required_fields} must be present"
msgstr "Cel puțin un câmp din %{one_of_required_fields} trebuie să fie prezent."
@@ -5252,7 +5309,7 @@ msgid "Audit Events"
msgstr "Evenimente de audit"
msgid "Audit events"
-msgstr ""
+msgstr "Evenimente de audit"
msgid "AuditLogs|(removed)"
msgstr "(înlăturat)"
@@ -5359,7 +5416,7 @@ msgstr "August"
msgid "Authenticate"
msgstr "Autentificare"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5378,7 +5435,7 @@ msgid "Authenticated Git LFS request rate limit"
msgstr "Limita ratei de solicitare Git LFS autentificate."
msgid "Authenticated Git LFS requests"
-msgstr ""
+msgstr "Solicitări Git LFS autentificate"
msgid "Authenticated web rate limit period in seconds"
msgstr "Perioada de limitare a vitezei web autentificate în secunde"
@@ -5398,6 +5455,9 @@ msgstr "Eroare la autentificare"
msgid "Authentication Log"
msgstr "Jurnal autentificare"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Autentificarea nu a reușit: %{error_message}"
@@ -5519,16 +5579,16 @@ msgid "AutoRemediation|%{mrsCount} ready for review"
msgstr "%{mrsCount} gata pentru revizuire"
msgid "AutoRemediation|Auto-fix"
-msgstr "Auto-fix"
+msgstr "Auto-reparare"
msgid "AutoRemediation|Auto-fix solutions"
-msgstr "Soluții Auto-fix"
+msgstr "Soluții auto-reparare"
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 "Dacă utilizați scanarea dependențelor și/sau a containerelor și este activată funcția de auto-fixare, auto-fixarea creează automat merge request-uri cu remedieri ale vulnerabilităților."
+msgstr "Dacă utilizați scanarea dependențelor și/sau a containerelor și este activată funcția de auto-reparare, auto-repararea creează automat merge request-uri cu remedieri pentru vulnerabilități."
msgid "AutoRemediation|Introducing GitLab auto-fix"
-msgstr "Vă prezentăm GitLab auto-fix"
+msgstr "Vă prezentăm GitLab auto-reparare"
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 "Rollback-urile automate încep atunci când este declanșată o alertă critică. Dacă ultima implementare reușită nu reușește să facă o revenire în mod automat, aceasta se poate face în continuare manual."
@@ -5584,8 +5644,8 @@ msgstr "ID disponibil"
msgid "Available group runners: %{runners}"
msgstr "Executori de grup disponibili: %{runners}"
-msgid "Available runners: %{runners}"
-msgstr "Executori disponibili: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "Executori partajați disponibili:"
@@ -5603,7 +5663,7 @@ msgid "Average per day: %{average}"
msgstr "Media pe zi: %{average}"
msgid "Awaiting user signup"
-msgstr ""
+msgstr "Așteptăm înscrierea utilizatorului"
msgid "Award added"
msgstr "Premiu adăugat"
@@ -5612,7 +5672,7 @@ msgid "Award removed"
msgstr "Premiu înlăturat"
msgid "AwardEmoji|No emojis found."
-msgstr "Nu s-au găsit emoji-uri."
+msgstr "Nu s-au găsit emojiuri."
msgid "Back"
msgstr "ÃŽnapoi"
@@ -5636,25 +5696,25 @@ msgid "Badges"
msgstr "Insigne"
msgid "Badges|Add badge"
-msgstr "Adaugă insignă"
+msgstr "Adăugați insigna"
msgid "Badges|Adding the badge failed, please check the entered URLs and try again."
-msgstr "Adăugarea insignei nu a reușit, verificați adresele URL introduse și încercați din nou."
+msgstr "Adăugarea insignei a eșuat, vă rugăm să verificați URL-urile introduse și să încercați din nou."
msgid "Badges|Badge image URL"
-msgstr "Adresa URL a imaginii insignei"
+msgstr "URL-ul imaginii insignei"
msgid "Badges|Badge image preview"
-msgstr "Previzualizare imagine insignă"
+msgstr "Previzualizarea imaginii insignei"
msgid "Badges|Badge saved."
-msgstr "Insigne salvate."
+msgstr "Insigna a fost salvată."
msgid "Badges|Delete badge?"
msgstr "Ștergeți insigna?"
msgid "Badges|Deleting the badge failed, please try again."
-msgstr "Ștergerea insignei nu a reușit, încercați din nou."
+msgstr "Ștergerea insignei a eșuat, vă rugăm să încercați din nou."
msgid "Badges|Enter a valid URL"
msgstr "Introduceți un URL valid"
@@ -5672,16 +5732,16 @@ msgid "Badges|Name"
msgstr "Nume"
msgid "Badges|New badge added."
-msgstr "Insignă nouă adăugată."
+msgstr "Noua insignă a fost adăugată."
msgid "Badges|No badge image"
-msgstr "Nicio imagine insignă"
+msgstr "Nicio imagine a insignei"
msgid "Badges|No image to preview"
-msgstr "Nu există imagini pentru previzualizare"
+msgstr "Nicio imagine pentru previzualizare"
msgid "Badges|Project Badge"
-msgstr "Insigne de proiect"
+msgstr "Insigna proiectului"
msgid "Badges|Reload badge image"
msgstr "Reîncărcați imaginea insignei"
@@ -5690,10 +5750,10 @@ msgid "Badges|Save changes"
msgstr "Salvați modificările"
msgid "Badges|Saving the badge failed, please check the entered URLs and try again."
-msgstr "Salvarea insignei nu a reușit, verificați adresele URL introduse și încercați din nou."
+msgstr "Salvarea insignei a eșuat, vă rugăm să verificați URL-urile introduse și să încercați din nou."
msgid "Badges|Supported %{docsLinkStart}variables%{docsLinkEnd}: %{placeholders}"
-msgstr "Suportate %{docsLinkStart}variabile%{docsLinkEnd}: %{placeholders}"
+msgstr "%{docsLinkStart}Variabilele%{docsLinkEnd} acceptate: %{placeholders}"
msgid "Badges|The badge was deleted."
msgstr "Insigna a fost ștearsă."
@@ -5705,10 +5765,10 @@ msgid "Badges|This project has no badges"
msgstr "Acest proiect nu are insigne"
msgid "Badges|You are going to delete this badge. Deleted badges %{strongStart}cannot%{strongEnd} be restored."
-msgstr "Sunteți pe cale de a șterge această insignă. Insignele șterse %{strongStart}nu%{strongEnd} pot fi recuperate."
+msgstr "Sunteți pe cale să ștergeți această insignă. Insignele șterse %{strongStart}nu pot%{strongEnd} fi restaurate."
msgid "Badges|Your badges"
-msgstr "Insignele tale"
+msgstr "Insignele dumneavoastră"
msgid "BambooService|Atlassian Bamboo"
msgstr "Atlassian Bamboo"
@@ -5737,7 +5797,7 @@ msgstr "Mesaj banner"
msgid "Based on"
msgstr "Bazat pe"
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5767,11 +5827,8 @@ msgstr "Mai jos sunt setările pentru %{link_to_gitlab_pages}."
msgid "Below you will find all the groups that are public."
msgstr "Mai jos veți găsi toate grupurile care sunt publice."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
-msgstr "Acoperire bisăptămânală a codului"
+msgstr "Coverage de cod bisăptămânal"
msgid "Billable Users"
msgstr "Utilizatori facturabili"
@@ -5789,7 +5846,7 @@ msgid "BillingPlans|Congratulations, your free trial is activated."
msgstr "Felicitări, evaluarea dvs. gratuită este activată."
msgid "BillingPlans|End of availability for the Bronze Plan"
-msgstr "Sfârșitul disponibilității pentru Planul Bronz"
+msgstr "Sfârșitul disponibilității pentru Planul Bronze"
msgid "BillingPlans|Free upgrade!"
msgstr "Actualizare gratuită!"
@@ -5810,7 +5867,7 @@ msgid "BillingPlans|Manage plan"
msgstr "Gestionați planul"
msgid "BillingPlans|Pricing page"
-msgstr " Pagina de prețuri"
+msgstr "Pagina de prețuri"
msgid "BillingPlans|See all %{plan_name} features"
msgstr "Vizualizați toate funcțiile %{plan_name}"
@@ -5819,19 +5876,19 @@ msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "Acest grup utilizează planul asociat grupului său părinte."
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
-msgstr "Pentru a gestiona planul pentru acest grup, vizitați secțiunea de facturare a %{parent_billing_page_link}."
+msgstr "Pentru a gestiona planul pentru acest grup, vizitați secțiunea de facturare de pe %{parent_billing_page_link}."
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 "Deși GitLab termină disponibilitatea planului de Bronz, încă mai puteți reînnoi abonamentul Bronz încă o dată înainte de %{eoa_bronze_plan_end_date}. Oferim, de asemenea, un upgrade gratuit pe timp limitat la planul nostru Premium (până la 25 de utilizatori)! Aflați mai multe despre modificările și ofertele noastre din %{announcement_link}."
+msgstr "În timp ce GitLab pune capăt disponibilității planului Bronze, încă mai puteți reînnoi abonamentul Bronze încă o dată înainte de %{eoa_bronze_plan_end_date}. Oferim, de asemenea, un upgrade gratuit pe o perioadă limitată de timp la planul Premium (până la 25 de utilizatori)! Aflați mai multe despre modificări și oferte în %{announcement_link}."
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 ""
+msgstr "Nu aveți niciun grup. Va trebui să %{create_group_link_start}creați unul%{create_group_link_end} și %{move_link_start}să mutați acest proiect în el%{move_link_end}."
msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr ""
+msgstr "Va trebui să %{move_link_start}mutați acest proiect%{move_link_end} într-unul din grupurile dumneavoastră."
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 "Evaluarea dvs. GitLab.com %{plan} va %{strong_open} expira după %{expiration_date}%{strong_close}. Puteți păstra accesul la funcțiile %{plan} prin actualizarea de mai jos."
+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."
@@ -5861,34 +5918,43 @@ msgid "BillingPlan|Upgrade for free"
msgstr "Actualizați gratuit"
msgid "Billings|%{planName} plan"
-msgstr "Plan %{planName}"
+msgstr "Planul %{planName}"
msgid "Billings|An error occurred while extending your trial."
-msgstr "S-a produs o eroare în timpul prelungirii perioadei de încercare."
+msgstr "A apărut o eroare la prelungirea perioadei de încercare."
msgid "Billings|An error occurred while reactivating your trial."
-msgstr "A apărut o eroare la reactivarea perioadei dvs. de încercare."
+msgstr "A apărut o eroare în timpul reactivării perioadei dvs. de încercare."
msgid "Billings|By extending your trial, you will receive an additional 30 days of %{planName}. Your trial can be only extended once."
-msgstr "Prin prelungirea perioadei de încercare, veți primi încă 30 de zile de %{planName}. Perioada dvs. de încercare poate fi prelungită o singură dată."
+msgstr "Prin prelungirea perioadei dvs. de încercare, veți primi 30 de zile suplimentare de %{planName}. Perioada dvs. de încercare poate fi prelungită doar o singură dată."
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
-msgstr "Prin reactivarea perioadei de încercare, veți primi încă 30 de zile de %{planName}. Perioada dvs. de încercare poate fi prelungită o singură dată."
+msgstr "Prin reactivarea perioadei dvs. de încercare, veți primi 30 de zile suplimentare de %{planName}. Încercarea dvs. poate fi reactivată doar o singură dată."
+
+msgid "Billings|Error validating card details"
+msgstr ""
msgid "Billings|Extend trial"
-msgstr "Extindeți perioada de evaluare"
+msgstr "Extindeți perioada de încercare"
msgid "Billings|Reactivate trial"
msgstr "Reactivați perioada de încercare"
+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 "Nu se pot activa executorii partajați până când nu este înregistrat un card de credit valabil."
+msgstr "Executorii partajați nu pot fi activați până când nu este înregistrat un card de credit valabil."
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 ""
+msgstr "Pentru a utiliza minutele CI/CD gratuite pe executorul partajat, trebuie să vă validați contul cu un card de credit. Dacă preferați să nu furnizați unul, puteți rula pipeline-uri aducându-vă propriii executori și dezactivând executorii partajați pentru proiectul dumneavoastră. Acest lucru este necesar pentru a descuraja și a reduce abuzurile asupra infrastructurii GitLab. %{strongStart}GitLab nu vă va debita cardul, acesta va fi folosit doar pentru validare.%{strongEnd} %{linkStart}Aflați mai multe%{linkEnd}."
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 ""
+msgstr "Pentru a utiliza minutele CI/CD gratuite pe executorii partajați, va trebui să vă validați contul cu un card de credit. Acest lucru este necesar pentru a descuraja și reduce abuzurile pe infrastructura GitLab. %{strongStart}GitLab nu vă va debita cardul, acesta va fi folosit doar pentru validare.%{strongEnd}"
msgid "Billings|User validation required"
msgstr "Este necesară validarea utilizatorului"
@@ -5900,55 +5966,67 @@ msgid "Billings|Validate user account"
msgstr "Validați contul de utilizator"
msgid "Billings|You'll now be able to take advantage of free CI/CD minutes on shared runners."
-msgstr ""
+msgstr "Acum veți putea să profitați de minutele gratuite de CI/CD pe executorii partajați."
msgid "Billings|Your account has been validated"
-msgstr ""
+msgstr "Contul dvs. a fost validat"
msgid "Billing|%{user} was successfully approved"
+msgstr "%{user} a fost aprobat cu succes"
+
+msgid "Billing|Add seats"
msgstr ""
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."
msgid "Billing|An error occurred while approving %{user}"
+msgstr "S-a produs o eroare în timp ce se aproba %{user}"
+
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while getting a billable member details"
-msgstr "S-a produs o eroare în timpul obținerii detaliilor unui membru facturabil"
+msgid "Billing|An error occurred while loading GitLab subscription details."
+msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
-msgstr "S-a produs o eroare la încărcarea listei membrilor facturabili"
+msgid "Billing|An error occurred while loading billable members list."
+msgstr ""
msgid "Billing|An error occurred while loading pending members list"
-msgstr ""
+msgstr "S-a produs o eroare în timpul încărcării listei membrilor în așteptare"
-msgid "Billing|An error occurred while removing a billable member"
-msgstr "A apărut o eroare în timpul eliminării unui membru facturabil"
+msgid "Billing|An error occurred while removing a billable member."
+msgstr ""
msgid "Billing|Awaiting member signup"
-msgstr ""
+msgstr "Se așteaptă înscrierea unui membru"
msgid "Billing|Cannot remove user"
msgstr "Nu se poate înlătura utilizatorul"
msgid "Billing|Direct memberships"
-msgstr "Abonamente directe"
+msgstr "Membri direcți"
msgid "Billing|Enter at least three characters to search."
msgstr "Introduceți cel puțin trei caractere pentru a căuta."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
-msgstr "Exportă lista"
+msgstr "Exportați lista"
-msgid "Billing|Group"
-msgstr "Grup"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+msgstr ""
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 ""
+
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ă-l înlăture pe membru."
+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."
msgid "Billing|No users to display."
msgstr "Niciun utilizator de afișat."
@@ -5957,7 +6035,7 @@ msgid "Billing|Private"
msgstr "Privat"
msgid "Billing|Project invite"
-msgstr "Invitație proiect"
+msgstr "Invitație la proiect"
msgid "Billing|Remove user %{username} from your subscription"
msgstr "Înlăturați utilizatorul %{username} din abonament"
@@ -5966,16 +6044,13 @@ msgid "Billing|Toggle seat details"
msgstr "Comutare detalii seat on/off"
msgid "Billing|Type %{username} to confirm"
-msgstr "Tastați %{username} pentru a confirma"
+msgstr "Introduceți %{username} pentru a confirma"
msgid "Billing|User was successfully removed"
msgstr "Utilizatorul a fost înlăturat cu succes"
-msgid "Billing|Users occupying seats in"
-msgstr "Utilizatori care ocupă seat-uri în"
-
msgid "Billing|View pending approvals"
-msgstr ""
+msgstr "Vizualizați aprobările în așteptare"
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 "Sunteți pe cale să înlăturați utilizatorul %{username} din abonament. Dacă veți continua, utilizatorul va fi înlăturat din grupul %{namespace} și din toate subgrupurile și proiectele acestuia. Această acțiune nu poate fi anulată."
@@ -5993,7 +6068,7 @@ msgid "Blame"
msgstr "Blame"
msgid "BlobViewer|View on %{environmentName}"
-msgstr ""
+msgstr "Vizualizare pe %{environmentName}"
msgid "Block user"
msgstr "Blocați utilizatorul"
@@ -6056,7 +6131,7 @@ msgid "BoardNewIssue|Select a project"
msgstr "Selectați un proiect"
msgid "BoardScope|An error occurred while getting iterations. Please try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul obținerii iterațiilor. Vă rugăm să încercați din nou."
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "A apărut o eroare în timpul obținerii obiectivelor, vă rugăm să încercați din nou."
@@ -6074,7 +6149,7 @@ msgid "BoardScope|Any assignee"
msgstr "Orice responsabil"
msgid "BoardScope|Any iteration"
-msgstr ""
+msgstr "Orice iterație"
msgid "BoardScope|Any label"
msgstr "Orice etichetă"
@@ -6086,13 +6161,13 @@ msgid "BoardScope|Choose labels"
msgstr "Alegeți etichete"
msgid "BoardScope|Current iteration"
-msgstr ""
+msgstr "Iterația curentă"
msgid "BoardScope|Edit"
msgstr "Editare"
msgid "BoardScope|Iteration"
-msgstr ""
+msgstr "Iterație"
msgid "BoardScope|Labels"
msgstr "Etichete"
@@ -6101,13 +6176,13 @@ msgid "BoardScope|Milestone"
msgstr "Obiectiv"
msgid "BoardScope|No iteration"
-msgstr ""
+msgstr "Nicio iterație"
msgid "BoardScope|No milestone"
msgstr "Niciun obiectiv"
msgid "BoardScope|Search iterations"
-msgstr ""
+msgstr "Căutați Iterații"
msgid "BoardScope|Search milestones"
msgstr "Căutați obiective"
@@ -6116,7 +6191,7 @@ msgid "BoardScope|Select assignee"
msgstr "Selectați responsabilul"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "Selectați iterația"
msgid "BoardScope|Select labels"
msgstr "Selectați etichete"
@@ -6317,13 +6392,13 @@ msgid "Branches|Cancel, keep branch"
msgstr "Anulare, păstrați ramura"
msgid "Branches|Can’t find HEAD commit for this branch"
-msgstr ""
+msgstr "Nu se poate găsi commit-ul HEAD pentru această ramură"
msgid "Branches|Compare"
msgstr "Comparați"
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
-msgstr "Ștergeți toate ramurile care sunt îmbinate în '%{default_branch}'"
+msgstr "Șterge toate ramurile care sunt îmbinate în „%{default_branch}â€"
msgid "Branches|Delete branch"
msgstr "Ștergeți ramura"
@@ -6353,25 +6428,22 @@ msgid "Branches|Merged into %{default_branch}"
msgstr "Îmbinat în %{default_branch}"
msgid "Branches|New branch"
-msgstr "Ramură nouă"
+msgstr "Ramura nouă"
msgid "Branches|No branches to show"
-msgstr "Fără ramuri de afișat"
+msgstr "Nicio ramură de afișat"
msgid "Branches|Once you confirm and press %{strongStart}%{buttonText},%{strongEnd} it cannot be undone or recovered."
-msgstr "Odată ce confirmați și apăsați %{strongStart}%{buttonText},%{strongEnd} nu poate fi anulat sau recuperat."
+msgstr "Odată ce ați confirmat și apăsați pe %{strongStart}%{buttonText}%{strongEnd}, nu se mai poate anula sau recupera."
msgid "Branches|Only a project maintainer or owner can delete a protected branch"
-msgstr "Numai un responsabil de proiect sau un proprietar poate șterge o ramură protejată"
+msgstr "Numai un întreținător sau un proprietar de proiect poate șterge o ramură protejată"
msgid "Branches|Overview"
msgstr "Prezentare generală"
msgid "Branches|Please type the following to confirm:"
-msgstr "Vă rugăm să tastați următoarele pentru a confirma:"
-
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Ramurile protejate pot fi gestionate în %{project_settings_link}."
+msgstr "Vă rugăm să introduceți următoarele date pentru a confirma:"
msgid "Branches|Show active branches"
msgstr "Afișați ramurile active"
@@ -6398,7 +6470,7 @@ msgid "Branches|Stale branches"
msgstr "Ramuri vechi"
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
-msgstr "Ramurile nu au putut fi actualizate automat, deoarece au deviat de la omologul său de mai sus."
+msgstr "Ramura nu a putut fi actualizată în mod automat, deoarece a deviat de la omologul său din amonte."
msgid "Branches|The default branch cannot be deleted"
msgstr "Ramura implicită nu poate fi ștearsă"
@@ -6407,10 +6479,10 @@ msgid "Branches|This branch hasn’t been merged into %{defaultBranchName}. To a
msgstr "Această ramură nu a fost îmbinată în %{defaultBranchName}. Pentru a evita pierderea de date, luați în considerare îmbinarea acestei ramuri înainte de a o șterge."
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
-msgstr "Pentru a renunța la modificările locale și a suprascrie ramura cu versiunea upstream, ștergeți-o aici și alegeți „Actualizare imediată†de mai sus."
+msgstr "Pentru a renunța la modificările locale și a suprascrie ramura cu versiunea din amonte, ștergeți-o aici și alegeți „Actualizați acum†de mai sus."
msgid "Branches|Unable to load branches"
-msgstr ""
+msgstr "Nu se pot încărca ramurile"
msgid "Branches|Yes, delete branch"
msgstr "Da, ștergeți ramura"
@@ -6425,14 +6497,11 @@ msgid "Branches|You're about to permanently delete the protected branch %{strong
msgstr "Sunteți pe cale să ștergeți definitiv ramura protejată %{strongStart}%{branchName}.%{strongEnd}"
msgid "Branches|diverged from upstream"
-msgstr "deviat din amonte"
+msgstr "divergentă din amonte"
msgid "Branches|merged"
msgstr "îmbinate"
-msgid "Branches|project settings"
-msgstr "setările proiectului"
-
msgid "Branches|protected"
msgstr "protejat"
@@ -6485,12 +6554,15 @@ msgid "Bulk update"
msgstr "Actualizare în bloc"
msgid "BulkImport| %{host} is running outdated GitLab version (v%{version})"
-msgstr ""
+msgstr " %{host} rulează o versiune învechită a GitLab (v%{version})"
msgid "BulkImport|%{feature} (require v%{version})"
-msgstr ""
+msgstr "%{feature} (necesită v%{version})"
msgid "BulkImport|Destination"
+msgstr "Destinația"
+
+msgid "BulkImport|Destination group"
msgstr ""
msgid "BulkImport|Existing groups"
@@ -6500,28 +6572,31 @@ msgid "BulkImport|Filter by source group"
msgstr "Filtrați după grupul sursă"
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 ""
+msgstr "Următoarele date nu vor fi migrate: %{bullets} Contactați administratorul de sistem al %{host} pentru a actualiza GitLab dacă aveți nevoie de aceste date în migrația dumneavoastră"
msgid "BulkImport|From source group"
msgstr "Din grupul sursă"
msgid "BulkImport|Group import history"
+msgstr "Istoric de import al grupului"
+
+msgid "BulkImport|History"
msgstr ""
msgid "BulkImport|Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again."
-msgstr "Import eșuat: Destinația nu poate fi un subgrup al grupului sursă. Schimbați destinația și încercați din nou."
+msgstr "Importul a eșuat: Destinația nu poate fi un subgrup al grupului sursă. Schimbați destinația și încercați din nou."
msgid "BulkImport|Import groups from GitLab"
-msgstr "Import grupuri din GitLab"
+msgstr "Importați grupuri din GitLab"
msgid "BulkImport|Import is finished. Pick another name for re-import"
-msgstr ""
+msgstr "Importul este finalizat. Alegeți un alt nume pentru reimport"
msgid "BulkImport|Import selected"
-msgstr "Import selectat"
+msgstr "Importați articolele selectate"
msgid "BulkImport|Importing the group failed."
-msgstr ""
+msgstr "Importul grupului a eșuat."
msgid "BulkImport|Last imported to %{link}"
msgstr "Ultima importare la %{link}"
@@ -6530,25 +6605,22 @@ msgid "BulkImport|Name already exists."
msgstr "Numele există deja."
msgid "BulkImport|Name already used as a target for another group."
-msgstr ""
-
-msgid "BulkImport|New group"
-msgstr "Grup nou"
+msgstr "Nume deja utilizat ca țintă pentru un alt grup."
msgid "BulkImport|No additional information provided."
-msgstr ""
+msgstr "Nu sunt furnizate informații suplimentare."
msgid "BulkImport|No history is available"
-msgstr ""
+msgstr "Nu este disponibil niciun istoric"
msgid "BulkImport|No parent"
msgstr "Fără părinte"
msgid "BulkImport|Project import history"
-msgstr ""
+msgstr "Istoricul importului proiectului"
msgid "BulkImport|Re-import creates a new group. It does not sync with the existing group."
-msgstr ""
+msgstr "Re-importul creează un nou grup. Acesta nu se sincronizează cu grupul existent."
msgid "BulkImport|Showing %{start}-%{end} of %{total}"
msgstr "Se afișează %{start}-%{end} din %{total}"
@@ -6557,55 +6629,55 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} from %{link}"
msgstr "Se afișează %{start}-%{end} din %{total} de la %{link}"
msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter}\" from %{link}"
-msgstr "Se afișează %{start}-%{end} din %{total} care se potrivește filtrului \"%{filter}\" din %{link}"
+msgstr "Se afișează %{start}-%{end} din %{total} care se potrivesc cu filtrul „%{filter}†din %{link}"
msgid "BulkImport|Source"
-msgstr ""
+msgstr "Sursa"
msgid "BulkImport|Source group"
-msgstr "Grup sursă"
+msgstr "Grupul sursă"
msgid "BulkImport|Template / File-based import / GitLab Migration"
-msgstr ""
+msgstr "Șablon / Import bazat pe fișiere / Migrație GitLab"
msgid "BulkImport|To new group"
-msgstr ""
+msgstr "La un grup nou"
msgid "BulkImport|Update of import statuses with realtime changes failed"
-msgstr ""
+msgstr "Actualizarea statusurilor de import cu modificările în timp real a eșuat"
msgid "BulkImport|You have no groups to import"
msgstr "Nu aveți grupuri de importat"
msgid "BulkImport|Your imported groups will appear here."
-msgstr ""
+msgstr "Grupurile dvs. importate vor apărea aici."
msgid "BulkImport|Your imported projects will appear here."
-msgstr ""
+msgstr "Proiectele dvs. importate vor apărea aici."
msgid "BulkImport|expected an associated Group but has an associated Project"
-msgstr ""
+msgstr "se aștepta la un Grup asociat, dar are un Proiect asociat"
msgid "BulkImport|expected an associated Project but has an associated Group"
-msgstr ""
+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 "Burndown chart"
-msgstr ""
+msgstr "Graficul burndown"
msgid "BurndownChartLabel|Open issue weight"
-msgstr "Greutatea problemei deschise"
+msgstr "Greutate de probleme deschise"
msgid "BurndownChartLabel|Open issues"
msgstr "Probleme deschise"
msgid "Burnup chart"
-msgstr ""
+msgstr "Graficul burndown"
msgid "Burnup chart could not be generated due to too many events"
-msgstr ""
+msgstr "Graficul burnup nu a putut fi generat din cauza numărului prea mare de evenimente"
msgid "Business"
msgstr ""
@@ -6635,13 +6707,13 @@ msgid "By default, all projects and groups will use the global notifications set
msgstr "În mod implicit, toate proiectele și grupurile vor utiliza setarea globală a notificărilor."
msgid "By month"
-msgstr ""
+msgstr "Pe lună"
msgid "By quarter"
-msgstr ""
+msgstr "Pe trimestru"
msgid "By week"
-msgstr ""
+msgstr "Pe săptămână"
msgid "ByAuthor|by"
msgstr "de"
@@ -6661,9 +6733,6 @@ msgstr "Setări CI"
msgid "CI variables"
msgstr "Variabilele CI"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI va rula folosind datele de autentificare atribuite mai sus."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6679,6 +6748,9 @@ msgstr "Configurația CI/CD"
msgid "CI/CD configuration file"
msgstr "Fișier de configurare CI/CD"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr "Niciun proiect nu a fost adăugat la domeniul de aplicare"
@@ -6694,6 +6766,9 @@ msgstr "Frecvența de desfășurare"
msgid "CICDAnalytics|Lead time"
msgstr "Timp de execuție"
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr "Proiecte cu lansări"
@@ -6713,7 +6788,7 @@ msgid "CICDAnalytics|Shared Runners Usage"
msgstr ""
msgid "CICDAnalytics|Shared runner pipeline minute duration by month"
-msgstr ""
+msgstr "Durata în minute a conductei executorului partajat pe lună"
msgid "CICDAnalytics|Shared runner usage"
msgstr ""
@@ -6766,8 +6841,8 @@ msgstr "Limitați accesul CI_JOB_TOKEN"
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr "Selectați proiecte ce pot fi accesate prin solicitări API autentificate cu variabila CI/CD CI_JOB_TOKEN a acestui proiect."
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr "Pipeline-ul Auto DevOps rulează în mod implicit în toate proiectele fără fișier de configurare CI/CD."
+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 "Pipeline-ul Auto DevOps rulează dacă nu este găsit niciun fișier alternativ de configurare CI."
@@ -6797,7 +6872,7 @@ 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."
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 administrator, solicitarea unui CVE pentru o vulnerabilitate din proiectul dvs. va ajuta utilizatorii să rămână în siguranță și informați."
+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."
msgid "CVE|CVE ID Request"
msgstr "Cerere ID CVE"
@@ -6857,7 +6932,7 @@ msgid "Can create groups:"
msgstr "Poate crea grupuri:"
msgid "Can not delete primary training"
-msgstr ""
+msgstr "Nu se poate șterge formarea primară"
msgid "Can't apply as the source branch was deleted."
msgstr "Nu se poate aplica deoarece ramura sursă a fost ștearsă."
@@ -6934,6 +7009,12 @@ msgstr "Anulează"
msgid "Cancel and close"
msgstr "Anulați și închideți"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Anulați ștergerea indexului"
@@ -6962,10 +7043,10 @@ msgid "Cannot assign a confidential epic to a non-confidential issue. Make the i
msgstr ""
msgid "Cannot be merged automatically"
-msgstr ""
+msgstr "Nu poate fi îmbinat automat"
msgid "Cannot create the abuse report. The reported user was invalid. Please try again or contact support."
-msgstr ""
+msgstr "Nu se poate crea raportul de abuz. Utilizatorul raportat era invalid. Vă rugăm să încercați din nou sau să contactați serviciul de asistență."
msgid "Cannot create the abuse report. The user has been deleted."
msgstr "Nu se poate crea raportul de abuz. Utilizatorul a fost șters."
@@ -6974,7 +7055,7 @@ msgid "Cannot create the abuse report. This user has been blocked."
msgstr "Nu se poate crea raportul de abuz. Acest utilizator a fost blocat."
msgid "Cannot delete %{profile_name} referenced in security policy"
-msgstr ""
+msgstr "Nu se poate șterge %{profile_name} la care se face referire în politica de securitate"
msgid "Cannot have multiple Jira imports running at the same time"
msgstr "Nu puteți avea mai multe importuri Jira care rulează în același timp"
@@ -6995,7 +7076,7 @@ msgid "Cannot merge"
msgstr ""
msgid "Cannot modify %{profile_name} referenced in security policy"
-msgstr ""
+msgstr "Nu se poate modifica %{profile_name} la care se face referire în politica de securitate"
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
@@ -7022,10 +7103,10 @@ msgid "Capacity threshold"
msgstr ""
msgid "Card holder name"
-msgstr ""
+msgstr "Numele titularului cardului"
msgid "Card number:"
-msgstr ""
+msgstr "Numărul cardului:"
msgid "CascadingSettings|Enforce for all subgroups"
msgstr ""
@@ -7124,7 +7205,7 @@ msgid "ChangeReviewer|Unassigned"
msgstr "Neatribuit"
msgid "ChangeTypeAction|Cherry-pick"
-msgstr ""
+msgstr "Cherry-pick"
msgid "ChangeTypeAction|GitLab will create a branch in your fork and start a merge request."
msgstr ""
@@ -7148,7 +7229,7 @@ msgid "ChangeTypeAction|Search projects"
msgstr "Căutați proiecte"
msgid "ChangeTypeAction|Start a %{newMergeRequest} with these changes"
-msgstr "Porniți un %{newMergeRequest} cu aceste schimbări"
+msgstr "Începeți un %{newMergeRequest} cu aceste modificări"
msgid "ChangeTypeAction|Switch branch"
msgstr "Schimbați ramura"
@@ -7160,7 +7241,7 @@ msgid "ChangeTypeAction|This will create a new commit in order to revert the exi
msgstr "Acest lucru va crea un nou commit pentru reversarea modificările existente."
msgid "ChangeTypeAction|Your changes will be committed to %{branchName} because a merge request is open."
-msgstr "Schimbările dvs. vor fi aplicate ramurii %{branchName} deoarece un merge request este deschis."
+msgstr "Modificările dvs. vor fi comise în %{branchName} deoarece un merge request este deschis"
msgid "Changed"
msgstr "Modificat"
@@ -7168,9 +7249,15 @@ msgstr "Modificat"
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 "S-a schimbat titlul în „%{title_param}â€."
@@ -7189,11 +7276,14 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr "Schimbați titlul în \"%{title_param}\"."
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr "Schimbările aduse titlului nu au fost salvate"
msgid "Changing any setting here requires an application restart"
-msgstr ""
+msgstr "Modificarea oricărei setări de aici necesită o repornire a aplicației"
msgid "Characters left"
msgstr "Caractere rămase"
@@ -7202,7 +7292,7 @@ msgid "Characters over limit"
msgstr "Caractere peste limită"
msgid "Charts can't be displayed as the request for data has timed out. %{documentationLink}"
-msgstr ""
+msgstr "Graficele nu pot fi afișate deoarece solicitarea de date a expirat. %{documentationLink}"
msgid "Chat"
msgstr "Chat"
@@ -7258,17 +7348,20 @@ msgstr "Verificați din nou"
msgid "Check feature availability on namespace plan"
msgstr "Verificați disponibilitatea funcției în planul spațiului de nume"
-msgid "Check out, review, and merge locally"
+msgid "Check out branch"
msgstr ""
+msgid "Check out, review, and merge locally"
+msgstr "Verificați, revizuiți și îmbinați local"
+
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 "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 "
msgid "Check with your administrator."
-msgstr ""
+msgstr "Verificați cu administratorul d-voastră."
msgid "Check your Docker images for known vulnerabilities."
msgstr "Verifică imaginile dvs. Docker pentru vulnerabilități cunoscute."
@@ -7480,6 +7573,9 @@ msgstr "Detaliile abonamentului"
msgid "Checkout|Subtotal"
msgstr "Total parțial"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Taxe"
@@ -7546,6 +7642,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "Suport pentru limba chineză folosind"
@@ -7573,9 +7672,6 @@ msgstr "Alegeți orice culoare."
msgid "Choose file…"
msgstr "Alegeți fișierul…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7586,7 +7682,7 @@ msgid "Choose visibility level, enable/disable project features and their permis
msgstr "Alegeți nivelul de vizibilitate, activați/dezactivați caracteristicile proiectului și permisiunile acestora, dezactivați notificările prin e-mail și afișați emoji-ul de recompensă implicit."
msgid "Choose what content you want to see on a group’s overview page."
-msgstr ""
+msgstr "Alegeți ce conținut doriți să vedeți pe pagina de prezentare generală a unui grup."
msgid "Choose which Git strategy to use when fetching the project."
msgstr ""
@@ -7706,7 +7802,7 @@ msgid "CiVariables|Scope"
msgstr "Domeniul de aplicare"
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 "Specificați valorile variabilelor care vor fi utilizate în această rulare. Valorile specificate în %{linkStart}setările CI/CD%{linkEnd} vor fi folosite ca valori implicite."
msgid "CiVariables|State"
msgstr "Stare"
@@ -7739,7 +7835,7 @@ msgid "Classification Label (optional)"
msgstr ""
msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
-msgstr "nu este disponibil: %{reason}"
+msgstr "nu este disponibilă: %{reason}"
msgid "Clean up after running %{link_start}git filter-repo%{link_end} on the repository."
msgstr ""
@@ -7762,17 +7858,23 @@ msgstr "Politica de curățare - numărul maxim de procese de curățare care se
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Clear all repository checks"
msgstr ""
msgid "Clear chart filters"
-msgstr ""
+msgstr "Ștergeți filtrele graficului"
msgid "Clear due date"
msgstr ""
msgid "Clear health status"
-msgstr ""
+msgstr "Șterge starea sănătății"
msgid "Clear recent searches"
msgstr ""
@@ -7805,13 +7907,13 @@ msgid "Clear weight"
msgstr ""
msgid "Cleared health status."
-msgstr ""
+msgstr "Starea sănătății a fost ștearsă."
msgid "Cleared weight."
msgstr ""
msgid "Clears health status."
-msgstr ""
+msgstr "Se șterge starea sănătății."
msgid "Clears weight."
msgstr ""
@@ -7847,7 +7949,7 @@ msgid "Clients"
msgstr "Clienți"
msgid "Clientside DSN"
-msgstr ""
+msgstr "DSN pe partea clientului"
msgid "Clone"
msgstr ""
@@ -7874,10 +7976,10 @@ msgid "CloneIssue|Cannot clone issue due to insufficient permissions!"
msgstr "Nu se poate clona problema din cauza permisiunilor insuficiente!"
msgid "CloneIssue|Cannot clone issue to target project as it is pending deletion."
-msgstr ""
+msgstr "Nu se poate clona problema în proiectul țintă, deoarece este în așteptarea ștergerii."
msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
-msgstr ""
+msgstr "Nu se pot clona probleme de tipul „%{issue_type}â€."
msgid "Cloned this issue to %{path_to_project}."
msgstr ""
@@ -7892,7 +7994,7 @@ msgid "Close %{issueType}"
msgstr "Închideți %{issueType}"
msgid "Close %{noteable}"
-msgstr ""
+msgstr "ÃŽnchide %{noteable}"
msgid "Close %{tabname}"
msgstr ""
@@ -7934,10 +8036,10 @@ msgid "Closes this %{quick_action_target}."
msgstr "Închideți această %{quick_action_target}."
msgid "Cloud Run"
-msgstr ""
+msgstr "Cloud Run"
msgid "Cloud Storage"
-msgstr ""
+msgstr "Stocare în cloud"
msgid "Cluster"
msgstr "Cluster"
@@ -7961,11 +8063,14 @@ msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr "Tipul de cluster trebuie să fie specificat pentru Stagii::ClusterEndpointInserter"
msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
-msgstr ""
+msgstr "%{linkStart}Consultați documentația%{linkEnd} pentru instalarea avansată. Asigurați-vă că aveți la dispoziție tokenul de acces."
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} a fost șters cu succes"
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "%{number} din %{total} agenți"
@@ -8000,10 +8105,10 @@ msgid "ClusterAgents|Agent %{strongStart}connected%{strongEnd}"
msgstr "Agent %{strongStart}conectat%{strongEnd}"
msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
-msgstr "Agent %{strongStart}disconectat%{strongEnd}"
+msgstr "Agent %{strongStart}deconectat%{strongEnd}"
msgid "ClusterAgents|Agent access token:"
-msgstr ""
+msgstr "Tokenul de acces al agentului:"
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "Agentul s-ar putea să nu fie conectat la GitLab"
@@ -8012,10 +8117,10 @@ msgid "ClusterAgents|Agent never connected to GitLab"
msgstr "Agentul nu s-a conectat niciodată la GitLab"
msgid "ClusterAgents|Agent version mismatch"
-msgstr "Versiunea agentului nu corespunde"
+msgstr "Versiunea agentului nu se potrivește"
msgid "ClusterAgents|Agent version mismatch and update"
-msgstr "Versiunea și actualizarea agentului nu corespund"
+msgstr "Versiunea agentului și actualizarea nu se potrivesc"
msgid "ClusterAgents|Agent version update required"
msgstr "Este necesară actualizarea versiunii agentului"
@@ -8023,14 +8128,14 @@ msgstr "Este necesară actualizarea versiunii agentului"
msgid "ClusterAgents|All"
msgstr "Tot"
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr "A apărut o eroare la încărcarea agenților d-voastră"
-
msgid "ClusterAgents|An error occurred while loading your agent"
-msgstr "A apărut o eroare la încărcarea agentului dumneavoastră"
+msgstr "A apărut o eroare la încărcarea agentului d-voastră"
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr "S-a produs o eroare în timpul recuperării activității agentului GitLab. Reîncărcați pagina pentru a încerca din nou."
+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 "A apărut o eroare necunoscută. Vă rugăm să încercați din nou."
@@ -8038,6 +8143,9 @@ msgstr "A apărut o eroare necunoscută. Vă rugăm să încercați din nou."
msgid "ClusterAgents|Are you sure you want to delete this agent? You cannot undo this."
msgstr "Sunteți sigur că doriți să ștergeți acest agent? Acest lucru nu poate fi anulat."
+msgid "ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action."
+msgstr ""
+
msgid "ClusterAgents|Certificate"
msgstr "Certificat"
@@ -8045,25 +8153,19 @@ msgid "ClusterAgents|Configuration"
msgstr "Configurație"
msgid "ClusterAgents|Connect a Kubernetes cluster"
-msgstr ""
+msgstr "Conectați un cluster Kubernetes"
msgid "ClusterAgents|Connect a cluster"
-msgstr ""
+msgstr "Conectați un cluster"
msgid "ClusterAgents|Connect a cluster (agent)"
-msgstr ""
+msgstr "Conectați un cluster (agent)"
msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "Conectați un cluster (certificat - depreciat)"
msgid "ClusterAgents|Connect a cluster (deprecated)"
-msgstr ""
-
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Conectați clusterul existent"
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr "Conectați-vă cu agentul GitLab"
+msgstr "Conectați un cluster (depreciat)"
msgid "ClusterAgents|Connected"
msgstr "Conectat"
@@ -8078,13 +8180,13 @@ msgid "ClusterAgents|Copy token"
msgstr "Copiați tokenul"
msgid "ClusterAgents|Create a cluster"
-msgstr ""
+msgstr "Creați un cluster"
msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "Creați un cluster (certificat - depreciat)"
msgid "ClusterAgents|Create a cluster (deprecated)"
-msgstr ""
+msgstr "Creați un cluster (depreciat)"
msgid "ClusterAgents|Create agent access token"
msgstr "Creați tokenul de acces al agentului"
@@ -8126,16 +8228,16 @@ msgid "ClusterAgents|Failed to create a token"
msgstr "Nu s-a reușit crearea unui token"
msgid "ClusterAgents|Failed to register an agent"
-msgstr "Înregistrarea unui agent nu a reușit"
+msgstr "Nu s-a reușit înregistrarea unui agent"
-msgid "ClusterAgents|From a terminal, connect to your cluster and run this command. The token is included."
+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 "Agentul GitLab"
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr "Agentul GitLab pentru Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr "Oferiți feedback"
@@ -8146,11 +8248,11 @@ msgstr "Cum se înregistrează un agent?"
msgid "ClusterAgents|How to update an agent?"
msgstr "Cum să actualizez un agent?"
-msgid "ClusterAgents|Install a new agent"
-msgstr "Instalați un agent nou"
+msgid "ClusterAgents|Install using Helm (recommended)"
+msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
-msgstr "Ultima conectare acum %{timeAgo}."
+msgstr "Ultima conectare %{timeAgo}."
msgid "ClusterAgents|Last contact"
msgstr "Ultimul contact"
@@ -8170,6 +8272,12 @@ msgstr "Niciodată"
msgid "ClusterAgents|Never connected"
msgstr "Niciodată conectat"
+msgid "ClusterAgents|No activity occurred in the past day"
+msgid_plural "ClusterAgents|No activity occurred in the past %d days"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "ClusterAgents|No agents"
msgstr "Fără agenți"
@@ -8182,9 +8290,6 @@ msgstr "Neconectat"
msgid "ClusterAgents|Recommended"
msgstr "Recomandat"
-msgid "ClusterAgents|Recommended installation method"
-msgstr "Metoda de instalare recomandată"
-
msgid "ClusterAgents|Register"
msgstr "ÃŽnregistrare"
@@ -8194,20 +8299,23 @@ msgstr "ÃŽnregistrarea agentului"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "Necesită un rol de Întreținător sau mai mare pentru a șterge agenți"
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr "Necesită un rol de Întreținător sau mai mare pentru a instala noi agenți"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr "Necesită un rol de Întreținător sau mai mare pentru a efectua aceste acțiuni"
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-msgstr "Necesită un rol de Întreținător sau un rol mai mare pentru a conecta clusterele existente"
+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 "Securitate"
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
-msgstr "Consultați actualizările activității agentului, cum ar fi tokenurile create sau revocate și clusterele conectate sau neconectate."
+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 "Selectați un agent sau introduceți un nume pentru a crea un agent nou"
@@ -8215,23 +8323,17 @@ msgstr "Selectați un agent sau introduceți un nume pentru a crea un agent nou"
msgid "ClusterAgents|Tell us what you think"
msgstr "Spuneți-ne ce părere aveți"
-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 "Agentul GitLab oferă un nivel ridicat de securitate la conectarea clusterelor Kubernetes la GitLab. %{linkStart}Aflați mai multe despre agentul GitLab.%{linkEnd}"
+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 "Agentul nu a mai fost conectat de mult timp. Poate exista o problemă de conectivitate. Ultimul contact a fost acum %{timeAgo}."
+msgstr "Agentul nu a mai fost conectat de mult timp. Poate exista o problemă de conectivitate. Ultimul contact a fost %{timeAgo}."
msgid "ClusterAgents|The agent uses the token to connect with GitLab."
-msgstr ""
+msgstr "Agentul folosește tokenul pentru a se conecta la GitLab."
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 "Versiunea agentului nu se potrivește între toate podurile clusterului dumneavoastră. Aceasta se poate întâmpla atunci când tocmai a fost implementată o nouă versiune de agent și Kubernetes închide podurile vechi."
-
-msgid "ClusterAgents|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] "Nu există nicio activitate din ultima zi"
-msgstr[1] "Nu există nicio activitate din ultimele %d zile."
-msgstr[2] "Nu există nicio activitate din ultimele %d de zile."
+msgstr "Versiunea agentului nu se potrivește între toate pod-urile clusterului dumneavoastră. Aceasta se poate întâmpla atunci când tocmai a fost implementată o nouă versiune de agent și Kubernetes închide pod-urile vechi."
msgid "ClusterAgents|This agent has no tokens"
msgstr "Acest agent nu are tokenuri"
@@ -8239,6 +8341,9 @@ msgstr "Acest agent nu are tokenuri"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Pentru a șterge agentul, tastați %{name} pentru a confirma:"
+msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
+msgstr ""
+
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Token creat de %{userName}"
@@ -8257,8 +8362,8 @@ msgstr "Vedeți toate cele %{number} (de) clustere"
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr "Ne-ar plăcea să aflăm mai multe despre experiența d-voastră cu agentul GitLab."
-msgid "ClusterAgents|What is GitLab Agent activity?"
-msgstr "Ce este activitatea agentului GitLab?"
+msgid "ClusterAgents|What is agent activity?"
+msgstr ""
msgid "ClusterAgents|What is default configuration?"
msgstr "Ce este configurația implicită?"
@@ -8267,7 +8372,7 @@ msgid "ClusterAgents|You cannot see this token again after you close this window
msgstr "Nu veți mai putea vedea acest token după ce închideți această fereastră."
msgid "ClusterAgents|You will need to create a token to connect to your agent"
-msgstr "Va trebui să creați un token pentru a vă conecta la agent"
+msgstr "Va trebui să creați un token pentru a vă conecta la agentul dumneavoastră"
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 "Versiunea agentului dvs. nu este sincronizată cu versiunea GitLab (v%{version}), ceea ce ar putea cauza probleme de compatibilitate. Actualizați agentul instalat pe clusterul dvs. la cea mai recentă versiune."
@@ -8291,16 +8396,16 @@ msgid "ClusterIntegration|%{linkStart}More information%{linkEnd}"
msgstr "%{linkStart}Mai multe informații%{linkEnd}"
msgid "ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges."
-msgstr "Un proiect de gestionare a clusterului poate fi utilizat pentru a rula joburi de implementare cu privilegii Kubernetes %{code_open}cluster-admin%{code_close}."
+msgstr "Un proiect de gestionare a clusterului poate fi utilizat pentru a rula joburi cu privilegii %{code_open}cluster-admin%{code_close} Kubernetes."
msgid "ClusterIntegration|A service token scoped to %{code}kube-system%{end_code} with %{code}cluster-admin%{end_code} privileges."
msgstr "Un token de serviciu atribuit la %{code}kube-system%{end_code} cu privilegii %{code}cluster-admin%{end_code}."
msgid "ClusterIntegration|API URL"
-msgstr "URL-ul API-ului"
+msgstr "URL-ul API"
msgid "ClusterIntegration|API URL should be a valid http/https url."
-msgstr "URL-ul API-ului trebuie să fie un URL HTTP/HTTPS valid."
+msgstr "URL-ul API trebuie să fie un URL http/https valid."
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Adăugați clusterul Kubernetes"
@@ -8354,7 +8459,7 @@ msgid "ClusterIntegration|Any project namespaces"
msgstr "Oricare spațiu de nume de proiect"
msgid "ClusterIntegration|Apply for credit"
-msgstr "Solicitați credit"
+msgstr "Aplicați pentru credit"
msgid "ClusterIntegration|Authenticate with AWS"
msgstr "Autentificați-vă cu AWS"
@@ -8416,9 +8521,6 @@ msgstr "Clusterele sunt utilizate prin selectarea celui mai apropiat ancestru cu
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr "Conectați un cluster Kubernetes"
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr "Conectați-vă cu un certificat"
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr "Conectați-vă clusterul la GitLab prin intermediul %{linkStart}certificatelor de cluster%{linkEnd}."
@@ -8438,7 +8540,7 @@ msgid "ClusterIntegration|Could not load IAM roles"
msgstr "Nu s-au putut încărca rolurile IAM"
msgid "ClusterIntegration|Could not load Key Pairs"
-msgstr "Nu s-au putut încărca perechile de chei"
+msgstr "Nu s-au putut încărca perechile cheie"
msgid "ClusterIntegration|Could not load VPCs for the selected region"
msgstr "Nu s-au putut încărca VPC-uri pentru regiunea selectată"
@@ -8462,7 +8564,7 @@ msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Creați clusterul Kubernetes"
msgid "ClusterIntegration|Create a Kubernetes cluster"
-msgstr ""
+msgstr "Creați un cluster Kubernetes"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "Crearea clusterului Kubernetes"
@@ -8597,7 +8699,7 @@ msgid "ClusterIntegration|Integrations allow you to use applications installed i
msgstr "Integrările vă permit să utilizați aplicațiile instalate în clusterul dvs. ca parte a fluxului de lucru GitLab."
msgid "ClusterIntegration|Key pair name"
-msgstr "Numele perechii de chei"
+msgstr "Numele perechii cheie"
msgid "ClusterIntegration|Kubernetes cluster is being created..."
msgstr "Se creează clusterul Kubernetes..."
@@ -8633,7 +8735,7 @@ msgid "ClusterIntegration|Loading IAM Roles"
msgstr "Încărcarea rolurilor IAM"
msgid "ClusterIntegration|Loading Key Pairs"
-msgstr "Încărcarea perechilor de chei"
+msgstr "Încărcarea perechilor cheie"
msgid "ClusterIntegration|Loading VPCs"
msgstr "Încărcarea VPC-urilor"
@@ -8672,7 +8774,7 @@ msgid "ClusterIntegration|No IAM Roles found"
msgstr "Nu s-au găsit roluri IAM"
msgid "ClusterIntegration|No Key Pairs found"
-msgstr "Nu s-au găsit perechi de chei"
+msgstr "Nu s-au găsit perechi cheie"
msgid "ClusterIntegration|No VPCs found"
msgstr "Nu s-au găsit VPC-uri"
@@ -8699,13 +8801,13 @@ msgid "ClusterIntegration|No subnet found"
msgstr "Nu a fost găsită nicio subrețea"
msgid "ClusterIntegration|No subnetworks found"
-msgstr "Nu s-au găsit subrețele"
+msgstr "Nu au fost găsite subrețele"
msgid "ClusterIntegration|No zones matched your search"
-msgstr "Nu s-au găsit zone care să corespundă căutării dvs."
+msgstr "Nu s-au găsit zone care se potrivesc cu căutarea dvs."
msgid "ClusterIntegration|Node calculations use the Kubernetes Metrics API. Make sure your cluster has metrics installed"
-msgstr "Calculele de noduri utilizează API-ul Kubernetes Metrics. Asigurați-vă că în clusterul dvs. sunt instalate metrici"
+msgstr "Calculele nodurilor utilizează API-ul Kubernetes Metrics. Asigurați-vă că aveți instalate metrici în clusterul dumneavoastră"
msgid "ClusterIntegration|Number of nodes"
msgstr "Numărul de noduri"
@@ -8822,7 +8924,7 @@ msgid "ClusterIntegration|Select a network to choose a subnetwork"
msgstr "Selectați o rețea pentru a alege o subrețea"
msgid "ClusterIntegration|Select a region to choose a Key Pair"
-msgstr "Selectați o regiune pentru a alege o pereche de chei"
+msgstr "Selectați o regiune pentru a alege o pereche cheie"
msgid "ClusterIntegration|Select a region to choose a VPC"
msgstr "Selectați o regiune pentru a alege un VPC"
@@ -8843,7 +8945,7 @@ msgid "ClusterIntegration|Select an instance type"
msgstr "Selectați un tip de instanță"
msgid "ClusterIntegration|Select key pair"
-msgstr "Selectați o cheie pereche"
+msgstr "Selectați o pereche cheie"
msgid "ClusterIntegration|Select machine type"
msgstr "Selectați tipul mașinii"
@@ -8861,7 +8963,7 @@ msgid "ClusterIntegration|Select service role"
msgstr "Selectați rolul serviciului"
msgid "ClusterIntegration|Select the key pair name that will be used to create EC2 nodes. To use a new key pair name, first create one on %{linkStart}Amazon Web Services%{linkEnd}."
-msgstr "Selectați numele perechii de chei care va fi utilizată pentru a crea noduri EC2. Pentru a utiliza un nou nume de pereche de chei, creați mai întâi unul pe %{linkStart}Amazon Web Services%{linkEnd}."
+msgstr "Selectați numele perechii cheie care va fi utilizată pentru a crea noduri EC2. Pentru a utiliza un nou nume de pereche cheie, creați mai întâi unul pe %{linkStart}Amazon Web Services%{linkEnd}."
msgid "ClusterIntegration|Select the region you want to create the new cluster in. Make sure you have access to this region for your role to be able to authenticate. If no region is selected, we will use %{codeStart}DEFAULT_REGION%{codeEnd}. Learn more about %{linkStart}Regions%{linkEnd}."
msgstr "Selectați regiunea în care doriți să creați noul cluster. Asigurați-vă că aveți acces la această regiune pentru ca rolul dvs. să se poată autentifica. Dacă nu este selectată nicio regiune, vom utiliza %{codeStart}DEFAULT_REGION%{codeEnd}. Aflați mai multe despre %{linkStart}Regiuni%{linkEnd}."
@@ -8882,7 +8984,7 @@ msgid "ClusterIntegration|Service token is required."
msgstr "Tokenul de serviciu este necesar."
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 "Setați un prefix pentru spațiile dvs. de nume. Dacă nu este setat, se va folosi implicit calea proiectului. Dacă este modificat, mediile existente vor utiliza spațiile lor de nume curente până când cache-ul clusterului este șters."
+msgstr "Setați un prefix pentru spațiile de nume. Dacă nu este setat, se va folosi implicit calea proiectului. Dacă este modificat, mediile existente vor utiliza spațiile de nume curente până când se șterge cache-ul clusterului."
msgid "ClusterIntegration|Something went wrong on our end."
msgstr "Ceva nu a mers bine la noi."
@@ -8903,7 +9005,7 @@ msgid "ClusterIntegration|The Kubernetes certificate used to authenticate to the
msgstr "Certificatul Kubernetes folosit pentru autentificarea în cluster."
msgid "ClusterIntegration|The URL used to access the Kubernetes API."
-msgstr "Adresa URL folosită pentru accesarea API-ului Kubernetes."
+msgstr "URL-ul utilizat pentru a accesa API-ul Kubernetes."
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."
@@ -8932,6 +9034,9 @@ msgstr "Acest lucru este necesar pentru a șterge asociațiile existente între
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Această opțiune vă va permite să instalați aplicații în clustere RBAC."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr "Acest proiect nu are activată facturarea. Pentru a crea un cluster, %{linkToBillingStart}activați facturarea%{linkToBillingEnd} și încercați din nou."
@@ -8965,8 +9070,8 @@ msgstr "Eroare necunoscută"
msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
msgstr "Folosiți GitLab pentru a implementa în clusterul dvs., pentru a executa joburi, pentru a utiliza aplicații de revizuire și multe altele."
-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 "Utilizați %{linkStart}agentul GitLab%{linkEnd} pentru a vă conecta în siguranță clusterele Kubernetes la GitLab. Vă puteți implementa aplicațiile, rula pipeline-urile, utiliza Aplicații de revizuire și multe altele."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "Folosește suplimentele Cloud Run, Istio și HTTP Load Balancing pentru acest cluster."
@@ -9029,13 +9134,13 @@ msgid "Code"
msgstr ""
msgid "Code Coverage: %{coveragePercentage}%{percentSymbol}"
-msgstr ""
+msgstr "Coverage de cod: %{coveragePercentage}%{percentSymbol}"
msgid "Code Coverage| Empty code coverage data"
-msgstr ""
+msgstr "Nu există date de coverage a codului"
msgid "Code Coverage|Couldn't fetch the code coverage data"
-msgstr "Nu s-au putut prelua datele de acoperire a codului"
+msgstr "Nu s-au putut prelua datele de coverage a codului"
msgid "Code Owner"
msgstr "Proprietarul codului"
@@ -9044,7 +9149,7 @@ msgid "Code Owners"
msgstr "Proprietarii codului"
msgid "Code Quality"
-msgstr ""
+msgstr "Code Quality"
msgid "Code Review"
msgstr ""
@@ -9053,7 +9158,7 @@ msgid "Code Review Analytics displays a table of open merge requests considered
msgstr ""
msgid "Code coverage statistics for %{ref} %{start_date} - %{end_date}"
-msgstr "Statistici de acoperire a codului pentru %{ref} %{start_date} - %{end_date}"
+msgstr "Statisticile de coverage a codului pentru %{ref} %{start_date} - %{end_date}"
msgid "Code owner approval is required"
msgstr "Este necesară aprobarea proprietarului codului"
@@ -9080,7 +9185,7 @@ msgid "CodeOwner|Pattern"
msgstr "Model"
msgid "CodeQuality|New code quality degradations on this line"
-msgstr ""
+msgstr "Noi degradări ale calității codului pe această linie"
msgid "Cohorts|Inactive users"
msgstr "Utilizatori inactivi"
@@ -9139,9 +9244,6 @@ msgstr "ComboSearch nu este definită"
msgid "Comma-separated list of email addresses."
msgstr "Lista adreselor de e-mail separate prin virgulă."
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "Separate prin virgulă, de exemplu '1.1.1.1, 2.2.0/24'"
-
msgid "Command"
msgstr ""
@@ -9203,7 +9305,7 @@ msgid "Commit Message"
msgstr "Mesajul commit-ului"
msgid "Commit SHA"
-msgstr ""
+msgstr "SHA de commit"
msgid "Commit changes"
msgstr ""
@@ -9239,13 +9341,13 @@ msgid "Commits feed"
msgstr ""
msgid "Commits per day hour (UTC)"
-msgstr ""
+msgstr "Commit-uri pe oră din zi (UTC)"
msgid "Commits per day of month"
-msgstr ""
+msgstr "Commit-uri pe zi din lună"
msgid "Commits per weekday"
-msgstr ""
+msgstr "Commit-uri pe zi lucrătoare"
msgid "Commits to"
msgstr "Commit-uri la"
@@ -9263,10 +9365,7 @@ msgid "Commits|No related merge requests found"
msgstr "Nu au fost găsite merge request-uri asociate"
msgid "Committed by"
-msgstr "Commit de"
-
-msgid "Commit…"
-msgstr ""
+msgstr "Commit făcut de"
msgid "Community forum"
msgstr "Forumul comunității"
@@ -9275,7 +9374,7 @@ msgid "Company"
msgstr "Companie"
msgid "Company Name"
-msgstr ""
+msgstr "Numele companiei"
msgid "Compare"
msgstr ""
@@ -9308,10 +9407,10 @@ msgid "Compare with previous version"
msgstr ""
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
-msgstr ""
+msgstr "%{source_branch} și %{target_branch} sunt aceleași."
msgid "CompareBranches|There isn't anything to compare."
-msgstr ""
+msgstr "Nu este nimic de comparat."
msgid "CompareRevisions|Branches"
msgstr ""
@@ -9356,22 +9455,19 @@ msgid "Complete"
msgstr "Complet"
msgid "Complete verification to sign in."
-msgstr ""
+msgstr "Completați verificarea pentru a vă autentifica."
msgid "Completed"
msgstr ""
msgid "Completed in %{duration_seconds} seconds (%{relative_time})"
-msgstr ""
+msgstr "S-a completat în %{duration_seconds} (de) secunde (%{relative_time})"
msgid "Compliance framework"
msgstr ""
msgid "Compliance report"
-msgstr ""
-
-msgid "ComplianceDashboard|created by:"
-msgstr "creat de:"
+msgstr "Raport de conformitate"
msgid "ComplianceFrameworks|Add framework"
msgstr "Adăugați un framework"
@@ -9413,7 +9509,7 @@ msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please re
msgstr "Eroare la preluarea datelor framework-urilor de conformitate. Vă rugăm să reîmprospătați pagina"
msgid "ComplianceFrameworks|Error fetching compliance frameworks data. Please refresh the page or try a different framework"
-msgstr "Eroare la preluarea datelor framework-urilor de conformitate. Vă rugăm împrospătați pagina sau încercați un alt framework"
+msgstr "Eroare la preluarea datelor framework-urilor de conformitate. Vă rugăm să reîmprospătați pagina sau încercați un alt framework"
msgid "ComplianceFrameworks|Frameworks that have been added will appear here."
msgstr "Framework-urile care au fost adăugate vor apărea aici."
@@ -9458,16 +9554,16 @@ msgid "ComplianceFramework|No compliance frameworks are set up yet"
msgstr "Nu au fost setate încă framework-uri de conformitate"
msgid "ComplianceReport|Approved by author"
-msgstr ""
+msgstr "Aprobat de autor"
msgid "ComplianceReport|Approved by committer"
-msgstr ""
+msgstr "Aprobat de comitent"
msgid "ComplianceReport|Less than 2 approvers"
-msgstr ""
+msgstr "Mai puțin de 2 aprobatori"
msgid "ComplianceReport|No violations found"
-msgstr ""
+msgstr "Nu s-au constatat încălcări"
msgid "Component"
msgstr "Component"
@@ -9503,7 +9599,7 @@ msgid "Configure %{repository_checks_link_start}repository checks%{link_end} and
msgstr "Configurați %{repository_checks_link_start}controalele de repozitoriu%{link_end} și %{housekeeping_link_start}curățenia%{link_end} în repozitorii."
msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
-msgstr ""
+msgstr "Configurați CAPTCHAs, limite de adrese IP și alte măsuri anti-spam."
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 "Configurați Scanarea containerelor în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings) pentru a personaliza setările de scanare a containerelor."
@@ -9536,7 +9632,7 @@ msgid "Configure SAST IaC in `.gitlab-ci.yml` using the GitLab managed template.
msgstr "Configurați SAST IaC în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST IaC."
msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
-msgstr ""
+msgstr "ConfiguraÈ›i SAST IaC în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja."
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 "Configurați SAST în „.gitlab-ci.yml†utilizând șablonul gestionat de GitLab. Puteți [adăuga suprascrieri de variabile](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings) pentru a personaliza setările SAST."
@@ -9551,7 +9647,7 @@ msgid "Configure Secret Detection in `.gitlab-ci.yml`, creating this file if it
msgstr "ConfiguraÈ›i Detectarea secretelor în „.gitlab-ci.ymlâ€, creând acest fiÈ™ier dacă nu există deja."
msgid "Configure Sentry integration for error tracking"
-msgstr ""
+msgstr "Configurați integrarea Sentry pentru urmărirea erorilor"
msgid "Configure Tracing"
msgstr ""
@@ -9560,13 +9656,13 @@ msgid "Configure a %{codeStart}.gitlab-webide.yml%{codeEnd} file in the %{codeSt
msgstr ""
msgid "Configure advanced permissions, Large File Storage, two-factor authentication, and customer relations settings."
-msgstr ""
+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 ""
msgid "Configure pipeline"
-msgstr ""
+msgstr "Configurați pipeline-ul"
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
msgstr ""
@@ -9590,13 +9686,13 @@ 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 ""
+msgstr "Configurați limite specifice pentru solicitările API pentru fișiere, care înlocuiesc limitele generale ale ratei de utilizator și IP."
msgid "Configure specific limits for Git LFS requests that supersede the general user and IP rate limits."
msgstr "Configurați limite specifice pentru cereri Git LFS care înlocuiesc limitele generale ale utilizatorului și ale ratei IP."
msgid "Configure specific limits for deprecated API requests that supersede the general user and IP rate limits."
-msgstr ""
+msgstr "Configurați limite specifice pentru solicitările API depreciate care înlocuiesc limitele generale ale ratei de utilizator și IP."
msgid "Configure the %{link} integration."
msgstr ""
@@ -9608,7 +9704,7 @@ msgid "Configure the way a user creates a new account."
msgstr "Configurați modul în care un utilizator creează un cont nou."
msgid "Configure via Merge Request"
-msgstr ""
+msgstr "Configurare prin merge request"
msgid "Configure which lists are shown for anyone who visits this board"
msgstr "Configurați ce liste sunt afișate pentru oricine vizitează acest bord"
@@ -9623,7 +9719,7 @@ msgid "Confirm"
msgstr ""
msgid "Confirm approval"
-msgstr ""
+msgstr "Confirmați aprobarea"
msgid "Confirm destroy application"
msgstr "Confirmați distrugerea aplicației"
@@ -9733,9 +9829,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9743,7 +9836,7 @@ msgid "Contact support"
msgstr ""
msgid "Contacts"
-msgstr ""
+msgstr "Contacte"
msgid "Container Registry"
msgstr ""
@@ -9766,9 +9859,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9884,7 +9974,7 @@ msgid "ContainerRegistry|Enable expiration policy"
msgstr "Activați politica de expirare"
msgid "ContainerRegistry|Expiration policy is disabled."
-msgstr ""
+msgstr "Politica de expirare este dezactivată."
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "Politica de expirare va rula în %{time}"
@@ -9898,6 +9988,9 @@ msgstr "Ștergerea repozitoriului de imagini a eșuat"
msgid "ContainerRegistry|Image repository not found"
msgstr "Repozitoriul de imagini nu a fost găsit"
+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 "Repozitoriul de imagini va fi șters"
@@ -9944,7 +10037,7 @@ msgid "ContainerRegistry|Please try different search criteria"
msgstr "Vă rugăm să încercați alte criterii de căutare"
msgid "ContainerRegistry|Published %{timeInfo}"
-msgstr " Publicat %{timeInfo}"
+msgstr "Publicat %{timeInfo}"
msgid "ContainerRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
msgstr "Publicat în repozitoriul de imagini %{repositoryPath} la %{time} pe %{date}"
@@ -9980,7 +10073,7 @@ msgid "ContainerRegistry|Run cleanup:"
msgstr "Executați curățarea:"
msgid "ContainerRegistry|Set up cleanup"
-msgstr ""
+msgstr "Configurați curățarea"
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "Unele etichete nu au fost șterse"
@@ -10022,7 +10115,7 @@ msgid "ContainerRegistry|Tags successfully marked for deletion."
msgstr "Etichete marcate cu succes pentru ștergere."
msgid "ContainerRegistry|Tags temporarily cannot be marked for deletion. Please try again in a few minutes. %{docLinkStart}More details%{docLinkEnd}."
-msgstr "În mod temporar, etichetele nu pot fi marcate pentru ștergere. Vă rugăm să încercați din nou în câteva minute. %{docLinkStart}Mai multe detalii%{docLinkEnd}."
+msgstr "Temporar, etichetele nu pot fi marcate pentru ștergere. Vă rugăm să încercați din nou în câteva minute. %{docLinkStart}Mai multe detalii%{docLinkEnd}."
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 "Etichetele care corespund acestor reguli sunt %{strongStart}păstrate%{strongEnd}, chiar dacă se potrivesc unei reguli de eliminare de mai jos. %{secondStrongStart}Cea mai recentă%{secondStrongEnd} etichetă este întotdeauna păstrată."
@@ -10090,9 +10183,6 @@ msgstr "Cu ajutorul Registrului de container, fiecare proiect poate avea propriu
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 "Cu ajutorul Registrului de container, fiecare proiect poate avea propriul spațiu pentru a-și stoca imaginile Docker. Faceți push la cel puțin o imagine Docker în unul dintre proiectele acestui grup pentru a apărea aici. %{docLinkStart}Mai multe informații%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "Cu Registrul de container GitLab, fiecare proiect poate avea propriul său spațiu pentru a stoca imagini. %{docLinkStart}Mai multe informații%{docLinkEnd}"
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "Sunteți pe cale să înlăturați etichetele %{item}. Sunteți sigur?"
@@ -10109,7 +10199,7 @@ msgid "Content parsed with %{link}."
msgstr ""
msgid "ContentEditor|Table of Contents"
-msgstr ""
+msgstr "Cuprins"
msgid "ContentEditor|You have to provide a renderMarkdown function or a custom serializer"
msgstr ""
@@ -10129,6 +10219,9 @@ msgstr "Nu s-au putut șterge commit-urile de context. Vă rugăm să încercaț
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Treceți la etapa următoare"
@@ -10199,7 +10292,7 @@ msgid "Control how the GitLab Package Registry functions."
msgstr "Controlați modul în care funcționează Registrul Pachetului GitLab."
msgid "Control whether to display customer experience improvement content and third-party offers in GitLab."
-msgstr ""
+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."
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 "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."
@@ -10237,9 +10330,6 @@ msgstr "Copiați ID-ul extern în clipboard"
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10255,6 +10345,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10274,7 +10367,7 @@ msgid "Copy evidence SHA"
msgstr ""
msgid "Copy failed. Please manually copy the value."
-msgstr ""
+msgstr "Copierea nu a reușit. Vă rugăm să copiați manual valoarea."
msgid "Copy file contents"
msgstr ""
@@ -10297,9 +10390,12 @@ msgstr ""
msgid "Copy link"
msgstr ""
-msgid "Copy link to chart"
+msgid "Copy link URL"
msgstr ""
+msgid "Copy link to chart"
+msgstr "Copiați linkul către grafic"
+
msgid "Copy reference"
msgstr ""
@@ -10328,70 +10424,70 @@ msgid "Copy value"
msgstr ""
msgid "Corpus Management"
-msgstr ""
+msgstr "Managementul corpusului"
msgid "Corpus Management|Are you sure you want to delete the corpus?"
msgstr "Sunteți sigur că doriți să ștergeți corpusul?"
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 ""
+msgstr "Un corpus este utilizat de testarea fuzz pentru a crește gradul de coverage. Fișierele corpus pot fi create manual sau generate automat. %{linkStart}Aflați mai multe%{linkEnd}"
msgid "CorpusManagement|Actions"
-msgstr ""
+msgstr "Acțiuni"
msgid "CorpusManagement|Corpus file"
-msgstr ""
+msgstr "Fișier corpus"
msgid "CorpusManagement|Corpus files are used in coverage-guided fuzz testing as seed inputs to improve testing."
-msgstr ""
+msgstr "Fișierele corpus sunt utilizate în testarea fuzz ghidată prin coverage ca intrări seed pentru a îmbunătăți testarea."
msgid "CorpusManagement|Corpus files must be in *.zip format. Maximum 5 GB"
-msgstr ""
+msgstr "Fișierele corpus trebuie să fie în format *.zip. Maxim 5 GB"
msgid "CorpusManagement|Corpus name"
-msgstr ""
+msgstr "Nume de corpus"
msgid "CorpusManagement|Currently, there are no uploaded or generated corpuses."
-msgstr ""
+msgstr "În prezent, nu există niciun corpus încărcat sau generat."
msgid "CorpusManagement|File too large, Maximum 5 GB"
-msgstr ""
+msgstr "Fișier prea mare, Maximum 5 GB"
msgid "CorpusManagement|Filename can contain only lowercase letters (a-z), uppercase letter (A-Z), numbers (0-9), dots (.), hyphens (-), or underscores (_)."
-msgstr ""
+msgstr "Numele fișierului poate conține numai litere minuscule (a-z), litere majuscule (A-Z), numere (0-9), puncte (.), liniuțe (-) sau caractere de subliniere (_)."
msgid "CorpusManagement|Fuzz testing corpus management"
-msgstr ""
+msgstr "Managementul fișierelor corpus pentru testarea Fuzz"
msgid "CorpusManagement|Last updated"
-msgstr ""
+msgstr "Ultima actualizare"
msgid "CorpusManagement|Last used"
-msgstr ""
+msgstr "Ultima utilizare"
msgid "CorpusManagement|Latest Job:"
-msgstr ""
+msgstr "Ultimul job:"
msgid "CorpusManagement|Manage your fuzz testing corpus files"
-msgstr ""
+msgstr "Gestionați fișierele corpus de testare fuzz"
msgid "CorpusManagement|New corpus"
-msgstr ""
+msgstr "Corpus nou"
msgid "CorpusManagement|New upload"
-msgstr ""
+msgstr "Încărcare nouă"
msgid "CorpusManagement|Not Set"
-msgstr ""
+msgstr "Nu este setat"
msgid "CorpusManagement|Target"
-msgstr ""
+msgstr "Țintă"
msgid "CorpusManagement|To use this corpus, edit the corresponding YAML file"
msgstr "Pentru a utiliza acest corpus, editați fișierul YAML corespunzător"
msgid "CorpusManagement|Total Size: %{totalSize}"
-msgstr ""
+msgstr "Dimensiune totală: %{totalSize}"
msgid "Could not add admins as members"
msgstr ""
@@ -10406,16 +10502,16 @@ msgid "Could not authorize chat nickname. Try again!"
msgstr ""
msgid "Could not change HEAD: branch '%{branch}' does not exist"
-msgstr ""
+msgstr "Nu s-a putut modifica HEAD: ramura „%{branch}†nu există"
msgid "Could not commit. An unexpected error occurred."
msgstr ""
msgid "Could not connect to FogBugz, check your URL"
-msgstr ""
+msgstr "Nu s-a putut conecta la FogBugz, verificați adresa URL"
msgid "Could not connect to Sentry. Refresh the page to try again."
-msgstr ""
+msgstr "Conectarea la Sentry nu a reușit. Reîmprospătați pagina pentru a încerca din nou."
msgid "Could not connect to Web IDE file mirror service."
msgstr ""
@@ -10451,7 +10547,7 @@ msgid "Could not fetch policy because existing policy YAML is invalid"
msgstr "Nu s-a putut prelua politica, deoarece politica existentă YAML este invalidă"
msgid "Could not fetch training providers. Please refresh the page, or try again later."
-msgstr ""
+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."
msgid "Could not find design."
msgstr ""
@@ -10463,10 +10559,10 @@ msgid "Could not get the data properly"
msgstr ""
msgid "Could not load the user chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Nu se poate încărca graficul utilizatorului. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "Could not load usage counts. Please refresh the page to try again."
-msgstr ""
+msgstr "Nu se poate încărca numărul de utilizări. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "Could not remove %{user} from %{group}. Cannot remove last group owner."
msgstr "Nu s-a putut înlătura %{user} din %{group}. Nu se poate elimina ultimul proprietar de grup."
@@ -10481,7 +10577,7 @@ msgid "Could not restore the group"
msgstr ""
msgid "Could not revoke access token %{access_token_name}."
-msgstr ""
+msgstr "Nu s-a putut revoca tokenul de acces %{access_token_name}."
msgid "Could not revoke impersonation token %{token_name}."
msgstr ""
@@ -10490,7 +10586,7 @@ 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 ""
+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 ""
@@ -10511,16 +10607,16 @@ msgid "Could not upload your designs as one or more files uploaded are not suppo
msgstr ""
msgid "Couldn't assign policy to project or group"
-msgstr ""
+msgstr "Nu s-a putut atribui politica unui proiect sau grup"
msgid "Country"
-msgstr ""
+msgstr "Å¢ara"
msgid "Coverage"
-msgstr ""
+msgstr "Coverage"
msgid "Coverage Fuzzing"
-msgstr ""
+msgstr "Fuzzing prin coverage"
msgid "Create"
msgstr ""
@@ -10535,10 +10631,10 @@ msgid "Create %{type}"
msgstr ""
msgid "Create %{workspace} label"
-msgstr ""
+msgstr "Creați eticheta %{workspace}"
msgid "Create Google Cloud project"
-msgstr ""
+msgstr "Creați proiectul Google Cloud"
msgid "Create New Directory"
msgstr ""
@@ -10577,7 +10673,7 @@ msgid "Create a new issue"
msgstr ""
msgid "Create a new project"
-msgstr ""
+msgstr "Creați un nou proiect"
msgid "Create a new repository"
msgstr ""
@@ -10595,7 +10691,7 @@ 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 ""
+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 ""
@@ -10603,9 +10699,12 @@ msgstr ""
msgid "Create commit"
msgstr ""
-msgid "Create common files more quickly, and standardize their format."
+msgid "Create commit..."
msgstr ""
+msgid "Create common files more quickly, and standardize their format."
+msgstr "Creați mai rapid fișiere comune și standardizați formatul acestora."
+
msgid "Create confidential merge request"
msgstr ""
@@ -10646,7 +10745,7 @@ msgid "Create iteration"
msgstr ""
msgid "Create label"
-msgstr ""
+msgstr "Creați o etichetă"
msgid "Create list"
msgstr ""
@@ -10694,10 +10793,10 @@ msgid "Create new project"
msgstr ""
msgid "Create one"
-msgstr ""
+msgstr "Creați unul"
msgid "Create or import your first project"
-msgstr ""
+msgstr "Creați sau importați primul dvs. proiect"
msgid "Create project"
msgstr ""
@@ -10712,7 +10811,7 @@ msgid "Create requirement"
msgstr ""
msgid "Create service account"
-msgstr ""
+msgstr "Creați un cont de servicii"
msgid "Create snippet"
msgstr "Creați un fragment de cod"
@@ -10721,7 +10820,7 @@ msgid "Create tag %{tagName}"
msgstr ""
msgid "Create topic"
-msgstr ""
+msgstr "Creați un subiect"
msgid "Create user"
msgstr ""
@@ -10748,136 +10847,136 @@ msgid "CreateTag|Tag"
msgstr "Etichetă"
msgid "CreateValueStreamForm|%{name} (default)"
-msgstr ""
+msgstr "%{name} (implicit)"
msgid "CreateValueStreamForm|'%{name}' Value Stream created"
-msgstr ""
+msgstr "Fluxul de valori „%{name}†a fost creat"
msgid "CreateValueStreamForm|'%{name}' Value Stream saved"
-msgstr ""
+msgstr "Fluxul de valori „%{name}†a fost salvat"
msgid "CreateValueStreamForm|Add another stage"
-msgstr ""
+msgstr "Adăugați o altă etapă"
msgid "CreateValueStreamForm|Add stage"
-msgstr ""
+msgstr "Adăugați etapa"
msgid "CreateValueStreamForm|All default stages are currently visible"
-msgstr ""
+msgstr "Toate etapele implicite sunt vizibile în prezent"
msgid "CreateValueStreamForm|Code stage start"
-msgstr ""
+msgstr "ÃŽnceputul etapei de cod"
msgid "CreateValueStreamForm|Create from default template"
-msgstr ""
+msgstr "Creați dintr-un model implicit"
msgid "CreateValueStreamForm|Create from no template"
-msgstr ""
+msgstr "Creați fără niciun șablon"
msgid "CreateValueStreamForm|Create new Value Stream"
-msgstr ""
+msgstr "Creați un nou Flux de valori"
msgid "CreateValueStreamForm|Create value stream"
-msgstr ""
+msgstr "Creați fluxul de valori"
msgid "CreateValueStreamForm|Default stages"
-msgstr ""
+msgstr "Etape implicite"
msgid "CreateValueStreamForm|Default stages can only be hidden or re-ordered"
-msgstr ""
+msgstr "Etapele implicite pot fi doar ascunse sau reordonate"
msgid "CreateValueStreamForm|Edit value stream"
-msgstr ""
+msgstr "Editați fluxul de valori"
msgid "CreateValueStreamForm|Editing stage"
-msgstr ""
+msgstr "Etapa de editare"
msgid "CreateValueStreamForm|End event"
-msgstr ""
+msgstr "Eveniment final"
msgid "CreateValueStreamForm|End event label"
-msgstr ""
+msgstr "Etichetă de eveniment final"
msgid "CreateValueStreamForm|End event: "
-msgstr ""
+msgstr "Eveniment final: "
msgid "CreateValueStreamForm|Enter stage name"
-msgstr ""
+msgstr "Introduceți numele etapei"
msgid "CreateValueStreamForm|Enter value stream name"
-msgstr ""
+msgstr "Introduceți numele fluxului de valori"
msgid "CreateValueStreamForm|Issue stage end"
-msgstr ""
+msgstr "Sfârșitul etapei problemei"
msgid "CreateValueStreamForm|Maximum length %{maxLength} characters"
-msgstr ""
+msgstr "Lungime maximă %{maxLength} caractere"
msgid "CreateValueStreamForm|Name is required"
-msgstr ""
+msgstr "Numele este obligatoriu"
msgid "CreateValueStreamForm|New stage"
-msgstr ""
+msgstr "Etapă nouă"
msgid "CreateValueStreamForm|Plan stage start"
-msgstr ""
+msgstr "ÃŽnceputul etapei de planificare"
msgid "CreateValueStreamForm|Please select a start event first"
-msgstr ""
+msgstr "Vă rugăm să selectați mai întâi un eveniment de început"
msgid "CreateValueStreamForm|Please select an end event"
-msgstr ""
+msgstr "Vă rugăm să selectați un eveniment final"
msgid "CreateValueStreamForm|Recover hidden stage"
-msgstr ""
+msgstr "Recuperați etapa ascunsă"
msgid "CreateValueStreamForm|Restore defaults"
-msgstr ""
+msgstr "Restaurați valorile implicite"
msgid "CreateValueStreamForm|Restore stage"
-msgstr ""
+msgstr "Restaurați etapa"
msgid "CreateValueStreamForm|Save value stream"
-msgstr ""
+msgstr "Salvați fluxul de valori"
msgid "CreateValueStreamForm|Select end event"
-msgstr ""
+msgstr "Selectați evenimentul final"
msgid "CreateValueStreamForm|Select start event"
-msgstr ""
+msgstr "Selectați evenimentul de start"
msgid "CreateValueStreamForm|Stage %{index}"
-msgstr ""
+msgstr "Etapa %{index}"
msgid "CreateValueStreamForm|Stage name already exists"
-msgstr ""
+msgstr "Numele etapei există deja"
msgid "CreateValueStreamForm|Stage name is required"
-msgstr ""
+msgstr "Este necesar numele etapei"
msgid "CreateValueStreamForm|Start event"
-msgstr ""
+msgstr "Eveniment de start"
msgid "CreateValueStreamForm|Start event changed, please select a valid end event"
-msgstr ""
+msgstr "Evenimentul de start s-a schimbat, vă rugăm să selectați un eveniment final valid"
msgid "CreateValueStreamForm|Start event label"
-msgstr ""
+msgstr "Eticheta evenimentului de start"
msgid "CreateValueStreamForm|Start event: "
-msgstr ""
+msgstr "Eveniment de start: "
msgid "CreateValueStreamForm|Update stage"
-msgstr ""
+msgstr "Etapa de actualizare"
msgid "CreateValueStreamForm|Value Stream name"
-msgstr ""
+msgstr "Numele Fluxului de valori"
msgid "Created"
msgstr ""
msgid "Created %{epicTimeagoDate}"
-msgstr ""
+msgstr "Creată %{epicTimeagoDate}"
msgid "Created %{timestamp}"
msgstr ""
@@ -10889,10 +10988,10 @@ msgid "Created On"
msgstr ""
msgid "Created a branch and a merge request to resolve this issue."
-msgstr ""
+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 ""
+msgstr "S-a creat ramura \"%{branch_name}\" și un merge request pentru a rezolva această problemă."
msgid "Created by %{job}"
msgstr ""
@@ -10904,7 +11003,7 @@ msgid "Created by:"
msgstr ""
msgid "Created compliance violations if any were found"
-msgstr ""
+msgstr "În cazul în care au fost găsite, au fost create încălcări ale conformității"
msgid "Created date"
msgstr ""
@@ -10916,10 +11015,10 @@ msgid "Created issue %{issueLink} at %{projectLink}"
msgstr ""
msgid "Created merge request %{mergeRequestLink}"
-msgstr ""
+msgstr "S-a creat merge request-ul %{mergeRequestLink}"
msgid "Created merge request %{mergeRequestLink} at %{projectLink}"
-msgstr ""
+msgstr "S-a creat merge request-ul %{mergeRequestLink} în %{projectLink}"
msgid "Created on"
msgstr ""
@@ -10973,49 +11072,49 @@ msgid "Credit card required to be on file in order to create a pipeline"
msgstr ""
msgid "Credit card:"
-msgstr ""
+msgstr "Card de credit:"
msgid "Critical vulnerabilities present"
msgstr ""
msgid "Crm|Contact has been added."
-msgstr ""
+msgstr "Contactul a fost adăugat."
msgid "Crm|Contact has been updated."
-msgstr ""
+msgstr "Contactul a fost actualizat."
msgid "Crm|Customer relations contacts"
-msgstr ""
+msgstr "Contactele pentru relațiile cu clienții"
msgid "Crm|Customer relations organizations"
-msgstr ""
+msgstr "Organizațiile pentru relațiile cu clienții"
msgid "Crm|Default rate"
-msgstr ""
+msgstr "Rata implicită"
msgid "Crm|Edit contact"
-msgstr ""
+msgstr "Editare contact"
msgid "Crm|Edit organization"
-msgstr ""
+msgstr "Editare organizație"
msgid "Crm|New contact"
-msgstr ""
+msgstr "Contact nou"
msgid "Crm|New organization"
-msgstr ""
+msgstr "Nouă organizare"
msgid "Crm|No contacts found"
-msgstr ""
+msgstr "Nu au fost găsite contacte"
msgid "Crm|No organizations found"
-msgstr ""
+msgstr "Nu au fost găsite organizații"
msgid "Crm|Organization has been added."
-msgstr ""
+msgstr "Organizația a fost adăugată."
msgid "Crm|Organization has been updated."
-msgstr ""
+msgstr "Organizația a fost actualizată."
msgid "Cron Timezone"
msgstr ""
@@ -11069,7 +11168,7 @@ msgid "Current sign-in at:"
msgstr ""
msgid "Current sign-in ip"
-msgstr ""
+msgstr "IP-ul de conectare curent"
msgid "Current vulnerabilities count"
msgstr ""
@@ -11078,7 +11177,7 @@ msgid "CurrentUser|Buy Pipeline minutes"
msgstr ""
msgid "CurrentUser|Edit profile"
-msgstr ""
+msgstr "Editați profilul"
msgid "CurrentUser|One of your groups is running out"
msgstr ""
@@ -11089,7 +11188,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11117,7 +11219,7 @@ 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 ""
+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."
msgid "Custom range"
msgstr "Interval personalizat"
@@ -11126,16 +11228,16 @@ msgid "Custom range (UTC)"
msgstr ""
msgid "Customer experience improvement and third-party offers"
-msgstr ""
+msgstr "Îmbunătățirea experienței clienților și ofertele terților"
msgid "Customer relations"
-msgstr ""
+msgstr "Relații cu clienții"
msgid "Customer relations contacts"
-msgstr ""
+msgstr "Contactele pentru relațiile cu clienții"
msgid "Customer relations organizations"
-msgstr ""
+msgstr "Organizațiile pentru relațiile cu clienții"
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr ""
@@ -11156,7 +11258,7 @@ msgid "Customize name"
msgstr ""
msgid "Customize your pipeline configuration and coverage report."
-msgstr ""
+msgstr "Personalizați-vă configurația pipeline și raportul de coverage."
msgid "Customize your pipeline configuration."
msgstr ""
@@ -11192,7 +11294,7 @@ msgid "CycleAnalyticsEvent|Issue first associated with a milestone or issue firs
msgstr "Problema a fost asociată pentru prima dată cu un obiectiv sau problema a fost adăugată pentru prima dată la un bord"
msgid "CycleAnalyticsEvent|Issue first mentioned in a commit"
-msgstr "Problema a fost menționată pentru prima dată într-un commit"
+msgstr "Prima problemă menționată într-un commit"
msgid "CycleAnalyticsEvent|Issue label was added"
msgstr "Eticheta problemei a fost adăugată"
@@ -11263,6 +11365,9 @@ msgstr "ar trebui să fie sub un grup"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} selectată(e) (%{maxLabels} maxim)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr "Agregare dezactivată"
@@ -11281,6 +11386,9 @@ msgstr "Creați un flux de valoare personalizat..."
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr "Fluxuri de valoare personalizate pentru a vă măsura ciclul de viață DevSecOps"
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Data"
@@ -11290,6 +11398,9 @@ msgstr "Afișează filtrele graficului"
msgid "CycleAnalytics|Filter by stop date"
msgstr "Filtrați după data de oprire"
+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 "Timpul de livrare pentru schimbări"
@@ -11372,55 +11483,55 @@ msgid "DAST Configuration"
msgstr ""
msgid "DAST profile not found: %{name}"
-msgstr ""
+msgstr "Profilul DAST nu a fost găsit: %{name}"
msgid "DAST profiles"
-msgstr ""
+msgstr "Profiluri DAST"
msgid "DNS"
msgstr ""
msgid "DORA4Metrics|%{startDate} - %{endDate}"
-msgstr ""
+msgstr "%{startDate} - %{endDate}"
msgid "DORA4Metrics|Average (last %{days}d)"
-msgstr ""
+msgstr "Media (ultimele %{days}d)"
msgid "DORA4Metrics|Date"
-msgstr ""
+msgstr "Date"
msgid "DORA4Metrics|Days from merge to deploy"
-msgstr ""
+msgstr "Zile de la îmbinare la implementare"
msgid "DORA4Metrics|Deployment frequency"
-msgstr ""
+msgstr "Frecvența de implementare"
msgid "DORA4Metrics|Lead time for changes"
-msgstr ""
+msgstr "Timpul necesar pentru modificări"
msgid "DORA4Metrics|Median (last %{days}d)"
-msgstr ""
+msgstr "Media (ultimele %{days}d)"
msgid "DORA4Metrics|No merge requests were deployed during this period"
-msgstr ""
+msgstr "În această perioadă nu au fost trimise merge request-uri."
msgid "DORA4Metrics|Number of deployments"
-msgstr ""
+msgstr "Numărul de implementări"
msgid "DORA4Metrics|Something went wrong while getting deployment frequency data."
-msgstr ""
+msgstr "Ceva nu a mers bine la obținerea datelor privind frecvența de implementare."
msgid "DORA4Metrics|Something went wrong while getting lead time data."
-msgstr ""
+msgstr "Ceva a mers prost în timpul obținerii datelor privind timpul de execuție."
msgid "DORA4Metrics|The chart displays the frequency of deployments to production environment(s) that are based on the %{linkStart}deployment_tier%{linkEnd} value."
-msgstr ""
+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 unui merge request și implementarea î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 "DSN"
-msgstr ""
+msgstr "DSN"
msgid "Dashboard"
msgstr "Tablou de bord"
@@ -11462,7 +11573,7 @@ msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and resp
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."
msgid "DastProfiles|AJAX spider"
-msgstr "Spider AJAX"
+msgstr "AJAX spider"
msgid "DastProfiles|API"
msgstr "API"
@@ -11486,7 +11597,7 @@ msgid "DastProfiles|Authentication URL"
msgstr "URL de autentificare"
msgid "DastProfiles|Branch missing"
-msgstr "Ramură lipsă"
+msgstr "Ramura lipsește"
msgid "DastProfiles|Choose a scan method"
msgstr "Alegeți o metodă de scanare"
@@ -11510,7 +11621,7 @@ msgid "DastProfiles|Could not delete site profiles:"
msgstr "Nu s-au putut șterge profilurile site-ului:"
msgid "DastProfiles|Could not fetch scanner profiles. Please refresh the page, or try again later."
-msgstr "Nu s-au putut prelua profilurile scanerului. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
+msgstr "Nu s-au putut prelua profilurile de scanare. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "DastProfiles|Could not fetch site profiles. Please refresh the page, or try again later."
msgstr "Nu s-au putut prelua profilurile site-ului. Actualizați pagina sau încercați din nou mai târziu."
@@ -11522,7 +11633,7 @@ msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "Nu s-a putut actualiza profilul site-ului. Vă rugăm să încercați din nou."
msgid "DastProfiles|DAST profile library"
-msgstr ""
+msgstr "Biblioteca de profiluri DAST"
msgid "DastProfiles|Debug messages"
msgstr "Mesaje de depanare"
@@ -11552,10 +11663,10 @@ msgid "DastProfiles|Enable Authentication"
msgstr "Activați autentificarea"
msgid "DastProfiles|Enter URLs in a comma-separated list."
-msgstr "Introduceți adresele URL într-o listă separată prin virgule."
+msgstr "Introduceți URL-urile într-o listă separată prin virgulă."
msgid "DastProfiles|Enter headers in a comma-separated list."
-msgstr "Introduceți anteturile într-o listă separată prin virgule."
+msgstr "Introduceți antetele într-o listă despărțită prin virgulă."
msgid "DastProfiles|Error Details"
msgstr "Detalii despre erori"
@@ -11588,19 +11699,19 @@ msgid "DastProfiles|Minimum = 0 (no timeout enabled), Maximum = 2880 minutes"
msgstr "Minim = 0 (nu este activat niciun timeout), Maxim = 2880 de minute"
msgid "DastProfiles|Minimum = 1 second, Maximum = 3600 seconds"
-msgstr " Minim = 1 secundă, Maxim = 3600 de secunde"
+msgstr "Minim = 1 secundă, Maxim = 3600 de secunde"
msgid "DastProfiles|New scanner profile"
msgstr "Profil nou de scaner"
msgid "DastProfiles|New site profile"
-msgstr "Profil site nou"
+msgstr "Profilul noului site"
msgid "DastProfiles|No scanner profiles created yet"
-msgstr "Niciun profil de scaner creat încă"
+msgstr "Încă nu au fost create profiluri de scanare"
msgid "DastProfiles|No site profiles created yet"
-msgstr "Niciun profil de site creat încă"
+msgstr "Încă nu au fost create profiluri de site"
msgid "DastProfiles|Not Validated"
msgstr "Nu este validat"
@@ -11624,10 +11735,10 @@ msgid "DastProfiles|Request headers"
msgstr "Anteturile solicitării"
msgid "DastProfiles|Run the AJAX spider, in addition to the traditional spider, to crawl the target site."
-msgstr "Executați spiderul AJAX, în plus față de spiderul tradițional, pentru a parcurge site-ul țintă."
+msgstr "Executați spiderul AJAX, în plus față de spiderul tradițional, pentru a cerceta site-ul țintă."
msgid "DastProfiles|Save commonly used configurations for target sites and scan specifications as profiles. Use these with an on-demand scan."
-msgstr "Salvați ca profiluri configurațiile utilizate frecvent pentru site-urile țintă și specificațiile de scanare. Folosiți-le pentru scanări la cerere."
+msgstr "Salvați configurațiile utilizate în mod obișnuit pentru site-urile țintă și specificațiile de scanare ca profiluri. Utilizați-le cu o scanare la cerere."
msgid "DastProfiles|Save profile"
msgstr "Salvați profilul"
@@ -11657,7 +11768,7 @@ msgid "DastProfiles|Site Profile"
msgstr "Profilul site-ului"
msgid "DastProfiles|Site Profiles"
-msgstr "Profiluri de site"
+msgstr "Profilurile site-ului"
msgid "DastProfiles|Site name"
msgstr "Numele site-ului"
@@ -11668,6 +11779,12 @@ msgstr "Tipul site-ului"
msgid "DastProfiles|Spider timeout"
msgstr "Timeout Spider"
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "URL țintă"
@@ -11675,10 +11792,10 @@ msgid "DastProfiles|Target timeout"
msgstr "Timeout țintă"
msgid "DastProfiles|The maximum number of minutes allowed for the spider to traverse the site."
-msgstr "Numărul maxim de minute permise pentru ca Spider-ul să traverseze site-ul."
+msgstr "Numărul maxim de minute permise pentru ca spiderul să traverseze site-ul."
msgid "DastProfiles|The maximum number of seconds allowed for the site under test to respond to a request."
-msgstr "Numărul maxim de secunde permise pentru ca site-ul testat să răspundă la o cerere."
+msgstr "Numărul maxim de secunde permise pentru ca site-ul testat să răspundă la o solicitare."
msgid "DastProfiles|This profile is currently being used in a policy."
msgstr "Acest profil este utilizat în prezent într-o politică."
@@ -11690,16 +11807,16 @@ msgid "DastProfiles|This site profile is currently being used by a policy. To ma
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ă."
msgid "DastProfiles|Turn on AJAX spider"
-msgstr "Activați Spider-ul AJAX"
+msgstr "Activați Spiderul AJAX"
msgid "DastProfiles|URL"
msgstr "URL"
msgid "DastProfiles|URLs to skip during the authenticated scan."
-msgstr "URL-uri care trebuie să fie sărite în timpul scanării autentificate."
+msgstr "URL-urile care trebuie să fie omise în timpul scanării de autentificare"
msgid "DastProfiles|Username"
-msgstr "Nume utilizator"
+msgstr "Nume de utilizator"
msgid "DastProfiles|Username form field"
msgstr "Câmpul de formular Nume de utilizator"
@@ -11720,7 +11837,7 @@ msgid "DastProfiles|You can either choose a passive scan or validate the target
msgstr "Puteți alege o scanare pasivă sau puteți valida site-ul țintă din pagina de gestionare a profilului site-ului. %{docsLinkStart}Aflați mai multe despre validarea site-ului.%{docsLinkEnd}"
msgid "DastProfiles|You cannot run an active scan against an unvalidated site."
-msgstr "Nu puteți rula o scanare activă pe un site nevalidat."
+msgstr "Nu puteți efectua o scanare activă pe un site nevalidat."
msgid "DastProfiles|folder/dast_example.har or https://example.com/dast_example.har"
msgstr "folder/dast_example.har sau https://example.com/dast_example.har"
@@ -11758,26 +11875,26 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
-msgstr "Etapa 1 - Alegeți metoda de validare a site-ului"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
-msgstr "Etapa 2 - Adăugați următorul antet HTTP la site-ul dvs."
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
-msgstr "Etapa 2 - Adăugați următoarea etichetă meta la site-ul dumneavoastră"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
-msgstr "Etapa 2 - Adăugați următorul text pe site-ul țintă"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
-msgstr "Etapa 3 - Confirmați locația antetului și validați"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
-msgstr "Etapa 3 - Confirmați locația etichetei meta și validați"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
-msgstr "Etapa 3 - Confirmați locația fișierului text și validați"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
+msgstr ""
msgid "DastSiteValidation|Text file validation"
msgstr ""
@@ -11790,17 +11907,17 @@ 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] ""
-msgstr[2] ""
+msgstr[0] "Acest lucru va afecta %d alte profiluri care vizează același URL."
+msgstr[1] "Acest lucru va afecta %d alte profiluri care vizează același URL."
+msgstr[2] "Acest lucru va afecta %d de alte profiluri care vizează același URL."
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
-msgstr "Pentru a efectua o scanare activă, validați site-ul țintă. Toate profilurile de site care partajează același URL de bază partajează același status de validare."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11816,10 +11933,10 @@ msgid "DastSiteValidation|Validation failed for %{url}. %{retryButtonStart}Retry
msgstr ""
msgid "DastSiteValidation|Validation succeeded. Both active and passive scans can be run against the target site."
-msgstr ""
+msgstr "Validarea a reușit. Atât scanările active, cât și cele pasive pot fi rulate pe site-ul țintă."
msgid "DastSiteValidation|You will not be able to run active scans against %{url}."
-msgstr ""
+msgstr "Nu veți putea rula scanări active împotriva %{url}."
msgid "Data is still calculating..."
msgstr ""
@@ -11861,7 +11978,7 @@ msgid "DatadogIntegration|Service"
msgstr "Serviciu"
msgid "DatadogIntegration|Tag all data from this GitLab instance in Datadog. Useful when managing several self-managed deployments."
-msgstr "Etichetați toate datele din această instanță GitLab în Datadog. Util la gestionarea mai multor implementări autogestionate."
+msgstr "Etichetați toate datele din această instanță GitLab în Datadog. Util atunci când gestionați mai multe implementări autogestionate."
msgid "DatadogIntegration|Tags"
msgstr ""
@@ -11882,13 +11999,13 @@ msgid "Date"
msgstr ""
msgid "Date merged"
-msgstr ""
+msgstr "Data îmbinării"
msgid "Date range"
msgstr ""
msgid "Date range limited to %{number} days"
-msgstr ""
+msgstr "Intervalul de date limitat la %{number} (de) zile"
msgid "Date range must be shorter than %{max_range} days."
msgstr ""
@@ -11909,13 +12026,13 @@ msgid "DayTitle|W"
msgstr "W"
msgid "Days"
-msgstr ""
+msgstr "Zile"
msgid "Days to merge"
msgstr ""
msgid "Deactivate dormant users after 90 days of inactivity"
-msgstr ""
+msgstr "Dezactivați utilizatorii latenți după 90 de zile de inactivitate"
msgid "Dear Administrator,"
msgstr ""
@@ -11924,7 +12041,7 @@ msgid "Debian package already exists in Distribution"
msgstr ""
msgid "Debug"
-msgstr ""
+msgstr "Depanare"
msgid "Dec"
msgstr ""
@@ -11966,7 +12083,7 @@ msgid "Default description template for issues"
msgstr ""
msgid "Default description template for merge requests"
-msgstr ""
+msgstr "Șablon de descriere implicit pentru merge request-uri"
msgid "Default first day of the week"
msgstr ""
@@ -11984,34 +12101,34 @@ msgid "Default timeout"
msgstr "Expirare implicită"
msgid "Default: Map a FogBugz account ID to a full name"
-msgstr ""
+msgstr "Implicit: Maparea unui ID de cont FogBugz la un nume complet"
msgid "DefaultBranchLabel|default"
msgstr ""
msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, but cannot force push."
-msgstr ""
+msgstr "Atât dezvoltatorii, cât și întreținătorii pot trimite commit-uri noi, dar nu pot face un push forțat."
msgid "DefaultBranchProtection|Both developers and maintainers can push new commits, force push, or delete the branch."
-msgstr ""
+msgstr "Atât dezvoltatorii, cât și întreținătorii pot face push de commit-uri noi, push forțat sau pot să șteargă ramura."
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 "Dezvoltatorii nu pot face push de commit-uri noi, dar au voie să accepte merge request-uri la ramură. Întreținătorii pot face push la ramură."
msgid "DefaultBranchProtection|Developers cannot push new commits, but maintainers can. No one can force push."
-msgstr ""
+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 ""
+msgstr "Complet protejat"
msgid "DefaultBranchProtection|Not protected"
-msgstr ""
+msgstr "Neprotejat"
msgid "DefaultBranchProtection|Partially protected"
-msgstr ""
+msgstr "Parțial protejat"
msgid "DefaultBranchProtection|Protected against pushes"
-msgstr ""
+msgstr "Protejat împotriva împingerilor"
msgid "Define a custom deploy freeze pattern with %{cronSyntaxStart}cron syntax%{cronSyntaxEnd}"
msgstr ""
@@ -12026,28 +12143,28 @@ msgid "Define environments in the deploy stage(s) in %{code_open}.gitlab-ci.yml%
msgstr ""
msgid "Define how approval rules are applied to merge requests."
-msgstr ""
+msgstr "Definiți modul în care se aplică regulile de aprobare la merge request-uri."
msgid "Definition"
msgstr ""
msgid "DelayedJobs|Are you sure you want to run %{jobName} immediately? Otherwise this job will run automatically after its timer finishes."
-msgstr ""
+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."
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after it's timer finishes."
-msgstr ""
+msgstr "Sunteți sigur că doriți să rulați %{job_name} imediat? Acest job se va executa automat după expirarea temporizatorului."
msgid "DelayedJobs|Are you sure you want to run %{job_name} immediately? This job will run automatically after its timer finishes."
-msgstr ""
+msgstr "Sunteți sigur că doriți să rulați %{job_name} imediat? Acest job va fi executat automat după expirarea temporizatorului."
msgid "DelayedJobs|Run the delayed job now?"
-msgstr ""
+msgstr "Executați jobul întârziat acum?"
msgid "DelayedJobs|Start now"
-msgstr ""
+msgstr "Începeți acum"
msgid "DelayedJobs|Unschedule"
-msgstr ""
+msgstr "Deprogramați"
msgid "DelayedJobs|delayed"
msgstr "întârziat"
@@ -12082,6 +12199,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Eliminare coloană"
@@ -12092,7 +12212,7 @@ msgid "Delete corpus"
msgstr "Eliminare corpus"
msgid "Delete deploy key"
-msgstr ""
+msgstr "Ștergeți cheia de implementare"
msgid "Delete file"
msgstr ""
@@ -12128,7 +12248,7 @@ msgid "Delete snippet?"
msgstr "Ștergeți fragment de cod?"
msgid "Delete source branch"
-msgstr ""
+msgstr "Ștergeți ramura sursă"
msgid "Delete subscription"
msgstr ""
@@ -12146,34 +12266,34 @@ msgid "Delete this project"
msgstr ""
msgid "Delete user list"
-msgstr ""
+msgstr "Ștergeți lista de utilizatori"
msgid "Delete variable"
msgstr ""
msgid "DeleteProject|Failed to remove events. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-au putut elimina evenimentele. Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to remove project repository. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-a putut elimina repozitoriul proiectului. Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to remove project snippets. Please try again or contact administrator."
msgstr "Nu s-au putut elimina fragmentele de cod ale proiectului Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to remove some tags in project container registry. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-au putut elimina unele etichete din registrul containerului proiectului. Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to remove webhooks. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-au putut elimina webhook-urile. Vă rugăm să încercați din nou sau contactați administratorul."
msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
-msgstr ""
+msgstr "Nu s-a putut înlătura repozitoriul wiki. Vă rugăm să încercați din nou sau să contactați administratorul."
msgid "DeleteProject|Failed to restore project repository. Please contact the administrator."
-msgstr ""
+msgstr "Nu s-a putut restaura repozitoriul proiectului. Vă rugăm să contactați administratorul."
msgid "DeleteProject|Failed to restore wiki repository. Please contact the administrator."
-msgstr ""
+msgstr "Nu s-a putut restaura repozitoriul wiki. Vă rugăm să contactați administratorul."
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
msgstr ""
@@ -12193,11 +12313,14 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
-msgid "Deletes the source branch"
+msgid "Deleted the source branch."
msgstr ""
+msgid "Deletes the source branch"
+msgstr "Șterge ramura sursă"
+
msgid "Deletes the source branch."
-msgstr ""
+msgstr "Șterge ramura sursă."
msgid "Deleting"
msgstr ""
@@ -12314,61 +12437,67 @@ msgid "Dependency List has no entries"
msgstr ""
msgid "Dependency Proxy"
-msgstr ""
+msgstr "Proxy de Dependență"
msgid "Dependency Scanning"
msgstr "Scanarea dependențelor"
msgid "Dependency list"
+msgstr "Listă de dependențe"
+
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
msgstr ""
msgid "DependencyProxy|Cached %{time}"
+msgstr "Cache creat pe %{time}"
+
+msgid "DependencyProxy|Clear cache"
msgstr ""
msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
-msgstr ""
+msgstr "Ștergeți în mod automat cache-ul Proxy de Dependență"
msgid "DependencyProxy|Contains %{count} blobs of images (%{size})"
-msgstr ""
+msgstr "Conține %{count} blob-uri de imagini (%{size})"
msgid "DependencyProxy|Copy prefix"
-msgstr ""
-
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr "Creați un proxy local pentru stocarea imaginilor din amonte utilizate frecvent. %{docLinkStart}Aflați mai multe%{docLinkEnd} despre proxy-urile de dependență."
+msgstr "Copiați prefixul"
msgid "DependencyProxy|Dependency Proxy"
-msgstr ""
+msgstr "Proxy de Dependență"
msgid "DependencyProxy|Dependency Proxy feature is limited to public groups for now."
-msgstr ""
+msgstr "Deocamdată, funcția Proxy de Dependență este limitată la grupurile publice."
msgid "DependencyProxy|Dependency Proxy image prefix"
-msgstr ""
+msgstr "Prefixul imaginii Proxy-ului de dependență"
msgid "DependencyProxy|Enable Dependency Proxy"
-msgstr ""
+msgstr "Activați Proxy de Dependență"
msgid "DependencyProxy|Image list"
+msgstr "Lista de imagini"
+
+msgid "DependencyProxy|Scheduled for deletion"
msgstr ""
msgid "DependencyProxy|Storage settings"
-msgstr ""
+msgstr "Setări de stocare"
msgid "DependencyProxy|There are no images in the cache"
-msgstr ""
+msgstr "Nu există imagini în cache"
msgid "DependencyProxy|To see the image prefix and what is in the cache, visit the %{linkStart}Dependency Proxy%{linkEnd}"
-msgstr ""
+msgstr "Pentru a vedea prefixul imaginii și ce se află în cache, vizitați %{linkStart}Proxy de Dependență%{linkEnd}"
msgid "DependencyProxy|When enabled, images older than 90 days will be removed from the cache."
-msgstr ""
+msgstr "Atunci când este activată, imaginile mai vechi de 90 de zile vor fi eliminate din cache."
msgid "Depends on %d merge request being merged"
msgid_plural "Depends on %d merge requests being merged"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Depinde de %d merge request care este îmbinat"
+msgstr[1] "Depinde de %d merge request-uri care sunt îmbinate"
+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."
@@ -12386,7 +12515,7 @@ msgid "Deploy Keys"
msgstr ""
msgid "Deploy container based web apps on Google managed clusters"
-msgstr ""
+msgstr "Desfășurați aplicații web bazate pe containere pe clustere gestionate de Google"
msgid "Deploy freezes"
msgstr ""
@@ -12518,7 +12647,7 @@ msgid "DeployTokens|Copy deploy token"
msgstr ""
msgid "DeployTokens|Copy username"
-msgstr ""
+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}"
@@ -12539,7 +12668,7 @@ msgid "DeployTokens|Enter a unique name for your deploy token."
msgstr "Introduceți un nume unic pentru token-ul dvs. de implementare."
msgid "DeployTokens|Enter a username for your token. Defaults to %{code_start}gitlab+deploy-token-{n}%{code_end}."
-msgstr "Introduceți un nume de utilizator pentru tokenul dvs. Valoarea implicită este %{code_start}gitlab+deploy-token{n}%{code_end}"
+msgstr "Introduceți un nume de utilizator pentru tokenul dumneavoastră. Valoarea implicită este %{code_start}gitlab+deploy-token-{n}%{code_end}"
msgid "DeployTokens|Enter an expiration date for your token. Defaults to never expire."
msgstr "Introduceți o dată de expirare pentru token-ul dvs. În mod implicit, nu expiră niciodată."
@@ -12572,16 +12701,16 @@ msgid "DeployTokens|This action cannot be undone."
msgstr ""
msgid "DeployTokens|This username supports access. %{link_start}What kind of access?%{link_end}"
-msgstr ""
+msgstr "Acest nume de utilizator permite accesul. %{link_start}Ce fel de acces?%{link_end}"
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 ""
+msgstr "Nume de utilizator"
msgid "DeployTokens|Your new Deploy Token username"
-msgstr ""
+msgstr "Noul dvs. nume de utilizator al Tokenului de implementare"
msgid "DeployTokens|Your new group deploy token has been created."
msgstr ""
@@ -12613,6 +12742,9 @@ 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 ""
@@ -12662,7 +12794,7 @@ msgid "DeploymentTarget|Kubernetes (GKE, EKS, OpenShift, and so on)"
msgstr ""
msgid "DeploymentTarget|Managed container runtime (Fargate, Cloud Run, DigitalOcean App)"
-msgstr ""
+msgstr "Runtime de container gestionat (Fargate, Cloud Run, DigitalOcean App)"
msgid "DeploymentTarget|Mobile app store"
msgstr ""
@@ -12677,7 +12809,7 @@ msgid "DeploymentTarget|Registry (package or container)"
msgstr ""
msgid "DeploymentTarget|Self-managed container runtime (Podman, Docker Swarm, Docker Compose)"
-msgstr ""
+msgstr "Runtime pentru containere autogestionate (Podman, Docker Swarm, Docker Compose)"
msgid "DeploymentTarget|Serverless backend (Lambda, Cloud functions)"
msgstr ""
@@ -12755,7 +12887,7 @@ msgid "Deployment|success"
msgstr "succes"
msgid "Deprecated API rate limits"
-msgstr ""
+msgstr "Limite de rată API depreciate"
msgid "Deprecations|Feature deprecation and removal"
msgstr ""
@@ -12763,10 +12895,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12809,142 +12947,142 @@ msgid "Design repository"
msgstr ""
msgid "DesignManagement|%{current_design} of %{designs_count}"
-msgstr ""
+msgstr "%{current_design} din %{designs_count}"
msgid "DesignManagement|%{filename} did not change."
msgid_plural "DesignManagement|The designs you tried uploading did not change."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{filename} nu s-a schimbat."
+msgstr[1] "Elementele designului pe care ați încercat să le încărcați nu s-au schimbat."
+msgstr[2] "Elementele designului pe care ați încercat să le încărcați nu s-au schimbat."
msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version."
-msgstr ""
+msgstr "Adăugarea unui element de design cu același nume de fișier înlocuiește fișierul într-o nouă versiune."
msgid "DesignManagement|Archive design"
-msgstr ""
+msgstr "Arhivați elementul designului"
msgid "DesignManagement|Archive designs"
-msgstr ""
+msgstr "Arhivați elementele designului"
msgid "DesignManagement|Archive selected"
-msgstr ""
+msgstr "Arhivați elementele selectate"
msgid "DesignManagement|Archived designs will still be available in previous versions of the design collection."
-msgstr ""
+msgstr "Activele designului arhivate vor fi în continuare disponibile în versiunile anterioare ale colecției designului"
msgid "DesignManagement|Are you sure you want to archive the selected designs?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să arhivați elementele de design selectate?"
msgid "DesignManagement|Are you sure you want to cancel changes to this comment?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să anulați modificările la acest comentariu?"
msgid "DesignManagement|Are you sure you want to cancel creating this comment?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să anulați crearea acestui comentariu?"
msgid "DesignManagement|Cancel changes"
-msgstr ""
+msgstr "Anulați modificările"
msgid "DesignManagement|Cancel comment confirmation"
-msgstr ""
+msgstr "Anulați confirmarea comentariului"
msgid "DesignManagement|Cancel comment update confirmation"
-msgstr ""
+msgstr "Anulați confirmarea actualizării comentariilor"
msgid "DesignManagement|Click the image where you'd like to start a new discussion"
-msgstr ""
+msgstr "Faceți clic pe imagine acolo unde doriți să începeți o nouă discuție"
msgid "DesignManagement|Comment"
-msgstr ""
+msgstr "Comentariu"
msgid "DesignManagement|Comments you resolve can be viewed and unresolved by going to the \"Resolved Comments\" section below"
-msgstr ""
+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 ""
+msgstr "Nu s-a putut adăuga un comentariu nou. Vă rugăm să încercați din nou."
msgid "DesignManagement|Could not create new discussion. Please try again."
-msgstr ""
+msgstr "Nu s-a putut crea o nouă discuție. Vă rugăm să încercați din nou."
msgid "DesignManagement|Could not update discussion. Please try again."
-msgstr ""
+msgstr "Nu s-a putut actualiza discuția. Vă rugăm să încercați din nou."
msgid "DesignManagement|Could not update note. Please try again."
-msgstr ""
+msgstr "Nu s-a putut actualiza nota. Vă rugăm să încercați din nou."
msgid "DesignManagement|Deselect all"
-msgstr ""
+msgstr "Deselectați totul"
msgid "DesignManagement|Designs"
-msgstr ""
+msgstr "Design"
msgid "DesignManagement|Discard comment"
-msgstr ""
+msgstr "Înlăturați comentariul"
msgid "DesignManagement|Download design"
-msgstr ""
+msgstr "Descărcați elementul de design"
msgid "DesignManagement|Error uploading a new design. Please try again."
-msgstr ""
+msgstr "Eroare la încărcarea unui nou element de design. Vă rugăm să încercați din nou."
msgid "DesignManagement|Go back to designs"
-msgstr ""
+msgstr "ÃŽnapoi la elementele designului"
msgid "DesignManagement|Go to next design"
-msgstr ""
+msgstr "Mergeți la următorul element de design"
msgid "DesignManagement|Go to previous design"
-msgstr ""
+msgstr "Mergeți la elementul de design anterior"
msgid "DesignManagement|Keep changes"
-msgstr ""
+msgstr "Păstrați modificările"
msgid "DesignManagement|Keep comment"
-msgstr ""
+msgstr "Păstrați comentariul"
msgid "DesignManagement|Learn more about resolving comments"
-msgstr ""
+msgstr "Aflați mai multe despre rezolvarea comentariilor"
msgid "DesignManagement|Requested design version does not exist. Showing latest version instead"
-msgstr ""
+msgstr "Versiunea de design solicitată nu există. În schimb, se afișează cea mai recentă versiune"
msgid "DesignManagement|Resolve thread"
msgstr "Rezolvați subiectul"
msgid "DesignManagement|Resolved Comments"
-msgstr ""
+msgstr "Comentarii rezolvate"
msgid "DesignManagement|Save comment"
-msgstr ""
+msgstr "Salvați comentariul"
msgid "DesignManagement|Select all"
-msgstr ""
+msgstr "Selectați totul"
msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles} and %{moreCount} more."
-msgstr ""
+msgstr "Unele dintre elementele designului pe care ați încercat să le încărcați nu s-au schimbat: %{skippedFiles} și %{moreCount} în plus."
msgid "DesignManagement|Some of the designs you tried uploading did not change: %{skippedFiles}."
-msgstr ""
+msgstr "Unele dintre elementele designului pe care ați încercat să le încărcați nu s-au schimbat: %{skippedFiles}."
msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again."
-msgstr ""
+msgstr "Numărul maxim de elemente de design care pot fi încărcate este %{upload_limit}. Vă rugăm să încercați din nou."
msgid "DesignManagement|There was an error moving your designs. Please upload your designs below."
-msgstr ""
+msgstr "S-a produs o eroare la mutarea elementelor designului dumneavoastră. Vă rugăm să vă încărcați activele designului mai jos."
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 ""
+msgstr "Pentru încărcări de design, va trebui să activați LFS și să cereți unui administrator să activeze stocarea hash. %{requirements_link_start}Mai multe informații%{requirements_link_end}"
msgid "DesignManagement|Unresolve thread"
-msgstr "Marcați subiectul ca nerezolvat"
+msgstr "Anulați rezolvarea subiectului"
msgid "DesignManagement|Upload designs"
-msgstr ""
+msgstr "Încărcați elemente de design"
msgid "DesignManagement|Upload skipped. %{reason}"
-msgstr ""
+msgstr "Încărcare sărită. %{reason}"
msgid "DesignManagement|Your designs are being copied and are on their way… Please refresh to update."
-msgstr ""
+msgstr "Elementele de design au fost copiate și sunt pe drum... Vă rugăm să reîmprospătați pentru a le actualiza."
msgid "Designs"
msgstr ""
@@ -12959,7 +13097,7 @@ msgid "Details"
msgstr ""
msgid "Details (default)"
-msgstr ""
+msgstr "Detalii (implicit)"
msgid "Detect host keys"
msgstr ""
@@ -12968,7 +13106,7 @@ msgid "DevOps Adoption"
msgstr ""
msgid "DevOps Reports"
-msgstr ""
+msgstr "Rapoarte DevOps"
msgid "DevOps adoption"
msgstr ""
@@ -13019,7 +13157,7 @@ msgid "DevopsAdoption|At least one issue created"
msgstr ""
msgid "DevopsAdoption|At least one merge request created"
-msgstr ""
+msgstr "Cel puțin un merge request creat"
msgid "DevopsAdoption|At least one pipeline successfully run"
msgstr ""
@@ -13064,7 +13202,7 @@ msgid "DevopsAdoption|Feature adoption is based on usage in the previous calenda
msgstr ""
msgid "DevopsAdoption|Fuzz Testing"
-msgstr "Fuzzing API"
+msgstr "Testare Fuzz"
msgid "DevopsAdoption|Fuzz Testing enabled for at least one project"
msgstr "Testare Fuzz activată pentru cel puțin un proiect"
@@ -13115,13 +13253,13 @@ msgid "DevopsAdoption|Sec"
msgstr ""
msgid "DevopsAdoption|There was an error enabling the current group. Please refresh the page."
-msgstr ""
+msgstr "A survenit o eroare la activarea grupului curent. Vă rugăm să reîmprospătați pagina."
msgid "DevopsAdoption|There was an error fetching Group adoption data. Please refresh the page."
-msgstr ""
+msgstr "A survenit o eroare la preluarea datelor de adopție a grupului. Vă rugăm să reîmprospătați pagina."
msgid "DevopsAdoption|There was an error fetching Groups. Please refresh the page."
-msgstr ""
+msgstr "A survenit o eroare la preluarea grupurilor. Vă rugăm să reîmprospătați pagina."
msgid "DevopsAdoption|This group has no subgroups"
msgstr "Acest grup nu are subgrupuri"
@@ -13162,6 +13300,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13177,47 +13318,59 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
msgid "DiffsCompareBaseBranch|(HEAD)"
-msgstr ""
+msgstr "(HEAD)"
msgid "DiffsCompareBaseBranch|(base)"
-msgstr ""
+msgstr "(base)"
msgid "Diffs|%d addition"
msgid_plural "Diffs|%d additions"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d adăugare"
+msgstr[1] "%d adăugiri"
+msgstr[2] "%d de adăugiri"
msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d ștergere"
+msgstr[1] "%d ștergeri"
+msgstr[2] "%d de ștergeri"
+
+msgid "Diffs|Expand all lines"
+msgstr ""
+
+msgid "Diffs|Next 20 lines"
+msgstr ""
msgid "Diffs|No file name available"
+msgstr "Niciun nume de fișier disponibil"
+
+msgid "Diffs|Previous 20 lines"
msgstr ""
msgid "Diffs|Show %{unfoldCount} lines"
-msgstr ""
+msgstr "Afișați %{unfoldCount} linii"
msgid "Diffs|Show all unchanged lines"
-msgstr ""
+msgstr "Afișați toate liniile neschimbate"
msgid "Diffs|Showing %{dropdownStart}%{count} changed file%{dropdownEnd}"
msgid_plural "Diffs|Showing %{dropdownStart}%{count} changed files%{dropdownEnd}"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Se afișează %{dropdownStart}%{count} fișier modificat%{dropdownEnd}"
+msgstr[1] "Se afișează %{dropdownStart}%{count} fișiere modificate%{dropdownEnd}"
+msgstr[2] "Se afișează %{dropdownStart}%{count} de fișiere modificate%{dropdownEnd}"
msgid "Diffs|Something went wrong while fetching diff lines."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul preluării liniilor diff."
msgid "Diffs|with %{additions} and %{deletions}"
-msgstr ""
+msgstr "cu %{additions} și %{deletions}"
msgid "Direct member"
msgstr ""
@@ -13240,9 +13393,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13255,6 +13405,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13283,7 +13436,7 @@ msgid "Discard changes to %{path}?"
msgstr ""
msgid "Discard draft"
-msgstr "Respingeți schița"
+msgstr "Respingeți draftul"
msgid "DiscordService|Discord Notifications"
msgstr ""
@@ -13307,7 +13460,7 @@ msgid "Discover|For code that's already live in production, our dashboards give
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 ""
+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."
msgid "Discover|Security capabilities, integrated into your development lifecycle"
msgstr ""
@@ -13334,43 +13487,43 @@ msgid "Disk Usage"
msgstr ""
msgid "Dismiss"
-msgstr ""
+msgstr "Respingeți"
msgid "Dismiss %d selected vulnerability as"
msgid_plural "Dismiss %d selected vulnerabilities as"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Respingeți %d vulnerabilitatea selectată ca"
+msgstr[1] "Respingeți %d vulnerabilități selectate ca"
+msgstr[2] "Respingeți %d de vulnerabilități selectate ca"
msgid "Dismiss Alert"
-msgstr ""
+msgstr "Respingeți alerta"
msgid "Dismiss merge request promotion"
-msgstr ""
+msgstr "Respinge promovarea merge request-ului"
msgid "Dismiss selected"
-msgstr ""
+msgstr "Respingeți selecția"
msgid "Dismiss trial promotion"
-msgstr ""
+msgstr "Respingeți oferta promoțională"
msgid "Dismissable"
-msgstr ""
+msgstr "Poate fi respins"
msgid "Dismissed"
-msgstr ""
+msgstr "A fost respins"
msgid "Dismissed at %{projectLink}"
-msgstr ""
+msgstr "Respins la %{projectLink}"
msgid "Dismissed on pipeline %{pipelineLink}"
-msgstr ""
+msgstr "Respins pe pipeline-ul %{pipelineLink}"
msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
-msgstr ""
+msgstr "Refuzat pe pipeline-ul %{pipelineLink} la %{projectLink}"
msgid "Display"
-msgstr ""
+msgstr "Afișare"
msgid "Display alerts from all configured monitoring tools."
msgstr ""
@@ -13390,11 +13543,11 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
-msgstr "Afișarea urmăririi timpului în probleme numai în totalul de ore."
+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 ""
+msgstr "Nu afișați conținut pentru îmbunătățirea experienței clienților și oferte de la terțe părț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}."
@@ -13421,7 +13574,7 @@ msgid "Does not apply to projects in personal namespaces, which are deleted imme
msgstr "Nu se aplică proiectelor din spațiile de nume personale, care sunt șterse imediat la cerere."
msgid "Does not delete the source branch."
-msgstr ""
+msgstr "Nu șterge ramura sursă."
msgid "Domain"
msgstr ""
@@ -13430,7 +13583,7 @@ msgid "Domain Name"
msgstr ""
msgid "Don't have a group?"
-msgstr ""
+msgstr "Nu aveți un grup?"
msgid "Don't have an account yet?"
msgstr ""
@@ -13469,17 +13622,14 @@ msgid "Download (%{size})"
msgstr ""
msgid "Download CSV"
-msgstr ""
+msgstr "Descărcați CSV"
msgid "Download PDF"
-msgstr ""
+msgstr "Descărcare PDF"
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13496,7 +13646,7 @@ msgid "Download payload"
msgstr "Descărcare payload"
msgid "Download raw data (.csv)"
-msgstr ""
+msgstr "Descărcați date brute (.csv)"
msgid "Download source code"
msgstr ""
@@ -13520,10 +13670,10 @@ msgid "Downvotes"
msgstr ""
msgid "Draft"
-msgstr "Schiță"
+msgstr "Draft"
msgid "Draft: %{filename}"
-msgstr "Schiță: %{filename}"
+msgstr "Draft: %{filename}"
msgid "Drag your designs here or %{linkStart}click to upload%{linkEnd}."
msgstr ""
@@ -13541,25 +13691,25 @@ msgid "Drop your files to start your upload."
msgstr ""
msgid "DropdownWidget|An error occurred while fetching the assigned %{issuableAttribute} of the selected %{issuableType}."
-msgstr ""
+msgstr "S-a produs o eroare în timpul preluării %{issuableAttribute} atribuit pentru %{issuableType} selectat(ă)."
msgid "DropdownWidget|Assign %{issuableAttribute}"
-msgstr ""
+msgstr "Atribuiți %{issuableAttribute}"
msgid "DropdownWidget|Failed to fetch the %{issuableAttribute} for this %{issuableType}. Please try again."
-msgstr ""
+msgstr "Nu s-a putut prelua %{issuableAttribute} pentru acest/această %{issuableType}. Vă rugăm să încercați din nou."
msgid "DropdownWidget|Failed to set %{issuableAttribute} on this %{issuableType}. Please try again."
-msgstr ""
+msgstr "Nu s-a putut seta %{issuableAttribute} pentru acest/această %{issuableType}. Vă rugăm să încercați din nou."
msgid "DropdownWidget|No %{issuableAttribute}"
-msgstr ""
+msgstr "Fără %{issuableAttribute}"
msgid "DropdownWidget|No %{issuableAttribute} found"
-msgstr ""
+msgstr "Nu s-a găsit niciun/nicio %{issuableAttribute}"
msgid "DropdownWidget|No open %{issuableAttribute} found"
-msgstr ""
+msgstr "Nu s-a găsit niciun/nicio %{issuableAttribute} deschis(ă)"
msgid "Due Date"
msgstr ""
@@ -13567,47 +13717,53 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
+msgstr "Durata"
+
+msgid "Duration (min)"
msgstr ""
msgid "Duration|%s days"
-msgstr ""
+msgstr "%s (de) zile"
msgid "Duration|%s hours"
-msgstr ""
+msgstr "%s (de) ore"
msgid "Duration|%s minutes"
-msgstr ""
+msgstr "%s (de) minute"
msgid "Duration|%s months"
-msgstr ""
+msgstr "%s (de) luni"
msgid "Duration|%s seconds"
-msgstr ""
+msgstr "%s (de) secunde"
msgid "Duration|%s weeks"
-msgstr ""
+msgstr "%s (de) săptămâni"
msgid "Duration|%s years"
-msgstr ""
+msgstr "%s ani"
msgid "Duration|1 day"
-msgstr ""
+msgstr "1 zi"
msgid "Duration|1 hour"
-msgstr ""
+msgstr "1 oră"
msgid "Duration|1 minute"
-msgstr ""
+msgstr "1 minut"
msgid "Duration|1 month"
-msgstr ""
+msgstr "1 lună"
msgid "Duration|1 week"
-msgstr ""
+msgstr "1 săptămână"
msgid "Duration|1 year"
-msgstr ""
+msgstr "1 an"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
@@ -13637,7 +13793,7 @@ msgid "Edit Deploy Key"
msgstr ""
msgid "Edit Geo Site"
-msgstr ""
+msgstr "Editați site-ul Geo"
msgid "Edit Group Hook"
msgstr ""
@@ -13655,7 +13811,7 @@ msgid "Edit Password"
msgstr ""
msgid "Edit Pipeline Schedule"
-msgstr ""
+msgstr "Editați programul de pipeline"
msgid "Edit Release"
msgstr ""
@@ -13679,13 +13835,13 @@ msgid "Edit comment"
msgstr ""
msgid "Edit commit message"
-msgstr ""
+msgstr "Editați mesajul commit-ului"
msgid "Edit deploy freeze"
msgstr ""
msgid "Edit deploy key"
-msgstr ""
+msgstr "Editați cheia de implementare"
msgid "Edit description"
msgstr ""
@@ -13723,9 +13879,12 @@ msgstr ""
msgid "Edit issues"
msgstr ""
-msgid "Edit merge requests"
+msgid "Edit link"
msgstr ""
+msgid "Edit merge requests"
+msgstr "Editați merge request-urile"
+
msgid "Edit public deploy key"
msgstr ""
@@ -13745,7 +13904,7 @@ msgid "Edit title and description"
msgstr ""
msgid "Edit topic: %{topic_name}"
-msgstr ""
+msgstr "Editați subiectul: %{topic_name}"
msgid "Edit user: %{user_name}"
msgstr ""
@@ -13763,7 +13922,7 @@ msgid "Edited"
msgstr ""
msgid "Edited %{timeago}"
-msgstr ""
+msgstr "Editat(ă) %{timeago}"
msgid "Editing"
msgstr ""
@@ -13777,9 +13936,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13787,7 +13943,7 @@ msgid "Elasticsearch indexing started"
msgstr ""
msgid "Elasticsearch migration halted"
-msgstr ""
+msgstr "Migrarea Elasticsearch a fost oprită"
msgid "Elasticsearch reindexing is already in progress"
msgstr ""
@@ -13805,7 +13961,7 @@ msgid "Elasticsearch zero-downtime reindexing"
msgstr ""
msgid "Elasticsearch's region."
-msgstr ""
+msgstr "Regiunea Elasticsearch."
msgid "Elastic|None. Select namespaces to index."
msgstr "Niciunul. Selectați spațiile de nume pentru indexare."
@@ -13814,7 +13970,7 @@ msgid "Elastic|None. Select projects to index."
msgstr ""
msgid "Eligible users"
-msgstr ""
+msgstr "Utilizatori eligibili"
msgid "Email"
msgstr ""
@@ -13829,7 +13985,7 @@ msgid "Email a new %{name} to this project"
msgstr "Trimiteți prin e-mail un nou %{name} la acest proiect"
msgid "Email address suffix"
-msgstr ""
+msgstr "Sufixul adresei de e-mail"
msgid "Email address to use for Support Desk"
msgstr ""
@@ -13840,9 +13996,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13852,6 +14005,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13871,25 +14027,25 @@ msgid "EmailError|It appears that the email is blank. Make sure your reply is at
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."
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 "Subiectul la care răspundeți nu mai există, poate că a fost șters? În cazul în care credeți că este o eroare, contactați un membru al personalului."
+msgstr "Subiectul la care răspundeți nu mai există, poate că a fost șters? Dacă credeți că este o eroare, contactați un membru al personalului."
msgid "EmailError|We couldn't figure out what the email is for. Please create your issue or comment through the web interface."
msgstr "Nu ne-am putut da seama pentru ce este e-mailul. Vă rugăm să creați problema sau comentariul dvs. prin interfața web."
msgid "EmailError|We couldn't figure out what the email is in reply to. Please create your comment through the web interface."
-msgstr "Nu am putut să ne dăm seama la ce răspunde acest e-mail. Vă rugăm să vă creați comentariul prin intermediul interfeței web."
+msgstr "Nu ne-am putut da seama la ce răspunde acest e-mail. Vă rugăm să vă creați comentariul prin intermediul interfeței web."
msgid "EmailError|We couldn't figure out what user corresponds to the email. Please create your comment through the web interface."
msgstr "Nu ne-am putut da seama ce utilizator corespunde e-mailului. Vă rugăm să vă creați comentariul prin intermediul interfeței web."
msgid "EmailError|We couldn't find the project. Please check if there's any typo."
-msgstr "Nu am putut găsi proiectul. Verificați dacă există vreo greșeală de scriere."
+msgstr "Nu am putut găsi proiectul. Vă rugăm să verificați dacă există vreo greșeală de tipar."
msgid "EmailError|We couldn't process your email because it is too large. Please create your issue or comment through the web interface."
-msgstr ""
+msgstr "Nu am putut procesa e-mailul dvs. deoarece este prea mare. Vă rugăm să vă creați problema sau comentariul prin intermediul interfeței web."
msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
-msgstr "Nu aveți voie să efectuați această acțiune. Dacă credeți că este o eroare, contactați un reprezentant al personalului."
+msgstr "Nu aveți voie să efectuați această acțiune. Dacă credeți că este o eroare, contactați un membru al personalului."
msgid "EmailError|Your account has been blocked. If you believe this is in error, contact a staff member."
msgstr "Contul dvs. a fost blocat. Dacă credeți că acest lucru este o eroare, contactați un membru al personalului."
@@ -13907,7 +14063,7 @@ msgid "Emails"
msgstr "E-mailuri"
msgid "Emails sent from Service Desk have this name."
-msgstr ""
+msgstr "E-mailurile trimise de la Service Desk au acest nume."
msgid "Emails sent to %{email} are also supported."
msgstr ""
@@ -13948,20 +14104,20 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
+msgid "Enable Amazon EKS integration"
+msgstr "Activați integrarea Amazon EKS"
+
msgid "Enable Auto DevOps"
msgstr "Activați Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
-msgstr ""
+msgstr "Activați Gitpod"
msgid "Enable Gitpod?"
-msgstr ""
+msgstr "Activați Gitpod?"
msgid "Enable Invisible Captcha during sign up"
msgstr ""
@@ -13978,17 +14134,11 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
-msgstr ""
-
-msgid "Enable Service Ping"
-msgstr ""
+msgstr "Activați urmărirea erorilor Sentry"
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14003,19 +14153,19 @@ msgid "Enable What's new: Current tier only"
msgstr ""
msgid "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."
-msgstr "Activează un punct final Prometheus care expune statisticile de sănătate È™i performanță. Elementul de meniu „Health Check†apare în secÈ›iunea „Monitorizare†din „Zona Adminâ€. Este necesară repornirea."
+msgstr "Activați un punct final Prometheus care expune statisticile de sănătate și performanță. Elementul de meniu „Verificarea de sănătate†apare în secțiunea Monitorizare din Zona Admin. Este necesară repornirea."
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."
msgid "Enable access tokens to expire after 2 hours. If disabled, tokens do not expire."
-msgstr ""
+msgstr "Permiteți ca tokenurile de acces să expire după 2 ore. Dacă este dezactivat, tokenurile nu expiră."
msgid "Enable admin mode"
msgstr "Activați modul admin"
msgid "Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}."
-msgstr ""
+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 ""
@@ -14024,7 +14174,7 @@ msgid "Enable authenticated Git LFS request rate limit"
msgstr ""
msgid "Enable authenticated web request rate limit"
-msgstr ""
+msgstr "Activați limitarea ratei de solicitări web autentificate"
msgid "Enable authentication"
msgstr ""
@@ -14071,14 +14221,8 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
-msgstr ""
+msgstr "Activați colectarea de jurnale"
msgid "Enable maintenance mode"
msgstr ""
@@ -14087,31 +14231,31 @@ msgid "Enable multipart emails"
msgstr "Activați e-mailurile multipart"
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 ""
+msgstr "Activați această opțiune numai pentru aplicațiile confidențiale utilizate exclusiv de un server backend de încredere care poate stoca în siguranță secretul clientului. Nu activați pentru aplicațiile native-mobile, cu o singură pagină sau alte aplicații JavaScript, deoarece acestea nu pot păstra confidențialitatea secretului clientului."
msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
msgid "Enable or disable version check and Service Ping."
-msgstr ""
+msgstr "Activați sau dezactivați verificarea versiunii și serviciul Ping."
msgid "Enable rate limiting for POST requests to the specified paths"
-msgstr ""
+msgstr "Activați limitarea ratei pentru solicitările POST spre căile specificate"
msgid "Enable reCAPTCHA"
msgstr ""
msgid "Enable reCAPTCHA for login."
-msgstr ""
+msgstr "Activați reCAPTCHA pentru autentificare."
msgid "Enable repository checks"
msgstr "Activați verificările repozitoriului"
msgid "Enable security training"
-msgstr ""
+msgstr "Activați formarea de securitate"
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 ""
+msgstr "Activați formarea de securitate pentru a-i ajuta pe dezvoltatorii dvs. să învețe cum să remedieze vulnerabilitățile. Dezvoltatorii pot vizualiza cursuri de formare în domeniul securității de la furnizorii educaționali selectați, relevante pentru vulnerabilitatea detectată."
msgid "Enable shared runners for all projects and subgroups in this group."
msgstr ""
@@ -14122,12 +14266,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14135,10 +14273,10 @@ msgid "Enable unauthenticated API request rate limit"
msgstr ""
msgid "Enable unauthenticated web request rate limit"
-msgstr ""
+msgstr "Activați limită ratei de solicitare web neautentificată"
msgid "Enable user deactivation emails"
-msgstr ""
+msgstr "Activați e-mailurile de dezactivare a utilizatorilor"
msgid "Enable version check"
msgstr ""
@@ -14150,13 +14288,13 @@ msgid "EnableReviewApp|%{stepStart}Step 2%{stepEnd}. Copy the following snippet:
msgstr "%{stepStart}Etapa 2%{stepEnd}. Copiați următorul fragment de cod:"
msgid "EnableReviewApp|%{stepStart}Step 3%{stepEnd}. Add it to the project %{linkStart}gitlab-ci.yml%{linkEnd} file."
-msgstr ""
+msgstr "%{stepStart}Etapa 3%{stepEnd}. Adăugați-l în fișierul %{linkStart}gitlab-ci.yml al proiectului%{linkEnd}."
msgid "EnableReviewApp|%{stepStart}Step 4 (optional)%{stepEnd}. Enable Visual Reviews by following the %{linkStart}setup instructions%{linkEnd}."
msgstr "%{stepStart}Etapa 4 (opțională)%{stepEnd}. Activați „Recenzii vizuale†urmând %{linkStart}instrucțiunile de configurare%{linkEnd}."
msgid "EnableReviewApp|Close"
-msgstr ""
+msgstr "Închideți"
msgid "EnableReviewApp|Copy snippet text"
msgstr "Copiați textul fragmentului de cod"
@@ -14194,7 +14332,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14204,7 +14342,7 @@ msgid "Enforce two-factor authentication for all user sign-ins."
msgstr "Impuneți autentificarea în doi pași 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 ""
+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}"
msgid "Ensure connectivity is available from the GitLab server to the Prometheus server"
msgstr ""
@@ -14228,10 +14366,10 @@ msgid "Enter an integer number between 0 and 100"
msgstr ""
msgid "Enter any color or choose one of the suggested colors below."
-msgstr ""
+msgstr "Introduceți orice culoare sau alegeți una dintre culorile sugerate mai jos."
msgid "Enter any color."
-msgstr ""
+msgstr "Introduceți orice culoare."
msgid "Enter at least three characters to search"
msgstr ""
@@ -14243,7 +14381,7 @@ msgid "Enter in your Phabricator Server URL and personal access token below"
msgstr ""
msgid "Enter license key"
-msgstr ""
+msgstr "Introduceți cheia de licență"
msgid "Enter merge request URLs"
msgstr ""
@@ -14276,10 +14414,10 @@ msgid "Enter the number of seconds, or other human-readable input, like \"1 hour
msgstr ""
msgid "Enter the password for password-protected Elasticsearch servers."
-msgstr ""
+msgstr "Introduceți parola pentru serverele Elasticsearch protejate prin parolă."
msgid "Enter the username for password-protected Elasticsearch servers."
-msgstr ""
+msgstr "Introduceți numele de utilizator pentru serverele Elasticsearch protejate prin parolă."
msgid "Enter your Packagist server. Defaults to https://packagist.org."
msgstr "Introduceți serverul dvs. Packagist. Valoarea implicită este https://packagist.org."
@@ -14297,10 +14435,7 @@ msgid "Enterprise"
msgstr "ÃŽntreprindere"
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14372,192 +14507,195 @@ msgid "EnvironmentsDashboard|The environments dashboard provides a summary of ea
msgstr "Tabloul de bord al mediilor oferă un rezumat al stării mediilor fiecărui proiect, inclusiv a stărilor pipeline și de alertă."
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 "Acest tablou de bord afiÈ™ează 3 medii per proiect È™i este legat de „Tabloul de bord de operaÈ›iuniâ€. Atunci când adăugaÈ›i sau înlăturaÈ›i un proiect dintr-un tablou de bord, GitLab adaugă sau înlătură proiectul din celălalt. %{linkStart}Mai multe informaÈ›ii%{linkEnd}"
+msgstr "Acest tablou de bord afiÈ™ează 3 medii per proiect È™i este legat de „Tabloul de bord al operaÈ›iunilorâ€. Atunci când adăugaÈ›i sau înlăturaÈ›i un proiect dintr-un tablou de bord, GitLab adaugă sau înlătură proiectul din celălalt. %{linkStart}Mai multe informaÈ›ii%{linkEnd}"
msgid "Environments|An error occurred while canceling the auto stop, please try again"
-msgstr ""
+msgstr "A apărut o eroare la anularea opririi automate, vă rugăm să încercați din nou"
msgid "Environments|An error occurred while deleting the environment. Check if the environment stopped; if not, stop it and try again."
-msgstr ""
+msgstr "A apărut o eroare la ștergerea mediului. Verificați dacă mediul s-a oprit; dacă nu, opriți-l și încercați din nou."
msgid "Environments|An error occurred while fetching the environments."
-msgstr ""
+msgstr "A apărut o eroare la preluarea mediilor."
msgid "Environments|An error occurred while making the request."
-msgstr ""
+msgstr "A apărut o eroare la efectuarea solicitării."
msgid "Environments|An error occurred while re-deploying the environment, please try again"
-msgstr ""
+msgstr "A apărut o eroare la reimplementarea mediului, vă rugăm să încercați din nou"
msgid "Environments|An error occurred while rolling back the environment, please try again"
-msgstr ""
+msgstr "A apărut o eroare în timp ce se efectua restaurarea mediului, vă rugăm să încercați din nou"
msgid "Environments|An error occurred while stopping the environment, please try again"
-msgstr ""
+msgstr "A apărut o eroare la oprirea mediului, vă rugăm să încercați din nou"
msgid "Environments|Are you sure you want to stop this environment?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să opriți acest mediu?"
msgid "Environments|Auto stop"
-msgstr ""
+msgstr "Oprire automată"
msgid "Environments|Auto stops %{autoStopAt}"
-msgstr "Se oprește automat %{autoStopAt}"
+msgstr "Oprire automată %{autoStopAt}"
msgid "Environments|Commit"
msgstr "Commit"
msgid "Environments|Currently showing %{fetched} results."
-msgstr ""
+msgstr "În prezent se afișează %{fetched} (de) rezultate."
msgid "Environments|Currently showing all results."
-msgstr ""
+msgstr "În prezent, sunt afișate toate rezultatele."
msgid "Environments|Delete"
-msgstr ""
+msgstr "Ștergeți"
msgid "Environments|Delete '%{environmentName}'?"
-msgstr ""
+msgstr "Ștergeți „%{environmentName}�"
msgid "Environments|Delete environment"
-msgstr ""
+msgstr "Ștergeți mediul"
msgid "Environments|Deleting the '%{environmentName}' environment cannot be undone. Do you want to delete it anyway?"
-msgstr ""
+msgstr "Ștergerea mediului '%{environmentName}' nu poate fi anulată. Doriți să-l ștergeți oricum?"
msgid "Environments|Deploy to..."
-msgstr ""
+msgstr "Implementați în..."
msgid "Environments|Deployment"
-msgstr ""
+msgstr "Implementare"
msgid "Environments|Deployment %{status}"
-msgstr ""
+msgstr "Implementare %{status}"
msgid "Environments|Enable review app"
-msgstr ""
+msgstr "Activați aplicația de revizuire"
msgid "Environments|Environment"
-msgstr ""
+msgstr "Mediu"
msgid "Environments|Environments"
-msgstr ""
+msgstr "Medii"
msgid "Environments|Environments are places where code gets deployed, such as staging or production."
-msgstr ""
+msgstr "Mediile sunt locurile în care se implementează codul, cum ar fi stadiul de pregătire sau de producție."
msgid "Environments|How do I create an environment?"
-msgstr ""
+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 ""
+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 ""
+msgstr "Joburi"
msgid "Environments|Learn about environments"
-msgstr ""
+msgstr "Aflați mai multe despre medii"
msgid "Environments|Learn more about stopping environments"
-msgstr ""
+msgstr "Aflați mai multe despre oprirea mediilor"
msgid "Environments|Logs from %{start} to %{end}."
-msgstr "Log-uri de la %{start} la %{end}."
+msgstr "Jurnalele de la %{start} la %{end}."
msgid "Environments|New environment"
-msgstr ""
+msgstr "Mediu nou"
msgid "Environments|No deployed environments"
-msgstr ""
+msgstr "Nu există medii implementate"
msgid "Environments|No deployments yet"
-msgstr ""
+msgstr "Nu există încă implementări"
msgid "Environments|No pod selected"
msgstr "Niciun pod selectat"
msgid "Environments|No pods to display"
-msgstr ""
+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 ""
+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â€."
msgid "Environments|Open"
-msgstr ""
+msgstr "Deschideți"
msgid "Environments|Open live environment"
-msgstr ""
+msgstr "Deschideți mediul live"
msgid "Environments|Pod name"
-msgstr ""
+msgstr "Numele pod-ului"
msgid "Environments|Re-deploy"
-msgstr ""
+msgstr "Redistribuiți"
msgid "Environments|Re-deploy environment %{name}?"
-msgstr "Re-implementați mediul %{name}?"
+msgstr "Doriți să redistribuiți mediul %{name}?"
msgid "Environments|Re-deploy to environment"
-msgstr ""
+msgstr "Redistribuiți în mediu"
msgid "Environments|Rollback"
msgstr "Revenire"
msgid "Environments|Rollback environment"
-msgstr ""
+msgstr "Mediu de revenire"
msgid "Environments|Rollback environment %{name}?"
-msgstr ""
+msgstr "Mediul de revenire %{name}?"
msgid "Environments|Select pod"
-msgstr ""
+msgstr "Selectați pod-ul"
msgid "Environments|Show all"
-msgstr ""
+msgstr "Afișați toate"
msgid "Environments|Stop"
-msgstr ""
+msgstr "Opriți"
msgid "Environments|Stop environment"
-msgstr ""
+msgstr "Opriți mediul"
msgid "Environments|Stopping %{environmentName}"
-msgstr ""
+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 ""
+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}, punând mediul într-o versiune anterioară. Sigur doriți să continuați?"
+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 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 commit-ul %{linkStart}%{commitId}%{linkEnd} punând mediul într-o versiune anterioară. Reversarea se poate face prin reimplementarea celei mai recente versiuni a aplicației. Sigur doriți să continuați?"
+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|Upcoming"
-msgstr ""
+msgstr "Viitoare"
msgid "Environments|Upcoming deployment"
-msgstr ""
+msgstr "Implementarea viitoare"
msgid "Environments|Updated"
msgstr "Actualizat"
msgid "Environments|You don't have any environments."
-msgstr ""
+msgstr "Nu aveți niciun mediu."
msgid "Environments|You don't have any stopped environments."
-msgstr ""
+msgstr "Nu aveți niciun mediu oprit."
msgid "Environments|by %{avatar}"
msgstr "de %{avatar}"
msgid "Environments|protected"
-msgstr ""
+msgstr "protejat"
msgid "Environment|Auto stop %{time}"
+msgstr "Oprire automată %{time}"
+
+msgid "Environment|Deployment tier"
msgstr ""
msgid "Epic"
@@ -14584,9 +14722,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14689,6 +14824,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14705,7 +14843,7 @@ msgid "Error creating label."
msgstr ""
msgid "Error creating new directory. Please try again."
-msgstr ""
+msgstr "Eroare la crearea unui nou director. Vă rugăm să încercați din nou."
msgid "Error creating new iteration"
msgstr ""
@@ -14720,7 +14858,7 @@ msgid "Error deleting project. Check logs for error details."
msgstr ""
msgid "Error fetching burnup chart data"
-msgstr ""
+msgstr "Eroare la preluarea datelor graficului burnup"
msgid "Error fetching diverging counts for branches. Please try again."
msgstr ""
@@ -14750,7 +14888,7 @@ msgid "Error loading branches."
msgstr ""
msgid "Error loading burndown chart data"
-msgstr ""
+msgstr "Eroare la încărcarea datelor graficului burndown"
msgid "Error loading countries data."
msgstr ""
@@ -14831,7 +14969,7 @@ msgid "Error parsing CSV file. Please make sure it has"
msgstr ""
msgid "Error rendering Markdown preview"
-msgstr ""
+msgstr "Eroare de redare a previzualizării Markdown"
msgid "Error saving label update."
msgstr ""
@@ -14876,10 +15014,10 @@ msgid "Error: %{error_message}"
msgstr "Eroare: %{error_message}"
msgid "Error: %{error}"
-msgstr ""
+msgstr "Eroare: %{error}"
msgid "Error: Couldn't load some or all of the changes."
-msgstr ""
+msgstr "Eroare: Nu s-au putut încărca unele sau toate modificările."
msgid "Error: No AWS credentials were supplied"
msgstr ""
@@ -14921,7 +15059,7 @@ msgid "ErrorTracking|If you self-host Sentry, enter your Sentry instance's full
msgstr "Dacă auto-găzduiți Sentry, introduceți URL-ul complet al instanței Sentry. Dacă utilizați soluția găzduită Sentry, introduceți 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 "Urmărirea integrată a erorilor este %{epicLinkStart}dezactivată în mod implicit%{epicLinkEnd} È™i nu mai este activă pentru acest proiect. Pentru a reactiva urmărirea erorilor pe instanÈ›ele cu auto-găzduire, puteÈ›i fie %{flagLinkStart}să activaÈ›i Feature Flagâ€%{flagLinkEnd} pentru urmărirea integrată a erorilor, fie să furnizaÈ›i %{settingsLinkStart}URL-ul API-ului Sentry È™i un Token Auth%{settingsLinkEnd} pe pagina de setări a proiectului dumneavoastră. Cu toate acestea, urmărirea erorilor nu este pregătită pentru utilizarea în producÈ›ie È™i nu poate fi activată pe GitLab.com."
+msgstr "Urmărirea integrată a erorilor este %{epicLinkStart}dezactivată în mod implicit%{epicLinkEnd} și nu mai este activă pentru acest proiect. Pentru a reactiva urmărirea erorilor pe instanțele cu auto-găzduire, puteți fie %{flagLinkStart}să activați Feature Flag%{flagLinkEnd} pentru urmărirea integrată a erorilor, fie să furnizați %{settingsLinkStart}URL-ul API-ului Sentry și un Token Auth%{settingsLinkEnd} pe pagina de setări a proiectului dumneavoastră. Cu toate acestea, urmărirea erorilor nu este pregătită pentru utilizarea în producție și nu poate fi activată pe GitLab.com."
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 "Urmărirea integrată a erorilor este %{epicLinkStart}dezactivată în mod implicit%{epicLinkEnd} și nu mai este activă pentru acest proiect. Pentru a reactiva urmărirea erorilor pe instanțele cu auto-găzduire, puteți fie %{flagLinkStart}să activați Feature Flag%{flagLinkEnd} pentru urmărirea integrată a erorilor, fie să furnizați URL-ul API-ului Sentry și un Token Auth mai jos. Cu toate acestea, urmărirea erorilor nu este pregătită pentru utilizarea în producție și nu poate fi activată pe GitLab.com."
@@ -14944,9 +15082,6 @@ msgstr ""
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."
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14966,7 +15101,7 @@ msgid "Escalation policy"
msgstr ""
msgid "Escalation policy:"
-msgstr ""
+msgstr "Politica de escaladare"
msgid "EscalationPolicies|%{clockIcon} IF alert is not %{alertStatus} in %{minutes}"
msgstr ""
@@ -15044,7 +15179,7 @@ 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 ""
+msgstr "Configurați politici de escaladare pentru a defini cine este apelat și când, în cazul în care primii utilizatori apelați nu răspund."
msgid "EscalationPolicies|THEN %{doAction} %{scheduleOrUser}"
msgstr "ATUNCI %{doAction} %{scheduleOrUser}"
@@ -15179,7 +15314,7 @@ 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 ""
+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 plain HTML"
msgstr ""
@@ -15194,7 +15329,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr ""
msgid "Examples"
-msgstr ""
+msgstr "Exemple"
msgid "Except policy:"
msgstr "Cu excepția politicii:"
@@ -15227,7 +15362,7 @@ msgid "Exit."
msgstr ""
msgid "Expand"
-msgstr ""
+msgstr "Extindeți"
msgid "Expand all"
msgstr ""
@@ -15251,7 +15386,7 @@ msgid "Expand milestones"
msgstr ""
msgid "Expand panel"
-msgstr ""
+msgstr "Extindeți panoul"
msgid "Expand pipeline"
msgstr ""
@@ -15266,7 +15401,7 @@ msgid "Expected documents: %{expected_documents}"
msgstr ""
msgid "ExperimentSubject|Must have exactly one of User, Namespace, or Project."
-msgstr "Trebuie să aibă exact unul dintre Utilizator, Spațiu de nume sau Proiect."
+msgstr "Trebuie să aibă exact una dintre următoarele: Utilizator, Spațiu de nume sau Proiect."
msgid "Expiration"
msgstr ""
@@ -15278,6 +15413,9 @@ msgid "Expiration date (optional)"
msgstr "Data expirării (opțional)"
msgid "Expiration date:"
+msgstr "Data expirării:"
+
+msgid "Expire access tokens"
msgstr ""
msgid "Expired"
@@ -15296,7 +15434,7 @@ msgid "Expires in %{expires_at}"
msgstr ""
msgid "Expires on"
-msgstr ""
+msgstr "Expiră pe"
msgid "Expires:"
msgstr ""
@@ -15317,7 +15455,7 @@ msgid "Explore groups"
msgstr "Explorați grupurile"
msgid "Explore paid plans"
-msgstr ""
+msgstr "Explorați planurile plătite"
msgid "Explore projects"
msgstr "Explorați proiectele"
@@ -15332,7 +15470,7 @@ msgid "Explore snippets"
msgstr "Explorați fragmentele de cod"
msgid "Explore topics"
-msgstr ""
+msgstr "Explorați subiectele"
msgid "Export"
msgstr ""
@@ -15350,10 +15488,10 @@ msgid "Export group"
msgstr ""
msgid "Export issues"
-msgstr ""
+msgstr "Exportați problemele"
msgid "Export merge requests"
-msgstr ""
+msgstr "Exportați merge request-urile"
msgid "Export project"
msgstr ""
@@ -15362,10 +15500,10 @@ msgid "Export requirements"
msgstr ""
msgid "Export this group with all related data."
-msgstr ""
+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 aferente 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 prin e-mail pe care o veți primi. Apoi îl puteți importa atunci când creați un proiect nou. %{link_start}Aflaț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}Învățați mai multe.%{link_end}"
msgid "Export variable to pipelines running on protected branches and tags only."
msgstr ""
@@ -15401,52 +15539,52 @@ msgid "ExternalAuthorizationService|When no classification label is set the defa
msgstr ""
msgid "ExternalAuthorization|Access to projects is validated on an external service using their classification label."
-msgstr ""
+msgstr "Accesul la proiecte este validat pe un serviciu extern folosind eticheta de clasificare a acestora."
msgid "ExternalAuthorization|Certificate used to authenticate with the external authorization service. If blank, the server certificate is validated when accessing over HTTPS."
-msgstr ""
+msgstr "Certificat utilizat pentru autentificarea cu serviciul de autorizare extern. Dacă este gol, certificatul serverului este validat la accesarea prin HTTPS."
msgid "ExternalAuthorization|Classification label to use when requesting authorization if no specific label is defined on the project."
-msgstr ""
+msgstr "Eticheta de clasificare care se utilizează la solicitarea autorizației în cazul în care nu este definită o etichetă specifică pentru proiect."
msgid "ExternalAuthorization|Client authorization certificate"
-msgstr ""
+msgstr "Certificat de autorizare a clientului"
msgid "ExternalAuthorization|Client authorization key"
-msgstr ""
+msgstr "Cheia de autorizare a clientului"
msgid "ExternalAuthorization|Client authorization key password (optional)"
-msgstr ""
+msgstr "Parola cheii de autorizare a clientului (opțional)"
msgid "ExternalAuthorization|Default classification label"
-msgstr ""
+msgstr "Etichetă de clasificare implicită"
msgid "ExternalAuthorization|Enable classification control using an external service"
-msgstr ""
+msgstr "Activați controlul clasificării utilizând un serviciu extern"
msgid "ExternalAuthorization|External authorization"
-msgstr ""
+msgstr "Autorizare externă"
msgid "ExternalAuthorization|External authorization request timeout (seconds)"
-msgstr ""
+msgstr "Timpul de așteptare a solicitării de autorizare externă (secunde)"
msgid "ExternalAuthorization|External classification policy authorization."
-msgstr ""
+msgstr "Autorizarea politicii de clasificare externă."
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 ""
+msgstr "Perioada de timp în care GitLab așteaptă un răspuns de la serviciul extern. Dacă nu există niciun răspuns, accesul este refuzat. Implicit: 0,5 secunde."
msgid "ExternalAuthorization|Private key of client authentication certificate. Encrypted when stored."
-msgstr ""
+msgstr "Cheia privată a certificatului de autentificare a clientului. Criptată atunci când este stocată."
msgid "ExternalAuthorization|Service URL"
-msgstr ""
+msgstr "URL-ul serviciului"
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 ""
+msgstr "URL la care proiectele fac cereri de autorizare. În cazul în care URL-ul este necompletat, funcțiile între proiecte sunt disponibile și pot specifica în continuare etichete de clasificare pentru proiecte."
msgid "ExternalIssueIntegration|Another issue tracker is already in use"
msgstr "Un alt tracker de probleme este deja în uz"
@@ -15485,16 +15623,16 @@ msgid "Failed on"
msgstr ""
msgid "Failed to add a Zoom meeting"
-msgstr "Adăugarea unei întâlniri Zoom a eșuat"
+msgstr "Nu ați reușit să adăugați o reuniune Zoom"
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] ""
-msgstr[2] ""
+msgstr[0] "Modelul nu a putut fi arhivat. Vă rugăm să încercați din nou."
+msgstr[1] "Modelele nu au reușit să fie arhivate. Vă rugăm să încercați din nou."
+msgstr[2] "Modelele nu au reușit să fie arhivate. Vă rugăm să încercați din nou."
msgid "Failed to assign a reviewer because no user was specified."
msgstr ""
@@ -15503,13 +15641,13 @@ 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 ""
+msgstr "Anularea opririi automate nu a reușit deoarece actualizarea mediului nu a reușit."
msgid "Failed to cancel auto stop because the environment is not set as auto stop."
-msgstr ""
+msgstr "Anularea opririi automate a eșuat, deoarece mediul nu este setat pentru oprire automată."
msgid "Failed to cancel auto stop because you do not have permission to update the environment."
-msgstr ""
+msgstr "Anularea opririi automate nu a reușit, deoarece nu aveți permisiunea de a actualiza mediul."
msgid "Failed to change the owner"
msgstr "Schimbarea proprietarului a eșuat"
@@ -15580,6 +15718,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15610,6 +15751,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15650,7 +15794,7 @@ msgid "Failed to promote issue to incident"
msgstr ""
msgid "Failed to promote label due to internal error. Please contact administrators."
-msgstr ""
+msgstr "Nu s-a putut promova eticheta din cauza unei erori interne. Vă rugăm să contactați administratorii."
msgid "Failed to protect the branch"
msgstr ""
@@ -15662,7 +15806,7 @@ msgid "Failed to publish issue on status page."
msgstr ""
msgid "Failed to remove a Zoom meeting"
-msgstr ""
+msgstr "Nu s-a reușit înlăturarea unei ședințe Zoom"
msgid "Failed to remove a to-do item for the design."
msgstr ""
@@ -15692,7 +15836,7 @@ msgid "Failed to retrieve page"
msgstr ""
msgid "Failed to save merge conflicts resolutions. Please try again!"
-msgstr ""
+msgstr "Nu s-a reușit salvarea rezoluțiilor conflictelor de îmbinare. Vă rugăm să încercați din nou!"
msgid "Failed to save new settings"
msgstr ""
@@ -15743,13 +15887,13 @@ msgid "Failure"
msgstr ""
msgid "False positive"
-msgstr ""
+msgstr "Fals pozitiv"
msgid "Fast timeout"
msgstr "Expirare rapidă"
msgid "Fast-forward merge without a merge commit"
-msgstr ""
+msgstr "Îmbinare fast-forward fără un commit de îmbinare"
msgid "Faster releases. Better code. Less pain."
msgstr ""
@@ -15766,7 +15910,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Feature Flags"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16012,6 +16156,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16039,9 +16186,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16055,7 +16199,7 @@ msgid "Files"
msgstr "Fișiere"
msgid "Files API Rate Limits"
-msgstr ""
+msgstr "Limitarea ratei API a fișierelor"
msgid "Files breadcrumb"
msgstr "Breadcrumb de fișiere"
@@ -16097,7 +16241,7 @@ msgid "Filter by merge requests that are currently merged."
msgstr ""
msgid "Filter by milestone"
-msgstr ""
+msgstr "Filtrați în funcție de obiectiv"
msgid "Filter by milestone name"
msgstr ""
@@ -16142,10 +16286,10 @@ msgid "Find File"
msgstr ""
msgid "Find bugs in your code with API fuzzing."
-msgstr ""
+msgstr "Găsiți erori în codul dvs. cu fuzzing de API."
msgid "Find bugs in your code with coverage-guided fuzzing."
-msgstr ""
+msgstr "Găsiți erori în codul dvs. cu fuzzing ghidat prin coverage."
msgid "Find by path"
msgstr ""
@@ -16168,11 +16312,8 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
-msgstr ""
+msgstr "Prenumele"
msgid "First Seen"
msgstr ""
@@ -16187,10 +16328,10 @@ msgid "First seen"
msgstr ""
msgid "Fixed burndown chart"
-msgstr ""
+msgstr "Graficul burndown fix"
msgid "Fixed:"
-msgstr "Fixă:"
+msgstr "Fixată:"
msgid "Flags"
msgstr "Semnalizatori"
@@ -16217,19 +16358,19 @@ msgid "Focus filter bar"
msgstr ""
msgid "FogBugz Email"
-msgstr ""
+msgstr "E-mail FogBugz"
msgid "FogBugz Import"
-msgstr ""
+msgstr "Import FogBugz"
msgid "FogBugz Password"
-msgstr ""
+msgstr "Parola FogBugz"
msgid "FogBugz URL"
-msgstr ""
+msgstr "URL FogBugz"
msgid "FogBugz import"
-msgstr ""
+msgstr "Import FogBugz"
msgid "Folder/%{name}"
msgstr ""
@@ -16238,10 +16379,10 @@ msgid "Follow"
msgstr ""
msgid "Followed Users' Activity"
-msgstr ""
+msgstr "Activitatea utilizatorilor urmăriți"
msgid "Followed users"
-msgstr ""
+msgstr "Utilizatori urmăriți"
msgid "Font Color"
msgstr ""
@@ -16250,7 +16391,7 @@ msgid "Footer message"
msgstr ""
msgid "For a faster browsing experience, some files are collapsed by default."
-msgstr ""
+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 ""
@@ -16268,7 +16409,7 @@ msgid "For example, the application using the token or the purpose of the token.
msgstr ""
msgid "For files larger than this limit, only index the file name. The file content is neither indexed nor searchable."
-msgstr ""
+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 ""
@@ -16291,9 +16432,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16394,7 +16532,7 @@ msgid "Found errors in your .gitlab-ci.yml:"
msgstr ""
msgid "Found warning in your .gitlab-ci.yml"
-msgstr ""
+msgstr "S-a găsit un avertisment în fișierul .gitlab-ci.yml"
msgid "Framework successfully deleted"
msgstr ""
@@ -16427,7 +16565,7 @@ 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 ""
+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 issue creation until deploy to production"
msgstr ""
@@ -16439,7 +16577,7 @@ msgid "Full"
msgstr "Complet"
msgid "Full log"
-msgstr ""
+msgstr "Jurnal complet"
msgid "Full name"
msgstr ""
@@ -16469,7 +16607,7 @@ msgid "General pipelines"
msgstr ""
msgid "General settings"
-msgstr ""
+msgstr "Setări generale"
msgid "Generate a default set of labels"
msgstr ""
@@ -16496,7 +16634,7 @@ msgid "Generic"
msgstr "Generic"
msgid "Generic package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea fișierului pachetului generic în octeți"
msgid "GenericReport|After"
msgstr ""
@@ -16517,11 +16655,23 @@ msgid "Geo Settings"
msgstr ""
msgid "Geo Sites"
-msgstr ""
+msgstr "Site-uri Geo"
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr "%{boldStart}N/A%{boldEnd}: Geo nu verifică încă această componentă. Consultați %{linkStart}tipurile de date pe care intenționăm să le susținem%{linkEnd}."
@@ -16547,12 +16697,15 @@ msgid "Geo|%{name} is scheduled for re-verify"
msgstr ""
msgid "Geo|%{timeAgoStr} (%{pendingEvents} events)"
-msgstr ""
+msgstr "%{timeAgoStr} (%{pendingEvents} evenimente)"
msgid "Geo|%{title} checksum progress"
msgstr ""
msgid "Geo|(%{timeAgo})"
+msgstr "(%{timeAgo})"
+
+msgid "Geo|Add New Site"
msgstr ""
msgid "Geo|Add site"
@@ -16576,6 +16729,12 @@ msgstr "Toate proiectele sunt programate pentru resincronizare"
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 ""
@@ -16585,9 +16744,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16600,6 +16774,9 @@ 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 ""
@@ -16621,9 +16798,21 @@ 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 ""
@@ -16633,24 +16822,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
-msgstr "Geo acceptă replicarea mai multor tipuri de date."
-
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 ""
@@ -16663,6 +16864,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16687,21 +16891,39 @@ 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 "Niciodată"
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 ""
@@ -16711,6 +16933,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16723,6 +16948,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16744,6 +16972,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16786,6 +17017,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16813,15 +17047,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16829,7 +17087,7 @@ msgid "Geo|Site name should be between 1 and 255 characters"
msgstr ""
msgid "Geo|Site's status was updated %{timeAgo}."
-msgstr ""
+msgstr "Starea site-ului a fost actualizată %{timeAgo}."
msgid "Geo|Status"
msgstr ""
@@ -16855,6 +17113,12 @@ 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 ""
@@ -16867,9 +17131,21 @@ 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 ""
@@ -16879,12 +17155,18 @@ 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 ""
@@ -16904,11 +17186,14 @@ msgid "Geo|Unknown state"
msgstr ""
msgid "Geo|Updated %{timeAgo}"
-msgstr ""
+msgstr "Actualizat %{timeAgo}"
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Verificarea a eșuat - %{error}"
@@ -16924,7 +17209,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16946,7 +17231,7 @@ msgid "Get a free instance review"
msgstr ""
msgid "Get a free trial"
-msgstr ""
+msgstr "Obțineți o încercare gratuită"
msgid "Get a support subscription"
msgstr ""
@@ -17054,7 +17339,7 @@ msgid "GitLab Team Member"
msgstr ""
msgid "GitLab Ultimate trial"
-msgstr ""
+msgstr "Evaluarea GitLab Ultimate"
msgid "GitLab User"
msgstr ""
@@ -17063,10 +17348,10 @@ msgid "GitLab Workhorse"
msgstr ""
msgid "GitLab account request rejected"
-msgstr ""
+msgstr "Solicitarea contului GitLab a fost respinsă"
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 ""
+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 ""
@@ -17080,7 +17365,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17105,22 +17390,22 @@ msgid "GitLab is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "GitLab logo"
-msgstr ""
+msgstr "Logoul GitLab"
msgid "GitLab metadata URL"
msgstr ""
msgid "GitLab project export"
-msgstr ""
+msgstr "Export de proiect GitLab"
msgid "GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
-msgstr ""
+msgstr "GitLab execută un job în fundal pentru a exporta CSV-uri pseudonimizate din baza de date GitLab. Fișierele CSV sunt apoi încărcate în directorul configurat pentru stocarea obiectelor."
msgid "GitLab single sign-on URL"
msgstr ""
msgid "GitLab username"
-msgstr ""
+msgstr "Nume de utilizator GitLab"
msgid "GitLab uses %{jaeger_link} to monitor distributed systems."
msgstr ""
@@ -17171,7 +17456,7 @@ msgid "GitLabPages|Expired"
msgstr ""
msgid "GitLabPages|Force HTTPS (requires valid certificates)"
-msgstr ""
+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 ""
@@ -17183,7 +17468,7 @@ msgid "GitLabPages|New Domain"
msgstr ""
msgid "GitLabPages|Only project maintainers can remove pages"
-msgstr ""
+msgstr "Numai întreținătorii proiectului pot elimina pages"
msgid "GitLabPages|Pages"
msgstr ""
@@ -17251,47 +17536,56 @@ msgstr ""
msgid "Gitea Import"
msgstr ""
-msgid "GithubIntegration|Create a %{token_link_start}personal access token%{token_link_end} with %{status_html} access granted and paste it here."
+msgid "GithubImporter|PR mergers"
msgstr ""
-msgid "GithubIntegration|Enable static status check names"
+msgid "GithubImporter|PR reviews"
msgstr ""
-msgid "GithubIntegration|Obtain statuses for commits and pull requests."
+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 "Creați un %{token_link_start}token de acces personal%{token_link_end} cu acces %{status_html} acordat și lipiți-l aici."
+
+msgid "GithubIntegration|Enable static status check names"
+msgstr "Activați numele de verificare a stării statice"
+
+msgid "GithubIntegration|Obtain statuses for commits and pull requests."
+msgstr "Obțineți statusurile pentru commit-uri și solicitări de tip pull."
+
msgid "GithubIntegration|Repository URL"
-msgstr ""
+msgstr "URL-ul repozitoriului"
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 "SelectaÈ›i această opÈ›iune dacă doriÈ›i ca GitHub să marcheze verificările de stare ca fiind „Obligatoriiâ€. %{learn_more_link_start}AflaÈ›i mai multe%{learn_more_link_end}."
msgid "GithubIntegration|Static status check names (optional)"
-msgstr ""
+msgstr "Numele de verificare a stării statice (opțional)"
msgid "GithubIntegration|This requires mirroring your GitHub repository to this project. %{docs_link}"
-msgstr ""
+msgstr "Acest lucru necesită oglindirea repozitoriului dvs. GitHub la acest proiect. %{docs_link}"
msgid "Gitpod"
-msgstr ""
+msgstr "Gitpod"
msgid "Gitpod|Enable Gitpod integration"
-msgstr ""
+msgstr "Activați integrarea Gitpod"
msgid "Gitpod|Gitpod URL"
-msgstr ""
+msgstr "Adresa 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-ul instanței dvs. Gitpod configurate pentru a vă citi proiectele GitLab, cum ar fi 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 ""
+msgstr "Pentru a utiliza Gitpod, trebuie mai întâi să activați caracteristica în secțiunea „Integrări†din %{linkStart}preferințele utilizatorului%{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 "Pentru a utiliza integrarea, fiecare utilizator trebuie să activeze Gitpod și în contul său GitLab. %{link_start}Cum îl activez?%{link_end} "
msgid "Gitpod|https://gitpod.example.com"
-msgstr ""
+msgstr "https://gitpod.example.com"
msgid "Given access %{time_ago}"
msgstr ""
@@ -17450,7 +17744,7 @@ msgid "Go to releases"
msgstr ""
msgid "Go to repository charts"
-msgstr ""
+msgstr "Mergeți la graficele repozitoriului"
msgid "Go to repository graph"
msgstr ""
@@ -17459,10 +17753,10 @@ msgid "Go to snippets"
msgstr "Mergeți la fragmente de cod"
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Allowed domains for sign-ups'."
-msgstr ""
+msgstr "MergeÈ›i la „Zona Admin &gt; RestricÈ›ii de înscriere†și bifaÈ›i „Domenii permise pentru înscrieriâ€."
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check 'Email restrictions for sign-ups'."
-msgstr ""
+msgstr "MergeÈ›i la „Zona Admin &gt; RestricÈ›ii de înscriere†și bifaÈ›i „RestricÈ›ii de e-mail pentru înscrieriâ€."
msgid "Go to the 'Admin area &gt; Sign-up restrictions', and check the 'Domain denylist'."
msgstr "MergeÈ›i la „Zona Admin &gt; RestricÈ›ii de înscriere†și bifaÈ›i „Lista de domenii refuzateâ€."
@@ -17471,7 +17765,7 @@ 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 ""
+msgstr "MergeÈ›i la „Zona Admin &gt; General†a grupului È™i bifaÈ›i „Limitarea apartenenÈ›ei în funcÈ›ie de domeniul de e-mailâ€."
msgid "Go to the milestone list"
msgstr ""
@@ -17510,22 +17804,22 @@ msgid "Goal of the changes and what reviewers should be aware of"
msgstr ""
msgid "Google Cloud"
-msgstr ""
+msgstr "Google Cloud"
msgid "Google Cloud Project"
-msgstr ""
+msgstr "Proiectul Google Cloud"
msgid "Google Cloud authorizations required"
-msgstr ""
+msgstr "Sunt necesare autorizări Google Cloud"
msgid "Google Cloud project misconfigured"
-msgstr ""
+msgstr "Proiectul Google Cloud este configurat greșit"
msgid "Google Cloud project required"
-msgstr ""
+msgstr "Este necesar un proiect Google Cloud"
msgid "Google authentication is not %{link_start}properly configured%{link_end}. Ask your GitLab administrator if you want to use this service."
-msgstr ""
+msgstr "Autentificarea Google nu este %{link_start}configurată corespunzător%{link_end}. Întrebați administratorul GitLab dacă doriți să utilizați acest serviciu."
msgid "GoogleCloud|Cancel"
msgstr "Anulare"
@@ -17615,7 +17909,7 @@ msgid "GraphViewType|Stage"
msgstr ""
msgid "Graphs"
-msgstr ""
+msgstr "Grafice"
msgid "Gravatar"
msgstr ""
@@ -17639,7 +17933,7 @@ msgid "Group %{group_name} was successfully created."
msgstr ""
msgid "Group Access Tokens"
-msgstr ""
+msgstr "Tokenuri de acces de grup"
msgid "Group Git LFS status:"
msgstr ""
@@ -17657,7 +17951,7 @@ 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 ""
+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 ""
@@ -17696,7 +17990,7 @@ msgid "Group export started. A download link will be sent by email and made avai
msgstr ""
msgid "Group has been already marked for deletion"
-msgstr ""
+msgstr "Acest grup a fost deja marcat pentru ștergere"
msgid "Group has not been marked for deletion"
msgstr ""
@@ -17756,7 +18050,7 @@ msgid "Group pipeline minutes were successfully reset."
msgstr ""
msgid "Group project URLs are prefixed with the group namespace"
-msgstr "URL-urile proiectului de grup sunt prefixate cu spațiul de nume al grupului"
+msgstr "URL-urile proiectelor de grup sunt prefixate cu spațiul de nume al grupului"
msgid "Group requires separate account"
msgstr ""
@@ -17777,7 +18071,7 @@ msgid "Group was successfully updated."
msgstr ""
msgid "Group wikis"
-msgstr ""
+msgstr "Wiki de grup"
msgid "Group: %{group_name}"
msgstr ""
@@ -17795,7 +18089,7 @@ msgid "GroupActivityMetrics|Members added"
msgstr ""
msgid "GroupActivityMetrics|Merge Requests created"
-msgstr ""
+msgstr "Merge request-uri create"
msgid "GroupActivityMetrics|Recent activity"
msgstr ""
@@ -17810,7 +18104,7 @@ msgid "GroupImport|Group could not be imported: %{errors}"
msgstr "Grupul nu a putut fi importat: %{errors}"
msgid "GroupImport|Please wait while we import the group for you. Refresh at will."
-msgstr ""
+msgstr "Vă rugăm să așteptați în timp ce importăm grupul pentru dumneavoastră. Reîncărcați în orice moment."
msgid "GroupImport|The group was successfully imported."
msgstr ""
@@ -17819,10 +18113,10 @@ msgid "GroupImport|Unable to process group import file"
msgstr ""
msgid "GroupPage|Copy group ID"
-msgstr ""
+msgstr "Copiați ID-ul grupului"
msgid "GroupPage|Group ID: %{group_id}"
-msgstr ""
+msgstr "ID-ul grupului: %{group_id}"
msgid "GroupRoadmap|%{dateWord} – No end date"
msgstr ""
@@ -17918,7 +18212,7 @@ msgid "GroupSAML|Enable SAML authentication for this group"
msgstr "Activați autentificarea SAML pentru acest grup"
msgid "GroupSAML|Enforce SSO-only authentication for Git and Dependency Proxy activity for this group"
-msgstr "Impuneți autentificarea exclusiv SSO pentru activitatea „Git†și „Proxy de dependență†pentru acest grup"
+msgstr "Impuneți autentificarea exclusiv SSO pentru activitatea Git și Proxy de Dependență pentru acest grup"
msgid "GroupSAML|Enforce SSO-only authentication for web activity for this group"
msgstr "Impuneți autentificarea exclusiv SSO pentru activitatea web pentru acest grup"
@@ -18124,9 +18418,6 @@ 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|New runners registration token has been generated!"
-msgstr "A fost generat un nou token de înregistrare a executorilor!"
-
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."
@@ -18244,9 +18535,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Frecvent vizitate"
@@ -18266,19 +18554,19 @@ msgid "GroupsDropdown|Sorry, no groups matched your search"
msgstr ""
msgid "GroupsDropdown|This feature requires browser localStorage support"
-msgstr ""
+msgstr "Această caracteristică necesită un browser care suportă localStorage"
msgid "GroupsEmptyState|A group is a collection of several projects."
-msgstr ""
+msgstr "Un grup este o colecție de mai multe proiecte."
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
-msgstr ""
+msgstr "Dacă vă organizați proiectele în cadrul unui grup, acesta funcționează ca un dosar."
msgid "GroupsEmptyState|No groups found"
-msgstr ""
+msgstr "Nu s-au găsit grupuri"
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
-msgstr ""
+msgstr "Puteți gestiona permisiunile și accesul membrilor grupului dvs. la fiecare proiect din grup."
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."
@@ -18335,7 +18623,7 @@ msgid "GroupsNew|Please fill in your personal access token."
msgstr "Vă rugăm să completați tokenul de acces personal."
msgid "GroupsNew|Provide credentials for another instance of GitLab to import your groups directly."
-msgstr "Furnizați acreditări pentru o altă instanță a GitLab pentru a vă importa grupurile direct."
+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}."
@@ -18437,7 +18725,7 @@ 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 ""
+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}"
msgid "Harbor Registry"
msgstr "Registrul Harbor"
@@ -18474,75 +18762,75 @@ msgstr "Utilizați Harbor ca registru de containere al acestui proiect."
msgid "HarborRegistry|%{count} Image repository"
msgid_plural "HarborRegistry|%{count} Image repositories"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{count} Repozitoriu de imagini"
+msgstr[1] "%{count} Repozitorii de imagini"
+msgstr[2] "%{count} de Repozitorii de imagini"
msgid "HarborRegistry|%{count} Tag"
msgid_plural "HarborRegistry|%{count} Tags"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{count} Etichetă"
+msgstr[1] "%{count} Etichete"
+msgstr[2] "%{count} de Etichete"
msgid "HarborRegistry|Configuration digest: %{digest}"
-msgstr ""
+msgstr "Digestul de configurare: %{digest}"
msgid "HarborRegistry|Digest: %{imageId}"
-msgstr ""
+msgstr "Digest: %{imageId}"
msgid "HarborRegistry|Harbor Registry"
-msgstr ""
+msgstr "Registrul Harbor"
msgid "HarborRegistry|Harbor connection error"
-msgstr ""
+msgstr "Eroare de conectare la Harbor"
msgid "HarborRegistry|Invalid tag: missing manifest digest"
-msgstr ""
+msgstr "Etichetă invalidă: lipsește digestul manifestului"
msgid "HarborRegistry|Last updated %{time}"
-msgstr ""
+msgstr "Ultima actualizare %{time}"
msgid "HarborRegistry|Manifest digest: %{digest}"
-msgstr ""
+msgstr "Digestul manifestului: %{digest}"
msgid "HarborRegistry|Please try different search criteria"
-msgstr ""
+msgstr "Vă rugăm să încercați alte criterii de căutare"
msgid "HarborRegistry|Published %{timeInfo}"
-msgstr ""
+msgstr "Publicat %{timeInfo}"
msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
-msgstr ""
+msgstr "Publicat în depozitul de imagini %{repositoryPath} la ora %{time} pe %{date}"
msgid "HarborRegistry|Root image"
-msgstr ""
+msgstr "Imaginea rădăcină"
msgid "HarborRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "Ne pare rău, filtrul dvs. nu a produs niciun rezultat."
msgid "HarborRegistry|The filter returned no results"
-msgstr ""
+msgstr "Filtrul nu a generat niciun rezultat"
msgid "HarborRegistry|The image repository could not be found."
-msgstr ""
+msgstr "Repozitoriul de imagini nu a putut fi găsit."
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 ""
+msgstr "Ultima etichetă legată de această imagine a fost recent îndepărtată. Această imagine goală și toate datele asociate vor fi îndepărtate automat în cadrul procesului obișnuit de Colectare a gunoiului. Dacă aveți întrebări, contactați administratorul dumneavoastră."
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 ""
+msgstr "Repozitoriul de imagini solicitat nu există sau a fost șters. Dacă sunteți de părere că este vorba de o eroare, încercați să reîmprospătați pagina."
msgid "HarborRegistry|This image has no active tags"
-msgstr ""
+msgstr "Această imagine nu are etichete active"
msgid "HarborRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați sau eliminați filtrele de mai sus."
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 ""
+msgstr "Avem probleme cu conectarea la Registrul Harbor. Vă rugăm să încercați să reîmprospătați pagina. Dacă această eroare persistă, vă rugăm să consultați %{docLinkStart}documentația de depanare.%{docLinkEnd}"
msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+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 ""
@@ -18554,10 +18842,10 @@ msgid "Hashed storage can't be disabled anymore for new projects"
msgstr ""
msgid "Have a quick chat with us about your experience."
-msgstr ""
+msgstr "Vă invităm să discutați cu noi pe scurt despre experiența dumneavoastră."
msgid "Have more to say about GitLab?"
-msgstr ""
+msgstr "Mai aveți și altceva de spus despre GitLab?"
msgid "Header logo"
msgstr ""
@@ -18572,13 +18860,13 @@ msgid "Header message"
msgstr ""
msgid "HeaderAction|incident"
-msgstr ""
+msgstr "incident"
msgid "HeaderAction|issue"
-msgstr ""
+msgstr "problemă"
msgid "Headers"
-msgstr ""
+msgstr "Antete"
msgid "Heading 1"
msgstr ""
@@ -18599,7 +18887,7 @@ msgid "Health"
msgstr "Sănătate"
msgid "Health Check"
-msgstr ""
+msgstr "Verificarea de sănătate"
msgid "Health information can be retrieved from the following endpoints. More information is available"
msgstr ""
@@ -18611,16 +18899,16 @@ msgid "Health status cannot be edited because this issue is closed"
msgstr ""
msgid "HealthCheck|Access token is"
-msgstr ""
+msgstr "Tokenul de acces este"
msgid "HealthCheck|Healthy"
-msgstr ""
+msgstr "Sănătos"
msgid "HealthCheck|No Health Problems Detected"
-msgstr ""
+msgstr "Nu au fost detectate probleme de sănătate"
msgid "HealthCheck|Unhealthy"
-msgstr ""
+msgstr "Nesănătos"
msgid "Hello %{name},"
msgstr ""
@@ -18632,19 +18920,19 @@ msgid "Hello, %{username}!"
msgstr ""
msgid "HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}"
-msgstr ""
+msgstr "%{handshake_emoji} Contribuiți la GitLab: %{contribute_link}"
msgid "HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}"
-msgstr ""
+msgstr "%{magnifier_emoji} Creați o nouă problemă GitLab: %{new_issue_link}"
msgid "HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}"
-msgstr ""
+msgstr "%{rocket_emoji} Ne place curiozitatea dvs.! Ajutați-ne să îmbunătățim GitLab alăturându-vă echipei: %{jobs_page_link}"
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 ""
+msgstr "Această pagină are nevoie de corecturi sau îmbunătățiri? Deschideți o problemă sau contribuiți cu un merge request pentru a ne ajuta să facem GitLab mai atractiv. La GitLab, toată lumea poate contribui!"
msgid "HelloMessage|Welcome to GitLab!"
-msgstr ""
+msgstr "Bine ați venit la GitLab!"
msgid "Help"
msgstr ""
@@ -18655,38 +18943,38 @@ msgstr "Ajută la împiedicarea atacurilor prin forță brută de către boți."
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 ""
+msgstr "Ajută la prevenirea utilizatorilor rău intenționați să-și ascundă activitatea."
msgid "Helps reduce request volume (for example, from crawlers or abusive bots)"
msgstr "Ajută la reducerea volumului de solicitări (de exemplu, de la crawlerele sau roboții abuzivi)"
msgid "Helps reduce request volume for protected paths."
-msgstr ""
-
-msgid "Here you will find recent merge request activity"
-msgstr ""
+msgstr "Ajută la reducerea volumului de solicitări pentru căile protejate."
msgid "Hi %{username}!"
msgstr ""
msgid "Hidden"
-msgstr ""
+msgstr "Ascuns"
msgid "Hide"
msgstr ""
msgid "Hide archived projects"
-msgstr ""
+msgstr "Ascundeți proiectele arhivate"
msgid "Hide chart"
msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ascunde graficul"
+msgstr[1] "Ascunde graficele"
+msgstr[2] "Ascunde graficele"
msgid "Hide comments on this file"
msgstr ""
@@ -18731,31 +19019,31 @@ msgid "Hide values"
msgstr ""
msgid "Hierarchy|Current structure"
-msgstr ""
+msgstr "Structura actuală"
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 "Furnizați valoare mai eficient împărțind munca necesară într-o structură ierarhică. Această structură ajută echipele să înțeleagă domeniul, prioritățile și modul în care munca se îndreaptă spre obiective mai mari."
msgid "Hierarchy|Help us improve work items in GitLab!"
-msgstr ""
+msgstr "Ajutați-ne să îmbunătățim elementele de lucru în 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 "Există un framework sau un tip de element de lucru la care ați dori să aveți acces în GitLab? Oferiți-ne feedbackul dvs. și ajutați-ne să construim experiențe valoroase pentru dumneavoastră."
msgid "Hierarchy|Planning hierarchy"
-msgstr ""
+msgstr "Ierarhia de planificare"
msgid "Hierarchy|Take the work items survey"
-msgstr ""
+msgstr "Participați la sondajul asupra elementele de lucru"
msgid "Hierarchy|These items are unavailable in the current structure."
-msgstr ""
+msgstr "Aceste elemente nu sunt disponibile în structura actuală."
msgid "Hierarchy|Unavailable structure"
-msgstr ""
+msgstr "Structură indisponibilă"
msgid "Hierarchy|You can start using these items now."
-msgstr ""
+msgstr "Puteți începe să folosiți aceste elemente acum."
msgid "High or unknown vulnerabilities present"
msgstr ""
@@ -18782,13 +19070,13 @@ msgid "History of authentications"
msgstr ""
msgid "Holder name:"
-msgstr ""
+msgstr "Numele titularului:"
msgid "Home page URL"
msgstr ""
msgid "Homepage"
-msgstr ""
+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."
@@ -18809,7 +19097,7 @@ msgid "Hour (UTC)"
msgstr ""
msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
+msgstr "Găzduiți-vă fișierele, planificați-vă munca, colaborați la cod și multe altele."
msgid "Housekeeping"
msgstr ""
@@ -18818,13 +19106,7 @@ msgid "Housekeeping successfully started"
msgstr ""
msgid "How do I configure Akismet?"
-msgstr ""
-
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
+msgstr "Cum pot configura Akismet?"
msgid "How do I configure runners?"
msgstr ""
@@ -18848,16 +19130,16 @@ msgid "How do I set up this service?"
msgstr ""
msgid "How do I use a web terminal?"
-msgstr ""
+msgstr "Cum se utilizează un terminal web?"
msgid "How do I use file templates?"
-msgstr ""
+msgstr "Cum pot utiliza șabloanele de fișiere?"
msgid "How many days need to pass between marking entity for deletion and actual removing it."
msgstr ""
msgid "How many seconds an IP counts toward the IP address limit."
-msgstr ""
+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 ""
@@ -18923,7 +19205,7 @@ msgid "IDE|Preview your web application using Web IDE client-side evaluation."
msgstr ""
msgid "IDE|Refresh preview"
-msgstr ""
+msgstr "Reîmprospătați previzualizarea"
msgid "IDE|Review"
msgstr ""
@@ -18947,17 +19229,20 @@ msgid "IP Address"
msgstr ""
msgid "IP address expiration time"
-msgstr ""
+msgstr "Timpul de expirare a adresei IP"
msgid "IP address restrictions"
-msgstr ""
+msgstr "Restricții privind adresele IP"
msgid "IP addresses per user"
-msgstr ""
+msgstr "Adrese IP pe utilizator"
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18986,7 +19271,7 @@ msgid "If any indexed field exceeds this limit, it is truncated to this number o
msgstr ""
msgid "If blank, defaults to %{code_open}Retry later%{code_close}."
-msgstr ""
+msgstr "Dacă este necompletat, valoarea implicită este %{code_open}Reîncercați mai târziu%{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 ""
@@ -18997,15 +19282,12 @@ 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."
+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 "Dacă este dezactivat, numai administratorii pot configura replicarea repozitoriului."
-msgid "If enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19018,14 +19300,11 @@ 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 there isn't any existing index, GitLab creates one."
-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 ""
+msgstr "Dacă acest e-mail a fost adăugat din greșeală, îl puteți elimina aici: %{profile_emails_url}"
msgid "If this was a mistake you can %{leave_link_start}leave the %{source_type}%{link_end}."
msgstr ""
@@ -19040,10 +19319,10 @@ msgid "If you add %{codeStart}needs%{codeEnd} to jobs in your pipeline you'll be
msgstr ""
msgid "If you are added to a project, it will be displayed here."
-msgstr ""
+msgstr "Dacă sunteți adăugat la un proiect, acesta va fi afișat aici."
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 ""
+msgstr "Dacă nu ați inițiat aceste încercări de conectare, vă rugăm să contactați administratorul dvs. sau să activați autentificarea cu doi factori (2FA) în contul dvs."
msgid "If you did not initiate this change, please contact your administrator immediately."
msgstr ""
@@ -19073,10 +19352,10 @@ msgid "If you want to re-enable two-factor authentication, visit the %{settings_
msgstr ""
msgid "If you want to remove this email address, visit %{profile_link}"
-msgstr ""
+msgstr "Dacă doriți să înlăturați această adresă de e-mail, vizitați %{profile_link}"
msgid "If you want to remove this email address, visit the %{settings_link_to} page."
-msgstr ""
+msgstr "Dacă doriți să înlăturați această adresă de e-mail, vizitați pagina %{settings_link_to}."
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
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."
@@ -19145,13 +19424,13 @@ msgid "Import Projects from Gitea"
msgstr "Importați proiecte din Gitea"
msgid "Import an exported GitLab project"
-msgstr ""
+msgstr "Importați un proiect GitLab exportat"
msgid "Import and export rate limits"
-msgstr ""
+msgstr "Limite ale ratelor de import și export"
msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
-msgstr ""
+msgstr "Importul a eșuat din cauza unei erori GitHub: %{original} (HTTP %{code})"
msgid "Import from"
msgstr ""
@@ -19160,7 +19439,7 @@ msgid "Import from Jira"
msgstr ""
msgid "Import group"
-msgstr ""
+msgstr "Importați grupul"
msgid "Import group from file"
msgstr ""
@@ -19169,13 +19448,13 @@ msgid "Import groups"
msgstr ""
msgid "Import history"
-msgstr ""
+msgstr "Import de istoric"
msgid "Import in progress"
msgstr ""
msgid "Import in progress. Refresh page to see newly added issues."
-msgstr ""
+msgstr "Import în curs. Reîmprospătați pagina pentru a vedea problemele adăugate recent."
msgid "Import issues"
msgstr ""
@@ -19187,19 +19466,19 @@ msgid "Import project"
msgstr ""
msgid "Import project from"
-msgstr ""
+msgstr "Importați proiectul din"
msgid "Import projects from Bitbucket"
-msgstr ""
+msgstr "Importați proiecte din Bitbucket"
msgid "Import projects from Bitbucket Server"
-msgstr ""
+msgstr "Importați proiecte din Serverul Bitbucket"
msgid "Import projects from FogBugz"
-msgstr ""
+msgstr "Importați proiecte din FogBugz"
msgid "Import projects from GitLab.com"
-msgstr ""
+msgstr "Importați proiecte din GitLab.com"
msgid "Import repositories from Bitbucket Server"
msgstr ""
@@ -19226,25 +19505,25 @@ msgid "Import timed out. Import took longer than %{import_jobs_expiration} secon
msgstr ""
msgid "ImportAProjectModal|Import from a project"
-msgstr ""
+msgstr "Importați dintr-un proiect"
msgid "ImportAProjectModal|Import members from another project"
-msgstr ""
+msgstr "Importați membri dintr-un alt proiect"
msgid "ImportAProjectModal|Import project members"
-msgstr ""
+msgstr "Importați membrii proiectului"
msgid "ImportAProjectModal|Only project members (not group members) are imported, and they get the same permissions as the project you import from."
-msgstr ""
+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 ""
+msgstr "Ați importat cu succes"
msgid "ImportAProjectModal|Unable to import project members"
-msgstr ""
+msgstr "Nu se pot importa membrii proiectului"
msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Importați membri în proiectul %{strongStart}%{name}%{strongEnd}."
msgid "ImportButtons|Connect repositories from"
msgstr ""
@@ -19301,10 +19580,7 @@ msgid "Import|There is not a valid Git repository at this URL. If your HTTP repo
msgstr ""
msgid "Improve customer support with Service Desk"
-msgstr ""
-
-msgid "Improves Git cloning performance."
-msgstr "Îmbunătățește performanța de clonare Git."
+msgstr "Îmbunătățiți asistența pentru clienți cu Service Desk"
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 ""
@@ -19316,13 +19592,13 @@ msgid "In progress"
msgstr "În desfășurare"
msgid "In this page you will find information about the settings that are used in your current instance."
-msgstr ""
+msgstr "În această pagină veți găsi informații despre setările care sunt utilizate în instanța dvs. curentă."
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 "%{strong_start}Securitatea avansată a aplicațiilor%{strong_end} — inclusiv scanarea SAST, DAST, testarea FUZZ, scanarea dependențelor, conformitatea licențelor, detectarea secretelor"
+msgstr "%{strong_start}Securitatea avansată a aplicațiilor%{strong_end} — inclusiv scanarea SAST, DAST, testarea FUZZ, scanarea dependențelor, conformitatea licenței, detectarea secretelor"
msgid "InProductMarketing|%{strong_start}Company wide portfolio management%{strong_end} — including multi-level epics, scoped labels"
msgstr ""
@@ -19367,7 +19643,7 @@ msgid "InProductMarketing|And many more..."
msgstr ""
msgid "InProductMarketing|Are your runners ready?"
-msgstr ""
+msgstr "Executorii dvs. sunt pregătiți?"
msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr ""
@@ -19387,9 +19663,12 @@ 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|Burn up/down charts"
+msgid "InProductMarketing|Building for iOS? We've got you covered."
msgstr ""
+msgid "InProductMarketing|Burn up/down charts"
+msgstr "Grafice Burn up/down"
+
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 ""
@@ -19487,7 +19766,7 @@ 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 ""
+msgstr "Găsiți și remediați blocajele din procesul de revizuire a codului, înțelegând cât timp au stat în revizuire merge request-urile deschise."
msgid "InProductMarketing|Find out how your teams are really doing"
msgstr ""
@@ -19507,6 +19786,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19532,7 +19814,7 @@ msgid "InProductMarketing|GitLab is infrastructure agnostic (supporting GCP, AWS
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 "GitLab oferă testarea statică a securității aplicațiilor (SAST), testarea dinamică a securității aplicațiilor (DAST), scanarea containerelor și scanarea dependențelor pentru a vă ajuta să livrați aplicații sigure, împreună cu respectarea licențelor."
+msgstr "GitLab oferă testarea statică a securității aplicațiilor (SAST), testarea dinamică a securității aplicațiilor (DAST), scanarea containerelor și scanarea dependențelor pentru a vă ajuta să livrați aplicații sigure, împreună cu conformitatea licenței."
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 ""
@@ -19574,13 +19856,13 @@ msgid "InProductMarketing|If you no longer wish to receive marketing emails from
msgstr ""
msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
-msgstr ""
+msgstr "Importați-vă proiectul și codul din GitHub, Bitbucket și altele"
msgid "InProductMarketing|Improve app security with a 30-day trial"
msgstr ""
msgid "InProductMarketing|Improve code quality and streamline reviews"
-msgstr ""
+msgstr "Îmbunătățiți calitatea codului și eficientizați revizuirile"
msgid "InProductMarketing|Increase Operational Efficiencies"
msgstr "Creșteți eficiența operațională"
@@ -19613,11 +19895,14 @@ msgid "InProductMarketing|It's also possible to simply %{external_repo_link} in
msgstr ""
msgid "InProductMarketing|Keep your code quality high by defining who should approve merge requests and how many approvals are required."
-msgstr ""
+msgstr "Păstrați un nivel ridicat al calității codului prin definirea persoanelor care trebuie să aprobe merge request-urile și numărul de aprobări necesare."
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 ""
@@ -19676,7 +19961,7 @@ msgid "InProductMarketing|Security that's integrated into your development lifec
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 ""
+msgstr "Uneori, nu sunteți pregătit pentru o tranziție completă la un nou instrument. Dacă nu sunteți pregătit să vă angajați complet, %{mirroring_link} vă oferă o modalitate sigură de a încerca GitLab în paralel cu instrumentul dvs. actual."
msgid "InProductMarketing|Speed. Efficiency. Trust."
msgstr ""
@@ -19688,7 +19973,7 @@ msgid "InProductMarketing|Start a GitLab Ultimate trial today in less than one m
msgstr ""
msgid "InProductMarketing|Start a Self-Managed trial"
-msgstr ""
+msgstr "Începeți o încercare autogestionată"
msgid "InProductMarketing|Start a free trial"
msgstr ""
@@ -19751,16 +20036,16 @@ 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 ""
+msgstr "Ați obosit să vă luptați cu lanțuri de instrumente disparate, cu silozuri de informații și cu procese ineficiente? CI/CD de la GitLab este construit pe o platformă DevOps cu gestionarea codului sursă, planificare, monitorizare și multe altele gata de utilizare. Aflați %{ci_link}."
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 ""
+msgstr "Pentru a înțelege și a obține cele mai bune rezultate din GitLab, începeți de la zero, începând cu %{project_link}. În GitLab, repozitoriile fac parte dintr-un proiect, așa că, după ce ați creat proiectul, puteți merge mai departe la %{repo_link}."
msgid "InProductMarketing|Track completed issues in a chart, so you can see how a milestone is progressing at a glance."
-msgstr ""
+msgstr "Monitorizați într-un grafic problemele finalizate, astfel încât să puteți vedea dintr-o privire modul în care progresează obiectivul de etapă."
msgid "InProductMarketing|Try GitLab Ultimate for free"
msgstr ""
@@ -19787,7 +20072,7 @@ 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 "Utilizați șablonul nostru cloudformation AWS pentru a vă dezvolta executorii în doar câteva clicuri!"
+msgstr "Utilizați șablonul nostru AWS cloudformation pentru a vă instala executorii în doar câteva clicuri!"
msgid "InProductMarketing|Used by more than 100,000 organizations from around the globe:"
msgstr "Utilizat de peste 100.000 de organizații din întreaga lume:"
@@ -19801,9 +20086,15 @@ 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 ""
@@ -19883,7 +20174,7 @@ msgid "Incident Management Limits"
msgstr ""
msgid "Incident details"
-msgstr ""
+msgstr "Detalii privind incidentul"
msgid "Incident template (optional)."
msgstr ""
@@ -19945,6 +20236,9 @@ msgstr "Incident"
msgid "IncidentManagement|Incidents"
msgstr "Incidente"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Scăzut - S4"
@@ -20012,7 +20306,7 @@ msgid "IncidentManagement|Use escalation policies to automatically page your tea
msgstr "Utilizați politicile de escaladare pentru a vă contacta automat echipa atunci când sunt create incidente."
msgid "IncidentSettings|Activate \"time to SLA\" countdown timer"
-msgstr ""
+msgstr "ActivaÈ›i contorul de numărătoare inversă „timp până la SLAâ€"
msgid "IncidentSettings|Fine-tune incident settings and set up integrations with external tools to help better manage incidents."
msgstr ""
@@ -20027,22 +20321,22 @@ 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 ""
+msgstr "Introduceți un contor de timp cu numărătoare inversă în problemele legate de incidente pentru a urmări mai bine acordurile privind nivelul de servicii (SLA). Contorul pornește automat atunci când incidentul este creat și stabilește o limită de timp pentru rezolvarea incidentului. Atunci când este activată, numărătoarea inversă până la SLA apare pentru toate incidentele noi."
msgid "IncidentSettings|PagerDuty integration"
msgstr ""
msgid "IncidentSettings|Time limit"
-msgstr ""
+msgstr "Limita de timp"
msgid "IncidentSettings|Time limit must be a multiple of 15 minutes."
msgstr "Limita de timp trebuie să fie un multiplu de 15 minute."
msgid "IncidentSettings|Time limit must be a valid number."
-msgstr ""
+msgstr "Limita de timp trebuie să fie un număr valid."
msgid "IncidentSettings|Time limit must be greater than 0."
-msgstr ""
+msgstr "Limita de timp trebuie să fie mai mare decât 0."
msgid "IncidentSettings|When activated, this applies to all new incidents in the project."
msgstr ""
@@ -20068,18 +20362,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr "Adăugați un nou eveniment cronologic"
@@ -20132,7 +20414,7 @@ msgid "Include the name of the author of the issue, merge request or comment in
msgstr "Includeți numele autorului acestei probleme, cereri de îmbinare sau comentariu în corpul e-mailului. În mod implicit, GitLab suprascrie numele expeditorului. Unele servere de e-mail nu suportă acea opțiuni."
msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
-msgstr ""
+msgstr "Includeți numele de utilizator în URL, dacă este necesar: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited."
msgstr "Include obiecte LFS. Se poate suprascrie pentru fiecare grup sau proiect. 0 pentru nelimitat."
@@ -20237,7 +20519,7 @@ msgid "Inline"
msgstr ""
msgid "Inline math"
-msgstr ""
+msgstr "Matematică inline"
msgid "Input host keys manually"
msgstr ""
@@ -20327,7 +20609,7 @@ msgid "Instance access request approved"
msgstr ""
msgid "Instance access request rejected"
-msgstr ""
+msgstr "Solicitarea accesului la instanță a fost respinsă"
msgid "Instance administrators group already exists"
msgstr ""
@@ -20342,7 +20624,7 @@ msgid "Insufficient permissions"
msgstr ""
msgid "Insufficient permissions for dast_configuration keyword"
-msgstr ""
+msgstr "Permisiuni insuficiente pentru cuvântul cheie dast_configuration"
msgid "Integration"
msgstr ""
@@ -20351,82 +20633,82 @@ msgid "Integration Settings"
msgstr ""
msgid "Integrations"
-msgstr ""
+msgstr "Integrări"
msgid "Integrations|%{integrationTitle}: active"
-msgstr ""
+msgstr "%{integrationTitle}: activă"
msgid "Integrations|%{integration} settings saved and active."
-msgstr ""
+msgstr "Setări %{integration} salvate și active."
msgid "Integrations|%{integration} settings saved, but not active."
-msgstr ""
+msgstr "Setări %{integration} salvate, dar nu active."
msgid "Integrations|Active integrations"
-msgstr ""
+msgstr "Integrări active"
msgid "Integrations|Add an integration"
-msgstr ""
+msgstr "Adăugați o integrare"
msgid "Integrations|Add namespace"
msgstr "Adăugați spațiu de nume"
msgid "Integrations|All details"
-msgstr ""
+msgstr "Toate detaliile"
msgid "Integrations|All projects inheriting these settings will also be reset."
-msgstr ""
+msgstr "Toate proiectele care moștenesc aceste setări vor fi, de asemenea, resetate."
msgid "Integrations|An error occurred while loading projects using custom settings."
-msgstr ""
+msgstr "A apărut o eroare la încărcarea proiectelor care utilizează setări personalizate."
msgid "Integrations|Branches for which notifications are to be sent"
-msgstr ""
+msgstr "Ramurile pentru care urmează să fie trimise notificări"
msgid "Integrations|Clear if using a self-signed certificate."
-msgstr ""
+msgstr "Ștergeți dacă utilizați un certificat auto-semnat."
msgid "Integrations|Comment detail:"
-msgstr ""
+msgstr "Detaliile comentariului:"
msgid "Integrations|Comment settings:"
-msgstr ""
+msgstr "Setări de comentarii:"
msgid "Integrations|Connection details"
-msgstr ""
+msgstr "Detalii de conectare"
msgid "Integrations|Connection failed. Please check your settings."
-msgstr ""
+msgstr "Conexiunea a eșuat. Vă rugăm să verificați setările."
msgid "Integrations|Connection successful."
-msgstr ""
+msgstr "Conexiune reușită."
msgid "Integrations|Create new issue in Jira"
-msgstr ""
+msgstr "Creați o nouă problemă în Jira"
msgid "Integrations|Create new issue in ZenTao"
-msgstr ""
+msgstr "Creați o nouă problemă în ZenTao"
msgid "Integrations|Default settings are inherited from the group level."
-msgstr ""
+msgstr "Setările implicite sunt moștenite de la nivelul grupului."
msgid "Integrations|Default settings are inherited from the instance level."
-msgstr ""
+msgstr "Setările implicite sunt moștenite de la nivelul instanței."
msgid "Integrations|Edit project alias"
-msgstr ""
+msgstr "Editați aliasul proiectului"
msgid "Integrations|Enable GitLab.com slash commands in a Slack workspace."
-msgstr ""
+msgstr "Activați comenzile slash GitLab.com într-un spațiu de lucru Slack."
msgid "Integrations|Enable SSL verification"
-msgstr ""
+msgstr "Activați verificarea SSL"
msgid "Integrations|Enable comments"
-msgstr ""
+msgstr "Activați comentariile"
msgid "Integrations|Enter your alias"
-msgstr ""
+msgstr "Introduceți aliasul dvs."
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."
@@ -20441,31 +20723,31 @@ msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr "Spațiul de nume n-a putut fi deconectat. Vă rugăm să încercați din nou."
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 ""
+msgstr "Administratorii GitLab pot configura integrări pe care toate grupurile și proiectele le preiau și le utilizează în mod implicit. Aceste integrări se aplică tuturor grupurilor și proiectelor care nu utilizează deja setări personalizate. Puteți suprascrie setările personalizate pentru un grup sau proiect dacă setările sunt necesare la nivelul respectiv. Aflați mai multe despre %{integrations_link_start}gestionarea integrărilor la nivel de instanță%{link_end}."
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 ""
+msgstr "Administratorii GitLab pot configura integrări pe care toate proiectele dintr-un grup le moștenesc și le utilizează în mod implicit. Aceste integrări se aplică tuturor proiectelor care nu utilizează deja setări personalizate. Puteți suprascrie setările personalizate pentru un proiect dacă setările sunt necesare la acel nivel. Aflați mai multe despre %{integrations_link_start}gestionarea integrărilor la nivel de grup%{link_end}."
msgid "Integrations|Group-level integration management"
-msgstr ""
+msgstr "Managementul integrării la nivel de grup"
msgid "Integrations|Includes Standard, plus the entire commit message, commit hash, and issue IDs"
-msgstr ""
+msgstr "Include Standard, plus întregul mesaj al commit-ului, hash-ul commit-ului și ID-urile problemelor"
msgid "Integrations|Includes commit title and branch."
-msgstr ""
+msgstr "Include titlul commit-ului și ramura."
msgid "Integrations|Instance-level integration management"
-msgstr ""
+msgstr "Gestionarea integrării la nivel de instanță"
msgid "Integrations|Issues created in Jira are shown here once you have created the issues in project setup in Jira."
-msgstr ""
+msgstr "Problemele create în Jira sunt afișate aici după ce ați creat problemele în configurarea proiectului în Jira."
msgid "Integrations|Keep your PHP dependencies updated on Packagist."
msgstr "Păstrați-vă dependențele PHP actualizate pe Packagist."
msgid "Integrations|Known limitations"
-msgstr ""
+msgstr "Limitări cunoscute"
msgid "Integrations|Link namespaces"
msgstr "Conectați spațiile de nume"
@@ -20486,109 +20768,106 @@ msgid "Integrations|No linked namespaces"
msgstr "Niciun spațiu de nume conectat."
msgid "Integrations|Projects using custom settings"
-msgstr "Proiecte utilizând setări personalizate"
+msgstr "Proiecte care utilizează setări personalizate"
msgid "Integrations|Projects using custom settings will not be affected."
-msgstr ""
+msgstr "Proiectele care utilizează setări personalizate nu vor fi afectate."
msgid "Integrations|Projects using custom settings will not be impacted unless the project owner chooses to use parent level defaults."
-msgstr ""
+msgstr "Proiectele care utilizează setări personalizate nu vor fi afectate, cu excepția cazului în care proprietarul proiectului alege să utilizeze valorile implicite ale nivelului părinte."
msgid "Integrations|Reset integration?"
-msgstr ""
+msgstr "Resetați integrarea?"
msgid "Integrations|Resetting this integration will clear the settings and deactivate this integration."
-msgstr ""
+msgstr "Resetarea acestei integrări va șterge setările și va dezactiva această integrare."
msgid "Integrations|Return to GitLab for Jira"
-msgstr ""
+msgstr "ÃŽnapoi la GitLab pentru Jira"
msgid "Integrations|SSL verification"
-msgstr ""
+msgstr "Verificarea SSL"
msgid "Integrations|Save settings?"
-msgstr ""
+msgstr "Salvați setările?"
msgid "Integrations|Saving will update the default settings for all projects that are not using custom settings."
-msgstr ""
+msgstr "Salvarea va actualiza setările implicite pentru toate proiectele care nu utilizează setări personalizate."
msgid "Integrations|Search Jira issues"
-msgstr ""
+msgstr "Căutați probleme Jira"
msgid "Integrations|Search ZenTao issues"
-msgstr ""
+msgstr "Căutați probleme ZenTao"
msgid "Integrations|Send notifications about project events to Unify Circuit."
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către Unify Circuit."
msgid "Integrations|Send notifications about project events to a Unify Circuit conversation. %{docs_link}"
-msgstr ""
+msgstr "Trimiteți notificări despre evenimentele proiectului către o conversație Unify Circuit. %{docs_link}"
msgid "Integrations|Sign in to GitLab"
-msgstr ""
+msgstr "Autentificați-vă în GitLab"
msgid "Integrations|Sign in to add namespaces"
msgstr "Autentificați-vă pentru a adăuga spații de nume"
msgid "Integrations|Standard"
-msgstr ""
+msgstr "Standard"
msgid "Integrations|There are no projects using custom settings"
-msgstr ""
+msgstr "Nu există proiecte care să utilizeze setări personalizate"
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 "Această integrare funcționează numai cu GitLab.com. Adăugarea unui spațiu de nume funcționează numai în browserele care permit cookie-uri între site-uri. %{linkStart}Aflați mai multe%{linkEnd}."
msgid "Integrations|This integration, and inheriting projects were reset."
-msgstr ""
+msgstr "Această integrare și proiectele moștenite au fost resetate."
msgid "Integrations|To keep this project going, create a new issue."
-msgstr ""
+msgstr "Pentru a continua acest proiect, creați o nouă problemă."
msgid "Integrations|Use custom settings"
-msgstr ""
+msgstr "Utilizați setările personalizate"
msgid "Integrations|Use default settings"
-msgstr ""
+msgstr "Utilizați setările implicite"
msgid "Integrations|You can close this window."
msgstr "Puteți închide această fereastră."
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
-msgstr ""
+msgstr "Puteți folosi acest alias în comenzile dvs. Slack"
msgid "Integrations|You haven't activated any integrations yet."
-msgstr ""
+msgstr "Nu ați activat încă nicio integrare."
msgid "Integrations|You must have owner or maintainer permissions to link namespaces."
msgstr "Trebuie să aveți permisiuni de proprietar sau de întreținător pentru a conecta spații de nume."
msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
-msgstr ""
+msgstr "Trebuie să utilizați un %{linkStart}browser compatibil%{linkEnd} pentru a utiliza aplicația GitLab pentru Jira."
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
+msgstr "Acum ar trebui să vedeți activitatea GitLab.com în problemele Jira Cloud. %{linkStart}Învățați mai multe%{linkEnd}"
msgid "Integrations|You've activated every integration 🎉"
-msgstr ""
+msgstr "Ați activat fiecare integrare 🎉"
msgid "Integrations|Your browser is not supported"
-msgstr ""
+msgstr "Browserul dvs. nu este acceptat"
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
-msgstr ""
+msgstr "Problemele ZenTao se afișează aici atunci când creați probleme în proiectul dvs. în ZenTao."
msgid "Integrations|can't exceed %{recipients_limit}"
-msgstr ""
+msgstr "nu poate depăși %{recipients_limit}"
msgid "Interactive mode"
msgstr ""
msgid "Interested parties can even contribute by pushing commits if they want to."
-msgstr ""
+msgstr "Părțile interesate pot chiar să contribuie făcând push de commit-uri, dacă doresc."
msgid "Internal"
msgstr ""
@@ -20599,9 +20878,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20611,14 +20887,17 @@ 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 ""
+msgstr "Introdus în GitLab 13.1, înainte de a utiliza %{reindexing_link_start}reindexarea cu indisponibilitate-zero%{link_end} și %{migrations_link_start}migrările de Căutare avansată%{link_end}, trebuie să %{recreate_link_start}vă recreați indexul%{link_end}."
msgid "Introducing Your DevOps Reports"
-msgstr ""
+msgstr "Prezentarea rapoartelor dvs. DevOps"
msgid "Invalid Insights config file detected"
msgstr ""
@@ -20630,7 +20909,7 @@ msgid "Invalid URL"
msgstr ""
msgid "Invalid URL: %{url}"
-msgstr ""
+msgstr "URL invalid: %{url}"
msgid "Invalid container_name"
msgstr ""
@@ -20662,6 +20941,9 @@ msgstr "Format de fișier nevalid cu tipul de fișier specificat"
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20669,7 +20951,7 @@ msgid "Invalid import params"
msgstr ""
msgid "Invalid input, please avoid emojis"
-msgstr ""
+msgstr "Intrare invalidă, vă rugăm să evitați emojiurile"
msgid "Invalid login or password"
msgstr ""
@@ -20678,10 +20960,10 @@ msgid "Invalid period"
msgstr ""
msgid "Invalid pin code."
-msgstr ""
+msgstr "Cod PIN invalid."
msgid "Invalid pod_name"
-msgstr ""
+msgstr "pod_name invalid"
msgid "Invalid policy type"
msgstr "Tip de politică invalid"
@@ -20714,10 +20996,10 @@ msgid "Investigate vulnerability: %{title}"
msgstr ""
msgid "Invisible Captcha"
-msgstr ""
+msgstr "Captcha invizibil"
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 "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 ""
@@ -20737,50 +21019,47 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr "E-mail invitație a fost preluat deja"
-
msgid "Invite members"
msgstr ""
msgid "InviteEmail|%{inviter} invited you to join the %{project_or_group_name} %{project_or_group} as a %{role}"
-msgstr ""
+msgstr "%{inviter} v-a invitat să vă alăturați %{project_or_group_name} %{project_or_group} ca %{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} v-a invitat să vă alăturați %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} ca %{role}"
msgid "InviteEmail|%{project_or_group} details"
-msgstr ""
+msgstr "Detaliile despre %{project_or_group}"
msgid "InviteEmail|Groups assemble related projects together and grant members access to several projects at once."
-msgstr ""
+msgstr "Grupurile reunesc proiecte înrudite și acordă membrilor acces la mai multe proiecte în același timp."
msgid "InviteEmail|Join now"
-msgstr ""
+msgstr "Înscrieți-vă acum"
msgid "InviteEmail|Join your team on GitLab! %{inviter} invited you to %{project_or_group_name}"
-msgstr "Alăturați-vă echipei dvs. pe GitLab! %{inviter} v-a invitat în %{project_or_group_name}"
+msgstr "Alăturați-vă echipei dvs. pe GitLab! %{inviter} v-a invitat la %{project_or_group_name}"
msgid "InviteEmail|Join your team on GitLab! You are invited to %{project_or_group_name}"
-msgstr "Alăturați-vă echipei dvs. pe GitLab! Sunteți invitat în %{project_or_group_name}"
+msgstr "Alăturați-vă echipei dvs. pe GitLab! Sunteți invitat la %{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 ""
+msgstr "Proiectele sunt folosite pentru a găzdui și colabora la cod, pentru a urmări problemele și pentru a construi, testa și implementa în mod continuu aplicația dvs. cu GitLab CI/CD integrat."
msgid "InviteEmail|What's it about?"
-msgstr ""
+msgstr "Despre ce este vorba?"
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 ""
+msgstr "Sunteți invitat să vă alăturați la %{strong_start}%{project_or_group_name}%{strong_end}%{br_tag}%{project_or_group} ca %{role}"
msgid "InviteEmail|You have been invited to join the %{project_or_group_name} %{project_or_group} as a %{role}"
-msgstr ""
+msgstr "Ați fost invitat să vă alăturați la %{project_or_group_name} %{project_or_group} ca %{role}"
msgid "InviteEmail|You were assigned the following tasks:"
-msgstr ""
+msgstr "Vi s-au atribuit următoarele sarcini:"
msgid "InviteEmail|and has assigned you the following tasks:"
-msgstr ""
+msgstr "și v-a atribuit următoarele sarcini:"
msgid "InviteMembersBanner|Collaborate with your team"
msgstr ""
@@ -20792,88 +21071,88 @@ msgid "InviteMembersBanner|We noticed that you haven't invited anyone to this gr
msgstr ""
msgid "InviteMembersModal|%{linkStart}Read more%{linkEnd} about role permissions"
-msgstr "%{linkStart}Citiți mai multe%{linkEnd} despre permisiuni rol"
+msgstr "%{linkStart}Citiți mai multe%{linkEnd} despre permisiunile rolurilor"
msgid "InviteMembersModal|Access expiration date (optional)"
-msgstr ""
+msgstr "Data de expirare a accesului (opțional)"
msgid "InviteMembersModal|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "InviteMembersModal|Choose a project for the issues"
-msgstr ""
+msgstr "Alegeți un proiect pentru probleme"
msgid "InviteMembersModal|Close invite team members"
-msgstr ""
+msgstr "Închideți invitația membrilor echipei"
msgid "InviteMembersModal|Congratulations on creating your project, you're almost there!"
-msgstr ""
+msgstr "Felicitări pentru crearea proiectului dvs., sunteți aproape acolo!"
msgid "InviteMembersModal|Create issues for your new team member to work on (optional)"
-msgstr ""
+msgstr "Creați probleme la care să lucreze noul membru al echipei dumneavoastră (opțional)"
msgid "InviteMembersModal|GitLab is better with colleagues!"
-msgstr ""
+msgstr "GitLab este mai bun împreună cu colegii!"
msgid "InviteMembersModal|GitLab member or email address"
-msgstr ""
+msgstr "Membru GitLab sau adresă de e-mail"
msgid "InviteMembersModal|How about inviting a colleague or two to join you?"
-msgstr ""
+msgstr "Ce-ar fi să invitați un coleg sau doi să vi se alăture?"
msgid "InviteMembersModal|Invite"
-msgstr ""
+msgstr "Invită"
msgid "InviteMembersModal|Invite a group"
-msgstr ""
+msgstr "Invitați un grup"
msgid "InviteMembersModal|Invite members"
-msgstr ""
+msgstr "Invitați membri"
msgid "InviteMembersModal|Members were successfully added"
-msgstr ""
+msgstr "Membrii au fost adăugați cu succes"
msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
-msgstr ""
+msgstr "Membrii noi nu vor putea participa. Puteți să vă gestionați membrii, eliminându-i pe cei de care nu mai aveți nevoie."
msgid "InviteMembersModal|Search for a group to invite"
-msgstr ""
+msgstr "Căutați un grup pe care să-l invitați"
msgid "InviteMembersModal|Select a group to invite"
-msgstr ""
+msgstr "Selectați un grup de invitat"
msgid "InviteMembersModal|Select a role"
-msgstr ""
+msgstr "Selectați un rol"
msgid "InviteMembersModal|Select members or type email addresses"
-msgstr ""
+msgstr "Selectați membrii sau tastați adresele de e-mail"
msgid "InviteMembersModal|Something went wrong"
msgstr "Ceva nu a mers bine"
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 "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 ""
+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."
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
-msgstr ""
+msgstr "Aveți loc doar pentru încă %{count} %{members} în %{name}"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
-msgstr ""
+msgstr "Invitați un grup la grupul %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Invitați un grup la proiectul %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} group."
-msgstr ""
+msgstr "Invitați membri în grupul %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Invitați membri la proiectul %{strongStart}%{name}%{strongEnd}."
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
-msgstr ""
+msgstr "Ați atins limita de %{count} %{members} pentru %{name}"
msgid "InviteMembers|Invite a group"
msgstr ""
@@ -21044,7 +21323,7 @@ msgid "Issue first deployed to production"
msgstr ""
msgid "Issue has been promoted to incident"
-msgstr ""
+msgstr "Problema a fost promovată la incident"
msgid "Issue label"
msgstr ""
@@ -21116,7 +21395,7 @@ msgid "IssueBoards|Switch board"
msgstr ""
msgid "IssueList|created %{timeAgoString} by %{user}"
-msgstr ""
+msgstr "creată %{timeAgoString} de %{user}"
msgid "IssueTracker|Custom issue tracker"
msgstr ""
@@ -21143,10 +21422,10 @@ msgid "IssueTracker|The URL to view an issue in the external issue tracker. Must
msgstr ""
msgid "IssueTracker|Use Bugzilla as this project's issue tracker."
-msgstr ""
+msgstr "Folosiți Bugzilla ca tracker de probleme al acestui proiect."
msgid "IssueTracker|Use Bugzilla as this project's issue tracker. %{docs_link}"
-msgstr ""
+msgstr "Folosiți Bugzilla ca tracker de probleme al acestui proiect. %{docs_link}"
msgid "IssueTracker|Use IBM Engineering Workflow Management as this project's issue tracker."
msgstr ""
@@ -21182,10 +21461,10 @@ msgid "Issues and merge requests"
msgstr ""
msgid "Issues are being rebalanced at the moment, so manual reordering is disabled."
-msgstr ""
+msgstr "În prezent, problemele sunt în curs de reechilibrare, de aceea reordonarea manuală este dezactivată."
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
-msgstr ""
+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 ""
@@ -21200,7 +21479,7 @@ msgid "Issues with label %{label}"
msgstr ""
msgid "Issues with no epic assigned"
-msgstr ""
+msgstr "Probleme fără nicio epică atribuită"
msgid "Issues, merge requests, pushes, and comments."
msgstr ""
@@ -21239,7 +21518,7 @@ msgid "It is not possible to %{action} files that are stored in LFS using the we
msgstr ""
msgid "It looks like you have some draft commits in this branch."
-msgstr "Se pare că aveți câteva schițe de commit-uri în această ramură."
+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 ""
@@ -21254,7 +21533,7 @@ msgid "It seems like the Dependency Scanning job ran successfully, but no depend
msgstr "Se pare că jobul de Scanare a dependențelor a rulat cu succes, dar nu au fost detectate dependențe în proiectul dvs."
msgid "It seems that there is currently no available data for code coverage"
-msgstr ""
+msgstr "Se pare că în prezent nu există date disponibile pentru coverage de cod."
msgid "It's you"
msgstr ""
@@ -21263,7 +21542,7 @@ msgid "Italic text"
msgstr ""
msgid "Iteration"
-msgstr ""
+msgstr "iterație"
msgid "Iteration changed to"
msgstr ""
@@ -21278,154 +21557,166 @@ msgid "Iteration updated"
msgstr ""
msgid "Iterations"
-msgstr ""
+msgstr "Iteratii"
msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
-msgstr ""
+msgstr "Adăugați o durată și un număr de iterații viitoare pentru a converti această cadență în programarea automată."
msgid "Iterations|Add iteration"
-msgstr ""
+msgstr "Adăugați iterația"
msgid "Iterations|All"
-msgstr ""
+msgstr "Toate"
msgid "Iterations|Cadence configuration is invalid."
-msgstr ""
+msgstr "Configurația cadenței nu este valabilă."
msgid "Iterations|Cadence name"
+msgstr "Numele cadenței"
+
+msgid "Iterations|Cancel"
msgstr ""
msgid "Iterations|Couldn't find iteration cadence"
-msgstr ""
+msgstr "Nu am putut găsi cadența iterației"
msgid "Iterations|Create cadence"
+msgstr "Creați cadență"
+
+msgid "Iterations|Create iteration"
msgstr ""
msgid "Iterations|Delete cadence"
-msgstr ""
+msgstr "Ștergeți cadența"
msgid "Iterations|Delete iteration cadence?"
-msgstr ""
+msgstr "Ștergeți cadența iterațiilor?"
msgid "Iterations|Delete iteration?"
+msgstr "Ștergeți iterația?"
+
+msgid "Iterations|Description"
msgstr ""
msgid "Iterations|Done"
+msgstr "Făcut"
+
+msgid "Iterations|Due date"
msgstr ""
msgid "Iterations|Duration"
-msgstr ""
+msgstr "Durata"
msgid "Iterations|Edit cadence"
-msgstr ""
+msgstr "Editați cadența"
msgid "Iterations|Edit iteration"
msgstr "Editați iterația"
msgid "Iterations|Edit iteration cadence"
-msgstr ""
+msgstr "Editați cadența de iterație"
msgid "Iterations|Error loading iteration cadences."
-msgstr ""
+msgstr "Eroare la încărcarea cadențelor de iterație."
msgid "Iterations|Future iterations"
-msgstr ""
+msgstr "Iterații viitoare"
msgid "Iterations|Iteration cadences"
-msgstr "Cadențe iterații"
+msgstr "Cadențe de iterație"
msgid "Iterations|Iterations are a way to track issues over a period of time, allowing teams to also track velocity and volatility metrics."
-msgstr ""
+msgstr "Iterațiile sunt o modalitate de a urmări problemele pe un interval de timp, permițând echipelor să urmărească, de asemenea, velocitatea și volatilitatea metricilor."
msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
-msgstr ""
+msgstr "Iterațiile nu mai pot fi programate manual. Convertiți toate cadențele în programare automată pentru ca iterațiile dvs. să funcționeze conform așteptărilor."
msgid "Iterations|Learn more about automatic scheduling"
-msgstr ""
+msgstr "Aflați mai multe despre programarea automată"
msgid "Iterations|Move incomplete issues to the next iteration"
-msgstr ""
+msgstr "Mutați problemelor incomplete la următoarea iterație"
msgid "Iterations|New iteration"
-msgstr "Iterație nouă"
+msgstr "Noua iterație"
msgid "Iterations|New iteration cadence"
-msgstr ""
+msgstr "Cadență de iterație nouă"
msgid "Iterations|No closed iterations."
-msgstr ""
+msgstr "Nicio iterație închisă."
msgid "Iterations|No iteration cadences to show."
-msgstr ""
+msgstr "Nu există cadențe de iterație de afișat."
msgid "Iterations|No iterations found"
-msgstr ""
+msgstr "Nu s-au găsit iterații"
msgid "Iterations|No iterations in cadence."
-msgstr ""
+msgstr "Nu există iterații în cadență."
msgid "Iterations|No open iterations."
-msgstr ""
+msgstr "Nicio iterație deschisă."
msgid "Iterations|Number of future iterations you would like to have scheduled"
-msgstr ""
+msgstr "Numărul de iterații viitoare pe care ați dori să le programați"
msgid "Iterations|Open"
-msgstr ""
+msgstr "Deschise"
msgid "Iterations|Requires update"
-msgstr ""
+msgstr "Necesită actualizare"
msgid "Iterations|Roll over issues"
-msgstr ""
+msgstr "Trecerea peste probleme"
msgid "Iterations|Save changes"
-msgstr ""
+msgstr "Salvați modificările"
msgid "Iterations|Select duration"
-msgstr ""
+msgstr "Selectați durata"
msgid "Iterations|Select number"
-msgstr ""
+msgstr "Selectați numărul"
msgid "Iterations|Select start date"
-msgstr ""
+msgstr "Selectați data de începere"
msgid "Iterations|Some of your cadences need to be updated"
-msgstr ""
+msgstr "Unele dintre cadențele dvs. trebuie să fie actualizate"
msgid "Iterations|Start date"
-msgstr ""
+msgstr "Data de începere"
msgid "Iterations|The duration for each iteration (in weeks)"
-msgstr ""
+msgstr "Durata pentru fiecare iterație (în săptămâni)"
msgid "Iterations|The iteration has been deleted."
-msgstr ""
+msgstr "Iterația a fost ștearsă."
msgid "Iterations|The start date of your first iteration"
-msgstr ""
+msgstr "Data de început a primei iterații"
msgid "Iterations|This cadence requires an update"
-msgstr ""
+msgstr "Această cadență necesită o actualizare"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
-msgstr ""
+msgstr "Acest lucru va șterge cadența, precum și toate iterațiile din cadrul acesteia."
msgid "Iterations|This will remove the iteration from any issues that are assigned to it."
-msgstr ""
+msgstr "Acest lucru va elimina iterația din toate problemele care îi sunt atribuite."
msgid "Iterations|Title"
-msgstr ""
+msgstr "Titlu"
msgid "Iterations|Unable to find iteration cadence."
-msgstr ""
+msgstr "Nu se poate găsi cadența iterațiilor."
msgid "Iterations|Unable to find iteration."
-msgstr ""
+msgstr "Nu se poate găsi iterația."
msgid "Iterations|Unable to save cadence. Please try again."
-msgstr ""
+msgstr "Nu se poate salva cadența. Vă rugăm să încercați din nou."
msgid "Iteration|Dates cannot overlap with other existing Iterations within this group"
msgstr ""
@@ -21436,9 +21727,6 @@ msgstr "Datele nu se pot suprapune cu alte iteraÈ›ii în cadenÈ›a acestei iteraÈ
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21473,7 +21761,7 @@ 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 ""
+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 ""
@@ -21544,7 +21832,7 @@ msgstr ""
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."
-msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21560,7 +21848,7 @@ msgid "JiraService|Enter new password or API token"
msgstr ""
msgid "JiraService|Events for %{noteable_model_name} are disabled."
-msgstr ""
+msgstr "Evenimentele pentru %{noteable_model_name} sunt dezactivate."
msgid "JiraService|Failed to load Jira issue. View the issue in Jira, or reload the page."
msgstr "Nu s-a reușit încărcarea problemei Jira. Vizualizați problema în Jira sau reîncărcați pagina."
@@ -21595,9 +21883,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr "Comentariile Jira sunt create atunci când se face referire la o problemă într-un merge request."
-msgid "JiraService|Jira issue type"
-msgstr "Tipul problemei Jira"
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21617,7 +21902,7 @@ msgid "JiraService|Password or API token"
msgstr ""
msgid "JiraService|Project key changed, refresh list"
-msgstr ""
+msgstr "Cheie proiectului s-a schimbat, reîmprospătați lista"
msgid "JiraService|Project key is required to generate issue types"
msgstr "Cheia proiectului este necesară pentru a genera tipuri de probleme"
@@ -21653,13 +21938,13 @@ msgid "JiraService|Use a password for server version and an API token for cloud
msgstr ""
msgid "JiraService|Use a username for server version and an email for cloud version."
-msgstr ""
+msgstr "Utilizați un nume de utilizator pentru versiunea server și un e-mail pentru versiunea cloud."
msgid "JiraService|Use custom transitions"
msgstr ""
msgid "JiraService|Username or Email"
-msgstr ""
+msgstr "Nume de utilizator sau e-mail"
msgid "JiraService|Using Jira for issue tracking?"
msgstr ""
@@ -21671,7 +21956,7 @@ msgid "JiraService|Web URL"
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 "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)."
msgid "JiraService|Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues."
msgstr ""
@@ -21679,6 +21964,9 @@ 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 "Lucrați la problemele Jira fără să părăsiți GitLab. Adăugați un meniu Jira pentru a accesa o listă doar în citire a problemelor dvs. Jira. %{jira_issues_link_start}Aflați mai multe.%{link_end}"
+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 ""
@@ -21733,173 +22021,179 @@ 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|Are you sure you want to proceed?"
+msgid "Jobs|All"
msgstr ""
+msgid "Jobs|Are you sure you want to proceed?"
+msgstr "Sunteți sigur că vreți să continuați?"
+
msgid "Jobs|Are you sure you want to retry this job?"
-msgstr ""
+msgstr "Sunteți sigur că vreți să încercați din nou acest job?"
msgid "Jobs|Create CI/CD configuration file"
-msgstr ""
+msgstr "Creați fișierul de configurare CI/CD"
msgid "Jobs|Filter jobs"
+msgstr "Filtrați joburile"
+
+msgid "Jobs|Finished"
msgstr ""
msgid "Jobs|Job is stuck. Check runners."
-msgstr ""
+msgstr "Jobul este blocat. Verificați executorii."
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 ""
+msgstr "Joburile sunt blocurile de construcție ale unui pipeline GitLab CI/CD. Fiecare job are o sarcină specifică, cum ar fi testarea codului. Pentru a configura joburi într-un pipeline CI/CD, adăugați un fișier de configurare CI/CD la proiectul dvs."
msgid "Jobs|No jobs to show"
-msgstr ""
+msgstr "Niciun job de afișat"
msgid "Jobs|Raw text search is not currently supported for the jobs filtered search feature. Please use the available search tokens."
-msgstr ""
+msgstr "Căutarea în text brut nu este acceptată în prezent pentru funcția de căutare filtrată a joburilor. Vă rugăm să utilizați tokenurile de căutare disponibile."
msgid "Jobs|Status"
-msgstr ""
+msgstr "Status"
msgid "Jobs|Use jobs to automate your tasks"
-msgstr ""
+msgstr "Utilizați joburi pentru a vă automatiza sarcinile"
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 ""
+msgstr "Sunteți pe cale să încercați din nou un job care a eșuat deoarece a încercat să implementeze cod mai vechi decât cea mai recentă implementare. Reîncercarea acestui job poate duce la suprascrierea mediului cu codul sursă mai vechi."
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
-msgstr ""
+msgstr "Job|%{boldStart}Pipeline%{boldEnd} %{id}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source}"
-msgstr ""
+msgstr "%{boldStart}Pipeline%{boldEnd} %{id} pentru %{mrId} cu %{source}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{mrId} with %{source} into %{target}"
-msgstr ""
+msgstr "%{boldStart}Pipeline%{boldEnd} %{id} pentru %{mrId} cu %{source} în %{target}"
msgid "Job|%{boldStart}Pipeline%{boldEnd} %{id} for %{ref}"
-msgstr ""
+msgstr "%{boldStart}Pipeline%{boldEnd} %{id} pentru %{ref}"
msgid "Job|Are you sure you want to erase this job log and artifacts?"
-msgstr ""
+msgstr "Sunteți sigur că doriți să ștergeți acest jurnal de job și artefactele?"
msgid "Job|Browse"
-msgstr ""
+msgstr "Navigare"
msgid "Job|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "Job|Canceled"
-msgstr ""
+msgstr "Anulat"
msgid "Job|Complete Raw"
msgstr "Brut complet"
msgid "Job|Created"
-msgstr ""
+msgstr "Creat"
msgid "Job|Download"
-msgstr ""
+msgstr "Descărcare"
msgid "Job|Erase job log and artifacts"
-msgstr ""
+msgstr "Ștergeți jurnalul jobului și artefactele"
msgid "Job|Failed"
-msgstr ""
+msgstr "Eșuat"
msgid "Job|Finished at"
-msgstr ""
+msgstr "Terminat la"
msgid "Job|Job artifacts"
-msgstr ""
+msgstr "Artefacte de job"
msgid "Job|Job has been erased"
-msgstr ""
+msgstr "Jobul a fost șters"
msgid "Job|Job has been erased by %{userLink}"
msgstr "Jobul a fost șters de %{userLink}"
msgid "Job|Keep"
-msgstr ""
+msgstr "Păstrați"
msgid "Job|Manual"
-msgstr ""
+msgstr "Manual"
msgid "Job|Passed"
-msgstr ""
+msgstr "A trecut"
msgid "Job|Pending"
-msgstr ""
+msgstr "În așteptare"
msgid "Job|Preparing"
-msgstr ""
+msgstr "În pregătire"
msgid "Job|Retry"
-msgstr ""
+msgstr "Reîncercați"
msgid "Job|Running"
-msgstr ""
+msgstr "Rulează"
msgid "Job|Scheduled"
-msgstr ""
+msgstr "Programat"
msgid "Job|Scroll to bottom"
-msgstr ""
+msgstr "Derulați până jos"
msgid "Job|Scroll to top"
-msgstr ""
+msgstr "Derulați până sus"
msgid "Job|Show complete raw"
msgstr "Afișați brut complet"
msgid "Job|Skipped"
-msgstr ""
+msgstr "Sărit"
msgid "Job|Status"
-msgstr ""
+msgstr "Status"
msgid "Job|The artifacts were removed"
-msgstr ""
+msgstr "Artefactele au fost eliminate"
msgid "Job|The artifacts will be removed"
-msgstr ""
+msgstr "Artefactele vor fi eliminate"
msgid "Job|These artifacts are the latest. They will not be deleted (even if expired) until newer artifacts are available."
-msgstr ""
+msgstr "Aceste artefacte sunt cele mai recente. Ele nu vor fi șterse (chiar dacă au expirat) până când nu sunt disponibile artefacte mai noi."
msgid "Job|This job failed because the necessary resources were not successfully created."
-msgstr ""
+msgstr "Acest job a eșuat deoarece resursele necesare nu au fost create cu succes."
msgid "Job|This job is stuck because the project doesn't have any runners online assigned to it."
-msgstr ""
+msgstr "Acest job este blocat, deoarece proiectul nu are niciun executor online atribuit."
msgid "Job|This job is stuck because you don't have any active runners online or available with any of these tags assigned to them:"
-msgstr ""
+msgstr "Acest job este blocat pentru că nu aveți niciun executor online activ sau disponibil cu oricare dintre aceste etichete atribuite lor:"
msgid "Job|This job is stuck because you don't have any active runners that can run this job."
-msgstr ""
+msgstr "Acest job este blocat pentru că nu aveți niciun executor activ care să poată rula acest job."
msgid "Job|Waiting for resource"
-msgstr ""
+msgstr "În așteptare de resurse"
msgid "Job|allowed to fail"
-msgstr ""
+msgstr "permis să eșueze"
msgid "Job|delayed"
-msgstr ""
+msgstr "întârziat"
msgid "Job|manual"
-msgstr ""
+msgstr "manual"
msgid "Job|triggered"
-msgstr ""
+msgstr "declanșat"
msgid "Join Zoom meeting"
-msgstr ""
+msgstr "Alăturați-vă reuniunii Zoom"
msgid "Join a project"
-msgstr ""
+msgstr "Alăturați-vă unui proiect"
msgid "Join your team on GitLab and contribute to an existing project"
-msgstr ""
+msgstr "Alăturați-vă echipei dvs. pe GitLab și contribuiți la un proiect existent"
msgid "Joined %{time_ago}"
msgstr ""
@@ -21929,7 +22223,7 @@ msgid "Just me"
msgstr ""
msgid "K8s pod health"
-msgstr ""
+msgstr "Sănătatea pod-ului K8s"
msgid "KEY"
msgstr ""
@@ -21947,7 +22241,7 @@ msgid "Keep editing"
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 ""
+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ă."
msgid "Kerberos access denied"
msgstr ""
@@ -22049,7 +22343,7 @@ msgid "LDAP settings updated"
msgstr ""
msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes."
-msgstr ""
+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 ""
@@ -22127,7 +22421,7 @@ msgid "Language"
msgstr ""
msgid "Large File Storage"
-msgstr ""
+msgstr "Large File Storage"
msgid "Last %d day"
msgid_plural "Last %d days"
@@ -22157,7 +22451,7 @@ msgid "Last Activity"
msgstr "Ultima activitate"
msgid "Last Name"
-msgstr ""
+msgstr "Numele de familie"
msgid "Last Pipeline"
msgstr ""
@@ -22166,7 +22460,7 @@ msgid "Last Seen"
msgstr ""
msgid "Last Sync"
-msgstr ""
+msgstr "Ultima sincronizare"
msgid "Last Used"
msgstr ""
@@ -22277,14 +22571,17 @@ msgid "Launch a ready-to-code development environment for your project."
msgstr ""
msgid "Layout|Fixed"
-msgstr ""
+msgstr "Fixă"
msgid "Layout|Fluid"
-msgstr ""
+msgstr "Fluidă"
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22358,7 +22655,7 @@ msgid "Learn more about seats owed"
msgstr "Aflați mai multe despre seat-urile datorate"
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 ""
+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 ""
@@ -22370,82 +22667,82 @@ msgid "Learn more."
msgstr ""
msgid "LearnGitLab|%{percentage}%{percentSymbol} completed"
-msgstr ""
+msgstr "%{percentage}%{percentSymbol} completat"
msgid "LearnGitLab|Add code owners"
-msgstr ""
+msgstr "Adăugați proprietari de coduri"
msgid "LearnGitLab|Add merge request approval"
-msgstr ""
+msgstr "Adăugați aprobarea de merge request"
msgid "LearnGitLab|Complete these tasks first so you can enjoy GitLab's features to their fullest:"
-msgstr ""
+msgstr "Finalizați mai întâi aceste sarcini pentru a vă putea bucura la maximum de funcțiile GitLab:"
msgid "LearnGitLab|Create a workflow for your new workspace, and learn how GitLab features work together:"
-msgstr ""
+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 ""
+msgstr "Creați o problemă"
msgid "LearnGitLab|Create or import a repository"
-msgstr ""
+msgstr "Creați sau importați un repozitoriu"
msgid "LearnGitLab|Create or import your first repository into your new project."
-msgstr ""
+msgstr "Creați sau importați primul dvs. repozitoriu în noul proiect."
msgid "LearnGitLab|Create/import issues (tickets) to collaborate on ideas and plan work."
-msgstr ""
+msgstr "Creați/importați probleme (tichete) pentru a colabora la idei și a planifica munca."
msgid "LearnGitLab|Deploy"
-msgstr ""
+msgstr "Distribuire"
msgid "LearnGitLab|Enable require merge approvals"
-msgstr ""
+msgstr "Activați aprobările de îmbinare obligatorii"
msgid "LearnGitLab|GitLab works best as a team. Invite your colleague to enjoy all features."
-msgstr ""
+msgstr "GitLab funcționează cel mai bine ca echipă. Invitați-vă colegul să se bucure de toate funcțiile."
msgid "LearnGitLab|Invite your colleagues"
-msgstr ""
+msgstr "Invitați-vă colegii"
msgid "LearnGitLab|Learn GitLab"
-msgstr ""
+msgstr "Învățați GitLab"
msgid "LearnGitLab|Plan and execute"
-msgstr ""
+msgstr "Planificați și executați"
msgid "LearnGitLab|Prevent unexpected changes to important assets by assigning ownership of files and paths."
-msgstr ""
+msgstr "Preveniți modificările neașteptate ale activelor importante prin atribuirea dreptului de proprietate asupra fișierelor și căilor."
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 ""
+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 a comite modificări și pentru a vă implementa proiectul."
msgid "LearnGitLab|Review and edit proposed changes to source code."
-msgstr ""
+msgstr "Revizuiți și editați modificările propuse la codul sursă."
msgid "LearnGitLab|Route code reviews to the right reviewers, every time."
-msgstr ""
+msgstr "Direcționați revizuirile de cod către recenzenții potriviți, de fiecare dată."
msgid "LearnGitLab|Run a Security scan using CI/CD"
-msgstr ""
+msgstr "Executați o scanare de securitate folosind CI/CD"
msgid "LearnGitLab|Save time by automating your integration and deployment tasks."
-msgstr ""
+msgstr "Economisiți timp prin automatizarea sarcinilor de integrare și implementare."
msgid "LearnGitLab|Scan your code to uncover vulnerabilities before deploying."
-msgstr ""
+msgstr "Scanați codul dvs. pentru a descoperi vulnerabilitățile înainte de implementare."
msgid "LearnGitLab|Set up CI/CD"
-msgstr ""
+msgstr "Configurați CI/CD"
msgid "LearnGitLab|Set up your workspace"
-msgstr ""
+msgstr "Configurați-vă spațiul de lucru"
msgid "LearnGitLab|Set-up CI/CD"
-msgstr ""
+msgstr "Configurați CI/CD"
msgid "LearnGitLab|Start a free Ultimate trial"
-msgstr ""
+msgstr "Începeți o încercare gratuită Ultimate"
msgid "LearnGitLab|Submit a merge request"
msgstr "Trimiteți un merge request"
@@ -22454,24 +22751,30 @@ msgid "LearnGitLab|Submit a merge request (MR)"
msgstr "Trimiteți un merge request (MR)"
msgid "LearnGitLab|Try GitLab Ultimate for free"
-msgstr ""
+msgstr "Încercați GitLab Ultimate gratuit"
msgid "LearnGitLab|Try all GitLab features for 30 days, no credit card required."
-msgstr ""
+msgstr "Încercați toate funcțiile GitLab timp de 30 de zile, fără a fi nevoie de un card de credit."
msgid "LearnGitLab|Use your new GitLab workflow to deploy your application, monitor its health, and keep it secure:"
-msgstr ""
+msgstr "Folosiți-vă noul flux de lucru GitLab pentru a vă implementa aplicația, a-i monitoriza starea de sănătate și pentru a o menține în siguranță:"
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|Contact your administrator to start a free Ultimate trial."
msgstr ""
msgid "LearnGitlab|Creating your onboarding experience..."
-msgstr ""
+msgstr "Crearea experienței dvs. de integrare ..."
msgid "LearnGitlab|Ok, let's go"
-msgstr ""
+msgstr "Ok, hai să mergem"
msgid "LearnGitlab|Trial only"
+msgstr "Numai evaluare"
+
+msgid "LearnGitlab|View administrator list"
msgstr ""
msgid "Leave"
@@ -22496,6 +22799,9 @@ msgid "Leaving this setting enabled is recommended."
msgstr "Este recomandat să lăsați această setare activată."
msgid "Legacy burndown chart"
+msgstr "Graficul burndown legacy"
+
+msgid "Legacy license"
msgstr ""
msgid "Less Details"
@@ -22514,136 +22820,136 @@ msgid "License Compliance"
msgstr "Conformitatea licenței"
msgid "License Compliance| Used by"
-msgstr ""
+msgstr "Folosită de"
msgid "License compliance"
-msgstr ""
+msgstr "Conformitatea licenței"
msgid "License file"
msgstr ""
msgid "License key"
-msgstr ""
+msgstr "Cheia de licență"
msgid "License overview"
msgstr ""
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are active"
-msgstr ""
+msgstr "%{docLinkStart}Aprobările de licență%{docLinkEnd} sunt active"
msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inactive"
-msgstr ""
+msgstr "%{docLinkStart}Aprobările de licență%{docLinkEnd} sunt inactive"
msgid "LicenseCompliance|Acceptable for use in this project"
-msgstr ""
+msgstr "Acceptabilă pentru utilizare în acest proiect"
msgid "LicenseCompliance|Acceptable license to be used in the project"
-msgstr ""
+msgstr "Licență acceptabilă pentru a fi utilizată în proiect"
msgid "LicenseCompliance|Add license and related policy"
-msgstr ""
+msgstr "Adăugați licența și politica asociată"
msgid "LicenseCompliance|Add license policy"
-msgstr ""
+msgstr "Adăugați politica de licență"
msgid "LicenseCompliance|Allow"
-msgstr ""
+msgstr "Permiteți"
msgid "LicenseCompliance|Allowed"
-msgstr ""
+msgstr "Permisă"
msgid "LicenseCompliance|Denied"
-msgstr ""
+msgstr "Refuzat"
msgid "LicenseCompliance|Deny"
-msgstr ""
+msgstr "Refuzați"
msgid "LicenseCompliance|Disallow merge request if detected and will instruct developer to remove"
-msgstr ""
+msgstr "Va refuza merge request-ul dacă este detectată și va instrui dezvoltatorul să o înlăture"
msgid "LicenseCompliance|Learn more about %{linkStart}License Approvals%{linkEnd}"
-msgstr ""
+msgstr "Aflați mai multe despre %{linkStart}Aprobările de licență%{linkEnd}"
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] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d încălcare a licenței și a politicii numai pentru ramura sursă"
+msgstr[1] "Conformitatea licenței a detectat %d încălcări a licenței și a politicii numai pentru ramura sursă"
+msgstr[2] "Conformitatea licenței a detectat %d de încălcări a licenței și a politicii numai pentru ramura sursă"
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] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d încălcare a licenței și a politicii numai pentru ramura sursă; este necesară aprobarea"
+msgstr[1] "Conformitatea licenței a detectat %d încălcări a licenței și a politicii numai pentru ramura sursă; este necesară aprobarea"
+msgstr[2] "Conformitatea licenței a detectat %d de încălcări a licenței și a politicii numai pentru ramura sursă; este necesară aprobarea"
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] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d licență doar 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ă"
msgid "LicenseCompliance|License Compliance detected %d new license"
msgid_plural "LicenseCompliance|License Compliance detected %d new licenses"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d licență nouă"
+msgstr[1] "Conformitatea licenței a detectat %d licențe noi"
+msgstr[2] "Conformitatea licenței a detectat %d de licențe noi"
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] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d nouă încălcare a licenței și a politicii"
+msgstr[1] "Conformitatea licenței a detectat %d noi încălcări ale licențelor și politicii"
+msgstr[2] "Conformitatea licenței a detectat %d de noi încălcări ale licențelor și politicii"
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] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licențelor a detectat %d nouă încălcare a licenței și a politicii; este necesară aprobarea"
+msgstr[1] "Conformitatea licenței a detectat %d noi încălcări ale licențelor și a politicii; este necesară aprobarea"
+msgstr[2] "Conformitatea licenței a detectat %d de noi încălcări ale licențelor și a politicii; este necesară aprobarea"
msgid "LicenseCompliance|License Compliance detected %d removed license"
msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Conformitatea licenței a detectat %d licență ștearsă"
+msgstr[1] "Conformitatea licenței a detectat %d licențe șterse"
+msgstr[2] "Conformitatea licenței a detectat %d de licențe șterse"
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
-msgstr ""
+msgstr "Conformitatea licenței nu a detectat nicio licență doar pentru branșa sursă"
msgid "LicenseCompliance|License Compliance detected no new licenses"
-msgstr ""
+msgstr "Conformitatea licenței nu a detectat nicio licență nouă"
msgid "LicenseCompliance|License name"
-msgstr ""
+msgstr "Numele licenței"
msgid "LicenseCompliance|No policy matches this license"
-msgstr ""
+msgstr "Nicio politică nu se potrivește cu această licență"
msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
-msgstr ""
+msgstr "Nu sunt conforme cu politicile proiectului și ar trebui eliminate."
msgid "LicenseCompliance|Remove license"
-msgstr ""
+msgstr "Înlăturați licența"
msgid "LicenseCompliance|Remove license?"
-msgstr ""
+msgstr "Înlăturați licența?"
msgid "LicenseCompliance|There are currently no policies in this project."
-msgstr ""
+msgstr "În prezent nu există politici în acest proiect."
msgid "LicenseCompliance|There are currently no policies that match in this project."
-msgstr ""
+msgstr "În prezent, nu există politici care să corespundă acestui proiect."
msgid "LicenseCompliance|This license already exists in this project."
-msgstr ""
+msgstr "Această licență există deja în acest proiect."
msgid "LicenseCompliance|Uncategorized"
-msgstr ""
+msgstr "Neclasificate"
msgid "LicenseCompliance|Update approvals"
-msgstr ""
+msgstr "Actualizați aprobările"
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
-msgstr ""
+msgstr "Sunteți pe cale să eliminați licența, %{name}, din acest proiect."
msgid "LicenseManagement|Allowed"
msgstr ""
@@ -22661,7 +22967,7 @@ msgid "Licensed Features"
msgstr ""
msgid "Licensed to:"
-msgstr ""
+msgstr "Licențiat pentru:"
msgid "Licenses"
msgstr ""
@@ -22679,12 +22985,9 @@ msgid "Licenses|Components"
msgstr ""
msgid "Licenses|Detected in Project"
-msgstr ""
-
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
+msgstr "Detectate în proiect"
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22715,7 +23018,7 @@ msgid "Licenses|Policy violation: denied"
msgstr ""
msgid "Licenses|Specified policies in this project"
-msgstr ""
+msgstr "Politicile specificate în acest proiect"
msgid "Licenses|The file could not be uploaded."
msgstr ""
@@ -22732,29 +23035,20 @@ msgstr "Vizualizați detaliile licenței pentru proiectul dvs."
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr "Limitați conectarea de la mai multe adrese IP"
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-msgstr ""
-
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."
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."
-msgid "Limit the number of namespaces and projects that can be indexed."
-msgstr "Limitați numărul de spații de nume și proiecte care pot fi indexate."
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
msgid "Limiting mode"
-msgstr ""
+msgstr "Modul restricționat"
msgid "Line changes"
msgstr ""
@@ -22907,7 +23201,7 @@ msgid "Lock %{issuableDisplayName}"
msgstr ""
msgid "Lock File?"
-msgstr ""
+msgstr "Blocați fișierul?"
msgid "Lock memberships to LDAP synchronization"
msgstr ""
@@ -22919,7 +23213,7 @@ msgid "Lock the discussion"
msgstr ""
msgid "Lock this %{issuableDisplayName}? Only %{strongStart}project members%{strongEnd} will be able to comment."
-msgstr ""
+msgstr "Blocați acest %{issuableDisplayName}? Numai %{strongStart}membrii proiectului%{strongEnd} vor putea comenta."
msgid "Lock to current projects"
msgstr ""
@@ -22936,9 +23230,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22946,37 +23237,37 @@ msgid "Locks the discussion."
msgstr ""
msgid "LoggedOutMarketingHeader|About GitLab"
-msgstr ""
+msgstr "Despre GitLab"
msgid "LoggedOutMarketingHeader|Explore GitLab"
-msgstr ""
+msgstr "Explorați GitLab"
msgid "LoggedOutMarketingHeader|Get started"
-msgstr ""
+msgstr "Începeți să lucrați"
msgid "LoggedOutMarketingHeader|GitLab Learn"
-msgstr ""
+msgstr "Învățați GitLab"
msgid "LoggedOutMarketingHeader|GitLab docs"
-msgstr ""
+msgstr "Documente GitLab"
msgid "LoggedOutMarketingHeader|GitLab: the DevOps platform"
-msgstr ""
+msgstr "GitLab: platforma DevOps"
msgid "LoggedOutMarketingHeader|How GitLab compares"
-msgstr ""
+msgstr "Cum se compară GitLab"
msgid "LoggedOutMarketingHeader|Install GitLab"
-msgstr ""
+msgstr "Instalați GitLab"
msgid "LoggedOutMarketingHeader|Pricing"
-msgstr ""
+msgstr "Prețuri"
msgid "LoggedOutMarketingHeader|Talk to an expert"
-msgstr ""
+msgstr "Discutați cu un expert"
msgid "Login"
-msgstr ""
+msgstr "Conectare"
msgid "Login with smartcard"
msgstr ""
@@ -22993,6 +23284,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23006,16 +23300,16 @@ msgid "MERGED"
msgstr ""
msgid "MR widget|Back to the merge request"
-msgstr ""
+msgstr "ÃŽnapoi la merge request"
msgid "MR widget|See your pipeline in action"
-msgstr ""
+msgstr "Vedeți pipeline-ul dvs. în acțiune"
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 "Aruncați o privire la %{beginnerLinkStart}Ghidul nostru pentru începători privind integrarea continuă%{beginnerLinkEnd} și la %{exampleLinkStart}exemplele noastre de GitLab CI/CD%{exampleLinkEnd} pentru a afla mai multe."
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 ""
+msgstr "Pipeline-ul vă va testa codul la fiecare commit. Un %{codeQualityLinkStart}raport de calitate a codului%{codeQualityLinkEnd} va apărea în merge request-urile dvs. pentru a vă avertiza cu privire la potențiale degradări ale codului."
msgid "MRApprovals|Approvals"
msgstr ""
@@ -23105,7 +23399,7 @@ msgid "Manage labels"
msgstr ""
msgid "Manage members"
-msgstr ""
+msgstr "Gestionați membrii"
msgid "Manage milestones"
msgstr ""
@@ -23141,7 +23435,7 @@ msgid "Manual"
msgstr ""
msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
-msgstr ""
+msgstr "Cadențele de iterație manuală sunt depășite. Sunt permise numai cadențele automate de iterație."
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr ""
@@ -23150,7 +23444,7 @@ msgid "Manually link this issue by adding it to the linked issue section of the
msgstr ""
msgid "Map a FogBugz account ID to a GitLab user"
-msgstr ""
+msgstr "Maparea unui ID de cont FogBugz la un utilizator GitLab"
msgid "Mar"
msgstr ""
@@ -23162,10 +23456,10 @@ msgid "Mark as done"
msgstr ""
msgid "Mark as draft"
-msgstr "Marcați ca schiță"
+msgstr "Marcați ca draft"
msgid "Mark as ready"
-msgstr ""
+msgstr "Marcat ca gata"
msgid "Mark this issue as a duplicate of another issue"
msgstr ""
@@ -23219,13 +23513,13 @@ msgid "Marked For Deletion At - %{deletion_time}"
msgstr ""
msgid "Marked as draft. Can only be merged when marked as ready."
-msgstr "Marcat ca schiță. Poate fi îmbinat doar atunci când este marcat ca fiind finalizat."
+msgstr "Marcat ca draft. Poate fi îmbinat doar atunci când este marcat ca fiind finalizat."
msgid "Marked as ready. Merging is now allowed."
-msgstr ""
+msgstr "Marcat ca gata. Îmbinarea este acum permisă."
msgid "Marked this %{noun} as a draft."
-msgstr "Acest %{noun} a fost marcat ca fiind o schiță."
+msgstr "Acest %{noun} a fost marcat ca un draft"
msgid "Marked this issue as a duplicate of %{duplicate_param}."
msgstr ""
@@ -23237,7 +23531,7 @@ msgid "Marked to do as done."
msgstr ""
msgid "Marks this %{noun} as a draft."
-msgstr "Marchează acest %{noun} ca fiind o schiță."
+msgstr "Marchează acest %{noun} ca fiind un draft."
msgid "Marks this issue as a duplicate of %{duplicate_reference}."
msgstr ""
@@ -23285,7 +23579,7 @@ msgid "MattermostService|Response icon"
msgstr ""
msgid "MattermostService|Response username"
-msgstr ""
+msgstr "Nume de utilizator de răspuns"
msgid "MattermostService|Suggestions:"
msgstr ""
@@ -23296,6 +23590,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr "Maximum cereri Git LFS autentificate pe perioadă pe utilizator"
@@ -23312,34 +23609,37 @@ msgid "Max session time"
msgstr ""
msgid "Maximum 20 characters"
-msgstr ""
+msgstr "Maxim 20 de caractere"
msgid "Maximum Conan package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului pachetului Conan în octeți"
msgid "Maximum Helm chart file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului graficului Helm în octeți"
msgid "Maximum Maven package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului pachetului Maven în octeți"
msgid "Maximum NuGet package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului pachetului NuGet în octeți"
msgid "Maximum PyPI package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului pachetului PyPI în octeți"
msgid "Maximum Terraform Module package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea maximă a fișierului pachetului Terraform Module în octeți"
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 ""
+msgstr "Durata de viață maximă permisă pentru cheile SSH (în zile)"
msgid "Maximum artifacts size"
msgstr ""
@@ -23354,7 +23654,7 @@ msgid "Maximum attachment size (MB)"
msgstr ""
msgid "Maximum authenticated API requests per rate limit period per user"
-msgstr ""
+msgstr "Numărul maxim de solicitări API autentificate pe perioada limită de ratei pe utilizator"
msgid "Maximum authenticated web requests per rate limit period per user"
msgstr ""
@@ -23378,10 +23678,10 @@ msgid "Maximum diff patch size"
msgstr "Dimensiunea maximă a patch-ului diff"
msgid "Maximum diff patch size (Bytes)"
-msgstr ""
+msgstr "Dimensiunea maximă a patch-ului diff (Octeți)"
msgid "Maximum duration of a session."
-msgstr ""
+msgstr "Durata maximă a unei sesiuni."
msgid "Maximum field length"
msgstr ""
@@ -23392,7 +23692,7 @@ msgstr ""
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}."
-msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
+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."
@@ -23432,7 +23732,7 @@ msgid "Maximum lines in a diff"
msgstr ""
msgid "Maximum npm package file size in bytes"
-msgstr ""
+msgstr "Dimensiunea 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"
@@ -23552,16 +23852,16 @@ msgid "Member since:"
msgstr ""
msgid "MemberInviteEmail|%{member_name} invited you to join GitLab"
-msgstr ""
+msgstr "%{member_name} v-a invitat să vă alăturați la GitLab"
msgid "MemberInviteEmail|Invitation to join the %{project_or_group} %{project_or_group_name}"
-msgstr ""
+msgstr "Invitație de aderare la %{project_or_group} %{project_or_group_name}"
msgid "Members"
msgstr "Membri"
msgid "Members can be added by project %{i_open}Maintainers%{i_close} or %{i_open}Owners%{i_close}"
-msgstr ""
+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 ""
@@ -23591,7 +23891,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "Membership"
-msgstr ""
+msgstr "Apartenență"
msgid "Members|%{time} by %{user}"
msgstr ""
@@ -23653,6 +23953,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23717,7 +24020,7 @@ msgid "Merge Requests"
msgstr "Merge Request-uri"
msgid "Merge Requests created"
-msgstr ""
+msgstr "Merge request-uri create"
msgid "Merge Requests in Review"
msgstr ""
@@ -23729,16 +24032,16 @@ msgid "Merge automatically (%{strategy})"
msgstr ""
msgid "Merge blocked: all merge request dependencies must be merged."
-msgstr ""
+msgstr "Îmbinare blocată: toate dependențele merge request-ului trebuie să fie îmbinate."
msgid "Merge blocked: merge request must be marked as ready. It's still marked as draft."
-msgstr "Îmbinare blocată: merge request-ul trebuie să fie marcat ca fiind gata. Este încă marcat ca schiță."
+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."
msgid "Merge blocked: pipeline must succeed. It's waiting for a manual job to continue."
-msgstr ""
+msgstr "Îmbinare blocată: pipeline-ul trebuie să reușească. Se așteaptă un job manual pentru a continua."
msgid "Merge blocked: the source branch must be rebased onto the target branch."
msgstr "Îmbinare blocată: trebuie făcut un rebase a ramurii sursă pe ramura țintă."
@@ -23747,16 +24050,16 @@ msgid "Merge commit SHA"
msgstr ""
msgid "Merge commit message"
-msgstr ""
+msgstr "Mesajul commit-ului de îmbinare"
msgid "Merge details"
-msgstr ""
+msgstr "Detalii de îmbinare"
msgid "Merge events"
msgstr ""
msgid "Merge immediately"
-msgstr ""
+msgstr "Îmbinare imediată"
msgid "Merge in progress"
msgstr ""
@@ -23773,6 +24076,9 @@ msgstr "Merge request"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23789,10 +24095,10 @@ msgid "Merge request events"
msgstr ""
msgid "Merge request not merged"
-msgstr ""
+msgstr "Merge request-uri neîmbinate"
msgid "Merge request reports"
-msgstr ""
+msgstr "Rapoarte de merge request-uri"
msgid "Merge request was scheduled to merge after pipeline succeeds"
msgstr ""
@@ -23801,25 +24107,25 @@ msgid "Merge requests"
msgstr "Merge request-uri"
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
-msgstr ""
+msgstr "Merge request-urile sunt un loc în care puteți propune modificările pe care le-ați făcut la un proiect și să discutați aceste modificări cu alții."
msgid "Merge the feature branch into the target branch and fix any conflicts. %{linkStart}How do I fix them?%{linkEnd}"
-msgstr "Îmbinați ramura de caracteristică în ramura țintă și rezolvați orice conflict. %{linkStart}Cum le rezolv?%{linkEnd}"
+msgstr "Îmbinați ramura de caracteristică în ramura țintă și rezolvați orice conflict. %{linkStart}Cum pot să le rezolv?%{linkEnd}"
msgid "Merge unavailable: merge requests are read-only in a secondary Geo node."
msgstr ""
msgid "Merge unverified changes"
-msgstr ""
+msgstr "Îmbinați modificările neverificate"
msgid "Merge unverified changes?"
-msgstr ""
+msgstr "Îmbinați modificările neverificate?"
msgid "Merge when pipeline succeeds"
msgstr ""
msgid "Merge..."
-msgstr ""
+msgstr "ÃŽmbinarea..."
msgid "MergeConflict|Commit to source branch"
msgstr ""
@@ -23867,28 +24173,28 @@ 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 ""
+msgstr "Definiți regulile și setările aprobărilor pentru a asigura %{link_start}separarea sarcinilor%{link_end} pentru noile merge request-uri."
msgid "MergeRequestApprovals|Enforce %{link_start}separation of duties%{link_end} for all projects."
-msgstr ""
+msgstr "Impuneți %{link_start}separarea sarcinilor%{link_end} pentru toate proiectele."
msgid "MergeRequestApprovals|Enforce %{separationLinkStart}separation of duties%{separationLinkEnd} for all projects. %{learnLinkStart}Learn more.%{learnLinkEnd}"
-msgstr ""
+msgstr "Impuneți %{separationLinkStart}separarea sarcinilor%{separationLinkEnd} pentru toate proiectele. %{learnLinkStart}Aflați mai multe.%{learnLinkEnd}"
msgid "MergeRequestDiffs|Commenting on lines %{selectStart}start%{selectEnd} to %{end}"
-msgstr ""
+msgstr "Comentând liniile %{selectStart}start%{selectEnd} până la %{end}"
msgid "MergeRequestDiffs|Select comment starting line"
-msgstr ""
+msgstr "Selectați linia de start a comentariului"
msgid "MergeRequests|An error occurred while saving the draft comment."
-msgstr "A apărut o eroare în timpul salvării schiței de comentariu."
+msgstr "A apărut o eroare în timpul salvării draftului de comentariu."
msgid "MergeRequests|Create issue to resolve thread"
msgstr "Creați o problemă pentru a rezolva subiectul"
msgid "MergeRequests|Saving the comment failed"
-msgstr ""
+msgstr "Salvarea comentariului a eșuat"
msgid "MergeRequests|Squashing failed: Squash the commits locally, resolve any conflicts, then push the branch."
msgstr ""
@@ -23933,34 +24239,34 @@ msgid "MergeRequests|started a thread on commit %{linkStart}%{commitDisplay}%{li
msgstr "a început un subiect pe commit-ul %{linkStart}%{commitDisplay}%{linkEnd}"
msgid "MergeRequest|Approved by @%{username}"
-msgstr ""
+msgstr "Aprobat de @%{username}"
msgid "MergeRequest|Can't show this merge request because of an internal error. Contact your administrator."
-msgstr ""
+msgstr "Acest merge request nu poate fi afișată din cauza unei erori interne. Contactați-vă administratorul."
msgid "MergeRequest|Can't show this merge request because the fork project was deleted."
-msgstr ""
+msgstr "Acest merge request nu poate fi afișat deoarece proiectul fork a fost șters."
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 ""
+msgstr "Acest merge request nu poate fi afișat deoarece ramura sursă %{branch_badge} lipsește din proiectul %{path_badge}. Închideți acest merge request sau actualizați ramura sursă."
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 ""
+msgstr "Acest merge request nu poate fi afișat deoarece ramura țintă %{branch_badge} lipsește din proiectul %{path_badge}. Închideți acest merge request sau actualizați ramura țintă."
msgid "MergeRequest|Compare %{target} and %{source}"
-msgstr ""
+msgstr "Comparați %{target} și %{source}"
msgid "MergeRequest|Error dismissing suggestion popover. Please try again."
-msgstr ""
+msgstr "Eroare la respingerea sugestiei popover. Vă rugăm să încercați din nou."
msgid "MergeRequest|Error loading full diff. Please try again."
-msgstr ""
+msgstr "Eroare la încărcarea întregului diff. Vă rugăm să încercați din nou."
msgid "MergeRequest|No files found"
-msgstr ""
+msgstr "Nu au fost găsite fișiere"
msgid "MergeRequest|Search files (%{modifier_key}P)"
-msgstr ""
+msgstr "Căutați fișiere (%{modifier_key}P)"
msgid "Merged"
msgstr "ÃŽmbinat"
@@ -23969,7 +24275,7 @@ 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 ""
+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."
msgid "Merged by"
msgstr "ÃŽmbinat de"
@@ -23981,10 +24287,10 @@ msgid "Merged: %{merged}"
msgstr ""
msgid "Merges this merge request immediately."
-msgstr ""
+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 ""
+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 "Message"
msgstr ""
@@ -24008,15 +24314,27 @@ msgid "Metric:"
msgstr ""
msgid "MetricChart|Please select a metric"
-msgstr ""
+msgstr "Vă rugăm să selectați o metrică"
msgid "MetricChart|Selected"
-msgstr ""
+msgstr "Selectat"
msgid "MetricChart|There is no data available. Please change your selection."
-msgstr ""
+msgstr "Nu există date disponibile. Vă rugăm să schimbați selecția."
msgid "MetricChart|There is too much data to calculate. Please change your selection."
+msgstr "Există prea multe date de calculat. Vă rugăm să schimbați selecția."
+
+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"
@@ -24044,7 +24362,7 @@ msgid "Metrics and profiling"
msgstr ""
msgid "Metrics:"
-msgstr ""
+msgstr "Metrici:"
msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
msgstr "Adnotarea nu poate aparține atât unui cluster, cât și unui mediu în același timp"
@@ -24089,16 +24407,16 @@ msgid "MetricsSettings|Metrics"
msgstr ""
msgid "MetricsSettings|UTC (Coordinated Universal Time)"
-msgstr ""
+msgstr "UTC (Timpul universal coordonat)"
msgid "MetricsSettings|User's local timezone"
-msgstr ""
+msgstr "Fusul orar local al utilizatorului"
msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
msgstr "Tabloul de bord cu calea solicitată nu poate fi găsit"
msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
-msgstr "Nu sunteți autorizat să adăugați o stea la acest tablou de bord"
+msgstr "Nu sunteți autorizat să adăugați stele la acest tablou de bord"
msgid "Metrics|1. Define and preview panel"
msgstr ""
@@ -24188,7 +24506,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "Metrics|Expand panel"
-msgstr ""
+msgstr "Extindeți panoul"
msgid "Metrics|For grouping similar metrics"
msgstr ""
@@ -24206,10 +24524,10 @@ msgid "Metrics|Link contains an invalid time window, please verify the link to s
msgstr ""
msgid "Metrics|Link contains invalid chart information, please verify the link to see the expanded panel."
-msgstr ""
+msgstr "Linkul conține informații invalide despre grafic, vă rugăm să verificați linkul pentru a vedea panoul extins."
msgid "Metrics|Manage chart links"
-msgstr ""
+msgstr "Gestionați linkurile graficului"
msgid "Metrics|Max"
msgstr ""
@@ -24248,16 +24566,16 @@ msgid "Metrics|Prometheus Query Documentation"
msgstr ""
msgid "Metrics|Refresh Prometheus data"
-msgstr ""
+msgstr "Reîmprospătarea datelor Prometheus"
msgid "Metrics|Refresh dashboard"
-msgstr "Actualizați tabloul de bord"
+msgstr "Reîmprospătați tabloul de bord"
msgid "Metrics|Select a value"
msgstr ""
msgid "Metrics|Set refresh rate"
-msgstr ""
+msgstr "Setați rata de reîmprospătare"
msgid "Metrics|Star dashboard"
msgstr "Adăugați tabloul de bord în favorite"
@@ -24311,7 +24629,7 @@ msgid "Metrics|Unstar dashboard"
msgstr "Eliminați tabloul de bord din favorite"
msgid "Metrics|Used as a title for the chart"
-msgstr ""
+msgstr "Utilizat ca titlu pentru grafic"
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 "Se utilizează atunci când interogarea returnează o singură serie. Dacă aceasta returnează mai multe serii, etichetele legendei acestora vor fi preluate din răspuns."
@@ -24335,7 +24653,7 @@ msgid "Metrics|You can save a copy of this dashboard to your repository so it ca
msgstr "Puteți salva o copie a acestui tablou de bord în repozitoriul dvs. pentru a putea fi personalizat. Selectați un nume de fișier și o ramură pentru a-l salva."
msgid "Metrics|You're about to permanently delete this metric. This cannot be undone."
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți definitiv această metrică. Acest lucru nu poate fi anulat."
msgid "Metrics|Your dashboard schema is invalid. Edit the dashboard to correct the YAML schema."
msgstr "Schema tabloului de bord nu este validă. Editați tabloul de bord pentru a corecta schema YAML."
@@ -24467,78 +24785,78 @@ 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 ""
+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."
msgid "Milestones| You’re about to permanently delete the milestone %{milestoneTitle}. This milestone is not currently used in any issues or merge requests."
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți definitiv obiectivul %{milestoneTitle}. Acest obiectiv nu este utilizat în prezent în nicio problemă sau merge request."
msgid "Milestones|Close Milestone"
-msgstr ""
+msgstr "Închideți obiectivul"
msgid "Milestones|Completed Issues (closed)"
-msgstr ""
+msgstr "Probleme finalizate (închise)"
msgid "Milestones|Create a milestone to better track your issues and merge requests. %{learn_more_link}"
-msgstr ""
+msgstr "Creați un obiectiv pentru a vă urmări mai bine problemele și merge request-urile. %{learn_more_link}"
msgid "Milestones|Delete milestone"
-msgstr ""
+msgstr "Ștergeți obiectivul"
msgid "Milestones|Delete milestone %{milestoneTitle}?"
-msgstr ""
+msgstr "Ștergeți obiectivul %{milestoneTitle}?"
msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
-msgstr ""
+msgstr "Ștergerea obiectivului %{milestoneTitle} nu a reușit"
msgid "Milestones|Group Milestone"
-msgstr ""
+msgstr "Obiectiv de grup"
msgid "Milestones|Milestone %{milestoneTitle} was not found"
-msgstr ""
+msgstr "Obiectivul %{milestoneTitle} nu a fost găsit"
msgid "Milestones|Ongoing Issues (open and assigned)"
-msgstr ""
+msgstr "Probleme în curs (deschise și atribuite)"
msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
-msgstr ""
+msgstr "Organizați problemele și merge request-urile într-un grup coerent și stabiliți datele de început și de expirare opționale. %{learn_more_link}"
msgid "Milestones|Project Milestone"
-msgstr ""
+msgstr "Obiectiv de proiect"
msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
-msgstr ""
+msgstr "Promovați %{milestoneTitle} la un obiectiv de grup?"
msgid "Milestones|Promote Milestone"
-msgstr ""
+msgstr "Promovați obiectivul"
msgid "Milestones|Promote to Group Milestone"
-msgstr ""
+msgstr "Promovați la Obiectivul grupului"
msgid "Milestones|Promoting %{milestoneTitle} will make it available for all projects inside %{groupName}. Existing project milestones with the same title will be merged."
-msgstr ""
+msgstr "Promovarea %{milestoneTitle} îl va face disponibil pentru toate proiectele din %{groupName}. Obiectivele existente ale proiectelor cu același titlu vor fi îmbinate."
msgid "Milestones|Reopen Milestone"
-msgstr ""
+msgstr "Redeschideți obiectivul"
msgid "Milestones|There are no closed milestones"
-msgstr ""
+msgstr "Nu există niciun obiectiv închis"
msgid "Milestones|There are no open milestones"
-msgstr ""
+msgstr "Nu există niciun obiectiv deschis"
msgid "Milestones|This action cannot be reversed."
-msgstr ""
+msgstr "Această operațiune nu poate fi anulată."
msgid "Milestones|Unstarted Issues (open and unassigned)"
-msgstr ""
+msgstr "Probleme neîncepute (deschise și neatribuite)"
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
-msgstr ""
+msgstr "Folosiți obiectivele pentru a urmări problemele și merge request-urile pe o perioadă fixă de timp"
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24602,10 +24920,10 @@ 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 ""
+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 ""
+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ă."
msgid "ModalButton|Add projects"
msgstr ""
@@ -24626,7 +24944,7 @@ msgid "Modify commit messages"
msgstr ""
msgid "Modify merge commit"
-msgstr ""
+msgstr "Modificați commit-ul îmbinării"
msgid "Monday"
msgstr ""
@@ -24722,13 +25040,13 @@ msgid "Move up"
msgstr ""
msgid "MoveIssue|Cannot move issue due to insufficient permissions!"
-msgstr ""
+msgstr "Problema nu poate fi mutată din cauza permisiunilor insuficiente!"
msgid "MoveIssue|Cannot move issue to project it originates from!"
-msgstr ""
+msgstr "Problema nu poate fi mutată în proiectul din care provine!"
msgid "MoveIssue|Cannot move issues of '%{issue_type}' type."
-msgstr ""
+msgstr "Problemele de tipul '%{issue_type}'nu pot fi mutate."
msgid "Moved issue to %{label} column in the board."
msgstr "Problema a fost mutată în coloana %{label} de pe bord."
@@ -24752,23 +25070,20 @@ msgid "MrDeploymentActions|Stop environment"
msgstr ""
msgid "MrList|Assigned to %{name}"
-msgstr ""
+msgstr "Atribuit lui %{name}"
msgid "MrList|Attention requested from assignee %{name}"
-msgstr ""
+msgstr "Se solicită atenție din partea responsabilului %{name}"
msgid "MrList|Attention requested from reviewer %{name}"
-msgstr ""
+msgstr "Atenție solicitată de la revizorul %{name}"
msgid "MrList|Review requested from %{name}"
-msgstr ""
+msgstr "Revizuire solicitată de la %{name}"
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr "Integrările HTTP multiple nu sunt acceptate pentru acest proiect"
@@ -24790,12 +25105,6 @@ msgstr "Au fost găsite mai multe încărcătoare: %{uploader_types}"
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "Multiplicator aplicabil intervalelor de sondare. Sunt acceptate valorile zecimale. Valoarea implicită este 1."
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr "Trebuie să se potrivească cu %{codeStart}geo_code_name%{codeEnd} în %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Aflați mai multe%{linkEnd}"
-
msgid "My awesome group"
msgstr ""
@@ -24803,7 +25112,7 @@ msgid "My company or team"
msgstr ""
msgid "My topic"
-msgstr ""
+msgstr "Subiectul meu"
msgid "My-Reaction"
msgstr ""
@@ -24868,20 +25177,20 @@ msgstr "Ați atins limita de stocare liberă de %{free_size_limit} pe unul sau m
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."
-msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
-msgstr "Spațiul de nume %{name_with_link} are %{percent} sau mai puțin spațiu de stocare rămas a spațiului de nume."
+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 "Spațiul de nume %{name_with_link} și-a depășit limita de stocare a spațiului de nume."
-msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
-msgstr "Spațiul de nume %{name}(%{url}) are %{percent} sau mai puțin spațiu de stocare rămas a spațiului de nume."
+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 "Spațiul de nume %{name}(%{url}) și-a depășit limita de stocare a spațiului de nume."
-msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
-msgstr "Acțiune necesară: A rămas mai puțin de %{percentage_of_available_storage}din spațiul de stocare a spațiului de nume pentru %{namespace_name}"
+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 "Acțiune necesară: Stocarea a fost depășită pentru %{namespace_name}"
@@ -24923,37 +25232,37 @@ msgid "Navigation bar"
msgstr ""
msgid "NavigationTheme|Blue"
-msgstr ""
+msgstr "Albastru"
msgid "NavigationTheme|Dark"
-msgstr ""
+msgstr "ÃŽntunecat"
msgid "NavigationTheme|Dark Mode (alpha)"
-msgstr ""
+msgstr "Modul întunecat (alfa)"
msgid "NavigationTheme|Green"
-msgstr ""
+msgstr "Verde"
msgid "NavigationTheme|Indigo"
-msgstr ""
+msgstr "Indigo"
msgid "NavigationTheme|Light"
-msgstr ""
+msgstr "Luminos"
msgid "NavigationTheme|Light Blue"
-msgstr ""
+msgstr "Albastru deschis"
msgid "NavigationTheme|Light Green"
-msgstr ""
+msgstr "Verde deschis"
msgid "NavigationTheme|Light Indigo"
-msgstr ""
+msgstr "Indigo deschis"
msgid "NavigationTheme|Light Red"
-msgstr ""
+msgstr "Roșu deschis"
msgid "NavigationTheme|Red"
-msgstr ""
+msgstr "Roșu"
msgid "Nav|Help"
msgstr ""
@@ -24983,79 +25292,13 @@ msgid "Network"
msgstr ""
msgid "Network:"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
+msgstr "Rețea:"
msgid "NetworkPolicies|Environment does not have deployment platform"
-msgstr ""
-
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
+msgstr "Mediul nu are o platformă de implementare"
msgid "NetworkPolicies|Invalid or empty policy"
-msgstr ""
+msgstr "Politică invalidă sau necompletată"
msgid "NetworkPolicies|Invalid or unsupported policy kind"
msgstr "Tip de politică invalidă sau neacceptată"
@@ -25063,86 +25306,11 @@ msgstr "Tip de politică invalidă sau neacceptată"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Eroare Kubernetes: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
-msgstr ""
-
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
+msgstr "Politica %{policyName} fost modificată cu succes"
msgid "NetworkPolicies|Something went wrong, failed to update policy"
-msgstr ""
-
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr "Pentru a activa alertele, %{installLinkStart}instalați mai întâi un agent%{installLinkEnd}."
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
+msgstr "Ceva a mers prost, nu s-a putut actualiza politica"
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25226,7 +25394,7 @@ msgid "New Test Case"
msgstr ""
msgid "New User"
-msgstr ""
+msgstr "Utilizator nou"
msgid "New application"
msgstr ""
@@ -25253,7 +25421,7 @@ msgid "New discussion"
msgstr ""
msgid "New email address added"
-msgstr ""
+msgstr "Adresă de e-mail nouă adăugată"
msgid "New environment"
msgstr ""
@@ -25277,7 +25445,7 @@ msgid "New group name"
msgstr ""
msgid "New health check access token has been generated!"
-msgstr ""
+msgstr "A fost generat un nou token de acces pentru verificarea de sănătate!"
msgid "New identity"
msgstr ""
@@ -25307,7 +25475,7 @@ msgid "New milestone"
msgstr ""
msgid "New name"
-msgstr ""
+msgstr "Nume nou"
msgid "New password"
msgstr ""
@@ -25361,7 +25529,7 @@ msgid "New test case"
msgstr ""
msgid "New topic"
-msgstr ""
+msgstr "Subiect nou"
msgid "New users set to external"
msgstr ""
@@ -25426,9 +25594,6 @@ msgstr "Niciun Obiectiv"
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25625,7 +25790,7 @@ msgid "No plan"
msgstr ""
msgid "No pods available"
-msgstr ""
+msgstr "Nu există pod-uri disponibile"
msgid "No policy matches this license"
msgstr ""
@@ -25636,9 +25801,6 @@ msgstr "Nicio previzualizare pentru acest tip de fișier"
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25685,7 +25847,7 @@ msgid "No stack trace for this error"
msgstr ""
msgid "No starrers matched your search"
-msgstr "Nimeni care l-a adăugat la favorite nu corespunde căutării dv."
+msgstr "Niciun marcator cu stele nu a corespuns căutării dvs."
msgid "No start date"
msgstr ""
@@ -25703,7 +25865,7 @@ msgid "No template selected"
msgstr ""
msgid "No test coverage"
-msgstr ""
+msgstr "Fără coverage de teste"
msgid "No triggers exist yet. Use the form above to create one."
msgstr ""
@@ -25727,7 +25889,7 @@ msgid "No. of commits"
msgstr ""
msgid "Nobody has starred this repository yet"
-msgstr "Nimeni nu a marcat încă acest repozitoriu ca favorit"
+msgstr "Nimeni nu a marcat cu stele încă acest repozitoriu"
msgid "Node was successfully created."
msgstr ""
@@ -25760,7 +25922,7 @@ msgid "Not all browsers support WebAuthn. Therefore, we require that you set up
msgstr ""
msgid "Not all data has been processed yet, the accuracy of the chart for the selected timeframe is limited."
-msgstr ""
+msgstr "Nu au fost procesate încă toate datele, precizia graficului pentru intervalul de timp selectat este limitată."
msgid "Not available"
msgstr ""
@@ -25805,16 +25967,16 @@ 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 ""
+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."
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 ""
+msgstr "Notă: În calitate de administrator, poate doriți să configurați %{github_integration_link}, care va permite autentificarea prin GitHub și va permite importarea repozitoriilor fără a genera un Token de acces personal."
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 ""
+msgstr "Notă: Solicitați administratorului GitLab să configureze %{github_integration_link}, ceea ce va permite autentificarea prin GitHub și va permite conectarea repozitoriilor fără a genera un Token de acces personal."
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 ""
+msgstr "Notă: Solicitați administratorului GitLab să configureze %{github_integration_link}, ceea ce va permite autentificarea prin GitHub și va permite importarea repozitoriilor fără a genera un Token de acces personal."
msgid "Note: current forks will keep their visibility level."
msgstr ""
@@ -25822,44 +25984,44 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
msgid "Notes|Are you sure you want to cancel creating this comment?"
-msgstr ""
+msgstr "Sigur doriți să anulați crearea acestui comentariu?"
msgid "Notes|Collapse replies"
-msgstr ""
+msgstr "Restrângeți răspunsurile"
msgid "Notes|Confidential comments are only visible to members with the role of Reporter or higher"
-msgstr ""
+msgstr "Comentariile confidențiale sunt vizibile doar membrilor cu rol de Reporter sau mai mare."
msgid "Notes|Make this comment confidential"
-msgstr ""
+msgstr "Faceți acest comentariu confidențial"
msgid "Notes|Show all activity"
-msgstr ""
+msgstr "Afișați toată activitatea"
msgid "Notes|Show comments only"
-msgstr ""
+msgstr "Afișați numai comentariile"
msgid "Notes|Show history only"
-msgstr ""
+msgstr "Afișați numai istoricul"
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 ""
+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 comment is confidential and only visible to group members"
-msgstr ""
+msgstr "Acest comentariu este confidențial și este vizibil doar pentru membrii grupului"
msgid "Notes|This comment is confidential and only visible to project members"
-msgstr ""
+msgstr "Acest comentariu este confidențial și este vizibil doar pentru membrii proiectului"
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 found…"
-msgstr ""
+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 ""
@@ -25910,7 +26072,7 @@ msgid "NotificationEvent|Failed pipeline"
msgstr ""
msgid "NotificationEvent|Fixed pipeline"
-msgstr ""
+msgstr "Pipeline reparat"
msgid "NotificationEvent|Issue due"
msgstr ""
@@ -25990,6 +26152,42 @@ msgstr ""
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ă."
+msgid "Notify|%{author_link}'s issue %{issue_reference_link} is due soon."
+msgstr ""
+
+msgid "Notify|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26044,9 +26242,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26072,7 +26267,7 @@ msgid "Okay"
msgstr ""
msgid "Oldest first"
-msgstr ""
+msgstr "Cel mai vechi mai întâi"
msgid "OmniAuth"
msgstr ""
@@ -26089,6 +26284,9 @@ 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 "Orice regulă de escaladare care folosește acest program va fi, de asemenea, ștearsă."
@@ -26165,7 +26363,7 @@ 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 ""
+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 ""
@@ -26231,10 +26429,10 @@ msgid "OnCallSchedules|User %{name} is currently part of:"
msgstr ""
msgid "OnCallSchedules|View next timeframe"
-msgstr ""
+msgstr "Vizualizați următorul interval de timp"
msgid "OnCallSchedules|View previous timeframe"
-msgstr ""
+msgstr "Vizualizați intervalul de timp anterior"
msgid "OnCallSchedules|You are currently a part of:"
msgstr ""
@@ -26243,150 +26441,189 @@ msgid "OnCallSchedules|Your schedule has been successfully created. To add indiv
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}."
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
+msgstr "%{learnMoreLinkStart}Aflați mai multe despre scanările la cerere%{learnMoreLinkEnd}."
+
+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 "Sunteți sigur că doriți să ștergeți această scanare?"
+
+msgid "OnDemandScans|Cancel"
msgstr ""
msgid "OnDemandScans|Could not delete saved scan. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu se poate șterge scanarea salvată. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "OnDemandScans|Could not fetch on-demand scans. Please refresh the page, or try again later."
-msgstr ""
+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 ""
+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."
msgid "OnDemandScans|Could not fetch site profiles. Please refresh the page, or try again later."
-msgstr ""
+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."
msgid "OnDemandScans|Could not run the scan. Please try again."
-msgstr ""
+msgstr "Nu s-a putut rula scanarea. Vă rugăm să încercați din nou."
msgid "OnDemandScans|Create new scanner profile"
-msgstr ""
+msgstr "Creați un profil de scaner nou"
msgid "OnDemandScans|Create new site profile"
+msgstr "Creați un nou profil de site"
+
+msgid "OnDemandScans|DAST configuration"
msgstr ""
-msgid "OnDemandScans|Delete profile"
+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 "Ștergeți profilul"
+
msgid "OnDemandScans|Description (optional)"
+msgstr "Descriere (opțional)"
+
+msgid "OnDemandScans|Dynamic Application Security Testing (DAST)"
msgstr ""
msgid "OnDemandScans|Edit on-demand DAST scan"
+msgstr "Editați scanarea DAST la cerere"
+
+msgid "OnDemandScans|Edit on-demand scan"
msgstr ""
msgid "OnDemandScans|Edit profile"
-msgstr ""
+msgstr "Editați profilul"
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
-msgstr ""
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgstr "De exemplu: Testarea unei pagini de autentificare pentru injecții SQL"
msgid "OnDemandScans|Manage scanner profiles"
-msgstr ""
+msgstr "Gestionați profilurile de scanare"
msgid "OnDemandScans|Manage site profiles"
-msgstr ""
+msgstr "Gestionați profilurile site-ului"
msgid "OnDemandScans|My daily scan"
-msgstr ""
+msgstr "Scanarea mea zilnică"
msgid "OnDemandScans|New on-demand DAST scan"
+msgstr "Nouă scanare DAST la cerere"
+
+msgid "OnDemandScans|New on-demand scan"
msgstr ""
msgid "OnDemandScans|New scan"
-msgstr ""
+msgstr "Noua scanare"
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
-msgstr ""
+msgstr "Niciun profil încă. Pentru a crea o nouă scanare, trebuie să aveți cel puțin un profil de scanare completat."
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed site profile."
-msgstr ""
+msgstr "Niciun profil încă. Pentru a crea o nouă scanare, trebuie să aveți cel puțin un profil de site completat."
msgid "OnDemandScans|On-demand Scans"
-msgstr ""
+msgstr "Scanări la cerere"
msgid "OnDemandScans|On-demand scans"
-msgstr ""
+msgstr "Scanări la cerere"
msgid "OnDemandScans|On-demand scans run outside of DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}."
-msgstr ""
+msgstr "Scanările la cerere se execută în afara ciclului DevOps și identifică vulnerabilitățile din proiectele dumneavoastră. %{learnMoreLinkStart}Aflați mai multe%{learnMoreLinkEnd}."
msgid "OnDemandScans|On-demand scans run outside the DevOps cycle and find vulnerabilities in your projects. %{learnMoreLinkStart}Learn more%{learnMoreLinkEnd}"
-msgstr ""
+msgstr "Scanările la cerere se execută în afara ciclului DevOps și identifică vulnerabilitățile din proiectele dumneavoastră. %{learnMoreLinkStart}Aflați mai multe%{learnMoreLinkEnd}"
msgid "OnDemandScans|Repeats"
-msgstr ""
+msgstr "Repetiții"
msgid "OnDemandScans|Run scan"
-msgstr ""
+msgstr "Rulați scanarea"
msgid "OnDemandScans|Save and run scan"
-msgstr ""
+msgstr "Salvați și rulați scanarea"
msgid "OnDemandScans|Save scan"
+msgstr "Salvați scanarea"
+
+msgid "OnDemandScans|Scan configuration"
msgstr ""
msgid "OnDemandScans|Scan library"
-msgstr ""
+msgstr "Biblioteca de scanare"
msgid "OnDemandScans|Scan name"
-msgstr ""
+msgstr "Numele scanării"
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
-msgstr ""
+msgid "OnDemandScans|Scan type"
+msgstr "Tipul de scanare"
+
+msgid "OnDemandScans|Scanner profile"
+msgstr "Profilul scanerului"
msgid "OnDemandScans|Select one of the existing profiles"
-msgstr ""
+msgstr "Selectați unul dintre profilurile existente"
msgid "OnDemandScans|Site profile"
-msgstr ""
+msgstr "Profilul site-ului"
msgid "OnDemandScans|Start time"
-msgstr ""
+msgstr "Timpul de începere"
msgid "OnDemandScans|Target"
-msgstr ""
+msgstr "Țintă"
msgid "OnDemandScans|The scan could not be canceled."
-msgstr ""
+msgstr "Scanarea nu a putut fi anulată."
msgid "OnDemandScans|The scan could not be retried."
-msgstr ""
+msgstr "Scanarea nu a putut fi reluată."
msgid "OnDemandScans|There are no finished scans."
-msgstr ""
+msgstr "Nu există scanări finalizate."
msgid "OnDemandScans|There are no running scans."
-msgstr ""
+msgstr "Nu există scanări în desfășurare."
msgid "OnDemandScans|There are no saved scans."
-msgstr ""
+msgstr "Nu există scanări salvate."
msgid "OnDemandScans|There are no scheduled scans."
+msgstr "Nu există scanări programate."
+
+msgid "OnDemandScans|Timezone"
msgstr ""
msgid "OnDemandScans|Use existing scanner profile"
-msgstr ""
+msgstr "Utilizați profilul scanerului existent"
msgid "OnDemandScans|Use existing site profile"
-msgstr ""
+msgstr "Utilizați profilul site-ului existent"
msgid "OnDemandScans|View results"
-msgstr ""
+msgstr "Vizualizați rezultatul"
msgid "OnDemandScans|You must create a repository within your project to run an on-demand scan."
+msgstr "Trebuie să creați un repozitoriu în cadrul proiectului dvs. pentru a rula o scanare la cerere."
+
+msgid "OnDemandScans|at"
msgstr ""
msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}."
@@ -26452,9 +26689,6 @@ msgstr "Permiteți oricui să se înregistreze pentru conturi pe instanțele Git
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr "Includeți doar funcții noi pentru nivelul abonamentului dvs. curent"
@@ -26504,7 +26738,7 @@ msgid "Open in Gitpod"
msgstr "Deschideți în Gitpod"
msgid "Open in Web IDE"
-msgstr ""
+msgstr "Deschideți în Web IDE"
msgid "Open in file view"
msgstr ""
@@ -26534,10 +26768,10 @@ msgid "Opened MRs"
msgstr ""
msgid "Opened issues"
-msgstr ""
+msgstr "Probleme deschise"
msgid "OpenedNDaysAgo|Created"
-msgstr ""
+msgstr "Creat"
msgid "Opens in a new window"
msgstr ""
@@ -26546,19 +26780,19 @@ msgid "Opens new window"
msgstr "Deschide o fereastră nouă"
msgid "Operation failed. Check pod logs for %{pod_name} for more details."
-msgstr ""
+msgstr "Operația a eșuat. Verificați jurnalele pod pentru %{pod_name} pentru mai multe detalii."
msgid "Operation not allowed"
msgstr ""
msgid "Operation timed out. Check pod logs for %{pod_name} for more details."
-msgstr ""
+msgstr "Operația a expirat. Verificați jurnalele pod pentru %{pod_name} pentru mai multe detalii."
msgid "Operations"
msgstr ""
msgid "Operations Dashboard"
-msgstr "Tabloul de bord de operațiuni"
+msgstr "Tabloul de bord al operațiunilor"
msgid "OperationsDashboard|Add a project to the dashboard"
msgstr "Adăugați un proiect în tabloul de bord"
@@ -26573,7 +26807,7 @@ msgid "OperationsDashboard|Operations Dashboard"
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 a statusului conductelor și a alertelor."
+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 "Optimize your workflow with CI/CD Pipelines"
msgstr ""
@@ -26585,7 +26819,7 @@ msgid "Optional parameter \"variables\" must be a Hash. Ex: variables[key1]=valu
msgstr ""
msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
-msgstr ""
+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 ""
@@ -26630,28 +26864,28 @@ 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 "Permiteți solicitări către rețeaua locală de la hook-uri și servicii."
msgid "OutboundRequests|Allow requests to the local network from system hooks"
-msgstr ""
+msgstr "Permiteți solicitările către rețeaua locală de la hook-urile de sistem"
msgid "OutboundRequests|Allow requests to the local network from web hooks and services"
-msgstr ""
+msgstr "Permiteți solicitări către rețeaua locală de la hook-uri și servicii web"
msgid "OutboundRequests|Enforce DNS rebinding attack protection"
-msgstr ""
+msgstr "Impuneți protecția împotriva atacurilor de re-legare DNS"
msgid "OutboundRequests|Local IP addresses and domain names that hooks and services may access"
-msgstr ""
+msgstr "Adresele IP locale și numele de domenii pe care hook-urile și serviciile le pot accesa"
msgid "OutboundRequests|Outbound requests"
-msgstr ""
+msgstr "Solicitări de ieșire"
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 "Solicitările către aceste domenii și adrese IP sunt accesibile atât hook-urilor de sistem, cât și celor web, chiar și atunci când nu sunt permise solicitările locale. Sunt acceptate intervale IP precum 1:0:0:0:0:0:0:0:0:0/124 și 127.0.0.0.0/28. Nu sunt acceptate caractere wildcard de domeniu. Pentru a separa intrările, utilizați virgule, punct și virgulă sau linii noi. Lista de permisiuni poate conține maximum 1000 de intrări. Domeniile trebuie să fie codificate IDNA."
msgid "OutboundRequests|Resolve IP addresses once and uses them to submit requests."
-msgstr ""
+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 ""
@@ -26690,34 +26924,34 @@ msgid "Owners can modify this selection."
msgstr "Proprietarii pot modifica această selecție."
msgid "PQL|An error occurred while sending hand raise lead."
-msgstr ""
+msgstr "S-a produs o eroare în timpul trimiterii lead-ului mână ridicată"
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 "Prin furnizarea informațiilor mele de contact, sunt de acord ca GitLab să mă contacteze prin e-mail cu privire la produsele, serviciile și evenimentele sale. Puteți renunța în orice moment optând pentru dezabonare în e-mailuri sau vizitând centrul nostru de preferințe de comunicare."
msgid "PQL|Cancel"
-msgstr ""
+msgstr "Anulare"
msgid "PQL|Contact our Sales team"
-msgstr ""
+msgstr "Contactați echipa noastră de vânzări"
msgid "PQL|Contact sales"
-msgstr ""
+msgstr "Contactați vânzările"
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 "Bună ziua %{userName}. Înainte de a vă pune în legătură cu echipa noastră de vânzări, am dori să verificați și să completați informațiile de mai jos."
msgid "PQL|Message for the Sales team (optional)"
-msgstr ""
+msgstr "Mesaj pentru echipa de vânzări (opțional)"
msgid "PQL|Please select a city or state"
-msgstr ""
+msgstr "Selectați un oraș sau un stat"
msgid "PQL|Submit information"
-msgstr ""
+msgstr "Trimiteți informațiile"
msgid "PQL|Thank you for reaching out! Our sales team will get back to you soon."
-msgstr ""
+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 ""
@@ -26738,7 +26972,7 @@ msgid "Package file size limits"
msgstr ""
msgid "Package recipe already exists"
-msgstr ""
+msgstr "Rețeta pachetului există deja"
msgid "Package registry rate limits"
msgstr ""
@@ -26771,103 +27005,103 @@ 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 ""
+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 ""
+msgstr "%{boldStart}Nu permite duplicatele%{boldEnd} - Respinge pachetele cu același nume și versiune."
msgid "PackageRegistry|%{name} version %{version} was first created %{datetime}"
-msgstr ""
+msgstr "%{name} versiunea %{version} a fost creată pentru prima dată la %{datetime}"
msgid "PackageRegistry|Add Conan Remote"
-msgstr ""
+msgstr "Adăugați telecomanda Conan"
msgid "PackageRegistry|Add Gradle Groovy DSL repository command"
-msgstr ""
+msgstr "Adăugați comanda repozitoriului Gradle Groovy DSL Groovy DSL"
msgid "PackageRegistry|Add Gradle Kotlin DSL repository command"
-msgstr ""
+msgstr "Adăugați comanda repozitoriului Gradle Kotlin DSL"
msgid "PackageRegistry|Add NuGet Source"
-msgstr ""
+msgstr "Adăugați sursa NuGet"
msgid "PackageRegistry|Add composer registry"
-msgstr ""
+msgstr "Adăugați registrul compozitorului"
msgid "PackageRegistry|Allow duplicates"
-msgstr ""
+msgstr "Permiteți duplicatele"
msgid "PackageRegistry|App group: %{group}"
-msgstr ""
+msgstr "Grupul de aplicații: %{group}"
msgid "PackageRegistry|App name: %{name}"
-msgstr ""
+msgstr "Numele aplicației: %{name}"
msgid "PackageRegistry|Built by pipeline %{link} triggered %{datetime} by %{author}"
-msgstr ""
+msgstr "Construit prin pipeline-ul %{link} declanșat pe %{datetime} de %{author}"
msgid "PackageRegistry|Composer"
-msgstr ""
+msgstr "Compozitor"
msgid "PackageRegistry|Composer.json with license: %{license} and version: %{version}"
-msgstr ""
+msgstr "Composer.json cu licența: %{license} și versiunea: %{version}"
msgid "PackageRegistry|Conan"
-msgstr ""
+msgstr "Conan"
msgid "PackageRegistry|Conan Command"
-msgstr ""
+msgstr "Comanda Conan"
msgid "PackageRegistry|Copy .pypirc content"
-msgstr ""
+msgstr "Copiați conținutul .pypirc"
msgid "PackageRegistry|Copy Conan Command"
-msgstr ""
+msgstr "Copiați comanda Conan"
msgid "PackageRegistry|Copy Conan Setup Command"
-msgstr ""
+msgstr "Copiați comanda de configurare Conan"
msgid "PackageRegistry|Copy Gradle Groovy DSL install command"
-msgstr ""
+msgstr "Copiați comanda de instalare Gradle Groovy DSL"
msgid "PackageRegistry|Copy Gradle Kotlin DSL install command"
-msgstr ""
+msgstr "Copiați comanda de instalare Gradle Kotlin DSL"
msgid "PackageRegistry|Copy Maven XML"
-msgstr ""
+msgstr "Copiați XML-ul Maven"
msgid "PackageRegistry|Copy Maven command"
-msgstr ""
+msgstr "Copiați comanda Maven"
msgid "PackageRegistry|Copy Maven registry XML"
-msgstr ""
+msgstr "Copiați XML-ul registrului Maven"
msgid "PackageRegistry|Copy NuGet Command"
-msgstr ""
+msgstr "Copiați comanda NuGet"
msgid "PackageRegistry|Copy NuGet Setup Command"
-msgstr ""
+msgstr "Copiați comanda de configurare NuGet"
msgid "PackageRegistry|Copy Pip command"
-msgstr ""
+msgstr "Comandă Copiere Pip"
msgid "PackageRegistry|Copy SHA"
-msgstr ""
+msgstr "Copiați SHA"
msgid "PackageRegistry|Copy add Gradle Groovy DSL repository command"
-msgstr ""
+msgstr "Copiați comanda de adăugare a repozitoriului Gradle Groovy DSL"
msgid "PackageRegistry|Copy add Gradle Kotlin DSL repository command"
-msgstr ""
+msgstr "Copiați comanda de adăugare a repozitoriului Gradle Kotlin DSL"
msgid "PackageRegistry|Copy and paste this inside your %{codeStart}pom.xml%{codeEnd} %{codeStart}dependencies%{codeEnd} block."
-msgstr ""
+msgstr "Copiați și lipiți aceasta în blocul de %{codeStart}dependențe%{codeEnd} al fișierului %{codeStart}pom.xml%{codeEnd}."
msgid "PackageRegistry|Copy npm command"
-msgstr ""
+msgstr "Copiați comanda npm"
msgid "PackageRegistry|Copy npm setup command"
-msgstr ""
+msgstr "Copiați comanda de configurare npm"
msgid "PackageRegistry|Copy registry include"
msgstr ""
@@ -26876,238 +27110,247 @@ msgid "PackageRegistry|Copy require package include"
msgstr ""
msgid "PackageRegistry|Copy target SHA"
-msgstr ""
+msgstr "Copiați SHA țintă"
msgid "PackageRegistry|Copy yarn command"
-msgstr ""
+msgstr "Copiați comanda yarn"
msgid "PackageRegistry|Copy yarn setup command"
-msgstr ""
+msgstr "Copiați comanda de configurare yarn"
msgid "PackageRegistry|Created by commit %{link} on branch %{branch}"
-msgstr ""
+msgstr "Creat de commit-ul %{link} pe ramura %{branch}"
msgid "PackageRegistry|Debian"
-msgstr ""
+msgstr "Debian"
msgid "PackageRegistry|Delete Package File"
-msgstr ""
+msgstr "Ștergeți fișierul pachetului"
msgid "PackageRegistry|Delete Package Version"
-msgstr ""
+msgstr "Ștergeți versiunea pachetului"
msgid "PackageRegistry|Delete package"
+msgstr "Ștergeți pachetul"
+
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
msgstr ""
msgid "PackageRegistry|Failed to load the package data"
-msgstr "Încărcarea datelor pachetului a eșuat"
+msgstr "Nu s-a reușit încărcarea datelor pachetului"
msgid "PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}"
-msgstr ""
+msgstr "Pentru mai multe informații despre pachetele Composer în GitLab, %{linkStart}consultați documentația.%{linkEnd}"
msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}."
-msgstr ""
+msgstr "Pentru mai multe informații despre registrul Conan, %{linkStart}consultați documentația%{linkEnd}."
msgid "PackageRegistry|For more information on the Maven registry, %{linkStart}see the documentation%{linkEnd}."
-msgstr ""
+msgstr "Pentru mai multe informații despre registrul Maven, %{linkStart}consultați documentația%{linkEnd}."
msgid "PackageRegistry|For more information on the NuGet registry, %{linkStart}see the documentation%{linkEnd}."
-msgstr ""
+msgstr "Pentru mai multe informații despre registrul NuGet, %{linkStart}consultați documentația%{linkEnd}."
msgid "PackageRegistry|For more information on the PyPi registry, %{linkStart}see the documentation%{linkEnd}."
-msgstr ""
+msgstr "Pentru mai multe informații despre registrul PyPi, %{linkStart}consultați documentația%{linkEnd}."
msgid "PackageRegistry|Generic"
-msgstr ""
+msgstr "Generic"
msgid "PackageRegistry|Gradle Groovy DSL"
-msgstr ""
+msgstr "Gradle Groovy DSL"
msgid "PackageRegistry|Gradle Groovy DSL install command"
-msgstr ""
+msgstr "Comanda de instalare Gradle Groovy DSL"
msgid "PackageRegistry|Gradle Kotlin DSL"
-msgstr ""
+msgstr "Gradle Kotlin DSL"
msgid "PackageRegistry|Gradle Kotlin DSL install command"
-msgstr ""
+msgstr "Comanda de instalare Gradle Kotlin DSL"
msgid "PackageRegistry|Helm"
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 ""
+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 ""
+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}."
msgid "PackageRegistry|Install package version"
-msgstr ""
+msgstr "Instalați versiunea pachetului"
msgid "PackageRegistry|Instance-level"
-msgstr ""
+msgstr "Nivel de instanță"
msgid "PackageRegistry|Invalid Package: failed metadata extraction"
-msgstr ""
+msgstr "Pachet invalid: extracția metadatelor a eșuat"
msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab."
-msgstr ""
+msgstr "Aflați cum să vă %{noPackagesLinkStart}publicați și să partajați pachetele%{noPackagesLinkEnd} cu GitLab."
msgid "PackageRegistry|License information located at %{link}"
-msgstr ""
+msgstr "Informațiile despre licență se găsesc la %{link}"
msgid "PackageRegistry|Manually Published"
-msgstr ""
+msgstr "Publicat manual"
msgid "PackageRegistry|Maven"
-msgstr ""
+msgstr "Maven"
msgid "PackageRegistry|Maven Command"
-msgstr ""
+msgstr "Comanda Maven"
msgid "PackageRegistry|Maven XML"
-msgstr ""
+msgstr "XML Maven"
msgid "PackageRegistry|NuGet"
-msgstr ""
+msgstr "NuGet"
msgid "PackageRegistry|NuGet Command"
-msgstr ""
+msgstr "Comanda NuGet"
msgid "PackageRegistry|Package Registry"
-msgstr ""
+msgstr "Registrul de pachete"
msgid "PackageRegistry|Package deleted successfully"
-msgstr ""
+msgstr "Pachetul a fost șters cu succes"
msgid "PackageRegistry|Package file deleted successfully"
-msgstr ""
+msgstr "Fișierul pachet a fost șters cu succes"
msgid "PackageRegistry|Package has %{updatesCount} archived update"
msgid_plural "PackageRegistry|Package has %{updatesCount} archived updates"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Pachetul are %{updatesCount} actualizare arhivată"
+msgstr[1] "Pachetul are %{updatesCount} actualizări arhivate"
+msgstr[2] "Pachetul are %{updatesCount} de actualizări arhivate"
msgid "PackageRegistry|Package updated by commit %{link} on branch %{branch}, built by pipeline %{pipeline}, and published to the registry %{datetime}"
-msgstr ""
+msgstr "Pachet actualizat de commit-ul %{link} pe ramura %{branch}, construit de pipeline-ul %{pipeline} și publicat în registru la %{datetime}"
msgid "PackageRegistry|Pip Command"
-msgstr ""
+msgstr "Comanda Pip"
msgid "PackageRegistry|Project-level"
-msgstr ""
-
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "Nivel de proiect"
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
-msgstr ""
+msgstr "Publicați pachetele dacă numele sau versiunea lor se potrivește cu acest regex."
msgid "PackageRegistry|Published to the %{project} Package Registry %{datetime}"
-msgstr ""
+msgstr "Publicat în Registrul de pachete %{project} la %{datetime}"
msgid "PackageRegistry|PyPI"
-msgstr ""
+msgstr "PyPI"
msgid "PackageRegistry|Recipe: %{recipe}"
-msgstr ""
+msgstr "Rețetă: %{recipe}"
msgid "PackageRegistry|Registry setup"
-msgstr ""
+msgstr "Configurarea registrului"
msgid "PackageRegistry|Remove package"
-msgstr ""
+msgstr "Înlăturarea pachetului"
msgid "PackageRegistry|Required Python: %{pythonVersion}"
msgstr "Python necesar: %{pythonVersion}"
msgid "PackageRegistry|RubyGems"
-msgstr ""
+msgstr "RubyGems"
msgid "PackageRegistry|Settings for Generic packages"
-msgstr ""
+msgstr "Setări pentru pachetele generice"
msgid "PackageRegistry|Settings for Maven packages"
-msgstr ""
+msgstr "Setări pentru pachetele Maven"
msgid "PackageRegistry|Show Composer commands"
-msgstr ""
+msgstr "Afișați comenzile Composer"
msgid "PackageRegistry|Show Conan commands"
-msgstr ""
+msgstr "Afișați comenzile Conan"
msgid "PackageRegistry|Show NPM commands"
-msgstr ""
+msgstr "Afișați comenzile NPM"
msgid "PackageRegistry|Show Nuget commands"
-msgstr ""
+msgstr "Afișați comenzile Nuget"
msgid "PackageRegistry|Show PyPi commands"
-msgstr ""
+msgstr "Afișați comenzile PyPi"
msgid "PackageRegistry|Show Yarn commands"
-msgstr ""
+msgstr "Afișați comenzile Yarn"
msgid "PackageRegistry|Something went wrong while deleting the package file."
-msgstr ""
+msgstr "Ceva nu a mers bine la ștergerea fișierului pachetului."
msgid "PackageRegistry|Something went wrong while deleting the package."
-msgstr ""
+msgstr "Ceva nu a mers bine la ștergerea pachetului."
msgid "PackageRegistry|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
msgid "PackageRegistry|Source project located at %{link}"
-msgstr ""
+msgstr "Proiectul sursă se află la %{link}"
msgid "PackageRegistry|Target SHA: %{sha}"
-msgstr ""
+msgstr "SHA țintă: %{sha}"
msgid "PackageRegistry|There are no other versions of this package."
-msgstr ""
+msgstr "Nu există alte versiuni ale acestui pachet."
msgid "PackageRegistry|There are no packages yet"
-msgstr ""
+msgstr "Nu există încă pachete"
msgid "PackageRegistry|There was a problem fetching the details for this package."
+msgstr "A apărut o problemă la preluarea detaliilor pentru acest pachet."
+
+msgid "PackageRegistry|There was a timeout and the package was not published. Delete this package and try again."
msgstr ""
-msgid "PackageRegistry|This NuGet package has no dependencies."
+msgid "PackageRegistry|There was an error publishing a %{packageName} package"
msgstr ""
+msgid "PackageRegistry|This NuGet package has no dependencies."
+msgstr "Acest pachet NuGet nu are dependențe."
+
msgid "PackageRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați sau eliminați filtrele de mai sus."
msgid "PackageRegistry|Type"
msgstr "Tip"
msgid "PackageRegistry|Unable to fetch package version information."
-msgstr ""
+msgstr "Nu se pot obține informații despre versiunea pachetului."
msgid "PackageRegistry|Unable to load package"
-msgstr ""
+msgstr "Nu se poate încărca pachetul"
msgid "PackageRegistry|Use GitLab as a private registry for common package formats. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+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 ""
+msgstr "Sunteți pe cale să ștergeți %{filename}. Aceasta este o acțiune distructivă care poate face pachetul dvs. inutilizabil. Sunteți sigur?"
msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?"
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți %{name}, această operațiune este ireversibilă, sunteți sigur?"
msgid "PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?"
-msgstr ""
+msgstr "Sunteți pe cale să ștergeți versiunea %{version} a %{name} Sunteți sigur?"
msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more."
msgstr "S-ar putea, de asemenea, să fie nevoie să configurați autentificarea cu ajutorul unui token auth. %{linkStart}Consultați documentația%{linkEnd} pentru a afla mai multe."
msgid "PackageRegistry|npm"
-msgstr ""
+msgstr "npm"
msgid "PackageRegistry|published by %{author}"
-msgstr ""
+msgstr "publicat de %{author}"
msgid "Packages & Registries"
msgstr ""
@@ -27196,13 +27439,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27289,7 +27532,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27389,7 +27632,7 @@ msgid "PerformanceBar|SQL queries"
msgstr ""
msgid "PerformanceBar|Sort by duration"
-msgstr ""
+msgstr "Sortare după durată"
msgid "PerformanceBar|Sort chronologically"
msgstr ""
@@ -27398,7 +27641,7 @@ msgid "PerformanceBar|Stats"
msgstr ""
msgid "PerformanceBar|Total duration"
-msgstr ""
+msgstr "Durata totală"
msgid "PerformanceBar|Trace"
msgstr ""
@@ -27434,13 +27677,13 @@ msgid "Personal Access Token"
msgstr ""
msgid "Personal Access Token prefix"
-msgstr ""
+msgstr "Prefixul Tokenului de acces personal"
msgid "Personal access tokens are not revoked upon expiration."
msgstr "Token-urile acces personal nu sunt revocate la expirare."
msgid "Personal project creation is not allowed. Please contact your administrator with questions"
-msgstr ""
+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 ""
@@ -27458,7 +27701,7 @@ msgid "Phabricator Tasks"
msgstr ""
msgid "Phone"
-msgstr ""
+msgstr "Telefon"
msgid "Pick a name"
msgstr ""
@@ -27475,11 +27718,8 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
-msgstr ""
+msgstr "Sunteți sigur că vreți să resetați fișierul la ultima sa versiune comisă?"
msgid "Pipeline ID"
msgstr "ID conductă"
@@ -27497,7 +27737,7 @@ msgid "Pipeline URL"
msgstr "URL conductă"
msgid "Pipeline durations for the last 30 commits"
-msgstr ""
+msgstr "Duratele pipeline-ului pentru ultimele 30 de commit-uri"
msgid "Pipeline ran in fork of project"
msgstr ""
@@ -27509,7 +27749,7 @@ 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 ""
+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."
msgid "Pipeline triggers"
msgstr ""
@@ -27518,33 +27758,39 @@ msgid "Pipeline: %{status}"
msgstr ""
msgid "PipelineCharts|An error has occurred when retrieving the analytics data"
-msgstr ""
+msgstr "A apărut o eroare la preluarea datelor analitice"
msgid "PipelineCharts|An error has occurred when retrieving the pipelines data"
-msgstr ""
+msgstr "A apărut o eroare la preluarea datelor pipeline-urilor"
msgid "PipelineCharts|An unknown error occurred while processing CI/CD analytics."
-msgstr ""
+msgstr "A apărut o eroare necunoscută în timpul procesării analizelor CI/CD."
msgid "PipelineCharts|CI/CD Analytics"
-msgstr ""
+msgstr "Analize CI/CD"
msgid "PipelineCharts|Failed:"
-msgstr ""
+msgstr "A eșuat:"
msgid "PipelineCharts|Overall statistics"
msgstr "Statistici generale"
msgid "PipelineCharts|Success ratio:"
-msgstr ""
+msgstr "Rata de succes:"
msgid "PipelineCharts|Successful:"
-msgstr ""
+msgstr "Reușite:"
msgid "PipelineCharts|There was an error parsing the data for the charts."
-msgstr ""
+msgstr "A apărut o eroare la analizarea datelor pentru grafice."
msgid "PipelineCharts|Total:"
+msgstr "Total:"
+
+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}"
@@ -27560,7 +27806,7 @@ msgid "PipelineEditorTutorial|GitLab CI/CD can automatically build, test, and de
msgstr ""
msgid "PipelineEditorTutorial|If you’re using a self-managed GitLab instance, %{linkStart}make sure your instance has runners available.%{linkEnd}"
-msgstr ""
+msgstr "Dacă folosiți o instanță GitLab autogestionată, %{linkStart}asigurați-vă că instanța dvs. are executori disponibili.%{linkEnd}"
msgid "PipelineEditorTutorial|Learn more about %{linkStart}GitLab CI/CD concepts%{linkEnd}"
msgstr ""
@@ -27650,13 +27896,13 @@ msgid "PipelineSource|Chat"
msgstr "Chat"
msgid "PipelineSource|External"
-msgstr ""
+msgstr "Externă"
msgid "PipelineSource|External Pull Request"
-msgstr "Pull Request Extern"
+msgstr "Solicitare pull externă"
msgid "PipelineSource|Merge Request"
-msgstr "Merge Request"
+msgstr "Merge request"
msgid "PipelineSource|On-Demand DAST Scan"
msgstr "Scanare DAST la cerere"
@@ -27665,7 +27911,7 @@ msgid "PipelineSource|On-Demand DAST Validation"
msgstr "Validare DAST la cerere"
msgid "PipelineSource|Parent Pipeline"
-msgstr "Pipeline Părinte"
+msgstr "Pipeline părinte"
msgid "PipelineSource|Pipeline"
msgstr "Pipeline"
@@ -27674,10 +27920,10 @@ msgid "PipelineSource|Push"
msgstr "Push"
msgid "PipelineSource|Schedule"
-msgstr "Program"
+msgstr "Programare"
msgid "PipelineSource|Trigger"
-msgstr ""
+msgstr "Declanșator"
msgid "PipelineSource|Web"
msgstr "Web"
@@ -27728,7 +27974,7 @@ msgid "PipelineWizard|Commit your new file"
msgstr ""
msgid "PipelineWizard|The file has been committed."
-msgstr ""
+msgstr "Commit-ul fișierului s-a efectuat."
msgid "PipelineWizard|There was a problem committing the changes."
msgstr ""
@@ -27743,7 +27989,7 @@ msgid "Pipelines"
msgstr ""
msgid "Pipelines charts"
-msgstr ""
+msgstr "Diagrame de pipeline-uri"
msgid "Pipelines settings for '%{project_name}' were successfully updated."
msgstr ""
@@ -27986,10 +28232,10 @@ msgid "Pipeline|Canceled"
msgstr ""
msgid "Pipeline|Checking pipeline status"
-msgstr ""
+msgstr "Se verifică statusul pipeline-ului"
msgid "Pipeline|Checking pipeline status."
-msgstr ""
+msgstr "Se verifică statusul pipeline-ului"
msgid "Pipeline|Could not retrieve the pipeline status. For troubleshooting steps, read the %{linkStart}documentation%{linkEnd}."
msgstr ""
@@ -28064,7 +28310,7 @@ msgid "Pipeline|Source|Security Policy"
msgstr "Politică 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 ""
+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 ""
@@ -28082,16 +28328,16 @@ msgid "Pipeline|Tag name"
msgstr ""
msgid "Pipeline|Test coverage"
-msgstr ""
+msgstr "Coverage de testare"
msgid "Pipeline|This change will decrease the overall test coverage if merged."
-msgstr ""
+msgstr "Această modificare va reduce gradul general de coverage de teste dacă va fi îmbinată."
msgid "Pipeline|This change will increase the overall test coverage if merged."
-msgstr ""
+msgstr "Această modificare va crește gradul general de coverage de teste dacă va fi îmbinată."
msgid "Pipeline|This change will not change the overall test coverage if merged."
-msgstr ""
+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 ""
@@ -28193,10 +28439,10 @@ msgid "Please add a comment in the text area above"
msgstr ""
msgid "Please check the configuration file for this chart"
-msgstr ""
+msgstr "Vă rugăm să verificați fișierul de configurare pentru acest grafic"
msgid "Please check the configuration file to ensure that a collection of charts has been declared."
-msgstr ""
+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 ""
@@ -28211,7 +28457,7 @@ msgid "Please choose a file"
msgstr ""
msgid "Please complete your profile with email address"
-msgstr ""
+msgstr "Vă rugăm să completați profilul dvs. cu adresa de e-mail"
msgid "Please confirm your email address"
msgstr ""
@@ -28238,7 +28484,7 @@ msgid "Please create a password for your new account."
msgstr ""
msgid "Please create a username with only alphanumeric characters."
-msgstr ""
+msgstr "Vă rugăm să creați un nume de utilizator numai cu caractere alfanumerice."
msgid "Please create an index before enabling indexing"
msgstr ""
@@ -28276,6 +28522,9 @@ 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 ""
@@ -28315,14 +28564,11 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
+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."
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 ""
+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."
msgid "Please select"
msgstr ""
@@ -28367,7 +28613,7 @@ msgid "Please try again"
msgstr ""
msgid "Please try and refresh the page. If the problem persists please contact support."
-msgstr ""
+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 ""
@@ -28375,23 +28621,26 @@ 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."
+msgid "Please visit the %{faq_link} for more information."
msgstr ""
+msgid "Please wait a moment, this page will automatically refresh when ready."
+msgstr "Vă rugăm să așteptați un moment, această pagină se va reîmprospăta automat când va fi gata."
+
msgid "Please wait while we connect to your repository. Refresh at will."
-msgstr ""
+msgstr "Vă rugăm să așteptați în timp ce ne conectăm la repozitoriul dumneavoastră. Reîncărcați în orice moment."
msgid "Please wait while we import the repository for you. Refresh at will."
-msgstr ""
+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 ""
+msgstr "Pod-ul nu există"
msgid "Pod not found"
-msgstr ""
+msgstr "Pod-ul nu a fost găsit"
msgid "Pods in use"
-msgstr ""
+msgstr "Pod-uri în uz"
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 "Indică orice linkuri doriți: documentație, fișiere binare construite sau alte materiale conexe. Acestea pot fi linkuri interne sau externe din instanța GitLab. Fiecare URL și titlu de link trebuie să fie unice."
@@ -28448,103 +28697,118 @@ msgid "Preferences saved."
msgstr ""
msgid "Preferences|Behavior"
-msgstr ""
+msgstr "Comportament"
msgid "Preferences|Choose between fixed (max. 1280px) and fluid (%{percentage}) application layout."
-msgstr ""
+msgstr "Alegeți între aspectul fix (max. 1280px) și fluid (%{percentage}) al aplicației."
msgid "Preferences|Choose what content you want to see on a project’s overview page."
-msgstr ""
+msgstr "Alegeți ce conținut doriți să vedeți în pagina de prezentare generală a unui proiect."
msgid "Preferences|Choose what content you want to see on your homepage."
+msgstr "Alegeți ce conținut doriți să vedeți pe pagina dvs. de pornire."
+
+msgid "Preferences|Color for added lines"
msgstr ""
-msgid "Preferences|Configure how dates and times display for you."
+msgid "Preferences|Color for removed lines"
msgstr ""
+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 ""
+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 colors of removed and added lines in diffs."
msgstr ""
-msgid "Preferences|Display time in 24-hour format"
+msgid "Preferences|Diff colors"
msgstr ""
+msgid "Preferences|Display time in 24-hour format"
+msgstr "Afișați ora în format de 24 de ore"
+
msgid "Preferences|Enable Gitpod integration"
-msgstr ""
+msgstr "Activați integrarea Gitpod"
msgid "Preferences|Enable integrated code intelligence on code views"
-msgstr "Activați inteligența codului integrată în vizualizările de cod"
+msgstr "Activați inteligența integrată a codului în vizualizările de cod"
msgid "Preferences|Failed to save preferences."
-msgstr ""
+msgstr "Nu s-a reușit salvarea preferințelor."
msgid "Preferences|For example: 30 minutes ago."
-msgstr ""
+msgstr "De exemplu: Acum 30 de minute."
msgid "Preferences|Gitpod"
-msgstr ""
+msgstr "Gitpod"
msgid "Preferences|Homepage content"
-msgstr ""
+msgstr "Conținutul paginii de start"
msgid "Preferences|Instead of all the files changed, show only one file at a time. To switch between files, use the file browser."
-msgstr ""
+msgstr "În loc să afișați toate fișierele modificate, afișați doar un singur fișier la un moment dat. Pentru a trece de la un fișier la altul, utilizați browserul de fișiere."
msgid "Preferences|Integrations"
-msgstr ""
+msgstr "Integrări"
msgid "Preferences|Layout width"
-msgstr ""
+msgstr "Lățimea aspectului"
msgid "Preferences|Must be a number between %{min} and %{max}"
-msgstr ""
+msgstr "Trebuie să fie un număr între %{min} și %{max}."
msgid "Preferences|Navigation theme"
+msgstr "Tema de navigare"
+
+msgid "Preferences|Preview"
msgstr ""
msgid "Preferences|Project overview content"
-msgstr ""
+msgstr "Conținutul general al proiectului"
msgid "Preferences|Render whitespace characters in the Web IDE"
-msgstr ""
+msgstr "Redați caracterele de spații albe în Web IDE"
msgid "Preferences|Show one file at a time on merge request's Changes tab"
-msgstr ""
+msgstr "Afișați câte un fișier la un moment dat în fila Modificări a merge request-ului"
msgid "Preferences|Show whitespace changes in diffs"
-msgstr ""
+msgstr "Afișați modificările de spații albe în diff-uri"
msgid "Preferences|Sourcegraph"
-msgstr ""
+msgstr "Sourcegraph"
msgid "Preferences|Surround text selection when typing quotes or brackets"
-msgstr ""
+msgstr "Înconjurați selecția de text atunci când tastați ghilimele sau paranteze"
msgid "Preferences|Syntax highlighting theme"
-msgstr ""
+msgstr "Tema de evidențiere a sintaxei"
msgid "Preferences|Tab width"
-msgstr ""
+msgstr "Lățimea tab-ului"
msgid "Preferences|This feature is experimental and translations are not complete yet"
-msgstr ""
+msgstr "Această funcție este experimentală, iar traducerile nu sunt încă finalizate."
msgid "Preferences|This setting allows you to customize the appearance of the syntax."
-msgstr ""
+msgstr "Această setare vă permite să personalizați aspectul sintaxei."
msgid "Preferences|This setting allows you to customize the behavior of the system layout and default views."
-msgstr ""
+msgstr "Această setare vă permite să personalizați comportamentul aspectului sistemului și al vizualizărilor implicite."
msgid "Preferences|Time preferences"
-msgstr ""
+msgstr "Preferințele de timp"
msgid "Preferences|Use relative times"
-msgstr ""
+msgstr "Utilizați timpi relativi"
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 ""
+msgstr "Atunci când introduceți text într-o casetă de descriere sau de comentariu, textul selectat este înconjurat de caracterul corespunzător după ce ați introdus unul dintre caracterele următoare: %{supported_characters}."
msgid "Preparing the report for the scan."
msgstr "Pregătirea raportului pentru scanare."
@@ -28559,16 +28823,16 @@ msgid "Prevent auto-stopping"
msgstr "Preveniți oprirea automată"
msgid "Prevent editing approval rules in projects and merge requests."
-msgstr ""
+msgstr "Împiedicați editarea regulilor de aprobare în proiecte și merge request-uri."
msgid "Prevent environment from auto-stopping"
-msgstr ""
+msgstr "Împiedicați oprirea automată a mediului"
msgid "Prevent project forking outside current group"
msgstr ""
msgid "Prevent users from changing their profile name"
-msgstr ""
+msgstr "Împiedicați utilizatorii să-și schimbe numele profilului"
msgid "Prevent users from performing write operations while GitLab maintenance is in progress."
msgstr "Împiedicați utilizatorii să efectueze operațiuni de scriere în timp ce întreținerea GitLab este în curs de desfășurare."
@@ -28603,9 +28867,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28631,7 +28892,7 @@ msgid "Private"
msgstr ""
msgid "Private - Guest users are not allowed to view detailed release information like title and source code."
-msgstr ""
+msgstr "Privat - Utilizatorilor invitați nu li se permite să vizualizeze informații detaliate despre versiune, cum ar fi titlul și codul sursă."
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 ""
@@ -28643,7 +28904,7 @@ msgid "Private group(s)"
msgstr ""
msgid "Private profile"
-msgstr ""
+msgstr "Profil privat"
msgid "Private projects Minutes cost factor"
msgstr ""
@@ -28661,7 +28922,7 @@ 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 "Î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 produselor."
+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 ""
@@ -28715,412 +28976,412 @@ msgid "ProductivityAnalytics|is earlier than the given merged at after date"
msgstr ""
msgid "Profile"
-msgstr ""
+msgstr "Profil"
msgid "Profile Settings"
-msgstr ""
+msgstr "Setări de profil"
msgid "Profile failed to delete"
-msgstr ""
+msgstr "Nu s-a reușit ștergerea profilului"
msgid "Profile image guideline"
-msgstr ""
+msgstr "Ghid pentru imaginea de profil"
msgid "Profile page:"
-msgstr ""
+msgstr "Pagina de profil:"
msgid "Profile parameter missing"
-msgstr ""
+msgstr "Lipsește un parametru de profil"
msgid "ProfileSession|on"
-msgstr ""
+msgstr "activat"
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 "Sunteți pe cale să ștergeți definitiv %{yourAccount} și toate problemele, merge request-urile și grupurile legate de contul dumneavoastră. După ce confirmați %{deleteAccount}, această operațiune nu mai poate fi anulată, nici contul recuperat."
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 "Veți schimba numele de utilizator %{currentUsernameBold} în %{newUsernameBold}. Profilul și proiectele vor fi redirecționate către spațiul de nume %{newUsername}, dar această redirecționare va expira odată ce spațiul de nume %{currentUsername} este înregistrat de un alt utilizator sau grup. Vă rugăm să actualizați telecomenzile repozitoriului Git cât mai curând posibil."
+msgstr "Veți schimba numele de utilizator %{currentUsernameBold} în %{newUsernameBold}. Profilul și proiectele vor fi redirecționate către spațiul de nume %{newUsername}, dar această redirecționare va expira odată ce spațiul de nume %{currentUsername} este înregistrat de un alt utilizator sau grup. Vă rugăm să vă actualizați telecomenzile repozitoriului Git cât mai curând posibil."
msgid "Profiles|%{provider} Active"
-msgstr ""
+msgstr "%{provider} Activ"
msgid "Profiles|@username"
-msgstr ""
+msgstr "@numedeutilizator"
msgid "Profiles|Account could not be deleted. GitLab was unable to verify your identity."
-msgstr ""
+msgstr "Contul nu a putut fi șters. GitLab nu a putut să vă verifice identitatea."
msgid "Profiles|Account scheduled for removal."
-msgstr ""
+msgstr "Cont programat pentru eliminare."
msgid "Profiles|Activate signin with one of the following services"
-msgstr ""
+msgstr "Activați autentificarea cu unul dintre următoarele servicii"
msgid "Profiles|Active"
-msgstr ""
+msgstr "Activ"
msgid "Profiles|Add key"
-msgstr ""
+msgstr "Adăugați cheia"
msgid "Profiles|Add status emoji"
-msgstr ""
+msgstr "Adăugați emoji de stare"
msgid "Profiles|An error occurred while updating your username, please try again."
-msgstr ""
+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 ""
+msgstr "Un indicator apare lângă numele și avatarul dumneavoastră"
msgid "Profiles|Avatar cropper"
-msgstr ""
+msgstr "Decupator de avatar"
msgid "Profiles|Avatar will be removed. Are you sure?"
-msgstr ""
+msgstr "Avatarul va fi eliminat. Sunteți sigur?"
msgid "Profiles|Begins with %{ssh_key_algorithms}."
-msgstr ""
+msgstr "ÃŽncepe cu %{ssh_key_algorithms}."
msgid "Profiles|Bio"
-msgstr ""
+msgstr "Scurtă biografie"
msgid "Profiles|Busy"
-msgstr ""
+msgstr "Ocupat"
msgid "Profiles|Change username"
-msgstr ""
+msgstr "Schimbați numele de utilizator"
msgid "Profiles|Changing your username can have unintended side effects."
-msgstr ""
+msgstr "Schimbarea numelui de utilizator poate avea efecte secundare nedorite."
msgid "Profiles|Choose file..."
-msgstr ""
+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 ""
+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|City, country"
-msgstr ""
+msgstr "Oraș, țară"
msgid "Profiles|Clear status"
-msgstr ""
+msgstr "Ștergeți starea"
msgid "Profiles|Commit email"
-msgstr ""
+msgstr "E-mail pentru commit-uri"
msgid "Profiles|Connect %{provider}"
-msgstr ""
+msgstr "Conectare cu %{provider}"
msgid "Profiles|Connected Accounts"
-msgstr ""
+msgstr "Conturi conectate"
msgid "Profiles|Current path: %{path}"
msgstr "Calea curentă: %{path}"
msgid "Profiles|Current status"
-msgstr ""
+msgstr "Starea curentă"
msgid "Profiles|Default notification email"
-msgstr ""
+msgstr "E-mail de notificare implicit"
msgid "Profiles|Delete account"
-msgstr ""
+msgstr "Ștergeți contul"
msgid "Profiles|Deleting an account has the following effects:"
-msgstr ""
+msgstr "Ștergerea unui cont are următoarele efecte:"
msgid "Profiles|Disconnect"
-msgstr ""
+msgstr "Deconectare"
msgid "Profiles|Disconnect %{provider}"
-msgstr ""
+msgstr "Deconectare de la %{provider}"
msgid "Profiles|Do not show on profile"
-msgstr ""
+msgstr "Nu se afișează în profil"
msgid "Profiles|Don't display activity-related personal information on your profile"
-msgstr ""
+msgstr "Nu afișați informații personale legate de activitatea proprie în profilul dvs."
msgid "Profiles|Edit Profile"
-msgstr ""
+msgstr "Editare profil"
msgid "Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place."
-msgstr ""
+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 ""
+msgstr "Introduceți modul în care numele dvs. este pronunțat pentru a ajuta persoanele să vi se adreseze corect"
msgid "Profiles|Enter your name, so people you know can recognize you"
-msgstr ""
+msgstr "Introduceți numele dvs, astfel î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-mail-ului"
+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 ""
+msgstr "Introduceți pronumele dvs. pentru ca persoanele să știe cum să se refere la dvs."
msgid "Profiles|Example: MacBook key"
-msgstr ""
+msgstr "Exemplu: Cheia MacBook"
msgid "Profiles|Expiration date"
-msgstr ""
+msgstr "Data de expirare"
msgid "Profiles|Expired key is not valid."
-msgstr ""
+msgstr "Cheia expirată nu este validă."
msgid "Profiles|Expired:"
-msgstr ""
+msgstr "Expirat:"
msgid "Profiles|Expires:"
-msgstr ""
+msgstr "Expiră:"
msgid "Profiles|Feed token was successfully reset"
-msgstr ""
+msgstr "Tokenul de fluxuri a fost resetat cu succes"
msgid "Profiles|Full name"
-msgstr ""
+msgstr "Numele complet"
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 ""
+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 email %{data_request} to begin the account deletion process."
-msgstr ""
+msgstr "Dacă, după ce ați setat o parolă, opțiunea de a vă șterge contul nu este încă disponibilă, vă rugăm să trimiteți un e-mail la %{data_request} pentru a începe procesul de ștergere a contului."
msgid "Profiles|Include private contributions on my profile"
-msgstr ""
+msgstr "Includeți contribuții private pe profilul meu"
msgid "Profiles|Incoming email token was successfully reset"
-msgstr ""
+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 ""
+msgstr "Creșteți securitatea contului dvs. activând Autentificarea cu doi factori (2FA)"
msgid "Profiles|Invalid key."
-msgstr ""
+msgstr "Cheie invalidă."
msgid "Profiles|Invalid password"
-msgstr ""
+msgstr "Parolă invalidă"
msgid "Profiles|Invalid username"
msgstr "Nume de utilizator invalid"
msgid "Profiles|Job title"
-msgstr ""
+msgstr "Titlul jobului"
msgid "Profiles|Key"
-msgstr ""
+msgstr "Cheie"
msgid "Profiles|Key becomes invalid on this date."
-msgstr ""
+msgstr "Cheia devine invalidă la această dată."
msgid "Profiles|Key becomes invalid on this date. Maximum lifetime for SSH keys is %{max_ssh_key_lifetime} days"
-msgstr ""
+msgstr "Cheia devine invalidă la această dată. Durata maximă de viață pentru cheile SSH este de %{max_ssh_key_lifetime} de zile"
msgid "Profiles|Key can still be used after expiration."
-msgstr ""
+msgstr "Cheia poate fi utilizată în continuare după expirare."
msgid "Profiles|Key titles are publicly visible."
-msgstr ""
+msgstr "Titlurile cheilor sunt vizibile în mod public."
msgid "Profiles|Key usable beyond expiration date."
-msgstr ""
+msgstr "Cheie utilizabilă după data de expirare."
msgid "Profiles|Last used:"
-msgstr ""
+msgstr "Ultima utilizare:"
msgid "Profiles|Learn more"
-msgstr ""
+msgstr "Aflați mai multe"
msgid "Profiles|Location"
-msgstr ""
+msgstr "Localizare"
msgid "Profiles|Made a private contribution"
-msgstr ""
+msgstr "A adus o contribuție privată"
msgid "Profiles|Main settings"
-msgstr ""
+msgstr "Setările principale"
msgid "Profiles|Manage two-factor authentication"
-msgstr ""
+msgstr "Gestionați autentificarea cu doi factori"
msgid "Profiles|No file chosen."
-msgstr ""
+msgstr "Nu a fost ales niciun fișier."
msgid "Profiles|Notification email"
-msgstr ""
+msgstr "E-mail de notificare"
msgid "Profiles|Organization"
-msgstr ""
+msgstr "Organizație"
msgid "Profiles|Path"
-msgstr ""
+msgstr "Cale"
msgid "Profiles|Position and size your new avatar"
-msgstr ""
+msgstr "Poziționați și dimensionați noul avatar"
msgid "Profiles|Primary email"
-msgstr ""
+msgstr "E-mail principal"
msgid "Profiles|Private contributions"
-msgstr ""
+msgstr "Contribuții private"
msgid "Profiles|Profile was successfully updated"
-msgstr ""
+msgstr "Profilul a fost actualizat cu succes"
msgid "Profiles|Pronouns"
-msgstr ""
+msgstr "Pronumele"
msgid "Profiles|Pronunciation"
-msgstr ""
+msgstr "Pronunție"
msgid "Profiles|Public avatar"
-msgstr ""
+msgstr "Avatar public"
msgid "Profiles|Public email"
-msgstr ""
+msgstr "E-mail public"
msgid "Profiles|Publicly visible private SSH keys can compromise your system."
-msgstr ""
+msgstr "Cheile SSH private vizibile în mod public vă pot compromite sistemul."
msgid "Profiles|Remove avatar"
-msgstr ""
+msgstr "Înlăturați avatarul"
msgid "Profiles|Select a service to sign in with."
-msgstr ""
+msgstr "Selectați un serviciu cu care să vă conectați."
msgid "Profiles|Set new profile picture"
-msgstr ""
+msgstr "Setarea unei noi imagini de profil"
msgid "Profiles|Set your local time zone"
-msgstr ""
+msgstr "Setați fusul orar local"
msgid "Profiles|Social sign-in"
-msgstr ""
+msgstr "Conectarea socială"
msgid "Profiles|Some options are unavailable for LDAP accounts"
-msgstr ""
+msgstr "Unele opțiuni nu sunt disponibile pentru conturile LDAP"
msgid "Profiles|Static object token was successfully reset"
-msgstr ""
+msgstr "Tokenul obiectului static a fost resetat cu succes"
msgid "Profiles|Tell us about yourself in fewer than 250 characters"
-msgstr ""
+msgstr "Spuneți-ne 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 ""
+msgstr "Administratorul dvs. a dezactivat capacitatea de a vă actualiza numele."
msgid "Profiles|The maximum file size allowed is 200KB."
-msgstr ""
+msgstr "Dimensiunea maximă permisă a fișierului este de 200KB."
msgid "Profiles|This email will be displayed on your public profile"
-msgstr ""
+msgstr "Acest e-mail va fi afișat pe 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 ""
+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 emoji and message will appear on your profile and throughout the interface."
-msgstr ""
+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 ""
+msgstr "Aceste informații vor apărea pe profilul dumneavoastră"
msgid "Profiles|Time settings"
-msgstr ""
+msgstr "Setări de timp"
msgid "Profiles|Title"
-msgstr ""
+msgstr "Titlu"
msgid "Profiles|Two-Factor Authentication"
-msgstr ""
+msgstr "Autentificare cu două factori"
msgid "Profiles|Type your %{confirmationValue} to confirm:"
-msgstr ""
+msgstr "Introduceți %{confirmationValue} pentru a confirma:"
msgid "Profiles|Update profile settings"
-msgstr ""
+msgstr "Actualizați setările profilului"
msgid "Profiles|Update username"
-msgstr ""
+msgstr "Actualizați numele de utilizator"
msgid "Profiles|Upload new avatar"
-msgstr ""
+msgstr "Încărcați un nou avatar"
msgid "Profiles|Use a private email - %{email}"
-msgstr ""
+msgstr "Utilizați un e-mail privat - %{email}"
msgid "Profiles|User ID"
-msgstr ""
+msgstr "ID utilizator"
msgid "Profiles|Username change failed - %{message}"
-msgstr ""
+msgstr "Schimbarea numelui de utilizator nu a reușit - %{message}"
msgid "Profiles|Username successfully changed"
-msgstr ""
+msgstr "Nume de utilizator schimbat cu succes"
msgid "Profiles|Using emojis in names seems fun, but please try to set a status message instead"
-msgstr ""
+msgstr "Utilizarea emojiurilor în nume pare amuzantă, în schimb, vă rugăm să încercați să stabiliți un mesaj de stare"
msgid "Profiles|Website url"
-msgstr ""
+msgstr "URL-ul site-ului web"
msgid "Profiles|What's your status?"
-msgstr ""
+msgstr "Care este starea dvs. actuală?"
msgid "Profiles|Who you represent or work for"
-msgstr ""
+msgstr "Pe cine reprezentați sau pentru cine lucrați"
msgid "Profiles|You can change your avatar here"
-msgstr ""
+msgstr "Vă puteți schimba avatarul aici"
msgid "Profiles|You can change your avatar here or remove the current avatar to revert to %{gravatar_link}"
-msgstr ""
+msgstr "Vă puteți schimba avatarul aici sau puteți înlătura avatarul actual pentru a reveni la %{gravatar_link}"
msgid "Profiles|You can upload your avatar here"
-msgstr ""
+msgstr "Vă puteți încărca avatarul aici"
msgid "Profiles|You can upload your avatar here or change it at %{gravatar_link}"
-msgstr ""
+msgstr "Vă puteți încărca avatarul aici sau îl puteți schimba la %{gravatar_link}"
msgid "Profiles|You don't have access to delete this user."
-msgstr ""
+msgstr "Nu aveți acces pentru a șterge acest utilizator."
msgid "Profiles|You must accept the Terms of Service in order to perform this action."
-msgstr ""
+msgstr "Trebuie să acceptați Termenii și condițiile de utilizare pentru a efectua această acțiune."
msgid "Profiles|You must transfer ownership or delete groups you are an owner of before you can delete your account"
-msgstr ""
+msgstr "Trebuie să transferați proprietatea sau să ștergeți grupurile de care sunteți proprietar înainte de a vă șterge contul."
msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
-msgstr ""
+msgstr "Trebuie să transferați proprietatea sau să ștergeți aceste grupuri înainte de a vă putea șterge contul."
msgid "Profiles|Your LinkedIn profile name from linkedin.com/in/profilename"
-msgstr ""
+msgstr "Numele profilului dvs. LinkedIn de pe linkedin.com/in/profilename"
msgid "Profiles|Your account is currently an owner in these groups:"
-msgstr ""
+msgstr "Contul dvs. este în prezent proprietar în aceste grupuri:"
msgid "Profiles|Your email address was automatically set based on your %{provider_label} account"
-msgstr ""
+msgstr "Adresa dvs. de e-mail a fost setată automat pe baza contului dvs. %{provider_label}"
msgid "Profiles|Your location was automatically set based on your %{provider_label} account"
-msgstr ""
+msgstr "Locația dvs. a fost setată automat pe baza contului dvs. %{provider_label}"
msgid "Profiles|Your name was automatically set based on your %{provider_label} account, so people you know can recognize you"
-msgstr ""
+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 status"
-msgstr ""
+msgstr "Starea dumneavoastră"
msgid "Profiles|https://website.com"
msgstr "https://website.com"
msgid "Profiles|username"
-msgstr ""
+msgstr "nume de utilizator"
msgid "Profiles|your account"
-msgstr ""
+msgstr "contul dvs."
msgid "Profile|%{job_title} at %{organization}"
-msgstr ""
+msgstr "%{job_title} la %{organization}"
msgid "Profiling - Performance bar"
msgstr ""
@@ -29171,7 +29432,7 @@ msgid "Project Access Tokens"
msgstr ""
msgid "Project Badges"
-msgstr ""
+msgstr "Insigna proiectului"
msgid "Project Files"
msgstr ""
@@ -29224,9 +29485,6 @@ msgstr ""
msgid "Project export download requests"
msgstr "Solicitări descărcare export proiect"
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29267,7 +29525,7 @@ msgid "Project navigation"
msgstr ""
msgid "Project order will not be saved as local storage is not available."
-msgstr ""
+msgstr "Ordinea proiectelor nu va fi salvată, deoarece nu este disponibilă stocarea locală."
msgid "Project path"
msgstr ""
@@ -29303,10 +29561,10 @@ msgid "ProjectCreationLevel|Default project creation protection"
msgstr ""
msgid "ProjectCreationLevel|Developers + Maintainers"
-msgstr ""
+msgstr "Dezvoltatori + Întreținători"
msgid "ProjectCreationLevel|Maintainers"
-msgstr ""
+msgstr "Întreținători"
msgid "ProjectCreationLevel|No one"
msgstr ""
@@ -29318,7 +29576,7 @@ msgid "ProjectFileTree|Show more"
msgstr ""
msgid "ProjectLastActivity|Never"
-msgstr ""
+msgstr "Niciodată"
msgid "ProjectOverview|Fork"
msgstr ""
@@ -29333,10 +29591,10 @@ msgid "ProjectOverview|Star"
msgstr ""
msgid "ProjectOverview|Starrer"
-msgstr "Favorit de"
+msgstr "Marcator cu stea"
msgid "ProjectOverview|Starrers"
-msgstr "Favorit de"
+msgstr "Marcatori cu stele"
msgid "ProjectOverview|Unstar"
msgstr ""
@@ -29360,7 +29618,7 @@ msgid "ProjectQualitySummary|An error occurred while trying to fetch project qua
msgstr ""
msgid "ProjectQualitySummary|Coverage"
-msgstr ""
+msgstr "Coverage"
msgid "ProjectQualitySummary|Failure"
msgstr ""
@@ -29372,19 +29630,19 @@ msgid "ProjectQualitySummary|Latest pipeline results"
msgstr ""
msgid "ProjectQualitySummary|Learn more about test coverage"
-msgstr ""
+msgstr "Aflați mai multe despre coverage de testate"
msgid "ProjectQualitySummary|Learn more about test reports"
msgstr ""
msgid "ProjectQualitySummary|Measure of how much of your code is covered by tests."
-msgstr ""
+msgstr "Măsoară cât de mult din codul dvs. este acoperit de teste."
msgid "ProjectQualitySummary|See full report"
msgstr ""
msgid "ProjectQualitySummary|See project Code Coverage Statistics"
-msgstr ""
+msgstr "Consultați Statisticile de Coverage de Cod ale proiectului"
msgid "ProjectQualitySummary|Set up test runs"
msgstr ""
@@ -29399,7 +29657,7 @@ msgid "ProjectQualitySummary|Success"
msgstr ""
msgid "ProjectQualitySummary|Test coverage"
-msgstr ""
+msgstr "Coverage de testare"
msgid "ProjectQualitySummary|Test runs"
msgstr ""
@@ -29408,22 +29666,22 @@ msgid "ProjectQualitySummary|The percentage of tests that succeed, fail, or are
msgstr ""
msgid "ProjectSelect| or group"
-msgstr ""
+msgstr "sau grup"
msgid "ProjectSelect|No matching results"
-msgstr ""
+msgstr "Nu există rezultate potrivite"
msgid "ProjectSelect|Search for project"
-msgstr ""
+msgstr "Căutați un proiect"
msgid "ProjectSelect|Search projects"
-msgstr ""
+msgstr "Căutați proiecte"
msgid "ProjectSelect|Select a project"
msgstr "Selectați un proiect"
msgid "ProjectSelect|There was an error fetching the projects. Please try again."
-msgstr "A existat o eroare la preluarea proiectelor. Vă rugăm să încercați din nou."
+msgstr "S-a produs o eroare la preluarea proiectelor. Vă rugăm să încercați din nou."
msgid "ProjectService|Drone server URL"
msgstr ""
@@ -29531,61 +29789,61 @@ msgid "ProjectService|Trigger event when an issue is created, updated, or closed
msgstr ""
msgid "ProjectSettings|%{link_start}What are description templates?%{link_end}"
-msgstr ""
+msgstr "%{link_start}Ce sunt șabloanele de descriere?%{link_end}"
msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
-msgstr ""
+msgstr "%{link_start}Ce variabile pot folosi?%{link_end}"
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
-msgstr ""
+msgstr "Setări suplimentare care influențează modul și momentul în care se realizează îmbinările."
msgid "ProjectSettings|All discussions must be resolved"
-msgstr ""
+msgstr "Toate discuțiile trebuie rezolvate"
msgid "ProjectSettings|Allow"
-msgstr ""
+msgstr "Permiteți"
msgid "ProjectSettings|Always show thumbs-up and thumbs-down award emoji buttons on issues, merge requests, and snippets."
msgstr "Afișați întotdeauna butoanele emoji de recompensă cu degetul mare în sus și degetul mare în jos pe probleme, merge request-uri și fragmente de cod."
msgid "ProjectSettings|Analytics"
-msgstr ""
+msgstr "Analize"
msgid "ProjectSettings|Automatically resolve merge request diff discussions when they become outdated"
-msgstr ""
+msgstr "Rezolvați automat discuțiile despre diff în merge request atunci când acestea devin învechite"
msgid "ProjectSettings|Badges"
-msgstr ""
+msgstr "Insigne"
msgid "ProjectSettings|Build, test, and deploy your changes."
-msgstr ""
+msgstr "Creați, testați și implementați modificările."
msgid "ProjectSettings|Checkbox is visible and selected by default."
-msgstr ""
+msgstr "Caseta de selectare este vizibilă și selectată în mod implicit."
msgid "ProjectSettings|Checkbox is visible and unselected by default."
-msgstr ""
+msgstr "Caseta de selectare este vizibilă și neselectată în mod implicit."
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 ""
+msgstr "Alegeți metoda, opțiunile, verificările și opțiunile de squash pentru merge request-uri. De asemenea, puteți configura șabloane de merge request-uri pentru diferite acțiuni."
msgid "ProjectSettings|Choose your merge method, merge options, merge checks, and merge suggestions."
msgstr "Alegeți-vă metoda de îmbinare, opțiunile de îmbinare, verificările de îmbinare și sugestiile de îmbinare."
msgid "ProjectSettings|Choose your merge method, options, checks, and squash options."
-msgstr ""
+msgstr "Alegeți metoda de îmbinare, opțiunile, verificările și opțiunile de squash."
msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
+msgstr "Configurați resursele proiectului și monitorizați starea lor de sănătate."
msgid "ProjectSettings|Contact an admin to change this setting."
-msgstr ""
+msgstr "Contactați un administrator pentru a schimba această setare."
msgid "ProjectSettings|Container registry"
-msgstr ""
+msgstr "Registrul containerelor"
msgid "ProjectSettings|Customize this project's badges."
-msgstr ""
+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."
@@ -29594,40 +29852,40 @@ msgid "ProjectSettings|Disable email notifications"
msgstr "Dezactivați notificările prin e-mail"
msgid "ProjectSettings|Do not allow"
-msgstr ""
+msgstr "Nu permiteți"
msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
-msgstr ""
+msgstr "Activați opțiunea „Șterge ramura sursă†în mod implicit"
msgid "ProjectSettings|Enable merge trains"
-msgstr ""
+msgstr "Activați merge train-urile"
msgid "ProjectSettings|Enable merged results pipelines"
-msgstr ""
+msgstr "Activați pipeline-urile de rezultate combinate"
msgid "ProjectSettings|Encourage"
-msgstr ""
+msgstr "Încurajați"
msgid "ProjectSettings|Every merge creates a merge commit."
msgstr "Fiecare îmbinare creează un commit de îmbinare."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
-msgstr ""
+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. Note: The Package Registry is always visible when a project is public."
-msgstr ""
+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 ""
msgid "ProjectSettings|Existing merge requests and protected branches are not affected."
-msgstr ""
+msgstr "Merge request-urile existente și ramurile protejate nu sunt afectate."
msgid "ProjectSettings|Failed to protect the tag"
-msgstr ""
+msgstr "Nu a reușit să protejeze eticheta"
msgid "ProjectSettings|Failed to update tag!"
-msgstr ""
+msgstr "Nu s-a reușit actualizarea etichetei!"
msgid "ProjectSettings|Fast-forward merge"
msgstr "ÃŽmbinare fast-forward"
@@ -29639,199 +29897,199 @@ msgid "ProjectSettings|Flexible tool to collaboratively develop ideas and plan w
msgstr "Instrument flexibil pentru dezvoltarea în colaborare a ideilor și planificarea activității în cadrul acestui proiect."
msgid "ProjectSettings|Forks"
-msgstr ""
+msgstr "Fork-uri"
msgid "ProjectSettings|Git Large File Storage (LFS)"
-msgstr ""
+msgstr "Git Large File Storage (LFS)"
msgid "ProjectSettings|Global"
-msgstr ""
+msgstr "Global"
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 ""
+msgstr "Evidențiați utilizarea caracterelor unicode ascunse. Acestea au utilizări inofensive pentru limbile de la dreapta la stânga, dar pot fi folosite și în potențiale exploatări."
msgid "ProjectSettings|Housekeeping, export, archive, change path, transfer, and delete."
-msgstr ""
+msgstr "Întreținere, export, arhivare, schimbare de cale, transfer și ștergere."
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."
msgid "ProjectSettings|Internal"
-msgstr ""
+msgstr "Intern"
msgid "ProjectSettings|Introduces the risk of merging changes that do not pass the pipeline."
-msgstr ""
+msgstr "Introduce riscul de îmbinare a modificărilor care nu trec de pipeline."
msgid "ProjectSettings|Issues"
-msgstr ""
+msgstr "Probleme"
msgid "ProjectSettings|LFS objects from this repository are available to forks. %{linkStart}How do I remove them?%{linkEnd}"
-msgstr ""
+msgstr "Obiectele LFS din acest repozitoriu sunt disponibile pentru fork-uri. %{linkStart}Cum le pot elimina?%{linkEnd}"
msgid "ProjectSettings|Learn about commit history."
-msgstr ""
+msgstr "Aflați despre istoricul commit-ului."
msgid "ProjectSettings|Leave empty to use default template."
-msgstr ""
+msgstr "Lăsați gol pentru a utiliza șablonul implicit."
msgid "ProjectSettings|Manage who can see the project in the public access directory."
-msgstr ""
+msgstr "Gestionați cine poate vedea proiectul în directorul de acces public."
msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
-msgstr ""
+msgstr "Gestionează fișiere mari, cum ar fi fișiere audio, video și grafice."
msgid "ProjectSettings|Maximum %{maxLength} characters."
-msgstr ""
+msgstr "Maxim %{maxLength} de caractere."
msgid "ProjectSettings|Merge checks"
-msgstr ""
+msgstr "Verificări de îmbinare"
msgid "ProjectSettings|Merge commit"
-msgstr "Commit de fuziune"
+msgstr "Commit de îmbinare"
msgid "ProjectSettings|Merge commit message template"
-msgstr ""
+msgstr "Șablonul mesajului commit-ului de îmbinare"
msgid "ProjectSettings|Merge commit with semi-linear history"
msgstr "Commit de fuziune cu istoric semiliniar"
msgid "ProjectSettings|Merge method"
-msgstr ""
+msgstr "Metoda de îmbinare"
msgid "ProjectSettings|Merge options"
msgstr "Opțiuni de îmbinare"
msgid "ProjectSettings|Merge requests"
-msgstr ""
+msgstr "Merge request-uri"
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 "Merge request-urile aprobate pentru îmbinare sunt puse în coadă și pipeline-urile validează rezultatele combinate ale ramurilor sursă și țintă înainte de îmbinare. %{link_start}Ce sunt merge train-urile? %{link_end}"
msgid "ProjectSettings|Merge requests can't be merged if the latest pipeline did not succeed or is still running."
-msgstr ""
+msgstr "Merge request-urile nu pot fi îmbinate dacă ultimul pipeline nu a avut succes sau este încă în curs de execuție."
msgid "ProjectSettings|Merge suggestions"
-msgstr ""
+msgstr "Sugestii de îmbinare"
msgid "ProjectSettings|Merging is only allowed when the source branch is up-to-date with its target."
msgstr "Îmbinarea este permisă numai atunci când ramura sursă este actualizată cu cea țintă."
msgid "ProjectSettings|No merge commits are created."
-msgstr ""
+msgstr "Nu se creează niciun commit de îmbinare"
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 "Notă: Registrul containerului este întotdeauna vizibil când un proiect este public È™i registrul containerului este setat la „%{access_level_description}â€"
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
-msgstr ""
+msgstr "Numai la commit-urile semnate se poate face push către acest repozitoriu."
msgid "ProjectSettings|Operations"
-msgstr ""
+msgstr "Operațiuni"
msgid "ProjectSettings|Override user notification preferences for all project members."
-msgstr ""
+msgstr "Suprascrie preferințele de notificare ale utilizatorilor pentru toți membrii proiectului."
msgid "ProjectSettings|Packages"
-msgstr ""
+msgstr "Pachete"
msgid "ProjectSettings|Pages"
-msgstr ""
+msgstr "Pages"
msgid "ProjectSettings|Pages for project documentation."
-msgstr ""
+msgstr "Pages pentru documentația proiectului."
msgid "ProjectSettings|Pipelines must succeed"
-msgstr ""
+msgstr "Pipeline-urile trebuie să reușească"
msgid "ProjectSettings|Private"
-msgstr ""
+msgstr "Privat"
msgid "ProjectSettings|Project visibility"
-msgstr ""
+msgstr "Vizibilitatea proiectului"
msgid "ProjectSettings|Public"
-msgstr ""
+msgstr "Public"
msgid "ProjectSettings|Repository"
-msgstr ""
+msgstr "Repozitoriu"
msgid "ProjectSettings|Require"
-msgstr ""
+msgstr "Solicitați"
msgid "ProjectSettings|Require an associated issue from Jira"
-msgstr ""
+msgstr "Necesită o problemă asociată din Jira"
msgid "ProjectSettings|Requirements"
-msgstr ""
+msgstr "Cerințe"
msgid "ProjectSettings|Requirements management system."
-msgstr ""
+msgstr "Sistemul de gestionare a cerințelor."
msgid "ProjectSettings|Search for topic"
-msgstr ""
+msgstr "Căutați un subiect"
msgid "ProjectSettings|Security & Compliance"
-msgstr ""
+msgstr "Securitate & Conformitate"
msgid "ProjectSettings|Security & Compliance for this project"
-msgstr ""
+msgstr "Securitate și conformitate pentru acest proiect"
msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
-msgstr ""
+msgstr "Stabiliți comportamentul implicit al acestei opțiuni în merge request-uri. Modificările aduse acestei opțiuni se aplică, de asemenea, merge request-urilor existente."
msgid "ProjectSettings|Share code with others outside the project."
-msgstr ""
+msgstr "Partajați codul cu alte persoane din afara proiectului."
msgid "ProjectSettings|Show default award emojis"
-msgstr ""
+msgstr "Afișați emojiurile de atribuire implicite"
msgid "ProjectSettings|Show link to create or view a merge request when pushing from the command line"
msgstr "Afișați linkul pentru a crea sau a vizualiza un merge request atunci când se face push din linia de comandă"
msgid "ProjectSettings|Skipped pipelines are considered successful"
-msgstr ""
+msgstr "Pipeline-urile ignorate sunt considerate reușite"
msgid "ProjectSettings|Snippets"
msgstr "Fragmente de cod"
msgid "ProjectSettings|Squash commit message template"
-msgstr ""
+msgstr "Șablon de squash de mesaj de commit"
msgid "ProjectSettings|Squash commits when merging"
-msgstr ""
+msgstr "Faceți squash de commit-uri la îmbinare"
msgid "ProjectSettings|Squashing is always performed. Checkbox is visible and selected, and users cannot change it."
-msgstr ""
+msgstr "Squashing-ul se efectuează întotdeauna. Caseta de selectare este vizibilă și selectată, iar utilizatorii nu o pot modifica."
msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
-msgstr ""
+msgstr "Squashing-ul nu se efectuează niciodată, iar caseta de selectare este ascunsă."
msgid "ProjectSettings|Submit changes to be merged upstream."
-msgstr ""
+msgstr "Trimiteți modificările pentru a fi îmbinate în amonte."
msgid "ProjectSettings|Target project"
-msgstr ""
+msgstr "Proiect țintă"
msgid "ProjectSettings|The commit message used when applying merge request suggestions."
-msgstr ""
+msgstr "Mesajul commit-ului utilizat atunci când se aplică sugestii de merge request."
msgid "ProjectSettings|The commit message used when merging, if the merge method creates a merge commit."
-msgstr ""
+msgstr "Mesajul commit-ului utilizat la îmbinare, în cazul în care metoda de îmbinare creează un commit de îmbinare."
msgid "ProjectSettings|The commit message used when squashing commits."
-msgstr ""
+msgstr "Mesajul commit-ului utilizat pentru squashing de commit-uri."
msgid "ProjectSettings|The default target project for merge requests created in this fork project."
-msgstr ""
+msgstr "Proiectul țintă implicit pentru merge request-urile create în acest proiect fork."
msgid "ProjectSettings|The default template will be applied on save."
-msgstr ""
+msgstr "Șablonul implicit va fi aplicat la salvare."
msgid "ProjectSettings|These checks must pass before merge requests can be merged."
-msgstr ""
+msgstr "Aceste verificări trebuie să treacă înainte ca merge request-urile să poată fi îmbinate."
msgid "ProjectSettings|This project"
-msgstr ""
+msgstr "Acest proiect"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr "Această setare este aplicată la nivel de server și poate fi suprascrisă de un administrator."
@@ -29843,49 +30101,49 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr
msgstr "Această setare va fi aplicată tuturor proiectelor, cu excepția cazului în care este suprascrisă de un administrator."
msgid "ProjectSettings|Transfer project"
-msgstr ""
+msgstr "Transfer de proiect"
msgid "ProjectSettings|Upstream project"
-msgstr ""
+msgstr "Proiect în amonte"
msgid "ProjectSettings|Used for every new merge request."
msgstr "Utilizat pentru fiecare nou merge request."
msgid "ProjectSettings|Users can copy the repository to a new project."
-msgstr ""
+msgstr "Utilizatorii pot copia repozitoriul într-un nou proiect."
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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 ""
+msgstr "Utilizatorii pot solicita acces"
msgid "ProjectSettings|View and edit files in this project."
msgstr "Vizualizați și editați fișierele din acest proiect."
msgid "ProjectSettings|View and edit files in this project. Non-project members have only read access."
-msgstr ""
+msgstr "Vizualizați și editați fișierele din acest proiect. Cei care nu sunt membri ai proiectului au acces doar în citire."
msgid "ProjectSettings|View project analytics."
msgstr "Vizualizați analizele proiectului."
msgid "ProjectSettings|Visibility options for this fork are limited by the current visibility of the source project."
-msgstr ""
+msgstr "Opțiunile de vizibilitate pentru acest fork sunt limitate de vizibilitatea curentă a proiectului sursă."
msgid "ProjectSettings|Visualize the project's performance metrics."
-msgstr ""
+msgstr "Vizualizați metricile de performanță ale proiectului."
msgid "ProjectSettings|Warn about Potentially Unwanted Characters"
-msgstr ""
+msgstr "Avertizați cu privire la caracterele potențial nedorite"
msgid "ProjectSettings|What are badges?"
-msgstr ""
+msgstr "Ce sunt insignele?"
msgid "ProjectSettings|What are merge trains?"
-msgstr ""
+msgstr "Ce sunt merge train-urile?"
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 "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}"
msgid "ProjectSettings|When semi-linear merge is not possible, the user is given the option to rebase."
msgstr "Când îmbinarea semiliniară nu este posibilă, utilizatorul i se oferă opțiunea de a efectua un rebase."
@@ -29894,100 +30152,100 @@ msgid "ProjectSettings|When there is a merge conflict, the user is given the opt
msgstr "Atunci când există un conflict de îmbinare, utilizatorului i se oferă opțiunea de a face un rebase."
msgid "ProjectSettings|Wiki"
-msgstr ""
+msgstr "Wiki"
msgid "ProjectSettings|With GitLab Pages you can host your static websites on GitLab."
-msgstr ""
+msgstr "Cu GitLab Pages puteți găzdui site-urile dvs. statice pe GitLab."
msgid "ProjectTemplates|.NET Core"
-msgstr ""
+msgstr ".NET Core"
msgid "ProjectTemplates|Android"
-msgstr ""
+msgstr "Android"
msgid "ProjectTemplates|GitLab Cluster Management"
-msgstr ""
+msgstr "Gestionarea clusterului GitLab"
msgid "ProjectTemplates|Gitpod/Spring Petclinic"
-msgstr ""
+msgstr "Gitpod/Spring Petclinic"
msgid "ProjectTemplates|Go Micro"
-msgstr ""
+msgstr "Go Micro"
msgid "ProjectTemplates|HIPAA Audit Protocol"
-msgstr ""
+msgstr "Protocolul de audit HIPAA"
msgid "ProjectTemplates|Kotlin Native for Linux"
-msgstr ""
+msgstr "Kotlin Native pentru Linux"
msgid "ProjectTemplates|Netlify/GitBook"
-msgstr ""
+msgstr "Netlify/GitBook"
msgid "ProjectTemplates|Netlify/Hexo"
-msgstr ""
+msgstr "Netlify/Hexo"
msgid "ProjectTemplates|Netlify/Hugo"
-msgstr ""
+msgstr "Netlify/Hugo"
msgid "ProjectTemplates|Netlify/Jekyll"
-msgstr ""
+msgstr "Netlify/Jekyll"
msgid "ProjectTemplates|Netlify/Plain HTML"
-msgstr ""
+msgstr "Netlify/Plain HTML"
msgid "ProjectTemplates|NodeJS Express"
-msgstr ""
+msgstr "NodeJS Express"
msgid "ProjectTemplates|Pages/Gatsby"
-msgstr ""
+msgstr "Pages/Gatsby"
msgid "ProjectTemplates|Pages/GitBook"
-msgstr ""
+msgstr "Pages/GitBook"
msgid "ProjectTemplates|Pages/Hexo"
-msgstr ""
+msgstr "Pages/Hexo"
msgid "ProjectTemplates|Pages/Hugo"
-msgstr ""
+msgstr "Pages/Hugo"
msgid "ProjectTemplates|Pages/Jekyll"
-msgstr ""
+msgstr "Pages/Jekyll"
msgid "ProjectTemplates|Pages/Middleman"
-msgstr ""
+msgstr "Pages/Middleman"
msgid "ProjectTemplates|Pages/Plain HTML"
-msgstr ""
+msgstr "Pages/Plain HTML"
msgid "ProjectTemplates|Ruby on Rails"
-msgstr ""
+msgstr "Ruby on Rails"
msgid "ProjectTemplates|SalesforceDX"
-msgstr ""
+msgstr "SalesforceDX"
msgid "ProjectTemplates|Sample GitLab Project"
-msgstr ""
+msgstr "Exemplu de proiect GitLab"
msgid "ProjectTemplates|Serverless Framework/JS"
-msgstr ""
+msgstr "Framework Serverless/JS"
msgid "ProjectTemplates|Spring"
-msgstr ""
+msgstr "Spring"
msgid "ProjectTemplates|Tencent Serverless Framework/NextjsSSR"
-msgstr ""
+msgstr "Tencent Serverless Framework/NextjsSSR"
msgid "ProjectTemplates|iOS (Swift)"
-msgstr ""
+msgstr "iOS (Swift)"
msgid "ProjectView|Activity"
-msgstr ""
+msgstr "Activitate"
msgid "ProjectView|Files and Readme (default)"
-msgstr ""
+msgstr "Fișiere și Readme (implicit)"
msgid "ProjectView|Readme"
-msgstr ""
+msgstr "Readme"
msgid "Projects"
msgstr ""
@@ -30062,82 +30320,82 @@ msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr ""
+msgstr "Această caracteristică necesită un browser care suportă localStorage"
msgid "ProjectsNew|Allows you to immediately clone this project’s repository. Skip this if you plan to push up an existing repository."
-msgstr ""
+msgstr "Vă permite să clonați imediat repozitoriul acestui proiect. Săriți peste această etapă dacă intenționați să faceți un push de repozitoriu existent."
msgid "ProjectsNew|Analyze your source code for known security vulnerabilities."
-msgstr "Analizează codul dvs. sursă pentru vulnerabilități cunoscute."
+msgstr "Analizați codul sursă pentru a detecta vulnerabilitățile de securitate cunoscute."
msgid "ProjectsNew|Connect your external repository to GitLab CI/CD."
-msgstr ""
+msgstr "Conectați repozitoriul dvs. extern la GitLab CI/CD."
msgid "ProjectsNew|Contact an administrator to enable options for importing your project."
-msgstr ""
+msgstr "Contactați un administrator pentru a activa opțiunile de import ale proiectului dumneavoastră."
msgid "ProjectsNew|Create"
-msgstr ""
+msgstr "Creați"
msgid "ProjectsNew|Create a blank project to house your files, plan your work, and collaborate on code, among other things."
-msgstr ""
+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 project pre-populated with the necessary files to get you started quickly."
-msgstr ""
+msgstr "Creați un proiect precompletat cu fișierele necesare pentru a începe rapid."
msgid "ProjectsNew|Create blank project"
-msgstr ""
+msgstr "Creați un proiect gol"
msgid "ProjectsNew|Create from template"
-msgstr ""
+msgstr "Creați dintr-un șablon"
msgid "ProjectsNew|Create new project"
-msgstr ""
+msgstr "Creați un nou proiect"
msgid "ProjectsNew|Description format"
-msgstr ""
+msgstr "Formatul descrierii"
msgid "ProjectsNew|Enable Static Application Security Testing (SAST)"
-msgstr "Activați testarea statică a securității aplicațiilor (SAST)"
+msgstr "Activați Testarea statică a securității aplicațiilor (SAST)"
msgid "ProjectsNew|Import"
-msgstr ""
+msgstr "Import"
msgid "ProjectsNew|Import project"
-msgstr ""
+msgstr "Importați un proiect"
msgid "ProjectsNew|Include a Getting Started README"
-msgstr ""
+msgstr "Includeți un README introductiv"
msgid "ProjectsNew|Initialize repository with a README"
-msgstr ""
+msgstr "Inițializați depozitul cu un README"
msgid "ProjectsNew|Migrate your data from an external source like GitHub, Bitbucket, or another instance of GitLab."
-msgstr ""
+msgstr "Migrați datele dintr-o sursă externă, cum ar fi GitHub, Bitbucket sau o altă instanță de GitLab."
msgid "ProjectsNew|No import options available"
-msgstr ""
+msgstr "Nu sunt disponibile opțiuni de import"
msgid "ProjectsNew|Pick a group or namespace"
-msgstr ""
+msgstr "Alegeți un grup sau un spațiu de nume"
msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
-msgstr ""
+msgstr "Alegeți un grup sau un spațiu de nume în care doriți să creați acest proiect."
msgid "ProjectsNew|Project Configuration"
-msgstr ""
+msgstr "Configurarea proiectului"
msgid "ProjectsNew|Project description %{tag_start}(optional)%{tag_end}"
-msgstr ""
+msgstr "Descrierea proiectului %{tag_start}(opțional)%{tag_end}"
msgid "ProjectsNew|Recommended if you're new to GitLab"
-msgstr ""
+msgstr "Recomandat dacă sunteți nou în GitLab"
msgid "ProjectsNew|Run CI/CD for external repository"
-msgstr ""
+msgstr "Rulați CI/CD pentru repozitoriul extern"
msgid "ProjectsNew|Visibility Level"
-msgstr ""
+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ă adăpostiți mai multe proiecte dependente în același spațiu de nume? %{link_start}Creați un grup.%{link_end}"
@@ -30287,7 +30545,7 @@ msgid "Promotion is not supported."
msgstr ""
msgid "Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!"
-msgstr ""
+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."
@@ -30296,7 +30554,7 @@ msgid "Promotions|Better Protected Branches"
msgstr "Ramuri mai bine protejate"
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 ""
+msgstr "Graficele Burndown sunt reprezentări vizuale ale progresului de finalizare a unui obiectiv. Dintr-o singură privire, vedeți starea actuală de finalizare a unui obiectiv de etapă dat. Fără ele, ar trebui să vă organizați datele obiectivului etapei și să le trasați singur pe grafic pentru a avea același sentiment de progres."
msgid "Promotions|Buy EE"
msgstr ""
@@ -30317,7 +30575,7 @@ msgid "Promotions|Description templates allow you to define context-specific tem
msgstr "Șablonuri descriere vă permit să definiți șabloane specifice pentru câmpuri de probleme și cereri de îmbinare pentru proiectul dvs."
msgid "Promotions|Dismiss burndown charts promotion"
-msgstr ""
+msgstr "Respingeți promovarea graficelor burndown"
msgid "Promotions|Dismiss repository features promotion"
msgstr "Respingeți promovarea funcțiilor repozitoriului"
@@ -30335,7 +30593,7 @@ msgid "Promotions|Improve merge requests and customer support with GitLab Enterp
msgstr "Îmbunătățiți cererile de îmbinare și asistența pentru clienți cu GitLab Enterprise Edition."
msgid "Promotions|Improve milestones with Burndown Charts."
-msgstr ""
+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."
@@ -30401,7 +30659,7 @@ msgid "Promotions|Upgrade your plan to improve merge requests."
msgstr "Actualizați-vă planul pentru a îmbunătăți cererile de îmbinare."
msgid "Promotions|Upgrade your plan to improve milestones with Burndown Charts."
-msgstr ""
+msgstr "Actualizați-vă planul pentru a vă îmbunătăți obiectivele cu Graficele Burndown."
msgid "Promotions|Upgrade your plan to improve repositories."
msgstr "Actualizați-vă planul pentru a îmbunătăți repozitoriile."
@@ -30419,7 +30677,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 "Puteți restricționa accesul la ramuri protejate alegând un rol (Întreținători, Dezvoltatori) sau utilizatori individuali."
+msgstr "Puteți restricționa accesul la ramurile protejate prin selectarea unui rol (Întreținători, Dezvoltatori), precum și a anumitor utilizatori."
msgid "Promotions|description templates"
msgstr "Șabloane descriere"
@@ -30533,7 +30791,7 @@ msgid "ProtectedBranch|Protected branches"
msgstr ""
msgid "ProtectedBranch|Reject code pushes that change files listed in the CODEOWNERS file."
-msgstr ""
+msgstr "Refuzați împingerile de cod care modifică fișierele enumerate în fișierul CODEOWNERS."
msgid "ProtectedBranch|Require approval from code owners:"
msgstr ""
@@ -30647,7 +30905,7 @@ msgid "Proxy support for this API is not available currently"
msgstr ""
msgid "Pseudonymized data collection is disabled. When enabled, GitLab runs a background job to export pseudonymized CSVs of the GitLab database. The CSV files are then uploaded to your configured object storage directory."
-msgstr ""
+msgstr "Colectarea de date pseudonimizate este dezactivată. Atunci când este activată, GitLab execută un job în fundal pentru a exporta CSV-uri pseudonimizate din baza de date GitLab. Fișierele CSV sunt apoi încărcate în directorul configurat pentru stocarea obiectelor."
msgid "Pseudonymizer data collection"
msgstr ""
@@ -30743,31 +31001,31 @@ 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 ""
+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."
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 ""
+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."
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 ""
+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."
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 ""
+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 ""
+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."
msgid "PushRules|Do not allow users to remove Git tags with %{code_block_start}git push%{code_block_end}"
-msgstr ""
+msgstr "Nu permiteți utilizatorilor să elimine etichete Git cu %{code_block_start}git push%{code_block_end}"
msgid "PushRules|Reject any files likely to contain secrets. %{secret_files_link_start}What secret files are rejected?%{secret_files_link_end}"
-msgstr ""
+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 ""
+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."
msgid "PushRules|Restrict commits to existing GitLab users."
-msgstr ""
+msgstr "Limitați commit-urile la utilizatorii GitLab existenți."
msgid "PushRules|Restrict push operations for this project."
msgstr ""
@@ -30779,13 +31037,13 @@ msgid "PushRules|Select push rules"
msgstr ""
msgid "PushRules|Users can still delete tags through the GitLab UI."
-msgstr ""
+msgstr "Utilizatorii pot șterge în continuare etichetele prin interfața GitLab UI."
msgid "PushRule|Push rules"
msgstr ""
msgid "PushRule|Reject unverified users"
-msgstr ""
+msgstr "Respingeți utilizatorii neverificați"
msgid "Pushed"
msgstr ""
@@ -30794,7 +31052,7 @@ msgid "Pushes"
msgstr ""
msgid "PushoverService|%{user_name} deleted branch \"%{ref}\"."
-msgstr ""
+msgstr "%{user_name} a È™ters ramura „%{ref}â€."
msgid "PushoverService|%{user_name} push to branch \"%{ref}\"."
msgstr ""
@@ -30890,7 +31148,7 @@ msgid "Raw blob request rate limit per minute"
msgstr ""
msgid "Raw blob requests"
-msgstr "Solicitări brute blob"
+msgstr "Solicitări blob brute"
msgid "Re-authentication period expired or never requested. Please try again"
msgstr ""
@@ -30904,9 +31162,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30929,7 +31184,7 @@ 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 ""
+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 ""
@@ -30944,7 +31199,7 @@ msgid "Rebase"
msgstr "Rebase"
msgid "Rebase in progress"
-msgstr "Rebase în desfășurare"
+msgstr "Rebase în curs"
msgid "Rebase source branch"
msgstr "Faceți un rebase al ramurii sursă"
@@ -30983,7 +31238,7 @@ msgid "Recent"
msgstr ""
msgid "Recent Project Activity"
-msgstr ""
+msgstr "Activitatea recentă a proiectului"
msgid "Recent Searches Service is unavailable"
msgstr ""
@@ -30991,9 +31246,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31022,7 +31274,7 @@ msgid "Reduce project visibility"
msgstr ""
msgid "Reduce risk and triage fewer vulnerabilities with security training"
-msgstr ""
+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 ""
@@ -31034,19 +31286,19 @@ msgid "References"
msgstr ""
msgid "Refine your search criteria (select a %{strong_open}group%{strong_close} and %{strong_open}project%{strong_close} when possible)"
-msgstr "Rafinați-vă criteriul de căutare (selectați un %{strong_open}grup%{strong_close} și %{strong_open}proiect%{strong_close} când este posibil)"
+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 ""
+msgstr "Reîmprospătare"
msgid "Refresh the page and try again."
-msgstr ""
+msgstr "Reîmprospătați pagina și încercați din nou."
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] ""
-msgstr[2] ""
+msgstr[0] "Se reîmprospătează într-o secundă pentru a afișa starea actualizată..."
+msgstr[1] "Se reîmprospătează în %d secunde pentru a afișa starea actualizată..."
+msgstr[2] "Se reîmprospătează în %d de secunde pentru a afișa starea actualizată..."
msgid "Regenerate export"
msgstr ""
@@ -31099,9 +31351,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31160,7 +31409,7 @@ msgid "Registration|Your first project"
msgstr ""
msgid "Registration|Your profile"
-msgstr ""
+msgstr "Profilul dumneavoastră"
msgid "Registry setup"
msgstr ""
@@ -31172,7 +31421,7 @@ msgid "Reject"
msgstr "Respingeți"
msgid "Rejected (closed)"
-msgstr ""
+msgstr "Respins (închis)"
msgid "Relate to %{issuable_type} %{add_related_issue_link}"
msgstr "Se referă la %{issuable_type} %{add_related_issue_link}"
@@ -31286,10 +31535,10 @@ msgid "Remove %{displayReference}"
msgstr ""
msgid "Remove Zoom meeting"
-msgstr ""
+msgstr "Înlăturați reuniunea Zoom"
msgid "Remove Zoom meeting."
-msgstr ""
+msgstr "Înlăturați reuniunea Zoom."
msgid "Remove access"
msgstr ""
@@ -31301,7 +31550,7 @@ msgid "Remove all or specific label(s)"
msgstr ""
msgid "Remove all or specific reviewer(s)"
-msgstr ""
+msgstr "Eliminați toți sau anumiți recenzenți"
msgid "Remove approvers"
msgstr ""
@@ -31418,7 +31667,7 @@ msgid "Remove time estimate"
msgstr ""
msgid "Remove topic avatar"
-msgstr ""
+msgstr "Înlăturați avatarul subiectului"
msgid "Remove user"
msgstr ""
@@ -31532,7 +31781,7 @@ msgid "Removes time estimate."
msgstr ""
msgid "Removing this group also removes all child projects, including archived projects, and their resources."
-msgstr ""
+msgstr "Înlăturarea acestui grup elimină, de asemenea, toate proiectele copil, inclusiv proiectele arhivate, și resursele acestora."
msgid "Rename file"
msgstr ""
@@ -31559,7 +31808,7 @@ msgid "Reopen %{issueType}"
msgstr ""
msgid "Reopen %{noteable}"
-msgstr ""
+msgstr "Redeschide %{noteable}"
msgid "Reopen epic"
msgstr ""
@@ -31579,9 +31828,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31621,9 +31867,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31637,7 +31880,7 @@ msgid "Report for the scan has been removed from the database."
msgstr "Raportul pentru scanare a fost eliminat din baza de date."
msgid "Reported %{timeAgo} by %{reportedBy}"
-msgstr ""
+msgstr "Raportat(ă) %{timeAgo} de %{reportedBy}"
msgid "Reported by"
msgstr ""
@@ -31652,13 +31895,13 @@ msgid "Reports|%{combinedString} and %{resolvedString}"
msgstr "%{combinedString} și %{resolvedString}"
msgid "Reports|%{recentlyFailed} out of %{failed} failed test has failed more than once in the last 14 days"
-msgstr "%{recentlyFailed} din %{failed} din testele eșuate a eșuat mai mult de o dată în ultimele 14 zile"
+msgstr "%{recentlyFailed} din %{failed} de teste eșuate a(u) eșuat mai mult de o dată în ultimele 14 zile"
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] "%{recentlyFailed} din %{failed} din testele eșuate a eșuat mai mult de o dată în ultimele 14 zile"
-msgstr[1] "%{recentlyFailed} din %{failed} din testele eșuate au eșuat mai mult de o dată în ultimele 14 zile"
-msgstr[2] "%{recentlyFailed} din %{failed} din testele eșuate au eșuat mai mult de o dată în ultimele 14 zile"
+msgstr[0] "%{recentlyFailed} din %{failed} teste eșuate a eșuat mai mult de o dată în ultimele 14 zile"
+msgstr[1] "%{recentlyFailed} din %{failed} teste eșuate au eșuat mai mult de o dată în ultimele 14 zile"
+msgstr[2] "%{recentlyFailed} din %{failed} de teste eșuate au eșuat mai mult de o dată în ultimele 14 zile"
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"
@@ -31668,12 +31911,12 @@ msgstr[2] "Scanarea accesibilității a detectat %d de probleme numai pentru ram
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] ""
-msgstr[2] ""
+msgstr[0] "Scanarea accesibilității a detectat %{strong_start}%{number}%{strong_end} problemă numai pentru ramura sursă"
+msgstr[1] "Scanarea accesibilității a detectat %{strong_start}%{number}%{strong_end} probleme numai pentru ramura sursă"
+msgstr[2] "Scanarea accesibilității a detectat %{strong_start}%{number}%{strong_end} de probleme numai pentru ramura sursă"
msgid "Reports|Accessibility scanning detected no issues for the source branch only"
-msgstr "Scanarea accesibilității nu a detectat probleme exclusiv pentru ramura sursă"
+msgstr "Scanarea accesibilității nu a detectat probleme numai pentru ramura sursă"
msgid "Reports|Accessibility scanning failed loading results"
msgstr "Scanarea de accesibilitate nu a reușit să încarce rezultatele"
@@ -31720,17 +31963,20 @@ msgstr "Eșec"
msgid "Reports|Filename"
msgstr "Numele fișierului"
-msgid "Reports|Full report"
+msgid "Reports|Fixed"
msgstr ""
+msgid "Reports|Full report"
+msgstr "Raport complet"
+
msgid "Reports|Head report parsing error:"
-msgstr "Eroare de analiză a raportului principal:"
+msgstr "Head raportează o eroare de analiză:"
msgid "Reports|Identifier"
msgstr "Identificator"
msgid "Reports|Metrics report scanning detected no new changes"
-msgstr ""
+msgstr "Scanarea raportului de metrici nu a detectat nicio modificare nouă"
msgid "Reports|Metrics reports are loading"
msgstr "Rapoartele de metrici se încarcă"
@@ -31742,12 +31988,15 @@ msgid "Reports|Metrics reports did not change"
msgstr "Rapoartele de metrici nu s-au modificat"
msgid "Reports|Metrics reports failed loading results"
-msgstr "Rapoartele de metrici nu au reușit să încarce rezultatele"
+msgstr "Rapoartele de metrici au eșuat la încărcarea rezultatelor"
msgid "Reports|Metrics reports failed to load results"
-msgstr ""
+msgstr "Rapoartele de metrici au eșuat să încarce rezultatele"
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+msgstr "Rapoarte de metrici: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
+
+msgid "Reports|New"
msgstr ""
msgid "Reports|Scanner"
@@ -31757,22 +32006,22 @@ msgid "Reports|Severity"
msgstr "Severitatea"
msgid "Reports|System output"
-msgstr "Ieșirea sistemului"
+msgstr "Ieșire de sistem"
msgid "Reports|Test summary"
msgstr "Rezumatul testului"
msgid "Reports|Test summary failed loading results"
-msgstr "Rezumatul testului nu a reușit să încarce rezultatele"
+msgstr "Rezumatul testului nu a reușit încărcarea rezultatelor"
msgid "Reports|Test summary failed to load results"
-msgstr ""
+msgstr "Rezumatul testului nu a reușit să încarce rezultatele"
msgid "Reports|Test summary results are being parsed"
msgstr "Rezultatele rezumatului testului sunt analizate"
msgid "Reports|Test summary results are loading"
-msgstr ""
+msgstr "Rezultatele rezumatului testului se încarcă"
msgid "Reports|Tool"
msgstr "Instrument"
@@ -31781,7 +32030,7 @@ msgid "Reports|Vulnerability"
msgstr "Vulnerabilitate"
msgid "Reports|Vulnerability Name"
-msgstr "Denumirea vulnerabilității"
+msgstr "Numele vulnerabilității"
msgid "Reports|no changed test results"
msgstr "nu s-au modificat rezultatele testelor"
@@ -31793,64 +32042,64 @@ msgid "Repositories Analytics"
msgstr ""
msgid "RepositoriesAnalytics|Average Coverage by Job"
-msgstr ""
+msgstr "Coverage mediu pe job"
msgid "RepositoriesAnalytics|Average coverage"
-msgstr ""
+msgstr "Coverage mediu"
msgid "RepositoriesAnalytics|Average test coverage last 30 days"
-msgstr ""
+msgstr "Coverage de testare mediu în ultimele 30 de zile"
msgid "RepositoriesAnalytics|Code Coverage: %{averageCoverage}"
-msgstr ""
+msgstr "Coverage de cod: %{averageCoverage}"
msgid "RepositoriesAnalytics|Coverage"
-msgstr ""
+msgstr "Coverage"
msgid "RepositoriesAnalytics|Coverage Jobs"
-msgstr ""
+msgstr "Joburi de coverage"
msgid "RepositoriesAnalytics|Download historic test coverage data"
-msgstr ""
+msgstr "Descărcați datele istoricului de coverage de teste"
msgid "RepositoriesAnalytics|Download historic test coverage data (.csv)"
-msgstr ""
+msgstr "Descărcați datele istoricului de coverage de teste (.csv)"
msgid "RepositoriesAnalytics|Download test coverage data (.csv)"
-msgstr ""
+msgstr "Descărcați datele de coverage de teste (.csv)"
msgid "RepositoriesAnalytics|Historic Test Coverage Data is available in raw format (.csv) for further analysis."
-msgstr ""
+msgstr "Datele istoricului de coverage de teste sunt disponibile în format brut (.csv) pentru analize ulterioare."
msgid "RepositoriesAnalytics|Jobs with Coverage"
-msgstr ""
+msgstr "Joburi cu Coverage"
msgid "RepositoriesAnalytics|Jobs with Coverage: %{coverageCount}"
-msgstr ""
+msgstr "Joburi cu Coverage: %{coverageCount}"
msgid "RepositoriesAnalytics|Last Update"
msgstr ""
msgid "RepositoriesAnalytics|Latest test coverage results"
-msgstr ""
+msgstr "Ultimele rezultate de coverage de teste"
msgid "RepositoriesAnalytics|No test coverage to display"
-msgstr ""
+msgstr "Niciun coverage de teste de afișat"
msgid "RepositoriesAnalytics|Please select a project or multiple projects to display their most recent test coverage data."
-msgstr "Vă rugăm să selectați un proiect sau mai multe proiecte pentru a afișa cele mai recente date de acoperire a testelor."
+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 ""
msgid "RepositoriesAnalytics|Projects with Coverage"
-msgstr ""
+msgstr "Proiecte cu Coverage"
msgid "RepositoriesAnalytics|Projects with Coverage: %{projectCount}"
-msgstr ""
+msgstr "Proiecte cu Coverage: %{projectCount}"
msgid "RepositoriesAnalytics|Test Code Coverage"
-msgstr ""
+msgstr "Testare Coverage de cod"
msgid "RepositoriesAnalytics|There was an error fetching the projects."
msgstr ""
@@ -31904,7 +32153,7 @@ msgid "Repository has tags."
msgstr ""
msgid "Repository maintenance"
-msgstr ""
+msgstr "Administrarea repozitoriului"
msgid "Repository mirroring"
msgstr ""
@@ -31924,9 +32173,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31945,9 +32191,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31957,9 +32200,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31999,9 +32239,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 "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}"
@@ -32052,9 +32289,9 @@ msgstr ""
msgid "Requires %d approval from eligible users."
msgid_plural "Requires %d approvals from eligible users."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Necesită %d aprobare din partea utilizatorilor eligibili."
+msgstr[1] "Necesită %d aprobări din partea utilizatorilor eligibili."
+msgstr[2] "Necesită %d de aprobări din partea utilizatorilor eligibili."
msgid "Requires %{count} approval from %{names}."
msgid_plural "Requires %{count} approvals from %{names}."
@@ -32063,7 +32300,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "Requires values to meet regular expression requirements."
-msgstr ""
+msgstr "Necesită ca valorile să îndeplinească cerințele expresiilor regulate."
msgid "Requires you to deploy or set up cloud-hosted Sentry."
msgstr ""
@@ -32105,7 +32342,7 @@ msgid "Reset filters"
msgstr ""
msgid "Reset health check access token"
-msgstr ""
+msgstr "Resetați tokenul de acces pentru verificarea de sănătate"
msgid "Reset key"
msgstr ""
@@ -32132,13 +32369,13 @@ msgid "Resolve"
msgstr ""
msgid "Resolve conflicts"
-msgstr ""
+msgstr "Rezolvați conflictele"
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 ""
+msgstr "Rezolvați aceste conflicte sau rugați pe cineva cu acces în scriere la acest repozitoriu să îl îmbine local."
msgid "Resolve thread"
msgstr "Rezolvați subiectul"
@@ -32162,7 +32399,7 @@ msgid "Response"
msgstr ""
msgid "Response didn't include `service_desk_address`"
-msgstr ""
+msgstr "Răspunsul nu include „service_desk_addressâ€."
msgid "Response metrics (AWS ELB)"
msgstr ""
@@ -32186,10 +32423,10 @@ msgid "Response text"
msgstr ""
msgid "Restart GitLab to apply changes."
-msgstr ""
+msgstr "Reporniți GitLab pentru a aplica modificările."
msgid "Restart Terminal"
-msgstr ""
+msgstr "Reporniți terminalul"
msgid "Restore"
msgstr ""
@@ -32209,9 +32446,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32228,11 +32462,14 @@ msgid "Resync"
msgstr ""
msgid "Retrieving the compliance report failed. Refresh the page and try again."
-msgstr ""
+msgstr "Recuperarea raportului de conformitate a eșuat. Reîmprospătați pagina și încercați din nou."
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32356,6 +32593,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32381,7 +32621,7 @@ 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 "Rulați conductele CI/CD cu Jenkins atunci când faceți push către un repozitoriu sau atunci când o cerere de îmbinare este creată, actualizată sau îmbinată. %{docs_link}"
+msgstr "Rulați pipeline-uri CI/CD cu Jenkins atunci când faceți push într-un repozitoriu sau atunci când este creat, actualizat sau îmbinat un merge request. %{docs_link}"
msgid "Run CI/CD pipelines with Jenkins."
msgstr ""
@@ -32393,16 +32633,16 @@ msgid "Run manual or delayed jobs"
msgstr ""
msgid "Run tests against your code live using the Web Terminal"
-msgstr ""
+msgstr "Rulați testele pentru codul dvs. în timp real utilizând Terminalul Web"
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
-msgstr "Executorul nu poate fi șters, vă rugăm să vă contactați administratorul."
+msgid "Runner API"
+msgstr ""
msgid "Runner tokens"
msgstr ""
@@ -32419,443 +32659,437 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
msgid "Runners|%{percentage} spot."
-msgstr ""
+msgstr "Spot %{percentage}"
msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%{strongStart}%{count}%{strongEnd} executor selectat"
+msgstr[1] "%{strongStart}%{count}%{strongEnd} executori selectați"
+msgstr[2] "%{strongStart}%{count}%{strongEnd} de executori selectați"
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] ""
-msgstr[2] ""
+msgstr[0] "%{strongStart}%{count}%{strongEnd} executor va fi șters permanent și nu va mai fi disponibil pentru proiectele sau grupurile din instanță. Sunteți sigur că doriți să continuați?"
+msgstr[1] "%{strongStart}%{count}%{strongEnd} executori vor fi șterși permanent și nu vor mai fi disponibili pentru proiectele sau grupurile din instanță. Sunteți sigur că doriți să continuați?"
+msgstr[2] "%{strongStart}%{count}%{strongEnd} de executori vor fi șterși permanent și nu vor mai fi disponibili pentru proiectele sau grupurile din instanță. Sunteți sigur că doriți să continuați?"
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 ""
+msgstr "O capacitate de 1 permite o HA caldă prin regenerarea grupului cu Scalare Automată. O capacitate de 2 permite o HA fierbinte, deoarece serviciul este disponibil chiar și atunci când se pierde un nod. O capacitate de 3 sau mai mare permite o HA fierbinte și scalarea manuală a flotei de executori."
msgid "Runners|Active"
-msgstr ""
+msgstr "Activ"
msgid "Runners|All"
-msgstr ""
+msgstr "Toți"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. %{percentage} spot."
-msgstr ""
+msgstr "Amazon Linux 2 Docker HA cu scalare manuală și programare opțională. %{percentage} spot."
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
-msgstr ""
+msgstr "Amazon Linux 2 Docker HA cu scalare manuală și programare opțională. Non-spot."
msgid "Runners|An error has occurred fetching instructions"
-msgstr ""
+msgstr "A apărut o eroare la preluarea instrucțiunilor"
msgid "Runners|Architecture"
-msgstr ""
+msgstr "Arhitectură"
msgid "Runners|Assigned Group"
-msgstr ""
+msgstr "Grupul desemnat"
msgid "Runners|Assigned Projects (%{projectCount})"
-msgstr ""
+msgstr "Proiecte atribuite (%{projectCount})"
msgid "Runners|Associated with one or more projects"
-msgstr ""
+msgstr "Asociat cu unul sau mai multe proiecte"
msgid "Runners|Available to all projects"
-msgstr ""
+msgstr "Disponibil pentru toate proiectele"
msgid "Runners|Available to all projects and subgroups in the group"
-msgstr ""
+msgstr "Disponibil pentru toate proiectele și subgrupurile din grup"
msgid "Runners|Can run untagged jobs"
-msgstr ""
+msgstr "Poate rula joburi neetichetate"
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|Change to project runner"
-msgstr ""
+msgstr "Capacitatea de 1 permite HA caldă prin regenerarea grupului cu Scalare Automată. Capacitatea de 2 permite HA fierbinte, deoarece serviciul este disponibil chiar și atunci când se pierde un nod. Capacitatea de 3 sau mai mare permite HA fierbinte și scalarea manuală a flotei de executori."
msgid "Runners|Checkbox"
-msgstr ""
+msgstr "Caseta de selectare"
msgid "Runners|Choose your preferred GitLab Runner"
-msgstr ""
+msgstr "Alegeți-vă Executorul GitLab preferat"
msgid "Runners|Clear selection"
-msgstr ""
+msgstr "Ștergeți selecția"
msgid "Runners|Command to register runner"
-msgstr ""
+msgstr "Comanda pentru a înregistra un executor"
msgid "Runners|Configuration"
-msgstr ""
+msgstr "Configurare"
msgid "Runners|Copy instructions"
-msgstr ""
+msgstr "Copiați instrucțiunile"
msgid "Runners|Copy registration token"
-msgstr ""
+msgstr "Copiați tokenul de înregistrare"
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ștergeți %d executor"
+msgstr[1] "Ștergeți %d executori"
+msgstr[2] "Ștergeți %d de executori"
msgid "Runners|Delete runner"
-msgstr ""
+msgstr "Ștergeți executorul"
msgid "Runners|Delete runner %{name}?"
-msgstr ""
+msgstr "Ștergeți executorul %{name}?"
msgid "Runners|Delete selected"
-msgstr ""
+msgstr "Ștergeți selecția"
msgid "Runners|Deploy GitLab Runner in AWS"
-msgstr ""
+msgstr "Implementați Executorii GitLab în AWS"
msgid "Runners|Description"
-msgstr ""
+msgstr "Descriere"
msgid "Runners|Details"
-msgstr ""
+msgstr "Detalii"
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 ""
+msgstr "Nu vedeți ceea ce căutați? Vedeți lista completă de opțiuni, inclusiv o opțiune complet personalizabilă %{linkStart}aici%{linkEnd}."
msgid "Runners|Download and install binary"
-msgstr ""
+msgstr "Descărcați și instalați binarul"
msgid "Runners|Download latest binary"
-msgstr ""
+msgstr "Descărcați cel mai recent binar"
msgid "Runners|Enter the number of seconds. This timeout takes precedence over lower timeouts set for the project."
+msgstr "Introduceți numărul de secunde. Acest timp de expirare are prioritate față de timpii de expirare mai mici setați pentru proiect."
+
+msgid "Runners|Executor"
msgstr ""
msgid "Runners|Group"
-msgstr ""
+msgstr "Grup"
msgid "Runners|IP Address"
-msgstr ""
+msgstr "Adresă IP"
msgid "Runners|Install a runner"
-msgstr ""
+msgstr "Instalați un executor"
msgid "Runners|Instance"
-msgstr ""
+msgstr "Instanță"
msgid "Runners|Jobs"
-msgstr ""
+msgstr "Joburi"
msgid "Runners|Last contact"
-msgstr ""
+msgstr "Ultimul contact"
msgid "Runners|Locked to this project"
-msgstr ""
+msgstr "Blocat pentru acest proiect"
msgid "Runners|Maximum job timeout"
-msgstr ""
+msgstr "Timpul maxim de expirare a jobului"
msgid "Runners|Members of the %{type} can register runners"
-msgstr ""
+msgstr "Membrii cu rol de %{type} pot înregistra alergători"
msgid "Runners|Multi-project runners cannot be deleted"
-msgstr ""
+msgstr "Nu se pot șterge executorii multi-proiect"
msgid "Runners|Name"
-msgstr ""
+msgstr "Nume"
msgid "Runners|Never contacted"
-msgstr ""
+msgstr "Niciodată contactat"
msgid "Runners|Never contacted:"
-msgstr ""
+msgstr "Niciodată contactat:"
msgid "Runners|New group runners view"
-msgstr ""
+msgstr "Noua vizualizare a executorilor de grup"
msgid "Runners|New registration token generated!"
-msgstr ""
+msgstr "S-a generat un nou token de înregistrare!"
msgid "Runners|No spot. Default choice for Windows Shell executor."
-msgstr ""
+msgstr "Non spot. Alegerea implicită pentru executorul Shell în Windows."
msgid "Runners|No spot. This is the default choice for Linux Docker executor."
-msgstr ""
+msgstr "Non spot. Aceasta este alegerea implicită pentru executorul Docker în Linux."
msgid "Runners|Not accepting jobs"
-msgstr ""
+msgstr "Nu acceptă joburi"
msgid "Runners|Offline"
-msgstr ""
+msgstr "Offline"
msgid "Runners|Offline runners"
-msgstr ""
+msgstr "Executori offline"
msgid "Runners|Offline:"
-msgstr ""
+msgstr "Offline:"
msgid "Runners|Online"
-msgstr ""
+msgstr "Online"
msgid "Runners|Online runners"
-msgstr ""
+msgstr "Executori online"
msgid "Runners|Online:"
-msgstr ""
+msgstr "Online:"
msgid "Runners|Pause from accepting jobs"
-msgstr ""
+msgstr "Întrerupeți acceptarea de joburi"
msgid "Runners|Paused"
-msgstr ""
+msgstr "ÃŽntrerupt"
msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Ștergeți permanent %d executor"
+msgstr[1] "Ștergeți permanent %d executori"
+msgstr[2] "Ștergeți permanent %d de executori"
msgid "Runners|Platform"
-msgstr ""
+msgstr "Platformă"
msgid "Runners|Project"
-msgstr ""
+msgstr "Proiect"
msgid "Runners|Property Name"
-msgstr ""
+msgstr "Numele proprietății"
msgid "Runners|Protected"
-msgstr ""
+msgstr "Protejat"
msgid "Runners|Register a group runner"
-msgstr ""
+msgstr "Înregistrați un executor de grup"
msgid "Runners|Register a project runner"
-msgstr ""
+msgstr "Înregistrați un executor de proiect"
msgid "Runners|Register a runner"
-msgstr ""
+msgstr "Înregistrați un executor"
msgid "Runners|Register an instance runner"
-msgstr ""
+msgstr "Înregistrați un executor de instanță"
msgid "Runners|Registration token"
-msgstr ""
+msgstr "Tokenul de înregistrare"
msgid "Runners|Registration token copied!"
-msgstr ""
+msgstr "Tokenul de înregistrare a fost copiat!"
msgid "Runners|Reset token"
-msgstr ""
+msgstr "Resetare token"
msgid "Runners|Resume accepting jobs"
-msgstr ""
+msgstr "Reluați acceptarea de joburi"
msgid "Runners|Revision"
-msgstr ""
+msgstr "Revizuire"
msgid "Runners|Rocket launch illustration"
-msgstr ""
+msgstr "Ilustrație de lansare a rachetei"
msgid "Runners|Runner"
-msgstr ""
+msgstr "Executor"
msgid "Runners|Runner #%{runner_id}"
-msgstr ""
+msgstr "Executor #%{runner_id}"
msgid "Runners|Runner %{name} was deleted"
-msgstr ""
+msgstr "Executorul %{name} a fost șters"
msgid "Runners|Runner assigned to project."
-msgstr ""
+msgstr "Executorul a fost atribuit proiectului."
msgid "Runners|Runner cannot be deleted, please contact your administrator"
-msgstr ""
+msgstr "Executorul nu poate fi șters, vă rugăm să contactați administratorul d-voastră"
msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
-msgstr ""
+msgstr "Executorul a contactat GitLab în ultimele %{elapsedTime}"
msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
-msgstr ""
+msgstr "Executorul nu a contactat niciodată GitLab (când înregistrați un executor, folosiți %{codeStart}gitlab-runner run%{codeEnd} pentru a-l aduce online)"
msgid "Runners|Runner has never contacted this instance"
-msgstr ""
+msgstr "Executorul nu a contactat niciodată această instanță"
msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
-msgstr ""
+msgstr "Executorul nu a contactat GitLab de mai mult de %{elapsedTime}"
msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
-msgstr ""
+msgstr "Executorul este blocat și este disponibil numai pentru proiectele atribuite în prezent. Numai administratorii pot modifica proiectele atribuite."
msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Executorul este offline; ultimul contact a fost acum %{runner_contact}"
msgid "Runners|Runner is offline; last contact was %{timeAgo}"
-msgstr ""
+msgstr "Executorul este offline; ultimul contact a fost %{timeAgo}"
msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Executorul este online; ultimul contact a avut loc acum %{runner_contact}."
msgid "Runners|Runner is online; last contact was %{timeAgo}"
-msgstr ""
+msgstr "Executorul este online; ultimul contact a fost %{timeAgo}"
msgid "Runners|Runner is stale; it has never contacted this instance"
-msgstr ""
+msgstr "Executorul este vechi; nu a contactat niciodată această instanță"
msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Executorul este vechi; ultimul contact a fost acum %{runner_contact}"
msgid "Runners|Runner is stale; last contact was %{timeAgo}"
-msgstr ""
+msgstr "Executorul este vechi; ultimul contact a fost %{timeAgo}"
msgid "Runners|Runner registration"
-msgstr ""
+msgstr "ÃŽnregistrarea executorului"
msgid "Runners|Runner statuses"
-msgstr ""
+msgstr "Statusurile executorului"
msgid "Runners|Runner unassigned from project."
-msgstr ""
+msgstr "Executorul a fost dezasociat din proiect"
msgid "Runners|Runners"
msgstr "Executori"
msgid "Runners|Runs untagged jobs"
+msgstr "Rulează joburi neetichetate"
+
+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 ""
+msgstr "Selectați opțiunea preferată aici. În etapa următoare, puteți alege capacitatea executorului dvs. în consola AWS CloudFormation."
msgid "Runners|Show runner installation and registration instructions"
-msgstr ""
+msgstr "Afișați instrucțiunile de instalare și înregistrare a executorului"
msgid "Runners|Show runner installation instructions"
-msgstr ""
+msgstr "Afișați instrucțiunile de instalare a executorului"
msgid "Runners|Something went wrong while fetching runner data."
msgstr "Ceva nu a mers bine în timpul preluării datelor executorilor."
msgid "Runners|Something went wrong while fetching the tags suggestions"
-msgstr ""
+msgstr "Ceva nu a mers bine la preluarea sugestiilor de etichete"
msgid "Runners|Stale"
-msgstr ""
+msgstr "Vechi"
msgid "Runners|Stale runners"
-msgstr ""
+msgstr "Executori vechi"
msgid "Runners|Stale:"
-msgstr ""
+msgstr "Vechi:"
msgid "Runners|Status"
-msgstr ""
+msgstr "Statusul"
msgid "Runners|Stop the runner from accepting new jobs."
msgstr "Împiedicați executorul să mai accepte noi joburi."
msgid "Runners|Tags"
-msgstr ""
+msgstr "Etichete"
msgid "Runners|Take me there!"
-msgstr ""
+msgstr "Duceți-mă acolo!"
msgid "Runners|The new view gives you more space and better visibility into your fleet of runners."
-msgstr ""
+msgstr "Noua vizualizare vă oferă mai mult spațiu și o mai bună vizibilitate asupra flotei de executori."
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 ""
+msgstr "Executorul va fi șters permanent și nu va mai fi disponibil pentru proiectele sau grupurile din instanță. Sunteți sigur că doriți să continuați?"
msgid "Runners|This runner has not run any jobs."
-msgstr ""
+msgstr "Acest executor nu a executat niciun job."
msgid "Runners|This runner is associated with specific projects."
-msgstr ""
+msgstr "Acest executor este asociat cu proiecte specifice."
msgid "Runners|This runner is available to all projects and subgroups in a group."
-msgstr ""
+msgstr "Acest executor este disponibil pentru toate proiectele și subgrupurile din cadrul unui grup."
msgid "Runners|To install Runner in Kubernetes follow the instructions described in the GitLab documentation."
-msgstr ""
+msgstr "Pentru a instala un Executor în Kubernetes, urmați instrucțiunile descrise în documentația GitLab."
msgid "Runners|To install Runner in a container follow the instructions described in the GitLab documentation"
-msgstr ""
+msgstr "Pentru a instala un Executor într-un container, urmați instrucțiunile descrise în documentația GitLab"
msgid "Runners|Use Group runners when you want all projects in a group to have access to a set of runners."
-msgstr ""
+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."
msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs."
msgstr "Folosiți executorul pentru joburi fără etichete, în plus față de joburile cu etichete."
msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
-msgstr ""
+msgstr "Folosiți executorul numai pentru proiectele atribuite în prezent. Numai administratorii pot modifica proiectele atribuite."
msgid "Runners|Use the runner on pipelines for protected branches only."
-msgstr "Utilizați executorul pe conducte numai pentru ramuri protejate."
+msgstr "Folosiți executorul pe pipeline-uri numai pentru ramurile protejate."
msgid "Runners|Value"
-msgstr ""
+msgstr "Valoare"
msgid "Runners|Version"
-msgstr ""
+msgstr "Versiune"
msgid "Runners|View installation instructions"
-msgstr ""
+msgstr "Vizualizați instrucțiunile de instalare"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %{percentage} spot."
-msgstr ""
+msgstr "Windows 2019 Shell cu scalare manuală și programare opțională. Spot %{percentage}."
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
-msgstr ""
-
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-msgstr ""
+msgstr "Windows 2019 Shell cu scalare manuală și programare opțională. Non-spot."
msgid "Runners|You can set up a specific runner to be used by multiple projects but you cannot make this a shared runner."
msgstr "Puteți configura un anumit executor pentru a fi utilizat de mai multe proiecte, dar nu puteți face din acesta un executor partajat."
msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes."
-msgstr ""
+msgstr "Ați folosit %{quotaUsed} din cele %{quotaLimit} de minute ale dvs. de pipeline de executori partajați."
msgid "Runners|active"
-msgstr ""
+msgstr "activ"
msgid "Runners|group"
-msgstr ""
-
-msgid "Runners|locked"
-msgstr "blocat"
+msgstr "grup"
msgid "Runners|never contacted"
-msgstr ""
+msgstr "niciodată contactat"
msgid "Runners|offline"
-msgstr ""
+msgstr "offline"
msgid "Runners|online"
-msgstr ""
+msgstr "online"
msgid "Runners|paused"
msgstr "întrerupt"
msgid "Runners|shared"
-msgstr ""
+msgstr "partajat"
msgid "Runners|specific"
-msgstr ""
+msgstr "specific"
msgid "Runners|stale"
-msgstr ""
+msgstr "vechi"
msgid "Running"
msgstr ""
@@ -32972,31 +33206,31 @@ 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 ""
+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}"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
-msgstr ""
+msgstr "%{thenLabelStart}Atunci%{thenLabelEnd} Necesită aprobare de la %{approvalsRequired} dintre următorii aprobatori:"
msgid "ScanResultPolicy|add an approver"
-msgstr ""
+msgstr "adăugați un aprobator"
msgid "ScanResultPolicy|scanners"
-msgstr ""
+msgstr "scanere"
msgid "ScanResultPolicy|severity levels"
-msgstr ""
+msgstr "nivele de severitate"
msgid "ScanResultPolicy|vulnerability states"
-msgstr ""
+msgstr "stări de vulnerabilitate"
msgid "Scanner"
msgstr ""
msgid "Scanner profile failed to delete"
-msgstr ""
+msgstr "Profilul scanerului nu a putut fi șters"
msgid "Scanner profile not found for given parameters"
-msgstr ""
+msgstr "Profilul scanerului nu a fost găsit pentru parametrii dați"
msgid "Schedule a new pipeline"
msgstr ""
@@ -33026,7 +33260,7 @@ msgid "Schedules to merge this merge request (%{strategy})."
msgstr ""
msgid "Scheduling Pipelines"
-msgstr ""
+msgstr "Programarea pipeline-urilor"
msgid "Scope"
msgstr ""
@@ -33197,13 +33431,13 @@ msgid "SearchAutocomplete|Issues I've created"
msgstr ""
msgid "SearchAutocomplete|Issues assigned to me"
-msgstr ""
+msgstr "Probleme care mi-au fost atribuite"
msgid "SearchAutocomplete|Merge requests I've created"
-msgstr ""
+msgstr "Merge request-urile pe care le-am creat"
msgid "SearchAutocomplete|Merge requests assigned to me"
-msgstr ""
+msgstr "Merge request-urile care mi-au fost atribuite"
msgid "SearchAutocomplete|Merge requests that I'm a reviewer"
msgstr ""
@@ -33313,9 +33547,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33337,9 +33568,6 @@ msgstr "Secure Code Warrior"
msgid "Secure Files"
msgstr "Fișiere Securizate"
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr "Token sigur care identifică o solicitare stocare externă."
@@ -33350,7 +33578,7 @@ msgid "Security & Compliance"
msgstr ""
msgid "Security Configuration"
-msgstr ""
+msgstr "Configurarea securității"
msgid "Security Dashboard"
msgstr "Tabloul de bord de securitate"
@@ -33362,103 +33590,103 @@ 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 ""
+msgstr "Raportul de securitate este expirat. Vă rugăm să vă actualizați ramura cu ultimele modificări din ramura țintă (%{targetBranchName})"
msgid "Security report is out of date. Run %{newPipelineLinkStart}a new pipeline%{newPipelineLinkEnd} for the target branch (%{targetBranchName})"
-msgstr ""
+msgstr "Raportul de securitate este expirat. Rulați %{newPipelineLinkStart}un nou pipeline%{newPipelineLinkEnd} pentru ramura țintă (%{targetBranchName})"
msgid "SecurityApprovals|A merge request approval is required when a security report contains a new vulnerability."
msgstr ""
msgid "SecurityApprovals|A merge request approval is required when test coverage declines."
-msgstr "O aprobare de merge request este necesară când acoperirea scade."
+msgstr "O aprobare de merge request este necesară atunci când scade gradul de coverage de teste."
msgid "SecurityApprovals|A merge request approval is required when the license compliance report contains a denied license."
-msgstr "O aprobare de cerere de îmbinare este necesară când raportul de conformitate a licenței conține o licență refuzată."
+msgstr "Este necesară o aprobare a merge request-ului atunci când raportul de conformitate a licenței conține o licență refuzată."
msgid "SecurityApprovals|Coverage-Check"
-msgstr "Verificarea acoperirii"
+msgstr "Verificare de coverage"
msgid "SecurityApprovals|Learn more about Coverage-Check"
-msgstr "Aflați mai multe despre verificarea acoperirii"
+msgstr "Aflați mai multe despre Verificarea de coverage"
msgid "SecurityApprovals|Learn more about License-Check"
-msgstr "Aflați mai multe despre verificarea licenței"
+msgstr "Aflați mai multe despre Verificarea licenței"
msgid "SecurityApprovals|Learn more about Vulnerability-Check"
-msgstr "Aflați mai multe despre verificarea vulnerabilităților"
+msgstr "Aflați mai multe despre Verificarea vulnerabilității"
msgid "SecurityApprovals|License-Check"
msgstr "Verificarea licenței"
msgid "SecurityApprovals|Requires approval for Denied licenses. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Necesită aprobare pentru Licențele refuzate. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "SecurityApprovals|Requires approval for decreases in test coverage. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Necesită aprobare pentru diminuări în coverage de teste. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "SecurityApprovals|Requires approval for vulnerabilities. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Necesită aprobare pentru vulnerabilități. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "SecurityApprovals|Vulnerability-Check"
msgstr "Verificarea vulnerabilității"
msgid "SecurityConfiguration|%{featureName} merge request creation mutation failed"
-msgstr ""
+msgstr "Merge request-ul %{featureName} de creare a mutației a eșuat"
msgid "SecurityConfiguration|%{scanType} configuration code snippet"
msgstr "Fragment de cod de configurare %{scanType}"
msgid "SecurityConfiguration|An error occurred while creating the merge request."
-msgstr ""
+msgstr "A apărut o eroare în timpul creării merge request-ului."
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 ""
+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."
msgid "SecurityConfiguration|Compliance"
-msgstr ""
+msgstr "Conformitate"
msgid "SecurityConfiguration|Configuration guide"
-msgstr ""
+msgstr "Ghid de configurare"
msgid "SecurityConfiguration|Configuration history"
-msgstr ""
+msgstr "Istoric de configurare"
msgid "SecurityConfiguration|Configure %{feature}"
-msgstr ""
+msgstr "Configurați %{feature}"
msgid "SecurityConfiguration|Configure with a merge request"
msgstr "Configurați cu un merge request"
msgid "SecurityConfiguration|Copy code and open .gitlab-ci.yml file"
-msgstr ""
+msgstr "Copiați codul și deschideți fișierul .gitlab-ci.yml"
msgid "SecurityConfiguration|Copy code only"
-msgstr ""
+msgstr "Copiați doar codul"
msgid "SecurityConfiguration|Could not retrieve configuration data. Please refresh the page, or try again later."
-msgstr ""
+msgstr "Nu se pot prelua datele de configurare. Vă rugăm să reîmprospătați pagina sau încercați din nou mai târziu."
msgid "SecurityConfiguration|Create merge request"
-msgstr ""
+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 ""
+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}."
msgid "SecurityConfiguration|Enable %{feature}"
-msgstr ""
+msgstr "Activați %{feature}"
msgid "SecurityConfiguration|Enable Auto DevOps"
msgstr "Activați Auto DevOps"
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 ""
+msgstr "Activați formarea de securitate pentru a-i ajuta pe dezvoltatorii dvs. să învețe cum să remedieze vulnerabilitățile. Dezvoltatorii pot vizualiza cursuri de formare în domeniul securității de la furnizorii educaționali selectați, relevante pentru vulnerabilitatea detectată."
msgid "SecurityConfiguration|Enabled"
-msgstr ""
+msgstr "Activat"
msgid "SecurityConfiguration|High-level vulnerability statistics across projects and groups"
msgstr "Statistici la nivel înalt privind vulnerabilitatea în cadrul proiectelor și grupurilor"
@@ -33467,68 +33695,71 @@ msgid "SecurityConfiguration|Immediately begin risk analysis and remediation wit
msgstr "Începeți imediat analiza riscurilor și remedierea acestora cu ajutorul funcțiilor de securitate a aplicațiilor. Începeți cu SAST și Detecția de secrete, disponibile pentru toate planurile. Faceți upgrade la Ultimate pentru a obține toate caracteristicile, inclusiv:"
msgid "SecurityConfiguration|Learn more about vulnerability training"
-msgstr ""
+msgstr "Aflați mai multe despre formarea în domeniul vulnerabilității"
msgid "SecurityConfiguration|Manage corpus"
-msgstr ""
+msgstr "Gestionarea corpusului"
msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing."
-msgstr ""
+msgstr "Gestionați fișierele corpus utilizate ca intrări seed cu fuzzing ghidat prin coverage."
msgid "SecurityConfiguration|Manage profiles"
-msgstr ""
+msgstr "Gestionați profilurile"
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
-msgstr "Gestionează profilurile pentru a fi utilizate de scanările DAST."
+msgstr "Gestionați profilurile de utilizat de către scanările DAST."
msgid "SecurityConfiguration|More scan types, including Container Scanning, DAST, Dependency Scanning, Fuzzing, and Licence Compliance"
-msgstr "Mai multe tipuri de scanare, inclusiv Scanarea de containere, DAST, Scanarea dependențelor, Fuzzing și Conformitatea licențelor"
+msgstr "Mai multe tipuri de scanare, inclusiv Scanarea de containere, DAST, Scanarea dependențelor, Fuzzing și Conformitatea licenței"
msgid "SecurityConfiguration|Not enabled"
-msgstr ""
+msgstr "Neactivat"
msgid "SecurityConfiguration|Once you've enabled a scan for the default branch, any subsequent feature branch you create will include the scan."
-msgstr ""
+msgstr "Odată ce ați activat o scanare pentru ramura implicită, orice ramură de caracteristică ulterioară pe care o creați va include scanarea."
msgid "SecurityConfiguration|Quickly enable all continuous testing and compliance tools by enabling %{linkStart}Auto DevOps%{linkEnd}"
-msgstr "Activați rapid toate uneltele de conformitate și testare continuă activând %{linkStart}Auto DevOps%{linkEnd}"
+msgstr "Activați rapid toate instrumentele de testare continuă și de conformitate prin activarea %{linkStart}Auto DevOps%{linkEnd}"
msgid "SecurityConfiguration|Runtime security metrics for application environments"
-msgstr "Măsurători securitate în timpul executării pentru medii de aplicații"
+msgstr "Metricile de securitate runtime pentru mediile aplicațiilor"
msgid "SecurityConfiguration|SAST Analyzers"
-msgstr ""
+msgstr "Analizoare SAST"
msgid "SecurityConfiguration|SAST Configuration"
-msgstr ""
+msgstr "Configurația SAST"
msgid "SecurityConfiguration|Secure your project"
-msgstr "Securizați-vă proiectul"
+msgstr "Asigurați-vă securitatea proiectului"
msgid "SecurityConfiguration|Security testing"
-msgstr ""
+msgstr "Testarea securității"
msgid "SecurityConfiguration|Security training"
-msgstr ""
+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 ""
+msgstr "Statusul 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 ""
+msgstr "Faceți upgrade sau începeți o evaluare gratuită"
msgid "SecurityConfiguration|Using custom settings. You won't receive automatic updates on this variable. %{anchorStart}Restore to default%{anchorEnd}"
-msgstr ""
+msgstr "Utilizarea setărilor personalizate. Nu veți primi actualizări automate pentru această variabilă. %{anchorStart}Restabiliți la valoarea implicită%{anchorEnd}"
msgid "SecurityConfiguration|Vulnerability Management"
-msgstr ""
+msgstr "Managementul vulnerabilității"
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
-msgstr "Detalii vulnerabilitate și statistici în cererea de îmbinare"
+msgstr "Detalii și statistici privind vulnerabilitatea în merge request"
-msgid "SecurityOrchestration| or "
+msgid "SecurityOrchestration| and "
msgstr ""
+msgid "SecurityOrchestration| or "
+msgstr " sau "
+
msgid "SecurityOrchestration|%{branches} %{plural}"
msgstr "%{branches}%{plural}"
@@ -33536,314 +33767,347 @@ msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} și %{lastBranch}%{plural}"
msgid "SecurityOrchestration|%{scanners}"
-msgstr ""
+msgstr "%{scanners}"
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr "%{scanners} %{severities} într-un merge request deschis care vizează %{branches}."
+
+msgid "SecurityOrchestration|.yaml mode"
msgstr ""
msgid "SecurityOrchestration|.yaml preview"
-msgstr ""
+msgstr "Previzualizare .yaml"
msgid "SecurityOrchestration|Actions"
-msgstr ""
+msgstr "Acțiuni"
msgid "SecurityOrchestration|Add rule"
-msgstr ""
+msgstr "Adăugați o regulă"
msgid "SecurityOrchestration|After dismissing the alert, the information will never be shown again."
-msgstr ""
+msgstr "După anularea alertei, mesajul nu va mai fi afișat niciodată."
msgid "SecurityOrchestration|All policies"
msgstr "Toate politicile"
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
msgstr "S-a produs o eroare la atribuirea proiectului dvs. de politică de securitate"
msgid "SecurityOrchestration|An error occurred unassigning your security policy project"
-msgstr "S-a produs o eroare la anularea atribuirii proiectului de politică de securitate"
+msgstr "S-a produs o eroare la anularea atribuirii proiectului dvs. de politică de securitate"
+
+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 "Alegeți un proiect"
+
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Description"
-msgstr "Descriere"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
msgstr ""
+msgid "SecurityOrchestration|Description"
+msgstr "Descriere"
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
+msgstr "Nu mai afișați alerta"
+
msgid "SecurityOrchestration|Edit policy"
msgstr "Editați politica"
msgid "SecurityOrchestration|Edit policy project"
-msgstr ""
+msgstr "Editați proiectul de politică"
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
-msgstr ""
+msgstr "Editați politica privind rezultatele scanării"
msgid "SecurityOrchestration|Empty policy name"
-msgstr ""
+msgstr "Numele politicii goale"
msgid "SecurityOrchestration|Enabled"
-msgstr ""
+msgstr "Activat"
msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More information.%{linkEnd}"
-msgstr ""
+msgstr "Impuneți securitatea pentru acest proiect. %{linkStart}Mai multe informații.%{linkEnd}"
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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
+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|Invalid policy type"
-msgstr ""
+msgstr "Tip de politică invalid"
msgid "SecurityOrchestration|Latest scan run against %{agent}"
-msgstr ""
-
-msgid "SecurityOrchestration|Network"
-msgstr "Rețea"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
+msgstr "Cea mai recentă scanare executată împotriva %{agent}"
msgid "SecurityOrchestration|New policy"
msgstr "Politică nouă"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
-msgstr ""
+msgstr "Nouă politică privind rezultatele scanării"
msgid "SecurityOrchestration|No actions defined - policy will not run."
-msgstr ""
+msgstr "Nu a fost definită nicio acțiune - politica nu se va executa."
msgid "SecurityOrchestration|No description"
-msgstr ""
+msgstr "Fără descriere"
msgid "SecurityOrchestration|No rules defined - policy will not run."
-msgstr ""
+msgstr "Nu s-au definit reguli - politica nu se va executa."
msgid "SecurityOrchestration|Not enabled"
-msgstr ""
+msgstr "Neactivat"
msgid "SecurityOrchestration|Only owners can update Security Policy Project"
-msgstr "Doar proprietarii pot actualiza Proiectul Politicii de Securitate"
+msgstr "Numai proprietarii pot actualiza Proiectul politicii de securitate"
msgid "SecurityOrchestration|Policies"
msgstr "Politici"
-msgid "SecurityOrchestration|Policy Type"
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
msgstr ""
+msgid "SecurityOrchestration|Policy Type"
+msgstr "Tipul politicii"
+
msgid "SecurityOrchestration|Policy cannot be enabled for non-existing branches (%{branches})"
-msgstr ""
+msgstr "Politica nu poate fi activată pentru ramuri inexistente (%{branches})"
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
+msgstr "Politica nu poate fi activată fără informații despre ramură"
+
+msgid "SecurityOrchestration|Policy definition"
msgstr ""
msgid "SecurityOrchestration|Policy description"
msgstr "Descrierea politicii"
msgid "SecurityOrchestration|Policy editor"
-msgstr ""
+msgstr "Editor de politici"
msgid "SecurityOrchestration|Policy status"
-msgstr ""
-
-msgid "SecurityOrchestration|Policy summary"
-msgstr ""
+msgstr "Statutul politicii"
msgid "SecurityOrchestration|Policy type"
-msgstr "Tipul de politică"
+msgstr "Tipul politicii"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
+msgstr "Necesită %{approvals} %{plural} de la %{approvers} în oricare dintre următoarele cazuri:"
+
+msgid "SecurityOrchestration|Rule mode"
msgstr ""
-msgid "SecurityOrchestration|Rules"
+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 "Reguli"
+
msgid "SecurityOrchestration|Run a DAST scan with Scan Profile A and Site Profile A when a pipeline run against the main branch."
-msgstr ""
+msgstr "Executați o scanare DAST cu profilul de scanare A și profilul de site A atunci când se execută o conductă pe ramura principală."
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
-msgstr ""
+msgstr "Execută scanările %{actions} și %{lastAction}."
msgid "SecurityOrchestration|Runs a %{action} scan"
+msgstr "Execută o scanare %{action}"
+
+msgid "SecurityOrchestration|Save changes"
msgstr ""
msgid "SecurityOrchestration|Scan Execution"
-msgstr ""
+msgstr "Executarea scanării"
msgid "SecurityOrchestration|Scan Result"
-msgstr ""
+msgstr "Rezultatul scanării"
msgid "SecurityOrchestration|Scan execution"
-msgstr ""
+msgstr "Executarea scanării"
msgid "SecurityOrchestration|Scan execution policies can only be created by project owners."
-msgstr ""
+msgstr "Politicile de execuție a scanării pot fi create numai de către proprietarii de proiecte."
msgid "SecurityOrchestration|Scan execution policy"
-msgstr ""
+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 ""
+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 ""
+msgstr "Rezultatul scanării"
msgid "SecurityOrchestration|Scan result policies can only be created by project owners."
-msgstr ""
+msgstr "Politicile privind rezultatele scanării pot fi create numai de către proprietarii de proiecte."
msgid "SecurityOrchestration|Scan result policy"
-msgstr ""
+msgstr "Politica privind rezultatele scanării"
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
-msgstr ""
+msgstr "Scanarea trebuie efectuată %{cadence}"
msgid "SecurityOrchestration|Scan to be performed %{cadence} on the %{branches}"
-msgstr ""
+msgstr "Scanarea trebuie efectuată %{cadence} pe %{branches}"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
+msgstr "Scanare care trebuie efectuată pe fiecare pipeline de pe %{branches}"
+
+msgid "SecurityOrchestration|Security Approvals"
msgstr ""
msgid "SecurityOrchestration|Security policy project was linked successfully"
msgstr "Proiectul politicii de securitate a fost conectat cu succes"
msgid "SecurityOrchestration|Security policy project was unlinked successfully"
-msgstr ""
+msgstr "Proiectul politicii de securitate a fost deconectat cu succes"
msgid "SecurityOrchestration|Select a project to store your security policies in. %{linkStart}More information.%{linkEnd}"
-msgstr "Selectați un proiect în care veți stoca politicile de securitate. %{linkStart}Mai multe informații.%{linkEnd}"
+msgstr "Selectați un proiect în care să stocați politicile de securitate. %{linkStart}Mai multe informații.%{linkEnd}"
msgid "SecurityOrchestration|Select policy"
-msgstr ""
+msgstr "Selectați politica"
msgid "SecurityOrchestration|Select security project"
-msgstr "Selectați proiect de securitate"
+msgstr "Selectați proiectul de securitate"
+
+msgid "SecurityOrchestration|Something went wrong, unable to fetch policies"
+msgstr ""
msgid "SecurityOrchestration|Sorry, your filter produced no results."
-msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
+msgstr "Ne pare rău, filtrul dvs. nu a produs niciun rezultat."
msgid "SecurityOrchestration|Status"
-msgstr ""
+msgstr "Status"
msgid "SecurityOrchestration|Step 1: Choose a policy type"
-msgstr ""
+msgstr "Etapa 1: Alegeți un tip de politică"
msgid "SecurityOrchestration|Step 2: Policy details"
-msgstr ""
+msgstr "Pasul 2: Detaliile politicii"
msgid "SecurityOrchestration|Summary"
+msgstr "Rezumat"
+
+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 ""
+msgstr "A apărut o problemă în timpul creării noii politici de securitate"
msgid "SecurityOrchestration|This project does not contain any security policies."
-msgstr ""
+msgstr "Acest proiect nu conține nicio politică de securitate."
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 ""
+msgstr "Această vizualizare afișează numai rezultatele scanării pentru agentul %{agent}. Puteți vizualiza rezultatele scanării pentru toți agenții în %{linkStart}fila Vulnerabilități operaționale din raportul de vulnerabilitate%{linkEnd}."
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
-msgstr ""
+msgstr "Pentru a vă extinde căutarea, modificați filtrele de mai sus sau selectați un alt proiect de politică de securitate."
msgid "SecurityOrchestration|Unlink project"
-msgstr ""
+msgstr "Deconectați proiectul"
msgid "SecurityOrchestration|Unlinking a security project removes all policies stored in the linked security project. Save to confirm this action."
-msgstr ""
+msgstr "Deconectarea unui proiect de securitate elimină toate politicile stocate în proiectul de securitate conectat. Salvați pentru a confirma această acțiune."
msgid "SecurityOrchestration|Update scan policies"
-msgstr ""
+msgstr "Actualizați politicile de scanare"
msgid "SecurityOrchestration|Use a scan result policy to create rules that ensure security issues are checked before merging a merge request."
-msgstr ""
-
-msgid "SecurityOrchestration|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
-msgstr ""
+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."
msgid "SecurityOrchestration|View policy project"
+msgstr "Vizualizați proiectul de politici"
+
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
-msgstr ""
+msgstr "a"
msgid "SecurityOrchestration|all branches"
-msgstr ""
+msgstr "toate ramurile"
msgid "SecurityOrchestration|an"
-msgstr ""
+msgstr "un"
msgid "SecurityOrchestration|branch"
-msgstr ""
+msgstr "ramură"
msgid "SecurityOrchestration|branches"
-msgstr ""
+msgstr "ramuri"
msgid "SecurityOrchestration|members of groups"
-msgstr ""
+msgstr "membri ai grupurilor"
msgid "SecurityOrchestration|members of groups with ids"
-msgstr ""
+msgstr "membri ai grupurilor cu id-urile"
msgid "SecurityOrchestration|members of the group"
-msgstr ""
+msgstr "membri ai grupului"
msgid "SecurityOrchestration|members of the group with id"
-msgstr ""
+msgstr "membri ai grupului cu id-ul"
msgid "SecurityOrchestration|scanner finds"
-msgstr ""
+msgstr "scanerul găsește"
msgid "SecurityOrchestration|scanners find"
-msgstr ""
+msgstr "scanerele găsesc"
msgid "SecurityOrchestration|the %{branches}"
-msgstr ""
+msgstr "%{branches}"
msgid "SecurityOrchestration|user with id"
-msgstr ""
+msgstr "utilizator cu ID-ul"
msgid "SecurityOrchestration|users with ids"
-msgstr ""
+msgstr "utilizatorii cu ID-urile"
msgid "SecurityOrchestration|vulnerabilities"
-msgstr ""
+msgstr "vulnerabilități"
msgid "SecurityOrchestration|vulnerability"
-msgstr ""
+msgstr "vulnerabilitate"
msgid "SecurityPolicies|+%{count} more"
msgstr "+%{count} mai mult"
-msgid "SecurityPolicies|Environment(s)"
-msgstr "Mediu (medii)"
-
msgid "SecurityPolicies|Policy type"
msgstr "Tip de politică"
-msgid "SecurityReports|%{count}+ projects"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
+msgid "SecurityReports|%{count}+ projects"
+msgstr "%{count}+ proiecte"
+
msgid "SecurityReports|%{firstProject} and %{secondProject}"
msgstr "%{firstProject} și %{secondProject}"
@@ -33866,10 +34130,10 @@ msgid "SecurityReports|At GitLab, we're all about iteration and feedback. That's
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."
msgid "SecurityReports|Change status"
-msgstr "Schimbă starea"
+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 ""
+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|Comment added to '%{vulnerabilityName}'"
msgstr "Comentariu adăugat la „%{vulnerabilityName}â€"
@@ -33881,274 +34145,274 @@ msgid "SecurityReports|Comment edited on '%{vulnerabilityName}'"
msgstr "Comentariu editat la „%{vulnerabilityName}â€"
msgid "SecurityReports|Configure security testing"
-msgstr ""
+msgstr "Configurați testarea securității"
msgid "SecurityReports|Create Jira issue"
-msgstr ""
+msgstr "Creați o problemă Jira"
msgid "SecurityReports|Create issue"
-msgstr ""
+msgstr "Creați o problemă"
msgid "SecurityReports|Create policy"
-msgstr ""
+msgstr "Creați o politică"
msgid "SecurityReports|Development vulnerabilities"
-msgstr ""
+msgstr "Vulnerabilități de dezvoltare"
msgid "SecurityReports|Dismiss vulnerability"
-msgstr ""
+msgstr "Respingeți vulnerabilitatea"
msgid "SecurityReports|Dismissed '%{vulnerabilityName}'"
-msgstr ""
+msgstr "„%{vulnerabilityName}†a fost respinsă"
msgid "SecurityReports|Dismissed '%{vulnerabilityName}'. Turn off the hide dismissed toggle to view."
-msgstr ""
+msgstr "„%{vulnerabilityName}†a fost respinsă. Dezactivați comutatorul de ascundere a respingerilor pentru a vizualiza."
msgid "SecurityReports|Download %{artifactName}"
-msgstr ""
+msgstr "Descărcați %{artifactName}"
msgid "SecurityReports|Download results"
-msgstr ""
+msgstr "Descărcați rezultatele"
msgid "SecurityReports|Download scanned URLs"
-msgstr ""
+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 ""
+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."
msgid "SecurityReports|Ensure that %{trackingStart}issue tracking%{trackingEnd} is enabled for this project and you have %{permissionsStart}permission to create new issues%{permissionsEnd}."
-msgstr ""
+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 vulnerability counts. Please check your network connection and try again."
-msgstr ""
+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."
msgid "SecurityReports|Error fetching the vulnerability list. Please check your network connection and try again."
-msgstr ""
+msgstr "Eroare la preluarea listei de vulnerabilități. Vă rugăm să verificați conexiunea la rețea și să încercați din nou."
msgid "SecurityReports|Error parsing security reports"
-msgstr ""
+msgstr "Eroare la analizarea rapoartelor de securitate"
msgid "SecurityReports|Failed to get security report information. Please reload the page or try again later."
-msgstr ""
+msgstr "Nu s-au putut obține informații despre raportul de securitate. Vă rugăm să reîncărcați pagina sau să încercați din nou mai târziu."
msgid "SecurityReports|Hide dismissed"
-msgstr ""
+msgstr "Ascundeți elementele respinse"
msgid "SecurityReports|Issue Created"
-msgstr ""
+msgstr "Problemă creată"
msgid "SecurityReports|Issues created from a vulnerability cannot be removed."
-msgstr ""
+msgstr "Problemele create dintr-o vulnerabilitate nu pot fi înlăturate."
msgid "SecurityReports|Learn more about setting up your dashboard"
-msgstr ""
+msgstr "Aflați mai multe despre modul in care să vă configurați tabloul de bord"
msgid "SecurityReports|Manage and track vulnerabilities identified in projects within your group. Vulnerabilities in projects are shown here when security testing is configured."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în proiectele din cadrul grupului dumneavoastră. Vulnerabilitățile din proiecte sunt afișate aici atunci când testarea securității este configurată."
msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in any project in this group."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în clusterele dvs. Kubernetes. Vulnerabilitățile apar aici după ce creați o politică de execuție a scanării în orice proiect din acest grup."
msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in any project in this instance."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în clusterele dvs. Kubernetes. Vulnerabilitățile apar aici după ce creați o politică de execuție a scanării în orice proiect din această instanță."
msgid "SecurityReports|Manage and track vulnerabilities identified in your Kubernetes clusters. Vulnerabilities appear here after you create a scan execution policy in this project."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în clusterele dvs. Kubernetes. Vulnerabilitățile apar aici după ce creați o politică de execuție a scanării în acest proiect."
msgid "SecurityReports|Manage and track vulnerabilities identified in your project. Vulnerabilities are shown here when security testing is configured."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în proiectul dumneavoastră. Vulnerabilitățile din proiecte sunt afișate aici atunci când testarea securității este configurată."
msgid "SecurityReports|Manage and track vulnerabilities identified in your selected projects. Vulnerabilities for selected projects with security testing configured are shown here."
-msgstr ""
+msgstr "Gestionați și urmăriți vulnerabilitățile identificate în proiectele dvs. selectate. Vulnerabilitățile pentru proiectele selectate cu teste de securitate configurate sunt afișate aici."
msgid "SecurityReports|Maximum selected projects limit reached"
msgstr "Limita maximă de proiecte selectate a fost atinsă"
msgid "SecurityReports|Monitor vulnerabilities across clusters"
-msgstr ""
+msgstr "Monitorizați vulnerabilitățile în cadrul clusterelor"
msgid "SecurityReports|Monitor vulnerabilities in all of your projects"
-msgstr ""
+msgstr "Monitorizați vulnerabilitățile din toate proiectele dvs."
msgid "SecurityReports|Monitor vulnerabilities in your group"
-msgstr ""
+msgstr "Monitorizați vulnerabilitățile din grupul dumneavoastră"
msgid "SecurityReports|Monitor vulnerabilities in your project"
-msgstr ""
+msgstr "Monitorizați vulnerabilitățile din proiectul dumneavoastră"
msgid "SecurityReports|Monitored projects"
-msgstr ""
+msgstr "Proiecte monitorizate"
msgid "SecurityReports|More info"
-msgstr ""
+msgstr "Mai multe informații"
msgid "SecurityReports|No activity"
-msgstr ""
+msgstr "Nicio activitate"
msgid "SecurityReports|No longer detected"
-msgstr ""
+msgstr "Nu mai este detectat"
msgid "SecurityReports|No vulnerabilities found"
-msgstr ""
+msgstr "Nu s-au găsit vulnerabilități"
msgid "SecurityReports|No vulnerabilities found for this pipeline"
-msgstr ""
+msgstr "Nu s-au găsit vulnerabilități pentru acest pipeline"
msgid "SecurityReports|Oops, something doesn't seem right."
-msgstr ""
+msgstr "Oops, ceva nu pare să fie în regulă."
msgid "SecurityReports|Operational vulnerabilities"
-msgstr ""
+msgstr "Vulnerabilități operaționale"
msgid "SecurityReports|Project"
-msgstr ""
+msgstr "Proiect"
msgid "SecurityReports|Project was not found or you do not have permission to add this project to Security Dashboards."
-msgstr ""
+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 "SecurityReports|Projects added"
-msgstr ""
+msgstr "Proiecte adăugate"
msgid "SecurityReports|Remove project from dashboard"
msgstr "Eliminați proiectul din tabloul de bord"
msgid "SecurityReports|Report has expired"
-msgstr ""
+msgstr "Raportul a expirat"
msgid "SecurityReports|Scan details"
-msgstr ""
+msgstr "Detalii de scanare"
msgid "SecurityReports|Security Dashboard"
msgstr "Tablou de bord de securitate"
msgid "SecurityReports|Security reports can only be accessed by authorized users."
-msgstr ""
+msgstr "Rapoartele de securitate pot fi accesate numai de către utilizatorii autorizați."
msgid "SecurityReports|Security reports help page link"
-msgstr ""
+msgstr "Linkul paginii de ajutor pentru rapoartele de securitate"
msgid "SecurityReports|Security scans have run"
-msgstr ""
+msgstr "S-au executat scanările de securitate"
msgid "SecurityReports|Select a project to add by using the project search field above."
-msgstr ""
+msgstr "Selectați un proiect de adăugat utilizând câmpul de căutare pentru proiecte de mai sus."
msgid "SecurityReports|Set status"
-msgstr ""
+msgstr "Setați starea"
msgid "SecurityReports|Severity"
-msgstr ""
+msgstr "Severitate"
msgid "SecurityReports|Show %{pageSize} items"
-msgstr ""
+msgstr "Afișează %{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 ""
+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."
msgid "SecurityReports|Sorry, your filter produced no results"
-msgstr ""
+msgstr "Ne pare rău, filtrul dvs. nu a produs rezultate"
msgid "SecurityReports|Status"
-msgstr ""
+msgstr "Status"
msgid "SecurityReports|Submit vulnerability"
-msgstr ""
+msgstr "Trimiteți vulnerabilitatea"
msgid "SecurityReports|Take survey"
-msgstr ""
+msgstr "Participați la sondaj"
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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 ""
+msgstr "Următoarele rapoarte de securitate conțin una sau mai multe constatări de vulnerabilitate care nu au putut fi analizate și nu au fost înregistrate. Pentru a investiga un raport, descărcați artefactele din ieșirea jobului. Asigurați-vă că raportul de securitate este conform cu schema %{helpPageLinkStart}JSON relevantă%{helpPageLinkEnd}."
msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
-msgstr ""
+msgstr "Raportul de securitate pentru acest pipeline a %{helpPageLinkStart}expirat%{helpPageLinkEnd}. Re-executați pipeline-ul pentru a genera un nou raport de securitate."
msgid "SecurityReports|There was an error adding the comment."
-msgstr ""
+msgstr "A apărut o eroare la adăugarea comentariului."
msgid "SecurityReports|There was an error creating the issue."
-msgstr ""
+msgstr "A apărut o eroare la crearea problemei."
msgid "SecurityReports|There was an error creating the merge request."
-msgstr ""
+msgstr "A apărut o eroare la crearea acestui merge request."
msgid "SecurityReports|There was an error deleting the comment."
-msgstr ""
+msgstr "A apărut o eroare la ștergerea comentariului."
msgid "SecurityReports|There was an error dismissing the vulnerabilities."
-msgstr ""
+msgstr "A apărut o eroare la respingerea vulnerabilităților."
msgid "SecurityReports|There was an error dismissing the vulnerability."
-msgstr ""
+msgstr "A apărut o eroare la ignorarea vulnerabilității."
msgid "SecurityReports|There was an error reverting the dismissal."
-msgstr ""
+msgstr "A apărut o eroare la anularea respingerii."
msgid "SecurityReports|There was an error reverting this dismissal."
-msgstr ""
+msgstr "A apărut o eroare la anularea acestei respingeri."
msgid "SecurityReports|There was an error while generating the report."
-msgstr ""
+msgstr "A apărut o eroare în timpul generării raportului."
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 ""
+msgstr "Aceste vulnerabilități au fost detectate în surse externe. Ele nu sunt neapărat legate de proiectul dvs. GitLab. De exemplu, containere care rulează, URL-uri și așa mai departe."
msgid "SecurityReports|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 "SecurityReports|Tool"
-msgstr ""
+msgstr "Instrument"
msgid "SecurityReports|Unable to add %{invalidProjectsMessage}: %{errorMessage}"
msgstr "Nu se poate adăuga %{invalidProjectsMessage}: %{errorMessage}"
msgid "SecurityReports|Unable to add %{invalidProjects}"
-msgstr ""
+msgstr "Nu se poate adăuga %{invalidProjects}"
msgid "SecurityReports|Undo dismiss"
-msgstr ""
+msgstr "Anulați respingerea"
msgid "SecurityReports|Upgrade to interact, track and shift left with vulnerability management features in the UI."
-msgstr ""
+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."
msgid "SecurityReports|Upgrade to manage vulnerabilities"
-msgstr ""
+msgstr "Actualizați pentru a gestiona vulnerabilitățile"
msgid "SecurityReports|Vulnerability Management feature survey"
-msgstr ""
+msgstr "Sondaj privind funcțiile de gestionare a vulnerabilității"
msgid "SecurityReports|Vulnerability Report"
-msgstr ""
+msgstr "Raport de vulnerabilitate"
msgid "SecurityReports|Warning parsing security reports"
-msgstr ""
+msgstr "Avertisment la analiza rapoartelor de securitate"
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 ""
+msgstr "Deși este rar să nu aveți vulnerabilități pentru pipeline-ul dvs., se poate întâmpla. În orice caz, vă rugăm să verificați de două ori setările pentru a vă asigura că toate joburile de scanare de securitate au trecut cu succes."
msgid "SecurityReports|With issues"
-msgstr ""
+msgstr "Cu probleme"
msgid "SecurityReports|You do not have sufficient permissions to access this report"
-msgstr ""
+msgstr "Nu aveți suficiente permisiuni pentru a accesa acest raport"
msgid "SecurityReports|You must sign in as an authorized user to see this report"
-msgstr ""
+msgstr "Trebuie să vă conectați ca utilizator autorizat pentru a vedea acest raport"
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
-msgstr ""
+msgstr "Feedbackul dvs. este important pentru noi! Vom întreba din nou peste o săptămână."
msgid "SecurityReports|scanned resources"
-msgstr ""
+msgstr "resurse scanate"
msgid "SecurityTraining|Primary Training"
-msgstr ""
+msgstr "Formare primară"
msgid "SecurityTraining|Training from this partner takes precedence when more than one training partner is enabled."
-msgstr ""
+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 ""
@@ -34243,6 +34507,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34258,9 +34525,6 @@ msgstr "Selectați grup"
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34303,9 +34567,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34352,10 +34613,7 @@ msgid "Selected projects"
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 "Selective synchronization"
-msgstr ""
+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."
msgid "Self monitoring"
msgstr "Auto-monitorizare"
@@ -34400,7 +34658,7 @@ msgid "Send"
msgstr ""
msgid "Send a single email notification to Owners and Maintainers for new alerts."
-msgstr ""
+msgstr "Trimiteți o singură notificare prin e-mail proprietarilor și întreținătorilor pentru noi alerte."
msgid "Send confirmation email"
msgstr ""
@@ -34457,7 +34715,7 @@ msgid "SeriesFinalConjunction|and"
msgstr ""
msgid "Serve repository static objects (for example, archives and blobs) from external storage."
-msgstr "Serviți obiecte statice repozitoriu (de exemplu, arhive și bloburi) din stocare externă."
+msgstr "Servește obiecte statice de repozitoriu (cum ar fi arhivele și blob-urile) din stocarea externă."
msgid "Server (optional)"
msgstr "Server (opțional)"
@@ -34487,22 +34745,22 @@ msgid "ServerlessDetails|Invocations"
msgstr ""
msgid "ServerlessDetails|Kubernetes Pods"
-msgstr ""
+msgstr "Pod-uri Kubernetes"
msgid "ServerlessDetails|More information"
msgstr ""
msgid "ServerlessDetails|No pods loaded at this time."
-msgstr ""
+msgstr "Niciunul dintre pod-uri nu este încărcat în acest moment."
msgid "ServerlessDetails|Number of Kubernetes pods in use over time based on necessity."
-msgstr ""
+msgstr "Numărul de pod-uri Kubernetes utilizate pe parcursul timpului, în funcție de necesitate."
msgid "ServerlessDetails|pod in use"
-msgstr ""
+msgstr "pod în uz"
msgid "ServerlessDetails|pods in use"
-msgstr ""
+msgstr "pod-uri în uz"
msgid "ServerlessURL|Copy URL"
msgstr ""
@@ -34553,10 +34811,13 @@ msgid "Service Accounts keys authorize GitLab to deploy your Google Cloud projec
msgstr ""
msgid "Service Desk"
-msgstr ""
+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 GitLab fără a avea propriul 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 subiectele doar prin e-mail."
+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."
+
+msgid "Service Ping payload not found in the application cache"
+msgstr ""
msgid "Service account generated successfully"
msgstr ""
@@ -34564,35 +34825,32 @@ msgstr ""
msgid "Service accounts"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
-msgstr "Ping serviciu este dezactivat în fișierul dvs. de configurație și nu poate fi activat prin acest formular."
-
msgid "Service usage data"
msgstr ""
msgid "ServiceDesk|Enable Service Desk"
-msgstr ""
+msgstr "Activați Service Desk"
msgid "ServiceDesk|For help setting up the Service Desk for your instance, please contact an administrator."
-msgstr ""
+msgstr "Pentru a obține ajutor la configurarea Service Desk pentru instanța dvs., vă rugăm să contactați un administrator."
msgid "ServiceDesk|Issues created from Service Desk emails will appear here. Each comment becomes part of the email conversation."
-msgstr ""
+msgstr "Problemele create din e-mailurile Service Desk vor apărea aici. Fiecare comentariu devine parte a conversației din e-mail."
msgid "ServiceDesk|Service Desk is not enabled"
-msgstr ""
+msgstr "Service Desk nu este activat"
msgid "ServiceDesk|Service Desk is not supported"
-msgstr ""
+msgstr "Service Desk nu este suportat"
msgid "ServiceDesk|To enable Service Desk on this instance, an instance administrator must first set up incoming email."
-msgstr ""
+msgstr "Pentru a activa Service Desk pe această instanță, un administrator de instanță trebuie mai întâi să configureze e-mailul de intrare."
msgid "ServiceDesk|Use Service Desk to connect with your users and offer customer support through email right inside GitLab"
-msgstr ""
+msgstr "Folosiți Service Desk pentru a vă conecta cu utilizatorii dvs. și pentru a oferi asistență clienților prin e-mail chiar în GitLab"
msgid "ServiceDesk|Your users can send emails to this address:"
-msgstr ""
+msgstr "Utilizatorii dvs. pot trimite e-mailuri la această adresă:"
msgid "ServicePing|Service ping is off"
msgstr "Ping serviciu este oprit"
@@ -34613,7 +34871,7 @@ msgid "Session ID"
msgstr ""
msgid "Session duration (minutes)"
-msgstr ""
+msgstr "Durata sesiunii (minute)"
msgid "Set %{epic_ref} as the parent epic."
msgstr ""
@@ -34637,7 +34895,7 @@ msgid "Set due date"
msgstr ""
msgid "Set health status"
-msgstr ""
+msgstr "Setează starea sănătății"
msgid "Set health status to %{health_status}."
msgstr ""
@@ -34714,9 +34972,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr "Setați acest număr la 0 pentru a dezactiva limita."
@@ -34753,18 +35008,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34772,34 +35021,34 @@ msgid "SetStatusModal|Busy"
msgstr ""
msgid "SetStatusModal|Clear status"
-msgstr ""
+msgstr "Ștergeți starea"
msgid "SetStatusModal|Clear status after"
-msgstr ""
+msgstr "Ștergeți starea după"
msgid "SetStatusModal|Edit status"
-msgstr ""
+msgstr "Editați starea"
msgid "SetStatusModal|Remove status"
msgstr ""
msgid "SetStatusModal|Set a status"
-msgstr ""
+msgstr "Setați o stare"
msgid "SetStatusModal|Set status"
-msgstr ""
+msgstr "Setați starea"
msgid "SetStatusModal|Sorry, we weren't able to set your status. Please try again later."
msgstr ""
msgid "SetStatusModal|Status updated"
-msgstr ""
+msgstr "Stare actualizată"
msgid "SetStatusModal|What's your status?"
-msgstr ""
+msgstr "Care este starea dvs?"
msgid "SetStatusModal|Your status resets on %{date}."
-msgstr ""
+msgstr "Starea dvs. se resetează la %{date}."
msgid "Sets %{epic_ref} as parent epic."
msgstr ""
@@ -34844,7 +35093,7 @@ msgid "Settings"
msgstr ""
msgid "Settings|Unable to load the merge request options settings. Try reloading the page."
-msgstr ""
+msgstr "Nu se pot încărca setările opțiunilor merge request-urilor. Încercați să reîncărcați pagina."
msgid "Setup"
msgstr ""
@@ -34864,9 +35113,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -34940,7 +35186,7 @@ msgid "Show all %{issuable_type}."
msgstr ""
msgid "Show all activity"
-msgstr ""
+msgstr "Afișează toată activitatea"
msgid "Show all breadcrumbs"
msgstr "Afișați toate breadcrumb-urile"
@@ -34958,10 +35204,10 @@ msgid "Show all test cases."
msgstr ""
msgid "Show archived projects"
-msgstr ""
+msgstr "Afișați proiectele arhivate"
msgid "Show archived projects only"
-msgstr ""
+msgstr "Arătați numai proiectele arhivate"
msgid "Show closed epics"
msgstr ""
@@ -35003,7 +35249,7 @@ msgid "Show list"
msgstr ""
msgid "Show one file at a time"
-msgstr ""
+msgstr "Afișați câte un fișier odată"
msgid "Show open epics"
msgstr ""
@@ -35024,7 +35270,7 @@ msgid "Show thread"
msgstr "Afișare subiecte"
msgid "Show whitespace changes"
-msgstr ""
+msgstr "Afișați modificările spațiilor albe"
msgid "Showing %{conflict} between %{sourceBranch} and %{targetBranch}"
msgstr ""
@@ -35054,10 +35300,10 @@ 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 ""
+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 "Se afișaează grafice pe baza evenimentelor din ultimele %{timerange} zile."
+msgstr "Afișarea graficelor bazate pe evenimentele din ultimele %{timerange} zile."
msgid "Showing last %{size} of log -"
msgstr ""
@@ -35090,7 +35336,7 @@ msgid "Sidekiq job compression threshold (bytes)"
msgstr ""
msgid "Sidekiq job size limit (bytes)"
-msgstr ""
+msgstr "Limita dimensiunii jobului Sidekiq (octeți)"
msgid "Sidekiq job size limits"
msgstr ""
@@ -35183,10 +35429,10 @@ msgid "SignUp|Minimum length is %{minimum_password_length} characters."
msgstr ""
msgid "SignUp|Username is too long (maximum is %{max_length} characters)."
-msgstr ""
+msgstr "Numele de utilizator este prea lung (maximum %{max_length} caractere)."
msgid "SignUp|Username is too short (minimum is %{min_length} characters)."
-msgstr ""
+msgstr "Numele de utilizator este prea scurt (minimum %{min_length} caractere)."
msgid "Signed in"
msgstr ""
@@ -35213,10 +35459,10 @@ msgid "Simulate a pipeline created for the default branch"
msgstr ""
msgid "Site profile failed to delete"
-msgstr ""
+msgstr "Profilul site-ului nu a putut fi șters"
msgid "Site profile not found for given parameters"
-msgstr ""
+msgstr "Profilul site-ului nu a fost găsit pentru parametrii dați"
msgid "Sites"
msgstr ""
@@ -35387,7 +35633,7 @@ msgid "Someone edited this %{issueType} at the same time you did. The descriptio
msgstr ""
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 dvs. Actualizați pagina pentru a vedea modificările."
+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."
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 ""
@@ -35576,7 +35822,7 @@ msgid "Something went wrong. Please try again later"
msgstr ""
msgid "Something went wrong. Please try again."
-msgstr ""
+msgstr "Ceva a mers prost. Vă rugăm să încercați din nou."
msgid "Something went wrong. Try again later."
msgstr ""
@@ -35678,7 +35924,7 @@ msgid "SortOptions|Most popular"
msgstr ""
msgid "SortOptions|Most stars"
-msgstr ""
+msgstr "Cele mai multe stele"
msgid "SortOptions|Name"
msgstr ""
@@ -35699,7 +35945,7 @@ msgid "SortOptions|Oldest sign in"
msgstr ""
msgid "SortOptions|Oldest starred"
-msgstr "Cea mai veche favorizare"
+msgstr "Cel mai vechi marcat cu stea"
msgid "SortOptions|Oldest updated"
msgstr ""
@@ -35720,7 +35966,7 @@ msgid "SortOptions|Recent sign in"
msgstr ""
msgid "SortOptions|Recently starred"
-msgstr "Cea mai recentă favorizare"
+msgstr "Cea mai recent marcat cu stea"
msgid "SortOptions|Size"
msgstr ""
@@ -35732,10 +35978,10 @@ msgid "SortOptions|Sort direction"
msgstr ""
msgid "SortOptions|Stars"
-msgstr ""
+msgstr "Stele"
msgid "SortOptions|Start date"
-msgstr ""
+msgstr "Data de începere"
msgid "SortOptions|Start later"
msgstr ""
@@ -35770,6 +36016,12 @@ 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 ""
@@ -35840,19 +36092,19 @@ msgid "SourcegraphAdmin|https://sourcegraph.example.com"
msgstr ""
msgid "SourcegraphPreferences|This feature is experimental and currently limited to certain projects."
-msgstr ""
+msgstr "Această funcție este experimentală și este limitată în prezent la anumite proiecte."
msgid "SourcegraphPreferences|This feature is experimental and limited to public projects."
-msgstr ""
+msgstr "Această funcție este experimentală și este limitată la proiectele publice."
msgid "SourcegraphPreferences|This feature is experimental."
-msgstr ""
+msgstr "Această funcție este experimentală."
msgid "SourcegraphPreferences|Uses %{linkStart}Sourcegraph.com%{linkEnd}."
-msgstr ""
+msgstr "Folosește %{linkStart}Sourcegraph.com%{linkEnd}."
msgid "SourcegraphPreferences|Uses a custom %{linkStart}Sourcegraph instance%{linkEnd}."
-msgstr ""
+msgstr "Folosește o instanță personalizată %{linkStart}Sourcegraph%{linkEnd}."
msgid "Spam Check"
msgstr ""
@@ -35885,10 +36137,10 @@ msgid "Spent At"
msgstr ""
msgid "Squash commit message"
-msgstr ""
+msgstr "Mesajul commit-ului de squash"
msgid "Squash commits"
-msgstr ""
+msgstr "Squash de commit-uri"
msgid "Stack trace"
msgstr ""
@@ -35915,28 +36167,28 @@ msgid "StarProject|Star"
msgstr ""
msgid "Starred Projects"
-msgstr "Proiecte favorite"
+msgstr "Proiecte marcate cu stele"
msgid "Starred Projects' Activity"
-msgstr "Activitatea proiectelor favorite"
+msgstr "Activitatea proiectelor cu stele"
msgid "Starred projects"
-msgstr "Proiecte favorite"
+msgstr "Proiecte cu stele"
msgid "StarredProjectsEmptyState|Visit a project page and press on a star icon. Then, you can find the project on this page."
-msgstr "Vizitați pagina unui proiect și apăsați pe o pictogramă cu stea. Apoi, puteți găsi proiectul pe această pagină."
+msgstr "Vizitați o pagină de proiect și apăsați pe o pictogramă stea. Apoi, puteți găsi proiectul pe această pagină."
msgid "StarredProjectsEmptyState|You don't have starred projects yet."
-msgstr "Nu aveți încă proiecte favorite."
+msgstr "Nu aveți încă proiecte cu stele."
msgid "Starrers"
-msgstr "Favorit de"
+msgstr "Marcatori cu stele"
msgid "Stars"
msgstr ""
msgid "Start Date"
-msgstr ""
+msgstr "Data de început"
msgid "Start Time"
msgstr ""
@@ -35945,7 +36197,7 @@ msgid "Start Web Terminal"
msgstr ""
msgid "Start a %{new_merge_request} with these changes"
-msgstr "Porniți un %{new_merge_request} cu aceste modificări"
+msgstr "Începeți un %{new_merge_request}} cu aceste modificări"
msgid "Start a Free Ultimate Trial"
msgstr ""
@@ -35957,7 +36209,7 @@ msgid "Start a new merge request"
msgstr ""
msgid "Start a new merge request with these changes"
-msgstr ""
+msgstr "Începeți un nou merge request cu aceste modificări"
msgid "Start a review"
msgstr ""
@@ -35981,7 +36233,7 @@ msgid "Start merge train"
msgstr ""
msgid "Start merge train when pipeline succeeds"
-msgstr ""
+msgstr "Porniți merge train-ul când conducta reușește"
msgid "Start merge train..."
msgstr ""
@@ -36101,106 +36353,106 @@ msgid "StaticSiteEditor|View documentation"
msgstr ""
msgid "StaticSiteEditor|You can set an assignee to get your changes reviewed and deployed once your merge request is created."
-msgstr ""
+msgstr "Puteți stabili un responsabil care să vă revizuiască modificările și să le implementeze odată ce merge request-ul dvs. este creat."
msgid "StaticSiteEditor|Your merge request has been created"
-msgstr ""
+msgstr "Merge request-ul dvs. a fost creat"
msgid "Statistics"
msgstr ""
msgid "Status"
-msgstr ""
+msgstr "Stare"
msgid "Status was retried."
msgstr ""
msgid "Status:"
-msgstr ""
+msgstr "Stare:"
msgid "Status: %{title}"
-msgstr ""
+msgstr "Stare: %{title}"
msgid "StatusCheck| %{failed} failed, and %{pending} pending"
-msgstr ""
+msgstr "%{failed} a(u) eșuat și %{pending} în așteptare"
msgid "StatusCheck|%{failed} failed"
-msgstr ""
+msgstr "%{failed} a(u) eșuat"
msgid "StatusCheck|%{pending} pending"
-msgstr ""
+msgstr "%{pending} în așteptare"
msgid "StatusCheck|API to check"
-msgstr ""
+msgstr "API de verificat"
msgid "StatusCheck|Add status check"
-msgstr ""
+msgstr "Adăugați verificarea stării"
msgid "StatusCheck|All passed"
-msgstr ""
+msgstr "Toate au trecut"
msgid "StatusCheck|An error occurred deleting the %{name} status check."
-msgstr ""
+msgstr "A apărut o eroare la ștergerea verificării stării %{name}"
msgid "StatusCheck|An error occurred fetching the status checks."
-msgstr ""
+msgstr "A apărut o eroare la preluarea verificărilor de stare."
msgid "StatusCheck|Apply this status check to all branches or a specific protected branch."
-msgstr ""
+msgstr "Aplică 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 ""
+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}."
msgid "StatusCheck|Examples: QA, Security."
-msgstr ""
+msgstr "Exemple: QA, Securitate."
msgid "StatusCheck|External API is already in use by another status check."
-msgstr ""
+msgstr "API-ul extern este deja utilizat de o altă verificare de stare."
msgid "StatusCheck|Failed to load status checks"
-msgstr ""
+msgstr "Nu s-a reușit încărcarea verificărilor de stare"
msgid "StatusCheck|Failed to load status checks."
-msgstr ""
+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 ""
+msgstr "Invocă un API extern ca parte a procesului pipeline."
msgid "StatusCheck|No status checks are defined yet."
-msgstr ""
+msgstr "Nu sunt definite încă verificări de stare."
msgid "StatusCheck|Remove status check"
-msgstr ""
+msgstr "Îndepărtați verificarea stării"
msgid "StatusCheck|Remove status check?"
-msgstr ""
+msgstr "Îndepărtați verificarea stării?"
msgid "StatusCheck|Service name"
-msgstr ""
+msgstr "Numele serviciului"
msgid "StatusCheck|Status checks"
-msgstr ""
+msgstr "Verificări de stare"
msgid "StatusCheck|Status checks all passed"
-msgstr ""
+msgstr "Toate verificările de stare au trecut"
msgid "StatusCheck|Status checks are being fetched"
-msgstr ""
+msgstr "Verificările de stare sunt în curs de preluare"
msgid "StatusCheck|Status to check"
-msgstr ""
+msgstr "Stare de verificat"
msgid "StatusCheck|Target branch"
-msgstr ""
+msgstr "Ramura țintă"
msgid "StatusCheck|Update status check"
-msgstr ""
+msgstr "Actualizați verificarea stării"
msgid "StatusCheck|You are about to remove the %{name} status check."
-msgstr ""
+msgstr "Sunteți pe cale să eliminați verificarea stării %{name}."
msgid "StatusCheck|status checks"
-msgstr ""
+msgstr "verificări de stare"
msgid "StatusPage|AWS %{docsLink}"
msgstr ""
@@ -36227,19 +36479,19 @@ msgid "StatusPage|S3 Bucket name"
msgstr ""
msgid "StatusPage|Status page"
-msgstr ""
+msgstr "Pagina de stare"
msgid "StatusPage|Status page URL"
-msgstr ""
+msgstr "URL-ul paginii de stare"
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 ""
+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 ""
msgid "StatusPage|your status page frontend."
-msgstr ""
+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 ""
@@ -36292,6 +36544,12 @@ 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 ""
@@ -36308,7 +36566,7 @@ msgid "SubgroupCreationlevel|Allowed to create subgroups"
msgstr ""
msgid "SubgroupCreationlevel|Maintainers"
-msgstr ""
+msgstr "Întreținători"
msgid "SubgroupCreationlevel|Owners"
msgstr ""
@@ -36413,31 +36671,10 @@ msgid "Subscription successfully deleted."
msgstr ""
msgid "SubscriptionBanner|Add new license"
-msgstr ""
+msgstr "Adăugați o nouă licență"
msgid "SubscriptionBanner|Export license usage file"
-msgstr ""
-
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
+msgstr "Exportați fișierul de utilizare a licenței"
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36470,7 +36707,7 @@ msgid "SubscriptionTable|Next invoice"
msgstr ""
msgid "SubscriptionTable|Refresh Seats"
-msgstr ""
+msgstr "Reîmprospătați Seat-urile"
msgid "SubscriptionTable|Renew"
msgstr ""
@@ -36488,7 +36725,7 @@ msgid "SubscriptionTable|See usage"
msgstr ""
msgid "SubscriptionTable|Something went wrong trying to refresh seats"
-msgstr ""
+msgstr "Ceva nu a mers bine la încercarea de a reîmprospăta seat-urile"
msgid "SubscriptionTable|Subscription end date"
msgstr ""
@@ -36497,7 +36734,7 @@ 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 ""
+msgstr "Aceasta este ultima dată când echipa GitLab.com a intrat în contact cu dvs. pentru a soluționa orice solduri restante."
msgid "SubscriptionTable|This is the maximum number of users that have existed at the same time since this subscription started."
msgstr ""
@@ -36587,7 +36824,7 @@ msgid "Successfully scheduled a pipeline to run. Go to the %{pipelines_link_star
msgstr ""
msgid "Successfully synced %{synced_timeago}."
-msgstr ""
+msgstr "S-a sincronizat cu succes %{synced_timeago}."
msgid "Successfully unbanned"
msgstr ""
@@ -36599,7 +36836,7 @@ msgid "Successfully unlocked"
msgstr ""
msgid "Successfully updated %{last_updated_timeago}."
-msgstr ""
+msgstr "Actualizare reușită %{last_updated_timeago}."
msgid "Successfully updated the environment."
msgstr ""
@@ -36631,6 +36868,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36646,6 +36889,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36664,6 +36913,9 @@ msgstr "Magenta-roz"
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36701,163 +36953,163 @@ msgid "Sunday"
msgstr ""
msgid "SuperSonics|Activate subscription"
-msgstr ""
+msgstr "Activați abonamentul"
msgid "SuperSonics|Activation code"
-msgstr ""
+msgstr "Cod de activare"
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
-msgstr ""
+msgstr "Utilizatori facturabili"
msgid "SuperSonics|Buy subscription"
-msgstr ""
-
-msgid "SuperSonics|Cloud license"
-msgstr ""
+msgstr "Cumpărați un abonament"
msgid "SuperSonics|Cloud licensing"
-msgstr ""
+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 ""
+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}."
msgid "SuperSonics|Enter activation code"
-msgstr ""
+msgstr "Introduceți codul de activare"
msgid "SuperSonics|Export license usage file"
-msgstr ""
+msgstr "Exportați fișierul de utilizare a licenței"
msgid "SuperSonics|Free trial"
-msgstr ""
+msgstr "Evaluare gratuită"
msgid "SuperSonics|Get help for the most common connectivity issues by %{linkStart}troubleshooting the activation code%{linkEnd}."
-msgstr ""
+msgstr "Obțineți ajutor pentru cele mai frecvente probleme de conectivitate prin %{linkStart}depanarea codului de activare%{linkEnd}."
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 ""
+msgstr "Sunt de acord că utilizarea de către mine a Software-ului GitLab este supusă Acordului de abonament aflat în %{linkStart} Termenii Serviciului%{linkEnd}, dacă nu se convine altfel în scris cu GitLab."
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
+msgstr "Aflați cum să vă %{linkStart}activați abonamentul%{linkEnd}."
+
+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 ""
+msgstr "Licențiat pentru"
msgid "SuperSonics|Manage"
-msgstr ""
+msgstr "Gestionați"
msgid "SuperSonics|Maximum users"
+msgstr "Număr maxim de utilizatori"
+
+msgid "SuperSonics|Offline license"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
-msgstr ""
+msgstr "Lipiți codul de activare"
msgid "SuperSonics|Please agree to the Subscription Agreement"
-msgstr ""
+msgstr "Vă rugăm să acceptați Contractul de abonament"
msgid "SuperSonics|Ready to get started? A GitLab plan is ideal for scaling organizations and for multi team usage."
-msgstr "Sunteți gata să începeți? Un plan GitLab este ideal pentru organizații în creștere și pentru utilizarea în echipe multiple."
+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 ""
+msgstr "Începeți evaluarea gratuită"
msgid "SuperSonics|Subscription details"
-msgstr ""
+msgstr "Detaliile abonamentului"
msgid "SuperSonics|Subscription unavailable"
-msgstr ""
+msgstr "Abonament indisponibil"
msgid "SuperSonics|Sync subscription details"
-msgstr ""
+msgstr "Sincronizați detaliile abonamentului"
msgid "SuperSonics|Sync subscription request."
-msgstr ""
+msgstr "Solicitarea de sincronizare a abonamentului."
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 ""
+msgstr "Codul de activare nu este valid. Asigurați-vă că îl copiați exact din Portalul Clienților sau din e-mailul de confirmare. Aflați mai multe despre %{linkStart}activarea abonamentului dumneavoastră%{linkEnd}."
msgid "SuperSonics|The activation code should be a 24-character alphanumeric string"
-msgstr ""
+msgstr "Codul de activare trebuie să fie un șir alfanumeric de 24 de caractere."
msgid "SuperSonics|There is a connectivity issue."
-msgstr ""
+msgstr "Există o problemă de conectivitate."
msgid "SuperSonics|This is the highest peak of users on your installation since the license started."
-msgstr ""
+msgstr "Acesta este punctul cu cel mai mare număr de utilizatori de pe instalația dvs. de când a început licența."
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 ""
+msgstr "Acesta este numărul de %{billableUsersLinkStart}utilizatori facturabili%{billableUsersLinkEnd} pe instalarea 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 "SuperSonics|To activate your subscription, connect to GitLab servers through the %{linkStart}Cloud Licensing%{linkEnd} service, a hassle-free way to manage your subscription."
-msgstr ""
+msgstr "Pentru a vă activa abonamentul, conectați-vă la serverele GitLab prin intermediul serviciului %{linkStart}Cloud Licensing%{linkEnd}, o modalitate simplă de a vă gestiona abonamentul."
msgid "SuperSonics|User in subscription"
msgid_plural "SuperSonics|Users in subscription"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Utilizator în abonament"
+msgstr[1] "Utilizatori în abonament"
+msgstr[2] "Utilizatori în abonament"
msgid "SuperSonics|Users in subscription"
-msgstr ""
+msgstr "Utilizatori în abonament"
msgid "SuperSonics|Users over subscription"
-msgstr ""
+msgstr "Utilizatori peste abonament"
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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
-msgstr ""
+msgstr "Utilizatorii cu rol de Invitat sau cei care nu aparțin unui Proiect sau Grup nu vor utiliza un loc din licența dumneavoastră."
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 ""
+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 ""
+msgstr "Puteți începe o perioadă de evaluare gratuită a GitLab Ultimate fără nicio obligație sau detalii de plată."
msgid "SuperSonics|You do not have an active subscription"
-msgstr ""
+msgstr "Nu aveți un abonament activ"
msgid "SuperSonics|You have a future dated license"
-msgstr ""
+msgstr "Aveți o licență postdatată"
msgid "SuperSonics|You have added a license that activates on %{date}. Please see the subscription history table below for more details."
-msgstr ""
+msgstr "Ați adăugat o licență care se activează pe %{date}. Pentru mai multe detalii, consultați tabelul cu istoricul abonamentelor de mai jos."
msgid "SuperSonics|You have successfully added a license that activates on %{date}. Please see the subscription history table below for more details."
-msgstr ""
+msgstr "Ați adăugat cu succes o licență care se activează pe %{date}. Pentru mai multe detalii, consultați tabelul cu istoricul abonamentelor de mai jos."
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 ""
+msgstr "Veți fi taxat pentru %{trueUpLinkStart}utilizatorii peste licența%{trueUpLinkEnd} pe o bază trimestrială sau anuală, în funcție de termenii contractului dumneavoastră."
msgid "SuperSonics|Your %{subscriptionEntryName} cannot be displayed at the moment. Please refresh the page to try again."
-msgstr ""
+msgstr "Abonamentul dvs. %{subscriptionEntryName} nu poate fi afișat în acest moment. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "SuperSonics|Your future dated license was successfully added"
-msgstr ""
+msgstr "Licența dvs. postdatată a fost adăugată cu succes"
msgid "SuperSonics|Your subscription"
-msgstr ""
+msgstr "Abonamentul d-voastră"
msgid "SuperSonics|Your subscription details will sync shortly."
-msgstr ""
+msgstr "Detaliile abonamentului dvs. se vor sincroniza în scurt timp."
msgid "SuperSonics|Your subscription was successfully activated. You can see the details below."
-msgstr ""
+msgstr "Abonamentul dvs. a fost activat cu succes. Puteți vedea detaliile de mai jos."
msgid "SuperSonics|current subscription"
-msgstr ""
+msgstr "abonamentul curent"
msgid "SuperSonics|future subscriptions"
-msgstr ""
+msgstr "abonamente viitoare"
msgid "SuperSonics|past subscriptions"
-msgstr ""
+msgstr "abonamente anterioare"
msgid "Support"
msgstr ""
@@ -36898,9 +37150,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37066,6 +37315,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37091,13 +37343,13 @@ msgid "Take a look at the documentation to discover all of GitLab’s capabiliti
msgstr ""
msgid "Target Branch"
-msgstr ""
+msgstr "Ramura țintă"
msgid "Target Path"
msgstr "Traiectoria țintă"
msgid "Target branch"
-msgstr ""
+msgstr "Ramura țintă"
msgid "Target branch or tag"
msgstr "Ramura sau eticheta țintă"
@@ -37139,10 +37391,10 @@ msgid "Telephone number"
msgstr ""
msgid "Template"
-msgstr ""
+msgstr "Șablon"
msgid "Template to append to all Service Desk issues"
-msgstr "Șablon de adăugat la toate problemele Birou de Servicii"
+msgstr "Șablon de anexat la toate problemele Service Desk"
msgid "TemplateRepository|Create common files more quickly, and standardize their format."
msgstr ""
@@ -37223,7 +37475,7 @@ msgstr[1] ""
msgstr[2] ""
msgid "Terraform|%{user} updated %{timeAgo}"
-msgstr ""
+msgstr "%{user} a actualizat %{timeAgo}"
msgid "Terraform|A Terraform report failed to generate."
msgstr ""
@@ -37241,7 +37493,7 @@ msgid "Terraform|Actions"
msgstr ""
msgid "Terraform|An error occurred while changing the state file"
-msgstr ""
+msgstr "A apărut o eroare în timpul modificării fișierului de stare"
msgid "Terraform|An error occurred while loading your Terraform States"
msgstr ""
@@ -37267,14 +37519,11 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
-msgstr ""
+msgstr "Statusul jobului"
msgid "Terraform|Loading Terraform reports..."
msgstr ""
@@ -37286,7 +37535,7 @@ msgid "Terraform|Locked"
msgstr ""
msgid "Terraform|Locked by %{user} %{timeAgo}"
-msgstr ""
+msgstr "Blocat de %{user} %{timeAgo}"
msgid "Terraform|Locking state"
msgstr ""
@@ -37351,6 +37600,9 @@ msgstr "Sunteți pe cale să înlăturați fișierul de stare %{name}. Acest luc
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37360,20 +37612,17 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
-msgstr[2] ""
+msgstr[0] "Valoarea de coverage de teste pentru acest pipeline a fost calculată prin valoarea de coverage pentru %d job"
+msgstr[1] "Valoarea de coverage de teste pentru acest pipeline a fost calculată prin media valorilor de coverage rezultate a %d joburi."
+msgstr[2] "Valoarea de coverage de teste pentru acest pipeline a fost calculată prin media valorilor de coverage rezultate a %d de joburi."
msgid "Test coverage: %d hit"
msgid_plural "Test coverage: %d hits"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Coverage de teste: %d executat"
+msgstr[1] "Coverage de teste: %d executate"
+msgstr[2] "Coverage de teste: %d executate"
msgid "Test settings"
msgstr ""
@@ -37448,55 +37697,55 @@ msgid "TestHooks|Ensure the wiki is enabled and has pages."
msgstr ""
msgid "TestReports|%{count} errors"
-msgstr ""
+msgstr "%{count} erori"
msgid "TestReports|%{count} failures"
-msgstr ""
+msgstr "%{count} eșecuri"
msgid "TestReports|%{count} tests"
-msgstr ""
+msgstr "%{count} teste"
msgid "TestReports|%{rate}%{sign} success rate"
-msgstr ""
+msgstr "rată de succes de %{rate}%{sign}"
msgid "TestReports|Attachment"
-msgstr ""
+msgstr "Atașament"
msgid "TestReports|Jobs"
-msgstr ""
+msgstr "Joburi"
msgid "TestReports|Learn how to upload pipeline test reports"
-msgstr ""
+msgstr "Aflați cum să încărcați rapoartele de testare a pipeline-urilor"
msgid "TestReports|Learn more about pipeline test reports"
-msgstr ""
+msgstr "Aflați mai multe despre rapoartele de testare a pipeline-urilor"
msgid "TestReports|No test cases were found in the test report."
-msgstr ""
+msgstr "Nu au fost găsite cazuri de testare în raportul de testare."
msgid "TestReports|Tests"
-msgstr ""
+msgstr "Teste"
msgid "TestReports|There are no test cases to display."
-msgstr ""
+msgstr "Nu există cazuri de testare de afișat."
msgid "TestReports|There are no test reports for this pipeline"
-msgstr ""
+msgstr "Nu există rapoarte de testare pentru acest pipeline"
msgid "TestReports|There are no test suites to show."
-msgstr ""
+msgstr "Nu există serii de teste de afișat."
msgid "TestReports|There are no tests to display"
-msgstr ""
+msgstr "Nu există teste de afișat."
msgid "TestReports|There was an error fetching the summary."
-msgstr ""
+msgstr "A apărut o eroare la preluarea rezumatului."
msgid "TestReports|There was an error fetching the test suite."
-msgstr ""
+msgstr "A apărut o eroare la preluarea seriei 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 ""
+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 ""
@@ -37559,7 +37808,7 @@ msgid "The GitLab subscription service (customers.gitlab.com) is currently exper
msgstr ""
msgid "The GitLab user to which the Jira user %{jiraDisplayName} will be mapped"
-msgstr ""
+msgstr "Utilizatorul GitLab la care va fi mapat utilizatorul Jira %{jiraDisplayName}."
msgid "The ID of the application."
msgstr ""
@@ -37586,7 +37835,7 @@ msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs se
msgstr ""
msgid "The `/merge` quick action requires the SHA of the head of the branch."
-msgstr ""
+msgstr "Acțiunea rapidă „/merge†necesită SHA-ul de HEAD al ramurii."
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 ""
@@ -37598,7 +37847,7 @@ msgid "The branch for this project has no active pipeline configuration."
msgstr ""
msgid "The branch or tag does not exist"
-msgstr ""
+msgstr "Ramura sau eticheta nu există"
msgid "The broadcast message displays only to users in projects and groups who have these roles."
msgstr "Mesajul difuzat se afișează numai utilizatorilor din proiecte și grupuri care au aceste roluri."
@@ -37615,9 +37864,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37631,10 +37877,10 @@ msgid "The content editor may change the markdown formatting style of the docume
msgstr ""
msgid "The content for this wiki page failed to load. To fix this error, reload the page."
-msgstr ""
+msgstr "Conținutul acestei pagini wiki nu s-a putut încărca. Pentru a remedia această eroare, reîncărcați pagina."
msgid "The content for this wiki page failed to render."
-msgstr ""
+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 ""
@@ -37715,7 +37961,7 @@ msgid "The following Personal Access Token was revoked by an administrator, %{us
msgstr ""
msgid "The following SSH key was deleted by an administrator, %{username}."
-msgstr ""
+msgstr "Următoarea cheie SSH a fost ștearsă de un administrator, %{username}."
msgid "The following items will NOT be exported:"
msgstr ""
@@ -37739,7 +37985,7 @@ msgid "The form contains the following warning:"
msgstr ""
msgid "The git server, Gitaly, is not available at this time. Please contact your administrator."
-msgstr ""
+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 ""
@@ -37805,7 +38051,7 @@ msgid "The latest pipeline for this merge request did not succeed. The latest ch
msgstr ""
msgid "The latest pipeline for this merge request has failed."
-msgstr ""
+msgstr "Ultimul pipeline pentru acest merge request a eșuat."
msgid "The license key is invalid."
msgstr ""
@@ -37838,7 +38084,7 @@ msgid "The maximum file size for job artifacts."
msgstr ""
msgid "The maximum file size in megabytes for individual job artifacts."
-msgstr ""
+msgstr "Mărimea maximă a fișierului în megaocteți pentru artefactele individuale ale jobului."
msgid "The maximum file size is %{size}."
msgstr ""
@@ -37874,7 +38120,7 @@ msgid "The number of changes to fetch from GitLab when cloning a repository. Low
msgstr ""
msgid "The number of merge requests merged by month."
-msgstr ""
+msgstr "Numărul de merge request-uri îmbinate pe lună."
msgid "The number of times an upload record could not find its file"
msgstr ""
@@ -37898,7 +38144,7 @@ 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 ""
+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 ""
@@ -37927,9 +38173,6 @@ msgstr "Crearea forkului de proiect s-a făcut cu succes."
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr "Compilarea asociată CI a eșuat."
@@ -37949,7 +38192,7 @@ msgid "The report has been successfully prepared."
msgstr "Raportul a fost întocmit cu succes."
msgid "The repository can be committed to, and issues, comments and other entities can be created."
-msgstr ""
+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 ""
@@ -38009,13 +38252,13 @@ msgid "The uploaded file was invalid. Supported file extensions are %{extensions
msgstr ""
msgid "The user is being deleted."
-msgstr ""
+msgstr "Utilizatorul este șters."
msgid "The user map has been saved. Continue by selecting the projects you want to import."
-msgstr ""
+msgstr "Maparea utilizatorului a fost salvată. Continuați prin selectarea proiectelor pe care doriți să le importați."
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 ""
+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 ""
@@ -38024,7 +38267,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 "Numele de utilizator pentru serverul Jenkins."
msgid "The value of the provided variable exceeds the %{count} character limit"
msgstr ""
@@ -38036,12 +38279,12 @@ msgid "The vulnerability is known, and has not been remediated or mitigated, but
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ă."
msgid "The vulnerability is no longer detected. Verify the vulnerability has been fixed or removed before changing its status."
-msgstr ""
+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 ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38072,7 +38315,7 @@ msgid "There are no abuse reports!"
msgstr ""
msgid "There are no archived projects yet"
-msgstr ""
+msgstr "Nu există încă proiecte arhivate"
msgid "There are no archived requirements"
msgstr ""
@@ -38084,7 +38327,7 @@ msgid "There are no changes"
msgstr ""
msgid "There are no charts configured for this page"
-msgstr ""
+msgstr "Nu sunt configurate grafice pentru această pagină"
msgid "There are no closed epics"
msgstr ""
@@ -38099,7 +38342,7 @@ 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 ""
+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 ""
@@ -38156,7 +38399,7 @@ msgid "There is already a to-do item for this design."
msgstr ""
msgid "There is no chart data available."
-msgstr ""
+msgstr "Nu sunt disponibile date grafice."
msgid "There is no data available."
msgstr ""
@@ -38177,7 +38420,7 @@ msgid "There was a problem fetching branches."
msgstr ""
msgid "There was a problem fetching emojis."
-msgstr ""
+msgstr "A apărut o problemă la preluarea emojiurilor."
msgid "There was a problem fetching epics."
msgstr ""
@@ -38221,12 +38464,21 @@ msgstr "A apărut o problemă în timpul preluării valorii domeniului de aplica
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 "A apărut o problemă în timpul preluării proiectelor"
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 ""
@@ -38252,10 +38504,10 @@ msgid "There was an error deleting the To Do."
msgstr ""
msgid "There was an error fetching configuration for charts"
-msgstr ""
+msgstr "A apărut o eroare la preluarea configurației pentru grafice"
msgid "There was an error fetching content, please refresh the page"
-msgstr ""
+msgstr "A survenit o eroare la preluarea conținutului, vă rugăm să reîmprospătați pagina"
msgid "There was an error fetching data for the selected stage"
msgstr ""
@@ -38278,12 +38530,6 @@ msgstr "A apărut o eroare preluând numărătoarea totală a stagiilor"
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38303,7 +38549,7 @@ msgid "There was an error fetching value stream analytics stages."
msgstr ""
msgid "There was an error gathering the chart data"
-msgstr ""
+msgstr "A apărut o eroare la colectarea datelor graficului"
msgid "There was an error getting the epic participants."
msgstr ""
@@ -38332,9 +38578,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38350,9 +38593,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38372,16 +38612,16 @@ 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 ""
+msgstr "A apărut o eroare la preluarea datelor graficului. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "There was an error while fetching the table data. Please refresh the page to try again."
-msgstr ""
+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 ""
msgid "There was an error while fetching value stream analytics duration data."
-msgstr ""
+msgstr "A apărut 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 ""
@@ -38390,7 +38630,7 @@ 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 ""
+msgstr "Aceste date influențează modul în care apar epicele dvs. în foaia de parcurs. Stabiliți o dată fixă sau una moștenită din obiectivele atribuite problemelor din această epică."
msgid "These examples show how to trigger this project's pipeline for a branch or tag."
msgstr ""
@@ -38402,7 +38642,7 @@ msgid "These runners are shared across projects in this group."
msgstr ""
msgid "These runners are shared across this GitLab instance."
-msgstr ""
+msgstr "Acești executori sunt partajați pe această instanță GitLab."
msgid "These runners are specific to this project."
msgstr ""
@@ -38414,7 +38654,7 @@ msgid "These will be sent to %{email} in an attachment once finished."
msgstr ""
msgid "Things to be aware of before transferring:"
-msgstr ""
+msgstr "Lucruri de care trebuie să fiți conștienți înainte de transfer:"
msgid "Third Party Advisory Link"
msgstr ""
@@ -38429,10 +38669,10 @@ msgid "This %{issuable} is locked. Only %{strong_open}project members%{strong_cl
msgstr ""
msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and %{lockedLinkStart}locked%{lockedLinkEnd}."
-msgstr "Acest %{noteableTypeText} este %{confidentialLinkStart}confidențial%{confidentialLinkEnd} și %{lockedLinkStart}blocat%{lockedLinkEnd}."
+msgstr "Acest/această %{noteableTypeText} este %{confidentialLinkStart}confidențial(ă)%{confidentialLinkEnd} și este %{lockedLinkStart}blocat(ă)%{lockedLinkEnd}."
msgid "This %{noteableTypeText} is locked."
-msgstr ""
+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}."
@@ -38441,19 +38681,19 @@ 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 ""
+msgstr "Această instanță GitLab nu oferă încă niciun executor partajat. Administratorii instanței pot înregistra executorii partajați în zona admin."
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 ""
+msgstr "Licența pentru această instanță GitLab este la nivelul %{insufficient_license}. Geo este disponibil numai pentru utilizatorii care au cel puțin o licență Premium."
msgid "This GitLab instance is undergoing maintenance and is operating in read-only mode."
msgstr ""
msgid "This PDF is too large to display. Please download to view."
-msgstr ""
+msgstr "Acest PDF este prea mare pentru a fi afișat. Vă rugăm să-l descărcați pentru a-l vizualiza."
msgid "This Project is currently archived and read-only. Please unarchive the project first if you want to resume Pull mirroring"
-msgstr ""
+msgstr "Acest proiect este în prezent arhivat și este doar în citire. Vă rugăm să dezarhivați mai întâi proiectul dacă doriți să reluați oglindirea Pull"
msgid "This URL already exists."
msgstr "Acest URL există deja."
@@ -38513,7 +38753,7 @@ msgid "This board's scope is reduced"
msgstr "Acest bord a fost restrâns în scop"
msgid "This chart could not be displayed"
-msgstr ""
+msgstr "Acest grafic nu a putut fi afișat"
msgid "This clears repository check states for all projects in the database and cannot be undone. Are you sure?"
msgstr "Acest lucru șterge stările de verificare a repozitoriilor pentru toate proiectele din baza de date și nu poate fi anulat. Sunteți sigur?"
@@ -38525,7 +38765,7 @@ msgid "This comment changed after you started editing it. Review the %{startTag}
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 "Acest commit face parte din merge request-ul %{link_to_merge_request}. Comentariile create aici vor fi create în contextul acelui merge request."
+msgstr "Acest commit face parte din merge request-ul %{link_to_merge_request}. Comentariile create aici vor fi create în contextul acestui merge request."
msgid "This commit was signed with %{strong_open}multiple%{strong_close} signatures."
msgstr "Acest commit a fost semnat cu semnături %{strong_open}multiple%{strong_close}."
@@ -38555,7 +38795,7 @@ msgid "This deployment is not waiting for approvals."
msgstr "Această implementare nu este în așteptarea aprobărilor."
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 ""
+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 ""
@@ -38596,9 +38836,12 @@ msgstr ""
msgid "This epic does not exist or you don't have sufficient permission."
msgstr ""
-msgid "This feature requires local storage to be enabled"
+msgid "This epic would exceed maximum number of related epics."
msgstr ""
+msgid "This feature requires local storage to be enabled"
+msgstr "Această caracteristică necesită ca stocarea locală să fie activată"
+
msgid "This field is required"
msgstr "Acest câmp este obligatoriu"
@@ -38654,13 +38897,13 @@ msgid "This invitation was sent to %{mail_to_invite_email}, but you are signed i
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 ""
+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 ""
msgid "This is a confidential %{noteableTypeText}."
-msgstr ""
+msgstr "Acesta/aceasta este un/o %{noteableTypeText} confidențial(ă)."
msgid "This is a delayed job to run in %{remainingTime}"
msgstr ""
@@ -38675,7 +38918,7 @@ msgid "This is a security log of authentication events involving your account."
msgstr ""
msgid "This is a self-managed instance of GitLab."
-msgstr ""
+msgstr "Aceasta este o instanță autogestionată a GitLab."
msgid "This is an experimental feature developed by GitLab Incubation Engineering."
msgstr ""
@@ -38707,7 +38950,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38720,7 +38963,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 "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 ""
@@ -38798,13 +39041,13 @@ 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 ""
+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 ""
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 ""
+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 ""
@@ -38828,7 +39071,7 @@ msgid "This merge request does not have accessibility reports"
msgstr ""
msgid "This merge request does not have codequality reports"
-msgstr ""
+msgstr "Acest merge request nu are rapoarte codequality"
msgid "This merge request is closed. To apply this suggestion, edit this file directly."
msgstr ""
@@ -38854,9 +39097,6 @@ 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 ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
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."
@@ -38888,10 +39128,10 @@ msgid "This project does not belong to a group and cannot make use of group runn
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 ""
+msgstr "Acest proiect nu are activat %{service_desk_link_start}Service Desk%{service_desk_link_end}, de aceea utilizatorul care a creat problema nu va mai primi notificări prin e-mail despre noile activități."
msgid "This project does not have a wiki homepage yet"
-msgstr ""
+msgstr "Acest proiect nu are încă o pagină de pornire wiki"
msgid "This project has no active access tokens."
msgstr ""
@@ -38903,7 +39143,7 @@ msgid "This project is %{strongStart}NOT%{strongEnd} a fork. This process delete
msgstr ""
msgid "This project is archived and cannot be commented on."
-msgstr ""
+msgstr "Acest proiect este arhivat și nu poate fi comentat."
msgid "This project is licensed under the %{strong_start}%{license_name}%{strong_end}."
msgstr ""
@@ -38981,13 +39221,13 @@ msgid "This user has no personal projects."
msgstr ""
msgid "This user has previously committed to the %{name} project."
-msgstr ""
+msgstr "Acest utilizator a făcut anterior commit în proiectul %{name}."
msgid "This user has the %{access} role in the %{name} project."
msgstr ""
msgid "This user is the author of this %{noteable}."
-msgstr ""
+msgstr "Acest utilizator este autorul acestui/acestei %{noteable}."
msgid "This variable can not be masked."
msgstr ""
@@ -39010,9 +39250,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr "Nu se poate găsi subiectul la care să răspundeți"
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39026,7 +39263,7 @@ msgid "ThreatMonitoring|Anomalous Requests"
msgstr ""
msgid "ThreatMonitoring|Container Network Policies are not installed or have been disabled. To view this data, ensure your Network Policies are installed and enabled for your cluster."
-msgstr ""
+msgstr "Politicile de rețea pentru containere nu sunt instalate sau au fost dezactivate. Pentru a vizualiza aceste date, asigurați-vă că Politicile de rețea sunt instalate și activate pentru clusterul dumneavoastră."
msgid "ThreatMonitoring|Container Network Policy"
msgstr ""
@@ -39038,7 +39275,7 @@ msgid "ThreatMonitoring|Date and time"
msgstr ""
msgid "ThreatMonitoring|Dismissed"
-msgstr ""
+msgstr "S-a respins"
msgid "ThreatMonitoring|Dropped Packets"
msgstr ""
@@ -39053,7 +39290,7 @@ msgid "ThreatMonitoring|Failed to create incident, please try again."
msgstr ""
msgid "ThreatMonitoring|Hide dismissed alerts"
-msgstr ""
+msgstr "Ascundeți alertele respinse"
msgid "ThreatMonitoring|In review"
msgstr ""
@@ -39098,10 +39335,10 @@ msgid "ThreatMonitoring|Statistics"
msgstr ""
msgid "ThreatMonitoring|Status"
-msgstr ""
+msgstr "Stare"
msgid "ThreatMonitoring|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear."
-msgstr ""
+msgstr "A apărut o eroare la afișarea alertelor. Confirmați detaliile de configurare ale punctului final pentru a vă asigura că apar alertele."
msgid "ThreatMonitoring|There was an error while updating the status of the alert. Please try again."
msgstr ""
@@ -39134,7 +39371,7 @@ 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 ""
+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."
msgid "Threshold number of changes (branches or tags) in a single push above which a bulk push event is created (default is 3)."
msgstr ""
@@ -39181,9 +39418,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39230,132 +39464,132 @@ msgid "TimeTracking|Time remaining: %{timeRemainingHumanReadable}"
msgstr ""
msgid "Timeago|%s days ago"
-msgstr ""
+msgstr "acum %s zile"
msgid "Timeago|%s days remaining"
-msgstr ""
+msgstr "%s zile rămase"
msgid "Timeago|%s hours ago"
-msgstr ""
+msgstr "acum %s ore"
msgid "Timeago|%s hours remaining"
-msgstr ""
+msgstr "%s ore rămase"
msgid "Timeago|%s minutes ago"
-msgstr ""
+msgstr "acum %s minute"
msgid "Timeago|%s minutes remaining"
-msgstr ""
+msgstr "%s minute rămase"
msgid "Timeago|%s months ago"
-msgstr ""
+msgstr "acum %s luni"
msgid "Timeago|%s months remaining"
-msgstr ""
+msgstr "%s luni rămase"
msgid "Timeago|%s seconds remaining"
-msgstr ""
+msgstr "%s secunde rămase"
msgid "Timeago|%s weeks ago"
-msgstr ""
+msgstr "acum %s săptămâni"
msgid "Timeago|%s weeks remaining"
-msgstr ""
+msgstr "%s săptămâni rămase"
msgid "Timeago|%s years ago"
-msgstr ""
+msgstr "acum %s ani"
msgid "Timeago|%s years remaining"
-msgstr ""
+msgstr "%s ani rămași"
msgid "Timeago|1 day ago"
-msgstr ""
+msgstr "acum o zi"
msgid "Timeago|1 day remaining"
-msgstr ""
+msgstr "1 zi rămasă"
msgid "Timeago|1 hour ago"
-msgstr ""
+msgstr "acum o oră"
msgid "Timeago|1 hour remaining"
-msgstr ""
+msgstr "1 oră rămasă"
msgid "Timeago|1 minute ago"
-msgstr ""
+msgstr "acum 1 minut"
msgid "Timeago|1 minute remaining"
-msgstr ""
+msgstr "1 minut rămas"
msgid "Timeago|1 month ago"
-msgstr ""
+msgstr "acum 1 lună"
msgid "Timeago|1 month remaining"
-msgstr ""
+msgstr "1 lună rămasă"
msgid "Timeago|1 week ago"
-msgstr ""
+msgstr "acum o săptămână"
msgid "Timeago|1 week remaining"
-msgstr ""
+msgstr "1 săptămână rămasă"
msgid "Timeago|1 year ago"
-msgstr ""
+msgstr "acum 1 an"
msgid "Timeago|1 year remaining"
-msgstr ""
+msgstr "1 an rămas"
msgid "Timeago|Past due"
-msgstr ""
+msgstr "Depășit"
msgid "Timeago|in %s days"
-msgstr ""
+msgstr "în %s zile"
msgid "Timeago|in %s hours"
-msgstr ""
+msgstr "în %s ore"
msgid "Timeago|in %s minutes"
-msgstr ""
+msgstr "în %s minute"
msgid "Timeago|in %s months"
-msgstr ""
+msgstr "în %s luni"
msgid "Timeago|in %s seconds"
-msgstr ""
+msgstr "în %s secunde"
msgid "Timeago|in %s weeks"
-msgstr ""
+msgstr "în %s săptămâni"
msgid "Timeago|in %s years"
-msgstr ""
+msgstr "în %s ani"
msgid "Timeago|in 1 day"
-msgstr ""
+msgstr "în 1 zi"
msgid "Timeago|in 1 hour"
-msgstr ""
+msgstr "în 1 oră"
msgid "Timeago|in 1 minute"
-msgstr ""
+msgstr "în 1 minut"
msgid "Timeago|in 1 month"
-msgstr ""
+msgstr "în 1 lună"
msgid "Timeago|in 1 week"
-msgstr ""
+msgstr "în 1 săptămână"
msgid "Timeago|in 1 year"
-msgstr ""
+msgstr "în 1 an"
msgid "Timeago|just now"
-msgstr ""
+msgstr "chiar acum"
msgid "Timeago|right now"
-msgstr ""
+msgstr "chiar acum"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39430,20 +39664,26 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr ""
-msgid "To add a custom suffix, set up a Service Desk email address. %{linkStart}Learn more.%{linkEnd}"
+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 "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 ""
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."
+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 ""
+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 depozitelor dvs. publice și private care sunt disponibile pentru conectare."
msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories."
msgstr ""
@@ -39479,7 +39719,7 @@ msgid "To further protect your account, consider configuring a two-factor authen
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 ""
+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."
msgid "To get started, click the link below to confirm your account."
msgstr ""
@@ -39490,11 +39730,8 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
-msgstr ""
+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 ""
@@ -39509,7 +39746,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 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 ""
+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."
msgid "To only use CI/CD features for an external repository, choose %{strong_open}CI/CD for external repo%{strong_close}."
msgstr ""
@@ -39587,7 +39824,7 @@ 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 ""
+msgstr "Pentru a vizualiza toate cele %{scannedResourcesCount} adrese URL scanate, %{linkStart}vă rugăm să descărcați fișierul CSV%{linkEnd}"
msgid "To widen your search, change or remove filters above"
msgstr ""
@@ -39737,9 +39974,12 @@ msgid "Topic avatar"
msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr "Avatarul subiectului pentru %{name} va fi înlăturat. Acest lucru nu poate fi anulat."
+
+msgid "Topic slug (name)"
msgstr ""
-msgid "Topic name"
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39770,7 +40010,7 @@ msgid "Total memory (GB)"
msgstr ""
msgid "Total test time for all commits/merges"
-msgstr ""
+msgstr "Timpul total de testare pentru toate commit-urile/îmbinările"
msgid "Total users"
msgstr ""
@@ -39806,7 +40046,7 @@ msgid "Track time with quick actions"
msgstr ""
msgid "Training mode"
-msgstr ""
+msgstr "Modul de formare"
msgid "Transfer"
msgstr ""
@@ -39824,34 +40064,34 @@ msgid "Transfer your project into another namespace. %{link_start}Learn more.%{l
msgstr "Transferați-vă proiectul într-un alt spațiu de nume. %{link_start}Aflați mai multe.%{link_end}"
msgid "TransferGroup|Cannot transfer group to one of its subgroup."
-msgstr ""
+msgstr "Nu se poate transfera grupul într-unul din subgrupurile sale."
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 ""
+msgstr "Nu se poate actualiza calea, deoarece există proiecte sub acest grup care conțin imagini Docker în registrul lor de containere. Vă rugăm să eliminați mai întâi imaginile din proiectele dvs. și să încercați din nou."
msgid "TransferGroup|Database is not supported."
-msgstr ""
+msgstr "Baza de date nu este acceptată."
msgid "TransferGroup|Group contains contacts/organizations and you don't have enough permissions to move them to the new root group."
-msgstr ""
+msgstr "Grupul conține contacte/organizații și nu aveți suficiente permisiuni pentru a le muta în noul grup rădăcină."
msgid "TransferGroup|Group contains projects with NPM packages."
-msgstr ""
+msgstr "Grupul conține proiecte cu pachete NPM."
msgid "TransferGroup|Group is already a root group."
-msgstr ""
+msgstr "Grupul este deja un grup rădăcină."
msgid "TransferGroup|Group is already associated to the parent group."
-msgstr ""
+msgstr "Grupul este deja asociat grupului părinte."
msgid "TransferGroup|The parent group already has a subgroup or a project with the same path."
-msgstr ""
+msgstr "Grupul părinte are deja un subgrup sau un proiect cu aceeași cale."
msgid "TransferGroup|Transfer failed: %{error_message}"
msgstr "Transferul a eșuat: %{error_message}"
msgid "TransferGroup|You don't have enough permissions."
-msgstr ""
+msgstr "Nu aveți suficiente permisiuni."
msgid "TransferProject|Cannot move project"
msgstr ""
@@ -39893,7 +40133,7 @@ msgid "Trials|Create a new group to start your GitLab Ultimate trial."
msgstr ""
msgid "Trials|Day %{daysUsed}/%{duration}"
-msgstr ""
+msgstr "Ziua %{daysUsed}/%{duration}"
msgid "Trials|Go back to GitLab"
msgstr ""
@@ -39935,7 +40175,7 @@ msgid "Trial|Country"
msgstr ""
msgid "Trial|Dismiss"
-msgstr ""
+msgstr "Respingeți"
msgid "Trial|GitLab Ultimate trial (optional)"
msgstr ""
@@ -39979,8 +40219,8 @@ 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."
-msgstr "Declanșează conducte când ramuri sau etichete sunt actualizate în repozitoriul upstream. În funcție de activitatea repozitoriului upstream, acest lucru poate crește foarte mult sarcina executorilor voștri CI. Activați acest lucru doar dacă știți că se pot ocupa de sarcină."
+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 ""
@@ -40018,6 +40258,9 @@ 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 ""
@@ -40025,7 +40268,7 @@ msgid "Try again?"
msgstr ""
msgid "Try all GitLab features for free for 30 days. No credit card required."
-msgstr ""
+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 ""
@@ -40060,9 +40303,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40114,9 +40354,6 @@ msgstr "Perioadă de grație cu doi factori"
msgid "Type"
msgstr "Tip"
-msgid "Type/State"
-msgstr "Tip/Stare"
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40139,7 +40376,7 @@ 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 ""
+msgstr "URL-ul este declanșat atunci când este creat, actualizat sau îmbinat un merge request"
msgid "URL is triggered when a new tag is pushed to the repository"
msgstr ""
@@ -40154,13 +40391,13 @@ msgid "URL must start with %{codeStart}http://%{codeEnd}, %{codeStart}https://%{
msgstr ""
msgid "URL of the Grafana instance to link to from the Metrics Dashboard menu item."
-msgstr "URL-ul instanÈ›ei Grafana la care se face legătura din opÈ›iunea de meniu „Tablou de bord de metriciâ€."
+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 ""
msgid "URL of the external storage to serve the repository static objects."
-msgstr ""
+msgstr "URL-ul stocării externe care servește obiectele statice ale repozitoriului."
msgid "URL or request ID"
msgstr ""
@@ -40220,6 +40457,9 @@ 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."
+
+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"
@@ -40232,16 +40472,16 @@ msgid "Unable to load file contents. Try again later."
msgstr ""
msgid "Unable to load refs"
-msgstr ""
+msgstr "Nu se pot încărca referințele"
msgid "Unable to load the diff"
-msgstr ""
+msgstr "Nu se poate încărca diff-ul"
msgid "Unable to load the diff. %{button_try_again}"
-msgstr ""
+msgstr "Nu se poate încărca diff-ul. %{button_try_again}"
msgid "Unable to load the merge request widget. Try reloading the page."
-msgstr ""
+msgstr "Imposibil de încărcat widget-ul Merge-Request-ului. Încercați să reîncărcați pagina."
msgid "Unable to save iteration. Please try again"
msgstr ""
@@ -40259,7 +40499,7 @@ 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 ""
+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 ""
@@ -40271,7 +40511,7 @@ msgid "Unable to update this issue at this time."
msgstr ""
msgid "Unable to verify the user"
-msgstr ""
+msgstr "Nu se poate verifica utilizatorul"
msgid "Unapprove a merge request"
msgstr ""
@@ -40304,7 +40544,7 @@ 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 ""
+msgstr "Modificările care nu au fost comise vor fi pierdute dacă schimbați ramurile. Doriți să continuați?"
msgid "Undo"
msgstr ""
@@ -40379,7 +40619,7 @@ msgid "Unlock the discussion"
msgstr ""
msgid "Unlock this %{issuableDisplayName}? %{strongStart}Everyone%{strongEnd} will be able to comment."
-msgstr ""
+msgstr "Deblocați acest %{issuableDisplayName}? %{strongStart}Toată lumea%{strongEnd} va putea să comenteze."
msgid "Unlocked"
msgstr ""
@@ -40391,10 +40631,10 @@ msgid "Unlocks the discussion."
msgstr ""
msgid "Unmarked this %{noun} as a draft."
-msgstr "Acest %{noun} nu mai este marcat ca schiță."
+msgstr "Acest %{noun} nu mai este marcat ca draft."
msgid "Unmarks this %{noun} as a draft."
-msgstr "Anulați marcarea acestui %{noun} ca fiind o schiță."
+msgstr "Anulați marcarea acestui %{noun} ca un draft."
msgid "Unreachable"
msgstr ""
@@ -40463,10 +40703,10 @@ msgid "Up to date"
msgstr ""
msgid "Upcoming"
-msgstr ""
+msgstr "Viitoare"
msgid "Upcoming Release"
-msgstr ""
+msgstr "Lansarea viitoare"
msgid "Update"
msgstr ""
@@ -40487,7 +40727,7 @@ msgid "Update appearance settings"
msgstr ""
msgid "Update approval rule"
-msgstr ""
+msgstr "Actualizați regula de aprobare"
msgid "Update approvers"
msgstr ""
@@ -40501,9 +40741,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40511,7 +40748,7 @@ msgid "Update now"
msgstr "Actualizare imediată"
msgid "Update username"
-msgstr ""
+msgstr "Actualizați numele de utilizator"
msgid "Update variable"
msgstr ""
@@ -40552,9 +40789,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40655,11 +40889,17 @@ msgid "UsageQuota|Buy additional minutes"
msgstr ""
msgid "UsageQuota|CI minutes usage by month"
-msgstr "Utilizare minute CI după lună"
+msgstr "Utilizarea de minute CI pe lună"
msgid "UsageQuota|CI minutes usage by project"
msgstr "Utilizare minute CI după proiect"
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
msgid "UsageQuota|Code packages and container images."
msgstr ""
@@ -40669,8 +40909,8 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
-msgstr "Începând cu %{storage_enforcement_date}, limitele de stocare se vor aplica acestui spațiu de nume. Vizualizați și gestionați utilizarea dvs. în setările %{strong_start}%{namespace_type} &gt; Cotele de utilizare%{strong_end}."
+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 ""
@@ -40720,6 +40960,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Fragmente de cod"
@@ -40768,6 +41011,12 @@ 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 ""
@@ -40780,9 +41029,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40808,13 +41054,13 @@ msgid "UsageQuota|out of %{formattedLimit} of your namespace storage"
msgstr "din %{formattedLimit} din spațiul de stocare al spațiului dvs. de nume"
msgid "UsageTrends|Could not load the issues and merge requests chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Nu s-a putut încărca graficul de probleme și merge request-uri. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "UsageTrends|Could not load the pipelines chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Nu s-a putut încărca graficul pipeline-urilor. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "UsageTrends|Could not load the projects and groups chart. Please refresh the page to try again."
-msgstr ""
+msgstr "Nu s-a putut încărca graficul de proiecte și grupuri. Vă rugăm să reîmprospătați pagina pentru a încerca din nou."
msgid "UsageTrends|Groups"
msgstr ""
@@ -40913,7 +41159,7 @@ msgid "Use a one-time password authenticator on your mobile device or computer t
msgstr ""
msgid "Use an AWS CloudFormation Template (CFT) to install and configure GitLab Runner in AWS."
-msgstr ""
+msgstr "Utilizați un Șablon AWS CloudFormation (CFT) pentru a instala și configura executorii GitLab în AWS."
msgid "Use authorized_keys file to authenticate SSH keys"
msgstr ""
@@ -40933,8 +41179,8 @@ msgstr "Folosiți ghilimele duble pentru multiple cuvinte cheie, cum ar fi %{cod
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
-msgstr "Utilizați traiectorii de stocare hashed pentru repozitorii nou-create și redenumite. Activat mereu din versiunea 13.0."
+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 ""
@@ -41165,70 +41411,70 @@ msgid "UserLists|User lists allow you to define a set of users to use with Featu
msgstr "Listele de utilizatori vă permit să definiți un set de utilizatori care să fie utilizați cu Feature Flags."
msgid "UserList|Delete %{name}?"
-msgstr ""
+msgstr "Ștergeți %{name}?"
msgid "UserList|created %{timeago}"
-msgstr ""
+msgstr "creat %{timeago}"
msgid "UserProfile|(Busy)"
-msgstr ""
+msgstr "(Ocupat)"
msgid "UserProfile|Activity"
-msgstr ""
+msgstr "Activitate"
msgid "UserProfile|Already reported for abuse"
-msgstr ""
+msgstr "A fost deja raportat pentru abuz"
msgid "UserProfile|Blocked user"
-msgstr ""
+msgstr "Utilizator blocat"
msgid "UserProfile|Bot activity"
-msgstr ""
+msgstr "Activitate bot"
msgid "UserProfile|Contributed projects"
-msgstr ""
+msgstr "Proiecte la care au contribuit"
msgid "UserProfile|Edit profile"
-msgstr ""
+msgstr "Editare profil"
msgid "UserProfile|Explore public groups to find projects to contribute to."
-msgstr ""
+msgstr "Explorați grupurile publice pentru a găsi proiecte la care să contribuiți."
msgid "UserProfile|Followers"
-msgstr ""
+msgstr "Urmăritori"
msgid "UserProfile|Following"
-msgstr ""
+msgstr "Urmăriți"
msgid "UserProfile|Groups"
-msgstr ""
+msgstr "Grupuri"
msgid "UserProfile|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 "UserProfile|Join or create a group to start contributing by commenting on issues or submitting merge requests!"
-msgstr ""
+msgstr "Alăturați-vă sau creați un grup pentru a începe să contribuiți prin comentarii la probleme sau prin trimiterea de merge request-uri!"
msgid "UserProfile|Most Recent Activity"
-msgstr ""
+msgstr "Cea mai recentă activitate"
msgid "UserProfile|No snippets found."
-msgstr "Nu au fost găsite fragmente de cod."
+msgstr "Nu s-a găsit niciun fragment de cod."
msgid "UserProfile|Overview"
-msgstr ""
+msgstr "Privire de ansamblu"
msgid "UserProfile|Personal projects"
-msgstr ""
+msgstr "Proiecte personale"
msgid "UserProfile|Pronounced as: %{pronunciation}"
msgstr "Pronunțat ca: %{pronunciation}"
msgid "UserProfile|Report abuse"
-msgstr ""
+msgstr "Raportați un abuz"
msgid "UserProfile|Retry"
-msgstr ""
+msgstr "Încercați din nou"
msgid "UserProfile|Snippets"
msgstr "Fragmente de cod"
@@ -41237,88 +41483,88 @@ msgid "UserProfile|Snippets in GitLab can either be private, internal, or public
msgstr "Fragmentele de cod din GitLab pot fi private, interne sau publice."
msgid "UserProfile|Star projects to track their progress and show your appreciation."
-msgstr ""
+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"
+msgstr "Proiecte marcate cu stele"
msgid "UserProfile|Subscribe"
-msgstr ""
+msgstr "Înscrieți-vă"
msgid "UserProfile|This user doesn't have any followers."
-msgstr ""
+msgstr "Acest utilizator nu are niciun urmăritor."
msgid "UserProfile|This user doesn't have any personal projects"
-msgstr ""
+msgstr "Acest utilizator nu are niciun proiect personal"
msgid "UserProfile|This user has a private profile"
-msgstr ""
+msgstr "Profilul acestui utilizator este privat"
msgid "UserProfile|This user hasn't contributed to any projects"
-msgstr ""
+msgstr "Acest utilizator nu a contribuit la niciun proiect"
msgid "UserProfile|This user hasn't starred any projects"
-msgstr "Acest utilizator nu a marcat niciun proiect ca favorit"
+msgstr "Acest utilizator nu a marcat niciun proiect cu stele"
msgid "UserProfile|This user is blocked"
-msgstr ""
+msgstr "Acest utilizator este blocat"
msgid "UserProfile|This user isn't following other users."
-msgstr ""
+msgstr "Acest utilizator nu urmărește alți utilizatori."
msgid "UserProfile|Unconfirmed user"
-msgstr ""
+msgstr "Utilizator neconfirmat"
msgid "UserProfile|View all"
-msgstr "Vizualizați toate"
+msgstr "Vizualizați totul"
msgid "UserProfile|View user in admin area"
-msgstr "Vizualizați utilizatorul în zona admin"
+msgstr "Vizualizați utilizatorul în Zona Admin"
msgid "UserProfile|You are not following other users."
-msgstr ""
+msgstr "Nu urmăriți alți utilizatori."
msgid "UserProfile|You can create a group for several dependent projects."
-msgstr ""
+msgstr "Puteți crea un grup pentru mai multe proiecte dependente."
msgid "UserProfile|You do not have any followers."
-msgstr ""
+msgstr "Nu aveți niciun urmăritor."
msgid "UserProfile|You haven't created any personal projects."
-msgstr ""
+msgstr "Nu ați creat niciun proiect personal."
msgid "UserProfile|You haven't created any snippets."
msgstr "Nu ați creat niciun fragment de cod."
msgid "UserProfile|Your projects can be available publicly, internally, or privately, at your choice."
-msgstr ""
+msgstr "Proiectele dvs. pot fi disponibile în mod public, intern sau privat, după cum doriți."
msgid "UserProfile|at"
-msgstr ""
+msgstr "la"
msgid "UserProfile|made a private contribution"
-msgstr ""
+msgstr "a adus o contribuție privată"
msgid "Username"
-msgstr "Nume utilizator"
+msgstr "Nume de utilizator"
msgid "Username (optional)"
-msgstr ""
+msgstr "Nume de utilizator (opțional)"
msgid "Username is already taken."
-msgstr ""
+msgstr "Numele de utilizator a fost deja folosit."
msgid "Username is available."
-msgstr ""
+msgstr "Numele de utilizator este disponibil."
msgid "Username or email"
-msgstr ""
+msgstr "Nume de utilizator sau e-mail"
msgid "Username:"
-msgstr ""
+msgstr "Nume de utilizator:"
msgid "Username: %{username}"
-msgstr ""
+msgstr "Nume de utilizator: %{username}"
msgid "Users"
msgstr ""
@@ -41327,9 +41573,9 @@ 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 ""
+msgstr "Utilizatorii pot lansa un mediu de dezvoltare dintr-o filă de browser GitLab atunci când este activată integrarea %{linkStart}Gitpod%{linkEnd}"
-msgid "Users can reactivate their account by signing in."
+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."
@@ -41524,11 +41770,8 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
-msgstr ""
+msgstr "Starea de verificare"
msgid "VerificationReminder|Pipeline failing? To keep GitLab spam and abuse free we ask that you verify your identity."
msgstr ""
@@ -41601,9 +41844,9 @@ msgstr "Consultați blame înainte de această modificare"
msgid "View chart"
msgid_plural "View charts"
-msgstr[0] "Vizualizați diagrama"
-msgstr[1] "Vizualizați diagramele"
-msgstr[2] "Vizualizați diagramele"
+msgstr[0] "Vizualizați graficul"
+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ă"
@@ -41648,7 +41891,7 @@ msgid "View full log"
msgstr "Vizualizați jurnalul complet"
msgid "View group in admin area"
-msgstr "Vizualizați grupul în zona admin"
+msgstr "Vizualizați grupul în Zona Admin"
msgid "View group labels"
msgstr "Vizualizarea etichetelor de grup"
@@ -41714,7 +41957,7 @@ msgid "View project"
msgstr "Vizualizați proiectul"
msgid "View project in admin area"
-msgstr "Vizualizați proiectul în zonă admin"
+msgstr "Vizualizați proiectul în Zona Admin"
msgid "View project labels"
msgstr "Vizualizați etichetele proiectului"
@@ -41828,142 +42071,142 @@ msgid "Vulnerability resolved in the default branch"
msgstr ""
msgid "VulnerabilityChart|%{formattedStartDate} to today"
-msgstr ""
+msgstr "%{formattedStartDate} până astăzi"
msgid "VulnerabilityChart|Severity"
-msgstr ""
+msgstr "Severitatea"
msgid "VulnerabilityManagement|%{statusStart}Confirmed%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Confirmat%{statusEnd} %{timeago} de %{user}"
msgid "VulnerabilityManagement|%{statusStart}Detected%{statusEnd} %{timeago} in pipeline %{pipelineLink}"
-msgstr ""
+msgstr "%{statusStart}Detectat%{statusEnd} %{timeago} în pipeline-ul %{pipelineLink}"
msgid "VulnerabilityManagement|%{statusStart}Dismissed%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Respins%{statusEnd} %{timeago} de %{user}"
msgid "VulnerabilityManagement|%{statusStart}Resolved%{statusEnd} %{timeago} by %{user}"
-msgstr ""
+msgstr "%{statusStart}Rezolvat%{statusEnd} %{timeago} de %{user}"
msgid "VulnerabilityManagement|(optional) Include the solution to the vulnerability if available."
-msgstr ""
+msgstr "(opțional) Includeți soluția la vulnerabilitate, dacă este disponibilă."
msgid "VulnerabilityManagement|A removed or remediated vulnerability"
-msgstr ""
+msgstr "O vulnerabilitate eliminată sau remediată"
msgid "VulnerabilityManagement|A true-positive and will fix"
-msgstr ""
+msgstr "Un adevărat pozitiv și se va repara"
msgid "VulnerabilityManagement|A verified true-positive vulnerability"
-msgstr ""
+msgstr "O vulnerabilitate adevărat-pozitivă verificată"
msgid "VulnerabilityManagement|Add vulnerability finding"
-msgstr ""
+msgstr "Adăugați detectarea vulnerabilității"
msgid "VulnerabilityManagement|An unverified non-confirmed finding"
-msgstr ""
+msgstr "O detectare neverificată neconfirmată"
msgid "VulnerabilityManagement|Change status"
-msgstr ""
+msgstr "Schimbați starea"
msgid "VulnerabilityManagement|Could not process %{issueReference}: %{errorMessage}."
msgstr "Nu s-a putut procesa %{issueReference}: %{errorMessage}."
msgid "VulnerabilityManagement|Create Jira issue"
-msgstr ""
+msgstr "Creați o problemă Jira"
msgid "VulnerabilityManagement|Enter a name"
-msgstr ""
+msgstr "Introduceți un nume"
msgid "VulnerabilityManagement|Enter the CVE or CWE code"
-msgstr ""
+msgstr "Introduceți codul CVE sau CWE"
msgid "VulnerabilityManagement|Enter the CVE or CWE identifier URL"
-msgstr ""
+msgstr "Introduceți URL-ul identificatorului CVE sau CWE"
msgid "VulnerabilityManagement|Fetching linked Jira issues"
-msgstr ""
+msgstr "Preluarea problemelor Jira asociate"
msgid "VulnerabilityManagement|Identifier code and URL are required fields"
-msgstr ""
+msgstr "Codul de identificare și URL-ul sunt câmpuri obligatorii"
msgid "VulnerabilityManagement|Manually add a vulnerability entry into the vulnerability report."
-msgstr ""
+msgstr "Adăugați manual o intrare de vulnerabilitate în raportul de vulnerabilitate."
msgid "VulnerabilityManagement|Name is a required field"
-msgstr ""
+msgstr "Numele este un câmp obligatoriu"
msgid "VulnerabilityManagement|Needs triage"
-msgstr ""
+msgstr "Necesită clasificare"
msgid "VulnerabilityManagement|Read more about related issues"
-msgstr ""
+msgstr "Citiți mai multe despre problemele asociate"
msgid "VulnerabilityManagement|Related Jira issues"
-msgstr ""
+msgstr "Probleme legate de Jira"
msgid "VulnerabilityManagement|Requires assessment"
-msgstr ""
+msgstr "Necesită evaluare"
msgid "VulnerabilityManagement|Select a method"
-msgstr ""
+msgstr "Selectați o metodă"
msgid "VulnerabilityManagement|Select a severity level"
-msgstr ""
+msgstr "Selectați un nivel de severitate."
msgid "VulnerabilityManagement|Select a status"
-msgstr ""
+msgstr "Selectați un status"
msgid "VulnerabilityManagement|Severity is a required field"
-msgstr ""
+msgstr "Severitatea este un câmp obligatoriu"
msgid "VulnerabilityManagement|Something went wrong while creating vulnerability"
-msgstr ""
+msgstr "Ceva nu a funcționat în timpul creării vulnerabilității"
msgid "VulnerabilityManagement|Something went wrong while trying to delete the comment. Please try again later."
-msgstr ""
+msgstr "A apărut o eroare în timpul încercării de a șterge comentariul. Vă rugăm să încercați din nou mai târziu."
msgid "VulnerabilityManagement|Something went wrong while trying to fetch related Jira issues. Please check the %{linkStart}Jira integration settings%{linkEnd} and try again."
-msgstr ""
+msgstr "A apărut o eroare în timpul încercării de a prelua problemele Jira aferente. Vă rugăm să verificați %{linkStart}Setările de integrare Jira%{linkEnd} și încercați din nou."
msgid "VulnerabilityManagement|Something went wrong while trying to refresh the vulnerability. Please try again later."
-msgstr ""
+msgstr "Ceva nu a mers bine în timpul încercării de reîmprospătare a vulnerabilității. Vă rugăm să încercați din nou mai târziu."
msgid "VulnerabilityManagement|Something went wrong while trying to retrieve the vulnerability history. Please try again later."
-msgstr ""
+msgstr "A apărut o eroare în timpul încercării de a prelua istoricul vulnerabilităților. Vă rugăm să încercați din nou mai târziu."
msgid "VulnerabilityManagement|Something went wrong while trying to save the comment. Please try again later."
-msgstr ""
+msgstr "A apărut o eroare în timpul încercării de salvare a comentariului. Vă rugăm să încercați din nou mai târziu."
msgid "VulnerabilityManagement|Something went wrong while trying to unlink the issue. Please try again later."
-msgstr ""
+msgstr "A apărut o eroare în timpul încercării de deconectare a problemei. Vă rugăm să încercați din nou mai târziu."
msgid "VulnerabilityManagement|Something went wrong, could not get user."
-msgstr ""
+msgstr "A apărut o eroare, utilizatorul nu a putut fi preluat."
msgid "VulnerabilityManagement|Something went wrong, could not update vulnerability state."
-msgstr ""
+msgstr "A apărut o eroare, nu s-a putut actualiza starea vulnerabilității."
msgid "VulnerabilityManagement|Status is a required field"
-msgstr ""
+msgstr "Statusul este un câmp obligatoriu"
msgid "VulnerabilityManagement|Submit vulnerability"
-msgstr ""
+msgstr "Trimiteți vulnerabilitatea"
msgid "VulnerabilityManagement|Summary, detailed description, steps to reproduce, etc."
-msgstr ""
+msgstr "Rezumat, descriere detaliată, etapele de reproducere etc."
msgid "VulnerabilityManagement|Verified as fixed or mitigated"
-msgstr ""
+msgstr "S-a verificat ca fiind rezolvată sau atenuată"
msgid "VulnerabilityManagement|Vulnerability name or type. Ex: Cross-site scripting"
-msgstr "Numele sau tipul vulnerabilității. De exemplu: Scripturi cross-site"
+msgstr "Numele sau tipul vulnerabilității. De exemplu: scripturi cross-site"
msgid "VulnerabilityManagement|Will not fix or a false-positive"
-msgstr ""
+msgstr "Nu se repară sau este un fals pozitiv"
msgid "VulnerabilityManagement|invalid issue link or ID"
-msgstr ""
+msgstr "link sau ID de problemă invalid"
msgid "VulnerabilityStatusTypes|All statuses"
msgstr ""
@@ -41972,7 +42215,7 @@ msgid "VulnerabilityStatusTypes|Confirmed"
msgstr ""
msgid "VulnerabilityStatusTypes|Dismissed"
-msgstr ""
+msgstr "Respins"
msgid "VulnerabilityStatusTypes|Needs triage"
msgstr ""
@@ -41981,166 +42224,166 @@ msgid "VulnerabilityStatusTypes|Resolved"
msgstr ""
msgid "Vulnerability|%{scannerName} (version %{scannerVersion})"
-msgstr ""
+msgstr "%{scannerName} (versiunea %{scannerVersion})"
msgid "Vulnerability|Activity"
-msgstr ""
+msgstr "Activitate"
msgid "Vulnerability|Actual Response"
-msgstr ""
+msgstr "Răspunsul efectiv"
msgid "Vulnerability|Actual received response is the one received when this fault was detected"
-msgstr ""
+msgstr "Răspunsul efectiv primit este cel primit în momentul în care a fost detectată această defecțiune."
msgid "Vulnerability|Add another identifier"
-msgstr ""
+msgstr "Adăugați un alt identificator"
msgid "Vulnerability|Additional Info"
-msgstr ""
+msgstr "Informații suplimentare"
msgid "Vulnerability|Bug Bounty"
-msgstr ""
+msgstr "Bug Bounty"
msgid "Vulnerability|CVSS v3"
-msgstr ""
+msgstr "CVSS v3"
msgid "Vulnerability|Class"
-msgstr ""
+msgstr "Clasa"
msgid "Vulnerability|Cluster"
-msgstr ""
+msgstr "Cluster"
msgid "Vulnerability|Code Review"
-msgstr ""
+msgstr "Revizuire de cod"
msgid "Vulnerability|Comments"
-msgstr ""
+msgstr "Comentarii"
msgid "Vulnerability|Crash address"
-msgstr ""
+msgstr "Adresa incidentului"
msgid "Vulnerability|Crash state"
-msgstr ""
+msgstr "Starea incidentului"
msgid "Vulnerability|Crash type"
-msgstr "Tipul de incident"
+msgstr "Tipul incidentului"
msgid "Vulnerability|Description"
-msgstr ""
+msgstr "Descriere"
msgid "Vulnerability|Details"
-msgstr ""
+msgstr "Detalii"
msgid "Vulnerability|Detected"
-msgstr ""
+msgstr "Detectată"
msgid "Vulnerability|Detection method"
-msgstr ""
+msgstr "Metoda de detecție"
msgid "Vulnerability|Download"
-msgstr ""
+msgstr "Descărcare"
msgid "Vulnerability|Enter the associated CVE or CWE entries for this vulnerability."
-msgstr ""
+msgstr "Introduceți intrările CVE sau CWE asociate pentru această vulnerabilitate."
msgid "Vulnerability|Evidence"
-msgstr ""
+msgstr "Dovezi"
msgid "Vulnerability|External Security Report"
-msgstr ""
+msgstr "Raport de securitate"
msgid "Vulnerability|False positive detected"
-msgstr ""
+msgstr "Fals pozitiv detectat"
msgid "Vulnerability|File"
-msgstr ""
+msgstr "Fișier"
msgid "Vulnerability|GitLab Security Report"
-msgstr ""
+msgstr "Raport de securitate GitLab"
msgid "Vulnerability|Identifier"
-msgstr ""
+msgstr "Identificator"
msgid "Vulnerability|Identifier URL"
-msgstr ""
+msgstr "URL-ul identificatorului"
msgid "Vulnerability|Identifier code"
-msgstr ""
+msgstr "Codul identificatorului"
msgid "Vulnerability|Identifiers"
-msgstr ""
+msgstr "Identificatori"
msgid "Vulnerability|Image"
-msgstr ""
+msgstr "Imagine"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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 "Aflați mai multe despre această vulnerabilitate și modalitatea cea mai bună de a o rezolva."
msgid "Vulnerability|Links"
-msgstr ""
+msgstr "Linkuri"
msgid "Vulnerability|Method"
-msgstr ""
+msgstr "Metoda"
msgid "Vulnerability|Namespace"
msgstr "Spațiu de nume"
msgid "Vulnerability|Project"
-msgstr ""
+msgstr "Proiect"
msgid "Vulnerability|Remove identifier row"
-msgstr ""
+msgstr "Înlăturați rândul identificatorului"
msgid "Vulnerability|Reproduction Assets"
-msgstr ""
+msgstr "Active de reproducere"
msgid "Vulnerability|Request"
-msgstr ""
+msgstr "Solicitare"
msgid "Vulnerability|Request/Response"
-msgstr ""
+msgstr "Solicitare/Răspuns"
msgid "Vulnerability|Scanner Provider"
-msgstr ""
+msgstr "Furnizorul scanerului"
msgid "Vulnerability|Security Audit"
-msgstr ""
+msgstr "Audit de securitate"
msgid "Vulnerability|Select a severity"
-msgstr ""
+msgstr "Alegeți o severitate"
msgid "Vulnerability|Set the status of the vulnerability finding based on the information available to you."
-msgstr ""
+msgstr "Setați statusul detectării vulnerabilității în funcție de informațiile de care dispuneți."
msgid "Vulnerability|Severity"
-msgstr ""
+msgstr "Severitate"
msgid "Vulnerability|Status"
-msgstr ""
+msgstr "Status"
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 "Scanerul a determinat că această vulnerabilitate este un fals pozitiv. Verificați evaluarea înainte de a-i schimba statutul. %{linkStart}Aflați mai multe despre detectarea falsului pozitiv.%{linkEnd}"
+msgstr "Scanerul a determinat că această vulnerabilitate este un fals pozitiv. Verificați evaluarea înainte de a-i schimba statutul. %{linkStart}Aflați mai multe despre detectarea falsurilor pozitive.%{linkEnd}"
msgid "Vulnerability|The unmodified response is the original response that had no mutations done to the request"
-msgstr ""
+msgstr "Răspunsul nemodificat este răspunsul original care nu a suferit nicio mutație la solicitare."
msgid "Vulnerability|Tool"
-msgstr ""
+msgstr "Instrument"
msgid "Vulnerability|Training"
-msgstr ""
+msgstr "Formare"
msgid "Vulnerability|Training not available for this vulnerability."
-msgstr ""
+msgstr "Formarea nu este disponibilă pentru această vulnerabilitate."
msgid "Vulnerability|Unmodified Response"
-msgstr ""
+msgstr "Răspuns nemodificat"
msgid "Vulnerability|View training"
-msgstr ""
+msgstr "Vizualizați formarea"
msgid "WARNING:"
msgstr "ATENÈšIE:"
@@ -42176,7 +42419,7 @@ msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr ""
msgid "Watch how"
-msgstr ""
+msgstr "Observați cum"
msgid "We are currently unable to fetch data for the pipeline header."
msgstr ""
@@ -42184,9 +42427,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42221,7 +42461,7 @@ 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 ""
+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 cloud-based mobile authenticator apps such as Authy, Duo Mobile, and LastPass. They can restore access if you lose your hardware device."
msgstr ""
@@ -42320,7 +42560,7 @@ msgid "Webhook Settings"
msgstr ""
msgid "Webhook events will be displayed here."
-msgstr ""
+msgstr "Evenimentele Webhook vor fi afișate aici."
msgid "Webhook:"
msgstr ""
@@ -42334,8 +42574,8 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr "Se adaugă un comentariu la o problemă confidențială."
-msgid "Webhooks|A comment is added to an issue."
-msgstr "Se adaugă un comentariu la o problemă."
+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 "O problemă confidențială este creată, actualizată, închisă sau redeschisă."
@@ -42479,7 +42719,7 @@ msgid "Webhooks|Wiki page events"
msgstr "Evenimente de pagină Wiki"
msgid "Website"
-msgstr ""
+msgstr "Site web"
msgid "Website:"
msgstr ""
@@ -42529,9 +42769,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr "Ce este Markdown?"
@@ -42541,9 +42778,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr "Ce este urmărirea timpului?"
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42571,17 +42805,14 @@ msgstr ""
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 personal access tokens may be revoked. Leave blank for no limit."
+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 paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
+msgstr "Atunci când se închid merge request-urile și commit-urile din ramura implicită, se închid și toate problemele la care fac referire."
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
@@ -42593,7 +42824,7 @@ msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{
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 ""
+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 ""
@@ -42625,7 +42856,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42827,7 +43058,7 @@ msgid "Wiki|Title"
msgstr ""
msgid "Wiki|View All Pages"
-msgstr ""
+msgstr "Vizualizați toate paginile"
msgid "Wiki|Wiki Pages"
msgstr ""
@@ -42851,7 +43082,7 @@ msgid "Withdraw Access Request"
msgstr ""
msgid "Won't fix / Accept risk"
-msgstr ""
+msgstr "Nu se repară / Acceptați riscul"
msgid "Work in progress (open and unassigned)"
msgstr ""
@@ -42859,34 +43090,46 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
-msgid "WorkItem|Convert to work item"
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
msgstr ""
+msgid "WorkItem|Convert to work item"
+msgstr "Convertiți în element de lucru"
+
msgid "WorkItem|Create work item"
+msgstr "Creați elementul de lucru"
+
+msgid "WorkItem|Delete work item"
msgstr ""
msgid "WorkItem|New Task"
-msgstr ""
+msgstr "Sarcină nouă"
msgid "WorkItem|Select type"
-msgstr ""
+msgstr "Selectați tipul"
msgid "WorkItem|Something went wrong when creating a work item. Please try again"
+msgstr "Ceva nu a mers bine la crearea unui element de lucru. Vă rugăm să încercați din nou"
+
+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 ""
+msgstr "Ceva nu a mers bine la preluarea elementului de lucru. Vă rugăm să încercați din nou."
msgid "WorkItem|Something went wrong when fetching work item types. Please try again"
-msgstr "Ceva a mers prost la preluarea tipurilor de articole de lucru. Vă rugăm să încercați din nou"
+msgstr "Ceva nu a mers bine la preluarea tipurilor de elemente de lucru. Vă rugăm să încercați din nou"
msgid "WorkItem|Something went wrong while updating the work item. Please try again."
-msgstr ""
+msgstr "Ceva nu a mers bine în timp ce se actualiza elementul de lucru. Vă rugăm să încercați din nou."
msgid "WorkItem|Type"
-msgstr "Tip"
+msgstr "Tipul"
msgid "WorkItem|Work Items"
+msgstr "Elemente de lucru"
+
+msgid "WorkItem|Work item deleted"
msgstr ""
msgid "Would you like to create a new branch?"
@@ -42941,7 +43184,7 @@ msgid "Yes, delete project"
msgstr ""
msgid "Yesterday"
-msgstr ""
+msgstr "Ieri"
msgid "You"
msgstr ""
@@ -42952,14 +43195,20 @@ msgstr "Aveți deja un todo în așteptare pentru această alertă"
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] ""
+msgstr[2] ""
+
msgid "You are about to delete this forked project containing:"
msgstr "Sunteți pe cale să ștergeți acest fork de proiect care conține:"
msgid "You are about to delete this project containing:"
-msgstr ""
+msgstr "Sunteți pe punctul de a șterge acest proiect care conține:"
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 ""
+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}."
@@ -42968,7 +43217,7 @@ 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 ""
+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 ""
@@ -43016,13 +43265,13 @@ msgid "You are not allowed to push into this branch. Create another branch or op
msgstr ""
msgid "You are not allowed to reject a user"
-msgstr ""
+msgstr "Nu aveți permisiunea să respingeți un utilizator"
msgid "You are not allowed to unlink your primary login account"
msgstr ""
msgid "You are not authorized to delete this site profile"
-msgstr ""
+msgstr "Nu sunteți autorizat să ștergeți profilul acestui site"
msgid "You are not authorized to perform this action"
msgstr ""
@@ -43031,10 +43280,10 @@ msgid "You are not authorized to run this manual job"
msgstr ""
msgid "You are not authorized to update this profile"
-msgstr ""
+msgstr "Nu sunteți autorizat să actualizați acest profil"
msgid "You are not authorized to update this scanner profile"
-msgstr ""
+msgstr "Nu sunteți autorizat să actualizați acest profil de scaner"
msgid "You are not authorized to upload metric images"
msgstr ""
@@ -43048,7 +43297,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43073,7 +43322,7 @@ msgid "You can also press ⌘-Enter"
msgstr ""
msgid "You can also star a label to make it a priority label."
-msgstr ""
+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 ""
@@ -43142,7 +43391,7 @@ msgid "You can enable project access token creation in %{link_start}group settin
msgstr ""
msgid "You can filter by 'days to merge' by clicking on the columns in the chart."
-msgstr ""
+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 ""
@@ -43175,7 +43424,7 @@ msgid "You can now close this window."
msgstr ""
msgid "You can now export your security dashboard to a CSV report."
-msgstr ""
+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 ""
@@ -43202,7 +43451,7 @@ 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 ""
+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 ""
@@ -43219,6 +43468,9 @@ 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 ""
@@ -43265,7 +43517,7 @@ msgid "You do not have any subscriptions yet"
msgstr ""
msgid "You do not have permission to access dora metrics."
-msgstr ""
+msgstr "Nu aveți permisiunea de a accesa metricile dora."
msgid "You do not have permission to approve a member"
msgstr ""
@@ -43292,7 +43544,7 @@ msgid "You don't have any WebAuthn devices registered yet."
msgstr ""
msgid "You don't have any active chat names."
-msgstr ""
+msgstr "Nu aveți niciun nume de chat activ."
msgid "You don't have any applications"
msgstr ""
@@ -43358,7 +43610,7 @@ 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 ""
+msgstr "Ați mai importat din acest proiect de %{numberOfPreviousImports} ori până acum. Fiecare nou import va crea probleme duplicat."
msgid "You have insufficient permissions to configure escalation policies for this project"
msgstr ""
@@ -43385,7 +43637,7 @@ msgid "You have insufficient permissions to remove this HTTP integration"
msgstr ""
msgid "You have insufficient permissions to set customer relations contacts for this issue"
-msgstr ""
+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 ""
@@ -43406,13 +43658,13 @@ msgid "You have no permissions"
msgstr ""
msgid "You have not added any approvers. Start by adding users or groups."
-msgstr ""
+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 ""
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 ""
+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ă."
msgid "You have successfully purchased a %{plan} plan subscription for %{seats}. You’ll receive a receipt via email."
msgstr ""
@@ -43433,16 +43685,16 @@ 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 ""
+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."
msgid "You must have maintainer access to force delete a lock"
-msgstr ""
+msgstr "Trebuie să aveți acces de întreținător pentru a forța ștergerea unui blocaj."
msgid "You must provide a valid current password"
-msgstr ""
+msgstr "Trebuie să furnizați o parolă actuală valabilă"
msgid "You must provide your current password in order to change it."
-msgstr ""
+msgstr "Trebuie să furnizați parola curentă pentru a o modifica."
msgid "You must sign in to search for specific projects."
msgstr ""
@@ -43499,10 +43751,10 @@ msgid "You will lose all changes you've made to this file. This action cannot be
msgstr ""
msgid "You will lose all uncommitted changes you've made in this project. This action cannot be undone."
-msgstr ""
+msgstr "Veți pierde toate modificările comise în acest proiect care nu au fost comise. Această acțiune nu poate fi anulată."
msgid "You will need to update your local repositories to point to the new location."
-msgstr ""
+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 ""
@@ -43547,10 +43799,10 @@ msgid "You're not allowed to %{tag_start}edit%{tag_end} files in this project di
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 ""
+msgstr "Nu aveți permisiunea de a face modificări în mod direct la acest proiect. A fost creat 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 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 ""
+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 ""
@@ -43580,7 +43832,7 @@ msgid "YouTube URL or ID"
msgstr "Adresa URL sau ID-ul 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 ""
+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."
msgid "Your %{group} membership will now expire in %{days}."
msgstr "Abonamentul dvs. %{group} va expira acum în %{days}."
@@ -43594,11 +43846,14 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr "%{spammable_entity_type} dvs. a fost recunoscut(ă) ca fiind spam. Vă rugăm să modificați conținutul sau să rezolvați reCAPTCHA pentru a continua."
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 ""
+msgstr "Abonamentul dvs. %{strong}%{plan_name}%{strong_close} expiră pe %{strong}%{expires_on}%{strong_close}. După această dată, nu mai puteți crea probleme sau merge request-uri, sau folosi multe alte caracteristici."
msgid "Your %{strong}%{plan_name}%{strong_close} subscription for %{strong}%{namespace_name}%{strong_close} will expire on %{strong}%{expires_on}%{strong_close}."
msgstr "Abonamentul dvs. %{strong}%{plan_name}%{strong_close} pentru %{strong}%{namespace_name}%{strong_close} va expira pe %{strong}%{expires_on}%{strong_close}."
@@ -43613,7 +43868,7 @@ msgid "Your CSV export of %{count} from project %{project_link} has been added t
msgstr "Exportul dvs. CSV de %{count} din proiectul %{project_link} a fost adăugat la acest e-mail ca atașament."
msgid "Your CSV export of %{written_count} from project %{project_name} (%{project_url}) has been added to this email as an attachment."
-msgstr "Exportul dvs. CSV de %{written_count} din proiectul %{project_name} (%{project_url}) a fost adăugat la acest e-mail ca atașament."
+msgstr ""
msgid "Your CSV import for project"
msgstr "Importul dvs. CSV pentru proiect"
@@ -43625,7 +43880,7 @@ msgid "Your GPG keys (%{count})"
msgstr "Cheile dvs. GPG (%{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 ""
+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ă!"
@@ -43715,16 +43970,16 @@ msgid "Your browser doesn't support WebAuthn. Please use a supported browser, e.
msgstr "Browserul dvs. nu acceptă WebAuthn. Vă rugăm să utilizați un browser acceptat, de exemplu Chrome (67+) sau Firefox (60+)."
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
-msgstr ""
+msgstr "Modificările dvs pot fi comise în %{branch_name} deoarece un merge request este deschis."
msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
-msgstr ""
+msgstr "Modificările dvs. au fost comise. Commit %{commitId} %{commitStats}"
msgid "Your changes have been saved"
msgstr "Schimbările dvs. au fost salvate"
msgid "Your changes have been successfully committed."
-msgstr ""
+msgstr "Modificările dvs. au fost comise cu succes."
msgid "Your comment could not be submitted because %{error}"
msgstr "Comentariul dvs. nu a putut fi trimis deoarece %{error}"
@@ -43754,7 +44009,7 @@ msgid "Your default notification email is used for account notifications if a %{
msgstr ""
msgid "Your deployment services will be broken, you will need to manually fix the services after renaming."
-msgstr ""
+msgstr "Serviciile dvs. de implementare vor fi întrerupte, va trebui să reparați manual serviciile după redenumire."
msgid "Your device is not compatible with GitLab. Please try another device"
msgstr "Dispozitivul dvs. nu este compatibil cu GitLab. Vă rugăm să încercați un alt dispozitiv"
@@ -43778,10 +44033,10 @@ msgid "Your instance has %{remaining_user_count} users remaining of the %{total_
msgstr ""
msgid "Your instance has exceeded your subscription's licensed user count."
-msgstr ""
+msgstr "Instanța dvs. a depășit numărul de utilizatori licențiați ai abonamentului."
msgid "Your instance is approaching its licensed user count"
-msgstr ""
+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."
@@ -43829,10 +44084,10 @@ msgid "Your personal access token has expired"
msgstr "Token-ul dvs. de acces personal a expirat"
msgid "Your personal access tokens will expire in %{days_to_expire} days or less"
-msgstr "Token-urile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin"
+msgstr "Tokenurile dvs. de acces personal vor expira în %{days_to_expire} zile sau mai puțin"
msgid "Your primary email is used for avatar detection. You can change it in your %{openingTag}profile settings%{closingTag}."
-msgstr "Adresa dvs. de e-mail principală este utilizată pentru detectarea avatarului. Îl puteți schimba %{openingTag}în setările profilulu%{closingTag}."
+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."
@@ -43847,7 +44102,7 @@ msgid "Your projects"
msgstr "Proiectele dvs."
msgid "Your public email will be displayed on your public profile."
-msgstr "E-mail-ul dvs. public va fi afișat pe profilul dvs. public."
+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 ""
@@ -43856,7 +44111,7 @@ msgid "Your request for access has been queued for review."
msgstr "Solicitarea dvs. de acces a fost pusă în așteptare pentru examinare."
msgid "Your request to join %{host} has been rejected."
-msgstr "Solicitarea dumneavoastră de a vă alătura %{host} a fost respinsă."
+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."
@@ -43893,9 +44148,9 @@ msgstr "Abonamentul dvs. a expirat. Pentru a-l reînnoi, exportați fișierul de
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] ""
+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 username is %{username}."
msgstr "Numele dvs. de utilizator este %{username}."
@@ -43924,15 +44179,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr "Dacă este diferit de URL-ul web."
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43949,10 +44204,10 @@ msgid "ZentaoIntegration|ZenTao issues"
msgstr ""
msgid "Zoom meeting added"
-msgstr ""
+msgstr "Reuniunea Zoom a fost adăugată"
msgid "Zoom meeting removed"
-msgstr ""
+msgstr "Reuniunea Zoom a fost înlăturată"
msgid "[No reason]"
msgstr "[Fără motiv]"
@@ -44026,9 +44281,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "approved by: "
-msgstr "aprobat de: "
-
msgid "archived"
msgstr "arhivat"
@@ -44083,6 +44335,15 @@ msgstr ""
msgid "can contain only lowercase letters, digits, and '_'."
msgstr "poate conține doar litere mici, cifre și '_'."
+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 "poate fi schimbat doar de un administrator de grup."
@@ -44102,7 +44363,7 @@ msgid "can't include: %{invalid_storages}"
msgstr "nu poate include: %{invalid_storages}"
msgid "can't reference a branch that does not exist"
-msgstr ""
+msgstr "nu poate face referire la o ramură care nu există"
msgid "cannot be a date in the past"
msgstr "nu poate fi o dată în trecut"
@@ -44156,28 +44417,28 @@ msgstr[1] "modificări"
msgstr[2] "de modificări"
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
-msgstr ""
+msgstr "%{danger_start}%{degradedNum} degradată(e)%{danger_end}, %{same_start}%{sameNum} la fel%{same_end} și %{success_start}%{improvedNum} îmbunătățită(e)%{success_end}"
msgid "ciReport|%{degradedNum} degraded"
-msgstr "%{degradedNum} degradat"
+msgstr "%{degradedNum} degradată(e)"
msgid "ciReport|%{improvedNum} improved"
-msgstr "%{improvedNum} îmbunătățit"
+msgstr "%{improvedNum} îmbunătățită(e)"
msgid "ciReport|%{linkStartTag}Learn more about API Fuzzing%{linkEndTag}"
-msgstr "%{linkStartTag}Aflați mai multe despre Fuzzing API%{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre Fuzzingul API%{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
msgstr "%{linkStartTag}Aflați mai multe despre Scanarea containerelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Coverage Fuzzing %{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag}Aflați mai multe despre Fuzzing prin Coverage%{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
msgstr "%{linkStartTag}Aflați mai multe despre DAST %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
-msgstr "%{linkStartTag}Aflați mai multe despre scanarea dependențelor %{linkEndTag}"
+msgstr "%{linkStartTag}Aflați mai multe despre Scanarea dependențelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
msgstr "%{linkStartTag}Aflați mai multe despre SAST %{linkEndTag}"
@@ -44186,10 +44447,10 @@ msgid "ciReport|%{linkStartTag}Learn more about Secret Detection %{linkEndTag}"
msgstr "%{linkStartTag}Aflați mai multe despre Detectarea secretelor %{linkEndTag}"
msgid "ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}"
-msgstr ""
+msgstr "%{linkStartTag}Aflați mai multe despre rapoartele codequality %{linkEndTag}"
msgid "ciReport|%{prefix} %{strong_start}%{score}%{strong_end} %{delta} %{deltaPercent} in %{path}"
-msgstr ""
+msgstr "%{prefix} %{strong_start}%{score}%{strong_end} %{delta} %{deltaPercent} în %{path}"
msgid "ciReport|%{remainingPackagesCount} more"
msgstr "%{remainingPackagesCount} mai mult"
@@ -44198,52 +44459,55 @@ msgid "ciReport|%{reportType} is loading"
msgstr "%{reportType} se încarcă"
msgid "ciReport|%{reportType}: Loading resulted in an error"
-msgstr ""
+msgstr "%{reportType}: Încărcarea a dus la o eroare"
msgid "ciReport|%{sameNum} same"
-msgstr "%{sameNum} fel"
+msgstr "%{sameNum} la fel"
msgid "ciReport|: Loading resulted in an error"
msgstr ": Încărcarea a dus la o eroare"
msgid "ciReport|API Fuzzing"
-msgstr "Fuzzing API"
+msgstr "Fuzzing de API"
msgid "ciReport|API fuzzing"
-msgstr "Fuzzing API"
+msgstr "Fuzzing de API"
msgid "ciReport|All projects"
msgstr "Toate proiectele"
msgid "ciReport|All severities"
-msgstr "Toate severitățile"
+msgstr "Toate nivelele de severitate"
msgid "ciReport|All tools"
msgstr "Toate instrumentele"
+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 "Aplică automat patch-ul într-o ramură nouă"
msgid "ciReport|Base pipeline codequality artifact not found"
-msgstr ""
+msgstr "Artefactul codequality al pipeline-ului de bază nu a fost găsit"
msgid "ciReport|Browser Performance"
-msgstr ""
+msgstr "Performanța browserului"
msgid "ciReport|Browser performance test metrics results are being parsed"
-msgstr ""
+msgstr "Rezultatele metricilor de testare a performanței browserului sunt analizate"
msgid "ciReport|Browser performance test metrics: "
-msgstr ""
+msgstr "Metrici de testare a performanței browserului: "
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] ""
-msgstr[2] ""
+msgstr[0] "Metricile de testare a performanței browserului: %{strong_start}%{changesFound}%{strong_end} modificare"
+msgstr[1] "Metricile de testare a performanței browserului: %{strong_start}%{changesFound}%{strong_end} modificări"
+msgstr[2] "Metricile de testare a performanței browserului: %{strong_start}%{changesFound}%{strong_end} de modificări"
msgid "ciReport|Browser performance test metrics: No changes"
-msgstr ""
+msgstr "Metrici de testare a performanței browserului: Nicio modificare"
msgid "ciReport|Checks"
msgstr "Verificări"
@@ -44252,22 +44516,22 @@ msgid "ciReport|Cluster Image Scanning"
msgstr "Scanarea imaginii clusterului"
msgid "ciReport|Code Quality"
-msgstr ""
+msgstr "Code Quality"
msgid "ciReport|Code Quality failed loading results"
-msgstr ""
+msgstr "Code Quality nu a reușit să încarce rezultatele"
msgid "ciReport|Code Quality test metrics results are being parsed"
-msgstr ""
+msgstr "Rezultatele metricilor de testare a Code Quality sunt analizate"
msgid "ciReport|Code quality degraded"
-msgstr ""
+msgstr "Calitatea codului s-a degradat"
msgid "ciReport|Code quality improved"
-msgstr ""
+msgstr "Calitatea codului s-a îmbunătățit"
msgid "ciReport|Code quality scanning detected %{issueCount} changes in merged results"
-msgstr ""
+msgstr "Scanarea calității codului a detectat %{issueCount} modificări în rezultatele îmbinate"
msgid "ciReport|Container Scanning"
msgstr "Scanarea containerelor"
@@ -44279,22 +44543,22 @@ msgid "ciReport|Container scanning detects known vulnerabilities in your docker
msgstr "Scanarea containerelor detectează vulnerabilitățile cunoscute în imaginile dvs. docker."
msgid "ciReport|Could not dismiss vulnerability because the associated pipeline no longer exists. Refresh the page and try again."
-msgstr "Nu s-a putut respinge vulnerabilitatea deoarece conducta asociată nu mai există. Reîmprospătați pagina și încercați din nou."
+msgstr "Nu se poate respinge vulnerabilitatea deoarece pipeline-ul asociat nu mai există. Reîmprospătați pagina și încercați din nou."
msgid "ciReport|Coverage Fuzzing"
-msgstr ""
+msgstr "Fuzzing prin coverage"
msgid "ciReport|Coverage fuzzing"
-msgstr ""
+msgstr "Fuzzing prin coverage"
msgid "ciReport|Create Jira issue"
msgstr "Creați problema Jira"
msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually."
-msgstr ""
+msgstr "Creați un merge request pentru a implementa această soluție sau descărcați și aplicați manual patch-ul."
msgid "ciReport|Create issue"
-msgstr ""
+msgstr "Creați problema"
msgid "ciReport|DAST"
msgstr "DAST"
@@ -44309,91 +44573,91 @@ msgid "ciReport|Dependency scanning"
msgstr "Scanarea dependențelor"
msgid "ciReport|Download patch to resolve"
-msgstr ""
+msgstr "Descărcați patch-ul pentru a rezolva"
msgid "ciReport|Download the patch to apply it manually"
-msgstr ""
+msgstr "Descărcați patch-ul pentru a-l aplica manual"
msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
msgstr "Testarea dinamică a securității aplicațiilor (DAST) detectează vulnerabilitățile cunoscute din aplicația dvs. web."
msgid "ciReport|Failed to load %{reportName} report"
-msgstr ""
+msgstr "Nu s-a reușit încărcarea raportului %{reportName}."
msgid "ciReport|Failed to load Code Quality report"
-msgstr ""
+msgstr "Nu s-a reușit încărcarea raportului Code Quality"
msgid "ciReport|Fixed"
-msgstr ""
+msgstr "Corectat"
msgid "ciReport|Fixed:"
-msgstr ""
+msgstr "Corectat:"
msgid "ciReport|Found %{issuesWithCount}"
-msgstr ""
+msgstr "S-au găsit %{issuesWithCount}"
msgid "ciReport|IaC Scanning"
-msgstr ""
+msgstr "Scanarea IaC"
msgid "ciReport|Investigate this vulnerability by creating an issue"
-msgstr ""
+msgstr "Investigați această vulnerabilitate prin crearea unei probleme"
msgid "ciReport|License Compliance"
-msgstr ""
+msgstr "Conformitatea licenței"
msgid "ciReport|License Compliance failed loading results"
-msgstr ""
+msgstr "Conformitatea licenței nu a reușit să încarce rezultatele"
msgid "ciReport|License Compliance test metrics results are being parsed"
-msgstr ""
+msgstr "Rezultatele metricilor de testare a Conformității licenței sunt analizate"
msgid "ciReport|Load Performance"
-msgstr ""
+msgstr "Performanța de încărcare"
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[0] "Metricile testului de performanță de încărcare au detectat %{strong_start}%{changesFound}%{strong_end} modificare"
+msgstr[1] "Metricile testului de performanță de încărcare au detectat %{strong_start}%{changesFound}%{strong_end} modificări"
+msgstr[2] "Metricile testului de performanță de încărcare au detectat %{strong_start}%{changesFound}%{strong_end} de modificări"
msgid "ciReport|Load performance test metrics results are being parsed"
-msgstr ""
+msgstr "Rezultatele metricilor testului de performanță de încărcare sunt analizate"
msgid "ciReport|Load performance test metrics: "
-msgstr ""
+msgstr "Metricile testului de performanță de încărcare: "
msgid "ciReport|Load performance test metrics: No changes"
-msgstr ""
+msgstr "Metricile testului de performanță de încărcare: Nicio modificare"
msgid "ciReport|Loading %{reportName} report"
-msgstr "Încarcă raportul %{reportName}"
+msgstr "Se încarcă raportul %{reportName}"
msgid "ciReport|Loading Code Quality report"
-msgstr ""
+msgstr "Încărcarea raportului Code Quality"
msgid "ciReport|Manage licenses"
msgstr "Gestionați licențele"
msgid "ciReport|Manually Added"
-msgstr ""
+msgstr "Adăugat manual"
msgid "ciReport|New"
msgstr "Nou"
msgid "ciReport|No changes to Code Quality."
-msgstr ""
+msgstr "Nicio modificare în Code Quality."
msgid "ciReport|No changes to code quality"
-msgstr ""
+msgstr "Nicio modificare a calității codului"
msgid "ciReport|No code quality issues found"
-msgstr "Nu s-au găsit probleme cu calitatea codului"
+msgstr "Nu s-au găsit probleme de calitate a codului"
msgid "ciReport|RPS"
msgstr "RPS"
msgid "ciReport|Resolve with merge request"
-msgstr ""
+msgstr "Rezolvați cu un merge request"
msgid "ciReport|SAST"
msgstr "SAST"
@@ -44411,10 +44675,10 @@ msgid "ciReport|Security scanning"
msgstr "Scanare de securitate"
msgid "ciReport|Security scanning failed loading any results"
-msgstr ""
+msgstr "Scanarea de securitate nu a reușit să încarce niciun rezultat"
msgid "ciReport|Showing %{fetchedItems} of %{totalItems} items"
-msgstr ""
+msgstr "Se afișează %{fetchedItems} din %{totalItems} elemente"
msgid "ciReport|Solution"
msgstr "Soluție"
@@ -44429,28 +44693,28 @@ msgid "ciReport|TTFB P95"
msgstr "TTFB P95"
msgid "ciReport|There was an error creating the issue. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la crearea problemei. Vă rugăm să încercați din nou."
msgid "ciReport|There was an error creating the merge request. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la crearea merge request-ului. Vă rugăm să încercați din nou."
msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
-msgstr ""
+msgstr "A apărut o eroare de respingere a vulnerabilității. Vă rugăm să încercați din nou."
msgid "ciReport|There was an error fetching the codequality report."
-msgstr ""
+msgstr "A apărut o eroare la preluarea raportului codequality."
msgid "ciReport|There was an error reverting the dismissal. Please try again."
-msgstr ""
+msgstr "A apărut o eroare la anularea respingerii. Vă rugăm să încercați din nou."
msgid "ciReport|This report contains all Code Quality issues in the source branch."
-msgstr ""
+msgstr "Acest raport conține toate problemele de Code Quality din ramura sursă."
msgid "ciReport|Used by %{packagesString}"
msgid_plural "ciReport|Used by %{packagesString}, and %{lastPackage}"
msgstr[0] "Utilizat de %{packagesString}"
-msgstr[1] "Utilizat de %{packagesString}, și %{lastPackage}"
-msgstr[2] "Utilizat de %{packagesString}, și %{lastPackage}"
+msgstr[1] "Utilizat de %{packagesString} și %{lastPackage}"
+msgstr[2] "Utilizat de %{packagesString} și %{lastPackage}"
msgid "ciReport|View full report"
msgstr "Vizualizați raportul complet"
@@ -44459,7 +44723,7 @@ msgid "ciReport|is loading"
msgstr "se încarcă"
msgid "ciReport|is loading, errors when loading results"
-msgstr ""
+msgstr "se încarcă, erori la încărcarea rezultatelor"
msgid "closed"
msgstr "închis"
@@ -44480,7 +44744,7 @@ msgid "commit %{commit_id}"
msgstr "commit %{commit_id}"
msgid "committed"
-msgstr ""
+msgstr "comis"
msgid "compliance violation has already been recorded"
msgstr ""
@@ -44516,13 +44780,13 @@ msgid "created %{issuable_created} by %{author}"
msgstr ""
msgid "created %{timeAgoString} by %{email} via %{user}"
-msgstr "creat %{timeAgoString} de %{email} prin %{user}"
+msgstr "creat(ă) %{timeAgoString} prin %{email} via %{user}"
msgid "created %{timeAgo}"
-msgstr "creat %{timeAgo}"
+msgstr "creat(ă) %{timeAgo}"
msgid "created %{timeAgo} by %{author}"
-msgstr ""
+msgstr "creat(ă) %{timeAgo} de %{author}"
msgid "created by"
msgstr "creat de"
@@ -44540,7 +44804,7 @@ msgid "day"
msgid_plural "days"
msgstr[0] "zi"
msgstr[1] "zile"
-msgstr[2] "zilele"
+msgstr[2] "zile"
msgid "days"
msgstr "zile"
@@ -44577,9 +44841,9 @@ msgstr "descărcați-l"
msgid "draft"
msgid_plural "drafts"
-msgstr[0] "schiță"
-msgstr[1] "schițe"
-msgstr[2] "de schițe"
+msgstr[0] "draft"
+msgstr[1] "drafturi"
+msgstr[2] "de drafturi"
msgid "e.g. %{token}"
msgstr "ex. %{token}"
@@ -44588,13 +44852,13 @@ msgid "element is not a hierarchy"
msgstr "elementul nu este o ierarhie"
msgid "eligible users"
-msgstr ""
+msgstr "utilizatori eligibili"
msgid "email '%{email}' is not a verified email."
msgstr "e-mail-ul '%{email}' nu este un e-mail verificat."
msgid "email address settings"
-msgstr ""
+msgstr "setările adresei de e-mail"
msgid "enabled"
msgstr "activat"
@@ -44648,10 +44912,10 @@ msgid "failed"
msgstr "eșuat"
msgid "failed to dismiss associated finding(id=%{finding_id}): %{message}"
-msgstr ""
+msgstr "nu a putut fi respinsă detectarea asociată (id=%{finding_id}): %{message}"
msgid "failed to dismiss finding: %{message}"
-msgstr ""
+msgstr "nu a putut fi respinsă detectarea: %{message}"
msgid "failed to revert associated finding(id=%{finding_id}) to detected"
msgstr ""
@@ -44780,7 +45044,7 @@ msgstr[1] "instanțe finalizate"
msgstr[2] "instanțe finalizate"
msgid "invalid milestone state `%{state}`"
-msgstr ""
+msgstr "stare invalidă a obiectivului `%{state}`"
msgid "is"
msgstr "este"
@@ -44937,9 +45201,9 @@ msgstr ""
msgid "member"
msgid_plural "members"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "membru"
+msgstr[1] "membri"
+msgstr[2] "de membri"
msgid "merge request"
msgid_plural "merge requests"
@@ -44947,7 +45211,7 @@ msgstr[0] "merge request"
msgstr[1] "merge request-uri"
msgstr[2] "merge request-urile"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44959,6 +45223,12 @@ msgstr "lipsește"
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 "1 merge commit"
@@ -44968,6 +45238,12 @@ 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 "Acest merge request nu conține modificări."
@@ -44975,7 +45251,7 @@ msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your proj
msgstr ""
msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
-msgstr ""
+msgstr "%{boldHeaderStart}Se pare că nu există niciun pipeline aici.%{boldHeaderEnd}"
msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
msgstr "%{linkStart}Configurați acum%{linkEnd} pentru a vă analiza codul sursă pentru vulnerabilitățile de securitate cunoscute."
@@ -44987,16 +45263,16 @@ msgid "mrWidget|%{mergeError}. Try again."
msgstr "%{mergeError}. Încercați din nou."
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată %{emphasisStart} a scăzut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
+msgstr "Utilizarea %{metricsLinkStart} memoriei %{metricsLinkEnd} %{emphasisStart} a scăzut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} increased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
-msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată %{emphasisStart} a crescut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
+msgstr "Utilizarea %{metricsLinkStart} memoriei %{metricsLinkEnd} %{emphasisStart} a crescut %{emphasisEnd} de la %{memoryFrom}MB la %{memoryTo}MB"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
-msgstr "%{metricsLinkStart} Memoria %{metricsLinkEnd} utilizată este %{emphasisStart} neschimbată %{emphasisEnd} la %{memoryFrom}MB"
+msgstr "Utilizarea %{metricsLinkStart} memoriei %{metricsLinkEnd} este %{emphasisStart} neschimbată %{emphasisEnd} la %{memoryFrom}MB"
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 ""
+msgstr "Un merge train este o listă de merge request-uri care așteaptă să fie îmbinate în ramura țintă. Modificările din fiecare merge request sunt combinate cu modificările din merge request-urile anterioare și sunt testate înainte de îmbinare."
msgid "mrWidget|A new merge train has started and this merge request is the first of the queue."
msgstr "Un nou merge train a început și acest merge request este primul în coada de așteptare."
@@ -45005,16 +45281,16 @@ msgid "mrWidget|Added to the merge train by %{merge_author}"
msgstr "Adăugat la merge train de %{merge_author}"
msgid "mrWidget|Added to the merge train. There are %{mergeTrainPosition} merge requests waiting to be merged"
-msgstr ""
+msgstr "Adăugat 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 apărut o eroare la eliminarea aprobării."
+msgstr "A survenit o eroare în timpul înlăturării aprobării dvs."
msgid "mrWidget|An error occurred while retrieving approval data for this merge request."
-msgstr ""
+msgstr "A survenit o eroare în timpul recuperării datelor de aprobare pentru acest merge request."
msgid "mrWidget|An error occurred while submitting your approval."
-msgstr "A apărut o eroare la trimiterea aprobării."
+msgstr "A survenit o eroare la transmiterea aprobării dvs."
msgid "mrWidget|Approval is optional"
msgstr "Aprobarea este opțională"
@@ -45026,31 +45302,28 @@ msgid "mrWidget|Approve"
msgstr "Aprobați"
msgid "mrWidget|Approve additionally"
-msgstr ""
+msgstr "Aprobați suplimentar"
msgid "mrWidget|Approved by"
msgstr "Aprobat de"
msgid "mrWidget|Approved by you"
-msgstr ""
+msgstr "Aprobat de dvs."
msgid "mrWidget|Approved by you and others"
-msgstr ""
+msgstr "Aprobat de dvs. și de alții"
msgid "mrWidget|Assign yourself to these issues"
-msgstr ""
+msgstr "Atribuiți-vă aceste probleme"
msgid "mrWidget|Assign yourself to this issue"
-msgstr ""
+msgstr "Atribuiți-vă această problemă"
msgid "mrWidget|Cancel auto-merge"
msgstr "Anulați auto-îmbinarea"
-msgid "mrWidget|Check out branch"
-msgstr "Verificați ramura"
-
msgid "mrWidget|Checking if merge request can be merged…"
-msgstr ""
+msgstr "Se verifică dacă merge request-ul poate fi îmbinat..."
msgid "mrWidget|Cherry-pick"
msgstr "Cherry-pick"
@@ -45066,9 +45339,9 @@ msgstr "ÃŽnchis de"
msgid "mrWidget|Closes issue"
msgid_plural "mrWidget|Closes issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "ÃŽnchide problema"
+msgstr[1] "ÃŽnchide problemele"
+msgstr[2] "ÃŽnchide problemele"
msgid "mrWidget|Create issue to resolve all threads"
msgstr "Creați o problemă pentru a rezolva toate subiectele"
@@ -45077,124 +45350,121 @@ msgid "mrWidget|Delete source branch"
msgstr "Ștergeți ramura sursă"
msgid "mrWidget|Deletes the source branch"
-msgstr ""
+msgstr "Șterge ramura sursă"
msgid "mrWidget|Deployment statistics are not available currently"
-msgstr ""
+msgstr "Statisticile de implementare nu sunt disponibile în prezent"
msgid "mrWidget|Did not close"
-msgstr ""
+msgstr "Nu a închis"
msgid "mrWidget|Dismiss"
-msgstr ""
+msgstr "Respingeți"
msgid "mrWidget|Does not delete the source branch"
-msgstr ""
-
-msgid "mrWidget|Email patches"
-msgstr ""
+msgstr "Nu șterge ramura sursă"
msgid "mrWidget|Failed to load deployment statistics"
-msgstr ""
+msgstr "Încărcarea statisticilor de implementare a eșuat"
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 ""
+msgstr "GitLab %{linkStart}CI/CD vă poate construi, testa și implementa automat aplicația.%{linkEnd} Nu durează decât câteva minute pentru a demara, iar noi vă putem ajuta să creați un fișier de configurare a pipeline-ului."
msgid "mrWidget|Hide %{widget} details"
-msgstr ""
+msgstr "Ascundeți detalii despre %{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 "Dacă ramura %{type} există în repozitoriul dvs. local, puteți îmbina manual acest merge request folosind linia de comandă."
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 ""
+msgstr "În cazul în care ultimul pipeline a rulat în proiectul fork, acesta poate fi inexact. Înainte de îmbinare, vă sfătuim să rulați un pipeline în acest proiect."
msgid "mrWidget|Jump to first unresolved thread"
msgstr "Săriți la primul subiect nerezolvat"
msgid "mrWidget|Learn more"
-msgstr ""
+msgstr "Aflați mai multe"
msgid "mrWidget|Loading deployment statistics"
-msgstr ""
+msgstr "Se încarcă statisticile de implementare"
msgid "mrWidget|Mark as ready"
msgstr "Marcați ca fiind gata"
msgid "mrWidget|Members who can merge are allowed to add commits."
-msgstr ""
+msgstr "Membrii care pot îmbina au permisiunea de a adăuga commit-uri."
msgid "mrWidget|Mentions issue"
msgid_plural "mrWidget|Mentions issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "Problemă menționată"
+msgstr[1] "Probleme menționate"
+msgstr[2] "Probleme menționate"
msgid "mrWidget|Merge"
-msgstr ""
+msgstr "ÃŽmbinare"
msgid "mrWidget|Merge blocked: all threads must be resolved."
msgstr "Îmbinare blocată: toate subiectele trebuie să fie rezolvate."
msgid "mrWidget|Merge blocked: denied licenses must be removed."
-msgstr ""
+msgstr "Îmbinare blocată: licențele refuzate trebuie să fie înlăturate."
msgid "mrWidget|Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally."
msgstr "Îmbinare blocată: nu este posibilă o îmbinare fast-forward. Pentru a îmbina această solicitare, mai întâi faceți un rebase local."
msgid "mrWidget|Merge blocked: merge conflicts must be resolved."
-msgstr ""
+msgstr "Îmbinare blocată: conflictele de îmbinare trebuie să fie rezolvate."
msgid "mrWidget|Merge blocked: pipeline must succeed. It's waiting for a manual action to continue."
-msgstr ""
+msgstr "Îmbinare blocată: pipeline-ul trebuie să reușească. Se așteaptă o acțiune manuală pentru a continua."
msgid "mrWidget|Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or %{linkStart}learn about other solutions.%{linkEnd}"
-msgstr ""
+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 ""
+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 ""
+msgstr "Îmbinare blocată: puteți îmbina numai după ce elementele de mai sus sunt rezolvate."
msgid "mrWidget|Merge failed."
-msgstr ""
+msgstr "Îmbinarea nu a reușit."
msgid "mrWidget|Merge unavailable: merge requests are read-only on archived projects."
-msgstr ""
+msgstr "Îmbinare indisponibilă: merge request-urile sunt numai în citire pe proiectele arhivate."
msgid "mrWidget|Merged by"
-msgstr ""
+msgstr "ÃŽmbinat de"
msgid "mrWidget|Merges changes into"
-msgstr ""
+msgstr "Îmbină modificările în"
msgid "mrWidget|Merging! Changes are being shipped…"
-msgstr ""
+msgstr "Îmbinare în curs! Modificările sunt în curs de expediere..."
msgid "mrWidget|Merging! Changes will land soon…"
-msgstr ""
+msgstr "Îmbinare în curs! Modificările vor ateriza în curând..."
msgid "mrWidget|Merging! Drum roll, please…"
-msgstr ""
+msgstr "Îmbinare în curs! Tobele, vă rugăm..."
msgid "mrWidget|Merging! Everything's good…"
-msgstr ""
+msgstr "Îmbinare în curs! Totul e în regulă..."
msgid "mrWidget|Merging! Lift-off in 5… 4… 3…"
-msgstr ""
+msgstr "Îmbinare în curs! Decolarea în 5... 4... 3..."
msgid "mrWidget|Merging! Take a deep breath and relax…"
-msgstr ""
+msgstr "Îmbinare în curs! Respirați adânc și relaxați-vă..."
msgid "mrWidget|Merging! The changes are leaving the station…"
-msgstr ""
+msgstr "Îmbinare în curs! Schimbările părăsesc gara..."
msgid "mrWidget|Merging! This is going to be great…"
-msgstr ""
+msgstr "Îmbinare în curs! Acest lucru va fi grozav..."
msgid "mrWidget|Merging! We're almost there…"
-msgstr ""
+msgstr "Îmbinare în curs! Suntem aproape acolo..."
msgid "mrWidget|More information"
msgstr "Mai multe informații"
@@ -45205,41 +45475,38 @@ msgstr "Deschideți în Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Deschideți în Web IDE"
-msgid "mrWidget|Plain diff"
-msgstr "Plain diff"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
-msgstr ""
+msgstr "Vă rugăm să o restaurați sau să folosiți o altă ramură %{type}."
msgid "mrWidget|Ready to be merged automatically. Ask someone with write access to this repository to merge this request"
-msgstr ""
+msgstr "Gata pentru îmbinarea automată. Cereți cuiva cu acces în scriere la acest repozitoriu să îmbine această solicitare"
msgid "mrWidget|Refresh"
-msgstr ""
+msgstr "Reîmprospătați"
msgid "mrWidget|Refresh now"
-msgstr ""
+msgstr "Reîmprospătați acum"
msgid "mrWidget|Refreshing now"
-msgstr ""
+msgstr "Reîmprospătare în curs"
msgid "mrWidget|Remove from merge train"
msgstr "Înlăturați din merge train"
msgid "mrWidget|Request to merge"
-msgstr ""
+msgstr "Solicitare de îmbinare"
msgid "mrWidget|Resolve conflicts"
msgstr "Rezolvați conflictele"
msgid "mrWidget|Resolve locally"
-msgstr ""
+msgstr "Rezolvați local"
msgid "mrWidget|Revert"
-msgstr ""
+msgstr "Reveniți"
msgid "mrWidget|Revert this merge request in a new merge request"
-msgstr ""
+msgstr "Reveniți acest merge request într-un nou merge request"
msgid "mrWidget|Revoke approval"
msgstr "Revocați aprobarea"
@@ -45248,61 +45515,61 @@ msgid "mrWidget|SAST and Secret Detection is not enabled."
msgstr "SAST și Detecția secretelor nu sunt activate."
msgid "mrWidget|Set by %{merge_author} to be added to the merge train when the pipeline succeeds"
-msgstr "Setat de %{merge_author} pentru a fi adăugat merge train-ului automat când conducta reușește"
+msgstr "Setat de %{merge_author} pentru a fi adăugat la merge train atunci când pipeline-ul reușește"
msgid "mrWidget|Set by %{merge_author} to be merged automatically when the pipeline succeeds"
-msgstr "Setat de %{merge_author} pentru a fi îmbinat automat când pipeline-ul reușește"
+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"
msgid "mrWidget|Show %{widget} details"
-msgstr ""
+msgstr "Afișați detalii despre %{widget}"
msgid "mrWidget|The %{type} branch %{codeStart}%{name}%{codeEnd} does not exist."
-msgstr ""
+msgstr "Ramura %{type} %{codeStart}%{name}%{codeEnd} nu există."
msgid "mrWidget|The changes were merged into"
-msgstr ""
+msgstr "Schimbările au fost îmbinate în"
msgid "mrWidget|The changes were not merged into"
-msgstr ""
+msgstr "Schimbările nu au fost îmbinate în"
msgid "mrWidget|The source branch has been deleted"
msgstr "Ramura sursă a fost ștearsă"
msgid "mrWidget|The source branch is %{link} the target branch"
-msgstr "Ramura sursă este %{link} ramura țintă"
+msgstr "Ramura sursă este cu %{link} ramurii țintă"
msgid "mrWidget|The source branch is being deleted"
-msgstr "Ramura sursă este ștearsă"
+msgstr "Ramura sursă este în curs de ștergere"
msgid "mrWidget|This merge request failed to be merged automatically"
msgstr "Acest merge request nu a reușit să fie îmbinat automat"
msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated."
-msgstr ""
+msgstr "Pentru a aproba acest merge request, vă rugăm să vă introduceți parola. Acest proiect necesită ca toate aprobările să fie autentificate."
msgid "mrWidget|To change these default messages, edit the templates for both the merge and squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Pentru a modifica aceste mesaje implicite, editați atât șabloanele mesajelor commit-urilor de îmbinare cât și ale celor de squash. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "mrWidget|To change this default message, edit the template for merge commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Pentru a modifica acest mesaj implicit, editați șablonul pentru mesajele commit-ului de îmbinare %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "mrWidget|To change this default message, edit the template for squash commit messages. %{linkStart}Learn more.%{linkEnd}"
-msgstr ""
+msgstr "Pentru a schimba acest mesaj implicit, editați șablonul mesajelor commit-urilor squash. %{linkStart}Aflați mai multe.%{linkEnd}"
msgid "mrWidget|To merge, a Jira issue key must be mentioned in the title or description."
-msgstr ""
+msgstr "Pentru îmbinare, o cheie de problemă Jira trebuie să fie menționată în titlu sau în descriere."
msgid "mrWidget|Users who can write to the source or target branches can resolve the conflicts."
-msgstr ""
+msgstr "Utilizatorii care pot scrie în ramurile sursă sau țintă pot rezolva conflictele."
msgid "mrWidget|What is a merge train?"
-msgstr ""
+msgstr "Ce este un merge train?"
msgid "mrWidget|Your password"
-msgstr "Parola dvs."
+msgstr "Parola dumneavoastră"
msgid "mrWidget|into"
msgstr "în"
@@ -45355,6 +45622,9 @@ msgstr "grupul-meu-minunat"
msgid "my-channel"
msgstr "canalul meu"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "au nevoie de atenție"
@@ -45370,9 +45640,6 @@ msgstr "nu expiră niciodată"
msgid "new merge request"
msgstr "merge request nou"
-msgid "no approvers"
-msgstr "fără aprobatori"
-
msgid "no expiration"
msgstr ""
@@ -45388,6 +45655,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "nu a fost găsit"
@@ -45448,9 +45721,6 @@ msgstr "comentariu în așteptare"
msgid "pending deletion"
msgstr "în așteptarea ștergerii"
-msgid "per day"
-msgstr "pe zi"
-
msgid "personal access token"
msgstr "token acces personal"
@@ -45461,7 +45731,7 @@ msgid "pipeline"
msgstr "pipeline"
msgid "pipeline schedules documentation"
-msgstr ""
+msgstr "documentația despre programele de pipeline"
msgid "pipelineEditorWalkthrough|Let's do this!"
msgstr ""
@@ -45572,7 +45842,7 @@ msgid "removed"
msgstr "înlăturat"
msgid "removed a Zoom call from this issue"
-msgstr "a fost îndepărtat un apel Zoom din această problemă"
+msgstr "a înlăturat un apel Zoom din această problemă"
msgid "rendered diff"
msgstr ""
@@ -45583,6 +45853,9 @@ msgstr[0] "răspuns"
msgstr[1] "răspunsuri"
msgstr[2] "răspunsurile"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
@@ -45605,7 +45878,7 @@ msgid "security Reports|There was an error creating the merge request"
msgstr "A apărut o eroare la crearea merge request-ului"
msgid "severity|Blocker"
-msgstr ""
+msgstr "Blocantă"
msgid "severity|Critical"
msgstr "Critică"
@@ -45695,7 +45968,7 @@ msgid "suggestPipeline|2/2: Commit your changes"
msgstr "2/2: Commit modificările dvs."
msgid "suggestPipeline|Choose %{boldStart}Code Quality%{boldEnd} to add a pipeline that tests the quality of your code."
-msgstr "Alegeți %{boldStart}Calitate Cod%{boldEnd} pentru a adăuga un pipeline care testează calitatea codului dvs."
+msgstr "Alegeți %{boldStart}Code Quality%{boldEnd} pentru a adăuga un pipeline care testează calitatea codului dvs."
msgid "suggestPipeline|The template is ready! You can now commit it to create your first pipeline."
msgstr ""
@@ -45752,7 +46025,7 @@ msgid "updated"
msgstr ""
msgid "updated %{timeAgo}"
-msgstr ""
+msgstr "s-a actualizat %{timeAgo}"
msgid "updated %{time_ago}"
msgstr ""
@@ -45815,7 +46088,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 comentariu"
+msgstr "Adăugați comentariul"
msgid "vulnerability|Add comment & dismiss"
msgstr "Adăugați comentariu & respingeți"
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index adc00df5888..766cbd97182 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr " %{start} по %{end}"
@@ -343,13 +343,6 @@ msgstr[1] "%d группы"
msgstr[2] "%d групп"
msgstr[3] "%d групп"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d группа выбрана"
-msgstr[1] "%d группы выбраны"
-msgstr[2] "%d групп выбрано"
-msgstr[3] "%d групп выбрано"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d чаÑ"
@@ -511,13 +504,6 @@ msgstr[1] "%d Ñекунды"
msgstr[2] "%d Ñекунд"
msgstr[3] "%d Ñекунд"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d шард выбран"
-msgstr[1] "%d шарда выбрано"
-msgstr[2] "%d шардов выбрано"
-msgstr[3] "%d шардов выбрано"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d звезда"
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ msgstr "%{edit_in_new_fork_notice} Попробуйте загрузить фаÐ
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "%{extra} больше загруженных Ñборочных линий"
@@ -955,9 +944,6 @@ msgstr "%{level_name} не допуÑкаетÑÑ Ð² %{group_level_name} груÐ
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} запрещено, Ñ‚.к. проект-иÑточник Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ более узкую облаÑÑ‚ÑŒ видимоÑти."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}Ðачните заголовок Ñ %{draft_snippet}%{link_end}, чтобы предотвратить ÑлиÑние черновика запроÑа на ÑлиÑние до того, как он будет готов."
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Какую информацию Ñобирает GitLab Inc.?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}, и еще %{awardsListLength}"
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1483,9 +1463,6 @@ msgstr[1] "+ещё %d"
msgstr[2] "+ещё %d"
msgstr[3] "+ещё %d"
-msgid "+%{approvers} more approvers"
-msgstr "+ещё %{approvers} утверждающих"
-
msgid "+%{extra} more"
msgstr "+ещё %{extra}"
@@ -1551,6 +1528,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 байт"
@@ -1721,6 +1701,9 @@ msgstr[3] "оÑталоÑÑŒ %d лет"
msgid "1-9 contributions"
msgstr "1-9 ÑодейÑтвий"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 ÑодейÑтвий"
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "Первый вклад!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 ÑодейÑтвий"
@@ -1808,9 +1794,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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"
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "УчаÑтник команды по борьбе Ñ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ñми раÑÑмотрит ваш отчет при первой возможноÑти."
-msgid "A merge request hasn't yet been merged"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние еще не Ñлит"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr "ÐÐ¾Ð²Ð°Ñ ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Auto DevOps Ñоздана, обратитеÑÑŒ к Ñтранице, поÑвÑщенной Сборочным линиÑм за подробноÑÑ‚Ñми"
@@ -1883,6 +1863,9 @@ 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 "Сайт на проÑтом HTML иÑпользует Netlify Ð´Ð»Ñ CI/CD вмеÑто GitLab, но вÑÑ‘ же пользуетÑÑ Ð²Ñеми другими замечательными возможноÑÑ‚Ñми GitLab"
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr "отпиÑатьÑÑ"
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr ""
msgid "Add a link"
msgstr "Добавить ÑÑылку"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr "Добавить новое обÑуждение"
@@ -2429,6 +2400,9 @@ msgstr "Добавить правило утверждениÑ"
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Добавить жирный текÑÑ‚"
@@ -2588,15 +2562,15 @@ msgstr "Добавить ранее Ñлитые коммиты"
msgid "AddContextCommits|Add/remove"
msgstr "Добавить/удалить"
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ оÑтановить вÑе заданиÑ.
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Ошибка загрузки ÑтатиÑтики. ПожалуйÑта, попробуйте еще раз"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "ÐаÑтроить Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "Отключить токен канала"
@@ -2903,12 +2874,39 @@ 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 "Проверка домена - Ð²Ð°Ð¶Ð½Ð°Ñ Ð¼ÐµÑ€Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑти Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… Ñайтов GitLab. Пользователи должны подтвердить, что домен принадлежит им, прежде чем Ñайт будет включен. %{link_start}Подробнее.%{link_end}"
+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 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 "ИÑпользовать общие Runner'Ñ‹ в новых проектах"
+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 "Токен канала"
@@ -2918,12 +2916,24 @@ msgstr "Я прочёл и принимаю %{link_start}УÑÐ»Ð¾Ð²Ð¸Ñ Ð¾Ð±Ñл
msgid "AdminSettings|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 "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "СохранÑÑ‚ÑŒ поÑледние артефакты Ð´Ð»Ñ Ð²Ñех заданий в поÑледних уÑпешных Ñборочных линиÑÑ…"
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 ""
+
+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 "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ ÑеанÑа Ð´Ð»Ñ Git-операций, когда включена 2FA."
@@ -2954,18 +2964,39 @@ msgstr "Ðовые переменные CI/CD в проектах и группÐ
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 "Защищать переменные CI/CD по умолчанию"
+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|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 "Выберите шаблон CI/CD"
@@ -2975,6 +3006,9 @@ 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 "Выберите, чтобы отключить общий доÑтуп к Ñайтам Pages. Это потребует от пользователей авторизации Ð´Ð»Ñ Ð´Ð¾Ñтупа к Ñайтам Pages вашего ÑкземплÑра. %{link_start}Подробнее.%{link_end}"
+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 "ПродолжительноÑÑ‚ÑŒ ÑеанÑа Ð´Ð»Ñ Git-операций когда включена 2FA (в минутах)"
@@ -3005,9 +3039,27 @@ 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 "Шаблон обÑзательной конфигурации Ñборочной линии может быть как одним из предоÑтавленных GitLab, так и пользовательÑким, добавленным в репозиторий шаблонов ÑкземплÑра. %{link_start}Как мне Ñоздать репозиторий шаблонов ÑкземплÑра?%{link_end}"
+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|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 "AdminStatistics|Active Users"
msgstr "Ðктивные пользователи"
@@ -3881,6 +3933,9 @@ msgstr "Ð’Ñе проекты"
msgid "All projects selected"
msgstr "Выбраны вÑе проекты"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Ð’Ñе темы решены"
@@ -3896,14 +3951,20 @@ 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 "Разрешить доÑтуп учаÑтникам Ñледующей группы"
msgid "Allow access to the following IP addresses"
msgstr "Разрешить доÑтуп к Ñледующим IP-адреÑам"
-msgid "Allow commits from members who can merge to the target branch."
-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 "Разрешить владельцам групп управлÑÑ‚ÑŒ наÑтройками, ÑвÑзанными Ñ LDAP"
@@ -3944,9 +4005,6 @@ msgstr "Разрешить подгруппам уÑтанавливать ÑвÐ
msgid "Allow this key to push to this repository"
msgstr "Разрешить Ñтому ключу выполнÑÑ‚ÑŒ push в данный репозиторий"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr "Разрешить пользователÑм запрашивать дÐ
msgid "Allowed"
msgstr "Разрешено"
-msgid "Allowed Geo IP"
-msgstr "Разрешённые Geo IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "ДопуÑтимые Ñимволы: +, 0-9, -, и пробелы."
@@ -4334,6 +4389,9 @@ 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 "Произошла ошибка при удалении целей."
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "Произошла ошибка при валидации пути группы"
@@ -4479,9 +4534,6 @@ msgstr "Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°."
msgid "Analytics"
msgstr "Ðналитика"
-msgid "Analyze a review version of your web application."
-msgstr "Проанализировать рецензируемую верÑию вашего веб-приложениÑ."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Ðнализируйте ваши завиÑимоÑти на предмет извеÑтных уÑзвимоÑтей."
@@ -4512,6 +4564,9 @@ 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 "Ðнти-Ñпам проверка"
@@ -4590,12 +4645,27 @@ msgstr "Приложение было уÑпешно обновлено."
msgid "Application: %{name}"
msgstr "Приложение: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
-msgstr "ЕÑли Ñтот параметр включен, любой пользователь, поÑещающий %{host} и Ñоздающий учётную запиÑÑŒ, должен быть Ñвно одобрен админиÑтратором, прежде чем Ñможет войти. Этот параметр дейÑтвует только в том Ñлучае, еÑли разрешена региÑтрациÑ."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr "Применение предложений..."
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr "Правила утверждениÑ"
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 "Ошибка аутентификации: %{error_message}"
@@ -5722,8 +5780,8 @@ msgstr "ДоÑтупный ID"
msgid "Available group runners: %{runners}"
msgstr "ДоÑтупные групповые runner'Ñ‹: %{runners}"
-msgid "Available runners: %{runners}"
-msgstr "ДоÑтупные runner'Ñ‹: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "ДоÑтупные общие runner'Ñ‹:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr "Ðиже приведены наÑтройки Ð´Ð»Ñ %{link_to_gitlab_p
msgid "Below you will find all the groups that are public."
msgstr "Ðиже показаны вÑе открытые группы."
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr "Двухнедельное покрытие кода"
@@ -6013,12 +6068,21 @@ msgstr ""
msgid "Billings|By reactivating your trial, you will receive an additional 30 days of %{planName}. Your trial can be only reactivated once."
msgstr "При повторной активации пробного периода вы получите 30 дополнительных дней плана %{planName}. Повторно активировать пробный период можно лишь единожды."
+msgid "Billings|Error validating card details"
+msgstr ""
+
msgid "Billings|Extend trial"
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 ""
@@ -6046,23 +6110,29 @@ 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"
+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 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|An error occurred while removing a billable member."
+msgstr ""
msgid "Billing|Awaiting member signup"
msgstr ""
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr "Введите минимум три Ñимвола Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
-msgstr "Группа"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+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 "УчаÑтники, приглашённые Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ группового приглашениÑ, не могут быть удалены. Ð’Ñ‹ можете либо удалить вÑÑŽ группу, либо попроÑить владельца приглашённой группы удалить учаÑтника."
@@ -6109,9 +6185,6 @@ msgstr "Введите %{username} Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ"
msgid "Billing|User was successfully removed"
msgstr "Пользователь был уÑпешно удалён"
-msgid "Billing|Users occupying seats in"
-msgstr "Пользователи, занимающие меÑта в"
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr "Обзор"
msgid "Branches|Please type the following to confirm:"
msgstr "ПожалуйÑта, введите Ñледующее Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Управление защищёнными ветками возможно в %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Показать активные ветки"
@@ -6571,9 +6641,6 @@ msgstr "раÑходитÑÑ Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑким репозиториеÐ
msgid "Branches|merged"
msgstr "влита"
-msgid "Branches|project settings"
-msgstr "наÑтройках проекта"
-
msgid "Branches|protected"
msgstr "защищена"
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "СущеÑтвующие группы"
@@ -6649,6 +6719,9 @@ 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 "Ошибка импорта: меÑто Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ может быть подгруппой иÑходной группы. Измените меÑто Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸ попробуйте ещё раз."
@@ -6673,9 +6746,6 @@ msgstr "Ð˜Ð¼Ñ ÑƒÐ¶Ðµ ÑущеÑтвует."
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr "ÐаÑтройки CI"
msgid "CI variables"
msgstr "Переменные CI"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI будет запуÑкатьÑÑ Ñ Ð¸Ñпользованием учетных данных, указанных выше."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6820,6 +6887,9 @@ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ CI/CD"
msgid "CI/CD configuration file"
msgstr "Файл конфигурации CI/CD"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr "Ðи один проект не был добавлен в облаÑÑ‚ÑŒ видимоÑти"
@@ -6835,6 +6905,9 @@ msgstr "ЧаÑтота развертываниÑ"
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr "Проекты Ñ Ñ€ÐµÐ»Ð¸Ð·Ð°Ð¼Ð¸"
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr "Отмена"
msgid "Cancel and close"
msgstr "Отменить и закрыть"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "Отменить удаление индекÑа"
@@ -7310,9 +7389,15 @@ 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 "Заголовок изменен на \"%{title_param}\"."
@@ -7331,6 +7416,9 @@ msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñкрыты. Ðажмите, чтобы показа
msgid "Changes the title to \"%{title_param}\"."
msgstr "ИзменÑет название на \"%{title_param}\"."
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² заголовке не были Ñохранены"
@@ -7400,6 +7488,9 @@ msgstr "Проверить Ñнова"
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr "Детали подпиÑки"
msgid "Checkout|Subtotal"
msgstr "Подытог"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Ðалоги"
@@ -7690,6 +7784,9 @@ msgstr "Дочерний объект не ÑущеÑтвует."
msgid "Child epic doesn't exist."
msgstr "Дочерней цели не ÑущеÑтвует."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr "Выберите любой цвет."
msgid "Choose file…"
msgstr "Выберите файл…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr "Выберите предпочтительный Runner и заполните AWS CFT."
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr "ОчиÑтить"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr "ОчиÑтить вÑе проверки репозиториÑ"
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ‚ вам уÑтанавливать Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° клаÑтеры RBAC."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr "ComboSearch не определен"
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr "Команда"
@@ -9411,9 +9512,6 @@ msgstr "Ðе найдено ÑвÑзанных запроÑов на ÑлиÑнÐ
msgid "Committed by"
msgstr "ЗафикÑировано автором"
-msgid "Commit…"
-msgstr "Коммит…"
-
msgid "Community forum"
msgstr "Форум ÑообщеÑтва"
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr "Ошибка подключениÑ"
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr "РееÑÑ‚Ñ€ контейнеров не включен в Ñтом Ñк
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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 "С рееÑтром контейнеров каждый проект имеет меÑто Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñвоих образов Docker. Добавьте Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один образ в один из проектов Ñтой группы, чтобы увидеть его здеÑÑŒ.%{docLinkStart}Узнать подробнее%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "С рееÑтром контейнеров GitLab, у каждого проекта еÑÑ‚ÑŒ Ñвоё меÑто Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð² Docker. %{docLinkStart}ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ%{docLinkEnd}"
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить %{item} тегов. Ð’Ñ‹ уверены?"
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr "Продолжить"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Перейти к Ñледующему шагу"
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr "Копировать ID"
-msgid "Copy IP Address"
-msgstr "Скопировать IP-адреÑ"
-
msgid "Copy KRB5 clone URL"
msgstr "Скопировать URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· KRB5"
@@ -10404,6 +10493,9 @@ msgstr "Копировать URL"
msgid "Copy branch name"
msgstr "Копировать Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr "Копировать метки и Ñтапы из другой зада
msgid "Copy link"
msgstr "Копировать ÑÑылку"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr "Создать ветку"
msgid "Create commit"
msgstr "Создать коммит"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr "ÐаÑтройки"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr "должен быть в группе"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} выбрано (макÑимум — %{maxLabels})"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr "Удалить артефакты"
msgid "Delete badge"
msgstr "Удалить значок"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Удалить колонку"
@@ -12345,6 +12464,9 @@ msgstr "Удалённый никнейм чата: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "Удаленные проекты не могут воÑÑтановлены!"
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr "УдалÑет иÑходную ветку"
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7."
+msgstr ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "Разница между начальной датой и нынешней"
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr "Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
msgid "Disable"
msgstr "Отключить"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr "Отключить двухфакторную аутентификацию"
@@ -13418,6 +13567,9 @@ msgstr "Отключить Ð´Ð»Ñ Ñтого проекта"
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr "Отключить двухфакторную аутентификацию"
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr "Скачать артефакты"
-msgid "Download as"
-msgstr "Скачать как"
-
msgid "Download codes"
msgstr "Скачать коды"
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr "Дата завершениÑ"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "ДлительноÑÑ‚ÑŒ"
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Редактировать обÑуждениÑ"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr "Отображаемое Ð¸Ð¼Ñ Ð´Ð»Ñ Ñл. почты"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° не подтверждена. ПожалуйÑта, подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в Salesforce."
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,15 +14267,15 @@ msgstr "ПуÑтой файл"
msgid "Enable"
msgstr "Включить"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Включить Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Включить Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Включить двухфакторную аутентификацию"
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] "Окружение"
-msgstr[1] "ОкружениÑ"
-msgstr[2] "ОкружениÑ"
-msgstr[3] "ОкружениÑ"
+msgstr ""
msgid "Environment does not have deployments"
msgstr "Окружение не имеет развёртываний"
@@ -14725,6 +14858,9 @@ msgstr "защищённое"
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Цель"
@@ -14749,9 +14885,6 @@ msgstr "Цели"
msgid "Epics Roadmap"
msgstr "Глобальный план развитиÑ"
-msgid "Epics and Issues"
-msgstr "Цели и обÑуждениÑ"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Цели позволÑÑ‚ вам управлÑÑ‚ÑŒ портфелем проектов более Ñффективно и Ñ Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼Ð¸ уÑилиÑми"
@@ -14854,6 +14987,9 @@ msgstr "до"
msgid "Epics|start"
msgstr "начать"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Ошибка"
@@ -15109,9 +15245,6 @@ msgstr "Ошибки"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Ошибки:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr "Ðе удалоÑÑŒ уÑтановить."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr "Ðе удалоÑÑŒ загрузить метрики активноÑÑ‚
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Функциональные опции"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Файл добавлен"
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Шаблоны файлов"
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr "Завершено"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "Забыли пароль?"
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 "Ðе удалоÑÑŒ удалить запиÑÑŒ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑущеÑтвующего проекта."
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
msgstr "Фильтр по ÑоÑтоÑнию"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Geo"
+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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr "Синхронизировано"
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr "Ожидание Ñинхронизации"
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Скачать заново"
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "РеÑинхронизировать"
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 "ЗапиÑÑŒ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° (%{project_id}) была уÑпешно удалена."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Ошибка Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ - %{error}"
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr "Ожидание планировщика"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr "Ðовый региÑтрационный токен обработчика заданий Ñгенерирован!"
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "ПереопределÑет пользовательÑкие наÑтройки уведомлений Ð´Ð»Ñ Ð²Ñех учаÑтников Ñтой группы, подгрупп и проектов."
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr "Группы Ð´Ð»Ñ Ñинхронизации"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "ЧаÑто поÑещаемые"
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr "ЗдеÑÑŒ вы найдёте поÑледние дейÑтвиÑ, ÑвÑзанные Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñами на ÑлиÑние"
-
msgid "Hi %{username}!"
msgstr "Привет, %{username}!"
@@ -18992,12 +19280,6 @@ msgstr "ОчиÑтка уÑпешно запущена"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ IP-подÑетÑм разрешены только Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿ верхнего уровнÑ"
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Идентификатор"
@@ -19169,15 +19454,12 @@ msgstr "ЕÑли отмечено, владельцы групп могут уп
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "ЕÑли отмечено, новые членÑтва в группах и Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ добавлÑÑ‚ÑŒ только через Ñинхронизацию 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr "Внутренний URL (необÑзательно)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr "Внутренние пользователи"
msgid "Internal users cannot be deactivated"
msgstr "Внутренние пользователи не могут быть деактивированы"
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Шаблон интервала"
@@ -20838,6 +21117,9 @@ msgstr "Ðеверный формат Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ типа фаÐ
msgid "Invalid file."
msgstr "ÐедопуÑтимый файл."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr "ПриглаÑить УчаÑтников"
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr "ПриглаÑить учаÑтников"
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не может быть более 500 лет в будущем"
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr "Ваша команда раÑÑ‚Ñ‘Ñ‚! Ð’Ñ‹ уÑпешно приглаÑили новых учаÑтников в проект %{projectName}."
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Покинуть"
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,11 +23171,8 @@ msgstr "Компоненты"
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr "Обнаружены лицензии Ñ Ð½ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ð¼ ÑтатуÑом комплаенÑа и политик проекта"
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
-msgstr "Показывает лицензии, обнаруженные в проекте при %{linkStart}поÑледнем уÑпешном%{linkEnd} Ñканировании"
+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 ""
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr "Ограничить отображение единицы времени отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾ чаÑов."
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr "Заблокировано %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "ДиÑкуÑÑÐ¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°."
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 "Метрики"
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr "Ðайдено неÑколько загрузчиков: %{uploader_typ
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr "Сеть"
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr "Ðет меток"
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примечание"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr "Ðичего не найдено…"
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "ÐоÑб."
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr "ОК"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 "ПоÑле импорта, репозитории могут зеркалироватьÑÑ Ñ‡ÐµÑ€ÐµÐ· SSH. Подробней %{link_start}здеÑÑŒ%{link_end}."
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr "Удалить верÑию пакета"
msgid "PackageRegistry|Delete package"
msgstr "Удалить пакет"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr "Команда pip"
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,15 +27636,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "ЧаÑÑ‚ÑŒ изменений запроÑа на ÑлиÑние"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "УчаÑтники"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr ""
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr "ПриоÑтановить"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ %{label} Ð´Ð»Ñ %{dataTitle}\""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 "ПожалуйÑта, заполните Ñто поле."
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr "ПожалуйÑта, введите %{phrase_code} чтобы продÐ
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "ПожалуйÑта, иÑпользуйте Ñту форму Ð´Ð»Ñ Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов о пользователÑÑ…, Ñоздающих задачи и комментарии, Ñодержащие Ñпам или ведущих ÑÐµÐ±Ñ Ð½ÐµÐ°Ð´ÐµÐºÐ²Ð°Ñ‚Ð½Ð¾."
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "ПожалуйÑта, подождите, Ñта Ñтраница автоматичеÑки обновитÑÑ, когда вÑÑ‘ будет готово."
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr "ÐаÑтройте Ð´Ð»Ñ ÑÐµÐ±Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ даты и времени"
@@ -28665,6 +28920,12 @@ msgstr "ÐаÑтройте интеграцию Ñо Ñторонними Ñер
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 "Отображать Ð²Ñ€ÐµÐ¼Ñ Ð² 24-чаÑовом формате"
@@ -28701,6 +28962,9 @@ msgstr "Должно быть чиÑлом между %{min} и %{max}"
msgid "Preferences|Navigation theme"
msgstr "Дизайн верхней панели"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Обзор Ñодержимого проекта"
@@ -28800,9 +29064,6 @@ msgstr "Предыдущий файл в отличиÑÑ… (diff)"
msgid "Previous unresolved discussion"
msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ð´Ð¸ÑкуÑÑиÑ"
-msgid "Primary"
-msgstr "ОÑновной"
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr "Ðевозможно удалить ÑкÑпорт проекта."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "ЭкÑпорт проекта включен"
-
msgid "Project export has been deleted."
msgstr "ЭкÑпорт проекта удален."
@@ -30051,8 +30309,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "Пользователи могут копировать репозиторий в новый проект."
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-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 "Пользователи могут запрашивать доÑтуп"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ñлужба поиÑка недоÑтупна"
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ помощи приложениÑ"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "Заменить"
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "Репозиторий по URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr "ПожаловатьÑÑ"
@@ -31924,6 +32167,9 @@ msgstr "Отказ"
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Хранилище репозиториÑ"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr "Повторить"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr "ЗапуÑкайте теÑÑ‚Ñ‹ Ð´Ð»Ñ Ñвоего кода в реал
msgid "Run untagged jobs"
msgstr "ЗапуÑк заданий без тегов"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr "Runner'Ñ‹"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr "Данные об иÑпользовании меÑÑ‚ на %{last_enqueu
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr "Данные об иÑпользовании меÑÑ‚ обновлÑÑŽÑ‚ÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ день в 12:00 UTC"
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°:"
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr "Выберите группу или проект"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "УÑтановить приоритет"
msgid "Set weight to %{weight}."
msgstr "УÑтановить приоритет на %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr "ПоделитьÑÑ"
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr "Добавить меÑта"
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr "Ðктивировать подпиÑку"
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ msgstr ""
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr "Узнайте, как %{linkStart}активировать подпиÑку%{linkEnd}."
+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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 "Пользователи Ñ Ñ€Ð¾Ð»ÑŒÑŽ Guest или те, кто не входит в проект или группу, не займут меÑта в вашей лицензии."
-msgid "SuperSonics|You can learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr "Синхронизировано"
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr "Заметки к релизу"
msgid "TagsPage|Repository has no tags yet."
msgstr "Репозитарий не Ñодержит тегов."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Теги"
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "ТеÑÑ‚"
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr "Этот коммит не ÑущеÑтвует"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr "Проект был уÑпешно импортирован."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 "Произошла ошибка при отправке пиÑьма Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸ÐµÐ¼"
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr "Произошла ошибка при ÑброÑе минут польÐ
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "Произошла ошибка при Ñохранении ваших изменений."
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 "Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚, чтобы локальное хранилище было включено"
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ первого коммита до первого ком
msgid "Time from last commit to merge"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ Ð¿Ð¾Ñледнего коммита до ÑлиÑниÑ"
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr "Только что"
msgid "Timeago|right now"
msgstr "прÑмо ÑейчаÑ"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 "Попробовать Ñнова"
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr "Вторник"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr "Тип"
-msgid "Type/State"
-msgstr "Тип/СоÑтоÑние"
-
msgid "U2F Devices (%{length})"
msgstr "УÑтройÑтва U2F (%{length})"
@@ -40458,6 +40695,9 @@ msgstr ""
msgid "Unable to find Jira project to import data from."
msgstr "Ðе удалоÑÑŒ найти проект Jira, из которого должны быть импортированы данные."
+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 ""
@@ -40737,9 +40977,6 @@ msgstr "Обновление не удалоÑÑŒ"
msgid "Update it"
msgstr "Обновить Ñто"
-msgid "Update iteration"
-msgstr "Обновить итерацию"
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr "Обновлено %{updated_at} %{updated_by}"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr "Текущий период иÑпользованиÑ"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr "МеÑта"
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 "ИÑпользование групповых реÑурÑов по проектам в группе %{strong_start}%{group_name}%{strong_end}"
@@ -41016,9 +41265,6 @@ msgstr "ИÑпользование реÑурÑов в ваших проекта
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "ИÑпользование Ñ"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr "Различные наÑтройки Ñлектронной почты.
msgid "Various settings that affect GitLab performance."
msgstr "Различные наÑтройки, которые влиÑÑŽÑ‚ на производительноÑÑ‚ÑŒ GitLab."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr "Образ"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr "Мы не Ñмогли раÑпознать путь Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ†ÐµÐ»Ð¸"
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr "Что такое Ñжатие?"
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ msgstr ""
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ добавить учаÑтников %{usersTag} в диÑкуÑÑию. Каждый из них получит уведомление."
+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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr "Ð’Ñ‹ иÑпользуете GitLab в режиме только Ð´Ð»Ñ Ñ
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "Ð’Ñ‹ получили Ñто Ñообщение, потому что вы ÑвлÑетеÑÑŒ админиÑтратором GitLab Ð´Ð»Ñ %{url}."
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ msgstr "Ð’Ñ‹ можете протеÑтировать Ñвой файл .gitlab
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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] "запроÑов на ÑлиÑние"
msgstr[2] "запроÑов на ÑлиÑние"
msgstr[3] "запроÑов на ÑлиÑние"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 "1 коммит cлиÑниÑ"
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "Проверить ветку"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "Патчи по Ñлектронной почте"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Ðе удалоÑÑŒ загрузить ÑтатиÑтику развёртываниÑ"
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Открыть в Web IDE"
-msgid "mrWidget|Plain diff"
-msgstr "Обычное отличие"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "требуют вниманиÑ"
@@ -45628,9 +45899,6 @@ msgstr "никогда не иÑтекает"
msgid "new merge request"
msgstr "новый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "не найдено"
@@ -45708,9 +45982,6 @@ msgstr "ожидающий комментарий"
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr "в день"
-
msgid "personal access token"
msgstr "личный токен доÑтупа"
@@ -45846,6 +46117,9 @@ msgstr[1] "ответа"
msgstr[2] "ответов"
msgstr[3] "ответов"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/si_LK/gitlab.po b/locale/si_LK/gitlab.po
index 136f87e6dbe..901ffb608aa 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr " %{start} සිට %{end}"
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "සමූහ %d"
msgstr[1] "සමූහ %d"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "පà·à¶º %d"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "තත්පර %d"
msgstr[1] "තත්පර %d"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr ""
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@සමà·à¶œà¶¸.ලංකà·"
+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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] "තව +%d"
msgstr[1] "තව +%d"
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr "තවත් +%{extra}"
@@ -1343,6 +1324,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "බයිට 0"
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr "සබà·à¶³à·’යක් එකතු කරන්න"
-msgid "Add a link to Grafana"
-msgstr "ග්â€à¶»à·à·†à·à¶±à· ට සබà·à¶³à·’යක් එකතු කරන්න"
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "ලෙට්'ස් එන්ක්â€à¶»à·’ප්ට් වින්â€à¶ºà·à·ƒà¶œà¶­ කරන්න"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr "සියළුම ව්â€à¶ºà·à¶´à·˜à¶­à·’"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 "සහතිකය"
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr "නිර්දේà·à·’ත"
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr "ලියà·à¶´à¶¯à·’ංචිය"
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr "ආරක්â€à·‚à·à·€"
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr "ලෙස බà·à¶œà¶±à·Šà¶±"
-
msgid "Download codes"
msgstr "කේත බà·à¶œà¶±à·Šà¶±"
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "ඉල්"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr "ඇඟවීමේ විස්තර"
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "මේ දà·à¶±à·Š"
msgid "Timeago|right now"
msgstr "හරියටම දà·à¶±à·Š"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,8 +39740,11 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
-msgstr "මà·à¶­à·˜à¶šà·à·€à·š නම"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
+msgstr ""
msgid "Topic was successfully updated."
msgstr "මà·à¶­à·˜à¶šà·à·€ à·ƒà·à¶»à·Šà¶®à¶šà·€ යà·à·€à¶­à·Šà¶šà·à¶½ කෙරිණි."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr "අඟහරුවà·à¶¯à·"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "වර්ගය"
-msgid "Type/State"
-msgstr "වර්ගය/තත්â€à·€à¶º"
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr "එය යà·à·€à¶­à·Šà¶šà·à¶½ කරන්න"
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr "යà·à·€à¶­à·Šà¶šà·à¶½"
-
msgid "Updating"
msgstr "යà·à·€à¶­à·Šà¶šà·à¶½ වෙමින්"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr "මෙම විධà·à¶±à¶º කරන්නේ කුමක්ද?"
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr "ඔබගේ රà·à¶šà·’යà·à·€ කුමක්ද? (විකල්ප)"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr "වියමන ඒ.ස.නි. ට වඩ෠වෙනස් නම්."
-msgid "ZentaoIntegration|Issue list"
-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 "සෙන්ටà·à¶• යෙ.ක්â€à¶».මු. ඒ.à·ƒ.නි. (වෛකල්පිතයි)"
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr "සංරක්â€à·‚ිතයි"
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] "සංයුක්ත ඉල්ලීම"
msgstr[1] "සංයුක්ත ඉල්ලීම්"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr "ස්වයං සංයුක්තය අවලංගු කරන්න"
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr "සංයුක්ත ඉල්ලීම සංයුක්ත කළ à·„à·à¶šà·’දà·à¶ºà·’ පරීක්â€à·‚෠වෙමින්…"
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr "ගිට්පොඩ් හි විවෘත කරන්න"
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr "මà·à¶œà·š-නà·à¶½à·’කà·à·€"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr "කිසිද෠කල් ඉකුත් නොවේ"
msgid "new merge request"
msgstr "නව සංයුක්ත ඉල්ලීම"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr "කල් ඉකුත්වීමක් නà·à¶­"
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "හමු නොවිණි"
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "පිළිතුර"
msgstr[1] "පිළිතුරු"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po
index 7a7d52c8e66..9dc0c17dd59 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:54\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -343,13 +343,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -511,13 +504,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ 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 ""
@@ -955,9 +944,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1483,9 +1463,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1551,6 +1528,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1808,9 +1794,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ 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 ""
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2429,6 +2400,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2588,15 +2562,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 ""
@@ -2918,12 +2916,24 @@ 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|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 ""
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3881,6 +3933,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4334,6 +4389,9 @@ 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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sl_SI/gitlab.po b/locale/sl_SI/gitlab.po
index 75ed035f9a2..e750e921e08 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:52\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -343,13 +343,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -511,13 +504,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -673,7 +659,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -826,6 +812,9 @@ 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 ""
@@ -955,9 +944,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -967,9 +953,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1483,9 +1463,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1551,6 +1528,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1721,6 +1701,9 @@ msgstr[3] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1733,6 +1716,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1808,9 +1794,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1856,9 +1839,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1883,6 +1863,9 @@ 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 ""
@@ -2234,9 +2217,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2429,6 +2400,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2588,15 +2562,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2849,12 +2823,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2891,6 +2859,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2903,12 +2874,39 @@ 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 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 ""
@@ -2918,12 +2916,24 @@ 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|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 ""
@@ -2954,18 +2964,39 @@ 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|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 ""
@@ -2975,6 +3006,9 @@ 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|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 ""
@@ -3005,9 +3039,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3881,6 +3933,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3896,13 +3951,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3944,9 +4005,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3962,9 +4020,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4334,6 +4389,9 @@ 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 ""
@@ -4410,9 +4468,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4479,9 +4534,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4512,6 +4564,9 @@ 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 ""
@@ -4590,12 +4645,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4637,37 +4707,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4676,22 +4743,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4749,9 +4816,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4951,15 +5015,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5497,7 +5552,7 @@ 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."
+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"
@@ -5536,6 +5591,9 @@ 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 ""
@@ -5722,7 +5780,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5875,7 +5933,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5905,9 +5963,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -6109,9 +6185,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6511,9 +6584,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6571,9 +6641,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6634,6 +6701,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6802,9 +6872,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6820,6 +6887,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6835,6 +6905,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6908,7 +6981,7 @@ 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."
+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."
@@ -7076,6 +7149,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7310,9 +7389,15 @@ 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 ""
@@ -7331,6 +7416,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7400,6 +7488,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7690,6 +7784,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7717,9 +7814,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8167,13 +8271,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8182,6 +8286,9 @@ 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 ""
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8272,13 +8373,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8290,7 +8391,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8326,9 +8434,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8338,19 +8443,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8359,7 +8467,7 @@ 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}"
+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}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-
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 ""
@@ -8402,7 +8506,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8561,9 +8665,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -9077,6 +9178,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9284,9 +9388,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9411,9 +9512,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9516,9 +9614,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10386,9 +10478,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10404,6 +10493,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10446,6 +10538,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10752,6 +10847,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,7 +11336,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11412,6 +11513,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11439,6 +11546,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11909,25 +12025,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12345,6 +12464,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ 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 ""
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12507,6 +12632,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13360,9 +13503,18 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+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 ""
@@ -13403,9 +13555,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13554,7 +13706,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13887,6 +14042,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -14112,13 +14267,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -14142,18 +14297,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14725,6 +14858,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14749,9 +14885,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14854,6 +14987,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -15109,9 +15245,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16459,9 +16598,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 ""
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16891,6 +17116,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16912,6 +17140,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16954,6 +17185,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 ""
@@ -17077,6 +17359,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -17092,7 +17377,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ 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 ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18992,12 +19280,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -19169,15 +19454,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19478,9 +19757,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19793,6 +20075,9 @@ 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 ""
@@ -19976,9 +20261,15 @@ 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 ""
@@ -20120,6 +20411,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20730,9 +21012,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,10 +23171,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22916,24 +23219,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23839,6 +24139,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23959,6 +24262,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 ""
@@ -24723,10 +25041,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25616,9 +25784,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 ""
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -27095,6 +27329,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,13 +27636,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27672,9 +27915,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 ""
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28701,6 +28962,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29421,9 +29682,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -30051,7 +30309,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -31188,9 +31443,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31778,9 +32027,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,6 +32167,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32606,10 +32846,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr ""
@@ -32946,6 +33183,9 @@ 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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Define this policy's location, conditions and actions."
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+msgid "SecurityOrchestration|Delete policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33890,15 +34139,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34526,9 +34790,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 ""
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37124,9 +37376,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 ""
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 ""
@@ -38941,7 +39184,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -39088,9 +39331,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39244,9 +39484,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39415,9 +39652,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ 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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,7 +40212,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40254,6 +40494,9 @@ 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 ""
@@ -40296,9 +40539,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40458,6 +40695,9 @@ 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 ""
@@ -40737,9 +40977,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40788,9 +41025,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -41004,6 +41247,12 @@ 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 ""
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42312,7 +42555,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42573,7 +42813,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,9 +43017,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43099,12 +43330,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -43114,6 +43351,9 @@ 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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43459,6 +43709,9 @@ 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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 ""
@@ -45203,7 +45468,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 ""
@@ -45224,6 +45495,12 @@ 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 ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45348,9 +45622,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45463,9 +45734,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45628,9 +45899,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45708,9 +45982,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45846,6 +46117,9 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po
index 541ea8ab272..2a5380b61b4 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:52\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po
index d8be5ba784e..0cb31699420 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -448,12 +442,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -592,7 +580,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -739,6 +727,9 @@ 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 ""
@@ -868,9 +859,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -880,9 +868,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1054,9 +1039,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1381,9 +1363,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1447,6 +1426,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1594,6 +1576,9 @@ msgstr[2] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1606,6 +1591,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1681,9 +1669,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1729,9 +1714,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1756,6 +1738,9 @@ 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 ""
@@ -2107,9 +2092,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2125,12 +2107,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2251,9 +2227,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2302,6 +2275,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2461,15 +2437,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2722,12 +2698,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2764,6 +2734,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2776,12 +2749,39 @@ 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 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 ""
@@ -2791,12 +2791,24 @@ 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|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 ""
@@ -2827,18 +2839,39 @@ 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|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 ""
@@ -2848,6 +2881,9 @@ 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|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 ""
@@ -2878,9 +2914,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3754,6 +3808,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3769,13 +3826,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3817,9 +3880,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3835,9 +3895,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4207,6 +4264,9 @@ 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 ""
@@ -4282,9 +4342,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4351,9 +4408,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4384,6 +4438,9 @@ 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 ""
@@ -4462,12 +4519,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4507,37 +4579,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4546,22 +4615,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4618,9 +4687,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4816,15 +4882,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5359,7 +5416,7 @@ 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."
+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"
@@ -5398,6 +5455,9 @@ 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 ""
@@ -5584,7 +5644,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5737,7 +5797,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5767,9 +5827,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5875,12 +5932,21 @@ 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|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 ""
@@ -5908,22 +5974,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5938,15 +6010,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5971,9 +6049,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6370,9 +6445,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6430,9 +6502,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6493,6 +6562,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6508,6 +6580,9 @@ 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 ""
@@ -6532,9 +6607,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6661,9 +6733,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6679,6 +6748,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6694,6 +6766,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6766,7 +6841,7 @@ 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."
+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."
@@ -6934,6 +7009,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7168,9 +7249,15 @@ 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 ""
@@ -7189,6 +7276,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7258,6 +7348,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7480,6 +7573,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7546,6 +7642,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7573,9 +7672,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7762,6 +7858,12 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7966,6 +8068,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8023,13 +8128,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8038,6 +8143,9 @@ 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 ""
@@ -8059,12 +8167,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8128,13 +8230,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8146,7 +8248,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8170,6 +8272,12 @@ 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] ""
+msgstr[2] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8182,9 +8290,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8194,19 +8299,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8215,7 +8323,7 @@ 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}"
+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}."
@@ -8227,18 +8335,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
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 ""
@@ -8257,7 +8362,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8416,9 +8521,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8932,6 +9034,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8965,7 +9070,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9139,9 +9244,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9265,9 +9367,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9370,9 +9469,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9733,9 +9829,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9766,9 +9859,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9898,6 +9988,9 @@ 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 ""
@@ -10090,9 +10183,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10129,6 +10219,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10237,9 +10330,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10255,6 +10345,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10297,6 +10390,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10603,6 +10699,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11089,7 +11188,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11263,6 +11365,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11281,6 +11386,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11290,6 +11398,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11668,6 +11779,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11758,25 +11875,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11794,13 +11911,13 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12082,6 +12199,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12193,6 +12313,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12322,9 +12445,15 @@ 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 ""
@@ -12334,9 +12463,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12352,6 +12478,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12613,6 +12742,9 @@ 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 ""
@@ -12763,10 +12895,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13162,6 +13300,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13177,6 +13318,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13198,9 +13342,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+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 ""
@@ -13240,9 +13393,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13255,6 +13405,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13390,7 +13543,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13477,9 +13630,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13567,9 +13717,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13723,6 +13879,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13777,9 +13936,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13840,9 +13996,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13852,6 +14005,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13948,13 +14104,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13978,18 +14134,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14071,12 +14221,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14122,12 +14266,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14194,7 +14332,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14297,10 +14435,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14560,6 +14695,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14584,9 +14722,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14689,6 +14824,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14944,9 +15082,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15280,6 +15415,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15580,6 +15718,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15610,6 +15751,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15766,7 +15910,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16012,6 +16156,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16039,9 +16186,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16168,9 +16312,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16291,9 +16432,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16522,6 +16660,18 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16555,6 +16705,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16576,6 +16729,12 @@ 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 ""
@@ -16585,9 +16744,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16600,6 +16774,9 @@ 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 ""
@@ -16621,9 +16798,21 @@ 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 ""
@@ -16633,24 +16822,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16663,6 +16864,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16687,21 +16891,39 @@ 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 ""
@@ -16711,6 +16933,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16723,6 +16948,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16744,6 +16972,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16786,6 +17017,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16813,15 +17047,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16855,6 +17113,12 @@ 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 ""
@@ -16867,9 +17131,21 @@ 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 ""
@@ -16879,12 +17155,18 @@ 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 ""
@@ -16909,6 +17191,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16924,7 +17209,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17080,7 +17365,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17251,6 +17536,15 @@ 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 ""
@@ -18124,9 +18418,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18244,9 +18535,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18655,6 +18943,9 @@ 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 ""
@@ -18667,9 +18958,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18820,12 +19108,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18958,6 +19240,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18997,15 +19282,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19018,9 +19300,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19303,9 +19582,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19387,6 +19663,9 @@ 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 ""
@@ -19507,6 +19786,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19618,6 +19900,9 @@ 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 ""
@@ -19801,9 +20086,15 @@ 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 ""
@@ -19945,6 +20236,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20068,18 +20362,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20554,9 +20836,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20599,9 +20878,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20611,6 +20887,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20662,6 +20941,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20737,9 +21019,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21295,12 +21574,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21310,9 +21595,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21436,9 +21727,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21544,7 +21832,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21595,9 +21883,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21679,6 +21964,9 @@ 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 ""
@@ -21733,6 +22021,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21745,6 +22036,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22285,6 +22579,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22465,6 +22762,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22474,6 +22774,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22498,6 +22801,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22681,10 +22987,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22732,24 +23035,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22936,9 +23230,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22993,6 +23284,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23296,6 +23590,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23335,6 +23632,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23392,7 +23692,7 @@ 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 28px tall header logo"
+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."
@@ -23653,6 +23953,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23773,6 +24076,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24019,6 +24325,18 @@ 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 ""
@@ -24535,10 +24853,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24766,9 +25084,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24790,12 +25105,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24868,19 +25177,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24985,75 +25294,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25063,87 +25306,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25426,9 +25594,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25636,9 +25801,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25822,6 +25984,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25858,9 +26023,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25990,6 +26152,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26044,9 +26242,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26089,6 +26284,9 @@ 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 ""
@@ -26245,9 +26443,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26269,22 +26476,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26299,6 +26521,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26332,19 +26557,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26377,6 +26608,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26389,6 +26623,9 @@ 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 ""
@@ -26452,9 +26689,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26899,6 +27133,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26998,9 +27238,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27073,6 +27310,12 @@ 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 ""
@@ -27196,13 +27439,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27289,7 +27532,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27475,9 +27718,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27547,6 +27787,12 @@ 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 ""
@@ -28276,6 +28522,9 @@ 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 ""
@@ -28315,9 +28564,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28375,6 +28621,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28459,6 +28708,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28468,6 +28723,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28504,6 +28765,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28603,9 +28867,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29224,9 +29485,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29854,7 +30112,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30904,9 +31162,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30991,9 +31246,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31099,9 +31351,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31579,9 +31828,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31621,9 +31867,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31720,6 +31963,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31750,6 +31996,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31924,9 +32173,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31945,9 +32191,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31957,9 +32200,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31999,9 +32239,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32209,9 +32446,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32233,6 +32467,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32356,6 +32593,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32398,10 +32638,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32419,9 +32659,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32482,9 +32719,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32542,6 +32776,9 @@ 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|Group"
msgstr ""
@@ -32734,6 +32971,9 @@ 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 ""
@@ -32818,9 +33058,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32833,9 +33070,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33313,9 +33547,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33337,9 +33568,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33526,6 +33754,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33541,6 +33772,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33556,10 +33790,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33568,16 +33799,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33586,7 +33841,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33604,28 +33859,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33649,6 +33892,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33658,6 +33904,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33667,15 +33916,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33688,6 +33940,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33724,6 +33979,9 @@ 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 ""
@@ -33739,6 +33997,9 @@ 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 ""
@@ -33754,6 +34015,9 @@ 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 ""
@@ -33778,10 +34042,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33835,10 +34099,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34057,7 +34321,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34243,6 +34507,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34258,9 +34525,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34303,9 +34567,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34354,9 +34615,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34558,13 +34816,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34714,9 +34972,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34753,18 +35008,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34864,9 +35113,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35770,6 +36016,12 @@ 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 ""
@@ -36292,6 +36544,12 @@ 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 ""
@@ -36418,27 +36676,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36631,6 +36868,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36646,6 +36889,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36664,6 +36913,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36706,7 +36958,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36715,9 +36967,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36742,6 +36991,9 @@ 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 ""
@@ -36751,7 +37003,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36811,9 +37066,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36898,9 +37150,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37066,6 +37315,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37267,10 +37519,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37351,6 +37600,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37360,9 +37612,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37615,9 +37864,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37927,9 +38173,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38041,7 +38284,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38221,12 +38464,21 @@ 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 ""
@@ -38278,12 +38530,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38332,9 +38578,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38350,9 +38593,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38596,6 +38836,9 @@ 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 ""
@@ -38707,7 +38950,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38854,9 +39097,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39010,9 +39250,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39181,9 +39418,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39352,10 +39586,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39430,6 +39664,9 @@ 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 ""
@@ -39439,6 +39676,9 @@ 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 ""
@@ -39490,9 +39730,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39739,7 +39976,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39979,7 +40219,7 @@ 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."
+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."
@@ -40018,6 +40258,9 @@ 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 ""
@@ -40060,9 +40303,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40114,9 +40354,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40222,6 +40459,9 @@ 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 ""
@@ -40501,9 +40741,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40552,9 +40789,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40660,6 +40894,12 @@ 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 ""
@@ -40669,7 +40909,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40720,6 +40960,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40768,6 +41011,12 @@ 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 ""
@@ -40780,9 +41029,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40933,7 +41179,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41329,7 +41575,7 @@ 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."
+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."
@@ -41524,9 +41770,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42073,7 +42316,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42184,9 +42427,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42334,7 +42574,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42529,9 +42769,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42541,9 +42778,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42571,7 +42805,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42580,9 +42814,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42625,7 +42856,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42859,12 +43090,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42874,6 +43111,9 @@ 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 ""
@@ -42889,6 +43129,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42952,6 +43195,12 @@ 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] ""
+msgstr[2] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43048,7 +43297,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43219,6 +43468,9 @@ 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 ""
@@ -43594,6 +43846,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43924,15 +44179,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44026,9 +44281,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44083,6 +44335,15 @@ 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 ""
@@ -44221,6 +44482,9 @@ 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 ""
@@ -44947,7 +45211,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44959,6 +45223,12 @@ 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 ""
@@ -44968,6 +45238,12 @@ 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 ""
@@ -45046,9 +45322,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45091,9 +45364,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45205,9 +45475,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45355,6 +45622,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45370,9 +45640,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45388,6 +45655,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45448,9 +45721,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45583,6 +45853,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po
index 4708a83734b..56e2632cfdb 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:52\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -304,12 +304,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -448,12 +442,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -592,7 +580,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -739,6 +727,9 @@ 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 ""
@@ -868,9 +859,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -880,9 +868,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -1054,9 +1039,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1381,9 +1363,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1447,6 +1426,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1594,6 +1576,9 @@ msgstr[2] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1606,6 +1591,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1681,9 +1669,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1729,9 +1714,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1756,6 +1738,9 @@ 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 ""
@@ -2107,9 +2092,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -2125,12 +2107,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2251,9 +2227,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2302,6 +2275,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2461,15 +2437,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2722,12 +2698,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2764,6 +2734,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2776,12 +2749,39 @@ 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 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 ""
@@ -2791,12 +2791,24 @@ 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|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 ""
@@ -2827,18 +2839,39 @@ 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|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 ""
@@ -2848,6 +2881,9 @@ 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|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 ""
@@ -2878,9 +2914,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3754,6 +3808,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3769,13 +3826,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3817,9 +3880,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3835,9 +3895,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4207,6 +4264,9 @@ 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 ""
@@ -4282,9 +4342,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4351,9 +4408,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4384,6 +4438,9 @@ 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 ""
@@ -4462,12 +4519,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4507,37 +4579,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4546,22 +4615,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4618,9 +4687,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4816,15 +4882,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5359,7 +5416,7 @@ 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."
+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"
@@ -5398,6 +5455,9 @@ 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 ""
@@ -5584,7 +5644,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5737,7 +5797,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5767,9 +5827,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5875,12 +5932,21 @@ 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|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 ""
@@ -5908,22 +5974,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5938,15 +6010,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5971,9 +6049,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6370,9 +6445,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6430,9 +6502,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6493,6 +6562,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6508,6 +6580,9 @@ 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 ""
@@ -6532,9 +6607,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6661,9 +6733,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6679,6 +6748,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6694,6 +6766,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6766,7 +6841,7 @@ 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."
+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."
@@ -6934,6 +7009,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7168,9 +7249,15 @@ 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 ""
@@ -7189,6 +7276,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7258,6 +7348,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7480,6 +7573,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7546,6 +7642,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7573,9 +7672,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7762,6 +7858,12 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7966,6 +8068,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -8023,13 +8128,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -8038,6 +8143,9 @@ 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 ""
@@ -8059,12 +8167,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -8128,13 +8230,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8146,7 +8248,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8170,6 +8272,12 @@ 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] ""
+msgstr[2] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -8182,9 +8290,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8194,19 +8299,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8215,7 +8323,7 @@ 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}"
+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}."
@@ -8227,18 +8335,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
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 ""
@@ -8257,7 +8362,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8416,9 +8521,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8932,6 +9034,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8965,7 +9070,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9139,9 +9244,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9265,9 +9367,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9370,9 +9469,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9733,9 +9829,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9766,9 +9859,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9898,6 +9988,9 @@ 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 ""
@@ -10090,9 +10183,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -10129,6 +10219,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10237,9 +10330,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10255,6 +10345,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10297,6 +10390,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10603,6 +10699,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11089,7 +11188,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11263,6 +11365,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11281,6 +11386,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11290,6 +11398,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11668,6 +11779,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11758,25 +11875,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11794,13 +11911,13 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12082,6 +12199,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12193,6 +12313,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12322,9 +12445,15 @@ 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 ""
@@ -12334,9 +12463,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12352,6 +12478,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12613,6 +12742,9 @@ 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 ""
@@ -12763,10 +12895,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13162,6 +13300,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13177,6 +13318,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13198,9 +13342,18 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+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 ""
@@ -13240,9 +13393,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13255,6 +13405,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13390,7 +13543,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13477,9 +13630,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13567,9 +13717,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13723,6 +13879,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13777,9 +13936,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13840,9 +13996,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13852,6 +14005,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13948,13 +14104,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13978,18 +14134,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14071,12 +14221,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -14122,12 +14266,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14194,7 +14332,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14297,10 +14435,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14560,6 +14695,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14584,9 +14722,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14689,6 +14824,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14944,9 +15082,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15280,6 +15415,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15580,6 +15718,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15610,6 +15751,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15766,7 +15910,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16012,6 +16156,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -16039,9 +16186,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16168,9 +16312,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16291,9 +16432,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16522,6 +16660,18 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16555,6 +16705,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16576,6 +16729,12 @@ 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 ""
@@ -16585,9 +16744,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16600,6 +16774,9 @@ 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 ""
@@ -16621,9 +16798,21 @@ 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 ""
@@ -16633,24 +16822,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16663,6 +16864,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16687,21 +16891,39 @@ 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 ""
@@ -16711,6 +16933,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16723,6 +16948,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16744,6 +16972,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16786,6 +17017,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16813,15 +17047,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16855,6 +17113,12 @@ 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 ""
@@ -16867,9 +17131,21 @@ 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 ""
@@ -16879,12 +17155,18 @@ 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 ""
@@ -16909,6 +17191,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16924,7 +17209,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17080,7 +17365,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17251,6 +17536,15 @@ 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 ""
@@ -18124,9 +18418,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18244,9 +18535,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18655,6 +18943,9 @@ 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 ""
@@ -18667,9 +18958,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18820,12 +19108,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18958,6 +19240,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18997,15 +19282,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -19018,9 +19300,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19303,9 +19582,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19387,6 +19663,9 @@ 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 ""
@@ -19507,6 +19786,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19618,6 +19900,9 @@ 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 ""
@@ -19801,9 +20086,15 @@ 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 ""
@@ -19945,6 +20236,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -20068,18 +20362,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20554,9 +20836,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20599,9 +20878,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20611,6 +20887,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20662,6 +20941,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20737,9 +21019,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21295,12 +21574,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21310,9 +21595,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21436,9 +21727,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21544,7 +21832,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21595,9 +21883,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21679,6 +21964,9 @@ 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 ""
@@ -21733,6 +22021,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21745,6 +22036,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22285,6 +22579,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22465,6 +22762,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22474,6 +22774,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22498,6 +22801,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22681,10 +22987,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22732,24 +23035,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22936,9 +23230,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22993,6 +23284,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23296,6 +23590,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23335,6 +23632,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23392,7 +23692,7 @@ 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 28px tall header logo"
+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."
@@ -23653,6 +23953,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23773,6 +24076,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -24019,6 +24325,18 @@ 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 ""
@@ -24535,10 +24853,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24766,9 +25084,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24790,12 +25105,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24868,19 +25177,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24985,75 +25294,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25063,87 +25306,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25426,9 +25594,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25636,9 +25801,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25822,6 +25984,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25858,9 +26023,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25990,6 +26152,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -26044,9 +26242,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -26089,6 +26284,9 @@ 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 ""
@@ -26245,9 +26443,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26269,22 +26476,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26299,6 +26521,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26332,19 +26557,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26377,6 +26608,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26389,6 +26623,9 @@ 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 ""
@@ -26452,9 +26689,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26899,6 +27133,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26998,9 +27238,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27073,6 +27310,12 @@ 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 ""
@@ -27196,13 +27439,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27289,7 +27532,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27475,9 +27718,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27547,6 +27787,12 @@ 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 ""
@@ -28276,6 +28522,9 @@ 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 ""
@@ -28315,9 +28564,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28375,6 +28621,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28459,6 +28708,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28468,6 +28723,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28504,6 +28765,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28603,9 +28867,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29224,9 +29485,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29854,7 +30112,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30904,9 +31162,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30991,9 +31246,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -31099,9 +31351,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31579,9 +31828,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31621,9 +31867,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31720,6 +31963,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31750,6 +31996,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31924,9 +32173,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31945,9 +32191,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31957,9 +32200,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31999,9 +32239,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32209,9 +32446,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32233,6 +32467,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32356,6 +32593,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32398,10 +32638,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32419,9 +32659,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32482,9 +32719,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32542,6 +32776,9 @@ 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|Group"
msgstr ""
@@ -32734,6 +32971,9 @@ 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 ""
@@ -32818,9 +33058,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32833,9 +33070,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33313,9 +33547,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33337,9 +33568,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33526,6 +33754,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33541,6 +33772,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33556,10 +33790,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33568,16 +33799,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33586,7 +33841,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33604,28 +33859,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33649,6 +33892,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33658,6 +33904,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33667,15 +33916,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33688,6 +33940,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33724,6 +33979,9 @@ 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 ""
@@ -33739,6 +33997,9 @@ 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 ""
@@ -33754,6 +34015,9 @@ 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 ""
@@ -33778,10 +34042,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33835,10 +34099,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34057,7 +34321,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34243,6 +34507,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34258,9 +34525,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34303,9 +34567,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34354,9 +34615,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34558,13 +34816,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34714,9 +34972,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34753,18 +35008,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34864,9 +35113,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35770,6 +36016,12 @@ 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 ""
@@ -36292,6 +36544,12 @@ 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 ""
@@ -36418,27 +36676,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36631,6 +36868,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36646,6 +36889,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36664,6 +36913,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36706,7 +36958,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36715,9 +36967,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36742,6 +36991,9 @@ 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 ""
@@ -36751,7 +37003,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36811,9 +37066,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36898,9 +37150,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37066,6 +37315,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37267,10 +37519,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37351,6 +37600,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37360,9 +37612,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37615,9 +37864,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37927,9 +38173,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38041,7 +38284,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38221,12 +38464,21 @@ 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 ""
@@ -38278,12 +38530,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38332,9 +38578,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38350,9 +38593,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38596,6 +38836,9 @@ 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 ""
@@ -38707,7 +38950,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38854,9 +39097,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -39010,9 +39250,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -39181,9 +39418,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39352,10 +39586,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39430,6 +39664,9 @@ 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 ""
@@ -39439,6 +39676,9 @@ 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 ""
@@ -39490,9 +39730,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39739,7 +39976,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39979,7 +40219,7 @@ 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."
+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."
@@ -40018,6 +40258,9 @@ 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 ""
@@ -40060,9 +40303,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -40114,9 +40354,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -40222,6 +40459,9 @@ 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 ""
@@ -40501,9 +40741,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40552,9 +40789,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40660,6 +40894,12 @@ 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 ""
@@ -40669,7 +40909,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40720,6 +40960,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40768,6 +41011,12 @@ 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 ""
@@ -40780,9 +41029,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40933,7 +41179,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41329,7 +41575,7 @@ 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."
+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."
@@ -41524,9 +41770,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -42073,7 +42316,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42184,9 +42427,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42334,7 +42574,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42529,9 +42769,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42541,9 +42778,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42571,7 +42805,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42580,9 +42814,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42625,7 +42856,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42859,12 +43090,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42874,6 +43111,9 @@ 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 ""
@@ -42889,6 +43129,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42952,6 +43195,12 @@ 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] ""
+msgstr[2] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43048,7 +43297,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43219,6 +43468,9 @@ 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 ""
@@ -43594,6 +43846,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43924,15 +44179,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44026,9 +44281,6 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -44083,6 +44335,15 @@ 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 ""
@@ -44221,6 +44482,9 @@ 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 ""
@@ -44947,7 +45211,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44959,6 +45223,12 @@ 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 ""
@@ -44968,6 +45238,12 @@ 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 ""
@@ -45046,9 +45322,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45091,9 +45364,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -45205,9 +45475,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45355,6 +45622,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45370,9 +45640,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45388,6 +45655,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45448,9 +45721,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45583,6 +45853,9 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po
index 95c0abc7047..41818878502 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:52\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d grupp"
msgstr[1] "%d grupper"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d timme"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d sekund"
msgstr[1] "%d sekunder"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr "."
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr "Lägg till en rad"
msgid "Add a link"
msgstr "Lägg till en länk"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr "Katalognamn"
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po
index 8b563841425..dbabd25eb5f 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:15\n"
+"PO-Revision-Date: 2022-05-01 06:56\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/ta_IN/gitlab.po b/locale/ta_IN/gitlab.po
index 689b991ff9d..7ca337bfa30 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:12\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index c6bab9c14fe..33e79b08a8f 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] "%d grup"
msgstr[1] "%d grup"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d grup seçildi"
-msgstr[1] "%d grup seçildi"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d saat"
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] "%d saniye"
msgstr[1] "%d saniye"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d parça seçildi"
-msgstr[1] "%d parça seçildi"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ msgstr "%{edit_in_new_fork_notice} Tekrar bir dosya yüklemeyi deneyin."
msgid "%{emailPrefix}@company.com"
msgstr "%{emailPrefix}@sirket.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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr ""
@@ -781,9 +774,6 @@ msgstr "Bir %{group_level_name} grubunda %{level_name} izin verilmez."
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr "+%{approvers} onaylayan daha"
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 bayt"
@@ -1467,6 +1451,9 @@ msgstr[1] "%d yıl kaldı"
msgid "1-9 contributions"
msgstr "1-9 katkı"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 katkı"
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "İlk katkı!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 katkı"
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr "Satır ekle"
msgid "Add a link"
msgstr "Bağlantı ekle"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr "Yeni sorun ekle"
@@ -2175,6 +2150,9 @@ msgstr "Onay kuralı ekle"
msgid "Add approvers"
msgstr "Onaylayan ekle"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Kalın metin ekle"
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr "Ekle/kaldır"
-msgid "AddMember|Emails cannot be blank"
-msgstr "E-postalar boÅŸ olamaz"
-
msgid "AddMember|Invite email is invalid"
msgstr "Davet e-postası geçersiz"
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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "İstatistikler yüklenirken hata oluştu. Lütfen tekrar deneyin"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 "Yeni projeler için paylaşılan çalıştırıcıları etkinleştir"
+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 ""
@@ -2664,12 +2666,24 @@ 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|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr ""
msgid "AdminSettings|Let's Encrypt email"
msgstr "Let's Encrypt e-postası"
+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 ""
@@ -2700,18 +2714,39 @@ msgstr ""
msgid "AdminSettings|No required pipeline"
msgstr "Gerekli iş hattı yok"
+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 "Gerekli iş hattı yapılandırması"
+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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "Etkin Kullanıcılar"
@@ -3627,6 +3683,9 @@ msgstr "Tüm projeler"
msgid "All projects selected"
msgstr "Tüm projeler seçildi"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "Tüm konular çözüldü"
@@ -3642,14 +3701,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-msgstr "Hedef dala bağlanabilecek üyelerin işlemlerine izin verin."
+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 "Grup sahiplerinin LDAP ile ilgili ayarları yönetmesine izin ver"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr "Kullanıcıların erişim isteğinde bulunmalarına izin ver (görünür
msgid "Allowed"
msgstr "Ä°zin verildi"
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ msgstr "Dosyayı ayrıştırırken bir hata oluştu."
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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "Grup yolu doğrulanırken bir hata oluştu"
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr "Analizler"
-msgid "Analyze a review version of your web application."
-msgstr "Web uygulamanızın inceleme sürümünü analiz edin."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ msgstr "Devam eden baÅŸka bir iÅŸlem var"
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 "Anti-spam doÄŸrulama"
@@ -4334,12 +4393,27 @@ msgstr "Uygulama başarıyla güncellendi."
msgid "Application: %{name}"
msgstr "Uygulama: %{name}"
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr "Öneri uygulanıyor..."
msgid "Applying suggestions..."
msgstr "Öneriler uygulanıyor..."
-msgid "Approval Status"
-msgstr "Onay Durumu"
-
msgid "Approval rules"
msgstr "Onay kuralları"
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ msgstr "AÄŸustos"
msgid "Authenticate"
msgstr "Kimlik doÄŸrulama"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
+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"
@@ -5260,6 +5319,9 @@ msgstr "Kimlik Doğrulaması Başarısız"
msgid "Authentication Log"
msgstr "Kimlik Doğrulama Günlüğü"
+msgid "Authentication error: enable 2FA in your profile settings to continue using GitLab: %{mfa_help_page}"
+msgstr ""
+
msgid "Authentication failed: %{error_message}"
msgstr "Kimlik doğrulama başarısız oldu: %{error_message}"
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr "Genel Bakış"
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Korumalı dallar %{project_settings_link} bağlantısından yönetilebilir."
-
msgid "Branches|Show active branches"
msgstr "Etkin dalları göster"
@@ -6289,9 +6363,6 @@ msgstr "akıştan ayrılmış"
msgid "Branches|merged"
msgstr "birleÅŸtirildi"
-msgid "Branches|project settings"
-msgstr "proje ayarları"
-
msgid "Branches|protected"
msgstr "korumalı"
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr "CI ayarları"
msgid "CI variables"
msgstr "CI deÄŸiÅŸkenleri"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI, yukarda belirtilen kimlik bilgileri ile çalışacak."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6538,6 +6609,9 @@ msgstr "CI/CD ayarları"
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr "Ä°ptal"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ msgstr ""
msgid "Changed assignee(s)."
msgstr "Vekil(ler) deÄŸiÅŸtirildi."
+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 ""
@@ -7047,6 +7136,9 @@ 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 public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr "Tekrar kontrol et"
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr "Alt epik mevcut deÄŸil."
msgid "Child epic doesn't exist."
msgstr "Alt epik mevcut deÄŸil."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr "Herhangi bir renk seçin."
msgid "Choose file…"
msgstr "Dosya seçin…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ msgstr ""
msgid "Clear"
msgstr "Temizle"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "Virgülle ayrılmış, örneğin '1.1.1.1, 2.2.2.0/24'"
-
msgid "Command"
msgstr "Komut"
@@ -9119,9 +9222,6 @@ msgstr "İlgili birleştirme isteği bulunamadı"
msgid "Committed by"
msgstr "Ä°ÅŸleyen:"
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr "Topluluk forumu"
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr "Bağlantı başarısız"
msgid "Connection timed out"
msgstr "Bağlantı zaman aşımına uğradı"
-msgid "Connection timeout"
-msgstr "Bağlantı zaman aşımı"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr "Devam"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Sonraki adıma devam et"
@@ -10088,9 +10182,6 @@ msgstr "Harici kimliÄŸi panoya kopyala"
msgid "Copy ID"
msgstr "KimliÄŸi kopyala"
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr "KRB5 klon URL'sini kopyala"
@@ -10106,6 +10197,9 @@ msgstr "URL'yi kopyala"
msgid "Copy branch name"
msgstr "Dal adını kopyala"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr "Bağlantıyı kopyala"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Bağlantıyı grafiğe kopyala"
@@ -10454,6 +10551,9 @@ msgstr "Dal oluÅŸtur"
msgid "Create commit"
msgstr "Ä°ÅŸlem oluÅŸtur"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,8 +11040,11 @@ msgstr "Tercihler"
msgid "CurrentUser|Start an Ultimate trial"
msgstr "Ultimate denemesini baÅŸlat"
-msgid "CurrentUser|Upgrade"
-msgstr "Yükselt"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "Özel Nitelikler"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr "Silinen sohbet takma adı: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ msgstr ""
msgid "Deployment Frequency"
msgstr "Dağıtım Sıklığı"
+msgid "Deployment Target|%{linkStart}How to provision or deploy to Kubernetes clusters from GitLab?%{linkEnd}"
+msgstr ""
+
msgid "Deployment Target|Project deployment target (optional)"
msgstr ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
-msgid "Deprecations|The metrics, 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}."
+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 ""
+
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 "Kullanılabilir dosya adı yok"
+msgid "Diffs|Previous 20 lines"
+msgstr ""
+
msgid "Diffs|Show %{unfoldCount} lines"
msgstr ""
@@ -13077,9 +13231,6 @@ msgstr "Dizin adı"
msgid "Disable"
msgstr "EtkisizleÅŸtir"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ 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"
@@ -13226,8 +13380,8 @@ msgstr "Oluşturulan dosyayı görüntüle"
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
-msgstr "Sorunlarda zaman izlemeyi yalnızca toplam saat olarak görüntüleyin."
+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 ""
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr "Farklı indir"
-
msgid "Download codes"
msgstr "Kodları indir"
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr "BitiÅŸ tarihi"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr "Sorunları düzenle"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr "Görünen e-posta adı"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr "E-posta yaması"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "E-posta gönderildi"
@@ -13784,13 +13941,13 @@ msgstr "BoÅŸ dosya"
msgid "Enable"
msgstr "EtkinleÅŸtir"
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Entegrasyonu etkinleÅŸtir"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "İki aşamalı doğrulamayı etkinleştir"
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Epik"
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr "Epiklerin Yol Haritası"
-msgid "Epics and Issues"
-msgstr "Epikler ve Sorunlar"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Epikler, proje portföyünüzü daha verimli ve daha az çaba ile yönetmenizi sağlar"
@@ -14524,6 +14661,9 @@ msgstr "süresi dolmuş"
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Özellik Bayrakları"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Dosya şablonları"
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr "Daha fazla bilgi için şu adrese gidin: "
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "Åžifrenizi mi unuttunuz?"
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr "İsme göre filtrele"
msgid "Geo|Filter by status"
msgstr "Duruma göre filtrele"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo Durumu"
+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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 "Asla"
msgid "Geo|Next sync scheduled at"
msgstr "Sonraki senkronizasyon planlandı"
+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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr "Senkronizasyon bekliyor"
msgid "Geo|Pending verification"
msgstr "DoÄŸrulama bekliyor"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Tekrar indir"
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Yeniden senkronize et"
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr "%{timeAgo} güncellendi"
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ msgstr ""
msgid "Gitea Import"
msgstr "Gitea içe aktarma"
+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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr "Sık ziyaret edilenler"
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr "Merhaba %{username}!"
@@ -18648,12 +18936,6 @@ msgstr "Temizlik hizmeti başarıyla başlatıldı"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr "Olay"
msgid "IncidentManagement|Incidents"
msgstr "Olaylar"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Düşük - S4"
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr "Varsayılan ayarları kullan"
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Aralık Deseni"
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Ayrıl"
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr "%{fileLockUserName} tarafından kilitlendi"
msgid "Locked the discussion."
msgstr "Tartışma kilitlendi."
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Kilitler, belirli bir dosyayı veya klasörü kilitleme yeteneği sağlar."
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr "BirleÅŸtirme isteÄŸi"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 "Metrikler"
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr "Etiket Yok"
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr "Bu dosya türü için önizleme yok"
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr "Ön izlenecek bir şey yok."
@@ -25795,6 +25957,42 @@ msgstr "Bildirimler açık"
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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "Kas"
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ msgstr ""
msgid "PipelineCharts|Total:"
msgstr "Toplam:"
+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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr "Lütfen devam etmek için %{phrase_code} yazın ya da iptal etmek için
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ msgstr "Bir projenin genel bakış sayfasında hangi içeriği görmek istediği
msgid "Preferences|Choose what content you want to see on your homepage."
msgstr "Ana sayfanızda görmek istediğiniz içeriği seçin."
+msgid "Preferences|Color for added lines"
+msgstr ""
+
+msgid "Preferences|Color for removed lines"
+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."
@@ -28271,6 +28526,12 @@ 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 colors of removed and added lines in diffs."
+msgstr ""
+
+msgid "Preferences|Diff colors"
+msgstr ""
+
msgid "Preferences|Display time in 24-hour format"
msgstr "Saati 24 saatlik biçimde görüntüle"
@@ -28307,6 +28568,9 @@ msgstr "%{min} ile %{max} arasında bir sayı olmalıdır"
msgid "Preferences|Navigation theme"
msgstr "Gezinme teması"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "Projeye genel bakış içeriği"
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr "Önceki çözülmemiş tartışma"
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr "Proje dışa aktarım silinemedi."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "Projeyi dışa aktarma etkin"
-
msgid "Project export has been deleted."
msgstr "Proje dışa aktarım silinmiş."
@@ -29657,8 +29915,8 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-msgstr "Kullanıcılar, yalnızca kendi doğrulanmış e-postalarından biriyle taahhüt edilen bu depoya taahhütte bulunabilir."
+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 ""
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "Son aramalar"
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr "Bu %{quick_action_target} yeniden açıldı."
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "DeÄŸiÅŸtir"
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr "EriÅŸim Talebi"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-msgstr "Profil Ä°stekleri"
-
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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr "Yol haritası"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Rol"
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr "Grup veya proje seç"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr "Projeleri seç"
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ msgstr "Servis Masası"
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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "Adınızın ve profil resminizin yanında bir gösterge belirir"
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr "Sürüm notları"
msgid "TagsPage|Repository has no tags yet."
msgstr "Depo için henüz etiket eklenmemiş."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Etiketler"
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr "Kullanıcı iş hattı dakikaları sıfırlanırken bir hata oluştu."
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr "Son işlemden birleştirmeye kadar geçen süre"
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr "ÅŸimdi"
msgid "Timeago|right now"
msgstr "hemen ÅŸimdi"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 "Tekrar dene"
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr "Tür"
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr "%{updated_by} tarafından %{updated_at} zamanında güncellendi"
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr "Güncelleniyor"
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr "Mevcut dönem kullanımı"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Parçacıklar"
@@ -40532,6 +40775,12 @@ msgstr "Kullanım Kotaları"
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 "Grup kaynaklarının gruptaki projeler arasında %{strong_start}%{group_name}%{strong_end} kullanılması"
@@ -40544,9 +40793,6 @@ msgstr "Projelerinizdeki kaynakların kullanımı"
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "Kullanım tarihi:"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "DoÄŸrulama durumu"
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr "Epik kaldırma yolunu belirleyemedik"
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr "İş ünvanınız nedir? (isteğe bağlı)"
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr "arÅŸivlenmiÅŸ"
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,8 +44954,8 @@ msgid_plural "merge requests"
msgstr[0] "birleÅŸtirme isteÄŸi"
msgstr[1] "birleÅŸtirme isteÄŸi"
-msgid "merged %{timeAgo}"
-msgstr "%{timeAgo} birleÅŸtirildi"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr ""
@@ -44703,6 +44966,12 @@ msgstr "eksik"
msgid "most recent deployment"
msgstr "en son dağıtım"
+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 "1 iÅŸlemi birleÅŸtir"
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr "Dalı kontrol et"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr "E-posta yamaları"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "Web IDE'de aç"
-msgid "mrWidget|Plain diff"
-msgstr "Düz değişiklik"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "dikkat gerekli"
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr "yeni birleÅŸtirme isteÄŸi"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr "yok"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "bulunamadı"
@@ -45188,9 +45460,6 @@ msgstr "yorum bekliyor"
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] "cevap"
msgstr[1] "cevap"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index d30657ba8dc..c8764b8b94e 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -14,7 +14,7 @@ msgstr ""
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr " %{start} до %{end}"
@@ -170,10 +170,10 @@ msgstr[3] "%d затверджуючих оÑіб (ви затвердили)"
msgid "%d assigned issue"
msgid_plural "%d assigned issues"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d призначена задача"
+msgstr[1] "%d призначені задачі"
+msgstr[2] "%d призначених задач"
+msgstr[3] "%d призначених задач"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -343,13 +343,6 @@ msgstr[1] "%d групи"
msgstr[2] "%d груп"
msgstr[3] "%d груп"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d група обрана"
-msgstr[1] "%d групи обрано"
-msgstr[2] "%d груп обрано"
-msgstr[3] "%d груп обрано"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d година"
@@ -443,10 +436,10 @@ msgstr[3] "ще %d коментарів"
msgid "%d new license"
msgid_plural "%d new licenses"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d нова ліцензіÑ"
+msgstr[1] "%d нові ліцензії"
+msgstr[2] "%d нових ліцензій"
+msgstr[3] "%d нових ліцензій"
msgid "%d open issue"
msgid_plural "%d open issues"
@@ -511,13 +504,6 @@ msgstr[1] "%d Ñекунди"
msgstr[2] "%d Ñекунд"
msgstr[3] "%d Ñекунд"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "Виділено %d Ñегмент"
-msgstr[1] "Виділено %d Ñегменти"
-msgstr[2] "Виділено %d Ñегментів"
-msgstr[3] "Виділено %d Ñегментів"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -576,31 +562,31 @@ msgstr[3] "%d вразливоÑтей відхилено"
msgid "%d vulnerability set to confirmed"
msgid_plural "%d vulnerabilities set to confirmed"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d вразливіÑÑ‚ÑŒ підтверджена"
+msgstr[1] "%d вразливоÑÑ‚Ñ– підтверджено"
+msgstr[2] "%d вразливоÑтей підтверджено"
+msgstr[3] "%d вразливоÑтей підтверджено"
msgid "%d vulnerability set to dismissed"
msgid_plural "%d vulnerabilities set to dismissed"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d вразливіÑÑ‚ÑŒ відхилена"
+msgstr[1] "%d вразливоÑÑ‚Ñ– відхилено"
+msgstr[2] "%d вразливоÑтей відхилено"
+msgstr[3] "%d вразливоÑтей відхилено"
msgid "%d vulnerability set to needs triage"
msgid_plural "%d vulnerabilities set to needs triage"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d вразливіÑÑ‚ÑŒ потребує ÑортуваннÑ"
+msgstr[1] "%d вразливоÑÑ‚Ñ– потребують ÑортуваннÑ"
+msgstr[2] "%d вразливоÑтей потребує ÑортуваннÑ"
+msgstr[3] "%d вразливоÑтей потребує ÑортуваннÑ"
msgid "%d vulnerability set to resolved"
msgid_plural "%d vulnerabilities set to resolved"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d вразливіÑÑ‚ÑŒ вирішена"
+msgstr[1] "%d вразливоÑÑ‚Ñ– вирішено"
+msgstr[2] "%d вразливоÑтей вирішено"
+msgstr[3] "%d вразливоÑтей вирішено"
msgid "%d warning found:"
msgid_plural "%d warnings found:"
@@ -673,8 +659,8 @@ msgstr "%{codeStart}типи%{codeEnd} Ñ” заÑтарілими та будут
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}ЗамаÑковано:%{code_close} Сховано в журналах завдань. Повинні відповідати вимогам до маÑкуваннÑ."
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}Захищений:%{code_close} Відкритий лише захищеними гілками або тегами."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "%{commit_author_link} автор %{commit_authored_timeago}"
@@ -696,7 +682,7 @@ msgid "%{completedWeight} of %{totalWeight} weight completed"
msgstr "%{completedWeight} з %{totalWeight} ваги виконано"
msgid "%{completed} of %{total} issues closed"
-msgstr ""
+msgstr "%{completed} з %{total} задач закрито"
msgid "%{completed} of %{total} weight completed"
msgstr ""
@@ -826,6 +812,9 @@ msgstr "%{edit_in_new_fork_notice} Спробуйте завантажити Ñ„Ð
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "Ще %{extra} наÑтупних конвеєрів"
@@ -955,9 +944,6 @@ msgstr "%{level_name} не дозволено в %{group_level_name} групі.
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "%{level_name} не допуÑкаєтьÑÑ, оÑкільки проєкт-джерело цього форку має нижчу видиміÑÑ‚ÑŒ."
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}Докладніше:%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr "%{link_start}Додайте ліцензію%{link_end} Ñку ви отримали від GitLab Inc."
@@ -967,9 +953,6 @@ 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 "%{link_start}Почніть заголовок з %{draft_snippet}%{link_end}, щоб запобігти злиттю чернетки запиту на злиттÑ, перш ніж він буде готовий."
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}Яку інформацію збирає ÐºÐ¾Ð¼Ð¿Ð°Ð½Ñ–Ñ GitLab Inc.?%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow}та %{awardsListLength} ще"
@@ -1037,7 +1020,7 @@ msgid "%{name}, confirm your email address now!"
msgstr "%{name}, підтвердіть Ñвою адреÑу електронної пошти зараз!"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}: %{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -1065,7 +1048,7 @@ msgid "%{openedIssues} open, %{closedIssues} closed"
msgstr "%{openedIssues} відкрито, %{closedIssues} закрито"
msgid "%{percentage}%% issues closed"
-msgstr ""
+msgstr "%{percentage}%% задач закрито"
msgid "%{percentage}%% weight completed"
msgstr "%{percentage}%% вага завершено"
@@ -1114,7 +1097,7 @@ msgid "%{retryButtonStart}Try again%{retryButtonEnd} or %{newFileButtonStart}att
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 ""
+msgstr "%{rotation} було перераховано з іншими учаÑниками. Будь лаÑка, переглÑньте нове Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ %{rotation_link}. РекомендуєтьÑÑ Ð·Ð²â€™ÑзатиÑÑ Ð· поточним відповідачем на виклик, щоб забезпечити безперервне Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ."
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} було перераховано з іншими учаÑниками. Будь лаÑка, переглÑньте нове Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ %{rotation}. РекомендуєтьÑÑ Ð·Ð²â€™ÑзатиÑÑ Ð· поточним відповідачем на виклик, щоб забезпечити безперервне Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ."
@@ -1145,9 +1128,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}Яку інформацію надає GitLab Inc.?%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1271,7 +1251,7 @@ msgid "%{timebox_name} should belong either to a project or a group."
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} повинні мати дату початку Ñ– завершеннÑ"
@@ -1483,9 +1463,6 @@ msgstr[1] "+%d додатково"
msgstr[2] "+%d додатково"
msgstr[3] "+%d додатково"
-msgid "+%{approvers} more approvers"
-msgstr "+ ще%{approvers} більше затверджуючих оÑіб"
-
msgid "+%{extra} more"
msgstr "+%{extra} більше"
@@ -1551,6 +1528,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 байт"
@@ -1721,6 +1701,9 @@ msgstr[3] "ЗалишилоÑÑ %d років"
msgid "1-9 contributions"
msgstr "1-9 внеÑків"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 внеÑків"
@@ -1733,6 +1716,9 @@ msgstr "192.168.0.0/24 або 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "Перший внеÑок!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 внеÑків"
@@ -1808,9 +1794,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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"
@@ -1851,14 +1834,11 @@ msgid "A limit of %{ci_project_subscriptions_limit} subscriptions to or from a p
msgstr "Ліміт %{ci_project_subscriptions_limit} підпиÑки на або з заÑтоÑованого проєкту."
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 merge request hasn't yet been merged"
-msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‰Ðµ не злито"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr "Створено новий конвеєр Auto DevOps, детальну інформацію можна знайти на Ñторінці Конвеєри"
@@ -1883,6 +1863,9 @@ 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 "Сайт на HTML, Ñкий викориÑтовує Netlify Ð´Ð»Ñ CI/CD заміÑÑ‚ÑŒ GitLab, але вÑе ще з уÑіма іншими чудовими функціÑми GitLab"
@@ -2052,10 +2035,10 @@ msgid "AWS Secret Access Key"
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 "Помилка ÑервіÑу AWS: %{error}"
@@ -2073,7 +2056,7 @@ msgid "About this feature"
msgstr "Про цю функцію"
msgid "About your company"
-msgstr ""
+msgstr "Про вашу компанію"
msgid "Abuse Reports"
msgstr "Звіти про зловживаннÑ"
@@ -2234,9 +2217,6 @@ msgstr "Виправте Ñвої конвеєри, підтвердивши ÑÐ
msgid "AccountValidation|I'll bring my own runners"
msgstr "Я зареєÑтрую мої влаÑні runner'и"
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 "Щоб викориÑтовувати безкоштовні хвилини CI/CD на Ñпільних Runner'ах, вам потрібно підтвердити Ñвій обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð° допомогою одного з наших варіантів підтвердженнÑ. Якщо ви віддаєте перевагу цьому не робити, ви можете запуÑкати конвеєри, додавши влаÑні runner'и та вимкнувши Ñпільні runner'и Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ проєкту."
@@ -2252,12 +2232,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr "СкаÑувати підпиÑку"
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr "Ви можете %{unsubscribe_link} у будь-Ñкий чаÑ"
-
msgid "Acknowledge"
msgstr ""
@@ -2378,9 +2352,6 @@ msgstr "Додати Ñ€Ñдок"
msgid "Add a link"
msgstr "Додати поÑиланнÑ"
-msgid "Add a link to Grafana"
-msgstr "Додати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Grafana"
-
msgid "Add a new issue"
msgstr "Додати нову задачу"
@@ -2429,6 +2400,9 @@ msgstr "Додати правило затвердженнÑ"
msgid "Add approvers"
msgstr "Додати затверджуючих оÑіб"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "Додати жирний текÑÑ‚"
@@ -2588,15 +2562,15 @@ msgstr "Додати раніше злиті коміти"
msgid "AddContextCommits|Add/remove"
msgstr "Додати/видалити"
-msgid "AddMember|Emails cannot be blank"
-msgstr "ÐдреÑа електронної пошти не може бути порожньою"
-
msgid "AddMember|Invite email is invalid"
msgstr "ÐдреÑа електронної пошти Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð½ÐµÐ´Ñ–Ð¹Ñна"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "Перевищено ліміт запрошень: %{daily_invites} на день"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "ВідÑутнє джерело запрошеннÑ."
@@ -2679,7 +2653,7 @@ msgid "Adds this %{issuable_type} as related to the %{issuable_type} it was crea
msgstr ""
msgid "Adjust how frequently the GitLab UI polls for updates."
-msgstr ""
+msgstr "Ðалаштувати чаÑтоту оновлень інтерфейÑу Gitlab."
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 "Ðалаштуйте фільтри / умови пошуку, наведені вище. Якщо ви думаєте, що це помилка, переглÑньте документацію на Ñторінці %{linkStart}Geo Troubleshooting%{linkEnd}, щоб отримати додаткову інформацію."
@@ -2849,12 +2823,6 @@ msgstr "Ви збираєтеÑÑ Ð·ÑƒÐ¿Ð¸Ð½Ð¸Ñ‚Ð¸ вÑÑ– завданнÑ. Ви
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "Помилка при завантаженні ÑтатиÑтики. Будь лаÑка, Ñпробуйте знову"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr "Визначте ваш набір проєктних міток за замовчуваннÑм"
@@ -2886,11 +2854,14 @@ msgid "AdminSettings|Auto DevOps domain"
msgstr "Домен Auto DevOps"
msgid "AdminSettings|CI/CD limits"
-msgstr ""
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ CI/CD"
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "Ðалаштувати Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "Вимкнути токен Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"
@@ -2903,12 +2874,39 @@ 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 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 "Увімкнути загальні runner'и Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… проєктів"
+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 "Токен доÑтупу до каналів"
@@ -2918,12 +2916,24 @@ msgstr "Я прочитав Ñ– погоджуюÑÑŒ %{link_start}умовами
msgid "AdminSettings|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 "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "Зберегти оÑтанні артефакти Ð´Ð»Ñ Ð²ÑÑ–Ñ… завдань в оÑтанніх уÑпішних конвеєрах"
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 ""
+
+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 "МакÑимальна триваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Git операцій, коли 2FA увімкнена."
@@ -2954,16 +2964,37 @@ msgstr "Ðові змінні CI / CD у проєктах та групах за
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 "ЗахиÑтити змінні CI/CD за замовчуваннÑм"
+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|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "AdminSettings|Save %{name} limits"
+msgstr "Зберегти %{name} обмежень"
+
+msgid "AdminSettings|Search with Elasticsearch enabled"
msgstr ""
msgid "AdminSettings|Select a CI/CD template"
@@ -2975,6 +3006,9 @@ 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|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 "ТриваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— з Git, коли 2FA увімкнено (хвилини)"
@@ -3005,9 +3039,27 @@ 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 "Шаблон Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾Ñ— конфігурації конвеєра може бути одним із шаблонів, наданих GitLab, або інший шаблон доданий до репозиторію шаблонів інÑтанÑу. %{link_start}Як Ñтворити шаблон інÑтанÑу?%{link_end}"
+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|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 "AdminStatistics|Active Users"
msgstr "Ðктивні кориÑтувачі"
@@ -3480,7 +3532,7 @@ msgid "Akismet helps prevent the creation of spam issues in public projects."
msgstr "Akismet допомагає запобігти Ñтворенню проблем зі Ñпамом у публічних проєктах."
msgid "Alert"
-msgstr ""
+msgstr "ПопередженнÑ"
msgid "AlertManagement|Acknowledged"
msgstr "Підтверджено"
@@ -3726,7 +3778,7 @@ msgid "AlertSettings|Sample payload has been parsed. You can now map the fields.
msgstr "Зразок кориÑного Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾. Тепер ви можете відобразити полÑ."
msgid "AlertSettings|Save & create test alert"
-msgstr ""
+msgstr "Зберегти та Ñтворити теÑтове попередженнÑ"
msgid "AlertSettings|Save integration"
msgstr "Зберегти інтеграцію"
@@ -3881,6 +3933,9 @@ msgstr "Ð’ÑÑ– проєкти"
msgid "All projects selected"
msgstr "Ð’ÑÑ– проєкти вибрані"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "УÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð¾"
@@ -3896,14 +3951,20 @@ msgstr "Ð’ÑÑ– кориÑтувачі з картами, що збігаютьÑ
msgid "Allow \"%{group_name}\" to sign you in"
msgstr "Дозволити вхід через \"%{group_name}\""
-msgid "Allow access to members of the following group"
+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 "Дозволити доÑтуп учаÑникам цієї групи"
+
msgid "Allow access to the following IP addresses"
msgstr "Дозволити доÑтуп до таких IP-адреÑ"
-msgid "Allow commits from members who can merge to the target branch."
-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 "Дозволити влаÑникам груп керувати налаштуваннÑми LDAP"
@@ -3944,9 +4005,6 @@ msgstr "Дозволити підгрупам вÑтановлювати влаÑ
msgid "Allow this key to push to this repository"
msgstr "Дозволити відправлÑти ключ до цього репозиторію"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr "Дозволити цьому додатковому Ñайту копіювати контент в об'єктному Ñховищі"
-
msgid "Allow use of licensed EE features"
msgstr "Дозволити викориÑÑ‚Ð°Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… функцій EE"
@@ -3962,9 +4020,6 @@ msgstr "Дозволити кориÑтувачам запрошувати доÑ
msgid "Allowed"
msgstr "Дозволено"
-msgid "Allowed Geo IP"
-msgstr "Дозволений гео IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "Дозволені Ñимволи: +, 0-9, - Ñ– пробіли."
@@ -4334,6 +4389,9 @@ 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 "Помилка при видаленні епіків."
@@ -4393,10 +4451,10 @@ msgid "An error occurred while updating assignees."
msgstr ""
msgid "An error occurred while updating configuration."
-msgstr ""
+msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
msgid "An error occurred while updating labels."
-msgstr ""
+msgstr "ВідбулаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº."
msgid "An error occurred while updating the comment"
msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"
@@ -4410,9 +4468,6 @@ msgstr "Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ Ñповіщен
msgid "An error occurred while uploading the file. Please try again."
msgstr "Під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Будь лаÑка Ñпробуйте ще раз."
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "Помилка при перевірці шлÑху групи"
@@ -4479,14 +4534,11 @@ msgstr "СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка."
msgid "Analytics"
msgstr "Ðналітика"
-msgid "Analyze a review version of your web application."
-msgstr "Проаналізуйте верÑÑ–ÑŽ Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ оглÑду вашого веб-заÑтоÑунка."
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "Проаналізуйте ваші залежноÑÑ‚Ñ– на предмет відомих вразливоÑтей."
msgid "Analyze your infrastructure as code configuration files for known vulnerabilities."
-msgstr ""
+msgstr "Проаналізуйте Ñвою інфраÑтруктуру у виглÑді файлів конфігурації коду щодо відомих вразливоÑтей."
msgid "Analyze your source code and git history for secrets."
msgstr "Проаналізуйте Ñвій вихідний код та Ñ–Ñторію git на предмет Ñекретів."
@@ -4512,6 +4564,9 @@ 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 "Перевірка проти Ñпаму"
@@ -4570,7 +4625,7 @@ msgid "Application ID"
msgstr "Ідентифікатор заÑтоÑунку"
msgid "Application limits saved successfully"
-msgstr ""
+msgstr "Ліміти заÑтоÑунку уÑпішно збережено"
msgid "Application settings saved successfully"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°ÑтоÑунку уÑпішно збережено"
@@ -4590,12 +4645,27 @@ msgstr "ЗаÑтоÑунок було уÑпішно оновлено."
msgid "Application: %{name}"
msgstr "Додаток: %{name}"
-msgid "ApplicationSettings|After sign up text"
-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] ""
@@ -4637,38 +4707,35 @@ msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації"
-msgid "ApplicationSettings|Enable domain denylist 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|Enable email restrictions for sign-ups"
+msgstr ""
msgid "ApplicationSettings|Enter denylist manually"
msgstr "Введіть ÑпиÑок заборони вручну"
-msgid "ApplicationSettings|Markdown enabled"
-msgstr "Markdown увімкнено"
-
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "Мінімальна довжина Ð¿Ð°Ñ€Ð¾Ð»Ñ (кількіÑÑ‚ÑŒ Ñимволів)"
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+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|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
-msgstr "Як тільки інÑÑ‚Ð°Ð½Ñ Ð´Ð¾ÑÑгне Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð° кількіÑÑ‚ÑŽ кориÑтувачів, будь-Ñкий доданий або запитуваний доÑтуп кориÑтувач повинен бути Ñхвалений адмініÑтратором. Залишіть поле порожнім на необмежений термін."
-
msgid "ApplicationSettings|Require admin approval for new sign-ups"
msgstr "Потрібне ÑÑ…Ð²Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… реєÑтрацій"
-msgid "ApplicationSettings|Restricts sign-ups for email addresses that match the given regex. See the %{linkStart}supported syntax%{linkEnd} for more information."
-msgstr "Обмежує реєÑтрацію Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти, що відповідають заданому регулÑрному виразу. Додаткову інформацію див. у підтримуваному ÑинтакÑиÑÑ– %{linkStart}%{linkEnd}."
+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 "Див.%{linkStart}Правила політики щодо паролів%{linkEnd} GitLab"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
+msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr ""
@@ -4676,24 +4743,24 @@ 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) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+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|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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, any user visiting %{host} will be able to create an account."
-msgstr "Якщо цей параметр увімкнено, будь-Ñкий кориÑтувач, Ñкий відвідав %{host}, зможе Ñтворити обліковий запиÑ."
-
msgid "ApplicationSettings|domain.com"
msgstr "domain.com"
@@ -4749,9 +4816,6 @@ msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ—..."
msgid "Applying suggestions..."
msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ð¹..."
-msgid "Approval Status"
-msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
-
msgid "Approval rules"
msgstr "Правила затвердженнÑ"
@@ -4951,15 +5015,6 @@ 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 "Цей параметр налаштовано в %{groupName} Ñ– може бути змінене в налаштуваннÑÑ… групи лише адмініÑтратором або влаÑником групи."
-msgid "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr "ДотримуєтьÑÑ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ñƒ обов'Ñзків"
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr "Принаймні одне правило не дотримуєтьÑÑ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ñƒ обов'Ñзків"
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr "Ðе дотримуєтьÑÑ Ñ€Ð¾Ð·Ð¿Ð¾Ð´Ñ–Ð»Ñƒ обов'Ñзків"
-
msgid "Approvals are optional."
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²'Ñзкові."
@@ -5045,7 +5100,7 @@ msgid "Are you sure that you want to archive this project?"
msgstr "Ви впевнені, що хочете заархівувати цей проєкт?"
msgid "Are you sure that you want to destroy %{application}"
-msgstr ""
+msgstr "Ви впевнені, що бажаєте знищити %{application}"
msgid "Are you sure that you want to unarchive this project?"
msgstr "Ви впевнені, що хочете розархівувати цей проєкт?"
@@ -5497,8 +5552,8 @@ 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."
-msgstr "Ðутентифікувати ключі кориÑтувача SSH без додаткового налаштуваннÑ. Ви можете покращити продуктивніÑÑ‚ÑŒ GitLab, Ñкщо заміÑÑ‚ÑŒ цього викориÑтовувати базу даних GitLab."
+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 "Ðвтентифікувати за допомогою GitHub"
@@ -5536,6 +5591,9 @@ 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 "Помилка автентифікації: %{error_message}"
@@ -5588,7 +5646,7 @@ msgid "Authorize %{link_to_client} to use your account?"
msgstr "ÐвторизуватиÑÑ %{link_to_client} викориÑтовуючи ваш аккаунт?"
msgid "Authorize %{user} to use your account?"
-msgstr ""
+msgstr "ÐвторизуватиÑÑ %{user}, щоб викориÑтовувати ваш обліковий запиÑ?"
msgid "Authorized %{new_chat_name}"
msgstr "Ðвторизовано %{new_chat_name}"
@@ -5722,8 +5780,8 @@ msgstr "ДоÑтупний ідентифікатор"
msgid "Available group runners: %{runners}"
msgstr "ДоÑтупна група runner'ів: %{runners}"
-msgid "Available runners: %{runners}"
-msgstr "ДоÑтупні Runner'и: %{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "ДоÑтупні Ñпільні Runner'и:"
@@ -5875,8 +5933,8 @@ msgstr "Заголовок повідомленнÑ"
msgid "Based on"
msgstr "Ðа оÑнові"
-msgid "Basic information"
-msgstr "ОÑновна інформаціÑ"
+msgid "Batch size"
+msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr "Будьте обережні. Зміна проÑтору імен проєкту може мати небажані побічні ефекти."
@@ -5888,7 +5946,7 @@ msgid "Before enabling this integration, create a webhook for the room in Google
msgstr "Перш ніж увімкнути цю інтеграцію, Ñтворіть вебхук Ð´Ð»Ñ ÐºÑ–Ð¼Ð½Ð°Ñ‚Ð¸ в Google Chat де ви хочете отримувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ цього проєкту. %{docs_link}"
msgid "Before inserting code, be sure to read the comment that separated each code group."
-msgstr ""
+msgstr "Перед вÑтавкою коду обов'Ñзково прочитайте коментар, Ñкий розділÑÑ” кожну групу коду."
msgid "Before this can be merged, a Jira issue must be linked in the title or description"
msgstr "Перед тим, Ñк це вдаÑÑ‚ÑŒÑÑ Ð·Ð»Ð¸Ñ‚Ð¸, задача з Jira повинна бути вказана в заголовку або опиÑÑ–"
@@ -5905,9 +5963,6 @@ msgstr "Ðижче наведені Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ %{link_to_gi
msgid "Below you will find all the groups that are public."
msgstr "Ðижче ви знайдете вÑÑ– загальнодоÑтупні групи."
-msgid "Beta"
-msgstr "Бета"
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5966,7 +6021,7 @@ msgid "BillingPlans|You don't have any groups. You'll need to %{create_group_lin
msgstr ""
msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr ""
+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 ""
@@ -6013,12 +6068,21 @@ 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|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 ""
@@ -6046,22 +6110,28 @@ msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ»Ð¾ перевірено"
msgid "Billing|%{user} was successfully approved"
msgstr "%{user} було уÑпішно затверджено"
+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 "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ %{user}"
-msgid "Billing|An error occurred while getting a billable member details"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -6076,15 +6146,21 @@ msgstr "ПрÑме членÑтво"
msgid "Billing|Enter at least three characters to search."
msgstr "Введіть щонайменше три Ñимволи Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ."
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "ЕкÑпортувати ÑпиÑок"
-msgid "Billing|Group"
-msgstr "Група"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+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 "УчаÑники, Ñкі були запрошені за допомогою Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ групи, не можуть бути видалені. Ви можете або видалити вÑÑŽ групу, або попроÑити влаÑника групи видалити учаÑника."
@@ -6109,9 +6185,6 @@ msgstr "Введіть %{username} щоб підтвердити"
msgid "Billing|User was successfully removed"
msgstr "КориÑтувача уÑпішно видалено"
-msgid "Billing|Users occupying seats in"
-msgstr "КориÑтувачі займають міÑÑ†Ñ Ð²"
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6240,7 +6313,7 @@ msgid "BoardScope|Milestone"
msgstr "Етап"
msgid "BoardScope|No iteration"
-msgstr ""
+msgstr "Без ітерації"
msgid "BoardScope|No milestone"
msgstr "Етап відÑутній"
@@ -6356,7 +6429,7 @@ msgid "Boards|Expand"
msgstr "Розгорнути"
msgid "Boards|Failed to fetch blocking %{issuableType}s"
-msgstr ""
+msgstr "Помилка при отриманні Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %{issuableType}s"
msgid "Boards|New board"
msgstr "Ðова дошка"
@@ -6511,9 +6584,6 @@ msgstr "ОглÑд"
msgid "Branches|Please type the following to confirm:"
msgstr "Будь лаÑка, введіть наÑтупні дії Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "Керувати захищеними гілками можливо в %{project_settings_link}."
-
msgid "Branches|Show active branches"
msgstr "Показувати активні гілки"
@@ -6571,9 +6641,6 @@ msgstr "розходитьÑÑ Ð· upstream"
msgid "Branches|merged"
msgstr "злита"
-msgid "Branches|project settings"
-msgstr "ÐалаштуваннÑÑ… проєкту"
-
msgid "Branches|protected"
msgstr "захищена"
@@ -6634,6 +6701,9 @@ msgstr "%{feature} (потрібна v%{version})"
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr "ІÑнуючі групи"
@@ -6649,6 +6719,9 @@ 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 ""
@@ -6673,9 +6746,6 @@ msgstr "Ім'Ñ Ð²Ð¶Ðµ Ñ–Ñнує."
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr "Ðова група"
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6701,7 +6771,7 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter
msgstr "Показано %{start}-%{end} із %{total} відповідного фільтра \"%{filter}\" від %{link}"
msgid "BulkImport|Source"
-msgstr ""
+msgstr "Джерело"
msgid "BulkImport|Source group"
msgstr "Група джерел"
@@ -6802,9 +6872,6 @@ msgstr "Параметри CI"
msgid "CI variables"
msgstr "Змінні CI"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI буде працювати з викориÑтаннÑм облікових даних, визначених вище."
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6820,6 +6887,9 @@ msgstr "Ðалаштувати CI/CD"
msgid "CI/CD configuration file"
msgstr "Файл конфігурації CI/CD"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr "Ðемає проєктів в облаÑÑ‚ÑŒ видимоÑÑ‚Ñ–"
@@ -6835,6 +6905,9 @@ msgstr "ЧаÑтота розгортаннÑ"
msgid "CICDAnalytics|Lead time"
msgstr "Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr "Проєкти з релізами"
@@ -6908,8 +6981,8 @@ msgstr "Обмежити доÑтуп CI_JOB_TOKEN"
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr "Виберіть проєкти, до Ñких можна отримати доÑтуп за допомогою запитів API, автентифікованих за допомогою змінної CI_JOB_TOKEN CI/CD цього проєкту."
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr "Конвеєр Auto DevOps запуÑкаєтьÑÑ Ð·Ð° замовчуваннÑм у вÑÑ–Ñ… проєктах без конфігурації CI/CD."
+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 "Конвеєр Auto DevOps запуÑкаєтьÑÑ, Ñкщо не знайдено альтернативного файлу конфігурації CI."
@@ -7076,6 +7149,12 @@ msgstr "СкаÑувати"
msgid "Cancel and close"
msgstr "СкаÑувати та закрити"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу"
@@ -7203,7 +7282,7 @@ msgid "Certificate Issuer"
msgstr "Сертифікат виданий:"
msgid "Certificate Subject"
-msgstr ""
+msgstr "Тема Ñертифіката"
msgid "Change assignee"
msgstr "Змінити виконавцÑ"
@@ -7310,9 +7389,15 @@ 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 "Змінено заголовок на \"%{title_param}\"."
@@ -7331,6 +7416,9 @@ msgstr "Зміни приховано. ÐатиÑніть щоб показатÐ
msgid "Changes the title to \"%{title_param}\"."
msgstr "Змінює заголовок на \"%{title_param}\"."
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr "Зміни в заголовку не збережені"
@@ -7400,6 +7488,9 @@ msgstr "Перевірити знову"
msgid "Check feature availability on namespace plan"
msgstr "Перевірити наÑвніÑÑ‚ÑŒ функціональноÑÑ‚Ñ– в плані Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтору імен"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7624,6 +7715,9 @@ msgstr "Деталі підпиÑки"
msgid "Checkout|Subtotal"
msgstr "Проміжна Ñума"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "Податки"
@@ -7690,6 +7784,9 @@ msgstr "Дочірній епік не Ñ–Ñнує."
msgid "Child epic doesn't exist."
msgstr "Дочірній епік не Ñ–Ñнує."
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¸Ñ‚Ð°Ð¹Ñької мови"
@@ -7717,9 +7814,6 @@ msgstr "Вибрати будь-Ñкий колір."
msgid "Choose file…"
msgstr "Виберіть файл…"
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7906,6 +8000,13 @@ msgstr "МакÑимальна кількіÑÑ‚ÑŒ процеÑів політиÐ
msgid "Clear"
msgstr "ОчиÑтити"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Clear all repository checks"
msgstr "ОчиÑтити вÑÑ– перевірки репозиторію"
@@ -8018,7 +8119,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 "Ðеможливо клонувати задачу до цільового проєкту, оÑкільки вона очікує на видаленнÑ."
msgid "CloneIssue|Cannot clone issues of '%{issue_type}' type."
msgstr ""
@@ -8110,6 +8211,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} уÑпішно видалено"
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "%{number} з %{total} агентів"
@@ -8167,14 +8271,14 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr "Ð’ÑÑ–"
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні ваших агентів"
-
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні вашого агента"
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– GitLab Agent. Перезавантажте Ñторінку, щоб Ñпробувати знову."
+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 "СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка, Ñпробуйте ще раз."
@@ -8182,6 +8286,9 @@ 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 "Сертифікат"
@@ -8203,12 +8310,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "Підключити Ñ–Ñнуючий клаÑтер"
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr "З'єднатиÑÑ Ð· GitLab Agent"
-
msgid "ClusterAgents|Connected"
msgstr "Підключено"
@@ -8222,7 +8323,7 @@ msgid "ClusterAgents|Copy token"
msgstr "Копіювати токен"
msgid "ClusterAgents|Create a cluster"
-msgstr ""
+msgstr "Створити клаÑтер"
msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
msgstr ""
@@ -8272,14 +8373,14 @@ 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."
+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 "Ðгент GitLab"
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr "GitLab Ðгент Ð´Ð»Ñ Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr "Ðадати відгук"
@@ -8290,8 +8391,8 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr "Як оновити агента?"
-msgid "ClusterAgents|Install a new agent"
-msgstr "Ð’Ñтановити новий агент"
+msgid "ClusterAgents|Install using Helm (recommended)"
+msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "ОÑтаннє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %{timeAgo}."
@@ -8314,6 +8415,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "ClusterAgents|No agents"
msgstr "Ðемає агентів"
@@ -8326,9 +8434,6 @@ msgstr "Ðе підключений"
msgid "ClusterAgents|Recommended"
msgstr "Рекомендовано"
-msgid "ClusterAgents|Recommended installation method"
-msgstr "Рекомендований ÑпоÑіб уÑтановки"
-
msgid "ClusterAgents|Register"
msgstr "РеєÑтраціÑ"
@@ -8338,20 +8443,23 @@ msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð°Ð³ÐµÐ½Ñ‚Ð°"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "Ð”Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ð³ÐµÐ½Ñ‚Ñ–Ð² потрібна роль Керівника або вища"
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr "Ð”Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… агентів потрібна роль Керівника або вища"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr "Потрібна роль Керівника або більша, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ†Ð¸Ñ… дій"
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-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 such as tokens created or revoked and clusters connected or not connected."
-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 "Виберіть агента або введіть ім'Ñ, щоб Ñтворити новий"
@@ -8359,8 +8467,8 @@ 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 "GitLab Agent забезпечує підвищений рівень безпеки при підключенні Kubernetes-клаÑтерів до GitLab. %{linkStart}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про GitLab Agent.%{linkEnd}"
+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 "Ðгент не був підключений протÑгом тривалого чаÑу. Можливо, виникла проблема з підключеннÑм. ОÑтанній Ñ‡Ð°Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ² %{timeAgo}."
@@ -8371,19 +8479,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] "Ðемає активноÑÑ‚Ñ– за минулий день"
-msgstr[1] "Ðемає активноÑтей за минулі %d дні"
-msgstr[2] "Ðемає активноÑтей за минулих %d днів"
-msgstr[3] "Ðемає активноÑтей за минулих %d днів"
-
msgid "ClusterAgents|This agent has no tokens"
msgstr "Цей агент не має токенів"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "Щоб видалити агента, введіть %{name} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
+msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
+msgstr ""
+
msgid "ClusterAgents|Token created by %{userName}"
msgstr "Токен, Ñтворений %{userName}"
@@ -8402,8 +8506,8 @@ msgstr "ПереглÑнути вÑÑ– %{number} клаÑтери"
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr "Ми хотіли б дізнатиÑÑŒ більше про ваш доÑвід з GitLab Agent."
-msgid "ClusterAgents|What is GitLab Agent activity?"
-msgstr "Що таке активніÑÑ‚ÑŒ GitLab Agent?"
+msgid "ClusterAgents|What is agent activity?"
+msgstr ""
msgid "ClusterAgents|What is default configuration?"
msgstr ""
@@ -8561,9 +8665,6 @@ msgstr "КлаÑтери викориÑтовуютьÑÑ ÑˆÐ»Ñхом вибоÑ
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr "Підключити за допомогою Ñертифікату"
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr "Підключити ваш клаÑтер до GitLab через %{linkStart}клаÑтерні Ñертифікати%{linkEnd}."
@@ -9077,6 +9178,9 @@ msgstr ""
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "Цей параметр дозволить вам вÑтановлювати заÑтоÑунки на клаÑтери RBAC."
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту вимкнено білінг. Щоб Ñтворити клаÑтер, %{linkToBillingStart}увімкніть білінг%{linkToBillingEnd} Ñ– Ñпробуйте знову."
@@ -9110,7 +9214,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -9210,10 +9314,10 @@ msgid "Code review"
msgstr "ПереглÑд коду"
msgid "Code snippet"
-msgstr ""
+msgstr "Код-Ñніпет"
msgid "Code snippet copied. Insert it in the correct location in the YAML file."
-msgstr ""
+msgstr "Сніпет Ñкопійовано. Ð’Ñтавте його у правильне міÑце YAML файлу."
msgid "CodeIntelligence|This is the definition"
msgstr "Це визначеннÑ"
@@ -9284,9 +9388,6 @@ msgstr "ComboSearch не визначено"
msgid "Comma-separated list of email addresses."
msgstr "СпиÑок Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти, відокремлених комами."
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "Розділений комами, напр. '1.1.1.1, 2.2.0/24'"
-
msgid "Command"
msgstr "Команда"
@@ -9411,9 +9512,6 @@ msgstr "Ðе знайдено пов'Ñзаних запитів на злитт
msgid "Committed by"
msgstr "Коміт від"
-msgid "Commit…"
-msgstr "Коміт…"
-
msgid "Community forum"
msgstr "Форум Ñпільноти"
@@ -9516,11 +9614,8 @@ msgstr ""
msgid "Compliance report"
msgstr "Звіт про відповідніÑÑ‚ÑŒ"
-msgid "ComplianceDashboard|created by:"
-msgstr "Ñтворено:"
-
msgid "ComplianceFrameworks|Add framework"
-msgstr ""
+msgstr "Додати фреймворк"
msgid "ComplianceFrameworks|Background color"
msgstr "Колір тла"
@@ -9652,7 +9747,7 @@ msgid "Configure CAPTCHAs, IP address limits, and other anti-spam measures."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CAPTCHA, Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ IP-Ð°Ð´Ñ€ÐµÑ Ñ‚Ð° інших антиÑпам-заходів."
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 ""
+msgstr "Ðалаштуйте ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² в .gitlab-ci.yml викориÑтовуючи керований шаблон GitLab. Ви можете [додати Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ñ…](https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings), щоб налаштувати параметри ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð²."
msgid "Configure Container Scanning in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "Ðалаштуйте ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² в `.gitlab-ci.yml`, Ñтворивши цей файл, Ñкщо його ще не Ñ–Ñнує"
@@ -9679,7 +9774,7 @@ msgid "Configure Prometheus"
msgstr "Ðалаштувати Prometheus"
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 ""
+msgstr "Ðалаштуйте SAST IaC в `.gitlab-ci.yml`, викориÑтовуючи керований шаблон GitLab. Ви можете [додати Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¸Ñ…](https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings), щоб налаштувати параметри SAST IaC."
msgid "Configure SAST IaC in `.gitlab-ci.yml`, creating this file if it does not already exist"
msgstr "Ðалаштуйте SAST IaC в `.gitlab-ci.yml`, Ñтворивши цей файл, Ñкщо його ще не Ñ–Ñнує"
@@ -9715,7 +9810,7 @@ msgid "Configure pipeline"
msgstr ""
msgid "Configure pipelines to deploy web apps, backend services, APIs and static resources to Google Cloud"
-msgstr ""
+msgstr "Ðалаштуйте конвеєри Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ± заÑтоÑунків, Ñерверних поÑлуг, API та Ñтатичних реÑурÑів в Google Cloud"
msgid "Configure region"
msgstr ""
@@ -9879,9 +9974,6 @@ msgstr "Помилка з’єднаннÑ"
msgid "Connection timed out"
msgstr "Минув Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ"
-msgid "Connection timeout"
-msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ"
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9912,9 +10004,6 @@ msgstr "РеєÑÑ‚Ñ€ контейнерів не включений у даниÐ
msgid "Container repositories"
msgstr "Репозиторії контейнерів"
-msgid "Container repositories synchronization concurrency limit"
-msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ñ‡Ð°Ñних потоків Ñинхронізації репозиторіїв контейнерів"
-
msgid "Container repository"
msgstr "Репозиторій контейнера"
@@ -10046,6 +10135,9 @@ 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 ""
@@ -10239,9 +10331,6 @@ 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 "За допомогою РеєÑтру Контейнерів кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Docker-образів. РозміÑÑ‚Ñ–Ñ‚ÑŒ хоча б один Docker-образ у ÑкомуÑÑŒ із проєктів групи щоб його тут побачити. %{docLinkStart}Детальніше%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "За допомогою реєÑтру контейнерів GitLab кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ. %{docLinkStart}Додаткова інформаціÑ%{docLinkEnd}"
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %{item} тегів. Ви впевнені?"
@@ -10278,6 +10367,9 @@ msgstr ""
msgid "Continue"
msgstr "Продовжити"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "Перейти до наÑтупного кроку"
@@ -10348,7 +10440,7 @@ 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 ""
+msgstr "Контролює, чи показувати контент Ð¿Ð¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñького доÑвіду та Ñторонні пропозиції в GitLab."
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 ""
@@ -10386,9 +10478,6 @@ msgstr "Скопіювати External ID в буфер обміну"
msgid "Copy ID"
msgstr "Скопіювати ID"
-msgid "Copy IP Address"
-msgstr "Копіювати IP-адреÑу"
-
msgid "Copy KRB5 clone URL"
msgstr "Скопіювати URL Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· KRB5"
@@ -10404,6 +10493,9 @@ msgstr "Скопіювати URL"
msgid "Copy branch name"
msgstr "Скопіювати Ñ–Ð¼â€™Ñ Ð³Ñ–Ð»ÐºÐ¸"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "Скопіювати коди"
@@ -10446,6 +10538,9 @@ msgstr "Скопіювати мітки та етап з іншої задачі
msgid "Copy link"
msgstr "Скопіювати поÑиланнÑ"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° графік"
@@ -10752,6 +10847,9 @@ msgstr "Створити гілку"
msgid "Create commit"
msgstr "Створити коміт"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -11238,8 +11336,11 @@ msgstr "Параметри"
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
-msgstr "Ðа вищий план"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "ВлаÑні атрибути"
@@ -11278,7 +11379,7 @@ msgid "Customer experience improvement and third-party offers"
msgstr "ÐŸÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñького доÑвіду та Ñторонні пропозиції"
msgid "Customer relations"
-msgstr ""
+msgstr "ВідноÑини з замовником"
msgid "Customer relations contacts"
msgstr ""
@@ -11412,6 +11513,9 @@ msgstr "має бути в групі"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount} вибрано (%{maxLabels} max)"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11430,6 +11534,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "Дата"
@@ -11439,6 +11546,9 @@ msgstr "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² графіків"
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11819,6 +11929,12 @@ msgstr "Тип Ñайту"
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "Цільова URL-адреÑа"
@@ -11909,25 +12025,25 @@ msgstr "Повторити перевірку"
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
-msgstr "Крок 1 - Виберіть метод перевірки Ñайту"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
-msgstr "Крок 2 - додати заголовок HTTP на вашому Ñайті"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11946,13 +12062,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -12234,6 +12350,9 @@ msgstr "Видалити артефакти"
msgid "Delete badge"
msgstr "Видалити значок"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "Видалити Ñтовпець"
@@ -12345,6 +12464,9 @@ msgstr "Видалено пÑевдонім Ð´Ð»Ñ Ñ‡Ð°Ñ‚Ñƒ: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12477,9 +12599,15 @@ msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей"
msgid "Dependency list"
msgstr "СпиÑок залежноÑтей"
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
+msgstr ""
+
msgid "DependencyProxy|Cached %{time}"
msgstr "Кешовано %{time}"
+msgid "DependencyProxy|Clear cache"
+msgstr ""
+
msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
msgstr "ОчиÑтити кеш прокÑÑ– залежноÑтей автоматично"
@@ -12489,9 +12617,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr "Копіювати префікÑ"
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr "ПрокÑÑ– залежноÑтей"
@@ -12507,6 +12632,9 @@ msgstr "Увімкнути прокÑÑ– залежноÑтей"
msgid "DependencyProxy|Image list"
msgstr "СпиÑок образів"
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñховища"
@@ -12544,7 +12672,7 @@ msgid "Deploy Keys"
msgstr "Ключі Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ"
msgid "Deploy container based web apps on Google managed clusters"
-msgstr ""
+msgstr "Розгорніть веб заÑтоÑунки на оÑнові контейнерів у керованих клаÑтерах Google"
msgid "Deploy freezes"
msgstr ""
@@ -12771,6 +12899,9 @@ 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 ""
@@ -12922,10 +13053,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13098,7 +13235,7 @@ msgid "DesignManagement|Unresolve thread"
msgstr ""
msgid "DesignManagement|Upload designs"
-msgstr ""
+msgstr "Завантажити дизайни"
msgid "DesignManagement|Upload skipped. %{reason}"
msgstr ""
@@ -13322,6 +13459,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr "Ваше викориÑтаннÑ"
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13337,6 +13477,9 @@ msgstr ""
msgid "Diff limits"
msgstr "Diff обмеженнÑ"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "Ð Ñ–Ð·Ð½Ð¸Ñ†Ñ Ð¼Ñ–Ð¶ датою початку та теперішньою"
@@ -13360,9 +13503,18 @@ msgstr[1] "%d видаленнÑ"
msgstr[2] "%d видалень"
msgstr[3] "%d видалень"
+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 ""
@@ -13403,9 +13555,6 @@ msgstr "Ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ"
msgid "Disable"
msgstr "Вимкнути"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13418,6 +13567,9 @@ msgstr "Вимкнути Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "Disable group runners"
msgstr "Вимкнути групові runner'и"
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr "Вимкнути двофакторну автентифікацію"
@@ -13507,7 +13659,7 @@ msgstr[2] "Відхилити %d виділених вразливоÑтей ÑÐ
msgstr[3] "Відхилити %d виділених вразливоÑтей Ñк"
msgid "Dismiss Alert"
-msgstr ""
+msgstr "Відхилити попередженнÑ"
msgid "Dismiss merge request promotion"
msgstr ""
@@ -13540,7 +13692,7 @@ msgid "Display alerts from all configured monitoring tools."
msgstr ""
msgid "Display milestones"
-msgstr ""
+msgstr "Показати етапи"
msgid "Display name"
msgstr "Ð†Ð¼â€™Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"
@@ -13554,7 +13706,7 @@ msgstr "Показувати перетворений файл"
msgid "Display source"
msgstr "Показати джерело"
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13641,9 +13793,6 @@ msgstr "Завантажити PDF"
msgid "Download artifacts"
msgstr "Завантажити артефакти"
-msgid "Download as"
-msgstr "Завантажити Ñк"
-
msgid "Download codes"
msgstr "Завантажити коди"
@@ -13731,9 +13880,15 @@ msgstr ""
msgid "Due date"
msgstr "Запланована дата завершеннÑ"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "ТриваліÑÑ‚ÑŒ"
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13756,22 +13911,22 @@ msgid "Duration|%s years"
msgstr ""
msgid "Duration|1 day"
-msgstr ""
+msgstr "1 день"
msgid "Duration|1 hour"
-msgstr ""
+msgstr "1 година"
msgid "Duration|1 minute"
-msgstr ""
+msgstr "1 хвилина"
msgid "Duration|1 month"
-msgstr ""
+msgstr "1 міÑÑць"
msgid "Duration|1 week"
-msgstr ""
+msgstr "1 тиждень"
msgid "Duration|1 year"
-msgstr ""
+msgstr "1 рік"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "Під Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу вам буде запропоновано вказати URL-адреÑи з боку GitLab. ВикориÑтовуйте URL-адреÑи, показані нижче."
@@ -13887,6 +14042,9 @@ msgstr "Вбудоване редагуваннÑ"
msgid "Edit issues"
msgstr "Редагувати задачі"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13941,9 +14099,6 @@ msgstr "Параметри доÑтупу IAM Ð´Ð»Ñ Elasticsearch AWS"
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Elasticsearch"
@@ -14004,9 +14159,6 @@ msgstr ""
msgid "Email display name"
msgstr "Відображуване ім'Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "Електронну пошту не перевірено. Будь лаÑка, перевірте Ñ—Ñ— в Salesforce."
@@ -14016,6 +14168,9 @@ msgstr ""
msgid "Email patch"
msgstr "Email-патч"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "ЛиÑта відправлено"
@@ -14050,7 +14205,7 @@ 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 ""
+msgstr "Ми не можемо обробити ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти, бо воно занадто велике. Будь лаÑка, Ñтворіть Ñвою задачу або коментар через веб-інтерфейÑ."
msgid "EmailError|You are not allowed to perform this action. If you believe this is in error, contact a staff member."
msgstr "Вам не дозволено виконувати цю дію. Якщо ви вважаєте, що це неправильно, звернітьÑÑ Ð´Ð¾ Ñпівробітника."
@@ -14112,15 +14267,15 @@ msgstr "Порожній файл"
msgid "Enable"
msgstr "Увімкнути"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr ""
msgid "Enable Auto DevOps"
msgstr "Увімкнути Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr ""
-
msgid "Enable Gitpod"
msgstr "Увімкнути Gitpod"
@@ -14142,18 +14297,12 @@ msgstr "Увімкнути PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr "Увімкнути збір даних Ð´Ð»Ñ Pseudonymizer"
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr "Увімкнути перевірку SSL"
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -14235,12 +14384,6 @@ msgstr ""
msgid "Enable integration"
msgstr "Увімкнути інтеграцію"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr "Увімкнути збір логів"
@@ -14286,12 +14429,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr "Увімкнути загальні runner'и Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr "Увімкнути двофакторну автентифікацію"
@@ -14358,7 +14495,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14461,11 +14598,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] "Середовище"
-msgstr[1] "Середовища"
-msgstr[2] "Середовищ"
-msgstr[3] "Середовищ"
+msgstr ""
msgid "Environment does not have deployments"
msgstr "Середовище не має розгортань"
@@ -14507,7 +14640,7 @@ msgid "Environments Dashboard"
msgstr "Панель ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñередовищами"
msgid "Environments allow you to track deployments of your application. %{linkStart}More information%{linkEnd}."
-msgstr ""
+msgstr "Середовища дозволÑÑŽÑ‚ÑŒ відÑтежувати Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ заÑтоÑунку. %{linkStart}Додаткова інформаціÑ%{linkEnd}."
msgid "Environments in %{name}"
msgstr "Середовища в %{name}"
@@ -14725,6 +14858,9 @@ msgstr "захищені"
msgid "Environment|Auto stop %{time}"
msgstr "Ðвтозупинка %{time}"
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "Епік"
@@ -14749,9 +14885,6 @@ msgstr "Епіки"
msgid "Epics Roadmap"
msgstr "План-графік епіків"
-msgid "Epics and Issues"
-msgstr "Епіки та задачі"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "Епіки дозволÑÑŽÑ‚ÑŒ керувати вашим портфелем проєктів ефективніше та з меншими зуÑиллÑми"
@@ -14854,6 +14987,9 @@ msgstr "закінченнÑ"
msgid "Epics|start"
msgstr "початок"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "Помилка"
@@ -15023,7 +15159,7 @@ msgid "Error uploading file"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
msgid "Error uploading file. Please try again."
-msgstr ""
+msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ. Будь лаÑка, Ñпробуйте ще раз."
msgid "Error uploading file: %{stripped}"
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ: %{stripped}"
@@ -15109,9 +15245,6 @@ msgstr "Помилки"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr "Помилки:"
-
msgid "Escalate this incident"
msgstr ""
@@ -15360,7 +15493,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr "Приклад: @sub\\.company\\.com$"
msgid "Examples"
-msgstr ""
+msgstr "Приклади"
msgid "Except policy:"
msgstr "Політика виключеннÑ:"
@@ -15446,6 +15579,9 @@ msgstr ""
msgid "Expiration date:"
msgstr "Термін дії:"
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "Термін дії закінчивÑÑ"
@@ -15573,22 +15709,22 @@ msgid "ExternalAuthorization|Certificate used to authenticate with the external
msgstr "Сертифікат Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— із зовнішньою Ñлужбою авторизації. Якщо він пуÑтий, Ñертифікат Ñервера перевірÑєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу через HTTPS."
msgid "ExternalAuthorization|Classification label to use when requesting authorization if no specific label is defined on the project."
-msgstr ""
+msgstr "Мітка авторизації Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ авторизації, Ñкщо в проєкті не визначено певну мітку."
msgid "ExternalAuthorization|Client authorization certificate"
-msgstr ""
+msgstr "Сертифікат авторизації клієнта"
msgid "ExternalAuthorization|Client authorization key"
-msgstr ""
+msgstr "Ключ авторизації клієнта"
msgid "ExternalAuthorization|Client authorization key password (optional)"
-msgstr ""
+msgstr "Пароль ключа авторизації клієнта (необов'Ñзково)"
msgid "ExternalAuthorization|Default classification label"
-msgstr ""
+msgstr "Мітка клаÑифікації за замовчуваннÑм"
msgid "ExternalAuthorization|Enable classification control using an external service"
-msgstr ""
+msgstr "Увімкнути контроль за клаÑифікацією за допомогою зовнішньої Ñлужби"
msgid "ExternalAuthorization|External authorization"
msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ"
@@ -15600,13 +15736,13 @@ msgid "ExternalAuthorization|External classification policy authorization."
msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ зовнішньої клаÑифікації."
msgid "ExternalAuthorization|Passphrase required to decrypt the private key. Encrypted when stored."
-msgstr ""
+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 ""
+msgstr "Період GitLab очікує на відповідь зовнішньої Ñлужби. Якщо відповіді немає, доÑтуп заборонено. За замовчуваннÑм: 0.5 Ñекунд."
msgid "ExternalAuthorization|Private key of client authentication certificate. Encrypted when stored."
-msgstr ""
+msgstr "Приватний ключ Ñертифіката автентифікації клієнта. Зашифрований під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ."
msgid "ExternalAuthorization|Service URL"
msgstr "URL-адреÑа Ñлужби"
@@ -15624,7 +15760,7 @@ msgid "ExternalIssueIntegration|Only one issue tracker integration can be active
msgstr ""
msgid "ExternalIssueIntegration|This issue is synchronized with %{trackerName}"
-msgstr ""
+msgstr "Ð¦Ñ Ð·Ð°Ð´Ð°Ñ‡Ð° Ñинхронізована з %{trackerName}"
msgid "ExternalWikiService|External wiki"
msgstr ""
@@ -15747,6 +15883,9 @@ msgstr "Ðе вдалоÑÑ Ð²Ñтановити."
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ виконавців."
@@ -15777,6 +15916,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ітерації."
@@ -15933,7 +16075,7 @@ msgstr ""
msgid "Feature Flags"
msgstr "Перемикачі функцій"
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -16180,6 +16322,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr "Файлові Хуки (%{count})"
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "Файл додано"
@@ -16207,9 +16352,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr "Шаблони файлів"
@@ -16336,9 +16478,6 @@ msgstr ""
msgid "Finished"
msgstr "Завершено"
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr "Ім’Ñ"
@@ -16459,9 +16598,6 @@ msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації, вÑ
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr "Забули ваш пароль?"
@@ -16526,7 +16662,7 @@ msgid "ForkProject|Visibility level"
msgstr "Рівень видимоÑÑ‚Ñ–"
msgid "ForkProject|Want to house several dependent projects under the same namespace?"
-msgstr ""
+msgstr "Хочете розміÑтити декілька пов'Ñзаних проєктів в одному проÑторі імен?"
msgid "ForkSuggestion|Cancel"
msgstr "СкаÑувати"
@@ -16541,7 +16677,7 @@ msgid "ForkedFromProjectPath|Forked from"
msgstr "Форк від"
msgid "ForkedFromProjectPath|Forked from an inaccessible project"
-msgstr ""
+msgstr "Форк із недоÑтупного проєкту"
msgid "Forking in progress"
msgstr "ВідбуваєтьÑÑ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€ÐºÑƒ"
@@ -16690,6 +16826,20 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16723,6 +16873,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "Додати Ñайт"
@@ -16744,6 +16897,12 @@ 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 ""
@@ -16753,9 +16912,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16768,6 +16942,9 @@ 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 "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ñнуючого проєкту."
@@ -16789,9 +16966,21 @@ 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 ""
@@ -16801,24 +16990,36 @@ msgstr ""
msgid "Geo|Filter by status"
msgstr "Фільтр за ÑтатуÑом"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo ÑтатуÑ"
+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 "Geo Ñайти"
msgid "Geo|Geo sites are paused using a command run on the site"
msgstr ""
-msgid "Geo|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16831,6 +17032,9 @@ msgstr "Синхронізовано"
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16855,21 +17059,39 @@ 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 ""
@@ -16879,6 +17101,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr "Офлайн"
@@ -16891,6 +17116,9 @@ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації"
msgid "Geo|Pending verification"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "Первинний вузол"
@@ -16912,6 +17140,9 @@ msgstr "Проєкти в певних Ñегментах Ñховищ"
msgid "Geo|Queued"
msgstr "Черга"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "Повторне завантаженнÑ"
@@ -16954,6 +17185,9 @@ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—"
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "Повторна ÑинхронізаціÑ"
@@ -16981,15 +17215,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -17023,6 +17281,12 @@ 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 ""
@@ -17035,9 +17299,21 @@ 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 ""
@@ -17047,12 +17323,18 @@ 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 "Ð—Ð°Ð¿Ð¸Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ (%{project_id}) уÑпішно видалено."
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr ""
@@ -17077,6 +17359,9 @@ msgstr "Оновлено %{timeAgo}"
msgid "Geo|Verification"
msgstr "Перевірка"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "Перевірка невдала: %{error}"
@@ -17092,7 +17377,7 @@ msgstr "Перевірено"
msgid "Geo|Waiting for scheduler"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ°"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -17248,7 +17533,7 @@ msgstr "ЕкÑпорт GitLab"
msgid "GitLab group: %{source_link}"
msgstr "GitLab група : %{source_link}"
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17419,6 +17704,15 @@ msgstr "URL-адреÑа хоÑту Gitea"
msgid "Gitea Import"
msgstr "Імпорт з Gitea"
+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 ""
@@ -17504,7 +17798,7 @@ msgid "GlobalSearch|Search for projects, issues, etc."
msgstr ""
msgid "GlobalSearch|Search results are loading"
-msgstr ""
+msgstr "Результати пошуку завантажуютьÑÑ"
msgid "GlobalSearch|There was an error fetching search autocomplete suggestions."
msgstr ""
@@ -17750,7 +18044,7 @@ msgid "GrafanaIntegration|Active"
msgstr "Увімкнено"
msgid "GrafanaIntegration|Enter the %{docLinkStart}Grafana API token%{docLinkEnd}."
-msgstr ""
+msgstr "Введіть %{docLinkStart}токен API Grafana%{docLinkEnd}."
msgid "GrafanaIntegration|Enter the base URL of the Grafana instance."
msgstr "Введіть оÑновну URL-адреÑу інÑтанÑа Grafana."
@@ -17762,7 +18056,7 @@ msgid "GrafanaIntegration|Grafana authentication"
msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Grafana"
msgid "GrafanaIntegration|Set up Grafana authentication to embed Grafana panels in GitLab Flavored Markdown."
-msgstr ""
+msgstr "Ðалаштуйте автентифікацію Grafana Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»ÐµÐ¹ Grafana до GitLab Flavored Markdown."
msgid "Grant access"
msgstr "Ðадати доÑтуп"
@@ -17825,10 +18119,10 @@ msgid "Group URL"
msgstr "URL-адреÑа групи"
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 ""
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ð° доÑтупу групи вимкнено в цій групі. Ви вÑе ж можете викориÑтовувати та керувати наÑвними токенами. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.%{link_end}"
msgid "Group application: %{name}"
-msgstr ""
+msgstr "ЗаÑтоÑунок групи: %{name}"
msgid "Group applications"
msgstr ""
@@ -17915,7 +18209,7 @@ 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 ""
+msgstr "ШлÑÑ… групи вже викориÑтовуєтьÑÑ. Ми пропонуємо доÑтупний."
msgid "Group path is available."
msgstr "ШлÑÑ… групи доÑтупний."
@@ -17924,7 +18218,7 @@ msgid "Group pipeline minutes were successfully reset."
msgstr "Групові хвилини Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð² уÑпішно обнулено."
msgid "Group project URLs are prefixed with the group namespace"
-msgstr ""
+msgstr "URL-адреÑи групових проєктів викориÑтовують проÑÑ‚Ñ–Ñ€ імен групи у ÑкоÑÑ‚Ñ– префікÑу"
msgid "Group requires separate account"
msgstr "Група вимагає окремий обліковий запиÑ"
@@ -17975,16 +18269,16 @@ msgid "GroupImport|Group '%{group_name}' is being imported."
msgstr "Група '%{group_name}' імпортуєтьÑÑ."
msgid "GroupImport|Group could not be imported: %{errors}"
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ групу: %{errors}"
msgid "GroupImport|Please wait while we import the group for you. Refresh at will."
-msgstr ""
+msgstr "Будь лаÑка, зачекайте, поки ми імпортуємо Ð´Ð»Ñ Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ñƒ. Оновіть Ñторінку за бажаннÑм."
msgid "GroupImport|The group was successfully imported."
-msgstr ""
+msgstr "Група уÑпішно імпортована."
msgid "GroupImport|Unable to process group import file"
-msgstr ""
+msgstr "Ðе вдаєтьÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ файл імпорту групи"
msgid "GroupPage|Copy group ID"
msgstr "Копіювати ID групи"
@@ -18134,7 +18428,7 @@ msgid "GroupSAML|Prohibit outer forks for this group"
msgstr ""
msgid "GroupSAML|Reset SCIM token"
-msgstr ""
+msgstr "Скинути токен SCIM"
msgid "GroupSAML|Role to assign members of this SAML group."
msgstr ""
@@ -18227,7 +18521,7 @@ msgid "GroupSettings|Allow project and group access token creation"
msgstr "Дозволити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ доÑтупу до проєкту та групи"
msgid "GroupSettings|Allows creating organizations and contacts and associating them with issues."
-msgstr ""
+msgstr "ДозволÑÑ” Ñтворювати організації та контакти, Ñ– пов'Ñзувати Ñ—Ñ… з задачами."
msgid "GroupSettings|Applied to all subgroups unless overridden by a group owner. Groups already added to the project lose access."
msgstr ""
@@ -18278,7 +18572,7 @@ msgid "GroupSettings|Disable group mentions"
msgstr ""
msgid "GroupSettings|Enable customer relations"
-msgstr ""
+msgstr "Увімкнути роботу з клієнтами"
msgid "GroupSettings|Enable delayed project deletion"
msgstr ""
@@ -18292,9 +18586,6 @@ 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|New runners registration token has been generated!"
-msgstr "Згенеровано новий токен Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації runner'ів!"
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18305,22 +18596,22 @@ msgid "GroupSettings|Please choose a group URL with no special characters or spa
msgstr "Будь лаÑка, оберіть URL-адреÑу групи без Ñпеціальних Ñимволів або пробілів."
msgid "GroupSettings|Prevent forking outside of the group"
-msgstr ""
+msgstr "Заборонити форк за межами групи"
msgid "GroupSettings|Prevent forking setting was not saved"
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½Ð¸ форку не збережено"
msgid "GroupSettings|Prevent members from sending invitations to groups outside of %{group} and its subgroups"
-msgstr ""
+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 ""
+msgstr "Запобігає Ñповіщенню учаÑників групи у разі Ñ—Ñ— згадуваннÑ."
msgid "GroupSettings|Projects will be permanently deleted after a %{waiting_period}-day delay. Inherited by subgroups."
-msgstr ""
+msgstr "Проєкти будуть оÑтаточно видалені піÑÐ»Ñ %{waiting_period}денної затримки. УÑпадковано підгрупами."
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 ""
@@ -18329,7 +18620,7 @@ msgid "GroupSettings|Select a project with the %{code_start}.gitlab/insights.yml
msgstr ""
msgid "GroupSettings|Select a subgroup to use as the source for custom project templates for this group."
-msgstr ""
+msgstr "Виберіть підгрупу Ñк джерело Ð´Ð»Ñ Ð²Ð»Ð°Ñних шаблонів проєктів Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи."
msgid "GroupSettings|Select parent group"
msgstr "Вибери батьківÑьку групу"
@@ -18412,9 +18703,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr "Групи Ð´Ð»Ñ Ñинхронізації"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "ЧаÑто відвідувані"
@@ -18572,7 +18860,7 @@ msgid "Groups|Group description (optional)"
msgstr ""
msgid "Groups|Group name"
-msgstr ""
+msgstr "Ðазва групи"
msgid "Groups|Group path is available."
msgstr ""
@@ -18825,6 +19113,9 @@ 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 ""
@@ -18837,9 +19128,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr "Тут ви знайдете нещодавню активніÑÑ‚ÑŒ в запитах на злиттÑ"
-
msgid "Hi %{username}!"
msgstr "Привіт %{username}!"
@@ -18854,10 +19142,10 @@ msgstr "Сховати архівовані проєкти"
msgid "Hide chart"
msgid_plural "Hide charts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "Сховати графік"
+msgstr[1] "Сховати графіка"
+msgstr[2] "Сховати графіки"
+msgstr[3] "Сховати графіки"
msgid "Hide comments on this file"
msgstr ""
@@ -18909,7 +19197,7 @@ msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work
msgstr ""
msgid "Hierarchy|Help us improve work items in GitLab!"
-msgstr ""
+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 ""
@@ -18954,7 +19242,7 @@ msgid "History of authentications"
msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ð¹"
msgid "Holder name:"
-msgstr ""
+msgstr "Ім'Ñ Ð²Ð»Ð°Ñника:"
msgid "Home page URL"
msgstr ""
@@ -18981,7 +19269,7 @@ msgid "Hour (UTC)"
msgstr "Година (UTC)"
msgid "House your files, plan your work, collaborate on code, and more."
-msgstr ""
+msgstr "РозміÑÑ‚Ñ–Ñ‚ÑŒ Ñвої файли, плануйте Ñвою роботу, Ñпівпрацюйте над кодом тощо."
msgid "Housekeeping"
msgstr "ОчищеннÑ"
@@ -18992,12 +19280,6 @@ msgstr "ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑƒÑпішно розпочато"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -19130,6 +19412,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¼ÐµÑ€ÐµÐ¶ IP дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ вищого рівнÑ"
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "Ідентифікатор"
@@ -19169,13 +19454,10 @@ msgstr "Якщо увімкнено, тоді влаÑники груп змож
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "Якщо буде увімкнено цей пункт, нові членÑтва в групах та дозволи будуть додані лише за допомогою Ñинхронізації 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."
-msgstr "Якщо вимкнено, локальна гілка зі змінами не буде автоматично підтÑгувати коміти з віддаленої гілки, щоб уникнути втрати локальних даних. Якщо гілка за замовчуваннÑм (%{default_branch}) міÑтить зміни Ñ– не може бути оновлена, тоді Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ неможливим. Інші гілки зі змінами автоматично ігноруютьÑÑ."
-
-msgid "If disabled, only administrators can configure repository mirroring."
+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 enabled, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
+msgid "If disabled, only administrators can configure repository mirroring."
msgstr ""
msgid "If enabled, only protected branches will be mirrored."
@@ -19190,9 +19472,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19287,7 +19566,7 @@ msgid "Images with incorrect dimensions are not resized automatically, and may r
msgstr ""
msgid "Impersonate"
-msgstr ""
+msgstr "УоÑобити (предÑтавитиÑÑŒ Ñк кориÑтувач)"
msgid "Impersonation Tokens"
msgstr "Токени імітуваннÑ"
@@ -19403,28 +19682,28 @@ msgid "ImportAProjectModal|Import from a project"
msgstr "Імпортувати з проєкту"
msgid "ImportAProjectModal|Import members from another project"
-msgstr ""
+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 ""
+msgstr "ІмпортуютьÑÑ Ð»Ð¸ÑˆÐµ учаÑники проєкту (не учаÑники групи) Ñ– вони отримують Ñ‚Ñ– ж права доÑтупу, Ñк Ñ– проєкт, з Ñкого ви імпортуєте."
msgid "ImportAProjectModal|Successfully imported"
msgstr "УÑпішно імпортовано"
msgid "ImportAProjectModal|Unable to import project members"
-msgstr ""
+msgstr "Ðе вдаєтьÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ учаÑників проєкту"
msgid "ImportAProjectModal|You're importing members to the %{strongStart}%{name}%{strongEnd} project."
-msgstr ""
+msgstr "Ви імпортуєте учаÑників до проєкту %{strongStart}%{name}%{strongEnd}."
msgid "ImportButtons|Connect repositories from"
msgstr "Підключити репозиторії із"
msgid "ImportProjects|%{provider} rate limit exceeded. Try again later"
-msgstr ""
+msgstr "%{provider} перевищено ліміт чаÑтоти. Спробуйте знову пізніше"
msgid "ImportProjects|Blocked import URL: %{message}"
msgstr "Заблокований URL Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ: %{message}"
@@ -19442,13 +19721,13 @@ msgid "ImportProjects|Importing the project failed: %{reason}"
msgstr "Ðе вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ проєкт: %{reason}"
msgid "ImportProjects|Requesting namespaces failed"
-msgstr ""
+msgstr "Запит проÑторів імен не вдавÑÑ"
msgid "ImportProjects|Requesting your %{provider} repositories failed"
msgstr "Запит ваших %{provider} репозиторіїв пройшов невдало"
msgid "ImportProjects|Select the repositories you want to import"
-msgstr ""
+msgstr "Виберіть репозиторії, Ñкі ви хочете імпортувати"
msgid "ImportProjects|The remote data could not be imported."
msgstr "Віддалені дані не можуть бути імпортовані."
@@ -19473,19 +19752,16 @@ 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 ""
+msgstr "За цією URL-адреÑою немає дійÑного репозиторію Git. Якщо ваш репозиторій HTTP не Ñ” загальнодоÑтупним, перевірте Ñвої облікові дані."
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
+msgstr "У кожному прикладі замініть %{code_start}TOKEN%{code_end} на токен тригера, Ñкий ви Ñтворили, Ñ– замініть %{code_start}REF_NAME%{code_end} на ім'Ñ Ð³Ñ–Ð»ÐºÐ¸ або тегу."
msgid "In progress"
msgstr "Ð’ процеÑÑ–"
@@ -19542,7 +19818,7 @@ msgid "InProductMarketing|And many more..."
msgstr "І багато іншого..."
msgid "InProductMarketing|Are your runners ready?"
-msgstr ""
+msgstr "Чи готові ваші runner'и?"
msgid "InProductMarketing|Automated security scans directly within GitLab"
msgstr ""
@@ -19562,6 +19838,9 @@ 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 ""
@@ -19682,6 +19961,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr "Отримайте наші поÑібники з імпорту"
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19740,16 +20022,16 @@ msgid "InProductMarketing|How many days does it take our team to complete variou
msgstr "Скільки днів необхідно нашій команді Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ€Ñ–Ð·Ð½Ð¾Ð¼Ð°Ð½Ñ–Ñ‚Ð½Ð¸Ñ… завдань?"
msgid "InProductMarketing|How to build and test faster"
-msgstr ""
+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 ""
+msgstr "Якщо ви більше не хочете отримувати від Ð½Ð°Ñ Ð¼Ð°Ñ€ÐºÐµÑ‚Ð¸Ð½Ð³Ð¾Ð²Ñ– повідомленнÑ,"
msgid "InProductMarketing|Import your project and code from GitHub, Bitbucket and others"
-msgstr ""
+msgstr "Імпортуйте Ñвій проєкт та код з GitHub, Bitbucket та інших"
msgid "InProductMarketing|Improve app security with a 30-day trial"
msgstr ""
@@ -19779,7 +20061,7 @@ msgid "InProductMarketing|Invite your team now"
msgstr "ЗапроÑити Ñвою команду зараз"
msgid "InProductMarketing|Invite your team today to build better code (and processes) together"
-msgstr ""
+msgstr "ЗапроÑÑ–Ñ‚ÑŒ Ñвою команду Ñьогодні, щоб разом Ñтворити кращий код (Ñ– процеÑи)"
msgid "InProductMarketing|It's all in the stats"
msgstr "Ð’Ñе це Ñ” в ÑтатиÑтиці"
@@ -19791,6 +20073,9 @@ msgid "InProductMarketing|Keep your code quality high by defining who should app
msgstr ""
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
+msgstr "ЗапуÑтити GitLab CI/CD через 20 хвилин або менше"
+
+msgid "InProductMarketing|Learn how to build for iOS"
msgstr ""
msgid "InProductMarketing|Lower cost of development"
@@ -19800,7 +20085,7 @@ msgid "InProductMarketing|Make it easier to collaborate on high-level ideas by g
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 ""
+msgstr "Перемикаєте? Імпортувати проєкти в GitLab проÑтіше, ніж ви думаєте. ПереміÑÑ‚Ñ–Ñ‚ÑŒ %{github_link} або імпортуйте щоÑÑŒ %{bitbucket_link}."
msgid "InProductMarketing|Master the art of importing!"
msgstr ""
@@ -19878,13 +20163,13 @@ msgid "InProductMarketing|Start by %{performance_link}"
msgstr "Розпочніть з %{performance_link}"
msgid "InProductMarketing|Start by importing your projects"
-msgstr ""
+msgstr "Розпочніть з імпорту ваших проєктів"
msgid "InProductMarketing|Start with a GitLab Ultimate free trial"
msgstr "Розпочніть з безкоштовної пробної верÑÑ–Ñ— GitLab Ultimate"
msgid "InProductMarketing|Start your trial now!"
-msgstr ""
+msgstr "Розпочніть Ñвою пробну верÑÑ–ÑŽ зараз!"
msgid "InProductMarketing|Start your trial today to experience single application success and discover all the features of GitLab Ultimate for free!"
msgstr ""
@@ -19911,13 +20196,13 @@ msgid "InProductMarketing|Team work makes the dream work"
msgstr ""
msgid "InProductMarketing|Test, create, deploy"
-msgstr ""
+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 ""
+msgstr "Це вÑе, що потрібно, щоб почати роботу з GitLab, але Ñкщо ви новачок у роботі з Git, переглÑньте наш %{basics_link}, щоб отримати кориÑні поради та підказки Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ."
msgid "InProductMarketing|This is email %{current_series} of %{total_series} in the %{track} series."
-msgstr ""
+msgstr "Це електронна пошта %{current_series} %{total_series} в %{track} поÑлідовноÑÑ‚Ñ–."
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 ""
@@ -19976,9 +20261,15 @@ 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 "Бажаєте розміÑтити GitLab на Ñвоїх Ñерверах?"
+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 "Ми дещо знаємо про ефективніÑÑ‚ÑŒ Ñ– хочемо цим поділитиÑÑ. ПідпишітьÑÑ Ð½Ð° безкоштовну пробну верÑÑ–ÑŽ GitLab Ultimate, Ñ– ваші команди кориÑтуватимутьÑÑ Ð½ÐµÑŽ з першого днÑ."
@@ -20022,16 +20313,16 @@ msgid "InProductMarketing|how easy it is to get started"
msgstr ""
msgid "InProductMarketing|quick start guide"
-msgstr ""
+msgstr "коротка інÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð· початку роботи"
msgid "InProductMarketing|repository mirroring"
-msgstr ""
+msgstr "Ð²Ñ–Ð´Ð´Ð·ÐµÑ€ÐºÐ°Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ"
msgid "InProductMarketing|set up a repo"
msgstr ""
msgid "InProductMarketing|test and deploy"
-msgstr ""
+msgstr "теÑтуйте та розгортайте"
msgid "InProductMarketing|testing browser performance"
msgstr ""
@@ -20079,7 +20370,7 @@ msgid "IncidentManagement|All"
msgstr "Ð’ÑÑ–"
msgid "IncidentManagement|All alerts promoted to incidents are automatically displayed within the list."
-msgstr ""
+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 "УÑÑ– попередженнÑ, переведені до розрÑду інцидентів, автоматично відображаютьÑÑ Ñƒ ÑпиÑку. Ви також можете Ñтворити новий інцидент за допомогою кнопки нижче."
@@ -20120,6 +20411,9 @@ msgstr "Інцидент"
msgid "IncidentManagement|Incidents"
msgstr "Інциденти"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "Ðизькі - S4"
@@ -20243,18 +20537,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20412,7 +20694,7 @@ msgid "Inline"
msgstr "Вбудований"
msgid "Inline math"
-msgstr ""
+msgstr "Вбудована математика"
msgid "Input host keys manually"
msgstr "Введіть ключі хоÑта вручну"
@@ -20730,9 +21012,6 @@ msgstr "ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовÑ
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20775,9 +21054,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20787,6 +21063,9 @@ msgstr "Внутрішні кориÑтувачі"
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "Шаблон інтервалу"
@@ -20838,6 +21117,9 @@ msgstr ""
msgid "Invalid file."
msgstr "Ðеправильний файл."
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20913,9 +21195,6 @@ msgstr "ЗапроÑити учаÑників"
msgid "Invite a group"
msgstr "ЗапроÑити групу"
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr "ЗапроÑити учаÑників"
@@ -21166,7 +21445,7 @@ msgid "Is using license seat:"
msgstr "ВикориÑтовує міÑце в ліцензії:"
msgid "Is using seat"
-msgstr ""
+msgstr "ВикориÑтовує міÑце"
msgid "IssuableStatus|Closed"
msgstr "Закрито"
@@ -21376,7 +21655,7 @@ msgid "Issues with label %{label}"
msgstr ""
msgid "Issues with no epic assigned"
-msgstr ""
+msgstr "Задачі без призначеного епіку"
msgid "Issues, merge requests, pushes, and comments."
msgstr "Задачі, запити на злиттÑ, Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð´Ñƒ Ñ– коментарі."
@@ -21463,7 +21742,7 @@ msgid "Iterations|Add iteration"
msgstr ""
msgid "Iterations|All"
-msgstr ""
+msgstr "Ð’ÑÑ–"
msgid "Iterations|Cadence configuration is invalid."
msgstr ""
@@ -21471,12 +21750,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21486,9 +21771,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr "ТриваліÑÑ‚ÑŒ"
@@ -21547,7 +21838,7 @@ msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr ""
msgid "Iterations|Open"
-msgstr ""
+msgstr "Відкрити"
msgid "Iterations|Requires update"
msgstr ""
@@ -21612,9 +21903,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "не може перевищувати 500 років у майбутньому"
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr "URL-адреÑа Jaeger"
@@ -21655,16 +21943,16 @@ msgid "Jira-GitLab user mapping template"
msgstr "Шаблон зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів Jira-GitLab"
msgid "JiraConnect|Create branch for Jira issue %{jiraIssue}"
-msgstr ""
+msgstr "Створити гілку Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– Jira %{jiraIssue}"
msgid "JiraConnect|Failed to create branch."
msgstr "Ðе вдалоÑÑ Ñтворити гілку."
msgid "JiraConnect|Failed to create branch. Please try again."
-msgstr ""
+msgstr "Ðе вдалоÑÑ Ñтворити гілку. Будь лаÑка, Ñпробуйте знову."
msgid "JiraConnect|New branch was successfully created."
-msgstr ""
+msgstr "Ðова гілка була уÑпішно Ñтворена."
msgid "JiraConnect|You can now close this window and return to Jira."
msgstr "Зараз ви можете закрити це вікно та повернутиÑÑ Ð´Ð¾ Jira."
@@ -21673,7 +21961,7 @@ msgid "JiraConnect|You don't have permission to create branches for this project
msgstr ""
msgid "JiraRequest|A connection error occurred while connecting to Jira. Try your request again."
-msgstr ""
+msgstr "Виникла помилка з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Jira. Повторіть Ñвій запит знову."
msgid "JiraRequest|A timeout error occurred while connecting to Jira. Try your request again."
msgstr "Виникла помилка Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу під Ñ‡Ð°Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Jira. Повторіть Ñвій запит знову."
@@ -21688,7 +21976,7 @@ msgid "JiraRequest|An error occurred while requesting data from Jira: %{messages
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ даних з Jira: %{messages}. Перевірте Ñвою %{docs_link_start}конфігурацію інтеграції Jira%{docs_link_end} та Ñпробуйте знову."
msgid "JiraRequest|The Jira API URL for connecting to Jira is not valid. Check your Jira integration API URL and try again."
-msgstr ""
+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 ""
@@ -21720,7 +22008,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21771,9 +22059,6 @@ msgstr "Коментарі Jira ÑтворюютьÑÑ, коли в коміті
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr "Коментарі Jira ÑтворюютьÑÑ, коли в запиті на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ” поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° задачу."
-msgid "JiraService|Jira issue type"
-msgstr "Тип задач Jira"
-
msgid "JiraService|Jira issues"
msgstr "Задачі Jira"
@@ -21855,6 +22140,9 @@ 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 ""
@@ -21909,6 +22197,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21921,6 +22212,9 @@ msgstr "Створити файл конфігурації CI/CD"
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21934,7 +22228,7 @@ msgid "Jobs|Raw text search is not currently supported for the jobs filtered sea
msgstr ""
msgid "Jobs|Status"
-msgstr ""
+msgstr "СтатуÑ"
msgid "Jobs|Use jobs to automate your tasks"
msgstr ""
@@ -21964,13 +22258,13 @@ msgid "Job|Cancel"
msgstr "СкаÑувати"
msgid "Job|Canceled"
-msgstr ""
+msgstr "СкаÑовано"
msgid "Job|Complete Raw"
msgstr "Повний неформатований"
msgid "Job|Created"
-msgstr ""
+msgstr "Створено"
msgid "Job|Download"
msgstr "Завантажити"
@@ -21979,7 +22273,7 @@ msgid "Job|Erase job log and artifacts"
msgstr ""
msgid "Job|Failed"
-msgstr ""
+msgstr "Ðевдало"
msgid "Job|Finished at"
msgstr "Завершено о"
@@ -22003,7 +22297,7 @@ msgid "Job|Passed"
msgstr ""
msgid "Job|Pending"
-msgstr ""
+msgstr "В очікуванні"
msgid "Job|Preparing"
msgstr ""
@@ -22340,7 +22634,7 @@ msgid "Last Pipeline"
msgstr "ОÑтанній Конвеєр"
msgid "Last Seen"
-msgstr ""
+msgstr "ВоÑтаннє переглÑнуте"
msgid "Last Sync"
msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ ÑинхронізаціÑ"
@@ -22462,6 +22756,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr "Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
@@ -22619,7 +22916,7 @@ msgid "LearnGitLab|Set up your workspace"
msgstr ""
msgid "LearnGitLab|Set-up CI/CD"
-msgstr ""
+msgstr "Ðалаштувати CI/CD"
msgid "LearnGitLab|Start a free Ultimate trial"
msgstr ""
@@ -22642,6 +22939,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22651,6 +22951,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "Вийти"
@@ -22675,6 +22978,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22865,11 +23171,8 @@ msgstr "Компоненти"
msgid "Licenses|Detected in Project"
msgstr "ВиÑвлено в проєкті"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr "ВиÑвлено ліцензії з невідповідніÑÑ‚ÑŽ до призначених політик проєкту"
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
-msgstr "Відображає ліцензії, виÑвлені у цьому проєкті, на оÑнові %{linkStart}оÑтаннього уÑпішного%{linkEnd} ÑкануваннÑ"
+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 ""
@@ -22916,23 +23219,14 @@ msgstr "ПереглÑд деталей ліцензії Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ пÑ
msgid "Limit display of time tracking units to hours."
msgstr "Обмежити Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð´Ð¸Ð½Ð¸Ñ†ÑŒ відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу до годин."
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr "Обмежити розмір проєкту на загальному, груповому та проєктному рівнÑÑ…. %{link_start}ДізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ%{link_end}."
-
msgid "Limit sign in from multiple IP addresses"
msgstr "Обмежити вхід з кількох IP-адреÑ"
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr "Обмежити кількіÑÑ‚ÑŒ проÑторів імен та проєктів, що можуть бути індекÑовані."
+msgstr "Обмежити кількіÑÑ‚ÑŒ задач та епіків за хвилину, Ñкі кориÑтувач може Ñтворити за допомогою веб та API запитів."
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22971,7 +23265,7 @@ msgid "Link title"
msgstr "Заголовок поÑиланнÑ"
msgid "Link title is required"
-msgstr ""
+msgstr "Заголовок поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¾Ð±Ð¾Ð²â€™Ñзковий"
msgid "Link to an image"
msgstr ""
@@ -23120,9 +23414,6 @@ msgstr "Заблоковано %{fileLockUserName}"
msgid "Locked the discussion."
msgstr "ДиÑкуÑÑ–ÑŽ закрито."
-msgid "Locked to current projects"
-msgstr "Закріплено за поточними проєктами"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути заÑтоÑоване до конкретного файлу або директорії."
@@ -23177,6 +23468,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr "ПриÑутні вразливоÑÑ‚Ñ– низького рівнÑ"
@@ -23480,6 +23774,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr "МакÑ. 100 000 подій"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23519,6 +23816,9 @@ msgstr ""
msgid "Maximum Users"
msgstr "МакÑимальна кількіÑÑ‚ÑŒ кориÑтувачів"
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr "МакÑимально допуÑтимий термін дії токена перÑонального доÑтупу (днів)"
@@ -23576,7 +23876,7 @@ 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 28px tall header logo"
+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."
@@ -23813,7 +24113,7 @@ msgid "Members|Are you sure you want to remove %{usersName} from \"%{source}\"?"
msgstr "Ви впевнені, що хочете видалити %{usersName} з \"%{source}\"?"
msgid "Members|Are you sure you want to remove this orphaned member from \"%{source}\"?"
-msgstr ""
+msgstr "Ви впевнені, що хочете видалити учаÑника, що залишивÑÑ, з \"%{source}\"?"
msgid "Members|Are you sure you want to revoke the invitation for %{inviteEmail} to join \"%{source}\""
msgstr "Ви впевнені, що хочете відкликати Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ %{inviteEmail} приєднатиÑÑ Ð´Ð¾ \"%{source}\""
@@ -23839,6 +24139,9 @@ msgstr "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії уÑпішно виÐ
msgid "Members|Expiration date updated successfully."
msgstr "Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ дії уÑпішно оновлена."
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "Фільтр учаÑників"
@@ -23959,6 +24262,9 @@ msgstr "Запит на злиттÑ"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr "Ðналітика запиту на злиттÑ"
@@ -24125,13 +24431,13 @@ msgid "MergeRequest|Can't show this merge request because of an internal error.
msgstr "Ðе вдаєтьÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ‡ÐµÑ€ÐµÐ· внутрішню помилку. ЗвернітьÑÑ Ð´Ð¾ Ñвого адмініÑтратора."
msgid "MergeRequest|Can't show this merge request because the fork project was deleted."
-msgstr ""
+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 ""
+msgstr "Ðе вдаєтьÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ цей запит на злиттÑ, оÑкільки вихідна гілка %{branch_badge} відÑÑƒÑ‚Ð½Ñ Ð² проєкті %{path_badge}. Закрийте цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ оновіть вихідну гілку."
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 ""
+msgstr "Ðе вдаєтьÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ цей запит на злиттÑ, оÑкільки цільова гілка %{branch_badge} відÑÑƒÑ‚Ð½Ñ Ð² проєкті %{path_badge}. Закрийте цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ оновіть цільову гілку."
msgid "MergeRequest|Compare %{target} and %{source}"
msgstr ""
@@ -24205,6 +24511,18 @@ 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 "Метрики"
@@ -24233,7 +24551,7 @@ msgid "Metrics:"
msgstr "Метрики:"
msgid "MetricsDashboardAnnotation|Annotation can't belong to both a cluster and an environment at the same time"
-msgstr ""
+msgstr "ÐÐ½Ð¾Ñ‚Ð°Ñ†Ñ–Ñ Ð½Ðµ може належати й до клаÑтера, Ñ– до Ñередовища одночаÑно"
msgid "MetricsDashboardAnnotation|Annotation has not been deleted"
msgstr "ÐÐ½Ð¾Ñ‚Ð°Ñ†Ñ–Ñ Ð½Ðµ була видалена"
@@ -24685,7 +25003,7 @@ msgid "Milestones|Milestone %{milestoneTitle} was not found"
msgstr "Етап %{milestoneTitle} не знайдено"
msgid "Milestones|Ongoing Issues (open and assigned)"
-msgstr ""
+msgstr "Поточні задачі (відкриті та призначені)"
msgid "Milestones|Organize issues and merge requests into a cohesive group, and set optional start and due dates. %{learn_more_link}"
msgstr ""
@@ -24718,17 +25036,17 @@ msgid "Milestones|This action cannot be reversed."
msgstr "Цю дію не можна ÑкаÑувати."
msgid "Milestones|Unstarted Issues (open and unassigned)"
-msgstr ""
+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 "Minimum interval in days"
-msgstr ""
-
msgid "Minutes"
msgstr "Хвилин"
@@ -24940,7 +25258,7 @@ msgid "MrDeploymentActions|Stop environment"
msgstr "Зупинити Ñередовище"
msgid "MrList|Assigned to %{name}"
-msgstr ""
+msgstr "Призначено %{name}"
msgid "MrList|Attention requested from assignee %{name}"
msgstr ""
@@ -24954,9 +25272,6 @@ msgstr ""
msgid "Multi-project"
msgstr "Багатопроєкт"
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24978,12 +25293,6 @@ msgstr "Знайдено декілька завантажувачів: %{upload
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -25057,19 +25366,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -25174,75 +25483,9 @@ msgstr "Мережа"
msgid "Network:"
msgstr "Мережа:"
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr "%{labelStart}та%{labelEnd} %{spanStart}надÑилають Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ GitLab.%{spanEnd}"
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr "Ð’ÑÑ– вибрані"
-
-msgid "NetworkPolicies|Allow"
-msgstr "Дозволити"
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr "Ви впевнені, що хочете видалити цю політику? Цю дію не можна ÑкаÑувати."
-
-msgid "NetworkPolicies|Create policy"
-msgstr "Створити політику"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr "Визначте розташуваннÑ, умови та дії цієї політики."
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "Видалити політику"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr "Видалити політику: %{policy}"
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "Редагувати політику"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -25252,87 +25495,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr "Політика %{policyName} була уÑпішно змінена"
-msgid "NetworkPolicies|Policy definition"
-msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸"
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr "Зберегти зміни"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "ЩоÑÑŒ пішло не так, не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ політику"
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr "Щоб увімкнути попередженнÑ, %{installLinkStart}Ñпочатку вÑтановіть агента%{installLinkEnd}."
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr "Політика"
@@ -25616,9 +25784,6 @@ msgstr "Етап відÑутній"
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr "Ðемає тегів"
-
msgid "No active admin user found"
msgstr "Ðе знайдено активного адмініÑтратора"
@@ -25629,7 +25794,7 @@ msgid "No application_settings found"
msgstr "Ðе знайдено application_settings"
msgid "No approvers"
-msgstr ""
+msgstr "Ðемає затверджуючих оÑіб"
msgid "No artifacts found"
msgstr ""
@@ -25659,7 +25824,7 @@ msgid "No child epics match applied filters"
msgstr ""
msgid "No commenters"
-msgstr ""
+msgstr "Ðемає коментаторів"
msgid "No commits present here"
msgstr ""
@@ -25826,9 +25991,6 @@ msgstr "Попереднього переглÑду Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу Ñ
msgid "No prioritized labels with such name or description"
msgstr "Ðемає пріоритетних міток з таким іменем або опиÑом"
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -26013,6 +26175,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr "Примітка"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -26049,9 +26214,6 @@ 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 found…"
-msgstr "Ðічого не знайдено…"
-
msgid "Nothing to preview."
msgstr "Дані Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду відÑутні."
@@ -26185,6 +26347,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "лиÑÑ‚."
@@ -26225,7 +26423,7 @@ msgid "Number of events"
msgstr "КількіÑÑ‚ÑŒ подій"
msgid "Number of events for this project: %{total_count}."
-msgstr ""
+msgstr "КількіÑÑ‚ÑŒ подій в цьому проєкті: %{total_count}."
msgid "Number of files touched"
msgstr "КількіÑÑ‚ÑŒ змінених файлів"
@@ -26239,9 +26437,6 @@ msgstr ""
msgid "OK"
msgstr "OK"
-msgid "Object Storage replication"
-msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¾Ð±'єктного Ñховища"
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "Об’єкт не Ñ–Ñнує на Ñервері або у Ð²Ð°Ñ Ð½Ðµ має до нього доÑтупу"
@@ -26261,7 +26456,7 @@ msgid "Oh no!"
msgstr "О ні!"
msgid "Ok, let's go"
-msgstr ""
+msgstr "Гаразд, уперед"
msgid "Okay"
msgstr "Гаразд"
@@ -26284,6 +26479,9 @@ 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 ""
@@ -26440,9 +26638,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26464,22 +26671,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr "Редагувати профіль"
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26494,6 +26716,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26527,19 +26752,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26572,6 +26803,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26584,6 +26818,9 @@ 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 "ПіÑÐ»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ, репозиторії можуть бути віддзеркалені через SSH. ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ %{link_start}тут%{link_end}."
@@ -26648,9 +26885,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26700,7 +26934,7 @@ msgid "Open in Gitpod"
msgstr ""
msgid "Open in Web IDE"
-msgstr ""
+msgstr "Відкрити у Web IDE"
msgid "Open in file view"
msgstr "Відкрити файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
@@ -26715,7 +26949,7 @@ msgid "Open sidebar"
msgstr "Розгорніть бічну панель"
msgid "Open: %{open}"
-msgstr ""
+msgstr "Відкрити: %{open}"
msgid "OpenAPI"
msgstr "OpenAPI"
@@ -26859,7 +27093,7 @@ msgid "Outdent"
msgstr ""
msgid "Overridden"
-msgstr ""
+msgstr "Перевизначено"
msgid "Overview"
msgstr "ОглÑд"
@@ -26868,7 +27102,7 @@ msgid "Overwrite diverged branches"
msgstr "ПерезапиÑати розбіжні гілки"
msgid "Owned by %{image_tag}"
-msgstr ""
+msgstr "ВлаÑник %{image_tag}"
msgid "Owned by anyone"
msgstr "Ðалежить уÑім"
@@ -27095,6 +27329,12 @@ msgstr "Видалити верÑÑ–ÑŽ пакету"
msgid "PackageRegistry|Delete package"
msgstr "Видалити пакет"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -27195,9 +27435,6 @@ msgstr "Команда pip"
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -27270,6 +27507,12 @@ 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 ""
@@ -27393,15 +27636,15 @@ msgstr ""
msgid "Part of merge request changes"
msgstr "ЧаÑтина змін у запиті на злиттÑ"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "УчаÑники"
msgid "Pass job variables"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr ""
-
msgid "Passed"
msgstr "УÑпішно пройдено"
@@ -27486,7 +27729,7 @@ msgstr ""
msgid "Pause"
msgstr "Призупинити"
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27502,13 +27745,13 @@ msgid "Pending"
msgstr "В очікуванні"
msgid "Pending Deletion"
-msgstr ""
+msgstr "Очікує видаленнÑ"
msgid "Pending comments"
msgstr "Коментарі в очікуванні"
msgid "Pending deletion"
-msgstr ""
+msgstr "Очікує видаленнÑ"
msgid "Pending owner approval"
msgstr ""
@@ -27655,7 +27898,7 @@ msgid "Phabricator Tasks"
msgstr "Задачі Phabricator"
msgid "Phone"
-msgstr ""
+msgstr "Телефон"
msgid "Pick a name"
msgstr "Виберіть ім'Ñ"
@@ -27672,9 +27915,6 @@ msgstr "Конвеєр %{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "Конвеєр %{label} Ð´Ð»Ñ \"%{dataTitle}\""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27744,6 +27984,12 @@ 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 "ПереглÑньте %{linkStart}прикладів та шаблонів CI/CD%{linkEnd}"
@@ -28473,6 +28719,9 @@ 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 ""
@@ -28512,9 +28761,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28572,6 +28818,9 @@ msgstr "Будь лаÑка, введіть %{phrase_code} Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "Будь лаÑка, викориÑтовуйте цю форму щоб повідомити адміну Ñкі кориÑтувачі Ñтворюють Ñпам (задачі або коментарі) або поводÑÑ‚ÑŒÑÑ Ð½ÐµÐ½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ чином."
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "Будь лаÑка, зачекайте, Ñ†Ñ Ñторінка автоматично оновитьÑÑ, коли буде готова."
@@ -28656,6 +28905,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28665,6 +28920,12 @@ msgstr "Ðалаштуйте інтеграцію зі Ñторонніми Ñл
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 "Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу у 24-годинному форматі"
@@ -28696,11 +28957,14 @@ msgid "Preferences|Layout width"
msgstr "Ширина макета"
msgid "Preferences|Must be a number between %{min} and %{max}"
-msgstr ""
+msgstr "Повинно бути чиÑлом від %{min} до %{max}"
msgid "Preferences|Navigation theme"
msgstr "Тема навігації"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "ВміÑÑ‚ оглÑдової Ñторінки проєкту"
@@ -28800,9 +29064,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr "Головний"
-
msgid "Primary Action"
msgstr ""
@@ -29101,7 +29362,7 @@ msgid "Profiles|Invalid username"
msgstr "Ðеправильне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Profiles|Job title"
-msgstr ""
+msgstr "ПоÑада"
msgid "Profiles|Key"
msgstr "Ключ"
@@ -29257,7 +29518,7 @@ msgid "Profiles|Using emojis in names seems fun, but please try to set a status
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñмайликів в іменах виглÑдає дотепно, але, будь лаÑка, краще викориÑтовуйте Ñ—Ñ… в повідомленнÑÑ… про ÑтатуÑ"
msgid "Profiles|Website url"
-msgstr ""
+msgstr "ÐдреÑа Ñайту"
msgid "Profiles|What's your status?"
msgstr "Який ваш ÑтатуÑ?"
@@ -29421,9 +29682,6 @@ msgstr "Ðеможливо видалити екÑпорт проєкту."
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr "ЕкÑпорт проєкту увімкнено"
-
msgid "Project export has been deleted."
msgstr "ЕкÑпорт проєкту видалений."
@@ -29734,7 +29992,7 @@ msgid "ProjectSettings|%{link_start}What variables can I use?%{link_end}"
msgstr ""
msgid "ProjectSettings|Additional settings that influence how and when merges are done."
-msgstr ""
+msgstr "Додаткові налаштуваннÑ, Ñкі впливають на те, Ñк Ñ– коли виконуютьÑÑ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ."
msgid "ProjectSettings|All discussions must be resolved"
msgstr "Ð’ÑÑ– Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути завершені"
@@ -29755,7 +30013,7 @@ msgid "ProjectSettings|Badges"
msgstr "Значки"
msgid "ProjectSettings|Build, test, and deploy your changes."
-msgstr ""
+msgstr "Збирайте, теÑтуйте та розгортайте Ñвої зміни."
msgid "ProjectSettings|Checkbox is visible and selected by default."
msgstr ""
@@ -29773,7 +30031,7 @@ msgid "ProjectSettings|Choose your merge method, options, checks, and squash opt
msgstr ""
msgid "ProjectSettings|Configure your project resources and monitor their health."
-msgstr ""
+msgstr "Ðалаштуйте реÑурÑи вашого проєкту Ñ– відÑтежуйте Ñ—Ñ… здоров'Ñ."
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб змінити це налаштуваннÑ."
@@ -29791,7 +30049,7 @@ msgid "ProjectSettings|Disable email notifications"
msgstr "Вимкнути ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾ÑŽ поштою"
msgid "ProjectSettings|Do not allow"
-msgstr ""
+msgstr "Ðе дозволÑти"
msgid "ProjectSettings|Enable \"Delete source branch\" option by default"
msgstr ""
@@ -29806,13 +30064,13 @@ msgid "ProjectSettings|Encourage"
msgstr ""
msgid "ProjectSettings|Every merge creates a merge commit."
-msgstr ""
+msgstr "Кожне Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñтворить окремий коміт."
msgid "ProjectSettings|Every project can have its own space to store its Docker images"
msgstr "Кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñвоїх образів Docker"
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 ""
+msgstr "Кожен проєкт може мати влаÑний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð¹Ð¾Ð³Ð¾ пакетів. Примітка: РеєÑÑ‚Ñ€ пакунків завжди видно, коли проєкт Ñ” публічним."
msgid "ProjectSettings|Everyone"
msgstr "Ð’ÑÑ–"
@@ -29875,7 +30133,7 @@ msgid "ProjectSettings|Manage who can see the project in the public access direc
msgstr ""
msgid "ProjectSettings|Manages large files such as audio, video, and graphics files."
-msgstr ""
+msgstr "Керує великими файлами такими Ñк аудіо, відео та графіка."
msgid "ProjectSettings|Maximum %{maxLength} characters."
msgstr ""
@@ -29935,7 +30193,7 @@ msgid "ProjectSettings|Pages"
msgstr "Pages"
msgid "ProjectSettings|Pages for project documentation."
-msgstr ""
+msgstr "Сторінки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ð½Ð¾Ñ— документації."
msgid "ProjectSettings|Pipelines must succeed"
msgstr "Конвеєри мають бути уÑпішними"
@@ -29962,16 +30220,16 @@ msgid "ProjectSettings|Requirements"
msgstr "Вимоги"
msgid "ProjectSettings|Requirements management system."
-msgstr ""
+msgstr "СиÑтема ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¸Ð¼Ð¾Ð³Ð°Ð¼Ð¸."
msgid "ProjectSettings|Search for topic"
-msgstr ""
+msgstr "Пошук теми"
msgid "ProjectSettings|Security & Compliance"
-msgstr ""
+msgstr "Безпека та відповідніÑÑ‚ÑŒ"
msgid "ProjectSettings|Security & Compliance for this project"
-msgstr ""
+msgstr "Безпека та відповідніÑÑ‚ÑŒ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проєкту"
msgid "ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests."
msgstr ""
@@ -29983,7 +30241,7 @@ 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 ""
+msgstr "Показувати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‡Ð¸ переглÑду запиту на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸ відправці із командного Ñ€Ñдка"
msgid "ProjectSettings|Skipped pipelines are considered successful"
msgstr ""
@@ -30004,7 +30262,7 @@ msgid "ProjectSettings|Squashing is never performed and the checkbox is hidden."
msgstr ""
msgid "ProjectSettings|Submit changes to be merged upstream."
-msgstr ""
+msgstr "Відправити зміни Ð´Ð»Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² батьківÑькі репозиторії."
msgid "ProjectSettings|Target project"
msgstr ""
@@ -30049,28 +30307,28 @@ msgid "ProjectSettings|Used for every new merge request."
msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
-msgstr ""
+msgstr "КориÑтувачі можуть копіювати репозиторій в новий проєкт."
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-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 ""
+msgstr "ПереглÑдати та редагувати файли в цьому проєкті."
msgid "ProjectSettings|View and edit files in this project. Non-project members have only read access."
msgstr ""
msgid "ProjectSettings|View project analytics."
-msgstr ""
+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 ""
+msgstr "Ð’Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÐºÐ°Ð·Ð½Ð¸ÐºÑ–Ð² ефективноÑÑ‚Ñ– проєкту."
msgid "ProjectSettings|Warn about Potentially Unwanted Characters"
msgstr ""
@@ -31101,9 +31359,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr "Інтервал повторної перевірки"
-
msgid "Read documentation"
msgstr "Прочитати документацію"
@@ -31188,9 +31443,6 @@ msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð¾Ñтанніх пошуків недоÑтупний"
msgid "Recent events"
msgstr "Ðещодавні події"
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr "ОÑтанні пошукові запити"
@@ -31297,9 +31549,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr "ЗареєÑтрувати за допомогою двофакторного заÑтоÑунку"
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31431,10 +31680,10 @@ msgid "ReleaseAssetLinkType|Packages"
msgstr "Пакети"
msgid "ReleaseAssetLinkType|Runbook"
-msgstr ""
+msgstr "Runbooks"
msgid "ReleaseAssetLinkType|Runbooks"
-msgstr ""
+msgstr "Runbooks"
msgid "Released date"
msgstr ""
@@ -31686,10 +31935,10 @@ msgid "Removed upload with id %{id}"
msgstr ""
msgid "RemovedProjects|No projects pending deletion found"
-msgstr ""
+msgstr "Ðе знайдено проєктів, Ñкі очікують на видаленнÑ"
msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
-msgstr ""
+msgstr "Тут перелічено проєкти, Ñкі очікують на видаленнÑ, до Ñких у Ð²Ð°Ñ Ñ” доÑтуп."
msgid "Removes %{assignee_text} %{assignee_references}."
msgstr "ВидалÑÑ” %{assignee_text} %{assignee_references}."
@@ -31778,9 +32027,6 @@ msgstr "Повторно відкрито %{quick_action_target}."
msgid "Reopens this %{quick_action_target}."
msgstr "Повторно відкриває %{quick_action_target}."
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "Замінити"
@@ -31820,9 +32066,6 @@ msgstr ""
msgid "Repo by URL"
msgstr "Репозиторії по URL"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31924,9 +32167,12 @@ msgstr "Помилка"
msgid "Reports|Filename"
msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
-msgid "Reports|Full report"
+msgid "Reports|Fixed"
msgstr ""
+msgid "Reports|Full report"
+msgstr "Повний звіт"
+
msgid "Reports|Head report parsing error:"
msgstr ""
@@ -31954,6 +32200,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -32128,9 +32377,6 @@ msgstr ""
msgid "Repository storage"
msgstr "Сховище репозиторію"
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -32149,9 +32395,6 @@ msgstr "Запит доÑтупу"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -32161,9 +32404,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -32203,9 +32443,6 @@ msgstr ""
msgid "Requests"
msgstr "Запити"
-msgid "Requests Profiles"
-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 ""
@@ -32415,9 +32652,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32439,6 +32673,9 @@ msgstr ""
msgid "Retry"
msgstr "Спробувати знову"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32564,6 +32801,9 @@ msgstr "План-графік"
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "Роль"
@@ -32606,10 +32846,10 @@ msgstr "ПротеÑтувати ваш запущений код за допоÐ
msgid "Run untagged jobs"
msgstr "Виконати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· тегів"
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32627,9 +32867,6 @@ msgstr "Runner'и"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "ДоÑтупні Runner'и: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Сторінка Runner'ів."
@@ -32692,9 +32929,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32753,6 +32987,9 @@ 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|Group"
msgstr "Група"
@@ -32814,7 +33051,7 @@ msgid "Runners|Offline runners"
msgstr ""
msgid "Runners|Offline:"
-msgstr ""
+msgstr "Офлайн:"
msgid "Runners|Online"
msgstr ""
@@ -32823,7 +33060,7 @@ msgid "Runners|Online runners"
msgstr ""
msgid "Runners|Online:"
-msgstr ""
+msgstr "Онлайн:"
msgid "Runners|Pause from accepting jobs"
msgstr ""
@@ -32946,6 +33183,9 @@ msgstr "Runner'и"
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 ""
@@ -33030,9 +33270,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -33045,9 +33282,6 @@ msgstr "активні"
msgid "Runners|group"
msgstr "Група"
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33525,7 +33759,7 @@ msgid "Searching by both author and message is currently not supported."
msgstr ""
msgid "Seats"
-msgstr ""
+msgstr "МіÑць"
msgid "Seats owed"
msgstr ""
@@ -33536,9 +33770,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr "Вторинний"
-
msgid "Secondary email:"
msgstr ""
@@ -33560,9 +33791,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33726,7 +33954,7 @@ msgid "SecurityConfiguration|SAST Configuration"
msgstr ""
msgid "SecurityConfiguration|Secure your project"
-msgstr ""
+msgstr "ЗахиÑтити Ñвій проєкт"
msgid "SecurityConfiguration|Security testing"
msgstr ""
@@ -33749,6 +33977,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33764,6 +33995,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33779,10 +34013,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33791,16 +34022,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+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|Edit network policy"
+msgid "SecurityOrchestration|Delete policy: %{policy}"
+msgstr ""
+
+msgid "SecurityOrchestration|Description"
+msgstr ""
+
+msgid "SecurityOrchestration|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33809,7 +34064,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33827,28 +34082,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr "Мережа"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "Ðова політика"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33872,6 +34115,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr "Політики"
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33881,6 +34127,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr "ÐžÐ¿Ð¸Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸"
@@ -33890,15 +34139,18 @@ msgstr "Редактор політики"
msgid "SecurityOrchestration|Policy status"
msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸"
-msgid "SecurityOrchestration|Policy summary"
-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 "Правила"
@@ -33911,6 +34163,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33947,6 +34202,9 @@ 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 ""
@@ -33962,6 +34220,9 @@ 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 ""
@@ -33977,6 +34238,9 @@ 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 ""
@@ -34001,10 +34265,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -34058,10 +34322,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -34280,7 +34544,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34466,6 +34730,9 @@ msgstr ""
msgid "Select branch"
msgstr "Виберіть гілку"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34481,9 +34748,6 @@ msgstr "Вибрати групу"
msgid "Select group or project"
msgstr "Вибрати групу чи проєкт"
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr "Виберіть Ñтан здоров'Ñ"
@@ -34526,9 +34790,6 @@ msgstr "Вибрати проєкти"
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr "Виберіть Ñегменти Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—"
-
msgid "Select source"
msgstr "Виберіть джерело"
@@ -34577,9 +34838,6 @@ 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 "Selective synchronization"
-msgstr "Вибіркова ÑинхронізаціÑ"
-
msgid "Self monitoring"
msgstr ""
@@ -34781,13 +35039,13 @@ 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 ""
-msgid "Service account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34937,9 +35195,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34976,18 +35231,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr "Ð’Ñтановити вагу"
msgid "Set weight to %{weight}."
msgstr "Ð’Ñтановити вагу %{weight}."
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -35088,9 +35337,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr "Сегменти Ð´Ð»Ñ Ñинхронізації"
-
msgid "Share"
msgstr "ПоділитиÑÑ"
@@ -35995,6 +36241,12 @@ 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 ""
@@ -36517,6 +36769,12 @@ 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 "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ підгрупу"
@@ -36643,27 +36901,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36856,6 +37093,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36871,6 +37114,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr "Сірий"
@@ -36889,6 +37138,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr "Червоний"
@@ -36931,7 +37183,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36940,9 +37192,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36967,6 +37216,9 @@ 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 ""
@@ -36976,7 +37228,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -37037,9 +37292,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -37098,7 +37350,7 @@ msgid "Survey Response"
msgstr ""
msgid "Switch Branches"
-msgstr ""
+msgstr "Перемкнути гілки"
msgid "Switch branch"
msgstr ""
@@ -37124,9 +37376,6 @@ msgstr "Синхронізувати зараз"
msgid "Synced"
msgstr "Синхронізовано"
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -37292,6 +37541,9 @@ msgstr "ÐžÐ¿Ð¸Ñ Ñ€ÐµÐ»Ñ–Ð·Ñƒ"
msgid "TagsPage|Repository has no tags yet."
msgstr "Репозиторій не міÑтить тегів."
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "Теги"
@@ -37497,10 +37749,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr "Розпочати роботу з Terraform"
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37581,6 +37830,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr "Ви не можете видалити файл Ñтану, тому що він заблокований. Перш ніж видалÑти його, розблокуйте файл Ñтану."
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "ТеÑÑ‚"
@@ -37590,9 +37842,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37848,9 +38097,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -38161,9 +38407,6 @@ msgstr "УÑпішно Ñтворено форк проєкту."
msgid "The project was successfully imported."
msgstr "Проєкт уÑпішно імпортовано."
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -38275,7 +38518,7 @@ msgstr "ВразливіÑÑ‚ÑŒ більше не виÑвлÑєтьÑÑ. ПерÐ
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr "ВразливіÑÑ‚ÑŒ більше не виÑвлÑєтьÑÑ. Перевірте, що цю вразливіÑÑ‚ÑŒ виправлено перед тим, Ñк змінювати ÑтатуÑ."
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -38455,12 +38698,21 @@ 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 "Помилка при відÑиланні Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ електронній пошті"
@@ -38512,12 +38764,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні %{replicableType}"
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38566,9 +38812,6 @@ msgstr "Помилка при Ñкиданні хвилин Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr "Помилка при збереженні ваших змін."
@@ -38584,9 +38827,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr "Помилка при перевірці вашого запиту"
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38830,6 +39070,9 @@ 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 "Ð¦Ñ Ñ„ÑƒÐ½Ñ†Ñ–Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ–ÑÑ‚ÑŒ вимагає ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñховища"
@@ -38941,8 +39184,8 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
-msgstr "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ від інших завдань із заÑтарілими/Ñтертими артефактами: %{invalid_dependencies}"
+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 "Це Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ від попередніх, Ñкі повинні завершитиÑÑ ÑƒÑпішно Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ запуÑку"
@@ -39088,9 +39331,6 @@ msgstr "Такий проÑÑ‚Ñ–Ñ€ імен вже викориÑтовуєтьÑ
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr "Ð¦Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ–ÑÑ‚ÑŒ доÑтупна тільки на GitLab.com"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "Ð¦Ñ Ñторінка недоÑтупна, тому що ви не можете переглÑдати інформацію по кількох проєктах."
@@ -39244,11 +39484,8 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
-msgstr ""
+msgstr "Деталі попередженнÑ"
msgid "ThreatMonitoring|Alerts"
msgstr "ПопередженнÑ"
@@ -39415,9 +39652,6 @@ msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´ першого коміту до першого комен
msgid "Time from last commit to merge"
msgstr "Ð§Ð°Ñ Ð²Ñ–Ð´ оÑтаннього коміту до злиттÑ"
-msgid "Time in seconds"
-msgstr "Ð§Ð°Ñ Ð² Ñекундах"
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39586,10 +39820,10 @@ msgstr "щойно"
msgid "Timeago|right now"
msgstr "зараз"
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39666,6 +39900,9 @@ msgstr ""
msgid "To access this domain create a new DNS record"
msgstr "Щоб отримати доÑтуп до цього домену, Ñтворіть новий Ð·Ð°Ð¿Ð¸Ñ DNS"
+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 ""
@@ -39675,6 +39912,9 @@ 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 ""
@@ -39726,9 +39966,6 @@ msgstr "Спочатку введіть адреÑу Ñервера GÑ–tea Ñ– %{
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39975,8 +40212,11 @@ msgstr "Іконка теми"
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
-msgstr "Ðазва теми"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
+msgstr ""
msgid "Topic was successfully updated."
msgstr "Тему уÑпішно оновлено."
@@ -40215,7 +40455,7 @@ 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."
+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."
@@ -40231,10 +40471,10 @@ msgid "Trigger token:"
msgstr "Токен тригера:"
msgid "Trigger variables:"
-msgstr ""
+msgstr "Змінні тригера:"
msgid "Trigger was created successfully."
-msgstr ""
+msgstr "Тригер Ñтворено уÑпішно."
msgid "Trigger was successfully updated."
msgstr "Тригер уÑпішно оновлено."
@@ -40254,6 +40494,9 @@ 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 "Спробуйте ще раз"
@@ -40296,9 +40539,6 @@ msgstr "ВідбуваєтьÑÑ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· вашим приÑÑ‚Ñ€Ð
msgid "Tuesday"
msgstr "Вівторок"
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr "Вимкнути"
@@ -40350,9 +40590,6 @@ msgstr ""
msgid "Type"
msgstr "Тип"
-msgid "Type/State"
-msgstr "Тип/Стан"
-
msgid "U2F Devices (%{length})"
msgstr "U2F приÑтрої (%{length})"
@@ -40458,6 +40695,9 @@ 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 "Ðе вдалоÑÑ Ñтворити новий ідентифікатор інÑтанÑу"
@@ -40737,9 +40977,6 @@ msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ вдалоÑÑ"
msgid "Update it"
msgstr "Оновити це"
-msgid "Update iteration"
-msgstr "Оновити ітерацію"
-
msgid "Update milestone"
msgstr "Оновити етап"
@@ -40759,7 +40996,7 @@ msgid "Update your group name, description, avatar, and visibility."
msgstr "Оновіть Ñ–Ð¼â€™Ñ Ð³Ñ€ÑƒÐ¿Ð¸, опиÑ, аватар та видиміÑÑ‚ÑŒ."
msgid "Update your project name, topics, description, and avatar."
-msgstr ""
+msgstr "Оновіть ім'Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ, теми, Ð¾Ð¿Ð¸Ñ Ñ‚Ð° аватар."
msgid "UpdateProject|Cannot rename project because it contains container registry tags!"
msgstr "Ðеможливо перейменувати проєкт, тому що він має теги в реєÑтрі контейнерів!"
@@ -40788,9 +41025,6 @@ msgstr "Оновлено %{updated_at} %{updated_by}"
msgid "Updated date"
msgstr "Дата оновленнÑ"
-msgid "Updates"
-msgstr "ОновленнÑ"
-
msgid "Updating"
msgstr "ОновленнÑ"
@@ -40807,7 +41041,7 @@ msgid "Upgrade your plan"
msgstr "Перейти на вищий тарифний план"
msgid "Upload"
-msgstr ""
+msgstr "Завантажити"
msgid "Upload %{file_name} file"
msgstr "Завантажити %{file_name} файл"
@@ -40816,7 +41050,7 @@ msgid "Upload CSV file"
msgstr "Завантажити CSV файл"
msgid "Upload File"
-msgstr ""
+msgstr "Завантажити файл"
msgid "Upload New File"
msgstr "ÐадіÑлати новий файл"
@@ -40828,7 +41062,7 @@ msgid "Upload a private key for your certificate"
msgstr "Завантажити приватний ключ Ð´Ð»Ñ Ñертифіката"
msgid "Upload an image"
-msgstr ""
+msgstr "Завантажити зображеннÑ"
msgid "Upload file"
msgstr "ÐадіÑлати файл"
@@ -40846,7 +41080,7 @@ msgid "UploadLink|click to upload"
msgstr "ÐатиÑніть, щоб надіÑлати"
msgid "Uploaded"
-msgstr ""
+msgstr "Завантажено"
msgid "Uploading changes to terminal"
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ до терміналу"
@@ -40896,6 +41130,12 @@ 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 ""
@@ -40905,7 +41145,7 @@ msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð° поточний період"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40956,6 +41196,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "Сніпети"
@@ -41004,6 +41247,12 @@ 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 "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¾Ð²Ð¸Ñ… реÑурÑів у проєктах групи %{strong_start}%{group_name}%{strong_end}"
@@ -41016,9 +41265,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð´"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -41169,7 +41415,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr "ВикориÑтовувати хешоване Ñховище"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41565,7 +41811,7 @@ 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."
+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."
@@ -41760,9 +42006,6 @@ msgstr "Різноманітні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¸."
msgid "Various settings that affect GitLab performance."
msgstr "Різноманітні налаштуваннÑ, що впливають на продуктивніÑÑ‚ÑŒ GitLab."
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr "Стан перевірки"
@@ -42312,7 +42555,7 @@ msgstr "Ідентифікатори"
msgid "Vulnerability|Image"
msgstr "Образ"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -42394,7 +42637,7 @@ msgid "Waiting for approval"
msgstr ""
msgid "Waiting for merge (open and assigned)"
-msgstr ""
+msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð·Ð»Ð¸Ñ‚Ñ‚Ñ (відкрите Ñ– призначене)"
msgid "Waiting for performance data"
msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про продуктивніÑÑ‚ÑŒ"
@@ -42423,9 +42666,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr "Ми не змогли визначити шлÑÑ… до Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑƒ"
@@ -42573,7 +42813,7 @@ msgstr "Допомога по веб-хукам"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42754,7 +42994,7 @@ msgid "Welcome, %{name}!"
msgstr "ЛаÑкаво проÑимо, %{name}!"
msgid "What are CI/CD minutes?"
-msgstr ""
+msgstr "Що таке хвилини CI/CD?"
msgid "What are group audit events?"
msgstr ""
@@ -42768,9 +43008,6 @@ msgstr ""
msgid "What does this command do?"
msgstr "Що робить Ñ†Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°?"
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42780,11 +43017,8 @@ msgstr ""
msgid "What is squashing?"
msgstr "Що таке об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (squash) комітів?"
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
-msgstr ""
+msgstr "Яка ваша поÑада? (необов'Ñзково)"
msgid "What templates can I create?"
msgstr ""
@@ -42810,7 +43044,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42819,9 +43053,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "Коли цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¸Ð¹Ð½Ñто"
@@ -42865,7 +43096,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -43094,26 +43325,35 @@ msgid "Won't fix / Accept risk"
msgstr ""
msgid "Work in progress (open and unassigned)"
-msgstr ""
+msgstr "ВиконуєтьÑÑ Ñ€Ð¾Ð±Ð¾Ñ‚Ð° (відкрита та не призначена)"
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr "Ðове завданнÑ"
msgid "WorkItem|Select type"
-msgstr ""
+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 ""
@@ -43129,6 +43369,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -43192,6 +43435,13 @@ 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] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -43288,7 +43538,7 @@ msgstr "Ви знаходитеÑÑ Ð½Ð° інÑтанÑÑ– Gitlab \"тільки
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "Ви отримуєте це повідомленнÑ, бо ви Ñ” адмініÑтратором GitLab Ð´Ð»Ñ %{url}."
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -43394,13 +43644,13 @@ msgid "You can group test cases using labels. To learn about the future directio
msgstr ""
msgid "You can invite a new member to %{project_name} or invite another group."
-msgstr ""
+msgstr "Ви можете запроÑити нового учаÑника до %{project_name} або запроÑити іншу групу."
msgid "You can invite a new member to %{project_name}."
-msgstr ""
+msgstr "Ви можете запроÑити нового учаÑника до %{project_name}."
msgid "You can invite a new member to %{strong_start}%{group_name}%{strong_end}."
-msgstr ""
+msgstr "Ви можете запроÑити нового учаÑника до %{strong_start}%{group_name}%{strong_end}."
msgid "You can invite another group to %{project_name}."
msgstr ""
@@ -43459,6 +43709,9 @@ msgstr "Ви можете перевірити Ñвій .gitlab-ci.yml у %{link
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 ""
@@ -43835,6 +44088,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -44166,15 +44422,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -44270,9 +44526,6 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "approved by: "
-msgstr "затверджено кориÑтувачем: "
-
msgid "archived"
msgstr "заархівовано"
@@ -44328,6 +44581,15 @@ 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 ""
@@ -44467,6 +44729,9 @@ 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 "Ðвтоматично заÑтоÑувати патч у новій гілці"
@@ -45203,7 +45468,7 @@ msgstr[1] "запити на злиттÑ"
msgstr[2] "запитів на злиттÑ"
msgstr[3] "запитів на злиттÑ"
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -45215,6 +45480,12 @@ 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 "1 коміт-злиттÑ"
@@ -45224,6 +45495,12 @@ 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 "Цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ міÑтить змін."
@@ -45231,7 +45508,7 @@ msgid "mrWidgetNothingToMerge|Use merge requests to propose changes to your proj
msgstr ""
msgid "mrWidget|%{boldHeaderStart}Looks like there's no pipeline here.%{boldHeaderEnd}"
-msgstr ""
+msgstr "%{boldHeaderStart}Схоже, що конвеєр тут відÑутній%{boldHeaderEnd}"
msgid "mrWidget|%{linkStart}Set up now%{linkEnd} to analyze your source code for known security vulnerabilities."
msgstr ""
@@ -45302,9 +45579,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr "СкаÑувати автоматичне злиттÑ"
-msgid "mrWidget|Check out branch"
-msgstr "Перейти в гілку"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -45346,10 +45620,7 @@ msgid "mrWidget|Dismiss"
msgstr "Відхилити"
msgid "mrWidget|Does not delete the source branch"
-msgstr ""
-
-msgid "mrWidget|Email patches"
-msgstr "Email-патчі"
+msgstr "Ðе можливо видалити гілку-джерело"
msgid "mrWidget|Failed to load deployment statistics"
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ ÑтатиÑтику розгортаннÑ"
@@ -45463,9 +45734,6 @@ msgstr "Відкрити у Gitpod"
msgid "mrWidget|Open in Web IDE"
msgstr "Відкрити у Web IDE"
-msgid "mrWidget|Plain diff"
-msgstr "ПроÑте порівнÑÐ½Ð½Ñ (diff)"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45613,6 +45881,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "потребує уваги"
@@ -45628,11 +45899,8 @@ msgstr "необмежений термін дії"
msgid "new merge request"
msgstr "Ðовий запит на злиттÑ"
-msgid "no approvers"
-msgstr "немає затверджуючих оÑіб"
-
msgid "no expiration"
-msgstr ""
+msgstr "без закінченнÑ"
msgid "no name set"
msgstr "немає імені"
@@ -45646,6 +45914,12 @@ msgstr ""
msgid "none"
msgstr "немає"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "не знайдено"
@@ -45706,10 +45980,7 @@ msgid "pending comment"
msgstr "коментар в очікуванні"
msgid "pending deletion"
-msgstr ""
-
-msgid "per day"
-msgstr "за день"
+msgstr "очікує видаленнÑ"
msgid "personal access token"
msgstr "оÑобиÑтий токен доÑтупу"
@@ -45749,7 +46020,7 @@ msgstr[2] "балів"
msgstr[3] "балів"
msgid "previously merged commits"
-msgstr ""
+msgstr "раніше об'єднанні коміти"
msgid "private"
msgstr "приватний"
@@ -45846,6 +46117,9 @@ msgstr[1] "відповіді"
msgstr[2] "відповідей"
msgstr[3] "відповідей"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr "репозиторії"
diff --git a/locale/ur_PK/gitlab.po b/locale/ur_PK/gitlab.po
index 33e4fc9a548..d14894088c2 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/uz_UZ/gitlab.po b/locale/uz_UZ/gitlab.po
index 898ac868397..dd541c41c30 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:16\n"
+"PO-Revision-Date: 2022-05-01 06:57\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -265,11 +265,6 @@ msgid_plural "%d groups"
msgstr[0] ""
msgstr[1] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -385,11 +380,6 @@ msgid_plural "%d seconds"
msgstr[0] ""
msgstr[1] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -511,7 +501,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -652,6 +642,9 @@ 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 ""
@@ -781,9 +774,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -793,9 +783,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -963,9 +950,6 @@ msgid_plural "%{securityScanner} results are not available because a pipeline ha
msgstr[0] ""
msgstr[1] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1279,9 +1263,6 @@ msgid_plural "+%d more"
msgstr[0] ""
msgstr[1] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1343,6 +1324,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1467,6 +1451,9 @@ msgstr[1] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1479,6 +1466,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1554,9 +1544,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1602,9 +1589,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1629,6 +1613,9 @@ 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 ""
@@ -1980,9 +1967,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1998,12 +1982,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -2124,9 +2102,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2175,6 +2150,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2334,15 +2312,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2595,12 +2573,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2637,6 +2609,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2649,12 +2624,39 @@ 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 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 ""
@@ -2664,12 +2666,24 @@ 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|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 ""
@@ -2700,18 +2714,39 @@ 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|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 ""
@@ -2721,6 +2756,9 @@ 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|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 ""
@@ -2751,9 +2789,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3627,6 +3683,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3642,13 +3701,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3690,9 +3755,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3708,9 +3770,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -4080,6 +4139,9 @@ 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 ""
@@ -4154,9 +4216,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4223,9 +4282,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4256,6 +4312,9 @@ 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 ""
@@ -4334,12 +4393,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4377,37 +4451,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4416,22 +4487,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4487,9 +4558,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4681,15 +4749,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5221,7 +5280,7 @@ 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."
+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"
@@ -5260,6 +5319,9 @@ 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 ""
@@ -5446,7 +5508,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5599,7 +5661,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5629,9 +5691,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5737,12 +5796,21 @@ 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|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 ""
@@ -5770,22 +5838,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5800,15 +5874,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5833,9 +5913,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6229,9 +6306,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6289,9 +6363,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6352,6 +6423,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6367,6 +6441,9 @@ 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 ""
@@ -6391,9 +6468,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6520,9 +6594,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6538,6 +6609,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6553,6 +6627,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6624,7 +6701,7 @@ 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."
+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."
@@ -6792,6 +6869,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -7026,9 +7109,15 @@ 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 ""
@@ -7047,6 +7136,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -7116,6 +7208,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7336,6 +7431,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7402,6 +7500,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7429,9 +7530,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7618,6 +7716,11 @@ 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 ""
@@ -7822,6 +7925,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7879,13 +7985,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7894,6 +8000,9 @@ 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 ""
@@ -7915,12 +8024,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7984,13 +8087,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -8002,7 +8105,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -8026,6 +8129,11 @@ 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 ""
@@ -8038,9 +8146,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -8050,19 +8155,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -8071,7 +8179,7 @@ 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}"
+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}."
@@ -8083,17 +8191,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-msgstr[1] ""
-
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 ""
@@ -8112,7 +8218,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8271,9 +8377,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8787,6 +8890,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8820,7 +8926,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8994,9 +9100,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -9119,9 +9222,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9224,9 +9324,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9587,9 +9684,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9620,9 +9714,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9750,6 +9841,9 @@ 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 ""
@@ -9941,9 +10035,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9980,6 +10071,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -10088,9 +10182,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -10106,6 +10197,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -10148,6 +10242,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10454,6 +10551,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10940,7 +11040,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -11114,6 +11217,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -11132,6 +11238,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -11141,6 +11250,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11517,6 +11629,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11607,25 +11725,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11642,13 +11760,13 @@ msgid_plural "DastSiteValidation|This will affect %d other profiles targeting th
msgstr[0] ""
msgstr[1] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11930,6 +12048,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -12041,6 +12162,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12167,9 +12291,15 @@ 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 ""
@@ -12179,9 +12309,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12197,6 +12324,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12455,6 +12585,9 @@ 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 ""
@@ -12604,10 +12737,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -13002,6 +13141,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -13017,6 +13159,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -13036,9 +13181,18 @@ 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 ""
@@ -13077,9 +13231,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -13092,6 +13243,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13226,7 +13380,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13313,9 +13467,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13403,9 +13554,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13559,6 +13716,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13613,9 +13773,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13676,9 +13833,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13688,6 +13842,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13784,13 +13941,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13814,18 +13971,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13907,12 +14058,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13958,12 +14103,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -14030,7 +14169,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -14133,9 +14272,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14395,6 +14532,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14419,9 +14559,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14524,6 +14661,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14779,9 +14919,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -15114,6 +15251,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15413,6 +15553,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15443,6 +15586,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15599,7 +15745,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15844,6 +15990,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15871,9 +16020,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -16000,9 +16146,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -16123,9 +16266,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16354,6 +16494,16 @@ 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}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16387,6 +16537,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16408,6 +16561,12 @@ 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 ""
@@ -16417,9 +16576,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16432,6 +16606,9 @@ 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 ""
@@ -16453,9 +16630,21 @@ 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 ""
@@ -16465,24 +16654,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16495,6 +16696,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16519,21 +16723,39 @@ 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 ""
@@ -16543,6 +16765,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16555,6 +16780,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16576,6 +16804,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16618,6 +16849,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16645,15 +16879,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16687,6 +16945,12 @@ 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 ""
@@ -16699,9 +16963,21 @@ 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 ""
@@ -16711,12 +16987,18 @@ 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 ""
@@ -16741,6 +17023,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16756,7 +17041,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16912,7 +17197,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -17083,6 +17368,15 @@ 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 ""
@@ -17956,9 +18250,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -18076,9 +18367,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18485,6 +18773,9 @@ 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 ""
@@ -18497,9 +18788,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18648,12 +18936,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18786,6 +19068,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18825,15 +19110,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18846,9 +19128,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -19128,9 +19407,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19212,6 +19488,9 @@ 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 ""
@@ -19332,6 +19611,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19443,6 +19725,9 @@ 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 ""
@@ -19626,9 +19911,15 @@ 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 ""
@@ -19770,6 +20061,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19893,18 +20187,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20378,9 +20660,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20423,9 +20702,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20435,6 +20711,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20486,6 +20765,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20561,9 +20843,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -21119,12 +21398,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -21134,9 +21419,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21260,9 +21551,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21368,7 +21656,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21419,9 +21707,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21503,6 +21788,9 @@ 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 ""
@@ -21557,6 +21845,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21569,6 +21860,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -22108,6 +22402,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22288,6 +22585,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22297,6 +22597,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22321,6 +22624,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22497,10 +22803,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22548,24 +22851,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22752,9 +23046,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22809,6 +23100,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -23112,6 +23406,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -23151,6 +23448,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23208,7 +23508,7 @@ 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 28px tall header logo"
+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."
@@ -23467,6 +23767,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23587,6 +23890,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23833,6 +24139,18 @@ 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 ""
@@ -24347,10 +24665,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24578,9 +24896,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24602,12 +24917,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24679,19 +24988,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24796,75 +25105,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24874,87 +25117,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25236,9 +25404,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25446,9 +25611,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25631,6 +25793,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25667,9 +25832,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25795,6 +25957,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25849,9 +26047,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25894,6 +26089,9 @@ 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 ""
@@ -26050,9 +26248,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -26074,22 +26281,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -26104,6 +26326,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -26137,19 +26362,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -26182,6 +26413,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -26194,6 +26428,9 @@ 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 ""
@@ -26256,9 +26493,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26703,6 +26937,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26801,9 +27041,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26876,6 +27113,12 @@ 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 ""
@@ -26999,13 +27242,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -27092,7 +27335,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27278,9 +27521,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27350,6 +27590,12 @@ 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 ""
@@ -28079,6 +28325,9 @@ 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 ""
@@ -28118,9 +28367,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -28178,6 +28424,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28262,6 +28511,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28271,6 +28526,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28307,6 +28568,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28406,9 +28670,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -29027,9 +29288,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29657,7 +29915,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30707,9 +30965,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30794,9 +31049,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30901,9 +31153,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31380,9 +31629,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31422,9 +31668,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31516,6 +31759,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31546,6 +31792,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31720,9 +31969,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31741,9 +31987,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31753,9 +31996,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31795,9 +32035,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -32003,9 +32240,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -32027,6 +32261,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -32148,6 +32385,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -32190,10 +32430,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32211,9 +32451,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32272,9 +32509,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32331,6 +32565,9 @@ 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|Group"
msgstr ""
@@ -32522,6 +32759,9 @@ 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 ""
@@ -32606,9 +32846,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32621,9 +32858,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -33090,9 +33324,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -33114,9 +33345,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33303,6 +33531,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33318,6 +33549,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33333,10 +33567,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33345,16 +33576,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33363,7 +33618,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33381,28 +33636,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33426,6 +33669,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33435,6 +33681,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33444,15 +33693,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33465,6 +33717,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33501,6 +33756,9 @@ 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 ""
@@ -33516,6 +33774,9 @@ 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 ""
@@ -33531,6 +33792,9 @@ 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 ""
@@ -33555,10 +33819,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33612,10 +33876,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33834,7 +34098,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -34020,6 +34284,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -34035,9 +34302,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -34080,9 +34344,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -34131,9 +34392,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34335,13 +34593,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34491,9 +34749,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34530,18 +34785,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34640,9 +34889,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35545,6 +35791,12 @@ 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 ""
@@ -36067,6 +36319,12 @@ 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 ""
@@ -36193,27 +36451,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36406,6 +36643,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36421,6 +36664,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36439,6 +36688,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36481,7 +36733,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36490,9 +36742,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36517,6 +36766,9 @@ 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 ""
@@ -36526,7 +36778,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36585,9 +36840,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36672,9 +36924,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36840,6 +37089,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -37037,10 +37289,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -37121,6 +37370,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -37130,9 +37382,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37382,9 +37631,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37693,9 +37939,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37807,7 +38050,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37987,12 +38230,21 @@ 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 ""
@@ -38044,12 +38296,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -38098,9 +38344,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -38116,9 +38359,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38362,6 +38602,9 @@ 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 ""
@@ -38473,7 +38716,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38620,9 +38863,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38776,9 +39016,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38947,9 +39184,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -39118,10 +39352,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -39194,6 +39428,9 @@ 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 ""
@@ -39203,6 +39440,9 @@ 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 ""
@@ -39254,9 +39494,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39503,7 +39740,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39743,7 +39983,7 @@ 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."
+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."
@@ -39782,6 +40022,9 @@ 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 ""
@@ -39824,9 +40067,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39878,9 +40118,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39986,6 +40223,9 @@ 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 ""
@@ -40265,9 +40505,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40316,9 +40553,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40424,6 +40658,12 @@ 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 ""
@@ -40433,7 +40673,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40484,6 +40724,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40532,6 +40775,12 @@ 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 ""
@@ -40544,9 +40793,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40697,7 +40943,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -41093,7 +41339,7 @@ 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."
+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."
@@ -41288,9 +41534,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41834,7 +42077,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41945,9 +42188,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -42095,7 +42335,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42290,9 +42530,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42302,9 +42539,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42332,7 +42566,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42341,9 +42575,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42385,7 +42616,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42619,12 +42850,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42634,6 +42871,9 @@ 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 ""
@@ -42649,6 +42889,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42712,6 +42955,11 @@ 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 ""
@@ -42808,7 +43056,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42979,6 +43227,9 @@ 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 ""
@@ -43353,6 +43604,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43682,15 +43936,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43782,9 +44036,6 @@ msgid_plural "approvals"
msgstr[0] ""
msgstr[1] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43838,6 +44089,15 @@ 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 ""
@@ -43975,6 +44235,9 @@ 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 ""
@@ -44691,7 +44954,7 @@ msgid_plural "merge requests"
msgstr[0] ""
msgstr[1] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44703,6 +44966,12 @@ 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 ""
@@ -44712,6 +44981,12 @@ 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 ""
@@ -44790,9 +45065,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44834,9 +45106,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44947,9 +45216,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -45097,6 +45363,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -45112,9 +45381,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -45130,6 +45396,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -45188,9 +45460,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45320,6 +45589,9 @@ msgid_plural "replies"
msgstr[0] ""
msgstr[1] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/vi_VN/gitlab.po b/locale/vi_VN/gitlab.po
index d6abfa24f4d..8245aad2626 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:10\n"
+"PO-Revision-Date: 2022-05-01 06:52\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ 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 ""
@@ -694,9 +689,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr ""
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr ""
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3500,6 +3558,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,13 +3576,19 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
+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"
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 ""
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr ""
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index 643a417a96e..484a713a9f3 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr "从%{start}到%{end}"
@@ -41,7 +41,7 @@ msgid " and %{sliced}"
msgstr "和%{sliced}"
msgid " or "
-msgstr " 或 "
+msgstr " 或者"
msgid " or %{emphasisStart}!merge request id%{emphasisEnd}"
msgstr "或%{emphasisStart}!åˆå¹¶è¯·æ±‚id%{emphasisEnd}"
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] "%d 个群组"
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "%d个组已选择"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%då°æ—¶"
@@ -284,7 +280,7 @@ msgstr[0] "%d个更多评论"
msgid "%d new license"
msgid_plural "%d new licenses"
-msgstr[0] ""
+msgstr[0] "%d 个新许å¯è¯"
msgid "%d open issue"
msgid_plural "%d open issues"
@@ -316,16 +312,12 @@ msgstr[0] "选择了%d个项目"
msgid "%d removed license"
msgid_plural "%d removed licenses"
-msgstr[0] ""
+msgstr[0] "%d 个已删除的许å¯è¯"
msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "选中了%d个分片"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] "%d 个星标"
@@ -430,8 +422,8 @@ msgstr "%{codeStart}types%{codeEnd} 已弃用,并将在 15.0 中删除。改ä¸
msgid "%{code_open}Masked:%{code_close} Hidden in job logs. Must match masking requirements."
msgstr "%{code_open}éšè—:%{code_close} éšè—在作业日志中。必须符åˆéšè—è¦æ±‚。"
-msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or tags."
-msgstr "%{code_open}å—ä¿æŠ¤ï¼š%{code_close} 仅暴露于å—ä¿æŠ¤çš„分支或标签。"
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
+msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
msgstr "由 %{commit_author_link} 创作于 %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ msgstr "%{edit_in_new_fork_notice} å†æ¬¡å°è¯•ä¸Šä¼ æ–‡ä»¶ã€‚"
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 ""
+
msgid "%{extra} more downstream pipelines"
msgstr "å¦å¤– %{extra} 个下游æµæ°´çº¿"
@@ -694,9 +689,6 @@ msgstr "%{level_name} ä¸å…许在 %{group_level_name} 组。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由于派生的æºé¡¹ç›®å¯è§æ€§è¾ƒä½Žï¼Œå› æ­¤ä¸å…许使用%{level_name}。"
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr "%{linkStart}了解更多。%{linkEnd}"
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr "%{link_start}添加您从 GitLab Inc. 收到的许å¯è¯%{link_end}"
@@ -706,9 +698,6 @@ 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 "使用 %{link_start} %{draft_snippet}%{link_end} 开始标题,以防止åˆå¹¶è¯·æ±‚è‰ç¨¿åœ¨å‡†å¤‡å°±ç»ªä¹‹å‰åˆå¹¶ã€‚"
-msgid "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr "%{link_start}GitLab Inc. 收集哪些信æ¯ï¼Ÿ%{link_end}"
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr "%{listToShow},还有 %{awardsListLength} 个。"
@@ -776,7 +765,7 @@ msgid "%{name}, confirm your email address now!"
msgstr "%{name},请确认您的电å­é‚®ä»¶åœ°å€ï¼"
msgid "%{name}: %{resultsString}"
-msgstr ""
+msgstr "%{name}:%{resultsString}"
msgid "%{no_of_days} day"
msgid_plural "%{no_of_days} days"
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] "%{securityScanner}无结果,因为自å¯ç”¨ä»¥æ¥å°šæœªè¿è¡Œæµæ°´çº¿ã€‚%{linkStart}è¿è¡Œæµæ°´çº¿%{linkEnd}"
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr "%{service_ping_link_start}与 GitLab Inc. 共享哪些信æ¯ï¼Ÿ%{service_ping_link_end}"
-
msgid "%{size} %{unit}"
msgstr "%{size} %{unit}"
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] "+其余%d项"
-msgid "+%{approvers} more approvers"
-msgstr "+å¦å¤–%{approvers}个核准人"
-
msgid "+%{extra} more"
msgstr "+%{extra} 更多"
@@ -1239,6 +1222,9 @@ msgstr "."
msgid "/"
msgstr "/"
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr "0 字节"
@@ -1340,6 +1326,9 @@ msgstr[0] "剩余 %d 年"
msgid "1-9 contributions"
msgstr "1-9项贡献"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19项贡献"
@@ -1352,6 +1341,9 @@ msgstr "192.168.0.0/24 或 2001:0DB8:1234::/48"
msgid "1st contribution!"
msgstr "最高贡献"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29项贡献"
@@ -1427,9 +1419,6 @@ 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 Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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的基本页é¢å’Œæ— æœåŠ¡å™¨åŠŸèƒ½"
@@ -1475,9 +1464,6 @@ msgstr "为信æ¯ç³»ç»Ÿæä¾›åŒç­‰æˆ–类似ä¿æŠ¤çš„组织所采用的管ç†ï¼Œ
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "GitLab滥用审查团队æˆå‘˜å°†ä¼šå°½å¿«æŸ¥çœ‹æ‚¨çš„报告。"
-msgid "A merge request hasn't yet been merged"
-msgstr "åˆå¹¶è¯·æ±‚尚未åˆå¹¶"
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr "已创建新的Auto DevOps æµæ°´çº¿ï¼Œè¯·è½¬åˆ°æµæ°´çº¿é¡µé¢ä»¥æŸ¥çœ‹è¯¦ç»†ä¿¡æ¯ã€‚"
@@ -1488,7 +1474,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 "已创建新的身份模拟令牌。"
@@ -1502,6 +1488,9 @@ msgstr "已创建一个新的个人访问令牌,å称为 %{token_name}。"
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 "一个纯HTML站点,它使用NetLifyæ¥ä»£æ›¿Gitlabçš„CI/CD,但ä»ç„¶å…·æœ‰æ‰€æœ‰å…¶ä»–主è¦çš„Gitlab功能。"
@@ -1692,7 +1681,7 @@ msgid "About this feature"
msgstr "关于此功能"
msgid "About your company"
-msgstr ""
+msgstr "关于您的公å¸"
msgid "Abuse Reports"
msgstr "滥用报告"
@@ -1731,7 +1720,7 @@ msgid "Access forbidden. Check your access level."
msgstr "访问被ç¦æ­¢ã€‚检查您的访问æƒé™ã€‚"
msgid "Access granted"
-msgstr "已授予访问"
+msgstr "授æƒäºŽ"
msgid "Access requests"
msgstr "访问请求"
@@ -1853,9 +1842,6 @@ msgstr "通过验è¯æ‚¨çš„å¸æˆ·æ¥ä¿®å¤æ‚¨çš„æµæ°´çº¿"
msgid "AccountValidation|I'll bring my own runners"
msgstr "我è¦ä½¿ç”¨è‡ªå·±çš„ runner"
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 "为了在共享 runner 上使用å…è´¹ CI/CD 分钟,您需è¦ä½¿ç”¨éªŒè¯é€‰é¡¹ä¹‹ä¸€éªŒè¯æ‚¨çš„å¸æˆ·ã€‚ 如果您ä¸æ„¿æ„æ供验è¯ï¼Œä½ å¯ä»¥é€šè¿‡è‡ªå·±çš„ runner æ¥è¿è¡Œæµæ°´çº¿å¹¶ä¸ºæ‚¨çš„项目ç¦ç”¨å…±äº« runner。"
@@ -1871,12 +1857,6 @@ 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 "验è¯æ˜¯ä¸ºäº†é˜»æ­¢å’Œå‡å°‘ GitLab 基础设施上的滥用。如果您使用信用å¡æˆ–借记å¡è¿›è¡ŒéªŒè¯ï¼Œ%{strong_start}GitLab å°†ä¸ä¼šæ”¶å–费用或存储您的å¡ä¿¡æ¯ï¼Œå®ƒå°†ä»…用于验è¯ï¼Œ%{strong_end} %{learn_more_link}"
-msgid "AccountValidation|unsubscribe"
-msgstr "å–消订阅"
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr "您å¯ä»¥éšæ—¶ %{unsubscribe_link}。"
-
msgid "Acknowledge"
msgstr "确认"
@@ -1997,9 +1977,6 @@ msgstr "添加一行"
msgid "Add a link"
msgstr "添加链接"
-msgid "Add a link to Grafana"
-msgstr "添加链接到Grafana"
-
msgid "Add a new issue"
msgstr "添加一个新议题"
@@ -2048,6 +2025,9 @@ msgstr "添加批准规则"
msgid "Add approvers"
msgstr "添加核准人"
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "添加粗体文本"
@@ -2207,15 +2187,15 @@ msgstr "添加先å‰åˆå¹¶çš„æ交"
msgid "AddContextCommits|Add/remove"
msgstr "添加/删除"
-msgid "AddMember|Emails cannot be blank"
-msgstr "电å­é‚®ä»¶ä¸èƒ½ä¸ºç©º"
-
msgid "AddMember|Invite email is invalid"
msgstr "邀请邮件无效"
msgid "AddMember|Invite limit of %{daily_invites} per day exceeded"
msgstr "æ¯å¤©é™åˆ¶%{daily_invites}次邀请"
+msgid "AddMember|Invites cannot be blank"
+msgstr ""
+
msgid "AddMember|No invite source provided."
msgstr "没有æ供邀请æºã€‚"
@@ -2379,7 +2359,7 @@ msgid "AdminArea|Included Free in license"
msgstr "å…费包å«äºŽè®¸å¯è¯ä¸­"
msgid "AdminArea|Instance OAuth applications"
-msgstr ""
+msgstr "实例 OAuth 应用程åº"
msgid "AdminArea|Latest groups"
msgstr "最新群组"
@@ -2394,7 +2374,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 provider%{docs_link_end}的实例的应用。"
msgid "AdminArea|Minimal access"
msgstr "最å°è®¿é—®æƒé™"
@@ -2409,7 +2389,7 @@ msgid "AdminArea|New user"
msgstr "新建用户"
msgid "AdminArea|No applications found"
-msgstr ""
+msgstr "未找到应用"
msgid "AdminArea|Owner"
msgstr "所有者"
@@ -2468,12 +2448,6 @@ msgstr "您å³å°†åœæ­¢æ‰€æœ‰ä½œä¸šï¼Œè¿™ä¼šä¸­æ–­å¹¶ç»“æŸæ‰€æœ‰æ­£åœ¨è¿è¡Œçš„
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "加载统计数æ®æ—¶å‡ºé”™ã€‚请å†è¯•ä¸€æ¬¡"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr "次è¦ç«™ç‚¹å†…部使用的主站点的 URL。"
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr "主站点内部使用的次è¦ç«™ç‚¹çš„ URL。"
-
msgid "AdminLabels|Define your default set of project labels"
msgstr "定义项目标记的默认集"
@@ -2505,11 +2479,14 @@ msgid "AdminSettings|Auto DevOps domain"
msgstr "Auto DevOps 域"
msgid "AdminSettings|CI/CD limits"
-msgstr ""
+msgstr "CI/CD é™åˆ¶"
msgid "AdminSettings|Configure Let's Encrypt"
msgstr "é…ç½® Let's Encrypt"
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr "ç¦ç”¨ä¿¡æ¯æµä»¤ç‰Œ"
@@ -2522,12 +2499,39 @@ 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 "域å验è¯æ˜¯å…¬å…± GitLab 站点的基本安全措施。用户需è¦è¯æ˜Žä»–们在å¯ç”¨åŸŸå之å‰æ‹¥æœ‰åŸŸå的所有æƒã€‚%{link_start}了解更多。%{link_end}"
+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 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 "为新项目å¯ç”¨å…±äº«Runner"
+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 "ä¿¡æ¯æµä»¤ç‰Œ"
@@ -2537,35 +2541,47 @@ msgstr "我已ç»é˜…读并åŒæ„ %{link_start}æœåŠ¡æ¡æ¬¾%{link_end} (PDF)。"
msgid "AdminSettings|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 "AdminSettings|If there isn't any existing index, GitLab creates one."
+msgstr ""
+
+msgid "AdminSettings|Import sources"
+msgstr ""
+
msgid "AdminSettings|Keep the latest artifacts for all jobs in the latest successful pipelines"
msgstr "在最新æˆåŠŸçš„æµæ°´çº¿ä¸­ï¼Œä¿ç•™æ‰€æœ‰ä½œä¸šçš„最新产物"
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 ""
+
+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 "å¯ç”¨2FA时,Gitæ“作会è¯çš„最大有效期é™ã€‚"
msgid "AdminSettings|Maximum number of DAG dependencies that a job can have"
-msgstr ""
+msgstr "作业å¯ä»¥æ‹¥æœ‰çš„ DAG ä¾èµ–项的最大数é‡"
msgid "AdminSettings|Maximum number of active pipelines per project"
-msgstr ""
+msgstr "æ¯ä¸ªé¡¹ç›®æ³¨å†Œçš„最大 runner æ•°é‡"
msgid "AdminSettings|Maximum number of jobs in a single pipeline"
-msgstr ""
+msgstr "å•ä¸ªæµæ°´çº¿ä¸­ä½œä¸šçš„最大数é‡"
msgid "AdminSettings|Maximum number of pipeline schedules"
-msgstr ""
+msgstr "æµæ°´çº¿è®¡åˆ’的最大数é‡"
msgid "AdminSettings|Maximum number of pipeline subscriptions to and from a project"
-msgstr ""
+msgstr "一个项目的最大æµæ°´çº¿è®¢é˜…æ•°"
msgid "AdminSettings|Maximum number of runners registered per group"
-msgstr ""
+msgstr "æ¯ä¸ªç¾¤ç»„注册的最大 runner æ•°é‡"
msgid "AdminSettings|Maximum number of runners registered per project"
-msgstr ""
+msgstr "æ¯ä¸ªé¡¹ç›®æ³¨å†Œçš„最大 runner æ•°é‡"
msgid "AdminSettings|New CI/CD variables in projects and groups default to protected."
msgstr "项目和群组中的新 CI/CD å˜é‡é»˜è®¤ä¸ºå—ä¿æŠ¤ã€‚"
@@ -2573,16 +2589,37 @@ msgstr "项目和群组中的新 CI/CD å˜é‡é»˜è®¤ä¸ºå—ä¿æŠ¤ã€‚"
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 "默认ä¿æŠ¤ CI/CD å˜é‡"
+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|Restrict group access by IP address. %{link_start}Learn more%{link_end}."
+msgstr ""
+
msgid "AdminSettings|Save %{name} limits"
+msgstr "ä¿å­˜ %{name} é™åˆ¶"
+
+msgid "AdminSettings|Search with Elasticsearch enabled"
msgstr ""
msgid "AdminSettings|Select a CI/CD template"
@@ -2594,6 +2631,9 @@ 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 "选择ç¦ç”¨Pages站点的公开访问æƒé™ï¼Œè¿™éœ€è¦ç”¨æˆ·ç™»å½•æ‰èƒ½è®¿é—®æ‚¨çš„Pages站点。 %{link_start}了解更多。%{link_end}"
+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 "å¯ç”¨2FAæ—¶Gitæ“作的会è¯æŒç»­æ—¶é—´ï¼ˆåˆ†é’Ÿï¼‰"
@@ -2601,7 +2641,7 @@ msgid "AdminSettings|Set a CI/CD template as the required pipeline configuration
msgstr "å°†CI/CD模æ¿è®¾ç½®ä¸ºå®žä¾‹ä¸­æ‰€æœ‰é¡¹ç›®æ‰€éœ€çš„æµæ°´çº¿é…置。当æµæ°´çº¿è¿è¡Œæ—¶ï¼Œé¡¹ç›®CI/CDé…ç½®åˆå¹¶åˆ°æ‰€éœ€çš„æµæ°´çº¿é…置中。%{link_start}什么是必需的æµæ°´çº¿é…ç½®?%{link_end}"
msgid "AdminSettings|Set limit to 0 to disable it."
-msgstr ""
+msgstr "å°†é™åˆ¶è®¾ç½®ä¸º 0 å¯ä»¥ç¦ç”¨ã€‚"
msgid "AdminSettings|Set the initial name and protections for the default branch of new repositories created in the instance."
msgstr "设置在实例中创建的新仓库的默认分支的åˆå§‹å称和ä¿æŠ¤ã€‚"
@@ -2624,7 +2664,25 @@ 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 "所需æµæ°´çº¿é…置的模æ¿å¯ä»¥æ˜¯GitLabæ供的模æ¿ä¹‹ä¸€ï¼Œä¹Ÿå¯ä»¥æ˜¯æ·»åŠ åˆ°å®žä¾‹æ¨¡æ¿ä»“库的自定义模æ¿ã€‚%{link_start}如何创建实例模æ¿ä»“库?%{link_end}"
+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|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 "AdminStatistics|Active Users"
@@ -2763,7 +2821,7 @@ msgid "AdminUsers|Cannot unblock LDAP blocked users"
msgstr "无法解除已ç¦ç”¨çš„ LDAP 用户"
msgid "AdminUsers|Cohorts"
-msgstr "群组"
+msgstr "人群"
msgid "AdminUsers|Confirm user"
msgstr "确认用户"
@@ -3500,6 +3558,9 @@ msgstr "所有项目"
msgid "All projects selected"
msgstr "已选择所有项目"
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr "所有主题已解决"
@@ -3515,14 +3576,20 @@ 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 "å…许访问以下群组的æˆå‘˜"
msgid "Allow access to the following IP addresses"
msgstr "å…许访问以下IP地å€"
-msgid "Allow commits from members who can merge to the target branch."
-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 "å…许群组所有者管ç†LDAP相关的设置"
@@ -3563,9 +3630,6 @@ msgstr "å…许å­ç»„设置自己的åŒé‡è®¤è¯è§„则"
msgid "Allow this key to push to this repository"
msgstr "å…许此密钥推é€åˆ°è¿™ä¸ªä»“库"
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr "å…许此次è¦ç«™ç‚¹å¤åˆ¶å¯¹è±¡å­˜å‚¨ä¸­çš„内容"
-
msgid "Allow use of licensed EE features"
msgstr "å…许使用许å¯çš„EE功能"
@@ -3581,9 +3645,6 @@ msgstr "å…许用户请求访问(如果å¯è§æ€§æ˜¯å…¬å¼€æˆ–内部的)"
msgid "Allowed"
msgstr "å·²å…许"
-msgid "Allowed Geo IP"
-msgstr "å…许的Geo IP"
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr "å…许的字符:+ã€0-9ã€- 和空格。"
@@ -3609,7 +3670,7 @@ msgid "Almost there..."
msgstr "å³å°†å®Œæˆ..."
msgid "Already blocked"
-msgstr "已被阻止"
+msgstr "已被ç¦ç”¨"
msgid "Already have login and password?"
msgstr "å·²ç»æœ‰ç™»å½•å和密ç ï¼Ÿ"
@@ -3705,7 +3766,7 @@ msgid "An error occurred previewing the blob"
msgstr "预览 blob 时出错"
msgid "An error occurred when loading the user verification challenge. Refresh to try again."
-msgstr ""
+msgstr "加载用户验è¯æŒ‘战时å‘生错误。刷新请å†æ¬¡é‡è¯•ã€‚"
msgid "An error occurred when updating the title"
msgstr "更新标题时出现错误"
@@ -3953,6 +4014,9 @@ 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 "删除å²è¯—æ—¶å‘生错误。"
@@ -4026,9 +4090,6 @@ msgstr "更新通知设置时å‘生错误。请é‡è¯•ã€‚"
msgid "An error occurred while uploading the file. Please try again."
msgstr "上传文件时出错。请é‡è¯•ã€‚"
-msgid "An error occurred while uploading the image. Please try again."
-msgstr "上传图片时出错。请é‡è¯•ã€‚"
-
msgid "An error occurred while validating group path"
msgstr "验è¯ç¾¤ç»„路径时å‘生错误"
@@ -4095,9 +4156,6 @@ msgstr "å‘生未知错误。"
msgid "Analytics"
msgstr "分æž"
-msgid "Analyze a review version of your web application."
-msgstr "分æžWeb应用程åºçš„审阅版本。"
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr "分æžä¾èµ–项查找已知æ¼æ´ž."
@@ -4128,6 +4186,9 @@ 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 "å垃圾邮件验è¯"
@@ -4206,12 +4267,27 @@ msgstr "应用程åºå·²æˆåŠŸæ›´æ–°ã€‚"
msgid "Application: %{name}"
msgstr "应用:%{name}"
-msgid "ApplicationSettings|After sign up text"
-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] "批准 %d ä½ç”¨æˆ·"
@@ -4247,38 +4323,35 @@ msgstr "邮箱黑åå•"
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr "ç¦æ­¢ä»¥ä¸‹é‚®ç®±æ³¨å†Œ"
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
-msgstr "注册时å¯ç”¨åŸŸå黑åå•"
+msgid "ApplicationSettings|Enable Slack application"
+msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
-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|Markdown enabled"
-msgstr "Markdownå·²å¯ç”¨"
-
msgid "ApplicationSettings|Minimum password length (number of characters)"
msgstr "最å°å¯†ç é•¿åº¦ï¼ˆå­—符数)"
-msgid "ApplicationSettings|ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "åªæœ‰ç”µå­é‚®ä»¶åœ°å€ä¸Žè¿™äº›åŸŸå匹é…的用户æ‰èƒ½æ³¨å†Œã€‚å…许使用通é…符。对多个æ¡ç›®ä½¿ç”¨å•ç‹¬çš„行。例如:domain.comã€*.domain.com"
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
-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. See the %{linkStart}supported syntax%{linkEnd} for more information."
-msgstr "é™åˆ¶æ³¨å†Œçš„电å­é‚®ä»¶åœ°å€éœ€ä¸Žç»™å®šæ­£åˆ™è¡¨è¾¾å¼åŒ¹é…。请å‚阅%{linkStart}支æŒçš„语法%{linkEnd}获å–更多信æ¯ã€‚"
+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 "查看GitLabçš„ %{linkStart}密ç ç­–略指å—%{linkEnd}"
+msgid "ApplicationSettings|See GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
+msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
msgstr "注册时å‘é€ç¡®è®¤é‚®ä»¶"
@@ -4286,23 +4359,23 @@ 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) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr "电å­é‚®ä»¶åœ°å€ä¸Žè¿™äº›åŸŸå匹é…的用户将无法注册。å…许使用通é…符。对多个æ¡ç›®ä½¿ç”¨å•ç‹¬çš„行。例如:domain.com,*.domain.com"
-
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
-msgstr "电å­é‚®ä»¶åœ°å€ä¸Žè¿™äº›åŸŸå匹é…的用户将无法注册。å…许使用通é…符。多个æ¡ç›®ä½¿ç”¨å•ç‹¬çš„行或逗å·ã€‚"
-
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
-msgstr "å¯ç”¨åŽï¼Œä»»ä½•è®¿é—® %{host} 并创建账å·çš„用户都必须ç»è¿‡ç®¡ç†å‘˜æ˜Žç¡®æ‰¹å‡†æ‰èƒ½ç™»å½•ã€‚此设置仅在å¯ç”¨æ³¨å†Œæ—¶æœ‰æ•ˆã€‚"
+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|When enabled, any user visiting %{host} will be able to create an account."
-msgstr "å¯ç”¨åŽï¼Œä»»ä½•è®¿é—® %{host} 用户都å¯ä»¥åˆ›å»ºè´¦å·ã€‚"
+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 "domain.com"
@@ -4356,9 +4429,6 @@ msgstr "正在应用建议..."
msgid "Applying suggestions..."
msgstr "正在应用建议..."
-msgid "Approval Status"
-msgstr "审核状æ€"
-
msgid "Approval rules"
msgstr "批准规则"
@@ -4546,15 +4616,6 @@ 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 "此设置在 %{groupName} 中é…置,åªèƒ½ç”±ç®¡ç†å‘˜æˆ–群组所有者更改。"
-msgid "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr "éµå®ˆèŒè´£åˆ†ç¦»"
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr "至少有一æ¡è§„则ä¸éµå®ˆèŒè´£åˆ†ç¦»ã€‚"
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr "未éµå®ˆèŒè´£åˆ†ç¦»"
-
msgid "Approvals are optional."
msgstr "核准为å¯é€‰ã€‚"
@@ -5083,8 +5144,8 @@ msgstr "8 月"
msgid "Authenticate"
msgstr "验è¯"
-msgid "Authenticate user SSH keys without requiring additional configuration. Performance of GitLab can be improved by using the GitLab database instead."
-msgstr "无需é¢å¤–é…置而验è¯ç”¨æˆ·çš„ SSH 密钥。å¯ä»¥é€šè¿‡ä½¿ç”¨ GitLab æ•°æ®åº“æ¥æ高 GitLab 的性能。"
+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 "使用GitHub身份验è¯"
@@ -5122,6 +5183,9 @@ 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 "身份验è¯å¤±è´¥ï¼š %{error_message}"
@@ -5308,8 +5372,8 @@ msgstr "å¯ç”¨çš„ID"
msgid "Available group runners: %{runners}"
msgstr "å¯ç”¨çš„群组 Runner:%{runners}"
-msgid "Available runners: %{runners}"
-msgstr "å¯ç”¨çš„ Runner:%{runners}"
+msgid "Available on-demand"
+msgstr ""
msgid "Available shared runners:"
msgstr "å¯ç”¨çš„共享 Runner:"
@@ -5461,8 +5525,8 @@ msgstr "横幅消æ¯"
msgid "Based on"
msgstr "基于"
-msgid "Basic information"
-msgstr "基本信æ¯"
+msgid "Batch size"
+msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
msgstr "请注æ„,更改项目的命å空间å¯èƒ½ä¼šäº§ç”Ÿéžé¢„期的副作用。"
@@ -5491,9 +5555,6 @@ msgstr "以下是%{link_to_gitlab_pages}的设置。"
msgid "Below you will find all the groups that are public."
msgstr "您将在下é¢æ‰¾åˆ°æ‰€æœ‰å…¬å¼€çš„群组。"
-msgid "Beta"
-msgstr "Beta"
-
msgid "Bi-weekly code coverage"
msgstr "åŒå‘¨ä»£ç è¦†ç›–率"
@@ -5549,10 +5610,10 @@ msgid "BillingPlans|While GitLab is ending availability of the Bronze plan, you
msgstr "虽然 GitLab å°†åœæ­¢ä½¿ç”¨ Bronze 方案,但您ä»ç„¶å¯ä»¥åœ¨ %{eoa_bronze_plan_end_date} 之å‰å†ç»­è®¢ä¸€æ¬¡ Bronze 订阅。 我们还æä¾›é™æ—¶å…è´¹å‡çº§åˆ°æˆ‘们的高级方案(最多 25 ä¸ªç”¨æˆ·ï¼‰ï¼ åœ¨æˆ‘ä»¬çš„ %{announcement_link} 中了解有关改å˜å’Œä¼˜æƒ çš„更多信æ¯ã€‚"
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 ""
+msgstr "æ‚¨å°šæœªåˆ›å»ºä»»ä½•ç¾¤ç»„ã€‚æ‚¨éœ€è¦ %{create_group_link_start}创建一个群组%{create_group_link_end} ,并%{move_link_start}将此项目移至所创建的群组中%{move_link_end}。"
msgid "BillingPlans|You'll have to %{move_link_start}move this project%{move_link_end} to one of your groups."
-msgstr ""
+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 "您的GitLab.com%{plan}试用将在%{strong_open}%{expiration_date}过期%{strong_close}。您å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼å‡çº§ä»¥ä¿ç•™å¯¹%{plan}功能的访问æƒé™ã€‚"
@@ -5599,12 +5660,21 @@ 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 "通过é‡æ–°æ¿€æ´»æ‚¨çš„试用,您将收到é¢å¤–30 天的 %{planName}。您的试用åªèƒ½é‡æ–°æ¿€æ´»ä¸€æ¬¡ã€‚"
+msgid "Billings|Error validating card details"
+msgstr ""
+
msgid "Billings|Extend trial"
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 "Shared runners 无法å¯ç”¨ï¼Œç›´åˆ°æœ‰æ•ˆçš„信用å¡åœ¨æ¡£ã€‚"
@@ -5632,23 +5702,29 @@ msgstr "您的å¸æˆ·å·²é€šè¿‡éªŒè¯"
msgid "Billing|%{user} was successfully approved"
msgstr "%{user} æˆåŠŸèŽ·å¾—批准"
+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 "批准 %{user} 时出错"
-msgid "Billing|An error occurred while getting a billable member details"
-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 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|An error occurred while removing a billable member."
+msgstr ""
msgid "Billing|Awaiting member signup"
msgstr "等待æˆå‘˜æ³¨å†Œ"
@@ -5662,15 +5738,21 @@ msgstr "直接æˆå‘˜"
msgid "Billing|Enter at least three characters to search."
msgstr "请至少输入三个字符æ‰å¯æœç´¢ã€‚"
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr "导出列表"
-msgid "Billing|Group"
-msgstr "群组"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
+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 "无法删除通过群组邀请而邀请的æˆå‘˜ã€‚您å¯ä»¥ç§»é™¤æ•´ä¸ªç¾¤ç»„,也å¯ä»¥è¦æ±‚å—邀群组的所有者移除æˆå‘˜ã€‚"
@@ -5695,9 +5777,6 @@ msgstr "输入 %{username} 进行确认"
msgid "Billing|User was successfully removed"
msgstr "用户已æˆåŠŸåˆ é™¤"
-msgid "Billing|Users occupying seats in"
-msgstr "å ç”¨å¸­ä½çš„用户于"
-
msgid "Billing|View pending approvals"
msgstr "查看待审批"
@@ -5778,7 +5857,7 @@ msgid "BoardNewIssue|Select a project"
msgstr "选择一个项目"
msgid "BoardScope|An error occurred while getting iterations. Please try again."
-msgstr ""
+msgstr "获å–迭代时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "BoardScope|An error occurred while getting milestones, please try again."
msgstr "获å–里程碑时å‘生错误,请é‡è¯•ã€‚"
@@ -5796,7 +5875,7 @@ msgid "BoardScope|Any assignee"
msgstr "任何指派人"
msgid "BoardScope|Any iteration"
-msgstr ""
+msgstr "任何迭代"
msgid "BoardScope|Any label"
msgstr "任何标记"
@@ -5808,13 +5887,13 @@ msgid "BoardScope|Choose labels"
msgstr "选择标记"
msgid "BoardScope|Current iteration"
-msgstr ""
+msgstr "当å‰è¿­ä»£"
msgid "BoardScope|Edit"
msgstr "编辑"
msgid "BoardScope|Iteration"
-msgstr ""
+msgstr "迭代"
msgid "BoardScope|Labels"
msgstr "标记"
@@ -5823,13 +5902,13 @@ msgid "BoardScope|Milestone"
msgstr "里程碑"
msgid "BoardScope|No iteration"
-msgstr ""
+msgstr "无迭代"
msgid "BoardScope|No milestone"
msgstr "无里程碑"
msgid "BoardScope|Search iterations"
-msgstr ""
+msgstr "æœç´¢è¿­ä»£"
msgid "BoardScope|Search milestones"
msgstr "æœç´¢é‡Œç¨‹ç¢‘"
@@ -5838,7 +5917,7 @@ msgid "BoardScope|Select assignee"
msgstr "选择指派人"
msgid "BoardScope|Select iteration"
-msgstr ""
+msgstr "选择迭代"
msgid "BoardScope|Select labels"
msgstr "选择标记"
@@ -6088,9 +6167,6 @@ msgstr "概览"
msgid "Branches|Please type the following to confirm:"
msgstr "请输入以下内容以确认:"
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr "在 %{project_settings_link} 中管ç†å—ä¿æŠ¤çš„分支。"
-
msgid "Branches|Show active branches"
msgstr "查看活跃分支"
@@ -6148,9 +6224,6 @@ msgstr "与上游存在差异"
msgid "Branches|merged"
msgstr "å·²åˆå¹¶"
-msgid "Branches|project settings"
-msgstr "项目设置"
-
msgid "Branches|protected"
msgstr "å—ä¿æŠ¤"
@@ -6209,6 +6282,9 @@ msgid "BulkImport|%{feature} (require v%{version})"
msgstr "%{feature}ï¼ˆéœ€è¦ v%{version})"
msgid "BulkImport|Destination"
+msgstr "目标"
+
+msgid "BulkImport|Destination group"
msgstr ""
msgid "BulkImport|Existing groups"
@@ -6226,6 +6302,9 @@ 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 "导入失败:目标ä¸èƒ½æ˜¯æºç»„çš„å­ç»„。更改目标,然åŽé‡è¯•ã€‚"
@@ -6250,11 +6329,8 @@ msgstr "å称已存在。"
msgid "BulkImport|Name already used as a target for another group."
msgstr "å称已用作å¦ä¸€ç»„的目标。"
-msgid "BulkImport|New group"
-msgstr "新建群组"
-
msgid "BulkImport|No additional information provided."
-msgstr ""
+msgstr "未æ供其它信æ¯ã€‚"
msgid "BulkImport|No history is available"
msgstr "没有历å²è®°å½•"
@@ -6263,7 +6339,7 @@ msgid "BulkImport|No parent"
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 "é‡æ–°å¯¼å…¥ä¼šåˆ›å»ºä¸€ä¸ªæ–°ç¾¤ç»„。它ä¸ä¸ŽçŽ°æœ‰ç¾¤ç»„åŒæ­¥ã€‚"
@@ -6278,13 +6354,13 @@ msgid "BulkImport|Showing %{start}-%{end} of %{total} matching filter \"%{filter
msgstr "显示从%{link}中匹é…筛选器“%{filter}†的 %{start}-%{end} / %{total}"
msgid "BulkImport|Source"
-msgstr ""
+msgstr "æº"
msgid "BulkImport|Source group"
msgstr "æºç¾¤ç»„"
msgid "BulkImport|Template / File-based import / GitLab Migration"
-msgstr ""
+msgstr "模版/基于文件导入/GitLab è¿ç§»"
msgid "BulkImport|To new group"
msgstr "到新群组"
@@ -6299,7 +6375,7 @@ msgid "BulkImport|Your imported groups will appear here."
msgstr "您导入的群组将出现在这里。"
msgid "BulkImport|Your imported projects will appear here."
-msgstr ""
+msgstr "您导入的项目将出现在这里。"
msgid "BulkImport|expected an associated Group but has an associated Project"
msgstr "需与群组关è”但是当å‰ä¸Žé¡¹ç›®å…³è”"
@@ -6379,9 +6455,6 @@ msgstr "CI设置"
msgid "CI variables"
msgstr "CI å˜é‡"
-msgid "CI will run using the credentials assigned above."
-msgstr "CI将使用以上指定的用户身份è¿è¡Œã€‚"
-
msgid "CI/CD"
msgstr "CI/CD"
@@ -6397,6 +6470,9 @@ msgstr "CI/CD é…ç½®"
msgid "CI/CD configuration file"
msgstr "CI/CD é…置文件"
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr "没有项目被添加到此范围"
@@ -6412,6 +6488,9 @@ msgstr "部署频率"
msgid "CICDAnalytics|Lead time"
msgstr "交付时间"
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr "å‘布版本的项目"
@@ -6482,8 +6561,8 @@ msgstr "é™åˆ¶ CI_JOB_TOKEN 访问"
msgid "CICD|Select projects that can be accessed by API requests authenticated with this project's CI_JOB_TOKEN CI/CD variable."
msgstr "选择å¯ä»¥é€šè¿‡ API 访问的项目请求验è¯æ­¤é¡¹ç›®çš„ CI_JOB_TOKEN CI/CD å˜é‡ã€‚"
-msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file."
-msgstr "Auto DevOps æµæ°´çº¿é»˜è®¤åœ¨æ²¡æœ‰CI/CDé…置文件的所有项目中è¿è¡Œã€‚"
+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 "在未找到备用CIé…置文件时将使用Auto DevOpsæµæ°´çº¿ã€‚"
@@ -6650,6 +6729,12 @@ msgstr "å–消"
msgid "Cancel and close"
msgstr "å–消并关闭"
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr "å–消删除索引æ“作"
@@ -6884,9 +6969,15 @@ 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 "已将标题更改为“%{title_param}â€ã€‚"
@@ -6905,6 +6996,9 @@ msgstr "仅显示部分。点此显示全部。"
msgid "Changes the title to \"%{title_param}\"."
msgstr "将标题更改为“%{title_param}â€ã€‚"
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr "标题更改尚未ä¿å­˜"
@@ -6974,6 +7068,9 @@ msgstr "å†æ¬¡æ£€æŸ¥"
msgid "Check feature availability on namespace plan"
msgstr "检查命å空间方案的功能å¯ç”¨æ€§"
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr "在本地检出ã€å®¡æ ¸å’Œåˆå¹¶"
@@ -7192,6 +7289,9 @@ msgstr "订阅详情"
msgid "Checkout|Subtotal"
msgstr "å°è®¡"
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr "税é¢"
@@ -7258,6 +7358,9 @@ msgstr "å­å²è¯—ä¸å­˜åœ¨ã€‚"
msgid "Child epic doesn't exist."
msgstr "å­å²è¯—ä¸å­˜åœ¨ã€‚"
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr "中文支æŒä½¿ç”¨"
@@ -7285,9 +7388,6 @@ msgstr "选择任何颜色。"
msgid "Choose file…"
msgstr "选择文件…"
-msgid "Choose specific groups or storage shards"
-msgstr "选择指定群组或存储片"
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr "选择首选的 Runner 并填入 AWS CFT。"
@@ -7474,6 +7574,10 @@ msgstr "清ç†ç­–略最大并å‘è¿è¡Œçš„workeræ•°é‡"
msgid "Clear"
msgstr "清除"
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr "清除所有仓库检查"
@@ -7673,11 +7777,14 @@ msgid "Cluster type must be specified for Stages::ClusterEndpointInserter"
msgstr "必须为 Stages::ClusterEndpointInserter 指定集群类型"
msgid "ClusterAgents|%{linkStart}View the documentation%{linkEnd} for advanced installation. Ensure you have your access token available."
-msgstr ""
+msgstr "%{linkStart}查看高级安装文档%{linkEnd} 。请确ä¿æ‚¨æœ‰å¯ç”¨çš„访问令牌。"
msgid "ClusterAgents|%{name} successfully deleted"
msgstr "%{name} å·²æˆåŠŸåˆ é™¤"
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr "å…± %{total} 个代ç†ä¸­çš„ %{number} 个"
@@ -7715,7 +7822,7 @@ msgid "ClusterAgents|Agent %{strongStart}disconnected%{strongEnd}"
msgstr "代ç†%{strongStart}未连接%{strongEnd}"
msgid "ClusterAgents|Agent access token:"
-msgstr ""
+msgstr "代ç†è®¿é—®ä»¤ç‰Œï¼š"
msgid "ClusterAgents|Agent might not be connected to GitLab"
msgstr "代ç†å¯èƒ½æ— æ³•è¿žæŽ¥åˆ° GitLab"
@@ -7735,14 +7842,14 @@ msgstr "需è¦æ›´æ–°ä»£ç†ç‰ˆæœ¬"
msgid "ClusterAgents|All"
msgstr "全部"
-msgid "ClusterAgents|An error occurred while loading your Agents"
-msgstr "加载您的代ç†æ—¶å‡ºé”™ã€‚"
-
msgid "ClusterAgents|An error occurred while loading your agent"
msgstr "加载代ç†æ—¶å‡ºé”™"
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
-msgstr "检索 GitLab 代ç†åŠ¨æ€æ—¶å‡ºé”™ã€‚é‡æ–°åŠ è½½é¡µé¢ä»¥é‡è¯•ã€‚"
+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 "å‘生未知错误。请é‡è¯•ã€‚"
@@ -7750,6 +7857,9 @@ 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 "è¯ä¹¦"
@@ -7757,25 +7867,19 @@ msgid "ClusterAgents|Configuration"
msgstr "é…ç½®"
msgid "ClusterAgents|Connect a Kubernetes cluster"
-msgstr ""
+msgstr "连接 Kubernetes 集群"
msgid "ClusterAgents|Connect a cluster"
-msgstr ""
+msgstr "连接集群"
msgid "ClusterAgents|Connect a cluster (agent)"
-msgstr ""
+msgstr "连接集群(代ç†ï¼‰"
msgid "ClusterAgents|Connect a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "连接集群(è¯ä¹¦ - 已弃用)"
msgid "ClusterAgents|Connect a cluster (deprecated)"
-msgstr ""
-
-msgid "ClusterAgents|Connect existing cluster"
-msgstr "连接现有集群"
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr "与 GitLab 代ç†è¿žæŽ¥"
+msgstr "连接集群(已废弃)"
msgid "ClusterAgents|Connected"
msgstr "已连接"
@@ -7790,13 +7894,13 @@ msgid "ClusterAgents|Copy token"
msgstr "å¤åˆ¶ä»¤ç‰Œ"
msgid "ClusterAgents|Create a cluster"
-msgstr ""
+msgstr "创建集群"
msgid "ClusterAgents|Create a cluster (certificate - deprecated)"
-msgstr ""
+msgstr "创建集群(è¯ä¹¦ - 已弃用)"
msgid "ClusterAgents|Create a cluster (deprecated)"
-msgstr ""
+msgstr "创建集群(已废弃)"
msgid "ClusterAgents|Create agent access token"
msgstr "创建代ç†è®¿é—®ä»¤ç‰Œ"
@@ -7840,14 +7944,14 @@ 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."
+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 "GitLab 代ç†"
+msgid "ClusterAgents|GitLab agent"
+msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
-msgstr "适用于 Kubernetes çš„ GitLab 代ç†"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
+msgstr ""
msgid "ClusterAgents|Give feedback"
msgstr "æä¾›å馈"
@@ -7858,8 +7962,8 @@ msgstr "如何注册代ç†ï¼Ÿ"
msgid "ClusterAgents|How to update an agent?"
msgstr "如何更新代ç†ï¼Ÿ"
-msgid "ClusterAgents|Install a new agent"
-msgstr "安装一个新代ç†"
+msgid "ClusterAgents|Install using Helm (recommended)"
+msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
msgstr "上次连接在 %{timeAgo}。"
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr "无代ç†"
@@ -7894,9 +8002,6 @@ msgstr "未连接"
msgid "ClusterAgents|Recommended"
msgstr "推è"
-msgid "ClusterAgents|Recommended installation method"
-msgstr "推è安装方法"
-
msgid "ClusterAgents|Register"
msgstr "注册"
@@ -7906,20 +8011,23 @@ msgstr "注册代ç†"
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr "需è¦æœ‰è‡³å°‘维护者级别的æƒé™ï¼Œæ‰å¯åˆ é™¤ä»£ç†ã€‚"
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
-msgstr "需è¦æœ‰è‡³å°‘维护者级别的æƒé™ï¼Œæ‰å¯å®‰è£…新的代ç†ã€‚"
-
msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr "需è¦æœ‰è‡³å°‘维护者级别的æƒé™ï¼Œæ‰å¯æ‰§è¡Œè¿™äº›æ“作。"
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
-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 such as tokens created or revoked and clusters connected or not connected."
-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 "选择一个代ç†æˆ–输入å称æ¥åˆ›å»ºä¸€ä¸ªæ–°ä»£ç†"
@@ -7927,28 +8035,27 @@ 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 "当将 Kubernetes 集群连接到 GitLab 时,GitLab 代ç†æ供更高级别的安全性。 %{linkStart}了解有关 GitLab 代ç†çš„更多信æ¯ã€‚%{linkEnd}"
+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 "代ç†é•¿æ—¶é—´æœªè¿žæŽ¥ï¼Œå¯èƒ½æœ‰è¿žæŽ¥é—®é¢˜ï¼Œæœ€åŽè¿žæŽ¥æ—¶é—´æ˜¯ %{timeAgo}。"
msgid "ClusterAgents|The agent uses the token to connect with GitLab."
-msgstr ""
+msgstr "代ç†ä½¿ç”¨ä»¤ç‰Œè¿žæŽ¥åˆ° GitLab。"
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 "集群的 pod 中的代ç†ç‰ˆæœ¬ä¸åŒ¹é…。当刚刚部署了新的代ç†ç‰ˆæœ¬å¹¶ä¸” Kubernetes 正在关闭旧的 Pod 时,å¯èƒ½ä¼šå‘生这ç§æƒ…况。"
-msgid "ClusterAgents|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] "过去 %d 天里没有动æ€"
-
msgid "ClusterAgents|This agent has no tokens"
msgstr "此代ç†æ²¡æœ‰ä»¤ç‰Œ"
msgid "ClusterAgents|To delete the agent, type %{name} to confirm:"
msgstr "è¦åˆ é™¤ä»£ç†ï¼Œè¯·è¾“å…¥ %{name} 进行确认:"
+msgid "ClusterAgents|To revoke the token, type %{name} to confirm:"
+msgstr ""
+
msgid "ClusterAgents|Token created by %{userName}"
msgstr "由 %{userName} 创建的令牌"
@@ -7967,8 +8074,8 @@ msgstr "查看所有 %{number} 个集群"
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr "我们想è¦äº†è§£ä½ å¯¹ GitLab Agent 的想法。"
-msgid "ClusterAgents|What is GitLab Agent activity?"
-msgstr "什么是 GitLab 代ç†åŠ¨æ€ï¼Ÿ"
+msgid "ClusterAgents|What is agent activity?"
+msgstr ""
msgid "ClusterAgents|What is default configuration?"
msgstr "什么是默认é…置?"
@@ -8126,9 +8233,6 @@ msgstr "层级中最低且匹é…环境范围的集群将会被使用。例如,
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr "连接 Kubernetes 集群"
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr "用è¯ä¹¦è¿žæŽ¥"
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr "通过 %{linkStart}集群è¯ä¹¦%{linkEnd} 将您的集群连接到 GitLab 。"
@@ -8172,7 +8276,7 @@ msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "创建Kubernetes集群"
msgid "ClusterIntegration|Create a Kubernetes cluster"
-msgstr ""
+msgstr "创建 Kubernetes 集群"
msgid "ClusterIntegration|Creating Kubernetes cluster"
msgstr "正在创建 Kubernetes 集群"
@@ -8642,6 +8746,9 @@ msgstr "这是清除之å‰ç”±GitLab管ç†çš„集群中环境与命å空间的关
msgid "ClusterIntegration|This option will allow you to install applications on RBAC clusters."
msgstr "此选项å…许您在å¯ç”¨RBAC的群集上安装应用程åºã€‚"
+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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr "此项目未å¯ç”¨è®¡è´¹ã€‚如需创建群集,请%{linkToBillingStart}å¯ç”¨è®¡è´¹%{linkToBillingEnd}åŽé‡è¯•ã€‚"
@@ -8675,8 +8782,8 @@ msgstr "未知错误"
msgid "ClusterIntegration|Use GitLab to deploy to your cluster, run jobs, use review apps, and more."
msgstr "使用 GitLab 部署到您的集群,è¿è¡Œä½œä¸šï¼Œä½¿ç”¨ review app 等等。"
-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 "使用 %{linkStart}GitLab 代ç†%{linkEnd} 将您的 Kubernetes 集群安全地连接到 GitLab。您å¯ä»¥éƒ¨ç½²æ‚¨çš„应用程åºã€è¿è¡Œæ‚¨çš„æµæ°´çº¿ã€ä½¿ç”¨ Review Apps 等等。"
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
msgstr "为此集群使用Cloud Run,Istioå’ŒHTTP负载平衡æ’件。"
@@ -8772,7 +8879,7 @@ msgid "Code owners"
msgstr "代ç æ‰€æœ‰è€…"
msgid "Code review"
-msgstr "代ç å®¡æ ¸"
+msgstr "代ç è¯„审"
msgid "Code snippet"
msgstr "代ç ç‰‡æ®µ"
@@ -8808,7 +8915,7 @@ 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 "用户世代表显示过去%{months_included}个月内的状况。åªæœ‰æ´»åŠ¨çš„用户被计入“新用户â€æ ï¼›éžæ´»åŠ¨ç”¨æˆ·ä¼šè¢«å•ç‹¬ç»Ÿè®¡ã€‚"
+msgstr "用户人群显示过去%{months_included}个月内的状况。åªæœ‰æ´»åŠ¨çš„用户被计入“新用户â€æ ï¼›éžæ´»åŠ¨ç”¨æˆ·ä¼šè¢«å•ç‹¬ç»Ÿè®¡ã€‚"
msgid "Collapse"
msgstr "收起"
@@ -8849,9 +8956,6 @@ msgstr "ComboSearch未定义"
msgid "Comma-separated list of email addresses."
msgstr "逗å·åˆ†éš”的电å­é‚®ä»¶åœ°å€åˆ—表。"
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr "以逗å·åˆ†éš”,例如 '1.1.1, 2.2.2.0/24'"
-
msgid "Command"
msgstr "命令"
@@ -8973,9 +9077,6 @@ msgstr "无相关åˆå¹¶è¯·æ±‚"
msgid "Committed by"
msgstr "æ交者:"
-msgid "Commit…"
-msgstr "æ交..."
-
msgid "Community forum"
msgstr "社区论å›"
@@ -9064,7 +9165,7 @@ msgid "Complete"
msgstr "完æˆ"
msgid "Complete verification to sign in."
-msgstr ""
+msgstr "完æˆéªŒè¯æ–¹å¯ç™»å½•ã€‚"
msgid "Completed"
msgstr "已完æˆ"
@@ -9078,9 +9179,6 @@ msgstr "åˆè§„框架"
msgid "Compliance report"
msgstr "åˆè§„报告"
-msgid "ComplianceDashboard|created by:"
-msgstr "创建人:"
-
msgid "ComplianceFrameworks|Add framework"
msgstr "添加框架"
@@ -9274,7 +9372,7 @@ 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"
@@ -9441,9 +9539,6 @@ msgstr "连接失败"
msgid "Connection timed out"
msgstr "连接超时"
-msgid "Connection timeout"
-msgstr "连接超时"
-
msgid "Consistency guarantee method"
msgstr "一致性ä¿éšœæ–¹æ³•"
@@ -9474,9 +9569,6 @@ msgstr "æ­¤GitLab实例上尚未å¯ç”¨å®¹å™¨é•œåƒåº“。请通知管ç†å‘˜å¯ç”¨
msgid "Container repositories"
msgstr "容器仓库"
-msgid "Container repositories synchronization concurrency limit"
-msgstr "容器镜åƒåº“åŒæ­¥å¹¶å‘é™åˆ¶"
-
msgid "Container repository"
msgstr "容器仓库"
@@ -9588,7 +9680,7 @@ msgid "ContainerRegistry|Enable expiration policy"
msgstr "å¯ç”¨è¿‡æœŸç­–ç•¥"
msgid "ContainerRegistry|Expiration policy is disabled."
-msgstr ""
+msgstr "过期策略已ç¦ç”¨ã€‚"
msgid "ContainerRegistry|Expiration policy will run in %{time}"
msgstr "到期策略将在%{time}åŽè¿è¡Œ"
@@ -9602,6 +9694,9 @@ 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 "é•œåƒä»“库将被删除"
@@ -9682,7 +9777,7 @@ msgid "ContainerRegistry|Run cleanup:"
msgstr "è¿è¡Œæ¸…ç†ï¼š"
msgid "ContainerRegistry|Set up cleanup"
-msgstr ""
+msgstr "设置清ç†"
msgid "ContainerRegistry|Some tags were not deleted"
msgstr "部分标签未被删除"
@@ -9792,9 +9887,6 @@ 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 "使用容器镜åƒåº“,æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å…¶Dockeré•œåƒã€‚å‘此群组中的项目推é€è‡³å°‘一个Docker映åƒåŽï¼Œé•œåƒå°†ä¼šåœ¨æ­¤å¤„显示。 %{docLinkStart}更多信æ¯%{docLinkEnd}"
-msgid "ContainerRegistry|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "使用GitLab容器镜åƒåº“,æ¯ä¸ªé¡¹ç›®éƒ½æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®¹å™¨é•œåƒã€‚ %{docLinkStart}更多信æ¯%{docLinkEnd}"
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr "å³å°†åˆ é™¤%{item}个标签。确定继续å—?"
@@ -9831,6 +9923,9 @@ msgstr "删除相关æ交失败。请å†è¯•ä¸€æ¬¡ã€‚"
msgid "Continue"
msgstr "继续"
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr "转到下一步"
@@ -9939,9 +10034,6 @@ msgstr "将外部IDå¤åˆ¶åˆ°å‰ªè´´æ¿"
msgid "Copy ID"
msgstr "å¤åˆ¶ID"
-msgid "Copy IP Address"
-msgstr "å¤åˆ¶ IP 地å€"
-
msgid "Copy KRB5 clone URL"
msgstr "å¤åˆ¶KRB5克隆URL"
@@ -9957,6 +10049,9 @@ msgstr "å¤åˆ¶é“¾æŽ¥"
msgid "Copy branch name"
msgstr "å¤åˆ¶åˆ†æ”¯å称"
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr "å¤åˆ¶ä»£ç "
@@ -9999,6 +10094,9 @@ msgstr "从当å‰é¡¹ç›®ä¸­å…¶ä»–议题或åˆå¹¶è¯·æ±‚å¤åˆ¶æ ‡è®°å’Œé‡Œç¨‹ç¢‘"
msgid "Copy link"
msgstr "å¤åˆ¶é“¾æŽ¥"
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr "å¤åˆ¶å›¾è¡¨çš„链接"
@@ -10036,7 +10134,7 @@ 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 ""
+msgstr "模糊测试使用语料库æ¥æ高覆盖率。语料库文件å¯ä»¥æ‰‹åŠ¨åˆ›å»ºæˆ–自动生æˆã€‚%{linkStart}了解更多%{linkEnd}"
msgid "CorpusManagement|Actions"
msgstr "动作"
@@ -10075,10 +10173,10 @@ msgid "CorpusManagement|Latest Job:"
msgstr "最新作业:"
msgid "CorpusManagement|Manage your fuzz testing corpus files"
-msgstr ""
+msgstr "管ç†æ‚¨çš„模糊测试语料库文件"
msgid "CorpusManagement|New corpus"
-msgstr ""
+msgstr "新建语料库"
msgid "CorpusManagement|New upload"
msgstr "新上传"
@@ -10213,7 +10311,7 @@ msgid "Could not upload your designs as one or more files uploaded are not suppo
msgstr "无法上传您的设计,因为ä¸æ”¯æŒå·²ä¸Šä¼ ä¸€ä¸ªæˆ–多个的文件。"
msgid "Couldn't assign policy to project or group"
-msgstr ""
+msgstr "无法将策略分é…给项目或群组"
msgid "Country"
msgstr "国家/地区"
@@ -10305,6 +10403,9 @@ msgstr "创建分支"
msgid "Create commit"
msgstr "创建æ交"
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr "更快地创建共åŒæ–‡ä»¶å¹¶ä½¿å…¶æ ¼å¼æ ‡å‡†åŒ–。"
@@ -10396,7 +10497,7 @@ msgid "Create new project"
msgstr "新建项目"
msgid "Create one"
-msgstr ""
+msgstr "创建一个"
msgid "Create or import your first project"
msgstr "创建或导入您的第一个项目"
@@ -10681,25 +10782,25 @@ msgid "Critical vulnerabilities present"
msgstr "存在严é‡æ¼æ´ž"
msgid "Crm|Contact has been added."
-msgstr ""
+msgstr "è”系人已添加。"
msgid "Crm|Contact has been updated."
-msgstr ""
+msgstr "è”系人已更新。"
msgid "Crm|Customer relations contacts"
-msgstr ""
+msgstr "客户关系è”系人"
msgid "Crm|Customer relations organizations"
-msgstr ""
+msgstr "客户关系组织"
msgid "Crm|Default rate"
-msgstr ""
+msgstr "默认速率"
msgid "Crm|Edit contact"
msgstr "编辑è”系人"
msgid "Crm|Edit organization"
-msgstr ""
+msgstr "编辑组织"
msgid "Crm|New contact"
msgstr "新建è”系人"
@@ -10714,10 +10815,10 @@ msgid "Crm|No organizations found"
msgstr "未找到组织"
msgid "Crm|Organization has been added."
-msgstr ""
+msgstr "已添加组织"
msgid "Crm|Organization has been updated."
-msgstr ""
+msgstr "组织已更新。"
msgid "Cron Timezone"
msgstr "Cron 时区"
@@ -10791,8 +10892,11 @@ msgstr "å好设置"
msgid "CurrentUser|Start an Ultimate trial"
msgstr "开始试用旗舰版"
-msgid "CurrentUser|Upgrade"
-msgstr "å‡çº§"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
+msgstr ""
msgid "Custom Attributes"
msgstr "自定义属性"
@@ -10834,10 +10938,10 @@ msgid "Customer relations"
msgstr "客户关系"
msgid "Customer relations contacts"
-msgstr ""
+msgstr "客户关系è”系人"
msgid "Customer relations organizations"
-msgstr ""
+msgstr "客户关系组织"
msgid "Customize CI/CD settings, including Auto DevOps, shared runners, and job artifacts."
msgstr "自定义 CI/CD 设置,包括 Auto DevOpsã€å…±äº«Runner和作业产物。"
@@ -10965,6 +11069,9 @@ msgstr "应该属于一个群组"
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr "%{selectedLabelsCount}项已选择(最大%{maxLabels})"
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr "èšåˆå·²ç¦ç”¨"
@@ -10983,6 +11090,9 @@ msgstr "创建自定义价值æµ"
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr "自定义价值æµæ¥è¡¡é‡æ‚¨çš„ DevSecOps 生命周期"
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr "日期"
@@ -10992,6 +11102,9 @@ msgstr "显示图表筛选器"
msgid "CycleAnalytics|Filter by stop date"
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 "å˜æ›´çš„å‰ç½®æ—¶é—´"
@@ -11073,7 +11186,7 @@ msgid "DAST profile not found: %{name}"
msgstr "未找到 DAST é…置文件:%{name}"
msgid "DAST profiles"
-msgstr ""
+msgstr "DAST é…置文件"
msgid "DNS"
msgstr "DNS"
@@ -11220,7 +11333,7 @@ msgid "DastProfiles|Could not update the site profile. Please try again."
msgstr "无法更新站点é…置。请é‡è¯•ã€‚"
msgid "DastProfiles|DAST profile library"
-msgstr ""
+msgstr "DAST é…置文件库"
msgid "DastProfiles|Debug messages"
msgstr "调试消æ¯"
@@ -11366,6 +11479,12 @@ msgstr "站点类型"
msgid "DastProfiles|Spider timeout"
msgstr "爬虫超时"
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr "目标URL"
@@ -11456,26 +11575,26 @@ msgstr "é‡è¯•éªŒè¯"
msgid "DastSiteValidation|Revoke validation"
msgstr "撤销验è¯"
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
-msgstr "步骤 1 - 选择站点验è¯æ–¹æ³•"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
-msgstr "步骤2 - 将以下HTTP标头添加到您的网站"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
-msgstr "步骤 2 - 添加以下 Meta 标签到您的网站"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
+msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
-msgstr "步骤 2 - 将以下文本添加到目标站点"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
-msgstr "步骤 3 - 确认报头ä½ç½®å¹¶éªŒè¯"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
-msgstr "步骤 3 - 确认 Meta 标签ä½ç½®å¹¶éªŒè¯"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
+msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
-msgstr "步骤 3 - 确认文本文件ä½ç½®å¹¶éªŒè¯"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
+msgstr ""
msgid "DastSiteValidation|Text file validation"
msgstr "文本文件验è¯"
@@ -11490,14 +11609,14 @@ 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] "è¿™å°†å½±å“ %d 个针对åŒä¸€ URL 的其他é…置文件。"
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
-msgstr "è¦è¿è¡Œä¸€ä¸ªæ´»åŠ¨æ‰«æ,请验è¯æ‚¨çš„目标站点。共享相åŒåŸºç¡€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 ""
msgid "DastSiteValidation|Validate"
msgstr "验è¯"
-msgid "DastSiteValidation|Validate target site"
-msgstr "验è¯ç›®æ ‡ç½‘ç«™"
+msgid "DastSiteValidation|Validate site"
+msgstr ""
msgid "DastSiteValidation|Validated"
msgstr "已验è¯"
@@ -11778,6 +11897,9 @@ msgstr "删除产物"
msgid "Delete badge"
msgstr "删除徽章"
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr "删除列"
@@ -11889,6 +12011,9 @@ msgstr "已删除èŠå¤©çš„昵称: %{chat_name}!"
msgid "Deleted projects cannot be restored!"
msgstr "已删除的项目无法æ¢å¤!"
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr "删除æºåˆ†æ”¯"
@@ -12012,9 +12137,15 @@ msgstr "ä¾èµ–项扫æ"
msgid "Dependency list"
msgstr "ä¾èµ–列表"
+msgid "DependencyProxy|All items in the cache are scheduled for removal."
+msgstr ""
+
msgid "DependencyProxy|Cached %{time}"
msgstr "已缓存 %{time}"
+msgid "DependencyProxy|Clear cache"
+msgstr ""
+
msgid "DependencyProxy|Clear the Dependency Proxy cache automatically"
msgstr "自动清除ä¾èµ–代ç†ç¼“å­˜"
@@ -12024,9 +12155,6 @@ msgstr "åŒ…å« %{count} 个镜åƒå—(%{size})"
msgid "DependencyProxy|Copy prefix"
msgstr "å¤åˆ¶å‰ç¼€"
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr "创建一个本地代ç†ï¼Œç”¨äºŽå­˜å‚¨é¢‘ç¹ä½¿ç”¨çš„上游镜åƒã€‚ %{docLinkStart}了解更多%{docLinkEnd} 关于ä¾èµ–代ç†çš„内容。"
-
msgid "DependencyProxy|Dependency Proxy"
msgstr "ä¾èµ–代ç†"
@@ -12042,6 +12170,9 @@ msgstr "å¯ç”¨ä¾èµ–代ç†"
msgid "DependencyProxy|Image list"
msgstr "é•œåƒåˆ—表"
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr "存储设置"
@@ -12297,6 +12428,9 @@ 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 "项目部署目标(å¯é€‰ï¼‰"
@@ -12445,11 +12579,17 @@ msgstr "功能弃用和移除"
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr "关于å¯èƒ½æ›¿æ¢çš„ä¿¡æ¯ï¼Œ%{epicStart}了解更多关于 Opstrace %{epicEnd}。"
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in GitLab 15.0."
-msgstr "14.7 版本中已弃用指标ã€æ—¥å¿—和跟踪功能,并在 15.0 版本%{epicStart}计划删除%{epicEnd}。"
+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 ""
-msgid "Deprecations|The metrics, 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 版本中已弃用指标ã€æ—¥å¿—和跟踪功能,在 15.0 版本中%{removal_link_start}计划删除%{link_end},有关å¯èƒ½çš„替æ¢æ–¹æ¡ˆï¼Œ%{opstrace_link_start}了解有关 Opstrace 的更多信æ¯%{link_end}。"
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
+msgstr ""
msgid "Deprioritize label"
msgstr "å–消优先标记"
@@ -12678,7 +12818,7 @@ msgid "DevopsAdoption|Adoption by subgroup"
msgstr "按å­ç»„采用"
msgid "DevopsAdoption|Adoption over time"
-msgstr "采用"
+msgstr "采用éšæ—¶é—´æŽ¨ç§»"
msgid "DevopsAdoption|An error occurred while removing the group. Please try again."
msgstr "删除群组时出错,请é‡è¯•ã€‚"
@@ -12842,6 +12982,9 @@ msgstr "您的分数"
msgid "DevopsReport|Your usage"
msgstr "您的使用情况"
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr "没有收到确认邮件?"
@@ -12857,6 +13000,9 @@ msgstr "超过此é™åˆ¶çš„差异文件将显示为“太大â€å¹¶ä¸”无法扩展
msgid "Diff limits"
msgstr "差异é™åˆ¶"
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr "开始日期和现在之间的差异"
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] "%d 个删除"
+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 "显示%{unfoldCount}行"
@@ -12914,9 +13069,6 @@ msgstr "目录å称"
msgid "Disable"
msgstr "ç¦ç”¨"
-msgid "Disable Elasticsearch until indexing completes."
-msgstr "在索引完æˆä¹‹å‰ç¦ç”¨Elasticsearch。"
-
msgid "Disable Two-factor Authentication"
msgstr "ç¦ç”¨åŒé‡è®¤è¯"
@@ -12929,6 +13081,9 @@ msgstr "在此项目中ç¦ç”¨"
msgid "Disable group runners"
msgstr "ç¦ç”¨ç¾¤ç»„Runner"
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr "ç¦ç”¨åŒé‡è®¤è¯"
@@ -13042,7 +13197,7 @@ msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}"
msgstr "在%{projectLink} 中的æµæ°´çº¿ %{pipelineLink}上忽略"
msgid "Display"
-msgstr ""
+msgstr "显示"
msgid "Display alerts from all configured monitoring tools."
msgstr "显示æ¥è‡ªæ‰€æœ‰é…置的监控工具的警报。"
@@ -13062,8 +13217,8 @@ msgstr "显示渲染åŽæ–‡ä»¶"
msgid "Display source"
msgstr "显示æº"
-msgid "Display time tracking in issues in total hours only."
-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 "ä¸è¦æ˜¾ç¤ºç”¨äºŽæ”¹å–„客户体验的内容和æ¥è‡ªç¬¬ä¸‰æ–¹çš„优惠"
@@ -13102,7 +13257,7 @@ msgid "Domain Name"
msgstr "域å"
msgid "Don't have a group?"
-msgstr ""
+msgstr "没有群组?"
msgid "Don't have an account yet?"
msgstr "还没有账户?"
@@ -13149,9 +13304,6 @@ msgstr "下载 PDF"
msgid "Download artifacts"
msgstr "下载产物"
-msgid "Download as"
-msgstr "下载å¦å­˜ä¸º"
-
msgid "Download codes"
msgstr "下载代ç "
@@ -13239,47 +13391,53 @@ msgstr "截止日期"
msgid "Due date"
msgstr "截止日期"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr "时长"
-msgid "Duration|%s days"
+msgid "Duration (min)"
msgstr ""
+msgid "Duration|%s days"
+msgstr "%s 天"
+
msgid "Duration|%s hours"
-msgstr ""
+msgstr "%s å°æ—¶"
msgid "Duration|%s minutes"
-msgstr ""
+msgstr "%s 分钟"
msgid "Duration|%s months"
-msgstr ""
+msgstr "%s 个月"
msgid "Duration|%s seconds"
-msgstr ""
+msgstr "%s 秒"
msgid "Duration|%s weeks"
-msgstr ""
+msgstr "%s 周"
msgid "Duration|%s years"
-msgstr ""
+msgstr "%s å¹´"
msgid "Duration|1 day"
-msgstr ""
+msgstr "1 天"
msgid "Duration|1 hour"
-msgstr ""
+msgstr "1 å°æ—¶"
msgid "Duration|1 minute"
-msgstr ""
+msgstr "1 分钟"
msgid "Duration|1 month"
-msgstr ""
+msgstr "1 个月"
msgid "Duration|1 week"
-msgstr ""
+msgstr "1 周"
msgid "Duration|1 year"
-msgstr ""
+msgstr "1 å¹´"
msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr "在此过程中,我们会è¦æ±‚您æä¾›æ¥è‡ª GitLab çš„ URL 。请使用下é¢çš„网å€ã€‚"
@@ -13395,6 +13553,9 @@ msgstr "内è”编辑"
msgid "Edit issues"
msgstr "编辑议题"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr "编辑åˆå¹¶è¯·æ±‚"
@@ -13449,9 +13610,6 @@ msgstr "Elasticsearch AWS IAM凭æ®"
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr "Elasticsearch HTTP客户端超时值,以秒为å•ä½ã€‚"
-msgid "Elasticsearch indexing"
-msgstr "Elasticsearch索引中"
-
msgid "Elasticsearch indexing restrictions"
msgstr "Elasticsearch索引é™åˆ¶"
@@ -13512,9 +13670,6 @@ msgstr "邮件无法å‘é€"
msgid "Email display name"
msgstr "电å­é‚®ä»¶æ˜¾ç¤ºå称"
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr "æ¥è‡ª GitLab 的电å­é‚®ä»¶ - æ¥è‡ªç®¡ç†ä¸­å¿ƒçš„用户。 %{link_start}了解更多%{link_end}。"
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr "电å­é‚®ä»¶æœªéªŒè¯ã€‚请在Salesforce中验è¯æ‚¨çš„电å­é‚®ä»¶ã€‚"
@@ -13524,6 +13679,9 @@ msgstr "未知登录邮件通知"
msgid "Email patch"
msgstr "电å­é‚®ä»¶è¡¥ä¸"
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr "邮件已å‘é€"
@@ -13620,15 +13778,15 @@ msgstr "空文件"
msgid "Enable"
msgstr "å¯ç”¨"
+msgid "Enable Akismet"
+msgstr ""
+
msgid "Enable Amazon EKS integration"
msgstr "å¯ç”¨ Amazon EKS 集æˆ"
msgid "Enable Auto DevOps"
msgstr "å¯ç”¨Auto DevOps"
-msgid "Enable Git pack file bitmap creation"
-msgstr "å¯ç”¨ Git 包文件ä½å›¾åˆ›å»º"
-
msgid "Enable Gitpod"
msgstr "å¯ç”¨Gitpod"
@@ -13650,18 +13808,12 @@ msgstr "å¯ç”¨PlantUML"
msgid "Enable Pseudonymizer data collection"
msgstr "å¯ç”¨åŒ¿å化的数æ®æ”¶é›†"
-msgid "Enable Registration Features"
-msgstr "å¯ç”¨æ³¨å†ŒåŠŸèƒ½"
-
msgid "Enable SSL verification"
msgstr "å¯ç”¨ SSL 验è¯"
msgid "Enable Sentry error tracking"
msgstr "å¯ç”¨ Sentry 错误跟踪"
-msgid "Enable Service Ping"
-msgstr "å¯ç”¨æœåŠ¡Ping"
-
msgid "Enable Snowplow tracking"
msgstr "å¯ç”¨Snowplow跟踪"
@@ -13693,7 +13845,7 @@ msgid "Enable authenticated API request rate limit"
msgstr "å¯ç”¨å·²èº«ä»½éªŒè¯çš„ API 请求速率é™åˆ¶"
msgid "Enable authenticated Git LFS request rate limit"
-msgstr "å¯ç”¨è®¤è¯çš„ Git LFS 请求速率é™åˆ¶"
+msgstr "å¯ç”¨ç»è¿‡èº«ä»½éªŒè¯çš„ Git LFS 请求速率é™åˆ¶"
msgid "Enable authenticated web request rate limit"
msgstr "å¯ç”¨ç»è¿‡èº«ä»½éªŒè¯çš„ Web 请求速率é™åˆ¶"
@@ -13743,12 +13895,6 @@ msgstr "å¯ç”¨äº‹ä»¶ç®¡ç†å…¥ç«™è­¦æŠ¥é™åˆ¶"
msgid "Enable integration"
msgstr "å¯ç”¨é›†æˆ"
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr "å¯ç”¨kuromoji自定义分æžå™¨ï¼šç´¢å¼•"
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr "å¯ç”¨kuromoji自定义分æžå™¨ï¼šæœç´¢"
-
msgid "Enable logs collection"
msgstr "å¯ç”¨æ—¥å¿—收集"
@@ -13794,12 +13940,6 @@ msgstr "为该组å¯ç”¨å…±äº«Runner"
msgid "Enable shared runners for this project"
msgstr "为该项目å¯ç”¨å…±äº«Runner"
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr "å¯ç”¨smartcn自定义分æžå™¨ï¼šç´¢å¼•"
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr "å¯ç”¨smartcn自定义分æžå™¨ï¼šæœç´¢"
-
msgid "Enable two-factor authentication"
msgstr "å¯ç”¨åŒé‡è®¤è¯"
@@ -13866,8 +14006,8 @@ msgstr "结æŸäºŽï¼š%{endsAt}"
msgid "Enforce SSH key expiration"
msgstr "强制使用 SSH 密钥过期"
-msgid "Enforce personal access token expiration"
-msgstr "强制个人访问令牌过期"
+msgid "Enforce access token expiration"
+msgstr ""
msgid "Enforce two-factor authentication"
msgstr "强制执行åŒé‡è®¤è¯"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr "ä¼ä¸š"
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] "环境"
+msgstr ""
msgid "Environment does not have deployments"
msgstr "环境没有部署"
@@ -14117,7 +14256,7 @@ msgid "Environments|Environments are places where code gets deployed, such as st
msgstr "环境是指部署代ç çš„ä½ç½®ï¼Œä¾‹å¦‚预å‘布或生产。"
msgid "Environments|How do I create an environment?"
-msgstr ""
+msgstr "如何创建环境?"
msgid "Environments|Install Elastic Stack on your cluster to enable advanced querying capabilities such as full text search."
msgstr "在群集上安装Elastic Stack,以å¯ç”¨é«˜çº§æŸ¥è¯¢åŠŸèƒ½ï¼Œä¾‹å¦‚全文æœç´¢ã€‚"
@@ -14216,10 +14355,10 @@ msgid "Environments|Updated"
msgstr "更新于"
msgid "Environments|You don't have any environments."
-msgstr ""
+msgstr "您没有任何环境。"
msgid "Environments|You don't have any stopped environments."
-msgstr ""
+msgstr "您没有任何åœæ­¢çš„环境。"
msgid "Environments|by %{avatar}"
msgstr "ç”± %{avatar} æä¾›"
@@ -14230,6 +14369,9 @@ msgstr "å—ä¿æŠ¤çš„"
msgid "Environment|Auto stop %{time}"
msgstr "自动åœæ­¢ %{time}"
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr "å²è¯—"
@@ -14254,9 +14396,6 @@ msgstr "å²è¯—"
msgid "Epics Roadmap"
msgstr "å²è¯—路线图"
-msgid "Epics and Issues"
-msgstr "å²è¯—和议题"
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr "有效利用å²è¯—,您的产å“线管ç†ä¼šå˜å¾—æ›´è½»æ¾é«˜æ•ˆ"
@@ -14359,6 +14498,9 @@ msgstr "到期"
msgid "Epics|start"
msgstr "开始"
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr "错误"
@@ -14614,9 +14756,6 @@ msgstr "错误"
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr "在第%{line_number}行中å‘现错误: %{error_lines}。请检查这些行是å¦åŒ…å«æ‰€éœ€çš„标题。"
-msgid "Errors:"
-msgstr "错误:"
-
msgid "Escalate this incident"
msgstr "å‡çº§æ­¤äº‹ä»¶"
@@ -14847,7 +14986,7 @@ msgid "Everything you need to create a GitLab Pages site using Jekyll"
msgstr "使用Jekyll创建GitLab Pages站点所需的所有信æ¯"
msgid "Everything you need to create a GitLab Pages site using Middleman"
-msgstr ""
+msgstr "使用 Middleman 创建 GitLab Pages 站点所需的一切"
msgid "Everything you need to create a GitLab Pages site using plain HTML"
msgstr "使用纯HTML创建GitLab Pages网站所需的所有信æ¯"
@@ -14862,7 +15001,7 @@ msgid "Example: @sub\\.company\\.com$"
msgstr "示例: @sub\\.company\\.com$"
msgid "Examples"
-msgstr ""
+msgstr "例å­"
msgid "Except policy:"
msgstr "除外(Except)æ¡ä»¶ï¼š"
@@ -14948,6 +15087,9 @@ msgstr "过期日期 (å¯é€‰)"
msgid "Expiration date:"
msgstr "到期日期:"
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr "已过期"
@@ -14985,7 +15127,7 @@ msgid "Explore groups"
msgstr "æµè§ˆç¾¤ç»„"
msgid "Explore paid plans"
-msgstr ""
+msgstr "æµè§ˆä»˜è´¹è®¡åˆ’"
msgid "Explore projects"
msgstr "æµè§ˆé¡¹ç›®"
@@ -15246,6 +15388,9 @@ msgstr "安装失败。"
msgid "Failed to load"
msgstr "加载失败"
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr "加载指派人失败。"
@@ -15276,6 +15421,9 @@ msgstr "加载群组活动度é‡æŒ‡æ ‡å¤±è´¥ã€‚请é‡è¯•ã€‚"
msgid "Failed to load groups, users and deploy keys."
msgstr "无法加载群组,用户和部署密钥。"
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr "加载迭代失败。"
@@ -15432,8 +15580,8 @@ msgstr "图标将被删除。您确定å—?"
msgid "Feature Flags"
msgstr "功能标志"
-msgid "Feature deprecation and removal"
-msgstr "功能弃用和移除"
+msgid "Feature deprecation"
+msgstr ""
msgid "Feature flag status"
msgstr "功能标志状æ€"
@@ -15676,6 +15824,9 @@ msgstr "文件钩å­"
msgid "File Hooks (%{count})"
msgstr "æ–‡ä»¶é’©å­ (%{count})"
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr "文件已添加"
@@ -15703,9 +15854,6 @@ msgstr "文件已é‡å‘½å,但无更改。"
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr "文件被 .gitattributes æ¡ç›®åŽ‹åˆ¶æˆ–文件的编ç ä¸å—支æŒã€‚"
-msgid "File synchronization concurrency limit"
-msgstr "文件åŒæ­¥å¹¶å‘é™åˆ¶"
-
msgid "File templates"
msgstr "文件模æ¿"
@@ -15832,9 +15980,6 @@ msgstr "完æˆæ‚¨çš„%{group_name}专用å¸æˆ·è®¾ç½®ã€‚"
msgid "Finished"
msgstr "已完æˆ"
-msgid "Finished at"
-msgstr "完æˆäºŽ"
-
msgid "First Name"
msgstr "å"
@@ -15866,7 +16011,7 @@ msgid "FloC|Enable FloC (Federated Learning of Cohorts)"
msgstr "å¯ç”¨ FloC(Federated Learning of Cohorts)"
msgid "FloC|Federated Learning of Cohorts"
-msgstr "Federated Learning of Cohorts"
+msgstr "FloC(Federated Learning of Cohorts)"
msgid "FlowdockService|1b609b52537..."
msgstr "1b609b52537..."
@@ -15955,9 +16100,6 @@ msgstr "如需了解详细信æ¯ï¼Œè¯·å‚阅"
msgid "For more information, see the File Hooks documentation."
msgstr "欲了解更多信æ¯ï¼Œè¯·å‚阅文件钩å­æ–‡æ¡£ã€‚"
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr "有关更多信æ¯ï¼Œè¯·å‚阅有关 %{deactivating_service_ping_link_start}åœç”¨æœåŠ¡ ping%{deactivating_service_ping_link_end}的文档。"
-
msgid "Forgot your password?"
msgstr "忘记密ç ï¼Ÿ"
@@ -16091,7 +16233,7 @@ msgid "From %{providerTitle}"
msgstr "%{providerTitle}æºåœ°å€"
msgid "From June 22, 2022 (GitLab 15.1), free personal namespaces and top-level groups will be limited to %{free_limit} members"
-msgstr ""
+msgstr "从 2022 å¹´ 6 月 22 日(GitLab 15.1)开始,å…费的个人命å空间和顶级群组将é™åˆ¶ä¸º %{free_limit} 个æˆå‘˜"
msgid "From issue creation until deploy to production"
msgstr "从创建议题到部署至生产环境"
@@ -16186,6 +16328,14 @@ msgstr "Geo 站点"
msgid "Geo sites"
msgstr "Geo站点"
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr "%{boldStart}N/A%{boldEnd}: Geo 尚未验è¯æ­¤ç»„件。请å‚阅 %{linkStart}我们计划支æŒçš„æ•°æ®ç±»åž‹%{linkEnd}。"
@@ -16219,6 +16369,9 @@ msgstr "%{title} 校验进度"
msgid "Geo|(%{timeAgo})"
msgstr "(%{timeAgo})"
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr "添加站点"
@@ -16240,6 +16393,12 @@ 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 "å…许的Geo IPä¸èƒ½ä¸ºç©º"
@@ -16249,9 +16408,24 @@ msgstr "å…许的Geo IP应该介于1到255个字符之间"
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr "å…许的Geo IP应该包å«æœ‰æ•ˆçš„IP地å€"
+msgid "Geo|Beta"
+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 "连接超时ä¸èƒ½ä¸ºç©º"
@@ -16264,6 +16438,9 @@ msgstr "连接超时应介于1-120之间"
msgid "Geo|Consult Geo troubleshooting information"
msgstr "查询Geo故障排除信æ¯"
+msgid "Geo|Container repositories synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Could not remove tracking entry for an existing project."
msgstr "无法删除现有项目的跟踪æ¡ç›®ã€‚"
@@ -16285,9 +16462,21 @@ msgstr "与主存储é…ç½®ä¸ä¸€è‡´"
msgid "Geo|Edit %{nodeType} site"
msgstr "编辑 %{nodeType} 站点"
+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 "筛选 Geo 站点"
@@ -16297,24 +16486,36 @@ msgstr "按å称筛选"
msgid "Geo|Filter by status"
msgstr "按状æ€ç­›é€‰"
+msgid "Geo|Geo Settings"
+msgstr ""
+
msgid "Geo|Geo Status"
msgstr "Geo状æ€"
+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 "Geo站点"
msgid "Geo|Geo sites are paused using a command run on the site"
msgstr "使用在站点上è¿è¡Œçš„命令æ¥æš‚åœGeo站点"
-msgid "Geo|Geo supports replication of many data types."
-msgstr "Geo 支æŒå¤šç§æ•°æ®ç±»åž‹çš„å¤åˆ¶ã€‚"
-
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 "如需进行å˜æ›´ï¼Œå¿…须访问主站点。"
@@ -16327,6 +16528,9 @@ msgstr "å·²åŒæ­¥"
msgid "Geo|Internal URL"
msgstr "内部 URL"
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr "主节点中最新的事件ID"
@@ -16351,21 +16555,39 @@ msgstr "了解更多关于Geo"
msgid "Geo|Learn more about Geo site statuses"
msgstr "了解更多关于Geo站点状æ€çš„ä¿¡æ¯"
+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 "GitLab Geo å¯ä»¥åˆ›å»º GitLab 实例的åªè¯»é•œåƒ, 使得从远端克隆和拉å–大型代ç ä»“库的时间大大缩短,从而æ高团队æˆå‘˜çš„工作效率。"
+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 "无需校验和"
@@ -16375,6 +16597,9 @@ msgstr "没有è¦åŒæ­¥çš„内容"
msgid "Geo|Nothing to verify"
msgstr "无需验è¯"
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr "离线"
@@ -16387,6 +16612,9 @@ msgstr "å¾…åŒæ­¥"
msgid "Geo|Pending verification"
msgstr "待验è¯"
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr "主节点"
@@ -16408,6 +16636,9 @@ msgstr "特定存储片中的项目"
msgid "Geo|Queued"
msgstr "队列中"
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr "é‡æ–°ä¸‹è½½"
@@ -16450,6 +16681,9 @@ msgstr "å¤åˆ¶çŠ¶æ€"
msgid "Geo|Replication summary"
msgstr "å¤åˆ¶æ‘˜è¦"
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr "é‡æ–°åŒæ­¥"
@@ -16477,15 +16711,39 @@ msgstr "é‡æ–°æ ¡éªŒæ‰€æœ‰é¡¹ç›®"
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr "查看å¤åˆ¶çŠ¶æ€å¹¶ä¸Žä¸»è¦ç«™ç‚¹é‡æ–°åŒæ­¥å’Œé‡æ–°éªŒè¯é¡¹ç›®ã€‚"
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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 "选择性 (%{syncLabel})"
+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|Site name can't be blank"
msgstr "站点å称ä¸èƒ½ä¸ºç©º"
@@ -16519,6 +16777,12 @@ 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 "æ•°æ®åº“当å‰ä½äºŽä¸»ç«™ç‚¹åŽé¢ %{db_lag}。"
@@ -16531,9 +16795,21 @@ msgstr "没有%{replicable_type}å¯æ˜¾ç¤º"
msgid "Geo|There was an error deleting the Geo Site"
msgstr "删除Geo站点时出错"
+msgid "Geo|There was an error fetching the Geo Settings"
+msgstr ""
+
msgid "Geo|There was an error fetching the Geo Sites"
msgstr "删除Geo站点时出错"
+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 "å°†è¦é‡æ–°åŒæ­¥æ‰€æœ‰%{replicableType}。å¯èƒ½éœ€è¦ä¸€äº›æ—¶é—´å®Œæˆã€‚确定继续å—?"
@@ -16543,12 +16819,18 @@ 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 "å·²æˆåŠŸåˆ é™¤é¡¹ç›® (%{project_id}) 的跟踪项。"
+msgid "Geo|Tuning settings"
+msgstr ""
+
msgid "Geo|URL can't be blank"
msgstr "URLä¸èƒ½ä¸ºç©º"
@@ -16573,6 +16855,9 @@ msgstr "更新于%{timeAgo}"
msgid "Geo|Verification"
msgstr "验è¯"
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr "验è¯å¤±è´¥ - %{error}"
@@ -16588,8 +16873,8 @@ msgstr "已验è¯"
msgid "Geo|Waiting for scheduler"
msgstr "等待调度"
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
-msgstr "使用 GitLab Geo,您å¯ä»¥åœ¨ä»»ä½•åœ°æ–¹å®‰è£…特殊的ã€åªè¯»çš„å¤åˆ¶å®žä¾‹ã€‚ %{linkStart}了解更多%{linkEnd}"
+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 "当å‰å¤„于一个次è¦çš„,%{b_open}åªè¯»çš„%{b_close}Geo站点。"
@@ -16718,7 +17003,7 @@ msgid "GitLab Team Member"
msgstr "GitLab团队æˆå‘˜"
msgid "GitLab Ultimate trial"
-msgstr ""
+msgstr "GitLab 旗舰版试用"
msgid "GitLab User"
msgstr "GitLab用户"
@@ -16744,8 +17029,8 @@ msgstr "GitLab导出"
msgid "GitLab group: %{source_link}"
msgstr "GitLab 群组:%{source_link}"
-msgid "GitLab informs you if a new version is available."
-msgstr "GitLab 会通知您是å¦æœ‰æ–°ç‰ˆæœ¬å¯ç”¨ã€‚"
+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 "GitLab是一个完整的DevOpså¹³å°ï¼Œä½œä¸ºå•ä¸ªåº”用程åºå‘ˆçŽ°ï¼Œä»Žæ ¹æœ¬ä¸Šæ”¹å˜äº†å¼€å‘,安全和è¿ç»´å›¢é˜Ÿçš„å作方å¼"
@@ -16915,6 +17200,15 @@ msgstr "Gitea 主机地å€"
msgid "Gitea Import"
msgstr "从Gitea导入"
+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 "创建一个具有%{status_html}访问æƒé™çš„%{token_link_start}个人访问令牌%{token_link_end},并将其粘贴到此处。"
@@ -17788,9 +18082,6 @@ msgstr "如果未在群组或实例级别指定,则默认为 %{default_initial
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|New runners registration token has been generated!"
-msgstr "已生æˆæ–°çš„Runner注册令牌ï¼"
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr "覆盖群组ã€å­ç»„和项目所有æˆå‘˜çš„用户通知å好设置。"
@@ -17908,9 +18199,6 @@ msgstr "群组是组织项目和人员的好方法。"
msgid "Groups are the best way to manage projects and members."
msgstr "群组是管ç†é¡¹ç›®å’Œæˆå‘˜çš„最佳方å¼ã€‚"
-msgid "Groups to synchronize"
-msgstr "需åŒæ­¥çš„群组"
-
msgid "GroupsDropdown|Frequently visited"
msgstr "ç»å¸¸è®¿é—®çš„群组"
@@ -18138,71 +18426,71 @@ msgstr "使用 Harbor 作为该项目的容器镜åƒåº“。"
msgid "HarborRegistry|%{count} Image repository"
msgid_plural "HarborRegistry|%{count} Image repositories"
-msgstr[0] ""
+msgstr[0] "%{count} 个镜åƒä»“库"
msgid "HarborRegistry|%{count} Tag"
msgid_plural "HarborRegistry|%{count} Tags"
-msgstr[0] ""
+msgstr[0] "%{count} 个标签"
msgid "HarborRegistry|Configuration digest: %{digest}"
-msgstr ""
+msgstr "é…置摘è¦: %{digest}"
msgid "HarborRegistry|Digest: %{imageId}"
-msgstr ""
+msgstr "摘è¦: %{imageId}"
msgid "HarborRegistry|Harbor Registry"
-msgstr ""
+msgstr "Harbor Registry"
msgid "HarborRegistry|Harbor connection error"
-msgstr ""
+msgstr "Harbor 连接错误"
msgid "HarborRegistry|Invalid tag: missing manifest digest"
-msgstr ""
+msgstr "无效标签:缺少 manifest 摘è¦"
msgid "HarborRegistry|Last updated %{time}"
-msgstr ""
+msgstr "最近更新于%{time}"
msgid "HarborRegistry|Manifest digest: %{digest}"
-msgstr ""
+msgstr "Manifest 摘è¦: %{digest}"
msgid "HarborRegistry|Please try different search criteria"
-msgstr ""
+msgstr "请å°è¯•ä¸åŒçš„æœç´¢æ¡ä»¶"
msgid "HarborRegistry|Published %{timeInfo}"
-msgstr ""
+msgstr "å‘布于%{timeInfo}"
msgid "HarborRegistry|Published to the %{repositoryPath} image repository at %{time} on %{date}"
-msgstr ""
+msgstr "于%{date}%{time}å‘布到%{repositoryPath}é•œåƒä»“库。"
msgid "HarborRegistry|Root image"
-msgstr ""
+msgstr "根镜åƒ"
msgid "HarborRegistry|Sorry, your filter produced no results."
-msgstr ""
+msgstr "对ä¸èµ·ï¼Œæ‚¨çš„过滤器没有产生任何结果。"
msgid "HarborRegistry|The filter returned no results"
-msgstr ""
+msgstr "过滤器没有返回结果"
msgid "HarborRegistry|The image repository could not be found."
-msgstr ""
+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 ""
+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 ""
+msgstr "请求的镜åƒä»“库ä¸å­˜åœ¨æˆ–已被删除。如果您认为这是一个错误,请å°è¯•åˆ·æ–°é¡µé¢ã€‚"
msgid "HarborRegistry|This image has no active tags"
-msgstr ""
+msgstr "此镜åƒæ²¡æœ‰æœ‰æ•ˆæ ‡ç­¾"
msgid "HarborRegistry|To widen your search, change or remove the filters above."
-msgstr ""
+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 ""
+msgstr "连接到 Harbor Registry 出错。请å°è¯•åˆ·æ–°é¡µé¢ã€‚如果此错误ä»ç„¶å­˜åœ¨ï¼Œè¯·æŸ¥çœ‹ %{docLinkStart}故障排查文档%{docLinkEnd}。"
msgid "HarborRegistry|With the Harbor Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
+msgstr "使用 Harbor Registry,æ¯ä¸ªé¡¹ç›®éƒ½æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®¹å™¨é•œåƒã€‚%{docLinkStart}更多信æ¯%{docLinkEnd}"
msgid "Hashed Storage must be enabled to use Geo"
msgstr "å¯ç”¨å“ˆå¸Œå­˜å‚¨åŽæ‰èƒ½ä½¿ç”¨ Geo"
@@ -18315,6 +18603,9 @@ 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 "有助于防止机器人创建议题。"
@@ -18327,9 +18618,6 @@ msgstr "帮助å‡å°‘请求é‡ï¼ˆä¾‹å¦‚æ¥è‡ªçˆ¬è™«æˆ–滥用机器人的请求)
msgid "Helps reduce request volume for protected paths."
msgstr "有助于å‡å°‘å—ä¿æŠ¤è·¯å¾„的请求é‡ã€‚"
-msgid "Here you will find recent merge request activity"
-msgstr "您将在这里找到最近的åˆå¹¶è¯·æ±‚活动"
-
msgid "Hi %{username}!"
msgstr "%{username},您好!"
@@ -18476,12 +18764,6 @@ msgstr "已开始维护"
msgid "How do I configure Akismet?"
msgstr "如何é…ç½® Akismet ?"
-msgid "How do I configure authentication using the GitLab database?"
-msgstr "如何使用 GitLab æ•°æ®åº“é…置身份验è¯ï¼Ÿ"
-
-msgid "How do I configure it?"
-msgstr "我如何é…置它?"
-
msgid "How do I configure runners?"
msgstr "如何é…ç½® Runner?"
@@ -18614,6 +18896,9 @@ msgstr "æ¯ä¸ªç”¨æˆ·çš„ IP 地å€"
msgid "IP subnet restriction only allowed for top-level groups"
msgstr "åªå…许在最顶层群组设置IPå­ç½‘é™åˆ¶"
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr "身份标识"
@@ -18653,15 +18938,12 @@ msgstr "如选中,则群组所有者å¯ä»¥ç®¡ç†LDAP群组链接和 LDAPæˆå‘˜
msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization"
msgstr "选中åŽå°†åˆ™åªèƒ½é€šè¿‡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."
-msgstr "如果ç¦ç”¨ï¼Œåˆ™ä¸ä¼šä½¿ç”¨è¿œç¨‹å‰¯æœ¬çš„æ交自动更新分å‰çš„本地分支,以防止本地数æ®ä¸¢å¤±ã€‚如果默认分支 (%{default_branch}) 已分å‰ä¸”无法更新,则镜åƒå°†å¤±è´¥ã€‚其他分å‰çš„分支默默被忽略。"
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr "如果å¯ç”¨ï¼ŒGitLab 将使用 Geo 处ç†å¯¹è±¡å­˜å‚¨å¤åˆ¶ã€‚ %{linkStart}了解更多%{linkEnd}"
-
msgid "If enabled, only protected branches will be mirrored."
msgstr "如果å¯ç”¨ï¼Œåˆ™åªä¼šé•œåƒå—ä¿æŠ¤çš„分支。"
@@ -18674,9 +18956,6 @@ msgstr "如果YouTube网å€ä¸ºhttps://www.youtube.com/watch?v=0t1DgySidms,则è
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 "如果活跃用户数é‡è¶…过了用户é™åˆ¶ï¼Œæ‚¨ä¸‹æ¬¡çš„许å¯è¯å¯¹è´¦æ—¶å°†ä¼šæ”¶å–%{users_over_license_link}个席ä½çš„费用。"
-msgid "If there isn't any existing index, GitLab creates one."
-msgstr "如果没有任何现有索引,GitLab 会创建一个。"
-
msgid "If this email was added in error, you can remove it here:"
msgstr "如果此电å­é‚®ä»¶è¢«é”™è¯¯æ·»åŠ ï¼Œæ‚¨å¯ä»¥åœ¨è¿™é‡Œåˆ é™¤ï¼š"
@@ -18729,10 +19008,10 @@ msgid "If you want to re-enable two-factor authentication, visit the %{settings_
msgstr "如果您想è¦é‡æ–°å¯ç”¨åŒé‡èº«ä»½éªŒè¯ï¼Œè¯·è®¿é—®%{settings_link_to}页é¢ã€‚"
msgid "If you want to remove this email address, visit %{profile_link}"
-msgstr ""
+msgstr "如果您想删除此电å­é‚®ä»¶åœ°å€ï¼Œè¯·è®¿é—® %{profile_link}"
msgid "If you want to remove this email address, visit the %{settings_link_to} page."
-msgstr ""
+msgstr "如果您想删除此电å­é‚®ä»¶åœ°å€ï¼Œè¯·è®¿é—® %{settings_link_to} 页é¢ã€‚"
msgid "If you've purchased or renewed your subscription and have an activation code, please enter it below to start the activation process."
msgstr "如果您已购买或续订订阅并拥有激活ç ï¼Œè¯·åœ¨ä¸‹æ–¹è¾“入激活ç ä»¥å¼€å§‹æ¿€æ´»è¿‡ç¨‹ã€‚"
@@ -18803,7 +19082,7 @@ msgid "Import and export rate limits"
msgstr "导入/导出速率é™åˆ¶"
msgid "Import failed due to a GitHub error: %{original} (HTTP %{code})"
-msgstr ""
+msgstr "由于 GitHub 错误,导入失败: %{original}(HTTP %{code})"
msgid "Import from"
msgstr "导入自"
@@ -18953,9 +19232,6 @@ msgstr "在此 URL 上没有有效的 Git 仓库。如果您的 HTTP 仓库ä¸èƒ
msgid "Improve customer support with Service Desk"
msgstr "通过æœåŠ¡å°æ”¹å–„客户支æŒ"
-msgid "Improves Git cloning performance."
-msgstr "æ高 Git 克隆性能。"
-
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 "在拉å–é•œåƒçš„情况下,您的用户将æˆä¸ºæ´»åŠ¨æè¦ä¸­æ‰€æœ‰ä½œä¸ºæ›´æ–°ç»“果的事件的作者,例如创建新分支或将新æ交推é€åˆ°çŽ°æœ‰åˆ†æ”¯ã€‚"
@@ -19037,6 +19313,9 @@ 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 "燃起/燃尽图"
@@ -19157,6 +19436,9 @@ msgstr "用我们的%{quick_start_link}快速开始使用 CI/CD。从一个å¯ç”
msgid "InProductMarketing|Get our import guides"
msgstr "获å–导入指å—"
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr "ç«‹å³å¼€å§‹"
@@ -19268,6 +19550,9 @@ msgstr "通过定义è°åº”该批准åˆå¹¶è¯·æ±‚以åŠéœ€è¦å¤šå°‘批准æ¥ä¿æŒ
msgid "InProductMarketing|Launch GitLab CI/CD in 20 minutes or less"
msgstr "在 20 分钟或更短的时间内å¯åŠ¨ GitLab CI/CD"
+msgid "InProductMarketing|Learn how to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Lower cost of development"
msgstr "é™ä½Žå¼€å‘æˆæœ¬"
@@ -19368,7 +19653,7 @@ msgid "InProductMarketing|Stop wondering and use GitLab to answer questions like
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 "简化代ç å®¡æŸ¥ï¼Œä¸€ç›®äº†ç„¶åœ°çŸ¥é“è°ä¸å¯ç”¨ï¼Œåœ¨è¯„论或电å­é‚®ä»¶ä¸­æ²Ÿé€šï¼Œå¹¶ä¸ŽSlackæ•´åˆï¼Œè®©æ¯ä¸ªäººéƒ½åœ¨åŒä¸€é¡µé¢ä¸Šã€‚"
+msgstr "简化代ç å®¡æ ¸ï¼Œä¸€ç›®äº†ç„¶åœ°çŸ¥é“è°ä¸å¯ç”¨ï¼Œåœ¨è¯„论或电å­é‚®ä»¶ä¸­æ²Ÿé€šï¼Œå¹¶ä¸ŽSlackæ•´åˆï¼Œè®©æ¯ä¸ªäººéƒ½åœ¨åŒä¸€é¡µé¢ä¸Šã€‚"
msgid "InProductMarketing|Take this 1-question survey!"
msgstr "å‚加这个åªæœ‰ä¸€ä¸ªé—®é¢˜çš„调查ï¼"
@@ -19451,9 +19736,15 @@ 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 "想在您的æœåŠ¡å™¨ä¸Šæ‰˜ç®¡ GitLab?"
+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 "我们知é“一些关于效率的事情,我们想分享给大家。注册GitLab Ultimateçš„å…费试用版,您的团队将从第一天开始使用它。"
@@ -19595,6 +19886,9 @@ msgstr "事件"
msgid "IncidentManagement|Incidents"
msgstr "事件"
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr "低-S4"
@@ -19718,18 +20012,6 @@ msgstr "放置或%{linkStart}上传%{linkEnd}指标截图,将其附加到事ä»
msgid "Incidents|Must start with http or https"
msgstr "必须以http或https开头"
-msgid "Incidents|There was an issue deleting the image."
-msgstr "删除镜åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr "加载指标图片时出现问题。"
-
-msgid "Incidents|There was an issue updating your image."
-msgstr "更新您的镜åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr "上传您的镜åƒæ—¶å‡ºçŽ°é—®é¢˜ã€‚"
-
msgid "Incident|Add new timeline event"
msgstr "添加时间线事件"
@@ -20202,9 +20484,6 @@ msgstr "使用默认设置"
msgid "Integrations|You can close this window."
msgstr "您å¯ä»¥å…³é—­æ­¤çª—å£ã€‚"
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr "您现在å¯ä»¥å…³é—­æ­¤çª—å£å¹¶è¿”回GitLab for Jira应用。"
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr "您å¯ä»¥åœ¨ Slack 命令中使用此别å"
@@ -20215,7 +20494,7 @@ msgid "Integrations|You must have owner or maintainer permissions to link namesp
msgstr "您必须拥有所有者或维护者æƒé™æ‰èƒ½é“¾æŽ¥å‘½å空间。"
msgid "Integrations|You must use a %{linkStart}supported browser%{linkEnd} to use the GitLab for Jira app."
-msgstr ""
+msgstr "您必须使用 %{linkStart}支æŒçš„æµè§ˆå™¨%{linkEnd} æ‰èƒ½ä½¿ç”¨ GitLab for Jira 应用程åºã€‚"
msgid "Integrations|You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}"
msgstr "您现在应该在 Jira Cloud 议题中看到动æ€ã€‚%{linkStart}了解更多%{linkEnd}"
@@ -20224,7 +20503,7 @@ msgid "Integrations|You've activated every integration 🎉"
msgstr "æ‚¨å·²æ¿€æ´»æ‰€æœ‰é›†æˆ ðŸŽ‰"
msgid "Integrations|Your browser is not supported"
-msgstr ""
+msgstr "ä¸æ”¯æŒæ‚¨çš„æµè§ˆå™¨"
msgid "Integrations|ZenTao issues display here when you create issues in your project in ZenTao."
msgstr "当您在禅é“中创建项目的议题时,禅é“议题会显示在此处。"
@@ -20247,9 +20526,6 @@ msgstr "除外部用户外,任何登录用户å‡å¯æŸ¥çœ‹è¯¥ç¾¤ç»„和任何内
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr "除外部用户外,任何登录用户å‡å¯è®¿é—®è¯¥é¡¹ç›®ã€‚"
-msgid "Internal URL (optional)"
-msgstr "内部URL(å¯é€‰)"
-
msgid "Internal error occurred while delivering this webhook."
msgstr "ä¼ é€æ­¤ webhook æ—¶å‘生内部错误。"
@@ -20259,6 +20535,9 @@ msgstr "内部用户"
msgid "Internal users cannot be deactivated"
msgstr "ä¸èƒ½åœç”¨å†…部用户"
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "循环周期"
@@ -20310,6 +20589,9 @@ msgstr "指定文件类型的文件格å¼æ— æ•ˆ"
msgid "Invalid file."
msgstr "无效的文件。"
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr "无效哈希"
@@ -20385,9 +20667,6 @@ msgstr "邀请æˆå‘˜"
msgid "Invite a group"
msgstr "邀请群组"
-msgid "Invite email has already been taken"
-msgstr "邀请邮件已被使用"
-
msgid "Invite members"
msgstr "邀请æˆå‘˜"
@@ -20482,7 +20761,7 @@ msgid "InviteMembersModal|Members were successfully added"
msgstr "æˆå‘˜å·²æˆåŠŸæ·»åŠ "
msgid "InviteMembersModal|New members will be unable to participate. You can manage your members by removing ones you no longer need."
-msgstr ""
+msgstr "æ–°æˆå‘˜å°†æ— æ³•å‚与。您å¯ä»¥é€šè¿‡åˆ é™¤æ‚¨ä¸å†éœ€è¦çš„æˆå‘˜æ¥ç®¡ç†æ‚¨çš„æˆå‘˜ã€‚"
msgid "InviteMembersModal|Search for a group to invite"
msgstr "æœç´¢è¦é‚€è¯·çš„群组"
@@ -20503,10 +20782,10 @@ msgid "InviteMembersModal|To assign issues to a new team member, you need a proj
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 ""
+msgstr "è¦èŽ·å¾—更多æˆå‘˜ï¼Œæ­¤å‘½å空间的所有者å¯ä»¥ %{trialLinkStart}开始试用%{trialLinkEnd} 或 %{upgradeLinkStart}å‡çº§%{upgradeLinkEnd} 到付费计划。"
msgid "InviteMembersModal|You only have space for %{count} more %{members} in %{name}"
-msgstr ""
+msgstr "在 %{name},您åªæœ‰ %{count} 个更多的 %{members} 的空间"
msgid "InviteMembersModal|You're inviting a group to the %{strongStart}%{name}%{strongEnd} group."
msgstr "您正在邀请一个群组加入 %{strongStart}%{name}%{strongEnd} 群组。"
@@ -20521,7 +20800,7 @@ msgid "InviteMembersModal|You're inviting members to the %{strongStart}%{name}%{
msgstr "您正在邀请æˆå‘˜åŠ å…¥ %{strongStart}%{name}%{strongEnd} 项目。"
msgid "InviteMembersModal|You've reached your %{count} %{members} limit for %{name}"
-msgstr ""
+msgstr "您已达到 %{name} çš„ %{count} 个 %{members} é™åˆ¶"
msgid "InviteMembers|Invite a group"
msgstr "邀请群组"
@@ -20929,13 +21208,13 @@ msgid "Iterations"
msgstr "迭代"
msgid "Iterations|Add a duration, and number of future iterations in order to convert this cadence to automatic scheduling."
-msgstr ""
+msgstr "添加æŒç»­æ—¶é—´å’Œæœªæ¥è¿­ä»£æ¬¡æ•°ï¼Œå°†è¿™ä¸ªå‘¨æœŸè½¬æ¢ä¸ºè‡ªåŠ¨è®¡åˆ’。"
msgid "Iterations|Add iteration"
msgstr "添加迭代"
msgid "Iterations|All"
-msgstr ""
+msgstr "所有"
msgid "Iterations|Cadence configuration is invalid."
msgstr "周期é…置无效。"
@@ -20943,12 +21222,18 @@ msgstr "周期é…置无效。"
msgid "Iterations|Cadence name"
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 "删除周期"
@@ -20958,7 +21243,13 @@ msgstr "删除迭代周期?"
msgid "Iterations|Delete iteration?"
msgstr "删除迭代?"
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
+msgstr "已完æˆ"
+
+msgid "Iterations|Due date"
msgstr ""
msgid "Iterations|Duration"
@@ -20983,13 +21274,13 @@ 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 ""
+msgstr "迭代是在一段时间内跟踪议题的一ç§æ–¹æ³•ï¼Œä½¿å°ç»„也能够跟踪速度和波动指标。"
msgid "Iterations|Iterations can no longer be scheduled manually. Convert all cadences to automatic scheduling to keep your iterations working as expected."
-msgstr ""
+msgstr "无法å†æ‰‹åŠ¨è®¡åˆ’迭代。将所有周期转æ¢ä¸ºè‡ªåŠ¨è®¡åˆ’æ¥ä¿æŒæ‚¨çš„迭代工作正常。"
msgid "Iterations|Learn more about automatic scheduling"
-msgstr ""
+msgstr "了解更多关于自动计划的信æ¯"
msgid "Iterations|Move incomplete issues to the next iteration"
msgstr "将未完æˆçš„议题移至下一次迭代"
@@ -21007,7 +21298,7 @@ msgid "Iterations|No iteration cadences to show."
msgstr "没有è¦æ˜¾ç¤ºçš„迭代周期。"
msgid "Iterations|No iterations found"
-msgstr ""
+msgstr "未找到迭代"
msgid "Iterations|No iterations in cadence."
msgstr "周期中没有迭代。"
@@ -21019,16 +21310,16 @@ msgid "Iterations|Number of future iterations you would like to have scheduled"
msgstr "您希望安排的未æ¥è¿­ä»£æ¬¡æ•°"
msgid "Iterations|Open"
-msgstr ""
+msgstr "开放"
msgid "Iterations|Requires update"
-msgstr ""
+msgstr "需è¦æ›´æ–°"
msgid "Iterations|Roll over issues"
msgstr "滚动议题"
msgid "Iterations|Save changes"
-msgstr ""
+msgstr "ä¿å­˜ä¿®æ”¹"
msgid "Iterations|Select duration"
msgstr "选择æŒç»­æ—¶é—´"
@@ -21040,7 +21331,7 @@ msgid "Iterations|Select start date"
msgstr "选择开始日期"
msgid "Iterations|Some of your cadences need to be updated"
-msgstr ""
+msgstr "您的一些周期需è¦æ›´æ–°"
msgid "Iterations|Start date"
msgstr "开始日期"
@@ -21055,7 +21346,7 @@ msgid "Iterations|The start date of your first iteration"
msgstr "第一次迭代的开始日期"
msgid "Iterations|This cadence requires an update"
-msgstr ""
+msgstr "此周期需è¦æ›´æ–°"
msgid "Iterations|This will delete the cadence as well as all of the iterations within it."
msgstr "这将删除周期以åŠå…¶ä¸­çš„所有迭代。"
@@ -21084,9 +21375,6 @@ msgstr "日期ä¸èƒ½ä¸Žæ­¤è¿­ä»£å‘¨æœŸå†…的其他现有迭代é‡å "
msgid "Iteration|cannot be more than 500 years in the future"
msgstr "ä¸èƒ½è¶…过未æ¥çš„500å¹´"
-msgid "I’m joining my team who’s already on GitLab"
-msgstr "我è¦åŠ å…¥æˆ‘å·²ç»åœ¨ GitLab 上的团队"
-
msgid "Jaeger URL"
msgstr "Jaeger 地å€"
@@ -21192,8 +21480,8 @@ msgstr "Jira 实例的基础 URL。"
msgid "JiraService|Define the type of Jira issue to create from a vulnerability."
msgstr "定义è¦ä»Žæ¼æ´žåˆ›å»ºçš„ Jira 议题的类型。"
-msgid "JiraService|Displaying Jira issues while leaving GitLab issues also enabled might be confusing. Consider %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
-msgstr "在å¯ç”¨ GitLab 议题的åŒæ—¶æ˜¾ç¤º Jira 议题å¯èƒ½ä¼šä»¤äººå›°æƒ‘。如果它们ä¸ä¼šè¢«ä½¿ç”¨ï¼Œè¯·è€ƒè™‘ %{linkStart}ç¦ç”¨ GitLab 议题%{linkEnd}。"
+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 "å¯ç”¨ä»Žæ¼æ´žåˆ›å»º Jira 议题"
@@ -21243,9 +21531,6 @@ msgstr "Jira 评论是在æ交中引用议题时创建的。"
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr "Jira 评论是在åˆå¹¶è¯·æ±‚中引用议题时创建的。"
-msgid "JiraService|Jira issue type"
-msgstr "Jira 议题类型"
-
msgid "JiraService|Jira issues"
msgstr "Jira议题"
@@ -21327,6 +21612,9 @@ msgstr "在ä¸ç¦»å¼€ GitLab çš„æƒ…å†µä¸‹å¤„ç† Jira 议题。添加一个 Jira è
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 "在ä¸ç¦»å¼€ GitLab çš„æƒ…å†µä¸‹å¤„ç† Jira 议题。添加 Jira èœå•ï¼Œè®¿é—® Jira 议题的åªè¯»åˆ—表。%{jira_issues_link_start}了解更多。%{link_end}"
+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 "您必须在å¯ç”¨æ­¤é›†æˆä¹‹å‰é…ç½® Jira。%{jira_doc_link_start}了解更多。%{link_end}"
@@ -21381,6 +21669,9 @@ 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 "早于é…置时间的作业被视为已过期并已存档。无法å†é‡è¯•å­˜æ¡£çš„作业。留空以从ä¸è‡ªåŠ¨å­˜æ¡£ä½œä¸šã€‚默认å•ä½æ˜¯å¤©ï¼Œä½†æ‚¨å¯ä»¥ä½¿ç”¨å…¶ä»–å•ä½ï¼Œä¾‹å¦‚ %{code_open}15 days%{code_close}, %{code_open}1 month%{code_close}, %{code_open}2 years%{code_close}。最å°å€¼ä¸º 1 天。"
+msgid "Jobs|All"
+msgstr ""
+
msgid "Jobs|Are you sure you want to proceed?"
msgstr "确定è¦ç»§ç»­å—?"
@@ -21391,6 +21682,9 @@ msgid "Jobs|Create CI/CD configuration file"
msgstr "创建CI/CDé…置文件"
msgid "Jobs|Filter jobs"
+msgstr "筛选作业"
+
+msgid "Jobs|Finished"
msgstr ""
msgid "Jobs|Job is stuck. Check runners."
@@ -21403,10 +21697,10 @@ 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 ""
+msgstr "对任务过滤åŽçš„æœç´¢åŠŸèƒ½ï¼Œå½“å‰ä¸æ”¯æŒæœç´¢åŽŸå§‹æ–‡æœ¬ã€‚请使用å¯ç”¨çš„æœç´¢ä»¤ç‰Œã€‚"
msgid "Jobs|Status"
-msgstr ""
+msgstr "状æ€"
msgid "Jobs|Use jobs to automate your tasks"
msgstr "使用作业自动执行任务"
@@ -21436,13 +21730,13 @@ msgid "Job|Cancel"
msgstr "å–消"
msgid "Job|Canceled"
-msgstr ""
+msgstr "å·²å–消"
msgid "Job|Complete Raw"
msgstr "完整原始日志"
msgid "Job|Created"
-msgstr ""
+msgstr "已创建"
msgid "Job|Download"
msgstr "下载"
@@ -21451,7 +21745,7 @@ msgid "Job|Erase job log and artifacts"
msgstr "擦除作业日志和产物"
msgid "Job|Failed"
-msgstr ""
+msgstr "失败"
msgid "Job|Finished at"
msgstr "完æˆäºŽ"
@@ -21469,25 +21763,25 @@ msgid "Job|Keep"
msgstr "ä¿æŒ"
msgid "Job|Manual"
-msgstr ""
+msgstr "手动"
msgid "Job|Passed"
-msgstr ""
+msgstr "已通过"
msgid "Job|Pending"
-msgstr ""
+msgstr "等待中"
msgid "Job|Preparing"
-msgstr ""
+msgstr "正在准备"
msgid "Job|Retry"
msgstr "é‡è¯•"
msgid "Job|Running"
-msgstr ""
+msgstr "正在è¿è¡Œ"
msgid "Job|Scheduled"
-msgstr ""
+msgstr "已计划"
msgid "Job|Scroll to bottom"
msgstr "滚动到底部"
@@ -21499,7 +21793,7 @@ msgid "Job|Show complete raw"
msgstr "显示完整æº"
msgid "Job|Skipped"
-msgstr ""
+msgstr "已跳过"
msgid "Job|Status"
msgstr "状æ€"
@@ -21526,7 +21820,7 @@ msgid "Job|This job is stuck because you don't have any active runners that can
msgstr "此作业已阻塞,因为没有å¯ç”¨çš„Runner处ç†æ­¤é¡¹ä½œä¸šã€‚"
msgid "Job|Waiting for resource"
-msgstr ""
+msgstr "等待资æº"
msgid "Job|allowed to fail"
msgstr "å…许失败"
@@ -21931,6 +22225,9 @@ msgstr "æµåŠ¨"
msgid "Lead Time"
msgstr "交付时间"
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr "å‰ç½®æ—¶é—´"
@@ -22070,7 +22367,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 "使用 CI/CD è¿è¡Œå®‰å…¨æ‰«æ"
@@ -22111,6 +22408,9 @@ msgstr "使用您的新 GitLab 工作æµç¨‹éƒ¨ç½²æ‚¨çš„应用程åºã€ç›‘控其è
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr "您的团队正在æˆé•¿ï¼æ‚¨å·²æˆåŠŸåœ°é‚€è¯·äº†æ–°çš„团队æˆå‘˜åˆ° %{projectName} 项目。"
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr "正在创建您的入门体验..."
@@ -22120,6 +22420,9 @@ msgstr "好的,让我们去å§"
msgid "LearnGitlab|Trial only"
msgstr "ä»…é™è¯•ç”¨"
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr "退出"
@@ -22144,6 +22447,9 @@ msgstr "建议å¯ç”¨æ­¤è®¾ç½®ã€‚"
msgid "Legacy burndown chart"
msgstr "旧版燃尽图"
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr "收起详情"
@@ -22160,7 +22466,7 @@ msgid "License Compliance"
msgstr "许å¯è¯åˆè§„"
msgid "License Compliance| Used by"
-msgstr ""
+msgstr "使用者"
msgid "License compliance"
msgstr "许å¯è¯åˆè§„"
@@ -22181,7 +22487,7 @@ msgid "LicenseCompliance|%{docLinkStart}License Approvals%{docLinkEnd} are inact
msgstr "%{docLinkStart}许å¯è¯æ‰¹å‡†%{docLinkEnd}无效"
msgid "LicenseCompliance|Acceptable for use in this project"
-msgstr ""
+msgstr "å¯æŽ¥å—用于此项目"
msgid "LicenseCompliance|Acceptable license to be used in the project"
msgstr "项目中å¯æŽ¥å—的许å¯è¯"
@@ -22236,7 +22542,7 @@ msgstr[0] "许å¯è¯åˆè§„检测到%d个新的许å¯è¯åŠç­–ç•¥è¿å。需è¦æ
msgid "LicenseCompliance|License Compliance detected %d removed license"
msgid_plural "LicenseCompliance|License Compliance detected %d removed licenses"
-msgstr[0] ""
+msgstr[0] "许å¯è¯åˆè§„检测到 %d 个删除的许å¯è¯"
msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only"
msgstr "许å¯è¯åˆè§„仅在æºåˆ†æ”¯æœªæ£€æµ‹åˆ°è®¸å¯è¯"
@@ -22248,10 +22554,10 @@ msgid "LicenseCompliance|License name"
msgstr "许å¯è¯å称"
msgid "LicenseCompliance|No policy matches this license"
-msgstr ""
+msgstr "没有匹é…此许å¯è¯çš„ç­–ç•¥"
msgid "LicenseCompliance|Out-of-compliance with the project's policies and should be removed"
-msgstr ""
+msgstr "超出éµå®ˆé¡¹ç›®ç­–略的æƒé™ï¼Œåº”删除"
msgid "LicenseCompliance|Remove license"
msgstr "删除许å¯è¯"
@@ -22269,10 +22575,10 @@ msgid "LicenseCompliance|This license already exists in this project."
msgstr "此许å¯è¯å·²ç»å­˜åœ¨äºŽè¯¥é¡¹ç›®ä¸­ã€‚"
msgid "LicenseCompliance|Uncategorized"
-msgstr ""
+msgstr "未分类"
msgid "LicenseCompliance|Update approvals"
-msgstr ""
+msgstr "更新批准"
msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project."
msgstr "您å³å°†ä»Žå½“å‰é¡¹ç›®ä¸­åˆ é™¤è®¸å¯è¯%{name}。"
@@ -22313,11 +22619,8 @@ msgstr "组件"
msgid "Licenses|Detected in Project"
msgstr "在项目中检测到"
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr "检测到的ä¸ç¬¦åˆé¡¹ç›®æŒ‡å®šæ”¿ç­–的许å¯è¯"
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
-msgstr "显示项目中检测到的许å¯è¯ï¼ŒåŸºäºŽ%{linkStart}最新的æˆåŠŸæ‰«æ%{linkEnd}"
+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 "将您的许å¯è¯æ–‡ä»¶æ‹–动到此处,或 %{linkStart}点击上传%{linkEnd}"
@@ -22364,24 +22667,15 @@ msgstr "查看您项目的许å¯è¯è¯¦ç»†ä¿¡æ¯"
msgid "Limit display of time tracking units to hours."
msgstr "é™åˆ¶æ—¶é—´è·Ÿè¸ªå•ä½æ˜¾ç¤ºåˆ°å°æ—¶ã€‚"
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr "在全局ã€ç¾¤ç»„和项目级别é™åˆ¶é¡¹ç›®å¤§å°ã€‚ %{link_start}了解更多%{link_end}。"
-
msgid "Limit sign in from multiple IP addresses"
msgstr "é™åˆ¶ä»Žå¤šä¸ªIP地å€ç™»å½•"
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 "é™åˆ¶ç”¨æˆ·æ¯åˆ†é’Ÿå¯ä»¥é€šè¿‡ Web å’Œ API 请求创建的议题和å²è¯—çš„æ•°é‡ã€‚"
-msgid "Limit the number of namespaces and projects that can be indexed."
-msgstr "é™åˆ¶å¯ä»¥ç´¢å¼•çš„命å空间和项目的数é‡ã€‚"
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr "é™åˆ¶å­˜å‚¨åœ¨Redis中的Sidekiq作业的大å°ã€‚"
@@ -22568,9 +22862,6 @@ msgstr "被%{fileLockUserName}é”定"
msgid "Locked the discussion."
msgstr "é”定讨论."
-msgid "Locked to current projects"
-msgstr "å·²é”定到目å‰çš„项目"
-
msgid "Locks give the ability to lock specific file or folder."
msgstr "加é”å¯ä»¥é”定特定的文件或文件夹。"
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr "存在低å±æ¼æ´ž"
@@ -22737,7 +23031,7 @@ msgid "Manage labels"
msgstr "管ç†æ ‡è®°"
msgid "Manage members"
-msgstr ""
+msgstr "管ç†æˆå‘˜"
msgid "Manage milestones"
msgstr "管ç†é‡Œç¨‹ç¢‘"
@@ -22773,7 +23067,7 @@ msgid "Manual"
msgstr "手动"
msgid "Manual iteration cadences are deprecated. Only automatic iteration cadences are allowed."
-msgstr ""
+msgstr "手动迭代周期被废弃。åªå…许自动迭代。"
msgid "ManualOrdering|Couldn't save the order of the issues"
msgstr "无法ä¿å­˜è®®é¢˜çš„顺åº"
@@ -22928,6 +23222,9 @@ msgstr "通过在 Mattermost 中输入斜æ å‘½ä»¤ï¼Œä½¿ç”¨æ­¤æœåŠ¡æ‰§è¡Œé¡¹ç›®
msgid "Max 100,000 events"
msgstr "最多100,000个事件"
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr "æ¯ä¸ªç”¨æˆ·æ¯ä¸ªæ—¶æœŸçš„最大ç»è¿‡èº«ä»½éªŒè¯çš„ Git LFS 请求"
@@ -22967,6 +23264,9 @@ msgstr "最大 Terraform 模å—包文件大å°ï¼ˆä»¥å­—节为å•ä½ï¼‰"
msgid "Maximum Users"
msgstr "最大用户数"
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr "个人访问令牌的最长有效期(天)"
@@ -23024,8 +23324,8 @@ msgstr "索引的最大文件大å°(KiB)"
msgid "Maximum file size is 1 MB. Image size must be 32 x 32 pixels. Allowed image formats are %{favicon_extension_whitelist}."
msgstr "最大文件大å°ä¸º 1 MB。图片大å°å¿…须为 32 x 32 åƒç´ ã€‚å…许的图åƒæ ¼å¼ä¸º %{favicon_extension_whitelist}。"
-msgid "Maximum file size is 1MB. Pages are optimized for a 28px tall header logo"
-msgstr "最大文件大å°ä¸º 1MB,页é¢é’ˆå¯¹ 28 åƒç´ é«˜çš„标题LOGO进行了优化"
+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 "最大文件大å°ä¸º 1MB,页é¢é’ˆå¯¹ 640x360 åƒç´ çš„logo进行了优化。"
@@ -23281,6 +23581,9 @@ msgstr "æˆåŠŸåˆ é™¤è¿‡æœŸæ—¥æœŸã€‚"
msgid "Members|Expiration date updated successfully."
msgstr "æˆåŠŸæ›´æ–°è¿‡æœŸæ—¥æœŸã€‚"
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr "筛选æˆå‘˜"
@@ -23357,7 +23660,7 @@ msgid "Merge automatically (%{strategy})"
msgstr "自动åˆå¹¶(%{strategy})"
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 "åˆå¹¶è¢«é˜»æ­¢ï¼šåˆå¹¶è¯·æ±‚必须标记为就绪。它ä»ç„¶è¢«æ ‡è®°ä¸ºè‰ç¨¿ã€‚"
@@ -23401,6 +23704,9 @@ msgstr "åˆå¹¶è¯·æ±‚"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr "åˆå¹¶è¯·æ±‚%{mr_link}已被%{mr_author}审核"
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr "åˆå¹¶è¯·æ±‚分æž"
@@ -23647,6 +23953,18 @@ 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 "指标"
@@ -23657,16 +23975,16 @@ msgid "Metrics - Prometheus"
msgstr "指标 - Prometheus"
msgid "Metrics Dashboard"
-msgstr "指标仪表æ¿"
+msgstr "指标仪表盘"
msgid "Metrics Dashboard YAML definition"
-msgstr "指标仪表æ¿YAML定义"
+msgstr "指标仪表盘YAML定义"
msgid "Metrics Dashboard YAML definition is invalid:"
-msgstr "指标仪表æ¿YAML定义无效:"
+msgstr "指标仪表盘YAML定义无效:"
msgid "Metrics Dashboard YAML definition is valid."
-msgstr "指标仪表æ¿YAML定义有效。"
+msgstr "指标仪表盘YAML定义有效。"
msgid "Metrics and profiling"
msgstr "指标与分æž"
@@ -24073,7 +24391,7 @@ msgid "MilestoneSidebar|Open:"
msgstr "打开:"
msgid "MilestoneSidebar|Reference:"
-msgstr "å‚考:"
+msgstr "引用链接:"
msgid "MilestoneSidebar|Start date"
msgstr "起始日期"
@@ -24103,7 +24421,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 "删除里程碑"
@@ -24124,7 +24442,7 @@ 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 ""
+msgstr "将议题与åˆå¹¶è¯·æ±‚组织到一个有å‡èšåŠ›çš„组中,并设置å¯é€‰çš„起始日期和到期日期。%{learn_more_link}"
msgid "Milestones|Project Milestone"
msgstr "项目里程碑"
@@ -24145,10 +24463,10 @@ msgid "Milestones|Reopen Milestone"
msgstr "é‡å¯é‡Œç¨‹ç¢‘"
msgid "Milestones|There are no closed milestones"
-msgstr ""
+msgstr "没有已关闭的里程碑"
msgid "Milestones|There are no open milestones"
-msgstr ""
+msgstr "没有开放的里程碑"
msgid "Milestones|This action cannot be reversed."
msgstr "该æ“作无法撤销。"
@@ -24157,14 +24475,14 @@ 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 "Minimum interval in days"
-msgstr "最å°é—´éš”(天)"
-
msgid "Minutes"
msgstr "分钟"
@@ -24376,23 +24694,20 @@ msgid "MrDeploymentActions|Stop environment"
msgstr "终止环境"
msgid "MrList|Assigned to %{name}"
-msgstr ""
+msgstr "指派给 %{name}"
msgid "MrList|Attention requested from assignee %{name}"
-msgstr ""
+msgstr "请求指派人 %{name} 的关注"
msgid "MrList|Attention requested from reviewer %{name}"
-msgstr ""
+msgstr "请求审核者 %{name} 的关注"
msgid "MrList|Review requested from %{name}"
-msgstr ""
+msgstr "审核æ¥è‡ª %{name} 的请求"
msgid "Multi-project"
msgstr "多项目"
-msgid "Multi-project Runners cannot be removed"
-msgstr "多项目Runner无法删除"
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr "此项目ä¸æ”¯æŒå¤šä¸ªHTTP集æˆ"
@@ -24414,12 +24729,6 @@ msgstr "找到多个上传器: %{uploader_types}"
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr "应用于轮询间隔的乘数。支æŒå进制值。默认为 1。"
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr "必须匹é…%{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}中的%{codeStart}external_url%{codeEnd}。"
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr "必须与 %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd} 中的 %{codeStart}geo_node_name%{codeEnd} 匹é…。%{linkStart}了解更多%{linkEnd}"
-
msgid "My awesome group"
msgstr "我最棒的团队"
@@ -24490,23 +24799,23 @@ msgstr "您已ç»è¾¾åˆ°äº†ä¸€ä¸ªæˆ–多个项目的 %{free_size_limit} çš„å…è´¹å
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 "推é€åˆ°æ‚¨çš„仓库,创建æµæ°´çº¿ï¼Œåˆ›å»ºè®®é¢˜æˆ–添加评论。如需å‡å°‘存储使用,请删除未使用的仓库,产物,wiki,议题和æµæ°´çº¿ã€‚"
-msgid "NamespaceStorage|%{name_with_link} namespace has %{percent} or less namespace storage space remaining."
-msgstr "%{name_with_link} 命å空间剩余 %{percent} 或更少的命å空间存储空间。"
+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 "%{name_with_link} 命å空间已超出其命å空间存储é™åˆ¶ã€‚"
-msgid "NamespaceStorage|%{name}(%{url}) namespace has %{percent} or less namespace storage space remaining."
-msgstr "%{name}(%{url}) 命å空间剩余 %{percent} 或更少命å空间存储空间。"
+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 "%{name}(%{url}) 命å空间已超出其命å空间存储é™åˆ¶ã€‚"
-msgid "NamespaceStorage|Action required: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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 ""
+msgstr "需è¦é‡‡å–措施:%{namespace_name} 的存储空间已超出"
msgid "NamespaceStorage|Buy more storage"
msgstr "购买更多存储"
@@ -24596,7 +24905,7 @@ msgid "Need your attention"
msgstr "需è¦æ‚¨çš„注æ„"
msgid "Needs"
-msgstr "Needs"
+msgstr "ä¾èµ–关系图"
msgid "Needs attention"
msgstr "需è¦å…³æ³¨"
@@ -24607,75 +24916,9 @@ msgstr "网络"
msgid "Network:"
msgstr "网络:"
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}如果%{ifLabelEnd}%{ruleType}%{isLabelStart}为%{isLabelEnd}%{ruleDirection}%{ruleSelector}%{directionLabelStart}且由%{directionLabelEnd}%{rule}%{portsLabelStart}在%{portsLabelEnd} %{ports}传入。"
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr "%{ifLabelStart}如果%{ifLabelEnd}%{ruleType}%{isLabelStart}为%{isLabelEnd}%{ruleDirection}%{ruleSelector}%{directionLabelStart}且å‘%{directionLabelEnd}%{rule}%{portsLabelStart}在%{portsLabelEnd} %{ports}外å‘。"
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr "%{labelStart}å’Œ%{labelEnd} %{spanStart}å‘é€è­¦æŠ¥åˆ° GitLab。%{spanEnd}"
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr "%{labelStart}然åŽ%{labelEnd}%{action}%{spanStart}网络æµé‡ã€‚%{spanEnd}"
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr "已选择%{number}项"
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr "%{strongOpen}所有%{strongClose}pod"
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr "%{strongOpen}任何%{strongClose}端å£"
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ".yaml模å¼"
-
-msgid "NetworkPolicies|Add alert"
-msgstr "添加警报"
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr "警报是为了有选择地用于少数å¯èƒ½æ¶‰åŠå¹¶éœ€è¦äººå·¥å®¡æŸ¥çš„事件。ä¸åº”将警报用作 SIEM 或记录工具的替代å“。为了ä¿æŒGitLab与Kubernetes一体化的稳定性,å¯èƒ½ä¼šæ”¾å¼ƒå¤§é‡è­¦æŠ¥ã€‚"
-
-msgid "NetworkPolicies|All selected"
-msgstr "全选"
-
-msgid "NetworkPolicies|Allow"
-msgstr "å…许"
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr "å…许所有入站æµé‡ä»Ž%{ports}端å£çš„%{ruleSelector}到%{selector}"
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr "å…许所有出站æµé‡ä»Ž%{ports}端å£çš„%{selector}到%{ruleSelector}"
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr "您确定è¦åˆ é™¤æ­¤ç­–ç•¥å—?此æ“作ä¸èƒ½æ’¤æ¶ˆã€‚"
-
-msgid "NetworkPolicies|Create policy"
-msgstr "创建策略"
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr "定义此策略的ä½ç½®ï¼Œæ¡ä»¶å’Œæ“作。"
-
-msgid "NetworkPolicies|Delete policy"
-msgstr "删除策略"
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr "删除策略: %{policy}"
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr "æ‹’ç»æ‰€æœ‰æµé‡"
-
-msgid "NetworkPolicies|Edit policy"
-msgstr "编辑策略"
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr "环境没有部署平å°"
-msgid "NetworkPolicies|IP/subnet"
-msgstr "IP/å­ç½‘"
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr "无效或空策略"
@@ -24685,87 +24928,12 @@ msgstr "无效或ä¸æ”¯æŒçš„策略类型"
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr "Kubernetes错误: %{error}"
-msgid "NetworkPolicies|Network"
-msgstr "网络"
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr "网络策略å¯ä»¥ç”¨äºŽé™åˆ¶é›†ç¾¤å†…容器之间的网络æµé‡ã€‚"
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr "环境加载æˆåŠŸåŽå¯ä»¥åˆ›å»ºç½‘络策略。"
-
-msgid "NetworkPolicies|Network traffic"
-msgstr "网络æµé‡"
-
-msgid "NetworkPolicies|None selected"
-msgstr "未选择"
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr "å·²æˆåŠŸæ›´æ”¹ç­–ç•¥%{policyName}"
-msgid "NetworkPolicies|Policy definition"
-msgstr "策略定义"
-
-msgid "NetworkPolicies|Rule mode"
-msgstr "规则模å¼"
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr "规则模å¼æ— æ³•ç”¨äºŽæ­¤ç­–略。在æŸäº›æƒ…况下,我们无法将YAML文件解æžå›žåˆ°è§„则编辑器中。"
-
-msgid "NetworkPolicies|Save changes"
-msgstr "ä¿å­˜æ›´æ”¹"
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr "出现错误,未能更新策略"
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr "出现错误,无法获å–ç­–ç•¥"
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr "è¦å¯ç”¨è­¦æŠ¥ï¼Œè¯·å…ˆ%{installLinkStart}安装代ç†%{installLinkEnd}。"
-
-msgid "NetworkPolicies|all DNS names"
-msgstr "所有DNS域å"
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr "所有IP地å€"
-
-msgid "NetworkPolicies|any pod"
-msgstr "任何pod"
-
-msgid "NetworkPolicies|any port"
-msgstr "ä»»æ„端å£"
-
-msgid "NetworkPolicies|domain name"
-msgstr "域å"
-
-msgid "NetworkPolicies|entity"
-msgstr "实体"
-
-msgid "NetworkPolicies|inbound to"
-msgstr "传入到"
-
-msgid "NetworkPolicies|nowhere"
-msgstr "æ— ä½ç½®"
-
-msgid "NetworkPolicies|outbound from"
-msgstr "外å‘自"
-
-msgid "NetworkPolicies|pod with labels"
-msgstr "带有标签的pod"
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr "pods %{pods}"
-
-msgid "NetworkPolicies|pods with labels"
-msgstr "带有标签的pod"
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr "ç«¯å£ %{ports}"
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr "端å£/åè®®"
-
msgid "NetworkPolicy|Policy"
msgstr "ç­–ç•¥"
@@ -24873,7 +25041,7 @@ msgid "New discussion"
msgstr "新建讨论"
msgid "New email address added"
-msgstr ""
+msgstr "已添加新电å­é‚®ä»¶åœ°å€"
msgid "New environment"
msgstr "新环境"
@@ -25046,9 +25214,6 @@ msgstr "没有里程碑"
msgid "No Scopes"
msgstr "无范围"
-msgid "No Tag"
-msgstr "无标签"
-
msgid "No active admin user found"
msgstr "没有找到活动的管ç†å‘˜ç”¨æˆ·"
@@ -25256,9 +25421,6 @@ msgstr "无法预览此类型文件"
msgid "No prioritized labels with such name or description"
msgstr "没有此å称或æ述的优先标记"
-msgid "No profiles found"
-msgstr "未找到é…置文件"
-
msgid "No project subscribes to the pipelines in this project."
msgstr "没有项目订阅此项目中的æµæ°´çº¿ã€‚"
@@ -25440,6 +25602,9 @@ msgstr "注æ„:当å‰æ´¾ç”Ÿï¼ˆfork)将ä¿æŒå…¶å¯è§ç­‰çº§ã€‚"
msgid "NoteForm|Note"
msgstr "注æ„"
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr "Notes 速率é™åˆ¶"
@@ -25468,7 +25633,7 @@ msgid "Notes|This comment has changed since you started editing, please review t
msgstr "自您开始编辑以æ¥ï¼Œæ­¤è¯„论已更改,请查看 %{open_link}更新过的评论%{close_link} 以确ä¿ä¿¡æ¯ä¸ä¼šä¸¢å¤±"
msgid "Notes|This comment is confidential and only visible to group members"
-msgstr ""
+msgstr "此评论是ç§å¯†çš„,åªå¯¹ç¾¤ç»„æˆå‘˜å¯è§"
msgid "Notes|This comment is confidential and only visible to project members"
msgstr "此评论是ä¿å¯†çš„,åªå¯¹é¡¹ç›®æˆå‘˜å¯è§"
@@ -25476,9 +25641,6 @@ 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} 。è¦æ·»åŠ è¯„论,请切æ¢åˆ°ä»¥ä¸‹é€‰é¡¹ä¹‹ä¸€ã€‚"
-msgid "Nothing found…"
-msgstr "未找到任何信æ¯â€¦"
-
msgid "Nothing to preview."
msgstr "没有å¯é¢„览的内容。"
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "11月"
@@ -25654,9 +25852,6 @@ msgstr "碎片数é‡"
msgid "OK"
msgstr "确定"
-msgid "Object Storage replication"
-msgstr "对象存储å¤åˆ¶"
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr "对象在æœåŠ¡å™¨ä¸Šä¸å­˜åœ¨, 或者您没有访问它的æƒé™"
@@ -25699,6 +25894,9 @@ 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 "使用此计划的任何å‡çº§è§„则也将被删除。"
@@ -25855,9 +26053,18 @@ msgstr "您的日程已æˆåŠŸåˆ›å»ºã€‚è¦å°†å•ä¸ªç”¨æˆ·æ·»åŠ åˆ°æ­¤è®¡åˆ’,请
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
msgstr "%{learnMoreLinkStart}了解有关按需扫æ的更多信æ¯%{learnMoreLinkEnd}。"
+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 "无法删除ä¿å­˜çš„扫æ。请刷新页é¢æˆ–ç¨åŽå†è¯•ã€‚"
@@ -25879,24 +26086,39 @@ 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 on-demand DAST scan"
msgstr "编辑按需扫æDAST"
+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 "例如:测试SQL注入的登录页é¢"
-msgid "OnDemandScans|Manage DAST scans"
-msgstr "ç®¡ç† DAST 扫æ"
-
msgid "OnDemandScans|Manage scanner profiles"
msgstr "管ç†æ‰«æ工具é…置文件"
@@ -25909,9 +26131,12 @@ msgstr "我的æ¯æ—¥æ‰«æ"
msgid "OnDemandScans|New on-demand DAST scan"
msgstr "新建按需扫æDAST"
-msgid "OnDemandScans|New scan"
+msgid "OnDemandScans|New on-demand scan"
msgstr ""
+msgid "OnDemandScans|New scan"
+msgstr "新建扫æ"
+
msgid "OnDemandScans|No profile yet. In order to create a new scan, you need to have at least one completed scanner profile."
msgstr "å°šæ— é…置文件。如需创建新扫æ,需è¦è‡³å°‘有一个完整的扫æ工具é…置文件。"
@@ -25942,21 +26167,27 @@ 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|Schedule scan"
-msgstr "计划扫æ"
-
msgid "OnDemandScans|Select one of the existing profiles"
msgstr "选择一个现有的é…置文件"
@@ -25987,6 +26218,9 @@ msgstr "没有ä¿å­˜çš„扫æ。"
msgid "OnDemandScans|There are no scheduled scans."
msgstr "没有计划中的扫æ。"
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr "使用现有的站点é…ç½®"
@@ -25999,6 +26233,9 @@ 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 "仓库导入åŽï¼Œå¯ä»¥é€šè¿‡SSH进行镜åƒã€‚点击%{link_start}此处%{link_end}了解更多."
@@ -26060,9 +26297,6 @@ msgstr "åªå…许任何人在您打算被任何人使用的 GitLab 实例上注å
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr "仅在å¯ç”¨è¿œç¨‹å­˜å‚¨æ—¶æœ‰æ•ˆã€‚设置为 0 表示没有大å°é™åˆ¶ã€‚"
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr "åªæœ‰åœ¨å®‰è£…æ’件ã€å¯ç”¨ç´¢å¼•å’Œé‡æ–°åˆ›å»ºç´¢å¼•åŽæ‰å¯ç”¨æœç´¢ã€‚"
-
msgid "Only include features new to your current subscription tier."
msgstr "仅包括您当å‰è®¢é˜…级别的新功能。"
@@ -26244,7 +26478,7 @@ 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 "å…许æ¥è‡ªweb é’©å­å’ŒæœåŠ¡å¯¹æœ¬åœ°ç½‘络的请求。"
+msgstr "å…许æ¥è‡ª web hooks å’ŒæœåŠ¡å¯¹æœ¬åœ°ç½‘络的请求"
msgid "OutboundRequests|Enforce DNS rebinding attack protection"
msgstr "强制执行 DNS é‡æ–°ç»‘定攻击ä¿æŠ¤"
@@ -26507,6 +26741,12 @@ msgstr "删除软件包版本"
msgid "PackageRegistry|Delete package"
msgstr "删除软件包"
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr "加载软件包数æ®å¤±è´¥"
@@ -26604,9 +26844,6 @@ msgstr "Pip命令"
msgid "PackageRegistry|Project-level"
msgstr "项目级别"
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr "å‘布和分享å„ç§å¸¸è§çš„软件包管ç†å·¥å…·æ”¯æŒçš„软件包。 %{docLinkStart}更多信æ¯%{docLinkEnd}"
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr "如果软件包å称或版本符åˆæ­¤æ­£åˆ™è¡¨è¾¾å¼ï¼Œåˆ™å‘布软件包。"
@@ -26679,6 +26916,12 @@ 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 "这个Nuget包没有ä¾èµ–项目。"
@@ -26802,15 +27045,15 @@ msgstr "å‚æ•°:embed_json解æžé”™è¯¯ã€‚%{message}"
msgid "Part of merge request changes"
msgstr "包å«äºŽåˆå¹¶è¯·æ±‚å˜æ›´ä¸­"
+msgid "Partial import"
+msgstr ""
+
msgid "Participants"
msgstr "å‚与者"
msgid "Pass job variables"
msgstr "传递作业å˜é‡"
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
-msgstr "传递标头 %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} æ¥ä»‹ç»è¯·æ±‚"
-
msgid "Passed"
msgstr "通过"
@@ -26895,8 +27138,8 @@ msgstr "使用速率é™åˆ¶ä¿æŠ¤çš„路径"
msgid "Pause"
msgstr "æš‚åœ"
-msgid "Pause Elasticsearch indexing"
-msgstr "æš‚åœElasticsearch索引"
+msgid "Pause time (ms)"
+msgstr ""
msgid "Paused"
msgstr "已暂åœ"
@@ -26968,7 +27211,7 @@ msgid "PerformanceBar|External Http calls"
msgstr "外部 Http 调用"
msgid "PerformanceBar|First Contentful Paint"
-msgstr "第一次内容绘制"
+msgstr "首次内容绘制"
msgid "PerformanceBar|Flamegraph with mode:"
msgstr "ç«ç„°å›¾æ¨¡å¼ï¼š"
@@ -27064,7 +27307,7 @@ msgid "Phabricator Tasks"
msgstr "Phabricator任务"
msgid "Phone"
-msgstr ""
+msgstr "电è¯"
msgid "Pick a name"
msgstr "选择一个å称"
@@ -27081,9 +27324,6 @@ msgstr "æµæ°´çº¿%{label}"
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr "“%{dataTitle}â€çš„æµæ°´çº¿%{label}"
-msgid "Pipeline Editor"
-msgstr "æµæ°´çº¿ç¼–辑器"
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr "您确定è¦å°†æ–‡ä»¶é‡ç½®ä¸ºä¸Šæ¬¡æ交的版本å—?"
@@ -27153,6 +27393,12 @@ 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 "æµè§ˆ %{linkStart}CI/CD 示例和模æ¿%{linkEnd}"
@@ -27882,6 +28128,9 @@ 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 "请填写此字段。"
@@ -27921,9 +28170,6 @@ msgstr "请æä¾›è¦æ›´æ–°çš„属性"
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr "如果您有任何疑问,请è”系我们,我们将竭诚为您æœåŠ¡ã€‚"
-msgid "Please refer to %{docs_url}"
-msgstr "请å‚考%{docs_url}"
-
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 "请审核 %{project_link} çš„æ›´æ–°å‡çº§ç­–略。建议您è”系当å‰çš„ on-call å“åº”è€…ï¼Œä»¥ç¡®ä¿ on-call 覆盖的连续性。"
@@ -27981,6 +28227,9 @@ msgstr "请输入%{phrase_code}以继续或关闭此对è¯æ¡†ä»¥å–消。"
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr "请使用此表å•å‘管ç†å‘˜æŠ¥å‘Šåˆ›å»ºåžƒåœ¾è®®é¢˜ã€è¯„论或行为ä¸å½“的用户。"
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr "请ç¨ç­‰ç‰‡åˆ»ï¼Œæ­¤é¡µé¢åœ¨å°±ç»ªæ—¶ä¼šè‡ªåŠ¨åˆ·æ–°ã€‚"
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr "é…置日期和时间的显示方å¼ã€‚"
@@ -28074,6 +28329,12 @@ msgstr "自定义与第三方æœåŠ¡çš„集æˆã€‚"
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 "以24å°æ—¶æ ¼å¼æ˜¾ç¤ºæ—¶é—´"
@@ -28110,6 +28371,9 @@ msgstr "必须为%{min}到%{max}之间的数字"
msgid "Preferences|Navigation theme"
msgstr "导航主题"
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr "项目概览内容"
@@ -28209,9 +28473,6 @@ msgstr "差异中的上一个文件"
msgid "Previous unresolved discussion"
msgstr "上一次未解决的讨论"
-msgid "Primary"
-msgstr "主è¦"
-
msgid "Primary Action"
msgstr "主è¦æ“作"
@@ -28465,7 +28726,7 @@ msgid "Profiles|Enter your pronouns to let people know how to refer to you"
msgstr "输入您的代è¯ï¼Œè®©äººä»¬çŸ¥é“如何称呼您"
msgid "Profiles|Example: MacBook key"
-msgstr ""
+msgstr "例如:MacBook Key"
msgid "Profiles|Expiration date"
msgstr "到期日期"
@@ -28525,7 +28786,7 @@ msgid "Profiles|Key can still be used after expiration."
msgstr "密钥到期åŽä»å¯ä½¿ç”¨ã€‚"
msgid "Profiles|Key titles are publicly visible."
-msgstr ""
+msgstr "密钥标题是公开å¯è§çš„。"
msgid "Profiles|Key usable beyond expiration date."
msgstr "密钥在过期日期åŽä»å¯ä½¿ç”¨ã€‚"
@@ -28633,7 +28894,7 @@ msgid "Profiles|Time settings"
msgstr "时间设置"
msgid "Profiles|Title"
-msgstr ""
+msgstr "标题"
msgid "Profiles|Two-Factor Authentication"
msgstr "åŒé‡è®¤è¯"
@@ -28830,9 +29091,6 @@ msgstr "无法删除项目导出。"
msgid "Project export download requests"
msgstr "项目导出下载请求"
-msgid "Project export enabled"
-msgstr "å¯ç”¨é¡¹ç›®å¯¼å‡º"
-
msgid "Project export has been deleted."
msgstr "项目导出已被删除。"
@@ -29221,7 +29479,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. Note: The Package Registry is always visible when a project is public."
-msgstr ""
+msgstr "æ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å­˜å‚¨å®ƒçš„软件包。注æ„:当一个项目是公开时,软件包库总是å¯è§çš„。"
msgid "ProjectSettings|Everyone"
msgstr "所有人"
@@ -29460,8 +29718,8 @@ msgstr "用于æ¯ä¸ªæ–°çš„åˆå¹¶è¯·æ±‚。"
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr "用户å¯ä»¥å°†ä»“库å¤åˆ¶åˆ°æ–°é¡¹ç›®ã€‚"
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
-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 "用户å¯ä»¥è¯·æ±‚访问"
@@ -29560,7 +29818,7 @@ msgid "ProjectTemplates|Pages/Jekyll"
msgstr "Pages/Jekyll"
msgid "ProjectTemplates|Pages/Middleman"
-msgstr ""
+msgstr "Pages/Middleman"
msgid "ProjectTemplates|Pages/Plain HTML"
msgstr "Pages/Plain HTML"
@@ -29725,10 +29983,10 @@ msgid "ProjectsNew|No import options available"
msgstr "没有å¯ç”¨çš„导入选项"
msgid "ProjectsNew|Pick a group or namespace"
-msgstr ""
+msgstr "选择群组或命å空间"
msgid "ProjectsNew|Pick a group or namespace where you want to create this project."
-msgstr ""
+msgstr "选择è¦åœ¨å…¶ä¸­åˆ›å»ºæ­¤é¡¹ç›®çš„群组或命å空间。"
msgid "ProjectsNew|Project Configuration"
msgstr "项目é…ç½®"
@@ -30510,9 +30768,6 @@ msgstr "é‡æ–°å¯¼å…¥"
msgid "Re-request review"
msgstr "é‡æ–°è¯·æ±‚审核"
-msgid "Re-verification interval"
-msgstr "é‡æ–°éªŒè¯é—´éš”"
-
msgid "Read documentation"
msgstr "阅读文档"
@@ -30597,9 +30852,6 @@ msgstr "最近æœç´¢æœåŠ¡ä¸å¯ç”¨"
msgid "Recent events"
msgstr "最近事件"
-msgid "Recent jobs served by this runner"
-msgstr "此Runner最近执行的作业"
-
msgid "Recent searches"
msgstr "最近的æœç´¢"
@@ -30703,9 +30955,6 @@ msgstr "使用此网å€æ³¨å†ŒRunner:"
msgid "Register with two-factor app"
msgstr "使用åŒé‡è®¤è¯åº”用注册"
-msgid "Registration Features include:"
-msgstr "注册功能包括:"
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr "å¯ç”¨æœåŠ¡ Ping 并注册此功能。"
@@ -31020,7 +31269,7 @@ msgid "Remove time estimate"
msgstr "删除时间估计"
msgid "Remove topic avatar"
-msgstr ""
+msgstr "删除主题头åƒ"
msgid "Remove user"
msgstr "删除用户"
@@ -31181,9 +31430,6 @@ msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
msgid "Reopens this %{quick_action_target}."
msgstr "é‡æ–°æ‰“å¼€%{quick_action_target}。"
-msgid "Repeats"
-msgstr "é‡å¤"
-
msgid "Replace"
msgstr "替æ¢"
@@ -31223,9 +31469,6 @@ msgstr "回å¤â€¦"
msgid "Repo by URL"
msgstr "从 URL 导入仓库"
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr "举报侮辱性ã€ä¸é€‚当或垃圾%{display_issuable_type}。"
-
msgid "Report abuse"
msgstr "报告滥用"
@@ -31312,9 +31555,12 @@ msgstr "失败"
msgid "Reports|Filename"
msgstr "文件å"
-msgid "Reports|Full report"
+msgid "Reports|Fixed"
msgstr ""
+msgid "Reports|Full report"
+msgstr "完整报告"
+
msgid "Reports|Head report parsing error:"
msgstr "HEAD 报告解æžé”™è¯¯ï¼š"
@@ -31342,6 +31588,9 @@ msgstr "指标报告未能加载结果"
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr "指标报告:%{strong_start}%{numberOfChanges}%{strong_end} 个 %{changes}"
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr "扫æ工具"
@@ -31358,13 +31607,13 @@ msgid "Reports|Test summary failed loading results"
msgstr "测试总结报告加载失败"
msgid "Reports|Test summary failed to load results"
-msgstr ""
+msgstr "测试摘è¦åŠ è½½ç»“果失败"
msgid "Reports|Test summary results are being parsed"
msgstr "测试总结报告解æžä¸­"
msgid "Reports|Test summary results are loading"
-msgstr ""
+msgstr "测试摘è¦ç»“果正在加载"
msgid "Reports|Tool"
msgstr "工具"
@@ -31516,9 +31765,6 @@ msgstr "仓库大å°é™åˆ¶ï¼ˆMB)"
msgid "Repository storage"
msgstr "仓库存储"
-msgid "Repository synchronization concurrency limit"
-msgstr "仓库åŒæ­¥å¹¶å‘é™åˆ¶"
-
msgid "Repository update events"
msgstr "仓库更新事件"
@@ -31537,9 +31783,6 @@ msgstr "申请æƒé™"
msgid "Request a new one"
msgstr "请求一个新的"
-msgid "Request attention"
-msgstr "请求关注"
-
msgid "Request attention from %{users_sentence}."
msgstr "æ¥è‡ª %{users_sentence} 的请求关注"
@@ -31549,9 +31792,6 @@ msgstr "æ¥è‡ªæŒ‡æ´¾äººæˆ–审核者的请求关注"
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr "æ¥è‡ªæŒ‡æ´¾äººæˆ–审核者的请求关注"
-msgid "Request attention to review"
-msgstr "请求关注审核"
-
msgid "Request details"
msgstr "请求详情"
@@ -31591,9 +31831,6 @@ msgstr "请求的状æ€æ— æ•ˆ"
msgid "Requests"
msgstr "请求"
-msgid "Requests Profiles"
-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 "%{code_start}%{help_text_url}%{code_end} 页é¢çš„请求é‡å®šå‘到 URL。目的地必须满足æŸäº›è¦æ±‚。 %{docs_link_start}了解更多。%{docs_link_end}"
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr "通过 IP 地å€é™åˆ¶ç¾¤ç»„访问。%{link_start}了解更多%{link_end}。"
-
msgid "Restrict membership by email domain"
msgstr "通过电å­é‚®ä»¶åŸŸé™åˆ¶æˆå‘˜èµ„æ ¼"
@@ -31821,6 +32055,9 @@ msgstr "检索åˆè§„性报告失败。请刷新页é¢å¹¶é‡è¯•ã€‚"
msgid "Retry"
msgstr "é‡è¯•"
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr "é‡è¯•å¤±è´¥çš„作业"
@@ -31886,7 +32123,7 @@ msgid "Review time"
msgstr "审核时间"
msgid "Review time is defined as the time it takes from first comment until merged."
-msgstr "审阅时间定义为从首次评论到åˆå¹¶æ‰€éœ€æ—¶é—´ã€‚"
+msgstr "评审时间定义为从首次评论到åˆå¹¶æ‰€éœ€æ—¶é—´ã€‚"
msgid "ReviewApp|Enable Review App"
msgstr "å¯ç”¨å®¡é˜…应用"
@@ -31926,7 +32163,7 @@ msgid "RightSidebar|Copy email address"
msgstr "å¤åˆ¶ç”µå­é‚®ä»¶åœ°å€"
msgid "RightSidebar|Issue email"
-msgstr "å‘邮件"
+msgstr "邮件地å€"
msgid "RightSidebar|adding a"
msgstr "添加"
@@ -31940,6 +32177,9 @@ msgstr "路线图"
msgid "Roadmap settings"
msgstr "路线图设置"
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr "角色"
@@ -31982,12 +32222,12 @@ msgstr "使用Web终端对您的代ç è¿›è¡Œå®žæ—¶æµ‹è¯•"
msgid "Run untagged jobs"
msgstr "è¿è¡Œæœªæ ‡è®°çš„作业"
+msgid "Runner"
+msgstr ""
+
msgid "Runner API"
msgstr "Runner API"
-msgid "Runner cannot be deleted, please contact your administrator."
-msgstr "Runner 无法删除,请è”系您的管ç†å‘˜ã€‚"
-
msgid "Runner tokens"
msgstr "Runner令牌"
@@ -32003,9 +32243,6 @@ msgstr "Runner"
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr "Runner用于接收和执行GitLab的CI/CD作业的进程。"
-msgid "Runners currently online: %{active_runners_count}"
-msgstr "当å‰åœ¨çº¿Runner: %{active_runners_count}"
-
msgid "Runners page."
msgstr "Runner页é¢."
@@ -32014,11 +32251,11 @@ msgstr "%{percentage} 点。"
msgid "Runners|%{strongStart}%{count}%{strongEnd} runner selected"
msgid_plural "Runners|%{strongStart}%{count}%{strongEnd} runners selected"
-msgstr[0] ""
+msgstr[0] "%{strongStart}%{count}%{strongEnd} 个 runner 已选择"
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[0] "%{strongStart}%{count}%{strongEnd} 个 runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦ç»§ç»­å—?"
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 "容é‡ä¸º 1,通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。容é‡ä¸º 2,å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚容é‡ä¸º 3 个或更多,å¯ç”¨çƒ­ HA 和手动扩展 runner 队列。"
@@ -32033,7 +32270,7 @@ msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional schedul
msgstr "Amazon Linux 2 Docker HA,具有手动扩展和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚ %{percentage} 点。"
msgid "Runners|Amazon Linux 2 Docker HA with manual scaling and optional scheduling. Non-spot."
-msgstr ""
+msgstr "具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½çš„ Amazon Linux 2 Docker HA。Non-spot。"
msgid "Runners|An error has occurred fetching instructions"
msgstr "获å–指令时å‘生错误"
@@ -32062,17 +32299,14 @@ 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 "容é‡ä¸º 1,通过自动扩展组é‡æ–°ç”Ÿæˆå¯ç”¨æš– HA。容é‡ä¸º 2,å¯ç”¨çƒ­ HA,因为å³ä½¿èŠ‚点丢失,该æœåŠ¡ä¹Ÿå¯ç”¨ã€‚容é‡ä¸º 3 个或更多,å¯ç”¨çƒ­ HA 和手动扩展 runner 队列。"
-msgid "Runners|Change to project runner"
-msgstr "更改为项目 runner"
-
msgid "Runners|Checkbox"
-msgstr ""
+msgstr "å¤é€‰æ¡†"
msgid "Runners|Choose your preferred GitLab Runner"
msgstr "选择您首选的 GitLab Runner"
msgid "Runners|Clear selection"
-msgstr ""
+msgstr "清除选择"
msgid "Runners|Command to register runner"
msgstr "注册runner的命令"
@@ -32088,7 +32322,7 @@ msgstr "å¤åˆ¶æ³¨å†Œä»¤ç‰Œ"
msgid "Runners|Delete %d runner"
msgid_plural "Runners|Delete %d runners"
-msgstr[0] ""
+msgstr[0] "删除 %d 个 runner"
msgid "Runners|Delete runner"
msgstr "删除 runner"
@@ -32097,7 +32331,7 @@ msgid "Runners|Delete runner %{name}?"
msgstr "删除 runner %{name}?"
msgid "Runners|Delete selected"
-msgstr ""
+msgstr "删除所选"
msgid "Runners|Deploy GitLab Runner in AWS"
msgstr "在 AWS 中部署 GitLab Runner"
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr "群组"
@@ -32148,7 +32385,7 @@ msgid "Runners|Members of the %{type} can register runners"
msgstr "%{type}çš„æˆå‘˜å¯ä»¥æ³¨å†ŒRunner"
msgid "Runners|Multi-project runners cannot be deleted"
-msgstr ""
+msgstr "ä¸èƒ½åˆ é™¤å¤šé¡¹ç›® runners"
msgid "Runners|Name"
msgstr "å称"
@@ -32157,7 +32394,7 @@ msgid "Runners|Never contacted"
msgstr "未连接过"
msgid "Runners|Never contacted:"
-msgstr ""
+msgstr "从未连接过:"
msgid "Runners|New group runners view"
msgstr "新建群组 runner 视图"
@@ -32181,7 +32418,7 @@ msgid "Runners|Offline runners"
msgstr "离线 Runners"
msgid "Runners|Offline:"
-msgstr ""
+msgstr "离线:"
msgid "Runners|Online"
msgstr "在线"
@@ -32190,7 +32427,7 @@ msgid "Runners|Online runners"
msgstr "在线 Runners"
msgid "Runners|Online:"
-msgstr ""
+msgstr "在线:"
msgid "Runners|Pause from accepting jobs"
msgstr "æš‚åœæŽ¥å—作业"
@@ -32200,7 +32437,7 @@ msgstr "已暂åœ"
msgid "Runners|Permanently delete %d runner"
msgid_plural "Runners|Permanently delete %d runners"
-msgstr[0] ""
+msgstr[0] "永久删除 %d 个 runner"
msgid "Runners|Platform"
msgstr "å¹³å°"
@@ -32257,49 +32494,49 @@ msgid "Runners|Runner assigned to project."
msgstr "分é…给项目的runner"
msgid "Runners|Runner cannot be deleted, please contact your administrator"
-msgstr ""
+msgstr "Runner 无法删除,请è”系您的管ç†å‘˜ã€‚"
msgid "Runners|Runner has contacted GitLab within the last %{elapsedTime}"
-msgstr ""
+msgstr "在最近 %{elapsedTime} 内,Runner 连接过 GitLab"
msgid "Runners|Runner has never contacted GitLab (when you register a runner, use %{codeStart}gitlab-runner run%{codeEnd} to bring it online)"
-msgstr ""
+msgstr "Runner 从未连接过GitLab(注册 runner 时使用 %{codeStart}gitlab-runner run%{codeEnd} 将其上线)"
msgid "Runners|Runner has never contacted this instance"
-msgstr ""
+msgstr "Runner 从未连接到此实例"
msgid "Runners|Runner has not contacted GitLab in more than %{elapsedTime}"
-msgstr ""
+msgstr "在超过 %{elapsedTime} 的时间内,Runner 未连接过 GitLab"
msgid "Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects."
-msgstr ""
+msgstr "Runner 已被é”定,仅供当å‰åˆ†é…的项目使用。åªæœ‰ç®¡ç†å‘˜å¯ä»¥æ›´æ”¹åˆ†é…的项目。"
msgid "Runners|Runner is offline; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner 处于离线状æ€ï¼›æœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
msgid "Runners|Runner is offline; last contact was %{timeAgo}"
-msgstr ""
+msgstr "Runner 处于离线状æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{timeAgo}"
msgid "Runners|Runner is online; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner 处于在线状æ€ï¼Œæœ€åŽè¿žæŽ¥æ˜¯åœ¨%{runner_contact}å‰"
msgid "Runners|Runner is online; last contact was %{timeAgo}"
-msgstr "Runner 处于在线状æ€ï¼›æœ€åŽè¿žæŽ¥æ˜¯åœ¨%{timeAgo}å‰"
+msgstr "Runner 处于在线状æ€ï¼›æœ€åŽè¿žæŽ¥æ˜¯åœ¨%{timeAgo}"
msgid "Runners|Runner is stale; it has never contacted this instance"
-msgstr ""
+msgstr "Runners 是过期的;它从未连接过这个实例"
msgid "Runners|Runner is stale; last contact was %{runner_contact} ago"
-msgstr ""
+msgstr "Runner 是过期的;最åŽä¸€æ¬¡è¿žæŽ¥æ˜¯åœ¨ %{runner_contact} å‰"
msgid "Runners|Runner is stale; last contact was %{timeAgo}"
-msgstr ""
+msgstr "Runner 是过期的;最åŽä¸€æ¬¡è¿žæŽ¥æ˜¯åœ¨ %{timeAgo}"
msgid "Runners|Runner registration"
msgstr "Runner 注册"
msgid "Runners|Runner statuses"
-msgstr ""
+msgstr "Runner 状æ€"
msgid "Runners|Runner unassigned from project."
msgstr "å–消分é…到项目的runner。"
@@ -32310,6 +32547,9 @@ msgstr "Runner"
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 "在此选择您的首选选项。在下一步中,您å¯ä»¥åœ¨ AWS CloudFormation 控制å°ä¸­é€‰æ‹©æ‚¨çš„ runner 能力。"
@@ -32332,7 +32572,7 @@ msgid "Runners|Stale runners"
msgstr "过期 runners"
msgid "Runners|Stale:"
-msgstr ""
+msgstr "过期:"
msgid "Runners|Status"
msgstr "状æ€"
@@ -32353,7 +32593,7 @@ msgid "Runners|The runner will be permanently deleted and no longer available fo
msgstr "Runner 将被永久删除,ä¸å†é€‚用于项目或群组。您确定è¦ç»§ç»­å—?"
msgid "Runners|This runner has not run any jobs."
-msgstr ""
+msgstr "æ­¤ runner 没有è¿è¡Œä»»ä½•ä½œä¸šã€‚"
msgid "Runners|This runner is associated with specific projects."
msgstr "æ­¤Runner与特定项目相关è”。"
@@ -32374,7 +32614,7 @@ msgid "Runners|Use the runner for jobs without tags, in addition to tagged jobs.
msgstr "除了带标签的作业外,还å¯ä»¥å°†Runner用于没有标签的作业。"
msgid "Runners|Use the runner for the currently assigned projects only. Only administrators can change the assigned projects."
-msgstr ""
+msgstr "ä»…å°† runner 用于当å‰åˆ†é…的项目。åªæœ‰ç®¡ç†å‘˜å¯ä»¥æ›´æ”¹åˆ†é…的项目。"
msgid "Runners|Use the runner on pipelines for protected branches only."
msgstr "åªä¸ºå—ä¿æŠ¤çš„分支使用æµæ°´çº¿ä¸Šçš„Runner。"
@@ -32392,10 +32632,7 @@ msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. %
msgstr "Windows 2019 Shell,具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½ã€‚ %{percentage} 点。"
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
-msgstr ""
-
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-msgstr "您将è¦å°†æ­¤å®žä¾‹çš„runner更改为项目runner,此æ“作ä¸å¯é€†ï¼Œæ‚¨ç¡®å®šè¦ç»§ç»­å—?"
+msgstr "具有手动缩放和å¯é€‰è°ƒåº¦åŠŸèƒ½çš„ Windows 2019 Shell。Non-spot。"
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。"
@@ -32409,9 +32646,6 @@ msgstr "å¯ç”¨"
msgid "Runners|group"
msgstr "群组"
-msgid "Runners|locked"
-msgstr "å·²é”定"
-
msgid "Runners|never contacted"
msgstr "从未连接过"
@@ -32548,7 +32782,7 @@ 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 ""
+msgstr "%{ifLabelStart}如果%{ifLabelEnd} %{scanners} 在针对 %{branches} 的开放åˆå¹¶è¯·æ±‚中å‘现超过 %{vulnerabilitiesAllowed} %{severities} %{vulnerabilityStates} çš„æ¼æ´ž"
msgid "ScanResultPolicy|%{thenLabelStart}Then%{thenLabelEnd} Require approval from %{approvalsRequired} of the following approvers:"
msgstr "%{thenLabelStart}然åŽ%{thenLabelEnd} 需è¦ä»¥ä¸‹ %{approvalsRequired} 个核准人的批准:"
@@ -32867,9 +33101,6 @@ msgstr "席ä½ä½¿ç”¨æƒ…况数æ®ï¼Œæˆªè‡³ %{last_enqueue_time} (æ¯å¤©æ›´æ–°ï¼
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr "席ä½ä½¿ç”¨æ•°æ®æ›´æ–°äºŽæ¯æ—¥12:00pm UTC"
-msgid "Secondary"
-msgstr "次è¦"
-
msgid "Secondary email:"
msgstr "次è¦é‚®ç®±ï¼š"
@@ -32891,9 +33122,6 @@ msgstr "Secure Code Warrior"
msgid "Secure Files"
msgstr "安全文件"
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr "识别外部存储请求的安全令牌。"
@@ -33021,7 +33249,7 @@ msgid "SecurityConfiguration|Immediately begin risk analysis and remediation wit
msgstr "使用应用程åºå®‰å…¨åŠŸèƒ½ç«‹å³å¼€å§‹é£Žé™©åˆ†æžå’Œè¡¥æ•‘。从 SAST å’Œ Secret 检测开始,适用于所有计划。å‡çº§åˆ° Ultimate 以获得所有功能,包括:"
msgid "SecurityConfiguration|Learn more about vulnerability training"
-msgstr ""
+msgstr "了解更多关于æ¼æ´žåŸ¹è®­çš„ä¿¡æ¯"
msgid "SecurityConfiguration|Manage corpus"
msgstr "管ç†è¯­æ–™åº“"
@@ -33030,7 +33258,7 @@ msgid "SecurityConfiguration|Manage corpus files used as seed inputs with covera
msgstr "管ç†åœ¨è¦†ç›–模糊测试中用作输入ç§å­çš„语料库文件。"
msgid "SecurityConfiguration|Manage profiles"
-msgstr ""
+msgstr "管ç†é…置文件"
msgid "SecurityConfiguration|Manage profiles for use by DAST scans."
msgstr "管ç†ä¾› DAST 扫æ使用的é…置文件。"
@@ -33080,6 +33308,9 @@ msgstr "æ¼æ´žç®¡ç†"
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr "åˆå¹¶è¯·æ±‚中的æ¼æ´žè¯¦ç»†ä¿¡æ¯å’Œç»Ÿè®¡"
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr "或 "
@@ -33090,9 +33321,12 @@ msgid "SecurityOrchestration|%{branches} and %{lastBranch} %{plural}"
msgstr "%{branches} 和 %{lastBranch} %{plural}"
msgid "SecurityOrchestration|%{scanners}"
-msgstr ""
+msgstr "%{scanners}"
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
+msgstr "针对 %{branches} 的开放åˆå¹¶è¯·æ±‚中的 %{scanners} %{severities}。"
+
+msgid "SecurityOrchestration|.yaml mode"
msgstr ""
msgid "SecurityOrchestration|.yaml preview"
@@ -33110,10 +33344,7 @@ msgstr "解除警报åŽï¼Œè¯¥ä¿¡æ¯å°†ä¸å†æ˜¾ç¤ºã€‚"
msgid "SecurityOrchestration|All policies"
msgstr "所有策略"
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,29 +33353,53 @@ 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|Don't show the alert anymore"
msgstr "ä¸å†æ˜¾ç¤ºè­¦æŠ¥"
-msgid "SecurityOrchestration|Edit network policy"
-msgstr ""
-
msgid "SecurityOrchestration|Edit policy"
msgstr "编辑策略"
msgid "SecurityOrchestration|Edit policy project"
msgstr "编辑策略项目"
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
-msgstr ""
+msgstr "编辑扫æ结果策略"
msgid "SecurityOrchestration|Empty policy name"
msgstr "空策略å称"
@@ -33156,10 +33411,7 @@ msgid "SecurityOrchestration|Enforce security for this project. %{linkStart}More
msgstr "强制此项目的安全性。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr "如果您正在使用Auto DevOps,如果您改å˜äº†æ­¤éƒ¨åˆ†çš„策略,您的 %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} 文件将ä¸ä¼šè¢«æ›´æ–° Auto DevOps 用户应按照 %{linkStart}容器网络策略文档%{linkEnd}进行更改。"
+msgstr "如果任何扫æ器在针对主分支的开放åˆå¹¶è¯·æ±‚中å‘现新检测的严é‡æ¼æ´žï¼Œç„¶åŽéœ€è¦ä»»ä½• App security æˆå‘˜çš„两次批准。"
msgid "SecurityOrchestration|Invalid policy type"
msgstr "无效的策略类型"
@@ -33167,23 +33419,14 @@ msgstr "无效的策略类型"
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr "针对 %{agent} è¿è¡Œçš„最新扫æ"
-msgid "SecurityOrchestration|Network"
-msgstr "网络"
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr "æ–°ç­–ç•¥"
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
-msgstr ""
+msgstr "新建扫æ结果策略"
msgid "SecurityOrchestration|No actions defined - policy will not run."
msgstr "未定义任何æ“作 - ç­–ç•¥ä¸ä¼šè¿è¡Œã€‚"
@@ -33203,6 +33446,9 @@ msgstr "åªæœ‰æ‰€æœ‰è€…å¯ä»¥æ›´æ–°å®‰å…¨ç­–略项目"
msgid "SecurityOrchestration|Policies"
msgstr "ç­–ç•¥"
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr "策略类型"
@@ -33212,6 +33458,9 @@ msgstr "无法为ä¸å­˜åœ¨çš„分支å¯ç”¨ç­–ç•¥ (%{branches})"
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr "没有分支信æ¯å°±æ— æ³•å¯ç”¨ç­–ç•¥"
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr "ç­–ç•¥æè¿°"
@@ -33221,20 +33470,23 @@ msgstr "策略编辑器"
msgid "SecurityOrchestration|Policy status"
msgstr "策略状æ€"
-msgid "SecurityOrchestration|Policy summary"
-msgstr "策略摘è¦"
-
msgid "SecurityOrchestration|Policy type"
msgstr "策略类型"
msgid "SecurityOrchestration|Require %{approvals} %{plural} from %{approvers} if any of the following occur:"
msgstr "如果å‘生以下任何情况,则需è¦æ¥è‡ª %{approvers} çš„ %{approvals} %{plural} :"
+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 ""
+msgstr "当æµæ°´çº¿è¿è¡Œåœ¨ä¸»åˆ†æ”¯æ—¶ï¼Œä½¿ç”¨æ‰«æé…置文件 A 和站点é…置文件 A è¿è¡Œ DAST 扫æ。"
msgid "SecurityOrchestration|Runs %{actions} and %{lastAction} scans"
msgstr "è¿è¡Œ %{actions} å’Œ %{lastAction} 扫æ"
@@ -33242,6 +33494,9 @@ msgstr "è¿è¡Œ %{actions} å’Œ %{lastAction} 扫æ"
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr "è¿è¡Œ %{action} 扫æ"
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr "扫æ执行"
@@ -33255,10 +33510,10 @@ msgid "SecurityOrchestration|Scan execution policies can only be created by proj
msgstr "扫æ执行策略åªèƒ½ç”±é¡¹ç›®æ‰€æœ‰è€…创建。"
msgid "SecurityOrchestration|Scan execution policy"
-msgstr ""
+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 ""
+msgstr "扫æ执行策略å…许创建在特定时间强制对特定分支进行安全扫æ的规则。支æŒçš„类型是 SASTã€DASTã€Secret 检测ã€å®¹å™¨æ‰«æã€è®¸å¯è¯æ‰«æã€API 模糊测试ã€è¦†ç›–引导模糊测试。"
msgid "SecurityOrchestration|Scan result"
msgstr "扫æ结果"
@@ -33267,7 +33522,7 @@ msgid "SecurityOrchestration|Scan result policies can only be created by project
msgstr "扫æ结果策略åªèƒ½ç”±é¡¹ç›®æ‰€æœ‰è€…创建。"
msgid "SecurityOrchestration|Scan result policy"
-msgstr ""
+msgstr "扫æ结果策略"
msgid "SecurityOrchestration|Scan to be performed %{cadence}"
msgstr "è¦æ‰§è¡Œçš„扫æ %{cadence}"
@@ -33278,6 +33533,9 @@ msgstr "扫æ %{cadence} 在 %{branches} 上执行"
msgid "SecurityOrchestration|Scan to be performed on every pipeline on the %{branches}"
msgstr "在%{branches}上扫ææ¯ä¸ªæµæ°´çº¿"
+msgid "SecurityOrchestration|Security Approvals"
+msgstr ""
+
msgid "SecurityOrchestration|Security policy project was linked successfully"
msgstr "安全策略项目已æˆåŠŸè¿žæŽ¥"
@@ -33288,11 +33546,14 @@ msgid "SecurityOrchestration|Select a project to store your security policies in
msgstr "选择一个项目æ¥å­˜å‚¨æ‚¨çš„安全策略。 %{linkStart}更多信æ¯ã€‚%{linkEnd}"
msgid "SecurityOrchestration|Select policy"
-msgstr ""
+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 "对ä¸èµ·ï¼Œæ‚¨çš„过滤器没有产生任何结果。"
@@ -33300,14 +33561,17 @@ msgid "SecurityOrchestration|Status"
msgstr "状æ€"
msgid "SecurityOrchestration|Step 1: Choose a policy type"
-msgstr ""
+msgstr "步骤 1:选择策略类型"
msgid "SecurityOrchestration|Step 2: Policy details"
-msgstr ""
+msgstr "步骤 2:策略详情"
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 "创建新的安全策略时出现问题"
@@ -33315,7 +33579,7 @@ 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 "æ­¤è§†å›¾ä»…æ˜¾ç¤ºä»£ç† %{agent} 的扫æ结果。您å¯ä»¥åœ¨%{linkStart}æ¼æ´žæŠ¥å‘Šçš„ Operational Vulnerabilities 选项å¡ä¸­%{linkEnd}查看所有代ç†çš„扫æ结果。"
+msgstr "æ­¤è§†å›¾ä»…æ˜¾ç¤ºä»£ç† %{agent} 的扫æ结果。您å¯ä»¥åœ¨%{linkStart}æ¼æ´žæŠ¥å‘Šçš„è¿è¥æ¼æ´žé€‰é¡¹å¡ä¸­%{linkEnd}查看所有代ç†çš„扫æ结果。"
msgid "SecurityOrchestration|To widen your search, change filters above or select a different security policy project."
msgstr "è¦æ‰©å¤§æ‚¨çš„æœç´¢èŒƒå›´ï¼Œè¯·åœ¨ä¸Šé¢æ›´æ”¹è¿‡æ»¤è§„则或选择ä¸åŒçš„安全策略项目。"
@@ -33330,14 +33594,14 @@ msgid "SecurityOrchestration|Update scan policies"
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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
-msgstr ""
+msgstr "使用扫æ结果策略创建规则,确ä¿åœ¨åˆå¹¶åˆå¹¶è¯·æ±‚之å‰æ£€æŸ¥å®‰å…¨é—®é¢˜ã€‚"
msgid "SecurityOrchestration|View policy project"
msgstr "查看策略项目"
+msgid "SecurityOrchestration|You don't have any security policies yet"
+msgstr ""
+
msgid "SecurityOrchestration|a"
msgstr "一个"
@@ -33389,12 +33653,12 @@ msgstr "æ¼æ´ž"
msgid "SecurityPolicies|+%{count} more"
msgstr "+%{count} 更多"
-msgid "SecurityPolicies|Environment(s)"
-msgstr "环境"
-
msgid "SecurityPolicies|Policy type"
msgstr "策略类型"
+msgid "SecurityReports|%{count} Selected"
+msgstr ""
+
msgid "SecurityReports|%{count}+ projects"
msgstr "%{count}+项目"
@@ -33537,7 +33801,7 @@ msgid "SecurityReports|More info"
msgstr "更多信æ¯"
msgid "SecurityReports|No activity"
-msgstr "无动æ€"
+msgstr "无活动"
msgid "SecurityReports|No longer detected"
msgstr "ä¸å†æ£€æµ‹"
@@ -33567,7 +33831,7 @@ msgid "SecurityReports|Remove project from dashboard"
msgstr "从仪表盘删除项目"
msgid "SecurityReports|Report has expired"
-msgstr ""
+msgstr "报告已过期"
msgid "SecurityReports|Scan details"
msgstr "扫æ详情"
@@ -33594,7 +33858,7 @@ msgid "SecurityReports|Severity"
msgstr "严é‡ç¨‹åº¦"
msgid "SecurityReports|Show %{pageSize} items"
-msgstr ""
+msgstr "显示 %{pageSize} 项"
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 "有时扫æ工具无法确定调查结果的严é‡æ€§ï¼Œè¿™äº›ç»“æžœå¯èƒ½ä»ç„¶æ˜¯æ½œåœ¨çš„风险æ¥æºï¼Œè¯·æ‰‹åŠ¨æŸ¥çœ‹"
@@ -33611,14 +33875,14 @@ msgstr "æ交æ¼æ´ž"
msgid "SecurityReports|Take survey"
msgstr "å‚加调查"
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
-msgstr "æ¼æ´žæŠ¥å‘Šæ˜¾ç¤ºé¡¹ç›®é»˜è®¤åˆ†æ”¯ä¸Šæœ€æ–°æˆåŠŸæµæ°´çº¿çš„结果,以åŠæœ€æ–°å®¹å™¨æ‰«æçš„æ¼æ´žã€‚ %{linkStart}了解更多。%{linkEnd}"
+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 "安全报告包å«ä¸€ä¸ªæˆ–多个无法解æžä¸”未记录的æ¼æ´žå‘现。è¦è°ƒæŸ¥ä¸€ä¸ªæŠ¥å‘Šï¼Œä¸‹è½½ä½œä¸šè¾“出中的产物。确ä¿åˆ›å»ºçš„安全报告都符åˆç›¸å…³çš„ %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}。"
msgid "SecurityReports|The security report for this pipeline has %{helpPageLinkStart}expired%{helpPageLinkEnd}. Re-run the pipeline to generate a new security report."
-msgstr ""
+msgstr "æ­¤æµæ°´çº¿çš„安全报告 %{helpPageLinkStart}已过期%{helpPageLinkEnd}。é‡æ–°è¿è¡Œæµæ°´çº¿æ¥ç”Ÿæˆæ–°çš„安全报告。"
msgid "SecurityReports|There was an error adding the comment."
msgstr "添加评论时出错。"
@@ -33684,7 +33948,7 @@ msgid "SecurityReports|While it's rare to have no vulnerabilities for your pipel
msgstr "虽然您的æµæ°´çº¿ä¸­æ²¡æœ‰æ¼æ´žï¼Œè¿™ç§çŽ°è±¡å¾ˆç½•è§ï¼Œä½†ä¹Ÿæ˜¯æœ‰å¯èƒ½çš„。无论如何,建议您仔细检查设置以确ä¿ä»ªè¡¨æ¿çš„é…置正确。"
msgid "SecurityReports|With issues"
-msgstr "有问题"
+msgstr "有议题"
msgid "SecurityReports|You do not have sufficient permissions to access this report"
msgstr "您没有足够的æƒé™è®¿é—®æ­¤æŠ¥å‘Š"
@@ -33797,6 +34061,9 @@ msgstr "选择指派人"
msgid "Select branch"
msgstr "选择分支"
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr "设置截止日期"
@@ -33812,9 +34079,6 @@ msgstr "选择群组"
msgid "Select group or project"
msgstr "选择群组或项目"
-msgid "Select groups to replicate"
-msgstr "选择è¦å¤åˆ¶çš„群组。"
-
msgid "Select health status"
msgstr "选择å¥åº·çŠ¶å†µ"
@@ -33857,9 +34121,6 @@ msgstr "选择项目"
msgid "Select reviewer(s)"
msgstr "选择审核者"
-msgid "Select shards to replicate"
-msgstr "选择è¦å¤åˆ¶çš„分片"
-
msgid "Select source"
msgstr "选择æº"
@@ -33908,9 +34169,6 @@ 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}â€)。它还将与所选用户关è”å’Œ/或分é…这些议题和评论。"
-msgid "Selective synchronization"
-msgstr "选择性åŒæ­¥"
-
msgid "Self monitoring"
msgstr "自我监控"
@@ -34112,15 +34370,15 @@ 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 "æœåŠ¡å°å…许人们在没有自己的用户账å·çš„情况下在您的 GitLab 实例中创建议题。它为最终用户在项目中创建议题æ供了一个唯一的电å­é‚®ä»¶åœ°å€ã€‚回å¤å¯ä»¥é€šè¿‡ GitLab ç•Œé¢æˆ–通过电å­é‚®ä»¶å‘é€ã€‚最终用户åªèƒ½é€šè¿‡ç”µå­é‚®ä»¶æŸ¥çœ‹ä¸»é¢˜ã€‚"
+msgid "Service Ping payload not found in the application cache"
+msgstr ""
+
msgid "Service account generated successfully"
msgstr "æœåŠ¡å¸æˆ·ç”ŸæˆæˆåŠŸ"
msgid "Service accounts"
msgstr "æœåŠ¡å¸æˆ·"
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
-msgstr "æœåŠ¡ ping 在您的é…置文件中被ç¦ç”¨ï¼Œå¹¶ä¸”无法通过此表å•å¯ç”¨ã€‚"
-
msgid "Service usage data"
msgstr "æœåŠ¡ä½¿ç”¨æ•°æ®"
@@ -34268,9 +34526,6 @@ msgstr "设置通过 API 按 ID 获å–用户的æ¯ç”¨æˆ·é€ŸçŽ‡é™åˆ¶ã€‚"
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr "为由 Web 或 API 请求创建的 notes 设置æ¯ä¸ªç”¨æˆ·çš„速率é™åˆ¶ã€‚"
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr "以秒为å•ä½è®¾ç½®è¶…时,以将次è¦ç«™ç‚¹çŠ¶æ€å‘é€åˆ°ä¸»ç«™ç‚¹å’Œæ¬¡è¦ç«™ç‚¹å…许的 IP。"
-
msgid "Set this number to 0 to disable the limit."
msgstr "将此数字设置为 0 æ¥ç¦ç”¨é™åˆ¶ã€‚"
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr "设置验è¯é™åˆ¶å’Œé¢‘率。"
-
msgid "Set weight"
msgstr "设置æƒé‡"
msgid "Set weight to %{weight}."
msgstr "å°†æƒé‡è®¾ç½®ä¸º%{weight}。"
-msgid "Set what should be replicated by this secondary site."
-msgstr "设置此次è¦èŠ‚点应该å¤åˆ¶çš„内容。"
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr "您的å字和头åƒæ—边显示标识。"
@@ -34416,9 +34665,6 @@ msgstr "严é‡æ€§: %{severity}"
msgid "SeverityWidget|There was an error while updating severity."
msgstr "更新严é‡æ€§æ—¶å‡ºé”™ã€‚"
-msgid "Shards to synchronize"
-msgstr "需åŒæ­¥çš„存储片"
-
msgid "Share"
msgstr "分享"
@@ -35306,7 +35552,7 @@ msgid "SortOptions|Weight"
msgstr "æƒé‡"
msgid "Source"
-msgstr "æº"
+msgstr "æ¥æº"
msgid "Source (branch or tag)"
msgstr "æº(分支或标签)"
@@ -35320,6 +35566,12 @@ msgstr "æºIP"
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 "æºåˆ†æ”¯: %{source_branch_open}%{source_branch}%{source_branch_close}"
@@ -35842,6 +36094,12 @@ 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 "å­ç¾¤ç»„ä¿¡æ¯"
@@ -35968,27 +36226,6 @@ msgstr "添加新的许å¯è¯"
msgid "SubscriptionBanner|Export license usage file"
msgstr "导出许å¯è¯ä½¿ç”¨æ–‡ä»¶"
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr "如果您有%{doc_link_start}任何问题需è¦è§£ç­”%{doc_link_end},我们很ä¹æ„为您æ供帮助。"
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr "您的订阅的é¢å¤–费用"
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr "%{customer_name},"
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr "GitLab è´¦å•å›¢é˜Ÿ"
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr "感谢您的光临ï¼"
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr "您å¯ä»¥åœ¨%{doc_link_start}文档%{doc_link_end}中找到关于季度对账过程的更多信æ¯ã€‚"
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr "您的当å‰ç”¨æˆ·æ•°ä¸­æœ‰%{seat_quantity}å用户超出了你的 GitLab %{subscription_name} 订阅中的用户数é‡ã€‚å³ä½¿å½“å‰è¶…越了你的订阅用户数,您ä»ç„¶å¯ä»¥æ·»åŠ ç”¨æˆ·ï¼Œä¸”æ¯ä¸ªå­£åº¦ä¼šä¾ç…§è¶…出的用户数å‘您收å–é¢å¤–费用。"
-
msgid "SubscriptionTable|Add seats"
msgstr "添加席ä½"
@@ -36181,6 +36418,12 @@ msgstr "ç‚­ç°è‰²"
msgid "SuggestedColors|Crimson"
msgstr "深红色"
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr "æš—çŠç‘šè‰²"
@@ -36196,6 +36439,12 @@ msgstr "暗紫色"
msgid "SuggestedColors|Deep violet"
msgstr "深紫色"
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr "ç°è‰²"
@@ -36214,6 +36463,9 @@ msgstr "å“红色-粉色"
msgid "SuggestedColors|Medium sea green"
msgstr "中海绿"
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr "红色"
@@ -36256,8 +36508,8 @@ msgstr "激活订阅"
msgid "SuperSonics|Activation code"
msgstr "激活ç "
-msgid "SuperSonics|An error occurred while activating your subscription."
-msgstr "激活您的订阅时å‘生错误。"
+msgid "SuperSonics|An error occurred while adding your subscription."
+msgstr ""
msgid "SuperSonics|Billable users"
msgstr "计费用户"
@@ -36265,9 +36517,6 @@ msgstr "计费用户"
msgid "SuperSonics|Buy subscription"
msgstr "购买订阅"
-msgid "SuperSonics|Cloud license"
-msgstr "云端许å¯è¯"
-
msgid "SuperSonics|Cloud licensing"
msgstr "云授æƒ"
@@ -36292,6 +36541,9 @@ msgstr "我åŒæ„我对GitLab 软件的使用必须éµå®ˆä½äºŽ %{linkStart}æœå
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr "了解如何 %{linkStart}激活您的订阅%{linkEnd}。"
+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 "授æƒ"
@@ -36301,8 +36553,11 @@ msgstr "管ç†"
msgid "SuperSonics|Maximum users"
msgstr "最大用户数"
-msgid "SuperSonics|Offline cloud"
-msgstr "离线云"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
+msgstr ""
msgid "SuperSonics|Paste your activation code"
msgstr "粘贴您的激活ç "
@@ -36348,7 +36603,7 @@ msgstr "è¦æ¿€æ´»æ‚¨çš„订阅,请通过 %{linkStart}Cloud Licensing%{linkEnd}
msgid "SuperSonics|User in subscription"
msgid_plural "SuperSonics|Users in subscription"
-msgstr[0] ""
+msgstr[0] "订阅用户"
msgid "SuperSonics|Users in subscription"
msgstr "订阅数内的用户"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. If you need further assistance, please %{supportLinkStart}contact GitLab Support%{supportLinkEnd}."
-msgstr "您å¯ä»¥äº†è§£æ›´å¤šå…³äºŽ %{activationLinkStart}激活您的订阅%{activationLinkEnd}。如果您需è¦è¿›ä¸€æ­¥çš„帮助,请 %{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},获å–有关最常è§è¿žæŽ¥é—®é¢˜çš„帮助。"
@@ -36446,9 +36698,6 @@ msgstr "ç«‹å³åŒæ­¥"
msgid "Synced"
msgstr "å·²åŒæ­¥"
-msgid "Synchronization settings"
-msgstr "åŒæ­¥è®¾ç½®"
-
msgid "Synchronize LDAP"
msgstr "åŒæ­¥ LDAP"
@@ -36614,6 +36863,9 @@ msgstr "å‘行说明"
msgid "TagsPage|Repository has no tags yet."
msgstr "版本库还没有标签。"
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr "标签"
@@ -36807,11 +37059,8 @@ msgstr "加载 Terraform 报告失败"
msgid "Terraform|Generating the report caused an error."
msgstr "生æˆæŠ¥å‘Šæ—¶å‘生错误。"
-msgid "Terraform|Get started with Terraform"
-msgstr "Terraform入门"
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
-msgstr "如何使用 GitLab 管ç†çš„ Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
+msgstr ""
msgid "Terraform|Job status"
msgstr "作业状æ€"
@@ -36891,6 +37140,9 @@ msgstr "您将è¦åˆ é™¤ state 文件 %{name}。这将永久删除所有 State ç‰
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr "无法删除状æ€æ–‡ä»¶ï¼Œå› ä¸ºå®ƒå·²è¢«é”定。在删除之å‰å…ˆè§£é”状æ€æ–‡ä»¶ã€‚"
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr "测试"
@@ -36900,12 +37152,9 @@ msgstr "测试用例"
msgid "Test case"
msgstr "测试用例"
-msgid "Test coverage parsing"
-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] "该管é“çš„æµ‹è¯•è¦†ç›–çŽ‡å€¼æ˜¯é€šè¿‡å¹³å‡ %d 个作业的结果覆盖率值æ¥è®¡ç®—的。"
+msgstr[0] "该æµæ°´çº¿çš„æµ‹è¯•è¦†ç›–çŽ‡å€¼æ˜¯é€šè¿‡å¹³å‡ %d 个作业的结果覆盖率值æ¥è®¡ç®—的。"
msgid "Test coverage: %d hit"
msgid_plural "Test coverage: %d hits"
@@ -37120,7 +37369,7 @@ msgid "The URLs for connecting to Elasticsearch. For clustering, add the URLs se
msgstr "连接到Elasticsearchçš„URL。对于集群,请添加用逗å·åˆ†éš”çš„URL。"
msgid "The `/merge` quick action requires the SHA of the head of the branch."
-msgstr ""
+msgstr "`/merge` 快速æ“作需è¦åˆ†æ”¯å¤´éƒ¨çš„ SHA。"
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 "应用程åºå¯ç”¨äºŽå®¢æˆ·ç«¯å¯†é’¥å¯ä»¥ä¿æŒä¿å¯†çš„地方。原生移动应用和å•é¡µåº”用被视为为éžä¿å¯†ã€‚"
@@ -37149,9 +37398,6 @@ msgstr "æ­¤æ交ä¸å­˜åœ¨"
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr "由于存在åˆå¹¶å†²çªï¼Œå¯¹æ¯”视图å¯èƒ½ä¸å‡†ç¡®ã€‚"
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr "åˆè§„报告æ•èŽ·è¿ååˆè§„最佳实践的åˆå¹¶æ›´æ”¹ã€‚"
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr "åˆè§„报告显示åˆå¹¶è¯·æ±‚在å—ä¿æŠ¤çš„环境中åˆå¹¶ã€‚"
@@ -37165,10 +37411,10 @@ msgid "The content editor may change the markdown formatting style of the docume
msgstr "内容编辑器å¯èƒ½ä¼šæ›´æ”¹æ–‡æ¡£çš„ Markdown æ ¼å¼æ ·å¼ï¼Œè¿™å¯èƒ½ä¸Žæ‚¨åŽŸæ¥çš„ Markdown æ ·å¼ä¸åŒ¹é…。"
msgid "The content for this wiki page failed to load. To fix this error, reload the page."
-msgstr ""
+msgstr "æ­¤ wiki 页é¢çš„内容无法加载。è¦ä¿®å¤æ­¤é”™è¯¯ï¼Œè¯·é‡æ–°åŠ è½½é¡µé¢ã€‚"
msgid "The content for this wiki page failed to render."
-msgstr ""
+msgstr "æ­¤wiki页é¢çš„内容无法渲染。"
msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
msgstr "此页é¢çš„内容未以UTF-8ç¼–ç ã€‚编辑åªèƒ½é€šè¿‡Git仓库进行。"
@@ -37459,9 +37705,6 @@ msgstr "该项目æˆåŠŸæ´¾ç”Ÿã€‚"
msgid "The project was successfully imported."
msgstr "该项目已æˆåŠŸå¯¼å…¥ã€‚"
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr "用于在作业日志中查找测试覆盖率输出的正则表达å¼ã€‚例如,对 Simplecov (Ruby) 使用%{regex}。留空以ç¦ç”¨ã€‚"
-
msgid "The related CI build failed."
msgstr "相关的 CI 构建失败。"
@@ -37573,8 +37816,8 @@ msgstr "æ¼æ´žå·²ä¸å†è¢«æ£€æµ‹åˆ°ã€‚请在更改其状æ€å‰ç¡®ä¿æ¼æ´žå·²ä¿®
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr "æ¼æ´žå·²ä¸å†è¢«æ£€æµ‹åˆ°ã€‚请在更改其状æ€å‰ç¡®ä¿æ¼æ´žå·²ä¿®è¡¥ã€‚"
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
-msgstr "有需è¦æš‚åœç´¢å¼•çš„高级æœç´¢è¿ç§»å¾…处ç†ã€‚索引必须ä¿æŒæš‚åœï¼Œç›´åˆ° GitLab 完æˆè¿ç§»ã€‚"
+msgid "Theme"
+msgstr ""
msgid "There are currently no events."
msgstr "当å‰æ²¡æœ‰äº‹ä»¶ã€‚"
@@ -37753,12 +37996,21 @@ 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 "å‘é€ç¡®è®¤é‚®ä»¶æ—¶å‡ºçŽ°é—®é¢˜"
@@ -37810,12 +38062,6 @@ msgstr "获å–阶段总计数时出错"
msgid "There was an error fetching the %{replicableType}"
msgstr "获å–%{replicableType}时出错"
-msgid "There was an error fetching the Geo Settings"
-msgstr "获å–Geo设置时出错"
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr "获å–站点的群组时出错"
-
msgid "There was an error fetching the deploy freezes."
msgstr "获å–部署冻结时出错。"
@@ -37864,9 +38110,6 @@ msgstr "é‡ç½®ç”¨æˆ·æµæ°´çº¿åˆ†é’Ÿæ•°æ—¶å‡ºé”™ã€‚"
msgid "There was an error retrieving the Jira users."
msgstr "获å–Jira用户时出错。"
-msgid "There was an error saving this Geo Site"
-msgstr "ä¿å­˜æ­¤ Geo 站点时出错"
-
msgid "There was an error saving your changes."
msgstr "ä¿å­˜å˜æ›´æ—¶å‡ºé”™ã€‚"
@@ -37882,9 +38125,6 @@ msgstr "åŒæ­¥%{replicableType}时出错"
msgid "There was an error trying to validate your query"
msgstr "å°è¯•éªŒè¯æ‚¨çš„查询时出错"
-msgid "There was an error updating the Geo Settings"
-msgstr "更新Geo设置时出错"
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr "更新维护模å¼è®¾ç½®æ—¶å‡ºé”™"
@@ -37946,7 +38186,7 @@ msgid "These will be sent to %{email} in an attachment once finished."
msgstr "这些将在附件完æˆåŽå‘é€è‡³ %{email}。"
msgid "Things to be aware of before transferring:"
-msgstr ""
+msgstr "转移å‰éœ€è¦æ³¨æ„的事项:"
msgid "Third Party Advisory Link"
msgstr "第三方建议链接"
@@ -38087,7 +38327,7 @@ 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 ""
+msgstr "此部署作业ä¸ä¼šè‡ªåŠ¨è¿è¡Œï¼Œå¿…须手动å¯åŠ¨ï¼Œä½†æ‚¨æ— æƒè®¿é—®æ­¤ä½œä¸šçš„å—ä¿æŠ¤çŽ¯å¢ƒã€‚该作业åªèƒ½ç”±å…许部署到环境的项目æˆå‘˜å¯åŠ¨ã€‚"
msgid "This device has already been registered with us."
msgstr "此设备已注册。"
@@ -38128,6 +38368,9 @@ 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 "此功能需è¦æœ¬åœ°å­˜å‚¨ä»¥å¯ç”¨"
@@ -38239,8 +38482,8 @@ msgstr "此议题已éšè—,因为其作者已被å°ç¦"
msgid "This issue is in a child epic of the filtered epic"
msgstr "此议题在筛选å²è¯—çš„å­å²è¯—中"
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
-msgstr "该作业ä¾èµ–于其他产物已过期/已删除的作业:%{invalid_dependencies}"
+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 "当å‰ä½œä¸šéœ€åœ¨ä¸Šçº§ä½œä¸šæˆåŠŸåŽæ‰å¯è¢«å¯åŠ¨ã€‚"
@@ -38252,7 +38495,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 "此作业已å–消"
@@ -38386,9 +38629,6 @@ msgstr "此命å空间已被使用ï¼è¯·é€‰æ‹©å…¶ä»–命å空间。"
msgid "This only applies to repository indexing operations."
msgstr "è¿™åªé€‚用于仓库索引æ“作。"
-msgid "This option is only available on GitLab.com"
-msgstr "此选项仅在GitLab.com上å¯ç”¨"
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr "此页é¢ä¸å¯ç”¨ï¼Œæ‚¨æ— æƒè·¨é¡¹ç›®é˜…读相关信æ¯ã€‚"
@@ -38542,9 +38782,6 @@ msgstr "这将删除此项目与派生网络中其他项目之间的派生关系
msgid "Thread to reply to cannot be found"
msgstr "找ä¸åˆ°è¦å›žå¤çš„主题"
-msgid "Threat monitoring"
-msgstr "å¨èƒç›‘控"
-
msgid "ThreatMonitoring|Alert Details"
msgstr "警报详细信æ¯"
@@ -38713,9 +38950,6 @@ msgstr "第一次æ交至第一个评论的时间"
msgid "Time from last commit to merge"
msgstr "最åŽä¸€æ¬¡æ交到åˆå¹¶çš„时间"
-msgid "Time in seconds"
-msgstr "时间(秒)"
-
msgid "Time of import: %{importTime}"
msgstr "导入时间: %{importTime}"
@@ -38884,11 +39118,11 @@ msgstr "刚刚"
msgid "Timeago|right now"
msgstr "刚刚"
-msgid "Timeline|Turn timeline view off"
-msgstr "关闭时间线视图"
+msgid "Timeline|Turn recent updates view off"
+msgstr ""
-msgid "Timeline|Turn timeline view on"
-msgstr "å¼€å¯æ—¶é—´çº¿è§†å›¾"
+msgid "Timeline|Turn recent updates view on"
+msgstr ""
msgid "Timeout"
msgstr "超时"
@@ -38958,6 +39192,9 @@ msgstr "è¦æŽ¥å—此邀请,请登录。"
msgid "To access this domain create a new DNS record"
msgstr "è¦è®¿é—®æ­¤åŸŸï¼Œè¯·åˆ›å»ºæ–°çš„DNS记录"
+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 "è¦æ·»åŠ è‡ªå®šä¹‰åŽç¼€ï¼Œè¯·è®¾ç½®æœåŠ¡å°ç”µå­é‚®ä»¶åœ°å€ã€‚%{linkStart}了解更多。%{linkEnd}"
@@ -38967,6 +39204,9 @@ msgstr "如需手动添加æ¡ç›®ï¼Œè¯·åœ¨æ‰‹æœºåº”用中æ供以下信æ¯ã€‚"
msgid "To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request."
msgstr "è¦è®©æŸäººæŸ¥çœ‹åˆå¹¶è¯·æ±‚,请选择 %{strongStart}请求关注%{strongEnd}。å†æ¬¡é€‰æ‹©ä»¥ç§»é™¤è¯·æ±‚。"
+msgid "To complete registration, we need additional details from you."
+msgstr ""
+
msgid "To confirm, type %{phrase_code}"
msgstr "è¦ç¡®è®¤ï¼Œè¯·é”®å…¥ %{phrase_code}"
@@ -38983,7 +39223,7 @@ msgid "To connect an SVN repository, check out %{svn_link}."
msgstr "如è¦è¿žæŽ¥SVN仓库,请查看 %{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 "è¦ç»§ç»­ä½¿ç”¨ GitLab ä¼ä¸šç‰ˆï¼Œè¯·ä¸Šä¼  %{codeOpen}.gitlab-license%{codeClose} 文件或输入您从 GitLab Inc 收到的许å¯è¯å¯†é’¥ã€‚"
+msgstr "è¦ç»§ç»­ä½¿ç”¨ GitLab ä¼ä¸šç‰ˆï¼Œè¯·ä¸Šä¼  %{codeOpen}.gitlab-license%{codeClose} 文件或输入您从 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 "è¦ç»§ç»­ï¼Œæ‚¨éœ€è¦é€‰æ‹©æˆ‘们å‘é€çš„确认电å­é‚®ä»¶ä¸­çš„链接以验è¯æ‚¨çš„电å­é‚®ä»¶åœ°å€ã€‚如果您没有收到我们的电å­é‚®ä»¶ï¼Œè¯·é€‰æ‹© %{strongStart}é‡æ–°å‘é€ç¡®è®¤ç”µå­é‚®ä»¶ã€‚%{strongEnd}"
@@ -39018,9 +39258,6 @@ msgstr "首先,请您输入您的 Gitea æœåŠ¡å™¨åœ°å€å’Œä¸€ä¸ª %{link_to_per
msgid "To get started, use the link below to confirm your account."
msgstr "首先,请使用以下链接确认您的å¸æˆ·ã€‚"
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr "为了帮助改进GitLabåŠæå‡ç”¨æˆ·ä½“验, GitLab将定期收集使用信æ¯ã€‚"
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr "为了帮助改进GitLab,我们会定期%{docs_link}。您å¯ä»¥éšæ—¶é€šè¿‡%{settings_link}更改设置。"
@@ -39043,7 +39280,7 @@ msgid "To only use CI/CD features for an external repository, choose %{strong_op
msgstr "如需外部仓库仅使用CI/CD功能时,请选择%{strong_open}使用外部仓库è¿è¡ŒCI/CD%{strong_close}。"
msgid "To pass variables to the triggered pipeline, add %{code_start}variables[VARIABLE]=VALUE%{code_end} to the API request."
-msgstr "è‹¥è¦å°†å˜é‡ä¼ é€’到触å‘æµæ°´çº¿ï¼Œè¯·åœ¨ API 请求中添加 %{code_start}å˜é‡[VARIABLE]=VALUE%{code_end}。"
+msgstr "è‹¥è¦å°†å˜é‡ä¼ é€’到触å‘æµæ°´çº¿ï¼Œè¯·åœ¨ API 请求中添加 %{code_start}variables[VARIABLE]=VALUE%{code_end}。"
msgid "To personalize your GitLab experience, we'd like to know a bit more about you"
msgstr "为了个性化您的GitLab体验,我们想了解更多关于您的信æ¯"
@@ -39100,7 +39337,7 @@ msgid "To specify the notification level per project of a group you belong to, y
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 "è¦å¼€å§‹ä½¿ç”¨ GitLab ä¼ä¸šç‰ˆï¼Œè¯·ä¸Šä¼  %{codeOpen}.gitlab-license%{codeClose} 文件或输入您从 GitLab Inc 收到的许å¯è¯å¯†é’¥ã€‚"
+msgstr "è¦å¼€å§‹ä½¿ç”¨ä¼ä¸šç‰ˆï¼Œè¯·ä¸Šä¼  %{codeOpen}.gitlab-license%{codeClose} 文件或输入您从 GitLab Inc. 收到的许å¯è¯å¯†é’¥"
msgid "To unsubscribe from this issue, please paste the following link into your browser:"
msgstr "è‹¥è¦é€€è®¢æ­¤é—®é¢˜ï¼Œè¯·å°†ä»¥ä¸‹é“¾æŽ¥ç²˜è´´åˆ°æ‚¨çš„æµè§ˆå™¨ï¼š"
@@ -39265,10 +39502,13 @@ msgid "Topic avatar"
msgstr "主题头åƒ"
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
+msgstr "%{name} 的主题头åƒå°†è¢«åˆ é™¤ã€‚æ­¤æ“作无法撤消。"
+
+msgid "Topic slug (name)"
msgstr ""
-msgid "Topic name"
-msgstr "主题å称"
+msgid "Topic title"
+msgstr ""
msgid "Topic was successfully updated."
msgstr "主题已æˆåŠŸæ›´æ–°ã€‚"
@@ -39361,7 +39601,7 @@ 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 ""
+msgstr "群组包å«è”系人/组织,您没有足够的æƒé™å°†å®ƒä»¬ç§»åŠ¨åˆ°æ–°çš„根群组。"
msgid "TransferGroup|Group contains projects with NPM packages."
msgstr "群组包å«å¸¦æœ‰NPM软件包的项目。"
@@ -39507,8 +39747,8 @@ 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."
-msgstr "当分支或标签更新到上游仓库时触å‘管é“, å–决于上游存储库的活动,这å¯èƒ½ä¼šå¤§å¤§å¢žåŠ æ‚¨çš„ CI è¿è¡Œå™¨çš„è´Ÿè·ï¼Œ åªæœ‰å½“你知é“他们å¯ä»¥å¤„ç†è´Ÿè½½æ—¶æ‰å¯ç”¨æ­¤åŠŸèƒ½ã€‚"
+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 "触å‘器已删除。"
@@ -39546,6 +39786,9 @@ 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 "请é‡è¯•"
@@ -39553,7 +39796,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的所有功能。"
@@ -39588,9 +39831,6 @@ msgstr "å°è¯•ä¸Žæ‚¨çš„设备通信。请将其æ’入并立å³æŒ‰ä¸‹ä¸Šçš„按钮
msgid "Tuesday"
msgstr "星期二"
-msgid "Tuning settings"
-msgstr "调整设定"
-
msgid "Turn off"
msgstr "关闭"
@@ -39642,9 +39882,6 @@ msgstr "åŒå› ç´ å®½é™æœŸ"
msgid "Type"
msgstr "类型"
-msgid "Type/State"
-msgstr "类型/状æ€"
-
msgid "U2F Devices (%{length})"
msgstr "U2F设备(%{length})"
@@ -39750,6 +39987,9 @@ msgstr "无法获å–å¯èƒ½å­˜åœ¨æ¼æ´žçš„项目"
msgid "Unable to find Jira project to import data from."
msgstr "无法找到è¦å¯¼å…¥æ•°æ®çš„Jira项目。"
+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 "无法生æˆæ–°çš„实例 ID"
@@ -39760,7 +40000,7 @@ msgid "Unable to load file contents. Try again later."
msgstr "无法加载文件内容。ç¨åŽå†è¯•ã€‚"
msgid "Unable to load refs"
-msgstr ""
+msgstr "无法加载 refs"
msgid "Unable to load the diff"
msgstr "无法加载差异"
@@ -39799,7 +40039,7 @@ msgid "Unable to update this issue at this time."
msgstr "当å‰æ— æ³•æ›´æ–°è¿™ä¸ªè®®é¢˜ã€‚"
msgid "Unable to verify the user"
-msgstr ""
+msgstr "无法验è¯ç”¨æˆ·"
msgid "Unapprove a merge request"
msgstr "å–消批准åˆå¹¶è¯·æ±‚"
@@ -40029,9 +40269,6 @@ msgstr "更新失败"
msgid "Update it"
msgstr "æ›´æ–°"
-msgid "Update iteration"
-msgstr "更新迭代"
-
msgid "Update milestone"
msgstr "更新里程碑"
@@ -40080,9 +40317,6 @@ msgstr "由%{updated_by}更新于%{updated_at}"
msgid "Updated date"
msgstr "更新日期"
-msgid "Updates"
-msgstr "æ›´æ–°"
-
msgid "Updating"
msgstr "更新中"
@@ -40188,6 +40422,12 @@ msgstr "CI 分钟使用é‡ï¼ˆæŒ‰æœˆï¼‰"
msgid "UsageQuota|CI minutes usage by project"
msgstr "CI 分钟使用é‡ï¼ˆæŒ‰é¡¹ç›®ï¼‰"
+msgid "UsageQuota|CI/CD minutes usage"
+msgstr ""
+
+msgid "UsageQuota|CI/CD minutes usage since %{timeElapsed}"
+msgstr ""
+
msgid "UsageQuota|Code packages and container images."
msgstr "代ç åŒ…和容器镜åƒã€‚"
@@ -40197,8 +40437,8 @@ msgstr "当å‰å‘¨æœŸä½¿ç”¨é‡"
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr "文件附件和较å°çš„设计图表。"
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
-msgstr "从 %{storage_enforcement_date} 开始,存储é™åˆ¶å°†åº”用于此命å空间。在 %{strong_start}%{namespace_type} 设置 &gt; 使用é…é¢%{strong_end} 中查看和管ç†æ‚¨çš„使用é‡ã€‚"
+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 "Git仓库。"
@@ -40248,6 +40488,9 @@ msgstr "席ä½"
msgid "UsageQuota|Shared bits of code and text."
msgstr "代ç å’Œæ–‡æœ¬çš„共享bits。"
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr "代ç ç‰‡æ®µ"
@@ -40296,6 +40539,12 @@ 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 "%{strong_start}%{group_name}%{strong_end}群组中的项目使用群组资æºçŠ¶å†µ"
@@ -40308,9 +40557,6 @@ msgstr "您的项目中资æºä½¿ç”¨æƒ…况"
msgid "UsageQuota|Usage quotas help link"
msgstr "使用é…é¢å¸®åŠ©é“¾æŽ¥"
-msgid "UsageQuota|Usage since"
-msgstr "使用é‡è‡ª"
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr "当您购买更多的存储空间时,我们会自动解é”达到%{actualRepositorySizeLimit}é™åˆ¶æ—¶è¢«é”定的项目。"
@@ -40461,8 +40707,8 @@ msgstr "对多个关键字使用åŒå¼•å·ï¼Œä¾‹å¦‚ %{code_open}\"您的æœç´¢\"%
msgid "Use hashed storage"
msgstr "使用哈希存储"
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
-msgstr "对新创建和é‡å‘½å的仓库使用哈希存储路径。从 13.0 版起始终å¯ç”¨ã€‚"
+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 "使用议题计数"
@@ -40857,8 +41103,8 @@ msgstr "用户 API 调用速率é™åˆ¶"
msgid "Users can launch a development environment from a GitLab browser tab when the %{linkStart}Gitpod%{linkEnd} integration is enabled."
msgstr "%{linkStart}Gitpod%{linkEnd} 集æˆåŽï¼Œç”¨æˆ·å¯ä»¥ä»Ž GitLab æµè§ˆå™¨é€‰é¡¹å¡å¯åŠ¨å¼€å‘环境。"
-msgid "Users can reactivate their account by signing in."
-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 "用户å¯ä»¥ä½¿ç”¨ Kroki 在 AsciiDocã€Markdownã€reStructuredText å’Œ Textile 文档中渲染图表。"
@@ -41052,9 +41298,6 @@ msgstr "电å­é‚®ä»¶ç›¸å…³è®¾ç½®"
msgid "Various settings that affect GitLab performance."
msgstr "å½±å“GitLab性能相关设置。"
-msgid "Verification concurrency limit"
-msgstr "验è¯å¹¶å‘é™åˆ¶"
-
msgid "Verification status"
msgstr "验è¯çŠ¶æ€"
@@ -41533,7 +41776,7 @@ msgid "Vulnerability|Cluster"
msgstr "集群"
msgid "Vulnerability|Code Review"
-msgstr "代ç å®¡æŸ¥"
+msgstr "代ç è¯„审"
msgid "Vulnerability|Comments"
msgstr "注释"
@@ -41595,8 +41838,8 @@ msgstr "标识"
msgid "Vulnerability|Image"
msgstr "é•œåƒ"
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
-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 "了解有关此æ¼æ´žçš„更多信æ¯ä»¥åŠè§£å†³å®ƒçš„最佳方法。"
@@ -41698,7 +41941,7 @@ msgid "Warning: Synchronizing LDAP removes direct members' access."
msgstr "警告:åŒæ­¥ LDAP 会删除直接æˆå‘˜çš„访问æƒé™ã€‚"
msgid "Watch how"
-msgstr ""
+msgstr "观看如何使用"
msgid "We are currently unable to fetch data for the pipeline header."
msgstr "我们目å‰æ— æ³•èŽ·å–æ­¤æµæ°´çº¿æŠ¥å¤´çš„æ•°æ®ã€‚"
@@ -41706,9 +41949,6 @@ msgstr "我们目å‰æ— æ³•èŽ·å–æ­¤æµæ°´çº¿æŠ¥å¤´çš„æ•°æ®ã€‚"
msgid "We are currently unable to fetch data for this graph."
msgstr "我们目å‰æ— æ³•èŽ·å–此图表的数æ®ã€‚"
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr "我们目å‰æ— æ³•èŽ·å–æ­¤æµæ°´çº¿çš„æ•°æ®ã€‚"
-
msgid "We could not determine the path to remove the epic"
msgstr "我们无法确定删除å²è¯—的路径"
@@ -41856,8 +42096,8 @@ msgstr "Webhooks帮助"
msgid "Webhooks|A comment is added to a confidential issue."
msgstr "一æ¡è¯„论被添加到机密议题。"
-msgid "Webhooks|A comment is added to an 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 "已创建ã€æ›´æ–°ã€å…³é—­æˆ–é‡æ–°æ‰“开机密议题。"
@@ -42001,7 +42241,7 @@ msgid "Webhooks|Wiki page events"
msgstr "Wiki页é¢äº‹ä»¶"
msgid "Website"
-msgstr ""
+msgstr "网站"
msgid "Website:"
msgstr "网站:"
@@ -42051,9 +42291,6 @@ msgstr "什么是项目审计事件?"
msgid "What does this command do?"
msgstr "这个命令有什么作用?"
-msgid "What is Auto DevOps?"
-msgstr "什么是 Auto DevOps?"
-
msgid "What is Markdown?"
msgstr "什么是 Markdown?"
@@ -42063,9 +42300,6 @@ msgstr "什么是仓库镜åƒï¼Ÿ"
msgid "What is squashing?"
msgstr "什么是压缩?"
-msgid "What is time tracking?"
-msgstr "什么是时间追踪?"
-
msgid "What is your job title? (optional)"
msgstr "您的工作èŒä½æ˜¯ä»€ä¹ˆï¼Ÿ(å¯é€‰)"
@@ -42093,8 +42327,8 @@ msgstr "如果å¯ç”¨ï¼Œåˆ™ä¸å†æŽ¥å—无过期日期或无效过期日期的 SS
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr "å¯ç”¨åŽï¼Œæ¸…ç†ç­–略执行速度更快,但会给 Redis 带æ¥æ›´å¤šè´Ÿè½½ã€‚"
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
-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 "å¯ç”¨åŽï¼ŒDatadog 会收集作业日志并与æµæ°´çº¿æ‰§è¡Œè·Ÿè¸ªä¸€èµ·æ˜¾ç¤ºã€‚"
@@ -42102,9 +42336,6 @@ msgstr "å¯ç”¨åŽï¼ŒDatadog 会收集作业日志并与æµæ°´çº¿æ‰§è¡Œè·Ÿè¸ªä¸€è
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr "当默认分支中的åˆå¹¶è¯·æ±‚å’Œæ交关闭时,它们引用的任何议题也会关闭。"
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr "æš‚åœæ—¶ï¼ŒGitLab ä»ä¼šè·Ÿè¸ªæ›´æ”¹ï¼Œè¿™å¯¹äºŽé›†ç¾¤/索引è¿ç§»å¾ˆæœ‰ç”¨ã€‚"
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] "当åˆå¹¶è¯·æ±‚被接å—æ—¶"
@@ -42113,7 +42344,7 @@ msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{
msgstr "使用%{code_open}http://%{code_close}或%{code_open}https://%{code_close}å议时,请æ供仓库的实际地å€ã€‚ä¸æ”¯æŒHTTPé‡å®šå‘。"
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 ""
+msgstr "当您将您的项目转移到一个群组时,你å¯ä»¥è½»æ¾åœ°ç®¡ç†å¤šä¸ªé¡¹ç›®ã€‚查看存储ã€æµæ°´çº¿åˆ†é’Ÿæ•°å’Œç”¨æˆ·çš„使用é…é¢ï¼Œå¹¶å¼€å§‹è¯•ç”¨æˆ–å‡çº§åˆ°ä»˜è´¹çº§åˆ«ã€‚"
msgid "When:"
msgstr "当:"
@@ -42145,8 +42376,8 @@ msgstr "è°å°†ä½¿ç”¨æ­¤GitLab试用?"
msgid "Who will be using this group?"
msgstr "è°å°†ä½¿ç”¨è¿™ä¸ªç¾¤ç»„?"
-msgid "Why are you signing up? (Optional)"
-msgstr "您为什么è¦æ³¨å†Œï¼Ÿ(å¯é€‰)"
+msgid "Why are you signing up? (optional)"
+msgstr ""
msgid "Wiki"
msgstr "Wiki"
@@ -42379,21 +42610,30 @@ msgstr "正在进行中(开放和未分é…)"
msgid "Work in progress Limit"
msgstr "“进行中â€é™åˆ¶"
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr "转æ¢ä¸ºå·¥ä½œé¡¹"
msgid "WorkItem|Create work item"
msgstr "创建工作项"
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr "新建任务"
msgid "WorkItem|Select type"
-msgstr ""
+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 "获å–工作项时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
@@ -42401,7 +42641,7 @@ msgid "WorkItem|Something went wrong when fetching work item types. Please try a
msgstr "获å–工作项类型时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "WorkItem|Something went wrong while updating the work item. Please try again."
-msgstr ""
+msgstr "更新工作项时出现错误,请å†è¯•ä¸€æ¬¡ã€‚"
msgid "WorkItem|Type"
msgstr "类型"
@@ -42409,6 +42649,9 @@ msgstr "类型"
msgid "WorkItem|Work Items"
msgstr "工作事项"
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr "您è¦åˆ›å»ºä¸€ä¸ªæ–°åˆ†æ”¯å—?"
@@ -42472,6 +42715,10 @@ msgstr "您已有针对此警报的待处ç†çš„待办事项"
msgid "You are about to add %{usersTag} people to the discussion. They will all receive a notification."
msgstr "å³å°†æŠŠ%{usersTag}相关人员添加到讨论中。他们都会收到通知。"
+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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr "您将è¦åˆ é™¤æ­¤æ´¾ç”Ÿé¡¹ç›®ï¼Œå…¶ä¸­åŒ…å«ï¼š"
@@ -42568,8 +42815,8 @@ msgstr "当å‰æ­£åœ¨è®¿é—®åªè¯» GitLab 实例。"
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr "您收到此消æ¯æ˜¯å› ä¸ºæ‚¨æ˜¯ %{url} çš„GitLab管ç†å‘˜ã€‚"
-msgid "You are signed in to GitLab as %{user_link}"
-msgstr "您以 %{user_link} 的身份登录 GitLab"
+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 "您正在å°è¯•ä¸Šä¼ éžå›¾ç‰‡æ–‡ä»¶ã€‚请上传.pngã€.jpgã€.jpegã€.gifã€.bmpã€.tiff或.ico。"
@@ -42739,6 +42986,9 @@ msgstr "您也å¯ä»¥é€šè¿‡%{linkStart}Lint%{linkEnd}测试.gitlab-ci.yml."
msgid "You can view the source or %{linkStart}%{cloneIcon} clone the repository%{linkEnd}"
msgstr "您å¯ä»¥æŸ¥çœ‹æºä»£ç æˆ–%{linkStart}%{cloneIcon}克隆仓库%{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 ""
+
msgid "You cannot %{action} %{state} users."
msgstr "您ä¸èƒ½ %{action} %{state} 用户。"
@@ -43098,7 +43348,7 @@ msgid "YouTube URL or ID"
msgstr "YouTube URL或ID"
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 ""
+msgstr "您的 %{doc_link_start}命å空间%{doc_link_end},%{strong_start}%{namespace_name}%{strong_end} 有超过 %{free_limit} 个æˆå‘˜ã€‚从 2022 å¹´ 6 月 22 日起,将é™åˆ¶ä¸º %{free_limit} 个,其余æˆå‘˜å°†å¤„于 %{link_start} 超过é™åˆ¶%{link_end} 状æ€å¹¶å¤±åŽ»å¯¹å‘½å空间的访问æƒé™ã€‚您å¯ä»¥è½¬åˆ°ä½¿ç”¨é‡é…é¢é¡µé¢ï¼Œæ¥ç®¡ç†å°† %{free_limit} 个æˆå‘˜ä¿ç•™åœ¨æ‚¨çš„命å空间中。è¦èŽ·å¾—更多会员,所有者å¯ä»¥å¼€å§‹è¯•ç”¨æˆ–å‡çº§åˆ°ä»˜è´¹è®¡åˆ’。"
msgid "Your %{group} membership will now expire in %{days}."
msgstr "您的%{group}æˆå‘˜èµ„格将在%{days}天内到期。"
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr "您的 %{spammable_entity_type} 已被识别为垃圾邮件。请更改内容或解决 reCAPTCHA æ¥ç»§ç»­ã€‚"
@@ -43440,15 +43693,15 @@ msgstr "è¾“å…¥æ–°çš„ç¦…é“ API 令牌"
msgid "ZentaoIntegration|If different from Web URL."
msgstr "如果与 Web URL ä¸åŒã€‚"
-msgid "ZentaoIntegration|Issue list"
-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 "ç¦…é“ API URL(å¯é€‰ï¼‰"
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] "批准"
-msgid "approved by: "
-msgstr "已核准人: "
-
msgid "archived"
msgstr "已存档"
@@ -43593,6 +43843,15 @@ msgstr "åªèƒ½åŒ…å«Base64å­—æ¯è¡¨(RFC4648)中的字æ¯ï¼Œä»¥åŠâ€œ@â€ã€â€œ:â
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 "åªèƒ½ç”±ç¾¤ç»„管ç†å‘˜æ›´æ”¹ã€‚"
@@ -43729,6 +43988,9 @@ 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 "在新分支中自动应用补ä¸"
@@ -43845,13 +44107,13 @@ msgid "ciReport|Investigate this vulnerability by creating an issue"
msgstr "通过创建议题æ¥è°ƒæŸ¥æ­¤æ¼æ´ž"
msgid "ciReport|License Compliance"
-msgstr ""
+msgstr "许å¯è¯åˆè§„"
msgid "ciReport|License Compliance failed loading results"
-msgstr ""
+msgstr "许å¯è¯åˆè§„加载结果失败"
msgid "ciReport|License Compliance test metrics results are being parsed"
-msgstr ""
+msgstr "正在解æžè®¸å¯è¯åˆè§„性测试指标结果"
msgid "ciReport|Load Performance"
msgstr "负载性能"
@@ -43879,7 +44141,7 @@ msgid "ciReport|Manage licenses"
msgstr "管ç†è®¸å¯è¯"
msgid "ciReport|Manually Added"
-msgstr ""
+msgstr "已手动添加"
msgid "ciReport|New"
msgstr "新增"
@@ -43909,7 +44171,7 @@ msgid "ciReport|Secret Detection detects secrets and credentials vulnerabilities
msgstr "Secret 检测在æºä»£ç ä¸­æ£€æµ‹ Secrets 和凭æ®æ¼æ´žã€‚"
msgid "ciReport|Secret detection"
-msgstr "Secret 检测"
+msgstr "密ç æ£€æµ‹"
msgid "ciReport|Security scanning"
msgstr "安全扫æ"
@@ -44092,7 +44354,7 @@ msgid "email '%{email}' is not a verified email."
msgstr "邮箱“%{email}â€è¿˜æœªè¢«éªŒè¯ã€‚"
msgid "email address settings"
-msgstr ""
+msgstr "电å­é‚®ä»¶åœ°å€è®¾ç½®"
msgid "enabled"
msgstr "å·²å¯ç”¨"
@@ -44429,14 +44691,14 @@ msgstr "渲染此数学表达å¼æ—¶å‡ºé”™"
msgid "member"
msgid_plural "members"
-msgstr[0] ""
+msgstr[0] "æˆå‘˜"
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "åˆå¹¶è¯·æ±‚"
-msgid "merged %{timeAgo}"
-msgstr "åˆå¹¶äºŽ%{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
+msgstr ""
msgid "metric_id must be unique across a project"
msgstr "metric_id必须是整个项目唯一的"
@@ -44447,6 +44709,12 @@ 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 "1个åˆå¹¶æ交"
@@ -44456,6 +44724,12 @@ msgstr "将 %{commitCount} 和 %{mergeCommitCount} 添加到 %{targetBranch}%{sq
msgid "mrWidgetCommitsAdded|Adds %{commitCount} to %{targetBranch}."
msgstr "将 %{commitCount} 添加到 %{targetBranch}。"
+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 "æ­¤åˆå¹¶è¯·æ±‚ä¸åŒ…å«ä»»ä½•æ›´æ”¹ã€‚"
@@ -44534,9 +44808,6 @@ msgstr "将这个议题分é…给自己"
msgid "mrWidget|Cancel auto-merge"
msgstr "å–消自动åˆå¹¶"
-msgid "mrWidget|Check out branch"
-msgstr "检出分支"
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr "正在检查åˆå¹¶è¯·æ±‚是å¦å¯ä»¥åˆå¹¶â€¦"
@@ -44577,9 +44848,6 @@ msgstr "关闭"
msgid "mrWidget|Does not delete the source branch"
msgstr "ä¸åˆ é™¤æºåˆ†æ”¯"
-msgid "mrWidget|Email patches"
-msgstr "通过电å­é‚®ä»¶å‘出补ä¸"
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr "无法加载部署统计信æ¯"
@@ -44689,9 +44957,6 @@ msgstr "在 Gitpod 中打开"
msgid "mrWidget|Open in Web IDE"
msgstr "在Web IDE中打开"
-msgid "mrWidget|Plain diff"
-msgstr "文本差异"
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr "请还原它或使用ä¸åŒçš„ %{type} 分支。"
@@ -44839,6 +45104,9 @@ msgstr "my-awesome-group"
msgid "my-channel"
msgstr "我的频é“"
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr "需è¦å…³æ³¨"
@@ -44854,9 +45122,6 @@ msgstr "æ°¸ä¸è¿‡æœŸ"
msgid "new merge request"
msgstr "新建åˆå¹¶è¯·æ±‚"
-msgid "no approvers"
-msgstr "无核准人"
-
msgid "no expiration"
msgstr "无过期"
@@ -44872,6 +45137,12 @@ msgstr "未选择范围"
msgid "none"
msgstr "æ— "
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr "未找到"
@@ -44928,9 +45199,6 @@ msgstr "待处ç†çš„评论"
msgid "pending deletion"
msgstr "待删除"
-msgid "per day"
-msgstr "æ¯æ—¥"
-
msgid "personal access token"
msgstr "个人访问令牌"
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] "æ¡å›žå¤"
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr "仓库"
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index c9eeaf4a13e..ecc43b67289 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:17\n"
+"PO-Revision-Date: 2022-05-01 06:58\n"
msgid " %{start} to %{end}"
msgstr ""
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] ""
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] ""
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] ""
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] ""
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ 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 ""
@@ -694,9 +689,6 @@ msgstr ""
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr ""
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr ""
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr ""
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "第一個貢ç»!"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr ""
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr ""
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-msgstr ""
-
msgid "A basic page and serverless function that uses AWS Lambda, AWS API Gateway, and GitLab Pages"
msgstr ""
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr ""
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr "新增連çµ"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr ""
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr ""
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr ""
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr ""
@@ -3500,6 +3558,9 @@ msgstr ""
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,14 +3576,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-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 ""
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr ""
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 ""
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr ""
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr ""
-msgid "Analyze a review version of your web application."
-msgstr ""
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+msgid "Billing|An error occurred while getting a billable member details."
msgstr ""
-msgid "Billing|An error occurred while loading billable members list"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr "å–消"
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr "將標題改為「%{title_param}ã€ã€‚"
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
+msgstr ""
+
+msgid "ClusterAgents|Revoke access token?"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr "æ交者:"
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr "建立分支"
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr "目錄å稱"
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr "截止日期"
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr "編輯議題"
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr "已開始維護"
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr "循環週期"
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr "åˆä½µè«‹æ±‚"
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "å一月"
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr ""
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scan type"
+msgstr ""
+
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr "無法刪除項目導出。"
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr "項目導出已被刪除。"
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr "å–代"
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr "申請權é™"
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr "åœ¨ç¶²é  IDE 中開啟"
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr "æ–°åˆä½µè«‹æ±‚"
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr "ç„¡"
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index 4524e6d60ed..b277052bbcb 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: /[gitlab-org.GitLab] master/locale/gitlab.pot\n"
"X-Crowdin-File-ID: 6\n"
-"PO-Revision-Date: 2022-04-01 09:11\n"
+"PO-Revision-Date: 2022-05-01 06:53\n"
msgid " %{start} to %{end}"
msgstr " %{start} 到 %{end}"
@@ -226,10 +226,6 @@ msgid "%d group"
msgid_plural "%d groups"
msgstr[0] ""
-msgid "%d group selected"
-msgid_plural "%d groups selected"
-msgstr[0] "é¸å–了 %d 個群組"
-
msgid "%d hour"
msgid_plural "%d hours"
msgstr[0] "%d å°æ™‚"
@@ -322,10 +318,6 @@ msgid "%d second"
msgid_plural "%d seconds"
msgstr[0] "%d秒"
-msgid "%d shard selected"
-msgid_plural "%d shards selected"
-msgstr[0] "%d 個檔案已é¸å–"
-
msgid "%d star"
msgid_plural "%d stars"
msgstr[0] ""
@@ -430,7 +422,7 @@ msgstr ""
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 tags."
+msgid "%{code_open}Protected:%{code_close} Only exposed to protected branches or protected tags."
msgstr ""
msgid "%{commit_author_link} authored %{commit_authored_timeago}"
@@ -565,6 +557,9 @@ msgstr "%{edit_in_new_fork_notice} è«‹å†æ¬¡å˜—試上傳檔案。"
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 "還有 %{extra} 個下游æµæ°´ç·š"
@@ -694,9 +689,6 @@ msgstr "%{group_level_name} 群組ä¸å…許 %{level_name} 。"
msgid "%{level_name} is not allowed since the fork source project has lower visibility."
msgstr "由於分å‰çš„æºé …ç›®å¯è¦‹æ€§è¼ƒä½Žï¼Œå› æ­¤ä¸å…許使用 %{level_name}。"
-msgid "%{linkStart}Learn more.%{linkEnd}"
-msgstr ""
-
msgid "%{link_start}Add a license%{link_end} that you have received from GitLab Inc."
msgstr ""
@@ -706,9 +698,6 @@ 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 "%{link_start}What information does GitLab Inc. collect?%{link_end}"
-msgstr ""
-
msgid "%{listToShow}, and %{awardsListLength} more"
msgstr ""
@@ -872,9 +861,6 @@ msgid "%{securityScanner} result is not available because a pipeline has not bee
msgid_plural "%{securityScanner} results are not available because a pipeline has not been run since it was enabled. %{linkStart}Run a pipeline%{linkEnd}"
msgstr[0] ""
-msgid "%{service_ping_link_start}What information is shared with GitLab Inc.?%{service_ping_link_end}"
-msgstr ""
-
msgid "%{size} %{unit}"
msgstr ""
@@ -1177,9 +1163,6 @@ msgid "+%d more"
msgid_plural "+%d more"
msgstr[0] ""
-msgid "+%{approvers} more approvers"
-msgstr ""
-
msgid "+%{extra} more"
msgstr ""
@@ -1239,6 +1222,9 @@ msgstr ""
msgid "/"
msgstr ""
+msgid "/day"
+msgstr ""
+
msgid "0 bytes"
msgstr ""
@@ -1340,6 +1326,9 @@ msgstr[0] ""
msgid "1-9 contributions"
msgstr "1-9 é …è²¢ç»"
+msgid "1. Effective June 1, 2022, all free tier public projects will be %{minutes_quota_link}."
+msgstr ""
+
msgid "10-19 contributions"
msgstr "10-19 é …è²¢ç»"
@@ -1352,6 +1341,9 @@ msgstr ""
msgid "1st contribution!"
msgstr "您的第一次貢ç»ï¼"
+msgid "2. Before July 1, 2022, all free tier public open source projects will need to %{enrollment_link} to continue to receive GitLab Ultimate benefits."
+msgstr ""
+
msgid "20-29 contributions"
msgstr "20-29 é …è²¢ç»"
@@ -1427,9 +1419,6 @@ msgstr ""
msgid "A Let's Encrypt SSL certificate can not be obtained until your domain is verified."
msgstr "在網域驗證之å‰ï¼Œæˆ‘們無法å–å¾— Encrype SSL 憑證。"
-msgid "A Metrics Dashboard menu item appears in the Monitoring section of the Admin Area."
-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 的基本é é¢å’Œç„¡ä¼ºæœå™¨åŠŸèƒ½"
@@ -1475,9 +1464,6 @@ msgstr ""
msgid "A member of the abuse team will review your report as soon as possible."
msgstr "濫用審查團隊æˆå“¡å°‡æœƒå„˜å¿«æª¢é–±æ‚¨çš„報告。"
-msgid "A merge request hasn't yet been merged"
-msgstr ""
-
msgid "A new Auto DevOps pipeline has been created, go to the Pipelines page for details"
msgstr ""
@@ -1502,6 +1488,9 @@ 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 ""
@@ -1853,9 +1842,6 @@ msgstr ""
msgid "AccountValidation|I'll bring my own runners"
msgstr ""
-msgid "AccountValidation|If you no longer wish to receive marketing emails from us,"
-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 ""
@@ -1871,12 +1857,6 @@ 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 "AccountValidation|unsubscribe"
-msgstr ""
-
-msgid "AccountValidation|you may %{unsubscribe_link} at any time."
-msgstr ""
-
msgid "Acknowledge"
msgstr ""
@@ -1997,9 +1977,6 @@ msgstr ""
msgid "Add a link"
msgstr "加入連çµ"
-msgid "Add a link to Grafana"
-msgstr ""
-
msgid "Add a new issue"
msgstr ""
@@ -2048,6 +2025,9 @@ msgstr "加入核准è¦å‰‡"
msgid "Add approvers"
msgstr ""
+msgid "Add attention request"
+msgstr ""
+
msgid "Add bold text"
msgstr "加入粗體文字"
@@ -2207,15 +2187,15 @@ msgstr ""
msgid "AddContextCommits|Add/remove"
msgstr ""
-msgid "AddMember|Emails cannot be blank"
-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 ""
@@ -2468,12 +2448,6 @@ msgstr ""
msgid "AdminDashboard|Error loading the statistics. Please try again"
msgstr "載入統計資料時發生錯誤。請å†è©¦ä¸€æ¬¡"
-msgid "AdminGeo|The URL of the primary site that is used internally by the secondary sites."
-msgstr ""
-
-msgid "AdminGeo|The URL of the secondary site that is used internally by the primary site."
-msgstr ""
-
msgid "AdminLabels|Define your default set of project labels"
msgstr ""
@@ -2510,6 +2484,9 @@ msgstr ""
msgid "AdminSettings|Configure Let's Encrypt"
msgstr ""
+msgid "AdminSettings|Disable Elasticsearch until indexing completes."
+msgstr ""
+
msgid "AdminSettings|Disable feed token"
msgstr ""
@@ -2522,12 +2499,39 @@ 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 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 ""
@@ -2537,12 +2541,24 @@ 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|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 ""
@@ -2573,18 +2589,39 @@ 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|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 ""
@@ -2594,6 +2631,9 @@ 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|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 ""
@@ -2624,9 +2664,27 @@ 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|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 "AdminStatistics|Active Users"
msgstr "æ´»èºä½¿ç”¨è€…"
@@ -3500,6 +3558,9 @@ msgstr "所有專案"
msgid "All projects selected"
msgstr ""
+msgid "All protected branches"
+msgstr ""
+
msgid "All threads resolved"
msgstr ""
@@ -3515,14 +3576,20 @@ 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 ""
msgid "Allow access to the following IP addresses"
msgstr ""
-msgid "Allow commits from members who can merge to the target branch."
-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 "å…è¨±ç¾¤çµ„æ‰€æœ‰è€…ç®¡ç† LDAP 相關的設定"
@@ -3563,9 +3630,6 @@ msgstr ""
msgid "Allow this key to push to this repository"
msgstr ""
-msgid "Allow this secondary site to replicate content on Object Storage"
-msgstr ""
-
msgid "Allow use of licensed EE features"
msgstr ""
@@ -3581,9 +3645,6 @@ msgstr "å…許使用者請求存å–(如果å¯è¦‹æ€§æ˜¯å…¬é–‹æˆ–內部)"
msgid "Allowed"
msgstr ""
-msgid "Allowed Geo IP"
-msgstr ""
-
msgid "Allowed characters: +, 0-9, -, and spaces."
msgstr ""
@@ -3953,6 +4014,9 @@ 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 "移除å²è©©æ™‚發生錯誤。"
@@ -4026,9 +4090,6 @@ msgstr ""
msgid "An error occurred while uploading the file. Please try again."
msgstr ""
-msgid "An error occurred while uploading the image. Please try again."
-msgstr ""
-
msgid "An error occurred while validating group path"
msgstr "驗證群組路徑時發生錯誤"
@@ -4095,9 +4156,6 @@ msgstr ""
msgid "Analytics"
msgstr "分æž"
-msgid "Analyze a review version of your web application."
-msgstr "分æžç¶²é æ‡‰ç”¨ç¨‹å¼çš„審閱版本。"
-
msgid "Analyze your dependencies for known vulnerabilities."
msgstr ""
@@ -4128,6 +4186,9 @@ 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 ""
@@ -4206,12 +4267,27 @@ msgstr ""
msgid "Application: %{name}"
msgstr ""
-msgid "ApplicationSettings|After sign up text"
+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] ""
@@ -4247,37 +4323,34 @@ msgstr ""
msgid "ApplicationSettings|Email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enable domain denylist for sign ups"
+msgid "ApplicationSettings|Enable Slack application"
msgstr ""
-msgid "ApplicationSettings|Enable email restrictions for sign ups"
+msgid "ApplicationSettings|Enable domain denylist for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Enter denylist manually"
+msgid "ApplicationSettings|Enable email restrictions for sign-ups"
msgstr ""
-msgid "ApplicationSettings|Markdown enabled"
+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) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
-msgstr ""
-
-msgid "ApplicationSettings|Once the instance reaches the user cap, any user who is added or requests access will have to be approved by an admin. Leave the field empty for unlimited."
+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. See the %{linkStart}supported syntax%{linkEnd} for more information."
+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 GitLab's %{linkStart}Password Policy Guidelines%{linkEnd}."
msgstr ""
msgid "ApplicationSettings|Send confirmation email on sign-up"
@@ -4286,22 +4359,22 @@ msgstr ""
msgid "ApplicationSettings|Sign-up enabled"
msgstr ""
-msgid "ApplicationSettings|Upload denylist file"
+msgid "ApplicationSettings|Text shown after a user signs up. Markdown enabled."
msgstr ""
-msgid "ApplicationSettings|User cap"
+msgid "ApplicationSettings|This option is only available on GitLab.com"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com"
+msgid "ApplicationSettings|Upload denylist file"
msgstr ""
-msgid "ApplicationSettings|Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines or commas for multiple entries."
+msgid "ApplicationSettings|User cap"
msgstr ""
-msgid "ApplicationSettings|When enabled, any user visiting %{host} and creating an account will have to be explicitly approved by an admin before they can sign in. This setting is effective only if sign-ups are enabled."
+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|When enabled, any user visiting %{host} will be able to create an account."
+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"
@@ -4356,9 +4429,6 @@ msgstr ""
msgid "Applying suggestions..."
msgstr ""
-msgid "Approval Status"
-msgstr ""
-
msgid "Approval rules"
msgstr ""
@@ -4546,15 +4616,6 @@ 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 "ApprovalStatusTooltip|Adheres to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|At least one rule does not adhere to separation of duties"
-msgstr ""
-
-msgid "ApprovalStatusTooltip|Fails to adhere to separation of duties"
-msgstr ""
-
msgid "Approvals are optional."
msgstr ""
@@ -5083,7 +5144,7 @@ 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."
+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"
@@ -5122,6 +5183,9 @@ 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 ""
@@ -5308,7 +5372,7 @@ msgstr ""
msgid "Available group runners: %{runners}"
msgstr ""
-msgid "Available runners: %{runners}"
+msgid "Available on-demand"
msgstr ""
msgid "Available shared runners:"
@@ -5461,7 +5525,7 @@ msgstr ""
msgid "Based on"
msgstr ""
-msgid "Basic information"
+msgid "Batch size"
msgstr ""
msgid "Be careful. Changing the project's namespace can have unintended side effects."
@@ -5491,9 +5555,6 @@ msgstr ""
msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Beta"
-msgstr ""
-
msgid "Bi-weekly code coverage"
msgstr ""
@@ -5599,12 +5660,21 @@ 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|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 ""
@@ -5632,22 +5702,28 @@ 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"
+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"
+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"
+msgid "Billing|An error occurred while removing a billable member."
msgstr ""
msgid "Billing|Awaiting member signup"
@@ -5662,15 +5738,21 @@ msgstr ""
msgid "Billing|Enter at least three characters to search."
msgstr ""
+msgid "Billing|Explore all plans"
+msgstr ""
+
msgid "Billing|Export list"
msgstr ""
-msgid "Billing|Group"
+msgid "Billing|Free groups on GitLab are limited to %{maxNamespaceSeats} seats"
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 ""
@@ -5695,9 +5777,6 @@ msgstr ""
msgid "Billing|User was successfully removed"
msgstr ""
-msgid "Billing|Users occupying seats in"
-msgstr ""
-
msgid "Billing|View pending approvals"
msgstr ""
@@ -6088,9 +6167,6 @@ msgstr ""
msgid "Branches|Please type the following to confirm:"
msgstr ""
-msgid "Branches|Protected branches can be managed in %{project_settings_link}."
-msgstr ""
-
msgid "Branches|Show active branches"
msgstr ""
@@ -6148,9 +6224,6 @@ msgstr ""
msgid "Branches|merged"
msgstr ""
-msgid "Branches|project settings"
-msgstr ""
-
msgid "Branches|protected"
msgstr ""
@@ -6211,6 +6284,9 @@ msgstr ""
msgid "BulkImport|Destination"
msgstr ""
+msgid "BulkImport|Destination group"
+msgstr ""
+
msgid "BulkImport|Existing groups"
msgstr ""
@@ -6226,6 +6302,9 @@ 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 ""
@@ -6250,9 +6329,6 @@ msgstr ""
msgid "BulkImport|Name already used as a target for another group."
msgstr ""
-msgid "BulkImport|New group"
-msgstr ""
-
msgid "BulkImport|No additional information provided."
msgstr ""
@@ -6379,9 +6455,6 @@ msgstr ""
msgid "CI variables"
msgstr ""
-msgid "CI will run using the credentials assigned above."
-msgstr ""
-
msgid "CI/CD"
msgstr ""
@@ -6397,6 +6470,9 @@ msgstr ""
msgid "CI/CD configuration file"
msgstr ""
+msgid "CI/CD minutes"
+msgstr ""
+
msgid "CI/CD|No projects have been added to the scope"
msgstr ""
@@ -6412,6 +6488,9 @@ msgstr ""
msgid "CICDAnalytics|Lead time"
msgstr ""
+msgid "CICDAnalytics|No shared runner minute usage data available"
+msgstr ""
+
msgid "CICDAnalytics|Projects with releases"
msgstr ""
@@ -6482,7 +6561,7 @@ 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."
+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."
@@ -6650,6 +6729,12 @@ msgstr ""
msgid "Cancel and close"
msgstr ""
+msgid "Cancel downstream pipeline"
+msgstr ""
+
+msgid "Cancel editing"
+msgstr ""
+
msgid "Cancel index deletion"
msgstr ""
@@ -6884,9 +6969,15 @@ 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 ""
@@ -6905,6 +6996,9 @@ msgstr ""
msgid "Changes the title to \"%{title_param}\"."
msgstr ""
+msgid "Changes to free tier public projects"
+msgstr ""
+
msgid "Changes to the title have not been saved"
msgstr ""
@@ -6974,6 +7068,9 @@ msgstr ""
msgid "Check feature availability on namespace plan"
msgstr ""
+msgid "Check out branch"
+msgstr ""
+
msgid "Check out, review, and merge locally"
msgstr ""
@@ -7192,6 +7289,9 @@ msgstr ""
msgid "Checkout|Subtotal"
msgstr ""
+msgid "Checkout|Success: subscription"
+msgstr ""
+
msgid "Checkout|Tax"
msgstr ""
@@ -7258,6 +7358,9 @@ msgstr ""
msgid "Child epic doesn't exist."
msgstr ""
+msgid "Child issues and epics"
+msgstr ""
+
msgid "Chinese language support using"
msgstr ""
@@ -7285,9 +7388,6 @@ msgstr ""
msgid "Choose file…"
msgstr ""
-msgid "Choose specific groups or storage shards"
-msgstr ""
-
msgid "Choose the preferred Runner and populate the AWS CFT."
msgstr ""
@@ -7474,6 +7574,10 @@ msgstr ""
msgid "Clear"
msgstr ""
+msgid "Clear %{count} image from cache?"
+msgid_plural "Clear %{count} images from cache?"
+msgstr[0] ""
+
msgid "Clear all repository checks"
msgstr ""
@@ -7678,6 +7782,9 @@ msgstr ""
msgid "ClusterAgents|%{name} successfully deleted"
msgstr ""
+msgid "ClusterAgents|%{name} successfully revoked"
+msgstr ""
+
msgid "ClusterAgents|%{number} of %{total} agents"
msgstr ""
@@ -7735,13 +7842,13 @@ msgstr ""
msgid "ClusterAgents|All"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your Agents"
+msgid "ClusterAgents|An error occurred while loading your agent"
msgstr ""
-msgid "ClusterAgents|An error occurred while loading your agent"
+msgid "ClusterAgents|An error occurred while loading your agents"
msgstr ""
-msgid "ClusterAgents|An error occurred while retrieving GitLab Agent activity. Reload the page to try again."
+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."
@@ -7750,6 +7857,9 @@ 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 ""
@@ -7771,12 +7881,6 @@ msgstr ""
msgid "ClusterAgents|Connect a cluster (deprecated)"
msgstr ""
-msgid "ClusterAgents|Connect existing cluster"
-msgstr ""
-
-msgid "ClusterAgents|Connect with the GitLab Agent"
-msgstr ""
-
msgid "ClusterAgents|Connected"
msgstr ""
@@ -7840,13 +7944,13 @@ 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."
+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"
+msgid "ClusterAgents|GitLab agent"
msgstr ""
-msgid "ClusterAgents|GitLab Agent for Kubernetes"
+msgid "ClusterAgents|GitLab agent for Kubernetes"
msgstr ""
msgid "ClusterAgents|Give feedback"
@@ -7858,7 +7962,7 @@ msgstr ""
msgid "ClusterAgents|How to update an agent?"
msgstr ""
-msgid "ClusterAgents|Install a new agent"
+msgid "ClusterAgents|Install using Helm (recommended)"
msgstr ""
msgid "ClusterAgents|Last connected %{timeAgo}."
@@ -7882,6 +7986,10 @@ 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] ""
+
msgid "ClusterAgents|No agents"
msgstr ""
@@ -7894,9 +8002,6 @@ msgstr ""
msgid "ClusterAgents|Recommended"
msgstr ""
-msgid "ClusterAgents|Recommended installation method"
-msgstr ""
-
msgid "ClusterAgents|Register"
msgstr ""
@@ -7906,19 +8011,22 @@ msgstr ""
msgid "ClusterAgents|Requires a Maintainer or greater role to delete agents"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to install new agents"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
msgstr ""
-msgid "ClusterAgents|Requires a Maintainer or greater role to perform these actions"
+msgid "ClusterAgents|Requires a Maintainer or greater role to perform this action"
msgstr ""
-msgid "ClusterAgents|Requires a maintainer or greater role to connect existing clusters"
+msgid "ClusterAgents|Revoke access token?"
+msgstr ""
+
+msgid "ClusterAgents|Revoke token"
msgstr ""
msgid "ClusterAgents|Security"
msgstr ""
-msgid "ClusterAgents|See Agent activity updates such as tokens created or revoked and clusters connected or not connected."
+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"
@@ -7927,7 +8035,7 @@ 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}"
+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}."
@@ -7939,16 +8047,15 @@ 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|There's no activity from the past day"
-msgid_plural "ClusterAgents|There's no activity from the past %d days"
-msgstr[0] ""
-
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 ""
@@ -7967,7 +8074,7 @@ msgstr ""
msgid "ClusterAgents|We would love to learn more about your experience with the GitLab Agent."
msgstr ""
-msgid "ClusterAgents|What is GitLab Agent activity?"
+msgid "ClusterAgents|What is agent activity?"
msgstr ""
msgid "ClusterAgents|What is default configuration?"
@@ -8126,9 +8233,6 @@ msgstr ""
msgid "ClusterIntegration|Connect a Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Connect with a certificate"
-msgstr ""
-
msgid "ClusterIntegration|Connect your cluster to GitLab through %{linkStart}cluster certificates%{linkEnd}."
msgstr ""
@@ -8642,6 +8746,9 @@ 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 project does not have billing enabled. To create a cluster, %{linkToBillingStart}enable billing%{linkToBillingEnd} and try again."
msgstr ""
@@ -8675,7 +8782,7 @@ 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."
+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|Uses the Cloud Run, Istio, and HTTP Load Balancing addons for this cluster."
@@ -8849,9 +8956,6 @@ msgstr ""
msgid "Comma-separated list of email addresses."
msgstr ""
-msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'"
-msgstr ""
-
msgid "Command"
msgstr ""
@@ -8973,9 +9077,6 @@ msgstr ""
msgid "Committed by"
msgstr ""
-msgid "Commit…"
-msgstr ""
-
msgid "Community forum"
msgstr ""
@@ -9078,9 +9179,6 @@ msgstr ""
msgid "Compliance report"
msgstr ""
-msgid "ComplianceDashboard|created by:"
-msgstr ""
-
msgid "ComplianceFrameworks|Add framework"
msgstr ""
@@ -9441,9 +9539,6 @@ msgstr ""
msgid "Connection timed out"
msgstr ""
-msgid "Connection timeout"
-msgstr ""
-
msgid "Consistency guarantee method"
msgstr ""
@@ -9474,9 +9569,6 @@ msgstr ""
msgid "Container repositories"
msgstr ""
-msgid "Container repositories synchronization concurrency limit"
-msgstr ""
-
msgid "Container repository"
msgstr ""
@@ -9602,6 +9694,9 @@ 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 ""
@@ -9792,9 +9887,6 @@ 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|With the GitLab Container Registry, every project can have its own space to store images. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "ContainerRegistry|You are about to remove %{item} tags. Are you sure?"
msgstr ""
@@ -9831,6 +9923,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue editing"
+msgstr ""
+
msgid "Continue to the next step"
msgstr ""
@@ -9939,9 +10034,6 @@ msgstr ""
msgid "Copy ID"
msgstr ""
-msgid "Copy IP Address"
-msgstr ""
-
msgid "Copy KRB5 clone URL"
msgstr ""
@@ -9957,6 +10049,9 @@ msgstr ""
msgid "Copy branch name"
msgstr ""
+msgid "Copy code"
+msgstr ""
+
msgid "Copy codes"
msgstr ""
@@ -9999,6 +10094,9 @@ msgstr ""
msgid "Copy link"
msgstr ""
+msgid "Copy link URL"
+msgstr ""
+
msgid "Copy link to chart"
msgstr ""
@@ -10305,6 +10403,9 @@ msgstr ""
msgid "Create commit"
msgstr ""
+msgid "Create commit..."
+msgstr ""
+
msgid "Create common files more quickly, and standardize their format."
msgstr ""
@@ -10791,7 +10892,10 @@ msgstr ""
msgid "CurrentUser|Start an Ultimate trial"
msgstr ""
-msgid "CurrentUser|Upgrade"
+msgid "Currently unable to fetch data for this pipeline."
+msgstr ""
+
+msgid "Custom (%{language})"
msgstr ""
msgid "Custom Attributes"
@@ -10965,6 +11069,9 @@ msgstr ""
msgid "CycleAnalytics|%{selectedLabelsCount} selected (%{maxLabels} max)"
msgstr ""
+msgid "CycleAnalytics|'%{name}' is collecting the data. This can take a few minutes."
+msgstr ""
+
msgid "CycleAnalytics|Aggregation disabled"
msgstr ""
@@ -10983,6 +11090,9 @@ msgstr ""
msgid "CycleAnalytics|Custom value streams to measure your DevSecOps lifecycle"
msgstr ""
+msgid "CycleAnalytics|Data is collecting and loading."
+msgstr ""
+
msgid "CycleAnalytics|Date"
msgstr ""
@@ -10992,6 +11102,9 @@ msgstr ""
msgid "CycleAnalytics|Filter by stop date"
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 ""
@@ -11366,6 +11479,12 @@ msgstr ""
msgid "DastProfiles|Spider timeout"
msgstr ""
+msgid "DastProfiles|Submit button"
+msgstr ""
+
+msgid "DastProfiles|Submit button (optional)"
+msgstr ""
+
msgid "DastProfiles|Target URL"
msgstr ""
@@ -11456,25 +11575,25 @@ msgstr ""
msgid "DastSiteValidation|Revoke validation"
msgstr ""
-msgid "DastSiteValidation|Step 1 - Choose site validation method"
+msgid "DastSiteValidation|Step 1 - Choose site validation method."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following HTTP header to your site"
+msgid "DastSiteValidation|Step 2 - Add the following HTTP header to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following meta tag to your site"
+msgid "DastSiteValidation|Step 2 - Add the following meta tag to your site."
msgstr ""
-msgid "DastSiteValidation|Step 2 - Add following text to the target site"
+msgid "DastSiteValidation|Step 2 - Download the following text file, then upload it to the target site."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm header location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm header location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm meta tag location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm meta tag location."
msgstr ""
-msgid "DastSiteValidation|Step 3 - Confirm text file location and validate"
+msgid "DastSiteValidation|Step 3 - Confirm text file location."
msgstr ""
msgid "DastSiteValidation|Text file validation"
@@ -11490,13 +11609,13 @@ 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] ""
-msgid "DastSiteValidation|To run an active scan, validate your target site. All site profiles that share the same base URL share the same validation status."
+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 target site"
+msgid "DastSiteValidation|Validate site"
msgstr ""
msgid "DastSiteValidation|Validated"
@@ -11778,6 +11897,9 @@ msgstr ""
msgid "Delete badge"
msgstr ""
+msgid "Delete code block"
+msgstr ""
+
msgid "Delete column"
msgstr ""
@@ -11889,6 +12011,9 @@ msgstr ""
msgid "Deleted projects cannot be restored!"
msgstr ""
+msgid "Deleted the source branch."
+msgstr ""
+
msgid "Deletes the source branch"
msgstr ""
@@ -12012,9 +12137,15 @@ 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 ""
@@ -12024,9 +12155,6 @@ msgstr ""
msgid "DependencyProxy|Copy prefix"
msgstr ""
-msgid "DependencyProxy|Create a local proxy for storing frequently used upstream images. %{docLinkStart}Learn more%{docLinkEnd} about dependency proxies."
-msgstr ""
-
msgid "DependencyProxy|Dependency Proxy"
msgstr ""
@@ -12042,6 +12170,9 @@ msgstr ""
msgid "DependencyProxy|Image list"
msgstr ""
+msgid "DependencyProxy|Scheduled for deletion"
+msgstr ""
+
msgid "DependencyProxy|Storage settings"
msgstr ""
@@ -12297,6 +12428,9 @@ 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 ""
@@ -12445,10 +12579,16 @@ msgstr ""
msgid "Deprecations|For information on a possible replacement %{epicStart} learn more about Opstrace %{epicEnd}."
msgstr ""
-msgid "Deprecations|The metrics, logs and tracing features were deprecated in GitLab 14.7 and are %{epicStart} scheduled for removal %{epicEnd} in 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 ""
+
+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 ""
-msgid "Deprecations|The metrics, 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}."
+msgid "Deprecations|The metrics feature was deprecated in GitLab 14.7. 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. For information on a possible replacement, %{opstrace_link_start} learn more about Opstrace %{link_end}."
msgstr ""
msgid "Deprioritize label"
@@ -12842,6 +12982,9 @@ msgstr ""
msgid "DevopsReport|Your usage"
msgstr ""
+msgid "Did not delete the source branch."
+msgstr ""
+
msgid "Didn't receive a confirmation email?"
msgstr ""
@@ -12857,6 +13000,9 @@ msgstr ""
msgid "Diff limits"
msgstr ""
+msgid "Diff notes"
+msgstr ""
+
msgid "Difference between start date and now"
msgstr ""
@@ -12874,9 +13020,18 @@ msgid "Diffs|%d deletion"
msgid_plural "Diffs|%d deletions"
msgstr[0] ""
+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 ""
@@ -12914,9 +13069,6 @@ msgstr ""
msgid "Disable"
msgstr ""
-msgid "Disable Elasticsearch until indexing completes."
-msgstr ""
-
msgid "Disable Two-factor Authentication"
msgstr ""
@@ -12929,6 +13081,9 @@ msgstr ""
msgid "Disable group runners"
msgstr ""
+msgid "Disable the group-level wiki"
+msgstr ""
+
msgid "Disable two-factor authentication"
msgstr ""
@@ -13062,7 +13217,7 @@ msgstr ""
msgid "Display source"
msgstr ""
-msgid "Display time tracking in issues in total hours only."
+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"
@@ -13149,9 +13304,6 @@ msgstr ""
msgid "Download artifacts"
msgstr ""
-msgid "Download as"
-msgstr ""
-
msgid "Download codes"
msgstr ""
@@ -13239,9 +13391,15 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "Duplicate page: %{error_message}"
+msgstr ""
+
msgid "Duration"
msgstr ""
+msgid "Duration (min)"
+msgstr ""
+
msgid "Duration|%s days"
msgstr ""
@@ -13395,6 +13553,9 @@ msgstr ""
msgid "Edit issues"
msgstr ""
+msgid "Edit link"
+msgstr ""
+
msgid "Edit merge requests"
msgstr ""
@@ -13449,9 +13610,6 @@ msgstr ""
msgid "Elasticsearch HTTP client timeout value in seconds."
msgstr ""
-msgid "Elasticsearch indexing"
-msgstr ""
-
msgid "Elasticsearch indexing restrictions"
msgstr ""
@@ -13512,9 +13670,6 @@ msgstr ""
msgid "Email display name"
msgstr ""
-msgid "Email from GitLab - email users right from the Admin Area. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Email not verified. Please verify your email in Salesforce."
msgstr ""
@@ -13524,6 +13679,9 @@ msgstr ""
msgid "Email patch"
msgstr ""
+msgid "Email patches"
+msgstr ""
+
msgid "Email sent"
msgstr ""
@@ -13620,13 +13778,13 @@ msgstr ""
msgid "Enable"
msgstr ""
-msgid "Enable Amazon EKS integration"
+msgid "Enable Akismet"
msgstr ""
-msgid "Enable Auto DevOps"
+msgid "Enable Amazon EKS integration"
msgstr ""
-msgid "Enable Git pack file bitmap creation"
+msgid "Enable Auto DevOps"
msgstr ""
msgid "Enable Gitpod"
@@ -13650,18 +13808,12 @@ msgstr ""
msgid "Enable Pseudonymizer data collection"
msgstr ""
-msgid "Enable Registration Features"
-msgstr ""
-
msgid "Enable SSL verification"
msgstr ""
msgid "Enable Sentry error tracking"
msgstr ""
-msgid "Enable Service Ping"
-msgstr ""
-
msgid "Enable Snowplow tracking"
msgstr ""
@@ -13743,12 +13895,6 @@ msgstr ""
msgid "Enable integration"
msgstr ""
-msgid "Enable kuromoji custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable kuromoji custom analyzer: Search"
-msgstr ""
-
msgid "Enable logs collection"
msgstr ""
@@ -13794,12 +13940,6 @@ msgstr ""
msgid "Enable shared runners for this project"
msgstr ""
-msgid "Enable smartcn custom analyzer: Indexing"
-msgstr ""
-
-msgid "Enable smartcn custom analyzer: Search"
-msgstr ""
-
msgid "Enable two-factor authentication"
msgstr ""
@@ -13866,7 +14006,7 @@ msgstr ""
msgid "Enforce SSH key expiration"
msgstr ""
-msgid "Enforce personal access token expiration"
+msgid "Enforce access token expiration"
msgstr ""
msgid "Enforce two-factor authentication"
@@ -13969,8 +14109,7 @@ msgid "Enterprise"
msgstr ""
msgid "Environment"
-msgid_plural "Environments"
-msgstr[0] ""
+msgstr ""
msgid "Environment does not have deployments"
msgstr ""
@@ -14230,6 +14369,9 @@ msgstr ""
msgid "Environment|Auto stop %{time}"
msgstr ""
+msgid "Environment|Deployment tier"
+msgstr ""
+
msgid "Epic"
msgstr ""
@@ -14254,9 +14396,6 @@ msgstr ""
msgid "Epics Roadmap"
msgstr ""
-msgid "Epics and Issues"
-msgstr ""
-
msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
@@ -14359,6 +14498,9 @@ msgstr ""
msgid "Epics|start"
msgstr ""
+msgid "Erased"
+msgstr ""
+
msgid "Error"
msgstr ""
@@ -14614,9 +14756,6 @@ msgstr ""
msgid "Errors found on line %{line_number}: %{error_lines}. Please check if these lines have a requirement title."
msgstr ""
-msgid "Errors:"
-msgstr ""
-
msgid "Escalate this incident"
msgstr ""
@@ -14948,6 +15087,9 @@ msgstr ""
msgid "Expiration date:"
msgstr ""
+msgid "Expire access tokens"
+msgstr ""
+
msgid "Expired"
msgstr ""
@@ -15246,6 +15388,9 @@ msgstr ""
msgid "Failed to load"
msgstr ""
+msgid "Failed to load Roadmap"
+msgstr ""
+
msgid "Failed to load assignees."
msgstr ""
@@ -15276,6 +15421,9 @@ msgstr ""
msgid "Failed to load groups, users and deploy keys."
msgstr ""
+msgid "Failed to load iteration cadences."
+msgstr ""
+
msgid "Failed to load iterations."
msgstr ""
@@ -15432,7 +15580,7 @@ msgstr ""
msgid "Feature Flags"
msgstr ""
-msgid "Feature deprecation and removal"
+msgid "Feature deprecation"
msgstr ""
msgid "Feature flag status"
@@ -15676,6 +15824,9 @@ msgstr ""
msgid "File Hooks (%{count})"
msgstr ""
+msgid "File Tree"
+msgstr ""
+
msgid "File added"
msgstr ""
@@ -15703,9 +15854,6 @@ msgstr ""
msgid "File suppressed by a .gitattributes entry or the file's encoding is unsupported."
msgstr ""
-msgid "File synchronization concurrency limit"
-msgstr ""
-
msgid "File templates"
msgstr ""
@@ -15832,9 +15980,6 @@ msgstr ""
msgid "Finished"
msgstr ""
-msgid "Finished at"
-msgstr ""
-
msgid "First Name"
msgstr ""
@@ -15955,9 +16100,6 @@ msgstr ""
msgid "For more information, see the File Hooks documentation."
msgstr ""
-msgid "For more information, see the documentation on %{deactivating_service_ping_link_start}deactivating service ping%{deactivating_service_ping_link_end}."
-msgstr ""
-
msgid "Forgot your password?"
msgstr ""
@@ -16186,6 +16328,14 @@ msgstr ""
msgid "Geo sites"
msgstr ""
+msgid "Geo|%d group selected"
+msgid_plural "%d groups selected"
+msgstr[0] ""
+
+msgid "Geo|%d shard selected"
+msgid_plural "%d shards selected"
+msgstr[0] ""
+
msgid "Geo|%{boldStart}N/A%{boldEnd}: Geo does not verify this component yet. See the %{linkStart}data types we plan to support%{linkEnd}."
msgstr ""
@@ -16219,6 +16369,9 @@ msgstr ""
msgid "Geo|(%{timeAgo})"
msgstr ""
+msgid "Geo|Add New Site"
+msgstr ""
+
msgid "Geo|Add site"
msgstr ""
@@ -16240,6 +16393,12 @@ 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 ""
@@ -16249,9 +16408,24 @@ msgstr ""
msgid "Geo|Allowed Geo IP should contain valid IP addresses"
msgstr ""
+msgid "Geo|Beta"
+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 ""
@@ -16264,6 +16438,9 @@ 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 ""
@@ -16285,9 +16462,21 @@ 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 ""
@@ -16297,24 +16486,36 @@ msgstr ""
msgid "Geo|Filter by status"
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|Geo supports replication of many data types."
+msgid "Geo|Go to the primary site"
msgstr ""
-msgid "Geo|Go to the primary site"
+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 ""
@@ -16327,6 +16528,9 @@ msgstr ""
msgid "Geo|Internal URL"
msgstr ""
+msgid "Geo|Internal URL (optional)"
+msgstr ""
+
msgid "Geo|Last event ID from primary"
msgstr ""
@@ -16351,21 +16555,39 @@ 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 ""
@@ -16375,6 +16597,9 @@ msgstr ""
msgid "Geo|Nothing to verify"
msgstr ""
+msgid "Geo|Object Storage replication"
+msgstr ""
+
msgid "Geo|Offline"
msgstr ""
@@ -16387,6 +16612,9 @@ msgstr ""
msgid "Geo|Pending verification"
msgstr ""
+msgid "Geo|Primary"
+msgstr ""
+
msgid "Geo|Primary node"
msgstr ""
@@ -16408,6 +16636,9 @@ msgstr ""
msgid "Geo|Queued"
msgstr ""
+msgid "Geo|Re-verification interval"
+msgstr ""
+
msgid "Geo|Redownload"
msgstr ""
@@ -16450,6 +16681,9 @@ msgstr ""
msgid "Geo|Replication summary"
msgstr ""
+msgid "Geo|Repository synchronization concurrency limit"
+msgstr ""
+
msgid "Geo|Resync"
msgstr ""
@@ -16477,15 +16711,39 @@ msgstr ""
msgid "Geo|Review replication status, and resynchronize and reverify items with the primary site."
msgstr ""
+msgid "Geo|Secondary"
+msgstr ""
+
msgid "Geo|Secondary node"
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|Site name can't be blank"
msgstr ""
@@ -16519,6 +16777,12 @@ 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 ""
@@ -16531,9 +16795,21 @@ 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 ""
@@ -16543,12 +16819,18 @@ 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 ""
@@ -16573,6 +16855,9 @@ msgstr ""
msgid "Geo|Verification"
msgstr ""
+msgid "Geo|Verification concurrency limit"
+msgstr ""
+
msgid "Geo|Verification failed - %{error}"
msgstr ""
@@ -16588,7 +16873,7 @@ msgstr ""
msgid "Geo|Waiting for scheduler"
msgstr ""
-msgid "Geo|With GitLab Geo, you can install a special read-only and replicated instance anywhere. %{linkStart}Learn more%{linkEnd}"
+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."
@@ -16744,7 +17029,7 @@ msgstr ""
msgid "GitLab group: %{source_link}"
msgstr ""
-msgid "GitLab informs you if a new version is available."
+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"
@@ -16915,6 +17200,15 @@ 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 ""
@@ -17788,9 +18082,6 @@ 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|New runners registration token has been generated!"
-msgstr ""
-
msgid "GroupSettings|Overrides user notification preferences for all members of the group, subgroups, and projects."
msgstr ""
@@ -17908,9 +18199,6 @@ msgstr ""
msgid "Groups are the best way to manage projects and members."
msgstr ""
-msgid "Groups to synchronize"
-msgstr ""
-
msgid "GroupsDropdown|Frequently visited"
msgstr ""
@@ -18315,6 +18603,9 @@ 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 ""
@@ -18327,9 +18618,6 @@ msgstr ""
msgid "Helps reduce request volume for protected paths."
msgstr ""
-msgid "Here you will find recent merge request activity"
-msgstr ""
-
msgid "Hi %{username}!"
msgstr ""
@@ -18476,12 +18764,6 @@ msgstr ""
msgid "How do I configure Akismet?"
msgstr ""
-msgid "How do I configure authentication using the GitLab database?"
-msgstr ""
-
-msgid "How do I configure it?"
-msgstr ""
-
msgid "How do I configure runners?"
msgstr ""
@@ -18614,6 +18896,9 @@ msgstr ""
msgid "IP subnet restriction only allowed for top-level groups"
msgstr ""
+msgid "Id"
+msgstr ""
+
msgid "Identifier"
msgstr ""
@@ -18653,15 +18938,12 @@ 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."
+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, GitLab will handle Object Storage replication using Geo. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "If enabled, only protected branches will be mirrored."
msgstr ""
@@ -18674,9 +18956,6 @@ 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 there isn't any existing index, GitLab creates one."
-msgstr ""
-
msgid "If this email was added in error, you can remove it here:"
msgstr ""
@@ -18953,9 +19232,6 @@ msgstr ""
msgid "Improve customer support with Service Desk"
msgstr ""
-msgid "Improves Git cloning performance."
-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 ""
@@ -19037,6 +19313,9 @@ 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 ""
@@ -19157,6 +19436,9 @@ msgstr ""
msgid "InProductMarketing|Get our import guides"
msgstr ""
+msgid "InProductMarketing|Get set up to build for iOS"
+msgstr ""
+
msgid "InProductMarketing|Get started today"
msgstr ""
@@ -19268,6 +19550,9 @@ 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 ""
@@ -19451,9 +19736,15 @@ 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 ""
@@ -19595,6 +19886,9 @@ msgstr ""
msgid "IncidentManagement|Incidents"
msgstr ""
+msgid "IncidentManagement|Learn more about incident statuses"
+msgstr ""
+
msgid "IncidentManagement|Low - S4"
msgstr ""
@@ -19718,18 +20012,6 @@ msgstr ""
msgid "Incidents|Must start with http or https"
msgstr ""
-msgid "Incidents|There was an issue deleting the image."
-msgstr ""
-
-msgid "Incidents|There was an issue loading metric images."
-msgstr ""
-
-msgid "Incidents|There was an issue updating your image."
-msgstr ""
-
-msgid "Incidents|There was an issue uploading your image."
-msgstr ""
-
msgid "Incident|Add new timeline event"
msgstr ""
@@ -20202,9 +20484,6 @@ msgstr ""
msgid "Integrations|You can close this window."
msgstr ""
-msgid "Integrations|You can now close this window and return to the GitLab for Jira application."
-msgstr ""
-
msgid "Integrations|You can use this alias in your Slack commands"
msgstr ""
@@ -20247,9 +20526,6 @@ msgstr ""
msgid "Internal - The project can be accessed by any logged in user except external users."
msgstr ""
-msgid "Internal URL (optional)"
-msgstr ""
-
msgid "Internal error occurred while delivering this webhook."
msgstr ""
@@ -20259,6 +20535,9 @@ msgstr ""
msgid "Internal users cannot be deactivated"
msgstr ""
+msgid "Interval"
+msgstr ""
+
msgid "Interval Pattern"
msgstr ""
@@ -20310,6 +20589,9 @@ msgstr ""
msgid "Invalid file."
msgstr ""
+msgid "Invalid format selected"
+msgstr ""
+
msgid "Invalid hash"
msgstr ""
@@ -20385,9 +20667,6 @@ msgstr ""
msgid "Invite a group"
msgstr ""
-msgid "Invite email has already been taken"
-msgstr ""
-
msgid "Invite members"
msgstr ""
@@ -20943,12 +21222,18 @@ msgstr ""
msgid "Iterations|Cadence name"
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 ""
@@ -20958,9 +21243,15 @@ msgstr ""
msgid "Iterations|Delete iteration?"
msgstr ""
+msgid "Iterations|Description"
+msgstr ""
+
msgid "Iterations|Done"
msgstr ""
+msgid "Iterations|Due date"
+msgstr ""
+
msgid "Iterations|Duration"
msgstr ""
@@ -21084,9 +21375,6 @@ msgstr ""
msgid "Iteration|cannot be more than 500 years in the future"
msgstr ""
-msgid "I’m joining my team who’s already on GitLab"
-msgstr ""
-
msgid "Jaeger URL"
msgstr ""
@@ -21192,7 +21480,7 @@ 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 %{linkStart}disabling GitLab issues%{linkEnd} if they won’t otherwise be used."
+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"
@@ -21243,9 +21531,6 @@ msgstr ""
msgid "JiraService|Jira comments are created when an issue is referenced in a merge request."
msgstr ""
-msgid "JiraService|Jira issue type"
-msgstr ""
-
msgid "JiraService|Jira issues"
msgstr ""
@@ -21327,6 +21612,9 @@ 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 ""
@@ -21381,6 +21669,9 @@ 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|Are you sure you want to proceed?"
msgstr ""
@@ -21393,6 +21684,9 @@ msgstr ""
msgid "Jobs|Filter jobs"
msgstr ""
+msgid "Jobs|Finished"
+msgstr ""
+
msgid "Jobs|Job is stuck. Check runners."
msgstr ""
@@ -21931,6 +22225,9 @@ msgstr ""
msgid "Lead Time"
msgstr ""
+msgid "Lead Time for Changes"
+msgstr ""
+
msgid "Lead time"
msgstr ""
@@ -22111,6 +22408,9 @@ msgstr ""
msgid "LearnGitLab|Your team is growing! You've successfully invited new team members to the %{projectName} project."
msgstr ""
+msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
+msgstr ""
+
msgid "LearnGitlab|Creating your onboarding experience..."
msgstr ""
@@ -22120,6 +22420,9 @@ msgstr ""
msgid "LearnGitlab|Trial only"
msgstr ""
+msgid "LearnGitlab|View administrator list"
+msgstr ""
+
msgid "Leave"
msgstr ""
@@ -22144,6 +22447,9 @@ msgstr ""
msgid "Legacy burndown chart"
msgstr ""
+msgid "Legacy license"
+msgstr ""
+
msgid "Less Details"
msgstr ""
@@ -22313,10 +22619,7 @@ msgstr ""
msgid "Licenses|Detected in Project"
msgstr ""
-msgid "Licenses|Detected licenses that are out-of-compliance with the project's assigned policies"
-msgstr ""
-
-msgid "Licenses|Displays licenses detected in the project, based on the %{linkStart}latest successful%{linkEnd} scan"
+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}."
@@ -22364,24 +22667,15 @@ msgstr ""
msgid "Limit display of time tracking units to hours."
msgstr ""
-msgid "Limit project size at a global, group, and project level. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Limit sign in from multiple IP addresses"
msgstr ""
-msgid "Limit the number of concurrent operations this secondary site can run in the background."
-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 namespaces and projects that can be indexed."
-msgstr ""
-
msgid "Limit the size of Sidekiq jobs stored in Redis."
msgstr ""
@@ -22568,9 +22862,6 @@ msgstr ""
msgid "Locked the discussion."
msgstr ""
-msgid "Locked to current projects"
-msgstr ""
-
msgid "Locks give the ability to lock specific file or folder."
msgstr ""
@@ -22625,6 +22916,9 @@ 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 ""
+
msgid "Low vulnerabilities present"
msgstr ""
@@ -22928,6 +23222,9 @@ msgstr ""
msgid "Max 100,000 events"
msgstr ""
+msgid "Max Value"
+msgstr ""
+
msgid "Max authenticated Git LFS requests per period per user"
msgstr ""
@@ -22967,6 +23264,9 @@ msgstr ""
msgid "Maximum Users"
msgstr ""
+msgid "Maximum allowable lifetime for access token (days)"
+msgstr ""
+
msgid "Maximum allowable lifetime for personal access token (days)"
msgstr ""
@@ -23024,7 +23324,7 @@ 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 28px tall header logo"
+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."
@@ -23281,6 +23581,9 @@ msgstr ""
msgid "Members|Expiration date updated successfully."
msgstr ""
+msgid "Members|Filter groups"
+msgstr ""
+
msgid "Members|Filter members"
msgstr ""
@@ -23401,6 +23704,9 @@ msgstr ""
msgid "Merge request %{mr_link} was reviewed by %{mr_author}"
msgstr ""
+msgid "Merge request actions"
+msgstr ""
+
msgid "Merge request analytics"
msgstr ""
@@ -23647,6 +23953,18 @@ 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 ""
@@ -24159,10 +24477,10 @@ msgstr ""
msgid "Milestones|Use milestones to track issues and merge requests over a fixed period of time"
msgstr ""
-msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
+msgid "Min Value"
msgstr ""
-msgid "Minimum interval in days"
+msgid "Minimum capacity to be available before we schedule more mirrors preemptively."
msgstr ""
msgid "Minutes"
@@ -24390,9 +24708,6 @@ msgstr ""
msgid "Multi-project"
msgstr ""
-msgid "Multi-project Runners cannot be removed"
-msgstr ""
-
msgid "Multiple HTTP integrations are not supported for this project"
msgstr ""
@@ -24414,12 +24729,6 @@ msgstr ""
msgid "Multiplier to apply to polling intervals. Decimal values are supported. Defaults to 1."
msgstr ""
-msgid "Must match with the %{codeStart}external_url%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}."
-msgstr ""
-
-msgid "Must match with the %{codeStart}geo_node_name%{codeEnd} in %{codeStart}/etc/gitlab/gitlab.rb%{codeEnd}. %{linkStart}Learn more%{linkEnd}"
-msgstr ""
-
msgid "My awesome group"
msgstr ""
@@ -24490,19 +24799,19 @@ 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 %{percent} or less namespace storage space remaining."
+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 %{percent} or less namespace storage space remaining."
+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: Less than %{percentage_of_available_storage}%% of namespace storage remains for %{namespace_name}"
+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}"
@@ -24607,75 +24916,9 @@ msgstr ""
msgid "Network:"
msgstr ""
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is inbound from a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{ifLabelStart}if%{ifLabelEnd} %{ruleType} %{isLabelStart}is%{isLabelEnd} %{ruleDirection} %{ruleSelector} %{directionLabelStart}and is outbound to a%{directionLabelEnd} %{rule} %{portsLabelStart}on%{portsLabelEnd} %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}And%{labelEnd} %{spanStart}send an Alert to GitLab.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{labelStart}Then%{labelEnd} %{action} %{spanStart}the network traffic.%{spanEnd}"
-msgstr ""
-
-msgid "NetworkPolicies|%{number} selected"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}all%{strongClose} pods"
-msgstr ""
-
-msgid "NetworkPolicies|%{strongOpen}any%{strongClose} port"
-msgstr ""
-
-msgid "NetworkPolicies|.yaml mode"
-msgstr ""
-
-msgid "NetworkPolicies|Add alert"
-msgstr ""
-
-msgid "NetworkPolicies|Alerts are intended to be selectively used for a limited number of events that are potentially concerning and warrant a manual review. Alerts should not be used as a substitute for a SIEM or a logging tool. High volume alerts are likely to be dropped so as to preserve the stability of GitLab's integration with Kubernetes."
-msgstr ""
-
-msgid "NetworkPolicies|All selected"
-msgstr ""
-
-msgid "NetworkPolicies|Allow"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all inbound traffic to %{selector} from %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Allow all outbound traffic from %{selector} to %{ruleSelector} on %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|Are you sure you want to delete this policy? This action cannot be undone."
-msgstr ""
-
-msgid "NetworkPolicies|Create policy"
-msgstr ""
-
-msgid "NetworkPolicies|Define this policy's location, conditions and actions."
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy"
-msgstr ""
-
-msgid "NetworkPolicies|Delete policy: %{policy}"
-msgstr ""
-
-msgid "NetworkPolicies|Deny all traffic"
-msgstr ""
-
-msgid "NetworkPolicies|Edit policy"
-msgstr ""
-
msgid "NetworkPolicies|Environment does not have deployment platform"
msgstr ""
-msgid "NetworkPolicies|IP/subnet"
-msgstr ""
-
msgid "NetworkPolicies|Invalid or empty policy"
msgstr ""
@@ -24685,87 +24928,12 @@ msgstr ""
msgid "NetworkPolicies|Kubernetes error: %{error}"
msgstr ""
-msgid "NetworkPolicies|Network"
-msgstr ""
-
-msgid "NetworkPolicies|Network Policies can be used to limit which network traffic is allowed between containers inside the cluster."
-msgstr ""
-
-msgid "NetworkPolicies|Network policy can be created after the environment is loaded successfully."
-msgstr ""
-
-msgid "NetworkPolicies|Network traffic"
-msgstr ""
-
-msgid "NetworkPolicies|None selected"
-msgstr ""
-
msgid "NetworkPolicies|Policy %{policyName} was successfully changed"
msgstr ""
-msgid "NetworkPolicies|Policy definition"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode"
-msgstr ""
-
-msgid "NetworkPolicies|Rule mode is unavailable for this policy. In some cases, we cannot parse the YAML file back into the rules editor."
-msgstr ""
-
-msgid "NetworkPolicies|Save changes"
-msgstr ""
-
msgid "NetworkPolicies|Something went wrong, failed to update policy"
msgstr ""
-msgid "NetworkPolicies|Something went wrong, unable to fetch policies"
-msgstr ""
-
-msgid "NetworkPolicies|To enable alerts, %{installLinkStart}install an agent%{installLinkEnd} first."
-msgstr ""
-
-msgid "NetworkPolicies|all DNS names"
-msgstr ""
-
-msgid "NetworkPolicies|all IP addresses"
-msgstr ""
-
-msgid "NetworkPolicies|any pod"
-msgstr ""
-
-msgid "NetworkPolicies|any port"
-msgstr ""
-
-msgid "NetworkPolicies|domain name"
-msgstr ""
-
-msgid "NetworkPolicies|entity"
-msgstr ""
-
-msgid "NetworkPolicies|inbound to"
-msgstr ""
-
-msgid "NetworkPolicies|nowhere"
-msgstr ""
-
-msgid "NetworkPolicies|outbound from"
-msgstr ""
-
-msgid "NetworkPolicies|pod with labels"
-msgstr ""
-
-msgid "NetworkPolicies|pods %{pods}"
-msgstr ""
-
-msgid "NetworkPolicies|pods with labels"
-msgstr ""
-
-msgid "NetworkPolicies|ports %{ports}"
-msgstr ""
-
-msgid "NetworkPolicies|ports/protocols"
-msgstr ""
-
msgid "NetworkPolicy|Policy"
msgstr ""
@@ -25046,9 +25214,6 @@ msgstr ""
msgid "No Scopes"
msgstr ""
-msgid "No Tag"
-msgstr ""
-
msgid "No active admin user found"
msgstr ""
@@ -25256,9 +25421,6 @@ msgstr ""
msgid "No prioritized labels with such name or description"
msgstr ""
-msgid "No profiles found"
-msgstr ""
-
msgid "No project subscribes to the pipelines in this project."
msgstr ""
@@ -25440,6 +25602,9 @@ msgstr ""
msgid "NoteForm|Note"
msgstr ""
+msgid "Notes"
+msgstr ""
+
msgid "Notes rate limit"
msgstr ""
@@ -25476,9 +25641,6 @@ 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 found…"
-msgstr ""
-
msgid "Nothing to preview."
msgstr ""
@@ -25600,6 +25762,42 @@ 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|Author: %{author_name}"
+msgstr ""
+
+msgid "Notify|Issue was %{issue_status} by %{updated_by}"
+msgstr ""
+
+msgid "Notify|Issue was moved to another project."
+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 URL: %{merge_request_url}"
+msgstr ""
+
+msgid "Notify|New issue: %{project_issue_url}"
+msgstr ""
+
+msgid "Notify|This issue is due on: %{issue_due_date}"
+msgstr ""
+
+msgid "Notify|You don't have access to the project."
+msgstr ""
+
msgid "Nov"
msgstr "11月"
@@ -25654,9 +25852,6 @@ msgstr ""
msgid "OK"
msgstr "確定"
-msgid "Object Storage replication"
-msgstr ""
-
msgid "Object does not exist on the server or you don't have permissions to access it"
msgstr ""
@@ -25699,6 +25894,9 @@ 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 ""
@@ -25855,9 +26053,18 @@ msgstr ""
msgid "OnDemandScans|%{learnMoreLinkStart}Learn more about on-demand scans%{learnMoreLinkEnd}."
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 ""
@@ -25879,22 +26086,37 @@ 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 on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|Edit on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|Edit profile"
msgstr ""
-msgid "OnDemandScans|For example: Tests the login page for SQL injections"
+msgid "OnDemandScans|Enable scan schedule"
msgstr ""
-msgid "OnDemandScans|Manage DAST scans"
+msgid "OnDemandScans|For example: Tests the login page for SQL injections"
msgstr ""
msgid "OnDemandScans|Manage scanner profiles"
@@ -25909,6 +26131,9 @@ msgstr ""
msgid "OnDemandScans|New on-demand DAST scan"
msgstr ""
+msgid "OnDemandScans|New on-demand scan"
+msgstr ""
+
msgid "OnDemandScans|New scan"
msgstr ""
@@ -25942,19 +26167,25 @@ msgstr ""
msgid "OnDemandScans|Save scan"
msgstr ""
+msgid "OnDemandScans|Scan configuration"
+msgstr ""
+
msgid "OnDemandScans|Scan library"
msgstr ""
msgid "OnDemandScans|Scan name"
msgstr ""
-msgid "OnDemandScans|Scan type"
+msgid "OnDemandScans|Scan results will be associated with the selected branch."
msgstr ""
-msgid "OnDemandScans|Scanner profile"
+msgid "OnDemandScans|Scan schedule"
+msgstr ""
+
+msgid "OnDemandScans|Scan type"
msgstr ""
-msgid "OnDemandScans|Schedule scan"
+msgid "OnDemandScans|Scanner profile"
msgstr ""
msgid "OnDemandScans|Select one of the existing profiles"
@@ -25987,6 +26218,9 @@ msgstr ""
msgid "OnDemandScans|There are no scheduled scans."
msgstr ""
+msgid "OnDemandScans|Timezone"
+msgstr ""
+
msgid "OnDemandScans|Use existing scanner profile"
msgstr ""
@@ -25999,6 +26233,9 @@ 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 ""
@@ -26060,9 +26297,6 @@ msgstr ""
msgid "Only effective when remote storage is enabled. Set to 0 for no size limit."
msgstr ""
-msgid "Only enable search after installing the plugin, enabling indexing, and recreating the index."
-msgstr ""
-
msgid "Only include features new to your current subscription tier."
msgstr ""
@@ -26507,6 +26741,12 @@ msgstr ""
msgid "PackageRegistry|Delete package"
msgstr ""
+msgid "PackageRegistry|Delete this package"
+msgstr ""
+
+msgid "PackageRegistry|Error publishing"
+msgstr ""
+
msgid "PackageRegistry|Failed to load the package data"
msgstr ""
@@ -26604,9 +26844,6 @@ msgstr ""
msgid "PackageRegistry|Project-level"
msgstr ""
-msgid "PackageRegistry|Publish and share packages for a variety of common package managers. %{docLinkStart}More information%{docLinkEnd}"
-msgstr ""
-
msgid "PackageRegistry|Publish packages if their name or version matches this regex."
msgstr ""
@@ -26679,6 +26916,12 @@ 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 ""
@@ -26802,13 +27045,13 @@ msgstr ""
msgid "Part of merge request changes"
msgstr ""
-msgid "Participants"
+msgid "Partial import"
msgstr ""
-msgid "Pass job variables"
+msgid "Participants"
msgstr ""
-msgid "Pass the header %{codeOpen} X-Profile-Token: %{profile_token} %{codeClose} to profile the request"
+msgid "Pass job variables"
msgstr ""
msgid "Passed"
@@ -26895,7 +27138,7 @@ msgstr ""
msgid "Pause"
msgstr ""
-msgid "Pause Elasticsearch indexing"
+msgid "Pause time (ms)"
msgstr ""
msgid "Paused"
@@ -27081,9 +27324,6 @@ msgstr ""
msgid "Pipeline %{label} for \"%{dataTitle}\""
msgstr ""
-msgid "Pipeline Editor"
-msgstr ""
-
msgid "Pipeline Editor|Are you sure you want to reset the file to its last committed version?"
msgstr ""
@@ -27153,6 +27393,12 @@ 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 ""
@@ -27882,6 +28128,9 @@ 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 ""
@@ -27921,9 +28170,6 @@ msgstr ""
msgid "Please reach out if you have any questions and we'll be happy to assist."
msgstr ""
-msgid "Please refer to %{docs_url}"
-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 ""
@@ -27981,6 +28227,9 @@ msgstr ""
msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately."
msgstr ""
+msgid "Please visit the %{faq_link} for more information."
+msgstr ""
+
msgid "Please wait a moment, this page will automatically refresh when ready."
msgstr ""
@@ -28065,6 +28314,12 @@ 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|Configure how dates and times display for you."
msgstr ""
@@ -28074,6 +28329,12 @@ msgstr ""
msgid "Preferences|Customize the appearance of the application header and navigation sidebar."
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 ""
@@ -28110,6 +28371,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preferences|Preview"
+msgstr ""
+
msgid "Preferences|Project overview content"
msgstr ""
@@ -28209,9 +28473,6 @@ msgstr ""
msgid "Previous unresolved discussion"
msgstr ""
-msgid "Primary"
-msgstr ""
-
msgid "Primary Action"
msgstr ""
@@ -28830,9 +29091,6 @@ msgstr ""
msgid "Project export download requests"
msgstr ""
-msgid "Project export enabled"
-msgstr ""
-
msgid "Project export has been deleted."
msgstr ""
@@ -29460,7 +29718,7 @@ msgstr ""
msgid "ProjectSettings|Users can copy the repository to a new project."
msgstr ""
-msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+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"
@@ -30510,9 +30768,6 @@ msgstr ""
msgid "Re-request review"
msgstr ""
-msgid "Re-verification interval"
-msgstr ""
-
msgid "Read documentation"
msgstr ""
@@ -30597,9 +30852,6 @@ msgstr ""
msgid "Recent events"
msgstr ""
-msgid "Recent jobs served by this runner"
-msgstr ""
-
msgid "Recent searches"
msgstr ""
@@ -30703,9 +30955,6 @@ msgstr ""
msgid "Register with two-factor app"
msgstr ""
-msgid "Registration Features include:"
-msgstr ""
-
msgid "RegistrationFeatures|Enable Service Ping and register for this feature."
msgstr ""
@@ -31181,9 +31430,6 @@ msgstr ""
msgid "Reopens this %{quick_action_target}."
msgstr ""
-msgid "Repeats"
-msgstr ""
-
msgid "Replace"
msgstr ""
@@ -31223,9 +31469,6 @@ msgstr ""
msgid "Repo by URL"
msgstr ""
-msgid "Report %{display_issuable_type} that are abusive, inappropriate or spam."
-msgstr ""
-
msgid "Report abuse"
msgstr ""
@@ -31312,6 +31555,9 @@ msgstr ""
msgid "Reports|Filename"
msgstr ""
+msgid "Reports|Fixed"
+msgstr ""
+
msgid "Reports|Full report"
msgstr ""
@@ -31342,6 +31588,9 @@ msgstr ""
msgid "Reports|Metrics reports: %{strong_start}%{numberOfChanges}%{strong_end} %{changes}"
msgstr ""
+msgid "Reports|New"
+msgstr ""
+
msgid "Reports|Scanner"
msgstr ""
@@ -31516,9 +31765,6 @@ msgstr ""
msgid "Repository storage"
msgstr ""
-msgid "Repository synchronization concurrency limit"
-msgstr ""
-
msgid "Repository update events"
msgstr ""
@@ -31537,9 +31783,6 @@ msgstr ""
msgid "Request a new one"
msgstr ""
-msgid "Request attention"
-msgstr ""
-
msgid "Request attention from %{users_sentence}."
msgstr ""
@@ -31549,9 +31792,6 @@ msgstr ""
msgid "Request attention from assignee(s) or reviewer(s)"
msgstr ""
-msgid "Request attention to review"
-msgstr ""
-
msgid "Request details"
msgstr ""
@@ -31591,9 +31831,6 @@ msgstr ""
msgid "Requests"
msgstr ""
-msgid "Requests Profiles"
-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 ""
@@ -31797,9 +32034,6 @@ 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 group access by IP address. %{link_start}Learn more%{link_end}."
-msgstr ""
-
msgid "Restrict membership by email domain"
msgstr ""
@@ -31821,6 +32055,9 @@ msgstr ""
msgid "Retry"
msgstr ""
+msgid "Retry downstream pipeline"
+msgstr ""
+
msgid "Retry failed jobs"
msgstr ""
@@ -31940,6 +32177,9 @@ msgstr ""
msgid "Roadmap settings"
msgstr ""
+msgid "Roadmap view"
+msgstr ""
+
msgid "Role"
msgstr ""
@@ -31982,10 +32222,10 @@ msgstr ""
msgid "Run untagged jobs"
msgstr ""
-msgid "Runner API"
+msgid "Runner"
msgstr ""
-msgid "Runner cannot be deleted, please contact your administrator."
+msgid "Runner API"
msgstr ""
msgid "Runner tokens"
@@ -32003,9 +32243,6 @@ msgstr ""
msgid "Runners are processes that pick up and execute CI/CD jobs for GitLab."
msgstr ""
-msgid "Runners currently online: %{active_runners_count}"
-msgstr ""
-
msgid "Runners page."
msgstr ""
@@ -32062,9 +32299,6 @@ 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|Change to project runner"
-msgstr ""
-
msgid "Runners|Checkbox"
msgstr ""
@@ -32120,6 +32354,9 @@ 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|Group"
msgstr ""
@@ -32310,6 +32547,9 @@ 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 ""
@@ -32394,9 +32634,6 @@ msgstr ""
msgid "Runners|Windows 2019 Shell with manual scaling and optional scheduling. Non-spot."
msgstr ""
-msgid "Runners|You are about to change this instance runner to a project runner. This operation is not reversible. Are you sure you want to continue?"
-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 ""
@@ -32409,9 +32646,6 @@ msgstr ""
msgid "Runners|group"
msgstr ""
-msgid "Runners|locked"
-msgstr ""
-
msgid "Runners|never contacted"
msgstr ""
@@ -32867,9 +33101,6 @@ msgstr ""
msgid "Seats usage data is updated every day at 12:00pm UTC"
msgstr ""
-msgid "Secondary"
-msgstr ""
-
msgid "Secondary email:"
msgstr ""
@@ -32891,9 +33122,6 @@ msgstr ""
msgid "Secure Files"
msgstr ""
-msgid "Secure Files|File did not match the provided checksum"
-msgstr ""
-
msgid "Secure token that identifies an external storage request."
msgstr ""
@@ -33080,6 +33308,9 @@ msgstr ""
msgid "SecurityConfiguration|Vulnerability details and statistics in the merge request"
msgstr ""
+msgid "SecurityOrchestration| and "
+msgstr ""
+
msgid "SecurityOrchestration| or "
msgstr ""
@@ -33095,6 +33326,9 @@ msgstr ""
msgid "SecurityOrchestration|%{scanners} %{severities} in an open merge request targeting %{branches}."
msgstr ""
+msgid "SecurityOrchestration|.yaml mode"
+msgstr ""
+
msgid "SecurityOrchestration|.yaml preview"
msgstr ""
@@ -33110,10 +33344,7 @@ msgstr ""
msgid "SecurityOrchestration|All policies"
msgstr ""
-msgid "SecurityOrchestration|All scanners find"
-msgstr ""
-
-msgid "SecurityOrchestration|Allow all inbound traffic to all pods from all pods on ports 443/TCP."
+msgid "SecurityOrchestration|Allow up to 10 minutes for any policy changes to take effect."
msgstr ""
msgid "SecurityOrchestration|An error occurred assigning your security policy project"
@@ -33122,16 +33353,40 @@ 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|Description"
+msgid "SecurityOrchestration|Create more robust vulnerability rules and apply them to all your projects."
msgstr ""
-msgid "SecurityOrchestration|Don't show the alert anymore"
+msgid "SecurityOrchestration|Create policy"
+msgstr ""
+
+msgid "SecurityOrchestration|Create security policy"
msgstr ""
-msgid "SecurityOrchestration|Edit network policy"
+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|Don't show the alert anymore"
msgstr ""
msgid "SecurityOrchestration|Edit policy"
@@ -33140,7 +33395,7 @@ msgstr ""
msgid "SecurityOrchestration|Edit policy project"
msgstr ""
-msgid "SecurityOrchestration|Edit scan exection policy"
+msgid "SecurityOrchestration|Edit scan execution policy"
msgstr ""
msgid "SecurityOrchestration|Edit scan result policy"
@@ -33158,28 +33413,16 @@ 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|If you are using Auto DevOps, your %{monospacedStart}auto-deploy-values.yaml%{monospacedEnd} file will not be updated if you change a policy in this section. Auto DevOps users should make changes by following the %{linkStart}Container Network Policy documentation%{linkEnd}."
-msgstr ""
-
msgid "SecurityOrchestration|Invalid policy type"
msgstr ""
msgid "SecurityOrchestration|Latest scan run against %{agent}"
msgstr ""
-msgid "SecurityOrchestration|Network"
-msgstr ""
-
-msgid "SecurityOrchestration|Network policy"
-msgstr ""
-
-msgid "SecurityOrchestration|New network policy"
-msgstr ""
-
msgid "SecurityOrchestration|New policy"
msgstr ""
-msgid "SecurityOrchestration|New scan exection policy"
+msgid "SecurityOrchestration|New scan execution policy"
msgstr ""
msgid "SecurityOrchestration|New scan result policy"
@@ -33203,6 +33446,9 @@ msgstr ""
msgid "SecurityOrchestration|Policies"
msgstr ""
+msgid "SecurityOrchestration|Policies created in this project are applied through a background job that runs once every 10 minutes."
+msgstr ""
+
msgid "SecurityOrchestration|Policy Type"
msgstr ""
@@ -33212,6 +33458,9 @@ msgstr ""
msgid "SecurityOrchestration|Policy cannot be enabled without branch information"
msgstr ""
+msgid "SecurityOrchestration|Policy definition"
+msgstr ""
+
msgid "SecurityOrchestration|Policy description"
msgstr ""
@@ -33221,15 +33470,18 @@ msgstr ""
msgid "SecurityOrchestration|Policy status"
msgstr ""
-msgid "SecurityOrchestration|Policy summary"
-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 ""
@@ -33242,6 +33494,9 @@ msgstr ""
msgid "SecurityOrchestration|Runs a %{action} scan"
msgstr ""
+msgid "SecurityOrchestration|Save changes"
+msgstr ""
+
msgid "SecurityOrchestration|Scan Execution"
msgstr ""
@@ -33278,6 +33533,9 @@ 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 ""
@@ -33293,6 +33551,9 @@ 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 ""
@@ -33308,6 +33569,9 @@ 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 ""
@@ -33332,10 +33596,10 @@ 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|Use network policies to create firewall rules for network connections in your Kubernetes cluster."
+msgid "SecurityOrchestration|View policy project"
msgstr ""
-msgid "SecurityOrchestration|View policy project"
+msgid "SecurityOrchestration|You don't have any security policies yet"
msgstr ""
msgid "SecurityOrchestration|a"
@@ -33389,10 +33653,10 @@ msgstr ""
msgid "SecurityPolicies|+%{count} more"
msgstr ""
-msgid "SecurityPolicies|Environment(s)"
+msgid "SecurityPolicies|Policy type"
msgstr ""
-msgid "SecurityPolicies|Policy type"
+msgid "SecurityReports|%{count} Selected"
msgstr ""
msgid "SecurityReports|%{count}+ projects"
@@ -33611,7 +33875,7 @@ msgstr ""
msgid "SecurityReports|Take survey"
msgstr ""
-msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
+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}."
@@ -33797,6 +34061,9 @@ msgstr ""
msgid "Select branch"
msgstr ""
+msgid "Select branches"
+msgstr ""
+
msgid "Select due date"
msgstr ""
@@ -33812,9 +34079,6 @@ msgstr ""
msgid "Select group or project"
msgstr ""
-msgid "Select groups to replicate"
-msgstr ""
-
msgid "Select health status"
msgstr ""
@@ -33857,9 +34121,6 @@ msgstr ""
msgid "Select reviewer(s)"
msgstr ""
-msgid "Select shards to replicate"
-msgstr ""
-
msgid "Select source"
msgstr ""
@@ -33908,9 +34169,6 @@ 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 "Selective synchronization"
-msgstr ""
-
msgid "Self monitoring"
msgstr ""
@@ -34112,13 +34370,13 @@ 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 account generated successfully"
+msgid "Service Ping payload not found in the application cache"
msgstr ""
-msgid "Service accounts"
+msgid "Service account generated successfully"
msgstr ""
-msgid "Service ping is disabled in your configuration file, and cannot be enabled through this form."
+msgid "Service accounts"
msgstr ""
msgid "Service usage data"
@@ -34268,9 +34526,6 @@ msgstr ""
msgid "Set the per-user rate limit for notes created by web or API requests."
msgstr ""
-msgid "Set the timeout in seconds to send a secondary site status to the primary and IPs allowed for the secondary sites."
-msgstr ""
-
msgid "Set this number to 0 to disable the limit."
msgstr ""
@@ -34307,18 +34562,12 @@ 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 verification limit and frequency."
-msgstr ""
-
msgid "Set weight"
msgstr ""
msgid "Set weight to %{weight}."
msgstr ""
-msgid "Set what should be replicated by this secondary site."
-msgstr ""
-
msgid "SetStatusModal|An indicator appears next to your name and avatar"
msgstr ""
@@ -34416,9 +34665,6 @@ msgstr ""
msgid "SeverityWidget|There was an error while updating severity."
msgstr ""
-msgid "Shards to synchronize"
-msgstr ""
-
msgid "Share"
msgstr ""
@@ -35320,6 +35566,12 @@ 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 ""
@@ -35842,6 +36094,12 @@ 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 ""
@@ -35968,27 +36226,6 @@ msgstr ""
msgid "SubscriptionBanner|Export license usage file"
msgstr ""
-msgid "SubscriptionEmail|%{doc_link_start}Please reach out if you have questions%{doc_link_end}, and we'll be happy to assist."
-msgstr ""
-
-msgid "SubscriptionEmail|Additional charges for your GitLab subscription"
-msgstr ""
-
-msgid "SubscriptionEmail|Dear %{customer_name},"
-msgstr ""
-
-msgid "SubscriptionEmail|GitLab Billing Team"
-msgstr ""
-
-msgid "SubscriptionEmail|Thank you for your business!"
-msgstr ""
-
-msgid "SubscriptionEmail|You can find more information about the quarterly reconciliation process in %{doc_link_start}our documentation%{doc_link_end}."
-msgstr ""
-
-msgid "SubscriptionEmail|You have exceeded the number of seats in your GitLab subscription %{subscription_name} by %{seat_quantity}. Even if you've exceeded the seats in your subscription, you can continue to add users, and GitLab will bill you a prorated amount for any seat overages on a quarterly basis."
-msgstr ""
-
msgid "SubscriptionTable|Add seats"
msgstr ""
@@ -36181,6 +36418,12 @@ msgstr ""
msgid "SuggestedColors|Crimson"
msgstr ""
+msgid "SuggestedColors|Current addition color"
+msgstr ""
+
+msgid "SuggestedColors|Current removal color"
+msgstr ""
+
msgid "SuggestedColors|Dark coral"
msgstr ""
@@ -36196,6 +36439,12 @@ msgstr ""
msgid "SuggestedColors|Deep violet"
msgstr ""
+msgid "SuggestedColors|Default addition color"
+msgstr ""
+
+msgid "SuggestedColors|Default removal color"
+msgstr ""
+
msgid "SuggestedColors|Gray"
msgstr ""
@@ -36214,6 +36463,9 @@ msgstr ""
msgid "SuggestedColors|Medium sea green"
msgstr ""
+msgid "SuggestedColors|Orange"
+msgstr ""
+
msgid "SuggestedColors|Red"
msgstr ""
@@ -36256,7 +36508,7 @@ msgstr ""
msgid "SuperSonics|Activation code"
msgstr ""
-msgid "SuperSonics|An error occurred while activating your subscription."
+msgid "SuperSonics|An error occurred while adding your subscription."
msgstr ""
msgid "SuperSonics|Billable users"
@@ -36265,9 +36517,6 @@ msgstr ""
msgid "SuperSonics|Buy subscription"
msgstr ""
-msgid "SuperSonics|Cloud license"
-msgstr ""
-
msgid "SuperSonics|Cloud licensing"
msgstr ""
@@ -36292,6 +36541,9 @@ 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 ""
@@ -36301,7 +36553,10 @@ msgstr ""
msgid "SuperSonics|Maximum users"
msgstr ""
-msgid "SuperSonics|Offline cloud"
+msgid "SuperSonics|Offline license"
+msgstr ""
+
+msgid "SuperSonics|Online license"
msgstr ""
msgid "SuperSonics|Paste your activation code"
@@ -36359,9 +36614,6 @@ 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 learn more about %{activationLinkStart}activating your subscription%{activationLinkEnd}. 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 ""
@@ -36446,9 +36698,6 @@ msgstr ""
msgid "Synced"
msgstr ""
-msgid "Synchronization settings"
-msgstr ""
-
msgid "Synchronize LDAP"
msgstr ""
@@ -36614,6 +36863,9 @@ msgstr ""
msgid "TagsPage|Repository has no tags yet."
msgstr ""
+msgid "TagsPage|Sorry, your filter produced no results."
+msgstr ""
+
msgid "TagsPage|Tags"
msgstr ""
@@ -36807,10 +37059,7 @@ msgstr ""
msgid "Terraform|Generating the report caused an error."
msgstr ""
-msgid "Terraform|Get started with Terraform"
-msgstr ""
-
-msgid "Terraform|How to use GitLab-managed Terraform State?"
+msgid "Terraform|How to use GitLab-managed Terraform state?"
msgstr ""
msgid "Terraform|Job status"
@@ -36891,6 +37140,9 @@ msgstr ""
msgid "Terraform|You cannot remove the State file because it's locked. Unlock the State file first before removing it."
msgstr ""
+msgid "Terraform|Your project doesn't have any Terraform state files"
+msgstr ""
+
msgid "Test"
msgstr ""
@@ -36900,9 +37152,6 @@ msgstr ""
msgid "Test case"
msgstr ""
-msgid "Test coverage parsing"
-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] ""
@@ -37149,9 +37398,6 @@ msgstr ""
msgid "The comparison view may be inaccurate due to merge conflicts."
msgstr ""
-msgid "The compliance report captures merged changes that violate compliance best practices."
-msgstr ""
-
msgid "The compliance report shows the merge request violations merged in protected environments."
msgstr ""
@@ -37459,9 +37705,6 @@ msgstr ""
msgid "The project was successfully imported."
msgstr ""
-msgid "The regular expression used to find test coverage output in the job log. For example, use %{regex} for Simplecov (Ruby). Leave blank to disable."
-msgstr ""
-
msgid "The related CI build failed."
msgstr ""
@@ -37573,7 +37816,7 @@ msgstr ""
msgid "The vulnerability is no longer detected. Verify the vulnerability has been remediated before changing its status."
msgstr ""
-msgid "There are Advanced Search migrations pending that require indexing to pause. Indexing must remain paused until GitLab completes the migrations."
+msgid "Theme"
msgstr ""
msgid "There are currently no events."
@@ -37753,12 +37996,21 @@ 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 ""
@@ -37810,12 +38062,6 @@ msgstr ""
msgid "There was an error fetching the %{replicableType}"
msgstr ""
-msgid "There was an error fetching the Geo Settings"
-msgstr ""
-
-msgid "There was an error fetching the Sites's Groups"
-msgstr ""
-
msgid "There was an error fetching the deploy freezes."
msgstr ""
@@ -37864,9 +38110,6 @@ msgstr ""
msgid "There was an error retrieving the Jira users."
msgstr ""
-msgid "There was an error saving this Geo Site"
-msgstr ""
-
msgid "There was an error saving your changes."
msgstr ""
@@ -37882,9 +38125,6 @@ msgstr ""
msgid "There was an error trying to validate your query"
msgstr ""
-msgid "There was an error updating the Geo Settings"
-msgstr ""
-
msgid "There was an error updating the Maintenance Mode Settings"
msgstr ""
@@ -38128,6 +38368,9 @@ 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 ""
@@ -38239,7 +38482,7 @@ msgstr ""
msgid "This issue is in a child epic of the filtered epic"
msgstr ""
-msgid "This job depends on other jobs with expired/erased artifacts: %{invalid_dependencies}"
+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"
@@ -38386,9 +38629,6 @@ msgstr ""
msgid "This only applies to repository indexing operations."
msgstr ""
-msgid "This option is only available on GitLab.com"
-msgstr ""
-
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
msgstr ""
@@ -38542,9 +38782,6 @@ msgstr ""
msgid "Thread to reply to cannot be found"
msgstr ""
-msgid "Threat monitoring"
-msgstr ""
-
msgid "ThreatMonitoring|Alert Details"
msgstr ""
@@ -38713,9 +38950,6 @@ msgstr ""
msgid "Time from last commit to merge"
msgstr ""
-msgid "Time in seconds"
-msgstr ""
-
msgid "Time of import: %{importTime}"
msgstr ""
@@ -38884,10 +39118,10 @@ msgstr ""
msgid "Timeago|right now"
msgstr ""
-msgid "Timeline|Turn timeline view off"
+msgid "Timeline|Turn recent updates view off"
msgstr ""
-msgid "Timeline|Turn timeline view on"
+msgid "Timeline|Turn recent updates view on"
msgstr ""
msgid "Timeout"
@@ -38958,6 +39192,9 @@ 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 ""
@@ -38967,6 +39204,9 @@ 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 ""
@@ -39018,9 +39258,6 @@ msgstr ""
msgid "To get started, use the link below to confirm your account."
msgstr ""
-msgid "To help improve GitLab and its user experience, GitLab periodically collects usage information."
-msgstr ""
-
msgid "To help improve GitLab, we would like to periodically %{docs_link}. This can be changed at any time in %{settings_link}."
msgstr ""
@@ -39267,7 +39504,10 @@ msgstr ""
msgid "Topic avatar for %{name} will be removed. This cannot be undone."
msgstr ""
-msgid "Topic name"
+msgid "Topic slug (name)"
+msgstr ""
+
+msgid "Topic title"
msgstr ""
msgid "Topic was successfully updated."
@@ -39507,7 +39747,7 @@ 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."
+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."
@@ -39546,6 +39786,9 @@ 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 ""
@@ -39588,9 +39831,6 @@ msgstr ""
msgid "Tuesday"
msgstr ""
-msgid "Tuning settings"
-msgstr ""
-
msgid "Turn off"
msgstr ""
@@ -39642,9 +39882,6 @@ msgstr ""
msgid "Type"
msgstr ""
-msgid "Type/State"
-msgstr ""
-
msgid "U2F Devices (%{length})"
msgstr ""
@@ -39750,6 +39987,9 @@ 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 ""
@@ -40029,9 +40269,6 @@ msgstr ""
msgid "Update it"
msgstr ""
-msgid "Update iteration"
-msgstr ""
-
msgid "Update milestone"
msgstr ""
@@ -40080,9 +40317,6 @@ msgstr ""
msgid "Updated date"
msgstr ""
-msgid "Updates"
-msgstr ""
-
msgid "Updating"
msgstr ""
@@ -40188,6 +40422,12 @@ 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 ""
@@ -40197,7 +40437,7 @@ msgstr ""
msgid "UsageQuota|File attachments and smaller design graphics."
msgstr ""
-msgid "UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in %{strong_start}%{namespace_type} settings &gt; Usage quotas%{strong_end}."
+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."
@@ -40248,6 +40488,9 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
+msgid "UsageQuota|Shared runner usage"
+msgstr ""
+
msgid "UsageQuota|Snippets"
msgstr ""
@@ -40296,6 +40539,12 @@ 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 ""
@@ -40308,9 +40557,6 @@ msgstr ""
msgid "UsageQuota|Usage quotas help link"
msgstr ""
-msgid "UsageQuota|Usage since"
-msgstr ""
-
msgid "UsageQuota|When you purchase additional storage, we automatically unlock projects that were locked when you reached the %{actualRepositorySizeLimit} limit."
msgstr ""
@@ -40461,7 +40707,7 @@ msgstr ""
msgid "Use hashed storage"
msgstr ""
-msgid "Use hashed storage paths for newly created and renamed repositories. Always enabled since 13.0."
+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"
@@ -40857,7 +41103,7 @@ 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."
+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."
@@ -41052,9 +41298,6 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
-msgid "Verification concurrency limit"
-msgstr ""
-
msgid "Verification status"
msgstr ""
@@ -41595,7 +41838,7 @@ msgstr ""
msgid "Vulnerability|Image"
msgstr ""
-msgid "Vulnerability|Information related how the vulnerability was discovered and its impact to the system."
+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."
@@ -41706,9 +41949,6 @@ msgstr ""
msgid "We are currently unable to fetch data for this graph."
msgstr ""
-msgid "We are currently unable to fetch data for this pipeline."
-msgstr ""
-
msgid "We could not determine the path to remove the epic"
msgstr ""
@@ -41856,7 +42096,7 @@ msgstr ""
msgid "Webhooks|A comment is added to a confidential issue."
msgstr ""
-msgid "Webhooks|A comment is added to an issue."
+msgid "Webhooks|A comment is added to an issue or merge request."
msgstr ""
msgid "Webhooks|A confidential issue is created, updated, closed, or reopened."
@@ -42051,9 +42291,6 @@ msgstr ""
msgid "What does this command do?"
msgstr ""
-msgid "What is Auto DevOps?"
-msgstr ""
-
msgid "What is Markdown?"
msgstr ""
@@ -42063,9 +42300,6 @@ msgstr ""
msgid "What is squashing?"
msgstr ""
-msgid "What is time tracking?"
-msgstr ""
-
msgid "What is your job title? (optional)"
msgstr ""
@@ -42093,7 +42327,7 @@ msgstr ""
msgid "When enabled, cleanup polices execute faster but put more load on Redis."
msgstr ""
-msgid "When enabled, existing personal access tokens may be revoked. Leave blank for no limit."
+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."
@@ -42102,9 +42336,6 @@ msgstr ""
msgid "When merge requests and commits in the default branch close, any issues they reference also close."
msgstr ""
-msgid "When paused, GitLab still tracks the changes. This is useful for cluster/index migrations."
-msgstr ""
-
msgid "When this merge request is accepted"
msgid_plural "When these merge requests are accepted"
msgstr[0] ""
@@ -42145,7 +42376,7 @@ msgstr ""
msgid "Who will be using this group?"
msgstr ""
-msgid "Why are you signing up? (Optional)"
+msgid "Why are you signing up? (optional)"
msgstr ""
msgid "Wiki"
@@ -42379,12 +42610,18 @@ msgstr ""
msgid "Work in progress Limit"
msgstr ""
+msgid "WorkItem|Are you sure you want to delete the work item? This action cannot be reversed."
+msgstr ""
+
msgid "WorkItem|Convert to work item"
msgstr ""
msgid "WorkItem|Create work item"
msgstr ""
+msgid "WorkItem|Delete work item"
+msgstr ""
+
msgid "WorkItem|New Task"
msgstr ""
@@ -42394,6 +42631,9 @@ 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 ""
@@ -42409,6 +42649,9 @@ msgstr ""
msgid "WorkItem|Work Items"
msgstr ""
+msgid "WorkItem|Work item deleted"
+msgstr ""
+
msgid "Would you like to create a new branch?"
msgstr ""
@@ -42472,6 +42715,10 @@ 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] ""
+
msgid "You are about to delete this forked project containing:"
msgstr ""
@@ -42568,7 +42815,7 @@ msgstr ""
msgid "You are receiving this message because you are a GitLab administrator for %{url}."
msgstr ""
-msgid "You are signed in to GitLab as %{user_link}"
+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."
@@ -42739,6 +42986,9 @@ 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 ""
@@ -43112,6 +43362,9 @@ 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 ""
+
msgid "Your %{spammable_entity_type} has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."
msgstr ""
@@ -43440,15 +43693,15 @@ msgstr ""
msgid "ZentaoIntegration|If different from Web URL."
msgstr ""
-msgid "ZentaoIntegration|Issue list"
-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 ""
@@ -43538,9 +43791,6 @@ msgid "approval"
msgid_plural "approvals"
msgstr[0] ""
-msgid "approved by: "
-msgstr ""
-
msgid "archived"
msgstr ""
@@ -43593,6 +43843,15 @@ 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 ""
@@ -43729,6 +43988,9 @@ 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 ""
@@ -44435,7 +44697,7 @@ msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
-msgid "merged %{timeAgo}"
+msgid "mergedCommitsAdded|(commits were squashed)"
msgstr ""
msgid "metric_id must be unique across a project"
@@ -44447,6 +44709,12 @@ 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 ""
@@ -44456,6 +44724,12 @@ 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 ""
@@ -44534,9 +44808,6 @@ msgstr ""
msgid "mrWidget|Cancel auto-merge"
msgstr ""
-msgid "mrWidget|Check out branch"
-msgstr ""
-
msgid "mrWidget|Checking if merge request can be merged…"
msgstr ""
@@ -44577,9 +44848,6 @@ msgstr ""
msgid "mrWidget|Does not delete the source branch"
msgstr ""
-msgid "mrWidget|Email patches"
-msgstr ""
-
msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
@@ -44689,9 +44957,6 @@ msgstr ""
msgid "mrWidget|Open in Web IDE"
msgstr ""
-msgid "mrWidget|Plain diff"
-msgstr ""
-
msgid "mrWidget|Please restore it or use a different %{type} branch."
msgstr ""
@@ -44839,6 +45104,9 @@ msgstr ""
msgid "my-channel"
msgstr ""
+msgid "my-topic"
+msgstr ""
+
msgid "need attention"
msgstr ""
@@ -44854,9 +45122,6 @@ msgstr ""
msgid "new merge request"
msgstr ""
-msgid "no approvers"
-msgstr ""
-
msgid "no expiration"
msgstr ""
@@ -44872,6 +45137,12 @@ msgstr ""
msgid "none"
msgstr ""
+msgid "not authorized to create member"
+msgstr ""
+
+msgid "not authorized to update member"
+msgstr ""
+
msgid "not found"
msgstr ""
@@ -44928,9 +45199,6 @@ msgstr ""
msgid "pending deletion"
msgstr ""
-msgid "per day"
-msgstr ""
-
msgid "personal access token"
msgstr ""
@@ -45057,6 +45325,9 @@ msgid "reply"
msgid_plural "replies"
msgstr[0] ""
+msgid "reply should have same confidentiality as top-level note"
+msgstr ""
+
msgid "repositories"
msgstr ""
diff --git a/metrics_server/dependencies.rb b/metrics_server/dependencies.rb
index bfa6aae8ef8..3f188658ba2 100644
--- a/metrics_server/dependencies.rb
+++ b/metrics_server/dependencies.rb
@@ -26,7 +26,6 @@ require_relative '../lib/gitlab/metrics/exporter/base_exporter'
require_relative '../lib/gitlab/metrics/exporter/web_exporter'
require_relative '../lib/gitlab/metrics/exporter/sidekiq_exporter'
require_relative '../lib/gitlab/metrics/exporter/metrics_middleware'
-require_relative '../lib/gitlab/metrics/exporter/health_checks_middleware'
require_relative '../lib/gitlab/metrics/exporter/gc_request_middleware'
require_relative '../lib/gitlab/health_checks/probes/collection'
require_relative '../lib/gitlab/health_checks/probes/status'
diff --git a/metrics_server/metrics_server.rb b/metrics_server/metrics_server.rb
index 695f3a65930..a5c448b5105 100644
--- a/metrics_server/metrics_server.rb
+++ b/metrics_server/metrics_server.rb
@@ -7,6 +7,10 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
PumaProcessSupervisor = Class.new(Gitlab::ProcessSupervisor)
class << self
+ def version
+ Rails.root.join('GITLAB_METRICS_EXPORTER_VERSION').read.chomp
+ end
+
def start_for_puma
metrics_dir = ::Prometheus::Client.configuration.multiprocess_files_dir
@@ -18,22 +22,54 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
supervisor = PumaProcessSupervisor.instance
supervisor.supervise(start_server.call) do
- next unless supervisor.alive
-
Gitlab::AppLogger.info('Puma metrics server terminated, restarting...')
start_server.call
end
end
- def spawn(target, metrics_dir:, gitlab_config: nil, wipe_metrics_dir: false)
+ def start_for_sidekiq(**options)
+ if new_metrics_server?
+ self.spawn('sidekiq', **options)
+ else
+ self.fork('sidekiq', **options)
+ end
+ end
+
+ def spawn(target, metrics_dir:, **options)
+ return spawn_ruby_server(target, metrics_dir: metrics_dir, **options) unless new_metrics_server?
+
+ name = settings_key(target)
+ settings = ::Settings.monitoring[name]
+ path = options[:path]&.then { |p| Pathname.new(p) } || Pathname.new('')
+ cmd = path.join('gitlab-metrics-exporter').to_path
+ env = {
+ 'GME_MMAP_METRICS_DIR' => metrics_dir.to_s,
+ 'GME_PROBES' => 'self,mmap',
+ 'GME_SERVER_HOST' => settings['address'],
+ 'GME_SERVER_PORT' => settings['port'].to_s
+ }
+
+ if settings['log_enabled']
+ env['GME_LOG_FILE'] = File.join(Rails.root, 'log', "#{name}.log")
+ env['GME_LOG_LEVEL'] = 'info'
+ else
+ env['GME_LOG_LEVEL'] = 'quiet'
+ end
+
+ Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid|
+ Process.detach(pid)
+ end
+ end
+
+ def spawn_ruby_server(target, metrics_dir:, wipe_metrics_dir: false, **options)
ensure_valid_target!(target)
cmd = "#{Rails.root}/bin/metrics-server"
env = {
'METRICS_SERVER_TARGET' => target,
- 'WIPE_METRICS_DIR' => wipe_metrics_dir ? '1' : '0'
+ 'WIPE_METRICS_DIR' => wipe_metrics_dir ? '1' : '0',
+ 'GITLAB_CONFIG' => ENV['GITLAB_CONFIG']
}
- env['GITLAB_CONFIG'] = gitlab_config if gitlab_config
Process.spawn(env, cmd, err: $stderr, out: $stdout, pgroup: true).tap do |pid|
Process.detach(pid)
@@ -66,9 +102,21 @@ class MetricsServer # rubocop:disable Gitlab/NamespacedClass
private
+ def new_metrics_server?
+ Gitlab::Utils.to_boolean(ENV['GITLAB_GOLANG_METRICS_SERVER'])
+ end
+
def ensure_valid_target!(target)
raise "Target must be one of [puma,sidekiq]" unless %w(puma sidekiq).include?(target)
end
+
+ def settings_key(target)
+ case target
+ when 'puma' then 'web_exporter'
+ when 'sidekiq' then 'sidekiq_exporter'
+ else ensure_valid_target!(target)
+ end
+ end
end
def initialize(target, metrics_dir, wipe_metrics_dir)
diff --git a/package.json b/package.json
index 8080ac4f664..73778428426 100644
--- a/package.json
+++ b/package.json
@@ -17,11 +17,11 @@
"jest:ci:minimal": "jest --config jest.config.js --ci --coverage --findRelatedTests $(cat tmp/changed_files.txt) --passWithNoTests --testSequencer ./scripts/frontend/parallel_ci_sequencer.js",
"jest:integration": "jest --config jest.config.integration.js",
"jsdoc": "jsdoc -c config/jsdocs.config.js",
- "lint:eslint": "yarn run internal:eslint",
- "lint:eslint:fix": "yarn run internal:eslint --fix",
- "lint:eslint:all": "yarn run internal:eslint .",
+ "lint:eslint": "node scripts/frontend/eslint.js",
+ "lint:eslint:fix": "node scripts/frontend/eslint.js --fix",
+ "lint:eslint:all": "node scripts/frontend/eslint.js .",
"lint:eslint:all:fix": "yarn run lint:eslint:all --fix",
- "lint:eslint:report": "yarn run internal:eslint --format html --output-file ./eslint-report.html --no-inline-config .",
+ "lint:eslint:report": "node scripts/frontend/eslint.js --format html --output-file ./eslint-report.html --no-inline-config .",
"lint:eslint:staged": "scripts/frontend/execute-on-staged-files.sh internal:eslint '(js|vue)'",
"lint:eslint:staged:fix": "yarn run lint:eslint:staged --fix",
"lint:prettier": "yarn run prettier --check '**/*.{graphql,js,vue}'",
@@ -56,14 +56,14 @@
"@babel/preset-env": "^7.10.1",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
- "@gitlab/svgs": "2.8.0",
- "@gitlab/ui": "38.8.1",
- "@gitlab/visual-review-tools": "1.6.1",
+ "@gitlab/svgs": "2.14.0",
+ "@gitlab/ui": "40.2.1",
+ "@gitlab/visual-review-tools": "1.7.3",
"@rails/actioncable": "6.1.4-7",
"@rails/ujs": "6.1.4-7",
"@sentry/browser": "5.30.0",
"@sourcegraph/code-host-integration": "0.0.60",
- "@tiptap/core": "^2.0.0-beta.174",
+ "@tiptap/core": "^2.0.0-beta.175",
"@tiptap/extension-blockquote": "^2.0.0-beta.26",
"@tiptap/extension-bold": "^2.0.0-beta.26",
"@tiptap/extension-bullet-list": "^2.0.0-beta.26",
@@ -78,7 +78,7 @@
"@tiptap/extension-horizontal-rule": "^2.0.0-beta.31",
"@tiptap/extension-image": "^2.0.0-beta.27",
"@tiptap/extension-italic": "^2.0.0-beta.26",
- "@tiptap/extension-link": "^2.0.0-beta.36",
+ "@tiptap/extension-link": "^2.0.0-beta.37",
"@tiptap/extension-list-item": "^2.0.0-beta.20",
"@tiptap/extension-ordered-list": "^2.0.0-beta.27",
"@tiptap/extension-paragraph": "^2.0.0-beta.23",
@@ -89,17 +89,17 @@
"@tiptap/extension-table-cell": "^2.0.0-beta.20",
"@tiptap/extension-table-header": "^2.0.0-beta.22",
"@tiptap/extension-table-row": "^2.0.0-beta.19",
- "@tiptap/extension-task-item": "^2.0.0-beta.31",
+ "@tiptap/extension-task-item": "^2.0.0-beta.32",
"@tiptap/extension-task-list": "^2.0.0-beta.26",
"@tiptap/extension-text": "^2.0.0-beta.15",
- "@tiptap/vue-2": "^2.0.0-beta.77",
+ "@tiptap/vue-2": "^2.0.0-beta.78",
"@toast-ui/editor": "^2.5.2",
"@toast-ui/vue-editor": "^2.5.2",
"apollo-upload-client": "15.0.0",
"autosize": "^5.0.1",
"aws-sdk": "^2.637.0",
"axios": "^0.24.0",
- "babel-loader": "^8.2.4",
+ "babel-loader": "^8.2.5",
"babel-plugin-lodash": "^3.3.4",
"bootstrap": "4.5.3",
"cache-loader": "^4.1.0",
@@ -109,7 +109,7 @@
"codesandbox-api": "0.0.23",
"compression-webpack-plugin": "^5.0.2",
"copy-webpack-plugin": "^6.4.1",
- "core-js": "^3.22.0",
+ "core-js": "^3.22.5",
"cron-validator": "^1.1.1",
"cronstrue": "^1.122.0",
"cropper": "^2.3.0",
@@ -120,7 +120,7 @@
"dateformat": "^5.0.1",
"deckar01-task_list": "^2.3.1",
"diff": "^3.4.0",
- "dompurify": "^2.3.6",
+ "dompurify": "^2.3.8",
"dropzone": "^4.2.0",
"editorconfig": "^0.15.3",
"emoji-regex": "^10.0.0",
@@ -129,13 +129,14 @@
"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",
"immer": "^7.0.7",
"ipaddr.js": "^1.9.1",
"jed": "^1.1.1",
"jquery": "^3.6.0",
"jquery.caret": "^0.3.1",
- "js-cookie": "^2.2.1",
+ "js-cookie": "^3.0.0",
"js-yaml": "^3.13.1",
"jszip": "^3.1.3",
"jszip-utils": "^0.0.2",
@@ -144,7 +145,7 @@
"lowlight": "^2.5.0",
"marked": "^0.3.12",
"mathjax": "3",
- "mermaid": "^8.13.10",
+ "mermaid": "^9.1.1",
"minimatch": "^3.0.4",
"monaco-editor": "^0.25.2",
"monaco-editor-webpack-plugin": "^4.0.0",
@@ -161,7 +162,7 @@
"prosemirror-model": "^1.16.1",
"prosemirror-state": "^1.3.4",
"prosemirror-tables": "^1.1.1",
- "prosemirror-view": "^1.23.10",
+ "prosemirror-view": "^1.23.13",
"raphael": "^2.2.7",
"raw-loader": "^4.0.2",
"rehype-raw": "^6.1.1",
@@ -179,6 +180,7 @@
"three-stl-loader": "^1.0.4",
"timeago.js": "^4.0.2",
"unified": "^10.1.2",
+ "unist-util-visit-parents": "^5.1.0",
"url-loader": "^4.1.1",
"uuid": "8.1.0",
"visibilityjs": "^1.2.4",
@@ -203,9 +205,9 @@
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.10.1",
- "@gitlab/eslint-plugin": "12.0.1",
+ "@gitlab/eslint-plugin": "12.1.0",
"@gitlab/stylelint-config": "4.0.0",
- "@graphql-eslint/eslint-plugin": "3.0.0",
+ "@graphql-eslint/eslint-plugin": "3.10.2",
"@testing-library/dom": "^7.16.2",
"@types/jest": "^26.0.24",
"@vue/test-utils": "1.3.0",
@@ -249,17 +251,17 @@
"prettier": "2.2.1",
"prosemirror-schema-basic": "^1.1.2",
"prosemirror-schema-list": "^1.1.6",
- "prosemirror-test-builder": "^1.0.5",
+ "prosemirror-test-builder": "^1.0.6",
"purgecss": "^4.0.3",
"purgecss-from-html": "^4.0.3",
"sass": "^1.32.12",
"stylelint": "^14.3.0",
"timezone-mock": "^1.0.8",
"vue-jest": "4.0.1",
- "webpack-dev-server": "4.8.1",
+ "webpack-dev-server": "4.9.0",
"xhr-mock": "^2.5.1",
"yarn-check-webpack-plugin": "^1.2.0",
- "yarn-deduplicate": "^4.0.0"
+ "yarn-deduplicate": "^5.0.0"
},
"blockedDependencies": {
"bootstrap-vue": "https://docs.gitlab.com/ee/development/fe_guide/dependencies.html#bootstrapvue"
diff --git a/public/404.html b/public/404.html
index 68b4ab0bb34..48b803a7bff 100644
--- a/public/404.html
+++ b/public/404.html
@@ -67,8 +67,7 @@
<body>
<a href="/">
- <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo="
- alt="GitLab Logo" />
+ <img src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0yNC41MDcgOS41LS4wMzQtLjA5TDIxLjA4Mi41NjJhLjg5Ni44OTYgMCAwIDAtMS42OTQuMDkxbC0yLjI5IDcuMDFINy44MjVMNS41MzUuNjUzYS44OTguODk4IDAgMCAwLTEuNjk0LS4wOUwuNDUxIDkuNDExLjQxNiA5LjVhNi4yOTcgNi4yOTcgMCAwIDAgMi4wOSA3LjI3OGwuMDEyLjAxLjAzLjAyMiA1LjE2IDMuODY3IDIuNTYgMS45MzUgMS41NTQgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1IDUuMTk3LTMuODkuMDE0LS4wMUE2LjI5NyA2LjI5NyAwIDAgMCAyNC41MDcgOS41WiIKICAgICAgICBmaWxsPSIjRTI0MzI5Ii8+CiAgPHBhdGggZD0ibTI0LjUwNyA5LjUtLjAzNC0uMDlhMTEuNDQgMTEuNDQgMCAwIDAtNC41NiAyLjA1MWwtNy40NDcgNS42MzIgNC43NDIgMy41ODQgNS4xOTctMy44OS4wMTQtLjAxQTYuMjk3IDYuMjk3IDAgMCAwIDI0LjUwNyA5LjVaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KICA8cGF0aCBkPSJtNy43MDcgMjAuNjc3IDIuNTYgMS45MzUgMS41NTUgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1LTQuNzQzLTMuNTg0LTQuNzU1IDMuNTg0WiIKICAgICAgICBmaWxsPSIjRkNBMzI2Ii8+CiAgPHBhdGggZD0iTTUuMDEgMTEuNDYxYTExLjQzIDExLjQzIDAgMCAwLTQuNTYtMi4wNUwuNDE2IDkuNWE2LjI5NyA2LjI5NyAwIDAgMCAyLjA5IDcuMjc4bC4wMTIuMDEuMDMuMDIyIDUuMTYgMy44NjcgNC43NDUtMy41ODQtNy40NDQtNS42MzJaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KPC9zdmc+Cg==' alt="GitLab"/>
</a>
<h1>
404
diff --git a/public/422.html b/public/422.html
index a931e923efb..f7d12a2abca 100644
--- a/public/422.html
+++ b/public/422.html
@@ -67,8 +67,7 @@
<body>
<a href="/">
- <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo="
- alt="GitLab Logo" />
+ <img src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0yNC41MDcgOS41LS4wMzQtLjA5TDIxLjA4Mi41NjJhLjg5Ni44OTYgMCAwIDAtMS42OTQuMDkxbC0yLjI5IDcuMDFINy44MjVMNS41MzUuNjUzYS44OTguODk4IDAgMCAwLTEuNjk0LS4wOUwuNDUxIDkuNDExLjQxNiA5LjVhNi4yOTcgNi4yOTcgMCAwIDAgMi4wOSA3LjI3OGwuMDEyLjAxLjAzLjAyMiA1LjE2IDMuODY3IDIuNTYgMS45MzUgMS41NTQgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1IDUuMTk3LTMuODkuMDE0LS4wMUE2LjI5NyA2LjI5NyAwIDAgMCAyNC41MDcgOS41WiIKICAgICAgICBmaWxsPSIjRTI0MzI5Ii8+CiAgPHBhdGggZD0ibTI0LjUwNyA5LjUtLjAzNC0uMDlhMTEuNDQgMTEuNDQgMCAwIDAtNC41NiAyLjA1MWwtNy40NDcgNS42MzIgNC43NDIgMy41ODQgNS4xOTctMy44OS4wMTQtLjAxQTYuMjk3IDYuMjk3IDAgMCAwIDI0LjUwNyA5LjVaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KICA8cGF0aCBkPSJtNy43MDcgMjAuNjc3IDIuNTYgMS45MzUgMS41NTUgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1LTQuNzQzLTMuNTg0LTQuNzU1IDMuNTg0WiIKICAgICAgICBmaWxsPSIjRkNBMzI2Ii8+CiAgPHBhdGggZD0iTTUuMDEgMTEuNDYxYTExLjQzIDExLjQzIDAgMCAwLTQuNTYtMi4wNUwuNDE2IDkuNWE2LjI5NyA2LjI5NyAwIDAgMCAyLjA5IDcuMjc4bC4wMTIuMDEuMDMuMDIyIDUuMTYgMy44NjcgNC43NDUtMy41ODQtNy40NDQtNS42MzJaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KPC9zdmc+Cg==' alt="GitLab"/>
</a>
<h1>
422
diff --git a/public/500.html b/public/500.html
index 16d72353bdb..b9de6994d58 100644
--- a/public/500.html
+++ b/public/500.html
@@ -67,8 +67,7 @@
<body>
<a href="/">
- <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo="
- alt="GitLab Logo" />
+ <img src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0yNC41MDcgOS41LS4wMzQtLjA5TDIxLjA4Mi41NjJhLjg5Ni44OTYgMCAwIDAtMS42OTQuMDkxbC0yLjI5IDcuMDFINy44MjVMNS41MzUuNjUzYS44OTguODk4IDAgMCAwLTEuNjk0LS4wOUwuNDUxIDkuNDExLjQxNiA5LjVhNi4yOTcgNi4yOTcgMCAwIDAgMi4wOSA3LjI3OGwuMDEyLjAxLjAzLjAyMiA1LjE2IDMuODY3IDIuNTYgMS45MzUgMS41NTQgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1IDUuMTk3LTMuODkuMDE0LS4wMUE2LjI5NyA2LjI5NyAwIDAgMCAyNC41MDcgOS41WiIKICAgICAgICBmaWxsPSIjRTI0MzI5Ii8+CiAgPHBhdGggZD0ibTI0LjUwNyA5LjUtLjAzNC0uMDlhMTEuNDQgMTEuNDQgMCAwIDAtNC41NiAyLjA1MWwtNy40NDcgNS42MzIgNC43NDIgMy41ODQgNS4xOTctMy44OS4wMTQtLjAxQTYuMjk3IDYuMjk3IDAgMCAwIDI0LjUwNyA5LjVaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KICA8cGF0aCBkPSJtNy43MDcgMjAuNjc3IDIuNTYgMS45MzUgMS41NTUgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1LTQuNzQzLTMuNTg0LTQuNzU1IDMuNTg0WiIKICAgICAgICBmaWxsPSIjRkNBMzI2Ii8+CiAgPHBhdGggZD0iTTUuMDEgMTEuNDYxYTExLjQzIDExLjQzIDAgMCAwLTQuNTYtMi4wNUwuNDE2IDkuNWE2LjI5NyA2LjI5NyAwIDAgMCAyLjA5IDcuMjc4bC4wMTIuMDEuMDMuMDIyIDUuMTYgMy44NjcgNC43NDUtMy41ODQtNy40NDQtNS42MzJaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KPC9zdmc+Cg==' alt="GitLab"/>
</a>
<h1>
500
diff --git a/public/502.html b/public/502.html
index 77835767fa6..f3ccf40a643 100644
--- a/public/502.html
+++ b/public/502.html
@@ -67,8 +67,7 @@
<body>
<a href="/">
- <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo="
- alt="GitLab Logo" />
+ <img src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0yNC41MDcgOS41LS4wMzQtLjA5TDIxLjA4Mi41NjJhLjg5Ni44OTYgMCAwIDAtMS42OTQuMDkxbC0yLjI5IDcuMDFINy44MjVMNS41MzUuNjUzYS44OTguODk4IDAgMCAwLTEuNjk0LS4wOUwuNDUxIDkuNDExLjQxNiA5LjVhNi4yOTcgNi4yOTcgMCAwIDAgMi4wOSA3LjI3OGwuMDEyLjAxLjAzLjAyMiA1LjE2IDMuODY3IDIuNTYgMS45MzUgMS41NTQgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1IDUuMTk3LTMuODkuMDE0LS4wMUE2LjI5NyA2LjI5NyAwIDAgMCAyNC41MDcgOS41WiIKICAgICAgICBmaWxsPSIjRTI0MzI5Ii8+CiAgPHBhdGggZD0ibTI0LjUwNyA5LjUtLjAzNC0uMDlhMTEuNDQgMTEuNDQgMCAwIDAtNC41NiAyLjA1MWwtNy40NDcgNS42MzIgNC43NDIgMy41ODQgNS4xOTctMy44OS4wMTQtLjAxQTYuMjk3IDYuMjk3IDAgMCAwIDI0LjUwNyA5LjVaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KICA8cGF0aCBkPSJtNy43MDcgMjAuNjc3IDIuNTYgMS45MzUgMS41NTUgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1LTQuNzQzLTMuNTg0LTQuNzU1IDMuNTg0WiIKICAgICAgICBmaWxsPSIjRkNBMzI2Ii8+CiAgPHBhdGggZD0iTTUuMDEgMTEuNDYxYTExLjQzIDExLjQzIDAgMCAwLTQuNTYtMi4wNUwuNDE2IDkuNWE2LjI5NyA2LjI5NyAwIDAgMCAyLjA5IDcuMjc4bC4wMTIuMDEuMDMuMDIyIDUuMTYgMy44NjcgNC43NDUtMy41ODQtNy40NDQtNS42MzJaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KPC9zdmc+Cg==' alt="GitLab"/>
</a>
<h1>
502
diff --git a/public/503.html b/public/503.html
index ee2da9b1313..a81fa7f889a 100644
--- a/public/503.html
+++ b/public/503.html
@@ -67,8 +67,7 @@
<body>
<a href="/">
- <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjIxMCIgdmlld0JveD0iMCAwIDIxMCAyMTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTVsMzguNjQtMTE4LjkyMWgtNzcuMjhsMzguNjQgMTE4LjkyMXoiIGZpbGw9IiNlMjQzMjkiLz4KICA8cGF0aCBkPSJNMTA1LjA2MTQgMjAzLjY1NDhsLTM4LjY0LTExOC45MjFoLTU0LjE1M2w5Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTIuMjY4NSA4NC43MzQxbC0xMS43NDIgMzYuMTM5Yy0xLjA3MSAzLjI5Ni4xMDIgNi45MDcgMi45MDYgOC45NDRsMTAxLjYyOSA3My44MzgtOTIuNzkzLTExOC45MjF6IiBmaWxsPSIjZmNhMzI2Ii8+CiAgPHBhdGggZD0iTTEyLjI2ODUgODQuNzM0Mmg1NC4xNTNsLTIzLjI3My03MS42MjVjLTEuMTk3LTMuNjg2LTYuNDExLTMuNjg1LTcuNjA4IDBsLTIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+CiAgPHBhdGggZD0iTTEwNS4wNjE0IDIwMy42NTQ4bDM4LjY0LTExOC45MjFoNTQuMTUzbC05Mi43OTMgMTE4LjkyMXoiIGZpbGw9IiNmYzZkMjYiLz4KICA8cGF0aCBkPSJNMTk3Ljg1NDQgODQuNzM0MWwxMS43NDIgMzYuMTM5YzEuMDcxIDMuMjk2LS4xMDIgNi45MDctMi45MDYgOC45NDRsLTEwMS42MjkgNzMuODM4IDkyLjc5My0xMTguOTIxeiIgZmlsbD0iI2ZjYTMyNiIvPgogIDxwYXRoIGQ9Ik0xOTcuODU0NCA4NC43MzQyaC01NC4xNTNsMjMuMjczLTcxLjYyNWMxLjE5Ny0zLjY4NiA2LjQxMS0zLjY4NSA3LjYwOCAwbDIzLjI3MiA3MS42MjV6IiBmaWxsPSIjZTI0MzI5Ii8+Cjwvc3ZnPgo="
- alt="GitLab Logo" />
+ <img src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1IDI0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0yNC41MDcgOS41LS4wMzQtLjA5TDIxLjA4Mi41NjJhLjg5Ni44OTYgMCAwIDAtMS42OTQuMDkxbC0yLjI5IDcuMDFINy44MjVMNS41MzUuNjUzYS44OTguODk4IDAgMCAwLTEuNjk0LS4wOUwuNDUxIDkuNDExLjQxNiA5LjVhNi4yOTcgNi4yOTcgMCAwIDAgMi4wOSA3LjI3OGwuMDEyLjAxLjAzLjAyMiA1LjE2IDMuODY3IDIuNTYgMS45MzUgMS41NTQgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1IDUuMTk3LTMuODkuMDE0LS4wMUE2LjI5NyA2LjI5NyAwIDAgMCAyNC41MDcgOS41WiIKICAgICAgICBmaWxsPSIjRTI0MzI5Ii8+CiAgPHBhdGggZD0ibTI0LjUwNyA5LjUtLjAzNC0uMDlhMTEuNDQgMTEuNDQgMCAwIDAtNC41NiAyLjA1MWwtNy40NDcgNS42MzIgNC43NDIgMy41ODQgNS4xOTctMy44OS4wMTQtLjAxQTYuMjk3IDYuMjk3IDAgMCAwIDI0LjUwNyA5LjVaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KICA8cGF0aCBkPSJtNy43MDcgMjAuNjc3IDIuNTYgMS45MzUgMS41NTUgMS4xNzZhMS4wNTEgMS4wNTEgMCAwIDAgMS4yNjggMGwxLjU1NS0xLjE3NiAyLjU2LTEuOTM1LTQuNzQzLTMuNTg0LTQuNzU1IDMuNTg0WiIKICAgICAgICBmaWxsPSIjRkNBMzI2Ii8+CiAgPHBhdGggZD0iTTUuMDEgMTEuNDYxYTExLjQzIDExLjQzIDAgMCAwLTQuNTYtMi4wNUwuNDE2IDkuNWE2LjI5NyA2LjI5NyAwIDAgMCAyLjA5IDcuMjc4bC4wMTIuMDEuMDMuMDIyIDUuMTYgMy44NjcgNC43NDUtMy41ODQtNy40NDQtNS42MzJaIgogICAgICAgIGZpbGw9IiNGQzZEMjYiLz4KPC9zdmc+Cg==' alt="GitLab"/>
</a>
<h1>
503
diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png
deleted file mode 100644
index 05c8b0d0ccf..00000000000
--- a/public/apple-touch-icon-precomposed.png
+++ /dev/null
Binary files differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
index 05c8b0d0ccf..90507f61099 100644
--- a/public/apple-touch-icon.png
+++ b/public/apple-touch-icon.png
Binary files differ
diff --git a/public/slash-command-logo.png b/public/slash-command-logo.png
index 05c8b0d0ccf..12525056939 100644
--- a/public/slash-command-logo.png
+++ b/public/slash-command-logo.png
Binary files differ
diff --git a/qa/.rspec b/qa/.rspec
index b83d9b7aa65..68d481ca4d9 100644
--- a/qa/.rspec
+++ b/qa/.rspec
@@ -1,3 +1,5 @@
---color
+--force-color
+--order random
--format documentation
+--default-path qa/specs
--require spec_helper
diff --git a/qa/.rspec_internal b/qa/.rspec_internal
index ea32ca1e093..75786e123d4 100644
--- a/qa/.rspec_internal
+++ b/qa/.rspec_internal
@@ -1,4 +1,4 @@
--force-color
--order random
--format documentation
---require specs/spec_helper
+--require spec_helper
diff --git a/qa/Dockerfile b/qa/Dockerfile
index fa666daa927..4fd44ba02df 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -1,33 +1,17 @@
-FROM ruby:2.7-buster
+FROM registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bullseye-ruby-2.7:bundler-2.3-git-2.33-lfs-2.9-chrome-99-docker-20.10.14-gcloud-383-kubectl-1.23
LABEL maintainer="GitLab Quality Department <quality@gitlab.com>"
-ENV DEBIAN_FRONTEND="noninteractive"
-ENV DOCKER_VERSION="17.09.0-ce"
+ENV DEBIAN_FRONTEND="noninteractive" \
+ BUNDLE_WITHOUT=development
##
-# Update APT sources and install dependencies
+# Install system libs
#
-RUN sed -i "s/httpredir.debian.org/ftp.us.debian.org/" /etc/apt/sources.list
-RUN apt-get update && apt-get install -y wget unzip xvfb lsb-release git git-lfs
-
-##
-# Install Docker
-#
-RUN wget -q "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" && \
- tar -zxf "docker-${DOCKER_VERSION}.tgz" && mv docker/docker /usr/local/bin/docker && \
- rm "docker-${DOCKER_VERSION}.tgz"
-
-##
-# Install client certificate - Bug in Chrome Headless: https://gitlab.com/gitlab-org/gitlab/-/issues/331492
-#
-# RUN apt install -y libnss3-tools
-# RUN mkdir -p $HOME/.pki/nssdb
-# RUN certutil -N -d sql:$HOME/.pki/nssdb
-# COPY ./qa/tls_certificates/client/client.pfx /tmp/client.pfx
-# RUN pk12util -d sql:$HOME/.pki/nssdb -i /tmp/client.pfx -W ''
-# RUN mkdir -p /etc/opt/chrome/policies/managed
-# RUN echo '{ "AutoSelectCertificateForUrls": ["{\"pattern\":\"*\",\"filter\":{}}"] }' > /etc/opt/chrome/policies/managed/policy.json
-# RUN cat /etc/opt/chrome/policies/managed/policy.json
+RUN apt-get update; \
+ apt-get install -y xvfb unzip; \
+ apt-get -yq autoremove; \
+ apt-get clean -yqq; \
+ rm -rf /var/lib/apt/lists/*
##
# Install root certificate
@@ -37,39 +21,19 @@ ADD ./qa/tls_certificates/authority/ca.crt /usr/share/ca-certificates/gitlab/
RUN echo 'gitlab/ca.crt' >> /etc/ca-certificates.conf
RUN chmod -R 644 /usr/share/ca-certificates/gitlab && update-ca-certificates
-##
-# Install gcloud and kubectl CLI used in Auto DevOps test to create K8s
-# clusters
-#
-RUN export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
- echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
- curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
- apt-get update -y && apt-get install google-cloud-sdk kubectl -y
-
-##
-# Install Google Chrome version with headless support
-# Download from our local S3 bucket, populated by https://gitlab.com/gitlab-org/gitlab-build-images/-/blob/master/scripts/cache-google-chrome
-#
-# https://s3.amazonaws.com/gitlab-google-chrome-stable
-ENV CHROME_VERSION="91.0.4472.77-1"
-ENV CHROME_DEB="google-chrome-stable_${CHROME_VERSION}_amd64.deb"
-ENV CHROME_URL="https://s3.amazonaws.com/gitlab-google-chrome-stable/${CHROME_DEB}"
-RUN curl --silent --show-error --fail -O "${CHROME_URL}" && \
- dpkg -i "./${CHROME_DEB}" || true && \
- apt-get install -f -y && \
- rm -f "./${CHROME_DEB}"
-
WORKDIR /home/gitlab/qa
+##
# Install qa dependencies or fetch from cache if unchanged
+#
COPY ./qa/Gemfile* /home/gitlab/qa/
-RUN gem install bundler --no-document --conservative --version 2.3.6
-RUN bundle install --jobs=$(nproc) --retry=3 --without=development --quiet
+RUN bundle install --jobs=$(nproc) --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
diff --git a/qa/README.md b/qa/README.md
index 2e3f6af5bc3..724638d13c0 100644
--- a/qa/README.md
+++ b/qa/README.md
@@ -197,7 +197,7 @@ another test has `:ldap` and `:quarantine` metadata. If the tests are run with
### Running tests with a feature flag enabled or disabled
-Tests can be run with with a feature flag enabled or disabled by using the command-line
+Tests can be run with a feature flag enabled or disabled by using the command-line
option `--enable-feature FEATURE_FLAG` or `--disable-feature FEATURE_FLAG`.
For example, to enable the feature flag that enforces Gitaly request limits,
diff --git a/qa/Rakefile b/qa/Rakefile
index 0a65a58e6fc..e4d38d8294f 100644
--- a/qa/Rakefile
+++ b/qa/Rakefile
@@ -65,6 +65,11 @@ task :delete_test_users, [:delete_before, :dry_run, :exclude_users] do |t, args|
QA::Tools::DeleteTestUsers.new(args).run
end
+desc "Deletes snippets"
+task :delete_test_snippets, [:delete_before, :dry_run] do |t, args|
+ QA::Tools::DeleteTestSnippets.new(args).run
+end
+
namespace :test_resources do
desc "Deletes resources created during E2E test runs"
task :delete, [:file_pattern] do |t, args|
diff --git a/qa/lib/gitlab/page/group/settings/billing.rb b/qa/lib/gitlab/page/group/settings/billing.rb
index 24d327502f8..d0d73278890 100644
--- a/qa/lib/gitlab/page/group/settings/billing.rb
+++ b/qa/lib/gitlab/page/group/settings/billing.rb
@@ -5,13 +5,30 @@ module Gitlab
module Group
module Settings
class Billing < Chemlab::Page
- # TODO: Supplant with data-qa-selectors
- h4 :billing_plan_header, css: 'div.billing-plan-header h4'
-
+ h4 :billing_plan_header
link :start_your_free_trial
+ link :upgrade_to_premium
+ link :upgrade_to_ultimate
+
+ # Subscription details
+ strong :subscription_header
+ button :refresh_seats
+
+ # Usage
+ p :seats_in_subscription
+ p :seats_currently_in_use
+ link :see_seats_usage
+ p :max_seats_used
+ p :seats_owed
+
+ # Billing
+ p :subscription_start_date
+ p :subscription_end_date
- link :upgrade_to_premium, css: '[data-testid="plan-card-premium"] a.billing-cta-purchase-new'
- link :upgrade_to_ultimate, css: '[data-testid="plan-card-ultimate"] a.billing-cta-purchase-new'
+ def refresh_subscription_seats
+ refresh_seats
+ ::QA::Support::WaitForRequests.wait_for_requests
+ end
end
end
end
diff --git a/qa/lib/gitlab/page/group/settings/billing.stub.rb b/qa/lib/gitlab/page/group/settings/billing.stub.rb
index 64176af794a..c49d744d61f 100644
--- a/qa/lib/gitlab/page/group/settings/billing.stub.rb
+++ b/qa/lib/gitlab/page/group/settings/billing.stub.rb
@@ -100,6 +100,222 @@ module Gitlab
def upgrade_to_ultimate?
# This is a stub, used for indexing. The method is dynamically generated.
end
+
+ # @note Defined as +strong :subscription_header+
+ # @return [String] The text content or value of +subscription_header+
+ def subscription_header
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.subscription_header_element).to exist
+ # end
+ # @return [Watir::Strong] The raw +Strong+ element
+ def subscription_header_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_subscription_header
+ # end
+ # @return [Boolean] true if the +subscription_header+ element is present on the page
+ def subscription_header?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +button :refresh_seats+
+ # Clicks +refresh_seats+
+ def refresh_seats
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.refresh_seats_element).to exist
+ # end
+ # @return [Watir::Button] The raw +Button+ element
+ def refresh_seats_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_refresh_seats
+ # end
+ # @return [Boolean] true if the +refresh_seats+ element is present on the page
+ def refresh_seats?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :seats_in_subscription+
+ # @return [String] The text content or value of +seats_in_subscription+
+ def seats_in_subscription
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.seats_in_subscription_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def seats_in_subscription_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_seats_in_subscription
+ # end
+ # @return [Boolean] true if the +seats_in_subscription+ element is present on the page
+ def seats_in_subscription?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :seats_currently_in_use+
+ # @return [String] The text content or value of +seats_currently_in_use+
+ def seats_currently_in_use
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.seats_currently_in_use_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def seats_currently_in_use_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_seats_currently_in_use
+ # end
+ # @return [Boolean] true if the +seats_currently_in_use+ element is present on the page
+ def seats_currently_in_use?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +link :see_seats_usage+
+ # Clicks +see_seats_usage+
+ def see_seats_usage
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.see_seats_usage_element).to exist
+ # end
+ # @return [Watir::Link] The raw +Link+ element
+ def see_seats_usage_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_see_seats_usage
+ # end
+ # @return [Boolean] true if the +see_seats_usage+ element is present on the page
+ def see_seats_usage?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :max_seats_used+
+ # @return [String] The text content or value of +max_seats_used+
+ def max_seats_used
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.max_seats_used_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def max_seats_used_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_max_seats_used
+ # end
+ # @return [Boolean] true if the +max_seats_used+ element is present on the page
+ def max_seats_used?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :seats_owed+
+ # @return [String] The text content or value of +seats_owed+
+ def seats_owed
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.seats_owed_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def seats_owed_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_seats_owed
+ # end
+ # @return [Boolean] true if the +seats_owed+ element is present on the page
+ def seats_owed?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :subscription_start_date+
+ # @return [String] The text content or value of +subscription_start_date+
+ def subscription_start_date
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.subscription_start_date_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def subscription_start_date_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_subscription_start_date
+ # end
+ # @return [Boolean] true if the +subscription_start_date+ element is present on the page
+ def subscription_start_date?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @note Defined as +p :subscription_end_date+
+ # @return [String] The text content or value of +subscription_end_date+
+ def subscription_end_date
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing.subscription_end_date_element).to exist
+ # end
+ # @return [Watir::P] The raw +P+ element
+ def subscription_end_date_element
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
+
+ # @example
+ # Gitlab::Page::Group::Settings::Billing.perform do |billing|
+ # expect(billing).to be_subscription_end_date
+ # end
+ # @return [Boolean] true if the +subscription_end_date+ element is present on the page
+ def subscription_end_date?
+ # This is a stub, used for indexing. The method is dynamically generated.
+ end
end
end
end
diff --git a/qa/lib/gitlab/page/group/settings/usage_quotas.rb b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
index 0408668a81c..df12fe4076c 100644
--- a/qa/lib/gitlab/page/group/settings/usage_quotas.rb
+++ b/qa/lib/gitlab/page/group/settings/usage_quotas.rb
@@ -14,7 +14,7 @@ module Gitlab
span :purchased_usage_total
div :ci_purchase_successful_alert, text: /You have successfully purchased CI minutes/
div :storage_purchase_successful_alert, text: /You have successfully purchased a storage/
- h4 :storage_available_alert, text: /purchased storage is available/
+ h2 :storage_available_alert, text: /purchased storage is available/
def plan_ci_limits
plan_ci_minutes_element.span.text[%r{([^/ ]+)$}]
diff --git a/qa/qa.rb b/qa/qa.rb
index 73bcb6de637..8d358aa2efe 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -24,6 +24,7 @@ module QA
loader.push_dir(root, namespace: QA)
loader.ignore("#{root}/specs/features")
+ loader.ignore("#{root}/specs/spec_helper.rb")
loader.inflector.inflect(
"ce" => "CE",
@@ -63,5 +64,10 @@ module QA
"registry_with_cdn" => "RegistryWithCDN"
)
+ # Configure knapsack at the very begining of the setup
+ loader.on_setup do
+ QA::Support::KnapsackReport.configure!
+ end
+
loader.setup
end
diff --git a/qa/qa/ce/strategy.rb b/qa/qa/ce/strategy.rb
index 71c538c20a0..bf08f887c7d 100644
--- a/qa/qa/ce/strategy.rb
+++ b/qa/qa/ce/strategy.rb
@@ -8,6 +8,7 @@ module QA
def perform_before_hooks
# The login page could take some time to load the first time it is visited.
# We visit the login page and wait for it to properly load only once before the tests.
+ QA::Runtime::Logger.info("Performing sanity check for environment!")
QA::Support::Retrier.retry_on_exception do
QA::Runtime::Browser.visit(:gitlab, QA::Page::Main::Login)
end
diff --git a/qa/qa/fixtures/package_managers/maven/build_install.gradle.erb b/qa/qa/fixtures/package_managers/maven/build_install.gradle.erb
index 303a64ad233..31543d30e88 100644
--- a/qa/qa/fixtures/package_managers/maven/build_install.gradle.erb
+++ b/qa/qa/fixtures/package_managers/maven/build_install.gradle.erb
@@ -4,7 +4,6 @@ plugins {
}
repositories {
- jcenter()
maven {
url "<%= gitlab_address_with_port %>/api/v4/projects/<%= package_project.id %>/packages/maven"
name "GitLab"
diff --git a/qa/qa/fixtures/web_ide/logo_sample.svg b/qa/qa/fixtures/web_ide/logo_sample.svg
index 883e7e6cf92..211b511c8c7 100644
--- a/qa/qa/fixtures/web_ide/logo_sample.svg
+++ b/qa/qa/fixtures/web_ide/logo_sample.svg
@@ -1,27 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
+<svg width="50" height="48" viewBox="0 0 50 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
<title>Slice 1</title>
<desc>Created with Sketch.</desc>
<script>alert('FAIL')</script>
<defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
- <g id="logo" sketch:type="MSLayerGroup" transform="translate(0.000000, 10.000000)">
- <g id="Page-1" sketch:type="MSShapeGroup">
- <g id="Fill-1-+-Group-24">
- <g id="Group-24">
- <g id="Group">
- <path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329" class="tanuki-shape"></path>
- </g>
- </g>
- </g>
- </g>
- </g>
- </g>
+ <path d="m49.014 19-.067-.18-6.784-17.696a1.792 1.792 0 0 0-3.389.182l-4.579 14.02H15.651l-4.58-14.02a1.795 1.795 0 0 0-3.388-.182l-6.78 17.7-.071.175A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869 10.394-7.779.029-.022a12.595 12.595 0 0 0 4.182-14.554Z"
+ fill="#E24329"/>
+ <path d="m49.014 19-.067-.18a22.88 22.88 0 0 0-9.12 4.103L24.931 34.187l9.485 7.167 10.393-7.779.03-.022a12.595 12.595 0 0 0 4.175-14.554Z"
+ fill="#FC6D26"/>
+ <path d="m15.414 41.354 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869-9.484-7.167-9.51 7.167Z"
+ fill="#FCA326"/>
+ <path d="M10.019 22.923a22.86 22.86 0 0 0-9.117-4.1L.832 19A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 9.491-7.167L10.02 22.923Z"
+ fill="#FC6D26"/>
</svg>
diff --git a/qa/qa/flow/merge_request.rb b/qa/qa/flow/merge_request.rb
index c26140000fe..f1cab2c7d1a 100644
--- a/qa/qa/flow/merge_request.rb
+++ b/qa/qa/flow/merge_request.rb
@@ -10,6 +10,26 @@ module QA
Page::Project::Settings::Main.perform(&:expand_merge_requests_settings)
Page::Project::Settings::MergeRequest.perform(&:enable_merge_train)
end
+
+ # Opens the form to create a new merge request.
+ # It tries to use the "Create merge request" button that appears after
+ # a commit is pushed, but if that button isn't available, it uses the
+ # "New merge request" button on the page that lists merge requests.
+ #
+ # @param [String] source_branch the branch to be merged
+ def create_new(source_branch:)
+ if Page::Project::Show.perform(&:has_create_merge_request_button?)
+ Page::Project::Show.perform(&:new_merge_request)
+ return
+ end
+
+ Page::Project::Menu.perform(&:click_merge_requests)
+ Page::MergeRequest::Index.perform(&:click_new_merge_request)
+ Page::MergeRequest::New.perform do |merge_request|
+ merge_request.select_source_branch(source_branch)
+ merge_request.click_compare_branches_and_continue
+ end
+ end
end
end
end
diff --git a/qa/qa/git/repository.rb b/qa/qa/git/repository.rb
index 356e509a81d..2244a78b9e5 100644
--- a/qa/qa/git/repository.rb
+++ b/qa/qa/git/repository.rb
@@ -21,7 +21,7 @@ module QA
# We set HOME to the current working directory (which is a
# temporary directory created in .perform()) so the temporarily dropped
# .netrc can be utilised
- self.env_vars = [%Q{HOME="#{tmp_home_dir}"}]
+ self.env_vars = [%(HOME="#{tmp_home_dir}")]
@use_lfs = false
@gpg_key_id = nil
@default_branch = Runtime::Env.default_branch
@@ -71,7 +71,7 @@ module QA
def checkout(branch_name, new_branch: false)
opts = new_branch ? '-b' : ''
- run_git(%Q{git checkout #{opts} "#{branch_name}"}).to_s
+ run_git(%(git checkout #{opts} "#{branch_name}")).to_s
end
def shallow_clone
@@ -79,8 +79,8 @@ module QA
end
def configure_identity(name, email)
- run_git(%Q{git config user.name "#{name}"})
- run_git(%Q{git config user.email #{email}})
+ run_git(%(git config user.name "#{name}"))
+ run_git(%(git config user.email #{email}))
end
def commit_file(name, contents, message)
@@ -94,11 +94,11 @@ module QA
::File.write(name, contents)
if use_lfs?
- git_lfs_track_result = run_git(%Q{git lfs track #{name} --lockable})
+ git_lfs_track_result = run_git(%(git lfs track #{name} --lockable))
return git_lfs_track_result.response unless git_lfs_track_result.success?
end
- git_add_result = run_git(%Q{git add #{name}})
+ git_add_result = run_git(%(git add #{name}))
git_lfs_track_result.to_s + git_add_result.to_s
end
@@ -108,15 +108,15 @@ module QA
end
def delete_tag(tag_name)
- run_git(%Q{git push origin --delete #{tag_name}}, max_attempts: 3).to_s
+ run_git(%(git push origin --delete #{tag_name}), max_attempts: 3).to_s
end
def commit(message)
- run_git(%Q{git commit -m "#{message}"}, max_attempts: 3).to_s
+ run_git(%(git commit -m "#{message}"), max_attempts: 3).to_s
end
def commit_with_gpg(message)
- run_git(%Q{git config user.signingkey #{@gpg_key_id} && git config gpg.program $(command -v gpg) && git commit -S -m "#{message}"}).to_s
+ run_git(%{git config user.signingkey #{@gpg_key_id} && git config gpg.program $(command -v gpg) && git commit -S -m "#{message}"}).to_s
end
def current_branch
@@ -159,11 +159,11 @@ module QA
@ssh = Support::SSH.perform do |ssh|
ssh.key = key
ssh.uri = uri
- ssh.setup(env: self.env_vars)
+ ssh.setup(env: env_vars)
ssh
end
- self.env_vars << %Q{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}")
end
def delete_ssh_key
@@ -182,7 +182,9 @@ module QA
end
def git_protocol=(value)
- raise ArgumentError, "Please specify the protocol you would like to use: 0, 1, or 2" unless %w[0 1 2].include?(value.to_s)
+ unless %w[0 1 2].include?(value.to_s)
+ raise ArgumentError, "Please specify the protocol you would like to use: 0, 1, or 2"
+ end
run_git("git config protocol.version #{value}")
end
@@ -190,8 +192,8 @@ module QA
def fetch_supported_git_protocol
# ls-remote is one command known to respond to Git protocol v2 so we use
# it to get output including the version reported via Git tracing
- result = run_git("git ls-remote #{uri}", max_attempts: 3, env: [*self.env_vars, "GIT_TRACE_PACKET=1"])
- result.response[/git< version (\d+)/, 1] || 'unknown'
+ result = run_git("git ls-remote #{uri}", max_attempts: 3, env: [*env_vars, "GIT_TRACE_PACKET=1"])
+ result.response[/ls-remote< version (\d+)/, 1] || 'unknown'
end
def try_add_credentials_to_netrc
@@ -266,7 +268,7 @@ module QA
#
FileUtils.mkdir_p(tmp_home_dir)
File.open(netrc_file_path, 'a') { |file| file.puts(netrc_content) }
- File.chmod(0600, netrc_file_path)
+ File.chmod(0o600, netrc_file_path)
end
def tmp_home_dir
@@ -302,7 +304,7 @@ module QA
read_netrc_content.grep(/^#{Regexp.escape(netrc_content)}$/).any?
end
- def run_git(command_str, env: self.env_vars, max_attempts: 1)
+ def run_git(command_str, env: env_vars, max_attempts: 1)
run(command_str, env: env, max_attempts: max_attempts, log_prefix: 'Git: ')
end
end
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 83db8bc0fd6..248c5f38438 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -218,6 +218,15 @@ module QA
page.validate_elements_present! if page
end
+ # Uses capybara to locate and click an element instead of `click_element`.
+ # This can be used when it's not possible to add a QA selector but we still want to log the click
+ #
+ # @param [String] method the capybara method to use
+ # @param [String] locator the selector used to find the element
+ def click_via_capybara(method, locator)
+ page.public_send(method, locator)
+ end
+
def fill_element(name, content)
find_element(name).set(content)
end
@@ -452,7 +461,7 @@ module QA
click_by_js ? page.execute_script("arguments[0].click();", box) : box.click
end
- def feature_flag_controlled_element(feature_flag, element_when_flag_enabled, element_when_flag_disabled)
+ def feature_flag_controlled_element(feature_flag, element_when_flag_enabled, element_when_flag_disabled, visibility = true)
# Feature flags can change the UI elements shown, but we need admin access to get feature flag values, which
# prevents us running the tests on production. Instead we detect the UI element that should be shown when the
# feature flag is enabled and otherwise use the element that should be displayed when the feature flag is
@@ -463,12 +472,12 @@ module QA
# load and render the UI
wait_for_requests
- return element_when_flag_enabled if has_element?(element_when_flag_enabled, wait: 1)
- return element_when_flag_disabled if has_element?(element_when_flag_disabled, wait: 1)
+ return element_when_flag_enabled if has_element?(element_when_flag_enabled, wait: 1, visible: visibility)
+ return element_when_flag_disabled if has_element?(element_when_flag_disabled, wait: 1, visibile: visibility)
# Check both options again, this time waiting for the default duration
- return element_when_flag_enabled if has_element?(element_when_flag_enabled)
- return element_when_flag_disabled if has_element?(element_when_flag_disabled)
+ return element_when_flag_enabled if has_element?(element_when_flag_enabled, visible: visibility)
+ return element_when_flag_disabled if has_element?(element_when_flag_disabled, visible: visibility)
raise ElementNotFound,
"Could not find the expected element as #{element_when_flag_enabled} or #{element_when_flag_disabled}." \
diff --git a/qa/qa/page/component/blob_content.rb b/qa/qa/page/component/blob_content.rb
index ce743b24dda..c2a1687ccfc 100644
--- a/qa/qa/page/component/blob_content.rb
+++ b/qa/qa/page/component/blob_content.rb
@@ -63,6 +63,17 @@ module QA
end
end
+ def has_normalized_ws_text?(text, wait: Capybara.default_max_wait_time)
+ if has_element?(:blob_viewer_file_content, wait: 1)
+ # The blob viewer renders line numbers and whitespace in a way that doesn't match the source file
+ # This isn't a visual validation test, so we ignore line numbers and whitespace
+ find_element(:blob_viewer_file_content, wait: 0).text.gsub(/^\d+\s|\s*/, '')
+ .start_with?(text.gsub(/\s*/, ''))
+ else
+ has_text?(text.gsub(/\s+/, " "), wait: wait)
+ end
+ end
+
def click_copy_file_contents(file_number = nil)
within_file_by_number(:default_actions_container, file_number) { click_element(:copy_contents_button) }
end
diff --git a/qa/qa/page/component/new_snippet.rb b/qa/qa/page/component/new_snippet.rb
index 6ccf8a4043e..9c4408e36e4 100644
--- a/qa/qa/page/component/new_snippet.rb
+++ b/qa/qa/page/component/new_snippet.rb
@@ -76,8 +76,7 @@ module QA
end
def click_create_snippet_button
- wait_until(reload: false) { !find_element(:submit_button).disabled? }
- click_element(:submit_button)
+ click_element_coordinates(:submit_button)
wait_until(reload: false) do
has_no_element?(:snippet_title_field)
end
diff --git a/qa/qa/page/component/snippet.rb b/qa/qa/page/component/snippet.rb
index a8ae706858e..47d32ae8225 100644
--- a/qa/qa/page/component/snippet.rb
+++ b/qa/qa/page/component/snippet.rb
@@ -82,7 +82,7 @@ module QA
base.view 'app/views/layouts/nav/_breadcrumbs.html.haml' do
element :breadcrumb_links_content
- element :breadcrumb_sub_title_content
+ element :breadcrumb_current_link
end
end
@@ -257,7 +257,7 @@ module QA
def snippet_id
within_element(:breadcrumb_links_content) do
- find_element(:breadcrumb_sub_title_content).text.delete_prefix('$')
+ find_element(:breadcrumb_current_link).text.delete_prefix('$')
end
end
end
diff --git a/qa/qa/page/dashboard/snippet/edit.rb b/qa/qa/page/dashboard/snippet/edit.rb
index d84a053591c..8af3eb5693c 100644
--- a/qa/qa/page/dashboard/snippet/edit.rb
+++ b/qa/qa/page/dashboard/snippet/edit.rb
@@ -63,8 +63,7 @@ module QA
end
def save_changes
- wait_until(reload: false) { !find_element(:submit_button).disabled? }
- click_element(:submit_button)
+ click_element_coordinates(:submit_button)
wait_until(reload: false) do
has_no_element?(:file_name_field)
end
diff --git a/qa/qa/page/file/form.rb b/qa/qa/page/file/form.rb
index a6251f185f9..bb8934db498 100644
--- a/qa/qa/page/file/form.rb
+++ b/qa/qa/page/file/form.rb
@@ -4,8 +4,9 @@ module QA
module Page
module File
class Form < Page::Base
- include Shared::CommitMessage
include Page::Component::DropdownFilter
+ include Page::Component::BlobContent
+ include Shared::CommitMessage
include Shared::CommitButton
include Shared::Editor
diff --git a/qa/qa/page/group/settings/group_deploy_tokens.rb b/qa/qa/page/group/settings/group_deploy_tokens.rb
index 65ee3fc72eb..7d908f473de 100644
--- a/qa/qa/page/group/settings/group_deploy_tokens.rb
+++ b/qa/qa/page/group/settings/group_deploy_tokens.rb
@@ -30,10 +30,10 @@ module QA
end
def fill_scopes(read_repository: false, read_registry: false, read_package_registry: false, write_package_registry: false )
- check_element(:deploy_token_read_repository_checkbox) if read_repository
- check_element(:deploy_token_read_package_registry_checkbox) if read_package_registry
- check_element(:deploy_token_read_registry_checkbox) if read_registry
- check_element(:deploy_token_write_package_registry_checkbox) if write_package_registry
+ check_element(:deploy_token_read_repository_checkbox, true) if read_repository
+ check_element(:deploy_token_read_package_registry_checkbox, true) if read_package_registry
+ check_element(:deploy_token_read_registry_checkbox, true) if read_registry
+ check_element(:deploy_token_write_package_registry_checkbox, true) if write_package_registry
end
def add_token
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index d8b7bb90437..f3ee627c41e 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -30,9 +30,8 @@ module QA
element :register_tab
end
- view 'app/views/devise/shared/_tabs_normal.html.haml' do
+ view 'app/views/devise/shared/_tab_single.html.haml' do
element :sign_in_tab
- element :register_tab
end
view 'app/helpers/auth_helper.rb' do
@@ -134,6 +133,14 @@ module QA
has_css?('[name="arkose_labs_token"][value]', visible: false)
end
+ def has_accept_all_cookies_button?
+ has_button?('Accept All Cookies')
+ end
+
+ def click_accept_all_cookies
+ click_button('Accept All Cookies')
+ end
+
def switch_to_sign_in_tab
click_element :sign_in_tab
end
@@ -180,6 +187,7 @@ module QA
fill_element :password_field, user.password
if Runtime::Env.running_on_dot_com?
+ click_accept_all_cookies if has_accept_all_cookies_button?
# Arkose only appears in staging.gitlab.com, gitlab.com, etc...
# Wait until the ArkoseLabs challenge has initialized
diff --git a/qa/qa/page/merge_request/index.rb b/qa/qa/page/merge_request/index.rb
new file mode 100644
index 00000000000..ae024c16566
--- /dev/null
+++ b/qa/qa/page/merge_request/index.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module QA
+ module Page
+ module MergeRequest
+ class Index < Page::Base
+ view 'app/views/shared/empty_states/_merge_requests.html.haml' do
+ element :new_merge_request_button
+ end
+
+ def click_new_merge_request
+ click_element(:new_merge_request_button)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/merge_request/new.rb b/qa/qa/page/merge_request/new.rb
index bcc60a8275d..b19a0d1a830 100644
--- a/qa/qa/page/merge_request/new.rb
+++ b/qa/qa/page/merge_request/new.rb
@@ -12,6 +12,11 @@ module QA
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
+ end
+
view 'app/views/projects/merge_requests/show.html.haml' do
element :diffs_tab
end
@@ -27,6 +32,10 @@ module QA
"to customize #{scanner_name} settings."
end
+ def click_compare_branches_and_continue
+ click_element(:compare_branches_button)
+ end
+
def create_merge_request
click_element(:issuable_create_button, Page::MergeRequest::Show)
end
@@ -43,6 +52,12 @@ module QA
def has_file?(file_name)
has_element?(:file_name_content, text: file_name)
end
+
+ def select_source_branch(branch)
+ click_element(:source_branch_dropdown)
+ fill_element(:dropdown_input_field, branch)
+ click_via_capybara(:click_on, branch)
+ end
end
end
end
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index 689b3dba286..8f5ac62d127 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -49,8 +49,8 @@ module QA
element :comment_now_button
end
- view 'app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue' do
- element :download_dropdown
+ view 'app/views/projects/merge_requests/_code_dropdown.html.haml' do
+ element :mr_code_dropdown
element :download_email_patches_menu_item
element :download_plain_diff_menu_item
element :open_in_web_ide_button
@@ -343,12 +343,12 @@ module QA
end
def view_email_patches
- click_element(:download_dropdown)
+ click_element(:mr_code_dropdown)
visit_link_in_element(:download_email_patches_menu_item)
end
def view_plain_diff
- click_element(:download_dropdown)
+ click_element(:mr_code_dropdown)
visit_link_in_element(:download_plain_diff_menu_item)
end
@@ -359,6 +359,7 @@ module QA
end
def click_open_in_web_ide
+ click_element(:mr_code_dropdown)
click_element(:open_in_web_ide_button)
wait_for_requests
end
diff --git a/qa/qa/page/project/pipeline/new.rb b/qa/qa/page/project/pipeline/new.rb
index 96a48e6240a..6cf5c3b1134 100644
--- a/qa/qa/page/project/pipeline/new.rb
+++ b/qa/qa/page/project/pipeline/new.rb
@@ -16,9 +16,9 @@ module QA
click_element(:run_pipeline_button, Page::Project::Pipeline::Show)
end
- def add_variable(key, value, row_index: 0)
+ def configure_variable(key: nil, value: 'foo', row_index: 0)
within_element_by_index(:ci_variable_row_container, row_index) do
- fill_element(:ci_variable_key_field, key)
+ fill_element(:ci_variable_key_field, key) unless key.nil?
fill_element(:ci_variable_value_field, value)
end
end
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index f499b748fb4..3f1cc2f1257 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -74,7 +74,11 @@ module QA
end
def has_linked_pipeline?(title: nil)
- title ? find_linked_pipeline_by_title(title) : has_element?(:linked_pipeline_container)
+ # If the pipeline page has loaded linked pipelines should appear, but it can take a little while,
+ # especially on busier environments.
+ retry_until(reload: true, message: 'Waiting for linked pipeline to appear') do
+ title ? find_linked_pipeline_by_title(title) : has_element?(:linked_pipeline_container)
+ end
end
alias_method :has_child_pipeline?, :has_linked_pipeline?
diff --git a/qa/qa/page/project/pipeline_editor/show.rb b/qa/qa/page/project/pipeline_editor/show.rb
index 1a8e1e07994..197fd8fd9fb 100644
--- a/qa/qa/page/project/pipeline_editor/show.rb
+++ b/qa/qa/page/project/pipeline_editor/show.rb
@@ -5,6 +5,10 @@ module QA
module Project
module PipelineEditor
class Show < QA::Page::Base
+ view 'app/assets/javascripts/pipeline_editor/pipeline_editor_app.vue' do
+ element :pipeline_editor_app, required: true
+ end
+
view 'app/assets/javascripts/pipeline_editor/components/file_nav/branch_switcher.vue' do
element :branch_selector_button, required: true
element :branch_menu_item_button
@@ -12,7 +16,7 @@ module QA
end
view 'app/assets/javascripts/pipeline_editor/components/commit/commit_form.vue' do
- element :target_branch_field, required: true
+ element :source_branch_field, required: true
end
view 'app/assets/javascripts/pipeline_editor/components/editor/ci_editor_header.vue' do
@@ -46,7 +50,23 @@ module QA
element :file_editor_container
end
+ view 'app/assets/javascripts/pipeline_editor/components/popovers/file_tree_popover.vue' do
+ element :file_tree_popover
+ end
+
+ def initialize
+ dismiss_file_tree_popover if has_element?(:file_tree_popover)
+
+ super
+ end
+
+ def dismiss_file_tree_popover
+ # clicking outside the popover will dismiss it
+ click_element(:pipeline_editor_app)
+ end
+
def open_branch_selector_dropdown
+ dismiss_file_tree_popover if has_element?(:file_tree_popover, wait: 1)
click_element(:branch_selector_button)
end
@@ -57,8 +77,8 @@ module QA
wait_for_requests
end
- def target_branch_name
- find_element(:target_branch_field).value
+ def source_branch_name
+ find_element(:source_branch_field).value
end
def editing_content
@@ -76,8 +96,8 @@ module QA
wait_for_requests
end
- def set_target_branch(name)
- find_element(:target_branch_field).fill_in(with: name)
+ def set_source_branch(name)
+ find_element(:source_branch_field).fill_in(with: name)
end
def current_branch
diff --git a/qa/qa/page/project/settings/ci_cd.rb b/qa/qa/page/project/settings/ci_cd.rb
index 6df285cdd93..c5fad2efcfe 100644
--- a/qa/qa/page/project/settings/ci_cd.rb
+++ b/qa/qa/page/project/settings/ci_cd.rb
@@ -11,13 +11,6 @@ module QA
element :autodevops_settings_content
element :runners_settings_content
element :variables_settings_content
- element :general_pipelines_settings_content
- end
-
- def expand_general_pipelines(&block)
- expand_content(:general_pipelines_settings_content) do
- Settings::GeneralPipelines.perform(&block)
- end
end
def expand_runners_settings(&block)
diff --git a/qa/qa/page/project/settings/deploy_tokens.rb b/qa/qa/page/project/settings/deploy_tokens.rb
index 407d57bc54e..cf25f4a0568 100644
--- a/qa/qa/page/project/settings/deploy_tokens.rb
+++ b/qa/qa/page/project/settings/deploy_tokens.rb
@@ -31,11 +31,25 @@ module QA
end
def fill_scopes(scopes)
- check_element(:deploy_token_read_repository_checkbox) if scopes.include? :read_repository
- check_element(:deploy_token_read_package_registry_checkbox) if scopes.include? :read_package_registry
- check_element(:deploy_token_write_package_registry_checkbox) if scopes.include? :write_package_registry
- check_element(:deploy_token_read_registry_checkbox) if scopes.include? :read_registry
- check_element(:deploy_token_write_registry_checkbox) if scopes.include? :write_registry
+ if scopes.include? :read_repository
+ check_element(:deploy_token_read_repository_checkbox, true)
+ end
+
+ if scopes.include? :read_package_registry
+ check_element(:deploy_token_read_package_registry_checkbox, true)
+ end
+
+ if scopes.include? :write_package_registry
+ check_element(:deploy_token_write_package_registry_checkbox, true)
+ end
+
+ if scopes.include? :read_registry
+ check_element(:deploy_token_read_registry_checkbox, true)
+ end
+
+ if scopes.include? :write_registry
+ check_element(:deploy_token_write_registry_checkbox, true)
+ end
end
def add_token
diff --git a/qa/qa/page/project/settings/general_pipelines.rb b/qa/qa/page/project/settings/general_pipelines.rb
deleted file mode 100644
index 5a98849a41d..00000000000
--- a/qa/qa/page/project/settings/general_pipelines.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Page
- module Project
- module Settings
- class GeneralPipelines < Page::Base
- include QA::Page::Settings::Common
-
- view 'app/views/projects/settings/ci_cd/_form.html.haml' do
- element :build_coverage_regex_field
- element :save_general_pipelines_changes_button
- end
-
- def configure_coverage_regex(pattern)
- fill_element :build_coverage_regex_field, pattern
- click_element :save_general_pipelines_changes_button
- end
- end
- end
- end
- end
-end
diff --git a/qa/qa/page/project/settings/merge_request.rb b/qa/qa/page/project/settings/merge_request.rb
index dbe804bfdd0..0d5d4df9f34 100644
--- a/qa/qa/page/project/settings/merge_request.rb
+++ b/qa/qa/page/project/settings/merge_request.rb
@@ -29,7 +29,7 @@ module QA
end
def enable_merge_if_all_disscussions_are_resolved
- check_element(:allow_merge_if_all_discussions_are_resolved_checkbox)
+ check_element(:allow_merge_if_all_discussions_are_resolved_checkbox, true)
click_save_changes
end
end
diff --git a/qa/qa/page/project/settings/services/prometheus.rb b/qa/qa/page/project/settings/services/prometheus.rb
index 8ae4ded535e..2e3c385a27d 100644
--- a/qa/qa/page/project/settings/services/prometheus.rb
+++ b/qa/qa/page/project/settings/services/prometheus.rb
@@ -8,7 +8,7 @@ module QA
class Prometheus < Page::Base
include Page::Component::CustomMetric
- view 'app/views/projects/services/prometheus/_custom_metrics.html.haml' do
+ view 'app/views/shared/integrations/prometheus/_custom_metrics.html.haml' do
element :custom_metrics_container
element :new_metric_button
end
diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb
index b234a9ba986..9983ee2a33d 100644
--- a/qa/qa/page/project/show.rb
+++ b/qa/qa/page/project/show.rb
@@ -120,6 +120,10 @@ module QA
click_element(:new_issue_link)
end
+ def has_create_merge_request_button?
+ has_css?(element_selector_css(:create_merge_request))
+ end
+
def has_file?(name)
return false unless has_element?(:file_tree_table)
@@ -144,7 +148,7 @@ module QA
def new_merge_request
wait_until(reload: true) do
- has_css?(element_selector_css(:create_merge_request))
+ has_create_merge_request_button?
end
click_element :create_merge_request
diff --git a/qa/qa/resource/group_base.rb b/qa/qa/resource/group_base.rb
index 889197a0373..bda72703906 100644
--- a/qa/qa/resource/group_base.rb
+++ b/qa/qa/resource/group_base.rb
@@ -64,10 +64,6 @@ module QA
end
end
- def marked_for_deletion?
- reload!.api_response[:marked_for_deletion_on].present?
- end
-
# Get group badges
#
# @return [Array<QA::Resource::GroupBadge>]
diff --git a/qa/qa/resource/group_deploy_token.rb b/qa/qa/resource/group_deploy_token.rb
index c1d6be6547a..4c9b296ece1 100644
--- a/qa/qa/resource/group_deploy_token.rb
+++ b/qa/qa/resource/group_deploy_token.rb
@@ -17,10 +17,6 @@ module QA
end
end
- def fabricate_via_api!
- super
- end
-
def api_get_path
"/groups/#{group.id}/deploy_tokens"
end
diff --git a/qa/qa/resource/job.rb b/qa/qa/resource/job.rb
new file mode 100644
index 00000000000..96c502e567c
--- /dev/null
+++ b/qa/qa/resource/job.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module QA
+ module Resource
+ class Job < Base
+ attr_accessor :id, :name, :project
+
+ attributes :id,
+ :project
+
+ def fabricate_via_api!
+ resource_web_url(api_get)
+ rescue ResourceNotFoundError
+ super
+ end
+
+ def artifacts
+ parse_body(api_get_from(api_get_path))[:artifacts]
+ end
+
+ def api_get_path
+ "/projects/#{project.id}/jobs/#{id}"
+ end
+
+ def api_post_path
+ end
+
+ def api_post_body
+ {
+ artifacts: artifacts
+ }
+ end
+ end
+ end
+end
diff --git a/qa/qa/resource/members.rb b/qa/qa/resource/members.rb
index 83adb10c3a0..0061f74cec5 100644
--- a/qa/qa/resource/members.rb
+++ b/qa/qa/resource/members.rb
@@ -12,7 +12,8 @@ module QA
QA::Runtime::Logger.debug(%Q[Adding user #{user.username} to #{full_path} #{self.class.name}])
response = post Runtime::API::Request.new(api_client, api_members_path).url, { user_id: user.id, access_level: access_level }
- response.code == QA::Support::API::HTTP_STATUS_CREATED
+ break true if response.code == QA::Support::API::HTTP_STATUS_CREATED
+ break true if response.body.include?('Member already exists')
end
end
diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb
index 685cccea02d..0a92553690f 100644
--- a/qa/qa/resource/merge_request.rb
+++ b/qa/qa/resource/merge_request.rb
@@ -78,12 +78,12 @@ module QA
end
def fabricate!
- return fabricate_large_merge_request if Runtime::Scenario.large_setup?
+ return fabricate_large_merge_request if large_setup?
populate_target_and_source_if_required
project.visit!
- Page::Project::Show.perform(&:new_merge_request)
+ Flow::MergeRequest.create_new(source_branch: source_branch)
Page::MergeRequest::New.perform do |new_page|
new_page.fill_title(@title)
new_page.choose_template(@template) if @template
@@ -100,7 +100,7 @@ module QA
end
def fabricate_via_api!
- return fabricate_large_merge_request if Runtime::Scenario.large_setup?
+ return fabricate_large_merge_request if large_setup?
resource_web_url(api_get)
rescue ResourceNotFoundError, NoValueError # rescue if iid not populated
@@ -208,6 +208,12 @@ module QA
private
+ def large_setup?
+ Runtime::Scenario.large_setup?
+ rescue ArgumentError
+ false
+ end
+
def transform_api_resource(api_resource)
raise ResourceNotFoundError if api_resource.blank?
diff --git a/qa/qa/resource/pipeline.rb b/qa/qa/resource/pipeline.rb
index 907a6cb8558..910065d76a8 100644
--- a/qa/qa/resource/pipeline.rb
+++ b/qa/qa/resource/pipeline.rb
@@ -9,10 +9,10 @@ module QA
end
end
- attribute :id
- attribute :status
- attribute :ref
- attribute :sha
+ attributes :id,
+ :status,
+ :ref,
+ :sha
# array in form
# [
@@ -33,6 +33,14 @@ module QA
Page::Project::Pipeline::New.perform(&:click_run_pipeline_button)
end
+ def fabricate_via_api!
+ resource_web_url(api_get)
+ rescue ResourceNotFoundError
+ super
+ rescue NoValueError
+ super
+ end
+
def ref
project.default_branch
end
@@ -51,6 +59,40 @@ module QA
variables: variables
}
end
+
+ def pipeline_variables
+ response = get(request_url("#{api_get_path}/variables"))
+
+ unless response.code == HTTP_STATUS_OK
+ raise ResourceQueryError, "Could not get variables. Request returned (#{response.code}): `#{response}`."
+ end
+
+ parse_body(response)
+ end
+
+ def has_variable?(key:, value:)
+ pipeline_variables.any? { |var| var[:key] == key && var[:value] == value }
+ end
+
+ def has_no_variable?(key:, value:)
+ !pipeline_variables.any? { |var| var[:key] == key && var[:value] == value }
+ end
+
+ def pipeline_bridges
+ response = get(request_url("#{api_get_path}/bridges"))
+
+ unless response.code == HTTP_STATUS_OK
+ raise ResourceQueryError, "Could not get bridges. Request returned (#{response.code}): `#{response}`."
+ end
+
+ parse_body(response)
+ end
+
+ def downstream_pipeline_id(bridge_name:)
+ result = pipeline_bridges.find { |bridge| bridge[:name] == bridge_name }
+
+ result[:downstream_pipeline][:id]
+ end
end
end
end
diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb
index dba3eb2e219..2db4f4b5f65 100644
--- a/qa/qa/resource/project.rb
+++ b/qa/qa/resource/project.rb
@@ -190,6 +190,10 @@ module QA
"#{api_get_path}/pipeline_schedules"
end
+ def api_jobs_path
+ "#{api_get_path}/jobs"
+ end
+
def api_issues_path
"#{api_get_path}/issues"
end
@@ -206,6 +210,10 @@ module QA
"#{api_get_path}/wikis"
end
+ def api_releases_path
+ "#{api_get_path}/releases"
+ end
+
def api_post_body
post_body = {
name: name,
@@ -354,6 +362,15 @@ module QA
auto_paginated_response(request_url(api_pipelines_path, per_page: '100'), attempts: attempts)
end
+ def jobs
+ response = get(request_url(api_jobs_path))
+ parse_body(response)
+ end
+
+ def job_by_name(job_name)
+ jobs.find { |job| job[:name] == job_name }
+ end
+
def issues(auto_paginate: false, attempts: 0)
return parse_body(api_get_from(api_issues_path)) unless auto_paginate
@@ -381,9 +398,22 @@ module QA
api_post_to(api_wikis_path, title: title, content: content)
end
+ def releases
+ response = api_get_from(api_releases_path)
+ parse_body(response)
+ end
+
+ def create_release(tag, ref = default_branch, **params)
+ api_post_to(api_releases_path, tag_name: tag, ref: ref, **params)
+ end
+
# Uses the API to wait until a pull mirroring update is successful (pull mirroring is treated as an import)
def wait_for_pull_mirroring
- mirror_succeeded = Support::Retrier.retry_until(max_duration: 180, raise_on_failure: false, sleep_interval: 1) do
+ mirror_succeeded = Support::Retrier.retry_until(
+ max_duration: 180,
+ raise_on_failure: false,
+ sleep_interval: 1
+ ) do
reload!
api_resource[:import_status] == "finished"
end
@@ -394,7 +424,11 @@ module QA
def remove_via_api!
super
- Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1, message: "Waiting for #{self.class.name} to be removed") do
+ Support::Retrier.retry_until(
+ max_duration: 60,
+ sleep_interval: 1,
+ message: "Waiting for #{self.class.name} to be removed"
+ ) do
!exists?
rescue InternalServerError
# Retry on transient errors that are likely to be due to race conditions between concurrent delete operations
diff --git a/qa/qa/resource/project_access_token.rb b/qa/qa/resource/project_access_token.rb
index f5cd8798f19..58cb3e667c0 100644
--- a/qa/qa/resource/project_access_token.rb
+++ b/qa/qa/resource/project_access_token.rb
@@ -15,10 +15,6 @@ module QA
Page::Project::Settings::AccessTokens.perform(&:created_access_token)
end
- def fabricate_via_api!
- super
- end
-
def api_get_path
"/projects/#{project.api_resource[:id]}/access_tokens"
end
diff --git a/qa/qa/resource/project_deploy_token.rb b/qa/qa/resource/project_deploy_token.rb
index b31a7c25157..d6125103025 100644
--- a/qa/qa/resource/project_deploy_token.rb
+++ b/qa/qa/resource/project_deploy_token.rb
@@ -17,10 +17,6 @@ module QA
end
end
- def fabricate_via_api!
- super
- end
-
def api_get_path
"/projects/#{project.id}/deploy_tokens"
end
diff --git a/qa/qa/resource/project_imported_from_github.rb b/qa/qa/resource/project_imported_from_github.rb
index 28a0f12b3e3..b9dbd2a6131 100644
--- a/qa/qa/resource/project_imported_from_github.rb
+++ b/qa/qa/resource/project_imported_from_github.rb
@@ -17,7 +17,7 @@ module QA
Page::Project::Import::Github.perform do |import_page|
import_page.add_personal_access_token(github_personal_access_token)
import_page.import!(github_repository_path, group.full_path, name)
- import_page.wait_for_success(github_repository_path)
+ import_page.wait_for_success(github_repository_path, wait: 240)
end
reload!
diff --git a/qa/qa/resource/repository/commit.rb b/qa/qa/resource/repository/commit.rb
index 54093a5c195..1fe35f7a77d 100644
--- a/qa/qa/resource/repository/commit.rb
+++ b/qa/qa/resource/repository/commit.rb
@@ -33,7 +33,11 @@ module QA
super
rescue ResourceNotFoundError
- super
+ result = super
+
+ project.wait_for_push(commit_message)
+
+ result
end
def api_get_path
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index 89e84f414b1..03178661826 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -18,10 +18,6 @@ module QA
CAPYBARA_MAX_WAIT_TIME = 10
- def initialize
- self.class.configure!
- end
-
def self.blank_page?
['', 'about:blank', 'data:,'].include?(Capybara.current_session.driver.browser.current_url)
rescue StandardError
@@ -49,6 +45,8 @@ module QA
# rubocop: disable Metrics/AbcSize
def self.configure!
+ return if @configured
+
RSpec.configure do |config|
config.define_derived_metadata(file_path: %r{/qa/specs/features/}) do |metadata|
metadata[:type] = :feature
@@ -57,23 +55,19 @@ module QA
config.append_after(:each) do |example|
if example.metadata[:screenshot]
screenshot = example.metadata[:screenshot][:image] || example.metadata[:screenshot][:html]
- example.metadata[:stdout] = %{[[ATTACHMENT|#{screenshot}]]}
+ example.metadata[:stdout] = %([[ATTACHMENT|#{screenshot}]])
end
end
end
Capybara.server_port = 9887 + ENV['TEST_ENV_NUMBER'].to_i
- return if Capybara.drivers.include?(:chrome)
-
Capybara.register_driver QA::Runtime::Env.browser do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.send(QA::Runtime::Env.browser)
case QA::Runtime::Env.browser
when :chrome
- if QA::Runtime::Env.accept_insecure_certs?
- capabilities['acceptInsecureCerts'] = true
- end
+ capabilities['acceptInsecureCerts'] = true if QA::Runtime::Env.accept_insecure_certs?
# set logging preferences
# this enables access to logs with `page.driver.manage.get_log(:browser)`
@@ -103,7 +97,9 @@ module QA
# Specify the user-agent to allow challenges to be bypassed
# See https://gitlab.com/gitlab-com/gl-infra/infrastructure/-/issues/11938
- capabilities['goog:chromeOptions'][:args] << "user-agent=#{QA::Runtime::Env.user_agent}" if QA::Runtime::Env.user_agent
+ if QA::Runtime::Env.user_agent
+ capabilities['goog:chromeOptions'][:args] << "user-agent=#{QA::Runtime::Env.user_agent}"
+ end
if QA::Runtime::Env.remote_mobile_device_name
capabilities['platformName'] = 'Android'
@@ -121,9 +117,7 @@ module QA
end
when :firefox
- if QA::Runtime::Env.accept_insecure_certs?
- capabilities['acceptInsecureCerts'] = true
- end
+ capabilities['acceptInsecureCerts'] = true if QA::Runtime::Env.accept_insecure_certs?
end
# Use the same profile on QA runs if CHROME_REUSE_PROFILE is true.
@@ -162,7 +156,10 @@ module QA
Capybara::Screenshot.append_timestamp = false
Capybara::Screenshot.register_filename_prefix_formatter(:rspec) do |example|
- ::File.join(QA::Runtime::Namespace.name(reset_cache: false), example.full_description.downcase.parameterize(separator: "_")[0..99])
+ ::File.join(
+ QA::Runtime::Namespace.name(reset_cache: false),
+ example.full_description.downcase.parameterize(separator: "_")[0..99]
+ )
end
Capybara.configure do |config|
@@ -183,6 +180,8 @@ module QA
config.base_url = Runtime::Scenario.attributes[:gitlab_address] # reuse GitLab address
config.hide_banner = true
end
+
+ @configured = true
end
# rubocop: enable Metrics/AbcSize
@@ -221,7 +220,7 @@ module QA
end
end
- yield.tap { clear! } if block_given?
+ yield.tap { clear! } if block
end
# To redirect the browser to a canary or non-canary web node
diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb
index e4537009406..0db5314de4d 100644
--- a/qa/qa/runtime/env.rb
+++ b/qa/qa/runtime/env.rb
@@ -25,6 +25,10 @@ module QA
SUPPORTED_FEATURES
end
+ def gitlab_url
+ @gitlab_url ||= ENV["QA_GITLAB_URL"] || "http://127.0.0.1:3000" # default to GDK
+ end
+
def additional_repository_storage
ENV['QA_ADDITIONAL_REPOSITORY_STORAGE']
end
@@ -38,7 +42,7 @@ module QA
end
def interception_enabled?
- enabled?(ENV['INTERCEPT_REQUESTS'], default: true)
+ enabled?(ENV['QA_INTERCEPT_REQUESTS'], default: false)
end
def can_intercept?
diff --git a/qa/qa/runtime/feature.rb b/qa/qa/runtime/feature.rb
index ec28813c1f6..93e215e9635 100644
--- a/qa/qa/runtime/feature.rb
+++ b/qa/qa/runtime/feature.rb
@@ -42,6 +42,8 @@ module QA
enable(flag, **scopes)
when 'disabled', 'disable', 'false', 0, false
disable(flag, **scopes)
+ when 'deleted'
+ QA::Runtime::Logger.info("Feature flag definition for '#{flag}' was deleted. The state of the feature flag has not been changed.")
else
raise UnknownStateError, "Unknown feature flag state: #{state}"
end
diff --git a/qa/qa/runtime/ip_address.rb b/qa/qa/runtime/ip_address.rb
index bec5c412a6a..657dc789cff 100644
--- a/qa/qa/runtime/ip_address.rb
+++ b/qa/qa/runtime/ip_address.rb
@@ -13,7 +13,7 @@ module QA
def fetch_current_ip_address
# When running on CI against a live environment such as staging.gitlab.com,
# we use the public facing IP address
- ip_address = if Env.running_in_ci? && !URI.parse(Scenario.gitlab_address).host.include?('test')
+ ip_address = if Env.running_in_ci? && !URI.parse(Scenario.gitlab_address).host.include?('.test')
response = get(PUBLIC_IP_ADDRESS_API)
raise HostUnreachableError, "#{PUBLIC_IP_ADDRESS_API} is unreachable" unless response.code == Support::API::HTTP_STATUS_OK
diff --git a/qa/qa/scenario/template.rb b/qa/qa/scenario/template.rb
index 8cf1fa0705f..99906ca44d9 100644
--- a/qa/qa/scenario/template.rb
+++ b/qa/qa/scenario/template.rb
@@ -21,33 +21,30 @@ module QA
end
def perform(options, *args)
- extract_address(:gitlab_address, options, args)
-
- gitlab_address = URI(Runtime::Scenario.gitlab_address)
-
- # Define the "About" page as an `about` subdomain.
- # @example
- # Given *gitlab_address* = 'https://gitlab.com/' #=> https://about.gitlab.com/
- # Given *gitlab_address* = 'https://staging.gitlab.com/' #=> https://about.staging.gitlab.com/
- # Given *gitlab_address* = 'http://gitlab-abc123.test/' #=> http://about.gitlab-abc123.test/
- Runtime::Scenario.define(:about_address, URI(-> { gitlab_address.host = "about.#{gitlab_address.host}"; gitlab_address }.call).to_s) # rubocop:disable Style/Semicolon
+ define_gitlab_address(options, args)
# Save the scenario class name
Runtime::Scenario.define(:klass, self.class.name)
+ # Set large setup attribute
+ Runtime::Scenario.define(:large_setup?, args.include?('can_use_large_setup'))
+
##
- # Setup knapsack and download latest report
+ # Configure browser
#
- Tools::KnapsackReport.configure! if Runtime::Env.knapsack?
+ Runtime::Browser.configure!
##
# Perform before hooks, which are different for CE and EE
#
-
- Runtime::Release.perform_before_hooks unless Runtime::Env.dry_run
+ QA::Runtime::Release.perform_before_hooks unless QA::Runtime::Env.dry_run
Runtime::Feature.enable(options[:enable_feature]) if options.key?(:enable_feature)
- Runtime::Feature.disable(options[:disable_feature]) if options.key?(:disable_feature) && (@feature_enabled = Runtime::Feature.enabled?(options[:disable_feature]))
+
+ if options.key?(:disable_feature) && (@feature_enabled = Runtime::Feature.enabled?(options[:disable_feature]))
+ Runtime::Feature.disable(options[:disable_feature])
+ end
+
Runtime::Feature.set(options[:set_feature_flags]) if options.key?(:set_feature_flags)
Specs::Runner.perform do |specs|
@@ -60,25 +57,31 @@ module QA
Runtime::Feature.enable(options[:disable_feature]) if options.key?(:disable_feature) && @feature_enabled
end
- def extract_option(name, options, args)
- option = if options.key?(name)
- options[name]
- else
- args.shift
- end
-
- Runtime::Scenario.define(name, option)
+ def extract_address(name, options)
+ address = options[name]
+ validate_address(name, address)
- option
+ Runtime::Scenario.define(name, address)
end
- # For backwards-compatibility, if the gitlab instance address is not
- # specified as an option parsed by OptionParser, it can be specified as
- # the first argument
- def extract_address(name, options, args)
- address = extract_option(name, options, args)
+ private
+
+ delegate :define_gitlab_address_attribute!, to: 'QA::Support::GitlabAddress'
+
+ # Define gitlab address attribute
+ #
+ # Use first argument if a valid address, else use named argument or default to environment variable
+ #
+ # @param [Hash] options
+ # @param [Array] args
+ # @return [void]
+ def define_gitlab_address(options, args)
+ address_from_opt = Runtime::Scenario.attributes[:gitlab_address]
+
+ return define_gitlab_address_attribute!(args.shift) if args.first && Runtime::Address.valid?(args.first)
+ return define_gitlab_address_attribute!(address_from_opt) if address_from_opt
- raise ::ArgumentError, "The address provided for `#{name}` is not valid: #{address}" unless Runtime::Address.valid?(address)
+ define_gitlab_address_attribute!
end
end
end
diff --git a/qa/qa/scenario/test/integration/mattermost.rb b/qa/qa/scenario/test/integration/mattermost.rb
index 48ebb51966c..145c767a38c 100644
--- a/qa/qa/scenario/test/integration/mattermost.rb
+++ b/qa/qa/scenario/test/integration/mattermost.rb
@@ -12,13 +12,6 @@ module QA
tags :mattermost
attribute :mattermost_address, '--mattermost-address URL', 'Address of the Mattermost server'
-
- def perform(options, *args)
- extract_address(:gitlab_address, options, args)
- extract_address(:mattermost_address, options, args)
-
- super(options, *args)
- end
end
end
end
diff --git a/qa/qa/service/cluster_provider/k3s_cilium.rb b/qa/qa/service/cluster_provider/k3s_cilium.rb
deleted file mode 100644
index 5b529caa20b..00000000000
--- a/qa/qa/service/cluster_provider/k3s_cilium.rb
+++ /dev/null
@@ -1,93 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- module Service
- module ClusterProvider
- class K3sCilium < K3s
- def setup
- @k3s = Service::DockerRun::K3s.new.tap do |k3s|
- k3s.remove!
- k3s.cni_enabled = true
- k3s.register!
-
- shell "kubectl config set-cluster k3s --server https://#{k3s.host_name}:6443 --insecure-skip-tls-verify"
- shell 'kubectl config set-credentials default --username=node --password=some-secret'
- shell 'kubectl config set-context k3s --cluster=k3s --user=default'
- shell 'kubectl config use-context k3s'
-
- wait_for_server(k3s.host_name) do
- shell 'kubectl version'
- # install local storage
- shell 'kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml'
-
- # patch local storage
- shell %(kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}')
- shell 'kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.8/install/kubernetes/quick-install.yaml'
-
- wait_for_namespaces do
- wait_for_cilium
- wait_for_coredns do
- shell 'kubectl create -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.31.0/deploy/static/provider/cloud/deploy.yaml'
- wait_for_ingress
- end
- end
- end
- end
- end
-
- private
-
- def wait_for_cilium
- QA::Runtime::Logger.info 'Waiting for Cilium pod to be initialized'
-
- 60.times do
- if service_available?('kubectl get pods --all-namespaces -l k8s-app=cilium --no-headers=true | grep -o "cilium-.*1/1"')
- return yield if block_given?
-
- return true
- end
-
- sleep 1
- QA::Runtime::Logger.info '.'
- end
-
- raise 'Cilium pod has not initialized correctly'
- end
-
- def wait_for_coredns
- QA::Runtime::Logger.info 'Waiting for CoreDNS pod to be initialized'
-
- 60.times do
- if service_available?('kubectl get pods --all-namespaces --no-headers=true | grep -o "coredns.*1/1"')
- return yield if block_given?
-
- return true
- end
-
- sleep 1
- QA::Runtime::Logger.info '.'
- end
-
- raise 'CoreDNS pod has not been initialized correctly'
- end
-
- def wait_for_ingress
- QA::Runtime::Logger.info 'Waiting for Ingress controller pod to be initialized'
-
- 60.times do
- if service_available?('kubectl get pods --all-namespaces -l app.kubernetes.io/component=controller | grep -o "ingress-nginx-controller.*1/1"')
- return yield if block_given?
-
- return true
- end
-
- sleep 1
- QA::Runtime::Logger.info '.'
- end
-
- raise 'Ingress pod has not been initialized correctly'
- end
- end
- end
- end
-end
diff --git a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
index 79bba484bea..79509bdbe01 100644
--- a/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import_github_repo_spec.rb
@@ -36,7 +36,7 @@ module QA
imported_project.reload! # import the project
expect { imported_project.project_import_status[:import_status] }.to eventually_eq('finished')
- .within(max_duration: 90, sleep_interval: 1)
+ .within(max_duration: 240, sleep_interval: 1)
aggregate_failures do
verify_status_data
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb
new file mode 100644
index 00000000000..201b8efdf6a
--- /dev/null
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_release_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require_relative 'gitlab_project_migration_common'
+
+module QA
+ RSpec.describe 'Manage' do
+ describe 'Gitlab migration' do
+ include_context 'with gitlab project migration'
+
+ context 'with release' do
+ let(:tag) { 'v0.0.1' }
+ let(:source_project_with_readme) { true }
+
+ let(:milestone) do
+ Resource::ProjectMilestone.fabricate_via_api! do |resource|
+ resource.project = source_project
+ resource.api_client = api_client
+ end
+ end
+
+ let(:source_release) { comparable_release(source_project.releases.find { |r| r[:tag_name] == tag }) }
+ let(:imported_release) { comparable_release(imported_releases.find { |r| r[:tag_name] == tag }) }
+ let(:imported_releases) { imported_project.releases }
+
+ # Update release object to be comparable
+ #
+ # Convert objects with project specific attributes like paths and urls to be comparable
+ #
+ # @param [Hash] release
+ # @return [Hash]
+ def comparable_release(release)
+ release&.except(:_links, :evidences)&.merge(
+ {
+ author: release[:author].except(:web_url),
+ commit: release[:commit].except(:web_url),
+ commit_path: release[:commit_path].split("/-/").last,
+ tag_path: release[:tag_path].split("/-/").last,
+ assets: release[:assets].merge({
+ sources: release.dig(:assets, :sources).map do |source|
+ source.merge({ url: source[:url].split("/-/").last })
+ end
+ }),
+ milestones: release[:milestones].map do |milestone|
+ milestone.except(:id, :project_id).merge({ web_url: milestone[:web_url].split("/-/").last })
+ end
+ # TODO: Add back evidence testing once implemented
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/360567
+ # evidences: release[:evidences].map do |evidence|
+ # evidence.merge({ filepath: evidence[:filepath].split("/-/").last })
+ # end
+ }
+ )
+ end
+
+ before do
+ source_project.create_release(tag, milestones: [milestone.title])
+ end
+
+ it(
+ 'successfully imports project release',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360243'
+ ) do
+ expect_import_finished
+
+ expect(imported_releases.size).to eq(1), "Expected to have 1 migrated release"
+ expect(imported_release).to eq(source_release)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
index 6480b880400..33ec24d1be1 100644
--- a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb
@@ -11,7 +11,7 @@ module QA
@user_api_client = Runtime::API::Client.new(:gitlab, personal_access_token: @project_access_token.token)
end
- context 'for the same project' do
+ context 'for the same project', :reliable do
it 'can be used to create a file via the project API', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347858' do
expect do
Resource::File.fabricate_via_api! do |file|
diff --git a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb
index fe6c89f4ee4..e518bbfc6f7 100644
--- a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb
@@ -2,7 +2,7 @@
module QA
RSpec.describe 'Manage' do
- describe 'User', :requires_admin do
+ describe 'User', :requires_admin, :reliable do
before(:all) do
admin_api_client = Runtime::API::Client.as_admin
diff --git a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
index d066953d12e..b6296b5a263 100644
--- a/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
+++ b/qa/qa/specs/features/api/3_create/gitaly/praefect_replication_queue_spec.rb
@@ -3,7 +3,10 @@
require 'parallel'
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361382',
+ type: :investigating
+ } do
context 'Gitaly Cluster replication queue', :orchestrated, :gitaly_cluster, :skip_live_env do
let(:praefect_manager) { Service::PraefectManager.new }
let(:project) do
diff --git a/qa/qa/specs/features/api/3_create/repository/files_spec.rb b/qa/qa/specs/features/api/3_create/repository/files_spec.rb
index 4d28937fbf8..151fd0fffe3 100644
--- a/qa/qa/specs/features/api/3_create/repository/files_spec.rb
+++ b/qa/qa/specs/features/api/3_create/repository/files_spec.rb
@@ -3,68 +3,69 @@
require 'airborne'
module QA
- RSpec.describe 'API basics' do
- before(:context) do
- @api_client = Runtime::API::Client.new(:gitlab)
- end
+ RSpec.describe 'Create' do
+ describe 'API basics' do
+ before(:context) do
+ @api_client = Runtime::API::Client.new(:gitlab)
+ end
- let(:project_name) { "api-basics-#{SecureRandom.hex(8)}" }
- let(:sanitized_project_path) { CGI.escape("#{Runtime::User.username}/#{project_name}") }
+ let(:project_name) { "api-basics-#{SecureRandom.hex(8)}" }
+ let(:sanitized_project_path) { CGI.escape("#{Runtime::User.username}/#{project_name}") }
- it 'user creates a project with a file and deletes them afterwards', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347745' do
- create_project_request = Runtime::API::Request.new(@api_client, '/projects')
- post create_project_request.url, path: project_name, name: project_name
+ it 'user creates a project with a file and deletes them afterwards', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347745' do
+ create_project_request = Runtime::API::Request.new(@api_client, '/projects')
+ post create_project_request.url, path: project_name, name: project_name
- expect_status(201)
- expect(json_body).to match(
- a_hash_including(name: project_name, path: project_name)
- )
+ expect_status(201)
+ expect(json_body).to match(
+ a_hash_including(name: project_name, path: project_name)
+ )
- default_branch = json_body[:default_branch].to_s.empty? ? Runtime::Env.default_branch : json_body[:default_branch]
+ default_branch = json_body[:default_branch].to_s.empty? ? Runtime::Env.default_branch : json_body[:default_branch]
- create_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md")
- post create_file_request.url, branch: default_branch, content: 'Hello world', commit_message: 'Add README.md'
+ create_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md")
+ post create_file_request.url, branch: default_branch, content: 'Hello world', commit_message: 'Add README.md'
- expect_status(201)
- expect(json_body).to match(
- a_hash_including(branch: default_branch, file_path: 'README.md')
- )
+ expect_status(201)
+ expect(json_body).to match(
+ a_hash_including(branch: default_branch, file_path: 'README.md')
+ )
- get_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md", ref: default_branch)
- get get_file_request.url
+ get_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md", ref: default_branch)
+ get get_file_request.url
- expect_status(200)
- expect(json_body).to match(
- a_hash_including(
- ref: default_branch,
- file_path: 'README.md', file_name: 'README.md',
- encoding: 'base64', content: 'SGVsbG8gd29ybGQ='
+ expect_status(200)
+ expect(json_body).to match(
+ a_hash_including(
+ ref: default_branch,
+ file_path: 'README.md', file_name: 'README.md',
+ encoding: 'base64', content: 'SGVsbG8gd29ybGQ='
+ )
)
- )
- delete_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md", branch: default_branch, commit_message: 'Remove README.md')
- delete delete_file_request.url
+ delete_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/README.md", branch: default_branch, commit_message: 'Remove README.md')
+ delete delete_file_request.url
- expect_status(204)
+ expect_status(204)
- get_tree_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/tree")
- get get_tree_request.url
+ get_tree_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/tree")
+ get get_tree_request.url
- expect_status(200)
- expect(json_body).to eq([])
+ expect_status(200)
+ expect(json_body).to eq([])
- delete_project_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}")
- delete delete_project_request.url
+ delete_project_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}")
+ delete delete_project_request.url
- expect_status(202)
- expect(json_body).to match(
- a_hash_including(message: '202 Accepted')
- )
- end
+ expect_status(202)
+ expect(json_body).to match(
+ a_hash_including(message: '202 Accepted')
+ )
+ end
- describe 'raw file access' do
- let(:svg_file) do
- <<-SVG
+ describe 'raw file access' do
+ let(:svg_file) do
+ <<-SVG
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
@@ -74,44 +75,45 @@ module QA
alert("surprise");
</script>
</svg>
- SVG
- end
-
- it 'sets no-cache headers as expected', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347746' do
- create_project_request = Runtime::API::Request.new(@api_client, '/projects')
- post create_project_request.url, path: project_name, name: project_name
-
- default_branch = json_body[:default_branch].to_s.empty? ? Runtime::Env.default_branch : json_body[:default_branch]
-
- create_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/test.svg")
- post create_file_request.url, branch: default_branch, content: svg_file, commit_message: 'Add test.svg'
-
- get_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/test.svg/raw", ref: default_branch)
-
- 3.times do
- response = get get_file_request.url
-
- # Subsequent responses aren't cached, so headers should match from
- # request to request, especially a 200 response rather than a 304
- # (indicating a cached response.) Further, :content_disposition
- # should include `attachment` for all responses.
- #
- expect(response.headers[:cache_control]).to include("no-store")
- expect(response.headers[:cache_control]).to include("no-cache")
- expect(response.headers[:pragma]).to eq("no-cache")
- expect(response.headers[:expires]).to eq("Fri, 01 Jan 1990 00:00:00 GMT")
- expect(response.headers[:content_disposition]).to include("attachment")
- expect(response.headers[:content_disposition]).not_to include("inline")
- expect(response.headers[:content_type]).to include("image/svg+xml")
+ SVG
end
- delete_project_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}")
- delete delete_project_request.url
-
- expect_status(202)
- expect(json_body).to match(
- a_hash_including(message: '202 Accepted')
- )
+ it 'sets no-cache headers as expected', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347746' do
+ create_project_request = Runtime::API::Request.new(@api_client, '/projects')
+ post create_project_request.url, path: project_name, name: project_name
+
+ default_branch = json_body[:default_branch].to_s.empty? ? Runtime::Env.default_branch : json_body[:default_branch]
+
+ create_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/test.svg")
+ post create_file_request.url, branch: default_branch, content: svg_file, commit_message: 'Add test.svg'
+
+ get_file_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}/repository/files/test.svg/raw", ref: default_branch)
+
+ 3.times do
+ response = get get_file_request.url
+
+ # Subsequent responses aren't cached, so headers should match from
+ # request to request, especially a 200 response rather than a 304
+ # (indicating a cached response.) Further, :content_disposition
+ # should include `attachment` for all responses.
+ #
+ expect(response.headers[:cache_control]).to include("no-store")
+ expect(response.headers[:cache_control]).to include("no-cache")
+ expect(response.headers[:pragma]).to eq("no-cache")
+ expect(response.headers[:expires]).to eq("Fri, 01 Jan 1990 00:00:00 GMT")
+ expect(response.headers[:content_disposition]).to include("attachment")
+ expect(response.headers[:content_disposition]).not_to include("inline")
+ expect(response.headers[:content_type]).to include("image/svg+xml")
+ end
+
+ delete_project_request = Runtime::API::Request.new(@api_client, "/projects/#{sanitized_project_path}")
+ delete delete_project_request.url
+
+ expect_status(202)
+ expect(json_body).to match(
+ a_hash_including(message: '202 Accepted')
+ )
+ end
end
end
end
diff --git a/qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb b/qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb
new file mode 100644
index 00000000000..2b48945137c
--- /dev/null
+++ b/qa/qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb
@@ -0,0 +1,120 @@
+# frozen_string_literal: true
+
+module QA
+ # TODO:
+ # Remove FF :ci_trigger_forward_variables
+ # when https://gitlab.com/gitlab-org/gitlab/-/issues/355572 is closed
+ RSpec.describe 'Verify', :runner, feature_flag: {
+ name: 'ci_trigger_forward_variables',
+ scope: :global
+ } do
+ describe 'Pipeline API defined variable inheritance' do
+ include_context 'variable inheritance test prep'
+
+ before do
+ add_ci_file(downstream1_project, [downstream1_ci_file])
+ add_ci_file(upstream_project, [upstream_ci_file, upstream_child1_ci_file, upstream_child2_ci_file])
+
+ start_pipeline_via_api_with_variable
+
+ Support::Waiter.wait_until(max_duration: 180, sleep_interval: 5) do
+ upstream_pipeline.status == 'success'
+ end
+
+ Support::Waiter.wait_until(max_duration: 180, sleep_interval: 5) do
+ downstream1_pipeline.pipeline_variables && child1_pipeline.pipeline_variables
+ end
+ end
+
+ it(
+ 'is determined based on forward:pipeline_variables condition',
+ :aggregate_failures,
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360745',
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361400', type: :investigating }
+ ) do
+ # Is inheritable when true
+ expect(child1_pipeline).to have_variable(key: key, value: value),
+ "Expected to find `{key: 'TEST_VAR', value: 'This is great!'}`" \
+ " but got #{child1_pipeline.pipeline_variables}"
+
+ # Is not inheritable when false
+ expect(child2_pipeline).not_to have_variable(key: key, value: value),
+ "Did not expect to find `{key: 'TEST_VAR', value: 'This is great!'}`" \
+ " but got #{child2_pipeline.pipeline_variables}"
+
+ # Is not inheritable by default
+ expect(downstream1_pipeline).not_to have_variable(key: key, value: value),
+ "Did not expect to find `{key: 'TEST_VAR', value: 'This is great!'}`" \
+ " but got #{downstream1_pipeline.pipeline_variables}"
+ end
+
+ def start_pipeline_via_api_with_variable
+ Resource::Pipeline.fabricate_via_api! do |pipeline|
+ pipeline.project = upstream_project
+ pipeline.variables = [{ key: key, value: value, variable_type: 'env_var' }]
+ end
+
+ Support::Waiter.wait_until { upstream_project.pipelines.size > 1 }
+ end
+
+ def upstream_pipeline
+ Resource::Pipeline.fabricate_via_api! do |pipeline|
+ pipeline.project = upstream_project
+ pipeline.id = upstream_project.pipelines.first[:id]
+ end
+ end
+
+ def child1_pipeline
+ Resource::Pipeline.fabricate_via_api! do |pipeline|
+ pipeline.project = upstream_project
+ pipeline.id = upstream_pipeline.downstream_pipeline_id(bridge_name: 'child1_trigger')
+ end
+ end
+
+ def child2_pipeline
+ Resource::Pipeline.fabricate_via_api! do |pipeline|
+ pipeline.project = upstream_project
+ pipeline.id = upstream_pipeline.downstream_pipeline_id(bridge_name: 'child2_trigger')
+ end
+ end
+
+ def downstream1_pipeline
+ Resource::Pipeline.fabricate_via_api! do |pipeline|
+ pipeline.project = downstream1_project
+ pipeline.id = upstream_pipeline.downstream_pipeline_id(bridge_name: 'downstream1_trigger')
+ end
+ end
+
+ def upstream_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ stages:
+ - test
+ - deploy
+
+ child1_trigger:
+ stage: test
+ trigger:
+ include: .child1-ci.yml
+ forward:
+ pipeline_variables: true
+
+ child2_trigger:
+ stage: test
+ trigger:
+ include: .child2-ci.yml
+ forward:
+ pipeline_variables: false
+
+ # default behavior
+ downstream1_trigger:
+ stage: deploy
+ trigger:
+ project: #{downstream1_project.full_path}
+ YAML
+ }
+ 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 3a1a3ff7169..d7207803d45 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,7 +3,7 @@
require 'airborne'
module QA
- RSpec.describe 'Package', only: { subdomain: %i[staging pre] } do
+ RSpec.describe 'Package', only: { subdomain: %i[staging pre] }, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/360466', type: :investigating } do
include Support::API
describe 'Container Registry' do
@@ -57,7 +57,6 @@ module QA
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')
- - echo $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"'
diff --git a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb
index bb4e0d71710..72090306fd9 100644
--- a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb
+++ b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_default_enabled_spec.rb
@@ -1,19 +1,21 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Service ping default enabled' do
- context 'When using default enabled from gitlab.yml config', :requires_admin, except: { job: 'review-qa-*' } do
- before do
- Flow::Login.sign_in_as_admin
+ RSpec.describe 'Non-devops' do
+ describe 'Service ping default enabled' do
+ context 'when using default enabled from gitlab.yml config', :requires_admin, except: { job: 'review-qa-*' } do
+ before do
+ Flow::Login.sign_in_as_admin
- Page::Main::Menu.perform(&:go_to_admin_area)
- Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings)
- end
+ Page::Main::Menu.perform(&:go_to_admin_area)
+ Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings)
+ end
- it 'has service ping toggle enabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348335' do
- Page::Admin::Settings::MetricsAndProfiling.perform do |setting|
- setting.expand_usage_statistics do |page|
- expect(page).not_to have_disabled_usage_data_checkbox
+ it 'has service ping toggle enabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348335' do
+ Page::Admin::Settings::MetricsAndProfiling.perform do |setting|
+ setting.expand_usage_statistics do |page|
+ expect(page).not_to have_disabled_usage_data_checkbox
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb
index cab8bd367f5..791bd688cea 100644
--- a/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb
+++ b/qa/qa/specs/features/browser_ui/14_non_devops/service_ping_disabled_spec.rb
@@ -1,19 +1,21 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Service ping disabled', :orchestrated, :service_ping_disabled, :requires_admin do
- context 'when disabled from gitlab.yml config' do
- before do
- Flow::Login.sign_in_as_admin
+ RSpec.describe 'Non-devops' do
+ describe 'Service ping disabled', :orchestrated, :service_ping_disabled, :requires_admin do
+ context 'when disabled from gitlab.yml config' do
+ before do
+ Flow::Login.sign_in_as_admin
- Page::Main::Menu.perform(&:go_to_admin_area)
- Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings)
- end
+ Page::Main::Menu.perform(&:go_to_admin_area)
+ Page::Admin::Menu.perform(&:go_to_metrics_and_profiling_settings)
+ end
- it 'has service ping toggle is disabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348340' do
- Page::Admin::Settings::MetricsAndProfiling.perform do |settings|
- settings.expand_usage_statistics do |usage_statistics|
- expect(usage_statistics).to have_disabled_usage_data_checkbox
+ it 'has service ping toggle is disabled', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348340' do
+ Page::Admin::Settings::MetricsAndProfiling.perform do |settings|
+ settings.expand_usage_statistics do |usage_statistics|
+ expect(usage_statistics).to have_disabled_usage_data_checkbox
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
index 3bf5a11b074..0477a9b8a1f 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb
@@ -46,7 +46,7 @@ module QA
import_page.import!(github_repo, group.full_path, imported_project.name)
aggregate_failures do
- expect(import_page).to have_imported_project(github_repo)
+ expect(import_page).to have_imported_project(github_repo, wait: 240)
# validate button is present instead of navigating to avoid dealing with multiple tabs
# which makes the test more complicated
expect(import_page).to have_go_to_project_button(github_repo)
diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb
index c2bd61155b1..381a25a14d0 100644
--- a/qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb
+++ b/qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb
@@ -2,8 +2,8 @@
module QA
RSpec.describe 'Manage' do
- describe 'Project access tokens' do
- let(:project_access_token) {QA::Resource::ProjectAccessToken.fabricate_via_browser_ui!}
+ describe 'Project access tokens', :reliable do
+ let(:project_access_token) { QA::Resource::ProjectAccessToken.fabricate_via_browser_ui! }
it 'can be created and revoked via the UI', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347688' do
expect(project_access_token.token).not_to be_nil
diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
index eb4eb1d3e71..5fc9f8c2f41 100644
--- a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
+++ b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb
@@ -1,8 +1,7 @@
# frozen_string_literal: true
module QA
- # TODO: Remove :requires_admin when the `Runtime::Feature.enable` method call is removed
- RSpec.describe 'Plan', :smoke, :requires_admin do
+ RSpec.describe 'Plan', :smoke, feature_flag: { name: 'vue_issues_list', scope: :group } do
describe 'Issue creation' do
let(:project) { Resource::Project.fabricate_via_api! }
let(:closed_issue) { Resource::Issue.fabricate_via_api! { |issue| issue.project = project } }
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 b7284f972ef..5f896c7bf10 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
@@ -12,7 +12,7 @@ module QA
Flow::Login.sign_in
end
- it 'user adds a design and annotates it', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/352746', type: :investigating }, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do
+ it 'user adds a design and annotates it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347822' do
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_from_push_notification_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb
new file mode 100644
index 00000000000..10d7e0b071f
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Create' do
+ describe 'Create a new merge request from the event notification after a push' do
+ let(:branch_name) { "merge-request-test-#{SecureRandom.hex(8)}" }
+ let(:title) { "Merge from push event notification test #{SecureRandom.hex(8)}" }
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.initialize_with_readme = true
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ end
+
+ it(
+ 'creates a merge request after a push via the git CLI',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360489'
+ ) do
+ Resource::Repository::ProjectPush.fabricate! do |push|
+ push.project = project
+ push.branch_name = branch_name
+ end
+
+ project.visit!
+ Page::Project::Show.perform(&:new_merge_request)
+ Page::MergeRequest::New.perform do |merge_request|
+ merge_request.fill_title(title)
+ merge_request.create_merge_request
+ end
+
+ Page::MergeRequest::Show.perform do |merge_request|
+ expect(merge_request).to have_title(title)
+ end
+ end
+
+ it(
+ 'creates a merge request after a push via the API',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/360490'
+ ) do
+ commit = Resource::Repository::Commit.fabricate_via_api! do |resource|
+ resource.project = project
+ resource.add_files([{ 'file_path': "file-#{SecureRandom.hex(8)}.txt", 'content': 'MR init' }])
+ resource.branch = branch_name
+ resource.start_branch = project.default_branch
+ end
+ project.wait_for_push(commit.commit_message)
+
+ project.visit!
+ Page::Project::Show.perform(&:new_merge_request)
+ Page::MergeRequest::New.perform do |merge_request|
+ merge_request.fill_title(title)
+ merge_request.create_merge_request
+ end
+
+ Page::MergeRequest::Show.perform do |merge_request|
+ expect(merge_request).to have_title(title)
+ end
+ end
+ end
+ end
+end
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 6a2fe705cf7..f4ed9f28dac 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,7 +24,6 @@ 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
@@ -38,7 +37,7 @@ module QA
'creates a merge request with a milestone and label',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347762'
) do
- gitlab_account_username = "@#{Runtime::User.username}"
+ gitlab_account_user_name = Resource::User.default.reload!.name
milestone = Resource::ProjectMilestone.fabricate_via_api! do |milestone|
milestone.project = project
@@ -54,14 +53,13 @@ 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
Page::MergeRequest::Show.perform do |merge_request|
expect(merge_request).to have_title(merge_request_title)
expect(merge_request).to have_description(merge_request_description)
- expect(merge_request).to have_assignee(gitlab_account_username)
+ expect(merge_request).to have_assignee(gitlab_account_user_name)
expect(merge_request).to have_label(label.title)
expect(merge_request).to have_milestone(milestone.title)
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
index d1e852979d0..b544c9aa211 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb
@@ -5,7 +5,7 @@ module QA
describe 'Merge request creation from fork', quarantine: {
only: :production,
issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/343801",
- type: :investigation
+ type: :investigating
} do
let(:merge_request) do
Resource::MergeRequestFromFork.fabricate_via_browser_ui! do |merge_request|
diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
index 38adf2f5d55..b20d0929e9c 100644
--- a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
context 'Add batch suggestions to a Merge Request' do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
index 812a7bae6c3..0e4aa67162f 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb
@@ -1,32 +1,27 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create', :requires_admin do
+ # This test modifies an instance level setting,
+ # so skipping on live envs to avoid random transient issues
+ RSpec.describe 'Create', :requires_admin, :skip_live_env do
describe 'push after setting the file size limit via admin/application_settings' do
- # Note: The file size limits in this test should be greater than the limits in
- # ee/browser_ui/3_create/repository/push_rules_spec to prevent that test from
- # triggering the limit set in this test (which can happen on Staging where the
- # tests are run in parallel).
- # See: https://gitlab.com/gitlab-org/gitlab/-/issues/218620#note_361634705
-
include Support::API
- before(:context) do
- @project = Resource::Project.fabricate_via_api! do |p|
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |p|
p.name = 'project-test-push-limit'
p.initialize_with_readme = true
end
-
- @api_client = Runtime::API::Client.as_admin
end
after(:context) do
- # need to set the default value after test
- # default value for file size limit is empty
set_file_size_limit(nil)
end
- it 'push successful when the file size is under the limit', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347758' do
+ it(
+ 'push successful when the file size is under the limit',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347758'
+ ) do
set_file_size_limit(5)
retry_on_fail do
@@ -36,7 +31,10 @@ module QA
end
end
- it 'push fails when the file size is above the limit', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347759' do
+ it(
+ 'push fails when the file size is above the limit',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347759'
+ ) do
set_file_size_limit(2)
retry_on_fail do
@@ -46,7 +44,7 @@ module QA
end
def set_file_size_limit(limit)
- request = Runtime::API::Request.new(@api_client, '/application/settings')
+ request = Runtime::API::Request.new(Runtime::API::Client.as_admin, '/application/settings')
response = put request.url, receive_max_input_size: limit
expect(response.code).to eq(200)
@@ -56,13 +54,13 @@ module QA
def push_new_file(file_name, wait_for_push: true)
commit_message = 'Adding a new file'
output = Resource::Repository::Push.fabricate! do |p|
- p.repository_http_uri = @project.repository_http_location.uri
+ p.repository_http_uri = project.repository_http_location.uri
p.file_name = file_name
p.file_content = SecureRandom.random_bytes(3000000)
p.commit_message = commit_message
p.new_branch = false
end
- @project.wait_for_push commit_message
+ project.wait_for_push commit_message
output
end
@@ -77,10 +75,8 @@ module QA
# under a minute, i.e., in fewer than 6 attempts with a 10 second sleep
# between attempts.
# See https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/30233#note_188616863
- def retry_on_fail
- Support::Retrier.retry_on_exception(max_attempts: 6, reload_page: nil, sleep_interval: 10) do
- yield
- end
+ def retry_on_fail(&block)
+ Support::Retrier.retry_on_exception(max_attempts: 6, reload_page: false, sleep_interval: 10, &block)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
index f8129c9ccba..91b0940f137 100644
--- a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
describe 'Protected branch support' do
let(:branch_name) { 'protected-branch' }
let(:commit_message) { 'Protected push commit message' }
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 b0eb3ac7b37..a1a795ce0f3 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
@@ -1,34 +1,36 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'SSH keys support', :smoke, :skip_fips_env do
- key_title = "key for ssh tests #{Time.now.to_f}"
- key = nil
+ RSpec.describe 'Create' do
+ describe 'SSH keys support', :smoke, :skip_fips_env do
+ key_title = "key for ssh tests #{Time.now.to_f}"
+ key = nil
- before do
- Flow::Login.sign_in
- end
+ before do
+ Flow::Login.sign_in
+ end
+
+ it 'user can add an SSH key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347819' do
+ key = Resource::SSHKey.fabricate_via_browser_ui! do |resource|
+ resource.title = key_title
+ end
- it 'user can add an SSH key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347819' do
- key = Resource::SSHKey.fabricate_via_browser_ui! do |resource|
- resource.title = key_title
+ expect(page).to have_content(key.title)
+ expect(page).to have_content(key.md5_fingerprint)
end
- expect(page).to have_content(key.title)
- expect(page).to have_content(key.md5_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.
+ context 'after adding an ssh key' do
+ it 'can delete an ssh key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347820' do
+ Page::Main::Menu.perform(&:click_edit_profile_link)
+ Page::Profile::Menu.perform(&:click_ssh_keys)
+ Page::Profile::SSHKeys.perform do |ssh_keys|
+ ssh_keys.remove_key(key.title)
+ 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.
- context 'after adding an ssh key' do
- it 'can delete an ssh key', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347820' do
- Page::Main::Menu.perform(&:click_edit_profile_link)
- Page::Profile::Menu.perform(&:click_ssh_keys)
- Page::Profile::SSHKeys.perform do |ssh_keys|
- ssh_keys.remove_key(key.title)
+ expect(page).not_to have_content("Title: #{key.title}")
+ expect(page).not_to have_content(key.md5_fingerprint)
end
-
- expect(page).not_to have_content("Title: #{key.title}")
- expect(page).not_to have_content(key.md5_fingerprint)
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
index 0b63d9a1edb..a50b995e483 100644
--- a/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
describe 'Multiple file snippet' do
let(:first_file_content) { 'First file content' }
let(:second_file_content) { 'Second file content' }
diff --git a/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb b/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb
index b45624381c8..4b8edf8b792 100644
--- a/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb
+++ b/qa/qa/specs/features/browser_ui/3_create/wiki/content_editor_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Create' do
+ RSpec.describe 'Create', :reliable do
context 'Content Editor' do
let(:initial_wiki) { Resource::Wiki::ProjectPage.fabricate_via_api! }
let(:page_title) { 'Content Editor Page' }
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb
new file mode 100644
index 00000000000..63801536c34
--- /dev/null
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.describe 'Verify', :runner do
+ describe 'Pipeline with customizable variable' do
+ let(:executor) { "qa-runner-#{Time.now.to_i}" }
+ let(:pipeline_job_name) { 'customizable-variable' }
+ let(:variable_custom_value) { 'Custom Foo' }
+
+ let(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'project-with-customizable-variable-pipeline'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.project = project
+ runner.name = executor
+ runner.tags = [executor]
+ end
+ end
+
+ let!(:commit) do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files(
+ [
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ variables:
+ FOO:
+ value: "Default Foo"
+ description: "This is a description for the foo variable"
+ #{pipeline_job_name}:
+ tags:
+ - #{executor}
+ script: echo "$FOO"
+ YAML
+ }
+ ]
+ )
+ end
+ end
+
+ before do
+ Flow::Login.sign_in
+ project.visit!
+ Page::Project::Menu.perform(&:click_ci_cd_pipelines)
+ Page::Project::Pipeline::Index.perform do |index|
+ index.click_run_pipeline_button
+ end
+ end
+
+ after do
+ [runner, project].each(&:remove_via_api!)
+ end
+
+ it(
+ 'manually creates a pipeline and uses the defined custom variable value',
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/361814'
+ ) do
+ Page::Project::Pipeline::New.perform do |new|
+ new.configure_variable(value: variable_custom_value)
+ new.click_run_pipeline_button
+ end
+
+ Page::Project::Pipeline::Show.perform do |show|
+ Support::Waiter.wait_until { show.passed? }
+ end
+
+ job = Resource::Job.fabricate_via_api! do |job|
+ job.id = project.job_by_name(pipeline_job_name)[:id]
+ job.name = pipeline_job_name
+ job.project = project
+ end
+
+ job.visit!
+
+ Page::Project::Job::Show.perform do |show|
+ expect(show.output).to have_content(variable_custom_value)
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb
index 496cc5f8a60..bd200e57ff9 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb
@@ -24,7 +24,8 @@ module QA
it(
'is inheritable when forward:pipeline_variables is true',
:aggregate_failures,
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358197'
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358197',
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361338', type: :investigating }
) do
visit_job_page('child1', 'child1_job')
verify_job_log_shows_variable_value
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb
index 2a0aaf6d7a3..2bd0be542fe 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_non_inheritable_when_forward_pipeline_variables_false_spec.rb
@@ -25,7 +25,8 @@ module QA
it(
'is not inheritable when forward:pipeline_variables is false',
:aggregate_failures,
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358199'
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358199',
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361339', type: :investigating }
) do
visit_job_page('child1', 'child1_job')
verify_job_log_does_not_show_variable_value
@@ -39,7 +40,8 @@ module QA
it(
'is not inheritable by default',
:aggregate_failures,
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358200'
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358200',
+ quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361339', type: :investigating }
) do
visit_job_page('child2', 'child2_job')
verify_job_log_does_not_show_variable_value
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb
index 0d8756fc9a3..c5408f30d16 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/multi-project_pipelines_spec.rb
@@ -44,7 +44,7 @@ module QA
end
it(
- 'creates a multi-project pipeline',
+ 'creates a multi-project pipeline with artifact download',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/358064'
) do
Page::Project::Pipeline::Show.perform do |show|
@@ -78,7 +78,10 @@ module QA
job1:
stage: test
tags: ["#{executor}"]
- script: echo 'done'
+ script: echo 'done' > output.txt
+ artifacts:
+ paths:
+ - output.txt
staging:
stage: deploy
@@ -96,7 +99,12 @@ module QA
"#{downstream_job_name}":
stage: test
tags: ["#{executor}"]
- script: echo 'done'
+ needs:
+ - project: #{upstream_project.path_with_namespace}
+ job: job1
+ ref: main
+ artifacts: true
+ script: cat output.txt
YAML
}
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
index 5b7a569fa8a..f2278c7bf6d 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_dependent_relationship_spec.rb
@@ -60,7 +60,14 @@ module QA
child_job:
stage: test
tags: ["#{project.name}"]
- script: echo "Child job done!"
+ needs:
+ - project: #{project.path_with_namespace}
+ job: job1
+ ref: main
+ artifacts: true
+ script:
+ - cat output.txt
+ - echo "Child job done!"
YAML
}
@@ -84,18 +91,28 @@ module QA
file_path: '.gitlab-ci.yml',
content: <<~YAML
stages:
+ - build
- test
- deploy
+ default:
+ tags: ["#{project.name}"]
+
job1:
+ stage: build
+ script: echo "build success" > output.txt
+ artifacts:
+ paths:
+ - output.txt
+
+ job2:
stage: test
trigger:
include: ".child-ci.yml"
strategy: depend
- job2:
+ job3:
stage: deploy
- tags: ["#{project.name}"]
script: echo "parent deploy done"
YAML
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb
index 8d2af3ea0df..ac91a9dd2d3 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb
@@ -73,7 +73,7 @@ module QA
show.select_branch_from_dropdown(random_test_string)
aggregate_failures do
- expect(show.target_branch_name).to eq(random_test_string), 'Target branch field is not showing expected branch name.'
+ expect(show.source_branch_name).to eq(random_test_string), 'Branch field is not showing expected branch name.'
expect(show.editing_content).to have_content(random_test_string), 'Editor content does not include expected test string.'
end
@@ -81,7 +81,7 @@ module QA
show.select_branch_from_dropdown(project.default_branch)
aggregate_failures do
- expect(show.target_branch_name).to eq(project.default_branch), 'Target branch field is not showing expected branch name.'
+ expect(show.source_branch_name).to eq(project.default_branch), 'Branch field is not showing expected branch name.'
expect(show.editing_content).to have_content(project.default_branch), 'Editor content does not include expected test string.'
end
end
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
index b9f616aa733..931bb97ba32 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb
@@ -34,8 +34,8 @@ module QA
expect(show).to have_no_new_mr_checkbox
end
- # The new MR checkbox is visible after a new target branch name is set
- show.set_target_branch(SecureRandom.hex(10))
+ # The new MR checkbox is visible after a new branch name is set
+ show.set_source_branch(SecureRandom.hex(10))
expect(show).to have_new_mr_checkbox
show.select_new_mr_checkbox
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
index 205b4d1168a..d03ebd5aba3 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb
@@ -31,7 +31,7 @@ module QA
project.remove_via_api!
end
- it 'creates 2 trigger jobs and passes corresponding matrix variables', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348000' do
+ it 'creates 2 trigger jobs and passes corresponding matrix variables', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348000', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/361346', type: :investigating } do
Page::Project::Pipeline::Show.perform do |parent_pipeline|
trigger_title1 = 'deploy: [ovh, monitoring]'
trigger_title2 = 'deploy: [ovh, app]'
diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
index 00c5d4c74d4..d34df17c477 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb
@@ -53,13 +53,13 @@ module QA
it 'creates new pipeline and target branch', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349005' do
Page::Project::PipelineEditor::Show.perform do |show|
show.write_to_editor(random_test_string)
- show.set_target_branch(random_test_string)
+ show.set_source_branch(random_test_string)
show.submit_changes
Support::Waiter.wait_until { project.pipelines.size > 1 }
aggregate_failures do
- expect(show.target_branch_name).to eq(random_test_string)
+ expect(show.source_branch_name).to eq(random_test_string)
expect(show.current_branch).to eq(random_test_string)
expect(show.editing_content).to have_content(random_test_string)
expect { show.pipeline_id }.to eventually_eq(project.pipelines.pluck(:id).max).within(max_duration: 60, sleep_interval: 3)
diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
index f44c56ca0f9..122fb0fc1a0 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb
@@ -3,7 +3,6 @@
module QA
RSpec.describe 'Verify', :runner do
describe 'Code coverage statistics' do
- let(:simplecov) { '\(\d+.\d+\%\) covered' }
let(:executor) { "qa-runner-#{Time.now.to_i}" }
let(:runner) do
Resource::Runner.fabricate_via_api! do |runner|
@@ -19,8 +18,9 @@ module QA
mr.file_content = <<~EOF
test:
tags: [e2e-test]
+ coverage: '/\\d+\\.\\d+% covered/'
script:
- - echo '(66.67%) covered'
+ - echo '66.67% covered'
EOF
end
end
@@ -34,8 +34,6 @@ module QA
end
it 'creates an MR with code coverage statistics', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348068' do
- runner.project.visit!
- configure_code_coverage(simplecov)
merge_request.visit!
Page::MergeRequest::Show.perform do |mr_widget|
@@ -44,16 +42,5 @@ module QA
end
end
end
-
- private
-
- def configure_code_coverage(coverage_tool_pattern)
- Page::Project::Menu.perform(&:go_to_ci_cd_settings)
- Page::Project::Settings::CiCd.perform do |settings|
- settings.expand_general_pipelines do |coverage|
- coverage.configure_coverage_regex(coverage_tool_pattern)
- end
- end
- end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
index 9a5a5416d5c..d9d75a8ae7a 100644
--- a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb
@@ -39,6 +39,7 @@ module QA
end
after do
+ project.remove_via_api!
runner.remove_via_api!
end
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 9ef5b8c84fa..921b36b34af 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
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage, :reliable do
describe 'Maven group level endpoint' do
include Runtime::Fixtures
include_context 'packages registry qa scenario'
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
index d79f65764d4..13607ba1b41 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage, :reliable do
describe 'Maven project level endpoint' do
let(:group_id) { 'com.gitlab.qa' }
let(:artifact_id) { "maven-#{SecureRandom.hex(8)}" }
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
index 0ee5f1b6a0b..61a92daf129 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb
@@ -1,170 +1,170 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do
- describe 'npm instance level endpoint' do
- using RSpec::Parameterized::TableSyntax
- include Runtime::Fixtures
- include Support::Helpers::MaskToken
-
- let!(:registry_scope) { Runtime::Namespace.sandbox_name }
- let!(:personal_access_token) do
- unless Page::Main::Menu.perform(&:signed_in?)
- Flow::Login.sign_in
+ RSpec.describe 'Package' do
+ describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do
+ describe 'npm instance level endpoint' do
+ using RSpec::Parameterized::TableSyntax
+ include Runtime::Fixtures
+ include Support::Helpers::MaskToken
+
+ let!(:registry_scope) { Runtime::Namespace.sandbox_name }
+ let!(:personal_access_token) do
+ Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?)
+
+ Resource::PersonalAccessToken.fabricate!.token
end
- Resource::PersonalAccessToken.fabricate!.token
- end
-
- let(:project_deploy_token) do
- Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
- deploy_token.name = 'npm-deploy-token'
- deploy_token.project = project
- deploy_token.scopes = %w[
- read_repository
- read_package_registry
- write_package_registry
- ]
+ let(:project_deploy_token) do
+ Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
+ deploy_token.name = 'npm-deploy-token'
+ deploy_token.project = project
+ deploy_token.scopes = %w[
+ read_repository
+ read_package_registry
+ write_package_registry
+ ]
+ end
end
- end
- let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
- let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
- let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
+ let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
+ let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
+ let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
- let!(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'npm-instace-level-publish'
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'npm-instace-level-publish'
+ end
end
- end
- let!(:another_project) do
- Resource::Project.fabricate_via_api! do |another_project|
- another_project.name = 'npm-instance-level-install'
- another_project.template_name = 'express'
- another_project.group = project.group
+ let!(:another_project) do
+ Resource::Project.fabricate_via_api! do |another_project|
+ another_project.name = 'npm-instance-level-install'
+ another_project.template_name = 'express'
+ another_project.group = project.group
+ end
end
- end
- let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.name = "qa-runner-#{Time.now.to_i}"
- runner.tags = ["runner-for-#{project.group.name}"]
- runner.executor = :docker
- runner.token = project.group.reload!.runners_token
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.name = "qa-runner-#{Time.now.to_i}"
+ runner.tags = ["runner-for-#{project.group.name}"]
+ runner.executor = :docker
+ runner.token = project.group.reload!.runners_token
+ end
end
- end
- let(:package) do
- Resource::Package.init do |package|
- package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}"
- package.project = project
+ let(:package) do
+ Resource::Package.init do |package|
+ package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}"
+ package.project = project
+ end
end
- end
-
- after do
- package.remove_via_api!
- runner.remove_via_api!
- project.remove_via_api!
- another_project.remove_via_api!
- end
- where(:case_name, :authentication_token_type, :token_name, :testcase) do
- 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347600'
- 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347599'
- 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347598'
- end
+ after do
+ package.remove_via_api!
+ runner.remove_via_api!
+ project.remove_via_api!
+ another_project.remove_via_api!
+ end
- with_them do
- let(:auth_token) do
- case authentication_token_type
- when :personal_access_token
- use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
- use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project)
- when :ci_job_token
- '${CI_JOB_TOKEN}'
- when :project_deploy_token
- use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
- use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project)
- end
+ where(:case_name, :authentication_token_type, :token_name, :testcase) do
+ 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347600'
+ 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347599'
+ 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347598'
end
- it 'push and pull a npm package via CI', testcase: params[:testcase] do
- Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
- npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_package_instance.yaml.erb')).result(binding)
- package_json = ERB.new(read_fixture('package_managers/npm', 'package_instance.json.erb')).result(binding)
-
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add files'
- commit.add_files([
- {
- file_path: '.gitlab-ci.yml',
- content: npm_upload_yaml
- },
- {
- file_path: 'package.json',
- content: package_json
- }
- ])
+ with_them do
+ let(:auth_token) do
+ case authentication_token_type
+ when :personal_access_token
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project)
+ when :ci_job_token
+ '${CI_JOB_TOKEN}'
+ when :project_deploy_token
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project)
end
end
- project.visit!
- Flow::Pipeline.visit_latest_pipeline
+ it 'push and pull a npm package via CI', testcase: params[:testcase] do
+ Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
+ npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_package_instance.yaml.erb')).result(binding)
+ package_json = ERB.new(read_fixture('package_managers/npm', 'package_instance.json.erb')).result(binding)
+
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add files'
+ commit.add_files([
+ {
+ file_path: '.gitlab-ci.yml',
+ content: npm_upload_yaml
+ },
+ {
+ file_path: 'package.json',
+ content: package_json
+ }
+ ])
+ end
+ end
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('deploy')
- end
+ project.visit!
+ Flow::Pipeline.visit_latest_pipeline
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
- Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- npm_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_install_package_instance.yaml.erb')).result(binding)
-
- commit.project = another_project
- commit.commit_message = 'Add .gitlab-ci.yml'
- commit.add_files([
- {
- file_path: '.gitlab-ci.yml',
- content: npm_install_yaml
- }
- ])
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
end
- end
- another_project.visit!
- Flow::Pipeline.visit_latest_pipeline
+ Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ npm_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_install_package_instance.yaml.erb')).result(binding)
+
+ commit.project = another_project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([
+ {
+ file_path: '.gitlab-ci.yml',
+ content: npm_install_yaml
+ }
+ ])
+ end
+ end
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('install')
- end
+ another_project.visit!
+ Flow::Pipeline.visit_latest_pipeline
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
- job.click_browse_button
- end
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('install')
+ end
- Page::Project::Artifact::Show.perform do |artifacts|
- artifacts.go_to_directory('node_modules')
- artifacts.go_to_directory("@#{registry_scope}")
- expect(artifacts).to have_content("#{project.name}")
- end
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ job.click_browse_button
+ end
+
+ Page::Project::Artifact::Show.perform do |artifacts|
+ artifacts.go_to_directory('node_modules')
+ artifacts.go_to_directory("@#{registry_scope}")
+ expect(artifacts).to have_content(project.name.to_s)
+ end
- project.visit!
- Page::Project::Menu.perform(&:click_packages_link)
+ project.visit!
+ Page::Project::Menu.perform(&:click_packages_link)
- Page::Project::Packages::Index.perform do |index|
- expect(index).to have_package(package.name)
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package.name)
- index.click_package(package.name)
- end
+ index.click_package(package.name)
+ end
- Page::Project::Packages::Show.perform do |show|
- expect(show).to have_package_info(package.name, "1.0.0")
+ Page::Project::Packages::Show.perform do |show|
+ expect(show).to have_package_info(package.name, "1.0.0")
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
index 5ebcb94d0d0..59324c7338a 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb
@@ -1,142 +1,142 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do
- describe 'npm project level endpoint' do
- using RSpec::Parameterized::TableSyntax
- include Runtime::Fixtures
- include Support::Helpers::MaskToken
-
- let!(:registry_scope) { Runtime::Namespace.sandbox_name }
- let!(:personal_access_token) do
- unless Page::Main::Menu.perform(&:signed_in?)
- Flow::Login.sign_in
+ RSpec.describe 'Package' do
+ describe 'Package Registry', :orchestrated, :reliable, :packages, :object_storage do
+ describe 'npm project level endpoint' do
+ using RSpec::Parameterized::TableSyntax
+ include Runtime::Fixtures
+ include Support::Helpers::MaskToken
+
+ let!(:registry_scope) { Runtime::Namespace.sandbox_name }
+ let!(:personal_access_token) do
+ Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?)
+
+ Resource::PersonalAccessToken.fabricate!.token
end
- Resource::PersonalAccessToken.fabricate!.token
- end
-
- let(:project_deploy_token) do
- Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
- deploy_token.name = 'npm-deploy-token'
- deploy_token.project = project
- deploy_token.scopes = %w[
- read_repository
- read_package_registry
- write_package_registry
- ]
- end
- end
-
- let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
- let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
- let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
-
- let!(:project) do
- Resource::Project.fabricate_via_api! do |project|
- project.name = 'npm-project-level'
- project.visibility = :private
- end
- end
-
- let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.name = "qa-runner-#{Time.now.to_i}"
- runner.tags = ["runner-for-#{project.name}"]
- runner.executor = :docker
- runner.project = project
- end
- end
-
- let(:package) do
- Resource::Package.init do |package|
- package.name = "@#{registry_scope}/mypackage-#{SecureRandom.hex(8)}"
- package.project = project
- end
- end
-
- after do
- package.remove_via_api!
- runner.remove_via_api!
- project.remove_via_api!
- end
-
- where(:case_name, :authentication_token_type, :token_name, :testcase) do
- 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347592'
- 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347594'
- 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347593'
- end
-
- with_them do
- let(:auth_token) do
- case authentication_token_type
- when :personal_access_token
- use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
- when :ci_job_token
- '${CI_JOB_TOKEN}'
- when :project_deploy_token
- use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
+ let(:project_deploy_token) do
+ Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
+ deploy_token.name = 'npm-deploy-token'
+ deploy_token.project = project
+ deploy_token.scopes = %w[
+ read_repository
+ read_package_registry
+ write_package_registry
+ ]
end
end
- it 'push and pull a npm package via CI', testcase: params[:testcase] do
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- npm_upload_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_install_package_project.yaml.erb')).result(binding)
- package_json = ERB.new(read_fixture('package_managers/npm', 'package_project.json.erb')).result(binding)
-
- commit.project = project
- commit.commit_message = 'Add .gitlab-ci.yml'
- commit.add_files([
- {
- file_path: '.gitlab-ci.yml',
- content: npm_upload_install_yaml
- },
- {
- file_path: 'package.json',
- content: package_json
- }
- ])
- end
-
- project.visit!
- Flow::Pipeline.visit_latest_pipeline
-
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('deploy')
- end
+ let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
+ let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
+ let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
- end
-
- Flow::Pipeline.visit_latest_pipeline
-
- Page::Project::Pipeline::Show.perform do |pipeline|
- pipeline.click_job('install')
+ let!(:project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.name = 'npm-project-level'
+ project.visibility = :private
end
+ end
- Page::Project::Job::Show.perform do |job|
- expect(job).to be_successful(timeout: 800)
- job.click_browse_button
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.name = "qa-runner-#{Time.now.to_i}"
+ runner.tags = ["runner-for-#{project.name}"]
+ runner.executor = :docker
+ runner.project = project
end
+ end
- Page::Project::Artifact::Show.perform do |artifacts|
- artifacts.go_to_directory('node_modules')
- artifacts.go_to_directory("@#{registry_scope}")
- expect(artifacts).to have_content('mypackage')
+ let(:package) do
+ Resource::Package.init do |package|
+ package.name = "@#{registry_scope}/mypackage-#{SecureRandom.hex(8)}"
+ package.project = project
end
+ end
- project.visit!
- Page::Project::Menu.perform(&:click_packages_link)
+ after do
+ package.remove_via_api!
+ runner.remove_via_api!
+ project.remove_via_api!
+ end
- Page::Project::Packages::Index.perform do |index|
- expect(index).to have_package(package.name)
+ where(:case_name, :authentication_token_type, :token_name, :testcase) do
+ 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347592'
+ 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347594'
+ 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347593'
+ end
- index.click_package(package.name)
+ with_them do
+ let(:auth_token) do
+ case authentication_token_type
+ when :personal_access_token
+ use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project)
+ when :ci_job_token
+ '${CI_JOB_TOKEN}'
+ when :project_deploy_token
+ use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project)
+ end
end
- Page::Project::Packages::Show.perform do |show|
- expect(show).to have_package_info(package.name, "1.0.0")
+ it 'push and pull a npm package via CI', testcase: params[:testcase] do
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ npm_upload_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_install_package_project.yaml.erb')).result(binding)
+ package_json = ERB.new(read_fixture('package_managers/npm', 'package_project.json.erb')).result(binding)
+
+ commit.project = project
+ commit.commit_message = 'Add .gitlab-ci.yml'
+ commit.add_files([
+ {
+ file_path: '.gitlab-ci.yml',
+ content: npm_upload_install_yaml
+ },
+ {
+ file_path: 'package.json',
+ content: package_json
+ }
+ ])
+ end
+
+ project.visit!
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('deploy')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ end
+
+ Flow::Pipeline.visit_latest_pipeline
+
+ Page::Project::Pipeline::Show.perform do |pipeline|
+ pipeline.click_job('install')
+ end
+
+ Page::Project::Job::Show.perform do |job|
+ expect(job).to be_successful(timeout: 800)
+ job.click_browse_button
+ end
+
+ Page::Project::Artifact::Show.perform do |artifacts|
+ artifacts.go_to_directory('node_modules')
+ artifacts.go_to_directory("@#{registry_scope}")
+ expect(artifacts).to have_content('mypackage')
+ end
+
+ project.visit!
+ Page::Project::Menu.perform(&:click_packages_link)
+
+ Page::Project::Packages::Index.perform do |index|
+ expect(index).to have_package(package.name)
+
+ index.click_package(package.name)
+ end
+
+ Page::Project::Packages::Show.perform do |show|
+ expect(show).to have_package_info(package.name, "1.0.0")
+ end
end
end
end
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
index 0ddb59d6625..f229f30facc 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage, :reliable do
describe 'NuGet group level endpoint' do
using RSpec::Parameterized::TableSyntax
include Runtime::Fixtures
diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
index d5fd78480d2..ab6896ca26f 100644
--- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
+++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb
@@ -1,7 +1,10 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Package', :orchestrated, :packages, :object_storage do
+ RSpec.describe 'Package', :orchestrated, :packages, :object_storage, :reliable, quarantine: {
+ type: :flaky,
+ issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/361704"
+ } do
describe 'NuGet project level endpoint' do
include Support::Helpers::MaskToken
@@ -129,12 +132,12 @@ module QA
file_path: 'dotnetcore.csproj',
content: <<~EOF
<Project Sdk="Microsoft.NET.Sdk">
-
+
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
-
+
</Project>
EOF
}
diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
index e0cd5a52bfb..dca6f961047 100644
--- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
+++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb
@@ -1,7 +1,12 @@
# frozen_string_literal: true
module QA
- RSpec.describe 'Configure', only: { subdomain: :staging } do
+ RSpec.describe 'Configure',
+ only: { subdomain: :staging },
+ quarantine: {
+ issue: 'https://gitlab.com/gitlab-org/quality/team-tasks/-/issues/1198',
+ type: :waiting_on
+ } do
let(:project) do
Resource::Project.fabricate_via_api! do |project|
project.name = 'autodevops-project'
diff --git a/qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb b/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb
index 9d1a37cb0b8..9d1a37cb0b8 100644
--- a/qa/spec/support/shared_contexts/merge_train_spec_with_user_prep.rb
+++ b/qa/qa/specs/features/shared_contexts/merge_train_spec_with_user_prep.rb
diff --git a/qa/spec/support/shared_contexts/packages_registry_shared_context.rb b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb
index 73a6c2bd99e..73a6c2bd99e 100644
--- a/qa/spec/support/shared_contexts/packages_registry_shared_context.rb
+++ b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb
diff --git a/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb
new file mode 100644
index 00000000000..fbe517f51f8
--- /dev/null
+++ b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb
@@ -0,0 +1,152 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_context 'variable inheritance test prep' do
+ let(:key) { 'TEST_VAR' }
+ let(:value) { 'This is great!' }
+ let(:random_string) { Faker::Alphanumeric.alphanumeric(number: 8) }
+
+ let(:group) do
+ Resource::Group.fabricate_via_api! do |group|
+ group.path = "group-for-variable-inheritance-#{random_string}"
+ end
+ end
+
+ let(:upstream_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'upstream-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Upstream'
+ end
+ end
+
+ let(:downstream1_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'downstream1-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Downstream'
+ end
+ end
+
+ let(:downstream2_project) do
+ Resource::Project.fabricate_via_api! do |project|
+ project.group = group
+ project.name = 'downstream2-variable-inheritance'
+ project.description = 'Project for pipeline with variable defined via UI - Downstream'
+ end
+ end
+
+ let!(:runner) do
+ Resource::Runner.fabricate! do |runner|
+ runner.token = group.reload!.runners_token
+ runner.name = random_string
+ runner.tags = [random_string]
+ end
+ end
+
+ before do
+ Runtime::Feature.enable(:ci_trigger_forward_variables)
+ Flow::Login.sign_in
+ end
+
+ after do
+ runner.remove_via_api!
+ Runtime::Feature.disable(:ci_trigger_forward_variables)
+ end
+
+ def start_pipeline_with_variable
+ upstream_project.visit!
+ Flow::Pipeline.wait_for_latest_pipeline
+ Page::Project::Pipeline::Index.perform(&:click_run_pipeline_button)
+ Page::Project::Pipeline::New.perform do |new|
+ new.configure_variable(key: key, value: value)
+ new.click_run_pipeline_button
+ end
+ end
+
+ def add_ci_file(project, files)
+ Resource::Repository::Commit.fabricate_via_api! do |commit|
+ commit.project = project
+ commit.commit_message = 'Add CI config file'
+ commit.add_files(files)
+ end
+ end
+
+ def visit_job_page(pipeline_title, job_name)
+ Page::Project::Pipeline::Show.perform do |show|
+ show.expand_child_pipeline(title: pipeline_title)
+ show.click_job(job_name)
+ end
+ end
+
+ def verify_job_log_shows_variable_value
+ Page::Project::Job::Show.perform do |show|
+ show.wait_until { show.successful? }
+ expect(show.output).to have_content(value)
+ end
+ end
+
+ def verify_job_log_does_not_show_variable_value
+ Page::Project::Job::Show.perform do |show|
+ show.wait_until { show.successful? }
+ expect(show.output).to have_no_content(value)
+ end
+ end
+
+ def upstream_child1_ci_file
+ {
+ file_path: '.child1-ci.yml',
+ content: <<~YAML
+ child1_job:
+ stage: test
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def upstream_child2_ci_file
+ {
+ file_path: '.child2-ci.yml',
+ content: <<~YAML
+ child2_job:
+ stage: test
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def downstream1_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ downstream1_job:
+ stage: deploy
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+
+ def downstream2_ci_file
+ {
+ file_path: '.gitlab-ci.yml',
+ content: <<~YAML
+ downstream2_job:
+ stage: deploy
+ tags: ["#{random_string}"]
+ script:
+ - echo $TEST_VAR
+ - echo Done!
+ YAML
+ }
+ end
+ end
+end
diff --git a/qa/spec/support/shared_examples/merge_with_code_owner_shared_examples.rb b/qa/qa/specs/features/shared_examples/merge_with_code_owner_shared_examples.rb
index 4bbad9bf3e5..4bbad9bf3e5 100644
--- a/qa/spec/support/shared_examples/merge_with_code_owner_shared_examples.rb
+++ b/qa/qa/specs/features/shared_examples/merge_with_code_owner_shared_examples.rb
diff --git a/qa/qa/specs/knapsack_runner.rb b/qa/qa/specs/knapsack_runner.rb
new file mode 100644
index 00000000000..4908553e43d
--- /dev/null
+++ b/qa/qa/specs/knapsack_runner.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module QA
+ module Specs
+ class KnapsackRunner
+ def self.run(args)
+ allocator = Knapsack::AllocatorBuilder.new(Knapsack::Adapters::RSpecAdapter).allocator
+
+ Knapsack.logger.info '==== Knapsack specs to execute ====='
+ Knapsack.logger.info 'Report specs:'
+ Knapsack.logger.info allocator.report_node_tests
+ Knapsack.logger.info 'Leftover specs:'
+ Knapsack.logger.info allocator.leftover_node_tests
+
+ status = RSpec::Core::Runner.run([*args, '--', *allocator.node_tests])
+ yield status if block_given?
+ status
+ end
+ end
+ end
+end
diff --git a/qa/qa/specs/qa_deprecation_toolkit_env.rb b/qa/qa/specs/qa_deprecation_toolkit_env.rb
new file mode 100644
index 00000000000..21ef5a6f229
--- /dev/null
+++ b/qa/qa/specs/qa_deprecation_toolkit_env.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'deprecation_toolkit'
+require 'deprecation_toolkit/rspec'
+require 'concurrent/utility/monotonic_time'
+require 'active_support/gem_version'
+
+module QaDeprecationToolkitEnv
+ # Taken from https://github.com/jeremyevans/ruby-warning/blob/1.1.0/lib/warning.rb#L18
+ # rubocop:disable Layout/LineLength
+ def self.kwargs_warning
+ %r{warning: (?:Using the last argument (?:for `.+' )?as keyword parameters is deprecated; maybe \*\* should be added to the call|Passing the keyword argument (?:for `.+' )?as the last hash parameter is deprecated|Splitting the last argument (?:for `.+' )?into positional and keyword parameters is deprecated|The called method (?:`.+' )?is defined here)\n\z}
+ end
+ # rubocop:enable Layout/LineLength
+
+ def self.configure!
+ # Enable ruby deprecations for keywords, it's suppressed by default in Ruby 2.7
+ Warning[:deprecated] = true
+
+ DeprecationToolkit::Configuration.test_runner = :rspec
+ DeprecationToolkit::Configuration.deprecation_path = 'deprecations'
+ DeprecationToolkit::Configuration.warnings_treated_as_deprecation = [kwargs_warning]
+ end
+end
diff --git a/qa/qa/specs/runner.rb b/qa/qa/specs/runner.rb
index c30e5d822c4..68b624b3f2e 100644
--- a/qa/qa/specs/runner.rb
+++ b/qa/qa/specs/runner.rb
@@ -19,18 +19,6 @@ module QA
@options = []
end
- def paths_from_knapsack
- allocator = Knapsack::AllocatorBuilder.new(Knapsack::Adapters::RSpecAdapter).allocator
-
- QA::Runtime::Logger.info '==== Knapsack specs to execute ====='
- QA::Runtime::Logger.info 'Report specs:'
- QA::Runtime::Logger.info allocator.report_node_tests.join(', ')
- QA::Runtime::Logger.info 'Leftover specs:'
- QA::Runtime::Logger.info allocator.leftover_node_tests.join(', ')
-
- ['--', allocator.node_tests]
- end
-
def rspec_tags
tags_for_rspec = []
@@ -52,77 +40,79 @@ module QA
tags_for_rspec
end
- # rubocop:disable Metrics/AbcSize
- # rubocop:disable Metrics/CyclomaticComplexity
def perform
args = []
args.push('--tty') if tty
args.push(rspec_tags)
args.push(options)
- if Runtime::Env.knapsack?
- args.push(paths_from_knapsack)
- else
- args.push(DEFAULT_TEST_PATH_ARGS) unless options.any? { |opt| opt =~ %r{/features/} }
+ unless Runtime::Env.knapsack? || options.any? { |opt| opt.include?('features') }
+ args.push(DEFAULT_TEST_PATH_ARGS)
end
- Runtime::Scenario.define(:large_setup?, args.flatten.include?('can_use_large_setup'))
-
- if Runtime::Scenario.attributes[:parallel]
+ if Runtime::Env.knapsack?
+ KnapsackRunner.run(args.flatten) { |status| abort if status.nonzero? }
+ elsif Runtime::Scenario.attributes[:parallel]
ParallelRunner.run(args.flatten)
elsif Runtime::Scenario.attributes[:loop]
LoopRunner.run(args.flatten)
elsif Runtime::Scenario.attributes[:count_examples_only]
- args.unshift('--dry-run')
- out = StringIO.new
+ count_examples_only(args)
+ elsif Runtime::Scenario.attributes[:test_metadata_only]
+ test_metadata_only(args)
+ else
+ RSpec::Core::Runner.run(args.flatten, *DEFAULT_STD_ARGS).tap { |status| abort if status.nonzero? }
+ end
+ end
- RSpec::Core::Runner.run(args.flatten, $stderr, out).tap do |status|
- abort if status.nonzero?
- end
+ private
- begin
- total_examples = out.string.match(/(\d+) examples?,/)[1]
- rescue StandardError
- raise RegexMismatchError, 'Rspec output did not match regex'
- end
+ def count_examples_only(args)
+ args.unshift('--dry-run')
+ out = StringIO.new
- filename = build_filename
+ RSpec::Core::Runner.run(args.flatten, $stderr, out).tap do |status|
+ abort if status.nonzero?
+ end
- File.open(filename, 'w') { |f| f.write(total_examples) } if total_examples.to_i > 0
+ begin
+ total_examples = out.string.match(/(\d+) examples?,/)[1]
+ rescue StandardError
+ raise RegexMismatchError, 'Rspec output did not match regex'
+ end
- $stdout.puts "Total examples in #{Runtime::Scenario.klass}: #{total_examples}#{total_examples.to_i > 0 ? ". Saved to file: #{filename}" : ''}"
- elsif Runtime::Scenario.attributes[:test_metadata_only]
- args.unshift('--dry-run')
+ filename = build_filename
- output_file = Pathname.new(File.join(Runtime::Path.qa_root, 'tmp', 'test-metadata.json'))
+ File.open(filename, 'w') { |f| f.write(total_examples) } if total_examples.to_i > 0
- RSpec.configure do |config|
- config.add_formatter(QA::Support::JsonFormatter, output_file)
- config.fail_if_no_examples = true
- end
+ saved_file_msg = total_examples.to_i > 0 ? ". Saved to file: #{filename}" : ''
+ $stdout.puts "Total examples in #{Runtime::Scenario.klass}: #{total_examples}#{saved_file_msg}"
+ end
- RSpec::Core::Runner.run(args.flatten, $stderr, $stdout) do |status|
- abort if status.nonzero?
- end
+ def test_metadata_only(args)
+ args.unshift('--dry-run')
- $stdout.puts "Saved to file: #{output_file}"
- else
- RSpec::Core::Runner.run(args.flatten, *DEFAULT_STD_ARGS).tap do |status|
- abort if status.nonzero?
- end
+ output_file = Pathname.new(File.join(Runtime::Path.qa_root, 'tmp', 'test-metadata.json'))
+
+ RSpec.configure do |config|
+ config.add_formatter(QA::Support::JsonFormatter, output_file)
+ config.fail_if_no_examples = true
end
- end
- # rubocop:enable Metrics/AbcSize
- # rubocop:enable Metrics/CyclomaticComplexity
- private
+ RSpec::Core::Runner.run(args.flatten, $stderr, $stdout) do |status|
+ abort if status.nonzero?
+ end
+
+ $stdout.puts "Saved to file: #{output_file}"
+ end
def build_filename
filename = Runtime::Scenario.klass.split('::').last(3).join('_').downcase
tags = []
+ tag_opts = %w[--tag -t]
options.reduce do |before, after|
- tags << after if %w[--tag -t].include?(before)
+ tags << after if tag_opts.include?(before)
after
end
tags = tags.compact.join('_')
diff --git a/qa/qa/specs/spec_helper.rb b/qa/qa/specs/spec_helper.rb
new file mode 100644
index 00000000000..b130fff0488
--- /dev/null
+++ b/qa/qa/specs/spec_helper.rb
@@ -0,0 +1,136 @@
+# frozen_string_literal: true
+
+require_relative '../../qa'
+
+require_relative 'qa_deprecation_toolkit_env'
+QaDeprecationToolkitEnv.configure!
+
+Knapsack::Adapters::RSpecAdapter.bind if QA::Runtime::Env.knapsack?
+
+QA::Support::GitlabAddress.define_gitlab_address_attribute!
+QA::Runtime::Browser.configure! unless QA::Runtime::Env.dry_run
+QA::Runtime::AllureReport.configure!
+QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
+
+Dir[::File.join(__dir__, "features/shared_examples/*.rb")].sort.each { |f| require f }
+Dir[::File.join(__dir__, "features/shared_contexts/*.rb")].sort.each { |f| require f }
+
+RSpec.configure do |config|
+ config.include QA::Support::Matchers::EventuallyMatcher
+ config.include QA::Support::Matchers::HaveMatcher
+
+ config.add_formatter QA::Support::Formatters::ContextFormatter
+ config.add_formatter QA::Support::Formatters::QuarantineFormatter
+ config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
+ config.add_formatter QA::Support::Formatters::TestStatsFormatter if QA::Runtime::Env.export_metrics?
+
+ config.before(:suite) do |suite|
+ QA::Resource::ReusableCollection.register_resource_classes do |collection|
+ QA::Resource::ReusableProject.register(collection)
+ QA::Resource::ReusableGroup.register(collection)
+ end
+ end
+
+ config.prepend_before do |example|
+ QA::Runtime::Logger.info("Starting test: #{Rainbow(example.full_description).bright}")
+ QA::Runtime::Example.current = example
+
+ # Reset fabrication counters tracked in resource base
+ Thread.current[:api_fabrication] = 0
+ Thread.current[:browser_ui_fabrication] = 0
+ end
+
+ config.after do
+ # If a .netrc file was created during the test, delete it so that subsequent tests don't try to use the same logins
+ QA::Git::Repository.new.delete_netrc
+ end
+
+ # Add fabrication time to spec metadata
+ config.append_after do |example|
+ example.metadata[:api_fabrication] = Thread.current[:api_fabrication]
+ example.metadata[:browser_ui_fabrication] = Thread.current[:browser_ui_fabrication]
+ end
+
+ config.after(:context) do
+ if !QA::Runtime::Browser.blank_page? && QA::Page::Main::Menu.perform(&:signed_in?)
+ QA::Page::Main::Menu.perform(&:sign_out)
+ raise(
+ <<~ERROR
+ The test left the browser signed in.
+
+ Usually, Capybara prevents this from happening but some things can
+ interfere. For example, if it has an `after(:context)` block that logs
+ in, the browser will stay logged in and this will cause the next test
+ to fail.
+
+ Please make sure the test does not leave the browser signed in.
+ ERROR
+ )
+ end
+ end
+
+ config.after(:suite) do |suite|
+ # Write all test created resources to JSON file
+ QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
+
+ # If requested, confirm that resources were used appropriately (e.g., not left with changes that interfere with
+ # further reuse)
+ QA::Resource::ReusableCollection.validate_resource_reuse if QA::Runtime::Env.validate_resource_reuse?
+
+ # If any tests failed, leave the resources behind to help troubleshoot, otherwise remove them.
+ # Do not remove the shared resource on live environments
+ begin
+ next if suite.reporter.failed_examples.present?
+ next unless QA::Runtime::Scenario.attributes.include?(:gitlab_address)
+ next if QA::Runtime::Env.running_on_dot_com?
+
+ QA::Resource::ReusableCollection.remove_all_via_api!
+ rescue QA::Resource::Errors::InternalServerError => e
+ # Temporarily prevent this error from failing jobs while the cause is investigated
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/354387
+ QA::Runtime::Logger.debug(e.message)
+ end
+ end
+
+ config.append_after(:suite) do
+ QA::Support::KnapsackReport.move_regenerated_report if QA::Runtime::Env.knapsack?
+ end
+
+ config.expect_with :rspec do |expectations|
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
+ end
+
+ config.mock_with :rspec do |mocks|
+ mocks.verify_partial_doubles = true
+ end
+
+ config.shared_context_metadata_behavior = :apply_to_host_groups
+ config.disable_monkey_patching!
+ config.expose_dsl_globally = true
+ config.profile_examples = 10
+ config.order = :random
+ Kernel.srand config.seed
+
+ # This option allows to use shorthand aliases for adding :focus metadata - fit, fdescribe and fcontext
+ config.filter_run_when_matching :focus
+
+ if ENV['CI'] && !QA::Runtime::Env.disable_rspec_retry?
+ # show retry status in spec process
+ config.verbose_retry = true
+
+ # show exception that triggers a retry if verbose_retry is set to true
+ config.display_try_failure_messages = true
+
+ non_quarantine_retries = QA::Runtime::Env.ci_project_name =~ /staging|canary|production/ ? 3 : 2
+ config.around do |example|
+ quarantine = example.metadata[:quarantine]
+ different_quarantine_context = QA::Specs::Helpers::Quarantine.quarantined_different_context?(quarantine)
+ focused_quarantine = QA::Specs::Helpers::Quarantine.filters.key?(:quarantine)
+
+ # Do not disable retry when spec is quarantined but on different environment
+ next example.run_with_retry(retry: non_quarantine_retries) if different_quarantine_context && !focused_quarantine
+
+ example.run_with_retry(retry: quarantine ? 1 : non_quarantine_retries)
+ end
+ end
+end
diff --git a/qa/qa/support/formatters/allure_metadata_formatter.rb b/qa/qa/support/formatters/allure_metadata_formatter.rb
index 2ed4ee2066a..d1baf87799a 100644
--- a/qa/qa/support/formatters/allure_metadata_formatter.rb
+++ b/qa/qa/support/formatters/allure_metadata_formatter.rb
@@ -20,11 +20,11 @@ module QA
def start(_start_notification)
return unless merge_request_iid # on main runs allure native history has pass rate already
- save_failures
- log(:debug, "Fetched #{failures.length} flaky testcases!")
+ save_flaky_specs
+ log(:debug, "Fetched #{flaky_specs.length} flaky testcases!")
rescue StandardError => e
log(:error, "Failed to fetch flaky spec data for report: #{e}")
- @failures = {}
+ @flaky_specs = {}
end
# Finished example
@@ -53,6 +53,8 @@ module QA
return unless issue_link
return example.issue('Quarantine issue', issue_link) if issue_link.is_a?(String)
return issue_link.each { |link| example.issue('Quarantine issue', link) } if issue_link.is_a?(Array)
+ rescue StandardError => e
+ log(:error, "Failed to add quarantine issue linkt for example '#{example.description}', error: #{e}")
end
# Add failure issues link
@@ -65,6 +67,8 @@ module QA
'Failure issues',
"https://gitlab.com/gitlab-org/gitlab/-/issues?scope=all&state=opened&search=#{spec_file}"
)
+ rescue StandardError => e
+ log(:error, "Failed to add failure issue link for example '#{example.description}', error: #{e}")
end
# Add ci job link
@@ -75,6 +79,8 @@ module QA
return unless Runtime::Env.running_in_ci?
example.add_link(name: "Job(#{Runtime::Env.ci_job_name})", url: Runtime::Env.ci_job_url)
+ rescue StandardError => e
+ log(:error, "Failed to add failure issue link for example '#{example.description}', error: #{e}")
end
# Mark test as flaky
@@ -82,21 +88,22 @@ module QA
# @param [RSpec::Core::Example] example
# @return [void]
def set_flaky_status(example)
- return unless merge_request_iid
- return unless example.execution_result.status == :failed && failures.key?(example.metadata[:testcase])
+ return unless merge_request_iid && flaky_specs.key?(example.metadata[:testcase])
example.set_flaky
- example.parameter("pass_rate", "#{failures[example.metadata[:testcase]].round(1)}%")
- log(:debug, "Setting spec as flaky due to present failures in last 14 days!")
+ example.parameter("pass_rate", "#{flaky_specs[example.metadata[:testcase]].round(1)}%")
+ log(:debug, "Setting spec as flaky because it's pass rate is below 98%")
+ rescue StandardError => e
+ log(:error, "Failed to add spec pass rate data for example '#{example.description}', error: #{e}")
end
- # Failed spec testcases
+ # Flaky specs with pass rate below 98%
#
# @return [Array]
- def failures
- @failures ||= influx_data.lazy.each_with_object({}) do |data, result|
- # TODO: replace with mr_iid once stats are populated
- records = data.records.reject { |r| r.values["_value"] == env("CI_PIPELINE_ID") }
+ def flaky_specs
+ @flaky_specs ||= influx_data.lazy.each_with_object({}) do |data, result|
+ # Do not consider failures in same merge request
+ records = data.records.reject { |r| r.values["_value"] == merge_request_iid }
runs = records.count
failed = records.count { |r| r.values["status"] == "failed" }
@@ -107,7 +114,7 @@ module QA
end.compact
end
- alias_method :save_failures, :failures
+ alias_method :save_flaky_specs, :flaky_specs
# Records of previous failures for runs of same type
#
@@ -122,7 +129,7 @@ module QA
|> filter(fn: (r) => r.run_type == "#{run_type}" and
r.status != "pending" and
r.quarantined == "false" and
- r._field == "pipeline_id"
+ r._field == "merge_request_iid"
)
|> group(columns: ["testcase"])
QUERY
diff --git a/qa/qa/support/gitlab_address.rb b/qa/qa/support/gitlab_address.rb
new file mode 100644
index 00000000000..d978bb2eee5
--- /dev/null
+++ b/qa/qa/support/gitlab_address.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module QA
+ module Support
+ class GitlabAddress
+ class << self
+ # Define gitlab address
+ #
+ # @param [String] address
+ # @return [void]
+ def define_gitlab_address_attribute!(address = Runtime::Env.gitlab_url)
+ return if initialized?
+
+ validate_address(address)
+
+ Runtime::Scenario.define(:gitlab_address, address)
+ # Define the "About" page as an `about` subdomain.
+ # @example
+ # Given *gitlab_address* = 'https://gitlab.com/' #=> https://about.gitlab.com/
+ # Given *gitlab_address* = 'https://staging.gitlab.com/' #=> https://about.staging.gitlab.com/
+ # Given *gitlab_address* = 'http://gitlab-abc123.test/' #=> http://about.gitlab-abc123.test/
+ Runtime::Scenario.define(:about_address, URI(address).tap { |uri| uri.host = "about.#{uri.host}" }.to_s)
+
+ @initialized = true
+ end
+
+ private
+
+ # Gitlab address already set up
+ #
+ # @return [Boolean]
+ def initialized?
+ @initialized
+ end
+
+ # Validate if address is a valid url
+ #
+ # @param [String] address
+ # @return [void]
+ def validate_address(address)
+ Runtime::Address.valid?(address) || raise(
+ ::ArgumentError, "Configured gitlab address is not a valid url: #{address}"
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/support/knapsack_report.rb b/qa/qa/support/knapsack_report.rb
new file mode 100644
index 00000000000..998802fe8b7
--- /dev/null
+++ b/qa/qa/support/knapsack_report.rb
@@ -0,0 +1,167 @@
+# frozen_string_literal: true
+
+require "fog/google"
+
+module QA
+ module Support
+ class KnapsackReport
+ extend SingleForwardable
+
+ PROJECT = "gitlab-qa-resources"
+ BUCKET = "knapsack-reports"
+ FALLBACK_REPORT = "knapsack/master_report.json"
+
+ def_delegators :new, :configure!, :move_regenerated_report, :download_report, :upload_report
+
+ # Configure knapsack report
+ #
+ # * Setup variables
+ # * Fetch latest report
+ #
+ # @return [void]
+ def configure!
+ return unless QA::Runtime::Env.knapsack?
+
+ setup_logger!
+ setup_environment!
+ download_report
+ end
+
+ # Download knapsack report from gcs bucket
+ #
+ # @return [void]
+ def download_report
+ logger.debug("Downloading latest knapsack report for '#{report_name}' to '#{report_path}'")
+ return logger.debug("Report already exists, skipping!") if File.exist?(report_path)
+
+ file = client.get_object(BUCKET, report_file)
+ File.write(report_path, file[:body])
+ rescue StandardError => e
+ ENV["KNAPSACK_REPORT_PATH"] = FALLBACK_REPORT
+ logger.warn("Failed to fetch latest knapsack report: #{e}")
+ logger.warn("Falling back to '#{FALLBACK_REPORT}'")
+ end
+
+ # Rename and move new regenerated report to a separate folder used to indicate report name
+ #
+ # @return [void]
+ def move_regenerated_report
+ return unless ENV["KNAPSACK_GENERATE_REPORT"] == "true"
+
+ tmp_path = "tmp/knapsack/#{report_name}"
+ FileUtils.mkdir_p(tmp_path)
+
+ # Use path from knapsack config in case of fallback to master_report.json
+ knapsack_report_path = Knapsack.report.report_path
+ logger.debug("Moving regenerated #{knapsack_report_path} to save as artifact")
+ FileUtils.cp(knapsack_report_path, "#{tmp_path}/#{ENV['CI_NODE_INDEX']}.json")
+ end
+
+ # Merge and upload knapsack report to gcs bucket
+ #
+ # Fetches all files defined in glob and uses parent folder as report name
+ #
+ # @param [String] glob
+ # @return [void]
+ def upload_report(glob)
+ reports = Pathname.glob(glob).each_with_object(Hash.new { |hsh, key| hsh[key] = [] }) do |report, hash|
+ next unless report.extname == ".json"
+
+ hash[report.parent.basename.to_s].push(report)
+ end
+ return logger.error("Glob '#{glob}' did not contain any valid report files!") if reports.empty?
+
+ reports.each do |name, jsons|
+ file = "#{name}.json"
+
+ report = jsons
+ .map { |json| JSON.parse(File.read(json)) }
+ .reduce({}, :merge)
+ .sort_by { |k, v| v } # sort report by execution time
+ .to_h
+ next logger.warn("Knapsack generated empty report for '#{name}', skipping upload!") if report.empty?
+
+ logger.info("Uploading latest knapsack report '#{file}'")
+ client.put_object(BUCKET, file, JSON.pretty_generate(report))
+ rescue StandardError => e
+ logger.error("Failed to upload knapsack report for '#{name}'. Error: #{e}")
+ end
+ end
+
+ private
+
+ # Setup knapsack logger
+ #
+ # @return [void]
+ def setup_logger!
+ Knapsack.logger = QA::Runtime::Logger.logger
+ end
+
+ # Set knapsack environment variables
+ #
+ # @return [void]
+ def setup_environment!
+ ENV["KNAPSACK_TEST_FILE_PATTERN"] ||= "qa/specs/features/**/*_spec.rb"
+ ENV["KNAPSACK_TEST_DIR"] = "qa/specs"
+ ENV["KNAPSACK_REPORT_PATH"] = report_path
+ end
+
+ # Logger instance
+ #
+ # @return [Logger]
+ def logger
+ @logger ||= Knapsack.logger
+ end
+
+ # GCS client
+ #
+ # @return [Fog::Storage::GoogleJSON]
+ def client
+ @client ||= Fog::Storage::Google.new(google_project: PROJECT, **gcs_credentials)
+ end
+
+ # Base path of knapsack report
+ #
+ # @return [String]
+ def report_base_path
+ @report_base_path ||= "knapsack"
+ end
+
+ # Knapsack report path
+ #
+ # @return [String]
+ def report_path
+ @report_path ||= "#{report_base_path}/#{report_file}"
+ end
+
+ # Knapsack report name
+ #
+ # @return [String]
+ def report_file
+ @report_file ||= "#{report_name}.json"
+ end
+
+ # Report name
+ #
+ # Infer report name from ci job name
+ # Remove characters incompatible with gcs bucket naming from job names like ee:instance-parallel
+ #
+ # @return [String]
+ def report_name
+ @report_name ||= ENV["QA_KNAPSACK_REPORT_NAME"] || ENV["CI_JOB_NAME"].split(" ").first.tr(":", "-")
+ end
+
+ # GCS credentials json
+ #
+ # @return [Hash]
+ def gcs_credentials
+ json_key = ENV["QA_KNAPSACK_REPORT_GCS_CREDENTIALS"] || raise(
+ "QA_KNAPSACK_REPORT_GCS_CREDENTIALS env variable is required!"
+ )
+ return { google_json_key_location: json_key } if File.exist?(json_key)
+
+ { google_json_key_string: json_key }
+ end
+ end
+ end
+end
diff --git a/qa/qa/support/matchers/have_matcher.rb b/qa/qa/support/matchers/have_matcher.rb
index b96566a9e5d..734a8890536 100644
--- a/qa/qa/support/matchers/have_matcher.rb
+++ b/qa/qa/support/matchers/have_matcher.rb
@@ -24,6 +24,7 @@ module QA
snippet_description
tag
label
+ variable
].each do |predicate|
RSpec::Matchers.define "have_#{predicate}" do |*args, **kwargs|
match do |page_object|
diff --git a/qa/qa/support/page/logging.rb b/qa/qa/support/page/logging.rb
index b402639b843..bc5ee645965 100644
--- a/qa/qa/support/page/logging.rb
+++ b/qa/qa/support/page/logging.rb
@@ -82,6 +82,12 @@ module QA
super
end
+ def click_via_capybara(method, locator)
+ log("clicking via capybara using '#{method}(#{locator})'")
+
+ super
+ end
+
def fill_element(name, content)
masked_content = name.to_s.match?(/token|key|password/) ? '*****' : content
diff --git a/qa/qa/tools/delete_test_snippets.rb b/qa/qa/tools/delete_test_snippets.rb
new file mode 100644
index 00000000000..5da962b14f3
--- /dev/null
+++ b/qa/qa/tools/delete_test_snippets.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+# This script deletes personal snippets for a specific user
+# - Specify `delete_before` to delete only snippets that were created before the given date (default: yesterday)
+# - If `dry_run` is true the script will list snippets to be deleted, but it won't delete them
+#
+# Required environment variables: GITLAB_QA_ACCESS_TOKEN and GITLAB_ADDRESS
+# - GITLAB_QA_ACCESS_TOKEN should have API access and belong to the user whose snippets will be deleted
+
+module QA
+ module Tools
+ class DeleteTestSnippets
+ include Support::API
+
+ ITEMS_PER_PAGE = '100'
+
+ def initialize(delete_before: (Date.today - 1).to_s, dry_run: false)
+ raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS']
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN" unless ENV['GITLAB_QA_ACCESS_TOKEN']
+
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'],
+ personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
+ @delete_before = Date.parse(delete_before)
+ @dry_run = dry_run
+ end
+
+ def run
+ $stdout.puts 'Running...'
+
+ response = head Runtime::API::Request.new(@api_client, "/snippets", per_page: ITEMS_PER_PAGE).url
+ total_pages = response.headers[:x_total_pages]
+
+ test_snippet_ids = fetch_snippet_ids(total_pages)
+ $stdout.puts "Number of test snippets to be deleted: #{test_snippet_ids.length}"
+
+ return if dry_run?
+
+ delete_snippets(test_snippet_ids) unless test_snippet_ids.empty?
+ $stdout.puts "\nDone"
+ end
+
+ private
+
+ attr_reader :dry_run
+ alias_method :dry_run?, :dry_run
+
+ def delete_snippets(snippet_ids)
+ $stdout.puts "Deleting #{snippet_ids.length} snippet(s)..."
+ snippet_ids.each do |snippet_id|
+ delete_response = delete Runtime::API::Request.new(@api_client, "/snippets/#{snippet_id}").url
+ dot_or_f = delete_response.code == 204 ? "\e[32m.\e[0m" : "\e[31mF\e[0m"
+ print dot_or_f
+ end
+ end
+
+ def fetch_snippet_ids(pages)
+ snippet_ids = []
+
+ pages.to_i.times do |page_no|
+ get_snippet_response = get Runtime::API::Request.new(@api_client, "/snippets",
+ page: (page_no + 1).to_s, per_page: ITEMS_PER_PAGE).url
+ snippets = JSON.parse(get_snippet_response.body).select do |snippet|
+ to_delete = Date.parse(snippet['created_at']) < @delete_before
+
+ if dry_run?
+ puts "Snippet title: #{snippet['title']}\tcreated_at: #{snippet['created_at']}\tdelete? #{to_delete}"
+ end
+
+ to_delete
+ end
+ snippet_ids.concat(snippets.map { |snippet| snippet['id'] })
+ end
+
+ snippet_ids.uniq
+ end
+ end
+ end
+end
diff --git a/qa/qa/tools/knapsack_report.rb b/qa/qa/tools/knapsack_report.rb
deleted file mode 100644
index e50c4fe63d2..00000000000
--- a/qa/qa/tools/knapsack_report.rb
+++ /dev/null
@@ -1,150 +0,0 @@
-# frozen_string_literal: true
-
-require "fog/google"
-
-module QA
- module Tools
- class KnapsackReport
- extend SingleForwardable
-
- PROJECT = "gitlab-qa-resources"
- BUCKET = "knapsack-reports"
- FALLBACK_REPORT = "knapsack/master_report.json"
-
- def_delegators :new, :configure!, :move_regenerated_report, :download_report, :upload_report
-
- # Configure knapsack report
- #
- # * Setup variables
- # * Fetch latest report
- #
- # @return [void]
- def configure!
- ENV["KNAPSACK_TEST_FILE_PATTERN"] ||= "qa/specs/features/**/*_spec.rb"
- ENV["KNAPSACK_REPORT_PATH"] = report_path
-
- Knapsack.logger = QA::Runtime::Logger.logger
-
- download_report
- end
-
- # Download knapsack report from gcs bucket
- #
- # @return [void]
- def download_report
- logger.debug("Downloading latest knapsack report for '#{report_name}' to '#{report_path}'")
- file = client.get_object(BUCKET, report_file)
- File.write(report_path, file[:body])
- rescue StandardError => e
- ENV["KNAPSACK_REPORT_PATH"] = FALLBACK_REPORT
- logger.warn("Failed to fetch latest knapsack report: #{e}")
- logger.warn("Falling back to '#{FALLBACK_REPORT}'")
- end
-
- # Rename and move new regenerated report to a separate folder used to indicate report name
- #
- # @return [void]
- def move_regenerated_report
- return unless ENV["KNAPSACK_GENERATE_REPORT"] == "true"
-
- tmp_path = "tmp/knapsack/#{report_name}"
- FileUtils.mkdir_p(tmp_path)
-
- # Use path from knapsack config in case of fallback to master_report.json
- knapsack_report_path = Knapsack.report.report_path
- logger.debug("Moving regenerated #{knapsack_report_path} to save as artifact")
- FileUtils.cp(knapsack_report_path, "#{tmp_path}/#{ENV['CI_NODE_INDEX']}.json")
- end
-
- # Merge and upload knapsack report to gcs bucket
- #
- # Fetches all files defined in glob and uses parent folder as report name
- #
- # @param [String] glob
- # @return [void]
- def upload_report(glob)
- reports = Pathname.glob(glob).each_with_object(Hash.new { |hsh, key| hsh[key] = [] }) do |report, hash|
- next unless report.extname == ".json"
-
- hash[report.parent.basename.to_s].push(report)
- end
- return logger.error("Glob '#{glob}' did not contain any valid report files!") if reports.empty?
-
- reports.each do |name, jsons|
- file = "#{name}.json"
-
- report = jsons
- .map { |json| JSON.parse(File.read(json)) }
- .reduce({}, :merge)
- .sort_by { |k, v| v } # sort report by execution time
- .to_h
- next logger.warn("Knapsack generated empty report for '#{name}', skipping upload!") if report.empty?
-
- logger.info("Uploading latest knapsack report '#{file}'")
- client.put_object(BUCKET, file, JSON.pretty_generate(report))
- rescue StandardError => e
- logger.error("Failed to upload knapsack report for '#{name}'. Error: #{e}")
- end
- end
-
- private
-
- # Logger instance
- #
- # @return [Logger]
- def logger
- @logger ||= Logger.new($stdout)
- end
-
- # GCS client
- #
- # @return [Fog::Storage::GoogleJSON]
- def client
- @client ||= Fog::Storage::Google.new(google_project: PROJECT, **gcs_credentials)
- end
-
- # Base path of knapsack report
- #
- # @return [String]
- def report_base_path
- @report_base_path ||= "knapsack"
- end
-
- # Knapsack report path
- #
- # @return [String]
- def report_path
- @report_path ||= "#{report_base_path}/#{report_file}"
- end
-
- # Knapsack report name
- #
- # @return [String]
- def report_file
- @report_file ||= "#{report_name}.json"
- end
-
- # Report name
- #
- # Infer report name from ci job name
- # Remove characters incompatible with gcs bucket naming from job names like ee:instance-parallel
- #
- # @return [String]
- def report_name
- @report_name ||= ENV["CI_JOB_NAME"].split(" ").first.tr(":", "-")
- end
-
- # GCS credentials json
- #
- # @return [Hash]
- def gcs_credentials
- json_key = ENV["QA_KNAPSACK_REPORT_GCS_CREDENTIALS"] || raise(
- "QA_KNAPSACK_REPORT_GCS_CREDENTIALS env variable is required!"
- )
- return { google_json_key_location: json_key } if File.exist?(json_key)
-
- { google_json_key_string: json_key }
- end
- end
- end
-end
diff --git a/qa/spec/README.md b/qa/spec/README.md
new file mode 100644
index 00000000000..b1fc38fb55d
--- /dev/null
+++ b/qa/spec/README.md
@@ -0,0 +1,7 @@
+# QA framework unit tests
+
+To run framework unit tests, following command can be used:
+
+```shell
+bundle exec rspec -O .rspec_internal
+```
diff --git a/qa/spec/git/repository_spec.rb b/qa/spec/git/repository_spec.rb
index 6b100f9dc16..a6a49f5907a 100644
--- a/qa/spec/git/repository_spec.rb
+++ b/qa/spec/git/repository_spec.rb
@@ -206,19 +206,19 @@ RSpec.describe QA::Git::Repository do
it_behaves_like 'command with retries' do
let(:command) { "git ls-remote #{repo_uri_with_credentials}" }
- let(:result_output) { +'packet: git< version 2' }
+ let(:result_output) { +'packet: ls-remote< version 2' }
let(:command_return) { '2' }
let(:extra_env_vars) { ["GIT_TRACE_PACKET=1"] }
end
it "reports the detected version" do
- expect(repository).to receive(:run).and_return(described_class::Result.new(any_args, 0, "packet: git< version 2"))
+ expect(repository).to receive(:run).and_return(described_class::Result.new(any_args, 0, "packet: ls-remote< version 2"))
expect(call_method).to eq('2')
end
it 'reports unknown if version is unknown' do
- expect(repository).to receive(:run).and_return(described_class::Result.new(any_args, 0, "packet: git< version -1"))
+ expect(repository).to receive(:run).and_return(described_class::Result.new(any_args, 0, "packet: ls-remote< version -1"))
expect(call_method).to eq('unknown')
end
diff --git a/qa/spec/qa_deprecation_toolkit_env.rb b/qa/spec/qa_deprecation_toolkit_env.rb
deleted file mode 100644
index 2a21961d89e..00000000000
--- a/qa/spec/qa_deprecation_toolkit_env.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'deprecation_toolkit'
-require 'deprecation_toolkit/rspec'
-require 'concurrent/utility/monotonic_time'
-require 'active_support/gem_version'
-
-module QaDeprecationToolkitEnv
- # Taken from https://github.com/jeremyevans/ruby-warning/blob/1.1.0/lib/warning.rb#L18
- def self.kwargs_warning
- %r{warning: (?:Using the last argument (?:for `.+' )?as keyword parameters is deprecated; maybe \*\* should be added to the call|Passing the keyword argument (?:for `.+' )?as the last hash parameter is deprecated|Splitting the last argument (?:for `.+' )?into positional and keyword parameters is deprecated|The called method (?:`.+' )?is defined here)\n\z}
- end
-
- def self.configure!
- # Enable ruby deprecations for keywords, it's suppressed by default in Ruby 2.7
- Warning[:deprecated] = true
-
- DeprecationToolkit::Configuration.test_runner = :rspec
- DeprecationToolkit::Configuration.deprecation_path = 'deprecations'
- DeprecationToolkit::Configuration.warnings_treated_as_deprecation = [kwargs_warning]
- end
-end
diff --git a/qa/spec/scenario/template_spec.rb b/qa/spec/scenario/template_spec.rb
index 9800f92b306..56521cc13bc 100644
--- a/qa/spec/scenario/template_spec.rb
+++ b/qa/spec/scenario/template_spec.rb
@@ -1,35 +1,49 @@
# frozen_string_literal: true
RSpec.describe QA::Scenario::Template do
- let(:feature) { spy('Runtime::Feature') }
- let(:release) { spy('Runtime::Release') }
+ let(:release) { spy('QA::Runtime::Release') } # rubocop:disable RSpec/VerifiedDoubles
+ let(:feature) { class_spy('QA::Runtime::Feature') }
+ let(:scenario) { class_spy('QA::Runtime::Scenario') }
+ let(:runner) { class_spy('QA::Specs::Runner') }
+
let(:gitlab_address) { 'https://gitlab.com/' }
+ let(:gitlab_address_from_env) { 'https://staging.gitlab.com/' }
before do
stub_const('QA::Runtime::Release', release)
stub_const('QA::Runtime::Feature', feature)
- allow(QA::Specs::Runner).to receive(:perform)
- allow(QA::Runtime::Address).to receive(:valid?).and_return(true)
+ stub_const('QA::Runtime::Scenario', scenario)
+ stub_const('QA::Specs::Runner', runner)
+
+ allow(QA::Runtime::Env).to receive(:knapsack?).and_return(false)
+ allow(QA::Runtime::Env).to receive(:gitlab_url).and_return(gitlab_address_from_env)
+
+ allow(QA::Runtime::Browser).to receive(:configure!)
+
+ allow(scenario).to receive(:attributes).and_return({ gitlab_address: gitlab_address })
+ allow(scenario).to receive(:define)
+
+ QA::Support::GitlabAddress.instance_variable_set(:@initialized, false)
end
it 'allows a feature to be enabled' do
subject.perform({ gitlab_address: gitlab_address, enable_feature: 'a-feature' })
expect(feature).to have_received(:enable).with('a-feature')
+ expect(feature).to have_received(:disable).with('a-feature')
end
it 'allows a feature to be disabled' do
- allow(QA::Runtime::Feature).to receive(:enabled?)
- .with('another-feature').and_return(true)
+ allow(QA::Runtime::Feature).to receive(:enabled?).with('another-feature').and_return(true)
subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' })
expect(feature).to have_received(:disable).with('another-feature')
+ expect(feature).to have_received(:enable).with('another-feature')
end
it 'does not disable a feature if already disabled' do
- allow(QA::Runtime::Feature).to receive(:enabled?)
- .with('another-feature').and_return(false)
+ allow(QA::Runtime::Feature).to receive(:enabled?).with('another-feature').and_return(false)
subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' })
@@ -39,7 +53,8 @@ RSpec.describe QA::Scenario::Template do
it 'ensures an enabled feature is disabled afterwards' do
allow(QA::Specs::Runner).to receive(:perform).and_raise('failed test')
- expect { subject.perform({ gitlab_address: gitlab_address, enable_feature: 'a-feature' }) }.to raise_error('failed test')
+ expect { subject.perform({ gitlab_address: gitlab_address, enable_feature: 'a-feature' }) }
+ .to raise_error('failed test')
expect(feature).to have_received(:enable).with('a-feature')
expect(feature).to have_received(:disable).with('a-feature')
@@ -47,11 +62,10 @@ RSpec.describe QA::Scenario::Template do
it 'ensures a disabled feature is enabled afterwards' do
allow(QA::Specs::Runner).to receive(:perform).and_raise('failed test')
+ allow(QA::Runtime::Feature).to receive(:enabled?).with('another-feature').and_return(true)
- allow(QA::Runtime::Feature).to receive(:enabled?)
- .with('another-feature').and_return(true)
-
- expect { subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' }) }.to raise_error('failed test')
+ expect { subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' }) }
+ .to raise_error('failed test')
expect(feature).to have_received(:disable).with('another-feature')
expect(feature).to have_received(:enable).with('another-feature')
@@ -59,25 +73,35 @@ RSpec.describe QA::Scenario::Template do
it 'ensures a disabled feature is not enabled afterwards if it was disabled earlier' do
allow(QA::Specs::Runner).to receive(:perform).and_raise('failed test')
+ allow(QA::Runtime::Feature).to receive(:enabled?).with('another-feature').and_return(false)
- allow(QA::Runtime::Feature).to receive(:enabled?)
- .with('another-feature').and_return(false)
-
- expect { subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' }) }.to raise_error('failed test')
+ expect { subject.perform({ gitlab_address: gitlab_address, disable_feature: 'another-feature' }) }
+ .to raise_error('failed test')
expect(feature).not_to have_received(:disable).with('another-feature')
expect(feature).not_to have_received(:enable).with('another-feature')
end
- it 'defines an about address by default' do
- subject.perform( { gitlab_address: gitlab_address })
+ it 'defines gitlab address from positional argument' do
+ allow(scenario).to receive(:attributes).and_return({})
+
+ subject.perform({}, gitlab_address)
+
+ expect(scenario).to have_received(:define).with(:gitlab_address, gitlab_address)
+ expect(scenario).to have_received(:define).with(:about_address, 'https://about.gitlab.com/')
+ end
- expect(QA::Runtime::Scenario.gitlab_address).to eq(gitlab_address)
- expect(QA::Runtime::Scenario.about_address).to eq('https://about.gitlab.com/')
+ it "defaults to gitlab address from env" do
+ allow(scenario).to receive(:attributes).and_return({})
+
+ subject.perform({})
+
+ expect(scenario).to have_received(:define).with(:gitlab_address, gitlab_address_from_env)
+ end
- subject.perform({ gitlab_address: 'http://gitlab-abc.test/' })
+ it 'defines klass attribute' do
+ subject.perform({ gitlab_address: gitlab_address })
- expect(QA::Runtime::Scenario.gitlab_address).to eq('http://gitlab-abc.test/')
- expect(QA::Runtime::Scenario.about_address).to eq('http://about.gitlab-abc.test/')
+ expect(scenario).to have_received(:define).with(:klass, 'QA::Scenario::Template')
end
end
diff --git a/qa/spec/scenario/test/integration/mattermost_spec.rb b/qa/spec/scenario/test/integration/mattermost_spec.rb
index 9532ec35b95..4cdd0c0cb0e 100644
--- a/qa/spec/scenario/test/integration/mattermost_spec.rb
+++ b/qa/spec/scenario/test/integration/mattermost_spec.rb
@@ -3,24 +3,10 @@
RSpec.describe QA::Scenario::Test::Integration::Mattermost do
describe '#perform' do
it_behaves_like 'a QA scenario class' do
- let(:args) { %w[gitlab_address mattermost_address] }
- let(:args) do
- {
- gitlab_address: 'http://gitlab_address',
- mattermost_address: 'http://mattermost_address'
- }
- end
-
+ let(:args) { { gitlab_address: 'http://gitlab_address' } }
let(:named_options) { %w[--address http://gitlab_address --mattermost-address http://mattermost_address] }
let(:tags) { [:mattermost] }
- let(:options) { ['path1']}
-
- it 'requires a GitHub access token' do
- subject.perform(args)
-
- expect(attributes).to have_received(:define)
- .with(:mattermost_address, 'http://mattermost_address')
- end
+ let(:options) { ['path1'] }
end
end
end
diff --git a/qa/spec/scenario_shared_examples.rb b/qa/spec/scenario_shared_examples.rb
new file mode 100644
index 00000000000..944e309c4cb
--- /dev/null
+++ b/qa/spec/scenario_shared_examples.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+module QA
+ RSpec.shared_examples 'a QA scenario class' do
+ let(:scenario) { class_spy('Runtime::Scenario') }
+ let(:runner) { class_spy('Specs::Runner') }
+ let(:release) { class_spy('Runtime::Release') }
+ let(:feature) { class_spy('Runtime::Feature') }
+
+ let(:args) { { gitlab_address: 'http://gitlab_address' } }
+ let(:named_options) { %w[--address http://gitlab_address] }
+ let(:tags) { [] }
+ let(:options) { %w[path1 path2] }
+
+ before do
+ stub_const('QA::Specs::Runner', runner)
+ stub_const('QA::Runtime::Release', release)
+ stub_const('QA::Runtime::Scenario', scenario)
+ stub_const('QA::Runtime::Feature', feature)
+
+ allow(QA::Runtime::Browser).to receive(:configure!)
+
+ allow(scenario).to receive(:attributes).and_return(args)
+ allow(runner).to receive(:perform).and_yield(runner)
+ end
+
+ it 'responds to perform' do
+ expect(subject).to respond_to(:perform)
+ end
+
+ it 'performs before hooks only once' do
+ subject.perform(args)
+
+ expect(release).to have_received(:perform_before_hooks).once
+ end
+
+ it 'sets tags on runner' do
+ subject.perform(args)
+
+ expect(runner).to have_received(:tags=).with(tags)
+ end
+
+ context 'with RSpec options' do
+ it 'sets options on runner' do
+ subject.perform(args, *options)
+
+ expect(runner).to have_received(:options=).with(options)
+ end
+ end
+
+ context 'with named command-line options' do
+ it 'converts options to attributes' do
+ described_class.launch!(named_options)
+
+ args do |k, v|
+ expect(scenario).to have_received(:define).with(k, v)
+ end
+ end
+
+ it 'raises an error if the option is invalid' do
+ expect { described_class.launch!(['--foo']) }.to raise_error(OptionParser::InvalidOption)
+ end
+
+ it 'passes on options after --' do
+ expect(described_class).to receive(:perform).with(args, *%w[--tag quarantine])
+
+ described_class.launch!(named_options.push(*%w[-- --tag quarantine]))
+ end
+ end
+ end
+end
diff --git a/qa/spec/spec_helper.rb b/qa/spec/spec_helper.rb
index b81c41bb79c..95970800a4e 100644
--- a/qa/spec/spec_helper.rb
+++ b/qa/spec/spec_helper.rb
@@ -2,134 +2,4 @@
require_relative '../qa'
-require_relative 'qa_deprecation_toolkit_env'
-QaDeprecationToolkitEnv.configure!
-
-Knapsack::Adapters::RSpecAdapter.bind if QA::Runtime::Env.knapsack?
-
-QA::Runtime::Browser.configure! unless QA::Runtime::Env.dry_run
-QA::Runtime::AllureReport.configure!
-QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
-
-Dir[::File.join(__dir__, "support/shared_examples/*.rb")].sort.each { |f| require f }
-Dir[::File.join(__dir__, "support/shared_contexts/*.rb")].sort.each { |f| require f }
-
-RSpec.configure do |config|
- config.include QA::Support::Matchers::EventuallyMatcher
- config.include QA::Support::Matchers::HaveMatcher
-
- config.add_formatter QA::Support::Formatters::ContextFormatter
- config.add_formatter QA::Support::Formatters::QuarantineFormatter
- config.add_formatter QA::Support::Formatters::FeatureFlagFormatter
- config.add_formatter QA::Support::Formatters::TestStatsFormatter if QA::Runtime::Env.export_metrics?
-
- config.before(:suite) do |suite|
- QA::Resource::ReusableCollection.register_resource_classes do |collection|
- QA::Resource::ReusableProject.register(collection)
- QA::Resource::ReusableGroup.register(collection)
- end
- end
-
- config.prepend_before do |example|
- QA::Runtime::Logger.info("Starting test: #{Rainbow(example.full_description).bright}")
- QA::Runtime::Example.current = example
-
- # Reset fabrication counters tracked in resource base
- Thread.current[:api_fabrication] = 0
- Thread.current[:browser_ui_fabrication] = 0
- end
-
- config.after do
- # If a .netrc file was created during the test, delete it so that subsequent tests don't try to use the same logins
- QA::Git::Repository.new.delete_netrc
- end
-
- # Add fabrication time to spec metadata
- config.append_after do |example|
- example.metadata[:api_fabrication] = Thread.current[:api_fabrication]
- example.metadata[:browser_ui_fabrication] = Thread.current[:browser_ui_fabrication]
- end
-
- config.after(:context) do
- if !QA::Runtime::Browser.blank_page? && QA::Page::Main::Menu.perform(&:signed_in?)
- QA::Page::Main::Menu.perform(&:sign_out)
- raise(
- <<~ERROR
- The test left the browser signed in.
-
- Usually, Capybara prevents this from happening but some things can
- interfere. For example, if it has an `after(:context)` block that logs
- in, the browser will stay logged in and this will cause the next test
- to fail.
-
- Please make sure the test does not leave the browser signed in.
- ERROR
- )
- end
- end
-
- config.after(:suite) do |suite|
- # Write all test created resources to JSON file
- QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
-
- # If requested, confirm that resources were used appropriately (e.g., not left with changes that interfere with
- # further reuse)
- QA::Resource::ReusableCollection.validate_resource_reuse if QA::Runtime::Env.validate_resource_reuse?
-
- # If any tests failed, leave the resources behind to help troubleshoot, otherwise remove them.
- # Do not remove the shared resource on live environments
- begin
- next if suite.reporter.failed_examples.present?
- next unless QA::Runtime::Scenario.attributes.include?(:gitlab_address)
- next if QA::Runtime::Env.running_on_dot_com?
-
- QA::Resource::ReusableCollection.remove_all_via_api!
- rescue QA::Resource::Errors::InternalServerError => e
- # Temporarily prevent this error from failing jobs while the cause is investigated
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/354387
- QA::Runtime::Logger.debug(e.message)
- end
- end
-
- config.append_after(:suite) do
- QA::Tools::KnapsackReport.move_regenerated_report if QA::Runtime::Env.knapsack?
- end
-
- config.expect_with :rspec do |expectations|
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
- end
-
- config.mock_with :rspec do |mocks|
- mocks.verify_partial_doubles = true
- end
-
- config.shared_context_metadata_behavior = :apply_to_host_groups
- config.disable_monkey_patching!
- config.expose_dsl_globally = true
- config.profile_examples = 10
- config.order = :random
- Kernel.srand config.seed
-
- # show retry status in spec process
- config.verbose_retry = true
-
- # show exception that triggers a retry if verbose_retry is set to true
- config.display_try_failure_messages = true
-
- # This option allows to use shorthand aliases for adding :focus metadata - fit, fdescribe and fcontext
- config.filter_run_when_matching :focus
-
- if ENV['CI'] && !QA::Runtime::Env.disable_rspec_retry?
- non_quarantine_retries = QA::Runtime::Env.ci_project_name =~ /staging|canary|production/ ? 3 : 2
- config.around do |example|
- quarantine = example.metadata[:quarantine]
- different_quarantine_context = QA::Specs::Helpers::Quarantine.quarantined_different_context?(quarantine)
- focused_quarantine = QA::Specs::Helpers::Quarantine.filters.key?(:quarantine)
-
- # Do not disable retry when spec is quarantined but on different environment
- next example.run_with_retry(retry: non_quarantine_retries) if different_quarantine_context && !focused_quarantine
-
- example.run_with_retry(retry: quarantine ? 1 : non_quarantine_retries)
- end
- end
-end
+require_relative 'scenario_shared_examples'
diff --git a/qa/spec/specs/scenario_shared_examples.rb b/qa/spec/specs/scenario_shared_examples.rb
deleted file mode 100644
index 7d806d50d21..00000000000
--- a/qa/spec/specs/scenario_shared_examples.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.shared_examples 'a QA scenario class' do
- let(:attributes) { class_spy('Runtime::Scenario') }
- let(:runner) { class_spy('Specs::Runner') }
- let(:release) { class_spy('Runtime::Release') }
- let(:feature) { class_spy('Runtime::Feature') }
-
- let(:args) { { gitlab_address: 'http://gitlab_address' } }
- let(:named_options) { %w[--address http://gitlab_address] }
- let(:tags) { [] }
- let(:options) { %w[path1 path2] }
-
- before do
- stub_const('QA::Specs::Runner', runner)
- stub_const('QA::Runtime::Release', release)
- stub_const('QA::Runtime::Scenario', attributes)
- stub_const('QA::Runtime::Feature', feature)
-
- allow(attributes).to receive(:gitlab_address).and_return(args[:gitlab_address])
- allow(runner).to receive(:perform).and_yield(runner)
- allow(QA::Runtime::Address).to receive(:valid?).and_return(true)
- end
-
- it 'responds to perform' do
- expect(subject).to respond_to(:perform)
- end
-
- it 'sets an address of the subject' do
- subject.perform(args)
-
- expect(attributes).to have_received(:define).with(:gitlab_address, 'http://gitlab_address').at_least(:once)
- end
-
- it 'performs before hooks only once' do
- subject.perform(args)
-
- expect(release).to have_received(:perform_before_hooks).once
- end
-
- it 'sets tags on runner' do
- subject.perform(args)
-
- expect(runner).to have_received(:tags=).with(tags)
- end
-
- context 'with RSpec options' do
- it 'sets options on runner' do
- subject.perform(args, *options)
-
- expect(runner).to have_received(:options=).with(options)
- end
- end
-
- context 'with named command-line options' do
- it 'converts options to attributes' do
- described_class.launch!(named_options)
-
- args do |k, v|
- expect(attributes).to have_received(:define).with(k, v)
- end
- end
-
- it 'raises an error if the option is invalid' do
- expect { described_class.launch!(['--foo']) }.to raise_error(OptionParser::InvalidOption)
- end
-
- it 'passes on options after --' do
- expect(described_class).to receive(:perform).with(attributes, *%w[--tag quarantine])
-
- described_class.launch!(named_options.push(*%w[-- --tag quarantine]))
- end
- end
- end
-end
diff --git a/qa/spec/specs/spec_helper.rb b/qa/spec/specs/spec_helper.rb
deleted file mode 100644
index e4514c6c64f..00000000000
--- a/qa/spec/specs/spec_helper.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-# frozen_string_literal: true
-
-require_relative '../../qa'
-
-require_relative 'scenario_shared_examples'
diff --git a/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb b/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb
deleted file mode 100644
index 1dc8870d4d9..00000000000
--- a/qa/spec/support/shared_contexts/variable_inheritance_shared_context.rb
+++ /dev/null
@@ -1,150 +0,0 @@
-# frozen_string_literal: true
-
-module QA
- RSpec.shared_context 'variable inheritance test prep' do
- let(:random_string) { Faker::Alphanumeric.alphanumeric(number: 8) }
-
- let(:group) do
- Resource::Group.fabricate_via_api! do |group|
- group.path = "group-for-variable-inheritance-#{random_string}"
- end
- end
-
- let(:upstream_project) do
- Resource::Project.fabricate_via_api! do |project|
- project.group = group
- project.name = 'upstream-variable-inheritance'
- project.description = 'Project for pipeline with variable defined via UI - Upstream'
- end
- end
-
- let(:downstream1_project) do
- Resource::Project.fabricate_via_api! do |project|
- project.group = group
- project.name = 'downstream1-variable-inheritance'
- project.description = 'Project for pipeline with variable defined via UI - Downstream'
- end
- end
-
- let(:downstream2_project) do
- Resource::Project.fabricate_via_api! do |project|
- project.group = group
- project.name = 'downstream2-variable-inheritance'
- project.description = 'Project for pipeline with variable defined via UI - Downstream'
- end
- end
-
- let!(:runner) do
- Resource::Runner.fabricate! do |runner|
- runner.token = group.reload!.runners_token
- runner.name = random_string
- runner.tags = [random_string]
- end
- end
-
- before do
- Runtime::Feature.enable(:ci_trigger_forward_variables)
- Flow::Login.sign_in
- end
-
- after do
- runner.remove_via_api!
- Runtime::Feature.disable(:ci_trigger_forward_variables)
- end
-
- def start_pipeline_with_variable
- upstream_project.visit!
- Flow::Pipeline.wait_for_latest_pipeline
- Page::Project::Pipeline::Index.perform(&:click_run_pipeline_button)
- Page::Project::Pipeline::New.perform do |new|
- new.add_variable('TEST_VAR', 'This is great!')
- new.click_run_pipeline_button
- end
- end
-
- def add_ci_file(project, files)
- Resource::Repository::Commit.fabricate_via_api! do |commit|
- commit.project = project
- commit.commit_message = 'Add CI config file'
- commit.add_files(files)
- end
- end
-
- def visit_job_page(pipeline_title, job_name)
- Page::Project::Pipeline::Show.perform do |show|
- show.expand_child_pipeline(title: pipeline_title)
- show.click_job(job_name)
- end
- end
-
- def verify_job_log_shows_variable_value
- Page::Project::Job::Show.perform do |show|
- show.wait_until { show.successful? }
- expect(show.output).to have_content('This is great!')
- end
- end
-
- def verify_job_log_does_not_show_variable_value
- Page::Project::Job::Show.perform do |show|
- show.wait_until { show.successful? }
- expect(show.output).to have_no_content('This is great!')
- end
- end
-
- def upstream_child1_ci_file
- {
- file_path: '.child1-ci.yml',
- content: <<~YAML
- child1_job:
- stage: test
- tags: ["#{random_string}"]
- script:
- - echo $TEST_VAR
- - echo Done!
- YAML
- }
- end
-
- def upstream_child2_ci_file
- {
- file_path: '.child2-ci.yml',
- content: <<~YAML
- child2_job:
- stage: test
- tags: ["#{random_string}"]
- script:
- - echo $TEST_VAR
- - echo Done!
- YAML
- }
- end
-
- def downstream1_ci_file
- {
- file_path: '.gitlab-ci.yml',
- content: <<~YAML
- downstream1_job:
- stage: deploy
- tags: ["#{random_string}"]
- script:
- - echo $TEST_VAR
- - echo Done!
- YAML
- }
- end
-
- def downstream2_ci_file
- {
- file_path: '.gitlab-ci.yml',
- content: <<~YAML
- downstream2_job:
- stage: deploy
- tags: ["#{random_string}"]
- script:
- - echo $TEST_VAR
- - echo Done!
- YAML
- }
- end
- end
-end
diff --git a/qa/tasks/knapsack.rake b/qa/tasks/knapsack.rake
index ce4a1679bd1..cfc11d0ba24 100644
--- a/qa/tasks/knapsack.rake
+++ b/qa/tasks/knapsack.rake
@@ -1,20 +1,34 @@
# frozen_string_literal: true
-# rubocop:disable Rails/RakeEnvironment
+# rubocop:disable Rails/RakeEnvironment
namespace :knapsack do
+ desc "Run tests with knapsack runner"
+ task :rspec, [:rspec_args] do |_, args|
+ rspec_args = args[:rspec_args]&.split(' ') || []
+
+ unless QA::Runtime::Env.knapsack?
+ QA::Runtime::Logger.info("This environment is not compatible with parallel knapsack execution!")
+ QA::Runtime::Logger.info("Falling back to standard execution")
+
+ exit RSpec::Core::Runner.run([*rspec_args, "qa/specs/features"])
+ end
+
+ exit QA::Specs::KnapsackRunner.run(rspec_args)
+ end
+
desc "Download latest knapsack report"
task :download do
- QA::Tools::KnapsackReport.download
+ QA::Support::KnapsackReport.download_report
end
desc "Merge and upload knapsack report"
task :upload, [:glob] do |_task, args|
- QA::Tools::KnapsackReport.upload_report(args[:glob])
+ QA::Support::KnapsackReport.upload_report(args[:glob])
end
desc "Report long running spec files"
task :notify_long_running_specs do
- QA::Tools::LongRunningSpecReporter.execute
+ QA::Support::LongRunningSpecReporter.execute
end
end
# rubocop:enable Rails/RakeEnvironment
diff --git a/qa/tasks/vulnerabilities.rake b/qa/tasks/vulnerabilities.rake
new file mode 100644
index 00000000000..79d6b8683e0
--- /dev/null
+++ b/qa/tasks/vulnerabilities.rake
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+# rubocop:disable Rails/RakeEnvironment
+
+# How to run this rake task?
+# GITLAB_QA_ACCESS_TOKEN=<access_token> GITLAB_URL="<Gitlab address>" bundle exec rake
+# vulnerabilities:setup\[<Project_id>,<Vulnerability_count>\] --trace
+
+namespace :vulnerabilities do
+ desc "Set up test data for vulnerability report"
+ task :setup, [:project_id, :vulnerability_count] do |t, args|
+ QA::Runtime::Browser.configure!
+ QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
+
+ if ENV['GITLAB_URL'].nil?
+ puts 'ERROR: Exiting rake, Gitlab address not specified as GITLAB_URL environment variable'
+ exit 1
+ end
+
+ if ENV['GITLAB_QA_ACCESS_TOKEN'].nil?
+ puts 'ERROR: Exiting rake, API access token not provided as GITLAB_QA_ACCESS_TOKEN environment variable'
+ exit 1
+ end
+
+ QA::Runtime::Scenario.define(:gitlab_address, ENV['GITLAB_URL'])
+ vuln = QA::EE::Resource::VulnerabilityReport.new
+ vuln.create_vuln_report(args[:project_id], args[:vulnerability_count].to_i)
+ end
+end
+# rubocop:enable Rails/RakeEnvironment
diff --git a/rubocop/cop/database/multiple_databases.rb b/rubocop/cop/database/multiple_databases.rb
index f20348d9d1f..1ac9bb4473b 100644
--- a/rubocop/cop/database/multiple_databases.rb
+++ b/rubocop/cop/database/multiple_databases.rb
@@ -19,10 +19,11 @@ module RuboCop
ALLOWED_METHODS = %i[
no_touching
+ configurations
].freeze
def_node_matcher :active_record_base_method_is_used?, <<~PATTERN
- (send (const (const nil? :ActiveRecord) :Base) $_)
+ (send (const (const _ :ActiveRecord) :Base) $_)
PATTERN
def on_send(node)
diff --git a/rubocop/cop/gitlab/avoid_feature_get.rb b/rubocop/cop/gitlab/avoid_feature_get.rb
index e36e0b020c0..1bce89268d9 100644
--- a/rubocop/cop/gitlab/avoid_feature_get.rb
+++ b/rubocop/cop/gitlab/avoid_feature_get.rb
@@ -5,8 +5,8 @@ module RuboCop
module Gitlab
# Cop that blacklists the use of `Feature.get`.
class AvoidFeatureGet < RuboCop::Cop::Cop
- MSG = 'Use `Feature.enable/disable` methods instead of `Feature.get`. ' \
- 'See doc/development/testing_guide/best_practices.md#feature-flags-in-tests for more information.'
+ MSG = 'Use `stub_feature_flags` method instead of `Feature.get`. ' \
+ 'See doc/development/feature_flags/index.md#feature-flags-in-tests for more information.'
def_node_matcher :feature_get?, <<~PATTERN
(send (const nil? :Feature) :get ...)
diff --git a/rubocop/cop/gitlab/mark_used_feature_flags.rb b/rubocop/cop/gitlab/mark_used_feature_flags.rb
index 290e62436e2..0bebd7901f3 100644
--- a/rubocop/cop/gitlab/mark_used_feature_flags.rb
+++ b/rubocop/cop/gitlab/mark_used_feature_flags.rb
@@ -43,13 +43,6 @@ module RuboCop
File.expand_path("../../../lib/gitlab/usage_data_counters/known_events/*.yml", __dir__)
].freeze
- DYNAMIC_FEATURE_FLAGS = [
- :usage_data_static_site_editor_commits, # https://gitlab.com/gitlab-org/gitlab/-/issues/284082
- :usage_data_static_site_editor_merge_requests, # https://gitlab.com/gitlab-org/gitlab/-/issues/284083
- :usage_data_users_clicking_license_testing_visiting_external_website, # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77866
- :usage_data_users_visiting_testing_license_compliance_full_report # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77866
- ].freeze
-
class << self
# We track feature flags in `on_new_investigation` only once per
# rubocop whole run instead once per file.
@@ -65,7 +58,6 @@ module RuboCop
self.class.feature_flags_already_tracked = true
- track_dynamic_feature_flags!
track_usage_data_counters_known_events!
end
@@ -231,12 +223,6 @@ module RuboCop
# Marking all event's feature flags as used as Gitlab::UsageDataCounters::HLLRedisCounter.track_event{,context}
# is mostly used with dynamic event name.
- def track_dynamic_feature_flags!
- DYNAMIC_FEATURE_FLAGS.each(&method(:save_used_feature_flag))
- end
-
- # Marking all event's feature flags as used as Gitlab::UsageDataCounters::HLLRedisCounter.track_event{,context}
- # is mostly used with dynamic event name.
def track_usage_data_counters_known_events!
usage_data_counters_known_event_feature_flags.each(&method(:save_used_feature_flag))
end
diff --git a/rubocop/cop/gitlab/namespaced_class.rb b/rubocop/cop/gitlab/namespaced_class.rb
index 1f1fd280922..914cc8720b9 100644
--- a/rubocop/cop/gitlab/namespaced_class.rb
+++ b/rubocop/cop/gitlab/namespaced_class.rb
@@ -5,33 +5,76 @@ module RuboCop
module Gitlab
# Cop that enforces use of namespaced classes in order to better identify
# high level domains within the codebase.
-
+ #
# @example
# # bad
# class MyClass
# end
#
+ # module Gitlab
+ # class MyClass
+ # end
+ # end
+ #
+ # class Gitlab::MyClass
+ # end
+ #
# # good
# module MyDomain
# class MyClass
# end
# end
-
+ #
+ # module Gitlab
+ # module MyDomain
+ # class MyClass
+ # end
+ # end
+ # end
+ #
+ # class Gitlab::MyDomain::MyClass
+ # end
class NamespacedClass < RuboCop::Cop::Cop
MSG = 'Classes must be declared inside a module indicating a product domain namespace. For more info: https://gitlab.com/gitlab-org/gitlab/-/issues/212156'
- def_node_matcher :compact_namespaced_class?, <<~PATTERN
- (class (const (const ...) ...) ...)
- PATTERN
+ # These namespaces are considered top-level semantically.
+ # Note: Nested namespace like Foo::Bar are also supported.
+ PSEUDO_TOPLEVEL = %w[Gitlab]
+ .map { _1.split('::') }.freeze
def on_module(node)
- @namespaced = true
+ add_potential_domain_namespace(node)
end
def on_class(node)
- return if @namespaced
+ # Add potential namespaces from compact definitions like `class Foo::Bar`.
+ # Remove class name because it's not a domain namespace.
+ add_potential_domain_namespace(node) { _1.pop }
+
+ add_offense(node) if domain_namespaces.none?
+ end
+
+ private
+
+ def domain_namespaces
+ @domain_namespaces ||= []
+ end
+
+ def add_potential_domain_namespace(node)
+ return if domain_namespaces.any?
+
+ identifiers = identifiers_for(node)
+ yield(identifiers) if block_given?
+
+ PSEUDO_TOPLEVEL.each do |namespaces|
+ identifiers.shift(namespaces.size) if namespaces == identifiers.first(namespaces.size)
+ end
+
+ domain_namespaces.concat(identifiers)
+ end
- add_offense(node) unless compact_namespaced_class?(node)
+ def identifiers_for(node)
+ node.identifier.source.sub(/^::/, '').split('::')
end
end
end
diff --git a/rubocop/cop/migration/background_migration_base_class.rb b/rubocop/cop/migration/background_migration_base_class.rb
new file mode 100644
index 00000000000..50cbe3a69c3
--- /dev/null
+++ b/rubocop/cop/migration/background_migration_base_class.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Migration
+ class BackgroundMigrationBaseClass < RuboCop::Cop::Cop
+ MSG = 'Batched background migration jobs should inherit from Gitlab::BackgroundMigration::BatchedMigrationJob'
+
+ def_node_search :top_level_module?, <<~PATTERN
+ (module (const nil? :Gitlab) (module (const nil? :BackgroundMigration) ...))
+ PATTERN
+
+ def_node_matcher :matching_parent_namespace?, <<~PATTERN
+ {nil? (const (const {cbase nil?} :Gitlab) :BackgroundMigration)}
+ PATTERN
+
+ def_node_search :inherits_batched_migration_job?, <<~PATTERN
+ (class _ (const #matching_parent_namespace? :BatchedMigrationJob) ...)
+ PATTERN
+
+ def on_module(module_node)
+ return unless top_level_module?(module_node)
+
+ top_level_class_node = module_node.each_descendant(:class).first
+
+ return if top_level_class_node.nil? || inherits_batched_migration_job?(top_level_class_node)
+
+ add_offense(top_level_class_node, location: :expression)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/background_migration_record.rb b/rubocop/cop/migration/background_migration_record.rb
new file mode 100644
index 00000000000..2ee6b9f7b42
--- /dev/null
+++ b/rubocop/cop/migration/background_migration_record.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ class BackgroundMigrationRecord < RuboCop::Cop::Cop
+ include MigrationHelpers
+
+ MSG = <<~MSG
+ Don't use or inherit from ActiveRecord::Base.
+ Use ::ApplicationRecord or ::Ci::ApplicationRecord to ensure the correct database is used.
+ See https://docs.gitlab.com/ee/development/database/batched_background_migrations.html#accessing-data-for-multiple-databases.
+ MSG
+
+ def_node_matcher :inherits_from_active_record_base?, <<~PATTERN
+ (class _ (const (const _ :ActiveRecord) :Base) _)
+ PATTERN
+
+ def_node_search :class_new_active_record_base?, <<~PATTERN
+ (send (const _ :Class) :new (const (const _ :ActiveRecord) :Base) ...)
+ PATTERN
+
+ def on_class(node)
+ return unless in_background_migration?(node)
+ return unless inherits_from_active_record_base?(node)
+
+ add_offense(node, location: :expression)
+ end
+
+ def on_send(node)
+ return unless in_background_migration?(node)
+ return unless class_new_active_record_base?(node)
+
+ add_offense(node, location: :expression)
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/cop/migration/hash_index.rb b/rubocop/cop/migration/hash_index.rb
deleted file mode 100644
index 8becef891af..00000000000
--- a/rubocop/cop/migration/hash_index.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-require 'set'
-require_relative '../../migration_helpers'
-
-module RuboCop
- module Cop
- module Migration
- # Cop that prevents the use of hash indexes in database migrations
- class HashIndex < RuboCop::Cop::Cop
- include MigrationHelpers
-
- MSG = 'hash indexes should be avoided at all costs since they are not ' \
- 'recorded in the PostgreSQL WAL, you should use a btree index instead'
-
- NAMES = Set.new([:add_index, :index, :add_concurrent_index]).freeze
-
- def on_send(node)
- return unless in_migration?(node)
-
- name = node.children[1]
-
- return unless NAMES.include?(name)
-
- opts = node.children.last
-
- return unless opts && opts.type == :hash
-
- opts.each_node(:pair) do |pair|
- next unless hash_key_type(pair) == :sym &&
- hash_key_name(pair) == :using
-
- if hash_key_value(pair).to_s == 'hash'
- add_offense(pair, location: :expression)
- end
- end
- end
-
- def hash_key_type(pair)
- pair.children[0].type
- end
-
- def hash_key_name(pair)
- pair.children[0].children[0]
- end
-
- def hash_key_value(pair)
- pair.children[1].children[0]
- end
- end
- end
- end
-end
diff --git a/rubocop/cop/migration/migration_record.rb b/rubocop/cop/migration/migration_record.rb
new file mode 100644
index 00000000000..bb81b3cbaf1
--- /dev/null
+++ b/rubocop/cop/migration/migration_record.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require_relative '../../migration_helpers'
+
+module RuboCop
+ module Cop
+ module Migration
+ class MigrationRecord < RuboCop::Cop::Cop
+ include MigrationHelpers
+
+ ENFORCED_SINCE = 2022_04_26_00_00_00
+
+ MSG = <<~MSG
+ Don't inherit from ActiveRecord::Base but use MigrationRecord instead.
+ See https://docs.gitlab.com/ee/development/database/migrations_for_multiple_databases.html#example-usage-of-activerecord-classes.
+ MSG
+
+ def_node_search :inherits_from_active_record_base?, <<~PATTERN
+ (class _ (const (const _ :ActiveRecord) :Base) _)
+ PATTERN
+
+ def on_class(node)
+ return unless relevant_migration?(node)
+ return unless inherits_from_active_record_base?(node)
+
+ add_offense(node, location: :expression)
+ end
+
+ private
+
+ def relevant_migration?(node)
+ in_migration?(node) && version(node) >= ENFORCED_SINCE
+ end
+ end
+ end
+ end
+end
diff --git a/rubocop/migration_helpers.rb b/rubocop/migration_helpers.rb
index 63b3766e126..f14f4d33709 100644
--- a/rubocop/migration_helpers.rb
+++ b/rubocop/migration_helpers.rb
@@ -32,6 +32,11 @@ module RuboCop
in_deployment_migration?(node) || in_post_deployment_migration?(node)
end
+ def in_background_migration?(node)
+ filepath(node).include?('/lib/gitlab/background_migration/') ||
+ filepath(node).include?('/ee/lib/ee/gitlab/background_migration/')
+ end
+
def in_deployment_migration?(node)
dirname(node).end_with?('db/migrate', 'db/geo/migrate')
end
@@ -56,8 +61,12 @@ module RuboCop
private
+ def filepath(node)
+ node.location.expression.source_buffer.name
+ end
+
def dirname(node)
- File.dirname(node.location.expression.source_buffer.name)
+ File.dirname(filepath(node))
end
def rubocop_migrations_config
diff --git a/scripts/changed-feature-flags b/scripts/changed-feature-flags
index 3a4f18bd78f..86214e86788 100755
--- a/scripts/changed-feature-flags
+++ b/scripts/changed-feature-flags
@@ -3,10 +3,12 @@
require 'yaml'
require 'optparse'
+require 'pathname'
require_relative 'api/default_options'
# This script returns the desired feature flag state as a comma-separated string for the feature flags in the specified files.
-# Each desired feature flag state is specified as 'feature-flag=state'.
+# Each desired feature flag state is specified as 'feature-flag=state'. This allows us to run package-and-qa with the
+# feature flag set to the desired state.
#
# For example, if the specified files included `config/feature_flags/development/ci_yaml_limit_size.yml` and the desired
# state as specified by the second argument was enabled, the value returned would be `ci_yaml_limit_size=enabled`
@@ -15,31 +17,84 @@ class GetFeatureFlagsFromFiles
def initialize(options)
@files = options.delete(:files)
@state = options.delete(:state)
+
+ abort("ERROR: Please specify the directory containing MR diffs.") if @files.to_s.empty?
end
+ # Gets feature flags from definition files or diffs of deleted defition files
+ #
+ # @return [String] a comma-separated list of feature flags and their desired state
def extracted_flags
- files.each_with_object([]) do |file_path, all|
- next unless file_path =~ %r{/feature_flags/(development|ops)/.*\.yml}
- next unless File.exist?(file_path)
+ flags_list = diffs_dir.glob('**/*').each_with_object([]) do |file_path, flags|
+ ff_yaml = ff_yaml_for_file(file_path)
+ next if ff_yaml.nil?
+ break [] if ff_yaml.empty?
+
+ flags << ff_yaml['name']
+ end
+ flags_list = flags_list.map { |flag| "#{flag}=#{state}" } unless state.to_s.empty?
+ flags_list.join(',')
+ end
- ff_yaml = YAML.safe_load(File.read(file_path))
- ff_to_add = "#{ff_yaml['name']}"
- ff_to_add += "=#{state}" unless state.to_s.empty?
+ # Loads the YAML feature flag definition based on a diff of the definition file. The definition is loaded from the
+ # definition file itself, or from a diff of the deleted definition file.
+ #
+ # @param [Pathname] path the path to the diff
+ # @return [Hash] a hash containing the YAML data for the feature flag definition
+ def ff_yaml_for_file(path)
+ return unless File.expand_path(path).to_s =~ %r{/feature_flags/(development|ops)/.*\.yml}
- all << ff_to_add
- end.join(',')
+ if path.to_s.end_with?('yml.deleted.diff')
+ # Ignore deleted feature flag definitions if we want to enable/disable existing flags.
+ return if state != 'deleted'
+
+ yaml_from_deleted_diff(path)
+ else
+ # If we want deleted definition files but find one that wasn't deleted, we return immediately to
+ # because non-deleted flags are tested in separate jobs from deleted flags, so we don't need to run
+ # a job with just deleted flags.
+ return [] if state == 'deleted'
+
+ yaml_from_file(path, diffs_dir)
+ end
end
private
attr_reader :files, :state
+
+ # The absolute path to the directory of diffs
+ #
+ # @return [String]
+ def diffs_dir
+ @diffs_dir ||= Pathname.new(files).expand_path
+ end
+
+ # Loads the YAML feature flag definition from a file corresponding to a diff of the definition file.
+ #
+ # @param [Pathname] file_path the path to the diff
+ # @param [Pathname] diffs_dir the path to the diffs directory
+ # @return [Hash] a hash containing the YAML data from the feature flag definition file corresponding to the diff
+ def yaml_from_file(file_path, diffs_dir)
+ real_file_path = File.join(Dir.pwd, file_path.to_s.delete_prefix(diffs_dir.to_s)).delete_suffix('.diff')
+ YAML.safe_load(File.read(real_file_path))
+ end
+
+ # Loads the YAML feature flag definition from a diff of the deleted feature flag definition file.
+ #
+ # @param [Pathname] file_path the path of the diff
+ # @return [Hash] a hash containing the YAML data for the feature flag definition from the diff
+ def yaml_from_deleted_diff(file_path)
+ cleaned_diff = File.read(file_path).gsub(/^[^a-z]+/, '')
+ YAML.safe_load(cleaned_diff)
+ end
end
if $0 == __FILE__
options = API::DEFAULT_OPTIONS.dup
OptionParser.new do |opts|
- opts.on("-f", "--files FILES", Array, "Comma-separated list of feature flag config files") do |value|
+ opts.on("-f", "--files FILES", String, "A directory containing diffs including feature flag definition change diffs") do |value|
options[:files] = value
end
diff --git a/scripts/dump_graphql_schema b/scripts/dump_graphql_schema
new file mode 100755
index 00000000000..7a8bd5652e1
--- /dev/null
+++ b/scripts/dump_graphql_schema
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+GITLAB_DIR="$(cd "$(dirname "$0")/.." || exit ; pwd -P)"
+DOCKER_IMAGE="registry.gitlab.com/gitlab-org/gitlab-build-images:apollo"
+CONFIG_FILE="config/apollo.config.js"
+SCHEMA_DUMP_PATH="tmp/tests/graphql/gitlab_schema_apollo.graphql"
+
+if [ "$CI" = true ]; then
+ echo "Not dumping the GraphQL schema in CI"
+else
+ echo "Dumping GraphQL schema"
+ cd "$GITLAB_DIR" || exit 1
+ if command -v docker >/dev/null; then
+ bundle exec rake gitlab:graphql:schema:dump &&
+ docker run --rm -it \
+ -v "$GITLAB_DIR/config":/config \
+ -v "$GITLAB_DIR/tmp":/tmp \
+ -v "$GITLAB_DIR/app":/app \
+ -v "$GITLAB_DIR/ee":/ee \
+ "$DOCKER_IMAGE" client:download-schema --config="$CONFIG_FILE" "$SCHEMA_DUMP_PATH"
+ else
+ echo "Docker must be installed to run this script."
+ exit 1
+ fi
+fi
diff --git a/scripts/frontend/eslint.js b/scripts/frontend/eslint.js
new file mode 100644
index 00000000000..2ba5976d1b9
--- /dev/null
+++ b/scripts/frontend/eslint.js
@@ -0,0 +1,22 @@
+const { spawn } = require('child_process');
+
+const runEslint = () => {
+ const [, , ...args] = process.argv;
+ const child = spawn(`yarn`, ['internal:eslint', ...args], {
+ stdio: 'inherit',
+ });
+
+ child.on('exit', (code) => {
+ process.exitCode = code;
+
+ if (code === 0) {
+ return;
+ }
+ console.log(`
+If you are seeing @graphql-eslint offences, the local GraphQL schema dump might be outdated.
+Consider updating it by running \`./scripts/dump_graphql_schema\`.
+ `);
+ });
+};
+
+runEslint();
diff --git a/scripts/gitaly-test-spawn b/scripts/gitaly-test-spawn
index eed79f75224..b9c78b88555 100755
--- a/scripts/gitaly-test-spawn
+++ b/scripts/gitaly-test-spawn
@@ -11,6 +11,9 @@ class GitalyTestSpawn
def run
install_gitaly_gems
+ # Run Praefect migrations
+ setup_praefect
+
# Optionally specify the path to the gitaly config toml as first argument.
# Used by workhorse in test.
spawn_gitaly(ARGV[0])
diff --git a/scripts/glfm/update-example-snapshots.rb b/scripts/glfm/update-example-snapshots.rb
new file mode 100755
index 00000000000..f0e529aa006
--- /dev/null
+++ b/scripts/glfm/update-example-snapshots.rb
@@ -0,0 +1,5 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require_relative '../lib/glfm/update_example_snapshots'
+Glfm::UpdateExampleSnapshots.new.process(skip_static_and_wysiwyg: ENV['SKIP_STATIC_AND_WYSIWYG'] == 'true')
diff --git a/scripts/glfm/update-specification.rb b/scripts/glfm/update-specification.rb
new file mode 100755
index 00000000000..7b2c30be61c
--- /dev/null
+++ b/scripts/glfm/update-specification.rb
@@ -0,0 +1,5 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require_relative '../lib/glfm/update_specification'
+Glfm::UpdateSpecification.new.process
diff --git a/scripts/lib/glfm/constants.rb b/scripts/lib/glfm/constants.rb
new file mode 100644
index 00000000000..e5917fc5cdb
--- /dev/null
+++ b/scripts/lib/glfm/constants.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'pathname'
+
+module Glfm
+ module Constants
+ # Root dir containing all specification files
+ specification_path = Pathname.new(File.expand_path("../../../glfm_specification", __dir__))
+
+ # GitHub Flavored Markdown specification file
+ GHFM_SPEC_TXT_URI = 'https://raw.githubusercontent.com/github/cmark-gfm/master/test/spec.txt'
+ GHFM_SPEC_VERSION = '0.29'
+ GHFM_SPEC_TXT_FILENAME = "ghfm_spec_v_#{GHFM_SPEC_VERSION}.txt"
+ GHFM_SPEC_TXT_PATH = specification_path.join('input/github_flavored_markdown', GHFM_SPEC_TXT_FILENAME)
+
+ # GitLab Flavored Markdown specification files
+ specification_input_glfm_path = specification_path.join('input/gitlab_flavored_markdown')
+ GLFM_INTRO_TXT_PATH = specification_input_glfm_path.join('glfm_intro.txt')
+ GLFM_EXAMPLES_TXT_PATH = specification_input_glfm_path.join('glfm_canonical_examples.txt')
+ GLFM_EXAMPLE_STATUS_YML_PATH = specification_input_glfm_path.join('glfm_example_status.yml')
+ 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_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')
+ ES_PROSEMIRROR_JSON_YML_PATH = File.join(es_fixtures_path, 'prosemirror_json.yml')
+
+ # Other constants used for processing files
+ GLFM_SPEC_TXT_HEADER = <<~GLFM_SPEC_TXT_HEADER
+ ---
+ title: GitLab Flavored Markdown (GLFM) Spec
+ version: alpha
+ ...
+ GLFM_SPEC_TXT_HEADER
+ INTRODUCTION_HEADER_LINE_TEXT = /\A# Introduction\Z/.freeze
+ END_TESTS_COMMENT_LINE_TEXT = /\A<!-- END TESTS -->\Z/.freeze
+ MARKDOWN_TEMPFILE_BASENAME = %w[MARKDOWN_TEMPFILE_ .yml].freeze
+ STATIC_HTML_TEMPFILE_BASENAME = %w[STATIC_HTML_TEMPFILE_ .yml].freeze
+ WYSIWYG_HTML_AND_JSON_TEMPFILE_BASENAME = %w[WYSIWYG_HTML_AND_JSON_TEMPFILE_ .yml].freeze
+ end
+end
diff --git a/scripts/lib/glfm/parse_examples.rb b/scripts/lib/glfm/parse_examples.rb
new file mode 100644
index 00000000000..1c6afb800c3
--- /dev/null
+++ b/scripts/lib/glfm/parse_examples.rb
@@ -0,0 +1,169 @@
+# frozen_string_literal: true
+
+# This module contains a Ruby port of Python logic from the `get_tests` method of the
+# `spec_test.py` script (see copy of original code in a comment at the bottom of this file):
+# https://github.com/github/cmark-gfm/blob/5dfedc7/test/spec_tests.py#L82
+#
+# The logic and structure is as unchanged as possible from the original Python - no
+# cleanup or refactoring was done.
+#
+# Changes from the original logic were made to follow Ruby/GitLab syntax, idioms, and linting rules.
+#
+# Additional logic was also added to:
+# 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.
+module Glfm
+ module ParseExamples
+ REGULAR_TEXT = 0
+ MARKDOWN_EXAMPLE = 1
+ HTML_OUTPUT = 2
+ EXAMPLE_BACKTICKS_LENGTH = 32
+ EXAMPLE_BACKTICKS_STRING = '`' * EXAMPLE_BACKTICKS_LENGTH
+
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
+ def parse_examples(spec_txt_lines)
+ line_number = 0
+ start_line = 0
+ example_number = 0
+ markdown_lines = []
+ html_lines = []
+ state = REGULAR_TEXT # 0 regular text, 1 markdown example, 2 html output
+ extensions = []
+ headertext = '' # most recent header text
+ headers = [] # all nested headers since last H2 - new logic compared to original Python code
+ tests = []
+
+ h1_regex = /\A# / # new logic compared to original Python code
+ h2_regex = /\A## / # new logic compared to original Python code
+ header_regex = /\A#+ / # Added beginning of line anchor to original Python code
+
+ spec_txt_lines.each do |line|
+ line_number += 1
+ stripped_line = line.strip
+ if stripped_line.start_with?("#{EXAMPLE_BACKTICKS_STRING} example")
+ # If beginning line of an example block...
+ state = MARKDOWN_EXAMPLE
+ extensions = stripped_line[(EXAMPLE_BACKTICKS_LENGTH + " example".length)..].split
+ elsif stripped_line == EXAMPLE_BACKTICKS_STRING
+ # Else if end line of an example block...
+ 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
+ elsif stripped_line == "."
+ # Else if the example divider line...
+ state = HTML_OUTPUT
+ # Else if we are currently in a markdown example...
+ elsif state == MARKDOWN_EXAMPLE
+ start_line = line_number - 1 if start_line == 0
+
+ markdown_lines.append(line)
+ elsif state == HTML_OUTPUT
+ # Else if we are currently in the html output...
+ 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)
+
+ # Extract the header text from the line
+ headertext = line.gsub(header_regex, '').strip
+
+ # reset the headers array if we found a new H1
+ headers = [] if line =~ h1_regex # new logic compared to original Python code
+
+ # 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
+
+ # push the new header text to the headers array
+ headers << headertext # New logic compared to original Python code
+ else
+ # Else if we are in regular text...
+
+ # This else block is new logic compared to original Python code
+
+ # Sanity check for state machine
+ raise 'Unexpected state encountered when parsing examples' unless state == REGULAR_TEXT
+
+ # no-op - skips any other non-header regular text lines
+ end
+ end
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
+
+ tests
+ end
+ end
+end
+
+# Original `get_tests` method from spec_test.py:
+# rubocop:disable Style/BlockComments
+# rubocop:disable Style/AsciiComments
+=begin
+def get_tests(specfile):
+ line_number = 0
+ start_line = 0
+ end_line = 0
+ example_number = 0
+ markdown_lines = []
+ html_lines = []
+ state = 0 # 0 regular text, 1 markdown example, 2 html output
+ extensions = []
+ headertext = ''
+ tests = []
+
+ header_re = re.compile('#+ ')
+
+ with open(specfile, 'r', encoding='utf-8', newline='\n') as specf:
+ for line in specf:
+ line_number = line_number + 1
+ l = line.strip()
+ if l.startswith("`" * 32 + " example"):
+ state = 1
+ extensions = l[32 + len(" example"):].split()
+ elif l == "`" * 32:
+ state = 0
+ example_number = example_number + 1
+ end_line = line_number
+ if 'disabled' not in extensions:
+ tests.append({
+ "markdown":''.join(markdown_lines).replace('→',"\t"),
+ "html":''.join(html_lines).replace('→',"\t"),
+ "example": example_number,
+ "start_line": start_line,
+ "end_line": end_line,
+ "section": headertext,
+ "extensions": extensions})
+ start_line = 0
+ markdown_lines = []
+ html_lines = []
+ elif l == ".":
+ state = 2
+ elif state == 1:
+ if start_line == 0:
+ start_line = line_number - 1
+ markdown_lines.append(line)
+ elif state == 2:
+ html_lines.append(line)
+ elif state == 0 and re.match(header_re, line):
+ headertext = header_re.sub('', line).strip()
+ return tests
+
+=end
+# rubocop:enable Style/BlockComments
+# rubocop:enable Style/AsciiComments
diff --git a/scripts/lib/glfm/render_static_html.rb b/scripts/lib/glfm/render_static_html.rb
new file mode 100644
index 00000000000..d533e586fe1
--- /dev/null
+++ b/scripts/lib/glfm/render_static_html.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+require_relative 'constants'
+require_relative 'shared'
+
+# Purpose:
+# - Reads a set of markdown examples from a hash which has been serialized to disk
+# - Converts each example to static HTML using the `markdown` helper
+# - Writes the HTML for each example to a hash which is serialized to disk
+#
+# It should be invoked via `rails runner` from the Rails root directory.
+# It is intended to be invoked from the `update_example_snapshots.rb` script class.
+module Glfm
+ class RenderStaticHtml
+ include Constants
+ include Shared
+
+ def process
+ markdown_yml_path = ARGV[0]
+ markdown_hash = YAML.load_file(markdown_yml_path)
+
+ # NOTE: We COULD parallelize this loop like the Javascript WYSIWYG example generation does,
+ # but it wouldn't save much time. Most of the time is spent loading the Rails environment
+ # via `rails runner`. In initial testing, this loop only took ~7 seconds while the entire
+ # script took ~20 seconds. Unfortunately, there's no easy way to execute
+ # `ApplicationController.helpers.markdown` without using `rails runner`
+ static_html_hash = markdown_hash.transform_values do |markdown|
+ ApplicationController.helpers.markdown(markdown)
+ end
+
+ static_html_tempfile_path = Dir::Tmpname.create(STATIC_HTML_TEMPFILE_BASENAME) do |path|
+ tmpfile = File.open(path, 'w')
+ YAML.dump(static_html_hash, tmpfile)
+ tmpfile.close
+ end
+
+ # Write the path to the output file to stdout
+ print static_html_tempfile_path
+ end
+ end
+end
+
+# current_user must be in global scope for `markdown` helper to work. Currently it's not supported
+# to pass it in the context.
+def current_user
+ # TODO: This will likely need to be a more realistic user object for some of the GLFM examples
+ User.new
+end
+
+Glfm::RenderStaticHtml.new.process
diff --git a/scripts/lib/glfm/render_wysiwyg_html_and_json.js b/scripts/lib/glfm/render_wysiwyg_html_and_json.js
new file mode 100644
index 00000000000..58b440d7ab2
--- /dev/null
+++ b/scripts/lib/glfm/render_wysiwyg_html_and_json.js
@@ -0,0 +1,152 @@
+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({}));
+}
+
+/* eslint-disable no-undef */
+jest.mock('~/emoji');
+
+// The purpose of this file is to deserialize markdown examples
+// to WYSIWYG HTML and to prosemirror documents in JSON form, using
+// the logic implemented as part of the Content Editor.
+//
+// It reads an input YAML file containing all the markdown examples,
+// and outputs a YAML files containing the rendered HTML and JSON
+// corresponding each markdown example.
+//
+// The input and output file paths are provides as command line arguments.
+//
+// Although it is implemented as a Jest test, it is not a unit test. We use
+// Jest because that is the simplest environment in which to execute the
+// relevant Content Editor logic.
+//
+//
+// This script should be invoked via jest with the a command similar to the following:
+// yarn jest --testMatch '**/render_wysiwyg_html_and_json.js' ./scripts/lib/glfm/render_wysiwyg_html_and_json.js
+it('serializes html to prosemirror json', async () => {
+ setTestTimeout(20000);
+
+ const inputMarkdownTempfilePath = process.env.INPUT_MARKDOWN_YML_PATH;
+ expect(inputMarkdownTempfilePath).not.toBeUndefined();
+ const outputWysiwygHtmlAndJsonTempfilePath =
+ process.env.OUTPUT_WYSIWYG_HTML_AND_JSON_TEMPFILE_PATH;
+ expect(outputWysiwygHtmlAndJsonTempfilePath).not.toBeUndefined();
+ /* eslint-enable no-undef */
+
+ const markdownExamples = jsYaml.safeLoad(fs.readFileSync(inputMarkdownTempfilePath), {});
+
+ const htmlAndJsonExamples = await renderHtmlAndJsonForAllExamples(markdownExamples);
+
+ const htmlAndJsonExamplesYamlString = jsYaml.safeDump(htmlAndJsonExamples, {});
+ fs.writeFileSync(outputWysiwygHtmlAndJsonTempfilePath, htmlAndJsonExamplesYamlString);
+});
diff --git a/scripts/lib/glfm/shared.rb b/scripts/lib/glfm/shared.rb
new file mode 100644
index 00000000000..f11c66eb8be
--- /dev/null
+++ b/scripts/lib/glfm/shared.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+require 'fileutils'
+require 'open3'
+
+module Glfm
+ module Shared
+ def write_file(file_path, file_content_string)
+ FileUtils.mkdir_p(File.dirname(file_path))
+ # NOTE: We don't use the block form of File.open because we want to be able to easily
+ # mock it for testing.
+ io = File.open(file_path, 'w')
+ io.binmode
+ io.write(file_content_string)
+ # NOTE: We are using #fsync + #close_write instead of just #close`, in order to unit test
+ # with a real StringIO and not just a mock object.
+ io.fsync
+ io.close_write
+ end
+
+ # All script output goes through this method. This makes it easy to mock in order to prevent
+ # output from being printed to the console during tests. We don't want to directly mock
+ # Kernel#puts, because that could interfere or cause spurious test failures when #puts is used
+ # for debugging. And for some reason RuboCop says `rubocop:disable Rails/Output` would be
+ # redundant here, so not including it.
+ def output(string)
+ puts string
+ end
+
+ def run_external_cmd(cmd)
+ # noinspection RubyMismatchedArgumentType
+ rails_root = File.expand_path('../../../', __dir__)
+
+ # See https://stackoverflow.com/a/20001569/25192
+ stdout_and_stderr_str, status = Open3.capture2e(cmd, chdir: rails_root)
+
+ return stdout_and_stderr_str if status.success?
+
+ warn("Error running command `#{cmd}`\n")
+ warn(stdout_and_stderr_str)
+ raise
+ end
+ end
+end
diff --git a/scripts/lib/glfm/update_example_snapshots.rb b/scripts/lib/glfm/update_example_snapshots.rb
new file mode 100644
index 00000000000..42ba305565d
--- /dev/null
+++ b/scripts/lib/glfm/update_example_snapshots.rb
@@ -0,0 +1,245 @@
+# frozen_string_literal: true
+require 'fileutils'
+require 'open-uri'
+require 'yaml'
+require 'psych'
+require 'tempfile'
+require 'open3'
+require_relative 'constants'
+require_relative 'shared'
+require_relative 'parse_examples'
+
+# IMPORTANT NOTE: See https://docs.gitlab.com/ee/development/gitlab_flavored_markdown/specification_guide/
+# for details on the implementation and usage of this script. This developers guide
+# contains diagrams and documentation of this script,
+# including explanations and examples of all files it reads and writes.
+module Glfm
+ class UpdateExampleSnapshots
+ include Constants
+ include Shared
+ include ParseExamples
+
+ # skip_static_and_wysiwyg can be used to skip the backend/frontend html and prosemirror JSON
+ # generation which depends on external calls. This allows for faster processing in unit tests
+ # which do not require it.
+ def process(skip_static_and_wysiwyg: false)
+ output('Updating example snapshots...')
+
+ output('(Skipping static HTML generation)') if skip_static_and_wysiwyg
+
+ glfm_spec_txt_lines, _glfm_examples_status_lines = read_input_files
+
+ # Parse all the examples from `spec.txt`, using a Ruby port of the Python `get_tests`
+ # function the from original CommonMark/GFM `spec_test.py` script.
+ all_examples = parse_examples(glfm_spec_txt_lines)
+
+ add_example_names(all_examples)
+ write_snapshot_example_files(all_examples, skip_static_and_wysiwyg: skip_static_and_wysiwyg)
+ end
+
+ private
+
+ def read_input_files
+ [
+ GLFM_SPEC_TXT_PATH,
+ GLFM_EXAMPLE_STATUS_YML_PATH
+ ].map do |path|
+ output("Reading #{path}...")
+ File.open(path).readlines
+ end
+ end
+
+ def add_example_names(all_examples)
+ # NOTE: This method assumes:
+ # 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
+ # 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.
+
+ h1_count = 1 # examples start in H1 section 2; section 1 is the overview with no examples.
+ h2_count = 0
+ previous_h1 = ''
+ previous_h2 = ''
+ index_within_h2 = 0
+ all_examples.each do |example|
+ headers = example[:headers]
+
+ if headers[0] != previous_h1
+ h1_count += 1
+ h2_count = 0
+ previous_h1 = headers[0]
+ end
+
+ if headers[1] != previous_h2
+ h2_count += 1
+ previous_h2 = headers[1]
+ index_within_h2 = 0
+ end
+
+ index_within_h2 += 1
+
+ # convert headers array to lowercase string with underscores, and double underscores between headers
+ formatted_headers_text = headers.join('__').tr('-', '_').tr(' ', '_').downcase
+
+ hierarchy_level = "#{h1_count.to_s.rjust(2, '0')}_#{h2_count.to_s.rjust(2, '0')}"
+ position_within_section = index_within_h2.to_s.rjust(2, '0')
+ name = "#{hierarchy_level}__#{formatted_headers_text}__#{position_within_section}"
+ converted_name = name.tr('(', '').tr(')', '') # remove any parens from the name
+ example[:name] = converted_name
+ end
+ end
+
+ def write_snapshot_example_files(all_examples, skip_static_and_wysiwyg:)
+ write_examples_index_yml(all_examples)
+
+ write_markdown_yml(all_examples)
+
+ if skip_static_and_wysiwyg
+ output("Skipping static/WYSIWYG HTML and prosemirror JSON generation...")
+ return
+ end
+
+ markdown_yml_tempfile_path = write_markdown_yml_tempfile
+ static_html_hash = generate_static_html(markdown_yml_tempfile_path)
+ wysiwyg_html_and_json_hash = generate_wysiwyg_html_and_json(markdown_yml_tempfile_path)
+
+ write_html_yml(all_examples, static_html_hash, wysiwyg_html_and_json_hash)
+
+ write_prosemirror_json_yml(all_examples, wysiwyg_html_and_json_hash)
+ end
+
+ def write_examples_index_yml(all_examples)
+ generate_and_write_for_all_examples(
+ all_examples, ES_EXAMPLES_INDEX_YML_PATH, literal_scalars: false
+ ) do |example, hash|
+ hash[example.fetch(:name)] = {
+ 'spec_txt_example_position' => example.fetch(:example),
+ 'source_specification' =>
+ if example[:extensions].empty?
+ 'commonmark'
+ elsif example[:extensions].include?('gitlab')
+ 'gitlab'
+ else
+ 'github'
+ end
+ }
+ end
+ end
+
+ def write_markdown_yml(all_examples)
+ generate_and_write_for_all_examples(all_examples, ES_MARKDOWN_YML_PATH) do |example, hash|
+ hash[example.fetch(:name)] = example.fetch(:markdown)
+ end
+ end
+
+ def write_markdown_yml_tempfile
+ # NOTE: We must copy the markdown YAML file to a separate temporary file for the
+ # `render_static_html.rb` script to read it, because the script is run in a
+ # separate process, and during unit testing we are unable to substitute the mock
+ # StringIO when reading the input file in the subprocess.
+ Dir::Tmpname.create(MARKDOWN_TEMPFILE_BASENAME) do |path|
+ io = File.open(ES_MARKDOWN_YML_PATH)
+ io.seek(0) # rewind the file. This is necessary when testing with a mock StringIO
+ contents = io.read
+ write_file(path, contents)
+ end
+ end
+
+ def generate_static_html(markdown_yml_tempfile_path)
+ output("Generating static HTML from markdown examples...")
+
+ # NOTE 1: We shell out to perform the conversion of markdown to static HTML via the internal Rails app
+ # helper method. This allows us to avoid using the Rails API or environment in this script,
+ # which makes developing and running the unit tests for this script much faster,
+ # because they can use 'fast_spec_helper' which does not require the entire Rails environment.
+
+ # NOTE 2: We pass the input file path as a command line argument, and receive the output
+ # tempfile path as a return value. This is simplest in the case where we are invoking Ruby.
+ cmd = %(rails runner #{__dir__}/render_static_html.rb #{markdown_yml_tempfile_path})
+ cmd_output = run_external_cmd(cmd)
+ # NOTE: Running under a debugger can add extra output, only take the last line
+ static_html_tempfile_path = cmd_output.split("\n").last
+
+ output("Reading generated static HTML from tempfile #{static_html_tempfile_path}...")
+ YAML.load_file(static_html_tempfile_path)
+ end
+
+ def generate_wysiwyg_html_and_json(markdown_yml_tempfile_path)
+ output("Generating WYSIWYG HTML and prosemirror JSON from markdown examples...")
+
+ # NOTE: Unlike when we invoke a Ruby script, here we pass the input and output file paths
+ # via environment variables. This is because it's not straightforward/clean to pass command line
+ # arguments when we are invoking `yarn jest ...`
+ ENV['INPUT_MARKDOWN_YML_PATH'] = markdown_yml_tempfile_path
+
+ # Dir::Tmpname.create requires a block, but we are using the non-block form to get the path
+ # via the return value, so we pass an empty block to avoid an error.
+ wysiwyg_html_and_json_tempfile_path = Dir::Tmpname.create(WYSIWYG_HTML_AND_JSON_TEMPFILE_BASENAME) {}
+ ENV['OUTPUT_WYSIWYG_HTML_AND_JSON_TEMPFILE_PATH'] = wysiwyg_html_and_json_tempfile_path
+
+ cmd = %(yarn jest --testMatch '**/render_wysiwyg_html_and_json.js' #{__dir__}/render_wysiwyg_html_and_json.js)
+ run_external_cmd(cmd)
+
+ output("Reading generated WYSIWYG HTML and prosemirror JSON from tempfile " \
+ "#{wysiwyg_html_and_json_tempfile_path}...")
+ YAML.load_file(wysiwyg_html_and_json_tempfile_path)
+ end
+
+ def write_html_yml(all_examples, static_html_hash, wysiwyg_html_and_json_hash)
+ generate_and_write_for_all_examples(all_examples, ES_HTML_YML_PATH) do |example, hash|
+ hash[example.fetch(:name)] = {
+ 'canonical' => example.fetch(:html),
+ 'static' => static_html_hash.fetch(example.fetch(:name)),
+ 'wysiwyg' => wysiwyg_html_and_json_hash.fetch(example.fetch(:name)).fetch('html')
+ }
+ end
+ end
+
+ def write_prosemirror_json_yml(all_examples, wysiwyg_html_and_json_hash)
+ generate_and_write_for_all_examples(all_examples, ES_PROSEMIRROR_JSON_YML_PATH) do |example, hash|
+ hash[example.fetch(:name)] = wysiwyg_html_and_json_hash.fetch(example.fetch(:name)).fetch('json')
+ end
+ end
+
+ def generate_and_write_for_all_examples(all_examples, output_file_path, literal_scalars: true, &generator_block)
+ output("Writing #{output_file_path}...")
+ generated_examples_hash = all_examples.each_with_object({}, &generator_block)
+
+ yaml_string = dump_yaml_with_formatting(generated_examples_hash, literal_scalars: literal_scalars)
+ write_file(output_file_path, yaml_string)
+ end
+
+ # Construct an AST so we can control YAML formatting for
+ # YAML block scalar literals and key quoting.
+ #
+ # Note that when Psych dumps the markdown to YAML, it will
+ # automatically use the default "clip" behavior of the Block Chomping Indicator (`|`)
+ # https://yaml.org/spec/1.2.2/#8112-block-chomping-indicator,
+ # when the markdown strings contain a trailing newline. The type of
+ # Block Chomping Indicator is automatically determined, you cannot specify it
+ # manually.
+ def dump_yaml_with_formatting(hash, literal_scalars:)
+ visitor = Psych::Visitors::YAMLTree.create
+ visitor << hash
+ ast = visitor.tree
+
+ # Force all scalars to have literal formatting (using Block Chomping Indicator instead of quotes)
+ if literal_scalars
+ ast.grep(Psych::Nodes::Scalar).each do |node|
+ node.style = Psych::Nodes::Scalar::LITERAL
+ end
+ end
+
+ # Do not quote the keys
+ ast.grep(Psych::Nodes::Mapping).each do |node|
+ node.children.each_slice(2) do |k, _|
+ k.quoted = false
+ k.style = Psych::Nodes::Scalar::ANY
+ end
+ end
+
+ ast.to_yaml
+ end
+ end
+end
diff --git a/scripts/lib/glfm/update_specification.rb b/scripts/lib/glfm/update_specification.rb
new file mode 100644
index 00000000000..73c23d40de5
--- /dev/null
+++ b/scripts/lib/glfm/update_specification.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+require 'fileutils'
+require 'open-uri'
+require 'pathname'
+require_relative 'constants'
+require_relative 'shared'
+
+module Glfm
+ class UpdateSpecification
+ include Constants
+ include Shared
+
+ def process
+ output('Updating specification...')
+ ghfm_spec_txt_lines = load_ghfm_spec_txt
+ glfm_spec_txt_string = build_glfm_spec_txt(ghfm_spec_txt_lines)
+ write_glfm_spec_txt(glfm_spec_txt_string)
+ end
+
+ private
+
+ def load_ghfm_spec_txt
+ # We only re-download the GitHub Flavored Markdown specification if the
+ # UPDATE_GHFM_SPEC_TXT environment variable is set to true, which should only
+ # ever be done manually and locally, never in CI. This provides some security
+ # protection against a possible injection attack vector, if the GitHub-hosted
+ # version of the spec is ever temporarily compromised with an injection attack.
+ #
+ # This also avoids doing external network access to download the file
+ # in CI jobs, which can avoid potentially flaky builds if the GitHub-hosted
+ # version of the file is temporarily unavailable.
+ if ENV['UPDATE_GHFM_SPEC_TXT'] == 'true'
+ download_and_write_ghfm_spec_txt
+ else
+ read_existing_ghfm_spec_txt
+ end
+ end
+
+ def read_existing_ghfm_spec_txt
+ output("Reading existing #{GHFM_SPEC_TXT_PATH}...")
+ File.open(GHFM_SPEC_TXT_PATH).readlines
+ end
+
+ def download_and_write_ghfm_spec_txt
+ output("Downloading #{GHFM_SPEC_TXT_URI}...")
+ ghfm_spec_txt_uri_io = URI.open(GHFM_SPEC_TXT_URI)
+
+ # Read IO stream into an array of lines for easy processing later
+ ghfm_spec_txt_lines = ghfm_spec_txt_uri_io.readlines
+ raise "Unable to read lines from #{GHFM_SPEC_TXT_URI}" if ghfm_spec_txt_lines.empty?
+
+ # Make sure the GHFM spec version has not changed
+ validate_expected_spec_version!(ghfm_spec_txt_lines[2])
+
+ # Reset IO stream and re-read into a single string for easy writing
+ # noinspection RubyNilAnalysis
+ ghfm_spec_txt_uri_io.seek(0)
+ ghfm_spec_txt_string = ghfm_spec_txt_uri_io.read
+ raise "Unable to read string from #{GHFM_SPEC_TXT_URI}" unless ghfm_spec_txt_string
+
+ output("Writing #{GHFM_SPEC_TXT_PATH}...")
+ GHFM_SPEC_TXT_PATH.dirname.mkpath
+ write_file(GHFM_SPEC_TXT_PATH, ghfm_spec_txt_string)
+
+ ghfm_spec_txt_lines
+ end
+
+ def validate_expected_spec_version!(version_line)
+ return if version_line =~ /\Aversion: #{GHFM_SPEC_VERSION}\Z/o
+
+ raise "GitHub Flavored Markdown spec.txt version mismatch! " \
+ "Expected 'version: #{GHFM_SPEC_VERSION}', got '#{version_line}'"
+ end
+
+ def build_glfm_spec_txt(ghfm_spec_txt_lines)
+ glfm_spec_txt_lines = ghfm_spec_txt_lines.dup
+ replace_header(glfm_spec_txt_lines)
+ replace_intro_section(glfm_spec_txt_lines)
+ insert_examples_txt(glfm_spec_txt_lines)
+ glfm_spec_txt_lines.join('')
+ end
+
+ def replace_header(spec_txt_lines)
+ spec_txt_lines[0, spec_txt_lines.index("...\n") + 1] = GLFM_SPEC_TXT_HEADER
+ end
+
+ def replace_intro_section(spec_txt_lines)
+ glfm_intro_txt_lines = File.open(GLFM_INTRO_TXT_PATH).readlines
+ raise "Unable to read lines from #{GLFM_INTRO_TXT_PATH}" if glfm_intro_txt_lines.empty?
+
+ ghfm_intro_header_begin_index = spec_txt_lines.index do |line|
+ line =~ INTRODUCTION_HEADER_LINE_TEXT
+ end
+ raise "Unable to locate introduction header line in #{GHFM_SPEC_TXT_PATH}" if ghfm_intro_header_begin_index.nil?
+
+ # Find the index of the next header after the introduction header, starting from the index
+ # of the introduction header this is the length of the intro section
+ ghfm_intro_section_length = spec_txt_lines[ghfm_intro_header_begin_index + 1..].index do |line|
+ line.start_with?('# ')
+ end
+
+ # Replace the intro section with the GitLab flavored Markdown intro section
+ spec_txt_lines[ghfm_intro_header_begin_index, ghfm_intro_section_length] = glfm_intro_txt_lines
+ end
+
+ def insert_examples_txt(spec_txt_lines)
+ glfm_examples_txt_lines = File.open(GLFM_EXAMPLES_TXT_PATH).readlines
+ raise "Unable to read lines from #{GLFM_EXAMPLES_TXT_PATH}" if glfm_examples_txt_lines.empty?
+
+ ghfm_end_tests_comment_index = spec_txt_lines.index do |line|
+ line =~ END_TESTS_COMMENT_LINE_TEXT
+ end
+ raise "Unable to locate 'END TESTS' comment line in #{GHFM_SPEC_TXT_PATH}" if ghfm_end_tests_comment_index.nil?
+
+ # Insert the GLFM examples before the 'END TESTS' comment line
+ spec_txt_lines[ghfm_end_tests_comment_index - 1] = ["\n", glfm_examples_txt_lines, "\n"].flatten
+
+ spec_txt_lines
+ end
+
+ def write_glfm_spec_txt(glfm_spec_txt_string)
+ output("Writing #{GLFM_SPEC_TXT_PATH}...")
+ FileUtils.mkdir_p(Pathname.new(GLFM_SPEC_TXT_PATH).dirname)
+ write_file(GLFM_SPEC_TXT_PATH, glfm_spec_txt_string)
+ end
+ end
+end
diff --git a/scripts/qa/quarantine-types-check b/scripts/qa/quarantine-types-check
new file mode 100755
index 00000000000..44d329a3590
--- /dev/null
+++ b/scripts/qa/quarantine-types-check
@@ -0,0 +1,62 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require 'json'
+
+QUARANTINE_TYPES = %w[stale bug investigating flaky broken test_environment waiting_on].freeze
+
+missing_issues = []
+quarantine_type_errors = []
+invalid_type_message = %"\n*** The following quarantined tests have invalid types:\n\n%s\n"
+missing_issue_message = %"\n*** The following quarantined tests are missing issue links:\n\n%s\n"
+
+test_metadata_file = ARGV.shift
+
+unless test_metadata_file
+ puts "usage: #{__FILE__} <test_metadata_file>"
+ exit 1
+end
+
+file = File.read(test_metadata_file)
+data_hash = JSON.parse(file)
+
+unless data_hash['examples'].count > 1
+ puts "\nRspec output does not contain examples. Check test-metadata.json file.\n"
+ exit 1
+end
+
+puts "\nAnalyzing quarantined test data...\n"
+
+tests = data_hash['examples']
+
+tests.each do |test|
+ if test['quarantine']
+ unless QUARANTINE_TYPES.include?(test['quarantine']['type'])
+ quarantine_type_errors.push(
+ <<~TYPE_ERRORS
+ ==> #{test['full_description']}
+ in file: #{test['id']}
+ with type: "#{test['quarantine']['type']}"
+ TYPE_ERRORS
+ )
+ end
+
+ missing_issues.push(" ==> #{test['id']} - #{test['full_description']}\n") unless test['quarantine']['issue']
+ end
+end
+
+if quarantine_type_errors.empty? && missing_issues.empty?
+ puts "\nNo errors found."
+else
+ puts "\n*** Quarantine format violations detected! ***\n"
+
+ unless quarantine_type_errors.empty?
+ puts invalid_type_message % quarantine_type_errors.join("\n")
+ puts "*** Please use one of the following quarantine types for the tests listed above.\n"
+ puts " #{QUARANTINE_TYPES}\n"
+ end
+
+ puts missing_issue_message % missing_issues unless missing_issues.empty?
+ puts "See https://about.gitlab.com/handbook/engineering/quality/quality-engineering/debugging-qa-test-failures/#quarantining-tests"
+ exit 1
+end
diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh
index f529c8eaafe..829e806e378 100755
--- a/scripts/review_apps/review-apps.sh
+++ b/scripts/review_apps/review-apps.sh
@@ -359,11 +359,11 @@ EOF
function verify_deploy() {
echoinfo "Verifying deployment at ${CI_ENVIRONMENT_URL}"
- if retry "test_url \"${CI_ENVIRONMENT_URL}\" curl_output.txt"; then
+ if retry "test_url \"${CI_ENVIRONMENT_URL}\""; then
echoinfo "Review app is deployed to ${CI_ENVIRONMENT_URL}"
return 0
else
- echoerr "Review app is not available at ${CI_ENVIRONMENT_URL}. See curl_output.txt artifact for detail."
+ echoerr "Review app is not available at ${CI_ENVIRONMENT_URL}: see the logs from cURL above for more details"
return 1
fi
}
diff --git a/scripts/setup-test-env b/scripts/setup-test-env
index a81aaa5cda3..97762e1cafa 100755
--- a/scripts/setup-test-env
+++ b/scripts/setup-test-env
@@ -53,6 +53,7 @@ require 'omniauth'
require 'omniauth-github'
require 'etc'
require_dependency File.expand_path('../lib/gitlab/access', __dir__)
+require_dependency File.expand_path('../lib/gitlab/utils', __dir__)
require_dependency File.expand_path('../config/initializers/1_settings', __dir__)
diff --git a/scripts/trigger-build.rb b/scripts/trigger-build.rb
index a3356c664d1..28b52fa916a 100755
--- a/scripts/trigger-build.rb
+++ b/scripts/trigger-build.rb
@@ -33,13 +33,13 @@ module Trigger
ENV['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN']
end
- def invoke!(post_comment: false, downstream_job_name: nil)
+ def invoke!(downstream_job_name: nil)
pipeline_variables = variables
puts "Triggering downstream pipeline on #{downstream_project_path}"
puts "with variables #{pipeline_variables}"
- pipeline = gitlab_client(:downstream).run_trigger(
+ pipeline = downstream_client.run_trigger(
downstream_project_path,
trigger_token,
ref,
@@ -48,18 +48,17 @@ module Trigger
puts "Triggered downstream pipeline: #{pipeline.web_url}\n"
puts "Waiting for downstream pipeline status"
- Trigger::CommitComment.post!(pipeline, gitlab_client(:upstream)) if post_comment
downstream_job =
if downstream_job_name
- gitlab_client(:downstream).pipeline_jobs(downstream_project_path, pipeline.id).auto_paginate.find do |potential_job|
+ downstream_client.pipeline_jobs(downstream_project_path, pipeline.id).auto_paginate.find do |potential_job|
potential_job.name == downstream_job_name
end
end
if downstream_job
- Trigger::Job.new(downstream_project_path, downstream_job.id, gitlab_client(:downstream))
+ Trigger::Job.new(downstream_project_path, downstream_job.id, downstream_client)
else
- Trigger::Pipeline.new(downstream_project_path, pipeline.id, gitlab_client(:downstream))
+ Trigger::Pipeline.new(downstream_project_path, pipeline.id, downstream_client)
end
end
@@ -80,28 +79,35 @@ module Trigger
private
- # Override to trigger and work with pipeline on different GitLab instance
- # type: :downstream -> downstream build and pipeline status
- # type: :upstream -> this project, e.g. for posting comments
- def gitlab_client(type)
- # By default, always use the same client
- @gitlab_client ||= Gitlab.client(
+ def com_gitlab_client
+ @com_gitlab_client ||= Gitlab.client(
endpoint: 'https://gitlab.com/api/v4',
private_token: self.class.access_token
)
end
+ # This client is used for downstream build and pipeline status
+ # Can be overridden
+ def downstream_client
+ com_gitlab_client
+ end
+
# Must be overridden
def downstream_project_path
raise NotImplementedError
end
# Must be overridden
- def ref
+ def ref_param_name
raise NotImplementedError
end
# Can be overridden
+ def primary_ref
+ 'main'
+ end
+
+ # Can be overridden
def trigger_token
ENV['CI_JOB_TOKEN']
end
@@ -116,6 +122,27 @@ module Trigger
ENV[version_file]&.strip || File.read(version_file).strip
end
+ # Can be overridden
+ def trigger_stable_branch_if_detected?
+ false
+ end
+
+ def stable_branch?
+ ENV['CI_COMMIT_REF_NAME'] =~ /^[\d-]+-stable(-ee)?$/
+ end
+
+ def fallback_ref
+ if trigger_stable_branch_if_detected? && stable_branch?
+ ENV['CI_COMMIT_REF_NAME'].delete_suffix('-ee')
+ else
+ primary_ref
+ end
+ end
+
+ def ref
+ ENV.fetch(ref_param_name, fallback_ref)
+ end
+
def base_variables
# Use CI_MERGE_REQUEST_SOURCE_BRANCH_SHA for omnibus checkouts due to pipeline for merged results,
# and fallback to CI_COMMIT_SHA for the `detached` pipelines.
@@ -146,8 +173,16 @@ module Trigger
ENV.fetch('OMNIBUS_PROJECT_PATH', 'gitlab-org/build/omnibus-gitlab-mirror')
end
- def ref
- ENV.fetch('OMNIBUS_BRANCH', 'master')
+ def ref_param_name
+ 'OMNIBUS_BRANCH'
+ end
+
+ def primary_ref
+ 'master'
+ end
+
+ def trigger_stable_branch_if_detected?
+ true
end
def extra_variables
@@ -184,10 +219,16 @@ module Trigger
private
- def ref
- return ENV['CI_COMMIT_REF_NAME'] if ENV['CI_COMMIT_REF_NAME'] =~ /^[\d-]+-stable(-ee)?$/
+ def ref_param_name
+ 'CNG_BRANCH'
+ end
+
+ def primary_ref
+ 'master'
+ end
- ENV.fetch('CNG_BRANCH', 'master')
+ def trigger_stable_branch_if_detected?
+ true
end
def extra_variables
@@ -243,12 +284,12 @@ module Trigger
# Remove a remote branch in gitlab-docs.
#
def cleanup!
- environment = gitlab_client(:downstream).environments(downstream_project_path, name: downstream_environment).first
+ environment = com_gitlab_client.environments(downstream_project_path, name: downstream_environment).first
return unless environment
- environment = gitlab_client(:downstream).stop_environment(downstream_project_path, environment.id)
+ environment = com_gitlab_client.stop_environment(downstream_project_path, environment.id)
if environment.state == 'stopped'
- puts "=> Downstream environment '#{downstream_environment}' stopped"
+ puts "=> Downstream environment '#{downstream_environment}' stopped."
else
puts "=> Downstream environment '#{downstream_environment}' failed to stop."
end
@@ -272,8 +313,8 @@ module Trigger
ENV.fetch('DOCS_PROJECT_PATH', 'gitlab-org/gitlab-docs')
end
- def ref
- ENV.fetch('DOCS_BRANCH', 'main')
+ def ref_param_name
+ 'DOCS_BRANCH'
end
# `gitlab-org/gitlab-docs` pipeline trigger "Triggered from gitlab-org/gitlab 'review-docs-deploy' job"
@@ -317,26 +358,21 @@ module Trigger
class DatabaseTesting < Base
IDENTIFIABLE_NOTE_TAG = 'gitlab-org/database-team/gitlab-com-database-testing:identifiable-note'
- def self.access_token
- ENV['GITLABCOM_DATABASE_TESTING_ACCESS_TOKEN']
- end
-
- def invoke!(post_comment: false, downstream_job_name: nil)
+ def invoke!(downstream_job_name: nil)
pipeline = super
- gitlab = gitlab_client(:upstream)
project_path = variables['TOP_UPSTREAM_SOURCE_PROJECT']
merge_request_id = variables['TOP_UPSTREAM_MERGE_REQUEST_IID']
comment = "<!-- #{IDENTIFIABLE_NOTE_TAG} --> \nStarted database testing [pipeline](https://ops.gitlab.net/#{downstream_project_path}/-/pipelines/#{pipeline.id}) " \
"(limited access). This comment will be updated once the pipeline has finished running."
# Look for an existing note
- db_testing_notes = gitlab.merge_request_notes(project_path, merge_request_id).auto_paginate.select do |note|
+ db_testing_notes = com_gitlab_client.merge_request_notes(project_path, merge_request_id).auto_paginate.select do |note|
note.body.include?(IDENTIFIABLE_NOTE_TAG)
end
if db_testing_notes.empty?
# This is the first note
- note = gitlab.create_merge_request_note(project_path, merge_request_id, comment)
+ note = com_gitlab_client.create_merge_request_note(project_path, merge_request_id, comment)
puts "Posted comment to:\n"
puts "https://gitlab.com/#{project_path}/-/merge_requests/#{merge_request_id}#note_#{note.id}"
@@ -345,19 +381,15 @@ module Trigger
private
- def gitlab_client(type)
- @gitlab_clients ||= {
- downstream: Gitlab.client(
- endpoint: 'https://ops.gitlab.net/api/v4',
- private_token: self.class.access_token
- ),
- upstream: Gitlab.client(
- endpoint: 'https://gitlab.com/api/v4',
- private_token: Base.access_token
- )
- }
+ def ops_gitlab_client
+ @ops_gitlab_client ||= Gitlab.client(
+ endpoint: 'https://ops.gitlab.net/api/v4',
+ private_token: ENV['GITLABCOM_DATABASE_TESTING_ACCESS_TOKEN']
+ )
+ end
- @gitlab_clients[type]
+ def downstream_client
+ ops_gitlab_client
end
def trigger_token
@@ -377,20 +409,12 @@ module Trigger
}
end
- def ref
- ENV['GITLABCOM_DATABASE_TESTING_TRIGGER_REF'] || 'master'
+ def ref_param_name
+ 'GITLABCOM_DATABASE_TESTING_TRIGGER_REF'
end
- end
-
- class CommitComment
- def self.post!(downstream_pipeline, gitlab_client)
- gitlab_client.create_commit_comment(
- ENV['CI_PROJECT_PATH'],
- Trigger.non_empty_variable_value('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA') || ENV['CI_COMMIT_SHA'],
- "The [`#{ENV['CI_JOB_NAME']}`](#{ENV['CI_JOB_URL']}) job from pipeline #{ENV['CI_PIPELINE_URL']} triggered #{downstream_pipeline.web_url} downstream.")
- rescue Gitlab::Error::Error => error
- puts "Ignoring the following error: #{error}"
+ def primary_ref
+ 'master'
end
end
@@ -458,7 +482,7 @@ end
if $0 == __FILE__
case ARGV[0]
when 'omnibus'
- Trigger::Omnibus.new.invoke!(post_comment: true, downstream_job_name: 'Trigger:qa-test').wait!
+ Trigger::Omnibus.new.invoke!(downstream_job_name: 'Trigger:qa-test').wait!
when 'cng'
Trigger::CNG.new.invoke!.wait!
when 'gitlab-com-database-testing'
diff --git a/scripts/used-feature-flags b/scripts/used-feature-flags
index 89ea99c6984..0966795f451 100755
--- a/scripts/used-feature-flags
+++ b/scripts/used-feature-flags
@@ -70,13 +70,6 @@ flags_paths.each do |flags_path|
next
end
- # Dynamic feature flag names for redirect to latest CI templates
- # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63144/diffs#fa2193ace3f6a02f7ef9995ef9bc519eca92c4ee_57_84
- if feature_flag_name.start_with?('redirect_to_latest_template_')
- puts "Skipping the #{feature_flag_name} feature flag since it starts with 'redirect_to_latest_template_'."
- next
- end
-
all_flags[feature_flag_name] = File.exist?(File.join('tmp', 'feature_flags', feature_flag_name + '.used'))
end
end
diff --git a/scripts/utils.sh b/scripts/utils.sh
index e896fe40e06..ae071b98b43 100644
--- a/scripts/utils.sh
+++ b/scripts/utils.sh
@@ -15,16 +15,18 @@ function retry() {
function test_url() {
local url="${1}"
- local curl_output="${2}"
local status
- status=$(curl -s -o "${curl_output}" -L -w ''%{http_code}'' "${url}")
+ status=$(curl --output /dev/null -L -s -w ''%{http_code}'' "${url}")
if [[ $status == "200" ]]; then
return 0
+ else
+ # We display the error in the job to allow for better debugging
+ curl -L --fail --output /dev/null "${url}"
+ echo -e "\nExpected HTTP status 200: received ${status}\n"
+ return 1
fi
-
- return 1
}
function bundle_install_script() {
@@ -59,9 +61,14 @@ function setup_db_user_only() {
source scripts/create_postgres_user.sh
}
+function setup_db_praefect() {
+ createdb -h postgres -U postgres --encoding=UTF8 --echo praefect_test
+}
+
function setup_db() {
run_timed_command "setup_db_user_only"
run_timed_command_with_metric "bundle exec rake db:drop db:create db:structure:load db:migrate gitlab:db:setup_ee" "setup_db"
+ run_timed_command "setup_db_praefect"
}
function install_api_client_dependencies_with_apk() {
diff --git a/sidekiq_cluster/cli.rb b/sidekiq_cluster/cli.rb
index c0940370d3b..52dc14130fb 100644
--- a/sidekiq_cluster/cli.rb
+++ b/sidekiq_cluster/cli.rb
@@ -20,7 +20,7 @@ require_relative 'sidekiq_cluster'
module Gitlab
module SidekiqCluster
class CLI
- THREAD_NAME = 'supervisor'
+ THREAD_NAME = 'sidekiq-cluster'
# The signals that should terminate both the master and workers.
TERMINATE_SIGNALS = %i(INT TERM).freeze
@@ -134,23 +134,17 @@ module Gitlab
)
metrics_server_pid = start_metrics_server
-
- all_pids = worker_pids + Array(metrics_server_pid)
-
- supervisor.supervise(all_pids) do |dead_pids|
+ supervisor.supervise(worker_pids + Array(metrics_server_pid)) do |dead_pids|
# If we're not in the process of shutting down the cluster,
# and the metrics server died, restart it.
- if supervisor.alive && dead_pids.include?(metrics_server_pid)
+ if dead_pids == Array(metrics_server_pid)
@logger.info('Sidekiq metrics server terminated, restarting...')
metrics_server_pid = restart_metrics_server
- all_pids = worker_pids + Array(metrics_server_pid)
else
# If a worker process died we'll just terminate the whole cluster.
# We let an external system (runit, kubernetes) handle the restart.
@logger.info('A worker terminated, shutting down the cluster')
-
- ProcessManagement.signal_processes(all_pids - dead_pids, :TERM)
- # Signal supervisor not to respawn workers and shut down.
+ supervisor.shutdown
[]
end
end
@@ -164,8 +158,7 @@ module Gitlab
def restart_metrics_server
@logger.info("Starting metrics server on port #{sidekiq_exporter_port}")
- MetricsServer.fork(
- 'sidekiq',
+ MetricsServer.start_for_sidekiq(
metrics_dir: @metrics_dir,
reset_signals: TERMINATE_SIGNALS + FORWARD_SIGNALS
)
@@ -175,26 +168,12 @@ module Gitlab
::Settings.dig('monitoring', 'sidekiq_exporter', 'enabled')
end
- def exporter_has_a_unique_port?
- # In https://gitlab.com/gitlab-org/gitlab/-/issues/345802 we added settings for sidekiq_health_checks.
- # These settings default to the same values as sidekiq_exporter for backwards compatibility.
- # If a different port for sidekiq_health_checks has been set up, we know that the
- # user wants to serve health checks and metrics from different servers.
- return false if sidekiq_health_check_port.nil? || sidekiq_exporter_port.nil?
-
- sidekiq_exporter_port != sidekiq_health_check_port
- end
-
def sidekiq_exporter_port
::Settings.dig('monitoring', 'sidekiq_exporter', 'port')
end
- def sidekiq_health_check_port
- ::Settings.dig('monitoring', 'sidekiq_health_checks', 'port')
- end
-
def metrics_server_enabled?
- !@dryrun && sidekiq_exporter_enabled? && exporter_has_a_unique_port?
+ !@dryrun && sidekiq_exporter_enabled?
end
def option_parser
diff --git a/spec/commands/metrics_server/metrics_server_spec.rb b/spec/commands/metrics_server/metrics_server_spec.rb
index 217aa185767..f93be1d9f88 100644
--- a/spec/commands/metrics_server/metrics_server_spec.rb
+++ b/spec/commands/metrics_server/metrics_server_spec.rb
@@ -1,44 +1,83 @@
# frozen_string_literal: true
require 'spec_helper'
+require 'rake_helper'
require_relative '../../../metrics_server/metrics_server'
# End-to-end tests for the metrics server process we use to serve metrics
# from forking applications (Sidekiq, Puma) to the Prometheus scraper.
-RSpec.describe 'bin/metrics-server', :aggregate_failures do
+RSpec.describe 'GitLab metrics server', :aggregate_failures do
let(:config_file) { Tempfile.new('gitlab.yml') }
+ let(:address) { '127.0.0.1' }
+ let(:port) { 3807 }
let(:config) do
{
'test' => {
'monitoring' => {
'web_exporter' => {
- 'address' => 'localhost',
+ 'address' => address,
'enabled' => true,
- 'port' => 3807
+ 'port' => port
},
'sidekiq_exporter' => {
- 'address' => 'localhost',
+ 'address' => address,
'enabled' => true,
- 'port' => 3807
+ 'port' => port
}
}
}
}
end
- %w(puma sidekiq).each do |target|
- context "with a running server targeting #{target}" do
+ before(:all) do
+ Rake.application.rake_require 'tasks/gitlab/metrics_exporter'
+
+ @exporter_path = Rails.root.join('tmp', 'test', 'gme')
+
+ run_rake_task('gitlab:metrics_exporter:install', @exporter_path)
+ end
+
+ after(:all) do
+ FileUtils.rm_rf(@exporter_path)
+ end
+
+ shared_examples 'serves metrics endpoint' do
+ it 'serves /metrics endpoint' do
+ start_server!
+
+ expect do
+ Timeout.timeout(10) do
+ http_ok = false
+ until http_ok
+ sleep 1
+ response = Gitlab::HTTP.try_get("http://#{address}:#{port}/metrics", allow_local_requests: true)
+ http_ok = response&.success?
+ end
+ end
+ end.not_to raise_error
+ end
+ end
+
+ shared_examples 'spawns a server' do |target, use_golang_server|
+ context "targeting #{target} when using Golang server is #{use_golang_server}" do
let(:metrics_dir) { Dir.mktmpdir }
+ subject(:start_server!) do
+ @pid = MetricsServer.spawn(target, metrics_dir: metrics_dir, path: @exporter_path.join('bin'))
+ end
+
before do
+ if use_golang_server
+ stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
+ allow(Settings).to receive(:monitoring).and_return(config.dig('test', 'monitoring'))
+ else
+ config_file.write(YAML.dump(config))
+ config_file.close
+ stub_env('GITLAB_CONFIG', config_file.path)
+ end
# We need to send a request to localhost
WebMock.allow_net_connect!
-
- config_file.write(YAML.dump(config))
- config_file.close
-
- @pid = MetricsServer.spawn(target, metrics_dir: metrics_dir, gitlab_config: config_file.path, wipe_metrics_dir: true)
end
after do
@@ -54,25 +93,25 @@ RSpec.describe 'bin/metrics-server', :aggregate_failures do
expect(Gitlab::ProcessManagement.process_alive?(@pid)).to be(false)
end
- rescue Errno::ESRCH => _
- # 'No such process' means the process died before
+ rescue Errno::ESRCH, Errno::ECHILD => _
+ # 'No such process' or 'No child processes' means the process died before
ensure
config_file.unlink
FileUtils.rm_rf(metrics_dir, secure: true)
end
- it 'serves /metrics endpoint' do
- expect do
- Timeout.timeout(10) do
- http_ok = false
- until http_ok
- sleep 1
- response = Gitlab::HTTP.try_get("http://localhost:3807/metrics", allow_local_requests: true)
- http_ok = response&.success?
- end
- end
- end.not_to raise_error
+ it_behaves_like 'serves metrics endpoint'
+
+ context 'when using Pathname instance as target directory' do
+ let(:metrics_dir) { Pathname.new(Dir.mktmpdir) }
+
+ it_behaves_like 'serves metrics endpoint'
end
end
end
+
+ it_behaves_like 'spawns a server', 'puma', true
+ it_behaves_like 'spawns a server', 'puma', false
+ it_behaves_like 'spawns a server', 'sidekiq', true
+ it_behaves_like 'spawns a server', 'sidekiq', false
end
diff --git a/spec/commands/sidekiq_cluster/cli_spec.rb b/spec/commands/sidekiq_cluster/cli_spec.rb
index bbf5f2bc4d9..223d0c3b0ec 100644
--- a/spec/commands/sidekiq_cluster/cli_spec.rb
+++ b/spec/commands/sidekiq_cluster/cli_spec.rb
@@ -18,7 +18,6 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
let(:sidekiq_exporter_enabled) { false }
let(:sidekiq_exporter_port) { '3807' }
- let(:sidekiq_health_checks_port) { '3807' }
let(:config_file) { Tempfile.new('gitlab.yml') }
let(:config) do
@@ -29,11 +28,6 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
'address' => 'localhost',
'enabled' => sidekiq_exporter_enabled,
'port' => sidekiq_exporter_port
- },
- 'sidekiq_health_checks' => {
- 'address' => 'localhost',
- 'enabled' => sidekiq_exporter_enabled,
- 'port' => sidekiq_health_checks_port
}
}
}
@@ -310,63 +304,37 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
cli.run(%w(foo))
end
- context 'when there are no sidekiq_health_checks settings set' do
- let(:sidekiq_exporter_enabled) { true }
-
- it 'does not start a sidekiq metrics server' do
- expect(MetricsServer).not_to receive(:fork)
-
- cli.run(%w(foo))
- end
- end
-
- context 'when the sidekiq_exporter.port setting is not set' do
- let(:sidekiq_exporter_enabled) { true }
-
- it 'does not start a sidekiq metrics server' do
- expect(MetricsServer).not_to receive(:fork)
-
- cli.run(%w(foo))
- end
- end
-
- context 'when sidekiq_exporter.enabled setting is not set' do
+ context 'when sidekiq_exporter is not set up' do
let(:config) do
{
'test' => {
'monitoring' => {
- 'sidekiq_exporter' => {},
- 'sidekiq_health_checks' => {
- 'address' => 'localhost',
- 'enabled' => sidekiq_exporter_enabled,
- 'port' => sidekiq_health_checks_port
- }
+ 'sidekiq_exporter' => {}
}
}
}
end
it 'does not start a sidekiq metrics server' do
- expect(MetricsServer).not_to receive(:fork)
+ expect(MetricsServer).not_to receive(:start_for_sidekiq)
cli.run(%w(foo))
end
end
- context 'with a blank sidekiq_exporter setting' do
+ context 'with missing sidekiq_exporter setting' do
let(:config) do
{
'test' => {
'monitoring' => {
- 'sidekiq_exporter' => nil,
- 'sidekiq_health_checks' => nil
+ 'sidekiq_exporter' => nil
}
}
}
end
it 'does not start a sidekiq metrics server' do
- expect(MetricsServer).not_to receive(:fork)
+ expect(MetricsServer).not_to receive(:start_for_sidekiq)
cli.run(%w(foo))
end
@@ -376,26 +344,21 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
end
end
- context 'with valid settings' do
- using RSpec::Parameterized::TableSyntax
+ context 'when sidekiq_exporter is disabled' do
+ it 'does not start a sidekiq metrics server' do
+ expect(MetricsServer).not_to receive(:start_for_sidekiq)
- where(:sidekiq_exporter_enabled, :sidekiq_exporter_port, :sidekiq_health_checks_port, :start_metrics_server) do
- true | '3807' | '3907' | true
- true | '3807' | '3807' | false
- false | '3807' | '3907' | false
- false | '3807' | '3907' | false
+ cli.run(%w(foo))
end
+ end
+
+ context 'when sidekiq_exporter is enabled' do
+ let(:sidekiq_exporter_enabled) { true }
- with_them do
- specify do
- if start_metrics_server
- expect(MetricsServer).to receive(:fork).with('sidekiq', metrics_dir: metrics_dir, reset_signals: trapped_signals)
- else
- expect(MetricsServer).not_to receive(:fork)
- end
+ it 'starts the metrics server' do
+ expect(MetricsServer).to receive(:start_for_sidekiq).with(metrics_dir: metrics_dir, reset_signals: trapped_signals)
- cli.run(%w(foo))
- end
+ cli.run(%w(foo))
end
end
@@ -421,7 +384,7 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
let(:sidekiq_exporter_enabled) { true }
it 'does not start the server' do
- expect(MetricsServer).not_to receive(:fork)
+ expect(MetricsServer).not_to receive(:start_for_sidekiq)
cli.run(%w(foo --dryrun))
end
@@ -431,7 +394,6 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
context 'supervising the cluster' do
let(:sidekiq_exporter_enabled) { true }
- let(:sidekiq_health_checks_port) { '3907' }
let(:metrics_server_pid) { 99 }
let(:sidekiq_worker_pids) { [2, 42] }
@@ -440,32 +402,18 @@ RSpec.describe Gitlab::SidekiqCluster::CLI, stub_settings_source: true do # rubo
end
it 'stops the entire process cluster if one of the workers has been terminated' do
- expect(supervisor).to receive(:alive).and_return(true)
- expect(supervisor).to receive(:supervise).and_yield([2])
- expect(MetricsServer).to receive(:fork).once.and_return(metrics_server_pid)
- expect(Gitlab::ProcessManagement).to receive(:signal_processes).with([42, 99], :TERM)
+ expect(MetricsServer).to receive(:start_for_sidekiq).once.and_return(metrics_server_pid)
+ expect(supervisor).to receive(:supervise).and_yield([2, 99])
+ expect(supervisor).to receive(:shutdown)
cli.run(%w(foo))
end
- context 'when the supervisor is alive' do
- it 'restarts the metrics server when it is down' do
- expect(supervisor).to receive(:alive).and_return(true)
- expect(supervisor).to receive(:supervise).and_yield([metrics_server_pid])
- expect(MetricsServer).to receive(:fork).twice.and_return(metrics_server_pid)
+ it 'restarts the metrics server when it is down' do
+ expect(supervisor).to receive(:supervise).and_yield([metrics_server_pid])
+ expect(MetricsServer).to receive(:start_for_sidekiq).twice.and_return(metrics_server_pid)
- cli.run(%w(foo))
- end
- end
-
- context 'when the supervisor is shutting down' do
- it 'does not restart the metrics server' do
- expect(supervisor).to receive(:alive).and_return(false)
- expect(supervisor).to receive(:supervise).and_yield([metrics_server_pid])
- expect(MetricsServer).to receive(:fork).once.and_return(metrics_server_pid)
-
- cli.run(%w(foo))
- end
+ cli.run(%w(foo))
end
end
end
diff --git a/spec/components/pajamas/alert_component_spec.rb b/spec/components/pajamas/alert_component_spec.rb
index 628d715ff64..e596f07a15a 100644
--- a/spec/components/pajamas/alert_component_spec.rb
+++ b/spec/components/pajamas/alert_component_spec.rb
@@ -2,13 +2,23 @@
require "spec_helper"
RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
- context 'with content' do
+ context 'slots' do
+ let_it_be(:body) { 'Alert body' }
+ let_it_be(:actions) { 'Alert actions' }
+
before do
- render_inline(described_class.new) { '_content_' }
+ render_inline described_class.new do |c|
+ c.body { body }
+ c.actions { actions }
+ end
end
- it 'has content' do
- expect(rendered_component).to have_text('_content_')
+ it 'renders alert body' do
+ expect(rendered_component).to have_content(body)
+ end
+
+ it 'renders actions' do
+ expect(rendered_component).to have_content(actions)
end
end
@@ -25,47 +35,71 @@ RSpec.describe Pajamas::AlertComponent, :aggregate_failures, type: :component do
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')
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')
end
end
context 'with custom options' do
context 'with simple options' do
- context 'without dismissible content' do
- before do
- render_inline described_class.new(
- title: '_title_',
- dismissible: false,
- alert_class: '_alert_class_',
- alert_data: {
- feature_id: '_feature_id_',
- dismiss_endpoint: '_dismiss_endpoint_'
- }
- )
- end
+ before do
+ render_inline described_class.new(
+ title: '_title_',
+ alert_class: '_alert_class_',
+ alert_data: {
+ feature_id: '_feature_id_',
+ dismiss_endpoint: '_dismiss_endpoint_'
+ }
+ )
+ 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')
- 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')
+ end
- it 'sets to not be dismissible' do
- expect(rendered_component).not_to have_selector('.gl-dismiss-btn.js-close')
- expect(rendered_component).not_to have_selector("[data-testid='close-icon']")
- end
+ it 'sets the alert_class' do
+ expect(rendered_component).to have_selector('._alert_class_')
+ end
- it 'sets the alert_class' do
- expect(rendered_component).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_"]')
+ end
+ end
- it 'sets the alert_data' do
- expect(rendered_component).to have_selector('[data-feature-id="_feature_id_"][data-dismiss-endpoint="_dismiss_endpoint_"]')
- end
+ context 'with dismissible disabled' do
+ before do
+ render_inline described_class.new(dismissible: false)
+ end
+
+ it 'has the "not dismissible" class' do
+ expect(rendered_component).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']")
+ end
+ end
+
+ context 'with the icon hidden' do
+ before do
+ render_inline described_class.new(show_icon: false)
+ end
+
+ it 'has the hidden icon class' do
+ expect(rendered_component).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']")
end
end
@@ -79,6 +113,10 @@ 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')
+ 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']")
diff --git a/spec/config/object_store_settings_spec.rb b/spec/config/object_store_settings_spec.rb
index 33443509e4a..56ad0943377 100644
--- a/spec/config/object_store_settings_spec.rb
+++ b/spec/config/object_store_settings_spec.rb
@@ -162,14 +162,14 @@ RSpec.describe ObjectStoreSettings do
{
'enabled' => true,
'remote_directory' => 'some-bucket',
- 'direct_upload' => true,
- 'background_upload' => false,
+ 'direct_upload' => false,
+ 'background_upload' => true,
'proxy_download' => false
}
end
before do
- settings.lfs['object_store'] = described_class.legacy_parse(legacy_settings)
+ settings.lfs['object_store'] = described_class.legacy_parse(legacy_settings, 'lfs')
end
it 'does not alter config if legacy settings are specified' do
@@ -177,6 +177,35 @@ RSpec.describe ObjectStoreSettings do
expect(settings.artifacts['object_store']).to be_nil
expect(settings.lfs['object_store']['remote_directory']).to eq('some-bucket')
+ # Disable background_upload, regardless of the input config
+ expect(settings.lfs['object_store']['direct_upload']).to eq(true)
+ expect(settings.lfs['object_store']['background_upload']).to eq(false)
+ expect(settings.external_diffs['object_store']).to be_nil
+ end
+ end
+
+ context 'with legacy config and legacy background upload is enabled' do
+ let(:legacy_settings) do
+ {
+ 'enabled' => true,
+ 'remote_directory' => 'some-bucket',
+ 'proxy_download' => false
+ }
+ end
+
+ before do
+ stub_env(ObjectStoreSettings::LEGACY_BACKGROUND_UPLOADS_ENV, 'lfs')
+ settings.lfs['object_store'] = described_class.legacy_parse(legacy_settings, 'lfs')
+ end
+
+ it 'enables background_upload and disables direct_upload' do
+ subject
+
+ expect(settings.artifacts['object_store']).to be_nil
+ expect(settings.lfs['object_store']['remote_directory']).to eq('some-bucket')
+ # Enable background_upload if the environment variable is available
+ expect(settings.lfs['object_store']['direct_upload']).to eq(false)
+ expect(settings.lfs['object_store']['background_upload']).to eq(true)
expect(settings.external_diffs['object_store']).to be_nil
end
end
@@ -185,11 +214,11 @@ RSpec.describe ObjectStoreSettings do
describe '.legacy_parse' do
it 'sets correct default values' do
- settings = described_class.legacy_parse(nil)
+ settings = described_class.legacy_parse(nil, 'artifacts')
expect(settings['enabled']).to be false
- expect(settings['direct_upload']).to be false
- expect(settings['background_upload']).to be true
+ expect(settings['direct_upload']).to be true
+ expect(settings['background_upload']).to be false
expect(settings['remote_directory']).to be nil
end
@@ -199,12 +228,52 @@ RSpec.describe ObjectStoreSettings do
'remote_directory' => 'artifacts'
})
- settings = described_class.legacy_parse(original_settings)
+ settings = described_class.legacy_parse(original_settings, 'artifacts')
expect(settings['enabled']).to be true
- expect(settings['direct_upload']).to be false
- expect(settings['background_upload']).to be true
+ expect(settings['direct_upload']).to be true
+ expect(settings['background_upload']).to be false
expect(settings['remote_directory']).to eq 'artifacts'
end
+
+ context 'legacy background upload environment variable is enabled' do
+ before do
+ stub_env(ObjectStoreSettings::LEGACY_BACKGROUND_UPLOADS_ENV, 'artifacts,lfs')
+ end
+
+ it 'enables background_upload and disables direct_upload' do
+ original_settings = Settingslogic.new({
+ 'enabled' => true,
+ 'remote_directory' => 'artifacts'
+ })
+
+ settings = described_class.legacy_parse(original_settings, 'artifacts')
+
+ expect(settings['enabled']).to be true
+ expect(settings['direct_upload']).to be false
+ expect(settings['background_upload']).to be true
+ expect(settings['remote_directory']).to eq 'artifacts'
+ end
+ end
+
+ context 'legacy background upload environment variable is enabled for other types' do
+ before do
+ stub_env(ObjectStoreSettings::LEGACY_BACKGROUND_UPLOADS_ENV, 'uploads,lfs')
+ end
+
+ it 'enables direct_upload and disables background_upload' do
+ original_settings = Settingslogic.new({
+ 'enabled' => true,
+ 'remote_directory' => 'artifacts'
+ })
+
+ settings = described_class.legacy_parse(original_settings, 'artifacts')
+
+ expect(settings['enabled']).to be true
+ expect(settings['direct_upload']).to be true
+ expect(settings['background_upload']).to be false
+ expect(settings['remote_directory']).to eq 'artifacts'
+ end
+ end
end
end
diff --git a/spec/config/settings_spec.rb b/spec/config/settings_spec.rb
index 0c2465678f9..1de0e7e6c26 100644
--- a/spec/config/settings_spec.rb
+++ b/spec/config/settings_spec.rb
@@ -118,7 +118,7 @@ RSpec.describe Settings do
allow(Gitlab::CurrentSettings)
.to receive(:uuid) { 'd9e2f4e8-db1f-4e51-b03d-f427e1965c4a'}
- expect(described_class.send(:cron_for_service_ping)).to eq('21 18 * * 4')
+ expect(described_class.send(:cron_for_service_ping)).to eq('44 10 * * 4')
end
it 'returns min, hour, day in the valid range' do
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index a18ebe9c9a0..4a92911f914 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -66,6 +66,26 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
sign_in(admin)
end
+ context 'when there are recent ServicePing reports' do
+ it 'attempts to use prerecorded data' do
+ create(:raw_usage_data)
+
+ expect(Gitlab::Usage::ServicePingReport).not_to receive(:for)
+
+ get :usage_data, format: :json
+ end
+ end
+
+ context 'when there are NO recent ServicePing reports' do
+ it 'calculates data on the fly' do
+ allow(Gitlab::Usage::ServicePingReport).to receive(:for).and_call_original
+
+ get :usage_data, format: :json
+
+ expect(Gitlab::Usage::ServicePingReport).to have_received(:for)
+ end
+ end
+
it 'returns HTML data' do
get :usage_data, format: :html
@@ -331,6 +351,17 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
end
+
+ context 'pipeline creation rate limiting' do
+ let(:application_settings) { ApplicationSetting.current }
+
+ it 'updates pipeline_limit_per_project_user_sha setting' do
+ put :update, params: { application_setting: { pipeline_limit_per_project_user_sha: 25 } }
+
+ expect(response).to redirect_to(general_admin_application_settings_path)
+ expect(application_settings.reload.pipeline_limit_per_project_user_sha).to eq(25)
+ end
+ end
end
describe 'PUT #reset_registration_token' do
@@ -368,4 +399,37 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
expect(response).to redirect_to("https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf")
end
end
+
+ describe 'GET #service_usage_data' do
+ before do
+ stub_usage_data_connections
+ stub_database_flavor_check
+ sign_in(admin)
+ end
+
+ it 'assigns truthy value if there are recent ServicePing reports in database' do
+ create(:raw_usage_data)
+
+ get :service_usage_data, format: :html
+
+ expect(assigns(:service_ping_data_present)).to be_truthy
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'assigns truthy value if there are recent ServicePing reports in cache', :use_clean_rails_memory_store_caching do
+ Rails.cache.write('usage_data', true)
+
+ get :service_usage_data, format: :html
+
+ expect(assigns(:service_ping_data_present)).to be_truthy
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'assigns falsey value if there are NO recent ServicePing reports' do
+ get :service_usage_data, format: :html
+
+ expect(assigns(:service_ping_data_present)).to be_falsey
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb
index fed9d2e8588..ca2b50b529c 100644
--- a/spec/controllers/admin/clusters_controller_spec.rb
+++ b/spec/controllers/admin/clusters_controller_spec.rb
@@ -102,87 +102,6 @@ RSpec.describe Admin::ClustersController do
end
end
- describe 'GET #new' do
- let(:user) { admin }
-
- def go(provider: 'gcp')
- get :new, params: { provider: provider }
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- describe 'functionality for new cluster' do
- context 'when omniauth has been configured' do
- let(:key) { 'secret-key' }
- let(:session_key_for_redirect_uri) do
- GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(key)
- end
-
- context 'when selected provider is gke and no valid gcp token exists' do
- it 'redirects to gcp authorize_url' do
- go
-
- expect(response).to redirect_to(assigns(:authorize_url))
- end
- end
- end
-
- context 'when omniauth has not configured' do
- before do
- stub_omniauth_setting(providers: [])
- end
-
- it 'does not have authorize_url' do
- go
-
- expect(assigns(:authorize_url)).to be_nil
- end
- end
-
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'has new object' do
- go
-
- expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'functionality for existing cluster' do
- it 'has new object' do
- go
-
- expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- include_examples 'GET new cluster shared examples'
-
- describe 'security' do
- it { expect { go }.to be_allowed_for(:admin) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do
let(:cluster) { create(:cluster, :instance, :provided_by_gcp) }
@@ -216,164 +135,6 @@ RSpec.describe Admin::ClustersController do
end
end
- describe 'POST #create_gcp' do
- let(:legacy_abac_param) { 'true' }
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- provider_gcp_attributes: {
- gcp_project_id: 'gcp-project-12345',
- legacy_abac: legacy_abac_param
- }
- }
- }
- end
-
- def post_create_gcp
- post :create_gcp, params: params
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { post_create_gcp }
- end
-
- describe 'functionality' do
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { post_create_gcp }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
-
- cluster = Clusters::Cluster.instance_type.first
-
- expect(response).to redirect_to(admin_cluster_path(cluster))
- expect(cluster).to be_gcp
- expect(cluster).to be_kubernetes
- expect(cluster.provider_gcp).to be_legacy_abac
- end
-
- context 'when legacy_abac param is false' do
- let(:legacy_abac_param) { 'false' }
-
- it 'creates a new cluster with legacy_abac_disabled' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { post_create_gcp }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
- expect(Clusters::Cluster.instance_type.first.provider_gcp).not_to be_legacy_abac
- end
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'security' do
- before do
- allow_next_instance_of(described_class) do |instance|
- allow(instance).to receive(:token_in_session).and_return('token')
- allow(instance).to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
- end
- allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |instance|
- allow(instance).to receive(:projects_zones_clusters_create) do
- double(
- 'instance',
- self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
- status: 'RUNNING'
- )
- end
- end
-
- allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
- end
-
- it { expect { post_create_gcp }.to be_allowed_for(:admin) }
- it { expect { post_create_gcp }.to be_denied_for(:user) }
- it { expect { post_create_gcp }.to be_denied_for(:external) }
- end
- end
-
- describe 'POST #create_aws' do
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- provider_aws_attributes: {
- key_name: 'key',
- role_arn: 'arn:role',
- region: 'region',
- vpc_id: 'vpc',
- instance_type: 'instance type',
- num_nodes: 3,
- security_group_id: 'security group',
- subnet_ids: %w(subnet1 subnet2)
- }
- }
- }
- end
-
- def post_create_aws
- post :create_aws, params: params
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { post_create_aws }
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { post_create_aws }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Aws.count }
-
- cluster = Clusters::Cluster.instance_type.first
-
- expect(response).to have_gitlab_http_status(:created)
- expect(response.location).to eq(admin_cluster_path(cluster))
- expect(cluster).to be_aws
- expect(cluster).to be_kubernetes
- end
-
- context 'params are invalid' do
- let(:params) do
- {
- cluster: { name: '' }
- }
- end
-
- it 'does not create a cluster' do
- expect { post_create_aws }.not_to change { Clusters::Cluster.count }
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(response.media_type).to eq('application/json')
- expect(response.body).to include('is invalid')
- end
- end
-
- describe 'security' do
- before do
- allow(WaitForClusterCreationWorker).to receive(:perform_in)
- end
-
- it { expect { post_create_aws }.to be_allowed_for(:admin) }
- it { expect { post_create_aws }.to be_denied_for(:user) }
- it { expect { post_create_aws }.to be_denied_for(:external) }
- end
- end
-
describe 'POST #create_user' do
let(:params) do
{
diff --git a/spec/controllers/admin/groups_controller_spec.rb b/spec/controllers/admin/groups_controller_spec.rb
index d9b7e00fd75..fb843ac6a7a 100644
--- a/spec/controllers/admin/groups_controller_spec.rb
+++ b/spec/controllers/admin/groups_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Admin::GroupsController do
it 'adds user to members', :aggregate_failures, :snowplow do
put :members_update, params: {
id: group,
- user_ids: group_user.id,
+ user_id: group_user.id,
access_level: Gitlab::Access::GUEST
}
@@ -70,7 +70,7 @@ RSpec.describe Admin::GroupsController do
it 'can add unlimited members', :aggregate_failures do
put :members_update, params: {
id: group,
- user_ids: 1.upto(1000).to_a.join(','),
+ user_id: 1.upto(1000).to_a.join(','),
access_level: Gitlab::Access::GUEST
}
@@ -81,7 +81,7 @@ RSpec.describe Admin::GroupsController do
it 'adds no user to members', :aggregate_failures do
put :members_update, params: {
id: group,
- user_ids: '',
+ user_id: '',
access_level: Gitlab::Access::GUEST
}
diff --git a/spec/controllers/admin/requests_profiles_controller_spec.rb b/spec/controllers/admin/requests_profiles_controller_spec.rb
deleted file mode 100644
index 7ee46b5b28a..00000000000
--- a/spec/controllers/admin/requests_profiles_controller_spec.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Admin::RequestsProfilesController do
- let_it_be(:admin) { create(:admin) }
-
- before do
- sign_in(admin)
- end
-
- describe '#show' do
- let(:tmpdir) { Dir.mktmpdir('profiler-test') }
- let(:test_file) { File.join(tmpdir, basename) }
-
- subject do
- get :show, params: { name: basename }
- end
-
- before do
- stub_const('Gitlab::RequestProfiler::PROFILES_DIR', tmpdir)
- File.write(test_file, sample_data)
- end
-
- after do
- FileUtils.rm_rf(tmpdir)
- end
-
- context 'when loading HTML profile' do
- let(:basename) { "profile_#{Time.current.to_i}_execution.html" }
-
- let(:sample_data) do
- '<html> <body> <h1>Heading</h1> <p>paragraph.</p> </body> </html>'
- end
-
- it 'renders the data' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response.body).to eq(sample_data)
- end
- end
-
- context 'when loading TXT profile' do
- let(:basename) { "profile_#{Time.current.to_i}_memory.txt" }
-
- let(:sample_data) do
- <<~TXT
- Total allocated: 112096396 bytes (1080431 objects)
- Total retained: 10312598 bytes (53567 objects)
- TXT
- end
-
- it 'renders the data' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response.body).to eq(sample_data)
- end
- end
-
- context 'when loading PDF profile' do
- let(:basename) { "profile_#{Time.current.to_i}_anything.pdf" }
-
- let(:sample_data) { 'mocked pdf content' }
-
- it 'fails to render the data' do
- expect { subject }.to raise_error(ActionController::UrlGenerationError, /No route matches.*unmatched constraints:/)
- end
- end
- end
-end
diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb
index 8f70cb32d3e..fea59969400 100644
--- a/spec/controllers/admin/runners_controller_spec.rb
+++ b/spec/controllers/admin/runners_controller_spec.rb
@@ -26,27 +26,12 @@ RSpec.describe Admin::RunnersController do
describe '#show' do
render_views
- let_it_be(:project) { create(:project) }
-
- before_all do
- create(:ci_build, runner: runner, project: project)
- end
-
it 'shows a runner show page' do
get :show, params: { id: runner.id }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template(:show)
end
-
- it 'when runner_read_only_admin_view is off, redirects to the runner edit page' do
- stub_feature_flags(runner_read_only_admin_view: false)
-
- get :show, params: { id: runner.id }
-
- expect(response).to have_gitlab_http_status(:redirect)
- expect(response).to redirect_to edit_admin_runner_path(runner)
- end
end
describe '#edit' do
@@ -55,11 +40,6 @@ RSpec.describe Admin::RunnersController do
let_it_be(:project) { create(:project) }
let_it_be(:project_two) { create(:project) }
- before_all do
- create(:ci_build, runner: runner, project: project)
- create(:ci_build, runner: runner, project: project_two)
- end
-
it 'shows a runner edit page' do
get :edit, params: { id: runner.id }
@@ -77,9 +57,6 @@ RSpec.describe Admin::RunnersController do
control_count = ActiveRecord::QueryRecorder.new { get :edit, params: { id: runner.id } }.count
- new_project = create(:project)
- create(:ci_build, runner: runner, project: new_project)
-
# There is one additional query looking up subject.group in ProjectPolicy for the
# needs_new_sso_session permission
expect { get :edit, params: { id: runner.id } }.not_to exceed_query_limit(control_count + 1)
@@ -89,17 +66,42 @@ RSpec.describe Admin::RunnersController do
end
describe '#update' do
- it 'updates the runner and ticks the queue' do
- new_desc = runner.description.swapcase
+ let(:new_desc) { runner.description.swapcase }
+ let(:runner_params) { { id: runner.id, runner: { description: new_desc } } }
- expect do
- post :update, params: { id: runner.id, runner: { description: new_desc } }
- end.to change { runner.ensure_runner_queue_value }
+ subject(:request) { post :update, params: runner_params }
- runner.reload
+ context 'with update succeeding' do
+ before do
+ expect_next_instance_of(Ci::Runners::UpdateRunnerService, runner) do |service|
+ expect(service).to receive(:update).with(anything).and_call_original
+ end
+ end
- expect(response).to have_gitlab_http_status(:found)
- expect(runner.description).to eq(new_desc)
+ it 'updates the runner and ticks the queue' do
+ expect { request }.to change { runner.ensure_runner_queue_value }
+
+ runner.reload
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(runner.description).to eq(new_desc)
+ end
+ end
+
+ context 'with update failing' do
+ before do
+ expect_next_instance_of(Ci::Runners::UpdateRunnerService, runner) do |service|
+ expect(service).to receive(:update).with(anything).and_return(false)
+ end
+ end
+
+ it 'does not update runner or tick the queue' do
+ expect { request }.not_to change { runner.ensure_runner_queue_value }
+ expect { request }.not_to change { runner.reload.description }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:show)
+ end
end
end
diff --git a/spec/controllers/admin/topics_controller_spec.rb b/spec/controllers/admin/topics_controller_spec.rb
index ea510f916da..67943525687 100644
--- a/spec/controllers/admin/topics_controller_spec.rb
+++ b/spec/controllers/admin/topics_controller_spec.rb
@@ -77,24 +77,31 @@ RSpec.describe Admin::TopicsController do
describe 'POST #create' do
it 'creates topic' do
expect do
- post :create, params: { projects_topic: { name: 'test' } }
+ post :create, params: { projects_topic: { name: 'test', title: 'Test' } }
end.to change { Projects::Topic.count }.by(1)
end
- it 'shows error message for invalid topic' do
- post :create, params: { projects_topic: { name: nil } }
+ it 'shows error message for invalid topic name' do
+ post :create, params: { projects_topic: { name: nil, title: 'Test' } }
errors = assigns[:topic].errors
expect(errors).to contain_exactly(errors.full_message(:name, I18n.t('errors.messages.blank')))
end
- it 'shows error message if topic not unique (case insensitive)' do
- post :create, params: { projects_topic: { name: topic.name.upcase } }
+ it 'shows error message if topic name not unique (case insensitive)' do
+ post :create, params: { projects_topic: { name: topic.name.upcase, title: topic.title } }
errors = assigns[:topic].errors
expect(errors).to contain_exactly(errors.full_message(:name, I18n.t('errors.messages.taken')))
end
+ it 'shows error message for invalid topic title' do
+ post :create, params: { projects_topic: { name: 'test', title: nil } }
+
+ errors = assigns[:topic].errors
+ expect(errors).to contain_exactly(errors.full_message(:title, I18n.t('errors.messages.blank')))
+ end
+
context 'as a normal user' do
before do
sign_in(user)
diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb
index abada97fb10..efa00877142 100644
--- a/spec/controllers/dashboard/todos_controller_spec.rb
+++ b/spec/controllers/dashboard/todos_controller_spec.rb
@@ -113,6 +113,19 @@ RSpec.describe Dashboard::TodosController do
expect(response).to redirect_to(dashboard_todos_path(page: last_page, project_id: project.id))
end
+
+ it 'returns directly addressed if filtering by mentioned action_id' do
+ allow(controller).to receive(:current_user).and_return(user)
+
+ mentioned_todos = [
+ create(:todo, :directly_addressed, project: project, user: user, target: issues.first),
+ create(:todo, :mentioned, project: project, user: user, target: issues.first)
+ ]
+
+ get :index, params: { action_id: ::Todo::MENTIONED, project_id: project.id }
+
+ expect(assigns(:todos)).to match_array(mentioned_todos)
+ end
end
end
diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb
index 4de31e2e135..0818dce776d 100644
--- a/spec/controllers/graphql_controller_spec.rb
+++ b/spec/controllers/graphql_controller_spec.rb
@@ -9,15 +9,10 @@ RSpec.describe GraphqlController do
stub_feature_flags(graphql: true)
end
- describe 'ArgumentError' do
- let(:user) { create(:user) }
- let(:message) { 'green ideas sleep furiously' }
+ describe 'rescue_from' do
+ let_it_be(:message) { 'green ideas sleep furiously' }
- before do
- sign_in(user)
- end
-
- it 'handles argument errors' do
+ it 'handles ArgumentError' do
allow(subject).to receive(:execute) do
raise Gitlab::Graphql::Errors::ArgumentError, message
end
@@ -28,6 +23,19 @@ RSpec.describe GraphqlController do
'errors' => include(a_hash_including('message' => message))
)
end
+
+ it 'handles StandardError' do
+ allow(subject).to receive(:execute) do
+ raise StandardError, message
+ end
+
+ post :execute
+
+ expect(json_response).to include(
+ 'errors' => include(a_hash_including('message' => /Internal server error/,
+ 'raisedAt' => /graphql_controller_spec.rb/))
+ )
+ end
end
describe 'POST #execute' do
diff --git a/spec/controllers/groups/clusters_controller_spec.rb b/spec/controllers/groups/clusters_controller_spec.rb
index 4eeae64b760..4b82c5ceb1c 100644
--- a/spec/controllers/groups/clusters_controller_spec.rb
+++ b/spec/controllers/groups/clusters_controller_spec.rb
@@ -115,95 +115,6 @@ RSpec.describe Groups::ClustersController do
end
end
- describe 'GET new' do
- def go(provider: 'gcp')
- get :new, params: { group_id: group, provider: provider }
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- describe 'functionality for new cluster' do
- context 'when omniauth has been configured' do
- let(:key) { 'secret-key' }
- let(:session_key_for_redirect_uri) do
- GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(key)
- end
-
- before do
- allow(SecureRandom).to receive(:hex).and_return(key)
- end
-
- it 'redirects to gcp authorize_url' do
- go
-
- expect(assigns(:authorize_url)).to include(key)
- expect(session[session_key_for_redirect_uri]).to eq(new_group_cluster_path(group, provider: :gcp))
- expect(response).to redirect_to(assigns(:authorize_url))
- end
- end
-
- context 'when omniauth has not configured' do
- before do
- stub_omniauth_setting(providers: [])
- end
-
- it 'does not have authorize_url' do
- go
-
- expect(assigns(:authorize_url)).to be_nil
- end
- end
-
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'has new object' do
- go
-
- expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'functionality for existing cluster' do
- it 'has new object' do
- go
-
- expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- include_examples 'GET new cluster shared examples'
-
- describe 'security' do
- it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
- it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
- it { expect { go }.to be_allowed_for(:owner).of(group) }
- it { expect { go }.to be_allowed_for(:maintainer).of(group) }
- it { expect { go }.to be_denied_for(:developer).of(group) }
- it { expect { go }.to be_denied_for(:reporter).of(group) }
- it { expect { go }.to be_denied_for(:guest).of(group) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do
let(:cluster) { create(:cluster, :provided_by_gcp, cluster_type: :group_type, groups: [group]) }
@@ -244,105 +155,6 @@ RSpec.describe Groups::ClustersController do
end
end
- describe 'POST create for new cluster' do
- let(:legacy_abac_param) { 'true' }
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- managed: '1',
- provider_gcp_attributes: {
- gcp_project_id: 'gcp-project-12345',
- legacy_abac: legacy_abac_param
- }
- }
- }
- end
-
- def go
- post :create_gcp, params: params.merge(group_id: group)
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- describe 'functionality' do
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { go }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
-
- cluster = group.clusters.first
-
- expect(response).to redirect_to(group_cluster_path(group, cluster))
- expect(cluster).to be_gcp
- expect(cluster).to be_kubernetes
- expect(cluster.provider_gcp).to be_legacy_abac
- expect(cluster).to be_managed
- expect(cluster).to be_namespace_per_environment
- end
-
- context 'when legacy_abac param is false' do
- let(:legacy_abac_param) { 'false' }
-
- it 'creates a new cluster with legacy_abac_disabled' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { go }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
- expect(group.clusters.first.provider_gcp).not_to be_legacy_abac
- end
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'security' do
- before do
- allow_any_instance_of(described_class)
- .to receive(:token_in_session).and_return('token')
- allow_any_instance_of(described_class)
- .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
- allow_any_instance_of(GoogleApi::CloudPlatform::Client)
- .to receive(:projects_zones_clusters_create) do
- double(
- 'instance',
- self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
- status: 'RUNNING'
- )
- end
-
- allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
- end
-
- it('is allowed for admin when admin mode is enabled', :enable_admin_mode) { expect { go }.to be_allowed_for(:admin) }
- it('is denied for admin when admin mode is disabled') { expect { go }.to be_denied_for(:admin) }
- it { expect { go }.to be_allowed_for(:owner).of(group) }
- it { expect { go }.to be_allowed_for(:maintainer).of(group) }
- it { expect { go }.to be_denied_for(:developer).of(group) }
- it { expect { go }.to be_denied_for(:reporter).of(group) }
- it { expect { go }.to be_denied_for(:guest).of(group) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'POST create for existing cluster' do
let(:params) do
{
diff --git a/spec/controllers/groups/dependency_proxy_auth_controller_spec.rb b/spec/controllers/groups/dependency_proxy_auth_controller_spec.rb
index 50e19d5b482..ed79712f828 100644
--- a/spec/controllers/groups/dependency_proxy_auth_controller_spec.rb
+++ b/spec/controllers/groups/dependency_proxy_auth_controller_spec.rb
@@ -8,18 +8,6 @@ RSpec.describe Groups::DependencyProxyAuthController do
describe 'GET #authenticate' do
subject { get :authenticate }
- context 'feature flag disabled' do
- before do
- stub_feature_flags(dependency_proxy_for_private_groups: false)
- end
-
- it 'returns successfully', :aggregate_failures do
- subject
-
- expect(response).to have_gitlab_http_status(:success)
- end
- end
-
context 'without JWT' do
it 'returns unauthorized with oauth realm', :aggregate_failures do
subject
diff --git a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
index 61445603a2d..5b4b00106cb 100644
--- a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
+++ b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
@@ -20,33 +20,9 @@ RSpec.describe Groups::DependencyProxyForContainersController do
request.headers['HTTP_AUTHORIZATION'] = nil
end
- context 'feature flag disabled' do
- let_it_be(:group) { create(:group) }
-
- before do
- stub_feature_flags(dependency_proxy_for_private_groups: false)
- end
-
- it { is_expected.to have_gitlab_http_status(:ok) }
- end
-
it { is_expected.to have_gitlab_http_status(:unauthorized) }
end
- shared_examples 'feature flag disabled with private group' do
- before do
- stub_feature_flags(dependency_proxy_for_private_groups: false)
- end
-
- it 'returns not found' do
- group.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
-
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
shared_examples 'with invalid path' do
context 'with invalid image' do
let(:image) { '../path_traversal' }
@@ -208,7 +184,6 @@ RSpec.describe Groups::DependencyProxyForContainersController do
context 'feature enabled' do
it_behaves_like 'without a token'
it_behaves_like 'without permission'
- it_behaves_like 'feature flag disabled with private group'
context 'remote token request fails' do
let(:token_response) do
@@ -321,7 +296,6 @@ RSpec.describe Groups::DependencyProxyForContainersController do
context 'feature enabled' do
it_behaves_like 'without a token'
it_behaves_like 'without permission'
- it_behaves_like 'feature flag disabled with private group'
context 'a valid user' do
before do
diff --git a/spec/controllers/groups/releases_controller_spec.rb b/spec/controllers/groups/releases_controller_spec.rb
index 8b08f913e10..9d372114d62 100644
--- a/spec/controllers/groups/releases_controller_spec.rb
+++ b/spec/controllers/groups/releases_controller_spec.rb
@@ -60,32 +60,6 @@ RSpec.describe Groups::ReleasesController do
end
end
- context 'group_releases_finder_inoperator feature flag' do
- before do
- sign_in(guest)
- end
-
- it 'calls old code when disabled' do
- stub_feature_flags(group_releases_finder_inoperator: false)
-
- allow(ReleasesFinder).to receive(:new).and_call_original
-
- index
-
- expect(ReleasesFinder).to have_received(:new)
- end
-
- it 'calls new code when enabled' do
- stub_feature_flags(group_releases_finder_inoperator: true)
-
- allow(Releases::GroupReleasesFinder).to receive(:new).and_call_original
-
- index
-
- expect(Releases::GroupReleasesFinder).to have_received(:new)
- end
- end
-
context 'N+1 queries' do
it 'avoids N+1 database queries' do
control_count = ActiveRecord::QueryRecorder.new { subject }.count
diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb
index a53f09e2afc..77c62c0d930 100644
--- a/spec/controllers/groups/runners_controller_spec.rb
+++ b/spec/controllers/groups/runners_controller_spec.rb
@@ -194,205 +194,4 @@ RSpec.describe Groups::RunnersController do
end
end
end
-
- describe '#destroy' do
- context 'when user is an owner' do
- before do
- group.add_owner(user)
- end
-
- it 'destroys the runner and redirects' do
- expect_next_instance_of(Ci::Runners::UnregisterRunnerService, runner, user) do |service|
- expect(service).to receive(:execute).once.and_call_original
- end
-
- delete :destroy, params: params
-
- expect(response).to have_gitlab_http_status(:found)
- expect(Ci::Runner.find_by(id: runner.id)).to be_nil
- end
-
- it 'destroys the project runner and redirects' do
- delete :destroy, params: params_runner_project
-
- expect(response).to have_gitlab_http_status(:found)
- expect(Ci::Runner.find_by(id: runner_project.id)).to be_nil
- end
- end
-
- context 'with runner associated with multiple projects' do
- let_it_be(:project_2) { create(:project, group: group) }
-
- let(:runner_project_2) { create(:ci_runner, :project, projects: [project, project_2]) }
- let(:params_runner_project_2) { { group_id: group, id: runner_project_2 } }
-
- context 'when user is an admin', :enable_admin_mode do
- let(:user) { create(:user, :admin) }
-
- before do
- sign_in(user)
- end
-
- it 'destroys the project runner and redirects' do
- delete :destroy, params: params_runner_project_2
-
- expect(response).to have_gitlab_http_status(:found)
- expect(Ci::Runner.find_by(id: runner_project_2.id)).to be_nil
- end
- end
-
- context 'when user is an owner' do
- before do
- group.add_owner(user)
- end
-
- it 'does not destroy the project runner' do
- delete :destroy, params: params_runner_project_2
-
- expect(response).to have_gitlab_http_status(:found)
- expect(flash[:alert]).to eq('Runner cannot be deleted, please contact your administrator.')
- expect(Ci::Runner.find_by(id: runner_project_2.id)).to be_present
- end
- end
- end
-
- context 'when user is not an owner' do
- before do
- group.add_maintainer(user)
- end
-
- it 'responds 404 and does not destroy the runner' do
- delete :destroy, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(Ci::Runner.find_by(id: runner.id)).to be_present
- end
-
- it 'responds 404 and does not destroy the project runner' do
- delete :destroy, params: params_runner_project
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(Ci::Runner.find_by(id: runner_project.id)).to be_present
- end
- end
- end
-
- describe '#resume' do
- context 'when user is an owner' do
- before do
- group.add_owner(user)
- end
-
- it 'marks the runner as active, ticks the queue, and redirects' do
- runner.update!(active: false)
-
- expect do
- post :resume, params: params
- end.to change { runner.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:found)
- expect(runner.reload.active).to eq(true)
- end
-
- it 'marks the project runner as active, ticks the queue, and redirects' do
- runner_project.update!(active: false)
-
- expect do
- post :resume, params: params_runner_project
- end.to change { runner_project.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:found)
- expect(runner_project.reload.active).to eq(true)
- end
- end
-
- context 'when user is not an owner' do
- before do
- group.add_maintainer(user)
- end
-
- it 'responds 404 and does not activate the runner' do
- runner.update!(active: false)
-
- expect do
- post :resume, params: params
- end.not_to change { runner.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(runner.reload.active).to eq(false)
- end
-
- it 'responds 404 and does not activate the project runner' do
- runner_project.update!(active: false)
-
- expect do
- post :resume, params: params_runner_project
- end.not_to change { runner_project.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(runner_project.reload.active).to eq(false)
- end
- end
- end
-
- describe '#pause' do
- context 'when user is an owner' do
- before do
- group.add_owner(user)
- end
-
- it 'marks the runner as inactive, ticks the queue, and redirects' do
- runner.update!(active: true)
-
- expect do
- post :pause, params: params
- end.to change { runner.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:found)
- expect(runner.reload.active).to eq(false)
- end
-
- it 'marks the project runner as inactive, ticks the queue, and redirects' do
- runner_project.update!(active: true)
-
- expect do
- post :pause, params: params_runner_project
- end.to change { runner_project.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:found)
- expect(runner_project.reload.active).to eq(false)
- end
- end
-
- context 'when user is not an owner' do
- before do
- # Disable limit checking
- allow(runner).to receive(:runner_scope).and_return(nil)
-
- group.add_maintainer(user)
- end
-
- it 'responds 404 and does not update the runner or queue' do
- runner.update!(active: true)
-
- expect do
- post :pause, params: params
- end.not_to change { runner.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(runner.reload.active).to eq(true)
- end
-
- it 'responds 404 and does not update the project runner or queue' do
- runner_project.update!(active: true)
-
- expect do
- post :pause, params: params
- end.not_to change { runner_project.ensure_runner_queue_value }
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(runner_project.reload.active).to eq(true)
- end
- end
- end
end
diff --git a/spec/controllers/groups/settings/ci_cd_controller_spec.rb b/spec/controllers/groups/settings/ci_cd_controller_spec.rb
index f225d798886..9aa97c37add 100644
--- a/spec/controllers/groups/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/groups/settings/ci_cd_controller_spec.rb
@@ -6,14 +6,7 @@ RSpec.describe Groups::Settings::CiCdController do
include ExternalAuthorizationServiceHelpers
let_it_be(:group) { create(:group) }
- let_it_be(:sub_group) { create(:group, parent: group) }
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, group: group) }
- let_it_be(:project_2) { create(:project, group: sub_group) }
- let_it_be(:runner_group) { create(:ci_runner, :group, groups: [group]) }
- let_it_be(:runner_project_1) { create(:ci_runner, :project, projects: [project])}
- let_it_be(:runner_project_2) { create(:ci_runner, :project, projects: [project_2])}
- let_it_be(:runner_project_3) { create(:ci_runner, :project, projects: [project, project_2])}
before do
sign_in(user)
@@ -25,23 +18,11 @@ RSpec.describe Groups::Settings::CiCdController do
group.add_owner(user)
end
- it 'renders show with 200 status code and correct runners' do
+ it 'renders show with 200 status code' do
get :show, params: { group_id: group }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template(:show)
- expect(assigns(:group_runners)).to match_array([runner_group, runner_project_1, runner_project_2, runner_project_3])
- end
-
- it 'paginates runners' do
- stub_const("Groups::Settings::CiCdController::NUMBER_OF_RUNNERS_PER_PAGE", 1)
-
- create(:ci_runner)
-
- get :show, params: { group_id: group }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(assigns(:group_runners).count).to be(1)
end
end
@@ -54,7 +35,6 @@ RSpec.describe Groups::Settings::CiCdController do
get :show, params: { group_id: group }
expect(response).to have_gitlab_http_status(:not_found)
- expect(assigns(:group_runners)).to be_nil
end
end
@@ -72,38 +52,6 @@ RSpec.describe Groups::Settings::CiCdController do
end
end
- describe 'PUT #reset_registration_token' do
- subject { put :reset_registration_token, params: { group_id: group } }
-
- context 'when user is owner' do
- before do
- group.add_owner(user)
- end
-
- it 'resets runner registration token' do
- expect { subject }.to change { group.reload.runners_token }
- end
-
- it 'redirects the user to admin runners page' do
- subject
-
- expect(response).to redirect_to(group_settings_ci_cd_path)
- end
- end
-
- context 'when user is not owner' do
- before do
- group.add_maintainer(user)
- end
-
- it 'renders a 404' do
- subject
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
describe 'PATCH #update_auto_devops' do
let(:auto_devops_param) { '1' }
@@ -236,25 +184,4 @@ RSpec.describe Groups::Settings::CiCdController do
end
end
end
-
- describe 'GET #runner_setup_scripts' do
- before do
- group.add_owner(user)
- end
-
- it 'renders the setup scripts' do
- get :runner_setup_scripts, params: { os: 'linux', arch: 'amd64', group_id: group }
-
- 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', group_id: group }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response).to have_key("errors")
- end
- end
end
diff --git a/spec/controllers/groups/shared_projects_controller_spec.rb b/spec/controllers/groups/shared_projects_controller_spec.rb
index 528d5c073b7..0c5a3b9df08 100644
--- a/spec/controllers/groups/shared_projects_controller_spec.rb
+++ b/spec/controllers/groups/shared_projects_controller_spec.rb
@@ -12,9 +12,10 @@ RSpec.describe Groups::SharedProjectsController do
Projects::GroupLinks::CreateService.new(
project,
+ group,
user,
link_group_access: Gitlab::Access::DEVELOPER
- ).execute(group)
+ ).execute
end
let!(:group) { create(:group) }
diff --git a/spec/controllers/groups/uploads_controller_spec.rb b/spec/controllers/groups/uploads_controller_spec.rb
index 7dafb813545..8fcc3a7fccf 100644
--- a/spec/controllers/groups/uploads_controller_spec.rb
+++ b/spec/controllers/groups/uploads_controller_spec.rb
@@ -35,6 +35,169 @@ RSpec.describe Groups::UploadsController do
end
end
+ describe "GET #show" do
+ let(:filename) { "rails_sample.jpg" }
+ let(:user) { create(:user) }
+ let(:jpg) { fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg') }
+ let(:txt) { fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain') }
+ let(:secret) { FileUploader.generate_secret }
+ let(:uploader_class) { FileUploader }
+
+ let(:upload_service) do
+ UploadService.new(model, jpg, uploader_class).execute
+ end
+
+ let(:show_upload) do
+ get :show, params: params.merge(secret: secret, filename: filename)
+ end
+
+ before do
+ allow(FileUploader).to receive(:generate_secret).and_return(secret)
+
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:image?).and_return(true)
+ end
+
+ upload_service
+ end
+
+ context 'when the group is public' do
+ before do
+ model.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PUBLIC)
+ end
+
+ context "when not signed in" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with appropriate status" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ context "when the user doesn't have access to the model" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+ end
+
+ context 'when the group is private' do
+ before do
+ model.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ context "when not signed in" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with appropriate status" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ context "when the user doesn't have access to the model" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+ end
+ end
+
def post_authorize(verified: true)
request.headers.merge!(workhorse_internal_api_request_header) if verified
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index be30011905c..4a74eff90dc 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe GroupsController, factory_default: :keep do
let_it_be(:guest) { group.add_guest(create(:user)).user }
before do
+ stub_feature_flags(vue_issues_list: true)
enable_admin_mode!(admin_with_admin_mode)
end
@@ -71,6 +72,17 @@ RSpec.describe GroupsController, factory_default: :keep do
context 'when the group is not importing' do
it_behaves_like 'details view'
+
+ it 'tracks page views', :snowplow do
+ subject
+
+ expect_snowplow_event(
+ category: 'group_overview',
+ action: 'render',
+ user: user,
+ namespace: group
+ )
+ end
end
context 'when the group is importing' do
@@ -81,6 +93,17 @@ RSpec.describe GroupsController, factory_default: :keep do
it 'redirects to the import status page' do
expect(subject).to redirect_to group_import_path(group)
end
+
+ it 'does not track page views', :snowplow do
+ subject
+
+ expect_no_snowplow_event(
+ category: 'group_overview',
+ action: 'render',
+ user: user,
+ namespace: group
+ )
+ end
end
end
@@ -466,53 +489,12 @@ RSpec.describe GroupsController, factory_default: :keep do
end
end
- describe 'GET #issues', :sidekiq_might_not_need_inline do
- let_it_be(:issue_1) { create(:issue, project: project, title: 'foo') }
- let_it_be(:issue_2) { create(:issue, project: project, title: 'bar') }
-
+ describe 'GET #issues' do
before do
- create_list(:award_emoji, 3, awardable: issue_2)
- create_list(:award_emoji, 2, awardable: issue_1)
- create_list(:award_emoji, 2, :downvote, awardable: issue_2)
-
sign_in(user)
end
- context 'sorting by votes' do
- it 'sorts most popular issues' do
- get :issues, params: { id: group.to_param, sort: 'upvotes_desc' }
- expect(assigns(:issues)).to eq [issue_2, issue_1]
- end
-
- it 'sorts least popular issues' do
- get :issues, params: { id: group.to_param, sort: 'downvotes_desc' }
- expect(assigns(:issues)).to eq [issue_2, issue_1]
- end
- end
-
- context 'searching' do
- it 'works with popularity sort' do
- get :issues, params: { id: group.to_param, search: 'foo', sort: 'popularity' }
-
- expect(assigns(:issues)).to eq([issue_1])
- end
-
- it 'works with priority sort' do
- get :issues, params: { id: group.to_param, search: 'foo', sort: 'priority' }
-
- expect(assigns(:issues)).to eq([issue_1])
- end
-
- it 'works with label priority sort' do
- get :issues, params: { id: group.to_param, search: 'foo', sort: 'label_priority' }
-
- expect(assigns(:issues)).to eq([issue_1])
- end
- end
-
it 'saves the sort order to user preferences' do
- stub_feature_flags(vue_issues_list: true)
-
get :issues, params: { id: group.to_param, sort: 'priority' }
expect(user.reload.user_preference.issues_sort).to eq('priority')
@@ -765,7 +747,7 @@ RSpec.describe GroupsController, factory_default: :keep do
end
it 'does not update the attribute' do
- expect { subject }.not_to change { group.namespace_settings.reload.prevent_sharing_groups_outside_hierarchy }
+ expect { subject }.not_to change { group.reload.prevent_sharing_groups_outside_hierarchy }
expect(response).to have_gitlab_http_status(:not_found)
end
diff --git a/spec/controllers/jira_connect/events_controller_spec.rb b/spec/controllers/jira_connect/events_controller_spec.rb
index 5e90ceb0f9c..80375a02b33 100644
--- a/spec/controllers/jira_connect/events_controller_spec.rb
+++ b/spec/controllers/jira_connect/events_controller_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe JiraConnect::EventsController do
shared_context 'valid JWT token' do
before do
- allow_next_instance_of(Atlassian::JiraConnect::AsymmetricJwt) do |asymmetric_jwt|
+ allow_next_instance_of(Atlassian::JiraConnect::Jwt::Asymmetric) do |asymmetric_jwt|
allow(asymmetric_jwt).to receive(:valid?).and_return(true)
allow(asymmetric_jwt).to receive(:iss_claim).and_return(client_key)
end
@@ -36,7 +36,7 @@ RSpec.describe JiraConnect::EventsController do
shared_context 'invalid JWT token' do
before do
- allow_next_instance_of(Atlassian::JiraConnect::AsymmetricJwt) do |asymmetric_jwt|
+ allow_next_instance_of(Atlassian::JiraConnect::Jwt::Asymmetric) do |asymmetric_jwt|
allow(asymmetric_jwt).to receive(:valid?).and_return(false)
end
end
diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb
index e6553c027d6..7489f506674 100644
--- a/spec/controllers/oauth/authorizations_controller_spec.rb
+++ b/spec/controllers/oauth/authorizations_controller_spec.rb
@@ -56,27 +56,9 @@ RSpec.describe Oauth::AuthorizationsController do
end
end
- shared_examples "Implicit grant can't be used in confidential application" do
- context 'when application is confidential' do
- before do
- application.update!(confidential: true)
- params[:response_type] = 'token'
- end
-
- it 'does not allow the implicit flow' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template('doorkeeper/authorizations/error')
- end
- end
- end
-
describe 'GET #new' do
subject { get :new, params: params }
- include_examples "Implicit grant can't be used in confidential application"
-
context 'when the user is confirmed' do
context 'when there is already an access token for the application with a matching scope' do
before do
@@ -219,14 +201,12 @@ RSpec.describe Oauth::AuthorizationsController do
subject { post :create, params: params }
include_examples 'OAuth Authorizations require confirmed user'
- include_examples "Implicit grant can't be used in confidential application"
end
describe 'DELETE #destroy' do
subject { delete :destroy, params: params }
include_examples 'OAuth Authorizations require confirmed user'
- include_examples "Implicit grant can't be used in confidential application"
end
it 'includes Two-factor enforcement concern' do
diff --git a/spec/controllers/profiles/emails_controller_spec.rb b/spec/controllers/profiles/emails_controller_spec.rb
index e41ae406d13..b63db831462 100644
--- a/spec/controllers/profiles/emails_controller_spec.rb
+++ b/spec/controllers/profiles/emails_controller_spec.rb
@@ -62,7 +62,11 @@ RSpec.describe Profiles::EmailsController do
end
describe '#resend_confirmation_instructions' do
- let_it_be(:email) { create(:email, user: user) }
+ let_it_be(:email) do
+ travel_to(5.minutes.ago) do
+ create(:email, user: user)
+ end
+ end
let(:params) { { id: email.id } }
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index 9410fe08d0b..958fcd4360c 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -361,6 +361,7 @@ RSpec.describe Projects::ArtifactsController do
subject
expect(response).to have_gitlab_http_status(:ok)
+ expect(response.headers['Gitlab-Workhorse-Detect-Content-Type']).to eq('true')
expect(send_data).to start_with('artifacts-entry:')
expect(params.keys).to eq(%w(Archive Entry))
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index 1580ad9361d..ed11d5936b0 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -307,17 +307,36 @@ RSpec.describe Projects::BranchesController do
sign_in(developer)
end
- it 'returns 303' do
- post :destroy,
- format: :html,
- params: {
- id: 'foo/bar/baz',
- namespace_id: project.namespace,
- project_id: project
- }
+ subject(:post_request) do
+ post :destroy, format: :html, params: {
+ id: 'foo/bar/baz',
+ namespace_id: project.namespace,
+ project_id: project
+ }
+ end
+ it "returns response code 303" do
+ post_request
expect(response).to have_gitlab_http_status(:see_other)
end
+
+ context 'with http referer' do
+ before do
+ request.env['HTTP_REFERER'] = '/'
+ end
+
+ it "redirects to the referer path" do
+ post_request
+ expect(response).to redirect_to('/')
+ end
+ end
+
+ context 'without http referer' do
+ it "redirects to the project branches path" do
+ post_request
+ expect(response).to redirect_to(project_branches_path(project))
+ end
+ end
end
describe "POST destroy" do
diff --git a/spec/controllers/projects/ci/secure_files_controller_spec.rb b/spec/controllers/projects/ci/secure_files_controller_spec.rb
index 1138897bcc6..200997e31b9 100644
--- a/spec/controllers/projects/ci/secure_files_controller_spec.rb
+++ b/spec/controllers/projects/ci/secure_files_controller_spec.rb
@@ -9,17 +9,35 @@ RSpec.describe Projects::Ci::SecureFilesController do
subject(:show_request) { get :show, params: { namespace_id: project.namespace, project_id: project } }
describe 'GET #show' do
- context 'with enough privileges' do
- before do
- sign_in(user)
- project.add_developer(user)
- show_request
+ context 'when the :ci_secure_files feature flag is enabled' do
+ context 'with enough privileges' do
+ before do
+ stub_feature_flags(ci_secure_files: true)
+ sign_in(user)
+ project.add_developer(user)
+ show_request
+ end
+
+ it { expect(response).to have_gitlab_http_status(:ok) }
+
+ it 'renders show page' do
+ expect(response).to render_template :show
+ end
end
+ end
- it { expect(response).to have_gitlab_http_status(:ok) }
+ context 'when the :ci_secure_files feature flag is disabled' do
+ context 'with enough privileges' do
+ before do
+ stub_feature_flags(ci_secure_files: false)
+ sign_in(user)
+ project.add_developer(user)
+ show_request
+ end
- it 'renders show page' do
- expect(response).to render_template :show
+ it 'responds with 404' do
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
end
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index 44bdc958805..01420e30d24 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -113,103 +113,6 @@ RSpec.describe Projects::ClustersController do
end
end
- describe 'GET new' do
- def go(provider: 'gcp')
- get :new, params: {
- namespace_id: project.namespace,
- project_id: project,
- provider: provider
- }
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- describe 'functionality for new cluster' do
- context 'when omniauth has been configured' do
- let(:key) { 'secret-key' }
- let(:session_key_for_redirect_uri) do
- GoogleApi::CloudPlatform::Client.session_key_for_redirect_uri(key)
- end
-
- before do
- allow(SecureRandom).to receive(:hex).and_return(key)
- end
-
- it 'redirects to gcp authorize_url' do
- go
-
- expect(assigns(:authorize_url)).to include(key)
- expect(session[session_key_for_redirect_uri]).to eq(new_project_cluster_path(project, provider: :gcp))
- expect(response).to redirect_to(assigns(:authorize_url))
- end
- end
-
- context 'when omniauth has not configured' do
- before do
- stub_omniauth_setting(providers: [])
- end
-
- it 'does not have authorize_url' do
- go
-
- expect(assigns(:authorize_url)).to be_nil
- end
- end
-
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'has new object' do
- go
-
- expect(assigns(:gcp_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'functionality for existing cluster' do
- it 'has new object' do
- go
-
- expect(assigns(:user_cluster)).to be_an_instance_of(Clusters::ClusterPresenter)
- end
- end
-
- include_examples 'GET new cluster shared examples'
-
- describe 'security' do
- it 'is allowed for admin when admin mode enabled', :enable_admin_mode do
- expect { go }.to be_allowed_for(:admin)
- end
- it 'is disabled for admin when admin mode disabled' do
- expect { go }.to be_denied_for(:admin)
- end
- it { expect { go }.to be_allowed_for(:owner).of(project) }
- it { expect { go }.to be_allowed_for(:maintainer).of(project) }
- it { expect { go }.to be_denied_for(:developer).of(project) }
- it { expect { go }.to be_denied_for(:reporter).of(project) }
- it { expect { go }.to be_denied_for(:guest).of(project) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'GET #prometheus_proxy' do
let(:proxyable) do
create(:cluster, :provided_by_gcp, projects: [project])
@@ -252,107 +155,6 @@ RSpec.describe Projects::ClustersController do
end
end
- describe 'POST create for new cluster' do
- let(:legacy_abac_param) { 'true' }
- let(:params) do
- {
- cluster: {
- name: 'new-cluster',
- managed: '1',
- namespace_per_environment: '0',
- provider_gcp_attributes: {
- gcp_project_id: 'gcp-project-12345',
- legacy_abac: legacy_abac_param
- }
- }
- }
- end
-
- def go
- post :create_gcp, params: params.merge(namespace_id: project.namespace, project_id: project)
- end
-
- include_examples ':certificate_based_clusters feature flag controller responses' do
- let(:subject) { go }
- end
-
- describe 'functionality' do
- context 'when access token is valid' do
- before do
- stub_google_api_validate_token
- end
-
- it 'creates a new cluster' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { go }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
- expect(response).to redirect_to(project_cluster_path(project, project.clusters.first))
- expect(project.clusters.first).to be_gcp
- expect(project.clusters.first).to be_kubernetes
- expect(project.clusters.first.provider_gcp).to be_legacy_abac
- expect(project.clusters.first.managed?).to be_truthy
- expect(project.clusters.first.namespace_per_environment?).to be_falsy
- end
-
- context 'when legacy_abac param is false' do
- let(:legacy_abac_param) { 'false' }
-
- it 'creates a new cluster with legacy_abac_disabled' do
- expect(ClusterProvisionWorker).to receive(:perform_async)
- expect { go }.to change { Clusters::Cluster.count }
- .and change { Clusters::Providers::Gcp.count }
- expect(project.clusters.first.provider_gcp).not_to be_legacy_abac
- end
- end
- end
-
- context 'when access token is expired' do
- before do
- stub_google_api_expired_token
- end
-
- it { expect(@valid_gcp_token).to be_falsey }
- end
-
- context 'when access token is not stored in session' do
- it { expect(@valid_gcp_token).to be_falsey }
- end
- end
-
- describe 'security' do
- before do
- allow_any_instance_of(described_class)
- .to receive(:token_in_session).and_return('token')
- allow_any_instance_of(described_class)
- .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
- allow_any_instance_of(GoogleApi::CloudPlatform::Client)
- .to receive(:projects_zones_clusters_create) do
- double(
- 'secure',
- self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
- status: 'RUNNING'
- )
- end
-
- allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
- end
-
- it 'is allowed for admin when admin mode enabled', :enable_admin_mode do
- expect { go }.to be_allowed_for(:admin)
- end
- it 'is disabled for admin when admin mode disabled' do
- expect { go }.to be_denied_for(:admin)
- end
- it { expect { go }.to be_allowed_for(:owner).of(project) }
- it { expect { go }.to be_allowed_for(:maintainer).of(project) }
- it { expect { go }.to be_denied_for(:developer).of(project) }
- it { expect { go }.to be_denied_for(:reporter).of(project) }
- it { expect { go }.to be_denied_for(:guest).of(project) }
- it { expect { go }.to be_denied_for(:user) }
- it { expect { go }.to be_denied_for(:external) }
- end
- end
-
describe 'POST create for existing cluster' do
let(:params) do
{
diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb
index f4cad5790a3..f63e0cea04c 100644
--- a/spec/controllers/projects/environments_controller_spec.rb
+++ b/spec/controllers/projects/environments_controller_spec.rb
@@ -208,6 +208,17 @@ RSpec.describe Projects::EnvironmentsController do
expect(response).to have_gitlab_http_status(:not_found)
end
end
+
+ it_behaves_like 'avoids N+1 queries on environment detail page'
+
+ def create_deployment_with_associations(sequence:)
+ commit = project.commit("HEAD~#{sequence}")
+ create(:user, email: commit.author_email)
+
+ deployer = create(:user)
+ build = create(:ci_build, environment: environment.name, pipeline: create(:ci_pipeline, project: environment.project), user: deployer)
+ create(:deployment, :success, environment: environment, deployable: build, user: deployer, project: project, sha: commit.sha)
+ end
end
describe 'GET edit' do
diff --git a/spec/controllers/projects/error_tracking/projects_controller_spec.rb b/spec/controllers/projects/error_tracking/projects_controller_spec.rb
index 67947d1c9d9..7529c701b2b 100644
--- a/spec/controllers/projects/error_tracking/projects_controller_spec.rb
+++ b/spec/controllers/projects/error_tracking/projects_controller_spec.rb
@@ -6,18 +6,21 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
+ before_all do
+ project.add_maintainer(user)
+ end
+
before do
sign_in(user)
- project.add_maintainer(user)
end
describe 'GET #index' do
context 'with insufficient permissions' do
- before do
- project.add_guest(user)
- end
+ let(:user) { create(:user) }
it 'returns 404' do
+ project.add_guest(user)
+
get :index, params: list_projects_params
expect(response).to have_gitlab_http_status(:not_found)
@@ -37,8 +40,8 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
end
context 'with authorized user' do
- let(:list_projects_service) { spy(:list_projects_service) }
- let(:sentry_project) { build(:error_tracking_project) }
+ let(:list_projects_service) { instance_double('ErrorTracking::ListProjectsService') }
+ let(:sentry_project) { build_stubbed(:error_tracking_project) }
let(:query_params) do
list_projects_params.slice(:api_host, :token)
@@ -50,9 +53,9 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
.and_return(list_projects_service)
end
- context 'service result is successful' do
+ context 'when service result is successful' do
before do
- expect(list_projects_service).to receive(:execute)
+ allow(list_projects_service).to receive(:execute)
.and_return(status: :success, projects: [sentry_project])
end
@@ -65,12 +68,12 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
end
end
- context 'service result is erroneous' do
+ context 'with service result is erroneous' do
let(:error_message) { 'error message' }
context 'without http_status' do
before do
- expect(list_projects_service).to receive(:execute)
+ allow(list_projects_service).to receive(:execute)
.and_return(status: :error, message: error_message)
end
@@ -86,7 +89,7 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
let(:http_status) { :no_content }
before do
- expect(list_projects_service).to receive(:execute).and_return(
+ allow(list_projects_service).to receive(:execute).and_return(
status: :error,
message: error_message,
http_status: http_status
@@ -106,11 +109,7 @@ RSpec.describe Projects::ErrorTracking::ProjectsController do
private
def list_projects_params(opts = {})
- project_params(
- format: :json,
- api_host: 'gitlab.com',
- token: 'token'
- )
+ project_params(format: :json, api_host: 'gitlab.com', token: 'token')
end
end
diff --git a/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb b/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb
index 19b6b597a84..e011428adde 100644
--- a/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb
+++ b/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb
@@ -6,30 +6,34 @@ RSpec.describe Projects::ErrorTracking::StackTracesController do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
+ before_all do
+ project.add_maintainer(user)
+ end
+
before do
sign_in(user)
- project.add_maintainer(user)
end
describe 'GET #index' do
let(:issue_id) { non_existing_record_id }
- let(:issue_stack_trace_service) { spy(:issue_stack_trace_service) }
+ let(:issue_latest_event_service) { instance_double('ErrorTracking::IssueLatestEventService') }
subject(:get_stack_trace) do
get :index, params: { namespace_id: project.namespace, project_id: project, issue_id: issue_id, format: :json }
end
before do
- expect(ErrorTracking::IssueLatestEventService)
+ allow(ErrorTracking::IssueLatestEventService)
.to receive(:new).with(project, user, issue_id: issue_id.to_s)
- .and_return(issue_stack_trace_service)
- expect(issue_stack_trace_service).to receive(:execute).and_return(service_response)
+ .and_return(issue_latest_event_service)
+
+ allow(issue_latest_event_service).to receive(:execute).and_return(service_response)
get_stack_trace
end
- context 'awaiting data' do
- let(:service_response) { { status: :error, http_status: :no_content }}
+ context 'when awaiting data' do
+ let(:service_response) { { status: :error, http_status: :no_content } }
it 'responds with no data' do
expect(response).to have_gitlab_http_status(:no_content)
@@ -38,19 +42,14 @@ RSpec.describe Projects::ErrorTracking::StackTracesController do
it_behaves_like 'sets the polling header'
end
- context 'service result is successful' do
+ context 'when service result is successful' do
let(:service_response) { { status: :success, latest_event: error_event } }
- let(:error_event) { build(:error_tracking_sentry_error_event) }
+ let(:error_event) { build_stubbed(:error_tracking_sentry_error_event) }
- it 'responds with success' do
+ it 'highlights stack trace source code' do
expect(response).to have_gitlab_http_status(:ok)
- end
-
- it 'responds with error' do
expect(response).to match_response_schema('error_tracking/issue_stack_trace')
- end
- it 'highlights stack trace source code' do
expect(json_response['error']).to eq(
Gitlab::ErrorTracking::StackTraceHighlightDecorator.decorate(error_event).as_json
)
@@ -59,7 +58,7 @@ RSpec.describe Projects::ErrorTracking::StackTracesController do
it_behaves_like 'sets the polling header'
end
- context 'service result is erroneous' do
+ context 'when service result is erroneous' do
let(:error_message) { 'error message' }
context 'without http_status' do
@@ -67,9 +66,6 @@ RSpec.describe Projects::ErrorTracking::StackTracesController do
it 'responds with bad request' do
expect(response).to have_gitlab_http_status(:bad_request)
- end
-
- it 'responds with error message' do
expect(json_response['message']).to eq(error_message)
end
end
@@ -80,9 +76,6 @@ RSpec.describe Projects::ErrorTracking::StackTracesController do
it 'responds with custom http status' do
expect(response).to have_gitlab_http_status(http_status)
- end
-
- it 'responds with error message' do
expect(json_response['message']).to eq(error_message)
end
end
diff --git a/spec/controllers/projects/error_tracking_controller_spec.rb b/spec/controllers/projects/error_tracking_controller_spec.rb
index b4f21e070c6..cf0e481495c 100644
--- a/spec/controllers/projects/error_tracking_controller_spec.rb
+++ b/spec/controllers/projects/error_tracking_controller_spec.rb
@@ -6,9 +6,12 @@ RSpec.describe Projects::ErrorTrackingController do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
+ before_all do
+ project.add_maintainer(user)
+ end
+
before do
sign_in(user)
- project.add_maintainer(user)
end
describe 'GET #index' do
@@ -46,18 +49,18 @@ RSpec.describe Projects::ErrorTrackingController do
end
describe 'format json' do
- let(:list_issues_service) { spy(:list_issues_service) }
+ let(:list_issues_service) { instance_double('ErrorTracking::ListIssuesService') }
let(:external_url) { 'http://example.com' }
- context 'no data' do
+ context 'with no data' do
let(:permitted_params) { permit_index_parameters!({}) }
before do
- expect(ErrorTracking::ListIssuesService)
+ allow(ErrorTracking::ListIssuesService)
.to receive(:new).with(project, user, permitted_params)
.and_return(list_issues_service)
- expect(list_issues_service).to receive(:execute)
+ allow(list_issues_service).to receive(:execute)
.and_return(status: :error, http_status: :no_content)
end
@@ -76,22 +79,22 @@ RSpec.describe Projects::ErrorTrackingController do
let(:permitted_params) { permit_index_parameters!(search_term: search_term, sort: sort, cursor: cursor) }
before do
- expect(ErrorTracking::ListIssuesService)
+ allow(ErrorTracking::ListIssuesService)
.to receive(:new).with(project, user, permitted_params)
.and_return(list_issues_service)
end
- context 'service result is successful' do
+ context 'when service result is successful' do
before do
- expect(list_issues_service).to receive(:execute)
+ allow(list_issues_service).to receive(:execute)
.and_return(status: :success, issues: [error], pagination: {})
- expect(list_issues_service).to receive(:external_url)
+ allow(list_issues_service).to receive(:external_url)
.and_return(external_url)
get :index, params: params
end
- let(:error) { build(:error_tracking_sentry_error) }
+ let(:error) { build_stubbed(:error_tracking_sentry_error) }
it 'returns a list of errors' do
expect(response).to have_gitlab_http_status(:ok)
@@ -109,16 +112,16 @@ RSpec.describe Projects::ErrorTrackingController do
context 'without extra params' do
before do
- expect(ErrorTracking::ListIssuesService)
+ allow(ErrorTracking::ListIssuesService)
.to receive(:new).with(project, user, permit_index_parameters!({}))
.and_return(list_issues_service)
end
- context 'service result is successful' do
+ context 'when service result is successful' do
before do
- expect(list_issues_service).to receive(:execute)
+ allow(list_issues_service).to receive(:execute)
.and_return(status: :success, issues: [error], pagination: {})
- expect(list_issues_service).to receive(:external_url)
+ allow(list_issues_service).to receive(:external_url)
.and_return(external_url)
end
@@ -137,12 +140,12 @@ RSpec.describe Projects::ErrorTrackingController do
end
end
- context 'service result is erroneous' do
+ context 'when service result is erroneous' do
let(:error_message) { 'error message' }
context 'without http_status' do
before do
- expect(list_issues_service).to receive(:execute)
+ allow(list_issues_service).to receive(:execute)
.and_return(status: :error, message: error_message)
end
@@ -158,7 +161,7 @@ RSpec.describe Projects::ErrorTrackingController do
let(:http_status) { :no_content }
before do
- expect(list_issues_service).to receive(:execute).and_return(
+ allow(list_issues_service).to receive(:execute).and_return(
status: :error,
message: error_message,
http_status: http_status
@@ -189,7 +192,7 @@ RSpec.describe Projects::ErrorTrackingController do
describe 'GET #issue_details' do
let_it_be(:issue_id) { non_existing_record_id }
- let(:issue_details_service) { spy(:issue_details_service) }
+ let(:issue_details_service) { instance_double('ErrorTracking::IssueDetailsService') }
let(:permitted_params) do
ActionController::Parameters.new(
@@ -199,15 +202,15 @@ RSpec.describe Projects::ErrorTrackingController do
end
before do
- expect(ErrorTracking::IssueDetailsService)
+ allow(ErrorTracking::IssueDetailsService)
.to receive(:new).with(project, user, permitted_params)
.and_return(issue_details_service)
end
describe 'format json' do
- context 'no data' do
+ context 'with no data' do
before do
- expect(issue_details_service).to receive(:execute)
+ allow(issue_details_service).to receive(:execute)
.and_return(status: :error, http_status: :no_content)
get :details, params: issue_params(issue_id: issue_id, format: :json)
end
@@ -219,15 +222,15 @@ RSpec.describe Projects::ErrorTrackingController do
it_behaves_like 'sets the polling header'
end
- context 'service result is successful' do
+ context 'when service result is successful' do
before do
- expect(issue_details_service).to receive(:execute)
+ allow(issue_details_service).to receive(:execute)
.and_return(status: :success, issue: error)
get :details, params: issue_params(issue_id: issue_id, format: :json)
end
- let(:error) { build(:error_tracking_sentry_detailed_error) }
+ let(:error) { build_stubbed(:error_tracking_sentry_detailed_error) }
it 'returns an error' do
expected_error = error.as_json.except('first_release_version').merge(
@@ -245,12 +248,12 @@ RSpec.describe Projects::ErrorTrackingController do
it_behaves_like 'sets the polling header'
end
- context 'service result is erroneous' do
+ context 'when service result is erroneous' do
let(:error_message) { 'error message' }
context 'without http_status' do
before do
- expect(issue_details_service).to receive(:execute)
+ allow(issue_details_service).to receive(:execute)
.and_return(status: :error, message: error_message)
end
@@ -266,7 +269,7 @@ RSpec.describe Projects::ErrorTrackingController do
let(:http_status) { :no_content }
before do
- expect(issue_details_service).to receive(:execute).and_return(
+ allow(issue_details_service).to receive(:execute).and_return(
status: :error,
message: error_message,
http_status: http_status
@@ -286,7 +289,7 @@ RSpec.describe Projects::ErrorTrackingController do
describe 'PUT #update' do
let(:issue_id) { non_existing_record_id }
- let(:issue_update_service) { spy(:issue_update_service) }
+ let(:issue_update_service) { instance_double('ErrorTracking::IssueUpdateService') }
let(:permitted_params) do
ActionController::Parameters.new(
{ issue_id: issue_id.to_s, status: 'resolved' }
@@ -298,15 +301,15 @@ RSpec.describe Projects::ErrorTrackingController do
end
before do
- expect(ErrorTracking::IssueUpdateService)
+ allow(ErrorTracking::IssueUpdateService)
.to receive(:new).with(project, user, permitted_params)
.and_return(issue_update_service)
end
describe 'format json' do
- context 'update result is successful' do
+ context 'when update result is successful' do
before do
- expect(issue_update_service).to receive(:execute)
+ allow(issue_update_service).to receive(:execute)
.and_return(status: :success, updated: true, closed_issue_iid: non_existing_record_iid)
update_issue
@@ -318,11 +321,11 @@ RSpec.describe Projects::ErrorTrackingController do
end
end
- context 'update result is erroneous' do
+ context 'when update result is erroneous' do
let(:error_message) { 'error message' }
before do
- expect(issue_update_service).to receive(:execute)
+ allow(issue_update_service).to receive(:execute)
.and_return(status: :error, message: error_message)
update_issue
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index ce0af784cdf..8a03c1e709b 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -12,6 +12,10 @@ RSpec.describe Projects::IssuesController do
let(:issue) { create(:issue, project: project) }
let(:spam_action_response_fields) { { 'stub_spam_action_response_fields' => true } }
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
+
describe "GET #index" do
context 'external issue tracker' do
before do
@@ -72,22 +76,6 @@ RSpec.describe Projects::IssuesController do
project.add_developer(user)
end
- context 'when issues_full_text_search is disabled' do
- before do
- stub_feature_flags(issues_full_text_search: false)
- end
-
- it_behaves_like 'issuables list meta-data', :issue
- end
-
- context 'when issues_full_text_search is enabled' do
- before do
- stub_feature_flags(issues_full_text_search: true)
- end
-
- it_behaves_like 'issuables list meta-data', :issue
- end
-
it_behaves_like 'set sort order from user preference' do
let(:sorting_param) { 'updated_asc' }
end
@@ -98,16 +86,6 @@ RSpec.describe Projects::IssuesController do
expect(response).to have_gitlab_http_status(:ok)
end
- it 'returns only list type issues' do
- issue = create(:issue, project: project)
- incident = create(:issue, project: project, issue_type: 'incident')
- create(:issue, project: project, issue_type: 'test_case')
-
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(assigns(:issues)).to contain_exactly(issue, incident)
- end
-
it "returns 301 if request path doesn't match project path" do
get :index, params: { namespace_id: project.namespace, project_id: project.path.upcase }
@@ -123,17 +101,10 @@ RSpec.describe Projects::IssuesController do
end
end
- it_behaves_like 'issuable list with anonymous search disabled' do
- let(:params) { { namespace_id: project.namespace, project_id: project } }
-
- before do
- project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- end
- end
-
- it_behaves_like 'paginated collection' do
+ describe 'pagination' do
let!(:issue_list) { create_list(:issue, 2, project: project) }
let(:collection) { project.issues }
+ let(:last_page) { collection.page.total_pages }
let(:params) do
{
namespace_id: project.namespace.to_param,
@@ -154,46 +125,6 @@ RSpec.describe Projects::IssuesController do
expect(response).to have_gitlab_http_status(:redirect)
expect(response).to redirect_to(action: 'index', format: 'atom', page: last_page, state: 'opened')
end
-
- it 'does not use pagination if disabled' do
- allow(controller).to receive(:pagination_disabled?).and_return(true)
-
- get :index, params: params.merge(page: last_page + 1)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(assigns(:issues).size).to eq(2)
- end
- end
-
- context 'with relative_position sorting' do
- let!(:issue_list) { create_list(:issue, 2, project: project) }
-
- before do
- sign_in(user)
- project.add_developer(user)
- allow(Kaminari.config).to receive(:default_per_page).and_return(1)
- end
-
- it 'overrides the number allowed on the page' do
- get :index,
- params: {
- namespace_id: project.namespace.to_param,
- project_id: project,
- sort: 'relative_position'
- }
-
- expect(assigns(:issues).count).to eq 2
- end
-
- it 'allows the default number on the page' do
- get :index,
- params: {
- namespace_id: project.namespace.to_param,
- project_id: project
- }
-
- expect(assigns(:issues).count).to eq 1
- end
end
context 'external authorization' do
@@ -746,84 +677,6 @@ RSpec.describe Projects::IssuesController do
let_it_be(:unescaped_parameter_value) { create(:issue, :confidential, project: project, author: author) }
let_it_be(:request_forgery_timing_attack) { create(:issue, :confidential, project: project, assignees: [assignee]) }
- describe 'GET #index' do
- it 'does not list confidential issues for guests' do
- sign_out(:user)
- get_issues
-
- expect(assigns(:issues)).to eq [issue]
- end
-
- it 'does not list confidential issues for non project members' do
- sign_in(non_member)
- get_issues
-
- expect(assigns(:issues)).to eq [issue]
- end
-
- it 'does not list confidential issues for project members with guest role' do
- sign_in(member)
- project.add_guest(member)
-
- get_issues
-
- expect(assigns(:issues)).to eq [issue]
- end
-
- it 'lists confidential issues for author' do
- sign_in(author)
- get_issues
-
- expect(assigns(:issues)).to include unescaped_parameter_value
- expect(assigns(:issues)).not_to include request_forgery_timing_attack
- end
-
- it 'lists confidential issues for assignee' do
- sign_in(assignee)
- get_issues
-
- expect(assigns(:issues)).not_to include unescaped_parameter_value
- expect(assigns(:issues)).to include request_forgery_timing_attack
- end
-
- it 'lists confidential issues for project members' do
- sign_in(member)
- project.add_developer(member)
-
- get_issues
-
- expect(assigns(:issues)).to include unescaped_parameter_value
- expect(assigns(:issues)).to include request_forgery_timing_attack
- end
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it 'lists confidential issues for admin' do
- sign_in(admin)
- get_issues
-
- expect(assigns(:issues)).to include unescaped_parameter_value
- expect(assigns(:issues)).to include request_forgery_timing_attack
- end
- end
-
- context 'when admin mode is disabled' do
- it 'does not list confidential issues for admin' do
- sign_in(admin)
- get_issues
-
- expect(assigns(:issues)).to eq [issue]
- end
- end
-
- def get_issues
- get :index,
- params: {
- namespace_id: project.namespace.to_param,
- project_id: project
- }
- end
- end
-
shared_examples_for 'restricted action' do |http_status|
it 'returns 404 for guests' do
sign_out(:user)
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb
index e9f1232b5e7..162c36f5069 100644
--- a/spec/controllers/projects/jobs_controller_spec.rb
+++ b/spec/controllers/projects/jobs_controller_spec.rb
@@ -929,13 +929,13 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do
context 'when continue url is present' do
let(:job) { create(:ci_build, :cancelable, pipeline: pipeline) }
+ before do
+ post_cancel(continue: { to: url })
+ end
+
context 'when continue to is a safe url' do
let(:url) { '/test' }
- before do
- post_cancel(continue: { to: url })
- end
-
it 'redirects to the continue url' do
expect(response).to have_gitlab_http_status(:found)
expect(response).to redirect_to(url)
@@ -949,8 +949,9 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do
context 'when continue to is not a safe url' do
let(:url) { 'http://example.com' }
- it 'raises an error' do
- expect { cancel_with_redirect(url) }.to raise_error
+ it 'redirects to the builds page' do
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to(builds_namespace_project_pipeline_path(id: pipeline.id))
end
end
end
diff --git a/spec/controllers/projects/logs_controller_spec.rb b/spec/controllers/projects/logs_controller_spec.rb
index d5c602df41d..1c81ae93b42 100644
--- a/spec/controllers/projects/logs_controller_spec.rb
+++ b/spec/controllers/projects/logs_controller_spec.rb
@@ -47,6 +47,20 @@ RSpec.describe Projects::LogsController do
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|
@@ -103,14 +117,6 @@ RSpec.describe Projects::LogsController do
expect(json_response).to eq(service_result_json)
end
- it 'registers a usage of the endpoint' do
- expect(::Gitlab::UsageCounters::PodLogs).to receive(:increment).with(project.id)
-
- get endpoint, params: environment_params(pod_name: pod_name, format: :json)
-
- expect(response).to have_gitlab_http_status(:success)
- end
-
it 'sets the polling header' do
get endpoint, params: environment_params(pod_name: pod_name, format: :json)
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 8fae82d54a2..1be4177acd1 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -19,6 +19,27 @@ RSpec.describe Projects::PipelinesController do
sign_in(user)
end
+ shared_examples 'the show page' do |param|
+ it 'redirects to pipeline path with param' do
+ get param, params: { namespace_id: project.namespace, project_id: project, id: pipeline }
+
+ expect(response).to redirect_to(pipeline_path(pipeline, tab: param))
+ end
+
+ context 'when the FF pipeline_tabs_vue is disabled' do
+ before do
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
+ it 'renders the show template' do
+ get param, params: { namespace_id: project.namespace, project_id: project, id: pipeline }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template :show
+ end
+ end
+ end
+
describe 'GET index.json' do
before do
create_all_pipeline_types
@@ -625,6 +646,12 @@ RSpec.describe Projects::PipelinesController do
end
end
+ describe 'GET dag' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ it_behaves_like 'the show page', 'dag'
+ end
+
describe 'GET dag.json' do
let(:pipeline) { create(:ci_pipeline, project: project) }
@@ -658,6 +685,49 @@ RSpec.describe Projects::PipelinesController do
end
end
+ describe 'GET builds' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ it_behaves_like 'the show page', 'builds'
+ end
+
+ describe 'GET failures' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ context 'with ff `pipeline_tabs_vue` disabled' do
+ before do
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
+ context 'with failed jobs' do
+ before do
+ create(:ci_build, :failed, pipeline: pipeline, name: 'hello')
+ end
+
+ it 'shows the page' do
+ get :failures, params: { namespace_id: project.namespace, project_id: project, id: pipeline }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template :show
+ end
+ end
+
+ context 'without failed jobs' do
+ it 'redirects to the main pipeline page' do
+ get :failures, params: { namespace_id: project.namespace, project_id: project, id: pipeline }
+
+ expect(response).to redirect_to(pipeline_path(pipeline))
+ end
+ end
+ end
+
+ it 'redirects to the pipeline page with `failures` query param' do
+ get :failures, params: { namespace_id: project.namespace, project_id: project, id: pipeline }
+
+ expect(response).to redirect_to(pipeline_path(pipeline, tab: 'failures'))
+ end
+ end
+
describe 'GET stages.json' do
let(:pipeline) { create(:ci_pipeline, project: project) }
@@ -988,6 +1058,12 @@ RSpec.describe Projects::PipelinesController do
end
end
+ describe 'GET test_report' do
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ it_behaves_like 'the show page', 'test_report'
+ end
+
describe 'GET test_report.json' do
let(:pipeline) { create(:ci_pipeline, project: project) }
diff --git a/spec/controllers/projects/prometheus/alerts_controller_spec.rb b/spec/controllers/projects/prometheus/alerts_controller_spec.rb
index d66ad445c32..f42119e7811 100644
--- a/spec/controllers/projects/prometheus/alerts_controller_spec.rb
+++ b/spec/controllers/projects/prometheus/alerts_controller_spec.rb
@@ -226,137 +226,6 @@ RSpec.describe Projects::Prometheus::AlertsController do
end
end
- describe 'POST #create' do
- let(:schedule_update_service) { spy }
-
- let(:alert_params) do
- {
- 'title' => metric.title,
- 'query' => metric.query,
- 'operator' => '>',
- 'threshold' => 1.0,
- 'runbook_url' => 'https://sample.runbook.com'
- }
- end
-
- def make_request(opts = {})
- post :create, params: request_params(
- opts,
- operator: '>',
- threshold: '1',
- runbook_url: 'https://sample.runbook.com',
- environment_id: environment,
- prometheus_metric_id: metric
- )
- end
-
- it 'creates a new prometheus alert' do
- allow(::Clusters::Applications::ScheduleUpdateService)
- .to receive(:new).and_return(schedule_update_service)
-
- make_request
-
- expect(schedule_update_service).to have_received(:execute)
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to include(alert_params)
- end
-
- it 'returns bad_request for an invalid metric' do
- make_request(prometheus_metric_id: 'invalid')
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
-
- it_behaves_like 'unprivileged'
- it_behaves_like 'project non-specific environment', :bad_request
- end
-
- describe 'PUT #update' do
- let(:schedule_update_service) { spy }
-
- let(:alert) do
- create(:prometheus_alert,
- project: project,
- environment: environment,
- prometheus_metric: metric)
- end
-
- let(:alert_params) do
- {
- 'id' => alert.id,
- 'title' => alert.title,
- 'query' => alert.query,
- 'operator' => '<',
- 'threshold' => alert.threshold,
- 'alert_path' => alert_path(alert)
- }
- end
-
- before do
- allow(::Clusters::Applications::ScheduleUpdateService)
- .to receive(:new).and_return(schedule_update_service)
- end
-
- def make_request(opts = {})
- put :update, params: request_params(
- opts,
- id: alert.prometheus_metric_id,
- operator: '<',
- environment_id: alert.environment
- )
- end
-
- it 'updates an already existing prometheus alert' do
- expect { make_request(operator: '<') }
- .to change { alert.reload.operator }.to('lt')
-
- expect(schedule_update_service).to have_received(:execute)
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to include(alert_params)
- end
-
- it 'returns bad_request for an invalid alert data' do
- make_request(runbook_url: 'bad-url')
-
- expect(response).to have_gitlab_http_status(:bad_request)
- end
-
- it_behaves_like 'unprivileged'
- it_behaves_like 'project non-specific environment', :not_found
- it_behaves_like 'project non-specific metric', :not_found
- end
-
- describe 'DELETE #destroy' do
- let(:schedule_update_service) { spy }
-
- let!(:alert) do
- create(:prometheus_alert, project: project, prometheus_metric: metric)
- end
-
- before do
- allow(::Clusters::Applications::ScheduleUpdateService)
- .to receive(:new).and_return(schedule_update_service)
- end
-
- def make_request(opts = {})
- delete :destroy, params: request_params(
- opts,
- id: alert.prometheus_metric_id,
- environment_id: alert.environment
- )
- end
-
- it 'destroys the specified prometheus alert' do
- expect { make_request }.to change { PrometheusAlert.count }.by(-1)
-
- expect(schedule_update_service).to have_received(:execute)
- end
-
- it_behaves_like 'unprivileged'
- it_behaves_like 'project non-specific environment', :not_found
- it_behaves_like 'project non-specific metric', :not_found
- end
-
describe 'GET #metrics_dashboard' do
let!(:alert) do
create(:prometheus_alert,
diff --git a/spec/controllers/projects/releases_controller_spec.rb b/spec/controllers/projects/releases_controller_spec.rb
index 9dd18e58109..0dba7dab643 100644
--- a/spec/controllers/projects/releases_controller_spec.rb
+++ b/spec/controllers/projects/releases_controller_spec.rb
@@ -78,14 +78,12 @@ RSpec.describe Projects::ReleasesController do
end
describe 'GET #index' do
- before do
- get_index
- end
-
context 'as html' do
let(:format) { :html }
it 'returns a text/html content_type' do
+ get_index
+
expect(response.media_type).to eq 'text/html'
end
@@ -95,6 +93,8 @@ RSpec.describe Projects::ReleasesController do
let(:project) { private_project }
it 'returns a redirect' do
+ get_index
+
expect(response).to have_gitlab_http_status(:redirect)
end
end
@@ -104,11 +104,24 @@ RSpec.describe Projects::ReleasesController do
let(:format) { :json }
it 'returns an application/json content_type' do
+ get_index
+
expect(response.media_type).to eq 'application/json'
end
it "returns the project's releases as JSON, ordered by released_at" do
- expect(response.body).to eq([release_2, release_1].to_json)
+ get_index
+
+ expect(json_response.map { |release| release["id"] } ).to eq([release_2.id, release_1.id])
+ end
+
+ # TODO: remove in https://gitlab.com/gitlab-org/gitlab/-/issues/360903
+ it "returns release sha when remove_sha_from_releases_json is disabled" do
+ stub_feature_flags(remove_sha_from_releases_json: false)
+
+ get_index
+
+ expect(json_response).to eq([release_2, release_1].as_json)
end
it_behaves_like 'common access controls'
@@ -117,6 +130,8 @@ RSpec.describe Projects::ReleasesController do
let(:project) { private_project }
it 'returns a redirect' do
+ get_index
+
expect(response).to have_gitlab_http_status(:redirect)
end
end
diff --git a/spec/controllers/projects/serverless/functions_controller_spec.rb b/spec/controllers/projects/serverless/functions_controller_spec.rb
deleted file mode 100644
index f8cee09006c..00000000000
--- a/spec/controllers/projects/serverless/functions_controller_spec.rb
+++ /dev/null
@@ -1,341 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Serverless::FunctionsController do
- include KubernetesHelpers
- include ReactiveCachingHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
- let(:service) { cluster.platform_kubernetes }
- let(:environment) { create(:environment, project: project) }
- let!(:deployment) { create(:deployment, :success, environment: environment, cluster: cluster) }
- let(:knative_services_finder) { environment.knative_services_finder }
- let(:function_description) { 'A serverless function' }
- let(:function_name) { 'some-function-name' }
- let(:knative_stub_options) do
- { namespace: namespace.namespace, name: function_name, description: function_description }
- end
-
- let(:knative) { create(:clusters_applications_knative, :installed, cluster: cluster) }
-
- let(:namespace) do
- create(:cluster_kubernetes_namespace,
- cluster: cluster,
- cluster_project: cluster.cluster_project,
- project: cluster.cluster_project.project,
- environment: environment)
- end
-
- before do
- project.add_maintainer(user)
- sign_in(user)
- end
-
- def params(opts = {})
- opts.reverse_merge(namespace_id: project.namespace.to_param,
- project_id: project.to_param)
- end
-
- shared_examples_for 'behind :deprecated_serverless feature flag' do
- before do
- stub_feature_flags(deprecated_serverless: false)
- end
-
- it 'returns 404' do
- action
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- describe 'GET #index' do
- let(:expected_json) { { 'knative_installed' => knative_state, 'functions' => functions } }
-
- it_behaves_like 'behind :deprecated_serverless feature flag' do
- let(:action) { get :index, params: params({ format: :json }) }
- end
-
- context 'when cache is being read' do
- let(:knative_state) { 'checking' }
- let(:functions) { [] }
-
- before do
- get :index, params: params({ format: :json })
- end
-
- it 'returns checking' do
- expect(json_response).to eq expected_json
- end
-
- it { expect(response).to have_gitlab_http_status(:ok) }
- end
-
- context 'when cache is ready' do
- let(:knative_state) { true }
-
- before do
- allow(Clusters::KnativeServicesFinder)
- .to receive(:new)
- .and_return(knative_services_finder)
- synchronous_reactive_cache(knative_services_finder)
- stub_kubeclient_service_pods(
- kube_response({ "kind" => "PodList", "items" => [] }),
- namespace: namespace.namespace
- )
- end
-
- context 'when no functions were found' do
- let(:functions) { [] }
-
- before do
- stub_kubeclient_knative_services(
- namespace: namespace.namespace,
- response: kube_response({ "kind" => "ServiceList", "items" => [] })
- )
- get :index, params: params({ format: :json })
- end
-
- it 'returns checking' do
- expect(json_response).to eq expected_json
- end
-
- it { expect(response).to have_gitlab_http_status(:ok) }
- end
-
- context 'when functions were found' do
- let(:functions) { [{}, {}] }
-
- before do
- stub_kubeclient_knative_services(namespace: namespace.namespace, cluster_id: cluster.id, name: function_name)
- end
-
- it 'returns functions' do
- get :index, params: params({ format: :json })
- expect(json_response["functions"]).not_to be_empty
- end
-
- it 'filters out the functions whose cluster the user does not have permission to read' do
- allow(controller).to receive(:can?).and_return(true)
- expect(controller).to receive(:can?).with(user, :read_cluster, cluster).and_return(false)
-
- get :index, params: params({ format: :json })
-
- expect(json_response["functions"]).to be_empty
- end
-
- it 'returns a successful response status' do
- get :index, params: params({ format: :json })
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when there is serverless domain for a cluster' do
- let!(:serverless_domain_cluster) do
- create(:serverless_domain_cluster, clusters_applications_knative_id: knative.id)
- end
-
- it 'returns JSON with function details with serverless domain URL' do
- get :index, params: params({ format: :json })
- expect(response).to have_gitlab_http_status(:ok)
-
- expect(json_response["functions"]).not_to be_empty
-
- expect(json_response["functions"]).to all(
- include(
- 'url' => "https://#{function_name}-#{serverless_domain_cluster.uuid[0..1]}a1#{serverless_domain_cluster.uuid[2..-3]}f2#{serverless_domain_cluster.uuid[-2..]}#{"%x" % environment.id}-#{environment.slug}.#{serverless_domain_cluster.domain}"
- )
- )
- end
- end
-
- context 'when there is no serverless domain for a cluster' do
- it 'keeps function URL as it was' do
- expect(::Serverless::Domain).not_to receive(:new)
-
- get :index, params: params({ format: :json })
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
- end
- end
- end
-
- describe 'GET #show' do
- it_behaves_like 'behind :deprecated_serverless feature flag' do
- let(:action) { get :show, params: params({ format: :json, environment_id: "*", id: "foo" }) }
- end
-
- context 'with function that does not exist' do
- it 'returns 404' do
- get :show, params: params({ format: :json, environment_id: "*", id: "foo" })
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'with valid data', :use_clean_rails_memory_store_caching do
- shared_examples 'GET #show with valid data' do
- context 'when there is serverless domain for a cluster' do
- let!(:serverless_domain_cluster) do
- create(:serverless_domain_cluster, clusters_applications_knative_id: knative.id)
- end
-
- it 'returns JSON with function details with serverless domain URL' do
- get :show, params: params({ format: :json, environment_id: "*", id: function_name })
- expect(response).to have_gitlab_http_status(:ok)
-
- expect(json_response).to include(
- 'url' => "https://#{function_name}-#{serverless_domain_cluster.uuid[0..1]}a1#{serverless_domain_cluster.uuid[2..-3]}f2#{serverless_domain_cluster.uuid[-2..]}#{"%x" % environment.id}-#{environment.slug}.#{serverless_domain_cluster.domain}"
- )
- end
-
- it 'returns 404 when user does not have permission to read the cluster' do
- allow(controller).to receive(:can?).and_return(true)
- expect(controller).to receive(:can?).with(user, :read_cluster, cluster).and_return(false)
-
- get :show, params: params({ format: :json, environment_id: "*", id: function_name })
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when there is no serverless domain for a cluster' do
- it 'keeps function URL as it was' do
- get :show, params: params({ format: :json, environment_id: "*", id: function_name })
- expect(response).to have_gitlab_http_status(:ok)
-
- expect(json_response).to include(
- 'url' => "http://#{function_name}.#{namespace.namespace}.example.com"
- )
- end
- end
-
- it 'return json with function details' do
- get :show, params: params({ format: :json, environment_id: "*", id: function_name })
- expect(response).to have_gitlab_http_status(:ok)
-
- expect(json_response).to include(
- 'name' => function_name,
- 'url' => "http://#{function_name}.#{namespace.namespace}.example.com",
- 'description' => function_description,
- 'podcount' => 0
- )
- end
- end
-
- context 'on Knative 0.5.0' do
- before do
- prepare_knative_stubs(knative_05_service(**knative_stub_options))
- end
-
- include_examples 'GET #show with valid data'
- end
-
- context 'on Knative 0.6.0' do
- before do
- prepare_knative_stubs(knative_06_service(**knative_stub_options))
- end
-
- include_examples 'GET #show with valid data'
- end
-
- context 'on Knative 0.7.0' do
- before do
- prepare_knative_stubs(knative_07_service(**knative_stub_options))
- end
-
- include_examples 'GET #show with valid data'
- end
-
- context 'on Knative 0.9.0' do
- before do
- prepare_knative_stubs(knative_09_service(**knative_stub_options))
- end
-
- include_examples 'GET #show with valid data'
- end
- end
- end
-
- describe 'GET #metrics' do
- it_behaves_like 'behind :deprecated_serverless feature flag' do
- let(:action) { get :metrics, params: params({ format: :json, environment_id: "*", id: "foo" }) }
- end
-
- context 'invalid data' do
- it 'has a bad function name' do
- get :metrics, params: params({ format: :json, environment_id: "*", id: "foo" })
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
- end
-
- describe 'GET #index with data', :use_clean_rails_memory_store_caching do
- shared_examples 'GET #index with data' do
- it 'has data' do
- get :index, params: params({ format: :json })
-
- expect(response).to have_gitlab_http_status(:ok)
-
- expect(json_response).to match({
- 'knative_installed' => 'checking',
- 'functions' => [
- a_hash_including(
- 'name' => function_name,
- 'url' => "http://#{function_name}.#{namespace.namespace}.example.com",
- 'description' => function_description
- )
- ]
- })
- end
-
- it 'has data in html' do
- get :index, params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- end
- end
-
- context 'on Knative 0.5.0' do
- before do
- prepare_knative_stubs(knative_05_service(**knative_stub_options))
- end
-
- include_examples 'GET #index with data'
- end
-
- context 'on Knative 0.6.0' do
- before do
- prepare_knative_stubs(knative_06_service(**knative_stub_options))
- end
-
- include_examples 'GET #index with data'
- end
-
- context 'on Knative 0.7.0' do
- before do
- prepare_knative_stubs(knative_07_service(**knative_stub_options))
- end
-
- include_examples 'GET #index with data'
- end
-
- context 'on Knative 0.9.0' do
- before do
- prepare_knative_stubs(knative_09_service(**knative_stub_options))
- end
-
- include_examples 'GET #index with data'
- end
- end
-
- def prepare_knative_stubs(knative_service)
- stub_kubeclient_service_pods
- stub_reactive_cache(knative_services_finder,
- {
- services: [knative_service],
- pods: kube_knative_pods_body(cluster.project.name, namespace.namespace)["items"]
- },
- *knative_services_finder.cache_args)
- end
-end
diff --git a/spec/controllers/projects/service_ping_controller_spec.rb b/spec/controllers/projects/service_ping_controller_spec.rb
index 13b34290962..fa92efee079 100644
--- a/spec/controllers/projects/service_ping_controller_spec.rb
+++ b/spec/controllers/projects/service_ping_controller_spec.rb
@@ -79,6 +79,18 @@ 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
+ 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)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
end
context 'when web ide clientside preview is not enabled' do
diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb
index 7e96c59fbb1..6802ebeb63e 100644
--- a/spec/controllers/projects/services_controller_spec.rb
+++ b/spec/controllers/projects/services_controller_spec.rb
@@ -326,56 +326,6 @@ RSpec.describe Projects::ServicesController do
end
end
end
-
- context 'with Prometheus integration' do
- let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) }
-
- let(:integration) { prometheus_integration }
- let(:integration_params) { { manual_configuration: '1', api_url: 'http://example.com' } }
-
- context 'when feature flag :settings_operations_prometheus_service is enabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: true)
- end
-
- it 'redirects user back to edit page with alert' do
- put :update, params: project_params.merge(service: integration_params)
-
- expect(response).to redirect_to(edit_project_integration_path(project, integration))
- expected_alert = [
- "You can now manage your Prometheus settings on the",
- %(<a href="#{project_settings_operations_path(project)}">Operations</a> page.),
- "Fields on this page have been deprecated."
- ].join(' ')
-
- expect(controller).to set_flash.now[:alert].to(expected_alert)
- end
-
- it 'does not modify integration' do
- expect { put :update, params: project_params.merge(service: integration_params) }
- .not_to change { prometheus_integration_as_data }
- end
-
- def prometheus_integration_as_data
- pi = project.prometheus_integration.reload
- attrs = pi.attributes.except('encrypted_properties',
- 'encrypted_properties_iv')
-
- [attrs, pi.properties]
- end
- end
-
- context 'when feature flag :settings_operations_prometheus_service is disabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: false)
- end
-
- it 'modifies integration' do
- expect { put :update, params: project_params.merge(service: integration_params) }
- .to change { project.prometheus_integration.reload.attributes }
- end
- end
- end
end
describe 'GET #edit' do
@@ -392,38 +342,6 @@ RSpec.describe Projects::ServicesController do
end
end
end
-
- context 'with Prometheus service' do
- let(:integration_param) { 'prometheus' }
-
- context 'when feature flag :settings_operations_prometheus_service is enabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: true)
- get :edit, params: project_params(id: integration_param)
- end
-
- it 'renders deprecation warning notice' do
- expected_alert = [
- "You can now manage your Prometheus settings on the",
- %(<a href="#{project_settings_operations_path(project)}">Operations</a> page.),
- "Fields on this page have been deprecated."
- ].join(' ')
-
- expect(controller).to set_flash.now[:alert].to(expected_alert)
- end
- end
-
- context 'when feature flag :settings_operations_prometheus_service is disabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: false)
- get :edit, params: project_params(id: integration_param)
- end
-
- it 'does not render deprecation warning notice' do
- expect(controller).not_to set_flash.now[:alert]
- end
- end
- end
end
private
diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb
index 7ef5371f2b5..c1fa91e9f8b 100644
--- a/spec/controllers/projects/settings/operations_controller_spec.rb
+++ b/spec/controllers/projects/settings/operations_controller_spec.rb
@@ -354,37 +354,6 @@ RSpec.describe Projects::Settings::OperationsController do
end
context 'prometheus integration' do
- describe 'PATCH #update' do
- let(:params) do
- {
- prometheus_integration_attributes: {
- manual_configuration: '0',
- api_url: 'https://gitlab.prometheus.rocks'
- }
- }
- end
-
- context 'feature flag :settings_operations_prometheus_service is enabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: true)
- end
-
- it_behaves_like 'PATCHable'
- end
-
- context 'feature flag :settings_operations_prometheus_service is disabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: false)
- end
-
- it_behaves_like 'PATCHable' do
- let(:permitted_params) do
- ActionController::Parameters.new(params.except(:prometheus_integration_attributes)).permit!
- end
- end
- end
- end
-
describe 'POST #reset_alerting_token' do
context 'with existing alerting setting' do
let!(:alerting_setting) do
diff --git a/spec/controllers/projects/tracings_controller_spec.rb b/spec/controllers/projects/tracings_controller_spec.rb
index 1f8a68cc861..80e21349e20 100644
--- a/spec/controllers/projects/tracings_controller_spec.rb
+++ b/spec/controllers/projects/tracings_controller_spec.rb
@@ -51,6 +51,16 @@ RSpec.describe Projects::TracingsController 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
diff --git a/spec/controllers/projects/uploads_controller_spec.rb b/spec/controllers/projects/uploads_controller_spec.rb
index c008c7253d8..6d2db25ade2 100644
--- a/spec/controllers/projects/uploads_controller_spec.rb
+++ b/spec/controllers/projects/uploads_controller_spec.rb
@@ -54,6 +54,241 @@ RSpec.describe Projects::UploadsController do
end
end
+ describe "GET #show" do
+ let(:filename) { "rails_sample.jpg" }
+ let(:user) { create(:user) }
+ let(:jpg) { fixture_file_upload('spec/fixtures/rails_sample.jpg', 'image/jpg') }
+ let(:txt) { fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain') }
+ let(:secret) { FileUploader.generate_secret }
+ let(:uploader_class) { FileUploader }
+
+ let(:upload_service) do
+ UploadService.new(model, jpg, uploader_class).execute
+ end
+
+ let(:show_upload) do
+ get :show, params: params.merge(secret: secret, filename: filename)
+ end
+
+ before do
+ allow(FileUploader).to receive(:generate_secret).and_return(secret)
+
+ allow_next_instance_of(FileUploader) do |instance|
+ allow(instance).to receive(:image?).and_return(true)
+ end
+
+ upload_service
+ end
+
+ context 'when project is private do' do
+ before do
+ model.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ context "when not signed in" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads true' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 302" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:redirect)
+ end
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads false' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ context "when the user doesn't have access to the model" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads true' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 404" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads false' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+ end
+
+ context 'when project is public' do
+ before do
+ model.update_attribute(:visibility_level, Gitlab::VisibilityLevel::PUBLIC)
+ end
+
+ context "when not signed in" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads true' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads false' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "when signed in" do
+ before do
+ sign_in(user)
+ end
+
+ context "when the user doesn't have access to the model" do
+ context "enforce_auth_checks_on_uploads feature flag" do
+ context "with flag enabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: true)
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads true' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: true)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when the project has setting enforce_auth_checks_on_uploads false' do
+ before do
+ model.update!(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+
+ context "with flag disabled" do
+ before do
+ stub_feature_flags(enforce_auth_checks_on_uploads: false)
+ end
+
+ it "responds with status 200" do
+ show_upload
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+ end
+ end
+ end
+
def post_authorize(verified: true)
request.headers.merge!(workhorse_internal_api_request_header) if verified
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 07bd198137a..537f7aa5fee 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -309,6 +309,35 @@ RSpec.describe ProjectsController do
expect(response.body).to have_content('LICENSE') # would be 'MIT license' if stub not works
end
+ describe 'tracking events', :snowplow do
+ before do
+ allow(controller).to receive(:current_user).and_return(user)
+ get_show
+ end
+
+ it 'tracks page views' do
+ expect_snowplow_event(
+ category: 'project_overview',
+ action: 'render',
+ user: user,
+ project: public_project
+ )
+ end
+
+ context 'when the project is importing' do
+ let_it_be(:public_project) { create(:project, :public, :import_scheduled) }
+
+ it 'does not track page views' do
+ expect_no_snowplow_event(
+ category: 'project_overview',
+ action: 'render',
+ user: user,
+ project: public_project
+ )
+ end
+ end
+ end
+
describe "PUC highlighting" do
render_views
@@ -834,7 +863,8 @@ RSpec.describe ProjectsController do
id: project.path,
project: {
project_setting_attributes: {
- show_default_award_emojis: boolean_value
+ show_default_award_emojis: boolean_value,
+ enforce_auth_checks_on_uploads: boolean_value
}
}
}
@@ -842,6 +872,7 @@ RSpec.describe ProjectsController do
project.reload
expect(project.show_default_award_emojis?).to eq(result)
+ expect(project.enforce_auth_checks_on_uploads?).to eq(result)
end
end
end
@@ -1423,6 +1454,41 @@ RSpec.describe ProjectsController do
expect(response).to have_gitlab_http_status(:found)
end
+
+ context 'when the project storage_size exceeds the application setting max_export_size' do
+ it 'returns 302 with alert' do
+ stub_application_setting(max_export_size: 1)
+ project.statistics.update!(lfs_objects_size: 2.megabytes, repository_size: 2.megabytes)
+
+ post action, params: { namespace_id: project.namespace, id: project }
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:alert]).to include('The project size exceeds the export limit.')
+ end
+ end
+
+ context 'when the project storage_size does not exceed the application setting max_export_size' do
+ it 'returns 302 without alert' do
+ stub_application_setting(max_export_size: 1)
+ project.statistics.update!(lfs_objects_size: 0.megabytes, repository_size: 0.megabytes)
+
+ post action, params: { namespace_id: project.namespace, id: project }
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:alert]).to be_nil
+ end
+ end
+
+ context 'when application setting max_export_size is not set' do
+ it 'returns 302 without alert' do
+ project.statistics.update!(lfs_objects_size: 2.megabytes, repository_size: 2.megabytes)
+
+ post action, params: { namespace_id: project.namespace, id: project }
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(flash[:alert]).to be_nil
+ end
+ end
end
context 'when project export is disabled' do
diff --git a/spec/controllers/repositories/lfs_storage_controller_spec.rb b/spec/controllers/repositories/lfs_storage_controller_spec.rb
index 7ddc5723e2e..672e6f1e85b 100644
--- a/spec/controllers/repositories/lfs_storage_controller_spec.rb
+++ b/spec/controllers/repositories/lfs_storage_controller_spec.rb
@@ -155,7 +155,7 @@ RSpec.describe Repositories::LfsStorageController do
context 'with an invalid file' do
let(:uploaded_file) { 'test' }
- it_behaves_like 'returning response status', :unprocessable_entity
+ it_behaves_like 'returning response status', :bad_request
end
context 'when an expected error' do
@@ -179,12 +179,10 @@ RSpec.describe Repositories::LfsStorageController do
end
context 'when existing file has been deleted' do
- let(:lfs_object) { create(:lfs_object, :with_file) }
+ let(:lfs_object) { create(:lfs_object, :with_file, size: params[:size], oid: params[:oid]) }
before do
FileUtils.rm(lfs_object.file.path)
- params[:oid] = lfs_object.oid
- params[:size] = lfs_object.size
end
it 'replaces the file' do
@@ -204,10 +202,10 @@ RSpec.describe Repositories::LfsStorageController do
end
end
- it 'renders LFS forbidden' do
+ it 'renders bad request' do
subject
- expect(response).to have_gitlab_http_status(:forbidden)
+ expect(response).to have_gitlab_http_status(:bad_request)
expect(lfs_object.reload.file).not_to exist
end
end
@@ -239,8 +237,9 @@ RSpec.describe Repositories::LfsStorageController do
FileUtils.mkdir_p(upload_path)
File.write(file_path, 'test')
+ File.truncate(file_path, params[:size].to_i)
- UploadedFile.new(file_path, filename: File.basename(file_path))
+ UploadedFile.new(file_path, filename: File.basename(file_path), sha256: params[:oid])
end
end
end
diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb
index ffcd759435c..c27e58634f6 100644
--- a/spec/controllers/uploads_controller_spec.rb
+++ b/spec/controllers/uploads_controller_spec.rb
@@ -703,13 +703,16 @@ RSpec.describe UploadsController do
end
context 'when viewing alert metric images' do
- let!(:user) { create(:user) }
- let!(:project) { create(:project) }
- let(:alert) { create(:alert_management_alert, project: project) }
- let(:metric_image) { create(:alert_metric_image, alert: alert) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:alert) { create(:alert_management_alert, project: project) }
+ let_it_be(:metric_image) { create(:alert_metric_image, alert: alert) }
- before do
+ before_all do
project.add_developer(user)
+ end
+
+ before do
sign_in(user)
end
diff --git a/spec/db/docs_spec.rb b/spec/db/docs_spec.rb
new file mode 100644
index 00000000000..20746e107fb
--- /dev/null
+++ b/spec/db/docs_spec.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Database Documentation' do
+ context 'for each table' do
+ let(:all_tables) do
+ Gitlab::Database.database_base_models.flat_map { |_, m| m.connection.tables }.sort.uniq
+ end
+
+ let(:metadata_required_fields) do
+ %i(
+ feature_categories
+ table_name
+ )
+ end
+
+ let(:metadata_allowed_fields) do
+ metadata_required_fields + %i(
+ classes
+ description
+ introduced_by_url
+ milestone
+ )
+ end
+
+ let(:metadata) do
+ all_tables.each_with_object({}) do |table_name, hash|
+ next unless File.exist?(table_metadata_file_path(table_name))
+
+ hash[table_name] ||= load_table_metadata(table_name)
+ end
+ end
+
+ let(:tables_without_metadata) do
+ all_tables.reject { |t| metadata.has_key?(t) }
+ end
+
+ let(:tables_without_valid_metadata) do
+ metadata.select { |_, t| t.has_key?(:error) }.keys
+ end
+
+ let(:tables_with_disallowed_fields) do
+ metadata.select { |_, t| t.has_key?(:disallowed_fields) }.keys
+ end
+
+ let(:tables_with_missing_required_fields) do
+ metadata.select { |_, t| t.has_key?(:missing_required_fields) }.keys
+ end
+
+ it 'has a metadata file' do
+ expect(tables_without_metadata).to be_empty, multiline_error(
+ 'Missing metadata files',
+ tables_without_metadata.map { |t| " #{table_metadata_file(t)}" }
+ )
+ end
+
+ it 'has a valid metadata file' do
+ expect(tables_without_valid_metadata).to be_empty, table_metadata_errors(
+ 'Table metadata files with errors',
+ :error,
+ tables_without_valid_metadata
+ )
+ end
+
+ it 'has a valid metadata file with allowed fields' do
+ expect(tables_with_disallowed_fields).to be_empty, table_metadata_errors(
+ 'Table metadata files with disallowed fields',
+ :disallowed_fields,
+ tables_with_disallowed_fields
+ )
+ end
+
+ it 'has a valid metadata file without missing fields' do
+ expect(tables_with_missing_required_fields).to be_empty, table_metadata_errors(
+ 'Table metadata files with missing fields',
+ :missing_required_fields,
+ tables_with_missing_required_fields
+ )
+ end
+ end
+
+ private
+
+ def table_metadata_file(table_name)
+ File.join('db', 'docs', "#{table_name}.yml")
+ end
+
+ def table_metadata_file_path(table_name)
+ Rails.root.join(table_metadata_file(table_name))
+ end
+
+ def load_table_metadata(table_name)
+ result = {}
+ begin
+ result[:metadata] = YAML.safe_load(File.read(table_metadata_file_path(table_name))).deep_symbolize_keys
+
+ disallowed_fields = (result[:metadata].keys - metadata_allowed_fields)
+ unless disallowed_fields.empty?
+ result[:disallowed_fields] = "fields not allowed: #{disallowed_fields.join(', ')}"
+ end
+
+ missing_required_fields = (metadata_required_fields - result[:metadata].reject { |_, v| v.blank? }.keys)
+ unless missing_required_fields.empty?
+ result[:missing_required_fields] = "missing required fields: #{missing_required_fields.join(', ')}"
+ end
+ rescue Psych::SyntaxError => ex
+ result[:error] = ex.message
+ end
+ result
+ end
+
+ def table_metadata_errors(title, field, tables)
+ lines = tables.map do |table_name|
+ <<~EOM
+ #{table_metadata_file(table_name)}
+ #{metadata[table_name][field]}
+ EOM
+ end
+
+ multiline_error(title, lines)
+ end
+
+ def multiline_error(title, lines)
+ <<~EOM
+ #{title}:
+
+ #{lines.join("\n")}
+ EOM
+ end
+end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 04f73050ea5..e21c73976a8 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'Database schema' do
approvals: %w[user_id],
approver_groups: %w[target_id],
approvers: %w[target_id user_id],
- analytics_cycle_analytics_aggregations: %w[last_full_issues_id last_full_merge_requests_id last_incremental_issues_id last_full_run_issues_id last_full_run_merge_requests_id last_incremental_merge_requests_id],
+ analytics_cycle_analytics_aggregations: %w[last_full_issues_id last_full_merge_requests_id last_incremental_issues_id last_full_run_issues_id last_full_run_merge_requests_id last_incremental_merge_requests_id last_consistency_check_issues_stage_event_hash_id last_consistency_check_issues_issuable_id last_consistency_check_merge_requests_stage_event_hash_id last_consistency_check_merge_requests_issuable_id],
analytics_cycle_analytics_merge_request_stage_events: %w[author_id group_id merge_request_id milestone_id project_id stage_event_hash_id state_id],
analytics_cycle_analytics_issue_stage_events: %w[author_id group_id issue_id milestone_id project_id stage_event_hash_id state_id],
audit_events: %w[author_id entity_id target_id],
@@ -47,7 +47,6 @@ RSpec.describe 'Database schema' do
events: %w[target_id],
forked_project_links: %w[forked_from_project_id],
geo_event_log: %w[hashed_storage_attachments_event_id],
- geo_job_artifact_deleted_events: %w[job_artifact_id],
geo_lfs_object_deleted_events: %w[lfs_object_id],
geo_node_statuses: %w[last_event_id cursor_last_event_id],
geo_nodes: %w[oauth_application_id],
@@ -79,7 +78,7 @@ RSpec.describe 'Database schema' do
repository_languages: %w[programming_language_id],
routes: %w[source_id],
sent_notifications: %w[project_id noteable_id recipient_id commit_id in_reply_to_discussion_id],
- slack_integrations: %w[team_id user_id],
+ slack_integrations: %w[team_id user_id bot_user_id], # these are external Slack IDs
snippets: %w[author_id],
spam_logs: %w[user_id],
status_check_responses: %w[external_approval_rule_id],
diff --git a/spec/experiments/application_experiment_spec.rb b/spec/experiments/application_experiment_spec.rb
index 15b45099a06..13c12afc15d 100644
--- a/spec/experiments/application_experiment_spec.rb
+++ b/spec/experiments/application_experiment_spec.rb
@@ -8,13 +8,9 @@ RSpec.describe ApplicationExperiment, :experiment do
let(:context) { {} }
let(:feature_definition) { { name: 'namespaced_stub', type: 'experiment', default_enabled: false } }
- around do |example|
- Feature::Definition.definitions[:namespaced_stub] = Feature::Definition.new('namespaced_stub.yml', feature_definition)
- example.run
- Feature::Definition.definitions.delete(:namespaced_stub)
- end
-
before do
+ stub_feature_flag_definition(:namespaced_stub, feature_definition)
+
allow(application_experiment).to receive(:enabled?).and_return(true)
end
diff --git a/spec/experiments/concerns/project_commit_count_spec.rb b/spec/experiments/concerns/project_commit_count_spec.rb
index 5616f167cb4..f5969ad6241 100644
--- a/spec/experiments/concerns/project_commit_count_spec.rb
+++ b/spec/experiments/concerns/project_commit_count_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe ProjectCommitCount do
allow(Gitlab::GitalyClient).to receive(:call).and_call_original
allow(Gitlab::GitalyClient).to receive(:call).with(anything, :commit_service, :count_commits, anything, anything).and_raise(e = StandardError.new('_message_'))
- expect(Gitlab::ErrorTracking).to receive(:track_exception).with(e, caller_info: :identifiable)
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).with(e, { caller_info: :identifiable })
expect(subject).to eq(42)
end
diff --git a/spec/factories/alert_management/alerts.rb b/spec/factories/alert_management/alerts.rb
index 589a62a68bb..7e9e58edc1e 100644
--- a/spec/factories/alert_management/alerts.rb
+++ b/spec/factories/alert_management/alerts.rb
@@ -113,20 +113,6 @@ FactoryBot.define do
end
end
- trait :cilium do
- monitoring_tool { Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:cilium] }
- payload do
- {
- annotations: {
- title: 'This is a cilium alert',
- summary: 'Summary of the alert',
- description: 'Description of the alert'
- },
- startsAt: started_at
- }.with_indifferent_access
- end
- end
-
trait :all_fields do
with_incident
with_assignee
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index 122af139985..d6b1da1d5c2 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -79,6 +79,10 @@ FactoryBot.define do
status { :running }
end
+ trait :canceled do
+ status { :canceled }
+ end
+
trait :failed do
status { :failed }
end
diff --git a/spec/factories/ci/secure_files.rb b/spec/factories/ci/secure_files.rb
index 9198ea61d14..9afec5db858 100644
--- a/spec/factories/ci/secure_files.rb
+++ b/spec/factories/ci/secure_files.rb
@@ -2,7 +2,7 @@
FactoryBot.define do
factory :ci_secure_file, class: 'Ci::SecureFile' do
- name { 'filename' }
+ sequence(:name) { |n| "file#{n}" }
file { fixture_file_upload('spec/fixtures/ci_secure_files/upload-keystore.jks', 'application/octet-stream') }
checksum { 'foo1234' }
project
diff --git a/spec/factories/clusters/agent_tokens.rb b/spec/factories/clusters/agent_tokens.rb
index 03f765123db..3ca6c95d0df 100644
--- a/spec/factories/clusters/agent_tokens.rb
+++ b/spec/factories/clusters/agent_tokens.rb
@@ -3,6 +3,7 @@
FactoryBot.define do
factory :cluster_agent_token, class: 'Clusters::AgentToken' do
association :agent, factory: :cluster_agent
+ association :created_by_user, factory: :user
token_encrypted { Gitlab::CryptoHelper.aes256_gcm_encrypt(SecureRandom.hex(50)) }
diff --git a/spec/factories/deploy_tokens.rb b/spec/factories/deploy_tokens.rb
index b2c478fd3fe..a2116b738fd 100644
--- a/spec/factories/deploy_tokens.rb
+++ b/spec/factories/deploy_tokens.rb
@@ -2,7 +2,6 @@
FactoryBot.define do
factory :deploy_token do
- token { nil }
token_encrypted { Gitlab::CryptoHelper.aes256_gcm_encrypt(SecureRandom.hex(50)) }
sequence(:name) { |n| "PDT #{n}" }
read_repository { true }
diff --git a/spec/factories/incident_management/timeline_events.rb b/spec/factories/incident_management/timeline_events.rb
new file mode 100644
index 00000000000..e2e216d24b8
--- /dev/null
+++ b/spec/factories/incident_management/timeline_events.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :incident_management_timeline_event, class: 'IncidentManagement::TimelineEvent' do
+ association :project
+ association :author, factory: :user
+ association :incident
+ association :promoted_from_note, factory: :note
+ occurred_at { Time.current }
+ note { 'timeline created' }
+ note_html { '<strong>timeline created</strong>' }
+ action { 'comment' }
+ end
+end
diff --git a/spec/factories/keys.rb b/spec/factories/keys.rb
index 6b800e3d790..a7478ce2657 100644
--- a/spec/factories/keys.rb
+++ b/spec/factories/keys.rb
@@ -5,6 +5,16 @@ FactoryBot.define do
title
key { SSHData::PrivateKey::RSA.generate(1024, unsafe_allow_small_key: true).public_key.openssh(comment: 'dummy@gitlab.com') }
+ trait :expired do
+ to_create { |key| key.save!(validate: false) }
+ expires_at { 2.days.ago }
+ end
+
+ trait :expired_today do
+ to_create { |key| key.save!(validate: false) }
+ expires_at { Date.today.beginning_of_day + 3.hours }
+ end
+
factory :key_without_comment do
key { SSHData::PrivateKey::RSA.generate(1024, unsafe_allow_small_key: true).public_key.openssh }
end
diff --git a/spec/factories/namespace_ci_cd_settings.rb b/spec/factories/namespace_ci_cd_settings.rb
new file mode 100644
index 00000000000..0e58a19ee8d
--- /dev/null
+++ b/spec/factories/namespace_ci_cd_settings.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :namespace_ci_cd_settings, class: 'NamespaceCiCdSetting' do
+ namespace
+ end
+end
diff --git a/spec/factories/packages/cleanup/policies.rb b/spec/factories/packages/cleanup/policies.rb
new file mode 100644
index 00000000000..80baa2f78bd
--- /dev/null
+++ b/spec/factories/packages/cleanup/policies.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :packages_cleanup_policy, class: 'Packages::Cleanup::Policy' do
+ project
+
+ keep_n_duplicated_package_files { '10' }
+
+ trait :runnable do
+ after(:create) do |policy|
+ # next_run_at will be set before_save to Time.now + cadence, so this ensures the policy is active
+ policy.update_column(:next_run_at, Time.zone.now - 1.day)
+ end
+ end
+ end
+end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index b3395758729..c3c02782578 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -183,6 +183,10 @@ FactoryBot.define do
request_access_enabled { false }
end
+ trait :with_namespace_settings do
+ namespace factory: [:namespace, :with_namespace_settings]
+ end
+
trait :with_avatar do
avatar { fixture_file_upload('spec/fixtures/dk.png') }
end
@@ -304,6 +308,8 @@ FactoryBot.define do
trait :wiki_repo do
after(:create) do |project|
+ stub_feature_flags(main_branch_over_master: false)
+
raise 'Failed to create wiki repository!' unless project.create_wiki
end
end
diff --git a/spec/factories/topics.rb b/spec/factories/topics.rb
index e77441d9eae..a6e614e0c66 100644
--- a/spec/factories/topics.rb
+++ b/spec/factories/topics.rb
@@ -3,5 +3,6 @@
FactoryBot.define do
factory :topic, class: 'Projects::Topic' do
name { generate(:name) }
+ title { generate(:title) }
end
end
diff --git a/spec/factories/users/in_product_marketing_email.rb b/spec/factories/users/in_product_marketing_email.rb
index c86c469ff31..42309319bf3 100644
--- a/spec/factories/users/in_product_marketing_email.rb
+++ b/spec/factories/users/in_product_marketing_email.rb
@@ -6,5 +6,11 @@ FactoryBot.define do
track { 'create' }
series { 0 }
+
+ trait :campaign do
+ track { nil }
+ series { nil }
+ campaign { Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE }
+ end
end
end
diff --git a/spec/features/admin/admin_groups_spec.rb b/spec/features/admin/admin_groups_spec.rb
index 3b3289a8487..90dde7340d5 100644
--- a/spec/features/admin/admin_groups_spec.rb
+++ b/spec/features/admin/admin_groups_spec.rb
@@ -212,7 +212,7 @@ RSpec.describe 'Admin Groups' do
it do
visit admin_group_path(group)
- select2(user_selector, from: '#user_ids', multiple: true)
+ select2(user_selector, from: '#user_id', multiple: true)
page.within '#new_project_member' do
select2(Gitlab::Access::REPORTER, from: '#access_level')
end
diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb
index b0737377de0..2166edf65ff 100644
--- a/spec/features/admin/admin_projects_spec.rb
+++ b/spec/features/admin/admin_projects_spec.rb
@@ -8,7 +8,7 @@ RSpec.describe "Admin::Projects" do
include Spec::Support::Helpers::ModalHelpers
let(:user) { create :user }
- let(:project) { create(:project) }
+ let(:project) { create(:project, :with_namespace_settings) }
let(:current_user) { create(:admin) }
before do
@@ -82,7 +82,7 @@ RSpec.describe "Admin::Projects" do
describe 'transfer project' do
# The gitlab-shell transfer will fail for a project without a repository
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :repository, :with_namespace_settings) }
before do
create(:group, name: 'Web')
diff --git a/spec/features/admin/admin_requests_profiles_spec.rb b/spec/features/admin/admin_requests_profiles_spec.rb
deleted file mode 100644
index e92528d431d..00000000000
--- a/spec/features/admin/admin_requests_profiles_spec.rb
+++ /dev/null
@@ -1,136 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Admin::RequestsProfilesController' do
- let(:tmpdir) { Dir.mktmpdir('profiler-test') }
-
- before do
- stub_const('Gitlab::RequestProfiler::PROFILES_DIR', tmpdir)
- admin = create(:admin)
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- after do
- FileUtils.rm_rf(tmpdir)
- end
-
- describe 'GET /admin/requests_profiles' do
- it 'shows the current profile token' do
- allow(Rails).to receive(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
-
- visit admin_requests_profiles_path
-
- expect(page).to have_content("X-Profile-Token: #{Gitlab::RequestProfiler.profile_token}")
- end
-
- context 'when having multiple profiles' do
- let(:time1) { 1.hour.ago }
- let(:time2) { 2.hours.ago }
-
- let(:profiles) do
- [
- {
- request_path: '/gitlab-org/gitlab-foss',
- name: "|gitlab-org|gitlab-foss_#{time1.to_i}_execution.html",
- created: time1,
- profile_mode: 'Execution'
- },
- {
- request_path: '/gitlab-org/gitlab-foss',
- name: "|gitlab-org|gitlab-foss_#{time2.to_i}_execution.html",
- created: time2,
- profile_mode: 'Execution'
- },
- {
- request_path: '/gitlab-org/gitlab-foss',
- name: "|gitlab-org|gitlab-foss_#{time1.to_i}_memory.html",
- created: time1,
- profile_mode: 'Memory'
- },
- {
- request_path: '/gitlab-org/gitlab-foss',
- name: "|gitlab-org|gitlab-foss_#{time2.to_i}_memory.html",
- created: time2,
- profile_mode: 'Memory'
- },
- {
- request_path: '/gitlab-org/infrastructure',
- name: "|gitlab-org|infrastructure_#{time1.to_i}_execution.html",
- created: time1,
- profile_mode: 'Execution'
- },
- {
- request_path: '/gitlab-org/infrastructure',
- name: "|gitlab-org|infrastructure_#{time2.to_i}_memory.html",
- created: time2,
- profile_mode: 'Memory'
- },
- {
- request_path: '/gitlab-org/infrastructure',
- name: "|gitlab-org|infrastructure_#{time2.to_i}.html",
- created: time2,
- profile_mode: 'Unknown'
- }
- ]
- end
-
- before do
- profiles.each do |profile|
- FileUtils.touch(File.join(Gitlab::RequestProfiler::PROFILES_DIR, profile[:name]))
- end
- end
-
- it 'lists all available profiles' do
- visit admin_requests_profiles_path
-
- profiles.each do |profile|
- within('.card', text: profile[:request_path]) do
- expect(page).to have_selector(
- "a[href='#{admin_requests_profile_path(profile[:name])}']",
- text: "#{profile[:created].to_s(:long)} #{profile[:profile_mode]}")
- end
- end
- end
- end
- end
-
- describe 'GET /admin/requests_profiles/:profile' do
- context 'when a profile exists' do
- before do
- File.write("#{Gitlab::RequestProfiler::PROFILES_DIR}/#{profile}", content)
- end
-
- context 'when is valid call stack profile' do
- let(:content) { 'This is a call stack request profile' }
- let(:profile) { "|gitlab-org|gitlab-ce_#{Time.now.to_i}_execution.html" }
-
- it 'displays the content' do
- visit admin_requests_profile_path(profile)
-
- expect(page).to have_content(content)
- end
- end
-
- context 'when is valid memory profile' do
- let(:content) { 'This is a memory request profile' }
- let(:profile) { "|gitlab-org|gitlab-ce_#{Time.now.to_i}_memory.txt" }
-
- it 'displays the content' do
- visit admin_requests_profile_path(profile)
-
- expect(page).to have_content(content)
- end
- end
- end
-
- context 'when a profile does not exist' do
- it 'shows an error message' do
- visit admin_requests_profile_path('|non|existent_12345.html')
-
- expect(page).to have_content('Profile not found')
- end
- end
- end
-end
diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb
index 7fe49c2571c..e1a1e2bbb2d 100644
--- a/spec/features/admin/admin_runners_spec.rb
+++ b/spec/features/admin/admin_runners_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe "Admin Runners" do
include Spec::Support::Helpers::Features::RunnersHelpers
+ include Spec::Support::Helpers::ModalHelpers
let_it_be(:admin) { create(:admin) }
@@ -429,12 +430,6 @@ RSpec.describe "Admin Runners" do
end
context "when visiting outdated URLs" do
- it 'updates NOT_CONNECTED runner status to NEVER_CONNECTED' do
- visit admin_runners_path('status[]': 'NOT_CONNECTED')
-
- expect(page).to have_current_path(admin_runners_path('status[]': 'NEVER_CONTACTED') )
- end
-
it 'updates ACTIVE runner status to paused=false' do
visit admin_runners_path('status[]': 'ACTIVE')
@@ -467,7 +462,7 @@ 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('h2')).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
@@ -483,10 +478,28 @@ RSpec.describe "Admin Runners" do
expect(page).to have_content 'Tags tag1'
end
end
+
+ describe 'when a runner is deleted' do
+ before do
+ click_on 'Delete runner'
+
+ within_modal do
+ click_on 'Delete runner'
+ end
+ end
+
+ it 'deletes runner' do
+ expect(page.find('[data-testid="alert-success"]')).to have_content('deleted')
+ end
+
+ it 'redirects to runner list' do
+ expect(current_url).to match(admin_runners_path)
+ end
+ end
end
describe "Runner edit page" do
- let(:runner) { create(:ci_runner) }
+ let(:runner) { create(:ci_runner, :project) }
before do
@project1 = create(:project)
@@ -500,14 +513,29 @@ RSpec.describe "Admin Runners" 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})")
- expect(page.find('h2')).to have_content("Edit")
+ expect(page.find('[data-testid="breadcrumb-current-link"]')).to have_content("Edit")
end
end
end
describe 'runner header', :js do
it 'contains the runner status, type and id' do
- expect(page).to have_content("never contacted shared Runner ##{runner.id} created")
+ expect(page).to have_content("never contacted specific Runner ##{runner.id} created")
+ end
+ end
+
+ describe 'when a runner is updated', :js do
+ before do
+ click_on _('Save changes')
+ wait_for_requests
+ end
+
+ it 'show success alert' do
+ expect(page.find('[data-testid="alert-success"]')).to have_content('saved')
+ end
+
+ it 'redirects to runner page' do
+ expect(current_url).to match(admin_runner_path(runner))
end
end
@@ -564,17 +592,6 @@ RSpec.describe "Admin Runners" do
it_behaves_like 'assignable runner'
end
-
- context 'with shared runner' do
- let(:runner) { create(:ci_runner, :instance) }
-
- before do
- @project1.destroy!
- visit edit_admin_runner_path(runner)
- end
-
- it_behaves_like 'assignable runner'
- end
end
describe 'disable/destroy' do
diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb
index 432721d63ad..8edddcf9a9b 100644
--- a/spec/features/admin/admin_sees_background_migrations_spec.rb
+++ b/spec/features/admin/admin_sees_background_migrations_spec.rb
@@ -31,6 +31,52 @@ RSpec.describe "Admin > Admin sees background migrations" do
end
end
+ it 'can click on a specific migration' do
+ visit admin_background_migrations_path
+
+ within '#content-body' do
+ tab = find_link active_migration.job_class_name
+ tab.click
+
+ expect(page).to have_current_path admin_background_migration_path(active_migration)
+ end
+ end
+
+ it 'can view failed jobs' do
+ visit admin_background_migration_path(failed_migration)
+
+ within '#content-body' do
+ expect(page).to have_content('Failed jobs')
+ expect(page).to have_content('Id')
+ expect(page).to have_content('Started at')
+ expect(page).to have_content('Finished at')
+ expect(page).to have_content('Batch size')
+ end
+ end
+
+ it 'can click on a specific job' do
+ job = create(:batched_background_migration_job, :failed, batched_migration: failed_migration)
+
+ visit admin_background_migration_path(failed_migration)
+
+ within '#content-body' do
+ tab = find_link job.id
+ tab.click
+
+ expect(page).to have_current_path admin_background_migration_batched_job_path(id: job.id, background_migration_id: failed_migration.id)
+ end
+ end
+
+ context 'when there are no failed jobs' do
+ it 'dos not display failed jobs' do
+ visit admin_background_migration_path(active_migration)
+
+ within '#content-body' do
+ expect(page).not_to have_content('Failed jobs')
+ end
+ end
+ end
+
it 'can view queued migrations and pause and resume them' do
visit admin_background_migrations_path
@@ -66,6 +112,17 @@ RSpec.describe "Admin > Admin sees background migrations" do
end
end
+ it 'can fire an action with a database param' do
+ visit admin_background_migrations_path(database: 'main')
+
+ within '#content-body' do
+ tab = find_link 'Failed'
+ tab.click
+
+ expect(page).to have_selector("[method='post'][action='/admin/background_migrations/#{failed_migration.id}/retry?database=main']")
+ end
+ end
+
it 'can view and retry them' do
visit admin_background_migrations_path
@@ -109,4 +166,89 @@ RSpec.describe "Admin > Admin sees background migrations" do
expect(page).to have_content(finished_migration.status_name.to_s)
end
end
+
+ it 'can change tabs and retain database param' do
+ skip_if_multiple_databases_not_setup
+
+ visit admin_background_migrations_path(database: 'ci')
+
+ within '#content-body' do
+ tab = find_link 'Finished'
+ expect(tab[:class]).not_to include('gl-tab-nav-item-active')
+
+ tab.click
+
+ expect(page).to have_current_path(admin_background_migrations_path(tab: 'finished', database: 'ci'))
+ expect(tab[:class]).to include('gl-tab-nav-item-active')
+ end
+ end
+
+ it 'can view documentation from Learn more link' do
+ visit admin_background_migrations_path
+
+ within '#content-body' do
+ expect(page).to have_link('Learn more', href: help_page_path('development/database/batched_background_migrations'))
+ end
+ end
+
+ describe 'selected database toggle', :js do
+ context 'when multi database is not enabled' do
+ before do
+ skip_if_multiple_databases_are_setup
+
+ allow(Gitlab::Database).to receive(:db_config_names).and_return(['main'])
+ end
+
+ it 'does not render the database listbox' do
+ visit admin_background_migrations_path
+
+ expect(page).not_to have_selector('[data-testid="database-listbox"]')
+ end
+ end
+
+ context 'when multi database is enabled' do
+ before do
+ skip_if_multiple_databases_not_setup
+
+ allow(Gitlab::Database).to receive(:db_config_names).and_return(%w[main ci])
+ end
+
+ it 'does render the database listbox' do
+ visit admin_background_migrations_path
+
+ expect(page).to have_selector('[data-testid="database-listbox"]')
+ end
+
+ it 'defaults to main when no parameter is passed' do
+ visit admin_background_migrations_path
+
+ listbox = page.find('[data-testid="database-listbox"]')
+
+ expect(listbox).to have_text('main')
+ end
+
+ it 'shows correct database when a parameter is passed' do
+ visit admin_background_migrations_path(database: 'ci')
+
+ listbox = page.find('[data-testid="database-listbox"]')
+
+ expect(listbox).to have_text('ci')
+ end
+
+ it 'updates the path to correct database when clicking on listbox option' do
+ visit admin_background_migrations_path
+
+ listbox = page.find('[data-testid="database-listbox"]')
+ expect(listbox).to have_text('main')
+
+ listbox.find('button').click
+ listbox.find('li', text: 'ci').click
+ wait_for_requests
+
+ expect(page).to have_current_path(admin_background_migrations_path(database: 'ci'))
+ listbox = page.find('[data-testid="database-listbox"]')
+ expect(listbox).to have_text('ci')
+ end
+ end
+ end
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 4cdc3df978d..79b3f049047 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe 'Admin updates settings' do
it 'change Visibility and Access Controls' do
page.within('.as-visibility-access') do
- uncheck 'Project export enabled'
+ uncheck 'Enabled'
click_button 'Save changes'
end
@@ -111,6 +111,16 @@ RSpec.describe 'Admin updates settings' do
expect(page).to have_content "Application settings saved successfully"
end
+ it 'change Maximum export size' do
+ page.within('.as-account-limit') do
+ fill_in 'Maximum export size (MB)', with: 25
+ click_button 'Save changes'
+ end
+
+ expect(current_settings.max_export_size).to eq 25
+ expect(page).to have_content "Application settings saved successfully"
+ end
+
it 'change Maximum import size' do
page.within('.as-account-limit') do
fill_in 'Maximum import size (MB)', with: 15
@@ -370,7 +380,7 @@ RSpec.describe 'Admin updates settings' do
expect(current_settings.valid_runner_registrars).to eq(ApplicationSetting::VALID_RUNNER_REGISTRAR_TYPES)
page.within('.as-runner') do
- find_all('.form-check-input').each(&:click)
+ find_all('input[type="checkbox"]').each(&:click)
click_button 'Save changes'
end
@@ -396,7 +406,6 @@ RSpec.describe 'Admin updates settings' do
end
context 'Container Registry' do
- let(:feature_flag_enabled) { true }
let(:client_support) { true }
let(:settings_titles) do
{
@@ -409,18 +418,9 @@ RSpec.describe 'Admin updates settings' do
before do
stub_container_registry_config(enabled: true)
- stub_feature_flags(container_registry_expiration_policies_throttling: feature_flag_enabled)
allow(ContainerRegistry::Client).to receive(:supports_tag_delete?).and_return(client_support)
end
- shared_examples 'not having container registry setting' do |registry_setting|
- it "lacks the container setting #{registry_setting}" do
- visit ci_cd_admin_application_settings_path
-
- expect(page).not_to have_content(settings_titles[registry_setting])
- end
- end
-
%i[container_registry_delete_tags_service_timeout container_registry_expiration_policies_worker_capacity container_registry_cleanup_tags_service_max_list_size].each do |setting|
context "for container registry setting #{setting}" do
it 'changes the setting' do
@@ -434,12 +434,6 @@ RSpec.describe 'Admin updates settings' do
expect(current_settings.public_send(setting)).to eq(400)
expect(page).to have_content "Application settings saved successfully"
end
-
- context 'with feature flag disabled' do
- let(:feature_flag_enabled) { false }
-
- it_behaves_like 'not having container registry setting', setting
- end
end
end
@@ -457,12 +451,6 @@ RSpec.describe 'Admin updates settings' do
expect(current_settings.container_registry_expiration_policies_caching).to eq(!old_value)
expect(page).to have_content "Application settings saved successfully"
end
-
- context 'with feature flag disabled' do
- let(:feature_flag_enabled) { false }
-
- it_behaves_like 'not having container registry setting', :container_registry_expiration_policies_caching
- end
end
end
end
@@ -665,7 +653,7 @@ RSpec.describe 'Admin updates settings' do
visit network_admin_application_settings_path
page.within('.as-issue-limits') do
- fill_in 'Max requests per minute per user', with: 0
+ fill_in 'Maximum number of requests per minute', with: 0
click_button 'Save changes'
end
@@ -673,6 +661,18 @@ RSpec.describe 'Admin updates settings' do
expect(current_settings.issues_create_limit).to eq(0)
end
+ it 'changes Pipelines rate limits settings' do
+ visit network_admin_application_settings_path
+
+ page.within('.as-pipeline-limits') do
+ fill_in 'Maximum number of requests per minute', with: 10
+ click_button 'Save changes'
+ end
+
+ expect(page).to have_content "Application settings saved successfully"
+ expect(current_settings.pipeline_limit_per_project_user_sha).to eq(10)
+ end
+
it 'changes Users API rate limits settings' do
visit network_admin_application_settings_path
@@ -856,10 +856,9 @@ RSpec.describe 'Admin updates settings' do
stub_database_flavor_check
end
- context 'when service data cached', :clean_gitlab_redis_cache do
+ context 'when service data cached', :use_clean_rails_memory_store_caching do
before do
- allow(Rails.cache).to receive(:exist?).with('usage_data').and_return(true)
-
+ visit usage_data_admin_application_settings_path
visit service_usage_data_admin_application_settings_path
end
diff --git a/spec/features/admin/clusters/eks_spec.rb b/spec/features/admin/clusters/eks_spec.rb
deleted file mode 100644
index 4667f9c20a1..00000000000
--- a/spec/features/admin/clusters/eks_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Instance-level AWS EKS Cluster', :js do
- let(:user) { create(:admin) }
-
- before do
- sign_in(user)
- gitlab_enable_admin_mode_sign_in(user)
- stub_application_setting(eks_integration_enabled: true)
- end
-
- context 'when user does not have a cluster and visits group clusters page' do
- before do
- visit admin_clusters_path
-
- click_button(class: 'dropdown-toggle-split')
- click_link 'Create a cluster (deprecated)'
- end
-
- context 'when user creates a cluster on AWS EKS' do
- before do
- click_link 'Amazon EKS'
- end
-
- it 'user sees a form to create an EKS cluster' do
- expect(page).to have_content('Authenticate with Amazon Web Services')
- end
- end
- end
-end
diff --git a/spec/features/admin/users/users_spec.rb b/spec/features/admin/users/users_spec.rb
index 4d9a7f31911..a05e1531949 100644
--- a/spec/features/admin/users/users_spec.rb
+++ b/spec/features/admin/users/users_spec.rb
@@ -548,7 +548,7 @@ RSpec.describe 'Admin::Users' do
end
def check_breadcrumb(content)
- expect(find('.breadcrumbs-sub-title')).to have_content(content)
+ expect(find('[data-testid="breadcrumb-current-link"]')).to have_content(content)
end
end
diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb
index aa445265eec..f8b68be7f93 100644
--- a/spec/features/dashboard/issuables_counter_spec.rb
+++ b/spec/features/dashboard/issuables_counter_spec.rb
@@ -53,6 +53,11 @@ RSpec.describe 'Navigation bar counter', :use_clean_rails_memory_store_caching d
describe 'feature flag mr_attention_requests is enabled' do
before do
merge_request.update!(assignees: [user])
+
+ merge_request.find_assignee(user).update!(state: :attention_requested)
+
+ user.invalidate_attention_requested_count
+
sign_in(user)
end
diff --git a/spec/features/dashboard/issues_filter_spec.rb b/spec/features/dashboard/issues_filter_spec.rb
index 4d59e1ded3d..3c774f8b269 100644
--- a/spec/features/dashboard/issues_filter_spec.rb
+++ b/spec/features/dashboard/issues_filter_spec.rb
@@ -78,14 +78,14 @@ RSpec.describe 'Dashboard Issues filtering', :js do
end
it 'remembers last sorting value' do
- sort_by('Created date')
+ pajamas_sort_by(s_('SortOptions|Created date'))
visit_issues(assignee_username: user.username)
expect(page).to have_button('Created date')
end
it 'keeps sorting issues after visiting Projects Issues page' do
- sort_by('Created date')
+ pajamas_sort_by(s_('SortOptions|Created date'))
visit project_issues_path(project)
expect(page).to have_button('Created date')
diff --git a/spec/features/dashboard/merge_requests_spec.rb b/spec/features/dashboard/merge_requests_spec.rb
index 7507ef4e453..fd580b679ad 100644
--- a/spec/features/dashboard/merge_requests_spec.rb
+++ b/spec/features/dashboard/merge_requests_spec.rb
@@ -112,9 +112,12 @@ RSpec.describe 'Dashboard Merge Requests' do
end
it 'includes assigned and reviewers in badge' do
- within("span[aria-label='#{n_("%d merge request", "%d merge requests", 3) % 3}']") do
- expect(page).to have_content('3')
+ within("span[aria-label='#{n_("%d merge request", "%d merge requests", 0) % 0}']") do
+ expect(page).to have_content('0')
end
+
+ find('.dashboard-shortcuts-merge_requests').click
+
expect(find('.js-assigned-mr-count')).to have_content('2')
expect(find('.js-reviewer-mr-count')).to have_content('1')
end
@@ -165,16 +168,16 @@ RSpec.describe 'Dashboard Merge Requests' do
expect(page).to have_content('Please select at least one filter to see results')
end
- it 'shows sorted merge requests' do
- sort_by('Created date')
+ it 'shows sorted merge requests', :js do
+ pajamas_sort_by(s_('SortOptions|Created date'))
visit merge_requests_dashboard_path(assignee_username: current_user.username)
expect(find('.issues-filters')).to have_content('Created date')
end
- it 'keeps sorting merge requests after visiting Projects MR page' do
- sort_by('Created date')
+ it 'keeps sorting merge requests after visiting Projects MR page', :js do
+ pajamas_sort_by(s_('SortOptions|Created date'))
visit project_merge_requests_path(project)
diff --git a/spec/features/dashboard/todos/todos_sorting_spec.rb b/spec/features/dashboard/todos/todos_sorting_spec.rb
index d0f9a2b35f3..d593031590e 100644
--- a/spec/features/dashboard/todos/todos_sorting_spec.rb
+++ b/spec/features/dashboard/todos/todos_sorting_spec.rb
@@ -23,11 +23,12 @@ RSpec.describe 'Dashboard > User sorts todos' do
let!(:merge_request_1) { create(:merge_request, source_project: project, title: 'merge_request_1') }
before do
- create(:todo, user: user, project: project, target: issue_4, created_at: 5.hours.ago)
- create(:todo, user: user, project: project, target: issue_2, created_at: 4.hours.ago)
- create(:todo, user: user, project: project, target: issue_3, created_at: 3.hours.ago)
- create(:todo, user: user, project: project, target: issue_1, created_at: 2.hours.ago)
- create(:todo, user: user, project: project, target: merge_request_1, created_at: 1.hour.ago)
+ create(:todo, user: user, project: project, target: issue_4, created_at: 5.hours.ago, updated_at: 5.hours.ago)
+ create(:todo, user: user, project: project, target: issue_2, created_at: 4.hours.ago, updated_at: 4.hours.ago)
+ create(:todo, user: user, project: project, target: issue_3, created_at: 3.hours.ago, updated_at: 2.minutes.ago)
+ create(:todo, user: user, project: project, target: issue_1, created_at: 2.hours.ago, updated_at: 2.hours.ago)
+ create(:todo, user: user, project: project, target: merge_request_1, created_at: 1.hour.ago,
+ updated_at: 1.hour.ago)
merge_request_1.labels << label_1
issue_3.labels << label_1
@@ -70,6 +71,17 @@ RSpec.describe 'Dashboard > User sorts todos' do
expect(results_list.all('.todo-title')[3]).to have_content('issue_2')
expect(results_list.all('.todo-title')[4]).to have_content('issue_4')
end
+
+ it 'sorts by newest updated todos first' do
+ click_link 'Updated date'
+
+ results_list = page.find('.todos-list')
+ expect(results_list.all('.todo-title')[0]).to have_content('issue_3')
+ expect(results_list.all('.todo-title')[1]).to have_content('merge_request_1')
+ expect(results_list.all('.todo-title')[2]).to have_content('issue_1')
+ expect(results_list.all('.todo-title')[3]).to have_content('issue_2')
+ expect(results_list.all('.todo-title')[4]).to have_content('issue_4')
+ end
end
context 'issues and merge requests' do
diff --git a/spec/features/dashboard/todos/todos_spec.rb b/spec/features/dashboard/todos/todos_spec.rb
index 68d979bb1cf..04e78b59ab4 100644
--- a/spec/features/dashboard/todos/todos_spec.rb
+++ b/spec/features/dashboard/todos/todos_spec.rb
@@ -211,9 +211,9 @@ RSpec.describe 'Dashboard Todos' do
visit dashboard_todos_path
end
- it 'shows you directly addressed yourself message' do
+ it 'shows you directly addressed yourself message being displayed as mentioned yourself' do
page.within('.js-todos-all') do
- expect(page).to have_content("You directly addressed yourself on issue #{issue.to_reference} \"Fix bug\" at #{project.namespace.owner_name} / #{project.name}")
+ expect(page).to have_content("You mentioned yourself on issue #{issue.to_reference} \"Fix bug\" at #{project.namespace.owner_name} / #{project.name}")
expect(page).not_to have_content('to yourself')
end
end
diff --git a/spec/features/explore/topics_spec.rb b/spec/features/explore/topics_spec.rb
index d6f3d6a123d..f0c57c2417a 100644
--- a/spec/features/explore/topics_spec.rb
+++ b/spec/features/explore/topics_spec.rb
@@ -13,13 +13,13 @@ RSpec.describe 'Explore Topics' do
end
context 'when topics exist' do
- let!(:topic) { create(:topic, name: 'topic1') }
+ let!(:topic) { create(:topic, name: 'topic1', title: 'Topic 1') }
it 'renders topic list' do
visit topics_explore_projects_path
expect(page).to have_current_path topics_explore_projects_path, ignore_query: true
- expect(page).to have_content('topic1')
+ expect(page).to have_content(topic.title)
end
end
end
diff --git a/spec/features/frequently_visited_projects_and_groups_spec.rb b/spec/features/frequently_visited_projects_and_groups_spec.rb
index 6bc3b745851..7fbbc4dfc85 100644
--- a/spec/features/frequently_visited_projects_and_groups_spec.rb
+++ b/spec/features/frequently_visited_projects_and_groups_spec.rb
@@ -16,7 +16,6 @@ RSpec.describe 'Frequently visited items', :js do
it 'increments localStorage counter when visiting the project' do
visit project_path(project)
- open_top_nav_projects
frequent_projects = nil
@@ -35,7 +34,6 @@ RSpec.describe 'Frequently visited items', :js do
it 'increments localStorage counter when visiting the group' do
visit group_path(group)
- open_top_nav_groups
frequent_groups = nil
diff --git a/spec/features/groups/clusters/eks_spec.rb b/spec/features/groups/clusters/eks_spec.rb
deleted file mode 100644
index 0e64a2faf3e..00000000000
--- a/spec/features/groups/clusters/eks_spec.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Group AWS EKS Cluster', :js do
- let(:group) { create(:group) }
- let(:user) { create(:user) }
-
- before do
- group.add_maintainer(user)
- gitlab_sign_in(user)
-
- allow(Groups::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
- allow_any_instance_of(Clusters::Kubernetes::CreateOrUpdateNamespaceService).to receive(:execute)
- allow_any_instance_of(Clusters::Cluster).to receive(:retrieve_connection_status).and_return(:connected)
- stub_application_setting(eks_integration_enabled: true)
- end
-
- context 'when user does not have a cluster and visits group clusters page' do
- before do
- visit group_clusters_path(group)
-
- click_button(class: 'dropdown-toggle-split')
- click_link 'Create a cluster (deprecated)'
- end
-
- context 'when user creates a cluster on AWS EKS' do
- before do
- click_link 'Amazon EKS'
- end
-
- it 'user sees a form to create an EKS cluster' do
- expect(page).to have_content('Authenticate with Amazon Web Services')
- end
- end
- end
-end
diff --git a/spec/features/groups/crm/contacts/create_spec.rb b/spec/features/groups/crm/contacts/create_spec.rb
new file mode 100644
index 00000000000..d6c6e3f1745
--- /dev/null
+++ b/spec/features/groups/crm/contacts/create_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Create a CRM contact', :js do
+ let(:user) { create(:user) }
+ let(:group) { create(:group, :crm_enabled) }
+ let!(:organization) { create(:organization, group: group, name: 'GitLab') }
+
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ visit new_group_crm_contact_path(group)
+ end
+
+ it 'creates a new contact' do
+ fill_in 'firstName', with: 'Forename'
+ fill_in 'lastName', with: 'Surname'
+ fill_in 'email', with: 'gitlab@example.com'
+ fill_in 'phone', with: '01234 555666'
+ select 'GitLab', from: 'organizationId'
+ fill_in 'description', with: 'VIP'
+ click_button 'Save changes'
+
+ expect(page).to have_content 'gitlab@example.com'
+ expect(page).to have_current_path("#{group_crm_contacts_path(group)}/", ignore_query: true)
+ end
+end
diff --git a/spec/features/groups/dependency_proxy_spec.rb b/spec/features/groups/dependency_proxy_spec.rb
index 623fb065bfc..af9c4a40729 100644
--- a/spec/features/groups/dependency_proxy_spec.rb
+++ b/spec/features/groups/dependency_proxy_spec.rb
@@ -88,22 +88,6 @@ RSpec.describe 'Group Dependency Proxy' do
sign_in(owner)
end
- context 'feature flag is disabled', :js do
- before do
- stub_feature_flags(dependency_proxy_for_private_groups: false)
- end
-
- context 'group is private' do
- let(:group) { create(:group, :private) }
-
- it 'informs user that feature is only available for public groups' do
- visit path
-
- expect(page).to have_content('Dependency Proxy feature is limited to public groups for now.')
- end
- end
- end
-
context 'feature is disabled globally' do
it 'renders 404 page' do
disable_feature
diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb
index 0317f9162cc..71f38401fa1 100644
--- a/spec/features/groups/empty_states_spec.rb
+++ b/spec/features/groups/empty_states_spec.rb
@@ -7,6 +7,8 @@ RSpec.describe 'Group empty states' do
let(:user) { create(:group_member, :developer, user: create(:user), group: group ).user }
before do
+ stub_feature_flags(vue_issues_list: true)
+
sign_in(user)
end
@@ -100,21 +102,23 @@ RSpec.describe 'Group empty states' do
end
it "the new #{issuable_name} button opens a project dropdown" do
- within '.empty-state' do
- click_button 'Toggle project select'
- end
+ click_button 'Toggle project select'
- expect(page).to have_selector('.ajax-project-dropdown')
+ if issuable == :issue
+ expect(page).to have_button project.name
+ else
+ expect(page).to have_selector('.ajax-project-dropdown')
+ end
end
end
end
shared_examples "no projects" do
- it 'displays an empty state' do
+ it 'displays an empty state', :js do
expect(page).to have_selector('.empty-state')
end
- it "does not show a new #{issuable_name} button" do
+ it "does not show a new #{issuable_name} button", :js do
within '.empty-state' do
expect(page).not_to have_link("create #{issuable_name}")
end
@@ -143,7 +147,7 @@ RSpec.describe 'Group empty states' do
visit path
end
- it 'displays an empty state' do
+ it 'displays an empty state', :js do
expect(page).to have_selector('.empty-state')
end
end
diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb
index 50982cb1452..019b094ccb5 100644
--- a/spec/features/groups/group_settings_spec.rb
+++ b/spec/features/groups/group_settings_spec.rb
@@ -223,7 +223,7 @@ RSpec.describe 'Edit group settings' do
check 'group_prevent_sharing_groups_outside_hierarchy'
expect { save_permissions_group }.to change {
- group.reload.namespace_settings.prevent_sharing_groups_outside_hierarchy
+ group.reload.prevent_sharing_groups_outside_hierarchy
}.to(true)
end
diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb
index 6b663445124..ef3346b9763 100644
--- a/spec/features/groups/issues_spec.rb
+++ b/spec/features/groups/issues_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe 'Group issues page' do
let(:project_with_issues_disabled) { create(:project, :issues_disabled, group: group) }
let(:path) { issues_group_path(group) }
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
+
context 'with shared examples', :js do
let(:issuable) { create(:issue, project: project, title: "this is my created issuable")}
@@ -58,10 +62,10 @@ RSpec.describe 'Group issues page' do
let(:user2) { user_outside_group }
it 'filters by only group users' do
- filtered_search.set('assignee:=')
+ select_tokens 'Assignee', '='
- expect(find('#js-dropdown-assignee .filter-dropdown')).to have_content(user.name)
- expect(find('#js-dropdown-assignee .filter-dropdown')).not_to have_content(user2.name)
+ expect_suggestion(user.name)
+ expect_no_suggestion(user2.name)
end
end
end
@@ -76,23 +80,9 @@ RSpec.describe 'Group issues page' do
it 'returns all group and subgroup issues' do
visit issues_group_path(group)
- page.within('.issuable-list') do
- expect(page).to have_selector('li.issue', count: 2)
- expect(page).to have_content('root group issue')
- expect(page).to have_content('subgroup issue')
- end
- end
-
- it 'truncates issue counts if over the threshold', :clean_gitlab_redis_cache do
- allow(Rails.cache).to receive(:read).and_call_original
- allow(Rails.cache).to receive(:read).with(
- ['group', group.id, 'issues'],
- { expires_in: Gitlab::IssuablesCountForState::CACHE_EXPIRES_IN }
- ).and_return({ opened: 1050, closed: 500, all: 1550 })
-
- visit issues_group_path(group)
-
- expect(page).to have_text('Open 1.1k Closed 500 All 1.6k')
+ expect(page).to have_selector('li.issue', count: 2)
+ expect(page).to have_content('root group issue')
+ expect(page).to have_content('subgroup issue')
end
context 'when project is archived' do
@@ -115,7 +105,6 @@ RSpec.describe 'Group issues page' do
let!(:subgroup_issue) { create(:issue, project: subgroup_project) }
before do
- stub_feature_flags(vue_issues_list: true)
visit issues_group_path(group_with_no_issues)
end
@@ -135,14 +124,10 @@ RSpec.describe 'Group issues page' do
end
it 'shows projects only with issues feature enabled', :js do
- within '.empty-state' do
- click_button 'Toggle project select'
- end
+ click_button 'Toggle project select'
- page.within('.select2-results') do
- expect(page).to have_content(project.full_name)
- expect(page).not_to have_content(project_with_issues_disabled.full_name)
- end
+ expect(page).to have_button project.full_name
+ expect(page).not_to have_button project_with_issues_disabled.full_name
end
end
end
@@ -155,15 +140,15 @@ RSpec.describe 'Group issues page' do
let!(:issue3) { create(:issue, project: project, title: 'Issue #3', relative_position: 3) }
before do
+ stub_feature_flags(vue_issues_list: false)
+
sign_in(user_in_group)
end
it 'displays all issues' do
visit issues_group_path(group, sort: 'relative_position')
- page.within('.issues-list') do
- expect(page).to have_selector('li.issue', count: 3)
- end
+ expect(page).to have_selector('li.issue', count: 3)
end
it 'has manual-ordering css applied' do
@@ -218,11 +203,9 @@ RSpec.describe 'Group issues page' do
end
def check_issue_order
- page.within('.manual-ordering') do
- expect(find('.issue:nth-child(1) .title')).to have_content('Issue #2')
- expect(find('.issue:nth-child(2) .title')).to have_content('Issue #3')
- expect(find('.issue:nth-child(3) .title')).to have_content('Issue #1')
- end
+ expect(page).to have_css('.issue:nth-child(1) .title', text: 'Issue #2')
+ expect(page).to have_css('.issue:nth-child(2) .title', text: 'Issue #3')
+ expect(page).to have_css('.issue:nth-child(3) .title', text: 'Issue #1')
end
end
@@ -239,14 +222,8 @@ RSpec.describe 'Group issues page' do
end
it 'shows the pagination' do
- expect(page).to have_link 'Prev'
- expect(page).to have_link 'Next'
- end
-
- it 'first pagination item is active' do
- page.within('.gl-pagination') do
- expect(find('li.active')).to have_content('1')
- end
+ expect(page).to have_button 'Prev', disabled: true
+ expect(page).to have_button 'Next'
end
end
end
diff --git a/spec/features/groups/members/manage_groups_spec.rb b/spec/features/groups/members/manage_groups_spec.rb
index 5a9223d9ee8..e4252e2f3aa 100644
--- a/spec/features/groups/members/manage_groups_spec.rb
+++ b/spec/features/groups/members/manage_groups_spec.rb
@@ -119,141 +119,11 @@ RSpec.describe 'Groups > Members > Manage groups', :js do
describe 'group search results' do
let_it_be(:group, refind: true) { create(:group) }
- context 'with instance admin considerations' do
- let_it_be(:group_to_share) { create(:group) }
-
- context 'when user is an admin' do
- let_it_be(:admin) { create(:admin) }
-
- before do
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- it 'shows groups where the admin has no direct membership' do
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- expect_not_to_have_group(group)
- end
- end
-
- it 'shows groups where the admin has at least guest level membership' do
- group_to_share.add_guest(admin)
-
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- expect_not_to_have_group(group)
- end
- end
- end
-
- context 'when user is not an admin' do
- before do
- group.add_owner(user)
- end
-
- it 'shows groups where the user has no direct membership' do
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_not_to_have_group(group_to_share)
- expect_not_to_have_group(group)
- end
- end
-
- it 'shows groups where the user has at least guest level membership' do
- group_to_share.add_guest(user)
-
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- expect_not_to_have_group(group)
- end
- end
- end
- end
-
- context 'when user is not an admin and there are hierarchy considerations' do
+ it_behaves_like 'inviting groups search results' do
+ let_it_be(:entity) { group }
let_it_be(:group_within_hierarchy) { create(:group, parent: group) }
- let_it_be(:group_outside_hierarchy) { create(:group) }
-
- before_all do
- group.add_owner(user)
- group_within_hierarchy.add_owner(user)
- group_outside_hierarchy.add_owner(user)
- end
-
- it 'does not show self or ancestors', :aggregate_failures do
- group_sibbling = create(:group, parent: group)
- group_sibbling.add_owner(user)
-
- visit group_group_members_path(group_within_hierarchy)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_outside_hierarchy)
- expect_to_have_group(group_sibbling)
- expect_not_to_have_group(group)
- expect_not_to_have_group(group_within_hierarchy)
- end
- end
-
- context 'when sharing with groups outside the hierarchy is enabled' do
- it 'shows groups within and outside the hierarchy in search results' do
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_within_hierarchy)
- expect_to_have_group(group_outside_hierarchy)
- end
- end
- end
-
- context 'when sharing with groups outside the hierarchy is disabled' do
- before do
- group.namespace_settings.update!(prevent_sharing_groups_outside_hierarchy: true)
- end
-
- it 'shows only groups within the hierarchy in search results' do
- visit group_group_members_path(group)
-
- click_on 'Invite a group'
- click_on 'Select a group'
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_within_hierarchy)
- expect_not_to_have_group(group_outside_hierarchy)
- end
- end
- end
+ let_it_be(:members_page_path) { group_group_members_path(entity) }
+ let_it_be(:members_page_path_within_hierarchy) { group_group_members_path(group_within_hierarchy) }
end
end
end
diff --git a/spec/features/groups/settings/ci_cd_spec.rb b/spec/features/groups/settings/ci_cd_spec.rb
index c5ad524e647..50c481c115c 100644
--- a/spec/features/groups/settings/ci_cd_spec.rb
+++ b/spec/features/groups/settings/ci_cd_spec.rb
@@ -17,62 +17,29 @@ RSpec.describe 'Group CI/CD settings' do
end
describe 'Runners section' do
- let(:shared_runners_toggle) { page.find('[data-testid="enable-runners-toggle"]') }
+ let(:shared_runners_toggle) { page.find('[data-testid="shared-runners-toggle"]') }
- context 'with runner_list_group_view_vue_ui enabled' do
- before do
- visit group_settings_ci_cd_path(group)
- end
-
- it 'displays the new group runners view banner' do
- expect(page).to have_content(s_('Runners|New group runners view'))
- expect(page).to have_link(href: group_runners_path(group))
- end
-
- it 'has "Enable shared runners for this group" toggle', :js do
- expect(shared_runners_toggle).to have_content(_('Enable shared runners for this group'))
- end
+ before do
+ visit group_settings_ci_cd_path(group)
end
- context 'with runner_list_group_view_vue_ui disabled' do
- before do
- stub_feature_flags(runner_list_group_view_vue_ui: false)
-
- visit group_settings_ci_cd_path(group)
- end
-
- it 'does not display the new group runners view banner' do
- expect(page).not_to have_content(s_('Runners|New group runners view'))
- expect(page).not_to have_link(href: group_runners_path(group))
- end
-
- it 'has "Enable shared runners for this group" toggle', :js do
- expect(shared_runners_toggle).to have_content(_('Enable shared runners for this group'))
- end
-
- context 'with runners registration token' do
- let!(:token) { group.runners_token }
-
- before do
- visit group_settings_ci_cd_path(group)
- end
+ it 'displays the new group runners view banner' do
+ expect(page).to have_content(s_('Runners|New group runners view'))
+ expect(page).to have_link(href: group_runners_path(group))
+ end
- it 'displays the registration token' do
- expect(page.find('#registration_token')).to have_content(token)
- end
+ it 'has "Enable shared runners for this group" toggle', :js do
+ expect(shared_runners_toggle).to have_content(_('Enable shared runners for this group'))
+ end
- describe 'reload registration token' do
- let(:page_token) { find('#registration_token').text }
+ it 'clicks on toggle to enable setting', :js do
+ expect(group.shared_runners_setting).to be(Namespace::SR_ENABLED)
- before do
- click_button 'Reset registration token'
- end
+ shared_runners_toggle.find('button').click
+ wait_for_requests
- it 'changes the registration token' do
- expect(page_token).not_to eq token
- end
- end
- end
+ group.reload
+ expect(group.shared_runners_setting).to be(Namespace::SR_DISABLED_AND_UNOVERRIDABLE)
end
end
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index 08183badda1..ceb4af03f89 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -105,6 +105,24 @@ RSpec.describe 'Group' do
expect(page).to have_content('Group path is available')
end
+
+ context 'when filling in the `Group name` field' do
+ let_it_be(:group1) { create(:group, :public, path: 'foo-bar') }
+ let_it_be(:group2) { create(:group, :public, path: 'bar-baz') }
+
+ it 'automatically populates the `Group URL` field' do
+ fill_in 'Group name', with: 'Foo bar'
+ # Wait for debounce in app/assets/javascripts/group.js#18
+ sleep(1)
+ fill_in 'Group name', with: 'Bar baz'
+ # Wait for debounce in app/assets/javascripts/group.js#18
+ sleep(1)
+
+ wait_for_requests
+
+ expect(page).to have_field('Group URL', with: 'bar-baz1')
+ end
+ end
end
describe 'Mattermost team creation' do
diff --git a/spec/features/ide/user_opens_merge_request_spec.rb b/spec/features/ide/user_opens_merge_request_spec.rb
index 72fe6eb6ca8..8f4668d49ee 100644
--- a/spec/features/ide/user_opens_merge_request_spec.rb
+++ b/spec/features/ide/user_opens_merge_request_spec.rb
@@ -14,6 +14,7 @@ RSpec.describe 'IDE merge request', :js do
end
it 'user opens merge request' do
+ click_button 'Code'
click_link 'Open in Web IDE'
wait_for_requests
diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb
index a0786d36fdf..7edf5fdc5ff 100644
--- a/spec/features/issuables/issuable_list_spec.rb
+++ b/spec/features/issuables/issuable_list_spec.rb
@@ -9,6 +9,8 @@ RSpec.describe 'issuable list', :js do
issuable_types = [:issue, :merge_request]
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_user(user, :developer)
sign_in(user)
issuable_types.each { |type| create_issuables(type) }
@@ -34,16 +36,16 @@ RSpec.describe 'issuable list', :js do
it 'sorts labels alphabetically' do
label1 = create(:label, project: project, title: 'a')
label2 = create(:label, project: project, title: 'z')
- label3 = create(:label, project: project, title: 'X')
- label4 = create(:label, project: project, title: 'B')
+ label3 = create(:label, project: project, title: 'x')
+ label4 = create(:label, project: project, title: 'b')
issuable = create_issuable(issuable_type)
issuable.labels << [label1, label2, label3, label4]
visit_issuable_list(issuable_type)
- expect(all('.gl-label-text')[0].text).to have_content('B')
- expect(all('.gl-label-text')[1].text).to have_content('X')
- expect(all('.gl-label-text')[2].text).to have_content('a')
+ expect(all('.gl-label-text')[0].text).to have_content('a')
+ expect(all('.gl-label-text')[1].text).to have_content('b')
+ expect(all('.gl-label-text')[2].text).to have_content('x')
expect(all('.gl-label-text')[3].text).to have_content('z')
end
end
diff --git a/spec/features/issuables/sorting_list_spec.rb b/spec/features/issuables/sorting_list_spec.rb
index bc40fb713ac..53723b39d5b 100644
--- a/spec/features/issuables/sorting_list_spec.rb
+++ b/spec/features/issuables/sorting_list_spec.rb
@@ -88,14 +88,14 @@ RSpec.describe 'Sort Issuable List' do
end
end
- context 'custom sorting' do
+ context 'custom sorting', :js do
let(:issuable_type) { :merge_request }
it 'supports sorting in asc and desc order' do
visit_merge_requests_with_state(project, 'open')
click_button('Created date')
- click_link('Updated date')
+ find('.dropdown-item', text: 'Updated date').click
expect(first_merge_request).to include(last_updated_issuable.title)
expect(last_merge_request).to include(first_updated_issuable.title)
diff --git a/spec/features/issue_rebalancing_spec.rb b/spec/features/issue_rebalancing_spec.rb
index 978768270ec..8a05aeec7ec 100644
--- a/spec/features/issue_rebalancing_spec.rb
+++ b/spec/features/issue_rebalancing_spec.rb
@@ -15,6 +15,10 @@ RSpec.describe 'Issue rebalancing' do
group.add_developer(user)
end
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
+
context 'when issue rebalancing is in progress' do
before do
sign_in(user)
@@ -38,16 +42,16 @@ RSpec.describe 'Issue rebalancing' do
expect(page).to have_selector('.gl-alert-info', text: alert_message_regex, count: 1)
end
- it 'shows an alert in project issues list with manual sort' do
+ it 'shows an alert in project issues list with manual sort', :js do
visit project_issues_path(project, sort: 'relative_position')
- expect(page).to have_selector('.gl-alert-info', text: alert_message_regex, count: 1)
+ expect(page).to have_selector('.flash-notice', text: alert_message_regex, count: 1)
end
- it 'shows an alert in group issues list with manual sort' do
+ it 'shows an alert in group issues list with manual sort', :js do
visit issues_group_path(group, sort: 'relative_position')
- expect(page).to have_selector('.gl-alert-info', text: alert_message_regex, count: 1)
+ expect(page).to have_selector('.flash-notice', text: alert_message_regex, count: 1)
end
it 'does not show an alert in project issues list with other sorts' do
diff --git a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
index 507d427bf0b..1e8b9b6b60b 100644
--- a/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
+++ b/spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
end
it 'shows a button to resolve all threads by creating a new issue' do
- within('.line-resolve-all-container') do
+ within('.discussions-counter') do
expect(page).to have_selector resolve_all_discussions_link_selector( title: "Create issue to resolve all threads" )
end
end
@@ -76,14 +76,12 @@ RSpec.describe 'Resolving all open threads in a merge request from an issue', :j
end
it 'has a link to resolve all threads by creating an issue' do
- page.within '.mr-widget-body' do
- expect(page).to have_link 'Create issue to resolve all threads', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
- end
+ expect(page).to have_link 'Create issue to resolve all threads', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
end
context 'creating an issue for threads' do
before do
- page.within '.mr-widget-body' do
+ page.within '.mr-state-widget' do
page.click_link 'Create issue to resolve all threads', href: new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid)
wait_for_all_requests
diff --git a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
index 3ba2f7e788d..18b70c9622a 100644
--- a/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_assignee_spec.rb
@@ -6,11 +6,12 @@ RSpec.describe 'Dropdown assignee', :js do
include FilteredSearchHelpers
let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:js_dropdown_assignee) { '#js-dropdown-assignee' }
- let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") }
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
describe 'behavior' do
before do
@@ -21,15 +22,17 @@ RSpec.describe 'Dropdown assignee', :js do
end
it 'loads all the assignees when opened' do
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ select_tokens 'Assignee', '='
- expect_filtered_search_dropdown_results(filter_dropdown, 2)
+ # Expect None, Any, administrator, John Doe2
+ expect_suggestion_count 4
end
it 'shows current user at top of dropdown' do
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ select_tokens 'Assignee', '='
- expect(filter_dropdown.first('.filter-dropdown-item')).to have_content(user.name)
+ # List items 1 to 3 are None, Any, divider
+ expect(page).to have_css('.gl-filtered-search-suggestion:nth-child(4)', text: user.name)
end
end
@@ -41,7 +44,7 @@ RSpec.describe 'Dropdown assignee', :js do
visit project_issues_path(project)
Gitlab::Testing::RequestBlockerMiddleware.block_requests!
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ select_tokens 'Assignee', '='
end
after do
@@ -49,11 +52,10 @@ RSpec.describe 'Dropdown assignee', :js do
end
it 'selects current user' do
- find("#{js_dropdown_assignee} .filter-dropdown-item", text: user.username).click
+ click_on user.username
- expect(page).to have_css(js_dropdown_assignee, visible: false)
- expect_tokens([assignee_token(user.username)])
- expect_filtered_search_input_empty
+ expect_assignee_token(user.username)
+ expect_empty_search_term
end
end
@@ -93,7 +95,7 @@ RSpec.describe 'Dropdown assignee', :js do
it 'shows inherited, direct, and invited group members but not descendent members', :aggregate_failures do
visit issues_group_path(subgroup)
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ select_tokens 'Assignee', '='
expect(page).to have_text group_user.name
expect(page).to have_text subgroup_user.name
@@ -103,7 +105,7 @@ RSpec.describe 'Dropdown assignee', :js do
visit project_issues_path(subgroup_project)
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ select_tokens 'Assignee', '='
expect(page).to have_text group_user.name
expect(page).to have_text subgroup_user.name
diff --git a/spec/features/issues/filtered_search/dropdown_author_spec.rb b/spec/features/issues/filtered_search/dropdown_author_spec.rb
index 893ffc6575b..07e2bd3b7e4 100644
--- a/spec/features/issues/filtered_search/dropdown_author_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_author_spec.rb
@@ -6,13 +6,12 @@ RSpec.describe 'Dropdown author', :js do
include FilteredSearchHelpers
let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:js_dropdown_author) { '#js-dropdown-author' }
- let(:filter_dropdown) { find("#{js_dropdown_author} .filter-dropdown") }
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
sign_in(user)
@@ -21,22 +20,22 @@ RSpec.describe 'Dropdown author', :js do
describe 'behavior' do
it 'loads all the authors when opened' do
- input_filtered_search('author:=', submit: false, extra_space: false)
+ select_tokens 'Author', '='
- expect_filtered_search_dropdown_results(filter_dropdown, 2)
+ expect_suggestion_count 2
end
it 'shows current user at top of dropdown' do
- input_filtered_search('author:=', submit: false, extra_space: false)
+ select_tokens 'Author', '='
- expect(filter_dropdown.first('.filter-dropdown-item')).to have_content(user.name)
+ expect(page).to have_css('.gl-filtered-search-suggestion:first-child', text: user.name)
end
end
describe 'selecting from dropdown without Ajax call' do
before do
Gitlab::Testing::RequestBlockerMiddleware.block_requests!
- input_filtered_search('author:=', submit: false, extra_space: false)
+ select_tokens 'Author', '='
end
after do
@@ -44,11 +43,10 @@ RSpec.describe 'Dropdown author', :js do
end
it 'selects current user' do
- find("#{js_dropdown_author} .filter-dropdown-item", text: user.username).click
+ click_on user.username
- expect(page).to have_css(js_dropdown_author, visible: false)
- expect_tokens([author_token(user.username)])
- expect_filtered_search_input_empty
+ expect_author_token(user.username)
+ expect_empty_search_term
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_base_spec.rb b/spec/features/issues/filtered_search/dropdown_base_spec.rb
index b8fb807dd78..5fdab288b2d 100644
--- a/spec/features/issues/filtered_search/dropdown_base_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_base_spec.rb
@@ -6,18 +6,12 @@ RSpec.describe 'Dropdown base', :js do
include FilteredSearchHelpers
let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
- let(:js_dropdown_assignee) { '#js-dropdown-assignee' }
- let(:filter_dropdown) { find("#{js_dropdown_assignee} .filter-dropdown") }
-
- def dropdown_assignee_size
- filter_dropdown.all('.filter-dropdown-item').size
- end
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
sign_in(user)
@@ -26,17 +20,17 @@ RSpec.describe 'Dropdown base', :js do
describe 'caching requests' do
it 'caches requests after the first load' do
- input_filtered_search('assignee:=', submit: false, extra_space: false)
- initial_size = dropdown_assignee_size
+ select_tokens 'Assignee', '='
+ initial_size = get_suggestion_count
expect(initial_size).to be > 0
new_user = create(:user)
project.add_maintainer(new_user)
- find('.filtered-search-box .clear-search').click
- input_filtered_search('assignee:=', submit: false, extra_space: false)
+ click_button 'Clear'
+ select_tokens 'Assignee', '='
- expect(dropdown_assignee_size).to eq(initial_size)
+ expect_suggestion_count(initial_size)
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
index f5ab53d5052..d6d59b89a8c 100644
--- a/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_emoji_spec.rb
@@ -6,15 +6,13 @@ RSpec.describe 'Dropdown emoji', :js do
include FilteredSearchHelpers
let_it_be(:project) { create(:project, :public) }
- let_it_be(:user) { create(:user, name: 'administrator', username: 'root') }
+ let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) }
- let(:filtered_search) { find('.filtered-search') }
- let(:js_dropdown_emoji) { '#js-dropdown-my-reaction' }
- let(:filter_dropdown) { find("#{js_dropdown_emoji} .filter-dropdown") }
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
create_list(:award_emoji, 2, user: user, name: 'thumbsup')
create_list(:award_emoji, 1, user: user, name: 'thumbsdown')
@@ -27,15 +25,15 @@ RSpec.describe 'Dropdown emoji', :js do
end
describe 'behavior' do
- it 'does not open when the search bar has my-reaction=' do
- filtered_search.set('my-reaction=')
+ it 'does not contain My-Reaction in the list of suggestions' do
+ click_filtered_search_bar
- expect(page).not_to have_css(js_dropdown_emoji)
+ expect(page).not_to have_link 'My-Reaction'
end
end
end
- context 'when user loggged in' do
+ context 'when user logged in' do
before do
sign_in(user)
@@ -43,22 +41,18 @@ RSpec.describe 'Dropdown emoji', :js do
end
describe 'behavior' do
- it 'opens when the search bar has my-reaction=' do
- filtered_search.set('my-reaction:=')
-
- expect(page).to have_css(js_dropdown_emoji, visible: true)
- end
-
it 'loads all the emojis when opened' do
- input_filtered_search('my-reaction:=', submit: false, extra_space: false)
+ select_tokens 'My-Reaction', '='
- expect_filtered_search_dropdown_results(filter_dropdown, 3)
+ # Expect None, Any, star, thumbsup, thumbsdown
+ expect_suggestion_count 5
end
it 'shows the most populated emoji at top of dropdown' do
- input_filtered_search('my-reaction:=', submit: false, extra_space: false)
+ select_tokens 'My-Reaction', '='
- expect(first("#{js_dropdown_emoji} .filter-dropdown li")).to have_content(award_emoji_star.name)
+ # List items 1-3 are None, Any, divider
+ expect(page).to have_css('.gl-filtered-search-suggestion-list li:nth-child(4)', text: award_emoji_star.name)
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_hint_spec.rb b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
index 9cc58a33bb7..c64247b2b15 100644
--- a/spec/features/issues/filtered_search/dropdown_hint_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_hint_spec.rb
@@ -9,19 +9,9 @@ RSpec.describe 'Dropdown hint', :js do
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
- let(:js_dropdown_hint) { '#js-dropdown-hint' }
- let(:js_dropdown_operator) { '#js-dropdown-operator' }
-
- def click_hint(text)
- find('#js-dropdown-hint .filter-dropdown .filter-dropdown-item', text: text).click
- end
-
- def click_operator(op)
- find("#js-dropdown-operator .filter-dropdown .filter-dropdown-item[data-value='#{op}']").click
- end
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
end
@@ -31,8 +21,9 @@ RSpec.describe 'Dropdown hint', :js do
end
it 'does not exist my-reaction dropdown item' do
- expect(page).to have_css(js_dropdown_hint, visible: false)
- expect(page).not_to have_content('My-reaction')
+ click_filtered_search_bar
+
+ expect(page).not_to have_link 'My-reaction'
end
end
@@ -45,57 +36,56 @@ RSpec.describe 'Dropdown hint', :js do
describe 'behavior' do
before do
- expect(page).to have_css(js_dropdown_hint, visible: false)
- filtered_search.click
+ click_filtered_search_bar
end
it 'opens when the search bar is first focused' do
- expect(page).to have_css(js_dropdown_hint, visible: true)
+ expect_visible_suggestions_list
find('body').click
- expect(page).to have_css(js_dropdown_hint, visible: false)
+ expect_hidden_suggestions_list
end
end
describe 'filtering' do
it 'filters with text' do
- filtered_search.set('a')
+ click_filtered_search_bar
+ send_keys 'as'
- expect(find(js_dropdown_hint)).to have_selector('.filter-dropdown .filter-dropdown-item', count: 6)
+ # Expect Assignee and Release
+ expect_suggestion_count 2
end
end
describe 'selecting from dropdown with no input' do
before do
- filtered_search.click
+ click_filtered_search_bar
end
it 'opens the token dropdown when you click on it' do
- click_hint('Author')
+ click_link 'Author'
- expect(page).to have_css(js_dropdown_hint, visible: false)
- expect(page).to have_css(js_dropdown_operator, visible: true)
+ expect_visible_suggestions_list
+ expect_suggestion '='
- click_operator('=')
+ click_link '= is'
- expect(page).to have_css(js_dropdown_hint, visible: false)
- expect(page).to have_css(js_dropdown_operator, visible: false)
- expect(page).to have_css('#js-dropdown-author', visible: true)
- expect_tokens([{ name: 'Author', operator: '=' }])
- expect_filtered_search_input_empty
+ expect_visible_suggestions_list
+ expect_token_segment 'Author'
+ expect_token_segment '='
+ expect_empty_search_term
end
end
describe 'reselecting from dropdown' do
it 'reuses existing token text' do
- filtered_search.send_keys('author')
- filtered_search.send_keys(:backspace)
- filtered_search.send_keys(:backspace)
- click_hint('Author')
+ click_filtered_search_bar
+ send_keys 'author', :backspace, :backspace
+ click_link 'Author'
- expect_tokens([{ name: 'Author' }])
- expect_filtered_search_input_empty
+ expect_token_segment 'Author'
+ expect_empty_search_term
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_label_spec.rb b/spec/features/issues/filtered_search/dropdown_label_spec.rb
index 1b48810f716..67e3792a04c 100644
--- a/spec/features/issues/filtered_search/dropdown_label_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_label_spec.rb
@@ -10,10 +10,9 @@ RSpec.describe 'Dropdown label', :js do
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:label) { create(:label, project: project, title: 'bug-label') }
- let(:filtered_search) { find('.filtered-search') }
- let(:filter_dropdown) { find('#js-dropdown-label .filter-dropdown') }
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
sign_in(user)
@@ -22,9 +21,10 @@ RSpec.describe 'Dropdown label', :js do
describe 'behavior' do
it 'loads all the labels when opened' do
- filtered_search.set('label:=')
+ select_tokens 'Label', '='
- expect_filtered_search_dropdown_results(filter_dropdown, 1)
+ # Expect None, Any, bug-label
+ expect_suggestion_count 3
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
index 859d1e4a5e5..19a4c8853f1 100644
--- a/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_milestone_spec.rb
@@ -11,10 +11,9 @@ RSpec.describe 'Dropdown milestone', :js do
let_it_be(:uppercase_milestone) { create(:milestone, title: 'CAP_MILESTONE', project: project) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
- let(:filter_dropdown) { find('#js-dropdown-milestone .filter-dropdown') }
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
sign_in(user)
@@ -22,12 +21,11 @@ RSpec.describe 'Dropdown milestone', :js do
end
describe 'behavior' do
- before do
- filtered_search.set('milestone:=')
- end
-
it 'loads all the milestones when opened' do
- expect_filtered_search_dropdown_results(filter_dropdown, 2)
+ select_tokens 'Milestone', '='
+
+ # Expect None, Any, Upcoming, Started, CAP_MILESTONE, v1.0
+ expect_suggestion_count 6
end
end
end
diff --git a/spec/features/issues/filtered_search/dropdown_release_spec.rb b/spec/features/issues/filtered_search/dropdown_release_spec.rb
index 2210a26c251..50ac9068b26 100644
--- a/spec/features/issues/filtered_search/dropdown_release_spec.rb
+++ b/spec/features/issues/filtered_search/dropdown_release_spec.rb
@@ -5,16 +5,15 @@ require 'spec_helper'
RSpec.describe 'Dropdown release', :js do
include FilteredSearchHelpers
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
let_it_be(:release) { create(:release, tag: 'v1.0', project: project) }
let_it_be(:crazy_release) { create(:release, tag: '☺!/"#%&\'{}+,-.<>;=@]_`{|}🚀', project: project) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
- let(:filter_dropdown) { find('#js-dropdown-release .filter-dropdown') }
-
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_maintainer(user)
sign_in(user)
@@ -22,12 +21,11 @@ RSpec.describe 'Dropdown release', :js do
end
describe 'behavior' do
- before do
- filtered_search.set('release:=')
- end
-
it 'loads all the releases when opened' do
- expect_filtered_search_dropdown_results(filter_dropdown, 2)
+ select_tokens 'Release', '='
+
+ # Expect None, Any, v1.0, !/\"#%&'{}+,-.<>;=@]_`{|}
+ expect_suggestion_count 4
end
end
end
diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb
index 1375384d1aa..13bce49e6d1 100644
--- a/spec/features/issues/filtered_search/filter_issues_spec.rb
+++ b/spec/features/issues/filtered_search/filter_issues_spec.rb
@@ -6,13 +6,8 @@ RSpec.describe 'Filter issues', :js do
include FilteredSearchHelpers
let(:project) { create(:project) }
-
- # NOTE: The short name here is actually important
- #
- # When the name is longer, the filtered search input can end up scrolling
- # horizontally, and PhantomJS can't handle it.
- let(:user) { create(:user, name: 'Ann') }
- let(:user2) { create(:user, name: 'jane') }
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
let!(:bug_label) { create(:label, project: project, title: 'bug') }
let!(:caps_sensitive_label) { create(:label, project: project, title: 'CaPs') }
@@ -24,6 +19,7 @@ RSpec.describe 'Filter issues', :js do
end
before do
+ stub_feature_flags(vue_issues_list: true)
project.add_maintainer(user)
create(:issue, project: project, author: user2, title: "Bug report 1")
@@ -64,31 +60,25 @@ RSpec.describe 'Filter issues', :js do
it 'filters by all available tokens' do
search_term = 'issue'
+ select_tokens 'Assignee', '=', user.username, 'Author', '=', user.username, 'Label', '=', caps_sensitive_label.title, 'Milestone', '=', milestone.title
+ send_keys search_term, :enter
- input_filtered_search("assignee:=@#{user.username} author:=@#{user.username} label:=~#{caps_sensitive_label.title} milestone:=%#{milestone.title} #{search_term}")
-
- wait_for_requests
-
- expect_tokens([
- assignee_token(user.name),
- author_token(user.name),
- label_token(caps_sensitive_label.title),
- milestone_token(milestone.title)
- ])
+ expect_assignee_token(user.name)
+ expect_author_token(user.name)
+ expect_label_token(caps_sensitive_label.title)
+ expect_milestone_token(milestone.title)
expect_issues_list_count(1)
- expect_filtered_search_input(search_term)
+ expect_search_term(search_term)
end
describe 'filter issues by author' do
context 'only author' do
it 'filters issues by searched author' do
- input_filtered_search("author:=@#{user.username}")
+ select_tokens 'Author', '=', user.username, submit: true
- wait_for_requests
-
- expect_tokens([author_token(user.name)])
+ expect_author_token(user.name)
expect_issues_list_count(5)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
end
end
@@ -96,46 +86,30 @@ RSpec.describe 'Filter issues', :js do
describe 'filter issues by assignee' do
context 'only assignee' do
it 'filters issues by searched assignee' do
- input_filtered_search("assignee:=@#{user.username}")
-
- wait_for_requests
+ select_tokens 'Assignee', '=', user.username, submit: true
- expect_tokens([assignee_token(user.name)])
+ expect_assignee_token(user.name)
expect_issues_list_count(5)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by no assignee' do
- input_filtered_search('assignee:=none')
+ select_tokens 'Assignee', '=', 'None', submit: true
- expect_tokens([assignee_token('None')])
+ expect_assignee_token 'None'
expect_issues_list_count(3)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by invalid assignee' do
skip('to be tested, issue #26546')
end
-
- it 'filters issues by multiple assignees' do
- create(:issue, project: project, author: user, assignees: [user2, user])
-
- input_filtered_search("assignee:=@#{user.username} assignee:=@#{user2.username}")
-
- expect_tokens([
- assignee_token(user.name),
- assignee_token(user2.name)
- ])
-
- expect_issues_list_count(1)
- expect_filtered_search_input_empty
- end
end
end
describe 'filter by reviewer' do
it 'does not allow filtering by reviewer' do
- find('.filtered-search').click
+ click_filtered_search_bar
expect(page).not_to have_button('Reviewer')
end
@@ -144,57 +118,53 @@ RSpec.describe 'Filter issues', :js do
describe 'filter issues by label' do
context 'only label' do
it 'filters issues by searched label' do
- input_filtered_search("label:=~#{bug_label.title}")
+ select_tokens 'Label', '=', bug_label.title, submit: true
- expect_tokens([label_token(bug_label.title)])
+ expect_label_token(bug_label.title)
expect_issues_list_count(2)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues not containing searched label' do
- input_filtered_search("label:!=~#{bug_label.title}")
+ select_tokens 'Label', '!=', bug_label.title, submit: true
- expect_tokens([label_token(bug_label.title)])
+ expect_negated_label_token(bug_label.title)
expect_issues_list_count(6)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by any label' do
- input_filtered_search('label:=any')
+ select_tokens 'Label', '=', 'Any', submit: true
- expect_tokens([label_token('Any', false)])
+ expect_label_token 'Any'
expect_issues_list_count(4)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by no label' do
- input_filtered_search('label:=none')
+ select_tokens 'Label', '=', 'None', submit: true
- expect_tokens([label_token('None', false)])
+ expect_label_token 'None'
expect_issues_list_count(4)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by multiple labels' do
- input_filtered_search("label:=~#{bug_label.title} label:=~#{caps_sensitive_label.title}")
+ select_tokens 'Label', '=', bug_label.title, 'Label', '=', caps_sensitive_label.title, submit: true
- expect_tokens([
- label_token(bug_label.title),
- label_token(caps_sensitive_label.title)
- ])
+ expect_label_token(bug_label.title)
+ expect_label_token(caps_sensitive_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by multiple labels with not operator' do
- input_filtered_search("label:!=~#{bug_label.title} label:=~#{caps_sensitive_label.title}")
+ select_tokens 'Label', '!=', bug_label.title, 'Label', '=', caps_sensitive_label.title, submit: true
- expect_tokens([
- label_token(bug_label.title),
- label_token(caps_sensitive_label.title)
- ])
+ expect_negated_label_token(bug_label.title)
+ expect_label_token(caps_sensitive_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by label containing special characters' do
@@ -202,11 +172,11 @@ RSpec.describe 'Filter issues', :js do
special_issue = create(:issue, title: "Issue with special character label", project: project)
special_issue.labels << special_label
- input_filtered_search("label:=~#{special_label.title}")
+ select_tokens 'Label', '=', special_label.title, submit: true
- expect_tokens([label_token(special_label.title)])
+ expect_label_token(special_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by label not containing special characters' do
@@ -214,21 +184,21 @@ RSpec.describe 'Filter issues', :js do
special_issue = create(:issue, title: "Issue with special character label", project: project)
special_issue.labels << special_label
- input_filtered_search("label:!=~#{special_label.title}")
+ select_tokens 'Label', '!=', special_label.title, submit: true
- expect_tokens([label_token(special_label.title)])
+ expect_negated_label_token(special_label.title)
expect_issues_list_count(8)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'does not show issues for unused labels' do
new_label = create(:label, project: project, title: 'new_label')
- input_filtered_search("label:=~#{new_label.title}")
+ select_tokens 'Label', '=', new_label.title, submit: true
- expect_tokens([label_token(new_label.title)])
+ expect_label_token(new_label.title)
expect_no_issues_list
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
end
@@ -238,31 +208,28 @@ RSpec.describe 'Filter issues', :js do
special_multiple_issue = create(:issue, title: "Issue with special character multiple words label", project: project)
special_multiple_issue.labels << special_multiple_label
- input_filtered_search("label:=~'#{special_multiple_label.title}'")
+ select_tokens 'Label', '=', special_multiple_label.title, submit: true
# Check for search results (which makes sure that the page has changed)
expect_issues_list_count(1)
-
- # filtered search defaults quotations to double quotes
- expect_tokens([label_token("\"#{special_multiple_label.title}\"")])
-
- expect_filtered_search_input_empty
+ expect_label_token(special_multiple_label.title)
+ expect_empty_search_term
end
it 'single quotes' do
- input_filtered_search("label:=~'#{multiple_words_label.title}'")
+ select_tokens 'Label', '=', multiple_words_label.title, submit: true
expect_issues_list_count(1)
- expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
- expect_filtered_search_input_empty
+ expect_label_token(multiple_words_label.title)
+ expect_empty_search_term
end
it 'double quotes' do
- input_filtered_search("label:=~\"#{multiple_words_label.title}\"")
+ select_tokens 'Label', '=', multiple_words_label.title, submit: true
- expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
+ expect_label_token(multiple_words_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'single quotes containing double quotes' do
@@ -270,11 +237,11 @@ RSpec.describe 'Filter issues', :js do
double_quotes_label_issue = create(:issue, title: "Issue with double quotes label", project: project)
double_quotes_label_issue.labels << double_quotes_label
- input_filtered_search("label:=~'#{double_quotes_label.title}'")
+ select_tokens 'Label', '=', double_quotes_label.title, submit: true
- expect_tokens([label_token("'#{double_quotes_label.title}'")])
+ expect_label_token(double_quotes_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'double quotes containing single quotes' do
@@ -282,49 +249,41 @@ RSpec.describe 'Filter issues', :js do
single_quotes_label_issue = create(:issue, title: "Issue with single quotes label", project: project)
single_quotes_label_issue.labels << single_quotes_label
- input_filtered_search("label:=~\"#{single_quotes_label.title}\"")
+ select_tokens 'Label', '=', single_quotes_label.title, submit: true
- expect_tokens([label_token("\"#{single_quotes_label.title}\"")])
+ expect_label_token(single_quotes_label.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
end
context 'multiple labels with other filters' do
it 'filters issues by searched label, label2, author, assignee, milestone and text' do
search_term = 'bug'
-
- input_filtered_search("label:=~#{bug_label.title} label:=~#{caps_sensitive_label.title} author:=@#{user.username} assignee:=@#{user.username} milestone:=%#{milestone.title} #{search_term}")
-
- wait_for_requests
-
- expect_tokens([
- label_token(bug_label.title),
- label_token(caps_sensitive_label.title),
- author_token(user.name),
- assignee_token(user.name),
- milestone_token(milestone.title)
- ])
+ select_tokens 'Label', '=', bug_label.title, 'Label', '=', caps_sensitive_label.title, 'Author', '=', user.username, 'Assignee', '=', user.username, 'Milestone', '=', milestone.title
+ send_keys search_term, :enter
+
+ expect_label_token(bug_label.title)
+ expect_label_token(caps_sensitive_label.title)
+ expect_author_token(user.name)
+ expect_assignee_token(user.name)
+ expect_milestone_token(milestone.title)
expect_issues_list_count(1)
- expect_filtered_search_input(search_term)
+ expect_search_term(search_term)
end
it 'filters issues by searched label, label2, author, assignee, not included in a milestone' do
search_term = 'bug'
-
- input_filtered_search("label:=~#{bug_label.title} label:=~#{caps_sensitive_label.title} author:=@#{user.username} assignee:=@#{user.username} milestone:!=%#{milestone.title} #{search_term}")
-
- wait_for_requests
-
- expect_tokens([
- label_token(bug_label.title),
- label_token(caps_sensitive_label.title),
- author_token(user.name),
- assignee_token(user.name),
- milestone_token(milestone.title, false, '!=')
- ])
+ select_tokens 'Label', '=', bug_label.title, 'Label', '=', caps_sensitive_label.title, 'Author', '=', user.username, 'Assignee', '=', user.username, 'Milestone', '!=', milestone.title
+ send_keys search_term, :enter
+
+ expect_label_token(bug_label.title)
+ expect_label_token(caps_sensitive_label.title)
+ expect_author_token(user.name)
+ expect_assignee_token(user.name)
+ expect_negated_milestone_token(milestone.title)
expect_issues_list_count(0)
- expect_filtered_search_input(search_term)
+ expect_search_term(search_term)
end
end
@@ -333,8 +292,8 @@ RSpec.describe 'Filter issues', :js do
click_link multiple_words_label.title
expect_issues_list_count(1)
- expect_tokens([label_token("\"#{multiple_words_label.title}\"")])
- expect_filtered_search_input_empty
+ expect_label_token(multiple_words_label.title)
+ expect_empty_search_term
end
end
end
@@ -342,19 +301,19 @@ RSpec.describe 'Filter issues', :js do
describe 'filter issues by milestone' do
context 'only milestone' do
it 'filters issues by searched milestone' do
- input_filtered_search("milestone:=%#{milestone.title}")
+ select_tokens 'Milestone', '=', milestone.title, submit: true
- expect_tokens([milestone_token(milestone.title)])
+ expect_milestone_token(milestone.title)
expect_issues_list_count(5)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by no milestone' do
- input_filtered_search("milestone:=none")
+ select_tokens 'Milestone', '=', 'None', submit: true
- expect_tokens([milestone_token('None', false)])
+ expect_milestone_token 'None'
expect_issues_list_count(3)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by upcoming milestones' do
@@ -362,11 +321,11 @@ RSpec.describe 'Filter issues', :js do
create(:issue, project: project, milestone: future_milestone, author: user)
end
- input_filtered_search("milestone:=upcoming")
+ select_tokens 'Milestone', '=', 'Upcoming', submit: true
- expect_tokens([milestone_token('Upcoming', false)])
+ expect_milestone_token 'Upcoming'
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by negation of upcoming milestones' do
@@ -378,72 +337,72 @@ RSpec.describe 'Filter issues', :js do
create(:issue, project: project, milestone: past_milestone, author: user)
end
- input_filtered_search("milestone:!=upcoming")
+ select_tokens 'Milestone', '!=', 'Upcoming', submit: true
- expect_tokens([milestone_token('Upcoming', false, '!=')])
+ expect_negated_milestone_token 'Upcoming'
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by started milestones' do
- input_filtered_search("milestone:=started")
+ select_tokens 'Milestone', '=', 'Started', submit: true
- expect_tokens([milestone_token('Started', false)])
+ expect_milestone_token 'Started'
expect_issues_list_count(5)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by negation of started milestones' do
milestone2 = create(:milestone, title: "9", project: project, start_date: 2.weeks.from_now)
create(:issue, project: project, author: user, title: "something else", milestone: milestone2)
- input_filtered_search("milestone:!=started")
+ select_tokens 'Milestone', '!=', 'Started', submit: true
- expect_tokens([milestone_token('Started', false, '!=')])
+ expect_negated_milestone_token 'Started'
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by milestone containing special characters' do
special_milestone = create(:milestone, title: '!@\#{$%^&*()}', project: project)
create(:issue, project: project, milestone: special_milestone)
- input_filtered_search("milestone:=%#{special_milestone.title}")
+ select_tokens 'Milestone', '=', special_milestone.title, submit: true
- expect_tokens([milestone_token(special_milestone.title)])
+ expect_milestone_token(special_milestone.title)
expect_issues_list_count(1)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'filters issues by milestone not containing special characters' do
special_milestone = create(:milestone, title: '!@\#{$%^&*()}', project: project)
create(:issue, project: project, milestone: special_milestone)
- input_filtered_search("milestone:!=%#{special_milestone.title}")
+ select_tokens 'Milestone', '!=', special_milestone.title, submit: true
- expect_tokens([milestone_token(special_milestone.title, false, '!=')])
+ expect_negated_milestone_token(special_milestone.title)
expect_issues_list_count(8)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'does not show issues for unused milestones' do
new_milestone = create(:milestone, title: 'new', project: project)
- input_filtered_search("milestone:=%#{new_milestone.title}")
+ select_tokens 'Milestone', '=', new_milestone.title, submit: true
- expect_tokens([milestone_token(new_milestone.title)])
+ expect_milestone_token(new_milestone.title)
expect_no_issues_list
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
it 'show issues for unused milestones' do
new_milestone = create(:milestone, title: 'new', project: project)
- input_filtered_search("milestone:!=%#{new_milestone.title}")
+ select_tokens 'Milestone', '!=', new_milestone.title, submit: true
- expect_tokens([milestone_token(new_milestone.title, false, '!=')])
+ expect_negated_milestone_token(new_milestone.title)
expect_issues_list_count(8)
- expect_filtered_search_input_empty
+ expect_empty_search_term
end
end
end
@@ -452,47 +411,47 @@ RSpec.describe 'Filter issues', :js do
context 'only text' do
it 'filters issues by searched text' do
search = 'Bug'
- input_filtered_search(search)
+ submit_search_term(search)
expect_issues_list_count(4)
- expect_filtered_search_input(search)
+ expect_search_term(search)
end
it 'filters issues by multiple searched text' do
search = 'Bug report'
- input_filtered_search(search)
+ submit_search_term(search)
expect_issues_list_count(3)
- expect_filtered_search_input(search)
+ expect_search_term(search)
end
it 'filters issues by case insensitive searched text' do
search = 'bug report'
- input_filtered_search(search)
+ submit_search_term(search)
expect_issues_list_count(3)
- expect_filtered_search_input(search)
+ expect_search_term(search)
end
it 'filters issues by searched text containing single quotes' do
issue = create(:issue, project: project, author: user, title: "issue with 'single quotes'")
- search = "'single quotes'"
- input_filtered_search(search)
+ search = 'single quotes'
+ submit_search_term "'#{search}'"
expect_issues_list_count(1)
- expect_filtered_search_input(search)
+ expect_search_term(search)
expect(page).to have_content(issue.title)
end
it 'filters issues by searched text containing double quotes' do
issue = create(:issue, project: project, author: user, title: "issue with \"double quotes\"")
- search = '"double quotes"'
- input_filtered_search(search)
+ search = 'double quotes'
+ submit_search_term "\"#{search}\""
expect_issues_list_count(1)
- expect_filtered_search_input(search)
+ expect_search_term(search)
expect(page).to have_content(issue.title)
end
@@ -502,36 +461,43 @@ RSpec.describe 'Filter issues', :js do
issue = create(:issue, project: project, author: user, title: "issue with !@\#{$%^&*()-+")
search = '!@#{$%^&*()-+'
- input_filtered_search(search)
+ submit_search_term(search)
expect_issues_list_count(1)
- expect_filtered_search_input(search)
+ expect_search_term(search)
expect(page).to have_content(issue.title)
end
it 'does not show any issues' do
search = 'testing'
- input_filtered_search(search)
+ submit_search_term(search)
expect_no_issues_list
- expect_filtered_search_input(search)
+ expect_search_term(search)
end
it 'filters issues by issue reference' do
search = '#1'
- input_filtered_search(search)
+ submit_search_term(search)
expect_issues_list_count(1)
- expect_filtered_search_input(search)
+ expect_search_term(search)
end
end
context 'searched text with other filters' do
it 'filters issues by searched text, author, text, assignee, text, label1, text, label2, text, milestone and text' do
- input_filtered_search("bug author:=@#{user.username} report label:=~#{bug_label.title} label:=~#{caps_sensitive_label.title} milestone:=%#{milestone.title} foo")
+ click_filtered_search_bar
+ send_keys 'bug '
+ select_tokens 'Author', '=', user.username
+ send_keys 'report '
+ select_tokens 'Label', '=', bug_label.title
+ select_tokens 'Label', '=', caps_sensitive_label.title
+ select_tokens 'Milestone', '=', milestone.title
+ send_keys 'foo', :enter
expect_issues_list_count(1)
- expect_filtered_search_input('bug report foo')
+ expect_search_term('bug report foo')
end
end
@@ -549,17 +515,11 @@ RSpec.describe 'Filter issues', :js do
author: user,
created_at: 5.days.ago)
- input_filtered_search('days ago')
+ submit_search_term 'days ago'
expect_issues_list_count(2)
-
- sort_toggle = find('.filter-dropdown-container .dropdown')
- sort_toggle.click
-
- find('.filter-dropdown-container .dropdown-menu li a', text: 'Created date').click
- wait_for_requests
-
- expect(find('.issues-list .issue:first-of-type .issue-title-text a')).to have_content(new_issue.title)
+ expect(page).to have_button 'Created date'
+ expect(page).to have_css('.issue:first-of-type .issue-title', text: new_issue.title)
end
end
end
@@ -568,7 +528,7 @@ RSpec.describe 'Filter issues', :js do
let!(:closed_issue) { create(:issue, :closed, project: project, title: 'closed bug') }
before do
- input_filtered_search('bug')
+ submit_search_term 'bug'
# This ensures that the search is performed
expect_issues_list_count(4, 1)
@@ -599,19 +559,17 @@ RSpec.describe 'Filter issues', :js do
end
it 'milestone dropdown loads milestones' do
- input_filtered_search("milestone:=", submit: false)
+ select_tokens 'Milestone', '='
- within('#js-dropdown-milestone') do
- expect(page).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1)
- end
+ # Expect None, Any, Upcoming, Started, 8
+ expect_suggestion_count 5
end
it 'label dropdown load labels' do
- input_filtered_search("label:=", submit: false)
+ select_tokens 'Label', '='
- within('#js-dropdown-label') do
- expect(page).to have_selector('.filter-dropdown .filter-dropdown-item', count: 3)
- end
+ # Dropdown shows None, Any, and 3 labels
+ expect_suggestion_count 5
end
end
end
diff --git a/spec/features/issues/filtered_search/recent_searches_spec.rb b/spec/features/issues/filtered_search/recent_searches_spec.rb
index 3929d3694ff..bb5964258be 100644
--- a/spec/features/issues/filtered_search/recent_searches_spec.rb
+++ b/spec/features/issues/filtered_search/recent_searches_spec.rb
@@ -4,7 +4,6 @@ require 'spec_helper'
RSpec.describe 'Recent searches', :js do
include FilteredSearchHelpers
- include MobileHelpers
let_it_be(:project_1) { create(:project, :public) }
let_it_be(:project_2) { create(:project, :public) }
@@ -14,116 +13,96 @@ RSpec.describe 'Recent searches', :js do
let(:project_1_local_storage_key) { "#{project_1.full_path}-issue-recent-searches" }
before do
- Capybara.ignore_hidden_elements = false
+ stub_feature_flags(vue_issues_list: true)
# Visit any fast-loading page so we can clear local storage without a DOM exception
visit '/404'
remove_recent_searches
end
- after do
- Capybara.ignore_hidden_elements = true
- end
-
it 'searching adds to recent searches' do
visit project_issues_path(project_1)
- input_filtered_search('foo', submit: true)
- input_filtered_search('bar', submit: true)
-
- items = all('.filtered-search-history-dropdown-item', visible: false, count: 2)
+ submit_then_clear_search 'foo'
+ submit_then_clear_search 'bar'
+ click_button 'Toggle history'
- expect(items[0].text).to eq('bar')
- expect(items[1].text).to eq('foo')
+ expect_recent_searches_history_item 'bar'
+ expect_recent_searches_history_item 'foo'
end
it 'visiting URL with search params adds to recent searches' do
visit project_issues_path(project_1, label_name: 'foo', search: 'bar')
visit project_issues_path(project_1, label_name: 'qux', search: 'garply')
- items = all('.filtered-search-history-dropdown-item', visible: false, count: 2)
+ click_button 'Toggle history'
- expect(items[0].text).to eq('label: = ~qux garply')
- expect(items[1].text).to eq('label: = ~foo bar')
+ expect_recent_searches_history_item 'Label := qux garply'
+ expect_recent_searches_history_item 'Label := foo bar'
end
it 'saved recent searches are restored last on the list' do
- set_recent_searches(project_1_local_storage_key, '["saved1", "saved2"]')
+ set_recent_searches(project_1_local_storage_key, '[[{"type":"filtered-search-term","value":{"data":"saved1"}}],[{"type":"filtered-search-term","value":{"data":"saved2"}}]]')
visit project_issues_path(project_1, search: 'foo')
+ click_button 'Toggle history'
- items = all('.filtered-search-history-dropdown-item', visible: false, count: 3)
-
- expect(items[0].text).to eq('foo')
- expect(items[1].text).to eq('saved1')
- expect(items[2].text).to eq('saved2')
+ expect_recent_searches_history_item 'foo'
+ expect_recent_searches_history_item 'saved1'
+ expect_recent_searches_history_item 'saved2'
end
it 'searches are scoped to projects' do
visit project_issues_path(project_1)
- input_filtered_search('foo', submit: true)
- input_filtered_search('bar', submit: true)
+ submit_then_clear_search 'foo'
+ submit_then_clear_search 'bar'
visit project_issues_path(project_2)
- input_filtered_search('more', submit: true)
- input_filtered_search('things', submit: true)
-
- items = all('.filtered-search-history-dropdown-item', visible: false, count: 2)
+ submit_then_clear_search 'more'
+ submit_then_clear_search 'things'
+ click_button 'Toggle history'
- expect(items[0].text).to eq('things')
- expect(items[1].text).to eq('more')
+ expect_recent_searches_history_item 'things'
+ expect_recent_searches_history_item 'more'
end
it 'clicking item fills search input' do
- set_recent_searches(project_1_local_storage_key, '["foo", "bar"]')
+ set_recent_searches(project_1_local_storage_key, '[[{"type":"filtered-search-term","value":{"data":"foo"}}],[{"type":"filtered-search-term","value":{"data":"bar"}}]]')
visit project_issues_path(project_1)
- find('.filtered-search-history-dropdown-toggle-button').click
- all('.filtered-search-history-dropdown-item', count: 2)[0].click
- wait_for_filtered_search('foo')
+ click_button 'Toggle history'
+ click_button 'foo'
- expect(find('.filtered-search').value.strip).to eq('foo')
+ expect_search_term 'foo'
end
it 'clear recent searches button, clears recent searches' do
- set_recent_searches(project_1_local_storage_key, '["foo"]')
+ set_recent_searches(project_1_local_storage_key, '[[{"type":"filtered-search-term","value":{"data":"foo"}}]]')
visit project_issues_path(project_1)
- find('.filtered-search-history-dropdown-toggle-button').click
- all('.filtered-search-history-dropdown-item', count: 1)
+ click_button 'Toggle history'
- find('.filtered-search-history-clear-button').click
- items_after = all('.filtered-search-history-dropdown-item', count: 0)
+ expect_recent_searches_history_item_count 1
- expect(items_after.count).to eq(0)
+ click_button 'Clear recent searches'
+ click_button 'Toggle history'
+
+ expect(page).to have_text "You don't have any recent searches"
+ expect_recent_searches_history_item_count 0
end
it 'shows flash error when failed to parse saved history' do
set_recent_searches(project_1_local_storage_key, 'fail')
visit project_issues_path(project_1)
- expect(find('[data-testid="alert-danger"]')).to have_text('An error occurred while parsing recent searches')
+ expect(page).to have_text 'An error occurred while parsing recent searches'
end
- context 'on tablet/mobile screen' do
- it 'shows only the history icon in the dropdown' do
- resize_screen_sm
- visit project_issues_path(project_1)
-
- expect(find('.filtered-search-history-dropdown-wrapper')).to have_selector('svg', visible: true)
- expect(find('.filtered-search-history-dropdown-wrapper')).to have_selector('span', text: 'Recent searches', visible: false)
- end
- end
-
- context 'on PC screen' do
- it 'shows only the Recent searches text in the dropdown' do
- restore_window_size
- visit project_issues_path(project_1)
-
- expect(find('.filtered-search-history-dropdown-wrapper')).to have_selector('svg', visible: false)
- expect(find('.filtered-search-history-dropdown-wrapper')).to have_selector('span', text: 'Recent searches', visible: true)
- end
+ def submit_then_clear_search(search)
+ click_filtered_search_bar
+ send_keys(search, :enter)
+ click_button 'Clear'
end
end
diff --git a/spec/features/issues/filtered_search/search_bar_spec.rb b/spec/features/issues/filtered_search/search_bar_spec.rb
index 60963d95ae5..8639ec2a227 100644
--- a/spec/features/issues/filtered_search/search_bar_spec.rb
+++ b/spec/features/issues/filtered_search/search_bar_spec.rb
@@ -9,102 +9,74 @@ RSpec.describe 'Search bar', :js do
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
-
before do
+ stub_feature_flags(vue_issues_list: true)
project.add_maintainer(user)
sign_in(user)
visit project_issues_path(project)
end
- def get_left_style(style)
- left_style = /left:\s\d*[.]\d*px/.match(style)
- left_style.to_s.gsub('left: ', '').to_f
- end
-
describe 'keyboard navigation' do
- it 'makes item active' do
- filtered_search.native.send_keys(:down)
-
- page.within '#js-dropdown-hint' do
- expect(page).to have_selector('.droplab-item-active')
- end
- end
-
it 'selects item' do
- filtered_search.native.send_keys(:down, :down, :enter)
+ click_filtered_search_bar
+ send_keys :down, :enter
- expect_tokens([{ name: 'Assignee' }])
- expect_filtered_search_input_empty
+ expect_token_segment 'Assignee'
end
end
describe 'clear search button' do
it 'clears text' do
search_text = 'search_text'
- filtered_search.set(search_text)
+ click_filtered_search_bar
+ send_keys search_text
+
+ expect(page).to have_field 'Search', with: search_text
- expect(filtered_search.value).to eq(search_text)
- find('.filtered-search-box .clear-search').click
+ click_button 'Clear'
- expect(filtered_search.value).to eq('')
+ expect(page).to have_field 'Search', with: ''
end
it 'hides by default' do
- expect(page).to have_css('.clear-search', visible: false)
+ expect(page).not_to have_button 'Clear'
end
it 'hides after clicked' do
- filtered_search.set('a')
- find('.filtered-search-box .clear-search').click
+ click_filtered_search_bar
+ send_keys 'a'
- expect(page).to have_css('.clear-search', visible: false)
+ click_button 'Clear'
+
+ expect(page).not_to have_button 'Clear'
end
it 'hides when there is no text' do
- filtered_search.set('a')
- filtered_search.set('')
+ click_filtered_search_bar
+ send_keys 'a', :backspace, :backspace
- expect(page).to have_css('.clear-search', visible: false)
+ expect(page).not_to have_button 'Clear'
end
it 'shows when there is text' do
- filtered_search.set('a')
+ click_filtered_search_bar
+ send_keys 'a'
- expect(page).to have_css('.clear-search', visible: true)
+ expect(page).to have_button 'Clear'
end
it 'resets the dropdown hint filter' do
- filtered_search.click
- original_size = page.all('#js-dropdown-hint .filter-dropdown .filter-dropdown-item').size
-
- filtered_search.set('autho')
-
- expect(find('#js-dropdown-hint')).to have_selector('.filter-dropdown .filter-dropdown-item', count: 1)
-
- find('.filtered-search-box .clear-search').click
- filtered_search.click
-
- expect(find('#js-dropdown-hint')).to have_selector('.filter-dropdown .filter-dropdown-item', count: original_size)
- end
-
- it 'resets the dropdown filters' do
- filtered_search.click
-
- hint_offset = get_left_style(find('#js-dropdown-hint')['style'])
-
- filtered_search.set('a')
-
- filtered_search.set('author:')
+ click_filtered_search_bar
+ original_size = get_suggestion_count
+ send_keys 'autho'
- find('#js-dropdown-hint', visible: false)
+ expect_suggestion_count 1
- find('.filtered-search-box .clear-search').click
- filtered_search.click
+ click_button 'Clear'
+ click_filtered_search_bar
- expect(find('#js-dropdown-hint')).to have_selector('.filter-dropdown .filter-dropdown-item', minimum: 6)
- expect(get_left_style(find('#js-dropdown-hint')['style'])).to eq(hint_offset)
+ expect_suggestion_count(original_size)
end
end
end
diff --git a/spec/features/issues/filtered_search/visual_tokens_spec.rb b/spec/features/issues/filtered_search/visual_tokens_spec.rb
index 2d8587d886f..9fb6a4cc2af 100644
--- a/spec/features/issues/filtered_search/visual_tokens_spec.rb
+++ b/spec/features/issues/filtered_search/visual_tokens_spec.rb
@@ -14,178 +14,160 @@ RSpec.describe 'Visual tokens', :js do
let_it_be(:cc_label) { create(:label, project: project, title: 'Community Contribution') }
let_it_be(:issue) { create(:issue, project: project) }
- let(:filtered_search) { find('.filtered-search') }
- let(:filter_author_dropdown) { find("#js-dropdown-author .filter-dropdown") }
-
- def is_input_focused
- page.evaluate_script("document.activeElement.classList.contains('filtered-search')")
- end
-
before do
+ stub_feature_flags(vue_issues_list: true)
project.add_user(user, :maintainer)
project.add_user(user_rock, :maintainer)
sign_in(user)
- set_cookie('sidebar_collapsed', 'true')
-
visit project_issues_path(project)
end
describe 'editing a single token' do
before do
- input_filtered_search('author:=@root assignee:=none', submit: false)
- first('.tokens-container .filtered-search-token').click
- wait_for_requests
+ select_tokens 'Author', '=', user.username, 'Assignee', '=', 'None'
+ click_token_segment(user.name)
end
it 'opens author dropdown' do
- expect(page).to have_css('#js-dropdown-author', visible: true)
- expect_filtered_search_input('@root')
+ expect_visible_suggestions_list
+ expect(page).to have_field('Search', with: 'root')
end
it 'filters value' do
- filtered_search.send_keys(:backspace)
+ send_keys :backspace
- expect(page).to have_css('#js-dropdown-author .filter-dropdown .filter-dropdown-item', count: 1)
+ expect_suggestion_count 1
end
it 'ends editing mode when document is clicked' do
find('.js-navbar').click
- expect_filtered_search_input_empty
- expect(page).to have_css('#js-dropdown-author', visible: false)
+ expect_empty_search_term
+ expect_hidden_suggestions_list
end
describe 'selecting different author from dropdown' do
before do
- filter_author_dropdown.find('.filter-dropdown-item .dropdown-light-content', text: "@#{user_rock.username}").click
+ send_keys :backspace, :backspace, :backspace, :backspace
+ click_on user_rock.name
end
it 'changes value in visual token' do
- wait_for_requests
- expect(first('.tokens-container .filtered-search-token .value').text).to eq("#{user_rock.name}")
- end
-
- it 'moves input to the right' do
- expect(is_input_focused).to eq(true)
+ expect_author_token(user_rock.name)
end
end
end
describe 'editing multiple tokens' do
before do
- input_filtered_search('author:=@root assignee:=none', submit: false)
- first('.tokens-container .filtered-search-token').click
+ select_tokens 'Author', '=', user.username, 'Assignee', '=', 'None'
+ click_token_segment(user.name)
end
it 'opens author dropdown' do
- expect(page).to have_css('#js-dropdown-author', visible: true)
+ expect_visible_suggestions_list
end
it 'opens assignee dropdown' do
- find('.tokens-container .filtered-search-token', text: 'Assignee').click
- expect(page).to have_css('#js-dropdown-assignee', visible: true)
+ click_token_segment 'Assignee'
+
+ expect_visible_suggestions_list
end
end
describe 'editing a search term while editing another filter token' do
before do
- input_filtered_search('foo assignee:=', submit: false)
- first('.tokens-container .filtered-search-term').click
+ click_filtered_search_bar
+ send_keys 'foo '
+ select_tokens 'Assignee', '='
+ click_token_segment 'foo'
+ send_keys ' '
end
it 'opens author dropdown' do
- find('#js-dropdown-hint .filter-dropdown .filter-dropdown-item', text: 'Author').click
+ click_on 'Author'
- expect(page).to have_css('#js-dropdown-operator', visible: true)
- expect(page).to have_css('#js-dropdown-author', visible: false)
+ expect_suggestion '='
+ expect_suggestion '!='
- find('#js-dropdown-operator .filter-dropdown .filter-dropdown-item[data-value="="]').click
+ click_on '= is'
- expect(page).to have_css('#js-dropdown-operator', visible: false)
- expect(page).to have_css('#js-dropdown-author', visible: true)
+ expect_suggestion(user.name)
+ expect_suggestion(user_rock.name)
end
end
describe 'add new token after editing existing token' do
before do
- input_filtered_search('author:=@root assignee:=none', submit: false)
- first('.tokens-container .filtered-search-token').click
- filtered_search.send_keys(' ')
+ select_tokens 'Assignee', '=', user.username, 'Label', '=', 'None'
+ click_token_segment(user.name)
+ send_keys ' '
end
describe 'opens dropdowns' do
it 'opens hint dropdown' do
- expect(page).to have_css('#js-dropdown-hint', visible: true)
+ expect_visible_suggestions_list
end
it 'opens token dropdown' do
- filtered_search.send_keys('author:=')
+ click_on 'Author'
- expect(page).to have_css('#js-dropdown-author', visible: true)
+ expect_visible_suggestions_list
end
end
describe 'visual tokens' do
it 'creates visual token' do
- filtered_search.send_keys('author:=@thomas ')
- token = page.all('.tokens-container .filtered-search-token')[1]
+ click_on 'Author'
+ click_on '= is'
+ click_on 'The Rock'
- expect(token.find('.name').text).to eq('Author')
- expect(token.find('.value').text).to eq('@thomas')
+ expect_author_token 'The Rock'
end
end
it 'does not tokenize incomplete token' do
- filtered_search.send_keys('author:=')
-
+ click_on 'Author'
find('.js-navbar').click
- token = page.all('.tokens-container .js-visual-token')[1]
- expect_filtered_search_input_empty
- expect(token.find('.name').text).to eq('Author')
+ expect_empty_search_term
+ expect_token_segment 'Assignee'
end
end
describe 'search using incomplete visual tokens' do
before do
- input_filtered_search('author:=@root assignee:=none', extra_space: false)
+ select_tokens 'Author', '=', user.username, 'Assignee', '=', 'None'
end
it 'tokenizes the search term to complete visual token' do
- expect_tokens([
- author_token(user.name),
- assignee_token('None')
- ])
+ expect_author_token(user.name)
+ expect_assignee_token 'None'
end
end
it 'does retain hint token when mix of typing and clicks are performed' do
- input_filtered_search('label:', extra_space: false, submit: false)
-
- expect(page).to have_css('#js-dropdown-operator', visible: true)
-
- find('#js-dropdown-operator li[data-value="="]').click
-
- token = page.all('.tokens-container .js-visual-token')[0]
+ select_tokens 'Label'
+ click_on '= is'
- expect(token.find('.name').text).to eq('Label')
- expect(token.find('.operator').text).to eq('=')
+ expect_token_segment 'Label'
+ expect_token_segment '='
end
describe 'Any/None option' do
it 'hidden when NOT operator is selected' do
- input_filtered_search('milestone:!=', extra_space: false, submit: false)
+ select_tokens 'Milestone', '!='
- expect(page).not_to have_selector("#js-dropdown-milestone", text: 'Any')
- expect(page).not_to have_selector("#js-dropdown-milestone", text: 'None')
+ expect_no_suggestion 'Any'
+ expect_no_suggestion 'None'
end
it 'shown when EQUAL operator is selected' do
- input_filtered_search('milestone:=', extra_space: false, submit: false)
+ select_tokens 'Milestone', '='
- expect(page).to have_selector("#js-dropdown-milestone", text: 'Any')
- expect(page).to have_selector("#js-dropdown-milestone", text: 'None')
+ expect_suggestion 'Any'
+ expect_suggestion 'None'
end
end
end
diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb
index 6f4a13c5fad..8732e2ecff2 100644
--- a/spec/features/issues/gfm_autocomplete_spec.rb
+++ b/spec/features/issues/gfm_autocomplete_spec.rb
@@ -445,7 +445,7 @@ RSpec.describe 'GFM autocomplete', :js do
click_button('Cancel')
page.within('.modal') do
- click_button('OK', match: :first)
+ click_button('Discard changes', match: :first)
end
wait_for_requests
diff --git a/spec/features/issues/rss_spec.rb b/spec/features/issues/rss_spec.rb
index b20502ecc25..bdc5f282875 100644
--- a/spec/features/issues/rss_spec.rb
+++ b/spec/features/issues/rss_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project Issues RSS' do
+RSpec.describe 'Project Issues RSS', :js do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, group: group, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
@@ -13,6 +13,10 @@ RSpec.describe 'Project Issues RSS' do
group.add_developer(user)
end
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
+
context 'when signed in' do
let_it_be(:user) { create(:user) }
@@ -25,7 +29,10 @@ RSpec.describe 'Project Issues RSS' do
visit path
end
- it_behaves_like "it has an RSS button with current_user's feed token"
+ it "shows the RSS button with current_user's feed token" do
+ expect(page).to have_link 'Subscribe to RSS feed', href: /feed_token=#{user.feed_token}/
+ end
+
it_behaves_like "an autodiscoverable RSS feed with current_user's feed token"
end
@@ -34,7 +41,10 @@ RSpec.describe 'Project Issues RSS' do
visit path
end
- it_behaves_like "it has an RSS button without a feed token"
+ it "shows the RSS button without a feed token" do
+ expect(page).not_to have_link 'Subscribe to RSS feed', href: /feed_token/
+ end
+
it_behaves_like "an autodiscoverable RSS feed without a feed token"
end
diff --git a/spec/features/issues/user_bulk_edits_issues_labels_spec.rb b/spec/features/issues/user_bulk_edits_issues_labels_spec.rb
index 71213fb661f..27377f6e1fd 100644
--- a/spec/features/issues/user_bulk_edits_issues_labels_spec.rb
+++ b/spec/features/issues/user_bulk_edits_issues_labels_spec.rb
@@ -12,8 +12,12 @@ RSpec.describe 'Issues > Labels bulk assignment' do
let!(:issue1) { create(:issue, project: project, title: "Issue 1", labels: [frontend]) }
let!(:issue2) { create(:issue, project: project, title: "Issue 2") }
- let(:issue_1_selector) { "#issue_#{issue1.id}" }
- let(:issue_2_selector) { "#issue_#{issue2.id}" }
+ let(:issue_1_selector) { "#issuable_#{issue1.id}" }
+ let(:issue_2_selector) { "#issuable_#{issue2.id}" }
+
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
context 'as an allowed user', :js do
before do
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 ae1bce7ea4c..1c707466b51 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
@@ -25,6 +25,20 @@ RSpec.describe 'User creates branch and merge request on issue page', :js do
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/issues/user_creates_issue_spec.rb b/spec/features/issues/user_creates_issue_spec.rb
index 8a5e33ba18c..3bba041dab7 100644
--- a/spec/features/issues/user_creates_issue_spec.rb
+++ b/spec/features/issues/user_creates_issue_spec.rb
@@ -8,12 +8,16 @@ RSpec.describe "User creates issue" do
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:user) { create(:user) }
+ before do
+ stub_feature_flags(vue_issues_list: true)
+ end
+
context "when unauthenticated" do
before do
sign_out(:user)
end
- it "redirects to signin then back to new issue after signin" do
+ it "redirects to signin then back to new issue after signin", :js do
create(:issue, project: project)
visit project_issues_path(project)
diff --git a/spec/features/issues/user_filters_issues_spec.rb b/spec/features/issues/user_filters_issues_spec.rb
index 5d05df6aaf0..42c2b5d32c1 100644
--- a/spec/features/issues/user_filters_issues_spec.rb
+++ b/spec/features/issues/user_filters_issues_spec.rb
@@ -7,6 +7,8 @@ RSpec.describe 'User filters issues', :js do
let_it_be(:project) { create(:project_empty_repo, :public) }
before do
+ stub_feature_flags(vue_issues_list: true)
+
%w[foobar barbaz].each do |title|
create(:issue,
author: user,
@@ -24,7 +26,7 @@ RSpec.describe 'User filters issues', :js do
let(:issue) { @issue }
it 'allows filtering by issues with no specified assignee' do
- visit project_issues_path(project, assignee_id: IssuableFinder::Params::FILTER_NONE)
+ visit project_issues_path(project, assignee_id: IssuableFinder::Params::FILTER_NONE.capitalize)
expect(page).to have_content 'foobar'
expect(page).not_to have_content 'barbaz'
diff --git a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
index 1fa8f533869..5aae5abaf10 100644
--- a/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
+++ b/spec/features/issues/user_scrolls_to_deeplinked_note_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe 'User scrolls to deep-linked note' do
context 'on issue page', :js do
it 'on comment' do
+ stub_feature_flags(gl_avatar_for_all_user_avatars: false)
visit project_issue_path(project, issue, anchor: "note_#{comment_1.id}")
wait_for_requests
diff --git a/spec/features/issues/user_sees_breadcrumb_links_spec.rb b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
index 669c7c45411..1577d7d5ce8 100644
--- a/spec/features/issues/user_sees_breadcrumb_links_spec.rb
+++ b/spec/features/issues/user_sees_breadcrumb_links_spec.rb
@@ -8,6 +8,8 @@ RSpec.describe 'New issue breadcrumb' do
let(:user) { project.creator }
before do
+ stub_feature_flags(vue_issues_list: true)
+
sign_in(user)
visit(new_project_issue_path(project))
end
@@ -24,10 +26,10 @@ RSpec.describe 'New issue breadcrumb' do
visit project_issue_path(project, issue)
- expect(find('.breadcrumbs-sub-title a')[:href]).to end_with(issue_path(issue))
+ expect(find('[data-testid="breadcrumb-current-link"] a')[:href]).to end_with(issue_path(issue))
end
- it 'excludes award_emoji from comment count' do
+ it 'excludes award_emoji from comment count', :js do
issue = create(:issue, author: user, assignees: [user], project: project, title: 'foobar')
create(:award_emoji, awardable: issue)
diff --git a/spec/features/issues/user_sorts_issues_spec.rb b/spec/features/issues/user_sorts_issues_spec.rb
index 86bdaf5d706..4af313576ed 100644
--- a/spec/features/issues/user_sorts_issues_spec.rb
+++ b/spec/features/issues/user_sorts_issues_spec.rb
@@ -16,6 +16,8 @@ RSpec.describe "User sorts issues" do
let_it_be(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') }
before do
+ stub_feature_flags(vue_issues_list: true)
+
create_list(:award_emoji, 2, :upvote, awardable: issue1)
create_list(:award_emoji, 2, :downvote, awardable: issue2)
create(:award_emoji, :downvote, awardable: issue1)
@@ -24,26 +26,23 @@ RSpec.describe "User sorts issues" do
sign_in(user)
end
- it 'keeps the sort option' do
+ it 'keeps the sort option', :js do
visit(project_issues_path(project))
- find('.filter-dropdown-container .dropdown').click
-
- page.within('ul.dropdown-menu.dropdown-menu-right li') do
- click_link('Milestone')
- end
+ click_button 'Created date'
+ click_button 'Milestone'
visit(issues_dashboard_path(assignee_username: user.username))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(page).to have_button 'Milestone'
visit(project_issues_path(project))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(page).to have_button 'Milestone'
visit(issues_group_path(group))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(page).to have_button 'Milestone'
end
it 'sorts by popularity', :js do
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index 479199b72b7..ea888d4b254 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -17,6 +17,8 @@ RSpec.describe 'Labels Hierarchy', :js do
let!(:project_label_1) { create(:label, project: project_1, title: 'Label_4') }
before do
+ stub_feature_flags(vue_issues_list: true)
+
grandparent.add_owner(user)
sign_in(user)
@@ -34,8 +36,6 @@ RSpec.describe 'Labels Hierarchy', :js do
click_on 'Close'
end
- wait_for_requests
-
expect(page).to have_selector('.gl-label', text: label.title)
end
end
@@ -44,8 +44,6 @@ RSpec.describe 'Labels Hierarchy', :js do
page.within('.block.labels') do
click_on 'Edit'
- wait_for_requests
-
expect(page).not_to have_text(child_group_label.title)
end
end
@@ -54,15 +52,21 @@ RSpec.describe 'Labels Hierarchy', :js do
shared_examples 'filtering by ancestor labels for projects' do |board = false|
it 'filters by ancestor labels' do
[grandparent_group_label, parent_group_label, project_label_1].each do |label|
- select_label_on_dropdown(label.title)
-
- wait_for_requests
-
if board
+ select_label_on_dropdown(label.title)
+
expect(page).to have_selector('.board-card-title') do |card|
expect(card).to have_selector('a', text: labeled_issue.title)
end
else
+ within '[data-testid="filtered-search-input"]' do
+ click_filtered_search_bar
+ click_on 'Label'
+ click_on '= is'
+ click_on label.title
+ send_keys :enter
+ end
+
expect_issues_list_count(1)
expect(page).to have_selector('.issue-title', text: labeled_issue.title)
end
@@ -70,9 +74,11 @@ RSpec.describe 'Labels Hierarchy', :js do
end
it 'does not filter by descendant group labels' do
- filtered_search.set("label=")
-
- wait_for_requests
+ if board
+ filtered_search.set("label=")
+ else
+ select_tokens 'Label', '='
+ end
expect(page).not_to have_link child_group_label.title
end
@@ -93,11 +99,9 @@ RSpec.describe 'Labels Hierarchy', :js do
it 'filters by ancestors and current group labels' do
[grandparent_group_label, parent_group_label].each do |label|
- select_label_on_dropdown(label.title)
-
- wait_for_requests
-
if board
+ select_label_on_dropdown(label.title)
+
expect(page).to have_selector('.board-card-title') do |card|
expect(card).to have_selector('a', text: labeled_issue.title)
end
@@ -106,6 +110,14 @@ RSpec.describe 'Labels Hierarchy', :js do
expect(card).to have_selector('a', text: labeled_issue_2.title)
end
else
+ within '[data-testid="filtered-search-input"]' do
+ click_filtered_search_bar
+ click_on 'Label'
+ click_on '= is'
+ click_on label.title
+ send_keys :enter
+ end
+
expect_issues_list_count(3)
expect(page).to have_selector('.issue-title', text: labeled_issue.title)
expect(page).to have_selector('.issue-title', text: labeled_issue_2.title)
@@ -115,11 +127,9 @@ RSpec.describe 'Labels Hierarchy', :js do
end
it 'filters by descendant group labels' do
- wait_for_requests
-
- select_label_on_dropdown(group_label_3.title)
-
if board
+ select_label_on_dropdown(group_label_3.title)
+
expect(page).to have_selector('.board-card-title') do |card|
expect(card).not_to have_selector('a', text: labeled_issue_2.title)
end
@@ -128,17 +138,23 @@ RSpec.describe 'Labels Hierarchy', :js do
expect(card).to have_selector('a', text: labeled_issue_3.title)
end
else
+ select_tokens 'Label', '=', group_label_3.title, submit: true
+
expect_issues_list_count(1)
expect(page).to have_selector('.issue-title', text: labeled_issue_3.title)
end
end
it 'does not filter by descendant group project labels' do
- filtered_search.set("label=")
+ if board
+ filtered_search.set("label=")
- wait_for_requests
+ expect(page).not_to have_selector('.btn-link', text: project_label_3.title)
+ else
+ select_tokens 'Label', '='
- expect(page).not_to have_selector('.btn-link', text: project_label_3.title)
+ expect(page).not_to have_link project_label_3.title
+ end
end
end
@@ -195,9 +211,7 @@ RSpec.describe 'Labels Hierarchy', :js do
it_behaves_like 'filtering by ancestor labels for projects'
it 'does not filter by descendant group labels' do
- filtered_search.set("label=")
-
- wait_for_requests
+ select_tokens 'Label', '='
expect(page).not_to have_link child_group_label.title
end
diff --git a/spec/features/markdown/mermaid_spec.rb b/spec/features/markdown/mermaid_spec.rb
index 6a91d4e03c1..322b5306a00 100644
--- a/spec/features/markdown/mermaid_spec.rb
+++ b/spec/features/markdown/mermaid_spec.rb
@@ -5,6 +5,9 @@ require 'spec_helper'
RSpec.describe 'Mermaid rendering', :js do
let_it_be(:project) { create(:project, :public) }
+ let(:is_mac) { page.evaluate_script('navigator.platform').include?('Mac') }
+ let(:modifier_key) { is_mac ? :command : :control }
+
before do
stub_feature_flags(sandboxed_mermaid: false)
end
@@ -48,8 +51,8 @@ RSpec.describe 'Mermaid rendering', :js do
wait_for_requests
wait_for_mermaid
- # From https://github.com/mermaid-js/mermaid/blob/d3f8f03a7d03a052e1fe0251d5a6d8d1f48d67ee/src/dagre-wrapper/createLabel.js#L79-L82
- expected = %(<div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;">Line 1<br>Line 2</div>)
+ # From # From https://github.com/mermaid-js/mermaid/blob/170ed89e9ef3e33dc84f8656eed1725379d505df/src/dagre-wrapper/createLabel.js#L39-L42
+ expected = %(<div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Line 1<br>Line 2</div>)
expect(page.html.scan(expected).count).to be(4)
end
@@ -70,8 +73,8 @@ RSpec.describe 'Mermaid rendering', :js do
wait_for_requests
wait_for_mermaid
- # From https://github.com/mermaid-js/mermaid/blob/d3f8f03a7d03a052e1fe0251d5a6d8d1f48d67ee/src/dagre-wrapper/createLabel.js#L79-L82
- expected = %(<div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;">CLICK_HERE_AND_GET_BONUS</div>)
+ # From https://github.com/mermaid-js/mermaid/blob/170ed89e9ef3e33dc84f8656eed1725379d505df/src/dagre-wrapper/createLabel.js#L39-L42
+ expected = %(<div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">CLICK_HERE_AND_GET_BONUS</div>)
expect(page.html).to include(expected)
end
@@ -300,6 +303,40 @@ RSpec.describe 'Mermaid rendering', :js do
expect(page).not_to have_xpath("//iframe")
end
end
+
+ it 'correctly copies and pastes to/from the clipboard' do
+ stub_feature_flags(sandboxed_mermaid: true)
+
+ description = <<~MERMAID
+ ```mermaid
+ graph TD;
+ A-->B;
+ A-->C;
+ ```
+ MERMAID
+
+ issue = create(:issue, project: project, description: description)
+
+ user = create(:user)
+ sign_in(user)
+ visit project_issue_path(project, issue)
+
+ wait_for_requests
+ wait_for_mermaid
+
+ find('pre.language-mermaid').hover
+ find('copy-code button').click
+
+ sleep 2
+
+ find('#note-body').send_keys [modifier_key, 'v']
+
+ wait_for_requests
+
+ # The codefences do actually get included, but we can't get spec to pass
+ # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/83202#note_880621264
+ expect(find('#note-body').value.strip).to eq("graph TD;\n A-->B;\n A-->C;")
+ end
end
def wait_for_mermaid
diff --git a/spec/features/merge_request/batch_comments_spec.rb b/spec/features/merge_request/batch_comments_spec.rb
index eb98c7d5061..9b54d95be6b 100644
--- a/spec/features/merge_request/batch_comments_spec.rb
+++ b/spec/features/merge_request/batch_comments_spec.rb
@@ -146,6 +146,7 @@ RSpec.describe 'Merge request > Batch comments', :js do
before do
find('.js-show-diff-settings').click
click_button 'Side-by-side'
+ find('.js-show-diff-settings').click
end
it 'adds draft comments to both sides' do
@@ -171,9 +172,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
write_reply_to_discussion(button_text: 'Add comment now', resolve: true)
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -188,9 +188,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
wait_for_requests
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
end
@@ -211,9 +210,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
write_reply_to_discussion(button_text: 'Add comment now', unresolve: true)
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
- expect(page).not_to have_selector('.line-resolve-btn.is-active')
end
end
@@ -230,9 +228,8 @@ RSpec.describe 'Merge request > Batch comments', :js do
wait_for_requests
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
- expect(page).not_to have_selector('.line-resolve-btn.is-active')
end
end
end
diff --git a/spec/features/merge_request/close_reopen_report_toggle_spec.rb b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
index 8a4277d87c9..dea9a10a4ec 100644
--- a/spec/features/merge_request/close_reopen_report_toggle_spec.rb
+++ b/spec/features/merge_request/close_reopen_report_toggle_spec.rb
@@ -28,7 +28,6 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
expect(container).to have_link("Close merge request")
expect(container).to have_link('Report abuse')
- expect(container).to have_text("Report merge requests that are abusive, inappropriate or spam.")
end
it 'links to Report Abuse' do
@@ -43,10 +42,12 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
let(:issuable) { create(:merge_request, :opened, source_project: project) }
it 'shows the `Edit` and `Mark as draft` buttons' do
+ click_button 'Toggle dropdown'
+
expect(container).to have_link('Edit')
expect(container).to have_link('Mark as draft')
- expect(container).not_to have_button('Report abuse')
- expect(container).not_to have_button('Close merge request')
+ expect(container).to have_link('Close merge request')
+ expect(container).to have_link('Report abuse')
expect(container).not_to have_link('Reopen merge request')
end
end
@@ -55,21 +56,24 @@ RSpec.describe 'Issuables Close/Reopen/Report toggle' do
let(:issuable) { create(:merge_request, :closed, source_project: project) }
it 'shows both the `Edit` and `Reopen` button' do
+ click_button 'Toggle dropdown'
+
expect(container).to have_link('Edit')
- expect(container).not_to have_button('Report abuse')
- expect(container).not_to have_button('Close merge request')
+ expect(container).to have_link('Report abuse')
expect(container).to have_link('Reopen merge request')
+ expect(container).not_to have_link('Close merge request')
end
context 'when the merge request author is the current user' do
let(:issuable) { create(:merge_request, :closed, source_project: project, author: user) }
it 'shows both the `Edit` and `Reopen` button' do
+ click_button 'Toggle dropdown'
+
expect(container).to have_link('Edit')
- expect(container).not_to have_link('Report abuse')
- expect(container).not_to have_selector('button.dropdown-toggle')
- expect(container).not_to have_button('Close merge request')
expect(container).to have_link('Reopen merge request')
+ expect(container).not_to have_link('Close merge request')
+ expect(container).not_to have_link('Report abuse')
end
end
end
diff --git a/spec/features/merge_request/merge_request_discussion_lock_spec.rb b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
index 4e0265839f6..a7bc2a062af 100644
--- a/spec/features/merge_request/merge_request_discussion_lock_spec.rb
+++ b/spec/features/merge_request/merge_request_discussion_lock_spec.rb
@@ -8,59 +8,91 @@ RSpec.describe 'Merge Request Discussion Lock', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, author: user) }
+ let(:moved_mr_sidebar_enabled) { false }
before do
+ stub_feature_flags(moved_mr_sidebar: moved_mr_sidebar_enabled)
sign_in(user)
end
- context 'when a user is a team member' do
- before do
- project.add_developer(user)
- end
+ context 'moved sidebar flag disabled' do
+ context 'when a user is a team member' do
+ before do
+ project.add_developer(user)
+ end
- context 'when the discussion is unlocked' do
- it 'the user can lock the merge_request' do
- visit project_merge_request_path(merge_request.project, merge_request)
+ context 'when the discussion is unlocked' do
+ it 'the user can lock the merge_request' do
+ visit project_merge_request_path(merge_request.project, merge_request)
+
+ expect(find('.issuable-sidebar')).to have_content('Unlocked')
- expect(find('.issuable-sidebar')).to have_content('Unlocked')
+ page.within('.issuable-sidebar') do
+ find('.lock-edit').click
+ click_button('Lock')
+ end
- page.within('.issuable-sidebar') do
- find('.lock-edit').click
- click_button('Lock')
+ expect(find('[data-testid="lock-status"]')).to have_content('Locked')
end
+ end
+
+ context 'when the discussion is locked' do
+ before do
+ merge_request.update_attribute(:discussion_locked, true)
+ visit project_merge_request_path(merge_request.project, merge_request)
+ end
+
+ it 'the user can unlock the merge_request' do
+ expect(find('.issuable-sidebar')).to have_content('Locked')
- expect(find('[data-testid="lock-status"]')).to have_content('Locked')
+ page.within('.issuable-sidebar') do
+ find('.lock-edit').click
+ click_button('Unlock')
+ end
+
+ expect(find('[data-testid="lock-status"]')).to have_content('Unlocked')
+ end
end
end
- context 'when the discussion is locked' do
- before do
- merge_request.update_attribute(:discussion_locked, true)
- visit project_merge_request_path(merge_request.project, merge_request)
- end
+ context 'when a user is not a team member' do
+ context 'when the discussion is unlocked' do
+ before do
+ visit project_merge_request_path(merge_request.project, merge_request)
+ end
- it 'the user can unlock the merge_request' do
- expect(find('.issuable-sidebar')).to have_content('Locked')
+ it 'the user can not lock the merge_request' do
+ expect(find('.issuable-sidebar')).to have_content('Unlocked')
+ expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit')
+ end
+ end
- page.within('.issuable-sidebar') do
- find('.lock-edit').click
- click_button('Unlock')
+ context 'when the discussion is locked' do
+ before do
+ merge_request.update_attribute(:discussion_locked, true)
+ visit project_merge_request_path(merge_request.project, merge_request)
end
- expect(find('[data-testid="lock-status"]')).to have_content('Unlocked')
+ it 'the user can not unlock the merge_request' do
+ expect(find('.issuable-sidebar')).to have_content('Locked')
+ expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit')
+ end
end
end
end
- context 'when a user is not a team member' do
+ context 'moved sidebar flag enabled' do
+ let(:moved_mr_sidebar_enabled) { true }
+
context 'when the discussion is unlocked' do
before do
visit project_merge_request_path(merge_request.project, merge_request)
end
- it 'the user can not lock the merge_request' do
- expect(find('.issuable-sidebar')).to have_content('Unlocked')
- expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit')
+ it 'the user can lock the merge_request' do
+ click_button 'Toggle dropdown'
+
+ expect(page).to have_content('Lock merge request')
end
end
@@ -70,9 +102,10 @@ RSpec.describe 'Merge Request Discussion Lock', :js do
visit project_merge_request_path(merge_request.project, merge_request)
end
- it 'the user can not unlock the merge_request' do
- expect(find('.issuable-sidebar')).to have_content('Locked')
- expect(find('.issuable-sidebar')).not_to have_selector('.lock-edit')
+ it 'the user can unlock the merge_request' do
+ click_button 'Toggle dropdown'
+
+ expect(page).to have_content('Unlock merge request')
end
end
end
diff --git a/spec/features/merge_request/user_accepts_merge_request_spec.rb b/spec/features/merge_request/user_accepts_merge_request_spec.rb
index d4b185a82e9..159306b28d8 100644
--- a/spec/features/merge_request/user_accepts_merge_request_spec.rb
+++ b/spec/features/merge_request/user_accepts_merge_request_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
click_button('Merge')
- expect(page).to have_content("The changes were merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
+ expect(page).to have_content("Changes merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
end
context 'when merge method is set to fast-forward merge' do
@@ -31,7 +31,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
click_button('Merge')
- expect(page).to have_content("The changes were merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
+ expect(page).to have_content("Changes merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
end
it 'accepts a merge request with squash and merge' do
@@ -41,7 +41,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
click_button('Merge')
- expect(page).to have_content("The changes were merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
+ expect(page).to have_content("Changes merged into #{merge_request.target_branch} with #{merge_request.short_merged_commit_sha}")
end
end
end
@@ -55,7 +55,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
check('Delete source branch')
click_button('Merge')
- expect(page).to have_content('The changes were merged into')
+ expect(page).to have_content('Changes merged into')
expect(page).not_to have_selector('.js-remove-branch-button')
# Wait for View Resource requests to complete so they don't blow up if they are
@@ -72,7 +72,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
it 'accepts a merge request' do
click_button('Merge')
- expect(page).to have_content('The changes were merged into')
+ expect(page).to have_content('Changes merged into')
expect(page).to have_selector('.js-remove-branch-button')
# Wait for View Resource requests to complete so they don't blow up if they are
@@ -90,7 +90,7 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
check('Delete source branch')
click_button('Merge')
- expect(page).to have_content('The changes were merged into')
+ expect(page).to have_content('Changes merged into')
expect(page).not_to have_selector('.js-remove-branch-button')
# Wait for View Resource requests to complete so they don't blow up if they are
@@ -107,14 +107,12 @@ RSpec.describe 'User accepts a merge request', :js, :sidekiq_might_not_need_inli
end
it 'accepts a merge request' do
- find('.js-mr-widget-commits-count').click
+ find('[data-testid="widget_edit_commit_message"]').click
fill_in('merge-message-edit', with: 'wow such merge')
click_button('Merge')
- page.within('.status-box') do
- expect(page).to have_content('Merged')
- end
+ expect(page).to have_selector('.gl-badge', text: 'Merged')
end
end
end
diff --git a/spec/features/merge_request/user_assigns_themselves_spec.rb b/spec/features/merge_request/user_assigns_themselves_spec.rb
index fc925781a3b..2aaddc7791b 100644
--- a/spec/features/merge_request/user_assigns_themselves_spec.rb
+++ b/spec/features/merge_request/user_assigns_themselves_spec.rb
@@ -30,12 +30,6 @@ RSpec.describe 'Merge request > User assigns themselves' do
end.to change { merge_request.reload.updated_at }
end
- it 'returns user to the merge request', :js do
- click_link 'Assign yourself to these issues'
-
- expect(page).to have_content merge_request.description
- end
-
context 'when related issues are already assigned' do
before do
[issue1, issue2].each { |issue| issue.update!(assignees: [user]) }
diff --git a/spec/features/merge_request/user_awards_emoji_spec.rb b/spec/features/merge_request/user_awards_emoji_spec.rb
index 35eadb34799..81a88cad458 100644
--- a/spec/features/merge_request/user_awards_emoji_spec.rb
+++ b/spec/features/merge_request/user_awards_emoji_spec.rb
@@ -38,6 +38,10 @@ RSpec.describe 'Merge request > User awards emoji', :js do
it 'adds awards to note' do
page.within('.note-actions') do
first('.note-emoji-button').click
+
+ # make sure emoji popup is visible
+ execute_script("window.scrollBy(0, 200)")
+
find('gl-emoji[data-name="8ball"]').click
end
diff --git a/spec/features/merge_request/user_comments_on_diff_spec.rb b/spec/features/merge_request/user_comments_on_diff_spec.rb
index c06019f6b77..99756da51e4 100644
--- a/spec/features/merge_request/user_comments_on_diff_spec.rb
+++ b/spec/features/merge_request/user_comments_on_diff_spec.rb
@@ -103,15 +103,22 @@ RSpec.describe 'User comments on a diff', :js do
end
# Check the same comments in the side-by-side view.
+ execute_script "window.scrollTo(0,0)"
find('.js-show-diff-settings').click
click_button 'Side-by-side'
+ second_line_element = find_by_scrolling("[id='#{sample_compare.changes[1][:line_code]}']")
+ second_root_element = second_line_element.ancestor('[data-path]')
+
wait_for_requests
page.within(second_root_element) do
expect(page).to have_content('Line is wrong')
end
+ first_line_element = find_by_scrolling("[id='#{sample_compare.changes[0][:line_code]}']").find(:xpath, "..")
+ first_root_element = first_line_element.ancestor('[data-path]')
+
page.within(first_root_element) do
expect(page).to have_content('Line is correct')
end
@@ -154,7 +161,7 @@ RSpec.describe 'User comments on a diff', :js do
it 'allows comments on previously hidden lines the middle of a file' do
# Click 27, expand up, select 18, add and verify comment
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
- all('.js-unfold-all')[1].click
+ first('.js-unfold-all').click
end
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="21"]').find(:xpath, '../..'), 'left')
add_comment('18', '21')
@@ -163,10 +170,10 @@ RSpec.describe 'User comments on a diff', :js do
it 'allows comments on previously hidden lines at the bottom of a file' do
# Click +28, expand down, select 37 add and verify comment
page.within find_by_scrolling('[data-path="files/ruby/popen.rb"]') do
- all('.js-unfold-down:not([disabled])')[1].click
+ first('.js-unfold-down').click
end
click_diff_line(find('div[data-path="files/ruby/popen.rb"] .left-side a[data-linenumber="30"]').find(:xpath, '../..'), 'left')
- add_comment('+28', '37')
+ add_comment('+28', '30')
end
end
diff --git a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
index 15f186b649a..bd5048374d5 100644
--- a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb
@@ -258,7 +258,7 @@ RSpec.describe 'Merge request > User creates image diff notes', :js do
end
it 'resizes image' do
- expect(find('.onion-skin-frame')['style']).to match('width: 228px; height: 240px;')
+ expect(find('.onion-skin-frame')['style']).to match('width: 198px; height: 210px;')
end
it_behaves_like 'onion skin'
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 617aceae54c..a3dc3079374 100644
--- a/spec/features/merge_request/user_creates_merge_request_spec.rb
+++ b/spec/features/merge_request/user_creates_merge_request_spec.rb
@@ -15,28 +15,40 @@ RSpec.describe "User creates a merge request", :js do
sign_in(user)
end
- it "creates a merge request" do
- visit(project_new_merge_request_path(project))
+ context 'when completed the compare branches form' do
+ before 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")
+ click_button("Compare branches")
+ end
- page.within('.merge-request-form') do
- expect(page.find('#merge_request_title')['placeholder']).to eq 'Title'
- expect(page.find('#merge_request_description')['placeholder']).to eq 'Describe the goal of the changes and what reviewers should be aware of.'
+ it "shows merge request form" do
+ page.within('.merge-request-form') do
+ expect(page.find('#merge_request_title')['placeholder']).to eq 'Title'
+ expect(page.find('#merge_request_description')['placeholder']).to eq 'Describe the goal of the changes and what reviewers should be aware of.'
+ end
end
- fill_in("Title", with: title)
- click_button("Create merge request")
+ context "when completed the merge request form" do
+ before do
+ fill_in("Title", with: title)
+ click_button("Create merge request")
+ end
- page.within(".merge-request") do
- expect(page).to have_content(title)
+ it "creates a merge request" do
+ page.within(".merge-request") do
+ expect(page).to have_content(title)
+ end
+ end
end
+
+ it_behaves_like 'merge request author auto assign'
end
context "XSS branch name exists" do
@@ -106,7 +118,7 @@ RSpec.describe "User creates a merge request", :js do
click_button("Create merge request")
- expect(page).to have_content(title).and have_content("Request to merge #{user.namespace.path}:#{source_branch} into master")
+ expect(page).to have_content(title).and have_content("requested to merge #{forked_project.full_path}:#{source_branch} into master")
end
end
end
diff --git a/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb b/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
index 67a232607cd..059e1eb89c5 100644
--- a/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
+++ b/spec/features/merge_request/user_customizes_merge_commit_message_spec.rb
@@ -41,7 +41,7 @@ RSpec.describe 'Merge request < User customizes merge commit message', :js do
it 'has commit message without description' do
expect(page).not_to have_selector('#merge-message-edit')
- first('.js-mr-widget-commits-count').click
+ find('[data-testid="widget_edit_commit_message"]').click
expect(merge_textbox).to be_visible
expect(merge_textbox.value).to eq(default_merge_commit_message)
end
@@ -51,7 +51,7 @@ RSpec.describe 'Merge request < User customizes merge commit message', :js do
it 'uses merge commit template' do
expect(page).not_to have_selector('#merge-message-edit')
- first('.js-mr-widget-commits-count').click
+ find('[data-testid="widget_edit_commit_message"]').click
expect(merge_textbox).to be_visible
expect(merge_textbox.value).to eq(merge_request.title)
end
@@ -62,7 +62,7 @@ RSpec.describe 'Merge request < User customizes merge commit message', :js do
it 'has default message with merge request title' do
expect(page).not_to have_selector('#squash-message-edit')
- first('.js-mr-widget-commits-count').click
+ find('[data-testid="widget_edit_commit_message"]').click
expect(squash_textbox).to be_visible
expect(merge_textbox).to be_visible
expect(squash_textbox.value).to eq(merge_request.title)
@@ -74,7 +74,7 @@ RSpec.describe 'Merge request < User customizes merge commit message', :js do
it 'uses squash commit template' do
expect(page).not_to have_selector('#squash-message-edit')
- first('.js-mr-widget-commits-count').click
+ find('[data-testid="widget_edit_commit_message"]').click
expect(squash_textbox).to be_visible
expect(merge_textbox).to be_visible
expect(squash_textbox.value).to eq(merge_request.description)
diff --git a/spec/features/merge_request/user_edits_merge_request_spec.rb b/spec/features/merge_request/user_edits_merge_request_spec.rb
index 364af8d8a76..0b4b9d7452a 100644
--- a/spec/features/merge_request/user_edits_merge_request_spec.rb
+++ b/spec/features/merge_request/user_edits_merge_request_spec.rb
@@ -92,7 +92,7 @@ RSpec.describe 'User edits a merge request', :js do
select2('merge-test', from: '#merge_request_target_branch')
click_button('Save changes')
- expect(page).to have_content("Request to merge #{merge_request.source_branch} into merge-test")
+ expect(page).to have_content("requested to merge #{merge_request.source_branch} into merge-test")
expect(page).to have_content("changed target branch from #{merge_request.target_branch} to merge-test")
end
diff --git a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
index 7d67cde4bbb..f5b5460769e 100644
--- a/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
+++ b/spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb
@@ -59,7 +59,6 @@ RSpec.describe 'Batch diffs', :js do
# Confirm scrolled to correct UI element
expect(get_first_diff.find('.discussion-notes .timeline-entry li.note[id]').obscured?).to be_falsey
- expect(get_second_diff.find('.discussion-notes .timeline-entry li.note[id]').obscured?).to be_truthy
end
end
diff --git a/spec/features/merge_request/user_manages_subscription_spec.rb b/spec/features/merge_request/user_manages_subscription_spec.rb
index 3cdb22000f6..c64c761b8d1 100644
--- a/spec/features/merge_request/user_manages_subscription_spec.rb
+++ b/spec/features/merge_request/user_manages_subscription_spec.rb
@@ -6,29 +6,60 @@ RSpec.describe 'User manages subscription', :js do
let(:project) { create(:project, :public, :repository) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:user) { create(:user) }
+ let(:moved_mr_sidebar_enabled) { false }
before do
+ stub_feature_flags(moved_mr_sidebar: moved_mr_sidebar_enabled)
+
project.add_maintainer(user)
sign_in(user)
visit(merge_request_path(merge_request))
end
- it 'toggles subscription' do
- page.within('[data-testid="subscription-toggle"]') do
+ context 'moved sidebar flag disabled' do
+ it 'toggles subscription' do
+ page.within('[data-testid="subscription-toggle"]') do
+ wait_for_requests
+
+ expect(page).to have_css 'button:not(.is-checked)'
+ find('button:not(.is-checked)').click
+
+ wait_for_requests
+
+ expect(page).to have_css 'button.is-checked'
+ find('button.is-checked').click
+
+ wait_for_requests
+
+ expect(page).to have_css 'button:not(.is-checked)'
+ end
+ end
+ end
+
+ context 'moved sidebar flag enabled' do
+ let(:moved_mr_sidebar_enabled) { true }
+
+ it 'toggles subscription' do
wait_for_requests
- expect(page).to have_css 'button:not(.is-checked)'
- find('button:not(.is-checked)').click
+ click_button 'Toggle dropdown'
+
+ expect(page).to have_content('Turn on notifications')
+ click_button 'Turn on notifications'
wait_for_requests
- expect(page).to have_css 'button.is-checked'
- find('button.is-checked').click
+ click_button 'Toggle dropdown'
+
+ expect(page).to have_content('Turn off notifications')
+ click_button 'Turn off notifications'
wait_for_requests
- expect(page).to have_css 'button:not(.is-checked)'
+ click_button 'Toggle dropdown'
+
+ expect(page).to have_content('Turn on notifications')
end
end
end
diff --git a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
index f5bca7cf015..c3a61476442 100644
--- a/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
+++ b/spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb
@@ -16,10 +16,13 @@ RSpec.describe 'Merge request > User marks merge request as draft', :js do
end
it 'toggles draft status' do
+ click_button 'Toggle dropdown'
click_link 'Mark as draft'
expect(page).to have_content("Draft: #{merge_request.title}")
+ click_button 'Toggle dropdown'
+
page.within('.detail-page-header-actions') do
click_link 'Mark as ready'
end
diff --git a/spec/features/merge_request/user_merges_immediately_spec.rb b/spec/features/merge_request/user_merges_immediately_spec.rb
index 3a05f35a671..91327059e0f 100644
--- a/spec/features/merge_request/user_merges_immediately_spec.rb
+++ b/spec/features/merge_request/user_merges_immediately_spec.rb
@@ -30,17 +30,17 @@ RSpec.describe 'Merge requests > User merges immediately', :js do
it 'enables merge immediately' do
wait_for_requests
- page.within '.mr-widget-body' do
+ page.within '[data-testid="ready_to_merge_state"]' do
find('.dropdown-toggle').click
Sidekiq::Testing.fake! do
click_button 'Merge immediately'
-
- expect(find('.media-body h4')).to have_content('Merging!')
-
- wait_for_requests
end
end
+
+ expect(find('.media-body h4')).to have_content('Merging!')
+
+ wait_for_requests
end
end
end
diff --git a/spec/features/merge_request/user_merges_merge_request_spec.rb b/spec/features/merge_request/user_merges_merge_request_spec.rb
index a861ca2eea5..6a9a30953df 100644
--- a/spec/features/merge_request/user_merges_merge_request_spec.rb
+++ b/spec/features/merge_request/user_merges_merge_request_spec.rb
@@ -17,9 +17,7 @@ RSpec.describe "User merges a merge request", :js do
click_button("Merge")
end
- page.within(".status-box") do
- expect(page).to have_content("Merged")
- end
+ expect(page).to have_selector('.gl-badge', text: 'Merged')
end
end
@@ -27,6 +25,7 @@ RSpec.describe "User merges a merge request", :js do
let(:project) { create(:project, :public, :repository, merge_requests_ff_only_enabled: true) }
before do
+ stub_feature_flags(restructured_mr_widget: false)
visit(merge_request_path(merge_request))
end
diff --git a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
index 4d7ee11e366..d6b132b18da 100644
--- a/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
+++ b/spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb
@@ -56,7 +56,7 @@ RSpec.describe 'Merge request > User merges only if pipeline succeeds', :js do
wait_for_requests
- expect(page).to have_css('button[disabled="disabled"]', text: 'Merge')
+ expect(page).not_to have_button('Merge')
expect(page).to have_content('Merge blocked: pipeline must succeed. Push a commit that fixes the failure, or learn about other solutions.')
end
end
diff --git a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
index 9057b96bff0..21f96299958 100644
--- a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
+++ b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js do
click_button "Merge when pipeline succeeds"
expect(page).to have_content "Set by #{user.name} to be merged automatically when the pipeline succeeds"
- expect(page).to have_content "Does not delete the source branch"
+ expect(page).to have_content "Source branch will not be deleted"
expect(page).to have_selector ".js-cancel-auto-merge"
visit project_merge_request_path(project, merge_request) # Needed to refresh the page
expect(page).to have_content /enabled an automatic merge when the pipeline for \h{8} succeeds/i
@@ -64,6 +64,9 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js do
context 'when enabled after it was previously canceled' do
before do
click_button "Merge when pipeline succeeds"
+
+ wait_for_requests
+
click_button "Cancel auto-merge"
wait_for_requests
@@ -123,12 +126,6 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js do
expect(page).to have_content "canceled the automatic merge"
end
- it 'allows to delete source branch' do
- click_button "Delete source branch"
-
- expect(page).to have_content "Deletes the source branch"
- end
-
context 'when pipeline succeeds' do
before do
build.success
@@ -136,7 +133,7 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js do
end
it 'merges merge request', :sidekiq_might_not_need_inline do
- expect(page).to have_content 'The changes were merged'
+ expect(page).to have_content 'Changes merged'
expect(merge_request.reload).to be_merged
end
end
diff --git a/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb b/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
new file mode 100644
index 00000000000..4d2c59665bb
--- /dev/null
+++ b/spec/features/merge_request/user_opens_checkout_branch_modal_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Merge request > User opens checkout branch modal', :js do
+ include ProjectForksHelper
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:user) { project.creator }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+ end
+
+ describe 'for fork' do
+ let(:author) { create(:user) }
+ let(:source_project) { fork_project(project, author, repository: true) }
+
+ let(:merge_request) do
+ create(:merge_request,
+ source_project: source_project,
+ target_project: project,
+ source_branch: 'fix',
+ target_branch: 'master',
+ author: author,
+ allow_collaboration: true)
+ end
+
+ it 'shows instructions' do
+ visit project_merge_request_path(project, merge_request)
+
+ click_button 'Code'
+ click_button 'Check out branch'
+
+ expect(page).to have_content(source_project.http_url_to_repo)
+ end
+ end
+end
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 d803aec5895..64715f9234a 100644
--- a/spec/features/merge_request/user_posts_diff_notes_spec.rb
+++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb
@@ -239,7 +239,7 @@ RSpec.describe 'Merge request > User posts diff notes', :js do
def should_allow_dismissing_a_comment(line_holder, diff_side = nil)
write_comment_on_line(line_holder, diff_side)
- accept_gl_confirm(s_('Notes|Are you sure you want to cancel creating this comment?')) do
+ accept_gl_confirm(s_('Notes|Are you sure you want to cancel creating this comment?'), button_text: _('Discard changes')) do
find('.js-close-discussion-note-form').click
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index 231722c166d..e09ec11f095 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
context 'single thread' do
it 'shows text with how many threads' do
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -55,9 +55,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).to have_selector('.btn', text: 'Unresolve thread')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -72,9 +71,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).to have_selector('.line-resolve-btn.is-active')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -84,7 +82,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
click_button 'Unresolve thread'
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -155,7 +153,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
wait_for_requests
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
end
end
@@ -167,9 +165,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
wait_for_requests
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
- expect(page).not_to have_selector('.line-resolve-btn.is-active')
end
end
@@ -184,7 +181,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
wait_for_requests
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -196,9 +193,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
find('button[data-qa-selector="resolve_discussion_button"]').click # rubocop:disable QA/SelectorUsage
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -213,14 +209,13 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
click_button 'Add comment now'
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
it 'allows user to quickly scroll to next unresolved thread' do
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
page.find('.discussion-next-btn').click
end
@@ -269,7 +264,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(first('.line-resolve-btn')['aria-label']).to eq("Resolved by #{user.name}")
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
end
end
@@ -286,7 +281,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(button['aria-label']).to eq("Resolved by #{user.name}")
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
end
end
@@ -299,7 +294,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
end
it 'shows text with how many threads' do
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('2 unresolved threads')
end
end
@@ -307,7 +302,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
it 'allows user to mark a single note as resolved' do
click_button('Resolve thread', match: :first)
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -317,9 +312,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
btn.click
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -330,9 +324,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
end
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -341,7 +334,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
find('button[data-qa-selector="resolve_discussion_button"]').click # rubocop:disable QA/SelectorUsage
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
page.find('.discussion-next-btn').click
end
@@ -370,7 +363,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).not_to have_selector('.btn', text: 'Resolve thread')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
page.find('.discussion-next-btn').click
end
@@ -386,7 +379,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
context 'changes tab' do
it 'shows text with how many threads' do
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -402,9 +395,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).to have_selector('.btn', text: 'Unresolve thread')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -417,9 +409,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).to have_selector('.line-resolve-btn.is-active')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -429,7 +420,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
click_button 'Unresolve thread'
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -445,9 +436,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
click_button 'Add comment now'
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
@@ -462,7 +452,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
click_button 'Add comment now'
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -485,7 +475,7 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).not_to have_selector('.line-resolve-btn')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
@@ -515,9 +505,8 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).to have_selector('.btn', text: 'Unresolve thread')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('All threads resolved')
- expect(page).to have_selector('.line-resolve-btn.is-active')
end
end
end
@@ -534,32 +523,11 @@ RSpec.describe 'Merge request > User resolves diff notes and threads', :js do
expect(page).not_to have_selector('.line-resolve-btn')
end
- page.within '.line-resolve-all-container' do
+ page.within '.discussions-counter' do
expect(page).to have_content('1 unresolved thread')
end
end
end
-
- context 'resolved comment' do
- before do
- note.resolve!(user)
- visit_merge_request
- end
-
- it 'shows resolved icon' do
- expect(page).to have_content 'All threads resolved'
-
- click_button _('Show thread')
- expect(page).to have_selector('.line-resolve-btn.is-active')
- end
-
- it 'does not allow user to click resolve button' do
- expect(page).to have_selector('.line-resolve-btn.is-active')
- click_button _('Show thread')
-
- expect(page).to have_selector('.line-resolve-btn.is-active')
- end
- end
end
def visit_merge_request(mr = nil)
diff --git a/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb b/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
index 38546fd629d..5827266d4b7 100644
--- a/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
+++ b/spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb
@@ -11,6 +11,8 @@ RSpec.describe 'Merge request > User sees check out branch modal', :js do
sign_in(user)
visit project_merge_request_path(project, merge_request)
wait_for_requests
+
+ click_button 'Code'
click_button('Check out branch')
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 c9b21d4a4ae..2dafd66b406 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -20,6 +20,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
stub_feature_flags(refactor_mr_widgets_extensions: false)
stub_feature_flags(refactor_mr_widgets_extensions_user: false)
+ stub_feature_flags(refactor_mr_widget_test_summary: false)
end
context 'new merge request', :sidekiq_might_not_need_inline do
@@ -320,8 +321,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
- expect(page).to have_selector('.accept-merge-request')
- expect(find('.accept-merge-request')['disabled']).not_to be(true)
+ expect(page).not_to have_selector('.accept-merge-request')
end
end
@@ -384,9 +384,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
- page.within('.mr-widget-body') do
- expect(page).to have_content('Merge Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.')
- end
+ expect(page).to have_content('Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.')
end
end
@@ -444,7 +442,6 @@ RSpec.describe 'Merge request > User sees merge widget', :js do
it 'user cannot remove source branch', :sidekiq_might_not_need_inline do
expect(page).not_to have_field('remove-source-branch-input')
- expect(page).to have_content('Deletes the source branch')
end
end
diff --git a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
index 23b03e33f5d..03f9f6ef565 100644
--- a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
+++ b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb
@@ -61,38 +61,6 @@ RSpec.describe 'Merge request < User sees mini pipeline graph', :js do
wait_for_requests
end
- # Status icon button styles should update as described in
- # https://gitlab.com/gitlab-org/gitlab-foss/issues/42769
- it 'has unique styles for default, :hover, :active, and :focus states' do
- default_background_color, default_foreground_color, default_box_shadow = get_toggle_colors(dropdown_selector)
-
- toggle.hover
- hover_background_color, hover_foreground_color, hover_box_shadow = get_toggle_colors(dropdown_selector)
-
- page.driver.browser.action.click_and_hold(toggle.native).perform
- active_background_color, active_foreground_color, active_box_shadow = get_toggle_colors(dropdown_selector)
- page.driver.browser.action.release(toggle.native).perform
-
- page.driver.browser.action.click(toggle.native).move_by(100, 100).perform
- focus_background_color, focus_foreground_color, focus_box_shadow = get_toggle_colors(dropdown_selector)
-
- expect(default_background_color).not_to eq(hover_background_color)
- expect(hover_background_color).not_to eq(active_background_color)
- expect(default_background_color).not_to eq(active_background_color)
-
- expect(default_foreground_color).not_to eq(hover_foreground_color)
- expect(hover_foreground_color).not_to eq(active_foreground_color)
- expect(default_foreground_color).not_to eq(active_foreground_color)
-
- expect(focus_background_color).to eq(hover_background_color)
- expect(focus_foreground_color).to eq(hover_foreground_color)
-
- expect(default_box_shadow).to eq('none')
- expect(hover_box_shadow).to eq('none')
- expect(active_box_shadow).not_to eq('none')
- expect(focus_box_shadow).not_to eq('none')
- end
-
it 'shows tooltip when hovered' do
toggle.hover
@@ -147,15 +115,4 @@ RSpec.describe 'Merge request < User sees mini pipeline graph', :js do
end
end
end
-
- private
-
- def get_toggle_colors(selector)
- find(selector)
- [
- evaluate_script("$('#{selector} button:visible').css('background-color');"),
- evaluate_script("$('#{selector} button:visible svg').css('fill');"),
- evaluate_script("$('#{selector} button:visible').css('box-shadow');")
- ]
- end
end
diff --git a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
index d2bde320c54..bcc6abd4f65 100644
--- a/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
+++ b/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb
@@ -62,6 +62,7 @@ RSpec.describe 'Merge request > User selects branches for new MR', :js do
fill_in "merge_request_title", with: "Orphaned MR test"
click_button "Create merge request"
+ click_button 'Code'
click_button "Check out branch"
expect(page).to have_content 'git checkout -b \'orphaned-branch\' \'origin/orphaned-branch\''
diff --git a/spec/features/merge_request/user_squashes_merge_request_spec.rb b/spec/features/merge_request/user_squashes_merge_request_spec.rb
index 2a48657ac4f..da0d4ca23d1 100644
--- a/spec/features/merge_request/user_squashes_merge_request_spec.rb
+++ b/spec/features/merge_request/user_squashes_merge_request_spec.rb
@@ -79,7 +79,7 @@ RSpec.describe 'User squashes a merge request', :js do
context 'when squash message is the same as existing commit message' do
before do
- click_button("Modify commit messages")
+ find('[data-testid="widget_edit_commit_message"]').click
fill_in('Squash commit message', with: project.commit(source_branch).safe_message)
accept_mr
end
diff --git a/spec/features/merge_request/user_views_diffs_spec.rb b/spec/features/merge_request/user_views_diffs_spec.rb
index 208ed1f01e7..894292c99eb 100644
--- a/spec/features/merge_request/user_views_diffs_spec.rb
+++ b/spec/features/merge_request/user_views_diffs_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe 'User views diffs', :js do
it 'unfolds diffs in the middle' do
page.within('.file-holder[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd"]') do
- all('.js-unfold-all')[1].click
+ first('.js-unfold-all').click
expect(page).to have_selector('[data-interop-type="new"] [data-linenumber="24"]', count: 1)
expect(page).not_to have_selector('[data-interop-type="new"] [data-linenumber="1"]')
diff --git a/spec/features/merge_request/user_views_open_merge_request_spec.rb b/spec/features/merge_request/user_views_open_merge_request_spec.rb
index a145bcb976b..1f4682b4a46 100644
--- a/spec/features/merge_request/user_views_open_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_open_merge_request_spec.rb
@@ -71,13 +71,14 @@ RSpec.describe 'User views an open merge request' do
let(:merge_request) { create(:merge_request, :rebased, source_project: project, target_project: project) }
before do
+ project.add_maintainer(project.creator)
+ sign_in(project.creator)
+
visit(merge_request_path(merge_request))
end
it 'does not show diverged commits count' do
- page.within('.mr-source-target') do
- expect(page).not_to have_content(/([0-9]+ commits? behind)/)
- end
+ expect(page).not_to have_content(/([0-9]+ commits? behind)/)
end
end
@@ -85,13 +86,14 @@ RSpec.describe 'User views an open merge request' do
let(:merge_request) { create(:merge_request, :diverged, source_project: project, target_project: project) }
before do
+ project.add_maintainer(project.creator)
+ sign_in(project.creator)
+
visit(merge_request_path(merge_request))
end
it 'shows diverged commits count' do
- page.within('.mr-source-target') do
- expect(page).to have_content(/([0-9]+ commits behind)/)
- end
+ expect(page).not_to have_content(/([0-9]+ commits? behind)/)
end
end
@@ -117,6 +119,8 @@ RSpec.describe 'User views an open merge request' do
let(:source_branch) { "&#39;&gt;&lt;iframe/srcdoc=&#39;&#39;&gt;&lt;/iframe&gt;" }
before do
+ stub_feature_flags(moved_mr_sidebar: false)
+
project.repository.create_branch(source_branch, "master")
mr = create(:merge_request, source_project: project, target_project: project, source_branch: source_branch)
diff --git a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
index a6de443e96f..f637186ec67 100644
--- a/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb
@@ -11,6 +11,10 @@ RSpec.describe 'Project > Merge request > View user status' do
subject { visit merge_request_path(merge_request) }
describe 'the status of the merge request author' do
+ before do
+ stub_feature_flags(updated_mr_header: false)
+ end
+
it_behaves_like 'showing user status' do
let(:user_with_status) { merge_request.author }
end
diff --git a/spec/features/merge_requests/user_lists_merge_requests_spec.rb b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
index 8c1d9dd38b0..2743f7e8ed4 100644
--- a/spec/features/merge_requests/user_lists_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_lists_merge_requests_spec.rb
@@ -109,7 +109,7 @@ RSpec.describe 'Merge requests > User lists merge requests' do
expect(count_merge_requests).to eq(4)
end
- it 'sorts by milestone' do
+ it 'sorts by milestone due date' do
visit_merge_requests(project, sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
@@ -130,12 +130,12 @@ RSpec.describe 'Merge requests > User lists merge requests' do
expect(count_merge_requests).to eq(4)
end
- it 'filters on one label and sorts by due date' do
+ it 'filters on one label and sorts by milestone due date' do
label = create(:label, project: project)
create(:label_link, label: label, target: @fix)
visit_merge_requests(project, label_name: [label.name],
- sort: sort_value_due_date)
+ sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
@@ -150,19 +150,19 @@ RSpec.describe 'Merge requests > User lists merge requests' do
create(:label_link, label: label2, target: @fix)
end
- it 'sorts by due date' do
+ it 'sorts by milestone due date' do
visit_merge_requests(project, label_name: [label.name, label2.name],
- sort: sort_value_due_date)
+ sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
end
context 'filter on assignee and' do
- it 'sorts by due soon' do
+ it 'sorts by milestone due date' do
visit_merge_requests(project, label_name: [label.name, label2.name],
assignee_id: user.id,
- sort: sort_value_due_date)
+ sort: sort_value_milestone)
expect(first_merge_request).to include('fix')
expect(count_merge_requests).to eq(1)
diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb
index a15b6072e70..fa866beb773 100644
--- a/spec/features/merge_requests/user_mass_updates_spec.rb
+++ b/spec/features/merge_requests/user_mass_updates_spec.rb
@@ -5,12 +5,14 @@ require 'spec_helper'
RSpec.describe 'Merge requests > User mass updates', :js do
let(:project) { create(:project, :repository) }
let(:user) { project.creator }
+ let(:user2) { create(:user) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
before do
stub_feature_flags(mr_attention_requests: false)
project.add_maintainer(user)
+ project.add_maintainer(user2)
sign_in(user)
end
@@ -68,9 +70,9 @@ RSpec.describe 'Merge requests > User mass updates', :js do
end
it 'updates merge request with assignee' do
- change_assignee(user.name)
+ change_assignee(user2.name)
- expect(find('.issuable-meta a.author-link')[:title]).to eq "Attention requested from assignee #{user.name}"
+ expect(find('.issuable-meta a.author-link')[:title]).to eq "Attention requested from assignee #{user2.name}"
end
end
end
diff --git a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
index 99473f3b1ea..459145d3ef0 100644
--- a/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
+++ b/spec/features/merge_requests/user_sorts_merge_requests_spec.rb
@@ -2,8 +2,9 @@
require 'spec_helper'
-RSpec.describe 'User sorts merge requests' do
+RSpec.describe 'User sorts merge requests', :js do
include CookieHelper
+ include Spec::Support::Helpers::Features::SortingHelpers
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let!(:merge_request2) do
@@ -16,29 +17,27 @@ RSpec.describe 'User sorts merge requests' do
let_it_be(:project) { create(:project, :public, group: group) }
before do
+ stub_feature_flags(vue_issues_list: true)
+
sign_in(user)
visit(project_merge_requests_path(project))
end
it 'keeps the sort option' do
- find('.filter-dropdown-container .dropdown').click
-
- page.within('ul.dropdown-menu.dropdown-menu-right li') do
- click_link('Milestone')
- end
+ pajamas_sort_by(s_('SortOptions|Milestone'))
visit(merge_requests_dashboard_path(assignee_username: user.username))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(find('.filter-dropdown-container button.dropdown-toggle')).to have_content('Milestone')
visit(project_merge_requests_path(project))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(find('.filter-dropdown-container button.dropdown-toggle')).to have_content('Milestone')
visit(merge_requests_group_path(group))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(find('.filter-dropdown-container button.dropdown-toggle')).to have_content('Milestone')
end
it 'fallbacks to issuable_sort cookie key when remembering the sorting option' do
@@ -46,17 +45,13 @@ RSpec.describe 'User sorts merge requests' do
visit(merge_requests_dashboard_path(assignee_username: user.username))
- expect(find('.issues-filters a.is-active')).to have_content('Milestone')
+ expect(find('.filter-dropdown-container button.dropdown-toggle')).to have_content('Milestone')
end
- it 'separates remember sorting with issues' do
+ it 'separates remember sorting with issues', :js do
create(:issue, project: project)
- find('.filter-dropdown-container .dropdown').click
-
- page.within('ul.dropdown-menu.dropdown-menu-right li') do
- click_link('Milestone')
- end
+ pajamas_sort_by(s_('SortOptions|Milestone'))
visit(project_issues_path(project))
@@ -73,11 +68,7 @@ RSpec.describe 'User sorts merge requests' do
end
it 'sorts by popularity' do
- find('.filter-dropdown-container .dropdown').click
-
- page.within('ul.dropdown-menu.dropdown-menu-right li') do
- click_link('Popularity')
- end
+ pajamas_sort_by(s_('SortOptions|Popularity'))
page.within('.mr-list') do
page.within('li.merge-request:nth-child(1)') do
diff --git a/spec/features/monitor_sidebar_link_spec.rb b/spec/features/monitor_sidebar_link_spec.rb
index fcef0fa0eff..3c59cd65cdb 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('Serverless', href: project_serverless_functions_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
@@ -79,7 +78,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('Serverless', href: project_serverless_functions_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
@@ -98,7 +96,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('Serverless', href: project_serverless_functions_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
@@ -117,7 +114,6 @@ RSpec.describe 'Monitor dropdown sidebar', :aggregate_failures do
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('Serverless', href: project_serverless_functions_path(project))
expect(page).to have_link('Kubernetes', href: project_clusters_path(project))
end
@@ -134,7 +130,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('Serverless', href: project_serverless_functions_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/oauth_login_spec.rb b/spec/features/oauth_login_spec.rb
index ea5bb8c33b2..fca8972b56c 100644
--- a/spec/features/oauth_login_spec.rb
+++ b/spec/features/oauth_login_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'OAuth Login', :js, :allow_forgery_protection do
+RSpec.describe 'OAuth Login', :allow_forgery_protection do
include DeviseHelpers
def enter_code(code)
@@ -28,7 +28,7 @@ RSpec.describe 'OAuth Login', :js, :allow_forgery_protection do
end
providers.each do |provider|
- context "when the user logs in using the #{provider} provider" do
+ context "when the user logs in using the #{provider} provider", :js do
let(:uid) { 'my-uid' }
let(:remember_me) { false }
let(:user) { create(:omniauth_user, extern_uid: uid, provider: provider.to_s) }
@@ -126,4 +126,55 @@ RSpec.describe 'OAuth Login', :js, :allow_forgery_protection do
end
end
end
+
+ context 'using GitLab as an OAuth provider' do
+ let_it_be(:user) { create(:user) }
+
+ let(:redirect_uri) { Gitlab::Routing.url_helpers.root_url }
+
+ # We can't use let_it_be to set the redirect_uri when creating the
+ # record as the host / port depends on whether or not the spec uses
+ # JS.
+ let(:application) do
+ create(:oauth_application, scopes: 'api', redirect_uri: redirect_uri, confidential: false)
+ end
+
+ let(:params) do
+ {
+ response_type: 'code',
+ client_id: application.uid,
+ redirect_uri: redirect_uri,
+ state: 'state'
+ }
+ end
+
+ before do
+ sign_in(user)
+
+ create(:oauth_access_token, application: application, resource_owner_id: user.id, scopes: 'api')
+ end
+
+ context 'when JS is enabled', :js do
+ it 'includes the fragment in the redirect if it is simple' do
+ visit "#{Gitlab::Routing.url_helpers.oauth_authorization_url(params)}#a_test-hash"
+
+ expect(page).to have_current_path("#{Gitlab::Routing.url_helpers.root_url}#a_test-hash", ignore_query: true)
+ end
+
+ it 'does not include the fragment if it contains forbidden characters' do
+ visit "#{Gitlab::Routing.url_helpers.oauth_authorization_url(params)}#a_test-hash."
+
+ expect(page).to have_current_path(Gitlab::Routing.url_helpers.root_url, ignore_query: true)
+ end
+ end
+
+ context 'when JS is disabled' do
+ it 'provides a basic HTML page including a link without the fragment' do
+ visit "#{Gitlab::Routing.url_helpers.oauth_authorization_url(params)}#a_test-hash"
+
+ expect(page).to have_current_path(oauth_authorization_path(params))
+ expect(page).to have_selector("a[href^='#{redirect_uri}']")
+ end
+ end
+ end
end
diff --git a/spec/features/profiles/keys_spec.rb b/spec/features/profiles/keys_spec.rb
index fde85a731a1..65944f5a537 100644
--- a/spec/features/profiles/keys_spec.rb
+++ b/spec/features/profiles/keys_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe 'Profile > SSH Keys' do
expect(page).to have_content("Title: #{attrs[:title]}")
expect(page).to have_content(attrs[:key])
- expect(find('.breadcrumbs-sub-title')).to have_link(attrs[:title])
+ expect(find('[data-testid="breadcrumb-current-link"]')).to have_link(attrs[:title])
end
it 'shows a confirmable warning if the key begins with an algorithm name that is unsupported' do
diff --git a/spec/features/profiles/oauth_applications_spec.rb b/spec/features/profiles/oauth_applications_spec.rb
index 6827dff5434..9d79041dc9d 100644
--- a/spec/features/profiles/oauth_applications_spec.rb
+++ b/spec/features/profiles/oauth_applications_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'Profile > Applications' do
visit oauth_application_path(application)
expect(page).to have_content("Application: #{application.name}")
- expect(find('.breadcrumbs-sub-title')).to have_link(application.name)
+ expect(find('[data-testid="breadcrumb-current-link"]')).to have_link(application.name)
end
it 'deletes an application' do
diff --git a/spec/features/projects/active_tabs_spec.rb b/spec/features/projects/active_tabs_spec.rb
index 2601dcf55c9..ff97d3c9503 100644
--- a/spec/features/projects/active_tabs_spec.rb
+++ b/spec/features/projects/active_tabs_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Project active tab' do
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:project) { create(:project, :repository, :with_namespace_settings) }
let(:user) { project.first_owner }
diff --git a/spec/features/projects/blobs/blame_spec.rb b/spec/features/projects/blobs/blame_spec.rb
new file mode 100644
index 00000000000..bb3b5cd931c
--- /dev/null
+++ b/spec/features/projects/blobs/blame_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'File blame', :js do
+ include TreeHelper
+
+ let_it_be(:project) { create(:project, :public, :repository) }
+
+ let(:path) { 'CHANGELOG' }
+
+ def visit_blob_blame(path)
+ visit project_blame_path(project, tree_join('master', path))
+ wait_for_all_requests
+ end
+
+ it 'displays the blame page without pagination' do
+ visit_blob_blame(path)
+
+ expect(page).to have_css('.blame-commit')
+ expect(page).not_to have_css('.gl-pagination')
+ end
+
+ context 'when blob length is over the blame range limit' do
+ before do
+ stub_const('Projects::BlameService::PER_PAGE', 2)
+ end
+
+ it 'displays two first 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('#L3')
+ 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 lines of the file with pagination' do
+ expect(page).not_to have_css('#L1')
+ expect(page).to have_css('#L3')
+ expect(find('.page-link.active')).to have_text('2')
+ end
+ end
+
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(blame_page_pagination: false)
+ end
+
+ it 'displays the blame page without pagination' do
+ visit_blob_blame(path)
+
+ expect(page).to have_css('.blame-commit')
+ expect(page).not_to have_css('.gl-pagination')
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index ad4381a526a..2f960c09936 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -12,6 +12,8 @@ RSpec.describe 'Pipeline Editor', :js do
let(:other_branch) { 'test' }
before do
+ stub_feature_flags(pipeline_editor_file_tree: false)
+
sign_in(user)
project.add_developer(user)
@@ -22,11 +24,7 @@ RSpec.describe 'Pipeline Editor', :js do
wait_for_requests
end
- it 'user sees the Pipeline Editor page' do
- expect(page).to have_content('Pipeline Editor')
- end
-
- describe 'Branch switcher' do
+ shared_examples 'default branch switcher behavior' do
def switch_to_branch(branch)
find('[data-testid="branch-selector"]').click
@@ -53,7 +51,7 @@ RSpec.describe 'Pipeline Editor', :js do
end
it 'displays new branch as selected after commiting on a new branch' do
- find('#target-branch-field').set('new_branch', clear: :backspace)
+ find('#source-branch-field').set('new_branch', clear: :backspace)
page.within('#source-editor-') do
find('textarea').send_keys '123'
@@ -68,6 +66,28 @@ RSpec.describe 'Pipeline Editor', :js do
end
end
+ it 'user sees the Pipeline Editor page' do
+ expect(page).to have_content('Pipeline Editor')
+ end
+
+ describe 'Branch Switcher (pipeline_editor_file_tree disabled)' do
+ it_behaves_like 'default branch switcher behavior'
+ end
+
+ describe 'Branch Switcher (pipeline_editor_file_tree enabled)' do
+ before do
+ stub_feature_flags(pipeline_editor_file_tree: true)
+
+ visit project_ci_pipeline_editor_path(project)
+ wait_for_requests
+
+ # close button for the popover
+ find('[data-testid="close-button"]').click
+ end
+
+ it_behaves_like 'default branch switcher behavior'
+ end
+
describe 'Editor navigation' do
context 'when no change is made' do
it 'user can navigate away without a browser alert' do
@@ -112,7 +132,7 @@ RSpec.describe 'Pipeline Editor', :js do
it 'user who creates a MR is taken to the merge request page without warnings' do
expect(page).not_to have_content('New merge request')
- find_field('Target Branch').set 'new_branch'
+ find_field('Branch').set 'new_branch'
find_field('Start a new merge request with these changes').click
click_button 'Commit changes'
diff --git a/spec/features/projects/ci/secure_files_spec.rb b/spec/features/projects/ci/secure_files_spec.rb
index 65c41eaf2ac..a0e9d663d35 100644
--- a/spec/features/projects/ci/secure_files_spec.rb
+++ b/spec/features/projects/ci/secure_files_spec.rb
@@ -7,13 +7,55 @@ RSpec.describe 'Secure Files', :js do
let(:user) { create(:user) }
before do
+ stub_feature_flags(ci_secure_files_read_only: false)
project.add_maintainer(user)
sign_in(user)
+ end
+ 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')
end
- it 'user sees the Secure Files list component' do
+ it 'prompts the user to confirm before deleting a file' do
+ file = create(:ci_secure_file, project: project)
+
+ visit project_ci_secure_files_path(project)
+
+ expect(page).to have_content(file.name)
+
+ find('button.btn-danger').click
+
+ expect(page).to have_content("Delete #{file.name}?")
+
+ click_on('Delete secure file')
+
+ visit project_ci_secure_files_path(project)
+
+ expect(page).not_to have_content(file.name)
+ end
+
+ 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')
+
+ 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
+
+ it 'displays an error when a duplicate file upload is attempted' do
+ create(:ci_secure_file, project: project, name: 'upload-keystore.jks')
+ visit project_ci_secure_files_path(project)
+
+ 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
diff --git a/spec/features/projects/clusters/eks_spec.rb b/spec/features/projects/clusters/eks_spec.rb
deleted file mode 100644
index 7e599ff1198..00000000000
--- a/spec/features/projects/clusters/eks_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'AWS EKS Cluster', :js do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- gitlab_sign_in(user)
- allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
- stub_application_setting(eks_integration_enabled: true)
- end
-
- context 'when user does not have a cluster and visits cluster index page' do
- let(:project_id) { 'test-project-1234' }
-
- before do
- visit project_clusters_path(project)
-
- click_button(class: 'dropdown-toggle-split')
- click_link 'Create a cluster (certificate - deprecated)'
- end
-
- context 'when user creates a cluster on AWS EKS' do
- before do
- click_link 'Amazon EKS'
- end
-
- it 'highlights Amazon EKS logo' do
- expect(page).to have_css('.js-create-aws-cluster-button.active')
- end
- end
- end
-end
diff --git a/spec/features/projects/clusters/gcp_spec.rb b/spec/features/projects/clusters/gcp_spec.rb
index 491121a3743..a8a23ba1c85 100644
--- a/spec/features/projects/clusters/gcp_spec.rb
+++ b/spec/features/projects/clusters/gcp_spec.rb
@@ -14,11 +14,6 @@ RSpec.describe 'Gcp Cluster', :js do
allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
end
- def submit_form
- execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")')
- execute_script('document.querySelector(".js-gke-cluster-creation-submit").click()')
- end
-
context 'when user has signed with Google' do
let(:project_id) { 'test-project-1234' }
@@ -29,82 +24,7 @@ RSpec.describe 'Gcp Cluster', :js do
.to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
end
- context 'when user does not have a cluster and visits cluster index page' do
- before do
- visit project_clusters_path(project)
-
- visit_create_cluster_page
- click_link 'Google GKE'
- end
-
- it 'highlights Google GKE logo' do
- expect(page).to have_css('.js-create-gcp-cluster-button.active')
- end
-
- context 'when user filled form with valid parameters' do
- subject { submit_form }
-
- before do
- allow_any_instance_of(GoogleApi::CloudPlatform::Client)
- .to receive(:projects_zones_clusters_create) do
- double(
- 'cluster',
- self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
- status: 'RUNNING'
- )
- end
-
- allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
-
- expect(page).to have_css('.js-gcp-project-id-dropdown')
-
- execute_script('document.querySelector(".js-gcp-project-id-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-zone-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-machine-type-dropdown input").setAttribute("type", "text")')
-
- fill_in 'cluster[name]', with: 'dev-cluster'
- fill_in 'cluster[provider_gcp_attributes][gcp_project_id]', with: 'gcp-project-123'
- fill_in 'cluster[provider_gcp_attributes][zone]', with: 'us-central1-a'
- fill_in 'cluster[provider_gcp_attributes][machine_type]', with: 'n1-standard-2'
- end
-
- it 'users sees a form with the GCP token' do
- expect(page).to have_selector(:css, 'form[data-token="token"]')
- end
-
- it 'user sees a cluster details page and creation status' do
- subject
-
- expect(page).to have_content('Kubernetes cluster is being created...')
-
- Clusters::Cluster.last.provider.make_created!
-
- expect(page).to have_content('Kubernetes cluster was successfully created')
- end
-
- it 'user sees a error if something wrong during creation' do
- subject
-
- expect(page).to have_content('Kubernetes cluster is being created...')
-
- Clusters::Cluster.last.provider.make_errored!('Something wrong!')
-
- expect(page).to have_content('Something wrong!')
- end
- end
-
- context 'when user filled form with invalid parameters' do
- before do
- submit_form
- end
-
- it 'user sees a validation error' do
- expect(page).to have_css('.gl-field-error')
- end
- end
- end
-
- context 'when user does have a cluster and visits cluster page' do
+ context 'when user have a cluster and visits cluster page' do
let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
before do
@@ -167,12 +87,6 @@ RSpec.describe 'Gcp Cluster', :js do
it 'user sees offer on cluster index page' do
expect(page).to have_css('.gcp-signup-offer')
end
-
- it 'user sees offer on cluster create page' do
- visit_create_cluster_page
-
- expect(page).to have_css('.gcp-signup-offer')
- end
end
context 'when user has dismissed GCP signup offer' do
@@ -187,8 +101,6 @@ RSpec.describe 'Gcp Cluster', :js do
find('.gcp-signup-offer .js-close').click
wait_for_requests
- visit_create_cluster_page
-
expect(page).not_to have_css('.gcp-signup-offer')
end
end
@@ -216,9 +128,4 @@ RSpec.describe 'Gcp Cluster', :js do
expect(page).not_to have_css('.gcp-signup-offer')
end
end
-
- def visit_create_cluster_page
- click_button(class: 'dropdown-toggle-split')
- click_link 'Create a cluster (certificate - deprecated)'
- end
end
diff --git a/spec/features/projects/clusters_spec.rb b/spec/features/projects/clusters_spec.rb
index 0ecd7795964..9e1d66bc73e 100644
--- a/spec/features/projects/clusters_spec.rb
+++ b/spec/features/projects/clusters_spec.rb
@@ -81,101 +81,6 @@ RSpec.describe 'Clusters', :js do
end
end
end
-
- context 'when user adds a Google Kubernetes Engine cluster' do
- before do
- allow_any_instance_of(Projects::ClustersController)
- .to receive(:token_in_session).and_return('token')
- allow_any_instance_of(Projects::ClustersController)
- .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s)
-
- allow_any_instance_of(Projects::ClustersController).to receive(:authorize_google_project_billing)
- allow_any_instance_of(Projects::ClustersController).to receive(:google_project_billing_status).and_return(true)
-
- allow_any_instance_of(GoogleApi::CloudPlatform::Client)
- .to receive(:projects_zones_clusters_create) do
- double(
- 'cluster_control',
- self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123',
- status: 'RUNNING'
- )
- end
-
- allow(WaitForClusterCreationWorker).to receive(:perform_in).and_return(nil)
-
- create(:cluster, :provided_by_gcp, name: 'default-cluster', environment_scope: '*', projects: [project])
- visit project_clusters_path(project)
- click_link 'Certificate'
- end
-
- context 'when user filled form with environment scope' do
- before do
- visit_create_cluster_page
- click_link 'Google GKE'
-
- sleep 2 # wait for ajax
- execute_script('document.querySelector(".js-gcp-project-id-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-zone-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-machine-type-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")')
-
- fill_in 'cluster_name', with: 'staging-cluster'
- fill_in 'cluster_environment_scope', with: 'staging/*'
- fill_in 'cluster[provider_gcp_attributes][gcp_project_id]', with: 'gcp-project-123'
- fill_in 'cluster[provider_gcp_attributes][zone]', with: 'us-central1-a'
- fill_in 'cluster[provider_gcp_attributes][machine_type]', with: 'n1-standard-2'
- click_button 'Create Kubernetes cluster'
-
- # The frontend won't show the details until the cluster is
- # created, and we don't want to make calls out to GCP.
- provider = Clusters::Cluster.last.provider
- provider.make_created
- end
-
- it 'user sees a cluster details page' do
- expect(page).to have_content('GitLab Integration')
- expect(page.find_field('cluster[environment_scope]').value).to eq('staging/*')
- end
- end
-
- context 'when user updates environment scope' do
- before do
- click_link 'default-cluster'
- fill_in 'cluster_environment_scope', with: 'production/*'
- within ".js-cluster-details-form" do
- click_button 'Save changes'
- end
- end
-
- it 'updates the environment scope' do
- expect(page.find_field('cluster[environment_scope]').value).to eq('production/*')
- end
- end
-
- context 'when user updates duplicated environment scope' do
- before do
- visit_create_cluster_page
- click_link 'Google GKE'
-
- sleep 2 # wait for ajax
- execute_script('document.querySelector(".js-gcp-project-id-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-zone-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gcp-machine-type-dropdown input").setAttribute("type", "text")')
- execute_script('document.querySelector(".js-gke-cluster-creation-submit").removeAttribute("disabled")')
-
- fill_in 'cluster_name', with: 'staging-cluster'
- fill_in 'cluster_environment_scope', with: '*'
- fill_in 'cluster[provider_gcp_attributes][gcp_project_id]', with: 'gcp-project-123'
- fill_in 'cluster[provider_gcp_attributes][zone]', with: 'us-central1-a'
- fill_in 'cluster[provider_gcp_attributes][machine_type]', with: 'n1-standard-2'
- click_button 'Create Kubernetes cluster'
- end
-
- it 'users sees an environment scope validation error' do
- expect(page).to have_content('cannot add duplicated environment scope')
- end
- end
- end
end
context 'when user has a cluster and visits cluster index page' do
@@ -221,7 +126,7 @@ RSpec.describe 'Clusters', :js do
visit project_clusters_path(project)
click_button(class: 'dropdown-toggle-split')
- click_link 'Create a cluster (certificate - deprecated)'
+ click_link 'Create a cluster'
end
def visit_connect_cluster_page
diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
index 57b35d81bb8..e472cff38ce 100644
--- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb
+++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js do
it 'displays a mini pipeline graph' do
expect(page).to have_selector('[data-testid="commit-box-mini-graph"]')
- first('.mini-pipeline-graph-dropdown-toggle').click
+ first('[data-testid="mini-pipeline-graph-dropdown"]').click
wait_for_requests
diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb
index 7e039a087c7..0b628ad1e9a 100644
--- a/spec/features/projects/graph_spec.rb
+++ b/spec/features/projects/graph_spec.rb
@@ -63,6 +63,23 @@ RSpec.describe 'Project Graph', :js do
end
end
+ context 'charts graph ref switcher' do
+ it 'switches ref to branch' do
+ ref_name = 'feature'
+ visit charts_project_graph_path(project, 'master')
+ first('.js-project-refs-dropdown').click
+
+ page.within '.project-refs-form' do
+ click_link ref_name
+ end
+
+ expect(page).to have_selector '.dropdown-menu-toggle', text: ref_name
+ page.within '.tree-ref-header' do
+ expect(page).to have_content ref_name
+ end
+ end
+ end
+
context 'when CI enabled' do
before do
project.enable_ci
diff --git a/spec/features/projects/integrations/prometheus_external_alerts_spec.rb b/spec/features/projects/integrations/prometheus_external_alerts_spec.rb
deleted file mode 100644
index 7e56ca13e23..00000000000
--- a/spec/features/projects/integrations/prometheus_external_alerts_spec.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Prometheus external alerts', :js do
- include_context 'project integration activation'
-
- let(:alerts_section_selector) { '.js-prometheus-alerts' }
- let(:alerts_section) { page.find(alerts_section_selector) }
-
- context 'with manual configuration' do
- before do
- create(:prometheus_integration, project: project, api_url: 'http://prometheus.example.com', manual_configuration: '1', active: true)
- end
-
- it 'shows the Alerts section' do
- visit_project_integration('Prometheus')
-
- expect(alerts_section).to have_content('Alerts')
- expect(alerts_section).to have_content('Receive alerts from manually configured Prometheus servers.')
- expect(alerts_section).to have_content('URL')
- expect(alerts_section).to have_content('Authorization key')
- end
- end
-
- context 'with no configuration' do
- it 'does not show the Alerts section' do
- visit_project_integration('Prometheus')
- wait_for_requests
-
- expect(page).not_to have_css(alerts_section_selector)
- end
- end
-end
diff --git a/spec/features/projects/integrations/user_activates_prometheus_spec.rb b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
index 80629af6fce..56b895919b8 100644
--- a/spec/features/projects/integrations/user_activates_prometheus_spec.rb
+++ b/spec/features/projects/integrations/user_activates_prometheus_spec.rb
@@ -9,14 +9,13 @@ RSpec.describe 'User activates Prometheus' do
stub_request(:get, /.*prometheus.example.com.*/)
end
- it 'does not activate integration and informs about deprecation', :js do
+ it 'saves and activates integration', :js do
visit_project_integration('Prometheus')
check('Active')
fill_in('API URL', with: 'http://prometheus.example.com')
click_button('Save changes')
- expect(page).not_to have_content('Prometheus settings saved and active.')
- expect(page).to have_content('Fields on this page have been deprecated.')
+ expect(page).to have_content('Prometheus settings saved and active.')
end
end
diff --git a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
index 48ae70d3ec9..27d0be23aec 100644
--- a/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
+++ b/spec/features/projects/issues/design_management/user_uploads_designs_spec.rb
@@ -10,9 +10,6 @@ RSpec.describe 'User uploads new design', :js do
let(:issue) { create(:issue, project: project) }
before do
- # Cause of raising query limiting threshold https://gitlab.com/gitlab-org/gitlab/-/issues/358845
- stub_const("Gitlab::QueryLimiting::Transaction::THRESHOLD", 106)
-
sign_in(user)
enable_design_management(feature_enabled)
visit project_issue_path(project, issue)
diff --git a/spec/features/projects/jobs/user_browses_jobs_spec.rb b/spec/features/projects/jobs/user_browses_jobs_spec.rb
index 3b70d177fce..07b7a54974a 100644
--- a/spec/features/projects/jobs/user_browses_jobs_spec.rb
+++ b/spec/features/projects/jobs/user_browses_jobs_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe 'User browses jobs' do
stub_feature_flags(jobs_table_vue: false)
project.add_maintainer(user)
project.enable_ci
- project.update_attribute(:build_coverage_regex, /Coverage (\d+)%/)
+ build.update!(coverage_regex: '/Coverage (\d+)%/')
sign_in(user)
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index b34a615e651..befaf85fc1e 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -484,7 +484,7 @@ RSpec.describe 'Jobs', :clean_gitlab_redis_shared_state do
end
context 'when job has an initial trace' do
- it 'loads job trace' do
+ it 'loads job logs' do
expect(page).to have_content 'BUILD TRACE'
job.trace.write(+'a+b') do |stream|
diff --git a/spec/features/projects/members/groups_with_access_list_spec.rb b/spec/features/projects/members/groups_with_access_list_spec.rb
index 9bd6476f836..821b9249aa8 100644
--- a/spec/features/projects/members/groups_with_access_list_spec.rb
+++ b/spec/features/projects/members/groups_with_access_list_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'Projects > Members > Groups with access list', :js do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, :public) }
- let_it_be(:project) { create(:project, :public) }
+ let_it_be(:project) { create(:project, :public, :with_namespace_settings) }
let_it_be(:expiration_date) { 5.days.from_now.to_date }
let(:additional_link_attrs) { {} }
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
deleted file mode 100644
index a48229249e0..00000000000
--- a/spec/features/projects/members/invite_group_spec.rb
+++ /dev/null
@@ -1,296 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Project > Members > Invite group', :js do
- include ActionView::Helpers::DateHelper
- include Spec::Support::Helpers::Features::MembersHelpers
- include Spec::Support::Helpers::Features::InviteMembersModalHelper
-
- let_it_be(:maintainer) { create(:user) }
-
- it 'displays the invite group button' do
- project = create(:project, namespace: create(:group))
-
- project.add_maintainer(maintainer)
- sign_in(maintainer)
-
- visit project_project_members_path(project)
-
- expect(page).to have_selector(invite_group_selector)
- end
-
- it 'does not display the button when visiting the page not signed in' do
- project = create(:project, namespace: create(:group))
-
- visit project_project_members_path(project)
-
- expect(page).not_to have_selector(invite_group_selector)
- end
-
- describe 'Share with group lock' do
- shared_examples 'the project can be shared with groups' do
- it 'the "Invite a group" button exists' do
- visit project_project_members_path(project)
- expect(page).to have_selector(invite_group_selector)
- end
- end
-
- shared_examples 'the project cannot be shared with groups' do
- it 'the "Invite a group" button does not exist' do
- visit project_project_members_path(project)
- expect(page).not_to have_selector(invite_group_selector)
- end
- end
-
- context 'for a project in a root group' do
- let!(:group_to_share_with) { create(:group) }
- let(:project) { create(:project, namespace: create(:group)) }
-
- before do
- project.add_maintainer(maintainer)
- group_to_share_with.add_guest(maintainer)
- sign_in(maintainer)
- end
-
- context 'when the group has "Share with group lock" disabled' do
- it_behaves_like 'the project can be shared with groups'
-
- it 'the project can be shared with another group' do
- visit project_project_members_path(project)
-
- expect(page).not_to have_link 'Groups'
-
- invite_group(group_to_share_with.name)
-
- visit project_project_members_path(project)
-
- click_link 'Groups'
-
- expect(members_table).to have_content(group_to_share_with.name)
- end
- end
-
- context 'when the group has "Share with group lock" enabled' do
- before do
- project.namespace.update_column(:share_with_group_lock, true)
- end
-
- it_behaves_like 'the project cannot be shared with groups'
- end
- end
-
- context 'for a project in a subgroup' do
- let!(:group_to_share_with) { create(:group) }
- let(:root_group) { create(:group) }
- let(:subgroup) { create(:group, parent: root_group) }
- let(:project) { create(:project, namespace: subgroup) }
-
- before do
- project.add_maintainer(maintainer)
- sign_in(maintainer)
- end
-
- context 'when the root_group has "Share with group lock" disabled' do
- context 'when the subgroup has "Share with group lock" disabled' do
- it_behaves_like 'the project can be shared with groups'
- end
-
- context 'when the subgroup has "Share with group lock" enabled' do
- before do
- subgroup.update_column(:share_with_group_lock, true)
- end
-
- it_behaves_like 'the project cannot be shared with groups'
- end
- end
-
- context 'when the root_group has "Share with group lock" enabled' do
- before do
- root_group.update_column(:share_with_group_lock, true)
- end
-
- context 'when the subgroup has "Share with group lock" disabled (parent overridden)' do
- it_behaves_like 'the project can be shared with groups'
- end
-
- context 'when the subgroup has "Share with group lock" enabled' do
- before do
- subgroup.update_column(:share_with_group_lock, true)
- end
-
- it_behaves_like 'the project cannot be shared with groups'
- end
- end
- end
- end
-
- describe 'setting an expiration date for a group link' do
- let(:project) { create(:project) }
- let!(:group) { create(:group) }
-
- let_it_be(:expiration_date) { 5.days.from_now.to_date }
-
- around do |example|
- freeze_time { example.run }
- end
-
- def setup
- project.add_maintainer(maintainer)
- group.add_guest(maintainer)
- sign_in(maintainer)
-
- visit project_project_members_path(project)
-
- invite_group(group.name, role: 'Guest', expires_at: expiration_date)
- end
-
- it 'the group link shows the expiration time with a warning class' do
- setup
- click_link 'Groups'
-
- expect(page).to have_field('Expiration date', with: expiration_date)
- end
- end
-
- describe 'the groups dropdown' do
- let_it_be(:parent_group) { create(:group, :public) }
- let_it_be(:project_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:project) { create(:project, group: project_group) }
-
- context 'with instance admin considerations' do
- let_it_be(:group_to_share) { create(:group) }
-
- context 'when user is an admin' do
- let_it_be(:admin) { create(:admin) }
-
- before do
- sign_in(admin)
- gitlab_enable_admin_mode_sign_in(admin)
- end
-
- it 'shows groups where the admin has no direct membership' do
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- end
- end
-
- it 'shows groups where the admin has at least guest level membership' do
- group_to_share.add_guest(admin)
-
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- end
- end
- end
-
- context 'when user is not an admin' do
- before do
- project.add_maintainer(maintainer)
- sign_in(maintainer)
- end
-
- it 'does not show groups where the user has no direct membership' do
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_not_to_have_group(group_to_share)
- end
- end
-
- it 'shows groups where the user has at least guest level membership' do
- group_to_share.add_guest(maintainer)
-
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(group_to_share)
- end
- end
- end
- end
-
- context 'for a project in a nested group' do
- let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
- let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
- let_it_be(:private_membership_group) { create(:group, :private) }
- let_it_be(:public_membership_group) { create(:group, :public) }
- let_it_be(:project) { create(:project, group: project_group) }
-
- before do
- private_membership_group.add_guest(maintainer)
- public_membership_group.add_maintainer(maintainer)
-
- sign_in(maintainer)
- end
-
- it 'does not show the groups inherited from projects' do
- project.add_maintainer(maintainer)
- public_sibbling_group.add_maintainer(maintainer)
-
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(public_membership_group)
- expect_to_have_group(public_sibbling_group)
- expect_to_have_group(private_membership_group)
-
- expect_not_to_have_group(public_sub_subgroup)
- expect_not_to_have_group(private_sibbling_group)
- expect_not_to_have_group(parent_group)
- expect_not_to_have_group(project_group)
- end
- end
-
- it 'does not show the ancestors or project group', :aggregate_failures do
- parent_group.add_maintainer(maintainer)
-
- visit project_project_members_path(project)
-
- click_on 'Invite a group'
- click_on 'Select a group'
- wait_for_requests
-
- page.within(group_dropdown_selector) do
- expect_to_have_group(public_membership_group)
- expect_to_have_group(public_sibbling_group)
- expect_to_have_group(private_membership_group)
- expect_to_have_group(public_sub_subgroup)
- expect_to_have_group(private_sibbling_group)
-
- expect_not_to_have_group(parent_group)
- expect_not_to_have_group(project_group)
- end
- end
- end
- end
-
- def invite_group_selector
- 'button[data-test-id="invite-group-button"]'
- end
-end
diff --git a/spec/features/projects/members/manage_groups_spec.rb b/spec/features/projects/members/manage_groups_spec.rb
new file mode 100644
index 00000000000..006fa3b6eff
--- /dev/null
+++ b/spec/features/projects/members/manage_groups_spec.rb
@@ -0,0 +1,233 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Project > Members > Manage groups', :js do
+ include ActionView::Helpers::DateHelper
+ include Spec::Support::Helpers::Features::MembersHelpers
+ include Spec::Support::Helpers::Features::InviteMembersModalHelper
+
+ let_it_be(:maintainer) { create(:user) }
+
+ it 'displays the invite group button' do
+ project = create(:project, namespace: create(:group))
+
+ project.add_maintainer(maintainer)
+ sign_in(maintainer)
+
+ visit project_project_members_path(project)
+
+ expect(page).to have_selector(invite_group_selector)
+ end
+
+ it 'does not display the button when visiting the page not signed in' do
+ project = create(:project, namespace: create(:group))
+
+ visit project_project_members_path(project)
+
+ expect(page).not_to have_selector(invite_group_selector)
+ end
+
+ describe 'Share with group lock' do
+ shared_examples 'the project can be shared with groups' do
+ it 'the "Invite a group" button exists' do
+ visit project_project_members_path(project)
+ expect(page).to have_selector(invite_group_selector)
+ end
+ end
+
+ shared_examples 'the project cannot be shared with groups' do
+ it 'the "Invite a group" button does not exist' do
+ visit project_project_members_path(project)
+ expect(page).not_to have_selector(invite_group_selector)
+ end
+ end
+
+ context 'for a project in a root group' do
+ let!(:group_to_share_with) { create(:group) }
+ let(:project) { create(:project, namespace: create(:group)) }
+
+ before do
+ project.add_maintainer(maintainer)
+ group_to_share_with.add_guest(maintainer)
+ sign_in(maintainer)
+ end
+
+ context 'when the group has "Share with group lock" disabled' do
+ it_behaves_like 'the project can be shared with groups'
+
+ it 'the project can be shared with another group' do
+ visit project_project_members_path(project)
+
+ expect(page).not_to have_link 'Groups'
+
+ invite_group(group_to_share_with.name)
+
+ visit project_project_members_path(project)
+
+ click_link 'Groups'
+
+ expect(members_table).to have_content(group_to_share_with.name)
+ end
+ end
+
+ context 'when the group has "Share with group lock" enabled' do
+ before do
+ project.namespace.update_column(:share_with_group_lock, true)
+ end
+
+ it_behaves_like 'the project cannot be shared with groups'
+ end
+ end
+
+ context 'for a project in a subgroup' do
+ let!(:group_to_share_with) { create(:group) }
+ let(:root_group) { create(:group) }
+ let(:subgroup) { create(:group, parent: root_group) }
+ let(:project) { create(:project, namespace: subgroup) }
+
+ before do
+ project.add_maintainer(maintainer)
+ sign_in(maintainer)
+ end
+
+ context 'when the root_group has "Share with group lock" disabled' do
+ context 'when the subgroup has "Share with group lock" disabled' do
+ it_behaves_like 'the project can be shared with groups'
+ end
+
+ context 'when the subgroup has "Share with group lock" enabled' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ it_behaves_like 'the project cannot be shared with groups'
+ end
+ end
+
+ context 'when the root_group has "Share with group lock" enabled' do
+ before do
+ root_group.update_column(:share_with_group_lock, true)
+ end
+
+ context 'when the subgroup has "Share with group lock" disabled (parent overridden)' do
+ it_behaves_like 'the project can be shared with groups'
+ end
+
+ context 'when the subgroup has "Share with group lock" enabled' do
+ before do
+ subgroup.update_column(:share_with_group_lock, true)
+ end
+
+ it_behaves_like 'the project cannot be shared with groups'
+ end
+ end
+ end
+ end
+
+ describe 'setting an expiration date for a group link' do
+ let(:project) { create(:project, :with_namespace_settings) }
+ let!(:group) { create(:group) }
+
+ let_it_be(:expiration_date) { 5.days.from_now.to_date }
+
+ around do |example|
+ freeze_time { example.run }
+ end
+
+ def setup
+ project.add_maintainer(maintainer)
+ group.add_guest(maintainer)
+ sign_in(maintainer)
+
+ visit project_project_members_path(project)
+
+ invite_group(group.name, role: 'Guest', expires_at: expiration_date)
+ end
+
+ it 'the group link shows the expiration time with a warning class' do
+ setup
+ click_link 'Groups'
+
+ expect(page).to have_field('Expiration date', with: expiration_date)
+ end
+ end
+
+ describe 'group search results' do
+ let_it_be(:parent_group) { create(:group, :public) }
+ let_it_be(:project_group) { create(:group, :public, parent: parent_group) }
+ let_it_be(:project) { create(:project, group: project_group) }
+
+ it_behaves_like 'inviting groups search results' do
+ let_it_be(:user) { maintainer }
+ let_it_be(:group) { parent_group }
+ let_it_be(:group_within_hierarchy) { create(:group, parent: group) }
+ let_it_be(:project_within_hierarchy) { create(:project, group: group_within_hierarchy)}
+ let_it_be(:members_page_path) { project_project_members_path(project) }
+ let_it_be(:members_page_path_within_hierarchy) { project_project_members_path(project_within_hierarchy) }
+ end
+
+ context 'for a project in a nested group' do
+ let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
+ let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
+ let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
+ let_it_be(:private_membership_group) { create(:group, :private) }
+ let_it_be(:public_membership_group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, group: project_group) }
+
+ before do
+ private_membership_group.add_guest(maintainer)
+ public_membership_group.add_maintainer(maintainer)
+
+ sign_in(maintainer)
+ end
+
+ it 'does not show the groups inherited from projects' do
+ project.add_maintainer(maintainer)
+ public_sibbling_group.add_maintainer(maintainer)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(public_membership_group)
+ expect_to_have_group(public_sibbling_group)
+ expect_to_have_group(private_membership_group)
+
+ expect_not_to_have_group(public_sub_subgroup)
+ expect_not_to_have_group(private_sibbling_group)
+ expect_not_to_have_group(parent_group)
+ expect_not_to_have_group(project_group)
+ end
+ end
+
+ it 'does not show the ancestors or project group', :aggregate_failures do
+ parent_group.add_maintainer(maintainer)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(public_membership_group)
+ expect_to_have_group(public_sibbling_group)
+ expect_to_have_group(private_membership_group)
+ expect_to_have_group(public_sub_subgroup)
+ expect_to_have_group(private_sibbling_group)
+
+ expect_not_to_have_group(parent_group)
+ expect_not_to_have_group(project_group)
+ end
+ end
+ end
+ end
+
+ def invite_group_selector
+ 'button[data-test-id="invite-group-button"]'
+ 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 830ada29a2e..bd0874316ac 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
@@ -8,7 +8,7 @@ RSpec.describe 'Projects > Members > Maintainer adds member with expiration date
include Spec::Support::Helpers::Features::InviteMembersModalHelper
let_it_be(:maintainer) { create(:user) }
- let_it_be(:project) { create(:project) }
+ let_it_be(:project) { create(:project, :with_namespace_settings) }
let_it_be(:three_days_from_now) { 3.days.from_now.to_date }
let_it_be(:five_days_from_now) { 5.days.from_now.to_date }
diff --git a/spec/features/projects/members/master_manages_access_requests_spec.rb b/spec/features/projects/members/master_manages_access_requests_spec.rb
index 4c3eaa93352..f4e8c55e3cc 100644
--- a/spec/features/projects/members/master_manages_access_requests_spec.rb
+++ b/spec/features/projects/members/master_manages_access_requests_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe 'Projects > Members > Maintainer manages access requests' do
it_behaves_like 'Maintainer manages access requests' do
- let(:entity) { create(:project, :public) }
+ let(:entity) { create(:project, :public, :with_namespace_settings) }
let(:members_page_path) { project_project_members_path(entity) }
end
end
diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb
index 78a0a384d2c..67c40c1dbee 100644
--- a/spec/features/projects/members/member_leaves_project_spec.rb
+++ b/spec/features/projects/members/member_leaves_project_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe 'Projects > Members > Member leaves project' do
include Spec::Support::Helpers::Features::MembersHelpers
let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :repository, :with_namespace_settings) }
before do
project.add_developer(user)
diff --git a/spec/features/projects/navbar_spec.rb b/spec/features/projects/navbar_spec.rb
index 5098908857a..023601b0b1e 100644
--- a/spec/features/projects/navbar_spec.rb
+++ b/spec/features/projects/navbar_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe 'Project navbar' do
stub_config(registry: { enabled: false })
stub_feature_flags(harbor_registry_integration: false)
- insert_package_nav(_('Infrastructure'))
+ insert_package_nav(_('Deployments'))
insert_infrastructure_registry_nav
insert_infrastructure_google_cloud_nav
end
@@ -49,7 +49,7 @@ RSpec.describe 'Project navbar' do
stub_config(pages: { enabled: true })
insert_after_sub_nav_item(
- _('Monitor'),
+ _('CI/CD'),
within: _('Settings'),
new_sub_nav_item_name: _('Pages')
)
@@ -67,7 +67,7 @@ RSpec.describe 'Project navbar' do
insert_container_nav
insert_after_sub_nav_item(
- _('Monitor'),
+ _('CI/CD'),
within: _('Settings'),
new_sub_nav_item_name: _('Packages & Registries')
)
diff --git a/spec/features/projects/packages_spec.rb b/spec/features/projects/packages_spec.rb
index 8180f6b9aff..f518cc1fc63 100644
--- a/spec/features/projects/packages_spec.rb
+++ b/spec/features/projects/packages_spec.rb
@@ -47,7 +47,8 @@ RSpec.describe 'Packages' do
let_it_be(:package) { create(:package, project: project) }
it 'allows you to delete a package' do
- first('[title="Remove package"]').click
+ find('[data-testid="delete-dropdown"]').click
+ find('[data-testid="action-delete"]').click
click_button('Delete package')
expect(page).to have_content 'Package deleted successfully'
diff --git a/spec/features/projects/pipelines/legacy_pipeline_spec.rb b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
new file mode 100644
index 00000000000..a29cef393a8
--- /dev/null
+++ b/spec/features/projects/pipelines/legacy_pipeline_spec.rb
@@ -0,0 +1,1073 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Pipeline', :js do
+ include RoutesHelpers
+ include ProjectForksHelper
+ include ::ExclusiveLeaseHelpers
+
+ let_it_be(:project) { create(:project) }
+
+ let(:user) { create(:user) }
+ let(:role) { :developer }
+
+ before do
+ sign_in(user)
+ project.add_role(user, role)
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
+ shared_context 'pipeline builds' do
+ let!(:build_passed) do
+ create(:ci_build, :success,
+ pipeline: pipeline, stage: 'build', stage_idx: 0, name: 'build')
+ end
+
+ let!(:build_failed) do
+ create(:ci_build, :failed,
+ pipeline: pipeline, stage: 'test', stage_idx: 1, name: 'test')
+ end
+
+ let!(:build_preparing) do
+ create(:ci_build, :preparing,
+ pipeline: pipeline, stage: 'deploy', stage_idx: 2, name: 'prepare')
+ end
+
+ let!(:build_running) do
+ create(:ci_build, :running,
+ pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'deploy')
+ end
+
+ let!(:build_manual) do
+ create(:ci_build, :manual,
+ pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'manual-build')
+ end
+
+ let!(:build_scheduled) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline, stage: 'deploy', stage_idx: 3, name: 'delayed-job')
+ end
+
+ let!(:build_external) do
+ create(:generic_commit_status, status: 'success',
+ pipeline: pipeline,
+ name: 'jenkins',
+ stage: 'external',
+ ref: 'master',
+ target_url: 'http://gitlab.com/status')
+ end
+ end
+
+ describe 'GET /:project/-/pipelines/:id' do
+ include_context 'pipeline builds'
+
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project, reload: true) { create(:project, :repository, group: group) }
+
+ let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user) }
+
+ subject(:visit_pipeline) { visit project_pipeline_path(project, pipeline) }
+
+ it 'shows the pipeline graph' do
+ visit_pipeline
+
+ expect(page).to have_selector('.js-pipeline-graph')
+ expect(page).to have_content('Build')
+ expect(page).to have_content('Test')
+ expect(page).to have_content('Deploy')
+ expect(page).to have_content('Retry')
+ expect(page).to have_content('Cancel running')
+ end
+
+ it 'shows Pipeline tab pane as active' do
+ visit_pipeline
+
+ expect(page).to have_css('#js-tab-pipeline.active')
+ end
+
+ it 'shows link to the pipeline ref' do
+ visit_pipeline
+
+ expect(page).to have_link(pipeline.ref)
+ end
+
+ it 'shows the pipeline information' do
+ visit_pipeline
+
+ within '.pipeline-info' do
+ expect(page).to have_content("#{pipeline.statuses.count} jobs " \
+ "for #{pipeline.ref}")
+ expect(page).to have_link(pipeline.ref,
+ href: project_commits_path(pipeline.project, pipeline.ref))
+ end
+ end
+
+ describe 'related merge requests' do
+ context 'when there are no related merge requests' do
+ it 'shows a "no related merge requests" message' do
+ visit_pipeline
+
+ within '.related-merge-request-info' do
+ expect(page).to have_content('No related merge requests found.')
+ end
+ end
+ end
+
+ context 'when there is one related merge request' do
+ let!(:merge_request) do
+ create(:merge_request,
+ source_project: project,
+ source_branch: pipeline.ref)
+ end
+
+ it 'shows a link to the merge request' do
+ visit_pipeline
+
+ within '.related-merge-requests' do
+ expect(page).to have_content('1 related merge request: ')
+ expect(page).to have_selector('.js-truncated-mr-list')
+ expect(page).to have_link("#{merge_request.to_reference} #{merge_request.title}")
+
+ expect(page).not_to have_selector('.js-full-mr-list')
+ expect(page).not_to have_selector('.text-expander')
+ end
+ end
+ end
+
+ context 'when there are two related merge requests' do
+ let!(:merge_request1) do
+ create(:merge_request,
+ source_project: project,
+ source_branch: pipeline.ref)
+ end
+
+ let!(:merge_request2) do
+ create(:merge_request,
+ source_project: project,
+ source_branch: pipeline.ref,
+ target_branch: 'fix')
+ end
+
+ it 'links to the most recent related merge request' do
+ visit_pipeline
+
+ within '.related-merge-requests' do
+ expect(page).to have_content('2 related merge requests: ')
+ expect(page).to have_link("#{merge_request2.to_reference} #{merge_request2.title}")
+ expect(page).to have_selector('.text-expander')
+ expect(page).to have_selector('.js-full-mr-list', visible: false)
+ end
+ end
+
+ it 'expands to show links to all related merge requests' do
+ visit_pipeline
+
+ within '.related-merge-requests' do
+ find('.text-expander').click
+
+ expect(page).to have_selector('.js-full-mr-list', visible: true)
+
+ pipeline.all_merge_requests.map do |merge_request|
+ expect(page).to have_link(href: project_merge_request_path(project, merge_request))
+ end
+ end
+ end
+ end
+ end
+
+ describe 'pipelines details view' do
+ let!(:status) { create(:user_status, user: pipeline.user, emoji: 'smirk', message: 'Authoring this object') }
+
+ it 'pipeline header shows the user status and emoji' do
+ visit project_pipeline_path(project, pipeline)
+
+ within '[data-testid="ci-header-content"]' do
+ expect(page).to have_selector("[data-testid='#{status.message}']")
+ expect(page).to have_selector("[data-name='#{status.emoji}']")
+ end
+ end
+ end
+
+ describe 'pipeline graph' do
+ before do
+ visit_pipeline
+ end
+
+ context 'when pipeline has running builds' do
+ it 'shows a running icon and a cancel action for the running build' do
+ page.within('#ci-badge-deploy') do
+ expect(page).to have_selector('.js-ci-status-icon-running')
+ expect(page).to have_selector('.js-icon-cancel')
+ expect(page).to have_content('deploy')
+ end
+ end
+
+ it 'cancels the running build and shows retry button', :sidekiq_might_not_need_inline do
+ find('#ci-badge-deploy .ci-action-icon-container').click
+
+ page.within('#ci-badge-deploy') do
+ expect(page).to have_css('.js-icon-retry')
+ end
+ end
+ end
+
+ context 'when pipeline has preparing builds' do
+ it 'shows a preparing icon and a cancel action' do
+ page.within('#ci-badge-prepare') do
+ expect(page).to have_selector('.js-ci-status-icon-preparing')
+ expect(page).to have_selector('.js-icon-cancel')
+ expect(page).to have_content('prepare')
+ end
+ end
+
+ it 'cancels the preparing build and shows retry button', :sidekiq_might_not_need_inline do
+ find('#ci-badge-deploy .ci-action-icon-container').click
+
+ page.within('#ci-badge-deploy') do
+ expect(page).to have_css('.js-icon-retry')
+ end
+ end
+ end
+
+ context 'when pipeline has successful builds' do
+ it 'shows the success icon and a retry action for the successful build' do
+ page.within('#ci-badge-build') do
+ expect(page).to have_selector('.js-ci-status-icon-success')
+ expect(page).to have_content('build')
+ end
+
+ page.within('#ci-badge-build .ci-action-icon-container.js-icon-retry') do
+ expect(page).to have_selector('svg')
+ end
+ end
+
+ it 'is possible to retry the success job', :sidekiq_might_not_need_inline do
+ find('#ci-badge-build .ci-action-icon-container').click
+ wait_for_requests
+
+ expect(page).not_to have_content('Retry job')
+ within('.js-pipeline-header-container') do
+ expect(page).to have_selector('.js-ci-status-icon-running')
+ end
+ end
+ end
+
+ context 'when pipeline has a delayed job' do
+ let(:project) { create(:project, :repository, group: group) }
+
+ it 'shows the scheduled icon and an unschedule action for the delayed job' do
+ page.within('#ci-badge-delayed-job') do
+ expect(page).to have_selector('.js-ci-status-icon-scheduled')
+ expect(page).to have_content('delayed-job')
+ end
+
+ page.within('#ci-badge-delayed-job .ci-action-icon-container.js-icon-time-out') do
+ expect(page).to have_selector('svg')
+ end
+ end
+
+ it 'unschedules the delayed job and shows play button as a manual job', :sidekiq_might_not_need_inline do
+ find('#ci-badge-delayed-job .ci-action-icon-container').click
+
+ page.within('#ci-badge-delayed-job') do
+ expect(page).to have_css('.js-icon-play')
+ end
+ end
+ end
+
+ context 'when pipeline has failed builds' do
+ it 'shows the failed icon and a retry action for the failed build' do
+ page.within('#ci-badge-test') do
+ expect(page).to have_selector('.js-ci-status-icon-failed')
+ expect(page).to have_content('test')
+ end
+
+ page.within('#ci-badge-test .ci-action-icon-container.js-icon-retry') do
+ expect(page).to have_selector('svg')
+ end
+ end
+
+ it 'is possible to retry the failed build', :sidekiq_might_not_need_inline do
+ find('#ci-badge-test .ci-action-icon-container').click
+ wait_for_requests
+
+ expect(page).not_to have_content('Retry job')
+ within('.js-pipeline-header-container') do
+ expect(page).to have_selector('.js-ci-status-icon-running')
+ end
+ end
+
+ it 'includes the failure reason' do
+ page.within('#ci-badge-test') do
+ build_link = page.find('.js-pipeline-graph-job-link')
+ expect(build_link['title']).to eq('test - failed - (unknown failure)')
+ end
+ end
+ end
+
+ context 'when pipeline has manual jobs' do
+ it 'shows the skipped icon and a play action for the manual build' do
+ page.within('#ci-badge-manual-build') do
+ expect(page).to have_selector('.js-ci-status-icon-manual')
+ expect(page).to have_content('manual')
+ end
+
+ page.within('#ci-badge-manual-build .ci-action-icon-container.js-icon-play') do
+ expect(page).to have_selector('svg')
+ end
+ end
+
+ it 'is possible to play the manual job', :sidekiq_might_not_need_inline do
+ find('#ci-badge-manual-build .ci-action-icon-container').click
+ wait_for_requests
+
+ expect(page).not_to have_content('Play job')
+ within('.js-pipeline-header-container') do
+ expect(page).to have_selector('.js-ci-status-icon-running')
+ end
+ end
+ end
+
+ context 'when pipeline has external job' do
+ it 'shows the success icon and the generic comit status build' do
+ expect(page).to have_selector('.js-ci-status-icon-success')
+ expect(page).to have_content('jenkins')
+ expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
+ end
+ end
+ end
+
+ context 'when the pipeline has manual stage' do
+ before do
+ create(:ci_build, :manual, pipeline: pipeline, stage_idx: 10, stage: 'publish', name: 'CentOS')
+ create(:ci_build, :manual, pipeline: pipeline, stage_idx: 10, stage: 'publish', name: 'Debian')
+ create(:ci_build, :manual, pipeline: pipeline, stage_idx: 10, stage: 'publish', name: 'OpenSUDE')
+
+ # force to update stages statuses
+ Ci::ProcessPipelineService.new(pipeline).execute
+
+ visit_pipeline
+ end
+
+ it 'displays play all button' do
+ expect(page).to have_selector('.js-stage-action')
+ end
+ end
+
+ context 'page tabs' do
+ before do
+ visit_pipeline
+ end
+
+ it 'shows Pipeline, Jobs, DAG and Failed Jobs tabs with link' do
+ expect(page).to have_link('Pipeline')
+ expect(page).to have_link('Jobs')
+ expect(page).to have_link('Needs')
+ expect(page).to have_link('Failed Jobs')
+ end
+
+ it 'shows counter in Jobs tab' do
+ expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
+ end
+
+ it 'shows Pipeline tab as active' do
+ expect(page).to have_css('.js-pipeline-tab-link .active')
+ end
+
+ context 'without permission to access builds' do
+ let(:project) { create(:project, :public, :repository, public_builds: false) }
+ let(:role) { :guest }
+
+ it 'does not show the pipeline details page' do
+ expect(page).to have_content('Not Found')
+ end
+ end
+ end
+
+ context 'retrying jobs' do
+ before do
+ visit_pipeline
+ end
+
+ it { expect(page).not_to have_content('retried') }
+
+ context 'when retrying' do
+ before do
+ find('[data-testid="retryPipeline"]').click
+ wait_for_requests
+ end
+
+ it 'does not show a "Retry" button', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_content('Retry')
+ end
+
+ it 'shows running status in pipeline header', :sidekiq_might_not_need_inline do
+ within('.js-pipeline-header-container') do
+ expect(page).to have_selector('.js-ci-status-icon-running')
+ end
+ end
+ end
+ end
+
+ context 'canceling jobs' do
+ before do
+ visit_pipeline
+ end
+
+ it { expect(page).not_to have_selector('.ci-canceled') }
+
+ context 'when canceling' do
+ before do
+ click_on 'Cancel running'
+ end
+
+ it 'does not show a "Cancel running" button', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_content('Cancel running')
+ end
+ end
+ end
+
+ context 'when user can not delete' do
+ before do
+ visit_pipeline
+ end
+
+ it { expect(page).not_to have_button('Delete') }
+ end
+
+ context 'when deleting' do
+ before do
+ group.add_owner(user)
+
+ visit_pipeline
+
+ click_button 'Delete'
+ click_button 'Delete pipeline'
+ end
+
+ it 'redirects to pipeline overview page', :sidekiq_inline do
+ expect(page).to have_content('The pipeline has been deleted')
+ expect(page).to have_current_path(project_pipelines_path(project), ignore_query: true)
+ end
+ end
+
+ context 'when pipeline ref does not exist in repository anymore' do
+ let(:pipeline) do
+ create(:ci_empty_pipeline, project: project,
+ ref: 'non-existent',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ visit_pipeline
+ end
+
+ it 'does not render link to the pipeline ref' do
+ expect(page).not_to have_link(pipeline.ref)
+ expect(page).to have_content(pipeline.ref)
+ end
+
+ it 'does not render render raw HTML to the pipeline ref' do
+ page.within '.pipeline-info' do
+ expect(page).not_to have_content('<span class="ref-name"')
+ end
+ end
+ end
+
+ context 'when pipeline is detached merge request pipeline' do
+ let(:source_project) { project }
+ let(:target_project) { project }
+
+ let(:merge_request) do
+ create(:merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project)
+ end
+
+ let(:pipeline) do
+ merge_request.all_pipelines.last
+ end
+
+ it 'shows the pipeline information' do
+ visit_pipeline
+
+ within '.pipeline-info' do
+ expect(page).to have_content("#{pipeline.statuses.count} jobs " \
+ "for !#{merge_request.iid} " \
+ "with #{merge_request.source_branch}")
+ expect(page).to have_link("!#{merge_request.iid}",
+ href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.source_branch,
+ href: project_commits_path(merge_request.source_project, merge_request.source_branch))
+ end
+ end
+
+ context 'when source branch does not exist' do
+ before do
+ project.repository.rm_branch(user, merge_request.source_branch)
+ end
+
+ it 'does not link to the source branch commit path' do
+ visit_pipeline
+
+ within '.pipeline-info' do
+ expect(page).not_to have_link(merge_request.source_branch)
+ expect(page).to have_content(merge_request.source_branch)
+ end
+ end
+ end
+
+ context 'when source project is a forked project' do
+ let(:source_project) { fork_project(project, user, repository: true) }
+
+ before do
+ visit project_pipeline_path(source_project, pipeline)
+ end
+
+ it 'shows the pipeline information', :sidekiq_might_not_need_inline do
+ within '.pipeline-info' do
+ expect(page).to have_content("#{pipeline.statuses.count} jobs " \
+ "for !#{merge_request.iid} " \
+ "with #{merge_request.source_branch}")
+ expect(page).to have_link("!#{merge_request.iid}",
+ href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.source_branch,
+ href: project_commits_path(merge_request.source_project, merge_request.source_branch))
+ end
+ end
+ end
+ end
+
+ context 'when pipeline is merge request pipeline' do
+ let(:project) { create(:project, :repository, group: group) }
+ let(:source_project) { project }
+ let(:target_project) { project }
+
+ let(:merge_request) do
+ create(:merge_request,
+ :with_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project,
+ merge_sha: project.commit.id)
+ end
+
+ let(:pipeline) do
+ merge_request.all_pipelines.last
+ end
+
+ before do
+ pipeline.update!(user: user)
+ end
+
+ it 'shows the pipeline information' do
+ visit_pipeline
+
+ within '.pipeline-info' do
+ expect(page).to have_content("#{pipeline.statuses.count} jobs " \
+ "for !#{merge_request.iid} " \
+ "with #{merge_request.source_branch} " \
+ "into #{merge_request.target_branch}")
+ expect(page).to have_link("!#{merge_request.iid}",
+ href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.source_branch,
+ href: project_commits_path(merge_request.source_project, merge_request.source_branch))
+ expect(page).to have_link(merge_request.target_branch,
+ href: project_commits_path(merge_request.target_project, merge_request.target_branch))
+ end
+ end
+
+ context 'when target branch does not exist' do
+ before do
+ project.repository.rm_branch(user, merge_request.target_branch)
+ end
+
+ it 'does not link to the target branch commit path' do
+ visit_pipeline
+
+ within '.pipeline-info' do
+ expect(page).not_to have_link(merge_request.target_branch)
+ expect(page).to have_content(merge_request.target_branch)
+ end
+ end
+ end
+
+ context 'when source project is a forked project' do
+ let(:source_project) { fork_project(project, user, repository: true) }
+
+ before do
+ visit project_pipeline_path(source_project, pipeline)
+ end
+
+ it 'shows the pipeline information', :sidekiq_might_not_need_inline do
+ within '.pipeline-info' do
+ expect(page).to have_content("#{pipeline.statuses.count} jobs " \
+ "for !#{merge_request.iid} " \
+ "with #{merge_request.source_branch} " \
+ "into #{merge_request.target_branch}")
+ expect(page).to have_link("!#{merge_request.iid}",
+ href: project_merge_request_path(project, merge_request))
+ expect(page).to have_link(merge_request.source_branch,
+ href: project_commits_path(merge_request.source_project, merge_request.source_branch))
+ expect(page).to have_link(merge_request.target_branch,
+ href: project_commits_path(merge_request.target_project, merge_request.target_branch))
+ end
+ end
+ end
+ end
+ end
+
+ context 'when user does not have access to read jobs' do
+ before do
+ project.update!(public_builds: false)
+ end
+
+ describe 'GET /:project/-/pipelines/:id' do
+ include_context 'pipeline builds'
+
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id, user: user) }
+
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'shows the pipeline graph' do
+ expect(page).to have_selector('.js-pipeline-graph')
+ expect(page).to have_content('Build')
+ expect(page).to have_content('Test')
+ expect(page).to have_content('Deploy')
+ expect(page).to have_content('Retry')
+ expect(page).to have_content('Cancel running')
+ end
+
+ it 'does not link to job' do
+ expect(page).not_to have_selector('.js-pipeline-graph-job-link')
+ end
+ end
+ end
+
+ context 'when a bridge job exists' do
+ include_context 'pipeline builds'
+
+ let(:project) { create(:project, :repository) }
+ let(:downstream) { create(:project, :repository) }
+
+ let(:pipeline) do
+ create(:ci_pipeline, project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ let!(:bridge) do
+ create(:ci_bridge, pipeline: pipeline,
+ name: 'cross-build',
+ user: user,
+ downstream: downstream)
+ end
+
+ describe 'GET /:project/-/pipelines/:id' do
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'shows the pipeline with a bridge job' do
+ expect(page).to have_selector('.js-pipeline-graph')
+ expect(page).to have_content('cross-build')
+ end
+
+ context 'when a scheduled pipeline is created by a blocked user' do
+ let(:project) { create(:project, :repository) }
+
+ let(:schedule) do
+ create(:ci_pipeline_schedule,
+ project: project,
+ owner: project.first_owner,
+ description: 'blocked user schedule'
+ ).tap do |schedule|
+ schedule.update_column(:next_run_at, 1.minute.ago)
+ end
+ end
+
+ before do
+ schedule.owner.block!
+
+ begin
+ PipelineScheduleWorker.new.perform
+ rescue Ci::CreatePipelineService::CreateError
+ # Do nothing, assert view code after the Pipeline failed to create.
+ end
+ end
+
+ it 'displays the PipelineSchedule in an inactive state' do
+ visit project_pipeline_schedules_path(project)
+ page.click_link('Inactive')
+
+ expect(page).to have_selector('table.ci-table > tbody > tr > td', text: 'blocked user schedule')
+ end
+
+ it 'does not create a new Pipeline' do
+ visit project_pipelines_path(project)
+
+ expect(page).not_to have_selector('.ci-table')
+ expect(schedule.last_pipeline).to be_nil
+ end
+ end
+ end
+
+ describe 'GET /:project/-/pipelines/:id/builds' do
+ before do
+ visit builds_project_pipeline_path(project, pipeline)
+ end
+
+ it 'shows a bridge job on a list' do
+ expect(page).to have_content('cross-build')
+ expect(page).to have_content(bridge.id)
+ end
+ end
+ end
+
+ context 'when build requires resource', :sidekiq_inline do
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+ let(:resource_group) { create(:ci_resource_group, project: project) }
+
+ let!(:test_job) do
+ create(:ci_build, :pending, stage: 'test', name: 'test',
+ stage_idx: 1, pipeline: pipeline, project: project)
+ end
+
+ let!(:deploy_job) do
+ create(:ci_build, :created, stage: 'deploy', name: 'deploy',
+ stage_idx: 2, pipeline: pipeline, project: project, resource_group: resource_group)
+ end
+
+ describe 'GET /:project/-/pipelines/:id' do
+ subject { visit project_pipeline_path(project, pipeline) }
+
+ it 'shows deploy job as created' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('pending')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[0]) do
+ expect(page).to have_content('test')
+ expect(page).to have_css('.ci-status-icon-pending')
+ end
+
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-created')
+ end
+ end
+ end
+
+ context 'when test job succeeded' do
+ before do
+ test_job.success!
+ end
+
+ it 'shows deploy job as pending' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('running')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[0]) do
+ expect(page).to have_content('test')
+ expect(page).to have_css('.ci-status-icon-success')
+ end
+
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-pending')
+ end
+ end
+ end
+ end
+
+ context 'when test job succeeded but there are no available resources' do
+ let(:another_job) { create(:ci_build, :running, project: project, resource_group: resource_group) }
+
+ before do
+ resource_group.assign_resource_to(another_job)
+ test_job.success!
+ end
+
+ it 'shows deploy job as waiting for resource' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('waiting')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-waiting-for-resource')
+ end
+ end
+ end
+
+ context 'when resource is released from another job' do
+ before do
+ another_job.success!
+ end
+
+ it 'shows deploy job as pending' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('running')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-pending')
+ end
+ end
+ end
+ end
+
+ context 'when deploy job is a bridge to trigger a downstream pipeline' do
+ let!(:deploy_job) do
+ create(:ci_bridge, :created, stage: 'deploy', name: 'deploy',
+ stage_idx: 2, pipeline: pipeline, project: project, resource_group: resource_group)
+ end
+
+ it 'shows deploy job as waiting for resource' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('waiting')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-waiting-for-resource')
+ end
+ end
+ end
+ end
+
+ context 'when deploy job is a bridge to trigger a downstream pipeline' do
+ let!(:deploy_job) do
+ create(:ci_bridge, :created, stage: 'deploy', name: 'deploy',
+ stage_idx: 2, pipeline: pipeline, project: project, resource_group: resource_group)
+ end
+
+ it 'shows deploy job as waiting for resource' do
+ subject
+
+ within('.js-pipeline-header-container') do
+ expect(page).to have_content('waiting')
+ end
+
+ within('.js-pipeline-graph') do
+ within(all('[data-testid="stage-column"]')[1]) do
+ expect(page).to have_content('deploy')
+ expect(page).to have_css('.ci-status-icon-waiting-for-resource')
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+ describe 'GET /:project/-/pipelines/:id/dag' do
+ include_context 'pipeline builds'
+
+ let_it_be(:project) { create(:project, :repository) }
+
+ let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
+
+ before do
+ visit dag_project_pipeline_path(project, pipeline)
+ end
+
+ it 'shows DAG tab pane as active' do
+ expect(page).to have_css('#js-tab-dag.active', visible: false)
+ end
+
+ context 'page tabs' do
+ it 'shows Pipeline, Jobs and DAG tabs with link' do
+ expect(page).to have_link('Pipeline')
+ expect(page).to have_link('Jobs')
+ expect(page).to have_link('DAG')
+ end
+
+ it 'shows counter in Jobs tab' do
+ expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
+ end
+
+ it 'shows DAG tab as active' do
+ expect(page).to have_css('li.js-dag-tab-link .active')
+ end
+ end
+ end
+
+ context 'when user sees pipeline flags in a pipeline detail page' do
+ let_it_be(:project) { create(:project, :repository) }
+
+ context 'when pipeline is latest' do
+ include_context 'pipeline builds'
+
+ let(:pipeline) do
+ create(:ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'contains badge that indicates it is the latest build' do
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_content 'latest'
+ end
+ end
+ end
+
+ context 'when pipeline has configuration errors' do
+ let(:pipeline) do
+ create(:ci_pipeline,
+ :invalid,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'contains badge that indicates errors' do
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_content 'yaml invalid'
+ end
+ end
+
+ it 'contains badge with tooltip which contains error' do
+ expect(pipeline).to have_yaml_errors
+
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_selector(
+ %Q{span[title="#{pipeline.yaml_errors}"]})
+ end
+ end
+
+ it 'contains badge that indicates failure reason' do
+ expect(page).to have_content 'error'
+ end
+
+ it 'contains badge with tooltip which contains failure reason' do
+ expect(pipeline.failure_reason?).to eq true
+
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_selector(
+ %Q{span[title="#{pipeline.present.failure_reason}"]})
+ end
+ end
+
+ it 'contains a pipeline header with title' do
+ expect(page).to have_content "Pipeline ##{pipeline.id}"
+ end
+ end
+
+ context 'when pipeline is stuck' do
+ include_context 'pipeline builds'
+
+ let(:pipeline) do
+ create(:ci_pipeline,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ create(:ci_build, :pending, pipeline: pipeline)
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'contains badge that indicates being stuck' do
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_content 'stuck'
+ end
+ end
+ end
+
+ context 'when pipeline uses auto devops' do
+ include_context 'pipeline builds'
+
+ let(:project) { create(:project, :repository, auto_devops_attributes: { enabled: true }) }
+ let(:pipeline) do
+ create(:ci_pipeline,
+ :auto_devops_source,
+ project: project,
+ ref: 'master',
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'contains badge that indicates using auto devops' do
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_content 'Auto DevOps'
+ end
+ end
+ end
+
+ context 'when pipeline runs in a merge request context' do
+ include_context 'pipeline builds'
+
+ let(:pipeline) do
+ create(:ci_pipeline,
+ source: :merge_request_event,
+ project: merge_request.source_project,
+ ref: 'feature',
+ sha: merge_request.diff_head_sha,
+ user: user,
+ merge_request: merge_request)
+ end
+
+ let(:merge_request) do
+ create(:merge_request,
+ source_project: project,
+ source_branch: 'feature',
+ target_project: project,
+ target_branch: 'master')
+ end
+
+ before do
+ visit project_pipeline_path(project, pipeline)
+ end
+
+ it 'contains badge that indicates detached merge request pipeline' do
+ page.within(all('.well-segment')[1]) do
+ expect(page).to have_content 'merge request'
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/pipelines/legacy_pipelines_spec.rb b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
new file mode 100644
index 00000000000..3f89e344c51
--- /dev/null
+++ b/spec/features/projects/pipelines/legacy_pipelines_spec.rb
@@ -0,0 +1,847 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Pipelines', :js do
+ include ProjectForksHelper
+ include Spec::Support::Helpers::ModalHelpers
+
+ let(:project) { create(:project) }
+ let(:expected_detached_mr_tag) {'merge request'}
+
+ context 'when user is logged in' do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+
+ project.add_developer(user)
+ project.update!(auto_devops_attributes: { enabled: false })
+
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
+ describe 'GET /:project/-/pipelines' do
+ let(:project) { create(:project, :repository) }
+
+ let!(:pipeline) do
+ create(
+ :ci_empty_pipeline,
+ project: project,
+ ref: 'master',
+ status: 'running',
+ sha: project.commit.id
+ )
+ end
+
+ context 'scope' do
+ before do
+ create(:ci_empty_pipeline, status: 'pending', project: project, sha: project.commit.id, ref: 'master')
+ create(:ci_empty_pipeline, status: 'running', project: project, sha: project.commit.id, ref: 'master')
+ create(:ci_empty_pipeline, status: 'created', project: project, sha: project.commit.id, ref: 'master')
+ create(:ci_empty_pipeline, status: 'success', project: project, sha: project.commit.id, ref: 'master')
+ end
+
+ [:all, :running, :pending, :finished, :branches].each do |scope|
+ context "when displaying #{scope}" do
+ before do
+ visit_project_pipelines(scope: scope)
+ end
+
+ it 'contains pipeline commit short SHA' do
+ expect(page).to have_content(pipeline.short_sha)
+ end
+
+ it 'contains branch name' do
+ expect(page).to have_content(pipeline.ref)
+ end
+ end
+ end
+ end
+
+ context 'header tabs' do
+ before do
+ visit project_pipelines_path(project)
+ wait_for_requests
+ end
+
+ it 'shows a tab for All pipelines and count' do
+ expect(page.find('.js-pipelines-tab-all').text).to include('All')
+ expect(page.find('.js-pipelines-tab-all .badge').text).to include('1')
+ end
+
+ it 'shows a tab for Finished pipelines and count' do
+ expect(page.find('.js-pipelines-tab-finished').text).to include('Finished')
+ end
+
+ it 'shows a tab for Branches' do
+ expect(page.find('.js-pipelines-tab-branches').text).to include('Branches')
+ end
+
+ it 'shows a tab for Tags' do
+ expect(page.find('.js-pipelines-tab-tags').text).to include('Tags')
+ end
+
+ it 'updates content when tab is clicked' do
+ page.find('.js-pipelines-tab-finished').click
+ wait_for_requests
+ expect(page).to have_content('There are currently no finished pipelines.')
+ end
+ end
+
+ context 'navigation links' do
+ before do
+ visit project_pipelines_path(project)
+ wait_for_requests
+ end
+
+ it 'renders "CI lint" link' do
+ expect(page).to have_link('CI lint')
+ end
+
+ it 'renders "Run pipeline" link' do
+ expect(page).to have_link('Run pipeline')
+ end
+ end
+
+ context 'when pipeline is cancelable' do
+ let!(:build) do
+ create(:ci_build, pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ build.run
+ visit_project_pipelines
+ end
+
+ it 'indicates that pipeline can be canceled' do
+ expect(page).to have_selector('.js-pipelines-cancel-button')
+ expect(page).to have_selector('.ci-running')
+ end
+
+ context 'when canceling' do
+ before do
+ find('.js-pipelines-cancel-button').click
+ click_button 'Stop pipeline'
+ wait_for_requests
+ end
+
+ it 'indicated that pipelines was canceled', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_selector('.js-pipelines-cancel-button')
+ expect(page).to have_selector('.ci-canceled')
+ end
+ end
+ end
+
+ context 'when pipeline is retryable', :sidekiq_might_not_need_inline do
+ let!(:build) do
+ create(:ci_build, pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ build.drop
+ visit_project_pipelines
+ end
+
+ it 'indicates that pipeline can be retried' do
+ expect(page).to have_selector('.js-pipelines-retry-button')
+ expect(page).to have_selector('.ci-failed')
+ end
+
+ context 'when retrying' do
+ before do
+ find('.js-pipelines-retry-button').click
+ wait_for_requests
+ end
+
+ it 'shows running pipeline that is not retryable' do
+ expect(page).not_to have_selector('.js-pipelines-retry-button')
+ expect(page).to have_selector('.ci-running')
+ end
+ end
+ end
+
+ context 'when pipeline is detached merge request pipeline' do
+ let(:merge_request) do
+ create(:merge_request,
+ :with_detached_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project)
+ end
+
+ let!(:pipeline) { merge_request.all_pipelines.first }
+ let(:source_project) { project }
+ let(:target_project) { project }
+
+ before do
+ visit project_pipelines_path(source_project)
+ end
+
+ shared_examples_for 'detached merge request pipeline' do
+ it 'shows pipeline information without pipeline ref', :sidekiq_might_not_need_inline do
+ within '.pipeline-tags' do
+ expect(page).to have_content(expected_detached_mr_tag)
+
+ expect(page).to have_link(merge_request.iid,
+ href: project_merge_request_path(project, merge_request))
+
+ expect(page).not_to have_link(pipeline.ref)
+ end
+ end
+ end
+
+ it_behaves_like 'detached merge request pipeline'
+
+ context 'when source project is a forked project' do
+ let(:source_project) { fork_project(project, user, repository: true) }
+
+ it_behaves_like 'detached merge request pipeline'
+ end
+ end
+
+ context 'when pipeline is merge request pipeline' do
+ let(:merge_request) do
+ create(:merge_request,
+ :with_merge_request_pipeline,
+ source_project: source_project,
+ target_project: target_project,
+ merge_sha: target_project.commit.sha)
+ end
+
+ let!(:pipeline) { merge_request.all_pipelines.first }
+ let(:source_project) { project }
+ let(:target_project) { project }
+
+ before do
+ visit project_pipelines_path(source_project)
+ end
+
+ shared_examples_for 'Correct merge request pipeline information' do
+ it 'does not show detached tag for the pipeline, and shows the link of the merge request' \
+ 'and does not show the ref of the pipeline', :sidekiq_might_not_need_inline do
+ within '.pipeline-tags' do
+ expect(page).not_to have_content(expected_detached_mr_tag)
+
+ expect(page).to have_link(merge_request.iid,
+ href: project_merge_request_path(project, merge_request))
+
+ expect(page).not_to have_link(pipeline.ref)
+ end
+ end
+ end
+
+ it_behaves_like 'Correct merge request pipeline information'
+
+ context 'when source project is a forked project' do
+ let(:source_project) { fork_project(project, user, repository: true) }
+
+ it_behaves_like 'Correct merge request pipeline information'
+ end
+ end
+
+ context 'when pipeline has configuration errors' do
+ let(:pipeline) do
+ create(:ci_pipeline, :invalid, project: project)
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'contains badge that indicates errors' do
+ expect(page).to have_content 'yaml invalid'
+ end
+
+ it 'contains badge with tooltip which contains error' do
+ expect(pipeline).to have_yaml_errors
+ expect(page).to have_selector(
+ %Q{span[title="#{pipeline.yaml_errors}"]})
+ end
+
+ it 'contains badge that indicates failure reason' do
+ expect(page).to have_content 'error'
+ end
+
+ it 'contains badge with tooltip which contains failure reason' do
+ expect(pipeline.failure_reason?).to eq true
+ expect(page).to have_selector(
+ %Q{span[title="#{pipeline.present.failure_reason}"]})
+ end
+ end
+
+ context 'with manual actions' do
+ let!(:manual) do
+ create(:ci_build, :manual,
+ pipeline: pipeline,
+ name: 'manual build',
+ stage: 'test')
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'has a dropdown with play button' do
+ expect(page).to have_selector('[data-testid="pipelines-manual-actions-dropdown"] [data-testid="play-icon"]')
+ end
+
+ it 'has link to the manual action' do
+ find('[data-testid="pipelines-manual-actions-dropdown"]').click
+
+ expect(page).to have_button('manual build')
+ end
+
+ context 'when manual action was played' do
+ before do
+ find('[data-testid="pipelines-manual-actions-dropdown"]').click
+ click_button('manual build')
+ end
+
+ it 'enqueues manual action job' do
+ expect(page).to have_selector(
+ '[data-testid="pipelines-manual-actions-dropdown"] .gl-dropdown-toggle:disabled'
+ )
+ end
+ end
+ end
+
+ context 'when there is a delayed job' do
+ let!(:delayed_job) do
+ create(:ci_build, :scheduled,
+ pipeline: pipeline,
+ name: 'delayed job 1',
+ stage: 'test')
+ end
+
+ before do
+ stub_feature_flags(bootstrap_confirmation_modals: false)
+ visit_project_pipelines
+ end
+
+ it 'has a dropdown for actionable jobs' do
+ expect(page).to have_selector('[data-testid="pipelines-manual-actions-dropdown"] [data-testid="play-icon"]')
+ end
+
+ it "has link to the delayed job's action" do
+ find('[data-testid="pipelines-manual-actions-dropdown"]').click
+
+ time_diff = [0, delayed_job.scheduled_at - Time.zone.now].max
+ expect(page).to have_button('delayed job 1')
+ expect(page).to have_content(Time.at(time_diff).utc.strftime("%H:%M:%S"))
+ end
+
+ context 'when delayed job is expired already' do
+ let!(:delayed_job) do
+ create(:ci_build, :expired_scheduled,
+ pipeline: pipeline,
+ name: 'delayed job 1',
+ stage: 'test')
+ end
+
+ it "shows 00:00:00 as the remaining time" do
+ find('[data-testid="pipelines-manual-actions-dropdown"]').click
+
+ expect(page).to have_content("00:00:00")
+ end
+ end
+
+ context 'when user played a delayed job immediately' do
+ before do
+ find('[data-testid="pipelines-manual-actions-dropdown"]').click
+ accept_gl_confirm do
+ click_button 'delayed job 1'
+ end
+ wait_for_requests
+ end
+
+ it 'enqueues the delayed job', :js do
+ expect(delayed_job.reload).to be_pending
+ end
+ end
+ end
+
+ context 'for generic statuses' do
+ context 'when preparing' do
+ let!(:pipeline) do
+ create(:ci_empty_pipeline,
+ status: 'preparing', project: project)
+ end
+
+ let!(:status) do
+ create(:generic_commit_status,
+ :preparing, pipeline: pipeline)
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'is cancelable' do
+ expect(page).to have_selector('.js-pipelines-cancel-button')
+ end
+
+ it 'shows the pipeline as preparing' do
+ expect(page).to have_selector('.ci-preparing')
+ end
+ end
+
+ context 'when running' do
+ let!(:running) do
+ create(:generic_commit_status,
+ status: 'running',
+ pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'is cancelable' do
+ expect(page).to have_selector('.js-pipelines-cancel-button')
+ end
+
+ it 'has pipeline running' do
+ expect(page).to have_selector('.ci-running')
+ end
+
+ context 'when canceling' do
+ before do
+ find('.js-pipelines-cancel-button').click
+ click_button 'Stop pipeline'
+ end
+
+ it 'indicates that pipeline was canceled', :sidekiq_might_not_need_inline do
+ expect(page).not_to have_selector('.js-pipelines-cancel-button')
+ expect(page).to have_selector('.ci-canceled')
+ end
+ end
+ end
+
+ context 'when failed' do
+ let!(:status) do
+ create(:generic_commit_status, :pending,
+ pipeline: pipeline,
+ stage: 'test')
+ end
+
+ before do
+ status.drop
+ visit_project_pipelines
+ end
+
+ it 'is not retryable' do
+ expect(page).not_to have_selector('.js-pipelines-retry-button')
+ end
+
+ it 'has failed pipeline', :sidekiq_might_not_need_inline do
+ expect(page).to have_selector('.ci-failed')
+ end
+ end
+ end
+
+ context 'downloadable pipelines' do
+ context 'with artifacts' do
+ let!(:with_artifacts) do
+ build = create(:ci_build, :success,
+ pipeline: pipeline,
+ name: 'rspec tests',
+ stage: 'test')
+
+ create(:ci_job_artifact, :codequality, job: build)
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'has artifacts dropdown' do
+ expect(page).to have_selector('[data-testid="pipeline-multi-actions-dropdown"]')
+ end
+ end
+
+ context 'with artifacts expired' do
+ let!(:with_artifacts_expired) do
+ create(:ci_build, :expired, :success,
+ pipeline: pipeline,
+ name: 'rspec',
+ stage: 'test')
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it { expect(page).not_to have_selector('[data-testid="artifact-item"]') }
+ end
+
+ context 'without artifacts' do
+ let!(:without_artifacts) do
+ create(:ci_build, :success,
+ pipeline: pipeline,
+ name: 'rspec',
+ stage: 'test')
+ end
+
+ before do
+ visit_project_pipelines
+ end
+
+ it { expect(page).not_to have_selector('[data-testid="artifact-item"]') }
+ end
+
+ context 'with trace artifact' do
+ before do
+ create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
+
+ visit_project_pipelines
+ end
+
+ it 'does not show trace artifact as artifacts' do
+ expect(page).not_to have_selector('[data-testid="artifact-item"]')
+ end
+ end
+ end
+
+ context 'mini pipeline graph' do
+ let!(:build) do
+ create(:ci_build, :pending, pipeline: pipeline,
+ stage: 'build',
+ name: 'build')
+ end
+
+ dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
+
+ before do
+ visit_project_pipelines
+ end
+
+ it 'renders a mini pipeline graph' do
+ expect(page).to have_selector('[data-testid="pipeline-mini-graph"]')
+ expect(page).to have_selector(dropdown_selector)
+ end
+
+ context 'when clicking a stage badge' do
+ it 'opens a dropdown' do
+ find(dropdown_selector).click
+
+ expect(page).to have_link build.name
+ end
+
+ it 'is possible to cancel pending build' do
+ find(dropdown_selector).click
+ find('.js-ci-action').click
+ wait_for_requests
+
+ expect(build.reload).to be_canceled
+ end
+ end
+
+ context 'for a failed pipeline' do
+ let!(:build) do
+ create(:ci_build, :failed, pipeline: pipeline,
+ stage: 'build',
+ name: 'build')
+ end
+
+ it 'displays the failure reason' do
+ find(dropdown_selector).click
+
+ within('.js-builds-dropdown-list') do
+ build_element = page.find('.mini-pipeline-graph-dropdown-item')
+ expect(build_element['title']).to eq('build - failed - (unknown failure)')
+ end
+ end
+ end
+ end
+
+ context 'with pagination' do
+ before do
+ allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
+ create(:ci_empty_pipeline, project: project)
+ end
+
+ it 'renders pagination' do
+ visit project_pipelines_path(project)
+ wait_for_requests
+
+ expect(page).to have_selector('.gl-pagination')
+ end
+
+ it 'renders second page of pipelines' do
+ visit project_pipelines_path(project, page: '2')
+ wait_for_requests
+
+ expect(page).to have_selector('.gl-pagination .page-link', count: 4)
+ end
+
+ it 'shows updated content' do
+ visit project_pipelines_path(project)
+ wait_for_requests
+ page.find('.page-link.next-page-item').click
+
+ expect(page).to have_selector('.gl-pagination .page-link', count: 4)
+ end
+ end
+
+ context 'with pipeline key selection' do
+ before do
+ visit project_pipelines_path(project)
+ wait_for_requests
+ end
+
+ it 'changes the Pipeline ID column for Pipeline IID' do
+ page.find('[data-testid="pipeline-key-dropdown"]').click
+
+ within '.gl-new-dropdown-contents' do
+ dropdown_options = page.find_all '.gl-new-dropdown-item'
+
+ dropdown_options[1].click
+ end
+
+ expect(page.find('[data-testid="pipeline-th"]')).to have_content 'Pipeline'
+ expect(page.find('[data-testid="pipeline-url-link"]')).to have_content "##{pipeline.iid}"
+ end
+ end
+ end
+
+ describe 'GET /:project/-/pipelines/show' do
+ let(:project) { create(:project, :repository) }
+
+ let(:pipeline) do
+ create(:ci_empty_pipeline,
+ project: project,
+ sha: project.commit.id,
+ user: user)
+ end
+
+ before do
+ create_build('build', 0, 'build', :success)
+ create_build('test', 1, 'rspec 0:2', :pending)
+ create_build('test', 1, 'rspec 1:2', :running)
+ create_build('test', 1, 'spinach 0:2', :created)
+ create_build('test', 1, 'spinach 1:2', :created)
+ create_build('test', 1, 'audit', :created)
+ create_build('deploy', 2, 'production', :created)
+
+ create(
+ :generic_commit_status,
+ pipeline: pipeline,
+ stage: 'external',
+ name: 'jenkins',
+ stage_idx: 3,
+ ref: 'master'
+ )
+
+ visit project_pipeline_path(project, pipeline)
+ wait_for_requests
+ end
+
+ it 'shows a graph with grouped stages' do
+ expect(page).to have_css('.js-pipeline-graph')
+
+ # header
+ expect(page).to have_text("##{pipeline.id}")
+ expect(page).to have_selector(%Q(img[src="#{pipeline.user.avatar_url}"]))
+ expect(page).to have_link(pipeline.user.name, href: user_path(pipeline.user))
+
+ # stages
+ expect(page).to have_text('Build')
+ expect(page).to have_text('Test')
+ expect(page).to have_text('Deploy')
+ expect(page).to have_text('External')
+
+ # builds
+ expect(page).to have_text('rspec')
+ expect(page).to have_text('spinach')
+ expect(page).to have_text('rspec')
+ expect(page).to have_text('production')
+ expect(page).to have_text('jenkins')
+ end
+
+ def create_build(stage, stage_idx, name, status)
+ create(:ci_build, pipeline: pipeline, stage: stage, stage_idx: stage_idx, name: name, status: status)
+ end
+ end
+
+ describe 'POST /:project/-/pipelines' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ visit new_project_pipeline_path(project)
+ end
+
+ context 'for valid commit', :js do
+ before do
+ click_button project.default_branch
+ wait_for_requests
+
+ find('p', text: 'master').click
+ wait_for_requests
+ end
+
+ context 'with gitlab-ci.yml', :js do
+ before do
+ stub_ci_pipeline_to_return_yaml_file
+ end
+
+ it 'creates a new pipeline' do
+ expect do
+ click_on 'Run pipeline'
+ wait_for_requests
+ end
+ .to change { Ci::Pipeline.count }.by(1)
+
+ expect(Ci::Pipeline.last).to be_web
+ end
+
+ context 'when variables are specified' do
+ it 'creates a new pipeline with variables' do
+ page.within(find("[data-testid='ci-variable-row']")) do
+ find("[data-testid='pipeline-form-ci-variable-key']").set('key_name')
+ find("[data-testid='pipeline-form-ci-variable-value']").set('value')
+ end
+
+ expect do
+ click_on 'Run pipeline'
+ wait_for_requests
+ end
+ .to change { Ci::Pipeline.count }.by(1)
+
+ expect(Ci::Pipeline.last.variables.map { |var| var.slice(:key, :secret_value) })
+ .to eq [{ key: "key_name", secret_value: "value" }.with_indifferent_access]
+ end
+ end
+ end
+
+ context 'without gitlab-ci.yml' do
+ before do
+ click_on 'Run pipeline'
+ wait_for_requests
+ end
+
+ it { expect(page).to have_content('Missing CI config file') }
+ it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file' \
+ 'is available when trying again' do
+ stub_ci_pipeline_to_return_yaml_file
+
+ expect do
+ click_on 'Run pipeline'
+ wait_for_requests
+ end
+ .to change { Ci::Pipeline.count }.by(1)
+ end
+ end
+ end
+ end
+
+ describe 'Reset runner caches' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ create(:ci_empty_pipeline, status: 'success', project: project, sha: project.commit.id, ref: 'master')
+ project.add_maintainer(user)
+ visit project_pipelines_path(project)
+ end
+
+ it 'has a clear caches button' do
+ expect(page).to have_button 'Clear runner caches'
+ end
+
+ describe 'user clicks the button' do
+ context 'when project already has jobs_cache_index' do
+ before do
+ project.update!(jobs_cache_index: 1)
+ end
+
+ it 'increments jobs_cache_index' do
+ click_button 'Clear runner caches'
+ wait_for_requests
+ expect(page.find('[data-testid="alert-info"]')).to have_content 'Project cache successfully reset.'
+ end
+ end
+
+ context 'when project does not have jobs_cache_index' do
+ it 'sets jobs_cache_index to 1' do
+ click_button 'Clear runner caches'
+ wait_for_requests
+ expect(page.find('[data-testid="alert-info"]')).to have_content 'Project cache successfully reset.'
+ end
+ end
+ end
+ end
+
+ describe 'Run Pipelines' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ visit new_project_pipeline_path(project)
+ end
+
+ describe 'new pipeline page' do
+ it 'has field to add a new pipeline' do
+ expect(page).to have_selector('[data-testid="ref-select"]')
+ expect(find('[data-testid="ref-select"]')).to have_content project.default_branch
+ expect(page).to have_content('Run for')
+ end
+ end
+
+ describe 'find pipelines' do
+ it 'shows filtered pipelines', :js do
+ click_button project.default_branch
+
+ page.within '[data-testid="ref-select"]' do
+ find('[data-testid="search-refs"]').native.send_keys('fix')
+
+ page.within '.gl-new-dropdown-contents' do
+ expect(page).to have_content('fix')
+ end
+ end
+ end
+ end
+ end
+
+ describe 'Empty State' do
+ let(:project) { create(:project, :repository) }
+
+ before do
+ visit project_pipelines_path(project)
+ end
+
+ it 'renders empty state' do
+ expect(page).to have_content 'Try test template'
+ end
+ end
+ end
+
+ context 'when user is not logged in' do
+ before do
+ project.update!(auto_devops_attributes: { enabled: false })
+ visit project_pipelines_path(project)
+ end
+
+ context 'when project is public' do
+ let(:project) { create(:project, :public, :repository) }
+
+ context 'without pipelines' do
+ it { expect(page).to have_content 'This project is not currently set up to run pipelines.' }
+ end
+ end
+
+ context 'when project is private' do
+ let(:project) { create(:project, :private, :repository) }
+
+ it 'redirects the user to sign_in and displays the flash alert' do
+ expect(page).to have_content 'You need to sign in'
+ expect(page).to have_current_path("/users/sign_in")
+ end
+ end
+ end
+
+ def visit_project_pipelines(**query)
+ visit project_pipelines_path(project, query)
+ wait_for_requests
+ end
+end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index 219c8ec0070..9eda05f695d 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -15,7 +15,6 @@ RSpec.describe 'Pipeline', :js do
before do
sign_in(user)
project.add_role(user, role)
- stub_feature_flags(pipeline_tabs_vue: false)
end
shared_context 'pipeline builds' do
@@ -80,12 +79,6 @@ RSpec.describe 'Pipeline', :js do
expect(page).to have_content('Cancel running')
end
- it 'shows Pipeline tab pane as active' do
- visit_pipeline
-
- expect(page).to have_css('#js-tab-pipeline.active')
- end
-
it 'shows link to the pipeline ref' do
visit_pipeline
@@ -190,11 +183,11 @@ RSpec.describe 'Pipeline', :js do
end
describe 'pipeline graph' do
- before do
- visit_pipeline
- end
-
context 'when pipeline has running builds' do
+ before do
+ visit_pipeline
+ end
+
it 'shows a running icon and a cancel action for the running build' do
page.within('#ci-badge-deploy') do
expect(page).to have_selector('.js-ci-status-icon-running')
@@ -213,6 +206,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has preparing builds' do
+ before do
+ visit_pipeline
+ end
+
it 'shows a preparing icon and a cancel action' do
page.within('#ci-badge-prepare') do
expect(page).to have_selector('.js-ci-status-icon-preparing')
@@ -231,6 +228,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has successful builds' do
+ before do
+ visit_pipeline
+ end
+
it 'shows the success icon and a retry action for the successful build' do
page.within('#ci-badge-build') do
expect(page).to have_selector('.js-ci-status-icon-success')
@@ -254,6 +255,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has a delayed job' do
+ before do
+ visit_pipeline
+ end
+
let(:project) { create(:project, :repository, group: group) }
it 'shows the scheduled icon and an unschedule action for the delayed job' do
@@ -277,6 +282,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has failed builds' do
+ before do
+ visit_pipeline
+ end
+
it 'shows the failed icon and a retry action for the failed build' do
page.within('#ci-badge-test') do
expect(page).to have_selector('.js-ci-status-icon-failed')
@@ -307,6 +316,10 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has manual jobs' do
+ before do
+ visit_pipeline
+ end
+
it 'shows the skipped icon and a play action for the manual build' do
page.within('#ci-badge-manual-build') do
expect(page).to have_selector('.js-ci-status-icon-manual')
@@ -330,12 +343,139 @@ RSpec.describe 'Pipeline', :js do
end
context 'when pipeline has external job' do
+ before do
+ visit_pipeline
+ end
+
it 'shows the success icon and the generic comit status build' do
expect(page).to have_selector('.js-ci-status-icon-success')
expect(page).to have_content('jenkins')
expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
end
end
+
+ context 'when pipeline has a downstream pipeline' do
+ let(:downstream_project) { create(:project, :repository, group: group) }
+ let(:downstream_pipeline) do
+ create(:ci_pipeline,
+ status,
+ user: user,
+ project: downstream_project,
+ ref: 'master',
+ sha: downstream_project.commit.id,
+ child_of: pipeline )
+ end
+
+ let!(:build) { create(:ci_build, status, pipeline: downstream_pipeline, user: user) }
+
+ before do
+ downstream_pipeline.project.add_developer(user)
+ end
+
+ context 'and user has permission' do
+ before do
+ visit_pipeline
+ end
+
+ context 'with a successful downstream' do
+ let(:status) { :success }
+
+ it 'does not show the cancel or retry action' do
+ expect(page).to have_selector('.ci-status-icon-success')
+ expect(page).not_to have_selector('button[aria-label="Retry downstream pipeline"]')
+ expect(page).not_to have_selector('button[aria-label="Cancel downstream pipeline"]')
+ end
+ end
+
+ context 'with a running downstream' do
+ let(:status) { :running }
+
+ it 'shows the cancel action' do
+ expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]')
+ end
+
+ context 'when canceling' do
+ before do
+ find('button[aria-label="Cancel downstream pipeline"]').click
+ wait_for_requests
+ end
+
+ it 'shows the pipeline as canceled with the retry action' do
+ expect(page).to have_selector('button[aria-label="Retry downstream pipeline"]')
+ expect(page).to have_selector('.ci-status-icon-canceled')
+ end
+ end
+ end
+
+ context 'with a failed downstream' do
+ let(:status) { :failed }
+
+ it 'indicates that pipeline can be retried' do
+ expect(page).to have_selector('button[aria-label="Retry downstream pipeline"]')
+ end
+
+ context 'and the FF downstream_retry_action is disabled' do
+ before do
+ stub_feature_flags(downstream_retry_action: false)
+ end
+
+ it 'does not show the retry action' do
+ expect(page).not_to have_selector('button[aria-label="Retry downstream pipeline"]')
+ end
+ end
+
+ context 'when retrying' do
+ before do
+ find('button[aria-label="Retry downstream pipeline"]').click
+ wait_for_requests
+ end
+
+ it 'shows running pipeline with the cancel action' do
+ expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]')
+ end
+ end
+ end
+
+ context 'with a canceled downstream' do
+ let(:status) { :canceled }
+
+ it 'indicates that pipeline can be retried' do
+ expect(page).to have_selector('button[aria-label="Retry downstream pipeline"]')
+ end
+
+ context 'when retrying' do
+ before do
+ find('button[aria-label="Retry downstream pipeline"]').click
+ wait_for_requests
+ end
+
+ it 'shows running pipeline with the cancel action' do
+ expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]')
+ end
+ end
+ end
+ end
+
+ context 'when user does not have permissions' do
+ let(:status) { :failed }
+
+ before do
+ new_user = create(:user)
+ project.add_role(new_user, :guest)
+ downstream_project.add_role(new_user, :guest)
+ sign_in(new_user)
+
+ visit_pipeline
+ end
+
+ it 'does not show the retry button' do
+ expect(page).to have_selector('.ci-status-icon-failed')
+ expect(page).not_to have_selector('button[aria-label="Retry downstream pipeline"]')
+ end
+ end
+ end
end
context 'when the pipeline has manual stage' do
@@ -357,7 +497,6 @@ RSpec.describe 'Pipeline', :js do
context 'page tabs' do
before do
- stub_feature_flags(pipeline_tabs_vue: false)
visit_pipeline
end
@@ -369,13 +508,10 @@ RSpec.describe 'Pipeline', :js do
end
it 'shows counter in Jobs tab' do
+ skip('Enable in jobs `pipeline_tabs_vue` MR')
expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
end
- it 'shows Pipeline tab as active' do
- expect(page).to have_css('.js-pipeline-tab-link .active')
- end
-
context 'without permission to access builds' do
let(:project) { create(:project, :public, :repository, public_builds: false) }
let(:role) { :guest }
@@ -753,6 +889,7 @@ RSpec.describe 'Pipeline', :js do
describe 'GET /:project/-/pipelines/:id/builds' do
before do
+ stub_feature_flags(pipeline_tabs_vue: false)
visit builds_project_pipeline_path(project, pipeline)
end
@@ -893,28 +1030,6 @@ RSpec.describe 'Pipeline', :js do
end
end
end
-
- context 'when deploy job is a bridge to trigger a downstream pipeline' do
- let!(:deploy_job) do
- create(:ci_bridge, :created, stage: 'deploy', name: 'deploy',
- stage_idx: 2, pipeline: pipeline, project: project, resource_group: resource_group)
- end
-
- it 'shows deploy job as waiting for resource' do
- subject
-
- within('.js-pipeline-header-container') do
- expect(page).to have_content('waiting')
- end
-
- within('.js-pipeline-graph') do
- within(all('[data-testid="stage-column"]')[1]) do
- expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-waiting-for-resource')
- end
- end
- end
- end
end
end
end
@@ -943,15 +1058,7 @@ RSpec.describe 'Pipeline', :js do
expect(page).to have_button('Play')
end
- it 'shows jobs tab pane as active' do
- expect(page).to have_css('#js-tab-builds.active')
- end
-
context 'page tabs' do
- before do
- stub_feature_flags(pipeline_tabs_vue: false)
- end
-
it 'shows Pipeline, Jobs and DAG tabs with link' do
expect(page).to have_link('Pipeline')
expect(page).to have_link('Jobs')
@@ -959,12 +1066,9 @@ RSpec.describe 'Pipeline', :js do
end
it 'shows counter in Jobs tab' do
+ skip('unskip when jobs tab is implemented with ff `pipeline_tabs_vue`')
expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
end
-
- it 'shows Jobs tab as active' do
- expect(page).to have_css('li.js-builds-tab-link .active')
- end
end
context 'retrying jobs' do
@@ -1022,14 +1126,14 @@ RSpec.describe 'Pipeline', :js do
end
describe 'GET /:project/-/pipelines/:id/failures' do
- before do
- stub_feature_flags(pipeline_tabs_vue: false)
- end
-
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: '1234') }
let(:pipeline_failures_page) { failures_project_pipeline_path(project, pipeline) }
let!(:failed_build) { create(:ci_build, :failed, pipeline: pipeline) }
+ before do
+ stub_feature_flags(pipeline_tabs_vue: false)
+ end
+
subject { visit pipeline_failures_page }
context 'with failed build' do
@@ -1037,13 +1141,6 @@ RSpec.describe 'Pipeline', :js do
failed_build.trace.set('4 examples, 1 failure')
end
- it 'shows jobs tab pane as active' do
- subject
-
- expect(page).to have_content('Failed Jobs')
- expect(page).to have_css('#js-tab-failures.active')
- end
-
it 'lists failed builds' do
subject
@@ -1063,12 +1160,43 @@ RSpec.describe 'Pipeline', :js do
expect(page).to have_content('There is an unknown failure, please try again')
end
+ context 'when failed_jobs_tab_vue feature flag is disabled' do
+ before do
+ stub_feature_flags(failed_jobs_tab_vue: false)
+ end
+
+ context 'when user does not have permission to retry build' do
+ it 'shows retry button for failed build' do
+ subject
+
+ page.within(find('.build-failures', match: :first)) do
+ expect(page).not_to have_link('Retry')
+ end
+ end
+ end
+
+ context 'when user does have permission to retry build' do
+ before do
+ create(:protected_branch, :developers_can_merge,
+ name: pipeline.ref, project: project)
+ end
+
+ it 'shows retry button for failed build' do
+ subject
+
+ page.within(find('.build-failures', match: :first)) do
+ expect(page).to have_link('Retry')
+ end
+ end
+ end
+ end
+
context 'when user does not have permission to retry build' do
it 'shows retry button for failed build' do
subject
- page.within(find('.build-failures', match: :first)) do
- expect(page).not_to have_link('Retry')
+ page.within(find('#js-tab-failures', match: :first)) do
+ expect(page).not_to have_button('Retry')
end
end
end
@@ -1082,21 +1210,14 @@ RSpec.describe 'Pipeline', :js do
it 'shows retry button for failed build' do
subject
- page.within(find('.build-failures', match: :first)) do
- expect(page).to have_link('Retry')
+ page.within(find('#js-tab-failures', match: :first)) do
+ expect(page).to have_button('Retry')
end
end
end
end
context 'when missing build logs' do
- it 'shows jobs tab pane as active' do
- subject
-
- expect(page).to have_content('Failed Jobs')
- expect(page).to have_css('#js-tab-failures.active')
- end
-
it 'lists failed builds' do
subject
@@ -1133,11 +1254,17 @@ RSpec.describe 'Pipeline', :js do
failed_build.update!(status: :success)
end
+ it 'does not show the failure tab' do
+ skip('unskip when the failure tab has been implemented in ff `pipeline_tabs_vue`')
+ subject
+
+ expect(page).not_to have_content('Failed Jobs')
+ end
+
it 'displays the pipeline graph' do
subject
expect(page).to have_current_path(pipeline_path(pipeline), ignore_query: true)
- expect(page).not_to have_content('Failed Jobs')
expect(page).to have_selector('.js-pipeline-graph')
end
end
@@ -1151,27 +1278,14 @@ RSpec.describe 'Pipeline', :js do
let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master', sha: project.commit.id) }
before do
- stub_feature_flags(pipeline_tabs_vue: false)
visit dag_project_pipeline_path(project, pipeline)
end
- it 'shows DAG tab pane as active' do
- expect(page).to have_css('#js-tab-dag.active', visible: false)
- end
-
context 'page tabs' do
it 'shows Pipeline, Jobs and DAG tabs with link' do
expect(page).to have_link('Pipeline')
expect(page).to have_link('Jobs')
- expect(page).to have_link('DAG')
- end
-
- it 'shows counter in Jobs tab' do
- expect(page.find('.js-builds-counter').text).to eq(pipeline.total_size.to_s)
- end
-
- it 'shows DAG tab as active' do
- expect(page).to have_css('li.js-dag-tab-link .active')
+ expect(page).to have_link('Needs')
end
end
end
diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb
index 8b1a22ae05a..a18bf7c5caf 100644
--- a/spec/features/projects/pipelines/pipelines_spec.rb
+++ b/spec/features/projects/pipelines/pipelines_spec.rb
@@ -623,7 +623,6 @@ RSpec.describe 'Pipelines', :js do
create(:generic_commit_status, pipeline: pipeline, stage: 'external', name: 'jenkins', stage_idx: 3, ref: 'master')
- stub_feature_flags(pipeline_tabs_vue: false)
visit project_pipeline_path(project, pipeline)
wait_for_requests
end
@@ -794,12 +793,29 @@ RSpec.describe 'Pipelines', :js do
describe 'Empty State' do
let(:project) { create(:project, :repository) }
- before do
- visit project_pipelines_path(project)
+ context 'when `ios_specific_templates` is not enabled' do
+ before do
+ visit project_pipelines_path(project)
+ end
+
+ it 'renders empty state' do
+ expect(page).to have_content 'Try test template'
+ end
end
- it 'renders empty state' do
- expect(page).to have_content 'Try test template'
+ describe 'when the `ios_specific_templates` experiment is enabled and the "Set up a runner" button is clicked' do
+ before do
+ stub_experiments(ios_specific_templates: :candidate)
+ create(:project_setting, project: project, target_platforms: %w(ios))
+ visit project_pipelines_path(project)
+ click_button 'Set up a runner'
+ end
+
+ it 'displays a modal with the macOS platform selected and an explanation popover' do
+ expect(page).to have_button 'macOS', class: 'selected'
+ expect(page).to have_selector('#runner-instructions-modal___BV_modal_content_')
+ expect(page).to have_selector('.popover')
+ end
end
end
end
diff --git a/spec/features/projects/serverless/functions_spec.rb b/spec/features/projects/serverless/functions_spec.rb
deleted file mode 100644
index db8c2a24f2f..00000000000
--- a/spec/features/projects/serverless/functions_spec.rb
+++ /dev/null
@@ -1,88 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Functions', :js do
- include KubernetesHelpers
- include ReactiveCachingHelpers
-
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
-
- before do
- project.add_maintainer(user)
- gitlab_sign_in(user)
- end
-
- shared_examples "it's missing knative installation" do
- before do
- functions_finder = Projects::Serverless::FunctionsFinder.new(project)
- visit project_serverless_functions_path(project)
- allow(Projects::Serverless::FunctionsFinder)
- .to receive(:new)
- .and_return(functions_finder)
- synchronous_reactive_cache(functions_finder)
- end
-
- it 'sees an empty state require Knative installation' do
- expect(page).to have_selector('.empty-state')
- end
- end
-
- context 'when user does not have a cluster and visits the serverless page' do
- it_behaves_like "it's missing knative installation"
- end
-
- context 'when the user does have a cluster and visits the serverless page' do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp) }
-
- it_behaves_like "it's missing knative installation"
- end
-
- context 'when the user has a cluster and knative installed and visits the serverless page', :kubeclient do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
- let(:service) { cluster.platform_kubernetes }
- let(:environment) { create(:environment, project: project) }
- let!(:deployment) { create(:deployment, :success, cluster: cluster, environment: environment) }
- let(:knative_services_finder) { environment.knative_services_finder }
- let(:namespace) do
- create(:cluster_kubernetes_namespace,
- cluster: cluster,
- project: cluster.cluster_project.project,
- environment: environment)
- end
-
- before do
- allow(Clusters::KnativeServicesFinder)
- .to receive(:new)
- .and_return(knative_services_finder)
- synchronous_reactive_cache(knative_services_finder)
- stub_kubeclient_knative_services(stub_get_services_options)
- stub_kubeclient_service_pods(nil, namespace: namespace.namespace)
- visit project_serverless_functions_path(project)
- end
-
- context 'when there are no functions' do
- let(:stub_get_services_options) do
- {
- namespace: namespace.namespace,
- response: kube_response({ "kind" => "ServiceList", "items" => [] })
- }
- end
-
- it 'sees an empty listing of serverless functions' do
- expect(page).to have_selector('.empty-state')
- expect(page).not_to have_selector('.content-list')
- end
- end
-
- context 'when there are functions' do
- let(:stub_get_services_options) { { namespace: namespace.namespace } }
-
- it 'does not see an empty listing of serverless functions' do
- expect(page).not_to have_selector('.empty-state')
- expect(page).to have_selector('.content-list')
- end
- end
- end
-end
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index 39c4315bf0f..a64f81430d1 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -25,24 +25,6 @@ RSpec.describe "Projects > Settings > Pipelines settings" do
context 'for maintainer' do
let(:role) { :maintainer }
- it 'be allowed to change' do
- visit project_settings_ci_cd_path(project)
-
- fill_in('Test coverage parsing', with: 'coverage_regex')
-
- page.within '#js-general-pipeline-settings' do
- click_on 'Save changes'
- end
-
- expect(page.status_code).to eq(200)
-
- page.within '#js-general-pipeline-settings' do
- expect(page).to have_button('Save changes', disabled: false)
- end
-
- expect(page).to have_field('Test coverage parsing', with: 'coverage_regex')
- end
-
it 'updates auto_cancel_pending_pipelines' do
visit project_settings_ci_cd_path(project)
diff --git a/spec/features/projects/settings/secure_files_settings_spec.rb b/spec/features/projects/settings/secure_files_settings_spec.rb
new file mode 100644
index 00000000000..c7c9cafc420
--- /dev/null
+++ b/spec/features/projects/settings/secure_files_settings_spec.rb
@@ -0,0 +1,46 @@
+# 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/user_manages_merge_requests_settings_spec.rb b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
index 77be351f3d8..6aa59f72d2a 100644
--- a/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
+++ b/spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb
@@ -50,7 +50,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
context 'when Pipelines are initially enabled' do
it 'shows the Merge Requests settings' do
expect(page).to have_content 'Pipelines must succeed'
- expect(page).to have_content 'All discussions must be resolved'
+ expect(page).to have_content 'All threads must be resolved'
within('.sharing-permissions-form') do
find('.project-feature-controls[data-for="project[project_feature_attributes][merge_requests_access_level]"] .gl-toggle').click
@@ -58,7 +58,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
end
expect(page).not_to have_content 'Pipelines must succeed'
- expect(page).not_to have_content 'All discussions must be resolved'
+ expect(page).not_to have_content 'All threads must be resolved'
end
end
@@ -70,7 +70,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
it 'shows the Merge Requests settings that do not depend on Builds feature' do
expect(page).to have_content 'Pipelines must succeed'
- expect(page).to have_content 'All discussions must be resolved'
+ expect(page).to have_content 'All threads must be resolved'
within('.sharing-permissions-form') do
find('.project-feature-controls[data-for="project[project_feature_attributes][builds_access_level]"] .gl-toggle').click
@@ -78,7 +78,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
end
expect(page).to have_content 'Pipelines must succeed'
- expect(page).to have_content 'All discussions must be resolved'
+ expect(page).to have_content 'All threads must be resolved'
end
end
end
@@ -91,7 +91,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
it 'does not show the Merge Requests settings' do
expect(page).not_to have_content 'Pipelines must succeed'
- expect(page).not_to have_content 'All discussions must be resolved'
+ expect(page).not_to have_content 'All threads must be resolved'
within('.sharing-permissions-form') do
find('.project-feature-controls[data-for="project[project_feature_attributes][merge_requests_access_level]"] .gl-toggle').click
@@ -99,7 +99,7 @@ RSpec.describe 'Projects > Settings > User manages merge request settings' do
end
expect(page).to have_content 'Pipelines must succeed'
- expect(page).to have_content 'All discussions must be resolved'
+ expect(page).to have_content 'All threads must be resolved'
end
end
diff --git a/spec/features/projects/settings/user_manages_project_members_spec.rb b/spec/features/projects/settings/user_manages_project_members_spec.rb
index 2fe06414b32..1d258582b3a 100644
--- a/spec/features/projects/settings/user_manages_project_members_spec.rb
+++ b/spec/features/projects/settings/user_manages_project_members_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe 'Projects > Settings > User manages project members' do
include Spec::Support::Helpers::ModalHelpers
let(:group) { create(:group, name: 'OpenSource') }
- let(:project) { create(:project) }
+ let(:project) { create(:project, :with_namespace_settings) }
let(:project2) { create(:project) }
let(:user) { create(:user) }
let(:user_dmitriy) { create(:user, name: 'Dmitriy') }
diff --git a/spec/features/projects/show/user_uploads_files_spec.rb b/spec/features/projects/show/user_uploads_files_spec.rb
index 92b54d83ef3..a222d6b42ab 100644
--- a/spec/features/projects/show/user_uploads_files_spec.rb
+++ b/spec/features/projects/show/user_uploads_files_spec.rb
@@ -55,16 +55,4 @@ RSpec.describe 'Projects > Show > User uploads files' do
include_examples 'uploads and commits a new text file via "upload file" button', drop: value
end
end
-
- context 'with a nonempty repo' do
- let(:project) { create(:project, :repository, creator: user) }
-
- before do
- visit(project_path(project))
- end
-
- [true, false].each do |value|
- include_examples 'uploads and commits a new text file via "upload file" button', drop: value
- end
- end
end
diff --git a/spec/features/projects/snippets/create_snippet_spec.rb b/spec/features/projects/snippets/create_snippet_spec.rb
index 0ed9e23c7f8..cbdf6d6852e 100644
--- a/spec/features/projects/snippets/create_snippet_spec.rb
+++ b/spec/features/projects/snippets/create_snippet_spec.rb
@@ -85,13 +85,4 @@ RSpec.describe 'Projects > Snippets > Create Snippet', :js do
expect(page).to have_content('New Snippet')
end
end
-
- it 'does not allow submitting the form without title and content' do
- snippet_fill_in_title(title)
-
- expect(page).not_to have_button('Create snippet')
-
- snippet_fill_in_form(title: title, content: file_content)
- expect(page).to have_button('Create snippet')
- end
end
diff --git a/spec/features/projects/tags/user_views_tags_spec.rb b/spec/features/projects/tags/user_views_tags_spec.rb
index e1962ad3df5..dfb5d5d9221 100644
--- a/spec/features/projects/tags/user_views_tags_spec.rb
+++ b/spec/features/projects/tags/user_views_tags_spec.rb
@@ -2,6 +2,36 @@
require 'spec_helper'
RSpec.describe 'User views tags', :feature do
+ context 'with html' do
+ let(:project) { create(:project, :repository, visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
+ let(:user) { create(:user) }
+ let(:tag_name) { "stable" }
+ let!(:release) { create(:release, project: project, tag: tag_name) }
+
+ before do
+ project.add_developer(user)
+ project.repository.add_tag(user, tag_name, project.default_branch_or_main)
+
+ sign_in(user)
+ end
+
+ shared_examples 'renders the tag index page' do
+ it do
+ visit project_tags_path(project)
+
+ expect(page).to have_content tag_name
+ end
+ end
+
+ it_behaves_like 'renders the tag index page'
+
+ context 'when tag name contains a slash' do
+ let(:tag_name) { "stable/v0.1" }
+
+ it_behaves_like 'renders the tag index page'
+ end
+ end
+
context 'rss' do
shared_examples 'has access to the tags RSS feed' do
it do
diff --git a/spec/features/projects/tree/tree_show_spec.rb b/spec/features/projects/tree/tree_show_spec.rb
index cd94e6da018..53e89cd2959 100644
--- a/spec/features/projects/tree/tree_show_spec.rb
+++ b/spec/features/projects/tree/tree_show_spec.rb
@@ -81,7 +81,7 @@ RSpec.describe 'Projects tree', :js do
wait_for_requests
page.within('.project-last-commit') do
- expect(page).to have_selector('.user-avatar-link')
+ expect(page).to have_selector('.gl-avatar')
expect(page).to have_content('Merge branch')
end
end
@@ -152,4 +152,18 @@ RSpec.describe 'Projects tree', :js do
end
end
end
+
+ context 'ref switcher' do
+ it 'switches ref to branch' do
+ ref_name = 'feature'
+ visit project_tree_path(project, 'master')
+ first('.js-project-refs-dropdown').click
+
+ page.within '.project-refs-form' do
+ click_link ref_name
+ end
+
+ expect(page).to have_selector '.dropdown-menu-toggle', text: ref_name
+ end
+ end
end
diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb
index 2dddcd62a6c..534da71e39a 100644
--- a/spec/features/runners_spec.rb
+++ b/spec/features/runners_spec.rb
@@ -346,206 +346,4 @@ RSpec.describe 'Runners' do
end
end
end
-
- context 'group runners in group settings' do
- let(:group) { create(:group) }
-
- before do
- group.add_owner(user)
- stub_feature_flags(runner_list_group_view_vue_ui: false)
- end
-
- context 'group with no runners' do
- it 'there are no runners displayed' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).to have_content 'No runners found'
- end
- end
-
- context 'group with a runner' do
- let!(:runner) { create(:ci_runner, :group, groups: [group], description: 'group-runner') }
-
- it 'the runner is visible' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).not_to have_content 'No runners found'
- expect(page).to have_content 'Available runners: 1'
- expect(page).to have_content 'group-runner'
- end
-
- it 'user can pause and resume the group runner' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).to have_link href: pause_group_runner_path(group, runner)
- expect(page).not_to have_link href: resume_group_runner_path(group, runner)
-
- click_link href: pause_group_runner_path(group, runner)
-
- expect(page).not_to have_link href: pause_group_runner_path(group, runner)
- expect(page).to have_link href: resume_group_runner_path(group, runner)
-
- click_link href: resume_group_runner_path(group, runner)
-
- expect(page).to have_link href: pause_group_runner_path(group, runner)
- expect(page).not_to have_link href: resume_group_runner_path(group, runner)
- end
-
- it 'user can view runner details' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).to have_content(runner.display_name)
-
- click_on runner.short_sha
-
- expect(page).to have_content(runner.platform)
- end
-
- it 'user can remove a group runner' do
- visit group_settings_ci_cd_path(group)
-
- all(:link, href: group_runner_path(group, runner))[1].click
-
- expect(page).not_to have_content(runner.display_name)
- end
-
- it 'user edits the runner to be protected' do
- visit group_settings_ci_cd_path(group)
-
- click_link href: 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 'Protected Yes'
- 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 group_settings_ci_cd_path(group)
-
- click_link href: edit_group_runner_path(group, runner)
-
- expect(page.find_field('runner[run_untagged]')).to be_checked
-
- uncheck 'runner_run_untagged'
- click_button 'Save changes'
-
- expect(page).to have_content 'Can run untagged jobs No'
- end
- end
- end
-
- context 'group with a project runner' do
- let(:project) { create(:project, group: group) }
- let!(:runner) { create(:ci_runner, :project, projects: [project], description: 'project-runner') }
-
- it 'the runner is visible' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).not_to have_content 'No runners found'
- expect(page).to have_content 'Available runners: 1'
- expect(page).to have_content 'project-runner'
- end
-
- it 'user can pause and resume the project runner' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).to have_link href: pause_group_runner_path(group, runner)
- expect(page).not_to have_link href: resume_group_runner_path(group, runner)
-
- click_link href: pause_group_runner_path(group, runner)
-
- expect(page).not_to have_link href: pause_group_runner_path(group, runner)
- expect(page).to have_link href: resume_group_runner_path(group, runner)
-
- click_link href: resume_group_runner_path(group, runner)
-
- expect(page).to have_link href: pause_group_runner_path(group, runner)
- expect(page).not_to have_link href: resume_group_runner_path(group, runner)
- end
-
- it 'user can view runner details' do
- visit group_settings_ci_cd_path(group)
-
- expect(page).to have_content(runner.display_name)
-
- click_on runner.short_sha
-
- expect(page).to have_content(runner.platform)
- end
-
- it 'user can remove a project runner' do
- visit group_settings_ci_cd_path(group)
-
- all(:link, href: group_runner_path(group, runner))[1].click
-
- expect(page).not_to have_content(runner.display_name)
- end
-
- it 'user edits the runner to be protected' do
- visit group_settings_ci_cd_path(group)
-
- click_link href: 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 'Protected Yes'
- 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 group_settings_ci_cd_path(group)
-
- click_link href: edit_group_runner_path(group, runner)
-
- expect(page.find_field('runner[run_untagged]')).to be_checked
-
- uncheck 'runner_run_untagged'
- click_button 'Save changes'
-
- expect(page).to have_content 'Can run untagged jobs No'
- end
- end
- end
-
- context 'group with a multi-project runner' do
- let(:project) { create(:project, group: group) }
- let(:project_2) { create(:project, group: group) }
- let!(:runner) { create(:ci_runner, :project, projects: [project, project_2], description: 'group-runner') }
-
- it 'user cannot remove the project runner' do
- visit group_settings_ci_cd_path(group)
-
- expect(all(:link, href: group_runner_path(group, runner)).length).to eq(1)
- end
- end
-
- context 'filtered search' do
- it 'allows user to search by status and type', :js do
- visit group_settings_ci_cd_path(group)
-
- find('.filtered-search').click
-
- page.within('#js-dropdown-hint') do
- expect(page).to have_content('Status')
- expect(page).to have_content('Type')
- expect(page).not_to have_content('Tag')
- end
- end
- end
- end
end
diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb
index 4012a302196..48cee4b1f19 100644
--- a/spec/features/security/project/internal_access_spec.rb
+++ b/spec/features/security/project/internal_access_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe "Internal Project Access" do
include AccessMatchers
- let_it_be(:project, reload: true) { create(:project, :internal, :repository) }
+ let_it_be(:project, reload: true) { create(:project, :internal, :repository, :with_namespace_settings) }
describe "Project should be internal" do
describe '#internal?' do
diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb
index aa34ccce2c1..c06b1e5da54 100644
--- a/spec/features/security/project/private_access_spec.rb
+++ b/spec/features/security/project/private_access_spec.rb
@@ -5,7 +5,9 @@ require 'spec_helper'
RSpec.describe "Private Project Access" do
include AccessMatchers
- let_it_be(:project, reload: true) { create(:project, :private, :repository, public_builds: false) }
+ let_it_be(:project, reload: true) do
+ create(:project, :private, :repository, :with_namespace_settings, public_builds: false)
+ end
describe "Project should be private" do
describe '#private?' do
diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb
index abe128c6f78..d2112430638 100644
--- a/spec/features/security/project/public_access_spec.rb
+++ b/spec/features/security/project/public_access_spec.rb
@@ -5,7 +5,9 @@ require 'spec_helper'
RSpec.describe "Public Project Access" do
include AccessMatchers
- let_it_be(:project, reload: true) { create(:project, :public, :repository) }
+ let_it_be(:project, reload: true) do
+ create(:project, :public, :repository, :with_namespace_settings)
+ end
describe "Project should be public" do
describe '#public?' do
diff --git a/spec/features/snippets/user_creates_snippet_spec.rb b/spec/features/snippets/user_creates_snippet_spec.rb
index 82fe895d397..c682ad06977 100644
--- a/spec/features/snippets/user_creates_snippet_spec.rb
+++ b/spec/features/snippets/user_creates_snippet_spec.rb
@@ -109,13 +109,22 @@ RSpec.describe 'User creates snippet', :js do
end
end
- it 'validation fails for the first time' do
- fill_in snippet_title_field, with: title
+ it 'shows validation errors' do
+ title_validation_message = _("This field is required.")
+ files_validation_message = _("Snippets can't contain empty files. Ensure all files have content, or delete them.")
- expect(page).not_to have_button('Create snippet')
+ click_button('Create snippet')
+
+ expect(page).to have_content(title_validation_message)
+ expect(page).to have_content(files_validation_message)
+
+ snippet_fill_in_title(title)
+
+ expect(page).not_to have_content(title_validation_message)
snippet_fill_in_form(title: title, content: file_content)
- expect(page).to have_button('Create snippet')
+
+ expect(page).not_to have_content(files_validation_message)
end
it 'previews a snippet with file' do
diff --git a/spec/features/topic_show_spec.rb b/spec/features/topic_show_spec.rb
index 3a9865a6503..196fc34e3ea 100644
--- a/spec/features/topic_show_spec.rb
+++ b/spec/features/topic_show_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'Topic show page' do
- let_it_be(:topic) { create(:topic, name: 'my-topic', description: 'This is **my** topic https://google.com/ :poop: ```\ncode\n```', avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) }
+ let_it_be(:topic) { create(:topic, name: 'my-topic', title: 'My Topic', description: 'This is **my** topic https://google.com/ :poop: ```\ncode\n```', avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) }
context 'when topic does not exist' do
let(:path) { topic_explore_projects_path(topic_name: 'non-existing') }
@@ -20,8 +20,9 @@ RSpec.describe 'Topic show page' do
visit topic_explore_projects_path(topic_name: topic.name)
end
- it 'shows name, avatar and description as markdown' do
- expect(page).to have_content(topic.name)
+ it 'shows title, avatar and description as markdown' do
+ expect(page).to have_content(topic.title)
+ expect(page).not_to have_content(topic.name)
expect(page).to have_selector('.avatar-container > img.topic-avatar')
expect(find('.topic-description')).to have_selector('p > strong')
expect(find('.topic-description')).to have_selector('p > a[rel]')
diff --git a/spec/features/user_sorts_things_spec.rb b/spec/features/user_sorts_things_spec.rb
index fa37d692225..bcf3defe9c6 100644
--- a/spec/features/user_sorts_things_spec.rb
+++ b/spec/features/user_sorts_things_spec.rb
@@ -6,7 +6,7 @@ require "spec_helper"
# to check if the sorting option set by user is being kept persisted while going through pages.
# The `it`s are named here by convention `starting point -> some pages -> final point`.
# All those specs are moved out to this spec intentionally to keep them all in one place.
-RSpec.describe "User sorts things" do
+RSpec.describe "User sorts things", :js do
include Spec::Support::Helpers::Features::SortingHelpers
include DashboardHelper
@@ -16,29 +16,32 @@ RSpec.describe "User sorts things" do
let_it_be(:merge_request) { create(:merge_request, target_project: project, source_project: project, author: current_user) }
before do
+ stub_feature_flags(vue_issues_list: true)
+
project.add_developer(current_user)
sign_in(current_user)
end
it "issues -> project home page -> issues" do
- sort_option = 'Updated date'
+ sort_option = s_('SortOptions|Updated date')
visit(project_issues_path(project))
- sort_by(sort_option)
+ click_button s_('SortOptions|Created date')
+ click_button sort_option
visit(project_path(project))
visit(project_issues_path(project))
- expect(find(".issues-filters")).to have_content(sort_option)
+ expect(page).to have_button(sort_option)
end
it "merge requests -> dashboard merge requests" do
- sort_option = 'Updated date'
+ sort_option = s_('SortOptions|Updated date')
visit(project_merge_requests_path(project))
- sort_by(sort_option)
+ pajamas_sort_by(sort_option)
visit(assigned_mrs_dashboard_path)
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 822bf898034..efb7c98d63a 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -167,7 +167,7 @@ RSpec.describe 'Login', :clean_gitlab_redis_sessions do
it 'does not update Devise trackable attributes' do
expect { gitlab_sign_in(user, password: user.password) }
- .not_to change { User.ghost.reload.sign_in_count }
+ .not_to change { user.reload.sign_in_count }
end
end
diff --git a/spec/finders/error_tracking/errors_finder_spec.rb b/spec/finders/error_tracking/errors_finder_spec.rb
deleted file mode 100644
index 66eb7769a4c..00000000000
--- a/spec/finders/error_tracking/errors_finder_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ErrorTracking::ErrorsFinder do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { project.creator }
- let_it_be(:error) { create(:error_tracking_error, project: project) }
- let_it_be(:error_resolved) { create(:error_tracking_error, :resolved, project: project, first_seen_at: 2.hours.ago) }
- let_it_be(:error_yesterday) { create(:error_tracking_error, project: project, first_seen_at: Time.zone.now.yesterday) }
-
- before do
- project.add_maintainer(user)
- end
-
- describe '#execute' do
- let(:params) { {} }
-
- subject { described_class.new(user, project, params).execute }
-
- it { is_expected.to contain_exactly(error, error_resolved, error_yesterday) }
-
- context 'with status parameter' do
- let(:params) { { status: 'resolved' } }
-
- it { is_expected.to contain_exactly(error_resolved) }
- end
-
- context 'with sort parameter' do
- let(:params) { { status: 'unresolved', sort: 'first_seen' } }
-
- it { expect(subject.to_a).to eq([error, error_yesterday]) }
- end
-
- context 'pagination' do
- let(:params) { { limit: '1', sort: 'first_seen' } }
-
- # Sort by first_seen is DESC by default, so the most recent error is `error`
- it { is_expected.to contain_exactly(error) }
-
- it { expect(subject.has_next_page?).to be_truthy }
-
- it 'returns next page by cursor' do
- params_with_cursor = params.merge(cursor: subject.cursor_for_next_page)
- errors = described_class.new(user, project, params_with_cursor).execute
-
- expect(errors).to contain_exactly(error_resolved)
- expect(errors.has_next_page?).to be_truthy
- expect(errors.has_previous_page?).to be_truthy
- end
- end
- end
-end
diff --git a/spec/finders/group_members_finder_spec.rb b/spec/finders/group_members_finder_spec.rb
index a9a8e9d19b8..00aa14209a2 100644
--- a/spec/finders/group_members_finder_spec.rb
+++ b/spec/finders/group_members_finder_spec.rb
@@ -195,4 +195,37 @@ RSpec.describe GroupMembersFinder, '#execute' do
expect(result.to_a).to match_array([member1])
end
end
+
+ context 'filter by access levels' do
+ let!(:owner1) { group.add_owner(user2) }
+ let!(:owner2) { group.add_owner(user3) }
+ let!(:maintainer1) { group.add_maintainer(user4) }
+ let!(:maintainer2) { group.add_maintainer(user5) }
+
+ subject(:by_access_levels) { described_class.new(group, user1, params: { access_levels: access_levels }).execute }
+
+ context 'by owner' do
+ let(:access_levels) { ::Gitlab::Access::OWNER }
+
+ it 'returns owners' do
+ expect(by_access_levels).to match_array([owner1, owner2])
+ end
+ end
+
+ context 'by maintainer' do
+ let(:access_levels) { ::Gitlab::Access::MAINTAINER }
+
+ it 'returns owners' do
+ expect(by_access_levels).to match_array([maintainer1, maintainer2])
+ end
+ end
+
+ context 'by owner and maintainer' do
+ let(:access_levels) { [::Gitlab::Access::OWNER, ::Gitlab::Access::MAINTAINER] }
+
+ it 'returns owners and maintainers' do
+ expect(by_access_levels).to match_array([owner1, owner2, maintainer1, maintainer2])
+ end
+ end
+ end
end
diff --git a/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb b/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb
new file mode 100644
index 00000000000..8cdfa13ba3a
--- /dev/null
+++ b/spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Groups::ProjectsRequiringAuthorizationsRefresh::OnDirectMembershipFinder do
+ # rubocop:disable Layout/LineLength
+
+ # Group X Group A ------shared with-------------> Group B Group C
+ # | Group X_subgroup_1 | | |
+ # | | Project X_subgroup_1 ---shared with----->| Group A_subgroup_1 | Group B_subgroup_1 <--shared with--------- | Group C_subgroup_1
+ # | | | Project A_subgroup_1 | | Project B_subgroup_1 | | Project C_subgroup_1
+ # | Group A_subgroup_2 | Group B_subgroup_2 <----shared with ------- Project C
+ # | |Project A_subgroup_2 | | Project B_subgroup_2
+
+ # rubocop:enable Layout/LineLength
+
+ let_it_be(:group_x) { create(:group) }
+ let_it_be(:group_a) { create(:group) }
+ let_it_be(:group_b) { create(:group) }
+ let_it_be(:group_c) { create(:group) }
+ let_it_be(:group_x_subgroup_1) { create(:group, parent: group_x) }
+ let_it_be(:group_a_subgroup_1) { create(:group, parent: group_a) }
+ let_it_be(:group_a_subgroup_2) { create(:group, parent: group_a) }
+ let_it_be(:group_b_subgroup_1) { create(:group, parent: group_b) }
+ let_it_be(:group_b_subgroup_2) { create(:group, parent: group_b) }
+ let_it_be(:group_c_subgroup_1) { create(:group, parent: group_c) }
+ let_it_be(:project_x_subgroup_1) { create(:project, group: group_x_subgroup_1, name: 'project_x_subgroup_1') }
+ let_it_be(:project_a_subgroup_1) { create(:project, group: group_a_subgroup_1, name: 'project_a_subgroup_1') }
+ let_it_be(:project_a_subgroup_2) { create(:project, group: group_a_subgroup_2, name: 'project_a_subgroup_2') }
+ let_it_be(:project_b_subgroup_1) { create(:project, group: group_b_subgroup_1, name: 'project_b_subgroup_1') }
+ let_it_be(:project_b_subgroup_2) { create(:project, group: group_b_subgroup_2, name: 'project_b_subgroup_2') }
+ let_it_be(:project_c_subgroup_1) { create(:project, group: group_c_subgroup_1, name: 'project_c_subgroup_1') }
+ let_it_be(:project_c) { create(:project, group: group_c, name: 'project_c') }
+
+ describe '#execute' do
+ context 'projects affected when a new member is added to a specific group (here, `Group B`)' do
+ subject(:result) { described_class.new(group_b).execute }
+
+ before do
+ create(:project_group_link, project: project_x_subgroup_1, group: group_a_subgroup_1)
+ create(:project_group_link, project: project_c, group: group_b_subgroup_2)
+ create(:group_group_link, shared_group: group_a, shared_with_group: group_b)
+ create(:group_group_link, shared_group: group_c_subgroup_1, shared_with_group: group_b_subgroup_1)
+ end
+
+ it 'returns all projects IDs where authorizations need to be created for the user'\
+ 'due to their new membership being created in `Group B`' do
+ new_user = create(:user)
+ group_b.add_maintainer(new_user)
+
+ expect(result).to match_array(new_user.authorized_projects.ids)
+ end
+
+ it 'includes only the expected projects' do
+ expected_projects = Project.id_in(
+ [
+ project_b_subgroup_1, # direct member of Group B gets access to this project due to group hierarchy
+ project_b_subgroup_2, # direct member of Group B gets access to this project due to group hierarchy
+ project_c, # direct member of Group B gets access to this project via project-group share
+ project_a_subgroup_1, # direct member of Group B gets access to this project via group share
+ project_a_subgroup_2, # direct member of Group B gets access to this project via group share
+
+ # direct member of Group B gets access to any projects shared with groups within its shared groups.
+ project_x_subgroup_1
+ ]
+ )
+ # project_c_subgroup_1 is not included in the list because only 'direct' members of
+ # `group_b_subgroup_1` gets access to that project via the group-group share.
+ expect(result).to match_array(expected_projects.ids)
+ end
+ end
+ end
+end
diff --git a/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb b/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb
new file mode 100644
index 00000000000..103cef44c94
--- /dev/null
+++ b/spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Groups::ProjectsRequiringAuthorizationsRefresh::OnTransferFinder do
+ # rubocop:disable Layout/LineLength
+
+ # Group X Group A ------shared with-------------> Group B Group C
+ # | Group X_subgroup_1 | | |
+ # | | Project X_subgroup_1 ---shared with----->| Group A_subgroup_1 | Group B_subgroup_1 <--shared with--------- | Group C_subgroup_1
+ # | | | Project A_subgroup_1 | | Project B_subgroup_1 | | Project C_subgroup_1
+ # | Group A_subgroup_2 | Group B_subgroup_2 <----shared with ------- Project C
+ # | |Project A_subgroup_2 | | Project B_subgroup_2
+
+ # rubocop:enable Layout/LineLength
+
+ let_it_be(:group_x) { create(:group) }
+ let_it_be(:group_a) { create(:group) }
+ let_it_be(:group_b) { create(:group) }
+ let_it_be(:group_c) { create(:group) }
+ let_it_be(:group_x_subgroup_1) { create(:group, parent: group_x) }
+ let_it_be(:group_a_subgroup_1) { create(:group, parent: group_a) }
+ let_it_be(:group_a_subgroup_2) { create(:group, parent: group_a) }
+ let_it_be(:group_b_subgroup_1) { create(:group, parent: group_b) }
+ let_it_be(:group_b_subgroup_2) { create(:group, parent: group_b) }
+ let_it_be(:group_c_subgroup_1) { create(:group, parent: group_c) }
+ let_it_be(:project_x_subgroup_1) { create(:project, group: group_x_subgroup_1, name: 'project_x_subgroup_1') }
+ let_it_be(:project_a_subgroup_1) { create(:project, group: group_a_subgroup_1, name: 'project_a_subgroup_1') }
+ let_it_be(:project_a_subgroup_2) { create(:project, group: group_a_subgroup_2, name: 'project_a_subgroup_2') }
+ let_it_be(:project_b_subgroup_1) { create(:project, group: group_b_subgroup_1, name: 'project_b_subgroup_1') }
+ let_it_be(:project_b_subgroup_2) { create(:project, group: group_b_subgroup_2, name: 'project_b_subgroup_2') }
+ let_it_be(:project_c_subgroup_1) { create(:project, group: group_c_subgroup_1, name: 'project_c_subgroup_1') }
+ let_it_be(:project_c) { create(:project, group: group_c, name: 'project_c') }
+
+ describe '#execute' do
+ context 'projects requiring authorizations refresh when a group is transferred (here, `Group B`)' do
+ subject(:result) { described_class.new(group_b).execute }
+
+ before do
+ create(:project_group_link, project: project_x_subgroup_1, group: group_a_subgroup_1)
+ create(:project_group_link, project: project_c, group: group_b_subgroup_2)
+ create(:group_group_link, shared_group: group_a, shared_with_group: group_b)
+ create(:group_group_link, shared_group: group_c_subgroup_1, shared_with_group: group_b_subgroup_1)
+ end
+
+ it 'includes only the expected projects' do
+ expected_projects = Project.id_in(
+ [
+ project_b_subgroup_1,
+ project_b_subgroup_2,
+ project_c
+ ]
+ )
+
+ expect(result).to match_array(expected_projects.ids)
+ end
+ end
+ end
+end
diff --git a/spec/finders/incident_management/timeline_events_finder_spec.rb b/spec/finders/incident_management/timeline_events_finder_spec.rb
new file mode 100644
index 00000000000..aa01391c343
--- /dev/null
+++ b/spec/finders/incident_management/timeline_events_finder_spec.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEventsFinder do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :private) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:another_incident) { create(:incident, project: project) }
+
+ let_it_be(:timeline_event1) do
+ create(:incident_management_timeline_event, project: project, incident: incident, occurred_at: Time.current)
+ end
+
+ let_it_be(:timeline_event2) do
+ create(:incident_management_timeline_event, project: project, incident: incident, occurred_at: 1.minute.ago)
+ end
+
+ let_it_be(:timeline_event_of_another_incident) do
+ create(:incident_management_timeline_event, project: project, incident: another_incident)
+ end
+
+ let(:params) { {} }
+
+ describe '#execute' do
+ subject(:execute) { described_class.new(user, incident, params).execute }
+
+ context 'when user has permissions' do
+ before do
+ project.add_guest(user)
+ end
+
+ it 'returns timeline events' do
+ is_expected.to match_array([timeline_event2, timeline_event1])
+ end
+
+ context 'when filtering by ID' do
+ let(:params) { { id: timeline_event1 } }
+
+ it 'returns only matched timeline event' do
+ is_expected.to contain_exactly(timeline_event1)
+ end
+ end
+
+ context 'when incident is nil' do
+ let_it_be(:incident) { nil }
+
+ it { is_expected.to eq(IncidentManagement::TimelineEvent.none) }
+ end
+ end
+
+ context 'when user has no permissions' do
+ it { is_expected.to eq(IncidentManagement::TimelineEvent.none) }
+ end
+ end
+end
diff --git a/spec/finders/issues_finder/params_spec.rb b/spec/finders/issues_finder/params_spec.rb
deleted file mode 100644
index 879ecc364a2..00000000000
--- a/spec/finders/issues_finder/params_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe IssuesFinder::Params do
- describe '#include_hidden' do
- subject { described_class.new(params, user, IssuesFinder) }
-
- context 'when param is not set' do
- let(:params) { {} }
-
- context 'with an admin', :enable_admin_mode do
- let(:user) { create(:user, :admin) }
-
- it 'returns true' do
- expect(subject.include_hidden?).to be_truthy
- end
- end
-
- context 'with a regular user' do
- let(:user) { create(:user) }
-
- it 'returns false' do
- expect(subject.include_hidden?).to be_falsey
- end
- end
- end
-
- context 'when param is set' do
- let(:params) { { include_hidden: true } }
-
- context 'with an admin', :enable_admin_mode do
- let(:user) { create(:user, :admin) }
-
- it 'returns true' do
- expect(subject.include_hidden?).to be_truthy
- end
- end
-
- context 'with a regular user' do
- let(:user) { create(:user) }
-
- it 'returns false' do
- expect(subject.include_hidden?).to be_falsey
- end
- end
- end
- end
-end
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index aa9357a686a..3f5a55410d2 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -12,52 +12,8 @@ RSpec.describe IssuesFinder do
context 'scope: all' do
let(:scope) { 'all' }
- context 'include_hidden and public_only params' do
- let_it_be(:banned_user) { create(:user, :banned) }
- let_it_be(:hidden_issue) { create(:issue, project: project1, author: banned_user) }
- let_it_be(:confidential_issue) { create(:issue, project: project1, confidential: true) }
-
- context 'when user is an admin', :enable_admin_mode do
- let(:user) { create(:user, :admin) }
-
- it 'returns all issues' do
- expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5, hidden_issue, confidential_issue)
- end
- end
-
- context 'when user is not an admin' do
- context 'when public_only is true' do
- let(:params) { { public_only: true } }
-
- it 'returns public issues' do
- expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5)
- end
- end
-
- context 'when public_only is false' do
- let(:params) { { public_only: false } }
-
- it 'returns public and confidential issues' do
- expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5, confidential_issue)
- end
- end
-
- context 'when public_only is not set' do
- it 'returns public and confidential issue' do
- expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5, confidential_issue)
- end
- end
-
- context 'when ban_user_feature_flag is false' do
- before do
- stub_feature_flags(ban_user_feature_flag: false)
- end
-
- it 'returns all issues' do
- expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5, hidden_issue, confidential_issue)
- end
- end
- end
+ it 'returns all issues' do
+ expect(issues).to contain_exactly(issue1, issue2, issue3, issue4, issue5)
end
context 'user does not have read permissions' do
@@ -1148,64 +1104,132 @@ RSpec.describe IssuesFinder do
end
describe '#with_confidentiality_access_check' do
- let(:user) { create(:user) }
+ let(:guest) { create(:user) }
let_it_be(:authorized_user) { create(:user) }
+ let_it_be(:banned_user) { create(:user, :banned) }
let_it_be(:project) { create(:project, namespace: authorized_user.namespace) }
let_it_be(:public_issue) { create(:issue, project: project) }
let_it_be(:confidential_issue) { create(:issue, project: project, confidential: true) }
+ let_it_be(:hidden_issue) { create(:issue, project: project, author: banned_user) }
- shared_examples 'returns public, does not return confidential' do
+ shared_examples 'returns public, does not return hidden or confidential' do
it 'returns only public issues' do
expect(subject).to include(public_issue)
- expect(subject).not_to include(confidential_issue)
+ expect(subject).not_to include(confidential_issue, hidden_issue)
end
end
- shared_examples 'returns public and confidential' do
- it 'returns public and confidential issues' do
+ shared_examples 'returns public and confidential, does not return hidden' do
+ it 'returns only public and confidential issues' do
expect(subject).to include(public_issue, confidential_issue)
+ expect(subject).not_to include(hidden_issue)
end
end
- subject { described_class.new(user, params).with_confidentiality_access_check }
+ shared_examples 'returns public and hidden, does not return confidential' do
+ it 'returns only public and hidden issues' do
+ expect(subject).to include(public_issue, hidden_issue)
+ expect(subject).not_to include(confidential_issue)
+ end
+ end
+
+ shared_examples 'returns public, confidential, and hidden' do
+ it 'returns all issues' do
+ expect(subject).to include(public_issue, confidential_issue, hidden_issue)
+ end
+ end
context 'when no project filter is given' do
let(:params) { {} }
context 'for an anonymous user' do
- it_behaves_like 'returns public, does not return confidential'
+ subject { described_class.new(nil, params).with_confidentiality_access_check }
+
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
end
context 'for a user without project membership' do
- it_behaves_like 'returns public, does not return confidential'
+ subject { described_class.new(user, params).with_confidentiality_access_check }
+
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
end
context 'for a guest user' do
+ subject { described_class.new(guest, params).with_confidentiality_access_check }
+
before do
- project.add_guest(user)
+ project.add_guest(guest)
end
- it_behaves_like 'returns public, does not return confidential'
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
end
context 'for a project member with access to view confidential issues' do
- before do
- project.add_reporter(user)
- end
+ subject { described_class.new(authorized_user, params).with_confidentiality_access_check }
- it_behaves_like 'returns public and confidential'
+ it_behaves_like 'returns public and confidential, does not return hidden'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public, confidential, and hidden'
+ end
end
context 'for an admin' do
- let(:user) { create(:user, :admin) }
+ let(:admin_user) { create(:user, :admin) }
+
+ subject { described_class.new(admin_user, params).with_confidentiality_access_check }
context 'when admin mode is enabled', :enable_admin_mode do
- it_behaves_like 'returns public and confidential'
+ it_behaves_like 'returns public, confidential, and hidden'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public, confidential, and hidden'
+ end
end
context 'when admin mode is disabled' do
- it_behaves_like 'returns public, does not return confidential'
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
end
end
end
@@ -1214,9 +1238,17 @@ RSpec.describe IssuesFinder do
let(:params) { { project_id: project.id } }
context 'for an anonymous user' do
- let(:user) { nil }
+ subject { described_class.new(nil, params).with_confidentiality_access_check }
- it_behaves_like 'returns public, does not return confidential'
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
it 'does not filter by confidentiality' do
expect(Issue).not_to receive(:where).with(a_string_matching('confidential'), anything)
@@ -1225,7 +1257,17 @@ RSpec.describe IssuesFinder do
end
context 'for a user without project membership' do
- it_behaves_like 'returns public, does not return confidential'
+ subject { described_class.new(user, params).with_confidentiality_access_check }
+
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
it 'filters by confidentiality' do
expect(subject.to_sql).to match("issues.confidential")
@@ -1233,11 +1275,21 @@ RSpec.describe IssuesFinder do
end
context 'for a guest user' do
+ subject { described_class.new(guest, params).with_confidentiality_access_check }
+
before do
- project.add_guest(user)
+ project.add_guest(guest)
end
- it_behaves_like 'returns public, does not return confidential'
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
it 'filters by confidentiality' do
expect(subject.to_sql).to match("issues.confidential")
@@ -1245,18 +1297,40 @@ RSpec.describe IssuesFinder do
end
context 'for a project member with access to view confidential issues' do
- before do
- project.add_reporter(user)
+ subject { described_class.new(authorized_user, params).with_confidentiality_access_check }
+
+ it_behaves_like 'returns public and confidential, does not return hidden'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public, confidential, and hidden'
end
- it_behaves_like 'returns public and confidential'
+ it 'does not filter by confidentiality' do
+ expect(Issue).not_to receive(:where).with(a_string_matching('confidential'), anything)
+
+ subject
+ end
end
context 'for an admin' do
- let(:user) { create(:user, :admin) }
+ let(:admin_user) { create(:user, :admin) }
+
+ subject { described_class.new(admin_user, params).with_confidentiality_access_check }
context 'when admin mode is enabled', :enable_admin_mode do
- it_behaves_like 'returns public and confidential'
+ it_behaves_like 'returns public, confidential, and hidden'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public, confidential, and hidden'
+ end
it 'does not filter by confidentiality' do
expect(Issue).not_to receive(:where).with(a_string_matching('confidential'), anything)
@@ -1266,7 +1340,19 @@ RSpec.describe IssuesFinder do
end
context 'when admin mode is disabled' do
- it_behaves_like 'returns public, does not return confidential'
+ it_behaves_like 'returns public, does not return hidden or confidential'
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(ban_user_feature_flag: false)
+ end
+
+ it_behaves_like 'returns public and hidden, does not return confidential'
+ end
+
+ it 'filters by confidentiality' do
+ expect(subject.to_sql).to match("issues.confidential")
+ end
end
end
end
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index 1f63f69a411..96466e99105 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -414,6 +414,9 @@ RSpec.describe MergeRequestsFinder do
before do
reviewer = merge_request1.find_reviewer(user2)
reviewer.update!(state: :reviewed)
+
+ merge_request2.find_reviewer(user2).update!(state: :attention_requested)
+ merge_request3.find_assignee(user2).update!(state: :attention_requested)
end
context 'by username' do
diff --git a/spec/finders/packages/build_infos_finder_spec.rb b/spec/finders/packages/build_infos_finder_spec.rb
index 23425de4316..6e7f0623030 100644
--- a/spec/finders/packages/build_infos_finder_spec.rb
+++ b/spec/finders/packages/build_infos_finder_spec.rb
@@ -9,7 +9,20 @@ RSpec.describe ::Packages::BuildInfosFinder do
let_it_be(:build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: package) }
let_it_be(:build_info_with_empty_pipeline) { create(:package_build_info, package: package) }
- let(:finder) { described_class.new(package, params) }
+ let_it_be(:other_package) { create(:package) }
+ let_it_be(:other_build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: other_package) }
+ let_it_be(:other_build_info_with_empty_pipeline) { create(:package_build_info, package: other_package) }
+
+ let_it_be(:all_build_infos) { build_infos + other_build_infos }
+
+ let(:finder) { described_class.new(packages, params) }
+ let(:packages) { nil }
+ let(:first) { nil }
+ let(:last) { nil }
+ let(:after) { nil }
+ let(:before) { nil }
+ let(:max_page_size) { nil }
+ let(:support_next_page) { false }
let(:params) do
{
first: first,
@@ -24,41 +37,100 @@ RSpec.describe ::Packages::BuildInfosFinder do
describe '#execute' do
subject { finder.execute }
- where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
- # F L AI BI MPS SNP
- nil | nil | nil | nil | nil | false | [4, 3, 2, 1, 0]
- nil | nil | nil | nil | 10 | false | [4, 3, 2, 1, 0]
- nil | nil | nil | nil | 2 | false | [4, 3]
- 2 | nil | nil | nil | nil | false | [4, 3]
- 2 | nil | nil | nil | nil | true | [4, 3, 2]
- 2 | nil | 3 | nil | nil | false | [2, 1]
- 2 | nil | 3 | nil | nil | true | [2, 1, 0]
- 3 | nil | 4 | nil | 2 | false | [3, 2]
- 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
- nil | 2 | nil | nil | nil | false | [0, 1]
- nil | 2 | nil | nil | nil | true | [0, 1, 2]
- nil | 2 | nil | 1 | nil | false | [2, 3]
- nil | 2 | nil | 1 | nil | true | [2, 3, 4]
- nil | 3 | nil | 0 | 2 | false | [1, 2]
- nil | 3 | nil | 0 | 2 | true | [1, 2, 3]
- end
-
- with_them do
+ shared_examples 'returning the expected build infos' do
let(:expected_build_infos) do
expected_build_infos_indexes.map do |idx|
- build_infos[idx]
+ all_build_infos[idx]
end
end
let(:after) do
- build_infos[after_index].pipeline_id if after_index
+ all_build_infos[after_index].pipeline_id if after_index
end
let(:before) do
- build_infos[before_index].pipeline_id if before_index
+ all_build_infos[before_index].pipeline_id if before_index
end
it { is_expected.to eq(expected_build_infos) }
end
+
+ context 'with nil packages' do
+ let(:packages) { nil }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with [] packages' do
+ let(:packages) { [] }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with empy scope packages' do
+ let(:packages) { Packages::Package.none }
+
+ it { is_expected.to be_empty }
+ end
+
+ context 'with a single package' do
+ let(:packages) { package.id }
+
+ # rubocop: disable Layout/LineLength
+ where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
+ # F L AI BI MPS SNP
+ nil | nil | nil | nil | nil | false | [4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 10 | false | [4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 2 | false | [4, 3]
+ 2 | nil | nil | nil | nil | false | [4, 3]
+ 2 | nil | nil | nil | nil | true | [4, 3, 2]
+ 2 | nil | 3 | nil | nil | false | [2, 1]
+ 2 | nil | 3 | nil | nil | true | [2, 1, 0]
+ 3 | nil | 4 | nil | 2 | false | [3, 2]
+ 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
+ nil | 2 | nil | nil | nil | false | [1, 0]
+ nil | 2 | nil | nil | nil | true | [2, 1, 0]
+ nil | 2 | nil | 1 | nil | false | [3, 2]
+ nil | 2 | nil | 1 | nil | true | [4, 3, 2]
+ nil | 3 | nil | 0 | 2 | false | [2, 1]
+ nil | 3 | nil | 0 | 2 | true | [3, 2, 1]
+ end
+ # rubocop: enable Layout/LineLength
+
+ with_them do
+ it_behaves_like 'returning the expected build infos'
+ end
+ end
+
+ context 'with many packages' do
+ let(:packages) { [package.id, other_package.id] }
+
+ # using after_index/before_index when receiving multiple packages doesn't
+ # make sense but we still verify here that the behavior is coherent.
+ # rubocop: disable Layout/LineLength
+ where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
+ # F L AI BI MPS SNP
+ nil | nil | nil | nil | nil | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 10 | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
+ nil | nil | nil | nil | 2 | false | [9, 8, 4, 3]
+ 2 | nil | nil | nil | nil | false | [9, 8, 4, 3]
+ 2 | nil | nil | nil | nil | true | [9, 8, 7, 4, 3, 2]
+ 2 | nil | 3 | nil | nil | false | [2, 1]
+ 2 | nil | 3 | nil | nil | true | [2, 1, 0]
+ 3 | nil | 4 | nil | 2 | false | [3, 2]
+ 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
+ nil | 2 | nil | nil | nil | false | [6, 5, 1, 0]
+ nil | 2 | nil | nil | nil | true | [7, 6, 5, 2, 1, 0]
+ nil | 2 | nil | 1 | nil | false | [6, 5, 3, 2]
+ nil | 2 | nil | 1 | nil | true | [7, 6, 5, 4, 3, 2]
+ nil | 3 | nil | 0 | 2 | false | [6, 5, 2, 1]
+ nil | 3 | nil | 0 | 2 | true | [7, 6, 5, 3, 2, 1]
+ end
+
+ with_them do
+ it_behaves_like 'returning the expected build infos'
+ end
+ # rubocop: enable Layout/LineLength
+ end
end
end
diff --git a/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb b/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb
deleted file mode 100644
index f3c79d0c825..00000000000
--- a/spec/finders/packages/build_infos_for_many_packages_finder_spec.rb
+++ /dev/null
@@ -1,136 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ::Packages::BuildInfosForManyPackagesFinder do
- using RSpec::Parameterized::TableSyntax
-
- let_it_be(:package) { create(:package) }
- let_it_be(:build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: package) }
- let_it_be(:build_info_with_empty_pipeline) { create(:package_build_info, package: package) }
-
- let_it_be(:other_package) { create(:package) }
- let_it_be(:other_build_infos) { create_list(:package_build_info, 5, :with_pipeline, package: other_package) }
- let_it_be(:other_build_info_with_empty_pipeline) { create(:package_build_info, package: other_package) }
-
- let_it_be(:all_build_infos) { build_infos + other_build_infos }
-
- let(:finder) { described_class.new(packages, params) }
- let(:packages) { nil }
- let(:first) { nil }
- let(:last) { nil }
- let(:after) { nil }
- let(:before) { nil }
- let(:max_page_size) { nil }
- let(:support_next_page) { false }
- let(:params) do
- {
- first: first,
- last: last,
- after: after,
- before: before,
- max_page_size: max_page_size,
- support_next_page: support_next_page
- }
- end
-
- describe '#execute' do
- subject { finder.execute }
-
- shared_examples 'returning the expected build infos' do
- let(:expected_build_infos) do
- expected_build_infos_indexes.map do |idx|
- all_build_infos[idx]
- end
- end
-
- let(:after) do
- all_build_infos[after_index].pipeline_id if after_index
- end
-
- let(:before) do
- all_build_infos[before_index].pipeline_id if before_index
- end
-
- it { is_expected.to eq(expected_build_infos) }
- end
-
- context 'with nil packages' do
- let(:packages) { nil }
-
- it { is_expected.to be_empty }
- end
-
- context 'with [] packages' do
- let(:packages) { [] }
-
- it { is_expected.to be_empty }
- end
-
- context 'with empy scope packages' do
- let(:packages) { Packages::Package.none }
-
- it { is_expected.to be_empty }
- end
-
- context 'with a single package' do
- let(:packages) { package.id }
-
- # rubocop: disable Layout/LineLength
- where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
- # F L AI BI MPS SNP
- nil | nil | nil | nil | nil | false | [4, 3, 2, 1, 0]
- nil | nil | nil | nil | 10 | false | [4, 3, 2, 1, 0]
- nil | nil | nil | nil | 2 | false | [4, 3]
- 2 | nil | nil | nil | nil | false | [4, 3]
- 2 | nil | nil | nil | nil | true | [4, 3, 2]
- 2 | nil | 3 | nil | nil | false | [2, 1]
- 2 | nil | 3 | nil | nil | true | [2, 1, 0]
- 3 | nil | 4 | nil | 2 | false | [3, 2]
- 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
- nil | 2 | nil | nil | nil | false | [1, 0]
- nil | 2 | nil | nil | nil | true | [2, 1, 0]
- nil | 2 | nil | 1 | nil | false | [3, 2]
- nil | 2 | nil | 1 | nil | true | [4, 3, 2]
- nil | 3 | nil | 0 | 2 | false | [2, 1]
- nil | 3 | nil | 0 | 2 | true | [3, 2, 1]
- end
- # rubocop: enable Layout/LineLength
-
- with_them do
- it_behaves_like 'returning the expected build infos'
- end
- end
-
- context 'with many packages' do
- let(:packages) { [package.id, other_package.id] }
-
- # using after_index/before_index when receiving multiple packages doesn't
- # make sense but we still verify here that the behavior is coherent.
- # rubocop: disable Layout/LineLength
- where(:first, :last, :after_index, :before_index, :max_page_size, :support_next_page, :expected_build_infos_indexes) do
- # F L AI BI MPS SNP
- nil | nil | nil | nil | nil | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
- nil | nil | nil | nil | 10 | false | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
- nil | nil | nil | nil | 2 | false | [9, 8, 4, 3]
- 2 | nil | nil | nil | nil | false | [9, 8, 4, 3]
- 2 | nil | nil | nil | nil | true | [9, 8, 7, 4, 3, 2]
- 2 | nil | 3 | nil | nil | false | [2, 1]
- 2 | nil | 3 | nil | nil | true | [2, 1, 0]
- 3 | nil | 4 | nil | 2 | false | [3, 2]
- 3 | nil | 4 | nil | 2 | true | [3, 2, 1]
- nil | 2 | nil | nil | nil | false | [6, 5, 1, 0]
- nil | 2 | nil | nil | nil | true | [7, 6, 5, 2, 1, 0]
- nil | 2 | nil | 1 | nil | false | [6, 5, 3, 2]
- nil | 2 | nil | 1 | nil | true | [7, 6, 5, 4, 3, 2]
- nil | 3 | nil | 0 | 2 | false | [6, 5, 2, 1]
- nil | 3 | nil | 0 | 2 | true | [7, 6, 5, 3, 2, 1]
- end
-
- with_them do
- it_behaves_like 'returning the expected build infos'
- end
- # rubocop: enable Layout/LineLength
- end
- end
-end
diff --git a/spec/finders/personal_access_tokens_finder_spec.rb b/spec/finders/personal_access_tokens_finder_spec.rb
index 7607d08dc64..f22bff62082 100644
--- a/spec/finders/personal_access_tokens_finder_spec.rb
+++ b/spec/finders/personal_access_tokens_finder_spec.rb
@@ -286,24 +286,6 @@ RSpec.describe PersonalAccessTokensFinder do
end
end
- describe 'with active or expired state' do
- before do
- params[:state] = 'active_or_expired'
- end
-
- it 'includes active tokens' do
- is_expected.to include(active_personal_access_token, active_impersonation_token)
- end
-
- it 'includes expired tokens' do
- is_expected.to include(expired_personal_access_token, expired_impersonation_token)
- end
-
- it 'does not include revoked tokens' do
- is_expected.not_to include(revoked_personal_access_token, revoked_impersonation_token)
- end
- end
-
describe 'with id' do
subject { finder(params).find_by_id(active_personal_access_token.id) }
diff --git a/spec/finders/projects/serverless/functions_finder_spec.rb b/spec/finders/projects/serverless/functions_finder_spec.rb
deleted file mode 100644
index 9b58da2e398..00000000000
--- a/spec/finders/projects/serverless/functions_finder_spec.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Serverless::FunctionsFinder do
- include KubernetesHelpers
- include PrometheusHelpers
- include ReactiveCachingHelpers
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, projects: [project]) }
- let(:service) { cluster.platform_kubernetes }
- let(:environment) { create(:environment, project: project) }
- let!(:deployment) { create(:deployment, :success, environment: environment, cluster: cluster) }
- let(:knative_services_finder) { environment.knative_services_finder }
-
- let(:namespace) do
- create(:cluster_kubernetes_namespace,
- cluster: cluster,
- project: project,
- environment: environment)
- end
-
- before do
- project.add_maintainer(user)
- end
-
- describe '#knative_installed' do
- context 'when environment does not exist yet' do
- shared_examples 'before first deployment' do
- let(:service) { cluster.platform_kubernetes }
- let(:deployment) { nil }
-
- it 'returns true if Knative is installed on cluster' do
- stub_kubeclient_discover_knative_found(service.api_url)
- function_finder = described_class.new(project)
- synchronous_reactive_cache(function_finder)
-
- expect(function_finder.knative_installed).to be true
- end
-
- it 'returns false if Knative is not installed on cluster' do
- stub_kubeclient_discover_knative_not_found(service.api_url)
- function_finder = described_class.new(project)
- synchronous_reactive_cache(function_finder)
-
- expect(function_finder.knative_installed).to be false
- end
- end
-
- context 'when project level cluster is present and enabled' do
- it_behaves_like 'before first deployment' do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, enabled: true) }
- let(:project) { cluster.project }
- end
- end
-
- context 'when group level cluster is present and enabled' do
- it_behaves_like 'before first deployment' do
- let(:cluster) { create(:cluster, :group, :provided_by_gcp, enabled: true) }
- let(:project) { create(:project, group: cluster.groups.first) }
- end
- end
-
- context 'when instance level cluster is present and enabled' do
- it_behaves_like 'before first deployment' do
- let(:project) { create(:project) }
- let(:cluster) { create(:cluster, :instance, :provided_by_gcp, enabled: true) }
- end
- end
-
- context 'when project level cluster is present, but disabled' do
- let(:cluster) { create(:cluster, :project, :provided_by_gcp, enabled: false) }
- let(:project) { cluster.project }
- let(:service) { cluster.platform_kubernetes }
- let(:deployment) { nil }
-
- it 'returns false even if Knative is installed on cluster' do
- stub_kubeclient_discover_knative_found(service.api_url)
- function_finder = described_class.new(project)
- synchronous_reactive_cache(function_finder)
-
- expect(function_finder.knative_installed).to be false
- end
- end
- end
-
- context 'when reactive_caching is still fetching data' do
- it 'returns "checking"' do
- expect(described_class.new(project).knative_installed).to eq 'checking'
- end
- end
-
- context 'when reactive_caching has finished' do
- before do
- allow(Clusters::KnativeServicesFinder)
- .to receive(:new)
- .and_return(knative_services_finder)
- synchronous_reactive_cache(knative_services_finder)
- end
-
- context 'when knative is not installed' do
- it 'returns false' do
- stub_kubeclient_discover_knative_not_found(service.api_url)
-
- expect(described_class.new(project).knative_installed).to eq false
- end
- end
-
- context 'reactive_caching is finished and knative is installed' do
- it 'returns true' do
- stub_kubeclient_knative_services(namespace: namespace.namespace)
- stub_kubeclient_service_pods(nil, namespace: namespace.namespace)
-
- expect(described_class.new(project).knative_installed).to be true
- end
- end
- end
- end
-
- describe 'retrieve data from knative' do
- context 'does not have knative installed' do
- it { expect(described_class.new(project).execute).to be_empty }
- end
-
- context 'has knative installed' do
- let!(:knative) { create(:clusters_applications_knative, :installed, cluster: cluster) }
- let(:finder) { described_class.new(project) }
-
- it 'there are no functions' do
- expect(finder.execute).to be_empty
- end
-
- it 'there are functions', :use_clean_rails_memory_store_caching do
- stub_kubeclient_service_pods
- stub_reactive_cache(knative_services_finder,
- {
- services: kube_knative_services_body(namespace: namespace.namespace, name: cluster.project.name)["items"],
- pods: kube_knative_pods_body(cluster.project.name, namespace.namespace)["items"]
- },
- *knative_services_finder.cache_args)
-
- expect(finder.execute).not_to be_empty
- end
-
- it 'has a function', :use_clean_rails_memory_store_caching do
- stub_kubeclient_service_pods
- stub_reactive_cache(knative_services_finder,
- {
- services: kube_knative_services_body(namespace: namespace.namespace, name: cluster.project.name)["items"],
- pods: kube_knative_pods_body(cluster.project.name, namespace.namespace)["items"]
- },
- *knative_services_finder.cache_args)
-
- result = finder.service(cluster.environment_scope, cluster.project.name)
- expect(result).to be_present
- expect(result.name).to be_eql(cluster.project.name)
- end
-
- it 'has metrics', :use_clean_rails_memory_store_caching do
- end
- end
-
- context 'has prometheus' do
- let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) }
- let!(:knative) { create(:clusters_applications_knative, :installed, cluster: cluster) }
- let!(:prometheus) { create(:clusters_integrations_prometheus, cluster: cluster) }
- let(:finder) { described_class.new(project) }
-
- before do
- allow(Gitlab::Prometheus::Adapter).to receive(:new).and_return(double(prometheus_adapter: prometheus_adapter))
- allow(prometheus_adapter).to receive(:query).and_return(prometheus_empty_body('matrix'))
- end
-
- it 'is available' do
- expect(finder.has_prometheus?("*")).to be true
- end
-
- it 'has query data' do
- expect(finder.invocation_metrics("*", cluster.project.name)).not_to be_nil
- end
- end
- end
-end
diff --git a/spec/finders/releases_finder_spec.rb b/spec/finders/releases_finder_spec.rb
index b0fa1177245..858a0e566f6 100644
--- a/spec/finders/releases_finder_spec.rb
+++ b/spec/finders/releases_finder_spec.rb
@@ -107,130 +107,4 @@ RSpec.describe ReleasesFinder do
it_behaves_like 'when a tag parameter is passed'
end
end
-
- describe 'when parent is a group' do
- context 'without subgroups' do
- let(:project2) { create(:project, :repository, namespace: group) }
- let!(:v6) { create(:release, project: project2, tag: 'v6') }
-
- subject { described_class.new(group, user, params).execute(**args) }
-
- it_behaves_like 'when the user is not part of the group'
-
- context 'when the user is a project guest on one sibling project' do
- before do
- project.add_guest(user)
- v1_0_0.update_attribute(:released_at, 3.days.ago)
- v1_1_0.update_attribute(:released_at, 1.day.ago)
- end
-
- it 'does not return any releases' do
- expect(subject.size).to eq(0)
- expect(subject).to eq([])
- end
- end
-
- context 'when the user is a guest on the group' do
- before do
- group.add_guest(user)
- v1_0_0.update_attribute(:released_at, 3.days.ago)
- v6.update_attribute(:released_at, 2.days.ago)
- v1_1_0.update_attribute(:released_at, 1.day.ago)
- end
-
- it 'sorts by release date' do
- expect(subject.size).to eq(3)
- expect(subject).to eq([v1_1_0, v6, v1_0_0])
- end
-
- it_behaves_like 'when a tag parameter is passed'
- end
- end
-
- describe 'with subgroups' do
- let(:params) { { include_subgroups: true } }
-
- subject { described_class.new(group, user, params).execute(**args) }
-
- context 'with a single-level subgroup' do
- let(:subgroup) { create :group, parent: group }
- let(:project2) { create(:project, :repository, namespace: subgroup) }
- let!(:v6) { create(:release, project: project2, tag: 'v6') }
-
- it_behaves_like 'when the user is not part of the group'
-
- context 'when the user a project guest in the subgroup project' do
- before do
- project2.add_guest(user)
- end
-
- it 'does not return any releases' do
- expect(subject).to match_array([])
- end
- end
-
- context 'when the user is a guest on the group' do
- before do
- group.add_guest(user)
- v6.update_attribute(:released_at, 2.days.ago)
- end
-
- it 'returns all releases' do
- expect(subject).to match_array([v1_1_0, v1_0_0, v6])
- end
-
- it_behaves_like 'when a tag parameter is passed'
- end
- end
-
- context 'with a multi-level subgroup' do
- let(:subgroup) { create :group, parent: group }
- let(:subsubgroup) { create :group, parent: subgroup }
- let(:project2) { create(:project, :repository, namespace: subgroup) }
- let(:project3) { create(:project, :repository, namespace: subsubgroup) }
- let!(:v6) { create(:release, project: project2, tag: 'v6') }
- let!(:p3) { create(:release, project: project3, tag: 'p3') }
-
- before do
- v6.update_attribute(:released_at, 2.days.ago)
- p3.update_attribute(:released_at, 3.days.ago)
- end
-
- it_behaves_like 'when the user is not part of the group'
-
- context 'when the user a project guest in the subgroup and subsubgroup project' do
- before do
- project2.add_guest(user)
- project3.add_guest(user)
- end
-
- it 'does not return any releases' do
- expect(subject).to match_array([])
- end
- end
-
- context 'when the user a project guest in the subsubgroup project' do
- before do
- project3.add_guest(user)
- end
-
- it 'does not return any releases' do
- expect(subject).to match_array([])
- end
- end
-
- context 'when the user a guest on the group' do
- before do
- group.add_guest(user)
- end
-
- it 'returns all releases' do
- expect(subject).to match_array([v1_1_0, v6, v1_0_0, p3])
- end
-
- it_behaves_like 'when a tag parameter is passed'
- end
- end
- end
- end
end
diff --git a/spec/fixtures/api/schemas/graphql/container_repository.json b/spec/fixtures/api/schemas/graphql/container_repository.json
index 04e67f73844..2bb598a14cb 100644
--- a/spec/fixtures/api/schemas/graphql/container_repository.json
+++ b/spec/fixtures/api/schemas/graphql/container_repository.json
@@ -1,6 +1,6 @@
{
"type": "object",
- "required": ["id", "name", "path", "location", "createdAt", "updatedAt", "tagsCount", "canDelete", "expirationPolicyCleanupStatus", "project"],
+ "required": ["id", "name", "path", "location", "createdAt", "updatedAt", "tagsCount", "canDelete", "expirationPolicyCleanupStatus", "project", "lastCleanupDeletedTagsCount"],
"properties": {
"id": {
"type": "string"
@@ -38,6 +38,9 @@
},
"project": {
"type": "object"
+ },
+ "lastCleanupDeletedTagsCount": {
+ "type": ["string", "null"]
}
}
}
diff --git a/spec/fixtures/api/schemas/public_api/v4/agent_token.json b/spec/fixtures/api/schemas/public_api/v4/agent_token.json
new file mode 100644
index 00000000000..8251ddd4de1
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agent_token.json
@@ -0,0 +1,24 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "description",
+ "agent_id",
+ "status",
+ "created_at",
+ "created_by_user_id",
+ "last_used_at"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "description": { "type": ["string", "null"] },
+ "agent_id": { "type": "integer" },
+ "status": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "created_by_user_id": { "type": "integer" },
+ "last_used_at": { "type": ["string", "null"], "format": "date-time" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/agent_token_basic.json b/spec/fixtures/api/schemas/public_api/v4/agent_token_basic.json
new file mode 100644
index 00000000000..90d9f35d0e1
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agent_token_basic.json
@@ -0,0 +1,22 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "description",
+ "agent_id",
+ "status",
+ "created_at",
+ "created_by_user_id"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "description": { "type": ["string", "null"] },
+ "agent_id": { "type": "integer" },
+ "status": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "created_by_user_id": { "type": "integer" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/agent_token_with_token.json b/spec/fixtures/api/schemas/public_api/v4/agent_token_with_token.json
new file mode 100644
index 00000000000..99d80817d0f
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agent_token_with_token.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "required": [
+ "id",
+ "name",
+ "description",
+ "agent_id",
+ "status",
+ "created_at",
+ "created_by_user_id",
+ "last_used_at",
+ "token"
+ ],
+ "properties": {
+ "id": { "type": "integer" },
+ "name": { "type": "string" },
+ "description": { "type": ["string", "null"] },
+ "agent_id": { "type": "integer" },
+ "status": { "type": "string" },
+ "created_at": { "type": "string", "format": "date-time" },
+ "created_by_user_id": { "type": "integer" },
+ "last_used_at": { "type": ["string", "null"], "format": "date-time" },
+ "token": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/agent_tokens.json b/spec/fixtures/api/schemas/public_api/v4/agent_tokens.json
new file mode 100644
index 00000000000..f3d14d09b3d
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/agent_tokens.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "agent_token_basic.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/environment.json b/spec/fixtures/api/schemas/public_api/v4/environment.json
index 30104adaf5c..3a4c18343e3 100644
--- a/spec/fixtures/api/schemas/public_api/v4/environment.json
+++ b/spec/fixtures/api/schemas/public_api/v4/environment.json
@@ -4,6 +4,7 @@
"id",
"name",
"slug",
+ "tier",
"external_url",
"state",
"created_at",
@@ -13,6 +14,7 @@
"id": { "type": "integer" },
"name": { "type": "string" },
"slug": { "type": "string" },
+ "tier": { "type": "string" },
"external_url": { "$ref": "../../types/nullable_string.json" },
"last_deployment": {
"oneOf": [
diff --git a/spec/fixtures/glfm/example_snapshots/examples_index.yml b/spec/fixtures/glfm/example_snapshots/examples_index.yml
new file mode 100644
index 00000000000..98463a30cb6
--- /dev/null
+++ b/spec/fixtures/glfm/example_snapshots/examples_index.yml
@@ -0,0 +1,2020 @@
+---
+02_01__preliminaries__tabs__01:
+ spec_txt_example_position: 1
+ source_specification: commonmark
+02_01__preliminaries__tabs__02:
+ spec_txt_example_position: 2
+ source_specification: commonmark
+02_01__preliminaries__tabs__03:
+ spec_txt_example_position: 3
+ source_specification: commonmark
+02_01__preliminaries__tabs__04:
+ spec_txt_example_position: 4
+ source_specification: commonmark
+02_01__preliminaries__tabs__05:
+ spec_txt_example_position: 5
+ source_specification: commonmark
+02_01__preliminaries__tabs__06:
+ spec_txt_example_position: 6
+ source_specification: commonmark
+02_01__preliminaries__tabs__07:
+ spec_txt_example_position: 7
+ source_specification: commonmark
+02_01__preliminaries__tabs__08:
+ spec_txt_example_position: 8
+ source_specification: commonmark
+02_01__preliminaries__tabs__09:
+ spec_txt_example_position: 9
+ source_specification: commonmark
+02_01__preliminaries__tabs__10:
+ spec_txt_example_position: 10
+ source_specification: commonmark
+02_01__preliminaries__tabs__11:
+ spec_txt_example_position: 11
+ source_specification: commonmark
+03_01__blocks_and_inlines__precedence__01:
+ spec_txt_example_position: 12
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__01:
+ spec_txt_example_position: 13
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__02:
+ spec_txt_example_position: 14
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__03:
+ spec_txt_example_position: 15
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__04:
+ spec_txt_example_position: 16
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__05:
+ spec_txt_example_position: 17
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__06:
+ spec_txt_example_position: 18
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__07:
+ spec_txt_example_position: 19
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__08:
+ spec_txt_example_position: 20
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__09:
+ spec_txt_example_position: 21
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__10:
+ spec_txt_example_position: 22
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__11:
+ spec_txt_example_position: 23
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__12:
+ spec_txt_example_position: 24
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__13:
+ spec_txt_example_position: 25
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__14:
+ spec_txt_example_position: 26
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__15:
+ spec_txt_example_position: 27
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__16:
+ spec_txt_example_position: 28
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__17:
+ spec_txt_example_position: 29
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__18:
+ spec_txt_example_position: 30
+ source_specification: commonmark
+04_01__leaf_blocks__thematic_breaks__19:
+ spec_txt_example_position: 31
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__01:
+ spec_txt_example_position: 32
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__02:
+ spec_txt_example_position: 33
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__03:
+ spec_txt_example_position: 34
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__04:
+ spec_txt_example_position: 35
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__05:
+ spec_txt_example_position: 36
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__06:
+ spec_txt_example_position: 37
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__07:
+ spec_txt_example_position: 38
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__08:
+ spec_txt_example_position: 39
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__09:
+ spec_txt_example_position: 40
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__10:
+ spec_txt_example_position: 41
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__11:
+ spec_txt_example_position: 42
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__12:
+ spec_txt_example_position: 43
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__13:
+ spec_txt_example_position: 44
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__14:
+ spec_txt_example_position: 45
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__15:
+ spec_txt_example_position: 46
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__16:
+ spec_txt_example_position: 47
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__17:
+ spec_txt_example_position: 48
+ source_specification: commonmark
+04_02__leaf_blocks__atx_headings__18:
+ spec_txt_example_position: 49
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__01:
+ spec_txt_example_position: 50
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__02:
+ spec_txt_example_position: 51
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__03:
+ spec_txt_example_position: 52
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__04:
+ spec_txt_example_position: 53
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__05:
+ spec_txt_example_position: 54
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__06:
+ spec_txt_example_position: 55
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__07:
+ spec_txt_example_position: 56
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__08:
+ spec_txt_example_position: 57
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__09:
+ spec_txt_example_position: 58
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__10:
+ spec_txt_example_position: 59
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__11:
+ spec_txt_example_position: 60
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__12:
+ spec_txt_example_position: 61
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__13:
+ spec_txt_example_position: 62
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__14:
+ spec_txt_example_position: 63
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__15:
+ spec_txt_example_position: 64
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__16:
+ spec_txt_example_position: 65
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__17:
+ spec_txt_example_position: 66
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__18:
+ spec_txt_example_position: 67
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__19:
+ spec_txt_example_position: 68
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__20:
+ spec_txt_example_position: 69
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__21:
+ spec_txt_example_position: 70
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__22:
+ spec_txt_example_position: 71
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__23:
+ spec_txt_example_position: 72
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__24:
+ spec_txt_example_position: 73
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__25:
+ spec_txt_example_position: 74
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__26:
+ spec_txt_example_position: 75
+ source_specification: commonmark
+04_03__leaf_blocks__setext_headings__27:
+ spec_txt_example_position: 76
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__01:
+ spec_txt_example_position: 77
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__02:
+ spec_txt_example_position: 78
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__03:
+ spec_txt_example_position: 79
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__04:
+ spec_txt_example_position: 80
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__05:
+ spec_txt_example_position: 81
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__06:
+ spec_txt_example_position: 82
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__07:
+ spec_txt_example_position: 83
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__08:
+ spec_txt_example_position: 84
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__09:
+ spec_txt_example_position: 85
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__10:
+ spec_txt_example_position: 86
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__11:
+ spec_txt_example_position: 87
+ source_specification: commonmark
+04_04__leaf_blocks__indented_code_blocks__12:
+ spec_txt_example_position: 88
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__01:
+ spec_txt_example_position: 89
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__02:
+ spec_txt_example_position: 90
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__03:
+ spec_txt_example_position: 91
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__04:
+ spec_txt_example_position: 92
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__05:
+ spec_txt_example_position: 93
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__06:
+ spec_txt_example_position: 94
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__07:
+ spec_txt_example_position: 95
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__08:
+ spec_txt_example_position: 96
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__09:
+ spec_txt_example_position: 97
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__10:
+ spec_txt_example_position: 98
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__11:
+ spec_txt_example_position: 99
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__12:
+ spec_txt_example_position: 100
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__13:
+ spec_txt_example_position: 101
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__14:
+ spec_txt_example_position: 102
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__15:
+ spec_txt_example_position: 103
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__16:
+ spec_txt_example_position: 104
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__17:
+ spec_txt_example_position: 105
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__18:
+ spec_txt_example_position: 106
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__19:
+ spec_txt_example_position: 107
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__20:
+ spec_txt_example_position: 108
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__21:
+ spec_txt_example_position: 109
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__22:
+ spec_txt_example_position: 110
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__23:
+ spec_txt_example_position: 111
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__24:
+ spec_txt_example_position: 112
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__25:
+ spec_txt_example_position: 113
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__26:
+ spec_txt_example_position: 114
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__27:
+ spec_txt_example_position: 115
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__28:
+ spec_txt_example_position: 116
+ source_specification: commonmark
+04_05__leaf_blocks__fenced_code_blocks__29:
+ spec_txt_example_position: 117
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__01:
+ spec_txt_example_position: 118
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__02:
+ spec_txt_example_position: 119
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__03:
+ spec_txt_example_position: 120
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__04:
+ spec_txt_example_position: 121
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__05:
+ spec_txt_example_position: 122
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__06:
+ spec_txt_example_position: 123
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__07:
+ spec_txt_example_position: 124
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__08:
+ spec_txt_example_position: 125
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__09:
+ spec_txt_example_position: 126
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__10:
+ spec_txt_example_position: 127
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__11:
+ spec_txt_example_position: 128
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__12:
+ spec_txt_example_position: 129
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__13:
+ spec_txt_example_position: 130
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__14:
+ spec_txt_example_position: 131
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__15:
+ spec_txt_example_position: 132
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__16:
+ spec_txt_example_position: 133
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__17:
+ spec_txt_example_position: 134
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__18:
+ spec_txt_example_position: 135
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__19:
+ spec_txt_example_position: 136
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__20:
+ spec_txt_example_position: 137
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__21:
+ spec_txt_example_position: 138
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__22:
+ spec_txt_example_position: 139
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__23:
+ spec_txt_example_position: 140
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__24:
+ spec_txt_example_position: 141
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__25:
+ spec_txt_example_position: 142
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__26:
+ spec_txt_example_position: 143
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__27:
+ spec_txt_example_position: 144
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__28:
+ spec_txt_example_position: 145
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__29:
+ spec_txt_example_position: 146
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__30:
+ spec_txt_example_position: 147
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__31:
+ spec_txt_example_position: 148
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__32:
+ spec_txt_example_position: 149
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__33:
+ spec_txt_example_position: 150
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__34:
+ spec_txt_example_position: 151
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__35:
+ spec_txt_example_position: 152
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__36:
+ spec_txt_example_position: 153
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__37:
+ spec_txt_example_position: 154
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__38:
+ spec_txt_example_position: 155
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__39:
+ spec_txt_example_position: 156
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__40:
+ spec_txt_example_position: 157
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__41:
+ spec_txt_example_position: 158
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__42:
+ spec_txt_example_position: 159
+ source_specification: commonmark
+04_06__leaf_blocks__html_blocks__43:
+ spec_txt_example_position: 160
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__01:
+ spec_txt_example_position: 161
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__02:
+ spec_txt_example_position: 162
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__03:
+ spec_txt_example_position: 163
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__04:
+ spec_txt_example_position: 164
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__05:
+ spec_txt_example_position: 165
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__06:
+ spec_txt_example_position: 166
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__07:
+ spec_txt_example_position: 167
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__08:
+ spec_txt_example_position: 168
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__09:
+ spec_txt_example_position: 169
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__10:
+ spec_txt_example_position: 170
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__11:
+ spec_txt_example_position: 171
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__12:
+ spec_txt_example_position: 172
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__13:
+ spec_txt_example_position: 173
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__14:
+ spec_txt_example_position: 174
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__15:
+ spec_txt_example_position: 175
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__16:
+ spec_txt_example_position: 176
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__17:
+ spec_txt_example_position: 177
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__18:
+ spec_txt_example_position: 178
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__19:
+ spec_txt_example_position: 179
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__20:
+ spec_txt_example_position: 180
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__21:
+ spec_txt_example_position: 181
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__22:
+ spec_txt_example_position: 182
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__23:
+ spec_txt_example_position: 183
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__24:
+ spec_txt_example_position: 184
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__25:
+ spec_txt_example_position: 185
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__26:
+ spec_txt_example_position: 186
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__27:
+ spec_txt_example_position: 187
+ source_specification: commonmark
+04_07__leaf_blocks__link_reference_definitions__28:
+ spec_txt_example_position: 188
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__01:
+ spec_txt_example_position: 189
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__02:
+ spec_txt_example_position: 190
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__03:
+ spec_txt_example_position: 191
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__04:
+ spec_txt_example_position: 192
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__05:
+ spec_txt_example_position: 193
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__06:
+ spec_txt_example_position: 194
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__07:
+ spec_txt_example_position: 195
+ source_specification: commonmark
+04_08__leaf_blocks__paragraphs__08:
+ spec_txt_example_position: 196
+ source_specification: commonmark
+04_09__leaf_blocks__blank_lines__01:
+ spec_txt_example_position: 197
+ source_specification: commonmark
+04_10__leaf_blocks__tables_extension__01:
+ spec_txt_example_position: 198
+ source_specification: github
+04_10__leaf_blocks__tables_extension__02:
+ spec_txt_example_position: 199
+ source_specification: github
+04_10__leaf_blocks__tables_extension__03:
+ spec_txt_example_position: 200
+ source_specification: github
+04_10__leaf_blocks__tables_extension__04:
+ spec_txt_example_position: 201
+ source_specification: github
+04_10__leaf_blocks__tables_extension__05:
+ spec_txt_example_position: 202
+ source_specification: github
+04_10__leaf_blocks__tables_extension__06:
+ spec_txt_example_position: 203
+ source_specification: github
+04_10__leaf_blocks__tables_extension__07:
+ spec_txt_example_position: 204
+ source_specification: github
+04_10__leaf_blocks__tables_extension__08:
+ spec_txt_example_position: 205
+ source_specification: github
+05_01__container_blocks__block_quotes__01:
+ spec_txt_example_position: 206
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__02:
+ spec_txt_example_position: 207
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__03:
+ spec_txt_example_position: 208
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__04:
+ spec_txt_example_position: 209
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__05:
+ spec_txt_example_position: 210
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__06:
+ spec_txt_example_position: 211
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__07:
+ spec_txt_example_position: 212
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__08:
+ spec_txt_example_position: 213
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__09:
+ spec_txt_example_position: 214
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__10:
+ spec_txt_example_position: 215
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__11:
+ spec_txt_example_position: 216
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__12:
+ spec_txt_example_position: 217
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__13:
+ spec_txt_example_position: 218
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__14:
+ spec_txt_example_position: 219
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__15:
+ spec_txt_example_position: 220
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__16:
+ spec_txt_example_position: 221
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__17:
+ spec_txt_example_position: 222
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__18:
+ spec_txt_example_position: 223
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__19:
+ spec_txt_example_position: 224
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__20:
+ spec_txt_example_position: 225
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__21:
+ spec_txt_example_position: 226
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__22:
+ spec_txt_example_position: 227
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__23:
+ spec_txt_example_position: 228
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__24:
+ spec_txt_example_position: 229
+ source_specification: commonmark
+05_01__container_blocks__block_quotes__25:
+ spec_txt_example_position: 230
+ source_specification: commonmark
+05_02__container_blocks__list_items__01:
+ spec_txt_example_position: 231
+ source_specification: commonmark
+05_02__container_blocks__list_items__02:
+ spec_txt_example_position: 232
+ source_specification: commonmark
+05_02__container_blocks__list_items__03:
+ spec_txt_example_position: 233
+ source_specification: commonmark
+05_02__container_blocks__list_items__04:
+ spec_txt_example_position: 234
+ source_specification: commonmark
+05_02__container_blocks__list_items__05:
+ spec_txt_example_position: 235
+ source_specification: commonmark
+05_02__container_blocks__list_items__06:
+ spec_txt_example_position: 236
+ source_specification: commonmark
+05_02__container_blocks__list_items__07:
+ spec_txt_example_position: 237
+ source_specification: commonmark
+05_02__container_blocks__list_items__08:
+ spec_txt_example_position: 238
+ source_specification: commonmark
+05_02__container_blocks__list_items__09:
+ spec_txt_example_position: 239
+ source_specification: commonmark
+05_02__container_blocks__list_items__10:
+ spec_txt_example_position: 240
+ source_specification: commonmark
+05_02__container_blocks__list_items__11:
+ spec_txt_example_position: 241
+ source_specification: commonmark
+05_02__container_blocks__list_items__12:
+ spec_txt_example_position: 242
+ source_specification: commonmark
+05_02__container_blocks__list_items__13:
+ spec_txt_example_position: 243
+ source_specification: commonmark
+05_02__container_blocks__list_items__14:
+ spec_txt_example_position: 244
+ source_specification: commonmark
+05_02__container_blocks__list_items__15:
+ spec_txt_example_position: 245
+ source_specification: commonmark
+05_02__container_blocks__list_items__16:
+ spec_txt_example_position: 246
+ source_specification: commonmark
+05_02__container_blocks__list_items__17:
+ spec_txt_example_position: 247
+ source_specification: commonmark
+05_02__container_blocks__list_items__18:
+ spec_txt_example_position: 248
+ source_specification: commonmark
+05_02__container_blocks__list_items__19:
+ spec_txt_example_position: 249
+ source_specification: commonmark
+05_02__container_blocks__list_items__20:
+ spec_txt_example_position: 250
+ source_specification: commonmark
+05_02__container_blocks__list_items__21:
+ spec_txt_example_position: 251
+ source_specification: commonmark
+05_02__container_blocks__list_items__22:
+ spec_txt_example_position: 252
+ source_specification: commonmark
+05_02__container_blocks__list_items__23:
+ spec_txt_example_position: 253
+ source_specification: commonmark
+05_02__container_blocks__list_items__24:
+ spec_txt_example_position: 254
+ source_specification: commonmark
+05_02__container_blocks__list_items__25:
+ spec_txt_example_position: 255
+ source_specification: commonmark
+05_02__container_blocks__list_items__26:
+ spec_txt_example_position: 256
+ source_specification: commonmark
+05_02__container_blocks__list_items__27:
+ spec_txt_example_position: 257
+ source_specification: commonmark
+05_02__container_blocks__list_items__28:
+ spec_txt_example_position: 258
+ source_specification: commonmark
+05_02__container_blocks__list_items__29:
+ spec_txt_example_position: 259
+ source_specification: commonmark
+05_02__container_blocks__list_items__30:
+ spec_txt_example_position: 260
+ source_specification: commonmark
+05_02__container_blocks__list_items__31:
+ spec_txt_example_position: 261
+ source_specification: commonmark
+05_02__container_blocks__list_items__32:
+ spec_txt_example_position: 262
+ source_specification: commonmark
+05_02__container_blocks__list_items__33:
+ spec_txt_example_position: 263
+ source_specification: commonmark
+05_02__container_blocks__list_items__34:
+ spec_txt_example_position: 264
+ source_specification: commonmark
+05_02__container_blocks__list_items__35:
+ spec_txt_example_position: 265
+ source_specification: commonmark
+05_02__container_blocks__list_items__36:
+ spec_txt_example_position: 266
+ source_specification: commonmark
+05_02__container_blocks__list_items__37:
+ spec_txt_example_position: 267
+ source_specification: commonmark
+05_02__container_blocks__list_items__38:
+ spec_txt_example_position: 268
+ source_specification: commonmark
+05_02__container_blocks__list_items__39:
+ spec_txt_example_position: 269
+ source_specification: commonmark
+05_02__container_blocks__list_items__40:
+ spec_txt_example_position: 270
+ source_specification: commonmark
+05_02__container_blocks__list_items__41:
+ spec_txt_example_position: 271
+ source_specification: commonmark
+05_02__container_blocks__list_items__42:
+ spec_txt_example_position: 272
+ source_specification: commonmark
+05_02__container_blocks__list_items__43:
+ spec_txt_example_position: 273
+ source_specification: commonmark
+05_02__container_blocks__list_items__44:
+ spec_txt_example_position: 274
+ source_specification: commonmark
+05_02__container_blocks__list_items__45:
+ spec_txt_example_position: 275
+ source_specification: commonmark
+05_02__container_blocks__list_items__46:
+ spec_txt_example_position: 276
+ source_specification: commonmark
+05_02__container_blocks__list_items__47:
+ spec_txt_example_position: 277
+ source_specification: commonmark
+05_02__container_blocks__list_items__48:
+ spec_txt_example_position: 278
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__49:
+ spec_txt_example_position: 281
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__50:
+ spec_txt_example_position: 282
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__51:
+ spec_txt_example_position: 283
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__52:
+ spec_txt_example_position: 284
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__53:
+ spec_txt_example_position: 285
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__54:
+ spec_txt_example_position: 286
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__55:
+ spec_txt_example_position: 287
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__56:
+ spec_txt_example_position: 288
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__57:
+ spec_txt_example_position: 289
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__58:
+ spec_txt_example_position: 290
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__59:
+ spec_txt_example_position: 291
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__60:
+ spec_txt_example_position: 292
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__61:
+ spec_txt_example_position: 293
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__62:
+ spec_txt_example_position: 294
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__63:
+ spec_txt_example_position: 295
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__64:
+ spec_txt_example_position: 296
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__65:
+ spec_txt_example_position: 297
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__66:
+ spec_txt_example_position: 298
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__67:
+ spec_txt_example_position: 299
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__68:
+ spec_txt_example_position: 300
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__69:
+ spec_txt_example_position: 301
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__70:
+ spec_txt_example_position: 302
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__71:
+ spec_txt_example_position: 303
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__72:
+ spec_txt_example_position: 304
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__73:
+ spec_txt_example_position: 305
+ source_specification: commonmark
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__74:
+ spec_txt_example_position: 306
+ source_specification: commonmark
+06_01__inlines__01:
+ spec_txt_example_position: 307
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__01:
+ spec_txt_example_position: 308
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__02:
+ spec_txt_example_position: 309
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__03:
+ spec_txt_example_position: 310
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__04:
+ spec_txt_example_position: 311
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__05:
+ spec_txt_example_position: 312
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__06:
+ spec_txt_example_position: 313
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__07:
+ spec_txt_example_position: 314
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__08:
+ spec_txt_example_position: 315
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__09:
+ spec_txt_example_position: 316
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__10:
+ spec_txt_example_position: 317
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__11:
+ spec_txt_example_position: 318
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__12:
+ spec_txt_example_position: 319
+ source_specification: commonmark
+06_02__inlines__backslash_escapes__13:
+ spec_txt_example_position: 320
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__01:
+ spec_txt_example_position: 321
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__02:
+ spec_txt_example_position: 322
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__03:
+ spec_txt_example_position: 323
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__04:
+ spec_txt_example_position: 324
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__05:
+ spec_txt_example_position: 325
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__06:
+ spec_txt_example_position: 326
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__07:
+ spec_txt_example_position: 327
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__08:
+ spec_txt_example_position: 328
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__09:
+ spec_txt_example_position: 329
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__10:
+ spec_txt_example_position: 330
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__11:
+ spec_txt_example_position: 331
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__12:
+ spec_txt_example_position: 332
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__13:
+ spec_txt_example_position: 333
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__14:
+ spec_txt_example_position: 334
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__15:
+ spec_txt_example_position: 335
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__16:
+ spec_txt_example_position: 336
+ source_specification: commonmark
+06_03__inlines__entity_and_numeric_character_references__17:
+ spec_txt_example_position: 337
+ source_specification: commonmark
+06_04__inlines__code_spans__01:
+ spec_txt_example_position: 338
+ source_specification: commonmark
+06_04__inlines__code_spans__02:
+ spec_txt_example_position: 339
+ source_specification: commonmark
+06_04__inlines__code_spans__03:
+ spec_txt_example_position: 340
+ source_specification: commonmark
+06_04__inlines__code_spans__04:
+ spec_txt_example_position: 341
+ source_specification: commonmark
+06_04__inlines__code_spans__05:
+ spec_txt_example_position: 342
+ source_specification: commonmark
+06_04__inlines__code_spans__06:
+ spec_txt_example_position: 343
+ source_specification: commonmark
+06_04__inlines__code_spans__07:
+ spec_txt_example_position: 344
+ source_specification: commonmark
+06_04__inlines__code_spans__08:
+ spec_txt_example_position: 345
+ source_specification: commonmark
+06_04__inlines__code_spans__09:
+ spec_txt_example_position: 346
+ source_specification: commonmark
+06_04__inlines__code_spans__10:
+ spec_txt_example_position: 347
+ source_specification: commonmark
+06_04__inlines__code_spans__11:
+ spec_txt_example_position: 348
+ source_specification: commonmark
+06_04__inlines__code_spans__12:
+ spec_txt_example_position: 349
+ source_specification: commonmark
+06_04__inlines__code_spans__13:
+ spec_txt_example_position: 350
+ source_specification: commonmark
+06_04__inlines__code_spans__14:
+ spec_txt_example_position: 351
+ source_specification: commonmark
+06_04__inlines__code_spans__15:
+ spec_txt_example_position: 352
+ source_specification: commonmark
+06_04__inlines__code_spans__16:
+ spec_txt_example_position: 353
+ source_specification: commonmark
+06_04__inlines__code_spans__17:
+ spec_txt_example_position: 354
+ source_specification: commonmark
+06_04__inlines__code_spans__18:
+ spec_txt_example_position: 355
+ source_specification: commonmark
+06_04__inlines__code_spans__19:
+ spec_txt_example_position: 356
+ source_specification: commonmark
+06_04__inlines__code_spans__20:
+ spec_txt_example_position: 357
+ source_specification: commonmark
+06_04__inlines__code_spans__21:
+ spec_txt_example_position: 358
+ source_specification: commonmark
+06_04__inlines__code_spans__22:
+ spec_txt_example_position: 359
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__01:
+ spec_txt_example_position: 360
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__02:
+ spec_txt_example_position: 361
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__03:
+ spec_txt_example_position: 362
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__04:
+ spec_txt_example_position: 363
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__05:
+ spec_txt_example_position: 364
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__06:
+ spec_txt_example_position: 365
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__07:
+ spec_txt_example_position: 366
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__08:
+ spec_txt_example_position: 367
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__09:
+ spec_txt_example_position: 368
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__10:
+ spec_txt_example_position: 369
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__11:
+ spec_txt_example_position: 370
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__12:
+ spec_txt_example_position: 371
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__13:
+ spec_txt_example_position: 372
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__14:
+ spec_txt_example_position: 373
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__15:
+ spec_txt_example_position: 374
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__16:
+ spec_txt_example_position: 375
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__17:
+ spec_txt_example_position: 376
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__18:
+ spec_txt_example_position: 377
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__19:
+ spec_txt_example_position: 378
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__20:
+ spec_txt_example_position: 379
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__21:
+ spec_txt_example_position: 380
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__22:
+ spec_txt_example_position: 381
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__23:
+ spec_txt_example_position: 382
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__24:
+ spec_txt_example_position: 383
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__25:
+ spec_txt_example_position: 384
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__26:
+ spec_txt_example_position: 385
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__27:
+ spec_txt_example_position: 386
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__28:
+ spec_txt_example_position: 387
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__29:
+ spec_txt_example_position: 388
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__30:
+ spec_txt_example_position: 389
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__31:
+ spec_txt_example_position: 390
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__32:
+ spec_txt_example_position: 391
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__33:
+ spec_txt_example_position: 392
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__34:
+ spec_txt_example_position: 393
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__35:
+ spec_txt_example_position: 394
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__36:
+ spec_txt_example_position: 395
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__37:
+ spec_txt_example_position: 396
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__38:
+ spec_txt_example_position: 397
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__39:
+ spec_txt_example_position: 398
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__40:
+ spec_txt_example_position: 399
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__41:
+ spec_txt_example_position: 400
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__42:
+ spec_txt_example_position: 401
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__43:
+ spec_txt_example_position: 402
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__44:
+ spec_txt_example_position: 403
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__45:
+ spec_txt_example_position: 404
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__46:
+ spec_txt_example_position: 405
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__47:
+ spec_txt_example_position: 406
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__48:
+ spec_txt_example_position: 407
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__49:
+ spec_txt_example_position: 408
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__50:
+ spec_txt_example_position: 409
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__51:
+ spec_txt_example_position: 410
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__52:
+ spec_txt_example_position: 411
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__53:
+ spec_txt_example_position: 412
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__54:
+ spec_txt_example_position: 413
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__55:
+ spec_txt_example_position: 414
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__56:
+ spec_txt_example_position: 415
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__57:
+ spec_txt_example_position: 416
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__58:
+ spec_txt_example_position: 417
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__59:
+ spec_txt_example_position: 418
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__60:
+ spec_txt_example_position: 419
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__61:
+ spec_txt_example_position: 420
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__62:
+ spec_txt_example_position: 421
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__63:
+ spec_txt_example_position: 422
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__64:
+ spec_txt_example_position: 423
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__65:
+ spec_txt_example_position: 424
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__66:
+ spec_txt_example_position: 425
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__67:
+ spec_txt_example_position: 426
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__68:
+ spec_txt_example_position: 427
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__69:
+ spec_txt_example_position: 428
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__70:
+ spec_txt_example_position: 429
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__71:
+ spec_txt_example_position: 430
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__72:
+ spec_txt_example_position: 431
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__73:
+ spec_txt_example_position: 432
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__74:
+ spec_txt_example_position: 433
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__75:
+ spec_txt_example_position: 434
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__76:
+ spec_txt_example_position: 435
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__77:
+ spec_txt_example_position: 436
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__78:
+ spec_txt_example_position: 437
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__79:
+ spec_txt_example_position: 438
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__80:
+ spec_txt_example_position: 439
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__81:
+ spec_txt_example_position: 440
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__82:
+ spec_txt_example_position: 441
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__83:
+ spec_txt_example_position: 442
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__84:
+ spec_txt_example_position: 443
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__85:
+ spec_txt_example_position: 444
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__86:
+ spec_txt_example_position: 445
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__87:
+ spec_txt_example_position: 446
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__88:
+ spec_txt_example_position: 447
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__89:
+ spec_txt_example_position: 448
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__90:
+ spec_txt_example_position: 449
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__91:
+ spec_txt_example_position: 450
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__92:
+ spec_txt_example_position: 451
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__93:
+ spec_txt_example_position: 452
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__94:
+ spec_txt_example_position: 453
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__95:
+ spec_txt_example_position: 454
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__96:
+ spec_txt_example_position: 455
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__97:
+ spec_txt_example_position: 456
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__98:
+ spec_txt_example_position: 457
+ source_specification: commonmark
+06_05__inlines__emphasis_and_strong_emphasis__99:
+ 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__01:
+ spec_txt_example_position: 491
+ source_specification: github
+06_06__inlines__strikethrough_extension__02:
+ spec_txt_example_position: 492
+ source_specification: github
+06_07__inlines__links__01:
+ spec_txt_example_position: 493
+ source_specification: commonmark
+06_07__inlines__links__02:
+ spec_txt_example_position: 494
+ source_specification: commonmark
+06_07__inlines__links__03:
+ spec_txt_example_position: 495
+ source_specification: commonmark
+06_07__inlines__links__04:
+ spec_txt_example_position: 496
+ source_specification: commonmark
+06_07__inlines__links__05:
+ spec_txt_example_position: 497
+ source_specification: commonmark
+06_07__inlines__links__06:
+ spec_txt_example_position: 498
+ source_specification: commonmark
+06_07__inlines__links__07:
+ spec_txt_example_position: 499
+ source_specification: commonmark
+06_07__inlines__links__08:
+ spec_txt_example_position: 500
+ source_specification: commonmark
+06_07__inlines__links__09:
+ spec_txt_example_position: 501
+ source_specification: commonmark
+06_07__inlines__links__10:
+ spec_txt_example_position: 502
+ source_specification: commonmark
+06_07__inlines__links__11:
+ spec_txt_example_position: 503
+ source_specification: commonmark
+06_07__inlines__links__12:
+ spec_txt_example_position: 504
+ source_specification: commonmark
+06_07__inlines__links__13:
+ spec_txt_example_position: 505
+ source_specification: commonmark
+06_07__inlines__links__14:
+ spec_txt_example_position: 506
+ source_specification: commonmark
+06_07__inlines__links__15:
+ spec_txt_example_position: 507
+ source_specification: commonmark
+06_07__inlines__links__16:
+ spec_txt_example_position: 508
+ source_specification: commonmark
+06_07__inlines__links__17:
+ spec_txt_example_position: 509
+ source_specification: commonmark
+06_07__inlines__links__18:
+ spec_txt_example_position: 510
+ source_specification: commonmark
+06_07__inlines__links__19:
+ spec_txt_example_position: 511
+ source_specification: commonmark
+06_07__inlines__links__20:
+ spec_txt_example_position: 512
+ source_specification: commonmark
+06_07__inlines__links__21:
+ spec_txt_example_position: 513
+ source_specification: commonmark
+06_07__inlines__links__22:
+ spec_txt_example_position: 514
+ source_specification: commonmark
+06_07__inlines__links__23:
+ spec_txt_example_position: 515
+ source_specification: commonmark
+06_07__inlines__links__24:
+ spec_txt_example_position: 516
+ source_specification: commonmark
+06_07__inlines__links__25:
+ spec_txt_example_position: 517
+ source_specification: commonmark
+06_07__inlines__links__26:
+ spec_txt_example_position: 518
+ source_specification: commonmark
+06_07__inlines__links__27:
+ spec_txt_example_position: 519
+ source_specification: commonmark
+06_07__inlines__links__28:
+ spec_txt_example_position: 520
+ source_specification: commonmark
+06_07__inlines__links__29:
+ spec_txt_example_position: 521
+ source_specification: commonmark
+06_07__inlines__links__30:
+ spec_txt_example_position: 522
+ source_specification: commonmark
+06_07__inlines__links__31:
+ spec_txt_example_position: 523
+ source_specification: commonmark
+06_07__inlines__links__32:
+ spec_txt_example_position: 524
+ source_specification: commonmark
+06_07__inlines__links__33:
+ spec_txt_example_position: 525
+ source_specification: commonmark
+06_07__inlines__links__34:
+ spec_txt_example_position: 526
+ source_specification: commonmark
+06_07__inlines__links__35:
+ spec_txt_example_position: 527
+ source_specification: commonmark
+06_07__inlines__links__36:
+ spec_txt_example_position: 528
+ source_specification: commonmark
+06_07__inlines__links__37:
+ spec_txt_example_position: 529
+ source_specification: commonmark
+06_07__inlines__links__38:
+ spec_txt_example_position: 530
+ source_specification: commonmark
+06_07__inlines__links__39:
+ spec_txt_example_position: 531
+ source_specification: commonmark
+06_07__inlines__links__40:
+ spec_txt_example_position: 532
+ source_specification: commonmark
+06_07__inlines__links__41:
+ spec_txt_example_position: 533
+ source_specification: commonmark
+06_07__inlines__links__42:
+ spec_txt_example_position: 534
+ source_specification: commonmark
+06_07__inlines__links__43:
+ spec_txt_example_position: 535
+ source_specification: commonmark
+06_07__inlines__links__44:
+ spec_txt_example_position: 536
+ source_specification: commonmark
+06_07__inlines__links__45:
+ spec_txt_example_position: 537
+ source_specification: commonmark
+06_07__inlines__links__46:
+ spec_txt_example_position: 538
+ source_specification: commonmark
+06_07__inlines__links__47:
+ spec_txt_example_position: 539
+ source_specification: commonmark
+06_07__inlines__links__48:
+ spec_txt_example_position: 540
+ source_specification: commonmark
+06_07__inlines__links__49:
+ spec_txt_example_position: 541
+ source_specification: commonmark
+06_07__inlines__links__50:
+ spec_txt_example_position: 542
+ source_specification: commonmark
+06_07__inlines__links__51:
+ spec_txt_example_position: 543
+ source_specification: commonmark
+06_07__inlines__links__52:
+ spec_txt_example_position: 544
+ source_specification: commonmark
+06_07__inlines__links__53:
+ spec_txt_example_position: 545
+ source_specification: commonmark
+06_07__inlines__links__54:
+ spec_txt_example_position: 546
+ source_specification: commonmark
+06_07__inlines__links__55:
+ spec_txt_example_position: 547
+ source_specification: commonmark
+06_07__inlines__links__56:
+ spec_txt_example_position: 548
+ source_specification: commonmark
+06_07__inlines__links__57:
+ spec_txt_example_position: 549
+ source_specification: commonmark
+06_07__inlines__links__58:
+ spec_txt_example_position: 550
+ source_specification: commonmark
+06_07__inlines__links__59:
+ spec_txt_example_position: 551
+ source_specification: commonmark
+06_07__inlines__links__60:
+ spec_txt_example_position: 552
+ source_specification: commonmark
+06_07__inlines__links__61:
+ spec_txt_example_position: 553
+ source_specification: commonmark
+06_07__inlines__links__62:
+ spec_txt_example_position: 554
+ source_specification: commonmark
+06_07__inlines__links__63:
+ spec_txt_example_position: 555
+ source_specification: commonmark
+06_07__inlines__links__64:
+ spec_txt_example_position: 556
+ source_specification: commonmark
+06_07__inlines__links__65:
+ spec_txt_example_position: 557
+ source_specification: commonmark
+06_07__inlines__links__66:
+ spec_txt_example_position: 558
+ source_specification: commonmark
+06_07__inlines__links__67:
+ spec_txt_example_position: 559
+ source_specification: commonmark
+06_07__inlines__links__68:
+ spec_txt_example_position: 560
+ source_specification: commonmark
+06_07__inlines__links__69:
+ spec_txt_example_position: 561
+ source_specification: commonmark
+06_07__inlines__links__70:
+ spec_txt_example_position: 562
+ source_specification: commonmark
+06_07__inlines__links__71:
+ spec_txt_example_position: 563
+ source_specification: commonmark
+06_07__inlines__links__72:
+ spec_txt_example_position: 564
+ source_specification: commonmark
+06_07__inlines__links__73:
+ spec_txt_example_position: 565
+ source_specification: commonmark
+06_07__inlines__links__74:
+ spec_txt_example_position: 566
+ source_specification: commonmark
+06_07__inlines__links__75:
+ spec_txt_example_position: 567
+ source_specification: commonmark
+06_07__inlines__links__76:
+ spec_txt_example_position: 568
+ source_specification: commonmark
+06_07__inlines__links__77:
+ spec_txt_example_position: 569
+ source_specification: commonmark
+06_07__inlines__links__78:
+ spec_txt_example_position: 570
+ source_specification: commonmark
+06_07__inlines__links__79:
+ spec_txt_example_position: 571
+ source_specification: commonmark
+06_07__inlines__links__80:
+ spec_txt_example_position: 572
+ source_specification: commonmark
+06_07__inlines__links__81:
+ spec_txt_example_position: 573
+ source_specification: commonmark
+06_07__inlines__links__82:
+ spec_txt_example_position: 574
+ source_specification: commonmark
+06_07__inlines__links__83:
+ spec_txt_example_position: 575
+ source_specification: commonmark
+06_07__inlines__links__84:
+ spec_txt_example_position: 576
+ source_specification: commonmark
+06_07__inlines__links__85:
+ spec_txt_example_position: 577
+ source_specification: commonmark
+06_07__inlines__links__86:
+ spec_txt_example_position: 578
+ source_specification: commonmark
+06_07__inlines__links__87:
+ spec_txt_example_position: 579
+ source_specification: commonmark
+06_08__inlines__images__01:
+ spec_txt_example_position: 580
+ source_specification: commonmark
+06_08__inlines__images__02:
+ spec_txt_example_position: 581
+ source_specification: commonmark
+06_08__inlines__images__03:
+ spec_txt_example_position: 582
+ source_specification: commonmark
+06_08__inlines__images__04:
+ spec_txt_example_position: 583
+ source_specification: commonmark
+06_08__inlines__images__05:
+ spec_txt_example_position: 584
+ source_specification: commonmark
+06_08__inlines__images__06:
+ spec_txt_example_position: 585
+ source_specification: commonmark
+06_08__inlines__images__07:
+ spec_txt_example_position: 586
+ source_specification: commonmark
+06_08__inlines__images__08:
+ spec_txt_example_position: 587
+ source_specification: commonmark
+06_08__inlines__images__09:
+ spec_txt_example_position: 588
+ source_specification: commonmark
+06_08__inlines__images__10:
+ spec_txt_example_position: 589
+ source_specification: commonmark
+06_08__inlines__images__11:
+ spec_txt_example_position: 590
+ source_specification: commonmark
+06_08__inlines__images__12:
+ spec_txt_example_position: 591
+ source_specification: commonmark
+06_08__inlines__images__13:
+ spec_txt_example_position: 592
+ source_specification: commonmark
+06_08__inlines__images__14:
+ spec_txt_example_position: 593
+ source_specification: commonmark
+06_08__inlines__images__15:
+ spec_txt_example_position: 594
+ source_specification: commonmark
+06_08__inlines__images__16:
+ spec_txt_example_position: 595
+ source_specification: commonmark
+06_08__inlines__images__17:
+ spec_txt_example_position: 596
+ source_specification: commonmark
+06_08__inlines__images__18:
+ spec_txt_example_position: 597
+ source_specification: commonmark
+06_08__inlines__images__19:
+ spec_txt_example_position: 598
+ source_specification: commonmark
+06_08__inlines__images__20:
+ spec_txt_example_position: 599
+ source_specification: commonmark
+06_08__inlines__images__21:
+ spec_txt_example_position: 600
+ source_specification: commonmark
+06_08__inlines__images__22:
+ spec_txt_example_position: 601
+ source_specification: commonmark
+06_09__inlines__autolinks__01:
+ spec_txt_example_position: 602
+ source_specification: commonmark
+06_09__inlines__autolinks__02:
+ spec_txt_example_position: 603
+ source_specification: commonmark
+06_09__inlines__autolinks__03:
+ spec_txt_example_position: 604
+ source_specification: commonmark
+06_09__inlines__autolinks__04:
+ spec_txt_example_position: 605
+ source_specification: commonmark
+06_09__inlines__autolinks__05:
+ spec_txt_example_position: 606
+ source_specification: commonmark
+06_09__inlines__autolinks__06:
+ spec_txt_example_position: 607
+ source_specification: commonmark
+06_09__inlines__autolinks__07:
+ spec_txt_example_position: 608
+ source_specification: commonmark
+06_09__inlines__autolinks__08:
+ spec_txt_example_position: 609
+ source_specification: commonmark
+06_09__inlines__autolinks__09:
+ spec_txt_example_position: 610
+ source_specification: commonmark
+06_09__inlines__autolinks__10:
+ spec_txt_example_position: 611
+ source_specification: commonmark
+06_09__inlines__autolinks__11:
+ spec_txt_example_position: 612
+ source_specification: commonmark
+06_09__inlines__autolinks__12:
+ spec_txt_example_position: 613
+ source_specification: commonmark
+06_09__inlines__autolinks__13:
+ spec_txt_example_position: 614
+ source_specification: commonmark
+06_09__inlines__autolinks__14:
+ spec_txt_example_position: 615
+ source_specification: commonmark
+06_09__inlines__autolinks__15:
+ spec_txt_example_position: 616
+ source_specification: commonmark
+06_09__inlines__autolinks__16:
+ spec_txt_example_position: 617
+ source_specification: commonmark
+06_09__inlines__autolinks__17:
+ spec_txt_example_position: 618
+ source_specification: commonmark
+06_09__inlines__autolinks__18:
+ spec_txt_example_position: 619
+ source_specification: commonmark
+06_09__inlines__autolinks__19:
+ spec_txt_example_position: 620
+ source_specification: commonmark
+06_10__inlines__autolinks_extension__01:
+ spec_txt_example_position: 621
+ source_specification: github
+06_10__inlines__autolinks_extension__02:
+ spec_txt_example_position: 622
+ source_specification: github
+06_10__inlines__autolinks_extension__03:
+ spec_txt_example_position: 623
+ source_specification: github
+06_10__inlines__autolinks_extension__04:
+ spec_txt_example_position: 624
+ source_specification: github
+06_10__inlines__autolinks_extension__05:
+ spec_txt_example_position: 625
+ source_specification: github
+06_10__inlines__autolinks_extension__06:
+ spec_txt_example_position: 626
+ source_specification: github
+06_10__inlines__autolinks_extension__07:
+ spec_txt_example_position: 627
+ source_specification: github
+06_10__inlines__autolinks_extension__08:
+ spec_txt_example_position: 628
+ source_specification: github
+06_10__inlines__autolinks_extension__09:
+ spec_txt_example_position: 629
+ source_specification: github
+06_10__inlines__autolinks_extension__10:
+ spec_txt_example_position: 630
+ source_specification: github
+06_10__inlines__autolinks_extension__11:
+ spec_txt_example_position: 631
+ source_specification: github
+06_11__inlines__raw_html__01:
+ spec_txt_example_position: 632
+ source_specification: commonmark
+06_11__inlines__raw_html__02:
+ spec_txt_example_position: 633
+ source_specification: commonmark
+06_11__inlines__raw_html__03:
+ spec_txt_example_position: 634
+ source_specification: commonmark
+06_11__inlines__raw_html__04:
+ spec_txt_example_position: 635
+ source_specification: commonmark
+06_11__inlines__raw_html__05:
+ spec_txt_example_position: 636
+ source_specification: commonmark
+06_11__inlines__raw_html__06:
+ spec_txt_example_position: 637
+ source_specification: commonmark
+06_11__inlines__raw_html__07:
+ spec_txt_example_position: 638
+ source_specification: commonmark
+06_11__inlines__raw_html__08:
+ spec_txt_example_position: 639
+ source_specification: commonmark
+06_11__inlines__raw_html__09:
+ spec_txt_example_position: 640
+ source_specification: commonmark
+06_11__inlines__raw_html__10:
+ spec_txt_example_position: 641
+ source_specification: commonmark
+06_11__inlines__raw_html__11:
+ spec_txt_example_position: 642
+ source_specification: commonmark
+06_11__inlines__raw_html__12:
+ spec_txt_example_position: 643
+ source_specification: commonmark
+06_11__inlines__raw_html__13:
+ spec_txt_example_position: 644
+ source_specification: commonmark
+06_11__inlines__raw_html__14:
+ spec_txt_example_position: 645
+ source_specification: commonmark
+06_11__inlines__raw_html__15:
+ spec_txt_example_position: 646
+ source_specification: commonmark
+06_11__inlines__raw_html__16:
+ spec_txt_example_position: 647
+ source_specification: commonmark
+06_11__inlines__raw_html__17:
+ spec_txt_example_position: 648
+ source_specification: commonmark
+06_11__inlines__raw_html__18:
+ spec_txt_example_position: 649
+ source_specification: commonmark
+06_11__inlines__raw_html__19:
+ spec_txt_example_position: 650
+ source_specification: commonmark
+06_11__inlines__raw_html__20:
+ spec_txt_example_position: 651
+ source_specification: commonmark
+06_11__inlines__raw_html__21:
+ spec_txt_example_position: 652
+ source_specification: commonmark
+06_12__inlines__disallowed_raw_html_extension__01:
+ spec_txt_example_position: 653
+ source_specification: github
+06_13__inlines__hard_line_breaks__01:
+ spec_txt_example_position: 654
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__02:
+ spec_txt_example_position: 655
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__03:
+ spec_txt_example_position: 656
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__04:
+ spec_txt_example_position: 657
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__05:
+ spec_txt_example_position: 658
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__06:
+ spec_txt_example_position: 659
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__07:
+ spec_txt_example_position: 660
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__08:
+ spec_txt_example_position: 661
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__09:
+ spec_txt_example_position: 662
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__10:
+ spec_txt_example_position: 663
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__11:
+ spec_txt_example_position: 664
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__12:
+ spec_txt_example_position: 665
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__13:
+ spec_txt_example_position: 666
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__14:
+ spec_txt_example_position: 667
+ source_specification: commonmark
+06_13__inlines__hard_line_breaks__15:
+ spec_txt_example_position: 668
+ source_specification: commonmark
+06_14__inlines__soft_line_breaks__01:
+ spec_txt_example_position: 669
+ source_specification: commonmark
+06_14__inlines__soft_line_breaks__02:
+ spec_txt_example_position: 670
+ source_specification: commonmark
+06_15__inlines__textual_content__01:
+ spec_txt_example_position: 671
+ source_specification: commonmark
+06_15__inlines__textual_content__02:
+ spec_txt_example_position: 672
+ source_specification: commonmark
+06_15__inlines__textual_content__03:
+ spec_txt_example_position: 673
+ source_specification: commonmark
+07_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01:
+ spec_txt_example_position: 674
+ source_specification: commonmark
+08_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01:
+ spec_txt_example_position: 675
+ source_specification: commonmark
diff --git a/spec/fixtures/glfm/example_snapshots/html.yml b/spec/fixtures/glfm/example_snapshots/html.yml
new file mode 100644
index 00000000000..a536b5a4834
--- /dev/null
+++ b/spec/fixtures/glfm/example_snapshots/html.yml
@@ -0,0 +1,6097 @@
+---
+02_01__preliminaries__tabs__01:
+ canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">&#x000A;<pre
+ data-sourcepos=\"1:2-1:13\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" v-pre=\"true\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
+02_01__preliminaries__tabs__02:
+ canonical: "<pre><code>foo\tbaz\t\tbim\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">&#x000A;<pre
+ data-sourcepos=\"1:4-1:15\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" v-pre=\"true\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">foo\tbaz\t\tbim</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>foo\tbaz\t\tbim</code></pre>"
+02_01__preliminaries__tabs__03:
+ canonical: "<pre><code>a\ta\ná½\ta\n</code></pre>\n"
+ static: "<div class=\"gl-relative markdown-code-block js-markdown-code\">&#x000A;<pre
+ data-sourcepos=\"1:5-2:9\" class=\"code highlight js-syntax-highlight language-plaintext\"
+ lang=\"plaintext\" v-pre=\"true\"><code><span id=\"LC1\" class=\"line\" lang=\"plaintext\">a\ta</span>&#x000A;<span
+ id=\"LC2\" class=\"line\" lang=\"plaintext\">á½\ta</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>"
+ wysiwyg: "<pre class=\"content-editor-code-block undefined code highlight\"><code>a\ta\ná½\ta</code></pre>"
+02_01__preliminaries__tabs__04:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:3-3:4" dir="auto">&#x000A;<li data-sourcepos="1:3-3:4">&#x000A;<p data-sourcepos="1:5-1:7">foo</p>&#x000A;<p data-sourcepos="3:2-3:4">bar</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+02_01__preliminaries__tabs__05:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <pre><code> bar
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">&#x000A;<li data-sourcepos="1:1-3:5">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:2-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__06:
+ canonical: |
+ <blockquote>
+ <pre><code> foo
+ </code></pre>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:6" dir="auto">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code> foo</code></pre></blockquote>
+02_01__preliminaries__tabs__07:
+ canonical: |
+ <ul>
+ <li>
+ <pre><code> foo
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:6" dir="auto">&#x000A;<li data-sourcepos="1:1-1:6">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:3-1:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__08:
+ canonical: |
+ <pre><code>foo
+ bar
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span>&#x000A;<span id="LC2" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo
+ bar</code></pre>
+02_01__preliminaries__tabs__09:
+ 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">&#x000A;<li data-sourcepos="1:2-3:7">foo&#x000A;<ul data-sourcepos="2:4-3:7">&#x000A;<li data-sourcepos="2:4-3:7">bar&#x000A;<ul data-sourcepos="3:3-3:7">&#x000A;<li data-sourcepos="3:3-3:7">baz</li>&#x000A;</ul>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__10:
+ canonical: |
+ <h1>Foo</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:5" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>
+ wysiwyg: |-
+ <h1>Foo</h1>
+02_01__preliminaries__tabs__11:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:6">
+ wysiwyg: |-
+ <hr>
+03_01__blocks_and_inlines__precedence__01:
+ canonical: |
+ <ul>
+ <li>`one</li>
+ <li>two`</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:6" dir="auto">&#x000A;<li data-sourcepos="1:1-1:6">`one</li>&#x000A;<li data-sourcepos="2:1-2:6">two`</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>`one</p></li><li><p>two`</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__01:
+ canonical: |
+ <hr />
+ <hr />
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:3">&#x000A;<hr data-sourcepos="2:1-2:3">&#x000A;<hr data-sourcepos="3:1-3:3">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__02:
+ canonical: |
+ <p>+++</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">+++</p>
+ wysiwyg: |-
+ <p>+++</p>
+04_01__leaf_blocks__thematic_breaks__03:
+ canonical: |
+ <p>===</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">===</p>
+ wysiwyg: |-
+ <p>===</p>
+04_01__leaf_blocks__thematic_breaks__04:
+ canonical: |
+ <p>--
+ **
+ __</p>
+ static: |-
+ <p data-sourcepos="1:1-3:2" dir="auto">--&#x000A;**&#x000A;__</p>
+ wysiwyg: |-
+ <p>--
+ **
+ __</p>
+04_01__leaf_blocks__thematic_breaks__05:
+ canonical: |
+ <hr />
+ <hr />
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:4">&#x000A;<hr data-sourcepos="2:3-2:5">&#x000A;<hr data-sourcepos="3:4-3:6">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__06:
+ canonical: |
+ <pre><code>***
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">***</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>***</code></pre>
+04_01__leaf_blocks__thematic_breaks__07:
+ canonical: |
+ <p>Foo
+ ***</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo&#x000A;***</p>
+ wysiwyg: |-
+ <p>Foo
+ ***</p>
+04_01__leaf_blocks__thematic_breaks__08:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:37">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__09:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:6">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__10:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:2-1:19">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__11:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:21">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__12:
+ canonical: |
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:11">
+ wysiwyg: |-
+ <hr>
+04_01__leaf_blocks__thematic_breaks__13:
+ canonical: |
+ <p>_ _ _ _ a</p>
+ <p>a------</p>
+ <p>---a---</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">_ _ _ _ a</p>&#x000A;<p data-sourcepos="3:1-3:7" dir="auto">a------</p>&#x000A;<p data-sourcepos="5:1-5:7" dir="auto">---a---</p>
+ wysiwyg: |-
+ <p>_ _ _ _ a</p>
+04_01__leaf_blocks__thematic_breaks__14:
+ 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__15:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <hr />
+ <ul>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;</ul>&#x000A;<hr data-sourcepos="2:1-2:3">&#x000A;<ul data-sourcepos="3:1-3:5" dir="auto">&#x000A;<li data-sourcepos="3:1-3:5">bar</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__16:
+ canonical: |
+ <p>Foo</p>
+ <hr />
+ <p>bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>&#x000A;<hr data-sourcepos="2:1-2:3">&#x000A;<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>Foo</p>
+04_01__leaf_blocks__thematic_breaks__17:
+ canonical: |
+ <h2>Foo</h2>
+ <p>bar</p>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>&#x000A;<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <h2>Foo</h2>
+04_01__leaf_blocks__thematic_breaks__18:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ </ul>
+ <hr />
+ <ul>
+ <li>Bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">Foo</li>&#x000A;</ul>&#x000A;<hr data-sourcepos="2:1-2:5">&#x000A;<ul data-sourcepos="3:1-3:5" dir="auto">&#x000A;<li data-sourcepos="3:1-3:5">Bar</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li></ul>
+04_01__leaf_blocks__thematic_breaks__19:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ <li>
+ <hr />
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:7" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">Foo</li>&#x000A;<li data-sourcepos="2:1-2:7">&#x000A;<hr data-sourcepos="2:3-2:7">&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li><li><p></p><hr></li></ul>
+04_02__leaf_blocks__atx_headings__01:
+ 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">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>&#x000A;<h2 data-sourcepos="2:1-2:6" dir="auto">&#x000A;<a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>&#x000A;<h3 data-sourcepos="3:1-3:7" dir="auto">&#x000A;<a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h3>&#x000A;<h4 data-sourcepos="4:1-4:8" dir="auto">&#x000A;<a id="user-content-foo-3" class="anchor" href="#foo-3" aria-hidden="true"></a>foo</h4>&#x000A;<h5 data-sourcepos="5:1-5:9" dir="auto">&#x000A;<a id="user-content-foo-4" class="anchor" href="#foo-4" aria-hidden="true"></a>foo</h5>&#x000A;<h6 data-sourcepos="6:1-6:10" dir="auto">&#x000A;<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__02:
+ 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__03:
+ canonical: |
+ <p>#5 bolt</p>
+ <p>#hashtag</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">#5 bolt</p>&#x000A;<p data-sourcepos="3:1-3:8" dir="auto">#hashtag</p>
+ wysiwyg: |-
+ <p>#5 bolt</p>
+04_02__leaf_blocks__atx_headings__04:
+ 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__05:
+ canonical: |
+ <h1>foo <em>bar</em> *baz*</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:19" dir="auto">&#x000A;<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__06:
+ canonical: |
+ <h1>foo</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:22" dir="auto">&#x000A;<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__07:
+ canonical: |
+ <h3>foo</h3>
+ <h2>foo</h2>
+ <h1>foo</h1>
+ static: |-
+ <h3 data-sourcepos="1:2-1:8" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h3>&#x000A;<h2 data-sourcepos="2:3-2:8" dir="auto">&#x000A;<a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h2>&#x000A;<h1 data-sourcepos="3:4-3:8" dir="auto">&#x000A;<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__08:
+ canonical: |
+ <pre><code># foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"># foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code># foo</code></pre>
+04_02__leaf_blocks__atx_headings__09:
+ canonical: |
+ <p>foo
+ # bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:9" dir="auto">foo&#x000A;# bar</p>
+ wysiwyg: |-
+ <p>foo
+ # bar</p>
+04_02__leaf_blocks__atx_headings__10:
+ canonical: |
+ <h2>foo</h2>
+ <h3>bar</h3>
+ static: |-
+ <h2 data-sourcepos="1:1-1:6" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>&#x000A;<h3 data-sourcepos="2:3-2:11" dir="auto">&#x000A;<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__11:
+ canonical: |
+ <h1>foo</h1>
+ <h5>foo</h5>
+ static: |-
+ <h1 data-sourcepos="1:1-1:5" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h1>&#x000A;<h5 data-sourcepos="2:1-2:9" dir="auto">&#x000A;<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__12:
+ canonical: |
+ <h3>foo</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:7" dir="auto">&#x000A;<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__13:
+ canonical: |
+ <h3>foo ### b</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:13" dir="auto">&#x000A;<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__14:
+ canonical: |
+ <h1>foo#</h1>
+ static: |-
+ <h1 data-sourcepos="1:1-1:6" dir="auto">&#x000A;<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__15:
+ canonical: |
+ <h3>foo ###</h3>
+ <h2>foo ###</h2>
+ <h1>foo #</h1>
+ static: |-
+ <h3 data-sourcepos="1:1-1:32" dir="auto">&#x000A;<a id="user-content-foo-" class="anchor" href="#foo-" aria-hidden="true"></a>foo <span>#</span>##</h3>&#x000A;<h2 data-sourcepos="2:1-2:31" dir="auto">&#x000A;<a id="user-content-foo--1" class="anchor" href="#foo--1" aria-hidden="true"></a>foo #<span>#</span>#</h2>&#x000A;<h1 data-sourcepos="3:1-3:28" dir="auto">&#x000A;<a id="user-content-foo--2" class="anchor" href="#foo--2" aria-hidden="true"></a>foo <span>#</span>&#x000A;</h1>
+ wysiwyg: |-
+ <h3>foo ###</h3>
+04_02__leaf_blocks__atx_headings__16:
+ canonical: |
+ <hr />
+ <h2>foo</h2>
+ <hr />
+ static: |-
+ <hr data-sourcepos="1:1-1:4">&#x000A;<h2 data-sourcepos="2:1-2:6" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>&#x000A;<hr data-sourcepos="3:1-3:4">
+ wysiwyg: |-
+ <hr>
+04_02__leaf_blocks__atx_headings__17:
+ 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>&#x000A;<h1 data-sourcepos="2:1-2:5" dir="auto">&#x000A;<a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>&#x000A;<p data-sourcepos="3:1-3:7" dir="auto">Bar foo</p>
+ wysiwyg: |-
+ <p>Foo bar</p>
+04_02__leaf_blocks__atx_headings__18:
+ canonical: |
+ <h2></h2>
+ <h1></h1>
+ <h3></h3>
+ static: |-
+ <h2 data-sourcepos="1:1-1:3" dir="auto"></h2>&#x000A;<h1 data-sourcepos="2:1-2:1" dir="auto"></h1>&#x000A;<h3 data-sourcepos="3:1-3:3" dir="auto"></h3>
+ wysiwyg: |-
+ <h2></h2>
+04_03__leaf_blocks__setext_headings__01:
+ canonical: |
+ <h1>Foo <em>bar</em></h1>
+ <h2>Foo <em>bar</em></h2>
+ static: |-
+ <h1 data-sourcepos="1:1-3:0" dir="auto">&#x000A;<a id="user-content-foo-bar" class="anchor" href="#foo-bar" aria-hidden="true"></a>Foo <em>bar</em>&#x000A;</h1>&#x000A;<h2 data-sourcepos="4:1-5:9" dir="auto">&#x000A;<a id="user-content-foo-bar-1" class="anchor" href="#foo-bar-1" aria-hidden="true"></a>Foo <em>bar</em>&#x000A;</h2>
+ wysiwyg: |-
+ <h1>Foo <em>bar</em></h1>
+04_03__leaf_blocks__setext_headings__02:
+ canonical: |
+ <h1>Foo <em>bar
+ baz</em></h1>
+ static: |-
+ <h1 data-sourcepos="1:1-3:4" dir="auto">&#x000A;<a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar&#x000A;baz</em>&#x000A;</h1>
+ wysiwyg: |-
+ <h1>Foo <em>bar
+ baz</em></h1>
+04_03__leaf_blocks__setext_headings__03:
+ canonical: |
+ <h1>Foo <em>bar
+ baz</em></h1>
+ static: |-
+ <h1 data-sourcepos="1:3-3:4" dir="auto">&#x000A;<a id="user-content-foo-barbaz" class="anchor" href="#foo-barbaz" aria-hidden="true"></a>Foo <em>bar&#x000A;baz</em>&#x000A;</h1>
+ wysiwyg: |-
+ <h1>Foo <em>bar
+ baz</em></h1>
+04_03__leaf_blocks__setext_headings__04:
+ canonical: |
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+ static: |-
+ <h2 data-sourcepos="1:1-3:0" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>&#x000A;<h1 data-sourcepos="4:1-5:1" dir="auto">&#x000A;<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__05:
+ canonical: |
+ <h2>Foo</h2>
+ <h2>Foo</h2>
+ <h1>Foo</h1>
+ static: |-
+ <h2 data-sourcepos="1:4-3:0" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h2>&#x000A;<h2 data-sourcepos="4:3-6:0" dir="auto">&#x000A;<a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h2>&#x000A;<h1 data-sourcepos="7:3-8:5" dir="auto">&#x000A;<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__06:
+ canonical: |
+ <pre><code>Foo
+ ---
+
+ Foo
+ </code></pre>
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-4:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">Foo</span>&#x000A;<span id="LC2" class="line" lang="plaintext">---</span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span>&#x000A;<span id="LC4" class="line" lang="plaintext">Foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__07:
+ canonical: |
+ <h2>Foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:13" dir="auto">&#x000A;<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__08:
+ canonical: |
+ <p>Foo
+ ---</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo&#x000A;---</p>
+ wysiwyg: |-
+ <p>Foo
+ ---</p>
+04_03__leaf_blocks__setext_headings__09:
+ canonical: |
+ <p>Foo
+ = =</p>
+ <p>Foo</p>
+ <hr />
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo&#x000A;= =</p>&#x000A;<p data-sourcepos="4:1-4:3" dir="auto">Foo</p>&#x000A;<hr data-sourcepos="5:1-5:5">
+ wysiwyg: |-
+ <p>Foo
+ = =</p>
+04_03__leaf_blocks__setext_headings__10:
+ canonical: |
+ <h2>Foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:5" dir="auto">&#x000A;<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__11:
+ canonical: |
+ <h2>Foo\</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:4" dir="auto">&#x000A;<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__12:
+ 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">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>`Foo</h2>&#x000A;<p data-sourcepos="3:1-3:1" dir="auto">`</p>&#x000A;<h2 data-sourcepos="5:1-7:12" dir="auto">&#x000A;<a id="user-content-a-titlea-lot" class="anchor" href="#a-titlea-lot" aria-hidden="true"></a>&lt;a title="a lot</h2>&#x000A;<p data-sourcepos="7:1-7:12" dir="auto">of dashes"/&gt;</p>
+ wysiwyg: |-
+ <h2>`Foo</h2>
+04_03__leaf_blocks__setext_headings__13:
+ canonical: |
+ <blockquote>
+ <p>Foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">Foo</p>&#x000A;</blockquote>&#x000A;<hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>Foo</p></blockquote>
+04_03__leaf_blocks__setext_headings__14:
+ canonical: |
+ <blockquote>
+ <p>foo
+ bar
+ ===</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">&#x000A;<p data-sourcepos="1:3-3:3">foo&#x000A;bar&#x000A;===</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ bar
+ ===</p></blockquote>
+04_03__leaf_blocks__setext_headings__15:
+ canonical: |
+ <ul>
+ <li>Foo</li>
+ </ul>
+ <hr />
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">Foo</li>&#x000A;</ul>&#x000A;<hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <ul bullet="*"><li><p>Foo</p></li></ul>
+04_03__leaf_blocks__setext_headings__16:
+ canonical: |
+ <h2>Foo
+ Bar</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">&#x000A;<a id="user-content-foobar" class="anchor" href="#foobar" aria-hidden="true"></a>Foo&#x000A;Bar</h2>
+ wysiwyg: |-
+ <h2>Foo
+ Bar</h2>
+04_03__leaf_blocks__setext_headings__17:
+ canonical: |
+ <hr />
+ <h2>Foo</h2>
+ <h2>Bar</h2>
+ <p>Baz</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<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>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<h2 data-sourcepos="4:1-6:3" dir="auto">&#x000A;<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>&#x000A;<p data-sourcepos="6:1-6:3" dir="auto">Baz</p>
+ wysiwyg: |-
+ <hr>
+04_03__leaf_blocks__setext_headings__18:
+ canonical: |
+ <p>====</p>
+ static: |-
+ <p data-sourcepos="2:1-2:4" dir="auto">====</p>
+ wysiwyg: |-
+ <p>====</p>
+04_03__leaf_blocks__setext_headings__19:
+ canonical: |
+ <hr />
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<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>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <hr>
+04_03__leaf_blocks__setext_headings__20:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <hr />
+ static: |-
+ <ul data-sourcepos="1:1-1:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;</ul>&#x000A;<hr data-sourcepos="2:1-2:5">
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+04_03__leaf_blocks__setext_headings__21:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ <hr />
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__22:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;</blockquote>&#x000A;<hr data-sourcepos="2:1-2:5">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+04_03__leaf_blocks__setext_headings__23:
+ canonical: |
+ <h2>&gt; foo</h2>
+ static: |-
+ <h2 data-sourcepos="1:1-2:6" dir="auto">&#x000A;<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__24:
+ canonical: |
+ <p>Foo</p>
+ <h2>bar</h2>
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>&#x000A;<h2 data-sourcepos="3:1-5:3" dir="auto">&#x000A;<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h2>&#x000A;<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo</p>
+04_03__leaf_blocks__setext_headings__25:
+ canonical: |
+ <p>Foo
+ bar</p>
+ <hr />
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo&#x000A;bar</p>&#x000A;<hr data-sourcepos="4:1-5:0">&#x000A;<p data-sourcepos="6:1-6:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+04_03__leaf_blocks__setext_headings__26:
+ canonical: |
+ <p>Foo
+ bar</p>
+ <hr />
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">Foo&#x000A;bar</p>&#x000A;<hr data-sourcepos="3:1-3:5">&#x000A;<p data-sourcepos="4:1-4:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+04_03__leaf_blocks__setext_headings__27:
+ canonical: |
+ <p>Foo
+ bar
+ ---
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-4:3" dir="auto">Foo&#x000A;bar&#x000A;---&#x000A;baz</p>
+ wysiwyg: |-
+ <p>Foo
+ bar
+ ---
+ baz</p>
+04_04__leaf_blocks__indented_code_blocks__01:
+ canonical: |
+ <pre><code>a simple
+ indented code block
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-2:25" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">a simple</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> indented code block</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__02:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:3-3:7" dir="auto">&#x000A;<li data-sourcepos="1:3-3:7">&#x000A;<p data-sourcepos="1:5-1:7">foo</p>&#x000A;<p data-sourcepos="3:5-3:7">bar</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+04_04__leaf_blocks__indented_code_blocks__03:
+ canonical: |
+ <ol>
+ <li>
+ <p>foo</p>
+ <ul>
+ <li>bar</li>
+ </ul>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-3:9" dir="auto">&#x000A;<li data-sourcepos="1:1-3:9">&#x000A;<p data-sourcepos="1:5-1:7">foo</p>&#x000A;<ul data-sourcepos="3:5-3:9">&#x000A;<li data-sourcepos="3:5-3:9">bar</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__04:
+ canonical: |
+ <pre><code>&lt;a/&gt;
+ *hi*
+
+ - one
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-4:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;a/&gt;</span>&#x000A;<span id="LC2" class="line" lang="plaintext">*hi*</span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span>&#x000A;<span id="LC4" class="line" lang="plaintext">- one</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__05:
+ canonical: |
+ <pre><code>chunk1
+
+ chunk2
+
+
+
+ chunk3
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-7:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>&#x000A;<span id="LC2" class="line" lang="plaintext"></span>&#x000A;<span id="LC3" class="line" lang="plaintext">chunk2</span>&#x000A;<span id="LC4" class="line" lang="plaintext"></span>&#x000A;<span id="LC5" class="line" lang="plaintext"></span>&#x000A;<span id="LC6" class="line" lang="plaintext"></span>&#x000A;<span id="LC7" class="line" lang="plaintext">chunk3</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>chunk1
+
+ chunk2
+
+
+
+ chunk3</code></pre>
+04_04__leaf_blocks__indented_code_blocks__06:
+ canonical: "<pre><code>chunk1\n \n chunk2\n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-3:12" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">chunk1</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> </span>&#x000A;<span id="LC3" class="line" lang="plaintext"> chunk2</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__07:
+ canonical: |
+ <p>Foo
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:7" dir="auto">Foo&#x000A;bar</p>
+ wysiwyg: |-
+ <p>Foo
+ bar</p>
+04_04__leaf_blocks__indented_code_blocks__08:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ <p>bar</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__09:
+ 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">&#x000A;<a id="user-content-heading" class="anchor" href="#heading" aria-hidden="true"></a>Heading</h1>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<h2 data-sourcepos="3:1-5:7" dir="auto">&#x000A;<a id="user-content-heading-1" class="anchor" href="#heading-1" aria-hidden="true"></a>Heading</h2>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<hr data-sourcepos="6:1-6:4">
+ wysiwyg: |-
+ <h1>Heading</h1>
+04_04__leaf_blocks__indented_code_blocks__10:
+ canonical: |
+ <pre><code> foo
+ bar
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> foo</span>&#x000A;<span id="LC2" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code> foo
+ bar</code></pre>
+04_04__leaf_blocks__indented_code_blocks__11:
+ canonical: |
+ <pre><code>foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+04_04__leaf_blocks__indented_code_blocks__12:
+ canonical: "<pre><code>foo \n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo </span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>foo </code></pre>
+04_05__leaf_blocks__fenced_code_blocks__01:
+ canonical: |
+ <pre><code>&lt;
+ &gt;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;
+ &gt;</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__02:
+ canonical: |
+ <pre><code>&lt;
+ &gt;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> &gt;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>&lt;
+ &gt;</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__03:
+ 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__04:
+ canonical: |
+ <pre><code>aaa
+ ~~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__05:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">```</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__06:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">```</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__07:
+ canonical: |
+ <pre><code>aaa
+ ~~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">~~~</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__08:
+ canonical: |
+ <pre><code></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-1:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__09:
+ canonical: |
+ <pre><code>
+ ```
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>&#x000A;<span id="LC2" class="line" lang="plaintext">```</span>&#x000A;<span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>
+ ```
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__10:
+ canonical: |
+ <blockquote>
+ <pre><code>aaa
+ </code></pre>
+ </blockquote>
+ <p>bbb</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:3-3:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</blockquote>&#x000A;<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__11:
+ canonical: "<pre><code>\n \n</code></pre>\n"
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>&#x000A;<span id="LC2" class="line" lang="plaintext"> </span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>
+ </code></pre>
+04_05__leaf_blocks__fenced_code_blocks__12:
+ canonical: |
+ <pre><code></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__13:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:2-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__14:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__15:
+ canonical: |
+ <pre><code>aaa
+ aaa
+ aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:4-5:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> aaa</span>&#x000A;<span id="LC3" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ aaa
+ aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__16:
+ canonical: |
+ <pre><code>```
+ aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">```</span>&#x000A;<span id="LC2" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC3" class="line" lang="plaintext">```</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>```
+ aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__17:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__18:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:4-3:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__19:
+ canonical: |
+ <pre><code>aaa
+ ```
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> ```</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ```</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__20:
+ canonical: |
+ <p><code> </code>
+ aaa</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto"><code> </code>&#x000A;aaa</p>
+ wysiwyg: |-
+ <p><code>
+ aaa</code></p>
+04_05__leaf_blocks__fenced_code_blocks__21:
+ canonical: |
+ <pre><code>aaa
+ ~~~ ~~
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span>&#x000A;<span id="LC2" class="line" lang="plaintext">~~~ ~~</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>aaa
+ ~~~ ~~</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__22:
+ canonical: |
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ <p>baz</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="2:1-4:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
+ wysiwyg: |-
+ <p>foo</p>
+04_05__leaf_blocks__fenced_code_blocks__23:
+ canonical: |
+ <h2>foo</h2>
+ <pre><code>bar
+ </code></pre>
+ <h1>baz</h1>
+ static: |-
+ <h2 data-sourcepos="1:1-3:3" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>foo</h2>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:1-5:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<h1 data-sourcepos="6:1-6:5" dir="auto">&#x000A;<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__24:
+ 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">&#x000A;<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>&#x000A;<span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>&#x000A;<span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__25:
+ 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">&#x000A;<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>&#x000A;<span id="LC2" class="line" lang="ruby"> <span class="k">return</span> <span class="mi">3</span></span>&#x000A;<span id="LC3" class="line" lang="ruby"><span class="k">end</span></span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__26:
+ canonical: |
+ <pre><code class="language-;"></code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-2:4" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre language=";" class="content-editor-code-block undefined code highlight"><code></code></pre>
+04_05__leaf_blocks__fenced_code_blocks__27:
+ canonical: |
+ <p><code>aa</code>
+ foo</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto"><code>aa</code>&#x000A;foo</p>
+ wysiwyg: |-
+ <p><code>aa</code>
+ foo</p>
+04_05__leaf_blocks__fenced_code_blocks__28:
+ canonical: |
+ <pre><code class="language-aa">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre language="aa" class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
+04_05__leaf_blocks__fenced_code_blocks__29:
+ canonical: |
+ <pre><code>``` aaa
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">``` aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>``` aaa</code></pre>
+04_06__leaf_blocks__html_blocks__01:
+ canonical: |
+ <table><tr><td>
+ <pre>
+ **Hello**,
+ <p><em>world</em>.
+ </pre></p>
+ </td></tr></table>
+ static: |-
+ <table dir="auto"><tr><td>&#x000A;<pre>&#x000A;**Hello**,&#x000A;<p data-sourcepos="5:1-6:6"><em>world</em>.&#x000A;</p></pre>&#x000A;</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__02:
+ canonical: |
+ <table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+ </table>
+ <p>okay.</p>
+ static: |-
+ <table dir="auto">&#x000A; <tr>&#x000A; <td>&#x000A; hi&#x000A; </td>&#x000A; </tr>&#x000A;</table>&#x000A;<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__03:
+ canonical: |2
+ <div>
+ *hello*
+ <foo><a>
+ static: |2-
+ <div>&#x000A; *hello*&#x000A; <a></a>&#x000A;</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__04:
+ canonical: |
+ </div>
+ *foo*
+ static: |-
+ &#x000A;*foo*
+ wysiwyg: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__05:
+ canonical: |
+ <DIV CLASS="foo">
+ <p><em>Markdown</em></p>
+ </DIV>
+ static: |-
+ <div>&#x000A;<p data-sourcepos="3:1-3:10"><em>Markdown</em></p>&#x000A;</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__06:
+ canonical: |
+ <div id="foo"
+ class="bar">
+ </div>
+ static: |-
+ <div>&#x000A;</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__07:
+ canonical: |
+ <div id="foo" class="bar
+ baz">
+ </div>
+ static: |-
+ <div>&#x000A;</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__08:
+ canonical: |
+ <div>
+ *foo*
+ <p><em>bar</em></p>
+ static: |-
+ <div>&#x000A;*foo*&#x000A;<p data-sourcepos="4:1-4:5"><em>bar</em></p>&#x000A;</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__09:
+ canonical: |
+ <div id="foo"
+ *hi*
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__10:
+ canonical: |
+ <div class
+ foo
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__11:
+ canonical: |
+ <div *???-&&&-<---
+ *foo*
+ static: |-
+ <div></div>
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__12:
+ 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__13:
+ canonical: |
+ <table><tr><td>
+ foo
+ </td></tr></table>
+ static: |-
+ <table dir="auto"><tr><td>&#x000A;foo&#x000A;</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__14:
+ canonical: |
+ <div></div>
+ ``` c
+ int x = 33;
+ ```
+ static: |-
+ <div></div>&#x000A;``` c&#x000A;int x = 33;&#x000A;```
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__15:
+ canonical: |
+ <a href="foo">
+ *bar*
+ </a>
+ static: |-
+ <a href="foo">&#x000A;*bar*&#x000A;</a>
+ wysiwyg: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__16:
+ canonical: |
+ <Warning>
+ *bar*
+ </Warning>
+ static: |-
+ &#x000A;*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__17:
+ canonical: |
+ <i class="foo">
+ *bar*
+ </i>
+ static: |-
+ <i>&#x000A;*bar*&#x000A;</i>
+ wysiwyg: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__18:
+ canonical: |
+ </ins>
+ *bar*
+ static: |-
+ &#x000A;*bar*
+ wysiwyg: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__19:
+ canonical: |
+ <del>
+ *foo*
+ </del>
+ static: |-
+ <del>&#x000A;*foo*&#x000A;</del>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__20:
+ canonical: |
+ <del>
+ <p><em>foo</em></p>
+ </del>
+ static: |-
+ <del>&#x000A;<p data-sourcepos="3:1-3:5"><em>foo</em></p>&#x000A;</del>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__21:
+ 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: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__22:
+ 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">&#x000A;<pre class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"></span>&#x000A;<span id="LC2" class="line" lang="plaintext">import Text.HTML.TagSoup</span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span>&#x000A;<span id="LC4" class="line" lang="plaintext">main :: IO ()</span>&#x000A;<span id="LC5" class="line" lang="plaintext">main = print $ parseTags tags</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__23:
+ canonical: |
+ <script type="text/javascript">
+ // JavaScript example
+
+ document.getElementById("demo").innerHTML = "Hello JavaScript!";
+ </script>
+ <p>okay</p>
+ static: |-
+ &#x000A;<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__24:
+ canonical: |
+ <style
+ type="text/css">
+ h1 {color:red;}
+
+ p {color:blue;}
+ </style>
+ <p>okay</p>
+ static: |-
+ &#x000A;h1 {color:red;}&#x000A;&#x000A;p {color:blue;}&#x000A;&#x000A;<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__25:
+ canonical: |
+ <style
+ type="text/css">
+
+ foo
+ static: |-
+ &#x000A;&#x000A;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__26:
+ canonical: |
+ <blockquote>
+ <div>
+ foo
+ </blockquote>
+ <p>bar</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">&#x000A;<div>&#x000A;foo&#x000A;&#x000A;<p data-sourcepos="4:1-4:3">bar</p>&#x000A;</div>&#x000A;</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__27:
+ canonical: |
+ <ul>
+ <li>
+ <div>
+ </li>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:7">&#x000A;<div>&#x000A;&#x000A;<li data-sourcepos="2:1-2:5">foo</li>&#x000A;</div>&#x000A;</li>&#x000A;</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__28:
+ canonical: |
+ <style>p{color:red;}</style>
+ <p><em>foo</em></p>
+ static: |-
+ p{color:red;}&#x000A;<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__29:
+ canonical: |
+ <!-- foo -->*bar*
+ <p><em>baz</em></p>
+ static: |-
+ *bar*&#x000A;<p data-sourcepos="2:1-2:5" dir="auto"><em>baz</em></p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__30:
+ 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__31:
+ canonical: |
+ <!-- Foo
+
+ bar
+ baz -->
+ <p>okay</p>
+ static: |-
+ &#x000A;<p data-sourcepos="5:1-5:4" dir="auto">okay</p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__32:
+ canonical: |
+ <?php
+
+ echo '>';
+
+ ?>
+ <p>okay</p>
+ static: |-
+ <?php echo '>';&#x000A;&#x000A;?&gt;&#x000A;<p data-sourcepos="6:1-6:4" dir="auto">okay</p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__33:
+ canonical: |
+ <!DOCTYPE html>
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_06__leaf_blocks__html_blocks__34:
+ canonical: |
+ <![CDATA[
+ function matchwo(a,b)
+ {
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+ }
+ ]]>
+ <p>okay</p>
+ static: |-
+ &#x000A;<p data-sourcepos="13:1-13:4" dir="auto">okay</p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__35:
+ canonical: |2
+ <!-- foo -->
+ <pre><code>&lt;!-- foo --&gt;
+ </code></pre>
+ static: |2-
+ &#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:5-3:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;!-- foo --&gt;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__36:
+ canonical: |2
+ <div>
+ <pre><code>&lt;div&gt;
+ </code></pre>
+ static: |2-
+ <div>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;div&gt;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</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__37:
+ canonical: |
+ <p>Foo</p>
+ <div>
+ bar
+ </div>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>&#x000A;<div>&#x000A;bar&#x000A;</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__38:
+ canonical: |
+ <div>
+ bar
+ </div>
+ *foo*
+ static: |-
+ <div>&#x000A;bar&#x000A;</div>&#x000A;*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__39:
+ canonical: |
+ <p>Foo
+ <a href="bar">
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-3:3" dir="auto">Foo&#x000A;<a href="bar">&#x000A;baz</a></p>
+ wysiwyg: |-
+ <p>Foo
+ <a target="_blank" rel="noopener noreferrer nofollow" href="bar">
+ baz</a></p>
+04_06__leaf_blocks__html_blocks__40:
+ canonical: |
+ <div>
+ <p><em>Emphasized</em> text.</p>
+ </div>
+ static: |-
+ <div>&#x000A;<p data-sourcepos="3:1-3:18"><em>Emphasized</em> text.</p>&#x000A;</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__41:
+ canonical: |
+ <div>
+ *Emphasized* text.
+ </div>
+ static: |-
+ <div>&#x000A;*Emphasized* text.&#x000A;</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__42:
+ canonical: |
+ <table>
+ <tr>
+ <td>
+ Hi
+ </td>
+ </tr>
+ </table>
+ static: |-
+ <table dir="auto">&#x000A;<tr>&#x000A;<td>&#x000A;Hi&#x000A;</td>&#x000A;</tr>&#x000A;</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__43:
+ canonical: |
+ <table>
+ <tr>
+ <pre><code>&lt;td&gt;
+ Hi
+ &lt;/td&gt;
+ </code></pre>
+ </tr>
+ </table>
+ static: |-
+ <table dir="auto">&#x000A; <tr>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:5-8:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&lt;td&gt;</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> Hi</span>&#x000A;<span id="LC3" class="line" lang="plaintext">&lt;/td&gt;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A; </tr>&#x000A;</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__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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="&#x000A;title&#x000A;line1&#x000A;line2&#x000A;">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__06:
+ 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>&#x000A;<p data-sourcepos="3:1-3:16" dir="auto">with blank line'</p>&#x000A;<p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]: /url 'title</p>
+04_07__leaf_blocks__link_reference_definitions__07:
+ 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__08:
+ canonical: |
+ <p>[foo]:</p>
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">[foo]:</p>&#x000A;<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]:</p>
+04_07__leaf_blocks__link_reference_definitions__09:
+ 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__10:
+ canonical: |
+ <p>[foo]: <bar>(baz)</p>
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:17" dir="auto">[foo]: (baz)</p>&#x000A;<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__11:
+ 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__12:
+ 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__13:
+ 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__14:
+ 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__15:
+ 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__16:
+ canonical: ""
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_07__leaf_blocks__link_reference_definitions__17:
+ 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__18:
+ 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__19:
+ 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__20:
+ canonical: |
+ <pre><code>[foo]: /url &quot;title&quot;
+ </code></pre>
+ <p>[foo]</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url "title"</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__21:
+ canonical: |
+ <pre><code>[foo]: /url
+ </code></pre>
+ <p>[foo]</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">[foo]: /url</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__22:
+ canonical: |
+ <p>Foo
+ [bar]: /baz</p>
+ <p>[bar]</p>
+ static: |-
+ <p data-sourcepos="1:1-2:11" dir="auto">Foo&#x000A;[bar]: /baz</p>&#x000A;<p data-sourcepos="4:1-4:5" dir="auto">[bar]</p>
+ wysiwyg: |-
+ <p>Foo
+ [bar]: /baz</p>
+04_07__leaf_blocks__link_reference_definitions__23:
+ canonical: |
+ <h1><a href="/url">Foo</a></h1>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <h1 data-sourcepos="1:1-1:7" dir="auto">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a><a href="/url">Foo</a>&#x000A;</h1>&#x000A;<blockquote data-sourcepos="3:1-3:5" dir="auto">&#x000A;<p data-sourcepos="3:3-3:5">bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <h1><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></h1>
+04_07__leaf_blocks__link_reference_definitions__24:
+ canonical: |
+ <h1>bar</h1>
+ <p><a href="/url">foo</a></p>
+ static: |-
+ <h1 data-sourcepos="1:1-4:5" dir="auto">&#x000A;<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h1>&#x000A;<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__25:
+ canonical: |
+ <p>===
+ <a href="/url">foo</a></p>
+ static: |-
+ <p data-sourcepos="1:1-3:5" dir="auto">===&#x000A;<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__26:
+ 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>,&#x000A;<a href="/bar-url" title="bar">bar</a>,&#x000A;<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__27:
+ 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>&#x000A;<blockquote data-sourcepos="3:1-3:13" dir="auto">&#x000A;</blockquote>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
+04_07__leaf_blocks__link_reference_definitions__28:
+ canonical: ""
+ static: ""
+ wysiwyg: |-
+ <p></p>
+04_08__leaf_blocks__paragraphs__01:
+ canonical: |
+ <p>aaa</p>
+ <p>bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>&#x000A;<p data-sourcepos="3:1-3:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <p>aaa</p>
+04_08__leaf_blocks__paragraphs__02:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ <p>ccc
+ ddd</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">aaa&#x000A;bbb</p>&#x000A;<p data-sourcepos="4:1-5:3" dir="auto">ccc&#x000A;ddd</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+04_08__leaf_blocks__paragraphs__03:
+ canonical: |
+ <p>aaa</p>
+ <p>bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">aaa</p>&#x000A;<p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
+ wysiwyg: |-
+ <p>aaa</p>
+04_08__leaf_blocks__paragraphs__04:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:3-2:4" dir="auto">aaa&#x000A;bbb</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+04_08__leaf_blocks__paragraphs__05:
+ canonical: |
+ <p>aaa
+ bbb
+ ccc</p>
+ static: |-
+ <p data-sourcepos="1:1-3:42" dir="auto">aaa&#x000A;bbb&#x000A;ccc</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb
+ ccc</p>
+04_08__leaf_blocks__paragraphs__06:
+ canonical: |
+ <p>aaa
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:4-2:3" dir="auto">aaa&#x000A;bbb</p>
+ wysiwyg: |-
+ <p>aaa
+ bbb</p>
+04_08__leaf_blocks__paragraphs__07:
+ canonical: |
+ <pre><code>aaa
+ </code></pre>
+ <p>bbb</p>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">aaa</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<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__08:
+ canonical: |
+ <p>aaa<br />
+ bbb</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">aaa<br>&#x000A;bbb</p>
+ wysiwyg: |-
+ <p>aaa<br>
+ bbb</p>
+04_09__leaf_blocks__blank_lines__01:
+ canonical: |
+ <p>aaa</p>
+ <h1>aaa</h1>
+ static: |-
+ <p data-sourcepos="3:1-3:3" dir="auto">aaa</p>&#x000A;<h1 data-sourcepos="6:1-6:5" dir="auto">&#x000A;<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__01:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:13">&#x000A;<th data-sourcepos="1:2-1:6">foo</th>&#x000A;<th data-sourcepos="1:8-1:12">bar</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:13">&#x000A;<td data-sourcepos="3:2-3:6">baz</td>&#x000A;<td data-sourcepos="3:8-3:12">bim</td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>
+ wysiwyg: |-
+ <p>| foo | bar |
+ | --- | --- |
+ | baz | bim |</p>
+04_10__leaf_blocks__tables_extension__02:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:16">&#x000A;<th align="center" data-sourcepos="1:2-1:6">abc</th>&#x000A;<th align="right" data-sourcepos="1:8-1:15">defghi</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:9">&#x000A;<td align="center" data-sourcepos="3:1-3:4">bar</td>&#x000A;<td align="right" data-sourcepos="3:6-3:9">baz</td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>
+ wysiwyg: |-
+ <p>| abc | defghi |
+ :-: | -----------:
+ bar | baz</p>
+04_10__leaf_blocks__tables_extension__03:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:10">&#x000A;<th data-sourcepos="1:2-1:9">f|oo</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:13">&#x000A;<td data-sourcepos="3:2-3:12">b <code>|</code> az</td>&#x000A;</tr>&#x000A;<tr data-sourcepos="4:1-4:15">&#x000A;<td data-sourcepos="4:2-4:14">b <strong>|</strong> im</td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>
+ wysiwyg: |-
+ <p>| f|oo |
+ | ------ |
+ | b <code>\|</code> az |
+ | b <strong>|</strong> im |</p>
+04_10__leaf_blocks__tables_extension__04:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:13">&#x000A;<th data-sourcepos="1:2-1:6">abc</th>&#x000A;<th data-sourcepos="1:8-1:12">def</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:13">&#x000A;<td data-sourcepos="3:2-3:6">bar</td>&#x000A;<td data-sourcepos="3:8-3:12">baz</td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>&#x000A;<blockquote data-sourcepos="4:1-4:5" dir="auto">&#x000A;<p data-sourcepos="4:3-4:5">bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- | --- |
+ | bar | baz |</p>
+04_10__leaf_blocks__tables_extension__05:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:13">&#x000A;<th data-sourcepos="1:2-1:6">abc</th>&#x000A;<th data-sourcepos="1:8-1:12">def</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:13">&#x000A;<td data-sourcepos="3:2-3:6">bar</td>&#x000A;<td data-sourcepos="3:8-3:12">baz</td>&#x000A;</tr>&#x000A;<tr data-sourcepos="4:1-4:3">&#x000A;<td data-sourcepos="4:1-4:3">bar</td>&#x000A;<td data-sourcepos="4:0-4:0"></td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>&#x000A;<p data-sourcepos="6:1-6:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- | --- |
+ | bar | baz |
+ bar</p>
+04_10__leaf_blocks__tables_extension__06:
+ canonical: |
+ <p>| abc | def |
+ | --- |
+ | bar |</p>
+ static: |-
+ <p data-sourcepos="1:1-3:7" dir="auto">| abc | def |&#x000A;| --- |&#x000A;| bar |</p>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- |
+ | bar |</p>
+04_10__leaf_blocks__tables_extension__07:
+ 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">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:13">&#x000A;<th data-sourcepos="1:2-1:6">abc</th>&#x000A;<th data-sourcepos="1:8-1:12">def</th>&#x000A;</tr>&#x000A;</thead>&#x000A;<tbody>&#x000A;<tr data-sourcepos="3:1-3:7">&#x000A;<td data-sourcepos="3:2-3:6">bar</td>&#x000A;<td data-sourcepos="3:0-3:0"></td>&#x000A;</tr>&#x000A;<tr data-sourcepos="4:1-4:19">&#x000A;<td data-sourcepos="4:2-4:6">bar</td>&#x000A;<td data-sourcepos="4:8-4:12">baz</td>&#x000A;</tr>&#x000A;</tbody>&#x000A;</table>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- | --- |
+ | bar |
+ | bar | baz | boo |</p>
+04_10__leaf_blocks__tables_extension__08:
+ canonical: |
+ <table>
+ <thead>
+ <tr>
+ <th>abc</th>
+ <th>def</th>
+ </tr>
+ </thead>
+ </table>
+ static: |-
+ <table data-sourcepos="1:1-2:13" dir="auto">&#x000A;<thead>&#x000A;<tr data-sourcepos="1:1-1:13">&#x000A;<th data-sourcepos="1:2-1:6">abc</th>&#x000A;<th data-sourcepos="1:8-1:12">def</th>&#x000A;</tr>&#x000A;</thead>&#x000A;</table>
+ wysiwyg: |-
+ <p>| abc | def |
+ | --- | --- |</p>
+05_01__container_blocks__block_quotes__01:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">&#x000A;<h1 data-sourcepos="1:3-1:7">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>&#x000A;<p data-sourcepos="2:3-3:5">bar&#x000A;baz</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__02:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">&#x000A;<h1 data-sourcepos="1:2-1:6">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>&#x000A;<p data-sourcepos="2:2-3:5">bar&#x000A;baz</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__03:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:4-3:6" dir="auto">&#x000A;<h1 data-sourcepos="1:6-1:10">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>&#x000A;<p data-sourcepos="2:6-3:6">bar&#x000A;baz</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__04:
+ canonical: |
+ <pre><code>&gt; # Foo
+ &gt; bar
+ &gt; baz
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">&gt; # Foo</span>&#x000A;<span id="LC2" class="line" lang="plaintext">&gt; bar</span>&#x000A;<span id="LC3" class="line" lang="plaintext">&gt; baz</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__05:
+ canonical: |
+ <blockquote>
+ <h1>Foo</h1>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">&#x000A;<h1 data-sourcepos="1:3-1:7">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>&#x000A;<p data-sourcepos="2:3-3:3">bar&#x000A;baz</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><h1>Foo</h1><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__06:
+ canonical: |
+ <blockquote>
+ <p>bar
+ baz
+ foo</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">&#x000A;<p data-sourcepos="1:3-3:5">bar&#x000A;baz&#x000A;foo</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar
+ baz
+ foo</p></blockquote>
+05_01__container_blocks__block_quotes__07:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <hr />
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;</blockquote>&#x000A;<hr data-sourcepos="2:1-2:3">
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+05_01__container_blocks__block_quotes__08:
+ canonical: |
+ <blockquote>
+ <ul>
+ <li>foo</li>
+ </ul>
+ </blockquote>
+ <ul>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:7" dir="auto">&#x000A;<ul data-sourcepos="1:3-1:7">&#x000A;<li data-sourcepos="1:3-1:7">foo</li>&#x000A;</ul>&#x000A;</blockquote>&#x000A;<ul data-sourcepos="2:1-2:5" dir="auto">&#x000A;<li data-sourcepos="2:1-2:5">bar</li>&#x000A;</ul>
+ wysiwyg: |-
+ <blockquote multiline="false"><ul bullet="*"><li><p>foo</p></li></ul></blockquote>
+05_01__container_blocks__block_quotes__09:
+ canonical: |
+ <blockquote>
+ <pre><code>foo
+ </code></pre>
+ </blockquote>
+ <pre><code>bar
+ </code></pre>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:9" dir="auto">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:7-1:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</blockquote>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="2:5-2:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__10:
+ canonical: |
+ <blockquote>
+ <pre><code></code></pre>
+ </blockquote>
+ <p>foo</p>
+ <pre><code></code></pre>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:3-2:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</blockquote>&#x000A;<p data-sourcepos="2:1-2:3" dir="auto">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code></code></pre></blockquote>
+05_01__container_blocks__block_quotes__11:
+ canonical: |
+ <blockquote>
+ <p>foo
+ - bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:9" dir="auto">&#x000A;<p data-sourcepos="1:3-2:9">foo&#x000A;- bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ - bar</p></blockquote>
+05_01__container_blocks__block_quotes__12:
+ canonical: |
+ <blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:1" dir="auto">&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p></p></blockquote>
+05_01__container_blocks__block_quotes__13:
+ canonical: |
+ <blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:2" dir="auto">&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p></p></blockquote>
+05_01__container_blocks__block_quotes__14:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:3" dir="auto">&#x000A;<p data-sourcepos="2:3-2:5">foo</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+05_01__container_blocks__block_quotes__15:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ </blockquote>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;</blockquote>&#x000A;<blockquote data-sourcepos="3:1-3:5" dir="auto">&#x000A;<p data-sourcepos="3:3-3:5">bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p></blockquote>
+05_01__container_blocks__block_quotes__16:
+ canonical: |
+ <blockquote>
+ <p>foo
+ bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:5" dir="auto">&#x000A;<p data-sourcepos="1:3-2:5">foo&#x000A;bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo
+ bar</p></blockquote>
+05_01__container_blocks__block_quotes__17:
+ canonical: |
+ <blockquote>
+ <p>foo</p>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;<p data-sourcepos="3:3-3:5">bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>foo</p><p>bar</p></blockquote>
+05_01__container_blocks__block_quotes__18:
+ canonical: |
+ <p>foo</p>
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">foo</p>&#x000A;<blockquote data-sourcepos="2:1-2:5" dir="auto">&#x000A;<p data-sourcepos="2:3-2:5">bar</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <p>foo</p>
+05_01__container_blocks__block_quotes__19:
+ canonical: |
+ <blockquote>
+ <p>aaa</p>
+ </blockquote>
+ <hr />
+ <blockquote>
+ <p>bbb</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">aaa</p>&#x000A;</blockquote>&#x000A;<hr data-sourcepos="2:1-2:3">&#x000A;<blockquote data-sourcepos="3:1-3:5" dir="auto">&#x000A;<p data-sourcepos="3:3-3:5">bbb</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>aaa</p></blockquote>
+05_01__container_blocks__block_quotes__20:
+ canonical: |
+ <blockquote>
+ <p>bar
+ baz</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:3" dir="auto">&#x000A;<p data-sourcepos="1:3-2:3">bar&#x000A;baz</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><p>bar
+ baz</p></blockquote>
+05_01__container_blocks__block_quotes__21:
+ canonical: |
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ <p>baz</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:5" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">bar</p>&#x000A;</blockquote>&#x000A;<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__22:
+ canonical: |
+ <blockquote>
+ <p>bar</p>
+ </blockquote>
+ <p>baz</p>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:1" dir="auto">&#x000A;<p data-sourcepos="1:3-1:5">bar</p>&#x000A;</blockquote>&#x000A;<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__23:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <blockquote>
+ <p>foo
+ bar</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:3" dir="auto">&#x000A;<blockquote data-sourcepos="1:3-2:3">&#x000A;<blockquote data-sourcepos="1:5-2:3">&#x000A;<p data-sourcepos="1:7-2:3">foo&#x000A;bar</p>&#x000A;</blockquote>&#x000A;</blockquote>&#x000A;</blockquote>
+ wysiwyg: |-
+ <blockquote multiline="false"><blockquote multiline="false"><blockquote multiline="false"><p>foo
+ bar</p></blockquote></blockquote></blockquote>
+05_01__container_blocks__block_quotes__24:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <blockquote>
+ <p>foo
+ bar
+ baz</p>
+ </blockquote>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:5" dir="auto">&#x000A;<blockquote data-sourcepos="1:2-3:5">&#x000A;<blockquote data-sourcepos="1:3-3:5">&#x000A;<p data-sourcepos="1:5-3:5">foo&#x000A;bar&#x000A;baz</p>&#x000A;</blockquote>&#x000A;</blockquote>&#x000A;</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__25:
+ canonical: |
+ <blockquote>
+ <pre><code>code
+ </code></pre>
+ </blockquote>
+ <blockquote>
+ <p>not code</p>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-1:10" dir="auto">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:7-1:10" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</blockquote>&#x000A;<blockquote data-sourcepos="3:1-3:13" dir="auto">&#x000A;<p data-sourcepos="3:6-3:13">not code</p>&#x000A;</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__01:
+ 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&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:5-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:1-6:16" dir="auto">&#x000A;<p data-sourcepos="6:3-6:16">A block quote.</p>&#x000A;</blockquote>
+ wysiwyg: |-
+ <p>A paragraph
+ with two lines.</p>
+05_02__container_blocks__list_items__02:
+ 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">&#x000A;<li data-sourcepos="1:1-6:20">&#x000A;<p data-sourcepos="1:5-2:19">A paragraph&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:9-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:5-6:20">&#x000A;<p data-sourcepos="6:7-6:20">A block quote.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__03:
+ canonical: |
+ <ul>
+ <li>one</li>
+ </ul>
+ <p>two</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">&#x000A;<li data-sourcepos="1:1-2:0">one</li>&#x000A;</ul>&#x000A;<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__04:
+ canonical: |
+ <ul>
+ <li>
+ <p>one</p>
+ <p>two</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">&#x000A;<li data-sourcepos="1:1-3:5">&#x000A;<p data-sourcepos="1:3-1:5">one</p>&#x000A;<p data-sourcepos="3:3-3:5">two</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
+05_02__container_blocks__list_items__05:
+ canonical: |
+ <ul>
+ <li>one</li>
+ </ul>
+ <pre><code> two
+ </code></pre>
+ static: |-
+ <ul data-sourcepos="1:2-2:0" dir="auto">&#x000A;<li data-sourcepos="1:2-2:0">one</li>&#x000A;</ul>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:5-3:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> two</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p></li></ul>
+05_02__container_blocks__list_items__06:
+ canonical: |
+ <ul>
+ <li>
+ <p>one</p>
+ <p>two</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:2-3:9" dir="auto">&#x000A;<li data-sourcepos="1:2-3:9">&#x000A;<p data-sourcepos="1:7-1:9">one</p>&#x000A;<p data-sourcepos="3:7-3:9">two</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>one</p><p>two</p></li></ul>
+05_02__container_blocks__list_items__07:
+ 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">&#x000A;<blockquote data-sourcepos="1:6-3:10">&#x000A;<ol data-sourcepos="1:8-3:10">&#x000A;<li data-sourcepos="1:8-3:10">&#x000A;<p data-sourcepos="1:12-1:14">one</p>&#x000A;<p data-sourcepos="3:8-3:10">two</p>&#x000A;</li>&#x000A;</ol>&#x000A;</blockquote>&#x000A;</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__08:
+ canonical: |
+ <blockquote>
+ <blockquote>
+ <ul>
+ <li>one</li>
+ </ul>
+ <p>two</p>
+ </blockquote>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-3:10" dir="auto">&#x000A;<blockquote data-sourcepos="1:2-3:10">&#x000A;<ul data-sourcepos="1:3-2:2">&#x000A;<li data-sourcepos="1:3-2:2">one</li>&#x000A;</ul>&#x000A;<p data-sourcepos="3:8-3:10">two</p>&#x000A;</blockquote>&#x000A;</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__09:
+ canonical: |
+ <p>-one</p>
+ <p>2.two</p>
+ static: |-
+ <p data-sourcepos="1:1-1:4" dir="auto">-one</p>&#x000A;<p data-sourcepos="3:1-3:5" dir="auto">2.two</p>
+ wysiwyg: |-
+ <p>-one</p>
+05_02__container_blocks__list_items__10:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:5" dir="auto">&#x000A;<li data-sourcepos="1:1-4:5">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;<p data-sourcepos="4:3-4:5">bar</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+05_02__container_blocks__list_items__11:
+ 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">&#x000A;<li data-sourcepos="1:1-9:9">&#x000A;<p data-sourcepos="1:5-1:7">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:5-5:7" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="7:5-7:7">baz</p>&#x000A;<blockquote data-sourcepos="9:5-9:9">&#x000A;<p data-sourcepos="9:7-9:9">bam</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__12:
+ canonical: |
+ <ul>
+ <li>
+ <p>Foo</p>
+ <pre><code>bar
+
+
+ baz
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-6:9" dir="auto">&#x000A;<li data-sourcepos="1:1-6:9">&#x000A;<p data-sourcepos="1:3-1:5">Foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:7-6:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span>&#x000A;<span id="LC2" class="line" lang="plaintext"></span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span>&#x000A;<span id="LC4" class="line" lang="plaintext">baz</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__13:
+ canonical: |
+ <ol start="123456789">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="123456789" data-sourcepos="1:1-1:13" dir="auto">&#x000A;<li data-sourcepos="1:1-1:13">ok</li>&#x000A;</ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__14:
+ 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__15:
+ canonical: |
+ <ol start="0">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="0" data-sourcepos="1:1-1:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">ok</li>&#x000A;</ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__16:
+ canonical: |
+ <ol start="3">
+ <li>ok</li>
+ </ol>
+ static: |-
+ <ol start="3" data-sourcepos="1:1-1:7" dir="auto">&#x000A;<li data-sourcepos="1:1-1:7">ok</li>&#x000A;</ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>ok</p></li></ol>
+05_02__container_blocks__list_items__17:
+ 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__18:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <pre><code>bar
+ </code></pre>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:9" dir="auto">&#x000A;<li data-sourcepos="1:1-3:9">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:7-3:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__19:
+ 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">&#x000A;<li data-sourcepos="1:3-3:14">&#x000A;<p data-sourcepos="1:8-1:10">foo</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:12-3:14" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__20:
+ 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">&#x000A;<pre data-sourcepos="1:5-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="3:1-3:9" dir="auto">paragraph</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:5-5:13" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
+05_02__container_blocks__list_items__21:
+ 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">&#x000A;<li data-sourcepos="1:1-5:16">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="3:4-3:12">paragraph</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__22:
+ 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">&#x000A;<li data-sourcepos="1:1-5:16">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:8-2:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext"> indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="3:4-3:12">paragraph</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:8-5:16" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">more code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__23:
+ canonical: |
+ <p>foo</p>
+ <p>bar</p>
+ static: |-
+ <p data-sourcepos="1:4-1:6" dir="auto">foo</p>&#x000A;<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
+ wysiwyg: |-
+ <p>foo</p>
+05_02__container_blocks__list_items__24:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ <p>bar</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">&#x000A;<li data-sourcepos="1:1-2:0">foo</li>&#x000A;</ul>&#x000A;<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__25:
+ canonical: |
+ <ul>
+ <li>
+ <p>foo</p>
+ <p>bar</p>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:6" dir="auto">&#x000A;<li data-sourcepos="1:1-3:6">&#x000A;<p data-sourcepos="1:4-1:6">foo</p>&#x000A;<p data-sourcepos="3:4-3:6">bar</p>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p><p>bar</p></li></ul>
+05_02__container_blocks__list_items__26:
+ 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">&#x000A;<li data-sourcepos="1:1-2:5">foo</li>&#x000A;<li data-sourcepos="3:1-6:5">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">bar</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;<li data-sourcepos="7:1-8:9">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="8:7-8:9" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">baz</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;</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__27:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">&#x000A;<li data-sourcepos="1:1-2:5">foo</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>foo</p></li></ul>
+05_02__container_blocks__list_items__28:
+ canonical: |
+ <ul>
+ <li></li>
+ </ul>
+ <p>foo</p>
+ static: |-
+ <ul data-sourcepos="1:1-2:0" dir="auto">&#x000A;<li data-sourcepos="1:1-1:1">&#x000A;</li>&#x000A;</ul>&#x000A;<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__29:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;<li data-sourcepos="2:1-2:1">&#x000A;</li>&#x000A;<li data-sourcepos="3:1-3:5">bar</li>&#x000A;</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__30:
+ canonical: |
+ <ul>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-3:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;<li data-sourcepos="2:1-2:4">&#x000A;</li>&#x000A;<li data-sourcepos="3:1-3:5">bar</li>&#x000A;</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__31:
+ canonical: |
+ <ol>
+ <li>foo</li>
+ <li></li>
+ <li>bar</li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-3:6" dir="auto">&#x000A;<li data-sourcepos="1:1-1:6">foo</li>&#x000A;<li data-sourcepos="2:1-2:2">&#x000A;</li>&#x000A;<li data-sourcepos="3:1-3:6">bar</li>&#x000A;</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__32:
+ canonical: |
+ <ul>
+ <li></li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:1" dir="auto">&#x000A;<li data-sourcepos="1:1-1:1">&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p></li></ul>
+05_02__container_blocks__list_items__33:
+ canonical: |
+ <p>foo
+ *</p>
+ <p>foo
+ 1.</p>
+ static: |-
+ <p data-sourcepos="1:1-2:1" dir="auto">foo&#x000A;*</p>&#x000A;<p data-sourcepos="4:1-5:2" dir="auto">foo&#x000A;1.</p>
+ wysiwyg: |-
+ <p>foo
+ *</p>
+05_02__container_blocks__list_items__34:
+ 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">&#x000A;<li data-sourcepos="1:2-6:21">&#x000A;<p data-sourcepos="1:6-2:20">A paragraph&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:10-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:6-6:21">&#x000A;<p data-sourcepos="6:8-6:21">A block quote.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__35:
+ 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">&#x000A;<li data-sourcepos="1:3-6:22">&#x000A;<p data-sourcepos="1:7-2:21">A paragraph&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:7-6:22">&#x000A;<p data-sourcepos="6:9-6:22">A block quote.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__36:
+ 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">&#x000A;<li data-sourcepos="1:4-6:23">&#x000A;<p data-sourcepos="1:8-2:22">A paragraph&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:12-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:8-6:23">&#x000A;<p data-sourcepos="6:10-6:23">A block quote.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__37:
+ 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">&#x000A;<pre data-sourcepos="1:5-6:24" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">1. A paragraph</span>&#x000A;<span id="LC2" class="line" lang="plaintext"> with two lines.</span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span>&#x000A;<span id="LC4" class="line" lang="plaintext"> indented code</span>&#x000A;<span id="LC5" class="line" lang="plaintext"></span>&#x000A;<span id="LC6" class="line" lang="plaintext"> &gt; A block quote.</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__38:
+ 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">&#x000A;<li data-sourcepos="1:3-6:22">&#x000A;<p data-sourcepos="1:7-2:15">A paragraph&#x000A;with two lines.</p>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="4:11-5:0" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">indented code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<blockquote data-sourcepos="6:7-6:22">&#x000A;<p data-sourcepos="6:9-6:22">A block quote.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</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__39:
+ canonical: |
+ <ol>
+ <li>A paragraph
+ with two lines.</li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:3-2:19" dir="auto">&#x000A;<li data-sourcepos="1:3-2:19">A paragraph&#x000A;with two lines.</li>&#x000A;</ol>
+ wysiwyg: |-
+ <ol parens="false"><li><p>A paragraph
+ with two lines.</p></li></ol>
+05_02__container_blocks__list_items__40:
+ canonical: |
+ <blockquote>
+ <ol>
+ <li>
+ <blockquote>
+ <p>Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:15" dir="auto">&#x000A;<ol data-sourcepos="1:3-2:15">&#x000A;<li data-sourcepos="1:3-2:15">&#x000A;<blockquote data-sourcepos="1:6-2:15">&#x000A;<p data-sourcepos="1:8-2:15">Blockquote&#x000A;continued here.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</ol>&#x000A;</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__41:
+ canonical: |
+ <blockquote>
+ <ol>
+ <li>
+ <blockquote>
+ <p>Blockquote
+ continued here.</p>
+ </blockquote>
+ </li>
+ </ol>
+ </blockquote>
+ static: |-
+ <blockquote data-sourcepos="1:1-2:17" dir="auto">&#x000A;<ol data-sourcepos="1:3-2:17">&#x000A;<li data-sourcepos="1:3-2:17">&#x000A;<blockquote data-sourcepos="1:6-2:17">&#x000A;<p data-sourcepos="1:8-2:17">Blockquote&#x000A;continued here.</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;</ol>&#x000A;</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__42:
+ 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">&#x000A;<li data-sourcepos="1:1-4:11">foo&#x000A;<ul data-sourcepos="2:3-4:11">&#x000A;<li data-sourcepos="2:3-4:11">bar&#x000A;<ul data-sourcepos="3:5-4:11">&#x000A;<li data-sourcepos="3:5-4:11">baz&#x000A;<ul data-sourcepos="4:7-4:11">&#x000A;<li data-sourcepos="4:7-4:11">boo</li>&#x000A;</ul>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__43:
+ 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">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;<li data-sourcepos="2:2-2:6">bar</li>&#x000A;<li data-sourcepos="3:3-3:7">baz</li>&#x000A;<li data-sourcepos="4:4-4:8">boo</li>&#x000A;</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__44:
+ 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">&#x000A;<li data-sourcepos="1:1-2:9">foo&#x000A;<ul data-sourcepos="2:5-2:9">&#x000A;<li data-sourcepos="2:5-2:9">bar</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__45:
+ 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">&#x000A;<li data-sourcepos="1:1-1:7">foo</li>&#x000A;</ol>&#x000A;<ul data-sourcepos="2:4-2:8" dir="auto">&#x000A;<li data-sourcepos="2:4-2:8">bar</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ol parens="false"><li><p>foo</p></li></ol>
+05_02__container_blocks__list_items__46:
+ canonical: |
+ <ul>
+ <li>
+ <ul>
+ <li>foo</li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:7" dir="auto">&#x000A;<li data-sourcepos="1:1-1:7">&#x000A;<ul data-sourcepos="1:3-1:7">&#x000A;<li data-sourcepos="1:3-1:7">foo</li>&#x000A;</ul>&#x000A;</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p></p><ul bullet="*"><li><p>foo</p></li></ul></li></ul>
+05_02__container_blocks__list_items__47:
+ 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">&#x000A;<li data-sourcepos="1:1-1:11">&#x000A;<ul data-sourcepos="1:4-1:11">&#x000A;<li data-sourcepos="1:4-1:11">&#x000A;<ol start="2" data-sourcepos="1:6-1:11">&#x000A;<li data-sourcepos="1:6-1:11">foo</li>&#x000A;</ol>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__48:
+ canonical: |
+ <ul>
+ <li>
+ <h1>Foo</h1>
+ </li>
+ <li>
+ <h2>Bar</h2>
+ baz</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:5" dir="auto">&#x000A;<li data-sourcepos="1:1-1:7">&#x000A;<h1 data-sourcepos="1:3-1:7">&#x000A;<a id="user-content-foo" class="anchor" href="#foo" aria-hidden="true"></a>Foo</h1>&#x000A;</li>&#x000A;<li data-sourcepos="2:1-4:5">&#x000A;<h2 data-sourcepos="2:3-4:5">&#x000A;<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>Bar</h2>&#x000A;baz</li>&#x000A;</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__49:
+ 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">&#x000A;<li data-sourcepos="1:1-1:9" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> foo</li>&#x000A;<li data-sourcepos="2:1-2:9" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> bar</li>&#x000A;<li data-sourcepos="3:1-5:11" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> foo&#x000A;<ul data-sourcepos="4:3-5:11" class="task-list">&#x000A;<li data-sourcepos="4:3-4:11" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> bar</li>&#x000A;<li data-sourcepos="5:3-5:11" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" checked disabled> baz</li>&#x000A;</ul>&#x000A;</li>&#x000A;<li data-sourcepos="6:1-6:9" class="task-list-item">&#x000A;<task-button></task-button><input type="checkbox" class="task-list-item-checkbox" disabled> bim</li>&#x000A;<li data-sourcepos="7:1-7:5">foo</li>&#x000A;<li data-sourcepos="8:1-8:5">bar</li>&#x000A;</ul>&#x000A;<ul data-sourcepos="9:1-9:5" dir="auto">&#x000A;<li data-sourcepos="9:1-9:5">baz</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>[ ] foo</p></li><li><p>[x] bar</p></li><li><p>[x] foo
+ </p><ul bullet="*"><li><p>[ ] bar</p></li><li><p>[x] baz</p></li></ul></li><li><p>[ ] bim</p></li><li><p>foo</p></li><li><p>bar</p></li></ul>
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__50:
+ 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">&#x000A;<li data-sourcepos="1:1-1:6">foo</li>&#x000A;<li data-sourcepos="2:1-2:6">bar</li>&#x000A;</ol>&#x000A;<ol start="3" data-sourcepos="3:1-3:6" dir="auto">&#x000A;<li data-sourcepos="3:1-3:6">baz</li>&#x000A;</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__51:
+ canonical: |
+ <p>Foo</p>
+ <ul>
+ <li>bar</li>
+ <li>baz</li>
+ </ul>
+ static: |-
+ <p data-sourcepos="1:1-1:3" dir="auto">Foo</p>&#x000A;<ul data-sourcepos="2:1-3:5" dir="auto">&#x000A;<li data-sourcepos="2:1-2:5">bar</li>&#x000A;<li data-sourcepos="3:1-3:5">baz</li>&#x000A;</ul>
+ wysiwyg: |-
+ <p>Foo</p>
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__52:
+ 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&#x000A;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__53:
+ 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>&#x000A;<ol data-sourcepos="2:1-2:29" dir="auto">&#x000A;<li data-sourcepos="2:1-2:29">The number of doors is 6.</li>&#x000A;</ol>
+ wysiwyg: |-
+ <p>The number of windows in my house is</p>
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__54:
+ 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">&#x000A;<li data-sourcepos="1:1-2:0">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;</li>&#x000A;<li data-sourcepos="3:1-5:0">&#x000A;<p data-sourcepos="3:3-3:5">bar</p>&#x000A;</li>&#x000A;<li data-sourcepos="6:1-6:5">&#x000A;<p data-sourcepos="6:3-6:5">baz</p>&#x000A;</li>&#x000A;</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__55:
+ 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">&#x000A;<li data-sourcepos="1:1-6:9">foo&#x000A;<ul data-sourcepos="2:3-6:9">&#x000A;<li data-sourcepos="2:3-6:9">bar&#x000A;<ul data-sourcepos="3:5-6:9">&#x000A;<li data-sourcepos="3:5-6:9">&#x000A;<p data-sourcepos="3:7-3:9">baz</p>&#x000A;<p data-sourcepos="6:7-6:9">bim</p>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__56:
+ 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">&#x000A;<li data-sourcepos="1:1-1:5">foo</li>&#x000A;<li data-sourcepos="2:1-3:0">bar</li>&#x000A;</ul>&#x000A;&#x000A;<ul data-sourcepos="6:1-7:5" dir="auto">&#x000A;<li data-sourcepos="6:1-6:5">baz</li>&#x000A;<li data-sourcepos="7:1-7:5">bim</li>&#x000A;</ul>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__57:
+ 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">&#x000A;<li data-sourcepos="1:1-4:0">&#x000A;<p data-sourcepos="1:5-1:7">foo</p>&#x000A;<p data-sourcepos="3:5-3:11">notcode</p>&#x000A;</li>&#x000A;<li data-sourcepos="5:1-6:0">&#x000A;<p data-sourcepos="5:5-5:7">foo</p>&#x000A;</li>&#x000A;</ul>&#x000A;&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="9:5-9:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">code</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__58:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">a</li>&#x000A;<li data-sourcepos="2:2-2:4">b</li>&#x000A;<li data-sourcepos="3:3-3:5">c</li>&#x000A;<li data-sourcepos="4:4-4:6">d</li>&#x000A;<li data-sourcepos="5:3-5:5">e</li>&#x000A;<li data-sourcepos="6:2-6:4">f</li>&#x000A;<li data-sourcepos="7:1-7:3">g</li>&#x000A;</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__59:
+ 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">&#x000A;<li data-sourcepos="1:1-2:0">&#x000A;<p data-sourcepos="1:4-1:4">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="3:3-4:0">&#x000A;<p data-sourcepos="3:6-3:6">b</p>&#x000A;</li>&#x000A;<li data-sourcepos="5:4-5:7">&#x000A;<p data-sourcepos="5:7-5:7">c</p>&#x000A;</li>&#x000A;</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__60:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">a</li>&#x000A;<li data-sourcepos="2:2-2:4">b</li>&#x000A;<li data-sourcepos="3:3-3:5">c</li>&#x000A;<li data-sourcepos="4:4-5:7">d&#x000A;- e</li>&#x000A;</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__61:
+ 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">&#x000A;<li data-sourcepos="1:1-2:0">&#x000A;<p data-sourcepos="1:4-1:4">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="3:3-4:0">&#x000A;<p data-sourcepos="3:6-3:6">b</p>&#x000A;</li>&#x000A;</ol>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="5:5-5:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">3. c</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__62:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">&#x000A;<p data-sourcepos="1:3-1:3">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="2:1-3:0">&#x000A;<p data-sourcepos="2:3-2:3">b</p>&#x000A;</li>&#x000A;<li data-sourcepos="4:1-4:3">&#x000A;<p data-sourcepos="4:3-4:3">c</p>&#x000A;</li>&#x000A;</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__63:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">&#x000A;<p data-sourcepos="1:3-1:3">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="2:1-2:1">&#x000A;</li>&#x000A;<li data-sourcepos="4:1-4:3">&#x000A;<p data-sourcepos="4:3-4:3">c</p>&#x000A;</li>&#x000A;</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__64:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">&#x000A;<p data-sourcepos="1:3-1:3">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="2:1-4:3">&#x000A;<p data-sourcepos="2:3-2:3">b</p>&#x000A;<p data-sourcepos="4:3-4:3">c</p>&#x000A;</li>&#x000A;<li data-sourcepos="5:1-5:3">&#x000A;<p data-sourcepos="5:3-5:3">d</p>&#x000A;</li>&#x000A;</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__65:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">&#x000A;<p data-sourcepos="1:3-1:3">a</p>&#x000A;</li>&#x000A;<li data-sourcepos="2:1-4:13">&#x000A;<p data-sourcepos="2:3-2:3">b</p>&#x000A;</li>&#x000A;<li data-sourcepos="5:1-5:3">&#x000A;<p data-sourcepos="5:3-5:3">d</p>&#x000A;</li>&#x000A;</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__66:
+ 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">&#x000A;<li data-sourcepos="1:1-1:3">a</li>&#x000A;<li data-sourcepos="2:1-6:5">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="2:3-6:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">b</span>&#x000A;<span id="LC2" class="line" lang="plaintext"></span>&#x000A;<span id="LC3" class="line" lang="plaintext"></span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;<li data-sourcepos="7:1-7:3">c</li>&#x000A;</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__67:
+ 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">&#x000A;<li data-sourcepos="1:1-4:5">a&#x000A;<ul data-sourcepos="2:3-4:5">&#x000A;<li data-sourcepos="2:3-4:5">&#x000A;<p data-sourcepos="2:5-2:5">b</p>&#x000A;<p data-sourcepos="4:5-4:5">c</p>&#x000A;</li>&#x000A;</ul>&#x000A;</li>&#x000A;<li data-sourcepos="5:1-5:3">d</li>&#x000A;</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__68:
+ canonical: |
+ <ul>
+ <li>a
+ <blockquote>
+ <p>b</p>
+ </blockquote>
+ </li>
+ <li>c</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-4:3" dir="auto">&#x000A;<li data-sourcepos="1:1-3:3">a&#x000A;<blockquote data-sourcepos="2:3-3:3">&#x000A;<p data-sourcepos="2:5-2:5">b</p>&#x000A;</blockquote>&#x000A;</li>&#x000A;<li data-sourcepos="4:1-4:3">c</li>&#x000A;</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__69:
+ 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">&#x000A;<li data-sourcepos="1:1-5:5">a&#x000A;<blockquote data-sourcepos="2:3-2:5">&#x000A;<p data-sourcepos="2:5-2:5">b</p>&#x000A;</blockquote>&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="3:3-5:5" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">c</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;</li>&#x000A;<li data-sourcepos="6:1-6:3">d</li>&#x000A;</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__70:
+ canonical: |
+ <ul>
+ <li>a</li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-1:3" dir="auto">&#x000A;<li data-sourcepos="1:1-1:3">a</li>&#x000A;</ul>
+ wysiwyg: |-
+ <ul bullet="*"><li><p>a</p></li></ul>
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__71:
+ canonical: |
+ <ul>
+ <li>a
+ <ul>
+ <li>b</li>
+ </ul>
+ </li>
+ </ul>
+ static: |-
+ <ul data-sourcepos="1:1-2:5" dir="auto">&#x000A;<li data-sourcepos="1:1-2:5">a&#x000A;<ul data-sourcepos="2:3-2:5">&#x000A;<li data-sourcepos="2:3-2:5">b</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__72:
+ canonical: |
+ <ol>
+ <li>
+ <pre><code>foo
+ </code></pre>
+ <p>bar</p>
+ </li>
+ </ol>
+ static: |-
+ <ol data-sourcepos="1:1-5:6" dir="auto">&#x000A;<li data-sourcepos="1:1-5:6">&#x000A;<div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:4-3:6" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>&#x000A;<p data-sourcepos="5:4-5:6">bar</p>&#x000A;</li>&#x000A;</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__73:
+ 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">&#x000A;<li data-sourcepos="1:1-4:5">&#x000A;<p data-sourcepos="1:3-1:5">foo</p>&#x000A;<ul data-sourcepos="2:3-3:0">&#x000A;<li data-sourcepos="2:3-3:0">bar</li>&#x000A;</ul>&#x000A;<p data-sourcepos="4:3-4:5">baz</p>&#x000A;</li>&#x000A;</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__74:
+ 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">&#x000A;<li data-sourcepos="1:1-4:0">&#x000A;<p data-sourcepos="1:3-1:3">a</p>&#x000A;<ul data-sourcepos="2:3-4:0">&#x000A;<li data-sourcepos="2:3-2:5">b</li>&#x000A;<li data-sourcepos="3:3-4:0">c</li>&#x000A;</ul>&#x000A;</li>&#x000A;<li data-sourcepos="5:1-7:5">&#x000A;<p data-sourcepos="5:3-5:3">d</p>&#x000A;<ul data-sourcepos="6:3-7:5">&#x000A;<li data-sourcepos="6:3-6:5">e</li>&#x000A;<li data-sourcepos="7:3-7:5">f</li>&#x000A;</ul>&#x000A;</li>&#x000A;</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__01:
+ 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__01:
+ 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__02:
+ 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__03:
+ 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*&#x000A;&lt;br/&gt; not a tag&#x000A;<a href="/foo">not a link</a>&#x000A;`not code`&#x000A;1. not a list&#x000A;* not a list&#x000A;<span>#</span> not a heading&#x000A;[foo]: /url "not a reference"&#x000A;<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__04:
+ 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__05:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>&#x000A;bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_02__inlines__backslash_escapes__06:
+ 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__07:
+ canonical: |
+ <pre><code>\[\]
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:8" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
+06_02__inlines__backslash_escapes__08:
+ canonical: |
+ <pre><code>\[\]
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">\[\]</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</div>
+ wysiwyg: |-
+ <pre class="content-editor-code-block undefined code highlight"><code>\[\]</code></pre>
+06_02__inlines__backslash_escapes__09:
+ 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__10:
+ canonical: |
+ <a href="/bar\/)">
+ static: |-
+ <a href="/bar%5C/)" rel="nofollow noreferrer noopener" target="_blank"></a>
+ wysiwyg: |-
+ <p></p>
+06_02__inlines__backslash_escapes__11:
+ 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__12:
+ 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__13:
+ canonical: |
+ <pre><code class="language-foo+bar">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__01:
+ canonical: |
+ <p>  &amp; © Æ Ď
+ ¾ ℋ ⅆ
+ ∲ ≧̸</p>
+ static: |-
+ <p data-sourcepos="1:1-3:32" dir="auto">  &amp; © Æ Ď&#x000A;¾ ℋ ⅆ&#x000A;∲ ≧̸</p>
+ wysiwyg: |-
+ <p>&nbsp; &amp; © Æ Ď
+ ¾ ℋ ⅆ
+ ∲ ≧̸</p>
+06_03__inlines__entity_and_numeric_character_references__02:
+ 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__03:
+ 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__04:
+ 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;&#x000A;&amp;#987654321;&#x000A;&amp;#abcdef0;&#x000A;&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__05:
+ 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__06:
+ 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__07:
+ 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__08:
+ 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__09:
+ 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__10:
+ canonical: |
+ <pre><code class="language-föö">foo
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:1-3:3" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">foo</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__11:
+ 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__12:
+ canonical: |
+ <pre><code>f&amp;ouml;f&amp;ouml;
+ </code></pre>
+ static: |-
+ <div class="gl-relative markdown-code-block js-markdown-code">&#x000A;<pre data-sourcepos="1:5-1:18" class="code highlight js-syntax-highlight language-plaintext" lang="plaintext" v-pre="true"><code><span id="LC1" class="line" lang="plaintext">f&amp;ouml;f&amp;ouml;</span></code></pre>&#x000A;<copy-code></copy-code>&#x000A;</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__13:
+ canonical: |
+ <p>*foo*
+ <em>foo</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto">*foo*&#x000A;<em>foo</em></p>
+ wysiwyg: |-
+ <p>*foo*
+ <em>foo</em></p>
+06_03__inlines__entity_and_numeric_character_references__14:
+ canonical: |
+ <p>* foo</p>
+ <ul>
+ <li>foo</li>
+ </ul>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">* foo</p>&#x000A;<ul data-sourcepos="3:1-3:5" dir="auto">&#x000A;<li data-sourcepos="3:1-3:5">foo</li>&#x000A;</ul>
+ wysiwyg: |-
+ <p>* foo</p>
+06_03__inlines__entity_and_numeric_character_references__15:
+ canonical: |
+ <p>foo
+
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-1:16" dir="auto">foo&#x000A;&#x000A;bar</p>
+ wysiwyg: |-
+ <p>foo
+
+ bar</p>
+06_03__inlines__entity_and_numeric_character_references__16:
+ 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__17:
+ 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__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ canonical: |
+ <p><code> </code>
+ <code> </code></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><code> </code>&#x000A;<code> </code></p>
+ wysiwyg: |-
+ <p></p>
+06_04__inlines__code_spans__08:
+ 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__09:
+ 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__10:
+ 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__11:
+ 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__12:
+ 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__13:
+ 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__14:
+ 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__15:
+ 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__16:
+ 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__17:
+ 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__18:
+ 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__19:
+ 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__20:
+ 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__21:
+ 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__22:
+ 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__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ 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__08:
+ 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__09:
+ 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__10:
+ 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__11:
+ 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__12:
+ canonical: |
+ <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto">приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+ wysiwyg: |-
+ <p>приÑтанÑм_ÑтремÑÑ‚ÑÑ_</p>
+06_05__inlines__emphasis_and_strong_emphasis__13:
+ 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__14:
+ 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__15:
+ 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__16:
+ 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__17:
+ canonical: |
+ <p>*foo bar
+ *</p>
+ static: |-
+ <p data-sourcepos="1:1-2:1" dir="auto">*foo bar&#x000A;*</p>
+ wysiwyg: |-
+ <p>*foo bar
+ *</p>
+06_05__inlines__emphasis_and_strong_emphasis__18:
+ 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__19:
+ 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__20:
+ 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__21:
+ 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__22:
+ 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__23:
+ 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__24:
+ 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__25:
+ canonical: |
+ <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+ static: |-
+ <p data-sourcepos="1:1-1:38" dir="auto">_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+ wysiwyg: |-
+ <p>_приÑтанÑм_ÑтремÑÑ‚ÑÑ</p>
+06_05__inlines__emphasis_and_strong_emphasis__26:
+ 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__27:
+ 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__28:
+ 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__29:
+ 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__30:
+ 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__31:
+ 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__32:
+ 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__33:
+ 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__34:
+ canonical: |
+ <p>__
+ foo bar__</p>
+ static: |-
+ <p data-sourcepos="1:1-2:9" dir="auto">__&#x000A;foo bar__</p>
+ wysiwyg: |-
+ <p>__
+ foo bar__</p>
+06_05__inlines__emphasis_and_strong_emphasis__35:
+ 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__36:
+ 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__37:
+ 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__38:
+ canonical: |
+ <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+ static: |-
+ <p data-sourcepos="1:1-1:40" dir="auto">приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+ wysiwyg: |-
+ <p>приÑтанÑм__ÑтремÑÑ‚ÑÑ__</p>
+06_05__inlines__emphasis_and_strong_emphasis__39:
+ 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__40:
+ 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__41:
+ 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__42:
+ 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__43:
+ 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__44:
+ 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.&#x000A;<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__45:
+ 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__46:
+ 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__47:
+ 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__48:
+ 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__49:
+ 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__50:
+ 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__51:
+ canonical: |
+ <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+ static: |-
+ <p data-sourcepos="1:1-1:40" dir="auto">__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+ wysiwyg: |-
+ <p>__приÑтанÑм__ÑтремÑÑ‚ÑÑ</p>
+06_05__inlines__emphasis_and_strong_emphasis__52:
+ 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__53:
+ 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__54:
+ 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__55:
+ canonical: |
+ <p><em>foo
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo&#x000A;bar</em></p>
+ wysiwyg: |-
+ <p><em>foo
+ bar</em></p>
+06_05__inlines__emphasis_and_strong_emphasis__56:
+ 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__57:
+ 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__58:
+ 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__59:
+ 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__60:
+ 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__61:
+ 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__62:
+ 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__63:
+ 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__64:
+ 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__65:
+ 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__66:
+ 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__67:
+ 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__68:
+ 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__69:
+ 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__70:
+ 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__71:
+ 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__72:
+ 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__73:
+ canonical: |
+ <p><strong>foo
+ bar</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto"><strong>foo&#x000A;bar</strong></p>
+ wysiwyg: |-
+ <p><strong>foo
+ bar</strong></p>
+06_05__inlines__emphasis_and_strong_emphasis__74:
+ 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__75:
+ 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__76:
+ 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__77:
+ 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__78:
+ 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__79:
+ 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__80:
+ 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__81:
+ 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__82:
+ 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>&#x000A;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__83:
+ 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__84:
+ 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__85:
+ 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__86:
+ 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__87:
+ 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__88:
+ 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__89:
+ 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__90:
+ 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__91:
+ 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__92:
+ 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__93:
+ 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__94:
+ 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__95:
+ 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__96:
+ 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__97:
+ 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__98:
+ 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__99:
+ 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__01:
+ 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>~~Hi~~ Hello, world!</p>
+06_06__inlines__strikethrough_extension__02:
+ canonical: |
+ <p>This ~~has a</p>
+ <p>new paragraph~~.</p>
+ static: |-
+ <p data-sourcepos="1:1-1:12" dir="auto">This ~~has a</p>&#x000A;<p data-sourcepos="3:1-3:16" dir="auto">new paragraph~~.</p>
+ wysiwyg: |-
+ <p>This ~~has a</p>
+06_07__inlines__links__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ canonical: |
+ <p>[link](foo
+ bar)</p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto">[link](foo&#x000A;bar)</p>
+ wysiwyg: |-
+ <p>[link](foo
+ bar)</p>
+06_07__inlines__links__08:
+ 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__09:
+ 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__10:
+ 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__11:
+ 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&#x000A;<a href="%3Cb">a</a>c&gt;&#x000A;[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__12:
+ 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__13:
+ 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__14:
+ 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__15:
+ 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__16:
+ 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__17:
+ 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>&#x000A;<p data-sourcepos="3:1-3:35" dir="auto"><a href="http://example.com#fragment" rel="nofollow noreferrer noopener" target="_blank">link</a></p>&#x000A;<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__18:
+ 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__19:
+ 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__20:
+ 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__21:
+ 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>&#x000A;<a href="/url" title="title">link</a>&#x000A;<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__22:
+ 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__23:
+ 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__24:
+ 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__25:
+ 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__26:
+ 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__27:
+ 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__28:
+ 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__29:
+ 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__30:
+ 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__31:
+ 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__32:
+ 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__33:
+ 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__34:
+ 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__35:
+ 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__36:
+ 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__37:
+ 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__38:
+ 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__39:
+ 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__40:
+ 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__41:
+ 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__42:
+ 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__43:
+ 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__44:
+ 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__45:
+ 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__46:
+ 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__47:
+ 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__48:
+ 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__49:
+ 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__50:
+ 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__51:
+ 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__52:
+ 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__53:
+ 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__54:
+ 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__55:
+ 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__56:
+ 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__57:
+ 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__58:
+ 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__59:
+ canonical: |
+ <p>[foo]
+ <a href="/url" title="title">bar</a></p>
+ static: |-
+ <p data-sourcepos="1:1-2:5" dir="auto">[foo]&#x000A;<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__60:
+ 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__61:
+ 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__62:
+ canonical: |
+ <p>[foo][ref[]</p>
+ <p>[ref[]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto">[foo][ref[]</p>&#x000A;<p data-sourcepos="3:1-3:12" dir="auto">[ref[]: /uri</p>
+ wysiwyg: |-
+ <p>[foo][ref[]</p>
+06_07__inlines__links__63:
+ 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>&#x000A;<p data-sourcepos="3:1-3:16" dir="auto">[ref[bar]]: /uri</p>
+ wysiwyg: |-
+ <p>[foo][ref[bar]]</p>
+06_07__inlines__links__64:
+ canonical: |
+ <p>[[[foo]]]</p>
+ <p>[[[foo]]]: /url</p>
+ static: |-
+ <p data-sourcepos="1:1-1:9" dir="auto">[[[foo]]]</p>&#x000A;<p data-sourcepos="3:1-3:15" dir="auto">[[[foo]]]: /url</p>
+ wysiwyg: |-
+ <p>[[[foo]]]</p>
+06_07__inlines__links__65:
+ 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__66:
+ 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__67:
+ canonical: |
+ <p>[]</p>
+ <p>[]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-1:2" dir="auto">[]</p>&#x000A;<p data-sourcepos="3:1-3:8" dir="auto">[]: /uri</p>
+ wysiwyg: |-
+ <p>[]</p>
+06_07__inlines__links__68:
+ canonical: |
+ <p>[
+ ]</p>
+ <p>[
+ ]: /uri</p>
+ static: |-
+ <p data-sourcepos="1:1-2:2" dir="auto">[&#x000A;]</p>&#x000A;<p data-sourcepos="4:1-5:8" dir="auto">[&#x000A;]: /uri</p>
+ wysiwyg: |-
+ <p>[
+ ]</p>
+06_07__inlines__links__69:
+ 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__70:
+ 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__71:
+ 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__72:
+ 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>&#x000A;[]</p>
+ wysiwyg: |-
+ <p><a target="_blank" rel="noopener noreferrer nofollow" href="/url" title="title">foo</a>
+ []</p>
+06_07__inlines__links__73:
+ 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__74:
+ 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__75:
+ 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__76:
+ 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__77:
+ 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__78:
+ 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__79:
+ canonical: |
+ <p>[foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:6" dir="auto">[foo]</p>
+ wysiwyg: |-
+ <p>[foo]</p>
+06_07__inlines__links__80:
+ 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__81:
+ 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__82:
+ 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__83:
+ 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__84:
+ 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__85:
+ 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__86:
+ 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__87:
+ 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__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ 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__08:
+ 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__09:
+ 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__10:
+ 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__11:
+ 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__12:
+ 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__13:
+ 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__14:
+ 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__15:
+ 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__16:
+ 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>&#x000A;[]</p>
+ wysiwyg: |-
+ <p><img src="/url" alt="foo" title="title">
+ []</p>
+06_08__inlines__images__17:
+ 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__18:
+ 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__19:
+ canonical: |
+ <p>![[foo]]</p>
+ <p>[[foo]]: /url &quot;title&quot;</p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto">![[foo]]</p>&#x000A;<p data-sourcepos="3:1-3:21" dir="auto">[[foo]]: /url "title"</p>
+ wysiwyg: |-
+ <p>![[foo]]</p>
+06_08__inlines__images__20:
+ 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__21:
+ canonical: |
+ <p>![foo]</p>
+ static: |-
+ <p data-sourcepos="1:1-1:7" dir="auto">![foo]</p>
+ wysiwyg: |-
+ <p>![foo]</p>
+06_08__inlines__images__22:
+ 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__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ 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__08:
+ 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__09:
+ 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;http://foo.bar/baz bim&gt;</p>
+06_09__inlines__autolinks__10:
+ 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__11:
+ 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__12:
+ 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__13:
+ 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;foo+@bar.example.com&gt;</p>
+06_09__inlines__autolinks__14:
+ 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__15:
+ 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; http://foo.bar &gt;</p>
+06_09__inlines__autolinks__16:
+ 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__17:
+ 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__18:
+ 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>http://example.com</p>
+06_09__inlines__autolinks__19:
+ 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>foo@bar.example.com</p>
+06_10__inlines__autolinks_extension__01:
+ 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>www.commonmark.org</p>
+06_10__inlines__autolinks_extension__02:
+ 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 www.commonmark.org/help for more information.</p>
+06_10__inlines__autolinks_extension__03:
+ 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>&#x000A;<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 www.commonmark.org.</p>
+06_10__inlines__autolinks_extension__04:
+ 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>&#x000A;<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>&#x000A;<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>&#x000A;<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>www.google.com/search?q=Markup+(business)</p>
+06_10__inlines__autolinks_extension__05:
+ 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>www.google.com/search?q=(business))+ok</p>
+06_10__inlines__autolinks_extension__06:
+ 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>&#x000A;<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>www.google.com/search?q=commonmark&amp;hl=en</p>
+06_10__inlines__autolinks_extension__07:
+ 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>www.commonmark.org/he&lt;lp</p>
+06_10__inlines__autolinks_extension__08:
+ 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>&#x000A;<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>&#x000A;<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>http://commonmark.org</p>
+06_10__inlines__autolinks_extension__09:
+ 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>foo@bar.baz</p>
+06_10__inlines__autolinks_extension__10:
+ 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 hello+xyz@mail.example is.</p>
+06_10__inlines__autolinks_extension__11:
+ 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>&#x000A;<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>&#x000A;<p data-sourcepos="5:1-5:12" dir="auto">a.b-c_d@a.b-</p>&#x000A;<p data-sourcepos="7:1-7:12" dir="auto">a.b-c_d@a.b_</p>
+ wysiwyg: |-
+ <p>a.b-c_d@a.b</p>
+06_11__inlines__raw_html__01:
+ 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__02:
+ 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__03:
+ 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__04:
+ 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__05:
+ 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__06:
+ 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__07:
+ 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__08:
+ 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__09:
+ 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;&#x000A;foo&gt;&lt;bar/ &gt;&#x000A;&lt;foo bar=baz&#x000A;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__10:
+ 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__11:
+ canonical: |
+ <p></a></foo ></p>
+ static: |-
+ <p data-sourcepos="1:1-1:11" dir="auto"></p>
+ wysiwyg: |-
+ <p></p>
+06_11__inlines__raw_html__12:
+ 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__13:
+ 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:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__14:
+ 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__15:
+ 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>&#x000A;<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__16:
+ 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:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__17:
+ canonical: |
+ <p>foo <!ELEMENT br EMPTY></p>
+ static: |-
+ <p data-sourcepos="1:1-1:23" dir="auto">foo </p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__18:
+ canonical: |
+ <p>foo <![CDATA[>&<]]></p>
+ static: |-
+ <p data-sourcepos="1:1-1:19" dir="auto">foo &amp;</p>
+ wysiwyg: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__19:
+ 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__20:
+ 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__21:
+ 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__01:
+ 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;&#x000A;&lt;blockquote&gt;&#x000A; &lt;xmp&gt; is disallowed. &lt;XMP&gt; is also disallowed.&#x000A;&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__01:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>&#x000A;baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__02:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>&#x000A;baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__03:
+ canonical: |
+ <p>foo<br />
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo<br>&#x000A;baz</p>
+ wysiwyg: |-
+ <p>foo<br>
+ baz</p>
+06_13__inlines__hard_line_breaks__04:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">foo<br>&#x000A;bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_13__inlines__hard_line_breaks__05:
+ canonical: |
+ <p>foo<br />
+ bar</p>
+ static: |-
+ <p data-sourcepos="1:1-2:8" dir="auto">foo<br>&#x000A;bar</p>
+ wysiwyg: |-
+ <p>foo<br>
+ bar</p>
+06_13__inlines__hard_line_breaks__06:
+ canonical: |
+ <p><em>foo<br />
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>&#x000A;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__07:
+ canonical: |
+ <p><em>foo<br />
+ bar</em></p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto"><em>foo<br>&#x000A;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__08:
+ 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__09:
+ 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__10:
+ 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__11:
+ 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__12:
+ 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__13:
+ 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__14:
+ canonical: |
+ <h3>foo\</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:8" dir="auto">&#x000A;<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__15:
+ canonical: |
+ <h3>foo</h3>
+ static: |-
+ <h3 data-sourcepos="1:1-1:7" dir="auto">&#x000A;<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__01:
+ canonical: |
+ <p>foo
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:3" dir="auto">foo&#x000A;baz</p>
+ wysiwyg: |-
+ <p>foo
+ baz</p>
+06_14__inlines__soft_line_breaks__02:
+ canonical: |
+ <p>foo
+ baz</p>
+ static: |-
+ <p data-sourcepos="1:1-2:4" dir="auto">foo&#x000A;baz</p>
+ wysiwyg: |-
+ <p>foo
+ baz</p>
+06_15__inlines__textual_content__01:
+ 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__02:
+ 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__03:
+ 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__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01:
+ canonical: |
+ <p><strong>bold</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><strong>bold</strong></p>
+ wysiwyg: |-
+ <p><strong>bold</strong></p>
+08_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01:
+ canonical: |
+ <p><strong>
+ bold
+ </strong></p>
+ static: |-
+ <strong>&#x000A;bold&#x000A;</strong>
+ wysiwyg: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
diff --git a/spec/fixtures/glfm/example_snapshots/markdown.yml b/spec/fixtures/glfm/example_snapshots/markdown.yml
new file mode 100644
index 00000000000..8232b158050
--- /dev/null
+++ b/spec/fixtures/glfm/example_snapshots/markdown.yml
@@ -0,0 +1,2203 @@
+---
+02_01__preliminaries__tabs__01: "\tfoo\tbaz\t\tbim\n"
+02_01__preliminaries__tabs__02: " \tfoo\tbaz\t\tbim\n"
+02_01__preliminaries__tabs__03: " a\ta\n á½\ta\n"
+02_01__preliminaries__tabs__04: " - foo\n\n\tbar\n"
+02_01__preliminaries__tabs__05: "- foo\n\n\t\tbar\n"
+02_01__preliminaries__tabs__06: ">\t\tfoo\n"
+02_01__preliminaries__tabs__07: "-\t\tfoo\n"
+02_01__preliminaries__tabs__08: " foo\n\tbar\n"
+02_01__preliminaries__tabs__09: " - foo\n - bar\n\t - baz\n"
+02_01__preliminaries__tabs__10: "#\tFoo\n"
+02_01__preliminaries__tabs__11: "*\t*\t*\t\n"
+03_01__blocks_and_inlines__precedence__01: |
+ - `one
+ - two`
+04_01__leaf_blocks__thematic_breaks__01: |
+ ***
+ ---
+ ___
+04_01__leaf_blocks__thematic_breaks__02: |
+ +++
+04_01__leaf_blocks__thematic_breaks__03: |
+ ===
+04_01__leaf_blocks__thematic_breaks__04: |
+ --
+ **
+ __
+04_01__leaf_blocks__thematic_breaks__05: |2
+ ***
+ ***
+ ***
+04_01__leaf_blocks__thematic_breaks__06: |2
+ ***
+04_01__leaf_blocks__thematic_breaks__07: |
+ Foo
+ ***
+04_01__leaf_blocks__thematic_breaks__08: |
+ _____________________________________
+04_01__leaf_blocks__thematic_breaks__09: |2
+ - - -
+04_01__leaf_blocks__thematic_breaks__10: |2
+ ** * ** * ** * **
+04_01__leaf_blocks__thematic_breaks__11: |
+ - - - -
+04_01__leaf_blocks__thematic_breaks__12: "- - - - \n"
+04_01__leaf_blocks__thematic_breaks__13: |
+ _ _ _ _ a
+
+ a------
+
+ ---a---
+04_01__leaf_blocks__thematic_breaks__14: |2
+ *-*
+04_01__leaf_blocks__thematic_breaks__15: |
+ - foo
+ ***
+ - bar
+04_01__leaf_blocks__thematic_breaks__16: |
+ Foo
+ ***
+ bar
+04_01__leaf_blocks__thematic_breaks__17: |
+ Foo
+ ---
+ bar
+04_01__leaf_blocks__thematic_breaks__18: |
+ * Foo
+ * * *
+ * Bar
+04_01__leaf_blocks__thematic_breaks__19: |
+ - Foo
+ - * * *
+04_02__leaf_blocks__atx_headings__01: |
+ # foo
+ ## foo
+ ### foo
+ #### foo
+ ##### foo
+ ###### foo
+04_02__leaf_blocks__atx_headings__02: |
+ ####### foo
+04_02__leaf_blocks__atx_headings__03: |
+ #5 bolt
+
+ #hashtag
+04_02__leaf_blocks__atx_headings__04: |
+ \## foo
+04_02__leaf_blocks__atx_headings__05: |
+ # foo *bar* \*baz\*
+04_02__leaf_blocks__atx_headings__06: "# foo \n"
+04_02__leaf_blocks__atx_headings__07: |2
+ ### foo
+ ## foo
+ # foo
+04_02__leaf_blocks__atx_headings__08: |2
+ # foo
+04_02__leaf_blocks__atx_headings__09: |
+ foo
+ # bar
+04_02__leaf_blocks__atx_headings__10: |
+ ## foo ##
+ ### bar ###
+04_02__leaf_blocks__atx_headings__11: |
+ # foo ##################################
+ ##### foo ##
+04_02__leaf_blocks__atx_headings__12: "### foo ### \n"
+04_02__leaf_blocks__atx_headings__13: |
+ ### foo ### b
+04_02__leaf_blocks__atx_headings__14: |
+ # foo#
+04_02__leaf_blocks__atx_headings__15: |
+ ### foo \###
+ ## foo #\##
+ # foo \#
+04_02__leaf_blocks__atx_headings__16: |
+ ****
+ ## foo
+ ****
+04_02__leaf_blocks__atx_headings__17: |
+ Foo bar
+ # baz
+ Bar foo
+04_02__leaf_blocks__atx_headings__18: "## \n#\n### ###\n"
+04_03__leaf_blocks__setext_headings__01: |
+ Foo *bar*
+ =========
+
+ Foo *bar*
+ ---------
+04_03__leaf_blocks__setext_headings__02: |
+ Foo *bar
+ baz*
+ ====
+04_03__leaf_blocks__setext_headings__03: " Foo *bar\nbaz*\t\n====\n"
+04_03__leaf_blocks__setext_headings__04: |
+ Foo
+ -------------------------
+
+ Foo
+ =
+04_03__leaf_blocks__setext_headings__05: |2
+ Foo
+ ---
+
+ Foo
+ -----
+
+ Foo
+ ===
+04_03__leaf_blocks__setext_headings__06: |2
+ Foo
+ ---
+
+ Foo
+ ---
+04_03__leaf_blocks__setext_headings__07: "Foo\n ---- \n"
+04_03__leaf_blocks__setext_headings__08: |
+ Foo
+ ---
+04_03__leaf_blocks__setext_headings__09: |
+ Foo
+ = =
+
+ Foo
+ --- -
+04_03__leaf_blocks__setext_headings__10: "Foo \n-----\n"
+04_03__leaf_blocks__setext_headings__11: |
+ Foo\
+ ----
+04_03__leaf_blocks__setext_headings__12: |
+ `Foo
+ ----
+ `
+
+ <a title="a lot
+ ---
+ of dashes"/>
+04_03__leaf_blocks__setext_headings__13: |
+ > Foo
+ ---
+04_03__leaf_blocks__setext_headings__14: |
+ > foo
+ bar
+ ===
+04_03__leaf_blocks__setext_headings__15: |
+ - Foo
+ ---
+04_03__leaf_blocks__setext_headings__16: |
+ Foo
+ Bar
+ ---
+04_03__leaf_blocks__setext_headings__17: |
+ ---
+ Foo
+ ---
+ Bar
+ ---
+ Baz
+04_03__leaf_blocks__setext_headings__18: |2
+
+ ====
+04_03__leaf_blocks__setext_headings__19: |
+ ---
+ ---
+04_03__leaf_blocks__setext_headings__20: |
+ - foo
+ -----
+04_03__leaf_blocks__setext_headings__21: |2
+ foo
+ ---
+04_03__leaf_blocks__setext_headings__22: |
+ > foo
+ -----
+04_03__leaf_blocks__setext_headings__23: |
+ \> foo
+ ------
+04_03__leaf_blocks__setext_headings__24: |
+ Foo
+
+ bar
+ ---
+ baz
+04_03__leaf_blocks__setext_headings__25: |
+ Foo
+ bar
+
+ ---
+
+ baz
+04_03__leaf_blocks__setext_headings__26: |
+ Foo
+ bar
+ * * *
+ baz
+04_03__leaf_blocks__setext_headings__27: |
+ Foo
+ bar
+ \---
+ baz
+04_04__leaf_blocks__indented_code_blocks__01: |2
+ a simple
+ indented code block
+04_04__leaf_blocks__indented_code_blocks__02: |2
+ - foo
+
+ bar
+04_04__leaf_blocks__indented_code_blocks__03: |
+ 1. foo
+
+ - bar
+04_04__leaf_blocks__indented_code_blocks__04: |2
+ <a/>
+ *hi*
+
+ - one
+04_04__leaf_blocks__indented_code_blocks__05: " chunk1\n\n chunk2\n \n \n \n
+ \ chunk3\n"
+04_04__leaf_blocks__indented_code_blocks__06: " chunk1\n \n chunk2\n"
+04_04__leaf_blocks__indented_code_blocks__07: |+
+ Foo
+ bar
+
+04_04__leaf_blocks__indented_code_blocks__08: |2
+ foo
+ bar
+04_04__leaf_blocks__indented_code_blocks__09: |
+ # Heading
+ foo
+ Heading
+ ------
+ foo
+ ----
+04_04__leaf_blocks__indented_code_blocks__10: |2
+ foo
+ bar
+04_04__leaf_blocks__indented_code_blocks__11: "\n \n foo\n \n\n"
+04_04__leaf_blocks__indented_code_blocks__12: " foo \n"
+04_05__leaf_blocks__fenced_code_blocks__01: |
+ ```
+ <
+ >
+ ```
+04_05__leaf_blocks__fenced_code_blocks__02: |
+ ~~~
+ <
+ >
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__03: |
+ ``
+ foo
+ ``
+04_05__leaf_blocks__fenced_code_blocks__04: |
+ ```
+ aaa
+ ~~~
+ ```
+04_05__leaf_blocks__fenced_code_blocks__05: |
+ ~~~
+ aaa
+ ```
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__06: |
+ ````
+ aaa
+ ```
+ ``````
+04_05__leaf_blocks__fenced_code_blocks__07: |
+ ~~~~
+ aaa
+ ~~~
+ ~~~~
+04_05__leaf_blocks__fenced_code_blocks__08: |
+ ```
+04_05__leaf_blocks__fenced_code_blocks__09: |
+ `````
+
+ ```
+ aaa
+04_05__leaf_blocks__fenced_code_blocks__10: |
+ > ```
+ > aaa
+
+ bbb
+04_05__leaf_blocks__fenced_code_blocks__11: "```\n\n \n```\n"
+04_05__leaf_blocks__fenced_code_blocks__12: |
+ ```
+ ```
+04_05__leaf_blocks__fenced_code_blocks__13: |2
+ ```
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__14: |2
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__15: |2
+ ```
+ aaa
+ aaa
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__16: |2
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__17: |
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__18: |2
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__19: |
+ ```
+ aaa
+ ```
+04_05__leaf_blocks__fenced_code_blocks__20: |
+ ``` ```
+ aaa
+04_05__leaf_blocks__fenced_code_blocks__21: |
+ ~~~~~~
+ aaa
+ ~~~ ~~
+04_05__leaf_blocks__fenced_code_blocks__22: |
+ foo
+ ```
+ bar
+ ```
+ baz
+04_05__leaf_blocks__fenced_code_blocks__23: |
+ foo
+ ---
+ ~~~
+ bar
+ ~~~
+ # baz
+04_05__leaf_blocks__fenced_code_blocks__24: |
+ ```ruby
+ def foo(x)
+ return 3
+ end
+ ```
+04_05__leaf_blocks__fenced_code_blocks__25: |
+ ~~~~ ruby startline=3 $%@#$
+ def foo(x)
+ return 3
+ end
+ ~~~~~~~
+04_05__leaf_blocks__fenced_code_blocks__26: |
+ ````;
+ ````
+04_05__leaf_blocks__fenced_code_blocks__27: |
+ ``` aa ```
+ foo
+04_05__leaf_blocks__fenced_code_blocks__28: |
+ ~~~ aa ``` ~~~
+ foo
+ ~~~
+04_05__leaf_blocks__fenced_code_blocks__29: |
+ ```
+ ``` aaa
+ ```
+04_06__leaf_blocks__html_blocks__01: |
+ <table><tr><td>
+ <pre>
+ **Hello**,
+
+ _world_.
+ </pre>
+ </td></tr></table>
+04_06__leaf_blocks__html_blocks__02: |
+ <table>
+ <tr>
+ <td>
+ hi
+ </td>
+ </tr>
+ </table>
+
+ okay.
+04_06__leaf_blocks__html_blocks__03: |2
+ <div>
+ *hello*
+ <foo><a>
+04_06__leaf_blocks__html_blocks__04: |
+ </div>
+ *foo*
+04_06__leaf_blocks__html_blocks__05: |
+ <DIV CLASS="foo">
+
+ *Markdown*
+
+ </DIV>
+04_06__leaf_blocks__html_blocks__06: |
+ <div id="foo"
+ class="bar">
+ </div>
+04_06__leaf_blocks__html_blocks__07: |
+ <div id="foo" class="bar
+ baz">
+ </div>
+04_06__leaf_blocks__html_blocks__08: |
+ <div>
+ *foo*
+
+ *bar*
+04_06__leaf_blocks__html_blocks__09: |
+ <div id="foo"
+ *hi*
+04_06__leaf_blocks__html_blocks__10: |
+ <div class
+ foo
+04_06__leaf_blocks__html_blocks__11: |
+ <div *???-&&&-<---
+ *foo*
+04_06__leaf_blocks__html_blocks__12: |
+ <div><a href="bar">*foo*</a></div>
+04_06__leaf_blocks__html_blocks__13: |
+ <table><tr><td>
+ foo
+ </td></tr></table>
+04_06__leaf_blocks__html_blocks__14: |
+ <div></div>
+ ``` c
+ int x = 33;
+ ```
+04_06__leaf_blocks__html_blocks__15: |
+ <a href="foo">
+ *bar*
+ </a>
+04_06__leaf_blocks__html_blocks__16: |
+ <Warning>
+ *bar*
+ </Warning>
+04_06__leaf_blocks__html_blocks__17: |
+ <i class="foo">
+ *bar*
+ </i>
+04_06__leaf_blocks__html_blocks__18: |
+ </ins>
+ *bar*
+04_06__leaf_blocks__html_blocks__19: |
+ <del>
+ *foo*
+ </del>
+04_06__leaf_blocks__html_blocks__20: |
+ <del>
+
+ *foo*
+
+ </del>
+04_06__leaf_blocks__html_blocks__21: |
+ <del>*foo*</del>
+04_06__leaf_blocks__html_blocks__22: |
+ <pre language="haskell"><code>
+ import Text.HTML.TagSoup
+
+ main :: IO ()
+ main = print $ parseTags tags
+ </code></pre>
+ okay
+04_06__leaf_blocks__html_blocks__23: |
+ <script type="text/javascript">
+ // JavaScript example
+
+ document.getElementById("demo").innerHTML = "Hello JavaScript!";
+ </script>
+ okay
+04_06__leaf_blocks__html_blocks__24: |
+ <style
+ type="text/css">
+ h1 {color:red;}
+
+ p {color:blue;}
+ </style>
+ okay
+04_06__leaf_blocks__html_blocks__25: |
+ <style
+ type="text/css">
+
+ foo
+04_06__leaf_blocks__html_blocks__26: |
+ > <div>
+ > foo
+
+ bar
+04_06__leaf_blocks__html_blocks__27: |
+ - <div>
+ - foo
+04_06__leaf_blocks__html_blocks__28: |
+ <style>p{color:red;}</style>
+ *foo*
+04_06__leaf_blocks__html_blocks__29: |
+ <!-- foo -->*bar*
+ *baz*
+04_06__leaf_blocks__html_blocks__30: |
+ <script>
+ foo
+ </script>1. *bar*
+04_06__leaf_blocks__html_blocks__31: |
+ <!-- Foo
+
+ bar
+ baz -->
+ okay
+04_06__leaf_blocks__html_blocks__32: |
+ <?php
+
+ echo '>';
+
+ ?>
+ okay
+04_06__leaf_blocks__html_blocks__33: |
+ <!DOCTYPE html>
+04_06__leaf_blocks__html_blocks__34: |
+ <![CDATA[
+ function matchwo(a,b)
+ {
+ if (a < b && a < 0) then {
+ return 1;
+
+ } else {
+
+ return 0;
+ }
+ }
+ ]]>
+ okay
+04_06__leaf_blocks__html_blocks__35: |2
+ <!-- foo -->
+
+ <!-- foo -->
+04_06__leaf_blocks__html_blocks__36: |2
+ <div>
+
+ <div>
+04_06__leaf_blocks__html_blocks__37: |
+ Foo
+ <div>
+ bar
+ </div>
+04_06__leaf_blocks__html_blocks__38: |
+ <div>
+ bar
+ </div>
+ *foo*
+04_06__leaf_blocks__html_blocks__39: |
+ Foo
+ <a href="bar">
+ baz
+04_06__leaf_blocks__html_blocks__40: |
+ <div>
+
+ *Emphasized* text.
+
+ </div>
+04_06__leaf_blocks__html_blocks__41: |
+ <div>
+ *Emphasized* text.
+ </div>
+04_06__leaf_blocks__html_blocks__42: |
+ <table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+ </table>
+04_06__leaf_blocks__html_blocks__43: |
+ <table>
+
+ <tr>
+
+ <td>
+ Hi
+ </td>
+
+ </tr>
+
+ </table>
+04_07__leaf_blocks__link_reference_definitions__01: |
+ [foo]: /url "title"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__02: " [foo]: \n /url \n 'the
+ title' \n\n[foo]\n"
+04_07__leaf_blocks__link_reference_definitions__03: |
+ [Foo*bar\]]:my_(url) 'title (with parens)'
+
+ [Foo*bar\]]
+04_07__leaf_blocks__link_reference_definitions__04: |
+ [Foo bar]:
+ <my url>
+ 'title'
+
+ [Foo bar]
+04_07__leaf_blocks__link_reference_definitions__05: |
+ [foo]: /url '
+ title
+ line1
+ line2
+ '
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__06: |
+ [foo]: /url 'title
+
+ with blank line'
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__07: |
+ [foo]:
+ /url
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__08: |
+ [foo]:
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__09: |
+ [foo]: <>
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__10: |
+ [foo]: <bar>(baz)
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__11: |
+ [foo]: /url\bar\*baz "foo\"bar\baz"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__12: |
+ [foo]
+
+ [foo]: url
+04_07__leaf_blocks__link_reference_definitions__13: |
+ [foo]
+
+ [foo]: first
+ [foo]: second
+04_07__leaf_blocks__link_reference_definitions__14: |
+ [FOO]: /url
+
+ [Foo]
+04_07__leaf_blocks__link_reference_definitions__15: |
+ [ΑΓΩ]: /φου
+
+ [αγω]
+04_07__leaf_blocks__link_reference_definitions__16: |
+ [foo]: /url
+04_07__leaf_blocks__link_reference_definitions__17: |
+ [
+ foo
+ ]: /url
+ bar
+04_07__leaf_blocks__link_reference_definitions__18: |
+ [foo]: /url "title" ok
+04_07__leaf_blocks__link_reference_definitions__19: |
+ [foo]: /url
+ "title" ok
+04_07__leaf_blocks__link_reference_definitions__20: |2
+ [foo]: /url "title"
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__21: |
+ ```
+ [foo]: /url
+ ```
+
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__22: |
+ Foo
+ [bar]: /baz
+
+ [bar]
+04_07__leaf_blocks__link_reference_definitions__23: |
+ # [Foo]
+ [foo]: /url
+ > bar
+04_07__leaf_blocks__link_reference_definitions__24: |
+ [foo]: /url
+ bar
+ ===
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__25: |
+ [foo]: /url
+ ===
+ [foo]
+04_07__leaf_blocks__link_reference_definitions__26: |
+ [foo]: /foo-url "foo"
+ [bar]: /bar-url
+ "bar"
+ [baz]: /baz-url
+
+ [foo],
+ [bar],
+ [baz]
+04_07__leaf_blocks__link_reference_definitions__27: |
+ [foo]
+
+ > [foo]: /url
+04_07__leaf_blocks__link_reference_definitions__28: |
+ [foo]: /url
+04_08__leaf_blocks__paragraphs__01: |
+ aaa
+
+ bbb
+04_08__leaf_blocks__paragraphs__02: |
+ aaa
+ bbb
+
+ ccc
+ ddd
+04_08__leaf_blocks__paragraphs__03: |
+ aaa
+
+
+ bbb
+04_08__leaf_blocks__paragraphs__04: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__05: |
+ aaa
+ bbb
+ ccc
+04_08__leaf_blocks__paragraphs__06: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__07: |2
+ aaa
+ bbb
+04_08__leaf_blocks__paragraphs__08: "aaa \nbbb \n"
+04_09__leaf_blocks__blank_lines__01: " \n\naaa\n \n\n# aaa\n\n \n"
+04_10__leaf_blocks__tables_extension__01: |
+ | foo | bar |
+ | --- | --- |
+ | baz | bim |
+04_10__leaf_blocks__tables_extension__02: |
+ | abc | defghi |
+ :-: | -----------:
+ bar | baz
+04_10__leaf_blocks__tables_extension__03: |
+ | f\|oo |
+ | ------ |
+ | b `\|` az |
+ | b **\|** im |
+04_10__leaf_blocks__tables_extension__04: |
+ | abc | def |
+ | --- | --- |
+ | bar | baz |
+ > bar
+04_10__leaf_blocks__tables_extension__05: |
+ | abc | def |
+ | --- | --- |
+ | bar | baz |
+ bar
+
+ bar
+04_10__leaf_blocks__tables_extension__06: |
+ | abc | def |
+ | --- |
+ | bar |
+04_10__leaf_blocks__tables_extension__07: |
+ | abc | def |
+ | --- | --- |
+ | bar |
+ | bar | baz | boo |
+04_10__leaf_blocks__tables_extension__08: |
+ | abc | def |
+ | --- | --- |
+05_01__container_blocks__block_quotes__01: |
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__02: |
+ ># Foo
+ >bar
+ > baz
+05_01__container_blocks__block_quotes__03: |2
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__04: |2
+ > # Foo
+ > bar
+ > baz
+05_01__container_blocks__block_quotes__05: |
+ > # Foo
+ > bar
+ baz
+05_01__container_blocks__block_quotes__06: |
+ > bar
+ baz
+ > foo
+05_01__container_blocks__block_quotes__07: |
+ > foo
+ ---
+05_01__container_blocks__block_quotes__08: |
+ > - foo
+ - bar
+05_01__container_blocks__block_quotes__09: |
+ > foo
+ bar
+05_01__container_blocks__block_quotes__10: |
+ > ```
+ foo
+ ```
+05_01__container_blocks__block_quotes__11: |
+ > foo
+ - bar
+05_01__container_blocks__block_quotes__12: |
+ >
+05_01__container_blocks__block_quotes__13: ">\n> \n> \n"
+05_01__container_blocks__block_quotes__14: ">\n> foo\n> \n"
+05_01__container_blocks__block_quotes__15: |
+ > foo
+
+ > bar
+05_01__container_blocks__block_quotes__16: |
+ > foo
+ > bar
+05_01__container_blocks__block_quotes__17: |
+ > foo
+ >
+ > bar
+05_01__container_blocks__block_quotes__18: |
+ foo
+ > bar
+05_01__container_blocks__block_quotes__19: |
+ > aaa
+ ***
+ > bbb
+05_01__container_blocks__block_quotes__20: |
+ > bar
+ baz
+05_01__container_blocks__block_quotes__21: |
+ > bar
+
+ baz
+05_01__container_blocks__block_quotes__22: |
+ > bar
+ >
+ baz
+05_01__container_blocks__block_quotes__23: |
+ > > > foo
+ bar
+05_01__container_blocks__block_quotes__24: |
+ >>> foo
+ > bar
+ >>baz
+05_01__container_blocks__block_quotes__25: |
+ > code
+
+ > not code
+05_02__container_blocks__list_items__01: |
+ A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__02: |
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__03: |
+ - one
+
+ two
+05_02__container_blocks__list_items__04: |
+ - one
+
+ two
+05_02__container_blocks__list_items__05: |2
+ - one
+
+ two
+05_02__container_blocks__list_items__06: |2
+ - one
+
+ two
+05_02__container_blocks__list_items__07: |2
+ > > 1. one
+ >>
+ >> two
+05_02__container_blocks__list_items__08: |
+ >>- one
+ >>
+ > > two
+05_02__container_blocks__list_items__09: |
+ -one
+
+ 2.two
+05_02__container_blocks__list_items__10: |
+ - foo
+
+
+ bar
+05_02__container_blocks__list_items__11: |
+ 1. foo
+
+ ```
+ bar
+ ```
+
+ baz
+
+ > bam
+05_02__container_blocks__list_items__12: |
+ - Foo
+
+ bar
+
+
+ baz
+05_02__container_blocks__list_items__13: |
+ 123456789. ok
+05_02__container_blocks__list_items__14: |
+ 1234567890. not ok
+05_02__container_blocks__list_items__15: |
+ 0. ok
+05_02__container_blocks__list_items__16: |
+ 003. ok
+05_02__container_blocks__list_items__17: |
+ -1. not ok
+05_02__container_blocks__list_items__18: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__19: |2
+ 10. foo
+
+ bar
+05_02__container_blocks__list_items__20: |2
+ indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__21: |
+ 1. indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__22: |
+ 1. indented code
+
+ paragraph
+
+ more code
+05_02__container_blocks__list_items__23: |2
+ foo
+
+ bar
+05_02__container_blocks__list_items__24: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__25: |
+ - foo
+
+ bar
+05_02__container_blocks__list_items__26: |
+ -
+ foo
+ -
+ ```
+ bar
+ ```
+ -
+ baz
+05_02__container_blocks__list_items__27: "- \n foo\n"
+05_02__container_blocks__list_items__28: |
+ -
+
+ foo
+05_02__container_blocks__list_items__29: |
+ - foo
+ -
+ - bar
+05_02__container_blocks__list_items__30: "- foo\n- \n- bar\n"
+05_02__container_blocks__list_items__31: |
+ 1. foo
+ 2.
+ 3. bar
+05_02__container_blocks__list_items__32: |
+ *
+05_02__container_blocks__list_items__33: |
+ foo
+ *
+
+ foo
+ 1.
+05_02__container_blocks__list_items__34: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__35: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__36: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__37: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__38: |2
+ 1. A paragraph
+ with two lines.
+
+ indented code
+
+ > A block quote.
+05_02__container_blocks__list_items__39: |2
+ 1. A paragraph
+ with two lines.
+05_02__container_blocks__list_items__40: |
+ > 1. > Blockquote
+ continued here.
+05_02__container_blocks__list_items__41: |
+ > 1. > Blockquote
+ > continued here.
+05_02__container_blocks__list_items__42: |
+ - foo
+ - bar
+ - baz
+ - boo
+05_02__container_blocks__list_items__43: |
+ - foo
+ - bar
+ - baz
+ - boo
+05_02__container_blocks__list_items__44: |
+ 10) foo
+ - bar
+05_02__container_blocks__list_items__45: |
+ 10) foo
+ - bar
+05_02__container_blocks__list_items__46: |
+ - - foo
+05_02__container_blocks__list_items__47: |
+ 1. - 2. foo
+05_02__container_blocks__list_items__48: |
+ - # Foo
+ - Bar
+ ---
+ baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__49: |
+ - [ ] foo
+ - [x] bar
+ - [x] foo
+ - [ ] bar
+ - [x] baz
+ - [ ] bim
+ - foo
+ - bar
+ + baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__50: |
+ 1. foo
+ 2. bar
+ 3) baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__51: |
+ Foo
+ - bar
+ - baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__52: |
+ 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__53: |
+ 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__54: |
+ - foo
+
+ - bar
+
+
+ - baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__55: |
+ - foo
+ - bar
+ - baz
+
+
+ bim
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__56: |
+ - foo
+ - bar
+
+ <!-- -->
+
+ - baz
+ - bim
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__57: |
+ - foo
+
+ notcode
+
+ - foo
+
+ <!-- -->
+
+ code
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__58: |
+ - a
+ - b
+ - c
+ - d
+ - e
+ - f
+ - g
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__59: |
+ 1. a
+
+ 2. b
+
+ 3. c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__60: |
+ - a
+ - b
+ - c
+ - d
+ - e
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__61: |
+ 1. a
+
+ 2. b
+
+ 3. c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__62: |
+ - a
+ - b
+
+ - c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__63: |
+ * a
+ *
+
+ * c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__64: |
+ - a
+ - b
+
+ c
+ - d
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__65: |
+ - a
+ - b
+
+ [ref]: /url
+ - d
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__66: |
+ - a
+ - ```
+ b
+
+
+ ```
+ - c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__67: |
+ - a
+ - b
+
+ c
+ - d
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__68: |
+ * a
+ > b
+ >
+ * c
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__69: |
+ - a
+ > b
+ ```
+ c
+ ```
+ - d
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__70: |
+ - a
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__71: |
+ - a
+ - b
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__72: |
+ 1. ```
+ foo
+ ```
+
+ bar
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__73: |
+ * foo
+ * bar
+
+ baz
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__74: |
+ - a
+ - b
+ - c
+
+ - d
+ - e
+ - f
+06_01__inlines__01: |
+ `hi`lo`
+06_02__inlines__backslash_escapes__01: |
+ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
+06_02__inlines__backslash_escapes__02: "\\\t\\A\\a\\ \\3\\φ\\«\n"
+06_02__inlines__backslash_escapes__03: |
+ \*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__04: |
+ \\*emphasis*
+06_02__inlines__backslash_escapes__05: |
+ foo\
+ bar
+06_02__inlines__backslash_escapes__06: |
+ `` \[\` ``
+06_02__inlines__backslash_escapes__07: |2
+ \[\]
+06_02__inlines__backslash_escapes__08: |
+ ~~~
+ \[\]
+ ~~~
+06_02__inlines__backslash_escapes__09: |
+ <http://example.com?find=\*>
+06_02__inlines__backslash_escapes__10: |
+ <a href="/bar\/)">
+06_02__inlines__backslash_escapes__11: |
+ [foo](/bar\* "ti\*tle")
+06_02__inlines__backslash_escapes__12: |
+ [foo]
+
+ [foo]: /bar\* "ti\*tle"
+06_02__inlines__backslash_escapes__13: |
+ ``` foo\+bar
+ foo
+ ```
+06_03__inlines__entity_and_numeric_character_references__01: |
+ &nbsp; &amp; &copy; &AElig; &Dcaron;
+ &frac34; &HilbertSpace; &DifferentialD;
+ &ClockwiseContourIntegral; &ngE;
+06_03__inlines__entity_and_numeric_character_references__02: |
+ &#35; &#1234; &#992; &#0;
+06_03__inlines__entity_and_numeric_character_references__03: |
+ &#X22; &#XD06; &#xcab;
+06_03__inlines__entity_and_numeric_character_references__04: |
+ &nbsp &x; &#; &#x;
+ &#987654321;
+ &#abcdef0;
+ &ThisIsNotDefined; &hi?;
+06_03__inlines__entity_and_numeric_character_references__05: |
+ &copy
+06_03__inlines__entity_and_numeric_character_references__06: |
+ &MadeUpEntity;
+06_03__inlines__entity_and_numeric_character_references__07: |
+ <a href="&ouml;&ouml;.html">
+06_03__inlines__entity_and_numeric_character_references__08: |
+ [foo](/f&ouml;&ouml; "f&ouml;&ouml;")
+06_03__inlines__entity_and_numeric_character_references__09: |
+ [foo]
+
+ [foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
+06_03__inlines__entity_and_numeric_character_references__10: |
+ ``` f&ouml;&ouml;
+ foo
+ ```
+06_03__inlines__entity_and_numeric_character_references__11: |
+ `f&ouml;&ouml;`
+06_03__inlines__entity_and_numeric_character_references__12: |2
+ f&ouml;f&ouml;
+06_03__inlines__entity_and_numeric_character_references__13: |
+ &#42;foo&#42;
+ *foo*
+06_03__inlines__entity_and_numeric_character_references__14: |
+ &#42; foo
+
+ * foo
+06_03__inlines__entity_and_numeric_character_references__15: |
+ foo&#10;&#10;bar
+06_03__inlines__entity_and_numeric_character_references__16: |
+ &#9;foo
+06_03__inlines__entity_and_numeric_character_references__17: |
+ [a](url &quot;tit&quot;)
+06_04__inlines__code_spans__01: |
+ `foo`
+06_04__inlines__code_spans__02: |
+ `` foo ` bar ``
+06_04__inlines__code_spans__03: |
+ ` `` `
+06_04__inlines__code_spans__04: |
+ ` `` `
+06_04__inlines__code_spans__05: |
+ ` a`
+06_04__inlines__code_spans__06: |
+ ` b `
+06_04__inlines__code_spans__07: |
+ ` `
+ ` `
+06_04__inlines__code_spans__08: "``\nfoo\nbar \nbaz\n``\n"
+06_04__inlines__code_spans__09: "``\nfoo \n``\n"
+06_04__inlines__code_spans__10: "`foo bar \nbaz`\n"
+06_04__inlines__code_spans__11: |
+ `foo\`bar`
+06_04__inlines__code_spans__12: |
+ ``foo`bar``
+06_04__inlines__code_spans__13: |
+ ` foo `` bar `
+06_04__inlines__code_spans__14: |
+ *foo`*`
+06_04__inlines__code_spans__15: |
+ [not a `link](/foo`)
+06_04__inlines__code_spans__16: |
+ `<a href="`">`
+06_04__inlines__code_spans__17: |
+ <a href="`">`
+06_04__inlines__code_spans__18: |
+ `<http://foo.bar.`baz>`
+06_04__inlines__code_spans__19: |
+ <http://foo.bar.`baz>`
+06_04__inlines__code_spans__20: |
+ ```foo``
+06_04__inlines__code_spans__21: |
+ `foo
+06_04__inlines__code_spans__22: |
+ `foo``bar``
+06_05__inlines__emphasis_and_strong_emphasis__01: |
+ *foo bar*
+06_05__inlines__emphasis_and_strong_emphasis__02: |
+ a * foo bar*
+06_05__inlines__emphasis_and_strong_emphasis__03: |
+ a*"foo"*
+06_05__inlines__emphasis_and_strong_emphasis__04: |
+ * a *
+06_05__inlines__emphasis_and_strong_emphasis__05: |
+ foo*bar*
+06_05__inlines__emphasis_and_strong_emphasis__06: |
+ 5*6*78
+06_05__inlines__emphasis_and_strong_emphasis__07: |
+ _foo bar_
+06_05__inlines__emphasis_and_strong_emphasis__08: |
+ _ foo bar_
+06_05__inlines__emphasis_and_strong_emphasis__09: |
+ a_"foo"_
+06_05__inlines__emphasis_and_strong_emphasis__10: |
+ foo_bar_
+06_05__inlines__emphasis_and_strong_emphasis__11: |
+ 5_6_78
+06_05__inlines__emphasis_and_strong_emphasis__12: |
+ приÑтанÑм_ÑтремÑÑ‚ÑÑ_
+06_05__inlines__emphasis_and_strong_emphasis__13: |
+ aa_"bb"_cc
+06_05__inlines__emphasis_and_strong_emphasis__14: |
+ foo-_(bar)_
+06_05__inlines__emphasis_and_strong_emphasis__15: |
+ _foo*
+06_05__inlines__emphasis_and_strong_emphasis__16: |
+ *foo bar *
+06_05__inlines__emphasis_and_strong_emphasis__17: |
+ *foo bar
+ *
+06_05__inlines__emphasis_and_strong_emphasis__18: |
+ *(*foo)
+06_05__inlines__emphasis_and_strong_emphasis__19: |
+ *(*foo*)*
+06_05__inlines__emphasis_and_strong_emphasis__20: |
+ *foo*bar
+06_05__inlines__emphasis_and_strong_emphasis__21: |
+ _foo bar _
+06_05__inlines__emphasis_and_strong_emphasis__22: |
+ _(_foo)
+06_05__inlines__emphasis_and_strong_emphasis__23: |
+ _(_foo_)_
+06_05__inlines__emphasis_and_strong_emphasis__24: |
+ _foo_bar
+06_05__inlines__emphasis_and_strong_emphasis__25: |
+ _приÑтанÑм_ÑтремÑÑ‚ÑÑ
+06_05__inlines__emphasis_and_strong_emphasis__26: |
+ _foo_bar_baz_
+06_05__inlines__emphasis_and_strong_emphasis__27: |
+ _(bar)_.
+06_05__inlines__emphasis_and_strong_emphasis__28: |
+ **foo bar**
+06_05__inlines__emphasis_and_strong_emphasis__29: |
+ ** foo bar**
+06_05__inlines__emphasis_and_strong_emphasis__30: |
+ a**"foo"**
+06_05__inlines__emphasis_and_strong_emphasis__31: |
+ foo**bar**
+06_05__inlines__emphasis_and_strong_emphasis__32: |
+ __foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__33: |
+ __ foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__34: |
+ __
+ foo bar__
+06_05__inlines__emphasis_and_strong_emphasis__35: |
+ a__"foo"__
+06_05__inlines__emphasis_and_strong_emphasis__36: |
+ foo__bar__
+06_05__inlines__emphasis_and_strong_emphasis__37: |
+ 5__6__78
+06_05__inlines__emphasis_and_strong_emphasis__38: |
+ приÑтанÑм__ÑтремÑÑ‚ÑÑ__
+06_05__inlines__emphasis_and_strong_emphasis__39: |
+ __foo, __bar__, baz__
+06_05__inlines__emphasis_and_strong_emphasis__40: |
+ foo-__(bar)__
+06_05__inlines__emphasis_and_strong_emphasis__41: |
+ **foo bar **
+06_05__inlines__emphasis_and_strong_emphasis__42: |
+ **(**foo)
+06_05__inlines__emphasis_and_strong_emphasis__43: |
+ *(**foo**)*
+06_05__inlines__emphasis_and_strong_emphasis__44: |
+ **Gomphocarpus (*Gomphocarpus physocarpus*, syn.
+ *Asclepias physocarpa*)**
+06_05__inlines__emphasis_and_strong_emphasis__45: |
+ **foo "*bar*" foo**
+06_05__inlines__emphasis_and_strong_emphasis__46: |
+ **foo**bar
+06_05__inlines__emphasis_and_strong_emphasis__47: |
+ __foo bar __
+06_05__inlines__emphasis_and_strong_emphasis__48: |
+ __(__foo)
+06_05__inlines__emphasis_and_strong_emphasis__49: |
+ _(__foo__)_
+06_05__inlines__emphasis_and_strong_emphasis__50: |
+ __foo__bar
+06_05__inlines__emphasis_and_strong_emphasis__51: |
+ __приÑтанÑм__ÑтремÑÑ‚ÑÑ
+06_05__inlines__emphasis_and_strong_emphasis__52: |
+ __foo__bar__baz__
+06_05__inlines__emphasis_and_strong_emphasis__53: |
+ __(bar)__.
+06_05__inlines__emphasis_and_strong_emphasis__54: |
+ *foo [bar](/url)*
+06_05__inlines__emphasis_and_strong_emphasis__55: |
+ *foo
+ bar*
+06_05__inlines__emphasis_and_strong_emphasis__56: |
+ _foo __bar__ baz_
+06_05__inlines__emphasis_and_strong_emphasis__57: |
+ _foo _bar_ baz_
+06_05__inlines__emphasis_and_strong_emphasis__58: |
+ __foo_ bar_
+06_05__inlines__emphasis_and_strong_emphasis__59: |
+ *foo *bar**
+06_05__inlines__emphasis_and_strong_emphasis__60: |
+ *foo **bar** baz*
+06_05__inlines__emphasis_and_strong_emphasis__61: |
+ *foo**bar**baz*
+06_05__inlines__emphasis_and_strong_emphasis__62: |
+ *foo**bar*
+06_05__inlines__emphasis_and_strong_emphasis__63: |
+ ***foo** bar*
+06_05__inlines__emphasis_and_strong_emphasis__64: |
+ *foo **bar***
+06_05__inlines__emphasis_and_strong_emphasis__65: |
+ *foo**bar***
+06_05__inlines__emphasis_and_strong_emphasis__66: |
+ foo***bar***baz
+06_05__inlines__emphasis_and_strong_emphasis__67: |
+ foo******bar*********baz
+06_05__inlines__emphasis_and_strong_emphasis__68: |
+ *foo **bar *baz* bim** bop*
+06_05__inlines__emphasis_and_strong_emphasis__69: |
+ *foo [*bar*](/url)*
+06_05__inlines__emphasis_and_strong_emphasis__70: |
+ ** is not an empty emphasis
+06_05__inlines__emphasis_and_strong_emphasis__71: |
+ **** is not an empty strong emphasis
+06_05__inlines__emphasis_and_strong_emphasis__72: |
+ **foo [bar](/url)**
+06_05__inlines__emphasis_and_strong_emphasis__73: |
+ **foo
+ bar**
+06_05__inlines__emphasis_and_strong_emphasis__74: |
+ __foo _bar_ baz__
+06_05__inlines__emphasis_and_strong_emphasis__75: |
+ __foo __bar__ baz__
+06_05__inlines__emphasis_and_strong_emphasis__76: |
+ ____foo__ bar__
+06_05__inlines__emphasis_and_strong_emphasis__77: |
+ **foo **bar****
+06_05__inlines__emphasis_and_strong_emphasis__78: |
+ **foo *bar* baz**
+06_05__inlines__emphasis_and_strong_emphasis__79: |
+ **foo*bar*baz**
+06_05__inlines__emphasis_and_strong_emphasis__80: |
+ ***foo* bar**
+06_05__inlines__emphasis_and_strong_emphasis__81: |
+ **foo *bar***
+06_05__inlines__emphasis_and_strong_emphasis__82: |
+ **foo *bar **baz**
+ bim* bop**
+06_05__inlines__emphasis_and_strong_emphasis__83: |
+ **foo [*bar*](/url)**
+06_05__inlines__emphasis_and_strong_emphasis__84: |
+ __ is not an empty emphasis
+06_05__inlines__emphasis_and_strong_emphasis__85: |
+ ____ is not an empty strong emphasis
+06_05__inlines__emphasis_and_strong_emphasis__86: |
+ foo ***
+06_05__inlines__emphasis_and_strong_emphasis__87: |
+ foo *\**
+06_05__inlines__emphasis_and_strong_emphasis__88: |
+ foo *_*
+06_05__inlines__emphasis_and_strong_emphasis__89: |
+ foo *****
+06_05__inlines__emphasis_and_strong_emphasis__90: |
+ foo **\***
+06_05__inlines__emphasis_and_strong_emphasis__91: |
+ foo **_**
+06_05__inlines__emphasis_and_strong_emphasis__92: |
+ **foo*
+06_05__inlines__emphasis_and_strong_emphasis__93: |
+ *foo**
+06_05__inlines__emphasis_and_strong_emphasis__94: |
+ ***foo**
+06_05__inlines__emphasis_and_strong_emphasis__95: |
+ ****foo*
+06_05__inlines__emphasis_and_strong_emphasis__96: |
+ **foo***
+06_05__inlines__emphasis_and_strong_emphasis__97: |
+ *foo****
+06_05__inlines__emphasis_and_strong_emphasis__98: |
+ foo ___
+06_05__inlines__emphasis_and_strong_emphasis__99: |
+ 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__01: |
+ ~~Hi~~ Hello, world!
+06_06__inlines__strikethrough_extension__02: |
+ This ~~has a
+
+ new paragraph~~.
+06_07__inlines__links__01: |
+ [link](/uri "title")
+06_07__inlines__links__02: |
+ [link](/uri)
+06_07__inlines__links__03: |
+ [link]()
+06_07__inlines__links__04: |
+ [link](<>)
+06_07__inlines__links__05: |
+ [link](/my uri)
+06_07__inlines__links__06: |
+ [link](</my uri>)
+06_07__inlines__links__07: |
+ [link](foo
+ bar)
+06_07__inlines__links__08: |
+ [link](<foo
+ bar>)
+06_07__inlines__links__09: |
+ [a](<b)c>)
+06_07__inlines__links__10: |
+ [link](<foo\>)
+06_07__inlines__links__11: |
+ [a](<b)c
+ [a](<b)c>
+ [a](<b>c)
+06_07__inlines__links__12: |
+ [link](\(foo\))
+06_07__inlines__links__13: |
+ [link](foo(and(bar)))
+06_07__inlines__links__14: |
+ [link](foo\(and\(bar\))
+06_07__inlines__links__15: |
+ [link](<foo(and(bar)>)
+06_07__inlines__links__16: |
+ [link](foo\)\:)
+06_07__inlines__links__17: |
+ [link](#fragment)
+
+ [link](http://example.com#fragment)
+
+ [link](http://example.com?foo=3#frag)
+06_07__inlines__links__18: |
+ [link](foo\bar)
+06_07__inlines__links__19: |
+ [link](foo%20b&auml;)
+06_07__inlines__links__20: |
+ [link]("title")
+06_07__inlines__links__21: |
+ [link](/url "title")
+ [link](/url 'title')
+ [link](/url (title))
+06_07__inlines__links__22: |
+ [link](/url "title \"&quot;")
+06_07__inlines__links__23: |
+ [link](/url "title")
+06_07__inlines__links__24: |
+ [link](/url "title "and" title")
+06_07__inlines__links__25: |
+ [link](/url 'title "and" title')
+06_07__inlines__links__26: |
+ [link]( /uri
+ "title" )
+06_07__inlines__links__27: |
+ [link] (/uri)
+06_07__inlines__links__28: |
+ [link [foo [bar]]](/uri)
+06_07__inlines__links__29: |
+ [link] bar](/uri)
+06_07__inlines__links__30: |
+ [link [bar](/uri)
+06_07__inlines__links__31: |
+ [link \[bar](/uri)
+06_07__inlines__links__32: |
+ [link *foo **bar** `#`*](/uri)
+06_07__inlines__links__33: |
+ [![moon](moon.jpg)](/uri)
+06_07__inlines__links__34: |
+ [foo [bar](/uri)](/uri)
+06_07__inlines__links__35: |
+ [foo *[bar [baz](/uri)](/uri)*](/uri)
+06_07__inlines__links__36: |
+ ![[[foo](uri1)](uri2)](uri3)
+06_07__inlines__links__37: |
+ *[foo*](/uri)
+06_07__inlines__links__38: |
+ [foo *bar](baz*)
+06_07__inlines__links__39: |
+ *foo [bar* baz]
+06_07__inlines__links__40: |
+ [foo <bar attr="](baz)">
+06_07__inlines__links__41: |
+ [foo`](/uri)`
+06_07__inlines__links__42: |
+ [foo<http://example.com/?search=](uri)>
+06_07__inlines__links__43: |
+ [foo][bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__44: |
+ [link [foo [bar]]][ref]
+
+ [ref]: /uri
+06_07__inlines__links__45: |
+ [link \[bar][ref]
+
+ [ref]: /uri
+06_07__inlines__links__46: |
+ [link *foo **bar** `#`*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__47: |
+ [![moon](moon.jpg)][ref]
+
+ [ref]: /uri
+06_07__inlines__links__48: |
+ [foo [bar](/uri)][ref]
+
+ [ref]: /uri
+06_07__inlines__links__49: |
+ [foo *bar [baz][ref]*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__50: |
+ *[foo*][ref]
+
+ [ref]: /uri
+06_07__inlines__links__51: |
+ [foo *bar][ref]
+
+ [ref]: /uri
+06_07__inlines__links__52: |
+ [foo <bar attr="][ref]">
+
+ [ref]: /uri
+06_07__inlines__links__53: |
+ [foo`][ref]`
+
+ [ref]: /uri
+06_07__inlines__links__54: |
+ [foo<http://example.com/?search=][ref]>
+
+ [ref]: /uri
+06_07__inlines__links__55: |
+ [foo][BaR]
+
+ [bar]: /url "title"
+06_07__inlines__links__56: |
+ [Толпой][Толпой] is a Russian word.
+
+ [ТОЛПОЙ]: /url
+06_07__inlines__links__57: |
+ [Foo
+ bar]: /url
+
+ [Baz][Foo bar]
+06_07__inlines__links__58: |
+ [foo] [bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__59: |
+ [foo]
+ [bar]
+
+ [bar]: /url "title"
+06_07__inlines__links__60: |
+ [foo]: /url1
+
+ [foo]: /url2
+
+ [bar][foo]
+06_07__inlines__links__61: |
+ [bar][foo\!]
+
+ [foo!]: /url
+06_07__inlines__links__62: |
+ [foo][ref[]
+
+ [ref[]: /uri
+06_07__inlines__links__63: |
+ [foo][ref[bar]]
+
+ [ref[bar]]: /uri
+06_07__inlines__links__64: |
+ [[[foo]]]
+
+ [[[foo]]]: /url
+06_07__inlines__links__65: |
+ [foo][ref\[]
+
+ [ref\[]: /uri
+06_07__inlines__links__66: |
+ [bar\\]: /uri
+
+ [bar\\]
+06_07__inlines__links__67: |
+ []
+
+ []: /uri
+06_07__inlines__links__68: |
+ [
+ ]
+
+ [
+ ]: /uri
+06_07__inlines__links__69: |
+ [foo][]
+
+ [foo]: /url "title"
+06_07__inlines__links__70: |
+ [*foo* bar][]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__71: |
+ [Foo][]
+
+ [foo]: /url "title"
+06_07__inlines__links__72: "[foo] \n[]\n\n[foo]: /url \"title\"\n"
+06_07__inlines__links__73: |
+ [foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__74: |
+ [*foo* bar]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__75: |
+ [[*foo* bar]]
+
+ [*foo* bar]: /url "title"
+06_07__inlines__links__76: |
+ [[bar [foo]
+
+ [foo]: /url
+06_07__inlines__links__77: |
+ [Foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__78: |
+ [foo] bar
+
+ [foo]: /url
+06_07__inlines__links__79: |
+ \[foo]
+
+ [foo]: /url "title"
+06_07__inlines__links__80: |
+ [foo*]: /url
+
+ *[foo*]
+06_07__inlines__links__81: |
+ [foo][bar]
+
+ [foo]: /url1
+ [bar]: /url2
+06_07__inlines__links__82: |
+ [foo][]
+
+ [foo]: /url1
+06_07__inlines__links__83: |
+ [foo]()
+
+ [foo]: /url1
+06_07__inlines__links__84: |
+ [foo](not a link)
+
+ [foo]: /url1
+06_07__inlines__links__85: |
+ [foo][bar][baz]
+
+ [baz]: /url
+06_07__inlines__links__86: |
+ [foo][bar][baz]
+
+ [baz]: /url1
+ [bar]: /url2
+06_07__inlines__links__87: |
+ [foo][bar][baz]
+
+ [baz]: /url1
+ [foo]: /url2
+06_08__inlines__images__01: |
+ ![foo](/url "title")
+06_08__inlines__images__02: |
+ ![foo *bar*]
+
+ [foo *bar*]: train.jpg "train & tracks"
+06_08__inlines__images__03: |
+ ![foo ![bar](/url)](/url2)
+06_08__inlines__images__04: |
+ ![foo [bar](/url)](/url2)
+06_08__inlines__images__05: |
+ ![foo *bar*][]
+
+ [foo *bar*]: train.jpg "train & tracks"
+06_08__inlines__images__06: |
+ ![foo *bar*][foobar]
+
+ [FOOBAR]: train.jpg "train & tracks"
+06_08__inlines__images__07: |
+ ![foo](train.jpg)
+06_08__inlines__images__08: |
+ My ![foo bar](/path/to/train.jpg "title" )
+06_08__inlines__images__09: |
+ ![foo](<url>)
+06_08__inlines__images__10: |
+ ![](/url)
+06_08__inlines__images__11: |
+ ![foo][bar]
+
+ [bar]: /url
+06_08__inlines__images__12: |
+ ![foo][bar]
+
+ [BAR]: /url
+06_08__inlines__images__13: |
+ ![foo][]
+
+ [foo]: /url "title"
+06_08__inlines__images__14: |
+ ![*foo* bar][]
+
+ [*foo* bar]: /url "title"
+06_08__inlines__images__15: |
+ ![Foo][]
+
+ [foo]: /url "title"
+06_08__inlines__images__16: "![foo] \n[]\n\n[foo]: /url \"title\"\n"
+06_08__inlines__images__17: |
+ ![foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__18: |
+ ![*foo* bar]
+
+ [*foo* bar]: /url "title"
+06_08__inlines__images__19: |
+ ![[foo]]
+
+ [[foo]]: /url "title"
+06_08__inlines__images__20: |
+ ![Foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__21: |
+ !\[foo]
+
+ [foo]: /url "title"
+06_08__inlines__images__22: |
+ \![foo]
+
+ [foo]: /url "title"
+06_09__inlines__autolinks__01: |
+ <http://foo.bar.baz>
+06_09__inlines__autolinks__02: |
+ <http://foo.bar.baz/test?q=hello&id=22&boolean>
+06_09__inlines__autolinks__03: |
+ <irc://foo.bar:2233/baz>
+06_09__inlines__autolinks__04: |
+ <MAILTO:FOO@BAR.BAZ>
+06_09__inlines__autolinks__05: |
+ <a+b+c:d>
+06_09__inlines__autolinks__06: |
+ <made-up-scheme://foo,bar>
+06_09__inlines__autolinks__07: |
+ <http://../>
+06_09__inlines__autolinks__08: |
+ <localhost:5001/foo>
+06_09__inlines__autolinks__09: |
+ <http://foo.bar/baz bim>
+06_09__inlines__autolinks__10: |
+ <http://example.com/\[\>
+06_09__inlines__autolinks__11: |
+ <foo@bar.example.com>
+06_09__inlines__autolinks__12: |
+ <foo+special@Bar.baz-bar0.com>
+06_09__inlines__autolinks__13: |
+ <foo\+@bar.example.com>
+06_09__inlines__autolinks__14: |
+ <>
+06_09__inlines__autolinks__15: |
+ < http://foo.bar >
+06_09__inlines__autolinks__16: |
+ <m:abc>
+06_09__inlines__autolinks__17: |
+ <foo.bar.baz>
+06_09__inlines__autolinks__18: |
+ http://example.com
+06_09__inlines__autolinks__19: |
+ foo@bar.example.com
+06_10__inlines__autolinks_extension__01: |
+ www.commonmark.org
+06_10__inlines__autolinks_extension__02: |
+ Visit www.commonmark.org/help for more information.
+06_10__inlines__autolinks_extension__03: |
+ Visit www.commonmark.org.
+
+ Visit www.commonmark.org/a.b.
+06_10__inlines__autolinks_extension__04: |
+ 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__05: |
+ www.google.com/search?q=(business))+ok
+06_10__inlines__autolinks_extension__06: |
+ www.google.com/search?q=commonmark&hl=en
+
+ www.google.com/search?q=commonmark&hl;
+06_10__inlines__autolinks_extension__07: |
+ www.commonmark.org/he<lp
+06_10__inlines__autolinks_extension__08: |
+ 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__09: |
+ foo@bar.baz
+06_10__inlines__autolinks_extension__10: |
+ hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.
+06_10__inlines__autolinks_extension__11: |
+ 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__01: |
+ <a><bab><c2c>
+06_11__inlines__raw_html__02: |
+ <a/><b2/>
+06_11__inlines__raw_html__03: |
+ <a /><b2
+ data="foo" >
+06_11__inlines__raw_html__04: |
+ <a foo="bar" bam = 'baz <em>"</em>'
+ _boolean zoop:33=zoop:33 />
+06_11__inlines__raw_html__05: |
+ Foo <responsive-image src="foo.jpg" />
+06_11__inlines__raw_html__06: |
+ <33> <__>
+06_11__inlines__raw_html__07: |
+ <a h*#ref="hi">
+06_11__inlines__raw_html__08: |
+ <a href="hi'> <a href=hi'>
+06_11__inlines__raw_html__09: |
+ < a><
+ foo><bar/ >
+ <foo bar=baz
+ bim!bop />
+06_11__inlines__raw_html__10: |
+ <a href='bar'title=title>
+06_11__inlines__raw_html__11: |
+ </a></foo >
+06_11__inlines__raw_html__12: |
+ </a href="foo">
+06_11__inlines__raw_html__13: |
+ foo <!-- this is a
+ comment - with hyphen -->
+06_11__inlines__raw_html__14: |
+ foo <!-- not a comment -- two hyphens -->
+06_11__inlines__raw_html__15: |
+ foo <!--> foo -->
+
+ foo <!-- foo--->
+06_11__inlines__raw_html__16: |
+ foo <?php echo $a; ?>
+06_11__inlines__raw_html__17: |
+ foo <!ELEMENT br EMPTY>
+06_11__inlines__raw_html__18: |
+ foo <![CDATA[>&<]]>
+06_11__inlines__raw_html__19: |
+ foo <a href="&ouml;">
+06_11__inlines__raw_html__20: |
+ foo <a href="\*">
+06_11__inlines__raw_html__21: |
+ <a href="\"">
+06_12__inlines__disallowed_raw_html_extension__01: |
+ <strong> <title> <style> <em>
+
+ <blockquote>
+ <xmp> is disallowed. <XMP> is also disallowed.
+ </blockquote>
+06_13__inlines__hard_line_breaks__01: "foo \nbaz\n"
+06_13__inlines__hard_line_breaks__02: |
+ foo\
+ baz
+06_13__inlines__hard_line_breaks__03: "foo \nbaz\n"
+06_13__inlines__hard_line_breaks__04: "foo \n bar\n"
+06_13__inlines__hard_line_breaks__05: |
+ foo\
+ bar
+06_13__inlines__hard_line_breaks__06: "*foo \nbar*\n"
+06_13__inlines__hard_line_breaks__07: |
+ *foo\
+ bar*
+06_13__inlines__hard_line_breaks__08: "`code \nspan`\n"
+06_13__inlines__hard_line_breaks__09: |
+ `code\
+ span`
+06_13__inlines__hard_line_breaks__10: "<a href=\"foo \nbar\">\n"
+06_13__inlines__hard_line_breaks__11: |
+ <a href="foo\
+ bar">
+06_13__inlines__hard_line_breaks__12: |
+ foo\
+06_13__inlines__hard_line_breaks__13: "foo \n"
+06_13__inlines__hard_line_breaks__14: |
+ ### foo\
+06_13__inlines__hard_line_breaks__15: "### foo \n"
+06_14__inlines__soft_line_breaks__01: |
+ foo
+ baz
+06_14__inlines__soft_line_breaks__02: "foo \n baz\n"
+06_15__inlines__textual_content__01: |
+ hello $.;'there
+06_15__inlines__textual_content__02: |
+ Foo χÏῆν
+06_15__inlines__textual_content__03: |
+ Multiple spaces
+07_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01: |
+ **bold**
+08_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01: |
+ <strong>
+ bold
+ </strong>
diff --git a/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml b/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml
new file mode 100644
index 00000000000..07d0235d22a
--- /dev/null
+++ b/spec/fixtures/glfm/example_snapshots/prosemirror_json.yml
@@ -0,0 +1,16739 @@
+---
+02_01__preliminaries__tabs__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\tbaz\t\tbim"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\tbaz\t\tbim"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "a\ta\ná½\ta"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__04: |-
+ {
+ "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__05: |-
+ {
+ "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__06: |-
+ {
+ "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__07: |-
+ {
+ "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__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+02_01__preliminaries__tabs__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+03_01__blocks_and_inlines__precedence__01: |-
+ {
+ "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__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "+++"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "==="
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "--\n**\n__"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "***"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n***"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__13: |-
+ {
+ "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__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "-"
+ }
+ ]
+ }
+ ]
+ }
+04_01__leaf_blocks__thematic_breaks__15: |-
+ {
+ "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__16: |-
+ {
+ "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__17: |-
+ {
+ "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__18: |-
+ {
+ "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__19: |-
+ {
+ "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__01: |-
+ {
+ "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__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "####### foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "#5 bolt"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "#hashtag"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "## foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__05: |-
+ {
+ "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__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__07: |-
+ {
+ "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__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "# foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n# bar"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__10: |-
+ {
+ "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__11: |-
+ {
+ "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__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ### b"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo#"
+ }
+ ]
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__15: |-
+ {
+ "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__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_02__leaf_blocks__atx_headings__17: |-
+ {
+ "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__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ }
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ }
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ }
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__01: |-
+ {
+ "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__02: |-
+ {
+ "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__03: |-
+ {
+ "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__04: |-
+ {
+ "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__05: |-
+ {
+ "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__06: |-
+ {
+ "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__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n---"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__09: |-
+ {
+ "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__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\\"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__12: |-
+ {
+ "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__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar\n==="
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__15: |-
+ {
+ "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__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nBar"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__17: |-
+ {
+ "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__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "===="
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "horizontalRule"
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__20: |-
+ {
+ "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__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__22: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__23: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "> foo"
+ }
+ ]
+ }
+ ]
+ }
+04_03__leaf_blocks__setext_headings__24: |-
+ {
+ "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__25: |-
+ {
+ "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__26: |-
+ {
+ "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__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar\n---\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__01: |-
+ {
+ "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__02: |-
+ {
+ "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__03: |-
+ {
+ "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__04: |-
+ {
+ "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__05: |-
+ {
+ "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__06: |-
+ {
+ "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__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__08: |-
+ {
+ "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__09: |-
+ {
+ "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__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": " foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_04__leaf_blocks__indented_code_blocks__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<\n >"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "<\n >"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\n```\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__10: |-
+ {
+ "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__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\n "
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__14: |-
+ {
+ "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__15: |-
+ {
+ "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__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "```\naaa\n```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n ```"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "\naaa"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\n~~~ ~~"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__22: |-
+ {
+ "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__23: |-
+ {
+ "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__24: |-
+ {
+ "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__25: |-
+ {
+ "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__26: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": ";",
+ "class": "code highlight"
+ }
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "aa"
+ },
+ {
+ "type": "text",
+ "text": "\nfoo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__28: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "aa",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_05__leaf_blocks__fenced_code_blocks__29: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "``` aaa"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__01: |-
+ Error - check implementation:
+ Hast node of type "table" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__02: |-
+ Error - check implementation:
+ Hast node of type "table" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__03: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__04: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__05: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__06: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__07: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__08: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__12: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__13: |-
+ Error - check implementation:
+ Hast node of type "table" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__14: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__15: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__16: |-
+ Error - check implementation:
+ Hast node of type "warning" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__17: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__18: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
+04_06__leaf_blocks__html_blocks__19: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__20: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__21: |-
+ Error - check implementation:
+ Hast node of type "del" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__22: |-
+ {
+ "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__23: |-
+ Error - check implementation:
+ Hast node of type "script" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__24: |-
+ Error - check implementation:
+ Hast node of type "style" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__25: |-
+ Error - check implementation:
+ Hast node of type "style" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__26: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__27: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__28: |-
+ Error - check implementation:
+ Hast node of type "style" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__29: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__30: |-
+ Error - check implementation:
+ Hast node of type "script" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__31: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__32: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__33: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__34: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__35: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__36: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__37: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__38: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__39: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "bar",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+04_06__leaf_blocks__html_blocks__40: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__41: |-
+ Error - check implementation:
+ Hast node of type "div" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__42: |-
+ Error - check implementation:
+ Hast node of type "table" not supported by this converter. Please, provide an specification.
+04_06__leaf_blocks__html_blocks__43: |-
+ Error - check implementation:
+ Hast node of type "table" not supported by this converter. Please, provide an specification.
+04_07__leaf_blocks__link_reference_definitions__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "the title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "my_(url)",
+ "target": "_blank",
+ "title": "title (with parens)",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo*bar]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "my%20url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo bar"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "\ntitle\nline1\nline2\n",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__06: |-
+ {
+ "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__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]:"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__10: |-
+ Error - check implementation:
+ Hast node of type "bar" not supported by this converter. Please, provide an specification.
+04_07__leaf_blocks__link_reference_definitions__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url%5Cbar*baz",
+ "target": "_blank",
+ "title": "foo\"bar\\baz",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "first",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/%CF%86%CE%BF%CF%85",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "αγω"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]: /url \"title\" ok"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\"title\" ok"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__20: |-
+ {
+ "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__21: |-
+ {
+ "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__22: |-
+ {
+ "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__23: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "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__24: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__25: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "===\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__26: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/foo-url",
+ "target": "_blank",
+ "title": "foo",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": ",\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar-url",
+ "target": "_blank",
+ "title": "bar",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": ",\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/baz-url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+04_07__leaf_blocks__link_reference_definitions__28: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "ccc\nddd"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb\nccc"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_08__leaf_blocks__paragraphs__07: |-
+ {
+ "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__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aaa"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbbb"
+ }
+ ]
+ }
+ ]
+ }
+04_09__leaf_blocks__blank_lines__01: |-
+ {
+ "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__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| foo | bar |\n| --- | --- |\n| baz | bim |"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | defghi |\n:-: | -----------:\nbar | baz"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| f|oo |\n| ------ |\n| b "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "\\|"
+ },
+ {
+ "type": "text",
+ "text": " az |\n| b "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "|"
+ },
+ {
+ "type": "text",
+ "text": " im |"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- | --- |\n| bar | baz |"
+ }
+ ]
+ },
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- | --- |\n| bar | baz |\nbar"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- |\n| bar |"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- | --- |\n| bar |\n| bar | baz | boo |"
+ }
+ ]
+ }
+ ]
+ }
+04_10__leaf_blocks__tables_extension__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "| abc | def |\n| --- | --- |"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__01: |-
+ {
+ "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__02: |-
+ {
+ "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__03: |-
+ {
+ "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__04: |-
+ {
+ "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__05: |-
+ {
+ "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__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz\nfoo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "horizontalRule"
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__08: |-
+ {
+ "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__09: |-
+ {
+ "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__10: |-
+ {
+ "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__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n- bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__15: |-
+ {
+ "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__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__17: |-
+ {
+ "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__18: |-
+ {
+ "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__19: |-
+ {
+ "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__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "attrs": {
+ "multiline": false
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_01__container_blocks__block_quotes__21: |-
+ {
+ "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__22: |-
+ {
+ "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__23: |-
+ {
+ "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__24: |-
+ {
+ "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__25: |-
+ {
+ "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__01: |-
+ {
+ "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__02: |-
+ {
+ "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__03: |-
+ {
+ "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__04: |-
+ {
+ "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__05: |-
+ {
+ "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__06: |-
+ {
+ "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__07: |-
+ {
+ "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__08: |-
+ {
+ "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__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "-one"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "2.two"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__10: |-
+ {
+ "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__11: |-
+ {
+ "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__12: |-
+ {
+ "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__13: |-
+ {
+ "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__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "1234567890. not ok"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__15: |-
+ {
+ "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__16: |-
+ {
+ "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__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "-1. not ok"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__18: |-
+ {
+ "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__19: |-
+ {
+ "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__20: |-
+ {
+ "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__21: |-
+ {
+ "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__22: |-
+ {
+ "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__23: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__24: |-
+ {
+ "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__25: |-
+ {
+ "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__26: |-
+ {
+ "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__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__28: |-
+ {
+ "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__29: |-
+ {
+ "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__30: |-
+ {
+ "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__31: |-
+ {
+ "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__32: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__33: |-
+ {
+ "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__34: |-
+ {
+ "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__35: |-
+ {
+ "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__36: |-
+ {
+ "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__37: |-
+ {
+ "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__38: |-
+ {
+ "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__39: |-
+ {
+ "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__40: |-
+ {
+ "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__41: |-
+ {
+ "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__42: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "baz\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "boo"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__43: |-
+ {
+ "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__44: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "attrs": {
+ "start": 1,
+ "parens": false
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+05_02__container_blocks__list_items__45: |-
+ {
+ "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__46: |-
+ {
+ "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__47: |-
+ {
+ "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__48: |-
+ {
+ "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__49: |-
+ {
+ "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": "[x] bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[x] foo\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[ ] bar"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[x] baz"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[ ] bim"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "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_02__container_blocks__list_items__motivation__task_list_items_extension__lists__50: |-
+ {
+ "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__51: |-
+ {
+ "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__52: |-
+ {
+ "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__53: |-
+ {
+ "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__54: |-
+ {
+ "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__55: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "bar\n"
+ }
+ ]
+ },
+ {
+ "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__56: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__57: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+05_02__container_blocks__list_items__motivation__task_list_items_extension__lists__58: |-
+ {
+ "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__59: |-
+ {
+ "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__60: |-
+ {
+ "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__61: |-
+ {
+ "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__62: |-
+ {
+ "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__63: |-
+ {
+ "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__64: |-
+ {
+ "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__65: |-
+ {
+ "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__66: |-
+ {
+ "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__67: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a\n"
+ }
+ ]
+ },
+ {
+ "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__68: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a\n"
+ }
+ ]
+ },
+ {
+ "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__69: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a\n"
+ }
+ ]
+ },
+ {
+ "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__70: |-
+ {
+ "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__71: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "attrs": {
+ "bullet": "*"
+ },
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a\n"
+ }
+ ]
+ },
+ {
+ "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__72: |-
+ {
+ "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__73: |-
+ {
+ "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__74: |-
+ {
+ "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__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "hi"
+ },
+ {
+ "type": "text",
+ "text": "lo`"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\\\t\\A\\a\\ \\3\\φ\\«"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__03: |-
+ {
+ "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__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\\"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "\\[\\`"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\\[\\]"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": null,
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "\\[\\]"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com?find=%5C*",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com?find=\\*"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar*",
+ "target": "_blank",
+ "title": "ti*tle",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/bar*",
+ "target": "_blank",
+ "title": "ti*tle",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_02__inlines__backslash_escapes__13: |-
+ {
+ "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__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "  & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "# Ӓ Ϡ �"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\" ആ ಫ"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__04: |-
+ {
+ "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__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "&copy"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "&MadeUpEntity;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/f%C3%B6%C3%B6",
+ "target": "_blank",
+ "title": "föö",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/f%C3%B6%C3%B6",
+ "target": "_blank",
+ "title": "föö",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "föö",
+ "class": "code highlight"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "f&ouml;&ouml;"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__12: |-
+ {
+ "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__13: |-
+ {
+ "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__14: |-
+ {
+ "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__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\n\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "\tfoo"
+ }
+ ]
+ }
+ ]
+ }
+06_03__inlines__entity_and_numeric_character_references__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[a](url \"tit\")"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo ` bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "``"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " `` "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " a"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": " b "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_04__inlines__code_spans__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo bar baz"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo\\"
+ },
+ {
+ "type": "text",
+ "text": "bar`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo`bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "foo `` bar"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__15: |-
+ {
+ "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__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "<a href=\""
+ },
+ {
+ "type": "text",
+ "text": "\">`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "`",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "<http://foo.bar."
+ },
+ {
+ "type": "text",
+ "text": "baz>`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar.%60baz",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.`baz"
+ },
+ {
+ "type": "text",
+ "text": "`"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "```foo``"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`foo"
+ }
+ ]
+ }
+ ]
+ }
+06_04__inlines__code_spans__22: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "`foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a * foo bar*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a*\"foo\"*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "* a *"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__06: |-
+ {
+ "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__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_ foo bar_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a_\"foo\"_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo_bar_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "5_6_78"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "приÑтанÑм_ÑтремÑÑ‚ÑÑ_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "aa_\"bb\"_cc"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo-"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(bar)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo bar *"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*foo bar\n*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*(*foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(foo"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo bar _"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__22: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_(_foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__23: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(foo"
+ },
+ {
+ "type": "text",
+ "text": ")"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__24: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_foo_bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__25: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "_приÑтанÑм_ÑтремÑÑ‚ÑÑ"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__26: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo_bar_baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "(bar)"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__28: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__29: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "** foo bar**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__30: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a**\"foo\"**"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__31: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__32: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__33: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__ foo bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__34: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__\nfoo bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__35: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a__\"foo\"__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__36: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo__bar__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__37: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "5__6__78"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__38: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "приÑтанÑм__ÑтремÑÑ‚ÑÑ__"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__39: |-
+ {
+ "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__40: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo-"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "(bar)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__41: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**foo bar **"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__42: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**(**foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__43: |-
+ {
+ "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__44: |-
+ {
+ "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__45: |-
+ {
+ "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__46: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__47: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__foo bar __"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__48: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__(__foo)"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__49: |-
+ {
+ "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__50: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__foo__bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__51: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__приÑтанÑм__ÑтремÑÑ‚ÑÑ"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__52: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo__bar__baz"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__53: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "(bar)"
+ },
+ {
+ "type": "text",
+ "text": "."
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__54: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__55: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__56: |-
+ {
+ "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__57: |-
+ {
+ "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__58: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__59: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__60: |-
+ {
+ "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__61: |-
+ {
+ "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__62: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo**bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__63: |-
+ {
+ "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__64: |-
+ {
+ "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__65: |-
+ {
+ "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__66: |-
+ {
+ "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__67: |-
+ {
+ "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__68: |-
+ {
+ "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__69: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__70: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "** is not an empty emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__71: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "**** is not an empty strong emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__72: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__73: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__74: |-
+ {
+ "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__75: |-
+ {
+ "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__76: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__77: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__78: |-
+ {
+ "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__79: |-
+ {
+ "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__80: |-
+ {
+ "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__81: |-
+ {
+ "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__82: |-
+ {
+ "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__83: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__84: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "__ is not an empty emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__85: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "____ is not an empty strong emphasis"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__86: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ***"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__87: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__88: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__89: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo *****"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__90: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__91: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "_"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__92: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__93: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__94: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__95: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "***"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__96: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "*"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__97: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "***"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__98: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo ___"
+ }
+ ]
+ }
+ ]
+ }
+06_05__inlines__emphasis_and_strong_emphasis__99: |-
+ {
+ "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",
+ "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",
+ "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",
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar/?q=__"
+ }
+ ]
+ }
+ ]
+ }
+06_06__inlines__strikethrough_extension__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "~~Hi~~ Hello, world!"
+ }
+ ]
+ }
+ ]
+ }
+06_06__inlines__strikethrough_extension__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This ~~has a"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "new paragraph~~."
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](/my uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/my%20uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](foo\nbar)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__08: |-
+ Error - check implementation:
+ Hast node of type "foo" not supported by this converter. Please, provide an specification.
+06_07__inlines__links__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "b)c",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](<foo>)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__11: |-
+ {
+ "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__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "(foo)",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar))",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar)",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo(and(bar)",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo):",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "#fragment",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com#fragment",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com?foo=3#frag",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo%5Cbar",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "foo%20b%C3%A4",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "%22title%22",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "linklinklink"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__22: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title \"\"",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__23: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url%C2%A0%22title%22",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__24: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link](/url \"title \"and\" title\")"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__25: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title \"and\" title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__26: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__27: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link] (/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__28: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [foo [bar]]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__29: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link] bar](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__30: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[link "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__31: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__32: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "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__33: |-
+ Error - check implementation:
+ Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
+06_07__inlines__links__34: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__35: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ },
+ {
+ "type": "text",
+ "text": "](/uri)](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__36: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "uri3",
+ "alt": "[foo](uri2)",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__37: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__38: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "baz*",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo *bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__39: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo [bar"
+ },
+ {
+ "type": "text",
+ "text": " baz]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__40: |-
+ Error - check implementation:
+ Hast node of type "bar" not supported by this converter. Please, provide an specification.
+06_07__inlines__links__41: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "](/uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__42: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/?search=](uri)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__43: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__44: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [foo [bar]]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__45: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "link [bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__46: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "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__47: |-
+ Error - check implementation:
+ Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
+06_07__inlines__links__48: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ },
+ {
+ "type": "text",
+ "text": "]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "ref"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__49: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ },
+ {
+ "type": "text",
+ "text": "]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "ref"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__50: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__51: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo *bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__52: |-
+ Error - check implementation:
+ Hast node of type "bar" not supported by this converter. Please, provide an specification.
+06_07__inlines__links__53: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "][ref]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__54: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/?search=][ref]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__55: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__56: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Толпой"
+ },
+ {
+ "type": "text",
+ "text": " is a Russian word."
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__57: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Baz"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__58: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo] "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__59: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]\n"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__60: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__61: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[bar][foo!]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__62: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo][ref[]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[ref[]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__63: |-
+ {
+ "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__64: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[[foo]]]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[[foo]]]: /url"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__65: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__66: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/uri",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar\\"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__67: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__68: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[\n]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[\n]: /uri"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__69: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__70: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__71: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__72: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "\n[]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__73: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__74: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__75: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "["
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ },
+ {
+ "type": "italic"
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__76: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[bar "
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__77: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "Foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__78: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": " bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__79: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__80: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "*"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo*"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__81: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url2",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__82: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__83: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__84: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "text": "(not a link)"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__85: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__86: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url2",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "baz"
+ }
+ ]
+ }
+ ]
+ }
+06_07__inlines__links__87: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[foo]"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url1",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "bar"
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__02: |-
+ {
+ "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__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url2",
+ "alt": "foo bar",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url2",
+ "alt": "foo bar",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__05: |-
+ {
+ "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__06: |-
+ {
+ "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__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "train.jpg",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__08: |-
+ {
+ "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__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": null,
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo bar",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "Foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__16: |-
+ {
+ "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__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "foo bar",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "![[foo]]"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "[[foo]]: /url \"title\""
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "image",
+ "attrs": {
+ "src": "/url",
+ "alt": "Foo",
+ "title": "title",
+ "uploading": false,
+ "canonicalSrc": null
+ }
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "![foo]"
+ }
+ ]
+ }
+ ]
+ }
+06_08__inlines__images__22: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "!"
+ },
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "/url",
+ "target": "_blank",
+ "title": "title",
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://foo.bar.baz",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.baz"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__02: |-
+ {
+ "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",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://foo.bar.baz/test?q=hello&id=22&boolean"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "irc://foo.bar:2233/baz",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "irc://foo.bar:2233/baz"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "MAILTO:FOO@BAR.BAZ",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "MAILTO:FOO@BAR.BAZ"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "a+b+c:d",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "a+b+c:d"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "made-up-scheme://foo,bar",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "made-up-scheme://foo,bar"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://../",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://../"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "localhost:5001/foo",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "localhost:5001/foo"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<http://foo.bar/baz bim>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com/%5C%5B%5C",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "http://example.com/\\[\\"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo@bar.example.com",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo@bar.example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "mailto:foo+special@Bar.baz-bar0.com",
+ "target": "_blank",
+ "title": null,
+ "canonicalSrc": null
+ }
+ }
+ ],
+ "text": "foo+special@Bar.baz-bar0.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<foo+@bar.example.com>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "< http://foo.bar >"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__16: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<m:abc>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__17: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<foo.bar.baz>"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__18: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "http://example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_09__inlines__autolinks__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo@bar.example.com"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.commonmark.org"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit www.commonmark.org/help for more information."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit www.commonmark.org."
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Visit www.commonmark.org/a.b."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.google.com/search?q=Markup+(business)"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.google.com/search?q=Markup+(business)))"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "(www.google.com/search?q=Markup+(business))"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "(www.google.com/search?q=Markup+(business)"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.google.com/search?q=(business))+ok"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.google.com/search?q=commonmark&hl=en"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.google.com/search?q=commonmark&hl;"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "www.commonmark.org/he<lp"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "http://commonmark.org"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "(Visit https://encrypted.google.com/search?q=Markup+(business))"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Anonymous FTP is available at ftp://foo.bar.baz."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo@bar.baz"
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is."
+ }
+ ]
+ }
+ ]
+ }
+06_10__inlines__autolinks_extension__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a.b-c_d@a.b"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "a.b-c_d@a.b."
+ }
+ ]
+ },
+ {
+ "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__01: |-
+ Error - check implementation:
+ Hast node of type "bab" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__02: |-
+ Error - check implementation:
+ Hast node of type "b2" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__03: |-
+ Error - check implementation:
+ Hast node of type "b2" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__05: |-
+ Error - check implementation:
+ Hast node of type "responsive-image" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__06: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<33> <__>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__07: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a h*#ref=\"hi\">"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href=\"hi'> <a href=hi'>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "< a><\nfoo><bar/ >\n<foo bar=baz\nbim!bop />"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href='bar'title=title>"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_11__inlines__raw_html__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "</a href=\"foo\">"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__13: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!-- not a comment -- two hyphens -->"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!--> foo -->"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo <!-- foo--->"
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__16: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__17: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__18: |-
+ Error - check implementation:
+ Hast node of type "comment" not supported by this converter. Please, provide an specification.
+06_11__inlines__raw_html__19: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__20: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo "
+ }
+ ]
+ }
+ ]
+ }
+06_11__inlines__raw_html__21: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "<a href=\"\"\">"
+ }
+ ]
+ }
+ ]
+ }
+06_12__inlines__disallowed_raw_html_extension__01: |-
+ Error - check implementation:
+ Hast node of type "title" not supported by this converter. Please, provide an specification.
+06_13__inlines__hard_line_breaks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__04: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__05: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "\nbar"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__06: |-
+ Error - check implementation:
+ Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
+06_13__inlines__hard_line_breaks__07: |-
+ Error - check implementation:
+ Cannot destructure property 'type' of 'this.stack.pop(...)' as it is undefined.
+06_13__inlines__hard_line_breaks__08: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "code span"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__09: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ],
+ "text": "code\\ span"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__10: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__11: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph"
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__12: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\\"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__13: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__14: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\\"
+ }
+ ]
+ }
+ ]
+ }
+06_13__inlines__hard_line_breaks__15: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "foo"
+ }
+ ]
+ }
+ ]
+ }
+06_14__inlines__soft_line_breaks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_14__inlines__soft_line_breaks__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "foo\nbaz"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "hello $.;'there"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__02: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Foo χÏῆν"
+ }
+ ]
+ }
+ ]
+ }
+06_15__inlines__textual_content__03: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Multiple spaces"
+ }
+ ]
+ }
+ ]
+ }
+07_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bold"
+ }
+ ]
+ }
+ ]
+ }
+08_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01: |-
+ Error - check implementation:
+ Cannot read properties of undefined (reading 'wrapTextInParagraph')
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index ce0df4250d6..e721525f00c 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -2379,6 +2379,23 @@
"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
+ }
+ }
]
}
],
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 0c14c023378..a194898cb5a 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 @@
-{"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"}]}
+{"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}}]}
diff --git a/spec/fixtures/lib/gitlab/import_export/designs/project.json b/spec/fixtures/lib/gitlab/import_export/designs/project.json
index 16dd805c132..6720139adeb 100644
--- a/spec/fixtures/lib/gitlab/import_export/designs/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/designs/project.json
@@ -9,7 +9,6 @@
"merge_requests_ff_only_enabled":false,
"issues_template":null,
"shared_runners_enabled":true,
- "build_coverage_regex":null,
"build_allow_git_fetch":true,
"build_timeout":3600,
"pending_delete":false,
diff --git a/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/project.json b/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/project.json
index 5ca803cc11f..d25371e10dd 100644
--- a/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/project.json
@@ -5,7 +5,6 @@
"autoclose_referenced_issues": true,
"boards": [],
"build_allow_git_fetch": true,
- "build_coverage_regex": null,
"build_timeout": 3600,
"ci_cd_settings": {
"group_runners_enabled": true
diff --git a/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/tree/project.json b/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/tree/project.json
index 5f7cf8128bc..4e08ae31f36 100644
--- a/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/tree/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/multi_pipeline_ref_one_external_pr/tree/project.json
@@ -1 +1 @@
-{"id":5,"approvals_before_merge":0,"archived":false,"auto_cancel_pending_pipelines":"enabled","autoclose_referenced_issues":true,"build_allow_git_fetch":true,"build_coverage_regex":null,"build_timeout":3600,"ci_config_path":null,"delete_error":null,"description":"Vim, Tmux and others","disable_overriding_approvers_per_merge_request":null,"external_authorization_classification_label":"","external_webhook_token":"D3mVYFzZkgZ5kMfcW_wx","public_builds":true,"shared_runners_enabled":true,"visibility_level":20}
+{"id":5,"approvals_before_merge":0,"archived":false,"auto_cancel_pending_pipelines":"enabled","autoclose_referenced_issues":true,"build_allow_git_fetch":true,"build_timeout":3600,"ci_config_path":null,"delete_error":null,"description":"Vim, Tmux and others","disable_overriding_approvers_per_merge_request":null,"external_authorization_classification_label":"","external_webhook_token":"D3mVYFzZkgZ5kMfcW_wx","public_builds":true,"shared_runners_enabled":true,"visibility_level":20}
diff --git a/spec/fixtures/logo_sample.svg b/spec/fixtures/logo_sample.svg
index 883e7e6cf92..2feb64a9aa2 100644
--- a/spec/fixtures/logo_sample.svg
+++ b/spec/fixtures/logo_sample.svg
@@ -1,27 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
- <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
- <title>Slice 1</title>
- <desc>Created with Sketch.</desc>
- <script>alert('FAIL')</script>
- <defs></defs>
- <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
- <g id="logo" sketch:type="MSLayerGroup" transform="translate(0.000000, 10.000000)">
- <g id="Page-1" sketch:type="MSShapeGroup">
- <g id="Fill-1-+-Group-24">
- <g id="Group-24">
- <g id="Group">
- <path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329" class="tanuki-shape"></path>
- <path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26" class="tanuki-shape"></path>
- <path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326" class="tanuki-shape"></path>
- <path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329" class="tanuki-shape"></path>
- </g>
- </g>
- </g>
- </g>
- </g>
- </g>
+<svg width="50" height="48" viewBox="0 0 50 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
+ <title>Slice 1</title>
+ <desc>Created with Sketch.</desc>
+ <script>alert('FAIL')</script>
+ <defs></defs>
+ <path d="m49.014 19-.067-.18-6.784-17.696a1.792 1.792 0 0 0-3.389.182l-4.579 14.02H15.651l-4.58-14.02a1.795 1.795 0 0 0-3.388-.182l-6.78 17.7-.071.175A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869 10.394-7.779.029-.022a12.595 12.595 0 0 0 4.182-14.554Z"
+ fill="#E24329"/>
+ <path d="m49.014 19-.067-.18a22.88 22.88 0 0 0-9.12 4.103L24.931 34.187l9.485 7.167 10.393-7.779.03-.022a12.595 12.595 0 0 0 4.175-14.554Z"
+ fill="#FC6D26"/>
+ <path d="m15.414 41.354 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869-9.484-7.167-9.51 7.167Z"
+ fill="#FCA326"/>
+ <path d="M10.019 22.923a22.86 22.86 0 0 0-9.117-4.1L.832 19A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 9.491-7.167L10.02 22.923Z"
+ fill="#FC6D26"/>
</svg>
+
diff --git a/spec/fixtures/markdown/markdown_golden_master_examples.yml b/spec/fixtures/markdown/markdown_golden_master_examples.yml
index bdd7c13c1a3..5847e9f2cdf 100644
--- a/spec/fixtures/markdown/markdown_golden_master_examples.yml
+++ b/spec/fixtures/markdown/markdown_golden_master_examples.yml
@@ -140,7 +140,7 @@
markdown: |-
![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)
html: |-
- <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" class="lazy gfm" data-src="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
+ <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" decoding="async" class="lazy gfm" data-src="/groups/group58/-/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
- name: attachment_image_for_project
api_context: project
@@ -149,7 +149,7 @@
markdown: |-
![test-file](/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png)
html: |-
- <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" class="lazy gfm" data-src="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
+ <p data-sourcepos="1:1-1:69" dir="auto"><a class="no-attachment-icon gfm" href="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-link="true"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="test-file" decoding="async" class="lazy gfm" data-src="/group58/project22/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png" data-canonical-src="/uploads/aa45a38ec2cfe97433281b10bbff042c/test-file.png"></a></p>
- name: attachment_image_for_project_wiki
api_context: project_wiki
@@ -158,7 +158,7 @@
markdown: |-
![test-file](test-file.png)
html: |-
- <p data-sourcepos="1:1-1:27" dir="auto"><a class="no-attachment-icon" href="/group1/project1/-/wikis/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="test-file.png"><img alt="test-file" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png"></a></p>
+ <p data-sourcepos="1:1-1:27" dir="auto"><a class="no-attachment-icon" href="/group1/project1/-/wikis/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="test-file.png"><img alt="test-file" decoding="async" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png"></a></p>
- name: attachment_link_for_group
api_context: group
@@ -391,7 +391,7 @@
]
```
html: |-
- <a class="no-attachment-icon" href="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA==" target="_blank" rel="noopener noreferrer" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,ICAjc3Ryb2tlOiAjYTg2MTI4CiAgWzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybnwKICAgIFs8YWJzdHJhY3Q+Q29tcG9uZW50fHwrIG9wZXJhdGlvbigpXQogICAgW0NsaWVudF0gZGVwZW5kcyAtLT4gW0NvbXBvbmVudF0KICAgIFtEZWNvcmF0b3J8LSBuZXh0OiBDb21wb25lbnRdCiAgICBbRGVjb3JhdG9yXSBkZWNvcmF0ZXMgLS0gW0NvbmNyZXRlQ29tcG9uZW50XQogICAgW0NvbXBvbmVudF0gPDotIFtEZWNvcmF0b3JdCiAgICBbQ29tcG9uZW50XSA8Oi0gW0NvbmNyZXRlQ29tcG9uZW50XQogIF0K"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="js-render-kroki lazy" data-src="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA=="></a>
+ <a class="no-attachment-icon" href="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA==" target="_blank" rel="noopener noreferrer" data-diagram="nomnoml" data-diagram-src="data:text/plain;base64,ICAjc3Ryb2tlOiAjYTg2MTI4CiAgWzxmcmFtZT5EZWNvcmF0b3IgcGF0dGVybnwKICAgIFs8YWJzdHJhY3Q+Q29tcG9uZW50fHwrIG9wZXJhdGlvbigpXQogICAgW0NsaWVudF0gZGVwZW5kcyAtLT4gW0NvbXBvbmVudF0KICAgIFtEZWNvcmF0b3J8LSBuZXh0OiBDb21wb25lbnRdCiAgICBbRGVjb3JhdG9yXSBkZWNvcmF0ZXMgLS0gW0NvbmNyZXRlQ29tcG9uZW50XQogICAgW0NvbXBvbmVudF0gPDotIFtEZWNvcmF0b3JdCiAgICBbQ29tcG9uZW50XSA8Oi0gW0NvbmNyZXRlQ29tcG9uZW50XQogIF0K"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="js-render-kroki lazy" decoding="async" data-src="http://localhost:8000/nomnoml/svg/eNp1jbsOwjAMRfd-haUuIJQBBlRFVZb2L1CGkBqpgtpR6oEhH0_CW6hsts-9xwD1LJHPqKF2zX67ayqAQ3uKbkLTo-fohCMEJ4KRUoYFu2MuOS-m4ykwIUlKG-CAOT0yrdb2EewuY2YWBgxIwwxKmXx8dZ6h95ekgPAqGv4miuk-YnEVFfmIgr-Fzw6tVt-CZb7osdUNUAReJA=="></a>
- name: diagram_plantuml
markdown: |-
@@ -403,7 +403,7 @@
Alice <-- Bob: Another authentication Response
```
html: |-
- <a class="no-attachment-icon" href="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00" target="_blank" rel="noopener noreferrer" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,ICBBbGljZSAtPiBCb2I6IEF1dGhlbnRpY2F0aW9uIFJlcXVlc3QKICBCb2IgLS0+IEFsaWNlOiBBdXRoZW50aWNhdGlvbiBSZXNwb25zZQoKICBBbGljZSAtPiBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVxdWVzdAogIEFsaWNlIDwtLSBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVzcG9uc2UK"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" class="lazy" data-src="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00"></a>
+ <a class="no-attachment-icon" href="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00" target="_blank" rel="noopener noreferrer" data-diagram="plantuml" data-diagram-src="data:text/plain;base64,ICBBbGljZSAtPiBCb2I6IEF1dGhlbnRpY2F0aW9uIFJlcXVlc3QKICBCb2IgLS0+IEFsaWNlOiBBdXRoZW50aWNhdGlvbiBSZXNwb25zZQoKICBBbGljZSAtPiBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVxdWVzdAogIEFsaWNlIDwtLSBCb2I6IEFub3RoZXIgYXV0aGVudGljYXRpb24gUmVzcG9uc2UK"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" decoding="async" class="lazy" data-src="http://localhost:8080/png/U9nJK73CoKnELT2rKt3AJx9IS2mjoKZDAybCJYp9pCzJ24ejB4qjBk5I0Cagw09LWPLZKLTSa9zNdCe5L8bcO5u-K6MHGY8kWo7ARNHr2QY7MW00AeWxTG00"></a>
- name: div
markdown: |-
@@ -449,11 +449,11 @@
</figure>
html: |-
<figure>
- <p data-sourcepos="3:1-3:42"><a class="no-attachment-icon" href="elephant-sunset.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Elephant at sunset" class="lazy" data-src="elephant-sunset.jpg"></a></p>
+ <p data-sourcepos="3:1-3:42"><a class="no-attachment-icon" href="elephant-sunset.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Elephant at sunset" decoding="async" class="lazy" data-src="elephant-sunset.jpg"></a></p>
<figcaption>An elephant at sunset</figcaption>
</figure>
<figure>
- <p data-sourcepos="9:1-9:44"><a class="no-attachment-icon" href="croc-crocs.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="A crocodile wearing crocs" class="lazy" data-src="croc-crocs.jpg"></a></p>
+ <p data-sourcepos="9:1-9:44"><a class="no-attachment-icon" href="croc-crocs.jpg" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="A crocodile wearing crocs" decoding="async" class="lazy" data-src="croc-crocs.jpg"></a></p>
<figcaption>
<p data-sourcepos="13:1-13:28">A crocodile wearing <em>crocs</em>!</p>
</figcaption>
@@ -613,7 +613,7 @@
markdown: |-
![alt text](https://gitlab.com/logo.png)
html: |-
- <p data-sourcepos="1:1-1:40" dir="auto"><a class="no-attachment-icon" href="https://gitlab.com/logo.png" target="_blank" rel="nofollow noreferrer noopener"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="alt text" class="lazy" data-src="https://gitlab.com/logo.png"></a></p>
+ <p data-sourcepos="1:1-1:40" dir="auto"><a class="no-attachment-icon" href="https://gitlab.com/logo.png" target="_blank" rel="nofollow noreferrer noopener"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="alt text" decoding="async" class="lazy" data-src="https://gitlab.com/logo.png"></a></p>
- name: inline_code
markdown: |-
@@ -750,7 +750,7 @@
markdown: |-
Hi @gfm_user - thank you for reporting this bug (#1) we hope to fix it in %1.1 as part of !1
html: |-
- <p data-sourcepos="1:1-1:92" dir="auto">Hi <a href="/gfm_user" data-user="1" data-reference-type="user" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="John Doe1">@gfm_user</a> - thank you for reporting this bug (<a href="/group1/project1/-/issues/1" data-original="#1" data-link="false" data-link-reference="false" data-project="11" data-issue="11" data-reference-type="issue" data-container="body" data-placement="top" title="My title 1" class="gfm gfm-issue has-tooltip">#1</a>) we hope to fix it in <a href="/group1/project1/-/milestones/1" data-original="%1.1" data-link="false" data-link-reference="false" data-project="11" data-milestone="11" data-reference-type="milestone" data-container="body" data-placement="top" title="" class="gfm gfm-milestone has-tooltip">%1.1</a> as part of <a href="/group1/project1/-/merge_requests/1" data-original="!1" data-link="false" data-link-reference="false" data-project="11" data-merge-request="11" data-project-path="group1/project1" data-iid="1" data-mr-title="My title 2" data-reference-type="merge_request" data-container="body" data-placement="top" title="" class="gfm gfm-merge_request">!1</a></p>
+ <p data-sourcepos="1:1-1:92" dir="auto">Hi <a href="/gfm_user" data-user="1" data-reference-type="user" data-container="body" data-placement="top" class="gfm gfm-project_member js-user-link" title="John Doe1">@gfm_user</a> - thank you for reporting this bug (<a href="/group1/project1/-/issues/1" data-original="#1" data-link="false" data-link-reference="false" data-project="11" data-issue="11" data-issue-type="issue" data-reference-type="issue" data-container="body" data-placement="top" title="My title 1" class="gfm gfm-issue has-tooltip">#1</a>) we hope to fix it in <a href="/group1/project1/-/milestones/1" data-original="%1.1" data-link="false" data-link-reference="false" data-project="11" data-milestone="11" data-reference-type="milestone" data-container="body" data-placement="top" title="" class="gfm gfm-milestone has-tooltip">%1.1</a> as part of <a href="/group1/project1/-/merge_requests/1" data-original="!1" data-link="false" data-link-reference="false" data-project="11" data-merge-request="11" data-project-path="group1/project1" data-iid="1" data-mr-title="My title 2" data-reference-type="merge_request" data-container="body" data-placement="top" title="" class="gfm gfm-merge_request">!1</a></p>
- name: strike
markdown: |-
~~del~~
diff --git a/spec/fixtures/security_reports/master/gl-common-scanning-report.json b/spec/fixtures/security_reports/master/gl-common-scanning-report.json
index 1fb00b2ff3a..787573301bb 100644
--- a/spec/fixtures/security_reports/master/gl-common-scanning-report.json
+++ b/spec/fixtures/security_reports/master/gl-common-scanning-report.json
@@ -1,300 +1,422 @@
{
- "vulnerabilities": [
- {
- "category": "dependency_scanning",
- "name": "Vulnerabilities in libxml2",
- "message": "Vulnerabilities in libxml2 in nokogiri",
- "description": "",
- "cve": "CVE-1020",
- "severity": "High",
- "solution": "Upgrade to latest version.",
- "scanner": {
- "id": "gemnasium",
- "name": "Gemnasium"
- },
- "evidence": {
- "source": {
- "id": "assert:CORS - Bad 'Origin' value",
- "name": "CORS - Bad 'Origin' value"
- },
- "summary": "The Origin header was changed to an invalid value of http://peachapisecurity.com and the response contained an Access-Control-Allow-Origin header which included this invalid Origin, indicating that the CORS configuration on the server is overly permissive.\n\n\n",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- },
- "response": {
- "headers": [
- {
- "name": "Server",
- "value": "TwistedWeb/20.3.0"
- }
- ],
- "reason_phrase": "OK",
- "status_code": 200,
- "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
- },
- "supporting_messages": [
- {
- "name": "Origional",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- }
- },
- {
- "name": "Recorded",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- },
- "response": {
- "headers": [
- {
- "name": "Server",
- "value": "TwistedWeb/20.3.0"
- }
- ],
- "reason_phrase": "OK",
- "status_code": 200,
- "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
- }
- }
- ]
- },
- "location": {},
- "identifiers": [
- {
- "type": "GitLab",
- "name": "Foo vulnerability",
- "value": "foo"
- }
- ],
- "links": [
- {
- "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1020"
- }
- ],
- "details": {
- "commit": {
- "name": [
- {
- "lang": "en",
- "value": "The Commit"
- }
- ],
- "description": [
- {
- "lang": "en",
- "value": "Commit where the vulnerability was identified"
- }
- ],
- "type": "commit",
- "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
- }
- }
+ "vulnerabilities": [{
+ "category": "dependency_scanning",
+ "name": "Vulnerability for remediation testing 1",
+ "message": "This vulnerability should have ONE remediation",
+ "description": "",
+ "cve": "CVE-2137",
+ "severity": "High",
+ "solution": "Upgrade to latest version.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Foo vulnerability",
+ "value": "foo"
+ }],
+ "links": [{
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2137"
+ }],
+ "details": {
+ "commit": {
+ "name": [{
+ "lang": "en",
+ "value": "The Commit"
+ }],
+ "description": [{
+ "lang": "en",
+ "value": "Commit where the vulnerability was identified"
+ }],
+ "type": "commit",
+ "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
+ }
+ }
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Vulnerability for remediation testing 2",
+ "message": "This vulnerability should have ONE remediation",
+ "description": "",
+ "cve": "CVE-2138",
+ "severity": "High",
+ "solution": "Upgrade to latest version.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Foo vulnerability",
+ "value": "foo"
+ }],
+ "links": [{
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2138"
+ }],
+ "details": {
+ "commit": {
+ "name": [{
+ "lang": "en",
+ "value": "The Commit"
+ }],
+ "description": [{
+ "lang": "en",
+ "value": "Commit where the vulnerability was identified"
+ }],
+ "type": "commit",
+ "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
+ }
+ }
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Vulnerability for remediation testing 3",
+ "message": "Remediation for this vulnerability should remediate CVE-2140 as well",
+ "description": "",
+ "cve": "CVE-2139",
+ "severity": "High",
+ "solution": "Upgrade to latest version.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Foo vulnerability",
+ "value": "foo"
+ }],
+ "links": [{
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2139"
+ }],
+ "details": {
+ "commit": {
+ "name": [{
+ "lang": "en",
+ "value": "The Commit"
+ }],
+ "description": [{
+ "lang": "en",
+ "value": "Commit where the vulnerability was identified"
+ }],
+ "type": "commit",
+ "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
+ }
+ }
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Vulnerability for remediation testing 4",
+ "message": "Remediation for this vulnerability should remediate CVE-2139 as well",
+ "description": "",
+ "cve": "CVE-2140",
+ "severity": "High",
+ "solution": "Upgrade to latest version.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Foo vulnerability",
+ "value": "foo"
+ }],
+ "links": [{
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2140"
+ }],
+ "details": {
+ "commit": {
+ "name": [{
+ "lang": "en",
+ "value": "The Commit"
+ }],
+ "description": [{
+ "lang": "en",
+ "value": "Commit where the vulnerability was identified"
+ }],
+ "type": "commit",
+ "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
+ }
+ }
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Vulnerabilities in libxml2",
+ "message": "Vulnerabilities in libxml2 in nokogiri",
+ "description": "",
+ "cve": "CVE-1020",
+ "severity": "High",
+ "solution": "Upgrade to latest version.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "evidence": {
+ "source": {
+ "id": "assert:CORS - Bad 'Origin' value",
+ "name": "CORS - Bad 'Origin' value"
},
- {
- "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3",
- "category": "dependency_scanning",
- "name": "Regular Expression Denial of Service",
- "message": "Regular Expression Denial of Service in debug",
- "description": "",
- "cve": "CVE-1030",
- "severity": "Unknown",
- "solution": "Upgrade to latest versions.",
- "scanner": {
- "id": "gemnasium",
- "name": "Gemnasium"
- },
- "evidence": {
- "source": {
- "id": "assert:CORS - Bad 'Origin' value",
- "name": "CORS - Bad 'Origin' value"
- },
- "summary": "The Origin header was changed to an invalid value of http://peachapisecurity.com and the response contained an Access-Control-Allow-Origin header which included this invalid Origin, indicating that the CORS configuration on the server is overly permissive.\n\n\n",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- },
- "response": {
- "headers": [
- {
- "name": "Server",
- "value": "TwistedWeb/20.3.0"
- }
- ],
- "reason_phrase": "OK",
- "status_code": 200,
- "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
- },
- "supporting_messages": [
- {
- "name": "Origional",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- }
- },
- {
- "name": "Recorded",
- "request": {
- "headers": [
- {
- "name": "Host",
- "value": "127.0.0.1:7777"
- }
- ],
- "method": "GET",
- "url": "http://127.0.0.1:7777/api/users",
- "body": ""
- },
- "response": {
- "headers": [
- {
- "name": "Server",
- "value": "TwistedWeb/20.3.0"
- }
- ],
- "reason_phrase": "OK",
- "status_code": 200,
- "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
- }
- }
- ]
- },
- "location": {},
- "identifiers": [
- {
- "type": "GitLab",
- "name": "Bar vulnerability",
- "value": "bar"
- }
- ],
- "links": [
- {
- "name": "CVE-1030",
- "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1030"
- }
- ]
+ "summary": "The Origin header was changed to an invalid value of http://peachapisecurity.com and the response contained an Access-Control-Allow-Origin header which included this invalid Origin, indicating that the CORS configuration on the server is overly permissive.\n\n\n",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
},
- {
- "category": "dependency_scanning",
- "name": "Authentication bypass via incorrect DOM traversal and canonicalization",
- "message": "Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js",
- "description": "",
- "cve": "yarn/yarn.lock:saml2-js:gemnasium:9952e574-7b5b-46fa-a270-aeb694198a98",
- "severity": "Unknown",
- "solution": "Upgrade to fixed version.\r\n",
- "scanner": {
- "id": "gemnasium",
- "name": "Gemnasium"
+ "response": {
+ "headers": [{
+ "name": "Server",
+ "value": "TwistedWeb/20.3.0"
+ }],
+ "reason_phrase": "OK",
+ "status_code": 200,
+ "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
+ },
+ "supporting_messages": [{
+ "name": "Origional",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
+ }
+ },
+ {
+ "name": "Recorded",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
},
- "location": {},
- "identifiers": [],
- "links": [
- ]
+ "response": {
+ "headers": [{
+ "name": "Server",
+ "value": "TwistedWeb/20.3.0"
+ }],
+ "reason_phrase": "OK",
+ "status_code": 200,
+ "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
+ }
+ }
+ ]
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Foo vulnerability",
+ "value": "foo"
+ }],
+ "links": [{
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1020"
+ }],
+ "details": {
+ "commit": {
+ "name": [{
+ "lang": "en",
+ "value": "The Commit"
+ }],
+ "description": [{
+ "lang": "en",
+ "value": "Commit where the vulnerability was identified"
+ }],
+ "type": "commit",
+ "value": "41df7b7eb3be2b5be2c406c2f6d28cd6631eeb19"
}
- ],
- "remediations": [
- {
- "fixes": [
- {
- "cve": "CVE-1020"
- }
- ],
- "summary": "",
- "diff": ""
- },
- {
- "fixes": [
- {
- "cve": "CVE",
- "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3"
- }
- ],
- "summary": "",
- "diff": ""
+ }
+ },
+ {
+ "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3",
+ "category": "dependency_scanning",
+ "name": "Regular Expression Denial of Service",
+ "message": "Regular Expression Denial of Service in debug",
+ "description": "",
+ "cve": "CVE-1030",
+ "severity": "Unknown",
+ "solution": "Upgrade to latest versions.",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "evidence": {
+ "source": {
+ "id": "assert:CORS - Bad 'Origin' value",
+ "name": "CORS - Bad 'Origin' value"
},
- {
- "fixes": [
- {
- "cve": "CVE",
- "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3"
- }
- ],
- "summary": "",
- "diff": ""
+ "summary": "The Origin header was changed to an invalid value of http://peachapisecurity.com and the response contained an Access-Control-Allow-Origin header which included this invalid Origin, indicating that the CORS configuration on the server is overly permissive.\n\n\n",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
},
- {
- "fixes": [
- {
- "id": "2134",
- "cve": "CVE-1"
- }
- ],
- "summary": "",
- "diff": ""
- }
- ],
- "dependency_files": [],
- "scan": {
- "analyzer": {
- "id": "common-analyzer",
- "name": "Common Analyzer",
- "url": "https://site.com/analyzer/common",
- "version": "2.0.1",
- "vendor": {
- "name": "Common"
- }
+ "response": {
+ "headers": [{
+ "name": "Server",
+ "value": "TwistedWeb/20.3.0"
+ }],
+ "reason_phrase": "OK",
+ "status_code": 200,
+ "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
},
- "scanner": {
- "id": "gemnasium",
- "name": "Gemnasium",
- "url": "https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven",
- "vendor": {
- "name": "GitLab"
+ "supporting_messages": [{
+ "name": "Origional",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
+ }
+ },
+ {
+ "name": "Recorded",
+ "request": {
+ "headers": [{
+ "name": "Host",
+ "value": "127.0.0.1:7777"
+ }],
+ "method": "GET",
+ "url": "http://127.0.0.1:7777/api/users",
+ "body": ""
},
- "version": "2.18.0"
- },
- "type": "dependency_scanning",
- "start_time": "placeholder-value",
- "end_time": "placeholder-value",
- "status": "success"
+ "response": {
+ "headers": [{
+ "name": "Server",
+ "value": "TwistedWeb/20.3.0"
+ }],
+ "reason_phrase": "OK",
+ "status_code": 200,
+ "body": "[{\"user_id\":1,\"user\":\"admin\",\"first\":\"Joe\",\"last\":\"Smith\",\"password\":\"Password!\"}]"
+ }
+ }
+ ]
+ },
+ "location": {},
+ "identifiers": [{
+ "type": "GitLab",
+ "name": "Bar vulnerability",
+ "value": "bar"
+ }],
+ "links": [{
+ "name": "CVE-1030",
+ "url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1030"
+ }]
+ },
+ {
+ "category": "dependency_scanning",
+ "name": "Authentication bypass via incorrect DOM traversal and canonicalization",
+ "message": "Authentication bypass via incorrect DOM traversal and canonicalization in saml2-js",
+ "description": "",
+ "cve": "yarn/yarn.lock:saml2-js:gemnasium:9952e574-7b5b-46fa-a270-aeb694198a98",
+ "severity": "Unknown",
+ "solution": "Upgrade to fixed version.\r\n",
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium"
+ },
+ "location": {},
+ "identifiers": [],
+ "links": []
+ }
+ ],
+ "remediations": [{
+ "fixes": [{
+ "cve": "CVE-2137"
+ }],
+ "summary": "this remediates CVE-2137",
+ "diff": "dG90YWxseSBsZWdpdCBkaWZm"
+ },
+ {
+ "fixes": [{
+ "cve": "CVE-2138"
+ }],
+ "summary": "this remediates CVE-2138",
+ "diff": "dG90YWxseSBsZWdpdCBkaWZm"
+ },
+ {
+ "fixes": [{
+ "cve": "CVE-2139"
+ }, {
+ "cve": "CVE-2140"
+ }],
+ "summary": "this remediates CVE-2139 and CVE-2140",
+ "diff": "dG90YWxseSBsZWdpdGltYXRlIGRpZmYsIDEwLzEwIHdvdWxkIGFwcGx5"
+ },
+ {
+ "fixes": [{
+ "cve": "CVE-1020"
+ }],
+ "summary": "",
+ "diff": ""
+ },
+ {
+ "fixes": [{
+ "cve": "CVE",
+ "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3"
+ }],
+ "summary": "",
+ "diff": ""
+ },
+ {
+ "fixes": [{
+ "cve": "CVE",
+ "id": "bb2fbeb1b71ea360ce3f86f001d4e84823c3ffe1a1f7d41ba7466b14cfa953d3"
+ }],
+ "summary": "",
+ "diff": ""
+ },
+ {
+ "fixes": [{
+ "id": "2134",
+ "cve": "CVE-1"
+ }],
+ "summary": "",
+ "diff": ""
+ }
+ ],
+ "dependency_files": [],
+ "scan": {
+ "analyzer": {
+ "id": "common-analyzer",
+ "name": "Common Analyzer",
+ "url": "https://site.com/analyzer/common",
+ "version": "2.0.1",
+ "vendor": {
+ "name": "Common"
+ }
+ },
+ "scanner": {
+ "id": "gemnasium",
+ "name": "Gemnasium",
+ "url": "https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven",
+ "vendor": {
+ "name": "GitLab"
+ },
+ "version": "2.18.0"
},
- "version": "14.0.2"
+ "type": "dependency_scanning",
+ "start_time": "placeholder-value",
+ "end_time": "placeholder-value",
+ "status": "success"
+ },
+ "version": "14.0.2"
}
diff --git a/spec/frontend/.eslintrc.yml b/spec/frontend/.eslintrc.yml
index e12c4e5e820..45639f4c948 100644
--- a/spec/frontend/.eslintrc.yml
+++ b/spec/frontend/.eslintrc.yml
@@ -11,9 +11,6 @@ settings:
import/resolver:
jest:
jestConfigFile: 'jest.config.js'
-globals:
- loadFixtures: false
- setFixtures: false
rules:
jest/expect-expect:
- off
@@ -21,8 +18,6 @@ rules:
- 'expect*'
- 'assert*'
- 'testAction'
- jest/no-test-callback:
- - off
"@gitlab/no-global-event-off":
- off
import/no-unresolved:
diff --git a/spec/frontend/__helpers__/dom_shims/clipboard.js b/spec/frontend/__helpers__/dom_shims/clipboard.js
new file mode 100644
index 00000000000..3bc1b059272
--- /dev/null
+++ b/spec/frontend/__helpers__/dom_shims/clipboard.js
@@ -0,0 +1,5 @@
+Object.defineProperty(navigator, 'clipboard', {
+ value: {
+ writeText: () => {},
+ },
+});
diff --git a/spec/frontend/__helpers__/dom_shims/index.js b/spec/frontend/__helpers__/dom_shims/index.js
index 9b70cb86b8b..742d55196b4 100644
--- a/spec/frontend/__helpers__/dom_shims/index.js
+++ b/spec/frontend/__helpers__/dom_shims/index.js
@@ -1,3 +1,4 @@
+import './clipboard';
import './create_object_url';
import './element_scroll_into_view';
import './element_scroll_by';
diff --git a/spec/frontend/__helpers__/fixtures.js b/spec/frontend/__helpers__/fixtures.js
index d8054d32fae..a6f7b37161e 100644
--- a/spec/frontend/__helpers__/fixtures.js
+++ b/spec/frontend/__helpers__/fixtures.js
@@ -20,24 +20,15 @@ Did you run bin/rake frontend:fixtures?`,
return fs.readFileSync(absolutePath, 'utf8');
}
-/**
- * @deprecated Use `import` to load a JSON fixture instead.
- * See https://docs.gitlab.com/ee/development/testing_guide/frontend_testing.html#use-fixtures,
- * https://gitlab.com/gitlab-org/gitlab/-/issues/339346.
- */
-export const getJSONFixture = (relativePath) => JSON.parse(getFixture(relativePath));
-
export const resetHTMLFixture = () => {
document.head.innerHTML = '';
document.body.innerHTML = '';
};
-export const setHTMLFixture = (htmlContent, resetHook = afterEach) => {
+export const setHTMLFixture = (htmlContent) => {
document.body.innerHTML = htmlContent;
- resetHook(resetHTMLFixture);
};
-export const loadHTMLFixture = (relativePath, resetHook = afterEach) => {
- const fileContent = getFixture(relativePath);
- setHTMLFixture(fileContent, resetHook);
+export const loadHTMLFixture = (relativePath) => {
+ setHTMLFixture(getFixture(relativePath));
};
diff --git a/spec/frontend/__helpers__/flush_promises.js b/spec/frontend/__helpers__/flush_promises.js
deleted file mode 100644
index eefc2ed7c17..00000000000
--- a/spec/frontend/__helpers__/flush_promises.js
+++ /dev/null
@@ -1,4 +0,0 @@
-export default function flushPromises() {
- // eslint-disable-next-line no-restricted-syntax
- return new Promise(setImmediate);
-}
diff --git a/spec/frontend/__helpers__/shared_test_setup.js b/spec/frontend/__helpers__/shared_test_setup.js
index 7b5df18ee0f..011e1142c76 100644
--- a/spec/frontend/__helpers__/shared_test_setup.js
+++ b/spec/frontend/__helpers__/shared_test_setup.js
@@ -6,7 +6,6 @@ import 'jquery';
import Translate from '~/vue_shared/translate';
import setWindowLocation from './set_window_location_helper';
import { setGlobalDateToFakeDate } from './fake_date';
-import { loadHTMLFixture, setHTMLFixture } from './fixtures';
import { TEST_HOST } from './test_constants';
import * as customMatchers from './matchers';
@@ -28,12 +27,6 @@ Vue.config.productionTip = false;
Vue.use(Translate);
-// convenience wrapper for migration from Karma
-Object.assign(global, {
- loadFixtures: loadHTMLFixture,
- setFixtures: setHTMLFixture,
-});
-
const JQUERY_MATCHERS_TO_EXCLUDE = ['toHaveLength', 'toExist'];
// custom-jquery-matchers was written for an old Jest version, we need to make it compatible
diff --git a/spec/frontend/__helpers__/user_mock_data_helper.js b/spec/frontend/__helpers__/user_mock_data_helper.js
index db747283d9e..29ce95a88e2 100644
--- a/spec/frontend/__helpers__/user_mock_data_helper.js
+++ b/spec/frontend/__helpers__/user_mock_data_helper.js
@@ -15,7 +15,7 @@ export default {
id: id + 1,
name: getRandomString(),
username: getRandomString(),
- user_path: getRandomUrl(),
+ web_url: getRandomUrl(),
});
id += 1;
diff --git a/spec/frontend/__helpers__/vuex_action_helper.js b/spec/frontend/__helpers__/vuex_action_helper.js
index 95a811d0385..ab2637d6024 100644
--- a/spec/frontend/__helpers__/vuex_action_helper.js
+++ b/spec/frontend/__helpers__/vuex_action_helper.js
@@ -1,5 +1,3 @@
-const noop = () => {};
-
/**
* Helper for testing action with expected mutations inspired in
* https://vuex.vuejs.org/en/testing.html
@@ -9,7 +7,6 @@ const noop = () => {};
* @param {Object} state will be provided to the action
* @param {Array} [expectedMutations=[]] mutations expected to be committed
* @param {Array} [expectedActions=[]] actions expected to be dispatched
- * @param {Function} [done=noop] to be executed after the tests
* @return {Promise}
*
* @example
@@ -27,20 +24,9 @@ const noop = () => {};
* { type: 'actionName', payload: {param: 'foobar'}},
* { type: 'actionName1'}
* ]
- * done,
* );
*
* @example
- * testAction(
- * actions.actionName, // action
- * { }, // mocked payload
- * state, //state
- * [ { type: types.MUTATION} ], // expected mutations
- * [], // expected actions
- * ).then(done)
- * .catch(done.fail);
- *
- * @example
* await testAction({
* action: actions.actionName,
* payload: { deleteListId: 1 },
@@ -56,24 +42,15 @@ export default (
stateArg,
expectedMutationsArg = [],
expectedActionsArg = [],
- doneArg = noop,
) => {
let action = actionArg;
let payload = payloadArg;
let state = stateArg;
let expectedMutations = expectedMutationsArg;
let expectedActions = expectedActionsArg;
- let done = doneArg;
if (typeof actionArg !== 'function') {
- ({
- action,
- payload,
- state,
- expectedMutations = [],
- expectedActions = [],
- done = noop,
- } = actionArg);
+ ({ action, payload, state, expectedMutations = [], expectedActions = [] } = actionArg);
}
const mutations = [];
@@ -109,7 +86,6 @@ export default (
mutations: expectedMutations,
actions: expectedActions,
});
- done();
};
const result = action(
@@ -117,8 +93,13 @@ export default (
payload,
);
- // eslint-disable-next-line no-restricted-syntax
- return (result || new Promise((resolve) => setImmediate(resolve)))
+ return (
+ result ||
+ new Promise((resolve) => {
+ // eslint-disable-next-line no-restricted-syntax
+ setImmediate(resolve);
+ })
+ )
.catch((error) => {
validateResults();
throw error;
diff --git a/spec/frontend/__helpers__/vuex_action_helper_spec.js b/spec/frontend/__helpers__/vuex_action_helper_spec.js
index b4f5a291774..5bb2b3b26e2 100644
--- a/spec/frontend/__helpers__/vuex_action_helper_spec.js
+++ b/spec/frontend/__helpers__/vuex_action_helper_spec.js
@@ -4,8 +4,8 @@ import axios from '~/lib/utils/axios_utils';
import testActionFn from './vuex_action_helper';
const testActionFnWithOptionsArg = (...args) => {
- const [action, payload, state, expectedMutations, expectedActions, done] = args;
- return testActionFn({ action, payload, state, expectedMutations, expectedActions, done });
+ const [action, payload, state, expectedMutations, expectedActions] = args;
+ return testActionFn({ action, payload, state, expectedMutations, expectedActions });
};
describe.each([testActionFn, testActionFnWithOptionsArg])(
@@ -14,7 +14,6 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
let originalExpect;
let assertion;
let mock;
- const noop = () => {};
beforeEach(() => {
mock = new MockAdapter(axios);
@@ -48,7 +47,7 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
assertion = { mutations: [], actions: [] };
- testAction(action, examplePayload, exampleState);
+ return testAction(action, examplePayload, exampleState);
});
describe('given a sync action', () => {
@@ -59,7 +58,7 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
assertion = { mutations: [{ type: 'MUTATION' }], actions: [] };
- testAction(action, null, {}, assertion.mutations, assertion.actions, noop);
+ return testAction(action, null, {}, assertion.mutations, assertion.actions);
});
it('mocks dispatching actions', () => {
@@ -69,26 +68,21 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
assertion = { actions: [{ type: 'ACTION' }], mutations: [] };
- testAction(action, null, {}, assertion.mutations, assertion.actions, noop);
+ return testAction(action, null, {}, assertion.mutations, assertion.actions);
});
- it('works with done callback once finished', (done) => {
+ it('returns a promise', () => {
assertion = { mutations: [], actions: [] };
- testAction(noop, null, {}, assertion.mutations, assertion.actions, done);
- });
+ const promise = testAction(() => {}, null, {}, assertion.mutations, assertion.actions);
- it('returns a promise', (done) => {
- assertion = { mutations: [], actions: [] };
+ originalExpect(promise instanceof Promise).toBeTruthy();
- testAction(noop, null, {}, assertion.mutations, assertion.actions)
- .then(done)
- .catch(done.fail);
+ return promise;
});
});
describe('given an async action (returning a promise)', () => {
- let lastError;
const data = { FOO: 'BAR' };
const asyncAction = ({ commit, dispatch }) => {
@@ -98,7 +92,6 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
.get(TEST_HOST)
.catch((error) => {
commit('ERROR');
- lastError = error;
throw error;
})
.then(() => {
@@ -107,46 +100,26 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
});
};
- beforeEach(() => {
- lastError = null;
- });
-
- it('works with done callback once finished', (done) => {
+ it('returns original data of successful promise while checking actions/mutations', async () => {
mock.onGet(TEST_HOST).replyOnce(200, 42);
assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
- testAction(asyncAction, null, {}, assertion.mutations, assertion.actions, done);
+ const res = await testAction(asyncAction, null, {}, assertion.mutations, assertion.actions);
+ originalExpect(res).toEqual(data);
});
- it('returns original data of successful promise while checking actions/mutations', (done) => {
- mock.onGet(TEST_HOST).replyOnce(200, 42);
-
- assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
-
- testAction(asyncAction, null, {}, assertion.mutations, assertion.actions)
- .then((res) => {
- originalExpect(res).toEqual(data);
- done();
- })
- .catch(done.fail);
- });
-
- it('returns original error of rejected promise while checking actions/mutations', (done) => {
+ it('returns original error of rejected promise while checking actions/mutations', async () => {
mock.onGet(TEST_HOST).replyOnce(500, '');
assertion = { mutations: [{ type: 'ERROR' }], actions: [{ type: 'ACTION' }] };
- testAction(asyncAction, null, {}, assertion.mutations, assertion.actions)
- .then(done.fail)
- .catch((error) => {
- originalExpect(error).toBe(lastError);
- done();
- });
+ const err = testAction(asyncAction, null, {}, assertion.mutations, assertion.actions);
+ await originalExpect(err).rejects.toEqual(new Error('Request failed with status code 500'));
});
});
- it('works with async actions not returning promises', (done) => {
+ it('works with actions not returning promises', () => {
const data = { FOO: 'BAR' };
const asyncAction = ({ commit, dispatch }) => {
@@ -168,7 +141,7 @@ describe.each([testActionFn, testActionFnWithOptionsArg])(
assertion = { mutations: [{ type: 'SUCCESS' }], actions: [{ type: 'ACTION' }] };
- testAction(asyncAction, null, {}, assertion.mutations, assertion.actions, done);
+ return testAction(asyncAction, null, {}, assertion.mutations, assertion.actions);
});
},
);
diff --git a/spec/frontend/__helpers__/wait_for_promises.js b/spec/frontend/__helpers__/wait_for_promises.js
index 2fd1cc6ba0d..753c3c5d92b 100644
--- a/spec/frontend/__helpers__/wait_for_promises.js
+++ b/spec/frontend/__helpers__/wait_for_promises.js
@@ -1 +1,4 @@
-export default () => new Promise((resolve) => requestAnimationFrame(resolve));
+export default () =>
+ new Promise((resolve) => {
+ requestAnimationFrame(resolve);
+ });
diff --git a/spec/frontend/activities_spec.js b/spec/frontend/activities_spec.js
index 00519148b30..ebace21217a 100644
--- a/spec/frontend/activities_spec.js
+++ b/spec/frontend/activities_spec.js
@@ -1,6 +1,7 @@
/* eslint-disable no-unused-expressions, no-prototype-builtins, no-new, no-shadow */
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import Activities from '~/activities';
import Pager from '~/pager';
@@ -38,11 +39,15 @@ describe('Activities', () => {
}
beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
jest.spyOn(Pager, 'init').mockImplementation(() => {});
new Activities();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
for (let i = 0; i < filters.length; i += 1) {
((i) => {
describe(`when selecting ${getEventName(i)}`, () => {
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 82114077455..3fdbacb6efa 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
@@ -2,6 +2,7 @@
exports[`AddContextCommitsModal renders modal with 2 tabs 1`] = `
<gl-modal-stub
+ arialabel=""
body-class="add-review-item pt-0"
cancel-variant="light"
dismisslabel="Close"
diff --git a/spec/frontend/admin/applications/components/delete_application_spec.js b/spec/frontend/admin/applications/components/delete_application_spec.js
index 20119b64952..1a400a101b5 100644
--- a/spec/frontend/admin/applications/components/delete_application_spec.js
+++ b/spec/frontend/admin/applications/components/delete_application_spec.js
@@ -1,5 +1,6 @@
import { GlModal, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import DeleteApplication from '~/admin/applications/components/delete_application.vue';
const path = 'application/path/1';
@@ -22,7 +23,7 @@ describe('DeleteApplication', () => {
const findForm = () => wrapper.find('form');
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<button class="js-application-delete-button" data-path="${path}" data-name="${name}">Destroy</button>
`);
@@ -31,6 +32,7 @@ describe('DeleteApplication', () => {
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
describe('the modal component', () => {
diff --git a/spec/frontend/admin/background_migrations/components/database_listbox_spec.js b/spec/frontend/admin/background_migrations/components/database_listbox_spec.js
new file mode 100644
index 00000000000..3778943872e
--- /dev/null
+++ b/spec/frontend/admin/background_migrations/components/database_listbox_spec.js
@@ -0,0 +1,57 @@
+import { GlListbox } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import BackgroundMigrationsDatabaseListbox from '~/admin/background_migrations/components/database_listbox.vue';
+import { visitUrl, setUrlParams } from '~/lib/utils/url_utility';
+import { MOCK_DATABASES, MOCK_SELECTED_DATABASE } from '../mock_data';
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+ setUrlParams: jest.fn(),
+}));
+
+describe('BackgroundMigrationsDatabaseListbox', () => {
+ let wrapper;
+
+ const defaultProps = {
+ databases: MOCK_DATABASES,
+ selectedDatabase: MOCK_SELECTED_DATABASE,
+ };
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(BackgroundMigrationsDatabaseListbox, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ const findGlListbox = () => wrapper.findComponent(GlListbox);
+
+ describe('template always', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders GlListbox', () => {
+ expect(findGlListbox().exists()).toBe(true);
+ });
+ });
+
+ describe('actions', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('selecting a listbox item fires visitUrl with the database param', () => {
+ findGlListbox().vm.$emit('select', MOCK_DATABASES[1].value);
+
+ expect(setUrlParams).toHaveBeenCalledWith({ database: MOCK_DATABASES[1].value });
+ expect(visitUrl).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/frontend/admin/background_migrations/mock_data.js b/spec/frontend/admin/background_migrations/mock_data.js
new file mode 100644
index 00000000000..fbb1718f6b8
--- /dev/null
+++ b/spec/frontend/admin/background_migrations/mock_data.js
@@ -0,0 +1,6 @@
+export const MOCK_DATABASES = [
+ { value: 'main', text: 'main' },
+ { value: 'ci', text: 'ci' },
+];
+
+export const MOCK_SELECTED_DATABASE = 'main';
diff --git a/spec/frontend/admin/users/new_spec.js b/spec/frontend/admin/users/new_spec.js
index 692c583dca8..5e5763822a8 100644
--- a/spec/frontend/admin/users/new_spec.js
+++ b/spec/frontend/admin/users/new_spec.js
@@ -4,6 +4,7 @@ import {
ID_USER_EXTERNAL,
ID_WARNING,
} from '~/admin/users/new';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
describe('admin/users/new', () => {
const FIXTURE = 'admin/users/new_with_internal_user_regex.html';
@@ -13,7 +14,7 @@ describe('admin/users/new', () => {
let elWarningMessage;
beforeEach(() => {
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
setupInternalUserRegexHandler();
elExternal = document.getElementById(ID_USER_EXTERNAL);
@@ -23,6 +24,10 @@ describe('admin/users/new', () => {
elExternal.checked = true;
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const changeEmail = (val) => {
elUserEmail.value = val;
elUserEmail.dispatchEvent(new Event('input'));
diff --git a/spec/frontend/alert_handler_spec.js b/spec/frontend/alert_handler_spec.js
index 228053b1b2b..ba8e5bcb202 100644
--- a/spec/frontend/alert_handler_spec.js
+++ b/spec/frontend/alert_handler_spec.js
@@ -1,4 +1,4 @@
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initAlertHandler from '~/alert_handler';
describe('Alert Handler', () => {
@@ -25,6 +25,10 @@ describe('Alert Handler', () => {
initAlertHandler();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should render the alert', () => {
expect(findFirstAlert()).not.toBe(null);
});
@@ -41,6 +45,10 @@ describe('Alert Handler', () => {
initAlertHandler();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should render two alerts', () => {
expect(findAllAlerts()).toHaveLength(2);
});
@@ -57,6 +65,10 @@ describe('Alert Handler', () => {
initAlertHandler();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should render the banner', () => {
expect(findFirstBanner()).not.toBe(null);
});
@@ -78,6 +90,10 @@ describe('Alert Handler', () => {
initAlertHandler();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should render the banner', () => {
expect(findFirstAlert()).not.toBe(null);
});
diff --git a/spec/frontend/analytics/shared/components/metric_popover_spec.js b/spec/frontend/analytics/shared/components/metric_popover_spec.js
index b799c911488..ffec77c2708 100644
--- a/spec/frontend/analytics/shared/components/metric_popover_spec.js
+++ b/spec/frontend/analytics/shared/components/metric_popover_spec.js
@@ -6,7 +6,7 @@ const MOCK_METRIC = {
key: 'deployment-frequency',
label: 'Deployment Frequency',
value: '10.0',
- unit: 'per day',
+ unit: '/day',
description: 'Average number of deployments to production per day.',
links: [],
};
diff --git a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
index 386fb4eb616..69918c1db65 100644
--- a/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
+++ b/spec/frontend/analytics/shared/components/projects_dropdown_filter_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
+import { GlDropdown, GlDropdownItem, GlTruncate } from '@gitlab/ui';
import { nextTick } from 'vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { stubComponent } from 'helpers/stub_component';
@@ -76,8 +76,8 @@ describe('ProjectsDropdownFilter component', () => {
const findHighlightedItems = () => wrapper.findByTestId('vsa-highlighted-items');
const findUnhighlightedItems = () => wrapper.findByTestId('vsa-default-items');
- const findHighlightedItemsTitle = () => wrapper.findByText('Selected');
const findClearAllButton = () => wrapper.findByText('Clear all');
+ const findSelectedProjectsLabel = () => wrapper.findComponent(GlTruncate);
const findDropdown = () => wrapper.find(GlDropdown);
@@ -158,8 +158,8 @@ describe('ProjectsDropdownFilter component', () => {
expect(findSelectedDropdownItems().length).toBe(0);
});
- it('does not render the highlighted items title', () => {
- expect(findHighlightedItemsTitle().exists()).toBe(false);
+ it('renders the default project label text', () => {
+ expect(findSelectedProjectsLabel().text()).toBe('Select projects');
});
it('does not render the clear all button', () => {
@@ -180,7 +180,7 @@ describe('ProjectsDropdownFilter component', () => {
});
it('renders the highlighted items title', () => {
- expect(findHighlightedItemsTitle().exists()).toBe(true);
+ expect(findSelectedProjectsLabel().text()).toBe(projects[0].name);
});
it('renders the clear all button', () => {
@@ -190,13 +190,12 @@ describe('ProjectsDropdownFilter component', () => {
it('clears all selected items when the clear all button is clicked', async () => {
await selectDropdownItemAtIndex(1);
- expect(wrapper.text()).toContain('2 projects selected');
+ expect(findSelectedProjectsLabel().text()).toBe('2 projects selected');
findClearAllButton().trigger('click');
await nextTick();
- expect(wrapper.text()).not.toContain('2 projects selected');
- expect(wrapper.text()).toContain('Select projects');
+ expect(findSelectedProjectsLabel().text()).toBe('Select projects');
});
});
});
diff --git a/spec/frontend/api/tags_api_spec.js b/spec/frontend/api/tags_api_spec.js
new file mode 100644
index 00000000000..a7436bf6a50
--- /dev/null
+++ b/spec/frontend/api/tags_api_spec.js
@@ -0,0 +1,37 @@
+import MockAdapter from 'axios-mock-adapter';
+import * as tagsApi from '~/api/tags_api';
+import axios from '~/lib/utils/axios_utils';
+import httpStatus from '~/lib/utils/http_status';
+
+describe('~/api/tags_api.js', () => {
+ let mock;
+ let originalGon;
+
+ const projectId = 1;
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+
+ originalGon = window.gon;
+ window.gon = { api_version: 'v7' };
+ });
+
+ afterEach(() => {
+ mock.restore();
+ window.gon = originalGon;
+ });
+
+ describe('getTag', () => {
+ it('fetches a tag of a given tag name of a particular project', () => {
+ const tagName = 'tag-name';
+ const expectedUrl = `/api/v7/projects/${projectId}/repository/tags/${tagName}`;
+ mock.onGet(expectedUrl).reply(httpStatus.OK, {
+ name: tagName,
+ });
+
+ return tagsApi.getTag(projectId, tagName).then(({ data }) => {
+ expect(data.name).toBe(tagName);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/api/user_api_spec.js b/spec/frontend/api/user_api_spec.js
new file mode 100644
index 00000000000..ee7194bdf5f
--- /dev/null
+++ b/spec/frontend/api/user_api_spec.js
@@ -0,0 +1,50 @@
+import MockAdapter from 'axios-mock-adapter';
+
+import { followUser, unfollowUser } from '~/api/user_api';
+import axios from '~/lib/utils/axios_utils';
+
+describe('~/api/user_api', () => {
+ let axiosMock;
+ let originalGon;
+
+ beforeEach(() => {
+ axiosMock = new MockAdapter(axios);
+
+ originalGon = window.gon;
+ window.gon = { api_version: 'v4' };
+ });
+
+ afterEach(() => {
+ axiosMock.restore();
+ axiosMock.resetHistory();
+ window.gon = originalGon;
+ });
+
+ describe('followUser', () => {
+ it('calls correct URL and returns expected response', async () => {
+ const expectedUrl = '/api/v4/users/1/follow';
+ const expectedResponse = { message: 'Success' };
+
+ axiosMock.onPost(expectedUrl).replyOnce(200, expectedResponse);
+
+ await expect(followUser(1)).resolves.toEqual(
+ expect.objectContaining({ data: expectedResponse }),
+ );
+ expect(axiosMock.history.post[0].url).toBe(expectedUrl);
+ });
+ });
+
+ describe('unfollowUser', () => {
+ it('calls correct URL and returns expected response', async () => {
+ const expectedUrl = '/api/v4/users/1/unfollow';
+ const expectedResponse = { message: 'Success' };
+
+ axiosMock.onPost(expectedUrl).replyOnce(200, expectedResponse);
+
+ await expect(unfollowUser(1)).resolves.toEqual(
+ expect.objectContaining({ data: expectedResponse }),
+ );
+ expect(axiosMock.history.post[0].url).toBe(expectedUrl);
+ });
+ });
+});
diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js
index 85332bf21d8..5f162f498c4 100644
--- a/spec/frontend/api_spec.js
+++ b/spec/frontend/api_spec.js
@@ -1593,6 +1593,38 @@ describe('Api', () => {
});
});
+ describe('uploadProjectSecureFile', () => {
+ it('uploads a secure file to a project', async () => {
+ const projectId = 1;
+ const secureFile = {
+ id: projectId,
+ title: 'File Name',
+ permissions: 'read_only',
+ checksum: '12345',
+ checksum_algorithm: 'sha256',
+ created_at: '2022-02-21T15:27:18',
+ };
+
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/secure_files`;
+ mock.onPost(expectedUrl).reply(httpStatus.OK, secureFile);
+ const { data } = await Api.uploadProjectSecureFile(projectId, 'some data');
+
+ expect(data).toEqual(secureFile);
+ });
+ });
+
+ describe('deleteProjectSecureFile', () => {
+ it('removes a secure file from a project', async () => {
+ const projectId = 1;
+ const secureFileId = 2;
+
+ const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${projectId}/secure_files/${secureFileId}`;
+ mock.onDelete(expectedUrl).reply(httpStatus.NO_CONTENT, '');
+ const { data } = await Api.deleteProjectSecureFile(projectId, secureFileId);
+ expect(data).toEqual('');
+ });
+ });
+
describe('dependency proxy cache', () => {
it('schedules the cache list for deletion', async () => {
const groupId = 1;
diff --git a/spec/frontend/attention_requests/components/navigation_popover_spec.js b/spec/frontend/attention_requests/components/navigation_popover_spec.js
index d0231afbdc4..e4d53d5dbdb 100644
--- a/spec/frontend/attention_requests/components/navigation_popover_spec.js
+++ b/spec/frontend/attention_requests/components/navigation_popover_spec.js
@@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils';
import { GlPopover, GlButton, GlSprintf, GlIcon } from '@gitlab/ui';
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
import NavigationPopover from '~/attention_requests/components/navigation_popover.vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
let wrapper;
@@ -29,13 +30,14 @@ function createComponent(provideData = {}, shouldShowCallout = true) {
describe('Attention requests navigation popover', () => {
beforeEach(() => {
- setFixtures('<div><div class="js-test-popover"></div><div class="js-test"></div></div>');
+ setHTMLFixture('<div><div class="js-test-popover"></div><div class="js-test"></div></div>');
dismiss = jest.fn();
});
afterEach(() => {
wrapper.destroy();
wrapper = null;
+ resetHTMLFixture();
});
it('hides popover if callout is disabled', () => {
diff --git a/spec/frontend/authentication/u2f/authenticate_spec.js b/spec/frontend/authentication/u2f/authenticate_spec.js
index 31782899ce4..3ae7fcf1c49 100644
--- a/spec/frontend/authentication/u2f/authenticate_spec.js
+++ b/spec/frontend/authentication/u2f/authenticate_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import U2FAuthenticate from '~/authentication/u2f/authenticate';
import 'vendor/u2f';
import MockU2FDevice from './mock_u2f_device';
@@ -9,7 +10,7 @@ describe('U2FAuthenticate', () => {
let component;
beforeEach(() => {
- loadFixtures('u2f/authenticate.html');
+ loadHTMLFixture('u2f/authenticate.html');
u2fDevice = new MockU2FDevice();
container = $('#js-authenticate-token-2fa');
component = new U2FAuthenticate(
@@ -23,6 +24,10 @@ describe('U2FAuthenticate', () => {
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('with u2f unavailable', () => {
let oldu2f;
diff --git a/spec/frontend/authentication/u2f/register_spec.js b/spec/frontend/authentication/u2f/register_spec.js
index 810396aa9fd..7ae3a2734cb 100644
--- a/spec/frontend/authentication/u2f/register_spec.js
+++ b/spec/frontend/authentication/u2f/register_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import U2FRegister from '~/authentication/u2f/register';
import 'vendor/u2f';
import MockU2FDevice from './mock_u2f_device';
@@ -9,13 +10,17 @@ describe('U2FRegister', () => {
let component;
beforeEach(() => {
- loadFixtures('u2f/register.html');
+ loadHTMLFixture('u2f/register.html');
u2fDevice = new MockU2FDevice();
container = $('#js-register-token-2fa');
component = new U2FRegister(container, {});
return component.start();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('allows registering a U2F device', () => {
const setupButton = container.find('#js-setup-token-2fa-device');
diff --git a/spec/frontend/authentication/webauthn/authenticate_spec.js b/spec/frontend/authentication/webauthn/authenticate_spec.js
index 8b27560bbbe..b1f4e43e56d 100644
--- a/spec/frontend/authentication/webauthn/authenticate_spec.js
+++ b/spec/frontend/authentication/webauthn/authenticate_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import WebAuthnAuthenticate from '~/authentication/webauthn/authenticate';
import MockWebAuthnDevice from './mock_webauthn_device';
@@ -34,7 +35,7 @@ describe('WebAuthnAuthenticate', () => {
};
beforeEach(() => {
- loadFixtures('webauthn/authenticate.html');
+ loadHTMLFixture('webauthn/authenticate.html');
fallbackElement = document.createElement('div');
fallbackElement.classList.add('js-2fa-form');
webAuthnDevice = new MockWebAuthnDevice();
@@ -62,6 +63,10 @@ describe('WebAuthnAuthenticate', () => {
submitSpy = jest.spyOn(HTMLFormElement.prototype, 'submit');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('with webauthn unavailable', () => {
let oldGetCredentials;
diff --git a/spec/frontend/authentication/webauthn/register_spec.js b/spec/frontend/authentication/webauthn/register_spec.js
index 0f8ea2b635f..95cb993fc70 100644
--- a/spec/frontend/authentication/webauthn/register_spec.js
+++ b/spec/frontend/authentication/webauthn/register_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import setWindowLocation from 'helpers/set_window_location_helper';
import waitForPromises from 'helpers/wait_for_promises';
import WebAuthnRegister from '~/authentication/webauthn/register';
@@ -23,7 +24,7 @@ describe('WebAuthnRegister', () => {
let component;
beforeEach(() => {
- loadFixtures('webauthn/register.html');
+ loadHTMLFixture('webauthn/register.html');
webAuthnDevice = new MockWebAuthnDevice();
container = $('#js-register-token-2fa');
component = new WebAuthnRegister(container, {
@@ -41,6 +42,10 @@ describe('WebAuthnRegister', () => {
component.start();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const findSetupButton = () => container.find('#js-setup-token-2fa-device');
const findMessage = () => container.find('p');
const findDeviceResponse = () => container.find('#js-device-response');
diff --git a/spec/frontend/awards_handler_spec.js b/spec/frontend/awards_handler_spec.js
index c4002ec11f3..5d657745615 100644
--- a/spec/frontend/awards_handler_spec.js
+++ b/spec/frontend/awards_handler_spec.js
@@ -1,5 +1,6 @@
import $ from 'jquery';
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { initEmojiMock, clearEmojiMock } from 'helpers/emoji';
import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
import loadAwardsHandler from '~/awards_handler';
@@ -75,7 +76,7 @@ describe('AwardsHandler', () => {
beforeEach(async () => {
await initEmojiMock(emojiData);
- loadFixtures('snippets/show.html');
+ loadHTMLFixture('snippets/show.html');
awardsHandler = await loadAwardsHandler(true);
jest.spyOn(awardsHandler, 'postEmoji').mockImplementation((button, url, emoji, cb) => cb());
@@ -91,6 +92,8 @@ describe('AwardsHandler', () => {
$('body').removeAttr('data-page');
awardsHandler.destroy();
+
+ resetHTMLFixture();
});
describe('::showEmojiMenu', () => {
diff --git a/spec/frontend/badges/components/badge_form_spec.js b/spec/frontend/badges/components/badge_form_spec.js
index ba2ec775b61..6d8a00eb50b 100644
--- a/spec/frontend/badges/components/badge_form_spec.js
+++ b/spec/frontend/badges/components/badge_form_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { DUMMY_IMAGE_URL, TEST_HOST } from 'helpers/test_constants';
import { mountComponentWithStore } from 'helpers/vue_mount_component_helper';
import BadgeForm from '~/badges/components/badge_form.vue';
@@ -16,7 +17,7 @@ describe('BadgeForm component', () => {
let vm;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="dummy-element"></div>
`);
@@ -26,6 +27,7 @@ describe('BadgeForm component', () => {
afterEach(() => {
vm.$destroy();
axiosMock.restore();
+ resetHTMLFixture();
});
describe('methods', () => {
diff --git a/spec/frontend/badges/components/badge_list_row_spec.js b/spec/frontend/badges/components/badge_list_row_spec.js
index 0fb0fa86a02..ad8426f3168 100644
--- a/spec/frontend/badges/components/badge_list_row_spec.js
+++ b/spec/frontend/badges/components/badge_list_row_spec.js
@@ -1,4 +1,5 @@
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { mountComponentWithStore } from 'helpers/vue_mount_component_helper';
import BadgeListRow from '~/badges/components/badge_list_row.vue';
import { GROUP_BADGE, PROJECT_BADGE } from '~/badges/constants';
@@ -11,7 +12,7 @@ describe('BadgeListRow component', () => {
let vm;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="delete-badge-modal" class="modal"></div>
<div id="dummy-element"></div>
`);
@@ -29,6 +30,7 @@ describe('BadgeListRow component', () => {
afterEach(() => {
vm.$destroy();
+ resetHTMLFixture();
});
it('renders the badge', () => {
diff --git a/spec/frontend/badges/components/badge_list_spec.js b/spec/frontend/badges/components/badge_list_spec.js
index 39fa502b207..32cd9483ef8 100644
--- a/spec/frontend/badges/components/badge_list_spec.js
+++ b/spec/frontend/badges/components/badge_list_spec.js
@@ -1,4 +1,5 @@
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { mountComponentWithStore } from 'helpers/vue_mount_component_helper';
import BadgeList from '~/badges/components/badge_list.vue';
import { GROUP_BADGE, PROJECT_BADGE } from '~/badges/constants';
@@ -11,7 +12,7 @@ describe('BadgeList component', () => {
let vm;
beforeEach(() => {
- setFixtures('<div id="dummy-element"></div>');
+ setHTMLFixture('<div id="dummy-element"></div>');
const badges = [];
for (let id = 0; id < numberOfDummyBadges; id += 1) {
badges.push({ id, ...createDummyBadge() });
@@ -34,6 +35,7 @@ describe('BadgeList component', () => {
afterEach(() => {
vm.$destroy();
+ resetHTMLFixture();
});
it('renders a header with the badge count', () => {
diff --git a/spec/frontend/badges/components/badge_spec.js b/spec/frontend/badges/components/badge_spec.js
index fe4cf8ce8eb..19b3a9f23a6 100644
--- a/spec/frontend/badges/components/badge_spec.js
+++ b/spec/frontend/badges/components/badge_spec.js
@@ -1,4 +1,5 @@
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import mountComponent from 'helpers/vue_mount_component_helper';
import { DUMMY_IMAGE_URL, TEST_HOST } from 'spec/test_constants';
import Badge from '~/badges/components/badge.vue';
@@ -90,10 +91,14 @@ describe('Badge component', () => {
describe('behavior', () => {
beforeEach(() => {
- setFixtures('<div id="dummy-element"></div>');
+ setHTMLFixture('<div id="dummy-element"></div>');
return createComponent({ ...dummyProps }, '#dummy-element');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('shows a badge image after loading', () => {
expect(vm.isLoading).toBe(false);
expect(vm.hasError).toBe(false);
diff --git a/spec/frontend/badges/store/actions_spec.js b/spec/frontend/badges/store/actions_spec.js
index 02e1b8e65e4..b799273ff63 100644
--- a/spec/frontend/badges/store/actions_spec.js
+++ b/spec/frontend/badges/store/actions_spec.js
@@ -371,10 +371,8 @@ describe('Badges store actions', () => {
const url = axios.get.mock.calls[0][0];
expect(url).toMatch(new RegExp(`^${dummyEndpointUrl}/render?`));
- expect(url).toMatch(
- new RegExp('\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&'),
- );
- expect(url).toMatch(new RegExp('&image_url=%26make-sandwich%3Dtrue$'));
+ expect(url).toMatch(/\\?link_url=%3Cscript%3EI%20am%20dangerous!%3C%2Fscript%3E&/);
+ expect(url).toMatch(/&image_url=%26make-sandwich%3Dtrue$/);
});
it('dispatches requestRenderedBadge and receiveRenderedBadge for successful response', async () => {
diff --git a/spec/frontend/behaviors/autosize_spec.js b/spec/frontend/behaviors/autosize_spec.js
index a9dbee7fd08..7008b7b2eb6 100644
--- a/spec/frontend/behaviors/autosize_spec.js
+++ b/spec/frontend/behaviors/autosize_spec.js
@@ -1,4 +1,5 @@
import '~/behaviors/autosize';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
jest.mock('~/helpers/startup_css_helper', () => {
return {
@@ -20,19 +21,22 @@ jest.mock('~/helpers/startup_css_helper', () => {
describe('Autosize behavior', () => {
beforeEach(() => {
- setFixtures('<textarea class="js-autosize"></textarea>');
+ setHTMLFixture('<textarea class="js-autosize"></textarea>');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('is applied to the textarea', () => {
// This is the second part of the Hack:
// Because we are forcing the mock for WaitForCSSLoaded and the very end of our callstack
// to call its callback. This querySelector needs to go to the very end of our callstack
- // as well, if we would not have this setTimeout Function here, the querySelector
- // would run before the mockImplementation called its callBack Function
- // the DOM Manipulation didn't happen yet and the test would fail.
- setTimeout(() => {
- const textarea = document.querySelector('textarea');
- expect(textarea.classList).toContain('js-autosize-initialized');
- }, 0);
+ // as well, if we would not have this jest.runOnlyPendingTimers here, the querySelector
+ // would not run and the test would fail.
+ jest.runOnlyPendingTimers();
+
+ const textarea = document.querySelector('textarea');
+ expect(textarea.classList).toContain('js-autosize-initialized');
});
});
diff --git a/spec/frontend/behaviors/copy_as_gfm_spec.js b/spec/frontend/behaviors/copy_as_gfm_spec.js
index c96db09cc76..2032faa1c33 100644
--- a/spec/frontend/behaviors/copy_as_gfm_spec.js
+++ b/spec/frontend/behaviors/copy_as_gfm_spec.js
@@ -8,6 +8,9 @@ describe('CopyAsGFM', () => {
beforeEach(() => {
target = document.createElement('input');
target.value = 'This is code: ';
+
+ // needed for the underlying insertText to work
+ document.execCommand = jest.fn(() => false);
});
// When GFM code is copied, we put the regular plain text
diff --git a/spec/frontend/behaviors/date_picker_spec.js b/spec/frontend/behaviors/date_picker_spec.js
index 9f7701a0366..363052ad7fb 100644
--- a/spec/frontend/behaviors/date_picker_spec.js
+++ b/spec/frontend/behaviors/date_picker_spec.js
@@ -1,4 +1,5 @@
import * as Pikaday from 'pikaday';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initDatePickers from '~/behaviors/date_picker';
import * as utils from '~/lib/utils/datetime_utility';
@@ -12,7 +13,7 @@ describe('date_picker behavior', () => {
beforeEach(() => {
pikadayMock = jest.spyOn(Pikaday, 'default');
parseMock = jest.spyOn(utils, 'parsePikadayDate');
- setFixtures(`
+ setHTMLFixture(`
<div>
<input class="datepicker" value="2020-10-01" />
</div>
@@ -21,6 +22,10 @@ describe('date_picker behavior', () => {
</div>`);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('Instantiates Pickaday for every instance of a .datepicker class', () => {
initDatePickers();
diff --git a/spec/frontend/behaviors/load_startup_css_spec.js b/spec/frontend/behaviors/load_startup_css_spec.js
index 59f49585645..e9e4c06732f 100644
--- a/spec/frontend/behaviors/load_startup_css_spec.js
+++ b/spec/frontend/behaviors/load_startup_css_spec.js
@@ -1,4 +1,4 @@
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { loadStartupCSS } from '~/behaviors/load_startup_css';
describe('behaviors/load_startup_css', () => {
@@ -25,6 +25,10 @@ describe('behaviors/load_startup_css', () => {
loadStartupCSS();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('does nothing at first', () => {
expect(loadListener).not.toHaveBeenCalled();
});
diff --git a/spec/frontend/behaviors/markdown/highlight_current_user_spec.js b/spec/frontend/behaviors/markdown/highlight_current_user_spec.js
index 3305ddc412d..38d19ac3808 100644
--- a/spec/frontend/behaviors/markdown/highlight_current_user_spec.js
+++ b/spec/frontend/behaviors/markdown/highlight_current_user_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import highlightCurrentUser from '~/behaviors/markdown/highlight_current_user';
describe('highlightCurrentUser', () => {
@@ -5,7 +6,7 @@ describe('highlightCurrentUser', () => {
let elements;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="dummy-root-element">
<div data-user="1">@first</div>
<div data-user="2">@second</div>
@@ -15,6 +16,10 @@ describe('highlightCurrentUser', () => {
elements = rootElement.querySelectorAll('[data-user]');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('without current user', () => {
beforeEach(() => {
window.gon = window.gon || {};
diff --git a/spec/frontend/behaviors/markdown/render_sandboxed_mermaid_spec.js b/spec/frontend/behaviors/markdown/render_sandboxed_mermaid_spec.js
new file mode 100644
index 00000000000..2b9442162aa
--- /dev/null
+++ b/spec/frontend/behaviors/markdown/render_sandboxed_mermaid_spec.js
@@ -0,0 +1,34 @@
+import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import renderMermaid from '~/behaviors/markdown/render_sandboxed_mermaid';
+
+describe('Render mermaid diagrams for Gitlab Flavoured Markdown', () => {
+ it('Does something', () => {
+ document.body.dataset.page = '';
+ setHTMLFixture(`
+ <div class="gl-relative markdown-code-block js-markdown-code">
+ <pre data-sourcepos="1:1-7:3" class="code highlight js-syntax-highlight language-mermaid white" lang="mermaid" id="code-4">
+ <code class="js-render-mermaid">
+ <span id="LC1" class="line" lang="mermaid">graph TD;</span>
+ <span id="LC2" class="line" lang="mermaid">A--&gt;B</span>
+ <span id="LC3" class="line" lang="mermaid">A--&gt;C</span>
+ <span id="LC4" class="line" lang="mermaid">B--&gt;D</span>
+ <span id="LC5" class="line" lang="mermaid">C--&gt;D</span>
+ </code>
+ </pre>
+ <copy-code>
+ <button type="button" class="btn btn-default btn-md gl-button btn-icon has-tooltip" data-title="Copy to clipboard" data-clipboard-target="pre#code-4">
+ <svg><use xlink:href="/assets/icons-7f1680a3670112fe4c8ef57b9dfb93f0f61b43a2a479d7abd6c83bcb724b9201.svg#copy-to-clipboard"></use></svg>
+ </button>
+ </copy-code>
+ </div>`);
+ const els = $('pre.js-syntax-highlight').find('.js-render-mermaid');
+
+ renderMermaid(els);
+
+ jest.runAllTimers();
+ expect(document.querySelector('pre.js-syntax-highlight').classList).toContain('gl-sr-only');
+
+ resetHTMLFixture();
+ });
+});
diff --git a/spec/frontend/behaviors/quick_submit_spec.js b/spec/frontend/behaviors/quick_submit_spec.js
index 86a85831c6b..317c671cd2b 100644
--- a/spec/frontend/behaviors/quick_submit_spec.js
+++ b/spec/frontend/behaviors/quick_submit_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import '~/behaviors/quick_submit';
describe('Quick Submit behavior', () => {
@@ -7,7 +8,7 @@ describe('Quick Submit behavior', () => {
const keydownEvent = (options = { keyCode: 13, metaKey: true }) => $.Event('keydown', options);
beforeEach(() => {
- loadFixtures('snippets/show.html');
+ loadHTMLFixture('snippets/show.html');
testContext = {};
@@ -24,6 +25,10 @@ describe('Quick Submit behavior', () => {
testContext.textarea = $('.js-quick-submit textarea').first();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('does not respond to other keyCodes', () => {
testContext.textarea.trigger(
keydownEvent({
diff --git a/spec/frontend/behaviors/requires_input_spec.js b/spec/frontend/behaviors/requires_input_spec.js
index bb22133ae44..f2f68f17d1c 100644
--- a/spec/frontend/behaviors/requires_input_spec.js
+++ b/spec/frontend/behaviors/requires_input_spec.js
@@ -1,14 +1,19 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import '~/behaviors/requires_input';
describe('requiresInput', () => {
let submitButton;
beforeEach(() => {
- loadFixtures('branches/new_branch.html');
+ loadHTMLFixture('branches/new_branch.html');
submitButton = $('button[type="submit"]');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('disables submit when any field is required', () => {
$('.js-requires-input').requiresInput();
diff --git a/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js b/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
index e1811247124..e6e587ff44b 100644
--- a/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
+++ b/spec/frontend/behaviors/shortcuts/shortcuts_issuable_spec.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import Mousetrap from 'mousetrap';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import initCopyAsGFM, { CopyAsGFM } from '~/behaviors/markdown/copy_as_gfm';
import ShortcutsIssuable from '~/behaviors/shortcuts/shortcuts_issuable';
@@ -12,7 +12,6 @@ jest.mock('~/lib/utils/common_utils', () => ({
describe('ShortcutsIssuable', () => {
const snippetShowFixtureName = 'snippets/show.html';
- const mrShowFixtureName = 'merge_requests/merge_request_of_current_user.html';
beforeAll(() => {
initCopyAsGFM();
@@ -25,7 +24,7 @@ describe('ShortcutsIssuable', () => {
const FORM_SELECTOR = '.js-main-target-form .js-vue-comment-form';
beforeEach(() => {
- loadFixtures(snippetShowFixtureName);
+ loadHTMLFixture(snippetShowFixtureName);
$('body').append(
`<div class="js-main-target-form">
<textarea class="js-vue-comment-form"></textarea>
@@ -40,6 +39,7 @@ describe('ShortcutsIssuable', () => {
$(FORM_SELECTOR).remove();
delete window.shortcut;
+ resetHTMLFixture();
});
// Stub getSelectedFragment to return a node with the provided HTML.
@@ -280,55 +280,4 @@ describe('ShortcutsIssuable', () => {
});
});
});
-
- describe('copyBranchName', () => {
- let sidebarCollapsedBtn;
- let sidebarExpandedBtn;
-
- beforeEach(() => {
- loadFixtures(mrShowFixtureName);
-
- window.shortcut = new ShortcutsIssuable();
-
- [sidebarCollapsedBtn, sidebarExpandedBtn] = document.querySelectorAll(
- '.js-sidebar-source-branch button',
- );
-
- [sidebarCollapsedBtn, sidebarExpandedBtn].forEach((btn) => jest.spyOn(btn, 'click'));
- });
-
- afterEach(() => {
- delete window.shortcut;
- });
-
- describe('when the sidebar is expanded', () => {
- beforeEach(() => {
- // simulate the applied CSS styles when the
- // sidebar is expanded
- sidebarCollapsedBtn.style.display = 'none';
-
- Mousetrap.trigger('b');
- });
-
- it('clicks the "expanded" version of the copy source branch button', () => {
- expect(sidebarExpandedBtn.click).toHaveBeenCalled();
- expect(sidebarCollapsedBtn.click).not.toHaveBeenCalled();
- });
- });
-
- describe('when the sidebar is collapsed', () => {
- beforeEach(() => {
- // simulate the applied CSS styles when the
- // sidebar is collapsed
- sidebarExpandedBtn.style.display = 'none';
-
- Mousetrap.trigger('b');
- });
-
- it('clicks the "collapsed" version of the copy source branch button', () => {
- expect(sidebarCollapsedBtn.click).toHaveBeenCalled();
- expect(sidebarExpandedBtn.click).not.toHaveBeenCalled();
- });
- });
- });
});
diff --git a/spec/frontend/blob/blob_file_dropzone_spec.js b/spec/frontend/blob/blob_file_dropzone_spec.js
index 47c90030e18..d6fc824258b 100644
--- a/spec/frontend/blob/blob_file_dropzone_spec.js
+++ b/spec/frontend/blob/blob_file_dropzone_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import BlobFileDropzone from '~/blob/blob_file_dropzone';
describe('BlobFileDropzone', () => {
@@ -6,7 +7,7 @@ describe('BlobFileDropzone', () => {
let replaceFileButton;
beforeEach(() => {
- loadFixtures('blob/show.html');
+ loadHTMLFixture('blob/show.html');
const form = $('.js-upload-blob-form');
// eslint-disable-next-line no-new
new BlobFileDropzone(form, 'POST');
@@ -15,6 +16,10 @@ describe('BlobFileDropzone', () => {
replaceFileButton = $('#submit-all');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('submit button', () => {
it('requires file', () => {
jest.spyOn(window, 'alert').mockImplementation(() => {});
diff --git a/spec/frontend/blob/components/__snapshots__/blob_header_spec.js.snap b/spec/frontend/blob/components/__snapshots__/blob_header_spec.js.snap
index 5926836d9c1..b430dc15557 100644
--- a/spec/frontend/blob/components/__snapshots__/blob_header_spec.js.snap
+++ b/spec/frontend/blob/components/__snapshots__/blob_header_spec.js.snap
@@ -18,7 +18,7 @@ exports[`Blob Header Default Actions rendering matches the snapshot 1`] = `
</div>
<div
- class="gl-sm-display-flex file-actions"
+ class="gl-display-flex gl-flex-wrap file-actions"
>
<viewer-switcher-stub
docicon="document"
diff --git a/spec/frontend/blob/components/table_contents_spec.js b/spec/frontend/blob/components/table_contents_spec.js
index ade35d39b4f..358ac31819c 100644
--- a/spec/frontend/blob/components/table_contents_spec.js
+++ b/spec/frontend/blob/components/table_contents_spec.js
@@ -1,6 +1,7 @@
import { GlDropdownItem } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import TableContents from '~/blob/components/table_contents.vue';
let wrapper;
@@ -17,7 +18,7 @@ async function setLoaded(loaded) {
describe('Markdown table of contents component', () => {
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="blob-viewer" data-type="rich" data-loaded="false">
<h1><a href="#1"></a>Hello</h1>
<h2><a href="#2"></a>World</h2>
@@ -29,6 +30,7 @@ describe('Markdown table of contents component', () => {
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
describe('not loaded', () => {
diff --git a/spec/frontend/blob/file_template_mediator_spec.js b/spec/frontend/blob/file_template_mediator_spec.js
index 44e12deb564..907a3c97799 100644
--- a/spec/frontend/blob/file_template_mediator_spec.js
+++ b/spec/frontend/blob/file_template_mediator_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import TemplateSelectorMediator from '~/blob/file_template_mediator';
describe('Template Selector Mediator', () => {
@@ -11,7 +12,7 @@ describe('Template Selector Mediator', () => {
}))();
beforeEach(() => {
- setFixtures('<div class="file-editor"><input class="js-file-path-name-input" /></div>');
+ setHTMLFixture('<div class="file-editor"><input class="js-file-path-name-input" /></div>');
input = document.querySelector('.js-file-path-name-input');
mediator = new TemplateSelectorMediator({
editor,
@@ -20,6 +21,10 @@ describe('Template Selector Mediator', () => {
});
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('fills out the input field', () => {
expect(input.value).toBe('');
mediator.setFilename(newFileName);
diff --git a/spec/frontend/blob/file_template_selector_spec.js b/spec/frontend/blob/file_template_selector_spec.js
index 2ab3b3ebc82..65444e86efd 100644
--- a/spec/frontend/blob/file_template_selector_spec.js
+++ b/spec/frontend/blob/file_template_selector_spec.js
@@ -1,10 +1,11 @@
-import $ from 'jquery';
import FileTemplateSelector from '~/blob/file_template_selector';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
describe('FileTemplateSelector', () => {
let subject;
- let dropdown;
- let wrapper;
+
+ const dropdown = '.dropdown';
+ const wrapper = '.wrapper';
const createSubject = () => {
subject = new FileTemplateSelector({});
@@ -17,13 +18,16 @@ describe('FileTemplateSelector', () => {
afterEach(() => {
subject = null;
+ resetHTMLFixture();
});
describe('show method', () => {
beforeEach(() => {
- dropdown = document.createElement('div');
- wrapper = document.createElement('div');
- wrapper.classList.add('hidden');
+ setHTMLFixture(`
+ <div class="wrapper hidden">
+ <div class="dropdown"></div>
+ </div>
+ `);
createSubject();
});
@@ -37,25 +41,24 @@ describe('FileTemplateSelector', () => {
it('does not call init on subsequent calls', () => {
jest.spyOn(subject, 'init');
subject.show();
- subject.show();
expect(subject.init).toHaveBeenCalledTimes(1);
});
- it('removes hidden class from $wrapper', () => {
- expect($(wrapper).hasClass('hidden')).toBe(true);
+ it('removes hidden class from wrapper', () => {
+ subject.init();
+ expect(subject.wrapper.classList.contains('hidden')).toBe(true);
subject.show();
-
- expect($(wrapper).hasClass('hidden')).toBe(false);
+ expect(subject.wrapper.classList.contains('hidden')).toBe(false);
});
it('sets the focus on the dropdown', async () => {
subject.show();
- jest.spyOn(subject.$dropdown, 'focus');
+ jest.spyOn(subject.dropdown, 'focus');
jest.runAllTimers();
- expect(subject.$dropdown.focus).toHaveBeenCalled();
+ expect(subject.dropdown.focus).toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/blob/line_highlighter_spec.js b/spec/frontend/blob/line_highlighter_spec.js
index 330f1f3137e..21d4e8db503 100644
--- a/spec/frontend/blob/line_highlighter_spec.js
+++ b/spec/frontend/blob/line_highlighter_spec.js
@@ -1,6 +1,7 @@
/* eslint-disable no-return-assign, no-new, no-underscore-dangle */
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import LineHighlighter from '~/blob/line_highlighter';
import * as utils from '~/lib/utils/common_utils';
@@ -14,8 +15,9 @@ describe('LineHighlighter', () => {
const e = $.Event('click', eventData);
return $(`#L${number}`).trigger(e);
};
+
beforeEach(() => {
- loadFixtures('static/line_highlighter.html');
+ loadHTMLFixture('static/line_highlighter.html');
testContext.class = new LineHighlighter();
testContext.css = testContext.class.highlightLineClass;
return (testContext.spies = {
@@ -25,6 +27,10 @@ describe('LineHighlighter', () => {
});
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('behavior', () => {
it('highlights one line given in the URL hash', () => {
new LineHighlighter({ hash: '#L13' });
diff --git a/spec/frontend/blob/openapi/index_spec.js b/spec/frontend/blob/openapi/index_spec.js
new file mode 100644
index 00000000000..53220809f80
--- /dev/null
+++ b/spec/frontend/blob/openapi/index_spec.js
@@ -0,0 +1,28 @@
+import { SwaggerUIBundle } from 'swagger-ui-dist';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import renderOpenApi from '~/blob/openapi';
+
+jest.mock('swagger-ui-dist');
+
+describe('OpenAPI blob viewer', () => {
+ const id = 'js-openapi-viewer';
+ const mockEndpoint = 'some/endpoint';
+
+ beforeEach(() => {
+ setHTMLFixture(`<div id="${id}" data-endpoint="${mockEndpoint}"></div>`);
+ renderOpenApi();
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ it('initializes SwaggerUI with the correct configuration', () => {
+ expect(SwaggerUIBundle).toHaveBeenCalledWith({
+ url: mockEndpoint,
+ dom_id: `#${id}`,
+ deepLinking: true,
+ displayOperationId: true,
+ });
+ });
+});
diff --git a/spec/frontend/blob/pipeline_tour_success_modal_spec.js b/spec/frontend/blob/pipeline_tour_success_modal_spec.js
index f4af57de41f..750dd8f0a72 100644
--- a/spec/frontend/blob/pipeline_tour_success_modal_spec.js
+++ b/spec/frontend/blob/pipeline_tour_success_modal_spec.js
@@ -1,6 +1,6 @@
import { GlSprintf, GlModal, GlLink } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import { stubComponent } from 'helpers/stub_component';
import { mockTracking, triggerEvent, unmockTracking } from 'helpers/tracking_helper';
import pipelineTourSuccess from '~/blob/pipeline_tour_success_modal.vue';
diff --git a/spec/frontend/blob/sketch/index_spec.js b/spec/frontend/blob/sketch/index_spec.js
index 7424897b22c..5e1922a24f4 100644
--- a/spec/frontend/blob/sketch/index_spec.js
+++ b/spec/frontend/blob/sketch/index_spec.js
@@ -1,20 +1,34 @@
-import JSZip from 'jszip';
import SketchLoader from '~/blob/sketch';
-
-jest.mock('jszip');
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import waitForPromises from 'helpers/wait_for_promises';
+
+jest.mock('jszip', () => {
+ return {
+ loadAsync: jest.fn().mockResolvedValue({
+ files: {
+ 'previews/preview.png': {
+ async: jest.fn().mockResolvedValue('foo'),
+ },
+ },
+ }),
+ };
+});
describe('Sketch viewer', () => {
beforeEach(() => {
- loadFixtures('static/sketch_viewer.html');
+ loadHTMLFixture('static/sketch_viewer.html');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
describe('with error message', () => {
- beforeEach((done) => {
+ beforeEach(() => {
jest.spyOn(SketchLoader.prototype, 'getZipFile').mockImplementation(
() =>
new Promise((resolve, reject) => {
reject();
- done();
}),
);
@@ -35,26 +49,12 @@ describe('Sketch viewer', () => {
});
describe('success', () => {
- beforeEach((done) => {
- const loadAsyncMock = {
- files: {
- 'previews/preview.png': {
- async: jest.fn(),
- },
- },
- };
-
- loadAsyncMock.files['previews/preview.png'].async.mockImplementation(
- () =>
- new Promise((resolve) => {
- resolve('foo');
- done();
- }),
- );
-
+ beforeEach(() => {
jest.spyOn(SketchLoader.prototype, 'getZipFile').mockResolvedValue();
- jest.spyOn(JSZip, 'loadAsync').mockResolvedValue(loadAsyncMock);
- return new SketchLoader(document.getElementById('js-sketch-viewer'));
+ // eslint-disable-next-line no-new
+ new SketchLoader(document.getElementById('js-sketch-viewer'));
+
+ return waitForPromises();
});
it('does not render error message', () => {
diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js
index fe55a537b89..5f6baf3f63d 100644
--- a/spec/frontend/blob/viewer/index_spec.js
+++ b/spec/frontend/blob/viewer/index_spec.js
@@ -2,6 +2,7 @@
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';
@@ -26,7 +27,7 @@ describe('Blob viewer', () => {
$.fn.extend(jQueryMock);
mock = new MockAdapter(axios);
- loadFixtures('blob/show_readme.html');
+ loadHTMLFixture('blob/show_readme.html');
$('#modal-upload-blob').remove();
mock.onGet(/blob\/.+\/README\.md/).reply(200, {
@@ -39,6 +40,8 @@ describe('Blob viewer', () => {
afterEach(() => {
mock.restore();
window.location.hash = '';
+
+ resetHTMLFixture();
});
it('loads source file after switching views', async () => {
diff --git a/spec/frontend/blob_edit/blob_bundle_spec.js b/spec/frontend/blob_edit/blob_bundle_spec.js
index 2c9ddfaf867..644539308c2 100644
--- a/spec/frontend/blob_edit/blob_bundle_spec.js
+++ b/spec/frontend/blob_edit/blob_bundle_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import waitForPromises from 'helpers/wait_for_promises';
import blobBundle from '~/blob_edit/blob_bundle';
@@ -14,15 +15,17 @@ describe('BlobBundle', () => {
});
it('loads SourceEditor for the edit screen', async () => {
- setFixtures(`<div class="js-edit-blob-form"></div>`);
+ setHTMLFixture(`<div class="js-edit-blob-form"></div>`);
blobBundle();
await waitForPromises();
expect(SourceEditor).toHaveBeenCalled();
+
+ resetHTMLFixture();
});
describe('No Suggest Popover', () => {
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="js-edit-blob-form" data-blob-filename="blah">
<button class="js-commit-button"></button>
<button id='cancel-changes'></button>
@@ -31,6 +34,10 @@ describe('BlobBundle', () => {
blobBundle();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('sets the window beforeunload listener to a function returning a string', () => {
expect(window.onbeforeunload()).toBe('');
});
@@ -52,7 +59,7 @@ describe('BlobBundle', () => {
let trackingSpy;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="js-edit-blob-form" data-blob-filename="blah" id="target">
<div class="js-suggest-gitlab-ci-yml"
data-target="#target"
@@ -73,6 +80,7 @@ describe('BlobBundle', () => {
afterEach(() => {
unmockTracking();
+ resetHTMLFixture();
});
it('sends a tracking event when the commit button is clicked', () => {
diff --git a/spec/frontend/blob_edit/edit_blob_spec.js b/spec/frontend/blob_edit/edit_blob_spec.js
index 9c974e79e6e..c031cae11df 100644
--- a/spec/frontend/blob_edit/edit_blob_spec.js
+++ b/spec/frontend/blob_edit/edit_blob_spec.js
@@ -1,9 +1,12 @@
+import { Emitter } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import EditBlob from '~/blob_edit/edit_blob';
import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
import { EditorMarkdownExtension } from '~/editor/extensions/source_editor_markdown_ext';
import { EditorMarkdownPreviewExtension } from '~/editor/extensions/source_editor_markdown_livepreview_ext';
+import { ToolbarExtension } from '~/editor/extensions/source_editor_toolbar_ext';
import SourceEditor from '~/editor/source_editor';
jest.mock('~/editor/source_editor');
@@ -11,11 +14,13 @@ jest.mock('~/editor/extensions/source_editor_extension_base');
jest.mock('~/editor/extensions/source_editor_file_template_ext');
jest.mock('~/editor/extensions/source_editor_markdown_ext');
jest.mock('~/editor/extensions/source_editor_markdown_livepreview_ext');
+jest.mock('~/editor/extensions/source_editor_toolbar_ext');
const PREVIEW_MARKDOWN_PATH = '/foo/bar/preview_markdown';
const defaultExtensions = [
{ definition: SourceEditorExtension },
{ definition: FileTemplateExtension },
+ { definition: ToolbarExtension },
];
const markdownExtensions = [
{ definition: EditorMarkdownExtension },
@@ -26,15 +31,20 @@ const markdownExtensions = [
];
describe('Blob Editing', () => {
- const useMock = jest.fn();
+ let blobInstance;
+ const useMock = jest.fn(() => markdownExtensions);
+ const unuseMock = jest.fn();
+ const emitter = new Emitter();
const mockInstance = {
use: useMock,
+ unuse: unuseMock,
setValue: jest.fn(),
getValue: jest.fn().mockReturnValue('test value'),
focus: jest.fn(),
+ onDidChangeModelLanguage: emitter.event,
};
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<form class="js-edit-blob-form">
<div id="file_path"></div>
<div id="editor"></div>
@@ -44,17 +54,18 @@ describe('Blob Editing', () => {
jest.spyOn(SourceEditor.prototype, 'createInstance').mockReturnValue(mockInstance);
});
afterEach(() => {
- SourceEditorExtension.mockClear();
- EditorMarkdownExtension.mockClear();
- EditorMarkdownPreviewExtension.mockClear();
- FileTemplateExtension.mockClear();
+ jest.clearAllMocks();
+ unuseMock.mockClear();
+ useMock.mockClear();
+ resetHTMLFixture();
});
const editorInst = (isMarkdown) => {
- return new EditBlob({
+ blobInstance = new EditBlob({
isMarkdown,
previewMarkdownPath: PREVIEW_MARKDOWN_PATH,
});
+ return blobInstance;
};
const initEditor = async (isMarkdown = false) => {
@@ -79,6 +90,22 @@ describe('Blob Editing', () => {
expect(useMock).toHaveBeenCalledTimes(2);
expect(useMock.mock.calls[1]).toEqual([markdownExtensions]);
});
+
+ it('correctly handles switching from markdown and un-uses markdown extensions', async () => {
+ await initEditor(true);
+ expect(unuseMock).not.toHaveBeenCalled();
+ await emitter.fire({ newLanguage: 'plaintext', oldLanguage: 'markdown' });
+ expect(unuseMock).toHaveBeenCalledWith(markdownExtensions);
+ });
+
+ it('correctly handles switching from non-markdown to markdown extensions', async () => {
+ const mdSpy = jest.fn();
+ await initEditor();
+ blobInstance.fetchMarkdownExtension = mdSpy;
+ expect(mdSpy).not.toHaveBeenCalled();
+ await emitter.fire({ newLanguage: 'markdown', oldLanguage: 'plaintext' });
+ expect(mdSpy).toHaveBeenCalled();
+ });
});
it('adds trailing newline to the blob content on submit', async () => {
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
index 677978d31ca..c6de3ee69f3 100644
--- a/spec/frontend/boards/board_card_inner_spec.js
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -2,12 +2,15 @@ import { GlLabel, GlLoadingIcon, GlTooltip } from '@gitlab/ui';
import { range } from 'lodash';
import Vuex from 'vuex';
import { nextTick } from 'vue';
+import setWindowLocation from 'helpers/set_window_location_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import BoardBlockedIcon from '~/boards/components/board_blocked_icon.vue';
import BoardCardInner from '~/boards/components/board_card_inner.vue';
import { issuableTypes } from '~/boards/constants';
+import eventHub from '~/boards/eventhub';
import defaultStore from '~/boards/stores';
+import { updateHistory } from '~/lib/utils/url_utility';
import { mockLabelList, mockIssue, mockIssueFullPath } from './mock_data';
jest.mock('~/lib/utils/url_utility');
@@ -34,7 +37,7 @@ describe('Board card component', () => {
let list;
let store;
- const findBoardBlockedIcon = () => wrapper.find(BoardBlockedIcon);
+ const findBoardBlockedIcon = () => wrapper.findComponent(BoardBlockedIcon);
const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findEpicCountablesTotalTooltip = () => wrapper.findComponent(GlTooltip);
const findEpicCountables = () => wrapper.findByTestId('epic-countables');
@@ -45,9 +48,14 @@ describe('Board card component', () => {
const findEpicProgressTooltip = () => wrapper.findByTestId('epic-progress-tooltip-content');
const findHiddenIssueIcon = () => wrapper.findByTestId('hidden-icon');
+ const performSearchMock = jest.fn();
+
const createStore = ({ isEpicBoard = false, isProjectBoard = false } = {}) => {
store = new Vuex.Store({
...defaultStore,
+ actions: {
+ performSearch: performSearchMock,
+ },
state: {
...defaultStore.state,
issuableType: issuableTypes.issue,
@@ -70,7 +78,6 @@ describe('Board card component', () => {
...props,
},
stubs: {
- GlLabel: true,
GlLoadingIcon: true,
},
directives: {
@@ -179,7 +186,7 @@ describe('Board card component', () => {
describe('confidential issue', () => {
beforeEach(() => {
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
confidential: true,
@@ -194,7 +201,7 @@ describe('Board card component', () => {
describe('hidden issue', () => {
beforeEach(() => {
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
hidden: true,
@@ -219,7 +226,7 @@ describe('Board card component', () => {
describe('with assignee', () => {
describe('with avatar', () => {
beforeEach(() => {
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
assignees: [user],
@@ -272,7 +279,7 @@ describe('Board card component', () => {
beforeEach(() => {
global.gon.default_avatar_url = 'default_avatar';
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
assignees: [
@@ -301,7 +308,7 @@ describe('Board card component', () => {
describe('multiple assignees', () => {
beforeEach(() => {
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
assignees: [
@@ -342,7 +349,7 @@ describe('Board card component', () => {
avatarUrl: 'test_image',
});
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
assignees,
@@ -368,7 +375,7 @@ describe('Board card component', () => {
avatarUrl: 'test_image',
})),
];
- wrapper.setProps({
+ createWrapper({
item: {
...wrapper.props('item'),
assignees,
@@ -384,31 +391,74 @@ describe('Board card component', () => {
describe('labels', () => {
beforeEach(() => {
- wrapper.setProps({ item: { ...issue, labels: [list.label, label1] } });
+ createWrapper({ item: { ...issue, labels: [list.label, label1] } });
});
it('does not render list label but renders all other labels', () => {
- expect(wrapper.findAll(GlLabel).length).toBe(1);
- const label = wrapper.find(GlLabel);
+ expect(wrapper.findAllComponents(GlLabel).length).toBe(1);
+ const label = wrapper.findComponent(GlLabel);
expect(label.props('title')).toEqual(label1.title);
expect(label.props('description')).toEqual(label1.description);
expect(label.props('backgroundColor')).toEqual(label1.color);
});
it('does not render label if label does not have an ID', async () => {
- wrapper.setProps({ item: { ...issue, labels: [label1, { title: 'closed' }] } });
+ createWrapper({ item: { ...issue, labels: [label1, { title: 'closed' }] } });
await nextTick();
- expect(wrapper.findAll(GlLabel).length).toBe(1);
+ expect(wrapper.findAllComponents(GlLabel).length).toBe(1);
expect(wrapper.text()).not.toContain('closed');
});
+ });
- describe('when label params arent set', () => {
- it('passes the right target to GlLabel', () => {
- expect(wrapper.findAll(GlLabel).at(0).props('target')).toEqual(
- '?label_name[]=testing%20123',
- );
+ describe('filterByLabel method', () => {
+ beforeEach(() => {
+ createWrapper({
+ item: {
+ ...issue,
+ labels: [label1],
+ },
+ updateFilters: true,
+ });
+ });
+
+ describe('when selected label is not in the filter', () => {
+ beforeEach(() => {
+ setWindowLocation('?');
+ wrapper.findComponent(GlLabel).vm.$emit('click', label1);
+ });
+
+ it('calls updateHistory', () => {
+ expect(updateHistory).toHaveBeenCalledTimes(1);
+ });
+
+ it('dispatches performSearch vuex action', () => {
+ expect(performSearchMock).toHaveBeenCalledTimes(1);
+ });
+
+ it('emits updateTokens event', () => {
+ expect(eventHub.$emit).toHaveBeenCalledTimes(1);
+ expect(eventHub.$emit).toHaveBeenCalledWith('updateTokens');
+ });
+ });
+
+ describe('when selected label is already in the filter', () => {
+ beforeEach(() => {
+ setWindowLocation('?label_name[]=testing%20123');
+ wrapper.findComponent(GlLabel).vm.$emit('click', label1);
+ });
+
+ it('does not call updateHistory', () => {
+ expect(updateHistory).not.toHaveBeenCalled();
+ });
+
+ it('does not dispatch performSearch vuex action', () => {
+ expect(performSearchMock).not.toHaveBeenCalled();
+ });
+
+ it('does not emit updateTokens event', () => {
+ expect(eventHub.$emit).not.toHaveBeenCalled();
});
});
});
diff --git a/spec/frontend/boards/components/board_list_header_spec.js b/spec/frontend/boards/components/board_list_header_spec.js
index 14870ec76a2..2f9677680eb 100644
--- a/spec/frontend/boards/components/board_list_header_spec.js
+++ b/spec/frontend/boards/components/board_list_header_spec.js
@@ -132,7 +132,7 @@ describe('Board List Header Component', () => {
const icon = findCaret();
- expect(icon.props('icon')).toBe('chevron-right');
+ expect(icon.props('icon')).toBe('chevron-down');
});
it('should display expand icon when column is collapsed', async () => {
@@ -140,7 +140,7 @@ describe('Board List Header Component', () => {
const icon = findCaret();
- expect(icon.props('icon')).toBe('chevron-down');
+ expect(icon.props('icon')).toBe('chevron-right');
});
it('should dispatch toggleListCollapse when clicking the collapse icon', async () => {
diff --git a/spec/frontend/boards/mock_data.js b/spec/frontend/boards/mock_data.js
index ec9342cffc2..26ad9790840 100644
--- a/spec/frontend/boards/mock_data.js
+++ b/spec/frontend/boards/mock_data.js
@@ -17,6 +17,10 @@ export const mockBoard = {
id: 'gid://gitlab/Iteration/124',
title: 'Iteration 9',
},
+ iterationCadence: {
+ id: 'gid://gitlab/Iteration::Cadence/134',
+ title: 'Cadence 3',
+ },
assignee: {
id: 'gid://gitlab/User/1',
username: 'admin',
@@ -32,6 +36,7 @@ export const mockBoardConfig = {
milestoneTitle: '14.9',
iterationId: 'gid://gitlab/Iteration/124',
iterationTitle: 'Iteration 9',
+ iterationCadenceId: 'gid://gitlab/Iteration::Cadence/134',
assigneeId: 'gid://gitlab/User/1',
assigneeUsername: 'admin',
labels: [{ id: 'gid://gitlab/Label/32', title: 'Deliverable' }],
diff --git a/spec/frontend/boards/project_select_spec.js b/spec/frontend/boards/project_select_spec.js
index 05dc7d28eaa..bd79060c54f 100644
--- a/spec/frontend/boards/project_select_spec.js
+++ b/spec/frontend/boards/project_select_spec.js
@@ -1,7 +1,14 @@
-import { GlDropdown, GlDropdownItem, GlSearchBoxByType, GlLoadingIcon } from '@gitlab/ui';
+import {
+ GlDropdown,
+ GlDropdownItem,
+ 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';
@@ -61,6 +68,7 @@ describe('ProjectSelect component', () => {
provide: {
groupId: 1,
},
+ attachTo: document.body,
});
};
@@ -120,6 +128,17 @@ describe('ProjectSelect component', () => {
it('does not render empty search result message', () => {
expect(findEmptySearchMessage().exists()).toBe(false);
});
+
+ it('focuses on the search input', async () => {
+ const dropdownToggle = findGlDropdown().find('.dropdown-toggle');
+
+ await dropdownToggle.trigger('click');
+ await waitForPromises();
+ await nextTick();
+
+ const searchInput = findGlDropdown().findComponent(GlFormInput).element;
+ expect(document.activeElement).toEqual(searchInput);
+ });
});
describe('when no projects are being returned', () => {
diff --git a/spec/frontend/boards/stores/getters_spec.js b/spec/frontend/boards/stores/getters_spec.js
index b30968c45d7..304f2aad98e 100644
--- a/spec/frontend/boards/stores/getters_spec.js
+++ b/spec/frontend/boards/stores/getters_spec.js
@@ -215,4 +215,33 @@ describe('Boards - Getters', () => {
expect(getters.isEpicBoard()).toBe(false);
});
});
+
+ describe('hasScope', () => {
+ const boardConfig = {
+ labels: [],
+ assigneeId: null,
+ iterationCadenceId: null,
+ iterationId: null,
+ milestoneId: null,
+ weight: null,
+ };
+
+ it('returns false when boardConfig is empty', () => {
+ const state = { boardConfig };
+
+ expect(getters.hasScope(state)).toBe(false);
+ });
+
+ it('returns true when boardScope has a label', () => {
+ const state = { boardConfig: { ...boardConfig, labels: ['foo'] } };
+
+ expect(getters.hasScope(state)).toBe(true);
+ });
+
+ it('returns true when boardConfig has a value other than null', () => {
+ const state = { boardConfig: { ...boardConfig, assigneeId: 3 } };
+
+ expect(getters.hasScope(state)).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/bootstrap_jquery_spec.js b/spec/frontend/bootstrap_jquery_spec.js
index d5d592e3839..15186600a8a 100644
--- a/spec/frontend/bootstrap_jquery_spec.js
+++ b/spec/frontend/bootstrap_jquery_spec.js
@@ -1,10 +1,15 @@
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import '~/commons/bootstrap';
describe('Bootstrap jQuery extensions', () => {
describe('disable', () => {
beforeEach(() => {
- setFixtures('<input type="text" />');
+ setHTMLFixture('<input type="text" />');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('adds the disabled attribute', () => {
@@ -24,7 +29,11 @@ describe('Bootstrap jQuery extensions', () => {
describe('enable', () => {
beforeEach(() => {
- setFixtures('<input type="text" disabled="disabled" class="disabled" />');
+ setHTMLFixture('<input type="text" disabled="disabled" class="disabled" />');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('removes the disabled attribute', () => {
diff --git a/spec/frontend/bootstrap_linked_tabs_spec.js b/spec/frontend/bootstrap_linked_tabs_spec.js
index 30fb140bc69..5ee1ca32141 100644
--- a/spec/frontend/bootstrap_linked_tabs_spec.js
+++ b/spec/frontend/bootstrap_linked_tabs_spec.js
@@ -1,8 +1,13 @@
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import LinkedTabs from '~/lib/utils/bootstrap_linked_tabs';
describe('Linked Tabs', () => {
beforeEach(() => {
- loadFixtures('static/linked_tabs.html');
+ loadHTMLFixture('static/linked_tabs.html');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
describe('when is initialized', () => {
diff --git a/spec/frontend/branches/components/delete_branch_modal_spec.js b/spec/frontend/branches/components/delete_branch_modal_spec.js
index 0c6111bda9e..2b8c8d408c4 100644
--- a/spec/frontend/branches/components/delete_branch_modal_spec.js
+++ b/spec/frontend/branches/components/delete_branch_modal_spec.js
@@ -49,7 +49,7 @@ const findForm = () => wrapper.find('form');
describe('Delete branch modal', () => {
const expectedUnmergedWarning =
- 'This branch hasn’t been merged into default. To avoid data loss, consider merging this branch before deleting it.';
+ "This branch hasn't been merged into default. To avoid data loss, consider merging this branch before deleting it.";
afterEach(() => {
wrapper.destroy();
@@ -110,7 +110,7 @@ describe('Delete branch modal', () => {
"You're about to permanently delete the protected branch test_modal.";
const expectedMessageProtected = `${expectedWarningProtected} ${expectedUnmergedWarning}`;
const expectedConfirmationText =
- 'Once you confirm and press Yes, delete protected branch, it cannot be undone or recovered. Please type the following to confirm: test_modal';
+ 'After you confirm and select Yes, delete protected branch, you cannot recover this branch. Please type the following to confirm: test_modal';
beforeEach(() => {
createComponent({ isProtectedBranch: true });
diff --git a/spec/frontend/broadcast_notification_spec.js b/spec/frontend/broadcast_notification_spec.js
index cd947cd417a..5b9541dedfb 100644
--- a/spec/frontend/broadcast_notification_spec.js
+++ b/spec/frontend/broadcast_notification_spec.js
@@ -1,4 +1,5 @@
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initBroadcastNotifications from '~/broadcast_notification';
describe('broadcast message on dismiss', () => {
@@ -9,7 +10,7 @@ describe('broadcast message on dismiss', () => {
const endsAt = '2020-01-01T00:00:00Z';
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="js-broadcast-notification-1">
<button class="js-dismiss-current-broadcast-notification" data-id="1" data-expire-date="${endsAt}"></button>
</div>
@@ -18,6 +19,10 @@ describe('broadcast message on dismiss', () => {
initBroadcastNotifications();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('removes broadcast message', () => {
dismiss();
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 042376c71e8..ad5f8a56ced 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
@@ -10,6 +10,7 @@ import { secureFiles } from '../mock_data';
const dummyApiVersion = 'v3000';
const dummyProjectId = 1;
+const fileSizeLimit = 5;
const dummyUrlRoot = '/gitlab';
const dummyGon = {
api_version: dummyApiVersion,
@@ -33,9 +34,13 @@ describe('SecureFilesList', () => {
window.gon = originalGon;
});
- const createWrapper = (props = {}) => {
+ const createWrapper = (admin = true, props = {}) => {
wrapper = mount(SecureFilesList, {
- provide: { projectId: dummyProjectId },
+ provide: {
+ projectId: dummyProjectId,
+ admin,
+ fileSizeLimit,
+ },
...props,
});
};
@@ -46,6 +51,8 @@ describe('SecureFilesList', () => {
const findHeaderAt = (i) => wrapper.findAll('thead th').at(i);
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');
describe('when secure files exist in a project', () => {
beforeEach(async () => {
@@ -57,7 +64,7 @@ describe('SecureFilesList', () => {
});
it('displays a table with expected headers', () => {
- const headers = ['Filename', 'Permissions', 'Uploaded'];
+ const headers = ['Filename', 'Uploaded'];
headers.forEach((header, i) => {
expect(findHeaderAt(i).text()).toBe(header);
});
@@ -69,8 +76,7 @@ describe('SecureFilesList', () => {
const [secureFile] = secureFiles;
expect(findCell(0, 0).text()).toBe(secureFile.name);
- expect(findCell(0, 1).text()).toBe(secureFile.permissions);
- expect(findCell(0, 2).find(TimeAgoTooltip).props('time')).toBe(secureFile.created_at);
+ expect(findCell(0, 1).find(TimeAgoTooltip).props('time')).toBe(secureFile.created_at);
});
});
@@ -84,7 +90,7 @@ describe('SecureFilesList', () => {
});
it('displays a table with expected headers', () => {
- const headers = ['Filename', 'Permissions', 'Uploaded'];
+ const headers = ['Filename', 'Uploaded'];
headers.forEach((header, i) => {
expect(findHeaderAt(i).text()).toBe(header);
});
@@ -136,4 +142,42 @@ describe('SecureFilesList', () => {
expect(findLoadingIcon().exists()).toBe(false);
});
});
+
+ describe('admin permissions', () => {
+ describe('with admin permissions', () => {
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+ mock.onGet(expectedUrl).reply(200, secureFiles);
+
+ createWrapper();
+ await waitForPromises();
+ });
+
+ it('displays the upload button', () => {
+ expect(findUploadButton().exists()).toBe(true);
+ });
+
+ it('displays a delete button', () => {
+ expect(findDeleteButton().exists()).toBe(true);
+ });
+ });
+
+ describe('without admin permissions', () => {
+ beforeEach(async () => {
+ mock = new MockAdapter(axios);
+ mock.onGet(expectedUrl).reply(200, secureFiles);
+
+ createWrapper(false);
+ await waitForPromises();
+ });
+
+ it('does not display the upload button', () => {
+ expect(findUploadButton().exists()).toBe(false);
+ });
+
+ it('does not display a delete button', () => {
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+ });
+ });
});
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
index 1bca21b1d57..2210b0f48d6 100644
--- a/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
+++ b/spec/frontend/ci_variable_list/ci_variable_list/ci_variable_list_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import VariableList from '~/ci_variable_list/ci_variable_list';
const HIDE_CLASS = 'hide';
@@ -10,7 +11,7 @@ describe('VariableList', () => {
describe('with only key/value inputs', () => {
describe('with no variables', () => {
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit.html');
+ loadHTMLFixture('pipeline_schedules/edit.html');
$wrapper = $('.js-ci-variable-list-section');
variableList = new VariableList({
@@ -20,6 +21,10 @@ describe('VariableList', () => {
variableList.init();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should remove the row when clicking the remove button', () => {
$wrapper.find('.js-row-remove-button').trigger('click');
@@ -64,7 +69,7 @@ describe('VariableList', () => {
describe('with persisted variables', () => {
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit_with_variables.html');
+ loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
$wrapper = $('.js-ci-variable-list-section');
variableList = new VariableList({
@@ -74,6 +79,10 @@ describe('VariableList', () => {
variableList.init();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should have "Reveal values" button initially when there are already variables', () => {
expect($wrapper.find('.js-secret-value-reveal-button').text()).toBe('Reveal values');
});
@@ -97,7 +106,7 @@ describe('VariableList', () => {
describe('toggleEnableRow method', () => {
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit_with_variables.html');
+ loadHTMLFixture('pipeline_schedules/edit_with_variables.html');
$wrapper = $('.js-ci-variable-list-section');
variableList = new VariableList({
@@ -107,6 +116,10 @@ describe('VariableList', () => {
variableList.init();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should disable all key inputs', () => {
expect($wrapper.find('.js-ci-variable-input-key:not([disabled])').length).toBe(3);
diff --git a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js b/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
index eee1362440d..57f666e29d6 100644
--- a/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
+++ b/spec/frontend/ci_variable_list/ci_variable_list/native_form_variable_list_spec.js
@@ -1,11 +1,12 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import setupNativeFormVariableList from '~/ci_variable_list/native_form_variable_list';
describe('NativeFormVariableList', () => {
let $wrapper;
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit.html');
+ loadHTMLFixture('pipeline_schedules/edit.html');
$wrapper = $('.js-ci-variable-list-section');
setupNativeFormVariableList({
@@ -14,6 +15,10 @@ describe('NativeFormVariableList', () => {
});
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('onFormSubmit', () => {
it('should clear out the `name` attribute on the inputs for the last empty row on form submission (avoid BE validation)', () => {
const $row = $wrapper.find('.js-row');
diff --git a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js b/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
index 2fedbbecd64..d26378d9382 100644
--- a/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
+++ b/spec/frontend/ci_variable_list/components/ci_variable_modal_spec.js
@@ -5,7 +5,12 @@ import Vuex from 'vuex';
import { mockTracking } from 'helpers/tracking_helper';
import CiEnvironmentsDropdown from '~/ci_variable_list/components/ci_environments_dropdown.vue';
import CiVariableModal from '~/ci_variable_list/components/ci_variable_modal.vue';
-import { AWS_ACCESS_KEY_ID, EVENT_LABEL, EVENT_ACTION } from '~/ci_variable_list/constants';
+import {
+ AWS_ACCESS_KEY_ID,
+ EVENT_LABEL,
+ EVENT_ACTION,
+ ENVIRONMENT_SCOPE_LINK_TITLE,
+} from '~/ci_variable_list/constants';
import createStore from '~/ci_variable_list/store';
import mockData from '../services/mock_data';
import ModalStub from '../stubs';
@@ -20,7 +25,11 @@ describe('Ci variable modal', () => {
const maskableRegex = '^[a-zA-Z0-9_+=/@:.~-]{8,}$';
const createComponent = (method, options = {}) => {
- store = createStore({ maskableRegex, isGroup: options.isGroup });
+ store = createStore({
+ maskableRegex,
+ isGroup: options.isGroup,
+ environmentScopeLink: '/help/environments',
+ });
wrapper = method(CiVariableModal, {
attachTo: document.body,
stubs: {
@@ -213,6 +222,15 @@ describe('Ci variable modal', () => {
});
});
});
+
+ it('renders a link to documentation on scopes', () => {
+ createComponent(mount);
+
+ const link = wrapper.find('[data-testid="environment-scope-link"]');
+
+ expect(link.attributes('title')).toBe(ENVIRONMENT_SCOPE_LINK_TITLE);
+ expect(link.attributes('href')).toBe('/help/environments');
+ });
});
describe('Validations', () => {
diff --git a/spec/frontend/clusters/agents/components/revoke_token_button_spec.js b/spec/frontend/clusters/agents/components/revoke_token_button_spec.js
new file mode 100644
index 00000000000..6521221cbd7
--- /dev/null
+++ b/spec/frontend/clusters/agents/components/revoke_token_button_spec.js
@@ -0,0 +1,239 @@
+import { GlButton, GlModal, GlFormInput, GlTooltip } 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 { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { ENTER_KEY } from '~/lib/utils/keys';
+import RevokeTokenButton from '~/clusters/agents/components/revoke_token_button.vue';
+import getClusterAgentQuery from '~/clusters/agents/graphql/queries/get_cluster_agent.query.graphql';
+import revokeTokenMutation from '~/clusters/agents/graphql/mutations/revoke_token.mutation.graphql';
+import { TOKEN_STATUS_ACTIVE, MAX_LIST_COUNT } from '~/clusters/agents/constants';
+import { getTokenResponse, mockRevokeResponse, mockErrorRevokeResponse } from '../../mock_data';
+
+Vue.use(VueApollo);
+
+describe('RevokeTokenButton', () => {
+ let wrapper;
+ let toast;
+ let apolloProvider;
+ let revokeSpy;
+
+ const token = {
+ id: 'token-id',
+ name: 'token-name',
+ };
+ const cursor = {
+ first: MAX_LIST_COUNT,
+ last: null,
+ };
+ const agentName = 'cluster-agent';
+ const projectPath = 'path/to/project';
+
+ const defaultProvide = {
+ agentName,
+ projectPath,
+ canAdminCluster: true,
+ };
+ const propsData = {
+ token,
+ cursor,
+ };
+
+ const findModal = () => wrapper.findComponent(GlModal);
+ const findRevokeBtn = () => wrapper.findComponent(GlButton);
+ const findInput = () => wrapper.findComponent(GlFormInput);
+ const findTooltip = () => wrapper.findComponent(GlTooltip);
+ const findPrimaryAction = () => findModal().props('actionPrimary');
+ const findPrimaryActionAttributes = (attr) => findPrimaryAction().attributes[0][attr];
+
+ const createMockApolloProvider = ({ mutationResponse }) => {
+ revokeSpy = jest.fn().mockResolvedValue(mutationResponse);
+
+ return createMockApollo([[revokeTokenMutation, revokeSpy]]);
+ };
+
+ const writeQuery = () => {
+ apolloProvider.clients.defaultClient.cache.writeQuery({
+ query: getClusterAgentQuery,
+ variables: {
+ agentName,
+ projectPath,
+ tokenStatus: TOKEN_STATUS_ACTIVE,
+ ...cursor,
+ },
+ data: getTokenResponse.data,
+ });
+ };
+
+ const createWrapper = async ({
+ mutationResponse = mockRevokeResponse,
+ provideData = {},
+ } = {}) => {
+ apolloProvider = createMockApolloProvider({ mutationResponse });
+
+ toast = jest.fn();
+
+ wrapper = shallowMountExtended(RevokeTokenButton, {
+ apolloProvider,
+ provide: {
+ ...defaultProvide,
+ ...provideData,
+ },
+ propsData,
+ stubs: {
+ GlModal,
+ GlTooltip,
+ },
+ mocks: { $toast: { show: toast } },
+ });
+ wrapper.vm.$refs.modal.hide = jest.fn();
+
+ writeQuery();
+ await nextTick();
+ };
+
+ const submitTokenToRevoke = async () => {
+ findRevokeBtn().vm.$emit('click');
+ findInput().vm.$emit('input', token.name);
+ await findModal().vm.$emit('primary');
+ await waitForPromises();
+ };
+
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ apolloProvider = null;
+ revokeSpy = null;
+ });
+
+ describe('revoke token action', () => {
+ it('displays a revoke button', () => {
+ expect(findRevokeBtn().attributes('aria-label')).toBe('Revoke token');
+ });
+
+ describe('when user cannot revoke token', () => {
+ beforeEach(() => {
+ createWrapper({ provideData: { canAdminCluster: false } });
+ });
+
+ it('disabled the button', () => {
+ expect(findRevokeBtn().attributes('disabled')).toBe('true');
+ });
+
+ it('shows a disabled tooltip', () => {
+ expect(findTooltip().attributes('title')).toBe(
+ 'Requires a Maintainer or greater role to perform this action',
+ );
+ });
+ });
+
+ describe('when user can create a token and clicks the button', () => {
+ beforeEach(() => {
+ findRevokeBtn().vm.$emit('click');
+ });
+
+ it('displays a delete confirmation modal', () => {
+ expect(findModal().isVisible()).toBe(true);
+ });
+
+ describe.each`
+ condition | tokenName | isDisabled | mutationCalled
+ ${'the input with token name is missing'} | ${''} | ${true} | ${false}
+ ${'the input with token name is incorrect'} | ${'wrong-name'} | ${true} | ${false}
+ ${'the input with token name is correct'} | ${token.name} | ${false} | ${true}
+ `('when $condition', ({ tokenName, isDisabled, mutationCalled }) => {
+ beforeEach(() => {
+ findRevokeBtn().vm.$emit('click');
+ findInput().vm.$emit('input', tokenName);
+ });
+
+ it(`${isDisabled ? 'disables' : 'enables'} the modal primary button`, () => {
+ expect(findPrimaryActionAttributes('disabled')).toBe(isDisabled);
+ });
+
+ describe('when user clicks the modal primary button', () => {
+ beforeEach(async () => {
+ await findModal().vm.$emit('primary');
+ });
+
+ if (mutationCalled) {
+ it('calls the revoke mutation', () => {
+ expect(revokeSpy).toHaveBeenCalledWith({ input: { id: token.id } });
+ });
+ } else {
+ it("doesn't call the revoke mutation", () => {
+ expect(revokeSpy).not.toHaveBeenCalled();
+ });
+ }
+ });
+
+ describe('when user presses the enter button', () => {
+ beforeEach(async () => {
+ await findInput().vm.$emit('keydown', new KeyboardEvent({ key: ENTER_KEY }));
+ });
+
+ if (mutationCalled) {
+ it('calls the revoke mutation', () => {
+ expect(revokeSpy).toHaveBeenCalledWith({ input: { id: token.id } });
+ });
+ } else {
+ it("doesn't call the revoke mutation", () => {
+ expect(revokeSpy).not.toHaveBeenCalled();
+ });
+ }
+ });
+ });
+ });
+
+ describe('when token was revoked successfully', () => {
+ beforeEach(async () => {
+ await submitTokenToRevoke();
+ });
+
+ it('calls the toast action', () => {
+ expect(toast).toHaveBeenCalledWith(`${token.name} successfully revoked`);
+ });
+ });
+
+ describe('when getting an error revoking token', () => {
+ beforeEach(async () => {
+ await createWrapper({ mutationResponse: mockErrorRevokeResponse });
+ await submitTokenToRevoke();
+ });
+
+ it('displays the error message', () => {
+ expect(toast).toHaveBeenCalledWith('could not revoke token');
+ });
+ });
+
+ describe('when the revoke modal was closed', () => {
+ beforeEach(async () => {
+ const loadingResponse = new Promise(() => {});
+ await createWrapper({ mutationResponse: loadingResponse });
+ await submitTokenToRevoke();
+ });
+
+ it('reenables the button', async () => {
+ expect(findPrimaryActionAttributes('loading')).toBe(true);
+ expect(findRevokeBtn().attributes('disabled')).toBe('true');
+
+ await findModal().vm.$emit('hide');
+
+ expect(findPrimaryActionAttributes('loading')).toBe(false);
+ expect(findRevokeBtn().attributes('disabled')).toBeUndefined();
+ });
+
+ it('clears the token name input', async () => {
+ expect(findInput().attributes('value')).toBe(token.name);
+
+ await findModal().vm.$emit('hide');
+
+ expect(findInput().attributes('value')).toBeUndefined();
+ });
+ });
+ });
+});
diff --git a/spec/frontend/clusters/clusters_bundle_spec.js b/spec/frontend/clusters/clusters_bundle_spec.js
index 2a0610b1b0a..b5345ea8915 100644
--- a/spec/frontend/clusters/clusters_bundle_spec.js
+++ b/spec/frontend/clusters/clusters_bundle_spec.js
@@ -1,5 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
-import { loadHTMLFixture } from 'helpers/fixtures';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
import { setTestTimeout } from 'helpers/timeout';
import Clusters from '~/clusters/clusters_bundle';
@@ -27,19 +27,17 @@ describe('Clusters', () => {
beforeEach(() => {
loadHTMLFixture('clusters/show_cluster.html');
- });
- beforeEach(() => {
mockGetClusterStatusRequest();
- });
- beforeEach(() => {
cluster = new Clusters();
});
afterEach(() => {
cluster.destroy();
mock.restore();
+
+ resetHTMLFixture();
});
describe('class constructor', () => {
diff --git a/spec/frontend/clusters/components/__snapshots__/new_cluster_spec.js.snap b/spec/frontend/clusters/components/__snapshots__/new_cluster_spec.js.snap
index 0bec2a5934e..656e72baf77 100644
--- a/spec/frontend/clusters/components/__snapshots__/new_cluster_spec.js.snap
+++ b/spec/frontend/clusters/components/__snapshots__/new_cluster_spec.js.snap
@@ -3,7 +3,7 @@
exports[`NewCluster renders the cluster component correctly 1`] = `
"<div class=\\"gl-pt-4\\">
<h4>Enter your Kubernetes cluster certificate details</h4>
- <p>Enter details about your cluster. <b-link-stub href=\\"/some/help/path\\" target=\\"_blank\\" event=\\"click\\" routertag=\\"a\\" class=\\"gl-link\\">How do I use a certificate to connect to my cluster?</b-link-stub>
+ <p>Enter details about your cluster. <b-link-stub href=\\"/help/user/project/clusters/add_existing_cluster\\" event=\\"click\\" routertag=\\"a\\" class=\\"gl-link\\">How do I use a certificate to connect to my cluster?</b-link-stub>
</p>
</div>"
`;
diff --git a/spec/frontend/clusters/components/new_cluster_spec.js b/spec/frontend/clusters/components/new_cluster_spec.js
index b62e678154c..f9df70b9f87 100644
--- a/spec/frontend/clusters/components/new_cluster_spec.js
+++ b/spec/frontend/clusters/components/new_cluster_spec.js
@@ -2,15 +2,13 @@ import { GlLink, GlSprintf } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import NewCluster from '~/clusters/components/new_cluster.vue';
-import createClusterStore from '~/clusters/stores/new_cluster';
+import { helpPagePath } from '~/helpers/help_page_helper';
describe('NewCluster', () => {
- let store;
let wrapper;
const createWrapper = async () => {
- store = createClusterStore({ clusterConnectHelpPath: '/some/help/path' });
- wrapper = shallowMount(NewCluster, { store, stubs: { GlLink, GlSprintf } });
+ wrapper = shallowMount(NewCluster, { stubs: { GlLink, GlSprintf } });
await nextTick();
};
@@ -35,6 +33,8 @@ describe('NewCluster', () => {
});
it('renders a valid help link set by the backend', () => {
- expect(findLink().attributes('href')).toBe('/some/help/path');
+ expect(findLink().attributes('href')).toBe(
+ helpPagePath('user/project/clusters/add_existing_cluster'),
+ );
});
});
diff --git a/spec/frontend/clusters/forms/components/integration_form_spec.js b/spec/frontend/clusters/forms/components/integration_form_spec.js
index dd278bcd2ce..67d442bfdc5 100644
--- a/spec/frontend/clusters/forms/components/integration_form_spec.js
+++ b/spec/frontend/clusters/forms/components/integration_form_spec.js
@@ -22,7 +22,7 @@ describe('ClusterIntegrationForm', () => {
store: createStore(storeValues),
provide: {
autoDevopsHelpPath: 'topics/autodevops/index',
- externalEndpointHelpPath: 'user/clusters/applications.md',
+ externalEndpointHelpPath: 'user/project/clusters/index.md#base-domain',
},
});
};
diff --git a/spec/frontend/clusters/gke_cluster_namespace/gke_cluster_namespace_spec.js b/spec/frontend/clusters/gke_cluster_namespace/gke_cluster_namespace_spec.js
new file mode 100644
index 00000000000..eeb876a608f
--- /dev/null
+++ b/spec/frontend/clusters/gke_cluster_namespace/gke_cluster_namespace_spec.js
@@ -0,0 +1,66 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import initGkeNamespace from '~/clusters/gke_cluster_namespace';
+
+describe('GKE cluster namespace', () => {
+ const changeEvent = new Event('change');
+ const isHidden = (el) => el.classList.contains('hidden');
+ const hasDisabledInput = (el) => el.querySelector('input').disabled;
+
+ let glManagedCheckbox;
+ let selfManaged;
+ let glManaged;
+
+ beforeEach(() => {
+ setHTMLFixture(`
+ <input class="js-gl-managed" type="checkbox" value="1" checked />
+ <div class="js-namespace">
+ <input type="text" />
+ </div>
+ <div class="js-namespace-prefixed">
+ <input type="text" />
+ </div>
+ `);
+
+ glManagedCheckbox = document.querySelector('.js-gl-managed');
+ selfManaged = document.querySelector('.js-namespace');
+ glManaged = document.querySelector('.js-namespace-prefixed');
+
+ initGkeNamespace();
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ describe('GKE cluster namespace toggles', () => {
+ it('initially displays the GitLab-managed label and input', () => {
+ expect(isHidden(glManaged)).toEqual(false);
+ expect(hasDisabledInput(glManaged)).toEqual(false);
+
+ expect(isHidden(selfManaged)).toEqual(true);
+ expect(hasDisabledInput(selfManaged)).toEqual(true);
+ });
+
+ it('displays the self-managed label and input when the Gitlab-managed checkbox is unchecked', () => {
+ glManagedCheckbox.checked = false;
+ glManagedCheckbox.dispatchEvent(changeEvent);
+
+ expect(isHidden(glManaged)).toEqual(true);
+ expect(hasDisabledInput(glManaged)).toEqual(true);
+
+ expect(isHidden(selfManaged)).toEqual(false);
+ expect(hasDisabledInput(selfManaged)).toEqual(false);
+ });
+
+ it('displays the GitLab-managed label and input when the Gitlab-managed checkbox is checked', () => {
+ glManagedCheckbox.checked = true;
+ glManagedCheckbox.dispatchEvent(changeEvent);
+
+ expect(isHidden(glManaged)).toEqual(false);
+ expect(hasDisabledInput(glManaged)).toEqual(false);
+
+ expect(isHidden(selfManaged)).toEqual(true);
+ expect(hasDisabledInput(selfManaged)).toEqual(true);
+ });
+ });
+});
diff --git a/spec/frontend/clusters/mock_data.js b/spec/frontend/clusters/mock_data.js
index 63840486d0d..f3736f03e03 100644
--- a/spec/frontend/clusters/mock_data.js
+++ b/spec/frontend/clusters/mock_data.js
@@ -220,3 +220,15 @@ export const getTokenResponse = {
},
},
};
+
+export const mockRevokeResponse = {
+ data: { clusterAgentTokenRevoke: { errors: [] } },
+};
+
+export const mockErrorRevokeResponse = {
+ data: {
+ clusterAgentTokenRevoke: {
+ errors: ['could not revoke token'],
+ },
+ },
+};
diff --git a/spec/frontend/clusters_list/components/agent_table_spec.js b/spec/frontend/clusters_list/components/agent_table_spec.js
index a466a35428a..2a43b45a2f5 100644
--- a/spec/frontend/clusters_list/components/agent_table_spec.js
+++ b/spec/frontend/clusters_list/components/agent_table_spec.js
@@ -13,6 +13,7 @@ const defaultConfigHelpUrl =
const provideData = {
gitlabVersion: '14.8',
+ kasVersion: '14.8',
};
const propsData = {
agents: clusterAgents,
@@ -26,7 +27,7 @@ const outdatedTitle = I18N_AGENT_TABLE.versionOutdatedTitle;
const mismatchTitle = I18N_AGENT_TABLE.versionMismatchTitle;
const mismatchOutdatedTitle = I18N_AGENT_TABLE.versionMismatchOutdatedTitle;
const outdatedText = sprintf(I18N_AGENT_TABLE.versionOutdatedText, {
- version: provideData.gitlabVersion,
+ version: provideData.kasVersion,
});
const mismatchText = I18N_AGENT_TABLE.versionMismatchText;
diff --git a/spec/frontend/clusters_list/components/clusters_actions_spec.js b/spec/frontend/clusters_list/components/clusters_actions_spec.js
index 21dcc66c639..f4ee3f93cb5 100644
--- a/spec/frontend/clusters_list/components/clusters_actions_spec.js
+++ b/spec/frontend/clusters_list/components/clusters_actions_spec.js
@@ -1,4 +1,4 @@
-import { GlDropdown, GlDropdownItem, GlTooltip } from '@gitlab/ui';
+import { GlButton, GlDropdown, GlDropdownItem, GlTooltip } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ClustersActions from '~/clusters_list/components/clusters_actions.vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
@@ -7,12 +7,10 @@ import { INSTALL_AGENT_MODAL_ID, CLUSTERS_ACTIONS } from '~/clusters_list/consta
describe('ClustersActionsComponent', () => {
let wrapper;
- const newClusterPath = 'path/to/add/cluster';
const addClusterPath = 'path/to/connect/existing/cluster';
const newClusterDocsPath = 'path/to/create/new/cluster';
const defaultProvide = {
- newClusterPath,
addClusterPath,
newClusterDocsPath,
canAddCluster: true,
@@ -20,13 +18,13 @@ describe('ClustersActionsComponent', () => {
certificateBasedClustersEnabled: true,
};
+ const findButton = () => wrapper.findComponent(GlButton);
const findDropdown = () => wrapper.findComponent(GlDropdown);
const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
const findTooltip = () => wrapper.findComponent(GlTooltip);
const findDropdownItemIds = () =>
findDropdownItems().wrappers.map((x) => x.attributes('data-testid'));
const findDropdownItemTexts = () => findDropdownItems().wrappers.map((x) => x.text());
- const findNewClusterLink = () => wrapper.findByTestId('new-cluster-link');
const findNewClusterDocsLink = () => wrapper.findByTestId('create-cluster-link');
const findConnectClusterLink = () => wrapper.findByTestId('connect-cluster-link');
@@ -62,26 +60,6 @@ describe('ClustersActionsComponent', () => {
expect(findTooltip().exists()).toBe(false);
});
- describe('when user cannot add clusters', () => {
- beforeEach(() => {
- createWrapper({ canAddCluster: false });
- });
-
- it('disables dropdown', () => {
- expect(findDropdown().props('disabled')).toBe(true);
- });
-
- it('shows tooltip explaining why dropdown is disabled', () => {
- expect(findTooltip().attributes('title')).toBe(CLUSTERS_ACTIONS.dropdownDisabledHint);
- });
-
- it('does not bind split dropdown button', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
-
- expect(binding.value).toBe(false);
- });
- });
-
describe('when on project level', () => {
it(`displays default action as ${CLUSTERS_ACTIONS.connectWithAgent}`, () => {
expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectWithAgent);
@@ -93,27 +71,41 @@ describe('ClustersActionsComponent', () => {
expect(binding.value).toBe(INSTALL_AGENT_MODAL_ID);
});
- it('renders a dropdown with 3 actions items', () => {
- expect(findDropdownItemIds()).toEqual([
- 'create-cluster-link',
- 'new-cluster-link',
- 'connect-cluster-link',
- ]);
+ it('renders a dropdown with 2 actions items', () => {
+ expect(findDropdownItemIds()).toEqual(['create-cluster-link', 'connect-cluster-link']);
});
it('renders correct texts for the dropdown items', () => {
expect(findDropdownItemTexts()).toEqual([
CLUSTERS_ACTIONS.createCluster,
- CLUSTERS_ACTIONS.createClusterCertificate,
CLUSTERS_ACTIONS.connectClusterCertificate,
]);
});
it('renders correct href attributes for the links', () => {
expect(findNewClusterDocsLink().attributes('href')).toBe(newClusterDocsPath);
- expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
expect(findConnectClusterLink().attributes('href')).toBe(addClusterPath);
});
+
+ describe('when user cannot add clusters', () => {
+ beforeEach(() => {
+ createWrapper({ canAddCluster: false });
+ });
+
+ it('disables dropdown', () => {
+ expect(findDropdown().props('disabled')).toBe(true);
+ });
+
+ it('shows tooltip explaining why dropdown is disabled', () => {
+ expect(findTooltip().attributes('title')).toBe(CLUSTERS_ACTIONS.actionsDisabledHint);
+ });
+
+ it('does not bind split dropdown button', () => {
+ const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+
+ expect(binding.value).toBe(false);
+ });
+ });
});
describe('when on group or admin level', () => {
@@ -121,26 +113,34 @@ describe('ClustersActionsComponent', () => {
createWrapper({ displayClusterAgents: false });
});
- it(`displays default action as ${CLUSTERS_ACTIONS.connectClusterDeprecated}`, () => {
- expect(findDropdown().props('text')).toBe(CLUSTERS_ACTIONS.connectClusterDeprecated);
+ it("doesn't render a dropdown", () => {
+ expect(findDropdown().exists()).toBe(false);
});
- it('renders a dropdown with 1 action item', () => {
- expect(findDropdownItemIds()).toEqual(['new-cluster-link']);
+ it('render an action button', () => {
+ expect(findButton().exists()).toBe(true);
});
- it('renders correct text for the dropdown item', () => {
- expect(findDropdownItemTexts()).toEqual([CLUSTERS_ACTIONS.createClusterDeprecated]);
+ it(`displays default action as ${CLUSTERS_ACTIONS.connectClusterDeprecated}`, () => {
+ expect(findButton().text()).toBe(CLUSTERS_ACTIONS.connectClusterDeprecated);
});
- it('renders correct href attributes for the links', () => {
- expect(findNewClusterLink().attributes('href')).toBe(newClusterPath);
+ it('renders correct href attribute for the button', () => {
+ expect(findButton().attributes('href')).toBe(addClusterPath);
});
- it('does not bind dropdown button to modal', () => {
- const binding = getBinding(findDropdown().element, 'gl-modal-directive');
+ describe('when user cannot add clusters', () => {
+ beforeEach(() => {
+ createWrapper({ displayClusterAgents: false, canAddCluster: false });
+ });
+
+ it('disables action button', () => {
+ expect(findButton().props('disabled')).toBe(true);
+ });
- expect(binding.value).toBe(false);
+ it('shows tooltip explaining why dropdown is disabled', () => {
+ expect(findTooltip().attributes('title')).toBe(CLUSTERS_ACTIONS.actionsDisabledHint);
+ });
});
});
});
diff --git a/spec/frontend/code_navigation/components/app_spec.js b/spec/frontend/code_navigation/components/app_spec.js
index f2f97092c5a..b85047dc816 100644
--- a/spec/frontend/code_navigation/components/app_spec.js
+++ b/spec/frontend/code_navigation/components/app_spec.js
@@ -1,6 +1,8 @@
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
+
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import App from '~/code_navigation/components/app.vue';
import Popover from '~/code_navigation/components/popover.vue';
import createState from '~/code_navigation/store/state';
@@ -75,12 +77,14 @@ describe('Code navigation app component', () => {
});
it('calls showDefinition when clicking blob viewer', () => {
- setFixtures('<div class="blob-viewer"></div>');
+ setHTMLFixture('<div class="blob-viewer"></div>');
factory();
document.querySelector('.blob-viewer').click();
expect(showDefinition).toHaveBeenCalled();
+
+ resetHTMLFixture();
});
});
diff --git a/spec/frontend/code_navigation/store/actions_spec.js b/spec/frontend/code_navigation/store/actions_spec.js
index c26416aca94..c47a9e697b6 100644
--- a/spec/frontend/code_navigation/store/actions_spec.js
+++ b/spec/frontend/code_navigation/store/actions_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import testAction from 'helpers/vuex_action_helper';
import actions from '~/code_navigation/store/actions';
import { setCurrentHoverElement, addInteractionClass } from '~/code_navigation/utils';
@@ -174,12 +175,16 @@ describe('Code navigation actions', () => {
let target;
beforeEach(() => {
- setFixtures(
+ setHTMLFixture(
'<div data-path="index.js"><div class="line"><div class="js-test"></div></div></div>',
);
target = document.querySelector('.js-test');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('returns early when no data exists', () => {
return testAction(actions.showDefinition, { target }, {}, [], []);
});
diff --git a/spec/frontend/code_navigation/utils/index_spec.js b/spec/frontend/code_navigation/utils/index_spec.js
index 682c8bce8c5..b8448709f0b 100644
--- a/spec/frontend/code_navigation/utils/index_spec.js
+++ b/spec/frontend/code_navigation/utils/index_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import {
cachedData,
getCurrentHoverElement,
@@ -35,11 +36,15 @@ describe('setCurrentHoverElement', () => {
describe('addInteractionClass', () => {
beforeEach(() => {
- setFixtures(
+ setHTMLFixture(
'<div data-path="index.js"><div class="blob-content"><div id="LC1" class="line"><span>console</span><span>.</span><span>log</span></div><div id="LC2" class="line"><span>function</span></div></div></div>',
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it.each`
line | char | index
${0} | ${0} | ${0}
@@ -59,7 +64,7 @@ describe('addInteractionClass', () => {
describe('wrapTextNodes', () => {
beforeEach(() => {
- setFixtures(
+ setHTMLFixture(
'<div data-path="index.js"><div class="blob-content"><div id="LC1" class="line"> Text </div></div></div>',
);
});
diff --git a/spec/frontend/commits_spec.js b/spec/frontend/commits_spec.js
index a049a6997f0..db1516ed4ec 100644
--- a/spec/frontend/commits_spec.js
+++ b/spec/frontend/commits_spec.js
@@ -1,6 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import 'vendor/jquery.endless-scroll';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import CommitsList from '~/commits';
import axios from '~/lib/utils/axios_utils';
import Pager from '~/pager';
@@ -9,7 +10,7 @@ describe('Commits List', () => {
let commitsList;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<form class="commits-search-form" action="/h5bp/html5-boilerplate/commits/main">
<input id="commits-search">
</form>
@@ -19,6 +20,10 @@ describe('Commits List', () => {
commitsList = new CommitsList(25);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should be defined', () => {
expect(CommitsList).toBeDefined();
});
diff --git a/spec/frontend/commons/nav/user_merge_requests_spec.js b/spec/frontend/commons/nav/user_merge_requests_spec.js
index 8f974051232..f660cc8e9de 100644
--- a/spec/frontend/commons/nav/user_merge_requests_spec.js
+++ b/spec/frontend/commons/nav/user_merge_requests_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import * as UserApi from '~/api/user_api';
import {
openUserCountsBroadcast,
@@ -24,11 +25,15 @@ describe('User Merge Requests', () => {
newBroadcastChannelMock = jest.fn().mockImplementation(() => channelMock);
global.BroadcastChannel = newBroadcastChannelMock;
- setFixtures(
+ setHTMLFixture(
`<div><div class="${MR_COUNT_CLASS}">0</div><div class="js-assigned-mr-count"></div><div class="js-reviewer-mr-count"></div></div>`,
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const findMRCountText = () => document.body.querySelector(`.${MR_COUNT_CLASS}`).textContent;
describe('refreshUserMergeRequestCounts', () => {
diff --git a/spec/frontend/content_editor/components/__snapshots__/toolbar_button_spec.js.snap b/spec/frontend/content_editor/components/__snapshots__/toolbar_button_spec.js.snap
index e508cddd6f9..a63cca006da 100644
--- a/spec/frontend/content_editor/components/__snapshots__/toolbar_button_spec.js.snap
+++ b/spec/frontend/content_editor/components/__snapshots__/toolbar_button_spec.js.snap
@@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`content_editor/components/toolbar_button displays tertiary, small button with a provided label and icon 1`] = `
-"<b-button-stub size=\\"sm\\" variant=\\"default\\" type=\\"button\\" tag=\\"button\\" aria-label=\\"Bold\\" title=\\"Bold\\" class=\\"gl-button btn-default-tertiary btn-icon\\">
+exports[`content_editor/components/toolbar_button displays tertiary, medium button with a provided label and icon 1`] = `
+"<b-button-stub size=\\"md\\" variant=\\"default\\" type=\\"button\\" tag=\\"button\\" aria-label=\\"Bold\\" title=\\"Bold\\" class=\\"gl-button btn-default-tertiary btn-icon\\">
<!---->
<gl-icon-stub name=\\"bold\\" size=\\"16\\" class=\\"gl-button-icon\\"></gl-icon-stub>
<!---->
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
new file mode 100644
index 00000000000..3a15ea45f40
--- /dev/null
+++ b/spec/frontend/content_editor/components/bubble_menus/code_block_spec.js
@@ -0,0 +1,156 @@
+import { BubbleMenu } from '@tiptap/vue-2';
+import { GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
+import Vue from 'vue';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import CodeBlockBubbleMenu from '~/content_editor/components/bubble_menus/code_block.vue';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import codeBlockLanguageLoader from '~/content_editor/services/code_block_language_loader';
+import { createTestEditor, emitEditorEvent } from '../../test_utils';
+
+describe('content_editor/components/bubble_menus/code_block', () => {
+ let wrapper;
+ let tiptapEditor;
+ let bubbleMenu;
+ let eventHub;
+
+ const buildEditor = () => {
+ tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight] });
+ eventHub = eventHubFactory();
+ };
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(CodeBlockBubbleMenu, {
+ provide: {
+ tiptapEditor,
+ eventHub,
+ },
+ });
+ };
+
+ const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
+ const findDropdownItemsData = () =>
+ findDropdownItems().wrappers.map((x) => ({
+ text: x.text(),
+ visible: x.isVisible(),
+ checked: x.props('isChecked'),
+ }));
+
+ beforeEach(() => {
+ buildEditor();
+ buildWrapper();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders bubble menu component', async () => {
+ tiptapEditor.commands.insertContent('<pre>test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
+ expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']);
+ });
+
+ it('selects plaintext language by default', async () => {
+ tiptapEditor.commands.insertContent('<pre>test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Plain text');
+ });
+
+ it('selects appropriate language based on the code block', async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Javascript');
+ });
+
+ it("selects Custom (syntax) if the language doesn't exist in the list", async () => {
+ tiptapEditor.commands.insertContent('<pre lang="nomnoml">test</pre>');
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Custom (nomnoml)');
+ });
+
+ describe('copy button', () => {
+ it('copies the text of the code block', async () => {
+ jest.spyOn(navigator.clipboard, 'writeText');
+
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = Math.PI / 2;</pre>');
+
+ await wrapper.findByTestId('copy-code-block').vm.$emit('click');
+
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith('var a = Math.PI / 2;');
+ });
+ });
+
+ describe('delete button', () => {
+ it('deletes the code block', async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+
+ await wrapper.findByTestId('delete-code-block').vm.$emit('click');
+
+ expect(tiptapEditor.getText()).toBe('');
+ });
+ });
+
+ describe('when opened and search is changed', () => {
+ beforeEach(async () => {
+ tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
+
+ wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'js');
+
+ await Vue.nextTick();
+ });
+
+ it('shows dropdown items', () => {
+ expect(findDropdownItemsData()).toEqual([
+ { text: 'Javascript', visible: true, checked: true },
+ { text: 'Java', visible: true, checked: false },
+ { text: 'Javascript', visible: false, checked: false },
+ { text: 'JSON', visible: true, checked: false },
+ ]);
+ });
+
+ describe('when dropdown item is clicked', () => {
+ beforeEach(async () => {
+ jest.spyOn(codeBlockLanguageLoader, 'loadLanguage').mockResolvedValue();
+
+ findDropdownItems().at(1).vm.$emit('click');
+
+ await Vue.nextTick();
+ });
+
+ it('loads language', () => {
+ expect(codeBlockLanguageLoader.loadLanguage).toHaveBeenCalledWith('java');
+ });
+
+ it('sets code block', () => {
+ expect(tiptapEditor.getJSON()).toMatchObject({
+ content: [
+ {
+ type: 'codeBlock',
+ attrs: {
+ language: 'java',
+ },
+ },
+ ],
+ });
+ });
+
+ it('updates selected dropdown', () => {
+ expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Java');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js b/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js
new file mode 100644
index 00000000000..6479c0ba008
--- /dev/null
+++ b/spec/frontend/content_editor/components/bubble_menus/formatting_spec.js
@@ -0,0 +1,81 @@
+import { BubbleMenu } from '@tiptap/vue-2';
+import { mockTracking } from 'helpers/tracking_helper';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import FormattingBubbleMenu from '~/content_editor/components/bubble_menus/formatting.vue';
+
+import {
+ BUBBLE_MENU_TRACKING_ACTION,
+ CONTENT_EDITOR_TRACKING_LABEL,
+} from '~/content_editor/constants';
+import { createTestEditor } from '../../test_utils';
+
+describe('content_editor/components/bubble_menus/formatting', () => {
+ let wrapper;
+ let trackingSpy;
+ let tiptapEditor;
+
+ const buildEditor = () => {
+ tiptapEditor = createTestEditor();
+
+ jest.spyOn(tiptapEditor, 'isActive');
+ };
+
+ const buildWrapper = () => {
+ wrapper = shallowMountExtended(FormattingBubbleMenu, {
+ provide: {
+ tiptapEditor,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ trackingSpy = mockTracking(undefined, null, jest.spyOn);
+ buildEditor();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders bubble menu component', () => {
+ buildWrapper();
+ const bubbleMenu = wrapper.findComponent(BubbleMenu);
+
+ expect(bubbleMenu.props().editor).toBe(tiptapEditor);
+ expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']);
+ });
+
+ 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' }}
+ `('given a $testId toolbar control', ({ testId, controlProps }) => {
+ beforeEach(() => {
+ buildWrapper();
+ });
+
+ 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]);
+ });
+ });
+
+ it('tracks the execution of toolbar controls', () => {
+ const eventData = { contentType: 'italic', value: 1 };
+ const { contentType, value } = eventData;
+
+ wrapper.findByTestId(testId).vm.$emit('execute', eventData);
+
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, BUBBLE_MENU_TRACKING_ACTION, {
+ label: CONTENT_EDITOR_TRACKING_LABEL,
+ property: contentType,
+ value,
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/bubble_menus/link_spec.js b/spec/frontend/content_editor/components/bubble_menus/link_spec.js
new file mode 100644
index 00000000000..ba6d8da9584
--- /dev/null
+++ b/spec/frontend/content_editor/components/bubble_menus/link_spec.js
@@ -0,0 +1,227 @@
+import { GlLink, GlForm } from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import LinkBubbleMenu from '~/content_editor/components/bubble_menus/link.vue';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import Link from '~/content_editor/extensions/link';
+import { createTestEditor, emitEditorEvent } from '../../test_utils';
+
+const createFakeEvent = () => ({ preventDefault: jest.fn(), stopPropagation: jest.fn() });
+
+describe('content_editor/components/bubble_menus/link', () => {
+ let wrapper;
+ let tiptapEditor;
+ let contentEditor;
+ let bubbleMenu;
+ let eventHub;
+
+ const buildEditor = () => {
+ tiptapEditor = createTestEditor({ extensions: [Link] });
+ contentEditor = { resolveUrl: jest.fn() };
+ eventHub = eventHubFactory();
+ };
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(LinkBubbleMenu, {
+ provide: {
+ tiptapEditor,
+ contentEditor,
+ eventHub,
+ },
+ });
+ };
+
+ const expectLinkButtonsToExist = (exist = true) => {
+ expect(wrapper.findComponent(GlLink).exists()).toBe(exist);
+ expect(wrapper.findByTestId('copy-link-url').exists()).toBe(exist);
+ expect(wrapper.findByTestId('edit-link').exists()).toBe(exist);
+ expect(wrapper.findByTestId('remove-link').exists()).toBe(exist);
+ };
+
+ beforeEach(async () => {
+ buildEditor();
+ buildWrapper();
+
+ tiptapEditor
+ .chain()
+ .insertContent(
+ 'Download <a href="/path/to/project/-/wikis/uploads/my_file.pdf" data-canonical-src="uploads/my_file.pdf" title="Click here to download">PDF File</a>',
+ )
+ .setTextSelection(14) // put cursor in the middle of the link
+ .run();
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders bubble menu component', async () => {
+ expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
+ expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']);
+ });
+
+ it('shows a clickable link to the URL in the link node', async () => {
+ const link = wrapper.findComponent(GlLink);
+ expect(link.attributes()).toEqual(
+ expect.objectContaining({
+ href: '/path/to/project/-/wikis/uploads/my_file.pdf',
+ 'aria-label': 'uploads/my_file.pdf',
+ title: 'uploads/my_file.pdf',
+ target: '_blank',
+ }),
+ );
+ expect(link.text()).toBe('uploads/my_file.pdf');
+ });
+
+ describe('copy button', () => {
+ it('copies the canonical link to clipboard', async () => {
+ jest.spyOn(navigator.clipboard, 'writeText');
+
+ await wrapper.findByTestId('copy-link-url').vm.$emit('click');
+
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith('uploads/my_file.pdf');
+ });
+ });
+
+ describe('remove link button', () => {
+ it('removes the link', async () => {
+ await wrapper.findByTestId('remove-link').vm.$emit('click');
+
+ expect(tiptapEditor.getHTML()).toBe('<p>Download PDF File</p>');
+ });
+ });
+
+ describe('for a placeholder link', () => {
+ beforeEach(async () => {
+ tiptapEditor
+ .chain()
+ .clearContent()
+ .insertContent('Dummy link')
+ .selectAll()
+ .setLink({ href: '' })
+ .setTextSelection(4)
+ .run();
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+ });
+
+ it('directly opens the edit form for a placeholder link', async () => {
+ expectLinkButtonsToExist(false);
+
+ expect(wrapper.findComponent(GlForm).exists()).toBe(true);
+ });
+
+ it('removes the link on clicking apply (if no change)', async () => {
+ await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
+
+ expect(tiptapEditor.getHTML()).toBe('<p>Dummy link</p>');
+ });
+
+ it('removes the link on clicking cancel', async () => {
+ await wrapper.findByTestId('cancel-link').vm.$emit('click');
+
+ expect(tiptapEditor.getHTML()).toBe('<p>Dummy link</p>');
+ });
+ });
+
+ describe('edit button', () => {
+ let linkHrefInput;
+ let linkTitleInput;
+
+ beforeEach(async () => {
+ await wrapper.findByTestId('edit-link').vm.$emit('click');
+
+ linkHrefInput = wrapper.findByTestId('link-href');
+ linkTitleInput = wrapper.findByTestId('link-title');
+ });
+
+ it('hides the link and copy/edit/remove link buttons', async () => {
+ expectLinkButtonsToExist(false);
+ });
+
+ it('shows a form to edit the link', () => {
+ expect(wrapper.findComponent(GlForm).exists()).toBe(true);
+
+ expect(linkHrefInput.element.value).toBe('uploads/my_file.pdf');
+ expect(linkTitleInput.element.value).toBe('Click here to download');
+ });
+
+ it('extends selection to select the entire link', () => {
+ const { from, to } = tiptapEditor.state.selection;
+
+ expect(from).toBe(10);
+ expect(to).toBe(18);
+ });
+
+ it('shows the copy/edit/remove link buttons again if selection changes to another non-link and then back again to a link', async () => {
+ expectLinkButtonsToExist(false);
+
+ tiptapEditor.commands.setTextSelection(3);
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ tiptapEditor.commands.setTextSelection(14);
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ expectLinkButtonsToExist(true);
+ expect(wrapper.findComponent(GlForm).exists()).toBe(false);
+ });
+
+ describe('after making changes in the form and clicking apply', () => {
+ beforeEach(async () => {
+ linkHrefInput.setValue('https://google.com');
+ linkTitleInput.setValue('Search Google');
+
+ contentEditor.resolveUrl.mockResolvedValue('https://google.com');
+
+ await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
+ });
+
+ it('updates prosemirror doc with new link', async () => {
+ expect(tiptapEditor.getHTML()).toBe(
+ '<p>Download <a target="_blank" rel="noopener noreferrer nofollow" href="https://google.com" title="Search Google" canonicalsrc="https://google.com">PDF File</a></p>',
+ );
+ });
+
+ it('updates the link in the bubble menu', () => {
+ const link = wrapper.findComponent(GlLink);
+ expect(link.attributes()).toEqual(
+ expect.objectContaining({
+ href: 'https://google.com',
+ 'aria-label': 'https://google.com',
+ title: 'https://google.com',
+ target: '_blank',
+ }),
+ );
+ expect(link.text()).toBe('https://google.com');
+ });
+ });
+
+ describe('after making changes in the form and clicking cancel', () => {
+ beforeEach(async () => {
+ linkHrefInput.setValue('https://google.com');
+ linkTitleInput.setValue('Search Google');
+
+ await wrapper.findByTestId('cancel-link').vm.$emit('click');
+ });
+
+ it('hides the form and shows the copy/edit/remove link buttons', () => {
+ expectLinkButtonsToExist();
+ });
+
+ it('resets the form with old values of the link from prosemirror', async () => {
+ // click edit once again to show the form back
+ await wrapper.findByTestId('edit-link').vm.$emit('click');
+
+ linkHrefInput = wrapper.findByTestId('link-href');
+ linkTitleInput = wrapper.findByTestId('link-title');
+
+ expect(linkHrefInput.element.value).toBe('uploads/my_file.pdf');
+ expect(linkTitleInput.element.value).toBe('Click here to download');
+ });
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/components/bubble_menus/media_spec.js b/spec/frontend/content_editor/components/bubble_menus/media_spec.js
new file mode 100644
index 00000000000..8839caea80e
--- /dev/null
+++ b/spec/frontend/content_editor/components/bubble_menus/media_spec.js
@@ -0,0 +1,234 @@
+import { GlLink, GlForm } from '@gitlab/ui';
+import { BubbleMenu } from '@tiptap/vue-2';
+import { mountExtended } from 'helpers/vue_test_utils_helper';
+import MediaBubbleMenu from '~/content_editor/components/bubble_menus/media.vue';
+import eventHubFactory from '~/helpers/event_hub_factory';
+import Image from '~/content_editor/extensions/image';
+import Audio from '~/content_editor/extensions/audio';
+import Video from '~/content_editor/extensions/video';
+import { createTestEditor, emitEditorEvent, mockChainedCommands } from '../../test_utils';
+import {
+ PROJECT_WIKI_ATTACHMENT_IMAGE_HTML,
+ PROJECT_WIKI_ATTACHMENT_AUDIO_HTML,
+ PROJECT_WIKI_ATTACHMENT_VIDEO_HTML,
+} from '../../test_constants';
+
+const TIPTAP_IMAGE_HTML = `<p>
+ <img src="https://gitlab.com/favicon.png" alt="gitlab favicon" title="gitlab favicon" data-canonical-src="https://gitlab.com/favicon.png">
+</p>`;
+
+const TIPTAP_AUDIO_HTML = `<p>
+ <span class="media-container audio-container"><audio src="https://gitlab.com/favicon.png" controls="true" data-setup="{}" data-title="gitlab favicon"></audio><a href="https://gitlab.com/favicon.png">gitlab favicon</a></span>
+</p>`;
+
+const TIPTAP_VIDEO_HTML = `<p>
+ <span class="media-container video-container"><video src="https://gitlab.com/favicon.png" controls="true" data-setup="{}" data-title="gitlab favicon"></video><a href="https://gitlab.com/favicon.png">gitlab favicon</a></span>
+</p>`;
+
+const createFakeEvent = () => ({ preventDefault: jest.fn(), stopPropagation: jest.fn() });
+
+describe.each`
+ mediaType | mediaHTML | filePath | mediaOutputHTML
+ ${'image'} | ${PROJECT_WIKI_ATTACHMENT_IMAGE_HTML} | ${'test-file.png'} | ${TIPTAP_IMAGE_HTML}
+ ${'audio'} | ${PROJECT_WIKI_ATTACHMENT_AUDIO_HTML} | ${'test-file.mp3'} | ${TIPTAP_AUDIO_HTML}
+ ${'video'} | ${PROJECT_WIKI_ATTACHMENT_VIDEO_HTML} | ${'test-file.mp4'} | ${TIPTAP_VIDEO_HTML}
+`(
+ 'content_editor/components/bubble_menus/media ($mediaType)',
+ ({ mediaType, mediaHTML, filePath, mediaOutputHTML }) => {
+ let wrapper;
+ let tiptapEditor;
+ let contentEditor;
+ let bubbleMenu;
+ let eventHub;
+
+ const buildEditor = () => {
+ tiptapEditor = createTestEditor({ extensions: [Image, Audio, Video] });
+ contentEditor = { resolveUrl: jest.fn() };
+ eventHub = eventHubFactory();
+ };
+
+ const buildWrapper = () => {
+ wrapper = mountExtended(MediaBubbleMenu, {
+ provide: {
+ tiptapEditor,
+ contentEditor,
+ eventHub,
+ },
+ });
+ };
+
+ const selectFile = async (file) => {
+ const input = wrapper.find({ ref: 'fileSelector' });
+
+ // override the property definition because `input.files` isn't directly modifyable
+ Object.defineProperty(input.element, 'files', { value: [file], writable: true });
+ await input.trigger('change');
+ };
+
+ const expectLinkButtonsToExist = (exist = true) => {
+ expect(wrapper.findComponent(GlLink).exists()).toBe(exist);
+ expect(wrapper.findByTestId('copy-media-src').exists()).toBe(exist);
+ expect(wrapper.findByTestId('edit-media').exists()).toBe(exist);
+ expect(wrapper.findByTestId('delete-media').exists()).toBe(exist);
+ };
+
+ beforeEach(async () => {
+ buildEditor();
+ buildWrapper();
+
+ tiptapEditor
+ .chain()
+ .insertContent(mediaHTML)
+ .setNodeSelection(4) // select the media
+ .run();
+
+ contentEditor.resolveUrl.mockResolvedValue(`/group1/project1/-/wikis/${filePath}`);
+
+ await emitEditorEvent({ event: 'transaction', tiptapEditor });
+
+ bubbleMenu = wrapper.findComponent(BubbleMenu);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders bubble menu component', async () => {
+ expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
+ expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base', 'gl-bg-white']);
+ });
+
+ it('shows a clickable link to the image', async () => {
+ const link = wrapper.findComponent(GlLink);
+ expect(link.attributes()).toEqual(
+ expect.objectContaining({
+ href: `/group1/project1/-/wikis/${filePath}`,
+ 'aria-label': filePath,
+ title: filePath,
+ target: '_blank',
+ }),
+ );
+ expect(link.text()).toBe(filePath);
+ });
+
+ describe('copy button', () => {
+ it(`copies the canonical link to the ${mediaType} to clipboard`, async () => {
+ jest.spyOn(navigator.clipboard, 'writeText');
+
+ await wrapper.findByTestId('copy-media-src').vm.$emit('click');
+
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(filePath);
+ });
+ });
+
+ describe(`remove ${mediaType} button`, () => {
+ it(`removes the ${mediaType}`, async () => {
+ await wrapper.findByTestId('delete-media').vm.$emit('click');
+
+ expect(tiptapEditor.getHTML()).toBe('<p>\n \n</p>');
+ });
+ });
+
+ describe(`replace ${mediaType} button`, () => {
+ it('uploads and replaces the selected image when file input changes', async () => {
+ const commands = mockChainedCommands(tiptapEditor, [
+ 'focus',
+ 'deleteSelection',
+ 'uploadAttachment',
+ 'run',
+ ]);
+ const file = new File(['foo'], 'foo.png', { type: 'image/png' });
+
+ await wrapper.findByTestId('replace-media').vm.$emit('click');
+ await selectFile(file);
+
+ expect(commands.focus).toHaveBeenCalled();
+ expect(commands.deleteSelection).toHaveBeenCalled();
+ expect(commands.uploadAttachment).toHaveBeenCalledWith({ file });
+ expect(commands.run).toHaveBeenCalled();
+ });
+ });
+
+ describe('edit button', () => {
+ let mediaSrcInput;
+ let mediaTitleInput;
+ let mediaAltInput;
+
+ beforeEach(async () => {
+ await wrapper.findByTestId('edit-media').vm.$emit('click');
+
+ mediaSrcInput = wrapper.findByTestId('media-src');
+ mediaTitleInput = wrapper.findByTestId('media-title');
+ mediaAltInput = wrapper.findByTestId('media-alt');
+ });
+
+ it('hides the link and copy/edit/remove link buttons', async () => {
+ expectLinkButtonsToExist(false);
+ });
+
+ it(`shows a form to edit the ${mediaType} src/title/alt`, () => {
+ expect(wrapper.findComponent(GlForm).exists()).toBe(true);
+
+ expect(mediaSrcInput.element.value).toBe(filePath);
+ expect(mediaTitleInput.element.value).toBe('');
+ expect(mediaAltInput.element.value).toBe('test-file');
+ });
+
+ describe('after making changes in the form and clicking apply', () => {
+ beforeEach(async () => {
+ mediaSrcInput.setValue('https://gitlab.com/favicon.png');
+ mediaAltInput.setValue('gitlab favicon');
+ mediaTitleInput.setValue('gitlab favicon');
+
+ contentEditor.resolveUrl.mockResolvedValue('https://gitlab.com/favicon.png');
+
+ await wrapper.findComponent(GlForm).vm.$emit('submit', createFakeEvent());
+ });
+
+ it(`updates prosemirror doc with new src to the ${mediaType}`, async () => {
+ expect(tiptapEditor.getHTML()).toBe(mediaOutputHTML);
+ });
+
+ it(`updates the link to the ${mediaType} in the bubble menu`, () => {
+ const link = wrapper.findComponent(GlLink);
+ expect(link.attributes()).toEqual(
+ expect.objectContaining({
+ href: 'https://gitlab.com/favicon.png',
+ 'aria-label': 'https://gitlab.com/favicon.png',
+ title: 'https://gitlab.com/favicon.png',
+ target: '_blank',
+ }),
+ );
+ expect(link.text()).toBe('https://gitlab.com/favicon.png');
+ });
+ });
+
+ describe('after making changes in the form and clicking cancel', () => {
+ beforeEach(async () => {
+ mediaSrcInput.setValue('https://gitlab.com/favicon.png');
+ mediaAltInput.setValue('gitlab favicon');
+ mediaTitleInput.setValue('gitlab favicon');
+
+ await wrapper.findByTestId('cancel-editing-media').vm.$emit('click');
+ });
+
+ it('hides the form and shows the copy/edit/remove link buttons', () => {
+ expectLinkButtonsToExist();
+ });
+
+ it(`resets the form with old values of the ${mediaType} from prosemirror`, async () => {
+ // click edit once again to show the form back
+ await wrapper.findByTestId('edit-media').vm.$emit('click');
+
+ mediaSrcInput = wrapper.findByTestId('media-src');
+ mediaTitleInput = wrapper.findByTestId('media-title');
+ mediaAltInput = wrapper.findByTestId('media-alt');
+
+ expect(mediaSrcInput.element.value).toBe(filePath);
+ expect(mediaAltInput.element.value).toBe('test-file');
+ expect(mediaTitleInput.element.value).toBe('');
+ });
+ });
+ });
+ },
+);
diff --git a/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js b/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js
deleted file mode 100644
index 074c311495f..00000000000
--- a/spec/frontend/content_editor/components/code_block_bubble_menu_spec.js
+++ /dev/null
@@ -1,142 +0,0 @@
-import { BubbleMenu } from '@tiptap/vue-2';
-import { GlButton, GlDropdown, GlDropdownItem, GlSearchBoxByType } from '@gitlab/ui';
-import Vue from 'vue';
-import { mountExtended } from 'helpers/vue_test_utils_helper';
-import CodeBlockBubbleMenu from '~/content_editor/components/code_block_bubble_menu.vue';
-import eventHubFactory from '~/helpers/event_hub_factory';
-import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
-import codeBlockLanguageLoader from '~/content_editor/services/code_block_language_loader';
-import { createTestEditor, emitEditorEvent } from '../test_utils';
-
-describe('content_editor/components/code_block_bubble_menu', () => {
- let wrapper;
- let tiptapEditor;
- let bubbleMenu;
- let eventHub;
-
- const buildEditor = () => {
- tiptapEditor = createTestEditor({ extensions: [CodeBlockHighlight] });
- eventHub = eventHubFactory();
- };
-
- const buildWrapper = () => {
- wrapper = mountExtended(CodeBlockBubbleMenu, {
- provide: {
- tiptapEditor,
- eventHub,
- },
- });
- };
-
- const findDropdownItems = () => wrapper.findAllComponents(GlDropdownItem);
- const findDropdownItemsData = () =>
- findDropdownItems().wrappers.map((x) => ({
- text: x.text(),
- visible: x.isVisible(),
- checked: x.props('isChecked'),
- }));
-
- beforeEach(() => {
- buildEditor();
- buildWrapper();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders bubble menu component', async () => {
- tiptapEditor.commands.insertContent('<pre>test</pre>');
- bubbleMenu = wrapper.findComponent(BubbleMenu);
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- expect(bubbleMenu.props('editor')).toBe(tiptapEditor);
- expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base']);
- });
-
- it('selects plaintext language by default', async () => {
- tiptapEditor.commands.insertContent('<pre>test</pre>');
- bubbleMenu = wrapper.findComponent(BubbleMenu);
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Plain text');
- });
-
- it('selects appropriate language based on the code block', async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
- bubbleMenu = wrapper.findComponent(BubbleMenu);
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Javascript');
- });
-
- it("selects Custom (syntax) if the language doesn't exist in the list", async () => {
- tiptapEditor.commands.insertContent('<pre lang="nomnoml">test</pre>');
- bubbleMenu = wrapper.findComponent(BubbleMenu);
-
- await emitEditorEvent({ event: 'transaction', tiptapEditor });
-
- expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Custom (nomnoml)');
- });
-
- it('delete button deletes the code block', async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
-
- await wrapper.findComponent(GlButton).vm.$emit('click');
-
- expect(tiptapEditor.getText()).toBe('');
- });
-
- describe('when opened and search is changed', () => {
- beforeEach(async () => {
- tiptapEditor.commands.insertContent('<pre lang="javascript">var a = 2;</pre>');
-
- wrapper.findComponent(GlSearchBoxByType).vm.$emit('input', 'js');
-
- await Vue.nextTick();
- });
-
- it('shows dropdown items', () => {
- expect(findDropdownItemsData()).toEqual([
- { text: 'Javascript', visible: true, checked: true },
- { text: 'Java', visible: true, checked: false },
- { text: 'Javascript', visible: false, checked: false },
- { text: 'JSON', visible: true, checked: false },
- ]);
- });
-
- describe('when dropdown item is clicked', () => {
- beforeEach(async () => {
- jest.spyOn(codeBlockLanguageLoader, 'loadLanguages').mockResolvedValue();
-
- findDropdownItems().at(1).vm.$emit('click');
-
- await Vue.nextTick();
- });
-
- it('loads language', () => {
- expect(codeBlockLanguageLoader.loadLanguages).toHaveBeenCalledWith(['java']);
- });
-
- it('sets code block', () => {
- expect(tiptapEditor.getJSON()).toMatchObject({
- content: [
- {
- type: 'codeBlock',
- attrs: {
- language: 'java',
- },
- },
- ],
- });
- });
-
- it('updates selected dropdown', () => {
- expect(wrapper.findComponent(GlDropdown).props('text')).toBe('Java');
- });
- });
- });
-});
diff --git a/spec/frontend/content_editor/components/content_editor_spec.js b/spec/frontend/content_editor/components/content_editor_spec.js
index 73fcfeab8bc..9ee3b017831 100644
--- a/spec/frontend/content_editor/components/content_editor_spec.js
+++ b/spec/frontend/content_editor/components/content_editor_spec.js
@@ -4,7 +4,7 @@ import ContentEditor from '~/content_editor/components/content_editor.vue';
import ContentEditorAlert from '~/content_editor/components/content_editor_alert.vue';
import ContentEditorProvider from '~/content_editor/components/content_editor_provider.vue';
import EditorStateObserver from '~/content_editor/components/editor_state_observer.vue';
-import FormattingBubbleMenu from '~/content_editor/components/formatting_bubble_menu.vue';
+import FormattingBubbleMenu from '~/content_editor/components/bubble_menus/formatting.vue';
import TopToolbar from '~/content_editor/components/top_toolbar.vue';
import LoadingIndicator from '~/content_editor/components/loading_indicator.vue';
import { emitEditorEvent } from '../test_utils';
diff --git a/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js b/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js
deleted file mode 100644
index 192ddee78c6..00000000000
--- a/spec/frontend/content_editor/components/formatting_bubble_menu_spec.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import { BubbleMenu } from '@tiptap/vue-2';
-import { mockTracking } from 'helpers/tracking_helper';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import FormattingBubbleMenu from '~/content_editor/components/formatting_bubble_menu.vue';
-
-import {
- BUBBLE_MENU_TRACKING_ACTION,
- CONTENT_EDITOR_TRACKING_LABEL,
-} from '~/content_editor/constants';
-import { createTestEditor } from '../test_utils';
-
-describe('content_editor/components/formatting_bubble_menu', () => {
- let wrapper;
- let trackingSpy;
- let tiptapEditor;
-
- const buildEditor = () => {
- tiptapEditor = createTestEditor();
-
- jest.spyOn(tiptapEditor, 'isActive');
- };
-
- const buildWrapper = () => {
- wrapper = shallowMountExtended(FormattingBubbleMenu, {
- provide: {
- tiptapEditor,
- },
- });
- };
-
- beforeEach(() => {
- trackingSpy = mockTracking(undefined, null, jest.spyOn);
- buildEditor();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders bubble menu component', () => {
- buildWrapper();
- const bubbleMenu = wrapper.findComponent(BubbleMenu);
-
- expect(bubbleMenu.props().editor).toBe(tiptapEditor);
- expect(bubbleMenu.classes()).toEqual(['gl-shadow', 'gl-rounded-base']);
- });
-
- describe.each`
- testId | controlProps
- ${'bold'} | ${{ contentType: 'bold', iconName: 'bold', label: 'Bold text', editorCommand: 'toggleBold', size: 'medium', category: 'primary' }}
- ${'italic'} | ${{ contentType: 'italic', iconName: 'italic', label: 'Italic text', editorCommand: 'toggleItalic', size: 'medium', category: 'primary' }}
- ${'strike'} | ${{ contentType: 'strike', iconName: 'strikethrough', label: 'Strikethrough', editorCommand: 'toggleStrike', size: 'medium', category: 'primary' }}
- ${'code'} | ${{ contentType: 'code', iconName: 'code', label: 'Code', editorCommand: 'toggleCode', size: 'medium', category: 'primary' }}
- `('given a $testId toolbar control', ({ testId, controlProps }) => {
- beforeEach(() => {
- buildWrapper();
- });
-
- 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)).toBe(controlProps[propName]);
- });
- });
-
- it('tracks the execution of toolbar controls', () => {
- const eventData = { contentType: 'italic', value: 1 };
- const { contentType, value } = eventData;
-
- wrapper.findByTestId(testId).vm.$emit('execute', eventData);
-
- expect(trackingSpy).toHaveBeenCalledWith(undefined, BUBBLE_MENU_TRACKING_ACTION, {
- label: CONTENT_EDITOR_TRACKING_LABEL,
- property: contentType,
- value,
- });
- });
- });
-});
diff --git a/spec/frontend/content_editor/components/toolbar_button_spec.js b/spec/frontend/content_editor/components/toolbar_button_spec.js
index ce50482302d..1f1f7b338c6 100644
--- a/spec/frontend/content_editor/components/toolbar_button_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_button_spec.js
@@ -46,7 +46,7 @@ describe('content_editor/components/toolbar_button', () => {
wrapper.destroy();
});
- it('displays tertiary, small button with a provided label and icon', () => {
+ it('displays tertiary, medium button with a provided label and icon', () => {
buildWrapper();
expect(findButton().html()).toMatchSnapshot();
diff --git a/spec/frontend/content_editor/components/wrappers/code_block_spec.js b/spec/frontend/content_editor/components/wrappers/code_block_spec.js
new file mode 100644
index 00000000000..a564959a3a6
--- /dev/null
+++ b/spec/frontend/content_editor/components/wrappers/code_block_spec.js
@@ -0,0 +1,71 @@
+import { nextTick } from 'vue';
+import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
+import { shallowMount } from '@vue/test-utils';
+import CodeBlockWrapper from '~/content_editor/components/wrappers/code_block.vue';
+import codeBlockLanguageLoader from '~/content_editor/services/code_block_language_loader';
+
+jest.mock('~/content_editor/services/code_block_language_loader');
+
+describe('content/components/wrappers/code_block', () => {
+ const language = 'yaml';
+ let wrapper;
+ let updateAttributesFn;
+
+ const createWrapper = async (nodeAttrs = { language }) => {
+ updateAttributesFn = jest.fn();
+
+ wrapper = shallowMount(CodeBlockWrapper, {
+ propsData: {
+ node: {
+ attrs: nodeAttrs,
+ },
+ updateAttributes: updateAttributesFn,
+ },
+ });
+ };
+
+ beforeEach(() => {
+ codeBlockLanguageLoader.findLanguageBySyntax.mockReturnValue({ syntax: language });
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders a node-view-wrapper as a pre element', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewWrapper).props().as).toBe('pre');
+ expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-relative');
+ });
+
+ it('adds content-editor-code-block class to the pre element', () => {
+ createWrapper();
+ expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('content-editor-code-block');
+ });
+
+ it('renders a node-view-content as a code element', () => {
+ createWrapper();
+
+ expect(wrapper.findComponent(NodeViewContent).props().as).toBe('code');
+ });
+
+ it('renders label indicating that code block is frontmatter', () => {
+ createWrapper({ isFrontmatter: true, language });
+
+ const label = wrapper.find('[data-testid="frontmatter-label"]');
+
+ expect(label.text()).toEqual('frontmatter:yaml');
+ expect(label.classes()).toEqual(['gl-absolute', 'gl-top-0', 'gl-right-3']);
+ });
+
+ it('loads code block’s syntax highlight language', async () => {
+ createWrapper();
+
+ expect(codeBlockLanguageLoader.loadLanguage).toHaveBeenCalledWith(language);
+
+ await nextTick();
+
+ expect(updateAttributesFn).toHaveBeenCalledWith({ language });
+ });
+});
diff --git a/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js b/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js
deleted file mode 100644
index 415f1314a36..00000000000
--- a/spec/frontend/content_editor/components/wrappers/frontmatter_spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import { NodeViewWrapper, NodeViewContent } from '@tiptap/vue-2';
-import { shallowMount } from '@vue/test-utils';
-import FrontmatterWrapper from '~/content_editor/components/wrappers/frontmatter.vue';
-
-describe('content/components/wrappers/frontmatter', () => {
- let wrapper;
-
- const createWrapper = async (nodeAttrs = { language: 'yaml' }) => {
- wrapper = shallowMount(FrontmatterWrapper, {
- propsData: {
- node: {
- attrs: nodeAttrs,
- },
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders a node-view-wrapper as a pre element', () => {
- createWrapper();
-
- expect(wrapper.findComponent(NodeViewWrapper).props().as).toBe('pre');
- expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-relative');
- });
-
- it('adds content-editor-code-block class to the pre element', () => {
- createWrapper();
- expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('content-editor-code-block');
- });
-
- it('renders a node-view-content as a code element', () => {
- createWrapper();
-
- expect(wrapper.findComponent(NodeViewContent).props().as).toBe('code');
- });
-
- it('renders label indicating that code block is frontmatter', () => {
- createWrapper();
-
- const label = wrapper.find('[data-testid="frontmatter-label"]');
-
- expect(label.text()).toEqual('frontmatter:yaml');
- expect(label.classes()).toEqual(['gl-absolute', 'gl-top-0', 'gl-right-3']);
- });
-});
diff --git a/spec/frontend/content_editor/components/wrappers/media_spec.js b/spec/frontend/content_editor/components/wrappers/media_spec.js
deleted file mode 100644
index 3e95e2f3914..00000000000
--- a/spec/frontend/content_editor/components/wrappers/media_spec.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import { GlLoadingIcon } from '@gitlab/ui';
-import { NodeViewWrapper } from '@tiptap/vue-2';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import MediaWrapper from '~/content_editor/components/wrappers/media.vue';
-
-describe('content/components/wrappers/media', () => {
- let wrapper;
-
- const createWrapper = async (nodeAttrs = {}) => {
- wrapper = shallowMountExtended(MediaWrapper, {
- propsData: {
- node: {
- attrs: nodeAttrs,
- type: {
- name: 'image',
- },
- },
- },
- });
- };
- const findMedia = () => wrapper.findByTestId('media');
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders a node-view-wrapper with display-inline-block class', () => {
- createWrapper();
-
- expect(wrapper.findComponent(NodeViewWrapper).classes()).toContain('gl-display-inline-block');
- });
-
- it('renders an image that displays the node src', () => {
- const src = 'foobar.png';
-
- createWrapper({ src });
-
- expect(findMedia().attributes().src).toBe(src);
- });
-
- describe('when uploading', () => {
- beforeEach(() => {
- createWrapper({ uploading: true });
- });
-
- it('renders a gl-loading-icon component', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
-
- it('adds gl-opacity-5 class selector to the media tag', () => {
- expect(findMedia().classes()).toContain('gl-opacity-5');
- });
- });
-
- describe('when not uploading', () => {
- beforeEach(() => {
- createWrapper({ uploading: false });
- });
-
- it('does not render a gl-loading-icon component', () => {
- expect(findLoadingIcon().exists()).toBe(false);
- });
-
- it('does not add gl-opacity-5 class selector to the media tag', () => {
- expect(findMedia().classes()).not.toContain('gl-opacity-5');
- });
- });
-});
diff --git a/spec/frontend/content_editor/extensions/attachment_spec.js b/spec/frontend/content_editor/extensions/attachment_spec.js
index d3c42104e47..d528096be34 100644
--- a/spec/frontend/content_editor/extensions/attachment_spec.js
+++ b/spec/frontend/content_editor/extensions/attachment_spec.js
@@ -11,32 +11,12 @@ import { VARIANT_DANGER } from '~/flash';
import httpStatus from '~/lib/utils/http_status';
import eventHubFactory from '~/helpers/event_hub_factory';
import { createTestEditor, createDocBuilder } from '../test_utils';
-
-const PROJECT_WIKI_ATTACHMENT_IMAGE_HTML = `<p data-sourcepos="1:1-1:27" dir="auto">
- <a class="no-attachment-icon" href="/group1/project1/-/wikis/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="test-file.png">
- <img alt="test-file" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png">
- </a>
-</p>`;
-
-const PROJECT_WIKI_ATTACHMENT_VIDEO_HTML = `<p data-sourcepos="1:1-1:132" dir="auto">
- <span class="media-container video-container">
- <video src="/group1/project1/-/wikis/test-file.mp4" controls="true" data-setup="{}" data-title="test-file" width="400" preload="metadata" data-canonical-src="test-file.mp4">
- </video>
- <a href="/himkp/test/-/wikis/test-file.mp4" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp4">test-file</a>
- </span>
-</p>`;
-
-const PROJECT_WIKI_ATTACHMENT_AUDIO_HTML = `<p data-sourcepos="3:1-3:74" dir="auto">
- <span class="media-container audio-container">
- <audio src="/himkp/test/-/wikis/test-file.mp3" controls="true" data-setup="{}" data-title="test-file" data-canonical-src="test-file.mp3">
- </audio>
- <a href="/himkp/test/-/wikis/test-file.mp3" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp3">test-file</a>
- </span>
-</p>`;
-
-const PROJECT_WIKI_ATTACHMENT_LINK_HTML = `<p data-sourcepos="1:1-1:26" dir="auto">
- <a href="/group1/project1/-/wikis/test-file.zip" data-canonical-src="test-file.zip">test-file</a>
-</p>`;
+import {
+ PROJECT_WIKI_ATTACHMENT_IMAGE_HTML,
+ PROJECT_WIKI_ATTACHMENT_AUDIO_HTML,
+ PROJECT_WIKI_ATTACHMENT_VIDEO_HTML,
+ PROJECT_WIKI_ATTACHMENT_LINK_HTML,
+} from '../test_constants';
describe('content_editor/extensions/attachment', () => {
let tiptapEditor;
diff --git a/spec/frontend/content_editor/extensions/code_block_highlight_spec.js b/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
index 02e5b1dc271..fc8460c7f84 100644
--- a/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
+++ b/spec/frontend/content_editor/extensions/code_block_highlight_spec.js
@@ -1,4 +1,5 @@
import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import languageLoader from '~/content_editor/services/code_block_language_loader';
import { createTestEditor, createDocBuilder, triggerNodeInputRule } from '../test_utils';
const CODE_BLOCK_HTML = `<pre class="code highlight js-syntax-highlight language-javascript" lang="javascript" v-pre="true">
@@ -9,20 +10,20 @@ const CODE_BLOCK_HTML = `<pre class="code highlight js-syntax-highlight language
</code>
</pre>`;
+jest.mock('~/content_editor/services/code_block_language_loader');
+
describe('content_editor/extensions/code_block_highlight', () => {
let parsedCodeBlockHtmlFixture;
let tiptapEditor;
let doc;
let codeBlock;
- let languageLoader;
const parseHTML = (html) => new DOMParser().parseFromString(html, 'text/html');
const preElement = () => parsedCodeBlockHtmlFixture.querySelector('pre');
beforeEach(() => {
- languageLoader = { loadLanguages: jest.fn() };
tiptapEditor = createTestEditor({
- extensions: [CodeBlockHighlight.configure({ languageLoader })],
+ extensions: [CodeBlockHighlight],
});
({
@@ -70,6 +71,8 @@ describe('content_editor/extensions/code_block_highlight', () => {
const language = 'javascript';
beforeEach(() => {
+ languageLoader.loadLanguageFromInputRule.mockReturnValueOnce({ language });
+
triggerNodeInputRule({
tiptapEditor,
inputRuleText: `${inputRule}${language} `,
@@ -83,7 +86,9 @@ describe('content_editor/extensions/code_block_highlight', () => {
});
it('loads language when language loader is available', () => {
- expect(languageLoader.loadLanguages).toHaveBeenCalledWith([language]);
+ expect(languageLoader.loadLanguageFromInputRule).toHaveBeenCalledWith(
+ expect.arrayContaining([`${inputRule}${language} `, language]),
+ );
});
});
});
diff --git a/spec/frontend/content_editor/extensions/diagram_spec.js b/spec/frontend/content_editor/extensions/diagram_spec.js
new file mode 100644
index 00000000000..b8d9e0b5aeb
--- /dev/null
+++ b/spec/frontend/content_editor/extensions/diagram_spec.js
@@ -0,0 +1,16 @@
+import Diagram from '~/content_editor/extensions/diagram';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+
+describe('content_editor/extensions/diagram', () => {
+ it('inherits from code block highlight extension', () => {
+ expect(Diagram.parent).toBe(CodeBlockHighlight);
+ });
+
+ it('sets isDiagram attribute to true by default', () => {
+ expect(Diagram.config.addAttributes()).toEqual(
+ expect.objectContaining({
+ isDiagram: { default: true },
+ }),
+ );
+ });
+});
diff --git a/spec/frontend/content_editor/extensions/frontmatter_spec.js b/spec/frontend/content_editor/extensions/frontmatter_spec.js
index 4f80c2cb81a..9bd29070858 100644
--- a/spec/frontend/content_editor/extensions/frontmatter_spec.js
+++ b/spec/frontend/content_editor/extensions/frontmatter_spec.js
@@ -22,6 +22,10 @@ describe('content_editor/extensions/frontmatter', () => {
}));
});
+ it('inherits from code block highlight extension', () => {
+ expect(Frontmatter.parent).toBe(CodeBlockHighlight);
+ });
+
it('does not insert a frontmatter block when executing code block input rule', () => {
const expectedDoc = doc(codeBlock({ language: 'plaintext' }, ''));
const inputRuleText = '``` ';
@@ -31,6 +35,14 @@ describe('content_editor/extensions/frontmatter', () => {
expect(tiptapEditor.getJSON()).toEqual(expectedDoc.toJSON());
});
+ it('sets isFrontmatter attribute to true by default', () => {
+ expect(Frontmatter.config.addAttributes()).toEqual(
+ expect.objectContaining({
+ isFrontmatter: { default: true },
+ }),
+ );
+ });
+
it.each`
command | result | resultDesc
${'toggleCodeBlock'} | ${() => doc(codeBlock(''))} | ${'code block element'}
diff --git a/spec/frontend/content_editor/extensions/paste_markdown_spec.js b/spec/frontend/content_editor/extensions/paste_markdown_spec.js
index 8f734c7dabc..5d46c2c0650 100644
--- a/spec/frontend/content_editor/extensions/paste_markdown_spec.js
+++ b/spec/frontend/content_editor/extensions/paste_markdown_spec.js
@@ -1,4 +1,7 @@
import PasteMarkdown from '~/content_editor/extensions/paste_markdown';
+import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight';
+import Diagram from '~/content_editor/extensions/diagram';
+import Frontmatter from '~/content_editor/extensions/frontmatter';
import Bold from '~/content_editor/extensions/bold';
import { VARIANT_DANGER } from '~/flash';
import eventHubFactory from '~/helpers/event_hub_factory';
@@ -11,6 +14,12 @@ 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 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>';
+const PARAGRAPH_HTML = '<p>Just a regular paragraph</p>';
+
describe('content_editor/extensions/paste_markdown', () => {
let tiptapEditor;
let doc;
@@ -27,7 +36,13 @@ describe('content_editor/extensions/paste_markdown', () => {
jest.spyOn(eventHub, '$emit');
tiptapEditor = createTestEditor({
- extensions: [PasteMarkdown.configure({ renderMarkdown, eventHub }), Bold],
+ extensions: [
+ Bold,
+ CodeBlockHighlight,
+ Diagram,
+ Frontmatter,
+ PasteMarkdown.configure({ renderMarkdown, eventHub }),
+ ],
});
({
@@ -35,7 +50,7 @@ describe('content_editor/extensions/paste_markdown', () => {
} = createDocBuilder({
tiptapEditor,
names: {
- Bold: { markType: Bold.name },
+ bold: { markType: Bold.name },
},
}));
});
@@ -47,13 +62,11 @@ describe('content_editor/extensions/paste_markdown', () => {
};
const triggerPasteEventHandler = (event) => {
- let handled = false;
-
- tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
- handled = eventHandler(tiptapEditor.view, event);
+ return new Promise((resolve) => {
+ tiptapEditor.view.someProp('handlePaste', (eventHandler) => {
+ resolve(eventHandler(tiptapEditor.view, event));
+ });
});
-
- return handled;
};
const triggerPasteEventHandlerAndWaitForTransaction = (event) => {
@@ -73,8 +86,20 @@ describe('content_editor/extensions/paste_markdown', () => {
${['text/plain', 'text/html']} | ${{}} | ${false} | ${'doesn’t handle html format'}
${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "markdown" }' }} | ${true} | ${'handles vscode markdown'}
${['text/plain', 'text/html', 'vscode-editor-data']} | ${{ 'vscode-editor-data': '{ "mode": "ruby" }' }} | ${false} | ${'doesn’t vscode code snippet'}
- `('$desc', ({ types, handled, data }) => {
- expect(triggerPasteEventHandler(buildClipboardEvent({ types, data }))).toBe(handled);
+ `('$desc', async ({ types, handled, data }) => {
+ expect(await triggerPasteEventHandler(buildClipboardEvent({ types, data }))).toBe(handled);
+ });
+
+ it.each`
+ nodeType | html | handled | desc
+ ${'codeBlock'} | ${CODE_BLOCK_HTML} | ${false} | ${'does not handle'}
+ ${'diagram'} | ${DIAGRAM_HTML} | ${false} | ${'does not handle'}
+ ${'frontmatter'} | ${FRONTMATTER_HTML} | ${false} | ${'does not handle'}
+ ${'paragraph'} | ${PARAGRAPH_HTML} | ${true} | ${'handles'}
+ `('$desc paste if currently a `$nodeType` is in focus', async ({ html, handled }) => {
+ tiptapEditor.commands.insertContent(html);
+
+ expect(await triggerPasteEventHandler(buildClipboardEvent())).toBe(handled);
});
describe('when pasting raw markdown source', () => {
@@ -105,16 +130,14 @@ describe('content_editor/extensions/paste_markdown', () => {
});
it(`triggers ${LOADING_ERROR_EVENT} event`, async () => {
- triggerPasteEventHandler(buildClipboardEvent());
-
+ await triggerPasteEventHandler(buildClipboardEvent());
await waitForPromises();
expect(eventHub.$emit).toHaveBeenCalledWith(LOADING_ERROR_EVENT);
});
it(`triggers ${ALERT_EVENT} event`, async () => {
- triggerPasteEventHandler(buildClipboardEvent());
-
+ await triggerPasteEventHandler(buildClipboardEvent());
await waitForPromises();
expect(eventHub.$emit).toHaveBeenCalledWith(ALERT_EVENT, {
diff --git a/spec/frontend/content_editor/remark_markdown_processing_spec.js b/spec/frontend/content_editor/remark_markdown_processing_spec.js
new file mode 100644
index 00000000000..6348b97d918
--- /dev/null
+++ b/spec/frontend/content_editor/remark_markdown_processing_spec.js
@@ -0,0 +1,248 @@
+import Bold from '~/content_editor/extensions/bold';
+import Blockquote from '~/content_editor/extensions/blockquote';
+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 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 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 Sourcemap from '~/content_editor/extensions/sourcemap';
+import remarkMarkdownDeserializer from '~/content_editor/services/remark_markdown_deserializer';
+import markdownSerializer from '~/content_editor/services/markdown_serializer';
+
+import { createTestEditor } from './test_utils';
+
+const tiptapEditor = createTestEditor({
+ extensions: [
+ Blockquote,
+ Bold,
+ BulletList,
+ Code,
+ CodeBlockHighlight,
+ HardBreak,
+ Heading,
+ HorizontalRule,
+ Image,
+ Italic,
+ Link,
+ ListItem,
+ OrderedList,
+ Sourcemap,
+ ],
+});
+
+describe('Client side Markdown processing', () => {
+ const deserialize = async (content) => {
+ const { document } = await remarkMarkdownDeserializer().deserialize({
+ schema: tiptapEditor.schema,
+ content,
+ });
+
+ return document;
+ };
+
+ const serialize = (document) =>
+ markdownSerializer({}).serialize({
+ doc: document,
+ pristineDoc: document,
+ });
+
+ it.each([
+ {
+ markdown: '__bold text__',
+ },
+ {
+ markdown: '**bold text**',
+ },
+ {
+ markdown: '<strong>bold text</strong>',
+ },
+ {
+ markdown: '<b>bold text</b>',
+ },
+ {
+ markdown: '_italic text_',
+ },
+ {
+ markdown: '*italic text*',
+ },
+ {
+ markdown: '<em>italic text</em>',
+ },
+ {
+ markdown: '<i>italic text</i>',
+ },
+ {
+ markdown: '`inline code`',
+ },
+ {
+ markdown: '**`inline code bold`**',
+ },
+ {
+ markdown: '__`inline code italics`__',
+ },
+ {
+ markdown: '[GitLab](https://gitlab.com "Go to GitLab")',
+ },
+ {
+ markdown: '**[GitLab](https://gitlab.com "Go to GitLab")**',
+ },
+ {
+ markdown: `
+This is a paragraph with a\\
+hard line break`,
+ },
+ {
+ markdown: '![GitLab Logo](https://gitlab.com/logo.png "GitLab Logo")',
+ },
+ {
+ markdown: '---',
+ },
+ {
+ markdown: '***',
+ },
+ {
+ markdown: '___',
+ },
+ {
+ markdown: '<hr>',
+ },
+ {
+ markdown: '# Heading 1',
+ },
+ {
+ markdown: '## Heading 2',
+ },
+ {
+ markdown: '### Heading 3',
+ },
+ {
+ markdown: '#### Heading 4',
+ },
+ {
+ markdown: '##### Heading 5',
+ },
+ {
+ markdown: '###### Heading 6',
+ },
+
+ {
+ markdown: `
+ Heading
+ one
+ ======
+ `,
+ },
+ {
+ markdown: `
+ Heading
+ two
+ -------
+ `,
+ },
+ {
+ markdown: `
+ - List item 1
+ - List item 2
+ `,
+ },
+ {
+ markdown: `
+ * List item 1
+ * List item 2
+ `,
+ },
+ {
+ markdown: `
+ + List item 1
+ + List item 2
+ `,
+ },
+ {
+ markdown: `
+ 1. List item 1
+ 1. List item 2
+ `,
+ },
+ {
+ markdown: `
+ 1. List item 1
+ 2. List item 2
+ `,
+ },
+ {
+ markdown: `
+ 1) List item 1
+ 2) List item 2
+ `,
+ },
+ {
+ markdown: `
+ - List item 1
+ - Sub list item 1
+ `,
+ },
+ {
+ markdown: `
+ - List item 1 paragraph 1
+
+ List item 1 paragraph 2
+ - List item 2
+ `,
+ },
+ {
+ markdown: `
+ > This is a blockquote
+ `,
+ },
+ {
+ markdown: `
+ > - List item 1
+ > - List item 2
+ `,
+ },
+ {
+ markdown: `
+ const fn = () => 'GitLab';
+ `,
+ },
+ {
+ markdown: `
+ \`\`\`javascript
+ const fn = () => 'GitLab';
+ \`\`\`\
+ `,
+ },
+ {
+ markdown: `
+ ~~~javascript
+ const fn = () => 'GitLab';
+ ~~~
+ `,
+ },
+ {
+ markdown: `
+ \`\`\`
+ \`\`\`\
+ `,
+ },
+ {
+ markdown: `
+ \`\`\`javascript
+ const fn = () => 'GitLab';
+
+ \`\`\`\
+ `,
+ },
+ ])('processes %s correctly', async ({ markdown }) => {
+ const trimmed = markdown.trim();
+ const document = await deserialize(trimmed);
+
+ expect(serialize(document)).toEqual(trimmed);
+ });
+});
diff --git a/spec/frontend/content_editor/services/asset_resolver_spec.js b/spec/frontend/content_editor/services/asset_resolver_spec.js
new file mode 100644
index 00000000000..f4e7d9bf881
--- /dev/null
+++ b/spec/frontend/content_editor/services/asset_resolver_spec.js
@@ -0,0 +1,23 @@
+import createAssetResolver from '~/content_editor/services/asset_resolver';
+
+describe('content_editor/services/asset_resolver', () => {
+ let renderMarkdown;
+ let assetResolver;
+
+ beforeEach(() => {
+ renderMarkdown = jest.fn();
+ assetResolver = createAssetResolver({ renderMarkdown });
+ });
+
+ describe('resolveUrl', () => {
+ it('resolves a canonical url to an absolute url', async () => {
+ renderMarkdown.mockResolvedValue(
+ '<p><a href="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png">link</a></p>',
+ );
+
+ expect(await assetResolver.resolveUrl('test-file.png')).toBe(
+ '/group1/project1/-/wikis/test-file.png',
+ );
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/services/code_block_language_loader_spec.js b/spec/frontend/content_editor/services/code_block_language_loader_spec.js
index 905c1685b94..943de327762 100644
--- a/spec/frontend/content_editor/services/code_block_language_loader_spec.js
+++ b/spec/frontend/content_editor/services/code_block_language_loader_spec.js
@@ -53,47 +53,25 @@ describe('content_editor/services/code_block_language_loader', () => {
});
});
- describe('loadLanguages', () => {
+ describe('loadLanguage', () => {
it('loads highlight.js language packages identified by a list of languages', async () => {
- const languages = ['javascript', 'ruby'];
+ const language = 'javascript';
- await languageLoader.loadLanguages(languages);
+ await languageLoader.loadLanguage(language);
- languages.forEach((language) => {
- expect(lowlight.registerLanguage).toHaveBeenCalledWith(language, expect.any(Function));
- });
+ expect(lowlight.registerLanguage).toHaveBeenCalledWith(language, expect.any(Function));
});
describe('when language is already registered', () => {
it('does not load the language again', async () => {
- const languages = ['javascript'];
-
- await languageLoader.loadLanguages(languages);
- await languageLoader.loadLanguages(languages);
+ await languageLoader.loadLanguage('javascript');
+ await languageLoader.loadLanguage('javascript');
expect(lowlight.registerLanguage).toHaveBeenCalledTimes(1);
});
});
});
- describe('loadLanguagesFromDOM', () => {
- it('loads highlight.js language packages identified by pre tags in a DOM fragment', async () => {
- const parser = new DOMParser();
- const { body } = parser.parseFromString(
- `
- <pre lang="javascript"></pre>
- <pre lang="ruby"></pre>
- `,
- 'text/html',
- );
-
- await languageLoader.loadLanguagesFromDOM(body);
-
- expect(lowlight.registerLanguage).toHaveBeenCalledWith('javascript', expect.any(Function));
- expect(lowlight.registerLanguage).toHaveBeenCalledWith('ruby', expect.any(Function));
- });
- });
-
describe('loadLanguageFromInputRule', () => {
it('loads highlight.js language packages identified from the input rule', async () => {
const match = new RegExp(backtickInputRegex).exec('```js ');
@@ -112,7 +90,7 @@ describe('content_editor/services/code_block_language_loader', () => {
expect(languageLoader.isLanguageLoaded(language)).toBe(false);
- await languageLoader.loadLanguages([language]);
+ await languageLoader.loadLanguage(language);
expect(languageLoader.isLanguageLoaded(language)).toBe(true);
});
diff --git a/spec/frontend/content_editor/services/content_editor_spec.js b/spec/frontend/content_editor/services/content_editor_spec.js
index 5b7a27b501d..a3553e612ca 100644
--- a/spec/frontend/content_editor/services/content_editor_spec.js
+++ b/spec/frontend/content_editor/services/content_editor_spec.js
@@ -11,7 +11,6 @@ describe('content_editor/services/content_editor', () => {
let contentEditor;
let serializer;
let deserializer;
- let languageLoader;
let eventHub;
let doc;
let p;
@@ -26,16 +25,14 @@ describe('content_editor/services/content_editor', () => {
tiptapEditor,
}));
- serializer = { deserialize: jest.fn() };
+ serializer = { serialize: jest.fn() };
deserializer = { deserialize: jest.fn() };
- languageLoader = { loadLanguagesFromDOM: jest.fn() };
eventHub = eventHubFactory();
contentEditor = new ContentEditor({
tiptapEditor,
serializer,
deserializer,
eventHub,
- languageLoader,
});
});
@@ -51,12 +48,12 @@ describe('content_editor/services/content_editor', () => {
describe('when setSerializedContent succeeds', () => {
let document;
- const dom = {};
+ const languages = ['javascript'];
const testMarkdown = '**bold text**';
beforeEach(() => {
document = doc(p('document'));
- deserializer.deserialize.mockResolvedValueOnce({ document, dom });
+ deserializer.deserialize.mockResolvedValueOnce({ document, languages });
});
it('emits loadingContent and loadingSuccess event in the eventHub', () => {
@@ -77,12 +74,6 @@ describe('content_editor/services/content_editor', () => {
expect(contentEditor.tiptapEditor.state.doc.toJSON()).toEqual(document.toJSON());
});
-
- it('passes deserialized DOM document to language loader', async () => {
- await contentEditor.setSerializedContent(testMarkdown);
-
- expect(languageLoader.loadLanguagesFromDOM).toHaveBeenCalledWith(dom);
- });
});
describe('when setSerializedContent fails', () => {
diff --git a/spec/frontend/content_editor/services/create_content_editor_spec.js b/spec/frontend/content_editor/services/create_content_editor_spec.js
index 6b2f28b3306..e1a30819ac8 100644
--- a/spec/frontend/content_editor/services/create_content_editor_spec.js
+++ b/spec/frontend/content_editor/services/create_content_editor_spec.js
@@ -1,8 +1,12 @@
import { PROVIDE_SERIALIZER_OR_RENDERER_ERROR } from '~/content_editor/constants';
import { createContentEditor } from '~/content_editor/services/create_content_editor';
+import createGlApiMarkdownDeserializer from '~/content_editor/services/gl_api_markdown_deserializer';
+import createRemarkMarkdownDeserializer from '~/content_editor/services/remark_markdown_deserializer';
import { createTestContentEditorExtension } from '../test_utils';
jest.mock('~/emoji');
+jest.mock('~/content_editor/services/remark_markdown_deserializer');
+jest.mock('~/content_editor/services/gl_api_markdown_deserializer');
describe('content_editor/services/create_content_editor', () => {
let renderMarkdown;
@@ -11,9 +15,36 @@ describe('content_editor/services/create_content_editor', () => {
beforeEach(() => {
renderMarkdown = jest.fn();
+ window.gon = {
+ features: {
+ preserveUnchangedMarkdown: false,
+ },
+ };
editor = createContentEditor({ renderMarkdown, uploadsPath });
});
+ describe('when preserveUnchangedMarkdown feature is on', () => {
+ beforeEach(() => {
+ window.gon.features.preserveUnchangedMarkdown = true;
+ });
+
+ it('provides a remark markdown deserializer to the content editor class', () => {
+ createContentEditor({ renderMarkdown, uploadsPath });
+ expect(createRemarkMarkdownDeserializer).toHaveBeenCalled();
+ });
+ });
+
+ describe('when preserveUnchangedMarkdown feature is off', () => {
+ beforeEach(() => {
+ window.gon.features.preserveUnchangedMarkdown = false;
+ });
+
+ it('provides a gl api markdown deserializer to the content editor class', () => {
+ createContentEditor({ renderMarkdown, uploadsPath });
+ expect(createGlApiMarkdownDeserializer).toHaveBeenCalledWith({ render: renderMarkdown });
+ });
+ });
+
it('sets gl-outline-0! class selector to the tiptapEditor instance', () => {
expect(editor.tiptapEditor.options.editorProps).toMatchObject({
attributes: {
@@ -22,30 +53,19 @@ describe('content_editor/services/create_content_editor', () => {
});
});
- it('provides the renderMarkdown function to the markdown serializer', async () => {
- const serializedContent = '**bold text**';
-
- renderMarkdown.mockReturnValueOnce('<p><b>bold text</b></p>');
-
- await editor.setSerializedContent(serializedContent);
-
- expect(renderMarkdown).toHaveBeenCalledWith(serializedContent);
- });
-
it('allows providing external content editor extensions', async () => {
const labelReference = 'this is a ~group::editor';
const { tiptapExtension, serializer } = createTestContentEditorExtension();
- renderMarkdown.mockReturnValueOnce(
- '<p>this is a <span data-reference="label" data-label-name="group::editor">group::editor</span></p>',
- );
editor = createContentEditor({
renderMarkdown,
extensions: [tiptapExtension],
serializerConfig: { nodes: { [tiptapExtension.name]: serializer } },
});
- await editor.setSerializedContent(labelReference);
+ editor.tiptapEditor.commands.setContent(
+ '<p>this is a <span data-reference="label" data-label-name="group::editor">group::editor</span></p>',
+ );
expect(editor.getSerializedContent()).toBe(labelReference);
});
diff --git a/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js b/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js
new file mode 100644
index 00000000000..5458a42532f
--- /dev/null
+++ b/spec/frontend/content_editor/services/gl_api_markdown_deserializer_spec.js
@@ -0,0 +1,60 @@
+import createMarkdownDeserializer from '~/content_editor/services/gl_api_markdown_deserializer';
+import Bold from '~/content_editor/extensions/bold';
+import { createTestEditor, createDocBuilder } from '../test_utils';
+
+describe('content_editor/services/gl_api_markdown_deserializer', () => {
+ let renderMarkdown;
+ let doc;
+ let p;
+ let bold;
+ let tiptapEditor;
+
+ beforeEach(() => {
+ tiptapEditor = createTestEditor({
+ extensions: [Bold],
+ });
+
+ ({
+ builders: { doc, p, bold },
+ } = createDocBuilder({
+ tiptapEditor,
+ names: {
+ bold: { markType: Bold.name },
+ },
+ }));
+ renderMarkdown = jest.fn();
+ });
+
+ describe('when deserializing', () => {
+ let result;
+ const text = 'Bold text';
+
+ beforeEach(async () => {
+ const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
+
+ renderMarkdown.mockResolvedValueOnce(
+ `<p><strong>${text}</strong></p><pre lang="javascript"></pre>`,
+ );
+
+ result = await deserializer.deserialize({
+ content: 'content',
+ schema: tiptapEditor.schema,
+ });
+ });
+ it('transforms HTML returned by render function to a ProseMirror document', async () => {
+ const document = doc(p(bold(text)));
+
+ expect(result.document.toJSON()).toEqual(document.toJSON());
+ });
+ });
+
+ describe('when the render function returns an empty value', () => {
+ it('returns an empty object', async () => {
+ const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
+
+ renderMarkdown.mockResolvedValueOnce(null);
+
+ expect(await deserializer.deserialize({ content: 'content' })).toEqual({});
+ });
+ });
+});
diff --git a/spec/frontend/content_editor/services/markdown_deserializer_spec.js b/spec/frontend/content_editor/services/markdown_deserializer_spec.js
deleted file mode 100644
index bea43a0effc..00000000000
--- a/spec/frontend/content_editor/services/markdown_deserializer_spec.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import createMarkdownDeserializer from '~/content_editor/services/markdown_deserializer';
-import Bold from '~/content_editor/extensions/bold';
-import { createTestEditor, createDocBuilder } from '../test_utils';
-
-describe('content_editor/services/markdown_deserializer', () => {
- let renderMarkdown;
- let doc;
- let p;
- let bold;
- let tiptapEditor;
-
- beforeEach(() => {
- tiptapEditor = createTestEditor({
- extensions: [Bold],
- });
-
- ({
- builders: { doc, p, bold },
- } = createDocBuilder({
- tiptapEditor,
- names: {
- bold: { markType: Bold.name },
- },
- }));
- renderMarkdown = jest.fn();
- });
-
- describe('when deserializing', () => {
- let result;
- const text = 'Bold text';
-
- beforeEach(async () => {
- const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
-
- renderMarkdown.mockResolvedValueOnce(`<p><strong>${text}</strong></p>`);
-
- result = await deserializer.deserialize({
- content: 'content',
- schema: tiptapEditor.schema,
- });
- });
- it('transforms HTML returned by render function to a ProseMirror document', async () => {
- const expectedDoc = doc(p(bold(text)));
-
- expect(result.document.toJSON()).toEqual(expectedDoc.toJSON());
- });
-
- it('returns parsed HTML as a DOM object', () => {
- expect(result.dom.innerHTML).toEqual(`<p><strong>${text}</strong></p><!--content-->`);
- });
- });
-
- describe('when the render function returns an empty value', () => {
- it('returns an empty object', async () => {
- const deserializer = createMarkdownDeserializer({ render: renderMarkdown });
-
- renderMarkdown.mockResolvedValueOnce(null);
-
- expect(await deserializer.deserialize({ content: 'content' })).toEqual({});
- });
- });
-});
diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js
index 2b76dc6c984..25b7483f234 100644
--- a/spec/frontend/content_editor/services/markdown_serializer_spec.js
+++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js
@@ -24,6 +24,7 @@ import Link from '~/content_editor/extensions/link';
import ListItem from '~/content_editor/extensions/list_item';
import OrderedList from '~/content_editor/extensions/ordered_list';
import Paragraph from '~/content_editor/extensions/paragraph';
+import Sourcemap from '~/content_editor/extensions/sourcemap';
import Strike from '~/content_editor/extensions/strike';
import Table from '~/content_editor/extensions/table';
import TableCell from '~/content_editor/extensions/table_cell';
@@ -32,6 +33,7 @@ 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 markdownSerializer from '~/content_editor/services/markdown_serializer';
+import remarkMarkdownDeserializer from '~/content_editor/services/remark_markdown_deserializer';
import { createTestEditor, createDocBuilder } from '../test_utils';
jest.mock('~/emoji');
@@ -63,6 +65,7 @@ const tiptapEditor = createTestEditor({
Link,
ListItem,
OrderedList,
+ Sourcemap,
Strike,
Table,
TableCell,
@@ -151,8 +154,7 @@ const {
const serialize = (...content) =>
markdownSerializer({}).serialize({
- schema: tiptapEditor.schema,
- content: doc(...content).toJSON(),
+ doc: doc(...content),
});
describe('markdownSerializer', () => {
@@ -1159,4 +1161,42 @@ Oranges are orange [^1]
`.trim(),
);
});
+
+ it.each`
+ mark | content | modifiedContent
+ ${'bold'} | ${'**bold**'} | ${'**bold modified**'}
+ ${'bold'} | ${'__bold__'} | ${'__bold modified__'}
+ ${'bold'} | ${'<strong>bold</strong>'} | ${'<strong>bold modified</strong>'}
+ ${'bold'} | ${'<b>bold</b>'} | ${'<b>bold modified</b>'}
+ ${'italic'} | ${'_italic_'} | ${'_italic modified_'}
+ ${'italic'} | ${'*italic*'} | ${'*italic modified*'}
+ ${'italic'} | ${'<em>italic</em>'} | ${'<em>italic modified</em>'}
+ ${'italic'} | ${'<i>italic</i>'} | ${'<i>italic modified</i>'}
+ ${'link'} | ${'[gitlab](https://gitlab.com)'} | ${'[gitlab modified](https://gitlab.com)'}
+ ${'link'} | ${'<a href="https://gitlab.com">link</a>'} | ${'<a href="https://gitlab.com">link modified</a>'}
+ ${'code'} | ${'`code`'} | ${'`code modified`'}
+ ${'code'} | ${'<code>code</code>'} | ${'<code>code modified</code>'}
+ `(
+ 'preserves original $mark syntax when sourceMarkdown is available',
+ async ({ content, modifiedContent }) => {
+ const { document } = await remarkMarkdownDeserializer().deserialize({
+ schema: tiptapEditor.schema,
+ content,
+ });
+
+ tiptapEditor
+ .chain()
+ .setContent(document.toJSON())
+ // changing the document ensures that block preservation doesn’t yield false positives
+ .insertContent(' modified')
+ .run();
+
+ const serialized = markdownSerializer({}).serialize({
+ pristineDoc: document,
+ doc: tiptapEditor.state.doc,
+ });
+
+ expect(serialized).toEqual(modifiedContent);
+ },
+ );
});
diff --git a/spec/frontend/content_editor/services/markdown_sourcemap_spec.js b/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
index abd9588daff..8a304c73163 100644
--- a/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
+++ b/spec/frontend/content_editor/services/markdown_sourcemap_spec.js
@@ -2,7 +2,7 @@ import { Extension } from '@tiptap/core';
import BulletList from '~/content_editor/extensions/bullet_list';
import ListItem from '~/content_editor/extensions/list_item';
import Paragraph from '~/content_editor/extensions/paragraph';
-import markdownDeserializer from '~/content_editor/services/markdown_deserializer';
+import markdownDeserializer from '~/content_editor/services/gl_api_markdown_deserializer';
import { getMarkdownSource, getFullSource } from '~/content_editor/services/markdown_sourcemap';
import { createTestEditor, createDocBuilder } from '../test_utils';
diff --git a/spec/frontend/content_editor/test_constants.js b/spec/frontend/content_editor/test_constants.js
new file mode 100644
index 00000000000..45a0e4a8bd1
--- /dev/null
+++ b/spec/frontend/content_editor/test_constants.js
@@ -0,0 +1,25 @@
+export const PROJECT_WIKI_ATTACHMENT_IMAGE_HTML = `<p data-sourcepos="1:1-1:27" dir="auto">
+ <a class="no-attachment-icon" href="/group1/project1/-/wikis/test-file.png" target="_blank" rel="noopener noreferrer" data-canonical-src="test-file.png">
+ <img alt="test-file" class="lazy" data-src="/group1/project1/-/wikis/test-file.png" data-canonical-src="test-file.png">
+ </a>
+</p>`;
+
+export const PROJECT_WIKI_ATTACHMENT_VIDEO_HTML = `<p data-sourcepos="1:1-1:132" dir="auto">
+ <span class="media-container video-container">
+ <video src="/group1/project1/-/wikis/test-file.mp4" controls="true" data-setup="{}" data-title="test-file" width="400" preload="metadata" data-canonical-src="test-file.mp4">
+ </video>
+ <a href="/group1/project1/-/wikis/test-file.mp4" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp4">test-file</a>
+ </span>
+</p>`;
+
+export const PROJECT_WIKI_ATTACHMENT_AUDIO_HTML = `<p data-sourcepos="3:1-3:74" dir="auto">
+ <span class="media-container audio-container">
+ <audio src="/group1/project1/-/wikis/test-file.mp3" controls="true" data-setup="{}" data-title="test-file" data-canonical-src="test-file.mp3">
+ </audio>
+ <a href="/group1/project1/-/wikis/test-file.mp3" target="_blank" rel="noopener noreferrer" title="Download 'test-file'" data-canonical-src="test-file.mp3">test-file</a>
+ </span>
+</p>`;
+
+export const PROJECT_WIKI_ATTACHMENT_LINK_HTML = `<p data-sourcepos="1:1-1:26" dir="auto">
+ <a href="/group1/project1/-/wikis/test-file.zip" data-canonical-src="test-file.zip">test-file</a>
+</p>`;
diff --git a/spec/frontend/content_editor/test_utils.js b/spec/frontend/content_editor/test_utils.js
index dde9d738235..4ed1ed97cbd 100644
--- a/spec/frontend/content_editor/test_utils.js
+++ b/spec/frontend/content_editor/test_utils.js
@@ -151,7 +151,7 @@ export const triggerMarkInputRule = ({ tiptapEditor, inputRuleText }) => {
* @param {*} params.action A function that triggers a transaction in the tiptap Editor
* @returns A promise that resolves when the transaction completes
*/
-export const waitUntilNextDocTransaction = ({ tiptapEditor, action }) => {
+export const waitUntilNextDocTransaction = ({ tiptapEditor, action = () => {} }) => {
return new Promise((resolve) => {
const handleTransaction = () => {
tiptapEditor.off('update', handleTransaction);
diff --git a/spec/frontend/create_cluster/components/cluster_form_dropdown_spec.js b/spec/frontend/create_cluster/components/cluster_form_dropdown_spec.js
deleted file mode 100644
index 2f835867f5f..00000000000
--- a/spec/frontend/create_cluster/components/cluster_form_dropdown_spec.js
+++ /dev/null
@@ -1,214 +0,0 @@
-import { GlIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import $ from 'jquery';
-
-import { nextTick } from 'vue';
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownSearchInput from '~/vue_shared/components/dropdown/dropdown_search_input.vue';
-
-describe('ClusterFormDropdown', () => {
- let wrapper;
- const firstItem = { name: 'item 1', value: '1' };
- const secondItem = { name: 'item 2', value: '2' };
- const items = [firstItem, secondItem, { name: 'item 3', value: '3' }];
-
- beforeEach(() => {
- wrapper = shallowMount(ClusterFormDropdown);
- });
- afterEach(() => wrapper.destroy());
-
- describe('when initial value is provided', () => {
- it('sets selectedItem to initial value', async () => {
- wrapper.setProps({ items, value: secondItem.value });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('toggleText')).toEqual(secondItem.name);
- });
- });
-
- describe('when no item is selected', () => {
- it('displays placeholder text', async () => {
- const placeholder = 'placeholder';
-
- wrapper.setProps({ placeholder });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('toggleText')).toEqual(placeholder);
- });
- });
-
- describe('when an item is selected', () => {
- beforeEach(async () => {
- wrapper.setProps({ items });
- await nextTick();
- wrapper.findAll('.js-dropdown-item').at(1).trigger('click');
- await nextTick();
- });
-
- it('emits input event with selected item', () => {
- expect(wrapper.emitted('input')[0]).toEqual([secondItem.value]);
- });
- });
-
- describe('when multiple items are selected', () => {
- const value = ['1'];
-
- beforeEach(async () => {
- wrapper.setProps({ items, multiple: true, value });
-
- await nextTick();
- wrapper.findAll('.js-dropdown-item').at(0).trigger('click');
-
- await nextTick();
- wrapper.findAll('.js-dropdown-item').at(1).trigger('click');
-
- await nextTick();
- });
-
- it('emits input event with an array of selected items', () => {
- expect(wrapper.emitted('input')[1]).toEqual([[firstItem.value, secondItem.value]]);
- });
- });
-
- describe('when multiple items can be selected', () => {
- beforeEach(async () => {
- wrapper.setProps({ items, multiple: true, value: firstItem.value });
- await nextTick();
- });
-
- it('displays a checked GlIcon next to the item', () => {
- expect(wrapper.find(GlIcon).classes()).not.toContain('invisible');
- expect(wrapper.find(GlIcon).props('name')).toBe('mobile-issue-close');
- });
- });
-
- describe('when multiple values can be selected and initial value is null', () => {
- it('emits input event with an array of a single selected item', async () => {
- wrapper.setProps({ items, multiple: true, value: null });
-
- await nextTick();
- wrapper.findAll('.js-dropdown-item').at(0).trigger('click');
-
- expect(wrapper.emitted('input')[0]).toEqual([[firstItem.value]]);
- });
- });
-
- describe('when an item is selected and has a custom label property', () => {
- it('displays selected item custom label', async () => {
- const labelProperty = 'customLabel';
- const label = 'Name';
- const currentValue = '1';
- const customLabelItems = [{ [labelProperty]: label, value: currentValue }];
-
- wrapper.setProps({ labelProperty, items: customLabelItems, value: currentValue });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('toggleText')).toEqual(label);
- });
- });
-
- describe('when loading', () => {
- it('dropdown button isLoading', async () => {
- await wrapper.setProps({ loading: true });
- expect(wrapper.find(DropdownButton).props('isLoading')).toBe(true);
- });
- });
-
- describe('when loading and loadingText is provided', () => {
- it('uses loading text as toggle button text', async () => {
- const loadingText = 'loading text';
-
- wrapper.setProps({ loading: true, loadingText });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('toggleText')).toEqual(loadingText);
- });
- });
-
- describe('when disabled', () => {
- it('dropdown button isDisabled', async () => {
- wrapper.setProps({ disabled: true });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('isDisabled')).toBe(true);
- });
- });
-
- describe('when disabled and disabledText is provided', () => {
- it('uses disabled text as toggle button text', async () => {
- const disabledText = 'disabled text';
-
- wrapper.setProps({ disabled: true, disabledText });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).props('toggleText')).toBe(disabledText);
- });
- });
-
- describe('when has errors', () => {
- it('sets border-danger class selector to dropdown toggle', async () => {
- wrapper.setProps({ hasErrors: true });
-
- await nextTick();
- expect(wrapper.find(DropdownButton).classes('border-danger')).toBe(true);
- });
- });
-
- describe('when has errors and an error message', () => {
- it('displays error message', async () => {
- const errorMessage = 'error message';
-
- wrapper.setProps({ hasErrors: true, errorMessage });
-
- await nextTick();
- expect(wrapper.find('.js-eks-dropdown-error-message').text()).toEqual(errorMessage);
- });
- });
-
- describe('when no results are available', () => {
- it('displays empty text', async () => {
- const emptyText = 'error message';
-
- wrapper.setProps({ items: [], emptyText });
-
- await nextTick();
- expect(wrapper.find('.js-empty-text').text()).toEqual(emptyText);
- });
- });
-
- it('displays search field placeholder', async () => {
- const searchFieldPlaceholder = 'Placeholder';
-
- wrapper.setProps({ searchFieldPlaceholder });
-
- await nextTick();
- expect(wrapper.find(DropdownSearchInput).props('placeholderText')).toEqual(
- searchFieldPlaceholder,
- );
- });
-
- it('it filters results by search query', async () => {
- const searchQuery = secondItem.name;
-
- wrapper.setProps({ items });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ searchQuery });
-
- await nextTick();
- expect(wrapper.findAll('.js-dropdown-item').length).toEqual(1);
- expect(wrapper.find('.js-dropdown-item').text()).toEqual(secondItem.name);
- });
-
- it('focuses dropdown search input when dropdown is displayed', async () => {
- const dropdownEl = wrapper.find('.dropdown').element;
-
- expect(wrapper.find(DropdownSearchInput).props('focused')).toBe(false);
-
- $(dropdownEl).trigger('shown.bs.dropdown');
-
- await nextTick();
- expect(wrapper.find(DropdownSearchInput).props('focused')).toBe(true);
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/components/create_eks_cluster_spec.js b/spec/frontend/create_cluster/eks_cluster/components/create_eks_cluster_spec.js
deleted file mode 100644
index c8020cf8308..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/components/create_eks_cluster_spec.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-
-import CreateEksCluster from '~/create_cluster/eks_cluster/components/create_eks_cluster.vue';
-import EksClusterConfigurationForm from '~/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue';
-import ServiceCredentialsForm from '~/create_cluster/eks_cluster/components/service_credentials_form.vue';
-
-Vue.use(Vuex);
-
-describe('CreateEksCluster', () => {
- let vm;
- let state;
- const gitlabManagedClusterHelpPath = 'gitlab-managed-cluster-help-path';
- const namespacePerEnvironmentHelpPath = 'namespace-per-environment-help-path';
- const accountAndExternalIdsHelpPath = 'account-and-external-id-help-path';
- const createRoleArnHelpPath = 'role-arn-help-path';
- const kubernetesIntegrationHelpPath = 'kubernetes-integration';
- const externalLinkIcon = 'external-link';
-
- beforeEach(() => {
- state = { hasCredentials: false };
- const store = new Vuex.Store({
- state,
- });
-
- vm = shallowMount(CreateEksCluster, {
- propsData: {
- gitlabManagedClusterHelpPath,
- namespacePerEnvironmentHelpPath,
- accountAndExternalIdsHelpPath,
- createRoleArnHelpPath,
- externalLinkIcon,
- kubernetesIntegrationHelpPath,
- },
- store,
- });
- });
- afterEach(() => vm.destroy());
-
- describe('when credentials are provided', () => {
- beforeEach(() => {
- state.hasCredentials = true;
- });
-
- it('displays eks cluster configuration form when credentials are valid', () => {
- expect(vm.find(EksClusterConfigurationForm).exists()).toBe(true);
- });
-
- describe('passes to the cluster configuration form', () => {
- it('help url for kubernetes integration documentation', () => {
- expect(vm.find(EksClusterConfigurationForm).props('gitlabManagedClusterHelpPath')).toBe(
- gitlabManagedClusterHelpPath,
- );
- });
-
- it('help url for namespace per environment cluster documentation', () => {
- expect(vm.find(EksClusterConfigurationForm).props('namespacePerEnvironmentHelpPath')).toBe(
- namespacePerEnvironmentHelpPath,
- );
- });
-
- it('help url for gitlab managed cluster documentation', () => {
- expect(vm.find(EksClusterConfigurationForm).props('kubernetesIntegrationHelpPath')).toBe(
- kubernetesIntegrationHelpPath,
- );
- });
- });
- });
-
- describe('when credentials are invalid', () => {
- beforeEach(() => {
- state.hasCredentials = false;
- });
-
- it('displays service credentials form', () => {
- expect(vm.find(ServiceCredentialsForm).exists()).toBe(true);
- });
-
- describe('passes to the service credentials form', () => {
- it('help url for account and external ids', () => {
- expect(vm.find(ServiceCredentialsForm).props('accountAndExternalIdsHelpPath')).toBe(
- accountAndExternalIdsHelpPath,
- );
- });
-
- it('external link icon', () => {
- expect(vm.find(ServiceCredentialsForm).props('externalLinkIcon')).toBe(externalLinkIcon);
- });
-
- it('help url to create a role ARN', () => {
- expect(vm.find(ServiceCredentialsForm).props('createRoleArnHelpPath')).toBe(
- createRoleArnHelpPath,
- );
- });
- });
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js b/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
deleted file mode 100644
index 1509d26c99d..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/components/eks_cluster_configuration_form_spec.js
+++ /dev/null
@@ -1,562 +0,0 @@
-import { GlFormCheckbox } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
-
-import EksClusterConfigurationForm from '~/create_cluster/eks_cluster/components/eks_cluster_configuration_form.vue';
-import eksClusterFormState from '~/create_cluster/eks_cluster/store/state';
-import clusterDropdownStoreState from '~/create_cluster/store/cluster_dropdown/state';
-
-Vue.use(Vuex);
-
-describe('EksClusterConfigurationForm', () => {
- let store;
- let actions;
- let getters;
- let state;
- let rolesState;
- let vpcsState;
- let subnetsState;
- let keyPairsState;
- let securityGroupsState;
- let instanceTypesState;
- let vpcsActions;
- let rolesActions;
- let subnetsActions;
- let keyPairsActions;
- let securityGroupsActions;
- let vm;
-
- const createStore = (config = {}) => {
- actions = {
- createCluster: jest.fn(),
- setClusterName: jest.fn(),
- setEnvironmentScope: jest.fn(),
- setKubernetesVersion: jest.fn(),
- setRegion: jest.fn(),
- setVpc: jest.fn(),
- setSubnet: jest.fn(),
- setRole: jest.fn(),
- setKeyPair: jest.fn(),
- setSecurityGroup: jest.fn(),
- setInstanceType: jest.fn(),
- setNodeCount: jest.fn(),
- setGitlabManagedCluster: jest.fn(),
- };
- keyPairsActions = {
- fetchItems: jest.fn(),
- };
- vpcsActions = {
- fetchItems: jest.fn(),
- };
- subnetsActions = {
- fetchItems: jest.fn(),
- };
- rolesActions = {
- fetchItems: jest.fn(),
- };
- securityGroupsActions = {
- fetchItems: jest.fn(),
- };
- state = {
- ...eksClusterFormState(),
- ...config.initialState,
- };
- rolesState = {
- ...clusterDropdownStoreState(),
- ...config.rolesState,
- };
- vpcsState = {
- ...clusterDropdownStoreState(),
- ...config.vpcsState,
- };
- subnetsState = {
- ...clusterDropdownStoreState(),
- ...config.subnetsState,
- };
- keyPairsState = {
- ...clusterDropdownStoreState(),
- ...config.keyPairsState,
- };
- securityGroupsState = {
- ...clusterDropdownStoreState(),
- ...config.securityGroupsState,
- };
- instanceTypesState = {
- ...clusterDropdownStoreState(),
- ...config.instanceTypesState,
- };
- getters = {
- subnetValid: config?.getters?.subnetValid || (() => false),
- };
- store = new Vuex.Store({
- state,
- getters,
- actions,
- modules: {
- vpcs: {
- namespaced: true,
- state: vpcsState,
- actions: vpcsActions,
- },
- subnets: {
- namespaced: true,
- state: subnetsState,
- actions: subnetsActions,
- },
- roles: {
- namespaced: true,
- state: rolesState,
- actions: rolesActions,
- },
- keyPairs: {
- namespaced: true,
- state: keyPairsState,
- actions: keyPairsActions,
- },
- securityGroups: {
- namespaced: true,
- state: securityGroupsState,
- actions: securityGroupsActions,
- },
- instanceTypes: {
- namespaced: true,
- state: instanceTypesState,
- },
- },
- });
- };
-
- const createValidStateStore = (initialState) => {
- createStore({
- initialState: {
- clusterName: 'cluster name',
- environmentScope: '*',
- kubernetesVersion: '1.16',
- selectedRegion: 'region',
- selectedRole: 'role',
- selectedKeyPair: 'key pair',
- selectedVpc: 'vpc',
- selectedSubnet: ['subnet 1', 'subnet 2'],
- selectedSecurityGroup: 'group',
- selectedInstanceType: 'small-1',
- ...initialState,
- },
- getters: {
- subnetValid: () => true,
- },
- });
- };
-
- const buildWrapper = () => {
- vm = shallowMount(EksClusterConfigurationForm, {
- store,
- propsData: {
- gitlabManagedClusterHelpPath: '',
- namespacePerEnvironmentHelpPath: '',
- kubernetesIntegrationHelpPath: '',
- externalLinkIcon: '',
- },
- });
- };
-
- beforeEach(() => {
- createStore();
- buildWrapper();
- });
-
- afterEach(() => {
- vm.destroy();
- });
-
- const findCreateClusterButton = () => vm.find('.js-create-cluster');
- const findClusterNameInput = () => vm.find('[id=eks-cluster-name]');
- const findEnvironmentScopeInput = () => vm.find('[id=eks-environment-scope]');
- const findKubernetesVersionDropdown = () => vm.find('[field-id="eks-kubernetes-version"]');
- const findKeyPairDropdown = () => vm.find('[field-id="eks-key-pair"]');
- const findVpcDropdown = () => vm.find('[field-id="eks-vpc"]');
- const findSubnetDropdown = () => vm.find('[field-id="eks-subnet"]');
- const findRoleDropdown = () => vm.find('[field-id="eks-role"]');
- const findSecurityGroupDropdown = () => vm.find('[field-id="eks-security-group"]');
- const findInstanceTypeDropdown = () => vm.find('[field-id="eks-instance-type"');
- const findNodeCountInput = () => vm.find('[id="eks-node-count"]');
- const findGitlabManagedClusterCheckbox = () => vm.find(GlFormCheckbox);
-
- describe('when mounted', () => {
- it('fetches available roles', () => {
- expect(rolesActions.fetchItems).toHaveBeenCalled();
- });
-
- describe('when fetching vpcs and key pairs', () => {
- const region = 'us-west-2';
-
- beforeEach(() => {
- createValidStateStore({ selectedRegion: region });
- buildWrapper();
- });
-
- it('fetches available vpcs', () => {
- expect(vpcsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), { region });
- });
-
- it('fetches available key pairs', () => {
- expect(keyPairsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), { region });
- });
-
- it('cleans selected vpc', () => {
- expect(actions.setVpc).toHaveBeenCalledWith(expect.anything(), { vpc: null });
- });
-
- it('cleans selected key pair', () => {
- expect(actions.setKeyPair).toHaveBeenCalledWith(expect.anything(), { keyPair: null });
- });
-
- it('cleans selected subnet', () => {
- expect(actions.setSubnet).toHaveBeenCalledWith(expect.anything(), { subnet: [] });
- });
-
- it('cleans selected security group', () => {
- expect(actions.setSecurityGroup).toHaveBeenCalledWith(expect.anything(), {
- securityGroup: null,
- });
- });
- });
- });
-
- it('sets isLoadingRoles to RoleDropdown loading property', async () => {
- rolesState.isLoadingItems = true;
-
- await nextTick();
- expect(findRoleDropdown().props('loading')).toBe(rolesState.isLoadingItems);
- });
-
- it('sets roles to RoleDropdown items property', () => {
- expect(findRoleDropdown().props('items')).toBe(rolesState.items);
- });
-
- it('sets RoleDropdown hasErrors to true when loading roles failed', async () => {
- rolesState.loadingItemsError = new Error();
-
- await nextTick();
- expect(findRoleDropdown().props('hasErrors')).toEqual(true);
- });
-
- it('disables KeyPairDropdown when no region is selected', () => {
- expect(findKeyPairDropdown().props('disabled')).toBe(true);
- });
-
- it('enables KeyPairDropdown when no region is selected', async () => {
- state.selectedRegion = { name: 'west-1 ' };
-
- await nextTick();
- expect(findKeyPairDropdown().props('disabled')).toBe(false);
- });
-
- it('sets isLoadingKeyPairs to KeyPairDropdown loading property', async () => {
- keyPairsState.isLoadingItems = true;
-
- await nextTick();
- expect(findKeyPairDropdown().props('loading')).toBe(keyPairsState.isLoadingItems);
- });
-
- it('sets keyPairs to KeyPairDropdown items property', () => {
- expect(findKeyPairDropdown().props('items')).toBe(keyPairsState.items);
- });
-
- it('sets KeyPairDropdown hasErrors to true when loading key pairs fails', async () => {
- keyPairsState.loadingItemsError = new Error();
-
- await nextTick();
- expect(findKeyPairDropdown().props('hasErrors')).toEqual(true);
- });
-
- it('disables VpcDropdown when no region is selected', () => {
- expect(findVpcDropdown().props('disabled')).toBe(true);
- });
-
- it('enables VpcDropdown when no region is selected', async () => {
- state.selectedRegion = { name: 'west-1 ' };
-
- await nextTick();
- expect(findVpcDropdown().props('disabled')).toBe(false);
- });
-
- it('sets isLoadingVpcs to VpcDropdown loading property', async () => {
- vpcsState.isLoadingItems = true;
-
- await nextTick();
- expect(findVpcDropdown().props('loading')).toBe(vpcsState.isLoadingItems);
- });
-
- it('sets vpcs to VpcDropdown items property', () => {
- expect(findVpcDropdown().props('items')).toBe(vpcsState.items);
- });
-
- it('sets VpcDropdown hasErrors to true when loading vpcs fails', async () => {
- vpcsState.loadingItemsError = new Error();
-
- await nextTick();
- expect(findVpcDropdown().props('hasErrors')).toEqual(true);
- });
-
- it('disables SubnetDropdown when no vpc is selected', () => {
- expect(findSubnetDropdown().props('disabled')).toBe(true);
- });
-
- it('enables SubnetDropdown when a vpc is selected', async () => {
- state.selectedVpc = { name: 'vpc-1 ' };
-
- await nextTick();
- expect(findSubnetDropdown().props('disabled')).toBe(false);
- });
-
- it('sets isLoadingSubnets to SubnetDropdown loading property', async () => {
- subnetsState.isLoadingItems = true;
-
- await nextTick();
- expect(findSubnetDropdown().props('loading')).toBe(subnetsState.isLoadingItems);
- });
-
- it('sets subnets to SubnetDropdown items property', () => {
- expect(findSubnetDropdown().props('items')).toBe(subnetsState.items);
- });
-
- it('displays a validation error in the subnet dropdown when loading subnets fails', () => {
- createStore({
- subnetsState: {
- loadingItemsError: new Error(),
- },
- });
- buildWrapper();
-
- expect(findSubnetDropdown().props('hasErrors')).toEqual(true);
- });
-
- it('displays a validation error in the subnet dropdown when a single subnet is selected', () => {
- createStore({
- initialState: {
- selectedSubnet: ['subnet 1'],
- },
- });
- buildWrapper();
-
- expect(findSubnetDropdown().props('hasErrors')).toEqual(true);
- expect(findSubnetDropdown().props('errorMessage')).toEqual(
- 'You should select at least two subnets',
- );
- });
-
- it('disables SecurityGroupDropdown when no vpc is selected', () => {
- expect(findSecurityGroupDropdown().props('disabled')).toBe(true);
- });
-
- it('enables SecurityGroupDropdown when a vpc is selected', async () => {
- state.selectedVpc = { name: 'vpc-1 ' };
-
- await nextTick();
- expect(findSecurityGroupDropdown().props('disabled')).toBe(false);
- });
-
- it('sets isLoadingSecurityGroups to SecurityGroupDropdown loading property', async () => {
- securityGroupsState.isLoadingItems = true;
-
- await nextTick();
- expect(findSecurityGroupDropdown().props('loading')).toBe(securityGroupsState.isLoadingItems);
- });
-
- it('sets securityGroups to SecurityGroupDropdown items property', () => {
- expect(findSecurityGroupDropdown().props('items')).toBe(securityGroupsState.items);
- });
-
- it('sets SecurityGroupDropdown hasErrors to true when loading security groups fails', async () => {
- securityGroupsState.loadingItemsError = new Error();
-
- await nextTick();
- expect(findSecurityGroupDropdown().props('hasErrors')).toEqual(true);
- });
-
- it('dispatches setClusterName when cluster name input changes', () => {
- const clusterName = 'name';
-
- findClusterNameInput().vm.$emit('input', clusterName);
-
- expect(actions.setClusterName).toHaveBeenCalledWith(expect.anything(), { clusterName });
- });
-
- it('dispatches setEnvironmentScope when environment scope input changes', () => {
- const environmentScope = 'production';
-
- findEnvironmentScopeInput().vm.$emit('input', environmentScope);
-
- expect(actions.setEnvironmentScope).toHaveBeenCalledWith(expect.anything(), {
- environmentScope,
- });
- });
-
- it('dispatches setKubernetesVersion when kubernetes version dropdown changes', () => {
- const kubernetesVersion = { name: '1.11' };
-
- findKubernetesVersionDropdown().vm.$emit('input', kubernetesVersion);
-
- expect(actions.setKubernetesVersion).toHaveBeenCalledWith(expect.anything(), {
- kubernetesVersion,
- });
- });
-
- it('dispatches setGitlabManagedCluster when gitlab managed cluster input changes', () => {
- const gitlabManagedCluster = false;
-
- findGitlabManagedClusterCheckbox().vm.$emit('input', gitlabManagedCluster);
-
- expect(actions.setGitlabManagedCluster).toHaveBeenCalledWith(expect.anything(), {
- gitlabManagedCluster,
- });
- });
-
- describe('when vpc is selected', () => {
- const vpc = { name: 'vpc-1' };
- const region = 'east-1';
-
- beforeEach(() => {
- state.selectedRegion = region;
- findVpcDropdown().vm.$emit('input', vpc);
- });
-
- it('dispatches setVpc action', () => {
- expect(actions.setVpc).toHaveBeenCalledWith(expect.anything(), { vpc });
- });
-
- it('cleans selected subnet', () => {
- expect(actions.setSubnet).toHaveBeenCalledWith(expect.anything(), { subnet: [] });
- });
-
- it('cleans selected security group', () => {
- expect(actions.setSecurityGroup).toHaveBeenCalledWith(expect.anything(), {
- securityGroup: null,
- });
- });
-
- it('dispatches fetchSubnets action', () => {
- expect(subnetsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), { vpc, region });
- });
-
- it('dispatches fetchSecurityGroups action', () => {
- expect(securityGroupsActions.fetchItems).toHaveBeenCalledWith(expect.anything(), {
- vpc,
- region,
- });
- });
- });
-
- describe('when a subnet is selected', () => {
- const subnet = { name: 'subnet-1' };
-
- beforeEach(() => {
- findSubnetDropdown().vm.$emit('input', subnet);
- });
-
- it('dispatches setSubnet action', () => {
- expect(actions.setSubnet).toHaveBeenCalledWith(expect.anything(), { subnet });
- });
- });
-
- describe('when role is selected', () => {
- const role = { name: 'admin' };
-
- beforeEach(() => {
- findRoleDropdown().vm.$emit('input', role);
- });
-
- it('dispatches setRole action', () => {
- expect(actions.setRole).toHaveBeenCalledWith(expect.anything(), { role });
- });
- });
-
- describe('when key pair is selected', () => {
- const keyPair = { name: 'key pair' };
-
- beforeEach(() => {
- findKeyPairDropdown().vm.$emit('input', keyPair);
- });
-
- it('dispatches setKeyPair action', () => {
- expect(actions.setKeyPair).toHaveBeenCalledWith(expect.anything(), { keyPair });
- });
- });
-
- describe('when security group is selected', () => {
- const securityGroup = { name: 'default group' };
-
- beforeEach(() => {
- findSecurityGroupDropdown().vm.$emit('input', securityGroup);
- });
-
- it('dispatches setSecurityGroup action', () => {
- expect(actions.setSecurityGroup).toHaveBeenCalledWith(expect.anything(), { securityGroup });
- });
- });
-
- describe('when instance type is selected', () => {
- const instanceType = 'small-1';
-
- beforeEach(() => {
- findInstanceTypeDropdown().vm.$emit('input', instanceType);
- });
-
- it('dispatches setInstanceType action', () => {
- expect(actions.setInstanceType).toHaveBeenCalledWith(expect.anything(), { instanceType });
- });
- });
-
- it('dispatches setNodeCount when node count input changes', () => {
- const nodeCount = 5;
-
- findNodeCountInput().vm.$emit('input', nodeCount);
-
- expect(actions.setNodeCount).toHaveBeenCalledWith(expect.anything(), { nodeCount });
- });
-
- describe('when all cluster configuration fields are set', () => {
- it('enables create cluster button', () => {
- createValidStateStore();
- buildWrapper();
- expect(findCreateClusterButton().props('disabled')).toBe(false);
- });
- });
-
- describe('when at least one cluster configuration field is not set', () => {
- beforeEach(() => {
- createValidStateStore({
- clusterName: null,
- });
- buildWrapper();
- });
-
- it('disables create cluster button', () => {
- expect(findCreateClusterButton().props('disabled')).toBe(true);
- });
- });
-
- describe('when is creating cluster', () => {
- beforeEach(() => {
- createValidStateStore({
- isCreatingCluster: true,
- });
- buildWrapper();
- });
-
- it('sets create cluster button as loading', () => {
- expect(findCreateClusterButton().props('loading')).toBe(true);
- });
- });
-
- describe('clicking create cluster button', () => {
- beforeEach(() => {
- findCreateClusterButton().vm.$emit('click');
- });
-
- it('dispatches createCluster action', () => {
- expect(actions.createCluster).toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/components/service_credentials_form_spec.js b/spec/frontend/create_cluster/eks_cluster/components/service_credentials_form_spec.js
deleted file mode 100644
index 0d823a18012..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/components/service_credentials_form_spec.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
-import ServiceCredentialsForm from '~/create_cluster/eks_cluster/components/service_credentials_form.vue';
-import eksClusterState from '~/create_cluster/eks_cluster/store/state';
-
-Vue.use(Vuex);
-
-describe('ServiceCredentialsForm', () => {
- let vm;
- let state;
- let createRoleAction;
- const accountId = 'accountId';
- const externalId = 'externalId';
-
- beforeEach(() => {
- state = Object.assign(eksClusterState(), {
- accountId,
- externalId,
- });
- createRoleAction = jest.fn();
-
- const store = new Vuex.Store({
- state,
- actions: {
- createRole: createRoleAction,
- },
- });
- vm = shallowMount(ServiceCredentialsForm, {
- propsData: {
- accountAndExternalIdsHelpPath: '',
- createRoleArnHelpPath: '',
- externalLinkIcon: '',
- },
- store,
- });
- });
- afterEach(() => vm.destroy());
-
- const findAccountIdInput = () => vm.find('#gitlab-account-id');
- const findCopyAccountIdButton = () => vm.find('.js-copy-account-id-button');
- const findExternalIdInput = () => vm.find('#eks-external-id');
- const findCopyExternalIdButton = () => vm.find('.js-copy-external-id-button');
- const findInvalidCredentials = () => vm.find('.js-invalid-credentials');
- const findSubmitButton = () => vm.find(GlButton);
-
- it('displays provided account id', () => {
- expect(findAccountIdInput().attributes('value')).toBe(accountId);
- });
-
- it('allows to copy account id', () => {
- expect(findCopyAccountIdButton().props('text')).toBe(accountId);
- });
-
- it('displays provided external id', () => {
- expect(findExternalIdInput().attributes('value')).toBe(externalId);
- });
-
- it('allows to copy external id', () => {
- expect(findCopyExternalIdButton().props('text')).toBe(externalId);
- });
-
- it('disables submit button when role ARN is not provided', () => {
- expect(findSubmitButton().attributes('disabled')).toBeTruthy();
- });
-
- it('enables submit button when role ARN is not provided', async () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- vm.setData({ roleArn: '123' });
-
- await nextTick();
- expect(findSubmitButton().attributes('disabled')).toBeFalsy();
- });
-
- it('dispatches createRole action when submit button is clicked', () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- vm.setData({ roleArn: '123' }); // set role ARN to enable button
-
- findSubmitButton().vm.$emit('click', new Event('click'));
-
- expect(createRoleAction).toHaveBeenCalled();
- });
-
- describe('when is creating role', () => {
- beforeEach(async () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- vm.setData({ roleArn: '123' }); // set role ARN to enable button
-
- state.isCreatingRole = true;
-
- await nextTick();
- });
-
- it('disables submit button', () => {
- expect(findSubmitButton().props('disabled')).toBe(true);
- });
-
- it('sets submit button as loading', () => {
- expect(findSubmitButton().props('loading')).toBe(true);
- });
-
- it('displays Authenticating label on submit button', () => {
- expect(findSubmitButton().text()).toBe('Authenticating');
- });
- });
-
- describe('when role can’t be created', () => {
- beforeEach(() => {
- state.createRoleError = 'Invalid credentials';
- });
-
- it('displays invalid role warning banner', () => {
- expect(findInvalidCredentials().exists()).toBe(true);
- });
-
- it('displays invalid role error message', () => {
- expect(findInvalidCredentials().text()).toContain(state.createRoleError);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/services/aws_services_facade_spec.js b/spec/frontend/create_cluster/eks_cluster/services/aws_services_facade_spec.js
deleted file mode 100644
index 7b93b6d0a09..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/services/aws_services_facade_spec.js
+++ /dev/null
@@ -1,178 +0,0 @@
-import EC2 from 'aws-sdk/clients/ec2';
-import AWS from 'aws-sdk/global';
-import {
- setAWSConfig,
- fetchRoles,
- fetchKeyPairs,
- fetchVpcs,
- fetchSubnets,
- fetchSecurityGroups,
-} from '~/create_cluster/eks_cluster/services/aws_services_facade';
-
-const mockListRolesPromise = jest.fn();
-const mockDescribeRegionsPromise = jest.fn();
-const mockDescribeKeyPairsPromise = jest.fn();
-const mockDescribeVpcsPromise = jest.fn();
-const mockDescribeSubnetsPromise = jest.fn();
-const mockDescribeSecurityGroupsPromise = jest.fn();
-
-jest.mock('aws-sdk/clients/iam', () =>
- jest.fn().mockImplementation(() => ({
- listRoles: jest.fn().mockReturnValue({ promise: mockListRolesPromise }),
- })),
-);
-
-jest.mock('aws-sdk/clients/ec2', () =>
- jest.fn().mockImplementation(() => ({
- describeRegions: jest.fn().mockReturnValue({ promise: mockDescribeRegionsPromise }),
- describeKeyPairs: jest.fn().mockReturnValue({ promise: mockDescribeKeyPairsPromise }),
- describeVpcs: jest.fn().mockReturnValue({ promise: mockDescribeVpcsPromise }),
- describeSubnets: jest.fn().mockReturnValue({ promise: mockDescribeSubnetsPromise }),
- describeSecurityGroups: jest
- .fn()
- .mockReturnValue({ promise: mockDescribeSecurityGroupsPromise }),
- })),
-);
-
-describe('awsServicesFacade', () => {
- let region;
- let vpc;
-
- beforeEach(() => {
- region = 'west-1';
- vpc = 'vpc-2';
- });
-
- it('setAWSConfig configures AWS SDK with provided credentials', () => {
- const awsCredentials = {
- accessKeyId: 'access-key',
- secretAccessKey: 'secret-key',
- sessionToken: 'session-token',
- region,
- };
-
- setAWSConfig({ awsCredentials });
-
- expect(AWS.config).toEqual(awsCredentials);
- });
-
- describe('when fetchRoles succeeds', () => {
- let roles;
- let rolesOutput;
-
- beforeEach(() => {
- roles = [
- { RoleName: 'admin', Arn: 'aws::admin' },
- { RoleName: 'read-only', Arn: 'aws::read-only' },
- ];
- rolesOutput = roles.map(({ RoleName: name, Arn: value }) => ({ name, value }));
-
- mockListRolesPromise.mockResolvedValueOnce({ Roles: roles });
- });
-
- it('return list of regions where each item has a name and value', () => {
- return expect(fetchRoles()).resolves.toEqual(rolesOutput);
- });
- });
-
- describe('when fetchKeyPairs succeeds', () => {
- let keyPairs;
- let keyPairsOutput;
-
- beforeEach(() => {
- keyPairs = [{ KeyName: 'key-pair' }, { KeyName: 'key-pair-2' }];
- keyPairsOutput = keyPairs.map(({ KeyName: name }) => ({ name, value: name }));
-
- mockDescribeKeyPairsPromise.mockResolvedValueOnce({ KeyPairs: keyPairs });
- });
-
- it('instantatiates ec2 service with provided region', () => {
- fetchKeyPairs({ region });
- expect(EC2).toHaveBeenCalledWith({ region });
- });
-
- it('return list of key pairs where each item has a name and value', () => {
- return expect(fetchKeyPairs({ region })).resolves.toEqual(keyPairsOutput);
- });
- });
-
- describe('when fetchVpcs succeeds', () => {
- let vpcs;
- let vpcsOutput;
-
- beforeEach(() => {
- vpcs = [
- { VpcId: 'vpc-1', Tags: [] },
- { VpcId: 'vpc-2', Tags: [] },
- ];
- vpcsOutput = vpcs.map(({ VpcId: vpcId }) => ({ name: vpcId, value: vpcId }));
-
- mockDescribeVpcsPromise.mockResolvedValueOnce({ Vpcs: vpcs });
- });
-
- it('instantatiates ec2 service with provided region', () => {
- fetchVpcs({ region });
- expect(EC2).toHaveBeenCalledWith({ region });
- });
-
- it('return list of vpcs where each item has a name and value', () => {
- return expect(fetchVpcs({ region })).resolves.toEqual(vpcsOutput);
- });
- });
-
- describe('when vpcs has a Name tag', () => {
- const vpcName = 'vpc name';
- const vpcId = 'vpc id';
- let vpcs;
- let vpcsOutput;
-
- beforeEach(() => {
- vpcs = [{ VpcId: vpcId, Tags: [{ Key: 'Name', Value: vpcName }] }];
- vpcsOutput = [{ name: vpcName, value: vpcId }];
-
- mockDescribeVpcsPromise.mockResolvedValueOnce({ Vpcs: vpcs });
- });
-
- it('uses name tag value as the vpc name', () => {
- return expect(fetchVpcs({ region })).resolves.toEqual(vpcsOutput);
- });
- });
-
- describe('when fetchSubnets succeeds', () => {
- let subnets;
- let subnetsOutput;
-
- beforeEach(() => {
- subnets = [{ SubnetId: 'subnet-1' }, { SubnetId: 'subnet-2' }];
- subnetsOutput = subnets.map(({ SubnetId }) => ({ name: SubnetId, value: SubnetId }));
-
- mockDescribeSubnetsPromise.mockResolvedValueOnce({ Subnets: subnets });
- });
-
- it('return list of subnets where each item has a name and value', () => {
- return expect(fetchSubnets({ region, vpc })).resolves.toEqual(subnetsOutput);
- });
- });
-
- describe('when fetchSecurityGroups succeeds', () => {
- let securityGroups;
- let securityGroupsOutput;
-
- beforeEach(() => {
- securityGroups = [
- { GroupName: 'admin group', GroupId: 'group-1' },
- { GroupName: 'basic group', GroupId: 'group-2' },
- ];
- securityGroupsOutput = securityGroups.map(({ GroupId: value, GroupName: name }) => ({
- name,
- value,
- }));
-
- mockDescribeSecurityGroupsPromise.mockResolvedValueOnce({ SecurityGroups: securityGroups });
- });
-
- it('return list of security groups where each item has a name and value', () => {
- return expect(fetchSecurityGroups({ region, vpc })).resolves.toEqual(securityGroupsOutput);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js b/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
deleted file mode 100644
index 8d7b22fe4ff..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/store/actions_spec.js
+++ /dev/null
@@ -1,366 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
-import testAction from 'helpers/vuex_action_helper';
-import { DEFAULT_REGION } from '~/create_cluster/eks_cluster/constants';
-import * as actions from '~/create_cluster/eks_cluster/store/actions';
-import {
- SET_CLUSTER_NAME,
- SET_ENVIRONMENT_SCOPE,
- SET_KUBERNETES_VERSION,
- SET_REGION,
- SET_VPC,
- SET_KEY_PAIR,
- SET_SUBNET,
- SET_ROLE,
- SET_SECURITY_GROUP,
- SET_GITLAB_MANAGED_CLUSTER,
- SET_NAMESPACE_PER_ENVIRONMENT,
- SET_INSTANCE_TYPE,
- SET_NODE_COUNT,
- REQUEST_CREATE_ROLE,
- CREATE_ROLE_SUCCESS,
- CREATE_ROLE_ERROR,
- REQUEST_CREATE_CLUSTER,
- CREATE_CLUSTER_ERROR,
-} from '~/create_cluster/eks_cluster/store/mutation_types';
-import createState from '~/create_cluster/eks_cluster/store/state';
-import createFlash from '~/flash';
-import axios from '~/lib/utils/axios_utils';
-
-jest.mock('~/flash');
-
-describe('EKS Cluster Store Actions', () => {
- let clusterName;
- let environmentScope;
- let kubernetesVersion;
- let region;
- let vpc;
- let subnet;
- let role;
- let keyPair;
- let securityGroup;
- let instanceType;
- let nodeCount;
- let gitlabManagedCluster;
- let namespacePerEnvironment;
- let mock;
- let state;
- let newClusterUrl;
-
- beforeEach(() => {
- clusterName = 'my cluster';
- environmentScope = 'production';
- kubernetesVersion = '1.16';
- region = 'regions-1';
- vpc = 'vpc-1';
- subnet = 'subnet-1';
- role = 'role-1';
- keyPair = 'key-pair-1';
- securityGroup = 'default group';
- instanceType = 'small-1';
- nodeCount = '5';
- gitlabManagedCluster = true;
- namespacePerEnvironment = true;
-
- newClusterUrl = '/clusters/1';
-
- state = {
- ...createState(),
- createRolePath: '/clusters/roles/',
- createClusterPath: '/clusters/',
- };
- });
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- it.each`
- action | mutation | payload | payloadDescription
- ${'setClusterName'} | ${SET_CLUSTER_NAME} | ${{ clusterName }} | ${'cluster name'}
- ${'setEnvironmentScope'} | ${SET_ENVIRONMENT_SCOPE} | ${{ environmentScope }} | ${'environment scope'}
- ${'setKubernetesVersion'} | ${SET_KUBERNETES_VERSION} | ${{ kubernetesVersion }} | ${'kubernetes version'}
- ${'setRole'} | ${SET_ROLE} | ${{ role }} | ${'role'}
- ${'setRegion'} | ${SET_REGION} | ${{ region }} | ${'region'}
- ${'setKeyPair'} | ${SET_KEY_PAIR} | ${{ keyPair }} | ${'key pair'}
- ${'setVpc'} | ${SET_VPC} | ${{ vpc }} | ${'vpc'}
- ${'setSubnet'} | ${SET_SUBNET} | ${{ subnet }} | ${'subnet'}
- ${'setSecurityGroup'} | ${SET_SECURITY_GROUP} | ${{ securityGroup }} | ${'securityGroup'}
- ${'setInstanceType'} | ${SET_INSTANCE_TYPE} | ${{ instanceType }} | ${'instance type'}
- ${'setNodeCount'} | ${SET_NODE_COUNT} | ${{ nodeCount }} | ${'node count'}
- ${'setGitlabManagedCluster'} | ${SET_GITLAB_MANAGED_CLUSTER} | ${gitlabManagedCluster} | ${'gitlab managed cluster'}
- ${'setNamespacePerEnvironment'} | ${SET_NAMESPACE_PER_ENVIRONMENT} | ${namespacePerEnvironment} | ${'namespace per environment'}
- `(`$action commits $mutation with $payloadDescription payload`, (data) => {
- const { action, mutation, payload } = data;
-
- testAction(actions[action], payload, state, [{ type: mutation, payload }]);
- });
-
- describe('createRole', () => {
- const payload = {
- roleArn: 'role_arn',
- externalId: 'externalId',
- };
- const response = {
- accessKeyId: 'access-key-id',
- secretAccessKey: 'secret-key-id',
- };
-
- describe('when request succeeds with default region', () => {
- beforeEach(() => {
- mock
- .onPost(state.createRolePath, {
- role_arn: payload.roleArn,
- role_external_id: payload.externalId,
- region: DEFAULT_REGION,
- })
- .reply(201, response);
- });
-
- it('dispatches createRoleSuccess action', () =>
- testAction(
- actions.createRole,
- payload,
- state,
- [],
- [
- { type: 'requestCreateRole' },
- {
- type: 'createRoleSuccess',
- payload: {
- region: DEFAULT_REGION,
- ...response,
- },
- },
- ],
- ));
- });
-
- describe('when request succeeds with custom region', () => {
- const customRegion = 'custom-region';
-
- beforeEach(() => {
- mock
- .onPost(state.createRolePath, {
- role_arn: payload.roleArn,
- role_external_id: payload.externalId,
- region: customRegion,
- })
- .reply(201, response);
- });
-
- it('dispatches createRoleSuccess action', () =>
- testAction(
- actions.createRole,
- {
- selectedRegion: customRegion,
- ...payload,
- },
- state,
- [],
- [
- { type: 'requestCreateRole' },
- {
- type: 'createRoleSuccess',
- payload: {
- region: customRegion,
- ...response,
- },
- },
- ],
- ));
- });
-
- describe('when request fails', () => {
- let error;
-
- beforeEach(() => {
- error = new Error('Request failed with status code 400');
- mock
- .onPost(state.createRolePath, {
- role_arn: payload.roleArn,
- role_external_id: payload.externalId,
- region: DEFAULT_REGION,
- })
- .reply(400, null);
- });
-
- it('dispatches createRoleError action', () =>
- testAction(
- actions.createRole,
- payload,
- state,
- [],
- [{ type: 'requestCreateRole' }, { type: 'createRoleError', payload: { error } }],
- ));
- });
-
- describe('when request fails with a message', () => {
- beforeEach(() => {
- const errResp = { message: 'Something failed' };
-
- mock
- .onPost(state.createRolePath, {
- role_arn: payload.roleArn,
- role_external_id: payload.externalId,
- region: DEFAULT_REGION,
- })
- .reply(4, errResp);
- });
-
- it('dispatches createRoleError action', () =>
- testAction(
- actions.createRole,
- payload,
- state,
- [],
- [
- { type: 'requestCreateRole' },
- { type: 'createRoleError', payload: { error: 'Something failed' } },
- ],
- ));
- });
- });
-
- describe('requestCreateRole', () => {
- it('commits requestCreaterole mutation', () => {
- testAction(actions.requestCreateRole, null, state, [{ type: REQUEST_CREATE_ROLE }]);
- });
- });
-
- describe('createRoleSuccess', () => {
- it('sets region and commits createRoleSuccess mutation', () => {
- testAction(
- actions.createRoleSuccess,
- { region },
- state,
- [{ type: CREATE_ROLE_SUCCESS }],
- [{ type: 'setRegion', payload: { region } }],
- );
- });
- });
-
- describe('createRoleError', () => {
- it('commits createRoleError mutation', () => {
- const payload = {
- error: new Error(),
- };
-
- testAction(actions.createRoleError, payload, state, [{ type: CREATE_ROLE_ERROR, payload }]);
- });
- });
-
- describe('createCluster', () => {
- let requestPayload;
-
- beforeEach(() => {
- requestPayload = {
- name: clusterName,
- environment_scope: environmentScope,
- managed: gitlabManagedCluster,
- namespace_per_environment: namespacePerEnvironment,
- provider_aws_attributes: {
- kubernetes_version: kubernetesVersion,
- region,
- vpc_id: vpc,
- subnet_ids: subnet,
- role_arn: role,
- key_name: keyPair,
- security_group_id: securityGroup,
- instance_type: instanceType,
- num_nodes: nodeCount,
- },
- };
- state = Object.assign(createState(), {
- clusterName,
- environmentScope,
- kubernetesVersion,
- selectedRegion: region,
- selectedVpc: vpc,
- selectedSubnet: subnet,
- selectedRole: role,
- selectedKeyPair: keyPair,
- selectedSecurityGroup: securityGroup,
- selectedInstanceType: instanceType,
- nodeCount,
- gitlabManagedCluster,
- namespacePerEnvironment,
- });
- });
-
- describe('when request succeeds', () => {
- beforeEach(() => {
- mock.onPost(state.createClusterPath, requestPayload).reply(201, null, {
- location: '/clusters/1',
- });
- });
-
- it('dispatches createClusterSuccess action', () =>
- testAction(
- actions.createCluster,
- null,
- state,
- [],
- [
- { type: 'requestCreateCluster' },
- { type: 'createClusterSuccess', payload: newClusterUrl },
- ],
- ));
- });
-
- describe('when request fails', () => {
- let response;
-
- beforeEach(() => {
- response = 'Request failed with status code 400';
- mock.onPost(state.createClusterPath, requestPayload).reply(400, response);
- });
-
- it('dispatches createRoleError action', () =>
- testAction(
- actions.createCluster,
- null,
- state,
- [],
- [{ type: 'requestCreateCluster' }, { type: 'createClusterError', payload: response }],
- ));
- });
- });
-
- describe('requestCreateCluster', () => {
- it('commits requestCreateCluster mutation', () => {
- testAction(actions.requestCreateCluster, null, state, [{ type: REQUEST_CREATE_CLUSTER }]);
- });
- });
-
- describe('createClusterSuccess', () => {
- useMockLocationHelper();
-
- it('redirects to the new cluster URL', () => {
- actions.createClusterSuccess(null, newClusterUrl);
-
- expect(window.location.assign).toHaveBeenCalledWith(newClusterUrl);
- });
- });
-
- describe('createClusterError', () => {
- let payload;
-
- beforeEach(() => {
- payload = { name: ['Create cluster failed'] };
- });
-
- it('commits createClusterError mutation and displays flash message', () =>
- testAction(actions.createClusterError, payload, state, [
- { type: CREATE_CLUSTER_ERROR, payload },
- ]).then(() => {
- expect(createFlash).toHaveBeenCalledWith({
- message: payload.name[0],
- });
- }));
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/store/getters_spec.js b/spec/frontend/create_cluster/eks_cluster/store/getters_spec.js
deleted file mode 100644
index 46c37961dd3..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/store/getters_spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { subnetValid } from '~/create_cluster/eks_cluster/store/getters';
-
-describe('EKS Cluster Store Getters', () => {
- describe('subnetValid', () => {
- it('returns true if there are 2 or more selected subnets', () => {
- expect(subnetValid({ selectedSubnet: [1, 2] })).toBe(true);
- });
-
- it.each([[[], [1]]])('returns false if there are 1 or less selected subnets', (subnets) => {
- expect(subnetValid({ selectedSubnet: subnets })).toBe(false);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js b/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js
deleted file mode 100644
index 54d66e79be7..00000000000
--- a/spec/frontend/create_cluster/eks_cluster/store/mutations_spec.js
+++ /dev/null
@@ -1,161 +0,0 @@
-import {
- SET_CLUSTER_NAME,
- SET_ENVIRONMENT_SCOPE,
- SET_KUBERNETES_VERSION,
- SET_REGION,
- SET_VPC,
- SET_KEY_PAIR,
- SET_SUBNET,
- SET_ROLE,
- SET_SECURITY_GROUP,
- SET_INSTANCE_TYPE,
- SET_NODE_COUNT,
- SET_GITLAB_MANAGED_CLUSTER,
- REQUEST_CREATE_ROLE,
- CREATE_ROLE_SUCCESS,
- CREATE_ROLE_ERROR,
- REQUEST_CREATE_CLUSTER,
- CREATE_CLUSTER_ERROR,
-} from '~/create_cluster/eks_cluster/store/mutation_types';
-import mutations from '~/create_cluster/eks_cluster/store/mutations';
-import createState from '~/create_cluster/eks_cluster/store/state';
-
-describe('Create EKS cluster store mutations', () => {
- let clusterName;
- let environmentScope;
- let kubernetesVersion;
- let state;
- let region;
- let vpc;
- let subnet;
- let role;
- let keyPair;
- let securityGroup;
- let instanceType;
- let nodeCount;
- let gitlabManagedCluster;
-
- beforeEach(() => {
- clusterName = 'my cluster';
- environmentScope = 'production';
- kubernetesVersion = '11.1';
- region = { name: 'regions-1' };
- vpc = { name: 'vpc-1' };
- subnet = { name: 'subnet-1' };
- role = { name: 'role-1' };
- keyPair = { name: 'key pair' };
- securityGroup = { name: 'default group' };
- instanceType = 'small-1';
- nodeCount = '5';
- gitlabManagedCluster = false;
-
- state = createState();
- });
-
- it.each`
- mutation | mutatedProperty | payload | expectedValue | expectedValueDescription
- ${SET_CLUSTER_NAME} | ${'clusterName'} | ${{ clusterName }} | ${clusterName} | ${'cluster name'}
- ${SET_ENVIRONMENT_SCOPE} | ${'environmentScope'} | ${{ environmentScope }} | ${environmentScope} | ${'environment scope'}
- ${SET_KUBERNETES_VERSION} | ${'kubernetesVersion'} | ${{ kubernetesVersion }} | ${kubernetesVersion} | ${'kubernetes version'}
- ${SET_ROLE} | ${'selectedRole'} | ${{ role }} | ${role} | ${'selected role payload'}
- ${SET_REGION} | ${'selectedRegion'} | ${{ region }} | ${region} | ${'selected region payload'}
- ${SET_KEY_PAIR} | ${'selectedKeyPair'} | ${{ keyPair }} | ${keyPair} | ${'selected key pair payload'}
- ${SET_VPC} | ${'selectedVpc'} | ${{ vpc }} | ${vpc} | ${'selected vpc payload'}
- ${SET_SUBNET} | ${'selectedSubnet'} | ${{ subnet }} | ${subnet} | ${'selected subnet payload'}
- ${SET_SECURITY_GROUP} | ${'selectedSecurityGroup'} | ${{ securityGroup }} | ${securityGroup} | ${'selected security group payload'}
- ${SET_INSTANCE_TYPE} | ${'selectedInstanceType'} | ${{ instanceType }} | ${instanceType} | ${'selected instance type payload'}
- ${SET_NODE_COUNT} | ${'nodeCount'} | ${{ nodeCount }} | ${nodeCount} | ${'node count payload'}
- ${SET_GITLAB_MANAGED_CLUSTER} | ${'gitlabManagedCluster'} | ${{ gitlabManagedCluster }} | ${gitlabManagedCluster} | ${'gitlab managed cluster'}
- `(`$mutation sets $mutatedProperty to $expectedValueDescription`, (data) => {
- const { mutation, mutatedProperty, payload, expectedValue } = data;
-
- mutations[mutation](state, payload);
- expect(state[mutatedProperty]).toBe(expectedValue);
- });
-
- describe(`mutation ${REQUEST_CREATE_ROLE}`, () => {
- beforeEach(() => {
- mutations[REQUEST_CREATE_ROLE](state);
- });
-
- it('sets isCreatingRole to true', () => {
- expect(state.isCreatingRole).toBe(true);
- });
-
- it('sets createRoleError to null', () => {
- expect(state.createRoleError).toBe(null);
- });
-
- it('sets hasCredentials to false', () => {
- expect(state.hasCredentials).toBe(false);
- });
- });
-
- describe(`mutation ${CREATE_ROLE_SUCCESS}`, () => {
- beforeEach(() => {
- mutations[CREATE_ROLE_SUCCESS](state);
- });
-
- it('sets isCreatingRole to false', () => {
- expect(state.isCreatingRole).toBe(false);
- });
-
- it('sets createRoleError to null', () => {
- expect(state.createRoleError).toBe(null);
- });
-
- it('sets hasCredentials to false', () => {
- expect(state.hasCredentials).toBe(true);
- });
- });
-
- describe(`mutation ${CREATE_ROLE_ERROR}`, () => {
- const error = new Error();
-
- beforeEach(() => {
- mutations[CREATE_ROLE_ERROR](state, { error });
- });
-
- it('sets isCreatingRole to false', () => {
- expect(state.isCreatingRole).toBe(false);
- });
-
- it('sets createRoleError to the error object', () => {
- expect(state.createRoleError).toBe(error);
- });
-
- it('sets hasCredentials to false', () => {
- expect(state.hasCredentials).toBe(false);
- });
- });
-
- describe(`mutation ${REQUEST_CREATE_CLUSTER}`, () => {
- beforeEach(() => {
- mutations[REQUEST_CREATE_CLUSTER](state);
- });
-
- it('sets isCreatingCluster to true', () => {
- expect(state.isCreatingCluster).toBe(true);
- });
-
- it('sets createClusterError to null', () => {
- expect(state.createClusterError).toBe(null);
- });
- });
-
- describe(`mutation ${CREATE_CLUSTER_ERROR}`, () => {
- const error = new Error();
-
- beforeEach(() => {
- mutations[CREATE_CLUSTER_ERROR](state, { error });
- });
-
- it('sets isCreatingRole to false', () => {
- expect(state.isCreatingCluster).toBe(false);
- });
-
- it('sets createRoleError to the error object', () => {
- expect(state.createClusterError).toBe(error);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js
deleted file mode 100644
index f46b84da939..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_machine_type_dropdown_spec.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
-import GkeMachineTypeDropdown from '~/create_cluster/gke_cluster/components/gke_machine_type_dropdown.vue';
-import createState from '~/create_cluster/gke_cluster/store/state';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-import { selectedMachineTypeMock, gapiMachineTypesResponseMock } from '../mock_data';
-
-const componentConfig = {
- fieldId: 'cluster_provider_gcp_attributes_gcp_machine_type',
- fieldName: 'cluster[provider_gcp_attributes][gcp_machine_type]',
-};
-const setMachineType = jest.fn();
-
-const LABELS = {
- LOADING: 'Fetching machine types',
- DISABLED_NO_PROJECT: 'Select project and zone to choose machine type',
- DISABLED_NO_ZONE: 'Select zone to choose machine type',
- DEFAULT: 'Select machine type',
-};
-
-Vue.use(Vuex);
-
-const createComponent = (store, propsData = componentConfig) =>
- shallowMount(GkeMachineTypeDropdown, {
- propsData,
- store,
- });
-
-const createStore = (initialState = {}, getters = {}) =>
- new Vuex.Store({
- state: {
- ...createState(),
- ...initialState,
- },
- getters: {
- hasZone: () => false,
- ...getters,
- },
- actions: {
- setMachineType,
- },
- });
-
-describe('GkeMachineTypeDropdown', () => {
- let wrapper;
- let store;
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- const dropdownButtonLabel = () => wrapper.find(DropdownButton).props('toggleText');
- const dropdownHiddenInputValue = () => wrapper.find(DropdownHiddenInput).props('value');
-
- describe('shows various toggle text depending on state', () => {
- it('returns disabled state toggle text when no project and zone are selected', () => {
- store = createStore({
- projectHasBillingEnabled: false,
- });
- wrapper = createComponent(store);
-
- expect(dropdownButtonLabel()).toBe(LABELS.DISABLED_NO_PROJECT);
- });
-
- it('returns disabled state toggle text when no zone is selected', () => {
- store = createStore({
- projectHasBillingEnabled: true,
- });
- wrapper = createComponent(store);
-
- expect(dropdownButtonLabel()).toBe(LABELS.DISABLED_NO_ZONE);
- });
-
- it('returns loading toggle text', async () => {
- store = createStore();
- wrapper = createComponent(store);
-
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: true });
-
- await nextTick();
- expect(dropdownButtonLabel()).toBe(LABELS.LOADING);
- });
-
- it('returns default toggle text', () => {
- store = createStore(
- {
- projectHasBillingEnabled: true,
- },
- { hasZone: () => true },
- );
- wrapper = createComponent(store);
-
- expect(dropdownButtonLabel()).toBe(LABELS.DEFAULT);
- });
-
- it('returns machine type name if machine type selected', () => {
- store = createStore(
- {
- projectHasBillingEnabled: true,
- selectedMachineType: selectedMachineTypeMock,
- },
- { hasZone: () => true },
- );
- wrapper = createComponent(store);
-
- expect(dropdownButtonLabel()).toBe(selectedMachineTypeMock);
- });
- });
-
- describe('form input', () => {
- it('reflects new value when dropdown item is clicked', async () => {
- store = createStore({
- machineTypes: gapiMachineTypesResponseMock.items,
- });
- wrapper = createComponent(store);
-
- expect(dropdownHiddenInputValue()).toBe('');
-
- wrapper.find('.dropdown-content button').trigger('click');
-
- await nextTick();
- expect(setMachineType).toHaveBeenCalledWith(expect.anything(), selectedMachineTypeMock);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js
deleted file mode 100644
index addb0ef72a0..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_network_dropdown_spec.js
+++ /dev/null
@@ -1,137 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-import GkeNetworkDropdown from '~/create_cluster/gke_cluster/components/gke_network_dropdown.vue';
-import createClusterDropdownState from '~/create_cluster/store/cluster_dropdown/state';
-
-Vue.use(Vuex);
-
-describe('GkeNetworkDropdown', () => {
- let wrapper;
- let store;
- const defaultProps = { fieldName: 'field-name' };
- const selectedNetwork = { selfLink: '123456' };
- const projectId = '6789';
- const region = 'east-1';
- const setNetwork = jest.fn();
- const setSubnetwork = jest.fn();
- const fetchSubnetworks = jest.fn();
-
- const buildStore = ({ clusterDropdownState } = {}) =>
- new Vuex.Store({
- state: {
- selectedNetwork,
- },
- actions: {
- setNetwork,
- setSubnetwork,
- },
- getters: {
- hasZone: () => false,
- region: () => region,
- projectId: () => projectId,
- },
- modules: {
- networks: {
- namespaced: true,
- state: {
- ...createClusterDropdownState(),
- ...(clusterDropdownState || {}),
- },
- },
- subnetworks: {
- namespaced: true,
- actions: {
- fetchItems: fetchSubnetworks,
- },
- },
- },
- });
-
- const buildWrapper = (propsData = defaultProps) =>
- shallowMount(GkeNetworkDropdown, {
- propsData,
- store,
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('sets correct field-name', () => {
- const fieldName = 'field-name';
-
- store = buildStore();
- wrapper = buildWrapper({ fieldName });
-
- expect(wrapper.find(ClusterFormDropdown).props('fieldName')).toBe(fieldName);
- });
-
- it('sets selected network as the dropdown value', () => {
- store = buildStore();
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('value')).toBe(selectedNetwork);
- });
-
- it('maps networks store items to the dropdown items property', () => {
- const items = [{ name: 'network' }];
-
- store = buildStore({ clusterDropdownState: { items } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('items')).toBe(items);
- });
-
- describe('when network dropdown store is loading items', () => {
- it('sets network dropdown as loading', () => {
- store = buildStore({ clusterDropdownState: { isLoadingItems: true } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('loading')).toBe(true);
- });
- });
-
- describe('when there is no selected zone', () => {
- it('disables the network dropdown', () => {
- store = buildStore();
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('disabled')).toBe(true);
- });
- });
-
- describe('when an error occurs while loading networks', () => {
- it('sets the network dropdown as having errors', () => {
- store = buildStore({ clusterDropdownState: { loadingItemsError: new Error() } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('hasErrors')).toBe(true);
- });
- });
-
- describe('when dropdown emits input event', () => {
- beforeEach(() => {
- store = buildStore();
- wrapper = buildWrapper();
- wrapper.find(ClusterFormDropdown).vm.$emit('input', selectedNetwork);
- });
-
- it('cleans selected subnetwork', () => {
- expect(setSubnetwork).toHaveBeenCalledWith(expect.anything(), '');
- });
-
- it('dispatches the setNetwork action', () => {
- expect(setNetwork).toHaveBeenCalledWith(expect.anything(), selectedNetwork);
- });
-
- it('fetches subnetworks for the selected project, region, and network', () => {
- expect(fetchSubnetworks).toHaveBeenCalledWith(expect.anything(), {
- project: projectId,
- region,
- network: selectedNetwork.selfLink,
- });
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js
deleted file mode 100644
index 36f8d4bd1e8..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_project_id_dropdown_spec.js
+++ /dev/null
@@ -1,137 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import Vuex from 'vuex';
-import GkeProjectIdDropdown from '~/create_cluster/gke_cluster/components/gke_project_id_dropdown.vue';
-import createState from '~/create_cluster/gke_cluster/store/state';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-import { selectedProjectMock, gapiProjectsResponseMock } from '../mock_data';
-
-const componentConfig = {
- docsUrl: 'https://console.cloud.google.com/home/dashboard',
- fieldId: 'cluster_provider_gcp_attributes_gcp_project_id',
- fieldName: 'cluster[provider_gcp_attributes][gcp_project_id]',
-};
-
-const LABELS = {
- LOADING: 'Fetching projects',
- VALIDATING_PROJECT_BILLING: 'Validating project billing status',
- DEFAULT: 'Select project',
- EMPTY: 'No projects found',
-};
-
-Vue.use(Vuex);
-
-describe('GkeProjectIdDropdown', () => {
- let wrapper;
- let vuexStore;
- let setProject;
-
- beforeEach(() => {
- setProject = jest.fn();
- });
-
- const createStore = (initialState = {}, getters = {}) =>
- new Vuex.Store({
- state: {
- ...createState(),
- ...initialState,
- },
- actions: {
- fetchProjects: jest.fn().mockResolvedValueOnce([]),
- setProject,
- },
- getters: {
- hasProject: () => false,
- ...getters,
- },
- });
-
- const createComponent = (store, propsData = componentConfig) =>
- shallowMount(GkeProjectIdDropdown, {
- propsData,
- store,
- });
-
- const bootstrap = (initialState, getters) => {
- vuexStore = createStore(initialState, getters);
- wrapper = createComponent(vuexStore);
- };
-
- const dropdownButtonLabel = () => wrapper.find(DropdownButton).props('toggleText');
- const dropdownHiddenInputValue = () => wrapper.find(DropdownHiddenInput).props('value');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('toggleText', () => {
- it('returns loading toggle text', () => {
- bootstrap();
-
- expect(dropdownButtonLabel()).toBe(LABELS.LOADING);
- });
-
- it('returns project billing validation text', () => {
- bootstrap({ isValidatingProjectBilling: true });
-
- expect(dropdownButtonLabel()).toBe(LABELS.VALIDATING_PROJECT_BILLING);
- });
-
- it('returns default toggle text', async () => {
- bootstrap();
-
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: false });
-
- await nextTick();
- expect(dropdownButtonLabel()).toBe(LABELS.DEFAULT);
- });
-
- it('returns project name if project selected', async () => {
- bootstrap(
- {
- selectedProject: selectedProjectMock,
- },
- {
- hasProject: () => true,
- },
- );
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: false });
-
- await nextTick();
- expect(dropdownButtonLabel()).toBe(selectedProjectMock.name);
- });
-
- it('returns empty toggle text', async () => {
- bootstrap({
- projects: null,
- });
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: false });
-
- await nextTick();
- expect(dropdownButtonLabel()).toBe(LABELS.EMPTY);
- });
- });
-
- describe('selectItem', () => {
- it('reflects new value when dropdown item is clicked', async () => {
- bootstrap({ projects: gapiProjectsResponseMock.projects });
-
- expect(dropdownHiddenInputValue()).toBe('');
-
- wrapper.find('.dropdown-content button').trigger('click');
-
- await nextTick();
- expect(setProject).toHaveBeenCalledWith(
- expect.anything(),
- gapiProjectsResponseMock.projects[0],
- );
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js
deleted file mode 100644
index 2bf9158628c..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_submit_button_spec.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-import GkeSubmitButton from '~/create_cluster/gke_cluster/components/gke_submit_button.vue';
-
-Vue.use(Vuex);
-
-describe('GkeSubmitButton', () => {
- let wrapper;
- let store;
- let hasValidData;
-
- const buildStore = () =>
- new Vuex.Store({
- getters: {
- hasValidData,
- },
- });
-
- const buildWrapper = () =>
- shallowMount(GkeSubmitButton, {
- store,
- });
-
- const bootstrap = () => {
- store = buildStore();
- wrapper = buildWrapper();
- };
-
- beforeEach(() => {
- hasValidData = jest.fn();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('is disabled when hasValidData is false', () => {
- hasValidData.mockReturnValueOnce(false);
- bootstrap();
-
- expect(wrapper.attributes('disabled')).toBe('disabled');
- });
-
- it('is not disabled when hasValidData is true', () => {
- hasValidData.mockReturnValueOnce(true);
- bootstrap();
-
- expect(wrapper.attributes('disabled')).toBeFalsy();
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js
deleted file mode 100644
index 9df680d94b5..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_subnetwork_dropdown_spec.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-import ClusterFormDropdown from '~/create_cluster/components/cluster_form_dropdown.vue';
-import GkeSubnetworkDropdown from '~/create_cluster/gke_cluster/components/gke_subnetwork_dropdown.vue';
-import createClusterDropdownState from '~/create_cluster/store/cluster_dropdown/state';
-
-Vue.use(Vuex);
-
-describe('GkeSubnetworkDropdown', () => {
- let wrapper;
- let store;
- const defaultProps = { fieldName: 'field-name' };
- const selectedSubnetwork = '123456';
- const setSubnetwork = jest.fn();
-
- const buildStore = ({ clusterDropdownState } = {}) =>
- new Vuex.Store({
- state: {
- selectedSubnetwork,
- },
- actions: {
- setSubnetwork,
- },
- getters: {
- hasNetwork: () => false,
- },
- modules: {
- subnetworks: {
- namespaced: true,
- state: {
- ...createClusterDropdownState(),
- ...(clusterDropdownState || {}),
- },
- },
- },
- });
-
- const buildWrapper = (propsData = defaultProps) =>
- shallowMount(GkeSubnetworkDropdown, {
- propsData,
- store,
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('sets correct field-name', () => {
- const fieldName = 'field-name';
-
- store = buildStore();
- wrapper = buildWrapper({ fieldName });
-
- expect(wrapper.find(ClusterFormDropdown).props('fieldName')).toBe(fieldName);
- });
-
- it('sets selected subnetwork as the dropdown value', () => {
- store = buildStore();
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('value')).toBe(selectedSubnetwork);
- });
-
- it('maps subnetworks store items to the dropdown items property', () => {
- const items = [{ name: 'subnetwork' }];
-
- store = buildStore({ clusterDropdownState: { items } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('items')).toBe(items);
- });
-
- describe('when subnetwork dropdown store is loading items', () => {
- it('sets subnetwork dropdown as loading', () => {
- store = buildStore({ clusterDropdownState: { isLoadingItems: true } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('loading')).toBe(true);
- });
- });
-
- describe('when there is no selected network', () => {
- it('disables the subnetwork dropdown', () => {
- store = buildStore();
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('disabled')).toBe(true);
- });
- });
-
- describe('when an error occurs while loading subnetworks', () => {
- it('sets the subnetwork dropdown as having errors', () => {
- store = buildStore({ clusterDropdownState: { loadingItemsError: new Error() } });
- wrapper = buildWrapper();
-
- expect(wrapper.find(ClusterFormDropdown).props('hasErrors')).toBe(true);
- });
- });
-
- describe('when dropdown emits input event', () => {
- it('dispatches the setSubnetwork action', () => {
- store = buildStore();
- wrapper = buildWrapper();
-
- wrapper.find(ClusterFormDropdown).vm.$emit('input', selectedSubnetwork);
-
- expect(setSubnetwork).toHaveBeenCalledWith(expect.anything(), selectedSubnetwork);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js b/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js
deleted file mode 100644
index 7b4c228b879..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/components/gke_zone_dropdown_spec.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import GkeZoneDropdown from '~/create_cluster/gke_cluster/components/gke_zone_dropdown.vue';
-import { createStore } from '~/create_cluster/gke_cluster/store';
-import {
- SET_PROJECT,
- SET_ZONES,
- SET_PROJECT_BILLING_STATUS,
-} from '~/create_cluster/gke_cluster/store/mutation_types';
-import DropdownButton from '~/vue_shared/components/dropdown/dropdown_button.vue';
-import DropdownHiddenInput from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-import { selectedZoneMock, selectedProjectMock, gapiZonesResponseMock } from '../mock_data';
-
-const propsData = {
- fieldId: 'cluster_provider_gcp_attributes_gcp_zone',
- fieldName: 'cluster[provider_gcp_attributes][gcp_zone]',
-};
-
-const LABELS = {
- LOADING: 'Fetching zones',
- DISABLED: 'Select project to choose zone',
- DEFAULT: 'Select zone',
-};
-
-describe('GkeZoneDropdown', () => {
- let store;
- let wrapper;
-
- beforeEach(() => {
- store = createStore();
- wrapper = shallowMount(GkeZoneDropdown, { propsData, store });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('toggleText', () => {
- let dropdownButton;
-
- beforeEach(() => {
- dropdownButton = wrapper.find(DropdownButton);
- });
-
- it('returns disabled state toggle text', () => {
- expect(dropdownButton.props('toggleText')).toBe(LABELS.DISABLED);
- });
-
- describe('isLoading', () => {
- beforeEach(async () => {
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: true });
- await nextTick();
- });
-
- it('returns loading toggle text', () => {
- expect(dropdownButton.props('toggleText')).toBe(LABELS.LOADING);
- });
- });
-
- describe('project is set', () => {
- beforeEach(async () => {
- wrapper.vm.$store.commit(SET_PROJECT, selectedProjectMock);
- wrapper.vm.$store.commit(SET_PROJECT_BILLING_STATUS, true);
- await nextTick();
- });
-
- it('returns default toggle text', () => {
- expect(dropdownButton.props('toggleText')).toBe(LABELS.DEFAULT);
- });
- });
-
- describe('project is selected', () => {
- beforeEach(async () => {
- wrapper.vm.setItem(selectedZoneMock);
- await nextTick();
- });
-
- it('returns project name if project selected', () => {
- expect(dropdownButton.props('toggleText')).toBe(selectedZoneMock);
- });
- });
- });
-
- describe('selectItem', () => {
- beforeEach(async () => {
- wrapper.vm.$store.commit(SET_ZONES, gapiZonesResponseMock.items);
- await nextTick();
- });
-
- it('reflects new value when dropdown item is clicked', async () => {
- const dropdown = wrapper.find(DropdownHiddenInput);
-
- expect(dropdown.attributes('value')).toBe('');
-
- wrapper.find('.dropdown-content button').trigger('click');
-
- await nextTick();
- expect(dropdown.attributes('value')).toBe(selectedZoneMock);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js b/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js
deleted file mode 100644
index 9e4d6996340..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/gapi_loader_spec.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import gapiLoader from '~/create_cluster/gke_cluster/gapi_loader';
-
-describe('gapiLoader', () => {
- // A mock for document.head.appendChild to intercept the script tag injection.
- let mockDOMHeadAppendChild;
-
- beforeEach(() => {
- mockDOMHeadAppendChild = jest.spyOn(document.head, 'appendChild');
- });
-
- afterEach(() => {
- mockDOMHeadAppendChild.mockRestore();
- delete window.gapi;
- delete window.gapiPromise;
- delete window.onGapiLoad;
- });
-
- it('returns a promise', () => {
- expect(gapiLoader()).toBeInstanceOf(Promise);
- });
-
- it('returns the same promise when already loading', () => {
- const first = gapiLoader();
- const second = gapiLoader();
- expect(first).toBe(second);
- });
-
- it('resolves the promise when the script loads correctly', async () => {
- mockDOMHeadAppendChild.mockImplementationOnce((script) => {
- script.removeAttribute('src');
- script.appendChild(
- document.createTextNode(`window.gapi = 'hello gapi'; window.onGapiLoad()`),
- );
- document.head.appendChild(script);
- });
- await expect(gapiLoader()).resolves.toBe('hello gapi');
- expect(mockDOMHeadAppendChild).toHaveBeenCalled();
- });
-
- it('rejects the promise when the script fails loading', async () => {
- mockDOMHeadAppendChild.mockImplementationOnce((script) => {
- script.onerror(new Error('hello error'));
- });
- await expect(gapiLoader()).rejects.toThrow('hello error');
- expect(mockDOMHeadAppendChild).toHaveBeenCalled();
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/helpers.js b/spec/frontend/create_cluster/gke_cluster/helpers.js
deleted file mode 100644
index 026e99fa8f4..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/helpers.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import {
- gapiProjectsResponseMock,
- gapiZonesResponseMock,
- gapiMachineTypesResponseMock,
-} from './mock_data';
-
-const cloudbilling = {
- projects: {
- getBillingInfo: jest.fn(
- () =>
- new Promise((resolve) => {
- resolve({
- result: { billingEnabled: true },
- });
- }),
- ),
- },
-};
-
-const cloudresourcemanager = {
- projects: {
- list: jest.fn(
- () =>
- new Promise((resolve) => {
- resolve({
- result: { ...gapiProjectsResponseMock },
- });
- }),
- ),
- },
-};
-
-const compute = {
- zones: {
- list: jest.fn(
- () =>
- new Promise((resolve) => {
- resolve({
- result: { ...gapiZonesResponseMock },
- });
- }),
- ),
- },
- machineTypes: {
- list: jest.fn(
- () =>
- new Promise((resolve) => {
- resolve({
- result: { ...gapiMachineTypesResponseMock },
- });
- }),
- ),
- },
-};
-
-const gapi = {
- client: {
- cloudbilling,
- cloudresourcemanager,
- compute,
- },
-};
-
-export { gapi as default };
diff --git a/spec/frontend/create_cluster/gke_cluster/mock_data.js b/spec/frontend/create_cluster/gke_cluster/mock_data.js
deleted file mode 100644
index d9f5dbc636f..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/mock_data.js
+++ /dev/null
@@ -1,75 +0,0 @@
-export const emptyProjectMock = {
- projectId: '',
- name: '',
-};
-
-export const selectedProjectMock = {
- projectId: 'gcp-project-123',
- name: 'gcp-project',
-};
-
-export const selectedZoneMock = 'us-central1-a';
-
-export const selectedMachineTypeMock = 'n1-standard-2';
-
-export const gapiProjectsResponseMock = {
- projects: [
- {
- projectNumber: '1234',
- projectId: 'gcp-project-123',
- lifecycleState: 'ACTIVE',
- name: 'gcp-project',
- createTime: '2017-12-16T01:48:29.129Z',
- parent: {
- type: 'organization',
- id: '12345',
- },
- },
- ],
-};
-
-export const gapiZonesResponseMock = {
- kind: 'compute#zoneList',
- id: 'projects/gitlab-internal-153318/zones',
- items: [
- {
- kind: 'compute#zone',
- id: '2000',
- creationTimestamp: '1969-12-31T16:00:00.000-08:00',
- name: 'us-central1-a',
- description: 'us-central1-a',
- status: 'UP',
- region:
- 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/regions/us-central1',
- selfLink:
- 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a',
- availableCpuPlatforms: ['Intel Skylake', 'Intel Broadwell', 'Intel Sandy Bridge'],
- },
- ],
- selfLink: 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones',
-};
-
-export const gapiMachineTypesResponseMock = {
- kind: 'compute#machineTypeList',
- id: 'projects/gitlab-internal-153318/zones/us-central1-a/machineTypes',
- items: [
- {
- kind: 'compute#machineType',
- id: '3002',
- creationTimestamp: '1969-12-31T16:00:00.000-08:00',
- name: 'n1-standard-2',
- description: '2 vCPUs, 7.5 GB RAM',
- guestCpus: 2,
- memoryMb: 7680,
- imageSpaceGb: 10,
- maximumPersistentDisks: 64,
- maximumPersistentDisksSizeGb: '65536',
- zone: 'us-central1-a',
- selfLink:
- 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a/machineTypes/n1-standard-2',
- isSharedCpu: false,
- },
- ],
- selfLink:
- 'https://www.googleapis.com/compute/v1/projects/gitlab-internal-153318/zones/us-central1-a/machineTypes',
-};
diff --git a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
deleted file mode 100644
index c365cb6a9f4..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/stores/actions_spec.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import testAction from 'helpers/vuex_action_helper';
-import * as actions from '~/create_cluster/gke_cluster/store/actions';
-import * as types from '~/create_cluster/gke_cluster/store/mutation_types';
-import createState from '~/create_cluster/gke_cluster/store/state';
-import gapi from '../helpers';
-import {
- selectedProjectMock,
- selectedZoneMock,
- selectedMachineTypeMock,
- gapiProjectsResponseMock,
- gapiZonesResponseMock,
- gapiMachineTypesResponseMock,
-} from '../mock_data';
-
-describe('GCP Cluster Dropdown Store Actions', () => {
- describe('setProject', () => {
- it('should set project', () => {
- return testAction(
- actions.setProject,
- selectedProjectMock,
- { selectedProject: {} },
- [{ type: 'SET_PROJECT', payload: selectedProjectMock }],
- [],
- );
- });
- });
-
- describe('setZone', () => {
- it('should set zone', () => {
- return testAction(
- actions.setZone,
- selectedZoneMock,
- { selectedZone: '' },
- [{ type: 'SET_ZONE', payload: selectedZoneMock }],
- [],
- );
- });
- });
-
- describe('setMachineType', () => {
- it('should set machine type', () => {
- return testAction(
- actions.setMachineType,
- selectedMachineTypeMock,
- { selectedMachineType: '' },
- [{ type: 'SET_MACHINE_TYPE', payload: selectedMachineTypeMock }],
- [],
- );
- });
- });
-
- describe('setIsValidatingProjectBilling', () => {
- it('should set machine type', () => {
- return testAction(
- actions.setIsValidatingProjectBilling,
- true,
- { isValidatingProjectBilling: null },
- [{ type: 'SET_IS_VALIDATING_PROJECT_BILLING', payload: true }],
- [],
- );
- });
- });
-
- describe('async fetch methods', () => {
- let originalGapi;
-
- beforeAll(() => {
- originalGapi = window.gapi;
- window.gapi = gapi;
- window.gapiPromise = Promise.resolve(gapi);
- });
-
- afterAll(() => {
- window.gapi = originalGapi;
- delete window.gapiPromise;
- });
-
- describe('fetchProjects', () => {
- it('fetches projects from Google API', () => {
- const state = createState();
-
- return testAction(
- actions.fetchProjects,
- null,
- state,
- [{ type: types.SET_PROJECTS, payload: gapiProjectsResponseMock.projects }],
- [],
- );
- });
- });
-
- describe('validateProjectBilling', () => {
- it('checks project billing status from Google API', () => {
- return testAction(
- actions.validateProjectBilling,
- true,
- {
- selectedProject: selectedProjectMock,
- selectedZone: '',
- selectedMachineType: '',
- projectHasBillingEnabled: null,
- },
- [
- { type: 'SET_ZONE', payload: '' },
- { type: 'SET_MACHINE_TYPE', payload: '' },
- { type: 'SET_PROJECT_BILLING_STATUS', payload: true },
- ],
- [{ type: 'setIsValidatingProjectBilling', payload: false }],
- );
- });
- });
-
- describe('fetchZones', () => {
- it('fetches zones from Google API', () => {
- const state = createState();
-
- return testAction(
- actions.fetchZones,
- null,
- state,
- [{ type: types.SET_ZONES, payload: gapiZonesResponseMock.items }],
- [],
- );
- });
- });
-
- describe('fetchMachineTypes', () => {
- it('fetches machine types from Google API', () => {
- const state = createState();
-
- return testAction(
- actions.fetchMachineTypes,
- null,
- state,
- [{ type: types.SET_MACHINE_TYPES, payload: gapiMachineTypesResponseMock.items }],
- [],
- );
- });
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js
deleted file mode 100644
index 39106c3f6ca..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/stores/getters_spec.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import {
- hasProject,
- hasZone,
- hasMachineType,
- hasValidData,
-} from '~/create_cluster/gke_cluster/store/getters';
-import { selectedProjectMock, selectedZoneMock, selectedMachineTypeMock } from '../mock_data';
-
-describe('GCP Cluster Dropdown Store Getters', () => {
- let state;
-
- describe('valid states', () => {
- beforeEach(() => {
- state = {
- projectHasBillingEnabled: true,
- selectedProject: selectedProjectMock,
- selectedZone: selectedZoneMock,
- selectedMachineType: selectedMachineTypeMock,
- };
- });
-
- describe('hasProject', () => {
- it('should return true when project is selected', () => {
- expect(hasProject(state)).toEqual(true);
- });
- });
-
- describe('hasZone', () => {
- it('should return true when zone is selected', () => {
- expect(hasZone(state)).toEqual(true);
- });
- });
-
- describe('hasMachineType', () => {
- it('should return true when machine type is selected', () => {
- expect(hasMachineType(state)).toEqual(true);
- });
- });
-
- describe('hasValidData', () => {
- it('should return true when a project, zone and machine type are selected', () => {
- expect(hasValidData(state, { hasZone: true, hasMachineType: true })).toEqual(true);
- });
- });
- });
-
- describe('invalid states', () => {
- beforeEach(() => {
- state = {
- selectedProject: {
- projectId: '',
- name: '',
- },
- selectedZone: '',
- selectedMachineType: '',
- };
- });
-
- describe('hasProject', () => {
- it('should return false when project is not selected', () => {
- expect(hasProject(state)).toEqual(false);
- });
- });
-
- describe('hasZone', () => {
- it('should return false when zone is not selected', () => {
- expect(hasZone(state)).toEqual(false);
- });
- });
-
- describe('hasMachineType', () => {
- it('should return false when machine type is not selected', () => {
- expect(hasMachineType(state)).toEqual(false);
- });
- });
-
- describe('hasValidData', () => {
- let getters;
-
- beforeEach(() => {
- getters = { hasZone: true, hasMachineType: true };
- });
-
- it('should return false when project is not billable', () => {
- state.projectHasBillingEnabled = false;
-
- expect(hasValidData(state, getters)).toEqual(false);
- });
-
- it('should return false when zone is not selected', () => {
- getters.hasZone = false;
-
- expect(hasValidData(state, getters)).toEqual(false);
- });
-
- it('should return false when machine type is not selected', () => {
- getters.hasMachineType = false;
-
- expect(hasValidData(state, getters)).toEqual(false);
- });
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js b/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js
deleted file mode 100644
index 4493d49af43..00000000000
--- a/spec/frontend/create_cluster/gke_cluster/stores/mutations_spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import * as types from '~/create_cluster/gke_cluster/store/mutation_types';
-import mutations from '~/create_cluster/gke_cluster/store/mutations';
-import createState from '~/create_cluster/gke_cluster/store/state';
-import {
- gapiProjectsResponseMock,
- gapiZonesResponseMock,
- gapiMachineTypesResponseMock,
-} from '../mock_data';
-
-describe('GCP Cluster Dropdown Store Mutations', () => {
- describe.each`
- mutation | stateProperty | mockData
- ${types.SET_PROJECTS} | ${'projects'} | ${gapiProjectsResponseMock.projects}
- ${types.SET_ZONES} | ${'zones'} | ${gapiZonesResponseMock.items}
- ${types.SET_MACHINE_TYPES} | ${'machineTypes'} | ${gapiMachineTypesResponseMock.items}
- ${types.SET_MACHINE_TYPE} | ${'selectedMachineType'} | ${gapiMachineTypesResponseMock.items[0].name}
- ${types.SET_ZONE} | ${'selectedZone'} | ${gapiZonesResponseMock.items[0].name}
- ${types.SET_PROJECT} | ${'selectedProject'} | ${gapiProjectsResponseMock.projects[0]}
- ${types.SET_PROJECT_BILLING_STATUS} | ${'projectHasBillingEnabled'} | ${true}
- ${types.SET_IS_VALIDATING_PROJECT_BILLING} | ${'isValidatingProjectBilling'} | ${true}
- `('$mutation', ({ mutation, stateProperty, mockData }) => {
- it(`should set the mutation payload to the ${stateProperty} state property`, () => {
- const state = createState();
-
- expect(state[stateProperty]).not.toBe(mockData);
-
- mutations[mutation](state, mockData);
-
- expect(state[stateProperty]).toBe(mockData);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/gke_cluster_namespace/gke_cluster_namespace_spec.js b/spec/frontend/create_cluster/gke_cluster_namespace/gke_cluster_namespace_spec.js
deleted file mode 100644
index c22167a078c..00000000000
--- a/spec/frontend/create_cluster/gke_cluster_namespace/gke_cluster_namespace_spec.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import initGkeNamespace from '~/create_cluster/gke_cluster_namespace';
-
-describe('GKE cluster namespace', () => {
- const changeEvent = new Event('change');
- const isHidden = (el) => el.classList.contains('hidden');
- const hasDisabledInput = (el) => el.querySelector('input').disabled;
-
- let glManagedCheckbox;
- let selfManaged;
- let glManaged;
-
- beforeEach(() => {
- setFixtures(`
- <input class="js-gl-managed" type="checkbox" value="1" checked />
- <div class="js-namespace">
- <input type="text" />
- </div>
- <div class="js-namespace-prefixed">
- <input type="text" />
- </div>
- `);
-
- glManagedCheckbox = document.querySelector('.js-gl-managed');
- selfManaged = document.querySelector('.js-namespace');
- glManaged = document.querySelector('.js-namespace-prefixed');
-
- initGkeNamespace();
- });
-
- describe('GKE cluster namespace toggles', () => {
- it('initially displays the GitLab-managed label and input', () => {
- expect(isHidden(glManaged)).toEqual(false);
- expect(hasDisabledInput(glManaged)).toEqual(false);
-
- expect(isHidden(selfManaged)).toEqual(true);
- expect(hasDisabledInput(selfManaged)).toEqual(true);
- });
-
- it('displays the self-managed label and input when the Gitlab-managed checkbox is unchecked', () => {
- glManagedCheckbox.checked = false;
- glManagedCheckbox.dispatchEvent(changeEvent);
-
- expect(isHidden(glManaged)).toEqual(true);
- expect(hasDisabledInput(glManaged)).toEqual(true);
-
- expect(isHidden(selfManaged)).toEqual(false);
- expect(hasDisabledInput(selfManaged)).toEqual(false);
- });
-
- it('displays the GitLab-managed label and input when the Gitlab-managed checkbox is checked', () => {
- glManagedCheckbox.checked = true;
- glManagedCheckbox.dispatchEvent(changeEvent);
-
- expect(isHidden(glManaged)).toEqual(false);
- expect(hasDisabledInput(glManaged)).toEqual(false);
-
- expect(isHidden(selfManaged)).toEqual(true);
- expect(hasDisabledInput(selfManaged)).toEqual(true);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/init_create_cluster_spec.js b/spec/frontend/create_cluster/init_create_cluster_spec.js
deleted file mode 100644
index 42d1ceed864..00000000000
--- a/spec/frontend/create_cluster/init_create_cluster_spec.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import initGkeDropdowns from '~/create_cluster/gke_cluster';
-import initGkeNamespace from '~/create_cluster/gke_cluster_namespace';
-import initCreateCluster from '~/create_cluster/init_create_cluster';
-import PersistentUserCallout from '~/persistent_user_callout';
-
-// This import is loaded dynamically in `init_create_cluster`.
-// Let's eager import it here so that the first spec doesn't timeout.
-// https://gitlab.com/gitlab-org/gitlab/issues/118499
-import '~/create_cluster/eks_cluster';
-
-jest.mock('~/create_cluster/gke_cluster', () => jest.fn());
-jest.mock('~/create_cluster/gke_cluster_namespace', () => jest.fn());
-jest.mock('~/persistent_user_callout', () => ({
- factory: jest.fn(),
-}));
-
-describe('initCreateCluster', () => {
- let document;
- let gon;
-
- beforeEach(() => {
- document = {
- body: { dataset: {} },
- querySelector: jest.fn(),
- };
- gon = { features: {} };
- });
-
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- describe.each`
- pageSuffix | page
- ${':clusters:new'} | ${'project:clusters:new'}
- ${':clusters:create_gcp'} | ${'groups:clusters:create_gcp'}
- ${':clusters:create_user'} | ${'admin:clusters:create_user'}
- `('when cluster page ends in $pageSuffix', ({ page }) => {
- beforeEach(() => {
- document.body.dataset = { page };
-
- initCreateCluster(document, gon);
- });
-
- it('initializes create GKE cluster app', () => {
- expect(initGkeDropdowns).toHaveBeenCalled();
- });
-
- it('initializes gcp signup offer banner', () => {
- expect(PersistentUserCallout.factory).toHaveBeenCalled();
- });
- });
-
- describe('when creating a project level cluster', () => {
- it('initializes gke namespace app', () => {
- document.body.dataset.page = 'project:clusters:new';
-
- initCreateCluster(document, gon);
-
- expect(initGkeNamespace).toHaveBeenCalled();
- });
- });
-
- describe.each`
- clusterLevel | page
- ${'group level'} | ${'groups:clusters:new'}
- ${'instance level'} | ${'admin:clusters:create_gcp'}
- `('when creating a $clusterLevel cluster', ({ page }) => {
- it('does not initialize gke namespace app', () => {
- document.body.dataset = { page };
-
- initCreateCluster(document, gon);
-
- expect(initGkeNamespace).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/create_cluster/store/cluster_dropdown/actions_spec.js b/spec/frontend/create_cluster/store/cluster_dropdown/actions_spec.js
deleted file mode 100644
index c0e8b11cf1e..00000000000
--- a/spec/frontend/create_cluster/store/cluster_dropdown/actions_spec.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import testAction from 'helpers/vuex_action_helper';
-
-import actionsFactory from '~/create_cluster/store/cluster_dropdown/actions';
-import * as types from '~/create_cluster/store/cluster_dropdown/mutation_types';
-import createState from '~/create_cluster/store/cluster_dropdown/state';
-
-describe('Cluster dropdown Store Actions', () => {
- const items = [{ name: 'item 1' }];
- let fetchFn;
- let actions;
-
- beforeEach(() => {
- fetchFn = jest.fn();
- actions = actionsFactory(fetchFn);
- });
-
- describe('fetchItems', () => {
- describe('on success', () => {
- beforeEach(() => {
- fetchFn.mockResolvedValueOnce(items);
- actions = actionsFactory(fetchFn);
- });
-
- it('dispatches success with received items', () =>
- testAction(
- actions.fetchItems,
- null,
- createState(),
- [],
- [
- { type: 'requestItems' },
- {
- type: 'receiveItemsSuccess',
- payload: { items },
- },
- ],
- ));
- });
-
- describe('on failure', () => {
- const error = new Error('Could not fetch items');
-
- beforeEach(() => {
- fetchFn.mockRejectedValueOnce(error);
- });
-
- it('dispatches success with received items', () =>
- testAction(
- actions.fetchItems,
- null,
- createState(),
- [],
- [
- { type: 'requestItems' },
- {
- type: 'receiveItemsError',
- payload: { error },
- },
- ],
- ));
- });
- });
-
- describe('requestItems', () => {
- it(`commits ${types.REQUEST_ITEMS} mutation`, () =>
- testAction(actions.requestItems, null, createState(), [{ type: types.REQUEST_ITEMS }]));
- });
-
- describe('receiveItemsSuccess', () => {
- it(`commits ${types.RECEIVE_ITEMS_SUCCESS} mutation`, () =>
- testAction(actions.receiveItemsSuccess, { items }, createState(), [
- {
- type: types.RECEIVE_ITEMS_SUCCESS,
- payload: {
- items,
- },
- },
- ]));
- });
-
- describe('receiveItemsError', () => {
- it(`commits ${types.RECEIVE_ITEMS_ERROR} mutation`, () => {
- const error = new Error('Error fetching items');
-
- testAction(actions.receiveItemsError, { error }, createState(), [
- {
- type: types.RECEIVE_ITEMS_ERROR,
- payload: {
- error,
- },
- },
- ]);
- });
- });
-});
diff --git a/spec/frontend/create_cluster/store/cluster_dropdown/mutations_spec.js b/spec/frontend/create_cluster/store/cluster_dropdown/mutations_spec.js
deleted file mode 100644
index 197fcfc2600..00000000000
--- a/spec/frontend/create_cluster/store/cluster_dropdown/mutations_spec.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import {
- REQUEST_ITEMS,
- RECEIVE_ITEMS_SUCCESS,
- RECEIVE_ITEMS_ERROR,
-} from '~/create_cluster/store/cluster_dropdown/mutation_types';
-import mutations from '~/create_cluster/store/cluster_dropdown/mutations';
-import createState from '~/create_cluster/store/cluster_dropdown/state';
-
-describe('Cluster dropdown store mutations', () => {
- let state;
- let emptyPayload;
- let items;
- let error;
-
- beforeEach(() => {
- emptyPayload = {};
- items = [{ name: 'item 1' }];
- error = new Error('could not load error');
- state = createState();
- });
-
- it.each`
- mutation | mutatedProperty | payload | expectedValue | expectedValueDescription
- ${REQUEST_ITEMS} | ${'isLoadingItems'} | ${emptyPayload} | ${true} | ${true}
- ${REQUEST_ITEMS} | ${'loadingItemsError'} | ${emptyPayload} | ${null} | ${null}
- ${RECEIVE_ITEMS_SUCCESS} | ${'isLoadingItems'} | ${{ items }} | ${false} | ${false}
- ${RECEIVE_ITEMS_SUCCESS} | ${'items'} | ${{ items }} | ${items} | ${'items payload'}
- ${RECEIVE_ITEMS_ERROR} | ${'isLoadingItems'} | ${{ error }} | ${false} | ${false}
- ${RECEIVE_ITEMS_ERROR} | ${'error'} | ${{ error }} | ${error} | ${'received error object'}
- `(`$mutation sets $mutatedProperty to $expectedValueDescription`, (data) => {
- const { mutation, mutatedProperty, payload, expectedValue } = data;
-
- mutations[mutation](state, payload);
- expect(state[mutatedProperty]).toBe(expectedValue);
- });
-});
diff --git a/spec/frontend/create_item_dropdown_spec.js b/spec/frontend/create_item_dropdown_spec.js
index 143ccb9b930..aea4bc6017d 100644
--- a/spec/frontend/create_item_dropdown_spec.js
+++ b/spec/frontend/create_item_dropdown_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import CreateItemDropdown from '~/create_item_dropdown';
const DROPDOWN_ITEM_DATA = [
@@ -41,12 +42,13 @@ describe('CreateItemDropdown', () => {
}
beforeEach(() => {
- loadFixtures('static/create_item_dropdown.html');
+ loadHTMLFixture('static/create_item_dropdown.html');
$wrapperEl = $('.js-create-item-dropdown-fixture-root');
});
afterEach(() => {
$wrapperEl.remove();
+ resetHTMLFixture();
});
describe('items', () => {
diff --git a/spec/frontend/crm/contact_form_wrapper_spec.js b/spec/frontend/crm/contact_form_wrapper_spec.js
index 6307889a7aa..5e1743701e4 100644
--- a/spec/frontend/crm/contact_form_wrapper_spec.js
+++ b/spec/frontend/crm/contact_form_wrapper_spec.js
@@ -1,22 +1,23 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
import ContactFormWrapper from '~/crm/contacts/components/contact_form_wrapper.vue';
import ContactForm from '~/crm/components/form.vue';
import getGroupContactsQuery from '~/crm/contacts/components/graphql/get_group_contacts.query.graphql';
import createContactMutation from '~/crm/contacts/components/graphql/create_contact.mutation.graphql';
import updateContactMutation from '~/crm/contacts/components/graphql/update_contact.mutation.graphql';
+import getGroupOrganizationsQuery from '~/crm/organizations/components/graphql/get_group_organizations.query.graphql';
+import { getGroupContactsQueryResponse, getGroupOrganizationsQueryResponse } from './mock_data';
describe('Customer relations contact form wrapper', () => {
+ Vue.use(VueApollo);
let wrapper;
+ let fakeApollo;
const findContactForm = () => wrapper.findComponent(ContactForm);
- const $apollo = {
- queries: {
- contacts: {
- loading: false,
- },
- },
- };
const $route = {
params: {
id: 7,
@@ -33,56 +34,79 @@ describe('Customer relations contact form wrapper', () => {
groupFullPath: 'flightjs',
groupId: 26,
},
- mocks: {
- $apollo,
- $route,
- },
+ apolloProvider: fakeApollo,
+ mocks: { $route },
});
};
+ beforeEach(() => {
+ fakeApollo = createMockApollo([
+ [getGroupContactsQuery, jest.fn().mockResolvedValue(getGroupContactsQueryResponse)],
+ [getGroupOrganizationsQuery, jest.fn().mockResolvedValue(getGroupOrganizationsQueryResponse)],
+ ]);
+ });
+
afterEach(() => {
wrapper.destroy();
+ fakeApollo = null;
});
- describe('in edit mode', () => {
- it('should render contact form with correct props', () => {
- mountComponent({ isEditMode: true });
+ describe.each`
+ mode | title | successMessage | mutation | existingId
+ ${'edit'} | ${'Edit contact'} | ${'Contact has been updated.'} | ${updateContactMutation} | ${contacts[0].id}
+ ${'create'} | ${'New contact'} | ${'Contact has been added.'} | ${createContactMutation} | ${null}
+ `('in $mode mode', ({ mode, title, successMessage, mutation, existingId }) => {
+ beforeEach(() => {
+ const isEditMode = mode === 'edit';
+ mountComponent({ isEditMode });
- const contactForm = findContactForm();
- expect(contactForm.props('fields')).toHaveLength(5);
- expect(contactForm.props('title')).toBe('Edit contact');
- expect(contactForm.props('successMessage')).toBe('Contact has been updated.');
- expect(contactForm.props('mutation')).toBe(updateContactMutation);
- expect(contactForm.props('getQuery')).toMatchObject({
- query: getGroupContactsQuery,
- variables: { groupFullPath: 'flightjs' },
- });
- expect(contactForm.props('getQueryNodePath')).toBe('group.contacts');
- expect(contactForm.props('existingId')).toBe(contacts[0].id);
- expect(contactForm.props('additionalCreateParams')).toMatchObject({
- groupId: 'gid://gitlab/Group/26',
- });
+ return waitForPromises();
+ });
+
+ it('renders correct getQuery prop', () => {
+ expect(findContactForm().props('getQueryNodePath')).toBe('group.contacts');
});
- });
- describe('in create mode', () => {
- it('should render contact form with correct props', () => {
- mountComponent();
+ it('renders correct mutation prop', () => {
+ expect(findContactForm().props('mutation')).toBe(mutation);
+ });
- const contactForm = findContactForm();
- expect(contactForm.props('fields')).toHaveLength(5);
- expect(contactForm.props('title')).toBe('New contact');
- expect(contactForm.props('successMessage')).toBe('Contact has been added.');
- expect(contactForm.props('mutation')).toBe(createContactMutation);
- expect(contactForm.props('getQuery')).toMatchObject({
- query: getGroupContactsQuery,
- variables: { groupFullPath: 'flightjs' },
- });
- expect(contactForm.props('getQueryNodePath')).toBe('group.contacts');
- expect(contactForm.props('existingId')).toBeNull();
- expect(contactForm.props('additionalCreateParams')).toMatchObject({
+ it('renders correct additionalCreateParams prop', () => {
+ expect(findContactForm().props('additionalCreateParams')).toMatchObject({
groupId: 'gid://gitlab/Group/26',
});
});
+
+ it('renders correct existingId prop', () => {
+ expect(findContactForm().props('existingId')).toBe(existingId);
+ });
+
+ it('renders correct fields prop', () => {
+ expect(findContactForm().props('fields')).toEqual([
+ { name: 'firstName', label: 'First name', required: true },
+ { name: 'lastName', label: 'Last name', required: true },
+ { name: 'email', label: 'Email', required: true },
+ { name: 'phone', label: 'Phone' },
+ {
+ name: 'organizationId',
+ label: 'Organization',
+ values: [
+ { text: 'No organization', value: null },
+ { text: 'ABC Company', value: 'gid://gitlab/CustomerRelations::Organization/2' },
+ { text: 'GitLab', value: 'gid://gitlab/CustomerRelations::Organization/3' },
+ { text: 'Test Inc', value: 'gid://gitlab/CustomerRelations::Organization/1' },
+ ],
+ },
+ { name: 'description', label: 'Description' },
+ ]);
+ });
+
+ it('renders correct title prop', () => {
+ expect(findContactForm().props('title')).toBe(title);
+ });
+
+ it('renders correct successMessage prop', () => {
+ expect(findContactForm().props('successMessage')).toBe(successMessage);
+ });
});
});
diff --git a/spec/frontend/crm/contacts_root_spec.js b/spec/frontend/crm/contacts_root_spec.js
index b02d94e9cb1..3a6989a00f1 100644
--- a/spec/frontend/crm/contacts_root_spec.js
+++ b/spec/frontend/crm/contacts_root_spec.js
@@ -105,7 +105,7 @@ describe('Customer relations contacts root app', () => {
const issueLink = findIssuesLinks().at(0);
expect(issueLink.exists()).toBe(true);
- expect(issueLink.attributes('href')).toBe('/issues?scope=all&state=opened&crm_contact_id=16');
+ expect(issueLink.attributes('href')).toBe('/issues?crm_contact_id=16');
});
});
});
diff --git a/spec/frontend/crm/form_spec.js b/spec/frontend/crm/form_spec.js
index 5c349b24ea1..d39f0795f5f 100644
--- a/spec/frontend/crm/form_spec.js
+++ b/spec/frontend/crm/form_spec.js
@@ -1,4 +1,4 @@
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlFormInput, GlFormSelect, GlFormGroup } from '@gitlab/ui';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import VueRouter from 'vue-router';
@@ -100,6 +100,14 @@ describe('Reusable form component', () => {
{ name: 'email', label: 'Email', required: true },
{ name: 'phone', label: 'Phone' },
{ name: 'description', label: 'Description' },
+ {
+ name: 'organizationId',
+ label: 'Organization',
+ values: [
+ { key: 'gid://gitlab/CustomerRelations::Organization/1', value: 'GitLab' },
+ { key: 'gid://gitlab/CustomerRelations::Organization/2', value: 'ABC Corp' },
+ ],
+ },
],
getQuery: {
query: getGroupContactsQuery,
@@ -270,4 +278,51 @@ describe('Reusable form component', () => {
});
},
);
+
+ describe('edit form', () => {
+ beforeEach(() => {
+ mountContactUpdate();
+ });
+
+ it.each`
+ index | id | componentName | value
+ ${0} | ${'firstName'} | ${'GlFormInput'} | ${'Marty'}
+ ${1} | ${'lastName'} | ${'GlFormInput'} | ${'McFly'}
+ ${2} | ${'email'} | ${'GlFormInput'} | ${'example@gitlab.com'}
+ ${4} | ${'description'} | ${'GlFormInput'} | ${undefined}
+ ${3} | ${'phone'} | ${'GlFormInput'} | ${undefined}
+ ${5} | ${'organizationId'} | ${'GlFormSelect'} | ${'gid://gitlab/CustomerRelations::Organization/2'}
+ `(
+ 'should render a $componentName for #$id with the value "$value"',
+ ({ index, id, componentName, value }) => {
+ const component = componentName === 'GlFormInput' ? GlFormInput : GlFormSelect;
+ const findFormGroup = (at) => wrapper.findAllComponents(GlFormGroup).at(at);
+ const findFormElement = () => findFormGroup(index).find(component);
+
+ expect(findFormElement().attributes('id')).toBe(id);
+ expect(findFormElement().attributes('value')).toBe(value);
+ },
+ );
+
+ it('should include updated values in update mutation', () => {
+ wrapper.find('#firstName').vm.$emit('input', 'Michael');
+ wrapper
+ .find('#organizationId')
+ .vm.$emit('input', 'gid://gitlab/CustomerRelations::Organization/1');
+
+ findForm().trigger('submit');
+
+ expect(handler).toHaveBeenCalledWith('updateContact', {
+ input: {
+ description: null,
+ email: 'example@gitlab.com',
+ firstName: 'Michael',
+ id: 'gid://gitlab/CustomerRelations::Contact/12',
+ lastName: 'McFly',
+ organizationId: 'gid://gitlab/CustomerRelations::Organization/1',
+ phone: null,
+ },
+ });
+ });
+ });
});
diff --git a/spec/frontend/crm/organizations_root_spec.js b/spec/frontend/crm/organizations_root_spec.js
index 231208d938e..1780a5945a6 100644
--- a/spec/frontend/crm/organizations_root_spec.js
+++ b/spec/frontend/crm/organizations_root_spec.js
@@ -102,9 +102,7 @@ describe('Customer relations organizations root app', () => {
const issueLink = findIssuesLinks().at(0);
expect(issueLink.exists()).toBe(true);
- expect(issueLink.attributes('href')).toBe(
- '/issues?scope=all&state=opened&crm_organization_id=2',
- );
+ expect(issueLink.attributes('href')).toBe('/issues?crm_organization_id=2');
});
});
});
diff --git a/spec/frontend/cycle_analytics/base_spec.js b/spec/frontend/cycle_analytics/base_spec.js
index bdf35f904ed..7b1ef71da63 100644
--- a/spec/frontend/cycle_analytics/base_spec.js
+++ b/spec/frontend/cycle_analytics/base_spec.js
@@ -143,12 +143,9 @@ describe('Value stream analytics component', () => {
expect(findFilters().props()).toEqual({
groupId,
groupPath,
- canToggleAggregation: false,
endDate: createdBefore,
hasDateRangeFilter: true,
hasProjectFilter: false,
- isAggregationEnabled: false,
- isUpdatingAggregationData: false,
selectedProjects: [],
startDate: createdAfter,
});
diff --git a/spec/frontend/cycle_analytics/mock_data.js b/spec/frontend/cycle_analytics/mock_data.js
index c482bd4e910..1fe1dbbb75c 100644
--- a/spec/frontend/cycle_analytics/mock_data.js
+++ b/spec/frontend/cycle_analytics/mock_data.js
@@ -40,7 +40,7 @@ export const summary = [
{ value: '20', title: 'New Issues' },
{ value: null, title: 'Commits' },
{ value: null, title: 'Deploys' },
- { value: null, title: 'Deployment Frequency', unit: 'per day' },
+ { value: null, title: 'Deployment Frequency', unit: '/day' },
];
export const issueStage = {
@@ -130,7 +130,7 @@ export const convertedData = {
{ value: '20', title: 'New Issues' },
{ value: '-', title: 'Commits' },
{ value: '-', title: 'Deploys' },
- { value: '-', title: 'Deployment Frequency', unit: 'per day' },
+ { value: '-', title: 'Deployment Frequency', unit: '/day' },
],
};
diff --git a/spec/frontend/cycle_analytics/stage_table_spec.js b/spec/frontend/cycle_analytics/stage_table_spec.js
index 107fe5fc865..0d15d67866d 100644
--- a/spec/frontend/cycle_analytics/stage_table_spec.js
+++ b/spec/frontend/cycle_analytics/stage_table_spec.js
@@ -329,7 +329,7 @@ describe('StageTable', () => {
]);
});
- it('with sortDesc=false will toggle the direction field', async () => {
+ it('with sortDesc=false will toggle the direction field', () => {
expect(wrapper.emitted('handleUpdatePagination')).toBeUndefined();
triggerTableSort(false);
diff --git a/spec/frontend/cycle_analytics/value_stream_filters_spec.js b/spec/frontend/cycle_analytics/value_stream_filters_spec.js
index 5a0b046393a..6e96a6d756a 100644
--- a/spec/frontend/cycle_analytics/value_stream_filters_spec.js
+++ b/spec/frontend/cycle_analytics/value_stream_filters_spec.js
@@ -1,5 +1,4 @@
import { shallowMount } from '@vue/test-utils';
-import { GlToggle } from '@gitlab/ui';
import Daterange from '~/analytics/shared/components/daterange.vue';
import ProjectsDropdownFilter from '~/analytics/shared/components/projects_dropdown_filter.vue';
import FilterBar from '~/cycle_analytics/components/filter_bar.vue';
@@ -30,7 +29,6 @@ describe('ValueStreamFilters', () => {
const findProjectsDropdown = () => wrapper.findComponent(ProjectsDropdownFilter);
const findDateRangePicker = () => wrapper.findComponent(Daterange);
const findFilterBar = () => wrapper.findComponent(FilterBar);
- const findAggregationToggle = () => wrapper.findComponent(GlToggle);
beforeEach(() => {
wrapper = createComponent();
@@ -59,10 +57,6 @@ describe('ValueStreamFilters', () => {
expect(findDateRangePicker().exists()).toBe(true);
});
- it('will not render the aggregation toggle', () => {
- expect(findAggregationToggle().exists()).toBe(false);
- });
-
it('will emit `selectProject` when a project is selected', () => {
findProjectsDropdown().vm.$emit('selected');
@@ -94,52 +88,4 @@ describe('ValueStreamFilters', () => {
expect(findProjectsDropdown().exists()).toBe(false);
});
});
-
- describe('canToggleAggregation = true', () => {
- beforeEach(() => {
- wrapper = createComponent({ isAggregationEnabled: false, canToggleAggregation: true });
- });
-
- it('will render the aggregation toggle', () => {
- expect(findAggregationToggle().exists()).toBe(true);
- });
-
- it('will set the aggregation toggle to the `isAggregationEnabled` value', () => {
- expect(findAggregationToggle().props('value')).toBe(false);
-
- wrapper = createComponent({
- isAggregationEnabled: true,
- canToggleAggregation: true,
- });
-
- expect(findAggregationToggle().props('value')).toBe(true);
- });
-
- it('will emit `toggleAggregation` when the toggle is changed', async () => {
- expect(wrapper.emitted('toggleAggregation')).toBeUndefined();
-
- await findAggregationToggle().vm.$emit('change', true);
-
- expect(wrapper.emitted('toggleAggregation')).toHaveLength(1);
- expect(wrapper.emitted('toggleAggregation')).toEqual([[true]]);
- });
- });
-
- describe('isUpdatingAggregationData = true', () => {
- beforeEach(() => {
- wrapper = createComponent({ canToggleAggregation: true, isUpdatingAggregationData: true });
- });
-
- it('will disable the aggregation toggle', () => {
- expect(findAggregationToggle().props('disabled')).toBe(true);
- });
-
- it('will not emit `toggleAggregation` when the toggle is changed', async () => {
- expect(wrapper.emitted('toggleAggregation')).toBeUndefined();
-
- await findAggregationToggle().vm.$emit('change', true);
-
- expect(wrapper.emitted('toggleAggregation')).toBeUndefined();
- });
- });
});
diff --git a/spec/frontend/cycle_analytics/value_stream_metrics_spec.js b/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
index 6199e61df0c..4a3e8146b13 100644
--- a/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
+++ b/spec/frontend/cycle_analytics/value_stream_metrics_spec.js
@@ -1,11 +1,11 @@
import { GlDeprecatedSkeletonLoading as GlSkeletonLoading } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import metricsData from 'test_fixtures/projects/analytics/value_stream_analytics/summary.json';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import ValueStreamMetrics from '~/analytics/shared/components/value_stream_metrics.vue';
import { METRIC_TYPE_SUMMARY } from '~/api/analytics_api';
-import { METRICS_POPOVER_CONTENT } from '~/analytics/shared/constants';
+import { VSA_METRICS_GROUPS, METRICS_POPOVER_CONTENT } from '~/analytics/shared/constants';
import { prepareTimeMetricsData } from '~/analytics/shared/utils';
import MetricTile from '~/analytics/shared/components/metric_tile.vue';
import createFlash from '~/flash';
@@ -27,7 +27,7 @@ describe('ValueStreamMetrics', () => {
});
const createComponent = (props = {}) => {
- return shallowMount(ValueStreamMetrics, {
+ return shallowMountExtended(ValueStreamMetrics, {
propsData: {
requestPath,
requestParams: {},
@@ -38,6 +38,7 @@ describe('ValueStreamMetrics', () => {
};
const findMetrics = () => wrapper.findAllComponents(MetricTile);
+ const findMetricsGroups = () => wrapper.findAllByTestId('vsa-metrics-group');
const expectToHaveRequest = (fields) => {
expect(mockGetValueStreamSummaryMetrics).toHaveBeenCalledWith({
@@ -63,24 +64,6 @@ describe('ValueStreamMetrics', () => {
expect(wrapper.findComponent(GlSkeletonLoading).exists()).toBe(true);
});
- it('renders hidden MetricTile components for each metric', async () => {
- await waitForPromises();
-
- // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details
- // eslint-disable-next-line no-restricted-syntax
- wrapper.setData({ isLoading: true });
-
- await nextTick();
-
- const components = findMetrics();
-
- expect(components).toHaveLength(metricsData.length);
-
- metricsData.forEach((metric, index) => {
- expect(components.at(index).isVisible()).toBe(false);
- });
- });
-
describe('with data loaded', () => {
beforeEach(async () => {
await waitForPromises();
@@ -160,6 +143,27 @@ describe('ValueStreamMetrics', () => {
});
});
});
+
+ describe('groupBy', () => {
+ beforeEach(async () => {
+ mockGetValueStreamSummaryMetrics = jest.fn().mockResolvedValue({ data: metricsData });
+ wrapper = createComponent({ groupBy: VSA_METRICS_GROUPS });
+ await waitForPromises();
+ });
+
+ it('renders the metrics as separate groups', () => {
+ const groups = findMetricsGroups();
+ expect(groups).toHaveLength(VSA_METRICS_GROUPS.length);
+ });
+
+ it('renders titles for each group', () => {
+ const groups = findMetricsGroups();
+ groups.wrappers.forEach((g, index) => {
+ const { title } = VSA_METRICS_GROUPS[index];
+ expect(g.html()).toContain(title);
+ });
+ });
+ });
});
});
diff --git a/spec/frontend/deprecated_jquery_dropdown_spec.js b/spec/frontend/deprecated_jquery_dropdown_spec.js
index bec91fe5fc5..b18d53b317d 100644
--- a/spec/frontend/deprecated_jquery_dropdown_spec.js
+++ b/spec/frontend/deprecated_jquery_dropdown_spec.js
@@ -2,6 +2,7 @@
import $ from 'jquery';
import mockProjects from 'test_fixtures_static/projects.json';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown';
import '~/lib/utils/common_utils';
import { visitUrl } from '~/lib/utils/url_utility';
@@ -64,7 +65,7 @@ describe('deprecatedJQueryDropdown', () => {
}
beforeEach(() => {
- loadFixtures('static/deprecated_jquery_dropdown.html');
+ loadHTMLFixture('static/deprecated_jquery_dropdown.html');
test.dropdownContainerElement = $('.dropdown.inline');
test.$dropdownMenuElement = $('.dropdown-menu', test.dropdownContainerElement);
test.projectsData = JSON.parse(JSON.stringify(mockProjects));
@@ -73,6 +74,8 @@ describe('deprecatedJQueryDropdown', () => {
afterEach(() => {
$('body').off('keydown');
test.dropdownContainerElement.off('keyup');
+
+ resetHTMLFixture();
});
it('should open on click', () => {
diff --git a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
index 0cef18c60de..d2d1fe6b2d8 100644
--- a/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
+++ b/spec/frontend/design_management/components/design_notes/design_reply_form_spec.js
@@ -31,10 +31,6 @@ describe('Design reply form component', () => {
});
}
- beforeEach(() => {
- gon.features = { markdownContinueLists: true };
- });
-
afterEach(() => {
wrapper.destroy();
});
diff --git a/spec/frontend/design_management/components/design_sidebar_spec.js b/spec/frontend/design_management/components/design_sidebar_spec.js
index a818a86bef6..e8426216c1c 100644
--- a/spec/frontend/design_management/components/design_sidebar_spec.js
+++ b/spec/frontend/design_management/components/design_sidebar_spec.js
@@ -1,7 +1,7 @@
import { GlCollapse, GlPopover } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Cookies from 'js-cookie';
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';
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 abd455ae750..243cc9d891d 100644
--- a/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap
+++ b/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap
@@ -16,6 +16,7 @@ exports[`Design management index page designs renders error 1`] = `
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
+ showicon="true"
title=""
variant="danger"
>
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 31b3117cb6c..8f12dc8fb06 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
@@ -180,6 +180,7 @@ exports[`Design management design index page with error GlAlert is rendered in c
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
+ showicon="true"
title=""
variant="danger"
>
diff --git a/spec/frontend/diffs/components/diff_expansion_cell_spec.js b/spec/frontend/diffs/components/diff_expansion_cell_spec.js
index cd472920bb9..bd538996349 100644
--- a/spec/frontend/diffs/components/diff_expansion_cell_spec.js
+++ b/spec/frontend/diffs/components/diff_expansion_cell_spec.js
@@ -20,7 +20,6 @@ function makeLoadMoreLinesPayload({
sinceLine,
toLine,
oldLineNumber,
- diffViewType,
fileHash,
nextLineNumbers = {},
unfold = false,
@@ -28,12 +27,11 @@ function makeLoadMoreLinesPayload({
isExpandDown = false,
}) {
return {
- endpoint: 'contextLinesPath',
+ endpoint: diffFileMockData.context_lines_path,
params: {
since: sinceLine,
to: toLine,
offset: toLine + 1 - oldLineNumber,
- view: diffViewType,
unfold,
bottom,
},
@@ -70,10 +68,11 @@ describe('DiffExpansionCell', () => {
const createComponent = (options = {}) => {
const defaults = {
fileHash: mockFile.file_hash,
- contextLinesPath: 'contextLinesPath',
line: mockLine,
isTop: false,
isBottom: false,
+ file: mockFile,
+ inline: true,
};
const propsData = { ...defaults, ...options };
@@ -124,7 +123,7 @@ describe('DiffExpansionCell', () => {
describe('any row', () => {
[
- { diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: { parallel_diff_lines: [] } },
+ { diffViewType: INLINE_DIFF_VIEW_TYPE, lineIndex: 8, file: cloneDeep(diffFileMockData) },
].forEach(({ diffViewType, file, lineIndex }) => {
describe(`with diffViewType (${diffViewType})`, () => {
beforeEach(() => {
@@ -140,12 +139,12 @@ describe('DiffExpansionCell', () => {
it('on expand all clicked, dispatch loadMoreLines', () => {
const oldLineNumber = mockLine.meta_data.old_pos;
const newLineNumber = mockLine.meta_data.new_pos;
- const previousIndex = getPreviousLineIndex(diffViewType, mockFile, {
+ const previousIndex = getPreviousLineIndex(mockFile, {
oldLineNumber,
newLineNumber,
});
- const wrapper = createComponent();
+ const wrapper = createComponent({ file });
findExpandAll(wrapper).click();
@@ -156,7 +155,6 @@ describe('DiffExpansionCell', () => {
toLine: newLineNumber - 1,
sinceLine: previousIndex,
oldLineNumber,
- diffViewType,
}),
);
});
@@ -168,7 +166,7 @@ describe('DiffExpansionCell', () => {
const oldLineNumber = mockLine.meta_data.old_pos;
const newLineNumber = mockLine.meta_data.new_pos;
- const wrapper = createComponent();
+ const wrapper = createComponent({ file });
findExpandUp(wrapper).trigger('click');
@@ -196,17 +194,16 @@ describe('DiffExpansionCell', () => {
mockLine.meta_data.old_pos = 200;
mockLine.meta_data.new_pos = 200;
- const wrapper = createComponent();
+ const wrapper = createComponent({ file });
findExpandDown(wrapper).trigger('click');
expect(store.dispatch).toHaveBeenCalledWith('diffs/loadMoreLines', {
- endpoint: 'contextLinesPath',
+ endpoint: diffFileMockData.context_lines_path,
params: {
since: 1,
to: 21, // the load amount, plus 1 line
offset: 0,
- view: diffViewType,
unfold: true,
bottom: true,
},
diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js
index 3b567fbc704..cc595e58dda 100644
--- a/spec/frontend/diffs/store/actions_spec.js
+++ b/spec/frontend/diffs/store/actions_spec.js
@@ -1,5 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
-import Cookies from 'js-cookie';
+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';
diff --git a/spec/frontend/diffs/store/mutations_spec.js b/spec/frontend/diffs/store/mutations_spec.js
index d8611b1ce1b..57e623b843d 100644
--- a/spec/frontend/diffs/store/mutations_spec.js
+++ b/spec/frontend/diffs/store/mutations_spec.js
@@ -131,7 +131,14 @@ describe('DiffsStoreMutations', () => {
const options = {
lineNumbers: { oldLineNumber: 1, newLineNumber: 2 },
contextLines: [
- { old_line: 1, new_line: 1, line_code: 'ff9200_1_1', discussions: [], hasForm: false },
+ {
+ old_line: 1,
+ new_line: 1,
+ line_code: 'ff9200_1_1',
+ discussions: [],
+ hasForm: false,
+ type: 'expanded',
+ },
],
fileHash: 'ff9200',
params: {
diff --git a/spec/frontend/diffs/store/utils_spec.js b/spec/frontend/diffs/store/utils_spec.js
index 03bcaab0d2b..8ae51a58819 100644
--- a/spec/frontend/diffs/store/utils_spec.js
+++ b/spec/frontend/diffs/store/utils_spec.js
@@ -51,21 +51,19 @@ describe('DiffsStoreUtils', () => {
});
describe('getPreviousLineIndex', () => {
- describe(`with diffViewType (inline) in split diffs`, () => {
- let diffFile;
+ let diffFile;
- beforeEach(() => {
- diffFile = { ...clone(diffFileMockData) };
- });
+ beforeEach(() => {
+ diffFile = { ...clone(diffFileMockData) };
+ });
- it('should return the correct previous line number', () => {
- expect(
- utils.getPreviousLineIndex(INLINE_DIFF_VIEW_TYPE, diffFile, {
- oldLineNumber: 3,
- newLineNumber: 5,
- }),
- ).toBe(4);
- });
+ it('should return the correct previous line number', () => {
+ expect(
+ utils.getPreviousLineIndex(diffFile, {
+ oldLineNumber: 3,
+ newLineNumber: 5,
+ }),
+ ).toBe(4);
});
});
diff --git a/spec/frontend/diffs/utils/diff_file_spec.js b/spec/frontend/diffs/utils/diff_file_spec.js
index 3223b6c2dab..778897be3ba 100644
--- a/spec/frontend/diffs/utils/diff_file_spec.js
+++ b/spec/frontend/diffs/utils/diff_file_spec.js
@@ -3,6 +3,7 @@ import {
getShortShaFromFile,
stats,
isNotDiffable,
+ match,
} from '~/diffs/utils/diff_file';
import { diffViewerModes } from '~/ide/constants';
import mockDiffFile from '../mock_data/diff_file';
@@ -149,6 +150,38 @@ describe('diff_file utilities', () => {
expect(preppedFile).not.toHaveProp('id');
});
+
+ it.each`
+ index
+ ${null}
+ ${undefined}
+ ${-1}
+ ${false}
+ ${true}
+ ${'idx'}
+ ${'42'}
+ `('does not set the order property if an invalid index ($index) is provided', ({ index }) => {
+ const preppedFile = prepareRawDiffFile({
+ file: files[0],
+ allFiles: files,
+ index,
+ });
+
+ /* expect.anything() doesn't match null or undefined */
+ expect(preppedFile).toEqual(expect.not.objectContaining({ order: null }));
+ expect(preppedFile).toEqual(expect.not.objectContaining({ order: undefined }));
+ expect(preppedFile).toEqual(expect.not.objectContaining({ order: expect.anything() }));
+ });
+
+ it('sets the provided valid index to the order property', () => {
+ const preppedFile = prepareRawDiffFile({
+ file: files[0],
+ allFiles: files,
+ index: 42,
+ });
+
+ expect(preppedFile).toEqual(expect.objectContaining({ order: 42 }));
+ });
});
describe('getShortShaFromFile', () => {
@@ -230,4 +263,42 @@ describe('diff_file utilities', () => {
expect(isNotDiffable(file)).toBe(false);
});
});
+
+ describe('match', () => {
+ const authorityFileId = '68296a4f-f1c7-445a-bd0e-6e3b02c4eec0';
+ const fih = 'file_identifier_hash';
+ const fihs = 'file identifier hashes';
+ let authorityFile;
+
+ beforeAll(() => {
+ const files = getDiffFiles();
+
+ authorityFile = prepareRawDiffFile({
+ file: files[0],
+ allFiles: files,
+ });
+
+ Object.freeze(authorityFile);
+ });
+
+ describe.each`
+ mode | comparisonFiles | keyName
+ ${'universal'} | ${[{ [fih]: 'ABC1' }, { id: 'foo' }, { id: authorityFileId }]} | ${'ids'}
+ ${'mr'} | ${[{ id: authorityFileId }, { [fih]: 'ABC2' }, { [fih]: 'ABC1' }]} | ${fihs}
+ `('$mode mode', ({ mode, comparisonFiles, keyName }) => {
+ it(`fails to match if files or ${keyName} aren't present`, () => {
+ expect(match({ fileA: authorityFile, fileB: undefined, mode })).toBe(false);
+ expect(match({ fileA: authorityFile, fileB: null, mode })).toBe(false);
+ expect(match({ fileA: authorityFile, fileB: comparisonFiles[0], mode })).toBe(false);
+ });
+
+ it(`fails to match if the ${keyName} aren't the same`, () => {
+ expect(match({ fileA: authorityFile, fileB: comparisonFiles[1], mode })).toBe(false);
+ });
+
+ it(`matches if the ${keyName} are the same`, () => {
+ expect(match({ fileA: authorityFile, fileB: comparisonFiles[2], mode })).toBe(true);
+ });
+ });
+ });
});
diff --git a/spec/frontend/diffs/utils/queue_events_spec.js b/spec/frontend/diffs/utils/queue_events_spec.js
index 007748d8b2c..ad2745f5188 100644
--- a/spec/frontend/diffs/utils/queue_events_spec.js
+++ b/spec/frontend/diffs/utils/queue_events_spec.js
@@ -1,11 +1,15 @@
import api from '~/api';
-import { DEFER_DURATION } from '~/diffs/constants';
+import { DEFER_DURATION, TRACKING_CAP_KEY, TRACKING_CAP_LENGTH } from '~/diffs/constants';
import { queueRedisHllEvents } from '~/diffs/utils/queue_events';
jest.mock('~/api', () => ({
trackRedisHllUserEvent: jest.fn(),
}));
+beforeAll(() => {
+ localStorage.clear();
+});
+
describe('diffs events queue', () => {
describe('queueRedisHllEvents', () => {
it('does not dispatch the event immediately', () => {
@@ -17,6 +21,7 @@ describe('diffs events queue', () => {
queueRedisHllEvents(['know_event']);
jest.advanceTimersByTime(DEFER_DURATION + 1);
expect(api.trackRedisHllUserEvent).toHaveBeenCalled();
+ expect(localStorage.getItem(TRACKING_CAP_KEY)).toBe(null);
});
it('increase defer duration based on the provided events count', () => {
@@ -32,5 +37,35 @@ describe('diffs events queue', () => {
deferDuration *= index + 1;
});
});
+
+ describe('with tracking cap verification', () => {
+ const currentTimestamp = Date.now();
+
+ beforeEach(() => {
+ localStorage.clear();
+ });
+
+ it('dispatches the event if cap value is not found', () => {
+ queueRedisHllEvents(['know_event'], { verifyCap: true });
+ jest.advanceTimersByTime(DEFER_DURATION + 1);
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalled();
+ expect(localStorage.getItem(TRACKING_CAP_KEY)).toBe(currentTimestamp.toString());
+ });
+
+ it('dispatches the event if cap value is less than limit', () => {
+ localStorage.setItem(TRACKING_CAP_KEY, 1);
+ queueRedisHllEvents(['know_event'], { verifyCap: true });
+ jest.advanceTimersByTime(DEFER_DURATION + 1);
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalled();
+ expect(localStorage.getItem(TRACKING_CAP_KEY)).toBe(currentTimestamp.toString());
+ });
+
+ it('does not dispatch the event if cap value is greater than limit', () => {
+ localStorage.setItem(TRACKING_CAP_KEY, currentTimestamp - (TRACKING_CAP_LENGTH + 1));
+ queueRedisHllEvents(['know_event'], { verifyCap: true });
+ jest.advanceTimersByTime(DEFER_DURATION + 1);
+ expect(api.trackRedisHllUserEvent).toHaveBeenCalled();
+ });
+ });
});
});
diff --git a/spec/frontend/dropzone_input_spec.js b/spec/frontend/dropzone_input_spec.js
index 11414e8890d..a633de9ef56 100644
--- a/spec/frontend/dropzone_input_spec.js
+++ b/spec/frontend/dropzone_input_spec.js
@@ -1,6 +1,7 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import mock from 'xhr-mock';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import { TEST_HOST } from 'spec/test_constants';
import PasteMarkdownTable from '~/behaviors/markdown/paste_markdown_table';
@@ -45,7 +46,7 @@ describe('dropzone_input', () => {
};
beforeEach(() => {
- loadFixtures('issues/new-issue.html');
+ loadHTMLFixture('issues/new-issue.html');
form = $('#new_issue');
form.data('uploads-path', TEST_UPLOAD_PATH);
@@ -54,6 +55,8 @@ describe('dropzone_input', () => {
afterEach(() => {
form = null;
+
+ resetHTMLFixture();
});
it('pastes Markdown tables', () => {
diff --git a/spec/frontend/editor/components/helpers.js b/spec/frontend/editor/components/helpers.js
index 3e6cd2a236d..12f90390c18 100644
--- a/spec/frontend/editor/components/helpers.js
+++ b/spec/frontend/editor/components/helpers.js
@@ -1,12 +1,28 @@
import { EDITOR_TOOLBAR_RIGHT_GROUP } from '~/editor/constants';
+import { apolloProvider } from '~/editor/components/source_editor_toolbar_graphql';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
export const buildButton = (id = 'foo-bar-btn', options = {}) => {
return {
__typename: 'Item',
id,
label: options.label || 'Foo Bar Button',
- icon: options.icon || 'foo-bar',
+ icon: options.icon || 'check',
selected: options.selected || false,
group: options.group || EDITOR_TOOLBAR_RIGHT_GROUP,
+ onClick: options.onClick || (() => {}),
+ category: options.category || 'primary',
+ selectedLabel: options.selectedLabel || 'smth',
};
};
+
+export const warmUpCacheWithItems = (items = []) => {
+ apolloProvider.defaultClient.cache.writeQuery({
+ query: getToolbarItemsQuery,
+ data: {
+ items: {
+ nodes: items,
+ },
+ },
+ });
+};
diff --git a/spec/frontend/editor/components/source_editor_toolbar_button_spec.js b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js
index 5135091af4a..1475d451ab3 100644
--- a/spec/frontend/editor/components/source_editor_toolbar_button_spec.js
+++ b/spec/frontend/editor/components/source_editor_toolbar_button_spec.js
@@ -1,43 +1,26 @@
-import Vue, { nextTick } from 'vue';
-import VueApollo from 'vue-apollo';
+import { nextTick } from 'vue';
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import createMockApollo from 'helpers/mock_apollo_helper';
import SourceEditorToolbarButton from '~/editor/components/source_editor_toolbar_button.vue';
-import getToolbarItemQuery from '~/editor/graphql/get_item.query.graphql';
-import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
import { buildButton } from './helpers';
-Vue.use(VueApollo);
-
describe('Source Editor Toolbar button', () => {
let wrapper;
- let mockApollo;
const defaultBtn = buildButton();
const findButton = () => wrapper.findComponent(GlButton);
- const createComponentWithApollo = ({ propsData } = {}) => {
- mockApollo = createMockApollo();
- mockApollo.clients.defaultClient.cache.writeQuery({
- query: getToolbarItemQuery,
- variables: { id: defaultBtn.id },
- data: {
- item: {
- ...defaultBtn,
- },
- },
- });
-
+ const createComponent = (props = { button: defaultBtn }) => {
wrapper = shallowMount(SourceEditorToolbarButton, {
- propsData,
- apolloProvider: mockApollo,
+ propsData: {
+ ...props,
+ },
});
};
afterEach(() => {
wrapper.destroy();
- mockApollo = null;
+ wrapper = null;
});
describe('default', () => {
@@ -49,98 +32,51 @@ describe('Source Editor Toolbar button', () => {
category: 'secondary',
variant: 'info',
};
+
+ it('does not render the button if the props have not been passed', () => {
+ createComponent({});
+ expect(findButton().vm).toBeUndefined();
+ });
+
it('renders a default button without props', async () => {
- createComponentWithApollo();
+ createComponent();
const btn = findButton();
expect(btn.exists()).toBe(true);
expect(btn.props()).toMatchObject(defaultProps);
});
it('renders a button based on the props passed', async () => {
- createComponentWithApollo({
- propsData: {
- button: customProps,
- },
+ createComponent({
+ button: customProps,
});
const btn = findButton();
expect(btn.props()).toMatchObject(customProps);
});
});
- describe('button updates', () => {
- it('it properly updates button on Apollo cache update', async () => {
- const { id } = defaultBtn;
-
- createComponentWithApollo({
- propsData: {
- button: {
- id,
- },
- },
- });
-
- expect(findButton().props('selected')).toBe(false);
-
- mockApollo.clients.defaultClient.cache.writeQuery({
- query: getToolbarItemQuery,
- variables: { id },
- data: {
- item: {
- ...defaultBtn,
- selected: true,
- },
- },
- });
-
- jest.runOnlyPendingTimers();
- await nextTick();
-
- expect(findButton().props('selected')).toBe(true);
- });
- });
-
describe('click handler', () => {
- it('fires the click handler on the button when available', () => {
+ it('fires the click handler on the button when available', async () => {
const spy = jest.fn();
- createComponentWithApollo({
- propsData: {
- button: {
- onClick: spy,
- },
+ createComponent({
+ button: {
+ onClick: spy,
},
});
expect(spy).not.toHaveBeenCalled();
findButton().vm.$emit('click');
+
+ await nextTick();
expect(spy).toHaveBeenCalled();
});
- it('emits the "click" event', () => {
- createComponentWithApollo();
+ it('emits the "click" event', async () => {
+ createComponent();
jest.spyOn(wrapper.vm, '$emit');
expect(wrapper.vm.$emit).not.toHaveBeenCalled();
+
findButton().vm.$emit('click');
+ await nextTick();
+
expect(wrapper.vm.$emit).toHaveBeenCalledWith('click');
});
- it('triggers the mutation exposing the changed "selected" prop', () => {
- const { id } = defaultBtn;
- createComponentWithApollo({
- propsData: {
- button: {
- id,
- },
- },
- });
- jest.spyOn(wrapper.vm.$apollo, 'mutate');
- expect(wrapper.vm.$apollo.mutate).not.toHaveBeenCalled();
- findButton().vm.$emit('click');
- expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
- mutation: updateToolbarItemMutation,
- variables: {
- id,
- propsToUpdate: {
- selected: true,
- },
- },
- });
- });
});
});
diff --git a/spec/frontend/editor/components/source_editor_toolbar_graphql_spec.js b/spec/frontend/editor/components/source_editor_toolbar_graphql_spec.js
new file mode 100644
index 00000000000..41c48aa0a58
--- /dev/null
+++ b/spec/frontend/editor/components/source_editor_toolbar_graphql_spec.js
@@ -0,0 +1,112 @@
+import { apolloProvider } from '~/editor/components/source_editor_toolbar_graphql';
+import getToolbarItemsQuery from '~/editor/graphql/get_items.query.graphql';
+import removeItemsMutation from '~/editor/graphql/remove_items.mutation.graphql';
+import updateToolbarItemMutation from '~/editor/graphql/update_item.mutation.graphql';
+import addToolbarItemsMutation from '~/editor/graphql/add_items.mutation.graphql';
+import { buildButton, warmUpCacheWithItems } from './helpers';
+
+describe('Source Editor toolbar Apollo client', () => {
+ const item1 = buildButton('foo');
+ const item2 = buildButton('bar');
+
+ const getItems = () =>
+ apolloProvider.defaultClient.cache.readQuery({ query: getToolbarItemsQuery })?.items?.nodes ||
+ [];
+ const getItem = (id) => {
+ return getItems().find((item) => item.id === id);
+ };
+
+ afterEach(() => {
+ apolloProvider.defaultClient.clearStore();
+ });
+
+ describe('Mutations', () => {
+ describe('addToolbarItems', () => {
+ function addButtons(items) {
+ return apolloProvider.defaultClient.mutate({
+ mutation: addToolbarItemsMutation,
+ variables: {
+ items,
+ },
+ });
+ }
+ it.each`
+ cache | idsToAdd | itemsToAdd | expectedResult | comment
+ ${[]} | ${'empty array'} | ${[]} | ${[]} | ${''}
+ ${[]} | ${'undefined'} | ${undefined} | ${[]} | ${''}
+ ${[]} | ${item2.id} | ${[item2]} | ${[item2]} | ${''}
+ ${[]} | ${item1.id} | ${[item1]} | ${[item1]} | ${''}
+ ${[]} | ${[item1.id, item2.id]} | ${[item1, item2]} | ${[item1, item2]} | ${''}
+ ${[]} | ${[item1.id]} | ${item1} | ${[item1]} | ${'does not fail if the item is an Object'}
+ ${[item2]} | ${[item1.id]} | ${item1} | ${[item2, item1]} | ${'does not fail if the item is an Object'}
+ ${[item1]} | ${[item2.id]} | ${[item2]} | ${[item1, item2]} | ${'correctly adds items to the pre-populated cache'}
+ `('adds $idsToAdd item(s) to $cache', async ({ cache, itemsToAdd, expectedResult }) => {
+ await warmUpCacheWithItems(cache);
+ await addButtons(itemsToAdd);
+ await expect(getItems()).toEqual(expectedResult);
+ });
+ });
+
+ describe('removeToolbarItems', () => {
+ function removeButtons(ids) {
+ return apolloProvider.defaultClient.mutate({
+ mutation: removeItemsMutation,
+ variables: {
+ ids,
+ },
+ });
+ }
+
+ it.each`
+ cache | cacheIds | toRemove | expected
+ ${[item1, item2]} | ${[item1.id, item2.id]} | ${[item1.id]} | ${[item2]}
+ ${[item1, item2]} | ${[item1.id, item2.id]} | ${[item2.id]} | ${[item1]}
+ ${[item1, item2]} | ${[item1.id, item2.id]} | ${[item1.id, item2.id]} | ${[]}
+ ${[item1]} | ${[item1.id]} | ${[item1.id]} | ${[]}
+ ${[item2]} | ${[item2.id]} | ${[]} | ${[item2]}
+ ${[]} | ${['undefined']} | ${[item1.id]} | ${[]}
+ ${[item1]} | ${[item1.id]} | ${[item2.id]} | ${[item1]}
+ `('removes $toRemove from the $cacheIds toolbar', async ({ cache, toRemove, expected }) => {
+ await warmUpCacheWithItems(cache);
+
+ expect(getItems()).toHaveLength(cache.length);
+
+ await removeButtons(toRemove);
+
+ expect(getItems()).toHaveLength(expected.length);
+ expect(getItems()).toEqual(expected);
+ });
+ });
+
+ describe('updateToolbarItem', () => {
+ function mutateButton(item, propsToUpdate = {}) {
+ return apolloProvider.defaultClient.mutate({
+ mutation: updateToolbarItemMutation,
+ variables: {
+ id: item.id,
+ propsToUpdate,
+ },
+ });
+ }
+
+ beforeEach(() => {
+ warmUpCacheWithItems([item1, item2]);
+ });
+
+ it('updates the toolbar items', async () => {
+ expect(getItem(item1.id).selected).toBe(false);
+ expect(getItem(item2.id).selected).toBe(false);
+
+ await mutateButton(item1, { selected: true });
+
+ expect(getItem(item1.id).selected).toBe(true);
+ expect(getItem(item2.id).selected).toBe(false);
+
+ await mutateButton(item2, { selected: true });
+
+ expect(getItem(item1.id).selected).toBe(true);
+ expect(getItem(item2.id).selected).toBe(true);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/editor/extensions/source_editor_toolbar_ext_spec.js b/spec/frontend/editor/extensions/source_editor_toolbar_ext_spec.js
new file mode 100644
index 00000000000..fa5a3b2987e
--- /dev/null
+++ b/spec/frontend/editor/extensions/source_editor_toolbar_ext_spec.js
@@ -0,0 +1,156 @@
+import Vue from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
+import SourceEditorToolbar from '~/editor/components/source_editor_toolbar.vue';
+import { ToolbarExtension } from '~/editor/extensions/source_editor_toolbar_ext';
+import EditorInstance from '~/editor/source_editor_instance';
+import { apolloProvider } from '~/editor/components/source_editor_toolbar_graphql';
+import { buildButton, warmUpCacheWithItems } from '../components/helpers';
+
+describe('Source Editor Toolbar Extension', () => {
+ let instance;
+
+ const createInstance = (baseInstance = {}) => {
+ return new EditorInstance(baseInstance);
+ };
+ const getDefaultEl = () => document.getElementById('editor-toolbar');
+ const getCustomEl = () => document.getElementById('custom-toolbar');
+ const item1 = buildButton('foo');
+ const item2 = buildButton('bar');
+
+ beforeEach(() => {
+ setHTMLFixture('<div id="editor-toolbar"></div><div id="custom-toolbar"></div>');
+ });
+
+ afterEach(() => {
+ apolloProvider.defaultClient.clearStore();
+ resetHTMLFixture();
+ });
+
+ describe('onSetup', () => {
+ beforeEach(() => {
+ instance = createInstance();
+ });
+
+ it.each`
+ id | type | prefix | expectedElFn
+ ${undefined} | ${'default'} | ${'Sets up'} | ${getDefaultEl}
+ ${'custom-toolbar'} | ${'custom'} | ${'Sets up'} | ${getCustomEl}
+ ${'non-existing'} | ${'default'} | ${'Does not set up'} | ${getDefaultEl}
+ `('Sets up the Vue application on $type node when node is $id', ({ id, expectedElFn }) => {
+ jest.spyOn(Vue, 'extend');
+ jest.spyOn(ToolbarExtension, 'setupVue');
+
+ const el = document.getElementById(id);
+ const expectedEl = expectedElFn();
+
+ instance.use({ definition: ToolbarExtension, setupOptions: { el } });
+
+ if (expectedEl) {
+ expect(ToolbarExtension.setupVue).toHaveBeenCalledWith(expectedEl);
+ expect(Vue.extend).toHaveBeenCalledWith(SourceEditorToolbar);
+ } else {
+ expect(ToolbarExtension.setupVue).not.toHaveBeenCalled();
+ }
+ });
+ });
+
+ describe('public API', () => {
+ beforeEach(async () => {
+ await warmUpCacheWithItems();
+ instance = createInstance();
+ instance.use({ definition: ToolbarExtension });
+ });
+
+ describe('getAllItems', () => {
+ it('returns the list of all toolbar items', async () => {
+ await expect(instance.toolbar.getAllItems()).toEqual([]);
+ await warmUpCacheWithItems([item1, item2]);
+ await expect(instance.toolbar.getAllItems()).toEqual([item1, item2]);
+ });
+ });
+
+ describe('getItem', () => {
+ it('returns a toolbar item by id', async () => {
+ await expect(instance.toolbar.getItem(item1.id)).toEqual(undefined);
+ await warmUpCacheWithItems([item1]);
+ await expect(instance.toolbar.getItem(item1.id)).toEqual(item1);
+ });
+ });
+
+ describe('addItems', () => {
+ it.each`
+ idsToAdd | itemsToAdd | expectedResult
+ ${'empty array'} | ${[]} | ${[]}
+ ${'undefined'} | ${undefined} | ${[]}
+ ${item2.id} | ${[item2]} | ${[item2]}
+ ${item1.id} | ${[item1]} | ${[item1]}
+ ${[item1.id, item2.id]} | ${[item1, item2]} | ${[item1, item2]}
+ `('adds $idsToAdd item(s) to cache', async ({ itemsToAdd, expectedResult }) => {
+ await instance.toolbar.addItems(itemsToAdd);
+ await expect(instance.toolbar.getAllItems()).toEqual(expectedResult);
+ });
+
+ it('correctly adds items to the pre-populated cache', async () => {
+ await warmUpCacheWithItems([item1]);
+ await instance.toolbar.addItems([item2]);
+ await expect(instance.toolbar.getAllItems()).toEqual([item1, item2]);
+ });
+
+ it('does not fail if the item is an Object', async () => {
+ await instance.toolbar.addItems(item1);
+ await expect(instance.toolbar.getAllItems()).toEqual([item1]);
+ });
+ });
+
+ describe('removeItems', () => {
+ beforeEach(async () => {
+ await warmUpCacheWithItems([item1, item2]);
+ });
+
+ it.each`
+ idsToRemove | expectedResult
+ ${undefined} | ${[item1, item2]}
+ ${[]} | ${[item1, item2]}
+ ${[item1.id]} | ${[item2]}
+ ${[item2.id]} | ${[item1]}
+ ${[item1.id, item2.id]} | ${[]}
+ `(
+ 'successfully removes $idsToRemove from [foo, bar]',
+ async ({ idsToRemove, expectedResult }) => {
+ await instance.toolbar.removeItems(idsToRemove);
+ await expect(instance.toolbar.getAllItems()).toEqual(expectedResult);
+ },
+ );
+ });
+
+ describe('updateItem', () => {
+ const updatedProp = {
+ icon: 'book',
+ };
+
+ beforeEach(async () => {
+ await warmUpCacheWithItems([item1, item2]);
+ });
+
+ it.each`
+ itemsToUpdate | idToUpdate | propsToUpdate | expectedResult
+ ${undefined} | ${'undefined'} | ${undefined} | ${[item1, item2]}
+ ${item2.id} | ${item2.id} | ${undefined} | ${[item1, item2]}
+ ${item2.id} | ${item2.id} | ${{}} | ${[item1, item2]}
+ ${[item1]} | ${item1.id} | ${updatedProp} | ${[{ ...item1, ...updatedProp }, item2]}
+ ${[item2]} | ${item2.id} | ${updatedProp} | ${[item1, { ...item2, ...updatedProp }]}
+ `(
+ 'updates $idToUpdate item in cache with $propsToUpdate',
+ async ({ idToUpdate, propsToUpdate, expectedResult }) => {
+ await instance.toolbar.updateItem(idToUpdate, propsToUpdate);
+ await expect(instance.toolbar.getAllItems()).toEqual(expectedResult);
+ if (propsToUpdate) {
+ await expect(instance.toolbar.getItem(idToUpdate)).toEqual(
+ expect.objectContaining(propsToUpdate),
+ );
+ }
+ },
+ );
+ });
+ });
+});
diff --git a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
index 89420bbc35f..666a4852957 100644
--- a/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
+++ b/spec/frontend/editor/schema/ci/json_tests/positive_tests/gitlab-ci.json
@@ -97,7 +97,10 @@
"expire_in": "1 week",
"reports": {
"junit": "result.xml",
- "cobertura": "cobertura-coverage.xml",
+ "coverage_report": {
+ "coverage_format": "cobertura",
+ "path": "cobertura-coverage.xml"
+ },
"codequality": "codequality.json",
"sast": "sast.json",
"dependency_scanning": "scan.json",
@@ -147,7 +150,10 @@
"artifacts": {
"reports": {
"junit": ["result.xml"],
- "cobertura": ["cobertura-coverage.xml"],
+ "coverage_report": {
+ "coverage_format": "cobertura",
+ "path": "cobertura-coverage.xml"
+ },
"codequality": ["codequality.json"],
"sast": ["sast.json"],
"dependency_scanning": ["scan.json"],
diff --git a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
index 2f6d277ca75..9a14e1a55eb 100644
--- a/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
+++ b/spec/frontend/editor/source_editor_ci_schema_ext_spec.js
@@ -1,4 +1,5 @@
import { languages } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
import ciSchemaPath from '~/editor/schema/ci.json';
@@ -19,7 +20,7 @@ describe('~/editor/editor_ci_config_ext', () => {
let originalGitlabUrl;
const createMockEditor = ({ blobPath = defaultBlobPath } = {}) => {
- setFixtures('<div id="editor"></div>');
+ setHTMLFixture('<div id="editor"></div>');
editorEl = document.getElementById('editor');
editor = new SourceEditor();
instance = editor.createInstance({
@@ -45,7 +46,9 @@ describe('~/editor/editor_ci_config_ext', () => {
afterEach(() => {
instance.dispose();
+
editorEl.remove();
+ resetHTMLFixture();
});
describe('registerCiSchema', () => {
diff --git a/spec/frontend/editor/source_editor_extension_base_spec.js b/spec/frontend/editor/source_editor_extension_base_spec.js
index 6606557fd1f..eab39ccaba1 100644
--- a/spec/frontend/editor/source_editor_extension_base_spec.js
+++ b/spec/frontend/editor/source_editor_extension_base_spec.js
@@ -1,4 +1,5 @@
import { Range } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useFakeRequestAnimationFrame } from 'helpers/fake_request_animation_frame';
import setWindowLocation from 'helpers/set_window_location_helper';
import {
@@ -39,12 +40,13 @@ describe('The basis for an Source Editor extension', () => {
};
beforeEach(() => {
- setFixtures(generateLines());
+ setHTMLFixture(generateLines());
event = generateEventMock();
});
afterEach(() => {
jest.clearAllMocks();
+ resetHTMLFixture();
});
describe('onUse callback', () => {
@@ -253,7 +255,7 @@ describe('The basis for an Source Editor extension', () => {
});
it('does not create a link if the event is triggered on a wrong node', () => {
- setFixtures('<div class="wrong-class">3</div>');
+ setHTMLFixture('<div class="wrong-class">3</div>');
SourceEditorExtension.createAnchor = jest.fn();
const wrongEvent = generateEventMock({ el: document.querySelector('.wrong-class') });
diff --git a/spec/frontend/editor/source_editor_markdown_ext_spec.js b/spec/frontend/editor/source_editor_markdown_ext_spec.js
index eecd23bff6e..3e8c287df2f 100644
--- a/spec/frontend/editor/source_editor_markdown_ext_spec.js
+++ b/spec/frontend/editor/source_editor_markdown_ext_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import { Range, Position } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { EditorMarkdownExtension } from '~/editor/extensions/source_editor_markdown_ext';
import SourceEditor from '~/editor/source_editor';
import axios from '~/lib/utils/axios_utils';
@@ -27,7 +28,7 @@ describe('Markdown Extension for Source Editor', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- setFixtures('<div id="editor" data-editor-loading></div>');
+ setHTMLFixture('<div id="editor" data-editor-loading></div>');
editorEl = document.getElementById('editor');
editor = new SourceEditor();
instance = editor.createInstance({
@@ -42,6 +43,8 @@ describe('Markdown Extension for Source Editor', () => {
instance.dispose();
editorEl.remove();
mockAxios.restore();
+
+ resetHTMLFixture();
});
describe('getSelectedText', () => {
diff --git a/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js b/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js
index c8d016e10ac..1926f3e268e 100644
--- a/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js
+++ b/spec/frontend/editor/source_editor_markdown_livepreview_ext_spec.js
@@ -1,5 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
-import { editor as monacoEditor } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import {
EXTENSION_MARKDOWN_PREVIEW_PANEL_CLASS,
@@ -30,7 +30,6 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
const secondLine = 'multiline';
const thirdLine = 'string with some **markup**';
const text = `${firstLine}\n${secondLine}\n${thirdLine}`;
- const plaintextPath = 'foo.txt';
const markdownPath = 'foo.md';
const responseData = '<div>FooBar</div>';
@@ -41,7 +40,7 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
beforeEach(() => {
mockAxios = new MockAdapter(axios);
- setFixtures('<div id="editor" data-editor-loading></div>');
+ setHTMLFixture('<div id="editor" data-editor-loading></div>');
editorEl = document.getElementById('editor');
editor = new SourceEditor();
instance = editor.createInstance({
@@ -49,6 +48,13 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
blobPath: markdownPath,
blobContent: text,
});
+
+ instance.toolbar = {
+ addItems: jest.fn(),
+ updateItem: jest.fn(),
+ removeItems: jest.fn(),
+ };
+
extension = instance.use({
definition: EditorMarkdownPreviewExtension,
setupOptions: { previewMarkdownPath },
@@ -60,64 +66,20 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
instance.dispose();
editorEl.remove();
mockAxios.restore();
+ resetHTMLFixture();
});
it('sets up the preview on the instance', () => {
expect(instance.markdownPreview).toEqual({
el: undefined,
- action: expect.any(Object),
+ actions: expect.any(Object),
shown: false,
modelChangeListener: undefined,
path: previewMarkdownPath,
+ actionShowPreviewCondition: expect.any(Object),
});
});
- describe('model language changes listener', () => {
- let cleanupSpy;
- let actionSpy;
-
- beforeEach(async () => {
- cleanupSpy = jest.fn();
- actionSpy = jest.fn();
- spyOnApi(extension, {
- cleanup: cleanupSpy,
- setupPreviewAction: actionSpy,
- });
- await togglePreview();
- });
-
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- it('cleans up when switching away from markdown', () => {
- expect(cleanupSpy).not.toHaveBeenCalled();
- expect(actionSpy).not.toHaveBeenCalled();
-
- instance.updateModelLanguage(plaintextPath);
-
- expect(cleanupSpy).toHaveBeenCalled();
- expect(actionSpy).not.toHaveBeenCalled();
- });
-
- it.each`
- oldLanguage | newLanguage | setupCalledTimes
- ${'plaintext'} | ${'markdown'} | ${1}
- ${'markdown'} | ${'markdown'} | ${0}
- ${'markdown'} | ${'plaintext'} | ${0}
- ${'markdown'} | ${undefined} | ${0}
- ${undefined} | ${'markdown'} | ${1}
- `(
- 'correctly handles re-enabling of the action when switching from $oldLanguage to $newLanguage',
- ({ oldLanguage, newLanguage, setupCalledTimes } = {}) => {
- expect(actionSpy).not.toHaveBeenCalled();
- instance.updateModelLanguage(oldLanguage);
- instance.updateModelLanguage(newLanguage);
- expect(actionSpy).toHaveBeenCalledTimes(setupCalledTimes);
- },
- );
- });
-
describe('model change listener', () => {
let cleanupSpy;
let actionSpy;
@@ -142,33 +104,22 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
expect(cleanupSpy).not.toHaveBeenCalled();
expect(actionSpy).not.toHaveBeenCalled();
});
-
- it('cleans up the preview when the model changes', () => {
- instance.setModel(monacoEditor.createModel('foo'));
- expect(cleanupSpy).toHaveBeenCalled();
- });
-
- it.each`
- language | setupCalledTimes
- ${'markdown'} | ${1}
- ${'plaintext'} | ${0}
- ${undefined} | ${0}
- `(
- 'correctly handles actions when the new model is $language',
- ({ language, setupCalledTimes } = {}) => {
- instance.setModel(monacoEditor.createModel('foo', language));
-
- expect(actionSpy).toHaveBeenCalledTimes(setupCalledTimes);
- },
- );
});
- describe('cleanup', () => {
+ describe('onBeforeUnuse', () => {
beforeEach(async () => {
mockAxios.onPost().reply(200, { body: responseData });
await togglePreview();
});
+ it('removes the registered buttons from the toolbar', () => {
+ expect(instance.toolbar.removeItems).not.toHaveBeenCalled();
+ instance.unuse(extension);
+ expect(instance.toolbar.removeItems).toHaveBeenCalledWith([
+ EXTENSION_MARKDOWN_PREVIEW_ACTION_ID,
+ ]);
+ });
+
it('disposes the modelChange listener and does not fetch preview on content changes', () => {
expect(instance.markdownPreview.modelChangeListener).toBeDefined();
const fetchPreviewSpy = jest.fn();
@@ -176,7 +127,7 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
fetchPreview: fetchPreviewSpy,
});
- instance.cleanup();
+ instance.unuse(extension);
instance.setValue('Foo Bar');
jest.advanceTimersByTime(EXTENSION_MARKDOWN_PREVIEW_UPDATE_DELAY);
@@ -186,17 +137,11 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
it('removes the contextual menu action', () => {
expect(instance.getAction(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID)).toBeDefined();
- instance.cleanup();
+ instance.unuse(extension);
expect(instance.getAction(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID)).toBe(null);
});
- it('toggles the `shown` flag', () => {
- expect(instance.markdownPreview.shown).toBe(true);
- instance.cleanup();
- expect(instance.markdownPreview.shown).toBe(false);
- });
-
it('toggles the panel only if the preview is visible', () => {
const { el: previewEl } = instance.markdownPreview;
const parentEl = previewEl.parentElement;
@@ -204,13 +149,13 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
expect(previewEl).toBeVisible();
expect(parentEl.classList.contains(EXTENSION_MARKDOWN_PREVIEW_PANEL_PARENT_CLASS)).toBe(true);
- instance.cleanup();
+ instance.unuse(extension);
expect(previewEl).toBeHidden();
expect(parentEl.classList.contains(EXTENSION_MARKDOWN_PREVIEW_PANEL_PARENT_CLASS)).toBe(
false,
);
- instance.cleanup();
+ instance.unuse(extension);
expect(previewEl).toBeHidden();
expect(parentEl.classList.contains(EXTENSION_MARKDOWN_PREVIEW_PANEL_PARENT_CLASS)).toBe(
false,
@@ -222,12 +167,12 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
expect(instance.markdownPreview.shown).toBe(true);
- instance.cleanup();
+ instance.unuse(extension);
const { width: newWidth } = instance.getLayoutInfo();
expect(newWidth === width / EXTENSION_MARKDOWN_PREVIEW_PANEL_WIDTH).toBe(true);
- instance.cleanup();
+ instance.unuse(extension);
expect(newWidth === width / EXTENSION_MARKDOWN_PREVIEW_PANEL_WIDTH).toBe(true);
});
});
@@ -305,6 +250,12 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
mockAxios.onPost().reply(200, { body: responseData });
});
+ it('toggles the condition to toggle preview/hide actions in the context menu', () => {
+ expect(instance.markdownPreview.actionShowPreviewCondition.get()).toBe(true);
+ instance.togglePreview();
+ expect(instance.markdownPreview.actionShowPreviewCondition.get()).toBe(false);
+ });
+
it('toggles preview flag on instance', () => {
expect(instance.markdownPreview.shown).toBe(false);
diff --git a/spec/frontend/editor/source_editor_spec.js b/spec/frontend/editor/source_editor_spec.js
index 049cab3a83b..b3d914e6755 100644
--- a/spec/frontend/editor/source_editor_spec.js
+++ b/spec/frontend/editor/source_editor_spec.js
@@ -1,4 +1,5 @@
import { editor as monacoEditor, languages as monacoLanguages } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import {
SOURCE_EDITOR_INSTANCE_ERROR_NO_EL,
URI_PREFIX,
@@ -33,7 +34,7 @@ describe('Base editor', () => {
const blobGlobalId = 'snippet_777';
beforeEach(() => {
- setFixtures('<div id="editor" data-editor-loading></div>');
+ setHTMLFixture('<div id="editor" data-editor-loading></div>');
editorEl = document.getElementById('editor');
defaultArguments = { el: editorEl, blobPath, blobContent, blobGlobalId };
editor = new SourceEditor();
@@ -45,6 +46,8 @@ describe('Base editor', () => {
monacoEditor.getModels().forEach((model) => {
model.dispose();
});
+
+ resetHTMLFixture();
});
const uriFilePath = joinPaths('/', URI_PREFIX, blobGlobalId, blobPath);
@@ -244,7 +247,7 @@ describe('Base editor', () => {
const readOnlyIndex = '78'; // readOnly option has the internal index of 78 in the editor's options
beforeEach(() => {
- setFixtures('<div id="editor1"></div><div id="editor2"></div>');
+ setHTMLFixture('<div id="editor1"></div><div id="editor2"></div>');
editorEl1 = document.getElementById('editor1');
editorEl2 = document.getElementById('editor2');
inst1Args = {
@@ -262,6 +265,7 @@ describe('Base editor', () => {
afterEach(() => {
editor.dispose();
+ resetHTMLFixture();
});
it('can initialize several instances of the same editor', () => {
diff --git a/spec/frontend/editor/source_editor_yaml_ext_spec.js b/spec/frontend/editor/source_editor_yaml_ext_spec.js
index b603b0e3a98..14ec7f8b93f 100644
--- a/spec/frontend/editor/source_editor_yaml_ext_spec.js
+++ b/spec/frontend/editor/source_editor_yaml_ext_spec.js
@@ -1,4 +1,5 @@
import { Document } from 'yaml';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import SourceEditor from '~/editor/source_editor';
import { YamlEditorExtension } from '~/editor/extensions/source_editor_yaml_ext';
import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
@@ -8,7 +9,7 @@ let baseExtension;
let yamlExtension;
const getEditorInstance = (editorInstanceOptions = {}) => {
- setFixtures('<div id="editor"></div>');
+ setHTMLFixture('<div id="editor"></div>');
return new SourceEditor().createInstance({
el: document.getElementById('editor'),
blobPath: '.gitlab-ci.yml',
@@ -18,7 +19,7 @@ const getEditorInstance = (editorInstanceOptions = {}) => {
};
const getEditorInstanceWithExtension = (extensionOptions = {}, editorInstanceOptions = {}) => {
- setFixtures('<div id="editor"></div>');
+ setHTMLFixture('<div id="editor"></div>');
const instance = getEditorInstance(editorInstanceOptions);
[baseExtension, yamlExtension] = instance.use([
{ definition: SourceEditorExtension },
@@ -35,6 +36,10 @@ const getEditorInstanceWithExtension = (extensionOptions = {}, editorInstanceOpt
};
describe('YamlCreatorExtension', () => {
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('constructor', () => {
it('saves setupOptions options on the extension, but does not expose those to instance', () => {
const highlightPath = 'foo';
diff --git a/spec/frontend/editor/utils_spec.js b/spec/frontend/editor/utils_spec.js
index 97d3e9e081d..e561cad1086 100644
--- a/spec/frontend/editor/utils_spec.js
+++ b/spec/frontend/editor/utils_spec.js
@@ -1,4 +1,5 @@
import { editor as monacoEditor } from 'monaco-editor';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import * as utils from '~/editor/utils';
import { DEFAULT_THEME } from '~/ide/lib/themes';
@@ -14,10 +15,14 @@ describe('Source Editor utils', () => {
describe('clearDomElement', () => {
beforeEach(() => {
- setFixtures('<div id="foo"><div id="bar">Foo</div></div>');
+ setHTMLFixture('<div id="foo"><div id="bar">Foo</div></div>');
el = document.getElementById('foo');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('removes all child nodes from an element', () => {
expect(el.children.length).toBe(1);
utils.clearDomElement(el);
@@ -68,10 +73,14 @@ describe('Source Editor utils', () => {
beforeEach(() => {
jest.spyOn(monacoEditor, 'colorizeElement').mockImplementation();
jest.spyOn(monacoEditor, 'setTheme').mockImplementation();
- setFixtures('<pre id="foo"></pre>');
+ setHTMLFixture('<pre id="foo"></pre>');
el = document.getElementById('foo');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('colorizes the element and applies the preference theme', () => {
expect(monacoEditor.colorizeElement).not.toHaveBeenCalled();
expect(monacoEditor.setTheme).not.toHaveBeenCalled();
diff --git a/spec/frontend/emoji/components/utils_spec.js b/spec/frontend/emoji/components/utils_spec.js
index 03eeb6b6bf7..56f514ee9a8 100644
--- a/spec/frontend/emoji/components/utils_spec.js
+++ b/spec/frontend/emoji/components/utils_spec.js
@@ -1,7 +1,7 @@
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import { getFrequentlyUsedEmojis, addToFrequentlyUsed } from '~/emoji/components/utils';
-jest.mock('js-cookie');
+jest.mock('~/lib/utils/cookies');
describe('getFrequentlyUsedEmojis', () => {
it('it returns null when no saved emojis set', () => {
diff --git a/spec/frontend/environments/environment_folder_spec.js b/spec/frontend/environments/environment_folder_spec.js
index f2027252f05..37b897bf65d 100644
--- a/spec/frontend/environments/environment_folder_spec.js
+++ b/spec/frontend/environments/environment_folder_spec.js
@@ -15,12 +15,13 @@ Vue.use(VueApollo);
describe('~/environments/components/environments_folder.vue', () => {
let wrapper;
let environmentFolderMock;
+ let intervalMock;
let nestedEnvironment;
const findLink = () => wrapper.findByRole('link', { name: s__('Environments|Show all') });
const createApolloProvider = () => {
- const mockResolvers = { Query: { folder: environmentFolderMock } };
+ const mockResolvers = { Query: { folder: environmentFolderMock, interval: intervalMock } };
return createMockApollo([], mockResolvers);
};
@@ -40,6 +41,8 @@ describe('~/environments/components/environments_folder.vue', () => {
environmentFolderMock = jest.fn();
[nestedEnvironment] = resolvedEnvironmentsApp.environments;
environmentFolderMock.mockReturnValue(resolvedFolder);
+ intervalMock = jest.fn();
+ intervalMock.mockReturnValue(2000);
});
afterEach(() => {
@@ -70,6 +73,8 @@ describe('~/environments/components/environments_folder.vue', () => {
beforeEach(() => {
collapse = wrapper.findComponent(GlCollapse);
icons = wrapper.findAllComponents(GlIcon);
+ jest.spyOn(wrapper.vm.$apollo.queries.folder, 'startPolling');
+ jest.spyOn(wrapper.vm.$apollo.queries.folder, 'stopPolling');
});
it('is collapsed by default', () => {
@@ -93,6 +98,8 @@ describe('~/environments/components/environments_folder.vue', () => {
expect(iconNames).toEqual(['angle-down', 'folder-open']);
expect(folderName.classes('gl-font-weight-bold')).toBe(true);
expect(link.attributes('href')).toBe(nestedEnvironment.latest.folderPath);
+
+ expect(wrapper.vm.$apollo.queries.folder.startPolling).toHaveBeenCalledWith(2000);
});
it('displays all environments when opened', async () => {
@@ -106,6 +113,16 @@ describe('~/environments/components/environments_folder.vue', () => {
.wrappers.map((w) => w.text());
expect(environments).toEqual(expect.arrayContaining(names));
});
+
+ it('stops polling on click', async () => {
+ await button.trigger('click');
+ expect(wrapper.vm.$apollo.queries.folder.startPolling).toHaveBeenCalledWith(2000);
+
+ const collapseButton = wrapper.findByRole('button', { name: __('Collapse') });
+ await collapseButton.trigger('click');
+
+ expect(wrapper.vm.$apollo.queries.folder.stopPolling).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/frontend/filterable_list_spec.js b/spec/frontend/filterable_list_spec.js
index 3fd5d198e3a..e7197ac6dbf 100644
--- a/spec/frontend/filterable_list_spec.js
+++ b/spec/frontend/filterable_list_spec.js
@@ -1,4 +1,4 @@
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilterableList from '~/filterable_list';
describe('FilterableList', () => {
@@ -20,6 +20,10 @@ describe('FilterableList', () => {
List = new FilterableList(form, filter, holder);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('processes input parameters', () => {
expect(List.filterForm).toEqual(form);
expect(List.listFilterElement).toEqual(filter);
diff --git a/spec/frontend/filtered_search/dropdown_user_spec.js b/spec/frontend/filtered_search/dropdown_user_spec.js
index ee0eef6a1b6..26f12673f68 100644
--- a/spec/frontend/filtered_search/dropdown_user_spec.js
+++ b/spec/frontend/filtered_search/dropdown_user_spec.js
@@ -1,3 +1,4 @@
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import DropdownUser from '~/filtered_search/dropdown_user';
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchTokenizer from '~/filtered_search/filtered_search_tokenizer';
@@ -80,7 +81,7 @@ describe('Dropdown User', () => {
let authorFilterDropdownElement;
beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
authorFilterDropdownElement = document.querySelector('#js-dropdown-author');
const dummyInput = document.createElement('div');
dropdown = new DropdownUser({
@@ -89,6 +90,10 @@ describe('Dropdown User', () => {
});
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const findCurrentUserElement = () =>
authorFilterDropdownElement.querySelector('.js-current-user');
diff --git a/spec/frontend/filtered_search/dropdown_utils_spec.js b/spec/frontend/filtered_search/dropdown_utils_spec.js
index 4c1e79eba42..2030b45b44c 100644
--- a/spec/frontend/filtered_search/dropdown_utils_spec.js
+++ b/spec/frontend/filtered_search/dropdown_utils_spec.js
@@ -1,3 +1,4 @@
+import { loadHTMLFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchDropdownManager from '~/filtered_search/filtered_search_dropdown_manager';
@@ -43,13 +44,17 @@ describe('Dropdown Utils', () => {
};
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<input type="text" id="test" />
`);
input = document.getElementById('test');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should filter without symbol', () => {
input.value = 'roo';
@@ -142,7 +147,7 @@ describe('Dropdown Utils', () => {
let allowedKeys;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<ul class="tokens-container">
<li class="input-token">
<input class="filtered-search" type="text" id="test" />
@@ -350,7 +355,7 @@ describe('Dropdown Utils', () => {
let authorToken;
beforeEach(() => {
- loadFixtures(issuableListFixture);
+ loadHTMLFixture(issuableListFixture);
authorToken = FilteredSearchSpecHelper.createFilterVisualToken('author', '=', '@user');
const searchTermToken = FilteredSearchSpecHelper.createSearchVisualToken('search term');
diff --git a/spec/frontend/filtered_search/filtered_search_dropdown_manager_spec.js b/spec/frontend/filtered_search/filtered_search_dropdown_manager_spec.js
index e9ee69ca163..dff6d11a320 100644
--- a/spec/frontend/filtered_search/filtered_search_dropdown_manager_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_dropdown_manager_spec.js
@@ -1,5 +1,6 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilteredSearchDropdownManager from '~/filtered_search/filtered_search_dropdown_manager';
describe('Filtered Search Dropdown Manager', () => {
@@ -20,7 +21,7 @@ describe('Filtered Search Dropdown Manager', () => {
}
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<ul class="tokens-container">
<li class="input-token">
<input class="filtered-search">
@@ -29,6 +30,10 @@ describe('Filtered Search Dropdown Manager', () => {
`);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('input has no existing value', () => {
it('should add just tokenName', () => {
FilteredSearchDropdownManager.addWordToInput({ tokenName: 'milestone' });
diff --git a/spec/frontend/filtered_search/filtered_search_manager_spec.js b/spec/frontend/filtered_search/filtered_search_manager_spec.js
index 911a507af4c..5e68725c03e 100644
--- a/spec/frontend/filtered_search/filtered_search_manager_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_manager_spec.js
@@ -1,5 +1,5 @@
import FilteredSearchManager from 'ee_else_ce/filtered_search/filtered_search_manager';
-
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import DropdownUtils from '~/filtered_search/dropdown_utils';
import FilteredSearchDropdownManager from '~/filtered_search/filtered_search_dropdown_manager';
@@ -64,7 +64,7 @@ describe('Filtered Search Manager', () => {
}
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="filtered-search-box">
<form>
<ul class="tokens-container list-unstyled">
@@ -80,6 +80,10 @@ describe('Filtered Search Manager', () => {
jest.spyOn(FilteredSearchDropdownManager.prototype, 'setDropdown').mockImplementation();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const initializeManager = ({ useDefaultState } = {}) => {
jest.spyOn(FilteredSearchManager.prototype, 'loadSearchParamsFromURL').mockImplementation();
jest.spyOn(FilteredSearchManager.prototype, 'tokenChange').mockImplementation();
diff --git a/spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js b/spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js
index c4e125e96da..0e5c94edd05 100644
--- a/spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js
+++ b/spec/frontend/filtered_search/filtered_search_visual_tokens_spec.js
@@ -1,5 +1,6 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import waitForPromises from 'helpers/wait_for_promises';
import FilteredSearchVisualTokens from '~/filtered_search/filtered_search_visual_tokens';
@@ -24,7 +25,7 @@ describe('Filtered Search Visual Tokens', () => {
mock = new MockAdapter(axios);
mock.onGet().reply(200);
- setFixtures(`
+ setHTMLFixture(`
<ul class="tokens-container">
${FilteredSearchSpecHelper.createInputHTML()}
</ul>
@@ -35,6 +36,10 @@ describe('Filtered Search Visual Tokens', () => {
bugLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '=', '~bug');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('getLastVisualTokenBeforeInput', () => {
it('returns when there are no visual tokens', () => {
const { lastVisualToken, isLastVisualTokenValid } = subject.getLastVisualTokenBeforeInput();
@@ -241,7 +246,7 @@ describe('Filtered Search Visual Tokens', () => {
let tokenElement;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="test-area">
${subject.createVisualTokenElementHTML('custom-token')}
</div>
diff --git a/spec/frontend/filtered_search/visual_token_value_spec.js b/spec/frontend/filtered_search/visual_token_value_spec.js
index bf526a8d371..e52ffa7bd9f 100644
--- a/spec/frontend/filtered_search/visual_token_value_spec.js
+++ b/spec/frontend/filtered_search/visual_token_value_spec.js
@@ -1,5 +1,6 @@
import { escape } from 'lodash';
import labelData from 'test_fixtures/labels/project_labels.json';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import FilteredSearchSpecHelper from 'helpers/filtered_search_spec_helper';
import { TEST_HOST } from 'helpers/test_constants';
import DropdownUtils from '~/filtered_search/dropdown_utils';
@@ -28,7 +29,7 @@ describe('Filtered Search Visual Tokens', () => {
let bugLabelToken;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<ul class="tokens-container">
${FilteredSearchSpecHelper.createInputHTML()}
</ul>
@@ -39,6 +40,10 @@ describe('Filtered Search Visual Tokens', () => {
bugLabelToken = FilteredSearchSpecHelper.createFilterVisualToken('label', '=', '~bug');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('updateUserTokenAppearance', () => {
let usersCacheSpy;
diff --git a/spec/frontend/fixtures/api_merge_requests.rb b/spec/frontend/fixtures/api_merge_requests.rb
index 47321fbbeaa..75bc8c8df25 100644
--- a/spec/frontend/fixtures/api_merge_requests.rb
+++ b/spec/frontend/fixtures/api_merge_requests.rb
@@ -9,11 +9,13 @@ RSpec.describe API::MergeRequests, '(JavaScript fixtures)', type: :request do
let_it_be(:admin) { create(:admin, name: 'root') }
let_it_be(:namespace) { create(:namespace, name: 'gitlab-test' )}
let_it_be(:project) { create(:project, :repository, namespace: namespace, path: 'lorem-ipsum') }
+ let_it_be(:early_mrs) do
+ 4.times { |i| create(:merge_request, source_project: project, source_branch: "branch-#{i}") }
+ end
+
let_it_be(:mr) { create(:merge_request, source_project: project) }
it 'api/merge_requests/get.json' do
- 4.times { |i| create(:merge_request, source_project: project, source_branch: "branch-#{i}") }
-
get api("/projects/#{project.id}/merge_requests", admin)
expect(response).to be_successful
diff --git a/spec/frontend/fixtures/runner.rb b/spec/frontend/fixtures/runner.rb
index 25049ee4722..e17e73a93c4 100644
--- a/spec/frontend/fixtures/runner.rb
+++ b/spec/frontend/fixtures/runner.rb
@@ -67,7 +67,7 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
end
describe GraphQL::Query, type: :request do
- runner_query = 'details/runner.query.graphql'
+ runner_query = 'show/runner.query.graphql'
let_it_be(:query) do
get_graphql_query_as_string("#{query_path}#{runner_query}")
@@ -91,7 +91,7 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
end
describe GraphQL::Query, type: :request do
- runner_projects_query = 'details/runner_projects.query.graphql'
+ runner_projects_query = 'show/runner_projects.query.graphql'
let_it_be(:query) do
get_graphql_query_as_string("#{query_path}#{runner_projects_query}")
@@ -107,7 +107,23 @@ RSpec.describe 'Runner (JavaScript fixtures)' do
end
describe GraphQL::Query, type: :request do
- runner_jobs_query = 'details/runner_jobs.query.graphql'
+ runner_jobs_query = 'show/runner_jobs.query.graphql'
+
+ let_it_be(:query) do
+ get_graphql_query_as_string("#{query_path}#{runner_jobs_query}")
+ end
+
+ it "#{fixtures_path}#{runner_jobs_query}.json" do
+ post_graphql(query, current_user: admin, variables: {
+ id: instance_runner.to_global_id.to_s
+ })
+
+ expect_graphql_errors_to_be_empty
+ end
+ end
+
+ describe GraphQL::Query, type: :request do
+ runner_jobs_query = 'edit/runner_form.query.graphql'
let_it_be(:query) do
get_graphql_query_as_string("#{query_path}#{runner_jobs_query}")
diff --git a/spec/frontend/flash_spec.js b/spec/frontend/flash_spec.js
index 942e2c330fa..6cd32ff6b40 100644
--- a/spec/frontend/flash_spec.js
+++ b/spec/frontend/flash_spec.js
@@ -1,5 +1,5 @@
import * as Sentry from '@sentry/browser';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import createFlash, {
hideFlash,
addDismissFlashClickListener,
@@ -93,7 +93,7 @@ describe('Flash', () => {
if (alert) {
alert.$destroy();
}
- document.querySelector('.flash-container')?.remove();
+ resetHTMLFixture();
});
it('adds alert element into the document by default', () => {
@@ -330,7 +330,7 @@ describe('Flash', () => {
});
afterEach(() => {
- document.querySelector('.js-content-wrapper').remove();
+ resetHTMLFixture();
});
it('adds flash alert element into the document by default', () => {
diff --git a/spec/frontend/frequent_items/components/app_spec.js b/spec/frontend/frequent_items/components/app_spec.js
index ba989bf53ab..32c66c0d288 100644
--- a/spec/frontend/frequent_items/components/app_spec.js
+++ b/spec/frontend/frequent_items/components/app_spec.js
@@ -6,7 +6,7 @@ import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import App from '~/frequent_items/components/app.vue';
import FrequentItemsList from '~/frequent_items/components/frequent_items_list.vue';
-import { FREQUENT_ITEMS, HOUR_IN_MS } from '~/frequent_items/constants';
+import { FREQUENT_ITEMS, FIFTEEN_MINUTES_IN_MS } from '~/frequent_items/constants';
import eventHub from '~/frequent_items/event_hub';
import { createStore } from '~/frequent_items/store';
import { getTopFrequentItems } from '~/frequent_items/utils';
@@ -200,15 +200,15 @@ describe('Frequent Items App Component', () => {
]);
});
- it('should increase frequency, when created an hour later', () => {
- const hourLater = Date.now() + HOUR_IN_MS + 1;
+ it('should increase frequency, when created 15 minutes later', () => {
+ const fifteenMinutesLater = Date.now() + FIFTEEN_MINUTES_IN_MS + 1;
- jest.spyOn(Date, 'now').mockReturnValue(hourLater);
- createComponent({ currentItem: { ...TEST_PROJECT, lastAccessedOn: hourLater } });
+ jest.spyOn(Date, 'now').mockReturnValue(fifteenMinutesLater);
+ createComponent({ currentItem: { ...TEST_PROJECT, lastAccessedOn: fifteenMinutesLater } });
expect(getStoredProjects()).toEqual([
expect.objectContaining({
- lastAccessedOn: hourLater,
+ lastAccessedOn: fifteenMinutesLater,
frequency: 2,
}),
]);
diff --git a/spec/frontend/frequent_items/utils_spec.js b/spec/frontend/frequent_items/utils_spec.js
index 8c3841558f4..33c655a6ffd 100644
--- a/spec/frontend/frequent_items/utils_spec.js
+++ b/spec/frontend/frequent_items/utils_spec.js
@@ -1,5 +1,5 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import { HOUR_IN_MS, FREQUENT_ITEMS } from '~/frequent_items/constants';
+import { FIFTEEN_MINUTES_IN_MS, FREQUENT_ITEMS } from '~/frequent_items/constants';
import {
isMobile,
getTopFrequentItems,
@@ -67,8 +67,8 @@ describe('Frequent Items utils spec', () => {
describe('updateExistingFrequentItem', () => {
const LAST_ACCESSED = 1497979281815;
- const WITHIN_AN_HOUR = LAST_ACCESSED + HOUR_IN_MS;
- const OVER_AN_HOUR = WITHIN_AN_HOUR + 1;
+ const WITHIN_FIFTEEN_MINUTES = LAST_ACCESSED + FIFTEEN_MINUTES_IN_MS;
+ const OVER_FIFTEEN_MINUTES = WITHIN_FIFTEEN_MINUTES + 1;
const EXISTING_ITEM = Object.freeze({
...mockProject,
frequency: 1,
@@ -76,10 +76,10 @@ describe('Frequent Items utils spec', () => {
});
it.each`
- desc | existingProps | newProps | expected
- ${'updates item if accessed over an hour ago'} | ${{}} | ${{ lastAccessedOn: OVER_AN_HOUR }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
- ${'does not update is accessed with an hour'} | ${{}} | ${{ lastAccessedOn: WITHIN_AN_HOUR }} | ${{ lastAccessedOn: EXISTING_ITEM.lastAccessedOn, frequency: 1 }}
- ${'updates if lastAccessedOn not found'} | ${{ lastAccessedOn: undefined }} | ${{ lastAccessedOn: WITHIN_AN_HOUR }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
+ desc | existingProps | newProps | expected
+ ${'updates item if accessed over 15 minutes ago'} | ${{}} | ${{ lastAccessedOn: OVER_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
+ ${'does not update is accessed with 15 minutes'} | ${{}} | ${{ lastAccessedOn: WITHIN_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: EXISTING_ITEM.lastAccessedOn, frequency: 1 }}
+ ${'updates if lastAccessedOn not found'} | ${{ lastAccessedOn: undefined }} | ${{ lastAccessedOn: WITHIN_FIFTEEN_MINUTES }} | ${{ lastAccessedOn: Date.now(), frequency: 2 }}
`('$desc', ({ existingProps, newProps, expected }) => {
const newItem = {
...EXISTING_ITEM,
diff --git a/spec/frontend/gfm_auto_complete_spec.js b/spec/frontend/gfm_auto_complete_spec.js
index 1ab3286fe4c..aa98b2774ea 100644
--- a/spec/frontend/gfm_auto_complete_spec.js
+++ b/spec/frontend/gfm_auto_complete_spec.js
@@ -2,6 +2,7 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import labelsFixture from 'test_fixtures/autocomplete_sources/labels.json';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import GfmAutoComplete, { membersBeforeSave, highlighter } from 'ee_else_ce/gfm_auto_complete';
import { initEmojiMock, clearEmojiMock } from 'helpers/emoji';
import '~/lib/utils/jquery_at_who';
@@ -722,7 +723,7 @@ describe('GfmAutoComplete', () => {
let $textarea;
beforeEach(() => {
- setFixtures('<textarea></textarea>');
+ setHTMLFixture('<textarea></textarea>');
autocomplete = new GfmAutoComplete(dataSources);
$textarea = $('textarea');
autocomplete.setup($textarea, { labels: true });
@@ -730,6 +731,7 @@ describe('GfmAutoComplete', () => {
afterEach(() => {
autocomplete.destroy();
+ resetHTMLFixture();
});
const triggerDropdown = (text) => {
diff --git a/spec/frontend/gl_field_errors_spec.js b/spec/frontend/gl_field_errors_spec.js
index ada3b34e6b1..92d04927ee5 100644
--- a/spec/frontend/gl_field_errors_spec.js
+++ b/spec/frontend/gl_field_errors_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import GlFieldErrors from '~/gl_field_errors';
describe('GL Style Field Errors', () => {
@@ -9,13 +10,17 @@ describe('GL Style Field Errors', () => {
});
beforeEach(() => {
- loadFixtures('static/gl_field_errors.html');
+ loadHTMLFixture('static/gl_field_errors.html');
const $form = $('form.gl-show-field-errors');
testContext.$form = $form;
testContext.fieldErrors = new GlFieldErrors($form);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should select the correct input elements', () => {
expect(testContext.$form).toBeDefined();
expect(testContext.$form.length).toBe(1);
diff --git a/spec/frontend/google_tag_manager/index_spec.js b/spec/frontend/google_tag_manager/index_spec.js
index de4a57a7319..6412fe8bb33 100644
--- a/spec/frontend/google_tag_manager/index_spec.js
+++ b/spec/frontend/google_tag_manager/index_spec.js
@@ -14,7 +14,7 @@ import {
trackTransaction,
trackAddToCartUsageTab,
} from '~/google_tag_manager';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { logError } from '~/lib/logger';
jest.mock('~/lib/logger');
@@ -216,6 +216,10 @@ describe('~/google_tag_manager/index', () => {
subject();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it.each(expectedEvents)('when %p', ({ selector, trigger, expectation }) => {
expect(spy).not.toHaveBeenCalled();
@@ -443,6 +447,8 @@ describe('~/google_tag_manager/index', () => {
expect(spy).not.toHaveBeenCalled();
expect(logError).not.toHaveBeenCalled();
+
+ resetHTMLFixture();
});
});
@@ -468,6 +474,8 @@ describe('~/google_tag_manager/index', () => {
'Unexpected error while pushing to dataLayer',
pushError,
);
+
+ resetHTMLFixture();
});
});
});
diff --git a/spec/frontend/gpg_badges_spec.js b/spec/frontend/gpg_badges_spec.js
index 0bb50fc3e6f..0a1596b492d 100644
--- a/spec/frontend/gpg_badges_spec.js
+++ b/spec/frontend/gpg_badges_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'spec/test_constants';
import GpgBadges from '~/gpg_badges';
import axios from '~/lib/utils/axios_utils';
@@ -18,7 +19,7 @@ describe('GpgBadges', () => {
const dummyUrl = `${TEST_HOST}/dummy/signatures`;
const setForm = ({ utf8 = '✓', search = '' } = {}) => {
- setFixtures(`
+ setHTMLFixture(`
<form
class="commits-search-form js-signature-container" data-signatures-path="${dummyUrl}" action="${dummyUrl}"
method="get">
@@ -38,24 +39,27 @@ describe('GpgBadges', () => {
afterEach(() => {
mock.restore();
+ resetHTMLFixture();
});
it('does not make a request if there is no container element', async () => {
- setFixtures('');
+ setHTMLFixture('');
jest.spyOn(axios, 'get').mockImplementation(() => {});
await GpgBadges.fetch();
expect(axios.get).not.toHaveBeenCalled();
+ resetHTMLFixture();
});
it('throws an error if the endpoint is missing', async () => {
- setFixtures('<div class="js-signature-container"></div>');
+ setHTMLFixture('<div class="js-signature-container"></div>');
jest.spyOn(axios, 'get').mockImplementation(() => {});
await expect(GpgBadges.fetch()).rejects.toEqual(
new Error('Missing commit signatures endpoint!'),
);
expect(axios.get).not.toHaveBeenCalled();
+ resetHTMLFixture();
});
it('fetches commit signatures', async () => {
diff --git a/spec/frontend/group_settings/components/shared_runners_form_spec.js b/spec/frontend/group_settings/components/shared_runners_form_spec.js
index 26e9cd39cfd..70a22c86e62 100644
--- a/spec/frontend/group_settings/components/shared_runners_form_spec.js
+++ b/spec/frontend/group_settings/components/shared_runners_form_spec.js
@@ -1,47 +1,46 @@
-import { GlLoadingIcon, GlAlert } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlAlert } from '@gitlab/ui';
import MockAxiosAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import SharedRunnersForm from '~/group_settings/components/shared_runners_form.vue';
import axios from '~/lib/utils/axios_utils';
-const provide = {
- updatePath: '/test/update',
- sharedRunnersAvailability: 'enabled',
- parentSharedRunnersAvailability: null,
- runnerDisabled: 'disabled',
- runnerEnabled: 'enabled',
- runnerAllowOverride: 'allow_override',
-};
-
-jest.mock('~/flash');
+const UPDATE_PATH = '/test/update';
+const RUNNER_ENABLED_VALUE = 'enabled';
+const RUNNER_DISABLED_VALUE = 'disabled_and_unoverridable';
+const RUNNER_ALLOW_OVERRIDE_VALUE = 'disabled_with_override';
describe('group_settings/components/shared_runners_form', () => {
let wrapper;
let mock;
- const createComponent = (provides = {}) => {
- wrapper = shallowMount(SharedRunnersForm, {
+ const createComponent = (provide = {}) => {
+ wrapper = shallowMountExtended(SharedRunnersForm, {
provide: {
+ updatePath: UPDATE_PATH,
+ sharedRunnersSetting: RUNNER_ENABLED_VALUE,
+ parentSharedRunnersSetting: null,
+ runnerEnabledValue: RUNNER_ENABLED_VALUE,
+ runnerDisabledValue: RUNNER_DISABLED_VALUE,
+ runnerAllowOverrideValue: RUNNER_ALLOW_OVERRIDE_VALUE,
...provide,
- ...provides,
},
});
};
- const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
- const findErrorAlert = () => wrapper.find(GlAlert);
- const findEnabledToggle = () => wrapper.find('[data-testid="enable-runners-toggle"]');
- const findOverrideToggle = () => wrapper.find('[data-testid="override-runners-toggle"]');
- const changeToggle = (toggle) => toggle.vm.$emit('change', !toggle.props('value'));
+ const findAlert = (variant) =>
+ wrapper
+ .findAllComponents(GlAlert)
+ .filter((w) => w.props('variant') === variant)
+ .at(0);
+ const findSharedRunnersToggle = () => wrapper.findByTestId('shared-runners-toggle');
+ const findOverrideToggle = () => wrapper.findByTestId('override-runners-toggle');
const getSharedRunnersSetting = () => JSON.parse(mock.history.put[0].data).shared_runners_setting;
- const isLoadingIconVisible = () => findLoadingIcon().exists();
beforeEach(() => {
mock = new MockAxiosAdapter(axios);
-
- mock.onPut(provide.updatePath).reply(200);
+ mock.onPut(UPDATE_PATH).reply(200);
});
afterEach(() => {
@@ -51,102 +50,122 @@ describe('group_settings/components/shared_runners_form', () => {
mock.restore();
});
- describe('with default', () => {
+ describe('default state', () => {
beforeEach(() => {
createComponent();
});
- it('loading icon does not exist', () => {
- expect(isLoadingIconVisible()).toBe(false);
+ it('"Enable shared runners" toggle is enabled', () => {
+ expect(findSharedRunnersToggle().props()).toMatchObject({
+ isLoading: false,
+ disabled: false,
+ });
});
- it('enabled toggle exists', () => {
- expect(findEnabledToggle().exists()).toBe(true);
+ it('"Override the group setting" is disabled', () => {
+ expect(findOverrideToggle().props()).toMatchObject({
+ isLoading: false,
+ disabled: true,
+ });
});
+ });
- it('override toggle does not exist', () => {
- expect(findOverrideToggle().exists()).toBe(false);
+ describe('When group disabled shared runners', () => {
+ it(`toggles are not disabled with setting ${RUNNER_DISABLED_VALUE}`, () => {
+ createComponent({ sharedRunnersSetting: RUNNER_DISABLED_VALUE });
+
+ expect(findSharedRunnersToggle().props('disabled')).toBe(false);
+ expect(findOverrideToggle().props('disabled')).toBe(false);
});
});
- describe('loading icon', () => {
- it('shows and hides the loading icon on request', async () => {
- createComponent();
+ describe('When parent group disabled shared runners', () => {
+ it('toggles are disabled', () => {
+ createComponent({
+ sharedRunnersSetting: RUNNER_DISABLED_VALUE,
+ parentSharedRunnersSetting: RUNNER_DISABLED_VALUE,
+ });
+
+ expect(findSharedRunnersToggle().props('disabled')).toBe(true);
+ expect(findOverrideToggle().props('disabled')).toBe(true);
+ expect(findAlert('warning').exists()).toBe(true);
+ });
+ });
- expect(isLoadingIconVisible()).toBe(false);
+ describe('loading state', () => {
+ beforeEach(() => {
+ createComponent();
+ });
- findEnabledToggle().vm.$emit('change', true);
+ it('is not loading by default', () => {
+ expect(findSharedRunnersToggle().props('isLoading')).toBe(false);
+ expect(findOverrideToggle().props('isLoading')).toBe(false);
+ });
+ it('is loading immediately after request', async () => {
+ findSharedRunnersToggle().vm.$emit('change', true);
await nextTick();
- expect(isLoadingIconVisible()).toBe(true);
+ expect(findSharedRunnersToggle().props('isLoading')).toBe(true);
+ expect(findOverrideToggle().props('isLoading')).toBe(true);
+ });
+
+ it('does not update settings while loading', async () => {
+ findSharedRunnersToggle().vm.$emit('change', true);
+ findSharedRunnersToggle().vm.$emit('change', false);
+ await waitForPromises();
+ expect(mock.history.put.length).toBe(1);
+ });
+
+ it('is not loading state after completed request', async () => {
+ findSharedRunnersToggle().vm.$emit('change', true);
await waitForPromises();
- expect(isLoadingIconVisible()).toBe(false);
+ expect(findSharedRunnersToggle().props('isLoading')).toBe(false);
+ expect(findOverrideToggle().props('isLoading')).toBe(false);
});
});
- describe('enable toggle', () => {
+ describe('"Enable shared runners" toggle', () => {
beforeEach(() => {
createComponent();
});
- it('enabling the toggle sends correct payload', async () => {
- findEnabledToggle().vm.$emit('change', true);
-
+ it('sends correct payload when turned on', async () => {
+ findSharedRunnersToggle().vm.$emit('change', true);
await waitForPromises();
- expect(getSharedRunnersSetting()).toEqual(provide.runnerEnabled);
- expect(findOverrideToggle().exists()).toBe(false);
+ expect(getSharedRunnersSetting()).toEqual(RUNNER_ENABLED_VALUE);
+ expect(findOverrideToggle().props('disabled')).toBe(true);
});
- it('disabling the toggle sends correct payload', async () => {
- findEnabledToggle().vm.$emit('change', false);
-
+ it('sends correct payload when turned off', async () => {
+ findSharedRunnersToggle().vm.$emit('change', false);
await waitForPromises();
- expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled);
- expect(findOverrideToggle().exists()).toBe(true);
+ expect(getSharedRunnersSetting()).toEqual(RUNNER_DISABLED_VALUE);
+ expect(findOverrideToggle().props('disabled')).toBe(false);
});
});
- describe('override toggle', () => {
+ describe('"Override the group setting" toggle', () => {
beforeEach(() => {
- createComponent({ sharedRunnersAvailability: provide.runnerAllowOverride });
+ createComponent({ sharedRunnersSetting: RUNNER_ALLOW_OVERRIDE_VALUE });
});
it('enabling the override toggle sends correct payload', async () => {
findOverrideToggle().vm.$emit('change', true);
-
await waitForPromises();
- expect(getSharedRunnersSetting()).toEqual(provide.runnerAllowOverride);
+ expect(getSharedRunnersSetting()).toEqual(RUNNER_ALLOW_OVERRIDE_VALUE);
});
it('disabling the override toggle sends correct payload', async () => {
findOverrideToggle().vm.$emit('change', false);
-
await waitForPromises();
- expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled);
- });
- });
-
- describe('toggle disabled state', () => {
- it(`toggles are not disabled with setting ${provide.runnerDisabled}`, () => {
- createComponent({ sharedRunnersAvailability: provide.runnerDisabled });
- expect(findEnabledToggle().props('disabled')).toBe(false);
- expect(findOverrideToggle().props('disabled')).toBe(false);
- });
-
- it('toggles are disabled', () => {
- createComponent({
- sharedRunnersAvailability: provide.runnerDisabled,
- parentSharedRunnersAvailability: provide.runnerDisabled,
- });
- expect(findEnabledToggle().props('disabled')).toBe(true);
- expect(findOverrideToggle().props('disabled')).toBe(true);
+ expect(getSharedRunnersSetting()).toEqual(RUNNER_DISABLED_VALUE);
});
});
@@ -156,16 +175,16 @@ describe('group_settings/components/shared_runners_form', () => {
${{ error: 'Undefined error' }} | ${'Undefined error Refresh the page and try again.'}
`(`with error $errorObj`, ({ errorObj, message }) => {
beforeEach(async () => {
- mock.onPut(provide.updatePath).reply(500, errorObj);
+ mock.onPut(UPDATE_PATH).reply(500, errorObj);
createComponent();
- changeToggle(findEnabledToggle());
+ findSharedRunnersToggle().vm.$emit('change', false);
await waitForPromises();
});
it('error should be shown', () => {
- expect(findErrorAlert().text()).toBe(message);
+ expect(findAlert('danger').text()).toBe(message);
});
});
});
diff --git a/spec/frontend/groups/landing_spec.js b/spec/frontend/groups/landing_spec.js
index d60adea202b..2c2c19ee0c7 100644
--- a/spec/frontend/groups/landing_spec.js
+++ b/spec/frontend/groups/landing_spec.js
@@ -1,4 +1,4 @@
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import Landing from '~/groups/landing';
describe('Landing', () => {
diff --git a/spec/frontend/header_spec.js b/spec/frontend/header_spec.js
index 937bc9aa478..19849fba63c 100644
--- a/spec/frontend/header_spec.js
+++ b/spec/frontend/header_spec.js
@@ -1,6 +1,7 @@
import $ from 'jquery';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import initTodoToggle, { initNavUserDropdownTracking } from '~/header';
+import { loadHTMLFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
describe('Header', () => {
describe('Todos notification', () => {
@@ -17,7 +18,11 @@ describe('Header', () => {
beforeEach(() => {
initTodoToggle();
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('should update todos-count after receiving the todo:toggle event', () => {
@@ -57,7 +62,7 @@ describe('Header', () => {
let trackingSpy;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<li class="js-nav-user-dropdown">
<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>`);
@@ -70,6 +75,7 @@ describe('Header', () => {
afterEach(() => {
unmockTracking();
+ resetHTMLFixture();
});
it('sends a tracking event when the dropdown is opened and contains Buy Pipeline minutes link', () => {
diff --git a/spec/frontend/helpers/startup_css_helper_spec.js b/spec/frontend/helpers/startup_css_helper_spec.js
index 703bdbd342f..2236b5aa261 100644
--- a/spec/frontend/helpers/startup_css_helper_spec.js
+++ b/spec/frontend/helpers/startup_css_helper_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { waitForCSSLoaded } from '~/helpers/startup_css_helper';
describe('waitForCSSLoaded', () => {
@@ -41,17 +42,19 @@ describe('waitForCSSLoaded', () => {
describe('with startup css enabled', () => {
it('should dispatch CSSLoaded when the assets are cached or already loaded', async () => {
- setFixtures(`
+ setHTMLFixture(`
<link href="one.css" data-startupcss="loaded">
<link href="two.css" data-startupcss="loaded">
`);
await waitForCSSLoaded(mockedCallback);
expect(mockedCallback).toHaveBeenCalledTimes(1);
+
+ resetHTMLFixture();
});
it('should wait to call CssLoaded until the assets are loaded', async () => {
- setFixtures(`
+ setHTMLFixture(`
<link href="one.css" data-startupcss="loading">
<link href="two.css" data-startupcss="loading">
`);
@@ -63,6 +66,8 @@ describe('waitForCSSLoaded', () => {
await events;
expect(mockedCallback).toHaveBeenCalledTimes(1);
+
+ resetHTMLFixture();
});
});
});
diff --git a/spec/frontend/ide/components/commit_sidebar/message_field_spec.js b/spec/frontend/ide/components/commit_sidebar/message_field_spec.js
index e66de6bb0b0..ace266aec5e 100644
--- a/spec/frontend/ide/components/commit_sidebar/message_field_spec.js
+++ b/spec/frontend/ide/components/commit_sidebar/message_field_spec.js
@@ -1,4 +1,5 @@
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import createComponent from 'helpers/vue_mount_component_helper';
import CommitMessageField from '~/ide/components/commit_sidebar/message_field.vue';
@@ -7,7 +8,7 @@ describe('IDE commit message field', () => {
let vm;
beforeEach(() => {
- setFixtures('<div id="app"></div>');
+ setHTMLFixture('<div id="app"></div>');
vm = createComponent(
Component,
@@ -21,6 +22,8 @@ describe('IDE commit message field', () => {
afterEach(() => {
vm.$destroy();
+
+ resetHTMLFixture();
});
it('adds is-focused class on focus', async () => {
diff --git a/spec/frontend/ide/components/new_dropdown/upload_spec.js b/spec/frontend/ide/components/new_dropdown/upload_spec.js
index 5a7419d6dce..3eafe9e7ccb 100644
--- a/spec/frontend/ide/components/new_dropdown/upload_spec.js
+++ b/spec/frontend/ide/components/new_dropdown/upload_spec.js
@@ -70,7 +70,9 @@ describe('new dropdown upload', () => {
});
it('calls readAsText and creates file in plain text (without encoding) if the file content is plain text', async () => {
- const waitForCreate = new Promise((resolve) => vm.$on('create', resolve));
+ const waitForCreate = new Promise((resolve) => {
+ vm.$on('create', resolve);
+ });
vm.createFile(textTarget, textFile);
diff --git a/spec/frontend/image_diff/image_diff_spec.js b/spec/frontend/image_diff/image_diff_spec.js
index 710aa7108a8..f8faa8d78c2 100644
--- a/spec/frontend/image_diff/image_diff_spec.js
+++ b/spec/frontend/image_diff/image_diff_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import imageDiffHelper from '~/image_diff/helpers/index';
import ImageDiff from '~/image_diff/image_diff';
@@ -9,7 +10,7 @@ describe('ImageDiff', () => {
let imageDiff;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="element">
<div class="diff-file">
<div class="js-image-frame">
@@ -35,6 +36,10 @@ describe('ImageDiff', () => {
element = document.getElementById('element');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('constructor', () => {
beforeEach(() => {
imageDiff = new ImageDiff(element, {
diff --git a/spec/frontend/image_diff/init_discussion_tab_spec.js b/spec/frontend/image_diff/init_discussion_tab_spec.js
index f6f05037c95..3b427f0d54d 100644
--- a/spec/frontend/image_diff/init_discussion_tab_spec.js
+++ b/spec/frontend/image_diff/init_discussion_tab_spec.js
@@ -1,9 +1,10 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initImageDiffHelper from '~/image_diff/helpers/init_image_diff';
import initDiscussionTab from '~/image_diff/init_discussion_tab';
describe('initDiscussionTab', () => {
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="timeline-content">
<div class="diff-file js-image-file"></div>
<div class="diff-file js-image-file"></div>
@@ -11,6 +12,10 @@ describe('initDiscussionTab', () => {
`);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should pass canCreateNote as false to initImageDiff', () => {
jest
.spyOn(initImageDiffHelper, 'initImageDiff')
diff --git a/spec/frontend/image_diff/replaced_image_diff_spec.js b/spec/frontend/image_diff/replaced_image_diff_spec.js
index 2b401fc46bf..d789e964e4c 100644
--- a/spec/frontend/image_diff/replaced_image_diff_spec.js
+++ b/spec/frontend/image_diff/replaced_image_diff_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import imageDiffHelper from '~/image_diff/helpers/index';
import ImageDiff from '~/image_diff/image_diff';
@@ -9,7 +10,7 @@ describe('ReplacedImageDiff', () => {
let replacedImageDiff;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="element">
<div class="two-up">
<div class="js-image-frame">
@@ -36,6 +37,10 @@ describe('ReplacedImageDiff', () => {
element = document.getElementById('element');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
function setupImageFrameEls() {
replacedImageDiff.imageFrameEls = [];
replacedImageDiff.imageFrameEls[viewTypes.TWO_UP] = element.querySelector(
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 b17ff2e0f52..1939e43e5dc 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
@@ -9,7 +9,7 @@ import createFlash from '~/flash';
import httpStatus from '~/lib/utils/http_status';
import axios from '~/lib/utils/axios_utils';
import { STATUSES } from '~/import_entities/constants';
-import { i18n } from '~/import_entities/import_groups/constants';
+import { i18n, ROOT_NAMESPACE } from '~/import_entities/import_groups/constants';
import ImportTable from '~/import_entities/import_groups/components/import_table.vue';
import importGroupsMutation from '~/import_entities/import_groups/graphql/mutations/import_groups.mutation.graphql';
import PaginationLinks from '~/vue_shared/components/pagination_links.vue';
@@ -45,6 +45,8 @@ describe('import table', () => {
const findImportButtons = () =>
wrapper.findAll('button').wrappers.filter((w) => w.text() === 'Import');
const findPaginationDropdown = () => wrapper.find('[data-testid="page-size"]');
+ const findTargetNamespaceDropdown = (rowWrapper) =>
+ rowWrapper.find('[data-testid="target-namespace-selector"]');
const findPaginationDropdownText = () => findPaginationDropdown().find('button').text();
const findSelectionCount = () => wrapper.find('[data-test-id="selection-count"]');
@@ -70,6 +72,7 @@ describe('import table', () => {
groupPathRegex: /.*/,
jobsPath: '/fake_job_path',
sourceUrl: SOURCE_URL,
+ historyPath: '/fake_history_path',
},
apolloProvider,
});
@@ -136,6 +139,32 @@ describe('import table', () => {
expect(wrapper.findAll('tbody tr')).toHaveLength(FAKE_GROUPS.length);
});
+ it('correctly maintains root namespace as last import target', async () => {
+ createComponent({
+ bulkImportSourceGroups: () => ({
+ nodes: [
+ {
+ ...generateFakeEntry({ id: 1, status: STATUSES.FINISHED }),
+ lastImportTarget: {
+ id: 1,
+ targetNamespace: ROOT_NAMESPACE.fullPath,
+ newName: 'does-not-matter',
+ },
+ },
+ ],
+ pageInfo: FAKE_PAGE_INFO,
+ versionValidation: FAKE_VERSION_VALIDATION,
+ }),
+ });
+
+ await waitForPromises();
+ const firstRow = wrapper.find('tbody tr');
+ const targetNamespaceDropdownButton = findTargetNamespaceDropdown(firstRow).find(
+ '[aria-haspopup]',
+ );
+ expect(targetNamespaceDropdownButton.text()).toBe('No parent');
+ });
+
it('does not render status string when result list is empty', async () => {
createComponent({
bulkImportSourceGroups: jest.fn().mockResolvedValue({
diff --git a/spec/frontend/import_entities/import_groups/utils_spec.js b/spec/frontend/import_entities/import_groups/utils_spec.js
new file mode 100644
index 00000000000..2892c5c217b
--- /dev/null
+++ b/spec/frontend/import_entities/import_groups/utils_spec.js
@@ -0,0 +1,56 @@
+import { STATUSES } from '~/import_entities/constants';
+import { isFinished, isAvailableForImport } from '~/import_entities/import_groups/utils';
+
+const FINISHED_STATUSES = [STATUSES.FINISHED, STATUSES.FAILED, STATUSES.TIMEOUT];
+const OTHER_STATUSES = Object.values(STATUSES).filter(
+ (status) => !FINISHED_STATUSES.includes(status),
+);
+describe('gitlab migration status utils', () => {
+ describe('isFinished', () => {
+ it.each(FINISHED_STATUSES.map((s) => [s]))(
+ 'reports group as finished when import status is %s',
+ (status) => {
+ expect(isFinished({ progress: { status } })).toBe(true);
+ },
+ );
+
+ it.each(OTHER_STATUSES.map((s) => [s]))(
+ 'does not report group as finished when import status is %s',
+ (status) => {
+ expect(isFinished({ progress: { status } })).toBe(false);
+ },
+ );
+
+ it('does not report group as finished when there is no progress', () => {
+ expect(isFinished({ progress: null })).toBe(false);
+ });
+
+ it('does not report group as finished when status is unknown', () => {
+ expect(isFinished({ progress: { status: 'weird' } })).toBe(false);
+ });
+ });
+
+ describe('isAvailableForImport', () => {
+ it.each(FINISHED_STATUSES.map((s) => [s]))(
+ 'reports group as available for import when status is %s',
+ (status) => {
+ expect(isAvailableForImport({ progress: { status } })).toBe(true);
+ },
+ );
+
+ it.each(OTHER_STATUSES.map((s) => [s]))(
+ 'does not report group as not available for import when status is %s',
+ (status) => {
+ expect(isAvailableForImport({ progress: { status } })).toBe(false);
+ },
+ );
+
+ it('reports group as available for import when there is no progress', () => {
+ expect(isAvailableForImport({ progress: null })).toBe(true);
+ });
+
+ it('reports group as finished when status is unknown', () => {
+ expect(isFinished({ progress: { status: 'weird' } })).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
index 88fcedd31b2..140fec3863b 100644
--- a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
@@ -1,4 +1,4 @@
-import { GlLoadingIcon, GlButton, GlIntersectionObserver, GlFormInput } from '@gitlab/ui';
+import { GlLoadingIcon, GlButton, GlIntersectionObserver, GlSearchBoxByClick } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
@@ -15,7 +15,7 @@ describe('ImportProjectsTable', () => {
const findFilterField = () =>
wrapper
- .findAllComponents(GlFormInput)
+ .findAllComponents(GlSearchBoxByClick)
.wrappers.find((w) => w.attributes('placeholder') === 'Filter by name');
const providerTitle = 'THE PROVIDER';
diff --git a/spec/frontend/incidents_settings/components/__snapshots__/pagerduty_form_spec.js.snap b/spec/frontend/incidents_settings/components/__snapshots__/pagerduty_form_spec.js.snap
index feee14c9c40..7e24aa439d4 100644
--- a/spec/frontend/incidents_settings/components/__snapshots__/pagerduty_form_spec.js.snap
+++ b/spec/frontend/incidents_settings/components/__snapshots__/pagerduty_form_spec.js.snap
@@ -57,6 +57,7 @@ exports[`Alert integration settings form should match the default snapshot 1`] =
</gl-button-stub>
<gl-modal-stub
+ arialabel=""
dismisslabel="Close"
modalclass=""
modalid="resetWebhookModal"
diff --git a/spec/frontend/integrations/edit/components/integration_form_spec.js b/spec/frontend/integrations/edit/components/integration_form_spec.js
index ca481e009cf..a2bdece821f 100644
--- a/spec/frontend/integrations/edit/components/integration_form_spec.js
+++ b/spec/frontend/integrations/edit/components/integration_form_spec.js
@@ -1,4 +1,4 @@
-import { GlForm } from '@gitlab/ui';
+import { GlBadge, GlForm } from '@gitlab/ui';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import * as Sentry from '@sentry/browser';
@@ -18,11 +18,18 @@ import {
integrationLevels,
I18N_SUCCESSFUL_CONNECTION_MESSAGE,
I18N_DEFAULT_ERROR_MESSAGE,
+ billingPlans,
+ billingPlanNames,
} from '~/integrations/constants';
import { createStore } from '~/integrations/edit/store';
import httpStatus from '~/lib/utils/http_status';
import { refreshCurrentPage } from '~/lib/utils/url_utility';
-import { mockIntegrationProps, mockField, mockSectionConnection } from '../mock_data';
+import {
+ mockIntegrationProps,
+ mockField,
+ mockSectionConnection,
+ mockSectionJiraIssues,
+} from '../mock_data';
jest.mock('@sentry/browser');
jest.mock('~/lib/utils/url_utility');
@@ -72,6 +79,7 @@ describe('IntegrationForm', () => {
const findInstanceOrGroupSaveButton = () => wrapper.findByTestId('save-button-instance-group');
const findTestButton = () => wrapper.findByTestId('test-button');
const findTriggerFields = () => wrapper.findComponent(TriggerFields);
+ const findGlBadge = () => wrapper.findComponent(GlBadge);
const findGlForm = () => wrapper.findComponent(GlForm);
const findRedirectToField = () => wrapper.findByTestId('redirect-to-field');
const findDynamicField = () => wrapper.findComponent(DynamicField);
@@ -327,9 +335,21 @@ describe('IntegrationForm', () => {
expect(connectionSection.find('h4').text()).toBe(mockSectionConnection.title);
expect(connectionSection.find('p').text()).toBe(mockSectionConnection.description);
+ expect(findGlBadge().exists()).toBe(false);
expect(findConnectionSectionComponent().exists()).toBe(true);
});
+ it('renders GlBadge when `plan` is present', () => {
+ createComponent({
+ customStateProps: {
+ sections: [mockSectionConnection, mockSectionJiraIssues],
+ },
+ });
+
+ expect(findGlBadge().exists()).toBe(true);
+ expect(findGlBadge().text()).toMatchInterpolatedText(billingPlanNames[billingPlans.PREMIUM]);
+ });
+
it('passes only fields with section type', () => {
const sectionFields = [
{ name: 'username', type: 'text', section: mockSectionConnection.type },
diff --git a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
index 94e370a485f..b4c5d4f9957 100644
--- a/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
+++ b/spec/frontend/integrations/edit/components/jira_issues_fields_spec.js
@@ -10,7 +10,6 @@ describe('JiraIssuesFields', () => {
let wrapper;
const defaultProps = {
- showJiraIssuesIntegration: true,
showJiraVulnerabilitiesIntegration: true,
upgradePlanPath: 'https://gitlab.com',
};
@@ -42,8 +41,6 @@ describe('JiraIssuesFields', () => {
findEnableCheckbox().find('[type=checkbox]').attributes('disabled');
const findProjectKey = () => wrapper.findComponent(GlFormInput);
const findProjectKeyFormGroup = () => wrapper.findByTestId('project-key-form-group');
- const findPremiumUpgradeCTA = () => wrapper.findByTestId('premium-upgrade-cta');
- const findUltimateUpgradeCTA = () => wrapper.findByTestId('ultimate-upgrade-cta');
const findJiraForVulnerabilities = () => wrapper.findByTestId('jira-for-vulnerabilities');
const setEnableCheckbox = async (isEnabled = true) =>
findEnableCheckbox().vm.$emit('input', isEnabled);
@@ -55,19 +52,16 @@ describe('JiraIssuesFields', () => {
describe('template', () => {
describe.each`
- showJiraIssuesIntegration | showJiraVulnerabilitiesIntegration
- ${false} | ${false}
- ${false} | ${true}
- ${true} | ${false}
- ${true} | ${true}
+ showJiraIssuesIntegration
+ ${false}
+ ${true}
`(
- 'when `showJiraIssuesIntegration` is $jiraIssues and `showJiraVulnerabilitiesIntegration` is $jiraVulnerabilities',
- ({ showJiraIssuesIntegration, showJiraVulnerabilitiesIntegration }) => {
+ 'when showJiraIssuesIntegration = $showJiraIssuesIntegration',
+ ({ showJiraIssuesIntegration }) => {
beforeEach(() => {
createComponent({
props: {
showJiraIssuesIntegration,
- showJiraVulnerabilitiesIntegration,
},
});
});
@@ -77,39 +71,12 @@ describe('JiraIssuesFields', () => {
expect(findEnableCheckbox().exists()).toBe(true);
expect(findEnableCheckboxDisabled()).toBeUndefined();
});
-
- it('does not render the Premium CTA', () => {
- expect(findPremiumUpgradeCTA().exists()).toBe(false);
- });
-
- if (!showJiraVulnerabilitiesIntegration) {
- it.each`
- scenario | enableJiraIssues
- ${'when "Enable Jira issues" is checked, renders Ultimate upgrade CTA'} | ${true}
- ${'when "Enable Jira issues" is unchecked, does not render Ultimate upgrade CTA'} | ${false}
- `('$scenario', async ({ enableJiraIssues }) => {
- if (enableJiraIssues) {
- await setEnableCheckbox();
- }
- expect(findUltimateUpgradeCTA().exists()).toBe(enableJiraIssues);
- });
- }
} else {
- it('does not render enable checkbox', () => {
- expect(findEnableCheckbox().exists()).toBe(false);
- });
-
- it('renders the Premium CTA', () => {
- const premiumUpgradeCTA = findPremiumUpgradeCTA();
-
- expect(premiumUpgradeCTA.exists()).toBe(true);
- expect(premiumUpgradeCTA.props('upgradePlanPath')).toBe(defaultProps.upgradePlanPath);
+ it('renders enable checkbox as disabled', () => {
+ expect(findEnableCheckbox().exists()).toBe(true);
+ expect(findEnableCheckboxDisabled()).toBe('disabled');
});
}
-
- it('does not render the Ultimate CTA', () => {
- expect(findUltimateUpgradeCTA().exists()).toBe(false);
- });
},
);
diff --git a/spec/frontend/integrations/edit/mock_data.js b/spec/frontend/integrations/edit/mock_data.js
index 36850a0a33a..ac0c7d244e3 100644
--- a/spec/frontend/integrations/edit/mock_data.js
+++ b/spec/frontend/integrations/edit/mock_data.js
@@ -37,3 +37,11 @@ export const mockSectionConnection = {
title: 'Connection details',
description: 'Learn more on how to configure this integration.',
};
+
+export const mockSectionJiraIssues = {
+ type: 'jira_issues',
+ title: 'Issues',
+ description:
+ 'Work on Jira issues without leaving GitLab. Add a Jira menu to access a read-only list of your Jira issues. Learn more.',
+ plan: 'premium',
+};
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 84317da39e6..13985ce7d74 100644
--- a/spec/frontend/invite_members/components/invite_members_modal_spec.js
+++ b/spec/frontend/invite_members/components/invite_members_modal_spec.js
@@ -1,4 +1,4 @@
-import { GlLink, GlModal, GlSprintf } from '@gitlab/ui';
+import { GlLink, GlModal, GlSprintf, GlFormGroup } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
import { stubComponent } from 'helpers/stub_component';
@@ -15,6 +15,7 @@ import {
MEMBERS_MODAL_CELEBRATE_INTRO,
MEMBERS_MODAL_CELEBRATE_TITLE,
MEMBERS_PLACEHOLDER,
+ MEMBERS_PLACEHOLDER_DISABLED,
MEMBERS_TO_PROJECT_CELEBRATE_INTRO_TEXT,
LEARN_GITLAB,
} from '~/invite_members/constants';
@@ -28,6 +29,8 @@ import {
propsData,
inviteSource,
newProjectPath,
+ freeUsersLimit,
+ membersCount,
user1,
user2,
user3,
@@ -45,12 +48,13 @@ describe('InviteMembersModal', () => {
let wrapper;
let mock;
- const createComponent = (props = {}) => {
+ const createComponent = (props = {}, stubs = {}) => {
wrapper = shallowMountExtended(InviteMembersModal, {
provide: {
newProjectPath,
},
propsData: {
+ usersLimitDataset: {},
...propsData,
...props,
},
@@ -62,16 +66,17 @@ describe('InviteMembersModal', () => {
template: '<div><slot></slot><slot name="modal-footer"></slot></div>',
}),
GlEmoji,
+ ...stubs,
},
});
};
- const createInviteMembersToProjectWrapper = () => {
- createComponent({ isProject: true });
+ const createInviteMembersToProjectWrapper = (usersLimitDataset = {}, stubs = {}) => {
+ createComponent({ usersLimitDataset, isProject: true }, stubs);
};
- const createInviteMembersToGroupWrapper = () => {
- createComponent({ isProject: false });
+ const createInviteMembersToGroupWrapper = (usersLimitDataset = {}, stubs = {}) => {
+ createComponent({ usersLimitDataset, isProject: false }, stubs);
};
beforeEach(() => {
@@ -95,7 +100,7 @@ describe('InviteMembersModal', () => {
const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
const membersFormGroupInvalidFeedback = () =>
findMembersFormGroup().attributes('invalid-feedback');
- const membersFormGroupDescription = () => findMembersFormGroup().attributes('description');
+ const membersFormGroupText = () => findMembersFormGroup().text();
const findMembersSelect = () => wrapper.findComponent(MembersTokenSelect);
const findTasksToBeDone = () => wrapper.findByTestId('invite-members-modal-tasks-to-be-done');
const findTasks = () => wrapper.findByTestId('invite-members-modal-tasks');
@@ -259,16 +264,33 @@ describe('InviteMembersModal', () => {
expect(wrapper.findComponent(ModalConfetti).exists()).toBe(false);
});
- it('includes the correct invitee, type, and formatted name', () => {
+ it('includes the correct invitee', () => {
expect(findIntroText()).toBe("You're inviting members to the test name project.");
expect(findCelebrationEmoji().exists()).toBe(false);
- expect(membersFormGroupDescription()).toBe(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('members form group description', () => {
+ it('renders correct description', () => {
+ createInviteMembersToProjectWrapper({ freeUsersLimit, membersCount }, { GlFormGroup });
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('when reached user limit', () => {
+ it('renders correct description', () => {
+ createInviteMembersToProjectWrapper(
+ { freeUsersLimit, membersCount: 5 },
+ { GlFormGroup },
+ );
+
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER_DISABLED);
+ });
+ });
});
});
describe('when inviting members with celebration', () => {
beforeEach(async () => {
- createComponent({ isProject: true });
+ createInviteMembersToProjectWrapper();
await triggerOpenModal({ mode: 'celebrate' });
});
@@ -285,7 +307,28 @@ describe('InviteMembersModal', () => {
`${MEMBERS_TO_PROJECT_CELEBRATE_INTRO_TEXT} ${MEMBERS_MODAL_CELEBRATE_INTRO}`,
);
expect(findCelebrationEmoji().exists()).toBe(true);
- expect(membersFormGroupDescription()).toBe(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('members form group description', () => {
+ it('renders correct description', async () => {
+ createInviteMembersToProjectWrapper({ freeUsersLimit, membersCount }, { GlFormGroup });
+ await triggerOpenModal({ mode: 'celebrate' });
+
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('when reached user limit', () => {
+ it('renders correct description', async () => {
+ createInviteMembersToProjectWrapper(
+ { freeUsersLimit, membersCount: 5 },
+ { GlFormGroup },
+ );
+
+ await triggerOpenModal({ mode: 'celebrate' });
+
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER_DISABLED);
+ });
+ });
});
});
});
@@ -295,7 +338,20 @@ describe('InviteMembersModal', () => {
createInviteMembersToGroupWrapper();
expect(findIntroText()).toBe("You're inviting members to the test name group.");
- expect(membersFormGroupDescription()).toBe(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('members form group description', () => {
+ it('renders correct description', () => {
+ createInviteMembersToGroupWrapper({ freeUsersLimit, membersCount }, { GlFormGroup });
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER);
+ });
+
+ describe('when reached user limit', () => {
+ it('renders correct description', () => {
+ createInviteMembersToGroupWrapper({ freeUsersLimit, membersCount: 5 }, { GlFormGroup });
+ expect(membersFormGroupText()).toContain(MEMBERS_PLACEHOLDER_DISABLED);
+ });
+ });
});
});
});
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 8355ae67f20..010f7b999fc 100644
--- a/spec/frontend/invite_members/components/invite_modal_base_spec.js
+++ b/spec/frontend/invite_members/components/invite_modal_base_spec.js
@@ -6,18 +6,30 @@ import {
GlSprintf,
GlLink,
GlModal,
+ GlIcon,
} from '@gitlab/ui';
import { stubComponent } from 'helpers/stub_component';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import InviteModalBase from '~/invite_members/components/invite_modal_base.vue';
import ContentTransition from '~/vue_shared/components/content_transition.vue';
-import { CANCEL_BUTTON_TEXT, INVITE_BUTTON_TEXT } from '~/invite_members/constants';
-import { propsData } from '../mock_data/modal_base';
+
+import {
+ CANCEL_BUTTON_TEXT,
+ INVITE_BUTTON_TEXT_DISABLED,
+ INVITE_BUTTON_TEXT,
+ CANCEL_BUTTON_TEXT_DISABLED,
+ ON_SHOW_TRACK_LABEL,
+ ON_CLOSE_TRACK_LABEL,
+ ON_SUBMIT_TRACK_LABEL,
+} from '~/invite_members/constants';
+
+import { propsData, membersPath, purchasePath } from '../mock_data/modal_base';
describe('InviteModalBase', () => {
let wrapper;
- const createComponent = (props = {}) => {
+ const createComponent = (props = {}, stubs = {}) => {
wrapper = shallowMountExtended(InviteModalBase, {
propsData: {
...propsData,
@@ -33,8 +45,9 @@ describe('InviteModalBase', () => {
GlDropdownItem: true,
GlSprintf,
GlFormGroup: stubComponent(GlFormGroup, {
- props: ['state', 'invalidFeedback', 'description'],
+ props: ['state', 'invalidFeedback'],
}),
+ ...stubs,
},
});
};
@@ -48,8 +61,12 @@ describe('InviteModalBase', () => {
const findDropdownItems = () => findDropdown().findAllComponents(GlDropdownItem);
const findDatepicker = () => wrapper.findComponent(GlDatepicker);
const findLink = () => wrapper.findComponent(GlLink);
+ const findIcon = () => wrapper.findComponent(GlIcon);
const findIntroText = () => wrapper.findByTestId('modal-base-intro-text').text();
const findMembersFormGroup = () => wrapper.findByTestId('members-form-group');
+ const findDisabledInput = () => wrapper.findByTestId('disabled-input');
+ const findCancelButton = () => wrapper.find('.js-modal-action-cancel');
+ const findActionButton = () => wrapper.find('.js-modal-action-primary');
describe('rendering the modal', () => {
beforeEach(() => {
@@ -106,11 +123,103 @@ describe('InviteModalBase', () => {
it('renders the members form group', () => {
expect(findMembersFormGroup().props()).toEqual({
- description: propsData.formGroupDescription,
invalidFeedback: '',
state: null,
});
});
+
+ it('renders description', () => {
+ createComponent({}, { GlFormGroup });
+
+ expect(findMembersFormGroup().text()).toContain(propsData.formGroupDescription);
+ });
+
+ describe('when users limit is reached', () => {
+ let trackingSpy;
+
+ const expectTracking = (action, label) =>
+ expect(trackingSpy).toHaveBeenCalledWith('default', action, {
+ label,
+ category: 'default',
+ });
+
+ beforeEach(() => {
+ createComponent(
+ { usersLimitDataset: { membersPath, purchasePath }, reachedLimit: true },
+ { GlModal, GlFormGroup },
+ );
+ });
+
+ it('renders correct blocks', () => {
+ expect(findIcon().exists()).toBe(true);
+ expect(findDisabledInput().exists()).toBe(true);
+ expect(findDropdown().exists()).toBe(false);
+ expect(findDatepicker().exists()).toBe(false);
+ });
+
+ it('renders correct buttons', () => {
+ const cancelButton = findCancelButton();
+ const actionButton = findActionButton();
+
+ expect(cancelButton.attributes('href')).toBe(purchasePath);
+ expect(cancelButton.text()).toBe(CANCEL_BUTTON_TEXT_DISABLED);
+ expect(actionButton.attributes('href')).toBe(membersPath);
+ expect(actionButton.text()).toBe(INVITE_BUTTON_TEXT_DISABLED);
+ });
+
+ it('tracks actions', () => {
+ createComponent({ reachedLimit: true }, { GlFormGroup, GlModal });
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ const modal = wrapper.findComponent(GlModal);
+
+ modal.vm.$emit('shown');
+ expectTracking('render', ON_SHOW_TRACK_LABEL);
+
+ modal.vm.$emit('cancel', { preventDefault: jest.fn() });
+ expectTracking('click_button', ON_CLOSE_TRACK_LABEL);
+
+ modal.vm.$emit('primary', { preventDefault: jest.fn() });
+ expectTracking('click_button', ON_SUBMIT_TRACK_LABEL);
+
+ unmockTracking();
+ });
+
+ describe('when free user namespace', () => {
+ it('hides cancel button', () => {
+ createComponent(
+ {
+ usersLimitDataset: { membersPath, purchasePath, userNamespace: true },
+ reachedLimit: true,
+ },
+ { GlModal, GlFormGroup },
+ );
+
+ expect(findCancelButton().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('when users limit is not reached', () => {
+ const textRegex = /Select a role.+Read more about role permissions Access expiration date \(optional\)/;
+
+ beforeEach(() => {
+ createComponent({ reachedLimit: false }, { GlModal, GlFormGroup });
+ });
+
+ it('renders correct blocks', () => {
+ expect(findIcon().exists()).toBe(false);
+ expect(findDisabledInput().exists()).toBe(false);
+ expect(findDropdown().exists()).toBe(true);
+ expect(findDatepicker().exists()).toBe(true);
+ expect(wrapper.findComponent(GlModal).text()).toMatch(textRegex);
+ });
+
+ it('renders correct buttons', () => {
+ expect(findCancelButton().text()).toBe(CANCEL_BUTTON_TEXT);
+ expect(findActionButton().text()).toBe(INVITE_BUTTON_TEXT);
+ });
+ });
});
it('with isLoading, shows loading for invite button', () => {
@@ -127,7 +236,6 @@ describe('InviteModalBase', () => {
});
expect(findMembersFormGroup().props()).toEqual({
- description: propsData.formGroupDescription,
invalidFeedback: 'invalid message!',
state: false,
});
diff --git a/spec/frontend/invite_members/components/user_limit_notification_spec.js b/spec/frontend/invite_members/components/user_limit_notification_spec.js
index c779cf2ee3f..4c9adbfcc44 100644
--- a/spec/frontend/invite_members/components/user_limit_notification_spec.js
+++ b/spec/frontend/invite_members/components/user_limit_notification_spec.js
@@ -2,21 +2,31 @@ import { GlAlert, GlSprintf } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import UserLimitNotification from '~/invite_members/components/user_limit_notification.vue';
+import {
+ REACHED_LIMIT_MESSAGE,
+ REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE,
+} from '~/invite_members/constants';
+
+import { freeUsersLimit, membersCount } from '../mock_data/member_modal';
+
describe('UserLimitNotification', () => {
let wrapper;
const findAlert = () => wrapper.findComponent(GlAlert);
- const createComponent = (providers = {}) => {
+ const createComponent = (reachedLimit = false, usersLimitDataset = {}) => {
wrapper = shallowMountExtended(UserLimitNotification, {
- provide: {
- name: 'my group',
- newTrialRegistrationPath: 'newTrialRegistrationPath',
- purchasePath: 'purchasePath',
- freeUsersLimit: 5,
- membersCount: 1,
- ...providers,
+ propsData: {
+ reachedLimit,
+ usersLimitDataset: {
+ freeUsersLimit,
+ membersCount,
+ newTrialRegistrationPath: 'newTrialRegistrationPath',
+ purchasePath: 'purchasePath',
+ ...usersLimitDataset,
+ },
},
+ provide: { name: 'my group' },
stubs: { GlSprintf },
});
};
@@ -26,21 +36,17 @@ describe('UserLimitNotification', () => {
});
describe('when limit is not reached', () => {
- beforeEach(() => {
+ it('renders empty block', () => {
createComponent();
- });
- it('renders empty block', () => {
expect(findAlert().exists()).toBe(false);
});
});
describe('when close to limit', () => {
- beforeEach(() => {
- createComponent({ membersCount: 3 });
- });
-
it("renders user's limit notification", () => {
+ createComponent(false, { membersCount: 3 });
+
const alert = findAlert();
expect(alert.attributes('title')).toEqual(
@@ -54,18 +60,27 @@ describe('UserLimitNotification', () => {
});
describe('when limit is reached', () => {
- beforeEach(() => {
- createComponent({ membersCount: 5 });
- });
-
it("renders user's limit notification", () => {
+ createComponent(true);
+
const alert = findAlert();
expect(alert.attributes('title')).toEqual("You've reached your 5 members limit for my group");
+ expect(alert.text()).toEqual(REACHED_LIMIT_UPGRADE_SUGGESTION_MESSAGE);
+ });
- expect(alert.text()).toEqual(
- 'New members will be unable to participate. You can manage your members by removing ones you no longer need. To get more members an owner of this namespace can start a trial or upgrade to a paid tier.',
- );
+ describe('when free user namespace', () => {
+ it("renders user's limit notification", () => {
+ createComponent(true, { userNamespace: true });
+
+ const alert = findAlert();
+
+ expect(alert.attributes('title')).toEqual(
+ "You've reached your 5 members limit for my group",
+ );
+
+ expect(alert.text()).toEqual(REACHED_LIMIT_MESSAGE);
+ });
});
});
});
diff --git a/spec/frontend/invite_members/mock_data/member_modal.js b/spec/frontend/invite_members/mock_data/member_modal.js
index 1b0cc57fb5b..474234cfacb 100644
--- a/spec/frontend/invite_members/mock_data/member_modal.js
+++ b/spec/frontend/invite_members/mock_data/member_modal.js
@@ -18,6 +18,8 @@ export const propsData = {
export const inviteSource = 'unknown';
export const newProjectPath = 'projects/new';
+export const freeUsersLimit = 5;
+export const membersCount = 1;
export const user1 = { id: 1, name: 'Name One', username: 'one_1', avatar_url: '' };
export const user2 = { id: 2, name: 'Name Two', username: 'one_2', avatar_url: '' };
diff --git a/spec/frontend/invite_members/mock_data/modal_base.js b/spec/frontend/invite_members/mock_data/modal_base.js
index ea5a8d2b00d..565e8d4df1e 100644
--- a/spec/frontend/invite_members/mock_data/modal_base.js
+++ b/spec/frontend/invite_members/mock_data/modal_base.js
@@ -9,3 +9,6 @@ export const propsData = {
labelSearchField: '_label_search_field_',
formGroupDescription: '_form_group_description_',
};
+
+export const membersPath = '/members_path';
+export const purchasePath = '/purchase_path';
diff --git a/spec/frontend/issuable/components/issuable_header_warnings_spec.js b/spec/frontend/issuable/components/issuable_header_warnings_spec.js
index c8380e42787..e3a36dc8820 100644
--- a/spec/frontend/issuable/components/issuable_header_warnings_spec.js
+++ b/spec/frontend/issuable/components/issuable_header_warnings_spec.js
@@ -66,7 +66,15 @@ describe('IssuableHeaderWarnings', () => {
});
it(`${renderTestMessage(confidentialStatus)} the confidential icon`, () => {
- expect(findConfidentialIcon().exists()).toBe(confidentialStatus);
+ const confidentialEl = findConfidentialIcon();
+ expect(confidentialEl.exists()).toBe(confidentialStatus);
+
+ if (confidentialStatus && !hiddenStatus) {
+ expect(confidentialEl.props()).toMatchObject({
+ workspaceType: 'project',
+ issuableType: 'issue',
+ });
+ }
});
it(`${renderTestMessage(confidentialStatus)} the hidden icon`, () => {
diff --git a/spec/frontend/issuable/components/status_box_spec.js b/spec/frontend/issuable/components/status_box_spec.js
index 9cbf023dbd6..728b8958b9b 100644
--- a/spec/frontend/issuable/components/status_box_spec.js
+++ b/spec/frontend/issuable/components/status_box_spec.js
@@ -1,71 +1,53 @@
-import { GlIcon, GlSprintf } from '@gitlab/ui';
+import { GlBadge, GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import StatusBox from '~/issuable/components/status_box.vue';
let wrapper;
function factory(propsData) {
- wrapper = shallowMount(StatusBox, { propsData, stubs: { GlSprintf } });
+ wrapper = shallowMount(StatusBox, { propsData, stubs: { GlBadge } });
}
-const testCases = [
- {
- name: 'Open',
- state: 'opened',
- class: 'status-box-open',
- icon: 'issue-open-m',
- },
- {
- name: 'Open',
- state: 'locked',
- class: 'status-box-open',
- icon: 'issue-open-m',
- },
- {
- name: 'Closed',
- state: 'closed',
- class: 'status-box-mr-closed',
- icon: 'issue-close',
- },
- {
- name: 'Merged',
- state: 'merged',
- class: 'status-box-mr-merged',
- icon: 'git-merge',
- },
-];
-
describe('Merge request status box component', () => {
+ const findBadge = () => wrapper.findComponent(GlBadge);
+
afterEach(() => {
wrapper.destroy();
wrapper = null;
});
- testCases.forEach((testCase) => {
- describe(`when merge request is ${testCase.name}`, () => {
- it('renders human readable test', () => {
+ describe.each`
+ issuableType | badgeText | initialState | badgeClass | badgeVariant | badgeIcon
+ ${'merge_request'} | ${'Open'} | ${'opened'} | ${'issuable-status-badge-open'} | ${'success'} | ${'merge-request-open'}
+ ${'merge_request'} | ${'Closed'} | ${'closed'} | ${'issuable-status-badge-closed'} | ${'danger'} | ${'merge-request-close'}
+ ${'merge_request'} | ${'Merged'} | ${'merged'} | ${'issuable-status-badge-merged'} | ${'info'} | ${'merge'}
+ ${'issue'} | ${'Open'} | ${'opened'} | ${'issuable-status-badge-open'} | ${'success'} | ${'issues'}
+ ${'issue'} | ${'Closed'} | ${'closed'} | ${'issuable-status-badge-closed'} | ${'info'} | ${'issue-closed'}
+ `(
+ 'with issuableType set to "$issuableType" and state set to "$initialState"',
+ ({ issuableType, badgeText, initialState, badgeClass, badgeVariant, badgeIcon }) => {
+ beforeEach(() => {
factory({
- initialState: testCase.state,
+ initialState,
+ issuableType,
});
-
- expect(wrapper.text()).toContain(testCase.name);
});
- it('sets css class', () => {
- factory({
- initialState: testCase.state,
- });
+ it(`renders badge with text '${badgeText}'`, () => {
+ expect(findBadge().text()).toBe(badgeText);
+ });
- expect(wrapper.classes()).toContain(testCase.class);
+ it(`sets badge css class as '${badgeClass}'`, () => {
+ expect(findBadge().classes()).toContain(badgeClass);
});
- it('renders icon', () => {
- factory({
- initialState: testCase.state,
- });
+ it(`sets badge variant as '${badgeVariant}`, () => {
+ expect(findBadge().props('variant')).toBe(badgeVariant);
+ });
- expect(wrapper.findComponent(GlIcon).props('name')).toBe(testCase.icon);
+ it(`sets badge icon as '${badgeIcon}'`, () => {
+ expect(findBadge().findComponent(GlIcon).props('name')).toBe(badgeIcon);
});
- });
- });
+ },
+ );
});
diff --git a/spec/frontend/issuable/issuable_form_spec.js b/spec/frontend/issuable/issuable_form_spec.js
index 99ed18cf5bd..a1583076b41 100644
--- a/spec/frontend/issuable/issuable_form_spec.js
+++ b/spec/frontend/issuable/issuable_form_spec.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableForm from '~/issuable/issuable_form';
import setWindowLocation from 'helpers/set_window_location_helper';
@@ -11,7 +11,7 @@ describe('IssuableForm', () => {
};
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<form>
<input name="[title]" />
</form>
@@ -19,6 +19,10 @@ describe('IssuableForm', () => {
createIssuable($('form'));
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('initAutosave', () => {
it('creates autosave with the searchTerm included', () => {
setWindowLocation('https://gitlab.test/foo?bar=true');
@@ -28,7 +32,7 @@ describe('IssuableForm', () => {
});
it("creates autosave fields without the searchTerm if it's an issue new form", () => {
- setFixtures(`
+ setHTMLFixture(`
<form data-new-issue-path="/issues/new">
<input name="[title]" />
</form>
diff --git a/spec/frontend/issuable/related_issues/components/related_issues_root_spec.js b/spec/frontend/issuable/related_issues/components/related_issues_root_spec.js
index b59717a1f60..1a03ea58b60 100644
--- a/spec/frontend/issuable/related_issues/components/related_issues_root_spec.js
+++ b/spec/frontend/issuable/related_issues/components/related_issues_root_spec.js
@@ -300,16 +300,27 @@ describe('RelatedIssuesRoot', () => {
expect(wrapper.vm.state.pendingReferences[1]).toEqual('random');
});
- it('prepends # when user enters a numeric value [0-9]', async () => {
- const input = '23';
+ it.each`
+ pathIdSeparator
+ ${'#'}
+ ${'&'}
+ `(
+ 'prepends $pathIdSeparator when user enters a numeric value [0-9]',
+ async ({ pathIdSeparator }) => {
+ const input = '23';
+
+ await wrapper.setProps({
+ pathIdSeparator,
+ });
- wrapper.vm.onInput({
- untouchedRawReferences: input.trim().split(/\s/),
- touchedReference: input,
- });
+ wrapper.vm.onInput({
+ untouchedRawReferences: input.trim().split(/\s/),
+ touchedReference: input,
+ });
- expect(wrapper.vm.inputValue).toBe(`#${input}`);
- });
+ expect(wrapper.vm.inputValue).toBe(`${pathIdSeparator}${input}`);
+ },
+ );
it('prepends # when user enters a number', async () => {
const input = 23;
diff --git a/spec/frontend/issues/issue_spec.js b/spec/frontend/issues/issue_spec.js
index 8a089b372ff..089ea8dbbad 100644
--- a/spec/frontend/issues/issue_spec.js
+++ b/spec/frontend/issues/issue_spec.js
@@ -1,5 +1,6 @@
import { getByText } from '@testing-library/dom';
import MockAdapter from 'axios-mock-adapter';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants';
import Issue from '~/issues/issue';
import axios from '~/lib/utils/axios_utils';
@@ -24,11 +25,11 @@ describe('Issue', () => {
const getIssueCounter = () => document.querySelector('.issue_counter');
const getOpenStatusBox = () =>
getByText(document, (_, el) => el.textContent.match(/Open/), {
- selector: '.status-box-open',
+ selector: '.issuable-status-badge-open',
});
const getClosedStatusBox = () =>
getByText(document, (_, el) => el.textContent.match(/Closed/), {
- selector: '.status-box-issue-closed',
+ selector: '.issuable-status-badge-closed',
});
describe.each`
@@ -38,9 +39,9 @@ describe('Issue', () => {
`('$desc', ({ isIssueInitiallyOpen, expectedCounterText }) => {
beforeEach(() => {
if (isIssueInitiallyOpen) {
- loadFixtures('issues/open-issue.html');
+ loadHTMLFixture('issues/open-issue.html');
} else {
- loadFixtures('issues/closed-issue.html');
+ loadHTMLFixture('issues/closed-issue.html');
}
testContext.issueCounter = getIssueCounter();
@@ -50,6 +51,10 @@ describe('Issue', () => {
testContext.issueCounter.textContent = '1,001';
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it(`has the proper visible status box when ${isIssueInitiallyOpen ? 'open' : 'closed'}`, () => {
if (isIssueInitiallyOpen) {
expect(testContext.statusBoxClosed).toHaveClass('hidden');
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 5a9bd1ff8e4..d92ba527b5c 100644
--- a/spec/frontend/issues/list/components/issues_list_app_spec.js
+++ b/spec/frontend/issues/list/components/issues_list_app_spec.js
@@ -5,8 +5,11 @@ import AxiosMockAdapter from 'axios-mock-adapter';
import { cloneDeep } from 'lodash';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
+import VueRouter from 'vue-router';
import getIssuesQuery from 'ee_else_ce/issues/list/queries/get_issues.query.graphql';
import getIssuesCountsQuery from 'ee_else_ce/issues/list/queries/get_issues_counts.query.graphql';
+import getIssuesWithoutCrmQuery from 'ee_else_ce/issues/list/queries/get_issues_without_crm.query.graphql';
+import getIssuesCountsWithoutCrmQuery from 'ee_else_ce/issues/list/queries/get_issues_counts_without_crm.query.graphql';
import createMockApollo from 'helpers/mock_apollo_helper';
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
@@ -58,6 +61,7 @@ describe('CE IssuesListApp component', () => {
let wrapper;
Vue.use(VueApollo);
+ Vue.use(VueRouter);
const defaultProvide = {
autocompleteAwardEmojisPath: 'autocomplete/award/emojis/path',
@@ -78,6 +82,7 @@ describe('CE IssuesListApp component', () => {
isAnonymousSearchDisabled: false,
isIssueRepositioningDisabled: false,
isProject: true,
+ isPublicVisibilityRestricted: false,
isSignedIn: true,
jiraIntegrationPath: 'jira/integration/path',
newIssuePath: 'new/issue/path',
@@ -107,6 +112,7 @@ describe('CE IssuesListApp component', () => {
const mountComponent = ({
provide = {},
+ data = {},
issuesQueryResponse = jest.fn().mockResolvedValue(defaultQueryResponse),
issuesCountsQueryResponse = jest.fn().mockResolvedValue(getIssuesCountsQueryResponse),
sortPreferenceMutationResponse = jest.fn().mockResolvedValue(setSortPreferenceMutationResponse),
@@ -115,16 +121,21 @@ describe('CE IssuesListApp component', () => {
const requestHandlers = [
[getIssuesQuery, issuesQueryResponse],
[getIssuesCountsQuery, issuesCountsQueryResponse],
+ [getIssuesWithoutCrmQuery, issuesQueryResponse],
+ [getIssuesCountsWithoutCrmQuery, issuesCountsQueryResponse],
[setSortPreferenceMutation, sortPreferenceMutationResponse],
];
- const apolloProvider = createMockApollo(requestHandlers);
return mountFn(IssuesListApp, {
- apolloProvider,
+ apolloProvider: createMockApollo(requestHandlers),
+ router: new VueRouter({ mode: 'history' }),
provide: {
...defaultProvide,
...provide,
},
+ data() {
+ return data;
+ },
});
};
@@ -139,10 +150,10 @@ describe('CE IssuesListApp component', () => {
});
describe('IssuableList', () => {
- beforeEach(async () => {
+ beforeEach(() => {
wrapper = mountComponent();
jest.runOnlyPendingTimers();
- await waitForPromises();
+ return waitForPromises();
});
it('renders', () => {
@@ -167,10 +178,6 @@ describe('CE IssuesListApp component', () => {
useKeysetPagination: true,
hasPreviousPage: getIssuesQueryResponse.data.project.issues.pageInfo.hasPreviousPage,
hasNextPage: getIssuesQueryResponse.data.project.issues.pageInfo.hasNextPage,
- urlParams: {
- sort: urlSortParams[CREATED_DESC],
- state: IssuableStates.Opened,
- },
});
});
});
@@ -200,7 +207,7 @@ describe('CE IssuesListApp component', () => {
describe('csv import/export component', () => {
describe('when user is signed in', () => {
- beforeEach(async () => {
+ beforeEach(() => {
setWindowLocation('?search=refactor&state=opened');
wrapper = mountComponent({
@@ -209,12 +216,12 @@ describe('CE IssuesListApp component', () => {
});
jest.runOnlyPendingTimers();
- await waitForPromises();
+ return waitForPromises();
});
it('renders', () => {
expect(findCsvImportExportButtons().props()).toMatchObject({
- exportCsvPath: `${defaultProvide.exportCsvPath}?search=refactor&sort=created_date&state=opened`,
+ exportCsvPath: `${defaultProvide.exportCsvPath}?search=refactor&state=opened`,
issuableCount: 1,
});
});
@@ -252,11 +259,9 @@ describe('CE IssuesListApp component', () => {
it('emits "issuables:enableBulkEdit" event to legacy bulk edit class', async () => {
wrapper = mountComponent({ provide: { canBulkUpdate: true }, mountFn: mount });
-
jest.spyOn(eventHub, '$emit');
findGlButtonAt(2).vm.$emit('click');
-
await waitForPromises();
expect(eventHub.$emit).toHaveBeenCalledWith('issuables:enableBulkEdit');
@@ -297,32 +302,25 @@ describe('CE IssuesListApp component', () => {
describe('page', () => {
it('page_after is set from the url params', () => {
setWindowLocation('?page_after=randomCursorString');
-
wrapper = mountComponent();
- expect(findIssuableList().props('urlParams')).toMatchObject({
- page_after: 'randomCursorString',
- });
+ expect(wrapper.vm.$route.query).toMatchObject({ page_after: 'randomCursorString' });
});
it('page_before is set from the url params', () => {
setWindowLocation('?page_before=anotherRandomCursorString');
-
wrapper = mountComponent();
- expect(findIssuableList().props('urlParams')).toMatchObject({
- page_before: 'anotherRandomCursorString',
- });
+ expect(wrapper.vm.$route.query).toMatchObject({ page_before: 'anotherRandomCursorString' });
});
});
describe('search', () => {
it('is set from the url params', () => {
setWindowLocation(locationSearch);
-
wrapper = mountComponent();
- expect(findIssuableList().props('urlParams')).toMatchObject({ search: 'find issues' });
+ expect(wrapper.vm.$route.query).toMatchObject({ search: 'find issues' });
});
});
@@ -333,10 +331,7 @@ describe('CE IssuesListApp component', () => {
it.each(oldEnumSortValues)('initial sort is set with value %s', (sort) => {
wrapper = mountComponent({ provide: { initialSort: sort } });
- expect(findIssuableList().props()).toMatchObject({
- initialSortBy: getSortKey(sort),
- urlParams: { sort },
- });
+ expect(findIssuableList().props('initialSortBy')).toBe(getSortKey(sort));
});
});
@@ -346,10 +341,7 @@ describe('CE IssuesListApp component', () => {
it.each(graphQLEnumSortValues)('initial sort is set with value %s', (sort) => {
wrapper = mountComponent({ provide: { initialSort: sort.toLowerCase() } });
- expect(findIssuableList().props()).toMatchObject({
- initialSortBy: sort,
- urlParams: { sort: urlSortParams[sort] },
- });
+ expect(findIssuableList().props('initialSortBy')).toBe(sort);
});
});
@@ -359,10 +351,7 @@ describe('CE IssuesListApp component', () => {
(sort) => {
wrapper = mountComponent({ provide: { initialSort: sort } });
- expect(findIssuableList().props()).toMatchObject({
- initialSortBy: CREATED_DESC,
- urlParams: { sort: urlSortParams[CREATED_DESC] },
- });
+ expect(findIssuableList().props('initialSortBy')).toBe(CREATED_DESC);
},
);
});
@@ -375,10 +364,7 @@ describe('CE IssuesListApp component', () => {
});
it('changes the sort to the default of created descending', () => {
- expect(findIssuableList().props()).toMatchObject({
- initialSortBy: CREATED_DESC,
- urlParams: { sort: urlSortParams[CREATED_DESC] },
- });
+ expect(findIssuableList().props('initialSortBy')).toBe(CREATED_DESC);
});
it('shows an alert to tell the user that manual reordering is disabled', () => {
@@ -393,9 +379,7 @@ describe('CE IssuesListApp component', () => {
describe('state', () => {
it('is set from the url params', () => {
const initialState = IssuableStates.All;
-
setWindowLocation(`?state=${initialState}`);
-
wrapper = mountComponent();
expect(findIssuableList().props('currentTab')).toBe(initialState);
@@ -405,7 +389,6 @@ describe('CE IssuesListApp component', () => {
describe('filter tokens', () => {
it('is set from the url params', () => {
setWindowLocation(locationSearch);
-
wrapper = mountComponent();
expect(findIssuableList().props('initialFilterValue')).toEqual(filteredTokens);
@@ -414,7 +397,6 @@ describe('CE IssuesListApp component', () => {
describe('when anonymous searching is performed', () => {
beforeEach(() => {
setWindowLocation(locationSearch);
-
wrapper = mountComponent({
provide: { isAnonymousSearchDisabled: true, isSignedIn: false },
});
@@ -649,12 +631,12 @@ describe('CE IssuesListApp component', () => {
${'fetching issues'} | ${'issuesQueryResponse'} | ${IssuesListApp.i18n.errorFetchingIssues}
${'fetching issue counts'} | ${'issuesCountsQueryResponse'} | ${IssuesListApp.i18n.errorFetchingCounts}
`('when there is an error $error', ({ mountOption, message }) => {
- beforeEach(async () => {
+ beforeEach(() => {
wrapper = mountComponent({
[mountOption]: jest.fn().mockRejectedValue(new Error('ERROR')),
});
jest.runOnlyPendingTimers();
- await waitForPromises();
+ return waitForPromises();
});
it('shows an error message', () => {
@@ -676,29 +658,51 @@ describe('CE IssuesListApp component', () => {
describe('when "click-tab" event is emitted by IssuableList', () => {
beforeEach(() => {
wrapper = mountComponent();
+ jest.spyOn(wrapper.vm.$router, 'push');
findIssuableList().vm.$emit('click-tab', IssuableStates.Closed);
});
- it('updates to the new tab', () => {
+ it('updates ui to the new tab', () => {
expect(findIssuableList().props('currentTab')).toBe(IssuableStates.Closed);
});
- });
- describe.each(['next-page', 'previous-page'])(
- 'when "%s" event is emitted by IssuableList',
- (event) => {
- beforeEach(() => {
- wrapper = mountComponent();
+ it('updates url to the new tab', () => {
+ expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ query: expect.objectContaining({ state: IssuableStates.Closed }),
+ });
+ });
+ });
- findIssuableList().vm.$emit(event);
+ describe.each`
+ event | paramName | paramValue
+ ${'next-page'} | ${'page_after'} | ${'endCursor'}
+ ${'previous-page'} | ${'page_before'} | ${'startCursor'}
+ `('when "$event" event is emitted by IssuableList', ({ event, paramName, paramValue }) => {
+ beforeEach(() => {
+ wrapper = mountComponent({
+ data: {
+ pageInfo: {
+ endCursor: 'endCursor',
+ startCursor: 'startCursor',
+ },
+ },
});
+ jest.spyOn(wrapper.vm.$router, 'push');
+
+ findIssuableList().vm.$emit(event);
+ });
+
+ it('scrolls to the top', () => {
+ expect(scrollUp).toHaveBeenCalled();
+ });
- it('scrolls to the top', () => {
- expect(scrollUp).toHaveBeenCalled();
+ it(`updates url with "${paramName}" param`, () => {
+ expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ query: expect.objectContaining({ [paramName]: paramValue }),
});
- },
- );
+ });
+ });
describe('when "reorder" event is emitted by IssuableList', () => {
const issueOne = {
@@ -752,18 +756,17 @@ describe('CE IssuesListApp component', () => {
`(
'when moving issue $description',
({ issueToMove, oldIndex, newIndex, moveBeforeId, moveAfterId }) => {
- beforeEach(async () => {
+ beforeEach(() => {
wrapper = mountComponent({
provide: { isProject },
issuesQueryResponse: jest.fn().mockResolvedValue(response(isProject)),
});
jest.runOnlyPendingTimers();
- await waitForPromises();
+ return waitForPromises();
});
it('makes API call to reorder the issue', async () => {
findIssuableList().vm.$emit('reorder', { oldIndex, newIndex });
-
await waitForPromises();
expect(axiosMock.history.put[0]).toMatchObject({
@@ -780,19 +783,18 @@ describe('CE IssuesListApp component', () => {
});
describe('when unsuccessful', () => {
- beforeEach(async () => {
+ beforeEach(() => {
wrapper = mountComponent({
issuesQueryResponse: jest.fn().mockResolvedValue(response()),
});
jest.runOnlyPendingTimers();
- await waitForPromises();
+ return waitForPromises();
});
it('displays an error message', async () => {
axiosMock.onPut(joinPaths(issueOne.webPath, 'reorder')).reply(500);
findIssuableList().vm.$emit('reorder', { oldIndex: 0, newIndex: 1 });
-
await waitForPromises();
expect(findIssuableList().props('error')).toBe(IssuesListApp.i18n.reorderError);
@@ -808,14 +810,14 @@ describe('CE IssuesListApp component', () => {
'updates to the new sort when payload is `%s`',
async (sortKey) => {
wrapper = mountComponent();
+ jest.spyOn(wrapper.vm.$router, 'push');
findIssuableList().vm.$emit('sort', sortKey);
-
jest.runOnlyPendingTimers();
await nextTick();
- expect(findIssuableList().props('urlParams')).toMatchObject({
- sort: urlSortParams[sortKey],
+ expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ query: expect.objectContaining({ sort: urlSortParams[sortKey] }),
});
},
);
@@ -827,14 +829,13 @@ describe('CE IssuesListApp component', () => {
wrapper = mountComponent({
provide: { initialSort, isIssueRepositioningDisabled: true },
});
+ jest.spyOn(wrapper.vm.$router, 'push');
findIssuableList().vm.$emit('sort', RELATIVE_POSITION_ASC);
});
it('does not update the sort to manual', () => {
- expect(findIssuableList().props('urlParams')).toMatchObject({
- sort: urlSortParams[initialSort],
- });
+ expect(wrapper.vm.$router.push).not.toHaveBeenCalled();
});
it('shows an alert to tell the user that manual reordering is disabled', () => {
@@ -899,11 +900,14 @@ 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');
findIssuableList().vm.$emit('filter', filteredTokens);
await nextTick();
- expect(findIssuableList().props('urlParams')).toMatchObject(urlParams);
+ expect(wrapper.vm.$router.push).toHaveBeenCalledWith({
+ query: expect.objectContaining(urlParams),
+ });
});
describe('when anonymous searching is performed', () => {
@@ -911,19 +915,13 @@ describe('CE IssuesListApp component', () => {
wrapper = mountComponent({
provide: { isAnonymousSearchDisabled: true, isSignedIn: false },
});
+ jest.spyOn(wrapper.vm.$router, 'push');
findIssuableList().vm.$emit('filter', filteredTokens);
});
- it('does not update IssuableList with url params ', async () => {
- const defaultParams = {
- page_after: null,
- page_before: null,
- sort: 'created_date',
- state: 'opened',
- };
-
- expect(findIssuableList().props('urlParams')).toEqual(defaultParams);
+ it('does not update url params', () => {
+ expect(wrapper.vm.$router.push).not.toHaveBeenCalled();
});
it('shows an alert to tell the user they must be signed in to search', () => {
@@ -935,4 +933,23 @@ describe('CE IssuesListApp component', () => {
});
});
});
+
+ describe('public visibility', () => {
+ it.each`
+ description | isPublicVisibilityRestricted | isSignedIn | hideUsers
+ ${'shows users when public visibility is not restricted and is not signed in'} | ${false} | ${false} | ${false}
+ ${'shows users when public visibility is not restricted and is signed in'} | ${false} | ${true} | ${false}
+ ${'hides users when public visibility is restricted and is not signed in'} | ${true} | ${false} | ${true}
+ ${'shows users when public visibility is restricted and is signed in'} | ${true} | ${true} | ${false}
+ `('$description', ({ isPublicVisibilityRestricted, isSignedIn, hideUsers }) => {
+ const mockQuery = jest.fn().mockResolvedValue(defaultQueryResponse);
+ wrapper = mountComponent({
+ provide: { isPublicVisibilityRestricted, isSignedIn },
+ issuesQueryResponse: mockQuery,
+ });
+ jest.runOnlyPendingTimers();
+
+ expect(mockQuery).toHaveBeenCalledWith(expect.objectContaining({ hideUsers }));
+ });
+ });
});
diff --git a/spec/frontend/issues/list/mock_data.js b/spec/frontend/issues/list/mock_data.js
index b1a135ceb18..42f2d08082e 100644
--- a/spec/frontend/issues/list/mock_data.js
+++ b/spec/frontend/issues/list/mock_data.js
@@ -117,6 +117,7 @@ export const locationSearch = [
'not[author_username]=marge',
'assignee_username[]=bart',
'assignee_username[]=lisa',
+ 'assignee_username[]=5',
'not[assignee_username][]=patty',
'not[assignee_username][]=selma',
'milestone_title=season+3',
@@ -146,6 +147,8 @@ export const locationSearch = [
'not[epic_id]=34',
'weight=1',
'not[weight]=3',
+ 'crm_contact_id=123',
+ 'crm_organization_id=456',
].join('&');
export const locationSearchWithSpecialValues = [
@@ -165,6 +168,7 @@ export const filteredTokens = [
{ type: 'author_username', value: { data: 'marge', operator: OPERATOR_IS_NOT } },
{ type: 'assignee_username', value: { data: 'bart', operator: OPERATOR_IS } },
{ type: 'assignee_username', value: { data: 'lisa', operator: OPERATOR_IS } },
+ { type: 'assignee_username', value: { data: '5', operator: OPERATOR_IS } },
{ type: 'assignee_username', value: { data: 'patty', operator: OPERATOR_IS_NOT } },
{ type: 'assignee_username', value: { data: 'selma', operator: OPERATOR_IS_NOT } },
{ type: 'milestone', value: { data: 'season 3', operator: OPERATOR_IS } },
@@ -194,6 +198,8 @@ export const filteredTokens = [
{ type: 'epic_id', value: { data: '34', operator: OPERATOR_IS_NOT } },
{ type: 'weight', value: { data: '1', operator: OPERATOR_IS } },
{ type: 'weight', value: { data: '3', operator: OPERATOR_IS_NOT } },
+ { type: 'crm_contact', value: { data: '123', operator: OPERATOR_IS } },
+ { type: 'crm_organization', value: { data: '456', operator: OPERATOR_IS } },
{ type: 'filtered-search-term', value: { data: 'find' } },
{ type: 'filtered-search-term', value: { data: 'issues' } },
];
@@ -212,7 +218,7 @@ export const filteredTokensWithSpecialValues = [
export const apiParams = {
authorUsername: 'homer',
- assigneeUsernames: ['bart', 'lisa'],
+ assigneeUsernames: ['bart', 'lisa', '5'],
milestoneTitle: ['season 3', 'season 4'],
labelName: ['cartoon', 'tv'],
releaseTag: ['v3', 'v4'],
@@ -222,6 +228,8 @@ export const apiParams = {
iterationId: ['4', '12'],
epicId: '12',
weight: '1',
+ crmContactId: '123',
+ crmOrganizationId: '456',
not: {
authorUsername: 'marge',
assigneeUsernames: ['patty', 'selma'],
@@ -251,7 +259,7 @@ export const apiParamsWithSpecialValues = {
export const urlParams = {
author_username: 'homer',
'not[author_username]': 'marge',
- 'assignee_username[]': ['bart', 'lisa'],
+ 'assignee_username[]': ['bart', 'lisa', '5'],
'not[assignee_username][]': ['patty', 'selma'],
milestone_title: ['season 3', 'season 4'],
'not[milestone_title]': ['season 20', 'season 30'],
@@ -270,6 +278,8 @@ export const urlParams = {
'not[epic_id]': '34',
weight: '1',
'not[weight]': '3',
+ crm_contact_id: '123',
+ crm_organization_id: '456',
};
export const urlParamsWithSpecialValues = {
diff --git a/spec/frontend/issues/list/utils_spec.js b/spec/frontend/issues/list/utils_spec.js
index a60350d91c5..ce0477883d7 100644
--- a/spec/frontend/issues/list/utils_spec.js
+++ b/spec/frontend/issues/list/utils_spec.js
@@ -1,3 +1,5 @@
+import setWindowLocation from 'helpers/set_window_location_helper';
+import { TEST_HOST } from 'helpers/test_constants';
import {
apiParams,
apiParamsWithSpecialValues,
@@ -24,6 +26,7 @@ import {
getSortOptions,
isSortKey,
} from '~/issues/list/utils';
+import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
describe('getInitialPageParams', () => {
it.each(Object.keys(urlSortParams))(
@@ -124,24 +127,50 @@ describe('getFilterTokens', () => {
filteredTokensWithSpecialValues,
);
});
+
+ it.each`
+ description | argument
+ ${'an undefined value'} | ${undefined}
+ ${'an irrelevant value'} | ${'?unrecognised=parameter'}
+ `('returns an empty filtered search term given $description', ({ argument }) => {
+ expect(getFilterTokens(argument)).toEqual([
+ {
+ id: expect.any(String),
+ type: FILTERED_SEARCH_TERM,
+ value: { data: '' },
+ },
+ ]);
+ });
});
describe('convertToApiParams', () => {
+ beforeEach(() => {
+ setWindowLocation(TEST_HOST);
+ });
+
it('returns api params given filtered tokens', () => {
expect(convertToApiParams(filteredTokens)).toEqual(apiParams);
});
it('returns api params given filtered tokens with special values', () => {
+ setWindowLocation('?assignee_id=123');
+
expect(convertToApiParams(filteredTokensWithSpecialValues)).toEqual(apiParamsWithSpecialValues);
});
});
describe('convertToUrlParams', () => {
+ beforeEach(() => {
+ setWindowLocation(TEST_HOST);
+ });
+
it('returns url params given filtered tokens', () => {
expect(convertToUrlParams(filteredTokens)).toEqual(urlParams);
});
it('returns url params given filtered tokens with special values', () => {
+ setWindowLocation('?assignee_id=123');
+
expect(convertToUrlParams(filteredTokensWithSpecialValues)).toEqual(urlParamsWithSpecialValues);
});
});
diff --git a/spec/frontend/issues/show/components/app_spec.js b/spec/frontend/issues/show/components/app_spec.js
index 5ab64d8e9ca..27604b8ccf3 100644
--- a/spec/frontend/issues/show/components/app_spec.js
+++ b/spec/frontend/issues/show/components/app_spec.js
@@ -1,10 +1,12 @@
-import { GlIntersectionObserver } from '@gitlab/ui';
+import { GlIcon, GlIntersectionObserver } from '@gitlab/ui';
import MockAdapter from 'axios-mock-adapter';
import { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import waitForPromises from 'helpers/wait_for_promises';
import '~/behaviors/markdown/render_gfm';
-import { IssuableStatus, IssuableStatusText } from '~/issues/constants';
+import { IssuableStatus, IssuableStatusText, IssuableType } from '~/issues/constants';
import IssuableApp from '~/issues/show/components/app.vue';
import DescriptionComponent from '~/issues/show/components/description.vue';
import EditedComponent from '~/issues/show/components/edited.vue';
@@ -70,7 +72,7 @@ describe('Issuable output', () => {
};
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div>
<title>Title</title>
<div class="detail-page-description content-block">
@@ -105,6 +107,7 @@ describe('Issuable output', () => {
realtimeRequestCount = 0;
wrapper.vm.poll.stop();
wrapper.destroy();
+ resetHTMLFixture();
});
it('should render a title/description/edited and update title/description/edited on update', () => {
@@ -465,6 +468,31 @@ describe('Issuable output', () => {
expect(findStickyHeader().text()).toContain('Sticky header title');
});
+ it('shows with title for an epic', async () => {
+ wrapper.setProps({ issuableType: 'epic' });
+
+ await nextTick();
+
+ expect(findStickyHeader().text()).toContain('Sticky header title');
+ });
+
+ it.each`
+ issuableType | issuableStatus | statusIcon
+ ${IssuableType.Issue} | ${IssuableStatus.Open} | ${'issues'}
+ ${IssuableType.Issue} | ${IssuableStatus.Closed} | ${'issue-closed'}
+ ${IssuableType.Epic} | ${IssuableStatus.Open} | ${'epic'}
+ ${IssuableType.Epic} | ${IssuableStatus.Closed} | ${'epic-closed'}
+ `(
+ 'shows with state icon "$statusIcon" for $issuableType when status is $issuableStatus',
+ async ({ issuableType, issuableStatus, statusIcon }) => {
+ wrapper.setProps({ issuableType, issuableStatus });
+
+ await nextTick();
+
+ expect(findStickyHeader().findComponent(GlIcon).props('name')).toBe(statusIcon);
+ },
+ );
+
it.each`
title | state
${'shows with Open when status is opened'} | ${IssuableStatus.Open}
@@ -487,7 +515,14 @@ describe('Issuable output', () => {
await nextTick();
- expect(findConfidentialBadge().exists()).toBe(isConfidential);
+ const confidentialEl = findConfidentialBadge();
+ expect(confidentialEl.exists()).toBe(isConfidential);
+ if (isConfidential) {
+ expect(confidentialEl.props()).toMatchObject({
+ workspaceType: 'project',
+ issuableType: 'issue',
+ });
+ }
});
it.each`
@@ -613,4 +648,14 @@ describe('Issuable output', () => {
expect(wrapper.vm.updateStoreState).toHaveBeenCalled();
});
});
+
+ describe('listItemReorder event', () => {
+ it('makes request to update issue', async () => {
+ const description = 'I have been updated!';
+ findDescription().vm.$emit('listItemReorder', description);
+ await waitForPromises();
+
+ expect(mock.history.put[0].data).toContain(description);
+ });
+ });
});
diff --git a/spec/frontend/issues/show/components/description_spec.js b/spec/frontend/issues/show/components/description_spec.js
index 0b3daadae1d..1ae04531a6b 100644
--- a/spec/frontend/issues/show/components/description_spec.js
+++ b/spec/frontend/issues/show/components/description_spec.js
@@ -1,14 +1,20 @@
import $ from 'jquery';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
import '~/behaviors/markdown/render_gfm';
import { GlTooltip, GlModal } from '@gitlab/ui';
+
import setWindowLocation from 'helpers/set_window_location_helper';
import { stubComponent } from 'helpers/stub_component';
import { TEST_HOST } from 'helpers/test_constants';
import { mockTracking } from 'helpers/tracking_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
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 TaskList from '~/task_list';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import CreateWorkItem from '~/work_items/pages/create_work_item.vue';
@@ -27,17 +33,29 @@ jest.mock('~/task_list');
const showModal = jest.fn();
const hideModal = jest.fn();
+const showDetailsModal = jest.fn();
const $toast = {
show: jest.fn(),
};
+const workItemQueryResponse = {
+ data: {
+ workItem: null,
+ },
+};
+
+const queryHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
+
describe('Description component', () => {
let wrapper;
+ Vue.use(VueApollo);
+
const findGfmContent = () => wrapper.find('[data-testid="gfm-content"]');
const findTextarea = () => wrapper.find('[data-testid="textarea"]');
const findTaskActionButtons = () => wrapper.findAll('.js-add-task');
const findConvertToTaskButton = () => wrapper.find('.js-add-task');
+ const findTaskLink = () => wrapper.find('a.gfm-issue');
const findTooltips = () => wrapper.findAllComponents(GlTooltip);
const findModal = () => wrapper.findComponent(GlModal);
@@ -52,6 +70,7 @@ describe('Description component', () => {
...props,
},
provide,
+ apolloProvider: createMockApollo([[workItemQuery, queryHandler]]),
mocks: {
$toast,
},
@@ -62,6 +81,11 @@ describe('Description component', () => {
hide: hideModal,
},
}),
+ WorkItemDetailModal: stubComponent(WorkItemDetailModal, {
+ methods: {
+ show: showDetailsModal,
+ },
+ }),
},
});
}
@@ -296,15 +320,15 @@ describe('Description component', () => {
});
it('shows toast after delete success', async () => {
- findWorkItemDetailModal().vm.$emit('workItemDeleted');
+ const newDesc = 'description';
+ findWorkItemDetailModal().vm.$emit('workItemDeleted', newDesc);
+ expect(wrapper.emitted('updateDescription')).toEqual([[newDesc]]);
expect($toast.show).toHaveBeenCalledWith('Work item deleted');
});
});
describe('work items detail', () => {
- const findTaskLink = () => wrapper.find('a.gfm-issue');
-
describe('when opening and closing', () => {
beforeEach(() => {
createComponent({
@@ -319,11 +343,9 @@ describe('Description component', () => {
});
it('opens when task button is clicked', async () => {
- expect(findWorkItemDetailModal().props('visible')).toBe(false);
-
await findTaskLink().trigger('click');
- expect(findWorkItemDetailModal().props('visible')).toBe(true);
+ expect(showDetailsModal).toHaveBeenCalled();
expect(updateHistory).toHaveBeenCalledWith({
url: `${TEST_HOST}/?work_item_id=2`,
replace: true,
@@ -333,12 +355,9 @@ describe('Description component', () => {
it('closes from an open state', async () => {
await findTaskLink().trigger('click');
- expect(findWorkItemDetailModal().props('visible')).toBe(true);
-
findWorkItemDetailModal().vm.$emit('close');
await nextTick();
- expect(findWorkItemDetailModal().props('visible')).toBe(false);
expect(updateHistory).toHaveBeenLastCalledWith({
url: `${TEST_HOST}/`,
replace: true,
@@ -364,16 +383,17 @@ describe('Description component', () => {
describe('when url query `work_item_id` exists', () => {
it.each`
- behavior | workItemId | visible
- ${'opens'} | ${'123'} | ${true}
- ${'does not open'} | ${'123e'} | ${false}
- ${'does not open'} | ${'12e3'} | ${false}
- ${'does not open'} | ${'1e23'} | ${false}
- ${'does not open'} | ${'x'} | ${false}
- ${'does not open'} | ${'undefined'} | ${false}
+ behavior | workItemId | modalOpened
+ ${'opens'} | ${'2'} | ${1}
+ ${'does not open'} | ${'123'} | ${0}
+ ${'does not open'} | ${'123e'} | ${0}
+ ${'does not open'} | ${'12e3'} | ${0}
+ ${'does not open'} | ${'1e23'} | ${0}
+ ${'does not open'} | ${'x'} | ${0}
+ ${'does not open'} | ${'undefined'} | ${0}
`(
'$behavior when url contains `work_item_id=$workItemId`',
- async ({ workItemId, visible }) => {
+ async ({ workItemId, modalOpened }) => {
setWindowLocation(`?work_item_id=${workItemId}`);
createComponent({
@@ -381,10 +401,43 @@ describe('Description component', () => {
provide: { glFeatures: { workItems: true } },
});
- expect(findWorkItemDetailModal().props('visible')).toBe(visible);
+ expect(showDetailsModal).toHaveBeenCalledTimes(modalOpened);
},
);
});
});
+
+ describe('when hovering task links', () => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ descriptionHtml: descriptionHtmlWithTask,
+ },
+ provide: {
+ glFeatures: { workItems: true },
+ },
+ });
+ return nextTick();
+ });
+
+ it('prefetches work item detail after work item link is hovered for 150ms', async () => {
+ await findTaskLink().trigger('mouseover');
+ jest.advanceTimersByTime(150);
+ await waitForPromises();
+
+ expect(queryHandler).toHaveBeenCalledWith({
+ id: 'gid://gitlab/WorkItem/2',
+ });
+ });
+
+ it('does not work item detail after work item link is hovered for less than 150ms', async () => {
+ await findTaskLink().trigger('mouseover');
+ await findTaskLink().trigger('mouseout');
+ jest.advanceTimersByTime(150);
+ await waitForPromises();
+
+ expect(queryHandler).not.toHaveBeenCalled();
+ });
+ });
});
});
diff --git a/spec/frontend/issues/show/components/fields/description_spec.js b/spec/frontend/issues/show/components/fields/description_spec.js
index 0dcd70ac19b..d0e33f0b980 100644
--- a/spec/frontend/issues/show/components/fields/description_spec.js
+++ b/spec/frontend/issues/show/components/fields/description_spec.js
@@ -24,7 +24,6 @@ describe('Description field component', () => {
beforeEach(() => {
jest.spyOn(eventHub, '$emit');
- gon.features = { markdownContinueLists: true };
});
afterEach(() => {
diff --git a/spec/frontend/issues/show/components/title_spec.js b/spec/frontend/issues/show/components/title_spec.js
index 29b5353ef1c..7560b733ae6 100644
--- a/spec/frontend/issues/show/components/title_spec.js
+++ b/spec/frontend/issues/show/components/title_spec.js
@@ -1,4 +1,5 @@
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import titleComponent from '~/issues/show/components/title.vue';
import eventHub from '~/issues/show/event_hub';
import Store from '~/issues/show/stores';
@@ -6,7 +7,7 @@ import Store from '~/issues/show/stores';
describe('Title component', () => {
let vm;
beforeEach(() => {
- setFixtures(`<title />`);
+ setHTMLFixture(`<title />`);
const Component = Vue.extend(titleComponent);
const store = new Store({
@@ -25,6 +26,10 @@ describe('Title component', () => {
}).$mount();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('renders title HTML', () => {
expect(vm.$el.querySelector('.title').innerHTML.trim()).toBe('Testing <img>');
});
diff --git a/spec/frontend/issues/show/mock_data/mock_data.js b/spec/frontend/issues/show/mock_data/mock_data.js
index 7b0b8ca686a..909789b7a0f 100644
--- a/spec/frontend/issues/show/mock_data/mock_data.js
+++ b/spec/frontend/issues/show/mock_data/mock_data.js
@@ -77,7 +77,22 @@ export const descriptionHtmlWithTask = `
<ul data-sourcepos="1:1-3:7" class="task-list" dir="auto">
<li data-sourcepos="1:1-1:10" class="task-list-item">
<input type="checkbox" class="task-list-item-checkbox" disabled>
- <a href="/gitlab-org/gitlab-test/-/issues/48" data-original="#48+" data-link="false" data-link-reference="false" data-project="1" data-issue="2" data-reference-format="+" data-reference-type="task" data-container="body" data-placement="top" title="1" class="gfm gfm-issue has-tooltip">1 (#48)</a>
+ <a href="/gitlab-org/gitlab-test/-/issues/48" data-original="#48+" data-link="false" data-link-reference="false" data-project="1" data-issue="2" data-reference-format="+" data-reference-type="task" data-container="body" data-placement="top" title="1" class="gfm gfm-issue has-tooltip" data-issue-type="task">1 (#48)</a>
+ </li>
+ <li data-sourcepos="2:1-2:7" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled> 2
+ </li>
+ <li data-sourcepos="3:1-3:7" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled> 3
+ </li>
+ </ul>
+`;
+
+export const descriptionHtmlWithIssue = `
+ <ul data-sourcepos="1:1-3:7" class="task-list" dir="auto">
+ <li data-sourcepos="1:1-1:10" class="task-list-item">
+ <input type="checkbox" class="task-list-item-checkbox" disabled>
+ <a href="/gitlab-org/gitlab-test/-/issues/48" data-original="#48+" data-link="false" data-link-reference="false" data-project="1" data-issue="2" data-reference-format="+" data-reference-type="task" data-container="body" data-placement="top" title="1" class="gfm gfm-issue has-tooltip" data-issue-type="issue">1 (#48)</a>
</li>
<li data-sourcepos="2:1-2:7" class="task-list-item">
<input type="checkbox" class="task-list-item-checkbox" disabled> 2
diff --git a/spec/frontend/issues/show/utils_spec.js b/spec/frontend/issues/show/utils_spec.js
new file mode 100644
index 00000000000..e5f14cfc01a
--- /dev/null
+++ b/spec/frontend/issues/show/utils_spec.js
@@ -0,0 +1,40 @@
+import { convertDescriptionWithNewSort } from '~/issues/show/utils';
+
+describe('app/assets/javascripts/issues/show/utils.js', () => {
+ describe('convertDescriptionWithNewSort', () => {
+ it('converts markdown description with new list sort order', () => {
+ const description = `I am text
+
+- Item 1
+- Item 2
+ - Item 3
+ - Item 4
+- Item 5`;
+
+ // Drag Item 2 + children to Item 1's position
+ const html = `<ul data-sourcepos="3:1-8:0">
+ <li data-sourcepos="4:1-4:8">
+ Item 2
+ <ul data-sourcepos="5:1-6:10">
+ <li data-sourcepos="5:1-5:10">Item 3</li>
+ <li data-sourcepos="6:1-6:10">Item 4</li>
+ </ul>
+ </li>
+ <li data-sourcepos="3:1-3:8">Item 1</li>
+ <li data-sourcepos="7:1-8:0">Item 5</li>
+ <ul>`;
+ const list = document.createElement('div');
+ list.innerHTML = html;
+
+ const expected = `I am text
+
+- Item 2
+ - Item 3
+ - Item 4
+- Item 1
+- Item 5`;
+
+ expect(convertDescriptionWithNewSort(description, list.firstChild)).toBe(expected);
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js b/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
index 3d7bf7acb41..5df54abfc05 100644
--- a/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item_spec.js
@@ -7,21 +7,35 @@ import * as JiraConnectApi from '~/jira_connect/subscriptions/api';
import GroupItemName from '~/jira_connect/subscriptions/components/group_item_name.vue';
import GroupsListItem from '~/jira_connect/subscriptions/components/add_namespace_modal/groups_list_item.vue';
import { persistAlert, reloadPage } from '~/jira_connect/subscriptions/utils';
+import {
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ INTEGRATIONS_DOC_LINK,
+} from '~/jira_connect/subscriptions/constants';
+import createStore from '~/jira_connect/subscriptions/store';
import { mockGroup1 } from '../../mock_data';
jest.mock('~/jira_connect/subscriptions/utils');
describe('GroupsListItem', () => {
let wrapper;
- const mockSubscriptionPath = 'subscriptionPath';
+ let store;
+
+ const mockAddSubscriptionsPath = '/addSubscriptionsPath';
+
+ const createComponent = ({ mountFn = shallowMount, provide } = {}) => {
+ store = createStore();
+
+ jest.spyOn(store, 'dispatch').mockImplementation();
- const createComponent = ({ mountFn = shallowMount } = {}) => {
wrapper = mountFn(GroupsListItem, {
+ store,
propsData: {
group: mockGroup1,
},
provide: {
- subscriptionsPath: mockSubscriptionPath,
+ addSubscriptionsPath: mockAddSubscriptionsPath,
+ ...provide,
},
});
};
@@ -51,62 +65,88 @@ describe('GroupsListItem', () => {
});
describe('on Link button click', () => {
- let addSubscriptionSpy;
+ describe('when jiraConnectOauth feature flag is disabled', () => {
+ let addSubscriptionSpy;
- beforeEach(() => {
- createComponent({ mountFn: mount });
+ beforeEach(() => {
+ createComponent({ mountFn: mount });
- addSubscriptionSpy = jest.spyOn(JiraConnectApi, 'addSubscription').mockResolvedValue();
- });
+ addSubscriptionSpy = jest.spyOn(JiraConnectApi, 'addSubscription').mockResolvedValue();
+ });
- it('sets button to loading and sends request', async () => {
- expect(findLinkButton().props('loading')).toBe(false);
+ it('sets button to loading and sends request', async () => {
+ expect(findLinkButton().props('loading')).toBe(false);
+
+ clickLinkButton();
+ await nextTick();
- clickLinkButton();
+ expect(findLinkButton().props('loading')).toBe(true);
+ await waitForPromises();
- await nextTick();
+ expect(addSubscriptionSpy).toHaveBeenCalledWith(
+ mockAddSubscriptionsPath,
+ mockGroup1.full_path,
+ );
+ expect(persistAlert).toHaveBeenCalledWith({
+ linkUrl: INTEGRATIONS_DOC_LINK,
+ message: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ title: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ variant: 'success',
+ });
+ });
- expect(findLinkButton().props('loading')).toBe(true);
+ describe('when request is successful', () => {
+ it('reloads the page', async () => {
+ clickLinkButton();
- await waitForPromises();
+ await waitForPromises();
- expect(addSubscriptionSpy).toHaveBeenCalledWith(mockSubscriptionPath, mockGroup1.full_path);
- expect(persistAlert).toHaveBeenCalledWith({
- linkUrl: '/help/integration/jira_development_panel.html#use-the-integration',
- message:
- 'You should now see GitLab.com activity inside your Jira Cloud issues. %{linkStart}Learn more%{linkEnd}',
- title: 'Namespace successfully linked',
- variant: 'success',
+ expect(reloadPage).toHaveBeenCalled();
+ });
});
- });
- describe('when request is successful', () => {
- it('reloads the page', async () => {
- clickLinkButton();
+ describe('when request has errors', () => {
+ const mockErrorMessage = 'error message';
+ const mockError = { response: { data: { error: mockErrorMessage } } };
- await waitForPromises();
+ beforeEach(() => {
+ addSubscriptionSpy = jest
+ .spyOn(JiraConnectApi, 'addSubscription')
+ .mockRejectedValue(mockError);
+ });
- expect(reloadPage).toHaveBeenCalled();
+ it('emits `error` event', async () => {
+ clickLinkButton();
+
+ await waitForPromises();
+
+ expect(reloadPage).not.toHaveBeenCalled();
+ expect(wrapper.emitted('error')[0][0]).toBe(mockErrorMessage);
+ });
});
});
- describe('when request has errors', () => {
- const mockErrorMessage = 'error message';
- const mockError = { response: { data: { error: mockErrorMessage } } };
+ describe('when jiraConnectOauth feature flag is enabled', () => {
+ const mockSubscriptionsPath = '/subscriptions';
beforeEach(() => {
- addSubscriptionSpy = jest
- .spyOn(JiraConnectApi, 'addSubscription')
- .mockRejectedValue(mockError);
+ createComponent({
+ mountFn: mount,
+ provide: {
+ subscriptionsPath: mockSubscriptionsPath,
+ glFeatures: { jiraConnectOauth: true },
+ },
+ });
});
- it('emits `error` event', async () => {
+ it('dispatches `addSubscription` action', async () => {
clickLinkButton();
+ await nextTick();
- await waitForPromises();
-
- expect(reloadPage).not.toHaveBeenCalled();
- expect(wrapper.emitted('error')[0][0]).toBe(mockErrorMessage);
+ expect(store.dispatch).toHaveBeenCalledWith('addSubscription', {
+ namespacePath: mockGroup1.full_path,
+ subscriptionsPath: mockSubscriptionsPath,
+ });
});
});
});
diff --git a/spec/frontend/jira_connect/subscriptions/components/app_spec.js b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
index ce02144f22f..9894141be5a 100644
--- a/spec/frontend/jira_connect/subscriptions/components/app_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/app_spec.js
@@ -3,8 +3,8 @@ import { nextTick } from 'vue';
import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper';
import JiraConnectApp from '~/jira_connect/subscriptions/components/app.vue';
-import SignInPage from '~/jira_connect/subscriptions/pages/sign_in.vue';
-import SubscriptionsPage from '~/jira_connect/subscriptions/pages/subscriptions.vue';
+import SignInPage from '~/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue';
+import SubscriptionsPage from '~/jira_connect/subscriptions/pages/subscriptions_page.vue';
import UserLink from '~/jira_connect/subscriptions/components/user_link.vue';
import BrowserSupportAlert from '~/jira_connect/subscriptions/components/browser_support_alert.vue';
import createStore from '~/jira_connect/subscriptions/store';
@@ -12,6 +12,7 @@ import { SET_ALERT } from '~/jira_connect/subscriptions/store/mutation_types';
import { I18N_DEFAULT_SIGN_IN_ERROR_MESSAGE } from '~/jira_connect/subscriptions/constants';
import { __ } from '~/locale';
import AccessorUtilities from '~/lib/utils/accessor';
+import * as api from '~/jira_connect/subscriptions/api';
import { mockSubscription } from '../mock_data';
jest.mock('~/jira_connect/subscriptions/utils', () => ({
@@ -31,7 +32,8 @@ describe('JiraConnectApp', () => {
const findBrowserSupportAlert = () => wrapper.findComponent(BrowserSupportAlert);
const createComponent = ({ provide, mountFn = shallowMountExtended } = {}) => {
- store = createStore();
+ store = createStore({ subscriptions: [mockSubscription] });
+ jest.spyOn(store, 'dispatch').mockImplementation();
wrapper = mountFn(JiraConnectApp, {
store,
@@ -53,7 +55,6 @@ describe('JiraConnectApp', () => {
createComponent({
provide: {
usersPath,
- subscriptions: [mockSubscription],
},
});
});
@@ -79,14 +80,13 @@ describe('JiraConnectApp', () => {
createComponent({
provide: {
usersPath: '/user',
- subscriptions: [],
},
});
const userLink = findUserLink();
expect(userLink.exists()).toBe(true);
expect(userLink.props()).toEqual({
- hasSubscriptions: false,
+ hasSubscriptions: true,
user: null,
userSignedIn: false,
});
@@ -161,39 +161,11 @@ describe('JiraConnectApp', () => {
});
describe('when user signed out', () => {
- describe('when sign in page emits `sign-in-oauth` event', () => {
- const mockUser = { name: 'test' };
- beforeEach(async () => {
- createComponent({
- provide: {
- usersPath: '/mock',
- subscriptions: [],
- },
- });
- findSignInPage().vm.$emit('sign-in-oauth', mockUser);
-
- await nextTick();
- });
-
- it('hides sign in page and renders subscriptions page', () => {
- expect(findSignInPage().exists()).toBe(false);
- expect(findSubscriptionsPage().exists()).toBe(true);
- });
-
- it('sets correct UserLink props', () => {
- expect(findUserLink().props()).toMatchObject({
- user: mockUser,
- userSignedIn: true,
- });
- });
- });
-
describe('when sign in page emits `error` event', () => {
beforeEach(async () => {
createComponent({
provide: {
usersPath: '/mock',
- subscriptions: [],
},
});
findSignInPage().vm.$emit('error');
@@ -235,4 +207,31 @@ describe('JiraConnectApp', () => {
});
},
);
+
+ describe('when `jiraConnectOauth` feature flag is enabled', () => {
+ const mockSubscriptionsPath = '/mockSubscriptionsPath';
+
+ beforeEach(() => {
+ jest.spyOn(api, 'fetchSubscriptions').mockResolvedValue({ data: { subscriptions: [] } });
+
+ createComponent({
+ provide: {
+ glFeatures: { jiraConnectOauth: true },
+ subscriptionsPath: mockSubscriptionsPath,
+ },
+ });
+ });
+
+ describe('when component mounts', () => {
+ it('dispatches `fetchSubscriptions` action', async () => {
+ expect(store.dispatch).toHaveBeenCalledWith('fetchSubscriptions', mockSubscriptionsPath);
+ });
+ });
+
+ describe('when oauth button emits `sign-in-oauth` event', () => {
+ it('dispatches `fetchSubscriptions` action', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('fetchSubscriptions', mockSubscriptionsPath);
+ });
+ });
+ });
});
diff --git a/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js b/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
index 18274cd4362..8730e124ae7 100644
--- a/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/sign_in_oauth_button_spec.js
@@ -11,9 +11,14 @@ import axios from '~/lib/utils/axios_utils';
import waitForPromises from 'helpers/wait_for_promises';
import httpStatus from '~/lib/utils/http_status';
import AccessorUtilities from '~/lib/utils/accessor';
+import { getCurrentUser } from '~/rest_api';
+import createStore from '~/jira_connect/subscriptions/store';
+import { SET_ACCESS_TOKEN } from '~/jira_connect/subscriptions/store/mutation_types';
jest.mock('~/lib/utils/accessor');
jest.mock('~/jira_connect/subscriptions/utils');
+jest.mock('~/jira_connect/subscriptions/api');
+jest.mock('~/rest_api');
jest.mock('~/jira_connect/subscriptions/pkce', () => ({
createCodeVerifier: jest.fn().mockReturnValue('mock-verifier'),
createCodeChallenge: jest.fn().mockResolvedValue('mock-challenge'),
@@ -28,9 +33,15 @@ const mockOauthMetadata = {
describe('SignInOauthButton', () => {
let wrapper;
let mockAxios;
+ let store;
const createComponent = ({ slots } = {}) => {
+ store = createStore();
+ jest.spyOn(store, 'dispatch').mockImplementation();
+ jest.spyOn(store, 'commit').mockImplementation();
+
wrapper = shallowMount(SignInOauthButton, {
+ store,
slots,
provide: {
oauthMetadata: mockOauthMetadata,
@@ -114,10 +125,6 @@ describe('SignInOauthButton', () => {
await waitForPromises();
});
- it('emits `error` event', () => {
- expect(wrapper.emitted('error')).toBeTruthy();
- });
-
it('does not emit `sign-in` event', () => {
expect(wrapper.emitted('sign-in')).toBeFalsy();
});
@@ -147,7 +154,7 @@ describe('SignInOauthButton', () => {
mockAxios
.onPost(mockOauthMetadata.oauth_token_url)
.replyOnce(httpStatus.OK, { access_token: mockAccessToken });
- mockAxios.onGet('/api/v4/user').replyOnce(httpStatus.OK, mockUser);
+ getCurrentUser.mockResolvedValue({ data: mockUser });
window.dispatchEvent(new MessageEvent('message', mockEvent));
@@ -161,25 +168,25 @@ describe('SignInOauthButton', () => {
});
});
- it('executes GET request to fetch user data', () => {
- expect(axios.get).toHaveBeenCalledWith('/api/v4/user', {
- headers: { Authorization: `Bearer ${mockAccessToken}` },
- });
+ it('dispatches loadCurrentUser action', () => {
+ expect(store.dispatch).toHaveBeenCalledWith('loadCurrentUser', mockAccessToken);
+ });
+
+ it('commits SET_ACCESS_TOKEN mutation with correct access token', () => {
+ expect(store.commit).toHaveBeenCalledWith(SET_ACCESS_TOKEN, mockAccessToken);
});
it('emits `sign-in` event with user data', () => {
- expect(wrapper.emitted('sign-in')[0]).toEqual([mockUser]);
+ expect(wrapper.emitted('sign-in')[0]).toBeTruthy();
});
});
describe('when API requests fail', () => {
beforeEach(async () => {
jest.spyOn(axios, 'post');
- jest.spyOn(axios, 'get');
mockAxios
.onPost(mockOauthMetadata.oauth_token_url)
- .replyOnce(httpStatus.INTERNAL_SERVER_ERROR, { access_token: mockAccessToken });
- mockAxios.onGet('/api/v4/user').replyOnce(httpStatus.INTERNAL_SERVER_ERROR, mockUser);
+ .replyOnce(httpStatus.INTERNAL_SERVER_ERROR);
window.dispatchEvent(new MessageEvent('message', mockEvent));
@@ -187,7 +194,7 @@ describe('SignInOauthButton', () => {
});
it('emits `error` event', () => {
- expect(wrapper.emitted('error')).toBeTruthy();
+ expect(wrapper.emitted('error')[0]).toEqual([]);
});
it('does not emit `sign-in` event', () => {
diff --git a/spec/frontend/jira_connect/subscriptions/components/subscriptions_list_spec.js b/spec/frontend/jira_connect/subscriptions/components/subscriptions_list_spec.js
index 2aad533f677..2d7c58fc278 100644
--- a/spec/frontend/jira_connect/subscriptions/components/subscriptions_list_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/components/subscriptions_list_spec.js
@@ -20,12 +20,11 @@ describe('SubscriptionsList', () => {
let store;
const createComponent = () => {
- store = createStore();
+ store = createStore({
+ subscriptions: [mockSubscription],
+ });
wrapper = mount(SubscriptionsList, {
- provide: {
- subscriptions: [mockSubscription],
- },
store,
});
};
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com_spec.js
new file mode 100644
index 00000000000..1649920b48b
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com_spec.js
@@ -0,0 +1,121 @@
+import { shallowMount } from '@vue/test-utils';
+
+import SignInGitlabCom from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue';
+import SignInLegacyButton from '~/jira_connect/subscriptions/components/sign_in_legacy_button.vue';
+import SignInOauthButton from '~/jira_connect/subscriptions/components/sign_in_oauth_button.vue';
+import SubscriptionsList from '~/jira_connect/subscriptions/components/subscriptions_list.vue';
+import createStore from '~/jira_connect/subscriptions/store';
+import { I18N_DEFAULT_SIGN_IN_BUTTON_TEXT } from '~/jira_connect/subscriptions/constants';
+
+jest.mock('~/jira_connect/subscriptions/utils');
+
+const mockUsersPath = '/test';
+const defaultProvide = {
+ oauthMetadata: {},
+ usersPath: mockUsersPath,
+};
+
+describe('SignInGitlabCom', () => {
+ let wrapper;
+ let store;
+
+ const findSignInLegacyButton = () => wrapper.findComponent(SignInLegacyButton);
+ const findSignInOauthButton = () => wrapper.findComponent(SignInOauthButton);
+ const findSubscriptionsList = () => wrapper.findComponent(SubscriptionsList);
+
+ const createComponent = ({ props, jiraConnectOauthEnabled } = {}) => {
+ store = createStore();
+
+ wrapper = shallowMount(SignInGitlabCom, {
+ store,
+ provide: {
+ ...defaultProvide,
+ glFeatures: {
+ jiraConnectOauth: jiraConnectOauthEnabled,
+ },
+ },
+ propsData: props,
+ stubs: {
+ SignInLegacyButton,
+ SignInOauthButton,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ describe.each`
+ scenario | hasSubscriptions | signInButtonText
+ ${'with subscriptions'} | ${true} | ${SignInGitlabCom.i18n.signInButtonTextWithSubscriptions}
+ ${'without subscriptions'} | ${false} | ${I18N_DEFAULT_SIGN_IN_BUTTON_TEXT}
+ `('$scenario', ({ hasSubscriptions, signInButtonText }) => {
+ describe('when `jiraConnectOauthEnabled` feature flag is disabled', () => {
+ beforeEach(() => {
+ createComponent({
+ jiraConnectOauthEnabled: false,
+ props: {
+ hasSubscriptions,
+ },
+ });
+ });
+
+ it('renders legacy sign in button', () => {
+ const button = findSignInLegacyButton();
+ expect(button.props('usersPath')).toBe(mockUsersPath);
+ expect(button.text()).toMatchInterpolatedText(signInButtonText);
+ });
+ });
+
+ describe('when `jiraConnectOauthEnabled` feature flag is enabled', () => {
+ beforeEach(() => {
+ createComponent({
+ jiraConnectOauthEnabled: true,
+ props: {
+ hasSubscriptions,
+ },
+ });
+ });
+
+ describe('oauth sign in button', () => {
+ it('renders oauth sign in button', () => {
+ const button = findSignInOauthButton();
+ expect(button.text()).toMatchInterpolatedText(signInButtonText);
+ });
+
+ describe('when button emits `sign-in` event', () => {
+ it('emits `sign-in-oauth` event', () => {
+ const button = findSignInOauthButton();
+
+ const mockUser = { name: 'test' };
+ button.vm.$emit('sign-in', mockUser);
+
+ expect(wrapper.emitted('sign-in-oauth')[0]).toEqual([mockUser]);
+ });
+ });
+
+ describe('when button emits `error` event', () => {
+ it('emits `error` event', () => {
+ const button = findSignInOauthButton();
+ button.vm.$emit('error');
+
+ expect(wrapper.emitted('error')).toBeTruthy();
+ });
+ });
+ });
+ });
+
+ it(`${hasSubscriptions ? 'renders' : 'does not render'} subscriptions list`, () => {
+ createComponent({
+ props: {
+ hasSubscriptions,
+ },
+ });
+
+ expect(findSubscriptionsList().exists()).toBe(hasSubscriptions);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index_spec.js
new file mode 100644
index 00000000000..f4be8bf121d
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index_spec.js
@@ -0,0 +1,83 @@
+import { nextTick } from 'vue';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+
+import SignInGitlabMultiversion from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue';
+import VersionSelectForm from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue';
+import SignInOauthButton from '~/jira_connect/subscriptions/components/sign_in_oauth_button.vue';
+
+describe('SignInGitlabMultiversion', () => {
+ let wrapper;
+
+ const findVersionSelectForm = () => wrapper.findComponent(VersionSelectForm);
+ const findSignInOauthButton = () => wrapper.findComponent(SignInOauthButton);
+ const findSubtitle = () => wrapper.findByTestId('subtitle');
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(SignInGitlabMultiversion);
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('when version is not selected', () => {
+ describe('VersionSelectForm', () => {
+ it('renders version select form', () => {
+ createComponent();
+
+ expect(findVersionSelectForm().exists()).toBe(true);
+ });
+
+ describe('when form emits "submit" event', () => {
+ it('hides the version select form and shows the sign in button', async () => {
+ createComponent();
+
+ findVersionSelectForm().vm.$emit('submit', 'gitlab.mycompany.com');
+ await nextTick();
+
+ expect(findVersionSelectForm().exists()).toBe(false);
+ expect(findSignInOauthButton().exists()).toBe(true);
+ });
+ });
+ });
+ });
+
+ describe('when version is selected', () => {
+ beforeEach(async () => {
+ createComponent();
+
+ findVersionSelectForm().vm.$emit('submit', 'gitlab.mycompany.com');
+ await nextTick();
+ });
+
+ describe('sign in button', () => {
+ it('renders sign in button', () => {
+ expect(findSignInOauthButton().exists()).toBe(true);
+ });
+
+ describe('when button emits `sign-in` event', () => {
+ it('emits `sign-in-oauth` event', () => {
+ const button = findSignInOauthButton();
+
+ const mockUser = { name: 'test' };
+ button.vm.$emit('sign-in', mockUser);
+
+ expect(wrapper.emitted('sign-in-oauth')[0]).toEqual([mockUser]);
+ });
+ });
+
+ describe('when button emits `error` event', () => {
+ it('emits `error` event', () => {
+ const button = findSignInOauthButton();
+ button.vm.$emit('error');
+
+ expect(wrapper.emitted('error')).toBeTruthy();
+ });
+ });
+ });
+
+ it('renders correct subtitle', () => {
+ expect(findSubtitle().text()).toBe(SignInGitlabMultiversion.i18n.signInSubtitle);
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form_spec.js
new file mode 100644
index 00000000000..29e7fe7a5b2
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form_spec.js
@@ -0,0 +1,69 @@
+import { GlFormInput, GlFormRadioGroup, GlForm } from '@gitlab/ui';
+import { nextTick } from 'vue';
+
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import VersionSelectForm from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/version_select_form.vue';
+
+describe('VersionSelectForm', () => {
+ let wrapper;
+
+ const findFormRadioGroup = () => wrapper.findComponent(GlFormRadioGroup);
+ const findForm = () => wrapper.findComponent(GlForm);
+ const findInput = () => wrapper.findComponent(GlFormInput);
+
+ const submitForm = () => findForm().vm.$emit('submit', new Event('submit'));
+
+ const createComponent = () => {
+ wrapper = shallowMountExtended(VersionSelectForm);
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('default state', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('selects saas radio option by default', () => {
+ expect(findFormRadioGroup().vm.$attrs.checked).toBe(VersionSelectForm.radioOptions.saas);
+ });
+
+ it('does not render instance input', () => {
+ expect(findInput().exists()).toBe(false);
+ });
+
+ describe('when form is submitted', () => {
+ it('emits "submit" event with gitlab.com as the payload', () => {
+ submitForm();
+
+ expect(wrapper.emitted('submit')[0][0]).toBe('https://gitlab.com');
+ });
+ });
+ });
+
+ describe('when "self-managed" radio option is selected', () => {
+ beforeEach(async () => {
+ createComponent();
+
+ findFormRadioGroup().vm.$emit('input', VersionSelectForm.radioOptions.selfManaged);
+ await nextTick();
+ });
+
+ it('reveals the self-managed input field', () => {
+ expect(findInput().exists()).toBe(true);
+ });
+
+ describe('when form is submitted', () => {
+ it('emits "submit" event with the input field value as the payload', () => {
+ const mockInstanceUrl = 'https://gitlab.example.com';
+
+ findInput().vm.$emit('input', mockInstanceUrl);
+ submitForm();
+
+ expect(wrapper.emitted('submit')[0][0]).toBe(mockInstanceUrl);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_page_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_page_spec.js
new file mode 100644
index 00000000000..65b08fba592
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/pages/sign_in/sign_in_page_spec.js
@@ -0,0 +1,82 @@
+import { shallowMount } from '@vue/test-utils';
+
+import SignInPage from '~/jira_connect/subscriptions/pages/sign_in/sign_in_page.vue';
+import SignInGitlabCom from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_com.vue';
+import SignInGitlabMultiversion from '~/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue';
+import createStore from '~/jira_connect/subscriptions/store';
+
+describe('SignInPage', () => {
+ let wrapper;
+ let store;
+
+ const findSignInGitlabCom = () => wrapper.findComponent(SignInGitlabCom);
+ const findSignInGitabMultiversion = () => wrapper.findComponent(SignInGitlabMultiversion);
+
+ const createComponent = ({
+ props = {},
+ jiraConnectOauthEnabled,
+ jiraConnectOauthSelfManagedEnabled,
+ } = {}) => {
+ store = createStore();
+
+ wrapper = shallowMount(SignInPage, {
+ store,
+ provide: {
+ glFeatures: {
+ jiraConnectOauth: jiraConnectOauthEnabled,
+ jiraConnectOauthSelfManaged: jiraConnectOauthSelfManagedEnabled,
+ },
+ },
+ propsData: { hasSubscriptions: false, ...props },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each`
+ jiraConnectOauthEnabled | jiraConnectOauthSelfManagedEnabled | shouldRenderDotCom | shouldRenderMultiversion
+ ${false} | ${false} | ${true} | ${false}
+ ${false} | ${true} | ${true} | ${false}
+ ${true} | ${false} | ${true} | ${false}
+ ${true} | ${true} | ${false} | ${true}
+ `(
+ 'renders correct component when jiraConnectOauth is $jiraConnectOauthEnabled and jiraConnectOauthSelfManaged is $jiraConnectOauthSelfManagedEnabled',
+ ({
+ jiraConnectOauthEnabled,
+ jiraConnectOauthSelfManagedEnabled,
+ shouldRenderDotCom,
+ shouldRenderMultiversion,
+ }) => {
+ createComponent({ jiraConnectOauthEnabled, jiraConnectOauthSelfManagedEnabled });
+
+ expect(findSignInGitlabCom().exists()).toBe(shouldRenderDotCom);
+ expect(findSignInGitabMultiversion().exists()).toBe(shouldRenderMultiversion);
+ },
+ );
+
+ describe('when jiraConnectOauthSelfManaged is false', () => {
+ beforeEach(() => {
+ createComponent({ jiraConnectOauthSelfManaged: false, props: { hasSubscriptions: true } });
+ });
+
+ it('renders SignInGitlabCom with correct props', () => {
+ expect(findSignInGitlabCom().props()).toEqual({ hasSubscriptions: true });
+ });
+
+ describe('when error event is emitted', () => {
+ it('emits another error event', () => {
+ findSignInGitlabCom().vm.$emit('error');
+ expect(wrapper.emitted('error')[0]).toBeTruthy();
+ });
+ });
+
+ describe('when sign-in-oauth event is emitted', () => {
+ it('emits another sign-in-oauth event', () => {
+ findSignInGitlabCom().vm.$emit('sign-in-oauth');
+ expect(wrapper.emitted('sign-in-oauth')[0]).toEqual([]);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js b/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js
deleted file mode 100644
index 97d1b077164..00000000000
--- a/spec/frontend/jira_connect/subscriptions/pages/sign_in_spec.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-
-import SignInPage from '~/jira_connect/subscriptions/pages/sign_in.vue';
-import SignInLegacyButton from '~/jira_connect/subscriptions/components/sign_in_legacy_button.vue';
-import SignInOauthButton from '~/jira_connect/subscriptions/components/sign_in_oauth_button.vue';
-import SubscriptionsList from '~/jira_connect/subscriptions/components/subscriptions_list.vue';
-import createStore from '~/jira_connect/subscriptions/store';
-import { I18N_DEFAULT_SIGN_IN_BUTTON_TEXT } from '~/jira_connect/subscriptions/constants';
-
-jest.mock('~/jira_connect/subscriptions/utils');
-
-const mockUsersPath = '/test';
-const defaultProvide = {
- oauthMetadata: {},
- usersPath: mockUsersPath,
-};
-
-describe('SignInPage', () => {
- let wrapper;
- let store;
-
- const findSignInLegacyButton = () => wrapper.findComponent(SignInLegacyButton);
- const findSignInOauthButton = () => wrapper.findComponent(SignInOauthButton);
- const findSubscriptionsList = () => wrapper.findComponent(SubscriptionsList);
-
- const createComponent = ({ props, jiraConnectOauthEnabled } = {}) => {
- store = createStore();
-
- wrapper = shallowMount(SignInPage, {
- store,
- provide: {
- ...defaultProvide,
- glFeatures: {
- jiraConnectOauth: jiraConnectOauthEnabled,
- },
- },
- propsData: props,
- stubs: {
- SignInLegacyButton,
- SignInOauthButton,
- },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- describe.each`
- scenario | hasSubscriptions | signInButtonText
- ${'with subscriptions'} | ${true} | ${SignInPage.i18n.signInButtonTextWithSubscriptions}
- ${'without subscriptions'} | ${false} | ${I18N_DEFAULT_SIGN_IN_BUTTON_TEXT}
- `('$scenario', ({ hasSubscriptions, signInButtonText }) => {
- describe('when `jiraConnectOauthEnabled` feature flag is disabled', () => {
- beforeEach(() => {
- createComponent({
- jiraConnectOauthEnabled: false,
- props: {
- hasSubscriptions,
- },
- });
- });
-
- it('renders legacy sign in button', () => {
- const button = findSignInLegacyButton();
- expect(button.props('usersPath')).toBe(mockUsersPath);
- expect(button.text()).toMatchInterpolatedText(signInButtonText);
- });
- });
-
- describe('when `jiraConnectOauthEnabled` feature flag is enabled', () => {
- beforeEach(() => {
- createComponent({
- jiraConnectOauthEnabled: true,
- props: {
- hasSubscriptions,
- },
- });
- });
-
- describe('oauth sign in button', () => {
- it('renders oauth sign in button', () => {
- const button = findSignInOauthButton();
- expect(button.text()).toMatchInterpolatedText(signInButtonText);
- });
-
- describe('when button emits `sign-in` event', () => {
- it('emits `sign-in-oauth` event', () => {
- const button = findSignInOauthButton();
-
- const mockUser = { name: 'test' };
- button.vm.$emit('sign-in', mockUser);
-
- expect(wrapper.emitted('sign-in-oauth')[0]).toEqual([mockUser]);
- });
- });
-
- describe('when button emits `error` event', () => {
- it('emits `error` event', () => {
- const button = findSignInOauthButton();
- button.vm.$emit('error');
-
- expect(wrapper.emitted('error')).toBeTruthy();
- });
- });
- });
- });
-
- it(`${hasSubscriptions ? 'renders' : 'does not render'} subscriptions list`, () => {
- createComponent({
- props: {
- hasSubscriptions,
- },
- });
-
- expect(findSubscriptionsList().exists()).toBe(hasSubscriptions);
- });
- });
- });
-});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/subscriptions_page_spec.js b/spec/frontend/jira_connect/subscriptions/pages/subscriptions_page_spec.js
new file mode 100644
index 00000000000..4956af76ead
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/pages/subscriptions_page_spec.js
@@ -0,0 +1,71 @@
+import { GlEmptyState, GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import SubscriptionsPage from '~/jira_connect/subscriptions/pages/subscriptions_page.vue';
+import AddNamespaceButton from '~/jira_connect/subscriptions/components/add_namespace_button.vue';
+import SubscriptionsList from '~/jira_connect/subscriptions/components/subscriptions_list.vue';
+import createStore from '~/jira_connect/subscriptions/store';
+
+describe('SubscriptionsPage', () => {
+ let wrapper;
+ let store;
+
+ const findAddNamespaceButton = () => wrapper.findComponent(AddNamespaceButton);
+ const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+ const findSubscriptionsList = () => wrapper.findComponent(SubscriptionsList);
+ const findEmptyState = () => wrapper.findComponent(GlEmptyState);
+
+ const createComponent = ({ props, initialState } = {}) => {
+ store = createStore(initialState);
+
+ wrapper = shallowMount(SubscriptionsPage, {
+ store,
+ propsData: { hasSubscriptions: false, ...props },
+ stubs: {
+ GlEmptyState,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ describe.each`
+ scenario | subscriptionsLoading | hasSubscriptions | expectSubscriptionsList | expectEmptyState
+ ${'with subscriptions loading'} | ${true} | ${false} | ${false} | ${false}
+ ${'with subscriptions'} | ${false} | ${true} | ${true} | ${false}
+ ${'without subscriptions'} | ${false} | ${false} | ${false} | ${true}
+ `(
+ '$scenario',
+ ({ subscriptionsLoading, hasSubscriptions, expectEmptyState, expectSubscriptionsList }) => {
+ beforeEach(() => {
+ createComponent({
+ initialState: { subscriptionsLoading },
+ props: {
+ hasSubscriptions,
+ },
+ });
+ });
+
+ it(`${
+ subscriptionsLoading ? 'does not render' : 'renders'
+ } button to add namespace`, () => {
+ expect(findAddNamespaceButton().exists()).toBe(!subscriptionsLoading);
+ });
+
+ it(`${subscriptionsLoading ? 'renders' : 'does not render'} GlLoadingIcon`, () => {
+ expect(findGlLoadingIcon().exists()).toBe(subscriptionsLoading);
+ });
+
+ it(`${expectEmptyState ? 'renders' : 'does not render'} empty state`, () => {
+ expect(findEmptyState().exists()).toBe(expectEmptyState);
+ });
+
+ it(`${expectSubscriptionsList ? 'renders' : 'does not render'} subscriptions list`, () => {
+ expect(findSubscriptionsList().exists()).toBe(expectSubscriptionsList);
+ });
+ },
+ );
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/pages/subscriptions_spec.js b/spec/frontend/jira_connect/subscriptions/pages/subscriptions_spec.js
deleted file mode 100644
index 198278efc1f..00000000000
--- a/spec/frontend/jira_connect/subscriptions/pages/subscriptions_spec.js
+++ /dev/null
@@ -1,56 +0,0 @@
-import { GlEmptyState } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import SubscriptionsPage from '~/jira_connect/subscriptions/pages/subscriptions.vue';
-import AddNamespaceButton from '~/jira_connect/subscriptions/components/add_namespace_button.vue';
-import SubscriptionsList from '~/jira_connect/subscriptions/components/subscriptions_list.vue';
-import createStore from '~/jira_connect/subscriptions/store';
-
-describe('SubscriptionsPage', () => {
- let wrapper;
- let store;
-
- const findAddNamespaceButton = () => wrapper.findComponent(AddNamespaceButton);
- const findSubscriptionsList = () => wrapper.findComponent(SubscriptionsList);
- const findEmptyState = () => wrapper.findComponent(GlEmptyState);
-
- const createComponent = ({ props } = {}) => {
- store = createStore();
-
- wrapper = shallowMount(SubscriptionsPage, {
- store,
- propsData: props,
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- describe.each`
- scenario | expectSubscriptionsList | expectEmptyState
- ${'with subscriptions'} | ${true} | ${false}
- ${'without subscriptions'} | ${false} | ${true}
- `('$scenario', ({ expectEmptyState, expectSubscriptionsList }) => {
- beforeEach(() => {
- createComponent({
- props: {
- hasSubscriptions: expectSubscriptionsList,
- },
- });
- });
-
- it('renders button to add namespace', () => {
- expect(findAddNamespaceButton().exists()).toBe(true);
- });
-
- it(`${expectEmptyState ? 'renders' : 'does not render'} empty state`, () => {
- expect(findEmptyState().exists()).toBe(expectEmptyState);
- });
-
- it(`${expectSubscriptionsList ? 'renders' : 'does not render'} subscriptions list`, () => {
- expect(findSubscriptionsList().exists()).toBe(expectSubscriptionsList);
- });
- });
- });
-});
diff --git a/spec/frontend/jira_connect/subscriptions/store/actions_spec.js b/spec/frontend/jira_connect/subscriptions/store/actions_spec.js
new file mode 100644
index 00000000000..53b5d8e70af
--- /dev/null
+++ b/spec/frontend/jira_connect/subscriptions/store/actions_spec.js
@@ -0,0 +1,172 @@
+import testAction from 'helpers/vuex_action_helper';
+
+import * as types from '~/jira_connect/subscriptions/store/mutation_types';
+import {
+ fetchSubscriptions,
+ loadCurrentUser,
+ addSubscription,
+} from '~/jira_connect/subscriptions/store/actions';
+import state from '~/jira_connect/subscriptions/store/state';
+import * as api from '~/jira_connect/subscriptions/api';
+import * as userApi from '~/api/user_api';
+import * as integrationsApi from '~/api/integrations_api';
+import {
+ I18N_DEFAULT_SUBSCRIPTIONS_ERROR_MESSAGE,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ INTEGRATIONS_DOC_LINK,
+} from '~/jira_connect/subscriptions/constants';
+import * as utils from '~/jira_connect/subscriptions/utils';
+
+describe('JiraConnect actions', () => {
+ let mockedState;
+
+ beforeEach(() => {
+ mockedState = state();
+ });
+
+ describe('fetchSubscriptions', () => {
+ const mockUrl = '/mock-url';
+
+ describe('when API request is successful', () => {
+ it('should commit SET_SUBSCRIPTIONS_LOADING and SET_SUBSCRIPTIONS mutations', async () => {
+ jest.spyOn(api, 'fetchSubscriptions').mockResolvedValue({ data: { subscriptions: [] } });
+
+ await testAction(
+ fetchSubscriptions,
+ mockUrl,
+ mockedState,
+ [
+ { type: types.SET_SUBSCRIPTIONS_LOADING, payload: true },
+ { type: types.SET_SUBSCRIPTIONS, payload: [] },
+ { type: types.SET_SUBSCRIPTIONS_LOADING, payload: false },
+ ],
+ [],
+ );
+
+ expect(api.fetchSubscriptions).toHaveBeenCalledWith(mockUrl);
+ });
+ });
+
+ describe('when API request fails', () => {
+ it('should commit SET_SUBSCRIPTIONS_LOADING, SET_SUBSCRIPTIONS_ERROR and SET_ALERT mutations', async () => {
+ jest.spyOn(api, 'fetchSubscriptions').mockRejectedValue();
+
+ await testAction(
+ fetchSubscriptions,
+ mockUrl,
+ mockedState,
+ [
+ { type: types.SET_SUBSCRIPTIONS_LOADING, payload: true },
+ { type: types.SET_SUBSCRIPTIONS_ERROR, payload: true },
+ {
+ type: types.SET_ALERT,
+ payload: { message: I18N_DEFAULT_SUBSCRIPTIONS_ERROR_MESSAGE, variant: 'danger' },
+ },
+ { type: types.SET_SUBSCRIPTIONS_LOADING, payload: false },
+ ],
+ [],
+ );
+
+ expect(api.fetchSubscriptions).toHaveBeenCalledWith(mockUrl);
+ });
+ });
+ });
+
+ describe('loadCurrentUser', () => {
+ const mockAccessToken = 'abcd1234';
+
+ describe('when API request succeeds', () => {
+ it('commits the SET_ACCESS_TOKEN and SET_CURRENT_USER mutations', async () => {
+ const mockUser = { name: 'root' };
+ jest.spyOn(userApi, 'getCurrentUser').mockResolvedValue({ data: mockUser });
+
+ await testAction(
+ loadCurrentUser,
+ mockAccessToken,
+ mockedState,
+ [{ type: types.SET_CURRENT_USER, payload: mockUser }],
+ [],
+ );
+
+ expect(userApi.getCurrentUser).toHaveBeenCalledWith({
+ headers: { Authorization: `Bearer ${mockAccessToken}` },
+ });
+ });
+ });
+
+ describe('when API request fails', () => {
+ it('commits the SET_CURRENT_USER_ERROR mutation', async () => {
+ jest.spyOn(userApi, 'getCurrentUser').mockRejectedValue();
+
+ await testAction(
+ loadCurrentUser,
+ mockAccessToken,
+ mockedState,
+ [{ type: types.SET_CURRENT_USER_ERROR }],
+ [],
+ );
+ });
+ });
+ });
+
+ describe('addSubscription', () => {
+ const mockNamespace = 'gitlab-org/gitlab';
+ const mockSubscriptionsPath = '/subscriptions';
+
+ beforeEach(() => {
+ jest.spyOn(utils, 'getJwt').mockReturnValue('1234');
+ });
+
+ describe('when API request succeeds', () => {
+ it('commits the SET_ACCESS_TOKEN and SET_CURRENT_USER mutations', async () => {
+ jest
+ .spyOn(integrationsApi, 'addJiraConnectSubscription')
+ .mockResolvedValue({ success: true });
+
+ await testAction(
+ addSubscription,
+ { namespacePath: mockNamespace, subscriptionsPath: mockSubscriptionsPath },
+ mockedState,
+ [
+ { type: types.ADD_SUBSCRIPTION_LOADING, payload: true },
+ {
+ type: types.SET_ALERT,
+ payload: {
+ title: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_TITLE,
+ message: I18N_ADD_SUBSCRIPTION_SUCCESS_ALERT_MESSAGE,
+ linkUrl: INTEGRATIONS_DOC_LINK,
+ variant: 'success',
+ },
+ },
+ { type: types.ADD_SUBSCRIPTION_LOADING, payload: false },
+ ],
+ [{ type: 'fetchSubscriptions', payload: mockSubscriptionsPath }],
+ );
+
+ expect(integrationsApi.addJiraConnectSubscription).toHaveBeenCalledWith(mockNamespace, {
+ accessToken: null,
+ jwt: '1234',
+ });
+ });
+ });
+
+ describe('when API request fails', () => {
+ it('commits the SET_CURRENT_USER_ERROR mutation', async () => {
+ jest.spyOn(integrationsApi, 'addJiraConnectSubscription').mockRejectedValue();
+
+ await testAction(
+ addSubscription,
+ mockNamespace,
+ mockedState,
+ [
+ { type: types.ADD_SUBSCRIPTION_LOADING, payload: true },
+ { type: types.ADD_SUBSCRIPTION_ERROR },
+ { type: types.ADD_SUBSCRIPTION_LOADING, payload: false },
+ ],
+ [],
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/jira_connect/subscriptions/store/mutations_spec.js b/spec/frontend/jira_connect/subscriptions/store/mutations_spec.js
index 84a33dbf0b5..aeb136a76b9 100644
--- a/spec/frontend/jira_connect/subscriptions/store/mutations_spec.js
+++ b/spec/frontend/jira_connect/subscriptions/store/mutations_spec.js
@@ -25,4 +25,71 @@ describe('JiraConnect store mutations', () => {
});
});
});
+
+ describe('SET_SUBSCRIPTIONS', () => {
+ it('sets subscriptions loading flag', () => {
+ const mockSubscriptions = [{ name: 'test' }];
+ mutations.SET_SUBSCRIPTIONS(localState, mockSubscriptions);
+
+ expect(localState.subscriptions).toBe(mockSubscriptions);
+ });
+ });
+
+ describe('SET_SUBSCRIPTIONS_LOADING', () => {
+ it('sets subscriptions loading flag', () => {
+ mutations.SET_SUBSCRIPTIONS_LOADING(localState, true);
+
+ expect(localState.subscriptionsLoading).toBe(true);
+ });
+ });
+
+ describe('SET_SUBSCRIPTIONS_ERROR', () => {
+ it('sets subscriptions error', () => {
+ mutations.SET_SUBSCRIPTIONS_ERROR(localState, true);
+
+ expect(localState.subscriptionsError).toBe(true);
+ });
+ });
+
+ describe('ADD_SUBSCRIPTION_LOADING', () => {
+ it('sets addSubscriptionLoading', () => {
+ mutations.ADD_SUBSCRIPTION_LOADING(localState, true);
+
+ expect(localState.addSubscriptionLoading).toBe(true);
+ });
+ });
+
+ describe('ADD_SUBSCRIPTION_ERROR', () => {
+ it('sets addSubscriptionError', () => {
+ mutations.ADD_SUBSCRIPTION_ERROR(localState, true);
+
+ expect(localState.addSubscriptionError).toBe(true);
+ });
+ });
+
+ describe('SET_CURRENT_USER', () => {
+ it('sets currentUser', () => {
+ const mockUser = { name: 'root' };
+ mutations.SET_CURRENT_USER(localState, mockUser);
+
+ expect(localState.currentUser).toBe(mockUser);
+ });
+ });
+
+ describe('SET_CURRENT_USER_ERROR', () => {
+ it('sets currentUserError', () => {
+ mutations.SET_CURRENT_USER_ERROR(localState, true);
+
+ expect(localState.currentUserError).toBe(true);
+ });
+ });
+
+ describe('SET_ACCESS_TOKEN', () => {
+ it('sets accessToken', () => {
+ const mockAccessToken = 'asdf1234';
+ mutations.SET_ACCESS_TOKEN(localState, mockAccessToken);
+
+ expect(localState.accessToken).toBe(mockAccessToken);
+ });
+ });
});
diff --git a/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js b/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js
index ce8e482cc16..92ce3925a90 100644
--- a/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js
+++ b/spec/frontend/jobs/components/filtered_search/tokens/job_status_token_spec.js
@@ -21,6 +21,7 @@ describe('Job Status Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const createComponent = () => {
diff --git a/spec/frontend/jobs/components/job_app_spec.js b/spec/frontend/jobs/components/job_app_spec.js
index 9abe66b4696..fc308766ab9 100644
--- a/spec/frontend/jobs/components/job_app_spec.js
+++ b/spec/frontend/jobs/components/job_app_spec.js
@@ -129,7 +129,9 @@ describe('Job App', () => {
const aYearAgo = new Date();
aYearAgo.setFullYear(aYearAgo.getFullYear() - 1);
- return setupAndMount({ jobData: { started: aYearAgo.toISOString() } });
+ return setupAndMount({
+ jobData: { started: aYearAgo.toISOString(), started_at: aYearAgo.toISOString() },
+ });
});
it('should render provided job information', () => {
diff --git a/spec/frontend/jobs/components/stuck_block_spec.js b/spec/frontend/jobs/components/stuck_block_spec.js
index 4db73eaaaec..1580ed45e46 100644
--- a/spec/frontend/jobs/components/stuck_block_spec.js
+++ b/spec/frontend/jobs/components/stuck_block_spec.js
@@ -32,7 +32,7 @@ describe('Stuck Block Job component', () => {
describe('with no runners for project', () => {
beforeEach(() => {
createWrapper({
- hasNoRunnersForProject: true,
+ hasOfflineRunnersForProject: true,
runnersPath: '/root/project/runners#js-runners-settings',
});
});
@@ -53,7 +53,7 @@ describe('Stuck Block Job component', () => {
describe('with tags', () => {
beforeEach(() => {
createWrapper({
- hasNoRunnersForProject: false,
+ hasOfflineRunnersForProject: false,
tags,
runnersPath: '/root/project/runners#js-runners-settings',
});
@@ -81,7 +81,7 @@ describe('Stuck Block Job component', () => {
describe('without active runners', () => {
beforeEach(() => {
createWrapper({
- hasNoRunnersForProject: false,
+ hasOfflineRunnersForProject: false,
runnersPath: '/root/project/runners#js-runners-settings',
});
});
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 263698e94e1..976b128532d 100644
--- a/spec/frontend/jobs/components/table/cells/actions_cell_spec.js
+++ b/spec/frontend/jobs/components/table/cells/actions_cell_spec.js
@@ -1,8 +1,12 @@
import { GlModal } from '@gitlab/ui';
-import { nextTick } from 'vue';
+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 { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { redirectTo } from '~/lib/utils/url_utility';
import ActionsCell from '~/jobs/components/table/cells/actions_cell.vue';
+import eventHub from '~/jobs/components/table/event_hub';
import JobPlayMutation from '~/jobs/components/table/graphql/mutations/job_play.mutation.graphql';
import JobRetryMutation from '~/jobs/components/table/graphql/mutations/job_retry.mutation.graphql';
import JobUnscheduleMutation from '~/jobs/components/table/graphql/mutations/job_unschedule.mutation.graphql';
@@ -15,11 +19,18 @@ import {
cannotRetryJob,
cannotPlayJob,
cannotPlayScheduledJob,
+ retryMutationResponse,
+ playMutationResponse,
+ cancelMutationResponse,
+ unscheduleMutationResponse,
} from '../../../mock_data';
+jest.mock('~/lib/utils/url_utility');
+
+Vue.use(VueApollo);
+
describe('Job actions cell', () => {
let wrapper;
- let mutate;
const findRetryButton = () => wrapper.findByTestId('retry');
const findPlayButton = () => wrapper.findByTestId('play');
@@ -31,29 +42,27 @@ describe('Job actions cell', () => {
const findModal = () => wrapper.findComponent(GlModal);
- const MUTATION_SUCCESS = { data: { JobRetryMutation: { jobId: retryableJob.id } } };
- const MUTATION_SUCCESS_UNSCHEDULE = {
- data: { JobUnscheduleMutation: { jobId: scheduledJob.id } },
- };
- const MUTATION_SUCCESS_PLAY = { data: { JobPlayMutation: { jobId: playableJob.id } } };
- const MUTATION_SUCCESS_CANCEL = { data: { JobCancelMutation: { jobId: cancelableJob.id } } };
+ const playMutationHandler = jest.fn().mockResolvedValue(playMutationResponse);
+ const retryMutationHandler = jest.fn().mockResolvedValue(retryMutationResponse);
+ const unscheduleMutationHandler = jest.fn().mockResolvedValue(unscheduleMutationResponse);
+ const cancelMutationHandler = jest.fn().mockResolvedValue(cancelMutationResponse);
const $toast = {
show: jest.fn(),
};
- const createComponent = (jobType, mutationType = MUTATION_SUCCESS, props = {}) => {
- mutate = jest.fn().mockResolvedValue(mutationType);
+ const createMockApolloProvider = (requestHandlers) => {
+ return createMockApollo(requestHandlers);
+ };
+ const createComponent = (jobType, requestHandlers, props = {}) => {
wrapper = shallowMountExtended(ActionsCell, {
propsData: {
job: jobType,
...props,
},
+ apolloProvider: createMockApolloProvider(requestHandlers),
mocks: {
- $apollo: {
- mutate,
- },
$toast,
},
});
@@ -101,24 +110,59 @@ describe('Job actions cell', () => {
});
it.each`
- button | mutationResult | action | jobType | mutationFile
- ${findPlayButton} | ${MUTATION_SUCCESS_PLAY} | ${'play'} | ${playableJob} | ${JobPlayMutation}
- ${findRetryButton} | ${MUTATION_SUCCESS} | ${'retry'} | ${retryableJob} | ${JobRetryMutation}
- ${findCancelButton} | ${MUTATION_SUCCESS_CANCEL} | ${'cancel'} | ${cancelableJob} | ${JobCancelMutation}
- `('performs the $action mutation', ({ button, mutationResult, jobType, mutationFile }) => {
- createComponent(jobType, mutationResult);
+ button | action | jobType | mutationFile | handler | jobId
+ ${findPlayButton} | ${'play'} | ${playableJob} | ${JobPlayMutation} | ${playMutationHandler} | ${playableJob.id}
+ ${findRetryButton} | ${'retry'} | ${retryableJob} | ${JobRetryMutation} | ${retryMutationHandler} | ${retryableJob.id}
+ ${findCancelButton} | ${'cancel'} | ${cancelableJob} | ${JobCancelMutation} | ${cancelMutationHandler} | ${cancelableJob.id}
+ `('performs the $action mutation', async ({ button, jobType, mutationFile, handler, jobId }) => {
+ createComponent(jobType, [[mutationFile, handler]]);
button().vm.$emit('click');
- expect(mutate).toHaveBeenCalledWith({
- mutation: mutationFile,
- variables: {
- id: jobType.id,
- },
- });
+ expect(handler).toHaveBeenCalledWith({ id: jobId });
});
it.each`
+ button | action | jobType | mutationFile | handler
+ ${findUnscheduleButton} | ${'unschedule'} | ${scheduledJob} | ${JobUnscheduleMutation} | ${unscheduleMutationHandler}
+ ${findCancelButton} | ${'cancel'} | ${cancelableJob} | ${JobCancelMutation} | ${cancelMutationHandler}
+ `(
+ 'the mutation action $action emits the jobActionPerformed event',
+ async ({ button, jobType, mutationFile, handler }) => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+
+ createComponent(jobType, [[mutationFile, handler]]);
+
+ button().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(eventHub.$emit).toHaveBeenCalledWith('jobActionPerformed');
+ expect(redirectTo).not.toHaveBeenCalled();
+ },
+ );
+
+ it.each`
+ button | action | jobType | mutationFile | handler | redirectLink
+ ${findPlayButton} | ${'play'} | ${playableJob} | ${JobPlayMutation} | ${playMutationHandler} | ${'/root/project/-/jobs/1986'}
+ ${findRetryButton} | ${'retry'} | ${retryableJob} | ${JobRetryMutation} | ${retryMutationHandler} | ${'/root/project/-/jobs/1985'}
+ `(
+ 'the mutation action $action redirects to the job',
+ async ({ button, jobType, mutationFile, handler, redirectLink }) => {
+ jest.spyOn(eventHub, '$emit').mockImplementation(() => {});
+
+ createComponent(jobType, [[mutationFile, handler]]);
+
+ button().vm.$emit('click');
+
+ await waitForPromises();
+
+ expect(redirectTo).toHaveBeenCalledWith(redirectLink);
+ expect(eventHub.$emit).not.toHaveBeenCalled();
+ },
+ );
+
+ it.each`
button | action | jobType
${findPlayButton} | ${'play'} | ${playableJob}
${findRetryButton} | ${'retry'} | ${retryableJob}
@@ -152,20 +196,17 @@ describe('Job actions cell', () => {
});
it('unschedules a job', () => {
- createComponent(scheduledJob, MUTATION_SUCCESS_UNSCHEDULE);
+ createComponent(scheduledJob, [[JobUnscheduleMutation, unscheduleMutationHandler]]);
findUnscheduleButton().vm.$emit('click');
- expect(mutate).toHaveBeenCalledWith({
- mutation: JobUnscheduleMutation,
- variables: {
- id: scheduledJob.id,
- },
+ expect(unscheduleMutationHandler).toHaveBeenCalledWith({
+ id: scheduledJob.id,
});
});
it('shows the play job confirmation modal', async () => {
- createComponent(scheduledJob, MUTATION_SUCCESS);
+ createComponent(scheduledJob);
findPlayScheduledJobButton().vm.$emit('click');
diff --git a/spec/frontend/jobs/mock_data.js b/spec/frontend/jobs/mock_data.js
index 27b6c04eded..4676635cce0 100644
--- a/spec/frontend/jobs/mock_data.js
+++ b/spec/frontend/jobs/mock_data.js
@@ -1928,3 +1928,75 @@ export const CIJobConnectionExistingCache = {
};
export const mockFailedSearchToken = { type: 'status', value: { data: 'FAILED', operator: '=' } };
+
+export const retryMutationResponse = {
+ data: {
+ jobRetry: {
+ job: {
+ __typename: 'CiJob',
+ id: '"gid://gitlab/Ci::Build/1985"',
+ detailedStatus: {
+ detailsPath: '/root/project/-/jobs/1985',
+ id: 'pending-1985-1985',
+ __typename: 'DetailedStatus',
+ },
+ },
+ errors: [],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
+
+export const playMutationResponse = {
+ data: {
+ jobPlay: {
+ job: {
+ __typename: 'CiJob',
+ id: '"gid://gitlab/Ci::Build/1986"',
+ detailedStatus: {
+ detailsPath: '/root/project/-/jobs/1986',
+ id: 'pending-1986-1986',
+ __typename: 'DetailedStatus',
+ },
+ },
+ errors: [],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
+
+export const cancelMutationResponse = {
+ data: {
+ jobCancel: {
+ job: {
+ __typename: 'CiJob',
+ id: '"gid://gitlab/Ci::Build/1987"',
+ detailedStatus: {
+ detailsPath: '/root/project/-/jobs/1987',
+ id: 'pending-1987-1987',
+ __typename: 'DetailedStatus',
+ },
+ },
+ errors: [],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
+
+export const unscheduleMutationResponse = {
+ data: {
+ jobUnschedule: {
+ job: {
+ __typename: 'CiJob',
+ id: '"gid://gitlab/Ci::Build/1988"',
+ detailedStatus: {
+ detailsPath: '/root/project/-/jobs/1988',
+ id: 'pending-1988-1988',
+ __typename: 'DetailedStatus',
+ },
+ },
+ errors: [],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
diff --git a/spec/frontend/jobs/store/getters_spec.js b/spec/frontend/jobs/store/getters_spec.js
index f26c0cf00fd..c13b051c672 100644
--- a/spec/frontend/jobs/store/getters_spec.js
+++ b/spec/frontend/jobs/store/getters_spec.js
@@ -10,16 +10,18 @@ describe('Job Store Getters', () => {
describe('headerTime', () => {
describe('when the job has started key', () => {
- it('returns started key', () => {
+ it('returns started_at value', () => {
const started = '2018-08-31T16:20:49.023Z';
+ const startedAt = '2018-08-31T16:20:49.023Z';
+ localState.job.started_at = startedAt;
localState.job.started = started;
- expect(getters.headerTime(localState)).toEqual(started);
+ expect(getters.headerTime(localState)).toEqual(startedAt);
});
});
describe('when the job does not have started key', () => {
- it('returns created_at key', () => {
+ it('returns created_at value', () => {
const created = '2018-08-31T16:20:49.023Z';
localState.job.created_at = created;
@@ -58,7 +60,7 @@ describe('Job Store Getters', () => {
describe('shouldRenderTriggeredLabel', () => {
describe('when started equals null', () => {
it('returns false', () => {
- localState.job.started = null;
+ localState.job.started_at = null;
expect(getters.shouldRenderTriggeredLabel(localState)).toEqual(false);
});
@@ -66,7 +68,7 @@ describe('Job Store Getters', () => {
describe('when started equals string', () => {
it('returns true', () => {
- localState.job.started = '2018-08-31T16:20:49.023Z';
+ localState.job.started_at = '2018-08-31T16:20:49.023Z';
expect(getters.shouldRenderTriggeredLabel(localState)).toEqual(true);
});
@@ -206,7 +208,7 @@ describe('Job Store Getters', () => {
});
});
- describe('hasRunnersForProject', () => {
+ describe('hasOfflineRunnersForProject', () => {
describe('with available and offline runners', () => {
it('returns true', () => {
localState.job.runners = {
@@ -214,7 +216,7 @@ describe('Job Store Getters', () => {
online: false,
};
- expect(getters.hasRunnersForProject(localState)).toEqual(true);
+ expect(getters.hasOfflineRunnersForProject(localState)).toEqual(true);
});
});
@@ -225,7 +227,7 @@ describe('Job Store Getters', () => {
online: false,
};
- expect(getters.hasRunnersForProject(localState)).toEqual(false);
+ expect(getters.hasOfflineRunnersForProject(localState)).toEqual(false);
});
});
@@ -236,7 +238,7 @@ describe('Job Store Getters', () => {
online: true,
};
- expect(getters.hasRunnersForProject(localState)).toEqual(false);
+ expect(getters.hasOfflineRunnersForProject(localState)).toEqual(false);
});
});
});
diff --git a/spec/frontend/lib/dompurify_spec.js b/spec/frontend/lib/dompurify_spec.js
index 47a94a4dcde..34325dad6a1 100644
--- a/spec/frontend/lib/dompurify_spec.js
+++ b/spec/frontend/lib/dompurify_spec.js
@@ -73,6 +73,16 @@ describe('~/lib/dompurify', () => {
expect(sanitize('<p><gl-emoji>💯</gl-emoji></p>')).toBe('<p><gl-emoji>💯</gl-emoji></p>');
});
+ it("doesn't allow style tags", () => {
+ // removes style tags
+ expect(sanitize('<style>p {width:50%;}</style>')).toBe('');
+ expect(sanitize('<style type="text/css">p {width:50%;}</style>')).toBe('');
+ // removes mstyle tag (this can removed later by disallowing math tags)
+ expect(sanitize('<math><mstyle displaystyle="true"></mstyle></math>')).toBe('<math></math>');
+ // removes link tag (this is DOMPurify's default behavior)
+ expect(sanitize('<link rel="stylesheet" href="styles.css">')).toBe('');
+ });
+
describe.each`
type | gon
${'root'} | ${rootGon}
diff --git a/spec/frontend/lib/gfm/index_spec.js b/spec/frontend/lib/gfm/index_spec.js
index 5c72b5a51a7..c9a480e9943 100644
--- a/spec/frontend/lib/gfm/index_spec.js
+++ b/spec/frontend/lib/gfm/index_spec.js
@@ -33,14 +33,16 @@ describe('gfm', () => {
});
it('returns the result of executing the renderer function', async () => {
+ const rendered = { value: 'rendered tree' };
+
const result = await render({
markdown: '<strong>This is bold text</strong>',
renderer: () => {
- return 'rendered tree';
+ return rendered;
},
});
- expect(result).toBe('rendered tree');
+ expect(result).toEqual(rendered);
});
});
});
diff --git a/spec/frontend/lib/utils/common_utils_spec.js b/spec/frontend/lib/utils/common_utils_spec.js
index 763a9bd30fe..8e499844406 100644
--- a/spec/frontend/lib/utils/common_utils_spec.js
+++ b/spec/frontend/lib/utils/common_utils_spec.js
@@ -283,6 +283,75 @@ describe('common_utils', () => {
});
});
+ describe('insertText', () => {
+ let textArea;
+
+ beforeAll(() => {
+ textArea = document.createElement('textarea');
+ document.querySelector('body').appendChild(textArea);
+ textArea.value = 'two';
+ textArea.setSelectionRange(0, 0);
+ textArea.focus();
+ });
+
+ afterAll(() => {
+ textArea.parentNode.removeChild(textArea);
+ });
+
+ describe('using execCommand', () => {
+ beforeAll(() => {
+ document.execCommand = jest.fn(() => true);
+ });
+
+ it('inserts the text', () => {
+ commonUtils.insertText(textArea, 'one');
+
+ expect(document.execCommand).toHaveBeenCalledWith('insertText', false, 'one');
+ });
+
+ it('removes selected text', () => {
+ textArea.setSelectionRange(0, textArea.value.length);
+
+ commonUtils.insertText(textArea, '');
+
+ expect(document.execCommand).toHaveBeenCalledWith('delete');
+ });
+ });
+
+ describe('using fallback', () => {
+ beforeEach(() => {
+ document.execCommand = jest.fn(() => false);
+ jest.spyOn(textArea, 'dispatchEvent');
+ textArea.value = 'two';
+ textArea.setSelectionRange(0, 0);
+ });
+
+ it('inserts the text', () => {
+ commonUtils.insertText(textArea, 'one');
+
+ expect(textArea.value).toBe('onetwo');
+ expect(textArea.dispatchEvent).toHaveBeenCalled();
+ });
+
+ it('replaces the selection', () => {
+ textArea.setSelectionRange(0, textArea.value.length);
+
+ commonUtils.insertText(textArea, 'one');
+
+ expect(textArea.value).toBe('one');
+ expect(textArea.selectionStart).toBe(textArea.value.length);
+ });
+
+ it('removes selected text', () => {
+ textArea.setSelectionRange(0, textArea.value.length);
+
+ commonUtils.insertText(textArea, '');
+
+ expect(textArea.value).toBe('');
+ });
+ });
+ });
+
describe('normalizedHeaders', () => {
it('should upperCase all the header keys to keep them consistent', () => {
const apiHeaders = {
diff --git a/spec/frontend/lib/utils/datetime_utility_spec.js b/spec/frontend/lib/utils/datetime_utility_spec.js
index 7a64b654baa..8d989350173 100644
--- a/spec/frontend/lib/utils/datetime_utility_spec.js
+++ b/spec/frontend/lib/utils/datetime_utility_spec.js
@@ -308,7 +308,9 @@ describe('datefix', () => {
});
describe('parsePikadayDate', () => {
- // removed because of https://gitlab.com/gitlab-org/gitlab-foss/issues/39834
+ it('should return a UTC date', () => {
+ expect(datetimeUtility.parsePikadayDate('2020-01-29')).toEqual(new Date(2020, 0, 29));
+ });
});
describe('pikadayToString', () => {
diff --git a/spec/frontend/lib/utils/dom_utils_spec.js b/spec/frontend/lib/utils/dom_utils_spec.js
index 2f240f25d2a..88dac449527 100644
--- a/spec/frontend/lib/utils/dom_utils_spec.js
+++ b/spec/frontend/lib/utils/dom_utils_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import {
addClassIfElementExists,
canScrollUp,
@@ -6,6 +7,7 @@ import {
isElementVisible,
isElementHidden,
getParents,
+ getParentByTagName,
setAttributes,
} from '~/lib/utils/dom_utils';
@@ -23,10 +25,14 @@ describe('DOM Utils', () => {
let parentElement;
beforeEach(() => {
- setFixtures(fixture);
+ setHTMLFixture(fixture);
parentElement = document.querySelector('.parent');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('adds class if element exists', () => {
const childElement = parentElement.querySelector('.child');
@@ -126,10 +132,14 @@ describe('DOM Utils', () => {
let element;
beforeEach(() => {
- setFixtures('<div data-foo-bar data-baz data-qux="">');
+ setHTMLFixture('<div data-foo-bar data-baz data-qux="">');
element = document.querySelector('[data-foo-bar]');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('throws if not given an element', () => {
expect(() => parseBooleanDataAttributes(null, ['baz'])).toThrow();
});
@@ -210,6 +220,21 @@ describe('DOM Utils', () => {
});
});
+ describe('getParentByTagName', () => {
+ const el = document.createElement('div');
+ el.innerHTML = '<p><span><strong><mark>hello world';
+
+ it.each`
+ tagName | parent
+ ${'strong'} | ${el.querySelector('strong')}
+ ${'span'} | ${el.querySelector('span')}
+ ${'p'} | ${el.querySelector('p')}
+ ${'pre'} | ${undefined}
+ `('gets a parent by tag name', ({ tagName, parent }) => {
+ expect(getParentByTagName(el.querySelector('mark'), tagName)).toBe(parent);
+ });
+ });
+
describe('setAttributes', () => {
it('sets multiple attribues on element', () => {
const div = document.createElement('div');
diff --git a/spec/frontend/lib/utils/file_upload_spec.js b/spec/frontend/lib/utils/file_upload_spec.js
index ff11107ea60..f63af2fe0a4 100644
--- a/spec/frontend/lib/utils/file_upload_spec.js
+++ b/spec/frontend/lib/utils/file_upload_spec.js
@@ -1,8 +1,9 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import fileUpload, { getFilename, validateImageName } from '~/lib/utils/file_upload';
describe('File upload', () => {
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<form>
<button class="js-button" type="button">Click me!</button>
<input type="text" class="js-input" />
@@ -11,6 +12,10 @@ describe('File upload', () => {
`);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('when there is a matching button and input', () => {
beforeEach(() => {
fileUpload('.js-button', '.js-input');
diff --git a/spec/frontend/lib/utils/mock_data.js b/spec/frontend/lib/utils/mock_data.js
index df1f79529e7..49a2af8b307 100644
--- a/spec/frontend/lib/utils/mock_data.js
+++ b/spec/frontend/lib/utils/mock_data.js
@@ -3,3 +3,45 @@ export const faviconDataUrl =
export const overlayDataUrl =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA85JREFUWAntVllIVGEUPv/9b46O41KplYN7PeRkti8TjQlhCUGh3MmeQugpIsGKAi2soIcIooiohxYKK2daqDAlIpIiWwxtQaJcaHE0d5tMrbn37z9XRqfR0TvVW56Hudf//uec72zfEWBCJjIwkYGJDPzvGSD/KgExN3Oi2Q+2DJgSDYQEMwItVGH1iZGmJw/Si1y+/PwVAMYYib22MYc/8hVQFgKDEfYoId0KYzagAQebsos/ewMZoeB9wdffcTYpQSaCTWHKoqSQaDk7zkIt0+aCUR8BelEHrf3dUNv9AcqbnsHtT5UKB/hTASh0SLYjnjb/CIDRJi0XiFAaJOpCD8zLpdb4NB66b1OfelthX815dtdRRfiti2aAXLvVLiMQ6olGyztGDkSo4JGGXk8/QFdGpYzpHG2GBQTDhtgVhPEaVbbVpvI6GJz22rv4TcAfrYI1x7Rj5MWWAppomKFVVb2302SFzUkZHAbkG+0b1+Gh77yNYjrmqnWTrLBLRxdvBWv8qlFujH/kYjJYyvLkj71t78zAUvzMAMnHhpN4zf9UREJhd8omyssxu1IgazQDwDnHUcNuH6vhPIE1fmuBzHt74Hn7W89jWGtcAjoaIDOFrdcMYJBkgOCoaRF0Lj0oglddDbCj6tRvKjphEpgjkzEQs2YAKsNxMzjn3nKurhzK+Ly7xe28ua8TwgMMcHJZnvvT0BPtEEKM4tDJ+C8GvIIk4ylINIXVZ0EUKJxYuh3mhCeokbudl6TtVc88dfBdLwbyaWB6zQCYQJpBYSrDGQxBQ/ZWRM2B+VNmQnVnHWx7elyNuL2/R336co7KyJR8CL9oLgEuFlREevWUkEl6uGwpVEG4FBm0OEf9N10NMgPlvWYAuNVwsWDKvcUNYsHUWTCZ13ysyFEXe6TO6aC8CUr9IiK+A05TQrc8yjwmxARHeeMAPlfQJw+AQRwu0YhL/GDXi9NwufG+S8dYkuYMqIb4SsWthotlNMOUCOM6r+G9cqXxPmd1dqrBav/o1zJy2l5/NUjJA/VORwYuFnOUaTQcPs9wMqwV++Xv8oADxKAcZ8nLPr8AoGW+xR6HSqYk3GodAz2QNj0V+Gr26dT9ASNH5239Pf0gktVNWZca8ZvfAFBprWS6hSu1pqt++Y0PD+WIwDAhIWQGtzvSHDbcodfFUFB9hg1Gjs5LXqIdFL+acFBl+FddqYwdxsWC3I70OvgfUaA65zhq2O2c8VxYcyIGFTVlXegYtvCXANCQZJMobjVcLMjtSK/IcEgyOOe8Ve5w7ryKDefp2P3+C/5ohv8HZmVLAAAAAElFTkSuQmCC';
+
+const absoluteUrls = [
+ 'http://example.org',
+ 'http://example.org:8080',
+ 'https://example.org',
+ 'https://example.org:8080',
+ 'https://192.168.1.1',
+];
+
+const rootRelativeUrls = ['/relative/link'];
+
+const relativeUrls = ['./relative/link', '../relative/link'];
+
+const urlsWithoutHost = ['http://', 'https://', 'https:https:https:'];
+
+/* eslint-disable no-script-url */
+const nonHttpUrls = [
+ 'javascript:',
+ 'javascript:alert("XSS")',
+ 'jav\tascript:alert("XSS");',
+ ' &#14; javascript:alert("XSS");',
+ 'ftp://192.168.1.1',
+ 'file:///',
+ 'file:///etc/hosts',
+];
+/* eslint-enable no-script-url */
+
+// javascript:alert('XSS')
+const encodedJavaScriptUrls = [
+ '&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041',
+ '&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;',
+ '&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29',
+ '\\u006A\\u0061\\u0076\\u0061\\u0073\\u0063\\u0072\\u0069\\u0070\\u0074\\u003A\\u0061\\u006C\\u0065\\u0072\\u0074\\u0028\\u0027\\u0058\\u0053\\u0053\\u0027\\u0029',
+];
+
+export const safeUrls = [...absoluteUrls, ...rootRelativeUrls];
+export const unsafeUrls = [
+ ...relativeUrls,
+ ...urlsWithoutHost,
+ ...nonHttpUrls,
+ ...encodedJavaScriptUrls,
+];
diff --git a/spec/frontend/lib/utils/navigation_utility_spec.js b/spec/frontend/lib/utils/navigation_utility_spec.js
index 6a880a0f354..632a8904578 100644
--- a/spec/frontend/lib/utils/navigation_utility_spec.js
+++ b/spec/frontend/lib/utils/navigation_utility_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import findAndFollowLink from '~/lib/utils/navigation_utility';
import * as navigationUtils from '~/lib/utils/navigation_utility';
import { visitUrl } from '~/lib/utils/url_utility';
@@ -8,11 +9,13 @@ describe('findAndFollowLink', () => {
it('visits a link when the selector exists', () => {
const href = '/some/path';
- setFixtures(`<a class="my-shortcut" href="${href}">link</a>`);
+ setHTMLFixture(`<a class="my-shortcut" href="${href}">link</a>`);
findAndFollowLink('.my-shortcut');
expect(visitUrl).toHaveBeenCalledWith(href);
+
+ resetHTMLFixture();
});
it('does not throw an exception when the selector does not exist', () => {
diff --git a/spec/frontend/lib/utils/resize_observer_spec.js b/spec/frontend/lib/utils/resize_observer_spec.js
index 6560562f204..c88ba73ebc6 100644
--- a/spec/frontend/lib/utils/resize_observer_spec.js
+++ b/spec/frontend/lib/utils/resize_observer_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { contentTop } from '~/lib/utils/common_utils';
import { scrollToTargetOnResize } from '~/lib/utils/resize_observer';
@@ -19,7 +20,7 @@ describe('ResizeObserver Utility', () => {
jest.spyOn(document.documentElement, 'scrollTo');
- setFixtures(`<div id="content-body"><div id="note_1234">note to scroll to</div></div>`);
+ setHTMLFixture(`<div id="content-body"><div id="note_1234">note to scroll to</div></div>`);
const target = document.querySelector('#note_1234');
@@ -28,6 +29,7 @@ describe('ResizeObserver Utility', () => {
afterEach(() => {
contentTop.mockReset();
+ resetHTMLFixture();
});
describe('Observer behavior', () => {
diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js
index 103305f0797..d1bca3c73b6 100644
--- a/spec/frontend/lib/utils/text_markdown_spec.js
+++ b/spec/frontend/lib/utils/text_markdown_spec.js
@@ -1,5 +1,10 @@
import $ from 'jquery';
-import { insertMarkdownText, keypressNoteText } from '~/lib/utils/text_markdown';
+import {
+ insertMarkdownText,
+ keypressNoteText,
+ compositionStartNoteText,
+ compositionEndNoteText,
+} from '~/lib/utils/text_markdown';
import '~/lib/utils/jquery_at_who';
describe('init markdown', () => {
@@ -9,6 +14,9 @@ describe('init markdown', () => {
textArea = document.createElement('textarea');
document.querySelector('body').appendChild(textArea);
textArea.focus();
+
+ // needed for the underlying insertText to work
+ document.execCommand = jest.fn(() => false);
});
afterAll(() => {
@@ -172,7 +180,9 @@ describe('init markdown', () => {
const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' });
beforeEach(() => {
- gon.features = { markdownContinueLists: true };
+ textArea.addEventListener('keydown', keypressNoteText);
+ textArea.addEventListener('compositionstart', compositionStartNoteText);
+ textArea.addEventListener('compositionend', compositionEndNoteText);
});
it.each`
@@ -203,7 +213,6 @@ describe('init markdown', () => {
textArea.value = text;
textArea.setSelectionRange(text.length, text.length);
- textArea.addEventListener('keydown', keypressNoteText);
textArea.dispatchEvent(enterEvent);
expect(textArea.value).toEqual(expected);
@@ -231,7 +240,6 @@ describe('init markdown', () => {
textArea.value = text;
textArea.setSelectionRange(text.length, text.length);
- textArea.addEventListener('keydown', keypressNoteText);
textArea.dispatchEvent(enterEvent);
expect(textArea.value.substr(0, textArea.selectionStart)).toEqual(expected);
@@ -251,7 +259,6 @@ describe('init markdown', () => {
textArea.value = text;
textArea.setSelectionRange(text.length, text.length);
- textArea.addEventListener('keydown', keypressNoteText);
textArea.dispatchEvent(enterEvent);
expect(textArea.value).toEqual(expected);
@@ -267,23 +274,25 @@ describe('init markdown', () => {
textArea.value = text;
textArea.setSelectionRange(add_at, add_at);
- textArea.addEventListener('keydown', keypressNoteText);
textArea.dispatchEvent(enterEvent);
expect(textArea.value).toEqual(expected);
},
);
- it('does nothing if feature flag disabled', () => {
- gon.features = { markdownContinueLists: false };
-
- const text = '- item';
- const expected = '- item';
+ it('does not duplicate a line item for IME characters', () => {
+ const text = '- 日本語';
+ const expected = '- 日本語\n- ';
+ textArea.dispatchEvent(new CompositionEvent('compositionstart'));
textArea.value = text;
+
+ // Press enter to end composition
+ textArea.dispatchEvent(enterEvent);
+ textArea.dispatchEvent(new CompositionEvent('compositionend'));
textArea.setSelectionRange(text.length, text.length);
- textArea.addEventListener('keydown', keypressNoteText);
+ // Press enter to make new line
textArea.dispatchEvent(enterEvent);
expect(textArea.value).toEqual(expected);
diff --git a/spec/frontend/lib/utils/url_utility_spec.js b/spec/frontend/lib/utils/url_utility_spec.js
index 7608cff4c9e..81cf4bd293b 100644
--- a/spec/frontend/lib/utils/url_utility_spec.js
+++ b/spec/frontend/lib/utils/url_utility_spec.js
@@ -1,6 +1,7 @@
import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import * as urlUtils from '~/lib/utils/url_utility';
+import { safeUrls, unsafeUrls } from './mock_data';
const shas = {
valid: [
@@ -575,48 +576,6 @@ describe('URL utility', () => {
});
describe('isSafeUrl', () => {
- const absoluteUrls = [
- 'http://example.org',
- 'http://example.org:8080',
- 'https://example.org',
- 'https://example.org:8080',
- 'https://192.168.1.1',
- ];
-
- const rootRelativeUrls = ['/relative/link'];
-
- const relativeUrls = ['./relative/link', '../relative/link'];
-
- const urlsWithoutHost = ['http://', 'https://', 'https:https:https:'];
-
- /* eslint-disable no-script-url */
- const nonHttpUrls = [
- 'javascript:',
- 'javascript:alert("XSS")',
- 'jav\tascript:alert("XSS");',
- ' &#14; javascript:alert("XSS");',
- 'ftp://192.168.1.1',
- 'file:///',
- 'file:///etc/hosts',
- ];
- /* eslint-enable no-script-url */
-
- // javascript:alert('XSS')
- const encodedJavaScriptUrls = [
- '&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041',
- '&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;',
- '&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29',
- '\\u006A\\u0061\\u0076\\u0061\\u0073\\u0063\\u0072\\u0069\\u0070\\u0074\\u003A\\u0061\\u006C\\u0065\\u0072\\u0074\\u0028\\u0027\\u0058\\u0053\\u0053\\u0027\\u0029',
- ];
-
- const safeUrls = [...absoluteUrls, ...rootRelativeUrls];
- const unsafeUrls = [
- ...relativeUrls,
- ...urlsWithoutHost,
- ...nonHttpUrls,
- ...encodedJavaScriptUrls,
- ];
-
describe('with URL constructor support', () => {
it.each(safeUrls)('returns true for %s', (url) => {
expect(urlUtils.isSafeURL(url)).toBe(true);
@@ -628,6 +587,16 @@ describe('URL utility', () => {
});
});
+ describe('sanitizeUrl', () => {
+ it.each(safeUrls)('returns the url for %s', (url) => {
+ expect(urlUtils.sanitizeUrl(url)).toBe(url);
+ });
+
+ it.each(unsafeUrls)('returns `about:blank` for %s', (url) => {
+ expect(urlUtils.sanitizeUrl(url)).toBe('about:blank');
+ });
+ });
+
describe('getNormalizedURL', () => {
it.each`
url | base | result
diff --git a/spec/frontend/lib/utils/users_cache_spec.js b/spec/frontend/lib/utils/users_cache_spec.js
index 30bdddd8e73..d35ba20f570 100644
--- a/spec/frontend/lib/utils/users_cache_spec.js
+++ b/spec/frontend/lib/utils/users_cache_spec.js
@@ -228,4 +228,29 @@ describe('UsersCache', () => {
expect(userStatus).toBe(dummyUserStatus);
});
});
+
+ describe('updateById', () => {
+ describe('when the user is not cached', () => {
+ it('does nothing and returns undefined', () => {
+ expect(UsersCache.updateById(dummyUserId, { name: 'root' })).toBe(undefined);
+ expect(UsersCache.internalStorage).toStrictEqual({});
+ });
+ });
+
+ describe('when the user is cached', () => {
+ const updatedName = 'has two farms';
+ beforeEach(() => {
+ UsersCache.internalStorage[dummyUserId] = dummyUser;
+ });
+
+ it('updates the user only with the new data', async () => {
+ UsersCache.updateById(dummyUserId, { name: updatedName });
+
+ expect(await UsersCache.retrieveById(dummyUserId)).toStrictEqual({
+ username: dummyUser.username,
+ name: updatedName,
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/listbox/index_spec.js b/spec/frontend/listbox/index_spec.js
index 45659a0e523..07c6cca535a 100644
--- a/spec/frontend/listbox/index_spec.js
+++ b/spec/frontend/listbox/index_spec.js
@@ -3,7 +3,7 @@ import { getAllByRole, getByRole } from '@testing-library/dom';
import { GlDropdown } from '@gitlab/ui';
import { createWrapper } from '@vue/test-utils';
import { initListbox, parseAttributes } from '~/listbox';
-import { getFixture, setHTMLFixture } from 'helpers/fixtures';
+import { getFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
jest.mock('~/lib/utils/url_utility');
@@ -63,6 +63,10 @@ describe('initListbox', () => {
await nextTick();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('returns an instance', () => {
expect(instance).not.toBe(null);
});
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
index d98d7d05c92..f667a590a36 100644
--- a/spec/frontend/logs/components/tokens/token_with_loading_state_spec.js
+++ b/spec/frontend/logs/components/tokens/token_with_loading_state_spec.js
@@ -11,7 +11,10 @@ describe('TokenWithLoadingState', () => {
const initWrapper = (props = {}, options) => {
wrapper = shallowMount(TokenWithLoadingState, {
- propsData: props,
+ propsData: {
+ cursorPosition: 'start',
+ ...props,
+ },
...options,
});
};
diff --git a/spec/frontend/members/components/table/role_dropdown_spec.js b/spec/frontend/members/components/table/role_dropdown_spec.js
index d4d950e99ba..2f1626a7044 100644
--- a/spec/frontend/members/components/table/role_dropdown_spec.js
+++ b/spec/frontend/members/components/table/role_dropdown_spec.js
@@ -4,8 +4,6 @@ import { within } from '@testing-library/dom';
import { mount, createWrapper } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
-import waitForPromises from 'helpers/wait_for_promises';
-import { BV_DROPDOWN_SHOW } from '~/lib/utils/constants';
import RoleDropdown from '~/members/components/table/role_dropdown.vue';
import { MEMBER_TYPES } from '~/members/constants';
import { member } from '../../mock_data';
@@ -70,13 +68,10 @@ describe('RoleDropdown', () => {
});
describe('when dropdown is open', () => {
- beforeEach((done) => {
+ beforeEach(() => {
createComponent();
- findDropdownToggle().trigger('click');
- wrapper.vm.$root.$on(BV_DROPDOWN_SHOW, () => {
- done();
- });
+ return findDropdownToggle().trigger('click');
});
it('renders all valid roles', () => {
@@ -95,14 +90,14 @@ describe('RoleDropdown', () => {
});
describe('when dropdown item is selected', () => {
- it('does nothing if the item selected was already selected', () => {
- getDropdownItemByText('Owner').trigger('click');
+ it('does nothing if the item selected was already selected', async () => {
+ await getDropdownItemByText('Owner').trigger('click');
expect(actions.updateMemberRole).not.toHaveBeenCalled();
});
- it('calls `updateMemberRole` Vuex action', () => {
- getDropdownItemByText('Developer').trigger('click');
+ it('calls `updateMemberRole` Vuex action', async () => {
+ await getDropdownItemByText('Developer').trigger('click');
expect(actions.updateMemberRole).toHaveBeenCalledWith(expect.any(Object), {
memberId: member.id,
@@ -111,21 +106,19 @@ describe('RoleDropdown', () => {
});
it('displays toast when successful', async () => {
- getDropdownItemByText('Developer').trigger('click');
+ await getDropdownItemByText('Developer').trigger('click');
- await waitForPromises();
+ await nextTick();
expect($toast.show).toHaveBeenCalledWith('Role updated successfully.');
});
it('disables dropdown while waiting for `updateMemberRole` to resolve', async () => {
- getDropdownItemByText('Developer').trigger('click');
-
- await nextTick();
+ await getDropdownItemByText('Developer').trigger('click');
expect(findDropdown().props('disabled')).toBe(true);
- await waitForPromises();
+ await nextTick();
expect(findDropdown().props('disabled')).toBe(false);
});
diff --git a/spec/frontend/merge_conflicts/store/actions_spec.js b/spec/frontend/merge_conflicts/store/actions_spec.js
index 1b6a0f9e977..7cee6576b53 100644
--- a/spec/frontend/merge_conflicts/store/actions_spec.js
+++ b/spec/frontend/merge_conflicts/store/actions_spec.js
@@ -1,6 +1,6 @@
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import { useMockLocationHelper } from 'helpers/mock_window_location_helper';
import testAction from 'helpers/vuex_action_helper';
import createFlash from '~/flash';
@@ -11,7 +11,7 @@ import { restoreFileLinesState, markLine, decorateFiles } from '~/merge_conflict
jest.mock('~/flash.js');
jest.mock('~/merge_conflicts/utils');
-jest.mock('js-cookie');
+jest.mock('~/lib/utils/cookies');
describe('merge conflicts actions', () => {
let mock;
diff --git a/spec/frontend/merge_request_spec.js b/spec/frontend/merge_request_spec.js
index 9229b353685..bcf64204c7a 100644
--- a/spec/frontend/merge_request_spec.js
+++ b/spec/frontend/merge_request_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'spec/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
@@ -11,7 +12,7 @@ describe('MergeRequest', () => {
let mock;
beforeEach(() => {
- loadFixtures('merge_requests/merge_request_with_task_list.html');
+ loadHTMLFixture('merge_requests/merge_request_with_task_list.html');
jest.spyOn(axios, 'patch');
mock = new MockAdapter(axios);
@@ -26,6 +27,7 @@ describe('MergeRequest', () => {
afterEach(() => {
mock.restore();
+ resetHTMLFixture();
});
it('modifies the Markdown field', async () => {
@@ -103,7 +105,7 @@ describe('MergeRequest', () => {
describe('hideCloseButton', () => {
describe('merge request of current_user', () => {
beforeEach(() => {
- loadFixtures('merge_requests/merge_request_of_current_user.html');
+ loadHTMLFixture('merge_requests/merge_request_of_current_user.html');
test.el = document.querySelector('.js-issuable-actions');
MergeRequest.hideCloseButton();
});
diff --git a/spec/frontend/merge_request_tabs_spec.js b/spec/frontend/merge_request_tabs_spec.js
index 5c24a070342..ccbc61ea658 100644
--- a/spec/frontend/merge_request_tabs_spec.js
+++ b/spec/frontend/merge_request_tabs_spec.js
@@ -1,5 +1,6 @@
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 axios from '~/lib/utils/axios_utils';
import MergeRequestTabs from '~/merge_request_tabs';
@@ -79,7 +80,7 @@ describe('MergeRequestTabs', () => {
let tabUrl;
beforeEach(() => {
- loadFixtures('merge_requests/merge_request_with_task_list.html');
+ loadHTMLFixture('merge_requests/merge_request_with_task_list.html');
tabUrl = $('.commits-tab a').attr('href');
@@ -97,6 +98,10 @@ describe('MergeRequestTabs', () => {
};
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('meta click', () => {
let metakeyEvent;
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 28039321428..a93035cc53a 100644
--- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
+++ b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap
@@ -17,6 +17,7 @@ exports[`Dashboard template matches the default snapshot 1`] = `
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
+ showicon="true"
title="Feature deprecation"
variant="warning"
>
diff --git a/spec/frontend/monitoring/components/dashboard_panel_spec.js b/spec/frontend/monitoring/components/dashboard_panel_spec.js
index 7bd062b81f1..1f9eb03b5d4 100644
--- a/spec/frontend/monitoring/components/dashboard_panel_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_panel_spec.js
@@ -65,6 +65,7 @@ describe('Dashboard Panel', () => {
},
store,
mocks,
+ provide: { glFeatures: { monitorLogging: true } },
...options,
});
};
@@ -379,6 +380,21 @@ describe('Dashboard Panel', () => {
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;
@@ -488,15 +504,7 @@ describe('Dashboard Panel', () => {
store.registerModule(mockNamespace, monitoringDashboard);
store.state.embedGroup.modules.push(mockNamespace);
- wrapper = shallowMount(DashboardPanel, {
- propsData: {
- graphData,
- settingsPath: dashboardProps.settingsPath,
- namespace: mockNamespace,
- },
- store,
- mocks,
- });
+ createWrapper({ namespace: mockNamespace });
});
it('handles namespaced time range and logs path state', async () => {
diff --git a/spec/frontend/new_branch_spec.js b/spec/frontend/new_branch_spec.js
index 66b28a8c0dc..e4f4b3fa5b5 100644
--- a/spec/frontend/new_branch_spec.js
+++ b/spec/frontend/new_branch_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import NewBranchForm from '~/new_branch_form';
describe('Branch', () => {
@@ -18,11 +19,15 @@ describe('Branch', () => {
}
beforeEach(() => {
- loadFixtures('branches/new_branch.html');
+ loadHTMLFixture('branches/new_branch.html');
$('form').on('submit', (e) => e.preventDefault());
testContext.form = new NewBranchForm($('.js-create-branch-form'), []);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it("can't start with a dot", () => {
fillNameWith('.foo');
expectToHaveError("can't start with '.'");
diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js
index a605edc4357..fb42e4d1d84 100644
--- a/spec/frontend/notes/components/comment_form_spec.js
+++ b/spec/frontend/notes/components/comment_form_spec.js
@@ -248,13 +248,21 @@ describe('issue_comment_form component', () => {
describe('textarea', () => {
describe('general', () => {
- it('should render textarea with placeholder', () => {
- mountComponent({ mountFunction: mount });
+ it.each`
+ noteType | confidential | placeholder
+ ${'comment'} | ${false} | ${'Write a comment or drag your files here…'}
+ ${'internal note'} | ${true} | ${'Write an internal note or drag your files here…'}
+ `(
+ 'should render textarea with placeholder for $noteType',
+ ({ confidential, placeholder }) => {
+ mountComponent({
+ mountFunction: mount,
+ initialData: { noteIsConfidential: confidential },
+ });
- expect(findTextArea().attributes('placeholder')).toBe(
- 'Write a comment or drag your files here…',
- );
- });
+ expect(findTextArea().attributes('placeholder')).toBe(placeholder);
+ },
+ );
it('should make textarea disabled while requesting', async () => {
mountComponent({ mountFunction: mount });
@@ -380,6 +388,20 @@ describe('issue_comment_form component', () => {
expect(findCloseReopenButton().text()).toBe('Close issue');
});
+ it.each`
+ confidential | buttonText
+ ${false} | ${'Comment'}
+ ${true} | ${'Add internal note'}
+ `('renders comment button with text "$buttonText"', ({ confidential, buttonText }) => {
+ mountComponent({
+ mountFunction: mount,
+ noteableData: createNotableDataMock({ confidential }),
+ initialData: { noteIsConfidential: confidential },
+ });
+
+ expect(findCommentButton().text()).toBe(buttonText);
+ });
+
it('should render comment button as disabled', () => {
mountComponent();
diff --git a/spec/frontend/notes/components/comment_type_dropdown_spec.js b/spec/frontend/notes/components/comment_type_dropdown_spec.js
index 8ac6144e5c8..cabf551deba 100644
--- a/spec/frontend/notes/components/comment_type_dropdown_spec.js
+++ b/spec/frontend/notes/components/comment_type_dropdown_spec.js
@@ -28,18 +28,42 @@ describe('CommentTypeDropdown component', () => {
wrapper.destroy();
});
- it('Should label action button "Comment" and correct dropdown item checked when selected', () => {
+ it.each`
+ isInternalNote | buttonText
+ ${false} | ${COMMENT_FORM.comment}
+ ${true} | ${COMMENT_FORM.internalComment}
+ `(
+ 'Should label action button as "$buttonText" for comment when `isInternalNote` is $isInternalNote',
+ ({ isInternalNote, buttonText }) => {
+ mountComponent({ props: { noteType: constants.COMMENT, isInternalNote } });
+
+ expect(findCommentGlDropdown().props()).toMatchObject({ text: buttonText });
+ },
+ );
+
+ it('Should set correct dropdown item checked when comment is selected', () => {
mountComponent({ props: { noteType: constants.COMMENT } });
- expect(findCommentGlDropdown().props()).toMatchObject({ text: COMMENT_FORM.comment });
expect(findCommentDropdownOption().props()).toMatchObject({ isChecked: true });
expect(findDiscussionDropdownOption().props()).toMatchObject({ isChecked: false });
});
- it('Should label action button "Start Thread" and correct dropdown item option checked when selected', () => {
+ it.each`
+ isInternalNote | buttonText
+ ${false} | ${COMMENT_FORM.startThread}
+ ${true} | ${COMMENT_FORM.startInternalThread}
+ `(
+ 'Should label action button as "$buttonText" for discussion when `isInternalNote` is $isInternalNote',
+ ({ isInternalNote, buttonText }) => {
+ mountComponent({ props: { noteType: constants.DISCUSSION, isInternalNote } });
+
+ expect(findCommentGlDropdown().props()).toMatchObject({ text: buttonText });
+ },
+ );
+
+ it('Should set correct dropdown item option checked when discussion is selected', () => {
mountComponent({ props: { noteType: constants.DISCUSSION } });
- expect(findCommentGlDropdown().props()).toMatchObject({ text: COMMENT_FORM.startThread });
expect(findCommentDropdownOption().props()).toMatchObject({ isChecked: false });
expect(findDiscussionDropdownOption().props()).toMatchObject({ isChecked: true });
});
diff --git a/spec/frontend/notes/components/discussion_counter_spec.js b/spec/frontend/notes/components/discussion_counter_spec.js
index a856d002d2e..f016cef18e6 100644
--- a/spec/frontend/notes/components/discussion_counter_spec.js
+++ b/spec/frontend/notes/components/discussion_counter_spec.js
@@ -45,7 +45,7 @@ describe('DiscussionCounter component', () => {
describe('has no discussions', () => {
it('does not render', () => {
- wrapper = shallowMount(DiscussionCounter, { store });
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(false);
});
@@ -55,7 +55,7 @@ describe('DiscussionCounter component', () => {
it('does not render', () => {
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [{ ...discussionMock, resolvable: false }]);
store.dispatch('updateResolvableDiscussionsCounts');
- wrapper = shallowMount(DiscussionCounter, { store });
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(false);
});
@@ -75,20 +75,34 @@ describe('DiscussionCounter component', () => {
it('renders', () => {
updateStore();
- wrapper = shallowMount(DiscussionCounter, { store });
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
expect(wrapper.find({ ref: 'discussionCounter' }).exists()).toBe(true);
});
it.each`
- title | resolved | isActive | groupLength
- ${'not allResolved'} | ${false} | ${false} | ${3}
- ${'allResolved'} | ${true} | ${true} | ${1}
- `('renders correctly if $title', ({ resolved, isActive, groupLength }) => {
+ blocksMerge | color
+ ${true} | ${'gl-bg-orange-50'}
+ ${false} | ${'gl-bg-gray-50'}
+ `(
+ 'changes background color to $color if blocksMerge is $blocksMerge',
+ ({ blocksMerge, color }) => {
+ updateStore();
+ store.state.unresolvedDiscussionsCount = 1;
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge } });
+
+ expect(wrapper.find('[data-testid="discussions-counter-text"]').classes()).toContain(color);
+ },
+ );
+
+ it.each`
+ title | resolved | groupLength
+ ${'not allResolved'} | ${false} | ${4}
+ ${'allResolved'} | ${true} | ${1}
+ `('renders correctly if $title', ({ resolved, groupLength }) => {
updateStore({ resolvable: true, resolved });
- wrapper = shallowMount(DiscussionCounter, { store });
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
- expect(wrapper.find(`.is-active`).exists()).toBe(isActive);
expect(wrapper.findAll(GlButton)).toHaveLength(groupLength);
});
});
@@ -99,7 +113,7 @@ describe('DiscussionCounter component', () => {
const discussion = { ...discussionMock, expanded };
store.commit(types.ADD_OR_UPDATE_DISCUSSIONS, [discussion]);
store.dispatch('updateResolvableDiscussionsCounts');
- wrapper = shallowMount(DiscussionCounter, { store });
+ wrapper = shallowMount(DiscussionCounter, { store, propsData: { blocksMerge: true } });
toggleAllButton = wrapper.find('.toggle-all-discussions-btn');
};
@@ -117,26 +131,26 @@ describe('DiscussionCounter component', () => {
updateStoreWithExpanded(true);
expect(wrapper.vm.allExpanded).toBe(true);
- expect(toggleAllButton.props('icon')).toBe('angle-up');
+ expect(toggleAllButton.props('icon')).toBe('collapse');
toggleAllButton.vm.$emit('click');
await nextTick();
expect(wrapper.vm.allExpanded).toBe(false);
- expect(toggleAllButton.props('icon')).toBe('angle-down');
+ expect(toggleAllButton.props('icon')).toBe('expand');
});
it('expands all discussions if collapsed', async () => {
updateStoreWithExpanded(false);
expect(wrapper.vm.allExpanded).toBe(false);
- expect(toggleAllButton.props('icon')).toBe('angle-down');
+ expect(toggleAllButton.props('icon')).toBe('expand');
toggleAllButton.vm.$emit('click');
await nextTick();
expect(wrapper.vm.allExpanded).toBe(true);
- expect(toggleAllButton.props('icon')).toBe('angle-up');
+ expect(toggleAllButton.props('icon')).toBe('collapse');
});
});
});
diff --git a/spec/frontend/notes/components/note_body_spec.js b/spec/frontend/notes/components/note_body_spec.js
index 63f3cd865d5..378dcb97fab 100644
--- a/spec/frontend/notes/components/note_body_spec.js
+++ b/spec/frontend/notes/components/note_body_spec.js
@@ -1,9 +1,10 @@
import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { suggestionCommitMessage } from '~/diffs/store/getters';
-import noteBody from '~/notes/components/note_body.vue';
+import NoteBody from '~/notes/components/note_body.vue';
+import NoteAwardsList from '~/notes/components/note_awards_list.vue';
+import NoteForm from '~/notes/components/note_form.vue';
import createStore from '~/notes/stores';
import notes from '~/notes/stores/modules/index';
@@ -11,68 +12,89 @@ import Suggestions from '~/vue_shared/components/markdown/suggestions.vue';
import { noteableDataMock, notesDataMock, note } from '../mock_data';
+const createComponent = ({
+ props = {},
+ noteableData = noteableDataMock,
+ notesData = notesDataMock,
+ store = null,
+} = {}) => {
+ let mockStore;
+
+ if (!store) {
+ mockStore = createStore();
+
+ mockStore.dispatch('setNoteableData', noteableData);
+ mockStore.dispatch('setNotesData', notesData);
+ }
+
+ return shallowMount(NoteBody, {
+ store: mockStore || store,
+ propsData: {
+ note,
+ canEdit: true,
+ canAwardEmoji: true,
+ isEditing: false,
+ ...props,
+ },
+ });
+};
+
describe('issue_note_body component', () => {
- let store;
- let vm;
+ let wrapper;
beforeEach(() => {
- const Component = Vue.extend(noteBody);
-
- store = createStore();
- store.dispatch('setNoteableData', noteableDataMock);
- store.dispatch('setNotesData', notesDataMock);
-
- vm = new Component({
- store,
- propsData: {
- note,
- canEdit: true,
- canAwardEmoji: true,
- },
- }).$mount();
+ wrapper = createComponent();
});
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
it('should render the note', () => {
- expect(vm.$el.querySelector('.note-text').innerHTML).toEqual(note.note_html);
+ expect(wrapper.find('.note-text').html()).toContain(note.note_html);
});
it('should render awards list', () => {
- expect(vm.$el.querySelector('.js-awards-block button [data-name="baseball"]')).not.toBeNull();
- expect(vm.$el.querySelector('.js-awards-block button [data-name="bath_tone3"]')).not.toBeNull();
+ expect(wrapper.findComponent(NoteAwardsList).exists()).toBe(true);
});
describe('isEditing', () => {
- beforeEach(async () => {
- vm.isEditing = true;
- await nextTick();
+ beforeEach(() => {
+ wrapper = createComponent({ props: { isEditing: true } });
});
it('renders edit form', () => {
- expect(vm.$el.querySelector('textarea.js-task-list-field')).not.toBeNull();
+ expect(wrapper.findComponent(NoteForm).exists()).toBe(true);
+ });
+
+ it.each`
+ confidential | buttonText
+ ${false} | ${'Save comment'}
+ ${true} | ${'Save internal note'}
+ `('renders save button with text "$buttonText"', ({ confidential, buttonText }) => {
+ wrapper = createComponent({ props: { note: { ...note, confidential }, isEditing: true } });
+
+ expect(wrapper.findComponent(NoteForm).props('saveButtonTitle')).toBe(buttonText);
});
it('adds autosave', () => {
const autosaveKey = `autosave/Note/${note.noteable_type}/${note.id}`;
- expect(vm.autosave.key).toEqual(autosaveKey);
+ // While we discourage testing wrapper props
+ // here we aren't testing a component prop
+ // but instead an instance object property
+ // which is defined in `app/assets/javascripts/notes/mixins/autosave.js`
+ expect(wrapper.vm.autosave.key).toEqual(autosaveKey);
});
});
describe('commitMessage', () => {
- let wrapper;
-
- Vue.use(Vuex);
-
beforeEach(() => {
const notesStore = notes();
notesStore.state.notes = {};
- store = new Vuex.Store({
+ const store = new Vuex.Store({
modules: {
notes: notesStore,
diffs: {
@@ -98,9 +120,9 @@ describe('issue_note_body component', () => {
},
});
- wrapper = shallowMount(noteBody, {
+ wrapper = createComponent({
store,
- propsData: {
+ props: {
note: { ...note, suggestions: [12345] },
canEdit: true,
file: { file_path: 'abc' },
diff --git a/spec/frontend/notes/components/note_form_spec.js b/spec/frontend/notes/components/note_form_spec.js
index b709141f4ac..252c24d1117 100644
--- a/spec/frontend/notes/components/note_form_spec.js
+++ b/spec/frontend/notes/components/note_form_spec.js
@@ -6,7 +6,7 @@ import { getDraft, updateDraft } from '~/lib/utils/autosave';
import NoteForm from '~/notes/components/note_form.vue';
import createStore from '~/notes/stores';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
-import { noteableDataMock, notesDataMock, discussionMock } from '../mock_data';
+import { noteableDataMock, notesDataMock, discussionMock, note } from '../mock_data';
jest.mock('~/lib/utils/autosave');
@@ -45,8 +45,6 @@ describe('issue_note_form component', () => {
noteBody: 'Magni suscipit eius consectetur enim et ex et commodi.',
noteId: '545',
};
-
- gon.features = { markdownContinueLists: true };
});
afterEach(() => {
@@ -116,6 +114,23 @@ describe('issue_note_form component', () => {
expect(textarea.attributes('data-supports-quick-actions')).toBe('true');
});
+ it.each`
+ confidential | placeholder
+ ${false} | ${'Write a comment or drag your files here…'}
+ ${true} | ${'Write an internal note or drag your files here…'}
+ `(
+ 'should set correct textarea placeholder text when discussion confidentiality is $confidential',
+ ({ confidential, placeholder }) => {
+ props.note = {
+ ...note,
+ confidential,
+ };
+ wrapper = createComponentWrapper();
+
+ expect(wrapper.find('textarea').attributes('placeholder')).toBe(placeholder);
+ },
+ );
+
it('should link to markdown docs', () => {
const { markdownDocsPath } = notesDataMock;
const markdownField = wrapper.find(MarkdownField);
diff --git a/spec/frontend/notes/components/note_header_spec.js b/spec/frontend/notes/components/note_header_spec.js
index 3513b562e0a..310a470aa18 100644
--- a/spec/frontend/notes/components/note_header_spec.js
+++ b/spec/frontend/notes/components/note_header_spec.js
@@ -21,7 +21,7 @@ describe('NoteHeader component', () => {
const findActionText = () => wrapper.find({ ref: 'actionText' });
const findTimestampLink = () => wrapper.find({ ref: 'noteTimestampLink' });
const findTimestamp = () => wrapper.find({ ref: 'noteTimestamp' });
- const findConfidentialIndicator = () => wrapper.findByTestId('confidentialIndicator');
+ const findConfidentialIndicator = () => wrapper.findByTestId('internalNoteIndicator');
const findSpinner = () => wrapper.find({ ref: 'spinner' });
const findAuthorStatus = () => wrapper.find({ ref: 'authorStatus' });
@@ -297,7 +297,7 @@ describe('NoteHeader component', () => {
createComponent({ isConfidential: true, noteableType: 'issue' });
expect(findConfidentialIndicator().attributes('title')).toBe(
- 'This comment is confidential and only visible to project members',
+ 'This internal note will always remain confidential',
);
});
});
diff --git a/spec/frontend/notes/components/notes_app_spec.js b/spec/frontend/notes/components/notes_app_spec.js
index e227af88d3f..413ee815906 100644
--- a/spec/frontend/notes/components/notes_app_spec.js
+++ b/spec/frontend/notes/components/notes_app_spec.js
@@ -2,6 +2,7 @@ import { mount, shallowMount } from '@vue/test-utils';
import AxiosMockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import setWindowLocation from 'helpers/set_window_location_helper';
import { setTestTimeout } from 'helpers/timeout';
import waitForPromises from 'helpers/wait_for_promises';
@@ -92,13 +93,17 @@ describe('note_app', () => {
describe('set data', () => {
beforeEach(() => {
- setFixtures('<div class="js-discussions-count"></div>');
+ setHTMLFixture('<div class="js-discussions-count"></div>');
axiosMock.onAny().reply(200, []);
wrapper = mountComponent();
return waitForDiscussionsRequest();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should set notes data', () => {
expect(store.state.notesData).toEqual(mockData.notesDataMock);
});
@@ -122,13 +127,17 @@ describe('note_app', () => {
describe('render', () => {
beforeEach(() => {
- setFixtures('<div class="js-discussions-count"></div>');
+ setHTMLFixture('<div class="js-discussions-count"></div>');
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
wrapper = mountComponent();
return waitForDiscussionsRequest();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should render list of notes', () => {
const note =
mockData.INDIVIDUAL_NOTE_RESPONSE_MAP.GET[
@@ -160,7 +169,7 @@ describe('note_app', () => {
describe('render with comments disabled', () => {
beforeEach(() => {
- setFixtures('<div class="js-discussions-count"></div>');
+ setHTMLFixture('<div class="js-discussions-count"></div>');
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
store.state.commentsDisabled = true;
@@ -168,6 +177,10 @@ describe('note_app', () => {
return waitForDiscussionsRequest();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should not render form when commenting is disabled', () => {
expect(wrapper.find('.js-main-target-form').exists()).toBe(false);
});
@@ -179,7 +192,7 @@ describe('note_app', () => {
describe('timeline view', () => {
beforeEach(() => {
- setFixtures('<div class="js-discussions-count"></div>');
+ setHTMLFixture('<div class="js-discussions-count"></div>');
axiosMock.onAny().reply(mockData.getIndividualNoteResponse);
store.state.commentsDisabled = false;
@@ -189,6 +202,10 @@ describe('note_app', () => {
return waitForDiscussionsRequest();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should not render comments form', () => {
expect(wrapper.find('.js-main-target-form').exists()).toBe(false);
});
@@ -196,12 +213,15 @@ describe('note_app', () => {
describe('while fetching data', () => {
beforeEach(() => {
- setFixtures('<div class="js-discussions-count"></div>');
+ setHTMLFixture('<div class="js-discussions-count"></div>');
axiosMock.onAny().reply(200, []);
wrapper = mountComponent();
});
- afterEach(() => waitForDiscussionsRequest());
+ afterEach(() => {
+ waitForDiscussionsRequest();
+ resetHTMLFixture();
+ });
it('renders skeleton notes', () => {
expect(wrapper.find('.animation-container').exists()).toBe(true);
diff --git a/spec/frontend/notes/deprecated_notes_spec.js b/spec/frontend/notes/deprecated_notes_spec.js
index 7193475c96a..40b124b9029 100644
--- a/spec/frontend/notes/deprecated_notes_spec.js
+++ b/spec/frontend/notes/deprecated_notes_spec.js
@@ -3,6 +3,7 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
import '~/behaviors/markdown/render_gfm';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { createSpyObj } from 'helpers/jest_helpers';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
@@ -33,7 +34,7 @@ gl.utils.disableButtonIfEmptyField = () => {};
// eslint-disable-next-line jest/no-disabled-tests
describe.skip('Old Notes (~/deprecated_notes.js)', () => {
beforeEach(() => {
- loadFixtures(fixture);
+ loadHTMLFixture(fixture);
// Re-declare this here so that test_setup.js#beforeEach() doesn't
// overwrite it.
@@ -50,12 +51,14 @@ describe.skip('Old Notes (~/deprecated_notes.js)', () => {
setTestTimeoutOnce(4000);
});
- afterEach(() => {
+ afterEach(async () => {
// The Notes component sets a polling interval. Clear it after every run.
// Make sure to use jest.runOnlyPendingTimers() instead of runAllTimers().
jest.clearAllTimers();
- return axios.waitForAll().finally(() => mockAxios.restore());
+ await axios.waitForAll().finally(() => mockAxios.restore());
+
+ resetHTMLFixture();
});
it('loads the Notes class into the DOM', () => {
@@ -629,7 +632,7 @@ describe.skip('Old Notes (~/deprecated_notes.js)', () => {
let $notesContainer;
beforeEach(() => {
- loadFixtures('commit/show.html');
+ loadHTMLFixture('commit/show.html');
mockAxios.onPost(NOTES_POST_PATH).reply(200, note);
new Notes('', []);
diff --git a/spec/frontend/notes/mixins/discussion_navigation_spec.js b/spec/frontend/notes/mixins/discussion_navigation_spec.js
index aba80789a01..35b3dec6298 100644
--- a/spec/frontend/notes/mixins/discussion_navigation_spec.js
+++ b/spec/frontend/notes/mixins/discussion_navigation_spec.js
@@ -59,6 +59,7 @@ describe('Discussion navigation mixin', () => {
diffs: {
namespaced: true,
actions: { scrollToFile },
+ state: { diffFiles: [] },
},
},
});
diff --git a/spec/frontend/notes/mock_data.js b/spec/frontend/notes/mock_data.js
index a4aeeda48d8..c7a6ca5eae3 100644
--- a/spec/frontend/notes/mock_data.js
+++ b/spec/frontend/notes/mock_data.js
@@ -1171,7 +1171,7 @@ export const discussion1 = {
resolved: false,
active: true,
diff_file: {
- file_path: 'about.md',
+ file_identifier_hash: 'discfile1',
},
position: {
new_line: 50,
@@ -1189,7 +1189,7 @@ export const resolvedDiscussion1 = {
resolvable: true,
resolved: true,
diff_file: {
- file_path: 'about.md',
+ file_identifier_hash: 'discfile1',
},
position: {
new_line: 50,
@@ -1208,7 +1208,7 @@ export const discussion2 = {
resolved: false,
active: true,
diff_file: {
- file_path: 'README.md',
+ file_identifier_hash: 'discfile2',
},
position: {
new_line: null,
@@ -1227,7 +1227,7 @@ export const discussion3 = {
active: true,
resolved: false,
diff_file: {
- file_path: 'README.md',
+ file_identifier_hash: 'discfile3',
},
position: {
new_line: 21,
@@ -1240,6 +1240,12 @@ export const discussion3 = {
],
};
+export const authoritativeDiscussionFile = {
+ id: 'abc',
+ file_identifier_hash: 'discfile1',
+ order: 0,
+};
+
export const unresolvableDiscussion = {
resolvable: false,
};
diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js
index 75e7756cd6b..ecb213590ad 100644
--- a/spec/frontend/notes/stores/actions_spec.js
+++ b/spec/frontend/notes/stores/actions_spec.js
@@ -1,4 +1,5 @@
import AxiosMockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import testAction from 'helpers/vuex_action_helper';
import { TEST_HOST } from 'spec/test_constants';
import Api from '~/api';
@@ -51,7 +52,7 @@ describe('Actions Notes Store', () => {
axiosMock = new AxiosMockAdapter(axios);
// This is necessary as we query Close issue button at the top of issue page when clicking bottom button
- setFixtures(
+ setHTMLFixture(
'<div class="detail-page-header-actions"><button class="btn-close btn-grouped"></button></div>',
);
});
@@ -59,6 +60,7 @@ describe('Actions Notes Store', () => {
afterEach(() => {
resetStore(store);
axiosMock.restore();
+ resetHTMLFixture();
});
describe('setNotesData', () => {
@@ -252,7 +254,9 @@ describe('Actions Notes Store', () => {
jest.advanceTimersByTime(time);
}
- return new Promise((resolve) => requestAnimationFrame(resolve));
+ return new Promise((resolve) => {
+ requestAnimationFrame(resolve);
+ });
};
const advanceXMoreIntervals = async (number) => {
const timeoutLength = pollInterval * number;
diff --git a/spec/frontend/notes/stores/getters_spec.js b/spec/frontend/notes/stores/getters_spec.js
index 9a11fdba508..6d078dcefcf 100644
--- a/spec/frontend/notes/stores/getters_spec.js
+++ b/spec/frontend/notes/stores/getters_spec.js
@@ -12,6 +12,7 @@ import {
discussion2,
discussion3,
resolvedDiscussion1,
+ authoritativeDiscussionFile,
unresolvableDiscussion,
draftComments,
draftReply,
@@ -26,6 +27,23 @@ const createDiscussionNeighborParams = (discussionId, diffOrder, step) => ({
});
const asDraftDiscussion = (x) => ({ ...x, individual_note: true });
+const createRootState = () => {
+ return {
+ diffs: {
+ diffFiles: [
+ { ...authoritativeDiscussionFile },
+ {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc2', file_identifier_hash: 'discfile2', order: 1 },
+ },
+ {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc3', file_identifier_hash: 'discfile3', order: 2 },
+ },
+ ],
+ },
+ };
+};
describe('Getters Notes Store', () => {
let state;
@@ -226,20 +244,84 @@ describe('Getters Notes Store', () => {
const localGetters = {
allResolvableDiscussions: [discussion3, discussion1, discussion2],
};
+ const rootState = createRootState();
- expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters, rootState)).toEqual([
'abc1',
'abc2',
'abc3',
]);
});
+ // This is the same test as above, but it exercises the sorting algorithm
+ // for a "strange" Diff File ordering. The intent is to ensure that even if lots
+ // of shuffling has to occur, everything still works
+
+ it('should return all discussions IDs in unusual diff order', () => {
+ const localGetters = {
+ allResolvableDiscussions: [discussion3, discussion1, discussion2],
+ };
+ const rootState = {
+ diffs: {
+ diffFiles: [
+ // 2 is first, but should sort 2nd
+ {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc2', file_identifier_hash: 'discfile2', order: 1 },
+ },
+ // 1 is second, but should sort 3rd
+ { ...authoritativeDiscussionFile, ...{ order: 2 } },
+ // 3 is third, but should sort 1st
+ {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc3', file_identifier_hash: 'discfile3', order: 0 },
+ },
+ ],
+ },
+ };
+
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters, rootState)).toEqual([
+ 'abc3',
+ 'abc2',
+ 'abc1',
+ ]);
+ });
+
+ it("should use the discussions array order if the files don't have explicit order values", () => {
+ const localGetters = {
+ allResolvableDiscussions: [discussion3, discussion1, discussion2], // This order is used!
+ };
+ const auth1 = { ...authoritativeDiscussionFile };
+ const auth2 = {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc2', file_identifier_hash: 'discfile2' },
+ };
+ const auth3 = {
+ ...authoritativeDiscussionFile,
+ ...{ id: 'abc3', file_identifier_hash: 'discfile3' },
+ };
+ const rootState = {
+ diffs: { diffFiles: [auth2, auth1, auth3] }, // This order is not used!
+ };
+
+ delete auth1.order;
+ delete auth2.order;
+ delete auth3.order;
+
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters, rootState)).toEqual([
+ 'abc3',
+ 'abc1',
+ 'abc2',
+ ]);
+ });
+
it('should return empty array if all discussions have been resolved', () => {
const localGetters = {
allResolvableDiscussions: [resolvedDiscussion1],
};
+ const rootState = createRootState();
- expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([]);
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters, rootState)).toEqual([]);
});
});
diff --git a/spec/frontend/oauth_remember_me_spec.js b/spec/frontend/oauth_remember_me_spec.js
index 3187cbf6547..1fa0e0aa8f6 100644
--- a/spec/frontend/oauth_remember_me_spec.js
+++ b/spec/frontend/oauth_remember_me_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import OAuthRememberMe from '~/pages/sessions/new/oauth_remember_me';
describe('OAuthRememberMe', () => {
@@ -7,11 +8,15 @@ describe('OAuthRememberMe', () => {
};
beforeEach(() => {
- loadFixtures('static/oauth_remember_me.html');
+ loadHTMLFixture('static/oauth_remember_me.html');
new OAuthRememberMe({ container: $('#oauth-container') }).bindEvents();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('adds the "remember_me" query parameter to all OAuth login buttons', () => {
$('#oauth-container #remember_me').click();
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 a8d0d15007c..ca666e38291 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
@@ -1,7 +1,7 @@
import { GlDropdownItem, GlIcon, GlDropdown } from '@gitlab/ui';
-import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
import { numberToHumanSize } from '~/lib/utils/number_utils';
import { useFakeDate } from 'helpers/fake_date';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -28,7 +28,6 @@ import { imageTagsCountMock } from '../../mock_data';
describe('Details Header', () => {
let wrapper;
let apolloProvider;
- let localVue;
const defaultImage = {
name: 'foo',
@@ -64,28 +63,18 @@ describe('Details Header', () => {
const mountComponent = ({
propsData = { image: defaultImage },
resolver = jest.fn().mockResolvedValue(imageTagsCountMock()),
- $apollo = undefined,
} = {}) => {
- const mocks = {};
+ Vue.use(VueApollo);
- if ($apollo) {
- mocks.$apollo = $apollo;
- } else {
- localVue = createLocalVue();
- localVue.use(VueApollo);
-
- const requestHandlers = [[getContainerRepositoryMetadata, resolver]];
- apolloProvider = createMockApollo(requestHandlers);
- }
+ const requestHandlers = [[getContainerRepositoryMetadata, resolver]];
+ apolloProvider = createMockApollo(requestHandlers);
wrapper = shallowMount(component, {
- localVue,
apolloProvider,
propsData,
directives: {
GlTooltip: createMockDirective(),
},
- mocks,
stubs: {
TitleArea,
GlDropdown,
@@ -98,7 +87,6 @@ describe('Details Header', () => {
// if we want to mix createMockApollo and manual mocks we need to reset everything
wrapper.destroy();
apolloProvider = undefined;
- localVue = undefined;
wrapper = null;
});
@@ -194,10 +182,7 @@ describe('Details Header', () => {
describe('metadata items', () => {
describe('tags count', () => {
it('displays "-- tags" while loading', async () => {
- // here we are forced to mock apollo because `waitForMetadataItems` waits
- // for two ticks, de facto allowing the promise to resolve, so there is
- // no way to catch the component as both rendered and in loading state
- mountComponent({ $apollo: { queries: { containerRepository: { loading: true } } } });
+ mountComponent();
await waitForMetadataItems();
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 e8ddad2d8ca..af5723267f4 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
@@ -1,8 +1,8 @@
-import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
+import { GlLink, GlPopover, GlSprintf } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { helpPagePath } from '~/helpers/help_page_helper';
import CleanupStatus from '~/packages_and_registries/container_registry/explorer/components/list_page/cleanup_status.vue';
import {
- CLEANUP_TIMED_OUT_ERROR_MESSAGE,
CLEANUP_STATUS_SCHEDULED,
CLEANUP_STATUS_ONGOING,
CLEANUP_STATUS_UNFINISHED,
@@ -17,12 +17,20 @@ describe('cleanup_status', () => {
const findMainIcon = () => wrapper.findByTestId('main-icon');
const findExtraInfoIcon = () => wrapper.findByTestId('extra-info');
+ const findPopover = () => wrapper.findComponent(GlPopover);
+
+ const cleanupPolicyHelpPage = helpPagePath(
+ 'user/packages/container_registry/reduce_container_registry_storage.html',
+ { anchor: 'how-the-cleanup-policy-works' },
+ );
const mountComponent = (propsData = { status: SCHEDULED_STATUS }) => {
wrapper = shallowMountExtended(CleanupStatus, {
propsData,
- directives: {
- GlTooltip: createMockDirective(),
+ stubs: {
+ GlLink,
+ GlPopover,
+ GlSprintf,
},
});
};
@@ -43,7 +51,7 @@ describe('cleanup_status', () => {
mountComponent({ status });
expect(findMainIcon().exists()).toBe(visible);
- expect(wrapper.text()).toBe(text);
+ expect(wrapper.text()).toContain(text);
},
);
@@ -53,12 +61,6 @@ describe('cleanup_status', () => {
expect(findMainIcon().exists()).toBe(true);
});
-
- it(`has the orange class when the status is ${UNFINISHED_STATUS}`, () => {
- mountComponent({ status: UNFINISHED_STATUS });
-
- expect(findMainIcon().classes('gl-text-orange-500')).toBe(true);
- });
});
describe('extra info icon', () => {
@@ -76,12 +78,18 @@ describe('cleanup_status', () => {
},
);
- it(`has a tooltip`, () => {
- mountComponent({ status: UNFINISHED_STATUS });
+ it(`has a popover with a learn more link and a time frame for the next run`, () => {
+ jest.spyOn(Date, 'now').mockImplementation(() => new Date('2063-04-04T00:42:00Z').getTime());
- const tooltip = getBinding(findExtraInfoIcon().element, 'gl-tooltip');
+ mountComponent({
+ status: UNFINISHED_STATUS,
+ expirationPolicy: { next_run: '2063-04-08T01:44:03Z' },
+ });
- expect(tooltip.value.title).toBe(CLEANUP_TIMED_OUT_ERROR_MESSAGE);
+ expect(findPopover().exists()).toBe(true);
+ expect(findPopover().text()).toContain('The cleanup will continue within 4 days. Learn more');
+ expect(findPopover().findComponent(GlLink).exists()).toBe(true);
+ expect(findPopover().findComponent(GlLink).attributes('href')).toBe(cleanupPolicyHelpPage);
});
});
});
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
index 7d09c09d03b..f811468550d 100644
--- a/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/registry_header_spec.js
@@ -4,7 +4,6 @@ import { nextTick } from 'vue';
import Component from '~/packages_and_registries/container_registry/explorer/components/list_page/registry_header.vue';
import {
CONTAINER_REGISTRY_TITLE,
- LIST_INTRO_TEXT,
EXPIRATION_POLICY_DISABLED_TEXT,
SET_UP_CLEANUP,
} from '~/packages_and_registries/container_registry/explorer/constants';
@@ -135,9 +134,7 @@ describe('registry_header', () => {
it('is correctly bound to title_area props', () => {
mountComponent({ helpPagePath: 'foo' });
- expect(findTitleArea().props('infoMessages')).toEqual([
- { text: LIST_INTRO_TEXT, link: 'foo' },
- ]);
+ expect(findTitleArea().props('infoMessages')).toEqual([]);
});
});
});
diff --git a/spec/frontend/packages_and_registries/container_registry/explorer/utils_spec.js b/spec/frontend/packages_and_registries/container_registry/explorer/utils_spec.js
new file mode 100644
index 00000000000..5063759a620
--- /dev/null
+++ b/spec/frontend/packages_and_registries/container_registry/explorer/utils_spec.js
@@ -0,0 +1,21 @@
+import { timeTilRun } from '~/packages_and_registries/container_registry/explorer/utils';
+
+describe('Container registry utilities', () => {
+ describe('timeTilRun', () => {
+ beforeEach(() => {
+ jest.spyOn(Date, 'now').mockImplementation(() => new Date('2063-04-04T00:42:00Z').getTime());
+ });
+
+ it('should return a human readable time', () => {
+ const result = timeTilRun('2063-04-08T01:44:03Z');
+
+ expect(result).toBe('4 days');
+ });
+
+ it('should return an empty string with null times', () => {
+ const result = timeTilRun(null);
+
+ expect(result).toBe('');
+ });
+ });
+});
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 dbe9793fb8c..fe4a2c06f1c 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/app_spec.js
@@ -9,7 +9,7 @@ import {
GlSprintf,
GlEmptyState,
} from '@gitlab/ui';
-import Vue from 'vue';
+import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
import MockAdapter from 'axios-mock-adapter';
import createMockApollo from 'helpers/mock_apollo_helper';
@@ -47,7 +47,6 @@ describe('DependencyProxyApp', () => {
const provideDefaults = {
groupPath: 'gitlab-org',
groupId: dummyGrouptId,
- dependencyProxyAvailable: true,
noManifestsIllustration: 'noManifestsIllustration',
};
@@ -74,7 +73,6 @@ describe('DependencyProxyApp', () => {
});
}
- const findProxyNotAvailableAlert = () => wrapper.findByTestId('proxy-not-available');
const findClipBoardButton = () => wrapper.findComponent(ClipboardButton);
const findFormGroup = () => wrapper.findComponent(GlFormGroup);
const findFormInputGroup = () => wrapper.findComponent(GlFormInputGroup);
@@ -103,59 +101,22 @@ describe('DependencyProxyApp', () => {
mock.restore();
});
- describe('when the dependency proxy is not available', () => {
- const createComponentArguments = {
- provide: { ...provideDefaults, dependencyProxyAvailable: false },
- };
-
- it('renders an info alert', () => {
- createComponent(createComponentArguments);
-
- expect(findProxyNotAvailableAlert().text()).toBe(
- DependencyProxyApp.i18n.proxyNotAvailableText,
- );
- });
-
- it('does not render the main area', () => {
- createComponent(createComponentArguments);
-
- expect(findMainArea().exists()).toBe(false);
- });
-
- it('does not call the graphql endpoint', async () => {
- resolver = jest.fn().mockResolvedValue(proxyDetailsQuery());
- createComponent({ ...createComponentArguments });
-
- await waitForPromises();
-
- expect(resolver).not.toHaveBeenCalled();
- });
-
- it('hides the clear cache dropdown list', () => {
- createComponent(createComponentArguments);
-
- expect(findClearCacheDropdownList().exists()).toBe(false);
- });
- });
-
describe('when the dependency proxy is available', () => {
describe('when is loading', () => {
- it('renders the skeleton loader', () => {
+ beforeEach(() => {
createComponent();
+ });
+ it('renders the skeleton loader', () => {
expect(findSkeletonLoader().exists()).toBe(true);
});
- it('does not show the main section', () => {
- createComponent();
-
- expect(findMainArea().exists()).toBe(false);
+ it('does not render a form group with label', () => {
+ expect(findFormGroup().exists()).toBe(false);
});
- it('does not render the info alert', () => {
- createComponent();
-
- expect(findProxyNotAvailableAlert().exists()).toBe(false);
+ it('does not show the main section', () => {
+ expect(findMainArea().exists()).toBe(false);
});
});
@@ -166,10 +127,6 @@ describe('DependencyProxyApp', () => {
return waitForPromises();
});
- it('does not render the info alert', () => {
- expect(findProxyNotAvailableAlert().exists()).toBe(false);
- });
-
it('renders the main area', () => {
expect(findMainArea().exists()).toBe(true);
});
@@ -193,7 +150,7 @@ describe('DependencyProxyApp', () => {
});
});
- it('from group has a description with proxy count', () => {
+ it('form group has a description with proxy count', () => {
expect(findProxyCountText().text()).toBe('Contains 2 blobs of images (1024 Bytes)');
});
@@ -257,6 +214,28 @@ describe('DependencyProxyApp', () => {
});
});
+ describe('triggering page event on list', () => {
+ beforeEach(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', () => {
+ expect(findFormGroup().attributes('label')).toEqual(
+ expect.stringMatching(DependencyProxyApp.i18n.proxyImagePrefix),
+ );
+ });
+
+ it('does not show the main section', () => {
+ expect(findMainArea().exists()).toBe(false);
+ });
+ });
+
it('shows the clear cache dropdown list', () => {
expect(findClearCacheDropdownList().exists()).toBe(true);
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_row_spec.js b/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_row_spec.js
index b7cbd875497..be3236d1f9c 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_row_spec.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/components/manifest_row_spec.js
@@ -3,6 +3,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import ListItem from '~/vue_shared/components/registry/list_item.vue';
import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import Component from '~/packages_and_registries/dependency_proxy/components/manifest_row.vue';
+import { MANIFEST_PENDING_DESTRUCTION_STATUS } from '~/packages_and_registries/dependency_proxy/constants';
import { proxyManifests } from 'jest/packages_and_registries/dependency_proxy/mock_data';
describe('Manifest Row', () => {
@@ -26,34 +27,63 @@ describe('Manifest Row', () => {
const findListItem = () => wrapper.findComponent(ListItem);
const findCachedMessages = () => wrapper.findByTestId('cached-message');
const findTimeAgoTooltip = () => wrapper.findComponent(TimeagoTooltip);
-
- beforeEach(() => {
- createComponent();
- });
+ const findStatus = () => wrapper.findByTestId('status');
afterEach(() => {
wrapper.destroy();
});
- it('has a list item', () => {
- expect(findListItem().exists()).toBe(true);
- });
+ describe('With a manifest on the DEFAULT status', () => {
+ beforeEach(() => {
+ createComponent();
+ });
- it('displays the name', () => {
- expect(wrapper.text()).toContain('alpine');
- });
+ it('has a list item', () => {
+ expect(findListItem().exists()).toBe(true);
+ });
- it('displays the version', () => {
- expect(wrapper.text()).toContain('latest');
- });
+ it('displays the name', () => {
+ expect(wrapper.text()).toContain('alpine');
+ });
- it('displays the cached time', () => {
- expect(findCachedMessages().text()).toContain('Cached');
+ it('displays the version', () => {
+ expect(wrapper.text()).toContain('latest');
+ });
+
+ it('displays the cached time', () => {
+ expect(findCachedMessages().text()).toContain('Cached');
+ });
+
+ it('has a time ago tooltip component', () => {
+ expect(findTimeAgoTooltip().props()).toMatchObject({
+ time: defaultProps.manifest.createdAt,
+ });
+ });
+
+ it('does not have a status element displayed', () => {
+ expect(findStatus().exists()).toBe(false);
+ });
});
- it('has a time ago tooltip component', () => {
- expect(findTimeAgoTooltip().props()).toMatchObject({
- time: defaultProps.manifest.createdAt,
+ describe('With a manifest on the PENDING_DESTRUCTION_STATUS', () => {
+ const pendingDestructionManifest = {
+ manifest: {
+ ...defaultProps.manifest,
+ status: MANIFEST_PENDING_DESTRUCTION_STATUS,
+ },
+ };
+
+ beforeEach(() => {
+ createComponent(pendingDestructionManifest);
+ });
+
+ it('has a list item', () => {
+ expect(findListItem().exists()).toBe(true);
+ });
+
+ it('has a status element displayed', () => {
+ expect(findStatus().exists()).toBe(true);
+ expect(findStatus().text()).toBe('Scheduled for deletion');
});
});
});
diff --git a/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js b/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js
index 2aa427bc6af..37c8eb669ba 100644
--- a/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js
+++ b/spec/frontend/packages_and_registries/dependency_proxy/mock_data.js
@@ -8,8 +8,18 @@ export const proxyData = () => ({
export const proxySettings = (extend = {}) => ({ enabled: true, ...extend });
export const proxyManifests = () => [
- { id: 'proxy-1', createdAt: '2021-09-22T09:45:28Z', imageName: 'alpine:latest' },
- { id: 'proxy-2', createdAt: '2021-09-21T09:45:28Z', imageName: 'alpine:stable' },
+ {
+ id: 'proxy-1',
+ createdAt: '2021-09-22T09:45:28Z',
+ imageName: 'alpine:latest',
+ status: 'DEFAULT',
+ },
+ {
+ id: 'proxy-2',
+ createdAt: '2021-09-21T09:45:28Z',
+ imageName: 'alpine:stable',
+ status: 'DEFAULT',
+ },
];
export const pagination = (extend) => ({
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/package_title_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/package_title_spec.js.snap
index 519014bb9cf..fdddc131412 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/package_title_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/__snapshots__/package_title_spec.js.snap
@@ -29,12 +29,6 @@ exports[`PackageTitle renders with tags 1`] = `
<div
class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-mt-3"
>
- <gl-icon-stub
- class="gl-mr-3"
- name="eye"
- size="16"
- />
-
<span
data-testid="sub-header"
>
@@ -127,12 +121,6 @@ exports[`PackageTitle renders without tags 1`] = `
<div
class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-mt-3"
>
- <gl-icon-stub
- class="gl-mr-3"
- name="eye"
- size="16"
- />
-
<span
data-testid="sub-header"
>
diff --git a/spec/frontend/packages_and_registries/package_registry/components/details/package_title_spec.js b/spec/frontend/packages_and_registries/package_registry/components/details/package_title_spec.js
index 5da9cfffaae..d306f7834f0 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/details/package_title_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/details/package_title_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon, GlSprintf } from '@gitlab/ui';
+import { GlSprintf } from '@gitlab/ui';
import { GlBreakpointInstance } from '@gitlab/ui/dist/utils';
import { nextTick } from 'vue';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
@@ -46,7 +46,6 @@ describe('PackageTitle', () => {
const findPackageRef = () => wrapper.findByTestId('package-ref');
const findPackageTags = () => wrapper.findComponent(PackageTags);
const findPackageBadges = () => wrapper.findAllByTestId('tag-badge');
- const findSubHeaderIcon = () => wrapper.findComponent(GlIcon);
const findSubHeaderText = () => wrapper.findByTestId('sub-header');
const findSubHeaderTimeAgo = () => wrapper.findComponent(TimeAgoTooltip);
@@ -120,12 +119,6 @@ describe('PackageTitle', () => {
});
describe('sub-header', () => {
- it('has the eye icon', async () => {
- await createComponent();
-
- expect(findSubHeaderIcon().props('name')).toBe('eye');
- });
-
it('has a text showing version', async () => {
await createComponent();
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
index 18a99f70756..031afa62890 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
@@ -38,8 +38,6 @@ exports[`packages_list_row renders 1`] = `
</router-link-stub>
<!---->
-
- <!---->
</div>
<!---->
@@ -98,16 +96,35 @@ exports[`packages_list_row renders 1`] = `
<div
class="gl-w-9 gl-display-flex gl-justify-content-end gl-pr-1"
>
- <gl-button-stub
- aria-label="Remove package"
- buttontextclasses=""
- category="secondary"
- data-testid="action-delete"
- icon="remove"
+ <gl-dropdown-stub
+ category="tertiary"
+ clearalltext="Clear all"
+ clearalltextclass="gl-px-5"
+ data-testid="delete-dropdown"
+ headertext=""
+ hideheaderborder="true"
+ highlighteditemstitle="Selected"
+ highlighteditemstitleclass="gl-px-5"
+ icon="ellipsis_v"
+ no-caret=""
size="medium"
- title="Remove package"
- variant="danger"
- />
+ text="More actions"
+ textsronly="true"
+ variant="default"
+ >
+ <gl-dropdown-item-stub
+ avatarurl=""
+ data-testid="action-delete"
+ iconcolor=""
+ iconname=""
+ iconrightarialabel=""
+ iconrightname=""
+ secondarytext=""
+ variant="danger"
+ >
+ Delete package
+ </gl-dropdown-item-stub>
+ </gl-dropdown-stub>
</div>
</div>
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
index 12a3eaa3873..c16c09b5326 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
@@ -28,12 +28,12 @@ describe('packages_list_row', () => {
const packageWithoutTags = { ...packageData(), project: packageProject() };
const packageWithTags = { ...packageWithoutTags, tags: { nodes: packageTags() } };
+ const packageCannotDestroy = { ...packageData(), canDestroy: false };
const findPackageTags = () => wrapper.find(PackageTags);
const findPackagePath = () => wrapper.find(PackagePath);
- const findDeleteButton = () => wrapper.findByTestId('action-delete');
+ const findDeleteDropdown = () => wrapper.findByTestId('action-delete');
const findPackageIconAndName = () => wrapper.find(PackageIconAndName);
- const findListItem = () => wrapper.findComponent(ListItem);
const findPackageLink = () => wrapper.findByTestId('details-link');
const findWarningIcon = () => wrapper.findByTestId('warning-icon');
const findLeftSecondaryInfos = () => wrapper.findByTestId('left-secondary-infos');
@@ -102,22 +102,25 @@ describe('packages_list_row', () => {
});
describe('delete button', () => {
+ it('does not exist when package cannot be destroyed', () => {
+ mountComponent({ packageEntity: packageCannotDestroy });
+
+ expect(findDeleteDropdown().exists()).toBe(false);
+ });
+
it('exists and has the correct props', () => {
mountComponent({ packageEntity: packageWithoutTags });
- expect(findDeleteButton().exists()).toBe(true);
- expect(findDeleteButton().attributes()).toMatchObject({
- icon: 'remove',
- category: 'secondary',
+ expect(findDeleteDropdown().exists()).toBe(true);
+ expect(findDeleteDropdown().attributes()).toMatchObject({
variant: 'danger',
- title: 'Remove package',
});
});
it('emits the packageToDelete event when the delete button is clicked', async () => {
mountComponent({ packageEntity: packageWithoutTags });
- findDeleteButton().vm.$emit('click');
+ findDeleteDropdown().vm.$emit('click');
await nextTick();
expect(wrapper.emitted('packageToDelete')).toBeTruthy();
@@ -130,10 +133,6 @@ describe('packages_list_row', () => {
mountComponent({ packageEntity: { ...packageWithoutTags, status: PACKAGE_ERROR_STATUS } });
});
- it('list item has a disabled prop', () => {
- expect(findListItem().props('disabled')).toBe(true);
- });
-
it('details link is disabled', () => {
expect(findPackageLink().props('event')).toBe('');
});
@@ -141,14 +140,14 @@ describe('packages_list_row', () => {
it('has a warning icon', () => {
const icon = findWarningIcon();
const tooltip = getBinding(icon.element, 'gl-tooltip');
- expect(icon.props('icon')).toBe('warning');
+ expect(icon.props('name')).toBe('warning');
expect(tooltip.value).toMatchObject({
title: 'Invalid Package: failed metadata extraction',
});
});
- it('delete button does not exist', () => {
- expect(findDeleteButton().exists()).toBe(false);
+ it('has a delete dropdown', () => {
+ expect(findDeleteDropdown().exists()).toBe(true);
});
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
index 97978dee909..660f00a2b31 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/packages_list_spec.js
@@ -1,4 +1,4 @@
-import { GlKeysetPagination, GlModal, GlSprintf } from '@gitlab/ui';
+import { GlAlert, GlKeysetPagination, GlModal, GlSprintf } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import PackagesListRow from '~/packages_and_registries/package_registry/components/list/package_list_row.vue';
@@ -21,6 +21,12 @@ describe('packages_list', () => {
id: 'gid://gitlab/Packages::Package/112',
name: 'second-package',
};
+ const errorPackage = {
+ ...packageData(),
+ id: 'gid://gitlab/Packages::Package/121',
+ status: 'ERROR',
+ name: 'error package',
+ };
const defaultProps = {
list: [firstPackage, secondPackage],
@@ -40,6 +46,7 @@ describe('packages_list', () => {
const findPackageListDeleteModal = () => wrapper.findComponent(GlModalStub);
const findEmptySlot = () => wrapper.findComponent(EmptySlotStub);
const findPackagesListRow = () => wrapper.findComponent(PackagesListRow);
+ const findErrorPackageAlert = () => wrapper.findComponent(GlAlert);
const mountComponent = (props) => {
wrapper = shallowMountExtended(PackagesList, {
@@ -109,6 +116,12 @@ describe('packages_list', () => {
expect(findPackageListDeleteModal().exists()).toBe(true);
});
+
+ it('does not have an error alert displayed', () => {
+ mountComponent();
+
+ expect(findErrorPackageAlert().exists()).toBe(false);
+ });
});
describe('when the user can destroy the package', () => {
@@ -140,6 +153,32 @@ describe('packages_list', () => {
});
});
+ describe('when an error package is present', () => {
+ beforeEach(() => {
+ mountComponent({ list: [firstPackage, errorPackage] });
+
+ return nextTick();
+ });
+
+ it('should display an alert message', () => {
+ expect(findErrorPackageAlert().exists()).toBe(true);
+ expect(findErrorPackageAlert().props('title')).toBe(
+ 'There was an error publishing a error package package',
+ );
+ expect(findErrorPackageAlert().text()).toBe(
+ 'There was a timeout and the package was not published. Delete this package and try again.',
+ );
+ });
+
+ it('should display the deletion modal when clicked on the confirm button', async () => {
+ findErrorPackageAlert().vm.$emit('primaryAction');
+
+ await nextTick();
+
+ expect(findPackageListDeleteModal().text()).toContain(errorPackage.name);
+ });
+ });
+
describe('when the list is empty', () => {
beforeEach(() => {
mountComponent({ list: [] });
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/packages_title_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/packages_title_spec.js
index e992ba12faa..23e5c7330d5 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/packages_title_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/packages_title_spec.js
@@ -37,7 +37,7 @@ describe('PackageTitle', () => {
expect(findTitleArea().props()).toMatchObject({
title: PackageTitle.i18n.LIST_TITLE_TEXT,
- infoMessages: [{ text: PackageTitle.i18n.LIST_INTRO_TEXT, link: 'foo' }],
+ infoMessages: [],
});
});
});
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/tokens/package_type_token_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/tokens/package_type_token_spec.js
index 26b2f3b359f..d0c111bae2d 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/tokens/package_type_token_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/tokens/package_type_token_spec.js
@@ -11,7 +11,10 @@ describe('packages_filter', () => {
const mountComponent = ({ attrs, listeners } = {}) => {
wrapper = shallowMount(component, {
- attrs,
+ attrs: {
+ cursorPosition: 'start',
+ ...attrs,
+ },
listeners,
});
};
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 94f56e5c979..22754d31f93 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,11 +6,7 @@ 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,
- DEPENDENCY_PROXY_SETTINGS_DESCRIPTION,
- DEPENDENCY_PROXY_DOCS_PATH,
-} from '~/packages_and_registries/settings/group/constants';
+import { DEPENDENCY_PROXY_HEADER } 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';
@@ -91,8 +87,6 @@ describe('DependencyProxySettings', () => {
const findSettingsBlock = () => wrapper.findComponent(SettingsBlock);
const findSettingsTitles = () => wrapper.findComponent(SettingsTitles);
- const findDescription = () => wrapper.findByTestId('description');
- const findDescriptionLink = () => wrapper.findByTestId('description-link');
const findEnableProxyToggle = () => wrapper.findByTestId('dependency-proxy-setting-toggle');
const findEnableTtlPoliciesToggle = () =>
wrapper.findByTestId('dependency-proxy-ttl-policies-toggle');
@@ -126,21 +120,6 @@ describe('DependencyProxySettings', () => {
expect(wrapper.text()).toContain(DEPENDENCY_PROXY_HEADER);
});
- it('has the correct description text', () => {
- mountComponent();
-
- expect(findDescription().text()).toMatchInterpolatedText(DEPENDENCY_PROXY_SETTINGS_DESCRIPTION);
- });
-
- it('has the correct link', () => {
- mountComponent();
-
- expect(findDescriptionLink().attributes()).toMatchObject({
- href: DEPENDENCY_PROXY_DOCS_PATH,
- });
- expect(findDescriptionLink().text()).toBe('Learn more');
- });
-
describe('enable toggle', () => {
it('exists', () => {
mountComponent();
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 5c30074a6af..635195ff0a4 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
@@ -28,7 +28,6 @@ describe('Group Settings App', () => {
const defaultProvide = {
defaultExpanded: false,
groupPath: 'foo_group_path',
- dependencyProxyAvailable: true,
};
const mountComponent = ({
@@ -140,15 +139,4 @@ describe('Group Settings App', () => {
});
});
});
-
- describe('when the dependency proxy is not available', () => {
- beforeEach(() => {
- mountComponent({ provide: { ...defaultProvide, dependencyProxyAvailable: false } });
- return waitForApolloQueryAndRender();
- });
-
- it('the setting block is hidden', () => {
- expect(findDependencyProxySettings().exists()).toBe(false);
- });
- });
});
diff --git a/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js b/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
index 266f953c3e0..465e6dc73e2 100644
--- a/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
+++ b/spec/frontend/packages_and_registries/settings/project/settings/components/settings_form_spec.js
@@ -1,6 +1,6 @@
-import { shallowMount, createLocalVue } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
-import { nextTick } from 'vue';
+import Vue, { nextTick } from 'vue';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { GlCard, GlLoadingIcon } from 'jest/packages_and_registries/shared/stubs';
@@ -14,8 +14,6 @@ import expirationPolicyQuery from '~/packages_and_registries/settings/project/gr
import Tracking from '~/tracking';
import { expirationPolicyPayload, expirationPolicyMutationPayload } from '../mock_data';
-const localVue = createLocalVue();
-
describe('Settings Form', () => {
let wrapper;
let fakeApollo;
@@ -59,7 +57,6 @@ describe('Settings Form', () => {
data,
config,
provide = defaultProvidedValues,
- mocks,
} = {}) => {
wrapper = shallowMount(component, {
stubs: {
@@ -77,7 +74,6 @@ describe('Settings Form', () => {
$toast: {
show: jest.fn(),
},
- ...mocks,
},
...config,
});
@@ -88,7 +84,7 @@ describe('Settings Form', () => {
mutationResolver,
queryPayload = expirationPolicyPayload(),
} = {}) => {
- localVue.use(VueApollo);
+ Vue.use(VueApollo);
const requestHandlers = [
[updateContainerExpirationPolicyMutation, mutationResolver],
@@ -120,7 +116,6 @@ describe('Settings Form', () => {
value,
},
config: {
- localVue,
apolloProvider: fakeApollo,
},
});
@@ -356,8 +351,8 @@ describe('Settings Form', () => {
});
it('parses the error messages', async () => {
- const mutate = jest.fn().mockRejectedValue({
- graphQLErrors: [
+ const mutate = jest.fn().mockResolvedValue({
+ errors: [
{
extensions: {
problems: [{ path: ['nameRegexKeep'], message: 'baz' }],
@@ -365,7 +360,9 @@ describe('Settings Form', () => {
},
],
});
- mountComponent({ mocks: { $apollo: { mutate } } });
+ mountComponentWithApollo({
+ mutationResolver: mutate,
+ });
await submitForm();
diff --git a/spec/frontend/pager_spec.js b/spec/frontend/pager_spec.js
index 9df69124d66..dfb3e87a342 100644
--- a/spec/frontend/pager_spec.js
+++ b/spec/frontend/pager_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
@@ -26,12 +27,14 @@ describe('pager', () => {
const originalHref = window.location.href;
beforeEach(() => {
- setFixtures('<div class="content_list"></div><div class="loading"></div>');
+ setHTMLFixture('<div class="content_list"></div><div class="loading"></div>');
jest.spyOn($.fn, 'endlessScroll').mockImplementation();
});
afterEach(() => {
window.history.replaceState({}, null, originalHref);
+
+ resetHTMLFixture();
});
it('should get initial offset from query parameter', () => {
@@ -57,7 +60,7 @@ describe('pager', () => {
}
beforeEach(() => {
- setFixtures(
+ setHTMLFixture(
'<div class="content_list" data-href="/some_list"></div><div class="loading"></div>',
);
jest.spyOn(axios, 'get');
@@ -65,6 +68,10 @@ describe('pager', () => {
Pager.init();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('shows loader while loading next page', async () => {
mockSuccess();
@@ -135,7 +142,11 @@ describe('pager', () => {
const href = `${TEST_HOST}/some_list.json`;
beforeEach(() => {
- setFixtures(`<div class="content_list" data-href="${href}"></div>`);
+ setHTMLFixture(`<div class="content_list" data-href="${href}"></div>`);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('should use data-href attribute', () => {
@@ -154,7 +165,11 @@ describe('pager', () => {
describe('no data-href attribute attribute provided from list element', () => {
beforeEach(() => {
- setFixtures(`<div class="content_list"></div>`);
+ setHTMLFixture(`<div class="content_list"></div>`);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('should use current url', () => {
@@ -190,7 +205,7 @@ describe('pager', () => {
describe('when `container` is visible', () => {
it('makes API request', () => {
- setFixtures(
+ setHTMLFixture(
`<div id="js-pager"><div class="content_list" data-href="${href}"></div></div>`,
);
@@ -199,12 +214,14 @@ describe('pager', () => {
endlessScrollCallback();
expect(axios.get).toHaveBeenCalledWith(href, expect.any(Object));
+
+ resetHTMLFixture();
});
});
describe('when `container` is not visible', () => {
it('does not make API request', () => {
- setFixtures(
+ setHTMLFixture(
`<div id="js-pager" style="display: none;"><div class="content_list" data-href="${href}"></div></div>`,
);
@@ -213,6 +230,8 @@ describe('pager', () => {
endlessScrollCallback();
expect(axios.get).not.toHaveBeenCalled();
+
+ resetHTMLFixture();
});
});
});
diff --git a/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js b/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
index 71c9da238b4..6edfe9641b9 100644
--- a/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
+++ b/spec/frontend/pages/admin/abuse_reports/abuse_reports_spec.js
@@ -1,5 +1,5 @@
import $ from 'jquery';
-import '~/lib/utils/text_utility';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import AbuseReports from '~/pages/admin/abuse_reports/abuse_reports';
describe('Abuse Reports', () => {
@@ -15,11 +15,15 @@ describe('Abuse Reports', () => {
$messages.filter((index, element) => element.innerText.indexOf(searchText) > -1).first();
beforeEach(() => {
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
new AbuseReports(); // eslint-disable-line no-new
$messages = $('.abuse-reports .message');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should truncate long messages', () => {
const $longMessage = findMessage('LONG MESSAGE');
diff --git a/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js b/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
index 3a4f93d4464..542eb2f3ab8 100644
--- a/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
+++ b/spec/frontend/pages/admin/application_settings/account_and_limits_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initUserInternalRegexPlaceholder, {
PLACEHOLDER_USER_EXTERNAL_DEFAULT_FALSE,
PLACEHOLDER_USER_EXTERNAL_DEFAULT_TRUE,
@@ -10,12 +11,16 @@ describe('AccountAndLimits', () => {
let $userInternalRegex;
beforeEach(() => {
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
initUserInternalRegexPlaceholder();
$userDefaultExternal = $('#application_setting_user_default_external');
$userInternalRegex = document.querySelector('#application_setting_user_default_internal_regex');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('Changing of userInternalRegex when userDefaultExternal', () => {
it('is unchecked', () => {
expect($userDefaultExternal.prop('checked')).toBeFalsy();
diff --git a/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js b/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js
index 4140b985682..3a52c243867 100644
--- a/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js
+++ b/spec/frontend/pages/admin/application_settings/metrics_and_profiling/usage_statistics_spec.js
@@ -2,6 +2,7 @@ import initSetHelperText, {
HELPER_TEXT_SERVICE_PING_DISABLED,
HELPER_TEXT_SERVICE_PING_ENABLED,
} from '~/pages/admin/application_settings/metrics_and_profiling/usage_statistics';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
describe('UsageStatistics', () => {
const FIXTURE = 'application_settings/usage.html';
@@ -11,7 +12,7 @@ describe('UsageStatistics', () => {
let servicePingFeaturesHelperText;
beforeEach(() => {
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
initSetHelperText();
servicePingCheckBox = document.getElementById('application_setting_usage_ping_enabled');
servicePingFeaturesCheckBox = document.getElementById(
@@ -21,6 +22,10 @@ describe('UsageStatistics', () => {
servicePingFeaturesHelperText = document.getElementById('service_ping_features_helper_text');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const expectEnabledservicePingFeaturesCheckBox = () => {
expect(servicePingFeaturesCheckBox.classList.contains('gl-cursor-not-allowed')).toBe(false);
expect(servicePingFeaturesHelperText.textContent).toEqual(HELPER_TEXT_SERVICE_PING_ENABLED);
diff --git a/spec/frontend/pages/admin/projects/components/namespace_select_spec.js b/spec/frontend/pages/admin/projects/components/namespace_select_spec.js
index f10b202f4d7..909349569a8 100644
--- a/spec/frontend/pages/admin/projects/components/namespace_select_spec.js
+++ b/spec/frontend/pages/admin/projects/components/namespace_select_spec.js
@@ -1,5 +1,6 @@
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import Api from '~/api';
import NamespaceSelect from '~/pages/admin/projects/components/namespace_select.vue';
@@ -26,7 +27,7 @@ describe('Dropdown select component', () => {
};
beforeEach(() => {
- setFixtures('<div class="test-container"></div>');
+ setHTMLFixture('<div class="test-container"></div>');
jest.spyOn(Api, 'namespaces').mockImplementation((_, callback) =>
callback([
@@ -36,6 +37,10 @@ describe('Dropdown select component', () => {
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('creates a hidden input if fieldName is provided', () => {
mountDropdown({ fieldName: 'namespace-input' });
diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
index ae53afa7fba..3a9b59f291c 100644
--- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js
+++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js
@@ -1,5 +1,6 @@
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';
import axios from '~/lib/utils/axios_utils';
@@ -19,7 +20,7 @@ describe('Todos', () => {
let mock;
beforeEach(() => {
- loadFixtures('todos/todos.html');
+ loadHTMLFixture('todos/todos.html');
todoItem = document.querySelector('.todos-list .todo');
mock = new MockAdapter(axios);
@@ -27,6 +28,10 @@ describe('Todos', () => {
});
afterEach(() => {
+ resetHTMLFixture();
+ });
+
+ afterEach(() => {
mock.restore();
});
diff --git a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
index 43c48617800..a850b1655f7 100644
--- a/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
+++ b/spec/frontend/pages/import/bulk_imports/history/components/bulk_imports_history_app_spec.js
@@ -3,6 +3,7 @@ import { mount, shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
import axios from '~/lib/utils/axios_utils';
import PaginationBar from '~/vue_shared/components/pagination_bar/pagination_bar.vue';
+import LocalStorageSync from '~/vue_shared/components/local_storage_sync.vue';
import BulkImportsHistoryApp from '~/pages/import/bulk_imports/history/components/bulk_imports_history_app.vue';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
@@ -60,6 +61,8 @@ describe('BulkImportsHistoryApp', () => {
wrapper = mountFn(BulkImportsHistoryApp);
}
+ const findLocalStorageSync = () => wrapper.findComponent(LocalStorageSync);
+
const originalApiVersion = gon.api_version;
beforeAll(() => {
gon.api_version = 'v4';
@@ -137,6 +140,20 @@ describe('BulkImportsHistoryApp', () => {
);
});
+ it('sets up the local storage sync correctly', async () => {
+ const NEW_PAGE_SIZE = 4;
+
+ mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
+ createComponent();
+ await axios.waitForAll();
+ mock.resetHistory();
+
+ wrapper.findComponent(PaginationBar).vm.$emit('set-page-size', NEW_PAGE_SIZE);
+ await axios.waitForAll();
+
+ expect(findLocalStorageSync().props('value')).toBe(NEW_PAGE_SIZE);
+ });
+
it('renders correct url for destination group when relative_url is empty', async () => {
mock.onGet(API_URL).reply(200, DUMMY_RESPONSE, DEFAULT_HEADERS);
createComponent({ shallow: false });
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 269c7467c8b..005b8968383 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
@@ -178,7 +178,8 @@ exports[`Learn GitLab renders correctly 1`] = `
data-track-action="click_link"
data-track-label="Start a free Ultimate trial"
href="http://example.com/"
- target="_self"
+ rel="noopener noreferrer"
+ target="_blank"
>
Start a free Ultimate trial
@@ -209,7 +210,8 @@ exports[`Learn GitLab renders correctly 1`] = `
data-track-action="click_link"
data-track-label="Add code owners"
href="http://example.com/"
- target="_self"
+ rel="noopener noreferrer"
+ target="_blank"
>
Add code owners
@@ -240,7 +242,8 @@ exports[`Learn GitLab renders correctly 1`] = `
data-track-action="click_link"
data-track-label="Add merge request approval"
href="http://example.com/"
- target="_self"
+ rel="noopener noreferrer"
+ target="_blank"
>
Add merge request approval
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 b8ebf2a1430..d9aff37f703 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
@@ -1,8 +1,11 @@
+import { GlPopover, GlLink } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { stubExperiments } from 'helpers/experimentation_helper';
import { mockTracking, triggerEvent, unmockTracking } from 'helpers/tracking_helper';
import eventHub from '~/invite_members/event_hub';
import LearnGitlabSectionLink from '~/pages/projects/learn_gitlab/components/learn_gitlab_section_link.vue';
+import { ACTION_LABELS } from '~/pages/projects/learn_gitlab/constants';
const defaultAction = 'gitWrite';
const defaultProps = {
@@ -10,6 +13,7 @@ const defaultProps = {
description: 'Some description',
url: 'https://example.com',
completed: false,
+ enabled: true,
};
const openInNewTabProps = {
@@ -26,16 +30,21 @@ describe('Learn GitLab Section Link', () => {
});
const createWrapper = (action = defaultAction, props = {}) => {
- wrapper = mount(LearnGitlabSectionLink, {
- propsData: { action, value: { ...defaultProps, ...props } },
- });
+ wrapper = extendedWrapper(
+ mount(LearnGitlabSectionLink, {
+ propsData: { action, value: { ...defaultProps, ...props } },
+ }),
+ );
};
const openInviteMembesrModalLink = () =>
wrapper.find('[data-testid="invite-for-help-continuous-onboarding-experiment-link"]');
const findUncompletedLink = () => wrapper.find('[data-testid="uncompleted-learn-gitlab-link"]');
-
+ const findDisabledLink = () => wrapper.findByTestId('disabled-learn-gitlab-link');
+ const findPopoverTrigger = () => wrapper.findByTestId('contact-admin-popover-trigger');
+ const findPopover = () => wrapper.findComponent(GlPopover);
+ const findPopoverLink = () => findPopover().findComponent(GlLink);
const videoTutorialLink = () => wrapper.find('[data-testid="video-tutorial-link"]');
it('renders no icon when not completed', () => {
@@ -62,6 +71,36 @@ describe('Learn GitLab Section Link', () => {
expect(wrapper.find('[data-testid="trial-only"]').exists()).toBe(true);
});
+ describe('disabled links', () => {
+ beforeEach(() => {
+ createWrapper('trialStarted', { enabled: false });
+ });
+
+ it('renders text without a link', () => {
+ expect(findDisabledLink().exists()).toBe(true);
+ expect(findDisabledLink().text()).toBe(ACTION_LABELS.trialStarted.title);
+ expect(findDisabledLink().attributes('href')).toBeUndefined();
+ });
+
+ it('renders a popover trigger with question icon', () => {
+ expect(findPopoverTrigger().exists()).toBe(true);
+ expect(findPopoverTrigger().props('icon')).toBe('question-o');
+ });
+
+ it('renders a popover', () => {
+ expect(findPopoverTrigger().attributes('id')).toBe(findPopover().props('target'));
+ expect(findPopover().props()).toMatchObject({
+ placement: 'top',
+ triggers: 'hover focus',
+ });
+ });
+
+ it('renders a link inside the popover', () => {
+ expect(findPopoverLink().exists()).toBe(true);
+ expect(findPopoverLink().attributes('href')).toBe(defaultProps.url);
+ });
+ });
+
describe('links marked with openInNewTab', () => {
beforeEach(() => {
createWrapper('securityScanEnabled', openInNewTabProps);
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_spec.js b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_spec.js
index 5f1aff99578..0f63c243342 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_spec.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/learn_gitlab_spec.js
@@ -1,6 +1,6 @@
import { GlProgressBar, GlAlert } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import Cookies from 'js-cookie';
+import Cookies from '~/lib/utils/cookies';
import LearnGitlab from '~/pages/projects/learn_gitlab/components/learn_gitlab.vue';
import eventHub from '~/invite_members/event_hub';
import { INVITE_MODAL_OPEN_COOKIE } from '~/pages/projects/learn_gitlab/constants';
diff --git a/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js b/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js
index 5dc64097d81..1c29c68d2a9 100644
--- a/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js
+++ b/spec/frontend/pages/projects/learn_gitlab/components/mock_data.js
@@ -3,47 +3,56 @@ export const testActions = {
url: 'http://example.com/',
completed: true,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
userAdded: {
url: 'http://example.com/',
completed: true,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
pipelineCreated: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
trialStarted: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
codeOwnersEnabled: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
requiredMrApprovalsEnabled: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
mergeRequestCreated: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
securityScanEnabled: {
url: 'https://docs.gitlab.com/ee/foobar/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
openInNewTab: true,
},
issueCreated: {
url: 'http://example.com/',
completed: false,
svg: 'http://example.com/images/illustration.svg',
+ enabled: true,
},
};
diff --git a/spec/frontend/pages/projects/merge_requests/edit/check_form_state_spec.js b/spec/frontend/pages/projects/merge_requests/edit/check_form_state_spec.js
index ea49111760b..5c186441817 100644
--- a/spec/frontend/pages/projects/merge_requests/edit/check_form_state_spec.js
+++ b/spec/frontend/pages/projects/merge_requests/edit/check_form_state_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'jest/__helpers__/fixtures';
import initCheckFormState from '~/pages/projects/merge_requests/edit/check_form_state';
describe('Check form state', () => {
@@ -7,7 +8,7 @@ describe('Check form state', () => {
let setDialogContent;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<form class="merge-request-form">
<input type="text" name="test" id="form-input"/>
</form>`);
@@ -22,6 +23,8 @@ describe('Check form state', () => {
afterEach(() => {
beforeUnloadEvent.preventDefault.mockRestore();
setDialogContent.mockRestore();
+
+ resetHTMLFixture();
});
it('shows confirmation dialog when there are unsaved changes', () => {
diff --git a/spec/frontend/pages/projects/pages_domains/form_spec.js b/spec/frontend/pages/projects/pages_domains/form_spec.js
index 55336596f30..e437121acd2 100644
--- a/spec/frontend/pages/projects/pages_domains/form_spec.js
+++ b/spec/frontend/pages/projects/pages_domains/form_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initForm from '~/pages/projects/pages_domains/form';
const ENABLED_UNLESS_AUTO_SSL_CLASS = 'js-enabled-unless-auto-ssl';
@@ -17,7 +18,7 @@ describe('Page domains form', () => {
const findUnlessAutoSsl = () => document.querySelector(`.${SHOW_UNLESS_AUTO_SSL_CLASS}`);
const create = () => {
- setFixtures(`
+ setHTMLFixture(`
<form>
<span
class="${SSL_TOGGLE_CLASS}"
@@ -31,6 +32,10 @@ describe('Page domains form', () => {
`);
};
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('instantiates the toggle', () => {
create();
initForm();
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
index c28a03b35d7..ca7f70f4434 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/pipeline_schedule_callout_spec.js
@@ -1,7 +1,7 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Cookies from 'js-cookie';
import { nextTick } from 'vue';
+import Cookies from '~/lib/utils/cookies';
import PipelineSchedulesCallout from '~/pages/projects/pipeline_schedules/shared/components/pipeline_schedules_callout.vue';
const cookieKey = 'pipeline_schedules_callout_dismissed';
diff --git a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
index b700c255e8c..42eeff89bf4 100644
--- a/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
+++ b/spec/frontend/pages/projects/pipeline_schedules/shared/components/timezone_dropdown_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import TimezoneDropdown, {
formatUtcOffset,
formatTimezone,
@@ -25,13 +26,17 @@ describe('Timezone Dropdown', () => {
describe('Initialize', () => {
describe('with dropdown already loaded', () => {
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit.html');
+ loadHTMLFixture('pipeline_schedules/edit.html');
$wrapper = $('.dropdown');
$inputEl = $('#schedule_cron_timezone');
$inputEl.val('');
$dropdownEl = $('.js-timezone-dropdown');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('can take an $inputEl in the constructor', () => {
initTimezoneDropdown();
@@ -86,7 +91,7 @@ describe('Timezone Dropdown', () => {
describe('without dropdown loaded', () => {
beforeEach(() => {
- loadFixtures('pipeline_schedules/edit.html');
+ loadHTMLFixture('pipeline_schedules/edit.html');
$wrapper = $('.dropdown');
$inputEl = $('#schedule_cron_timezone');
$dropdownEl = $('.js-timezone-dropdown');
diff --git a/spec/frontend/pages/search/show/refresh_counts_spec.js b/spec/frontend/pages/search/show/refresh_counts_spec.js
index 81c9bf74308..6f14f0c70bd 100644
--- a/spec/frontend/pages/search/show/refresh_counts_spec.js
+++ b/spec/frontend/pages/search/show/refresh_counts_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import axios from '~/lib/utils/axios_utils';
import refreshCounts from '~/pages/search/show/refresh_counts';
@@ -18,7 +19,11 @@ describe('pages/search/show/refresh_counts', () => {
beforeEach(() => {
mock = new MockAdapter(axios);
- setFixtures(fixture);
+ setHTMLFixture(fixture);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
afterEach(() => {
diff --git a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
index a29db961452..4c4a0fbea11 100644
--- a/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
+++ b/spec/frontend/pages/sessions/new/preserve_url_fragment_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import preserveUrlFragment from '~/pages/sessions/new/preserve_url_fragment';
describe('preserve_url_fragment', () => {
@@ -7,7 +8,11 @@ describe('preserve_url_fragment', () => {
};
beforeEach(() => {
- loadFixtures('sessions/new.html');
+ loadHTMLFixture('sessions/new.html');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('adds the url fragment to the login form actions', () => {
diff --git a/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js b/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
index 601fcfedbe0..f736ce46f9b 100644
--- a/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
+++ b/spec/frontend/pages/sessions/new/signin_tabs_memoizer_spec.js
@@ -1,3 +1,4 @@
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import AccessorUtilities from '~/lib/utils/accessor';
import SigninTabsMemoizer from '~/pages/sessions/new/signin_tabs_memoizer';
@@ -19,11 +20,15 @@ describe('SigninTabsMemoizer', () => {
}
beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('does nothing if no tab was previously selected', () => {
createMemoizer();
diff --git a/spec/frontend/pdf/index_spec.js b/spec/frontend/pdf/index_spec.js
index 1ae77a62675..2b0932493bb 100644
--- a/spec/frontend/pdf/index_spec.js
+++ b/spec/frontend/pdf/index_spec.js
@@ -14,18 +14,8 @@ const Component = Vue.extend(PDFLab);
describe('PDF component', () => {
let vm;
- const checkLoaded = (done) => {
- if (vm.loading) {
- setTimeout(() => {
- checkLoaded(done);
- }, 100);
- } else {
- done();
- }
- };
-
describe('without PDF data', () => {
- beforeEach((done) => {
+ beforeEach(() => {
vm = new Component({
propsData: {
pdf: '',
@@ -33,8 +23,6 @@ describe('PDF component', () => {
});
vm.$mount();
-
- checkLoaded(done);
});
it('does not render', () => {
@@ -43,7 +31,7 @@ describe('PDF component', () => {
});
describe('with PDF data', () => {
- beforeEach((done) => {
+ beforeEach(() => {
vm = new Component({
propsData: {
pdf,
@@ -51,8 +39,6 @@ describe('PDF component', () => {
});
vm.$mount();
-
- checkLoaded(done);
});
it('renders pdf component', () => {
diff --git a/spec/frontend/performance_bar/index_spec.js b/spec/frontend/performance_bar/index_spec.js
index 91cb46002be..6c1cbfa70a1 100644
--- a/spec/frontend/performance_bar/index_spec.js
+++ b/spec/frontend/performance_bar/index_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import axios from '~/lib/utils/axios_utils';
import '~/performance_bar/components/performance_bar_app.vue';
import performanceBar from '~/performance_bar';
@@ -11,7 +12,7 @@ describe('performance bar wrapper', () => {
let vm;
beforeEach(() => {
- setFixtures('<div id="js-peek"></div>');
+ setHTMLFixture('<div id="js-peek"></div>');
const peekWrapper = document.getElementById('js-peek');
performance.getEntriesByType = jest.fn().mockReturnValue([]);
@@ -49,6 +50,7 @@ describe('performance bar wrapper', () => {
vm.$destroy();
document.getElementById('js-peek').remove();
mock.restore();
+ resetHTMLFixture();
});
describe('addRequest', () => {
diff --git a/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js b/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
index 59bd71b0e60..bec6c2a8d0c 100644
--- a/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
+++ b/spec/frontend/pipeline_editor/components/commit/commit_form_spec.js
@@ -71,7 +71,7 @@ describe('Pipeline Editor | Commit Form', () => {
expect(wrapper.emitted('submit')[0]).toEqual([
{
message: mockCommitMessage,
- targetBranch: mockDefaultBranch,
+ sourceBranch: mockDefaultBranch,
openMergeRequest: false,
},
]);
@@ -127,7 +127,7 @@ describe('Pipeline Editor | Commit Form', () => {
expect(wrapper.emitted('submit')[0]).toEqual([
{
message: anotherMessage,
- targetBranch: anotherBranch,
+ sourceBranch: anotherBranch,
openMergeRequest: true,
},
]);
diff --git a/spec/frontend/pipeline_editor/components/file-nav/pipeline_editor_file_nav_spec.js b/spec/frontend/pipeline_editor/components/file-nav/pipeline_editor_file_nav_spec.js
index e24de832d6d..a61796dbed2 100644
--- a/spec/frontend/pipeline_editor/components/file-nav/pipeline_editor_file_nav_spec.js
+++ b/spec/frontend/pipeline_editor/components/file-nav/pipeline_editor_file_nav_spec.js
@@ -1,19 +1,58 @@
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
import { shallowMount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import createMockApollo from 'helpers/mock_apollo_helper';
import BranchSwitcher from '~/pipeline_editor/components/file_nav/branch_switcher.vue';
import PipelineEditorFileNav from '~/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue';
+import FileTreePopover from '~/pipeline_editor/components/popovers/file_tree_popover.vue';
+import getAppStatus from '~/pipeline_editor/graphql/queries/client/app_status.query.graphql';
+import {
+ EDITOR_APP_STATUS_EMPTY,
+ EDITOR_APP_STATUS_LOADING,
+ EDITOR_APP_STATUS_VALID,
+} from '~/pipeline_editor/constants';
+
+Vue.use(VueApollo);
describe('Pipeline editor file nav', () => {
let wrapper;
- const createComponent = ({ provide = {} } = {}) => {
- wrapper = shallowMount(PipelineEditorFileNav, {
- provide: {
- ...provide,
+ const mockApollo = createMockApollo();
+
+ const createComponent = ({
+ appStatus = EDITOR_APP_STATUS_VALID,
+ isNewCiConfigFile = false,
+ pipelineEditorFileTree = false,
+ } = {}) => {
+ mockApollo.clients.defaultClient.cache.writeQuery({
+ query: getAppStatus,
+ data: {
+ app: {
+ __typename: 'PipelineEditorApp',
+ status: appStatus,
+ },
},
});
+
+ wrapper = extendedWrapper(
+ shallowMount(PipelineEditorFileNav, {
+ apolloProvider: mockApollo,
+ provide: {
+ glFeatures: {
+ pipelineEditorFileTree,
+ },
+ },
+ propsData: {
+ isNewCiConfigFile,
+ },
+ }),
+ );
};
const findBranchSwitcher = () => wrapper.findComponent(BranchSwitcher);
+ const findFileTreeBtn = () => wrapper.findByTestId('file-tree-toggle');
+ const findPopoverContainer = () => wrapper.findComponent(FileTreePopover);
afterEach(() => {
wrapper.destroy();
@@ -27,5 +66,91 @@ describe('Pipeline editor file nav', () => {
it('renders the branch switcher', () => {
expect(findBranchSwitcher().exists()).toBe(true);
});
+
+ it('does not render the file tree button', () => {
+ expect(findFileTreeBtn().exists()).toBe(false);
+ });
+
+ it('does not render the file tree popover', () => {
+ expect(findPopoverContainer().exists()).toBe(false);
+ });
+ });
+
+ describe('with pipelineEditorFileTree feature flag ON', () => {
+ describe('when editor is in the empty state', () => {
+ beforeEach(() => {
+ createComponent({
+ appStatus: EDITOR_APP_STATUS_EMPTY,
+ isNewCiConfigFile: false,
+ pipelineEditorFileTree: true,
+ });
+ });
+
+ it('does not render the file tree button', () => {
+ expect(findFileTreeBtn().exists()).toBe(false);
+ });
+
+ it('does not render the file tree popover', () => {
+ expect(findPopoverContainer().exists()).toBe(false);
+ });
+ });
+
+ describe('when user is about to create their config file for the first time', () => {
+ beforeEach(() => {
+ createComponent({
+ appStatus: EDITOR_APP_STATUS_VALID,
+ isNewCiConfigFile: true,
+ pipelineEditorFileTree: true,
+ });
+ });
+
+ it('does not render the file tree button', () => {
+ expect(findFileTreeBtn().exists()).toBe(false);
+ });
+
+ it('does not render the file tree popover', () => {
+ expect(findPopoverContainer().exists()).toBe(false);
+ });
+ });
+
+ describe('when app is in a global loading state', () => {
+ it('renders the file tree button with a loading icon', () => {
+ createComponent({
+ appStatus: EDITOR_APP_STATUS_LOADING,
+ isNewCiConfigFile: false,
+ pipelineEditorFileTree: true,
+ });
+
+ expect(findFileTreeBtn().exists()).toBe(true);
+ expect(findFileTreeBtn().attributes('loading')).toBe('true');
+ });
+ });
+
+ describe('when editor has a non-empty config file open', () => {
+ beforeEach(() => {
+ createComponent({
+ appStatus: EDITOR_APP_STATUS_VALID,
+ isNewCiConfigFile: false,
+ pipelineEditorFileTree: true,
+ });
+ });
+
+ it('renders the file tree button', () => {
+ expect(findFileTreeBtn().exists()).toBe(true);
+ expect(findFileTreeBtn().props('icon')).toBe('file-tree');
+ });
+
+ it('renders the file tree popover', () => {
+ expect(findPopoverContainer().exists()).toBe(true);
+ });
+
+ it('file tree button emits toggle-file-tree event', () => {
+ expect(wrapper.emitted('toggle-file-tree')).toBe(undefined);
+
+ findFileTreeBtn().vm.$emit('click');
+
+ expect(wrapper.emitted('toggle-file-tree')).toHaveLength(1);
+ });
+ });
});
});
diff --git a/spec/frontend/pipeline_editor/components/file-tree/container_spec.js b/spec/frontend/pipeline_editor/components/file-tree/container_spec.js
new file mode 100644
index 00000000000..04a93e8db25
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/file-tree/container_spec.js
@@ -0,0 +1,138 @@
+import { nextTick } from 'vue';
+import { shallowMount } from '@vue/test-utils';
+import { GlAlert } from '@gitlab/ui';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { createMockDirective } from 'helpers/vue_mock_directive';
+import PipelineEditorFileTreeContainer from '~/pipeline_editor/components/file_tree/container.vue';
+import PipelineEditorFileTreeItem from '~/pipeline_editor/components/file_tree/file_item.vue';
+import { FILE_TREE_TIP_DISMISSED_KEY } from '~/pipeline_editor/constants';
+import { mockCiConfigPath, mockIncludes, mockIncludesHelpPagePath } from '../../mock_data';
+
+describe('Pipeline editor file nav', () => {
+ let wrapper;
+
+ const createComponent = ({ includes = mockIncludes, stubs } = {}) => {
+ wrapper = extendedWrapper(
+ shallowMount(PipelineEditorFileTreeContainer, {
+ provide: {
+ ciConfigPath: mockCiConfigPath,
+ includesHelpPagePath: mockIncludesHelpPagePath,
+ },
+ propsData: {
+ includes,
+ },
+ directives: {
+ GlTooltip: createMockDirective(),
+ },
+ stubs,
+ }),
+ );
+ };
+
+ const findTip = () => wrapper.findComponent(GlAlert);
+ const findCurrentConfigFilename = () => wrapper.findByTestId('current-config-filename');
+ const fileTreeItems = () => wrapper.findAll(PipelineEditorFileTreeItem);
+
+ afterEach(() => {
+ localStorage.clear();
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ beforeEach(() => {
+ createComponent({ stubs: { GlAlert } });
+ });
+
+ it('renders config file as a file item', () => {
+ expect(findCurrentConfigFilename().text()).toBe(mockCiConfigPath);
+ });
+ });
+
+ describe('when includes list is empty', () => {
+ describe('when dismiss state is not saved in local storage', () => {
+ beforeEach(() => {
+ createComponent({
+ includes: [],
+ stubs: { GlAlert },
+ });
+ });
+
+ it('does not render filenames', () => {
+ expect(fileTreeItems().exists()).toBe(false);
+ });
+
+ it('renders alert tip', async () => {
+ expect(findTip().exists()).toBe(true);
+ });
+
+ it('renders learn more link', async () => {
+ expect(findTip().props('secondaryButtonLink')).toBe(mockIncludesHelpPagePath);
+ });
+
+ it('can dismiss the tip', async () => {
+ expect(findTip().exists()).toBe(true);
+
+ findTip().vm.$emit('dismiss');
+ await nextTick();
+
+ expect(findTip().exists()).toBe(false);
+ });
+ });
+
+ describe('when dismiss state is saved in local storage', () => {
+ beforeEach(() => {
+ localStorage.setItem(FILE_TREE_TIP_DISMISSED_KEY, 'true');
+ createComponent({
+ includes: [],
+ stubs: { GlAlert },
+ });
+ });
+
+ it('does not render alert tip', async () => {
+ expect(findTip().exists()).toBe(false);
+ });
+ });
+
+ describe('when component receives new props with includes files', () => {
+ beforeEach(() => {
+ createComponent({ includes: [] });
+ });
+
+ it('hides tip and renders list of files', async () => {
+ expect(findTip().exists()).toBe(true);
+ expect(fileTreeItems()).toHaveLength(0);
+
+ await wrapper.setProps({ includes: mockIncludes });
+
+ expect(findTip().exists()).toBe(false);
+ expect(fileTreeItems()).toHaveLength(mockIncludes.length);
+ });
+ });
+ });
+
+ describe('when there are includes files', () => {
+ beforeEach(() => {
+ createComponent({ stubs: { GlAlert } });
+ });
+
+ it('does not render alert tip', () => {
+ expect(findTip().exists()).toBe(false);
+ });
+
+ it('renders the list of files', () => {
+ expect(fileTreeItems()).toHaveLength(mockIncludes.length);
+ });
+
+ describe('when component receives new props with empty includes', () => {
+ it('shows tip and does not render list of files', async () => {
+ expect(findTip().exists()).toBe(false);
+ expect(fileTreeItems()).toHaveLength(mockIncludes.length);
+
+ await wrapper.setProps({ includes: [] });
+
+ expect(findTip().exists()).toBe(true);
+ expect(fileTreeItems()).toHaveLength(0);
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/file-tree/file_item_spec.js b/spec/frontend/pipeline_editor/components/file-tree/file_item_spec.js
new file mode 100644
index 00000000000..f12ac14c6be
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/file-tree/file_item_spec.js
@@ -0,0 +1,52 @@
+import { GlLink } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import FileIcon from '~/vue_shared/components/file_icon.vue';
+import PipelineEditorFileTreeItem from '~/pipeline_editor/components/file_tree/file_item.vue';
+import { mockIncludesWithBlob, mockDefaultIncludes } from '../../mock_data';
+
+describe('Pipeline editor file nav', () => {
+ let wrapper;
+
+ const createComponent = ({ file = mockDefaultIncludes } = {}) => {
+ wrapper = shallowMount(PipelineEditorFileTreeItem, {
+ propsData: {
+ file,
+ },
+ });
+ };
+
+ const fileIcon = () => wrapper.findComponent(FileIcon);
+ const link = () => wrapper.findComponent(GlLink);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('template', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders file icon', () => {
+ expect(fileIcon().exists()).toBe(true);
+ });
+
+ it('renders file name', () => {
+ expect(wrapper.text()).toBe(mockDefaultIncludes.location);
+ });
+
+ it('links to raw path by default', () => {
+ expect(link().attributes('href')).toBe(mockDefaultIncludes.raw);
+ });
+ });
+
+ describe('when file has blob link', () => {
+ beforeEach(() => {
+ createComponent({ file: mockIncludesWithBlob });
+ });
+
+ it('links to blob path', () => {
+ expect(link().attributes('href')).toBe(mockIncludesWithBlob.blob);
+ });
+ });
+});
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 6dffb7e5470..d159a20a8d6 100644
--- a/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
+++ b/spec/frontend/pipeline_editor/components/pipeline_editor_tabs_spec.js
@@ -3,7 +3,7 @@ import { shallowMount, mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import setWindowLocation from 'helpers/set_window_location_helper';
import CiConfigMergedPreview from '~/pipeline_editor/components/editor/ci_config_merged_preview.vue';
-import WalkthroughPopover from '~/pipeline_editor/components/walkthrough_popover.vue';
+import WalkthroughPopover from '~/pipeline_editor/components/popovers/walkthrough_popover.vue';
import CiLint from '~/pipeline_editor/components/lint/ci_lint.vue';
import PipelineEditorTabs from '~/pipeline_editor/components/pipeline_editor_tabs.vue';
import EditorTab from '~/pipeline_editor/components/ui/editor_tab.vue';
diff --git a/spec/frontend/pipeline_editor/components/popovers/file_tree_popover_spec.js b/spec/frontend/pipeline_editor/components/popovers/file_tree_popover_spec.js
new file mode 100644
index 00000000000..98ce3f6ea40
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/popovers/file_tree_popover_spec.js
@@ -0,0 +1,56 @@
+import { nextTick } from 'vue';
+import { GlLink, GlPopover, GlSprintf } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import FileTreePopover from '~/pipeline_editor/components/popovers/file_tree_popover.vue';
+import { FILE_TREE_POPOVER_DISMISSED_KEY } from '~/pipeline_editor/constants';
+import { mockIncludesHelpPagePath } from '../../mock_data';
+
+describe('FileTreePopover component', () => {
+ let wrapper;
+
+ const findPopover = () => wrapper.findComponent(GlPopover);
+ const findLink = () => findPopover().findComponent(GlLink);
+
+ const createComponent = ({ stubs } = {}) => {
+ wrapper = shallowMount(FileTreePopover, {
+ provide: {
+ includesHelpPagePath: mockIncludesHelpPagePath,
+ },
+ stubs,
+ });
+ };
+
+ afterEach(() => {
+ localStorage.clear();
+ wrapper.destroy();
+ });
+
+ describe('default', () => {
+ beforeEach(async () => {
+ createComponent({ stubs: { GlSprintf } });
+ });
+
+ it('renders dismissable popover', async () => {
+ expect(findPopover().exists()).toBe(true);
+
+ findPopover().vm.$emit('close-button-clicked');
+ await nextTick();
+
+ expect(findPopover().exists()).toBe(false);
+ });
+
+ it('renders learn more link', () => {
+ expect(findLink().exists()).toBe(true);
+ expect(findLink().attributes('href')).toBe(mockIncludesHelpPagePath);
+ });
+ });
+
+ describe('when popover has already been dismissed before', () => {
+ it('does not render popover', async () => {
+ localStorage.setItem(FILE_TREE_POPOVER_DISMISSED_KEY, 'true');
+ createComponent();
+
+ expect(findPopover().exists()).toBe(false);
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/popovers/walkthrough_popover_spec.js b/spec/frontend/pipeline_editor/components/popovers/walkthrough_popover_spec.js
new file mode 100644
index 00000000000..8d172a8462a
--- /dev/null
+++ b/spec/frontend/pipeline_editor/components/popovers/walkthrough_popover_spec.js
@@ -0,0 +1,29 @@
+import { mount, shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import WalkthroughPopover from '~/pipeline_editor/components/popovers/walkthrough_popover.vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+
+Vue.config.ignoredElements = ['gl-emoji'];
+
+describe('WalkthroughPopover component', () => {
+ let wrapper;
+
+ const createComponent = (mountFn = shallowMount) => {
+ return extendedWrapper(mountFn(WalkthroughPopover));
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('CTA button clicked', () => {
+ beforeEach(async () => {
+ wrapper = createComponent(mount);
+ await wrapper.findByTestId('ctaBtn').trigger('click');
+ });
+
+ it('emits "walkthrough-popover-cta-clicked" event', async () => {
+ expect(wrapper.emitted()['walkthrough-popover-cta-clicked']).toBeTruthy();
+ });
+ });
+});
diff --git a/spec/frontend/pipeline_editor/components/walkthrough_popover_spec.js b/spec/frontend/pipeline_editor/components/walkthrough_popover_spec.js
deleted file mode 100644
index a9ce89ff521..00000000000
--- a/spec/frontend/pipeline_editor/components/walkthrough_popover_spec.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { mount, shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import WalkthroughPopover from '~/pipeline_editor/components/walkthrough_popover.vue';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-
-Vue.config.ignoredElements = ['gl-emoji'];
-
-describe('WalkthroughPopover component', () => {
- let wrapper;
-
- const createComponent = (mountFn = shallowMount) => {
- return extendedWrapper(mountFn(WalkthroughPopover));
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('CTA button clicked', () => {
- beforeEach(async () => {
- wrapper = createComponent(mount);
- await wrapper.findByTestId('ctaBtn').trigger('click');
- });
-
- it('emits "walkthrough-popover-cta-clicked" event', async () => {
- expect(wrapper.emitted()['walkthrough-popover-cta-clicked']).toBeTruthy();
- });
- });
-});
diff --git a/spec/frontend/pipeline_editor/mock_data.js b/spec/frontend/pipeline_editor/mock_data.js
index f02f6870653..560b2820fae 100644
--- a/spec/frontend/pipeline_editor/mock_data.js
+++ b/spec/frontend/pipeline_editor/mock_data.js
@@ -9,6 +9,7 @@ export const mockNewBranch = 'new-branch';
export const mockNewMergeRequestPath = '/-/merge_requests/new';
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 mockYmlHelpPagePath = '/-/yml-help';
@@ -82,12 +83,46 @@ const mockJobFields = {
__typename: 'CiConfigJob',
};
+export const mockIncludesWithBlob = {
+ location: 'test-include.yml',
+ type: 'local',
+ blob:
+ 'http://gdk.test:3000/root/upstream/-/blob/dd54f00bb3645f8ddce7665d2ffb3864540399cb/test-include.yml',
+ raw:
+ 'http://gdk.test:3000/root/upstream/-/raw/dd54f00bb3645f8ddce7665d2ffb3864540399cb/test-include.yml',
+ __typename: 'CiConfigInclude',
+};
+
+export const mockDefaultIncludes = {
+ location: 'npm.gitlab-ci.yml',
+ type: 'template',
+ blob: null,
+ raw:
+ 'https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/npm.gitlab-ci.yml',
+ __typename: 'CiConfigInclude',
+};
+
+export const mockIncludes = [
+ mockDefaultIncludes,
+ mockIncludesWithBlob,
+ {
+ location: 'a_really_really_long_name_for_includes_file.yml',
+ type: 'local',
+ blob:
+ 'http://gdk.test:3000/root/upstream/-/blob/dd54f00bb3645f8ddce7665d2ffb3864540399cb/a_really_really_long_name_for_includes_file.yml',
+ raw:
+ 'http://gdk.test:3000/root/upstream/-/raw/dd54f00bb3645f8ddce7665d2ffb3864540399cb/a_really_really_long_name_for_includes_file.yml',
+ __typename: 'CiConfigInclude',
+ },
+];
+
// Mock result of the graphql query at:
// app/assets/javascripts/pipeline_editor/graphql/queries/ci_config.graphql
export const mockCiConfigQueryResponse = {
data: {
ciConfig: {
errors: [],
+ includes: mockIncludes,
mergedYaml: mockCiYml,
status: CI_CONFIG_STATUS_VALID,
stages: {
diff --git a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
index 98e2c17967c..bf0f7fd8c9f 100644
--- a/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
+++ b/spec/frontend/pipeline_editor/pipeline_editor_home_spec.js
@@ -6,10 +6,17 @@ import CiEditorHeader from '~/pipeline_editor/components/editor/ci_editor_header
import CommitSection from '~/pipeline_editor/components/commit/commit_section.vue';
import PipelineEditorDrawer from '~/pipeline_editor/components/drawer/pipeline_editor_drawer.vue';
import PipelineEditorFileNav from '~/pipeline_editor/components/file_nav/pipeline_editor_file_nav.vue';
+import PipelineEditorFileTree from '~/pipeline_editor/components/file_tree/container.vue';
import BranchSwitcher from '~/pipeline_editor/components/file_nav/branch_switcher.vue';
import PipelineEditorHeader from '~/pipeline_editor/components/header/pipeline_editor_header.vue';
import PipelineEditorTabs from '~/pipeline_editor/components/pipeline_editor_tabs.vue';
-import { MERGED_TAB, VISUALIZE_TAB, CREATE_TAB, LINT_TAB } from '~/pipeline_editor/constants';
+import {
+ MERGED_TAB,
+ VISUALIZE_TAB,
+ CREATE_TAB,
+ LINT_TAB,
+ FILE_TREE_DISPLAY_KEY,
+} from '~/pipeline_editor/constants';
import PipelineEditorHome from '~/pipeline_editor/pipeline_editor_home.vue';
import { mockLintResponse, mockCiYml } from './mock_data';
@@ -47,11 +54,14 @@ describe('Pipeline editor home wrapper', () => {
const findFileNav = () => wrapper.findComponent(PipelineEditorFileNav);
const findModal = () => wrapper.findComponent(GlModal);
const findPipelineEditorDrawer = () => wrapper.findComponent(PipelineEditorDrawer);
+ const findPipelineEditorFileTree = () => wrapper.findComponent(PipelineEditorFileTree);
const findPipelineEditorHeader = () => wrapper.findComponent(PipelineEditorHeader);
const findPipelineEditorTabs = () => wrapper.findComponent(PipelineEditorTabs);
+ const findFileTreeBtn = () => wrapper.findByTestId('file-tree-toggle');
const findHelpBtn = () => wrapper.findByTestId('drawer-toggle');
afterEach(() => {
+ localStorage.clear();
wrapper.destroy();
});
@@ -230,4 +240,89 @@ describe('Pipeline editor home wrapper', () => {
expect(findPipelineEditorDrawer().props('isVisible')).toBe(false);
});
});
+
+ describe('file tree', () => {
+ const toggleFileTree = async () => {
+ findFileTreeBtn().vm.$emit('click');
+ await nextTick();
+ };
+
+ describe('with pipelineEditorFileTree feature flag OFF', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('hides the file tree', () => {
+ expect(findFileTreeBtn().exists()).toBe(false);
+ expect(findPipelineEditorFileTree().exists()).toBe(false);
+ });
+ });
+
+ describe('with pipelineEditorFileTree feature flag ON', () => {
+ describe('button toggle', () => {
+ beforeEach(() => {
+ createComponent({
+ glFeatures: {
+ pipelineEditorFileTree: true,
+ },
+ stubs: {
+ GlButton,
+ PipelineEditorFileNav,
+ },
+ });
+ });
+
+ it('shows button toggle', () => {
+ expect(findFileTreeBtn().exists()).toBe(true);
+ });
+
+ it('toggles the drawer on button click', async () => {
+ await toggleFileTree();
+
+ expect(findPipelineEditorFileTree().exists()).toBe(true);
+
+ await toggleFileTree();
+
+ expect(findPipelineEditorFileTree().exists()).toBe(false);
+ });
+
+ it('sets the display state in local storage', async () => {
+ await toggleFileTree();
+
+ expect(localStorage.getItem(FILE_TREE_DISPLAY_KEY)).toBe('true');
+
+ await toggleFileTree();
+
+ expect(localStorage.getItem(FILE_TREE_DISPLAY_KEY)).toBe('false');
+ });
+ });
+
+ describe('when file tree display state is saved in local storage', () => {
+ beforeEach(() => {
+ localStorage.setItem(FILE_TREE_DISPLAY_KEY, 'true');
+ createComponent({
+ glFeatures: { pipelineEditorFileTree: true },
+ stubs: { PipelineEditorFileNav },
+ });
+ });
+
+ it('shows the file tree by default', () => {
+ expect(findPipelineEditorFileTree().exists()).toBe(true);
+ });
+ });
+
+ describe('when file tree display state is not saved in local storage', () => {
+ beforeEach(() => {
+ createComponent({
+ glFeatures: { pipelineEditorFileTree: true },
+ stubs: { PipelineEditorFileNav },
+ });
+ });
+
+ it('hides the file tree by default', () => {
+ expect(findPipelineEditorFileTree().exists()).toBe(false);
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipeline_wizard/components/commit_spec.js b/spec/frontend/pipeline_wizard/components/commit_spec.js
index 6496850b028..c987accbb0d 100644
--- a/spec/frontend/pipeline_wizard/components/commit_spec.js
+++ b/spec/frontend/pipeline_wizard/components/commit_spec.js
@@ -8,7 +8,7 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import createCommitMutation from '~/pipeline_wizard/queries/create_commit.graphql';
import getFileMetadataQuery from '~/pipeline_wizard/queries/get_file_meta.graphql';
import RefSelector from '~/ref/components/ref_selector.vue';
-import flushPromises from 'helpers/flush_promises';
+import waitForPromises from 'helpers/wait_for_promises';
import {
createCommitMutationErrorResult,
createCommitMutationResult,
@@ -107,7 +107,7 @@ describe('Pipeline Wizard - Commit Page', () => {
it('does not show a load error if call is successful', async () => {
createComponent({ projectPath, filename });
- await flushPromises();
+ await waitForPromises();
expect(wrapper.findByTestId('load-error').exists()).not.toBe(true);
});
@@ -117,7 +117,7 @@ describe('Pipeline Wizard - Commit Page', () => {
{ defaultBranch: branch, projectPath, filename },
createMockApollo([[getFileMetadataQuery, () => fileQueryErrorResult]]),
);
- await flushPromises();
+ await waitForPromises();
expect(wrapper.findByTestId('load-error').exists()).toBe(true);
expect(wrapper.findByTestId('load-error').text()).toBe(i18n.errors.loadError);
});
@@ -131,9 +131,9 @@ describe('Pipeline Wizard - Commit Page', () => {
describe('successful commit', () => {
beforeEach(async () => {
createComponent();
- await flushPromises();
+ await waitForPromises();
await getButtonWithLabel(__('Commit')).trigger('click');
- await flushPromises();
+ await waitForPromises();
});
it('will not show an error', async () => {
@@ -159,9 +159,9 @@ describe('Pipeline Wizard - Commit Page', () => {
describe('failed commit', () => {
beforeEach(async () => {
createComponent({}, getMockApollo({ commitHasError: true }));
- await flushPromises();
+ await waitForPromises();
await getButtonWithLabel(__('Commit')).trigger('click');
- await flushPromises();
+ await waitForPromises();
});
it('will show an error', async () => {
@@ -229,7 +229,7 @@ describe('Pipeline Wizard - Commit Page', () => {
}),
);
- await flushPromises();
+ await waitForPromises();
consoleSpy = jest.spyOn(console, 'error');
@@ -243,7 +243,7 @@ describe('Pipeline Wizard - Commit Page', () => {
}
await Vue.nextTick();
- await flushPromises();
+ await waitForPromises();
});
afterAll(() => {
diff --git a/spec/frontend/pipelines/__snapshots__/utils_spec.js.snap b/spec/frontend/pipelines/__snapshots__/utils_spec.js.snap
index 2d2e5db598a..724ec7366d3 100644
--- a/spec/frontend/pipelines/__snapshots__/utils_spec.js.snap
+++ b/spec/frontend/pipelines/__snapshots__/utils_spec.js.snap
@@ -11,6 +11,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "6",
+ "kind": "BUILD",
"name": "build_a_nlfjkdnlvskfnksvjknlfdjvlvnjdkjdf_nvjkenjkrlngjeknjkl",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -53,6 +54,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "11",
+ "kind": "BUILD",
"name": "build_b",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -95,6 +97,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "16",
+ "kind": "BUILD",
"name": "build_c",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -137,6 +140,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "21",
+ "kind": "BUILD",
"name": "build_d 1/3",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -163,6 +167,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "24",
+ "kind": "BUILD",
"name": "build_d 2/3",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -189,6 +194,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "27",
+ "kind": "BUILD",
"name": "build_d 3/3",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -231,6 +237,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "59",
+ "kind": "BUILD",
"name": "test_c",
"needs": Array [],
"previousStageJobsOrNeeds": Array [],
@@ -275,6 +282,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "34",
+ "kind": "BUILD",
"name": "test_a",
"needs": Array [
"build_c",
@@ -325,6 +333,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "42",
+ "kind": "BUILD",
"name": "test_b 1/2",
"needs": Array [
"build_d 3/3",
@@ -363,6 +372,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "67",
+ "kind": "BUILD",
"name": "test_b 2/2",
"needs": Array [
"build_d 3/3",
@@ -417,6 +427,7 @@ Array [
Object {
"__typename": "CiJob",
"id": "53",
+ "kind": "BUILD",
"name": "test_d",
"needs": Array [
"build_b",
diff --git a/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
new file mode 100644
index 00000000000..3b5632a8a4e
--- /dev/null
+++ b/spec/frontend/pipelines/components/jobs/failed_jobs_app_spec.js
@@ -0,0 +1,87 @@
+import { GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import createFlash from '~/flash';
+import FailedJobsApp from '~/pipelines/components/jobs/failed_jobs_app.vue';
+import FailedJobsTable from '~/pipelines/components/jobs/failed_jobs_table.vue';
+import GetFailedJobsQuery from '~/pipelines/graphql/queries/get_failed_jobs.query.graphql';
+import { mockFailedJobsQueryResponse, mockFailedJobsSummaryData } from '../../mock_data';
+
+Vue.use(VueApollo);
+
+jest.mock('~/flash');
+
+describe('Failed Jobs App', () => {
+ let wrapper;
+ let resolverSpy;
+
+ const findLoadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
+ const findJobsTable = () => wrapper.findComponent(FailedJobsTable);
+
+ const createMockApolloProvider = (resolver) => {
+ const requestHandlers = [[GetFailedJobsQuery, resolver]];
+
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = (resolver, failedJobsSummaryData = mockFailedJobsSummaryData) => {
+ wrapper = shallowMount(FailedJobsApp, {
+ provide: {
+ fullPath: 'root/ci-project',
+ pipelineIid: 1,
+ },
+ propsData: {
+ failedJobsSummary: failedJobsSummaryData,
+ },
+ apolloProvider: createMockApolloProvider(resolver),
+ });
+ };
+
+ beforeEach(() => {
+ resolverSpy = jest.fn().mockResolvedValue(mockFailedJobsQueryResponse);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('loading spinner', () => {
+ beforeEach(() => {
+ 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 () => {
+ await waitForPromises();
+
+ expect(findLoadingSpinner().exists()).toBe(false);
+ });
+ });
+
+ it('displays the failed jobs table', async () => {
+ createComponent(resolverSpy);
+
+ await waitForPromises();
+
+ expect(findJobsTable().exists()).toBe(true);
+ expect(createFlash).not.toHaveBeenCalled();
+ });
+
+ it('handles query fetch error correctly', async () => {
+ resolverSpy = jest.fn().mockRejectedValue(new Error('GraphQL error'));
+
+ createComponent(resolverSpy);
+
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was a problem fetching the failed jobs.',
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js b/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js
new file mode 100644
index 00000000000..b597a3bf4b0
--- /dev/null
+++ b/spec/frontend/pipelines/components/jobs/failed_jobs_table_spec.js
@@ -0,0 +1,117 @@
+import { GlButton, GlLink, GlTableLite } from '@gitlab/ui';
+import Vue 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 createFlash from '~/flash';
+import { redirectTo } from '~/lib/utils/url_utility';
+import FailedJobsTable from '~/pipelines/components/jobs/failed_jobs_table.vue';
+import RetryFailedJobMutation from '~/pipelines/graphql/mutations/retry_failed_job.mutation.graphql';
+import {
+ successRetryMutationResponse,
+ failedRetryMutationResponse,
+ mockPreparedFailedJobsData,
+ mockPreparedFailedJobsDataNoPermission,
+} from '../../mock_data';
+
+jest.mock('~/flash');
+jest.mock('~/lib/utils/url_utility');
+
+Vue.use(VueApollo);
+
+describe('Failed Jobs Table', () => {
+ let wrapper;
+
+ const successRetryMutationHandler = jest.fn().mockResolvedValue(successRetryMutationResponse);
+ const failedRetryMutationHandler = jest.fn().mockResolvedValue(failedRetryMutationResponse);
+
+ const findJobsTable = () => wrapper.findComponent(GlTableLite);
+ const findRetryButton = () => wrapper.findComponent(GlButton);
+ const findJobLink = () => wrapper.findComponent(GlLink);
+ const findJobLog = () => wrapper.findByTestId('job-log');
+
+ const createMockApolloProvider = (resolver) => {
+ const requestHandlers = [[RetryFailedJobMutation, resolver]];
+ return createMockApollo(requestHandlers);
+ };
+
+ const createComponent = (resolver, failedJobsData = mockPreparedFailedJobsData) => {
+ wrapper = mountExtended(FailedJobsTable, {
+ propsData: {
+ failedJobs: failedJobsData,
+ },
+ apolloProvider: createMockApolloProvider(resolver),
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays the failed jobs table', () => {
+ createComponent();
+
+ expect(findJobsTable().exists()).toBe(true);
+ });
+
+ it('calls the retry failed job mutation correctly', () => {
+ createComponent(successRetryMutationHandler);
+
+ findRetryButton().trigger('click');
+
+ expect(successRetryMutationHandler).toHaveBeenCalledWith({
+ id: mockPreparedFailedJobsData[0].id,
+ });
+ });
+
+ it('redirects to the new job after the mutation', async () => {
+ const {
+ data: {
+ jobRetry: { job },
+ },
+ } = successRetryMutationResponse;
+
+ createComponent(successRetryMutationHandler);
+
+ findRetryButton().trigger('click');
+
+ await waitForPromises();
+
+ expect(redirectTo).toHaveBeenCalledWith(job.detailedStatus.detailsPath);
+ });
+
+ it('shows error message if the retry failed job mutation fails', async () => {
+ createComponent(failedRetryMutationHandler);
+
+ findRetryButton().trigger('click');
+
+ await waitForPromises();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'There was a problem retrying the failed job.',
+ });
+ });
+
+ it('hides the job log and retry button if a user does not have permission', () => {
+ createComponent([[]], mockPreparedFailedJobsDataNoPermission);
+
+ expect(findJobLog().exists()).toBe(false);
+ expect(findRetryButton().exists()).toBe(false);
+ });
+
+ it('displays the job log and retry button if a user has permission', () => {
+ createComponent();
+
+ expect(findJobLog().exists()).toBe(true);
+ expect(findRetryButton().exists()).toBe(true);
+ });
+
+ it('job name links to the correct job', () => {
+ createComponent();
+
+ expect(findJobLink().attributes('href')).toBe(
+ mockPreparedFailedJobsData[0].detailedStatus.detailsPath,
+ );
+ });
+});
diff --git a/spec/frontend/pipelines/components/jobs/utils_spec.js b/spec/frontend/pipelines/components/jobs/utils_spec.js
new file mode 100644
index 00000000000..720446cfda3
--- /dev/null
+++ b/spec/frontend/pipelines/components/jobs/utils_spec.js
@@ -0,0 +1,14 @@
+import { prepareFailedJobs } from '~/pipelines/components/jobs/utils';
+import {
+ mockFailedJobsData,
+ mockFailedJobsSummaryData,
+ mockPreparedFailedJobsData,
+} from '../../mock_data';
+
+describe('Utils', () => {
+ it('prepares failed jobs data correctly', () => {
+ expect(prepareFailedJobs(mockFailedJobsData, mockFailedJobsSummaryData)).toEqual(
+ mockPreparedFailedJobsData,
+ );
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipeline_tabs_spec.js b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
index e18c3edbad9..89002ee47a8 100644
--- a/spec/frontend/pipelines/components/pipeline_tabs_spec.js
+++ b/spec/frontend/pipelines/components/pipeline_tabs_spec.js
@@ -21,14 +21,19 @@ describe('The Pipeline Tabs', () => {
const findPipelineApp = () => wrapper.findComponent(PipelineGraphWrapper);
const findTestsApp = () => wrapper.findComponent(TestReports);
+ const defaultProvide = {
+ defaultTabValue: '',
+ };
+
const createComponent = (propsData = {}) => {
wrapper = extendedWrapper(
shallowMount(PipelineTabs, {
propsData,
+ provide: {
+ ...defaultProvide,
+ },
stubs: {
- Dag: { template: '<div id="dag"/>' },
JobsApp: { template: '<div class="jobs" />' },
- PipelineGraph: { template: '<div id="graph" />' },
TestReports: { template: '<div id="tests" />' },
},
}),
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js
new file mode 100644
index 00000000000..6531a15ab8e
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/ci_templates_spec.js
@@ -0,0 +1,112 @@
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
+
+const pipelineEditorPath = '/-/ci/editor';
+const suggestedCiTemplates = [
+ { name: 'Android', logo: '/assets/illustrations/logos/android.svg' },
+ { name: 'Bash', logo: '/assets/illustrations/logos/bash.svg' },
+ { name: 'C++', logo: '/assets/illustrations/logos/c_plus_plus.svg' },
+];
+
+describe('CI Templates', () => {
+ let wrapper;
+ let trackingSpy;
+
+ const createWrapper = (propsData = {}) => {
+ wrapper = shallowMountExtended(CiTemplates, {
+ provide: {
+ pipelineEditorPath,
+ suggestedCiTemplates,
+ },
+ propsData,
+ });
+ };
+
+ const findTemplateDescription = () => wrapper.findByTestId('template-description');
+ const findTemplateLink = () => wrapper.findByTestId('template-link');
+ const findTemplateNames = () => wrapper.findAllByTestId('template-name');
+ const findTemplateName = () => wrapper.findByTestId('template-name');
+ const findTemplateLogo = () => wrapper.findByTestId('template-logo');
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('renders template list', () => {
+ beforeEach(() => {
+ createWrapper();
+ });
+
+ it('renders all suggested templates', () => {
+ expect(findTemplateNames().length).toBe(3);
+ expect(wrapper.text()).toContain('Android', 'Bash', 'C++');
+ });
+
+ it('has the correct template name', () => {
+ expect(findTemplateName().text()).toBe('Android');
+ });
+
+ it('links to the correct template', () => {
+ expect(findTemplateLink().attributes('href')).toBe(
+ pipelineEditorPath.concat('?template=Android'),
+ );
+ });
+
+ it('has the link button enabled', () => {
+ expect(findTemplateLink().props('disabled')).toBe(false);
+ });
+
+ it('has the description of the template', () => {
+ expect(findTemplateDescription().text()).toBe(
+ 'Continuous integration and deployment template to test and deploy your Android project.',
+ );
+ });
+
+ it('has the right logo of the template', () => {
+ expect(findTemplateLogo().attributes('src')).toBe('/assets/illustrations/logos/android.svg');
+ });
+ });
+
+ describe('filtering the templates', () => {
+ beforeEach(() => {
+ createWrapper({ filterTemplates: ['Bash'] });
+ });
+
+ it('renders only the filtered templates', () => {
+ expect(findTemplateNames()).toHaveLength(1);
+ expect(findTemplateName().text()).toBe('Bash');
+ });
+ });
+
+ describe('disabling the templates', () => {
+ beforeEach(() => {
+ createWrapper({ disabled: true });
+ });
+
+ it('has the link button disabled', () => {
+ expect(findTemplateLink().props('disabled')).toBe(true);
+ });
+ });
+
+ describe('tracking', () => {
+ beforeEach(() => {
+ createWrapper();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
+ });
+
+ it('sends an event when template is clicked', () => {
+ findTemplateLink().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: 'Android',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js
new file mode 100644
index 00000000000..0c2938921d6
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/ios_templates_spec.js
@@ -0,0 +1,138 @@
+import '~/commons';
+import { nextTick } from 'vue';
+import { GlPopover, GlButton } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import RunnerInstructionsModal from '~/vue_shared/components/runner_instructions/runner_instructions_modal.vue';
+import IosTemplates from '~/pipelines/components/pipelines_list/empty_state/ios_templates.vue';
+import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
+
+const pipelineEditorPath = '/-/ci/editor';
+const registrationToken = 'SECRET_TOKEN';
+const iOSTemplateName = 'iOS-Fastlane';
+
+describe('iOS Templates', () => {
+ let wrapper;
+
+ const createWrapper = (providedPropsData = {}) => {
+ return shallowMountExtended(IosTemplates, {
+ provide: {
+ pipelineEditorPath,
+ iosRunnersAvailable: true,
+ ...providedPropsData,
+ },
+ propsData: {
+ registrationToken,
+ },
+ stubs: {
+ GlButton,
+ },
+ });
+ };
+
+ const findIosTemplate = () => wrapper.findComponent(CiTemplates);
+ const findRunnerInstructionsModal = () => wrapper.findComponent(RunnerInstructionsModal);
+ const findRunnerInstructionsPopover = () => wrapper.findComponent(GlPopover);
+ const findRunnerSetupTodoEmoji = () => wrapper.findByTestId('runner-setup-marked-todo');
+ const findRunnerSetupCompletedEmoji = () => wrapper.findByTestId('runner-setup-marked-completed');
+ const findSetupRunnerLink = () => wrapper.findByText('Set up a runner');
+ const configurePipelineLink = () => wrapper.findByTestId('configure-pipeline-link');
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('when ios runners are not available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ iosRunnersAvailable: false });
+ });
+
+ describe('the runner setup section', () => {
+ it('marks the section as todo', () => {
+ expect(findRunnerSetupTodoEmoji().isVisible()).toBe(true);
+ expect(findRunnerSetupCompletedEmoji().isVisible()).toBe(false);
+ });
+
+ it('renders the setup runner link', () => {
+ expect(findSetupRunnerLink().exists()).toBe(true);
+ });
+
+ it('renders the runner instructions modal with a popover once clicked', async () => {
+ findSetupRunnerLink().element.parentElement.click();
+
+ await nextTick();
+
+ expect(findRunnerInstructionsModal().exists()).toBe(true);
+ expect(findRunnerInstructionsModal().props('registrationToken')).toBe(registrationToken);
+ expect(findRunnerInstructionsModal().props('defaultPlatformName')).toBe('osx');
+
+ findRunnerInstructionsModal().vm.$emit('shown');
+
+ await nextTick();
+
+ expect(findRunnerInstructionsPopover().exists()).toBe(true);
+ });
+ });
+
+ describe('the configure pipeline section', () => {
+ it('has a disabled link button', () => {
+ expect(configurePipelineLink().props('disabled')).toBe(true);
+ });
+ });
+
+ describe('the ios-Fastlane template', () => {
+ it('renders the template', () => {
+ expect(findIosTemplate().props('filterTemplates')).toStrictEqual([iOSTemplateName]);
+ });
+
+ it('has a disabled link button', () => {
+ expect(findIosTemplate().props('disabled')).toBe(true);
+ });
+ });
+ });
+
+ describe('when ios runners are available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+
+ describe('the runner setup section', () => {
+ it('marks the section as completed', () => {
+ expect(findRunnerSetupTodoEmoji().isVisible()).toBe(false);
+ expect(findRunnerSetupCompletedEmoji().isVisible()).toBe(true);
+ });
+
+ it('does not render the setup runner link', () => {
+ expect(findSetupRunnerLink().exists()).toBe(false);
+ });
+ });
+
+ describe('the configure pipeline section', () => {
+ it('has an enabled link button', () => {
+ expect(configurePipelineLink().props('disabled')).toBe(false);
+ });
+
+ it('links to the pipeline editor with the right template', () => {
+ expect(configurePipelineLink().attributes('href')).toBe(
+ `${pipelineEditorPath}?template=${iOSTemplateName}`,
+ );
+ });
+ });
+
+ describe('the ios-Fastlane template', () => {
+ it('renders the template', () => {
+ expect(findIosTemplate().props('filterTemplates')).toStrictEqual([iOSTemplateName]);
+ });
+
+ it('has an enabled link button', () => {
+ expect(findIosTemplate().props('disabled')).toBe(false);
+ });
+
+ it('links to the pipeline editor with the right template', () => {
+ expect(configurePipelineLink().attributes('href')).toBe(
+ `${pipelineEditorPath}?template=${iOSTemplateName}`,
+ );
+ });
+ });
+ });
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js
new file mode 100644
index 00000000000..b537c81da3f
--- /dev/null
+++ b/spec/frontend/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates_spec.js
@@ -0,0 +1,161 @@
+import '~/commons';
+import { GlButton, GlSprintf } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
+import { stubExperiments } from 'helpers/experimentation_helper';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
+import ExperimentTracking from '~/experimentation/experiment_tracking';
+import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
+import {
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ I18N,
+} from '~/pipeline_editor/constants';
+
+const pipelineEditorPath = '/-/ci/editor';
+const ciRunnerSettingsPath = '/-/settings/ci_cd';
+
+jest.mock('~/experimentation/experiment_tracking');
+
+describe('Pipelines CI Templates', () => {
+ let wrapper;
+ let trackingSpy;
+
+ const createWrapper = (propsData = {}, stubs = {}) => {
+ return shallowMountExtended(PipelinesCiTemplates, {
+ provide: {
+ pipelineEditorPath,
+ ciRunnerSettingsPath,
+ anyRunnersAvailable: true,
+ ...propsData,
+ },
+ stubs,
+ });
+ };
+
+ const findTestTemplateLink = () => wrapper.findByTestId('test-template-link');
+ const findCiTemplates = () => wrapper.findComponent(CiTemplates);
+ const findSettingsLink = () => wrapper.findByTestId('settings-link');
+ const findDocumentationLink = () => wrapper.findByTestId('documentation-link');
+ const findSettingsButton = () => wrapper.findByTestId('settings-button');
+
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
+ describe('renders test template', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ });
+
+ it('links to the getting started template', () => {
+ expect(findTestTemplateLink().attributes('href')).toBe(
+ pipelineEditorPath.concat('?template=Getting-Started'),
+ );
+ });
+ });
+
+ describe('tracking', () => {
+ beforeEach(() => {
+ wrapper = createWrapper();
+ trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+ });
+
+ afterEach(() => {
+ unmockTracking();
+ });
+
+ it('sends an event when Getting-Started template is clicked', () => {
+ findTestTemplateLink().vm.$emit('click');
+
+ expect(trackingSpy).toHaveBeenCalledTimes(1);
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
+ label: 'Getting-Started',
+ });
+ });
+ });
+
+ describe('when the runners_availability_section experiment is active', () => {
+ beforeEach(() => {
+ stubExperiments({ runners_availability_section: 'candidate' });
+ });
+
+ describe('when runners are available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ anyRunnersAvailable: true }, { GitlabExperiment, GlSprintf });
+ });
+
+ it('show the runners available section', () => {
+ expect(wrapper.text()).toContain(I18N.runners.title);
+ });
+
+ it('tracks an event when clicking the settings link', () => {
+ findSettingsLink().vm.$emit('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
+ );
+ });
+
+ it('tracks an event when clicking the documentation link', () => {
+ findDocumentationLink().vm.$emit('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
+ );
+ });
+ });
+
+ describe('when runners are not available', () => {
+ beforeEach(() => {
+ wrapper = createWrapper({ anyRunnersAvailable: false }, { GitlabExperiment, GlButton });
+ });
+
+ it('show the no runners available section', () => {
+ expect(wrapper.text()).toContain(I18N.noRunners.title);
+ });
+
+ it('tracks an event when clicking the settings button', () => {
+ findSettingsButton().trigger('click');
+
+ expect(ExperimentTracking).toHaveBeenCalledWith(
+ RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
+ );
+ expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
+ RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
+ );
+ });
+ });
+ });
+
+ describe.each`
+ experimentVariant | anyRunnersAvailable | templatesRendered
+ ${'control'} | ${true} | ${true}
+ ${'control'} | ${false} | ${true}
+ ${'candidate'} | ${true} | ${true}
+ ${'candidate'} | ${false} | ${false}
+ `(
+ 'when the runners_availability_section experiment variant is $experimentVariant and runners are available: $anyRunnersAvailable',
+ ({ experimentVariant, anyRunnersAvailable, templatesRendered }) => {
+ beforeEach(() => {
+ stubExperiments({ runners_availability_section: experimentVariant });
+ wrapper = createWrapper({ anyRunnersAvailable });
+ });
+
+ it(`renders the templates: ${templatesRendered}`, () => {
+ expect(findTestTemplateLink().exists()).toBe(templatesRendered);
+ expect(findCiTemplates().exists()).toBe(templatesRendered);
+ });
+ },
+ );
+});
diff --git a/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js
index 93bc8faa51b..6d0e99ff63e 100644
--- a/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js
+++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js
@@ -1,6 +1,7 @@
import { GlDropdown } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
+import CiIcon from '~/vue_shared/components/ci_icon.vue';
import axios from '~/lib/utils/axios_utils';
import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue';
import eventHub from '~/pipelines/event_hub';
@@ -48,11 +49,12 @@ describe('Pipelines stage component', () => {
mock.restore();
});
+ const findCiActionBtn = () => wrapper.find('.js-ci-action');
+ const findCiIcon = () => wrapper.findComponent(CiIcon);
const findDropdown = () => wrapper.findComponent(GlDropdown);
const findDropdownToggle = () => wrapper.find('button.dropdown-toggle');
const findDropdownMenu = () =>
wrapper.find('[data-testid="mini-pipeline-graph-dropdown-menu-list"]');
- const findCiActionBtn = () => wrapper.find('.js-ci-action');
const findMergeTrainWarning = () => wrapper.find('[data-testid="warning-message-merge-trains"]');
const openStageDropdown = () => {
@@ -74,7 +76,7 @@ describe('Pipelines stage component', () => {
it('should render a dropdown with the status icon', () => {
expect(findDropdown().exists()).toBe(true);
expect(findDropdownToggle().exists()).toBe(true);
- expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true);
+ expect(findCiIcon().exists()).toBe(true);
});
});
diff --git a/spec/frontend/pipelines/empty_state/ci_templates_spec.js b/spec/frontend/pipelines/empty_state/ci_templates_spec.js
deleted file mode 100644
index 606fdc9cac1..00000000000
--- a/spec/frontend/pipelines/empty_state/ci_templates_spec.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
-
-const pipelineEditorPath = '/-/ci/editor';
-const suggestedCiTemplates = [
- { name: 'Android', logo: '/assets/illustrations/logos/android.svg' },
- { name: 'Bash', logo: '/assets/illustrations/logos/bash.svg' },
- { name: 'C++', logo: '/assets/illustrations/logos/c_plus_plus.svg' },
-];
-
-describe('CI Templates', () => {
- let wrapper;
- let trackingSpy;
-
- const createWrapper = () => {
- return shallowMountExtended(CiTemplates, {
- provide: {
- pipelineEditorPath,
- suggestedCiTemplates,
- },
- });
- };
-
- const findTemplateDescription = () => wrapper.findByTestId('template-description');
- const findTemplateLink = () => wrapper.findByTestId('template-link');
- const findTemplateName = () => wrapper.findByTestId('template-name');
- const findTemplateLogo = () => wrapper.findByTestId('template-logo');
-
- beforeEach(() => {
- wrapper = createWrapper();
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('renders template list', () => {
- it('renders all suggested templates', () => {
- const content = wrapper.text();
-
- expect(content).toContain('Android', 'Bash', 'C++');
- });
-
- it('has the correct template name', () => {
- expect(findTemplateName().text()).toBe('Android');
- });
-
- it('links to the correct template', () => {
- expect(findTemplateLink().attributes('href')).toBe(
- pipelineEditorPath.concat('?template=Android'),
- );
- });
-
- it('has the description of the template', () => {
- expect(findTemplateDescription().text()).toBe(
- 'CI/CD template to test and deploy your Android project.',
- );
- });
-
- it('has the right logo of the template', () => {
- expect(findTemplateLogo().attributes('src')).toBe('/assets/illustrations/logos/android.svg');
- });
- });
-
- describe('tracking', () => {
- beforeEach(() => {
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- });
-
- afterEach(() => {
- unmockTracking();
- });
-
- it('sends an event when template is clicked', () => {
- findTemplateLink().vm.$emit('click');
-
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
- label: 'Android',
- });
- });
- });
-});
diff --git a/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js b/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js
deleted file mode 100644
index 14860f20317..00000000000
--- a/spec/frontend/pipelines/empty_state/pipelines_ci_templates_spec.js
+++ /dev/null
@@ -1,158 +0,0 @@
-import '~/commons';
-import { GlButton, GlSprintf } from '@gitlab/ui';
-import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
-import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
-import { stubExperiments } from 'helpers/experimentation_helper';
-import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
-import ExperimentTracking from '~/experimentation/experiment_tracking';
-import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
-import CiTemplates from '~/pipelines/components/pipelines_list/empty_state/ci_templates.vue';
-import {
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- I18N,
-} from '~/pipeline_editor/constants';
-
-const pipelineEditorPath = '/-/ci/editor';
-
-jest.mock('~/experimentation/experiment_tracking');
-
-describe('Pipelines CI Templates', () => {
- let wrapper;
- let trackingSpy;
-
- const createWrapper = (propsData = {}, stubs = {}) => {
- return shallowMountExtended(PipelinesCiTemplates, {
- provide: {
- pipelineEditorPath,
- },
- propsData,
- stubs,
- });
- };
-
- const findTestTemplateLink = () => wrapper.findByTestId('test-template-link');
- const findCiTemplates = () => wrapper.findComponent(CiTemplates);
- const findSettingsLink = () => wrapper.findByTestId('settings-link');
- const findDocumentationLink = () => wrapper.findByTestId('documentation-link');
- const findSettingsButton = () => wrapper.findByTestId('settings-button');
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
- describe('renders test template', () => {
- beforeEach(() => {
- wrapper = createWrapper();
- });
-
- it('links to the getting started template', () => {
- expect(findTestTemplateLink().attributes('href')).toBe(
- pipelineEditorPath.concat('?template=Getting-Started'),
- );
- });
- });
-
- describe('tracking', () => {
- beforeEach(() => {
- wrapper = createWrapper();
- trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
- });
-
- afterEach(() => {
- unmockTracking();
- });
-
- it('sends an event when Getting-Started template is clicked', () => {
- findTestTemplateLink().vm.$emit('click');
-
- expect(trackingSpy).toHaveBeenCalledTimes(1);
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'template_clicked', {
- label: 'Getting-Started',
- });
- });
- });
-
- describe('when the runners_availability_section experiment is active', () => {
- beforeEach(() => {
- stubExperiments({ runners_availability_section: 'candidate' });
- });
-
- describe('when runners are available', () => {
- beforeEach(() => {
- wrapper = createWrapper({ anyRunnersAvailable: true }, { GitlabExperiment, GlSprintf });
- });
-
- it('show the runners available section', () => {
- expect(wrapper.text()).toContain(I18N.runners.title);
- });
-
- it('tracks an event when clicking the settings link', () => {
- findSettingsLink().vm.$emit('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_SETTINGS_LINK_CLICKED_EVENT,
- );
- });
-
- it('tracks an event when clicking the documentation link', () => {
- findDocumentationLink().vm.$emit('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_DOCUMENTATION_LINK_CLICKED_EVENT,
- );
- });
- });
-
- describe('when runners are not available', () => {
- beforeEach(() => {
- wrapper = createWrapper({ anyRunnersAvailable: false }, { GitlabExperiment, GlButton });
- });
-
- it('show the no runners available section', () => {
- expect(wrapper.text()).toContain(I18N.noRunners.title);
- });
-
- it('tracks an event when clicking the settings button', () => {
- findSettingsButton().trigger('click');
-
- expect(ExperimentTracking).toHaveBeenCalledWith(
- RUNNERS_AVAILABILITY_SECTION_EXPERIMENT_NAME,
- );
- expect(ExperimentTracking.prototype.event).toHaveBeenCalledWith(
- RUNNERS_SETTINGS_BUTTON_CLICKED_EVENT,
- );
- });
- });
- });
-
- describe.each`
- experimentVariant | anyRunnersAvailable | templatesRendered
- ${'control'} | ${true} | ${true}
- ${'control'} | ${false} | ${true}
- ${'candidate'} | ${true} | ${true}
- ${'candidate'} | ${false} | ${false}
- `(
- 'when the runners_availability_section experiment variant is $experimentVariant and runners are available: $anyRunnersAvailable',
- ({ experimentVariant, anyRunnersAvailable, templatesRendered }) => {
- beforeEach(() => {
- stubExperiments({ runners_availability_section: experimentVariant });
- wrapper = createWrapper({ anyRunnersAvailable });
- });
-
- it(`renders the templates: ${templatesRendered}`, () => {
- expect(findTestTemplateLink().exists()).toBe(templatesRendered);
- expect(findCiTemplates().exists()).toBe(templatesRendered);
- });
- },
- );
-});
diff --git a/spec/frontend/pipelines/empty_state_spec.js b/spec/frontend/pipelines/empty_state_spec.js
index 46dad4a035c..0abf7f59717 100644
--- a/spec/frontend/pipelines/empty_state_spec.js
+++ b/spec/frontend/pipelines/empty_state_spec.js
@@ -1,7 +1,11 @@
import '~/commons';
-import { mount } from '@vue/test-utils';
+import { shallowMount } from '@vue/test-utils';
+import { GlEmptyState } from '@gitlab/ui';
+import { stubExperiments } from 'helpers/experimentation_helper';
import EmptyState from '~/pipelines/components/pipelines_list/empty_state.vue';
+import GitlabExperiment from '~/experimentation/components/gitlab_experiment.vue';
import PipelinesCiTemplates from '~/pipelines/components/pipelines_list/empty_state/pipelines_ci_templates.vue';
+import IosTemplates from '~/pipelines/components/pipelines_list/empty_state/ios_templates.vue';
describe('Pipelines Empty State', () => {
let wrapper;
@@ -9,44 +13,68 @@ describe('Pipelines Empty State', () => {
const findIllustration = () => wrapper.find('img');
const findButton = () => wrapper.find('a');
const pipelinesCiTemplates = () => wrapper.findComponent(PipelinesCiTemplates);
+ const iosTemplates = () => wrapper.findComponent(IosTemplates);
const createWrapper = (props = {}) => {
- wrapper = mount(EmptyState, {
+ wrapper = shallowMount(EmptyState, {
provide: {
pipelineEditorPath: '',
suggestedCiTemplates: [],
+ anyRunnersAvailable: true,
+ ciRunnerSettingsPath: '',
},
propsData: {
emptyStateSvgPath: 'foo.svg',
canSetCi: true,
...props,
},
+ stubs: {
+ GlEmptyState,
+ GitlabExperiment,
+ },
});
};
+ afterEach(() => {
+ wrapper.destroy();
+ wrapper = null;
+ });
+
describe('when user can configure CI', () => {
- beforeEach(() => {
- createWrapper({}, mount);
- });
+ describe('when the ios_specific_templates experiment is active', () => {
+ beforeEach(() => {
+ stubExperiments({ ios_specific_templates: 'candidate' });
+ createWrapper();
+ });
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
+ it('should render the iOS templates', () => {
+ expect(iosTemplates().exists()).toBe(true);
+ });
+
+ it('should not render the CI/CD templates', () => {
+ expect(pipelinesCiTemplates().exists()).toBe(false);
+ });
});
- it('should render the CI/CD templates', () => {
- expect(pipelinesCiTemplates().exists()).toBe(true);
+ describe('when the ios_specific_templates experiment is inactive', () => {
+ beforeEach(() => {
+ stubExperiments({ ios_specific_templates: 'control' });
+ createWrapper();
+ });
+
+ it('should render the CI/CD templates', () => {
+ expect(pipelinesCiTemplates().exists()).toBe(true);
+ });
+
+ it('should not render the iOS templates', () => {
+ expect(iosTemplates().exists()).toBe(false);
+ });
});
});
describe('when user cannot configure CI', () => {
beforeEach(() => {
- createWrapper({ canSetCi: false }, mount);
- });
-
- afterEach(() => {
- wrapper.destroy();
- wrapper = null;
+ createWrapper({ canSetCi: false });
});
it('should render empty state SVG', () => {
diff --git a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
index cb7073fb5f5..49d64c6eac0 100644
--- a/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
+++ b/spec/frontend/pipelines/graph/graph_component_wrapper_spec.js
@@ -16,7 +16,7 @@ import {
} from '~/performance/constants';
import * as perfUtils from '~/performance/utils';
import {
- IID_FAILURE,
+ ACTION_FAILURE,
LAYER_VIEW,
STAGE_VIEW,
VIEW_TYPE_KEY,
@@ -188,7 +188,9 @@ describe('Pipeline graph wrapper', () => {
it('displays the no iid alert', () => {
expect(getAlert().exists()).toBe(true);
- expect(getAlert().text()).toBe(wrapper.vm.$options.errorTexts[IID_FAILURE]);
+ expect(getAlert().text()).toBe(
+ 'The data in this pipeline is too old to be rendered as a graph. Please check the Jobs tab to access historical data.',
+ );
});
it('does not display the graph', () => {
@@ -196,6 +198,27 @@ describe('Pipeline graph wrapper', () => {
});
});
+ describe('when there is an error with an action in the graph', () => {
+ beforeEach(async () => {
+ createComponentWithApollo();
+ await waitForPromises();
+ await getGraph().vm.$emit('error', { type: ACTION_FAILURE });
+ });
+
+ it('does not display the loading icon', () => {
+ expect(getLoadingIcon().exists()).toBe(false);
+ });
+
+ it('displays the action error alert', () => {
+ expect(getAlert().exists()).toBe(true);
+ expect(getAlert().text()).toBe('An error occurred while performing this action.');
+ });
+
+ it('displays the graph', () => {
+ expect(getGraph().exists()).toBe(true);
+ });
+ });
+
describe('when refresh action is emitted', () => {
beforeEach(async () => {
createComponentWithApollo();
diff --git a/spec/frontend/pipelines/graph/job_item_spec.js b/spec/frontend/pipelines/graph/job_item_spec.js
index 23e7ed7ebb4..4f0da09fec6 100644
--- a/spec/frontend/pipelines/graph/job_item_spec.js
+++ b/spec/frontend/pipelines/graph/job_item_spec.js
@@ -1,89 +1,34 @@
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { GlBadge } from '@gitlab/ui';
import JobItem from '~/pipelines/components/graph/job_item.vue';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import {
+ delayedJob,
+ mockJob,
+ mockJobWithoutDetails,
+ mockJobWithUnauthorizedAction,
+ triggerJob,
+} from './mock_data';
describe('pipeline graph job item', () => {
let wrapper;
- const findJobWithoutLink = () => wrapper.find('[data-testid="job-without-link"]');
- const findJobWithLink = () => wrapper.find('[data-testid="job-with-link"]');
- const findActionComponent = () => wrapper.find('[data-testid="ci-action-component"]');
+ const findJobWithoutLink = () => wrapper.findByTestId('job-without-link');
+ const findJobWithLink = () => wrapper.findByTestId('job-with-link');
+ const findActionComponent = () => wrapper.findByTestId('ci-action-component');
+ const findBadge = () => wrapper.findComponent(GlBadge);
const createWrapper = (propsData) => {
- wrapper = mount(JobItem, {
- propsData,
- });
+ wrapper = extendedWrapper(
+ mount(JobItem, {
+ propsData,
+ }),
+ );
};
const triggerActiveClass = 'gl-shadow-x0-y0-b3-s1-blue-500';
- const delayedJob = {
- __typename: 'CiJob',
- name: 'delayed job',
- scheduledAt: '2015-07-03T10:01:00.000Z',
- needs: [],
- status: {
- __typename: 'DetailedStatus',
- icon: 'status_scheduled',
- tooltip: 'delayed manual action (%{remainingTime})',
- hasDetails: true,
- detailsPath: '/root/kinder-pipe/-/jobs/5339',
- group: 'scheduled',
- action: {
- __typename: 'StatusAction',
- icon: 'time-out',
- title: 'Unschedule',
- path: '/frontend-fixtures/builds-project/-/jobs/142/unschedule',
- buttonTitle: 'Unschedule job',
- },
- },
- };
-
- const mockJob = {
- id: 4256,
- name: 'test',
- status: {
- icon: 'status_success',
- text: 'passed',
- label: 'passed',
- tooltip: 'passed',
- group: 'success',
- detailsPath: '/root/ci-mock/builds/4256',
- hasDetails: true,
- action: {
- icon: 'retry',
- title: 'Retry',
- path: '/root/ci-mock/builds/4256/retry',
- method: 'post',
- },
- },
- };
- const mockJobWithoutDetails = {
- id: 4257,
- name: 'job_without_details',
- status: {
- icon: 'status_success',
- text: 'passed',
- label: 'passed',
- group: 'success',
- detailsPath: '/root/ci-mock/builds/4257',
- hasDetails: false,
- },
- };
- const mockJobWithUnauthorizedAction = {
- id: 4258,
- name: 'stop-environment',
- status: {
- icon: 'status_manual',
- label: 'manual stop action (not allowed)',
- tooltip: 'manual action',
- group: 'manual',
- detailsPath: '/root/ci-mock/builds/4258',
- hasDetails: true,
- action: null,
- },
- };
-
afterEach(() => {
wrapper.destroy();
});
@@ -148,13 +93,25 @@ describe('pipeline graph job item', () => {
});
});
- it('should render provided class name', () => {
- createWrapper({
- job: mockJob,
- cssClassJobName: 'css-class-job-name',
+ describe('job style', () => {
+ beforeEach(() => {
+ createWrapper({
+ job: mockJob,
+ cssClassJobName: 'css-class-job-name',
+ });
+ });
+
+ it('should render provided class name', () => {
+ expect(wrapper.find('a').classes()).toContain('css-class-job-name');
+ });
+
+ it('does not show a badge on the job item', () => {
+ expect(findBadge().exists()).toBe(false);
});
- expect(wrapper.find('a').classes()).toContain('css-class-job-name');
+ it('does not apply the trigger job class', () => {
+ expect(findJobWithLink().classes()).not.toContain('gl-rounded-lg');
+ });
});
describe('status label', () => {
@@ -201,34 +158,51 @@ describe('pipeline graph job item', () => {
});
});
- describe('trigger job highlighting', () => {
- it.each`
- job | jobName | expanded | link
- ${mockJob} | ${mockJob.name} | ${true} | ${true}
- ${mockJobWithoutDetails} | ${mockJobWithoutDetails.name} | ${true} | ${false}
- `(
- `trigger job should stay highlighted when downstream is expanded`,
- ({ job, jobName, expanded, link }) => {
- createWrapper({ job, pipelineExpanded: { jobName, expanded } });
- const findJobEl = link ? findJobWithLink : findJobWithoutLink;
-
- expect(findJobEl().classes()).toContain(triggerActiveClass);
- },
- );
+ describe('trigger job', () => {
+ describe('card', () => {
+ beforeEach(() => {
+ createWrapper({ job: triggerJob });
+ });
- it.each`
- job | jobName | expanded | link
- ${mockJob} | ${mockJob.name} | ${false} | ${true}
- ${mockJobWithoutDetails} | ${mockJobWithoutDetails.name} | ${false} | ${false}
- `(
- `trigger job should not be highlighted when downstream is not expanded`,
- ({ job, jobName, expanded, link }) => {
- createWrapper({ job, pipelineExpanded: { jobName, expanded } });
- const findJobEl = link ? findJobWithLink : findJobWithoutLink;
-
- expect(findJobEl().classes()).not.toContain(triggerActiveClass);
- },
- );
+ it('shows a badge on the job item', () => {
+ expect(findBadge().exists()).toBe(true);
+ expect(findBadge().text()).toBe('Trigger job');
+ });
+
+ it('applies a rounded corner style instead of the usual pill shape', () => {
+ expect(findJobWithoutLink().classes()).toContain('gl-rounded-lg');
+ });
+ });
+
+ describe('highlighting', () => {
+ it.each`
+ job | jobName | expanded | link
+ ${mockJob} | ${mockJob.name} | ${true} | ${true}
+ ${mockJobWithoutDetails} | ${mockJobWithoutDetails.name} | ${true} | ${false}
+ `(
+ `trigger job should stay highlighted when downstream is expanded`,
+ ({ job, jobName, expanded, link }) => {
+ createWrapper({ job, pipelineExpanded: { jobName, expanded } });
+ const findJobEl = link ? findJobWithLink : findJobWithoutLink;
+
+ expect(findJobEl().classes()).toContain(triggerActiveClass);
+ },
+ );
+
+ it.each`
+ job | jobName | expanded | link
+ ${mockJob} | ${mockJob.name} | ${false} | ${true}
+ ${mockJobWithoutDetails} | ${mockJobWithoutDetails.name} | ${false} | ${false}
+ `(
+ `trigger job should not be highlighted when downstream is not expanded`,
+ ({ job, jobName, expanded, link }) => {
+ createWrapper({ job, pipelineExpanded: { jobName, expanded } });
+ const findJobEl = link ? findJobWithLink : findJobWithoutLink;
+
+ expect(findJobEl().classes()).not.toContain(triggerActiveClass);
+ },
+ );
+ });
});
describe('job classes', () => {
diff --git a/spec/frontend/pipelines/graph/linked_pipeline_spec.js b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
index d800a8c341e..06fd970778c 100644
--- a/spec/frontend/pipelines/graph/linked_pipeline_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipeline_spec.js
@@ -1,11 +1,21 @@
-import { GlButton, GlLoadingIcon } from '@gitlab/ui';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import { GlButton, GlLoadingIcon, GlTooltip } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { convertToGraphQLId } from '~/graphql_shared/utils';
import { BV_HIDE_TOOLTIP } from '~/lib/utils/constants';
-import { UPSTREAM, DOWNSTREAM } from '~/pipelines/components/graph/constants';
+import { ACTION_FAILURE, UPSTREAM, DOWNSTREAM } from '~/pipelines/components/graph/constants';
import LinkedPipelineComponent from '~/pipelines/components/graph/linked_pipeline.vue';
+import { PIPELINE_GRAPHQL_TYPE } from '~/pipelines/constants';
+import CancelPipelineMutation from '~/pipelines/graphql/mutations/cancel_pipeline.mutation.graphql';
+import RetryPipelineMutation from '~/pipelines/graphql/mutations/retry_pipeline.mutation.graphql';
import CiStatus from '~/vue_shared/components/ci_icon.vue';
import mockPipeline from './linked_pipelines_mock_data';
+Vue.use(VueApollo);
+
describe('Linked pipeline', () => {
let wrapper;
@@ -27,22 +37,30 @@ describe('Linked pipeline', () => {
};
const findButton = () => wrapper.find(GlButton);
- const findDownstreamPipelineTitle = () => wrapper.find('[data-testid="downstream-title"]');
- const findPipelineLabel = () => wrapper.find('[data-testid="downstream-pipeline-label"]');
+ const findCancelButton = () => wrapper.findByLabelText('Cancel downstream pipeline');
+ const findCardTooltip = () => wrapper.findComponent(GlTooltip);
+ const findDownstreamPipelineTitle = () => wrapper.findByTestId('downstream-title');
+ const findExpandButton = () => wrapper.findByTestId('expand-pipeline-button');
const findLinkedPipeline = () => wrapper.find({ ref: 'linkedPipeline' });
const findLoadingIcon = () => wrapper.find(GlLoadingIcon);
- const findPipelineLink = () => wrapper.find('[data-testid="pipelineLink"]');
- const findExpandButton = () => wrapper.find('[data-testid="expand-pipeline-button"]');
-
- const createWrapper = (propsData, data = []) => {
- wrapper = mount(LinkedPipelineComponent, {
- propsData,
- data() {
- return {
- ...data,
- };
- },
- });
+ const findPipelineLabel = () => wrapper.findByTestId('downstream-pipeline-label');
+ const findPipelineLink = () => wrapper.findByTestId('pipelineLink');
+ const findRetryButton = () => wrapper.findByLabelText('Retry downstream pipeline');
+
+ const createWrapper = ({ propsData, downstreamRetryAction = false }) => {
+ const mockApollo = createMockApollo();
+
+ wrapper = extendedWrapper(
+ mount(LinkedPipelineComponent, {
+ propsData,
+ provide: {
+ glFeatures: {
+ downstreamRetryAction,
+ },
+ },
+ apolloProvider: mockApollo,
+ }),
+ );
};
afterEach(() => {
@@ -59,7 +77,7 @@ describe('Linked pipeline', () => {
};
beforeEach(() => {
- createWrapper(props);
+ createWrapper({ propsData: props });
});
it('should render the project name', () => {
@@ -84,18 +102,13 @@ describe('Linked pipeline', () => {
expect(wrapper.text()).toContain(`#${props.pipeline.id}`);
});
- it('should correctly compute the tooltip text', () => {
- expect(wrapper.vm.tooltipText).toContain(mockPipeline.project.name);
- expect(wrapper.vm.tooltipText).toContain(mockPipeline.status.label);
- expect(wrapper.vm.tooltipText).toContain(mockPipeline.sourceJob.name);
- expect(wrapper.vm.tooltipText).toContain(mockPipeline.id);
- });
+ it('adds the card tooltip text to the DOM', () => {
+ expect(findCardTooltip().exists()).toBe(true);
- it('should render the tooltip text as the title attribute', () => {
- const titleAttr = findLinkedPipeline().attributes('title');
-
- expect(titleAttr).toContain(mockPipeline.project.name);
- expect(titleAttr).toContain(mockPipeline.status.label);
+ 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);
});
it('should display multi-project label when pipeline project id is not the same as triggered pipeline project id', () => {
@@ -105,7 +118,7 @@ describe('Linked pipeline', () => {
describe('upstream pipelines', () => {
beforeEach(() => {
- createWrapper(upstreamProps);
+ createWrapper({ propsData: upstreamProps });
});
it('should display parent label when pipeline project id is the same as triggered_by pipeline project id', () => {
@@ -123,45 +136,246 @@ describe('Linked pipeline', () => {
});
describe('downstream pipelines', () => {
- beforeEach(() => {
- createWrapper(downstreamProps);
- });
-
- it('parent/child label container should exist', () => {
- expect(findPipelineLabel().exists()).toBe(true);
- });
-
- it('should display child label when pipeline project id is the same as triggered pipeline project id', () => {
- expect(findPipelineLabel().exists()).toBe(true);
- });
-
- it('should have the name of the trigger job on the card when it is a child pipeline', () => {
- expect(findDownstreamPipelineTitle().text()).toBe(mockPipeline.sourceJob.name);
- });
-
- it('downstream pipeline should contain the correct link', () => {
- expect(findPipelineLink().attributes('href')).toBe(downstreamProps.pipeline.path);
+ describe('styling', () => {
+ beforeEach(() => {
+ createWrapper({ propsData: downstreamProps });
+ });
+
+ it('parent/child label container should exist', () => {
+ expect(findPipelineLabel().exists()).toBe(true);
+ });
+
+ it('should display child label when pipeline project id is the same as triggered pipeline project id', () => {
+ expect(findPipelineLabel().exists()).toBe(true);
+ });
+
+ it('should have the name of the trigger job on the card when it is a child pipeline', () => {
+ expect(findDownstreamPipelineTitle().text()).toBe(mockPipeline.sourceJob.name);
+ });
+
+ it('downstream pipeline should contain the correct link', () => {
+ expect(findPipelineLink().attributes('href')).toBe(downstreamProps.pipeline.path);
+ });
+
+ it('applies the flex-row css class to the card', () => {
+ expect(findLinkedPipeline().classes()).toContain('gl-flex-direction-row');
+ expect(findLinkedPipeline().classes()).not.toContain('gl-flex-direction-row-reverse');
+ });
});
- it('applies the flex-row css class to the card', () => {
- expect(findLinkedPipeline().classes()).toContain('gl-flex-direction-row');
- expect(findLinkedPipeline().classes()).not.toContain('gl-flex-direction-row-reverse');
+ describe('action button', () => {
+ describe('with the `downstream_retry_action` flag on', () => {
+ describe('with permissions', () => {
+ describe('on an upstream', () => {
+ describe('when retryable', () => {
+ beforeEach(() => {
+ const retryablePipeline = {
+ ...upstreamProps,
+ pipeline: { ...mockPipeline, retryable: true },
+ };
+
+ createWrapper({ propsData: retryablePipeline, downstreamRetryAction: true });
+ });
+
+ it('does not show the retry or cancel button', () => {
+ expect(findCancelButton().exists()).toBe(false);
+ expect(findRetryButton().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('on a downstream', () => {
+ describe('when retryable', () => {
+ beforeEach(() => {
+ const retryablePipeline = {
+ ...downstreamProps,
+ pipeline: { ...mockPipeline, retryable: true },
+ };
+
+ createWrapper({ propsData: retryablePipeline, downstreamRetryAction: true });
+ });
+
+ it('shows only the retry button', () => {
+ expect(findCancelButton().exists()).toBe(false);
+ expect(findRetryButton().exists()).toBe(true);
+ });
+
+ it('hides the card tooltip when the action button tooltip is hovered', async () => {
+ expect(findCardTooltip().exists()).toBe(true);
+
+ await findRetryButton().trigger('mouseover');
+
+ expect(findCardTooltip().exists()).toBe(false);
+ });
+
+ describe('and the retry button is clicked', () => {
+ describe('on success', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
+ jest.spyOn(wrapper.vm, '$emit');
+ await findRetryButton().trigger('click');
+ });
+
+ it('calls the retry mutation ', () => {
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledTimes(1);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: RetryPipelineMutation,
+ variables: {
+ id: convertToGraphQLId(PIPELINE_GRAPHQL_TYPE, mockPipeline.id),
+ },
+ });
+ });
+
+ it('emits the refreshPipelineGraph event', () => {
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('refreshPipelineGraph');
+ });
+ });
+
+ describe('on failure', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue({ errors: [] });
+ jest.spyOn(wrapper.vm, '$emit');
+ await findRetryButton().trigger('click');
+ });
+
+ it('emits an error event', () => {
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('error', {
+ type: ACTION_FAILURE,
+ });
+ });
+ });
+ });
+ });
+
+ describe('when cancelable', () => {
+ beforeEach(() => {
+ const cancelablePipeline = {
+ ...downstreamProps,
+ pipeline: { ...mockPipeline, cancelable: true },
+ };
+
+ createWrapper({ propsData: cancelablePipeline, downstreamRetryAction: true });
+ });
+
+ it('shows only the cancel button ', () => {
+ expect(findCancelButton().exists()).toBe(true);
+ expect(findRetryButton().exists()).toBe(false);
+ });
+
+ it('hides the card tooltip when the action button tooltip is hovered', async () => {
+ expect(findCardTooltip().exists()).toBe(true);
+
+ await findCancelButton().trigger('mouseover');
+
+ expect(findCardTooltip().exists()).toBe(false);
+ });
+
+ describe('and the cancel button is clicked', () => {
+ describe('on success', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue();
+ jest.spyOn(wrapper.vm, '$emit');
+ await findCancelButton().trigger('click');
+ });
+
+ it('calls the cancel mutation', () => {
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledTimes(1);
+ expect(wrapper.vm.$apollo.mutate).toHaveBeenCalledWith({
+ mutation: CancelPipelineMutation,
+ variables: {
+ id: convertToGraphQLId(PIPELINE_GRAPHQL_TYPE, mockPipeline.id),
+ },
+ });
+ });
+ it('emits the refreshPipelineGraph event', () => {
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('refreshPipelineGraph');
+ });
+ });
+ describe('on failure', () => {
+ beforeEach(async () => {
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValue({ errors: [] });
+ jest.spyOn(wrapper.vm, '$emit');
+ await findCancelButton().trigger('click');
+ });
+ it('emits an error event', () => {
+ expect(wrapper.vm.$emit).toHaveBeenCalledWith('error', {
+ type: ACTION_FAILURE,
+ });
+ });
+ });
+ });
+ });
+
+ describe('when both cancellable and retryable', () => {
+ beforeEach(() => {
+ const pipelineWithTwoActions = {
+ ...downstreamProps,
+ pipeline: { ...mockPipeline, cancelable: true, retryable: true },
+ };
+
+ createWrapper({ propsData: pipelineWithTwoActions, downstreamRetryAction: true });
+ });
+
+ it('only shows the cancel button', () => {
+ expect(findRetryButton().exists()).toBe(false);
+ expect(findCancelButton().exists()).toBe(true);
+ });
+ });
+ });
+ });
+
+ describe('without permissions', () => {
+ beforeEach(() => {
+ const pipelineWithTwoActions = {
+ ...downstreamProps,
+ pipeline: {
+ ...mockPipeline,
+ cancelable: true,
+ retryable: true,
+ userPermissions: { updatePipeline: false },
+ },
+ };
+
+ createWrapper({ propsData: pipelineWithTwoActions });
+ });
+
+ it('does not show any action button', () => {
+ expect(findRetryButton().exists()).toBe(false);
+ expect(findCancelButton().exists()).toBe(false);
+ });
+ });
+ });
+
+ describe('with the `downstream_retry_action` flag off', () => {
+ beforeEach(() => {
+ const pipelineWithTwoActions = {
+ ...downstreamProps,
+ pipeline: { ...mockPipeline, cancelable: true, retryable: true },
+ };
+
+ createWrapper({ propsData: pipelineWithTwoActions });
+ });
+ it('does not show any action button', () => {
+ expect(findRetryButton().exists()).toBe(false);
+ expect(findCancelButton().exists()).toBe(false);
+ });
+ });
});
});
describe('expand button', () => {
it.each`
- pipelineType | anglePosition | borderClass | expanded
- ${downstreamProps} | ${'angle-right'} | ${'gl-border-l-1!'} | ${false}
- ${downstreamProps} | ${'angle-left'} | ${'gl-border-l-1!'} | ${true}
- ${upstreamProps} | ${'angle-left'} | ${'gl-border-r-1!'} | ${false}
- ${upstreamProps} | ${'angle-right'} | ${'gl-border-r-1!'} | ${true}
+ pipelineType | anglePosition | buttonBorderClasses | expanded
+ ${downstreamProps} | ${'angle-right'} | ${'gl-border-l-0!'} | ${false}
+ ${downstreamProps} | ${'angle-left'} | ${'gl-border-l-0!'} | ${true}
+ ${upstreamProps} | ${'angle-left'} | ${'gl-border-r-0!'} | ${false}
+ ${upstreamProps} | ${'angle-right'} | ${'gl-border-r-0!'} | ${true}
`(
- '$pipelineType.columnTitle pipeline button icon should be $anglePosition with $borderClass if expanded state is $expanded',
- ({ pipelineType, anglePosition, borderClass, expanded }) => {
- createWrapper({ ...pipelineType, expanded });
+ '$pipelineType.columnTitle pipeline button icon should be $anglePosition with $buttonBorderClasses if expanded state is $expanded',
+ ({ pipelineType, anglePosition, buttonBorderClasses, expanded }) => {
+ createWrapper({ propsData: { ...pipelineType, expanded } });
expect(findExpandButton().props('icon')).toBe(anglePosition);
- expect(findExpandButton().classes()).toContain(borderClass);
+ expect(findExpandButton().classes()).toContain(buttonBorderClasses);
},
);
});
@@ -176,7 +390,7 @@ describe('Linked pipeline', () => {
};
beforeEach(() => {
- createWrapper(props);
+ createWrapper({ propsData: props });
});
it('loading icon is visible', () => {
@@ -194,7 +408,7 @@ describe('Linked pipeline', () => {
};
beforeEach(() => {
- createWrapper(props);
+ createWrapper({ propsData: props });
});
it('emits `pipelineClicked` event', () => {
diff --git a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
index 1673065e09c..46000711110 100644
--- a/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
+++ b/spec/frontend/pipelines/graph/linked_pipelines_column_spec.js
@@ -67,7 +67,6 @@ describe('Linked Pipelines Column', () => {
afterEach(() => {
wrapper.destroy();
- wrapper = null;
});
describe('it renders correctly', () => {
diff --git a/spec/frontend/pipelines/graph/linked_pipelines_mock_data.js b/spec/frontend/pipelines/graph/linked_pipelines_mock_data.js
index 955b70cbd3b..f7f5738e46d 100644
--- a/spec/frontend/pipelines/graph/linked_pipelines_mock_data.js
+++ b/spec/frontend/pipelines/graph/linked_pipelines_mock_data.js
@@ -2,6 +2,11 @@ export default {
__typename: 'Pipeline',
id: 195,
iid: '5',
+ retryable: false,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
path: '/root/elemenohpee/-/pipelines/195',
status: {
__typename: 'DetailedStatus',
diff --git a/spec/frontend/pipelines/graph/mock_data.js b/spec/frontend/pipelines/graph/mock_data.js
index 0cf7dc507f4..6124d67af09 100644
--- a/spec/frontend/pipelines/graph/mock_data.js
+++ b/spec/frontend/pipelines/graph/mock_data.js
@@ -1,4 +1,5 @@
import { unwrapPipelineData } from '~/pipelines/components/graph/utils';
+import { BUILD_KIND, BRIDGE_KIND } from '~/pipelines/components/graph/constants';
export const mockPipelineResponse = {
data: {
@@ -50,6 +51,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '6',
+ kind: BUILD_KIND,
name: 'build_a_nlfjkdnlvskfnksvjknlfdjvlvnjdkjdf_nvjkenjkrlngjeknjkl',
scheduledAt: null,
status: {
@@ -101,6 +103,7 @@ export const mockPipelineResponse = {
__typename: 'CiJob',
id: '11',
name: 'build_b',
+ kind: BUILD_KIND,
scheduledAt: null,
status: {
__typename: 'DetailedStatus',
@@ -151,6 +154,7 @@ export const mockPipelineResponse = {
__typename: 'CiJob',
id: '16',
name: 'build_c',
+ kind: BUILD_KIND,
scheduledAt: null,
status: {
__typename: 'DetailedStatus',
@@ -200,6 +204,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '21',
+ kind: BUILD_KIND,
name: 'build_d 1/3',
scheduledAt: null,
status: {
@@ -232,6 +237,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '24',
+ kind: BUILD_KIND,
name: 'build_d 2/3',
scheduledAt: null,
status: {
@@ -264,6 +270,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '27',
+ kind: BUILD_KIND,
name: 'build_d 3/3',
scheduledAt: null,
status: {
@@ -329,6 +336,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '34',
+ kind: BUILD_KIND,
name: 'test_a',
scheduledAt: null,
status: {
@@ -413,6 +421,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '42',
+ kind: BUILD_KIND,
name: 'test_b 1/2',
scheduledAt: null,
status: {
@@ -499,6 +508,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '67',
+ kind: BUILD_KIND,
name: 'test_b 2/2',
scheduledAt: null,
status: {
@@ -603,6 +613,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '59',
+ kind: BUILD_KIND,
name: 'test_c',
scheduledAt: null,
status: {
@@ -646,6 +657,7 @@ export const mockPipelineResponse = {
{
__typename: 'CiJob',
id: '53',
+ kind: BUILD_KIND,
name: 'test_d',
scheduledAt: null,
status: {
@@ -699,6 +711,11 @@ export const downstream = {
id: 175,
iid: '31',
path: '/root/elemenohpee/-/pipelines/175',
+ retryable: true,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
status: {
id: '70',
group: 'success',
@@ -724,6 +741,11 @@ export const downstream = {
id: 181,
iid: '27',
path: '/root/abcd-dag/-/pipelines/181',
+ retryable: true,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
status: {
id: '72',
group: 'success',
@@ -752,6 +774,11 @@ export const upstream = {
id: 161,
iid: '24',
path: '/root/abcd-dag/-/pipelines/161',
+ retryable: true,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
status: {
id: '74',
group: 'success',
@@ -786,6 +813,11 @@ export const wrappedPipelineReturn = {
updatePipeline: true,
},
downstream: {
+ retryable: true,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
__typename: 'PipelineConnection',
nodes: [],
},
@@ -793,6 +825,11 @@ export const wrappedPipelineReturn = {
id: 'gid://gitlab/Ci::Pipeline/174',
iid: '37',
path: '/root/elemenohpee/-/pipelines/174',
+ retryable: true,
+ cancelable: false,
+ userPermissions: {
+ updatePipeline: true,
+ },
__typename: 'Pipeline',
status: {
__typename: 'DetailedStatus',
@@ -846,6 +883,7 @@ export const wrappedPipelineReturn = {
{
__typename: 'CiJob',
id: '83',
+ kind: BUILD_KIND,
name: 'build_n',
scheduledAt: null,
needs: {
@@ -916,3 +954,87 @@ export const mockCalloutsResponse = (mappedCallouts) => ({
},
},
});
+
+export const delayedJob = {
+ __typename: 'CiJob',
+ kind: BUILD_KIND,
+ name: 'delayed job',
+ scheduledAt: '2015-07-03T10:01:00.000Z',
+ needs: [],
+ status: {
+ __typename: 'DetailedStatus',
+ icon: 'status_scheduled',
+ tooltip: 'delayed manual action (%{remainingTime})',
+ hasDetails: true,
+ detailsPath: '/root/kinder-pipe/-/jobs/5339',
+ group: 'scheduled',
+ action: {
+ __typename: 'StatusAction',
+ icon: 'time-out',
+ title: 'Unschedule',
+ path: '/frontend-fixtures/builds-project/-/jobs/142/unschedule',
+ buttonTitle: 'Unschedule job',
+ },
+ },
+};
+
+export const mockJob = {
+ id: 4256,
+ name: 'test',
+ kind: BUILD_KIND,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ tooltip: 'passed',
+ group: 'success',
+ detailsPath: '/root/ci-mock/builds/4256',
+ hasDetails: true,
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/root/ci-mock/builds/4256/retry',
+ method: 'post',
+ },
+ },
+};
+
+export const mockJobWithoutDetails = {
+ id: 4257,
+ name: 'job_without_details',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ detailsPath: '/root/ci-mock/builds/4257',
+ hasDetails: false,
+ },
+};
+
+export const mockJobWithUnauthorizedAction = {
+ id: 4258,
+ name: 'stop-environment',
+ status: {
+ icon: 'status_manual',
+ label: 'manual stop action (not allowed)',
+ tooltip: 'manual action',
+ group: 'manual',
+ detailsPath: '/root/ci-mock/builds/4258',
+ hasDetails: true,
+ action: null,
+ },
+};
+
+export const triggerJob = {
+ id: 4259,
+ name: 'trigger',
+ kind: BRIDGE_KIND,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ group: 'success',
+ action: null,
+ },
+};
diff --git a/spec/frontend/pipelines/graph_shared/links_inner_spec.js b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
index be422fac92c..2c6d126e12c 100644
--- a/spec/frontend/pipelines/graph_shared/links_inner_spec.js
+++ b/spec/frontend/pipelines/graph_shared/links_inner_spec.js
@@ -1,5 +1,5 @@
import { shallowMount } from '@vue/test-utils';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import LinksInner from '~/pipelines/components/graph_shared/links_inner.vue';
import { parseData } from '~/pipelines/components/parsing_utils';
import { createJobsHash } from '~/pipelines/utils';
@@ -42,7 +42,7 @@ describe('Links Inner component', () => {
// We create fixture so that each job has an empty div that represent
// the JobPill in the DOM. Each `JobPill` would have different coordinates,
// so we increment their coordinates on each iteration to simulate different positions.
- const setFixtures = ({ stages }) => {
+ const setHTMLFixtureLocal = ({ stages }) => {
const jobs = createJobsHash(stages);
const arrayOfJobs = Object.keys(jobs);
@@ -82,6 +82,7 @@ describe('Links Inner component', () => {
afterEach(() => {
jest.restoreAllMocks();
wrapper.destroy();
+ resetHTMLFixture();
});
describe('basic SVG creation', () => {
@@ -124,7 +125,7 @@ describe('Links Inner component', () => {
describe('with one need', () => {
beforeEach(() => {
- setFixtures(pipelineData);
+ setHTMLFixtureLocal(pipelineData);
createComponent({ pipelineData: pipelineData.stages });
});
@@ -143,7 +144,7 @@ describe('Links Inner component', () => {
describe('with a parallel need', () => {
beforeEach(() => {
- setFixtures(parallelNeedData);
+ setHTMLFixtureLocal(parallelNeedData);
createComponent({ pipelineData: parallelNeedData.stages });
});
@@ -162,7 +163,7 @@ describe('Links Inner component', () => {
describe('with same stage needs', () => {
beforeEach(() => {
- setFixtures(sameStageNeeds);
+ setHTMLFixtureLocal(sameStageNeeds);
createComponent({ pipelineData: sameStageNeeds.stages });
});
@@ -181,7 +182,7 @@ describe('Links Inner component', () => {
describe('with a large number of needs', () => {
beforeEach(() => {
- setFixtures(largePipelineData);
+ setHTMLFixtureLocal(largePipelineData);
createComponent({ pipelineData: largePipelineData.stages });
});
@@ -200,7 +201,7 @@ describe('Links Inner component', () => {
describe('interactions', () => {
beforeEach(() => {
- setFixtures(largePipelineData);
+ setHTMLFixtureLocal(largePipelineData);
createComponent({ pipelineData: largePipelineData.stages });
});
diff --git a/spec/frontend/pipelines/header_component_spec.js b/spec/frontend/pipelines/header_component_spec.js
index c4639bd8e16..5cc11adf696 100644
--- a/spec/frontend/pipelines/header_component_spec.js
+++ b/spec/frontend/pipelines/header_component_spec.js
@@ -1,4 +1,4 @@
-import { GlModal, GlLoadingIcon } from '@gitlab/ui';
+import { GlAlert, GlModal, GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import waitForPromises from 'helpers/wait_for_promises';
@@ -21,6 +21,7 @@ describe('Pipeline details header', () => {
let glModalDirective;
let mutate = jest.fn();
+ const findAlert = () => wrapper.find(GlAlert);
const findDeleteModal = () => wrapper.find(GlModal);
const findRetryButton = () => wrapper.find('[data-testid="retryPipeline"]');
const findCancelButton = () => wrapper.find('[data-testid="cancelPipeline"]');
@@ -121,6 +122,22 @@ describe('Pipeline details header', () => {
it('should render retry action tooltip', () => {
expect(findRetryButton().attributes('title')).toBe(BUTTON_TOOLTIP_RETRY);
});
+
+ it('should display error message on failure', async () => {
+ const failureMessage = 'failure message';
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
+ data: {
+ pipelineRetry: {
+ errors: [failureMessage],
+ },
+ },
+ });
+
+ findRetryButton().vm.$emit('click');
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe(failureMessage);
+ });
});
describe('Retry action failed', () => {
@@ -156,6 +173,22 @@ describe('Pipeline details header', () => {
variables: { id: mockRunningPipelineHeader.id },
});
});
+
+ it('should display error message on failure', async () => {
+ const failureMessage = 'failure message';
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
+ data: {
+ pipelineCancel: {
+ errors: [failureMessage],
+ },
+ },
+ });
+
+ findCancelButton().vm.$emit('click');
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe(failureMessage);
+ });
});
describe('Delete action', () => {
@@ -179,6 +212,22 @@ describe('Pipeline details header', () => {
variables: { id: mockFailedPipelineHeader.id },
});
});
+
+ it('should display error message on failure', async () => {
+ const failureMessage = 'failure message';
+ jest.spyOn(wrapper.vm.$apollo, 'mutate').mockResolvedValue({
+ data: {
+ pipelineDestroy: {
+ errors: [failureMessage],
+ },
+ },
+ });
+
+ findDeleteModal().vm.$emit('ok');
+ await waitForPromises();
+
+ expect(findAlert().text()).toBe(failureMessage);
+ });
});
describe('Permissions', () => {
diff --git a/spec/frontend/pipelines/mock_data.js b/spec/frontend/pipelines/mock_data.js
index 59d4e808b32..57d1511d859 100644
--- a/spec/frontend/pipelines/mock_data.js
+++ b/spec/frontend/pipelines/mock_data.js
@@ -1141,3 +1141,218 @@ export const mockPipelineBranch = () => {
viewType: 'root',
};
};
+
+export const mockFailedJobsQueryResponse = {
+ data: {
+ project: {
+ __typename: 'Project',
+ id: 'gid://gitlab/Project/20',
+ pipeline: {
+ __typename: 'Pipeline',
+ id: 'gid://gitlab/Ci::Pipeline/300',
+ jobs: {
+ __typename: 'CiJobConnection',
+ nodes: [
+ {
+ __typename: 'CiJob',
+ status: 'FAILED',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'failed-1848-1848',
+ detailsPath: '/root/ci-project/-/jobs/1848',
+ group: 'failed',
+ icon: 'status_failed',
+ label: 'failed',
+ text: 'failed',
+ tooltip: 'failed - (script failure)',
+ action: {
+ __typename: 'StatusAction',
+ id: 'Ci::Build-failed-1848',
+ buttonTitle: 'Retry this job',
+ icon: 'retry',
+ method: 'post',
+ path: '/root/ci-project/-/jobs/1848/retry',
+ title: 'Retry',
+ },
+ },
+ id: 'gid://gitlab/Ci::Build/1848',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/358',
+ name: 'build',
+ },
+ name: 'wait_job',
+ retryable: true,
+ userPermissions: {
+ __typename: 'JobPermissions',
+ readBuild: true,
+ updateBuild: true,
+ },
+ },
+ {
+ __typename: 'CiJob',
+ status: 'FAILED',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'failed-1710-1710',
+ detailsPath: '/root/ci-project/-/jobs/1710',
+ group: 'failed',
+ icon: 'status_failed',
+ label: 'failed',
+ text: 'failed',
+ tooltip: 'failed - (script failure) (retried)',
+ action: null,
+ },
+ id: 'gid://gitlab/Ci::Build/1710',
+ stage: {
+ __typename: 'CiStage',
+ id: 'gid://gitlab/Ci::Stage/358',
+ name: 'build',
+ },
+ name: 'wait_job',
+ retryable: false,
+ userPermissions: {
+ __typename: 'JobPermissions',
+ readBuild: true,
+ updateBuild: true,
+ },
+ },
+ ],
+ },
+ },
+ },
+ },
+};
+
+export const mockFailedJobsSummaryData = [
+ {
+ id: 1848,
+ failure: null,
+ failure_summary:
+ '<span>Pulling docker image node:latest ...<br/></span><span>Using docker image sha256:738d733448be00c72cb6618b7a06a1424806c6d239d8885e92f9b1e8727092b5 for node:latest with digest node@sha256:e5b7b349d517159246070bf14242027a9e220ffa8bd98a67ba1495d969c06c01 ...<br/></span><div class="section-start" data-timestamp="1651175313" data-section="prepare-script" role="button"></div><span class="term-fg-l-cyan term-bold section section-header js-s-prepare-script">Preparing environment</span><span class="section section-header js-s-prepare-script"><br/></span><span class="section line js-s-prepare-script">Running on runner-kvkqh24-project-20-concurrent-0 via 0706719b1b8d...<br/></span><div class="section-end" data-section="prepare-script"></div><div class="section-start" data-timestamp="1651175313" data-section="get-sources" role="button"></div><span class="term-fg-l-cyan term-bold section section-header js-s-get-sources">Getting source from Git repository</span><span class="section section-header js-s-get-sources"><br/></span><span class="term-fg-l-green term-bold section line js-s-get-sources">Fetching changes with git depth set to 50...</span><span class="section line js-s-get-sources"><br/>Reinitialized existing Git repository in /builds/root/ci-project/.git/<br/>fatal: couldn\'t find remote ref refs/heads/test<br/></span><div class="section-end" data-section="get-sources"></div><span class="term-fg-l-red term-bold">ERROR: Job failed: exit code 1<br/></span>',
+ },
+];
+
+export const mockFailedJobsData = [
+ {
+ normalizedId: 1848,
+ __typename: 'CiJob',
+ status: 'FAILED',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'failed-1848-1848',
+ detailsPath: '/root/ci-project/-/jobs/1848',
+ group: 'failed',
+ icon: 'status_failed',
+ label: 'failed',
+ text: 'failed',
+ tooltip: 'failed - (script failure)',
+ action: {
+ __typename: 'StatusAction',
+ id: 'Ci::Build-failed-1848',
+ buttonTitle: 'Retry this job',
+ icon: 'retry',
+ method: 'post',
+ path: '/root/ci-project/-/jobs/1848/retry',
+ title: 'Retry',
+ },
+ },
+ id: 'gid://gitlab/Ci::Build/1848',
+ stage: { __typename: 'CiStage', id: 'gid://gitlab/Ci::Stage/358', name: 'build' },
+ name: 'wait_job',
+ retryable: true,
+ userPermissions: { __typename: 'JobPermissions', readBuild: true, updateBuild: true },
+ },
+ {
+ normalizedId: 1710,
+ __typename: 'CiJob',
+ status: 'FAILED',
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ id: 'failed-1710-1710',
+ detailsPath: '/root/ci-project/-/jobs/1710',
+ group: 'failed',
+ icon: 'status_failed',
+ label: 'failed',
+ text: 'failed',
+ tooltip: 'failed - (script failure) (retried)',
+ action: null,
+ },
+ id: 'gid://gitlab/Ci::Build/1710',
+ stage: { __typename: 'CiStage', id: 'gid://gitlab/Ci::Stage/358', name: 'build' },
+ name: 'wait_job',
+ retryable: false,
+ userPermissions: { __typename: 'JobPermissions', readBuild: true, updateBuild: true },
+ },
+];
+
+export const mockPreparedFailedJobsData = [
+ {
+ __typename: 'CiJob',
+ _showDetails: true,
+ detailedStatus: {
+ __typename: 'DetailedStatus',
+ action: {
+ __typename: 'StatusAction',
+ buttonTitle: 'Retry this job',
+ icon: 'retry',
+ id: 'Ci::Build-failed-1848',
+ method: 'post',
+ path: '/root/ci-project/-/jobs/1848/retry',
+ title: 'Retry',
+ },
+ detailsPath: '/root/ci-project/-/jobs/1848',
+ group: 'failed',
+ icon: 'status_failed',
+ id: 'failed-1848-1848',
+ label: 'failed',
+ text: 'failed',
+ tooltip: 'failed - (script failure)',
+ },
+ failure: null,
+ failureSummary:
+ '<span>Pulling docker image node:latest ...<br/></span><span>Using docker image sha256:738d733448be00c72cb6618b7a06a1424806c6d239d8885e92f9b1e8727092b5 for node:latest with digest node@sha256:e5b7b349d517159246070bf14242027a9e220ffa8bd98a67ba1495d969c06c01 ...<br/></span><div class="section-start" data-timestamp="1651175313" data-section="prepare-script" role="button"></div><span class="term-fg-l-cyan term-bold section section-header js-s-prepare-script">Preparing environment</span><span class="section section-header js-s-prepare-script"><br/></span><span class="section line js-s-prepare-script">Running on runner-kvkqh24-project-20-concurrent-0 via 0706719b1b8d...<br/></span><div class="section-end" data-section="prepare-script"></div><div class="section-start" data-timestamp="1651175313" data-section="get-sources" role="button"></div><span class="term-fg-l-cyan term-bold section section-header js-s-get-sources">Getting source from Git repository</span><span class="section section-header js-s-get-sources"><br/></span><span class="term-fg-l-green term-bold section line js-s-get-sources">Fetching changes with git depth set to 50...</span><span class="section line js-s-get-sources"><br/>Reinitialized existing Git repository in /builds/root/ci-project/.git/<br/>fatal: couldn\'t find remote ref refs/heads/test<br/></span><div class="section-end" data-section="get-sources"></div><span class="term-fg-l-red term-bold">ERROR: Job failed: exit code 1<br/></span>',
+ id: 'gid://gitlab/Ci::Build/1848',
+ name: 'wait_job',
+ normalizedId: 1848,
+ retryable: true,
+ stage: { __typename: 'CiStage', id: 'gid://gitlab/Ci::Stage/358', name: 'build' },
+ status: 'FAILED',
+ userPermissions: { __typename: 'JobPermissions', readBuild: true, updateBuild: true },
+ },
+];
+
+export const mockPreparedFailedJobsDataNoPermission = [
+ {
+ ...mockPreparedFailedJobsData[0],
+ userPermissions: { __typename: 'JobPermissions', readBuild: false, updateBuild: false },
+ },
+];
+
+export const successRetryMutationResponse = {
+ data: {
+ jobRetry: {
+ job: {
+ __typename: 'CiJob',
+ id: '"gid://gitlab/Ci::Build/1985"',
+ detailedStatus: {
+ detailsPath: '/root/project/-/jobs/1985',
+ id: 'pending-1985-1985',
+ __typename: 'DetailedStatus',
+ },
+ },
+ errors: [],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
+
+export const failedRetryMutationResponse = {
+ data: {
+ jobRetry: {
+ job: {},
+ errors: ['New Error'],
+ __typename: 'JobRetryPayload',
+ },
+ },
+};
diff --git a/spec/frontend/pipelines/pipeline_graph/utils_spec.js b/spec/frontend/pipelines/pipeline_graph/utils_spec.js
index 5816bc06fe3..d6b13da3c3a 100644
--- a/spec/frontend/pipelines/pipeline_graph/utils_spec.js
+++ b/spec/frontend/pipelines/pipeline_graph/utils_spec.js
@@ -1,4 +1,5 @@
-import { createJobsHash, generateJobNeedsDict } from '~/pipelines/utils';
+import { createJobsHash, generateJobNeedsDict, getPipelineDefaultTab } from '~/pipelines/utils';
+import { TAB_QUERY_PARAM, validPipelineTabNames } from '~/pipelines/constants';
describe('utils functions', () => {
const jobName1 = 'build_1';
@@ -169,4 +170,21 @@ describe('utils functions', () => {
});
});
});
+
+ describe('getPipelineDefaultTab', () => {
+ const baseUrl = 'http://gitlab.com/user/multi-projects-small/-/pipelines/332/';
+ it('returns null if there was no `tab` params', () => {
+ expect(getPipelineDefaultTab(baseUrl)).toBe(null);
+ });
+
+ it('returns null if there was no valid tab param', () => {
+ expect(getPipelineDefaultTab(`${baseUrl}?${TAB_QUERY_PARAM}=invalid`)).toBe(null);
+ });
+
+ it('returns the correct tab name if present', () => {
+ validPipelineTabNames.forEach((tabName) => {
+ expect(getPipelineDefaultTab(`${baseUrl}?${TAB_QUERY_PARAM}=${tabName}`)).toBe(tabName);
+ });
+ });
+ });
});
diff --git a/spec/frontend/pipelines/pipelines_spec.js b/spec/frontend/pipelines/pipelines_spec.js
index d2b30c93746..de9f394db43 100644
--- a/spec/frontend/pipelines/pipelines_spec.js
+++ b/spec/frontend/pipelines/pipelines_spec.js
@@ -82,6 +82,8 @@ describe('Pipelines', () => {
provide: {
pipelineEditorPath: '',
suggestedCiTemplates: [],
+ ciRunnerSettingsPath: paths.ciRunnerSettingsPath,
+ anyRunnersAvailable: true,
},
propsData: {
store: new Store(),
diff --git a/spec/frontend/pipelines/test_reports/stores/actions_spec.js b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
index d5acb115bc1..74a9d8c354f 100644
--- a/spec/frontend/pipelines/test_reports/stores/actions_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/actions_spec.js
@@ -82,17 +82,16 @@ describe('Actions TestReports Store', () => {
);
});
- it('should create flash on API error', async () => {
+ it('should call SET_SUITE_ERROR on error', () => {
const index = 0;
- await testAction(
+ return testAction(
actions.fetchTestSuite,
index,
{ ...state, testReports, suiteEndpoint: null },
- [],
+ [{ type: types.SET_SUITE_ERROR, payload: expect.any(Error) }],
[{ type: 'toggleLoading' }, { type: 'toggleLoading' }],
);
- expect(createFlash).toHaveBeenCalled();
});
describe('when we already have the suite data', () => {
diff --git a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
index f2dbeec6a06..6ab479a257c 100644
--- a/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
+++ b/spec/frontend/pipelines/test_reports/stores/mutations_spec.js
@@ -1,6 +1,9 @@
import testReports from 'test_fixtures/pipelines/test_report.json';
import * as types from '~/pipelines/stores/test_reports/mutation_types';
import mutations from '~/pipelines/stores/test_reports/mutations';
+import createFlash from '~/flash';
+
+jest.mock('~/flash.js');
describe('Mutations TestReports Store', () => {
let mockState;
@@ -44,6 +47,24 @@ 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';
+
+ mutations[types.SET_SUITE_ERROR](mockState, {
+ response: { data: { errors: message } },
+ });
+
+ expect(mockState.errorMessage).toBe(message);
+ });
+
+ it('should show a flash message otherwise', () => {
+ mutations[types.SET_SUITE_ERROR](mockState, {});
+
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+
describe('set selected suite index', () => {
it('should set selectedSuiteIndex', () => {
const selectedSuiteIndex = 0;
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 97241e14129..dc72fa31ace 100644
--- a/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
+++ b/spec/frontend/pipelines/test_reports/test_suite_table_spec.js
@@ -1,12 +1,13 @@
import { GlButton, GlFriendlyWrap, GlLink, GlPagination } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import Vuex from 'vuex';
import testReports from 'test_fixtures/pipelines/test_report.json';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import SuiteTable from '~/pipelines/components/test_reports/test_suite_table.vue';
import { TestStatus } from '~/pipelines/constants';
import * as getters from '~/pipelines/stores/test_reports/getters';
import { formatFilePath } from '~/pipelines/stores/test_reports/utils';
+import { ARTIFACTS_EXPIRED_ERROR_MESSAGE } from '~/pipelines/stores/test_reports/constants';
import skippedTestCases from './mock_data';
Vue.use(Vuex);
@@ -23,13 +24,14 @@ describe('Test reports suite table', () => {
const testCases = testSuite.test_cases;
const blobPath = '/test/blob/path';
- const noCasesMessage = () => wrapper.find('.js-no-test-cases');
- const allCaseRows = () => wrapper.findAll('.js-case-row');
- const findCaseRowAtIndex = (index) => wrapper.findAll('.js-case-row').at(index);
+ const noCasesMessage = () => wrapper.findByTestId('no-test-cases');
+ const artifactsExpiredMessage = () => wrapper.findByTestId('artifacts-expired');
+ const allCaseRows = () => wrapper.findAllByTestId('test-case-row');
+ const findCaseRowAtIndex = (index) => wrapper.findAllByTestId('test-case-row').at(index);
const findLinkForRow = (row) => row.find(GlLink);
const findIconForRow = (row, status) => row.find(`.ci-status-icon-${status}`);
- const createComponent = (suite = testSuite, perPage = 20) => {
+ const createComponent = ({ suite = testSuite, perPage = 20, errorMessage } = {}) => {
store = new Vuex.Store({
state: {
blobPath,
@@ -41,11 +43,12 @@ describe('Test reports suite table', () => {
page: 1,
perPage,
},
+ errorMessage,
},
getters,
});
- wrapper = shallowMount(SuiteTable, {
+ wrapper = shallowMountExtended(SuiteTable, {
store,
stubs: { GlFriendlyWrap },
});
@@ -55,12 +58,18 @@ describe('Test reports suite table', () => {
wrapper.destroy();
});
- describe('should not render', () => {
- beforeEach(() => createComponent([]));
+ it('should render a message when there are no test cases', () => {
+ createComponent({ suite: [] });
- it('a table when there are no test cases', () => {
- expect(noCasesMessage().exists()).toBe(true);
- });
+ expect(noCasesMessage().exists()).toBe(true);
+ expect(artifactsExpiredMessage().exists()).toBe(false);
+ });
+
+ it('should render a message when artifacts have expired', () => {
+ createComponent({ suite: [], errorMessage: ARTIFACTS_EXPIRED_ERROR_MESSAGE });
+
+ expect(noCasesMessage().exists()).toBe(true);
+ expect(artifactsExpiredMessage().exists()).toBe(true);
});
describe('when a test suite is supplied', () => {
@@ -102,7 +111,7 @@ describe('Test reports suite table', () => {
const perPage = 2;
beforeEach(() => {
- createComponent(testSuite, perPage);
+ createComponent({ testSuite, perPage });
});
it('renders one page of test cases', () => {
@@ -117,11 +126,13 @@ describe('Test reports suite table', () => {
describe('when a test case classname property is null', () => {
it('still renders all test cases', () => {
createComponent({
- ...testSuite,
- test_cases: testSuite.test_cases.map((testCase) => ({
- ...testCase,
- classname: null,
- })),
+ testSuite: {
+ ...testSuite,
+ test_cases: testSuite.test_cases.map((testCase) => ({
+ ...testCase,
+ classname: null,
+ })),
+ },
});
expect(allCaseRows()).toHaveLength(testCases.length);
@@ -131,11 +142,13 @@ describe('Test reports suite table', () => {
describe('when a test case name property is null', () => {
it('still renders all test cases', () => {
createComponent({
- ...testSuite,
- test_cases: testSuite.test_cases.map((testCase) => ({
- ...testCase,
- name: null,
- })),
+ testSuite: {
+ ...testSuite,
+ test_cases: testSuite.test_cases.map((testCase) => ({
+ ...testCase,
+ name: null,
+ })),
+ },
});
expect(allCaseRows()).toHaveLength(testCases.length);
diff --git a/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
index 42ae154fb5e..ba478363d04 100644
--- a/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_branch_name_token_spec.js
@@ -34,6 +34,7 @@ describe('Pipeline Branch Name Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const optionsWithDefaultBranchName = (options) => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
index 684d2d0664a..b8abf2c1727 100644
--- a/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_source_token_spec.js
@@ -20,6 +20,7 @@ describe('Pipeline Source Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const createComponent = () => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
index 1db736ba01e..2c5fa8b00e2 100644
--- a/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_status_token_spec.js
@@ -20,6 +20,7 @@ describe('Pipeline Status Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const createComponent = () => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
index b03dbb73b95..596a9218c39 100644
--- a/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_tag_name_token_spec.js
@@ -29,6 +29,7 @@ describe('Pipeline Branch Name Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const createComponent = (options, data) => {
diff --git a/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js b/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
index 7ddbbb3b005..397dbdf95a9 100644
--- a/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
+++ b/spec/frontend/pipelines/tokens/pipeline_trigger_author_token_spec.js
@@ -24,6 +24,7 @@ describe('Pipeline Trigger Author Token', () => {
value: {
data: '',
},
+ cursorPosition: 'start',
};
const createComponent = (data) => {
diff --git a/spec/frontend/project_select_combo_button_spec.js b/spec/frontend/project_select_combo_button_spec.js
index 40e7d27edc8..b8d5a1a61f3 100644
--- a/spec/frontend/project_select_combo_button_spec.js
+++ b/spec/frontend/project_select_combo_button_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import ProjectSelectComboButton from '~/project_select_combo_button';
const fixturePath = 'static/project_select_combo_button.html';
@@ -22,16 +23,25 @@ describe('Project Select Combo Button', () => {
name: 'My Other Cool Project',
url: 'http://myothercoolproject.com',
},
+ vulnerableProject: {
+ name: 'Self XSS',
+ // eslint-disable-next-line no-script-url
+ url: 'javascript:alert(1)',
+ },
localStorageKey: 'group-12345-new-issue-recent-project',
relativePath: 'issues/new',
};
- loadFixtures(fixturePath);
+ loadHTMLFixture(fixturePath);
testContext.newItemBtn = document.querySelector('.js-new-project-item-link');
testContext.projectSelectInput = document.querySelector('.project-item-select');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('on page load when localStorage is empty', () => {
beforeEach(() => {
testContext.comboButton = new ProjectSelectComboButton(testContext.projectSelectInput);
@@ -99,6 +109,25 @@ describe('Project Select Combo Button', () => {
});
});
+ describe('after selecting a vulnerable project', () => {
+ beforeEach(() => {
+ testContext.comboButton = new ProjectSelectComboButton(testContext.projectSelectInput);
+
+ // mock the effect of selecting an item from the projects dropdown (select2)
+ $('.project-item-select')
+ .val(JSON.stringify(testContext.defaults.vulnerableProject))
+ .trigger('change');
+ });
+
+ it('newItemBtn href is correctly sanitized', () => {
+ expect(testContext.newItemBtn.getAttribute('href')).toBe('about:blank');
+ });
+
+ afterEach(() => {
+ window.localStorage.clear();
+ });
+ });
+
describe('deriveTextVariants', () => {
beforeEach(() => {
testContext.mockExecutionContext = {
diff --git a/spec/frontend/projects/commits/components/author_select_spec.js b/spec/frontend/projects/commits/components/author_select_spec.js
index 4e567ab030e..d11090cba8a 100644
--- a/spec/frontend/projects/commits/components/author_select_spec.js
+++ b/spec/frontend/projects/commits/components/author_select_spec.js
@@ -2,6 +2,7 @@ import { GlDropdown, GlDropdownSectionHeader, GlSearchBoxByType, GlDropdownItem
import { shallowMount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import * as urlUtility from '~/lib/utils/url_utility';
import AuthorSelect from '~/projects/commits/components/author_select.vue';
import { createStore } from '~/projects/commits/store';
@@ -30,7 +31,7 @@ describe('Author Select', () => {
let wrapper;
const createComponent = () => {
- setFixtures(`
+ setHTMLFixture(`
<div class="js-project-commits-show">
<input id="commits-search" type="text" />
<div id="commits-list"></div>
@@ -54,6 +55,7 @@ describe('Author Select', () => {
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
const findDropdownContainer = () => wrapper.find({ ref: 'dropdownContainer' });
diff --git a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
index 26a3b27d958..736d149f06d 100644
--- a/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
+++ b/spec/frontend/projects/components/__snapshots__/project_delete_button_spec.js.snap
@@ -31,6 +31,7 @@ exports[`Project remove modal initialized matches the snapshot 1`] = `
<gl-modal-stub
actioncancel="[object Object]"
actionprimary="[object Object]"
+ arialabel=""
dismisslabel="Close"
footer-class="gl-bg-gray-10 gl-p-5"
modalclass=""
@@ -49,6 +50,7 @@ exports[`Project remove modal initialized matches the snapshot 1`] = `
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
+ showicon="true"
title=""
variant="danger"
>
diff --git a/spec/frontend/projects/components/shared/__snapshots__/delete_button_spec.js.snap b/spec/frontend/projects/components/shared/__snapshots__/delete_button_spec.js.snap
index 2d1039a8743..26495fbcf83 100644
--- a/spec/frontend/projects/components/shared/__snapshots__/delete_button_spec.js.snap
+++ b/spec/frontend/projects/components/shared/__snapshots__/delete_button_spec.js.snap
@@ -43,6 +43,7 @@ exports[`Project remove modal intialized matches the snapshot 1`] = `
primarybuttontext=""
secondarybuttonlink=""
secondarybuttontext=""
+ showicon="true"
title=""
variant="danger"
>
diff --git a/spec/frontend/projects/new/components/deployment_target_select_spec.js b/spec/frontend/projects/new/components/deployment_target_select_spec.js
index 1c443879dc3..f3b22d4a1b9 100644
--- a/spec/frontend/projects/new/components/deployment_target_select_spec.js
+++ b/spec/frontend/projects/new/components/deployment_target_select_spec.js
@@ -1,6 +1,7 @@
import { GlFormGroup, GlFormSelect, GlFormText, GlLink, GlSprintf } from '@gitlab/ui';
import { nextTick } from 'vue';
import { shallowMount } from '@vue/test-utils';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { mockTracking } from 'helpers/tracking_helper';
import DeploymentTargetSelect from '~/projects/new/components/deployment_target_select.vue';
import {
@@ -32,7 +33,7 @@ describe('Deployment target select', () => {
};
const createForm = () => {
- setFixtures(`
+ setHTMLFixture(`
<form id="${NEW_PROJECT_FORM}">
</form>
`);
@@ -47,6 +48,7 @@ describe('Deployment target select', () => {
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
it('renders the correct label', () => {
diff --git a/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js b/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js
index 31ddbc80ae4..42259a5c392 100644
--- a/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js
+++ b/spec/frontend/projects/new/components/new_project_push_tip_popover_spec.js
@@ -1,5 +1,6 @@
import { GlPopover, GlFormInputGroup } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import NewProjectPushTipPopover from '~/projects/new/components/new_project_push_tip_popover.vue';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
@@ -31,12 +32,13 @@ describe('New project push tip popover', () => {
};
beforeEach(() => {
- setFixtures(`<a id="${targetId}"></a>`);
+ setHTMLFixture(`<a id="${targetId}"></a>`);
buildWrapper();
});
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
it('renders popover that targets the specified target', () => {
diff --git a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
index cafb3f231bd..7bb289408b8 100644
--- a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
+++ b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
@@ -1,8 +1,8 @@
import { nextTick } from 'vue';
-import { GlSegmentedControl } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import CiCdAnalyticsAreaChart from '~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_area_chart.vue';
import CiCdAnalyticsCharts from '~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue';
+import SegmentedControlButtonGroup from '~/vue_shared/components/segmented_control_button_group.vue';
import { transformedAreaChartData, chartOptions } from '../mock_data';
const DEFAULT_PROPS = {
@@ -48,7 +48,7 @@ describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', (
});
const findMetricsSlot = () => wrapper.findByTestId('metrics-slot');
- const findSegmentedControl = () => wrapper.findComponent(GlSegmentedControl);
+ const findSegmentedControl = () => wrapper.findComponent(SegmentedControlButtonGroup);
describe('segmented control', () => {
beforeEach(() => {
@@ -56,7 +56,7 @@ describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', (
});
it('should default to the first chart', () => {
- expect(findSegmentedControl().props('checked')).toBe(0);
+ expect(findSegmentedControl().props('value')).toBe(0);
});
it('should use the title and index as values', () => {
diff --git a/spec/frontend/projects/project_import_gitlab_project_spec.js b/spec/frontend/projects/project_import_gitlab_project_spec.js
index aaf8a81f626..76621ba9c06 100644
--- a/spec/frontend/projects/project_import_gitlab_project_spec.js
+++ b/spec/frontend/projects/project_import_gitlab_project_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import projectImportGitlab from '~/projects/project_import_gitlab_project';
describe('Import Gitlab project', () => {
@@ -7,7 +8,7 @@ describe('Import Gitlab project', () => {
const setTestFixtures = (url) => {
window.history.pushState({}, null, url);
- setFixtures(`
+ setHTMLFixture(`
<input class="js-path-name" />
<input class="js-project-name" />
`);
@@ -21,6 +22,7 @@ describe('Import Gitlab project', () => {
afterEach(() => {
window.history.pushState({}, null, '');
+ resetHTMLFixture();
});
describe('project name', () => {
diff --git a/spec/frontend/projects/project_new_spec.js b/spec/frontend/projects/project_new_spec.js
index d2936cb9efe..fe325343da8 100644
--- a/spec/frontend/projects/project_new_spec.js
+++ b/spec/frontend/projects/project_new_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import projectNew from '~/projects/project_new';
@@ -8,7 +9,7 @@ describe('New Project', () => {
let $projectName;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class='toggle-import-form'>
<div class='import-url-data'>
<div class="form-group">
@@ -33,6 +34,10 @@ describe('New Project', () => {
$projectName = $('#project_name');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('deriveProjectPathFromUrl', () => {
const dummyImportUrl = `${TEST_HOST}/dummy/import/url.git`;
diff --git a/spec/frontend/projects/projects_filterable_list_spec.js b/spec/frontend/projects/projects_filterable_list_spec.js
index a41e8b7bc09..f217efa411e 100644
--- a/spec/frontend/projects/projects_filterable_list_spec.js
+++ b/spec/frontend/projects/projects_filterable_list_spec.js
@@ -1,4 +1,4 @@
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import ProjectsFilterableList from '~/projects/projects_filterable_list';
describe('ProjectsFilterableList', () => {
@@ -20,6 +20,10 @@ describe('ProjectsFilterableList', () => {
List = new ProjectsFilterableList(form, filter, holder);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('getFilterEndpoint', () => {
it('updates converts getPagePath for projects', () => {
jest.spyOn(List, 'getPagePath').mockReturnValue('blah/projects?');
diff --git a/spec/frontend/projects/settings/access_dropdown_spec.js b/spec/frontend/projects/settings/access_dropdown_spec.js
index 236968a3736..65b01172e7e 100644
--- a/spec/frontend/projects/settings/access_dropdown_spec.js
+++ b/spec/frontend/projects/settings/access_dropdown_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import AccessDropdown from '~/projects/settings/access_dropdown';
import { LEVEL_TYPES } from '~/projects/settings/constants';
@@ -7,7 +8,7 @@ describe('AccessDropdown', () => {
let dropdown;
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div id="dummy-dropdown">
<span class="dropdown-toggle-text"></span>
</div>
@@ -28,6 +29,10 @@ describe('AccessDropdown', () => {
dropdown = new AccessDropdown(options);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('toggleLabel', () => {
let $dropdownToggleText;
const dummyItems = [
diff --git a/spec/frontend/projects/settings/topics/components/topics_token_selector_spec.js b/spec/frontend/projects/settings/topics/components/topics_token_selector_spec.js
index dbea94cbd53..8b8e7d1454d 100644
--- a/spec/frontend/projects/settings/topics/components/topics_token_selector_spec.js
+++ b/spec/frontend/projects/settings/topics/components/topics_token_selector_spec.js
@@ -1,11 +1,11 @@
-import { GlTokenSelector, GlToken } from '@gitlab/ui';
+import { GlAvatarLabeled, GlTokenSelector, GlToken } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import TopicsTokenSelector from '~/projects/settings/topics/components/topics_token_selector.vue';
const mockTopics = [
- { id: 1, name: 'topic1', avatarUrl: 'avatar.com/topic1.png' },
- { id: 2, name: 'GitLab', avatarUrl: 'avatar.com/GitLab.png' },
+ { id: 1, name: 'topic1', title: 'Topic 1', avatarUrl: 'avatar.com/topic1.png' },
+ { id: 2, name: 'GitLab', title: 'GitLab', avatarUrl: 'avatar.com/GitLab.png' },
];
describe('TopicsTokenSelector', () => {
@@ -38,6 +38,8 @@ describe('TopicsTokenSelector', () => {
const findTokenSelectorInput = () => findTokenSelector().find('input[type="text"]');
+ const findAllAvatars = () => wrapper.findAllComponents(GlAvatarLabeled).wrappers;
+
const setTokenSelectorInputValue = (value) => {
const tokenSelectorInput = findTokenSelectorInput();
@@ -81,6 +83,13 @@ describe('TopicsTokenSelector', () => {
expect(tokenWrapper.text()).toBe(selected[index].name);
});
});
+
+ it('passes topic title to the avatar', async () => {
+ createComponent();
+ const avatars = findAllAvatars();
+
+ mockTopics.map((topic, index) => expect(avatars[index].text()).toBe(topic.title));
+ });
});
describe('when enter key is pressed', () => {
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
index 57e515723e5..aac1a418142 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
@@ -165,8 +165,12 @@ describe('ServiceDeskSetting', () => {
describe('save button', () => {
it('renders a save button to save a template', () => {
wrapper = createComponent();
+ const saveButton = findButton();
- expect(findButton().text()).toContain('Save changes');
+ expect(saveButton.text()).toContain('Save changes');
+ expect(saveButton.props()).toMatchObject({
+ variant: 'confirm',
+ });
});
it('emits a save event with the chosen template when the save button is clicked', async () => {
diff --git a/spec/frontend/prometheus_alerts/components/reset_key_spec.js b/spec/frontend/prometheus_alerts/components/reset_key_spec.js
deleted file mode 100644
index dc5fdb1dffc..00000000000
--- a/spec/frontend/prometheus_alerts/components/reset_key_spec.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import { GlModal } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import MockAdapter from 'axios-mock-adapter';
-import { nextTick } from 'vue';
-import waitForPromises from 'helpers/wait_for_promises';
-import axios from '~/lib/utils/axios_utils';
-import ResetKey from '~/prometheus_alerts/components/reset_key.vue';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-
-describe('ResetKey', () => {
- let mock;
- let vm;
-
- const propsData = {
- initialAuthorizationKey: 'abcd1234',
- changeKeyUrl: '/updateKeyUrl',
- notifyUrl: '/root/autodevops-deploy/prometheus/alerts/notify.json',
- learnMoreUrl: '/learnMore',
- };
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- setFixtures('<div class="flash-container"></div><div id="reset-key"></div>');
- });
-
- afterEach(() => {
- mock.restore();
- vm.destroy();
- });
-
- describe('authorization key exists', () => {
- beforeEach(() => {
- propsData.initialAuthorizationKey = 'abcd1234';
- vm = shallowMount(ResetKey, {
- propsData,
- });
- });
-
- it('shows fields and buttons', () => {
- expect(vm.find('#notify-url').attributes('value')).toEqual(propsData.notifyUrl);
- expect(vm.find('#authorization-key').attributes('value')).toEqual(
- propsData.initialAuthorizationKey,
- );
-
- expect(vm.findAll(ClipboardButton).length).toBe(2);
- expect(vm.find('.js-reset-auth-key').text()).toEqual('Reset key');
- });
-
- it('reset updates key', async () => {
- mock.onPost(propsData.changeKeyUrl).replyOnce(200, { token: 'newToken' });
-
- vm.find(GlModal).vm.$emit('ok');
-
- await nextTick();
- await waitForPromises();
- expect(vm.vm.authorizationKey).toEqual('newToken');
- expect(vm.find('#authorization-key').attributes('value')).toEqual('newToken');
- });
-
- it('reset key failure shows error', async () => {
- mock.onPost(propsData.changeKeyUrl).replyOnce(500);
-
- vm.find(GlModal).vm.$emit('ok');
-
- await nextTick();
- await waitForPromises();
- expect(vm.find('#authorization-key').attributes('value')).toEqual(
- propsData.initialAuthorizationKey,
- );
-
- expect(document.querySelector('.flash-container').innerText.trim()).toEqual(
- 'Failed to reset key. Please try again.',
- );
- });
- });
-
- describe('authorization key has not been set', () => {
- beforeEach(() => {
- propsData.initialAuthorizationKey = '';
- vm = shallowMount(ResetKey, {
- propsData,
- });
- });
-
- it('shows Generate Key button', () => {
- expect(vm.find('.js-reset-auth-key').text()).toEqual('Generate key');
- expect(vm.find('#authorization-key').attributes('value')).toEqual('');
- });
-
- it('Generate key button triggers key change', async () => {
- mock.onPost(propsData.changeKeyUrl).replyOnce(200, { token: 'newToken' });
-
- vm.find('.js-reset-auth-key').vm.$emit('click');
-
- await waitForPromises();
- expect(vm.find('#authorization-key').attributes('value')).toEqual('newToken');
- });
- });
-});
diff --git a/spec/frontend/prometheus_metrics/custom_metrics_spec.js b/spec/frontend/prometheus_metrics/custom_metrics_spec.js
index 20593351ee5..473327bf5e1 100644
--- a/spec/frontend/prometheus_metrics/custom_metrics_spec.js
+++ b/spec/frontend/prometheus_metrics/custom_metrics_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import axios from '~/lib/utils/axios_utils';
import PANEL_STATE from '~/prometheus_metrics/constants';
import CustomMetrics from '~/prometheus_metrics/custom_metrics';
@@ -15,11 +16,12 @@ describe('PrometheusMetrics', () => {
mock.onGet(customMetricsEndpoint).reply(200, {
metrics,
});
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
});
afterEach(() => {
mock.restore();
+ resetHTMLFixture();
});
describe('Custom Metrics', () => {
diff --git a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
index ee74e28ba23..1151c0b3769 100644
--- a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
+++ b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
import PANEL_STATE from '~/prometheus_metrics/constants';
@@ -9,7 +10,7 @@ describe('PrometheusMetrics', () => {
const FIXTURE = 'services/prometheus/prometheus_service.html';
beforeEach(() => {
- loadFixtures(FIXTURE);
+ loadHTMLFixture(FIXTURE);
});
describe('constructor', () => {
@@ -19,6 +20,10 @@ describe('PrometheusMetrics', () => {
prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should initialize wrapper element refs on class object', () => {
expect(prometheusMetrics.$wrapper).toBeDefined();
expect(prometheusMetrics.$monitoredMetricsPanel).toBeDefined();
diff --git a/spec/frontend/protected_branches/protected_branch_create_spec.js b/spec/frontend/protected_branches/protected_branch_create_spec.js
index b3de2d5e031..4b634c52b01 100644
--- a/spec/frontend/protected_branches/protected_branch_create_spec.js
+++ b/spec/frontend/protected_branches/protected_branch_create_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import ProtectedBranchCreate from '~/protected_branches/protected_branch_create';
const FORCE_PUSH_TOGGLE_TESTID = 'force-push-toggle';
@@ -21,7 +22,7 @@ describe('ProtectedBranchCreate', () => {
codeOwnerToggleChecked = false,
hasLicense = true,
} = {}) => {
- setFixtures(`
+ setHTMLFixture(`
<form class="js-new-protected-branch">
<span
class="js-force-push-toggle"
@@ -40,6 +41,10 @@ describe('ProtectedBranchCreate', () => {
return new ProtectedBranchCreate({ hasLicense });
};
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('when license supports code owner approvals', () => {
it('instantiates the code owner toggle', () => {
create();
diff --git a/spec/frontend/protected_branches/protected_branch_edit_spec.js b/spec/frontend/protected_branches/protected_branch_edit_spec.js
index 959ca6ecde2..d842e00d850 100644
--- a/spec/frontend/protected_branches/protected_branch_edit_spec.js
+++ b/spec/frontend/protected_branches/protected_branch_edit_spec.js
@@ -1,5 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
@@ -33,7 +34,7 @@ describe('ProtectedBranchEdit', () => {
codeOwnerToggleChecked = false,
hasLicense = true,
} = {}) => {
- setFixtures(`<div id="wrap" data-url="${TEST_URL}">
+ setHTMLFixture(`<div id="wrap" data-url="${TEST_URL}">
<span
class="js-force-push-toggle"
data-label="Toggle allowed to force push"
@@ -51,6 +52,7 @@ describe('ProtectedBranchEdit', () => {
afterEach(() => {
mock.restore();
+ resetHTMLFixture();
});
describe('when license supports code owner approvals', () => {
@@ -76,7 +78,11 @@ describe('ProtectedBranchEdit', () => {
describe('when toggles are not available in the DOM on page load', () => {
beforeEach(() => {
create({ hasLicense: true });
- setFixtures('');
+ setHTMLFixture('');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('does not instantiate the force push toggle', () => {
diff --git a/spec/frontend/read_more_spec.js b/spec/frontend/read_more_spec.js
index 16f0d7fb075..80d7c941660 100644
--- a/spec/frontend/read_more_spec.js
+++ b/spec/frontend/read_more_spec.js
@@ -1,10 +1,15 @@
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initReadMore from '~/read_more';
describe('Read more click-to-expand functionality', () => {
const fixtureName = 'projects/overview.html';
beforeEach(() => {
- loadFixtures(fixtureName);
+ loadHTMLFixture(fixtureName);
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
describe('expands target element', () => {
diff --git a/spec/frontend/releases/components/app_edit_new_spec.js b/spec/frontend/releases/components/app_edit_new_spec.js
index 0a0a683b56d..80be27c92ff 100644
--- a/spec/frontend/releases/components/app_edit_new_spec.js
+++ b/spec/frontend/releases/components/app_edit_new_spec.js
@@ -4,6 +4,7 @@ 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 setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
@@ -11,6 +12,7 @@ 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 { BACK_URL_PARAM } from '~/releases/constants';
+import MarkdownField from '~/vue_shared/components/markdown/field.vue';
const originalMilestones = originalRelease.milestones;
const releasesPagePath = 'path/to/releases/page';
@@ -47,6 +49,7 @@ describe('Release edit/new component', () => {
links: [],
},
}),
+ formattedReleaseNotes: () => 'these notes are formatted',
};
const store = new Vuex.Store(
@@ -129,6 +132,11 @@ describe('Release edit/new component', () => {
expect(wrapper.find('#release-notes').element.value).toBe(release.description);
});
+ it('sets the preview text to be the formatted release notes', () => {
+ const notes = getters.formattedReleaseNotes();
+ expect(wrapper.findComponent(MarkdownField).props('textareaValue')).toBe(notes);
+ });
+
it('renders the "Save changes" button as type="submit"', () => {
expect(findSubmitButton().attributes('type')).toBe('submit');
});
@@ -195,6 +203,10 @@ describe('Release edit/new component', () => {
it('renders the submit button with the text "Create release"', () => {
expect(findSubmitButton().text()).toBe('Create release');
});
+
+ it('renders a checkbox to include release notes', () => {
+ expect(wrapper.find(GlFormCheckbox).exists()).toBe(true);
+ });
});
describe('when editing an existing release', () => {
diff --git a/spec/frontend/releases/components/tag_field_new_spec.js b/spec/frontend/releases/components/tag_field_new_spec.js
index c13b513f87e..9f500c318ea 100644
--- a/spec/frontend/releases/components/tag_field_new_spec.js
+++ b/spec/frontend/releases/components/tag_field_new_spec.js
@@ -1,5 +1,7 @@
import { GlDropdownItem } from '@gitlab/ui';
import { mount, shallowMount } from '@vue/test-utils';
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
import Vue, { nextTick } from 'vue';
import { __ } from '~/locale';
import TagFieldNew from '~/releases/components/tag_field_new.vue';
@@ -14,6 +16,7 @@ const NONEXISTENT_TAG_NAME = 'nonexistent-tag';
describe('releases/components/tag_field_new', () => {
let store;
let wrapper;
+ let mock;
let RefSelectorStub;
const createComponent = (
@@ -65,11 +68,14 @@ describe('releases/components/tag_field_new', () => {
links: [],
},
};
+
+ mock = new MockAdapter(axios);
+ gon.api_version = 'v4';
});
afterEach(() => {
wrapper.destroy();
- wrapper = null;
+ mock.restore();
});
const findTagNameFormGroup = () => wrapper.find('[data-testid="tag-name-field"]');
@@ -114,9 +120,14 @@ describe('releases/components/tag_field_new', () => {
expect(store.state.editNew.release.tagName).toBe(updatedTagName);
});
- it('shows the "Create from" field', () => {
+ it('hides the "Create from" field', () => {
expect(findCreateFromFormGroup().exists()).toBe(false);
});
+
+ it('fetches the release notes for the tag', () => {
+ const expectedUrl = `/api/v4/projects/1234/repository/tags/${updatedTagName}`;
+ expect(mock.history.get).toContainEqual(expect.objectContaining({ url: expectedUrl }));
+ });
});
});
@@ -177,6 +188,18 @@ describe('releases/components/tag_field_new', () => {
await expectValidationMessageToBe('hidden');
});
+
+ it('displays a validation error if the tag has an associated release', async () => {
+ findTagNameDropdown().vm.$emit('input', 'vTest');
+ findTagNameDropdown().vm.$emit('hide');
+
+ store.state.editNew.existingRelease = {};
+
+ await expectValidationMessageToBe('shown');
+ expect(findTagNameFormGroup().text()).toContain(
+ __('Selected tag is already in use. Choose another option.'),
+ );
+ });
});
describe('when the user has interacted with the component and the value is empty', () => {
@@ -185,6 +208,7 @@ describe('releases/components/tag_field_new', () => {
findTagNameDropdown().vm.$emit('hide');
await expectValidationMessageToBe('shown');
+ expect(findTagNameFormGroup().text()).toContain(__('Tag name is required.'));
});
});
});
diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js
index d8329fb82b1..41653f62ebf 100644
--- a/spec/frontend/releases/stores/modules/detail/actions_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js
@@ -1,8 +1,10 @@
import { cloneDeep } from 'lodash';
import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
import testAction from 'helpers/vuex_action_helper';
+import { getTag } from '~/api/tags_api';
import createFlash from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
+import { s__ } from '~/locale';
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';
@@ -12,6 +14,8 @@ 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';
+jest.mock('~/api/tags_api');
+
jest.mock('~/flash');
jest.mock('~/lib/utils/url_utility', () => ({
@@ -567,4 +571,46 @@ describe('Release edit/new actions', () => {
});
});
});
+
+ describe('fetchTagNotes', () => {
+ const tagName = 'v8.0.0';
+
+ it('saves the tag notes on succes', async () => {
+ const tag = { message: 'this is a tag' };
+ getTag.mockResolvedValue({ data: tag });
+
+ await testAction(
+ actions.fetchTagNotes,
+ tagName,
+ state,
+ [
+ { type: types.REQUEST_TAG_NOTES },
+ { type: types.RECEIVE_TAG_NOTES_SUCCESS, payload: tag },
+ ],
+ [],
+ );
+
+ expect(getTag).toHaveBeenCalledWith(state.projectId, tagName);
+ });
+ it('creates a flash on error', async () => {
+ error = new Error();
+ getTag.mockRejectedValue(error);
+
+ await testAction(
+ actions.fetchTagNotes,
+ tagName,
+ state,
+ [
+ { type: types.REQUEST_TAG_NOTES },
+ { type: types.RECEIVE_TAG_NOTES_ERROR, payload: error },
+ ],
+ [],
+ );
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: s__('Release|Unable to fetch the tag notes.'),
+ });
+ expect(getTag).toHaveBeenCalledWith(state.projectId, tagName);
+ });
+ });
});
diff --git a/spec/frontend/releases/stores/modules/detail/getters_spec.js b/spec/frontend/releases/stores/modules/detail/getters_spec.js
index c32969c131e..c42c6c00f56 100644
--- a/spec/frontend/releases/stores/modules/detail/getters_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/getters_spec.js
@@ -1,3 +1,4 @@
+import { s__ } from '~/locale';
import * as getters from '~/releases/stores/modules/edit_new/getters';
describe('Release edit/new getters', () => {
@@ -145,6 +146,8 @@ describe('Release edit/new getters', () => {
],
},
},
+ // tag has an existing release
+ existingRelease: {},
};
actualErrors = getters.validationErrors(state);
@@ -158,6 +161,14 @@ describe('Release edit/new getters', () => {
expect(actualErrors).toMatchObject(expectedErrors);
});
+ it('returns a validation error if the tag has an existing release', () => {
+ const expectedErrors = {
+ existingRelease: true,
+ };
+
+ expect(actualErrors).toMatchObject(expectedErrors);
+ });
+
it('returns a validation error if links share a URL', () => {
const expectedErrors = {
assets: {
@@ -369,4 +380,25 @@ describe('Release edit/new getters', () => {
expect(actualVariables).toEqual(expectedVariables);
});
});
+
+ describe('formattedReleaseNotes', () => {
+ it.each`
+ description | includeTagNotes | tagNotes | included
+ ${'release notes'} | ${true} | ${'tag notes'} | ${true}
+ ${'release notes'} | ${true} | ${''} | ${false}
+ ${'release notes'} | ${false} | ${'tag notes'} | ${false}
+ `(
+ 'should include tag notes=$included when includeTagNotes=$includeTagNotes and tagNotes=$tagNotes',
+ ({ description, includeTagNotes, tagNotes, included }) => {
+ const state = { release: { description }, includeTagNotes, tagNotes };
+
+ const text = `### ${s__('Releases|Tag message')}\n\n${tagNotes}\n`;
+ if (included) {
+ expect(getters.formattedReleaseNotes(state)).toContain(text);
+ } else {
+ expect(getters.formattedReleaseNotes(state)).not.toContain(text);
+ }
+ },
+ );
+ });
});
diff --git a/spec/frontend/releases/stores/modules/detail/mutations_spec.js b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
index 24dcedb3580..85844831e0b 100644
--- a/spec/frontend/releases/stores/modules/detail/mutations_spec.js
+++ b/spec/frontend/releases/stores/modules/detail/mutations_spec.js
@@ -237,4 +237,41 @@ describe('Release edit/new mutations', () => {
expect(state.release.assets.links).not.toContainEqual(linkToRemove);
});
});
+ describe(`${types.REQUEST_TAG_NOTES}`, () => {
+ it('sets isFetchingTagNotes to true', () => {
+ state.isFetchingTagNotes = false;
+ mutations[types.REQUEST_TAG_NOTES](state);
+ expect(state.isFetchingTagNotes).toBe(true);
+ });
+ });
+ describe(`${types.RECEIVE_TAG_NOTES_SUCCESS}`, () => {
+ it('sets the tag notes in the state', () => {
+ state.isFetchingTagNotes = true;
+ const message = 'tag notes';
+
+ mutations[types.RECEIVE_TAG_NOTES_SUCCESS](state, { message, release });
+ expect(state.tagNotes).toBe(message);
+ expect(state.isFetchingTagNotes).toBe(false);
+ expect(state.existingRelease).toBe(release);
+ });
+ });
+ describe(`${types.RECEIVE_TAG_NOTES_ERROR}`, () => {
+ it('sets tag notes to empty', () => {
+ const message = 'there was an error';
+ state.isFetchingTagNotes = true;
+ state.tagNotes = 'tag notes';
+
+ mutations[types.RECEIVE_TAG_NOTES_ERROR](state, { message });
+ expect(state.tagNotes).toBe('');
+ expect(state.isFetchingTagNotes).toBe(false);
+ });
+ });
+ describe(`${types.UPDATE_INCLUDE_TAG_NOTES}`, () => {
+ it('sets whether or not to include the tag notes', () => {
+ state.includeTagNotes = false;
+
+ mutations[types.UPDATE_INCLUDE_TAG_NOTES](state, true);
+ expect(state.includeTagNotes).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/reports/codequality_report/store/getters_spec.js b/spec/frontend/reports/codequality_report/store/getters_spec.js
index b5f6edf85eb..646903390ff 100644
--- a/spec/frontend/reports/codequality_report/store/getters_spec.js
+++ b/spec/frontend/reports/codequality_report/store/getters_spec.js
@@ -61,8 +61,8 @@ describe('Codequality reports store getters', () => {
it.each`
resolvedIssues | newIssues | expectedText
${0} | ${0} | ${'No changes to code quality'}
- ${0} | ${1} | ${'Code quality degraded'}
- ${2} | ${0} | ${'Code quality improved'}
+ ${0} | ${1} | ${'Code quality degraded due to 1 new issue'}
+ ${2} | ${0} | ${'Code quality improved due to 2 resolved issues'}
${1} | ${2} | ${'Code quality scanning detected 3 changes in merged results'}
`(
'returns a summary containing $resolvedIssues resolved issues and $newIssues new issues',
diff --git a/spec/frontend/reports/components/report_link_spec.js b/spec/frontend/reports/components/report_link_spec.js
index fc21515ded6..2ed0617a598 100644
--- a/spec/frontend/reports/components/report_link_spec.js
+++ b/spec/frontend/reports/components/report_link_spec.js
@@ -1,69 +1,56 @@
-import Vue from 'vue';
-import mountComponent from 'helpers/vue_mount_component_helper';
-import component from '~/reports/components/report_link.vue';
+import { shallowMount } from '@vue/test-utils';
+import ReportLink from '~/reports/components/report_link.vue';
-describe('report link', () => {
- let vm;
-
- const Component = Vue.extend(component);
+describe('app/assets/javascripts/reports/components/report_link.vue', () => {
+ let wrapper;
afterEach(() => {
- vm.$destroy();
+ wrapper.destroy();
});
- describe('With url', () => {
- it('renders link', () => {
- vm = mountComponent(Component, {
- issue: {
- path: 'Gemfile.lock',
- urlPath: '/Gemfile.lock',
- },
- });
+ const defaultProps = {
+ issue: {},
+ };
+
+ const createComponent = (props = {}) => {
+ wrapper = shallowMount(ReportLink, {
+ propsData: { ...defaultProps, ...props },
+ });
+ };
+
+ describe('When an issue prop has a $urlPath property', () => {
+ it('render a link that will take the user to the $urlPath', () => {
+ createComponent({ issue: { path: 'Gemfile.lock', urlPath: '/Gemfile.lock' } });
- expect(vm.$el.textContent.trim()).toContain('in');
- expect(vm.$el.querySelector('a').getAttribute('href')).toEqual('/Gemfile.lock');
- expect(vm.$el.querySelector('a').textContent.trim()).toEqual('Gemfile.lock');
+ expect(wrapper.text()).toContain('in');
+ expect(wrapper.find('a').attributes('href')).toBe('/Gemfile.lock');
+ expect(wrapper.find('a').text()).toContain('Gemfile.lock');
});
});
- describe('Without url', () => {
+ describe('When an issue prop has no $urlPath property', () => {
it('does not render link', () => {
- vm = mountComponent(Component, {
- issue: {
- path: 'Gemfile.lock',
- },
- });
+ createComponent({ issue: { path: 'Gemfile.lock' } });
- expect(vm.$el.querySelector('a')).toBeNull();
- expect(vm.$el.textContent.trim()).toContain('in');
- expect(vm.$el.textContent.trim()).toContain('Gemfile.lock');
+ expect(wrapper.find('a').exists()).toBe(false);
+ expect(wrapper.text()).toContain('in');
+ expect(wrapper.text()).toContain('Gemfile.lock');
});
});
- describe('with line', () => {
- it('renders line number', () => {
- vm = mountComponent(Component, {
- issue: {
- path: 'Gemfile.lock',
- urlPath: 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
- line: 22,
- },
- });
+ describe('When an issue prop has a $line property', () => {
+ it('render a line number', () => {
+ createComponent({ issue: { path: 'Gemfile.lock', urlPath: '/Gemfile.lock', line: 22 } });
- expect(vm.$el.querySelector('a').textContent.trim()).toContain('Gemfile.lock:22');
+ expect(wrapper.find('a').text()).toContain('Gemfile.lock:22');
});
});
- describe('without line', () => {
- it('does not render line number', () => {
- vm = mountComponent(Component, {
- issue: {
- path: 'Gemfile.lock',
- urlPath: 'https://groups.google.com/forum/#!topic/rubyonrails-security/335P1DcLG00',
- },
- });
+ describe('When an issue prop does not have a $line property', () => {
+ it('does not render a line number', () => {
+ createComponent({ issue: { urlPath: '/Gemfile.lock' } });
- expect(vm.$el.querySelector('a').textContent.trim()).not.toContain(':22');
+ expect(wrapper.find('a').text()).not.toContain(':22');
});
});
});
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 fea937b905f..4732d68c8c6 100644
--- a/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
+++ b/spec/frontend/repository/components/__snapshots__/last_commit_spec.js.snap
@@ -2,13 +2,13 @@
exports[`Repository last commit component renders commit widget 1`] = `
<div
- class="well-segment commit gl-p-5 gl-w-full"
+ class="well-segment commit gl-p-5 gl-w-full gl-display-flex"
>
<user-avatar-link-stub
- class="avatar-cell"
+ class="gl-my-2 gl-mr-4"
imgalt=""
- imgcssclasses=""
- imgsize="40"
+ imgcssclasses="gl-mr-0!"
+ imgsize="32"
imgsrc="https://test.com"
linkhref="/test"
tooltipplacement="top"
@@ -55,7 +55,11 @@ exports[`Repository last commit component renders commit widget 1`] = `
</div>
<div
- class="commit-actions flex-row"
+ class="gl-flex-grow-1"
+ />
+
+ <div
+ class="commit-actions gl-display-flex gl-flex-align gl-align-items-center gl-flex-direction-row"
>
<!---->
diff --git a/spec/frontend/repository/components/blob_content_viewer_spec.js b/spec/frontend/repository/components/blob_content_viewer_spec.js
index 2f6de03b73d..2ab4afbffbe 100644
--- a/spec/frontend/repository/components/blob_content_viewer_spec.js
+++ b/spec/frontend/repository/components/blob_content_viewer_spec.js
@@ -26,6 +26,7 @@ import { isLoggedIn } from '~/lib/utils/common_utils';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import httpStatusCodes from '~/lib/utils/http_status';
import LineHighlighter from '~/blob/line_highlighter';
+import { LEGACY_FILE_TYPES } from '~/repository/constants';
import {
simpleViewerMock,
richViewerMock,
@@ -195,6 +196,14 @@ describe('Blob content viewer component', () => {
expect(mockAxios.history.get[0].url).toBe(legacyViewerUrl);
});
+ it.each(LEGACY_FILE_TYPES)(
+ 'loads the legacy viewer when a file type is identified as legacy',
+ async (type) => {
+ await createComponent({ blob: { ...simpleViewerMock, fileType: type, webPath: type } });
+ expect(mockAxios.history.get[0].url).toBe(`${type}?format=json&viewer=simple`);
+ },
+ );
+
it('loads the LineHighlighter', async () => {
mockAxios.onGet(legacyViewerUrl).replyOnce(httpStatusCodes.OK, 'test');
await createComponent({ blob: { ...simpleViewerMock, fileType, highlightJs } });
diff --git a/spec/frontend/repository/components/breadcrumbs_spec.js b/spec/frontend/repository/components/breadcrumbs_spec.js
index eef66045573..40b32904589 100644
--- a/spec/frontend/repository/components/breadcrumbs_spec.js
+++ b/spec/frontend/repository/components/breadcrumbs_spec.js
@@ -147,7 +147,7 @@ describe('Repository breadcrumbs component', () => {
describe('renders the new directory modal', () => {
beforeEach(() => {
- factory('/', { canEditTree: true });
+ factory('some_dir', { canEditTree: true, newDirPath: 'root/master' });
});
it('does not render the modal while loading', () => {
expect(findNewDirectoryModal().exists()).toBe(false);
@@ -161,6 +161,7 @@ describe('Repository breadcrumbs component', () => {
await nextTick();
expect(findNewDirectoryModal().exists()).toBe(true);
+ expect(findNewDirectoryModal().props('path')).toBe('root/master/some_dir');
});
});
});
diff --git a/spec/frontend/right_sidebar_spec.js b/spec/frontend/right_sidebar_spec.js
index d1f861669a0..5847842f5a6 100644
--- a/spec/frontend/right_sidebar_spec.js
+++ b/spec/frontend/right_sidebar_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
-import '~/commons/bootstrap';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import axios from '~/lib/utils/axios_utils';
import Sidebar from '~/right_sidebar';
@@ -30,7 +30,7 @@ describe('RightSidebar', () => {
let mock;
beforeEach(() => {
- loadFixtures(fixtureName);
+ loadHTMLFixture(fixtureName);
mock = new MockAdapter(axios);
new Sidebar(); // eslint-disable-line no-new
$aside = $('.right-sidebar');
@@ -44,6 +44,8 @@ describe('RightSidebar', () => {
afterEach(() => {
mock.restore();
+
+ resetHTMLFixture();
});
it('should expand/collapse the sidebar when arrow is clicked', () => {
diff --git a/spec/frontend/runner/admin_runner_edit/admin_runner_edit_app_spec.js b/spec/frontend/runner/admin_runner_edit/admin_runner_edit_app_spec.js
index d121c6be218..8a34cb14d8b 100644
--- a/spec/frontend/runner/admin_runner_edit/admin_runner_edit_app_spec.js
+++ b/spec/frontend/runner/admin_runner_edit/admin_runner_edit_app_spec.js
@@ -7,17 +7,20 @@ import { createAlert } from '~/flash';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import RunnerHeader from '~/runner/components/runner_header.vue';
-import runnerQuery from '~/runner/graphql/details/runner.query.graphql';
+import RunnerUpdateForm from '~/runner/components/runner_update_form.vue';
+import runnerFormQuery from '~/runner/graphql/edit/runner_form.query.graphql';
import AdminRunnerEditApp from '~//runner/admin_runner_edit/admin_runner_edit_app.vue';
import { captureException } from '~/runner/sentry_utils';
-import { runnerData } from '../mock_data';
+import { runnerFormData } from '../mock_data';
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
-const mockRunnerGraphqlId = runnerData.data.runner.id;
+const mockRunner = runnerFormData.data.runner;
+const mockRunnerGraphqlId = mockRunner.id;
const mockRunnerId = `${getIdFromGraphQLId(mockRunnerGraphqlId)}`;
+const mockRunnerPath = `/admin/runners/${mockRunnerId}`;
Vue.use(VueApollo);
@@ -26,12 +29,14 @@ describe('AdminRunnerEditApp', () => {
let mockRunnerQuery;
const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
+ const findRunnerUpdateForm = () => wrapper.findComponent(RunnerUpdateForm);
const createComponentWithApollo = ({ props = {}, mountFn = shallowMount } = {}) => {
wrapper = mountFn(AdminRunnerEditApp, {
- apolloProvider: createMockApollo([[runnerQuery, mockRunnerQuery]]),
+ apolloProvider: createMockApollo([[runnerFormQuery, mockRunnerQuery]]),
propsData: {
runnerId: mockRunnerId,
+ runnerPath: mockRunnerPath,
...props,
},
});
@@ -40,7 +45,7 @@ describe('AdminRunnerEditApp', () => {
};
beforeEach(() => {
- mockRunnerQuery = jest.fn().mockResolvedValue(runnerData);
+ mockRunnerQuery = jest.fn().mockResolvedValue(runnerFormData);
});
afterEach(() => {
@@ -68,6 +73,26 @@ describe('AdminRunnerEditApp', () => {
expect(findRunnerHeader().text()).toContain(`shared`);
});
+ it('displays a loading runner form', () => {
+ createComponentWithApollo();
+
+ expect(findRunnerUpdateForm().props()).toMatchObject({
+ runner: null,
+ loading: true,
+ runnerPath: mockRunnerPath,
+ });
+ });
+
+ it('displays the runner form', async () => {
+ await createComponentWithApollo();
+
+ expect(findRunnerUpdateForm().props()).toMatchObject({
+ runner: mockRunner,
+ loading: false,
+ runnerPath: mockRunnerPath,
+ });
+ });
+
describe('When there is an error', () => {
beforeEach(async () => {
mockRunnerQuery = jest.fn().mockRejectedValueOnce(new Error('Error!'));
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 f994ff24c21..07259ec3538 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
@@ -3,24 +3,30 @@ import { mount, shallowMount } from '@vue/test-utils';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
-import { createAlert } from '~/flash';
+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 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/details/runner.query.graphql';
+import runnerQuery from '~/runner/graphql/show/runner.query.graphql';
import AdminRunnerShowApp from '~/runner/admin_runner_show/admin_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 = '/admin/runners';
Vue.use(VueApollo);
@@ -29,6 +35,7 @@ describe('AdminRunnerShowApp', () => {
let mockRunnerQuery;
const findRunnerHeader = () => wrapper.findComponent(RunnerHeader);
+ const findRunnerDeleteButton = () => wrapper.findComponent(RunnerDeleteButton);
const findRunnerEditButton = () => wrapper.findComponent(RunnerEditButton);
const findRunnerPauseButton = () => wrapper.findComponent(RunnerPauseButton);
@@ -45,6 +52,7 @@ describe('AdminRunnerShowApp', () => {
apolloProvider: createMockApollo([[runnerQuery, mockRunnerQuery]]),
propsData: {
runnerId: mockRunnerId,
+ runnersPath: mockRunnersPath,
...props,
},
});
@@ -75,6 +83,7 @@ describe('AdminRunnerShowApp', () => {
it('displays the runner edit and pause buttons', async () => {
expect(findRunnerEditButton().exists()).toBe(true);
expect(findRunnerPauseButton().exists()).toBe(true);
+ expect(findRunnerDeleteButton().exists()).toBe(true);
});
it('shows basic runner details', async () => {
@@ -82,6 +91,9 @@ describe('AdminRunnerShowApp', () => {
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, ' ');
@@ -108,6 +120,42 @@ describe('AdminRunnerShowApp', () => {
});
});
+ describe('when runner cannot be deleted', () => {
+ beforeEach(async () => {
+ mockRunnerQueryResult({
+ userPermissions: {
+ deleteRunner: false,
+ },
+ });
+
+ await createComponent({
+ mountFn: mount,
+ });
+ });
+
+ it('does not display the runner edit and pause buttons', () => {
+ expect(findRunnerDeleteButton().exists()).toBe(false);
+ });
+ });
+
+ describe('when runner is deleted', () => {
+ beforeEach(async () => {
+ await createComponent({
+ mountFn: mount,
+ });
+ });
+
+ 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 runner does not have an edit url ', () => {
beforeEach(async () => {
mockRunnerQueryResult({
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 2ef856c90ab..405813be4e3 100644
--- a/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
+++ b/spec/frontend/runner/admin_runners/admin_runners_app_spec.js
@@ -35,6 +35,8 @@ import {
PARAM_KEY_STATUS,
PARAM_KEY_TAG,
STATUS_ONLINE,
+ STATUS_OFFLINE,
+ STATUS_STALE,
RUNNER_PAGE_SIZE,
} from '~/runner/constants';
import adminRunnersQuery from '~/runner/graphql/list/admin_runners.query.graphql';
@@ -52,6 +54,7 @@ import {
const mockRegistrationToken = 'MOCK_REGISTRATION_TOKEN';
const mockRunners = runnersData.data.runners.nodes;
+const mockRunnersCount = runnersCountData.data.runners.count;
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
@@ -124,18 +127,6 @@ describe('AdminRunnersApp', () => {
wrapper.destroy();
});
- it('shows total runner counts', async () => {
- createComponent({ mountFn: mountExtended });
-
- await waitForPromises();
-
- const stats = findRunnerStats().text();
-
- expect(stats).toMatch('Online runners 4');
- expect(stats).toMatch('Offline runners 4');
- expect(stats).toMatch('Stale runners 4');
- });
-
it('shows the runner tabs with a runner count for each type', async () => {
mockRunnersCountQuery.mockImplementation(({ type }) => {
let count;
@@ -197,6 +188,24 @@ describe('AdminRunnersApp', () => {
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,
+ });
+
+ expect(findRunnerStats().props()).toMatchObject({
+ onlineRunnersCount: mockRunnersCount,
+ offlineRunnersCount: mockRunnersCount,
+ staleRunnersCount: mockRunnersCount,
+ });
+ });
+
it('shows the runners list', () => {
expect(findRunnerList().props('runners')).toEqual(mockRunners);
});
@@ -329,13 +338,30 @@ describe('AdminRunnersApp', () => {
first: RUNNER_PAGE_SIZE,
});
});
+
+ it('fetches count results for requested status', () => {
+ expect(mockRunnersCountQuery).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();
+
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
- filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } }],
+ filters: [
+ { type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } },
+ { type: PARAM_KEY_TAG, value: { data: 'tag1', operator: '=' } },
+ ],
sort: CREATED_ASC,
});
});
@@ -343,17 +369,45 @@ describe('AdminRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/admin/runners?status[]=ONLINE&sort=CREATED_ASC',
+ url: 'http://test.host/admin/runners?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC',
});
});
it('requests the runners with filters', () => {
expect(mockRunnersQuery).toHaveBeenLastCalledWith({
status: STATUS_ONLINE,
+ tagList: ['tag1'],
sort: CREATED_ASC,
first: RUNNER_PAGE_SIZE,
});
});
+
+ it('fetches count results for requested status', () => {
+ expect(mockRunnersCountQuery).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,
+ });
+ });
});
it('when runners have not loaded, shows a loading state', () => {
diff --git a/spec/frontend/runner/components/registration/registration_dropdown_spec.js b/spec/frontend/runner/components/registration/registration_dropdown_spec.js
index 5cd93df9967..81c2788f084 100644
--- a/spec/frontend/runner/components/registration/registration_dropdown_spec.js
+++ b/spec/frontend/runner/components/registration/registration_dropdown_spec.js
@@ -35,6 +35,16 @@ describe('RegistrationDropdown', () => {
const findRegistrationTokenInput = () => wrapper.findByTestId('token-value').find('input');
const findTokenResetDropdownItem = () =>
wrapper.findComponent(RegistrationTokenResetDropdownItem);
+ const findModalContent = () =>
+ createWrapper(document.body)
+ .find('[data-testid="runner-instructions-modal"]')
+ .text()
+ .replace(/[\n\t\s]+/g, ' ');
+
+ const openModal = async () => {
+ await findRegistrationInstructionsDropdownItem().trigger('click');
+ await waitForPromises();
+ };
const createComponent = ({ props = {}, ...options } = {}, mountFn = shallowMount) => {
wrapper = extendedWrapper(
@@ -49,6 +59,25 @@ describe('RegistrationDropdown', () => {
);
};
+ const createComponentWithModal = () => {
+ Vue.use(VueApollo);
+
+ const requestHandlers = [
+ [getRunnerPlatformsQuery, jest.fn().mockResolvedValue(mockGraphqlRunnerPlatforms)],
+ [getRunnerSetupInstructionsQuery, jest.fn().mockResolvedValue(mockGraphqlInstructions)],
+ ];
+
+ createComponent(
+ {
+ // Mock load modal contents from API
+ apolloProvider: createMockApollo(requestHandlers),
+ // Use `attachTo` to find the modal
+ attachTo: document.body,
+ },
+ mount,
+ );
+ };
+
it.each`
type | text
${INSTANCE_TYPE} | ${'Register an instance runner'}
@@ -76,29 +105,10 @@ describe('RegistrationDropdown', () => {
});
describe('When the dropdown item is clicked', () => {
- Vue.use(VueApollo);
-
- const requestHandlers = [
- [getRunnerPlatformsQuery, jest.fn().mockResolvedValue(mockGraphqlRunnerPlatforms)],
- [getRunnerSetupInstructionsQuery, jest.fn().mockResolvedValue(mockGraphqlInstructions)],
- ];
-
- const findModalInBody = () =>
- createWrapper(document.body).find('[data-testid="runner-instructions-modal"]');
-
beforeEach(async () => {
- createComponent(
- {
- // Mock load modal contents from API
- apolloProvider: createMockApollo(requestHandlers),
- // Use `attachTo` to find the modal
- attachTo: document.body,
- },
- mount,
- );
-
- await findRegistrationInstructionsDropdownItem().trigger('click');
- await waitForPromises();
+ createComponentWithModal({}, mount);
+
+ await openModal();
});
afterEach(() => {
@@ -106,9 +116,7 @@ describe('RegistrationDropdown', () => {
});
it('opens the modal with contents', () => {
- const modalText = findModalInBody()
- .text()
- .replace(/[\n\t\s]+/g, ' ');
+ const modalText = findModalContent();
expect(modalText).toContain('Install a runner');
@@ -153,15 +161,34 @@ describe('RegistrationDropdown', () => {
});
});
- it('Updates the token when it gets reset', async () => {
+ describe('When token is reset', () => {
const newToken = 'mock1';
- createComponent({}, mount);
- expect(findRegistrationTokenInput().props('value')).not.toBe(newToken);
+ const resetToken = async () => {
+ findTokenResetDropdownItem().vm.$emit('tokenReset', newToken);
+ await nextTick();
+ };
+
+ it('Updates token in input', async () => {
+ createComponent({}, mount);
+
+ expect(findRegistrationTokenInput().props('value')).not.toBe(newToken);
+
+ await resetToken();
+
+ expect(findRegistrationToken().props('value')).toBe(newToken);
+ });
- findTokenResetDropdownItem().vm.$emit('tokenReset', newToken);
- await nextTick();
+ it('Updates token in modal', async () => {
+ createComponentWithModal({}, mount);
- expect(findRegistrationToken().props('value')).toBe(newToken);
+ await openModal();
+
+ expect(findModalContent()).toContain(mockToken);
+
+ await resetToken();
+
+ expect(findModalContent()).toContain(newToken);
+ });
});
});
diff --git a/spec/frontend/runner/components/runner_delete_button_spec.js b/spec/frontend/runner/components/runner_delete_button_spec.js
index 3eb257607b4..b11c749d0a7 100644
--- a/spec/frontend/runner/components/runner_delete_button_spec.js
+++ b/spec/frontend/runner/components/runner_delete_button_spec.js
@@ -118,6 +118,12 @@ describe('RunnerDeleteButton', () => {
expect(findBtn().attributes('aria-label')).toBe(undefined);
});
+ it('Passes other attributes to the button', () => {
+ createComponent({ props: { category: 'secondary' } });
+
+ expect(findBtn().props('category')).toBe('secondary');
+ });
+
describe(`Before the delete button is clicked`, () => {
it('The mutation has not been called', () => {
expect(runnerDeleteHandler).toHaveBeenCalledTimes(0);
diff --git a/spec/frontend/runner/components/runner_details_spec.js b/spec/frontend/runner/components/runner_details_spec.js
index 6bf4a52a799..162d21febfd 100644
--- a/spec/frontend/runner/components/runner_details_spec.js
+++ b/spec/frontend/runner/components/runner_details_spec.js
@@ -77,6 +77,9 @@ describe('RunnerDetails', () => {
${'Last contact'} | ${{ contactedAt: null }} | ${'Never contacted'}
${'Version'} | ${{ version: '12.3' }} | ${'12.3'}
${'Version'} | ${{ version: null }} | ${'None'}
+ ${'Executor'} | ${{ executorName: 'shell' }} | ${'shell'}
+ ${'Architecture'} | ${{ architectureName: 'amd64' }} | ${'amd64'}
+ ${'Platform'} | ${{ platformName: 'darwin' }} | ${'darwin'}
${'IP Address'} | ${{ ipAddress: '127.0.0.1' }} | ${'127.0.0.1'}
${'IP Address'} | ${{ ipAddress: null }} | ${'None'}
${'Configuration'} | ${{ accessLevel: ACCESS_LEVEL_REF_PROTECTED, runUntagged: true }} | ${'Protected, Runs untagged jobs'}
diff --git a/spec/frontend/runner/components/runner_jobs_spec.js b/spec/frontend/runner/components/runner_jobs_spec.js
index 9e40e911448..8ac5685a0dd 100644
--- a/spec/frontend/runner/components/runner_jobs_spec.js
+++ b/spec/frontend/runner/components/runner_jobs_spec.js
@@ -11,7 +11,7 @@ import RunnerPagination from '~/runner/components/runner_pagination.vue';
import { captureException } from '~/runner/sentry_utils';
import { I18N_NO_JOBS_FOUND, RUNNER_DETAILS_JOBS_PAGE_SIZE } from '~/runner/constants';
-import runnerJobsQuery from '~/runner/graphql/details/runner_jobs.query.graphql';
+import runnerJobsQuery from '~/runner/graphql/show/runner_jobs.query.graphql';
import { runnerData, runnerJobsData } from '../mock_data';
diff --git a/spec/frontend/runner/components/runner_projects_spec.js b/spec/frontend/runner/components/runner_projects_spec.js
index 62ebc6539e2..04627e2307b 100644
--- a/spec/frontend/runner/components/runner_projects_spec.js
+++ b/spec/frontend/runner/components/runner_projects_spec.js
@@ -16,7 +16,7 @@ import RunnerAssignedItem from '~/runner/components/runner_assigned_item.vue';
import RunnerPagination from '~/runner/components/runner_pagination.vue';
import { captureException } from '~/runner/sentry_utils';
-import runnerProjectsQuery from '~/runner/graphql/details/runner_projects.query.graphql';
+import runnerProjectsQuery from '~/runner/graphql/show/runner_projects.query.graphql';
import { runnerData, runnerProjectsData } from '../mock_data';
diff --git a/spec/frontend/runner/components/runner_update_form_spec.js b/spec/frontend/runner/components/runner_update_form_spec.js
index b071791e39f..3037364d941 100644
--- a/spec/frontend/runner/components/runner_update_form_spec.js
+++ b/spec/frontend/runner/components/runner_update_form_spec.js
@@ -1,10 +1,11 @@
import Vue, { nextTick } from 'vue';
-import { GlForm } from '@gitlab/ui';
+import { GlForm, GlSkeletonLoader } from '@gitlab/ui';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert, VARIANT_SUCCESS } from '~/flash';
+import { redirectTo } from '~/lib/utils/url_utility';
import RunnerUpdateForm from '~/runner/components/runner_update_form.vue';
import {
INSTANCE_TYPE,
@@ -13,14 +14,18 @@ import {
ACCESS_LEVEL_REF_PROTECTED,
ACCESS_LEVEL_NOT_PROTECTED,
} from '~/runner/constants';
-import runnerUpdateMutation from '~/runner/graphql/details/runner_update.mutation.graphql';
+import runnerUpdateMutation from '~/runner/graphql/edit/runner_update.mutation.graphql';
import { captureException } from '~/runner/sentry_utils';
-import { runnerData } from '../mock_data';
+import { saveAlertToLocalStorage } from '~/runner/local_storage_alert/save_alert_to_local_storage';
+import { runnerFormData } 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 mockRunner = runnerFormData.data.runner;
+const mockRunnerPath = '/admin/runners/1';
Vue.use(VueApollo);
@@ -33,8 +38,7 @@ describe('RunnerUpdateForm', () => {
const findProtectedCheckbox = () => wrapper.findByTestId('runner-field-protected');
const findRunUntaggedCheckbox = () => wrapper.findByTestId('runner-field-run-untagged');
const findLockedCheckbox = () => wrapper.findByTestId('runner-field-locked');
-
- const findIpInput = () => wrapper.findByTestId('runner-field-ip-address').find('input');
+ const findFields = () => wrapper.findAll('[data-testid^="runner-field"');
const findDescriptionInput = () => wrapper.findByTestId('runner-field-description').find('input');
const findMaxJobTimeoutInput = () =>
@@ -53,7 +57,6 @@ describe('RunnerUpdateForm', () => {
: ACCESS_LEVEL_NOT_PROTECTED,
runUntagged: findRunUntaggedCheckbox().element.checked,
locked: findLockedCheckbox().element?.checked || false,
- ipAddress: findIpInput().element.value,
maximumTimeout: findMaxJobTimeoutInput().element.value || null,
tagList: findTagsInput().element.value.split(',').filter(Boolean),
});
@@ -62,6 +65,7 @@ describe('RunnerUpdateForm', () => {
wrapper = mountExtended(RunnerUpdateForm, {
propsData: {
runner: mockRunner,
+ runnerPath: mockRunnerPath,
...props,
},
apolloProvider: createMockApollo([[runnerUpdateMutation, runnerUpdateHandler]]),
@@ -74,12 +78,13 @@ describe('RunnerUpdateForm', () => {
input: expect.objectContaining(submittedRunner),
});
- expect(createAlert).toHaveBeenLastCalledWith({
- message: expect.stringContaining('saved'),
- variant: VARIANT_SUCCESS,
- });
-
- expect(findSubmitDisabledAttr()).toBeUndefined();
+ expect(saveAlertToLocalStorage).toHaveBeenCalledWith(
+ expect.objectContaining({
+ message: expect.any(String),
+ variant: VARIANT_SUCCESS,
+ }),
+ );
+ expect(redirectTo).toHaveBeenCalledWith(mockRunnerPath);
};
beforeEach(() => {
@@ -122,27 +127,19 @@ describe('RunnerUpdateForm', () => {
await submitFormAndWait();
// Some read-only fields are not submitted
- const {
- __typename,
- ipAddress,
- runnerType,
- createdAt,
- status,
- editAdminUrl,
- contactedAt,
- userPermissions,
- version,
- groups,
- jobCount,
- ...submitted
- } = mockRunner;
+ const { __typename, shortSha, runnerType, createdAt, status, ...submitted } = mockRunner;
expectToHaveSubmittedRunnerContaining(submitted);
});
describe('When data is being loaded', () => {
beforeEach(() => {
- createComponent({ props: { runner: null } });
+ createComponent({ props: { loading: true } });
+ });
+
+ it('Form skeleton is shown', () => {
+ expect(wrapper.find(GlSkeletonLoader).exists()).toBe(true);
+ expect(findFields()).toHaveLength(0);
});
it('Form cannot be submitted', () => {
@@ -151,11 +148,12 @@ describe('RunnerUpdateForm', () => {
it('Form is updated when data loads', async () => {
wrapper.setProps({
- runner: mockRunner,
+ loading: false,
});
await nextTick();
+ expect(findFields()).not.toHaveLength(0);
expect(mockRunner).toMatchObject(getFieldsModel());
});
});
@@ -273,8 +271,11 @@ describe('RunnerUpdateForm', () => {
expect(createAlert).toHaveBeenLastCalledWith({
message: mockErrorMsg,
});
- expect(captureException).not.toHaveBeenCalled();
expect(findSubmitDisabledAttr()).toBeUndefined();
+
+ expect(captureException).not.toHaveBeenCalled();
+ expect(saveAlertToLocalStorage).not.toHaveBeenCalled();
+ expect(redirectTo).not.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 02348bf737a..52bd51a974b 100644
--- a/spec/frontend/runner/group_runners/group_runners_app_spec.js
+++ b/spec/frontend/runner/group_runners/group_runners_app_spec.js
@@ -30,7 +30,10 @@ import {
PROJECT_TYPE,
PARAM_KEY_PAUSED,
PARAM_KEY_STATUS,
+ PARAM_KEY_TAG,
STATUS_ONLINE,
+ STATUS_OFFLINE,
+ STATUS_STALE,
RUNNER_PAGE_SIZE,
I18N_EDIT,
} from '~/runner/constants';
@@ -53,7 +56,7 @@ Vue.use(GlToast);
const mockGroupFullPath = 'group1';
const mockRegistrationToken = 'AABBCC';
const mockGroupRunnersEdges = groupRunnersData.data.group.runners.edges;
-const mockGroupRunnersLimitedCount = mockGroupRunnersEdges.length;
+const mockGroupRunnersCount = mockGroupRunnersEdges.length;
jest.mock('~/flash');
jest.mock('~/runner/sentry_utils');
@@ -94,7 +97,7 @@ describe('GroupRunnersApp', () => {
propsData: {
registrationToken: mockRegistrationToken,
groupFullPath: mockGroupFullPath,
- groupRunnersLimitedCount: mockGroupRunnersLimitedCount,
+ groupRunnersLimitedCount: mockGroupRunnersCount,
...props,
},
provide: {
@@ -115,15 +118,24 @@ describe('GroupRunnersApp', () => {
});
it('shows total runner counts', async () => {
- createComponent({ mountFn: mountExtended });
-
- await waitForPromises();
-
- const stats = findRunnerStats().text();
+ expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ groupFullPath: mockGroupFullPath,
+ status: STATUS_ONLINE,
+ });
+ expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ groupFullPath: mockGroupFullPath,
+ status: STATUS_OFFLINE,
+ });
+ expect(mockGroupRunnersCountQuery).toHaveBeenCalledWith({
+ groupFullPath: mockGroupFullPath,
+ status: STATUS_STALE,
+ });
- expect(stats).toMatch('Online runners 2');
- expect(stats).toMatch('Offline runners 2');
- expect(stats).toMatch('Stale runners 2');
+ expect(findRunnerStats().props()).toMatchObject({
+ onlineRunnersCount: mockGroupRunnersCount,
+ offlineRunnersCount: mockGroupRunnersCount,
+ staleRunnersCount: mockGroupRunnersCount,
+ });
});
it('shows the runner tabs with a runner count for each type', async () => {
@@ -281,13 +293,28 @@ describe('GroupRunnersApp', () => {
first: RUNNER_PAGE_SIZE,
});
});
+
+ it('fetches count results for requested status', () => {
+ expect(mockGroupRunnersCountQuery).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 () => {
findRunnerFilteredSearchBar().vm.$emit('input', {
runnerType: null,
- filters: [{ type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } }],
+ filters: [
+ { type: PARAM_KEY_STATUS, value: { data: STATUS_ONLINE, operator: '=' } },
+ { type: PARAM_KEY_TAG, value: { data: 'tag1', operator: '=' } },
+ ],
sort: CREATED_ASC,
});
@@ -297,7 +324,7 @@ describe('GroupRunnersApp', () => {
it('updates the browser url', () => {
expect(updateHistory).toHaveBeenLastCalledWith({
title: expect.any(String),
- url: 'http://test.host/groups/group1/-/runners?status[]=ONLINE&sort=CREATED_ASC',
+ url: 'http://test.host/groups/group1/-/runners?status[]=ONLINE&tag[]=tag1&sort=CREATED_ASC',
});
});
@@ -305,10 +332,41 @@ describe('GroupRunnersApp', () => {
expect(mockGroupRunnersQuery).toHaveBeenLastCalledWith({
groupFullPath: mockGroupFullPath,
status: STATUS_ONLINE,
+ tagList: ['tag1'],
sort: CREATED_ASC,
first: RUNNER_PAGE_SIZE,
});
});
+
+ it('fetches count results for requested status', () => {
+ expect(mockGroupRunnersCountQuery).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,
+ });
+ });
});
it('when runners have not loaded, shows a loading state', () => {
diff --git a/spec/frontend/runner/local_storage_alert/save_alert_to_local_storage_spec.js b/spec/frontend/runner/local_storage_alert/save_alert_to_local_storage_spec.js
new file mode 100644
index 00000000000..69cda6d6022
--- /dev/null
+++ b/spec/frontend/runner/local_storage_alert/save_alert_to_local_storage_spec.js
@@ -0,0 +1,24 @@
+import AccessorUtilities from '~/lib/utils/accessor';
+import { saveAlertToLocalStorage } from '~/runner/local_storage_alert/save_alert_to_local_storage';
+import { LOCAL_STORAGE_ALERT_KEY } from '~/runner/local_storage_alert/constants';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+
+const mockAlert = { message: 'Message!' };
+
+describe('saveAlertToLocalStorage', () => {
+ useLocalStorageSpy();
+
+ beforeEach(() => {
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
+ });
+
+ it('saves message to local storage', () => {
+ saveAlertToLocalStorage(mockAlert);
+
+ expect(localStorage.setItem).toHaveBeenCalledTimes(1);
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ LOCAL_STORAGE_ALERT_KEY,
+ JSON.stringify(mockAlert),
+ );
+ });
+});
diff --git a/spec/frontend/runner/local_storage_alert/show_alert_from_local_storage_spec.js b/spec/frontend/runner/local_storage_alert/show_alert_from_local_storage_spec.js
new file mode 100644
index 00000000000..cabbe642dac
--- /dev/null
+++ b/spec/frontend/runner/local_storage_alert/show_alert_from_local_storage_spec.js
@@ -0,0 +1,40 @@
+import AccessorUtilities from '~/lib/utils/accessor';
+import { showAlertFromLocalStorage } from '~/runner/local_storage_alert/show_alert_from_local_storage';
+import { LOCAL_STORAGE_ALERT_KEY } from '~/runner/local_storage_alert/constants';
+import { useLocalStorageSpy } from 'helpers/local_storage_helper';
+import { createAlert } from '~/flash';
+
+jest.mock('~/flash');
+
+describe('showAlertFromLocalStorage', () => {
+ useLocalStorageSpy();
+
+ beforeEach(() => {
+ jest.spyOn(AccessorUtilities, 'canUseLocalStorage').mockReturnValue(true);
+ });
+
+ it('retrieves message from local storage and displays it', async () => {
+ const mockAlert = { message: 'Message!' };
+
+ localStorage.getItem.mockReturnValueOnce(JSON.stringify(mockAlert));
+
+ await showAlertFromLocalStorage();
+
+ expect(createAlert).toHaveBeenCalledTimes(1);
+ expect(createAlert).toHaveBeenCalledWith(mockAlert);
+
+ expect(localStorage.removeItem).toHaveBeenCalledTimes(1);
+ expect(localStorage.removeItem).toHaveBeenCalledWith(LOCAL_STORAGE_ALERT_KEY);
+ });
+
+ it.each(['not a json string', null])('does not fail when stored message is %o', async (item) => {
+ localStorage.getItem.mockReturnValueOnce(item);
+
+ await showAlertFromLocalStorage();
+
+ expect(createAlert).not.toHaveBeenCalled();
+
+ expect(localStorage.removeItem).toHaveBeenCalledTimes(1);
+ expect(localStorage.removeItem).toHaveBeenCalledWith(LOCAL_STORAGE_ALERT_KEY);
+ });
+});
diff --git a/spec/frontend/runner/mock_data.js b/spec/frontend/runner/mock_data.js
index fbe8926124c..1c2333b552c 100644
--- a/spec/frontend/runner/mock_data.js
+++ b/spec/frontend/runner/mock_data.js
@@ -1,5 +1,14 @@
// Fixtures generated by: spec/frontend/fixtures/runner.rb
+// Show runner queries
+import runnerData from 'test_fixtures/graphql/runner/show/runner.query.graphql.json';
+import runnerWithGroupData from 'test_fixtures/graphql/runner/show/runner.query.graphql.with_group.json';
+import runnerProjectsData from 'test_fixtures/graphql/runner/show/runner_projects.query.graphql.json';
+import runnerJobsData from 'test_fixtures/graphql/runner/show/runner_jobs.query.graphql.json';
+
+// Edit runner queries
+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';
@@ -8,25 +17,20 @@ import groupRunnersData from 'test_fixtures/graphql/runner/list/group_runners.qu
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';
-// Details queries
-import runnerData from 'test_fixtures/graphql/runner/details/runner.query.graphql.json';
-import runnerWithGroupData from 'test_fixtures/graphql/runner/details/runner.query.graphql.with_group.json';
-import runnerProjectsData from 'test_fixtures/graphql/runner/details/runner_projects.query.graphql.json';
-import runnerJobsData from 'test_fixtures/graphql/runner/details/runner_jobs.query.graphql.json';
-
// Other mock data
export const onlineContactTimeoutSecs = 2 * 60 * 60;
export const staleTimeoutSecs = 5259492; // Ruby's `2.months`
export {
runnersData,
- runnersCountData,
runnersDataPaginated,
+ runnersCountData,
+ groupRunnersData,
+ groupRunnersDataPaginated,
+ groupRunnersCountData,
runnerData,
runnerWithGroupData,
runnerProjectsData,
runnerJobsData,
- groupRunnersData,
- groupRunnersCountData,
- groupRunnersDataPaginated,
+ runnerFormData,
};
diff --git a/spec/frontend/runner/runner_search_utils_spec.js b/spec/frontend/runner/runner_search_utils_spec.js
index 7834e76fe48..a3c1458ed26 100644
--- a/spec/frontend/runner/runner_search_utils_spec.js
+++ b/spec/frontend/runner/runner_search_utils_spec.js
@@ -220,13 +220,11 @@ describe('search_params.js', () => {
});
it.each`
- query | updatedQuery
- ${'status[]=NOT_CONNECTED'} | ${'status[]=NEVER_CONTACTED'}
- ${'status[]=NOT_CONNECTED&a=b'} | ${'status[]=NEVER_CONTACTED&a=b'}
- ${'status[]=ACTIVE'} | ${'paused[]=false'}
- ${'status[]=ACTIVE&a=b'} | ${'a=b&paused[]=false'}
- ${'status[]=ACTIVE'} | ${'paused[]=false'}
- ${'status[]=PAUSED'} | ${'paused[]=true'}
+ query | updatedQuery
+ ${'status[]=ACTIVE'} | ${'paused[]=false'}
+ ${'status[]=ACTIVE&a=b'} | ${'a=b&paused[]=false'}
+ ${'status[]=ACTIVE'} | ${'paused[]=false'}
+ ${'status[]=PAUSED'} | ${'paused[]=true'}
`('updates "$query" to "$updatedQuery"', ({ query, updatedQuery }) => {
const mockUrl = 'http://test.host/admin/runners?';
diff --git a/spec/frontend/search/highlight_blob_search_result_spec.js b/spec/frontend/search/highlight_blob_search_result_spec.js
index 9fa3bfc1f9a..15cff436076 100644
--- a/spec/frontend/search/highlight_blob_search_result_spec.js
+++ b/spec/frontend/search/highlight_blob_search_result_spec.js
@@ -1,10 +1,15 @@
import setHighlightClass from '~/search/highlight_blob_search_result';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
const fixture = 'search/blob_search_result.html';
const searchKeyword = 'Send'; // spec/frontend/fixtures/search.rb#79
describe('search/highlight_blob_search_result', () => {
- beforeEach(() => loadFixtures(fixture));
+ beforeEach(() => loadHTMLFixture(fixture));
+
+ afterEach(() => {
+ resetHTMLFixture();
+ });
it('highlights lines with search term occurrence', () => {
setHighlightClass(searchKeyword);
diff --git a/spec/frontend/search_autocomplete_spec.js b/spec/frontend/search_autocomplete_spec.js
index 190f2803324..4639552b4d3 100644
--- a/spec/frontend/search_autocomplete_spec.js
+++ b/spec/frontend/search_autocomplete_spec.js
@@ -1,5 +1,6 @@
import AxiosMockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { mockTracking, unmockTracking } from 'helpers/tracking_helper';
import axios from '~/lib/utils/axios_utils';
import initSearchAutocomplete from '~/search_autocomplete';
@@ -104,7 +105,7 @@ describe('Search autocomplete dropdown', () => {
};
beforeEach(() => {
- loadFixtures('static/search_autocomplete.html');
+ loadHTMLFixture('static/search_autocomplete.html');
window.gon = {};
window.gon.current_user_id = userId;
@@ -118,6 +119,8 @@ describe('Search autocomplete dropdown', () => {
// Undo what we did to the shared <body>
removeBodyAttributes();
window.gon = {};
+
+ resetHTMLFixture();
});
it('should show Dashboard specific dropdown menu', () => {
diff --git a/spec/frontend/security_configuration/components/app_spec.js b/spec/frontend/security_configuration/components/app_spec.js
index 9a18cb636b2..d7d46d0d415 100644
--- a/spec/frontend/security_configuration/components/app_spec.js
+++ b/spec/frontend/security_configuration/components/app_spec.js
@@ -1,6 +1,8 @@
+import Vue, { nextTick } from 'vue';
+import VueApollo from 'vue-apollo';
import { GlTab, GlTabs, GlLink } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
+
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import { makeMockUserCalloutDismisser } from 'helpers/mock_user_callout_dismisser';
import stubChildren from 'helpers/stub_children';
@@ -18,15 +20,22 @@ import {
LICENSE_COMPLIANCE_DESCRIPTION,
LICENSE_COMPLIANCE_HELP_PATH,
AUTO_DEVOPS_ENABLED_ALERT_DISMISSED_STORAGE_KEY,
+ LICENSE_ULTIMATE,
+ LICENSE_PREMIUM,
+ LICENSE_FREE,
} from '~/security_configuration/components/constants';
import FeatureCard from '~/security_configuration/components/feature_card.vue';
import TrainingProviderList from '~/security_configuration/components/training_provider_list.vue';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import currentLicenseQuery from '~/security_configuration/graphql/current_license.query.graphql';
+import waitForPromises from 'helpers/wait_for_promises';
import UpgradeBanner from '~/security_configuration/components/upgrade_banner.vue';
import {
REPORT_TYPE_LICENSE_COMPLIANCE,
REPORT_TYPE_SAST,
} from '~/vue_shared/security_reports/constants';
+import { getCurrentLicensePlanResponse } from '../mock_data';
const upgradePath = '/upgrade';
const autoDevopsHelpPagePath = '/autoDevopsHelpPagePath';
@@ -36,18 +45,33 @@ const projectFullPath = 'namespace/project';
const vulnerabilityTrainingDocsPath = 'user/application_security/vulnerabilities/index';
useLocalStorageSpy();
+Vue.use(VueApollo);
describe('App component', () => {
let wrapper;
let userCalloutDismissSpy;
+ let mockApollo;
const createComponent = ({
shouldShowCallout = true,
- secureVulnerabilityTraining = true,
+ licenseQueryResponse = LICENSE_ULTIMATE,
...propsData
}) => {
userCalloutDismissSpy = jest.fn();
+ mockApollo = createMockApollo([
+ [
+ currentLicenseQuery,
+ jest
+ .fn()
+ .mockResolvedValue(
+ licenseQueryResponse instanceof Error
+ ? licenseQueryResponse
+ : getCurrentLicensePlanResponse(licenseQueryResponse),
+ ),
+ ],
+ ]);
+
wrapper = extendedWrapper(
mount(SecurityConfigurationApp, {
propsData,
@@ -57,10 +81,8 @@ describe('App component', () => {
autoDevopsPath,
projectFullPath,
vulnerabilityTrainingDocsPath,
- glFeatures: {
- secureVulnerabilityTraining,
- },
},
+ apolloProvider: mockApollo,
stubs: {
...stubChildren(SecurityConfigurationApp),
GlLink: false,
@@ -135,14 +157,16 @@ describe('App component', () => {
afterEach(() => {
wrapper.destroy();
+ mockApollo = null;
});
describe('basic structure', () => {
- beforeEach(() => {
+ beforeEach(async () => {
createComponent({
augmentedSecurityFeatures: securityFeaturesMock,
augmentedComplianceFeatures: complianceFeaturesMock,
});
+ await waitForPromises();
});
it('renders main-heading with correct text', () => {
@@ -445,11 +469,12 @@ describe('App component', () => {
});
describe('Vulnerability management', () => {
- beforeEach(() => {
+ beforeEach(async () => {
createComponent({
augmentedSecurityFeatures: securityFeaturesMock,
augmentedComplianceFeatures: complianceFeaturesMock,
});
+ await waitForPromises();
});
it('renders TrainingProviderList component', () => {
@@ -466,23 +491,25 @@ describe('App component', () => {
expect(trainingLink.text()).toBe('Learn more about vulnerability training');
expect(trainingLink.attributes('href')).toBe(vulnerabilityTrainingDocsPath);
});
- });
-
- describe('when secureVulnerabilityTraining feature flag is disabled', () => {
- beforeEach(() => {
- createComponent({
- augmentedSecurityFeatures: securityFeaturesMock,
- augmentedComplianceFeatures: complianceFeaturesMock,
- secureVulnerabilityTraining: false,
- });
- });
- it('renders correct amount of tabs', () => {
- expect(findTabs()).toHaveLength(2);
- });
-
- it('does not render the vulnerability-management tab', () => {
- expect(wrapper.findByTestId('vulnerability-management-tab').exists()).toBe(false);
- });
+ it.each`
+ licenseQueryResponse | display
+ ${LICENSE_ULTIMATE} | ${true}
+ ${LICENSE_PREMIUM} | ${false}
+ ${LICENSE_FREE} | ${false}
+ ${null} | ${true}
+ ${new Error()} | ${true}
+ `(
+ 'displays $display for license $licenseQueryResponse',
+ async ({ licenseQueryResponse, display }) => {
+ createComponent({
+ licenseQueryResponse,
+ augmentedSecurityFeatures: securityFeaturesMock,
+ augmentedComplianceFeatures: complianceFeaturesMock,
+ });
+ await waitForPromises();
+ expect(findVulnerabilityManagementTab().exists()).toBe(display);
+ },
+ );
});
});
diff --git a/spec/frontend/security_configuration/components/section_layout_spec.js b/spec/frontend/security_configuration/components/section_layout_spec.js
deleted file mode 100644
index 75da380bbb8..00000000000
--- a/spec/frontend/security_configuration/components/section_layout_spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import SectionLayout from '~/security_configuration/components/section_layout.vue';
-
-describe('Section Layout component', () => {
- let wrapper;
-
- const createComponent = (propsData) => {
- wrapper = extendedWrapper(
- mount(SectionLayout, {
- propsData,
- scopedSlots: {
- description: '<span>foo</span>',
- features: '<span>bar</span>',
- },
- }),
- );
- };
-
- const findHeading = () => wrapper.find('h2');
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('basic structure', () => {
- beforeEach(() => {
- createComponent({ heading: 'testheading' });
- });
-
- const slots = {
- description: 'foo',
- features: 'bar',
- };
-
- it('should render heading when passed in as props', () => {
- expect(findHeading().exists()).toBe(true);
- expect(findHeading().text()).toBe('testheading');
- });
-
- Object.keys(slots).forEach((slot) => {
- it('renders the slots', () => {
- const slotContent = slots[slot];
- createComponent({ heading: '' });
- expect(wrapper.text()).toContain(slotContent);
- });
- });
- });
-});
diff --git a/spec/frontend/security_configuration/mock_data.js b/spec/frontend/security_configuration/mock_data.js
index 18a480bf082..94a36472a1d 100644
--- a/spec/frontend/security_configuration/mock_data.js
+++ b/spec/frontend/security_configuration/mock_data.js
@@ -111,3 +111,12 @@ export const tempProviderLogos = {
svg: `<svg>${[testProviderName[1]]}</svg>`,
},
};
+
+export const getCurrentLicensePlanResponse = (plan) => ({
+ data: {
+ currentLicense: {
+ id: 'gid://gitlab/License/1',
+ plan,
+ },
+ },
+});
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 c968c28c811..62a9ff98243 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
@@ -63,6 +63,7 @@ exports[`self monitor component When the self monitor project has not been creat
</div>
<gl-modal-stub
+ arialabel=""
cancel-title="Cancel"
category="primary"
dismisslabel="Close"
diff --git a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap b/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
deleted file mode 100644
index 0f4dfdf8a75..00000000000
--- a/spec/frontend/serverless/components/__snapshots__/empty_state_spec.js.snap
+++ /dev/null
@@ -1,22 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`EmptyStateComponent should render content 1`] = `
-"<section class=\\"gl-display-flex empty-state gl-text-center gl-flex-direction-column\\">
- <div class=\\"gl-max-w-full\\">
- <div class=\\"svg-250 svg-content\\"><img src=\\"/image.svg\\" alt=\\"\\" role=\\"img\\" class=\\"gl-max-w-full gl-dark-invert-keep-hue\\"></div>
- </div>
- <div class=\\"gl-max-w-full gl-m-auto\\">
- <div class=\\"gl-mx-auto gl-my-0 gl-p-5\\">
- <h1 class=\\"gl-font-size-h-display gl-line-height-36 h4\\">
- Getting started with serverless
- </h1>
- <p class=\\"gl-mt-3\\">Serverless was <gl-link-stub target=\\"_blank\\" href=\\"https://about.gitlab.com/releases/2021/09/22/gitlab-14-3-released/#gitlab-serverless\\">deprecated</gl-link-stub>. But if you opt to use it, you must install Knative in your Kubernetes cluster first. <gl-link-stub href=\\"/help\\">Learn more.</gl-link-stub>
- </p>
- <div class=\\"gl-display-flex gl-flex-wrap gl-justify-content-center\\">
- <!---->
- <!---->
- </div>
- </div>
- </div>
-</section>"
-`;
diff --git a/spec/frontend/serverless/components/area_spec.js b/spec/frontend/serverless/components/area_spec.js
deleted file mode 100644
index 05c9ee44307..00000000000
--- a/spec/frontend/serverless/components/area_spec.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Area from '~/serverless/components/area.vue';
-import { mockNormalizedMetrics } from '../mock_data';
-
-describe('Area component', () => {
- const mockWidgets = 'mockWidgets';
- const mockGraphData = mockNormalizedMetrics;
- let areaChart;
-
- beforeEach(() => {
- areaChart = shallowMount(Area, {
- propsData: {
- graphData: mockGraphData,
- containerWidth: 0,
- },
- slots: {
- default: mockWidgets,
- },
- });
- });
-
- afterEach(() => {
- areaChart.destroy();
- });
-
- it('renders chart title', () => {
- expect(areaChart.find({ ref: 'graphTitle' }).text()).toBe(mockGraphData.title);
- });
-
- it('contains graph widgets from slot', () => {
- expect(areaChart.find({ ref: 'graphWidgets' }).text()).toBe(mockWidgets);
- });
-
- describe('methods', () => {
- describe('formatTooltipText', () => {
- const mockDate = mockNormalizedMetrics.queries[0].result[0].values[0].time;
- const generateSeriesData = (type) => ({
- seriesData: [
- {
- componentSubType: type,
- value: [mockDate, 4],
- },
- ],
- value: mockDate,
- });
-
- describe('series is of line type', () => {
- beforeEach(() => {
- areaChart.vm.formatTooltipText(generateSeriesData('line'));
- });
-
- it('formats tooltip title', () => {
- expect(areaChart.vm.tooltipPopoverTitle).toBe('28 Feb 2019, 11:11AM');
- });
-
- it('formats tooltip content', () => {
- expect(areaChart.vm.tooltipPopoverContent).toBe('Invocations (requests): 4');
- });
- });
-
- it('verify default interval value of 1', () => {
- expect(areaChart.vm.getInterval).toBe(1);
- });
- });
-
- describe('onResize', () => {
- const mockWidth = 233;
-
- beforeEach(() => {
- jest.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(() => ({
- width: mockWidth,
- }));
- areaChart.vm.onResize();
- });
-
- it('sets area chart width', () => {
- expect(areaChart.vm.width).toBe(mockWidth);
- });
- });
- });
-
- describe('computed', () => {
- describe('chartData', () => {
- it('utilizes all data points', () => {
- expect(Object.keys(areaChart.vm.chartData)).toEqual(['requests']);
- expect(areaChart.vm.chartData.requests.length).toBe(2);
- });
-
- it('creates valid data', () => {
- const data = areaChart.vm.chartData.requests;
-
- expect(
- data.filter(
- (datum) => new Date(datum.time).getTime() > 0 && typeof datum.value === 'number',
- ).length,
- ).toBe(data.length);
- });
- });
-
- describe('generateSeries', () => {
- it('utilizes correct time data', () => {
- expect(areaChart.vm.generateSeries.data).toEqual([
- ['2019-02-28T11:11:38.756Z', 0],
- ['2019-02-28T11:12:38.756Z', 0],
- ]);
- });
- });
-
- describe('xAxisLabel', () => {
- it('constructs a label for the chart x-axis', () => {
- expect(areaChart.vm.xAxisLabel).toBe('invocations / minute');
- });
- });
-
- describe('yAxisLabel', () => {
- it('constructs a label for the chart y-axis', () => {
- expect(areaChart.vm.yAxisLabel).toBe('Invocations (requests)');
- });
- });
- });
-});
diff --git a/spec/frontend/serverless/components/empty_state_spec.js b/spec/frontend/serverless/components/empty_state_spec.js
deleted file mode 100644
index d63882c2a6d..00000000000
--- a/spec/frontend/serverless/components/empty_state_spec.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { GlEmptyState, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import EmptyStateComponent from '~/serverless/components/empty_state.vue';
-import { createStore } from '~/serverless/store';
-
-describe('EmptyStateComponent', () => {
- let wrapper;
-
- beforeEach(() => {
- const store = createStore({
- clustersPath: '/clusters',
- helpPath: '/help',
- emptyImagePath: '/image.svg',
- });
- wrapper = shallowMount(EmptyStateComponent, { store, stubs: { GlEmptyState, GlSprintf } });
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('should render content', () => {
- expect(wrapper.html()).toMatchSnapshot();
- });
-});
diff --git a/spec/frontend/serverless/components/environment_row_spec.js b/spec/frontend/serverless/components/environment_row_spec.js
deleted file mode 100644
index 944283136d0..00000000000
--- a/spec/frontend/serverless/components/environment_row_spec.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import environmentRowComponent from '~/serverless/components/environment_row.vue';
-
-import { translate } from '~/serverless/utils';
-import { mockServerlessFunctions, mockServerlessFunctionsDiffEnv } from '../mock_data';
-
-const createComponent = (env, envName) =>
- shallowMount(environmentRowComponent, {
- propsData: { env, envName },
- }).vm;
-
-describe('environment row component', () => {
- describe('default global cluster case', () => {
- let vm;
-
- beforeEach(() => {
- vm = createComponent(translate(mockServerlessFunctions.functions)['*'], '*');
- });
-
- afterEach(() => vm.$destroy());
-
- it('has the correct envId', () => {
- expect(vm.envId).toEqual('env-global');
- });
-
- it('is open by default', () => {
- expect(vm.isOpenClass).toEqual({ 'is-open': true });
- });
-
- it('generates correct output', () => {
- expect(vm.$el.id).toEqual('env-global');
- expect(vm.$el.classList.contains('is-open')).toBe(true);
- expect(vm.$el.querySelector('div.title').innerHTML.trim()).toEqual('*');
- });
-
- it('opens and closes correctly', () => {
- expect(vm.isOpen).toBe(true);
-
- vm.toggleOpen();
-
- expect(vm.isOpen).toBe(false);
- });
- });
-
- describe('default named cluster case', () => {
- let vm;
-
- beforeEach(() => {
- vm = createComponent(translate(mockServerlessFunctionsDiffEnv.functions).test, 'test');
- });
-
- afterEach(() => vm.$destroy());
-
- it('has the correct envId', () => {
- expect(vm.envId).toEqual('env-test');
- });
-
- it('is open by default', () => {
- expect(vm.isOpenClass).toEqual({ 'is-open': true });
- });
-
- it('generates correct output', () => {
- expect(vm.$el.id).toEqual('env-test');
- expect(vm.$el.classList.contains('is-open')).toBe(true);
- expect(vm.$el.querySelector('div.title').innerHTML.trim()).toEqual('test');
- });
- });
-});
diff --git a/spec/frontend/serverless/components/function_details_spec.js b/spec/frontend/serverless/components/function_details_spec.js
deleted file mode 100644
index 0c9b2498589..00000000000
--- a/spec/frontend/serverless/components/function_details_spec.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import Vuex from 'vuex';
-
-import functionDetailsComponent from '~/serverless/components/function_details.vue';
-import { createStore } from '~/serverless/store';
-
-describe('functionDetailsComponent', () => {
- let component;
- let store;
-
- beforeEach(() => {
- Vue.use(Vuex);
-
- store = createStore({ clustersPath: '/clusters', helpPath: '/help' });
- });
-
- afterEach(() => {
- component.vm.$destroy();
- });
-
- describe('Verify base functionality', () => {
- const serviceStub = {
- name: 'test',
- description: 'a description',
- environment: '*',
- url: 'http://service.com/test',
- namespace: 'test-ns',
- podcount: 0,
- metricsUrl: '/metrics',
- };
-
- it('has a name, description, URL, and no pods loaded', () => {
- component = shallowMount(functionDetailsComponent, {
- store,
- propsData: {
- func: serviceStub,
- hasPrometheus: false,
- },
- });
-
- expect(
- component.vm.$el.querySelector('.serverless-function-name').innerHTML.trim(),
- ).toContain('test');
-
- expect(
- component.vm.$el.querySelector('.serverless-function-description').innerHTML.trim(),
- ).toContain('a description');
-
- expect(component.vm.$el.querySelector('p').innerHTML.trim()).toContain(
- 'No pods loaded at this time.',
- );
- });
-
- it('has a pods loaded', () => {
- serviceStub.podcount = 1;
-
- component = shallowMount(functionDetailsComponent, {
- store,
- propsData: {
- func: serviceStub,
- hasPrometheus: false,
- },
- });
-
- expect(component.vm.$el.querySelector('p').innerHTML.trim()).toContain('1 pod in use');
- });
-
- it('has multiple pods loaded', () => {
- serviceStub.podcount = 3;
-
- component = shallowMount(functionDetailsComponent, {
- store,
- propsData: {
- func: serviceStub,
- hasPrometheus: false,
- },
- });
-
- expect(component.vm.$el.querySelector('p').innerHTML.trim()).toContain('3 pods in use');
- });
-
- it('can support a missing description', () => {
- serviceStub.description = null;
-
- component = shallowMount(functionDetailsComponent, {
- store,
- propsData: {
- func: serviceStub,
- hasPrometheus: false,
- },
- });
-
- expect(
- component.vm.$el.querySelector('.serverless-function-description').querySelector('div')
- .innerHTML.length,
- ).toEqual(0);
- });
- });
-});
diff --git a/spec/frontend/serverless/components/function_row_spec.js b/spec/frontend/serverless/components/function_row_spec.js
deleted file mode 100644
index 081edd33b3b..00000000000
--- a/spec/frontend/serverless/components/function_row_spec.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import functionRowComponent from '~/serverless/components/function_row.vue';
-import Timeago from '~/vue_shared/components/time_ago_tooltip.vue';
-
-import { mockServerlessFunction } from '../mock_data';
-
-describe('functionRowComponent', () => {
- let wrapper;
-
- const createComponent = (func) => {
- wrapper = shallowMount(functionRowComponent, {
- propsData: { func },
- });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('Parses the function details correctly', () => {
- createComponent(mockServerlessFunction);
-
- expect(wrapper.find('b').text()).toBe(mockServerlessFunction.name);
- expect(wrapper.find('span').text()).toBe(mockServerlessFunction.image);
- expect(wrapper.find(Timeago).attributes('time')).not.toBe(null);
- });
-
- it('handles clicks correctly', () => {
- createComponent(mockServerlessFunction);
- const { vm } = wrapper;
-
- expect(vm.checkClass(vm.$el.querySelector('p'))).toBe(true); // check somewhere inside the row
- });
-});
diff --git a/spec/frontend/serverless/components/functions_spec.js b/spec/frontend/serverless/components/functions_spec.js
deleted file mode 100644
index 846fd63e918..00000000000
--- a/spec/frontend/serverless/components/functions_spec.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { GlLoadingIcon, GlAlert, GlSprintf } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import Vue, { nextTick } from 'vue';
-import AxiosMockAdapter from 'axios-mock-adapter';
-import Vuex from 'vuex';
-import { TEST_HOST } from 'helpers/test_constants';
-import axios from '~/lib/utils/axios_utils';
-import EmptyState from '~/serverless/components/empty_state.vue';
-import EnvironmentRow from '~/serverless/components/environment_row.vue';
-import functionsComponent from '~/serverless/components/functions.vue';
-import { createStore } from '~/serverless/store';
-import { mockServerlessFunctions } from '../mock_data';
-
-describe('functionsComponent', () => {
- const statusPath = `${TEST_HOST}/statusPath`;
-
- let component;
- let store;
- let axiosMock;
-
- beforeEach(() => {
- axiosMock = new AxiosMockAdapter(axios);
- axiosMock.onGet(statusPath).reply(200);
-
- Vue.use(Vuex);
-
- store = createStore({});
- component = shallowMount(functionsComponent, { store, stubs: { GlSprintf } });
- });
-
- afterEach(() => {
- component.destroy();
- axiosMock.restore();
- });
-
- it('should render deprecation notice', () => {
- expect(component.findComponent(GlAlert).text()).toBe(
- 'Serverless was deprecated in GitLab 14.3.',
- );
- });
-
- it('should render empty state when Knative is not installed', async () => {
- await store.dispatch('receiveFunctionsSuccess', { knative_installed: false });
-
- expect(component.findComponent(EmptyState).exists()).toBe(true);
- });
-
- it('should render a loading component', async () => {
- await store.dispatch('requestFunctionsLoading');
-
- expect(component.findComponent(GlLoadingIcon).exists()).toBe(true);
- });
-
- it('should render empty state when there is no function data', async () => {
- await store.dispatch('receiveFunctionsNoDataSuccess', { knative_installed: true });
-
- expect(
- component.vm.$el
- .querySelector('.empty-state, .js-empty-state')
- .classList.contains('js-empty-state'),
- ).toBe(true);
-
- expect(component.vm.$el.querySelector('.state-title, .text-center').innerHTML.trim()).toEqual(
- 'No functions available',
- );
- });
-
- it('should render functions and a loader when functions are partially fetched', async () => {
- await store.dispatch('receiveFunctionsPartial', {
- ...mockServerlessFunctions,
- knative_installed: 'checking',
- });
-
- expect(component.find('.js-functions-wrapper').exists()).toBe(true);
- expect(component.find('.js-functions-loader').exists()).toBe(true);
- });
-
- it('should render the functions list', async () => {
- store = createStore({ clustersPath: 'clustersPath', helpPath: 'helpPath', statusPath });
-
- await component.vm.$store.dispatch('receiveFunctionsSuccess', mockServerlessFunctions);
-
- await nextTick();
- expect(component.findComponent(EnvironmentRow).exists()).toBe(true);
- });
-});
diff --git a/spec/frontend/serverless/components/missing_prometheus_spec.js b/spec/frontend/serverless/components/missing_prometheus_spec.js
deleted file mode 100644
index 1b93fd784e1..00000000000
--- a/spec/frontend/serverless/components/missing_prometheus_spec.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import { GlButton } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import missingPrometheusComponent from '~/serverless/components/missing_prometheus.vue';
-import { createStore } from '~/serverless/store';
-
-describe('missingPrometheusComponent', () => {
- let wrapper;
-
- const createComponent = (missingData) => {
- const store = createStore({ clustersPath: '/clusters', helpPath: '/help' });
-
- wrapper = shallowMount(missingPrometheusComponent, { store, propsData: { missingData } });
- };
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('should render missing prometheus message', () => {
- createComponent(false);
- const { vm } = wrapper;
-
- expect(vm.$el.querySelector('.state-description').innerHTML.trim()).toContain(
- 'Function invocation metrics require the Prometheus cluster integration.',
- );
-
- expect(wrapper.find(GlButton).attributes('variant')).toBe('success');
- });
-
- it('should render no prometheus data message', () => {
- createComponent(true);
- const { vm } = wrapper;
-
- expect(vm.$el.querySelector('.state-description').innerHTML.trim()).toContain(
- 'Invocation metrics loading or not available at this time.',
- );
- });
-});
diff --git a/spec/frontend/serverless/components/pod_box_spec.js b/spec/frontend/serverless/components/pod_box_spec.js
deleted file mode 100644
index cf0c14a2cac..00000000000
--- a/spec/frontend/serverless/components/pod_box_spec.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import podBoxComponent from '~/serverless/components/pod_box.vue';
-
-const createComponent = (count) =>
- shallowMount(podBoxComponent, {
- propsData: {
- count,
- },
- }).vm;
-
-describe('podBoxComponent', () => {
- it('should render three boxes', () => {
- const count = 3;
- const vm = createComponent(count);
- const rects = vm.$el.querySelectorAll('rect');
-
- expect(rects.length).toEqual(3);
- expect(parseInt(rects[2].getAttribute('x'), 10)).toEqual(40);
-
- vm.$destroy();
- });
-});
diff --git a/spec/frontend/serverless/components/url_spec.js b/spec/frontend/serverless/components/url_spec.js
deleted file mode 100644
index 8c839577aa0..00000000000
--- a/spec/frontend/serverless/components/url_spec.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import urlComponent from '~/serverless/components/url.vue';
-import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
-
-const createComponent = (uri) =>
- shallowMount(Vue.extend(urlComponent), {
- propsData: {
- uri,
- },
- });
-
-describe('urlComponent', () => {
- it('should render correctly', () => {
- const uri = 'http://testfunc.apps.example.com';
- const wrapper = createComponent(uri);
- const { vm } = wrapper;
-
- expect(vm.$el.classList.contains('clipboard-group')).toBe(true);
- expect(wrapper.find(ClipboardButton).attributes('text')).toEqual(uri);
-
- expect(vm.$el.querySelector('[data-testid="url-text-field"]').innerHTML).toContain(uri);
-
- vm.$destroy();
- });
-});
diff --git a/spec/frontend/serverless/mock_data.js b/spec/frontend/serverless/mock_data.js
deleted file mode 100644
index 1816ad62a04..00000000000
--- a/spec/frontend/serverless/mock_data.js
+++ /dev/null
@@ -1,145 +0,0 @@
-export const mockServerlessFunctions = {
- knative_installed: true,
- functions: [
- {
- name: 'testfunc1',
- namespace: 'tm-example',
- environment_scope: '*',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc1',
- podcount: null,
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc1.tm-example.apps.example.com',
- description: 'A test service',
- image: 'knative-test-container-buildtemplate',
- },
- {
- name: 'testfunc2',
- namespace: 'tm-example',
- environment_scope: '*',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc2',
- podcount: null,
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc2.tm-example.apps.example.com',
- description: 'A second test service\nThis one with additional descriptions',
- image: 'knative-test-echo-buildtemplate',
- },
- ],
-};
-
-export const mockServerlessFunctionsDiffEnv = {
- knative_installed: true,
- functions: [
- {
- name: 'testfunc1',
- namespace: 'tm-example',
- environment_scope: '*',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc1',
- podcount: null,
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc1.tm-example.apps.example.com',
- description: 'A test service',
- image: 'knative-test-container-buildtemplate',
- },
- {
- name: 'testfunc2',
- namespace: 'tm-example',
- environment_scope: 'test',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc2',
- podcount: null,
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc2.tm-example.apps.example.com',
- description: 'A second test service\nThis one with additional descriptions',
- image: 'knative-test-echo-buildtemplate',
- },
- ],
-};
-
-export const mockServerlessFunction = {
- name: 'testfunc1',
- namespace: 'tm-example',
- environment_scope: '*',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc1',
- podcount: '3',
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc1.tm-example.apps.example.com',
- description: 'A test service',
- image: 'knative-test-container-buildtemplate',
-};
-
-export const mockMultilineServerlessFunction = {
- name: 'testfunc1',
- namespace: 'tm-example',
- environment_scope: '*',
- cluster_id: 46,
- detail_url: '/testuser/testproj/serverless/functions/*/testfunc1',
- podcount: '3',
- created_at: '2019-02-05T01:01:23Z',
- url: 'http://testfunc1.tm-example.apps.example.com',
- description: 'testfunc1\nA test service line\\nWith additional services',
- image: 'knative-test-container-buildtemplate',
-};
-
-export const mockMetrics = {
- success: true,
- last_update: '2019-02-28T19:11:38.926Z',
- metrics: {
- id: 22,
- title: 'Knative function invocations',
- required_metrics: ['container_memory_usage_bytes', 'container_cpu_usage_seconds_total'],
- weight: 0,
- y_label: 'Invocations',
- queries: [
- {
- query_range:
- 'floor(sum(rate(istio_revision_request_count{destination_configuration="%{function_name}", destination_namespace="%{kube_namespace}"}[1m])*30))',
- unit: 'requests',
- label: 'invocations / minute',
- result: [
- {
- metric: {},
- values: [
- [1551352298.756, '0'],
- [1551352358.756, '0'],
- ],
- },
- ],
- },
- ],
- },
-};
-
-export const mockNormalizedMetrics = {
- id: 22,
- title: 'Knative function invocations',
- required_metrics: ['container_memory_usage_bytes', 'container_cpu_usage_seconds_total'],
- weight: 0,
- y_label: 'Invocations',
- queries: [
- {
- query_range:
- 'floor(sum(rate(istio_revision_request_count{destination_configuration="%{function_name}", destination_namespace="%{kube_namespace}"}[1m])*30))',
- unit: 'requests',
- label: 'invocations / minute',
- result: [
- {
- metric: {},
- values: [
- {
- time: '2019-02-28T11:11:38.756Z',
- value: 0,
- },
- {
- time: '2019-02-28T11:12:38.756Z',
- value: 0,
- },
- ],
- },
- ],
- },
- ],
-};
diff --git a/spec/frontend/serverless/store/actions_spec.js b/spec/frontend/serverless/store/actions_spec.js
deleted file mode 100644
index 5fbecf081a6..00000000000
--- a/spec/frontend/serverless/store/actions_spec.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import MockAdapter from 'axios-mock-adapter';
-import testAction from 'helpers/vuex_action_helper';
-import axios from '~/lib/utils/axios_utils';
-import statusCodes from '~/lib/utils/http_status';
-import { fetchFunctions, fetchMetrics } from '~/serverless/store/actions';
-import { mockServerlessFunctions, mockMetrics } from '../mock_data';
-import { adjustMetricQuery } from '../utils';
-
-describe('ServerlessActions', () => {
- let mock;
-
- beforeEach(() => {
- mock = new MockAdapter(axios);
- });
-
- afterEach(() => {
- mock.restore();
- });
-
- describe('fetchFunctions', () => {
- it('should successfully fetch functions', () => {
- const endpoint = '/functions';
- mock.onGet(endpoint).reply(statusCodes.OK, JSON.stringify(mockServerlessFunctions));
-
- return testAction(
- fetchFunctions,
- { functionsPath: endpoint },
- {},
- [],
- [
- { type: 'requestFunctionsLoading' },
- { type: 'receiveFunctionsSuccess', payload: mockServerlessFunctions },
- ],
- );
- });
-
- it('should successfully retry', () => {
- const endpoint = '/functions';
- mock
- .onGet(endpoint)
- .reply(() => new Promise((resolve) => setTimeout(() => resolve(200), Infinity)));
-
- return testAction(
- fetchFunctions,
- { functionsPath: endpoint },
- {},
- [],
- [{ type: 'requestFunctionsLoading' }],
- );
- });
- });
-
- describe('fetchMetrics', () => {
- it('should return no prometheus', () => {
- const endpoint = '/metrics';
- mock.onGet(endpoint).reply(statusCodes.NO_CONTENT);
-
- return testAction(
- fetchMetrics,
- { metricsPath: endpoint, hasPrometheus: false },
- {},
- [],
- [{ type: 'receiveMetricsNoPrometheus' }],
- );
- });
-
- it('should successfully fetch metrics', () => {
- const endpoint = '/metrics';
- mock.onGet(endpoint).reply(statusCodes.OK, JSON.stringify(mockMetrics));
-
- return testAction(
- fetchMetrics,
- { metricsPath: endpoint, hasPrometheus: true },
- {},
- [],
- [{ type: 'receiveMetricsSuccess', payload: adjustMetricQuery(mockMetrics) }],
- );
- });
- });
-});
diff --git a/spec/frontend/serverless/store/getters_spec.js b/spec/frontend/serverless/store/getters_spec.js
deleted file mode 100644
index e1942bd2759..00000000000
--- a/spec/frontend/serverless/store/getters_spec.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import * as getters from '~/serverless/store/getters';
-import serverlessState from '~/serverless/store/state';
-import { mockServerlessFunctions } from '../mock_data';
-
-describe('Serverless Store Getters', () => {
- let state;
-
- beforeEach(() => {
- state = serverlessState;
- });
-
- describe('hasPrometheusMissingData', () => {
- it('should return false if Prometheus is not installed', () => {
- state.hasPrometheus = false;
-
- expect(getters.hasPrometheusMissingData(state)).toEqual(false);
- });
-
- it('should return false if Prometheus is installed and there is data', () => {
- state.hasPrometheusData = true;
-
- expect(getters.hasPrometheusMissingData(state)).toEqual(false);
- });
-
- it('should return true if Prometheus is installed and there is no data', () => {
- state.hasPrometheus = true;
- state.hasPrometheusData = false;
-
- expect(getters.hasPrometheusMissingData(state)).toEqual(true);
- });
- });
-
- describe('getFunctions', () => {
- it('should translate the raw function array to group the functions per environment scope', () => {
- state.functions = mockServerlessFunctions.functions;
-
- const funcs = getters.getFunctions(state);
-
- expect(Object.keys(funcs)).toContain('*');
- expect(funcs['*'].length).toEqual(2);
- });
- });
-});
diff --git a/spec/frontend/serverless/store/mutations_spec.js b/spec/frontend/serverless/store/mutations_spec.js
deleted file mode 100644
index a1a8f9a2ca7..00000000000
--- a/spec/frontend/serverless/store/mutations_spec.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import * as types from '~/serverless/store/mutation_types';
-import mutations from '~/serverless/store/mutations';
-import { mockServerlessFunctions, mockMetrics } from '../mock_data';
-
-describe('ServerlessMutations', () => {
- describe('Functions List Mutations', () => {
- it('should ensure loading is true', () => {
- const state = {};
-
- mutations[types.REQUEST_FUNCTIONS_LOADING](state);
-
- expect(state.isLoading).toEqual(true);
- });
-
- it('should set proper state once functions are loaded', () => {
- const state = {};
-
- mutations[types.RECEIVE_FUNCTIONS_SUCCESS](state, mockServerlessFunctions);
-
- expect(state.isLoading).toEqual(false);
- expect(state.hasFunctionData).toEqual(true);
- expect(state.functions).toEqual(mockServerlessFunctions.functions);
- });
-
- it('should ensure loading has stopped and hasFunctionData is false when there are no functions available', () => {
- const state = {};
-
- mutations[types.RECEIVE_FUNCTIONS_NODATA_SUCCESS](state, { knative_installed: true });
-
- expect(state.isLoading).toEqual(false);
- expect(state.hasFunctionData).toEqual(false);
- expect(state.functions).toBe(undefined);
- });
-
- it('should ensure loading has stopped, and an error is raised', () => {
- const state = {};
-
- mutations[types.RECEIVE_FUNCTIONS_ERROR](state, 'sample error');
-
- expect(state.isLoading).toEqual(false);
- expect(state.hasFunctionData).toEqual(false);
- expect(state.functions).toBe(undefined);
- expect(state.error).not.toBe(undefined);
- });
- });
-
- describe('Function Details Metrics Mutations', () => {
- it('should ensure isLoading and hasPrometheus data flags indicate data is loaded', () => {
- const state = {};
-
- mutations[types.RECEIVE_METRICS_SUCCESS](state, mockMetrics);
-
- expect(state.isLoading).toEqual(false);
- expect(state.hasPrometheusData).toEqual(true);
- expect(state.graphData).toEqual(mockMetrics);
- });
-
- it('should ensure isLoading and hasPrometheus data flags are cleared indicating no functions available', () => {
- const state = {};
-
- mutations[types.RECEIVE_METRICS_NODATA_SUCCESS](state);
-
- expect(state.isLoading).toEqual(false);
- expect(state.hasPrometheusData).toEqual(false);
- expect(state.graphData).toBe(undefined);
- });
-
- it('should properly indicate an error', () => {
- const state = {};
-
- mutations[types.RECEIVE_METRICS_ERROR](state, 'sample error');
-
- expect(state.hasPrometheusData).toEqual(false);
- expect(state.error).not.toBe(undefined);
- });
-
- it('should properly indicate when prometheus is installed', () => {
- const state = {};
-
- mutations[types.RECEIVE_METRICS_NO_PROMETHEUS](state);
-
- expect(state.hasPrometheus).toEqual(false);
- expect(state.hasPrometheusData).toEqual(false);
- });
- });
-});
diff --git a/spec/frontend/serverless/utils.js b/spec/frontend/serverless/utils.js
deleted file mode 100644
index 7caf7da231e..00000000000
--- a/spec/frontend/serverless/utils.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export const adjustMetricQuery = (data) => {
- const updatedMetric = data.metrics;
-
- const queries = data.metrics.queries.map((query) => ({
- ...query,
- result: query.result.map((result) => ({
- ...result,
- values: result.values.map(([timestamp, value]) => ({
- time: new Date(timestamp * 1000).toISOString(),
- value: Number(value),
- })),
- })),
- }));
-
- updatedMetric.queries = queries;
- return updatedMetric;
-};
diff --git a/spec/frontend/settings_panels_spec.js b/spec/frontend/settings_panels_spec.js
index 3a62cd703ab..d59e1a20b27 100644
--- a/spec/frontend/settings_panels_spec.js
+++ b/spec/frontend/settings_panels_spec.js
@@ -1,9 +1,14 @@
import $ from 'jquery';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import initSettingsPanels, { isExpanded } from '~/settings_panels';
describe('Settings Panels', () => {
beforeEach(() => {
- loadFixtures('groups/edit.html');
+ loadHTMLFixture('groups/edit.html');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
describe('initSettingsPane', () => {
diff --git a/spec/frontend/shortcuts_spec.js b/spec/frontend/shortcuts_spec.js
index 8b9a11056f2..e859d435f48 100644
--- a/spec/frontend/shortcuts_spec.js
+++ b/spec/frontend/shortcuts_spec.js
@@ -1,5 +1,6 @@
import $ from 'jquery';
import { flatten } from 'lodash';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import Shortcuts from '~/behaviors/shortcuts/shortcuts';
const mockMousetrap = {
@@ -21,7 +22,7 @@ describe('Shortcuts', () => {
});
beforeEach(() => {
- loadFixtures(fixtureName);
+ loadHTMLFixture(fixtureName);
jest.spyOn(document.querySelector('.js-new-note-form .js-md-preview-button'), 'focus');
jest.spyOn(document.querySelector('.edit-note .js-md-preview-button'), 'focus');
@@ -30,6 +31,10 @@ describe('Shortcuts', () => {
new Shortcuts(); // eslint-disable-line no-new
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
describe('toggleMarkdownPreview', () => {
it('focuses preview button in form', () => {
Shortcuts.toggleMarkdownPreview(
diff --git a/spec/frontend/sidebar/components/assignees/uncollapsed_assignee_list_spec.js b/spec/frontend/sidebar/components/assignees/uncollapsed_assignee_list_spec.js
index 90aae85e1ca..f7437386814 100644
--- a/spec/frontend/sidebar/components/assignees/uncollapsed_assignee_list_spec.js
+++ b/spec/frontend/sidebar/components/assignees/uncollapsed_assignee_list_spec.js
@@ -47,12 +47,10 @@ describe('UncollapsedAssigneeList component', () => {
it('calls the AssigneeAvatarLink with the proper props', () => {
expect(wrapper.find(AssigneeAvatarLink).exists()).toBe(true);
- expect(wrapper.find(AssigneeAvatarLink).props().tooltipPlacement).toEqual('left');
});
it('Shows one user with avatar, username and author name', () => {
expect(wrapper.text()).toContain(user.name);
- expect(wrapper.text()).toContain(`@${user.username}`);
});
});
diff --git a/spec/frontend/sidebar/components/attention_requested_toggle_spec.js b/spec/frontend/sidebar/components/attention_requested_toggle_spec.js
index a9ae23c1624..959fa799eb7 100644
--- a/spec/frontend/sidebar/components/attention_requested_toggle_spec.js
+++ b/spec/frontend/sidebar/components/attention_requested_toggle_spec.js
@@ -68,6 +68,7 @@ describe('Attention require toggle', () => {
{
user: { attention_requested: true, can_update_merge_request: true },
callback: expect.anything(),
+ direction: 'remove',
},
]);
});
@@ -96,9 +97,9 @@ describe('Attention require toggle', () => {
it.each`
type | attentionRequested | tooltip | canUpdateMergeRequest
- ${'reviewer'} | ${true} | ${AttentionRequestedToggle.i18n.removeAttentionRequested} | ${true}
- ${'reviewer'} | ${false} | ${AttentionRequestedToggle.i18n.attentionRequestedReviewer} | ${true}
- ${'assignee'} | ${false} | ${AttentionRequestedToggle.i18n.attentionRequestedAssignee} | ${true}
+ ${'reviewer'} | ${true} | ${AttentionRequestedToggle.i18n.removeAttentionRequest} | ${true}
+ ${'reviewer'} | ${false} | ${AttentionRequestedToggle.i18n.addAttentionRequest} | ${true}
+ ${'assignee'} | ${false} | ${AttentionRequestedToggle.i18n.addAttentionRequest} | ${true}
${'reviewer'} | ${true} | ${AttentionRequestedToggle.i18n.attentionRequestedNoPermission} | ${false}
${'reviewer'} | ${false} | ${AttentionRequestedToggle.i18n.noAttentionRequestedNoPermission} | ${false}
${'assignee'} | ${true} | ${AttentionRequestedToggle.i18n.attentionRequestedNoPermission} | ${false}
diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js
index 8844e1626cd..ab45fdf03bc 100644
--- a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js
+++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_content_spec.js
@@ -1,4 +1,4 @@
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlAlert } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import SidebarConfidentialityContent from '~/sidebar/components/confidential/sidebar_confidentiality_content.vue';
@@ -60,12 +60,24 @@ describe('Sidebar Confidentiality Content', () => {
it('displays a correct confidential text for issue', () => {
createComponent({ confidential: true });
- expect(findText().text()).toBe('This issue is confidential');
+
+ const alertEl = findText().findComponent(GlAlert);
+
+ expect(alertEl.props()).toMatchObject({
+ showIcon: false,
+ dismissible: false,
+ variant: 'warning',
+ });
+ expect(alertEl.text()).toBe(
+ 'Only project members with at least Reporter role can view or be notified about this issue.',
+ );
});
it('displays a correct confidential text for epic', () => {
createComponent({ confidential: true, issuableType: 'epic' });
- expect(findText().text()).toBe('This epic is confidential');
+ expect(findText().findComponent(GlAlert).text()).toBe(
+ 'Only group members with at least Reporter role can view or be notified about this epic.',
+ );
});
});
});
diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js
index 28a19fb9df6..85d6bc7b782 100644
--- a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js
+++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js
@@ -89,7 +89,7 @@ describe('Sidebar Confidentiality Form', () => {
it('renders a message about making an issue confidential', () => {
expect(findWarningMessage().text()).toBe(
- 'You are going to turn on confidentiality. Only team members with at least Reporter access will be able to see and leave comments on the issue.',
+ 'You are going to turn on confidentiality. Only project members with at least Reporter role can view or be notified about this issue.',
);
});
diff --git a/spec/frontend/sidebar/components/crm_contacts_spec.js b/spec/frontend/sidebar/components/crm_contacts_spec.js
index 758cff30e2d..6456829258f 100644
--- a/spec/frontend/sidebar/components/crm_contacts_spec.js
+++ b/spec/frontend/sidebar/components/crm_contacts_spec.js
@@ -33,7 +33,7 @@ describe('Issue crm contacts component', () => {
[issueCrmContactsSubscription, subscriptionHandler],
]);
wrapper = shallowMountExtended(CrmContacts, {
- propsData: { issueId: '123' },
+ propsData: { issueId: '123', groupIssuesPath: '/groups/flightjs/-/issues' },
apolloProvider: fakeApollo,
});
};
@@ -71,8 +71,14 @@ describe('Issue crm contacts component', () => {
await waitForPromises();
expect(wrapper.find('#contact_0').text()).toContain('Someone Important');
+ expect(wrapper.find('#contact_0').attributes('href')).toBe(
+ '/groups/flightjs/-/issues?crm_contact_id=1',
+ );
expect(wrapper.find('#contact_container_0').text()).toContain('si@gitlab.com');
expect(wrapper.find('#contact_1').text()).toContain('Marty McFly');
+ expect(wrapper.find('#contact_1').attributes('href')).toBe(
+ '/groups/flightjs/-/issues?crm_contact_id=5',
+ );
});
it('renders correct results after subscription update', async () => {
@@ -83,5 +89,8 @@ describe('Issue crm contacts component', () => {
contact.forEach((property) => {
expect(wrapper.find('#contact_container_0').text()).toContain(property);
});
+ expect(wrapper.find('#contact_0').attributes('href')).toBe(
+ '/groups/flightjs/-/issues?crm_contact_id=13',
+ );
});
});
diff --git a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
index d0792fa7b73..8999f120a0f 100644
--- a/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
+++ b/spec/frontend/sidebar/components/reviewers/uncollapsed_reviewer_list_spec.js
@@ -42,9 +42,8 @@ describe('UncollapsedReviewerList component', () => {
expect(wrapper.findAll(ReviewerAvatarLink).length).toBe(1);
});
- it('shows one user with avatar, username and author name', () => {
+ it('shows one user with avatar, and author name', () => {
expect(wrapper.text()).toContain(user.name);
- expect(wrapper.text()).toContain(`@root`);
});
it('renders re-request loading icon', async () => {
@@ -84,11 +83,9 @@ describe('UncollapsedReviewerList component', () => {
expect(wrapper.findAll(ReviewerAvatarLink).length).toBe(2);
});
- it('shows both users with avatar, username and author name', () => {
+ it('shows both users with avatar, and author name', () => {
expect(wrapper.text()).toContain(user.name);
- expect(wrapper.text()).toContain(`@root`);
expect(wrapper.text()).toContain(user2.name);
- expect(wrapper.text()).toContain(`@hello-world`);
});
it('renders approval icon', () => {
diff --git a/spec/frontend/sidebar/components/time_tracking/mock_data.js b/spec/frontend/sidebar/components/time_tracking/mock_data.js
index 3f1b3fa8ec1..ba2781118d9 100644
--- a/spec/frontend/sidebar/components/time_tracking/mock_data.js
+++ b/spec/frontend/sidebar/components/time_tracking/mock_data.js
@@ -9,6 +9,7 @@ export const getIssueTimelogsQueryResponse = {
nodes: [
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/18',
timeSpent: 14400,
user: {
id: 'user-1',
@@ -25,6 +26,7 @@ export const getIssueTimelogsQueryResponse = {
},
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/20',
timeSpent: 1800,
user: {
id: 'user-2',
@@ -37,6 +39,7 @@ export const getIssueTimelogsQueryResponse = {
},
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/25',
timeSpent: 14400,
user: {
id: 'user-2',
@@ -68,6 +71,7 @@ export const getMrTimelogsQueryResponse = {
nodes: [
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/13',
timeSpent: 1800,
user: {
id: 'user-1',
@@ -84,6 +88,7 @@ export const getMrTimelogsQueryResponse = {
},
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/22',
timeSpent: 3600,
user: {
id: 'user-1',
@@ -96,6 +101,7 @@ export const getMrTimelogsQueryResponse = {
},
{
__typename: 'Timelog',
+ id: 'gid://gitlab/Timelog/64',
timeSpent: 300,
user: {
id: 'user-1',
diff --git a/spec/frontend/sidebar/lock/issuable_lock_form_spec.js b/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
index 7bf7e563a01..8478d3d674d 100644
--- a/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
+++ b/spec/frontend/sidebar/lock/issuable_lock_form_spec.js
@@ -37,6 +37,9 @@ describe('IssuableLockForm', () => {
const createComponent = ({ props = {} }) => {
wrapper = shallowMount(IssuableLockForm, {
store,
+ provide: {
+ fullPath: '',
+ },
propsData: {
isEditable: true,
...props,
diff --git a/spec/frontend/sidebar/reviewers_spec.js b/spec/frontend/sidebar/reviewers_spec.js
index fc24b51287f..351dfc9a6ed 100644
--- a/spec/frontend/sidebar/reviewers_spec.js
+++ b/spec/frontend/sidebar/reviewers_spec.js
@@ -146,7 +146,6 @@ describe('Reviewer component', () => {
const userItems = wrapper.findAll('[data-testid="reviewer"]');
expect(userItems.length).toBe(3);
- expect(userItems.at(0).find('a').attributes('title')).toBe(users[2].name);
});
it('passes the sorted reviewers to the collapsed-reviewer-list', () => {
diff --git a/spec/frontend/sidebar/sidebar_mediator_spec.js b/spec/frontend/sidebar/sidebar_mediator_spec.js
index c472a98bf0b..82fb10ab1d2 100644
--- a/spec/frontend/sidebar/sidebar_mediator_spec.js
+++ b/spec/frontend/sidebar/sidebar_mediator_spec.js
@@ -1,4 +1,5 @@
import MockAdapter from 'axios-mock-adapter';
+import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import * as urlUtility from '~/lib/utils/url_utility';
import SidebarService, { gqClient } from '~/sidebar/services/sidebar_service';
@@ -8,6 +9,7 @@ import toast from '~/vue_shared/plugins/global_toast';
import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests';
import Mock from './mock_data';
+jest.mock('~/flash');
jest.mock('~/vue_shared/plugins/global_toast');
jest.mock('~/commons/nav/user_merge_requests');
@@ -122,25 +124,39 @@ describe('Sidebar mediator', () => {
});
describe('toggleAttentionRequested', () => {
- let attentionRequiredService;
+ let requestAttentionMock;
+ let removeAttentionRequestMock;
beforeEach(() => {
- attentionRequiredService = jest
- .spyOn(mediator.service, 'toggleAttentionRequested')
+ requestAttentionMock = jest.spyOn(mediator.service, 'requestAttention').mockResolvedValue();
+ removeAttentionRequestMock = jest
+ .spyOn(mediator.service, 'removeAttentionRequest')
.mockResolvedValue();
});
- it('calls attentionRequired service method', async () => {
- mediator.store.reviewers = [{ id: 1, attention_requested: false, username: 'root' }];
+ it.each`
+ attentionIsCurrentlyRequested | serviceMethod
+ ${true} | ${'remove'}
+ ${false} | ${'add'}
+ `(
+ "calls the $serviceMethod service method when the user's attention request is set to $attentionIsCurrentlyRequested",
+ async ({ serviceMethod }) => {
+ const methods = {
+ add: requestAttentionMock,
+ remove: removeAttentionRequestMock,
+ };
+ mediator.store.reviewers = [{ id: 1, attention_requested: false, username: 'root' }];
- await mediator.toggleAttentionRequested('reviewer', {
- user: { id: 1, username: 'root' },
- callback: jest.fn(),
- });
+ await mediator.toggleAttentionRequested('reviewer', {
+ user: { id: 1, username: 'root' },
+ callback: jest.fn(),
+ direction: serviceMethod,
+ });
- expect(attentionRequiredService).toHaveBeenCalledWith(1);
- expect(refreshUserMergeRequestCounts).toHaveBeenCalled();
- });
+ expect(methods[serviceMethod]).toHaveBeenCalledWith(1);
+ expect(refreshUserMergeRequestCounts).toHaveBeenCalled();
+ },
+ );
it.each`
type | method
@@ -172,5 +188,27 @@ describe('Sidebar mediator', () => {
expect(toast).toHaveBeenCalledWith(toastMessage);
},
);
+
+ describe('errors', () => {
+ beforeEach(() => {
+ jest
+ .spyOn(mediator.service, 'removeAttentionRequest')
+ .mockRejectedValueOnce(new Error('Something went wrong'));
+ });
+
+ it('shows an error message', async () => {
+ await mediator.toggleAttentionRequested('reviewer', {
+ user: { id: 1, username: 'root' },
+ callback: jest.fn(),
+ direction: 'remove',
+ });
+
+ expect(createFlash).toHaveBeenCalledWith(
+ expect.objectContaining({
+ message: 'Updating the attention request for root failed.',
+ }),
+ );
+ });
+ });
});
});
diff --git a/spec/frontend/single_file_diff_spec.js b/spec/frontend/single_file_diff_spec.js
index 8718152655f..6f42ec47458 100644
--- a/spec/frontend/single_file_diff_spec.js
+++ b/spec/frontend/single_file_diff_spec.js
@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import axios from '~/lib/utils/axios_utils';
import SingleFileDiff from '~/single_file_diff';
@@ -15,6 +15,7 @@ describe('SingleFileDiff', () => {
afterEach(() => {
mock.restore();
+ resetHTMLFixture();
});
it('loads diff via axios exactly once for collapsed diffs', async () => {
diff --git a/spec/frontend/smart_interval_spec.js b/spec/frontend/smart_interval_spec.js
index 1a2fd7ff8f1..5dda097ae6a 100644
--- a/spec/frontend/smart_interval_spec.js
+++ b/spec/frontend/smart_interval_spec.js
@@ -1,5 +1,6 @@
import $ from 'jquery';
import { assignIn } from 'lodash';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import waitForPromises from 'helpers/wait_for_promises';
import SmartInterval from '~/smart_interval';
@@ -116,11 +117,15 @@ describe('SmartInterval', () => {
describe('DOM Events', () => {
beforeEach(() => {
// This ensures DOM and DOM events are initialized for these specs.
- setFixtures('<div></div>');
+ setHTMLFixture('<div></div>');
interval = createDefaultSmartInterval();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should pause when page is not visible', () => {
jest.runOnlyPendingTimers();
diff --git a/spec/frontend/snippet/collapsible_input_spec.js b/spec/frontend/snippet/collapsible_input_spec.js
index 3f14a9cd1a1..56e64d136c2 100644
--- a/spec/frontend/snippet/collapsible_input_spec.js
+++ b/spec/frontend/snippet/collapsible_input_spec.js
@@ -1,4 +1,4 @@
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import setupCollapsibleInputs from '~/snippet/collapsible_input';
describe('~/snippet/collapsible_input', () => {
@@ -38,6 +38,10 @@ describe('~/snippet/collapsible_input', () => {
setupCollapsibleInputs();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const findInput = (el) => el.querySelector('textarea,input');
const findCollapsed = (el) => el.querySelector('.js-collapsed');
const findExpanded = (el) => el.querySelector('.js-expanded');
diff --git a/spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap b/spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap
index 2b26c306c68..fec300ddd7e 100644
--- a/spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap
+++ b/spec/frontend/snippets/components/__snapshots__/snippet_description_edit_spec.js.snap
@@ -28,9 +28,9 @@ exports[`Snippet Description Edit component rendering matches the snapshot 1`] =
data-uploads-path=""
>
<markdown-header-stub
- data-testid="markdownHeader"
enablepreview="true"
linecontent=""
+ restrictedtoolbaritems=""
suggestionstartindex="0"
/>
@@ -81,6 +81,7 @@ exports[`Snippet Description Edit component rendering matches the snapshot 1`] =
canattachfile="true"
markdowndocspath="help/"
quickactionsdocspath=""
+ showcommenttoolbar="true"
/>
</div>
</div>
diff --git a/spec/frontend/snippets/components/edit_spec.js b/spec/frontend/snippets/components/edit_spec.js
index 9cfe136129a..8a767765149 100644
--- a/spec/frontend/snippets/components/edit_spec.js
+++ b/spec/frontend/snippets/components/edit_spec.js
@@ -1,5 +1,4 @@
-import { GlLoadingIcon } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
+import { GlFormGroup, GlLoadingIcon } from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import { merge } from 'lodash';
@@ -7,6 +6,7 @@ import VueApollo, { ApolloMutation } from 'vue-apollo';
import { useFakeDate } from 'helpers/fake_date';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import GetSnippetQuery from 'shared_queries/snippet/snippet.query.graphql';
import createFlash from '~/flash';
import * as urlUtils from '~/lib/utils/url_utility';
@@ -22,7 +22,6 @@ import {
import CreateSnippetMutation from '~/snippets/mutations/create_snippet.mutation.graphql';
import UpdateSnippetMutation from '~/snippets/mutations/update_snippet.mutation.graphql';
import FormFooterActions from '~/vue_shared/components/form/form_footer_actions.vue';
-import TitleField from '~/vue_shared/components/form/title.vue';
import { testEntries, createGQLSnippetsQueryResponse, createGQLSnippet } from '../test_utils';
jest.mock('~/flash');
@@ -112,19 +111,19 @@ describe('Snippet Edit app', () => {
gon.relative_url_root = originalRelativeUrlRoot;
});
- const findBlobActions = () => wrapper.find(SnippetBlobActionsEdit);
- const findSubmitButton = () => wrapper.find('[data-testid="snippet-submit-btn"]');
- const findCancelButton = () => wrapper.find('[data-testid="snippet-cancel-btn"]');
- const hasDisabledSubmit = () => Boolean(findSubmitButton().attributes('disabled'));
- const clickSubmitBtn = () => wrapper.find('[data-testid="snippet-edit-form"]').trigger('submit');
+ const findBlobActions = () => wrapper.findComponent(SnippetBlobActionsEdit);
+ const findCancelButton = () => wrapper.findByTestId('snippet-cancel-btn');
+ const clickSubmitBtn = () => wrapper.findByTestId('snippet-edit-form').trigger('submit');
+
const triggerBlobActions = (actions) => findBlobActions().vm.$emit('actions', actions);
const setUploadFilesHtml = (paths) => {
wrapper.vm.$el.innerHTML = paths
.map((path) => `<input name="files[]" value="${path}">`)
.join('');
};
- const setTitle = (val) => wrapper.find(TitleField).vm.$emit('input', val);
- const setDescription = (val) => wrapper.find(SnippetDescriptionEdit).vm.$emit('input', val);
+ const setTitle = (val) => wrapper.findByTestId('snippet-title-input').vm.$emit('input', val);
+ const setDescription = (val) =>
+ wrapper.findComponent(SnippetDescriptionEdit).vm.$emit('input', val);
const createComponent = ({ props = {}, selectedLevel = SNIPPET_VISIBILITY_PRIVATE } = {}) => {
if (wrapper) {
@@ -139,7 +138,7 @@ describe('Snippet Edit app', () => {
];
const apolloProvider = createMockApollo(requestHandlers);
- wrapper = shallowMount(SnippetEditApp, {
+ wrapper = shallowMountExtended(SnippetEditApp, {
apolloProvider,
stubs: {
ApolloMutation,
@@ -177,7 +176,7 @@ describe('Snippet Edit app', () => {
it('renders loader', () => {
createComponent();
- expect(wrapper.find(GlLoadingIcon).exists()).toBe(true);
+ expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true);
});
});
@@ -193,10 +192,10 @@ describe('Snippet Edit app', () => {
});
it('should render components', () => {
- expect(wrapper.find(TitleField).exists()).toBe(true);
- expect(wrapper.find(SnippetDescriptionEdit).exists()).toBe(true);
- expect(wrapper.find(SnippetVisibilityEdit).exists()).toBe(true);
- expect(wrapper.find(FormFooterActions).exists()).toBe(true);
+ expect(wrapper.findComponent(GlFormGroup).attributes('label')).toEqual('Title');
+ expect(wrapper.findComponent(SnippetDescriptionEdit).exists()).toBe(true);
+ expect(wrapper.findComponent(SnippetVisibilityEdit).exists()).toBe(true);
+ expect(wrapper.findComponent(FormFooterActions).exists()).toBe(true);
expect(findBlobActions().exists()).toBe(true);
});
@@ -207,25 +206,34 @@ describe('Snippet Edit app', () => {
describe('default', () => {
it.each`
- title | actions | shouldDisable
- ${''} | ${[]} | ${true}
- ${''} | ${[TEST_ACTIONS.VALID]} | ${true}
- ${'foo'} | ${[]} | ${false}
- ${'foo'} | ${[TEST_ACTIONS.VALID]} | ${false}
- ${'foo'} | ${[TEST_ACTIONS.VALID, TEST_ACTIONS.NO_CONTENT]} | ${true}
- ${'foo'} | ${[TEST_ACTIONS.VALID, TEST_ACTIONS.NO_PATH]} | ${false}
+ title | actions | titleHasErrors | blobActionsHasErrors
+ ${''} | ${[]} | ${true} | ${false}
+ ${''} | ${[TEST_ACTIONS.VALID]} | ${true} | ${false}
+ ${'foo'} | ${[]} | ${false} | ${false}
+ ${'foo'} | ${[TEST_ACTIONS.VALID]} | ${false} | ${false}
+ ${'foo'} | ${[TEST_ACTIONS.VALID, TEST_ACTIONS.NO_CONTENT]} | ${false} | ${true}
+ ${'foo'} | ${[TEST_ACTIONS.VALID, TEST_ACTIONS.NO_PATH]} | ${false} | ${false}
`(
- 'should handle submit disable (title="$title", actions="$actions", shouldDisable="$shouldDisable")',
- async ({ title, actions, shouldDisable }) => {
+ 'validates correctly (title="$title", actions="$actions", titleHasErrors="$titleHasErrors", blobActionsHasErrors="$blobActionsHasErrors")',
+ async ({ title, actions, titleHasErrors, blobActionsHasErrors }) => {
getSpy.mockResolvedValue(createQueryResponse({ title }));
await createComponentAndLoad();
triggerBlobActions(actions);
+ clickSubmitBtn();
+
await nextTick();
- expect(hasDisabledSubmit()).toBe(shouldDisable);
+ expect(wrapper.findComponent(GlFormGroup).exists()).toBe(true);
+ expect(Boolean(wrapper.findComponent(GlFormGroup).attributes('state'))).toEqual(
+ !titleHasErrors,
+ );
+
+ expect(wrapper.find(SnippetBlobActionsEdit).props('isValid')).toEqual(
+ !blobActionsHasErrors,
+ );
},
);
@@ -262,35 +270,64 @@ describe('Snippet Edit app', () => {
);
describe('form submission handling', () => {
- it.each`
- snippetGid | projectPath | uploadedFiles | input | mutationType
- ${''} | ${'project/path'} | ${[]} | ${{ ...getApiData(), projectPath: 'project/path', uploadedFiles: [] }} | ${'createSnippet'}
- ${''} | ${''} | ${[]} | ${{ ...getApiData(), projectPath: '', uploadedFiles: [] }} | ${'createSnippet'}
- ${''} | ${''} | ${TEST_UPLOADED_FILES} | ${{ ...getApiData(), projectPath: '', uploadedFiles: TEST_UPLOADED_FILES }} | ${'createSnippet'}
- ${TEST_SNIPPET_GID} | ${'project/path'} | ${[]} | ${getApiData(createSnippet())} | ${'updateSnippet'}
- ${TEST_SNIPPET_GID} | ${''} | ${[]} | ${getApiData(createSnippet())} | ${'updateSnippet'}
- `(
- 'should submit mutation $mutationType (snippetGid=$snippetGid, projectPath=$projectPath, uploadedFiles=$uploadedFiles)',
- async ({ snippetGid, projectPath, uploadedFiles, mutationType, input }) => {
- await createComponentAndLoad({
- props: {
- snippetGid,
- projectPath,
- },
- });
-
- setUploadFilesHtml(uploadedFiles);
-
- await nextTick();
-
- clickSubmitBtn();
+ describe('when creating a new snippet', () => {
+ it.each`
+ projectPath | uploadedFiles | input
+ ${''} | ${TEST_UPLOADED_FILES} | ${{ ...getApiData({ title: 'Title' }), projectPath: '', uploadedFiles: TEST_UPLOADED_FILES }}
+ ${'project/path'} | ${TEST_UPLOADED_FILES} | ${{ ...getApiData({ title: 'Title' }), projectPath: 'project/path', uploadedFiles: TEST_UPLOADED_FILES }}
+ `(
+ 'should submit a createSnippet mutation (projectPath=$projectPath, uploadedFiles=$uploadedFiles)',
+ async ({ projectPath, uploadedFiles, input }) => {
+ await createComponentAndLoad({
+ props: {
+ snippetGid: '',
+ projectPath,
+ },
+ });
+
+ setTitle(input.title);
+ setUploadFilesHtml(uploadedFiles);
+
+ await nextTick();
+
+ clickSubmitBtn();
+
+ expect(mutateSpy).toHaveBeenCalledTimes(1);
+ expect(mutateSpy).toHaveBeenCalledWith('createSnippet', {
+ input,
+ });
+ },
+ );
+ });
- expect(mutateSpy).toHaveBeenCalledTimes(1);
- expect(mutateSpy).toHaveBeenCalledWith(mutationType, {
- input,
- });
- },
- );
+ describe('when updating a snippet', () => {
+ it.each`
+ projectPath | uploadedFiles | input
+ ${''} | ${[]} | ${getApiData(createSnippet())}
+ ${'project/path'} | ${[]} | ${getApiData(createSnippet())}
+ `(
+ 'should submit an updateSnippet mutation (projectPath=$projectPath, uploadedFiles=$uploadedFiles)',
+ async ({ projectPath, uploadedFiles, input }) => {
+ await createComponentAndLoad({
+ props: {
+ snippetGid: TEST_SNIPPET_GID,
+ projectPath,
+ },
+ });
+
+ setUploadFilesHtml(uploadedFiles);
+
+ await nextTick();
+
+ clickSubmitBtn();
+
+ expect(mutateSpy).toHaveBeenCalledTimes(1);
+ expect(mutateSpy).toHaveBeenCalledWith('updateSnippet', {
+ input,
+ });
+ },
+ );
+ });
it('should redirect to snippet view on successful mutation', async () => {
await createComponentAndSubmit();
@@ -298,30 +335,55 @@ describe('Snippet Edit app', () => {
expect(urlUtils.redirectTo).toHaveBeenCalledWith(TEST_WEB_URL);
});
- it.each`
- snippetGid | projectPath | mutationRes | expectMessage
- ${''} | ${'project/path'} | ${createMutationResponseWithErrors('createSnippet')} | ${`Can't create snippet: ${TEST_MUTATION_ERROR}`}
- ${''} | ${''} | ${createMutationResponseWithErrors('createSnippet')} | ${`Can't create snippet: ${TEST_MUTATION_ERROR}`}
- ${TEST_SNIPPET_GID} | ${'project/path'} | ${createMutationResponseWithErrors('updateSnippet')} | ${`Can't update snippet: ${TEST_MUTATION_ERROR}`}
- ${TEST_SNIPPET_GID} | ${''} | ${createMutationResponseWithErrors('updateSnippet')} | ${`Can't update snippet: ${TEST_MUTATION_ERROR}`}
- `(
- 'should flash error with (snippet=$snippetGid, projectPath=$projectPath)',
- async ({ snippetGid, projectPath, mutationRes, expectMessage }) => {
- mutateSpy.mockResolvedValue(mutationRes);
-
- await createComponentAndSubmit({
- props: {
- projectPath,
- snippetGid,
- },
+ describe('when there are errors after creating a new snippet', () => {
+ it.each`
+ projectPath
+ ${'project/path'}
+ ${''}
+ `('should flash error (projectPath=$projectPath)', async ({ projectPath }) => {
+ mutateSpy.mockResolvedValue(createMutationResponseWithErrors('createSnippet'));
+
+ await createComponentAndLoad({
+ props: { projectPath, snippetGid: '' },
});
+ setTitle('Title');
+
+ clickSubmitBtn();
+
+ await waitForPromises();
+
expect(urlUtils.redirectTo).not.toHaveBeenCalled();
expect(createFlash).toHaveBeenCalledWith({
- message: expectMessage,
+ message: `Can't create snippet: ${TEST_MUTATION_ERROR}`,
});
- },
- );
+ });
+ });
+
+ describe('when there are errors after updating a snippet', () => {
+ it.each`
+ projectPath
+ ${'project/path'}
+ ${''}
+ `(
+ 'should flash error with (snippet=$snippetGid, projectPath=$projectPath)',
+ async ({ projectPath }) => {
+ mutateSpy.mockResolvedValue(createMutationResponseWithErrors('updateSnippet'));
+
+ await createComponentAndSubmit({
+ props: {
+ projectPath,
+ snippetGid: TEST_SNIPPET_GID,
+ },
+ });
+
+ expect(urlUtils.redirectTo).not.toHaveBeenCalled();
+ expect(createFlash).toHaveBeenCalledWith({
+ message: `Can't update snippet: ${TEST_MUTATION_ERROR}`,
+ });
+ },
+ );
+ });
describe('with apollo network error', () => {
beforeEach(async () => {
@@ -382,6 +444,7 @@ describe('Snippet Edit app', () => {
false,
() => {
triggerBlobActions([testEntries.updated.diff]);
+ setTitle('test');
clickSubmitBtn();
},
],
diff --git a/spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js b/spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js
index 8174ba5c693..df98312b498 100644
--- a/spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js
+++ b/spec/frontend/snippets/components/snippet_blob_actions_edit_spec.js
@@ -1,6 +1,7 @@
-import { shallowMount } from '@vue/test-utils';
import { times } from 'lodash';
import { nextTick } from 'vue';
+import { GlFormGroup } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
import SnippetBlobActionsEdit from '~/snippets/components/snippet_blob_actions_edit.vue';
import SnippetBlobEdit from '~/snippets/components/snippet_blob_edit.vue';
import {
@@ -8,6 +9,7 @@ import {
SNIPPET_BLOB_ACTION_CREATE,
SNIPPET_BLOB_ACTION_MOVE,
} from '~/snippets/constants';
+import { s__ } from '~/locale';
import { testEntries, createBlobFromTestEntry } from '../test_utils';
const TEST_BLOBS = [
@@ -29,7 +31,7 @@ describe('snippets/components/snippet_blob_actions_edit', () => {
});
};
- const findLabel = () => wrapper.find('label');
+ const findLabel = () => wrapper.findComponent(GlFormGroup);
const findBlobEdits = () => wrapper.findAll(SnippetBlobEdit);
const findBlobsData = () =>
findBlobEdits().wrappers.map((x) => ({
@@ -65,7 +67,7 @@ describe('snippets/components/snippet_blob_actions_edit', () => {
});
it('renders label', () => {
- expect(findLabel().text()).toBe('Files');
+ expect(findLabel().attributes('label')).toBe('Files');
});
it(`renders delete button (show=true)`, () => {
@@ -280,4 +282,32 @@ describe('snippets/components/snippet_blob_actions_edit', () => {
expect(findAddButton().props('disabled')).toBe(true);
});
});
+
+ describe('isValid prop', () => {
+ const validationMessage = s__(
+ "Snippets|Snippets can't contain empty files. Ensure all files have content, or delete them.",
+ );
+
+ describe('when not present', () => {
+ it('sets the label validation state to true', () => {
+ createComponent();
+
+ const label = findLabel();
+
+ expect(Boolean(label.attributes('state'))).toEqual(true);
+ expect(label.attributes('invalid-feedback')).toEqual(validationMessage);
+ });
+ });
+
+ describe('when present', () => {
+ it('sets the label validation state to the value', () => {
+ createComponent({ isValid: false });
+
+ const label = findLabel();
+
+ expect(Boolean(label.attributes('state'))).toEqual(false);
+ expect(label.attributes('invalid-feedback')).toEqual(validationMessage);
+ });
+ });
+ });
});
diff --git a/spec/frontend/syntax_highlight_spec.js b/spec/frontend/syntax_highlight_spec.js
index 8ad4f8d5c70..1be6c213350 100644
--- a/spec/frontend/syntax_highlight_spec.js
+++ b/spec/frontend/syntax_highlight_spec.js
@@ -1,6 +1,6 @@
/* eslint-disable no-return-assign */
-
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import syntaxHighlight from '~/syntax_highlight';
describe('Syntax Highlighter', () => {
@@ -20,7 +20,11 @@ describe('Syntax Highlighter', () => {
`('highlight using $desc syntax', ({ fn }) => {
describe('on a js-syntax-highlight element', () => {
beforeEach(() => {
- setFixtures('<div class="js-syntax-highlight"></div>');
+ setHTMLFixture('<div class="js-syntax-highlight"></div>');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
it('applies syntax highlighting', () => {
@@ -33,11 +37,15 @@ describe('Syntax Highlighter', () => {
describe('on a parent element', () => {
beforeEach(() => {
- setFixtures(
+ setHTMLFixture(
'<div class="parent">\n <div class="js-syntax-highlight"></div>\n <div class="foo"></div>\n <div class="js-syntax-highlight"></div>\n</div>',
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('applies highlighting to all applicable children', () => {
stubUserColorScheme('monokai');
syntaxHighlight(fn('.parent'));
@@ -49,7 +57,7 @@ describe('Syntax Highlighter', () => {
});
it('prevents an infinite loop when no matches exist', () => {
- setFixtures('<div></div>');
+ setHTMLFixture('<div></div>');
const highlight = () => syntaxHighlight(fn('div'));
expect(highlight).not.toThrow();
diff --git a/spec/frontend/tabs/index_spec.js b/spec/frontend/tabs/index_spec.js
index 98617b404ff..67e3d707adb 100644
--- a/spec/frontend/tabs/index_spec.js
+++ b/spec/frontend/tabs/index_spec.js
@@ -1,6 +1,6 @@
import { GlTabsBehavior, TAB_SHOWN_EVENT } from '~/tabs';
import { ACTIVE_PANEL_CLASS, ACTIVE_TAB_CLASSES } from '~/tabs/constants';
-import { getFixture, setHTMLFixture } from 'helpers/fixtures';
+import { getFixture, setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
const tabsFixture = getFixture('tabs/tabs.html');
@@ -93,6 +93,8 @@ describe('GlTabsBehavior', () => {
describe('when given an element', () => {
afterEach(() => {
glTabs.destroy();
+
+ resetHTMLFixture();
});
beforeEach(() => {
@@ -250,6 +252,10 @@ describe('GlTabsBehavior', () => {
glTabs = new GlTabsBehavior(tabsEl);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('connects the panels to their tabs correctly', () => {
findTab('bar').click();
diff --git a/spec/frontend/task_list_spec.js b/spec/frontend/task_list_spec.js
index fbdb73ae6de..e79c516a694 100644
--- a/spec/frontend/task_list_spec.js
+++ b/spec/frontend/task_list_spec.js
@@ -1,4 +1,5 @@
import $ from 'jquery';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import axios from '~/lib/utils/axios_utils';
import TaskList from '~/task_list';
@@ -14,7 +15,7 @@ describe('TaskList', () => {
const createTaskList = () => new TaskList(taskListOptions);
beforeEach(() => {
- setFixtures(`
+ setHTMLFixture(`
<div class="task-list">
<div class="js-task-list-container">
<ul data-sourcepos="5:1-5:11" class="task-list" dir="auto">
@@ -37,6 +38,10 @@ describe('TaskList', () => {
taskList = createTaskList();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should call init when the class constructed', () => {
jest.spyOn(TaskList.prototype, 'init');
jest.spyOn(TaskList.prototype, 'disable').mockImplementation(() => {});
diff --git a/spec/frontend/tracking/tracking_spec.js b/spec/frontend/tracking/tracking_spec.js
index 665bf44fc77..08da3a9a465 100644
--- a/spec/frontend/tracking/tracking_spec.js
+++ b/spec/frontend/tracking/tracking_spec.js
@@ -76,6 +76,18 @@ describe('Tracking', () => {
);
});
+ it('returns `true` if the Snowplow library was called without issues', () => {
+ expect(Tracking.event(TEST_CATEGORY, TEST_ACTION)).toBe(true);
+ });
+
+ it('returns `false` if the Snowplow library throws an error', () => {
+ snowplowSpy.mockImplementation(() => {
+ throw new Error();
+ });
+
+ expect(Tracking.event(TEST_CATEGORY, TEST_ACTION)).toBe(false);
+ });
+
it('allows adding extra data to the default context', () => {
const extra = { foo: 'bar' };
diff --git a/spec/frontend/user_lists/components/user_lists_table_spec.js b/spec/frontend/user_lists/components/user_lists_table_spec.js
index 08eb8ae0843..fb5093eb065 100644
--- a/spec/frontend/user_lists/components/user_lists_table_spec.js
+++ b/spec/frontend/user_lists/components/user_lists_table_spec.js
@@ -2,6 +2,7 @@ import { GlModal } from '@gitlab/ui';
import { mount } from '@vue/test-utils';
import * as timeago from 'timeago.js';
import { nextTick } from 'vue';
+import { timeagoLanguageCode } from '~/lib/utils/datetime/timeago_utility';
import UserListsTable from '~/user_lists/components/user_lists_table.vue';
import { userList } from 'jest/feature_flags/mock_data';
@@ -31,7 +32,7 @@ describe('User Lists Table', () => {
userList.user_xids.replace(/,/g, ', '),
);
expect(wrapper.find('[data-testid="ffUserListTimestamp"]').text()).toBe('created 2 weeks ago');
- expect(timeago.format).toHaveBeenCalledWith(userList.created_at);
+ expect(timeago.format).toHaveBeenCalledWith(userList.created_at, timeagoLanguageCode);
});
it('should set the title for a tooltip on the created stamp', () => {
diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js
index 745b66fd700..fa598716645 100644
--- a/spec/frontend/user_popovers_spec.js
+++ b/spec/frontend/user_popovers_spec.js
@@ -1,5 +1,13 @@
+import { within } from '@testing-library/dom';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import UsersCache from '~/lib/utils/users_cache';
import initUserPopovers from '~/user_popovers';
+import waitForPromises from 'helpers/wait_for_promises';
+
+jest.mock('~/api/user_api', () => ({
+ followUser: jest.fn().mockResolvedValue({}),
+ unfollowUser: jest.fn().mockResolvedValue({}),
+}));
describe('User Popovers', () => {
const fixtureTemplate = 'merge_requests/merge_request_with_mentions.html';
@@ -19,7 +27,7 @@ describe('User Popovers', () => {
return link;
};
- const dummyUser = { name: 'root' };
+ const dummyUser = { name: 'root', username: 'root', is_followed: false };
const dummyUserStatus = { message: 'active' };
let popovers;
@@ -35,7 +43,7 @@ describe('User Popovers', () => {
};
beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
const usersCacheSpy = () => Promise.resolve(dummyUser);
jest.spyOn(UsersCache, 'retrieveById').mockImplementation((userId) => usersCacheSpy(userId));
@@ -44,10 +52,15 @@ describe('User Popovers', () => {
jest
.spyOn(UsersCache, 'retrieveStatusById')
.mockImplementation((userId) => userStatusCacheSpy(userId));
+ jest.spyOn(UsersCache, 'updateById');
popovers = initUserPopovers(document.querySelectorAll(selector));
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('initializes a popover for each user link with a user id', () => {
const linksWithUsers = findFixtureLinks();
@@ -115,4 +128,32 @@ describe('User Popovers', () => {
expect(userLink.getAttribute('aria-describedby')).toBe(null);
});
+
+ it('updates toggle follow button and `UsersCache` when toggle follow button is clicked', async () => {
+ const [firstPopover] = popovers;
+ const withinFirstPopover = within(firstPopover.$el);
+ const findFollowButton = () => withinFirstPopover.queryByRole('button', { name: 'Follow' });
+ const findUnfollowButton = () => withinFirstPopover.queryByRole('button', { name: 'Unfollow' });
+
+ const userLink = document.querySelector(selector);
+ triggerEvent('mouseenter', userLink);
+
+ await waitForPromises();
+
+ const { userId } = document.querySelector(selector).dataset;
+
+ triggerEvent('click', findFollowButton());
+
+ await waitForPromises();
+
+ expect(findUnfollowButton()).not.toBe(null);
+ expect(UsersCache.updateById).toHaveBeenCalledWith(userId, { is_followed: true });
+
+ triggerEvent('click', findUnfollowButton());
+
+ await waitForPromises();
+
+ expect(findFollowButton()).not.toBe(null);
+ expect(UsersCache.updateById).toHaveBeenCalledWith(userId, { is_followed: false });
+ });
});
diff --git a/spec/frontend/vue_alerts_spec.js b/spec/frontend/vue_alerts_spec.js
index 1952eea4a01..de2faa09438 100644
--- a/spec/frontend/vue_alerts_spec.js
+++ b/spec/frontend/vue_alerts_spec.js
@@ -1,5 +1,5 @@
import { nextTick } from 'vue';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { TEST_HOST } from 'helpers/test_constants';
import initVueAlerts from '~/vue_alerts';
@@ -40,6 +40,10 @@ describe('VueAlerts', () => {
);
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
const findJsHooks = () => document.querySelectorAll('.js-vue-alert');
const findAlerts = () => document.querySelectorAll('.gl-alert');
const findAlertDismiss = (alert) => alert.querySelector('.gl-dismiss-btn');
diff --git a/spec/frontend/vue_mr_widget/components/added_commit_message_spec.js b/spec/frontend/vue_mr_widget/components/added_commit_message_spec.js
new file mode 100644
index 00000000000..150680caa7e
--- /dev/null
+++ b/spec/frontend/vue_mr_widget/components/added_commit_message_spec.js
@@ -0,0 +1,31 @@
+import { shallowMount } from '@vue/test-utils';
+import AddedCommentMessage from '~/vue_merge_request_widget/components/added_commit_message.vue';
+
+let wrapper;
+
+function factory(propsData) {
+ wrapper = shallowMount(AddedCommentMessage, {
+ propsData: {
+ isFastForwardEnabled: false,
+ targetBranch: 'main',
+ ...propsData,
+ },
+ provide: {
+ glFeatures: {
+ restructuredMrWidget: true.valueOf,
+ },
+ },
+ });
+}
+
+describe('Widget added commit message', () => {
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('displays changes where not merged when state is closed', () => {
+ factory({ state: 'closed' });
+
+ expect(wrapper.element.outerHTML).toContain('The changes were not merged');
+ });
+});
diff --git a/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js b/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
index 98cfc04eb25..5799799ad5e 100644
--- a/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
+++ b/spec/frontend/vue_mr_widget/components/extensions/utils_spec.js
@@ -2,16 +2,18 @@ import { generateText } from '~/vue_merge_request_widget/components/extensions/u
describe('generateText', () => {
it.each`
- text | expectedText
- ${'%{strong_start}Hello world%{strong_end}'} | ${'<span class="gl-font-weight-bold">Hello world</span>'}
- ${'%{success_start}Hello world%{success_end}'} | ${'<span class="gl-font-weight-bold gl-text-green-500">Hello world</span>'}
- ${'%{danger_start}Hello world%{danger_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-500">Hello world</span>'}
- ${'%{critical_start}Hello world%{critical_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-800">Hello world</span>'}
- ${'%{same_start}Hello world%{same_end}'} | ${'<span class="gl-font-weight-bold gl-text-gray-700">Hello world</span>'}
- ${'%{small_start}Hello world%{small_end}'} | ${'<span class="gl-font-sm gl-text-gray-700">Hello world</span>'}
- ${'%{strong_start}%{danger_start}Hello world%{danger_end}%{strong_end}'} | ${'<span class="gl-font-weight-bold"><span class="gl-font-weight-bold gl-text-red-500">Hello world</span></span>'}
- ${'%{no_exist_start}Hello world%{no_exist_end}'} | ${'Hello world'}
- ${['array']} | ${null}
+ text | expectedText
+ ${'%{strong_start}Hello world%{strong_end}'} | ${'<span class="gl-font-weight-bold">Hello world</span>'}
+ ${'%{success_start}Hello world%{success_end}'} | ${'<span class="gl-font-weight-bold gl-text-green-500">Hello world</span>'}
+ ${'%{danger_start}Hello world%{danger_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-500">Hello world</span>'}
+ ${'%{critical_start}Hello world%{critical_end}'} | ${'<span class="gl-font-weight-bold gl-text-red-800">Hello world</span>'}
+ ${'%{same_start}Hello world%{same_end}'} | ${'<span class="gl-font-weight-bold gl-text-gray-700">Hello world</span>'}
+ ${'%{small_start}Hello world%{small_end}'} | ${'<span class="gl-font-sm gl-text-gray-700">Hello world</span>'}
+ ${'%{strong_start}%{danger_start}Hello world%{danger_end}%{strong_end}'} | ${'<span class="gl-font-weight-bold"><span class="gl-font-weight-bold gl-text-red-500">Hello world</span></span>'}
+ ${'%{no_exist_start}Hello world%{no_exist_end}'} | ${'Hello world'}
+ ${{ text: 'Hello world', href: 'http://www.example.com' }} | ${'<a class="gl-text-decoration-underline" href="http://www.example.com">Hello world</a>'}
+ ${{ prependText: 'Hello', text: 'world', href: 'http://www.example.com' }} | ${'Hello <a class="gl-text-decoration-underline" href="http://www.example.com">world</a>'}
+ ${['array']} | ${null}
`('generates $expectedText from $text', ({ text, expectedText }) => {
expect(generateText(text)).toBe(expectedText);
});
diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
index 5a1f17573d4..ed6dc598845 100644
--- a/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
+++ b/spec/frontend/vue_mr_widget/components/mr_widget_header_spec.js
@@ -1,7 +1,5 @@
import { shallowMount, mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
import Header from '~/vue_merge_request_widget/components/mr_widget_header.vue';
-import WebIdeLink from '~/vue_shared/components/web_ide_link.vue';
describe('MRWidgetHeader', () => {
let wrapper;
@@ -17,16 +15,6 @@ describe('MRWidgetHeader', () => {
gon.relative_url_root = '';
});
- const expectDownloadDropdownItems = () => {
- const downloadEmailPatchesEl = wrapper.find('.js-download-email-patches');
- const downloadPlainDiffEl = wrapper.find('.js-download-plain-diff');
-
- expect(downloadEmailPatchesEl.text().trim()).toBe('Email patches');
- expect(downloadEmailPatchesEl.attributes('href')).toBe('/mr/email-patches');
- expect(downloadPlainDiffEl.text().trim()).toBe('Plain diff');
- expect(downloadPlainDiffEl.attributes('href')).toBe('/mr/plainDiffPath');
- };
-
const commonMrProps = {
divergedCommitsCount: 1,
sourceBranch: 'mr-widget-refactor',
@@ -36,8 +24,6 @@ describe('MRWidgetHeader', () => {
statusPath: 'abc',
};
- const findWebIdeButton = () => wrapper.findComponent(WebIdeLink);
-
describe('computed', () => {
describe('shouldShowCommitsBehindText', () => {
it('return true when there are divergedCommitsCount', () => {
@@ -133,136 +119,6 @@ describe('MRWidgetHeader', () => {
});
});
- describe('with an open merge request', () => {
- const mrDefaultOptions = {
- iid: 1,
- divergedCommitsCount: 12,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>',
- sourceBranchRemoved: false,
- targetBranchPath: 'foo/bar/commits-path',
- targetBranchTreePath: 'foo/bar/tree/path',
- targetBranch: 'main',
- isOpen: true,
- canPushToSourceBranch: true,
- emailPatchesPath: '/mr/email-patches',
- plainDiffPath: '/mr/plainDiffPath',
- statusPath: 'abc',
- sourceProjectFullPath: 'root/gitlab-ce',
- targetProjectFullPath: 'gitlab-org/gitlab-ce',
- gitpodEnabled: true,
- showGitpodButton: true,
- gitpodUrl: 'http://gitpod.localhost',
- userPreferencesGitpodPath: '/-/profile/preferences#user_gitpod_enabled',
- userProfileEnableGitpodPath: '/-/profile?user%5Bgitpod_enabled%5D=true',
- };
-
- it('renders checkout branch button with modal trigger', () => {
- createComponent({
- mr: { ...mrDefaultOptions },
- });
-
- const button = wrapper.find('.js-check-out-branch');
-
- expect(button.text().trim()).toBe('Check out branch');
- });
-
- it.each([
- [
- 'renders web ide button',
- {
- mrProps: {},
- relativeUrl: '',
- webIdeUrl:
- '/-/ide/project/root/gitlab-ce/merge_requests/1?target_project=gitlab-org%2Fgitlab-ce',
- },
- ],
- [
- 'renders web ide button with blank target_project, when mr has same target project',
- {
- mrProps: { targetProjectFullPath: 'root/gitlab-ce' },
- relativeUrl: '',
- webIdeUrl: '/-/ide/project/root/gitlab-ce/merge_requests/1?target_project=',
- },
- ],
- [
- 'renders web ide button with relative url',
- {
- mrProps: { iid: 2 },
- relativeUrl: '/gitlab',
- webIdeUrl:
- '/gitlab/-/ide/project/root/gitlab-ce/merge_requests/2?target_project=gitlab-org%2Fgitlab-ce',
- },
- ],
- ])('%s', async (_, { mrProps, relativeUrl, webIdeUrl }) => {
- gon.relative_url_root = relativeUrl;
- createComponent({
- mr: { ...mrDefaultOptions, ...mrProps },
- });
-
- await nextTick();
-
- expect(findWebIdeButton().props()).toMatchObject({
- showEditButton: false,
- showWebIdeButton: true,
- webIdeText: 'Open in Web IDE',
- gitpodText: 'Open in Gitpod',
- gitpodEnabled: true,
- showGitpodButton: true,
- gitpodUrl: 'http://gitpod.localhost',
- userPreferencesGitpodPath: mrDefaultOptions.userPreferencesGitpodPath,
- userProfileEnableGitpodPath: mrDefaultOptions.userProfileEnableGitpodPath,
- webIdeUrl,
- });
- });
-
- it('does not render web ide button if source branch is removed', async () => {
- createComponent({ mr: { ...mrDefaultOptions, sourceBranchRemoved: true } });
-
- await nextTick();
-
- expect(findWebIdeButton().exists()).toBe(false);
- });
-
- it('renders download dropdown with links', () => {
- createComponent({
- mr: { ...mrDefaultOptions },
- });
-
- expectDownloadDropdownItems();
- });
- });
-
- describe('with a closed merge request', () => {
- beforeEach(() => {
- createComponent({
- mr: {
- divergedCommitsCount: 12,
- sourceBranch: 'mr-widget-refactor',
- sourceBranchLink: '<a href="/foo/bar/mr-widget-refactor">mr-widget-refactor</a>',
- sourceBranchRemoved: false,
- targetBranchPath: 'foo/bar/commits-path',
- targetBranchTreePath: 'foo/bar/tree/path',
- targetBranch: 'main',
- isOpen: false,
- emailPatchesPath: '/mr/email-patches',
- plainDiffPath: '/mr/plainDiffPath',
- statusPath: 'abc',
- },
- });
- });
-
- it('does not render checkout branch button with modal trigger', () => {
- const button = wrapper.find('.js-check-out-branch');
-
- expect(button.exists()).toBe(false);
- });
-
- it('renders download dropdown with links', () => {
- expectDownloadDropdownItems();
- });
- });
-
describe('without diverged commits', () => {
beforeEach(() => {
createComponent({
diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
index 0e364eb6800..da3a323e8ea 100644
--- a/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
+++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_ready_to_merge_spec.js
@@ -59,6 +59,7 @@ const createTestMr = (customConfig) => {
mergeImmediatelyDocsPath: 'path/to/merge/immediately/docs',
transitionStateMachine: (transition) => eventHub.$emit('StateMachineValueChanged', transition),
translateStateToMachine: () => this.transitionStateMachine(),
+ state: 'open',
};
Object.assign(mr, customConfig.mr);
@@ -321,7 +322,6 @@ describe('ReadyToMerge', () => {
await waitForPromises();
- expect(wrapper.vm.isMakingRequest).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested');
expect(eventHub.$emit).toHaveBeenCalledWith('StateMachineValueChanged', {
transition: 'start-auto-merge',
@@ -348,7 +348,6 @@ describe('ReadyToMerge', () => {
await waitForPromises();
- expect(wrapper.vm.isMakingRequest).toBeTruthy();
expect(eventHub.$emit).toHaveBeenCalledWith('FailedToMerge', undefined);
const params = wrapper.vm.service.merge.mock.calls[0][0];
@@ -371,7 +370,6 @@ describe('ReadyToMerge', () => {
await waitForPromises();
- expect(wrapper.vm.isMakingRequest).toBeTruthy();
expect(wrapper.vm.mr.transitionStateMachine).toHaveBeenCalledWith({
transition: 'start-merge',
});
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 88b8e32bd5d..2bc6860743a 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
@@ -16,6 +16,7 @@ import newErrorsTestReports from 'jest/reports/mock_data/new_errors_report.json'
import newFailedTestReports from 'jest/reports/mock_data/new_failures_report.json';
import successTestReports from 'jest/reports/mock_data/no_failures_report.json';
import resolvedFailures from 'jest/reports/mock_data/resolved_failures.json';
+import recentFailures from 'jest/reports/mock_data/recent_failures_report.json';
const reportWithParsingErrors = failedReport;
reportWithParsingErrors.suites[0].suite_errors = {
@@ -101,6 +102,17 @@ describe('Test report extension', () => {
expect(wrapper.text()).toContain(expectedResult);
});
+ it('displays report level recently failed count', async () => {
+ mockApi(httpStatusCodes.OK, recentFailures);
+ createComponent();
+
+ await waitForPromises();
+
+ expect(wrapper.text()).toContain(
+ '2 out of 3 failed tests have failed more than once in the last 14 days',
+ );
+ });
+
it('displays a link to the full report', async () => {
mockApi(httpStatusCodes.OK);
createComponent();
@@ -125,10 +137,10 @@ describe('Test report extension', () => {
it('displays summary for each suite', async () => {
await createExpandedWidgetWithData();
- expect(trimText(findAllExtensionListItems().at(0).text())).toBe(
+ expect(trimText(findAllExtensionListItems().at(0).text())).toContain(
'rspec:pg: 1 failed and 2 fixed test results, 8 total tests',
);
- expect(trimText(findAllExtensionListItems().at(1).text())).toBe(
+ expect(trimText(findAllExtensionListItems().at(1).text())).toContain(
'java ant: 1 failed, 3 total tests',
);
});
@@ -145,5 +157,37 @@ describe('Test report extension', () => {
'Base report parsing error: JUnit data parsing failed: string not matched',
);
});
+
+ it('displays suite level recently failed count', async () => {
+ await createExpandedWidgetWithData(recentFailures);
+
+ expect(trimText(findAllExtensionListItems().at(0).text())).toContain(
+ '1 out of 2 failed tests has failed more than once in the last 14 days',
+ );
+ expect(trimText(findAllExtensionListItems().at(1).text())).toContain(
+ '1 out of 1 failed test has failed more than once in the last 14 days',
+ );
+ });
+
+ it('displays the list of failed and fixed tests', async () => {
+ await createExpandedWidgetWithData();
+
+ const firstSuite = trimText(findAllExtensionListItems().at(0).text());
+ const secondSuite = trimText(findAllExtensionListItems().at(1).text());
+
+ expect(firstSuite).toContain('Test#subtract when a is 2 and b is 1 returns correct result');
+ expect(firstSuite).toContain('Test#sum when a is 1 and b is 2 returns summary');
+ expect(firstSuite).toContain('Test#sum when a is 100 and b is 200 returns summary');
+
+ expect(secondSuite).toContain('sumTest');
+ });
+
+ it('displays the test level recently failed count', async () => {
+ await createExpandedWidgetWithData(recentFailures);
+
+ expect(trimText(findAllExtensionListItems().at(0).text())).toContain(
+ 'Failed 8 times in main in the last 14 days',
+ );
+ });
});
});
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 ea422a57956..6d1b3bb34a5 100644
--- a/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js
+++ b/spec/frontend/vue_mr_widget/extentions/accessibility/index_spec.js
@@ -107,7 +107,7 @@ describe('Accessibility extension', () => {
it('displays report list item formatted', () => {
const text = {
newError: trimText(findAllExtensionListItems().at(0).text()),
- resolvedError: findAllExtensionListItems().at(3).text(),
+ resolvedError: trimText(findAllExtensionListItems().at(3).text()),
existingError: trimText(findAllExtensionListItems().at(6).text()),
};
diff --git a/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js b/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
index 28b3bf5287a..8cbe0630426 100644
--- a/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
+++ b/spec/frontend/vue_shared/components/color_picker/color_picker_spec.js
@@ -3,6 +3,8 @@ import { mount, shallowMount } from '@vue/test-utils';
import ColorPicker from '~/vue_shared/components/color_picker/color_picker.vue';
+jest.mock('lodash/uniqueId', () => (prefix) => (prefix ? `${prefix}1` : 1));
+
describe('ColorPicker', () => {
let wrapper;
@@ -14,10 +16,11 @@ describe('ColorPicker', () => {
const setColor = '#000000';
const invalidText = 'Please enter a valid hex (#RRGGBB or #RGB) color value';
- const label = () => wrapper.find(GlFormGroup).attributes('label');
+ const findGlFormGroup = () => wrapper.find(GlFormGroup);
const colorPreview = () => wrapper.find('[data-testid="color-preview"]');
const colorPicker = () => wrapper.find(GlFormInput);
- const colorInput = () => wrapper.find(GlFormInputGroup).find('input[type="text"]');
+ const colorInput = () => wrapper.find('input[type="color"]');
+ const colorTextInput = () => wrapper.find(GlFormInputGroup).find('input[type="text"]');
const invalidFeedback = () => wrapper.find('.invalid-feedback');
const description = () => wrapper.find(GlFormGroup).attributes('description');
const presetColors = () => wrapper.findAll(GlLink);
@@ -39,13 +42,29 @@ describe('ColorPicker', () => {
it('hides the label if the label is not passed', () => {
createComponent(shallowMount);
- expect(label()).toBe('');
+ expect(findGlFormGroup().attributes('label')).toBe('');
});
it('shows the label if the label is passed', () => {
createComponent(shallowMount, { label: 'test' });
- expect(label()).toBe('test');
+ expect(findGlFormGroup().attributes('label')).toBe('test');
+ });
+
+ describe.each`
+ desc | id
+ ${'with prop id'} | ${'test-id'}
+ ${'without prop id'} | ${undefined}
+ `('$desc', ({ id }) => {
+ beforeEach(() => {
+ createComponent(mount, { id, label: 'test' });
+ });
+
+ it('renders the same `ID` for input and `for` for label', () => {
+ expect(findGlFormGroup().find('label').attributes('for')).toBe(
+ colorInput().attributes('id'),
+ );
+ });
});
});
@@ -55,30 +74,30 @@ describe('ColorPicker', () => {
expect(colorPreview().attributes('style')).toBe(undefined);
expect(colorPicker().attributes('value')).toBe(undefined);
- expect(colorInput().props('value')).toBe('');
+ expect(colorTextInput().props('value')).toBe('');
expect(colorPreview().attributes('class')).toContain('gl-inset-border-1-gray-400');
});
it('has a color set on initialization', () => {
createComponent(mount, { value: setColor });
- expect(colorInput().props('value')).toBe(setColor);
+ expect(colorTextInput().props('value')).toBe(setColor);
});
it('emits input event from component when a color is selected', async () => {
createComponent();
- await colorInput().setValue(setColor);
+ await colorTextInput().setValue(setColor);
expect(wrapper.emitted().input[0]).toStrictEqual([setColor]);
});
it('trims spaces from submitted colors', async () => {
createComponent();
- await colorInput().setValue(` ${setColor} `);
+ await colorTextInput().setValue(` ${setColor} `);
expect(wrapper.emitted().input[0]).toStrictEqual([setColor]);
expect(colorPreview().attributes('class')).toContain('gl-inset-border-1-gray-400');
- expect(colorInput().attributes('class')).not.toContain('is-invalid');
+ expect(colorTextInput().attributes('class')).not.toContain('is-invalid');
});
it('shows invalid feedback when the state is marked as invalid', async () => {
@@ -86,14 +105,14 @@ describe('ColorPicker', () => {
expect(invalidFeedback().text()).toBe(invalidText);
expect(colorPreview().attributes('class')).toContain('gl-inset-border-1-red-500');
- expect(colorInput().attributes('class')).toContain('is-invalid');
+ expect(colorTextInput().attributes('class')).toContain('is-invalid');
});
});
describe('inputs', () => {
it('has color input value entered', async () => {
createComponent();
- await colorInput().setValue(setColor);
+ await colorTextInput().setValue(setColor);
expect(wrapper.emitted().input[0]).toStrictEqual([setColor]);
});
diff --git a/spec/frontend/vue_shared/components/confidentiality_badge_spec.js b/spec/frontend/vue_shared/components/confidentiality_badge_spec.js
new file mode 100644
index 00000000000..9d11fbbaf55
--- /dev/null
+++ b/spec/frontend/vue_shared/components/confidentiality_badge_spec.js
@@ -0,0 +1,52 @@
+import { GlBadge } from '@gitlab/ui';
+
+import { shallowMount } from '@vue/test-utils';
+import { WorkspaceType, IssuableType } from '~/issues/constants';
+
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
+
+const createComponent = ({
+ workspaceType = WorkspaceType.project,
+ issuableType = IssuableType.Issue,
+} = {}) =>
+ shallowMount(ConfidentialityBadge, {
+ propsData: {
+ workspaceType,
+ issuableType,
+ },
+ });
+
+describe('ConfidentialityBadge', () => {
+ let wrapper;
+
+ beforeEach(() => {
+ wrapper = createComponent();
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it.each`
+ workspaceType | issuableType | expectedTooltip
+ ${WorkspaceType.project} | ${IssuableType.Issue} | ${'Only project members with at least Reporter role can view or be notified about this issue.'}
+ ${WorkspaceType.group} | ${IssuableType.Epic} | ${'Only group members with at least Reporter role can view or be notified about this epic.'}
+ `(
+ 'should render gl-badge with correct tooltip when workspaceType is $workspaceType and issuableType is $issuableType',
+ ({ workspaceType, issuableType, expectedTooltip }) => {
+ wrapper = createComponent({
+ workspaceType,
+ issuableType,
+ });
+
+ const badgeEl = wrapper.findComponent(GlBadge);
+
+ expect(badgeEl.props()).toMatchObject({
+ icon: 'eye-slash',
+ variant: 'warning',
+ });
+ expect(badgeEl.attributes('title')).toBe(expectedTooltip);
+ expect(badgeEl.text()).toBe('Confidential');
+ },
+ );
+});
diff --git a/spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js b/spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js
index f75694bd504..a660643d74f 100644
--- a/spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js
+++ b/spec/frontend/vue_shared/components/confirm_danger/confirm_danger_modal_spec.js
@@ -3,6 +3,7 @@ import {
CONFIRM_DANGER_WARNING,
CONFIRM_DANGER_MODAL_BUTTON,
CONFIRM_DANGER_MODAL_ID,
+ CONFIRM_DANGER_MODAL_CANCEL,
} from '~/vue_shared/components/confirm_danger/constants';
import ConfirmDangerModal from '~/vue_shared/components/confirm_danger/confirm_danger_modal.vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
@@ -10,6 +11,7 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
describe('Confirm Danger Modal', () => {
const confirmDangerMessage = 'This is a dangerous activity';
const confirmButtonText = 'Confirm button text';
+ const cancelButtonText = 'Cancel button text';
const phrase = 'You must construct additional pylons';
const modalId = CONFIRM_DANGER_MODAL_ID;
@@ -21,6 +23,7 @@ describe('Confirm Danger Modal', () => {
const findDefaultWarning = () => wrapper.findByTestId('confirm-danger-warning');
const findAdditionalMessage = () => wrapper.findByTestId('confirm-danger-message');
const findPrimaryAction = () => findModal().props('actionPrimary');
+ const findCancelAction = () => findModal().props('actionCancel');
const findPrimaryActionAttributes = (attr) => findPrimaryAction().attributes[0][attr];
const createComponent = ({ provide = {} } = {}) =>
@@ -34,7 +37,9 @@ describe('Confirm Danger Modal', () => {
});
beforeEach(() => {
- wrapper = createComponent({ provide: { confirmDangerMessage, confirmButtonText } });
+ wrapper = createComponent({
+ provide: { confirmDangerMessage, confirmButtonText, cancelButtonText },
+ });
});
afterEach(() => {
@@ -54,6 +59,10 @@ describe('Confirm Danger Modal', () => {
expect(findPrimaryActionAttributes('variant')).toBe('danger');
});
+ it('renders the cancel button', () => {
+ expect(findCancelAction().text).toBe(cancelButtonText);
+ });
+
it('renders the correct confirmation phrase', () => {
expect(findConfirmationPhrase().text()).toBe(
`Please type ${phrase} to proceed or close this modal to cancel.`,
@@ -72,6 +81,10 @@ describe('Confirm Danger Modal', () => {
it('renders the default confirm button', () => {
expect(findPrimaryAction().text).toBe(CONFIRM_DANGER_MODAL_BUTTON);
});
+
+ it('renders the default cancel button', () => {
+ expect(findCancelAction().text).toBe(CONFIRM_DANGER_MODAL_CANCEL);
+ });
});
describe('with a valid confirmation phrase', () => {
diff --git a/spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js b/spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js
index d4b6b987c69..aa41df438d2 100644
--- a/spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js
+++ b/spec/frontend/vue_shared/components/date_time_picker/date_time_picker_spec.js
@@ -15,7 +15,7 @@ describe('DateTimePicker', () => {
const dropdownToggle = () => wrapper.find('.dropdown-toggle');
const dropdownMenu = () => wrapper.find('.dropdown-menu');
const cancelButton = () => wrapper.find('[data-testid="cancelButton"]');
- const applyButtonElement = () => wrapper.find('button.btn-success').element;
+ const applyButtonElement = () => wrapper.find('button.btn-confirm').element;
const findQuickRangeItems = () => wrapper.findAll('.dropdown-item');
const createComponent = (props) => {
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 59653a0ec13..e3d8bfd22ca 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
@@ -6,12 +6,16 @@ import { folder } from './mock_data';
describe('Deploy Board Instance', () => {
let wrapper;
- const createComponent = (props = {}) =>
+ const createComponent = (props = {}, provide) =>
shallowMount(DeployBoardInstance, {
propsData: {
status: 'succeeded',
...props,
},
+ provide: {
+ glFeatures: { monitorLogging: true },
+ ...provide,
+ },
});
describe('as a non-canary deployment', () => {
@@ -95,4 +99,23 @@ describe('Deploy Board Instance', () => {
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/dropdown/dropdown_hidden_input_spec.js b/spec/frontend/vue_shared/components/dropdown/dropdown_hidden_input_spec.js
deleted file mode 100644
index 30b8e869aab..00000000000
--- a/spec/frontend/vue_shared/components/dropdown/dropdown_hidden_input_spec.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import Vue from 'vue';
-
-import mountComponent from 'helpers/vue_mount_component_helper';
-import dropdownHiddenInputComponent from '~/vue_shared/components/dropdown/dropdown_hidden_input.vue';
-
-import { mockLabels } from './mock_data';
-
-const createComponent = (name = 'label_id[]', value = mockLabels[0].id) => {
- const Component = Vue.extend(dropdownHiddenInputComponent);
-
- return mountComponent(Component, {
- name,
- value,
- });
-};
-
-describe('DropdownHiddenInputComponent', () => {
- let vm;
-
- beforeEach(() => {
- vm = createComponent();
- });
-
- afterEach(() => {
- vm.$destroy();
- });
-
- describe('template', () => {
- it('renders input element of type `hidden`', () => {
- expect(vm.$el.nodeName).toBe('INPUT');
- expect(vm.$el.getAttribute('type')).toBe('hidden');
- expect(vm.$el.getAttribute('name')).toBe(vm.name);
- expect(vm.$el.getAttribute('value')).toBe(`${vm.value}`);
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js b/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js
deleted file mode 100644
index b32dbeb8852..00000000000
--- a/spec/frontend/vue_shared/components/dropdown/dropdown_search_input_spec.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import { mount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import DropdownSearchInputComponent from '~/vue_shared/components/dropdown/dropdown_search_input.vue';
-
-describe('DropdownSearchInputComponent', () => {
- let wrapper;
-
- const defaultProps = {
- placeholderText: 'Search something',
- };
- const buildVM = (propsData = defaultProps) => {
- wrapper = mount(DropdownSearchInputComponent, {
- propsData,
- });
- };
- const findInputEl = () => wrapper.find('.dropdown-input-field');
-
- beforeEach(() => {
- buildVM();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- describe('template', () => {
- it('renders input element with type `search`', () => {
- expect(findInputEl().exists()).toBe(true);
- expect(findInputEl().attributes('type')).toBe('search');
- });
-
- it('renders search icon element', () => {
- expect(wrapper.find('.dropdown-input-search[data-testid="search-icon"]').exists()).toBe(true);
- });
-
- it('displays custom placeholder text', () => {
- expect(findInputEl().attributes('placeholder')).toBe(defaultProps.placeholderText);
- });
-
- it('focuses input element when focused property equals true', async () => {
- const inputEl = findInputEl().element;
-
- jest.spyOn(inputEl, 'focus');
-
- wrapper.setProps({ focused: true });
-
- await nextTick();
- expect(inputEl.focus).toHaveBeenCalled();
- });
- });
-});
diff --git a/spec/frontend/vue_shared/components/file_finder/index_spec.js b/spec/frontend/vue_shared/components/file_finder/index_spec.js
index 921091c5b84..5cf891a2e52 100644
--- a/spec/frontend/vue_shared/components/file_finder/index_spec.js
+++ b/spec/frontend/vue_shared/components/file_finder/index_spec.js
@@ -1,5 +1,6 @@
import Mousetrap from 'mousetrap';
import Vue, { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { file } from 'jest/ide/helpers';
import { UP_KEY_CODE, DOWN_KEY_CODE, ENTER_KEY_CODE, ESC_KEY_CODE } from '~/lib/utils/keycodes';
import FindFileComponent from '~/vue_shared/components/file_finder/index.vue';
@@ -22,7 +23,11 @@ describe('File finder item spec', () => {
}
beforeEach(() => {
- setFixtures('<div id="app"></div>');
+ setHTMLFixture('<div id="app"></div>');
+ });
+
+ afterEach(() => {
+ resetHTMLFixture();
});
afterEach(() => {
@@ -105,18 +110,6 @@ describe('File finder item spec', () => {
});
});
- describe('listHeight', () => {
- it('returns 55 when entries exist', () => {
- expect(vm.listHeight).toBe(55);
- });
-
- it('returns 33 when entries dont exist', () => {
- vm.searchText = 'testing 123';
-
- expect(vm.listHeight).toBe(33);
- });
- });
-
describe('filteredBlobsLength', () => {
it('returns length of filtered blobs', () => {
vm.searchText = 'index';
@@ -253,11 +246,9 @@ describe('File finder item spec', () => {
describe('without entries', () => {
it('renders loading text when loading', () => {
- createComponent({
- loading: true,
- });
+ createComponent({ loading: true });
- expect(vm.$el.textContent).toContain('Loading...');
+ expect(vm.$el.querySelector('.gl-spinner')).not.toBe(null);
});
it('renders no files text', () => {
@@ -307,7 +298,7 @@ describe('File finder item spec', () => {
});
it('stops callback in monaco editor', () => {
- setFixtures('<div class="inputarea"></div>');
+ setHTMLFixture('<div class="inputarea"></div>');
expect(
Mousetrap.prototype.stopCallback(null, document.querySelector('.inputarea'), 't'),
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
index b6a181e6a0b..e44bc8771f5 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/filtered_search_bar_root_spec.js
@@ -11,7 +11,10 @@ import { shallowMount, mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import RecentSearchesService from '~/filtered_search/services/recent_searches_service';
import RecentSearchesStore from '~/filtered_search/stores/recent_searches_store';
-import { SortDirection } from '~/vue_shared/components/filtered_search_bar/constants';
+import {
+ FILTERED_SEARCH_TERM,
+ SortDirection,
+} from '~/vue_shared/components/filtered_search_bar/constants';
import FilteredSearchBarRoot from '~/vue_shared/components/filtered_search_bar/filtered_search_bar_root.vue';
import { uniqueTokens } from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
@@ -68,6 +71,10 @@ const createComponent = ({
describe('FilteredSearchBarRoot', () => {
let wrapper;
+ const findGlButton = () => wrapper.findComponent(GlButton);
+ const findGlDropdown = () => wrapper.findComponent(GlDropdown);
+ const findGlFilteredSearch = () => wrapper.findComponent(GlFilteredSearch);
+
beforeEach(() => {
wrapper = createComponent({ sortOptions: mockSortOptions });
});
@@ -79,7 +86,7 @@ describe('FilteredSearchBarRoot', () => {
describe('data', () => {
it('initializes `filterValue`, `selectedSortOption` and `selectedSortDirection` data props and displays the sort dropdown', () => {
expect(wrapper.vm.filterValue).toEqual([]);
- expect(wrapper.vm.selectedSortOption).toBe(mockSortOptions[0].sortDirection.descending);
+ expect(wrapper.vm.selectedSortOption).toBe(mockSortOptions[0]);
expect(wrapper.vm.selectedSortDirection).toBe(SortDirection.descending);
expect(wrapper.find(GlButtonGroup).exists()).toBe(true);
expect(wrapper.find(GlButton).exists()).toBe(true);
@@ -225,9 +232,7 @@ describe('FilteredSearchBarRoot', () => {
});
it('initializes `recentSearchesPromise` prop with a promise by using `recentSearchesService.fetch()`', () => {
- jest
- .spyOn(wrapper.vm.recentSearchesService, 'fetch')
- .mockReturnValue(new Promise(() => []));
+ jest.spyOn(wrapper.vm.recentSearchesService, 'fetch').mockResolvedValue([]);
wrapper.vm.setupRecentSearch();
@@ -489,4 +494,40 @@ describe('FilteredSearchBarRoot', () => {
expect(sortButtonEl.props('icon')).toBe('sort-highest');
});
});
+
+ describe('watchers', () => {
+ const tokenValue = {
+ id: 'id-1',
+ type: FILTERED_SEARCH_TERM,
+ value: { data: '' },
+ };
+
+ it('syncs filter value', async () => {
+ await wrapper.setProps({ initialFilterValue: [tokenValue], syncFilterAndSort: true });
+
+ expect(findGlFilteredSearch().props('value')).toEqual([tokenValue]);
+ });
+
+ it('does not sync filter value when syncFilterAndSort=false', async () => {
+ await wrapper.setProps({ initialFilterValue: [tokenValue], syncFilterAndSort: false });
+
+ expect(findGlFilteredSearch().props('value')).toEqual([]);
+ });
+
+ it('syncs sort values', async () => {
+ await wrapper.setProps({ initialSortBy: 'updated_asc', syncFilterAndSort: true });
+
+ expect(findGlDropdown().props('text')).toBe('Last updated');
+ expect(findGlButton().props('icon')).toBe('sort-lowest');
+ expect(findGlButton().attributes('aria-label')).toBe('Sort direction: Ascending');
+ });
+
+ it('does not sync sort values when syncFilterAndSort=false', async () => {
+ await wrapper.setProps({ initialSortBy: 'updated_asc', syncFilterAndSort: false });
+
+ expect(findGlDropdown().props('text')).toBe('Created date');
+ expect(findGlButton().props('icon')).toBe('sort-highest');
+ expect(findGlButton().attributes('aria-label')).toBe('Sort direction: Descending');
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
index 87066b70023..3f24d5df858 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/author_token_spec.js
@@ -51,6 +51,7 @@ function createComponent(options = {}) {
config,
value,
active,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
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 af8a2a496ea..ca8cd419d87 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
@@ -78,6 +78,7 @@ const mockProps = {
suggestionsLoading: false,
defaultSuggestions: DEFAULT_NONE_ANY,
getActiveTokenValue: (labels, data) => labels.find((label) => label.title === data),
+ cursorPosition: 'start',
};
function createComponent({
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
index 7a7db434052..7b495ec9bee 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js
@@ -39,6 +39,7 @@ function createComponent(options = {}) {
config,
value,
active,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
index b163563cea4..dcb0d095b1b 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js
@@ -45,6 +45,7 @@ function createComponent(options = {}) {
config,
value,
active,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
index 52df27c2d00..f03a2e7934f 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js
@@ -45,6 +45,7 @@ function createComponent(options = {}) {
config,
value,
active,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
index de9ec863dd5..7c545f76c0b 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js
@@ -42,6 +42,7 @@ function createComponent(options = {}) {
config,
value,
active,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js
index 8be21b35414..4bbbaab9b7a 100644
--- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js
+++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js
@@ -18,6 +18,7 @@ describe('ReleaseToken', () => {
active: false,
config,
value,
+ cursorPosition: 'start',
},
provide: {
portalName: 'fake target',
diff --git a/spec/frontend/vue_shared/components/gitlab_version_check_spec.js b/spec/frontend/vue_shared/components/gitlab_version_check_spec.js
index b673e5407d4..b180e8c12dd 100644
--- a/spec/frontend/vue_shared/components/gitlab_version_check_spec.js
+++ b/spec/frontend/vue_shared/components/gitlab_version_check_spec.js
@@ -1,7 +1,7 @@
import { GlBadge } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import MockAdapter from 'axios-mock-adapter';
-import flushPromises from 'helpers/flush_promises';
+import waitForPromises from 'helpers/wait_for_promises';
import axios from '~/lib/utils/axios_utils';
import GitlabVersionCheck from '~/vue_shared/components/gitlab_version_check.vue';
@@ -43,7 +43,7 @@ describe('GitlabVersionCheck', () => {
describe(`is ${description}`, () => {
beforeEach(async () => {
createComponent(mockResponse);
- await flushPromises(); // Ensure we wrap up the axios call
+ await waitForPromises(); // Ensure we wrap up the axios call
});
it(`does${renders ? '' : ' not'} render GlBadge`, () => {
@@ -61,7 +61,7 @@ describe('GitlabVersionCheck', () => {
describe(`when response is ${mockResponse.res.severity}`, () => {
beforeEach(async () => {
createComponent(mockResponse);
- await flushPromises(); // Ensure we wrap up the axios call
+ await waitForPromises(); // Ensure we wrap up the axios call
});
it(`title is ${expectedUI.title}`, () => {
diff --git a/spec/frontend/vue_shared/components/markdown/field_spec.js b/spec/frontend/vue_shared/components/markdown/field_spec.js
index d1c4d777d44..b3376f26a25 100644
--- a/spec/frontend/vue_shared/components/markdown/field_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/field_spec.js
@@ -5,12 +5,14 @@ import { TEST_HOST, FIXTURES_PATH } from 'spec/test_constants';
import axios from '~/lib/utils/axios_utils';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import MarkdownFieldHeader from '~/vue_shared/components/markdown/header.vue';
+import MarkdownToolbar from '~/vue_shared/components/markdown/toolbar.vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
const markdownPreviewPath = `${TEST_HOST}/preview`;
const markdownDocsPath = `${TEST_HOST}/docs`;
const textareaValue = 'testing\n123';
const uploadsPath = 'test/uploads';
+const restrictedToolBarItems = ['quote'];
function assertMarkdownTabs(isWrite, writeLink, previewLink, wrapper) {
expect(writeLink.element.children[0].classList.contains('active')).toBe(isWrite);
@@ -63,6 +65,7 @@ describe('Markdown field component', () => {
textareaValue,
lines,
enablePreview,
+ restrictedToolBarItems,
},
provide: {
glFeatures: {
@@ -81,6 +84,8 @@ describe('Markdown field component', () => {
const getAttachButton = () => subject.find('.button-attach-file');
const clickAttachButton = () => getAttachButton().trigger('click');
const findDropzone = () => subject.find('.div-dropzone');
+ const findMarkdownHeader = () => subject.findComponent(MarkdownFieldHeader);
+ const findMarkdownToolbar = () => subject.findComponent(MarkdownToolbar);
describe('mounted', () => {
const previewHTML = `
@@ -184,9 +189,23 @@ describe('Markdown field component', () => {
assertMarkdownTabs(false, writeLink, previewLink, subject);
});
+
+ it('passes correct props to MarkdownToolbar', () => {
+ expect(findMarkdownToolbar().props()).toEqual({
+ canAttachFile: true,
+ markdownDocsPath,
+ quickActionsDocsPath: '',
+ showCommentToolBar: true,
+ });
+ });
});
describe('markdown buttons', () => {
+ beforeEach(() => {
+ // needed for the underlying insertText to work
+ document.execCommand = jest.fn(() => false);
+ });
+
it('converts single words', async () => {
const textarea = subject.find('textarea').element;
textarea.setSelectionRange(0, 7);
@@ -309,9 +328,7 @@ describe('Markdown field component', () => {
it('escapes new line characters', () => {
createSubject({ lines: [{ rich_text: 'hello world\\n' }] });
- expect(subject.find('[data-testid="markdownHeader"]').props('lineContent')).toBe(
- 'hello world%br',
- );
+ expect(findMarkdownHeader().props('lineContent')).toBe('hello world%br');
});
});
@@ -325,4 +342,12 @@ describe('Markdown field component', () => {
expect(subject.findComponent(MarkdownFieldHeader).props('enablePreview')).toBe(true);
});
+
+ it('passess restricted tool bar items', () => {
+ createSubject();
+
+ expect(subject.findComponent(MarkdownFieldHeader).props('restrictedToolBarItems')).toBe(
+ restrictedToolBarItems,
+ );
+ });
});
diff --git a/spec/frontend/vue_shared/components/markdown/header_spec.js b/spec/frontend/vue_shared/components/markdown/header_spec.js
index fa4ca63f910..67222cab247 100644
--- a/spec/frontend/vue_shared/components/markdown/header_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/header_spec.js
@@ -166,4 +166,26 @@ describe('Markdown field header component', () => {
expect(wrapper.findByTestId('preview-tab').exists()).toBe(false);
});
+
+ describe('restricted tool bar items', () => {
+ let defaultCount;
+
+ beforeEach(() => {
+ defaultCount = findToolbarButtons().length;
+ });
+
+ it('restricts items as per input', () => {
+ createWrapper({
+ restrictedToolBarItems: ['quote'],
+ });
+
+ expect(findToolbarButtons().length).toBe(defaultCount - 1);
+ });
+
+ it('shows all items by default', () => {
+ createWrapper();
+
+ expect(findToolbarButtons().length).toBe(defaultCount);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
index 8bff85b0bda..f698794b951 100644
--- a/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/toolbar_spec.js
@@ -33,4 +33,18 @@ describe('toolbar', () => {
expect(wrapper.vm.$el.querySelector('.uploading-container')).toBeNull();
});
});
+
+ describe('comment tool bar settings', () => {
+ it('does not show comment tool bar div', () => {
+ createMountedWrapper({ showCommentToolBar: false });
+
+ expect(wrapper.find('.comment-toolbar').exists()).toBe(false);
+ });
+
+ it('shows comment tool bar by default', () => {
+ createMountedWrapper();
+
+ expect(wrapper.find('.comment-toolbar').exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap b/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap
index 5dd12d9edf5..015049795a1 100644
--- a/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap
+++ b/spec/frontend/vue_shared/components/metric_images/__snapshots__/metric_images_table_spec.js.snap
@@ -10,6 +10,7 @@ exports[`Metrics upload item render the metrics image component 1`] = `
<gl-modal-stub
actioncancel="[object Object]"
actionprimary="[object Object]"
+ arialabel=""
body-class="gl-pb-0! gl-min-h-6!"
dismisslabel="Close"
modalclass=""
@@ -26,6 +27,7 @@ exports[`Metrics upload item render the metrics image component 1`] = `
<gl-modal-stub
actioncancel="[object Object]"
actionprimary="[object Object]"
+ arialabel=""
data-testid="metric-image-edit-modal"
dismisslabel="Close"
modalclass=""
diff --git a/spec/frontend/vue_shared/components/registry/list_item_spec.js b/spec/frontend/vue_shared/components/registry/list_item_spec.js
index 1b93292e37b..6e9abb2bfb3 100644
--- a/spec/frontend/vue_shared/components/registry/list_item_spec.js
+++ b/spec/frontend/vue_shared/components/registry/list_item_spec.js
@@ -101,20 +101,6 @@ describe('list item', () => {
});
});
- describe('disabled prop', () => {
- it('when true applies gl-opacity-5 class', () => {
- mountComponent({ disabled: true });
-
- expect(wrapper.classes('gl-opacity-5')).toBe(true);
- });
-
- it('when false does not apply gl-opacity-5 class', () => {
- mountComponent({ disabled: false });
-
- expect(wrapper.classes('gl-opacity-5')).toBe(false);
- });
- });
-
describe('borders and selection', () => {
it.each`
first | selected | shouldHave | shouldNotHave
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 ac313e556fc..8ff49271eb5 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
@@ -4,6 +4,7 @@ exports[`RunnerAwsDeploymentsModal renders the modal 1`] = `
<gl-modal-stub
actionprimary="[object Object]"
actionsecondary="[object Object]"
+ arialabel=""
dismisslabel="Close"
modalclass=""
modalid="runner-aws-deployments-modal"
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 0da9939e97f..001b6ee4a6f 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
@@ -45,8 +45,10 @@ describe('RunnerInstructionsModal component', () => {
const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
const findGlLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findAlert = () => wrapper.findComponent(GlAlert);
+ const findModal = () => wrapper.findComponent(GlModal);
const findPlatformButtonGroup = () => wrapper.findByTestId('platform-buttons');
const findPlatformButtons = () => findPlatformButtonGroup().findAllComponents(GlButton);
+ const findOsxPlatformButton = () => wrapper.find({ ref: 'osx' });
const findArchitectureDropdownItems = () => wrapper.findAllByTestId('architecture-dropdown-item');
const findBinaryInstructions = () => wrapper.findByTestId('binary-instructions');
const findRegisterCommand = () => wrapper.findByTestId('register-command');
@@ -140,6 +142,38 @@ describe('RunnerInstructionsModal component', () => {
expect(instructions).toBe(registerInstructions);
});
});
+
+ describe('when the modal is shown', () => {
+ it('sets the focus on the selected platform', () => {
+ findPlatformButtons().at(0).element.focus = jest.fn();
+
+ findModal().vm.$emit('shown');
+
+ expect(findPlatformButtons().at(0).element.focus).toHaveBeenCalled();
+ });
+ });
+
+ describe('when providing a defaultPlatformName', () => {
+ beforeEach(async () => {
+ createComponent({ props: { defaultPlatformName: 'osx' } });
+ await waitForPromises();
+ });
+
+ it('runner instructions for the default selected platform are requested', () => {
+ expect(runnerSetupInstructionsHandler).toHaveBeenCalledWith({
+ platform: 'osx',
+ architecture: 'amd64',
+ });
+ });
+
+ it('sets the focus on the default selected platform', () => {
+ findOsxPlatformButton().element.focus = jest.fn();
+
+ findModal().vm.$emit('shown');
+
+ expect(findOsxPlatformButton().element.focus).toHaveBeenCalled();
+ });
+ });
});
describe('after a platform and architecture are selected', () => {
diff --git a/spec/frontend/vue_shared/components/segmented_control_button_group_spec.js b/spec/frontend/vue_shared/components/segmented_control_button_group_spec.js
new file mode 100644
index 00000000000..88445b6684c
--- /dev/null
+++ b/spec/frontend/vue_shared/components/segmented_control_button_group_spec.js
@@ -0,0 +1,104 @@
+import { GlButtonGroup, GlButton } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import SegmentedControlButtonGroup from '~/vue_shared/components/segmented_control_button_group.vue';
+
+const DEFAULT_OPTIONS = [
+ { text: 'Lorem', value: 'abc' },
+ { text: 'Ipsum', value: 'def' },
+ { text: 'Foo', value: 'x', disabled: true },
+ { text: 'Dolar', value: 'ghi' },
+];
+
+describe('~/vue_shared/components/segmented_control_button_group.vue', () => {
+ let wrapper;
+
+ const createComponent = (props = {}, scopedSlots = {}) => {
+ wrapper = shallowMount(SegmentedControlButtonGroup, {
+ propsData: {
+ value: DEFAULT_OPTIONS[0].value,
+ options: DEFAULT_OPTIONS,
+ ...props,
+ },
+ scopedSlots,
+ });
+ };
+
+ const findButtonGroup = () => wrapper.findComponent(GlButtonGroup);
+ const findButtons = () => findButtonGroup().findAllComponents(GlButton);
+ const findButtonsData = () =>
+ findButtons().wrappers.map((x) => ({
+ selected: x.props('selected'),
+ text: x.text(),
+ disabled: x.props('disabled'),
+ }));
+ const findButtonWithText = (text) => findButtons().wrappers.find((x) => x.text() === text);
+
+ const optionsAsButtonData = (options) =>
+ options.map(({ text, disabled = false }) => ({
+ selected: false,
+ text,
+ disabled,
+ }));
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('default', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders button group', () => {
+ expect(findButtonGroup().exists()).toBe(true);
+ });
+
+ it('renders buttons', () => {
+ const expectation = optionsAsButtonData(DEFAULT_OPTIONS);
+ expectation[0].selected = true;
+
+ expect(findButtonsData()).toEqual(expectation);
+ });
+
+ describe.each(DEFAULT_OPTIONS.filter((x) => !x.disabled))(
+ 'when button clicked %p',
+ ({ text, value }) => {
+ it('emits input with value', () => {
+ expect(wrapper.emitted('input')).toBeUndefined();
+
+ findButtonWithText(text).vm.$emit('click');
+
+ expect(wrapper.emitted('input')).toEqual([[value]]);
+ });
+ },
+ );
+ });
+
+ const VALUE_TEST_CASES = [0, 1, 3].map((index) => [DEFAULT_OPTIONS[index].value, index]);
+
+ describe.each(VALUE_TEST_CASES)('with value=%s', (value, index) => {
+ it(`renders selected button at ${index}`, () => {
+ createComponent({ value });
+
+ const expectation = optionsAsButtonData(DEFAULT_OPTIONS);
+ expectation[index].selected = true;
+
+ expect(findButtonsData()).toEqual(expectation);
+ });
+ });
+
+ describe('with button-content slot', () => {
+ it('renders button content based on slot', () => {
+ createComponent(
+ {},
+ {
+ 'button-content': `<template #button-content="{ text }">In a slot - {{ text }}</template>`,
+ },
+ );
+
+ expect(findButtonsData().map((x) => x.text)).toEqual(
+ DEFAULT_OPTIONS.map((x) => `In a slot - ${x.text}`),
+ );
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
index 3ceed670d77..9c29f304c71 100644
--- a/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
+++ b/spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view_spec.js
@@ -153,7 +153,11 @@ describe('DropdownContentsCreateView', () => {
});
it('enables a Create button', () => {
- expect(findCreateButton().props('disabled')).toBe(false);
+ expect(findCreateButton().props()).toMatchObject({
+ disabled: false,
+ category: 'primary',
+ variant: 'confirm',
+ });
});
it('renders a loader spinner after Create button click', async () => {
diff --git a/spec/frontend/vue_shared/components/usage_quotas/usage_banner_spec.js b/spec/frontend/vue_shared/components/usage_quotas/usage_banner_spec.js
new file mode 100644
index 00000000000..662c09d02bf
--- /dev/null
+++ b/spec/frontend/vue_shared/components/usage_quotas/usage_banner_spec.js
@@ -0,0 +1,62 @@
+import { GlSkeletonLoader } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import component from '~/vue_shared/components/usage_quotas/usage_banner.vue';
+
+describe('usage banner', () => {
+ let wrapper;
+
+ const findLeftPrimaryTextSlot = () => wrapper.findByTestId('left-primary-text');
+ const findLeftSecondaryTextSlot = () => wrapper.findByTestId('left-secondary-text');
+ const findRightPrimaryTextSlot = () => wrapper.findByTestId('right-primary-text');
+ const findRightSecondaryTextSlot = () => wrapper.findByTestId('right-secondary-text');
+ const findSkeletonLoader = () => wrapper.findComponent(GlSkeletonLoader);
+
+ const mountComponent = (propsData, slots) => {
+ wrapper = shallowMountExtended(component, {
+ propsData,
+ slots: {
+ 'left-primary-text': '<div data-testid="left-primary-text" />',
+ 'left-secondary-text': '<div data-testid="left-secondary-text" />',
+ 'right-primary-text': '<div data-testid="right-primary-text" />',
+ 'right-secondary-text': '<div data-testid="right-secondary-text" />',
+ ...slots,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe.each`
+ slotName | finderFunction
+ ${'left-primary-text'} | ${findLeftPrimaryTextSlot}
+ ${'left-secondary-text'} | ${findLeftSecondaryTextSlot}
+ ${'right-primary-text'} | ${findRightPrimaryTextSlot}
+ ${'right-secondary-text'} | ${findRightSecondaryTextSlot}
+ `('$slotName slot', ({ finderFunction, slotName }) => {
+ it('exist when the slot is filled', () => {
+ mountComponent();
+
+ expect(finderFunction().exists()).toBe(true);
+ });
+
+ it('does not exist when the slot is empty', () => {
+ mountComponent({}, { [slotName]: '' });
+
+ expect(finderFunction().exists()).toBe(false);
+ });
+ });
+
+ it('should show a skeleton loader component', () => {
+ mountComponent({ loading: true });
+
+ expect(findSkeletonLoader().exists()).toBe(true);
+ });
+
+ it('should not show a skeleton loader component', () => {
+ mountComponent();
+
+ expect(findSkeletonLoader().exists()).toBe(false);
+ });
+});
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 3329199a46b..a54f3450633 100644
--- a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
+++ b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js
@@ -1,11 +1,22 @@
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';
+import { followUser, unfollowUser } from '~/api/user_api';
+
+jest.mock('~/flash');
+jest.mock('~/api/user_api', () => ({
+ followUser: jest.fn(),
+ unfollowUser: jest.fn(),
+}));
const DEFAULT_PROPS = {
user: {
+ id: 1,
username: 'root',
name: 'Administrator',
location: 'Vienna',
@@ -15,6 +26,7 @@ const DEFAULT_PROPS = {
workInformation: null,
status: null,
pronouns: 'they/them',
+ isFollowed: false,
loaded: true,
},
};
@@ -25,11 +37,13 @@ describe('User Popover Component', () => {
let wrapper;
beforeEach(() => {
- loadFixtures(fixtureTemplate);
+ loadHTMLFixture(fixtureTemplate);
+ gon.features = {};
});
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
const findUserStatus = () => wrapper.findByTestId('user-popover-status');
@@ -37,15 +51,15 @@ describe('User Popover Component', () => {
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');
- const createWrapper = (props = {}, options = {}) => {
+ const createWrapper = (props = {}) => {
wrapper = mountExtended(UserPopover, {
propsData: {
...DEFAULT_PROPS,
target: findTarget(),
...props,
},
- ...options,
});
};
@@ -289,4 +303,124 @@ describe('User Popover Component', () => {
expect(findUserLocalTime().exists()).toBe(false);
});
});
+
+ describe("when current user doesn't follow the user", () => {
+ beforeEach(() => createWrapper());
+
+ it('renders the Follow button with the correct variant', () => {
+ expect(findToggleFollowButton().text()).toBe('Follow');
+ expect(findToggleFollowButton().props('variant')).toBe('confirm');
+ });
+
+ describe('when clicking', () => {
+ it('follows the user', async () => {
+ followUser.mockResolvedValue({});
+
+ await findToggleFollowButton().trigger('click');
+
+ expect(findToggleFollowButton().props('loading')).toBe(true);
+
+ await axios.waitForAll();
+
+ expect(wrapper.emitted().follow.length).toBe(1);
+ expect(wrapper.emitted().unfollow).toBeFalsy();
+ });
+
+ describe('when an error occurs', () => {
+ beforeEach(() => {
+ followUser.mockRejectedValue({});
+
+ findToggleFollowButton().trigger('click');
+ });
+
+ it('shows an error message', async () => {
+ await axios.waitForAll();
+
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'An error occurred while trying to follow this user, please try again.',
+ error: {},
+ captureError: true,
+ });
+ });
+
+ it('emits no events', async () => {
+ await axios.waitForAll();
+
+ expect(wrapper.emitted().follow).toBe(undefined);
+ expect(wrapper.emitted().unfollow).toBe(undefined);
+ });
+ });
+ });
+ });
+
+ describe('when current user follows the user', () => {
+ beforeEach(() => createWrapper({ user: { ...DEFAULT_PROPS.user, isFollowed: true } }));
+
+ it('renders the Unfollow button with the correct variant', () => {
+ expect(findToggleFollowButton().text()).toBe('Unfollow');
+ expect(findToggleFollowButton().props('variant')).toBe('default');
+ });
+
+ describe('when clicking', () => {
+ it('unfollows the user', async () => {
+ unfollowUser.mockResolvedValue({});
+
+ findToggleFollowButton().trigger('click');
+
+ await axios.waitForAll();
+
+ expect(wrapper.emitted().follow).toBe(undefined);
+ expect(wrapper.emitted().unfollow.length).toBe(1);
+ });
+
+ describe('when an error occurs', () => {
+ beforeEach(async () => {
+ unfollowUser.mockRejectedValue({});
+
+ findToggleFollowButton().trigger('click');
+
+ await axios.waitForAll();
+ });
+
+ it('shows an error message', () => {
+ expect(createFlash).toHaveBeenCalledWith({
+ message: 'An error occurred while trying to unfollow this user, please try again.',
+ error: {},
+ captureError: true,
+ });
+ });
+
+ it('emits no events', () => {
+ expect(wrapper.emitted().follow).toBe(undefined);
+ expect(wrapper.emitted().unfollow).toBe(undefined);
+ });
+ });
+ });
+ });
+
+ describe('when the current user is the user', () => {
+ beforeEach(() => {
+ gon.current_username = DEFAULT_PROPS.user.username;
+ createWrapper();
+ });
+
+ it("doesn't render the toggle follow button", () => {
+ expect(findToggleFollowButton().exists()).toBe(false);
+ });
+ });
+
+ describe('when API does not support `isFollowed`', () => {
+ beforeEach(() => {
+ const user = {
+ ...DEFAULT_PROPS.user,
+ isFollowed: undefined,
+ };
+
+ createWrapper({ user });
+ });
+
+ it('does not render the toggle follow button', () => {
+ expect(findToggleFollowButton().exists()).toBe(false);
+ });
+ });
});
diff --git a/spec/frontend/vue_shared/directives/autofocusonshow_spec.js b/spec/frontend/vue_shared/directives/autofocusonshow_spec.js
index 59ce9f086c3..d052c99ec0e 100644
--- a/spec/frontend/vue_shared/directives/autofocusonshow_spec.js
+++ b/spec/frontend/vue_shared/directives/autofocusonshow_spec.js
@@ -1,3 +1,4 @@
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import autofocusonshow from '~/vue_shared/directives/autofocusonshow';
/**
@@ -10,10 +11,14 @@ describe('AutofocusOnShow directive', () => {
let el;
beforeEach(() => {
- setFixtures('<div id="container" style="display: none;"><input id="inputel"/></div>');
+ setHTMLFixture('<div id="container" style="display: none;"><input id="inputel"/></div>');
el = document.querySelector('#inputel');
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('should bind IntersectionObserver on input element', () => {
jest.spyOn(el, 'focus').mockImplementation(() => {});
diff --git a/spec/frontend/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar_spec.js b/spec/frontend/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar_spec.js
index 7dfeced571a..a25f92c9cf2 100644
--- a/spec/frontend/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar_spec.js
+++ b/spec/frontend/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar_spec.js
@@ -1,6 +1,7 @@
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableBulkEditSidebar from '~/vue_shared/issuable/list/components/issuable_bulk_edit_sidebar.vue';
const createComponent = ({ expanded = true } = {}) =>
@@ -22,12 +23,13 @@ describe('IssuableBulkEditSidebar', () => {
let wrapper;
beforeEach(() => {
- setFixtures('<div class="layout-page right-sidebar-collapsed"></div>');
+ setHTMLFixture('<div class="layout-page right-sidebar-collapsed"></div>');
wrapper = createComponent();
});
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
describe('watch', () => {
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
index b79dc0bf976..d3e484cf913 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_edit_form_spec.js
@@ -36,7 +36,6 @@ describe('IssuableEditForm', () => {
beforeEach(() => {
wrapper = createComponent();
- gon.features = { markdownContinueLists: true };
});
afterEach(() => {
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
index 1cdd709159f..544db891a13 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_header_spec.js
@@ -1,8 +1,6 @@
import { GlIcon, GlAvatarLabeled } from '@gitlab/ui';
-import { shallowMount } from '@vue/test-utils';
-import { nextTick } from 'vue';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import IssuableHeader from '~/vue_shared/issuable/show/components/issuable_header.vue';
import { mockIssuableShowProps, mockIssuable } from '../mock_data';
@@ -12,10 +10,17 @@ const issuableHeaderProps = {
...mockIssuableShowProps,
};
-const createComponent = (propsData = issuableHeaderProps, { stubs } = {}) =>
- extendedWrapper(
- shallowMount(IssuableHeader, {
- propsData,
+describe('IssuableHeader', () => {
+ let wrapper;
+
+ const findTaskStatusEl = () => wrapper.findByTestId('task-status');
+
+ const createComponent = (props = {}, { stubs } = {}) => {
+ wrapper = shallowMountExtended(IssuableHeader, {
+ propsData: {
+ ...issuableHeaderProps,
+ ...props,
+ },
slots: {
'status-badge': 'Open',
'header-actions': `
@@ -24,23 +29,18 @@ const createComponent = (propsData = issuableHeaderProps, { stubs } = {}) =>
`,
},
stubs,
- }),
- );
-
-describe('IssuableHeader', () => {
- let wrapper;
-
- beforeEach(() => {
- wrapper = createComponent();
- });
+ });
+ };
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
describe('computed', () => {
describe('authorId', () => {
it('returns numeric ID from GraphQL ID of `author` prop', () => {
+ createComponent();
expect(wrapper.vm.authorId).toBe(1);
});
});
@@ -48,10 +48,11 @@ describe('IssuableHeader', () => {
describe('handleRightSidebarToggleClick', () => {
beforeEach(() => {
- setFixtures('<button class="js-toggle-right-sidebar-button">Collapse sidebar</button>');
+ setHTMLFixture('<button class="js-toggle-right-sidebar-button">Collapse sidebar</button>');
});
it('dispatches `click` event on sidebar toggle button', () => {
+ createComponent();
wrapper.vm.toggleSidebarButtonEl = document.querySelector('.js-toggle-right-sidebar-button');
jest.spyOn(wrapper.vm.toggleSidebarButtonEl, 'dispatchEvent').mockImplementation(jest.fn);
@@ -67,20 +68,21 @@ describe('IssuableHeader', () => {
describe('template', () => {
it('renders issuable status icon and text', () => {
+ createComponent();
const statusBoxEl = wrapper.findByTestId('status');
+ const statusIconEl = statusBoxEl.findComponent(GlIcon);
expect(statusBoxEl.exists()).toBe(true);
- expect(statusBoxEl.find(GlIcon).props('name')).toBe(mockIssuableShowProps.statusIcon);
+ expect(statusIconEl.props('name')).toBe(mockIssuableShowProps.statusIcon);
+ expect(statusIconEl.attributes('class')).toBe(mockIssuableShowProps.statusIconClass);
expect(statusBoxEl.text()).toContain('Open');
});
it('renders blocked icon when issuable is blocked', async () => {
- wrapper.setProps({
+ createComponent({
blocked: true,
});
- await nextTick();
-
const blockedEl = wrapper.findByTestId('blocked');
expect(blockedEl.exists()).toBe(true);
@@ -88,12 +90,10 @@ describe('IssuableHeader', () => {
});
it('renders confidential icon when issuable is confidential', async () => {
- wrapper.setProps({
+ createComponent({
confidential: true,
});
- await nextTick();
-
const confidentialEl = wrapper.findByTestId('confidential');
expect(confidentialEl.exists()).toBe(true);
@@ -101,6 +101,7 @@ describe('IssuableHeader', () => {
});
it('renders issuable author avatar', () => {
+ createComponent();
const { username, name, webUrl, avatarUrl } = mockIssuable.author;
const avatarElAttrs = {
'data-user-id': '1',
@@ -120,28 +121,26 @@ describe('IssuableHeader', () => {
expect(avatarEl.find(GlAvatarLabeled).find(GlIcon).exists()).toBe(false);
});
- it('renders tast status text when `taskCompletionStatus` prop is defined', () => {
- let taskStatusEl = wrapper.findByTestId('task-status');
+ it('renders task status text when `taskCompletionStatus` prop is defined', () => {
+ createComponent();
- expect(taskStatusEl.exists()).toBe(true);
- expect(taskStatusEl.text()).toContain('0 of 5 tasks completed');
+ expect(findTaskStatusEl().exists()).toBe(true);
+ expect(findTaskStatusEl().text()).toContain('0 of 5 tasks completed');
+ });
- const wrapperSingleTask = createComponent({
- ...issuableHeaderProps,
+ it('does not render task status text when tasks count is 0', () => {
+ createComponent({
taskCompletionStatus: {
+ count: 0,
completedCount: 0,
- count: 1,
},
});
- taskStatusEl = wrapperSingleTask.findByTestId('task-status');
-
- expect(taskStatusEl.text()).toContain('0 of 1 task completed');
-
- wrapperSingleTask.destroy();
+ expect(findTaskStatusEl().exists()).toBe(false);
});
it('renders sidebar toggle button', () => {
+ createComponent();
const toggleButtonEl = wrapper.findByTestId('sidebar-toggle');
expect(toggleButtonEl.exists()).toBe(true);
@@ -149,6 +148,7 @@ describe('IssuableHeader', () => {
});
it('renders header actions', () => {
+ createComponent();
const actionsEl = wrapper.findByTestId('header-actions');
expect(actionsEl.find('button.js-close').exists()).toBe(true);
@@ -157,9 +157,8 @@ describe('IssuableHeader', () => {
describe('when author exists outside of GitLab', () => {
it("renders 'external-link' icon in avatar label", () => {
- wrapper = createComponent(
+ createComponent(
{
- ...issuableHeaderProps,
author: {
...issuableHeaderProps.author,
webUrl: 'https://jira.com/test-user/author.jpg',
diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_show_root_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_show_root_spec.js
index d1eb1366225..8b027f990a2 100644
--- a/spec/frontend/vue_shared/issuable/show/components/issuable_show_root_spec.js
+++ b/spec/frontend/vue_shared/issuable/show/components/issuable_show_root_spec.js
@@ -49,6 +49,7 @@ describe('IssuableShowRoot', () => {
const {
statusBadgeClass,
statusIcon,
+ statusIconClass,
enableEdit,
enableAutocomplete,
editFormVisible,
@@ -56,7 +57,7 @@ describe('IssuableShowRoot', () => {
descriptionHelpPath,
taskCompletionStatus,
} = mockIssuableShowProps;
- const { blocked, confidential, createdAt, author } = mockIssuable;
+ const { state, blocked, confidential, createdAt, author } = mockIssuable;
it('renders component container element with class `issuable-show-container`', () => {
expect(wrapper.classes()).toContain('issuable-show-container');
@@ -67,15 +68,17 @@ describe('IssuableShowRoot', () => {
expect(issuableHeader.exists()).toBe(true);
expect(issuableHeader.props()).toMatchObject({
+ issuableState: state,
statusBadgeClass,
statusIcon,
+ statusIconClass,
blocked,
confidential,
createdAt,
author,
taskCompletionStatus,
});
- expect(issuableHeader.find('.issuable-status-box').text()).toContain('Open');
+ expect(issuableHeader.find('.issuable-status-badge').text()).toContain('Open');
expect(issuableHeader.find('.detail-page-header-actions button.js-close').exists()).toBe(
true,
);
diff --git a/spec/frontend/vue_shared/issuable/show/mock_data.js b/spec/frontend/vue_shared/issuable/show/mock_data.js
index f5f3ed58655..32bb9edfe08 100644
--- a/spec/frontend/vue_shared/issuable/show/mock_data.js
+++ b/spec/frontend/vue_shared/issuable/show/mock_data.js
@@ -36,8 +36,9 @@ export const mockIssuableShowProps = {
enableTaskList: true,
enableEdit: true,
showFieldTitle: false,
- statusBadgeClass: 'status-box-open',
- statusIcon: 'issue-open-m',
+ statusBadgeClass: 'issuable-status-badge-open',
+ statusIcon: 'issues',
+ statusIconClass: 'gl-sm-display-none',
taskCompletionStatus: {
completedCount: 0,
count: 5,
diff --git a/spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js b/spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js
index 47bf3c8ed83..6c9e5f85fa0 100644
--- a/spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js
+++ b/spec/frontend/vue_shared/issuable/sidebar/components/issuable_sidebar_root_spec.js
@@ -1,6 +1,7 @@
import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils';
-import Cookies from 'js-cookie';
import { nextTick } from 'vue';
+import Cookies from '~/lib/utils/cookies';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import IssuableSidebarRoot from '~/vue_shared/issuable/sidebar/components/issuable_sidebar_root.vue';
@@ -9,7 +10,7 @@ import { USER_COLLAPSED_GUTTER_COOKIE } from '~/vue_shared/issuable/sidebar/cons
const MOCK_LAYOUT_PAGE_CLASS = 'layout-page';
const createComponent = () => {
- setFixtures(`<div class="${MOCK_LAYOUT_PAGE_CLASS}"></div>`);
+ setHTMLFixture(`<div class="${MOCK_LAYOUT_PAGE_CLASS}"></div>`);
return shallowMountExtended(IssuableSidebarRoot, {
slots: {
@@ -38,6 +39,7 @@ describe('IssuableSidebarRoot', () => {
afterEach(() => {
wrapper.destroy();
+ resetHTMLFixture();
});
describe('when sidebar is expanded', () => {
diff --git a/spec/frontend/vue_shared/security_configuration/components/section_layout_spec.js b/spec/frontend/vue_shared/security_configuration/components/section_layout_spec.js
new file mode 100644
index 00000000000..136fe74b0d6
--- /dev/null
+++ b/spec/frontend/vue_shared/security_configuration/components/section_layout_spec.js
@@ -0,0 +1,58 @@
+import { mount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import SectionLayout from '~/vue_shared/security_configuration/components/section_layout.vue';
+import SectionLoader from '~/vue_shared/security_configuration/components/section_loader.vue';
+
+describe('Section Layout component', () => {
+ let wrapper;
+
+ const createComponent = (propsData) => {
+ wrapper = extendedWrapper(
+ mount(SectionLayout, {
+ propsData,
+ scopedSlots: {
+ description: '<span>foo</span>',
+ features: '<span>bar</span>',
+ },
+ }),
+ );
+ };
+
+ const findHeading = () => wrapper.find('h2');
+ const findLoader = () => wrapper.findComponent(SectionLoader);
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ describe('basic structure', () => {
+ beforeEach(() => {
+ createComponent({ heading: 'testheading' });
+ });
+
+ const slots = {
+ description: 'foo',
+ features: 'bar',
+ };
+
+ it('should render heading when passed in as props', () => {
+ expect(findHeading().exists()).toBe(true);
+ expect(findHeading().text()).toBe('testheading');
+ });
+
+ Object.keys(slots).forEach((slot) => {
+ it('renders the slots', () => {
+ const slotContent = slots[slot];
+ createComponent({ heading: '' });
+ expect(wrapper.text()).toContain(slotContent);
+ });
+ });
+ });
+
+ describe('loading state', () => {
+ it('should show loaders when loading', () => {
+ createComponent({ heading: 'testheading', isLoading: true });
+ expect(findLoader().exists()).toBe(true);
+ });
+ });
+});
diff --git a/spec/frontend/vue_shared/security_reports/mock_data.js b/spec/frontend/vue_shared/security_reports/mock_data.js
index dac9accbbf5..a9ad675e538 100644
--- a/spec/frontend/vue_shared/security_reports/mock_data.js
+++ b/spec/frontend/vue_shared/security_reports/mock_data.js
@@ -62,7 +62,7 @@ export const mockFindings = [
report_type: 'dependency_scanning',
name: '3rd party CORS request may execute in jquery',
severity: 'high',
- scanner: { external_id: 'retire.js', name: 'Retire.js' },
+ scanner: { external_id: 'gemnasium', name: 'gemnasium' },
identifiers: [
{
external_type: 'cve',
@@ -145,7 +145,7 @@ export const mockFindings = [
name:
'jQuery before 3.4.0, as used in Drupal, Backdrop CMS, and other products, mishandles jQuery.extend(true, {}, ...) because of Object.prototype pollution in jquery',
severity: 'low',
- scanner: { external_id: 'retire.js', name: 'Retire.js' },
+ scanner: { external_id: 'gemnasium', name: 'gemnasium' },
identifiers: [
{
external_type: 'cve',
@@ -227,7 +227,7 @@ export const mockFindings = [
name:
'jQuery before 3.4.0, as used in Drupal, Backdrop CMS, and other products, mishandles jQuery.extend(true, {}, ...) because of Object.prototype pollution in jquery',
severity: 'low',
- scanner: { external_id: 'retire.js', name: 'Retire.js' },
+ scanner: { external_id: 'gemnasium', name: 'gemnasium' },
identifiers: [
{
external_type: 'cve',
diff --git a/spec/frontend/whats_new/components/feature_spec.js b/spec/frontend/whats_new/components/feature_spec.js
index 8f4b4b08f50..b6627c257ff 100644
--- a/spec/frontend/whats_new/components/feature_spec.js
+++ b/spec/frontend/whats_new/components/feature_spec.js
@@ -21,6 +21,7 @@ describe("What's new single feature", () => {
const findReleaseDate = () => wrapper.find('[data-testid="release-date"]');
const findBodyAnchor = () => wrapper.find('[data-testid="body-content"] a');
+ const findImageLink = () => wrapper.find('[data-testid="whats-new-image-link"]');
const createWrapper = ({ feature } = {}) => {
wrapper = shallowMount(Feature, {
@@ -35,18 +36,38 @@ describe("What's new single feature", () => {
it('renders the date', () => {
createWrapper({ feature: exampleFeature });
+
expect(findReleaseDate().text()).toBe('April 22, 2021');
});
- describe('when the published_at is null', () => {
- it("doesn't render the date", () => {
+ it('renders image link', () => {
+ createWrapper({ feature: exampleFeature });
+
+ expect(findImageLink().exists()).toBe(true);
+ expect(findImageLink().find('div').attributes('style')).toBe(
+ `background-image: url(${exampleFeature.image_url});`,
+ );
+ });
+
+ describe('when published_at is null', () => {
+ it('does not render the date', () => {
createWrapper({ feature: { ...exampleFeature, published_at: null } });
+
expect(findReleaseDate().exists()).toBe(false);
});
});
+ describe('when image_url is null', () => {
+ it('does not render image link', () => {
+ createWrapper({ feature: { ...exampleFeature, image_url: null } });
+
+ expect(findImageLink().exists()).toBe(false);
+ });
+ });
+
it('safe-html config allows target attribute on elements', () => {
createWrapper({ feature: exampleFeature });
+
expect(findBodyAnchor().attributes()).toEqual({
href: expect.any(String),
rel: 'noopener noreferrer',
diff --git a/spec/frontend/whats_new/utils/notification_spec.js b/spec/frontend/whats_new/utils/notification_spec.js
index ef61462a3c5..dac02ee07bd 100644
--- a/spec/frontend/whats_new/utils/notification_spec.js
+++ b/spec/frontend/whats_new/utils/notification_spec.js
@@ -1,3 +1,4 @@
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useLocalStorageSpy } from 'helpers/local_storage_helper';
import { setNotification, getVersionDigest } from '~/whats_new/utils/notification';
@@ -11,12 +12,13 @@ describe('~/whats_new/utils/notification', () => {
const getAppEl = () => wrapper.querySelector('.app');
beforeEach(() => {
- loadFixtures('static/whats_new_notification.html');
+ loadHTMLFixture('static/whats_new_notification.html');
wrapper = document.querySelector('.whats-new-notification-fixture-root');
});
afterEach(() => {
wrapper.remove();
+ resetHTMLFixture();
});
describe('setNotification', () => {
diff --git a/spec/frontend/wikis_spec.js b/spec/frontend/wikis_spec.js
index c4e914bcf34..d8748c65da7 100644
--- a/spec/frontend/wikis_spec.js
+++ b/spec/frontend/wikis_spec.js
@@ -1,5 +1,5 @@
import { escape } from 'lodash';
-import { setHTMLFixture } from 'helpers/fixtures';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import Wikis from '~/pages/shared/wikis/wikis';
import Tracking from '~/tracking';
@@ -21,6 +21,10 @@ describe('Wikis', () => {
Wikis.trackPageView();
});
+ afterEach(() => {
+ resetHTMLFixture();
+ });
+
it('sends the tracking event and context', () => {
expect(Tracking.event).toHaveBeenCalledWith(trackingPage, 'view_wiki_page', {
label: 'view_wiki_page',
diff --git a/spec/frontend/work_items/components/item_state_spec.js b/spec/frontend/work_items/components/item_state_spec.js
new file mode 100644
index 00000000000..79b76f3c061
--- /dev/null
+++ b/spec/frontend/work_items/components/item_state_spec.js
@@ -0,0 +1,54 @@
+import { mount } from '@vue/test-utils';
+import { STATE_OPEN, STATE_CLOSED } from '~/work_items/constants';
+import ItemState from '~/work_items/components/item_state.vue';
+
+describe('ItemState', () => {
+ let wrapper;
+
+ const findLabel = () => wrapper.find('label').text();
+ const selectedValue = () => wrapper.find('option:checked').element.value;
+
+ const clickOpen = () => wrapper.findAll('option').at(0).setSelected();
+
+ const createComponent = ({ state = STATE_OPEN, disabled = false } = {}) => {
+ wrapper = mount(ItemState, {
+ propsData: {
+ state,
+ disabled,
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders label and dropdown', () => {
+ createComponent();
+
+ expect(findLabel()).toBe('Status');
+ expect(selectedValue()).toBe(STATE_OPEN);
+ });
+
+ it('renders dropdown for closed', () => {
+ createComponent({ state: STATE_CLOSED });
+
+ expect(selectedValue()).toBe(STATE_CLOSED);
+ });
+
+ it('emits changed event', async () => {
+ createComponent({ state: STATE_CLOSED });
+
+ await clickOpen();
+
+ expect(wrapper.emitted('changed')).toEqual([[STATE_OPEN]]);
+ });
+
+ it('does not emits changed event if clicking selected value', async () => {
+ createComponent({ state: STATE_OPEN });
+
+ await clickOpen();
+
+ expect(wrapper.emitted('changed')).toBeUndefined();
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_actions_spec.js b/spec/frontend/work_items/components/work_item_actions_spec.js
index d0e9cfee353..137a0a7326d 100644
--- a/spec/frontend/work_items/components/work_item_actions_spec.js
+++ b/spec/frontend/work_items/components/work_item_actions_spec.js
@@ -1,30 +1,18 @@
import { GlDropdownItem, GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
-import VueApollo from 'vue-apollo';
-import waitForPromises from 'helpers/wait_for_promises';
-import createMockApollo from 'helpers/mock_apollo_helper';
import WorkItemActions from '~/work_items/components/work_item_actions.vue';
-import deleteWorkItem from '~/work_items/graphql/delete_work_item.mutation.graphql';
-import { deleteWorkItemResponse, deleteWorkItemFailureResponse } from '../mock_data';
describe('WorkItemActions component', () => {
let wrapper;
let glModalDirective;
- Vue.use(VueApollo);
-
const findModal = () => wrapper.findComponent(GlModal);
const findDeleteButton = () => wrapper.findComponent(GlDropdownItem);
- const createComponent = ({
- canUpdate = true,
- deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse),
- } = {}) => {
+ const createComponent = ({ canDelete = true } = {}) => {
glModalDirective = jest.fn();
wrapper = shallowMount(WorkItemActions, {
- apolloProvider: createMockApollo([[deleteWorkItem, deleteWorkItemHandler]]),
- propsData: { workItemId: '123', canUpdate },
+ propsData: { workItemId: '123', canDelete },
directives: {
glModal: {
bind(_, { value }) {
@@ -54,48 +42,17 @@ describe('WorkItemActions component', () => {
expect(glModalDirective).toHaveBeenCalled();
});
- it('calls delete mutation when clicking OK button', () => {
- const deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse);
-
- createComponent({
- deleteWorkItemHandler,
- });
-
- findModal().vm.$emit('ok');
-
- expect(deleteWorkItemHandler).toHaveBeenCalled();
- expect(wrapper.emitted('error')).toBeUndefined();
- });
-
- it('emits event after delete success', async () => {
+ it('emits event when clicking OK button', () => {
createComponent();
findModal().vm.$emit('ok');
- await waitForPromises();
-
- expect(wrapper.emitted('workItemDeleted')).not.toBeUndefined();
- expect(wrapper.emitted('error')).toBeUndefined();
- });
-
- it('emits error event after delete failure', async () => {
- createComponent({
- deleteWorkItemHandler: jest.fn().mockResolvedValue(deleteWorkItemFailureResponse),
- });
-
- findModal().vm.$emit('ok');
-
- await waitForPromises();
-
- expect(wrapper.emitted('error')[0]).toEqual([
- "The resource that you are attempting to access does not exist or you don't have permission to perform this action",
- ]);
- expect(wrapper.emitted('workItemDeleted')).toBeUndefined();
+ expect(wrapper.emitted('deleteWorkItem')).toEqual([[]]);
});
- it('does not render when canUpdate is false', () => {
+ it('does not render when canDelete is false', () => {
createComponent({
- canUpdate: false,
+ canDelete: false,
});
expect(wrapper.html()).toBe('');
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 9f35ccb853b..aaabdbc82d9 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
@@ -1,23 +1,57 @@
-import { GlModal } from '@gitlab/ui';
+import { GlAlert } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
-import Vue from 'vue';
+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 WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
-import WorkItemActions from '~/work_items/components/work_item_actions.vue';
+import deleteWorkItemFromTaskMutation from '~/work_items/graphql/delete_task_from_work_item.mutation.graphql';
describe('WorkItemDetailModal component', () => {
let wrapper;
Vue.use(VueApollo);
+ const hideModal = jest.fn();
+ const GlModal = {
+ template: `
+ <div>
+ <slot></slot>
+ </div>
+ `,
+ methods: {
+ hide: hideModal,
+ },
+ };
+
const findModal = () => wrapper.findComponent(GlModal);
- const findWorkItemActions = () => wrapper.findComponent(WorkItemActions);
+ const findAlert = () => wrapper.findComponent(GlAlert);
const findWorkItemDetail = () => wrapper.findComponent(WorkItemDetail);
- const createComponent = ({ visible = true, workItemId = '1', canUpdate = false } = {}) => {
+ const createComponent = ({ workItemId = '1', error = false } = {}) => {
+ const apolloProvider = createMockApollo([
+ [
+ deleteWorkItemFromTaskMutation,
+ jest.fn().mockResolvedValue({
+ data: {
+ workItemDeleteTask: {
+ workItem: { id: 123, descriptionHtml: 'updated work item desc' },
+ errors: [],
+ },
+ },
+ }),
+ ],
+ ]);
+
wrapper = shallowMount(WorkItemDetailModal, {
- propsData: { visible, workItemId, canUpdate },
+ apolloProvider,
+ propsData: { workItemId },
+ data() {
+ return {
+ error,
+ };
+ },
stubs: {
GlModal,
},
@@ -28,31 +62,59 @@ describe('WorkItemDetailModal component', () => {
wrapper.destroy();
});
- describe.each([true, false])('when visible=%s', (visible) => {
- it(`${visible ? 'renders' : 'does not render'} modal`, () => {
- createComponent({ visible });
+ it('renders WorkItemDetail', () => {
+ createComponent();
- expect(findModal().props('visible')).toBe(visible);
+ expect(findWorkItemDetail().props()).toEqual({
+ workItemId: '1',
});
});
- it('renders heading', () => {
+ it('renders alert if there is an error', () => {
+ createComponent({ error: true });
+
+ expect(findAlert().exists()).toBe(true);
+ });
+
+ it('does not render alert if there is no error', () => {
createComponent();
- expect(wrapper.find('h2').text()).toBe('Work Item');
+ expect(findAlert().exists()).toBe(false);
});
- it('renders WorkItemDetail', () => {
+ it('dismisses the alert on `dismiss` emitted event', async () => {
+ createComponent({ error: true });
+ findAlert().vm.$emit('dismiss');
+ await nextTick();
+
+ expect(findAlert().exists()).toBe(false);
+ });
+
+ it('emits `close` event on hiding the modal', () => {
createComponent();
+ findModal().vm.$emit('hide');
- expect(findWorkItemDetail().props()).toEqual({ workItemId: '1' });
+ expect(wrapper.emitted('close')).toBeTruthy();
});
- it('shows work item actions', () => {
- createComponent({
- canUpdate: true,
- });
+ it('emits `workItemUpdated` event on updating work item', () => {
+ createComponent();
+ findWorkItemDetail().vm.$emit('workItemUpdated');
+
+ expect(wrapper.emitted('workItemUpdated')).toBeTruthy();
+ });
+
+ describe('delete work item', () => {
+ it('emits workItemDeleted and closes modal', async () => {
+ createComponent();
+ const newDesc = 'updated work item desc';
+
+ findWorkItemDetail().vm.$emit('deleteWorkItem');
- expect(findWorkItemActions().exists()).toBe(true);
+ await waitForPromises();
+
+ expect(wrapper.emitted('workItemDeleted')).toEqual([[newDesc]]);
+ expect(hideModal).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/frontend/work_items/components/work_item_state_spec.js b/spec/frontend/work_items/components/work_item_state_spec.js
new file mode 100644
index 00000000000..9e48f56d9e9
--- /dev/null
+++ b/spec/frontend/work_items/components/work_item_state_spec.js
@@ -0,0 +1,117 @@
+import { shallowMount } from '@vue/test-utils';
+import Vue from 'vue';
+import VueApollo from 'vue-apollo';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { mockTracking } from 'helpers/tracking_helper';
+import waitForPromises from 'helpers/wait_for_promises';
+import ItemState from '~/work_items/components/item_state.vue';
+import WorkItemState from '~/work_items/components/work_item_state.vue';
+import {
+ i18n,
+ STATE_OPEN,
+ STATE_CLOSED,
+ STATE_EVENT_CLOSE,
+ STATE_EVENT_REOPEN,
+} from '~/work_items/constants';
+import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
+import { updateWorkItemMutationResponse, workItemQueryResponse } from '../mock_data';
+
+describe('WorkItemState component', () => {
+ let wrapper;
+
+ Vue.use(VueApollo);
+
+ const mutationSuccessHandler = jest.fn().mockResolvedValue(updateWorkItemMutationResponse);
+
+ const findItemState = () => wrapper.findComponent(ItemState);
+
+ const createComponent = ({
+ state = STATE_OPEN,
+ mutationHandler = mutationSuccessHandler,
+ } = {}) => {
+ const { id, workItemType } = workItemQueryResponse.data.workItem;
+ wrapper = shallowMount(WorkItemState, {
+ apolloProvider: createMockApollo([[updateWorkItemMutation, mutationHandler]]),
+ propsData: {
+ workItem: {
+ id,
+ state,
+ workItemType,
+ },
+ },
+ });
+ };
+
+ afterEach(() => {
+ wrapper.destroy();
+ });
+
+ it('renders state', () => {
+ createComponent();
+
+ expect(findItemState().props('state')).toBe(workItemQueryResponse.data.workItem.state);
+ });
+
+ describe('when updating the state', () => {
+ it('calls a mutation', () => {
+ createComponent();
+
+ findItemState().vm.$emit('changed', STATE_CLOSED);
+
+ expect(mutationSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ id: workItemQueryResponse.data.workItem.id,
+ stateEvent: STATE_EVENT_CLOSE,
+ },
+ });
+ });
+
+ it('calls a mutation with REOPEN', () => {
+ createComponent({
+ state: STATE_CLOSED,
+ });
+
+ findItemState().vm.$emit('changed', STATE_OPEN);
+
+ expect(mutationSuccessHandler).toHaveBeenCalledWith({
+ input: {
+ id: workItemQueryResponse.data.workItem.id,
+ stateEvent: STATE_EVENT_REOPEN,
+ },
+ });
+ });
+
+ it('emits updated event', async () => {
+ createComponent();
+
+ findItemState().vm.$emit('changed', STATE_CLOSED);
+ await waitForPromises();
+
+ expect(wrapper.emitted('updated')).toEqual([[]]);
+ });
+
+ it('emits an error message when the mutation was unsuccessful', async () => {
+ createComponent({ mutationHandler: jest.fn().mockRejectedValue('Error!') });
+
+ findItemState().vm.$emit('changed', STATE_CLOSED);
+ await waitForPromises();
+
+ expect(wrapper.emitted('error')).toEqual([[i18n.updateError]]);
+ });
+
+ it('tracks editing the state', async () => {
+ const trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn);
+
+ createComponent();
+
+ findItemState().vm.$emit('changed', STATE_CLOSED);
+ await waitForPromises();
+
+ expect(trackingSpy).toHaveBeenCalledWith('workItems:show', 'updated_state', {
+ category: 'workItems:show',
+ label: 'item_state',
+ property: 'type_Task',
+ });
+ });
+ });
+});
diff --git a/spec/frontend/work_items/components/work_item_title_spec.js b/spec/frontend/work_items/components/work_item_title_spec.js
index 9b1ef2d14e4..19b56362ac0 100644
--- a/spec/frontend/work_items/components/work_item_title_spec.js
+++ b/spec/frontend/work_items/components/work_item_title_spec.js
@@ -1,4 +1,3 @@
-import { GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
@@ -18,15 +17,13 @@ describe('WorkItemTitle component', () => {
const mutationSuccessHandler = jest.fn().mockResolvedValue(updateWorkItemMutationResponse);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findItemTitle = () => wrapper.findComponent(ItemTitle);
- const createComponent = ({ loading = false, mutationHandler = mutationSuccessHandler } = {}) => {
+ const createComponent = ({ mutationHandler = mutationSuccessHandler } = {}) => {
const { id, title, workItemType } = workItemQueryResponse.data.workItem;
wrapper = shallowMount(WorkItemTitle, {
apolloProvider: createMockApollo([[updateWorkItemMutation, mutationHandler]]),
propsData: {
- loading,
workItemId: id,
workItemTitle: title,
workItemType: workItemType.name,
@@ -38,32 +35,10 @@ describe('WorkItemTitle component', () => {
wrapper.destroy();
});
- describe('when loading', () => {
- beforeEach(() => {
- createComponent({ loading: true });
- });
-
- it('renders loading spinner', () => {
- expect(findLoadingIcon().exists()).toBe(true);
- });
-
- it('does not render title', () => {
- expect(findItemTitle().exists()).toBe(false);
- });
- });
-
- describe('when loaded', () => {
- beforeEach(() => {
- createComponent({ loading: false });
- });
-
- it('does not render loading spinner', () => {
- expect(findLoadingIcon().exists()).toBe(false);
- });
+ it('renders title', () => {
+ createComponent();
- it('renders title', () => {
- expect(findItemTitle().props('title')).toBe(workItemQueryResponse.data.workItem.title);
- });
+ expect(findItemTitle().props('title')).toBe(workItemQueryResponse.data.workItem.title);
});
describe('when updating the title', () => {
@@ -82,6 +57,15 @@ describe('WorkItemTitle component', () => {
});
});
+ it('emits updated event', async () => {
+ createComponent();
+
+ findItemTitle().vm.$emit('title-changed', 'new title');
+ await waitForPromises();
+
+ expect(wrapper.emitted('updated')).toEqual([[]]);
+ });
+
it('does not call a mutation when the title has not changed', () => {
createComponent();
diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js
index 722e1708c15..f3483550013 100644
--- a/spec/frontend/work_items/mock_data.js
+++ b/spec/frontend/work_items/mock_data.js
@@ -4,11 +4,17 @@ export const workItemQueryResponse = {
__typename: 'WorkItem',
id: 'gid://gitlab/WorkItem/1',
title: 'Test',
+ state: 'OPEN',
+ description: 'description',
workItemType: {
__typename: 'WorkItemType',
id: 'gid://gitlab/WorkItems::Type/5',
name: 'Task',
},
+ userPermissions: {
+ deleteWorkItem: false,
+ updateWorkItem: false,
+ },
},
},
};
@@ -21,11 +27,17 @@ export const updateWorkItemMutationResponse = {
__typename: 'WorkItem',
id: 'gid://gitlab/WorkItem/1',
title: 'Updated title',
+ state: 'OPEN',
+ description: 'description',
workItemType: {
__typename: 'WorkItemType',
id: 'gid://gitlab/WorkItems::Type/5',
name: 'Task',
},
+ userPermissions: {
+ deleteWorkItem: false,
+ updateWorkItem: false,
+ },
},
},
},
@@ -39,6 +51,7 @@ export const projectWorkItemTypesQueryResponse = {
nodes: [
{ id: 'gid://gitlab/WorkItems::Type/1', name: 'Issue' },
{ id: 'gid://gitlab/WorkItems::Type/2', name: 'Incident' },
+ { id: 'gid://gitlab/WorkItems::Type/3', name: 'Task' },
],
},
},
@@ -53,11 +66,17 @@ export const createWorkItemMutationResponse = {
__typename: 'WorkItem',
id: 'gid://gitlab/WorkItem/1',
title: 'Updated title',
+ state: 'OPEN',
+ description: 'description',
workItemType: {
__typename: 'WorkItemType',
id: 'gid://gitlab/WorkItems::Type/5',
name: 'Task',
},
+ userPermissions: {
+ deleteWorkItem: false,
+ updateWorkItem: false,
+ },
},
},
},
@@ -72,6 +91,10 @@ export const createWorkItemFromTaskMutationResponse = {
descriptionHtml: '<p>New description</p>',
id: 'gid://gitlab/WorkItem/13',
__typename: 'WorkItem',
+ userPermissions: {
+ deleteWorkItem: false,
+ updateWorkItem: false,
+ },
},
},
},
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 fb1f1d56356..e89477ed599 100644
--- a/spec/frontend/work_items/pages/create_work_item_spec.js
+++ b/spec/frontend/work_items/pages/create_work_item_spec.js
@@ -158,6 +158,11 @@ describe('Create work item component', () => {
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', () => {
@@ -181,7 +186,7 @@ describe('Create work item component', () => {
});
it('displays a list of work item types', () => {
- expect(findSelect().attributes('options').split(',')).toHaveLength(3);
+ expect(findSelect().attributes('options').split(',')).toHaveLength(4);
});
it('selects a work item type on click', async () => {
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 1eb6c0145e7..9f87655175c 100644
--- a/spec/frontend/work_items/pages/work_item_detail_spec.js
+++ b/spec/frontend/work_items/pages/work_item_detail_spec.js
@@ -1,10 +1,11 @@
-import { GlAlert } from '@gitlab/ui';
+import { GlAlert, GlSkeletonLoader } 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 WorkItemDetail from '~/work_items/components/work_item_detail.vue';
+import WorkItemState from '~/work_items/components/work_item_state.vue';
import WorkItemTitle from '~/work_items/components/work_item_title.vue';
import { i18n } from '~/work_items/constants';
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
@@ -20,7 +21,9 @@ describe('WorkItemDetail component', () => {
const initialSubscriptionHandler = jest.fn().mockResolvedValue(workItemTitleSubscriptionResponse);
const findAlert = () => wrapper.findComponent(GlAlert);
+ const findSkeleton = () => wrapper.findComponent(GlSkeletonLoader);
const findWorkItemTitle = () => wrapper.findComponent(WorkItemTitle);
+ const findWorkItemState = () => wrapper.findComponent(WorkItemState);
const createComponent = ({
workItemId = workItemQueryResponse.data.workItem.id,
@@ -55,8 +58,10 @@ describe('WorkItemDetail component', () => {
createComponent();
});
- it('renders WorkItemTitle in loading state', () => {
- expect(findWorkItemTitle().props('loading')).toBe(true);
+ it('renders skeleton loader', () => {
+ expect(findSkeleton().exists()).toBe(true);
+ expect(findWorkItemState().exists()).toBe(false);
+ expect(findWorkItemTitle().exists()).toBe(false);
});
});
@@ -66,8 +71,10 @@ describe('WorkItemDetail component', () => {
return waitForPromises();
});
- it('does not render WorkItemTitle in loading state', () => {
- expect(findWorkItemTitle().props('loading')).toBe(false);
+ it('does not render skeleton', () => {
+ expect(findSkeleton().exists()).toBe(false);
+ expect(findWorkItemState().exists()).toBe(true);
+ expect(findWorkItemTitle().exists()).toBe(true);
});
});
@@ -82,6 +89,7 @@ describe('WorkItemDetail component', () => {
it('shows an error message when WorkItemTitle emits an `error` event', async () => {
createComponent();
+ await waitForPromises();
findWorkItemTitle().vm.$emit('error', i18n.updateError);
await waitForPromises();
@@ -96,4 +104,18 @@ describe('WorkItemDetail component', () => {
issuableId: workItemQueryResponse.data.workItem.id,
});
});
+
+ it('emits workItemUpdated event when fields updated', async () => {
+ createComponent();
+
+ await waitForPromises();
+
+ findWorkItemState().vm.$emit('updated');
+
+ expect(wrapper.emitted('workItemUpdated')).toEqual([[]]);
+
+ findWorkItemTitle().vm.$emit('updated');
+
+ expect(wrapper.emitted('workItemUpdated')).toEqual([[], []]);
+ });
});
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 2803724b9af..85096392e84 100644
--- a/spec/frontend/work_items/pages/work_item_root_spec.js
+++ b/spec/frontend/work_items/pages/work_item_root_spec.js
@@ -1,21 +1,45 @@
+import { GlAlert } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
+import waitForPromises from 'helpers/wait_for_promises';
+import createMockApollo from 'helpers/mock_apollo_helper';
+import { visitUrl } from '~/lib/utils/url_utility';
import WorkItemDetail from '~/work_items/components/work_item_detail.vue';
import WorkItemsRoot from '~/work_items/pages/work_item_root.vue';
+import deleteWorkItem from '~/work_items/graphql/delete_work_item.mutation.graphql';
+import { deleteWorkItemResponse, deleteWorkItemFailureResponse } from '../mock_data';
+
+jest.mock('~/lib/utils/url_utility', () => ({
+ visitUrl: jest.fn(),
+}));
Vue.use(VueApollo);
describe('Work items root component', () => {
let wrapper;
+ const issuesListPath = '/-/issues';
+ const mockToastShow = jest.fn();
const findWorkItemDetail = () => wrapper.findComponent(WorkItemDetail);
+ const findAlert = () => wrapper.findComponent(GlAlert);
- const createComponent = () => {
+ const createComponent = ({
+ deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse),
+ } = {}) => {
wrapper = shallowMount(WorkItemsRoot, {
+ apolloProvider: createMockApollo([[deleteWorkItem, deleteWorkItemHandler]]),
+ provide: {
+ issuesListPath,
+ },
propsData: {
id: '1',
},
+ mocks: {
+ $toast: {
+ show: mockToastShow,
+ },
+ },
});
};
@@ -26,6 +50,38 @@ describe('Work items root component', () => {
it('renders WorkItemDetail', () => {
createComponent();
- expect(findWorkItemDetail().props()).toEqual({ workItemId: 'gid://gitlab/WorkItem/1' });
+ expect(findWorkItemDetail().props()).toEqual({
+ workItemId: 'gid://gitlab/WorkItem/1',
+ });
+ });
+
+ it('deletes work item when deleteWorkItem event emitted', async () => {
+ const deleteWorkItemHandler = jest.fn().mockResolvedValue(deleteWorkItemResponse);
+
+ createComponent({
+ deleteWorkItemHandler,
+ });
+
+ findWorkItemDetail().vm.$emit('deleteWorkItem');
+
+ await waitForPromises();
+
+ expect(deleteWorkItemHandler).toHaveBeenCalled();
+ expect(mockToastShow).toHaveBeenCalled();
+ expect(visitUrl).toHaveBeenCalledWith(issuesListPath);
+ });
+
+ it('shows alert if delete fails', async () => {
+ const deleteWorkItemHandler = jest.fn().mockRejectedValue(deleteWorkItemFailureResponse);
+
+ createComponent({
+ deleteWorkItemHandler,
+ });
+
+ findWorkItemDetail().vm.$emit('deleteWorkItem');
+
+ await waitForPromises();
+
+ expect(findAlert().exists()).toBe(true);
});
});
diff --git a/spec/frontend/work_items/router_spec.js b/spec/frontend/work_items/router_spec.js
index 7e68c5e4f0e..99dcd886f7b 100644
--- a/spec/frontend/work_items/router_spec.js
+++ b/spec/frontend/work_items/router_spec.js
@@ -17,6 +17,7 @@ describe('Work items router', () => {
router,
provide: {
fullPath: 'full-path',
+ issuesListPath: 'full-path/-/issues',
},
mocks: {
$apollo: {
diff --git a/spec/frontend/zen_mode_spec.js b/spec/frontend/zen_mode_spec.js
index 44684619fae..a88910b2613 100644
--- a/spec/frontend/zen_mode_spec.js
+++ b/spec/frontend/zen_mode_spec.js
@@ -3,6 +3,7 @@ import MockAdapter from 'axios-mock-adapter';
import Dropzone from 'dropzone';
import $ from 'jquery';
import Mousetrap from 'mousetrap';
+import { loadHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import GLForm from '~/gl_form';
import * as utils from '~/lib/utils/common_utils';
import ZenMode from '~/zen_mode';
@@ -33,7 +34,7 @@ describe('ZenMode', () => {
mock = new MockAdapter(axios);
mock.onGet().reply(200);
- loadFixtures(fixtureName);
+ loadHTMLFixture(fixtureName);
const form = $('.js-new-note-form');
new GLForm(form); // eslint-disable-line no-new
@@ -45,8 +46,10 @@ describe('ZenMode', () => {
// Set this manually because we can't actually scroll the window
zen.scroll_position = 456;
+ });
- gon.features = { markdownContinueLists: true };
+ afterEach(() => {
+ resetHTMLFixture();
});
describe('enabling dropzone', () => {
diff --git a/spec/frontend_integration/fly_out_nav_browser_spec.js b/spec/frontend_integration/fly_out_nav_browser_spec.js
index ef2afa20528..47f3c6a0ac2 100644
--- a/spec/frontend_integration/fly_out_nav_browser_spec.js
+++ b/spec/frontend_integration/fly_out_nav_browser_spec.js
@@ -184,19 +184,21 @@ describe('Fly out sidebar navigation', () => {
mockBoundingRects();
});
- it('shows sub-items after 0ms if no menu is open', (done) => {
+ it('shows sub-items after 0ms if no menu is open', () => {
const subItems = findSubItems();
mouseEnterTopItems(el);
expect(getHideSubItemsInterval()).toBe(0);
- setTimeout(() => {
- expect(subItems.style.display).toBe('block');
- done();
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ expect(subItems.style.display).toBe('block');
+ resolve();
+ });
});
});
- it('shows sub-items after 300ms if a menu is currently open', (done) => {
+ it('shows sub-items after 300ms if a menu is currently open', () => {
const subItems = findSubItems();
documentMouseMove({
@@ -213,10 +215,11 @@ describe('Fly out sidebar navigation', () => {
mouseEnterTopItems(el, 0);
- setTimeout(() => {
- expect(subItems.style.display).toBe('block');
-
- done();
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ expect(subItems.style.display).toBe('block');
+ resolve();
+ });
});
});
});
diff --git a/spec/frontend_integration/ide/helpers/ide_helper.js b/spec/frontend_integration/ide/helpers/ide_helper.js
index 00ce39a5598..8c5ff816c74 100644
--- a/spec/frontend_integration/ide/helpers/ide_helper.js
+++ b/spec/frontend_integration/ide/helpers/ide_helper.js
@@ -24,13 +24,19 @@ export const switchLeftSidebarTab = (name) => {
export const getStatusBar = () => document.querySelector('.ide-status-bar');
export const waitForMonacoEditor = () =>
- new Promise((resolve) => monacoEditor.onDidCreateEditor(resolve));
+ new Promise((resolve) => {
+ monacoEditor.onDidCreateEditor(resolve);
+ });
export const waitForEditorDispose = (instance) =>
- new Promise((resolve) => instance.onDidDispose(resolve));
+ new Promise((resolve) => {
+ instance.onDidDispose(resolve);
+ });
export const waitForEditorModelChange = (instance) =>
- new Promise((resolve) => instance.onDidChangeModel(resolve));
+ new Promise((resolve) => {
+ instance.onDidChangeModel(resolve);
+ });
export const findMonacoEditor = () =>
screen.findAllByLabelText(/Editor content;/).then(([x]) => x.closest('.monaco-editor'));
diff --git a/spec/frontend_integration/ide/ide_integration_spec.js b/spec/frontend_integration/ide/ide_integration_spec.js
index aad9b9e526c..a002ce91deb 100644
--- a/spec/frontend_integration/ide/ide_integration_spec.js
+++ b/spec/frontend_integration/ide/ide_integration_spec.js
@@ -1,4 +1,5 @@
import { nextTick } from 'vue';
+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';
@@ -17,13 +18,14 @@ describe('WebIDE', () => {
// For some reason these tests were timing out in CI.
// We will investigate in https://gitlab.com/gitlab-org/gitlab/-/issues/298714
setTestTimeout(20000);
- setFixtures('<div class="webide-container"></div>');
+ setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
});
afterEach(() => {
vm.$destroy();
vm = null;
+ resetHTMLFixture();
});
it('user commits changes', async () => {
diff --git a/spec/frontend_integration/ide/user_opens_file_spec.js b/spec/frontend_integration/ide/user_opens_file_spec.js
index 2cb3363ef85..c3131f6ad45 100644
--- a/spec/frontend_integration/ide/user_opens_file_spec.js
+++ b/spec/frontend_integration/ide/user_opens_file_spec.js
@@ -1,4 +1,5 @@
import { screen } from '@testing-library/dom';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -10,7 +11,7 @@ describe('IDE: User opens a file in the Web IDE', () => {
let container;
beforeEach(async () => {
- setFixtures('<div class="webide-container"></div>');
+ setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
vm = startWebIDE(container);
@@ -21,6 +22,7 @@ describe('IDE: User opens a file in the Web IDE', () => {
afterEach(() => {
vm.$destroy();
vm = null;
+ resetHTMLFixture();
});
describe('user opens a directory', () => {
diff --git a/spec/frontend_integration/ide/user_opens_ide_spec.js b/spec/frontend_integration/ide/user_opens_ide_spec.js
index c9d78d1de8f..b2b85452451 100644
--- a/spec/frontend_integration/ide/user_opens_ide_spec.js
+++ b/spec/frontend_integration/ide/user_opens_ide_spec.js
@@ -1,4 +1,5 @@
import { screen } from '@testing-library/dom';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import { useOverclockTimers } from 'test_helpers/utils/overclock_timers';
import * as ideHelper from './helpers/ide_helper';
import startWebIDE from './helpers/start';
@@ -10,13 +11,14 @@ describe('IDE: User opens IDE', () => {
let container;
beforeEach(() => {
- setFixtures('<div class="webide-container"></div>');
+ setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
});
afterEach(() => {
vm.$destroy();
vm = null;
+ resetHTMLFixture();
});
it('shows loading indicator while the IDE is loading', async () => {
diff --git a/spec/frontend_integration/ide/user_opens_mr_spec.js b/spec/frontend_integration/ide/user_opens_mr_spec.js
index 3ffc5169351..084aae9f297 100644
--- a/spec/frontend_integration/ide/user_opens_mr_spec.js
+++ b/spec/frontend_integration/ide/user_opens_mr_spec.js
@@ -1,4 +1,5 @@
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 * as ideHelper from './helpers/ide_helper';
@@ -19,7 +20,7 @@ describe('IDE: User opens Merge Request', () => {
changes = getRelevantChanges();
- setFixtures('<div class="webide-container"></div>');
+ setHTMLFixture('<div class="webide-container"></div>');
container = document.querySelector('.webide-container');
vm = startWebIDE(container, { mrId });
@@ -31,6 +32,7 @@ describe('IDE: User opens Merge Request', () => {
afterEach(() => {
vm.$destroy();
vm = null;
+ resetHTMLFixture();
});
const findAllTabs = () => Array.from(document.querySelectorAll('.multi-file-tab'));
diff --git a/spec/frontend_integration/lib/utils/browser_spec.js b/spec/frontend_integration/lib/utils/browser_spec.js
index 6c72e29076d..c9e99af2889 100644
--- a/spec/frontend_integration/lib/utils/browser_spec.js
+++ b/spec/frontend_integration/lib/utils/browser_spec.js
@@ -1,4 +1,5 @@
import { GlBreakpointInstance as breakpointInstance } from '@gitlab/ui/dist/utils';
+import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
import * as commonUtils from '~/lib/utils/common_utils';
describe('common_utils browser specific specs', () => {
@@ -14,7 +15,7 @@ describe('common_utils browser specific specs', () => {
it('does not add height for fileTitle or compareVersionsHeader if screen is too small', () => {
jest.spyOn(breakpointInstance, 'isDesktop').mockReturnValue(false);
- setFixtures(`
+ setHTMLFixture(`
<div class="diff-file file-title-flex-parent">
blah blah blah
</div>
@@ -24,12 +25,14 @@ describe('common_utils browser specific specs', () => {
`);
expect(commonUtils.contentTop()).toBe(0);
+
+ resetHTMLFixture();
});
it('adds height for fileTitle and compareVersionsHeader screen is large enough', () => {
jest.spyOn(breakpointInstance, 'isDesktop').mockReturnValue(true);
- setFixtures(`
+ setHTMLFixture(`
<div class="diff-file file-title-flex-parent">
blah blah blah
</div>
@@ -41,6 +44,8 @@ describe('common_utils browser specific specs', () => {
mockOffsetHeight(document.querySelector('.diff-file'), 100);
mockOffsetHeight(document.querySelector('.mr-version-controls'), 18);
expect(commonUtils.contentTop()).toBe(18);
+
+ resetHTMLFixture();
});
});
diff --git a/spec/graphql/mutations/base_mutation_spec.rb b/spec/graphql/mutations/base_mutation_spec.rb
index 7939fadb37b..6b366b0c234 100644
--- a/spec/graphql/mutations/base_mutation_spec.rb
+++ b/spec/graphql/mutations/base_mutation_spec.rb
@@ -15,6 +15,7 @@ RSpec.describe ::Mutations::BaseMutation do
context 'when argument is nullable and required' do
let(:mutation_class) do
Class.new(described_class) do
+ graphql_name 'BaseMutation'
argument :foo, GraphQL::Types::String, required: :nullable
end
end
@@ -35,6 +36,7 @@ RSpec.describe ::Mutations::BaseMutation do
context 'when argument is required and NOT nullable' do
let(:mutation_class) do
Class.new(described_class) do
+ graphql_name 'BaseMutation'
argument :foo, GraphQL::Types::String, required: true
end
end
diff --git a/spec/graphql/mutations/boards/update_spec.rb b/spec/graphql/mutations/boards/update_spec.rb
index da3dfeecd4d..4785bc94624 100644
--- a/spec/graphql/mutations/boards/update_spec.rb
+++ b/spec/graphql/mutations/boards/update_spec.rb
@@ -29,14 +29,6 @@ RSpec.describe Mutations::Boards::Update do
end
end
- context 'with invalid params' do
- it 'raises an error' do
- mutation_params[:id] = project.to_global_id
-
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- end
- end
-
context 'when user can update board' do
before do
board.resource_parent.add_reporter(user)
diff --git a/spec/graphql/mutations/ci/runner/delete_spec.rb b/spec/graphql/mutations/ci/runner/delete_spec.rb
index ee640b21918..06d360430f8 100644
--- a/spec/graphql/mutations/ci/runner/delete_spec.rb
+++ b/spec/graphql/mutations/ci/runner/delete_spec.rb
@@ -44,14 +44,6 @@ RSpec.describe Mutations::Ci::Runner::Delete do
end
end
- context 'with invalid params' do
- let(:mutation_params) { { id: "invalid-id" } }
-
- it 'raises an error' do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- end
- end
-
context 'when required arguments are missing' do
let(:mutation_params) { {} }
diff --git a/spec/graphql/mutations/ci/runner/update_spec.rb b/spec/graphql/mutations/ci/runner/update_spec.rb
index 0b3489d37dc..75e9b57e60a 100644
--- a/spec/graphql/mutations/ci/runner/update_spec.rb
+++ b/spec/graphql/mutations/ci/runner/update_spec.rb
@@ -33,14 +33,6 @@ RSpec.describe Mutations::Ci::Runner::Update do
end
end
- context 'with invalid params' do
- it 'raises an error' do
- mutation_params[:id] = "invalid-id"
-
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- end
- end
-
context 'when required arguments are missing' do
let(:mutation_params) { {} }
diff --git a/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb b/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
index fc025c8e3d3..45d421509d0 100644
--- a/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
+++ b/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
@@ -48,14 +48,6 @@ RSpec.describe Mutations::Clusters::AgentTokens::Create do
expect(token.description).to eq(description)
expect(token.name).to eq(name)
end
-
- context 'invalid params' do
- subject { mutation.resolve(cluster_agent_id: cluster_agent.id) }
-
- it 'generates an error message when id invalid', :aggregate_failures do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- end
- end
end
end
end
diff --git a/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb b/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb
deleted file mode 100644
index 5cdbc0f6d72..00000000000
--- a/spec/graphql/mutations/clusters/agent_tokens/delete_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Mutations::Clusters::AgentTokens::Delete do
- let(:token) { create(:cluster_agent_token) }
- let(:user) { create(:user) }
-
- let(:mutation) do
- described_class.new(
- object: double,
- context: { current_user: user },
- field: double
- )
- end
-
- it { expect(described_class.graphql_name).to eq('ClusterAgentTokenDelete') }
- it { expect(described_class).to require_graphql_authorizations(:admin_cluster) }
-
- describe '#resolve' do
- let(:global_id) { token.to_global_id }
-
- subject { mutation.resolve(id: global_id) }
-
- context 'without user permissions' do
- it 'fails to delete the cluster agent', :aggregate_failures do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
- expect { token.reload }.not_to raise_error
- end
- end
-
- context 'with user permissions' do
- before do
- token.agent.project.add_maintainer(user)
- end
-
- it 'deletes a cluster agent', :aggregate_failures do
- expect { subject }.to change { ::Clusters::AgentToken.count }.by(-1)
- expect { token.reload }.to raise_error(ActiveRecord::RecordNotFound)
- end
- end
-
- context 'with invalid params' do
- let(:global_id) { token.id }
-
- it 'raises an error if the cluster agent id is invalid', :aggregate_failures do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- expect { token.reload }.not_to raise_error
- end
- end
- end
-end
diff --git a/spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb b/spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb
index f5f4c0cefad..1dd4eece246 100644
--- a/spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb
+++ b/spec/graphql/mutations/clusters/agent_tokens/revoke_spec.rb
@@ -40,16 +40,6 @@ RSpec.describe Mutations::Clusters::AgentTokens::Revoke do
expect(token.reload).to be_revoked
end
-
- context 'supplied ID is invalid' do
- let(:global_id) { token.id }
-
- it 'raises a coercion error' do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
-
- expect(token.reload).not_to be_revoked
- end
- end
end
end
end
diff --git a/spec/graphql/mutations/clusters/agents/delete_spec.rb b/spec/graphql/mutations/clusters/agents/delete_spec.rb
index 0aabf53391a..e0ecff5fe44 100644
--- a/spec/graphql/mutations/clusters/agents/delete_spec.rb
+++ b/spec/graphql/mutations/clusters/agents/delete_spec.rb
@@ -38,14 +38,5 @@ RSpec.describe Mutations::Clusters::Agents::Delete do
expect { cluster_agent.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
-
- context 'with invalid params' do
- subject { mutation.resolve(id: cluster_agent.id) }
-
- it 'raises an error if the cluster agent id is invalid', :aggregate_failures do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
- expect { cluster_agent.reload }.not_to raise_error
- end
- end
end
end
diff --git a/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb b/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb
index 37e0fd611e4..451f6d1fe06 100644
--- a/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb
+++ b/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe Mutations::FindsByGid do
end
end
- let(:query) { double('Query', schema: GitlabSchema) }
+ let(:query) { query_double(schema: GitlabSchema) }
let(:context) { GraphQL::Query::Context.new(query: query, object: nil, values: { current_user: user }) }
let(:user) { create(:user) }
let(:gid) { user.to_global_id }
diff --git a/spec/graphql/mutations/container_expiration_policies/update_spec.rb b/spec/graphql/mutations/container_expiration_policies/update_spec.rb
index e22fb951172..e070336ef76 100644
--- a/spec/graphql/mutations/container_expiration_policies/update_spec.rb
+++ b/spec/graphql/mutations/container_expiration_policies/update_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Mutations::ContainerExpirationPolicies::Update do
let(:container_expiration_policy) { project.container_expiration_policy }
let(:params) { { project_path: project.full_path, cadence: '3month', keep_n: 100, older_than: '14d' } }
- specify { expect(described_class).to require_graphql_authorizations(:destroy_container_image) }
+ specify { expect(described_class).to require_graphql_authorizations(:admin_container_image) }
describe '#resolve' do
subject { described_class.new(object: project, context: { current_user: user }, field: nil).resolve(**params) }
@@ -76,7 +76,7 @@ RSpec.describe Mutations::ContainerExpirationPolicies::Update do
context 'with existing container expiration policy' do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the container expiration policy'
- :developer | 'updating the container expiration policy'
+ :developer | 'denying access to container expiration policy'
:reporter | 'denying access to container expiration policy'
:guest | 'denying access to container expiration policy'
:anonymous | 'denying access to container expiration policy'
@@ -96,7 +96,7 @@ RSpec.describe Mutations::ContainerExpirationPolicies::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the container expiration policy'
- :developer | 'creating the container expiration policy'
+ :developer | 'denying access to container expiration policy'
:reporter | 'denying access to container expiration policy'
:guest | 'denying access to container expiration policy'
:anonymous | 'denying access to container expiration policy'
diff --git a/spec/graphql/mutations/container_repositories/destroy_spec.rb b/spec/graphql/mutations/container_repositories/destroy_spec.rb
index 3903196a511..97da7846339 100644
--- a/spec/graphql/mutations/container_repositories/destroy_spec.rb
+++ b/spec/graphql/mutations/container_repositories/destroy_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Mutations::ContainerRepositories::Destroy do
let_it_be(:user) { create(:user) }
let(:project) { container_repository.project }
- let(:id) { container_repository.to_global_id.to_s }
+ let(:id) { container_repository.to_global_id }
specify { expect(described_class).to require_graphql_authorizations(:destroy_container_image) }
@@ -57,11 +57,5 @@ RSpec.describe Mutations::ContainerRepositories::Destroy do
it_behaves_like params[:shared_examples_name]
end
end
-
- context 'with invalid id' do
- let(:id) { 'gid://gitlab/ContainerRepository/5555' }
-
- it_behaves_like 'denying access to container respository'
- end
end
end
diff --git a/spec/graphql/mutations/container_repositories/destroy_tags_spec.rb b/spec/graphql/mutations/container_repositories/destroy_tags_spec.rb
index f22d9ffe753..3e5f28ee244 100644
--- a/spec/graphql/mutations/container_repositories/destroy_tags_spec.rb
+++ b/spec/graphql/mutations/container_repositories/destroy_tags_spec.rb
@@ -3,10 +3,12 @@
require 'spec_helper'
RSpec.describe Mutations::ContainerRepositories::DestroyTags do
+ include GraphqlHelpers
+
include_context 'container repository delete tags service shared context'
using RSpec::Parameterized::TableSyntax
- let(:id) { repository.to_global_id.to_s }
+ let(:id) { repository.to_global_id }
specify { expect(described_class).to require_graphql_authorizations(:destroy_container_image) }
@@ -67,8 +69,8 @@ RSpec.describe Mutations::ContainerRepositories::DestroyTags do
end
end
- context 'with invalid id' do
- let(:id) { 'gid://gitlab/ContainerRepository/5555' }
+ context 'with non-existing id' do
+ let(:id) { global_id_of(id: non_existing_record_id, model_name: 'ContainerRepository') }
it_behaves_like 'denying access to container respository'
end
diff --git a/spec/graphql/mutations/customer_relations/contacts/create_spec.rb b/spec/graphql/mutations/customer_relations/contacts/create_spec.rb
index d17d11305b1..dafc7b4c367 100644
--- a/spec/graphql/mutations/customer_relations/contacts/create_spec.rb
+++ b/spec/graphql/mutations/customer_relations/contacts/create_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Mutations::CustomerRelations::Contacts::Create do
+ include GraphqlHelpers
+
let_it_be(:user) { create(:user) }
let(:group) { create(:group, :crm_enabled) }
@@ -78,9 +80,9 @@ RSpec.describe Mutations::CustomerRelations::Contacts::Create do
end
end
- context 'when organization_id is invalid' do
+ context 'when organization does not exist' do
before do
- valid_params[:organization_id] = "gid://gitlab/CustomerRelations::Organization/#{non_existing_record_id}"
+ valid_params[:organization_id] = global_id_of(model_name: 'CustomerRelations::Organization', id: non_existing_record_id)
end
it 'returns the relevant error' do
diff --git a/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb b/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
index 35d3224d5ba..ae368e4d37e 100644
--- a/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
+++ b/spec/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Mutations::DependencyProxy::GroupSettings::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the dependency proxy group settings'
- :developer | 'updating the dependency proxy group settings'
+ :developer | 'denying access to dependency proxy group settings'
:reporter | 'denying access to dependency proxy group settings'
:guest | 'denying access to dependency proxy group settings'
:anonymous | 'denying access to dependency proxy group settings'
diff --git a/spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb b/spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
index 792e87f0d25..1e5059d7ef7 100644
--- a/spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
+++ b/spec/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe Mutations::DependencyProxy::ImageTtlGroupPolicy::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the dependency proxy image ttl policy'
- :developer | 'updating the dependency proxy image ttl policy'
+ :developer | 'denying access to dependency proxy image ttl policy'
:reporter | 'denying access to dependency proxy image ttl policy'
:guest | 'denying access to dependency proxy image ttl policy'
:anonymous | 'denying access to dependency proxy image ttl policy'
@@ -92,7 +92,7 @@ RSpec.describe Mutations::DependencyProxy::ImageTtlGroupPolicy::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the dependency proxy image ttl policy'
- :developer | 'creating the dependency proxy image ttl policy'
+ :developer | 'denying access to dependency proxy image ttl policy'
:reporter | 'denying access to dependency proxy image ttl policy'
:guest | 'denying access to dependency proxy image ttl policy'
:anonymous | 'denying access to dependency proxy image ttl policy'
diff --git a/spec/graphql/mutations/discussions/toggle_resolve_spec.rb b/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
index 2041b86d6e7..3f7347798e5 100644
--- a/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
+++ b/spec/graphql/mutations/discussions/toggle_resolve_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Mutations::Discussions::ToggleResolve do
+ include GraphqlHelpers
+
subject(:mutation) do
described_class.new(object: nil, context: { current_user: user }, field: nil)
end
@@ -15,7 +17,7 @@ RSpec.describe Mutations::Discussions::ToggleResolve do
mutation.resolve(id: id_arg, resolve: resolve_arg)
end
- let(:id_arg) { discussion.to_global_id.to_s }
+ let(:id_arg) { global_id_of(discussion) }
let(:resolve_arg) { true }
let(:mutated_discussion) { subject[:discussion] }
let(:errors) { subject[:errors] }
@@ -36,7 +38,7 @@ RSpec.describe Mutations::Discussions::ToggleResolve do
let_it_be(:user) { create(:user, developer_projects: [project]) }
context 'when discussion cannot be found' do
- let(:id_arg) { "#{discussion.to_global_id}foo" }
+ let(:id_arg) { global_id_of(id: non_existing_record_id, model_name: discussion.class.name) }
it 'raises an error' do
expect { subject }.to raise_error(
@@ -46,17 +48,6 @@ RSpec.describe Mutations::Discussions::ToggleResolve do
end
end
- context 'when discussion is not a Discussion' do
- let(:discussion) { create(:note, noteable: noteable, project: project) }
-
- it 'raises an error' do
- expect { subject }.to raise_error(
- GraphQL::CoercionError,
- "\"#{discussion.to_global_id}\" does not represent an instance of Discussion"
- )
- end
- end
-
shared_examples 'returns a resolved discussion without errors' do
it 'returns a resolved discussion' do
expect(mutated_discussion).to be_resolved
diff --git a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
index fdf9cbaf25b..b93fb36a8ff 100644
--- a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
+++ b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe Mutations::Environments::CanaryIngress::Update do
describe '#resolve' do
subject { mutation.resolve(id: environment_id, weight: weight) }
- let(:environment_id) { environment.to_global_id.to_s }
+ let(:environment_id) { environment.to_global_id }
let(:weight) { 50 }
let(:update_service) { double('update_service') }
@@ -62,14 +62,6 @@ RSpec.describe Mutations::Environments::CanaryIngress::Update do
end
end
- context 'when environment is not found' do
- let(:environment_id) { non_existing_record_id.to_s }
-
- it 'raises an error' do
- expect { subject }.to raise_error(GraphQL::CoercionError)
- end
- end
-
context 'when user is reporter who does not have permission to access the environment' do
let(:user) { reporter }
diff --git a/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb
new file mode 100644
index 00000000000..63faecad5d5
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/create_spec.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Create do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ let(:args) { { note: 'note', occurred_at: Time.current } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(incident_id: incident.to_global_id, **args) }
+
+ context 'when a user has permissions to create a timeline event' do
+ let(:expected_timeline_event) do
+ instance_double(
+ 'IncidentManagement::TimelineEvent',
+ note: args[:note],
+ occurred_at: args[:occurred_at].to_s,
+ incident: incident,
+ author: current_user,
+ promoted_from_note: nil
+ )
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'creating an incident timeline event'
+
+ context 'when TimelineEvents::CreateService responds with an error' do
+ let(:args) { {} }
+
+ it_behaves_like 'responding with an incident timeline errors',
+ errors: ["Occurred at can't be blank, Note can't be blank, and Note html can't be blank"]
+ end
+ end
+
+ it_behaves_like 'failing to create an incident timeline event'
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
new file mode 100644
index 00000000000..4dd7b2ccb14
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Destroy do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ let(:timeline_event) { create(:incident_management_timeline_event, incident: incident, project: project) }
+ let(:args) { { id: timeline_event.to_global_id } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(**args) }
+
+ context 'when a user has permissions to delete timeline event' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ context 'when TimelineEvents::DestroyService responds with success' do
+ it 'returns the timeline event with no errors' do
+ expect(resolve).to eq(
+ timeline_event: timeline_event,
+ errors: []
+ )
+ end
+ end
+
+ context 'when TimelineEvents::DestroyService responds with an error' do
+ before do
+ allow_next_instance_of(::IncidentManagement::TimelineEvents::DestroyService) do |service|
+ allow(service)
+ .to receive(:execute)
+ .and_return(ServiceResponse.error(payload: { timeline_event: nil }, message: 'An error has occurred'))
+ end
+ end
+
+ it 'returns errors' do
+ expect(resolve).to eq(
+ timeline_event: nil,
+ errors: ['An error has occurred']
+ )
+ end
+ end
+ end
+
+ context 'when a user has no permissions to delete timeline event' do
+ before do
+ project.add_guest(current_user)
+ end
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
new file mode 100644
index 00000000000..598ee496cf1
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::PromoteFromNote do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:comment) { create(:note, project: project, noteable: incident) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:issue_comment) { create(:note, project: project, noteable: issue) }
+ let_it_be(:alert) { create(:alert_management_alert, project: project) }
+ let_it_be(:alert_comment) { create(:note, project: project, noteable: alert) }
+
+ let(:args) { { note_id: comment.to_global_id.to_s } }
+
+ specify { expect(described_class).to require_graphql_authorizations(:admin_incident_management_timeline_event) }
+
+ describe '#resolve' do
+ subject(:resolve) { mutation_for(project, current_user).resolve(**args) }
+
+ context 'when a user has permissions to create timeline event' do
+ let(:expected_timeline_event) do
+ instance_double(
+ 'IncidentManagement::TimelineEvent',
+ note: comment.note,
+ occurred_at: comment.created_at.to_s,
+ incident: incident,
+ author: current_user,
+ promoted_from_note: comment
+ )
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it_behaves_like 'creating an incident timeline event'
+
+ context 'when TimelineEvents::CreateService responds with an error' do
+ before do
+ allow_next_instance_of(::IncidentManagement::TimelineEvents::CreateService) do |service|
+ allow(service).to receive(:execute).and_return(
+ ServiceResponse.error(payload: { timeline_event: nil }, message: 'Some error')
+ )
+ end
+ end
+
+ it_behaves_like 'responding with an incident timeline errors', errors: ['Some error']
+ end
+ end
+
+ context 'when note does not exist' do
+ let(:args) { { note_id: 'gid://gitlab/Note/0' } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when note does not belong to an incident' do
+ let(:args) { { note_id: issue_comment.to_global_id.to_s } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when note belongs to anything else but issuable' do
+ let(:args) { { note_id: alert_comment.to_global_id.to_s } }
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ it_behaves_like 'failing to create an incident timeline event'
+ end
+
+ private
+
+ def mutation_for(project, user)
+ described_class.new(object: project, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb b/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb
new file mode 100644
index 00000000000..8296e5c6c15
--- /dev/null
+++ b/spec/graphql/mutations/incident_management/timeline_event/update_spec.rb
@@ -0,0 +1,100 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::IncidentManagement::TimelineEvent::Update do
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be_with_reload(:timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let(:args) do
+ {
+ id: timeline_event_id,
+ note: note,
+ occurred_at: occurred_at
+ }
+ end
+
+ let(:note) { 'Updated Note' }
+ let(:timeline_event_id) { GitlabSchema.id_from_object(timeline_event).to_s }
+ let(:occurred_at) { 1.minute.ago }
+
+ before do
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ end
+
+ describe '#resolve' do
+ let(:current_user) { developer }
+
+ subject(:resolve) { mutation_for(current_user).resolve(**args) }
+
+ shared_examples 'failed update with a top-level access error' do |error|
+ specify do
+ expect { resolve }.to raise_error(
+ Gitlab::Graphql::Errors::ResourceNotAvailable,
+ error || Gitlab::Graphql::Authorize::AuthorizeResource::RESOURCE_ACCESS_ERROR
+ )
+ end
+ end
+
+ context 'when user has permissions to update the timeline event' do
+ context 'when timeline event exists' do
+ it 'updates the timeline event' do
+ expect { resolve }.to change { timeline_event.reload.note }.to(note)
+ .and change { timeline_event.reload.occurred_at.to_s }.to(occurred_at.to_s)
+ end
+
+ it 'returns updated timeline event' do
+ expect(resolve).to eq(
+ timeline_event: timeline_event.reload,
+ errors: []
+ )
+ end
+
+ context 'when there is a validation error' do
+ let(:occurred_at) { 'invalid date' }
+
+ it 'does not update the timeline event' do
+ expect { resolve }.not_to change { timeline_event.reload.updated_at }
+ end
+
+ it 'responds with error' do
+ expect(resolve).to eq(
+ timeline_event: nil,
+ errors: ["Occurred at can't be blank"]
+ )
+ end
+ end
+ end
+
+ context 'when timeline event cannot be found' do
+ let(:timeline_event_id) do
+ Gitlab::GlobalId.build(
+ nil,
+ model_name: ::IncidentManagement::TimelineEvent.name,
+ id: non_existing_record_id
+ ).to_s
+ end
+
+ it_behaves_like 'failed update with a top-level access error'
+ end
+ end
+
+ context 'when user does not have permissions to update the timeline event' do
+ let(:current_user) { reporter }
+
+ it_behaves_like 'failed update with a top-level access error'
+ end
+ end
+
+ private
+
+ def mutation_for(user)
+ described_class.new(object: nil, context: { current_user: user }, field: nil)
+ end
+end
diff --git a/spec/graphql/mutations/issues/set_due_date_spec.rb b/spec/graphql/mutations/issues/set_due_date_spec.rb
index 263122e5d5f..83edd670695 100644
--- a/spec/graphql/mutations/issues/set_due_date_spec.rb
+++ b/spec/graphql/mutations/issues/set_due_date_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe Mutations::Issues::SetDueDate do
it 'returns the issue with updated due date', :aggregate_failures do
expect(mutated_issue).to eq(issue)
- expect(mutated_issue.due_date).to eq(Date.today + 2.days)
+ expect(mutated_issue.due_date).to eq(due_date.to_date)
expect(subject[:errors]).to be_empty
end
diff --git a/spec/graphql/mutations/merge_requests/accept_spec.rb b/spec/graphql/mutations/merge_requests/accept_spec.rb
index c97c78ec206..c99b1d988c5 100644
--- a/spec/graphql/mutations/merge_requests/accept_spec.rb
+++ b/spec/graphql/mutations/merge_requests/accept_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe Mutations::MergeRequests::Accept do
+ include GraphqlHelpers
include AfterNextHelpers
subject(:mutation) { described_class.new(context: context, object: nil, field: nil) }
@@ -12,7 +13,7 @@ RSpec.describe Mutations::MergeRequests::Accept do
let(:project) { create(:project, :public, :repository) }
let(:context) do
GraphQL::Query::Context.new(
- query: double('query', schema: GitlabSchema),
+ query: query_double(schema: GitlabSchema),
values: { current_user: user },
object: nil
)
diff --git a/spec/graphql/mutations/merge_requests/create_spec.rb b/spec/graphql/mutations/merge_requests/create_spec.rb
index 83af1e3f1b3..e1edb60e4ff 100644
--- a/spec/graphql/mutations/merge_requests/create_spec.rb
+++ b/spec/graphql/mutations/merge_requests/create_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Mutations::MergeRequests::Create do
+ include GraphqlHelpers
+
subject(:mutation) { described_class.new(object: nil, context: context, field: nil) }
let_it_be(:project) { create(:project, :public, :repository) }
@@ -10,7 +12,7 @@ RSpec.describe Mutations::MergeRequests::Create do
let(:context) do
GraphQL::Query::Context.new(
- query: double('query', schema: nil),
+ query: query_double(schema: nil),
values: { current_user: user },
object: nil
)
diff --git a/spec/graphql/mutations/namespace/package_settings/update_spec.rb b/spec/graphql/mutations/namespace/package_settings/update_spec.rb
index 978c81fadfa..631e02ff3dc 100644
--- a/spec/graphql/mutations/namespace/package_settings/update_spec.rb
+++ b/spec/graphql/mutations/namespace/package_settings/update_spec.rb
@@ -10,7 +10,7 @@ RSpec.describe Mutations::Namespace::PackageSettings::Update do
let(:params) { { namespace_path: namespace.full_path } }
- specify { expect(described_class).to require_graphql_authorizations(:create_package_settings) }
+ specify { expect(described_class).to require_graphql_authorizations(:admin_package) }
describe '#resolve' do
subject { described_class.new(object: namespace, context: { current_user: user }, field: nil).resolve(**params) }
@@ -68,7 +68,7 @@ RSpec.describe Mutations::Namespace::PackageSettings::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the namespace package setting'
- :developer | 'updating the namespace package setting'
+ :developer | 'denying access to namespace package setting'
:reporter | 'denying access to namespace package setting'
:guest | 'denying access to namespace package setting'
:anonymous | 'denying access to namespace package setting'
@@ -88,7 +88,7 @@ RSpec.describe Mutations::Namespace::PackageSettings::Update do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the namespace package setting'
- :developer | 'creating the namespace package setting'
+ :developer | 'denying access to namespace package setting'
:reporter | 'denying access to namespace package setting'
:guest | 'denying access to namespace package setting'
:anonymous | 'denying access to namespace package setting'
diff --git a/spec/graphql/mutations/release_asset_links/delete_spec.rb b/spec/graphql/mutations/release_asset_links/delete_spec.rb
index cda292f2ffa..cca7bd2ba38 100644
--- a/spec/graphql/mutations/release_asset_links/delete_spec.rb
+++ b/spec/graphql/mutations/release_asset_links/delete_spec.rb
@@ -52,18 +52,12 @@ RSpec.describe Mutations::ReleaseAssetLinks::Delete do
end
context "when the link doesn't exist" do
- let(:mutation_arguments) { super().merge(id: "gid://gitlab/Releases::Link/#{non_existing_record_id}") }
-
- it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ let(:mutation_arguments) do
+ super().merge(id: global_id_of(id: non_existing_record_id, model_name: release_link.class.name))
end
- end
-
- context "when the provided ID is invalid" do
- let(:mutation_arguments) { super().merge(id: 'not-a-valid-gid') }
it 'raises an error' do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
end
end
end
diff --git a/spec/graphql/mutations/release_asset_links/update_spec.rb b/spec/graphql/mutations/release_asset_links/update_spec.rb
index 64648687336..e119cf9cc77 100644
--- a/spec/graphql/mutations/release_asset_links/update_spec.rb
+++ b/spec/graphql/mutations/release_asset_links/update_spec.rb
@@ -186,18 +186,12 @@ RSpec.describe Mutations::ReleaseAssetLinks::Update do
end
context "when the link doesn't exist" do
- let(:mutation_arguments) { super().merge(id: "gid://gitlab/Releases::Link/#{non_existing_record_id}") }
-
- it 'raises an error' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ let(:mutation_arguments) do
+ super().merge(id: global_id_of(id: non_existing_record_id, model_name: "Releases::Link"))
end
- end
-
- context "when the provided ID is invalid" do
- let(:mutation_arguments) { super().merge(id: 'not-a-valid-gid') }
it 'raises an error' do
- expect { subject }.to raise_error(::GraphQL::CoercionError)
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
end
end
end
diff --git a/spec/graphql/mutations/timelogs/delete_spec.rb b/spec/graphql/mutations/timelogs/delete_spec.rb
new file mode 100644
index 00000000000..f4a258e0f78
--- /dev/null
+++ b/spec/graphql/mutations/timelogs/delete_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Mutations::Timelogs::Delete do
+ include GraphqlHelpers
+
+ let_it_be(:author) { create(:user) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:administrator) { create(:user, :admin) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be_with_reload(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800) }
+
+ let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) }
+ let(:timelog_id) { global_id_of(timelog) }
+ let(:mutation_arguments) { { id: timelog_id } }
+
+ describe '#resolve' do
+ subject(:resolve) do
+ mutation.resolve(**mutation_arguments)
+ end
+
+ context 'when the timelog id is not valid' do
+ let(:current_user) { author }
+ let(:timelog_id) { global_id_of(model_name: 'Timelog', id: non_existing_record_id) }
+
+ it 'raises Gitlab::Graphql::Errors::ResourceNotAvailable' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when the current user is not the timelog\'s author, not a maintainer and not an admin' do
+ let(:current_user) { create(:user) }
+
+ it 'raises Gitlab::Graphql::Errors::ResourceNotAvailable' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ context 'when the current user is the timelog\'s author' do
+ let(:current_user) { author }
+
+ it 'deletes the timelog' do
+ expect { subject }.to change { Timelog.count }.by(-1)
+ end
+
+ it 'returns the deleted timelog' do
+ expect(subject[:timelog]).to eq(timelog)
+ end
+
+ it 'returns no errors' do
+ expect(subject[:errors]).to be_empty
+ end
+ end
+
+ context 'when the current user is not the timelog\'s author but a maintainer of the project' do
+ let(:current_user) { maintainer }
+
+ before do
+ project.add_maintainer(maintainer)
+ end
+
+ it 'deletes the timelog' do
+ expect { subject }.to change { Timelog.count }.by(-1)
+ end
+
+ it 'returns the deleted timelog' do
+ expect(subject[:timelog]).to eq(timelog)
+ end
+
+ it 'returns no errors' do
+ expect(subject[:errors]).to be_empty
+ end
+ end
+
+ context 'when the current user is not the timelog\'s author, not a maintainer but an admin', :enable_admin_mode do
+ let(:current_user) { administrator }
+
+ it 'deletes the timelog' do
+ expect { subject }.to change { Timelog.count }.by(-1)
+ end
+
+ it 'returns the deleted timelog' do
+ expect(subject[:timelog]).to eq(timelog)
+ end
+
+ it 'returns no errors' do
+ expect(subject[:errors]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/graphql/mutations/todos/create_spec.rb b/spec/graphql/mutations/todos/create_spec.rb
index bbb033e2f33..8c6dca98bad 100644
--- a/spec/graphql/mutations/todos/create_spec.rb
+++ b/spec/graphql/mutations/todos/create_spec.rb
@@ -10,12 +10,19 @@ RSpec.describe Mutations::Todos::Create do
context 'when target does not support todos' do
it 'raises error' do
current_user = create(:user)
- mutation = described_class.new(object: nil, context: { current_user: current_user }, field: nil)
-
target = create(:milestone)
- expect { mutation.resolve(target_id: global_id_of(target)) }
- .to raise_error(GraphQL::CoercionError)
+ ctx = { current_user: current_user }
+ input = { target_id: global_id_of(target).to_s }
+ mutation = graphql_mutation(described_class, input)
+
+ response = GitlabSchema.execute(mutation.query, context: ctx, variables: mutation.variables).to_h
+
+ expect(response).to include(
+ 'errors' => contain_exactly(
+ include('message' => /invalid value for targetId/)
+ )
+ )
end
end
diff --git a/spec/graphql/mutations/todos/mark_done_spec.rb b/spec/graphql/mutations/todos/mark_done_spec.rb
index 9723ac8af42..51df2032cf1 100644
--- a/spec/graphql/mutations/todos/mark_done_spec.rb
+++ b/spec/graphql/mutations/todos/mark_done_spec.rb
@@ -56,15 +56,6 @@ RSpec.describe Mutations::Todos::MarkDone do
expect(todo2.reload.state).to eq('done')
expect(other_user_todo.reload.state).to eq('pending')
end
-
- it 'ignores invalid GIDs' do
- expect { mutation.resolve(id: author.to_global_id.to_s) }
- .to raise_error(::GraphQL::CoercionError)
-
- expect(todo1.reload.state).to eq('pending')
- expect(todo2.reload.state).to eq('done')
- expect(other_user_todo.reload.state).to eq('pending')
- end
end
def mark_done_mutation(todo)
diff --git a/spec/graphql/mutations/todos/restore_many_spec.rb b/spec/graphql/mutations/todos/restore_many_spec.rb
index dc10355ef22..d43f1c8a2e9 100644
--- a/spec/graphql/mutations/todos/restore_many_spec.rb
+++ b/spec/graphql/mutations/todos/restore_many_spec.rb
@@ -49,13 +49,6 @@ RSpec.describe Mutations::Todos::RestoreMany do
expect_states_were_not_changed
end
- it 'raises an error with invalid or non-Todo GIDs' do
- expect { mutation.resolve(ids: [author.to_global_id.to_s]) }
- .to raise_error(GraphQL::CoercionError)
-
- expect_states_were_not_changed
- end
-
it 'restores multiple todos' do
todo4 = create(:todo, user: current_user, author: author, state: :done)
diff --git a/spec/graphql/mutations/todos/restore_spec.rb b/spec/graphql/mutations/todos/restore_spec.rb
index 954bb3db668..fad9d6c08a6 100644
--- a/spec/graphql/mutations/todos/restore_spec.rb
+++ b/spec/graphql/mutations/todos/restore_spec.rb
@@ -56,15 +56,6 @@ RSpec.describe Mutations::Todos::Restore do
expect(todo2.reload.state).to eq('pending')
expect(other_user_todo.reload.state).to eq('done')
end
-
- it 'raises error for invalid GID' do
- expect { mutation.resolve(id: author.to_global_id.to_s) }
- .to raise_error(::GraphQL::CoercionError)
-
- expect(todo1.reload.state).to eq('done')
- expect(todo2.reload.state).to eq('pending')
- expect(other_user_todo.reload.state).to eq('done')
- end
end
def restore_mutation(todo)
diff --git a/spec/graphql/resolvers/alert_management/alert_resolver_spec.rb b/spec/graphql/resolvers/alert_management/alert_resolver_spec.rb
index c042f6dac19..14ebe85d80e 100644
--- a/spec/graphql/resolvers/alert_management/alert_resolver_spec.rb
+++ b/spec/graphql/resolvers/alert_management/alert_resolver_spec.rb
@@ -39,8 +39,8 @@ RSpec.describe Resolvers::AlertManagement::AlertResolver do
end
context 'filtering by domain' do
- let_it_be(:alert1) { create(:alert_management_alert, project: project, monitoring_tool: 'Cilium', domain: :threat_monitoring) }
- let_it_be(:alert2) { create(:alert_management_alert, project: project, monitoring_tool: 'Cilium', domain: :threat_monitoring) }
+ let_it_be(:alert1) { create(:alert_management_alert, project: project, monitoring_tool: 'other', domain: :threat_monitoring) }
+ let_it_be(:alert2) { create(:alert_management_alert, project: project, monitoring_tool: 'other', domain: :threat_monitoring) }
let_it_be(:alert3) { create(:alert_management_alert, project: project, monitoring_tool: 'generic') }
let(:args) { { domain: 'operations' } }
diff --git a/spec/graphql/resolvers/ci/config_resolver_spec.rb b/spec/graphql/resolvers/ci/config_resolver_spec.rb
index 3ff6d8f4347..7a6104fc503 100644
--- a/spec/graphql/resolvers/ci/config_resolver_spec.rb
+++ b/spec/graphql/resolvers/ci/config_resolver_spec.rb
@@ -37,13 +37,15 @@ RSpec.describe Resolvers::Ci::ConfigResolver do
merged_yaml: content,
jobs: [],
errors: [],
- warnings: []
+ warnings: [],
+ includes: []
)
end
it 'lints the ci config file and returns the merged yaml file' do
expect(response[:status]).to eq(:valid)
expect(response[:merged_yaml]).to eq(content)
+ expect(response[:includes]).to eq([])
expect(response[:errors]).to be_empty
expect(::Gitlab::Ci::Lint).to have_received(:new).with(current_user: user, project: project, sha: sha)
end
@@ -69,7 +71,8 @@ RSpec.describe Resolvers::Ci::ConfigResolver do
jobs: [],
merged_yaml: content,
errors: ['Invalid configuration format'],
- warnings: []
+ warnings: [],
+ includes: []
)
end
diff --git a/spec/graphql/resolvers/concerns/resolves_ids_spec.rb b/spec/graphql/resolvers/concerns/resolves_ids_spec.rb
index 1dd27c0eff0..84741b7a603 100644
--- a/spec/graphql/resolvers/concerns/resolves_ids_spec.rb
+++ b/spec/graphql/resolvers/concerns/resolves_ids_spec.rb
@@ -3,33 +3,32 @@
require 'spec_helper'
RSpec.describe ResolvesIds do
+ include GraphqlHelpers
+
# gid://gitlab/Project/6
# gid://gitlab/Issue/6
# gid://gitlab/Project/6 gid://gitlab/Issue/6
context 'with a single project' do
- let(:ids) { 'gid://gitlab/Project/6' }
- let(:type) { ::Types::GlobalIDType[::Project] }
+ let(:ids) { global_id_of(model_name: 'Project', id: 6) }
it 'returns the correct array' do
- expect(resolve_ids).to match_array(['6'])
+ expect(resolve_ids).to contain_exactly('6')
end
end
context 'with a single issue' do
- let(:ids) { 'gid://gitlab/Issue/9' }
- let(:type) { ::Types::GlobalIDType[::Issue] }
+ let(:ids) { global_id_of(model_name: 'Issue', id: 9) }
it 'returns the correct array' do
- expect(resolve_ids).to match_array(['9'])
+ expect(resolve_ids).to contain_exactly('9')
end
end
context 'with multiple users' do
- let(:ids) { ['gid://gitlab/User/7', 'gid://gitlab/User/13', 'gid://gitlab/User/21'] }
- let(:type) { ::Types::GlobalIDType[::User] }
+ let(:ids) { [7, 13, 21].map { global_id_of(model_name: 'User', id: _1) } }
it 'returns the correct array' do
- expect(resolve_ids).to match_array(%w[7 13 21])
+ expect(resolve_ids).to eq %w[7 13 21]
end
end
@@ -38,6 +37,6 @@ RSpec.describe ResolvesIds do
end
def resolve_ids
- mock_resolver.resolve_ids(ids, type)
+ mock_resolver.resolve_ids(ids)
end
end
diff --git a/spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb b/spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb
index a16e8821cb5..3fe1ec4b5a4 100644
--- a/spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/design_at_version_resolver_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe Resolvers::DesignManagement::DesignAtVersionResolver do
let(:current_user) { user }
let(:object) { issue.design_collection }
- let(:global_id) { GitlabSchema.id_from_object(design_at_version).to_s }
+ let(:global_id) { GitlabSchema.id_from_object(design_at_version) }
let(:design_at_version) { ::DesignManagement::DesignAtVersion.new(design: design_a, version: version_a) }
diff --git a/spec/graphql/resolvers/design_management/design_resolver_spec.rb b/spec/graphql/resolvers/design_management/design_resolver_spec.rb
index 4c8b3116875..0915dddf438 100644
--- a/spec/graphql/resolvers/design_management/design_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/design_resolver_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe Resolvers::DesignManagement::DesignResolver do
create(:design, issue: create(:issue, project: project), versions: [create(:design_version)])
end
- let(:args) { { id: GitlabSchema.id_from_object(first_design).to_s } }
+ let(:args) { { id: GitlabSchema.id_from_object(first_design) } }
let(:gql_context) { { current_user: current_user } }
before do
@@ -50,7 +50,7 @@ RSpec.describe Resolvers::DesignManagement::DesignResolver do
end
context 'when both arguments have been passed' do
- let(:args) { { filename: first_design.filename, id: GitlabSchema.id_from_object(first_design).to_s } }
+ let(:args) { { filename: first_design.filename, id: GitlabSchema.id_from_object(first_design) } }
it 'generates an error' do
expect_graphql_error_to_be_created(::Gitlab::Graphql::Errors::ArgumentError, /may/) do
@@ -71,15 +71,6 @@ RSpec.describe Resolvers::DesignManagement::DesignResolver do
expect(resolve_design).to be_nil
end
end
-
- context 'the ID does not belong to a design at all' do
- let(:args) { { id: global_id_of(issue) } }
- let(:msg) { /does not represent an instance of DesignManagement::Design/ }
-
- it 'complains meaningfully' do
- expect { resolve_design }.to raise_error(msg)
- end
- end
end
context 'by filename' do
diff --git a/spec/graphql/resolvers/design_management/designs_resolver_spec.rb b/spec/graphql/resolvers/design_management/designs_resolver_spec.rb
index b091e58b06f..64eae14d888 100644
--- a/spec/graphql/resolvers/design_management/designs_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/designs_resolver_spec.rb
@@ -109,6 +109,8 @@ RSpec.describe Resolvers::DesignManagement::DesignsResolver do
end
def resolve_designs
- resolve(described_class, obj: issue.design_collection, args: args, ctx: gql_context)
+ Gitlab::Graphql::Lazy.force(
+ resolve(described_class, obj: issue.design_collection, args: args, ctx: gql_context)
+ )
end
end
diff --git a/spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb b/spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb
index 8b9874c3580..00f37a8e5f6 100644
--- a/spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb
@@ -50,15 +50,6 @@ RSpec.describe Resolvers::DesignManagement::VersionInCollectionResolver do
it { is_expected.to be_nil }
end
-
- context 'we pass the id of something that is not a design_version' do
- let(:params) { { id: global_id_of(project) } }
- let(:appropriate_error) { ::GraphQL::CoercionError }
-
- it 'raises an appropriate error' do
- expect { result }.to raise_error(appropriate_error)
- end
- end
end
def resolve_version(obj, context = { current_user: current_user })
diff --git a/spec/graphql/resolvers/design_management/versions_resolver_spec.rb b/spec/graphql/resolvers/design_management/versions_resolver_spec.rb
index d98138f6385..8eab0222cf6 100644
--- a/spec/graphql/resolvers/design_management/versions_resolver_spec.rb
+++ b/spec/graphql/resolvers/design_management/versions_resolver_spec.rb
@@ -18,8 +18,7 @@ RSpec.describe Resolvers::DesignManagement::VersionsResolver do
let(:project) { issue.project }
let(:params) { {} }
let(:current_user) { authorized_user }
- let(:parent_args) { { irrelevant: 1.2 } }
- let(:parent) { double('Parent', parent: nil, irep_node: double(arguments: parent_args)) }
+ let(:query_context) { { current_user: current_user } }
before do
enable_design_management
@@ -107,7 +106,9 @@ RSpec.describe Resolvers::DesignManagement::VersionsResolver do
end
context 'by at_version in parent' do
- let(:parent_args) { { atVersion: global_id_of(first_version) } }
+ before do
+ query_context[:at_version_argument] = first_version.to_global_id
+ end
it_behaves_like 'a query for all_versions up to the first_version'
end
@@ -126,8 +127,8 @@ RSpec.describe Resolvers::DesignManagement::VersionsResolver do
it_behaves_like 'a source of versions'
end
- def resolve_versions(obj, context = { current_user: current_user })
- eager_resolve(resolver, obj: obj, parent: parent, args: params, ctx: context)
+ def resolve_versions(obj)
+ eager_resolve(resolver, obj: obj, args: params, ctx: query_context)
end
end
end
diff --git a/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb
index 2aef483ac95..f80b33e644e 100644
--- a/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb
+++ b/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb
@@ -8,28 +8,23 @@ RSpec.describe Resolvers::ErrorTracking::SentryDetailedErrorResolver do
let_it_be(:project) { create(:project) }
let_it_be(:current_user) { create(:user) }
- let(:issue_details_service) { spy('ErrorTracking::IssueDetailsService') }
+ let(:issue_details_service) { instance_double('ErrorTracking::IssueDetailsService') }
+ let(:service_response) { {} }
- specify do
- expect(described_class).to have_nullable_graphql_type(Types::ErrorTracking::SentryDetailedErrorType)
+ before_all do
+ project.add_developer(current_user)
end
before do
- project.add_developer(current_user)
-
allow(ErrorTracking::IssueDetailsService)
.to receive(:new)
- .and_return issue_details_service
- end
+ .and_return(issue_details_service)
- shared_examples 'it resolves to nil' do
- it 'resolves to nil' do
- allow(issue_details_service).to receive(:execute)
- .and_return(issue: nil)
+ allow(issue_details_service).to receive(:execute).and_return(service_response)
+ end
- result = resolve_error(args)
- expect(result).to be_nil
- end
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::ErrorTracking::SentryDetailedErrorType)
end
describe '#resolve' do
@@ -41,13 +36,9 @@ RSpec.describe Resolvers::ErrorTracking::SentryDetailedErrorResolver do
expect(issue_details_service).to have_received(:execute)
end
- context 'error matched' do
- let(:detailed_error) { build(:error_tracking_sentry_detailed_error) }
-
- before do
- allow(issue_details_service).to receive(:execute)
- .and_return(issue: detailed_error)
- end
+ context 'when error matches' do
+ let(:detailed_error) { build_stubbed(:error_tracking_sentry_detailed_error) }
+ let(:service_response) { { issue: detailed_error } }
it 'resolves to a detailed error' do
expect(resolve_error(args)).to eq detailed_error
@@ -58,24 +49,23 @@ RSpec.describe Resolvers::ErrorTracking::SentryDetailedErrorResolver do
end
end
- context 'if id does not match issue' do
- it_behaves_like 'it resolves to nil'
- end
-
- context 'blank id' do
- let(:args) { { id: '' } }
+ context 'when id does not match issue' do
+ let(:service_response) { { issue: nil } }
- it 'responds with an error' do
- expect { resolve_error(args) }.to raise_error(::GraphQL::CoercionError)
+ it 'resolves to nil' do
+ result = resolve_error(args)
+ expect(result).to be_nil
end
end
end
+ private
+
def resolve_error(args = {}, context = { current_user: current_user })
resolve(described_class, obj: project, args: args, ctx: context)
end
def issue_global_id(issue_id)
- Gitlab::ErrorTracking::DetailedError.new(id: issue_id).to_global_id.to_s
+ Gitlab::ErrorTracking::DetailedError.new(id: issue_id).to_global_id
end
end
diff --git a/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb
index 20c2bdcd4e1..5834faea97e 100644
--- a/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb
+++ b/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb
@@ -8,18 +8,22 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorCollectionResolver do
let_it_be(:project) { create(:project) }
let_it_be(:current_user) { create(:user) }
- let(:list_issues_service) { spy('ErrorTracking::ListIssuesService') }
+ let(:list_issues_service) { instance_double('ErrorTracking::ListIssuesService') }
- specify do
- expect(described_class).to have_nullable_graphql_type(Types::ErrorTracking::SentryErrorCollectionType)
+ before_all do
+ project.add_developer(current_user)
end
before do
- project.add_developer(current_user)
-
allow(ErrorTracking::ListIssuesService)
.to receive(:new)
.and_return list_issues_service
+
+ allow(list_issues_service).to receive(:external_url)
+ end
+
+ specify do
+ expect(described_class).to have_nullable_graphql_type(Types::ErrorTracking::SentryErrorCollectionType)
end
describe '#resolve' do
@@ -34,8 +38,7 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorCollectionResolver do
.to receive(:external_url)
.and_return(fake_url)
- result = resolve_error_collection
- expect(result.external_url).to eq fake_url
+ expect(resolve_error_collection.external_url).to eq fake_url
end
it 'provides the project' do
diff --git a/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
index 68badb8e333..65b6c551dde 100644
--- a/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
+++ b/spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
let_it_be(:current_user) { create(:user) }
let_it_be(:error_collection) { Gitlab::ErrorTracking::ErrorCollection.new(project: project) }
- let(:list_issues_service) { spy('ErrorTracking::ListIssuesService') }
+ let(:list_issues_service) { instance_double('ErrorTracking::ListIssuesService') }
let(:issues) { nil }
let(:pagination) { nil }
@@ -19,23 +19,25 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
end
describe '#resolve' do
+ before do
+ allow(ErrorTracking::ListIssuesService)
+ .to receive(:new)
+ .and_return list_issues_service
+
+ allow(list_issues_service).to receive(:execute).and_return({})
+ end
+
context 'with insufficient user permission' do
- let(:user) { create(:user) }
+ let(:current_user) { create(:user) }
it 'returns nil' do
- context = { current_user: user }
-
- expect(resolve_errors({}, context)).to eq nil
+ expect(resolve_errors).to eq nil
end
end
context 'with sufficient permission' do
- before do
+ before_all do
project.add_developer(current_user)
-
- allow(ErrorTracking::ListIssuesService)
- .to receive(:new)
- .and_return list_issues_service
end
context 'when after arg given' do
@@ -52,14 +54,9 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorsResolver do
end
context 'when no issues fetched' do
- before do
- allow(list_issues_service)
- .to receive(:execute)
- .and_return(
- issues: nil
- )
- end
it 'returns nil' do
+ expect(list_issues_service).to receive(:execute).and_return(issues: nil)
+
expect(resolve_errors).to eq nil
end
end
diff --git a/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb b/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb
new file mode 100644
index 00000000000..046cf242d56
--- /dev/null
+++ b/spec/graphql/resolvers/incident_management/timeline_events_resolver_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Resolvers::IncidentManagement::TimelineEventsResolver do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:first_timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let_it_be(:second_timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident)
+ end
+
+ let(:args) { { incident_id: incident.to_global_id } }
+ let(:resolver) { described_class }
+
+ subject(:resolved_timeline_events) { sync(resolve_timeline_events(args, current_user: current_user).to_a) }
+
+ before do
+ project.add_guest(current_user)
+ end
+
+ specify do
+ expect(resolver).to have_nullable_graphql_type(Types::IncidentManagement::TimelineEventType.connection_type)
+ end
+
+ it 'returns timeline events', :aggregate_failures do
+ expect(resolved_timeline_events.length).to eq(2)
+ expect(resolved_timeline_events.first).to be_a(::IncidentManagement::TimelineEvent)
+ end
+
+ context 'when user does not have permissions' do
+ let(:non_member) { create(:user) }
+
+ subject(:resolved_timeline_events) { sync(resolve_timeline_events(args, current_user: non_member).to_a) }
+
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'returns no timeline events' do
+ expect(resolved_timeline_events.length).to eq(0)
+ end
+ end
+
+ context 'when resolving a single item' do
+ let(:resolver) { described_class.single }
+
+ subject(:resolved_timeline_event) { sync(resolve_timeline_events(args, current_user: current_user)) }
+
+ context 'when id given' do
+ let(:args) { { incident_id: incident.to_global_id, id: first_timeline_event.to_global_id } }
+
+ it 'returns the timeline event' do
+ expect(resolved_timeline_event).to eq(first_timeline_event)
+ end
+ end
+ end
+
+ private
+
+ def resolve_timeline_events(args = {}, context = { current_user: current_user })
+ resolve(resolver, obj: incident, args: args, ctx: context)
+ end
+end
diff --git a/spec/graphql/resolvers/issues_resolver_spec.rb b/spec/graphql/resolvers/issues_resolver_spec.rb
index 81aeee0a3d2..e6ec9d8c895 100644
--- a/spec/graphql/resolvers/issues_resolver_spec.rb
+++ b/spec/graphql/resolvers/issues_resolver_spec.rb
@@ -389,6 +389,34 @@ RSpec.describe Resolvers::IssuesResolver do
end
end
+ describe 'filtering by crm' do
+ let_it_be(:organization) { create(:organization, group: group) }
+ let_it_be(:contact1) { create(:contact, group: group, organization: organization) }
+ let_it_be(:contact2) { create(:contact, group: group, organization: organization) }
+ let_it_be(:contact3) { create(:contact, group: group) }
+ let_it_be(:crm_issue1) { create(:issue, project: project) }
+ let_it_be(:crm_issue2) { create(:issue, project: project) }
+ let_it_be(:crm_issue3) { create(:issue, project: project) }
+
+ before_all do
+ create(:issue_customer_relations_contact, issue: crm_issue1, contact: contact1)
+ create(:issue_customer_relations_contact, issue: crm_issue2, contact: contact2)
+ create(:issue_customer_relations_contact, issue: crm_issue3, contact: contact3)
+ end
+
+ context 'contact' do
+ it 'returns only the issues for the contact' do
+ expect(resolve_issues({ crm_contact_id: contact1.id })).to contain_exactly(crm_issue1)
+ end
+ end
+
+ context 'organization' do
+ it 'returns only the issues for the contact' do
+ expect(resolve_issues({ crm_organization_id: organization.id })).to contain_exactly(crm_issue1, crm_issue2)
+ end
+ end
+ end
+
describe 'sorting' do
context 'when sorting by created' do
it 'sorts issues ascending' do
@@ -603,13 +631,13 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'finds a specific issue with iid', :request_store do
- result = batch_sync(max_queries: 6) { resolve_issues(iid: issue1.iid).to_a }
+ result = batch_sync(max_queries: 7) { resolve_issues(iid: issue1.iid).to_a }
expect(result).to contain_exactly(issue1)
end
it 'batches queries that only include IIDs', :request_store do
- result = batch_sync(max_queries: 6) do
+ result = batch_sync(max_queries: 7) do
[issue1, issue2]
.map { |issue| resolve_issues(iid: issue.iid.to_s) }
.flat_map(&:to_a)
@@ -619,7 +647,7 @@ RSpec.describe Resolvers::IssuesResolver do
end
it 'finds a specific issue with iids', :request_store do
- result = batch_sync(max_queries: 6) do
+ result = batch_sync(max_queries: 7) do
resolve_issues(iids: [issue1.iid]).to_a
end
diff --git a/spec/graphql/resolvers/package_pipelines_resolver_spec.rb b/spec/graphql/resolvers/package_pipelines_resolver_spec.rb
index c757c876616..a52dee59bc6 100644
--- a/spec/graphql/resolvers/package_pipelines_resolver_spec.rb
+++ b/spec/graphql/resolvers/package_pipelines_resolver_spec.rb
@@ -9,10 +9,23 @@ RSpec.describe Resolvers::PackagePipelinesResolver do
let_it_be(:pipelines) { create_list(:ci_pipeline, 3, project: package.project) }
let(:user) { package.project.first_owner }
- let(:args) { {} }
describe '#resolve' do
- subject { resolve(described_class, obj: package, args: args, ctx: { current_user: user }) }
+ let(:returned_pipelines) { graphql_dig_at(subject, 'data', 'package', 'pipelines', 'nodes') }
+ let(:returned_errors) { graphql_dig_at(subject, 'errors', 'message') }
+ let(:pagination_args) { {} }
+ let(:query) do
+ pipelines_nodes = 'nodes { id }'
+ graphql_query_for(
+ :package,
+ { id: global_id_of(package) },
+ query_graphql_field('pipelines', pagination_args, pipelines_nodes)
+ )
+ end
+
+ subject do
+ GitlabSchema.execute(query, context: { current_user: user })
+ end
before do
pipelines.each do |pipeline|
@@ -20,67 +33,115 @@ RSpec.describe Resolvers::PackagePipelinesResolver do
end
end
- it { is_expected.to contain_exactly(*pipelines) }
+ it 'contains the expected pipelines' do
+ expect_to_contain_exactly(*pipelines)
+ end
+
+ context 'with valid after' do
+ let(:pagination_args) { { first: 1, after: encode_cursor(id: pipelines[1].id) } }
+
+ it 'contains the expected pipelines' do
+ expect_to_contain_exactly(pipelines[0])
+ end
+ end
+
+ context 'with valid before' do
+ let(:pagination_args) { { last: 1, before: encode_cursor(id: pipelines[1].id) } }
+
+ it 'contains the expected pipelines' do
+ expect_to_contain_exactly(pipelines[2])
+ end
+ end
context 'with invalid after' do
- let(:args) { { first: 1, after: 'not_json_string' } }
+ let(:pagination_args) { { first: 1, after: 'not_json_string' } }
it 'generates an argument error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError) do
- subject
- end
+ expect(returned_errors).to include('Please provide a valid cursor')
end
end
context 'with invalid after key' do
- let(:args) { { first: 1, after: encode_cursor(foo: 3) } }
+ let(:pagination_args) { { first: 1, after: encode_cursor(foo: 3) } }
it 'generates an argument error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError) do
- subject
- end
+ expect(returned_errors).to include('Please provide a valid cursor')
end
end
context 'with invalid before' do
- let(:args) { { last: 1, before: 'not_json_string' } }
+ let(:pagination_args) { { last: 1, before: 'not_json_string' } }
it 'generates an argument error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError) do
- subject
- end
+ expect(returned_errors).to include('Please provide a valid cursor')
end
end
context 'with invalid before key' do
- let(:args) { { last: 1, before: encode_cursor(foo: 3) } }
+ let(:pagination_args) { { last: 1, before: encode_cursor(foo: 3) } }
it 'generates an argument error' do
- expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError) do
- subject
- end
+ expect(returned_errors).to include('Please provide a valid cursor')
end
end
- context 'field options' do
- let(:field) do
- field_options = described_class.field_options.merge(
- owner: resolver_parent,
- name: 'dummy_field'
- )
- ::Types::BaseField.new(**field_options)
- end
+ context 'with unauthorized user' do
+ let_it_be(:user) { create(:user) }
- it 'sets them properly' do
- expect(field).not_to be_connection
- expect(field.extras).to match_array([:lookahead])
+ it 'returns nothing' do
+ expect(returned_pipelines).to be_nil
end
end
- context 'with unauthorized user' do
- let_it_be(:user) { create(:user) }
+ context 'with many packages' do
+ let_it_be_with_reload(:other_package) { create(:package, project: package.project) }
+ let_it_be(:other_pipelines) { create_list(:ci_pipeline, 3, project: package.project) }
+
+ let(:returned_pipelines) do
+ graphql_dig_at(subject, 'data', 'project', 'packages', 'nodes', 'pipelines', 'nodes')
+ end
- it { is_expected.to be_nil }
+ let(:query) do
+ pipelines_query = query_graphql_field('pipelines', pagination_args, 'nodes { id }')
+ <<~QUERY
+ {
+ project(fullPath: "#{package.project.full_path}") {
+ packages {
+ nodes { #{pipelines_query} }
+ }
+ }
+ }
+ QUERY
+ end
+
+ before do
+ other_pipelines.each do |pipeline|
+ create(:package_build_info, package: other_package, pipeline: pipeline)
+ end
+ end
+
+ it 'contains the expected pipelines' do
+ expect_to_contain_exactly(*(pipelines + other_pipelines))
+ end
+
+ it 'handles n+1 situations' do
+ control = ActiveRecord::QueryRecorder.new do
+ GitlabSchema.execute(query, context: { current_user: user })
+ end
+
+ create_package_with_pipelines(package.project)
+
+ expectation = expect { GitlabSchema.execute(query, context: { current_user: user }) }
+
+ expectation.not_to exceed_query_limit(control)
+ end
+
+ def create_package_with_pipelines(project)
+ extra_package = create(:package, project: project)
+ create_list(:ci_pipeline, 3, project: project).each do |pipeline|
+ create(:package_build_info, package: extra_package, pipeline: pipeline)
+ end
+ end
end
def encode_cursor(json)
@@ -89,5 +150,25 @@ RSpec.describe Resolvers::PackagePipelinesResolver do
nonce: true
)
end
+
+ def expect_to_contain_exactly(*pipelines)
+ entities = pipelines.map { |pipeline| a_graphql_entity_for(pipeline) }
+ expect(returned_pipelines).to match_array(entities)
+ end
+ end
+
+ describe '.field options' do
+ let(:field) do
+ field_options = described_class.field_options.merge(
+ owner: resolver_parent,
+ name: 'dummy_field'
+ )
+ ::Types::BaseField.new(**field_options)
+ end
+
+ it 'sets them properly' do
+ expect(field).not_to be_connection
+ expect(field.extras).to match_array([:lookahead])
+ end
end
end
diff --git a/spec/graphql/resolvers/projects/snippets_resolver_spec.rb b/spec/graphql/resolvers/projects/snippets_resolver_spec.rb
index b963f2509db..1d04db3ea6e 100644
--- a/spec/graphql/resolvers/projects/snippets_resolver_spec.rb
+++ b/spec/graphql/resolvers/projects/snippets_resolver_spec.rb
@@ -58,12 +58,6 @@ RSpec.describe Resolvers::Projects::SnippetsResolver do
expect(snippets).to contain_exactly(project_snippet, other_project_snippet)
end
-
- it 'returns an error if the gid is invalid' do
- expect do
- resolve_snippets(args: { ids: ['foo'] })
- end.to raise_error(GraphQL::CoercionError)
- end
end
context 'when no project is provided' do
diff --git a/spec/graphql/resolvers/snippets_resolver_spec.rb b/spec/graphql/resolvers/snippets_resolver_spec.rb
index f9feb8901cd..ee9a6e67243 100644
--- a/spec/graphql/resolvers/snippets_resolver_spec.rb
+++ b/spec/graphql/resolvers/snippets_resolver_spec.rb
@@ -40,12 +40,6 @@ RSpec.describe Resolvers::SnippetsResolver do
expect(snippets).to contain_exactly(personal_snippet, project_snippet)
end
-
- it 'returns an error if the param id is invalid' do
- expect do
- resolve_snippets(args: { author_id: 'foo' })
- end.to raise_error(GraphQL::CoercionError)
- end
end
it 'returns the snippets by type' do
@@ -61,12 +55,6 @@ RSpec.describe Resolvers::SnippetsResolver do
expect(snippets).to contain_exactly(project_snippet, other_project_snippet)
end
-
- it 'returns an error if the param id is invalid' do
- expect do
- resolve_snippets(args: { project_id: 'foo' })
- end.to raise_error(GraphQL::CoercionError)
- end
end
it 'returns the snippets by visibility' do
@@ -98,16 +86,6 @@ RSpec.describe Resolvers::SnippetsResolver do
expect(found).to match_array(snippets)
end
- it 'returns an error if the id cannot be coerced' do
- args = {
- ids: [personal_snippet.to_global_id, 'foo']
- }
-
- expect do
- resolve_snippets(args: args)
- end.to raise_error(GraphQL::CoercionError, '"foo" is not a valid Global ID')
- end
-
it 'generates an error if both project and author are provided' do
expect_graphql_error_to_be_created(Gitlab::Graphql::Errors::ArgumentError) do
args = {
diff --git a/spec/graphql/resolvers/timelog_resolver_spec.rb b/spec/graphql/resolvers/timelog_resolver_spec.rb
index 84fa2932829..da2747fdf72 100644
--- a/spec/graphql/resolvers/timelog_resolver_spec.rb
+++ b/spec/graphql/resolvers/timelog_resolver_spec.rb
@@ -265,7 +265,7 @@ RSpec.describe Resolvers::TimelogResolver do
context 'when > `default_max_page_size` records' do
let(:object) { nil }
let!(:timelog_list) { create_list(:timelog, 101, issue: issue) }
- let(:args) { { project_id: "gid://gitlab/Project/#{project.id}" } }
+ let(:args) { { project_id: global_id_of(project) } }
let(:extra_args) { {} }
it 'pagination returns `default_max_page_size` and sets `has_next_page` true' do
diff --git a/spec/graphql/resolvers/users/snippets_resolver_spec.rb b/spec/graphql/resolvers/users/snippets_resolver_spec.rb
index 04fe3213a99..12baed2560e 100644
--- a/spec/graphql/resolvers/users/snippets_resolver_spec.rb
+++ b/spec/graphql/resolvers/users/snippets_resolver_spec.rb
@@ -64,16 +64,6 @@ RSpec.describe Resolvers::Users::SnippetsResolver do
expect(found).to match_array(snippets)
end
-
- it 'returns an error if the gid is invalid' do
- args = {
- ids: [global_id_of(private_personal_snippet), 'foo']
- }
-
- expect do
- resolve_snippets(args: args)
- end.to raise_error(GraphQL::CoercionError)
- end
end
context 'when user profile is private' do
diff --git a/spec/graphql/resolvers/work_item_resolver_spec.rb b/spec/graphql/resolvers/work_item_resolver_spec.rb
index bfa0cf1d8a2..c44ed395102 100644
--- a/spec/graphql/resolvers/work_item_resolver_spec.rb
+++ b/spec/graphql/resolvers/work_item_resolver_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Resolvers::WorkItemResolver do
let(:current_user) { developer }
- subject(:resolved_work_item) { resolve_work_item('id' => work_item.to_gid.to_s) }
+ subject(:resolved_work_item) { resolve_work_item('id' => work_item.to_gid) }
context 'when the user can read the work item' do
it { is_expected.to eq(work_item) }
diff --git a/spec/graphql/subscriptions/issuable_updated_spec.rb b/spec/graphql/subscriptions/issuable_updated_spec.rb
index c15b4f532ef..0b8fcf67513 100644
--- a/spec/graphql/subscriptions/issuable_updated_spec.rb
+++ b/spec/graphql/subscriptions/issuable_updated_spec.rb
@@ -39,14 +39,6 @@ RSpec.describe Subscriptions::IssuableUpdated do
expect { subject }.to raise_error(GraphQL::ExecutionError)
end
end
-
- context 'when a GraphQL::Types::ID is provided' do
- let(:issuable_id) { issue.to_gid.to_s }
-
- it 'raises an exception' do
- expect { subject }.to raise_error(Gitlab::Graphql::Errors::ArgumentError)
- end
- end
end
context 'subscription updates' do
diff --git a/spec/graphql/types/alert_management/domain_filter_enum_spec.rb b/spec/graphql/types/alert_management/domain_filter_enum_spec.rb
index 2111a33b8b4..9e8d7589352 100644
--- a/spec/graphql/types/alert_management/domain_filter_enum_spec.rb
+++ b/spec/graphql/types/alert_management/domain_filter_enum_spec.rb
@@ -6,6 +6,6 @@ RSpec.describe GitlabSchema.types['AlertManagementDomainFilter'] do
specify { expect(described_class.graphql_name).to eq('AlertManagementDomainFilter') }
it 'exposes all the severity values' do
- expect(described_class.values.keys).to include(*%w[threat_monitoring operations])
+ expect(described_class.values.keys).to include(*%w[operations threat_monitoring])
end
end
diff --git a/spec/graphql/types/ci/config/config_type_spec.rb b/spec/graphql/types/ci/config/config_type_spec.rb
index 0012ae9f51f..78dd5afc1d8 100644
--- a/spec/graphql/types/ci/config/config_type_spec.rb
+++ b/spec/graphql/types/ci/config/config_type_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Types::Ci::Config::ConfigType do
it 'exposes the expected fields' do
expected_fields = %i[
errors
+ includes
mergedYaml
stages
status
diff --git a/spec/graphql/types/ci/config/include_type_enum_spec.rb b/spec/graphql/types/ci/config/include_type_enum_spec.rb
new file mode 100644
index 00000000000..a88316ae6f2
--- /dev/null
+++ b/spec/graphql/types/ci/config/include_type_enum_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CiConfigIncludeType'] do
+ it { expect(described_class.graphql_name).to eq('CiConfigIncludeType') }
+
+ it 'exposes all the existing include types' do
+ expect(described_class.values.keys).to match_array(%w[remote local file template])
+ end
+end
diff --git a/spec/graphql/types/ci/config/include_type_spec.rb b/spec/graphql/types/ci/config/include_type_spec.rb
new file mode 100644
index 00000000000..971e185ccd9
--- /dev/null
+++ b/spec/graphql/types/ci/config/include_type_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Ci::Config::IncludeType do
+ specify { expect(described_class.graphql_name).to eq('CiConfigInclude') }
+
+ it 'exposes the expected fields' do
+ expected_fields = %i[
+ context_project
+ context_sha
+ extra
+ location
+ blob
+ raw
+ type
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/ci/runner_type_spec.rb b/spec/graphql/types/ci/runner_type_spec.rb
index 7697cd0ef79..26ac7a4da8d 100644
--- a/spec/graphql/types/ci/runner_type_spec.rb
+++ b/spec/graphql/types/ci/runner_type_spec.rb
@@ -11,8 +11,8 @@ RSpec.describe GitlabSchema.types['CiRunner'] do
expected_fields = %w[
id description created_at contacted_at maximum_timeout access_level active paused status
version short_sha revision locked run_untagged ip_address runner_type tag_list
- project_count job_count admin_url edit_admin_url user_permissions executor_name
- groups projects jobs token_expires_at
+ project_count job_count admin_url edit_admin_url user_permissions executor_name architecture_name platform_name
+ maintenance_note groups projects jobs token_expires_at
]
expect(described_class).to include_graphql_fields(*expected_fields)
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
new file mode 100644
index 00000000000..81a852471b9
--- /dev/null
+++ b/spec/graphql/types/ci/runner_upgrade_status_type_enum_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::Ci::RunnerUpgradeStatusTypeEnum do
+ 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 }
+ )
+ end
+end
diff --git a/spec/graphql/types/color_type_spec.rb b/spec/graphql/types/color_type_spec.rb
new file mode 100644
index 00000000000..57c26e12b51
--- /dev/null
+++ b/spec/graphql/types/color_type_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::ColorType do
+ let(:hex) { '#663399' }
+ let(:color_name) { 'rebeccapurple' }
+ let(:color) { ::Gitlab::Color.of(hex) }
+ let(:named_color) { ::Gitlab::Color.of(color_name) }
+
+ specify { expect(described_class.graphql_name).to eq('Color') }
+
+ it 'coerces Color object into hex string' do
+ expect(described_class.coerce_isolated_result(color)).to eq(hex)
+ end
+
+ it 'coerces an hex string into Color object' do
+ expect(described_class.coerce_isolated_input(hex)).to eq(color)
+ end
+
+ it 'coerces an named Color into hex string' do
+ expect(described_class.coerce_isolated_result(named_color)).to eq(hex)
+ end
+
+ it 'coerces an named color into Color object' do
+ expect(described_class.coerce_isolated_input(color_name)).to eq(named_color)
+ end
+
+ it 'rejects invalid input' do
+ expect { described_class.coerce_isolated_input('not valid') }
+ .to raise_error(GraphQL::CoercionError)
+ end
+
+ it 'rejects nil' do
+ expect { described_class.coerce_isolated_input(nil) }
+ .to raise_error(GraphQL::CoercionError)
+ end
+end
diff --git a/spec/graphql/types/container_expiration_policy_type_spec.rb b/spec/graphql/types/container_expiration_policy_type_spec.rb
index 9e9ddaf1cb0..95c2be9dfcc 100644
--- a/spec/graphql/types/container_expiration_policy_type_spec.rb
+++ b/spec/graphql/types/container_expiration_policy_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['ContainerExpirationPolicy'] do
specify { expect(described_class.description).to eq('A tag expiration policy designed to keep only the images that matter most') }
- specify { expect(described_class).to require_graphql_authorizations(:destroy_container_image) }
+ specify { expect(described_class).to require_graphql_authorizations(:admin_container_image) }
describe 'older_than field' do
subject { described_class.fields['olderThan'] }
diff --git a/spec/graphql/types/container_repository_details_type_spec.rb b/spec/graphql/types/container_repository_details_type_spec.rb
index d94516c6fce..62e72089e09 100644
--- a/spec/graphql/types/container_repository_details_type_spec.rb
+++ b/spec/graphql/types/container_repository_details_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['ContainerRepositoryDetails'] do
fields = %i[id name path location created_at updated_at expiration_policy_started_at
status tags_count can_delete expiration_policy_cleanup_status tags size
- project migration_state]
+ project migration_state last_cleanup_deleted_tags_count]
it { expect(described_class.graphql_name).to eq('ContainerRepositoryDetails') }
diff --git a/spec/graphql/types/container_repository_type_spec.rb b/spec/graphql/types/container_repository_type_spec.rb
index 9815449dd68..bc92fa24050 100644
--- a/spec/graphql/types/container_repository_type_spec.rb
+++ b/spec/graphql/types/container_repository_type_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe GitlabSchema.types['ContainerRepository'] do
fields = %i[id name path location created_at updated_at expiration_policy_started_at
status tags_count can_delete expiration_policy_cleanup_status project
- migration_state]
+ migration_state last_cleanup_deleted_tags_count]
it { expect(described_class.graphql_name).to eq('ContainerRepository') }
diff --git a/spec/graphql/types/current_user_todos_type_spec.rb b/spec/graphql/types/current_user_todos_type_spec.rb
index a0015e96788..4ce97e1c006 100644
--- a/spec/graphql/types/current_user_todos_type_spec.rb
+++ b/spec/graphql/types/current_user_todos_type_spec.rb
@@ -3,7 +3,214 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['CurrentUserTodos'] do
+ include GraphqlHelpers
+
specify { expect(described_class.graphql_name).to eq('CurrentUserTodos') }
specify { expect(described_class).to have_graphql_fields(:current_user_todos).only }
+
+ # Request store is necessary to prevent duplicate max-member-access lookups
+ describe '.current_user_todos', :request_store, :aggregate_failures do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:issue_a) { create(:issue, project: project) }
+ let_it_be(:issue_b) { create(:issue, project: project) }
+
+ let_it_be(:todo_a) { create(:todo, :pending, user: user, project: project, target: issue_a) }
+ let_it_be(:todo_b) { create(:todo, :done, user: user, project: project, target: issue_a) }
+ let_it_be(:todo_c) { create(:todo, :pending, user: user, project: project, target: issue_b) }
+ let_it_be(:todo_d) { create(:todo, :done, user: user, project: project, target: issue_b) }
+
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+ let_it_be(:todo_e) { create(:todo, :pending, user: user, project: project, target: merge_request) }
+
+ let(:object_type) do
+ fresh_object_type('HasTodos').tap { _1.implements(Types::CurrentUserTodos) }
+ end
+
+ let(:id_enum) do
+ Class.new(Types::BaseEnum) do
+ graphql_name 'AorB'
+
+ value 'A'
+ value 'B'
+ end
+ end
+
+ let(:query_type) do
+ i_a = issue_a
+ i_b = issue_b
+ issue_id = id_enum
+ mr = merge_request
+
+ q = fresh_object_type('Query')
+
+ q.field :issue, null: false, type: object_type do
+ argument :id, type: issue_id, required: true
+ end
+
+ q.field :mr, null: false, type: object_type
+
+ q.define_method(:issue) do |id:|
+ case id
+ when 'A'
+ i_a
+ when 'B'
+ i_b
+ end
+ end
+
+ q.define_method(:mr) { mr }
+
+ q
+ end
+
+ let(:todo_fragment) do
+ <<-GQL
+ fragment todos on HasTodos {
+ todos: currentUserTodos {
+ nodes { id }
+ }
+ }
+ GQL
+ end
+
+ let(:base_query) do
+ <<-GQL
+ query {
+ issue(id: A) { ... todos }
+ }
+ #{todo_fragment}
+ GQL
+ end
+
+ let(:query_without_state_arguments) do
+ <<-GQL
+ query {
+ a: issue(id: A) {
+ ... todos
+ }
+ b: issue(id: B) {
+ ... todos
+ }
+ c: mr {
+ ... todos
+ }
+ d: mr {
+ ... todos
+ }
+ e: issue(id: A) {
+ ... todos
+ }
+ }
+
+ #{todo_fragment}
+ GQL
+ end
+
+ let(:with_state_arguments) do
+ <<-GQL
+ query {
+ a: issue(id: A) {
+ todos: currentUserTodos(state: pending) { nodes { id } }
+ }
+ b: issue(id: B) {
+ todos: currentUserTodos(state: done) { nodes { id } }
+ }
+ c: mr {
+ ... todos
+ }
+ }
+
+ #{todo_fragment}
+ GQL
+ end
+
+ before_all do
+ project.add_developer(user)
+ end
+
+ it 'batches todo lookups, linear in the number of target types/state arguments' do
+ # The baseline is 4 queries:
+ #
+ # When we batch queries, we see the following three groups of queries:
+ # # user authorization
+ # 1. SELECT "users".* FROM "users"
+ # INNER JOIN "project_authorizations"
+ # ON "users"."id" = "project_authorizations"."user_id"
+ # WHERE "project_authorizations"."project_id" = project_id
+ # AND "project_authorizations"."access_level" = 50
+ # 2. SELECT MAX("project_authorizations"."access_level") AS maximum_access_level,
+ # "project_authorizations"."user_id" AS project_authorizations_user_id
+ # FROM "project_authorizations"
+ # WHERE "project_authorizations"."project_id" = project_id
+ # AND "project_authorizations"."user_id" = user_id
+ # GROUP BY "project_authorizations"."user_id"
+ #
+ # # find todos for issues
+ # 1. SELECT "todos".* FROM "todos"
+ # WHERE "todos"."user_id" = user_id
+ # AND ("todos"."state" IN ('done','pending'))
+ # AND "todos"."target_id" IN (issue_a, issue_b)
+ # AND "todos"."target_type" = 'Issue' ORDER BY "todos"."id" DESC
+ #
+ # # find todos for merge_requests
+ # 1. SELECT "todos".* FROM "todos" WHERE "todos"."user_id" = user_id
+ # AND ("todos"."state" IN ('done','pending'))
+ # AND "todos"."target_id" = merge_request
+ # AND "todos"."target_type" = 'MergeRequest' ORDER BY "todos"."id" DESC
+ baseline = ActiveRecord::QueryRecorder.new do
+ execute_query(query_type, graphql: base_query)
+ end
+
+ expect do
+ execute_query(query_type, graphql: query_without_state_arguments)
+ end.not_to exceed_query_limit(baseline) # at present this is 3
+
+ expect do
+ execute_query(query_type, graphql: with_state_arguments)
+ end.not_to exceed_query_limit(baseline.count + 1)
+ end
+
+ it 'returns correct data' do
+ result = execute_query(query_type,
+ graphql: query_without_state_arguments,
+ raise_on_error: true).to_h
+
+ expect(result.dig('data', 'a', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_a),
+ a_graphql_entity_for(todo_b)
+ )
+ expect(result.dig('data', 'b', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_c),
+ a_graphql_entity_for(todo_d)
+ )
+ expect(result.dig('data', 'c', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_e)
+ )
+ expect(result.dig('data', 'd', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_e)
+ )
+ expect(result.dig('data', 'e', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_a),
+ a_graphql_entity_for(todo_b)
+ )
+ end
+
+ it 'returns correct data, when state arguments are supplied' do
+ result = execute_query(query_type,
+ raise_on_error: true,
+ graphql: with_state_arguments).to_h
+
+ expect(result.dig('data', 'a', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_a)
+ )
+ expect(result.dig('data', 'b', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_d)
+ )
+ expect(result.dig('data', 'c', 'todos', 'nodes')).to contain_exactly(
+ a_graphql_entity_for(todo_e)
+ )
+ end
+ end
end
diff --git a/spec/graphql/types/customer_relations/contact_type_spec.rb b/spec/graphql/types/customer_relations/contact_type_spec.rb
index bb447f405b6..965cc4b60e6 100644
--- a/spec/graphql/types/customer_relations/contact_type_spec.rb
+++ b/spec/graphql/types/customer_relations/contact_type_spec.rb
@@ -3,7 +3,20 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['CustomerRelationsContact'] do
- let(:fields) { %i[id organization first_name last_name phone email description created_at updated_at] }
+ let(:fields) do
+ %w[
+ id
+ organization
+ first_name
+ last_name
+ phone
+ email
+ description
+ active
+ created_at
+ updated_at
+ ]
+ end
it { expect(described_class.graphql_name).to eq('CustomerRelationsContact') }
it { expect(described_class).to have_graphql_fields(fields) }
diff --git a/spec/graphql/types/customer_relations/organization_type_spec.rb b/spec/graphql/types/customer_relations/organization_type_spec.rb
index 93844df1239..ae1f41ca098 100644
--- a/spec/graphql/types/customer_relations/organization_type_spec.rb
+++ b/spec/graphql/types/customer_relations/organization_type_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['CustomerRelationsOrganization'] do
- let(:fields) { %i[id name default_rate description created_at updated_at] }
+ let(:fields) { %i[id name default_rate description active created_at updated_at] }
it { expect(described_class.graphql_name).to eq('CustomerRelationsOrganization') }
it { expect(described_class).to have_graphql_fields(fields) }
diff --git a/spec/graphql/types/dependency_proxy/group_setting_type_spec.rb b/spec/graphql/types/dependency_proxy/group_setting_type_spec.rb
index 7c6d7b8aece..cd648cf4b4d 100644
--- a/spec/graphql/types/dependency_proxy/group_setting_type_spec.rb
+++ b/spec/graphql/types/dependency_proxy/group_setting_type_spec.rb
@@ -10,4 +10,10 @@ RSpec.describe GitlabSchema.types['DependencyProxySetting'] do
expect(described_class).to include_graphql_fields(*expected_fields)
end
+
+ it { expect(described_class).to require_graphql_authorizations(:admin_dependency_proxy) }
+
+ it { expect(described_class.graphql_name).to eq('DependencyProxySetting') }
+
+ it { expect(described_class.description).to eq('Group-level Dependency Proxy settings') }
end
diff --git a/spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb b/spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb
index 46347e0434f..af0f91a844e 100644
--- a/spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb
+++ b/spec/graphql/types/dependency_proxy/image_ttl_group_policy_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['DependencyProxyImageTtlGroupPolicy'] do
it { expect(described_class.description).to eq('Group-level Dependency Proxy TTL policy settings') }
- it { expect(described_class).to require_graphql_authorizations(:read_dependency_proxy) }
+ it { expect(described_class).to require_graphql_authorizations(:admin_dependency_proxy) }
it 'includes dependency proxy image ttl policy fields' do
expected_fields = %w[enabled ttl created_at updated_at]
diff --git a/spec/graphql/types/duration_type_spec.rb b/spec/graphql/types/duration_type_spec.rb
index 5b88819f157..4199e6cc41b 100644
--- a/spec/graphql/types/duration_type_spec.rb
+++ b/spec/graphql/types/duration_type_spec.rb
@@ -17,11 +17,6 @@ RSpec.describe GitlabSchema.types['Duration'] do
expect(described_class.coerce_isolated_input(0.5)).to eq(0.5)
end
- it 'rejects invalid input' do
- expect { described_class.coerce_isolated_input('not valid') }
- .to raise_error(GraphQL::CoercionError)
- end
-
it 'rejects nil' do
expect { described_class.coerce_isolated_input(nil) }
.to raise_error(GraphQL::CoercionError)
diff --git a/spec/graphql/types/global_id_type_spec.rb b/spec/graphql/types/global_id_type_spec.rb
index 8df92c818fc..a57db9234f1 100644
--- a/spec/graphql/types/global_id_type_spec.rb
+++ b/spec/graphql/types/global_id_type_spec.rb
@@ -246,131 +246,6 @@ RSpec.describe Types::GlobalIDType do
end
end
- describe 'compatibility' do
- def query(doc, vars)
- GraphQL::Query.new(schema, document: doc, context: {}, variables: vars)
- end
-
- def run_query(gql_query, vars)
- query(GraphQL.parse(gql_query), vars).result
- end
-
- all_types = [::GraphQL::Types::ID, ::Types::GlobalIDType, ::Types::GlobalIDType[::Project]]
-
- shared_examples 'a working query' do
- # Simplified schema to test compatibility
- let!(:schema) do
- # capture values so they can be closed over
- arg_type = argument_type
- res_type = result_type
-
- project = Class.new(GraphQL::Schema::Object) do
- graphql_name 'Project'
- field :name, String, null: false
- field :id, res_type, null: false, resolver_method: :global_id
-
- def global_id
- object.to_global_id
- end
- end
-
- Class.new(GraphQL::Schema) do
- query(Class.new(GraphQL::Schema::Object) do
- graphql_name 'Query'
-
- field :project_by_id, project, null: true do
- argument :id, arg_type, required: true
- end
-
- # This is needed so that all types are always registered as input types
- field :echo, String, null: true do
- argument :id, ::GraphQL::Types::ID, required: false
- argument :gid, ::Types::GlobalIDType, required: false
- argument :pid, ::Types::GlobalIDType[::Project], required: false
- end
-
- def project_by_id(id:)
- gid = ::Types::GlobalIDType[::Project].coerce_isolated_input(id)
- gid.model_class.find(gid.model_id)
- end
-
- def echo(id: nil, gid: nil, pid: nil)
- "id: #{id}, gid: #{gid}, pid: #{pid}"
- end
- end)
- end
- end
-
- it 'works' do
- res = run_query(document, 'projectId' => project.to_global_id.to_s)
-
- expect(res['errors']).to be_blank
- expect(res.dig('data', 'project', 'name')).to eq(project.name)
- expect(res.dig('data', 'project', 'id')).to eq(project.to_global_id.to_s)
- end
- end
-
- context 'when the client declares the argument as ID the actual argument can be any type' do
- let(:document) do
- <<-GRAPHQL
- query($projectId: ID!){
- project: projectById(id: $projectId) {
- name, id
- }
- }
- GRAPHQL
- end
-
- where(:result_type, :argument_type) do
- all_types.flat_map { |arg_type| all_types.zip([arg_type].cycle) }
- end
-
- with_them do
- it_behaves_like 'a working query'
- end
- end
-
- context 'when the client passes the argument as GlobalID' do
- let(:document) do
- <<-GRAPHQL
- query($projectId: GlobalID!) {
- project: projectById(id: $projectId) {
- name, id
- }
- }
- GRAPHQL
- end
-
- let(:argument_type) { ::Types::GlobalIDType }
-
- where(:result_type) { all_types }
-
- with_them do
- it_behaves_like 'a working query'
- end
- end
-
- context 'when the client passes the argument as ProjectID' do
- let(:document) do
- <<-GRAPHQL
- query($projectId: ProjectID!) {
- project: projectById(id: $projectId) {
- name, id
- }
- }
- GRAPHQL
- end
-
- let(:argument_type) { ::Types::GlobalIDType[::Project] }
-
- where(:result_type) { all_types }
-
- with_them do
- it_behaves_like 'a working query'
- end
- end
- end
-
describe '.model_name_to_graphql_name' do
it 'returns a graphql name for the given model name' do
expect(described_class.model_name_to_graphql_name('DesignManagement::Design')).to eq('DesignManagementDesignID')
diff --git a/spec/graphql/types/incident_management/timeline_event_type_spec.rb b/spec/graphql/types/incident_management/timeline_event_type_spec.rb
new file mode 100644
index 00000000000..5a6bc461f20
--- /dev/null
+++ b/spec/graphql/types/incident_management/timeline_event_type_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['TimelineEventType'] do
+ specify { expect(described_class.graphql_name).to eq('TimelineEventType') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_incident_management_timeline_event) }
+
+ it 'exposes the expected fields' do
+ expected_fields = %i[
+ id
+ author
+ updated_by_user
+ incident
+ note
+ note_html
+ promoted_from_note
+ editable
+ action
+ occurred_at
+ created_at
+ updated_at
+ ]
+
+ expect(described_class).to have_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/merge_request_type_spec.rb b/spec/graphql/types/merge_request_type_spec.rb
index e9e92bbdc85..7ab254238fb 100644
--- a/spec/graphql/types/merge_request_type_spec.rb
+++ b/spec/graphql/types/merge_request_type_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe GitlabSchema.types['MergeRequest'] do
milestone assignees reviewers participants subscribed labels discussion_locked time_estimate
total_time_spent human_time_estimate human_total_time_spent reference author merged_at
commit_count current_user_todos conflicts auto_merge_enabled approved_by source_branch_protected
- default_merge_commit_message_with_description squash_on_merge available_auto_merge_strategies
+ squash_on_merge available_auto_merge_strategies
has_ci mergeable commits committers commits_without_merge_commits squash security_auto_fix default_squash_commit_message
auto_merge_strategy merge_user
]
diff --git a/spec/graphql/types/mutation_type_spec.rb b/spec/graphql/types/mutation_type_spec.rb
index 1fc46f2d511..95d835c88cf 100644
--- a/spec/graphql/types/mutation_type_spec.rb
+++ b/spec/graphql/types/mutation_type_spec.rb
@@ -7,14 +7,6 @@ RSpec.describe Types::MutationType do
expect(described_class).to have_graphql_mutation(Mutations::MergeRequests::SetDraft)
end
- describe 'deprecated mutations' do
- describe 'clusterAgentTokenDelete' do
- let(:field) { get_field('clusterAgentTokenDelete') }
-
- it { expect(field.deprecation_reason).to eq('Tokens must be revoked with ClusterAgentTokenRevoke. Deprecated in 14.7.') }
- end
- end
-
def get_field(name)
described_class.fields[GraphqlHelpers.fieldnamerize(name)]
end
diff --git a/spec/graphql/types/namespace/package_settings_type_spec.rb b/spec/graphql/types/namespace/package_settings_type_spec.rb
index b9592d230ca..f63a0a7010f 100644
--- a/spec/graphql/types/namespace/package_settings_type_spec.rb
+++ b/spec/graphql/types/namespace/package_settings_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['PackageSettings'] do
specify { expect(described_class.description).to eq('Namespace-level Package Registry settings') }
- specify { expect(described_class).to require_graphql_authorizations(:read_package_settings) }
+ specify { expect(described_class).to require_graphql_authorizations(:admin_package) }
describe 'maven_duplicate_exception_regex field' do
subject { described_class.fields['mavenDuplicateExceptionRegex'] }
diff --git a/spec/graphql/types/packages/package_base_type_spec.rb b/spec/graphql/types/packages/package_base_type_spec.rb
new file mode 100644
index 00000000000..7156f22c513
--- /dev/null
+++ b/spec/graphql/types/packages/package_base_type_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['PackageBase'] do
+ specify { expect(described_class.description).to eq('Represents a package in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
+ it 'includes all expected fields' do
+ expected_fields = %w[
+ id name version package_type
+ created_at updated_at
+ project
+ tags metadata
+ status can_destroy
+ ]
+
+ expect(described_class).to include_graphql_fields(*expected_fields)
+ end
+end
diff --git a/spec/graphql/types/packages/package_details_type_spec.rb b/spec/graphql/types/packages/package_details_type_spec.rb
index ceeb000ff85..d5688fc64c5 100644
--- a/spec/graphql/types/packages/package_details_type_spec.rb
+++ b/spec/graphql/types/packages/package_details_type_spec.rb
@@ -3,6 +3,10 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['PackageDetailsType'] do
+ specify { expect(described_class.description).to eq('Represents a package details in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
it 'includes all the package fields' do
expected_fields = %w[
id name version created_at updated_at package_type tags project
@@ -13,13 +17,4 @@ RSpec.describe GitlabSchema.types['PackageDetailsType'] do
expect(described_class).to include_graphql_fields(*expected_fields)
end
-
- it 'overrides the pipelines field' do
- field = described_class.fields['pipelines']
-
- expect(field).to have_graphql_type(Types::Ci::PipelineType.connection_type)
- expect(field).to have_graphql_extension(Gitlab::Graphql::Extensions::ExternallyPaginatedArrayExtension)
- expect(field).to have_graphql_resolver(Resolvers::PackagePipelinesResolver)
- expect(field).not_to be_connection
- end
end
diff --git a/spec/graphql/types/packages/package_type_spec.rb b/spec/graphql/types/packages/package_type_spec.rb
index 3267c765dc7..df8135ed87e 100644
--- a/spec/graphql/types/packages/package_type_spec.rb
+++ b/spec/graphql/types/packages/package_type_spec.rb
@@ -3,12 +3,16 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['Package'] do
- it 'includes all the package fields' do
+ specify { expect(described_class.description).to eq('Represents a package with pipelines in the Package Registry') }
+
+ specify { expect(described_class).to require_graphql_authorizations(:read_package) }
+
+ it 'includes all the package fields and pipelines' do
expected_fields = %w[
id name version package_type
created_at updated_at
project
- tags pipelines metadata versions
+ tags pipelines metadata
status can_destroy
]
diff --git a/spec/graphql/types/permission_types/work_item_spec.rb b/spec/graphql/types/permission_types/work_item_spec.rb
new file mode 100644
index 00000000000..e604ce5d6e0
--- /dev/null
+++ b/spec/graphql/types/permission_types/work_item_spec.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Types::PermissionTypes::WorkItem do
+ it do
+ expected_permissions = [
+ :read_work_item, :update_work_item, :delete_work_item
+ ]
+
+ expected_permissions.each do |permission|
+ expect(described_class).to have_graphql_field(permission)
+ end
+ end
+end
diff --git a/spec/graphql/types/project_statistics_type_spec.rb b/spec/graphql/types/project_statistics_type_spec.rb
index f515907b6a8..a958a5150aa 100644
--- a/spec/graphql/types/project_statistics_type_spec.rb
+++ b/spec/graphql/types/project_statistics_type_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe GitlabSchema.types['ProjectStatistics'] do
it 'has all the required fields' do
expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size,
:build_artifacts_size, :packages_size, :commit_count,
- :wiki_size, :snippets_size, :pipeline_artifacts_size, :uploads_size)
+ :wiki_size, :snippets_size, :pipeline_artifacts_size,
+ :uploads_size, :container_registry_size)
end
end
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index 7433d465b38..a08bd717c72 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -29,6 +29,7 @@ RSpec.describe GitlabSchema.types['Project'] do
grafanaIntegration autocloseReferencedIssues suggestion_commit_message environments
environment boards jira_import_status jira_imports services releases release
alert_management_alerts alert_management_alert alert_management_alert_status_counts
+ incident_management_timeline_event incident_management_timeline_events
container_expiration_policy service_desk_enabled service_desk_address
issue_status_counts terraform_states alert_management_integrations
container_repositories container_repositories_count
diff --git a/spec/graphql/types/projects/topic_type_spec.rb b/spec/graphql/types/projects/topic_type_spec.rb
index 01c19e111be..318307fa6f4 100644
--- a/spec/graphql/types/projects/topic_type_spec.rb
+++ b/spec/graphql/types/projects/topic_type_spec.rb
@@ -9,6 +9,7 @@ RSpec.describe Types::Projects::TopicType do
expect(described_class).to have_graphql_fields(
:id,
:name,
+ :title,
:description,
:description_html,
:avatar_url
diff --git a/spec/graphql/types/range_input_type_spec.rb b/spec/graphql/types/range_input_type_spec.rb
index dbfcf4a41c7..239f4e4ba15 100644
--- a/spec/graphql/types/range_input_type_spec.rb
+++ b/spec/graphql/types/range_input_type_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe ::Types::RangeInputType do
input = { start: 1, end: 10 }
output = { start: 1, end: 10 }
- expect(type.coerce_isolated_input(input)).to eq(output)
+ expect(type.coerce_isolated_input(input).to_h).to eq(output)
end
it 'rejects inverted ranges' do
@@ -28,7 +28,7 @@ RSpec.describe ::Types::RangeInputType do
values: {},
object: nil
)
- instance = described_class[of_integer].new(context: context, defaults_used: [], ruby_kwargs: {})
+ instance = described_class[of_integer].new({}, context: context, defaults_used: [], ruby_kwargs: {})
expect(instance).to be_a_kind_of(described_class)
expect(instance).to be_a_kind_of(described_class[of_integer])
diff --git a/spec/graphql/types/root_storage_statistics_type_spec.rb b/spec/graphql/types/root_storage_statistics_type_spec.rb
index 7818be6ee02..07c8378e7a6 100644
--- a/spec/graphql/types/root_storage_statistics_type_spec.rb
+++ b/spec/graphql/types/root_storage_statistics_type_spec.rb
@@ -8,7 +8,8 @@ RSpec.describe GitlabSchema.types['RootStorageStatistics'] do
it 'has all the required fields' do
expect(described_class).to have_graphql_fields(:storage_size, :repository_size, :lfs_objects_size,
:build_artifacts_size, :packages_size, :wiki_size, :snippets_size,
- :pipeline_artifacts_size, :uploads_size, :dependency_proxy_size)
+ :pipeline_artifacts_size, :uploads_size, :dependency_proxy_size,
+ :container_registry_size)
end
specify { expect(described_class).to require_graphql_authorizations(:read_statistics) }
diff --git a/spec/graphql/types/terraform/state_version_type_spec.rb b/spec/graphql/types/terraform/state_version_type_spec.rb
index b015a2045da..6a17d932d03 100644
--- a/spec/graphql/types/terraform/state_version_type_spec.rb
+++ b/spec/graphql/types/terraform/state_version_type_spec.rb
@@ -52,8 +52,8 @@ RSpec.describe GitlabSchema.types['TerraformStateVersion'] do
shared_examples 'returning latest version' do
it 'returns latest version of terraform state' do
- expect(execute.dig('data', 'project', 'terraformState', 'latestVersion', 'id')).to eq(
- global_id_of(terraform_state.latest_version)
+ expect(execute.dig('data', 'project', 'terraformState', 'latestVersion')).to match a_graphql_entity_for(
+ terraform_state.latest_version
)
end
end
diff --git a/spec/graphql/types/timeframe_type_spec.rb b/spec/graphql/types/timeframe_type_spec.rb
index dfde3242897..288124ad24b 100644
--- a/spec/graphql/types/timeframe_type_spec.rb
+++ b/spec/graphql/types/timeframe_type_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe GitlabSchema.types['Timeframe'] do
let(:output) { { start: Date.parse(input[:start]), end: Date.parse(input[:end]) } }
it 'coerces ISO-dates into Time objects' do
- expect(described_class.coerce_isolated_input(input)).to eq(output)
+ expect(described_class.coerce_isolated_input(input).to_h).to eq(output)
end
it 'rejects invalid input' do
@@ -20,7 +20,7 @@ RSpec.describe GitlabSchema.types['Timeframe'] do
it 'accepts times as input' do
with_time = input.merge(start: '2018-06-04T13:48:14Z')
- expect(described_class.coerce_isolated_input(with_time)).to eq(output)
+ expect(described_class.coerce_isolated_input(with_time).to_h).to eq(output)
end
it 'requires both ends of the range' do
diff --git a/spec/graphql/types/timelog_type_spec.rb b/spec/graphql/types/timelog_type_spec.rb
index dc1b1e2253e..c897a25d10d 100644
--- a/spec/graphql/types/timelog_type_spec.rb
+++ b/spec/graphql/types/timelog_type_spec.rb
@@ -3,11 +3,12 @@
require 'spec_helper'
RSpec.describe GitlabSchema.types['Timelog'] do
- let(:fields) { %i[spent_at time_spent user issue merge_request note summary] }
+ let_it_be(:fields) { %i[id spent_at time_spent user issue merge_request note summary userPermissions] }
it { expect(described_class.graphql_name).to eq('Timelog') }
it { expect(described_class).to have_graphql_fields(fields) }
it { expect(described_class).to require_graphql_authorizations(:read_issue) }
+ it { expect(described_class).to expose_permissions_using(Types::PermissionTypes::Timelog) }
describe 'user field' do
subject { described_class.fields['user'] }
diff --git a/spec/graphql/types/user_merge_request_interaction_type_spec.rb b/spec/graphql/types/user_merge_request_interaction_type_spec.rb
index 1eaaa0c23d0..4782a1faf8d 100644
--- a/spec/graphql/types/user_merge_request_interaction_type_spec.rb
+++ b/spec/graphql/types/user_merge_request_interaction_type_spec.rb
@@ -76,6 +76,7 @@ RSpec.describe GitlabSchema.types['UserMergeRequestInteraction'] do
context 'when the user has been asked to review the MR' do
before do
merge_request.reviewers << user
+ merge_request.find_reviewer(user).update!(state: :attention_requested)
end
it { is_expected.to eq(Types::MergeRequestReviewStateEnum.values['ATTENTION_REQUESTED'].value) }
diff --git a/spec/graphql/types/work_item_type_spec.rb b/spec/graphql/types/work_item_type_spec.rb
index 6a5b4a0882e..a0480506156 100644
--- a/spec/graphql/types/work_item_type_spec.rb
+++ b/spec/graphql/types/work_item_type_spec.rb
@@ -7,8 +7,10 @@ RSpec.describe GitlabSchema.types['WorkItem'] do
specify { expect(described_class).to require_graphql_authorizations(:read_work_item) }
+ specify { expect(described_class).to expose_permissions_using(Types::PermissionTypes::WorkItem) }
+
it 'has specific fields' do
- fields = %i[description description_html id iid lock_version state title title_html work_item_type]
+ fields = %i[description description_html id iid lock_version state title title_html userPermissions work_item_type]
fields.each do |field_name|
expect(described_class).to have_graphql_fields(*fields)
diff --git a/spec/haml_lint/linter/documentation_links_spec.rb b/spec/haml_lint/linter/documentation_links_spec.rb
index f2aab4304c1..49a720700da 100644
--- a/spec/haml_lint/linter/documentation_links_spec.rb
+++ b/spec/haml_lint/linter/documentation_links_spec.rb
@@ -1,9 +1,10 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
require 'haml_lint'
require 'haml_lint/spec'
-require Rails.root.join('haml_lint/linter/documentation_links')
+
+require_relative '../../../haml_lint/linter/documentation_links'
RSpec.describe HamlLint::Linter::DocumentationLinks do
include_context 'linter'
diff --git a/spec/haml_lint/linter/inline_javascript_spec.rb b/spec/haml_lint/linter/inline_javascript_spec.rb
new file mode 100644
index 00000000000..fb35bb68247
--- /dev/null
+++ b/spec/haml_lint/linter/inline_javascript_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'haml_lint'
+require 'haml_lint/spec'
+require 'rspec-parameterized'
+
+require_relative '../../../haml_lint/linter/inline_javascript'
+
+RSpec.describe HamlLint::Linter::InlineJavaScript do # rubocop:disable RSpec/FilePath
+ using RSpec::Parameterized::TableSyntax
+
+ include_context 'linter'
+
+ let(:message) { described_class::MSG }
+
+ where(:haml, :should_report) do
+ '%script' | true
+ '%javascript' | false
+ ':javascript' | true
+ ':markdown' | false
+ end
+
+ with_them do
+ if params[:should_report]
+ it { is_expected.to report_lint message: message }
+ else
+ it { is_expected.not_to report_lint }
+ end
+ end
+end
diff --git a/spec/haml_lint/linter/no_plain_nodes_spec.rb b/spec/haml_lint/linter/no_plain_nodes_spec.rb
index 08f7e6131cc..eeb0e4ea96f 100644
--- a/spec/haml_lint/linter/no_plain_nodes_spec.rb
+++ b/spec/haml_lint/linter/no_plain_nodes_spec.rb
@@ -1,9 +1,10 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
require 'haml_lint'
require 'haml_lint/spec'
-require Rails.root.join('haml_lint/linter/no_plain_nodes')
+
+require_relative '../../../haml_lint/linter/no_plain_nodes'
RSpec.describe HamlLint::Linter::NoPlainNodes do
include_context 'linter'
diff --git a/spec/helpers/appearances_helper_spec.rb b/spec/helpers/appearances_helper_spec.rb
index d972ac27119..edd704ce739 100644
--- a/spec/helpers/appearances_helper_spec.rb
+++ b/spec/helpers/appearances_helper_spec.rb
@@ -80,6 +80,50 @@ RSpec.describe AppearancesHelper do
end
end
+ describe '#brand_header_logo' do
+ let(:options) { {} }
+
+ subject do
+ helper.brand_header_logo(options)
+ end
+
+ context 'with header logo' do
+ let!(:appearance) { create(:appearance, :with_header_logo) }
+
+ it 'renders image tag' do
+ expect(helper).to receive(:image_tag).with(appearance.header_logo_path, class: 'brand-header-logo')
+
+ subject
+ end
+ end
+
+ context 'with add_gitlab_white_text option' do
+ let(:options) { { add_gitlab_white_text: true } }
+
+ it 'renders shared/logo_with_white_text partial' do
+ expect(helper).to receive(:render).with(partial: 'shared/logo_with_white_text', formats: :svg)
+
+ subject
+ end
+ end
+
+ context 'with add_gitlab_black_text option' do
+ let(:options) { { add_gitlab_black_text: true } }
+
+ it 'renders shared/logo_with_black_text partial' do
+ expect(helper).to receive(:render).with(partial: 'shared/logo_with_black_text', formats: :svg)
+
+ subject
+ end
+ end
+
+ it 'renders shared/logo by default' do
+ expect(helper).to receive(:render).with(partial: 'shared/logo', formats: :svg)
+
+ subject
+ end
+ end
+
describe '#brand_title' do
it 'returns the default title when no appearance is present' do
allow(helper).to receive(:current_appearance).and_return(nil)
diff --git a/spec/helpers/application_settings_helper_spec.rb b/spec/helpers/application_settings_helper_spec.rb
index c93762416f5..0304aac18ae 100644
--- a/spec/helpers/application_settings_helper_spec.rb
+++ b/spec/helpers/application_settings_helper_spec.rb
@@ -295,7 +295,7 @@ RSpec.describe ApplicationSettingsHelper do
it { is_expected.to eq([%w(Track track), %w(Compress compress)]) }
end
- describe '#instance_clusters_enabled?' do
+ describe '#instance_clusters_enabled?', :request_store do
let_it_be(:user) { create(:user) }
subject { helper.instance_clusters_enabled? }
diff --git a/spec/helpers/auth_helper_spec.rb b/spec/helpers/auth_helper_spec.rb
index 4bb09699db4..4b0b44d1325 100644
--- a/spec/helpers/auth_helper_spec.rb
+++ b/spec/helpers/auth_helper_spec.rb
@@ -500,6 +500,16 @@ RSpec.describe AuthHelper do
)
end
+ context 'when SAML is enabled without specifying a strategy class' do
+ before do
+ allow(Gitlab::Auth::OAuth::Provider).to receive(:providers).and_return([:saml])
+ end
+
+ it 'returns the saml provider' do
+ expect(saml_providers).to match_array([:saml])
+ end
+ end
+
context 'when configuration specifies no provider' do
before do
allow(Devise).to receive(:omniauth_providers).and_return([])
diff --git a/spec/helpers/badges_helper_spec.rb b/spec/helpers/badges_helper_spec.rb
index 5be3b4a737b..8e1f92305da 100644
--- a/spec/helpers/badges_helper_spec.rb
+++ b/spec/helpers/badges_helper_spec.rb
@@ -89,16 +89,16 @@ RSpec.describe BadgesHelper do
end
describe 'icons' do
- let(:spacing_class_regex) { %r{<svg .*class=".*gl-mr-2.*".*>.*</svg>} }
+ let(:spacing_class_regex) { %r{<svg .*class=".*my-icon-class gl-mr-2".*>.*</svg>} }
describe 'with text' do
- subject { helper.gl_badge_tag(label, icon: "question-o") }
+ subject { helper.gl_badge_tag(label, icon: "question-o", icon_classes: 'my-icon-class') }
it 'renders an icon' do
expect(subject).to match(%r{<svg .*#question-o".*>.*</svg>})
end
- it 'adds a spacing class to the icon' do
+ it 'adds a spacing class and any custom classes to the icon' do
expect(subject).to match(spacing_class_regex)
end
end
diff --git a/spec/helpers/ci/builds_helper_spec.rb b/spec/helpers/ci/builds_helper_spec.rb
index 143d96cf632..ea3b5aac4ea 100644
--- a/spec/helpers/ci/builds_helper_spec.rb
+++ b/spec/helpers/ci/builds_helper_spec.rb
@@ -97,6 +97,20 @@ RSpec.describe Ci::BuildsHelper do
end
end
+ describe '#prepare_failed_jobs_summary_data' do
+ let(:failed_build) { create(:ci_build, :failed, :trace_live) }
+
+ subject { helper.prepare_failed_jobs_summary_data([failed_build]) }
+
+ it 'returns array of failed jobs with id, failure and failure summary' do
+ expect(subject).to eq([{
+ id: failed_build.id,
+ failure: failed_build.present.callout_failure_message,
+ failure_summary: helper.build_summary(failed_build)
+ }].to_json)
+ end
+ end
+
def assign_project
build(:project).tap do |project|
assign(:project, project)
diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb
index 12456deb538..429d4c7941a 100644
--- a/spec/helpers/ci/pipeline_editor_helper_spec.rb
+++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb
@@ -45,6 +45,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
"initial-branch-name" => nil,
+ "includes-help-page-path" => help_page_path('ci/yaml/includes'),
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
"lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
@@ -72,6 +73,7 @@ RSpec.describe Ci::PipelineEditorHelper do
"default-branch" => project.default_branch_or_main,
"empty-state-illustration-path" => 'foo',
"initial-branch-name" => nil,
+ "includes-help-page-path" => help_page_path('ci/yaml/includes'),
"lint-help-page-path" => help_page_path('ci/lint', anchor: 'check-cicd-syntax'),
"lint-unavailable-help-page-path" => help_page_path('ci/pipeline_editor/index', anchor: 'configuration-validation-currently-not-available-message'),
"needs-help-page-path" => help_page_path('ci/yaml/index', anchor: 'needs'),
diff --git a/spec/helpers/ci/pipelines_helper_spec.rb b/spec/helpers/ci/pipelines_helper_spec.rb
index c473e1e4ab6..19946afb1a4 100644
--- a/spec/helpers/ci/pipelines_helper_spec.rb
+++ b/spec/helpers/ci/pipelines_helper_spec.rb
@@ -152,18 +152,18 @@ RSpec.describe Ci::PipelinesHelper do
end
end
- describe 'the `registration_token` attribute' do
- subject { data[:registration_token] }
+ describe 'when the project is eligible for the `ios_specific_templates` experiment' do
+ let_it_be(:project) { create(:project, :auto_devops_disabled, shared_runners_enabled: false) }
+ let_it_be(:user) { create(:user) }
- describe 'when the project is eligible for the `ios_specific_templates` experiment' do
- let_it_be(:project) { create(:project, :auto_devops_disabled) }
- let_it_be(:user) { create(:user) }
+ before do
+ allow(helper).to receive(:current_user).and_return(user)
+ project.add_developer(user)
+ create(:project_setting, project: project, target_platforms: %w(ios))
+ end
- before do
- allow(helper).to receive(:current_user).and_return(user)
- project.add_developer(user)
- create(:project_setting, project: project, target_platforms: %w(ios))
- end
+ describe 'the `registration_token` attribute' do
+ subject { data[:registration_token] }
context 'when the `ios_specific_templates` experiment variant is control' do
before do
@@ -191,6 +191,38 @@ RSpec.describe Ci::PipelinesHelper do
end
end
end
+
+ describe 'the `ios_runners_available` attribute' do
+ before do
+ allow(Gitlab).to receive(:com?).and_return(true)
+ end
+
+ subject { data[:ios_runners_available] }
+
+ context 'when the `ios_specific_templates` experiment variant is control' do
+ before do
+ stub_experiments(ios_specific_templates: :control)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when the `ios_specific_templates` experiment variant is candidate' do
+ before do
+ stub_experiments(ios_specific_templates: :candidate)
+ end
+
+ context 'when shared runners are not enabled' do
+ it { is_expected.to eq('false') }
+ end
+
+ context 'when shared runners are enabled' do
+ let_it_be(:project) { create(:project, :auto_devops_disabled, shared_runners_enabled: true) }
+
+ it { is_expected.to eq('true') }
+ end
+ end
+ end
end
end
end
diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb
index 0046d481282..cf62579338f 100644
--- a/spec/helpers/ci/runners_helper_spec.rb
+++ b/spec/helpers/ci/runners_helper_spec.rb
@@ -99,17 +99,17 @@ RSpec.describe Ci::RunnersHelper do
let(:runner_constants) do
{
- runner_enabled: Namespace::SR_ENABLED,
- runner_disabled: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
- runner_allow_override: Namespace::SR_DISABLED_WITH_OVERRIDE
+ runner_enabled_value: Namespace::SR_ENABLED,
+ runner_disabled_value: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
+ runner_allow_override_value: Namespace::SR_DISABLED_WITH_OVERRIDE
}
end
it 'returns group data for top level group' do
result = {
update_path: "/api/v4/groups/#{parent.id}",
- shared_runners_availability: Namespace::SR_ENABLED,
- parent_shared_runners_availability: nil
+ shared_runners_setting: Namespace::SR_ENABLED,
+ parent_shared_runners_setting: nil
}.merge(runner_constants)
expect(helper.group_shared_runners_settings_data(parent)).to eq result
@@ -118,8 +118,8 @@ RSpec.describe Ci::RunnersHelper do
it 'returns group data for child group' do
result = {
update_path: "/api/v4/groups/#{group.id}",
- shared_runners_availability: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
- parent_shared_runners_availability: Namespace::SR_ENABLED
+ shared_runners_setting: Namespace::SR_DISABLED_AND_UNOVERRIDABLE,
+ parent_shared_runners_setting: Namespace::SR_ENABLED
}.merge(runner_constants)
expect(helper.group_shared_runners_settings_data(group)).to eq result
diff --git a/spec/helpers/ci/secure_files_helper_spec.rb b/spec/helpers/ci/secure_files_helper_spec.rb
new file mode 100644
index 00000000000..02da44f56b2
--- /dev/null
+++ b/spec/helpers/ci/secure_files_helper_spec.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Ci::SecureFilesHelper do
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:anonymous) { create(:user) }
+ let_it_be(:unconfirmed) { create(:user, :unconfirmed) }
+ let_it_be(:project) { create(:project, creator_id: maintainer.id) }
+
+ before_all do
+ project.add_maintainer(maintainer)
+ project.add_developer(developer)
+ project.add_guest(guest)
+ end
+
+ subject { helper.show_secure_files_setting(project, user) }
+
+ describe '#show_secure_files_setting' do
+ context 'when the :ci_secure_files feature flag is enabled' do
+ before do
+ stub_feature_flags(ci_secure_files: true)
+ end
+
+ context 'authenticated user with admin permissions' do
+ let(:user) { maintainer }
+
+ it { is_expected.to be true }
+ end
+
+ context 'authenticated user with read permissions' do
+ let(:user) { developer }
+
+ it { is_expected.to be true }
+ end
+
+ context 'authenticated user with guest permissions' do
+ let(:user) { guest }
+
+ it { is_expected.to be false }
+ end
+
+ context 'authenticated user with no permissions' do
+ let(:user) { anonymous }
+
+ it { is_expected.to be false }
+ end
+
+ context 'unconfirmed user' do
+ let(:user) { unconfirmed }
+
+ it { is_expected.to be false }
+ end
+
+ context 'unauthenticated user' do
+ let(:user) { nil }
+
+ it { is_expected.to be false }
+ end
+ end
+
+ context 'when the :ci_secure_files feature flag is disabled' do
+ before do
+ stub_feature_flags(ci_secure_files: false)
+ end
+
+ context 'authenticated user with admin permissions' do
+ let(:user) { maintainer }
+
+ it { is_expected.to be false }
+ end
+ end
+ end
+end
diff --git a/spec/helpers/clusters_helper_spec.rb b/spec/helpers/clusters_helper_spec.rb
index 4feb9d1a2cd..9a3cd5fd18d 100644
--- a/spec/helpers/clusters_helper_spec.rb
+++ b/spec/helpers/clusters_helper_spec.rb
@@ -66,10 +66,6 @@ RSpec.describe ClustersHelper do
expect(subject[:empty_state_image]).to match(%r(/illustrations/empty-state/empty-state-agents|svg))
end
- it 'displays create cluster using certificate path' do
- expect(subject[:new_cluster_path]).to eq("#{project_path(project)}/-/clusters/new")
- end
-
it 'displays add cluster using certificate path' do
expect(subject[:add_cluster_path]).to eq("#{project_path(project)}/-/clusters/connect")
end
@@ -94,6 +90,10 @@ RSpec.describe ClustersHelper do
expect(subject[:gitlab_version]).to eq(Gitlab.version_info)
end
+ it 'displays KAS version' do
+ expect(subject[:kas_version]).to eq(Gitlab::Kas.version_info)
+ end
+
context 'user has no permissions to create a cluster' do
it 'displays that user can\'t add cluster' do
expect(subject[:can_add_cluster]).to eq("false")
@@ -166,14 +166,6 @@ RSpec.describe ClustersHelper do
end
end
- describe '#js_cluster_new' do
- subject { helper.js_cluster_new }
-
- it 'displays a cluster_connect_help_path' do
- expect(subject[:cluster_connect_help_path]).to eq(help_page_path('user/project/clusters/add_remove_clusters', anchor: 'add-existing-cluster'))
- end
- end
-
describe '#cluster_type_label' do
subject { helper.cluster_type_label(cluster_type) }
diff --git a/spec/helpers/container_registry_helper_spec.rb b/spec/helpers/container_registry_helper_spec.rb
index 57641d4b5df..250f26172a8 100644
--- a/spec/helpers/container_registry_helper_spec.rb
+++ b/spec/helpers/container_registry_helper_spec.rb
@@ -3,17 +3,9 @@
require 'spec_helper'
RSpec.describe ContainerRegistryHelper do
- describe '#container_registry_expiration_policies_throttling?' do
- subject { helper.container_registry_expiration_policies_throttling? }
+ describe '#container_repository_gid_prefix' do
+ subject { helper.container_repository_gid_prefix }
- it { is_expected.to eq(true) }
-
- context 'with container_registry_expiration_policies_throttling disabled' do
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
- end
-
- it { is_expected.to eq(false) }
- end
+ it { is_expected.to eq('gid://gitlab/ContainerRepository/') }
end
end
diff --git a/spec/helpers/cookies_helper_spec.rb b/spec/helpers/cookies_helper_spec.rb
index c73e7d64987..95970c24086 100644
--- a/spec/helpers/cookies_helper_spec.rb
+++ b/spec/helpers/cookies_helper_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe CookiesHelper do
value = 'secure value'
expect_next_instance_of(ActionDispatch::Cookies::EncryptedKeyRotatingCookieJar) do |instance|
- expect(instance).to receive(:[]=).with(key, httponly: true, secure: true, expires: expiration, value: value)
+ expect(instance).to receive(:[]=).with(key, { httponly: true, secure: true, expires: expiration, value: value })
end
helper.set_secure_cookie(key, value, httponly: true, expires: expiration, type: CookiesHelper::COOKIE_TYPE_ENCRYPTED)
@@ -22,7 +22,7 @@ RSpec.describe CookiesHelper do
value = 'permanent value'
expect_next_instance_of(ActionDispatch::Cookies::PermanentCookieJar) do |instance|
- expect(instance).to receive(:[]=).with(key, httponly: false, secure: false, expires: nil, value: value)
+ expect(instance).to receive(:[]=).with(key, { httponly: false, secure: false, expires: nil, value: value })
end
helper.set_secure_cookie(key, value, type: CookiesHelper::COOKIE_TYPE_PERMANENT)
@@ -33,7 +33,7 @@ RSpec.describe CookiesHelper do
value = 'regular value'
expect_next_instance_of(ActionDispatch::Cookies::CookieJar) do |instance|
- expect(instance).to receive(:[]=).with(key, httponly: false, secure: false, expires: nil, value: value)
+ expect(instance).to receive(:[]=).with(key, { httponly: false, secure: false, expires: nil, value: value })
end
helper.set_secure_cookie(key, value)
diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb
index 956c19f54d1..39b919fa925 100644
--- a/spec/helpers/emails_helper_spec.rb
+++ b/spec/helpers/emails_helper_spec.rb
@@ -239,7 +239,7 @@ RSpec.describe EmailsHelper do
create :appearance, header_logo: nil
expect(header_logo).to match(
- %r{<img alt="GitLab" src="/images/mailers/gitlab_header_logo\.(?:gif|png)" width="\d+" height="\d+" />}
+ %r{<img alt="GitLab" src="/images/mailers/gitlab_logo\.(?:gif|png)" width="\d+" height="\d+" />}
)
end
end
@@ -247,7 +247,7 @@ RSpec.describe EmailsHelper do
context 'there is no brand item' do
it 'returns the default header logo' do
expect(header_logo).to match(
- %r{<img alt="GitLab" src="/images/mailers/gitlab_header_logo\.(?:gif|png)" width="\d+" height="\d+" />}
+ %r{<img alt="GitLab" src="/images/mailers/gitlab_logo\.(?:gif|png)" width="\d+" height="\d+" />}
)
end
end
diff --git a/spec/helpers/instance_configuration_helper_spec.rb b/spec/helpers/instance_configuration_helper_spec.rb
index 1ba06b97088..921ec7ee588 100644
--- a/spec/helpers/instance_configuration_helper_spec.rb
+++ b/spec/helpers/instance_configuration_helper_spec.rb
@@ -50,4 +50,14 @@ RSpec.describe InstanceConfigurationHelper do
expect(helper.instance_configuration_human_size_cell(1048576)).to eq('1 MB')
end
end
+
+ describe '#instance_configuration_disabled_cell_html' do
+ it 'returns "-" if parameter is 0' do
+ expect(helper.instance_configuration_disabled_cell_html(0)).to eq('-')
+ end
+
+ it 'return parameter if not 0' do
+ expect(helper.instance_configuration_disabled_cell_html(1)).to eq(1)
+ end
+ end
end
diff --git a/spec/helpers/integrations_helper_spec.rb b/spec/helpers/integrations_helper_spec.rb
index 3bedc1d8aec..dccbc110be6 100644
--- a/spec/helpers/integrations_helper_spec.rb
+++ b/spec/helpers/integrations_helper_spec.rb
@@ -62,6 +62,7 @@ RSpec.describe IntegrationsHelper do
:enable_comments,
:comment_detail,
:learn_more_path,
+ :about_pricing_url,
:trigger_events,
:fields,
:inherit_from_id,
diff --git a/spec/helpers/invite_members_helper_spec.rb b/spec/helpers/invite_members_helper_spec.rb
index 859d145eb53..4d47732e008 100644
--- a/spec/helpers/invite_members_helper_spec.rb
+++ b/spec/helpers/invite_members_helper_spec.rb
@@ -30,6 +30,28 @@ RSpec.describe InviteMembersHelper do
expect(helper.common_invite_group_modal_data(project, ProjectMember, 'true')).to include(attributes)
end
+
+ context 'when sharing with groups outside the hierarchy is disabled' do
+ let_it_be(:group) { create(:group) }
+
+ before do
+ group.update!(prevent_sharing_groups_outside_hierarchy: true)
+ end
+
+ it 'provides the correct attributes' do
+ expect(helper.common_invite_group_modal_data(group, GroupMember, 'false')).to include({ groups_filter: 'descendant_groups', parent_id: group.id })
+ end
+ end
+
+ context 'when sharing with groups outside the hierarchy is enabled' do
+ before do
+ group.update!(prevent_sharing_groups_outside_hierarchy: false)
+ end
+
+ it 'does not return filter attributes' do
+ expect(helper.common_invite_group_modal_data(project.group, ProjectMember, 'true').keys).not_to include(:groups_filter, :parent_id)
+ end
+ end
end
describe '#common_invite_modal_dataset' do
@@ -162,28 +184,4 @@ RSpec.describe InviteMembersHelper do
end
end
end
-
- describe '#group_select_data' do
- let_it_be(:group) { create(:group) }
-
- context 'when sharing with groups outside the hierarchy is disabled' do
- before do
- group.namespace_settings.update!(prevent_sharing_groups_outside_hierarchy: true)
- end
-
- it 'provides the correct attributes' do
- expect(helper.group_select_data(group)).to eq({ groups_filter: 'descendant_groups', parent_id: group.id })
- end
- end
-
- context 'when sharing with groups outside the hierarchy is enabled' do
- before do
- group.namespace_settings.update!(prevent_sharing_groups_outside_hierarchy: false)
- end
-
- it 'returns an empty hash' do
- expect(helper.group_select_data(project.group)).to eq({})
- end
- end
- end
end
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index ee5b0145d13..73527bea14e 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -294,6 +294,7 @@ RSpec.describe IssuablesHelper do
projectPath: @project.path,
projectId: @project.id,
projectNamespace: @project.namespace.path,
+ state: issue.state,
initialTitleHtml: issue.title,
initialTitleText: issue.title,
initialDescriptionHtml: '<p dir="auto">issue text</p>',
@@ -464,6 +465,41 @@ RSpec.describe IssuablesHelper do
end
end
+ describe '#state_name_with_icon' do
+ let_it_be(:project) { create(:project, :repository) }
+
+ context 'for an issue' do
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:issue_closed) { create(:issue, :closed, project: project) }
+
+ it 'returns the correct state name and icon when issue is open' do
+ expect(helper.state_name_with_icon(issue)).to match_array([_('Open'), 'issues'])
+ end
+
+ it 'returns the correct state name and icon when issue is closed' do
+ expect(helper.state_name_with_icon(issue_closed)).to match_array([_('Closed'), 'issue-closed'])
+ end
+ end
+
+ context 'for a merge request' do
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+ let_it_be(:merge_request_merged) { create(:merge_request, :merged, source_project: project) }
+ let_it_be(:merge_request_closed) { create(:merge_request, :closed, source_project: project) }
+
+ it 'returns the correct state name and icon when merge request is open' do
+ expect(helper.state_name_with_icon(merge_request)).to match_array([_('Open'), 'merge-request-open'])
+ end
+
+ it 'returns the correct state name and icon when merge request is merged' do
+ expect(helper.state_name_with_icon(merge_request_merged)).to match_array([_('Merged'), 'merge'])
+ end
+
+ it 'returns the correct state name and icon when merge request is closed' do
+ expect(helper.state_name_with_icon(merge_request_closed)).to match_array([_('Closed'), 'merge-request-close'])
+ end
+ end
+ end
+
describe '#issuable_display_type' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index 0f653fdd282..0421c7b7458 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -302,6 +302,7 @@ RSpec.describe IssuesHelper do
is_anonymous_search_disabled: 'true',
is_issue_repositioning_disabled: 'true',
is_project: 'true',
+ is_public_visibility_restricted: 'false',
is_signed_in: current_user.present?.to_s,
jira_integration_path: help_page_url('integration/jira/issues', anchor: 'view-jira-issues'),
markdown_help_path: help_page_path('user/markdown'),
diff --git a/spec/helpers/jira_connect_helper_spec.rb b/spec/helpers/jira_connect_helper_spec.rb
index 1c1b2a22b7c..169a5c0076a 100644
--- a/spec/helpers/jira_connect_helper_spec.rb
+++ b/spec/helpers/jira_connect_helper_spec.rb
@@ -23,6 +23,7 @@ RSpec.describe JiraConnectHelper do
it 'includes Jira Connect app attributes' do
is_expected.to include(
:groups_path,
+ :add_subscriptions_path,
:subscriptions_path,
:users_path,
:subscriptions,
diff --git a/spec/helpers/lazy_image_tag_helper_spec.rb b/spec/helpers/lazy_image_tag_helper_spec.rb
new file mode 100644
index 00000000000..2d9445bb6cb
--- /dev/null
+++ b/spec/helpers/lazy_image_tag_helper_spec.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe LazyImageTagHelper do
+ describe '#image_tag' do
+ let(:image_src) { '/path/to/image.jpg' }
+ let(:dark_image_src) { '/path/to/image_dark.jpg' }
+
+ context 'when only source passed' do
+ let(:current_user) { create(:user) }
+ let(:result) { image_tag(image_src) }
+
+ it 'returns a lazy image tag by default' do
+ expect(result).to eq(
+ "<img data-src=\"#{image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+
+ context 'when lazy mode is disabled' do
+ let(:current_user) { create(:user) }
+ let(:result) { image_tag(image_src, lazy: false) }
+
+ it 'returns a normal image tag' do
+ expect(result).to eq(
+ "<img src=\"#{image_src}\" />"
+ )
+ end
+ end
+
+ context 'when Dark Mode is enabled' do
+ let(:current_user) { create(:user, theme_id: 11) }
+
+ context 'when auto dark enabled' do
+ let(:result) { image_tag(image_src, auto_dark: true) }
+
+ it 'adds an auto dark mode class from gitlab-ui' do
+ expect(result).to eq(
+ "<img class=\"gl-dark-invert-keep-hue lazy\" data-src=\"#{image_src}\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+
+ context 'when auto dark disabled' do
+ let(:result) { image_tag(image_src, auto_dark: false) }
+
+ it 'does nothing' do
+ expect(result).to eq(
+ "<img data-src=\"#{image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+
+ context 'when dark variant is present' do
+ let(:result) { image_tag(image_src, dark_variant: dark_image_src) }
+
+ it 'uses dark variant as a source' do
+ expect(result).to eq(
+ "<img data-src=\"#{dark_image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+ end
+
+ context 'when Dark Mode is disabled' do
+ let(:current_user) { create(:user, theme_id: 1) }
+
+ context 'when auto dark enabled' do
+ let(:result) { image_tag(image_src, auto_dark: true) }
+
+ it 'does not add a dark mode class from gitlab-ui' do
+ expect(result).to eq(
+ "<img data-src=\"#{image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+
+ context 'when auto dark disabled' do
+ let(:result) { image_tag(image_src, auto_dark: true) }
+
+ it 'does nothing' do
+ expect(result).to eq(
+ "<img data-src=\"#{image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+
+ context 'when dark variant is present' do
+ let(:result) { image_tag(image_src, dark_variant: dark_image_src) }
+
+ it 'uses original image as a source' do
+ expect(result).to eq(
+ "<img data-src=\"#{image_src}\" class=\"lazy\" src=\"#{placeholder_image}\" />"
+ )
+ end
+ end
+ end
+
+ context 'when auto_dark and dark_variant are both passed' do
+ let(:current_user) { create(:user) }
+
+ it 'does not add a dark mode class from gitlab-ui' do
+ expect { image_tag('image.jpg', dark_variant: 'image_dark.jpg', auto_dark: true) }
+ .to raise_error(ArgumentError, 'dark_variant and auto_dark are mutually exclusive')
+ end
+ end
+ end
+end
diff --git a/spec/helpers/merge_requests_helper_spec.rb b/spec/helpers/merge_requests_helper_spec.rb
index 38f2efd75a8..97ad55d9df9 100644
--- a/spec/helpers/merge_requests_helper_spec.rb
+++ b/spec/helpers/merge_requests_helper_spec.rb
@@ -5,31 +5,6 @@ require 'spec_helper'
RSpec.describe MergeRequestsHelper do
include ProjectForksHelper
- describe '#state_name_with_icon' do
- using RSpec::Parameterized::TableSyntax
-
- let(:merge_request) { MergeRequest.new }
-
- where(:state, :expected_name, :expected_icon) do
- :merged? | 'Merged' | 'git-merge'
- :closed? | 'Closed' | 'close'
- :opened? | 'Open' | 'issue-open-m'
- end
-
- with_them do
- before do
- allow(merge_request).to receive(state).and_return(true)
- end
-
- it 'returns name and icon' do
- name, icon = helper.state_name_with_icon(merge_request)
-
- expect(name).to eq(expected_name)
- expect(icon).to eq(expected_icon)
- end
- end
- end
-
describe '#format_mr_branch_names' do
describe 'within the same project' do
let(:merge_request) { create(:merge_request) }
@@ -84,7 +59,7 @@ RSpec.describe MergeRequestsHelper do
describe 'mr_attention_requests disabled' do
before do
- stub_feature_flags(mr_attention_requests: false)
+ allow(user).to receive(:mr_attention_requests_enabled?).and_return(false)
end
it "returns assigned, review requested and total merge request counts" do
@@ -97,6 +72,10 @@ RSpec.describe MergeRequestsHelper do
end
describe 'mr_attention_requests enabled' do
+ before do
+ allow(user).to receive(:mr_attention_requests_enabled?).and_return(true)
+ end
+
it "returns assigned, review requested, attention requests and total merge request counts" do
expect(subject).to eq(
assigned: user.assigned_open_merge_requests_count,
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 52c1130e818..39f0e1c15f5 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -269,12 +269,13 @@ RSpec.describe NamespacesHelper do
end
end
- describe '#pipeline_usage_quota_app_data' do
+ describe '#pipeline_usage_app_data' do
it 'returns a hash with necessary data for the frontend' do
- expect(helper.pipeline_usage_quota_app_data(user_group)).to eql({
+ expect(helper.pipeline_usage_app_data(user_group)).to eql({
namespace_actual_plan_name: user_group.actual_plan_name,
namespace_path: user_group.full_path,
namespace_id: user_group.id,
+ user_namespace: user_group.user_namespace?.to_s,
page_size: Kaminari.config.default_per_page
})
end
diff --git a/spec/helpers/page_layout_helper_spec.rb b/spec/helpers/page_layout_helper_spec.rb
index d261fb43bb6..d0d399ad10f 100644
--- a/spec/helpers/page_layout_helper_spec.rb
+++ b/spec/helpers/page_layout_helper_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe PageLayoutHelper do
describe 'page_image' do
it 'defaults to the GitLab logo' do
- expect(helper.page_image).to match_asset_path 'assets/gitlab_logo.png'
+ expect(helper.page_image).to match_asset_path 'assets/twitter_card.jpg'
end
%w(project user group).each do |type|
@@ -72,14 +72,14 @@ RSpec.describe PageLayoutHelper do
let(:trait) { nil }
it 'falls back to the default when avatar_url is nil' do
- expect(helper.page_image).to match_asset_path 'assets/gitlab_logo.png'
+ expect(helper.page_image).to match_asset_path 'assets/twitter_card.jpg'
end
end
end
context "with no assignments" do
it 'falls back to the default' do
- expect(helper.page_image).to match_asset_path 'assets/gitlab_logo.png'
+ expect(helper.page_image).to match_asset_path 'assets/twitter_card.jpg'
end
end
end
diff --git a/spec/helpers/profiles_helper_spec.rb b/spec/helpers/profiles_helper_spec.rb
index c3a3c2a0178..399726263db 100644
--- a/spec/helpers/profiles_helper_spec.rb
+++ b/spec/helpers/profiles_helper_spec.rb
@@ -111,7 +111,6 @@ RSpec.describe ProfilesHelper do
where(:error, :expired, :result) do
false | false | nil
true | false | error_message
- false | true | 'Key usable beyond expiration date.'
true | true | error_message
end
@@ -130,13 +129,9 @@ RSpec.describe ProfilesHelper do
end
describe "#ssh_key_expires_field_description" do
- before do
- allow(Key).to receive(:enforce_ssh_key_expiration_feature_available?).and_return(false)
- end
+ subject { helper.ssh_key_expires_field_description }
- it 'returns the description' do
- expect(helper.ssh_key_expires_field_description).to eq('Key can still be used after expiration.')
- end
+ it { is_expected.to eq('Key becomes invalid on this date.') }
end
describe '#middle_dot_divider_classes' do
diff --git a/spec/helpers/projects/pipeline_helper_spec.rb b/spec/helpers/projects/pipeline_helper_spec.rb
index 67405ee3b21..90cf3cb03f8 100644
--- a/spec/helpers/projects/pipeline_helper_spec.rb
+++ b/spec/helpers/projects/pipeline_helper_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe Projects::PipelineHelper do
can_generate_codequality_reports: pipeline.can_generate_codequality_reports?.to_json,
graphql_resource_etag: graphql_etag_pipeline_path(pipeline),
metrics_path: namespace_project_ci_prometheus_metrics_histograms_path(namespace_id: project.namespace, project_id: project, format: :json),
+ pipeline_iid: pipeline.iid,
pipeline_project_path: project.full_path
})
end
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index 1cf36fd69cf..d13c5dfcc9e 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -279,7 +279,7 @@ RSpec.describe ProjectsHelper do
it 'returns message prompting user to set password or set up a PAT' do
stub_application_setting(password_authentication_enabled_for_git?: true)
- expect(helper.no_password_message).to eq('Your account is authenticated with SSO or SAML. To <a href="/help/gitlab-basics/start-using-git#pull-and-push" target="_blank" rel="noopener noreferrer">push and pull</a> over HTTP with Git using this account, you must <a href="/-/profile/password/edit">set a password</a> or <a href="/-/profile/personal_access_tokens">set up a Personal Access Token</a> to use instead of a password. For more information, see <a href="/help/gitlab-basics/start-using-git#clone-with-https" target="_blank" rel="noopener noreferrer">Clone with HTTPS</a>.')
+ expect(helper.no_password_message).to eq('Your account is authenticated with SSO or SAML. To <a href="/help/topics/git/terminology#pull-and-push" target="_blank" rel="noopener noreferrer">push and pull</a> over HTTP with Git using this account, you must <a href="/-/profile/password/edit">set a password</a> or <a href="/-/profile/personal_access_tokens">set up a Personal Access Token</a> to use instead of a password. For more information, see <a href="/help/gitlab-basics/start-using-git#clone-with-https" target="_blank" rel="noopener noreferrer">Clone with HTTPS</a>.')
end
end
@@ -287,7 +287,7 @@ RSpec.describe ProjectsHelper do
it 'returns message prompting user to set up a PAT' do
stub_application_setting(password_authentication_enabled_for_git?: false)
- expect(helper.no_password_message).to eq('Your account is authenticated with SSO or SAML. To <a href="/help/gitlab-basics/start-using-git#pull-and-push" target="_blank" rel="noopener noreferrer">push and pull</a> over HTTP with Git using this account, you must <a href="/-/profile/personal_access_tokens">set up a Personal Access Token</a> to use instead of a password. For more information, see <a href="/help/gitlab-basics/start-using-git#clone-with-https" target="_blank" rel="noopener noreferrer">Clone with HTTPS</a>.')
+ expect(helper.no_password_message).to eq('Your account is authenticated with SSO or SAML. To <a href="/help/topics/git/terminology#pull-and-push" target="_blank" rel="noopener noreferrer">push and pull</a> over HTTP with Git using this account, you must <a href="/-/profile/personal_access_tokens">set up a Personal Access Token</a> to use instead of a password. For more information, see <a href="/help/gitlab-basics/start-using-git#clone-with-https" target="_blank" rel="noopener noreferrer">Clone with HTTPS</a>.')
end
end
end
diff --git a/spec/helpers/releases_helper_spec.rb b/spec/helpers/releases_helper_spec.rb
index 69f66dc6488..b7493e84c6a 100644
--- a/spec/helpers/releases_helper_spec.rb
+++ b/spec/helpers/releases_helper_spec.rb
@@ -9,9 +9,9 @@ RSpec.describe ReleasesHelper do
end
end
- describe '#help_page' do
+ describe '#releases_help_page_path' do
it 'returns the correct link to the help page' do
- expect(helper.help_page).to include('user/project/releases/index')
+ expect(helper.releases_help_page_path).to include('user/project/releases/index')
end
end
@@ -63,7 +63,8 @@ RSpec.describe ReleasesHelper do
releases_page_path
release_assets_docs_path
manage_milestones_path
- new_milestone_path)
+ new_milestone_path
+ edit_release_docs_path)
expect(helper.data_for_edit_release_page.keys).to match_array(keys)
end
@@ -81,7 +82,8 @@ RSpec.describe ReleasesHelper do
release_assets_docs_path
manage_milestones_path
new_milestone_path
- default_branch)
+ default_branch
+ edit_release_docs_path)
expect(helper.data_for_new_release_page.keys).to match_array(keys)
end
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index d1be451a759..8e2ec014383 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -328,7 +328,6 @@ RSpec.describe SearchHelper do
end
it 'includes project endpoints' do
- expect(search_filter_input_options('')[:data]['runner-tags-endpoint']).to eq(tag_list_admin_runners_path)
expect(search_filter_input_options('')[:data]['labels-endpoint']).to eq(project_labels_path(@project))
expect(search_filter_input_options('')[:data]['milestones-endpoint']).to eq(project_milestones_path(@project))
expect(search_filter_input_options('')[:data]['releases-endpoint']).to eq(project_releases_path(@project))
@@ -349,7 +348,6 @@ RSpec.describe SearchHelper do
end
it 'includes group endpoints' do
- expect(search_filter_input_options('')[:data]['runner-tags-endpoint']).to eq(tag_list_admin_runners_path)
expect(search_filter_input_options('')[:data]['labels-endpoint']).to eq(group_labels_path(@group))
expect(search_filter_input_options('')[:data]['milestones-endpoint']).to eq(group_milestones_path(@group))
end
@@ -362,7 +360,6 @@ RSpec.describe SearchHelper do
end
it 'includes dashboard endpoints' do
- expect(search_filter_input_options('')[:data]['runner-tags-endpoint']).to eq(tag_list_admin_runners_path)
expect(search_filter_input_options('')[:data]['labels-endpoint']).to eq(dashboard_labels_path)
expect(search_filter_input_options('')[:data]['milestones-endpoint']).to eq(dashboard_milestones_path)
end
diff --git a/spec/helpers/sidebars_helper_spec.rb b/spec/helpers/sidebars_helper_spec.rb
index e329968e6c0..6db955f3637 100644
--- a/spec/helpers/sidebars_helper_spec.rb
+++ b/spec/helpers/sidebars_helper_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe SidebarsHelper do
subject { helper.sidebar_tracking_attributes_by_object(object) }
before do
- allow(helper).to receive(:tracking_enabled?).and_return(true)
+ stub_application_setting(snowplow_enabled: true)
end
context 'when object is a project' do
diff --git a/spec/helpers/storage_helper_spec.rb b/spec/helpers/storage_helper_spec.rb
index 6b743422b04..5bc4024ae24 100644
--- a/spec/helpers/storage_helper_spec.rb
+++ b/spec/helpers/storage_helper_spec.rb
@@ -88,14 +88,26 @@ RSpec.describe StorageHelper do
expect(helper.storage_enforcement_banner_info(free_group)).to be(nil)
end
- it 'returns a hash when current_user can access usage quotas page' do
- expect(helper.storage_enforcement_banner_info(free_group)).to eql({
- text: "From #{storage_enforcement_date} storage limits will apply to this namespace. View and manage your usage in <strong>Group settings &gt; Usage quotas</strong>.",
- variant: 'warning',
- callouts_feature_name: 'storage_enforcement_banner_second_enforcement_threshold',
- callouts_path: '/-/users/group_callouts',
- learn_more_link: '<a rel="noopener noreferrer" target="_blank" href="/help//">Learn more.</a>'
- })
+ context 'when current_user can access the usage quotas page' do
+ it 'returns a hash' do
+ expect(helper.storage_enforcement_banner_info(free_group)).to eql({
+ text: "From #{storage_enforcement_date} storage limits will apply to this namespace. You are currently using 0 Bytes of namespace storage. View and manage your usage from <strong>Group settings &gt; Usage quotas</strong>.",
+ variant: 'warning',
+ callouts_feature_name: 'storage_enforcement_banner_second_enforcement_threshold',
+ callouts_path: '/-/users/group_callouts',
+ learn_more_link: '<a rel="noopener noreferrer" target="_blank" href="/help//">Learn more.</a>'
+ })
+ end
+
+ context 'when namespace has used storage' do
+ before do
+ create(:namespace_root_storage_statistics, namespace: free_group, storage_size: 102400)
+ end
+
+ it 'returns a hash with the correct storage size text' do
+ expect(helper.storage_enforcement_banner_info(free_group)[:text]).to eql("From #{storage_enforcement_date} storage limits will apply to this namespace. You are currently using 100 KB of namespace storage. View and manage your usage from <strong>Group settings &gt; Usage quotas</strong>.")
+ end
+ end
end
end
diff --git a/spec/helpers/tracking_helper_spec.rb b/spec/helpers/tracking_helper_spec.rb
index cd2f8f9b7d1..81121275c92 100644
--- a/spec/helpers/tracking_helper_spec.rb
+++ b/spec/helpers/tracking_helper_spec.rb
@@ -7,29 +7,24 @@ RSpec.describe TrackingHelper do
using RSpec::Parameterized::TableSyntax
let(:input) { %w(a b c) }
- let(:results) do
- {
- no_data: {},
- with_data: { data: { track_label: 'a', track_action: 'b', track_property: 'c' } }
- }
+ let(:result) { { data: { track_label: 'a', track_action: 'b', track_property: 'c' } } }
+
+ before do
+ stub_application_setting(snowplow_enabled: true)
end
- where(:snowplow_enabled, :environment, :result) do
- true | 'production' | :with_data
- false | 'production' | :no_data
- true | 'development' | :no_data
- false | 'development' | :no_data
- true | 'test' | :no_data
- false | 'test' | :no_data
+ it 'returns no data if snowplow is disabled' do
+ stub_application_setting(snowplow_enabled: false)
+
+ expect(helper.tracking_attrs(*input)).to eq({})
end
- with_them do
- it 'returns a hash' do
- stub_application_setting(snowplow_enabled: snowplow_enabled)
- allow(Rails).to receive(:env).and_return(environment.inquiry)
+ it 'returns data hash' do
+ expect(helper.tracking_attrs(*input)).to eq(result)
+ end
- expect(helper.tracking_attrs(*input)).to eq(results[result])
- end
+ it 'can return data directly' do
+ expect(helper.tracking_attrs_data(*input)).to eq(result[:data])
end
end
end
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index 82f4ae596e1..88030299574 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -378,7 +378,7 @@ RSpec.describe UsersHelper do
it 'users matches the serialized json' do
entity = double
expect_next_instance_of(Admin::UserSerializer) do |instance|
- expect(instance).to receive(:represent).with([user], current_user: user).and_return(entity)
+ expect(instance).to receive(:represent).with([user], { current_user: user }).and_return(entity)
end
expect(entity).to receive(:to_json).and_return("{\"username\":\"admin\"}")
expect(data[:users]).to eq "{\"username\":\"admin\"}"
diff --git a/spec/initializers/00_connection_logger_spec.rb b/spec/initializers/00_connection_logger_spec.rb
new file mode 100644
index 00000000000..8b288b463c4
--- /dev/null
+++ b/spec/initializers/00_connection_logger_spec.rb
@@ -0,0 +1,39 @@
+# 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/validate_database_config_spec.rb b/spec/initializers/validate_database_config_spec.rb
index 209d9691350..5f3f950a852 100644
--- a/spec/initializers/validate_database_config_spec.rb
+++ b/spec/initializers/validate_database_config_spec.rb
@@ -39,47 +39,23 @@ RSpec.describe 'validate database config' do
end
context 'when config/database.yml is valid' do
- context 'uses legacy syntax' do
- let(:database_yml) do
- <<-EOS
- production:
+ let(:database_yml) do
+ <<-EOS
+ production:
+ main:
adapter: postgresql
encoding: unicode
database: gitlabhq_production
username: git
password: "secure password"
host: localhost
- EOS
- end
-
- it 'validates configuration with a warning' do
- expect(main_object).to receive(:warn).with /uses a deprecated syntax for/
-
- expect { subject }.not_to raise_error
- end
-
- it_behaves_like 'with SKIP_DATABASE_CONFIG_VALIDATION=true'
+ EOS
end
- context 'uses new syntax' do
- let(:database_yml) do
- <<-EOS
- production:
- main:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- username: git
- password: "secure password"
- host: localhost
- EOS
- end
+ it 'validates configuration without errors and warnings' do
+ expect(main_object).not_to receive(:warn)
- it 'validates configuration without errors and warnings' do
- expect(main_object).not_to receive(:warn)
-
- expect { subject }.not_to raise_error
- end
+ expect { subject }.not_to raise_error
end
end
diff --git a/spec/lib/api/ci/helpers/runner_helpers_spec.rb b/spec/lib/api/ci/helpers/runner_helpers_spec.rb
index c4d740f0adc..c6cdc1732f5 100644
--- a/spec/lib/api/ci/helpers/runner_helpers_spec.rb
+++ b/spec/lib/api/ci/helpers/runner_helpers_spec.rb
@@ -70,5 +70,17 @@ RSpec.describe API::Ci::Helpers::Runner do
expect(details['ip_address']).to eq(ip_address)
end
end
+
+ describe '#log_artifact_size' do
+ subject { runner_helper.log_artifact_size(artifact) }
+
+ let(:runner_params) { {} }
+ let(:artifact) { create(:ci_job_artifact, size: 42) }
+ let(:expected_params) { { artifact_size: artifact.size } }
+ let(:subject_proc) { proc { subject } }
+
+ it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'not executing any extra queries for the application context'
+ end
end
end
diff --git a/spec/lib/api/entities/ci/job_request/dependency_spec.rb b/spec/lib/api/entities/ci/job_request/dependency_spec.rb
index fa5f3da554c..bbeb864c2ee 100644
--- a/spec/lib/api/entities/ci/job_request/dependency_spec.rb
+++ b/spec/lib/api/entities/ci/job_request/dependency_spec.rb
@@ -3,8 +3,9 @@
require 'spec_helper'
RSpec.describe API::Entities::Ci::JobRequest::Dependency do
+ let(:running_job) { create(:ci_build, :artifacts) }
let(:job) { create(:ci_build, :artifacts) }
- let(:entity) { described_class.new(job) }
+ let(:entity) { described_class.new(job, { running_job: running_job }) }
subject { entity.as_json }
@@ -16,8 +17,8 @@ RSpec.describe API::Entities::Ci::JobRequest::Dependency do
expect(subject[:name]).to eq(job.name)
end
- it 'returns the dependency token' do
- expect(subject[:token]).to eq(job.token)
+ it 'returns the token belonging to the running job' do
+ expect(subject[:token]).to eq(running_job.token)
end
it 'returns the dependency artifacts_file', :aggregate_failures do
diff --git a/spec/lib/api/entities/plan_limit_spec.rb b/spec/lib/api/entities/plan_limit_spec.rb
index 1b8b21d47f3..a88ea3f4cad 100644
--- a/spec/lib/api/entities/plan_limit_spec.rb
+++ b/spec/lib/api/entities/plan_limit_spec.rb
@@ -9,6 +9,14 @@ RSpec.describe API::Entities::PlanLimit do
it 'exposes correct attributes' do
expect(subject).to include(
+ :ci_pipeline_size,
+ :ci_active_jobs,
+ :ci_active_pipelines,
+ :ci_project_subscriptions,
+ :ci_pipeline_schedules,
+ :ci_needs_size_limit,
+ :ci_registered_group_runners,
+ :ci_registered_project_runners,
:conan_max_file_size,
:generic_packages_max_file_size,
:helm_max_file_size,
@@ -16,7 +24,8 @@ RSpec.describe API::Entities::PlanLimit do
:npm_max_file_size,
:nuget_max_file_size,
:pypi_max_file_size,
- :terraform_module_max_file_size
+ :terraform_module_max_file_size,
+ :storage_size_limit
)
end
diff --git a/spec/lib/api/entities/projects/topic_spec.rb b/spec/lib/api/entities/projects/topic_spec.rb
index cdf142dbb7d..1ea0e724fed 100644
--- a/spec/lib/api/entities/projects/topic_spec.rb
+++ b/spec/lib/api/entities/projects/topic_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe API::Entities::Projects::Topic do
expect(subject).to include(
:id,
:name,
+ :title,
:description,
:total_projects_count,
:avatar_url
diff --git a/spec/lib/api/entities/user_spec.rb b/spec/lib/api/entities/user_spec.rb
index be5e8e8e8c2..407f2894f01 100644
--- a/spec/lib/api/entities/user_spec.rb
+++ b/spec/lib/api/entities/user_spec.rb
@@ -12,7 +12,40 @@ RSpec.describe API::Entities::User do
subject { entity.as_json }
it 'exposes correct attributes' do
- expect(subject).to include(:name, :bio, :location, :public_email, :skype, :linkedin, :twitter, :website_url, :organization, :job_title, :work_information, :pronouns)
+ expect(subject.keys).to contain_exactly(
+ # UserSafe
+ :id, :username, :name,
+ # UserBasic
+ :state, :avatar_url, :web_url,
+ # User
+ :created_at, :bio, :location, :public_email, :skype, :linkedin, :twitter,
+ :website_url, :organization, :job_title, :pronouns, :bot, :work_information,
+ :followers, :following, :is_followed, :local_time
+ )
+ end
+
+ context 'exposing follow relationships' do
+ before do
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, user).and_return(can_read_user_profile)
+ end
+
+ %i(followers following is_followed).each do |relationship|
+ context 'when current user cannot read user profile' do
+ let(:can_read_user_profile) { false }
+
+ it "does not expose #{relationship}" do
+ expect(subject).not_to include(relationship)
+ end
+ end
+
+ context 'when current user can read user profile' do
+ let(:can_read_user_profile) { true }
+
+ it "exposes #{relationship}" do
+ expect(subject).to include(relationship)
+ end
+ end
+ end
end
it 'exposes created_at if the current user can read the user profile' do
@@ -135,6 +168,16 @@ RSpec.describe API::Entities::User do
end
end
+ context 'with logged-out user' do
+ let(:current_user) { nil }
+
+ it 'exposes is_followed as nil' do
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, user).and_return(true)
+
+ expect(subject.keys).not_to include(:is_followed)
+ end
+ end
+
it 'exposes local_time' do
local_time = '2:30 PM'
expect(entity).to receive(:local_time).with(timezone).and_return(local_time)
diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb
index 2afe5a1a9d7..78ce9642392 100644
--- a/spec/lib/api/helpers_spec.rb
+++ b/spec/lib/api/helpers_spec.rb
@@ -150,8 +150,8 @@ RSpec.describe API::Helpers do
context 'when user is authenticated' do
before do
- subject.instance_variable_set(:@current_user, user)
- subject.instance_variable_set(:@initial_current_user, user)
+ allow(subject).to receive(:current_user).and_return(user)
+ allow(subject).to receive(:initial_current_user).and_return(user)
end
context 'public project' do
@@ -167,8 +167,8 @@ RSpec.describe API::Helpers do
context 'when user is not authenticated' do
before do
- subject.instance_variable_set(:@current_user, nil)
- subject.instance_variable_set(:@initial_current_user, nil)
+ allow(subject).to receive(:current_user).and_return(nil)
+ allow(subject).to receive(:initial_current_user).and_return(nil)
end
context 'public project' do
@@ -181,59 +181,214 @@ RSpec.describe API::Helpers do
it_behaves_like 'private project without access'
end
end
+
+ context 'support for IDs and paths as argument' do
+ let_it_be(:project) { create(:project) }
+
+ let(:user) { project.first_owner}
+
+ before do
+ allow(subject).to receive(:current_user).and_return(user)
+ allow(subject).to receive(:authorized_project_scope?).and_return(true)
+ allow(subject).to receive(:job_token_authentication?).and_return(false)
+ allow(subject).to receive(:authenticate_non_public?).and_return(false)
+ end
+
+ shared_examples 'project finder' do
+ context 'when project exists' do
+ it 'returns requested project' do
+ expect(subject.find_project!(existing_id)).to eq(project)
+ end
+
+ it 'returns nil' do
+ expect(subject).to receive(:render_api_error!).with('404 Project Not Found', 404)
+ expect(subject.find_project!(non_existing_id)).to be_nil
+ end
+ end
+ end
+
+ context 'when ID is used as an argument' do
+ let(:existing_id) { project.id }
+ let(:non_existing_id) { non_existing_record_id }
+
+ it_behaves_like 'project finder'
+ end
+
+ context 'when PATH is used as an argument' do
+ let(:existing_id) { project.full_path }
+ let(:non_existing_id) { 'something/else' }
+
+ it_behaves_like 'project finder'
+
+ context 'with an invalid PATH' do
+ let(:non_existing_id) { 'undefined' } # path without slash
+
+ it_behaves_like 'project finder'
+
+ it 'does not hit the database' do
+ expect(Project).not_to receive(:find_by_full_path)
+ expect(subject).to receive(:render_api_error!).with('404 Project Not Found', 404)
+
+ subject.find_project!(non_existing_id)
+ end
+ end
+ end
+ end
end
- describe '#find_project!' do
- let_it_be(:project) { create(:project) }
+ describe '#find_group!' do
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:user) { create(:user) }
- let(:user) { project.first_owner}
+ shared_examples 'private group without access' do
+ before do
+ group.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value('private'))
+ allow(subject).to receive(:authenticate_non_public?).and_return(false)
+ end
- before do
- allow(subject).to receive(:current_user).and_return(user)
- allow(subject).to receive(:authorized_project_scope?).and_return(true)
- allow(subject).to receive(:job_token_authentication?).and_return(false)
- allow(subject).to receive(:authenticate_non_public?).and_return(false)
+ it 'returns not found' do
+ expect(subject).to receive(:not_found!)
+
+ subject.find_group!(group.id)
+ end
end
- shared_examples 'project finder' do
- context 'when project exists' do
- it 'returns requested project' do
- expect(subject.find_project!(existing_id)).to eq(project)
+ context 'when user is authenticated' do
+ before do
+ allow(subject).to receive(:current_user).and_return(user)
+ allow(subject).to receive(:initial_current_user).and_return(user)
+ end
+
+ context 'public group' do
+ it 'returns requested group' do
+ expect(subject.find_group!(group.id)).to eq(group)
end
+ end
- it 'returns nil' do
- expect(subject).to receive(:render_api_error!).with('404 Project Not Found', 404)
- expect(subject.find_project!(non_existing_id)).to be_nil
+ context 'private group' do
+ it_behaves_like 'private group without access'
+ end
+ end
+
+ context 'when user is not authenticated' do
+ before do
+ allow(subject).to receive(:current_user).and_return(nil)
+ allow(subject).to receive(:initial_current_user).and_return(nil)
+ end
+
+ context 'public group' do
+ it 'returns requested group' do
+ expect(subject.find_group!(group.id)).to eq(group)
end
end
+
+ context 'private group' do
+ it_behaves_like 'private group without access'
+ end
end
- context 'when ID is used as an argument' do
- let(:existing_id) { project.id }
- let(:non_existing_id) { non_existing_record_id }
+ context 'support for IDs and paths as arguments' do
+ let_it_be(:group) { create(:group) }
- it_behaves_like 'project finder'
+ let(:user) { group.first_owner }
+
+ before do
+ allow(subject).to receive(:current_user).and_return(user)
+ allow(subject).to receive(:authorized_project_scope?).and_return(true)
+ allow(subject).to receive(:job_token_authentication?).and_return(false)
+ allow(subject).to receive(:authenticate_non_public?).and_return(false)
+ end
+
+ shared_examples 'group finder' do
+ context 'when group exists' do
+ it 'returns requested group' do
+ expect(subject.find_group!(existing_id)).to eq(group)
+ end
+
+ it 'returns nil' do
+ expect(subject).to receive(:render_api_error!).with('404 Group Not Found', 404)
+ expect(subject.find_group!(non_existing_id)).to be_nil
+ end
+ end
+ end
+
+ context 'when ID is used as an argument' do
+ let(:existing_id) { group.id }
+ let(:non_existing_id) { non_existing_record_id }
+
+ it_behaves_like 'group finder'
+ end
+
+ context 'when PATH is used as an argument' do
+ let(:existing_id) { group.full_path }
+ let(:non_existing_id) { 'something/else' }
+
+ it_behaves_like 'group finder'
+ end
end
+ end
- context 'when PATH is used as an argument' do
- let(:existing_id) { project.full_path }
- let(:non_existing_id) { 'something/else' }
+ describe '#find_group_by_full_path!' do
+ let_it_be(:group) { create(:group, :public) }
+ let_it_be(:user) { create(:user) }
- it_behaves_like 'project finder'
+ shared_examples 'private group without access' do
+ before do
+ group.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value('private'))
+ allow(subject).to receive(:authenticate_non_public?).and_return(false)
+ end
- context 'with an invalid PATH' do
- let(:non_existing_id) { 'undefined' } # path without slash
+ it 'returns not found' do
+ expect(subject).to receive(:not_found!)
- it_behaves_like 'project finder'
+ subject.find_group_by_full_path!(group.full_path)
+ end
+ end
- it 'does not hit the database' do
- expect(Project).not_to receive(:find_by_full_path)
- expect(subject).to receive(:render_api_error!).with('404 Project Not Found', 404)
+ context 'when user is authenticated' do
+ before do
+ allow(subject).to receive(:current_user).and_return(user)
+ allow(subject).to receive(:initial_current_user).and_return(user)
+ end
- subject.find_project!(non_existing_id)
+ context 'public group' do
+ it 'returns requested group' do
+ expect(subject.find_group_by_full_path!(group.full_path)).to eq(group)
+ end
+ end
+
+ context 'private group' do
+ it_behaves_like 'private group without access'
+
+ context 'with access' do
+ before do
+ group.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value('private'))
+ group.add_developer(user)
+ end
+
+ it 'returns requested group with access' do
+ expect(subject.find_group_by_full_path!(group.full_path)).to eq(group)
+ end
end
end
end
+
+ context 'when user is not authenticated' do
+ before do
+ allow(subject).to receive(:current_user).and_return(nil)
+ allow(subject).to receive(:initial_current_user).and_return(nil)
+ end
+
+ context 'public group' do
+ it 'returns requested group' do
+ expect(subject.find_group_by_full_path!(group.full_path)).to eq(group)
+ end
+ end
+
+ context 'private group' do
+ it_behaves_like 'private group without access'
+ end
+ end
end
describe '#find_namespace' do
@@ -433,7 +588,7 @@ RSpec.describe API::Helpers do
end
end
- describe '#order_options_with_tie_breaker' do
+ shared_examples '#order_options_with_tie_breaker' do
subject { Class.new.include(described_class).new.order_options_with_tie_breaker }
before do
@@ -475,6 +630,30 @@ RSpec.describe API::Helpers do
end
end
+ describe '#order_options_with_tie_breaker' do
+ include_examples '#order_options_with_tie_breaker'
+
+ context 'with created_at order given' do
+ let(:params) { { order_by: 'created_at', sort: 'asc' } }
+
+ it 'converts to id' do
+ is_expected.to eq({ 'id' => 'asc' })
+ end
+
+ context 'when replace_order_by_created_at_with_id feature flag is disabled' do
+ before do
+ stub_feature_flags(replace_order_by_created_at_with_id: false)
+ end
+
+ include_examples '#order_options_with_tie_breaker'
+
+ it 'maintains created_at order' do
+ is_expected.to eq({ 'created_at' => 'asc', 'id' => 'asc' })
+ end
+ end
+ end
+ end
+
describe "#destroy_conditionally!" do
let!(:project) { create(:project) }
diff --git a/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb b/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb
deleted file mode 100644
index c57d8ece86b..00000000000
--- a/spec/lib/atlassian/jira_connect/asymmetric_jwt_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Atlassian::JiraConnect::AsymmetricJwt do
- describe '#valid?' do
- subject(:asymmetric_jwt) { described_class.new(jwt, verification_claims) }
-
- let(:verification_claims) { jwt_claims }
- let(:jwt_claims) { { aud: aud, iss: client_key, qsh: qsh } }
- let(:aud) { 'https://test.host/-/jira_connect' }
- let(:client_key) { '1234' }
- let(:qsh) { Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/installed', 'POST', 'https://gitlab.test') }
- 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 }
-
- before do
- stub_request(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}").to_return(body: public_key.to_s, status: 200)
- end
-
- it 'returns true when verified with public key from CDN' do
- expect(JWT).to receive(:decode).twice.and_call_original
-
- expect(asymmetric_jwt).to be_valid
-
- expect(WebMock).to have_requested(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}")
- end
-
- context 'JWT does not contain a key ID' do
- let(:public_key_id) { nil }
-
- it { is_expected.not_to be_valid }
- end
-
- context 'JWT contains a key ID that is not a valid UUID4' do
- let(:public_key_id) { '123' }
-
- it { is_expected.not_to be_valid }
- end
-
- context 'public key can not be retrieved' do
- before do
- stub_request(:get, "https://connect-install-keys.atlassian.com/#{public_key_id}").to_return(body: '', status: 404)
- end
-
- it { is_expected.not_to be_valid }
- end
-
- context 'retrieving the public raises an error' do
- before do
- allow(Gitlab::HTTP).to receive(:get).and_raise(SocketError)
- end
-
- it { is_expected.not_to be_valid }
- end
-
- context 'token decoding raises an error' do
- before do
- allow(JWT).to receive(:decode).and_call_original
- allow(JWT).to receive(:decode).with(
- jwt, anything, true, aud: anything, verify_aud: true, iss: client_key, verify_iss: true, algorithm: 'RS256'
- ).and_raise(JWT::DecodeError)
- end
-
- it { is_expected.not_to be_valid }
- end
-
- context 'when iss could not be verified' do
- let(:verification_claims) { { aud: jwt_claims[:aud], iss: 'some other iss', qsh: jwt_claims[:qsh] } }
-
- it { is_expected.not_to be_valid }
- end
-
- context 'when qsh could not be verified' do
- let(:verification_claims) { { aud: jwt_claims[:aud], iss: client_key, qsh: 'some other qsh' } }
-
- it { is_expected.not_to be_valid }
- end
- end
-
- describe '#iss_claim' do
- subject { asymmetric_jwt.iss_claim }
-
- let(:asymmetric_jwt) { described_class.new('123', anything) }
-
- it { is_expected.to eq(nil) }
-
- context 'when jwt is verified' do
- before do
- asymmetric_jwt.instance_variable_set(:@claims, { 'iss' => 'client_key' })
- end
-
- it { is_expected.to eq('client_key') }
- end
- end
-end
diff --git a/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
new file mode 100644
index 00000000000..12ed47a1025
--- /dev/null
+++ b/spec/lib/atlassian/jira_connect/jwt/asymmetric_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Atlassian::JiraConnect::Jwt::Asymmetric do
+ describe '#valid?' do
+ subject(:asymmetric_jwt) { described_class.new(jwt, verification_claims) }
+
+ let(:verification_claims) { jwt_claims }
+ let(:jwt_claims) { { aud: aud, iss: client_key, qsh: qsh } }
+ let(:aud) { 'https://test.host/-/jira_connect' }
+ 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}" }
+ let(:qsh) do
+ Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/installed', 'POST', 'https://gitlab.test')
+ end
+
+ before do
+ stub_request(:get, install_keys_url)
+ .to_return(body: public_key.to_s, status: 200)
+ end
+
+ it 'returns true when verified with public key from CDN' do
+ expect(JWT).to receive(:decode).twice.and_call_original
+
+ expect(asymmetric_jwt).to be_valid
+
+ expect(WebMock).to have_requested(:get, install_keys_url)
+ end
+
+ context 'JWT does not contain a key ID' do
+ let(:public_key_id) { nil }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'JWT contains a key ID that is not a valid UUID4' do
+ let(:public_key_id) { '123' }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'public key can not be retrieved' do
+ before do
+ stub_request(:get, install_keys_url).to_return(body: '', status: 404)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'retrieving the public raises an error' do
+ before do
+ allow(Gitlab::HTTP).to receive(:get).and_raise(SocketError)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'token decoding raises an error' do
+ before do
+ allow(JWT).to receive(:decode).and_call_original
+ allow(JWT).to receive(:decode).with(
+ jwt, anything, true,
+ { aud: anything, verify_aud: true, iss: client_key, verify_iss: true, algorithm: 'RS256' }
+ ).and_raise(JWT::DecodeError)
+ end
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when iss could not be verified' do
+ let(:verification_claims) { { aud: jwt_claims[:aud], iss: 'some other iss', qsh: jwt_claims[:qsh] } }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when qsh could not be verified' do
+ let(:verification_claims) { { aud: jwt_claims[:aud], iss: client_key, qsh: 'some other qsh' } }
+
+ it { is_expected.not_to be_valid }
+ end
+ end
+
+ describe '#iss_claim' do
+ subject { asymmetric_jwt.iss_claim }
+
+ let(:asymmetric_jwt) { described_class.new('123', anything) }
+
+ it { is_expected.to eq(nil) }
+
+ context 'when jwt is verified' do
+ before do
+ asymmetric_jwt.instance_variable_set(:@claims, { 'iss' => 'client_key' })
+ end
+
+ it { is_expected.to eq('client_key') }
+ end
+ end
+end
diff --git a/spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb b/spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb
new file mode 100644
index 00000000000..61adff7e221
--- /dev/null
+++ b/spec/lib/atlassian/jira_connect/jwt/symmetric_spec.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Atlassian::JiraConnect::Jwt::Symmetric do
+ let(:shared_secret) { 'secret' }
+
+ describe '#iss_claim' do
+ let(:jwt) { Atlassian::Jwt.encode({ iss: '123' }, shared_secret) }
+
+ subject { described_class.new(jwt).iss_claim }
+
+ it { is_expected.to eq('123') }
+
+ context 'invalid JWT' do
+ let(:jwt) { '123' }
+
+ it { is_expected.to eq(nil) }
+ end
+ end
+
+ describe '#sub_claim' do
+ let(:jwt) { Atlassian::Jwt.encode({ sub: '123' }, shared_secret) }
+
+ subject { described_class.new(jwt).sub_claim }
+
+ it { is_expected.to eq('123') }
+
+ context 'invalid JWT' do
+ let(:jwt) { '123' }
+
+ it { is_expected.to eq(nil) }
+ end
+ end
+
+ describe '#valid?' do
+ subject { described_class.new(jwt).valid?(shared_secret) }
+
+ context 'invalid JWT' do
+ let(:jwt) { '123' }
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'valid JWT' do
+ let(:jwt) { Atlassian::Jwt.encode({}, shared_secret) }
+
+ it { is_expected.to eq(true) }
+ end
+ end
+
+ describe '#verify_qsh_claim' do
+ let(:jwt) { Atlassian::Jwt.encode({ qsh: qsh_claim }, shared_secret) }
+ let(:qsh_claim) do
+ Atlassian::Jwt.create_query_string_hash('https://gitlab.test/subscriptions', 'GET', 'https://gitlab.test')
+ end
+
+ subject(:verify_qsh_claim) do
+ described_class.new(jwt).verify_qsh_claim('https://gitlab.test/subscriptions', 'GET', 'https://gitlab.test')
+ end
+
+ it { is_expected.to eq(true) }
+
+ context 'qsh does not match' do
+ let(:qsh_claim) do
+ Atlassian::Jwt.create_query_string_hash('https://example.com/foo', 'POST', 'https://example.com')
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'creating query string hash raises an error' do
+ let(:qsh_claim) { '123' }
+
+ specify do
+ expect(Atlassian::Jwt).to receive(:create_query_string_hash).and_raise(StandardError)
+
+ expect(verify_qsh_claim).to eq(false)
+ end
+ end
+ end
+
+ describe '#verify_context_qsh_claim' do
+ let(:jwt) { Atlassian::Jwt.encode({ qsh: qsh_claim }, shared_secret) }
+ let(:qsh_claim) { 'context-qsh' }
+
+ subject(:verify_context_qsh_claim) { described_class.new(jwt).verify_context_qsh_claim }
+
+ it { is_expected.to eq(true) }
+
+ context 'jwt does not contain a context qsh' do
+ let(:qsh_claim) { '123' }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+end
diff --git a/spec/lib/backup/manager_spec.rb b/spec/lib/backup/manager_spec.rb
index 192739d05a7..a2477834dde 100644
--- a/spec/lib/backup/manager_spec.rb
+++ b/spec/lib/backup/manager_spec.rb
@@ -145,16 +145,12 @@ RSpec.describe Backup::Manager do
describe '#create' do
let(:incremental_env) { 'false' }
let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz task2.tar.gz} }
- let(:backup_id) { '1546300800_2019_01_01_12.3' }
- let(:tar_file) { "#{backup_id}_gitlab_backup.tar" }
- let(:tar_system_options) { { out: [tar_file, 'w', Gitlab.config.backup.archive_permissions] } }
- let(:tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, tar_system_options] }
- let(:backup_information) do
- {
- backup_created_at: Time.zone.parse('2019-01-01'),
- gitlab_version: '12.3'
- }
- end
+ let(:backup_time) { Time.utc(2019, 1, 1) }
+ let(:backup_id) { "1546300800_2019_01_01_#{Gitlab::VERSION}" }
+ let(:full_backup_id) { backup_id }
+ let(:pack_tar_file) { "#{backup_id}_gitlab_backup.tar" }
+ let(:pack_tar_system_options) { { out: [pack_tar_file, 'w', Gitlab.config.backup.archive_permissions] } }
+ let(:pack_tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, pack_tar_system_options] }
let(:task1) { instance_double(Backup::Task) }
let(:task2) { instance_double(Backup::Task) }
@@ -170,427 +166,437 @@ RSpec.describe Backup::Manager do
allow(ActiveRecord::Base.connection).to receive(:reconnect!)
allow(Gitlab::BackupLogger).to receive(:info)
allow(Kernel).to receive(:system).and_return(true)
- allow(YAML).to receive(:load_file).and_call_original
- allow(YAML).to receive(:load_file).with(File.join(Gitlab.config.backup.path, 'backup_information.yml'))
- .and_return(backup_information)
- allow(subject).to receive(:backup_information).and_return(backup_information)
- allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'), backup_id)
- allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'), backup_id)
+ allow(task1).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task1.tar.gz'), full_backup_id)
+ allow(task2).to receive(:dump).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz'), full_backup_id)
end
it 'executes tar' do
- subject.create # rubocop:disable Rails/SaveBang
-
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
- end
-
- context 'tar fails' do
- before do
- expect(Kernel).to receive(:system).with(*tar_cmdline).and_return(false)
- end
-
- it 'logs a failure' do
- expect do
- subject.create # rubocop:disable Rails/SaveBang
- end.to raise_error(Backup::Error, 'Backup failed')
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{tar_file} failed")
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
end
end
context 'when BACKUP is set' do
let(:backup_id) { 'custom' }
- it 'uses the given value as tar file name' do
+ before do
stub_env('BACKUP', '/ignored/path/custom')
- subject.create # rubocop:disable Rails/SaveBang
-
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
- end
- end
-
- context 'when skipped is set in backup_information.yml' do
- let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
- let(:backup_information) do
- {
- backup_created_at: Time.zone.parse('2019-01-01'),
- gitlab_version: '12.3',
- skipped: ['task2']
- }
end
- it 'executes tar' do
+ it 'uses the given value as tar file name' do
subject.create # rubocop:disable Rails/SaveBang
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
- end
- end
-
- context 'when SKIP env is set' do
- let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
-
- before do
- stub_env('SKIP', 'task2')
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
end
- it 'executes tar' do
- subject.create # rubocop:disable Rails/SaveBang
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*pack_tar_cmdline).and_return(false)
+ end
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
- end
- end
+ it 'logs a failure' do
+ expect do
+ subject.create # rubocop:disable Rails/SaveBang
+ end.to raise_error(Backup::Error, 'Backup failed')
- context 'when the destination is optional' do
- let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
- let(:definitions) do
- {
- 'task1' => Backup::Manager::TaskDefinition.new(task: task1, destination_path: 'task1.tar.gz'),
- 'task2' => Backup::Manager::TaskDefinition.new(task: task2, destination_path: 'task2.tar.gz', destination_optional: true)
- }
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{pack_tar_file} failed")
+ end
end
- it 'executes tar' do
- expect(File).to receive(:exist?).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz')).and_return(false)
+ context 'when SKIP env is set' do
+ let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
- subject.create # rubocop:disable Rails/SaveBang
+ before do
+ stub_env('SKIP', 'task2')
+ end
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
- end
- end
+ it 'executes tar' do
+ subject.create # rubocop:disable Rails/SaveBang
- context 'many backup files' do
- let(:files) do
- [
- '1451606400_2016_01_01_1.2.3_gitlab_backup.tar',
- '1451520000_2015_12_31_4.5.6_gitlab_backup.tar',
- '1451520000_2015_12_31_4.5.6-pre_gitlab_backup.tar',
- '1451520000_2015_12_31_4.5.6-rc1_gitlab_backup.tar',
- '1451520000_2015_12_31_4.5.6-pre-ee_gitlab_backup.tar',
- '1451510000_2015_12_30_gitlab_backup.tar',
- '1450742400_2015_12_22_gitlab_backup.tar',
- '1449878400_gitlab_backup.tar',
- '1449014400_gitlab_backup.tar',
- 'manual_gitlab_backup.tar'
- ]
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
+ end
end
- before do
- allow(Gitlab::BackupLogger).to receive(:info)
- allow(Dir).to receive(:chdir).and_yield
- allow(Dir).to receive(:glob).and_return(files)
- allow(FileUtils).to receive(:rm)
- allow(Time).to receive(:now).and_return(Time.utc(2016))
- end
+ context 'when the destination is optional' do
+ let(:expected_backup_contents) { %w{backup_information.yml task1.tar.gz} }
+ let(:definitions) do
+ {
+ 'task1' => Backup::Manager::TaskDefinition.new(task: task1, destination_path: 'task1.tar.gz'),
+ 'task2' => Backup::Manager::TaskDefinition.new(task: task2, destination_path: 'task2.tar.gz', destination_optional: true)
+ }
+ end
- context 'when keep_time is zero' do
- before do
- allow(Gitlab.config.backup).to receive(:keep_time).and_return(0)
+ it 'executes tar' do
+ expect(File).to receive(:exist?).with(File.join(Gitlab.config.backup.path, 'task2.tar.gz')).and_return(false)
subject.create # rubocop:disable Rails/SaveBang
- end
- it 'removes no files' do
- expect(FileUtils).not_to have_received(:rm)
- end
-
- it 'prints a skipped message' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... [SKIPPED]')
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
end
end
- context 'when no valid file is found' do
+ context 'many backup files' do
let(:files) do
[
- '14516064000_2016_01_01_1.2.3_gitlab_backup.tar',
- 'foo_1451520000_2015_12_31_4.5.6_gitlab_backup.tar',
- '1451520000_2015_12_31_4.5.6-foo_gitlab_backup.tar'
+ '1451606400_2016_01_01_1.2.3_gitlab_backup.tar',
+ '1451520000_2015_12_31_4.5.6_gitlab_backup.tar',
+ '1451520000_2015_12_31_4.5.6-pre_gitlab_backup.tar',
+ '1451520000_2015_12_31_4.5.6-rc1_gitlab_backup.tar',
+ '1451520000_2015_12_31_4.5.6-pre-ee_gitlab_backup.tar',
+ '1451510000_2015_12_30_gitlab_backup.tar',
+ '1450742400_2015_12_22_gitlab_backup.tar',
+ '1449878400_gitlab_backup.tar',
+ '1449014400_gitlab_backup.tar',
+ 'manual_gitlab_backup.tar'
]
end
before do
- allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
-
- subject.create # rubocop:disable Rails/SaveBang
- end
-
- it 'removes no files' do
- expect(FileUtils).not_to have_received(:rm)
- end
-
- it 'prints a done message' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
+ allow(Gitlab::BackupLogger).to receive(:info)
+ allow(Dir).to receive(:chdir).and_yield
+ allow(Dir).to receive(:glob).and_return(files)
+ allow(FileUtils).to receive(:rm)
+ allow(Time).to receive(:now).and_return(Time.utc(2016))
end
- end
- context 'when there are no files older than keep_time' do
- before do
- # Set to 30 days
- allow(Gitlab.config.backup).to receive(:keep_time).and_return(2592000)
+ context 'when keep_time is zero' do
+ before do
+ allow(Gitlab.config.backup).to receive(:keep_time).and_return(0)
- subject.create # rubocop:disable Rails/SaveBang
- end
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- it 'removes no files' do
- expect(FileUtils).not_to have_received(:rm)
- end
+ it 'removes no files' do
+ expect(FileUtils).not_to have_received(:rm)
+ end
- it 'prints a done message' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
+ it 'prints a skipped message' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... [SKIPPED]')
+ end
end
- end
- context 'when keep_time is set to remove files' do
- before do
- # Set to 1 second
- allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
+ context 'when no valid file is found' do
+ let(:files) do
+ [
+ '14516064000_2016_01_01_1.2.3_gitlab_backup.tar',
+ 'foo_1451520000_2015_12_31_4.5.6_gitlab_backup.tar',
+ '1451520000_2015_12_31_4.5.6-foo_gitlab_backup.tar'
+ ]
+ end
- subject.create # rubocop:disable Rails/SaveBang
- end
+ before do
+ allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
- it 'removes matching files with a human-readable versioned timestamp' do
- expect(FileUtils).to have_received(:rm).with(files[1])
- expect(FileUtils).to have_received(:rm).with(files[2])
- expect(FileUtils).to have_received(:rm).with(files[3])
- end
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- it 'removes matching files with a human-readable versioned timestamp with tagged EE' do
- expect(FileUtils).to have_received(:rm).with(files[4])
- end
+ it 'removes no files' do
+ expect(FileUtils).not_to have_received(:rm)
+ end
- it 'removes matching files with a human-readable non-versioned timestamp' do
- expect(FileUtils).to have_received(:rm).with(files[5])
- expect(FileUtils).to have_received(:rm).with(files[6])
+ it 'prints a done message' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
+ end
end
- it 'removes matching files without a human-readable timestamp' do
- expect(FileUtils).to have_received(:rm).with(files[7])
- expect(FileUtils).to have_received(:rm).with(files[8])
- end
+ context 'when there are no files older than keep_time' do
+ before do
+ # Set to 30 days
+ allow(Gitlab.config.backup).to receive(:keep_time).and_return(2592000)
- it 'does not remove files that are not old enough' do
- expect(FileUtils).not_to have_received(:rm).with(files[0])
- end
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- it 'does not remove non-matching files' do
- expect(FileUtils).not_to have_received(:rm).with(files[9])
- end
+ it 'removes no files' do
+ expect(FileUtils).not_to have_received(:rm)
+ end
- it 'prints a done message' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (8 removed)')
+ it 'prints a done message' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (0 removed)')
+ end
end
- end
-
- context 'when removing a file fails' do
- let(:file) { files[1] }
- let(:message) { "Permission denied @ unlink_internal - #{file}" }
- before do
- allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
- allow(FileUtils).to receive(:rm).with(file).and_raise(Errno::EACCES, message)
-
- subject.create # rubocop:disable Rails/SaveBang
- end
+ context 'when keep_time is set to remove files' do
+ before do
+ # Set to 1 second
+ allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
- it 'removes the remaining expected files' do
- expect(FileUtils).to have_received(:rm).with(files[4])
- expect(FileUtils).to have_received(:rm).with(files[5])
- expect(FileUtils).to have_received(:rm).with(files[6])
- expect(FileUtils).to have_received(:rm).with(files[7])
- expect(FileUtils).to have_received(:rm).with(files[8])
- end
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- it 'sets the correct removed count' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (7 removed)')
- end
+ it 'removes matching files with a human-readable versioned timestamp' do
+ expect(FileUtils).to have_received(:rm).with(files[1])
+ expect(FileUtils).to have_received(:rm).with(files[2])
+ expect(FileUtils).to have_received(:rm).with(files[3])
+ end
- it 'prints the error from file that could not be removed' do
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: a_string_matching(message))
- end
- end
- end
+ it 'removes matching files with a human-readable versioned timestamp with tagged EE' do
+ expect(FileUtils).to have_received(:rm).with(files[4])
+ end
- describe 'cloud storage' do
- let(:backup_file) { Tempfile.new('backup', Gitlab.config.backup.path) }
- let(:backup_filename) { File.basename(backup_file.path) }
+ it 'removes matching files with a human-readable non-versioned timestamp' do
+ expect(FileUtils).to have_received(:rm).with(files[5])
+ expect(FileUtils).to have_received(:rm).with(files[6])
+ end
- before do
- allow(Gitlab::BackupLogger).to receive(:info)
- allow(subject).to receive(:tar_file).and_return(backup_filename)
-
- stub_backup_setting(
- upload: {
- connection: {
- provider: 'AWS',
- aws_access_key_id: 'id',
- aws_secret_access_key: 'secret'
- },
- remote_directory: 'directory',
- multipart_chunk_size: 104857600,
- encryption: nil,
- encryption_key: nil,
- storage_class: nil
- }
- )
+ it 'removes matching files without a human-readable timestamp' do
+ expect(FileUtils).to have_received(:rm).with(files[7])
+ expect(FileUtils).to have_received(:rm).with(files[8])
+ end
- Fog.mock!
+ it 'does not remove files that are not old enough' do
+ expect(FileUtils).not_to have_received(:rm).with(files[0])
+ end
- # the Fog mock only knows about directories we create explicitly
- connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys)
- connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
- end
+ it 'does not remove non-matching files' do
+ expect(FileUtils).not_to have_received(:rm).with(files[9])
+ end
- context 'skipped upload' do
- let(:backup_information) do
- {
- backup_created_at: Time.zone.parse('2019-01-01'),
- gitlab_version: '12.3',
- skipped: ['remote']
- }
+ it 'prints a done message' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (8 removed)')
+ end
end
- it 'informs the user' do
- stub_env('SKIP', 'remote')
- subject.create # rubocop:disable Rails/SaveBang
-
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... [SKIPPED]')
- end
- end
+ context 'when removing a file fails' do
+ let(:file) { files[1] }
+ let(:message) { "Permission denied @ unlink_internal - #{file}" }
- context 'target path' do
- it 'uses the tar filename by default' do
- expect_any_instance_of(Fog::Collection).to receive(:create)
- .with(hash_including(key: backup_filename, public: false))
- .and_call_original
+ before do
+ allow(Gitlab.config.backup).to receive(:keep_time).and_return(1)
+ allow(FileUtils).to receive(:rm).with(file).and_raise(Errno::EACCES, message)
- subject.create # rubocop:disable Rails/SaveBang
- end
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- it 'adds the DIRECTORY environment variable if present' do
- stub_env('DIRECTORY', 'daily')
+ it 'removes the remaining expected files' do
+ expect(FileUtils).to have_received(:rm).with(files[4])
+ expect(FileUtils).to have_received(:rm).with(files[5])
+ expect(FileUtils).to have_received(:rm).with(files[6])
+ expect(FileUtils).to have_received(:rm).with(files[7])
+ expect(FileUtils).to have_received(:rm).with(files[8])
+ end
- expect_any_instance_of(Fog::Collection).to receive(:create)
- .with(hash_including(key: "daily/#{backup_filename}", public: false))
- .and_call_original
+ it 'sets the correct removed count' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Deleting old backups ... done. (7 removed)')
+ end
- subject.create # rubocop:disable Rails/SaveBang
+ it 'prints the error from file that could not be removed' do
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: a_string_matching(message))
+ end
end
end
- context 'with AWS with server side encryption' do
- let(:connection) { ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys) }
- let(:encryption_key) { nil }
- let(:encryption) { nil }
- let(:storage_options) { nil }
+ describe 'cloud storage' do
+ let(:backup_file) { Tempfile.new('backup', Gitlab.config.backup.path) }
+ let(:backup_filename) { File.basename(backup_file.path) }
before do
+ allow(Gitlab::BackupLogger).to receive(:info)
+ allow(subject).to receive(:tar_file).and_return(backup_filename)
+
stub_backup_setting(
upload: {
connection: {
provider: 'AWS',
- aws_access_key_id: 'AWS_ACCESS_KEY_ID',
- aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY'
+ aws_access_key_id: 'id',
+ aws_secret_access_key: 'secret'
},
remote_directory: 'directory',
- multipart_chunk_size: Gitlab.config.backup.upload.multipart_chunk_size,
- encryption: encryption,
- encryption_key: encryption_key,
- storage_options: storage_options,
+ multipart_chunk_size: 104857600,
+ encryption: nil,
+ encryption_key: nil,
storage_class: nil
}
)
+ Fog.mock!
+
+ # the Fog mock only knows about directories we create explicitly
+ connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys)
connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
end
- context 'with SSE-S3 without using storage_options' do
- let(:encryption) { 'AES256' }
+ context 'skipped upload' do
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2019-01-01'),
+ gitlab_version: '12.3',
+ skipped: ['remote']
+ }
+ end
- it 'sets encryption attributes' do
+ it 'informs the user' do
+ stub_env('SKIP', 'remote')
subject.create # rubocop:disable Rails/SaveBang
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... [SKIPPED]')
end
end
- context 'with SSE-C (customer-provided keys) options' do
- let(:encryption) { 'AES256' }
- let(:encryption_key) { SecureRandom.hex }
+ context 'target path' do
+ it 'uses the tar filename by default' do
+ expect_any_instance_of(Fog::Collection).to receive(:create)
+ .with(hash_including(key: backup_filename, public: false))
+ .and_call_original
- it 'sets encryption attributes' do
subject.create # rubocop:disable Rails/SaveBang
+ end
+
+ it 'adds the DIRECTORY environment variable if present' do
+ stub_env('DIRECTORY', 'daily')
+
+ expect_any_instance_of(Fog::Collection).to receive(:create)
+ .with(hash_including(key: "daily/#{backup_filename}", public: false))
+ .and_call_original
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
+ subject.create # rubocop:disable Rails/SaveBang
end
end
- context 'with SSE-KMS options' do
- let(:storage_options) do
- {
- server_side_encryption: 'aws:kms',
- server_side_encryption_kms_key_id: 'arn:aws:kms:12345'
- }
+ context 'with AWS with server side encryption' do
+ let(:connection) { ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys) }
+ let(:encryption_key) { nil }
+ let(:encryption) { nil }
+ let(:storage_options) { nil }
+
+ before do
+ stub_backup_setting(
+ upload: {
+ connection: {
+ provider: 'AWS',
+ aws_access_key_id: 'AWS_ACCESS_KEY_ID',
+ aws_secret_access_key: 'AWS_SECRET_ACCESS_KEY'
+ },
+ remote_directory: 'directory',
+ multipart_chunk_size: Gitlab.config.backup.upload.multipart_chunk_size,
+ encryption: encryption,
+ encryption_key: encryption_key,
+ storage_options: storage_options,
+ storage_class: nil
+ }
+ )
+
+ connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
end
- it 'sets encryption attributes' do
- subject.create # rubocop:disable Rails/SaveBang
+ context 'with SSE-S3 without using storage_options' do
+ let(:encryption) { 'AES256' }
- expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with aws:kms)')
+ it 'sets encryption attributes' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
+ end
+ end
+
+ context 'with SSE-C (customer-provided keys) options' do
+ let(:encryption) { 'AES256' }
+ let(:encryption_key) { SecureRandom.hex }
+
+ it 'sets encryption attributes' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with AES256)')
+ end
+ end
+
+ context 'with SSE-KMS options' do
+ let(:storage_options) do
+ {
+ server_side_encryption: 'aws:kms',
+ server_side_encryption_kms_key_id: 'arn:aws:kms:12345'
+ }
+ end
+
+ it 'sets encryption attributes' do
+ subject.create # rubocop:disable Rails/SaveBang
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Uploading backup archive to remote storage directory ... done (encrypted with aws:kms)')
+ end
end
end
- end
- context 'with Google provider' do
- before do
- stub_backup_setting(
- upload: {
- connection: {
- provider: 'Google',
- google_storage_access_key_id: 'test-access-id',
- google_storage_secret_access_key: 'secret'
- },
- remote_directory: 'directory',
- multipart_chunk_size: Gitlab.config.backup.upload.multipart_chunk_size,
- encryption: nil,
- encryption_key: nil,
- storage_class: nil
- }
- )
+ context 'with Google provider' do
+ before do
+ stub_backup_setting(
+ upload: {
+ connection: {
+ provider: 'Google',
+ google_storage_access_key_id: 'test-access-id',
+ google_storage_secret_access_key: 'secret'
+ },
+ remote_directory: 'directory',
+ multipart_chunk_size: Gitlab.config.backup.upload.multipart_chunk_size,
+ encryption: nil,
+ encryption_key: nil,
+ storage_class: nil
+ }
+ )
+
+ connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys)
+ connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
+ end
- connection = ::Fog::Storage.new(Gitlab.config.backup.upload.connection.symbolize_keys)
- connection.directories.create(key: Gitlab.config.backup.upload.remote_directory) # rubocop:disable Rails/SaveBang
+ it 'does not attempt to set ACL' do
+ expect_any_instance_of(Fog::Collection).to receive(:create)
+ .with(hash_excluding(public: false))
+ .and_call_original
+
+ subject.create # rubocop:disable Rails/SaveBang
+ end
end
- it 'does not attempt to set ACL' do
- expect_any_instance_of(Fog::Collection).to receive(:create)
- .with(hash_excluding(public: false))
- .and_call_original
+ context 'with AzureRM provider' do
+ before do
+ stub_backup_setting(
+ upload: {
+ connection: {
+ provider: 'AzureRM',
+ azure_storage_account_name: 'test-access-id',
+ azure_storage_access_key: 'secret'
+ },
+ remote_directory: 'directory',
+ multipart_chunk_size: nil,
+ encryption: nil,
+ encryption_key: nil,
+ storage_class: nil
+ }
+ )
+ end
- subject.create # rubocop:disable Rails/SaveBang
+ it 'loads the provider' do
+ expect { subject.create }.not_to raise_error # rubocop:disable Rails/SaveBang
+ end
end
end
+ end
- context 'with AzureRM provider' do
- before do
- stub_backup_setting(
- upload: {
- connection: {
- provider: 'AzureRM',
- azure_storage_account_name: 'test-access-id',
- azure_storage_access_key: 'secret'
- },
- remote_directory: 'directory',
- multipart_chunk_size: nil,
- encryption: nil,
- encryption_key: nil,
- storage_class: nil
- }
- )
- end
+ context 'tar skipped' do
+ before do
+ stub_env('SKIP', 'tar')
+ end
- it 'loads the provider' do
- expect { subject.create }.not_to raise_error # rubocop:disable Rails/SaveBang
+ after do
+ FileUtils.rm_rf(Dir.glob(File.join(Gitlab.config.backup.path, '*')), secure: true)
+ end
+
+ it 'creates a non-tarred backup' do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
end
+
+ expect(Kernel).not_to have_received(:system).with(*pack_tar_cmdline)
+ expect(YAML.load_file(File.join(Gitlab.config.backup.path, 'backup_information.yml'))).to include(
+ backup_created_at: backup_time.localtime,
+ db_version: be_a(String),
+ gitlab_version: Gitlab::VERSION,
+ installation_type: Gitlab::INSTALLATION_TYPE,
+ skipped: 'tar',
+ tar_version: be_a(String)
+ )
end
end
@@ -598,14 +604,21 @@ RSpec.describe Backup::Manager do
let(:incremental_env) { 'true' }
let(:gitlab_version) { Gitlab::VERSION }
let(:backup_id) { "1546300800_2019_01_01_#{gitlab_version}" }
- let(:tar_file) { "#{backup_id}_gitlab_backup.tar" }
+ let(:unpack_tar_file) { "#{full_backup_id}_gitlab_backup.tar" }
+ let(:unpack_tar_cmdline) { ['tar', '-xf', unpack_tar_file] }
let(:backup_information) do
{
- backup_created_at: Time.zone.parse('2019-01-01'),
+ backup_created_at: Time.zone.parse('2018-01-01'),
gitlab_version: gitlab_version
}
end
+ before do
+ allow(YAML).to receive(:load_file).and_call_original
+ allow(YAML).to receive(:load_file).with(File.join(Gitlab.config.backup.path, 'backup_information.yml'))
+ .and_return(backup_information)
+ end
+
context 'when there are no backup files in the directory' do
before do
allow(Dir).to receive(:glob).and_return([])
@@ -663,7 +676,6 @@ RSpec.describe Backup::Manager do
context 'when BACKUP variable is set to a correct file' do
let(:backup_id) { '1451606400_2016_01_01_1.2.3' }
- let(:tar_cmdline) { %w{tar -xf 1451606400_2016_01_01_1.2.3_gitlab_backup.tar} }
before do
allow(Gitlab::BackupLogger).to receive(:info)
@@ -678,15 +690,18 @@ RSpec.describe Backup::Manager do
stub_env('BACKUP', '/ignored/path/1451606400_2016_01_01_1.2.3')
end
- it 'unpacks the file' do
- subject.create # rubocop:disable Rails/SaveBang
+ it 'unpacks and packs the backup' do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
+ end
- expect(Kernel).to have_received(:system).with(*tar_cmdline)
+ expect(Kernel).to have_received(:system).with(*unpack_tar_cmdline)
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
end
- context 'tar fails' do
+ context 'untar fails' do
before do
- expect(Kernel).to receive(:system).with(*tar_cmdline).and_return(false)
+ expect(Kernel).to receive(:system).with(*unpack_tar_cmdline).and_return(false)
end
it 'logs a failure' do
@@ -698,6 +713,20 @@ RSpec.describe Backup::Manager do
end
end
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*pack_tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ subject.create # rubocop:disable Rails/SaveBang
+ end.to raise_error(Backup::Error, 'Backup failed')
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{pack_tar_file} failed")
+ end
+ end
+
context 'on version mismatch' do
let(:backup_information) do
{
@@ -714,21 +743,138 @@ RSpec.describe Backup::Manager do
end
end
+ context 'when PREVIOUS_BACKUP variable is set to a non-existing file' do
+ before do
+ allow(Dir).to receive(:glob).and_return(
+ [
+ '1451606400_2016_01_01_gitlab_backup.tar'
+ ]
+ )
+ allow(File).to receive(:exist?).and_return(false)
+
+ stub_env('PREVIOUS_BACKUP', 'wrong')
+ end
+
+ it 'fails the operation and prints an error' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(File).to have_received(:exist?).with('wrong_gitlab_backup.tar')
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('The backup file wrong_gitlab_backup.tar does not exist'))
+ end
+ end
+
+ context 'when PREVIOUS_BACKUP variable is set to a correct file' do
+ let(:full_backup_id) { 'some_previous_backup' }
+
+ before do
+ allow(Gitlab::BackupLogger).to receive(:info)
+ allow(Dir).to receive(:glob).and_return(
+ [
+ 'some_previous_backup_gitlab_backup.tar'
+ ]
+ )
+ allow(File).to receive(:exist?).with('some_previous_backup_gitlab_backup.tar').and_return(true)
+ allow(Kernel).to receive(:system).and_return(true)
+
+ stub_env('PREVIOUS_BACKUP', '/ignored/path/some_previous_backup')
+ end
+
+ it 'unpacks and packs the backup' do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
+ end
+
+ expect(Kernel).to have_received(:system).with(*unpack_tar_cmdline)
+ expect(Kernel).to have_received(:system).with(*pack_tar_cmdline)
+ end
+
+ context 'untar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*unpack_tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
+ end
+ end.to raise_error(SystemExit)
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: 'Unpacking backup failed')
+ end
+ end
+
+ context 'tar fails' do
+ before do
+ expect(Kernel).to receive(:system).with(*pack_tar_cmdline).and_return(false)
+ end
+
+ it 'logs a failure' do
+ expect do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
+ end
+ end.to raise_error(Backup::Error, 'Backup failed')
+
+ expect(Gitlab::BackupLogger).to have_received(:info).with(message: "Creating archive #{pack_tar_file} failed")
+ end
+ end
+
+ context 'on version mismatch' do
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2018-01-01'),
+ gitlab_version: "not #{gitlab_version}"
+ }
+ end
+
+ it 'stops the process' do
+ expect { subject.create }.to raise_error SystemExit # rubocop:disable Rails/SaveBang
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching('GitLab version mismatch'))
+ end
+ end
+ end
+
context 'when there is a non-tarred backup in the directory' do
+ let(:full_backup_id) { "1514764800_2018_01_01_#{Gitlab::VERSION}" }
+ let(:backup_information) do
+ {
+ backup_created_at: Time.zone.parse('2018-01-01'),
+ gitlab_version: gitlab_version,
+ skipped: 'tar'
+ }
+ end
+
before do
allow(Dir).to receive(:glob).and_return(
[
'backup_information.yml'
]
)
- allow(File).to receive(:exist?).and_return(true)
+ allow(File).to receive(:exist?).with(File.join(Gitlab.config.backup.path, 'backup_information.yml')).and_return(true)
+ stub_env('SKIP', 'something')
end
- it 'selects the non-tarred backup to restore from' do
- subject.create # rubocop:disable Rails/SaveBang
+ after do
+ FileUtils.rm(File.join(Gitlab.config.backup.path, 'backup_information.yml'), force: true)
+ end
+
+ it 'updates the non-tarred backup' do
+ travel_to(backup_time) do
+ subject.create # rubocop:disable Rails/SaveBang
+ end
expect(progress).to have_received(:puts)
.with(a_string_matching('Non tarred backup found '))
+ expect(progress).to have_received(:puts)
+ .with(a_string_matching("Backup #{backup_id} is done"))
+ expect(YAML.load_file(File.join(Gitlab.config.backup.path, 'backup_information.yml'))).to include(
+ backup_created_at: backup_time,
+ full_backup_id: full_backup_id,
+ gitlab_version: Gitlab::VERSION,
+ skipped: 'something,tar'
+ )
end
context 'on version mismatch' do
diff --git a/spec/lib/backup/repositories_spec.rb b/spec/lib/backup/repositories_spec.rb
index c6f611e727c..1581e4793e3 100644
--- a/spec/lib/backup/repositories_spec.rb
+++ b/spec/lib/backup/repositories_spec.rb
@@ -5,13 +5,15 @@ require 'spec_helper'
RSpec.describe Backup::Repositories do
let(:progress) { spy(:stdout) }
let(:strategy) { spy(:strategy) }
+ let(:storages) { [] }
let(:destination) { 'repositories' }
let(:backup_id) { 'backup_id' }
subject do
described_class.new(
progress,
- strategy: strategy
+ strategy: strategy,
+ storages: storages
)
end
@@ -67,17 +69,50 @@ RSpec.describe Backup::Repositories do
end.count
create_list(:project, 2, :repository)
+ create_list(:snippet, 2, :repository)
expect do
subject.dump(destination, backup_id)
end.not_to exceed_query_limit(control_count)
end
+
+ describe 'storages' do
+ let(:storages) { %w{default} }
+
+ let_it_be(:project) { create(:project, :repository) }
+
+ before do
+ stub_storage_settings('test_second_storage' => {
+ 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
+ 'path' => TestEnv::SECOND_STORAGE_PATH
+ })
+ end
+
+ it 'calls enqueue for all repositories on the specified storage', :aggregate_failures do
+ excluded_project = create(:project, :repository, repository_storage: 'test_second_storage')
+ excluded_project_snippet = create(:project_snippet, :repository, project: excluded_project)
+ excluded_project_snippet.track_snippet_repository('test_second_storage')
+ excluded_personal_snippet = create(:personal_snippet, :repository, author: excluded_project.first_owner)
+ excluded_personal_snippet.track_snippet_repository('test_second_storage')
+
+ subject.dump(destination, backup_id)
+
+ expect(strategy).to have_received(:start).with(:create, destination, backup_id: backup_id)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_project, Gitlab::GlRepository::PROJECT)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_project_snippet, Gitlab::GlRepository::SNIPPET)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_personal_snippet, Gitlab::GlRepository::SNIPPET)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::WIKI)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::DESIGN)
+ expect(strategy).to have_received(:finish!)
+ end
+ end
end
describe '#restore' do
- let_it_be(:project) { create(:project) }
- let_it_be(:personal_snippet) { create(:personal_snippet, author: project.first_owner) }
- let_it_be(:project_snippet) { create(:project_snippet, project: project, author: project.first_owner) }
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:personal_snippet) { create(:personal_snippet, :repository, author: project.first_owner) }
+ let_it_be(:project_snippet) { create(:project_snippet, :repository, project: project, author: project.first_owner) }
it 'calls enqueue for each repository type', :aggregate_failures do
subject.restore(destination)
@@ -116,9 +151,6 @@ RSpec.describe Backup::Repositories do
context 'cleanup snippets' do
before do
- create(:snippet_repository, snippet: personal_snippet)
- create(:snippet_repository, snippet: project_snippet)
-
error_response = ServiceResponse.error(message: "Repository has more than one branch")
allow(Snippets::RepositoryValidationService).to receive_message_chain(:new, :execute).and_return(error_response)
end
@@ -146,5 +178,35 @@ RSpec.describe Backup::Repositories do
expect(gitlab_shell.repository_exists?(shard_name, path)).to eq false
end
end
+
+ context 'storages' do
+ let(:storages) { %w{default} }
+
+ before do
+ stub_storage_settings('test_second_storage' => {
+ 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address,
+ 'path' => TestEnv::SECOND_STORAGE_PATH
+ })
+ end
+
+ it 'calls enqueue for all repositories on the specified storage', :aggregate_failures do
+ excluded_project = create(:project, :repository, repository_storage: 'test_second_storage')
+ excluded_project_snippet = create(:project_snippet, :repository, project: excluded_project)
+ excluded_project_snippet.track_snippet_repository('test_second_storage')
+ excluded_personal_snippet = create(:personal_snippet, :repository, author: excluded_project.first_owner)
+ excluded_personal_snippet.track_snippet_repository('test_second_storage')
+
+ subject.restore(destination)
+
+ expect(strategy).to have_received(:start).with(:restore, destination)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_project, Gitlab::GlRepository::PROJECT)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_project_snippet, Gitlab::GlRepository::SNIPPET)
+ expect(strategy).not_to have_received(:enqueue).with(excluded_personal_snippet, Gitlab::GlRepository::SNIPPET)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::PROJECT)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::WIKI)
+ expect(strategy).to have_received(:enqueue).with(project, Gitlab::GlRepository::DESIGN)
+ expect(strategy).to have_received(:finish!)
+ end
+ end
end
end
diff --git a/spec/lib/banzai/filter/image_lazy_load_filter_spec.rb b/spec/lib/banzai/filter/image_lazy_load_filter_spec.rb
index 9f5aa558f24..5b32be0ea62 100644
--- a/spec/lib/banzai/filter/image_lazy_load_filter_spec.rb
+++ b/spec/lib/banzai/filter/image_lazy_load_filter_spec.rb
@@ -23,6 +23,11 @@ RSpec.describe Banzai::Filter::ImageLazyLoadFilter do
expect(doc.at_css('img')['class']).to eq 'test lazy'
end
+ it 'adds a async decoding attribute' do
+ doc = filter(image_with_class('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg', 'test'))
+ expect(doc.at_css('img')['decoding']).to eq 'async'
+ end
+
it 'transforms the image src to a data-src' do
doc = filter(image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg'))
expect(doc.at_css('img')['data-src']).to eq '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg'
diff --git a/spec/lib/banzai/filter/references/issue_reference_filter_spec.rb b/spec/lib/banzai/filter/references/issue_reference_filter_spec.rb
index c493cb77c98..c6f0e592cdf 100644
--- a/spec/lib/banzai/filter/references/issue_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/references/issue_reference_filter_spec.rb
@@ -15,6 +15,14 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
let(:issue_path) { "/#{issue.project.namespace.path}/#{issue.project.path}/-/issues/#{issue.iid}" }
let(:issue_url) { "http://#{Gitlab.config.gitlab.host}#{issue_path}" }
+ shared_examples 'a reference with issue type information' do
+ it 'contains issue-type as a data attribute' do
+ doc = reference_filter("Fixed #{reference}")
+
+ expect(doc.css('a').first.attr('data-issue-type')).to eq('issue')
+ end
+ end
+
it 'requires project context' do
expect { described_class.call('') }.to raise_error(ArgumentError, /:project/)
end
@@ -44,6 +52,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'links to a valid reference' do
doc = reference_filter("Fixed #{reference}")
@@ -158,6 +168,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'ignores valid references when cross-reference project uses external tracker' do
expect_any_instance_of(described_class).to receive(:find_object)
.with(project2, issue.iid)
@@ -208,6 +220,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'ignores valid references when cross-reference project uses external tracker' do
expect_any_instance_of(described_class).to receive(:find_object)
.with(project2, issue.iid)
@@ -258,6 +272,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'ignores valid references when cross-reference project uses external tracker' do
expect_any_instance_of(described_class).to receive(:find_object)
.with(project2, issue.iid)
@@ -307,6 +323,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'links to a valid reference' do
doc = reference_filter("See #{reference}")
@@ -342,6 +360,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'links to a valid reference' do
doc = reference_filter("See #{reference_link}")
@@ -371,6 +391,8 @@ RSpec.describe Banzai::Filter::References::IssueReferenceFilter do
it_behaves_like 'a reference containing an element node'
+ it_behaves_like 'a reference with issue type information'
+
it 'links to a valid reference' do
doc = reference_filter("See #{reference_link}")
diff --git a/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb b/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb
new file mode 100644
index 00000000000..09d2919c6c4
--- /dev/null
+++ b/spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Banzai::Pipeline::IncidentManagement::TimelineEventPipeline do
+ let_it_be(:project) { create(:project) }
+
+ describe '.filters' do
+ it 'contains required filters' do
+ expect(described_class.filters).to eq(
+ [
+ *Banzai::Pipeline::PlainMarkdownPipeline.filters,
+ *Banzai::Pipeline::GfmPipeline.reference_filters,
+ Banzai::Filter::EmojiFilter,
+ Banzai::Filter::SanitizationFilter,
+ Banzai::Filter::ExternalLinkFilter,
+ Banzai::Filter::ImageLinkFilter
+ ]
+ )
+ end
+ end
+
+ describe '.to_html' do
+ subject(:output) { described_class.to_html(markdown, project: project) }
+
+ context 'when markdown contains font style transformations' do
+ let(:markdown) { '**bold** _italic_ `code`' }
+
+ it { is_expected.to eq('<p><strong>bold</strong> <em>italic</em> <code>code</code></p>') }
+ end
+
+ context 'when markdown contains banned HTML tags' do
+ let(:markdown) { '<div>div</div><h1>h1</h1>' }
+
+ it 'filters out banned tags' do
+ is_expected.to eq(' div h1 ')
+ end
+ end
+
+ context 'when markdown contains links' do
+ let(:markdown) { '[GitLab](https://gitlab.com)' }
+
+ it do
+ is_expected.to eq(
+ %q(<p><a href="https://gitlab.com" rel="nofollow noreferrer noopener" target="_blank">GitLab</a></p>)
+ )
+ end
+ end
+
+ context 'when markdown contains images' do
+ let(:markdown) { '![Name](/path/to/image.png)' }
+
+ it 'replaces image with a link to the image' do
+ # rubocop:disable Layout/LineLength
+ is_expected.to eq(
+ '<p><a class="with-attachment-icon" href="/path/to/image.png" target="_blank" rel="noopener noreferrer">Name</a></p>'
+ )
+ # rubocop:enable Layout/LineLength
+ end
+ end
+
+ context 'when markdown contains emojis' do
+ let(:markdown) { ':+1:ðŸ‘' }
+
+ it { is_expected.to eq('<p>ðŸ‘ðŸ‘</p>') }
+ end
+
+ context 'when markdown contains a reference to an issue' do
+ let!(:issue) { create(:issue, project: project) }
+ let(:markdown) { "issue ##{issue.iid}" }
+
+ it 'contains a link to the issue' do
+ is_expected.to match(%r(<p>issue <a href="[\w/]+-/issues/#{issue.iid}".*>##{issue.iid}</a></p>))
+ end
+ end
+
+ context 'when markdown contains a reference to a merge request' do
+ let!(:mr) { create(:merge_request, source_project: project, target_project: project) }
+ let(:markdown) { "MR !#{mr.iid}" }
+
+ it 'contains a link to the merge request' do
+ is_expected.to match(%r(<p>MR <a href="[\w/]+-/merge_requests/#{mr.iid}".*>!#{mr.iid}</a></p>))
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb b/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb
new file mode 100644
index 00000000000..2c167cc485c
--- /dev/null
+++ b/spec/lib/bulk_imports/common/extractors/json_extractor_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'zlib'
+
+RSpec.describe BulkImports::Common::Extractors::JsonExtractor do
+ subject { described_class.new(relation: 'self') }
+
+ let_it_be(:tmpdir) { Dir.mktmpdir }
+ let_it_be(:import) { create(:bulk_import) }
+ let_it_be(:config) { create(:bulk_import_configuration, bulk_import: import) }
+ let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ before do
+ allow(FileUtils).to receive(:remove_entry).with(any_args).and_call_original
+
+ subject.instance_variable_set(:@tmpdir, tmpdir)
+ end
+
+ after(:all) do
+ FileUtils.remove_entry(tmpdir) if File.directory?(tmpdir)
+ end
+
+ describe '#extract' do
+ before do
+ Zlib::GzipWriter.open(File.join(tmpdir, 'self.json.gz')) do |gz|
+ gz.write '{"name": "Name","description": "Description","avatar":{"url":null}}'
+ end
+
+ expect(BulkImports::FileDownloadService).to receive(:new)
+ .with(
+ configuration: context.configuration,
+ relative_url: entity.relation_download_url_path('self'),
+ tmpdir: tmpdir,
+ filename: 'self.json.gz')
+ .and_return(instance_double(BulkImports::FileDownloadService, execute: nil))
+ end
+
+ it 'returns ExtractedData', :aggregate_failures do
+ extracted_data = subject.extract(context)
+
+ expect(extracted_data).to be_instance_of(BulkImports::Pipeline::ExtractedData)
+ expect(extracted_data.data).to contain_exactly(
+ { 'name' => 'Name', 'description' => 'Description', 'avatar' => { 'url' => nil } }
+ )
+ end
+ end
+
+ describe '#remove_tmpdir' do
+ it 'removes tmp dir' do
+ expect(FileUtils).to receive(:remove_entry).with(tmpdir).once
+
+ subject.remove_tmpdir
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
index d6e19a5fc85..8b63234ba50 100644
--- a/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
+++ b/spec/lib/bulk_imports/common/extractors/ndjson_extractor_spec.rb
@@ -1,10 +1,10 @@
# frozen_string_literal: true
require 'spec_helper'
+require 'zlib'
RSpec.describe BulkImports::Common::Extractors::NdjsonExtractor do
let_it_be(:tmpdir) { Dir.mktmpdir }
- let_it_be(:filepath) { 'spec/fixtures/bulk_imports/gz/labels.ndjson.gz' }
let_it_be(:import) { create(:bulk_import) }
let_it_be(:config) { create(:bulk_import_configuration, bulk_import: import) }
let_it_be(:entity) { create(:bulk_import_entity, bulk_import: import) }
@@ -25,21 +25,30 @@ RSpec.describe BulkImports::Common::Extractors::NdjsonExtractor do
describe '#extract' do
before do
- FileUtils.copy_file(filepath, File.join(tmpdir, 'labels.ndjson.gz'))
-
- allow_next_instance_of(BulkImports::FileDownloadService) do |service|
- allow(service).to receive(:execute)
+ Zlib::GzipWriter.open(File.join(tmpdir, 'labels.ndjson.gz')) do |gz|
+ gz.write [
+ '{"title": "Title 1","description": "Description 1","type":"GroupLabel"}',
+ '{"title": "Title 2","description": "Description 2","type":"GroupLabel"}'
+ ].join("\n")
end
+
+ expect(BulkImports::FileDownloadService).to receive(:new)
+ .with(
+ configuration: context.configuration,
+ relative_url: entity.relation_download_url_path('labels'),
+ tmpdir: tmpdir,
+ filename: 'labels.ndjson.gz')
+ .and_return(instance_double(BulkImports::FileDownloadService, execute: nil))
end
- it 'returns ExtractedData' do
+ it 'returns ExtractedData', :aggregate_failures do
extracted_data = subject.extract(context)
- label = extracted_data.data.first.first
expect(extracted_data).to be_instance_of(BulkImports::Pipeline::ExtractedData)
- expect(label['title']).to include('Label')
- expect(label['description']).to include('Label')
- expect(label['type']).to eq('GroupLabel')
+ expect(extracted_data.data.to_a).to contain_exactly(
+ [{ "title" => "Title 1", "description" => "Description 1", "type" => "GroupLabel" }, 0],
+ [{ "title" => "Title 2", "description" => "Description 2", "type" => "GroupLabel" }, 1]
+ )
end
end
diff --git a/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb
new file mode 100644
index 00000000000..7ac417afa0b
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/group_attributes_pipeline_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::GroupAttributesPipeline do
+ subject(:pipeline) { described_class.new(context) }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) { create(:bulk_import_entity, :group_entity, group: group, bulk_import: bulk_import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:group_attributes) do
+ {
+ 'id' => 1,
+ 'name' => 'Group name',
+ 'path' => 'group-path',
+ 'description' => 'description',
+ 'avatar' => {
+ 'url' => nil
+ },
+ 'membership_lock' => true,
+ 'traversal_ids' => [
+ 2
+ ]
+ }
+ end
+
+ describe '#run' do
+ before do
+ allow_next_instance_of(BulkImports::Common::Extractors::JsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(
+ BulkImports::Pipeline::ExtractedData.new(data: group_attributes)
+ )
+ end
+ end
+
+ it 'imports allowed group attributes' do
+ expect(Groups::UpdateService).to receive(:new).with(group, user, { membership_lock: true }).and_call_original
+
+ pipeline.run
+
+ expect(group).to have_attributes(membership_lock: true)
+ end
+ end
+
+ describe '#transform' do
+ it 'fetches only allowed attributes and symbolize keys' do
+ transformed_data = pipeline.transform(context, group_attributes)
+
+ expect(transformed_data).to eq({ membership_lock: true })
+ end
+
+ context 'when there is no data to transform' do
+ let(:group_attributes) { nil }
+
+ it do
+ transformed_data = pipeline.transform(context, group_attributes)
+
+ expect(transformed_data).to eq(nil)
+ end
+ end
+ end
+
+ describe '#after_run' do
+ it 'calls extractor#remove_tmpdir' do
+ expect_next_instance_of(BulkImports::Common::Extractors::JsonExtractor) do |extractor|
+ expect(extractor).to receive(:remove_tmpdir)
+ end
+
+ pipeline.after_run(nil)
+ end
+ end
+
+ describe '.relation' do
+ it { expect(described_class.relation).to eq('self') }
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
index 39e782dc093..441a34b0c74 100644
--- a/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/group_pipeline_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe BulkImports::Groups::Pipelines::GroupPipeline do
let(:group_data) do
{
- 'name' => 'source_name',
+ 'name' => 'Source Group Name',
'full_path' => 'source/full/path',
'visibility' => 'private',
'project_creation_level' => 'developer',
diff --git a/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb
new file mode 100644
index 00000000000..90b63453b88
--- /dev/null
+++ b/spec/lib/bulk_imports/groups/pipelines/namespace_settings_pipeline_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Groups::Pipelines::NamespaceSettingsPipeline do
+ subject(:pipeline) { described_class.new(context) }
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group, namespace_settings: create(:namespace_settings) ) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) { create(:bulk_import_entity, :group_entity, group: group, bulk_import: bulk_import) }
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ before do
+ group.add_owner(user)
+ end
+
+ describe '#run' do
+ before do
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ namespace_settings_attributes = {
+ 'namespace_id' => 22,
+ 'prevent_forking_outside_group' => true,
+ 'prevent_sharing_groups_outside_hierarchy' => true
+ }
+ allow(extractor).to receive(:extract).and_return(
+ BulkImports::Pipeline::ExtractedData.new(data: [[namespace_settings_attributes, 0]])
+ )
+ end
+ end
+
+ it 'imports allowed namespace settings attributes' do
+ expect(Groups::UpdateService).to receive(:new).with(
+ group, user, { prevent_sharing_groups_outside_hierarchy: true }
+ ).and_call_original
+
+ pipeline.run
+
+ expect(group.namespace_settings).to have_attributes(prevent_sharing_groups_outside_hierarchy: true)
+ end
+ end
+
+ describe '#transform' do
+ it 'fetches only allowed attributes and symbolize keys' do
+ all_model_attributes = NamespaceSetting.new.attributes
+
+ transformed_data = pipeline.transform(context, [all_model_attributes, 0])
+
+ expect(transformed_data.keys).to match_array([:prevent_sharing_groups_outside_hierarchy])
+ end
+
+ context 'when there is no data to transform' do
+ it do
+ namespace_settings_attributes = nil
+
+ transformed_data = pipeline.transform(context, namespace_settings_attributes)
+
+ expect(transformed_data).to eq(nil)
+ end
+ end
+ end
+
+ describe '#after_run' do
+ it 'calls extractor#remove_tmpdir' do
+ expect_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ expect(extractor).to receive(:remove_tmpdir)
+ end
+
+ context = instance_double(BulkImports::Pipeline::Context)
+
+ pipeline.after_run(context)
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
index e4a41428dd2..6949ac59948 100644
--- a/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/groups/pipelines/subgroup_entities_pipeline_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, path: 'group') }
- let_it_be(:parent) { create(:group, name: 'imported-group', path: 'imported-group') }
+ let_it_be(:parent) { create(:group, name: 'Imported Group', path: 'imported-group') }
let_it_be(:parent_entity) { create(:bulk_import_entity, destination_namespace: parent.full_path, group: parent) }
let_it_be(:tracker) { create(:bulk_import_tracker, entity: parent_entity) }
let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
@@ -14,8 +14,8 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
let(:extracted_data) do
BulkImports::Pipeline::ExtractedData.new(data: {
- 'name' => 'subgroup',
- 'full_path' => 'parent/subgroup'
+ 'path' => 'sub-group',
+ 'full_path' => 'parent/sub-group'
})
end
@@ -33,9 +33,9 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
subgroup_entity = BulkImports::Entity.last
- expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
+ expect(subgroup_entity.source_full_path).to eq 'parent/sub-group'
expect(subgroup_entity.destination_namespace).to eq 'imported-group'
- expect(subgroup_entity.destination_name).to eq 'subgroup'
+ expect(subgroup_entity.destination_name).to eq 'sub-group'
expect(subgroup_entity.parent_id).to eq parent_entity.id
end
end
@@ -51,9 +51,7 @@ RSpec.describe BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline do
destination_namespace: parent_entity.group.full_path,
parent_id: parent_entity.id
}
-
expect { subject.load(context, data) }.to change(BulkImports::Entity, :count).by(1)
-
subgroup_entity = BulkImports::Entity.last
expect(subgroup_entity.source_full_path).to eq 'parent/subgroup'
diff --git a/spec/lib/bulk_imports/groups/stage_spec.rb b/spec/lib/bulk_imports/groups/stage_spec.rb
index 645dee4a6f1..8ce25ff87d7 100644
--- a/spec/lib/bulk_imports/groups/stage_spec.rb
+++ b/spec/lib/bulk_imports/groups/stage_spec.rb
@@ -11,7 +11,9 @@ RSpec.describe BulkImports::Groups::Stage do
let(:pipelines) do
[
[0, BulkImports::Groups::Pipelines::GroupPipeline],
+ [1, BulkImports::Groups::Pipelines::GroupAttributesPipeline],
[1, BulkImports::Groups::Pipelines::SubgroupEntitiesPipeline],
+ [1, BulkImports::Groups::Pipelines::NamespaceSettingsPipeline],
[1, BulkImports::Common::Pipelines::MembersPipeline],
[1, BulkImports::Common::Pipelines::LabelsPipeline],
[1, BulkImports::Common::Pipelines::MilestonesPipeline],
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 75d8c15088a..c42ca9bef3b 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
@@ -6,7 +6,6 @@ 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(:group) { create(:group, name: 'My Source Group', parent: parent) }
let_it_be(:bulk_import) { create(:bulk_import, user: user) }
let_it_be(:entity) do
@@ -14,7 +13,7 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
:bulk_import_entity,
bulk_import: bulk_import,
source_full_path: 'source/full/path',
- destination_name: group.name,
+ destination_name: 'destination-name-path',
destination_namespace: parent.full_path
)
end
@@ -24,7 +23,8 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
let(:data) do
{
- 'name' => 'source_name',
+ 'name' => 'Source Group Name',
+ 'path' => 'source-group-path',
'full_path' => 'source/full/path',
'visibility' => 'private',
'project_creation_level' => 'developer',
@@ -34,23 +34,27 @@ RSpec.describe BulkImports::Groups::Transformers::GroupAttributesTransformer do
subject { described_class.new }
- it 'transforms name to destination name' do
- transformed_data = subject.transform(context, data)
+ it 'returns original data with some keys transformed' do
+ transformed_data = subject.transform(context, { 'name' => 'Name', 'description' => 'Description' })
- expect(transformed_data['name']).not_to eq('source_name')
- expect(transformed_data['name']).to eq(group.name)
+ expect(transformed_data).to eq({
+ 'name' => 'Name',
+ 'description' => 'Description',
+ 'parent_id' => parent.id,
+ 'path' => 'destination-name-path'
+ })
end
- it 'removes full path' do
+ it 'transforms path from destination_name' do
transformed_data = subject.transform(context, data)
- expect(transformed_data).not_to have_key('full_path')
+ expect(transformed_data['path']).to eq(entity.destination_name)
end
- it 'transforms path to parameterized name' do
+ it 'removes full path' do
transformed_data = subject.transform(context, data)
- expect(transformed_data['path']).to eq(group.name.parameterize)
+ expect(transformed_data).not_to have_key('full_path')
end
it 'transforms visibility level' do
diff --git a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
index 2f97a5721e7..6450d90ec0f 100644
--- a/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
+++ b/spec/lib/bulk_imports/groups/transformers/subgroup_to_entity_transformer_spec.rb
@@ -9,14 +9,14 @@ RSpec.describe BulkImports::Groups::Transformers::SubgroupToEntityTransformer do
parent_entity = instance_double(BulkImports::Entity, group: parent, id: 1)
context = instance_double(BulkImports::Pipeline::Context, entity: parent_entity)
subgroup_data = {
- "name" => "subgroup",
- "full_path" => "parent/subgroup"
+ "path" => "sub-group",
+ "full_path" => "parent/sub-group"
}
expect(subject.transform(context, subgroup_data)).to eq(
source_type: :group_entity,
- source_full_path: "parent/subgroup",
- destination_name: "subgroup",
+ source_full_path: "parent/sub-group",
+ destination_name: "sub-group",
destination_namespace: parent.full_path,
parent_id: 1
)
diff --git a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
index 8ea6ceb7619..25edc9feea8 100644
--- a/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/ndjson_pipeline_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe BulkImports::NdjsonPipeline do
subject { NdjsonPipelineClass.new(group, user) }
it 'marks pipeline as ndjson' do
- expect(NdjsonPipelineClass.ndjson_pipeline?).to eq(true)
+ expect(NdjsonPipelineClass.file_extraction_pipeline?).to eq(true)
end
describe '#deep_transform_relation!' do
diff --git a/spec/lib/bulk_imports/pipeline_spec.rb b/spec/lib/bulk_imports/pipeline_spec.rb
index 48c265d6118..e4ecf99dab0 100644
--- a/spec/lib/bulk_imports/pipeline_spec.rb
+++ b/spec/lib/bulk_imports/pipeline_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe BulkImports::Pipeline do
BulkImports::MyPipeline.transformer(klass, options)
BulkImports::MyPipeline.loader(klass, options)
BulkImports::MyPipeline.abort_on_failure!
- BulkImports::MyPipeline.ndjson_pipeline!
+ BulkImports::MyPipeline.file_extraction_pipeline!
expect(BulkImports::MyPipeline.get_extractor).to eq({ klass: klass, options: options })
@@ -75,7 +75,7 @@ RSpec.describe BulkImports::Pipeline do
expect(BulkImports::MyPipeline.get_loader).to eq({ klass: klass, options: options })
expect(BulkImports::MyPipeline.abort_on_failure?).to eq(true)
- expect(BulkImports::MyPipeline.ndjson_pipeline?).to eq(true)
+ expect(BulkImports::MyPipeline.file_extraction_pipeline?).to eq(true)
end
end
end
diff --git a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
index df7ff5b8062..aa9c7486c27 100644
--- a/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
+++ b/spec/lib/bulk_imports/projects/pipelines/project_attributes_pipeline_spec.rb
@@ -23,7 +23,6 @@ RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline do
'merge_requests_ff_only_enabled' => true,
'issues_template' => 'test',
'shared_runners_enabled' => true,
- 'build_coverage_regex' => 'build_coverage_regex',
'build_allow_git_fetch' => true,
'build_timeout' => 3600,
'pending_delete' => false,
@@ -177,4 +176,8 @@ RSpec.describe BulkImports::Projects::Pipelines::ProjectAttributesPipeline do
end
end
end
+
+ describe '.relation' do
+ it { expect(described_class.relation).to eq('self') }
+ end
end
diff --git a/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb b/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb
new file mode 100644
index 00000000000..2279e66720e
--- /dev/null
+++ b/spec/lib/bulk_imports/projects/pipelines/releases_pipeline_spec.rb
@@ -0,0 +1,122 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BulkImports::Projects::Pipelines::ReleasesPipeline do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:bulk_import) { create(:bulk_import, user: user) }
+ let_it_be(:entity) do
+ create(
+ :bulk_import_entity,
+ :project_entity,
+ project: project,
+ bulk_import: bulk_import,
+ source_full_path: 'source/full/path',
+ destination_name: 'My Destination Project',
+ destination_namespace: group.full_path
+ )
+ end
+
+ let_it_be(:tracker) { create(:bulk_import_tracker, entity: entity) }
+ let_it_be(:context) { BulkImports::Pipeline::Context.new(tracker) }
+
+ let(:attributes) { {} }
+ let(:release) do
+ {
+ 'tag' => '1.1',
+ 'name' => 'release 1.1',
+ 'description' => 'Release notes',
+ 'created_at' => '2019-12-26T10:17:14.621Z',
+ 'updated_at' => '2019-12-26T10:17:14.621Z',
+ 'released_at' => '2019-12-26T10:17:14.615Z',
+ 'sha' => '901de3a8bd5573f4a049b1457d28bc1592ba6bf9'
+ }.merge(attributes)
+ end
+
+ subject(:pipeline) { described_class.new(context) }
+
+ describe '#run' do
+ before do
+ group.add_owner(user)
+ with_index = [release, 0]
+
+ allow_next_instance_of(BulkImports::Common::Extractors::NdjsonExtractor) do |extractor|
+ allow(extractor).to receive(:extract).and_return(BulkImports::Pipeline::ExtractedData.new(data: [with_index]))
+ end
+
+ pipeline.run
+ end
+
+ it 'imports release into destination project' do
+ expect(project.releases.count).to eq(1)
+
+ imported_release = project.releases.last
+
+ aggregate_failures do
+ expect(imported_release.tag).to eq(release['tag'])
+ expect(imported_release.name).to eq(release['name'])
+ expect(imported_release.description).to eq(release['description'])
+ expect(imported_release.created_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.updated_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.released_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(imported_release.sha).to eq(release['sha'])
+ end
+ end
+
+ context 'links' do
+ let(:link) do
+ {
+ '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'
+ }
+ end
+
+ let(:attributes) {{ 'links' => [link] }}
+
+ it 'restores release links' do
+ release_link = project.releases.last.links.first
+
+ aggregate_failures do
+ expect(release_link.url).to eq(link['url'])
+ expect(release_link.name).to eq(link['name'])
+ expect(release_link.created_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ expect(release_link.updated_at.to_s).to eq('2019-12-26 10:17:14 UTC')
+ end
+ end
+ end
+
+ context 'milestones' do
+ let(:milestone) do
+ {
+ 'iid' => 1,
+ 'state' => 'closed',
+ 'title' => 'test milestone',
+ 'description' => 'test milestone',
+ 'due_date' => '2016-06-14',
+ 'created_at' => '2016-06-14T15:02:04.415Z',
+ 'updated_at' => '2016-06-14T15:02:04.415Z'
+ }
+ end
+
+ let(:attributes) {{ 'milestone_releases' => [{ 'milestone' => milestone }] }}
+
+ it 'restores release milestone' do
+ release_milestone = project.releases.last.milestone_releases.first.milestone
+
+ aggregate_failures do
+ expect(release_milestone.iid).to eq(milestone['iid'])
+ expect(release_milestone.state).to eq(milestone['state'])
+ expect(release_milestone.title).to eq(milestone['title'])
+ expect(release_milestone.description).to eq(milestone['description'])
+ expect(release_milestone.due_date.to_s).to eq('2016-06-14')
+ expect(release_milestone.created_at.to_s).to eq('2016-06-14 15:02:04 UTC')
+ expect(release_milestone.updated_at.to_s).to eq('2016-06-14 15:02:04 UTC')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/bulk_imports/projects/stage_spec.rb b/spec/lib/bulk_imports/projects/stage_spec.rb
index 9fce30f3a81..e81d9cc5fb4 100644
--- a/spec/lib/bulk_imports/projects/stage_spec.rb
+++ b/spec/lib/bulk_imports/projects/stage_spec.rb
@@ -20,10 +20,11 @@ RSpec.describe BulkImports::Projects::Stage do
[4, BulkImports::Projects::Pipelines::MergeRequestsPipeline],
[4, BulkImports::Projects::Pipelines::ExternalPullRequestsPipeline],
[4, BulkImports::Projects::Pipelines::ProtectedBranchesPipeline],
- [4, BulkImports::Projects::Pipelines::CiPipelinesPipeline],
[4, BulkImports::Projects::Pipelines::ProjectFeaturePipeline],
[4, BulkImports::Projects::Pipelines::ContainerExpirationPolicyPipeline],
[4, BulkImports::Projects::Pipelines::ServiceDeskSettingPipeline],
+ [4, BulkImports::Projects::Pipelines::ReleasesPipeline],
+ [5, BulkImports::Projects::Pipelines::CiPipelinesPipeline],
[5, BulkImports::Common::Pipelines::WikiPipeline],
[5, BulkImports::Common::Pipelines::UploadsPipeline],
[5, BulkImports::Common::Pipelines::LfsObjectsPipeline],
diff --git a/spec/lib/constraints/feature_constrainer_spec.rb b/spec/lib/constraints/feature_constrainer_spec.rb
deleted file mode 100644
index c98dc694186..00000000000
--- a/spec/lib/constraints/feature_constrainer_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Constraints::FeatureConstrainer do
- describe '#matches' do
- it 'calls Feature.enabled? with the correct arguments' do
- gate = stub_feature_flag_gate("an object")
-
- expect(Feature).to receive(:enabled?)
- .with(:feature_name, gate, default_enabled: true)
-
- described_class.new(:feature_name, gate, default_enabled: true).matches?(double('request'))
- end
- end
-end
diff --git a/spec/lib/container_registry/client_spec.rb b/spec/lib/container_registry/client_spec.rb
index 39a594eba5c..f9e08df3399 100644
--- a/spec/lib/container_registry/client_spec.rb
+++ b/spec/lib/container_registry/client_spec.rb
@@ -199,69 +199,16 @@ RSpec.describe ContainerRegistry::Client do
let(:redirect_location) { 'http://redirect?foo=bar&test=signature=' }
it_behaves_like 'handling redirects'
-
- context 'with container_registry_follow_redirects_middleware disabled' do
- before do
- stub_feature_flags(container_registry_follow_redirects_middleware: false)
- end
-
- it 'follows the redirect' do
- expect(Faraday::Utils).to receive(:escape).with('foo').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('bar').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('test').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('signature=').and_call_original
-
- expect_new_faraday(times: 2)
- expect(subject).to eq('Successfully redirected')
- end
- end
end
context 'with a redirect location with params ending with %3D' do
let(:redirect_location) { 'http://redirect?foo=bar&test=signature%3D' }
it_behaves_like 'handling redirects'
-
- context 'with container_registry_follow_redirects_middleware disabled' do
- before do
- stub_feature_flags(container_registry_follow_redirects_middleware: false)
- end
-
- it 'follows the redirect' do
- expect(Faraday::Utils).to receive(:escape).with('foo').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('bar').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('test').and_call_original
- expect(Faraday::Utils).to receive(:escape).with('signature=').and_call_original
-
- expect_new_faraday(times: 2)
- expect(subject).to eq('Successfully redirected')
- end
- end
end
end
it_behaves_like 'handling timeouts'
-
- # TODO Remove this context along with the
- # container_registry_follow_redirects_middleware feature flag
- # See https://gitlab.com/gitlab-org/gitlab/-/issues/353291
- context 'faraday blob' do
- subject { client.send(:faraday_blob) }
-
- it 'has a follow redirects middleware' do
- expect(subject.builder.handlers).to include(::FaradayMiddleware::FollowRedirects)
- end
-
- context 'with container_registry_follow_redirects_middleware is disabled' do
- before do
- stub_feature_flags(container_registry_follow_redirects_middleware: false)
- end
-
- it 'has not a follow redirects middleware' do
- expect(subject.builder.handlers).not_to include(::FaradayMiddleware::FollowRedirects)
- end
- end
- end
end
describe '#upload_blob' do
diff --git a/spec/lib/container_registry/migration_spec.rb b/spec/lib/container_registry/migration_spec.rb
index 6c0fc94e27f..81dac354b8b 100644
--- a/spec/lib/container_registry/migration_spec.rb
+++ b/spec/lib/container_registry/migration_spec.rb
@@ -58,21 +58,25 @@ RSpec.describe ContainerRegistry::Migration do
describe '.capacity' do
subject { described_class.capacity }
- where(:ff_1_enabled, :ff_10_enabled, :ff_25_enabled, :expected_result) do
- false | false | false | 0
- true | false | false | 1
- true | true | false | 10
- true | true | true | 25
- false | true | false | 10
- false | true | true | 25
- false | false | true | 25
- true | false | true | 25
+ where(:ff_1_enabled, :ff_2_enabled, :ff_5_enabled, :ff_10_enabled, :ff_25_enabled, :expected_result) do
+ false | false | false | false | false | 0
+ true | false | false | false | false | 1
+ false | true | false | false | false | 2
+ true | true | false | false | false | 2
+ false | false | true | false | false | 5
+ true | true | true | false | false | 5
+ false | false | false | true | false | 10
+ true | true | true | true | false | 10
+ false | false | false | false | true | 25
+ true | true | true | true | true | 25
end
with_them do
before do
stub_feature_flags(
container_registry_migration_phase2_capacity_1: ff_1_enabled,
+ container_registry_migration_phase2_capacity_2: ff_2_enabled,
+ container_registry_migration_phase2_capacity_5: ff_5_enabled,
container_registry_migration_phase2_capacity_10: ff_10_enabled,
container_registry_migration_phase2_capacity_25: ff_25_enabled
)
@@ -154,6 +158,30 @@ RSpec.describe ContainerRegistry::Migration do
end
end
+ describe '.pre_import_timeout' do
+ let(:value) { 10.minutes }
+
+ before do
+ stub_application_setting(container_registry_pre_import_timeout: value)
+ end
+
+ it 'returns the matching application_setting' do
+ expect(described_class.pre_import_timeout).to eq(value)
+ end
+ end
+
+ describe '.import_timeout' do
+ let(:value) { 10.minutes }
+
+ before do
+ stub_application_setting(container_registry_import_timeout: value)
+ end
+
+ it 'returns the matching application_setting' do
+ expect(described_class.import_timeout).to eq(value)
+ end
+ end
+
describe '.target_plans' do
subject { described_class.target_plans }
@@ -185,4 +213,32 @@ RSpec.describe ContainerRegistry::Migration do
it { is_expected.to eq(false) }
end
end
+
+ describe '.enqueue_twice?' do
+ subject { described_class.enqueue_twice? }
+
+ it { is_expected.to eq(true) }
+
+ context 'feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_enqueue_twice: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ describe '.enqueue_loop?' do
+ subject { described_class.enqueuer_loop? }
+
+ it { is_expected.to eq(true) }
+
+ context 'feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_enqueuer_loop: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
end
diff --git a/spec/lib/error_tracking/collector/dsn_spec.rb b/spec/lib/error_tracking/collector/dsn_spec.rb
index af55e6f20ec..3aa8719fe38 100644
--- a/spec/lib/error_tracking/collector/dsn_spec.rb
+++ b/spec/lib/error_tracking/collector/dsn_spec.rb
@@ -3,24 +3,32 @@
require 'spec_helper'
RSpec.describe ErrorTracking::Collector::Dsn do
- describe '.build__url' do
- let(:gitlab) do
- double(
+ describe '.build_url' do
+ let(:setting) do
+ {
protocol: 'https',
https: true,
+ port: 443,
host: 'gitlab.example.com',
- port: '4567',
relative_url_root: nil
- )
+ }
end
subject { described_class.build_url('abcdef1234567890', 778) }
- it 'returns a valid URL' do
- allow(Settings).to receive(:gitlab).and_return(gitlab)
- allow(Settings).to receive(:gitlab_on_standard_port?).and_return(false)
+ it 'returns a valid URL without explicit port' do
+ stub_config_setting(setting)
- is_expected.to eq('https://abcdef1234567890@gitlab.example.com:4567/api/v4/error_tracking/collector/778')
+ 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/collector/sentry_auth_parser_spec.rb b/spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb
index 4f00b1ec654..0e4bba04baa 100644
--- a/spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb
+++ b/spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb
@@ -5,11 +5,11 @@ require 'spec_helper'
RSpec.describe ErrorTracking::Collector::SentryAuthParser do
describe '.parse' do
let(:headers) { { 'X-Sentry-Auth' => "Sentry sentry_key=glet_1fedb514e17f4b958435093deb02048c" } }
- let(:request) { double('request', headers: headers) }
+ let(:request) { instance_double('ActionDispatch::Request', headers: headers) }
subject { described_class.parse(request) }
- context 'empty headers' do
+ context 'with empty headers' do
let(:headers) { {} }
it 'fails with exception' do
@@ -17,7 +17,7 @@ RSpec.describe ErrorTracking::Collector::SentryAuthParser do
end
end
- context 'missing sentry_key' do
+ context 'with missing sentry_key' do
let(:headers) { { 'X-Sentry-Auth' => "Sentry foo=bar" } }
it 'returns empty value for public_key' do
diff --git a/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb b/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
index 06f4b64ce93..e86ee67c129 100644
--- a/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
+++ b/spec/lib/error_tracking/collector/sentry_request_parser_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe ErrorTracking::Collector::SentryRequestParser do
let(:body) { raw_event }
let(:headers) { { 'Content-Encoding' => '' } }
- let(:request) { double('request', headers: headers, body: StringIO.new(body)) }
+ let(:request) { instance_double('ActionDispatch::Request', headers: headers, body: StringIO.new(body)) }
subject { described_class.parse(request) }
@@ -22,7 +22,7 @@ RSpec.describe ErrorTracking::Collector::SentryRequestParser do
end
end
- context 'empty body content' do
+ context 'with empty body content' do
let(:body) { '' }
it 'fails with exception' do
@@ -30,7 +30,7 @@ RSpec.describe ErrorTracking::Collector::SentryRequestParser do
end
end
- context 'plain text sentry request' do
+ context 'with plain text sentry request' do
it_behaves_like 'valid parser'
end
end
diff --git a/spec/lib/feature/definition_spec.rb b/spec/lib/feature/definition_spec.rb
index 2f95f8eeab7..3d11ad4c0d8 100644
--- a/spec/lib/feature/definition_spec.rb
+++ b/spec/lib/feature/definition_spec.rb
@@ -54,22 +54,10 @@ RSpec.describe Feature::Definition do
describe '#valid_usage!' do
context 'validates type' do
it 'raises exception for invalid type' do
- expect { definition.valid_usage!(type_in_code: :invalid, default_enabled_in_code: false) }
+ expect { definition.valid_usage!(type_in_code: :invalid) }
.to raise_error(/The `type:` of `feature_flag` is not equal to config/)
end
end
-
- context 'validates default enabled' do
- it 'raises exception for different value' do
- expect { definition.valid_usage!(type_in_code: :development, default_enabled_in_code: false) }
- .to raise_error(/The `default_enabled:` of `feature_flag` is not equal to config/)
- end
-
- it 'allows passing `default_enabled: :yaml`' do
- expect { definition.valid_usage!(type_in_code: :development, default_enabled_in_code: :yaml) }
- .not_to raise_error
- end
- end
end
describe '.paths' do
@@ -165,18 +153,14 @@ RSpec.describe Feature::Definition do
using RSpec::Parameterized::TableSyntax
let(:definition) do
- Feature::Definition.new("development/enabled_feature_flag.yml",
- name: :enabled_feature_flag,
- type: 'development',
- milestone: milestone,
- default_enabled: false)
+ described_class.new("development/enabled_feature_flag.yml",
+ name: :enabled_feature_flag,
+ type: 'development',
+ milestone: milestone,
+ default_enabled: false)
end
before do
- allow(Feature::Definition).to receive(:definitions) do
- { definition.key => definition }
- end
-
allow(Gitlab).to receive(:version_info).and_return(Gitlab::VersionInfo.parse(current_milestone))
end
@@ -192,7 +176,7 @@ RSpec.describe Feature::Definition do
end
with_them do
- it {is_expected.to be(expected)}
+ it { is_expected.to be(expected) }
end
end
@@ -207,7 +191,7 @@ RSpec.describe Feature::Definition do
it 'validates it usage' do
expect(definition).to receive(:valid_usage!)
- described_class.valid_usage!(:feature_flag, type: :development, default_enabled: false)
+ described_class.valid_usage!(:feature_flag, type: :development)
end
end
@@ -221,7 +205,7 @@ RSpec.describe Feature::Definition do
it 'raises exception' do
expect do
- described_class.valid_usage!(:unknown_feature_flag, type: :development, default_enabled: false)
+ described_class.valid_usage!(:unknown_feature_flag, type: :development)
end.to raise_error(/Missing feature definition for `unknown_feature_flag`/)
end
end
@@ -235,7 +219,7 @@ RSpec.describe Feature::Definition do
it 'does not raise exception' do
expect do
- described_class.valid_usage!(:unknown_feature_flag, type: :development, default_enabled: false)
+ described_class.valid_usage!(:unknown_feature_flag, type: :development)
end.not_to raise_error
end
end
@@ -243,7 +227,7 @@ RSpec.describe Feature::Definition do
context 'for an unknown type' do
it 'raises exception' do
expect do
- described_class.valid_usage!(:unknown_feature_flag, type: :unknown_type, default_enabled: false)
+ described_class.valid_usage!(:unknown_feature_flag, type: :unknown_type)
end.to raise_error(/Unknown feature flag type used: `unknown_type`/)
end
end
@@ -254,23 +238,23 @@ RSpec.describe Feature::Definition do
using RSpec::Parameterized::TableSyntax
let(:definition) do
- Feature::Definition.new("development/enabled_feature_flag.yml",
- name: :enabled_feature_flag,
- type: 'development',
- milestone: milestone,
- log_state_changes: log_state_change,
- default_enabled: false)
+ described_class.new("development/enabled_feature_flag.yml",
+ name: :enabled_feature_flag,
+ type: 'development',
+ milestone: milestone,
+ log_state_changes: log_state_change,
+ default_enabled: false)
end
before do
- allow(Feature::Definition).to receive(:definitions) do
- { definition.key => definition }
- end
+ stub_feature_flag_definition(:enabled_feature_flag,
+ milestone: milestone,
+ log_state_changes: log_state_change)
allow(Gitlab).to receive(:version_info).and_return(Gitlab::VersionInfo.new(10, 0, 0))
end
- subject { Feature::Definition.log_states?(key) }
+ subject { described_class.log_states?(key) }
where(:ctx, :key, :milestone, :log_state_change, :expected) do
'When flag does not exist' | :no_flag | "0.0" | true | false
@@ -286,10 +270,11 @@ RSpec.describe Feature::Definition do
end
describe '.default_enabled?' do
- subject { described_class.default_enabled?(key) }
+ subject { described_class.default_enabled?(key, default_enabled_if_undefined: default_value) }
context 'when feature flag exist' do
let(:key) { definition.key }
+ let(:default_value) { nil }
before do
allow(described_class).to receive(:definitions) do
@@ -319,21 +304,33 @@ RSpec.describe Feature::Definition do
context 'when feature flag does not exist' do
let(:key) { :unknown_feature_flag }
- context 'when on dev or test environment' do
- it 'raises an error' do
- expect { subject }.to raise_error(
- Feature::InvalidFeatureFlagError,
- "The feature flag YAML definition for 'unknown_feature_flag' does not exist")
+ context 'when passing default value' do
+ let(:default_value) { false }
+
+ it 'returns default value' do
+ expect(subject).to eq(default_value)
end
end
- context 'when on production environment' do
- before do
- allow(Gitlab::ErrorTracking).to receive(:should_raise_for_dev?).and_return(false)
+ context 'when default value is undefined' do
+ let(:default_value) { nil }
+
+ context 'when on dev or test environment' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(
+ Feature::InvalidFeatureFlagError,
+ "The feature flag YAML definition for 'unknown_feature_flag' does not exist")
+ end
end
- it 'returns false' do
- expect(subject).to eq(false)
+ context 'when on production environment' do
+ before do
+ allow(Gitlab::ErrorTracking).to receive(:should_raise_for_dev?).and_return(false)
+ end
+
+ it 'returns false' do
+ expect(subject).to eq(false)
+ end
end
end
end
diff --git a/spec/lib/feature_spec.rb b/spec/lib/feature_spec.rb
index 90c0684f8b7..6e32db09426 100644
--- a/spec/lib/feature_spec.rb
+++ b/spec/lib/feature_spec.rb
@@ -45,7 +45,7 @@ RSpec.describe Feature, stub_feature_flags: false do
expect_any_instance_of(Flipper::DSL).to receive(:feature).with(key)
.and_return(feature)
- expect(described_class.get(key)).to be(feature)
+ expect(described_class.get(key)).to eq(feature)
end
end
@@ -67,7 +67,7 @@ RSpec.describe Feature, stub_feature_flags: false do
expect(Gitlab::ProcessMemoryCache.cache_backend)
.to receive(:fetch)
.once
- .with('flipper/v1/features', expires_in: 1.minute)
+ .with('flipper/v1/features', { expires_in: 1.minute })
.and_call_original
2.times do
@@ -157,14 +157,65 @@ RSpec.describe Feature, stub_feature_flags: false do
describe '.enabled?' do
before do
allow(Feature).to receive(:log_feature_flag_states?).and_return(false)
+
+ stub_feature_flag_definition(:disabled_feature_flag)
+ stub_feature_flag_definition(:enabled_feature_flag, default_enabled: true)
+ end
+
+ context 'when self-recursive' do
+ before do
+ allow(Feature).to receive(:with_feature).and_wrap_original do |original, name, &block|
+ original.call(name) do |ff|
+ Feature.enabled?(name)
+ block.call(ff)
+ end
+ end
+ end
+
+ it 'returns the default value' do
+ expect(described_class.enabled?(:enabled_feature_flag)).to eq true
+ end
+
+ it 'detects self recursion' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(have_attributes(message: 'self recursion'), { stack: [:enabled_feature_flag] })
+
+ described_class.enabled?(:enabled_feature_flag)
+ end
end
- it 'returns false for undefined feature' do
+ context 'when deeply recursive' do
+ before do
+ allow(Feature).to receive(:with_feature).and_wrap_original do |original, name, &block|
+ original.call(name) do |ff|
+ Feature.enabled?(:"deeper_#{name}", type: :undefined, default_enabled_if_undefined: true)
+ block.call(ff)
+ end
+ end
+ end
+
+ it 'detects deep recursion' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(have_attributes(message: 'deep recursion'), stack: have_attributes(size: be > 10))
+
+ described_class.enabled?(:enabled_feature_flag)
+ end
+ end
+
+ it 'returns false (and tracks / raises exception for dev) for undefined feature' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+
expect(described_class.enabled?(:some_random_feature_flag)).to be_falsey
end
- it 'returns true for undefined feature with default_enabled' do
- expect(described_class.enabled?(:some_random_feature_flag, default_enabled: true)).to be_truthy
+ it 'returns false for undefined feature with default_enabled_if_undefined: false' do
+ expect(described_class.enabled?(:some_random_feature_flag, default_enabled_if_undefined: false)).to be_falsey
+ end
+
+ it 'returns true for undefined feature with default_enabled_if_undefined: true' do
+ expect(described_class.enabled?(:some_random_feature_flag, default_enabled_if_undefined: true)).to be_truthy
end
it 'returns false for existing disabled feature in the database' do
@@ -184,23 +235,23 @@ RSpec.describe Feature, stub_feature_flags: false do
it 'caches the status in L1 and L2 caches',
:request_store, :use_clean_rails_memory_store_caching do
- described_class.enable(:enabled_feature_flag)
- flipper_key = "flipper/v1/feature/enabled_feature_flag"
+ described_class.enable(:disabled_feature_flag)
+ flipper_key = "flipper/v1/feature/disabled_feature_flag"
expect(described_class.send(:l2_cache_backend))
.to receive(:fetch)
.once
- .with(flipper_key, expires_in: 1.hour)
+ .with(flipper_key, { expires_in: 1.hour })
.and_call_original
expect(described_class.send(:l1_cache_backend))
.to receive(:fetch)
.once
- .with(flipper_key, expires_in: 1.minute)
+ .with(flipper_key, { expires_in: 1.minute })
.and_call_original
2.times do
- expect(described_class.enabled?(:enabled_feature_flag)).to be_truthy
+ expect(described_class.enabled?(:disabled_feature_flag)).to be_truthy
end
end
@@ -208,22 +259,14 @@ RSpec.describe Feature, stub_feature_flags: false do
fake_default = double('fake default')
expect(ActiveRecord::Base).to receive(:connection) { raise ActiveRecord::NoDatabaseError, "No database" }
- expect(described_class.enabled?(:a_feature, default_enabled: fake_default)).to eq(fake_default)
+ expect(described_class.enabled?(:a_feature, default_enabled_if_undefined: fake_default)).to eq(fake_default)
end
context 'logging is enabled', :request_store do
before do
allow(Feature).to receive(:log_feature_flag_states?).and_call_original
- definition = Feature::Definition.new("development/enabled_feature_flag.yml",
- name: :enabled_feature_flag,
- type: 'development',
- log_state_changes: true,
- default_enabled: false)
-
- allow(Feature::Definition).to receive(:definitions) do
- { definition.key => definition }
- end
+ stub_feature_flag_definition(:enabled_feature_flag, log_state_changes: true)
described_class.enable(:feature_flag_state_logs)
described_class.enable(:enabled_feature_flag)
@@ -241,18 +284,16 @@ RSpec.describe Feature, stub_feature_flags: false do
end
context 'cached feature flag', :request_store do
- let(:flag) { :some_feature_flag }
-
before do
described_class.send(:flipper).memoize = false
- described_class.enabled?(flag)
+ described_class.enabled?(:disabled_feature_flag)
end
it 'caches the status in L1 cache for the first minute' do
expect do
expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original
expect(described_class.send(:l2_cache_backend)).not_to receive(:fetch)
- expect(described_class.enabled?(flag)).to be_truthy
+ expect(described_class.enabled?(:disabled_feature_flag)).to be_truthy
end.not_to exceed_query_limit(0)
end
@@ -261,7 +302,7 @@ RSpec.describe Feature, stub_feature_flags: false do
expect do
expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original
expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original
- expect(described_class.enabled?(flag)).to be_truthy
+ expect(described_class.enabled?(:disabled_feature_flag)).to be_truthy
end.not_to exceed_query_limit(0)
end
end
@@ -271,7 +312,7 @@ RSpec.describe Feature, stub_feature_flags: false do
expect do
expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original
expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original
- expect(described_class.enabled?(flag)).to be_truthy
+ expect(described_class.enabled?(:disabled_feature_flag)).to be_truthy
end.not_to exceed_query_limit(1)
end
end
@@ -338,21 +379,38 @@ RSpec.describe Feature, stub_feature_flags: false do
.to raise_error(/The `type:` of/)
end
- it 'when invalid default_enabled is used' do
- expect { described_class.enabled?(:my_feature_flag, default_enabled: true) }
- .to raise_error(/The `default_enabled:` of/)
+ context 'when default_enabled: is false in the YAML definition' do
+ it 'reads the default from the YAML definition' do
+ expect(described_class.enabled?(:my_feature_flag)).to eq(default_enabled)
+ end
end
- context 'when `default_enabled: :yaml` is used in code' do
+ context 'when default_enabled: is true in the YAML definition' do
+ let(:default_enabled) { true }
+
it 'reads the default from the YAML definition' do
- expect(described_class.enabled?(:my_feature_flag, default_enabled: :yaml)).to eq(false)
+ expect(described_class.enabled?(:my_feature_flag)).to eq(true)
end
- context 'when default_enabled is true in the YAML definition' do
- let(:default_enabled) { true }
+ context 'and feature has been disabled' do
+ before do
+ described_class.disable(:my_feature_flag)
+ end
- it 'reads the default from the YAML definition' do
- expect(described_class.enabled?(:my_feature_flag, default_enabled: :yaml)).to eq(true)
+ it 'is not enabled' do
+ expect(described_class.enabled?(:my_feature_flag)).to eq(false)
+ end
+ end
+
+ context 'with a cached value and the YAML definition is changed thereafter' do
+ before do
+ described_class.enabled?(:my_feature_flag)
+ end
+
+ it 'reads new default value' do
+ allow(definition).to receive(:default_enabled).and_return(true)
+
+ expect(described_class.enabled?(:my_feature_flag)).to eq(true)
end
end
@@ -361,7 +419,7 @@ RSpec.describe Feature, stub_feature_flags: false do
context 'when in dev or test environment' do
it 'raises an error for dev' do
- expect { described_class.enabled?(:non_existent_flag, type: optional_type, default_enabled: :yaml) }
+ expect { described_class.enabled?(:non_existent_flag, type: optional_type) }
.to raise_error(
Feature::InvalidFeatureFlagError,
"The feature flag YAML definition for 'non_existent_flag' does not exist")
@@ -379,9 +437,9 @@ RSpec.describe Feature, stub_feature_flags: false do
end
it 'checks the persisted status and returns false' do
- expect(described_class).to receive(:get).with(:non_existent_flag).and_call_original
+ expect(described_class).to receive(:with_feature).with(:non_existent_flag).and_call_original
- expect(described_class.enabled?(:non_existent_flag, type: optional_type, default_enabled: :yaml)).to eq(false)
+ expect(described_class.enabled?(:non_existent_flag, type: optional_type)).to eq(false)
end
end
@@ -393,7 +451,7 @@ RSpec.describe Feature, stub_feature_flags: false do
it 'returns false without checking the status in the database' do
expect(described_class).not_to receive(:get)
- expect(described_class.enabled?(:non_existent_flag, type: optional_type, default_enabled: :yaml)).to eq(false)
+ expect(described_class.enabled?(:non_existent_flag, type: optional_type)).to eq(false)
end
end
end
@@ -403,21 +461,29 @@ RSpec.describe Feature, stub_feature_flags: false do
end
describe '.disable?' do
- it 'returns true for undefined feature' do
+ it 'returns true (and tracks / raises exception for dev) for undefined feature' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+
expect(described_class.disabled?(:some_random_feature_flag)).to be_truthy
end
- it 'returns false for undefined feature with default_enabled' do
- expect(described_class.disabled?(:some_random_feature_flag, default_enabled: true)).to be_falsey
+ it 'returns true for undefined feature with default_enabled_if_undefined: false' do
+ expect(described_class.disabled?(:some_random_feature_flag, default_enabled_if_undefined: false)).to be_truthy
+ end
+
+ it 'returns false for undefined feature with default_enabled_if_undefined: true' do
+ expect(described_class.disabled?(:some_random_feature_flag, default_enabled_if_undefined: true)).to be_falsey
end
it 'returns true for existing disabled feature in the database' do
+ stub_feature_flag_definition(:disabled_feature_flag)
described_class.disable(:disabled_feature_flag)
expect(described_class.disabled?(:disabled_feature_flag)).to be_truthy
end
it 'returns false for existing enabled feature in the database' do
+ stub_feature_flag_definition(:enabled_feature_flag)
described_class.enable(:enabled_feature_flag)
expect(described_class.disabled?(:enabled_feature_flag)).to be_falsey
@@ -556,14 +622,7 @@ RSpec.describe Feature, stub_feature_flags: false do
let(:log_state_changes) { false }
let(:milestone) { "0.0" }
let(:flag_name) { :some_flag }
- let(:definition) do
- Feature::Definition.new("development/#{flag_name}.yml",
- name: flag_name,
- type: 'development',
- milestone: milestone,
- log_state_changes: log_state_changes,
- default_enabled: false)
- end
+ let(:flag_type) { 'development' }
before do
Feature.enable(:feature_flag_state_logs)
@@ -573,9 +632,10 @@ RSpec.describe Feature, stub_feature_flags: false do
allow(Feature).to receive(:log_feature_flag_states?).with(:feature_flag_state_logs).and_call_original
allow(Feature).to receive(:log_feature_flag_states?).with(:some_flag).and_call_original
- allow(Feature::Definition).to receive(:definitions) do
- { definition.key => definition }
- end
+ stub_feature_flag_definition(flag_name,
+ type: flag_type,
+ milestone: milestone,
+ log_state_changes: log_state_changes)
end
subject { described_class.log_feature_flag_states?(flag_name) }
@@ -583,6 +643,7 @@ RSpec.describe Feature, stub_feature_flags: false do
context 'when flag is feature_flag_state_logs' do
let(:milestone) { "14.6" }
let(:flag_name) { :feature_flag_state_logs }
+ let(:flag_type) { 'ops' }
let(:log_state_changes) { true }
it { is_expected.to be_falsey }
@@ -593,13 +654,7 @@ RSpec.describe Feature, stub_feature_flags: false do
end
context 'when flag is old while log_state_changes is not present ' do
- let(:definition) do
- Feature::Definition.new("development/#{flag_name}.yml",
- name: flag_name,
- type: 'development',
- milestone: milestone,
- default_enabled: false)
- end
+ let(:log_state_changes) { nil }
it { is_expected.to be_falsey }
end
@@ -621,12 +676,7 @@ RSpec.describe Feature, stub_feature_flags: false do
end
context 'when milestone is nil' do
- let(:definition) do
- Feature::Definition.new("development/#{flag_name}.yml",
- name: flag_name,
- type: 'development',
- default_enabled: false)
- end
+ let(:milestone) { nil }
it { is_expected.to be_falsey }
end
diff --git a/spec/lib/gitlab/application_rate_limiter_spec.rb b/spec/lib/gitlab/application_rate_limiter_spec.rb
index 20c89eab5f5..efe78cd3a35 100644
--- a/spec/lib/gitlab/application_rate_limiter_spec.rb
+++ b/spec/lib/gitlab/application_rate_limiter_spec.rb
@@ -56,6 +56,20 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
end
end
+ context 'when the key is valid' do
+ it 'records the checked key in request storage', :request_store do
+ subject.throttled?(:test_action, scope: [user])
+
+ expect(::Gitlab::Instrumentation::RateLimitingGates.payload)
+ .to eq(::Gitlab::Instrumentation::RateLimitingGates::GATES => [:test_action])
+
+ subject.throttled?(:another_action, scope: [user], peek: true)
+
+ expect(::Gitlab::Instrumentation::RateLimitingGates.payload)
+ .to eq(::Gitlab::Instrumentation::RateLimitingGates::GATES => [:test_action, :another_action])
+ end
+ end
+
shared_examples 'throttles based on key and scope' do
let(:start_time) { Time.current.beginning_of_hour }
diff --git a/spec/lib/gitlab/asciidoc_spec.rb b/spec/lib/gitlab/asciidoc_spec.rb
index 44bbbe49cd3..d86191ca0c2 100644
--- a/spec/lib/gitlab/asciidoc_spec.rb
+++ b/spec/lib/gitlab/asciidoc_spec.rb
@@ -79,7 +79,7 @@ module Gitlab
},
'image with onerror' => {
input: 'image:https://localhost.com/image.png[Alt text" onerror="alert(7)]',
- output: "<div>\n<p><span><a class=\"no-attachment-icon\" href=\"https://localhost.com/image.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt='Alt text\" onerror=\"alert(7)' class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
+ output: "<div>\n<p><span><a class=\"no-attachment-icon\" href=\"https://localhost.com/image.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt='Alt text\" onerror=\"alert(7)' decoding=\"async\" class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
}
}
@@ -112,13 +112,13 @@ module Gitlab
context "images" do
it "does lazy load and link image" do
input = 'image:https://localhost.com/image.png[]'
- output = "<div>\n<p><span><a class=\"no-attachment-icon\" href=\"https://localhost.com/image.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"image\" class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
+ output = "<div>\n<p><span><a class=\"no-attachment-icon\" href=\"https://localhost.com/image.png\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"image\" decoding=\"async\" class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
expect(render(input, context)).to include(output)
end
it "does not automatically link image if link is explicitly defined" do
input = 'image:https://localhost.com/image.png[link=https://gitlab.com]'
- output = "<div>\n<p><span><a href=\"https://gitlab.com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"image\" class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
+ output = "<div>\n<p><span><a href=\"https://gitlab.com\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"image\" decoding=\"async\" class=\"lazy\" data-src=\"https://localhost.com/image.png\"></a></span></p>\n</div>"
expect(render(input, context)).to include(output)
end
end
@@ -524,7 +524,7 @@ module Gitlab
output = <<~HTML
<div>
<div>
- <a class="no-attachment-icon" href="https://kroki.io/graphviz/svg/eNpLyUwvSizIUHBXqOZSUPBIzcnJ17ULzy_KSeGqBQCEzQka" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Diagram" class="lazy" data-src="https://kroki.io/graphviz/svg/eNpLyUwvSizIUHBXqOZSUPBIzcnJ17ULzy_KSeGqBQCEzQka"></a>
+ <a class="no-attachment-icon" href="https://kroki.io/graphviz/svg/eNpLyUwvSizIUHBXqOZSUPBIzcnJ17ULzy_KSeGqBQCEzQka" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Diagram" decoding="async" class="lazy" data-src="https://kroki.io/graphviz/svg/eNpLyUwvSizIUHBXqOZSUPBIzcnJ17ULzy_KSeGqBQCEzQka"></a>
</div>
</div>
HTML
@@ -578,7 +578,7 @@ module Gitlab
output = <<~HTML
<div>
<div>
- <a class=\"no-attachment-icon\" href=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Diagram\" class=\"lazy\" data-src=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\"></a>
+ <a class=\"no-attachment-icon\" href=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Diagram\" decoding=\"async\" class=\"lazy\" data-src=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\"></a>
</div>
</div>
HTML
@@ -625,7 +625,7 @@ module Gitlab
output = <<~HTML
<div>
<div>
- <a class="no-attachment-icon" href="https://kroki.io/blockdiag/svg/eNpdzDEKQjEQhOHeU4zpPYFoYesRxGJ9bwghMSsbUYJ4d10UCZbDfPynolOek0Q8FsDeNCestoisNLmy-Qg7R3Blcm5hPcr0ITdaB6X15fv-_YdJixo2CNHI2lmK3sPRA__RwV5SzV80ZAegJjXSyfMFptc71w==" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Diagram" class="lazy" data-src="https://kroki.io/blockdiag/svg/eNpdzDEKQjEQhOHeU4zpPYFoYesRxGJ9bwghMSsbUYJ4d10UCZbDfPynolOek0Q8FsDeNCestoisNLmy-Qg7R3Blcm5hPcr0ITdaB6X15fv-_YdJixo2CNHI2lmK3sPRA__RwV5SzV80ZAegJjXSyfMFptc71w=="></a>
+ <a class="no-attachment-icon" href="https://kroki.io/blockdiag/svg/eNpdzDEKQjEQhOHeU4zpPYFoYesRxGJ9bwghMSsbUYJ4d10UCZbDfPynolOek0Q8FsDeNCestoisNLmy-Qg7R3Blcm5hPcr0ITdaB6X15fv-_YdJixo2CNHI2lmK3sPRA__RwV5SzV80ZAegJjXSyfMFptc71w==" target="_blank" rel="noopener noreferrer"><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="Diagram" decoding="async" class="lazy" data-src="https://kroki.io/blockdiag/svg/eNpdzDEKQjEQhOHeU4zpPYFoYesRxGJ9bwghMSsbUYJ4d10UCZbDfPynolOek0Q8FsDeNCestoisNLmy-Qg7R3Blcm5hPcr0ITdaB6X15fv-_YdJixo2CNHI2lmK3sPRA__RwV5SzV80ZAegJjXSyfMFptc71w=="></a>
</div>
</div>
HTML
diff --git a/spec/lib/gitlab/audit/deploy_token_author_spec.rb b/spec/lib/gitlab/audit/deploy_token_author_spec.rb
new file mode 100644
index 00000000000..449b7456a80
--- /dev/null
+++ b/spec/lib/gitlab/audit/deploy_token_author_spec.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Audit::DeployTokenAuthor do
+ describe '#initialize' do
+ it 'sets correct attributes' do
+ expect(described_class.new(name: 'Lorem deploy token'))
+ .to have_attributes(id: -2, name: 'Lorem deploy token')
+ end
+
+ it 'sets default name when it is not provided' do
+ expect(described_class.new)
+ .to have_attributes(id: -2, name: 'Deploy Token')
+ end
+ end
+end
diff --git a/spec/lib/gitlab/audit/null_author_spec.rb b/spec/lib/gitlab/audit/null_author_spec.rb
index 7203a0cd816..2045139a5f7 100644
--- a/spec/lib/gitlab/audit/null_author_spec.rb
+++ b/spec/lib/gitlab/audit/null_author_spec.rb
@@ -48,6 +48,15 @@ RSpec.describe Gitlab::Audit::NullAuthor do
expect(subject.for(-1, audit_event)).to be_a(Gitlab::Audit::CiRunnerTokenAuthor)
expect(subject.for(-1, audit_event)).to have_attributes(id: -1, name: 'Authentication token: cde456')
end
+
+ it 'returns DeployTokenAuthor when id equals -2', :aggregate_failures do
+ allow(audit_event).to receive(:[]).with(:author_name).and_return('Test deploy token')
+ allow(audit_event).to receive(:details).and_return({})
+ allow(audit_event).to receive(:target_type)
+
+ expect(subject.for(-2, audit_event)).to be_a(Gitlab::Audit::DeployTokenAuthor)
+ expect(subject.for(-2, audit_event)).to have_attributes(id: -2, name: 'Test deploy token')
+ end
end
describe '#current_sign_in_ip' do
diff --git a/spec/lib/gitlab/auth/ldap/adapter_spec.rb b/spec/lib/gitlab/auth/ldap/adapter_spec.rb
index b7b12e49a8e..3791b7a07dd 100644
--- a/spec/lib/gitlab/auth/ldap/adapter_spec.rb
+++ b/spec/lib/gitlab/auth/ldap/adapter_spec.rb
@@ -26,10 +26,12 @@ RSpec.describe Gitlab::Auth::Ldap::Adapter do
it 'searches with the proper options when searching by dn' do
expect(adapter).to receive(:ldap_search).with(
- base: 'uid=johndoe,ou=users,dc=example,dc=com',
- scope: Net::LDAP::SearchScope_BaseObject,
- attributes: ldap_attributes,
- filter: nil
+ {
+ base: 'uid=johndoe,ou=users,dc=example,dc=com',
+ scope: Net::LDAP::SearchScope_BaseObject,
+ attributes: ldap_attributes,
+ filter: nil
+ }
).and_return({})
adapter.users('dn', 'uid=johndoe,ou=users,dc=example,dc=com')
diff --git a/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb b/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb
new file mode 100644
index 00000000000..f08c787382e
--- /dev/null
+++ b/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp do
+ let_it_be(:user) { create(:user) }
+
+ let(:otp_code) { 42 }
+
+ let(:host) { 'forti_authenticator.example.com' }
+ let(:port) { '444' }
+ let(:api_username) { 'janedoe' }
+ let(:api_token) { 's3cr3t' }
+
+ let(:forti_authenticator_auth_url) { "https://#{host}:#{port}/api/v1/auth/" }
+ let(:response_status) { 200 }
+
+ subject(:validate) { described_class.new(user).validate(otp_code) }
+
+ before do
+ stub_feature_flags(forti_authenticator: user)
+
+ stub_forti_authenticator_config(
+ enabled: true,
+ host: host,
+ port: port,
+ username: api_username,
+ access_token: api_token
+ )
+
+ request_body = { username: user.username,
+ token_code: otp_code }
+
+ stub_request(:post, forti_authenticator_auth_url)
+ .with(body: JSON(request_body),
+ headers: { 'Content-Type': 'application/json' },
+ basic_auth: [api_username, api_token])
+ .to_return(status: response_status, body: '')
+ end
+
+ context 'successful validation' do
+ it 'returns success' do
+ expect(validate[:status]).to eq(:success)
+ end
+ end
+
+ context 'unsuccessful validation' do
+ let(:response_status) { 401 }
+
+ it 'returns error' do
+ expect(validate[:status]).to eq(:error)
+ end
+ end
+
+ context 'unexpected error' do
+ it 'returns error' do
+ error_message = 'boom!'
+ stub_request(:post, forti_authenticator_auth_url).to_raise(StandardError.new(error_message))
+
+ expect(validate[:status]).to eq(:error)
+ expect(validate[:message]).to eq(error_message)
+ end
+ end
+
+ def stub_forti_authenticator_config(forti_authenticator_settings)
+ allow(::Gitlab.config.forti_authenticator).to(receive_messages(forti_authenticator_settings))
+ end
+end
diff --git a/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb b/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb
new file mode 100644
index 00000000000..231bd3f48f1
--- /dev/null
+++ b/spec/lib/gitlab/auth/otp/strategies/forti_authenticator/push_otp_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Auth::Otp::Strategies::FortiAuthenticator::PushOtp do
+ let_it_be(:user) { create(:user) }
+
+ let(:host) { 'forti_authenticator.example.com' }
+ let(:port) { '444' }
+ let(:api_username) { 'janedoe' }
+ let(:api_token) { 's3cr3t' }
+
+ let(:forti_authenticator_auth_url) { "https://#{host}:#{port}/api/v1/pushauth/" }
+ let(:response_status) { 200 }
+
+ subject(:validate) { described_class.new(user).validate }
+
+ before do
+ stub_feature_flags(forti_authenticator: user)
+
+ stub_forti_authenticator_config(
+ enabled: true,
+ host: host,
+ port: port,
+ username: api_username,
+ access_token: api_token
+ )
+
+ request_body = { username: user.username }
+
+ stub_request(:post, forti_authenticator_auth_url)
+ .with(body: JSON(request_body),
+ headers: { 'Content-Type': 'application/json' },
+ basic_auth: [api_username, api_token])
+ .to_return(status: response_status, body: '')
+ end
+
+ context 'successful validation' do
+ it 'returns success' do
+ expect(validate[:status]).to eq(:success)
+ end
+ end
+
+ context 'unsuccessful validation' do
+ let(:response_status) { 401 }
+
+ it 'returns error' do
+ expect(validate[:status]).to eq(:error)
+ end
+ end
+
+ context 'unexpected error' do
+ it 'returns error' do
+ error_message = 'boom!'
+ stub_request(:post, forti_authenticator_auth_url).to_raise(StandardError.new(error_message))
+
+ expect(validate[:status]).to eq(:error)
+ expect(validate[:message]).to eq(error_message)
+ end
+ end
+
+ def stub_forti_authenticator_config(forti_authenticator_settings)
+ allow(::Gitlab.config.forti_authenticator).to(receive_messages(forti_authenticator_settings))
+ end
+end
diff --git a/spec/lib/gitlab/auth/otp/strategies/forti_authenticator_spec.rb b/spec/lib/gitlab/auth/otp/strategies/forti_authenticator_spec.rb
deleted file mode 100644
index dc20df98185..00000000000
--- a/spec/lib/gitlab/auth/otp/strategies/forti_authenticator_spec.rb
+++ /dev/null
@@ -1,68 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Auth::Otp::Strategies::FortiAuthenticator do
- let_it_be(:user) { create(:user) }
-
- let(:otp_code) { 42 }
-
- let(:host) { 'forti_authenticator.example.com' }
- let(:port) { '444' }
- let(:api_username) { 'janedoe' }
- let(:api_token) { 's3cr3t' }
-
- let(:forti_authenticator_auth_url) { "https://#{host}:#{port}/api/v1/auth/" }
- let(:response_status) { 200 }
-
- subject(:validate) { described_class.new(user).validate(otp_code) }
-
- before do
- stub_feature_flags(forti_authenticator: user)
-
- stub_forti_authenticator_config(
- enabled: true,
- host: host,
- port: port,
- username: api_username,
- access_token: api_token
- )
-
- request_body = { username: user.username,
- token_code: otp_code }
-
- stub_request(:post, forti_authenticator_auth_url)
- .with(body: JSON(request_body),
- headers: { 'Content-Type': 'application/json' },
- basic_auth: [api_username, api_token])
- .to_return(status: response_status, body: '')
- end
-
- context 'successful validation' do
- it 'returns success' do
- expect(validate[:status]).to eq(:success)
- end
- end
-
- context 'unsuccessful validation' do
- let(:response_status) { 401 }
-
- it 'returns error' do
- expect(validate[:status]).to eq(:error)
- end
- end
-
- context 'unexpected error' do
- it 'returns error' do
- error_message = 'boom!'
- stub_request(:post, forti_authenticator_auth_url).to_raise(StandardError.new(error_message))
-
- expect(validate[:status]).to eq(:error)
- expect(validate[:message]).to eq(error_message)
- end
- end
-
- def stub_forti_authenticator_config(forti_authenticator_settings)
- allow(::Gitlab.config.forti_authenticator).to(receive_messages(forti_authenticator_settings))
- end
-end
diff --git a/spec/lib/gitlab/auth/saml/config_spec.rb b/spec/lib/gitlab/auth/saml/config_spec.rb
new file mode 100644
index 00000000000..12f5da48873
--- /dev/null
+++ b/spec/lib/gitlab/auth/saml/config_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Auth::Saml::Config do
+ describe '.enabled?' do
+ subject { described_class.enabled? }
+
+ it { is_expected.to eq(false) }
+
+ context 'when SAML is enabled' do
+ before do
+ allow(Gitlab::Auth::OAuth::Provider).to receive(:providers).and_return([:saml])
+ end
+
+ it { is_expected.to eq(true) }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_artifact_expiry_date_spec.rb b/spec/lib/gitlab/background_migration/backfill_artifact_expiry_date_spec.rb
deleted file mode 100644
index f5d2224747a..00000000000
--- a/spec/lib/gitlab/background_migration/backfill_artifact_expiry_date_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::BackfillArtifactExpiryDate, :migration, schema: 20210301200959 do
- subject(:perform) { migration.perform(1, 99) }
-
- let(:migration) { described_class.new }
- let(:artifact_outside_id_range) { create_artifact!(id: 100, created_at: 1.year.ago, expire_at: nil) }
- let(:artifact_outside_date_range) { create_artifact!(id: 40, created_at: Time.current, expire_at: nil) }
- let(:old_artifact) { create_artifact!(id: 10, created_at: 16.months.ago, expire_at: nil) }
- let(:recent_artifact) { create_artifact!(id: 20, created_at: 1.year.ago, expire_at: nil) }
- let(:artifact_with_expiry) { create_artifact!(id: 30, created_at: 1.year.ago, expire_at: Time.current + 1.day) }
-
- before do
- table(:namespaces).create!(id: 1, name: 'the-namespace', path: 'the-path')
- table(:projects).create!(id: 1, name: 'the-project', namespace_id: 1)
- table(:ci_builds).create!(id: 1, allow_failure: false)
- end
-
- context 'when current date is before the 22nd' do
- before do
- travel_to(Time.zone.local(2020, 1, 1, 0, 0, 0))
- end
-
- it 'backfills the expiry date for old artifacts' do
- expect(old_artifact.reload.expire_at).to eq(nil)
-
- perform
-
- expect(old_artifact.reload.expire_at).to be_within(1.minute).of(Time.zone.local(2020, 4, 22, 0, 0, 0))
- end
-
- it 'backfills the expiry date for recent artifacts' do
- expect(recent_artifact.reload.expire_at).to eq(nil)
-
- perform
-
- expect(recent_artifact.reload.expire_at).to be_within(1.minute).of(Time.zone.local(2021, 1, 22, 0, 0, 0))
- end
- end
-
- context 'when current date is after the 22nd' do
- before do
- travel_to(Time.zone.local(2020, 1, 23, 0, 0, 0))
- end
-
- it 'backfills the expiry date for old artifacts' do
- expect(old_artifact.reload.expire_at).to eq(nil)
-
- perform
-
- expect(old_artifact.reload.expire_at).to be_within(1.minute).of(Time.zone.local(2020, 5, 22, 0, 0, 0))
- end
-
- it 'backfills the expiry date for recent artifacts' do
- expect(recent_artifact.reload.expire_at).to eq(nil)
-
- perform
-
- expect(recent_artifact.reload.expire_at).to be_within(1.minute).of(Time.zone.local(2021, 2, 22, 0, 0, 0))
- end
- end
-
- it 'does not touch artifacts with expiry date' do
- expect { perform }.not_to change { artifact_with_expiry.reload.expire_at }
- end
-
- it 'does not touch artifacts outside id range' do
- expect { perform }.not_to change { artifact_outside_id_range.reload.expire_at }
- end
-
- it 'does not touch artifacts outside date range' do
- expect { perform }.not_to change { artifact_outside_date_range.reload.expire_at }
- end
-
- private
-
- def create_artifact!(**args)
- table(:ci_job_artifacts).create!(**args, project_id: 1, job_id: 1, file_type: 1)
- end
-end
diff --git a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
index 1158eedfe7c..84611c88806 100644
--- a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequests,
end
end
- it "updates all open draft merge request's draft field to true" do
+ it "updates all eligible draft merge request's draft field to true" do
mr_count = merge_requests.all.count
expect { subject.perform(mr_ids.first, mr_ids.last) }
diff --git a/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb
new file mode 100644
index 00000000000..e6e10977143
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillDraftStatusOnMergeRequestsWithCorrectedRegex,
+ :migration, schema: 20220326161803 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:merge_requests) { table(:merge_requests) }
+
+ let(:group) { namespaces.create!(name: 'gitlab', path: 'gitlab') }
+ let(:project) { projects.create!(namespace_id: group.id) }
+
+ let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
+
+ def create_merge_request(params)
+ common_params = {
+ target_project_id: project.id,
+ target_branch: 'feature1',
+ source_branch: 'master'
+ }
+
+ merge_requests.create!(common_params.merge(params))
+ end
+
+ context "for MRs with #draft? == true titles but draft attribute false" do
+ let(:mr_ids) { merge_requests.all.collect(&:id) }
+
+ before do
+ draft_prefixes.each do |prefix|
+ (1..4).each do |n|
+ create_merge_request(
+ title: "#{prefix} This is a title",
+ draft: false,
+ state_id: n
+ )
+
+ create_merge_request(
+ title: "This is a title with the #{prefix} in a weird spot",
+ draft: false,
+ state_id: n
+ )
+ end
+ end
+ end
+
+ it "updates all eligible draft merge request's draft field to true" do
+ mr_count = merge_requests.all.count
+
+ expect { subject.perform(mr_ids.first, mr_ids.last) }
+ .to change { MergeRequest.where(draft: false).count }
+ .from(mr_count).to(mr_count - draft_prefixes.length)
+ end
+
+ it "marks successful slices as completed" do
+ expect(subject).to receive(:mark_job_as_succeeded).with(mr_ids.first, mr_ids.last)
+
+ subject.perform(mr_ids.first, mr_ids.last)
+ end
+
+ it_behaves_like 'marks background migration job records' do
+ let!(:non_eligible_mrs) do
+ Array.new(2) do
+ create_merge_request(
+ title: "Not a d-r-a-f-t 1",
+ draft: false,
+ state_id: 1
+ )
+ end
+ end
+
+ let(:arguments) { [non_eligible_mrs.first.id, non_eligible_mrs.last.id] }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb b/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb
index 4705f0d0ab9..d84bc479554 100644
--- a/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_group_features_spec.rb
@@ -6,7 +6,15 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillGroupFeatures, :migration, s
let(:group_features) { table(:group_features) }
let(:namespaces) { table(:namespaces) }
- subject { described_class.new(connection: ActiveRecord::Base.connection) }
+ subject do
+ described_class.new(start_id: 1,
+ end_id: 4,
+ batch_table: :namespaces,
+ batch_column: :id,
+ sub_batch_size: 10,
+ pause_ms: 0,
+ connection: ActiveRecord::Base.connection)
+ end
describe '#perform' do
it 'creates settings for all group namespaces in range' do
@@ -19,7 +27,7 @@ RSpec.describe Gitlab::BackgroundMigration::BackfillGroupFeatures, :migration, s
group_features.create!(id: 1, group_id: 4)
expect(group_features.count).to eq 1
- expect { subject.perform(1, 4, :namespaces, :id, 10, 0, 4) }.to change { group_features.count }.by(2)
+ expect { subject.perform(4) }.to change { group_features.count }.by(2)
expect(group_features.count).to eq 3
expect(group_features.all.pluck(:group_id)).to contain_exactly(1, 3, 4)
diff --git a/spec/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification_spec.rb b/spec/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification_spec.rb
new file mode 100644
index 00000000000..b3825a7c4ea
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_integrations_enable_ssl_verification_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillIntegrationsEnableSslVerification, schema: 20220425121410 do
+ let(:migration) { described_class.new }
+ let(:integrations) { described_class::Integration }
+
+ before do
+ integrations.create!(id: 1, type_new: 'Integrations::Bamboo') # unaffected integration
+ integrations.create!(id: 2, type_new: 'Integrations::DroneCi') # no properties
+ integrations.create!(id: 3, type_new: 'Integrations::DroneCi',
+ properties: {}) # no URL
+ integrations.create!(id: 4, type_new: 'Integrations::DroneCi',
+ properties: { 'drone_url' => '' }) # blank URL
+ integrations.create!(id: 5, type_new: 'Integrations::DroneCi',
+ properties: { 'drone_url' => 'https://example.com:foo' }) # invalid URL
+ integrations.create!(id: 6, type_new: 'Integrations::DroneCi',
+ properties: { 'drone_url' => 'https://example.com' }) # unknown URL
+ integrations.create!(id: 7, type_new: 'Integrations::DroneCi',
+ properties: { 'drone_url' => 'http://cloud.drone.io' }) # no HTTPS
+ integrations.create!(id: 8, type_new: 'Integrations::DroneCi',
+ properties: { 'drone_url' => 'https://cloud.drone.io' }) # known URL
+ integrations.create!(id: 9, type_new: 'Integrations::Teamcity',
+ properties: { 'teamcity_url' => 'https://example.com' }) # unknown URL
+ integrations.create!(id: 10, type_new: 'Integrations::Teamcity',
+ properties: { 'teamcity_url' => 'https://foo.bar.teamcity.com' }) # unknown URL
+ integrations.create!(id: 11, type_new: 'Integrations::Teamcity',
+ properties: { 'teamcity_url' => 'https://teamcity.com' }) # unknown URL
+ integrations.create!(id: 12, type_new: 'Integrations::Teamcity',
+ properties: { 'teamcity_url' => 'https://customer.teamcity.com' }) # known URL
+ end
+
+ def properties(id)
+ integrations.find(id).properties
+ end
+
+ it 'enables SSL verification for known-good hostnames', :aggregate_failures do
+ migration.perform(1, 12)
+
+ # Bamboo
+ expect(properties(1)).to be_nil
+
+ # DroneCi
+ expect(properties(2)).to be_nil
+ expect(properties(3)).not_to include('enable_ssl_verification')
+ expect(properties(4)).not_to include('enable_ssl_verification')
+ expect(properties(5)).not_to include('enable_ssl_verification')
+ expect(properties(6)).not_to include('enable_ssl_verification')
+ expect(properties(7)).not_to include('enable_ssl_verification')
+ expect(properties(8)).to include('enable_ssl_verification' => true)
+
+ # Teamcity
+ expect(properties(9)).not_to include('enable_ssl_verification')
+ expect(properties(10)).not_to include('enable_ssl_verification')
+ expect(properties(11)).not_to include('enable_ssl_verification')
+ expect(properties(12)).to include('enable_ssl_verification' => true)
+ end
+
+ it 'only updates records within the given ID range', :aggregate_failures do
+ migration.perform(1, 8)
+
+ expect(properties(8)).to include('enable_ssl_verification' => true)
+ expect(properties(12)).not_to include('enable_ssl_verification')
+ end
+
+ it 'marks the job as succeeded' do
+ expect(Gitlab::Database::BackgroundMigrationJob).to receive(:mark_all_as_succeeded)
+ .with('BackfillIntegrationsEnableSslVerification', [1, 10])
+
+ migration.perform(1, 10)
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb b/spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb
index 8f765a7a536..d8a7ec775dd 100644
--- a/spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb
@@ -2,10 +2,19 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::BackfillIntegrationsTypeNew do
+RSpec.describe Gitlab::BackgroundMigration::BackfillIntegrationsTypeNew, :migration, schema: 20220212120735 do
let(:migration) { described_class.new }
let(:integrations) { table(:integrations) }
- let(:namespaced_integrations) { Gitlab::Integrations::StiType.namespaced_integrations }
+
+ let(:namespaced_integrations) do
+ Set.new(%w[
+ Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
+ Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Harbor Irker Jenkins Jira Mattermost
+ MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
+ Prometheus Pushover Redmine Shimo Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
+ Github GitlabSlackApplication
+ ]).freeze
+ end
before do
integrations.connection.execute 'ALTER TABLE integrations DISABLE TRIGGER "trigger_type_new_on_insert"'
diff --git a/spec/lib/gitlab/background_migration/backfill_note_discussion_id_spec.rb b/spec/lib/gitlab/background_migration/backfill_note_discussion_id_spec.rb
new file mode 100644
index 00000000000..dcb4ede36af
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_note_discussion_id_spec.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillNoteDiscussionId do
+ let(:migration) { described_class.new }
+ let(:notes_table) { table(:notes) }
+ let(:existing_discussion_id) { Digest::SHA1.hexdigest('test') }
+
+ before do
+ notes_table.create!(id: 1, noteable_type: 'Issue', noteable_id: 2, discussion_id: existing_discussion_id)
+ notes_table.create!(id: 2, noteable_type: 'Issue', noteable_id: 1, discussion_id: nil)
+ notes_table.create!(id: 3, noteable_type: 'MergeRequest', noteable_id: 1, discussion_id: nil)
+ notes_table.create!(id: 4, noteable_type: 'Commit', commit_id: RepoHelpers.sample_commit.id, discussion_id: nil)
+ notes_table.create!(id: 5, noteable_type: 'Issue', noteable_id: 2, discussion_id: nil)
+ notes_table.create!(id: 6, noteable_type: 'MergeRequest', noteable_id: 2, discussion_id: nil)
+ end
+
+ it 'updates records in the specified batch', :aggregate_failures do
+ migration.perform(1, 5)
+
+ expect(notes_table.where(discussion_id: nil).count).to eq(1)
+
+ expect(notes_table.find(1).discussion_id).to eq(existing_discussion_id)
+ notes_table.where(id: 2..5).each do |n|
+ expect(n.discussion_id).to match(/\A[0-9a-f]{40}\z/)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb b/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb
new file mode 100644
index 00000000000..525c236b644
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillProjectSettings, :migration, schema: 20220324165436 do
+ let(:migration) { described_class.new }
+ let(:namespaces_table) { table(:namespaces) }
+ let(:projects_table) { table(:projects) }
+ let(:project_settings_table) { table(:project_settings) }
+
+ let(:table_name) { 'projects' }
+ let(:batch_column) { :id }
+ let(:sub_batch_size) { 2 }
+ let(:pause_ms) { 0 }
+
+ subject(:perform_migration) { migration.perform(1, 30, table_name, batch_column, sub_batch_size, pause_ms) }
+
+ before do
+ namespaces_table.create!(id: 1, name: 'namespace', path: 'namespace-path', type: 'Group')
+ projects_table.create!(id: 11, name: 'group-project-1', path: 'group-project-path-1', namespace_id: 1)
+ projects_table.create!(id: 12, name: 'group-project-2', path: 'group-project-path-2', namespace_id: 1)
+ project_settings_table.create!(project_id: 11)
+
+ namespaces_table.create!(id: 2, name: 'namespace', path: 'namespace-path', type: 'User')
+ projects_table.create!(id: 21, name: 'user-project-1', path: 'user--project-path-1', namespace_id: 2)
+ projects_table.create!(id: 22, name: 'user-project-2', path: 'user-project-path-2', namespace_id: 2)
+ project_settings_table.create!(project_id: 21)
+ end
+
+ it 'backfills project settings when it does not exist', :aggregate_failures do
+ expect(project_settings_table.count).to eq 2
+
+ queries = ActiveRecord::QueryRecorder.new do
+ perform_migration
+ end
+
+ expect(queries.count).to eq(5)
+
+ expect(project_settings_table.count).to eq 4
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb b/spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb
new file mode 100644
index 00000000000..3c46456eed0
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BackfillTopicsTitle, schema: 20220331133802 do
+ it 'correctly backfills the title of the topics' do
+ topics = table(:topics)
+
+ topic_1 = topics.create!(name: 'topic1')
+ topic_2 = topics.create!(name: 'topic2', title: 'Topic 2')
+ topic_3 = topics.create!(name: 'topic3')
+ topic_4 = topics.create!(name: 'topic4')
+
+ subject.perform(topic_1.id, topic_3.id)
+
+ expect(topic_1.reload.title).to eq('topic1')
+ expect(topic_2.reload.title).to eq('Topic 2')
+ expect(topic_3.reload.title).to eq('topic3')
+ expect(topic_4.reload.title).to be_nil
+ end
+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
new file mode 100644
index 00000000000..f8b3a8681f0
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/batched_migration_job_spec.rb
@@ -0,0 +1,96 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::BatchedMigrationJob do
+ describe '#perform' do
+ let(:connection) { Gitlab::Database.database_base_models[:main].connection }
+
+ let(:job_class) { Class.new(described_class) }
+
+ let(:job_instance) do
+ job_class.new(start_id: 1, end_id: 10,
+ batch_table: '_test_table',
+ batch_column: 'id',
+ sub_batch_size: 2,
+ pause_ms: 1000,
+ connection: connection)
+ end
+
+ subject(:perform_job) { job_instance.perform }
+
+ it 'raises an error if not overridden' do
+ expect { perform_job }.to raise_error(NotImplementedError, /must implement perform/)
+ end
+
+ context 'when the subclass uses sub-batching' do
+ let(:job_class) do
+ Class.new(described_class) do
+ def perform(*job_arguments)
+ each_sub_batch(
+ operation_name: :update,
+ batching_arguments: { order_hint: :updated_at },
+ batching_scope: -> (relation) { relation.where.not(bar: nil) }
+ ) do |sub_batch|
+ sub_batch.update_all('to_column = from_column')
+ end
+ end
+ end
+ end
+
+ let(:test_table) { table(:_test_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
+ t.text :bar
+ t.integer :to_column
+ end
+
+ test_table.create!(id: 1, from_column: 5, bar: 'value')
+ test_table.create!(id: 2, from_column: 10, bar: 'value')
+ test_table.create!(id: 3, from_column: 15)
+ test_table.create!(id: 4, from_column: 20, bar: 'value')
+ end
+
+ after do
+ connection.drop_table(:_test_table)
+ end
+
+ it 'calls the operation for each sub-batch' do
+ expect { perform_job }.to change { test_table.where(to_column: nil).count }.from(4).to(1)
+
+ expect(test_table.order(:id).pluck(:to_column)).to contain_exactly(5, 10, nil, 20)
+ end
+
+ it 'instruments the batch operation' do
+ expect(job_instance.batch_metrics.affected_rows).to be_empty
+
+ expect(job_instance.batch_metrics).to receive(:instrument_operation).with(:update).twice.and_call_original
+
+ perform_job
+
+ expect(job_instance.batch_metrics.affected_rows[:update]).to contain_exactly(2, 1)
+ end
+
+ it 'pauses after each sub-batch' do
+ expect(job_instance).to receive(:sleep).with(1.0).twice
+
+ perform_job
+ end
+
+ context 'when batching_arguments are given' do
+ it 'forwards them for batching' do
+ expect(job_instance).to receive(:parent_batch_relation).and_return(test_table)
+
+ expect(test_table).to receive(:each_batch).with(column: 'id', of: 2, order_hint: :updated_at)
+
+ perform_job
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb b/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
index 90d9bbb42c3..78bd1afd8d2 100644
--- a/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
+++ b/spec/lib/gitlab/background_migration/copy_column_using_background_migration_job_spec.rb
@@ -3,123 +3,134 @@
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob do
- let(:table_name) { :_test_copy_primary_key_test }
- let(:test_table) { table(table_name) }
- let(:sub_batch_size) { 1000 }
- let(:pause_ms) { 0 }
- let(:connection) { ApplicationRecord.connection }
-
- let(:helpers) do
- ActiveRecord::Migration.new.extend(Gitlab::Database::MigrationHelpers)
- end
-
- before do
- connection.execute(<<~SQL)
- CREATE TABLE #{table_name}
- (
- id integer NOT NULL,
- name character varying,
- fk integer NOT NULL,
- #{helpers.convert_to_bigint_column(:id)} bigint DEFAULT 0 NOT NULL,
- #{helpers.convert_to_bigint_column(:fk)} bigint DEFAULT 0 NOT NULL,
- name_convert_to_text text DEFAULT 'no name'
- );
- SQL
-
- # Insert some data, it doesn't make a difference
- test_table.create!(id: 11, name: 'test1', fk: 1)
- test_table.create!(id: 12, name: 'test2', fk: 2)
- test_table.create!(id: 15, name: nil, fk: 3)
- test_table.create!(id: 19, name: 'test4', fk: 4)
- end
+ it { expect(described_class).to be < Gitlab::BackgroundMigration::BatchedMigrationJob }
- after do
- # Make sure that the temp table we created is dropped (it is not removed by the database_cleaner)
- connection.execute(<<~SQL)
- DROP TABLE IF EXISTS #{table_name};
- SQL
- end
+ describe '#perform' do
+ let(:table_name) { :_test_copy_primary_key_test }
+ let(:test_table) { table(table_name) }
+ let(:sub_batch_size) { 1000 }
+ let(:pause_ms) { 0 }
+ let(:connection) { ApplicationRecord.connection }
+
+ let(:helpers) do
+ ActiveRecord::Migration.new.extend(Gitlab::Database::MigrationHelpers)
+ end
- subject(:copy_columns) { described_class.new(connection: connection) }
+ let(:copy_job) do
+ described_class.new(start_id: 12,
+ end_id: 20,
+ batch_table: table_name,
+ batch_column: 'id',
+ sub_batch_size: sub_batch_size,
+ pause_ms: pause_ms,
+ connection: connection)
+ end
- it { expect(described_class).to be < Gitlab::BackgroundMigration::BaseJob }
+ before do
+ connection.execute(<<~SQL)
+ CREATE TABLE #{table_name}
+ (
+ id integer NOT NULL,
+ name character varying,
+ fk integer NOT NULL,
+ #{helpers.convert_to_bigint_column(:id)} bigint DEFAULT 0 NOT NULL,
+ #{helpers.convert_to_bigint_column(:fk)} bigint DEFAULT 0 NOT NULL,
+ name_convert_to_text text DEFAULT 'no name'
+ );
+ SQL
+
+ # Insert some data, it doesn't make a difference
+ test_table.create!(id: 11, name: 'test1', fk: 1)
+ test_table.create!(id: 12, name: 'test2', fk: 2)
+ test_table.create!(id: 15, name: nil, fk: 3)
+ test_table.create!(id: 19, name: 'test4', fk: 4)
+ end
- describe '#perform' do
- let(:migration_class) { described_class.name }
+ after do
+ # Make sure that the temp table we created is dropped (it is not removed by the database_cleaner)
+ connection.execute(<<~SQL)
+ DROP TABLE IF EXISTS #{table_name};
+ SQL
+ end
it 'copies all primary keys in range' do
temporary_column = helpers.convert_to_bigint_column(:id)
- copy_columns.perform(12, 15, table_name, 'id', sub_batch_size, pause_ms, 'id', temporary_column)
- expect(test_table.where("id = #{temporary_column}").pluck(:id)).to contain_exactly(12, 15)
- expect(test_table.where(temporary_column => 0).pluck(:id)).to contain_exactly(11, 19)
- expect(test_table.all.count).to eq(4)
+ copy_job.perform('id', temporary_column)
+
+ expect(test_table.count).to eq(4)
+ expect(test_table.where("id = #{temporary_column}").pluck(:id)).to contain_exactly(12, 15, 19)
+ expect(test_table.where(temporary_column => 0).pluck(:id)).to contain_exactly(11)
end
it 'copies all foreign keys in range' do
temporary_column = helpers.convert_to_bigint_column(:fk)
- copy_columns.perform(10, 14, table_name, 'id', sub_batch_size, pause_ms, 'fk', temporary_column)
- expect(test_table.where("fk = #{temporary_column}").pluck(:id)).to contain_exactly(11, 12)
- expect(test_table.where(temporary_column => 0).pluck(:id)).to contain_exactly(15, 19)
- expect(test_table.all.count).to eq(4)
+ copy_job.perform('fk', temporary_column)
+
+ expect(test_table.count).to eq(4)
+ expect(test_table.where("fk = #{temporary_column}").pluck(:id)).to contain_exactly(12, 15, 19)
+ expect(test_table.where(temporary_column => 0).pluck(:id)).to contain_exactly(11)
end
it 'copies columns with NULLs' do
- expect(test_table.where("name_convert_to_text = 'no name'").count).to eq(4)
+ expect { copy_job.perform('name', 'name_convert_to_text') }
+ .to change { test_table.where("name_convert_to_text = 'no name'").count }.from(4).to(1)
- copy_columns.perform(10, 20, table_name, 'id', sub_batch_size, pause_ms, 'name', 'name_convert_to_text')
-
- expect(test_table.where('name = name_convert_to_text').pluck(:id)).to contain_exactly(11, 12, 19)
+ expect(test_table.where('name = name_convert_to_text').pluck(:id)).to contain_exactly(12, 19)
expect(test_table.where('name is NULL and name_convert_to_text is NULL').pluck(:id)).to contain_exactly(15)
- expect(test_table.where("name_convert_to_text = 'no name'").count).to eq(0)
end
- it 'copies multiple columns when given' do
- columns_to_copy_from = %w[id fk]
- id_tmp_column = helpers.convert_to_bigint_column('id')
- fk_tmp_column = helpers.convert_to_bigint_column('fk')
- columns_to_copy_to = [id_tmp_column, fk_tmp_column]
+ context 'when multiple columns are given' do
+ let(:id_tmp_column) { helpers.convert_to_bigint_column('id') }
+ let(:fk_tmp_column) { helpers.convert_to_bigint_column('fk') }
+ let(:columns_to_copy_from) { %w[id fk] }
+ let(:columns_to_copy_to) { [id_tmp_column, fk_tmp_column] }
- subject.perform(10, 15, table_name, 'id', sub_batch_size, pause_ms, columns_to_copy_from, columns_to_copy_to)
+ it 'copies all values in the range' do
+ copy_job.perform(columns_to_copy_from, columns_to_copy_to)
- expect(test_table.where("id = #{id_tmp_column} AND fk = #{fk_tmp_column}").pluck(:id)).to contain_exactly(11, 12, 15)
- expect(test_table.where(id_tmp_column => 0).where(fk_tmp_column => 0).pluck(:id)).to contain_exactly(19)
- expect(test_table.all.count).to eq(4)
- end
+ expect(test_table.count).to eq(4)
+ expect(test_table.where("id = #{id_tmp_column} AND fk = #{fk_tmp_column}").pluck(:id)).to contain_exactly(12, 15, 19)
+ expect(test_table.where(id_tmp_column => 0).where(fk_tmp_column => 0).pluck(:id)).to contain_exactly(11)
+ end
- it 'raises error when number of source and target columns does not match' do
- columns_to_copy_from = %w[id fk]
- columns_to_copy_to = [helpers.convert_to_bigint_column(:id)]
+ context 'when the number of source and target columns does not match' do
+ let(:columns_to_copy_to) { [id_tmp_column] }
- expect do
- subject.perform(10, 15, table_name, 'id', sub_batch_size, pause_ms, columns_to_copy_from, columns_to_copy_to)
- end.to raise_error(ArgumentError, 'number of source and destination columns must match')
+ it 'raises an error' do
+ expect do
+ copy_job.perform(columns_to_copy_from, columns_to_copy_to)
+ end.to raise_error(ArgumentError, 'number of source and destination columns must match')
+ end
+ end
end
it 'tracks timings of queries' do
- expect(copy_columns.batch_metrics.timings).to be_empty
+ expect(copy_job.batch_metrics.timings).to be_empty
- copy_columns.perform(10, 20, table_name, 'id', sub_batch_size, pause_ms, 'name', 'name_convert_to_text')
+ copy_job.perform('name', 'name_convert_to_text')
- expect(copy_columns.batch_metrics.timings[:update_all]).not_to be_empty
+ expect(copy_job.batch_metrics.timings[:update_all]).not_to be_empty
end
context 'pause interval between sub-batches' do
- it 'sleeps for the specified time between sub-batches' do
- sub_batch_size = 2
+ let(:pause_ms) { 5 }
- expect(copy_columns).to receive(:sleep).with(0.005)
+ it 'sleeps for the specified time between sub-batches' do
+ expect(copy_job).to receive(:sleep).with(0.005)
- copy_columns.perform(10, 12, table_name, 'id', sub_batch_size, 5, 'name', 'name_convert_to_text')
+ copy_job.perform('name', 'name_convert_to_text')
end
- it 'treats negative values as 0' do
- sub_batch_size = 2
+ context 'when pause_ms value is negative' do
+ let(:pause_ms) { -5 }
- expect(copy_columns).to receive(:sleep).with(0)
+ it 'treats it as a 0' do
+ expect(copy_job).to receive(:sleep).with(0)
- copy_columns.perform(10, 12, table_name, 'id', sub_batch_size, -5, 'name', 'name_convert_to_text')
+ copy_job.perform('name', 'name_convert_to_text')
+ end
end
end
end
diff --git a/spec/lib/gitlab/background_migration/expire_o_auth_tokens_spec.rb b/spec/lib/gitlab/background_migration/expire_o_auth_tokens_spec.rb
new file mode 100644
index 00000000000..cffcda0a2ca
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/expire_o_auth_tokens_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::ExpireOAuthTokens, :migration, schema: 20220428133724 do
+ let(:migration) { described_class.new }
+ let(:oauth_access_tokens_table) { table(:oauth_access_tokens) }
+
+ let(:table_name) { 'oauth_access_tokens' }
+
+ subject(:perform_migration) do
+ described_class.new(start_id: 1,
+ end_id: 30,
+ batch_table: :oauth_access_tokens,
+ batch_column: :id,
+ sub_batch_size: 2,
+ pause_ms: 0,
+ connection: ActiveRecord::Base.connection)
+ .perform
+ end
+
+ before do
+ oauth_access_tokens_table.create!(id: 1, token: 's3cr3t-1', expires_in: nil)
+ oauth_access_tokens_table.create!(id: 2, token: 's3cr3t-2', expires_in: 42)
+ oauth_access_tokens_table.create!(id: 3, token: 's3cr3t-3', expires_in: nil)
+ end
+
+ it 'adds expiry to oauth tokens', :aggregate_failures do
+ expect(ActiveRecord::QueryRecorder.new { perform_migration }.count).to eq(3)
+
+ expect(oauth_access_tokens_table.find(1).expires_in).to eq(7_200)
+ expect(oauth_access_tokens_table.find(2).expires_in).to eq(42)
+ expect(oauth_access_tokens_table.find(3).expires_in).to eq(7_200)
+ end
+end
diff --git a/spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb b/spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb
index a111007a984..65d55f85a98 100644
--- a/spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb
+++ b/spec/lib/gitlab/background_migration/extract_project_topics_into_separate_table_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Gitlab::BackgroundMigration::ExtractProjectTopicsIntoSeparateTabl
# Tagging records
expect { tagging_1.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_2.reload }.to raise_error(ActiveRecord::RecordNotFound)
- expect { other_tagging.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ expect { other_tagging.reload }.not_to raise_error
expect { tagging_3.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_4.reload }.to raise_error(ActiveRecord::RecordNotFound)
expect { tagging_5.reload }.to raise_error(ActiveRecord::RecordNotFound)
diff --git a/spec/lib/gitlab/background_migration/job_coordinator_spec.rb b/spec/lib/gitlab/background_migration/job_coordinator_spec.rb
index c1351481505..95847c67d94 100644
--- a/spec/lib/gitlab/background_migration/job_coordinator_spec.rb
+++ b/spec/lib/gitlab/background_migration/job_coordinator_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do
it 'raises an error' do
expect do
described_class.for_tracking_database('notvalid')
- end.to raise_error(ArgumentError, /tracking_database must be one of/)
+ end.to raise_error(ArgumentError, /must be one of/)
end
end
end
diff --git a/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb b/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
index 254b4fea698..2c2c048992f 100644
--- a/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
+++ b/spec/lib/gitlab/background_migration/merge_topics_with_same_name_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::BackgroundMigration::MergeTopicsWithSameName, schema: 20220223124428 do
+RSpec.describe Gitlab::BackgroundMigration::MergeTopicsWithSameName, schema: 20220331133802 do
def set_avatar(topic_id, avatar)
topic = ::Projects::Topic.find(topic_id)
topic.avatar = avatar
@@ -16,49 +16,62 @@ RSpec.describe Gitlab::BackgroundMigration::MergeTopicsWithSameName, schema: 202
topics = table(:topics)
project_topics = table(:project_topics)
- group = namespaces.create!(name: 'group', path: 'group')
- project_1 = projects.create!(namespace_id: group.id, visibility_level: 20)
- project_2 = projects.create!(namespace_id: group.id, visibility_level: 10)
- project_3 = projects.create!(namespace_id: group.id, visibility_level: 0)
+ group_1 = namespaces.create!(name: 'space1', type: 'Group', path: 'space1')
+ group_2 = namespaces.create!(name: 'space2', type: 'Group', path: 'space2')
+ group_3 = namespaces.create!(name: 'space3', type: 'Group', path: 'space3')
+ proj_space_1 = namespaces.create!(name: 'proj1', path: 'proj1', type: 'Project', parent_id: group_1.id)
+ proj_space_2 = namespaces.create!(name: 'proj2', path: 'proj2', type: 'Project', parent_id: group_2.id)
+ proj_space_3 = namespaces.create!(name: 'proj3', path: 'proj3', type: 'Project', parent_id: group_3.id)
+ project_1 = projects.create!(namespace_id: group_1.id, project_namespace_id: proj_space_1.id, visibility_level: 20)
+ project_2 = projects.create!(namespace_id: group_2.id, project_namespace_id: proj_space_2.id, visibility_level: 10)
+ project_3 = projects.create!(namespace_id: group_3.id, project_namespace_id: proj_space_3.id, visibility_level: 0)
topic_1_keep = topics.create!(
name: 'topic1',
+ title: 'Topic 1',
description: 'description 1 to keep',
total_projects_count: 2,
non_private_projects_count: 2
)
topic_1_remove = topics.create!(
name: 'TOPIC1',
+ title: 'Topic 1',
description: 'description 1 to remove',
total_projects_count: 2,
non_private_projects_count: 1
)
topic_2_remove = topics.create!(
name: 'topic2',
+ title: 'Topic 2',
total_projects_count: 0
)
topic_2_keep = topics.create!(
name: 'TOPIC2',
+ title: 'Topic 2',
description: 'description 2 to keep',
total_projects_count: 1
)
topic_3_remove_1 = topics.create!(
name: 'topic3',
+ title: 'Topic 3',
total_projects_count: 2,
non_private_projects_count: 1
)
topic_3_keep = topics.create!(
name: 'Topic3',
+ title: 'Topic 3',
total_projects_count: 2,
non_private_projects_count: 2
)
topic_3_remove_2 = topics.create!(
name: 'TOPIC3',
+ title: 'Topic 3',
description: 'description 3 to keep',
total_projects_count: 2,
non_private_projects_count: 1
)
topic_4_keep = topics.create!(
- name: 'topic4'
+ name: 'topic4',
+ title: 'Topic 4'
)
project_topics_1 = []
diff --git a/spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb b/spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb
index 90dd3e14606..e38edfc3643 100644
--- a/spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb
+++ b/spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb
@@ -5,9 +5,9 @@ require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::NullifyOrphanRunnerIdOnCiBuilds, :migration, schema: 20220223112304 do
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
- let(:ci_runners) { table(:ci_runners) }
- let(:ci_pipelines) { table(:ci_pipelines) }
- let(:ci_builds) { table(:ci_builds) }
+ let(:ci_runners) { table(:ci_runners, database: :ci) }
+ let(:ci_pipelines) { table(:ci_pipelines, database: :ci) }
+ let(:ci_builds) { table(:ci_builds, database: :ci) }
subject { described_class.new }
@@ -26,9 +26,9 @@ RSpec.describe Gitlab::BackgroundMigration::NullifyOrphanRunnerIdOnCiBuilds, :mi
describe '#perform' do
let(:namespace) { namespaces.create!(name: 'test', path: 'test', type: 'Group') }
let(:project) { projects.create!(namespace_id: namespace.id, name: 'test') }
- let(:pipeline) { ci_pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a', status: 'success') }
it 'nullifies runner_id for orphan ci_builds in range' do
+ pipeline = ci_pipelines.create!(project_id: project.id, ref: 'master', sha: 'adf43c3a', status: 'success')
ci_runners.create!(id: 2, runner_type: 'project_type')
ci_builds.create!(id: 5, type: 'Ci::Build', commit_id: pipeline.id, runner_id: 2)
diff --git a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
index d02f7245c15..71020746fa7 100644
--- a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
+++ b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_encrypted_values_on_projects_spec.rb
@@ -6,32 +6,47 @@ RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenEncrypte
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
- let(:perform) { described_class.new.perform(1, 4) }
+ subject(:background_migration) { described_class.new }
before do
namespaces.create!(id: 123, name: 'sample', path: 'sample')
projects.create!(id: 1, namespace_id: 123, runners_token_encrypted: 'duplicate')
projects.create!(id: 2, namespace_id: 123, runners_token_encrypted: 'a-runners-token')
- projects.create!(id: 3, namespace_id: 123, runners_token_encrypted: 'duplicate')
+ projects.create!(id: 3, namespace_id: 123, runners_token_encrypted: 'duplicate-2')
projects.create!(id: 4, namespace_id: 123, runners_token_encrypted: nil)
projects.create!(id: 5, namespace_id: 123, runners_token_encrypted: 'duplicate-2')
- projects.create!(id: 6, namespace_id: 123, runners_token_encrypted: 'duplicate-2')
+ projects.create!(id: 6, namespace_id: 123, runners_token_encrypted: 'duplicate')
+ projects.create!(id: 7, namespace_id: 123, runners_token_encrypted: 'another-runners-token')
+ projects.create!(id: 8, namespace_id: 123, runners_token_encrypted: 'another-runners-token')
end
describe '#up' do
- before do
- stub_const("#{described_class}::SUB_BATCH_SIZE", 2)
- end
-
it 'nullifies duplicate tokens', :aggregate_failures do
- perform
+ background_migration.perform(1, 2)
+ background_migration.perform(3, 4)
- expect(projects.count).to eq(6)
+ expect(projects.count).to eq(8)
expect(projects.all.pluck(:id, :runners_token_encrypted).to_h).to eq(
- { 1 => nil, 2 => 'a-runners-token', 3 => nil, 4 => nil, 5 => 'duplicate-2', 6 => 'duplicate-2' }
- )
- expect(projects.pluck(:runners_token_encrypted).uniq).to match_array [nil, 'a-runners-token', 'duplicate-2']
+ {
+ 1 => nil,
+ 2 => 'a-runners-token',
+ 3 => nil,
+ 4 => nil,
+ 5 => 'duplicate-2',
+ 6 => 'duplicate',
+ 7 => 'another-runners-token',
+ 8 => 'another-runners-token'
+ })
+ expect(projects.pluck(:runners_token_encrypted).uniq).to match_array [
+ nil, 'a-runners-token', 'duplicate', 'duplicate-2', 'another-runners-token'
+ ]
+ end
+
+ it 'does not touch projects outside id range' do
+ expect do
+ background_migration.perform(1, 2)
+ end.not_to change { projects.where(id: [3..8]).each(&:reload).map(&:updated_at) }
end
end
end
diff --git a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
index fd61047d851..7d3df69bee2 100644
--- a/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
+++ b/spec/lib/gitlab/background_migration/reset_duplicate_ci_runners_token_values_on_projects_spec.rb
@@ -6,32 +6,47 @@ RSpec.describe Gitlab::BackgroundMigration::ResetDuplicateCiRunnersTokenValuesOn
let(:namespaces) { table(:namespaces) }
let(:projects) { table(:projects) }
- let(:perform) { described_class.new.perform(1, 4) }
+ subject(:background_migration) { described_class.new }
before do
namespaces.create!(id: 123, name: 'sample', path: 'sample')
projects.create!(id: 1, namespace_id: 123, runners_token: 'duplicate')
projects.create!(id: 2, namespace_id: 123, runners_token: 'a-runners-token')
- projects.create!(id: 3, namespace_id: 123, runners_token: 'duplicate')
+ projects.create!(id: 3, namespace_id: 123, runners_token: 'duplicate-2')
projects.create!(id: 4, namespace_id: 123, runners_token: nil)
projects.create!(id: 5, namespace_id: 123, runners_token: 'duplicate-2')
- projects.create!(id: 6, namespace_id: 123, runners_token: 'duplicate-2')
+ projects.create!(id: 6, namespace_id: 123, runners_token: 'duplicate')
+ projects.create!(id: 7, namespace_id: 123, runners_token: 'another-runners-token')
+ projects.create!(id: 8, namespace_id: 123, runners_token: 'another-runners-token')
end
describe '#up' do
- before do
- stub_const("#{described_class}::SUB_BATCH_SIZE", 2)
- end
-
it 'nullifies duplicate tokens', :aggregate_failures do
- perform
+ background_migration.perform(1, 2)
+ background_migration.perform(3, 4)
- expect(projects.count).to eq(6)
+ expect(projects.count).to eq(8)
expect(projects.all.pluck(:id, :runners_token).to_h).to eq(
- { 1 => nil, 2 => 'a-runners-token', 3 => nil, 4 => nil, 5 => 'duplicate-2', 6 => 'duplicate-2' }
- )
- expect(projects.pluck(:runners_token).uniq).to match_array [nil, 'a-runners-token', 'duplicate-2']
+ {
+ 1 => nil,
+ 2 => 'a-runners-token',
+ 3 => nil,
+ 4 => nil,
+ 5 => 'duplicate-2',
+ 6 => 'duplicate',
+ 7 => 'another-runners-token',
+ 8 => 'another-runners-token'
+ })
+ expect(projects.pluck(:runners_token).uniq).to match_array [
+ nil, 'a-runners-token', 'duplicate', 'duplicate-2', 'another-runners-token'
+ ]
+ end
+
+ it 'does not touch projects outside id range' do
+ expect do
+ background_migration.perform(1, 2)
+ end.not_to change { projects.where(id: [3..8]).each(&:reload).map(&:updated_at) }
end
end
end
diff --git a/spec/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports_spec.rb b/spec/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports_spec.rb
new file mode 100644
index 00000000000..3f59b0a24a3
--- /dev/null
+++ b/spec/lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports_spec.rb
@@ -0,0 +1,85 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::BackgroundMigration::ResetTooManyTagsSkippedRegistryImports, :migration,
+ :aggregate_failures,
+ schema: 20220502173045 do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:container_repositories) { table(:container_repositories) }
+
+ subject(:background_migration) { described_class.new }
+
+ let!(:namespace) { namespaces.create!(id: 1, path: 'foo', name: 'foo') }
+ let!(:project) { projects.create!(id: 1, project_namespace_id: 1, namespace_id: 1, path: 'bar', name: 'bar') }
+
+ let!(:container_repository1) do
+ container_repositories.create!(id: 1,
+ project_id: 1,
+ name: 'a',
+ migration_state: 'import_skipped',
+ migration_skipped_at: Time.zone.now,
+ migration_skipped_reason: 2,
+ migration_pre_import_started_at: Time.zone.now,
+ migration_pre_import_done_at: Time.zone.now,
+ migration_import_started_at: Time.zone.now,
+ migration_import_done_at: Time.zone.now,
+ migration_aborted_at: Time.zone.now,
+ migration_retries_count: 2,
+ migration_aborted_in_state: 'importing')
+ end
+
+ let!(:container_repository2) do
+ container_repositories.create!(id: 2,
+ project_id: 1,
+ name: 'b',
+ migration_state: 'import_skipped',
+ migration_skipped_at: Time.zone.now,
+ migration_skipped_reason: 2)
+ end
+
+ let!(:container_repository3) do
+ container_repositories.create!(id: 3,
+ project_id: 1,
+ name: 'c',
+ migration_state: 'import_skipped',
+ migration_skipped_at: Time.zone.now,
+ migration_skipped_reason: 1)
+ end
+
+ # This is an unlikely state, but included here to test the edge case
+ let!(:container_repository4) do
+ container_repositories.create!(id: 4,
+ project_id: 1,
+ name: 'd',
+ migration_state: 'default',
+ migration_skipped_reason: 2)
+ end
+
+ describe '#up' do
+ it 'resets only qualified container repositories', :aggregate_failures do
+ background_migration.perform(1, 4)
+
+ expect(container_repository1.reload.migration_state).to eq('default')
+ expect(container_repository1.migration_skipped_reason).to eq(nil)
+ expect(container_repository1.migration_pre_import_started_at).to eq(nil)
+ expect(container_repository1.migration_pre_import_done_at).to eq(nil)
+ expect(container_repository1.migration_import_started_at).to eq(nil)
+ expect(container_repository1.migration_import_done_at).to eq(nil)
+ expect(container_repository1.migration_aborted_at).to eq(nil)
+ expect(container_repository1.migration_skipped_at).to eq(nil)
+ expect(container_repository1.migration_retries_count).to eq(0)
+ expect(container_repository1.migration_aborted_in_state).to eq(nil)
+
+ expect(container_repository2.reload.migration_state).to eq('default')
+ expect(container_repository2.migration_skipped_reason).to eq(nil)
+
+ expect(container_repository3.reload.migration_state).to eq('import_skipped')
+ expect(container_repository3.migration_skipped_reason).to eq(1)
+
+ expect(container_repository4.reload.migration_state).to eq('default')
+ expect(container_repository4.migration_skipped_reason).to eq(2)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/backtrace_cleaner_spec.rb b/spec/lib/gitlab/backtrace_cleaner_spec.rb
index e46a90e8606..cdde5a02d3b 100644
--- a/spec/lib/gitlab/backtrace_cleaner_spec.rb
+++ b/spec/lib/gitlab/backtrace_cleaner_spec.rb
@@ -25,7 +25,6 @@ RSpec.describe Gitlab::BacktraceCleaner do
"app/models/repository.rb:113:in `commit'",
"lib/gitlab/i18n.rb:50:in `with_locale'",
"lib/gitlab/middleware/multipart.rb:95:in `call'",
- "lib/gitlab/request_profiler/middleware.rb:14:in `call'",
"ee/lib/gitlab/database/load_balancing/rack_middleware.rb:37:in `call'",
"ee/lib/gitlab/jira/middleware.rb:15:in `call'"
]
diff --git a/spec/lib/gitlab/checks/branch_check_spec.rb b/spec/lib/gitlab/checks/branch_check_spec.rb
index c06d26d1441..d6280d3c28c 100644
--- a/spec/lib/gitlab/checks/branch_check_spec.rb
+++ b/spec/lib/gitlab/checks/branch_check_spec.rb
@@ -103,7 +103,7 @@ RSpec.describe Gitlab::Checks::BranchCheck do
it 'prevents force push' do
expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
- expect { subject.validate! }.to raise_error
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError)
end
end
end
@@ -126,7 +126,7 @@ RSpec.describe Gitlab::Checks::BranchCheck do
it 'prevents force push' do
expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
- expect { subject.validate! }.to raise_error
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError)
end
end
@@ -141,7 +141,7 @@ RSpec.describe Gitlab::Checks::BranchCheck do
it 'prevents force push' do
expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true)
- expect { subject.validate! }.to raise_error
+ expect { subject.validate! }.to raise_error(Gitlab::GitAccess::ForbiddenError)
end
end
end
diff --git a/spec/lib/gitlab/checks/changes_access_spec.rb b/spec/lib/gitlab/checks/changes_access_spec.rb
index 1cb4edd7337..41ec11c1055 100644
--- a/spec/lib/gitlab/checks/changes_access_spec.rb
+++ b/spec/lib/gitlab/checks/changes_access_spec.rb
@@ -49,10 +49,17 @@ RSpec.describe Gitlab::Checks::ChangesAccess do
context 'when changes contain empty revisions' do
let(:expected_commit) { instance_double(Commit) }
+ let(:expected_allow_quarantine) { allow_quarantine }
shared_examples 'returns only commits with non empty revisions' do
+ before do
+ stub_feature_flags(filter_quarantined_commits: filter_quarantined_commits)
+ end
+
specify do
- expect(project.repository).to receive(:new_commits).with([newrev], { allow_quarantine: allow_quarantine }) { [expected_commit] }
+ expect(project.repository)
+ .to receive(:new_commits)
+ .with([newrev], allow_quarantine: expected_allow_quarantine) { [expected_commit] }
expect(subject.commits).to match_array([expected_commit])
end
end
@@ -60,13 +67,37 @@ RSpec.describe Gitlab::Checks::ChangesAccess do
it_behaves_like 'returns only commits with non empty revisions' do
let(:changes) { [{ oldrev: oldrev, newrev: newrev }, { newrev: '' }, { newrev: Gitlab::Git::BLANK_SHA }] }
let(:allow_quarantine) { true }
+ let(:filter_quarantined_commits) { true }
end
context 'without oldrev' do
- it_behaves_like 'returns only commits with non empty revisions' do
- let(:changes) { [{ newrev: newrev }, { newrev: '' }, { newrev: Gitlab::Git::BLANK_SHA }] }
- # The quarantine directory should not be used because we're lacking oldrev.
+ let(:changes) { [{ newrev: newrev }, { newrev: '' }, { newrev: Gitlab::Git::BLANK_SHA }] }
+
+ context 'with disallowed quarantine' do
+ # The quarantine directory should not be used because we're lacking
+ # oldrev, and we're not filtering commits.
let(:allow_quarantine) { false }
+ let(:filter_quarantined_commits) { false }
+
+ it_behaves_like 'returns only commits with non empty revisions'
+ end
+
+ context 'with allowed quarantine and :filter_quarantined_commits disabled' do
+ # When we allow usage of the quarantine but have no oldrev and we're
+ # not filtering commits then results returned by the quarantine aren't
+ # accurate. We thus mustn't try using it.
+ let(:allow_quarantine) { true }
+ let(:filter_quarantined_commits) { false }
+ let(:expected_allow_quarantine) { false }
+
+ it_behaves_like 'returns only commits with non empty revisions'
+ end
+
+ context 'with allowed quarantine and :filter_quarantined_commits enabled' do
+ let(:allow_quarantine) { true }
+ let(:filter_quarantined_commits) { true }
+
+ it_behaves_like 'returns only commits with non empty revisions'
end
end
end
diff --git a/spec/lib/gitlab/checks/single_change_access_spec.rb b/spec/lib/gitlab/checks/single_change_access_spec.rb
index e81e4951539..1b34e58797e 100644
--- a/spec/lib/gitlab/checks/single_change_access_spec.rb
+++ b/spec/lib/gitlab/checks/single_change_access_spec.rb
@@ -96,13 +96,26 @@ RSpec.describe Gitlab::Checks::SingleChangeAccess do
let(:provided_commits) { nil }
before do
+ stub_feature_flags(filter_quarantined_commits: filter_quarantined_commits)
+
expect(project.repository)
.to receive(:new_commits)
+ .with(newrev, allow_quarantine: filter_quarantined_commits)
.once
.and_return(expected_commits)
end
- it_behaves_like '#commits'
+ context 'with :filter_quarantined_commits disabled' do
+ let(:filter_quarantined_commits) { false }
+
+ it_behaves_like '#commits'
+ end
+
+ context 'with :filter_quarantined_commits enabled' do
+ let(:filter_quarantined_commits) { true }
+
+ it_behaves_like '#commits'
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/ansi2json_spec.rb b/spec/lib/gitlab/ci/ansi2json_spec.rb
index c9c0d1a744e..f9d23ff97bc 100644
--- a/spec/lib/gitlab/ci/ansi2json_spec.rb
+++ b/spec/lib/gitlab/ci/ansi2json_spec.rb
@@ -27,6 +27,17 @@ RSpec.describe Gitlab::Ci::Ansi2json do
])
end
+ it 'ignores empty newlines' do
+ expect(convert_json("Hello\n\nworld")).to eq([
+ { offset: 0, content: [{ text: 'Hello' }] },
+ { offset: 7, content: [{ text: 'world' }] }
+ ])
+ expect(convert_json("Hello\r\n\r\nworld")).to eq([
+ { offset: 0, content: [{ text: 'Hello' }] },
+ { offset: 9, content: [{ text: 'world' }] }
+ ])
+ end
+
it 'replace the current line when encountering \r' do
expect(convert_json("Hello\rworld")).to eq([
{ offset: 0, content: [{ text: 'world' }] }
diff --git a/spec/lib/gitlab/ci/build/rules/rule/clause/if_spec.rb b/spec/lib/gitlab/ci/build/rules/rule/clause/if_spec.rb
new file mode 100644
index 00000000000..81bce989833
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/rules/rule/clause/if_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'support/helpers/stubbed_feature'
+require 'support/helpers/stub_feature_flags'
+
+RSpec.describe Gitlab::Ci::Build::Rules::Rule::Clause::If do
+ include StubFeatureFlags
+
+ subject(:if_clause) { described_class.new(expression) }
+
+ describe '#satisfied_by?' do
+ let(:context_class) { Gitlab::Ci::Build::Context::Base }
+ let(:rules_context) { instance_double(context_class, variables_hash: {}) }
+
+ subject(:satisfied_by?) { if_clause.satisfied_by?(nil, rules_context) }
+
+ context 'when expression is a basic string comparison' do
+ context 'when comparison is true' do
+ let(:expression) { '"value" == "value"' }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when comparison is false' do
+ let(:expression) { '"value" == "other"' }
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ context 'when expression is a regexp' do
+ context 'when comparison is true' do
+ let(:expression) { '"abcde" =~ /^ab.*/' }
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'when comparison is false' do
+ let(:expression) { '"abcde" =~ /^af.*/' }
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'when both side of the expression are variables' do
+ let(:expression) { '$teststring =~ $pattern' }
+
+ context 'when comparison is true' do
+ let(:rules_context) do
+ instance_double(context_class, variables_hash: { 'teststring' => 'abcde', 'pattern' => '/^ab.*/' })
+ end
+
+ it { is_expected.to eq(true) }
+
+ context 'when the FF ci_fix_rules_if_comparison_with_regexp_variable is disabled' do
+ before do
+ stub_feature_flags(ci_fix_rules_if_comparison_with_regexp_variable: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ context 'when comparison is false' do
+ let(:rules_context) do
+ instance_double(context_class, variables_hash: { 'teststring' => 'abcde', 'pattern' => '/^af.*/' })
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/build/rules_spec.rb b/spec/lib/gitlab/ci/build/rules_spec.rb
index 37bfdca4d1d..e82dcd0254d 100644
--- a/spec/lib/gitlab/ci/build/rules_spec.rb
+++ b/spec/lib/gitlab/ci/build/rules_spec.rb
@@ -188,6 +188,19 @@ RSpec.describe Gitlab::Ci::Build::Rules do
it { is_expected.to eq(described_class::Result.new('on_success', nil, nil, { MY_VAR: 'my var' })) }
end
end
+
+ context 'with a regexp variable matching rule' do
+ let(:rule_list) { [{ if: '"abcde" =~ $pattern' }] }
+
+ before do
+ allow(ci_build).to receive(:scoped_variables).and_return(
+ Gitlab::Ci::Variables::Collection.new
+ .append(key: 'pattern', value: '/^ab.*/', public: true)
+ )
+ end
+
+ it { is_expected.to eq(described_class::Result.new('on_success')) }
+ end
end
describe 'Gitlab::Ci::Build::Rules::Result' do
diff --git a/spec/lib/gitlab/ci/config/entry/environment_spec.rb b/spec/lib/gitlab/ci/config/entry/environment_spec.rb
index dd8a79f0d84..36c26c8ee4f 100644
--- a/spec/lib/gitlab/ci/config/entry/environment_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/environment_spec.rb
@@ -92,24 +92,18 @@ RSpec.describe Gitlab::Ci::Config::Entry::Environment do
end
context 'when valid action is used' do
- let(:config) do
- { name: 'production',
- action: 'start' }
- end
-
- it 'is valid' do
- expect(entry).to be_valid
+ where(:action) do
+ %w(start stop prepare verify access)
end
- end
- context 'when prepare action is used' do
- let(:config) do
- { name: 'production',
- action: 'prepare' }
- end
+ with_them do
+ let(:config) do
+ { name: 'production', action: action }
+ end
- it 'is valid' do
- expect(entry).to be_valid
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
end
end
@@ -148,7 +142,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Environment do
describe '#errors' do
it 'contains error about invalid action' do
expect(entry.errors)
- .to include 'environment action should be start, stop or prepare'
+ .to include 'environment action should be start, stop, prepare, verify, or access'
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/spec/lib/gitlab/ci/config/entry/job_spec.rb
index 97691504abd..ca336c3ecaa 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Job do
subject { described_class.nodes.keys }
let(:result) do
- %i[before_script script stage type after_script cache
+ %i[before_script script stage after_script cache
image services only except rules needs variables artifacts
environment coverage retry interruptible timeout release tags
inherit parallel]
diff --git a/spec/lib/gitlab/ci/config/entry/reports_spec.rb b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
index 061d8f34c8d..051cccb4833 100644
--- a/spec/lib/gitlab/ci/config/entry/reports_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
@@ -45,10 +45,8 @@ RSpec.describe Gitlab::Ci::Config::Entry::Reports do
:load_performance | 'load-performance.json'
:lsif | 'lsif.json'
:dotenv | 'build.dotenv'
- :cobertura | 'cobertura-coverage.xml'
:terraform | 'tfplan.json'
:accessibility | 'gl-accessibility.json'
- :cluster_applications | 'gl-cluster-applications.json'
end
with_them do
@@ -90,18 +88,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Reports do
expect(entry.value).to eq({ coverage_report: coverage_report, dast: ['gl-dast-report.json'] })
end
end
-
- context 'and a direct coverage report format is specified' do
- let(:config) { { coverage_report: coverage_report, cobertura: 'cobertura-coverage.xml' } }
-
- it 'is not valid' do
- expect(entry).not_to be_valid
- end
-
- it 'reports error' do
- expect(entry.errors).to include /please use only one the following keys: coverage_report, cobertura/
- end
- end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/root_spec.rb b/spec/lib/gitlab/ci/config/entry/root_spec.rb
index b9c32bc51be..55ad119ea21 100644
--- a/spec/lib/gitlab/ci/config/entry/root_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/root_spec.rb
@@ -21,7 +21,7 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
# The purpose of `Root` is have only globally defined configuration.
expect(described_class.nodes.keys)
.to match_array(%i[before_script image services after_script
- variables cache stages types include default workflow])
+ variables cache stages include default workflow])
end
end
end
@@ -55,41 +55,6 @@ RSpec.describe Gitlab::Ci::Config::Entry::Root do
}
end
- context 'when deprecated types/type keywords are defined' do
- let(:project) { create(:project, :repository) }
- let(:user) { create(:user) }
-
- let(:hash) do
- { types: %w(test deploy),
- rspec: { script: 'rspec', type: 'test' } }
- end
-
- before do
- root.compose!
- end
-
- it 'returns array of types as stages with a warning' do
- expect(root.jobs_value[:rspec][:stage]).to eq 'test'
- expect(root.stages_value).to eq %w[test deploy]
- expect(root.warnings).to match_array([
- "root `types` is deprecated in 9.0 and will be removed in 15.0.",
- "jobs:rspec `type` is deprecated in 9.0 and will be removed in 15.0."
- ])
- end
-
- it 'logs usage of keywords' do
- expect(Gitlab::AppJsonLogger).to(
- receive(:info)
- .with(event: 'ci_used_deprecated_keyword',
- entry: root[:stages].key.to_s,
- user_id: user.id,
- project_id: project.id)
- )
-
- root.compose!
- end
- end
-
describe '#compose!' do
before do
root.compose!
diff --git a/spec/lib/gitlab/ci/config/external/file/local_spec.rb b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
index c0a0b0009ce..0e78498c98e 100644
--- a/spec/lib/gitlab/ci/config/external/file/local_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/local_spec.rb
@@ -199,6 +199,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Local do
context_sha: '12345',
type: :local,
location: location,
+ blob: "http://localhost/#{project.full_path}/-/blob/12345/lib/gitlab/ci/templates/existent-file.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/12345/lib/gitlab/ci/templates/existent-file.yml",
extra: {}
)
}
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 5d3412a148b..77e542cf933 100644
--- a/spec/lib/gitlab/ci/config/external/file/project_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/project_spec.rb
@@ -207,6 +207,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
context_sha: '12345',
type: :file,
location: '/file.yml',
+ blob: "http://localhost/#{project.full_path}/-/blob/#{project.commit('master').id}/file.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/#{project.commit('master').id}/file.yml",
extra: { project: project.full_path, ref: 'HEAD' }
)
}
@@ -227,6 +229,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Project do
context_sha: '12345',
type: :file,
location: '/file.yml',
+ blob: nil,
+ raw: nil,
extra: { project: 'xxxxxxxxxxxxxxxxxxxxxxxx', ref: 'xxxxxxxxxxxxxxxxxxxxxxxx' }
)
}
diff --git a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
index 5c07c87fd5a..3e1c4df4e32 100644
--- a/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/remote_spec.rb
@@ -213,6 +213,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote do
context_sha: '12345',
type: :remote,
location: 'https://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.xxxxxxxxxxx.yml',
+ raw: 'https://gitlab.com/gitlab-org/gitlab-foss/blob/1234/.xxxxxxxxxxx.yml',
+ blob: nil,
extra: {}
)
}
diff --git a/spec/lib/gitlab/ci/config/external/file/template_spec.rb b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
index 4da9a933a9f..074e7a1d32d 100644
--- a/spec/lib/gitlab/ci/config/external/file/template_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/template_spec.rb
@@ -124,6 +124,8 @@ RSpec.describe Gitlab::Ci::Config::External::File::Template do
context_sha: '12345',
type: :template,
location: template,
+ raw: "https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/#{template}",
+ blob: nil,
extra: {}
)
}
diff --git a/spec/lib/gitlab/ci/config/external/processor_spec.rb b/spec/lib/gitlab/ci/config/external/processor_spec.rb
index 56cd006717e..15a0ff40aa4 100644
--- a/spec/lib/gitlab/ci/config/external/processor_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/processor_spec.rb
@@ -267,11 +267,41 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
perform
expect(context.includes).to contain_exactly(
- { type: :local, location: '/local/file.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
- { type: :template, location: 'Ruby.gitlab-ci.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
- { type: :remote, location: 'http://my.domain.com/config.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
- { type: :file, location: '/templates/my-workflow.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' },
- { type: :local, location: '/templates/my-build.yml', extra: {}, context_project: another_project.full_path, context_sha: another_project.commit.sha }
+ { type: :local,
+ location: '/local/file.yml',
+ blob: "http://localhost/#{project.full_path}/-/blob/12345/local/file.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/12345/local/file.yml",
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :template,
+ location: 'Ruby.gitlab-ci.yml',
+ blob: nil,
+ raw: 'https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml',
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :remote,
+ location: 'http://my.domain.com/config.yml',
+ blob: nil,
+ raw: "http://my.domain.com/config.yml",
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :file,
+ location: '/templates/my-workflow.yml',
+ blob: "http://localhost/#{another_project.full_path}/-/blob/#{another_project.commit.sha}/templates/my-workflow.yml",
+ raw: "http://localhost/#{another_project.full_path}/-/raw/#{another_project.commit.sha}/templates/my-workflow.yml",
+ extra: { project: another_project.full_path, ref: 'HEAD' },
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :local,
+ location: '/templates/my-build.yml',
+ blob: "http://localhost/#{another_project.full_path}/-/blob/#{another_project.commit.sha}/templates/my-build.yml",
+ raw: "http://localhost/#{another_project.full_path}/-/raw/#{another_project.commit.sha}/templates/my-build.yml",
+ extra: {},
+ context_project: another_project.full_path,
+ context_sha: another_project.commit.sha }
)
end
end
@@ -394,8 +424,20 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
perform
expect(context.includes).to contain_exactly(
- { type: :file, location: '/templates/my-build.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' },
- { type: :file, location: '/templates/my-test.yml', extra: { project: another_project.full_path, ref: 'HEAD' }, context_project: project.full_path, context_sha: '12345' }
+ { type: :file,
+ location: '/templates/my-build.yml',
+ blob: "http://localhost/#{another_project.full_path}/-/blob/#{another_project.commit.sha}/templates/my-build.yml",
+ raw: "http://localhost/#{another_project.full_path}/-/raw/#{another_project.commit.sha}/templates/my-build.yml",
+ extra: { project: another_project.full_path, ref: 'HEAD' },
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :file,
+ blob: "http://localhost/#{another_project.full_path}/-/blob/#{another_project.commit.sha}/templates/my-test.yml",
+ raw: "http://localhost/#{another_project.full_path}/-/raw/#{another_project.commit.sha}/templates/my-test.yml",
+ location: '/templates/my-test.yml',
+ extra: { project: another_project.full_path, ref: 'HEAD' },
+ context_project: project.full_path,
+ context_sha: '12345' }
)
end
end
@@ -438,8 +480,20 @@ RSpec.describe Gitlab::Ci::Config::External::Processor do
perform
expect(context.includes).to contain_exactly(
- { type: :local, location: 'myfolder/file1.yml', extra: {}, context_project: project.full_path, context_sha: '12345' },
- { type: :local, location: 'myfolder/file2.yml', extra: {}, context_project: project.full_path, context_sha: '12345' }
+ { type: :local,
+ location: 'myfolder/file1.yml',
+ blob: "http://localhost/#{project.full_path}/-/blob/12345/myfolder/file1.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/12345/myfolder/file1.yml",
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' },
+ { type: :local,
+ blob: "http://localhost/#{project.full_path}/-/blob/12345/myfolder/file2.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/12345/myfolder/file2.yml",
+ location: 'myfolder/file2.yml',
+ extra: {},
+ context_project: project.full_path,
+ context_sha: '12345' }
)
end
end
diff --git a/spec/lib/gitlab/ci/config_spec.rb b/spec/lib/gitlab/ci/config_spec.rb
index 3ba6a9059c6..5eb04d969eb 100644
--- a/spec/lib/gitlab/ci/config_spec.rb
+++ b/spec/lib/gitlab/ci/config_spec.rb
@@ -109,16 +109,22 @@ RSpec.describe Gitlab::Ci::Config do
expect(config.metadata[:includes]).to contain_exactly(
{ type: :template,
location: 'Jobs/Deploy.gitlab-ci.yml',
+ blob: nil,
+ raw: 'https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Jobs/Deploy.gitlab-ci.yml',
extra: {},
context_project: nil,
context_sha: nil },
{ type: :template,
location: 'Jobs/Build.gitlab-ci.yml',
+ blob: nil,
+ raw: 'https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml',
extra: {},
context_project: nil,
context_sha: nil },
{ type: :remote,
location: 'https://example.com/gitlab-ci.yml',
+ blob: nil,
+ raw: 'https://example.com/gitlab-ci.yml',
extra: {},
context_project: nil,
context_sha: nil }
@@ -428,16 +434,22 @@ RSpec.describe Gitlab::Ci::Config do
expect(config.metadata[:includes]).to contain_exactly(
{ type: :local,
location: local_location,
+ blob: "http://localhost/#{project.full_path}/-/blob/12345/#{local_location}",
+ raw: "http://localhost/#{project.full_path}/-/raw/12345/#{local_location}",
extra: {},
context_project: project.full_path,
context_sha: '12345' },
{ type: :remote,
location: remote_location,
+ blob: nil,
+ raw: remote_location,
extra: {},
context_project: project.full_path,
context_sha: '12345' },
{ type: :file,
location: '.gitlab-ci.yml',
+ blob: "http://localhost/#{main_project.full_path}/-/blob/#{main_project.commit.sha}/.gitlab-ci.yml",
+ raw: "http://localhost/#{main_project.full_path}/-/raw/#{main_project.commit.sha}/.gitlab-ci.yml",
extra: { project: main_project.full_path, ref: 'HEAD' },
context_project: project.full_path,
context_sha: '12345' }
diff --git a/spec/lib/gitlab/ci/lint_spec.rb b/spec/lib/gitlab/ci/lint_spec.rb
index 747ff13c840..7e0b2b5aa8e 100644
--- a/spec/lib/gitlab/ci/lint_spec.rb
+++ b/spec/lib/gitlab/ci/lint_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe Gitlab::Ci::Lint do
end
end
- shared_examples 'sets merged yaml' do
+ shared_examples 'sets config metadata' do
let(:content) do
<<~YAML
:include:
@@ -106,6 +106,20 @@ RSpec.describe Gitlab::Ci::Lint do
expect(subject.merged_yaml).to eq(expected_config.to_yaml)
end
+
+ it 'sets includes' do
+ expect(subject.includes).to contain_exactly(
+ {
+ type: :local,
+ location: 'another-gitlab-ci.yml',
+ blob: "http://localhost/#{project.full_path}/-/blob/#{project.commit.sha}/another-gitlab-ci.yml",
+ raw: "http://localhost/#{project.full_path}/-/raw/#{project.commit.sha}/another-gitlab-ci.yml",
+ extra: {},
+ context_project: project.full_path,
+ context_sha: project.commit.sha
+ }
+ )
+ end
end
shared_examples 'content with errors and warnings' do
@@ -220,7 +234,7 @@ RSpec.describe Gitlab::Ci::Lint do
end
end
- it_behaves_like 'sets merged yaml'
+ it_behaves_like 'sets config metadata'
include_context 'advanced validations' do
it 'does not catch advanced logical errors' do
@@ -275,7 +289,7 @@ RSpec.describe Gitlab::Ci::Lint do
end
end
- it_behaves_like 'sets merged yaml'
+ it_behaves_like 'sets config metadata'
include_context 'advanced validations' do
it 'runs advanced logical validations' do
diff --git a/spec/lib/gitlab/ci/parsers/security/common_spec.rb b/spec/lib/gitlab/ci/parsers/security/common_spec.rb
index dfc5dec1481..6495d1f654b 100644
--- a/spec/lib/gitlab/ci/parsers/security/common_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/security/common_spec.rb
@@ -292,7 +292,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Common do
expect(scans.map(&:status).all?('success')).to be(true)
expect(scans.map(&:start_time).all?('placeholder-value')).to be(true)
expect(scans.map(&:end_time).all?('placeholder-value')).to be(true)
- expect(scans.size).to eq(3)
+ expect(scans.size).to eq(7)
expect(scans.first).to be_a(::Gitlab::Ci::Reports::Security::Scan)
end
@@ -348,22 +348,29 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Common do
it 'returns links object for each finding', :aggregate_failures do
links = report.findings.flat_map(&:links)
- expect(links.map(&:url)).to match_array(['https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1020', 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1030'])
- expect(links.map(&:name)).to match_array([nil, 'CVE-1030'])
- expect(links.size).to eq(2)
+ expect(links.map(&:url)).to match_array(['https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1020', 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-1030',
+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2137", "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2138",
+ "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2139", "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2140"])
+ expect(links.map(&:name)).to match_array([nil, nil, nil, nil, nil, 'CVE-1030'])
+ expect(links.size).to eq(6)
expect(links.first).to be_a(::Gitlab::Ci::Reports::Security::Link)
end
end
describe 'parsing evidence' do
- it 'returns evidence object for each finding', :aggregate_failures do
- evidences = report.findings.map(&:evidence)
+ RSpec::Matchers.define_negated_matcher :have_values, :be_empty
- expect(evidences.first.data).not_to be_empty
- expect(evidences.first.data["summary"]).to match(/The Origin header was changed/)
- expect(evidences.size).to eq(3)
- expect(evidences.compact.size).to eq(2)
- expect(evidences.first).to be_a(::Gitlab::Ci::Reports::Security::Evidence)
+ it 'returns evidence object for each finding', :aggregate_failures do
+ all_evidences = report.findings.map(&:evidence)
+ evidences = all_evidences.compact
+ data = evidences.map(&:data)
+ summaries = evidences.map { |e| e.data["summary"] }
+
+ expect(all_evidences.size).to eq(7)
+ expect(evidences.size).to eq(2)
+ expect(evidences).to all( be_a(::Gitlab::Ci::Reports::Security::Evidence) )
+ expect(data).to all( have_values )
+ expect(summaries).to all( match(/The Origin header was changed/) )
end
end
diff --git a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
index f6409c8b01f..d06077d69b6 100644
--- a/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
+++ b/spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb
@@ -5,6 +5,8 @@ require 'spec_helper'
RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let_it_be(:project) { create(:project) }
+ let(:supported_dast_versions) { described_class::SUPPORTED_VERSIONS[:dast].join(', ') }
+
let(:scanner) do
{
'id' => 'gemnasium',
@@ -22,7 +24,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
expect(described_class::SUPPORTED_VERSIONS.keys).to eq(described_class::DEPRECATED_VERSIONS.keys)
end
- context 'files under schema path are explicitly listed' do
+ context 'when a schema JSON file exists for a particular report type version' do
# We only care about the part that comes before report-format.json
# https://rubular.com/r/N8Juz7r8hYDYgD
filename_regex = /(?<report_type>[-\w]*)\-report-format.json/
@@ -36,14 +38,14 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
matches = filename_regex.match(file)
report_type = matches[:report_type].tr("-", "_").to_sym
- it "#{report_type} #{version}" do
+ it "#{report_type} #{version} is in the constant" do
expect(described_class::SUPPORTED_VERSIONS[report_type]).to include(version)
end
end
end
end
- context 'every SUPPORTED_VERSION has a corresponding JSON file' do
+ context 'when every SUPPORTED_VERSION has a corresponding JSON file' do
described_class::SUPPORTED_VERSIONS.each_key do |report_type|
# api_fuzzing is covered by DAST schema
next if report_type == :api_fuzzing
@@ -66,7 +68,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -77,7 +79,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to be_truthy }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
@@ -104,9 +106,19 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
context 'when given a deprecated schema version' do
let(:report_type) { :dast }
+ let(:deprecations_hash) do
+ {
+ dast: %w[10.0.0]
+ }
+ end
+
let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
- context 'and the report passes schema validation' do
+ before do
+ stub_const("#{described_class}::DEPRECATED_VERSIONS", deprecations_hash)
+ end
+
+ context 'when the report passes schema validation' do
let(:report_data) do
{
'version' => '10.0.0',
@@ -131,8 +143,8 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
- context 'and the report does not pass schema validation' do
- context 'and enforce_security_report_validation is enabled' do
+ context 'when the report does not pass schema validation' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
@@ -146,7 +158,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to be_falsey }
end
- context 'and enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
@@ -166,12 +178,12 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { "12.37.0" }
- context 'if enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -196,14 +208,14 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- context 'and scanner information is empty' do
+ context 'when scanner information is empty' do
let(:scanner) { {} }
it 'logs related information' do
@@ -235,12 +247,12 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
- context 'if enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -251,7 +263,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to be_truthy }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
@@ -262,6 +274,30 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
end
+
+ context 'when not given a schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { nil }
+ let(:report_data) do
+ {
+ 'vulnerabilities' => []
+ }
+ end
+
+ before do
+ stub_feature_flags(enforce_security_report_validation: true)
+ end
+
+ it { is_expected.to be_falsey }
+
+ context 'when enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+ end
end
describe '#errors' do
@@ -271,7 +307,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -279,19 +315,17 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_errors) { [] }
-
- it { is_expected.to match_array(expected_errors) }
+ it { is_expected.to be_empty }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- context 'if enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: project)
end
@@ -305,23 +339,31 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to match_array(expected_errors) }
end
- context 'if enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
- let(:expected_errors) { [] }
-
- it { is_expected.to match_array(expected_errors) }
+ it { is_expected.to be_empty }
end
end
end
context 'when given a deprecated schema version' do
let(:report_type) { :dast }
+ let(:deprecations_hash) do
+ {
+ dast: %w[10.0.0]
+ }
+ end
+
let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
- context 'and the report passes schema validation' do
+ before do
+ stub_const("#{described_class}::DEPRECATED_VERSIONS", deprecations_hash)
+ end
+
+ context 'when the report passes schema validation' do
let(:report_data) do
{
'version' => '10.0.0',
@@ -329,13 +371,11 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_errors) { [] }
-
- it { is_expected.to match_array(expected_errors) }
+ it { is_expected.to be_empty }
end
- context 'and the report does not pass schema validation' do
- context 'and enforce_security_report_validation is enabled' do
+ context 'when the report does not pass schema validation' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
@@ -356,7 +396,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to match_array(expected_errors) }
end
- context 'and enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
@@ -367,9 +407,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_errors) { [] }
-
- it { is_expected.to match_array(expected_errors) }
+ it { is_expected.to be_empty }
end
end
end
@@ -378,12 +416,12 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { "12.37.0" }
- context 'if enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -393,14 +431,14 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:expected_errors) do
[
- "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: #{supported_dast_versions}"
]
end
it { is_expected.to match_array(expected_errors) }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
@@ -409,7 +447,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:expected_errors) do
[
- "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1",
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: #{supported_dast_versions}",
"root is missing required keys: vulnerabilities"
]
end
@@ -418,12 +456,12 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
- context 'if enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -431,22 +469,45 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_errors) { [] }
-
- it { is_expected.to match_array(expected_errors) }
+ it { is_expected.to be_empty }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- let(:expected_errors) { [] }
+ it { is_expected.to be_empty }
+ end
+ end
+ end
- it { is_expected.to match_array(expected_errors) }
+ context 'when not given a schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { nil }
+ let(:report_data) do
+ {
+ 'vulnerabilities' => []
+ }
+ end
+
+ let(:expected_errors) do
+ [
+ "root is missing required keys: version",
+ "Report version not provided, dast report type supports versions: #{supported_dast_versions}"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_errors) }
+
+ context 'when enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
end
+
+ it { is_expected.to be_empty }
end
end
end
@@ -458,9 +519,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
- let(:expected_deprecation_warnings) { [] }
-
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -468,30 +527,40 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- it { is_expected.to match_array(expected_deprecation_warnings) }
+ it { is_expected.to be_empty }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- it { is_expected.to match_array(expected_deprecation_warnings) }
+ it { is_expected.to be_empty }
end
end
context 'when given a deprecated schema version' do
let(:report_type) { :dast }
+ let(:deprecations_hash) do
+ {
+ dast: %w[V2.7.0]
+ }
+ end
+
let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
let(:expected_deprecation_warnings) do
[
- "Version V2.7.0 for report type dast has been deprecated, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ "Version V2.7.0 for report type dast has been deprecated, supported versions for this report type are: #{supported_dast_versions}"
]
end
- context 'and the report passes schema validation' do
+ before do
+ stub_const("#{described_class}::DEPRECATED_VERSIONS", deprecations_hash)
+ end
+
+ context 'when the report passes schema validation' do
let(:report_data) do
{
'version' => report_version,
@@ -502,7 +571,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
it { is_expected.to match_array(expected_deprecation_warnings) }
end
- context 'and the report does not pass schema validation' do
+ context 'when the report does not pass schema validation' do
let(:report_data) do
{
'version' => 'V2.7.0'
@@ -535,7 +604,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { described_class::SUPPORTED_VERSIONS[report_type].last }
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -543,29 +612,25 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- context 'if enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: project)
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
- context 'if enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
@@ -583,38 +648,44 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
context 'when given a deprecated schema version' do
let(:report_type) { :dast }
+ let(:deprecations_hash) do
+ {
+ dast: %w[V2.7.0]
+ }
+ end
+
let(:report_version) { described_class::DEPRECATED_VERSIONS[report_type].last }
- context 'and the report passes schema validation' do
+ before do
+ stub_const("#{described_class}::DEPRECATED_VERSIONS", deprecations_hash)
+ end
+
+ context 'when the report passes schema validation' do
let(:report_data) do
{
'vulnerabilities' => []
}
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
- context 'and the report does not pass schema validation' do
+ context 'when the report does not pass schema validation' do
let(:report_data) do
{
'version' => 'V2.7.0'
}
end
- context 'and enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
- context 'and enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
@@ -635,12 +706,12 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:report_type) { :dast }
let(:report_version) { "12.37.0" }
- context 'if enforce_security_report_validation is enabled' do
+ context 'when enforce_security_report_validation is enabled' do
before do
stub_feature_flags(enforce_security_report_validation: true)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -648,30 +719,26 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
}
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
}
end
- let(:expected_warnings) { [] }
-
- it { is_expected.to match_array(expected_warnings) }
+ it { is_expected.to be_empty }
end
end
- context 'if enforce_security_report_validation is disabled' do
+ context 'when enforce_security_report_validation is disabled' do
before do
stub_feature_flags(enforce_security_report_validation: false)
end
- context 'and the report is valid' do
+ context 'when the report is valid' do
let(:report_data) do
{
'version' => report_version,
@@ -681,14 +748,14 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:expected_warnings) do
[
- "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1"
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: #{supported_dast_versions}"
]
end
it { is_expected.to match_array(expected_warnings) }
end
- context 'and the report is invalid' do
+ context 'when the report is invalid' do
let(:report_data) do
{
'version' => report_version
@@ -697,7 +764,7 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
let(:expected_warnings) do
[
- "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: 14.0.0, 14.0.1, 14.0.2, 14.0.3, 14.0.4, 14.0.5, 14.0.6, 14.1.0, 14.1.1",
+ "Version 12.37.0 for report type dast is unsupported, supported versions for this report type are: #{supported_dast_versions}",
"root is missing required keys: vulnerabilities"
]
end
@@ -706,5 +773,32 @@ RSpec.describe Gitlab::Ci::Parsers::Security::Validators::SchemaValidator do
end
end
end
+
+ context 'when not given a schema version' do
+ let(:report_type) { :dast }
+ let(:report_version) { nil }
+ let(:report_data) do
+ {
+ 'vulnerabilities' => []
+ }
+ end
+
+ it { is_expected.to be_empty }
+
+ context 'when enforce_security_report_validation is disabled' do
+ before do
+ stub_feature_flags(enforce_security_report_validation: false)
+ end
+
+ let(:expected_warnings) do
+ [
+ "root is missing required keys: version",
+ "Report version not provided, dast report type supports versions: #{supported_dast_versions}"
+ ]
+ end
+
+ it { is_expected.to match_array(expected_warnings) }
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb
index 25e81f6d538..b570f2a7f75 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb
@@ -106,7 +106,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::CancelPendingPipelines do
create(:ci_build, :interruptible, :running, pipeline: child_pipeline)
end
- not_started_statuses = Ci::HasStatus::AVAILABLE_STATUSES - Ci::HasStatus::BUILD_STARTED_RUNNING_STATUSES
+ not_started_statuses = Ci::HasStatus::AVAILABLE_STATUSES - Ci::HasStatus::STARTED_STATUSES
context 'when the jobs are cancelable' do
cancelable_not_started_statuses = Set.new(not_started_statuses).intersection(Ci::HasStatus::CANCELABLE_STATUSES)
cancelable_not_started_statuses.each do |status|
diff --git a/spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb
index 1aa104310af..431073b5a09 100644
--- a/spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb
@@ -87,7 +87,7 @@ RSpec.describe ::Gitlab::Ci::Pipeline::Chain::Limit::Deployments do
it 'logs the error' do
expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
instance_of(Gitlab::Ci::Limit::LimitExceededError),
- project_id: project.id, plan: namespace.actual_plan_name
+ { project_id: project.id, plan: namespace.actual_plan_name }
)
perform
diff --git a/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
index 0da04d8dcf7..83742699d3d 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb
@@ -1,9 +1,13 @@
# frozen_string_literal: true
require 'fast_spec_helper'
+require 'support/helpers/stubbed_feature'
+require 'support/helpers/stub_feature_flags'
require_dependency 're2'
RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
+ include StubFeatureFlags
+
let(:left) { double('left') }
let(:right) { double('right') }
@@ -148,5 +152,29 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::Matches do
it { is_expected.to eq(false) }
end
+
+ context 'when right value is a regexp string' do
+ let(:right_value) { '/^ab.*/' }
+
+ context 'when matching' do
+ let(:left_value) { 'abcde' }
+
+ it { is_expected.to eq(true) }
+
+ context 'when the FF ci_fix_rules_if_comparison_with_regexp_variable is disabled' do
+ before do
+ stub_feature_flags(ci_fix_rules_if_comparison_with_regexp_variable: false)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+ end
+
+ context 'when not matching' do
+ let(:left_value) { 'dfg' }
+
+ it { is_expected.to eq(false) }
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb
index 9bff2355d58..aad33106647 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb
@@ -1,9 +1,13 @@
# frozen_string_literal: true
require 'fast_spec_helper'
+require 'support/helpers/stubbed_feature'
+require 'support/helpers/stub_feature_flags'
require_dependency 're2'
RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::NotMatches do
+ include StubFeatureFlags
+
let(:left) { double('left') }
let(:right) { double('right') }
@@ -148,5 +152,29 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::NotMatches do
it { is_expected.to eq(true) }
end
+
+ context 'when right value is a regexp string' do
+ let(:right_value) { '/^ab.*/' }
+
+ context 'when matching' do
+ let(:left_value) { 'abcde' }
+
+ it { is_expected.to eq(false) }
+
+ context 'when the FF ci_fix_rules_if_comparison_with_regexp_variable is disabled' do
+ before do
+ stub_feature_flags(ci_fix_rules_if_comparison_with_regexp_variable: false)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+ end
+
+ context 'when not matching' do
+ let(:left_value) { 'dfg' }
+
+ it { is_expected.to eq(true) }
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/expression/lexeme/pattern_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/lexeme/pattern_spec.rb
index fa4f8a20984..be205395b69 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/lexeme/pattern_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/lexeme/pattern_spec.rb
@@ -1,8 +1,32 @@
# frozen_string_literal: true
-require 'spec_helper'
+require 'fast_spec_helper'
RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::Pattern do
+ describe '#initialize' do
+ context 'when the value is a valid regular expression' do
+ it 'initializes the pattern' do
+ pattern = described_class.new('/foo/')
+
+ expect(pattern.value).to eq('/foo/')
+ end
+ end
+
+ context 'when the value is a valid regular expression with escaped slashes' do
+ it 'initializes the pattern' do
+ pattern = described_class.new('/foo\\/bar/')
+
+ expect(pattern.value).to eq('/foo/bar/')
+ end
+ end
+
+ context 'when the value is not a valid regular expression' do
+ it 'raises an error' do
+ expect { described_class.new('foo') }.to raise_error(Gitlab::Ci::Pipeline::Expression::Lexer::SyntaxError)
+ end
+ end
+ end
+
describe '.build' do
it 'creates a new instance of the token' do
expect(described_class.build('/.*/'))
@@ -15,6 +39,29 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Lexeme::Pattern do
end
end
+ describe '.build_and_evaluate' do
+ context 'when the value is a valid regular expression' do
+ it 'returns the value as a Gitlab::UntrustedRegexp' do
+ expect(described_class.build_and_evaluate('/foo/'))
+ .to eq(Gitlab::UntrustedRegexp.new('foo'))
+ end
+ end
+
+ context 'when the value is a Gitlab::UntrustedRegexp' do
+ it 'returns the value itself' do
+ expect(described_class.build_and_evaluate(Gitlab::UntrustedRegexp.new('foo')))
+ .to eq(Gitlab::UntrustedRegexp.new('foo'))
+ end
+ end
+
+ context 'when the value is not a valid regular expression' do
+ it 'returns the value itself' do
+ expect(described_class.build_and_evaluate('foo'))
+ .to eq('foo')
+ end
+ end
+ end
+
describe '.type' do
it 'is a value lexeme' do
expect(described_class.type).to eq :value
diff --git a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
index 84713e2a798..bbd11a00149 100644
--- a/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/expression/statement_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
.to_hash
end
- subject do
+ subject(:statement) do
described_class.new(text, variables)
end
@@ -29,6 +29,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
describe '#evaluate' do
using RSpec::Parameterized::TableSyntax
+ subject(:evaluate) { statement.evaluate }
+
where(:expression, :value) do
'$PRESENT_VARIABLE == "my variable"' | true
'"my variable" == $PRESENT_VARIABLE' | true
@@ -125,7 +127,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
let(:text) { expression }
it "evaluates to `#{params[:value].inspect}`" do
- expect(subject.evaluate).to eq(value)
+ expect(evaluate).to eq(value)
end
end
end
@@ -133,6 +135,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
describe '#truthful?' do
using RSpec::Parameterized::TableSyntax
+ subject(:truthful?) { statement.truthful? }
+
where(:expression, :value) do
'$PRESENT_VARIABLE == "my variable"' | true
"$PRESENT_VARIABLE == 'no match'" | false
@@ -151,7 +155,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
let(:text) { expression }
it "returns `#{params[:value].inspect}`" do
- expect(subject.truthful?).to eq value
+ expect(truthful?).to eq value
end
end
@@ -159,10 +163,41 @@ RSpec.describe Gitlab::Ci::Pipeline::Expression::Statement do
let(:text) { '$PRESENT_VARIABLE' }
it 'returns false' do
- allow(subject).to receive(:evaluate)
+ allow(statement).to receive(:evaluate)
.and_raise(described_class::StatementError)
- expect(subject.truthful?).to be_falsey
+ expect(truthful?).to be_falsey
+ end
+ end
+
+ context 'when variables have patterns' do
+ let(:variables) do
+ Gitlab::Ci::Variables::Collection.new
+ .append(key: 'teststring', value: 'abcde')
+ .append(key: 'pattern1', value: '/^ab.*/')
+ .append(key: 'pattern2', value: '/^at.*/')
+ .to_hash
+ end
+
+ where(:expression, :ff, :result) do
+ '$teststring =~ "abcde"' | true | true
+ '$teststring =~ "abcde"' | false | true
+ '$teststring =~ $teststring' | true | true
+ '$teststring =~ $teststring' | false | true
+ '$teststring =~ $pattern1' | true | true
+ '$teststring =~ $pattern1' | false | false
+ '$teststring =~ $pattern2' | true | false
+ '$teststring =~ $pattern2' | false | false
+ end
+
+ with_them do
+ let(:text) { expression }
+
+ before do
+ stub_feature_flags(ci_fix_rules_if_comparison_with_regexp_variable: ff)
+ end
+
+ it { is_expected.to eq(result) }
end
end
end
diff --git a/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb
index 9f7281fb714..51185be3e74 100644
--- a/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb
+++ b/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb
@@ -90,29 +90,22 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Deployment do
end
end
- context 'when job has environment attribute with stop action' do
- let(:attributes) do
- {
- environment: 'production',
- options: { environment: { name: 'production', action: 'stop' } }
- }
- end
-
- it 'returns nothing' do
- is_expected.to be_nil
+ context 'when job does not start environment' do
+ where(:action) do
+ %w(stop prepare verify access)
end
- end
- context 'when job has environment attribute with prepare action' do
- let(:attributes) do
- {
- environment: 'production',
- options: { environment: { name: 'production', action: 'prepare' } }
- }
- end
+ with_them do
+ let(:attributes) do
+ {
+ environment: 'production',
+ options: { environment: { name: 'production', action: action } }
+ }
+ end
- it 'returns nothing' do
- is_expected.to be_nil
+ it 'returns nothing' do
+ is_expected.to be_nil
+ end
end
end
diff --git a/spec/lib/gitlab/ci/reports/security/scanner_spec.rb b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
index eb406e01b24..d7ac82e3b53 100644
--- a/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
+++ b/spec/lib/gitlab/ci/reports/security/scanner_spec.rb
@@ -103,8 +103,6 @@ RSpec.describe Gitlab::Ci::Reports::Security::Scanner do
context 'when the `external_id` of the scanners are different' do
where(:scanner_1_attributes, :scanner_2_attributes, :expected_comparison_result) do
- { external_id: 'bundler_audit', name: 'foo', vendor: 'bar' } | { external_id: 'retire.js', name: 'foo', vendor: 'bar' } | -1
- { external_id: 'retire.js', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'gemnasium', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium-maven', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'gemnasium-maven', name: 'foo', vendor: 'bar' } | { external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | -1
{ external_id: 'gemnasium-python', name: 'foo', vendor: 'bar' } | { external_id: 'bandit', name: 'foo', vendor: 'bar' } | 1
diff --git a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
index b430da376dd..f2b4e7573c0 100644
--- a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
+++ b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb
@@ -22,8 +22,8 @@ RSpec.describe Gitlab::Ci::RunnerUpgradeCheck do
context 'with nil runner_version' do
let(:runner_version) { nil }
- it 'raises :unknown' do
- is_expected.to eq(:unknown)
+ it 'returns :invalid' do
+ is_expected.to eq(:invalid)
end
end
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
index 0f97bc06a4e..85516d0bbb0 100644
--- a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_gitlab_ci_yaml_spec.rb
@@ -2,8 +2,8 @@
require 'spec_helper'
-RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
- subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC.latest') }
+RSpec.describe 'Jobs/SAST-IaC.gitlab-ci.yml' do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC') }
describe 'the created pipeline' do
let_it_be(:project) { create(:project, :repository) }
diff --git a/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
new file mode 100644
index 00000000000..0f97bc06a4e
--- /dev/null
+++ b/spec/lib/gitlab/ci/templates/Jobs/sast_iac_latest_gitlab_ci_yaml_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Jobs/SAST-IaC.latest.gitlab-ci.yml' do
+ subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Jobs/SAST-IaC.latest') }
+
+ describe 'the created pipeline' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:user) { project.first_owner }
+
+ let(:default_branch) { 'main' }
+ let(:pipeline_ref) { default_branch }
+ let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_ref) }
+ let(:pipeline) { service.execute!(:push).payload }
+ let(:build_names) { pipeline.builds.pluck(:name) }
+
+ before do
+ stub_ci_pipeline_yaml_file(template.content)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
+ allow(project).to receive(:default_branch).and_return(default_branch)
+ end
+
+ context 'on feature branch' do
+ let(:pipeline_ref) { 'feature' }
+
+ it 'creates the kics-iac-sast job' do
+ expect(build_names).to contain_exactly('kics-iac-sast')
+ end
+ end
+
+ context 'on merge request' do
+ let(:service) { MergeRequests::CreatePipelineService.new(project: project, current_user: user) }
+ let(:merge_request) { create(:merge_request, :simple, source_project: project) }
+ let(:pipeline) { service.execute(merge_request).payload }
+
+ it 'has no jobs' do
+ expect(pipeline).to be_merge_request_event
+ expect(build_names).to be_empty
+ end
+ end
+
+ context 'SAST_DISABLED is set' do
+ before do
+ create(:ci_variable, key: 'SAST_DISABLED', value: 'true', project: project)
+ end
+
+ context 'on default branch' do
+ it 'has no jobs' do
+ expect { pipeline }.to raise_error(Ci::CreatePipelineService::CreateError)
+ end
+ end
+
+ context 'on feature branch' do
+ let(:pipeline_ref) { 'feature' }
+
+ it 'has no jobs' do
+ expect { pipeline }.to raise_error(Ci::CreatePipelineService::CreateError)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/templates/MATLAB_spec.rb b/spec/lib/gitlab/ci/templates/MATLAB_spec.rb
index a12d69b67a6..432040c4a14 100644
--- a/spec/lib/gitlab/ci/templates/MATLAB_spec.rb
+++ b/spec/lib/gitlab/ci/templates/MATLAB_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe 'MATLAB.gitlab-ci.yml' do
end
it 'creates all jobs' do
- expect(build_names).to include('command', 'test', 'test_artifacts_job')
+ expect(build_names).to include('command', 'test', 'test_artifacts')
end
end
end
diff --git a/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
index 5e9224cebd9..eca79f37779 100644
--- a/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/Terraform/base_gitlab_ci_yaml_spec.rb
@@ -16,7 +16,6 @@ RSpec.describe 'Terraform/Base.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
allow(project).to receive(:default_branch).and_return(default_branch)
end
diff --git a/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb
deleted file mode 100644
index 14aaf717453..00000000000
--- a/spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Managed-Cluster-Applications.gitlab-ci.yml' do
- subject(:template) { Gitlab::Template::GitlabCiYmlTemplate.find('Managed-Cluster-Applications') }
-
- describe 'the created pipeline' do
- let_it_be(:user) { create(:user) }
-
- let(:project) { create(:project, :custom_repo, namespace: user.namespace, files: { 'README.md' => '' }) }
- let(:service) { Ci::CreatePipelineService.new(project, user, ref: pipeline_branch ) }
- let(:pipeline) { service.execute!(:push).payload }
- let(:build_names) { pipeline.builds.pluck(:name) }
- let(:default_branch) { project.default_branch_or_main }
- let(:pipeline_branch) { default_branch }
-
- before do
- stub_ci_pipeline_yaml_file(template.content)
- end
-
- context 'for a default branch' do
- it 'creates a apply job' do
- expect(build_names).to match_array('apply')
- end
- end
-
- context 'outside of default branch' do
- let(:pipeline_branch) { 'a_branch' }
-
- before do
- project.repository.create_branch(pipeline_branch, default_branch)
- end
-
- it 'has no jobs' do
- expect { pipeline }.to raise_error(Ci::CreatePipelineService::CreateError, 'No stages / jobs for this pipeline.')
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/ci/templates/templates_spec.rb b/spec/lib/gitlab/ci/templates/templates_spec.rb
index ca096fcecc4..36c6e805bdf 100644
--- a/spec/lib/gitlab/ci/templates/templates_spec.rb
+++ b/spec/lib/gitlab/ci/templates/templates_spec.rb
@@ -7,10 +7,9 @@ RSpec.describe 'CI YML Templates' do
let(:all_templates) { Gitlab::Template::GitlabCiYmlTemplate.all.map(&:full_name) }
let(:excluded_templates) do
- excluded = all_templates.select do |name|
+ all_templates.select do |name|
Gitlab::Template::GitlabCiYmlTemplate.excluded_patterns.any? { |pattern| pattern.match?(name) }
end
- excluded + ["Terraform.gitlab-ci.yml"]
end
shared_examples 'require default stages to be included' do
diff --git a/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
index 346ab9f7af7..2fc4b509aab 100644
--- a/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb
@@ -20,13 +20,16 @@ RSpec.describe 'Terraform.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
allow(project).to receive(:default_branch).and_return(default_branch)
end
context 'on master branch' do
it 'creates init, validate and build jobs', :aggregate_failures do
expect(pipeline.errors).to be_empty
- expect(build_names).to include('init', 'validate', 'build', 'deploy')
+ expect(build_names).to include('validate', 'build', 'deploy')
end
end
diff --git a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
index 6c06403adff..42e56c4ab3c 100644
--- a/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
+++ b/spec/lib/gitlab/ci/templates/terraform_latest_gitlab_ci_yaml_spec.rb
@@ -20,7 +20,9 @@ RSpec.describe 'Terraform.latest.gitlab-ci.yml' do
before do
stub_ci_pipeline_yaml_file(template.content)
- allow_any_instance_of(Ci::BuildScheduleWorker).to receive(:perform).and_return(true)
+ allow_next_instance_of(Ci::BuildScheduleWorker) do |instance|
+ allow(instance).to receive(:perform).and_return(true)
+ end
allow(project).to receive(:default_branch).and_return(default_branch)
end
diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb
index b9aa5f7c431..e13a0993fa8 100644
--- a/spec/lib/gitlab/ci/variables/builder_spec.rb
+++ b/spec/lib/gitlab/ci/variables/builder_spec.rb
@@ -246,7 +246,7 @@ RSpec.describe Gitlab::Ci::Variables::Builder do
subject { builder.kubernetes_variables(environment: nil, job: job) }
before do
- allow(Ci::GenerateKubeconfigService).to receive(:new).with(job).and_return(service)
+ allow(Ci::GenerateKubeconfigService).to receive(:new).with(job.pipeline, token: job.token).and_return(service)
end
it { is_expected.to include(key: 'KUBECONFIG', value: 'example-kubeconfig', public: false, file: true) }
diff --git a/spec/lib/gitlab/ci/yaml_processor/result_spec.rb b/spec/lib/gitlab/ci/yaml_processor/result_spec.rb
index 25705fd4260..8416501e949 100644
--- a/spec/lib/gitlab/ci/yaml_processor/result_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor/result_spec.rb
@@ -12,8 +12,8 @@ module Gitlab
let(:ci_config) { Gitlab::Ci::Config.new(config_content, user: user) }
let(:result) { described_class.new(ci_config: ci_config, warnings: ci_config&.warnings) }
- describe '#merged_yaml' do
- subject(:merged_yaml) { result.merged_yaml }
+ describe '#config_metadata' do
+ subject(:config_metadata) { result.config_metadata }
let(:config_content) do
YAML.dump(
@@ -33,11 +33,23 @@ module Gitlab
end
it 'returns expanded yaml config' do
- expanded_config = YAML.safe_load(merged_yaml, [Symbol])
+ expanded_config = YAML.safe_load(config_metadata[:merged_yaml], [Symbol])
included_config = YAML.safe_load(included_yml, [Symbol])
expect(expanded_config).to include(*included_config.keys)
end
+
+ it 'returns includes' do
+ expect(config_metadata[:includes]).to contain_exactly(
+ { type: :remote,
+ location: 'https://example.com/sample.yml',
+ blob: nil,
+ raw: 'https://example.com/sample.yml',
+ extra: {},
+ context_project: nil,
+ context_sha: nil }
+ )
+ end
end
describe '#yaml_variables_for' do
diff --git a/spec/lib/gitlab/ci/yaml_processor_spec.rb b/spec/lib/gitlab/ci/yaml_processor_spec.rb
index 9b68ee2d6a2..1910057622b 100644
--- a/spec/lib/gitlab/ci/yaml_processor_spec.rb
+++ b/spec/lib/gitlab/ci/yaml_processor_spec.rb
@@ -630,7 +630,7 @@ module Gitlab
describe 'only / except policies validations' do
context 'when `only` has an invalid value' do
- let(:config) { { rspec: { script: "rspec", type: "test", only: only } } }
+ let(:config) { { rspec: { script: "rspec", stage: "test", only: only } } }
subject { Gitlab::Ci::YamlProcessor.new(YAML.dump(config)).execute }
@@ -2606,19 +2606,19 @@ module Gitlab
end
context 'returns errors if job stage is not a string' do
- let(:config) { YAML.dump({ rspec: { script: "test", type: 1 } }) }
+ let(:config) { YAML.dump({ rspec: { script: "test", stage: 1 } }) }
- it_behaves_like 'returns errors', 'jobs:rspec:type config should be a string'
+ it_behaves_like 'returns errors', 'jobs:rspec:stage config should be a string'
end
context 'returns errors if job stage is not a pre-defined stage' do
- let(:config) { YAML.dump({ rspec: { script: "test", type: "acceptance" } }) }
+ let(:config) { YAML.dump({ rspec: { script: "test", stage: "acceptance" } }) }
it_behaves_like 'returns errors', 'rspec job: chosen stage does not exist; available stages are .pre, build, test, deploy, .post'
end
context 'returns errors if job stage is not a defined stage' do
- let(:config) { YAML.dump({ stages: %w(build test), rspec: { script: "test", type: "acceptance" } }) }
+ let(:config) { YAML.dump({ stages: %w(build test), rspec: { script: "test", stage: "acceptance" } }) }
it_behaves_like 'returns errors', 'rspec job: chosen stage does not exist; available stages are .pre, build, test, .post'
end
diff --git a/spec/lib/gitlab/color_spec.rb b/spec/lib/gitlab/color_spec.rb
index 8b16e13fa4d..28719aa6199 100644
--- a/spec/lib/gitlab/color_spec.rb
+++ b/spec/lib/gitlab/color_spec.rb
@@ -24,6 +24,48 @@ RSpec.describe Gitlab::Color do
end
end
+ describe '.color_for' do
+ subject { described_class.color_for(value) }
+
+ shared_examples 'deterministic' do
+ it 'is deterministoc' do
+ expect(subject.to_s).to eq(described_class.color_for(value).to_s)
+ end
+ end
+
+ context 'when generating color for nil value' do
+ let(:value) { nil }
+
+ specify { is_expected.to be_valid }
+
+ it_behaves_like 'deterministic'
+ end
+
+ context 'when generating color for empty string value' do
+ let(:value) { '' }
+
+ specify { is_expected.to be_valid }
+
+ it_behaves_like 'deterministic'
+ end
+
+ context 'when generating color for number value' do
+ let(:value) { 1 }
+
+ specify { is_expected.to be_valid }
+
+ it_behaves_like 'deterministic'
+ end
+
+ context 'when generating color for string value' do
+ let(:value) { "1" }
+
+ specify { is_expected.to be_valid }
+
+ it_behaves_like 'deterministic'
+ end
+ end
+
describe '#new' do
it 'handles nil values' do
expect(described_class.new(nil)).to eq(described_class.new(nil))
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 44e2cb21677..2df85434f0e 100644
--- a/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
+++ b/spec/lib/gitlab/content_security_policy/config_loader_spec.rb
@@ -183,6 +183,8 @@ RSpec.describe Gitlab::ContentSecurityPolicy::ConfigLoader do
end
describe '#load' do
+ let(:default_directives) { described_class.default_directives }
+
subject { described_class.new(csp_config[:directives]) }
def expected_config(directive)
@@ -207,5 +209,23 @@ 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
+ # Explicitly disabling script_src and setting report_uri
+ csp_config[:directives] = {
+ script_src: false,
+ report_uri: 'https://example.org'
+ }
+
+ subject.load(policy)
+
+ expected_policy = ActionDispatch::ContentSecurityPolicy.new
+ # Creating a policy from default settings and manually overriding the custom values
+ described_class.new(default_directives).load(expected_policy)
+ expected_policy.script_src(nil)
+ expected_policy.report_uri('https://example.org')
+
+ expect(policy.directives).to eq(expected_policy.directives)
+ end
end
end
diff --git a/spec/lib/gitlab/data_builder/issuable_spec.rb b/spec/lib/gitlab/data_builder/issuable_spec.rb
new file mode 100644
index 00000000000..c1ae65c160f
--- /dev/null
+++ b/spec/lib/gitlab/data_builder/issuable_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::DataBuilder::Issuable do
+ let_it_be(:user) { create(:user) }
+
+ # This shared example requires a `builder` and `user` variable
+ shared_examples 'issuable hook data' do |kind, hook_data_issuable_builder_class|
+ let(:data) { builder.build(user: user) }
+
+ include_examples 'project hook data' do
+ let(:project) { builder.issuable.project }
+ end
+
+ include_examples 'deprecated repository hook data'
+
+ context "with a #{kind}" do
+ it 'contains issuable data' do
+ expect(data[:object_kind]).to eq(kind)
+ expect(data[:user]).to eq(user.hook_attrs)
+ expect(data[:project]).to eq(builder.issuable.project.hook_attrs)
+ expect(data[:object_attributes]).to eq(hook_data_issuable_builder_class.new(issuable).build)
+ expect(data[:changes]).to eq({})
+ expect(data[:repository]).to eq(builder.issuable.project.hook_attrs.slice(:name, :url, :description, :homepage))
+ end
+
+ it 'does not contain certain keys' do
+ expect(data).not_to have_key(:assignees)
+ expect(data).not_to have_key(:assignee)
+ end
+
+ describe 'changes are given' do
+ let(:changes) do
+ {
+ cached_markdown_version: %w[foo bar],
+ description: ['A description', 'A cool description'],
+ description_html: %w[foo bar],
+ in_progress_merge_commit_sha: %w[foo bar],
+ lock_version: %w[foo bar],
+ merge_jid: %w[foo bar],
+ title: ['A title', 'Hello World'],
+ title_html: %w[foo bar],
+ labels: [
+ [{ id: 1, title: 'foo' }],
+ [{ id: 1, title: 'foo' }, { id: 2, title: 'bar' }]
+ ],
+ total_time_spent: [1, 2],
+ assignees: [
+ [],
+ [{
+ name: "Foo Bar",
+ username: "foobar",
+ avatar_url: "http://www.example.com/my-avatar.jpg"
+ }]
+ ]
+ }
+ end
+
+ let(:data) { builder.build(user: user, changes: changes) }
+
+ it 'populates the :changes hash' do
+ expect(data[:changes]).to match(hash_including({
+ title: { previous: 'A title', current: 'Hello World' },
+ description: { previous: 'A description', current: 'A cool description' },
+ labels: {
+ previous: [{ id: 1, title: 'foo' }],
+ current: [{ id: 1, title: 'foo' }, { id: 2, title: 'bar' }]
+ },
+ total_time_spent: {
+ previous: 1,
+ current: 2
+ },
+ assignees: {
+ previous: [],
+ current: [{
+ name: "Foo Bar",
+ username: "foobar",
+ avatar_url: "http://www.example.com/my-avatar.jpg"
+ }]
+ }
+ }))
+ end
+
+ it 'does not contain certain keys' do
+ expect(data[:changes]).not_to have_key('cached_markdown_version')
+ expect(data[:changes]).not_to have_key('description_html')
+ expect(data[:changes]).not_to have_key('lock_version')
+ expect(data[:changes]).not_to have_key('title_html')
+ expect(data[:changes]).not_to have_key('in_progress_merge_commit_sha')
+ expect(data[:changes]).not_to have_key('merge_jid')
+ end
+ end
+ end
+ end
+
+ describe '#build' do
+ it_behaves_like 'issuable hook data', 'issue', Gitlab::HookData::IssueBuilder do
+ let(:issuable) { create(:issue, description: 'A description') }
+ let(:builder) { described_class.new(issuable) }
+ end
+
+ it_behaves_like 'issuable hook data', 'merge_request', Gitlab::HookData::MergeRequestBuilder do
+ let(:issuable) { create(:merge_request, description: 'A description') }
+ let(:builder) { described_class.new(issuable) }
+ end
+
+ context 'issue is assigned' do
+ let(:issue) { create(:issue, assignees: [user]) }
+ let(:data) { described_class.new(issue).build(user: user) }
+
+ it 'returns correct hook data' do
+ expect(data[:object_attributes]['assignee_id']).to eq(user.id)
+ expect(data[:assignees].first).to eq(user.hook_attrs)
+ expect(data).not_to have_key(:assignee)
+ end
+ end
+
+ context 'merge_request is assigned' do
+ let(:merge_request) { create(:merge_request, assignees: [user]) }
+ let(:data) { described_class.new(merge_request).build(user: user) }
+
+ it 'returns correct hook data' do
+ expect(data[:object_attributes]['assignee_id']).to eq(user.id)
+ expect(data[:assignees].first).to eq(user.hook_attrs)
+ expect(data).not_to have_key(:assignee)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
index 7a433be0e2f..a1c979bba50 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_spec.rb
@@ -99,6 +99,15 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigration, type: :m
end
end
+ describe '.created_after' do
+ let!(:migration_old) { create :batched_background_migration, created_at: 2.days.ago }
+ let!(:migration_new) { create :batched_background_migration, created_at: 0.days.ago }
+
+ it 'only returns migrations created after the specified time' do
+ expect(described_class.created_after(1.day.ago)).to contain_exactly(migration_new)
+ end
+ end
+
describe '.queued' do
let!(:migration1) { create(:batched_background_migration, :finished) }
let!(:migration2) { create(:batched_background_migration, :paused) }
diff --git a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
index 6a4ac317cad..83c0275a870 100644
--- a/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
+++ b/spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb
@@ -3,23 +3,20 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '#perform' do
- subject { described_class.new(connection: connection, metrics: metrics_tracker).perform(job_record) }
+ subject(:perform) { described_class.new(connection: connection, metrics: metrics_tracker).perform(job_record) }
let(:connection) { Gitlab::Database.database_base_models[:main].connection }
let(:metrics_tracker) { instance_double('::Gitlab::Database::BackgroundMigration::PrometheusMetrics', track: nil) }
- let(:job_class) { Gitlab::BackgroundMigration::CopyColumnUsingBackgroundMigrationJob }
+ let(:job_class) { Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) }
let_it_be(:pause_ms) { 250 }
let_it_be(:active_migration) { create(:batched_background_migration, :active, job_arguments: [:id, :other_id]) }
let!(:job_record) do
- create(:batched_background_migration_job,
- batched_migration: active_migration,
- pause_ms: pause_ms
- )
+ create(:batched_background_migration_job, batched_migration: active_migration, pause_ms: pause_ms)
end
- let(:job_instance) { double('job instance', batch_metrics: {}) }
+ let(:job_instance) { instance_double('Gitlab::BackgroundMigration::BatchedMigrationJob') }
around do |example|
Gitlab::Database::SharedModel.using_connection(connection) do
@@ -28,23 +25,35 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
end
before do
+ allow(active_migration).to receive(:job_class).and_return(job_class)
+
allow(job_class).to receive(:new).and_return(job_instance)
end
it 'runs the migration job' do
- expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
-
- subject
+ expect(job_class).to receive(:new)
+ .with(start_id: 1,
+ end_id: 10,
+ batch_table: 'events',
+ batch_column: 'id',
+ sub_batch_size: 1,
+ pause_ms: pause_ms,
+ connection: connection)
+ .and_return(job_instance)
+
+ expect(job_instance).to receive(:perform).with('id', 'other_id')
+
+ perform
end
it 'updates the tracking record in the database' do
- test_metrics = { 'my_metris' => 'some value' }
+ test_metrics = { 'my_metrics' => 'some value' }
- expect(job_instance).to receive(:perform)
+ expect(job_instance).to receive(:perform).with('id', 'other_id')
expect(job_instance).to receive(:batch_metrics).and_return(test_metrics)
freeze_time do
- subject
+ perform
reloaded_job_record = job_record.reload
@@ -69,11 +78,11 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
it 'increments attempts and updates other fields' do
updated_metrics = { 'updated_metrics' => 'some_value' }
- expect(job_instance).to receive(:perform)
+ expect(job_instance).to receive(:perform).with('id', 'other_id')
expect(job_instance).to receive(:batch_metrics).and_return(updated_metrics)
freeze_time do
- subject
+ perform
job_record.reload
@@ -88,10 +97,10 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
context 'when the migration job does not raise an error' do
it 'marks the tracking record as succeeded' do
- expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
+ expect(job_instance).to receive(:perform).with('id', 'other_id')
freeze_time do
- subject
+ perform
reloaded_job_record = job_record.reload
@@ -101,22 +110,20 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
end
it 'tracks metrics of the execution' do
- expect(job_instance).to receive(:perform)
+ expect(job_instance).to receive(:perform).with('id', 'other_id')
expect(metrics_tracker).to receive(:track).with(job_record)
- subject
+ perform
end
end
context 'when the migration job raises an error' do
shared_examples 'an error is raised' do |error_class|
it 'marks the tracking record as failed' do
- expect(job_instance).to receive(:perform)
- .with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
- .and_raise(error_class)
+ expect(job_instance).to receive(:perform).with('id', 'other_id').and_raise(error_class)
freeze_time do
- expect { subject }.to raise_error(error_class)
+ expect { perform }.to raise_error(error_class)
reloaded_job_record = job_record.reload
@@ -126,10 +133,10 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
end
it 'tracks metrics of the execution' do
- expect(job_instance).to receive(:perform).and_raise(error_class)
+ expect(job_instance).to receive(:perform).with('id', 'other_id').and_raise(error_class)
expect(metrics_tracker).to receive(:track).with(job_record)
- expect { subject }.to raise_error(error_class)
+ expect { perform }.to raise_error(error_class)
end
end
@@ -138,41 +145,14 @@ RSpec.describe Gitlab::Database::BackgroundMigration::BatchedMigrationWrapper, '
it_behaves_like 'an error is raised', ActiveRecord::StatementTimeout.new('Timeout!')
end
- context 'when the batched background migration does not inherit from BaseJob' do
- let(:migration_class) { Class.new }
-
- before do
- stub_const('Gitlab::BackgroundMigration::Foo', migration_class)
- end
+ context 'when the batched background migration does not inherit from BatchedMigrationJob' do
+ let(:job_class) { Class.new }
- let(:active_migration) { create(:batched_background_migration, :active, job_class_name: 'Foo') }
- let!(:job_record) { create(:batched_background_migration_job, batched_migration: active_migration) }
-
- it 'does not pass any argument' do
- expect(Gitlab::BackgroundMigration::Foo).to receive(:new).with(no_args).and_return(job_instance)
-
- expect(job_instance).to receive(:perform)
-
- subject
- end
- end
-
- context 'when the batched background migration inherits from BaseJob' do
- let(:active_migration) { create(:batched_background_migration, :active, job_class_name: 'Foo') }
- let!(:job_record) { create(:batched_background_migration_job, batched_migration: active_migration) }
-
- let(:migration_class) { Class.new(::Gitlab::BackgroundMigration::BaseJob) }
-
- before do
- stub_const('Gitlab::BackgroundMigration::Foo', migration_class)
- end
-
- it 'passes the correct connection' do
- expect(Gitlab::BackgroundMigration::Foo).to receive(:new).with(connection: connection).and_return(job_instance)
-
- expect(job_instance).to receive(:perform)
+ it 'runs the job with the correct arguments' do
+ expect(job_class).to receive(:new).with(no_args).and_return(job_instance)
+ expect(job_instance).to receive(:perform).with(1, 10, 'events', 'id', 1, pause_ms, 'id', 'other_id')
- subject
+ perform
end
end
end
diff --git a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
index e7b5bad8626..1009ec354c3 100644
--- a/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb
@@ -401,8 +401,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
ci: :dml_not_allowed
},
gitlab_schema_gitlab_shared: {
- main: :dml_access_denied,
- ci: :dml_access_denied
+ main: :runtime_error,
+ ci: :runtime_error
},
gitlab_schema_gitlab_main: {
main: :success,
@@ -465,7 +465,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
"does raise exception when accessing feature flags" => {
migration: ->(klass) do
def up
- Feature.enabled?(:redis_hll_tracking, type: :ops, default_enabled: :yaml)
+ Feature.enabled?(:redis_hll_tracking, type: :ops)
end
def down
@@ -486,6 +486,37 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
ci: :skipped
}
}
+ },
+ "does raise exception about cross schema access when suppressing restriction to ensure" => {
+ migration: ->(klass) do
+ # The purpose of this test is to ensure that we use ApplicationRecord
+ # a correct connection will be used:
+ # - this is a case for finalizing background migrations
+ def up
+ Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas.with_suppressed do
+ ::ApplicationRecord.connection.execute("SELECT 1 FROM ci_builds")
+ end
+ end
+
+ def down
+ end
+ end,
+ query_matcher: /FROM ci_builds/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup },
+ expected: {
+ no_gitlab_schema: {
+ main: :cross_schema_error,
+ ci: :success
+ },
+ gitlab_schema_gitlab_shared: {
+ main: :cross_schema_error,
+ ci: :success
+ },
+ gitlab_schema_gitlab_main: {
+ main: :cross_schema_error,
+ ci: :skipped
+ }
+ }
}
}
end
@@ -517,6 +548,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
%i[no_gitlab_schema gitlab_schema_gitlab_main gitlab_schema_gitlab_shared].each do |restrict_gitlab_migration|
context "while restrict_gitlab_migration=#{restrict_gitlab_migration}" do
it "does run migrate :up and :down" do
+ instance_eval(&setup) if setup
+
expected_result = expected.fetch(restrict_gitlab_migration)[db_config_name.to_sym]
skip "not configured" unless expected_result
@@ -543,10 +576,18 @@ RSpec.describe Gitlab::Database::MigrationHelpers::RestrictGitlabSchema, query_a
expect { migration_class.migrate(:up) }.to raise_error(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DMLAccessDeniedError)
expect { ignore_error(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DMLAccessDeniedError) { migration_class.migrate(:down) } }.not_to raise_error
+ when :runtime_error
+ expect { migration_class.migrate(:up) }.to raise_error(RuntimeError)
+ expect { ignore_error(RuntimeError) { migration_class.migrate(:down) } }.not_to raise_error
+
when :ddl_not_allowed
expect { migration_class.migrate(:up) }.to raise_error(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DDLNotAllowedError)
expect { ignore_error(Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas::DDLNotAllowedError) { migration_class.migrate(:down) } }.not_to raise_error
+ when :cross_schema_error
+ expect { migration_class.migrate(:up) }.to raise_error(Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection::CrossSchemaAccessError)
+ expect { ignore_error(Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection::CrossSchemaAccessError) { migration_class.migrate(:down) } }.not_to raise_error
+
when :skipped
expect_next_instance_of(migration_class) do |migration_object|
expect(migration_object).to receive(:migration_skipped).and_call_original
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 798eee0de3e..04fe1fad10e 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -1537,10 +1537,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id),
+ {
unique: false,
name: 'index_on_issues_gl_project_id',
length: [],
- order: [])
+ order: []
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1564,10 +1566,12 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id foobar),
+ {
unique: false,
name: 'index_on_issues_gl_project_id_foobar',
length: [],
- order: [])
+ order: []
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1591,11 +1595,13 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id),
+ {
unique: false,
name: 'index_on_issues_gl_project_id',
length: [],
order: [],
- where: 'foo')
+ where: 'foo'
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1619,11 +1625,13 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id),
+ {
unique: false,
name: 'index_on_issues_gl_project_id',
length: [],
order: [],
- using: 'foo')
+ using: 'foo'
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1647,11 +1655,13 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id),
+ {
unique: false,
name: 'index_on_issues_gl_project_id',
length: [],
order: [],
- opclass: { 'gl_project_id' => 'bar' })
+ opclass: { 'gl_project_id' => 'bar' }
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1660,14 +1670,16 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
context 'using an index with multiple columns and custom operator classes' do
it 'copies the index' do
index = double(:index,
- columns: %w(project_id foobar),
- name: 'index_on_issues_project_id_foobar',
- using: :gin,
- where: nil,
- opclasses: { 'project_id' => 'bar', 'foobar' => :gin_trgm_ops },
- unique: false,
- lengths: [],
- orders: [])
+ {
+ columns: %w(project_id foobar),
+ name: 'index_on_issues_project_id_foobar',
+ using: :gin,
+ where: nil,
+ opclasses: { 'project_id' => 'bar', 'foobar' => :gin_trgm_ops },
+ unique: false,
+ lengths: [],
+ orders: []
+ })
allow(model).to receive(:indexes_for).with(:issues, 'project_id')
.and_return([index])
@@ -1675,12 +1687,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id foobar),
+ {
unique: false,
name: 'index_on_issues_gl_project_id_foobar',
length: [],
order: [],
opclass: { 'gl_project_id' => 'bar', 'foobar' => :gin_trgm_ops },
- using: :gin)
+ using: :gin
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -1689,14 +1703,16 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
context 'using an index with multiple columns and a custom operator class on the non affected column' do
it 'copies the index' do
index = double(:index,
- columns: %w(project_id foobar),
- name: 'index_on_issues_project_id_foobar',
- using: :gin,
- where: nil,
- opclasses: { 'foobar' => :gin_trgm_ops },
- unique: false,
- lengths: [],
- orders: [])
+ {
+ columns: %w(project_id foobar),
+ name: 'index_on_issues_project_id_foobar',
+ using: :gin,
+ where: nil,
+ opclasses: { 'foobar' => :gin_trgm_ops },
+ unique: false,
+ lengths: [],
+ orders: []
+ })
allow(model).to receive(:indexes_for).with(:issues, 'project_id')
.and_return([index])
@@ -1704,12 +1720,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect(model).to receive(:add_concurrent_index)
.with(:issues,
%w(gl_project_id foobar),
+ {
unique: false,
name: 'index_on_issues_gl_project_id_foobar',
length: [],
order: [],
opclass: { 'foobar' => :gin_trgm_ops },
- using: :gin)
+ using: :gin
+ })
model.copy_indexes(:issues, :project_id, :gl_project_id)
end
@@ -2210,12 +2228,17 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
end
describe '#ensure_batched_background_migration_is_finished' do
+ let(:job_class_name) { 'CopyColumnUsingBackgroundMigrationJob' }
+ let(:table) { :events }
+ let(:column_name) { :id }
+ let(:job_arguments) { [["id"], ["id_convert_to_bigint"], nil] }
+
let(:configuration) do
{
- job_class_name: 'CopyColumnUsingBackgroundMigrationJob',
- table_name: :events,
- column_name: :id,
- job_arguments: [["id"], ["id_convert_to_bigint"], nil]
+ job_class_name: job_class_name,
+ table_name: table,
+ column_name: column_name,
+ job_arguments: job_arguments
}
end
@@ -2224,11 +2247,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
it 'raises an error when migration exists and is not marked as finished' do
create(:batched_background_migration, :active, configuration)
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ allow(runner).to receive(:finalize).with(job_class_name, table, column_name, job_arguments).and_return(false)
+ end
+
expect { ensure_batched_background_migration_is_finished }
.to raise_error "Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':" \
"\t#{configuration}" \
"\n\n" \
- "Finalize it manualy by running" \
+ "Finalize it manually by running" \
"\n\n" \
"\tsudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,events,id,'[[\"id\"]\\,[\"id_convert_to_bigint\"]\\,null]']" \
"\n\n" \
@@ -2251,6 +2278,28 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
expect { ensure_batched_background_migration_is_finished }
.not_to raise_error
end
+
+ it 'finalizes the migration' do
+ migration = create(:batched_background_migration, :active, configuration)
+
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).to receive(:finalize).with(job_class_name, table, column_name, job_arguments).and_return(migration.finish!)
+ end
+
+ ensure_batched_background_migration_is_finished
+ end
+
+ context 'when the flag finalize is false' do
+ it 'does not finalize the migration' do
+ create(:batched_background_migration, :active, configuration)
+
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).not_to receive(:finalize).with(job_class_name, table, column_name, job_arguments)
+ end
+
+ expect { model.ensure_batched_background_migration_is_finished(**configuration.merge(finalize: false)) }.to raise_error(RuntimeError)
+ end
+ end
end
describe '#index_exists_by_name?' do
@@ -3162,15 +3211,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
context 'without proper permissions' do
before do
- allow(model).to receive(:execute).with(/CREATE EXTENSION IF NOT EXISTS #{extension}/).and_raise(ActiveRecord::StatementInvalid, 'InsufficientPrivilege: permission denied')
+ allow(model).to receive(:execute)
+ .with(/CREATE EXTENSION IF NOT EXISTS #{extension}/)
+ .and_raise(ActiveRecord::StatementInvalid, 'InsufficientPrivilege: permission denied')
end
- it 'raises the exception' do
- expect { subject }.to raise_error(ActiveRecord::StatementInvalid, /InsufficientPrivilege/)
- end
-
- it 'prints an error message' do
- expect { subject }.to output(/user is not allowed/).to_stderr.and raise_error
+ it 'raises an exception and prints an error message' do
+ expect { subject }
+ .to output(/user is not allowed/).to_stderr
+ .and raise_error(ActiveRecord::StatementInvalid, /InsufficientPrivilege/)
end
end
end
@@ -3188,15 +3237,15 @@ RSpec.describe Gitlab::Database::MigrationHelpers do
context 'without proper permissions' do
before do
- allow(model).to receive(:execute).with(/DROP EXTENSION IF EXISTS #{extension}/).and_raise(ActiveRecord::StatementInvalid, 'InsufficientPrivilege: permission denied')
- end
-
- it 'raises the exception' do
- expect { subject }.to raise_error(ActiveRecord::StatementInvalid, /InsufficientPrivilege/)
+ allow(model).to receive(:execute)
+ .with(/DROP EXTENSION IF EXISTS #{extension}/)
+ .and_raise(ActiveRecord::StatementInvalid, 'InsufficientPrivilege: permission denied')
end
- it 'prints an error message' do
- expect { subject }.to output(/user is not allowed/).to_stderr.and raise_error
+ it 'raises an exception and prints an error message' do
+ expect { subject }
+ .to output(/user is not allowed/).to_stderr
+ .and raise_error(ActiveRecord::StatementInvalid, /InsufficientPrivilege/)
end
end
end
diff --git a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
index e64f5807385..b0caa21e01a 100644
--- a/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb
@@ -3,16 +3,31 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
+ let(:base_class) { ActiveRecord::Migration }
+
let(:model) do
- ActiveRecord::Migration.new.extend(described_class)
+ base_class.new
+ .extend(described_class)
+ .extend(Gitlab::Database::Migrations::ReestablishedConnectionStack)
end
- shared_examples_for 'helpers that enqueue background migrations' do |worker_class, tracking_database|
+ shared_examples_for 'helpers that enqueue background migrations' do |worker_class, connection_class, tracking_database|
before do
allow(model).to receive(:tracking_database).and_return(tracking_database)
+
+ # Due to lib/gitlab/database/load_balancing/configuration.rb:92 requiring RequestStore
+ # we cannot use stub_feature_flags(force_no_sharing_primary_model: true)
+ allow(connection_class.connection.load_balancer.configuration)
+ .to receive(:use_dedicated_connection?).and_return(true)
+
+ allow(model).to receive(:connection).and_return(connection_class.connection)
end
describe '#queue_background_migration_jobs_by_range_at_intervals' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(false)
+ end
+
context 'when the model has an ID column' do
let!(:id1) { create(:user).id }
let!(:id2) { create(:user).id }
@@ -196,6 +211,34 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end.to raise_error(StandardError, /does not have an ID/)
end
end
+
+ context 'when using Migration[2.0]' do
+ let(:base_class) { Class.new(Gitlab::Database::Migration[2.0]) }
+
+ context 'when restriction is set to gitlab_shared' do
+ before do
+ base_class.restrict_gitlab_migration gitlab_schema: :gitlab_shared
+ end
+
+ it 'does raise an exception' do
+ expect do
+ model.queue_background_migration_jobs_by_range_at_intervals(ProjectAuthorization, 'FooJob', 10.seconds)
+ end.to raise_error /use `restrict_gitlab_migration:` " with `:gitlab_shared`/
+ end
+ end
+ end
+
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect do
+ model.queue_background_migration_jobs_by_range_at_intervals(ProjectAuthorization, 'FooJob', 10.seconds)
+ end.to raise_error /The `#queue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction./
+ end
+ end
end
describe '#requeue_background_migration_jobs_by_range_at_intervals' do
@@ -205,6 +248,10 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
let!(:successful_job_1) { create(:background_migration_job, class_name: job_class_name, status: :succeeded, arguments: [5, 6]) }
let!(:successful_job_2) { create(:background_migration_job, class_name: job_class_name, status: :succeeded, arguments: [7, 8]) }
+ before do
+ allow(model).to receive(:transaction_open?).and_return(false)
+ end
+
around do |example|
freeze_time do
Sidekiq::Testing.fake! do
@@ -219,6 +266,38 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
expect(subject).to eq(20.minutes)
end
+ context 'when using Migration[2.0]' do
+ let(:base_class) { Class.new(Gitlab::Database::Migration[2.0]) }
+
+ it 'does re-enqueue pending jobs' do
+ subject
+
+ expect(worker_class.jobs).not_to be_empty
+ end
+
+ context 'when restriction is set' do
+ before do
+ base_class.restrict_gitlab_migration gitlab_schema: :gitlab_main
+ end
+
+ it 'does raise an exception' do
+ expect { subject }
+ .to raise_error /The `#requeue_background_migration_jobs_by_range_at_intervals` cannot use `restrict_gitlab_migration:`./
+ end
+ end
+ end
+
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect { subject }
+ .to raise_error /The `#requeue_background_migration_jobs_by_range_at_intervals` can not be run inside a transaction./
+ end
+ end
+
context 'when nothing is queued' do
subject { model.requeue_background_migration_jobs_by_range_at_intervals('FakeJob', 10.minutes) }
@@ -290,7 +369,7 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
end
- describe '#finalized_background_migration' do
+ describe '#finalize_background_migration' do
let(:coordinator) { Gitlab::BackgroundMigration::JobCoordinator.new(worker_class) }
let!(:tracked_pending_job) { create(:background_migration_job, class_name: job_class_name, status: :pending, arguments: [1]) }
@@ -309,8 +388,8 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
allow(Gitlab::BackgroundMigration).to receive(:coordinator_for_database)
.with(tracking_database).and_return(coordinator)
- expect(coordinator).to receive(:migration_class_for)
- .with(job_class_name).at_least(:once) { job_class }
+ allow(coordinator).to receive(:migration_class_for)
+ .with(job_class_name) { job_class }
Sidekiq::Testing.disable! do
worker_class.perform_async(job_class_name, [1, 2])
@@ -318,6 +397,8 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
worker_class.perform_in(10, job_class_name, [5, 6])
worker_class.perform_in(20, job_class_name, [7, 8])
end
+
+ allow(model).to receive(:transaction_open?).and_return(false)
end
it_behaves_like 'finalized tracked background migration', worker_class do
@@ -326,6 +407,52 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
end
+ context 'when within transaction' do
+ before do
+ allow(model).to receive(:transaction_open?).and_return(true)
+ end
+
+ it 'does raise an exception' do
+ expect { model.finalize_background_migration(job_class_name, delete_tracking_jobs: %w[pending succeeded]) }
+ .to raise_error /The `#finalize_background_migration` can not be run inside a transaction./
+ end
+ end
+
+ context 'when using Migration[2.0]' do
+ let(:base_class) { Class.new(Gitlab::Database::Migration[2.0]) }
+
+ it_behaves_like 'finalized tracked background migration', worker_class do
+ before do
+ model.finalize_background_migration(job_class_name)
+ end
+ end
+
+ context 'when restriction is set' do
+ before do
+ base_class.restrict_gitlab_migration gitlab_schema: :gitlab_main
+ end
+
+ it 'does raise an exception' do
+ expect { model.finalize_background_migration(job_class_name, delete_tracking_jobs: %w[pending succeeded]) }
+ .to raise_error /The `#finalize_background_migration` cannot use `restrict_gitlab_migration:`./
+ end
+ end
+ end
+
+ context 'when running migration in reconfigured ActiveRecord::Base context' do
+ it_behaves_like 'reconfigures connection stack', tracking_database do
+ it 'does restore connection hierarchy' do
+ expect_next_instances_of(job_class, 1..) do |job|
+ expect(job).to receive(:perform) do
+ validate_connections!
+ end
+ end
+
+ model.finalize_background_migration(job_class_name, delete_tracking_jobs: %w[pending succeeded])
+ end
+ end
+ end
+
context 'when removing all tracked job records' do
let!(:job_class) do
Class.new do
@@ -443,7 +570,7 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
context 'when the migration is running against the main database' do
- it_behaves_like 'helpers that enqueue background migrations', BackgroundMigrationWorker, 'main'
+ it_behaves_like 'helpers that enqueue background migrations', BackgroundMigrationWorker, ActiveRecord::Base, 'main'
end
context 'when the migration is running against the ci database', if: Gitlab::Database.has_config?(:ci) do
@@ -453,7 +580,7 @@ RSpec.describe Gitlab::Database::Migrations::BackgroundMigrationHelpers do
end
end
- it_behaves_like 'helpers that enqueue background migrations', BackgroundMigration::CiDatabaseWorker, 'ci'
+ it_behaves_like 'helpers that enqueue background migrations', BackgroundMigration::CiDatabaseWorker, Ci::ApplicationRecord, 'ci'
end
describe '#delete_job_tracking' do
diff --git a/spec/lib/gitlab/database/migrations/base_background_runner_spec.rb b/spec/lib/gitlab/database/migrations/base_background_runner_spec.rb
new file mode 100644
index 00000000000..34c83c42056
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/base_background_runner_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::BaseBackgroundRunner, :freeze_time do
+ let(:result_dir) { Dir.mktmpdir }
+
+ after do
+ FileUtils.rm_rf(result_dir)
+ end
+
+ context 'subclassing' do
+ subject { described_class.new(result_dir: result_dir) }
+
+ it 'requires that jobs_by_migration_name be implemented' do
+ expect { subject.jobs_by_migration_name }.to raise_error(NotImplementedError)
+ end
+
+ it 'requires that run_job be implemented' do
+ expect { subject.run_job(nil) }.to raise_error(NotImplementedError)
+ end
+ end
+end
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 f9347a174c4..d1a66036149 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
@@ -163,4 +163,45 @@ RSpec.describe Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers d
end
end
end
+
+ describe '#finalize_batched_background_migration' do
+ let!(:batched_migration) { create(:batched_background_migration, job_class_name: 'MyClass', table_name: :projects, column_name: :id, job_arguments: []) }
+
+ it 'finalizes the migration' do
+ allow_next_instance_of(Gitlab::Database::BackgroundMigration::BatchedMigrationRunner) do |runner|
+ expect(runner).to receive(:finalize).with('MyClass', :projects, :id, [])
+ end
+
+ migration.finalize_batched_background_migration(job_class_name: 'MyClass', table_name: :projects, column_name: :id, job_arguments: [])
+ end
+
+ context 'when the migration does not exist' do
+ it 'raises an exception' do
+ expect do
+ migration.finalize_batched_background_migration(job_class_name: 'MyJobClass', table_name: :projects, column_name: :id, job_arguments: [])
+ end.to raise_error(RuntimeError, 'Could not find batched background migration')
+ end
+ end
+
+ context 'when uses a CI connection', :reestablished_active_record_base do
+ before do
+ skip_if_multiple_databases_not_setup
+
+ ActiveRecord::Base.establish_connection(:ci) # rubocop:disable Database/EstablishConnection
+ end
+
+ it 'raises an exception' do
+ ci_migration = create(:batched_background_migration, :active)
+
+ expect do
+ migration.finalize_batched_background_migration(
+ job_class_name: ci_migration.job_class_name,
+ table_name: ci_migration.table_name,
+ column_name: ci_migration.column_name,
+ job_arguments: ci_migration.job_arguments
+ )
+ end.to raise_error /is currently not supported when running in decomposed/
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
index 2515f0d4a06..66de25d65bb 100644
--- a/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
+++ b/spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb
@@ -43,6 +43,7 @@ RSpec.describe Gitlab::Database::Migrations::Observers::QueryStatistics do
<<~SQL
SELECT query, calls, total_time, max_time, mean_time, rows
FROM pg_stat_statements
+ WHERE pg_get_userbyid(userid) = current_user
ORDER BY total_time DESC
SQL
end
diff --git a/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb b/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb
new file mode 100644
index 00000000000..cfb308c63e4
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/reestablished_connection_stack_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::ReestablishedConnectionStack do
+ let(:base_class) { ActiveRecord::Migration }
+
+ let(:model) do
+ base_class.new
+ .extend(described_class)
+ end
+
+ describe '#with_restored_connection_stack' do
+ Gitlab::Database.database_base_models.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
+ model.with_restored_connection_stack do
+ validate_connections!
+ end
+ end
+
+ primary_db_config = ActiveRecord::Base.configurations.primary?(db_config_name)
+
+ it 'does reconfigure connection handler', unless: primary_db_config do
+ original_handler = ActiveRecord::Base.connection_handler
+ new_handler = nil
+
+ model.with_restored_connection_stack do
+ new_handler = ActiveRecord::Base.connection_handler
+
+ # establish connection
+ ApplicationRecord.connection.select_one("SELECT 1 FROM projects LIMIT 1")
+ Ci::ApplicationRecord.connection.select_one("SELECT 1 FROM ci_builds LIMIT 1")
+ end
+
+ expect(new_handler).not_to eq(original_handler), "is reconnected"
+ expect(new_handler).not_to be_active_connections
+ expect(ActiveRecord::Base.connection_handler).to eq(original_handler), "is restored"
+ end
+
+ it 'does keep original connection handler', if: primary_db_config do
+ original_handler = ActiveRecord::Base.connection_handler
+ new_handler = nil
+
+ model.with_restored_connection_stack do
+ new_handler = ActiveRecord::Base.connection_handler
+ end
+
+ expect(new_handler).to eq(original_handler)
+ expect(ActiveRecord::Base.connection_handler).to eq(original_handler)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/migrations/runner_spec.rb b/spec/lib/gitlab/database/migrations/runner_spec.rb
index 8b1ccf05eb1..e7f68e3e4a8 100644
--- a/spec/lib/gitlab/database/migrations/runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/runner_spec.rb
@@ -2,6 +2,8 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::Runner do
+ include Database::MultipleDatabases
+
let(:result_dir) { Pathname.new(Dir.mktmpdir) }
let(:migration_runs) { [] } # This list gets populated as the runner tries to run migrations
@@ -136,4 +138,35 @@ RSpec.describe Gitlab::Database::Migrations::Runner do
expect(runner.result_dir).to eq(described_class::BASE_RESULT_DIR.join( 'background_migrations'))
end
end
+
+ describe '.batched_background_migrations' do
+ it 'is a TestBatchedBackgroundRunner' do
+ expect(described_class.batched_background_migrations(for_database: 'main')).to be_a(Gitlab::Database::Migrations::TestBatchedBackgroundRunner)
+ end
+
+ context 'choosing the database to test against' do
+ it 'chooses the main database' do
+ runner = described_class.batched_background_migrations(for_database: 'main')
+
+ chosen_connection_name = Gitlab::Database.db_config_name(runner.connection)
+
+ expect(chosen_connection_name).to eq('main')
+ end
+
+ it 'chooses the ci database' do
+ skip_if_multiple_databases_not_setup
+
+ runner = described_class.batched_background_migrations(for_database: 'ci')
+
+ chosen_connection_name = Gitlab::Database.db_config_name(runner.connection)
+
+ expect(chosen_connection_name).to eq('ci')
+ end
+
+ it 'throws an error with an invalid name' do
+ expect { described_class.batched_background_migrations(for_database: 'not_a_database') }
+ .to raise_error(/not a valid database name/)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb b/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
index 9407efad91f..a2fe91712c7 100644
--- a/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
+++ b/spec/lib/gitlab/database/migrations/test_background_runner_spec.rb
@@ -3,7 +3,9 @@
require 'spec_helper'
RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
+ include Gitlab::Database::Migrations::ReestablishedConnectionStack
include Gitlab::Database::Migrations::BackgroundMigrationHelpers
+ include Database::MigrationTestingHelpers
# In order to test the interaction between queueing sidekiq jobs and seeing those jobs in queues,
# we need to disable sidekiq's testing mode and actually send our jobs to redis
@@ -12,6 +14,7 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
end
let(:result_dir) { Dir.mktmpdir }
+ let(:connection) { ApplicationRecord.connection }
after do
FileUtils.rm_rf(result_dir)
@@ -41,40 +44,6 @@ RSpec.describe Gitlab::Database::Migrations::TestBackgroundRunner, :redis do
end
context 'running migrations', :freeze_time do
- def define_background_migration(name)
- klass = Class.new do
- # Can't simply def perform here as we won't have access to the block,
- # similarly can't define_method(:perform, &block) here as it would change the block receiver
- define_method(:perform) { |*args| yield(*args) }
- end
- stub_const("Gitlab::BackgroundMigration::#{name}", klass)
- klass
- end
-
- def expect_migration_call_counts(migrations_to_calls)
- migrations_to_calls.each do |migration, calls|
- expect_next_instances_of(migration, calls) do |m|
- expect(m).to receive(:perform).and_call_original
- end
- end
- end
-
- def expect_recorded_migration_runs(migrations_to_runs)
- migrations_to_runs.each do |migration, runs|
- path = File.join(result_dir, migration.name.demodulize)
- num_subdirs = Pathname(path).children.count(&:directory?)
- expect(num_subdirs).to eq(runs)
- end
- end
-
- def expect_migration_runs(migrations_to_run_counts)
- expect_migration_call_counts(migrations_to_run_counts)
-
- yield
-
- expect_recorded_migration_runs(migrations_to_run_counts)
- end
-
it 'runs the migration class correctly' do
calls = []
define_background_migration(migration_name) do |i|
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
new file mode 100644
index 00000000000..fbfff1268cc
--- /dev/null
+++ b/spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb
@@ -0,0 +1,87 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::Migrations::TestBatchedBackgroundRunner, :freeze_time do
+ include Gitlab::Database::MigrationHelpers
+ include Gitlab::Database::Migrations::BatchedBackgroundMigrationHelpers
+ include Database::MigrationTestingHelpers
+
+ let(:result_dir) { Dir.mktmpdir }
+
+ after do
+ FileUtils.rm_rf(result_dir)
+ end
+
+ let(:connection) { ApplicationRecord.connection }
+
+ let(:table_name) { "_test_column_copying"}
+
+ before do
+ connection.execute(<<~SQL)
+ CREATE TABLE #{table_name} (
+ id bigint primary key not null,
+ data bigint
+ );
+
+ insert into #{table_name} (id) select i from generate_series(1, 1000) g(i);
+ SQL
+ end
+
+ context 'running a real background migration' do
+ it 'runs sampled jobs from the batched background migration' do
+ queue_batched_background_migration('CopyColumnUsingBackgroundMigrationJob',
+ table_name, :id,
+ :id, :data,
+ batch_size: 100,
+ job_interval: 5.minutes) # job_interval is skipped when testing
+ described_class.new(result_dir: result_dir, connection: connection).run_jobs(for_duration: 1.minute)
+ unmigrated_row_count = define_batchable_model(table_name).where('id != data').count
+
+ expect(unmigrated_row_count).to eq(0)
+ end
+ end
+
+ context 'with jobs to run' do
+ let(:migration_name) { 'TestBackgroundMigration' }
+
+ before do
+ queue_batched_background_migration(migration_name, table_name, :id, job_interval: 5.minutes, batch_size: 100)
+ end
+
+ it 'samples jobs' do
+ calls = []
+ define_background_migration(migration_name) do |*args|
+ calls << args
+ end
+
+ described_class.new(result_dir: result_dir, connection: connection).run_jobs(for_duration: 3.minutes)
+
+ expect(calls.count).to eq(10) # 1000 rows / batch size 100 = 10
+ end
+
+ context 'with multiple jobs to run' do
+ it 'runs all jobs created within the last 48 hours' do
+ old_migration = define_background_migration(migration_name)
+
+ travel 3.days
+
+ new_migration = define_background_migration('NewMigration') { travel 1.second }
+ queue_batched_background_migration('NewMigration', table_name, :id,
+ job_interval: 5.minutes,
+ batch_size: 10,
+ sub_batch_size: 5)
+
+ other_new_migration = define_background_migration('NewMigration2') { travel 2.seconds }
+ queue_batched_background_migration('NewMigration2', table_name, :id,
+ job_interval: 5.minutes,
+ batch_size: 10,
+ sub_batch_size: 5)
+
+ expect_migration_runs(new_migration => 3, other_new_migration => 2, old_migration => 0) do
+ described_class.new(result_dir: result_dir, connection: connection).run_jobs(for_duration: 5.seconds)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb b/spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb
index 8ab3816529b..edb8ae36c45 100644
--- a/spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb
+++ b/spec/lib/gitlab/database/partitioning_migration_helpers/index_helpers_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::IndexHelpers do
expect_add_concurrent_index_and_call_original(partition2_identifier, column_name, partition2_index)
expect(migration).to receive(:with_lock_retries).ordered.and_yield
- expect(migration).to receive(:add_index).with(table_name, column_name, name: index_name).ordered.and_call_original
+ expect(migration).to receive(:add_index).with(table_name, column_name, { name: index_name }).ordered.and_call_original
migration.add_concurrent_partitioned_index(table_name, column_name, name: index_name)
@@ -64,7 +64,7 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::IndexHelpers do
end
def expect_add_concurrent_index_and_call_original(table, column, index)
- expect(migration).to receive(:add_concurrent_index).ordered.with(table, column, name: index)
+ expect(migration).to receive(:add_concurrent_index).ordered.with(table, column, { name: index })
.and_wrap_original { |_, table, column, options| connection.add_index(table, column, **options) }
end
end
@@ -90,13 +90,13 @@ RSpec.describe Gitlab::Database::PartitioningMigrationHelpers::IndexHelpers do
it 'forwards them to the index helper methods', :aggregate_failures do
expect(migration).to receive(:add_concurrent_index)
- .with(partition1_identifier, column_name, name: partition1_index, where: 'x > 0', unique: true)
+ .with(partition1_identifier, column_name, { name: partition1_index, where: 'x > 0', unique: true })
expect(migration).to receive(:add_index)
- .with(table_name, column_name, name: index_name, where: 'x > 0', unique: true)
+ .with(table_name, column_name, { name: index_name, where: 'x > 0', unique: true })
migration.add_concurrent_partitioned_index(table_name, column_name,
- name: index_name, where: 'x > 0', unique: true)
+ { name: index_name, where: 'x > 0', unique: true })
end
end
diff --git a/spec/lib/gitlab/database/query_analyzer_spec.rb b/spec/lib/gitlab/database/query_analyzer_spec.rb
index 3b4cbc79de2..0b849063562 100644
--- a/spec/lib/gitlab/database/query_analyzer_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzer_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Database::QueryAnalyzer, query_analyzers: false do
let(:analyzer) { double(:query_analyzer) }
- let(:user_analyzer) { double(:query_analyzer) }
+ let(:user_analyzer) { double(:user_query_analyzer) }
let(:disabled_analyzer) { double(:disabled_query_analyzer) }
before do
@@ -49,14 +49,36 @@ RSpec.describe Gitlab::Database::QueryAnalyzer, query_analyzers: false do
end
end
- it 'does not evaluate enabled? again do yield block' do
- expect(analyzer).not_to receive(:enabled?)
+ it 'does initialize analyzer only once' do
+ expect(analyzer).to receive(:enabled?).once
+ expect(analyzer).to receive(:begin!).once
+ expect(analyzer).to receive(:end!).once
expect { |b| described_class.instance.within(&b) }.to yield_control
end
- it 'raises exception when trying to re-define analyzers' do
- expect { |b| described_class.instance.within([user_analyzer], &b) }.to raise_error /Query analyzers are already defined, cannot re-define them/
+ it 'does initialize user analyzer when enabled' do
+ expect(user_analyzer).to receive(:enabled?).and_return(true)
+ expect(user_analyzer).to receive(:begin!)
+ expect(user_analyzer).to receive(:end!)
+
+ expect { |b| described_class.instance.within([user_analyzer], &b) }.to yield_control
+ end
+
+ it 'does initialize user analyzer only once' do
+ expect(user_analyzer).to receive(:enabled?).and_return(false, true)
+ expect(user_analyzer).to receive(:begin!).once
+ expect(user_analyzer).to receive(:end!).once
+
+ expect { |b| described_class.instance.within([user_analyzer, user_analyzer, user_analyzer], &b) }.to yield_control
+ end
+
+ it 'does not initializer user analyzer when disabled' do
+ expect(user_analyzer).to receive(:enabled?).and_return(false)
+ expect(user_analyzer).not_to receive(:begin!)
+ expect(user_analyzer).not_to receive(:end!)
+
+ expect { |b| described_class.instance.within([user_analyzer], &b) }.to yield_control
end
end
@@ -162,7 +184,7 @@ RSpec.describe Gitlab::Database::QueryAnalyzer, query_analyzers: false do
def process_sql(sql)
described_class.instance.within do
ApplicationRecord.load_balancer.read_write do |connection|
- described_class.instance.process_sql(sql, connection)
+ described_class.instance.send(:process_sql, sql, connection)
end
end
end
diff --git a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
index b8c1ecd9089..0d687db0f96 100644
--- a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb
@@ -140,7 +140,7 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasMetrics, query_ana
def process_sql(model, sql)
Gitlab::Database::QueryAnalyzer.instance.within do
# Skip load balancer and retrieve connection assigned to model
- Gitlab::Database::QueryAnalyzer.instance.process_sql(sql, model.retrieve_connection)
+ Gitlab::Database::QueryAnalyzer.instance.send(:process_sql, sql, model.retrieve_connection)
end
end
end
diff --git a/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb
new file mode 100644
index 00000000000..5e8afc0102e
--- /dev/null
+++ b/spec/lib/gitlab/database/query_analyzers/gitlab_schemas_validate_connection_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Database::QueryAnalyzers::GitlabSchemasValidateConnection, query_analyzers: false do
+ let(:analyzer) { described_class }
+
+ context 'properly observes all queries', :request_store do
+ using RSpec::Parameterized::TableSyntax
+
+ where do
+ {
+ "for simple query observes schema correctly" => {
+ model: ApplicationRecord,
+ sql: "SELECT 1 FROM projects",
+ expect_error: nil,
+ setup: nil
+ },
+ "for query accessing gitlab_ci and gitlab_main" => {
+ model: ApplicationRecord,
+ sql: "SELECT 1 FROM projects LEFT JOIN ci_builds ON ci_builds.project_id=projects.id",
+ expect_error: /The query tried to access \["projects", "ci_builds"\]/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup }
+ },
+ "for query accessing gitlab_ci and gitlab_main the gitlab_schemas is always ordered" => {
+ model: ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds LEFT JOIN projects ON ci_builds.project_id=projects.id",
+ expect_error: /The query tried to access \["ci_builds", "projects"\]/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup }
+ },
+ "for query accessing main table from CI database" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM projects",
+ expect_error: /The query tried to access \["projects"\]/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup }
+ },
+ "for query accessing CI database" => {
+ model: Ci::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expect_error: nil
+ },
+ "for query accessing CI table from main database" => {
+ model: ::ApplicationRecord,
+ sql: "SELECT 1 FROM ci_builds",
+ expect_error: /The query tried to access \["ci_builds"\]/,
+ setup: -> (_) { skip_if_multiple_databases_not_setup }
+ }
+ }
+ end
+
+ with_them do
+ it do
+ instance_eval(&setup) if setup
+
+ if expect_error
+ expect { process_sql(model, sql) }.to raise_error(expect_error)
+ else
+ expect { process_sql(model, sql) }.not_to raise_error
+ end
+ end
+ end
+ end
+
+ def process_sql(model, sql)
+ Gitlab::Database::QueryAnalyzer.instance.within([analyzer]) do
+ # Skip load balancer and retrieve connection assigned to model
+ Gitlab::Database::QueryAnalyzer.instance.send(:process_sql, sql, model.retrieve_connection)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb b/spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb
index a2c7916fa01..261bef58bb6 100644
--- a/spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb
+++ b/spec/lib/gitlab/database/query_analyzers/restrict_allowed_schemas_spec.rb
@@ -155,7 +155,7 @@ RSpec.describe Gitlab::Database::QueryAnalyzers::RestrictAllowedSchemas, query_a
yield if block_given?
# Skip load balancer and retrieve connection assigned to model
- Gitlab::Database::QueryAnalyzer.instance.process_sql(sql, model.retrieve_connection)
+ Gitlab::Database::QueryAnalyzer.instance.send(:process_sql, sql, model.retrieve_connection)
end
end
end
diff --git a/spec/lib/gitlab/database/shared_model_spec.rb b/spec/lib/gitlab/database/shared_model_spec.rb
index 54af4a0c4dc..574111f4c01 100644
--- a/spec/lib/gitlab/database/shared_model_spec.rb
+++ b/spec/lib/gitlab/database/shared_model_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Gitlab::Database::SharedModel do
expect do
described_class.using_connection(second_connection) {}
- end.to raise_error(/cannot nest connection overrides/)
+ end.to raise_error(/Cannot change connection for Gitlab::Database::SharedModel/)
expect(described_class.connection).to be(new_connection)
end
diff --git a/spec/lib/gitlab/database_importers/work_items/base_type_importer_spec.rb b/spec/lib/gitlab/database_importers/work_items/base_type_importer_spec.rb
index 8c3d372cc55..d044170dc75 100644
--- a/spec/lib/gitlab/database_importers/work_items/base_type_importer_spec.rb
+++ b/spec/lib/gitlab/database_importers/work_items/base_type_importer_spec.rb
@@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter do
- subject { described_class.import }
+ subject { described_class.upsert_types }
it_behaves_like 'work item base types importer'
end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index ac8616f84a7..23f4f0e7089 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -70,40 +70,6 @@ RSpec.describe Gitlab::Database do
end
end
- describe '.main_database?' do
- using RSpec::Parameterized::TableSyntax
-
- where(:database_name, :result) do
- :main | true
- 'main' | true
- :ci | false
- 'ci' | false
- :archive | false
- 'archive' | false
- end
-
- with_them do
- it { expect(described_class.main_database?(database_name)).to eq(result) }
- end
- end
-
- describe '.ci_database?' do
- using RSpec::Parameterized::TableSyntax
-
- where(:database_name, :result) do
- :main | false
- 'main' | false
- :ci | true
- 'ci' | true
- :archive | false
- 'archive' | false
- end
-
- with_them do
- it { expect(described_class.ci_database?(database_name)).to eq(result) }
- end
- end
-
describe '.check_for_non_superuser' do
subject { described_class.check_for_non_superuser }
diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb
index 0d7a183bb11..b7262629e0a 100644
--- a/spec/lib/gitlab/diff/file_spec.rb
+++ b/spec/lib/gitlab/diff/file_spec.rb
@@ -99,6 +99,22 @@ RSpec.describe Gitlab::Diff::File do
end
end
+ describe '#ipynb?' do
+ context 'is ipynb' do
+ let(:commit) { project.commit("532c837") }
+
+ it 'is true' do
+ expect(diff_file.ipynb?).to be_truthy
+ end
+ end
+
+ context 'is not ipynb' do
+ it 'is false' do
+ expect(diff_file.ipynb?).to be_falsey
+ end
+ end
+ end
+
describe '#has_renderable?' do
context 'file is ipynb' do
let(:commit) { project.commit("532c837") }
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 89b284feee0..1b74e24bf81 100644
--- a/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
+++ b/spec/lib/gitlab/diff/rendered/notebook/diff_file_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
end
it 'falls back to nil on timeout' do
- allow(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ expect(Gitlab::ErrorTracking).to receive(:log_exception)
expect(Timeout).to receive(:timeout).and_raise(Timeout::Error)
expect(nb_file.diff).to be_nil
@@ -101,6 +101,22 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
expect(nb_file.has_renderable?).to be_truthy
end
end
+
+ context 'when old blob file is truncated' do
+ it 'is false' do
+ allow(source.old_blob).to receive(:truncated?).and_return(true)
+
+ expect(nb_file.has_renderable?).to be_falsey
+ end
+ end
+
+ context 'when new blob file is truncated' do
+ it 'is false' do
+ allow(source.new_blob).to receive(:truncated?).and_return(true)
+
+ expect(nb_file.has_renderable?).to be_falsey
+ end
+ end
end
describe '#highlighted_diff_lines?' do
@@ -125,5 +141,9 @@ RSpec.describe Gitlab::Diff::Rendered::Notebook::DiffFile do
expect(nb_file.highlighted_diff_lines[12].old_pos).to eq(18)
end
end
+
+ it 'computes de first line where the remove would appear' do
+ expect(nb_file.highlighted_diff_lines.map(&:text).join('')).to include('[Hidden Image Output]')
+ end
end
end
diff --git a/spec/lib/gitlab/doctor/secrets_spec.rb b/spec/lib/gitlab/doctor/secrets_spec.rb
index f95a7eb1492..efdd6cc1199 100644
--- a/spec/lib/gitlab/doctor/secrets_spec.rb
+++ b/spec/lib/gitlab/doctor/secrets_spec.rb
@@ -7,10 +7,25 @@ RSpec.describe Gitlab::Doctor::Secrets do
let!(:group) { create(:group, runners_token: "test") }
let!(:project) { create(:project) }
let!(:grafana_integration) { create(:grafana_integration, project: project, token: "test") }
+ let!(:integration) { create(:integration, project: project, properties: { test_key: "test_value" }) }
let(:logger) { double(:logger).as_null_object }
subject { described_class.new(logger).run! }
+ before do
+ allow(Gitlab::Runtime).to receive(:rake?).and_return(true)
+ end
+
+ context 'when not ran in a Rake runtime' do
+ before do
+ allow(Gitlab::Runtime).to receive(:rake?).and_return(false)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(StandardError, 'can only be used in a Rake environment')
+ end
+ end
+
context 'when encrypted attributes are properly set' do
it 'detects decryptable secrets' do
expect(logger).to receive(:info).with(/User failures: 0/)
@@ -42,6 +57,25 @@ RSpec.describe Gitlab::Doctor::Secrets do
end
end
+ context 'when initializers attempt to use encrypted data' do
+ it 'skips the initializers and detects bad data' do
+ integration.encrypted_properties = "invalid"
+ integration.save!
+
+ expect(logger).to receive(:info).with(/Integration failures: 1/)
+
+ subject
+ end
+
+ it 'resets the initializers after the task runs' do
+ subject
+
+ expect(integration).to receive(:initialize_properties)
+
+ integration.run_callbacks(:initialize)
+ end
+ end
+
context 'when GrafanaIntegration token is set via private method' do
it 'can access GrafanaIntegration token value' do
expect(logger).to receive(:info).with(/GrafanaIntegration failures: 0/)
diff --git a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
index 59b87c5d8e7..9ff395070ea 100644
--- a/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
+++ b/spec/lib/gitlab/email/handler/create_note_handler_spec.rb
@@ -62,7 +62,7 @@ RSpec.describe Gitlab::Email::Handler::CreateNoteHandler do
end
it 'does not raise a UserNotFoundError' do
- expect { receiver.execute }.not_to raise_error(Gitlab::Email::UserNotFoundError)
+ expect { receiver.execute }.not_to raise_error
end
end
end
@@ -71,7 +71,7 @@ RSpec.describe Gitlab::Email::Handler::CreateNoteHandler do
let(:original_recipient) { User.support_bot }
it 'does not raise a UserNotFoundError' do
- expect { receiver.execute }.not_to raise_error(Gitlab::Email::UserNotFoundError)
+ expect { receiver.execute }.not_to raise_error
end
end
end
diff --git a/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb b/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb
new file mode 100644
index 00000000000..3089f955252
--- /dev/null
+++ b/spec/lib/gitlab/email/message/build_ios_app_guide_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Email::Message::BuildIosAppGuide do
+ subject(:message) { described_class.new }
+
+ before do
+ allow(Gitlab).to receive(:com?) { true }
+ end
+
+ it 'contains the correct message', :aggregate_failures do
+ expect(message.subject_line).to eq 'Get set up to build for iOS'
+ expect(message.title).to eq "Building for iOS? We've got you covered."
+ expect(message.body_line1).to eq "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."
+ expect(message.cta_text).to eq 'Learn how to build for iOS'
+ expect(message.cta2_text).to eq 'Watch iOS building in action.'
+ expect(message.logo_path).to eq 'mailers/in_product_marketing/create-0.png'
+ expect(message.unsubscribe).to include('%tag_unsubscribe_url%')
+ end
+end
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 8bd873cf008..dfa18c27d5e 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
@@ -24,7 +24,7 @@ RSpec.describe Gitlab::Email::Message::InProductMarketing::Base do
let(:series) { 0 }
it 'does not raise error' do
- expect { subject }.not_to raise_error(ArgumentError)
+ expect { subject }.not_to raise_error
end
end
end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb
new file mode 100644
index 00000000000..3c0d83d0f9e
--- /dev/null
+++ b/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Email::Message::InProductMarketing::Helper do
+ describe 'unsubscribe_message' do
+ include Gitlab::Routing
+
+ let(:dummy_class_with_helper) do
+ Class.new do
+ include Gitlab::Email::Message::InProductMarketing::Helper
+ include Gitlab::Routing
+
+ def initialize(format = :html)
+ @format = format
+ end
+
+ def default_url_options
+ {}
+ end
+
+ attr_accessor :format
+ end
+ end
+
+ let(:format) { :html }
+
+ subject(:class_with_helper) { dummy_class_with_helper.new(format) }
+
+ context 'gitlab.com' do
+ before do
+ allow(Gitlab).to receive(:com?) { true }
+ end
+
+ context 'format is HTML' do
+ it 'returns the correct HTML' do
+ message = "If you no longer wish to receive marketing emails from us, " \
+ "you may <a href=\"%tag_unsubscribe_url%\">unsubscribe</a> at any time."
+ expect(class_with_helper.unsubscribe_message).to match message
+ end
+ end
+
+ context 'format is text' do
+ let(:format) { :text }
+
+ it 'returns the correct string' do
+ message = "If you no longer wish to receive marketing emails from us, " \
+ "you may unsubscribe (%tag_unsubscribe_url%) at any time."
+ expect(class_with_helper.unsubscribe_message.squish).to match message
+ end
+ end
+ end
+
+ context 'self-managed' do
+ context 'format is HTML' do
+ it 'returns the correct HTML' do
+ preferences_link = "http://example.com/preferences"
+ message = "To opt out of these onboarding emails, " \
+ "<a href=\"#{profile_notifications_url}\">unsubscribe</a>. " \
+ "If you don't want to receive marketing emails directly from GitLab, #{preferences_link}."
+ expect(class_with_helper.unsubscribe_message(preferences_link))
+ .to match message
+ end
+ end
+
+ context 'format is text' do
+ let(:format) { :text }
+
+ it 'returns the correct string' do
+ preferences_link = "http://example.com/preferences"
+ message = "To opt out of these onboarding emails, " \
+ "unsubscribe (#{profile_notifications_url}). " \
+ "If you don't want to receive marketing emails directly from GitLab, #{preferences_link}."
+ expect(class_with_helper.unsubscribe_message(preferences_link).squish).to match message
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/experiment/rollout/feature_spec.rb b/spec/lib/gitlab/experiment/rollout/feature_spec.rb
index 82603e6fe0f..a66f4fea207 100644
--- a/spec/lib/gitlab/experiment/rollout/feature_spec.rb
+++ b/spec/lib/gitlab/experiment/rollout/feature_spec.rb
@@ -53,8 +53,7 @@ RSpec.describe Gitlab::Experiment::Rollout::Feature, :experiment do
expect(Feature).to receive(:enabled?).with(
'namespaced_stub',
subject,
- type: :experiment,
- default_enabled: :yaml
+ type: :experiment
).and_return(false)
expect(subject.execute_assignment).to be_nil
diff --git a/spec/lib/gitlab/experimentation/controller_concern_spec.rb b/spec/lib/gitlab/experimentation/controller_concern_spec.rb
index 435a0d56301..799884d7a74 100644
--- a/spec/lib/gitlab/experimentation/controller_concern_spec.rb
+++ b/spec/lib/gitlab/experimentation/controller_concern_spec.rb
@@ -274,7 +274,7 @@ RSpec.describe Gitlab::Experimentation::ControllerConcern, type: :controller do
action: 'start',
property: 'control_group',
value: 1,
- label: Digest::MD5.hexdigest('abc'),
+ label: Digest::SHA256.hexdigest('abc'),
user: user
)
end
@@ -289,7 +289,7 @@ RSpec.describe Gitlab::Experimentation::ControllerConcern, type: :controller do
action: 'start',
property: 'control_group',
value: 1,
- label: Digest::MD5.hexdigest('somestring'),
+ label: Digest::SHA256.hexdigest('somestring'),
user: user
)
end
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 46f544797bb..2c931a999f1 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -165,17 +165,21 @@ EOT
context 'when diff contains invalid characters' do
let(:bad_string) { [0xae].pack("C*") }
let(:bad_string_two) { [0x89].pack("C*") }
+ let(:bad_string_three) { "@@ -1,5 +1,6 @@\n \xFF\xFE#\x00l\x00a\x00n\x00g\x00u\x00" }
let(:diff) { described_class.new(@raw_diff_hash.merge({ diff: bad_string })) }
let(:diff_two) { described_class.new(@raw_diff_hash.merge({ diff: bad_string_two })) }
+ let(:diff_three) { described_class.new(@raw_diff_hash.merge({ diff: bad_string_three })) }
context 'when replace_invalid_utf8_chars is true' do
it 'will convert invalid characters and not cause an encoding error' do
expect(diff.diff).to include(Gitlab::EncodingHelper::UNICODE_REPLACEMENT_CHARACTER)
expect(diff_two.diff).to include(Gitlab::EncodingHelper::UNICODE_REPLACEMENT_CHARACTER)
+ expect(diff_three.diff).to include(Gitlab::EncodingHelper::UNICODE_REPLACEMENT_CHARACTER)
- expect { Oj.dump(diff) }.not_to raise_error(EncodingError)
- expect { Oj.dump(diff_two) }.not_to raise_error(EncodingError)
+ expect { Oj.dump(diff) }.not_to raise_error
+ expect { Oj.dump(diff_two) }.not_to raise_error
+ expect { Oj.dump(diff_three) }.not_to raise_error
end
context 'when the diff is binary' do
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
index d6ef1836ad9..e628a06a542 100644
--- a/spec/lib/gitlab/git_access_spec.rb
+++ b/spec/lib/gitlab/git_access_spec.rb
@@ -228,6 +228,15 @@ RSpec.describe Gitlab::GitAccess do
project.add_maintainer(user)
end
+ context 'key is expired' do
+ let(:actor) { create(:rsa_key_2048, :expired) }
+
+ it 'does not allow expired keys', :aggregate_failures do
+ expect { pull_access_check }.to raise_forbidden('Your SSH key has expired.')
+ expect { push_access_check }.to raise_forbidden('Your SSH key has expired.')
+ end
+ end
+
context 'key is too small' do
before do
stub_application_setting(rsa_key_restriction: 4096)
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index 50a0f20e775..92860c9232f 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -339,11 +339,18 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
describe '#list_new_commits' do
let(:revisions) { [revision] }
let(:gitaly_commits) { create_list(:gitaly_commit, 3) }
- let(:commits) { gitaly_commits.map { |c| Gitlab::Git::Commit.new(repository, c) }}
+ let(:expected_commits) { gitaly_commits.map { |c| Gitlab::Git::Commit.new(repository, c) }}
+ let(:filter_quarantined_commits) { false }
- subject { client.list_new_commits(revisions, allow_quarantine: allow_quarantine) }
+ subject do
+ client.list_new_commits(revisions, allow_quarantine: allow_quarantine)
+ end
shared_examples 'a #list_all_commits message' do
+ before do
+ stub_feature_flags(filter_quarantined_commits: filter_quarantined_commits)
+ end
+
it 'sends a list_all_commits message' do
expected_repository = repository.gitaly_repository.dup
expected_repository.git_alternate_object_directories = Google::Protobuf::RepeatedField.new(:string)
@@ -352,9 +359,33 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
expect(service).to receive(:list_all_commits)
.with(gitaly_request_with_params(repository: expected_repository), kind_of(Hash))
.and_return([Gitaly::ListAllCommitsResponse.new(commits: gitaly_commits)])
+
+ if filter_quarantined_commits
+ # The object directory of the repository must not be set so that we
+ # don't use the quarantine directory.
+ objects_exist_repo = repository.gitaly_repository.dup
+ objects_exist_repo.git_object_directory = ""
+
+ # The first request contains the repository, the second request the
+ # commit IDs we want to check for existence.
+ objects_exist_request = [
+ gitaly_request_with_params(repository: objects_exist_repo),
+ gitaly_request_with_params(revisions: gitaly_commits.map(&:id))
+ ]
+
+ objects_exist_response = Gitaly::CheckObjectsExistResponse.new(revisions: revision_existence.map do
+ |rev, exists| Gitaly::CheckObjectsExistResponse::RevisionExistence.new(name: rev, exists: exists)
+ end)
+
+ expect(service).to receive(:check_objects_exist)
+ .with(objects_exist_request, kind_of(Hash))
+ .and_return([objects_exist_response])
+ else
+ expect(service).not_to receive(:check_objects_exist)
+ end
end
- expect(subject).to eq(commits)
+ expect(subject).to eq(expected_commits)
end
end
@@ -366,7 +397,7 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
.and_return([Gitaly::ListCommitsResponse.new(commits: gitaly_commits)])
end
- expect(subject).to eq(commits)
+ expect(subject).to eq(expected_commits)
end
end
@@ -390,7 +421,40 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
context 'with allowed quarantine' do
let(:allow_quarantine) { true }
- it_behaves_like 'a #list_all_commits message'
+ context 'without commit filtering' do
+ it_behaves_like 'a #list_all_commits message'
+ end
+
+ context 'with commit filtering' do
+ let(:filter_quarantined_commits) { true }
+
+ context 'reject commits which exist in target repository' do
+ let(:revision_existence) { gitaly_commits.to_h { |c| [c.id, true] } }
+ let(:expected_commits) { [] }
+
+ it_behaves_like 'a #list_all_commits message'
+ end
+
+ context 'keep commits which do not exist in target repository' do
+ let(:revision_existence) { gitaly_commits.to_h { |c| [c.id, false] } }
+
+ it_behaves_like 'a #list_all_commits message'
+ end
+
+ context 'mixed existing and nonexisting commits' do
+ let(:revision_existence) do
+ {
+ gitaly_commits[0].id => true,
+ gitaly_commits[1].id => false,
+ gitaly_commits[2].id => true
+ }
+ end
+
+ let(:expected_commits) { [Gitlab::Git::Commit.new(repository, gitaly_commits[1])] }
+
+ it_behaves_like 'a #list_all_commits message'
+ end
+ end
end
context 'with disallowed quarantine' do
@@ -493,6 +557,61 @@ RSpec.describe Gitlab::GitalyClient::CommitService do
end
end
+ describe '#object_existence_map' do
+ shared_examples 'a CheckObjectsExistRequest' do
+ before do
+ ::Gitlab::GitalyClient.clear_stubs!
+ end
+
+ it 'returns expected results' do
+ expect_next_instance_of(Gitaly::CommitService::Stub) do |service|
+ expect(service)
+ .to receive(:check_objects_exist)
+ .and_call_original
+ end
+
+ expect(client.object_existence_map(revisions.keys)).to eq(revisions)
+ end
+ end
+
+ context 'with empty request' do
+ let(:revisions) { {} }
+
+ it_behaves_like 'a CheckObjectsExistRequest'
+ end
+
+ context 'when revision exists' do
+ let(:revisions) { { 'refs/heads/master' => true } }
+
+ it_behaves_like 'a CheckObjectsExistRequest'
+ end
+
+ context 'when revision does not exist' do
+ let(:revisions) { { 'refs/does/not/exist' => false } }
+
+ it_behaves_like 'a CheckObjectsExistRequest'
+ end
+
+ context 'when request contains mixed revisions' do
+ let(:revisions) do
+ {
+ "refs/heads/master" => true,
+ "refs/does/not/exist" => false
+ }
+ end
+
+ it_behaves_like 'a CheckObjectsExistRequest'
+ end
+
+ context 'when requesting many revisions' do
+ let(:revisions) do
+ Array(1..1234).to_h { |i| ["refs/heads/#{i}", false] }
+ end
+
+ it_behaves_like 'a CheckObjectsExistRequest'
+ end
+ end
+
describe '#commits_by_message' do
shared_examples 'a CommitsByMessageRequest' do
let(:commits) { create_list(:gitaly_commit, 2) }
diff --git a/spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb b/spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb
index 321ad7d3238..8eeb2332131 100644
--- a/spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb
@@ -181,8 +181,10 @@ RSpec.describe Gitlab::GithubImport::Importer::DiffNoteImporter, :aggregate_fail
expect(Gitlab::GithubImport::Logger)
.to receive(:warn)
.with(
- message: "Validation failed: Line code can't be blank, Line code must be a valid line code, Position is incomplete",
- 'error.class': 'Gitlab::GithubImport::Importer::DiffNoteImporter::DiffNoteCreationError'
+ {
+ message: "Validation failed: Line code can't be blank, Line code must be a valid line code, Position is incomplete",
+ 'error.class': 'Gitlab::GithubImport::Importer::DiffNoteImporter::DiffNoteCreationError'
+ }
)
expect { subject.execute }
@@ -204,8 +206,10 @@ RSpec.describe Gitlab::GithubImport::Importer::DiffNoteImporter, :aggregate_fail
expect(Gitlab::GithubImport::Logger)
.to receive(:warn)
.with(
- message: 'Failed to create diff note file',
- 'error.class': 'DiffNote::NoteDiffFileCreationError'
+ {
+ message: 'Failed to create diff note file',
+ 'error.class': 'DiffNote::NoteDiffFileCreationError'
+ }
)
expect { subject.execute }
diff --git a/spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb
index c5fa67e50aa..0eb86feb040 100644
--- a/spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestsReviewsImporter do
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:pull_request_reviews, 'github/repo', merge_request.iid, page: 1)
+ .with(:pull_request_reviews, 'github/repo', merge_request.iid, { page: 1 })
.and_yield(page)
expect { |b| subject.each_object_to_import(&b) }
@@ -67,7 +67,7 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestsReviewsImporter do
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:pull_request_reviews, 'github/repo', merge_request.iid, page: 2)
+ .with(:pull_request_reviews, 'github/repo', merge_request.iid, { page: 2 })
subject.each_object_to_import {}
end
diff --git a/spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb
index 8c71d7d0ed7..471302cb31b 100644
--- a/spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointDiffNotesImporter d
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:pull_request_comments, 'github/repo', merge_request.iid, page: 1)
+ .with(:pull_request_comments, 'github/repo', merge_request.iid, { page: 1 })
.and_yield(page)
expect { |b| subject.each_object_to_import(&b) }.to yield_with_args(note)
@@ -56,7 +56,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointDiffNotesImporter d
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:pull_request_comments, 'github/repo', merge_request.iid, page: 2)
+ .with(:pull_request_comments, 'github/repo', merge_request.iid, { page: 2 })
subject.each_object_to_import {}
end
diff --git a/spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb
index 8d8f2730880..d769f4fdcf5 100644
--- a/spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointIssueNotesImporter
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:issue_comments, 'github/repo', issue.iid, page: 1)
+ .with(:issue_comments, 'github/repo', issue.iid, { page: 1 })
.and_yield(page)
expect { |b| subject.each_object_to_import(&b) }.to yield_with_args(note)
@@ -55,7 +55,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointIssueNotesImporter
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:issue_comments, 'github/repo', issue.iid, page: 2)
+ .with(:issue_comments, 'github/repo', issue.iid, { page: 2 })
subject.each_object_to_import {}
end
diff --git a/spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb
index b8282212a90..1dcc466d34c 100644
--- a/spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointMergeRequestNotesIm
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:issue_comments, 'github/repo', merge_request.iid, page: 1)
+ .with(:issue_comments, 'github/repo', merge_request.iid, { page: 1 })
.and_yield(page)
expect { |b| subject.each_object_to_import(&b) }.to yield_with_args(note)
@@ -56,7 +56,7 @@ RSpec.describe Gitlab::GithubImport::Importer::SingleEndpointMergeRequestNotesIm
expect(client)
.to receive(:each_page)
.exactly(:once) # ensure to be cached on the second call
- .with(:issue_comments, 'github/repo', merge_request.iid, page: 2)
+ .with(:issue_comments, 'github/repo', merge_request.iid, { page: 2 })
subject.each_object_to_import {}
end
diff --git a/spec/lib/gitlab/github_import/milestone_finder_spec.rb b/spec/lib/gitlab/github_import/milestone_finder_spec.rb
index fe8652eb5a2..e7f47d334e8 100644
--- a/spec/lib/gitlab/github_import/milestone_finder_spec.rb
+++ b/spec/lib/gitlab/github_import/milestone_finder_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe Gitlab::GithubImport::MilestoneFinder, :clean_gitlab_redis_cache
it 'builds the cache of all project milestones' do
expect(Gitlab::Cache::Import::Caching)
.to receive(:write_multiple)
- .with("github-import/milestone-finder/#{project.id}/1" => milestone.id)
+ .with({ "github-import/milestone-finder/#{project.id}/1" => milestone.id })
.and_call_original
finder.build_cache
diff --git a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
index 200898f8f03..999f8ffb21e 100644
--- a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
+++ b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb
@@ -87,19 +87,23 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting importer',
- parallel: false,
- project_id: project.id,
- importer: 'Class'
+ {
+ message: 'starting importer',
+ parallel: false,
+ project_id: project.id,
+ importer: 'Class'
+ }
)
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'importer finished',
- parallel: false,
- project_id: project.id,
- importer: 'Class'
+ {
+ message: 'importer finished',
+ parallel: false,
+ project_id: project.id,
+ importer: 'Class'
+ }
)
importer.execute
@@ -118,20 +122,24 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting importer',
- parallel: false,
- project_id: project.id,
- importer: 'Class'
+ {
+ message: 'starting importer',
+ parallel: false,
+ project_id: project.id,
+ importer: 'Class'
+ }
)
expect(Gitlab::Import::ImportFailureService)
.to receive(:track)
.with(
- project_id: project.id,
- exception: exception,
- error_source: 'MyImporter',
- fail_import: false,
- metrics: true
+ {
+ project_id: project.id,
+ exception: exception,
+ error_source: 'MyImporter',
+ fail_import: false,
+ metrics: true
+ }
).and_call_original
expect { importer.execute }
@@ -184,10 +192,12 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting importer',
- parallel: false,
- project_id: project.id,
- importer: 'Class'
+ {
+ message: 'starting importer',
+ parallel: false,
+ project_id: project.id,
+ importer: 'Class'
+ }
)
expect(Gitlab::Import::ImportFailureService)
@@ -290,25 +300,6 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do
importer.parallel_import
end
end
-
- context 'when distribute_github_parallel_import feature flag is disabled' do
- before do
- stub_feature_flags(distribute_github_parallel_import: false)
- end
-
- it 'imports data in parallel' do
- expect(importer)
- .to receive(:each_object_to_import)
- .and_yield(object)
-
- expect(worker_class)
- .to receive(:perform_async)
- .with(project.id, { title: 'Foo' }, an_instance_of(String))
-
- expect(importer.parallel_import)
- .to be_an_instance_of(Gitlab::JobWaiter)
- end
- end
end
describe '#each_object_to_import' do
diff --git a/spec/lib/gitlab/gon_helper_spec.rb b/spec/lib/gitlab/gon_helper_spec.rb
index 28cb9125af1..dd4dcca809b 100644
--- a/spec/lib/gitlab/gon_helper_spec.rb
+++ b/spec/lib/gitlab/gon_helper_spec.rb
@@ -44,6 +44,7 @@ RSpec.describe Gitlab::GonHelper do
describe '#push_frontend_feature_flag' do
before do
skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
end
it 'pushes a feature flag to the frontend' do
diff --git a/spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb b/spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb
deleted file mode 100644
index 1b9301cd1aa..00000000000
--- a/spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Graphql::FindArgumentInParent do
- describe '#find' do
- def build_node(parent = nil, args: {})
- props = { irep_node: double(arguments: args) }
- props[:parent] = parent if parent # The root node shouldn't respond to parent
-
- double(props)
- end
-
- let(:parent) do
- build_node(
- build_node(
- build_node(
- build_node,
- args: { myArg: 1 }
- )
- )
- )
- end
-
- let(:arg_name) { :my_arg }
-
- it 'searches parents and returns the argument' do
- expect(described_class.find(parent, :my_arg)).to eq(1)
- end
-
- it 'can find argument when passed in as both Ruby and GraphQL-formatted symbols and strings' do
- [:my_arg, :myArg, 'my_arg', 'myArg'].each do |arg|
- expect(described_class.find(parent, arg)).to eq(1)
- end
- end
-
- it 'returns nil if no arguments found in parents' do
- expect(described_class.find(parent, :bar)).to eq(nil)
- end
-
- it 'can limit the depth it searches to' do
- expect(described_class.find(parent, :my_arg, limit_depth: 1)).to eq(nil)
- 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 86e7d4e344c..b6c3cb4e04a 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
@@ -3,13 +3,15 @@
require 'spec_helper'
RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
+ include GraphqlHelpers
+
# https://gitlab.com/gitlab-org/gitlab/-/issues/334973
# The spec will be merged with connection_spec.rb in the future.
let(:nodes) { Project.all.order(id: :asc) }
let(:arguments) { {} }
let(:query_type) { GraphQL::ObjectType.new }
let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)}
- let(:context) { GraphQL::Query::Context.new(query: double('query', schema: schema), values: nil, object: nil) }
+ let(:context) { GraphQL::Query::Context.new(query: query_double(schema: schema), values: nil, object: nil) }
let_it_be(:column_order_id) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].asc) }
let_it_be(:column_order_id_desc) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].desc) }
diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
index f31ec6c09fd..a4ba288b7f1 100644
--- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
@@ -3,11 +3,13 @@
require 'spec_helper'
RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do
+ include GraphqlHelpers
+
let(:nodes) { Project.all.order(id: :asc) }
let(:arguments) { {} }
let(:query_type) { GraphQL::ObjectType.new }
let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)}
- let(:context) { GraphQL::Query::Context.new(query: double('query', schema: schema), values: nil, object: nil) }
+ let(:context) { GraphQL::Query::Context.new(query: query_double(schema: schema), values: nil, object: nil) }
subject(:connection) do
described_class.new(nodes, **{ context: context, max_page_size: 3 }.merge(arguments))
diff --git a/spec/lib/gitlab/graphql/queries_spec.rb b/spec/lib/gitlab/graphql/queries_spec.rb
index ad1aaac712e..2c2ec821385 100644
--- a/spec/lib/gitlab/graphql/queries_spec.rb
+++ b/spec/lib/gitlab/graphql/queries_spec.rb
@@ -85,11 +85,15 @@ RSpec.describe Gitlab::Graphql::Queries do
describe '.all' do
it 'is the combination of finding queries in CE and EE' do
expect(described_class)
- .to receive(:find).with(Rails.root / 'app/assets/javascripts').and_return([:ce])
+ .to receive(:find).with(Rails.root / 'app/assets/javascripts').and_return([:ce_assets])
expect(described_class)
- .to receive(:find).with(Rails.root / 'ee/app/assets/javascripts').and_return([:ee])
+ .to receive(:find).with(Rails.root / 'ee/app/assets/javascripts').and_return([:ee_assets])
+ expect(described_class)
+ .to receive(:find).with(Rails.root / 'app/graphql/queries').and_return([:ce_gql])
+ expect(described_class)
+ .to receive(:find).with(Rails.root / 'ee/app/graphql/queries').and_return([:ee_gql])
- expect(described_class.all).to eq([:ce, :ee])
+ expect(described_class.all).to contain_exactly(:ce_assets, :ee_assets, :ce_gql, :ee_gql)
end
end
diff --git a/spec/lib/gitlab/health_checks/middleware_spec.rb b/spec/lib/gitlab/health_checks/middleware_spec.rb
new file mode 100644
index 00000000000..3b644539acc
--- /dev/null
+++ b/spec/lib/gitlab/health_checks/middleware_spec.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+
+RSpec.describe Gitlab::HealthChecks::Middleware do
+ let(:app) { instance_double(Proc) }
+ let(:env) { { 'PATH_INFO' => path } }
+
+ let(:readiness_probe) { instance_double(Gitlab::HealthChecks::Probes::Collection) }
+ let(:liveness_probe) { instance_double(Gitlab::HealthChecks::Probes::Collection) }
+ let(:probe_result) { Gitlab::HealthChecks::Probes::Status.new(200, { status: 'ok' }) }
+
+ subject(:middleware) { described_class.new(app, readiness_probe, liveness_probe) }
+
+ describe '#call' do
+ context 'handling /readiness requests' do
+ let(:path) { '/readiness' }
+
+ it 'handles the request' do
+ expect(readiness_probe).to receive(:execute).and_return(probe_result)
+
+ response = middleware.call(env)
+
+ expect(response).to eq([200, { 'Content-Type' => 'application/json; charset=utf-8' }, ['{"status":"ok"}']])
+ end
+ end
+
+ context 'handling /liveness requests' do
+ let(:path) { '/liveness' }
+
+ it 'handles the request' do
+ expect(liveness_probe).to receive(:execute).and_return(probe_result)
+
+ response = middleware.call(env)
+
+ expect(response).to eq([200, { 'Content-Type' => 'application/json; charset=utf-8' }, ['{"status":"ok"}']])
+ end
+ end
+
+ context 'handling other requests' do
+ let(:path) { '/other_path' }
+
+ it 'forwards them to the next middleware' do
+ expect(app).to receive(:call).with(env).and_return([201, {}, []])
+
+ response = middleware.call(env)
+
+ expect(response).to eq([201, {}, []])
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/health_checks/server_spec.rb b/spec/lib/gitlab/health_checks/server_spec.rb
new file mode 100644
index 00000000000..65d24acbf22
--- /dev/null
+++ b/spec/lib/gitlab/health_checks/server_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::HealthChecks::Server do
+ context 'with running server thread' do
+ subject(:server) { described_class.new(address: 'localhost', port: 8082) }
+
+ before do
+ # We need to send a request to localhost
+ WebMock.allow_net_connect!
+
+ server.start
+ end
+
+ after do
+ webmock_enable!
+
+ server.stop
+ end
+
+ shared_examples 'serves health check at' do |path|
+ it 'responds with 200 OK' do
+ response = Gitlab::HTTP.try_get("http://localhost:8082/#{path}", allow_local_requests: true)
+
+ expect(response.code).to eq(200)
+ end
+ end
+
+ describe '/readiness' do
+ it_behaves_like 'serves health check at', 'readiness'
+ end
+
+ describe '/liveness' do
+ it_behaves_like 'serves health check at', 'liveness'
+ end
+
+ describe 'other routes' do
+ it 'serves 404' do
+ response = Gitlab::HTTP.try_get("http://localhost:8082/other", allow_local_requests: true)
+
+ expect(response.code).to eq(404)
+ end
+ end
+ end
+
+ context 'when server thread goes away' do
+ before do
+ expect_next_instance_of(::WEBrick::HTTPServer) do |webrick|
+ allow(webrick).to receive(:start)
+ expect(webrick).to receive(:listeners).and_call_original
+ end
+ end
+
+ specify 'stop closes TCP socket' do
+ server = described_class.new(address: 'localhost', port: 8082)
+ server.start
+
+ expect(server.thread).to receive(:alive?).and_return(false).at_least(:once)
+
+ server.stop
+ end
+ end
+end
diff --git a/spec/lib/gitlab/hook_data/issuable_builder_spec.rb b/spec/lib/gitlab/hook_data/issuable_builder_spec.rb
deleted file mode 100644
index 676396697fb..00000000000
--- a/spec/lib/gitlab/hook_data/issuable_builder_spec.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::HookData::IssuableBuilder do
- let_it_be(:user) { create(:user) }
-
- # This shared example requires a `builder` and `user` variable
- shared_examples 'issuable hook data' do |kind, hook_data_issuable_builder_class|
- let(:data) { builder.build(user: user) }
-
- include_examples 'project hook data' do
- let(:project) { builder.issuable.project }
- end
-
- include_examples 'deprecated repository hook data'
-
- context "with a #{kind}" do
- it 'contains issuable data' do
- expect(data[:object_kind]).to eq(kind)
- expect(data[:user]).to eq(user.hook_attrs)
- expect(data[:project]).to eq(builder.issuable.project.hook_attrs)
- expect(data[:object_attributes]).to eq(hook_data_issuable_builder_class.new(issuable).build)
- expect(data[:changes]).to eq({})
- expect(data[:repository]).to eq(builder.issuable.project.hook_attrs.slice(:name, :url, :description, :homepage))
- end
-
- it 'does not contain certain keys' do
- expect(data).not_to have_key(:assignees)
- expect(data).not_to have_key(:assignee)
- end
-
- describe 'changes are given' do
- let(:changes) do
- {
- cached_markdown_version: %w[foo bar],
- description: ['A description', 'A cool description'],
- description_html: %w[foo bar],
- in_progress_merge_commit_sha: %w[foo bar],
- lock_version: %w[foo bar],
- merge_jid: %w[foo bar],
- title: ['A title', 'Hello World'],
- title_html: %w[foo bar],
- labels: [
- [{ id: 1, title: 'foo' }],
- [{ id: 1, title: 'foo' }, { id: 2, title: 'bar' }]
- ],
- total_time_spent: [1, 2],
- assignees: [
- [],
- [{
- name: "Foo Bar",
- username: "foobar",
- avatar_url: "http://www.example.com/my-avatar.jpg"
- }]
- ]
- }
- end
-
- let(:data) { builder.build(user: user, changes: changes) }
-
- it 'populates the :changes hash' do
- expect(data[:changes]).to match(hash_including({
- title: { previous: 'A title', current: 'Hello World' },
- description: { previous: 'A description', current: 'A cool description' },
- labels: {
- previous: [{ id: 1, title: 'foo' }],
- current: [{ id: 1, title: 'foo' }, { id: 2, title: 'bar' }]
- },
- total_time_spent: {
- previous: 1,
- current: 2
- },
- assignees: {
- previous: [],
- current: [{
- name: "Foo Bar",
- username: "foobar",
- avatar_url: "http://www.example.com/my-avatar.jpg"
- }]
- }
- }))
- end
-
- it 'does not contain certain keys' do
- expect(data[:changes]).not_to have_key('cached_markdown_version')
- expect(data[:changes]).not_to have_key('description_html')
- expect(data[:changes]).not_to have_key('lock_version')
- expect(data[:changes]).not_to have_key('title_html')
- expect(data[:changes]).not_to have_key('in_progress_merge_commit_sha')
- expect(data[:changes]).not_to have_key('merge_jid')
- end
- end
- end
- end
-
- describe '#build' do
- it_behaves_like 'issuable hook data', 'issue', Gitlab::HookData::IssueBuilder do
- let(:issuable) { create(:issue, description: 'A description') }
- let(:builder) { described_class.new(issuable) }
- end
-
- it_behaves_like 'issuable hook data', 'merge_request', Gitlab::HookData::MergeRequestBuilder do
- let(:issuable) { create(:merge_request, description: 'A description') }
- let(:builder) { described_class.new(issuable) }
- end
-
- context 'issue is assigned' do
- let(:issue) { create(:issue, assignees: [user]) }
- let(:data) { described_class.new(issue).build(user: user) }
-
- it 'returns correct hook data' do
- expect(data[:object_attributes]['assignee_id']).to eq(user.id)
- expect(data[:assignees].first).to eq(user.hook_attrs)
- expect(data).not_to have_key(:assignee)
- end
- end
-
- context 'merge_request is assigned' do
- let(:merge_request) { create(:merge_request, assignees: [user]) }
- let(:data) { described_class.new(merge_request).build(user: user) }
-
- it 'returns correct hook data' do
- expect(data[:object_attributes]['assignee_id']).to eq(user.id)
- expect(data[:assignees].first).to eq(user.hook_attrs)
- expect(data).not_to have_key(:assignee)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/http_spec.rb b/spec/lib/gitlab/http_spec.rb
index 7dbd21e6914..c2fb987d195 100644
--- a/spec/lib/gitlab/http_spec.rb
+++ b/spec/lib/gitlab/http_spec.rb
@@ -246,10 +246,10 @@ RSpec.describe Gitlab::HTTP do
context 'when :timeout is set' do
it 'does not set any default timeouts' do
expect(described_class).to receive(:httparty_perform_request).with(
- Net::HTTP::Get, 'http://example.org', timeout: 1
+ Net::HTTP::Get, 'http://example.org', { timeout: 1 }
).and_call_original
- described_class.get('http://example.org', timeout: 1)
+ described_class.get('http://example.org', { timeout: 1 })
end
end
diff --git a/spec/lib/gitlab/import/import_failure_service_spec.rb b/spec/lib/gitlab/import/import_failure_service_spec.rb
index e3fec63adde..eb71b307b8d 100644
--- a/spec/lib/gitlab/import/import_failure_service_spec.rb
+++ b/spec/lib/gitlab/import/import_failure_service_spec.rb
@@ -64,19 +64,23 @@ RSpec.describe Gitlab::Import::ImportFailureService, :aggregate_failures do
.to receive(:track_exception)
.with(
exception,
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
+ {
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ }
)
expect(Gitlab::Import::Logger)
.to receive(:error)
.with(
- message: 'importer failed',
- 'error.message': 'some error',
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
+ {
+ message: 'importer failed',
+ 'error.message': 'some error',
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ }
)
service.execute
@@ -96,19 +100,23 @@ RSpec.describe Gitlab::Import::ImportFailureService, :aggregate_failures do
.to receive(:track_exception)
.with(
exception,
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
+ {
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ }
)
expect(Gitlab::Import::Logger)
.to receive(:error)
.with(
- message: 'importer failed',
- 'error.message': 'some error',
- project_id: project.id,
- import_type: import_type,
- source: 'SomeImporter'
+ {
+ message: 'importer failed',
+ 'error.message': 'some error',
+ project_id: project.id,
+ import_type: import_type,
+ source: 'SomeImporter'
+ }
)
service.execute
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 730f9035293..1546b6a26c8 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -550,6 +550,7 @@ project:
- project_registry
- packages
- package_files
+- packages_cleanup_policy
- tracing_setting
- alerting_setting
- project_setting
diff --git a/spec/lib/gitlab/import_export/group/relation_factory_spec.rb b/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
index 8e7fe8849d4..9dbe8426f52 100644
--- a/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
+++ b/spec/lib/gitlab/import_export/group/relation_factory_spec.rb
@@ -88,6 +88,21 @@ RSpec.describe Gitlab::ImportExport::Group::RelationFactory do
end
end
+ context 'when relation is namespace_settings' do
+ let(:relation_sym) { :namespace_settings }
+ let(:relation_hash) do
+ {
+ 'namespace_id' => 1,
+ 'prevent_forking_outside_group' => true,
+ 'prevent_sharing_groups_outside_hierarchy' => true
+ }
+ end
+
+ it do
+ expect(created_object).to eq(nil)
+ end
+ end
+
def random_id
rand(1000..10000)
end
diff --git a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
index a3e891db658..d3397e89f1f 100644
--- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb
@@ -383,7 +383,7 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
end
end
- it 'restores releases with links' do
+ it 'restores releases with links & milestones' do
release = @project.releases.last
link = release.links.last
@@ -393,6 +393,8 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do
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')
diff --git a/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb b/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb
new file mode 100644
index 00000000000..4eb2388f3f7
--- /dev/null
+++ b/spec/lib/gitlab/inactive_projects_deletion_warning_tracker_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require "spec_helper"
+
+RSpec.describe Gitlab::InactiveProjectsDeletionWarningTracker do
+ let_it_be(:project_id) { 1 }
+
+ describe '.notified_projects', :clean_gitlab_redis_shared_state do
+ before do
+ freeze_time do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ end
+ end
+
+ it 'returns the list of projects for which deletion warning email has been sent' do
+ expected_hash = { "project:1" => "#{Date.current}" }
+
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects).to eq(expected_hash)
+ end
+ end
+
+ describe '.reset_all' do
+ before do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ end
+
+ it 'deletes all the projects for which deletion warning email was sent' do
+ Gitlab::InactiveProjectsDeletionWarningTracker.reset_all
+
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.notified_projects).to eq({})
+ end
+ end
+
+ describe '#notified?' do
+ before do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ end
+
+ it 'returns true if the project has already been notified' do
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?).to eq(true)
+ end
+
+ it 'returns false if the project has not been notified' do
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(2).notified?).to eq(false)
+ end
+ end
+
+ describe '#mark_notified' do
+ it 'marks the project as being notified' do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?).to eq(true)
+ end
+ end
+
+ describe '#reset' do
+ before do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).mark_notified
+ end
+
+ it 'resets the project as not being notified' do
+ Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).reset
+
+ expect(Gitlab::InactiveProjectsDeletionWarningTracker.new(project_id).notified?).to eq(false)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/instrumentation/rate_limiting_gates_spec.rb b/spec/lib/gitlab/instrumentation/rate_limiting_gates_spec.rb
new file mode 100644
index 00000000000..ac308eb7c80
--- /dev/null
+++ b/spec/lib/gitlab/instrumentation/rate_limiting_gates_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Instrumentation::RateLimitingGates, :request_store do
+ describe '.gates' do
+ it 'returns an empty array when no gates are tracked' do
+ expect(described_class.gates).to eq([])
+ end
+
+ it 'returns all gates used in the request' do
+ described_class.track(:foo)
+
+ RequestStore.clear!
+
+ described_class.track(:bar)
+ described_class.track(:baz)
+
+ expect(described_class.gates).to contain_exactly(:bar, :baz)
+ end
+
+ it 'deduplicates its results' do
+ described_class.track(:foo)
+ described_class.track(:bar)
+ described_class.track(:foo)
+
+ expect(described_class.gates).to contain_exactly(:foo, :bar)
+ end
+ end
+
+ describe '.payload' do
+ it 'returns the gates in a hash' do
+ described_class.track(:foo)
+ described_class.track(:bar)
+
+ expect(described_class.payload).to eq(described_class::GATES => [:foo, :bar])
+ end
+ end
+end
diff --git a/spec/lib/gitlab/instrumentation_helper_spec.rb b/spec/lib/gitlab/instrumentation_helper_spec.rb
index a9663012e9a..5fea355ab4f 100644
--- a/spec/lib/gitlab/instrumentation_helper_spec.rb
+++ b/spec/lib/gitlab/instrumentation_helper_spec.rb
@@ -77,6 +77,27 @@ RSpec.describe Gitlab::InstrumentationHelper do
end
end
+ context 'rate-limiting gates' do
+ context 'when the request did not pass through any rate-limiting gates' do
+ it 'logs an empty array of gates' do
+ subject
+
+ expect(payload[:rate_limiting_gates]).to eq([])
+ end
+ end
+
+ context 'when the request passed through rate-limiting gates' do
+ it 'logs an array of gates used' do
+ Gitlab::Instrumentation::RateLimitingGates.track(:foo)
+ Gitlab::Instrumentation::RateLimitingGates.track(:bar)
+
+ subject
+
+ expect(payload[:rate_limiting_gates]).to contain_exactly(:foo, :bar)
+ end
+ end
+ end
+
it 'logs cpu_s duration' do
subject
diff --git a/spec/lib/gitlab/jira/middleware_spec.rb b/spec/lib/gitlab/jira/middleware_spec.rb
index 1fe22b145a6..e7a79e40ac5 100644
--- a/spec/lib/gitlab/jira/middleware_spec.rb
+++ b/spec/lib/gitlab/jira/middleware_spec.rb
@@ -23,8 +23,8 @@ RSpec.describe Gitlab::Jira::Middleware do
describe '#call' do
it 'adjusts HTTP_AUTHORIZATION env when request from Jira DVCS user agent' do
- expect(app).to receive(:call).with('HTTP_USER_AGENT' => jira_user_agent,
- 'HTTP_AUTHORIZATION' => 'Bearer hash-123')
+ expect(app).to receive(:call).with({ 'HTTP_USER_AGENT' => jira_user_agent,
+ 'HTTP_AUTHORIZATION' => 'Bearer hash-123' })
middleware.call('HTTP_USER_AGENT' => jira_user_agent, 'HTTP_AUTHORIZATION' => 'token hash-123')
end
diff --git a/spec/lib/gitlab/json_cache_spec.rb b/spec/lib/gitlab/json_cache_spec.rb
index d7d28a94cfe..f4f6624bae9 100644
--- a/spec/lib/gitlab/json_cache_spec.rb
+++ b/spec/lib/gitlab/json_cache_spec.rb
@@ -313,9 +313,9 @@ RSpec.describe Gitlab::JsonCache do
it 'passes options the underlying cache implementation' do
expect(backend).to receive(:write)
- .with(expanded_key, "true", expires_in: 15.seconds)
+ .with(expanded_key, "true", { expires_in: 15.seconds })
- cache.fetch(key, expires_in: 15.seconds) { true }
+ cache.fetch(key, { expires_in: 15.seconds }) { true }
end
context 'when the given key does not exist in the cache' do
diff --git a/spec/lib/gitlab/json_spec.rb b/spec/lib/gitlab/json_spec.rb
index 5ffe736da54..7c093049e18 100644
--- a/spec/lib/gitlab/json_spec.rb
+++ b/spec/lib/gitlab/json_spec.rb
@@ -290,7 +290,7 @@ RSpec.describe Gitlab::Json do
end
it "skips legacy mode handling" do
- expect(Feature).not_to receive(:enabled?).with(:json_wrapper_legacy_mode, default_enabled: true)
+ expect(Feature).not_to receive(:enabled?).with(:json_wrapper_legacy_mode)
subject.send(:handle_legacy_mode!, {})
end
diff --git a/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb b/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb
deleted file mode 100644
index ec1f46100a4..00000000000
--- a/spec/lib/gitlab/kubernetes/cilium_network_policy_spec.rb
+++ /dev/null
@@ -1,274 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Kubernetes::CiliumNetworkPolicy do
- let(:policy) do
- described_class.new(
- name: name,
- namespace: namespace,
- description: description,
- selector: selector,
- ingress: ingress,
- egress: egress,
- labels: labels,
- resource_version: resource_version,
- annotations: annotations
- )
- end
-
- let(:resource) do
- ::Kubeclient::Resource.new(
- apiVersion: Gitlab::Kubernetes::CiliumNetworkPolicy::API_VERSION,
- kind: Gitlab::Kubernetes::CiliumNetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace, resourceVersion: resource_version, annotations: annotations },
- spec: { endpointSelector: endpoint_selector, ingress: ingress, egress: egress },
- description: description
- )
- end
-
- let(:selector) { endpoint_selector }
- let(:labels) { nil }
- let(:name) { 'example-name' }
- let(:namespace) { 'example-namespace' }
- let(:endpoint_selector) { { matchLabels: { role: 'db' } } }
- let(:description) { 'example-description' }
- let(:partial_class_name) { described_class.name.split('::').last }
- let(:resource_version) { 101 }
- let(:annotations) { { 'app.gitlab.com/alert': 'true' } }
- let(:ingress) do
- [
- {
- fromEndpoints: [
- { matchLabels: { project: 'myproject' } }
- ]
- }
- ]
- end
-
- let(:egress) do
- [
- {
- ports: [{ port: 5978 }]
- }
- ]
- end
-
- include_examples 'network policy common specs'
-
- describe '.from_yaml' do
- let(:manifest) do
- <<~POLICY
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- description: example-description
- metadata:
- name: example-name
- namespace: example-namespace
- resourceVersion: 101
- annotations:
- app.gitlab.com/alert: "true"
- spec:
- endpointSelector:
- matchLabels:
- role: db
- ingress:
- - fromEndpoints:
- - matchLabels:
- project: myproject
- egress:
- - ports:
- - port: 5978
- POLICY
- end
-
- subject { Gitlab::Kubernetes::CiliumNetworkPolicy.from_yaml(manifest)&.generate }
-
- it { is_expected.to eq(resource) }
-
- context 'with nil manifest' do
- let(:manifest) { nil }
-
- it { is_expected.to be_nil }
- end
-
- context 'with invalid manifest' do
- let(:manifest) { "\tfoo: bar" }
-
- it { is_expected.to be_nil }
- end
-
- context 'with manifest without metadata' do
- let(:manifest) do
- <<~POLICY
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- spec:
- endpointSelector:
- matchLabels:
- role: db
- ingress:
- - fromEndpoints:
- matchLabels:
- project: myproject
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with manifest without spec' do
- let(:manifest) do
- <<~POLICY
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- metadata:
- name: example-name
- namespace: example-namespace
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with disallowed class' do
- let(:manifest) do
- <<~POLICY
- apiVersion: cilium.io/v2
- kind: CiliumNetworkPolicy
- metadata:
- name: example-name
- namespace: example-namespace
- creationTimestamp: 2020-04-14T00:08:30Z
- spec:
- endpointSelector:
- matchLabels:
- role: db
- ingress:
- - fromEndpoints:
- matchLabels:
- project: myproject
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
- end
-
- describe '.from_resource' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- description: description,
- metadata: {
- name: name, namespace: namespace, creationTimestamp: '2020-04-14T00:08:30Z',
- labels: { app: 'foo' }, resourceVersion: resource_version, annotations: annotations
- },
- spec: { endpointSelector: endpoint_selector, ingress: ingress, egress: nil, labels: nil }
- )
- end
-
- let(:generated_resource) do
- ::Kubeclient::Resource.new(
- apiVersion: Gitlab::Kubernetes::CiliumNetworkPolicy::API_VERSION,
- kind: Gitlab::Kubernetes::CiliumNetworkPolicy::KIND,
- description: description,
- metadata: { name: name, namespace: namespace, resourceVersion: resource_version, labels: { app: 'foo' }, annotations: annotations },
- spec: { endpointSelector: endpoint_selector, ingress: ingress }
- )
- end
-
- subject { Gitlab::Kubernetes::CiliumNetworkPolicy.from_resource(resource)&.generate }
-
- it { is_expected.to eq(generated_resource) }
-
- context 'with nil resource' do
- let(:resource) { nil }
-
- it { is_expected.to be_nil }
- end
-
- context 'with resource without metadata' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- spec: { endpointSelector: endpoint_selector, ingress: ingress, egress: nil, labels: nil }
- )
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with resource without spec' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- metadata: { name: name, namespace: namespace, uid: '128cf288-7de4-11ea-aceb-42010a800089', resourceVersion: resource_version }
- )
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with environment_ids' do
- subject { Gitlab::Kubernetes::CiliumNetworkPolicy.from_resource(resource, [1, 2, 3]) }
-
- it 'includes environment_ids in as_json result' do
- expect(subject.as_json).to include(environment_ids: [1, 2, 3])
- end
- end
- end
-
- describe '#resource' do
- subject { policy.resource }
-
- let(:resource) do
- {
- apiVersion: Gitlab::Kubernetes::CiliumNetworkPolicy::API_VERSION,
- kind: Gitlab::Kubernetes::CiliumNetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace, resourceVersion: resource_version, annotations: annotations },
- spec: { endpointSelector: endpoint_selector, ingress: ingress, egress: egress },
- description: description
- }
- end
-
- it { is_expected.to eq(resource) }
-
- context 'with labels' do
- let(:labels) { { app: 'foo' } }
-
- before do
- resource[:metadata][:labels] = { app: 'foo' }
- end
-
- it { is_expected.to eq(resource) }
- end
-
- context 'without resource_version' do
- let(:resource_version) { nil }
-
- before do
- resource[:metadata].delete(:resourceVersion)
- end
-
- it { is_expected.to eq(resource) }
- end
-
- context 'with nil egress' do
- let(:egress) { nil }
-
- before do
- resource[:spec].delete(:egress)
- end
-
- it { is_expected.to eq(resource) }
- end
-
- context 'without annotations' do
- let(:annotations) { nil }
-
- before do
- resource[:metadata].delete(:annotations)
- end
-
- it { is_expected.to eq(resource) }
- end
- end
-end
diff --git a/spec/lib/gitlab/kubernetes/kube_client_spec.rb b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
index 521f13dc9cc..dfd5092b54d 100644
--- a/spec/lib/gitlab/kubernetes/kube_client_spec.rb
+++ b/spec/lib/gitlab/kubernetes/kube_client_spec.rb
@@ -227,20 +227,6 @@ RSpec.describe Gitlab::Kubernetes::KubeClient do
end
end
- describe '#cilium_networking_client' do
- subject { client.cilium_networking_client }
-
- it_behaves_like 'a Kubeclient'
-
- it 'has the cilium API group endpoint' do
- expect(subject.api_endpoint.to_s).to match(%r{\/apis\/cilium.io\Z})
- end
-
- it 'has the api_version' do
- expect(subject.instance_variable_get(:@api_version)).to eq('v2')
- end
- end
-
describe '#metrics_client' do
subject { client.metrics_client }
@@ -428,56 +414,6 @@ RSpec.describe Gitlab::Kubernetes::KubeClient do
end
end
- describe 'networking API group' do
- let(:networking_client) { client.networking_client }
-
- [
- :create_network_policy,
- :get_network_policies,
- :get_network_policy,
- :update_network_policy,
- :delete_network_policy
- ].each do |method|
- describe "##{method}" do
- include_examples 'redirection not allowed', method
- include_examples 'dns rebinding not allowed', method
-
- it 'delegates to the networking client' do
- expect(client).to delegate_method(method).to(:networking_client)
- end
-
- it 'responds to the method' do
- expect(client).to respond_to method
- end
- end
- end
- end
-
- describe 'cilium API group' do
- let(:cilium_networking_client) { client.cilium_networking_client }
-
- [
- :create_cilium_network_policy,
- :get_cilium_network_policies,
- :get_cilium_network_policy,
- :update_cilium_network_policy,
- :delete_cilium_network_policy
- ].each do |method|
- describe "##{method}" do
- include_examples 'redirection not allowed', method
- include_examples 'dns rebinding not allowed', method
-
- it 'delegates to the cilium client' do
- expect(client).to delegate_method(method).to(:cilium_networking_client)
- end
-
- it 'responds to the method' do
- expect(client).to respond_to method
- end
- end
- end
- end
-
describe 'non-entity methods' do
it 'does not proxy for non-entity methods' do
expect(client).not_to respond_to :proxy_url
diff --git a/spec/lib/gitlab/kubernetes/network_policy_spec.rb b/spec/lib/gitlab/kubernetes/network_policy_spec.rb
deleted file mode 100644
index 2cba37a1302..00000000000
--- a/spec/lib/gitlab/kubernetes/network_policy_spec.rb
+++ /dev/null
@@ -1,235 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Kubernetes::NetworkPolicy do
- let(:policy) do
- described_class.new(
- name: name,
- namespace: namespace,
- selector: selector,
- ingress: ingress,
- labels: labels
- )
- end
-
- let(:resource) do
- ::Kubeclient::Resource.new(
- kind: Gitlab::Kubernetes::NetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace },
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- )
- end
-
- let(:selector) { pod_selector }
- let(:labels) { nil }
- let(:name) { 'example-name' }
- let(:namespace) { 'example-namespace' }
- let(:pod_selector) { { matchLabels: { role: 'db' } } }
-
- let(:ingress) do
- [
- {
- from: [
- { namespaceSelector: { matchLabels: { project: 'myproject' } } }
- ]
- }
- ]
- end
-
- let(:egress) do
- [
- {
- ports: [{ port: 5978 }]
- }
- ]
- end
-
- include_examples 'network policy common specs'
-
- describe '.from_yaml' do
- let(:manifest) do
- <<~POLICY
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: example-name
- namespace: example-namespace
- spec:
- podSelector:
- matchLabels:
- role: db
- policyTypes:
- - Ingress
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- project: myproject
- POLICY
- end
-
- subject { Gitlab::Kubernetes::NetworkPolicy.from_yaml(manifest)&.generate }
-
- it { is_expected.to eq(resource) }
-
- context 'with nil manifest' do
- let(:manifest) { nil }
-
- it { is_expected.to be_nil }
- end
-
- context 'with invalid manifest' do
- let(:manifest) { "\tfoo: bar" }
-
- it { is_expected.to be_nil }
- end
-
- context 'with manifest without metadata' do
- let(:manifest) do
- <<~POLICY
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- spec:
- podSelector:
- matchLabels:
- role: db
- policyTypes:
- - Ingress
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- project: myproject
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with manifest without spec' do
- let(:manifest) do
- <<~POLICY
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: example-name
- namespace: example-namespace
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with disallowed class' do
- let(:manifest) do
- <<~POLICY
- apiVersion: networking.k8s.io/v1
- kind: NetworkPolicy
- metadata:
- name: example-name
- namespace: example-namespace
- creationTimestamp: 2020-04-14T00:08:30Z
- spec:
- podSelector:
- matchLabels:
- role: db
- policyTypes:
- - Ingress
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- project: myproject
- POLICY
- end
-
- it { is_expected.to be_nil }
- end
- end
-
- describe '.from_resource' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- metadata: {
- name: name, namespace: namespace, creationTimestamp: '2020-04-14T00:08:30Z',
- labels: { app: 'foo' }, resourceVersion: '4990'
- },
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- )
- end
-
- let(:generated_resource) do
- ::Kubeclient::Resource.new(
- kind: Gitlab::Kubernetes::NetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace, labels: { app: 'foo' } },
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- )
- end
-
- subject { Gitlab::Kubernetes::NetworkPolicy.from_resource(resource)&.generate }
-
- it { is_expected.to eq(generated_resource) }
-
- context 'with nil resource' do
- let(:resource) { nil }
-
- it { is_expected.to be_nil }
- end
-
- context 'with resource without metadata' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- )
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with resource without spec' do
- let(:resource) do
- ::Kubeclient::Resource.new(
- metadata: { name: name, namespace: namespace, uid: '128cf288-7de4-11ea-aceb-42010a800089', resourceVersion: '4990' }
- )
- end
-
- it { is_expected.to be_nil }
- end
-
- context 'with environment_ids' do
- subject { Gitlab::Kubernetes::NetworkPolicy.from_resource(resource, [1, 2, 3]) }
-
- it 'includes environment_ids in as_json result' do
- expect(subject.as_json).to include(environment_ids: [1, 2, 3])
- end
- end
- end
-
- describe '#resource' do
- subject { policy.resource }
-
- let(:resource) do
- {
- kind: Gitlab::Kubernetes::NetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace },
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- }
- end
-
- it { is_expected.to eq(resource) }
-
- context 'with labels' do
- let(:labels) { { app: 'foo' } }
- let(:resource) do
- {
- kind: Gitlab::Kubernetes::NetworkPolicy::KIND,
- metadata: { name: name, namespace: namespace, labels: { app: 'foo' } },
- spec: { podSelector: pod_selector, policyTypes: %w(Ingress), ingress: ingress, egress: nil }
- }
- end
-
- it { is_expected.to eq(resource) }
- end
- end
-end
diff --git a/spec/lib/gitlab/legacy_github_import/importer_spec.rb b/spec/lib/gitlab/legacy_github_import/importer_spec.rb
index 9a4d7bd996e..e69edbe6dc0 100644
--- a/spec/lib/gitlab/legacy_github_import/importer_spec.rb
+++ b/spec/lib/gitlab/legacy_github_import/importer_spec.rb
@@ -274,8 +274,7 @@ RSpec.describe Gitlab::LegacyGithubImport::Importer do
it 'instantiates a Client' do
allow(project).to receive(:import_data).and_return(double(credentials: credentials))
expect(Gitlab::LegacyGithubImport::Client).to receive(:new).with(
- credentials[:user],
- **{}
+ credentials[:user]
)
subject.client
diff --git a/spec/lib/gitlab/lograge/custom_options_spec.rb b/spec/lib/gitlab/lograge/custom_options_spec.rb
index d8f351bb8a3..58b05be6ff9 100644
--- a/spec/lib/gitlab/lograge/custom_options_spec.rb
+++ b/spec/lib/gitlab/lograge/custom_options_spec.rb
@@ -96,23 +96,15 @@ RSpec.describe Gitlab::Lograge::CustomOptions do
end
end
- context 'when feature flags are present', :request_store do
+ context 'when feature flags are present', :request_store do
before do
allow(Feature).to receive(:log_feature_flag_states?).and_return(false)
- definitions = {}
[:enabled_feature, :disabled_feature].each do |flag_name|
- definitions[flag_name] = Feature::Definition.new("development/enabled_feature.yml",
- name: flag_name,
- type: 'development',
- log_state_changes: true,
- default_enabled: false)
-
+ stub_feature_flag_definition(flag_name, log_state_changes: true)
allow(Feature).to receive(:log_feature_flag_states?).with(flag_name).and_call_original
end
- allow(Feature::Definition).to receive(:definitions).and_return(definitions)
-
Feature.enable(:enabled_feature)
Feature.disable(:disabled_feature)
end
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 98385cd80cc..d22bef5bda9 100644
--- a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
+++ b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
@@ -171,9 +171,9 @@ RSpec.describe Gitlab::MarkdownCache::ActiveRecord::Extension do
expect(thing).to receive(:persisted?).and_return(true)
expect(thing).to receive(:update_columns)
- .with("title_html" => updated_html,
+ .with({ "title_html" => updated_html,
"description_html" => "",
- "cached_markdown_version" => cache_version)
+ "cached_markdown_version" => cache_version })
thing.refresh_markdown_cache!
end
diff --git a/spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb b/spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb
index ff8f5797f9d..c15e717b126 100644
--- a/spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb
+++ b/spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb
@@ -12,12 +12,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Importers::PrometheusMetrics do
subject { described_class.new(dashboard_hash, project: project, dashboard_path: dashboard_path) }
- before do
- allow_next_instance_of(::Clusters::Applications::ScheduleUpdateService) do |update_service|
- allow(update_service).to receive(:execute)
- end
- end
-
context 'valid dashboard' do
let(:dashboard_hash) { load_sample_dashboard }
@@ -45,13 +39,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Importers::PrometheusMetrics do
create(:prometheus_metric, existing_metric_attributes)
end
- let!(:existing_alert) do
- alert = create(:prometheus_alert, project: project, prometheus_metric: existing_metric)
- existing_metric.prometheus_alerts << alert
-
- alert
- end
-
it 'updates existing PrometheusMetrics' do
subject.execute
@@ -68,15 +55,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Importers::PrometheusMetrics do
expect { subject.execute }.to change { PrometheusMetric.count }.by(2)
end
- it 'updates affected environments' do
- expect(::Clusters::Applications::ScheduleUpdateService).to receive(:new).with(
- existing_alert.environment.cluster_prometheus_adapter,
- project
- ).and_return(double('ScheduleUpdateService', execute: true))
-
- subject.execute
- end
-
context 'with stale metrics' do
let!(:stale_metric) do
create(:prometheus_metric,
@@ -87,13 +65,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Importers::PrometheusMetrics do
)
end
- let!(:stale_alert) do
- alert = create(:prometheus_alert, project: project, prometheus_metric: stale_metric)
- stale_metric.prometheus_alerts << alert
-
- alert
- end
-
it 'updates existing PrometheusMetrics' do
subject.execute
@@ -111,21 +82,6 @@ RSpec.describe Gitlab::Metrics::Dashboard::Importers::PrometheusMetrics do
expect { stale_metric.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
-
- it 'deletes stale alert' do
- subject.execute
-
- expect { stale_alert.reload }.to raise_error(ActiveRecord::RecordNotFound)
- end
-
- it 'updates affected environments' do
- expect(::Clusters::Applications::ScheduleUpdateService).to receive(:new).with(
- existing_alert.environment.cluster_prometheus_adapter,
- project
- ).and_return(double('ScheduleUpdateService', execute: true))
-
- subject.execute
- 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 c7afc02f0af..66fba7ab683 100644
--- a/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
+++ b/spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb
@@ -152,8 +152,6 @@ RSpec.describe Gitlab::Metrics::Exporter::BaseExporter do
where(:method_class, :path, :http_status) do
Net::HTTP::Get | '/metrics' | 200
- Net::HTTP::Get | '/liveness' | 200
- Net::HTTP::Get | '/readiness' | 200
Net::HTTP::Get | '/' | 404
end
diff --git a/spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb b/spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb
deleted file mode 100644
index 9ee46a45e7a..00000000000
--- a/spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-
-RSpec.describe Gitlab::Metrics::Exporter::HealthChecksMiddleware do
- let(:app) { double(:app) }
- let(:env) { { 'PATH_INFO' => path } }
-
- let(:readiness_probe) { double(:readiness_probe) }
- let(:liveness_probe) { double(:liveness_probe) }
- let(:probe_result) { Gitlab::HealthChecks::Probes::Status.new(200, { status: 'ok' }) }
-
- subject(:middleware) { described_class.new(app, readiness_probe, liveness_probe) }
-
- describe '#call' do
- context 'handling /readiness requests' do
- let(:path) { '/readiness' }
-
- it 'handles the request' do
- expect(readiness_probe).to receive(:execute).and_return(probe_result)
-
- response = middleware.call(env)
-
- expect(response).to eq([200, { 'Content-Type' => 'application/json; charset=utf-8' }, ['{"status":"ok"}']])
- end
- end
-
- context 'handling /liveness requests' do
- let(:path) { '/liveness' }
-
- it 'handles the request' do
- expect(liveness_probe).to receive(:execute).and_return(probe_result)
-
- response = middleware.call(env)
-
- expect(response).to eq([200, { 'Content-Type' => 'application/json; charset=utf-8' }, ['{"status":"ok"}']])
- end
- end
-
- context 'handling other requests' do
- let(:path) { '/other_path' }
-
- it 'forwards them to the next middleware' do
- expect(app).to receive(:call).with(env).and_return([201, {}, []])
-
- response = middleware.call(env)
-
- expect(response).to eq([201, {}, []])
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/metrics/methods_spec.rb b/spec/lib/gitlab/metrics/methods_spec.rb
index 71135a6e9c5..eb7c8891e98 100644
--- a/spec/lib/gitlab/metrics/methods_spec.rb
+++ b/spec/lib/gitlab/metrics/methods_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Gitlab::Metrics::Methods do
context 'metric is not cached' do
it 'calls fetch_metric' do
- expect(subject).to receive(:init_metric).with(metric_type, metric_name, docstring: docstring)
+ expect(subject).to receive(:init_metric).with(metric_type, metric_name, { docstring: docstring })
subject.public_send(metric_name)
end
diff --git a/spec/lib/gitlab/metrics/rails_slis_spec.rb b/spec/lib/gitlab/metrics/rails_slis_spec.rb
index 2ba06316507..b30eb57101f 100644
--- a/spec/lib/gitlab/metrics/rails_slis_spec.rb
+++ b/spec/lib/gitlab/metrics/rails_slis_spec.rb
@@ -36,18 +36,8 @@ RSpec.describe Gitlab::Metrics::RailsSlis do
}
end
- expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:rails_request_apdex) { false }
- expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:graphql_query_apdex) { false }
- expect(Gitlab::Metrics::Sli).to receive(:initialize_sli).with(:rails_request_apdex, array_including(*possible_labels)).and_call_original
- expect(Gitlab::Metrics::Sli).to receive(:initialize_sli).with(:graphql_query_apdex, array_including(*possible_graphql_labels)).and_call_original
-
- described_class.initialize_request_slis!
- end
-
- it 'does not initialize the SLI if they were initialized already', :aggregate_failures do
- expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:rails_request_apdex) { true }
- expect(Gitlab::Metrics::Sli).to receive(:initialized?).with(:graphql_query_apdex) { true }
- expect(Gitlab::Metrics::Sli).not_to receive(:initialize_sli)
+ expect(Gitlab::Metrics::Sli::Apdex).to receive(:initialize_sli).with(:rails_request, array_including(*possible_labels)).and_call_original
+ expect(Gitlab::Metrics::Sli::Apdex).to receive(:initialize_sli).with(:graphql_query, array_including(*possible_graphql_labels)).and_call_original
described_class.initialize_request_slis!
end
diff --git a/spec/lib/gitlab/metrics/sli_spec.rb b/spec/lib/gitlab/metrics/sli_spec.rb
index 8ba4bf29568..9b776d6738d 100644
--- a/spec/lib/gitlab/metrics/sli_spec.rb
+++ b/spec/lib/gitlab/metrics/sli_spec.rb
@@ -10,72 +10,151 @@ RSpec.describe Gitlab::Metrics::Sli do
end
describe 'Class methods' do
- before do
- described_class.instance_variable_set(:@known_slis, nil)
+ it 'does not allow them to be called on the parent module' do
+ expect(described_class).not_to respond_to(:[])
+ expect(described_class).not_to respond_to(:initialize_sli)
end
- describe '.[]' do
- it 'warns about an uninitialized SLI but returns and stores a new one' do
- sli = described_class[:bar]
+ it 'allows different SLIs to be defined on each subclass' do
+ apdex_counters = [
+ fake_total_counter('foo', 'apdex'),
+ fake_numerator_counter('foo', 'apdex', 'success')
+ ]
- expect(described_class[:bar]).to be(sli)
- end
+ error_rate_counters = [
+ fake_total_counter('foo', 'error_rate'),
+ fake_numerator_counter('foo', 'error_rate', 'error')
+ ]
- it 'returns the same object for multiple accesses' do
- sli = described_class.initialize_sli(:huzzah, [])
+ apdex = described_class::Apdex.initialize_sli(:foo, [{ hello: :world }])
- 2.times do
- expect(described_class[:huzzah]).to be(sli)
- end
- end
- end
+ expect(apdex_counters).to all(have_received(:get).with(hello: :world))
- describe '.initialized?' do
- before do
- fake_total_counter(:boom)
- fake_success_counter(:boom)
- end
+ error_rate = described_class::ErrorRate.initialize_sli(:foo, [{ other: :labels }])
- it 'is true when an SLI was initialized with labels' do
- expect { described_class.initialize_sli(:boom, [{ hello: :world }]) }
- .to change { described_class.initialized?(:boom) }.from(false).to(true)
- end
+ expect(error_rate_counters).to all(have_received(:get).with(other: :labels))
- it 'is false when an SLI was not initialized with labels' do
- expect { described_class.initialize_sli(:boom, []) }
- .not_to change { described_class.initialized?(:boom) }.from(false)
- end
+ expect(described_class::Apdex[:foo]).to be(apdex)
+ expect(described_class::ErrorRate[:foo]).to be(error_rate)
end
end
- describe '#initialize_counters' do
- it 'initializes counters for the passed label combinations' do
- counters = [fake_total_counter(:hey), fake_success_counter(:hey)]
+ subclasses = {
+ Gitlab::Metrics::Sli::Apdex => :success,
+ Gitlab::Metrics::Sli::ErrorRate => :error
+ }
- described_class.new(:hey).initialize_counters([{ foo: 'bar' }, { foo: 'baz' }])
+ subclasses.each do |subclass, numerator_type|
+ subclass_type = subclass.to_s.demodulize.underscore
- expect(counters).to all(have_received(:get).with({ foo: 'bar' }))
- expect(counters).to all(have_received(:get).with({ foo: 'baz' }))
- end
- end
+ describe subclass do
+ describe 'Class methods' do
+ before do
+ described_class.instance_variable_set(:@known_slis, nil)
+ end
- describe "#increment" do
- let!(:sli) { described_class.new(:heyo) }
- let!(:total_counter) { fake_total_counter(:heyo) }
- let!(:success_counter) { fake_success_counter(:heyo) }
+ describe '.[]' do
+ it 'returns and stores a new, uninitialized SLI' do
+ sli = described_class[:bar]
- it 'increments both counters for labels successes' do
- sli.increment(labels: { hello: "world" }, success: true)
+ expect(described_class[:bar]).to be(sli)
+ expect(described_class[:bar]).not_to be_initialized
+ end
- expect(total_counter).to have_received(:increment).with({ hello: 'world' })
- expect(success_counter).to have_received(:increment).with({ hello: 'world' })
- end
+ it 'returns the same object for multiple accesses' do
+ sli = described_class.initialize_sli(:huzzah, [])
+
+ 2.times do
+ expect(described_class[:huzzah]).to be(sli)
+ end
+ end
+ end
+
+ describe '.initialize_sli' do
+ it 'returns and stores a new initialized SLI' do
+ counters = [
+ fake_total_counter(:bar, subclass_type),
+ fake_numerator_counter(:bar, subclass_type, numerator_type)
+ ]
+
+ sli = described_class.initialize_sli(:bar, [{ hello: :world }])
+
+ expect(sli).to be_initialized
+ expect(counters).to all(have_received(:get).with(hello: :world))
+ expect(counters).to all(have_received(:get).with(hello: :world))
+ end
+
+ it 'does not change labels for an already-initialized SLI' do
+ counters = [
+ fake_total_counter(:bar, subclass_type),
+ fake_numerator_counter(:bar, subclass_type, numerator_type)
+ ]
+
+ sli = described_class.initialize_sli(:bar, [{ hello: :world }])
- it 'only increments the total counters for labels when not successful' do
- sli.increment(labels: { hello: "world" }, success: false)
+ expect(sli).to be_initialized
+ expect(counters).to all(have_received(:get).with(hello: :world))
+ expect(counters).to all(have_received(:get).with(hello: :world))
- expect(total_counter).to have_received(:increment).with({ hello: 'world' })
- expect(success_counter).not_to have_received(:increment).with({ hello: 'world' })
+ counters.each do |counter|
+ expect(counter).not_to receive(:get)
+ end
+
+ expect(described_class.initialize_sli(:bar, [{ other: :labels }])).to eq(sli)
+ end
+ end
+
+ describe '.initialized?' do
+ before do
+ fake_total_counter(:boom, subclass_type)
+ fake_numerator_counter(:boom, subclass_type, numerator_type)
+ end
+
+ it 'is true when an SLI was initialized with labels' do
+ expect { described_class.initialize_sli(:boom, [{ hello: :world }]) }
+ .to change { described_class.initialized?(:boom) }.from(false).to(true)
+ end
+
+ it 'is false when an SLI was not initialized with labels' do
+ expect { described_class.initialize_sli(:boom, []) }
+ .not_to change { described_class.initialized?(:boom) }.from(false)
+ end
+ end
+ end
+
+ describe '#initialize_counters' do
+ it 'initializes counters for the passed label combinations' do
+ counters = [
+ fake_total_counter(:hey, subclass_type),
+ fake_numerator_counter(:hey, subclass_type, numerator_type)
+ ]
+
+ described_class.new(:hey).initialize_counters([{ foo: 'bar' }, { foo: 'baz' }])
+
+ expect(counters).to all(have_received(:get).with({ foo: 'bar' }))
+ expect(counters).to all(have_received(:get).with({ foo: 'baz' }))
+ end
+ end
+
+ describe "#increment" do
+ let!(:sli) { described_class.new(:heyo) }
+ let!(:total_counter) { fake_total_counter(:heyo, subclass_type) }
+ let!(:numerator_counter) { fake_numerator_counter(:heyo, subclass_type, numerator_type) }
+
+ it "increments both counters for labels when #{numerator_type} is true" do
+ sli.increment(labels: { hello: "world" }, numerator_type => true)
+
+ expect(total_counter).to have_received(:increment).with({ hello: 'world' })
+ expect(numerator_counter).to have_received(:increment).with({ hello: 'world' })
+ end
+
+ it "only increments the total counters for labels when #{numerator_type} is false" do
+ sli.increment(labels: { hello: "world" }, numerator_type => false)
+
+ expect(total_counter).to have_received(:increment).with({ hello: 'world' })
+ expect(numerator_counter).not_to have_received(:increment).with({ hello: 'world' })
+ end
+ end
end
end
@@ -89,11 +168,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, type)
+ fake_prometheus_counter("gitlab_sli:#{name}_#{type}:total")
end
- def fake_success_counter(name)
- fake_prometheus_counter("gitlab_sli:#{name}:success_total")
+ def fake_numerator_counter(name, type, numerator_name)
+ fake_prometheus_counter("gitlab_sli:#{name}_#{type}:#{numerator_name}_total")
end
end
diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
index 389b0ef1044..28c3ef229ab 100644
--- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
@@ -10,6 +10,124 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
let(:connection) { ActiveRecord::Base.retrieve_connection }
let(:db_config_name) { ::Gitlab::Database.db_config_name(connection) }
+ describe '.load_balancing_metric_counter_keys' do
+ context 'multiple databases' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'has expected keys' do
+ expect(described_class.load_balancing_metric_counter_keys).to include(
+ :db_replica_count,
+ :db_primary_count,
+ :db_main_count,
+ :db_main_replica_count,
+ :db_ci_count,
+ :db_ci_replica_count,
+ :db_replica_cached_count,
+ :db_primary_cached_count,
+ :db_main_cached_count,
+ :db_main_replica_cached_count,
+ :db_ci_cached_count,
+ :db_ci_replica_cached_count,
+ :db_replica_wal_count,
+ :db_primary_wal_count,
+ :db_main_wal_count,
+ :db_main_replica_wal_count,
+ :db_ci_wal_count,
+ :db_ci_replica_wal_count,
+ :db_replica_wal_cached_count,
+ :db_primary_wal_cached_count,
+ :db_main_wal_cached_count,
+ :db_main_replica_wal_cached_count,
+ :db_ci_wal_cached_count,
+ :db_ci_replica_wal_cached_count
+ )
+ end
+ end
+
+ context 'single database' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
+ it 'has expected keys' do
+ expect(described_class.load_balancing_metric_counter_keys).to include(
+ :db_replica_count,
+ :db_primary_count,
+ :db_main_count,
+ :db_main_replica_count,
+ :db_replica_cached_count,
+ :db_primary_cached_count,
+ :db_main_cached_count,
+ :db_main_replica_cached_count,
+ :db_replica_wal_count,
+ :db_primary_wal_count,
+ :db_main_wal_count,
+ :db_main_replica_wal_count,
+ :db_replica_wal_cached_count,
+ :db_primary_wal_cached_count,
+ :db_main_wal_cached_count,
+ :db_main_replica_wal_cached_count
+ )
+ end
+
+ it 'does not have ci keys' do
+ expect(described_class.load_balancing_metric_counter_keys).not_to include(
+ :db_ci_count,
+ :db_ci_replica_count,
+ :db_ci_cached_count,
+ :db_ci_replica_cached_count,
+ :db_ci_wal_count,
+ :db_ci_replica_wal_count,
+ :db_ci_wal_cached_count,
+ :db_ci_replica_wal_cached_count
+ )
+ end
+ end
+ end
+
+ describe '.load_balancing_metric_duration_keys' do
+ context 'multiple databases' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'has expected keys' do
+ expect(described_class.load_balancing_metric_duration_keys).to include(
+ :db_replica_duration_s,
+ :db_primary_duration_s,
+ :db_main_duration_s,
+ :db_main_replica_duration_s,
+ :db_ci_duration_s,
+ :db_ci_replica_duration_s
+ )
+ end
+ end
+
+ context 'single database' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
+ it 'has expected keys' do
+ expect(described_class.load_balancing_metric_duration_keys).to include(
+ :db_replica_duration_s,
+ :db_primary_duration_s,
+ :db_main_duration_s,
+ :db_main_replica_duration_s
+ )
+ end
+
+ it 'does not have ci keys' do
+ expect(described_class.load_balancing_metric_duration_keys).not_to include(
+ :db_ci_duration_s,
+ :db_ci_replica_duration_s
+ )
+ end
+ end
+ end
+
describe '#transaction' do
let(:web_transaction) { double('Gitlab::Metrics::WebTransaction') }
let(:background_transaction) { double('Gitlab::Metrics::WebTransaction') }
@@ -37,7 +155,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
it 'captures the metrics for web only' do
- expect(web_transaction).to receive(:observe).with(:gitlab_database_transaction_seconds, 0.23, db_config_name: db_config_name)
+ expect(web_transaction).to receive(:observe).with(:gitlab_database_transaction_seconds, 0.23, { db_config_name: db_config_name })
expect(background_transaction).not_to receive(:observe)
expect(background_transaction).not_to receive(:increment)
@@ -77,7 +195,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::ActiveRecord do
end
it 'captures the metrics for web only' do
- expect(background_transaction).to receive(:observe).with(:gitlab_database_transaction_seconds, 0.23, db_config_name: db_config_name)
+ expect(background_transaction).to receive(:observe).with(:gitlab_database_transaction_seconds, 0.23, { db_config_name: db_config_name })
expect(web_transaction).not_to receive(:observe)
expect(web_transaction).not_to receive(:increment)
diff --git a/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb b/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
index fda4b94bd78..9f939d0d7d6 100644
--- a/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
+++ b/spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb
@@ -77,8 +77,8 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
end
it 'logs request information' do
- expect(Gitlab::AuthLogger).to receive(:error).with(
- include(
+ expect(Gitlab::AuthLogger).to receive(:error) do |arguments|
+ expect(arguments).to include(
message: 'Rack_Attack',
env: match_type,
remote_ip: '1.2.3.4',
@@ -86,7 +86,14 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
path: '/api/v4/internal/authorized_keys',
matched: 'throttle_unauthenticated'
)
- )
+
+ if expected_status
+ expect(arguments).to include(status: expected_status)
+ else
+ expect(arguments).not_to have_key(:status)
+ end
+ end
+
subscriber.send(match_type, event)
end
end
@@ -111,8 +118,8 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
end
it 'logs request information and user id' do
- expect(Gitlab::AuthLogger).to receive(:error).with(
- include(
+ expect(Gitlab::AuthLogger).to receive(:error) do |arguments|
+ expect(arguments).to include(
message: 'Rack_Attack',
env: match_type,
remote_ip: '1.2.3.4',
@@ -121,7 +128,14 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
matched: 'throttle_authenticated_api',
user_id: non_existing_record_id
)
- )
+
+ if expected_status
+ expect(arguments).to include(status: expected_status)
+ else
+ expect(arguments).not_to have_key(:status)
+ end
+ end
+
subscriber.send(match_type, event)
end
end
@@ -145,8 +159,8 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
end
it 'logs request information and user meta' do
- expect(Gitlab::AuthLogger).to receive(:error).with(
- include(
+ expect(Gitlab::AuthLogger).to receive(:error) do |arguments|
+ expect(arguments).to include(
message: 'Rack_Attack',
env: match_type,
remote_ip: '1.2.3.4',
@@ -156,7 +170,14 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
user_id: user.id,
'meta.user' => user.username
)
- )
+
+ if expected_status
+ expect(arguments).to include(status: expected_status)
+ else
+ expect(arguments).not_to have_key(:status)
+ end
+ end
+
subscriber.send(match_type, event)
end
end
@@ -182,8 +203,8 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
end
it 'logs request information and user meta' do
- expect(Gitlab::AuthLogger).to receive(:error).with(
- include(
+ expect(Gitlab::AuthLogger).to receive(:error) do |arguments|
+ expect(arguments).to include(
message: 'Rack_Attack',
env: match_type,
remote_ip: '1.2.3.4',
@@ -192,7 +213,14 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
matched: 'throttle_authenticated_api',
deploy_token_id: deploy_token.id
)
- )
+
+ if expected_status
+ expect(arguments).to include(status: expected_status)
+ else
+ expect(arguments).not_to have_key(:status)
+ end
+ end
+
subscriber.send(match_type, event)
end
end
@@ -202,6 +230,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
describe '#throttle' do
let(:match_type) { :throttle }
+ let(:expected_status) { 429 }
let(:event_name) { 'throttle.rack_attack' }
it_behaves_like 'log into auth logger'
@@ -209,6 +238,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
describe '#blocklist' do
let(:match_type) { :blocklist }
+ let(:expected_status) { 403 }
let(:event_name) { 'blocklist.rack_attack' }
it_behaves_like 'log into auth logger'
@@ -216,6 +246,7 @@ RSpec.describe Gitlab::Metrics::Subscribers::RackAttack, :request_store do
describe '#track' do
let(:match_type) { :track }
+ let(:expected_status) { nil }
let(:event_name) { 'track.rack_attack' }
it_behaves_like 'log into auth logger'
diff --git a/spec/lib/gitlab/patch/database_config_spec.rb b/spec/lib/gitlab/patch/database_config_spec.rb
index d6f36ab86d5..73dc84bb2ef 100644
--- a/spec/lib/gitlab/patch/database_config_spec.rb
+++ b/spec/lib/gitlab/patch/database_config_spec.rb
@@ -34,9 +34,8 @@ RSpec.describe Gitlab::Patch::DatabaseConfig do
end
end
- context 'when a new syntax is used' do
- let(:database_yml) do
- <<-EOS
+ let(:database_yml) do
+ <<-EOS
production:
main:
adapter: postgresql
@@ -68,59 +67,9 @@ RSpec.describe Gitlab::Patch::DatabaseConfig do
prepared_statements: false
variables:
statement_timeout: 15s
- EOS
- end
-
- include_examples 'hash containing main: connection name'
-
- it 'configuration is not legacy one' do
- configuration.database_configuration
-
- expect(configuration.uses_legacy_database_config).to eq(false)
- end
+ EOS
end
- context 'when a legacy syntax is used' do
- let(:database_yml) do
- <<-EOS
- production:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_production
- username: git
- password: "secure password"
- host: localhost
-
- development:
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_development
- username: postgres
- password: "secure password"
- host: localhost
- variables:
- statement_timeout: 15s
-
- test: &test
- adapter: postgresql
- encoding: unicode
- database: gitlabhq_test
- username: postgres
- password:
- host: localhost
- prepared_statements: false
- variables:
- statement_timeout: 15s
- EOS
- end
-
- include_examples 'hash containing main: connection name'
-
- it 'configuration is legacy' do
- configuration.database_configuration
-
- expect(configuration.uses_legacy_database_config).to eq(true)
- end
- end
+ include_examples 'hash containing main: connection name'
end
end
diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb
index e5fa7538515..0a647befb50 100644
--- a/spec/lib/gitlab/path_regex_spec.rb
+++ b/spec/lib/gitlab/path_regex_spec.rb
@@ -183,7 +183,7 @@ RSpec.describe Gitlab::PathRegex do
# We ban new items in this list, see https://gitlab.com/gitlab-org/gitlab/-/issues/215362
it 'does not allow expansion' do
- expect(described_class::TOP_LEVEL_ROUTES.size).to eq(40)
+ expect(described_class::TOP_LEVEL_ROUTES.size).to eq(39)
end
end
diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb
index 8211806a809..0a186b07d19 100644
--- a/spec/lib/gitlab/popen_spec.rb
+++ b/spec/lib/gitlab/popen_spec.rb
@@ -103,7 +103,7 @@ RSpec.describe Gitlab::Popen do
it 'raises error' do
expect do
@klass.new.popen(%w[foobar])
- end.to raise_error
+ end.to raise_error(Errno::ENOENT)
end
end
end
diff --git a/spec/lib/gitlab/process_supervisor_spec.rb b/spec/lib/gitlab/process_supervisor_spec.rb
index 60b127dadda..8356197805c 100644
--- a/spec/lib/gitlab/process_supervisor_spec.rb
+++ b/spec/lib/gitlab/process_supervisor_spec.rb
@@ -6,6 +6,7 @@ RSpec.describe Gitlab::ProcessSupervisor do
let(:health_check_interval_seconds) { 0.1 }
let(:check_terminate_interval_seconds) { 1 }
let(:forwarded_signals) { [] }
+ let(:term_signals) { [] }
let(:process_ids) { [spawn_process, spawn_process] }
def spawn_process
@@ -19,7 +20,8 @@ RSpec.describe Gitlab::ProcessSupervisor do
health_check_interval_seconds: health_check_interval_seconds,
check_terminate_interval_seconds: check_terminate_interval_seconds,
terminate_timeout_seconds: 1 + check_terminate_interval_seconds,
- forwarded_signals: forwarded_signals
+ forwarded_signals: forwarded_signals,
+ term_signals: term_signals
)
end
@@ -29,6 +31,8 @@ RSpec.describe Gitlab::ProcessSupervisor do
rescue Errno::ESRCH
# Ignore if a process wasn't actually alive.
end
+
+ supervisor.stop
end
describe '#supervise' do
@@ -60,7 +64,7 @@ RSpec.describe Gitlab::ProcessSupervisor do
[42] # Fake starting a new process in place of the terminated one.
end
- # Terminate the supervised process.
+ # Terminate a supervised process.
Process.kill('TERM', process_ids.first)
await_condition(sleep_sec: health_check_interval_seconds) do
@@ -71,6 +75,72 @@ RSpec.describe Gitlab::ProcessSupervisor do
expect(Gitlab::ProcessManagement.process_alive?(process_ids.last)).to be(true)
expect(supervisor.supervised_pids).to match_array([process_ids.last, 42])
end
+
+ it 'deduplicates PIDs returned from callback' do
+ expect(Gitlab::ProcessManagement.all_alive?(process_ids)).to be(true)
+ pids_killed = []
+
+ supervisor.supervise(process_ids) do |dead_pids|
+ pids_killed = dead_pids
+ # Fake a new process having the same pid as one that was just terminated.
+ [process_ids.last]
+ end
+
+ # Terminate a supervised process.
+ Process.kill('TERM', process_ids.first)
+
+ await_condition(sleep_sec: health_check_interval_seconds) do
+ pids_killed == [process_ids.first]
+ end
+
+ expect(supervisor.supervised_pids).to contain_exactly(process_ids.last)
+ end
+
+ it 'accepts single PID returned from callback' do
+ expect(Gitlab::ProcessManagement.all_alive?(process_ids)).to be(true)
+ pids_killed = []
+
+ supervisor.supervise(process_ids) do |dead_pids|
+ pids_killed = dead_pids
+ 42
+ end
+
+ # Terminate a supervised process.
+ Process.kill('TERM', process_ids.first)
+
+ await_condition(sleep_sec: health_check_interval_seconds) do
+ pids_killed == [process_ids.first]
+ end
+
+ expect(supervisor.supervised_pids).to contain_exactly(42, process_ids.last)
+ end
+
+ context 'but supervisor has entered shutdown' do
+ it 'does not trigger callback again' do
+ expect(Gitlab::ProcessManagement.all_alive?(process_ids)).to be(true)
+ callback_count = 0
+
+ supervisor.supervise(process_ids) do |dead_pids|
+ callback_count += 1
+
+ Thread.new { supervisor.shutdown }
+
+ [42]
+ end
+
+ # Terminate the supervised processes to trigger more than 1 callback.
+ Process.kill('TERM', process_ids.first)
+ Process.kill('TERM', process_ids.last)
+
+ await_condition(sleep_sec: health_check_interval_seconds * 3) do
+ supervisor.alive == false
+ end
+
+ # Since we shut down the supervisor during the first callback, it should not
+ # be called anymore.
+ expect(callback_count).to eq(1)
+ end
+ end
end
context 'signal handling' do
@@ -82,6 +152,8 @@ RSpec.describe Gitlab::ProcessSupervisor do
end
context 'termination signals' do
+ let(:term_signals) { %i(INT TERM) }
+
context 'when TERM results in timely shutdown of processes' do
it 'forwards them to observed processes without waiting for grace period to expire' do
allow(Gitlab::ProcessManagement).to receive(:any_alive?).and_return(false)
diff --git a/spec/lib/gitlab/query_limiting/transaction_spec.rb b/spec/lib/gitlab/query_limiting/transaction_spec.rb
index 76bb2b4c4cc..27da1f23556 100644
--- a/spec/lib/gitlab/query_limiting/transaction_spec.rb
+++ b/spec/lib/gitlab/query_limiting/transaction_spec.rb
@@ -78,6 +78,21 @@ RSpec.describe Gitlab::QueryLimiting::Transaction do
expect { transaction.increment }.not_to change { transaction.count }
end
+
+ it 'does not increment the number of executed queries when the query is known to be ignorable' do
+ transaction = described_class.new
+
+ expect do
+ transaction.increment(described_class::GEO_NODES_LOAD)
+ transaction.increment(described_class::LICENSES_LOAD)
+ transaction.increment('SELECT a.attname, a.other_column FROM pg_attribute a')
+ transaction.increment('SELECT x.foo, a.attname FROM some_table x JOIN pg_attribute a')
+ transaction.increment(<<-SQL)
+ SELECT a.attname, a.other_column
+ FROM pg_attribute a
+ SQL
+ end.not_to change(transaction, :count)
+ end
end
describe '#raise_error?' do
diff --git a/spec/lib/gitlab/request_profiler/profile_spec.rb b/spec/lib/gitlab/request_profiler/profile_spec.rb
deleted file mode 100644
index 30e23a99b22..00000000000
--- a/spec/lib/gitlab/request_profiler/profile_spec.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::RequestProfiler::Profile do
- let(:profile) { described_class.new(filename) }
-
- describe '.new' do
- context 'using old filename' do
- let(:filename) { '|api|v4|version.txt_1562854738.html' }
-
- it 'returns valid data' do
- expect(profile).to be_valid
- expect(profile.request_path).to eq('/api/v4/version.txt')
- expect(profile.time).to eq(Time.at(1562854738).utc)
- expect(profile.type).to eq('html')
- end
- end
-
- context 'using new filename' do
- let(:filename) { '|api|v4|version.txt_1563547949_execution.html' }
-
- it 'returns valid data' do
- expect(profile).to be_valid
- expect(profile.request_path).to eq('/api/v4/version.txt')
- expect(profile.profile_mode).to eq('execution')
- expect(profile.time).to eq(Time.at(1563547949).utc)
- expect(profile.type).to eq('html')
- end
- end
- end
-
- describe '#content_type' do
- context 'when using html file' do
- let(:filename) { '|api|v4|version.txt_1562854738_memory.html' }
-
- it 'returns valid data' do
- expect(profile).to be_valid
- expect(profile.content_type).to eq('text/html')
- end
- end
-
- context 'when using text file' do
- let(:filename) { '|api|v4|version.txt_1562854738_memory.txt' }
-
- it 'returns valid data' do
- expect(profile).to be_valid
- expect(profile.content_type).to eq('text/plain')
- end
- end
-
- context 'when file is unknown' do
- let(:filename) { '|api|v4|version.txt_1562854738_memory.xxx' }
-
- it 'returns valid data' do
- expect(profile).not_to be_valid
- expect(profile.content_type).to be_nil
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/request_profiler_spec.rb b/spec/lib/gitlab/request_profiler_spec.rb
deleted file mode 100644
index 4d3b361efcb..00000000000
--- a/spec/lib/gitlab/request_profiler_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::RequestProfiler do
- describe '.profile_token' do
- it 'returns a token' do
- expect(described_class.profile_token).to be_present
- end
-
- it 'caches the token' do
- expect(Rails.cache).to receive(:fetch).with('profile-token')
-
- described_class.profile_token
- end
- end
-
- context 'with temporary PROFILES_DIR' do
- let(:tmpdir) { Dir.mktmpdir('profiler-test') }
- let(:profile_name) { '|api|v4|version.txt_1562854738_memory.html' }
- let(:profile_path) { File.join(tmpdir, profile_name) }
-
- before do
- stub_const('Gitlab::RequestProfiler::PROFILES_DIR', tmpdir)
- FileUtils.touch(profile_path)
- end
-
- after do
- FileUtils.rm_rf(tmpdir)
- end
-
- describe '.remove_all_profiles' do
- it 'removes Gitlab::RequestProfiler::PROFILES_DIR directory' do
- described_class.remove_all_profiles
-
- expect(Dir.exist?(tmpdir)).to be false
- end
- end
-
- describe '.all' do
- subject { described_class.all }
-
- it 'returns all profiles' do
- expect(subject.map(&:name)).to contain_exactly(profile_name)
- end
- end
-
- describe '.find' do
- subject { described_class.find(profile_name) }
-
- it 'returns all profiles' do
- expect(subject.name).to eq(profile_name)
- end
- end
- end
-end
diff --git a/spec/lib/gitlab/saas_spec.rb b/spec/lib/gitlab/saas_spec.rb
index 1be36a60a97..a8656c44831 100644
--- a/spec/lib/gitlab/saas_spec.rb
+++ b/spec/lib/gitlab/saas_spec.rb
@@ -3,11 +3,11 @@
require 'spec_helper'
RSpec.describe Gitlab::Saas do
+ include SaasTestHelper
+
describe '.canary_toggle_com_url' do
subject { described_class.canary_toggle_com_url }
- let(:next_url) { 'https://next.gitlab.com' }
-
- it { is_expected.to eq(next_url) }
+ it { is_expected.to eq(get_next_url) }
end
end
diff --git a/spec/lib/gitlab/safe_request_purger_spec.rb b/spec/lib/gitlab/safe_request_purger_spec.rb
new file mode 100644
index 00000000000..02f3f11d469
--- /dev/null
+++ b/spec/lib/gitlab/safe_request_purger_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SafeRequestPurger do
+ let(:resource_key) { '_key_' }
+ let(:resource_ids) { ['foo'] }
+ let(:args) { { resource_key: resource_key, resource_ids: resource_ids } }
+ let(:resource_data) { { 'foo' => 'bar' } }
+
+ before do
+ Gitlab::SafeRequestStore[resource_key] = resource_data
+ end
+
+ describe '.execute', :request_store do
+ subject(:execute_instance) { described_class.execute(**args) }
+
+ it 'purges an entry from the store' do
+ execute_instance
+
+ expect(Gitlab::SafeRequestStore.fetch(resource_key)).to be_empty
+ end
+ end
+
+ describe '#execute' do
+ subject(:execute_instance) { described_class.new(**args).execute }
+
+ context 'when request store is active', :request_store do
+ it 'purges an entry from the store' do
+ execute_instance
+
+ expect(Gitlab::SafeRequestStore.fetch(resource_key)).to be_empty
+ end
+
+ context 'when there are multiple resource_ids to purge' do
+ let(:resource_data) do
+ {
+ 'foo' => 'bar',
+ 'two' => '_two_',
+ 'three' => '_three_',
+ 'four' => '_four_'
+ }
+ end
+
+ let(:resource_ids) { %w[two three] }
+
+ it 'purges an entry from the store' do
+ execute_instance
+
+ expect(Gitlab::SafeRequestStore.fetch(resource_key)).to eq resource_data.slice('foo', 'four')
+ end
+ end
+
+ context 'when there is no matching resource_ids' do
+ let(:resource_ids) { ['_bogus_resource_id_'] }
+
+ it 'purges an entry from the store' do
+ execute_instance
+
+ expect(Gitlab::SafeRequestStore.fetch(resource_key)).to eq resource_data
+ end
+ end
+ end
+
+ context 'when request store is not active' do
+ let(:resource_ids) { ['_bogus_resource_id_'] }
+
+ it 'does offer the ability to interact with data store' do
+ expect(execute_instance).to eq({})
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/setup_helper/praefect_spec.rb b/spec/lib/gitlab/setup_helper/praefect_spec.rb
new file mode 100644
index 00000000000..f7da6c19d68
--- /dev/null
+++ b/spec/lib/gitlab/setup_helper/praefect_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::SetupHelper::Praefect do
+ describe '.configuration_toml' do
+ let(:opt_per_repo) do
+ { per_repository: true,
+ pghost: 'my-host',
+ pgport: 555432,
+ pguser: 'me' }
+ end
+
+ it 'defaults to in memory queue' do
+ toml = described_class.configuration_toml('/here', nil, {})
+
+ expect(toml).to match(/i_understand_my_election_strategy_is_unsupported_and_will_be_removed_without_warning/)
+ expect(toml).to match(/memory_queue_enabled = true/)
+ expect(toml).to match(/election_strategy = "local"/)
+ expect(toml).not_to match(/\[database\]/)
+ end
+
+ it 'provides database details if wanted' do
+ toml = described_class.configuration_toml('/here', nil, opt_per_repo)
+
+ expect(toml).not_to match(/i_understand_my_election_strategy_is_unsupported_and_will_be_removed_without_warning/)
+ expect(toml).not_to match(/memory_queue_enabled = true/)
+ expect(toml).to match(/\[database\]/)
+ expect(toml).to match(/election_strategy = "per_repository"/)
+ end
+
+ %i[pghost pgport pguser].each do |pg_key|
+ it "fails when #{pg_key} is missing" do
+ opt = opt_per_repo.dup
+ opt.delete(pg_key)
+
+ expect do
+ described_class.configuration_toml('/here', nil, opt)
+ end.to raise_error(KeyError)
+ end
+
+ it "uses the provided #{pg_key}" do
+ toml = described_class.configuration_toml('/here', nil, opt_per_repo)
+
+ expect(toml).to match(/#{pg_key.to_s.delete_prefix('pg')} = "?#{opt_per_repo[pg_key]}"?/)
+ end
+ end
+
+ it 'defaults to praefect_test if dbname is missing' do
+ toml = described_class.configuration_toml('/here', nil, opt_per_repo)
+
+ expect(toml).to match(/dbname = "praefect_test"/)
+ end
+
+ it 'uses the provided dbname' do
+ opt = opt_per_repo.merge(dbname: 'my_db')
+
+ toml = described_class.configuration_toml('/here', nil, opt)
+
+ expect(toml).to match(/dbname = "my_db"/)
+ end
+ end
+
+ describe '.get_config_path' do
+ it 'defaults to praefect.config.toml' do
+ expect(described_class).to receive(:generate_configuration).with(anything, '/tmp/praefect.config.toml', anything)
+
+ described_class.create_configuration('/tmp', {})
+ end
+
+ it 'takes the provided config_filename' do
+ opt = { config_filename: 'yo.toml' }
+
+ expect(described_class).to receive(:generate_configuration).with(anything, '/tmp/yo.toml', anything)
+
+ described_class.create_configuration('/tmp', {}, options: opt)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/sidekiq_config_spec.rb b/spec/lib/gitlab/sidekiq_config_spec.rb
index da135f202f6..4a1a9beb21a 100644
--- a/spec/lib/gitlab/sidekiq_config_spec.rb
+++ b/spec/lib/gitlab/sidekiq_config_spec.rb
@@ -3,6 +3,11 @@
require 'spec_helper'
RSpec.describe Gitlab::SidekiqConfig do
+ before do
+ # Remove cache
+ described_class.instance_variable_set(:@workers, nil)
+ end
+
describe '.workers' do
it 'includes all workers' do
worker_classes = described_class.workers.map(&:klass)
@@ -44,9 +49,10 @@ RSpec.describe Gitlab::SidekiqConfig do
before do
allow(described_class).to receive(:workers).and_return(workers)
allow(Gitlab).to receive(:ee?).and_return(false)
+ allow(Gitlab).to receive(:jh?).and_return(false)
end
- it 'returns true if the YAML file does not matcph the application code' do
+ it 'returns true if the YAML file does not match the application code' do
allow(YAML).to receive(:load_file)
.with(described_class::FOSS_QUEUE_CONFIG_PATH)
.and_return(workers.first(2).map(&:to_yaml))
@@ -96,6 +102,7 @@ RSpec.describe Gitlab::SidekiqConfig do
].map { |worker| described_class::Worker.new(worker, ee: false) }
allow(described_class).to receive(:workers).and_return(workers)
+ allow(Gitlab).to receive(:jh?).and_return(false)
end
let(:expected_queues) do
@@ -161,4 +168,35 @@ RSpec.describe Gitlab::SidekiqConfig do
expect(mappings).not_to include('AdminEmailWorker' => 'cronjob:admin_email')
end
end
+
+ describe '.routing_queues' do
+ let(:test_routes) do
+ [
+ ['tags=needs_own_queue', nil],
+ ['urgency=high', 'high_urgency'],
+ ['feature_category=gitaly', 'gitaly'],
+ ['feature_category=not_exist', 'not_exist'],
+ ['*', 'default']
+ ]
+ end
+
+ before do
+ described_class.instance_variable_set(:@routing_queues, nil)
+ allow(::Gitlab::SidekiqConfig::WorkerRouter)
+ .to receive(:global).and_return(::Gitlab::SidekiqConfig::WorkerRouter.new(test_routes))
+ end
+
+ after do
+ described_class.instance_variable_set(:@routing_queues, nil)
+ end
+
+ it 'returns worker queue mappings that have queues in the current Sidekiq options' do
+ queues = described_class.routing_queues
+
+ expect(queues).to match_array(%w[
+ default mailers high_urgency gitaly email_receiver service_desk_email_receiver
+ ])
+ expect(queues).not_to include('not_exist')
+ end
+ end
end
diff --git a/spec/lib/gitlab/sidekiq_death_handler_spec.rb b/spec/lib/gitlab/sidekiq_death_handler_spec.rb
index 96fef88de4e..e3f9f8277a0 100644
--- a/spec/lib/gitlab/sidekiq_death_handler_spec.rb
+++ b/spec/lib/gitlab/sidekiq_death_handler_spec.rb
@@ -23,9 +23,9 @@ RSpec.describe Gitlab::SidekiqDeathHandler, :clean_gitlab_redis_queues do
it 'uses the attributes from the worker' do
expect(described_class.counter)
.to receive(:increment)
- .with(queue: 'test_queue', worker: 'TestWorker',
+ .with({ queue: 'test_queue', worker: 'TestWorker',
urgency: 'low', external_dependencies: 'yes',
- feature_category: 'users', boundary: 'cpu')
+ feature_category: 'users', boundary: 'cpu' })
described_class.handler({ 'class' => 'TestWorker', 'queue' => 'test_queue' }, nil)
end
@@ -39,9 +39,9 @@ RSpec.describe Gitlab::SidekiqDeathHandler, :clean_gitlab_redis_queues do
it 'uses blank attributes' do
expect(described_class.counter)
.to receive(:increment)
- .with(queue: 'test_queue', worker: 'TestWorker',
+ .with({ queue: 'test_queue', worker: 'TestWorker',
urgency: '', external_dependencies: 'no',
- feature_category: '', boundary: '')
+ feature_category: '', boundary: '' })
described_class.handler({ 'class' => 'TestWorker', 'queue' => 'test_queue' }, nil)
end
diff --git a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
index 210b9162be0..00ae55237e9 100644
--- a/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
+++ b/spec/lib/gitlab/sidekiq_logging/structured_logger_spec.rb
@@ -287,7 +287,8 @@ RSpec.describe Gitlab::SidekiqLogging::StructuredLogger do
'job_status' => 'done',
'duration_s' => 0.0,
'completed_at' => timestamp.to_f,
- 'cpu_s' => 1.111112
+ 'cpu_s' => 1.111112,
+ 'rate_limiting_gates' => []
)
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
index ffa92126cc9..7d31979a393 100644
--- a/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb
@@ -21,40 +21,40 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
.and_return('MergeWorker' => 'merge', 'Ci::BuildFinishedWorker' => 'default')
expect(completion_seconds_metric)
- .to receive(:get).with(queue: 'merge',
+ .to receive(:get).with({ queue: 'merge',
worker: 'MergeWorker',
urgency: 'high',
external_dependencies: 'no',
feature_category: 'source_code_management',
boundary: '',
- job_status: 'done')
+ job_status: 'done' })
expect(completion_seconds_metric)
- .to receive(:get).with(queue: 'merge',
+ .to receive(:get).with({ queue: 'merge',
worker: 'MergeWorker',
urgency: 'high',
external_dependencies: 'no',
feature_category: 'source_code_management',
boundary: '',
- job_status: 'fail')
+ job_status: 'fail' })
expect(completion_seconds_metric)
- .to receive(:get).with(queue: 'default',
+ .to receive(:get).with({ queue: 'default',
worker: 'Ci::BuildFinishedWorker',
urgency: 'high',
external_dependencies: 'no',
feature_category: 'continuous_integration',
boundary: 'cpu',
- job_status: 'done')
+ job_status: 'done' })
expect(completion_seconds_metric)
- .to receive(:get).with(queue: 'default',
+ .to receive(:get).with({ queue: 'default',
worker: 'Ci::BuildFinishedWorker',
urgency: 'high',
external_dependencies: 'no',
feature_category: 'continuous_integration',
boundary: 'cpu',
- job_status: 'fail')
+ job_status: 'fail' })
described_class.initialize_process_metrics
end
diff --git a/spec/lib/gitlab/subscription_portal_spec.rb b/spec/lib/gitlab/subscription_portal_spec.rb
index fd3654afee0..8d5a39baf77 100644
--- a/spec/lib/gitlab/subscription_portal_spec.rb
+++ b/spec/lib/gitlab/subscription_portal_spec.rb
@@ -56,6 +56,7 @@ RSpec.describe ::Gitlab::SubscriptionPortal do
where(:method_name, :result) do
:default_subscriptions_url | 'https://customers.staging.gitlab.com'
:payment_form_url | 'https://customers.staging.gitlab.com/payment_forms/cc_validation'
+ :payment_validation_form_id | 'payment_method_validation'
:registration_validation_form_url | 'https://customers.staging.gitlab.com/payment_forms/cc_registration_validation'
:subscriptions_graphql_url | 'https://customers.staging.gitlab.com/graphql'
:subscriptions_more_minutes_url | 'https://customers.staging.gitlab.com/buy_pipeline_minutes'
diff --git a/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb b/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
index 226fdb9c948..26c83ed6793 100644
--- a/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
+++ b/spec/lib/gitlab/template/gitlab_ci_yml_template_spec.rb
@@ -21,55 +21,6 @@ RSpec.describe Gitlab::Template::GitlabCiYmlTemplate do
end
end
- describe '.find' do
- let_it_be(:project) { create(:project) }
- let_it_be(:other_project) { create(:project) }
-
- described_class::TEMPLATES_WITH_LATEST_VERSION.keys.each do |key|
- it "finds the latest template for #{key}" do
- result = described_class.find(key, project)
- expect(result.full_name).to eq("#{key}.latest.gitlab-ci.yml")
- expect(result.content).to be_present
- end
-
- context 'when `redirect_to_latest_template` feature flag is disabled' do
- before do
- stub_feature_flags("redirect_to_latest_template_#{key.underscore.tr('/', '_')}".to_sym => false)
- end
-
- it "finds the stable template for #{key}" do
- result = described_class.find(key, project)
- expect(result.full_name).to eq("#{key}.gitlab-ci.yml")
- expect(result.content).to be_present
- end
- end
-
- context 'when `redirect_to_latest_template` feature flag is enabled on the project' do
- before do
- stub_feature_flags("redirect_to_latest_template_#{key.underscore.tr('/', '_')}".to_sym => project)
- end
-
- it "finds the latest template for #{key}" do
- result = described_class.find(key, project)
- expect(result.full_name).to eq("#{key}.latest.gitlab-ci.yml")
- expect(result.content).to be_present
- end
- end
-
- context 'when `redirect_to_latest_template` feature flag is enabled on the other project' do
- before do
- stub_feature_flags("redirect_to_latest_template_#{key.underscore.tr('/', '_')}".to_sym => other_project)
- end
-
- it "finds the stable template for #{key}" do
- result = described_class.find(key, project)
- expect(result.full_name).to eq("#{key}.gitlab-ci.yml")
- expect(result.content).to be_present
- end
- end
- end
- end
-
describe '#content' do
it 'loads the full file' do
gitignore = subject.new(Rails.root.join('lib/gitlab/ci/templates/Ruby.gitlab-ci.yml'))
diff --git a/spec/lib/gitlab/tracking/event_definition_spec.rb b/spec/lib/gitlab/tracking/event_definition_spec.rb
index 51c62840819..623009e9a30 100644
--- a/spec/lib/gitlab/tracking/event_definition_spec.rb
+++ b/spec/lib/gitlab/tracking/event_definition_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe Gitlab::Tracking::EventDefinition do
end
it 'has all definitions valid' do
- expect { described_class.definitions }.not_to raise_error(Gitlab::Tracking::InvalidEventError)
+ expect { described_class.definitions }.not_to raise_error
end
describe '#validate' do
diff --git a/spec/lib/gitlab/url_builder_spec.rb b/spec/lib/gitlab/url_builder_spec.rb
index 8e372ba795b..d4f96f1a37f 100644
--- a/spec/lib/gitlab/url_builder_spec.rb
+++ b/spec/lib/gitlab/url_builder_spec.rb
@@ -22,6 +22,8 @@ RSpec.describe Gitlab::UrlBuilder do
:group_board | ->(board) { "/groups/#{board.group.full_path}/-/boards/#{board.id}" }
:commit | ->(commit) { "/#{commit.project.full_path}/-/commit/#{commit.id}" }
:issue | ->(issue) { "/#{issue.project.full_path}/-/issues/#{issue.iid}" }
+ [:issue, :task] | ->(issue) { "/#{issue.project.full_path}/-/work_items/#{issue.id}" }
+ :work_item | ->(work_item) { "/#{work_item.project.full_path}/-/work_items/#{work_item.id}" }
:merge_request | ->(merge_request) { "/#{merge_request.project.full_path}/-/merge_requests/#{merge_request.iid}" }
:project_milestone | ->(milestone) { "/#{milestone.project.full_path}/-/milestones/#{milestone.iid}" }
:project_snippet | ->(snippet) { "/#{snippet.project.full_path}/-/snippets/#{snippet.id}" }
@@ -57,7 +59,7 @@ RSpec.describe Gitlab::UrlBuilder do
end
with_them do
- let(:object) { build_stubbed(factory) }
+ let(:object) { build_stubbed(*Array(factory)) }
let(:path) { path_generator.call(object) }
it 'returns the full URL' do
@@ -69,6 +71,18 @@ RSpec.describe Gitlab::UrlBuilder do
end
end
+ context 'when work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'returns an issue path for an issue of type task' do
+ task = create(:issue, :task)
+
+ expect(subject.build(task, only_path: true)).to eq("/#{task.project.full_path}/-/issues/#{task.iid}")
+ end
+ end
+
context 'when passing a compare' do
# NOTE: The Compare requires an actual repository, which isn't available
# with the `build_stubbed` strategy used by the table tests above
diff --git a/spec/lib/gitlab/usage/metric_definition_spec.rb b/spec/lib/gitlab/usage/metric_definition_spec.rb
index 1127d1cd477..070586319a5 100644
--- a/spec/lib/gitlab/usage/metric_definition_spec.rb
+++ b/spec/lib/gitlab/usage/metric_definition_spec.rb
@@ -20,7 +20,8 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
distribution: %w(ee ce),
tier: %w(free starter premium ultimate bronze silver gold),
name: 'uuid',
- data_category: 'standard'
+ data_category: 'standard',
+ removed_by_url: 'http://gdk.test'
}
end
@@ -132,6 +133,7 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
:tier | %w(test ee)
:name | 'count_<adjective_describing>_boards'
:repair_issue_url | nil
+ :removed_by_url | 1
:instrumentation_class | 'Metric_Class'
:instrumentation_class | 'metricClass'
@@ -177,6 +179,24 @@ RSpec.describe Gitlab::Usage::MetricDefinition do
end
end
+ describe '#valid_service_ping_status?' do
+ context 'when metric has active status' do
+ it 'has to return true' do
+ attributes[:status] = 'active'
+
+ expect(described_class.new(path, attributes).valid_service_ping_status?).to be_truthy
+ end
+ end
+
+ context 'when metric has removed status' do
+ it 'has to return false' do
+ attributes[:status] = 'removed'
+
+ expect(described_class.new(path, attributes).valid_service_ping_status?).to be_falsey
+ end
+ end
+ end
+
describe 'statuses' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/lib/gitlab/usage/metric_spec.rb b/spec/lib/gitlab/usage/metric_spec.rb
index 19d2d3048eb..10ae94e746b 100644
--- a/spec/lib/gitlab/usage/metric_spec.rb
+++ b/spec/lib/gitlab/usage/metric_spec.rb
@@ -51,4 +51,31 @@ RSpec.describe Gitlab::Usage::Metric do
expect(described_class.new(issue_count_metric_definiton).with_suggested_name).to eq({ counts: { issues: 'count_issues' } })
end
end
+
+ context 'unavailable metric' do
+ let(:instrumentation_class) { "UnavailableMetric" }
+ let(:issue_count_metric_definiton) do
+ double(:issue_count_metric_definiton,
+ attributes.merge({ attributes: attributes, instrumentation_class: instrumentation_class })
+ )
+ end
+
+ before do
+ unavailable_metric_class = Class.new(Gitlab::Usage::Metrics::Instrumentations::CountIssuesMetric) do
+ def available?
+ false
+ end
+ end
+
+ stub_const("Gitlab::Usage::Metrics::Instrumentations::#{instrumentation_class}", unavailable_metric_class)
+ end
+
+ [:with_value, :with_instrumentation, :with_suggested_name].each do |method_name|
+ describe "##{method_name}" do
+ it 'returns an empty hash' do
+ expect(described_class.new(issue_count_metric_definiton).public_send(method_name)).to eq({})
+ end
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb
index 1b2170baf17..92d4de3c462 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/collected_data_categories_metric_spec.rb
@@ -7,7 +7,7 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CollectedDataCategories
let(:expected_value) { %w[standard subscription operational optional] }
before do
- allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance|
+ allow_next_instance_of(ServicePing::PermitDataCategories) do |instance|
expect(instance).to receive(:execute).and_return(expected_value)
end
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb
new file mode 100644
index 00000000000..b85d5a3ebf9
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_bulk_imports_entities_metric_spec.rb
@@ -0,0 +1,106 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountBulkImportsEntitiesMetric do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:bulk_import_projects) do
+ create_list(:bulk_import_entity, 3, source_type: 'project_entity', created_at: 3.weeks.ago)
+ end
+
+ let_it_be(:bulk_import_groups) do
+ create_list(:bulk_import_entity, 3, source_type: 'group_entity', created_at: 3.weeks.ago)
+ end
+
+ let_it_be(:old_bulk_import_project) do
+ create(:bulk_import_entity, source_type: 'project_entity', created_at: 2.months.ago)
+ end
+
+ context 'with no source_type' do
+ context 'with all time frame' do
+ let(:expected_value) { 7 }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query', time_frame: 'all', options: {}
+ end
+
+ context 'for 28d time frame' do
+ let(:expected_value) { 6 }
+ let(:start) { 30.days.ago.to_s(:db) }
+ let(:finish) { 2.days.ago.to_s(:db) }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""\
+ " WHERE \"bulk_import_entities\".\"created_at\" BETWEEN '#{start}' AND '#{finish}'"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query', time_frame: '28d', options: {}
+ end
+ end
+
+ context 'with invalid source_type' do
+ it 'raises ArgumentError' do
+ expect { described_class.new(time_frame: 'all', options: { source_type: 'random' }) }
+ .to raise_error(ArgumentError, /source_type/)
+ end
+ end
+
+ context 'with source_type project_entity' do
+ context 'with all time frame' do
+ let(:expected_value) { 4 }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""\
+ " WHERE \"bulk_import_entities\".\"source_type\" = 1"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: 'all',
+ options: { source_type: 'project_entity' }
+ end
+
+ context 'for 28d time frame' do
+ let(:expected_value) { 3 }
+ let(:start) { 30.days.ago.to_s(:db) }
+ let(:finish) { 2.days.ago.to_s(:db) }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""\
+ " WHERE \"bulk_import_entities\".\"created_at\" BETWEEN '#{start}' AND '#{finish}'"\
+ " AND \"bulk_import_entities\".\"source_type\" = 1"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: '28d',
+ options: { source_type: 'project_entity' }
+ end
+ end
+
+ context 'with source_type group_entity' do
+ context 'with all time frame' do
+ let(:expected_value) { 3 }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""\
+ " WHERE \"bulk_import_entities\".\"source_type\" = 0"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: 'all',
+ options: { source_type: 'group_entity' }
+ end
+
+ context 'for 28d time frame' do
+ let(:expected_value) { 3 }
+ let(:start) { 30.days.ago.to_s(:db) }
+ let(:finish) { 2.days.ago.to_s(:db) }
+ let(:expected_query) do
+ "SELECT COUNT(\"bulk_import_entities\".\"id\") FROM \"bulk_import_entities\""\
+ " WHERE \"bulk_import_entities\".\"created_at\" BETWEEN '#{start}' AND '#{finish}'"\
+ " AND \"bulk_import_entities\".\"source_type\" = 0"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: '28d',
+ options: { source_type: 'group_entity' }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb
new file mode 100644
index 00000000000..4c86410d609
--- /dev/null
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::Metrics::Instrumentations::CountImportedProjectsMetric do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:gitea_imports) do
+ create_list(:project, 3, import_type: 'gitea', creator_id: user.id, created_at: 3.weeks.ago)
+ end
+
+ let_it_be(:bitbucket_imports) do
+ create_list(:project, 2, import_type: 'bitbucket', creator_id: user.id, created_at: 3.weeks.ago)
+ end
+
+ let_it_be(:old_import) { create(:project, import_type: 'gitea', creator_id: user.id, created_at: 2.months.ago) }
+
+ context 'with import_type gitea' do
+ context 'with all time frame' do
+ let(:expected_value) { 4 }
+ let(:expected_query) do
+ "SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"import_type\" = 'gitea'"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: 'all',
+ options: { import_type: 'gitea' }
+ end
+
+ context 'for 28d time frame' do
+ let(:expected_value) { 3 }
+ let(:start) { 30.days.ago.to_s(:db) }
+ let(:finish) { 2.days.ago.to_s(:db) }
+ let(:expected_query) do
+ "SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"created_at\""\
+ " BETWEEN '#{start}' AND '#{finish}' AND \"projects\".\"import_type\" = 'gitea'"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: '28d',
+ options: { import_type: 'gitea' }
+ end
+ end
+
+ context 'with import_type bitbucket' do
+ context 'with all time frame' do
+ let(:expected_value) { 2 }
+ let(:expected_query) do
+ "SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"import_type\" = 'bitbucket'"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: 'all',
+ options: { import_type: 'bitbucket' }
+ end
+
+ context 'for 28d time frame' do
+ let(:expected_value) { 2 }
+ let(:start) { 30.days.ago.to_s(:db) }
+ let(:finish) { 2.days.ago.to_s(:db) }
+ let(:expected_query) do
+ "SELECT COUNT(\"projects\".\"id\") FROM \"projects\" WHERE \"projects\".\"created_at\""\
+ " BETWEEN '#{start}' AND '#{finish}' AND \"projects\".\"import_type\" = 'bitbucket'"
+ end
+
+ it_behaves_like 'a correct instrumented metric value and query',
+ time_frame: '28d',
+ options: { import_type: 'bitbucket' }
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb
index ea5ae1970de..8e7bd7b84e6 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb
@@ -71,6 +71,33 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do
end
end
+ context 'with availability defined' do
+ subject do
+ described_class.tap do |metric_class|
+ metric_class.relation { Issue }
+ metric_class.operation :count
+ metric_class.available? { false }
+ end.new(time_frame: 'all')
+ end
+
+ it 'responds to #available? properly' do
+ expect(subject.available?).to eq(false)
+ end
+ end
+
+ context 'with availability not defined' do
+ subject do
+ Class.new(described_class) do
+ relation { Issue }
+ operation :count
+ end.new(time_frame: 'all')
+ end
+
+ it 'responds to #available? properly' do
+ expect(subject.available?).to eq(true)
+ end
+ end
+
context 'with cache_start_and_finish_as called' do
subject do
described_class.tap do |metric_class|
@@ -134,4 +161,17 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::DatabaseMetric do
end
end
end
+
+ context 'with unimplemented operation method used' do
+ subject do
+ described_class.tap do |metric_class|
+ metric_class.relation { Issue }
+ metric_class.operation :invalid_operation
+ end.new(time_frame: 'all')
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::UnimplementedOperationError)
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb
index 347a2c779cb..97306051533 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/redis_hll_metric_spec.rb
@@ -25,4 +25,28 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::RedisHLLMetric, :clean_
it 'raise exception if events options is not present' do
expect { described_class.new(time_frame: '28d') }.to raise_error(ArgumentError)
end
+
+ describe 'children classes' do
+ let(:options) { { events: ['i_quickactions_approve'] } }
+
+ context 'availability not defined' do
+ subject { Class.new(described_class).new(time_frame: nil, options: options) }
+
+ it 'returns default availability' do
+ expect(subject.available?).to eq(true)
+ end
+ end
+
+ context 'availability defined' do
+ subject do
+ Class.new(described_class) do
+ available? { false }
+ end.new(time_frame: nil, options: options)
+ end
+
+ it 'returns defined availability' do
+ expect(subject.available?).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb b/spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb
index fb3bd1ba834..831f775ec9a 100644
--- a/spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb
@@ -20,4 +20,28 @@ RSpec.describe Gitlab::Usage::Metrics::Instrumentations::RedisMetric, :clean_git
it 'raises an exception if counter_class option is not present' do
expect { described_class.new(event: 'pushes') }.to raise_error(ArgumentError)
end
+
+ describe 'children classes' do
+ let(:options) { { event: 'pushes', counter_class: 'SourceCodeCounter' } }
+
+ context 'availability not defined' do
+ subject { Class.new(described_class).new(time_frame: nil, options: options) }
+
+ it 'returns default availability' do
+ expect(subject.available?).to eq(true)
+ end
+ end
+
+ context 'availability defined' do
+ subject do
+ Class.new(described_class) do
+ available? { false }
+ end.new(time_frame: nil, options: options)
+ end
+
+ it 'returns defined availability' do
+ expect(subject.available?).to eq(false)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/usage/metrics/query_spec.rb b/spec/lib/gitlab/usage/metrics/query_spec.rb
index 60c8d044a64..65b8a7a046b 100644
--- a/spec/lib/gitlab/usage/metrics/query_spec.rb
+++ b/spec/lib/gitlab/usage/metrics/query_spec.rb
@@ -11,6 +11,22 @@ RSpec.describe Gitlab::Usage::Metrics::Query do
it 'does not mix a nil column with keyword arguments' do
expect(described_class.for(:count, User, nil)).to eq('SELECT COUNT("users"."id") FROM "users"')
end
+
+ it 'removes order from passed relation' do
+ expect(described_class.for(:count, User.order(:email), nil)).to eq('SELECT COUNT("users"."id") FROM "users"')
+ end
+
+ it 'returns valid raw SQL for join relations' do
+ expect(described_class.for(:count, User.joins(:issues), :email)).to eq(
+ 'SELECT COUNT("users"."email") FROM "users" INNER JOIN "issues" ON "issues"."author_id" = "users"."id"'
+ )
+ end
+
+ it 'returns valid raw SQL for join relations with joined columns' do
+ expect(described_class.for(:count, User.joins(:issues), 'issue.weight')).to eq(
+ 'SELECT COUNT("issue"."weight") FROM "users" INNER JOIN "issues" ON "issues"."author_id" = "users"."id"'
+ )
+ end
end
describe '.distinct_count' do
@@ -21,6 +37,22 @@ RSpec.describe Gitlab::Usage::Metrics::Query do
it 'does not mix a nil column with keyword arguments' do
expect(described_class.for(:distinct_count, Issue, nil)).to eq('SELECT COUNT(DISTINCT "issues"."id") FROM "issues"')
end
+
+ it 'removes order from passed relation' do
+ expect(described_class.for(:distinct_count, User.order(:email), nil)).to eq('SELECT COUNT(DISTINCT "users"."id") FROM "users"')
+ end
+
+ it 'returns valid raw SQL for join relations' do
+ expect(described_class.for(:distinct_count, User.joins(:issues), :email)).to eq(
+ 'SELECT COUNT(DISTINCT "users"."email") FROM "users" INNER JOIN "issues" ON "issues"."author_id" = "users"."id"'
+ )
+ end
+
+ it 'returns valid raw SQL for join relations with joined columns' do
+ expect(described_class.for(:distinct_count, User.joins(:issues), 'issue.weight')).to eq(
+ 'SELECT COUNT(DISTINCT "issue"."weight") FROM "users" INNER JOIN "issues" ON "issues"."author_id" = "users"."id"'
+ )
+ end
end
describe '.sum' do
diff --git a/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb b/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb
new file mode 100644
index 00000000000..46592379b3d
--- /dev/null
+++ b/spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Usage::ServicePing::LegacyMetricTimingDecorator do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:duration) { 123 }
+
+ where(:metric_value, :metric_class) do
+ 1 | Integer
+ "value" | String
+ true | TrueClass
+ false | FalseClass
+ nil | NilClass
+ end
+
+ with_them do
+ let(:decorated_object) { described_class.new(metric_value, duration) }
+
+ it 'exposes a duration with the correct value' do
+ expect(decorated_object.duration).to eq(duration)
+ end
+
+ it 'imitates wrapped class', :aggregate_failures do
+ expect(decorated_object).to eq metric_value
+ expect(decorated_object.class).to eq metric_class
+ expect(decorated_object.is_a?(metric_class)).to be_truthy
+ # rubocop:disable Style/ClassCheck
+ expect(decorated_object.kind_of?(metric_class)).to be_truthy
+ # rubocop:enable Style/ClassCheck
+ expect({ metric: decorated_object }.to_json).to eql({ metric: metric_value }.to_json)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/usage/service_ping_report_spec.rb b/spec/lib/gitlab/usage/service_ping_report_spec.rb
index b6119ab52ec..e7096988035 100644
--- a/spec/lib/gitlab/usage/service_ping_report_spec.rb
+++ b/spec/lib/gitlab/usage/service_ping_report_spec.rb
@@ -92,49 +92,6 @@ RSpec.describe Gitlab::Usage::ServicePingReport, :use_clean_rails_memory_store_c
end
context 'cross test values against queries' do
- # TODO: fix failing metrics https://gitlab.com/gitlab-org/gitlab/-/issues/353559
- let(:failing_todo_metrics) do
- ["counts.labels",
- "counts.jira_imports_total_imported_issues_count",
- "counts.in_product_marketing_email_create_0_sent",
- "counts.in_product_marketing_email_create_0_cta_clicked",
- "counts.in_product_marketing_email_create_1_sent",
- "counts.in_product_marketing_email_create_1_cta_clicked",
- "counts.in_product_marketing_email_create_2_sent",
- "counts.in_product_marketing_email_create_2_cta_clicked",
- "counts.in_product_marketing_email_verify_0_sent",
- "counts.in_product_marketing_email_verify_0_cta_clicked",
- "counts.in_product_marketing_email_verify_1_sent",
- "counts.in_product_marketing_email_verify_1_cta_clicked",
- "counts.in_product_marketing_email_verify_2_sent",
- "counts.in_product_marketing_email_verify_2_cta_clicked",
- "counts.in_product_marketing_email_trial_0_sent",
- "counts.in_product_marketing_email_trial_0_cta_clicked",
- "counts.in_product_marketing_email_trial_1_sent",
- "counts.in_product_marketing_email_trial_1_cta_clicked",
- "counts.in_product_marketing_email_trial_2_sent",
- "counts.in_product_marketing_email_trial_2_cta_clicked",
- "counts.in_product_marketing_email_team_0_sent",
- "counts.in_product_marketing_email_team_0_cta_clicked",
- "counts.in_product_marketing_email_team_1_sent",
- "counts.in_product_marketing_email_team_1_cta_clicked",
- "counts.in_product_marketing_email_team_2_sent",
- "counts.in_product_marketing_email_team_2_cta_clicked",
- "counts.in_product_marketing_email_experience_0_sent",
- "counts.in_product_marketing_email_team_short_0_sent",
- "counts.in_product_marketing_email_team_short_0_cta_clicked",
- "counts.in_product_marketing_email_trial_short_0_sent",
- "counts.in_product_marketing_email_trial_short_0_cta_clicked",
- "counts.in_product_marketing_email_admin_verify_0_sent",
- "counts.in_product_marketing_email_admin_verify_0_cta_clicked",
- "counts.ldap_users",
- "usage_activity_by_stage.create.projects_with_sectional_code_owner_rules",
- "usage_activity_by_stage.monitor.clusters_integrations_prometheus",
- "usage_activity_by_stage.monitor.projects_with_enabled_alert_integrations_histogram",
- "usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules",
- "usage_activity_by_stage_monthly.monitor.clusters_integrations_prometheus"]
- end
-
def fetch_value_by_query(query)
# Because test cases are run inside a transaction, if any query raise and error all queries that follows
# it are automatically canceled by PostgreSQL, to avoid that problem, and to provide exhaustive information
@@ -157,6 +114,24 @@ RSpec.describe Gitlab::Usage::ServicePingReport, :use_clean_rails_memory_store_c
accumulator
end
+ def type_cast_to_defined_type(value, metric_definition)
+ case metric_definition&.attributes&.fetch(:value_type)
+ when "string"
+ value.to_s
+ when "number"
+ value.to_i
+ when "object"
+ case metric_definition&.json_schema&.fetch("type")
+ when "array"
+ value.to_a
+ else
+ value.to_h
+ end
+ else
+ value
+ end
+ end
+
before do
stub_usage_data_connections
stub_object_store_settings
@@ -169,12 +144,13 @@ RSpec.describe Gitlab::Usage::ServicePingReport, :use_clean_rails_memory_store_c
let(:service_ping_payload) { described_class.for(output: :all_metrics_values) }
let(:metrics_queries_with_values) { build_payload_from_queries(described_class.for(output: :metrics_queries)) }
+ let(:metric_definitions) { ::Gitlab::Usage::MetricDefinition.definitions }
it 'generates queries that match collected data', :aggregate_failures do
message = "Expected %{query} result to match %{value} for %{key_path} metric"
metrics_queries_with_values.each do |key_path, query, value|
- next if failing_todo_metrics.include?(key_path.join('.'))
+ value = type_cast_to_defined_type(value, metric_definitions[key_path.join('.')])
expect(value).to(
eq(service_ping_payload.dig(*key_path)),
diff --git a/spec/lib/gitlab/usage_counters/pod_logs_spec.rb b/spec/lib/gitlab/usage_counters/pod_logs_spec.rb
deleted file mode 100644
index 1059c519b19..00000000000
--- a/spec/lib/gitlab/usage_counters/pod_logs_spec.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::UsageCounters::PodLogs, :clean_gitlab_redis_shared_state do
- it_behaves_like 'a usage counter'
-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 5f66387c82b..9aecb8f8b25 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
@@ -80,10 +80,13 @@ RSpec.describe Gitlab::UsageDataCounters::EditorUniqueCounter, :clean_gitlab_red
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)
diff --git a/spec/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter_spec.rb
new file mode 100644
index 00000000000..60c4424d2ae
--- /dev/null
+++ b/spec/lib/gitlab/usage_data_counters/ipynb_diff_activity_counter_spec.rb
@@ -0,0 +1,107 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::UsageDataCounters::IpynbDiffActivityCounter, :clean_gitlab_redis_shared_state do
+ let(:user) { build(:user, id: 1) }
+ let(:for_mr) { false }
+ let(:for_commit) { false }
+ let(:first_note) { build(:note, author: user, id: 1) }
+ let(:second_note) { build(:note, author: user, id: 2) }
+
+ before do
+ allow(first_note).to receive(:for_merge_request?).and_return(for_mr)
+ allow(second_note).to receive(:for_merge_request?).and_return(for_mr)
+ allow(first_note).to receive(:for_commit?).and_return(for_commit)
+ allow(second_note).to receive(:for_commit?).and_return(for_commit)
+ end
+
+ subject do
+ described_class.note_created(first_note)
+ described_class.note_created(first_note)
+ described_class.note_created(second_note)
+ end
+
+ shared_examples_for 'an action that tracks events' do
+ specify do
+ expect { 2.times { subject } }
+ .to change { event_count(action) }.by(2)
+ .and change { event_count(per_user_action) }.by(1)
+ end
+ end
+
+ shared_examples_for 'an action that does not track events' do
+ specify do
+ expect { 2.times { subject } }
+ .to change { event_count(action) }.by(0)
+ .and change { event_count(per_user_action) }.by(0)
+ end
+ end
+
+ describe '#track_note_created_in_ipynb_diff' do
+ context 'note is for commit' do
+ let(:for_commit) { true }
+
+ it_behaves_like 'an action that tracks events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_ACTION}
+ end
+
+ it_behaves_like 'an action that tracks events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_COMMIT_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_COMMIT_ACTION}
+ end
+
+ it_behaves_like 'an action that does not track events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_MR_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_MR_ACTION}
+ end
+ end
+
+ context 'note is for MR' do
+ let(:for_mr) { true }
+
+ it_behaves_like 'an action that tracks events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_MR_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_MR_ACTION}
+ end
+
+ it_behaves_like 'an action that tracks events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_ACTION}
+ end
+
+ it_behaves_like 'an action that does not track events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_COMMIT_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_COMMIT_ACTION}
+ end
+ end
+
+ context 'note is for neither MR nor Commit' do
+ it_behaves_like 'an action that does not track events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_ACTION}
+ end
+
+ it_behaves_like 'an action that does not track events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_MR_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_MR_ACTION}
+ end
+
+ it_behaves_like 'an action that does not track events' do
+ let(:action) {described_class::NOTE_CREATED_IN_IPYNB_DIFF_COMMIT_ACTION}
+ let(:per_user_action) {described_class::USER_CREATED_NOTE_IN_IPYNB_DIFF_COMMIT_ACTION}
+ end
+ end
+ end
+
+ private
+
+ def event_count(event_name)
+ Gitlab::UsageDataCounters::HLLRedisCounter.unique_events(
+ event_names: event_name,
+ start_date: 2.weeks.ago,
+ end_date: 2.weeks.from_now
+ )
+ end
+end
diff --git a/spec/lib/gitlab/usage_data_queries_spec.rb b/spec/lib/gitlab/usage_data_queries_spec.rb
index 88322e1b971..7c64a31c499 100644
--- a/spec/lib/gitlab/usage_data_queries_spec.rb
+++ b/spec/lib/gitlab/usage_data_queries_spec.rb
@@ -11,6 +11,12 @@ RSpec.describe Gitlab::UsageDataQueries do
end
end
+ describe '.with_duration' do
+ it 'yields passed block' do
+ expect { |block| described_class.with_duration(&block) }.to yield_with_no_args
+ end
+ end
+
describe '.count' do
it 'returns the raw SQL' do
expect(described_class.count(User)).to start_with('SELECT COUNT("users"."id") FROM "users"')
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 8a919a0a72e..7edec6d13f4 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -1080,7 +1080,7 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
it 'reports collected data categories' do
expected_value = %w[standard subscription operational optional]
- allow_next_instance_of(ServicePing::PermitDataCategoriesService) do |instance|
+ allow_next_instance_of(ServicePing::PermitDataCategories) do |instance|
expect(instance).to receive(:execute).and_return(expected_value)
end
@@ -1470,4 +1470,31 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures do
end
end
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
+
+ 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
+ end
+ end
end
diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb
index 01890305df4..b1de3e21b77 100644
--- a/spec/lib/gitlab/user_access_spec.rb
+++ b/spec/lib/gitlab/user_access_spec.rb
@@ -30,17 +30,6 @@ RSpec.describe Gitlab::UserAccess do
end
end
- describe 'push to branch in an internal project' do
- it 'will not infinitely loop when a project is internal' do
- project.visibility_level = Gitlab::VisibilityLevel::INTERNAL
- project.save!
-
- expect(project).not_to receive(:branch_allows_collaboration?)
-
- access.can_push_to_branch?('master')
- end
- end
-
describe 'push to empty project' do
let(:empty_project) { create(:project_empty_repo) }
let(:project_access) { described_class.new(user, container: empty_project) }
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index b44c6565538..a74a9f06c6f 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -31,6 +31,12 @@ RSpec.describe Gitlab::Utils::UsageData do
end
end
+ describe '.with_duration' do
+ it 'yields passed block' do
+ expect { |block| described_class.with_duration(&block) }.to yield_with_no_args
+ end
+ end
+
describe '#add_metric' do
let(:metric) { 'UuidMetric'}
@@ -48,6 +54,13 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.count(relation, batch: false)).to eq(1)
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+ allow(relation).to receive(:count).and_return(1)
+
+ described_class.count(relation, batch: false)
+ end
+
context 'when counting fails' do
subject { described_class.count(relation, batch: false) }
@@ -68,6 +81,13 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.distinct_count(relation, batch: false)).to eq(1)
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+ allow(relation).to receive(:distinct_count_by).and_return(1)
+
+ described_class.distinct_count(relation, batch: false)
+ end
+
context 'when counting fails' do
subject { described_class.distinct_count(relation, batch: false) }
@@ -206,14 +226,6 @@ RSpec.describe Gitlab::Utils::UsageData do
it_behaves_like 'failing hardening method'
end
-
- it 'logs error and returns DISTRIBUTED_HLL_FALLBACK value when counting raises any error', :aggregate_failures do
- error = StandardError.new('')
- allow(Gitlab::Database::PostgresHll::BatchDistinctCounter).to receive(:new).and_raise(error)
-
- expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception).with(error)
- expect(described_class.estimate_batch_distinct_count(relation)).to eq(4)
- end
end
end
@@ -229,6 +241,13 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.sum(relation, :column, batch_size: 100, start: 2, finish: 3)).to eq(1)
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+ allow(Gitlab::Database::BatchCount).to receive(:batch_sum).and_return(1)
+
+ described_class.sum(relation, :column)
+ end
+
context 'when counting fails' do
subject { described_class.sum(relation, :column) }
@@ -316,6 +335,12 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(histogram).to eq('2' => 1)
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+
+ described_class.histogram(relation, column, buckets: 1..100)
+ end
+
context 'when query timeout' do
subject do
with_statement_timeout(0.001) do
@@ -368,6 +393,12 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.add).to eq(0)
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+
+ described_class.add
+ end
+
context 'when adding fails' do
subject { described_class.add(nil, 3) }
@@ -392,6 +423,12 @@ RSpec.describe Gitlab::Utils::UsageData do
it_behaves_like 'failing hardening method', StandardError
end
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+
+ described_class.alt_usage_data
+ end
+
it 'returns the evaluated block when give' do
expect(described_class.alt_usage_data { Gitlab::CurrentSettings.uuid } ).to eq(Gitlab::CurrentSettings.uuid)
end
@@ -402,6 +439,12 @@ RSpec.describe Gitlab::Utils::UsageData do
end
describe '#redis_usage_data' do
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+
+ described_class.redis_usage_data
+ end
+
context 'with block given' do
context 'when method fails' do
subject { described_class.redis_usage_data { raise ::Redis::CommandError } }
@@ -445,6 +488,12 @@ RSpec.describe Gitlab::Utils::UsageData do
end
describe '#with_prometheus_client' do
+ it 'records duration' do
+ expect(described_class).to receive(:with_duration)
+
+ described_class.with_prometheus_client { |client| client }
+ end
+
it 'returns fallback with for an exception in yield block' do
allow(described_class).to receive(:prometheus_client).and_return(Gitlab::PrometheusClient.new('http://localhost:9090'))
result = described_class.with_prometheus_client(fallback: -42) { |client| raise StandardError }
diff --git a/spec/lib/gitlab/utils_spec.rb b/spec/lib/gitlab/utils_spec.rb
index 6b12fb4a84a..0648d276a6b 100644
--- a/spec/lib/gitlab/utils_spec.rb
+++ b/spec/lib/gitlab/utils_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Gitlab::Utils do
using RSpec::Parameterized::TableSyntax
- delegate :to_boolean, :boolean_to_yes_no, :slugify, :random_string, :which,
+ delegate :to_boolean, :boolean_to_yes_no, :slugify, :which,
:ensure_array_from_string, :to_exclusive_sentence, :bytes_to_megabytes,
:append_path, :check_path_traversal!, :allowlisted?, :check_allowed_absolute_path!, :decode_path, :ms_to_round_sec, :check_allowed_absolute_path_and_path_traversal!, to: :described_class
@@ -311,12 +311,6 @@ RSpec.describe Gitlab::Utils do
end
end
- describe '.random_string' do
- it 'generates a string' do
- expect(random_string).to be_kind_of(String)
- end
- end
-
describe '.which' do
before do
stub_env('PATH', '/sbin:/usr/bin:/home/joe/bin')
diff --git a/spec/lib/gitlab/workhorse_spec.rb b/spec/lib/gitlab/workhorse_spec.rb
index 3bab9aec454..703a4b5399e 100644
--- a/spec/lib/gitlab/workhorse_spec.rb
+++ b/spec/lib/gitlab/workhorse_spec.rb
@@ -244,15 +244,13 @@ RSpec.describe Gitlab::Workhorse do
GitalyServer: {
features: { 'gitaly-feature-enforce-requests-limits' => 'true' },
address: Gitlab::GitalyClient.address('default'),
- token: Gitlab::GitalyClient.token('default'),
- sidechannel: false
+ token: Gitlab::GitalyClient.token('default')
}
}
end
before do
allow(Gitlab.config.gitaly).to receive(:enabled).and_return(true)
- stub_feature_flags(workhorse_use_sidechannel: false)
end
it 'includes a Repository param' do
@@ -334,46 +332,6 @@ RSpec.describe Gitlab::Workhorse do
it { expect { subject }.to raise_exception('Unsupported action: download') }
end
-
- context 'when workhorse_use_sidechannel flag is set' do
- context 'when a feature flag is set globally' do
- before do
- stub_feature_flags(workhorse_use_sidechannel: true)
- end
-
- it 'sets the flag to true' do
- response = described_class.git_http_ok(repository, Gitlab::GlRepository::PROJECT, user, action)
-
- expect(response.dig(:GitalyServer, :sidechannel)).to eq(true)
- end
- end
-
- context 'when a feature flag is set for a single project' do
- before do
- stub_feature_flags(workhorse_use_sidechannel: project)
- end
-
- it 'sets the flag to true for that project' do
- response = described_class.git_http_ok(repository, Gitlab::GlRepository::PROJECT, user, action)
-
- expect(response.dig(:GitalyServer, :sidechannel)).to eq(true)
- end
-
- it 'sets the flag to false for other projects' do
- other_project = create(:project, :public, :repository)
- response = described_class.git_http_ok(other_project.repository, Gitlab::GlRepository::PROJECT, user, action)
-
- expect(response.dig(:GitalyServer, :sidechannel)).to eq(false)
- end
-
- it 'sets the flag to false when there is no project' do
- snippet = create(:personal_snippet, :repository)
- response = described_class.git_http_ok(snippet.repository, Gitlab::GlRepository::SNIPPET, user, action)
-
- expect(response.dig(:GitalyServer, :sidechannel)).to eq(false)
- end
- end
- end
end
context 'when receive_max_input_size has been updated' do
@@ -448,6 +406,14 @@ RSpec.describe Gitlab::Workhorse do
end
end
+ describe '.detect_content_type' do
+ subject { described_class.detect_content_type }
+
+ it 'returns array setting detect content type in workhorse' do
+ expect(subject).to eq(%w[Gitlab-Workhorse-Detect-Content-Type true])
+ end
+ end
+
describe '.send_git_blob' do
include FakeBlobHelpers
diff --git a/spec/lib/gitlab/zentao/client_spec.rb b/spec/lib/gitlab/zentao/client_spec.rb
index 86b310fe417..135f13e6265 100644
--- a/spec/lib/gitlab/zentao/client_spec.rb
+++ b/spec/lib/gitlab/zentao/client_spec.rb
@@ -130,4 +130,36 @@ RSpec.describe Gitlab::Zentao::Client do
end
end
end
+
+ describe '#url' do
+ context 'api url' do
+ shared_examples 'joins api_url correctly' do
+ it 'verify url' do
+ expect(integration.send(:url, "products/1").to_s)
+ .to eq("https://jihudemo.zentao.net/zentao/api.php/v1/products/1")
+ end
+ end
+
+ context 'no ends slash' do
+ let(:zentao_integration) { create(:zentao_integration, api_url: 'https://jihudemo.zentao.net/zentao') }
+
+ include_examples 'joins api_url correctly'
+ end
+
+ context 'ends slash' do
+ let(:zentao_integration) { create(:zentao_integration, api_url: 'https://jihudemo.zentao.net/zentao/') }
+
+ include_examples 'joins api_url correctly'
+ end
+ end
+
+ context 'no api url' do
+ let(:zentao_integration) { create(:zentao_integration, url: 'https://jihudemo.zentao.net') }
+
+ it 'joins url correctly' do
+ expect(integration.send(:url, "products/1").to_s)
+ .to eq("https://jihudemo.zentao.net/api.php/v1/products/1")
+ end
+ end
+ end
end
diff --git a/spec/lib/service_ping/build_payload_spec.rb b/spec/lib/service_ping/build_payload_spec.rb
new file mode 100644
index 00000000000..6cce07262b2
--- /dev/null
+++ b/spec/lib/service_ping/build_payload_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::BuildPayload do
+ describe '#execute', :without_license do
+ subject(:service_ping_payload) { described_class.new.execute }
+
+ include_context 'stubbed service ping metrics definitions' do
+ let(:subscription_metrics) do
+ [
+ metric_attributes('active_user_count', "subscription")
+ ]
+ end
+ end
+
+ context 'when usage_ping_enabled setting is false' do
+ before do
+ # Gitlab::CurrentSettings.usage_ping_enabled? == false
+ stub_config_setting(usage_ping_enabled: false)
+ end
+
+ it 'returns empty service ping payload' do
+ expect(service_ping_payload).to eq({})
+ end
+ end
+
+ context 'when usage_ping_enabled setting is true' do
+ before do
+ # Gitlab::CurrentSettings.usage_ping_enabled? == true
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it_behaves_like 'complete service ping payload'
+
+ context 'with require stats consent enabled' do
+ before do
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: true))
+ end
+
+ it 'returns empty service ping payload' do
+ expect(service_ping_payload).to eq({})
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/service_ping/devops_report_spec.rb b/spec/lib/service_ping/devops_report_spec.rb
new file mode 100644
index 00000000000..793f3066097
--- /dev/null
+++ b/spec/lib/service_ping/devops_report_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::DevopsReport do
+ let_it_be(:data) { { "conv_index": {} }.to_json }
+ let_it_be(:subject) { ServicePing::DevopsReport.new(Gitlab::Json.parse(data)) }
+ let_it_be(:devops_report) { DevOpsReport::Metric.new }
+
+ describe '#execute' do
+ context 'when metric is persisted' do
+ before do
+ allow(DevOpsReport::Metric).to receive(:create).and_return(devops_report)
+ allow(devops_report).to receive(:persisted?).and_return(true)
+ end
+
+ it 'does not call `track_and_raise_for_dev_exception`' do
+ expect(Gitlab::ErrorTracking).not_to receive(:track_and_raise_for_dev_exception)
+ subject.execute
+ end
+ end
+
+ context 'when metric is not persisted' do
+ before do
+ allow(DevOpsReport::Metric).to receive(:create).and_return(devops_report)
+ allow(devops_report).to receive(:persisted?).and_return(false)
+ end
+
+ it 'calls `track_and_raise_for_dev_exception`' do
+ expect(Gitlab::ErrorTracking).to receive(:track_and_raise_for_dev_exception)
+ subject.execute
+ end
+ end
+ end
+end
diff --git a/spec/lib/service_ping/permit_data_categories_spec.rb b/spec/lib/service_ping/permit_data_categories_spec.rb
new file mode 100644
index 00000000000..d1027a6f1ab
--- /dev/null
+++ b/spec/lib/service_ping/permit_data_categories_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::PermitDataCategories do
+ describe '#execute', :without_license do
+ subject(:permitted_categories) { described_class.new.execute }
+
+ context 'when usage ping setting is set to true' do
+ before do
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: false))
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it 'returns all categories' do
+ expect(permitted_categories).to match_array(%w[standard subscription operational optional])
+ end
+ end
+
+ context 'when usage ping setting is set to false' do
+ before do
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: false))
+ stub_config_setting(usage_ping_enabled: false)
+ end
+
+ it 'returns no categories' do
+ expect(permitted_categories).to match_array([])
+ end
+ end
+
+ context 'when User.single_user&.requires_usage_stats_consent? is required' do
+ before do
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: true))
+ stub_config_setting(usage_ping_enabled: true)
+ end
+
+ it 'returns no categories' do
+ expect(permitted_categories).to match_array([])
+ end
+ end
+ end
+end
diff --git a/spec/lib/service_ping/service_ping_settings_spec.rb b/spec/lib/service_ping/service_ping_settings_spec.rb
new file mode 100644
index 00000000000..040a5027274
--- /dev/null
+++ b/spec/lib/service_ping/service_ping_settings_spec.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ServicePing::ServicePingSettings do
+ using RSpec::Parameterized::TableSyntax
+
+ describe '#product_intelligence_enabled?' do
+ where(:usage_ping_enabled, :requires_usage_stats_consent, :expected_product_intelligence_enabled) do
+ # Usage ping enabled
+ true | false | true
+ true | true | false
+
+ # Usage ping disabled
+ false | false | false
+ false | true | false
+ end
+
+ with_them do
+ before do
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: requires_usage_stats_consent))
+ stub_config_setting(usage_ping_enabled: usage_ping_enabled)
+ end
+
+ it 'has the correct product_intelligence_enabled?' do
+ expect(described_class.product_intelligence_enabled?).to eq(expected_product_intelligence_enabled)
+ end
+ end
+ end
+
+ describe '#enabled?' do
+ describe 'has the correct enabled' do
+ it 'when false' do
+ stub_config_setting(usage_ping_enabled: false)
+
+ expect(described_class.enabled?).to eq(false)
+ end
+
+ it 'when true' do
+ stub_config_setting(usage_ping_enabled: true)
+
+ expect(described_class.enabled?).to eq(true)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb b/spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb
index 1ba89af1b02..246df2e409b 100644
--- a/spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb
@@ -22,14 +22,6 @@ RSpec.describe Sidebars::Groups::Menus::CiCdMenu do
specify { is_expected.not_to be_nil }
- describe 'when feature flag :runner_list_group_view_vue_ui is disabled' do
- before do
- stub_feature_flags(runner_list_group_view_vue_ui: false)
- end
-
- specify { is_expected.to be_nil }
- end
-
describe 'when the user does not have access' do
let(:user) { nil }
diff --git a/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb
index 36d5b3376b7..5bf8be9d6e5 100644
--- a/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Sidebars::Groups::Menus::KubernetesMenu do
+RSpec.describe Sidebars::Groups::Menus::KubernetesMenu, :request_store do
let_it_be(:owner) { create(:user) }
let_it_be(:group) do
build(:group, :private).tap do |g|
diff --git a/spec/lib/sidebars/groups/menus/settings_menu_spec.rb b/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
index 71b696516b6..252da8ea699 100644
--- a/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
+++ b/spec/lib/sidebars/groups/menus/settings_menu_spec.rb
@@ -72,18 +72,6 @@ RSpec.describe Sidebars::Groups::Menus::SettingsMenu do
let(:item_id) { :ci_cd }
it_behaves_like 'access rights checks'
-
- describe 'when runner list group view is disabled' do
- before do
- stub_feature_flags(runner_list_group_view_vue_ui: false)
- end
-
- it_behaves_like 'access rights checks'
-
- it 'has group runners as active_routes' do
- expect(subject.active_routes[:path]).to match_array %w[ci_cd#show groups/runners#show groups/runners#edit]
- end
- end
end
describe 'Applications menu' do
diff --git a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
index 81114f5a0b3..2da7d324708 100644
--- a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb
@@ -39,27 +39,17 @@ RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu do
subject.renderable_items.delete(find_menu_item(:kubernetes))
end
- it 'menu link points to Serverless page' do
- expect(subject.link).to eq find_menu_item(:serverless).link
+ it 'menu link points to Terraform page' do
+ expect(subject.link).to eq find_menu_item(:terraform).link
end
- context 'when Serverless menu is not visible' do
+ context 'when Terraform menu is not visible' do
before do
- subject.renderable_items.delete(find_menu_item(:serverless))
+ subject.renderable_items.delete(find_menu_item(:terraform))
end
- it 'menu link points to Terraform page' do
- expect(subject.link).to eq find_menu_item(:terraform).link
- end
-
- context 'when Terraform menu is not visible' do
- before do
- subject.renderable_items.delete(find_menu_item(:terraform))
- end
-
- it 'menu link points to Google Cloud page' do
- expect(subject.link).to eq find_menu_item(:google_cloud).link
- end
+ it 'menu link points to Google Cloud page' do
+ expect(subject.link).to eq find_menu_item(:google_cloud).link
end
end
end
@@ -88,20 +78,6 @@ RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu do
it_behaves_like 'access rights checks'
end
- describe 'Serverless' do
- let(:item_id) { :serverless }
-
- it_behaves_like 'access rights checks'
-
- context 'when feature :deprecated_serverless is disabled' do
- before do
- stub_feature_flags(deprecated_serverless: false)
- end
-
- it { is_expected.to be_nil }
- end
- end
-
describe 'Terraform' do
let(:item_id) { :terraform }
diff --git a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
index e8c6fb790c3..b11c9db4e46 100644
--- a/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/monitor_menu_spec.rb
@@ -72,12 +72,28 @@ RSpec.describe Sidebars::Projects::Menus::MonitorMenu 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
diff --git a/spec/lib/tasks/gitlab/metrics_exporter_task_spec.rb b/spec/lib/tasks/gitlab/metrics_exporter_task_spec.rb
new file mode 100644
index 00000000000..dfb3c511470
--- /dev/null
+++ b/spec/lib/tasks/gitlab/metrics_exporter_task_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'rake_helper'
+require_relative '../../../support/helpers/next_instance_of'
+
+RSpec.describe 'gitlab:metrics_exporter:install' do
+ before do
+ Rake.application.rake_require 'tasks/gitlab/metrics_exporter'
+ end
+
+ subject(:task) do
+ Rake::Task['gitlab:metrics_exporter:install']
+ end
+
+ context 'when no target directory is specified' do
+ it 'aborts with an error message' do
+ expect do
+ expect { task.execute }.to output(/Please specify the directory/).to_stdout
+ end.to raise_error(SystemExit)
+ end
+ end
+
+ context 'when target directory is specified' do
+ let(:args) { Rake::TaskArguments.new(%w(dir), %w(path/to/exporter)) }
+ let(:context) { TOPLEVEL_BINDING.eval('self') }
+ let(:expected_clone_params) do
+ {
+ repo: 'https://gitlab.com/gitlab-org/gitlab-metrics-exporter.git',
+ version: 'main',
+ target_dir: 'path/to/exporter'
+ }
+ end
+
+ context 'when dependencies are missing' do
+ it 'aborts with an error message' do
+ expect(Gitlab::Utils).to receive(:which).with('gmake').ordered
+ expect(Gitlab::Utils).to receive(:which).with('make').ordered
+
+ expect do
+ expect { task.execute(args) }.to output(/Couldn't find a 'make' binary/).to_stdout
+ end.to raise_error(SystemExit)
+ end
+ end
+
+ it 'installs the exporter with gmake' do
+ expect(Gitlab::Utils).to receive(:which).with('gmake').and_return('path/to/gmake').ordered
+ expect(context).to receive(:checkout_or_clone_version).with(hash_including(expected_clone_params)).ordered
+ expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
+ expect(context).to receive(:run_command!).with(['path/to/gmake']).ordered
+
+ task.execute(args)
+ end
+
+ it 'installs the exporter with make' do
+ expect(Gitlab::Utils).to receive(:which).with('gmake').ordered
+ expect(Gitlab::Utils).to receive(:which).with('make').and_return('path/to/make').ordered
+ expect(context).to receive(:checkout_or_clone_version).with(hash_including(expected_clone_params)).ordered
+ expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
+ expect(context).to receive(:run_command!).with(['path/to/make']).ordered
+
+ task.execute(args)
+ end
+
+ context 'when overriding version via environment variable' do
+ before do
+ stub_env('GITLAB_METRICS_EXPORTER_VERSION', '1.0')
+ end
+
+ it 'clones from repository with that version instead' do
+ expect(Gitlab::Utils).to receive(:which).with('gmake').and_return('path/to/gmake').ordered
+ expect(context).to receive(:checkout_or_clone_version).with(
+ hash_including(expected_clone_params.merge(version: '1.0'))
+ ).ordered
+ expect(Dir).to receive(:chdir).with('path/to/exporter').and_yield.ordered
+ expect(context).to receive(:run_command!).with(['path/to/gmake']).ordered
+
+ task.execute(args)
+ 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 e62719f4283..7f3896a3d51 100644
--- a/spec/mailers/emails/in_product_marketing_spec.rb
+++ b/spec/mailers/emails/in_product_marketing_spec.rb
@@ -103,4 +103,28 @@ RSpec.describe Emails::InProductMarketing do
end
end
end
+
+ describe '#build_ios_app_guide_email' do
+ subject { Notify.build_ios_app_guide_email(user.notification_email_or_default) }
+
+ it 'sends to the right user' do
+ expect(subject).to deliver_to(user.notification_email_or_default)
+ end
+
+ it 'has the correct subject and content' do
+ message = Gitlab::Email::Message::BuildIosAppGuide.new
+ cta_url = 'https://about.gitlab.com/blog/2019/03/06/ios-publishing-with-gitlab-and-fastlane/'
+ cta2_url = 'https://www.youtube.com/watch?v=325FyJt7ZG8'
+
+ aggregate_failures do
+ is_expected.to have_subject(message.subject_line)
+ is_expected.to have_body_text(message.title)
+ is_expected.to have_body_text(message.body_line1)
+ is_expected.to have_body_text(CGI.unescapeHTML(message.cta_link))
+ is_expected.to have_body_text(CGI.unescapeHTML(message.cta2_link))
+ is_expected.to have_body_text(cta_url)
+ is_expected.to have_body_text(cta2_url)
+ end
+ end
+ end
end
diff --git a/spec/mailers/emails/merge_requests_spec.rb b/spec/mailers/emails/merge_requests_spec.rb
index dea54f7315d..7682cf39450 100644
--- a/spec/mailers/emails/merge_requests_spec.rb
+++ b/spec/mailers/emails/merge_requests_spec.rb
@@ -65,7 +65,9 @@ RSpec.describe Emails::MergeRequests do
is_expected.to have_body_text('due to conflict.')
is_expected.to have_link(merge_request.to_reference, href: project_merge_request_url(merge_request.target_project, merge_request))
is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_html_part_content(assignee.name)
is_expected.to have_text_part_content(reviewer.name)
+ is_expected.to have_html_part_content(reviewer.name)
end
end
end
@@ -182,6 +184,36 @@ RSpec.describe Emails::MergeRequests do
end
end
+ describe '#approved_merge_request_email' do
+ subject { Notify.approved_merge_request_email(recipient.id, merge_request.id, current_user.id) }
+
+ it 'has the correct body' do
+ aggregate_failures do
+ is_expected.to have_body_text('was approved by')
+ is_expected.to have_body_text(current_user.name)
+ is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_html_part_content(assignee.name)
+ is_expected.to have_text_part_content(reviewer.name)
+ is_expected.to have_html_part_content(reviewer.name)
+ end
+ end
+ end
+
+ describe '#unapproved_merge_request_email' do
+ subject { Notify.unapproved_merge_request_email(recipient.id, merge_request.id, current_user.id) }
+
+ it 'has the correct body' do
+ aggregate_failures do
+ is_expected.to have_body_text('was unapproved by')
+ is_expected.to have_body_text(current_user.name)
+ is_expected.to have_text_part_content(assignee.name)
+ is_expected.to have_html_part_content(assignee.name)
+ is_expected.to have_text_part_content(reviewer.name)
+ is_expected.to have_html_part_content(reviewer.name)
+ end
+ end
+ end
+
describe "#resolved_all_discussions_email" do
subject { Notify.resolved_all_discussions_email(recipient.id, merge_request.id, current_user.id) }
diff --git a/spec/mailers/emails/projects_spec.rb b/spec/mailers/emails/projects_spec.rb
index b9c71e35bc6..ef3c21b32ce 100644
--- a/spec/mailers/emails/projects_spec.rb
+++ b/spec/mailers/emails/projects_spec.rb
@@ -180,4 +180,32 @@ RSpec.describe Emails::Projects do
end
end
end
+
+ describe '.inactive_project_deletion_warning_email' do
+ let(:recipient) { user }
+ let(:deletion_date) { "2022-01-10" }
+
+ subject { Notify.inactive_project_deletion_warning_email(project, user, deletion_date) }
+
+ it_behaves_like 'an email sent to a user'
+ it_behaves_like 'an email sent from GitLab'
+ it_behaves_like 'it should not have Gmail Actions links'
+ it_behaves_like 'a user cannot unsubscribe through footer link'
+ it_behaves_like 'appearance header and footer enabled'
+ it_behaves_like 'appearance header and footer not enabled'
+
+ it 'has the correct subject and body' do
+ project_link = "<a href=\"#{project.http_url_to_repo}\">#{project.name}</a>"
+
+ is_expected.to have_subject("#{project.name} | Action required: Project #{project.name} is scheduled to be " \
+ "deleted on 2022-01-10 due to inactivity")
+ is_expected.to have_body_text(project.http_url_to_repo)
+ is_expected.to have_body_text("Due to inactivity, the #{project_link} project is scheduled to be deleted " \
+ "on <b>2022-01-10</b>")
+ is_expected.to have_body_text("To ensure #{project_link} is unscheduled for deletion, check that activity has " \
+ "been logged by GitLab")
+ is_expected.to have_body_text("This email supersedes any previous emails about scheduled deletion you may " \
+ "have received for #{project_link}.")
+ end
+ end
end
diff --git a/spec/metrics_server/metrics_server_spec.rb b/spec/metrics_server/metrics_server_spec.rb
index 591840dcba2..4c188a6ba29 100644
--- a/spec/metrics_server/metrics_server_spec.rb
+++ b/spec/metrics_server/metrics_server_spec.rb
@@ -15,6 +15,8 @@ RSpec.describe MetricsServer do # rubocop:disable RSpec/FilePath
let(:ruby_sampler_double) { double(Gitlab::Metrics::Samplers::RubySampler) }
before do
+ # Make sure we never actually spawn any new processes in a unit test.
+ %i(spawn fork detach).each { |m| allow(Process).to receive(m) }
# We do not want this to have knock-on effects on the test process.
allow(Gitlab::ProcessManagement).to receive(:modify_signals)
@@ -67,35 +69,107 @@ RSpec.describe MetricsServer do # rubocop:disable RSpec/FilePath
end
describe '.spawn' do
- let(:expected_env) do
- {
- 'METRICS_SERVER_TARGET' => target,
- 'WIPE_METRICS_DIR' => '0'
- }
- end
+ context 'for legacy Ruby server' do
+ let(:expected_env) do
+ {
+ 'METRICS_SERVER_TARGET' => target,
+ 'WIPE_METRICS_DIR' => '0',
+ 'GITLAB_CONFIG' => 'path/to/config/gitlab.yml'
+ }
+ end
+
+ before do
+ stub_env('GITLAB_CONFIG', 'path/to/config/gitlab.yml')
+ end
- it 'spawns a new server process and returns its PID' do
- expect(Process).to receive(:spawn).with(
- expected_env,
- end_with('bin/metrics-server'),
- hash_including(pgroup: true)
- ).and_return(99)
- expect(Process).to receive(:detach).with(99)
+ it 'spawns a new server process and returns its PID' do
+ expect(Process).to receive(:spawn).with(
+ expected_env,
+ end_with('bin/metrics-server'),
+ hash_including(pgroup: true)
+ ).and_return(99)
+ expect(Process).to receive(:detach).with(99)
- pid = described_class.spawn(target, metrics_dir: metrics_dir)
+ pid = described_class.spawn(target, metrics_dir: metrics_dir)
- expect(pid).to eq(99)
+ expect(pid).to eq(99)
+ end
end
- context 'when path to gitlab.yml is passed' do
- it 'sets the GITLAB_CONFIG environment variable' do
+ context 'for Golang server' do
+ let(:log_enabled) { false }
+ let(:settings) do
+ {
+ 'web_exporter' => {
+ 'enabled' => true,
+ 'address' => 'localhost',
+ 'port' => '8083',
+ 'log_enabled' => log_enabled
+ },
+ 'sidekiq_exporter' => {
+ 'enabled' => true,
+ 'address' => 'localhost',
+ 'port' => '8082',
+ 'log_enabled' => log_enabled
+ }
+ }
+ end
+
+ let(:expected_port) { target == 'puma' ? '8083' : '8082' }
+ let(:expected_env) do
+ {
+ 'GME_MMAP_METRICS_DIR' => metrics_dir,
+ 'GME_PROBES' => 'self,mmap',
+ 'GME_SERVER_HOST' => 'localhost',
+ 'GME_SERVER_PORT' => expected_port,
+ 'GME_LOG_LEVEL' => 'quiet'
+ }
+ end
+
+ before do
+ stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
+ allow(::Settings).to receive(:monitoring).and_return(settings)
+ end
+
+ it 'spawns a new server process and returns its PID' do
expect(Process).to receive(:spawn).with(
- expected_env.merge('GITLAB_CONFIG' => 'path/to/config/gitlab.yml'),
- end_with('bin/metrics-server'),
+ expected_env,
+ 'gitlab-metrics-exporter',
+ hash_including(pgroup: true)
+ ).and_return(99)
+ expect(Process).to receive(:detach).with(99)
+
+ pid = described_class.spawn(target, metrics_dir: metrics_dir)
+
+ expect(pid).to eq(99)
+ end
+
+ it 'can launch from explicit path instead of PATH' do
+ expect(Process).to receive(:spawn).with(
+ expected_env,
+ '/path/to/gme/gitlab-metrics-exporter',
hash_including(pgroup: true)
).and_return(99)
- described_class.spawn(target, metrics_dir: metrics_dir, gitlab_config: 'path/to/config/gitlab.yml')
+ described_class.spawn(target, metrics_dir: metrics_dir, path: '/path/to/gme/')
+ end
+
+ context 'when logs are enabled' do
+ let(:log_enabled) { true }
+ let(:expected_log_file) { target == 'puma' ? 'web_exporter.log' : 'sidekiq_exporter.log' }
+
+ it 'sets log related environment variables' do
+ expect(Process).to receive(:spawn).with(
+ expected_env.merge(
+ 'GME_LOG_LEVEL' => 'info',
+ 'GME_LOG_FILE' => File.join(Rails.root, 'log', expected_log_file)
+ ),
+ 'gitlab-metrics-exporter',
+ hash_including(pgroup: true)
+ ).and_return(99)
+
+ described_class.spawn(target, metrics_dir: metrics_dir)
+ end
end
end
end
@@ -112,10 +186,21 @@ RSpec.describe MetricsServer do # rubocop:disable RSpec/FilePath
end
describe '.spawn' do
- it 'raises an error' do
- expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to(
- raise_error('Target must be one of [puma,sidekiq]')
- )
+ context 'for legacy Ruby server' do
+ it 'raises an error' do
+ expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to(
+ raise_error('Target must be one of [puma,sidekiq]')
+ )
+ end
+ end
+
+ context 'for Golang server' do
+ it 'raises an error' do
+ stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
+ expect { described_class.spawn('unsupported', metrics_dir: metrics_dir) }.to(
+ raise_error('Target must be one of [puma,sidekiq]')
+ )
+ end
end
end
end
@@ -220,28 +305,32 @@ RSpec.describe MetricsServer do # rubocop:disable RSpec/FilePath
end
context 'when the supervisor callback is invoked' do
- context 'and the supervisor is alive' do
- it 'restarts the metrics server' do
- expect(supervisor).to receive(:alive).and_return(true)
- expect(supervisor).to receive(:supervise).and_yield
- expect(Process).to receive(:spawn).with(
- include('METRICS_SERVER_TARGET' => 'puma'), end_with('bin/metrics-server'), anything
- ).twice.and_return(42)
-
- described_class.start_for_puma
- end
+ it 'restarts the metrics server' do
+ expect(supervisor).to receive(:supervise).and_yield
+ expect(Process).to receive(:spawn).with(
+ include('METRICS_SERVER_TARGET' => 'puma'), end_with('bin/metrics-server'), anything
+ ).twice.and_return(42)
+
+ described_class.start_for_puma
end
+ end
+ end
- context 'and the supervisor is not alive' do
- it 'does not restart the server' do
- expect(supervisor).to receive(:alive).and_return(false)
- expect(supervisor).to receive(:supervise).and_yield
- expect(Process).to receive(:spawn).with(
- include('METRICS_SERVER_TARGET' => 'puma'), end_with('bin/metrics-server'), anything
- ).once.and_return(42)
+ describe '.start_for_sidekiq' do
+ context 'for legacy Ruby server' do
+ it 'forks the parent process' do
+ expect(Process).to receive(:fork).and_return(42)
- described_class.start_for_puma
- end
+ described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics')
+ end
+ end
+
+ context 'for Golang server' do
+ it 'spawns the server process' do
+ stub_env('GITLAB_GOLANG_METRICS_SERVER', '1')
+ expect(Process).to receive(:spawn).and_return(42)
+
+ described_class.start_for_sidekiq(metrics_dir: '/path/to/metrics')
end
end
end
diff --git a/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb b/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb
deleted file mode 100644
index e1dc7487222..00000000000
--- a/spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-require_migration!
-
-RSpec.describe RescheduleArtifactExpiryBackfillAgain, :migration do
- let(:migration_class) { Gitlab::BackgroundMigration::BackfillArtifactExpiryDate }
- let(:migration_name) { migration_class.to_s.demodulize }
-
- before do
- table(:namespaces).create!(id: 123, name: 'test_namespace', path: 'test_namespace')
- table(:projects).create!(id: 123, name: 'sample_project', path: 'sample_project', namespace_id: 123)
- end
-
- it 'correctly schedules background migrations' do
- first_artifact = create_artifact(job_id: 0, expire_at: nil, created_at: Date.new(2020, 06, 21))
- second_artifact = create_artifact(job_id: 1, expire_at: nil, created_at: Date.new(2020, 06, 21))
- create_artifact(job_id: 2, expire_at: Date.yesterday, created_at: Date.new(2020, 06, 21))
- create_artifact(job_id: 3, expire_at: nil, created_at: Date.new(2020, 06, 23))
-
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- expect(BackgroundMigrationWorker.jobs.size).to eq(1)
- expect(migration_name).to be_scheduled_migration_with_multiple_args(first_artifact.id, second_artifact.id)
- end
- end
- end
-
- private
-
- def create_artifact(params)
- table(:ci_builds).create!(id: params[:job_id], project_id: 123)
- table(:ci_job_artifacts).create!(project_id: 123, file_type: 1, **params)
- end
-end
diff --git a/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb b/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
index 9addaaf2551..d1c04c5d320 100644
--- a/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
+++ b/spec/migrations/20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid_spec.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
+
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20210918201050_remove_old_pending_jobs_for_recalculate_vulnerabilities_occurrences_uuid.rb')
+require_migration!
def create_background_migration_jobs(ids, status, created_at)
proper_status = case status
diff --git a/spec/migrations/20220124130028_dedup_runner_projects_spec.rb b/spec/migrations/20220124130028_dedup_runner_projects_spec.rb
index 2698af6f6f5..127f4798f33 100644
--- a/spec/migrations/20220124130028_dedup_runner_projects_spec.rb
+++ b/spec/migrations/20220124130028_dedup_runner_projects_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20220124130028_dedup_runner_projects.rb')
+require_migration!
RSpec.describe DedupRunnerProjects, :migration, schema: 20220120085655 do
let(:namespaces) { table(:namespaces) }
diff --git a/spec/migrations/20220213103859_remove_integrations_type_spec.rb b/spec/migrations/20220213103859_remove_integrations_type_spec.rb
new file mode 100644
index 00000000000..b1a4370700a
--- /dev/null
+++ b/spec/migrations/20220213103859_remove_integrations_type_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe RemoveIntegrationsType, :migration do
+ subject(:migration) { described_class.new }
+
+ let(:integrations) { table(:integrations) }
+ let(:bg_migration) { instance_double(bg_migration_class) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'performs remaining background migrations', :aggregate_failures do
+ # Already migrated
+ integrations.create!(type: 'SlackService', type_new: 'Integrations::Slack')
+ # update required
+ record1 = integrations.create!(type: 'SlackService')
+ record2 = integrations.create!(type: 'JiraService')
+ record3 = integrations.create!(type: 'SlackService')
+
+ migrate!
+
+ expect(record1.reload.type_new).to eq 'Integrations::Slack'
+ expect(record2.reload.type_new).to eq 'Integrations::Jira'
+ expect(record3.reload.type_new).to eq 'Integrations::Slack'
+ end
+end
diff --git a/spec/migrations/20220324165436_schedule_backfill_project_settings_spec.rb b/spec/migrations/20220324165436_schedule_backfill_project_settings_spec.rb
new file mode 100644
index 00000000000..a8014e73bf0
--- /dev/null
+++ b/spec/migrations/20220324165436_schedule_backfill_project_settings_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleBackfillProjectSettings do
+ let_it_be(:migration) { described_class::MIGRATION }
+
+ 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
+ )
+ )
+ end
+ end
+end
diff --git a/spec/migrations/20220331133802_schedule_backfill_topics_title_spec.rb b/spec/migrations/20220331133802_schedule_backfill_topics_title_spec.rb
new file mode 100644
index 00000000000..13e8c42269b
--- /dev/null
+++ b/spec/migrations/20220331133802_schedule_backfill_topics_title_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ScheduleBackfillTopicsTitle do
+ let(:topics) { table(:topics) }
+
+ let!(:topic1) { topics.create!(name: 'topic1') }
+ let!(:topic2) { topics.create!(name: 'topic2') }
+ let!(:topic3) { topics.create!(name: 'topic3') }
+
+ it 'correctly schedules background migrations', :aggregate_failures do
+ stub_const("#{Gitlab::Database::Migrations::BackgroundMigrationHelpers}::BATCH_SIZE", 2)
+
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(2.minutes, topic1.id, topic2.id)
+ expect(described_class::MIGRATION).to be_scheduled_delayed_migration(4.minutes, topic3.id, topic3.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220420135946_update_batched_background_migration_arguments_spec.rb b/spec/migrations/20220420135946_update_batched_background_migration_arguments_spec.rb
new file mode 100644
index 00000000000..6dbee483e15
--- /dev/null
+++ b/spec/migrations/20220420135946_update_batched_background_migration_arguments_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe UpdateBatchedBackgroundMigrationArguments do
+ let(:batched_migrations) { table(:batched_background_migrations) }
+
+ before do
+ common_attributes = {
+ max_value: 10,
+ batch_size: 5,
+ sub_batch_size: 2,
+ interval: 2.minutes,
+ table_name: 'events',
+ column_name: 'id'
+ }
+
+ batched_migrations.create!(common_attributes.merge(job_class_name: 'Job1', job_arguments: '[]'))
+ batched_migrations.create!(common_attributes.merge(job_class_name: 'Job2', job_arguments: '["some_argument"]'))
+ batched_migrations.create!(common_attributes.merge(job_class_name: 'Job3', job_arguments: '[]'))
+ end
+
+ describe '#up' do
+ it 'updates batched migration arguments to have an empty jsonb array' do
+ expect { migrate! }
+ .to change { batched_migrations.where("job_arguments = '[]'").count }.from(0).to(2)
+ .and change { batched_migrations.where("job_arguments = '\"[]\"'").count }.from(2).to(0)
+ end
+ end
+
+ describe '#down' do
+ before do
+ migrate!
+ end
+
+ it 'reverts batched migration arguments to have the previous default' do
+ expect { schema_migrate_down! }
+ .to change { batched_migrations.where("job_arguments = '\"[]\"'").count }.from(0).to(2)
+ .and change { batched_migrations.where("job_arguments = '[]'").count }.from(2).to(0)
+ end
+ end
+end
diff --git a/spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb b/spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb
new file mode 100644
index 00000000000..c79325c5077
--- /dev/null
+++ b/spec/migrations/20220426185933_backfill_deployments_finished_at_spec.rb
@@ -0,0 +1,73 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe BackfillDeploymentsFinishedAt, :migration do
+ let(:deployments) { table(:deployments) }
+ let(:namespaces) { table(:namespaces) }
+
+ let(:namespace) { namespaces.create!(name: 'user', path: 'user') }
+ let(:project_namespace) { namespaces.create!(name: 'project', path: 'project', type: 'Project') }
+ let(:project) { table(:projects).create!(namespace_id: namespace.id, project_namespace_id: project_namespace.id) }
+ let(:environment) { table(:environments).create!(name: 'production', slug: 'production', project_id: project.id) }
+
+ describe '#up' do
+ context 'when a deployment row does not have a value for finished_at' do
+ context 'and deployment succeeded' do
+ before do
+ create_deployment!(status: described_class::DEPLOYMENT_STATUS_SUCCESS, finished_at: nil)
+ end
+
+ it 'copies created_at to finished_at' do
+ expect { migrate! }
+ .to change { deployments.last.finished_at }.from(nil).to(deployments.last.created_at)
+ .and not_change { deployments.last.created_at }
+ end
+ end
+
+ context 'and deployment does not have status: success' do
+ before do
+ create_deployment!(status: 0, finished_at: nil)
+ create_deployment!(status: 1, finished_at: nil)
+ create_deployment!(status: 3, finished_at: nil)
+ create_deployment!(status: 4, finished_at: nil)
+ create_deployment!(status: 5, finished_at: nil)
+ create_deployment!(status: 6, finished_at: nil)
+ end
+
+ it 'does not fill finished_at' do
+ expect { migrate! }.to not_change { deployments.where(finished_at: nil).count }
+ end
+ end
+ end
+
+ context 'when a deployment row has value for finished_at' do
+ let(:finished_at) { '2018-10-30 11:12:02 UTC' }
+
+ before do
+ create_deployment!(status: described_class::DEPLOYMENT_STATUS_SUCCESS, finished_at: finished_at)
+ end
+
+ it 'does not affect existing value' do
+ expect { migrate! }
+ .to not_change { deployments.last.finished_at }
+ .and not_change { deployments.last.created_at }
+ end
+ end
+ end
+
+ def create_deployment!(status:, finished_at:)
+ deployments.create!(
+ environment_id: environment.id,
+ project_id: project.id,
+ ref: 'master',
+ tag: false,
+ sha: 'x',
+ status: status,
+ iid: deployments.count + 1,
+ finished_at: finished_at
+ )
+ end
+end
diff --git a/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb b/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb
new file mode 100644
index 00000000000..769c0993b67
--- /dev/null
+++ b/spec/migrations/20220502015011_clean_up_fix_merge_request_diff_commit_users_spec.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration! 'clean_up_fix_merge_request_diff_commit_users'
+
+RSpec.describe CleanUpFixMergeRequestDiffCommitUsers, :migration do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:project_namespace) { namespaces.create!(name: 'project2', path: 'project2', type: 'Project') }
+ let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') }
+
+ describe '#up' do
+ it 'finalizes the background migration' do
+ expect(described_class).to be_finalize_background_migration_of('FixMergeRequestDiffCommitUsers')
+
+ migrate!
+ end
+
+ it 'processes pending background jobs' do
+ project = projects.create!(name: 'p1', namespace_id: namespace.id, project_namespace_id: project_namespace.id)
+
+ Gitlab::Database::BackgroundMigrationJob.create!(
+ class_name: 'FixMergeRequestDiffCommitUsers',
+ arguments: [project.id]
+ )
+
+ migrate!
+
+ background_migrations = Gitlab::Database::BackgroundMigrationJob
+ .where(class_name: 'FixMergeRequestDiffCommitUsers')
+
+ expect(background_migrations.count).to eq(0)
+ end
+ end
+end
diff --git a/spec/migrations/20220502173045_reset_too_many_tags_skipped_registry_imports_spec.rb b/spec/migrations/20220502173045_reset_too_many_tags_skipped_registry_imports_spec.rb
new file mode 100644
index 00000000000..cc4041fe151
--- /dev/null
+++ b/spec/migrations/20220502173045_reset_too_many_tags_skipped_registry_imports_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ResetTooManyTagsSkippedRegistryImports, :aggregate_failures do
+ let(:migration) { described_class::MIGRATION }
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:container_repositories) { table(:container_repositories) }
+
+ let!(:namespace) { namespaces.create!(id: 1, name: 'namespace', path: 'namespace') }
+ let!(:project) { projects.create!(id: 1, name: 'project', path: 'project', project_namespace_id: 1, namespace_id: 1) }
+
+ let!(:container_repository1) do
+ container_repositories.create!(
+ name: 'container_repository1',
+ project_id: 1,
+ migration_state: 'import_skipped',
+ migration_skipped_reason: 2
+ )
+ end
+
+ let!(:container_repository2) do
+ container_repositories.create!(
+ name: 'container_repository2',
+ project_id: 1,
+ migration_state: 'import_skipped',
+ migration_skipped_reason: 2
+ )
+ end
+
+ let!(:container_repository3) do
+ container_repositories.create!(
+ name: 'container_repository3',
+ project_id: 1,
+ migration_state: 'import_skipped',
+ migration_skipped_reason: 2
+ )
+ end
+
+ # this should not qualify for the migration
+ let!(:container_repository4) do
+ container_repositories.create!(
+ name: 'container_repository4',
+ project_id: 1,
+ migration_state: 'default'
+ )
+ end
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'schedules jobs to reset skipped registry imports' do
+ Sidekiq::Testing.fake! do
+ freeze_time do
+ migrate!
+
+ expect(migration).to be_scheduled_delayed_migration(
+ 2.minutes, container_repository1.id, container_repository2.id)
+ expect(migration).to be_scheduled_delayed_migration(
+ 4.minutes, container_repository3.id, container_repository3.id)
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/20220505044348_fix_automatic_iterations_cadences_start_date_spec.rb b/spec/migrations/20220505044348_fix_automatic_iterations_cadences_start_date_spec.rb
new file mode 100644
index 00000000000..8bc336a6b26
--- /dev/null
+++ b/spec/migrations/20220505044348_fix_automatic_iterations_cadences_start_date_spec.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe FixAutomaticIterationsCadencesStartDate,
+ quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/362446' do
+ let(:migration) { described_class.new }
+ let(:namespaces) { table(:namespaces) }
+ let(:sprints) { table(:sprints) }
+ let(:iterations_cadences) { table(:iterations_cadences) }
+
+ let!(:group1) { namespaces.create!(name: 'abc', path: 'abc') }
+ let!(:group2) { namespaces.create!(name: 'def', path: 'def') }
+
+ let(:jan2022) { Date.new(2022, 1, 1) }
+ let(:feb2022) { Date.new(2022, 2, 1) }
+ let(:may2022) { Date.new(2022, 5, 1) }
+ let(:dec2022) { Date.new(2022, 12, 1) }
+
+ let!(:cadence1) { iterations_cadences.create!(start_date: jan2022, title: "ic 1", group_id: group1.id) }
+ let!(:cadence2) { iterations_cadences.create!(start_date: may2022, group_id: group1.id, title: "ic 2") }
+ let!(:cadence3) do
+ iterations_cadences.create!(start_date: jan2022, automatic: false, group_id: group2.id, title: "ic 3 (invalid)")
+ end
+
+ let!(:cadence4) { iterations_cadences.create!(start_date: jan2022, group_id: group2.id, title: "ic 4 (invalid)") }
+
+ before do
+ sprints.create!(id: 2, start_date: jan2022, due_date: jan2022 + 1.week, iterations_cadence_id: cadence1.id,
+ group_id: group1.id, iid: 1)
+ sprints.create!(id: 1, start_date: dec2022, due_date: dec2022 + 1.week, iterations_cadence_id: cadence1.id,
+ group_id: group1.id, iid: 2)
+
+ sprints.create!(id: 4, start_date: feb2022, due_date: feb2022 + 1.week, iterations_cadence_id: cadence3.id,
+ group_id: group2.id, iid: 1)
+ sprints.create!(id: 3, start_date: may2022, due_date: may2022 + 1.week, iterations_cadence_id: cadence3.id,
+ group_id: group2.id, iid: 2)
+
+ sprints.create!(id: 5, start_date: may2022, due_date: may2022 + 1.week, iterations_cadence_id: cadence4.id,
+ group_id: group2.id, iid: 4)
+ sprints.create!(id: 6, start_date: feb2022, due_date: feb2022 + 1.week, iterations_cadence_id: cadence4.id,
+ group_id: group2.id, iid: 3)
+ end
+
+ describe '#up' do
+ it "updates automatic iterations_cadence records to use start dates of their earliest sprint records" do
+ migrate!
+
+ # This cadence has a valid start date. Its start date should be left as it is
+ expect(cadence1.reload.start_date).to eq jan2022
+
+ # This cadence doesn't have an iteration. Its start date should be left as it is.
+ expect(cadence2.reload.start_date).to eq may2022
+
+ # This cadence has an invalid start date but it isn't automatic. Its start date should be left as it is.
+ expect(cadence3.reload.start_date).to eq jan2022
+
+ # This cadence has an invalid start date. Its start date should be fixed.
+ expect(cadence4.reload.start_date).to eq feb2022
+ end
+ end
+end
diff --git a/spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb b/spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb
new file mode 100644
index 00000000000..0c4d0e86789
--- /dev/null
+++ b/spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UpdateIndexOnAlertsToExcludeNullFingerprints do
+ let(:alerts) { 'alert_management_alerts'}
+ 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(subject.index_exists_by_name?(alerts, old_index)).to be_truthy
+ expect(subject.index_exists_by_name?(alerts, new_index)).to be_falsey
+ }
+
+ migration.after -> {
+ expect(subject.index_exists_by_name?(alerts, old_index)).to be_falsey
+ expect(subject.index_exists_by_name?(alerts, new_index)).to be_truthy
+ }
+ end
+ end
+end
diff --git a/spec/migrations/20220513043344_reschedule_expire_o_auth_tokens_spec.rb b/spec/migrations/20220513043344_reschedule_expire_o_auth_tokens_spec.rb
new file mode 100644
index 00000000000..63fff279acc
--- /dev/null
+++ b/spec/migrations/20220513043344_reschedule_expire_o_auth_tokens_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe RescheduleExpireOAuthTokens do
+ let_it_be(:migration) { described_class::MIGRATION }
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of oauth tokens' do
+ migrate!
+
+ expect(migration).to(
+ have_scheduled_batched_migration(
+ table_name: :oauth_access_tokens,
+ column_name: :id,
+ interval: described_class::INTERVAL
+ )
+ )
+ 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/associate_existing_dast_builds_with_variables_spec.rb b/spec/migrations/associate_existing_dast_builds_with_variables_spec.rb
index ce0ab4223e8..74429e498df 100644
--- a/spec/migrations/associate_existing_dast_builds_with_variables_spec.rb
+++ b/spec/migrations/associate_existing_dast_builds_with_variables_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'migrate', '20210629031900_associate_existing_dast_builds_with_variables.rb')
+require_migration!
RSpec.describe AssociateExistingDastBuildsWithVariables do
subject(:migration) { described_class.new }
diff --git a/spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb b/spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb
index 1a64de8d0db..16a08ec47c4 100644
--- a/spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb
+++ b/spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb
@@ -2,7 +2,6 @@
require 'spec_helper'
require_migration!
-# require Rails.root.join('db', 'post_migrate', '20210825193652_backfill_candence_id_for_boards_scoped_to_iteration.rb')
RSpec.describe BackfillCadenceIdForBoardsScopedToIteration, :migration do
let(:projects) { table(:projects) }
diff --git a/spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb b/spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb
new file mode 100644
index 00000000000..28578a3d79a
--- /dev/null
+++ b/spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe BackfillIntegrationsEnableSslVerification do
+ let_it_be(:migration) { described_class::MIGRATION }
+ let_it_be(:integrations) { described_class::Integration }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+
+ integrations.create!(id: 1, type_new: 'Integrations::DroneCi')
+ integrations.create!(id: 2, type_new: 'Integrations::DroneCi', properties: {})
+ integrations.create!(id: 3, type_new: 'Integrations::Bamboo', properties: {})
+ integrations.create!(id: 4, type_new: 'Integrations::Teamcity', properties: {})
+ integrations.create!(id: 5, type_new: 'Integrations::DroneCi', properties: {})
+ integrations.create!(id: 6, type_new: 'Integrations::Teamcity', properties: {})
+ end
+
+ describe '#up' do
+ it 'schedules background jobs for each batch of integrations', :freeze_time do
+ Sidekiq::Testing.fake! do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(2)
+ expect(migration).to be_scheduled_delayed_migration(5.minutes, 2, 4)
+ expect(migration).to be_scheduled_delayed_migration(10.minutes, 5, 6)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb b/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb
deleted file mode 100644
index 6798b0cc7e8..00000000000
--- a/spec/migrations/backfill_work_item_type_id_on_issues_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe BackfillWorkItemTypeIdOnIssues, :migration do
- let_it_be(:migration) { described_class::MIGRATION }
- let_it_be(:interval) { 2.minutes }
- let_it_be(:issue_type_enum) { { issue: 0, incident: 1, test_case: 2, requirement: 3, task: 4 } }
- let_it_be(:base_work_item_type_ids) do
- table(:work_item_types).where(namespace_id: nil).order(:base_type).each_with_object({}) do |type, hash|
- hash[type.base_type] = type.id
- end
- end
-
- describe '#up' do
- it 'correctly schedules background migrations' do
- Sidekiq::Testing.fake! do
- freeze_time do
- migrate!
-
- scheduled_migrations = Gitlab::Database::BackgroundMigration::BatchedMigration.where(job_class_name: migration)
- work_item_types = table(:work_item_types).where(namespace_id: nil)
-
- expect(scheduled_migrations.count).to eq(work_item_types.count)
-
- [:issue, :incident, :test_case, :requirement, :task].each do |issue_type|
- expect(migration).to have_scheduled_batched_migration(
- table_name: :issues,
- column_name: :id,
- job_arguments: [issue_type_enum[issue_type], base_work_item_type_ids[issue_type_enum[issue_type]]],
- interval: interval,
- batch_size: described_class::BATCH_SIZE,
- max_batch_size: described_class::MAX_BATCH_SIZE,
- sub_batch_size: described_class::SUB_BATCH_SIZE,
- batch_class_name: described_class::BATCH_CLASS_NAME
- )
- end
- end
- end
- 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/cleanup_after_fixing_regression_with_new_users_emails_spec.rb b/spec/migrations/cleanup_after_fixing_regression_with_new_users_emails_spec.rb
new file mode 100644
index 00000000000..043bb091df3
--- /dev/null
+++ b/spec/migrations/cleanup_after_fixing_regression_with_new_users_emails_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe CleanupAfterFixingRegressionWithNewUsersEmails, :sidekiq do
+ let(:migration) { described_class.new }
+ let(:users) { table(:users) }
+ let(:emails) { table(:emails) }
+
+ # rubocop: disable Layout/LineLength
+ let!(:user_1) { users.create!(name: 'confirmed-user-1', email: 'confirmed-1@example.com', confirmed_at: 3.days.ago, projects_limit: 100) }
+ let!(:user_2) { users.create!(name: 'confirmed-user-2', email: 'confirmed-2@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
+ let!(:user_3) { users.create!(name: 'confirmed-user-3', email: 'confirmed-3@example.com', confirmed_at: 1.day.ago, projects_limit: 100) }
+ let!(:user_4) { users.create!(name: 'unconfirmed-user', email: 'unconfirmed@example.com', confirmed_at: nil, projects_limit: 100) }
+
+ let!(:email_1) { emails.create!(email: 'confirmed-1@example.com', user_id: user_1.id, confirmed_at: 1.day.ago) }
+ let!(:email_2) { emails.create!(email: 'other_2@example.com', user_id: user_2.id, confirmed_at: 1.day.ago) }
+
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'adds primary email to emails for confirmed users that do not have their primary email in emails table', :aggregate_failures do
+ original_email_1_confirmed_at = email_1.reload.confirmed_at
+
+ expect { migration.up }.to change { emails.count }.by(2)
+
+ expect(emails.find_by(user_id: user_2.id, email: 'confirmed-2@example.com').confirmed_at).to eq(user_2.reload.confirmed_at)
+ expect(emails.find_by(user_id: user_3.id, email: 'confirmed-3@example.com').confirmed_at).to eq(user_3.reload.confirmed_at)
+ expect(email_1.reload.confirmed_at).to eq(original_email_1_confirmed_at)
+
+ expect(emails.exists?(user_id: user_4.id)).to be(false)
+ end
+ # rubocop: enable Layout/LineLength
+
+ it 'continues in case of errors with one email' do
+ allow(Email).to receive(:create) { raise 'boom!' }
+
+ expect { migration.up }.not_to raise_error
+ end
+end
diff --git a/spec/migrations/finalize_project_namespaces_backfill_spec.rb b/spec/migrations/finalize_project_namespaces_backfill_spec.rb
index 3d0b0ec13fe..56f3b0f6ba5 100644
--- a/spec/migrations/finalize_project_namespaces_backfill_spec.rb
+++ b/spec/migrations/finalize_project_namespaces_backfill_spec.rb
@@ -9,9 +9,11 @@ RSpec.describe FinalizeProjectNamespacesBackfill, :migration do
let_it_be(:migration) { described_class::MIGRATION }
describe '#up' do
- shared_examples 'raises migration not finished exception' do
- it 'raises exception' do
- expect { migrate! }.to raise_error(/Expected batched background migration for the given configuration to be marked as 'finished'/)
+ 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('"ProjectNamespaces::BackfillProjectNamespaces"', :projects, :id, [nil, "up"])
+ end
end
end
@@ -42,7 +44,7 @@ RSpec.describe FinalizeProjectNamespacesBackfill, :migration do
context 'when project namespace backfilling migration finished successfully' do
it 'does not raise exception' do
- expect { migrate! }.not_to raise_error(/Expected batched background migration for the given configuration to be marked as 'finished'/)
+ expect { migrate! }.not_to raise_error
end
end
@@ -61,7 +63,7 @@ RSpec.describe FinalizeProjectNamespacesBackfill, :migration do
project_namespace_backfill.update!(status: status)
end
- it_behaves_like 'raises migration not finished exception'
+ it_behaves_like 'finalizes the migration'
end
end
end
diff --git a/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb b/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb
index 4b8d3641247..1b6cb6a86a0 100644
--- a/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb
+++ b/spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'migrate', '20210526190553_insert_ci_daily_pipeline_schedule_triggers_plan_limits.rb')
+require_migration!
RSpec.describe InsertCiDailyPipelineScheduleTriggersPlanLimits do
let_it_be(:plans) { table(:plans) }
diff --git a/spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb b/spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb
index e838476a650..2108adcc973 100644
--- a/spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb
+++ b/spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20210610102413_migrate_protected_attribute_to_pending_builds.rb')
+require_migration!
RSpec.describe MigrateProtectedAttributeToPendingBuilds do
let(:namespaces) { table(:namespaces) }
diff --git a/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb b/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb
deleted file mode 100644
index 5e22fc06973..00000000000
--- a/spec/migrations/replace_work_item_type_backfill_next_batch_strategy_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require_migration!
-
-RSpec.describe ReplaceWorkItemTypeBackfillNextBatchStrategy, :migration do
- describe '#up' do
- it 'sets the new strategy for existing migrations' do
- migrations = create_migrations(described_class::OLD_STRATEGY_CLASS, 2)
-
- expect do
- migrate!
-
- migrations.each(&:reload)
- end.to change { migrations.pluck(:batch_class_name).uniq }.from([described_class::OLD_STRATEGY_CLASS])
- .to([described_class::NEW_STRATEGY_CLASS])
- end
- end
-
- describe '#down' do
- it 'sets the old strategy for existing migrations' do
- migrations = create_migrations(described_class::NEW_STRATEGY_CLASS, 2)
-
- expect do
- migrate!
- schema_migrate_down!
-
- migrations.each(&:reload)
- end.to change { migrations.pluck(:batch_class_name).uniq }.from([described_class::NEW_STRATEGY_CLASS])
- .to([described_class::OLD_STRATEGY_CLASS])
- end
- end
-
- def create_migrations(batch_class_name, count)
- Array.new(2) { |index| create_background_migration(batch_class_name, [index]) }
- end
-
- def create_background_migration(batch_class_name, job_arguments)
- migrations_table = table(:batched_background_migrations)
-
- migrations_table.create!(
- batch_class_name: batch_class_name,
- job_class_name: described_class::JOB_CLASS_NAME,
- max_value: 10,
- batch_size: 5,
- sub_batch_size: 1,
- interval: 2.minutes,
- table_name: :issues,
- column_name: :id,
- total_tuple_count: 10_000,
- pause_ms: 100,
- job_arguments: job_arguments
- )
- end
-end
diff --git a/spec/migrations/retry_backfill_traversal_ids_spec.rb b/spec/migrations/retry_backfill_traversal_ids_spec.rb
index e5ebd4228ca..910be9f2c69 100644
--- a/spec/migrations/retry_backfill_traversal_ids_spec.rb
+++ b/spec/migrations/retry_backfill_traversal_ids_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20210604070207_retry_backfill_traversal_ids.rb')
+require_migration!
RSpec.describe RetryBackfillTraversalIds, :migration do
include ReloadHelpers
diff --git a/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb
new file mode 100644
index 00000000000..9d7651d01ed
--- /dev/null
+++ b/spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+require_migration!
+
+RSpec.describe ScheduleBackfillDraftStatusOnMergeRequestsCorrectedRegex, :sidekiq do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:merge_requests) { table(:merge_requests) }
+
+ let!(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace') }
+ let(:proj_namespace) { namespaces.create!(name: 'proj1', path: 'proj1', type: 'Project', parent_id: namespace.id) }
+ let!(:project) { projects.create!(namespace_id: namespace.id, project_namespace_id: proj_namespace.id) }
+
+ let(:draft_prefixes) { ["[Draft]", "(Draft)", "Draft:", "Draft", "[WIP]", "WIP:", "WIP"] }
+
+ def create_merge_request(params)
+ common_params = {
+ target_project_id: project.id,
+ target_branch: 'feature1',
+ source_branch: 'master'
+ }
+
+ merge_requests.create!(common_params.merge(params))
+ end
+
+ before do
+ draft_prefixes.each do |prefix|
+ (1..4).each do |n|
+ create_merge_request(
+ title: "#{prefix} This is a title",
+ draft: false,
+ state_id: n
+ )
+
+ create_merge_request(
+ title: "This is a title with the #{prefix} in a weird spot",
+ draft: false,
+ state_id: n
+ )
+ end
+ end
+
+ stub_const("#{described_class}::BATCH_SIZE", 1)
+ end
+
+ it 'schedules BackfillDraftStatusOnMergeRequests background jobs' do
+ Sidekiq::Testing.fake! do
+ draft_mrs = MergeRequest.where(state_id: 1)
+ .where(draft: false)
+ .where("title ~* ?", described_class::CORRECTED_REGEXP_STR)
+
+ first_mr_id = draft_mrs.first.id
+ second_mr_id = draft_mrs.second.id
+
+ freeze_time do
+ migrate!
+
+ expect(BackgroundMigrationWorker.jobs.size).to eq(7)
+ expect(described_class::MIGRATION)
+ .to be_scheduled_delayed_migration(2.minutes, first_mr_id, first_mr_id)
+ expect(described_class::MIGRATION)
+ .to be_scheduled_delayed_migration(4.minutes, second_mr_id, second_mr_id)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/toggle_vsa_aggregations_enable_spec.rb b/spec/migrations/toggle_vsa_aggregations_enable_spec.rb
new file mode 100644
index 00000000000..a6850d493b7
--- /dev/null
+++ b/spec/migrations/toggle_vsa_aggregations_enable_spec.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe ToggleVsaAggregationsEnable, :migration do
+ let(:aggregations) { table(:analytics_cycle_analytics_aggregations) }
+ let(:groups) { table(:namespaces) }
+
+ let!(:group1) { groups.create!(name: 'aaa', path: 'aaa') }
+ let!(:group2) { groups.create!(name: 'aaa', path: 'aaa') }
+ let!(:group3) { groups.create!(name: 'aaa', path: 'aaa') }
+
+ let!(:aggregation1) { aggregations.create!(group_id: group1.id, enabled: false) }
+ let!(:aggregation2) { aggregations.create!(group_id: group2.id, enabled: true) }
+ let!(:aggregation3) { aggregations.create!(group_id: group3.id, enabled: false) }
+
+ it 'makes all aggregations enabled' do
+ migrate!
+
+ expect(aggregation1.reload).to be_enabled
+ expect(aggregation2.reload).to be_enabled
+ expect(aggregation3.reload).to be_enabled
+ end
+end
diff --git a/spec/models/abuse_report_spec.rb b/spec/models/abuse_report_spec.rb
index e87996fc1f0..3871b18fdd5 100644
--- a/spec/models/abuse_report_spec.rb
+++ b/spec/models/abuse_report_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe AbuseReport do
end
it 'lets a worker delete the user' do
- expect(DeleteUserWorker).to receive(:perform_async).with(user.id, subject.user.id, hard_delete: true)
+ expect(DeleteUserWorker).to receive(:perform_async).with(user.id, subject.user.id, { hard_delete: true })
subject.remove_user(deleted_by: user)
end
diff --git a/spec/models/alert_management/alert_spec.rb b/spec/models/alert_management/alert_spec.rb
index 40bdfd4bc92..685ed81ec84 100644
--- a/spec/models/alert_management/alert_spec.rb
+++ b/spec/models/alert_management/alert_spec.rb
@@ -233,6 +233,17 @@ RSpec.describe AlertManagement::Alert do
end
end
+ describe '.find_unresolved_alert' do
+ let_it_be(:fingerprint) { SecureRandom.hex }
+ let_it_be(:resolved_alert_with_fingerprint) { create(:alert_management_alert, :resolved, project: project, fingerprint: fingerprint) }
+ let_it_be(:alert_with_fingerprint_in_other_project) { create(:alert_management_alert, project: project2, fingerprint: fingerprint) }
+ let_it_be(:alert_with_fingerprint) { create(:alert_management_alert, project: project, fingerprint: fingerprint) }
+
+ subject { described_class.find_unresolved_alert(project, fingerprint) }
+
+ it { is_expected.to eq(alert_with_fingerprint) }
+ end
+
describe '.last_prometheus_alert_by_project_id' do
subject { described_class.last_prometheus_alert_by_project_id }
diff --git a/spec/models/alert_management/metric_image_spec.rb b/spec/models/alert_management/metric_image_spec.rb
index dedbd6e501e..ca910474423 100644
--- a/spec/models/alert_management/metric_image_spec.rb
+++ b/spec/models/alert_management/metric_image_spec.rb
@@ -15,12 +15,4 @@ RSpec.describe AlertManagement::MetricImage do
it { is_expected.to validate_length_of(:url).is_at_most(255) }
it { is_expected.to validate_length_of(:url_text).is_at_most(128) }
end
-
- describe '.available_for?' do
- subject { described_class.available_for?(issue.project) }
-
- let_it_be_with_refind(:issue) { create(:issue) }
-
- it { is_expected.to eq(true) }
- end
end
diff --git a/spec/models/analytics/cycle_analytics/aggregation_spec.rb b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
index 6071e4b3d21..2fb40852791 100644
--- a/spec/models/analytics/cycle_analytics/aggregation_spec.rb
+++ b/spec/models/analytics/cycle_analytics/aggregation_spec.rb
@@ -43,6 +43,37 @@ RSpec.describe Analytics::CycleAnalytics::Aggregation, type: :model do
end
end
+ describe '#consistency_check_cursor_for' do
+ it 'returns empty cursor' do
+ expect(aggregation.consistency_check_cursor_for(Analytics::CycleAnalytics::IssueStageEvent)).to eq({})
+ expect(aggregation.consistency_check_cursor_for(Analytics::CycleAnalytics::MergeRequestStageEvent)).to eq({})
+ end
+
+ it 'returns the cursor value for IssueStageEvent' do
+ aggregation.last_consistency_check_issues_start_event_timestamp = 2.weeks.ago
+ aggregation.last_consistency_check_issues_end_event_timestamp = 1.week.ago
+ aggregation.last_consistency_check_issues_issuable_id = 42
+
+ expect(aggregation.consistency_check_cursor_for(Analytics::CycleAnalytics::IssueStageEvent)).to eq({
+ start_event_timestamp: aggregation.last_consistency_check_issues_start_event_timestamp,
+ end_event_timestamp: aggregation.last_consistency_check_issues_end_event_timestamp,
+ issue_id: aggregation.last_consistency_check_issues_issuable_id
+ })
+ end
+
+ it 'returns the cursor value for MergeRequestStageEvent' do
+ aggregation.last_consistency_check_merge_requests_start_event_timestamp = 2.weeks.ago
+ aggregation.last_consistency_check_merge_requests_end_event_timestamp = 1.week.ago
+ aggregation.last_consistency_check_merge_requests_issuable_id = 42
+
+ expect(aggregation.consistency_check_cursor_for(Analytics::CycleAnalytics::MergeRequestStageEvent)).to eq({
+ start_event_timestamp: aggregation.last_consistency_check_merge_requests_start_event_timestamp,
+ end_event_timestamp: aggregation.last_consistency_check_merge_requests_end_event_timestamp,
+ merge_request_id: aggregation.last_consistency_check_merge_requests_issuable_id
+ })
+ end
+ end
+
describe '#refresh_last_run' do
it 'updates the run_at column' do
freeze_time do
diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb
index 541fa1ac77a..20cd96e831c 100644
--- a/spec/models/application_setting_spec.rb
+++ b/spec/models/application_setting_spec.rb
@@ -83,10 +83,14 @@ RSpec.describe ApplicationSetting do
it { is_expected.to validate_numericality_of(:container_registry_import_max_retries).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_import_start_max_retries).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_import_max_step_duration).only_integer.is_greater_than_or_equal_to(0) }
+ it { is_expected.to validate_numericality_of(:container_registry_pre_import_timeout).only_integer.is_greater_than_or_equal_to(0) }
+ it { is_expected.to validate_numericality_of(:container_registry_import_timeout).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.not_to allow_value(nil).for(:container_registry_import_max_tags_count) }
it { is_expected.not_to allow_value(nil).for(:container_registry_import_max_retries) }
it { is_expected.not_to allow_value(nil).for(:container_registry_import_start_max_retries) }
it { is_expected.not_to allow_value(nil).for(:container_registry_import_max_step_duration) }
+ it { is_expected.not_to allow_value(nil).for(:container_registry_pre_import_timeout) }
+ it { is_expected.not_to allow_value(nil).for(:container_registry_import_timeout) }
it { is_expected.to validate_presence_of(:container_registry_import_target_plan) }
it { is_expected.to validate_presence_of(:container_registry_import_created_before) }
@@ -132,6 +136,12 @@ RSpec.describe ApplicationSetting do
it { is_expected.not_to allow_value(10.5).for(:raw_blob_request_limit) }
it { is_expected.not_to allow_value(-1).for(:raw_blob_request_limit) }
+ it { is_expected.to allow_value(0).for(:pipeline_limit_per_project_user_sha) }
+ it { is_expected.not_to allow_value('abc').for(:pipeline_limit_per_project_user_sha) }
+ it { is_expected.not_to allow_value(nil).for(:pipeline_limit_per_project_user_sha) }
+ it { is_expected.not_to allow_value(10.5).for(:pipeline_limit_per_project_user_sha) }
+ it { is_expected.not_to allow_value(-1).for(:pipeline_limit_per_project_user_sha) }
+
it { is_expected.not_to allow_value(false).for(:hashed_storage_enabled) }
it { is_expected.to allow_value('default' => 0).for(:repository_storages_weighted) }
@@ -417,6 +427,14 @@ RSpec.describe ApplicationSetting do
.is_greater_than(0)
end
+ it { is_expected.to validate_presence_of(:max_export_size) }
+
+ specify do
+ is_expected.to validate_numericality_of(:max_export_size)
+ .only_integer
+ .is_greater_than_or_equal_to(0)
+ end
+
it { is_expected.to validate_presence_of(:max_import_size) }
specify do
@@ -1336,5 +1354,17 @@ RSpec.describe ApplicationSetting do
it { is_expected.to validate_numericality_of(:inactive_projects_delete_after_months).is_greater_than(0) }
it { is_expected.to validate_numericality_of(:inactive_projects_min_size_mb).is_greater_than_or_equal_to(0) }
+
+ it "deletes the redis key used for tracking inactive projects deletion warning emails when setting is updated",
+ :clean_gitlab_redis_shared_state do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hset("inactive_projects_deletion_warning_email_notified", "project:1", "2020-01-01")
+ end
+
+ Gitlab::Redis::SharedState.with do |redis|
+ expect { setting.update!(inactive_projects_delete_after_months: 6) }
+ .to change { redis.hgetall('inactive_projects_deletion_warning_email_notified') }.to({})
+ end
+ end
end
end
diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb
index 5ee560c4925..6409ea9fc3d 100644
--- a/spec/models/ci/bridge_spec.rb
+++ b/spec/models/ci/bridge_spec.rb
@@ -31,7 +31,37 @@ RSpec.describe Ci::Bridge do
end
describe '#retryable?' do
+ let(:bridge) { create(:ci_bridge, :success) }
+
+ it 'returns true' do
+ expect(bridge.retryable?).to eq(true)
+ end
+
+ context 'without ci_recreate_downstream_pipeline ff' do
+ before do
+ stub_feature_flags(ci_recreate_downstream_pipeline: false)
+ end
+
+ it 'returns false' do
+ expect(bridge.retryable?).to eq(false)
+ end
+ end
+ end
+
+ context 'when there is a pipeline loop detected' do
+ let(:bridge) { create(:ci_bridge, :failed, failure_reason: :pipeline_loop_detected) }
+
+ it 'returns false' do
+ expect(bridge.failure_reason).to eq('pipeline_loop_detected')
+ expect(bridge.retryable?).to eq(false)
+ end
+ end
+
+ context 'when the pipeline depth has reached the max descendents' do
+ let(:bridge) { create(:ci_bridge, :failed, failure_reason: :reached_max_descendant_pipelines_depth) }
+
it 'returns false' do
+ expect(bridge.failure_reason).to eq('reached_max_descendant_pipelines_depth')
expect(bridge.retryable?).to eq(false)
end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 12e65974270..dcf6915a01e 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -743,7 +743,7 @@ RSpec.describe Ci::Build do
it { is_expected.to be_falsey }
end
- context 'when there are runners' do
+ context 'when there is a runner' do
let(:runner) { create(:ci_runner, :project, projects: [build.project]) }
before do
@@ -752,19 +752,28 @@ RSpec.describe Ci::Build do
it { is_expected.to be_truthy }
- it 'that is inactive' do
- runner.update!(active: false)
- is_expected.to be_falsey
+ context 'that is inactive' do
+ before do
+ runner.update!(active: false)
+ end
+
+ it { is_expected.to be_falsey }
end
- it 'that is not online' do
- runner.update!(contacted_at: nil)
- is_expected.to be_falsey
+ context 'that is not online' do
+ before do
+ runner.update!(contacted_at: nil)
+ end
+
+ it { is_expected.to be_falsey }
end
- it 'that cannot handle build' do
- expect_any_instance_of(Ci::Runner).to receive(:matches_build?).with(build).and_return(false)
- is_expected.to be_falsey
+ context 'that cannot handle build' do
+ before do
+ expect_any_instance_of(Gitlab::Ci::Matching::RunnerMatcher).to receive(:matches?).with(build.build_matcher).and_return(false)
+ end
+
+ it { is_expected.to be_falsey }
end
end
@@ -1069,6 +1078,32 @@ RSpec.describe Ci::Build do
is_expected.to all(a_hash_including(key: a_string_matching(/-non_protected$/)))
end
end
+
+ context 'when separated caches are disabled' do
+ before do
+ allow_any_instance_of(Project).to receive(:ci_separated_caches).and_return(false)
+ end
+
+ context 'running on protected ref' do
+ before do
+ allow(build.pipeline).to receive(:protected_ref?).and_return(true)
+ end
+
+ it 'is expected to have no type suffix' do
+ is_expected.to match([a_hash_including(key: 'key-1'), a_hash_including(key: 'key2-1')])
+ end
+ end
+
+ context 'running on not protected ref' do
+ before do
+ allow(build.pipeline).to receive(:protected_ref?).and_return(false)
+ end
+
+ it 'is expected to have no type suffix' do
+ is_expected.to match([a_hash_including(key: 'key-1'), a_hash_including(key: 'key2-1')])
+ end
+ end
+ end
end
context 'when project has jobs_cache_index' do
@@ -1123,36 +1158,6 @@ RSpec.describe Ci::Build do
end
end
- describe '#coverage_regex' do
- subject { build.coverage_regex }
-
- context 'when project has build_coverage_regex set' do
- let(:project_regex) { '\(\d+\.\d+\) covered' }
-
- before do
- project.update_column(:build_coverage_regex, project_regex)
- end
-
- context 'and coverage_regex attribute is not set' do
- it { is_expected.to eq(project_regex) }
- end
-
- context 'but coverage_regex attribute is also set' do
- let(:build_regex) { 'Code coverage: \d+\.\d+' }
-
- before do
- build.coverage_regex = build_regex
- end
-
- it { is_expected.to eq(build_regex) }
- end
- end
-
- context 'when neither project nor build has coverage regex set' do
- it { is_expected.to be_nil }
- end
- end
-
describe '#update_coverage' do
context "regarding coverage_regex's value," do
before do
@@ -1476,6 +1481,44 @@ RSpec.describe Ci::Build do
expect(deployment).to be_canceled
end
end
+
+ # Mimic playing a manual job that needs another job.
+ # `needs + when:manual` scenario, see: https://gitlab.com/gitlab-org/gitlab/-/issues/347502
+ context 'when transits from skipped to created to running' do
+ before do
+ build.skip!
+ end
+
+ context 'during skipped to created' do
+ let(:event) { :process! }
+
+ it 'transitions to created' do
+ subject
+
+ expect(deployment).to be_created
+ end
+ end
+
+ context 'during created to running' do
+ let(:event) { :run! }
+
+ before do
+ build.process!
+ build.enqueue!
+ end
+
+ it 'transitions to running and calls webhook' do
+ freeze_time do
+ expect(Deployments::HooksWorker)
+ .to receive(:perform_async).with(deployment_id: deployment.id, status_changed_at: Time.current)
+
+ subject
+ end
+
+ expect(deployment).to be_running
+ end
+ end
+ end
end
describe '#on_stop' do
@@ -3755,6 +3798,7 @@ RSpec.describe Ci::Build do
context 'for pipeline ref existence' do
it 'ensures pipeline ref creation' do
+ expect(job.pipeline).to receive(:ensure_persistent_ref).once.and_call_original
expect(job.pipeline.persistent_ref).to receive(:create).once
run_job_without_exception
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 24c318d0218..24265242172 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -206,8 +206,8 @@ RSpec.describe Ci::JobArtifact do
end
end
- describe '#archived_trace_exists?' do
- subject { artifact.archived_trace_exists? }
+ describe '#stored?' do
+ subject { artifact.stored? }
context 'when the file exists' do
it { is_expected.to be_truthy }
@@ -270,15 +270,6 @@ RSpec.describe Ci::JobArtifact do
end
end
- describe '.order_expired_desc' do
- let_it_be(:first_artifact) { create(:ci_job_artifact, expire_at: 2.days.ago) }
- let_it_be(:second_artifact) { create(:ci_job_artifact, expire_at: 1.day.ago) }
-
- it 'returns ordered artifacts' do
- expect(described_class.order_expired_desc).to eq([second_artifact, first_artifact])
- end
- end
-
describe '.order_expired_asc' do
let_it_be(:first_artifact) { create(:ci_job_artifact, expire_at: 2.days.ago) }
let_it_be(:second_artifact) { create(:ci_job_artifact, expire_at: 1.day.ago) }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 45b51d5bf44..8dc041814fa 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
let_it_be(:namespace) { create_default(:namespace).freeze }
let_it_be(:project) { create_default(:project, :repository).freeze }
- it 'paginates 15 pipeleines per page' do
+ it 'paginates 15 pipelines per page' do
expect(described_class.default_per_page).to eq(15)
end
@@ -552,7 +552,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
it { is_expected.to be_truthy }
end
- context 'when both sha and source_sha do not matche' do
+ context 'when both sha and source_sha do not match' do
let(:pipeline) { build(:ci_pipeline, sha: 'test', source_sha: 'test') }
it { is_expected.to be_falsy }
@@ -1423,7 +1423,7 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
let(:build_b) { create_build('build2', queued_at: 0) }
let(:build_c) { create_build('build3', queued_at: 0) }
- %w[succeed! drop! cancel! skip!].each do |action|
+ %w[succeed! drop! cancel! skip! block! delay!].each do |action|
context "when the pipeline recieved #{action} event" do
it 'deletes a persistent ref' do
expect(pipeline.persistent_ref).to receive(:delete).once
@@ -1534,6 +1534,21 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
expect(pipeline.started_at).to be_nil
end
end
+
+ context 'from success' do
+ let(:started_at) { 2.days.ago }
+ let(:from_status) { :success }
+
+ before do
+ pipeline.update!(started_at: started_at)
+ end
+
+ it 'does not update on transitioning to running' do
+ pipeline.run
+
+ expect(pipeline.started_at).to eq started_at
+ end
+ end
end
describe '#finished_at' do
@@ -1813,6 +1828,32 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe '#ensure_persistent_ref' do
+ subject { pipeline.ensure_persistent_ref }
+
+ let(:pipeline) { create(:ci_pipeline, project: project) }
+
+ context 'when the persistent ref does not exist' do
+ it 'creates a ref' do
+ expect(pipeline.persistent_ref).to receive(:create).once
+
+ subject
+ end
+ end
+
+ context 'when the persistent ref exists' do
+ before do
+ pipeline.persistent_ref.create # rubocop:disable Rails/SaveBang
+ end
+
+ it 'does not create a ref' do
+ expect(pipeline.persistent_ref).not_to receive(:create)
+
+ subject
+ end
+ end
+ end
+
describe '#branch?' do
subject { pipeline.branch? }
@@ -3428,6 +3469,46 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep do
end
end
+ describe '#upstream_root' do
+ subject { pipeline.upstream_root }
+
+ let_it_be(:pipeline) { create(:ci_pipeline) }
+
+ context 'when pipeline is child of child pipeline' do
+ let!(:root_ancestor) { create(:ci_pipeline) }
+ let!(:parent_pipeline) { create(:ci_pipeline, child_of: root_ancestor) }
+ let!(:pipeline) { create(:ci_pipeline, child_of: parent_pipeline) }
+
+ it 'returns the root ancestor' do
+ expect(subject).to eq(root_ancestor)
+ end
+ end
+
+ context 'when pipeline is root ancestor' do
+ let!(:child_pipeline) { create(:ci_pipeline, child_of: pipeline) }
+
+ it 'returns itself' do
+ expect(subject).to eq(pipeline)
+ end
+ end
+
+ context 'when pipeline is standalone' do
+ it 'returns itself' do
+ expect(subject).to eq(pipeline)
+ end
+ end
+
+ context 'when pipeline is multi-project downstream pipeline' do
+ let!(:upstream_pipeline) do
+ create(:ci_pipeline, project: create(:project), upstream_of: pipeline)
+ end
+
+ it 'returns the upstream pipeline' do
+ expect(subject).to eq(upstream_pipeline)
+ end
+ end
+ end
+
describe '#stuck?' do
let(:pipeline) { create(:ci_empty_pipeline, :created) }
diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb
index 71fef3c1b5b..cdd96d45561 100644
--- a/spec/models/ci/processable_spec.rb
+++ b/spec/models/ci/processable_spec.rb
@@ -14,6 +14,223 @@ RSpec.describe Ci::Processable do
it { is_expected.to delegate_method(:legacy_detached_merge_request_pipeline?).to(:pipeline) }
end
+ describe '#clone' do
+ let(:user) { create(:user) }
+
+ let(:new_processable) do
+ new_proc = processable.clone(current_user: user)
+ new_proc.save!
+
+ new_proc
+ end
+
+ let_it_be(:stage) { create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'test') }
+
+ shared_context 'processable bridge' do
+ let_it_be(:downstream_project) { create(:project, :repository) }
+
+ let_it_be_with_refind(:processable) do
+ create(
+ :ci_bridge, :success, pipeline: pipeline, downstream: downstream_project,
+ description: 'a trigger job', stage_id: stage.id
+ )
+ end
+
+ let(:clone_accessors) { ::Ci::Bridge.clone_accessors }
+ let(:reject_accessors) { [] }
+ let(:ignore_accessors) { [] }
+ end
+
+ shared_context 'processable build' do
+ let_it_be(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
+
+ let_it_be_with_refind(:processable) do
+ create(:ci_build, :failed, :picked, :expired, :erased, :queued, :coverage, :tags,
+ :allowed_to_fail, :on_tag, :triggered, :teardown_environment, :resource_group,
+ description: 'my-job', stage: 'test', stage_id: stage.id,
+ pipeline: pipeline, auto_canceled_by: another_pipeline,
+ scheduled_at: 10.seconds.since)
+ end
+
+ let_it_be(:internal_job_variable) { create(:ci_job_variable, job: processable) }
+
+ 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
+ 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
+ job_artifacts_metadata job_artifacts_trace job_artifacts_junit
+ job_artifacts_sast job_artifacts_secret_detection job_artifacts_dependency_scanning
+ job_artifacts_container_scanning job_artifacts_cluster_image_scanning job_artifacts_dast
+ job_artifacts_license_scanning
+ job_artifacts_performance job_artifacts_browser_performance job_artifacts_load_performance
+ job_artifacts_lsif job_artifacts_terraform job_artifacts_cluster_applications
+ job_artifacts_codequality job_artifacts_metrics scheduled_at
+ job_variables waiting_for_resource_at job_artifacts_metrics_referee
+ job_artifacts_network_referee job_artifacts_dotenv
+ job_artifacts_cobertura needs job_artifacts_accessibility
+ job_artifacts_requirements job_artifacts_coverage_fuzzing
+ job_artifacts_api_fuzzing terraform_state_versions].freeze
+ end
+
+ let(:ignore_accessors) do
+ %i[type namespace lock_version target_url base_tags trace_sections
+ commit_id deployment erased_by_id project_id
+ runner_id tag_taggings taggings tags trigger_request_id
+ user_id auto_canceled_by_id retried failure_reason
+ sourced_pipelines artifacts_file_store artifacts_metadata_store
+ metadata runner_session trace_chunks upstream_pipeline_id
+ artifacts_file artifacts_metadata artifacts_size commands
+ resource resource_group_id processed security_scans author
+ pipeline_id report_results pending_state pages_deployments
+ queuing_entry runtime_metadata trace_metadata
+ dast_site_profile dast_scanner_profile].freeze
+ end
+
+ before_all do
+ # Create artifacts to check that the associations are rejected when cloning
+ Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.each do |file_type, file_format|
+ create(:ci_job_artifact, file_format,
+ file_type: file_type, job: processable, expire_at: processable.artifacts_expire_at)
+ end
+
+ create(:ci_job_variable, :dotenv_source, job: processable)
+ create(:terraform_state_version, build: processable)
+ end
+
+ before do
+ processable.update!(retried: false, status: :success)
+ end
+ end
+
+ shared_examples_for 'clones the processable' do
+ before_all do
+ processable.update!(stage: 'test', stage_id: stage.id)
+
+ create(:ci_build_need, build: processable)
+ end
+
+ describe 'clone accessors' do
+ let(:forbidden_associations) do
+ Ci::Build.reflect_on_all_associations.each_with_object(Set.new) do |assoc, memo|
+ memo << assoc.name unless assoc.macro == :belongs_to
+ end
+ end
+
+ it 'clones the processable attributes', :aggregate_failures do
+ clone_accessors.each do |attribute|
+ expect(attribute).not_to be_in(forbidden_associations), "association #{attribute} must be `belongs_to`"
+ expect(processable.send(attribute)).not_to be_nil, "old processable attribute #{attribute} should not be nil"
+ expect(new_processable.send(attribute)).not_to be_nil, "new processable attribute #{attribute} should not be nil"
+ expect(new_processable.send(attribute)).to eq(processable.send(attribute)), "new processable attribute #{attribute} should match old processable"
+ end
+ end
+
+ it 'clones only the needs attributes' do
+ expect(new_processable.needs.size).to be(1)
+ expect(processable.needs.exists?).to be_truthy
+
+ expect(new_processable.needs_attributes).to match(processable.needs_attributes)
+ expect(new_processable.needs).not_to match(processable.needs)
+ end
+
+ context 'when the processable has protected: nil' do
+ before do
+ processable.update_attribute(:protected, nil)
+ end
+
+ it 'clones the protected job attribute' do
+ expect(new_processable.protected).to be_nil
+ expect(new_processable.protected).to eq processable.protected
+ end
+ end
+ end
+
+ describe 'reject accessors' do
+ it 'does not clone rejected attributes' do
+ reject_accessors.each do |attribute|
+ expect(new_processable.send(attribute)).not_to eq(processable.send(attribute)), "processable attribute #{attribute} should not have been cloned"
+ end
+ end
+ end
+
+ it 'creates a new processable that represents the old processable' do
+ expect(new_processable.name).to eq processable.name
+ end
+ end
+
+ context 'when the processable to be cloned is a bridge' do
+ include_context 'processable bridge'
+
+ it_behaves_like 'clones the processable'
+ end
+
+ context 'when the processable to be cloned is a build' do
+ include_context 'processable build'
+
+ it_behaves_like 'clones the processable'
+
+ it 'has the correct number of known attributes', :aggregate_failures do
+ processed_accessors = clone_accessors + reject_accessors
+ known_accessors = processed_accessors + ignore_accessors
+
+ current_accessors =
+ Ci::Build.attribute_names.map(&:to_sym) +
+ Ci::Build.attribute_aliases.keys.map(&:to_sym) +
+ Ci::Build.reflect_on_all_associations.map(&:name) +
+ [:tag_list, :needs_attributes, :job_variables_attributes] -
+ # ToDo: Move EE accessors to ee/
+ ::Ci::Build.extra_accessors -
+ [:dast_site_profiles_build, :dast_scanner_profiles_build]
+
+ current_accessors.uniq!
+
+ expect(current_accessors).to include(*processed_accessors)
+ expect(known_accessors).to include(*current_accessors)
+ end
+
+ context 'when it has a deployment' do
+ let!(:processable) do
+ create(:ci_build, :with_deployment, :deploy_to_production,
+ pipeline: pipeline, stage_id: stage.id, project: project)
+ end
+
+ it 'persists the expanded environment name' do
+ expect(new_processable.metadata.expanded_environment_name).to eq('production')
+ end
+ end
+
+ context 'when it has a dynamic environment' do
+ let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(u) } }
+
+ let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' }
+
+ let!(:processable) do
+ create(:ci_build, :with_deployment, environment: environment_name,
+ options: { environment: { name: environment_name } },
+ pipeline: pipeline, stage_id: stage.id, project: project,
+ user: other_developer)
+ end
+
+ it 're-uses the previous persisted environment' do
+ expect(processable.persisted_environment.name).to eq("review/#{processable.ref}-#{other_developer.id}")
+
+ expect(new_processable.persisted_environment.name).to eq("review/#{processable.ref}-#{other_developer.id}")
+ end
+ end
+
+ context 'when the processable has job variables' do
+ it 'only clones the internal job variables' do
+ expect(new_processable.job_variables.size).to eq(1)
+ expect(new_processable.job_variables.first.key).to eq(internal_job_variable.key)
+ expect(new_processable.job_variables.first.value).to eq(internal_job_variable.value)
+ end
+ end
+ end
+ end
+
describe '#retryable' do
shared_examples_for 'retryable processable' do
context 'when processable is successful' do
@@ -69,6 +286,12 @@ RSpec.describe Ci::Processable do
end
end
+ context 'when the processable is a bridge' do
+ subject(:processable) { create(:ci_bridge, pipeline: pipeline) }
+
+ it_behaves_like 'retryable processable'
+ end
+
context 'when the processable is a build' do
subject(:processable) { create(:ci_build, pipeline: pipeline) }
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 05b7bc39a74..8a1dcbfbdeb 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -412,12 +412,9 @@ RSpec.describe Ci::Runner do
context 'with shared_runner' do
let(:runner) { create(:ci_runner, :instance) }
- it 'transitions shared runner to project runner and assigns project' do
- expect(subject).to be_truthy
-
- expect(runner).to be_project_type
- expect(runner.runner_projects.pluck(:project_id)).to match_array([project.id])
- expect(runner.only_for?(project)).to be_truthy
+ it 'raises an error' do
+ expect { subject }
+ .to raise_error(ArgumentError, 'Transitioning an instance runner to a project runner is not supported')
end
end
@@ -430,6 +427,18 @@ RSpec.describe Ci::Runner do
.to raise_error(ArgumentError, 'Transitioning a group runner to a project runner is not supported')
end
end
+
+ context 'with project runner' do
+ let(:other_project) { create(:project) }
+ let(:runner) { create(:ci_runner, :project, projects: [other_project]) }
+
+ it 'assigns runner to project' do
+ expect(subject).to be_truthy
+
+ expect(runner).to be_project_type
+ expect(runner.runner_projects.pluck(:project_id)).to contain_exactly(project.id, other_project.id)
+ end
+ end
end
describe '.recent' do
@@ -829,7 +838,7 @@ RSpec.describe Ci::Runner do
context 'with legacy_mode enabled' do
let(:legacy_mode) { '14.5' }
- it { is_expected.to eq(:not_connected) }
+ it { is_expected.to eq(:stale) }
end
context 'with legacy_mode disabled' do
@@ -886,7 +895,7 @@ RSpec.describe Ci::Runner do
context 'with legacy_mode enabled' do
let(:legacy_mode) { '14.5' }
- it { is_expected.to eq(:offline) }
+ it { is_expected.to eq(:stale) }
end
context 'with legacy_mode disabled' do
@@ -896,7 +905,7 @@ RSpec.describe Ci::Runner do
end
describe '#deprecated_rest_status' do
- let(:runner) { build(:ci_runner, :instance, contacted_at: 1.second.ago) }
+ let(:runner) { create(:ci_runner, :instance, contacted_at: 1.second.ago) }
subject { runner.deprecated_rest_status }
@@ -905,7 +914,7 @@ RSpec.describe Ci::Runner do
runner.contacted_at = nil
end
- it { is_expected.to eq(:not_connected) }
+ it { is_expected.to eq(:never_contacted) }
end
context 'contacted 1s ago' do
@@ -918,10 +927,11 @@ RSpec.describe Ci::Runner do
context 'contacted long time ago' do
before do
+ runner.created_at = 1.year.ago
runner.contacted_at = 1.year.ago
end
- it { is_expected.to eq(:offline) }
+ it { is_expected.to eq(:stale) }
end
context 'inactive' do
diff --git a/spec/models/ci/secure_file_spec.rb b/spec/models/ci/secure_file_spec.rb
index f92db3fe8db..40ddafad013 100644
--- a/spec/models/ci/secure_file_spec.rb
+++ b/spec/models/ci/secure_file_spec.rb
@@ -25,7 +25,6 @@ RSpec.describe Ci::SecureFile do
it { is_expected.to validate_presence_of(:checksum) }
it { is_expected.to validate_presence_of(:file_store) }
it { is_expected.to validate_presence_of(:name) }
- it { is_expected.to validate_presence_of(:permissions) }
it { is_expected.to validate_presence_of(:project_id) }
context 'unique filename' do
let_it_be(:project1) { create(:project) }
@@ -49,12 +48,6 @@ RSpec.describe Ci::SecureFile do
end
end
- describe '#permissions' do
- it 'defaults to read_only file permssions' do
- expect(subject.permissions).to eq('read_only')
- end
- end
-
describe '#checksum' do
it 'computes SHA256 checksum on the file before encrypted' do
expect(subject.checksum).to eq(Digest::SHA256.hexdigest(sample_file))
diff --git a/spec/models/clusters/platforms/kubernetes_spec.rb b/spec/models/clusters/platforms/kubernetes_spec.rb
index b298bf2c8bb..a0ede9fb0d9 100644
--- a/spec/models/clusters/platforms/kubernetes_spec.rb
+++ b/spec/models/clusters/platforms/kubernetes_spec.rb
@@ -450,6 +450,42 @@ RSpec.describe Clusters::Platforms::Kubernetes do
it { is_expected.to be_nil }
end
+ context 'when there are ignored K8s connections errors' do
+ described_class::IGNORED_CONNECTION_EXCEPTIONS.each do |exception|
+ context "#{exception}" do
+ before do
+ exception_args = ['arg1']
+ exception_args.push('arg2', 'arg3') if exception.name == 'Kubeclient::HttpError'
+ exception_instance = exception.new(*exception_args)
+
+ allow_next_instance_of(Gitlab::Kubernetes::KubeClient) do |kube_client|
+ allow(kube_client).to receive(:get_pods).with(namespace: namespace).and_raise(exception_instance)
+ allow(kube_client).to receive(:get_deployments).with(namespace: namespace).and_raise(exception_instance)
+ allow(kube_client).to receive(:get_ingresses).with(namespace: namespace).and_raise(exception_instance)
+ end
+ end
+
+ it 'does not raise error' do
+ expect { subject }.not_to raise_error
+ end
+
+ it 'returns empty array for the K8s component keys' do
+ expect(subject).to include({ pods: [], deployments: [], ingresses: [] })
+ end
+
+ it 'logs the error' do
+ expect_next_instance_of(Gitlab::Kubernetes::Logger) do |logger|
+ expect(logger).to receive(:error)
+ .with(hash_including(event: :kube_connection_error))
+ .and_call_original
+ end
+
+ subject
+ end
+ end
+ end
+ end
+
context 'when kubernetes responds with 500s' do
before do
stub_kubeclient_pods(namespace, status: 500)
@@ -457,7 +493,9 @@ RSpec.describe Clusters::Platforms::Kubernetes do
stub_kubeclient_ingresses(namespace, status: 500)
end
- it { expect { subject }.to raise_error(Kubeclient::HttpError) }
+ it 'does not raise kubeclient http error' do
+ expect { subject }.not_to raise_error
+ end
end
context 'when kubernetes responds with 404s' do
@@ -755,6 +793,18 @@ RSpec.describe Clusters::Platforms::Kubernetes do
expect(rollout_status.instances.map { |p| p[:pod_name] }).to eq(['pod-a-1', 'pod-a-2', 'pod-b-1', 'pod-b-2'])
end
end
+
+ # Scenario when there are K8s connection errors.
+ context 'when cache keys are defaulted' do
+ let(:cache_data) { Hash(deployments: [], pods: [], ingresses: []) }
+
+ it 'does not raise error' do
+ expect { rollout_status }.not_to raise_error
+
+ expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus)
+ expect(rollout_status).to be_not_found
+ end
+ end
end
describe '#ingresses' do
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index d158a99ef9f..dbb15fad246 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -142,6 +142,26 @@ RSpec.describe CommitStatus do
end
end
+ describe '.cancelable' do
+ subject { described_class.cancelable }
+
+ %i[running pending waiting_for_resource preparing created scheduled].each do |status|
+ context "when #{status} commit status" do
+ let!(:commit_status) { create(:commit_status, status, pipeline: pipeline) }
+
+ it { is_expected.to contain_exactly(commit_status) }
+ end
+ end
+
+ %i[failed success skipped canceled manual].each do |status|
+ context "when #{status} commit status" do
+ let!(:commit_status) { create(:commit_status, status, pipeline: pipeline) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+ end
+
describe '#started?' do
subject { commit_status.started? }
@@ -150,26 +170,28 @@ RSpec.describe CommitStatus do
commit_status.started_at = nil
end
- it { is_expected.to be_falsey }
+ it { is_expected.to be(false) }
end
- %w[running success failed].each do |status|
- context "if commit status is #{status}" do
- before do
- commit_status.status = status
- end
+ context 'with started_at' do
+ described_class::STARTED_STATUSES.each do |status|
+ context "if commit status is #{status}" do
+ before do
+ commit_status.status = status
+ end
- it { is_expected.to be_truthy }
+ it { is_expected.to eq(true) }
+ end
end
- end
- %w[pending canceled].each do |status|
- context "if commit status is #{status}" do
- before do
- commit_status.status = status
- end
+ (described_class::AVAILABLE_STATUSES - described_class::STARTED_STATUSES).each do |status|
+ context "if commit status is #{status}" do
+ before do
+ commit_status.status = status
+ end
- it { is_expected.to be_falsey }
+ it { is_expected.to be(false) }
+ end
end
end
end
diff --git a/spec/models/concerns/cache_markdown_field_spec.rb b/spec/models/concerns/cache_markdown_field_spec.rb
index 1c1efab2889..d46f22b2216 100644
--- a/spec/models/concerns/cache_markdown_field_spec.rb
+++ b/spec/models/concerns/cache_markdown_field_spec.rb
@@ -149,7 +149,7 @@ RSpec.describe CacheMarkdownField, :clean_gitlab_redis_cache do
it 'saves the changes' do
expect(thing)
.to receive(:save_markdown)
- .with("description_html" => updated_html, "title_html" => "", "cached_markdown_version" => cache_version)
+ .with({ "description_html" => updated_html, "title_html" => "", "cached_markdown_version" => cache_version })
thing.refresh_markdown_cache!
end
diff --git a/spec/models/concerns/integrations/reset_secret_fields_spec.rb b/spec/models/concerns/integrations/reset_secret_fields_spec.rb
new file mode 100644
index 00000000000..a372550c70f
--- /dev/null
+++ b/spec/models/concerns/integrations/reset_secret_fields_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Integrations::ResetSecretFields do
+ let(:described_class) do
+ Class.new(Integration) do
+ field :username, type: 'text'
+ field :url, type: 'text', exposes_secrets: true
+ field :api_url, type: 'text', exposes_secrets: true
+ field :password, type: 'password'
+ field :token, type: 'password'
+ end
+ end
+
+ let(:integration) { described_class.new }
+
+ it_behaves_like Integrations::ResetSecretFields
+end
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index b38135fc0b2..e8e9c263d23 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -474,11 +474,11 @@ RSpec.describe Issuable do
issue.update!(labels: [label])
issue.assignees << user
issue.spend_time(duration: 2, user_id: user.id, spent_at: Time.current)
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build and does not set labels, assignees, nor total_time_spent' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build and does not set labels, assignees, nor total_time_spent' do
expect(builder).to receive(:build).with(
user: user,
changes: {})
@@ -493,11 +493,11 @@ RSpec.describe Issuable do
before do
issue.update!(labels: [labels[1]])
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
@@ -512,11 +512,11 @@ RSpec.describe Issuable do
before do
issue.spend_time(duration: 2, user_id: user.id, spent_at: Time.current)
issue.save!
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
@@ -532,11 +532,11 @@ RSpec.describe Issuable do
before do
issue.assignees << user << user2
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
@@ -554,11 +554,11 @@ RSpec.describe Issuable do
before do
merge_request.update!(assignees: [user])
merge_request.update!(assignees: [user, user2])
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(merge_request).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
@@ -574,11 +574,11 @@ RSpec.describe Issuable do
before do
issue.update!(issuable_severity_attributes: { severity: 'low' })
- expect(Gitlab::HookData::IssuableBuilder)
+ expect(Gitlab::DataBuilder::Issuable)
.to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
@@ -596,10 +596,10 @@ RSpec.describe Issuable do
before do
issue.escalation_status.update!(status: acknowledged)
- expect(Gitlab::HookData::IssuableBuilder).to receive(:new).with(issue).and_return(builder)
+ expect(Gitlab::DataBuilder::Issuable).to receive(:new).with(issue).and_return(builder)
end
- it 'delegates to Gitlab::HookData::IssuableBuilder#build' do
+ it 'delegates to Gitlab::DataBuilder::Issuable#build' do
expect(builder).to receive(:build).with(
user: user,
changes: hash_including(
diff --git a/spec/models/concerns/pg_full_text_searchable_spec.rb b/spec/models/concerns/pg_full_text_searchable_spec.rb
index db7f652f494..b6da481024a 100644
--- a/spec/models/concerns/pg_full_text_searchable_spec.rb
+++ b/spec/models/concerns/pg_full_text_searchable_spec.rb
@@ -54,12 +54,23 @@ RSpec.describe PgFullTextSearchable do
end
context 'when specified columns are not changed' do
- it 'does not enqueue worker' do
+ it 'does not call update_search_data!' do
expect(model).not_to receive(:update_search_data!)
model.update!(description: 'A new description')
end
end
+
+ context 'when model is updated twice within a transaction' do
+ it 'calls update_search_data!' do
+ expect(model).to receive(:update_search_data!)
+
+ model.transaction do
+ model.update!(title: 'A new title')
+ model.update!(updated_at: Time.current)
+ end
+ end
+ end
end
describe '.pg_full_text_search' do
diff --git a/spec/models/concerns/reactive_caching_spec.rb b/spec/models/concerns/reactive_caching_spec.rb
index 4f3b95e43cd..5468699f9dd 100644
--- a/spec/models/concerns/reactive_caching_spec.rb
+++ b/spec/models/concerns/reactive_caching_spec.rb
@@ -237,7 +237,7 @@ RSpec.describe ReactiveCaching, :use_clean_rails_memory_store_caching do
end
it 'does not raise the exception' do
- expect { go! }.not_to raise_exception(ReactiveCaching::ExceededReactiveCacheLimit)
+ expect { go! }.not_to raise_exception
end
end
diff --git a/spec/models/concerns/schedulable_spec.rb b/spec/models/concerns/schedulable_spec.rb
index 62acd12e267..b98dcf1c174 100644
--- a/spec/models/concerns/schedulable_spec.rb
+++ b/spec/models/concerns/schedulable_spec.rb
@@ -57,6 +57,16 @@ RSpec.describe Schedulable do
it_behaves_like '.runnable_schedules'
end
+ context 'for a packages cleanup policy' do
+ # let! is used to reset the next_run_at value before each spec
+ let(:object) { create(:packages_cleanup_policy, :runnable) }
+ let(:non_runnable_object) { create(:packages_cleanup_policy) }
+
+ it_behaves_like '#schedule_next_run!'
+ it_behaves_like 'before_save callback'
+ it_behaves_like '.runnable_schedules'
+ end
+
describe '#next_run_at' do
let(:schedulable_instance) do
Class.new(ActiveRecord::Base) do
diff --git a/spec/models/concerns/sha256_attribute_spec.rb b/spec/models/concerns/sha256_attribute_spec.rb
deleted file mode 100644
index 02947325bf4..00000000000
--- a/spec/models/concerns/sha256_attribute_spec.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Sha256Attribute do
- let(:model) { Class.new(ApplicationRecord) { include Sha256Attribute } }
-
- before do
- columns = [
- double(:column, name: 'name', type: :text),
- double(:column, name: 'sha256', type: :binary)
- ]
-
- allow(model).to receive(:columns).and_return(columns)
- end
-
- describe '#sha_attribute' do
- context 'when in non-production' do
- before do
- stub_rails_env('development')
- end
-
- context 'when the table exists' do
- before do
- allow(model).to receive(:table_exists?).and_return(true)
- end
-
- it 'defines a SHA attribute for a binary column' do
- expect(model).to receive(:attribute)
- .with(:sha256, an_instance_of(Gitlab::Database::Sha256Attribute))
-
- model.sha256_attribute(:sha256)
- end
-
- it 'raises ArgumentError when the column type is not :binary' do
- expect { model.sha256_attribute(:name) }.to raise_error(ArgumentError)
- end
- end
-
- context 'when the table does not exist' do
- it 'allows the attribute to be added and issues a warning' do
- allow(model).to receive(:table_exists?).and_return(false)
-
- expect(model).not_to receive(:columns)
- expect(model).to receive(:attribute)
- expect(model).to receive(:warn)
-
- model.sha256_attribute(:name)
- end
- end
-
- context 'when the column does not exist' do
- it 'allows the attribute to be added and issues a warning' do
- allow(model).to receive(:table_exists?).and_return(true)
-
- expect(model).to receive(:columns)
- expect(model).to receive(:attribute)
- expect(model).to receive(:warn)
-
- model.sha256_attribute(:no_name)
- end
- end
-
- context 'when other execeptions are raised' do
- it 'logs and re-rasises the error' do
- allow(model).to receive(:table_exists?).and_raise(ActiveRecord::NoDatabaseError.new('does not exist'))
-
- expect(model).not_to receive(:columns)
- expect(model).not_to receive(:attribute)
- expect(Gitlab::AppLogger).to receive(:error)
-
- expect { model.sha256_attribute(:name) }.to raise_error(ActiveRecord::NoDatabaseError)
- end
- end
- end
-
- context 'when in production' do
- before do
- stub_rails_env('production')
- end
-
- it 'defines a SHA attribute' do
- expect(model).not_to receive(:table_exists?)
- expect(model).not_to receive(:columns)
- expect(model).to receive(:attribute).with(:sha256, an_instance_of(Gitlab::Database::Sha256Attribute))
-
- model.sha256_attribute(:sha256)
- end
- end
- end
-end
diff --git a/spec/models/concerns/sha_attribute_spec.rb b/spec/models/concerns/sha_attribute_spec.rb
index 1bcf3dc8b61..790e6936803 100644
--- a/spec/models/concerns/sha_attribute_spec.rb
+++ b/spec/models/concerns/sha_attribute_spec.rb
@@ -3,86 +3,101 @@
require 'spec_helper'
RSpec.describe ShaAttribute do
- let(:model) { Class.new(ActiveRecord::Base) { include ShaAttribute } }
+ let(:model) do
+ Class.new(ActiveRecord::Base) do
+ include ShaAttribute
- before do
- columns = [
- double(:column, name: 'name', type: :text),
- double(:column, name: 'sha1', type: :binary)
- ]
-
- allow(model).to receive(:columns).and_return(columns)
+ self.table_name = 'merge_requests'
+ end
end
- describe '#sha_attribute' do
- context 'when in development' do
- before do
- stub_rails_env('development')
- end
+ let(:binary_column) { :merge_ref_sha }
+ let(:text_column) { :target_branch }
- context 'when the table exists' do
- before do
- allow(model).to receive(:table_exists?).and_return(true)
- end
+ describe '.sha_attribute' do
+ it 'defines a SHA attribute with Gitlab::Database::ShaAttribute type' do
+ expect(model).to receive(:attribute)
+ .with(binary_column, an_instance_of(Gitlab::Database::ShaAttribute))
+ .and_call_original
- it 'defines a SHA attribute for a binary column' do
- expect(model).to receive(:attribute)
- .with(:sha1, an_instance_of(Gitlab::Database::ShaAttribute))
+ model.sha_attribute(binary_column)
+ end
+ end
- model.sha_attribute(:sha1)
- end
+ describe '.sha256_attribute' do
+ it 'defines a SHA256 attribute with Gitlab::Database::ShaAttribute type' do
+ expect(model).to receive(:attribute)
+ .with(binary_column, an_instance_of(Gitlab::Database::Sha256Attribute))
+ .and_call_original
- it 'raises ArgumentError when the column type is not :binary' do
- expect { model.sha_attribute(:name) }.to raise_error(ArgumentError)
- end
- end
+ model.sha256_attribute(binary_column)
+ end
+ end
- context 'when the table does not exist' do
- it 'allows the attribute to be added' do
- allow(model).to receive(:table_exists?).and_return(false)
+ describe '.load_schema!' do
+ # load_schema! is not a documented class method, so use a documented method
+ # that we know will call load_schema!
+ def load_schema!
+ expect(model).to receive(:load_schema!).and_call_original
- expect(model).not_to receive(:columns)
- expect(model).to receive(:attribute)
+ model.new
+ end
- model.sha_attribute(:name)
- end
- end
+ using RSpec::Parameterized::TableSyntax
- context 'when the column does not exist' do
- it 'allows the attribute to be added' do
- allow(model).to receive(:table_exists?).and_return(true)
+ where(:column_name, :environment, :expected_error) do
+ ref(:binary_column) | 'development' | :no_error
+ ref(:binary_column) | 'production' | :no_error
+ ref(:text_column) | 'development' | :sha_mismatch_error
+ ref(:text_column) | 'production' | :no_error
+ :__non_existent_column | 'development' | :no_error
+ :__non_existent_column | 'production' | :no_error
+ end
- expect(model).to receive(:columns)
- expect(model).to receive(:attribute)
+ let(:sha_mismatch_error) do
+ [
+ described_class::ShaAttributeTypeMismatchError,
+ /#{column_name}.* should be a :binary column/
+ ]
+ end
- model.sha_attribute(:no_name)
- end
+ with_them do
+ before do
+ stub_rails_env(environment)
end
- context 'when other execeptions are raised' do
- it 'logs and re-rasises the error' do
- allow(model).to receive(:table_exists?).and_raise(ActiveRecord::NoDatabaseError.new('does not exist'))
-
- expect(model).not_to receive(:columns)
- expect(model).not_to receive(:attribute)
- expect(Gitlab::AppLogger).to receive(:error)
-
- expect { model.sha_attribute(:name) }.to raise_error(ActiveRecord::NoDatabaseError)
+ context 'with sha_attribute' do
+ before do
+ model.sha_attribute(column_name)
end
- end
- end
- context 'when in production' do
- before do
- stub_rails_env('production')
+ it 'validates column type' do
+ if expected_error == :no_error
+ expect { load_schema! }.not_to raise_error
+ elsif expected_error == :sha_mismatch_error
+ expect { load_schema! }.to raise_error(
+ described_class::ShaAttributeTypeMismatchError,
+ /sha_attribute.*#{column_name}.* should be a :binary column/
+ )
+ end
+ end
end
- it 'defines a SHA attribute' do
- expect(model).not_to receive(:table_exists?)
- expect(model).not_to receive(:columns)
- expect(model).to receive(:attribute).with(:sha1, an_instance_of(Gitlab::Database::ShaAttribute))
+ context 'with sha256_attribute' do
+ before do
+ model.sha256_attribute(column_name)
+ end
- model.sha_attribute(:sha1)
+ it 'validates column type' do
+ if expected_error == :no_error
+ expect { load_schema! }.not_to raise_error
+ elsif expected_error == :sha_mismatch_error
+ expect { load_schema! }.to raise_error(
+ described_class::Sha256AttributeTypeMismatchError,
+ /sha256_attribute.*#{column_name}.* should be a :binary column/
+ )
+ end
+ end
end
end
end
diff --git a/spec/models/container_registry/event_spec.rb b/spec/models/container_registry/event_spec.rb
index 21a3ab5363a..6b544c95cc8 100644
--- a/spec/models/container_registry/event_spec.rb
+++ b/spec/models/container_registry/event_spec.rb
@@ -26,11 +26,65 @@ RSpec.describe ContainerRegistry::Event do
end
describe '#handle!' do
- let(:raw_event) { { 'action' => 'push', 'target' => { 'mediaType' => ContainerRegistry::Client::DOCKER_DISTRIBUTION_MANIFEST_V2_TYPE } } }
+ let(:action) { 'push' }
+ let(:repository) { project.full_path }
+ let(:target) do
+ {
+ 'mediaType' => ContainerRegistry::Client::DOCKER_DISTRIBUTION_MANIFEST_V2_TYPE,
+ 'tag' => 'latest',
+ 'repository' => repository
+ }
+ end
+
+ let(:raw_event) { { 'action' => action, 'target' => target } }
+
+ 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])
+
+ handle!
+ end
- subject { described_class.new(raw_event).handle! }
+ shared_examples 'event without project statistics update' do
+ it 'does not queue a project statistics update' do
+ expect(ProjectCacheWorker).not_to receive(:perform_async)
- it { is_expected.to eq nil }
+ handle!
+ end
+ end
+
+ context 'with :container_registry_project_statistics feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_project_statistics: false)
+ end
+
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with no target tag' do
+ let(:target) { super().without('tag') }
+
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with an unsupported action' do
+ let(:action) { 'pull' }
+
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with an invalid project repository path' do
+ let(:repository) { 'does/not/exist' }
+
+ it_behaves_like 'event without project statistics update'
+ end
+
+ context 'with no project repository path' do
+ let(:repository) { nil }
+
+ it_behaves_like 'event without project statistics update'
+ end
end
describe '#track!' do
diff --git a/spec/models/container_repository_spec.rb b/spec/models/container_repository_spec.rb
index 2ea042fb767..af4e40cecb7 100644
--- a/spec/models/container_repository_spec.rb
+++ b/spec/models/container_repository_spec.rb
@@ -208,9 +208,23 @@ RSpec.describe ContainerRepository, :aggregate_failures do
shared_examples 'queueing the next import' do
it 'starts the worker' do
expect(::ContainerRegistry::Migration::EnqueuerWorker).to receive(:perform_async)
+ expect(::ContainerRegistry::Migration::EnqueuerWorker).to receive(:perform_in)
subject
end
+
+ context 'enqueue_twice feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_enqueue_twice: false)
+ end
+
+ it 'starts the worker only once' do
+ expect(::ContainerRegistry::Migration::EnqueuerWorker).to receive(:perform_async)
+ expect(::ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_in)
+
+ subject
+ end
+ end
end
describe '#start_pre_import' do
@@ -354,6 +368,7 @@ RSpec.describe ContainerRepository, :aggregate_failures do
subject { repository.skip_import(reason: :too_many_retries) }
it_behaves_like 'transitioning from allowed states', ContainerRepository::SKIPPABLE_MIGRATION_STATES
+ it_behaves_like 'queueing the next import'
it 'sets migration_skipped_at and migration_skipped_reason' do
expect { subject }.to change { repository.reload.migration_skipped_at }
@@ -630,10 +645,15 @@ RSpec.describe ContainerRepository, :aggregate_failures do
describe '#start_expiration_policy!' do
subject { repository.start_expiration_policy! }
+ before do
+ repository.update_column(:last_cleanup_deleted_tags_count, 10)
+ end
+
it 'sets the expiration policy started at to now' do
freeze_time do
expect { subject }
.to change { repository.expiration_policy_started_at }.from(nil).to(Time.zone.now)
+ .and change { repository.last_cleanup_deleted_tags_count }.from(10).to(nil)
end
end
end
@@ -690,22 +710,6 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
- describe '#reset_expiration_policy_started_at!' do
- subject { repository.reset_expiration_policy_started_at! }
-
- before do
- repository.start_expiration_policy!
- end
-
- it 'resets the expiration policy started at' do
- started_at = repository.expiration_policy_started_at
-
- expect(started_at).not_to be_nil
- expect { subject }
- .to change { repository.expiration_policy_started_at }.from(started_at).to(nil)
- end
- end
-
context 'registry migration' do
before do
allow(repository.gitlab_api_client).to receive(:supports_gitlab_api?).and_return(true)
@@ -1307,6 +1311,38 @@ RSpec.describe ContainerRepository, :aggregate_failures do
end
end
+ describe '#nearing_or_exceeded_retry_limit?' do
+ subject { repository.nearing_or_exceeded_retry_limit? }
+
+ before do
+ stub_application_setting(container_registry_import_max_retries: 3)
+ end
+
+ context 'migration_retries_count is 1 less than max_retries' do
+ before do
+ repository.update_column(:migration_retries_count, 2)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ context 'migration_retries_count is lower than max_retries' do
+ before do
+ repository.update_column(:migration_retries_count, 1)
+ end
+
+ it { is_expected.to eq(false) }
+ end
+
+ context 'migration_retries_count equal to or higher than max_retries' do
+ before do
+ repository.update_column(:migration_retries_count, 3)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+ end
+
context 'with repositories' do
let_it_be_with_reload(:repository) { create(:container_repository, :cleanup_unscheduled) }
let_it_be(:other_repository) { create(:container_repository, :cleanup_unscheduled) }
diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb
index c48f1fab3c6..635326eeadc 100644
--- a/spec/models/deploy_token_spec.rb
+++ b/spec/models/deploy_token_spec.rb
@@ -73,10 +73,10 @@ RSpec.describe DeployToken do
describe '#ensure_token' do
it 'ensures a token' do
- deploy_token.token = nil
+ deploy_token.token_encrypted = nil
deploy_token.save!
- expect(deploy_token.token).not_to be_empty
+ expect(deploy_token.token_encrypted).not_to be_empty
end
end
@@ -469,4 +469,10 @@ RSpec.describe DeployToken do
end
end
end
+
+ describe '.impersonated?' do
+ it 'returns false' do
+ expect(subject.impersonated?).to be(false)
+ end
+ end
end
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index 705b9b4cc65..409353bdbcf 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -858,12 +858,24 @@ RSpec.describe Deployment do
end
end
- it 'tracks an exception if an invalid status transition is detected' do
- expect(Gitlab::ErrorTracking)
+ context 'tracks an exception if an invalid status transition is detected' do
+ it do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception)
+ .with(instance_of(described_class::StatusUpdateError), deployment_id: deploy.id)
+
+ expect(deploy.update_status('running')).to eq(false)
+ end
+
+ it do
+ deploy.update_status('success')
+
+ expect(Gitlab::ErrorTracking)
.to receive(:track_exception)
.with(instance_of(described_class::StatusUpdateError), deployment_id: deploy.id)
- expect(deploy.update_status('running')).to eq(false)
+ expect(deploy.update_status('created')).to eq(false)
+ end
end
it 'tracks an exception if an invalid argument' do
@@ -871,7 +883,7 @@ RSpec.describe Deployment do
.to receive(:track_exception)
.with(instance_of(described_class::StatusUpdateError), deployment_id: deploy.id)
- expect(deploy.update_status('created')).to eq(false)
+ expect(deploy.update_status('recreate')).to eq(false)
end
context 'mapping status to event' do
@@ -893,6 +905,16 @@ RSpec.describe Deployment do
deploy.update_status(status)
end
end
+
+ context 'for created status update' do
+ let(:deploy) { create(:deployment, status: :created) }
+
+ it 'calls the correct method' do
+ expect(deploy).to receive(:create!)
+
+ deploy.update_status('created')
+ end
+ end
end
end
@@ -974,7 +996,9 @@ RSpec.describe Deployment do
context 'with created build' do
let(:build_status) { :created }
- it_behaves_like 'ignoring build'
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %Q{Status cannot transition via \"create\"} }
+ end
end
context 'with running build' do
@@ -1002,7 +1026,9 @@ RSpec.describe Deployment do
context 'with created build' do
let(:build_status) { :created }
- it_behaves_like 'ignoring build'
+ it_behaves_like 'gracefully handling error' do
+ let(:error_message) { %Q{Status cannot transition via \"create\"} }
+ end
end
context 'with running build' do
diff --git a/spec/models/design_management/action_spec.rb b/spec/models/design_management/action_spec.rb
index 0a8bbc8d26e..f2b8fcaa256 100644
--- a/spec/models/design_management/action_spec.rb
+++ b/spec/models/design_management/action_spec.rb
@@ -49,6 +49,15 @@ RSpec.describe DesignManagement::Action do
end
end
+ describe '.with_version' do
+ it 'preloads the version' do
+ actions = described_class.with_version
+
+ expect { actions.map(&:version) }.not_to exceed_query_limit(2)
+ expect(actions.count).to be > 2
+ end
+ end
+
describe '.by_event' do
it 'returns the actions by event type' do
expect(described_class.by_event(:deletion)).to match_array([action_a_2, action_c])
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index b42e73e6d93..34dfc7a1fce 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -621,7 +621,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
expect(close_action.processed).to be_falsey
# it encounters the StaleObjectError at first, but reloads the object and runs `build.play`
- expect { subject }.not_to raise_error(ActiveRecord::StaleObjectError)
+ expect { subject }.not_to raise_error
# Now the build should be processed.
expect(close_action.reload.processed).to be_truthy
@@ -683,19 +683,6 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
expect(actions.count).to eq(environment.successful_deployments.count)
end
end
-
- context 'when the feature is disabled' do
- before do
- stub_feature_flags(environment_multiple_stop_actions: false)
- end
-
- it 'returns the last deployment job stop action' do
- stop_actions = subject
-
- expect(stop_actions.first).to eq(close_actions[1])
- expect(stop_actions.count).to eq(1)
- end
- end
end
end
@@ -886,22 +873,10 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
is_expected.to eq(deployment)
end
- context 'env_last_deployment_by_finished_at feature flag' do
- it 'when enabled it returns the deployment with the latest finished_at' do
- stub_feature_flags(env_last_deployment_by_finished_at: true)
+ it 'returns the deployment with the latest finished_at' do
+ expect(old_deployment.finished_at < deployment.finished_at).to be_truthy
- expect(old_deployment.finished_at < deployment.finished_at).to be_truthy
-
- is_expected.to eq(deployment)
- end
-
- it 'when disabled it returns the deployment with the highest id' do
- stub_feature_flags(env_last_deployment_by_finished_at: false)
-
- expect(old_deployment.finished_at < deployment.finished_at).to be_truthy
-
- is_expected.to eq(old_deployment)
- end
+ is_expected.to eq(deployment)
end
end
end
@@ -1845,7 +1820,7 @@ RSpec.describe Environment, :use_clean_rails_memory_store_caching do
it 'fetches the rollout status from the deployment platform' do
expect(environment.deployment_platform).to receive(:rollout_status)
- .with(environment, pods: pods, deployments: deployments)
+ .with(environment, { pods: pods, deployments: deployments })
.and_return(:mock_rollout_status)
is_expected.to eq(:mock_rollout_status)
diff --git a/spec/models/event_collection_spec.rb b/spec/models/event_collection_spec.rb
index 036072aab76..67b58c7bf6f 100644
--- a/spec/models/event_collection_spec.rb
+++ b/spec/models/event_collection_spec.rb
@@ -5,138 +5,188 @@ require 'spec_helper'
RSpec.describe EventCollection do
include DesignManagementTestHelpers
- describe '#to_a' do
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project_empty_repo, group: group) }
- let_it_be(:projects) { Project.where(id: project.id) }
- let_it_be(:user) { create(:user) }
- let_it_be(:merge_request) { create(:merge_request) }
-
- before do
- enable_design_management
- end
+ shared_examples 'EventCollection examples' do
+ describe '#to_a' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project_empty_repo, group: group) }
+ let_it_be(:projects) { Project.where(id: project.id) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request) }
+
+ before do
+ enable_design_management
+ end
- context 'with project events' do
- let_it_be(:push_event_payloads) do
- Array.new(9) do
- create(:push_event_payload,
- event: create(:push_event, project: project, author: user))
+ context 'with project events' do
+ let_it_be(:push_event_payloads) do
+ Array.new(9) do
+ create(:push_event_payload,
+ event: create(:push_event, project: project, author: user))
+ end
end
- end
- let_it_be(:merge_request_events) { create_list(:event, 10, :commented, project: project, target: merge_request) }
- let_it_be(:closed_issue_event) { create(:closed_issue_event, project: project, author: user) }
- let_it_be(:wiki_page_event) { create(:wiki_page_event, project: project) }
- let_it_be(:design_event) { create(:design_event, project: project) }
-
- let(:push_events) { push_event_payloads.map(&:event) }
-
- it 'returns an Array of events', :aggregate_failures do
- most_recent_20_events = [
- wiki_page_event,
- design_event,
- closed_issue_event,
- *push_events,
- *merge_request_events
- ].sort_by(&:id).reverse.take(20)
- events = described_class.new(projects).to_a
-
- expect(events).to be_an_instance_of(Array)
- expect(events).to match_array(most_recent_20_events)
- end
+ let_it_be(:merge_request_events) { create_list(:event, 10, :merged, project: project, target: merge_request) }
+ let_it_be(:closed_issue_event) { create(:closed_issue_event, project: project, author: user) }
+ let_it_be(:wiki_page_event) { create(:wiki_page_event, project: project) }
+ let_it_be(:design_event) { create(:design_event, project: project) }
+
+ let(:push_events) { push_event_payloads.map(&:event) }
+
+ it 'returns an Array of all event types when no filter is passed', :aggregate_failures do
+ most_recent_20_events = [
+ wiki_page_event,
+ design_event,
+ closed_issue_event,
+ *push_events,
+ *merge_request_events
+ ].sort_by(&:id).reverse.take(20)
+ events = described_class.new(projects).to_a
+
+ expect(events).to be_an_instance_of(Array)
+ expect(events).to match_array(most_recent_20_events)
+ end
- it 'includes the wiki page events when using to_a' do
- events = described_class.new(projects).to_a
+ it 'includes the wiki page events when using to_a' do
+ events = described_class.new(projects).to_a
- expect(events).to include(wiki_page_event)
- end
+ expect(events).to include(wiki_page_event)
+ end
- it 'includes the design events' do
- collection = described_class.new(projects)
+ it 'includes the design events' do
+ collection = described_class.new(projects)
- expect(collection.to_a).to include(design_event)
- expect(collection.all_project_events).to include(design_event)
- end
+ expect(collection.to_a).to include(design_event)
+ expect(collection.all_project_events).to include(design_event)
+ end
- it 'includes the wiki page events when using all_project_events' do
- events = described_class.new(projects).all_project_events
+ it 'includes the wiki page events when using all_project_events' do
+ events = described_class.new(projects).all_project_events
- expect(events).to include(wiki_page_event)
- end
+ expect(events).to include(wiki_page_event)
+ end
- it 'applies a limit to the number of events' do
- events = described_class.new(projects).to_a
+ it 'applies a limit to the number of events' do
+ events = described_class.new(projects).to_a
- expect(events.length).to eq(20)
- end
+ expect(events.length).to eq(20)
+ end
- it 'can paginate through events' do
- events = described_class.new(projects, limit: 5, offset: 15).to_a
+ it 'can paginate through events' do
+ events = described_class.new(projects, limit: 5, offset: 15).to_a
- expect(events.length).to eq(5)
- end
+ expect(events.length).to eq(5)
+ end
- it 'returns an empty Array when crossing the maximum page number' do
- events = described_class.new(projects, limit: 1, offset: 15).to_a
+ it 'returns an empty Array when crossing the maximum page number' do
+ events = described_class.new(projects, limit: 1, offset: 15).to_a
- expect(events).to be_empty
- end
+ expect(events).to be_empty
+ end
- it 'allows filtering of events using an EventFilter, returning single item' do
- filter = EventFilter.new(EventFilter::ISSUE)
- events = described_class.new(projects, filter: filter).to_a
+ it 'allows filtering of events using an EventFilter, returning single item' do
+ filter = EventFilter.new(EventFilter::ISSUE)
+ events = described_class.new(projects, filter: filter).to_a
- expect(events).to contain_exactly(closed_issue_event)
- end
+ expect(events).to contain_exactly(closed_issue_event)
+ end
- it 'allows filtering of events using an EventFilter, returning several items' do
- filter = EventFilter.new(EventFilter::COMMENTS)
- events = described_class.new(projects, filter: filter).to_a
+ it 'allows filtering of events using an EventFilter, returning several items' do
+ filter = EventFilter.new(EventFilter::MERGED)
+ events = described_class.new(projects, filter: filter).to_a
- expect(events).to match_array(merge_request_events)
- end
+ expect(events).to match_array(merge_request_events)
+ end
- it 'allows filtering of events using an EventFilter, returning pushes' do
- filter = EventFilter.new(EventFilter::PUSH)
- events = described_class.new(projects, filter: filter).to_a
+ it 'allows filtering of events using an EventFilter, returning pushes' do
+ filter = EventFilter.new(EventFilter::PUSH)
+ events = described_class.new(projects, filter: filter).to_a
- expect(events).to match_array(push_events)
+ expect(events).to match_array(push_events)
+ end
end
- end
- context 'with group events' do
- let(:groups) { group.self_and_descendants.public_or_visible_to_user(user) }
- let(:subject) { described_class.new(projects, groups: groups).to_a }
+ context 'with group events' do
+ let(:groups) { group.self_and_descendants.public_or_visible_to_user(user) }
+ let(:subject) { described_class.new(projects, groups: groups).to_a }
- it 'includes also group events' do
- subgroup = create(:group, parent: group)
- event1 = create(:event, project: project, author: user)
- event2 = create(:event, project: nil, group: group, author: user)
- event3 = create(:event, project: nil, group: subgroup, author: user)
+ it 'includes also group events' do
+ subgroup = create(:group, parent: group)
+ event1 = create(:event, project: project, author: user)
+ event2 = create(:event, project: nil, group: group, author: user)
+ event3 = create(:event, project: nil, group: subgroup, author: user)
- expect(subject).to eq([event3, event2, event1])
- end
+ expect(subject).to eq([event3, event2, event1])
+ end
- it 'does not include events from inaccessible groups' do
- subgroup = create(:group, :private, parent: group)
- event1 = create(:event, project: nil, group: group, author: user)
- create(:event, project: nil, group: subgroup, author: user)
+ it 'does not include events from inaccessible groups' do
+ subgroup = create(:group, :private, parent: group)
+ event1 = create(:event, project: nil, group: group, author: user)
+ create(:event, project: nil, group: subgroup, author: user)
- expect(subject).to eq([event1])
- end
+ expect(subject).to match_array([event1])
+ end
+
+ context 'pagination through events' do
+ let_it_be(:project_events) { create_list(:event, 10, project: project) }
+ let_it_be(:group_events) { create_list(:event, 10, group: group, author: user) }
- context 'pagination through events' do
- let_it_be(:project_events) { create_list(:event, 10, project: project) }
- let_it_be(:group_events) { create_list(:event, 10, group: group, author: user) }
+ let(:subject) { described_class.new(projects, limit: 10, offset: 5, groups: groups).to_a }
- let(:subject) { described_class.new(projects, limit: 10, offset: 5, groups: groups).to_a }
+ it 'returns recent groups and projects events' do
+ recent_events_with_offset = (project_events[5..] + group_events[..4]).reverse
- it 'returns recent groups and projects events' do
- recent_events_with_offset = (project_events[5..] + group_events[..4]).reverse
+ expect(subject).to eq(recent_events_with_offset)
+ end
+ end
- expect(subject).to eq(recent_events_with_offset)
+ context 'project exclusive event types' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:filter, :event) do
+ EventFilter::PUSH | lazy { create(:push_event, project: project) }
+ EventFilter::MERGED | lazy { create(:event, :merged, project: project, target: merge_request) }
+ EventFilter::TEAM | lazy { create(:event, :joined, project: project) }
+ EventFilter::ISSUE | lazy { create(:closed_issue_event, project: project) }
+ EventFilter::DESIGNS | lazy { create(:design_event, project: project) }
+ end
+
+ with_them do
+ let(:subject) do
+ described_class.new(projects, groups: Group.where(id: group.id), filter: EventFilter.new(filter))
+ end
+
+ it "queries only project events" do
+ expected_event = event # Forcing lazy evaluation
+ expect(subject).to receive(:project_events).with(no_args).and_call_original
+ expect(subject).not_to receive(:group_events)
+
+ expect(subject.to_a).to match_array(expected_event)
+ end
+ end
end
end
end
end
+
+ context 'when the optimized_project_and_group_activity_queries FF is on' do
+ before do
+ stub_feature_flags(optimized_project_and_group_activity_queries: true)
+ end
+
+ it_behaves_like 'EventCollection examples'
+
+ it 'returns no events if no projects are passed' do
+ events = described_class.new(Project.none).to_a
+
+ expect(events).to be_empty
+ end
+ end
+
+ context 'when the optimized_project_and_group_activity_queries FF is off' do
+ before do
+ stub_feature_flags(optimized_project_and_group_activity_queries: false)
+ end
+
+ it_behaves_like 'EventCollection examples'
+ end
end
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index f099015e63e..2c1bbfcb35f 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -834,7 +834,13 @@ RSpec.describe Event do
end
end
- context 'when a project was updated more than 1 hour ago' do
+ context 'when a project was updated more than 1 hour ago', :clean_gitlab_redis_shared_state do
+ before do
+ ::Gitlab::Redis::SharedState.with do |redis|
+ redis.hset('inactive_projects_deletion_warning_email_notified', "project:#{project.id}", Date.current)
+ end
+ end
+
it 'updates the project' do
project.touch(:last_activity_at, time: 1.year.ago) # rubocop: disable Rails/SkipsModelValidations
@@ -845,6 +851,17 @@ RSpec.describe Event do
expect(project.last_activity_at).to be_like_time(event.created_at)
expect(project.updated_at).to be_like_time(event.created_at)
end
+
+ it "deletes the redis key for if the project was inactive" do
+ Gitlab::Redis::SharedState.with do |redis|
+ expect(redis).to receive(:hdel).with('inactive_projects_deletion_warning_email_notified',
+ "project:#{project.id}")
+ end
+
+ project.touch(:last_activity_at, time: 1.year.ago) # rubocop: disable Rails/SkipsModelValidations
+
+ create_push_event(project, project.first_owner)
+ end
end
end
@@ -1040,6 +1057,36 @@ RSpec.describe Event do
end
end
+ describe '#has_no_project_and_group' do
+ context 'with project event' do
+ it 'returns false when the event has project' do
+ event = build(:event, project: create(:project))
+
+ expect(event.has_no_project_and_group?).to be false
+ end
+
+ it 'returns true when the event has no project' do
+ event = build(:event, project: nil)
+
+ expect(event.has_no_project_and_group?).to be true
+ end
+ end
+
+ context 'with group event' do
+ it 'returns false when the event has group' do
+ event = build(:event, group: create(:group))
+
+ expect(event.has_no_project_and_group?).to be false
+ end
+
+ it 'returns true when the event has no group' do
+ event = build(:event, group: nil)
+
+ expect(event.has_no_project_and_group?).to be true
+ end
+ end
+ end
+
def create_push_event(project, user)
event = create(:push_event, project: project, author: user)
diff --git a/spec/models/incident_management/timeline_event_spec.rb b/spec/models/incident_management/timeline_event_spec.rb
new file mode 100644
index 00000000000..17150fc9266
--- /dev/null
+++ b/spec/models/incident_management/timeline_event_spec.rb
@@ -0,0 +1,84 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEvent do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:timeline_event) { create(:incident_management_timeline_event, project: project, incident: incident) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:author) }
+ it { is_expected.to belong_to(:incident) }
+ it { is_expected.to belong_to(:updated_by_user) }
+ it { is_expected.to belong_to(:promoted_from_note) }
+ end
+
+ describe 'validations' do
+ subject { build(:incident_management_timeline_event) }
+
+ it { is_expected.to validate_presence_of(:project) }
+ it { is_expected.to validate_presence_of(:incident) }
+ it { is_expected.to validate_presence_of(:note) }
+ it { is_expected.to validate_length_of(:note).is_at_most(10_000) }
+ it { is_expected.to validate_presence_of(:note_html) }
+ it { is_expected.to validate_length_of(:note_html).is_at_most(10_000) }
+ it { is_expected.to validate_presence_of(:occurred_at) }
+ it { is_expected.to validate_presence_of(:action) }
+ it { is_expected.to validate_length_of(:action).is_at_most(128) }
+ end
+
+ describe '.order_occurred_at_asc' do
+ let_it_be(:occurred_3mins_ago) do
+ create(:incident_management_timeline_event, project: project, occurred_at: 3.minutes.ago)
+ end
+
+ let_it_be(:occurred_2mins_ago) do
+ create(:incident_management_timeline_event, project: project, occurred_at: 2.minutes.ago)
+ end
+
+ subject(:order) { described_class.order_occurred_at_asc }
+
+ it 'sorts timeline events by occurred_at' do
+ is_expected.to eq([occurred_3mins_ago, occurred_2mins_ago, timeline_event])
+ end
+ end
+
+ describe '#cache_markdown_field' do
+ let(:note) { 'note **bold** _italic_ `code` ![image](/path/img.png) :+1:ðŸ‘' }
+ let(:expected_note_html) do
+ # rubocop:disable Layout/LineLength
+ '<p>note <strong>bold</strong> <em>italic</em> <code>code</code> <a class="with-attachment-icon" href="/path/img.png" target="_blank" rel="noopener noreferrer">image</a> ðŸ‘ðŸ‘</p>'
+ # rubocop:enable Layout/LineLength
+ end
+
+ before do
+ allow(Banzai::Renderer).to receive(:cacheless_render_field).and_call_original
+ end
+
+ context 'on create' do
+ let(:timeline_event) do
+ build(:incident_management_timeline_event, project: project, incident: incident, note: note)
+ end
+
+ it 'updates note_html', :aggregate_failures do
+ expect(Banzai::Renderer).to receive(:cacheless_render_field)
+ .with(timeline_event, :note, { skip_project_check: false })
+
+ expect { timeline_event.save! }.to change { timeline_event.note_html }.to(expected_note_html)
+ end
+ end
+
+ context 'on update' do
+ let(:timeline_event) { create(:incident_management_timeline_event, project: project, incident: incident) }
+
+ it 'updates note_html', :aggregate_failures do
+ expect(Banzai::Renderer).to receive(:cacheless_render_field)
+ .with(timeline_event, :note, { skip_project_check: false })
+
+ expect { timeline_event.update!(note: note) }.to change { timeline_event.note_html }.to(expected_note_html)
+ end
+ end
+ end
+end
diff --git a/spec/models/instance_configuration_spec.rb b/spec/models/instance_configuration_spec.rb
index 3af717798c3..f57667cc5d6 100644
--- a/spec/models/instance_configuration_spec.rb
+++ b/spec/models/instance_configuration_spec.rb
@@ -99,6 +99,7 @@ RSpec.describe InstanceConfiguration do
max_attachment_size: 10,
receive_max_input_size: 20,
max_import_size: 30,
+ max_export_size: 40,
diff_max_patch_bytes: 409600,
max_artifacts_size: 50,
max_pages_size: 60,
@@ -112,6 +113,7 @@ RSpec.describe InstanceConfiguration do
expect(size_limits[:max_attachment_size]).to eq(10.megabytes)
expect(size_limits[:receive_max_input_size]).to eq(20.megabytes)
expect(size_limits[:max_import_size]).to eq(30.megabytes)
+ expect(size_limits[:max_export_size]).to eq(40.megabytes)
expect(size_limits[:diff_max_patch_bytes]).to eq(400.kilobytes)
expect(size_limits[:max_artifacts_size]).to eq(50.megabytes)
expect(size_limits[:max_pages_size]).to eq(60.megabytes)
@@ -127,11 +129,16 @@ RSpec.describe InstanceConfiguration do
end
it 'returns nil if set to 0 (unlimited)' do
- Gitlab::CurrentSettings.current_application_settings.update!(max_import_size: 0, max_pages_size: 0)
+ Gitlab::CurrentSettings.current_application_settings.update!(
+ max_import_size: 0,
+ max_export_size: 0,
+ max_pages_size: 0
+ )
size_limits = subject.settings[:size_limits]
expect(size_limits[:max_import_size]).to be_nil
+ expect(size_limits[:max_export_size]).to be_nil
expect(size_limits[:max_pages_size]).to be_nil
end
end
@@ -173,6 +180,61 @@ RSpec.describe InstanceConfiguration do
end
end
+ describe '#ci_cd_limits' do
+ let_it_be(:plan1) { create(:plan, name: 'plan1', title: 'Plan 1') }
+ let_it_be(:plan2) { create(:plan, name: 'plan2', title: 'Plan 2') }
+
+ before do
+ create(:plan_limits,
+ plan: plan1,
+ ci_pipeline_size: 1001,
+ ci_active_jobs: 1002,
+ ci_active_pipelines: 1003,
+ ci_project_subscriptions: 1004,
+ ci_pipeline_schedules: 1005,
+ ci_needs_size_limit: 1006,
+ ci_registered_group_runners: 1007,
+ ci_registered_project_runners: 1008
+ )
+ create(:plan_limits,
+ plan: plan2,
+ ci_pipeline_size: 1101,
+ ci_active_jobs: 1102,
+ ci_active_pipelines: 1103,
+ ci_project_subscriptions: 1104,
+ ci_pipeline_schedules: 1105,
+ ci_needs_size_limit: 1106,
+ ci_registered_group_runners: 1107,
+ ci_registered_project_runners: 1108
+ )
+ end
+
+ it 'returns CI/CD limits' do
+ ci_cd_size_limits = subject.settings[:ci_cd_limits]
+
+ expect(ci_cd_size_limits[:Plan1]).to eq({
+ ci_active_jobs: 1002,
+ ci_active_pipelines: 1003,
+ ci_needs_size_limit: 1006,
+ ci_pipeline_schedules: 1005,
+ ci_pipeline_size: 1001,
+ ci_project_subscriptions: 1004,
+ ci_registered_group_runners: 1007,
+ ci_registered_project_runners: 1008
+ })
+ expect(ci_cd_size_limits[:Plan2]).to eq({
+ ci_active_jobs: 1102,
+ ci_active_pipelines: 1103,
+ ci_needs_size_limit: 1106,
+ ci_pipeline_schedules: 1105,
+ ci_pipeline_size: 1101,
+ ci_project_subscriptions: 1104,
+ ci_registered_group_runners: 1107,
+ ci_registered_project_runners: 1108
+ })
+ end
+ end
+
describe '#rate_limits' do
before do
Gitlab::CurrentSettings.current_application_settings.update!(
diff --git a/spec/models/integration_spec.rb b/spec/models/integration_spec.rb
index 0f596d3908d..0567a8bd386 100644
--- a/spec/models/integration_spec.rb
+++ b/spec/models/integration_spec.rb
@@ -249,18 +249,24 @@ RSpec.describe Integration do
it_behaves_like 'integration instances'
context 'with all existing instances' do
+ def integration_hash(type)
+ Integration.new(instance: true, type: type).to_integration_hash
+ end
+
before do
- Integration.insert_all(
- Integration.available_integration_types(include_project_specific: false).map { |type| { instance: true, type: type } }
- )
+ attrs = Integration.available_integration_types(include_project_specific: false).map do
+ integration_hash(_1)
+ end
+
+ Integration.insert_all(attrs)
end
it_behaves_like 'integration instances'
- context 'with a previous existing integration (MockCiService) and a new integration (Asana)' do
+ context 'with a previous existing integration (:mock_ci) and a new integration (:asana)' do
before do
- Integration.insert({ type: 'MockCiService', instance: true })
- Integration.delete_by(type: 'AsanaService', instance: true)
+ Integration.insert(integration_hash(:mock_ci))
+ Integration.delete_by(**integration_hash(:asana))
end
it_behaves_like 'integration instances'
@@ -681,7 +687,7 @@ RSpec.describe Integration do
integration.properties = { foo: 1, bar: 2 }
- expect { integration.properties[:foo] = 3 }.to raise_error
+ expect { integration.properties[:foo] = 3 }.to raise_error(FrozenError)
end
end
@@ -782,8 +788,16 @@ RSpec.describe Integration do
end
end
- describe '#api_field_names' do
- shared_examples 'api field names' do
+ describe 'field definitions' do
+ shared_examples '#fields' do
+ it 'does not return the same array' do
+ integration = fake_integration.new
+
+ expect(integration.fields).not_to be(integration.fields)
+ end
+ end
+
+ shared_examples '#api_field_names' do
it 'filters out secret fields' do
safe_fields = %w[some_safe_field safe_field url trojan_gift]
@@ -816,7 +830,8 @@ RSpec.describe Integration do
end
end
- it_behaves_like 'api field names'
+ it_behaves_like '#fields'
+ it_behaves_like '#api_field_names'
end
context 'when the class uses the field DSL' do
@@ -839,7 +854,8 @@ RSpec.describe Integration do
end
end
- it_behaves_like 'api field names'
+ it_behaves_like '#fields'
+ it_behaves_like '#api_field_names'
end
end
@@ -848,7 +864,8 @@ RSpec.describe Integration do
let(:test_message) { "test message" }
let(:arguments) do
{
- service_class: integration.class.name,
+ integration_class: integration.class.name,
+ integration_id: integration.id,
project_path: project.full_path,
project_id: project.id,
message: test_message,
@@ -857,13 +874,13 @@ RSpec.describe Integration do
end
it 'logs info messages using json logger' do
- expect(Gitlab::JsonLogger).to receive(:info).with(arguments)
+ expect(Gitlab::IntegrationsLogger).to receive(:info).with(arguments)
integration.log_info(test_message, additional_argument: 'some argument')
end
it 'logs error messages using json logger' do
- expect(Gitlab::JsonLogger).to receive(:error).with(arguments)
+ expect(Gitlab::IntegrationsLogger).to receive(:error).with(arguments)
integration.log_error(test_message, additional_argument: 'some argument')
end
@@ -872,7 +889,8 @@ RSpec.describe Integration do
let(:project) { nil }
let(:arguments) do
{
- service_class: integration.class.name,
+ integration_class: integration.class.name,
+ integration_id: integration.id,
project_path: nil,
project_id: nil,
message: test_message,
@@ -881,11 +899,33 @@ RSpec.describe Integration do
end
it 'logs info messages using json logger' do
- expect(Gitlab::JsonLogger).to receive(:info).with(arguments)
+ expect(Gitlab::IntegrationsLogger).to receive(:info).with(arguments)
integration.log_info(test_message, additional_argument: 'some argument')
end
end
+
+ context 'logging exceptions' do
+ let(:error) { RuntimeError.new('exception message') }
+ let(:arguments) do
+ super().merge(
+ 'exception.class' => 'RuntimeError',
+ 'exception.message' => 'exception message'
+ )
+ end
+
+ it 'logs exceptions using json logger' do
+ expect(Gitlab::IntegrationsLogger).to receive(:error).with(arguments.merge(message: 'exception message'))
+
+ integration.log_exception(error, additional_argument: 'some argument')
+ end
+
+ it 'logs exceptions using json logger with a custom message' do
+ expect(Gitlab::IntegrationsLogger).to receive(:error).with(arguments.merge(message: 'custom message'))
+
+ integration.log_exception(error, message: 'custom message', additional_argument: 'some argument')
+ end
+ end
end
describe '.available_integration_names' do
diff --git a/spec/models/integrations/bamboo_spec.rb b/spec/models/integrations/bamboo_spec.rb
index b5684d153f2..574b87d6c60 100644
--- a/spec/models/integrations/bamboo_spec.rb
+++ b/spec/models/integrations/bamboo_spec.rb
@@ -227,7 +227,7 @@ RSpec.describe Integrations::Bamboo, :use_clean_rails_memory_store_caching do
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
- .with(instance_of(http_error), project_id: project.id)
+ .with(instance_of(http_error), { project_id: project.id })
is_expected.to eq(:error)
end
diff --git a/spec/models/integrations/base_chat_notification_spec.rb b/spec/models/integrations/base_chat_notification_spec.rb
index ac4031a9b7d..672d8de1e14 100644
--- a/spec/models/integrations/base_chat_notification_spec.rb
+++ b/spec/models/integrations/base_chat_notification_spec.rb
@@ -3,15 +3,14 @@
require 'spec_helper'
RSpec.describe Integrations::BaseChatNotification do
- describe 'Associations' do
+ describe 'validations' do
before do
allow(subject).to receive(:activated?).and_return(true)
+ allow(subject).to receive(:default_channel_placeholder).and_return('placeholder')
+ allow(subject).to receive(:webhook_placeholder).and_return('placeholder')
end
it { is_expected.to validate_presence_of :webhook }
- end
-
- describe 'validations' do
it { is_expected.to validate_inclusion_of(:labels_to_be_notified_behavior).in_array(%w[match_any match_all]).allow_blank }
end
@@ -274,4 +273,16 @@ RSpec.describe Integrations::BaseChatNotification do
it_behaves_like 'with channel specified', 'slack-integration, #slack-test, @UDLP91W0A', ['slack-integration', '#slack-test', '@UDLP91W0A']
end
end
+
+ describe '#default_channel_placeholder' do
+ it 'raises an error' do
+ expect { subject.default_channel_placeholder }.to raise_error(NotImplementedError)
+ end
+ end
+
+ describe '#webhook_placeholder' do
+ it 'raises an error' do
+ expect { subject.webhook_placeholder }.to raise_error(NotImplementedError)
+ end
+ end
end
diff --git a/spec/models/integrations/buildkite_spec.rb b/spec/models/integrations/buildkite_spec.rb
index 4207ae0d555..af2e587dc7b 100644
--- a/spec/models/integrations/buildkite_spec.rb
+++ b/spec/models/integrations/buildkite_spec.rb
@@ -129,7 +129,7 @@ RSpec.describe Integrations::Buildkite, :use_clean_rails_memory_store_caching do
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
- .with(instance_of(http_error), project_id: project.id)
+ .with(instance_of(http_error), { project_id: project.id })
is_expected.to eq(:error)
end
diff --git a/spec/models/integrations/drone_ci_spec.rb b/spec/models/integrations/drone_ci_spec.rb
index dd64dcfc52c..78d55c49e7b 100644
--- a/spec/models/integrations/drone_ci_spec.rb
+++ b/spec/models/integrations/drone_ci_spec.rb
@@ -163,7 +163,7 @@ RSpec.describe Integrations::DroneCi, :use_clean_rails_memory_store_caching do
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
- .with(instance_of(http_error), project_id: project.id)
+ .with(instance_of(http_error), { project_id: project.id })
is_expected.to eq(:error)
end
diff --git a/spec/models/integrations/jenkins_spec.rb b/spec/models/integrations/jenkins_spec.rb
index 3d6393f2793..200de1305e2 100644
--- a/spec/models/integrations/jenkins_spec.rb
+++ b/spec/models/integrations/jenkins_spec.rb
@@ -4,11 +4,12 @@ require 'spec_helper'
RSpec.describe Integrations::Jenkins do
let(:project) { create(:project) }
+ let(:jenkins_integration) { described_class.new(jenkins_params) }
let(:jenkins_url) { 'http://jenkins.example.com/' }
let(:jenkins_hook_url) { jenkins_url + 'project/my_project' }
let(:jenkins_username) { 'u$er name%2520' }
let(:jenkins_password) { 'pas$ word' }
-
+ let(:jenkins_authorization) { 'Basic ' + ::Base64.strict_encode64(jenkins_username + ':' + jenkins_password) }
let(:jenkins_params) do
{
active: true,
@@ -22,17 +23,21 @@ RSpec.describe Integrations::Jenkins do
}
end
- let(:jenkins_authorization) { "Basic " + ::Base64.strict_encode64(jenkins_username + ':' + jenkins_password) }
-
include_context Integrations::EnableSslVerification do
- let(:integration) { described_class.new(jenkins_params) }
+ let(:integration) { jenkins_integration }
end
it_behaves_like Integrations::HasWebHook do
- let(:integration) { described_class.new(jenkins_params) }
+ let(:integration) { jenkins_integration }
let(:hook_url) { "http://#{ERB::Util.url_encode jenkins_username}:#{ERB::Util.url_encode jenkins_password}@jenkins.example.com/project/my_project" }
end
+ it 'sets the default values', :aggregate_failures do
+ expect(jenkins_integration.push_events).to eq(true)
+ expect(jenkins_integration.merge_requests_events).to eq(false)
+ expect(jenkins_integration.tag_push_events).to eq(false)
+ end
+
describe 'username validation' do
let(:jenkins_integration) do
described_class.create!(
diff --git a/spec/models/integrations/jira_spec.rb b/spec/models/integrations/jira_spec.rb
index d244b1d33d5..061c770a61a 100644
--- a/spec/models/integrations/jira_spec.rb
+++ b/spec/models/integrations/jira_spec.rb
@@ -27,6 +27,10 @@ RSpec.describe Integrations::Jira do
WebMock.stub_request(:get, /serverInfo/).to_return(body: server_info_results.to_json )
end
+ it_behaves_like Integrations::ResetSecretFields do
+ let(:integration) { jira_integration }
+ end
+
describe '#options' do
let(:options) do
{
@@ -122,6 +126,11 @@ RSpec.describe Integrations::Jira do
it 'includes SECTION_TYPE_JIRA_ISSUES' do
expect(sections).to include(described_class::SECTION_TYPE_JIRA_ISSUES)
end
+
+ it 'section SECTION_TYPE_JIRA_ISSUES has `plan` attribute' do
+ jira_issues_section = integration.sections.find { |s| s[:type] == described_class::SECTION_TYPE_JIRA_ISSUES }
+ expect(jira_issues_section[:plan]).to eq('premium')
+ end
end
context 'when project_level? is false' do
@@ -301,7 +310,7 @@ RSpec.describe Integrations::Jira do
let_it_be(:new_url) { 'http://jira-new.example.com' }
before do
- integration.update!(username: new_username, url: new_url)
+ integration.update!(username: new_username, url: new_url, password: password)
end
it 'stores updated data in jira_tracker_data table' do
@@ -318,7 +327,7 @@ RSpec.describe Integrations::Jira do
context 'when updating the url, api_url, username, or password' do
context 'when updating the integration' do
it 'updates deployment type' do
- integration.update!(url: 'http://first.url')
+ integration.update!(url: 'http://first.url', password: password)
integration.jira_tracker_data.update!(deployment_type: 'server')
expect(integration.jira_tracker_data.deployment_server?).to be_truthy
@@ -376,135 +385,6 @@ RSpec.describe Integrations::Jira do
expect(WebMock).not_to have_requested(:get, /serverInfo/)
end
end
-
- context 'stored password invalidation' do
- context 'when a password was previously set' do
- context 'when only web url present' do
- let(:data_params) do
- {
- url: url, api_url: nil,
- username: username, password: password,
- jira_issue_transition_id: transition_id
- }
- end
-
- it 'resets password if url changed' do
- integration
- integration.url = 'http://jira_edited.example.com'
-
- expect(integration).not_to be_valid
- expect(integration.url).to eq('http://jira_edited.example.com')
- expect(integration.password).to be_nil
- end
-
- it 'does not reset password if url "changed" to the same url as before' do
- integration.url = 'http://jira.example.com'
-
- expect(integration).to be_valid
- expect(integration.url).to eq('http://jira.example.com')
- expect(integration.password).not_to be_nil
- end
-
- it 'resets password if url not changed but api url added' do
- integration.api_url = 'http://jira_edited.example.com/rest/api/2'
-
- expect(integration).not_to be_valid
- expect(integration.api_url).to eq('http://jira_edited.example.com/rest/api/2')
- expect(integration.password).to be_nil
- end
-
- it 'does not reset password if new url is set together with password, even if it\'s the same password' do
- integration.url = 'http://jira_edited.example.com'
- integration.password = password
-
- expect(integration).to be_valid
- expect(integration.password).to eq(password)
- expect(integration.url).to eq('http://jira_edited.example.com')
- end
-
- it 'resets password if url changed, even if setter called multiple times' do
- integration.url = 'http://jira1.example.com/rest/api/2'
- integration.url = 'http://jira1.example.com/rest/api/2'
-
- expect(integration).not_to be_valid
- expect(integration.password).to be_nil
- end
-
- it 'does not reset password if username changed' do
- integration.username = 'some_name'
-
- expect(integration).to be_valid
- expect(integration.password).to eq(password)
- end
-
- it 'does not reset password if password changed' do
- integration.url = 'http://jira_edited.example.com'
- integration.password = 'new_password'
-
- expect(integration).to be_valid
- expect(integration.password).to eq('new_password')
- end
-
- it 'does not reset password if the password is touched and same as before' do
- integration.url = 'http://jira_edited.example.com'
- integration.password = password
-
- expect(integration).to be_valid
- expect(integration.password).to eq(password)
- end
- end
-
- context 'when both web and api url present' do
- let(:data_params) do
- {
- url: url, api_url: 'http://jira.example.com/rest/api/2',
- username: username, password: password,
- jira_issue_transition_id: transition_id
- }
- end
-
- it 'resets password if api url changed' do
- integration.api_url = 'http://jira_edited.example.com/rest/api/2'
-
- expect(integration).not_to be_valid
- expect(integration.password).to be_nil
- end
-
- it 'does not reset password if url changed' do
- integration.url = 'http://jira_edited.example.com'
-
- expect(integration).to be_valid
- expect(integration.password).to eq(password)
- end
-
- it 'resets password if api url set to empty' do
- integration.api_url = ''
-
- expect(integration).not_to be_valid
- expect(integration.password).to be_nil
- end
- end
- end
-
- context 'when no password was previously set' do
- let(:data_params) do
- {
- url: url, username: username
- }
- end
-
- it 'saves password if new url is set together with password' do
- integration.url = 'http://jira_edited.example.com/rest/api/2'
- integration.password = 'password'
- integration.save!
-
- expect(integration.reload).to have_attributes(
- url: 'http://jira_edited.example.com/rest/api/2',
- password: 'password'
- )
- end
- end
- end
end
end
@@ -539,8 +419,7 @@ RSpec.describe Integrations::Jira do
end
describe '#client' do
- it 'uses the default GitLab::HTTP timeouts' do
- timeouts = Gitlab::HTTP::DEFAULT_TIMEOUT_OPTIONS
+ subject do
stub_request(:get, 'http://jira.example.com/foo')
expect(Gitlab::HTTP).to receive(:httparty_perform_request)
@@ -548,6 +427,32 @@ RSpec.describe Integrations::Jira do
jira_integration.client.get('/foo')
end
+
+ context 'when the FF :jira_raise_timeouts is enabled' do
+ let(:timeouts) do
+ {
+ open_timeout: 2.minutes,
+ read_timeout: 2.minutes,
+ write_timeout: 2.minutes
+ }
+ end
+
+ it 'uses custom timeouts' do
+ subject
+ end
+ end
+
+ context 'when the FF :jira_raise_timeouts is disabled' do
+ before do
+ stub_feature_flags(jira_raise_timeouts: false)
+ end
+
+ let(:timeouts) { Gitlab::HTTP::DEFAULT_TIMEOUT_OPTIONS }
+
+ it 'uses the default GitLab::HTTP timeouts' do
+ subject
+ end
+ end
end
describe '#find_issue' do
@@ -746,17 +651,14 @@ RSpec.describe Integrations::Jira do
end
it 'logs exception when transition id is not valid' do
- allow(jira_integration).to receive(:log_error)
+ allow(jira_integration).to receive(:log_exception)
WebMock.stub_request(:post, transitions_url).with(basic_auth: %w(jira-username jira-password)).and_raise("Bad Request")
close_issue
- expect(jira_integration).to have_received(:log_error).with(
- "Issue transition failed",
- error: hash_including(
- exception_class: 'StandardError',
- exception_message: "Bad Request"
- ),
+ expect(jira_integration).to have_received(:log_exception).with(
+ kind_of(StandardError),
+ message: 'Issue transition failed',
client_url: "http://jira.example.com"
)
end
@@ -1054,12 +956,10 @@ RSpec.describe Integrations::Jira do
WebMock.stub_request(:get, test_url).with(basic_auth: [username, password])
.to_raise(JIRA::HTTPError.new(double(message: error_message)))
- expect(jira_integration).to receive(:log_error).with(
- 'Error sending message',
- client_url: 'http://jira.example.com',
- 'exception.class' => anything,
- 'exception.message' => error_message,
- 'exception.backtrace' => anything
+ expect(jira_integration).to receive(:log_exception).with(
+ kind_of(JIRA::HTTPError),
+ message: 'Error sending message',
+ client_url: 'http://jira.example.com'
)
expect(jira_integration.test(nil)).to eq(success: false, result: error_message)
diff --git a/spec/models/integrations/microsoft_teams_spec.rb b/spec/models/integrations/microsoft_teams_spec.rb
index 06b285a855c..af6c142525c 100644
--- a/spec/models/integrations/microsoft_teams_spec.rb
+++ b/spec/models/integrations/microsoft_teams_spec.rb
@@ -123,7 +123,7 @@ RSpec.describe Integrations::MicrosoftTeams do
{
title: "Awesome wiki_page",
content: "Some text describing some thing or another",
- format: "md",
+ format: :markdown,
message: "user created page: Awesome wiki_page"
}
end
diff --git a/spec/models/integrations/prometheus_spec.rb b/spec/models/integrations/prometheus_spec.rb
index 76e20f20a00..a7495cb9574 100644
--- a/spec/models/integrations/prometheus_spec.rb
+++ b/spec/models/integrations/prometheus_spec.rb
@@ -122,34 +122,6 @@ RSpec.describe Integrations::Prometheus, :use_clean_rails_memory_store_caching,
end
end
- describe 'callbacks' do
- context 'after_create' do
- let(:project) { create(:project) }
- let(:integration) { build(:prometheus_integration, project: project) }
-
- subject(:create_integration) { integration.save! }
-
- it 'creates default alerts' do
- expect(Prometheus::CreateDefaultAlertsWorker)
- .to receive(:perform_async)
- .with(project.id)
-
- create_integration
- end
-
- context 'no project exists' do
- let(:integration) { build(:prometheus_integration, :instance) }
-
- it 'does not create default alerts' do
- expect(Prometheus::CreateDefaultAlertsWorker)
- .not_to receive(:perform_async)
-
- create_integration
- end
- end
- end
- end
-
describe '#test' do
before do
integration.manual_configuration = true
diff --git a/spec/models/integrations/teamcity_spec.rb b/spec/models/integrations/teamcity_spec.rb
index e1f4e577503..046476225a6 100644
--- a/spec/models/integrations/teamcity_spec.rb
+++ b/spec/models/integrations/teamcity_spec.rb
@@ -210,7 +210,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
- .with(instance_of(Errno::ECONNREFUSED), project_id: project.id)
+ .with(instance_of(Errno::ECONNREFUSED), { project_id: project.id })
is_expected.to eq(teamcity_url)
end
@@ -260,7 +260,7 @@ RSpec.describe Integrations::Teamcity, :use_clean_rails_memory_store_caching do
expect(Gitlab::ErrorTracking)
.to receive(:log_exception)
- .with(instance_of(Errno::ECONNREFUSED), project_id: project.id)
+ .with(instance_of(Errno::ECONNREFUSED), { project_id: project.id })
is_expected.to eq(:error)
end
diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb
index bd75d95080f..c77c0a5504a 100644
--- a/spec/models/issue_spec.rb
+++ b/spec/models/issue_spec.rb
@@ -37,6 +37,7 @@ RSpec.describe Issue do
it { is_expected.to have_one(:incident_management_issuable_escalation_status) }
it { is_expected.to have_many(:issue_customer_relations_contacts) }
it { is_expected.to have_many(:customer_relations_contacts) }
+ it { is_expected.to have_many(:incident_management_timeline_events) }
describe 'versions.most_recent' do
it 'returns the most recent version' do
@@ -1257,23 +1258,11 @@ RSpec.describe Issue do
end
describe '.public_only' do
- let_it_be(:banned_user) { create(:user, :banned) }
- let_it_be(:public_issue) { create(:issue, project: reusable_project) }
- let_it_be(:confidential_issue) { create(:issue, project: reusable_project, confidential: true) }
- let_it_be(:hidden_issue) { create(:issue, project: reusable_project, author: banned_user) }
-
it 'only returns public issues' do
- expect(described_class.public_only).to eq([public_issue])
- end
-
- context 'when feature flag is disabled' do
- before do
- stub_feature_flags(ban_user_feature_flag: false)
- end
+ public_issue = create(:issue, project: reusable_project)
+ create(:issue, project: reusable_project, confidential: true)
- it 'returns public and hidden issues' do
- expect(described_class.public_only).to contain_exactly(public_issue, hidden_issue)
- end
+ expect(described_class.public_only).to eq([public_issue])
end
end
diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb
index e1135aa440b..225c9714187 100644
--- a/spec/models/key_spec.rb
+++ b/spec/models/key_spec.rb
@@ -102,15 +102,15 @@ RSpec.describe Key, :mailer do
context 'expiration scopes' do
let_it_be(:user) { create(:user) }
- let_it_be(:expired_today_not_notified) { create(:key, expires_at: Time.current, user: user) }
- let_it_be(:expired_today_already_notified) { create(:key, expires_at: Time.current, user: user, expiry_notification_delivered_at: Time.current) }
- let_it_be(:expired_yesterday) { create(:key, expires_at: 1.day.ago, user: user) }
+ let_it_be(:expired_today_not_notified) { create(:key, :expired_today, user: user) }
+ let_it_be(:expired_today_already_notified) { create(:key, :expired_today, user: user, expiry_notification_delivered_at: Time.current) }
+ let_it_be(:expired_yesterday) { create(:key, :expired, user: user) }
let_it_be(:expiring_soon_unotified) { create(:key, expires_at: 3.days.from_now, user: user) }
let_it_be(:expiring_soon_notified) { create(:key, expires_at: 4.days.from_now, user: user, before_expiry_notification_delivered_at: Time.current) }
let_it_be(:future_expiry) { create(:key, expires_at: 1.month.from_now, user: user) }
describe '.expired_today_and_not_notified' do
- it 'returns keys that expire today and in the past' do
+ it 'returns keys that expire today and have not been notified' do
expect(described_class.expired_today_and_not_notified).to contain_exactly(expired_today_not_notified)
end
end
@@ -126,32 +126,22 @@ RSpec.describe Key, :mailer do
context 'validation of uniqueness (based on fingerprint uniqueness)' do
let(:user) { create(:user) }
- shared_examples 'fingerprint uniqueness' do
- it 'accepts the key once' do
- expect(build(:rsa_key_4096, user: user)).to be_valid
- end
-
- it 'does not accept the exact same key twice' do
- first_key = create(:rsa_key_4096, user: user)
-
- expect(build(:key, user: user, key: first_key.key)).not_to be_valid
- end
+ it 'accepts the key once' do
+ expect(build(:rsa_key_4096, user: user)).to be_valid
+ end
- it 'does not accept a duplicate key with a different comment' do
- first_key = create(:rsa_key_4096, user: user)
- duplicate = build(:key, user: user, key: first_key.key)
- duplicate.key << ' extra comment'
+ it 'does not accept the exact same key twice' do
+ first_key = create(:rsa_key_4096, user: user)
- expect(duplicate).not_to be_valid
- end
+ expect(build(:key, user: user, key: first_key.key)).not_to be_valid
end
- context 'with FIPS mode off' do
- it_behaves_like 'fingerprint uniqueness'
- end
+ it 'does not accept a duplicate key with a different comment' do
+ first_key = create(:rsa_key_4096, user: user)
+ duplicate = build(:key, user: user, key: first_key.key)
+ duplicate.key << ' extra comment'
- context 'with FIPS mode', :fips_mode do
- it_behaves_like 'fingerprint uniqueness'
+ expect(duplicate).not_to be_valid
end
end
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 4ab17ee1e6d..286167c918f 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -383,6 +383,75 @@ RSpec.describe Member do
end
end
+ describe '.by_access_level' do
+ subject { described_class.by_access_level(access_levels) }
+
+ context 'by owner' do
+ let(:access_levels) { [Gitlab::Access::OWNER] }
+
+ it { is_expected.to include @owner }
+ it { is_expected.not_to include @maintainer }
+ it { is_expected.not_to include @invited_member }
+ it { is_expected.not_to include @accepted_invite_member }
+ it { is_expected.not_to include @requested_member }
+ it { is_expected.not_to include @accepted_requested_member }
+ it { is_expected.not_to include @blocked_maintainer }
+ it { is_expected.not_to include @blocked_developer }
+ end
+
+ context 'by maintainer' do
+ let(:access_levels) { [Gitlab::Access::MAINTAINER] }
+
+ it { is_expected.not_to include @owner }
+ it { is_expected.to include @maintainer }
+ it { is_expected.not_to include @invited_member }
+ it { is_expected.not_to include @accepted_invite_member }
+ it { is_expected.not_to include @requested_member }
+ it { is_expected.not_to include @accepted_requested_member }
+ it { is_expected.not_to include @blocked_maintainer }
+ it { is_expected.not_to include @blocked_developer }
+ end
+
+ context 'by developer' do
+ let(:access_levels) { [Gitlab::Access::DEVELOPER] }
+
+ it { is_expected.not_to include @owner }
+ it { is_expected.not_to include @maintainer }
+ it { is_expected.to include @invited_member }
+ it { is_expected.to include @accepted_invite_member }
+ it { is_expected.not_to include @requested_member }
+ it { is_expected.not_to include @accepted_requested_member }
+ it { is_expected.not_to include @blocked_maintainer }
+ it { is_expected.not_to include @blocked_developer }
+ end
+
+ context 'by owner and maintainer' do
+ let(:access_levels) { [Gitlab::Access::OWNER, Gitlab::Access::MAINTAINER] }
+
+ it { is_expected.to include @owner }
+ it { is_expected.to include @maintainer }
+ it { is_expected.not_to include @invited_member }
+ it { is_expected.not_to include @accepted_invite_member }
+ it { is_expected.not_to include @requested_member }
+ it { is_expected.not_to include @accepted_requested_member }
+ it { is_expected.not_to include @blocked_maintainer }
+ it { is_expected.not_to include @blocked_developer }
+ end
+
+ context 'by owner, maintainer and developer' do
+ let(:access_levels) { [Gitlab::Access::OWNER, Gitlab::Access::MAINTAINER, Gitlab::Access::DEVELOPER] }
+
+ it { is_expected.to include @owner }
+ it { is_expected.to include @maintainer }
+ it { is_expected.to include @invited_member }
+ it { is_expected.to include @accepted_invite_member }
+ it { is_expected.not_to include @requested_member }
+ it { is_expected.not_to include @accepted_requested_member }
+ it { is_expected.not_to include @blocked_maintainer }
+ it { is_expected.not_to include @blocked_developer }
+ end
+ end
+
describe '.developers' do
subject { described_class.developers.to_a }
@@ -582,6 +651,15 @@ RSpec.describe Member do
expect(project.members.active_state).not_to include awaiting_project_member
end
end
+
+ describe '.excluding_users' do
+ let_it_be(:active_group_member) { create(:group_member, group: group) }
+
+ it 'excludes members with given user ids' do
+ expect(group.members.excluding_users([])).to include active_group_member
+ expect(group.members.excluding_users(active_group_member.user_id)).not_to include active_group_member
+ end
+ end
end
describe 'Delegate methods' do
diff --git a/spec/models/merge_request/metrics_spec.rb b/spec/models/merge_request/metrics_spec.rb
index a4bdac39074..8d1d503b323 100644
--- a/spec/models/merge_request/metrics_spec.rb
+++ b/spec/models/merge_request/metrics_spec.rb
@@ -54,4 +54,43 @@ RSpec.describe MergeRequest::Metrics do
let!(:parent) { create(:ci_pipeline, project: merge_request.target_project) }
let!(:model) { merge_request.metrics.tap { |metrics| metrics.update!(pipeline: parent) } }
end
+
+ describe 'update' do
+ let(:merge_request) { create(:merge_request) }
+ let(:metrics) { merge_request.metrics }
+
+ before do
+ metrics.update!(
+ pipeline_id: 1,
+ latest_build_started_at: Time.current,
+ latest_build_finished_at: Time.current
+ )
+ end
+
+ context 'when pipeline_id is nullified' do
+ before do
+ metrics.update!(pipeline_id: nil)
+ end
+
+ it 'nullifies build related columns via DB trigger' do
+ metrics.reload
+
+ expect(metrics.latest_build_started_at).to be_nil
+ expect(metrics.latest_build_finished_at).to be_nil
+ end
+ end
+
+ context 'when updated but pipeline_id is not nullified' do
+ before do
+ metrics.update!(latest_closed_at: Time.current)
+ end
+
+ it 'does not nullify build related columns' do
+ metrics.reload
+
+ expect(metrics.latest_build_started_at).not_to be_nil
+ expect(metrics.latest_build_finished_at).not_to be_nil
+ end
+ end
+ end
end
diff --git a/spec/models/merge_request_assignee_spec.rb b/spec/models/merge_request_assignee_spec.rb
index 1591c517049..387d17d7823 100644
--- a/spec/models/merge_request_assignee_spec.rb
+++ b/spec/models/merge_request_assignee_spec.rb
@@ -41,22 +41,11 @@ RSpec.describe MergeRequestAssignee do
it_behaves_like 'having unique enum values'
- it_behaves_like 'having reviewer state'
-
- describe 'syncs to reviewer state' do
- before do
- reviewer = merge_request.merge_request_reviewers.build(reviewer: assignee)
- reviewer.update!(state: :reviewed)
- end
-
- it { is_expected.to have_attributes(state: 'reviewed') }
- end
-
describe '#attention_requested_by' do
let(:current_user) { create(:user) }
before do
- subject.update!(updated_state_by: current_user)
+ subject.update!(updated_state_by: current_user, state: :attention_requested)
end
context 'attention requested' do
diff --git a/spec/models/merge_request_reviewer_spec.rb b/spec/models/merge_request_reviewer_spec.rb
index dd00c4d8627..4df2dba3a7d 100644
--- a/spec/models/merge_request_reviewer_spec.rb
+++ b/spec/models/merge_request_reviewer_spec.rb
@@ -10,17 +10,6 @@ RSpec.describe MergeRequestReviewer do
it_behaves_like 'having unique enum values'
- it_behaves_like 'having reviewer state'
-
- describe 'syncs to assignee state' do
- before do
- assignee = merge_request.merge_request_assignees.build(assignee: reviewer)
- assignee.update!(state: :reviewed)
- end
-
- it { is_expected.to have_attributes(state: 'reviewed') }
- end
-
describe 'associations' do
it { is_expected.to belong_to(:merge_request).class_name('MergeRequest') }
it { is_expected.to belong_to(:reviewer).class_name('User').inverse_of(:merge_request_reviewers) }
@@ -30,7 +19,7 @@ RSpec.describe MergeRequestReviewer do
let(:current_user) { create(:user) }
before do
- subject.update!(updated_state_by: current_user)
+ subject.update!(updated_state_by: current_user, state: :attention_requested)
end
context 'attention requested' do
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 8545c7bc6c7..d40c78b5b60 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -151,6 +151,8 @@ RSpec.describe MergeRequest, factory_default: :keep do
before do
assignee = merge_request6.find_assignee(user2)
assignee.update!(state: :reviewed)
+ merge_request2.find_reviewer(user2).update!(state: :attention_requested)
+ merge_request5.find_assignee(user2).update!(state: :attention_requested)
end
it 'returns MRs that have any attention requests' do
@@ -3538,50 +3540,6 @@ RSpec.describe MergeRequest, factory_default: :keep do
end
end
- describe "#legacy_environments" do
- subject { merge_request.legacy_environments }
-
- let(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master') }
- let(:project) { merge_request.project }
-
- let(:pipeline) do
- create(:ci_pipeline,
- source: :merge_request_event,
- merge_request: merge_request, project: project,
- sha: merge_request.diff_head_sha,
- merge_requests_as_head_pipeline: [merge_request])
- end
-
- let!(:job) { create(:ci_build, :with_deployment, :start_review_app, pipeline: pipeline, project: project) }
-
- it 'returns environments' do
- is_expected.to eq(pipeline.environments_in_self_and_descendants.to_a)
- expect(subject.count).to be(1)
- end
-
- context 'when pipeline is not associated with environments' do
- let!(:job) { create(:ci_build, pipeline: pipeline, project: project) }
-
- it 'returns empty array' do
- is_expected.to be_empty
- end
- end
-
- context 'when pipeline is not a pipeline for merge request' do
- let(:pipeline) do
- create(:ci_pipeline,
- project: project,
- ref: 'feature',
- sha: merge_request.diff_head_sha,
- merge_requests_as_head_pipeline: [merge_request])
- end
-
- it 'returns empty relation' do
- is_expected.to be_empty
- end
- end
- end
-
describe "#reload_diff" do
it 'calls MergeRequests::ReloadDiffsService#execute with correct params' do
user = create(:user)
diff --git a/spec/models/namespace_ci_cd_setting_spec.rb b/spec/models/namespace_ci_cd_setting_spec.rb
new file mode 100644
index 00000000000..9031d45221a
--- /dev/null
+++ b/spec/models/namespace_ci_cd_setting_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe NamespaceCiCdSetting do
+ describe "associations" do
+ it { is_expected.to belong_to(:namespace).inverse_of(:ci_cd_settings) }
+ end
+end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 09ac15429a5..4373d9a0b24 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -32,6 +32,10 @@ RSpec.describe Namespace do
it { is_expected.to have_one :namespace_route }
it { is_expected.to have_many :namespace_members }
+ it do
+ is_expected.to have_one(:ci_cd_settings).class_name('NamespaceCiCdSetting').inverse_of(:namespace).autosave(true)
+ end
+
describe '#children' do
let_it_be(:group) { create(:group) }
let_it_be(:subgroup) { create(:group, parent: group) }
@@ -334,6 +338,15 @@ RSpec.describe Namespace do
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 do
+ is_expected.to delegate_method(:prevent_sharing_groups_outside_hierarchy=)
+ .to(:namespace_settings).with_arguments(allow_nil: true)
+ end
end
describe "Respond to" do
@@ -2236,4 +2249,40 @@ RSpec.describe Namespace do
it_behaves_like 'blocks unsafe serialization'
end
+
+ describe '#certificate_based_clusters_enabled?' do
+ it 'does not call Feature.enabled? twice with request_store', :request_store do
+ expect(Feature).to receive(:enabled?).once
+
+ namespace.certificate_based_clusters_enabled?
+ namespace.certificate_based_clusters_enabled?
+ end
+
+ it 'call Feature.enabled? twice without request_store' do
+ expect(Feature).to receive(:enabled?).twice
+
+ namespace.certificate_based_clusters_enabled?
+ namespace.certificate_based_clusters_enabled?
+ end
+
+ context 'with ff disabled' do
+ before do
+ stub_feature_flags(certificate_based_clusters: false)
+ end
+
+ it 'is truthy' do
+ expect(namespace.certificate_based_clusters_enabled?).to be_falsy
+ end
+ end
+
+ context 'with ff enabled' do
+ before do
+ stub_feature_flags(certificate_based_clusters: true)
+ end
+
+ it 'is truthy' do
+ expect(namespace.certificate_based_clusters_enabled?).to be_truthy
+ end
+ end
+ end
end
diff --git a/spec/models/packages/cleanup/policy_spec.rb b/spec/models/packages/cleanup/policy_spec.rb
new file mode 100644
index 00000000000..972071aa0ad
--- /dev/null
+++ b/spec/models/packages/cleanup/policy_spec.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Packages::Cleanup::Policy, type: :model do
+ describe 'relationships' do
+ it { is_expected.to belong_to(:project) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to validate_presence_of(:project) }
+ it do
+ is_expected
+ .to validate_inclusion_of(:keep_n_duplicated_package_files)
+ .in_array(described_class::KEEP_N_DUPLICATED_PACKAGE_FILES_VALUES)
+ .with_message('keep_n_duplicated_package_files is invalid')
+ end
+ end
+
+ describe '.active' do
+ let_it_be(:active_policy) { create(:packages_cleanup_policy) }
+ let_it_be(:inactive_policy) { create(:packages_cleanup_policy, keep_n_duplicated_package_files: 'all') }
+
+ subject { described_class.active }
+
+ it { is_expected.to contain_exactly(active_policy) }
+ end
+end
diff --git a/spec/models/packages/package_spec.rb b/spec/models/packages/package_spec.rb
index 6c86db1197f..a9ed811e77d 100644
--- a/spec/models/packages/package_spec.rb
+++ b/spec/models/packages/package_spec.rb
@@ -1182,7 +1182,7 @@ RSpec.describe Packages::Package, type: :model do
it "plan_limits includes column #{plan_limit_name}" do
expect { package.project.actual_limits.send(plan_limit_name) }
- .not_to raise_error(NoMethodError)
+ .not_to raise_error
end
end
end
diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb
index 2ebc9864d9b..7fde8d63947 100644
--- a/spec/models/pages_domain_spec.rb
+++ b/spec/models/pages_domain_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe PagesDomain do
'0123123' => true,
'a-reserved.com' => true,
'a.b-reserved.com' => true,
- 'reserved.com' => false,
+ 'reserved.com' => true,
'_foo.com' => false,
'a.reserved.com' => false,
'a.b.reserved.com' => false,
diff --git a/spec/models/performance_monitoring/prometheus_dashboard_spec.rb b/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
index 634690d5d0b..ee2407f21b6 100644
--- a/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
+++ b/spec/models/performance_monitoring/prometheus_dashboard_spec.rb
@@ -185,7 +185,7 @@ RSpec.describe PerformanceMonitoring::PrometheusDashboard do
context 'dashboard has been found' do
it 'uses dashboard finder to find and load dashboard data and returns dashboard instance', :aggregate_failures do
- expect(Gitlab::Metrics::Dashboard::Finder).to receive(:find).with(project, user, environment: environment, dashboard_path: path).and_return(status: :success, dashboard: json_content)
+ expect(Gitlab::Metrics::Dashboard::Finder).to receive(:find).with(project, user, { environment: environment, dashboard_path: path }).and_return(status: :success, dashboard: json_content)
dashboard_instance = described_class.find_for(project: project, user: user, path: path, options: { environment: environment })
diff --git a/spec/models/personal_access_token_spec.rb b/spec/models/personal_access_token_spec.rb
index 125ac7fb102..69866d497a1 100644
--- a/spec/models/personal_access_token_spec.rb
+++ b/spec/models/personal_access_token_spec.rb
@@ -94,14 +94,6 @@ RSpec.describe PersonalAccessToken do
end
end
- describe '#expired_but_not_enforced?' do
- let(:token) { build(:personal_access_token) }
-
- it 'returns false', :aggregate_failures do
- expect(token).not_to be_expired_but_not_enforced
- end
- end
-
describe 'Redis storage' do
let(:user_id) { 123 }
let(:token) { 'KS3wegQYXBLYhQsciwsj' }
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 16e699b7e0e..eefe5bfc6c4 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
@@ -9,29 +9,47 @@ RSpec.describe Preloaders::UserMaxAccessLevelInProjectsPreloader do
let_it_be(:project_3) { create(:project) }
let(:projects) { [project_1, project_2, project_3] }
+ let(:query) { projects.each { |project| user.can?(:read_project, project) } }
before do
project_1.add_developer(user)
project_2.add_developer(user)
end
- context 'preload maximum access level to avoid querying project_authorizations', :request_store do
- it 'avoids N+1 queries', :request_store do
- Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects, user).execute
+ context 'without preloader' do
+ it 'runs N queries' do
+ expect { query }.to make_queries(projects.size)
+ end
+ end
+
+ describe '#execute', :request_store do
+ let(:projects_arg) { projects }
+
+ before do
+ Preloaders::UserMaxAccessLevelInProjectsPreloader.new(projects_arg, user).execute
+ end
+
+ it 'avoids N+1 queries' do
+ expect { query }.not_to make_queries
+ end
- query_count = ActiveRecord::QueryRecorder.new do
- projects.each { |project| user.can?(:read_project, project) }
- end.count
+ context 'when projects is an array of IDs' do
+ let(:projects_arg) { [project_1.id, project_2.id, project_3.id] }
- expect(query_count).to eq(0)
+ it 'avoids N+1 queries' do
+ expect { query }.not_to make_queries
+ end
end
- it 'runs N queries without preloading' do
- query_count = ActiveRecord::QueryRecorder.new do
- projects.each { |project| user.can?(:read_project, project) }
- end.count
+ # Test for handling of SQL table name clashes.
+ context 'when projects is a relation including project_authorizations' do
+ let(:projects_arg) do
+ Project.where(id: ProjectAuthorization.where(project_id: projects).select(:project_id))
+ end
- expect(query_count).to eq(projects.size)
+ it 'avoids N+1 queries' do
+ expect { query }.not_to make_queries
+ end
end
end
end
diff --git a/spec/models/project_import_state_spec.rb b/spec/models/project_import_state_spec.rb
index 42ca8130734..f6e398bd23c 100644
--- a/spec/models/project_import_state_spec.rb
+++ b/spec/models/project_import_state_spec.rb
@@ -65,9 +65,11 @@ RSpec.describe ProjectImportState, type: :model do
expect_next_instance_of(Gitlab::Import::Logger) do |logger|
expect(logger).to receive(:error).with(
- error: 'ActiveRecord::ActiveRecordError',
- message: 'Error setting import status to failed',
- original_error: error_message
+ {
+ error: 'ActiveRecord::ActiveRecordError',
+ message: 'Error setting import status to failed',
+ original_error: error_message
+ }
)
end
@@ -131,20 +133,6 @@ RSpec.describe ProjectImportState, type: :model do
describe 'import state transitions' do
context 'state transition: [:started] => [:finished]' do
- let(:after_import_service) { spy(:after_import_service) }
- let(:housekeeping_service) { spy(:housekeeping_service) }
-
- before do
- allow(Projects::AfterImportService)
- .to receive(:new) { after_import_service }
-
- allow(after_import_service)
- .to receive(:execute) { housekeeping_service.execute }
-
- allow(Repositories::HousekeepingService)
- .to receive(:new) { housekeeping_service }
- end
-
it 'resets last_error' do
error_message = 'Some error'
import_state = create(:import_state, :started, last_error: error_message)
@@ -152,29 +140,28 @@ RSpec.describe ProjectImportState, type: :model do
expect { import_state.finish }.to change { import_state.last_error }.from(error_message).to(nil)
end
- it 'performs housekeeping when an import of a fresh project is completed' do
+ it 'enqueues housekeeping when an import of a fresh project is completed' do
project = create(:project_empty_repo, :import_started, import_type: :github)
- project.import_state.finish
+ expect(Projects::AfterImportWorker).to receive(:perform_async).with(project.id)
- expect(after_import_service).to have_received(:execute)
- expect(housekeeping_service).to have_received(:execute)
+ project.import_state.finish
end
it 'does not perform housekeeping when project repository does not exist' do
project = create(:project, :import_started, import_type: :github)
- project.import_state.finish
+ expect(Projects::AfterImportWorker).not_to receive(:perform_async)
- expect(housekeeping_service).not_to have_received(:execute)
+ project.import_state.finish
end
- it 'does not perform housekeeping when project does not have a valid import type' do
+ it 'does not qneueue housekeeping when project does not have a valid import type' do
project = create(:project, :import_started, import_type: nil)
- project.import_state.finish
+ expect(Projects::AfterImportWorker).not_to receive(:perform_async)
- expect(housekeeping_service).not_to have_received(:execute)
+ project.import_state.finish
end
end
end
diff --git a/spec/models/project_setting_spec.rb b/spec/models/project_setting_spec.rb
index d03eb3c8bfe..867ad843406 100644
--- a/spec/models/project_setting_spec.rb
+++ b/spec/models/project_setting_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe ProjectSetting, type: :model do
+ using RSpec::Parameterized::TableSyntax
it { is_expected.to belong_to(:project) }
describe 'validations' do
@@ -27,6 +28,23 @@ RSpec.describe ProjectSetting, type: :model do
end
end
+ describe '#human_squash_option' do
+ where(:squash_option, :human_squash_option) do
+ 'never' | 'Do not allow'
+ 'always' | 'Require'
+ 'default_on' | 'Encourage'
+ 'default_off' | 'Allow'
+ end
+
+ with_them do
+ let(:project_setting) { create(:project_setting, squash_option: ProjectSetting.squash_options[squash_option]) }
+
+ subject { project_setting.human_squash_option }
+
+ it { is_expected.to eq(human_squash_option) }
+ end
+ end
+
def valid_target_platform_combinations
target_platforms = described_class::ALLOWED_TARGET_PLATFORMS
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 0bb584845c2..ed5b3d4e0be 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -8,6 +8,7 @@ RSpec.describe Project, factory_default: :keep do
include ExternalAuthorizationServiceHelpers
include ReloadHelpers
include StubGitlabCalls
+ include ProjectHelpers
using RSpec::Parameterized::TableSyntax
let_it_be(:namespace) { create_default(:namespace).freeze }
@@ -135,10 +136,10 @@ RSpec.describe Project, factory_default: :keep do
it { is_expected.to have_many(:packages).class_name('Packages::Package') }
it { is_expected.to have_many(:package_files).class_name('Packages::PackageFile') }
it { is_expected.to have_many(:debian_distributions).class_name('Packages::Debian::ProjectDistribution').dependent(:destroy) }
+ it { is_expected.to have_one(:packages_cleanup_policy).class_name('Packages::Cleanup::Policy').inverse_of(:project) }
it { is_expected.to have_many(:pipeline_artifacts).dependent(:restrict_with_error) }
it { is_expected.to have_many(:terraform_states).class_name('Terraform::State').inverse_of(:project) }
it { is_expected.to have_many(:timelogs) }
- it { is_expected.to have_many(:error_tracking_errors).class_name('ErrorTracking::Error') }
it { is_expected.to have_many(:error_tracking_client_keys).class_name('ErrorTracking::ClientKey') }
it { is_expected.to have_many(:pending_builds).class_name('Ci::PendingBuild') }
it { is_expected.to have_many(:ci_feature_usages).class_name('Projects::CiFeatureUsage') }
@@ -832,6 +833,7 @@ RSpec.describe Project, factory_default: :keep do
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(:container_registry_enabled?).to(:project_feature) }
it { is_expected.to delegate_method(:container_registry_access_level).to(:project_feature) }
@@ -844,6 +846,9 @@ RSpec.describe Project, factory_default: :keep do
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) }
end
@@ -2025,7 +2030,7 @@ RSpec.describe Project, factory_default: :keep do
it 'returns nil if the path detection throws an error' do
expect(Rails.application.routes).to receive(:recognize_path).with(url) { raise ActionController::RoutingError, 'test' }
- expect { subject }.not_to raise_error(ActionController::RoutingError)
+ expect { subject }.not_to raise_error
expect(subject).to be_nil
end
end
@@ -7153,11 +7158,33 @@ RSpec.describe Project, factory_default: :keep do
end
describe '#add_export_job' do
- context 'if not already present' do
- it 'starts project export job' do
- user = create(:user)
- project = build(:project)
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+
+ context 'when project storage_size does not exceed the application setting max_export_size' do
+ it 'starts project export worker' do
+ stub_application_setting(max_export_size: 1)
+ allow(project.statistics).to receive(:storage_size).and_return(0.megabytes)
+
+ expect(ProjectExportWorker).to receive(:perform_async).with(user.id, project.id, nil, {})
+
+ project.add_export_job(current_user: user)
+ end
+ end
+
+ context 'when project storage_size exceeds the application setting max_export_size' do
+ it 'raises Project::ExportLimitExceeded' do
+ stub_application_setting(max_export_size: 1)
+ allow(project.statistics).to receive(:storage_size).and_return(2.megabytes)
+ expect(ProjectExportWorker).not_to receive(:perform_async).with(user.id, project.id, nil, {})
+ expect { project.add_export_job(current_user: user) }.to raise_error(Project::ExportLimitExceeded)
+ end
+ end
+
+ context 'when application setting max_export_size is not set' do
+ it 'starts project export worker' do
+ allow(project.statistics).to receive(:storage_size).and_return(2.megabytes)
expect(ProjectExportWorker).to receive(:perform_async).with(user.id, project.id, nil, {})
project.add_export_job(current_user: user)
@@ -8241,6 +8268,28 @@ RSpec.describe Project, factory_default: :keep do
it_behaves_like 'returns true if project is inactive'
end
+ describe '.inactive' do
+ before do
+ stub_application_setting(inactive_projects_min_size_mb: 5)
+ stub_application_setting(inactive_projects_send_warning_email_after_months: 12)
+ end
+
+ it 'returns projects that are inactive' do
+ create_project_with_statistics.tap do |project|
+ project.update!(last_activity_at: Time.current)
+ end
+ create_project_with_statistics.tap do |project|
+ project.update!(last_activity_at: 13.months.ago)
+ end
+ inactive_large_project = create_project_with_statistics(with_data: true, size_multiplier: 2.gigabytes)
+ .tap { |project| project.update!(last_activity_at: 2.years.ago) }
+ create_project_with_statistics(with_data: true, size_multiplier: 2.gigabytes)
+ .tap { |project| project.update!(last_activity_at: 1.month.ago) }
+
+ expect(described_class.inactive).to contain_exactly(inactive_large_project)
+ end
+ end
+
private
def finish_job(export_job)
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index 20fc14113ef..2c29d4c42f4 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -36,7 +36,7 @@ RSpec.describe ProjectStatistics do
snippets_size: 1.exabyte,
pipeline_artifacts_size: 512.petabytes - 1,
uploads_size: 512.petabytes,
- container_registry_size: 8.exabytes - 1
+ container_registry_size: 12.petabytes
)
statistics.reload
@@ -50,7 +50,7 @@ RSpec.describe ProjectStatistics do
expect(statistics.snippets_size).to eq(1.exabyte)
expect(statistics.pipeline_artifacts_size).to eq(512.petabytes - 1)
expect(statistics.uploads_size).to eq(512.petabytes)
- expect(statistics.container_registry_size).to eq(8.exabytes - 1)
+ expect(statistics.container_registry_size).to eq(12.petabytes)
end
end
@@ -62,6 +62,7 @@ RSpec.describe ProjectStatistics do
statistics.build_artifacts_size = 4
statistics.snippets_size = 5
statistics.uploads_size = 3
+ statistics.container_registry_size = 8
expect(statistics.total_repository_size).to eq 5
end
@@ -104,6 +105,7 @@ RSpec.describe ProjectStatistics do
allow(statistics).to receive(:update_snippets_size)
allow(statistics).to receive(:update_storage_size)
allow(statistics).to receive(:update_uploads_size)
+ allow(statistics).to receive(:update_container_registry_size)
end
context "without arguments" do
@@ -118,6 +120,7 @@ RSpec.describe ProjectStatistics do
expect(statistics).to have_received(:update_lfs_objects_size)
expect(statistics).to have_received(:update_snippets_size)
expect(statistics).to have_received(:update_uploads_size)
+ expect(statistics).to have_received(:update_container_registry_size)
end
end
@@ -133,6 +136,7 @@ RSpec.describe ProjectStatistics do
expect(statistics).not_to have_received(:update_wiki_size)
expect(statistics).not_to have_received(:update_snippets_size)
expect(statistics).not_to have_received(:update_uploads_size)
+ expect(statistics).not_to have_received(:update_container_registry_size)
end
end
@@ -148,11 +152,13 @@ RSpec.describe ProjectStatistics do
expect(statistics).to have_received(:update_wiki_size)
expect(statistics).to have_received(:update_snippets_size)
expect(statistics).to have_received(:update_uploads_size)
+ expect(statistics).to have_received(:update_container_registry_size)
expect(statistics.repository_size).to eq(0)
expect(statistics.commit_count).to eq(0)
expect(statistics.wiki_size).to eq(0)
expect(statistics.snippets_size).to eq(0)
expect(statistics.uploads_size).to eq(0)
+ expect(statistics.container_registry_size).to eq(0)
end
end
@@ -174,11 +180,13 @@ RSpec.describe ProjectStatistics do
expect(statistics).to have_received(:update_wiki_size)
expect(statistics).to have_received(:update_snippets_size)
expect(statistics).to have_received(:update_uploads_size)
+ expect(statistics).to have_received(:update_container_registry_size)
expect(statistics.repository_size).to eq(0)
expect(statistics.commit_count).to eq(0)
expect(statistics.wiki_size).to eq(0)
expect(statistics.snippets_size).to eq(0)
expect(statistics.uploads_size).to eq(0)
+ expect(statistics.container_registry_size).to eq(0)
end
end
@@ -224,6 +232,7 @@ RSpec.describe ProjectStatistics do
expect(statistics).not_to receive(:update_lfs_objects_size)
expect(statistics).not_to receive(:update_snippets_size)
expect(statistics).not_to receive(:update_uploads_size)
+ expect(statistics).not_to receive(:update_container_registry_size)
expect(statistics).not_to receive(:save!)
expect(Namespaces::ScheduleAggregationWorker)
.not_to receive(:perform_async)
@@ -319,8 +328,42 @@ RSpec.describe ProjectStatistics do
end
end
+ describe '#update_container_registry_size' do
+ subject(:update_container_registry_size) { statistics.update_container_registry_size }
+
+ it 'stores the project container registry repositories size' do
+ allow(project).to receive(:container_repositories_size).and_return(10)
+
+ update_container_registry_size
+
+ expect(statistics.container_registry_size).to eq(10)
+ end
+
+ it 'handles nil values for the repositories size' do
+ allow(project).to receive(:container_repositories_size).and_return(nil)
+
+ update_container_registry_size
+
+ expect(statistics.container_registry_size).to eq(0)
+ end
+
+ context 'with container_registry_project_statistics FF disabled' do
+ before do
+ stub_feature_flags(container_registry_project_statistics: false)
+ end
+
+ it 'does not update the container_registry_size' do
+ expect(project).not_to receive(:container_repositories_size)
+
+ update_container_registry_size
+
+ expect(statistics.container_registry_size).to eq(0)
+ end
+ end
+ end
+
describe '#update_storage_size' do
- it "sums all storage counters" do
+ it "sums the relevant storage counters" do
statistics.update!(
repository_size: 2,
wiki_size: 4,
@@ -337,6 +380,18 @@ RSpec.describe ProjectStatistics do
expect(statistics.storage_size).to eq 28
end
+ it 'excludes the container_registry_size' do
+ statistics.update!(
+ repository_size: 2,
+ uploads_size: 5,
+ container_registry_size: 10
+ )
+
+ statistics.reload
+
+ expect(statistics.storage_size).to eq 7
+ end
+
it 'works during wiki_size backfill' do
statistics.update!(
repository_size: 2,
diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb
index 5b11f9d828a..2ddbab7779e 100644
--- a/spec/models/project_team_spec.rb
+++ b/spec/models/project_team_spec.rb
@@ -410,6 +410,22 @@ RSpec.describe ProjectTeam do
end
end
+ describe '#purge_member_access_cache_for_user_id', :request_store do
+ let(:project) { create(:project) }
+ let(:user_id) { 1 }
+ let(:resource_data) { { user_id => 50, 42 => 50 } }
+
+ before do
+ Gitlab::SafeRequestStore[project.max_member_access_for_resource_key(User)] = resource_data
+ end
+
+ it 'removes cached max access for user from store' do
+ project.team.purge_member_access_cache_for_user_id(user_id)
+
+ expect(Gitlab::SafeRequestStore[project.max_member_access_for_resource_key(User)]).to eq({ 42 => 50 })
+ end
+ end
+
describe '#member?' do
let(:group) { create(:group) }
let(:developer) { create(:user) }
diff --git a/spec/models/projects/topic_spec.rb b/spec/models/projects/topic_spec.rb
index 8fc4d11f0d9..fc9d9bef437 100644
--- a/spec/models/projects/topic_spec.rb
+++ b/spec/models/projects/topic_spec.rb
@@ -25,6 +25,8 @@ RSpec.describe Projects::Topic do
it { is_expected.to validate_uniqueness_of(:name).case_insensitive }
it { is_expected.to validate_length_of(:name).is_at_most(255) }
it { is_expected.to validate_length_of(:description).is_at_most(1024) }
+ it { expect(Projects::Topic.new).to validate_presence_of(:title) }
+ it { expect(Projects::Topic.new).to validate_length_of(:title).is_at_most(255) }
end
describe 'scopes' do
@@ -104,4 +106,16 @@ RSpec.describe Projects::Topic do
end
end
end
+
+ describe '#title_or_name' do
+ it 'returns title if set' do
+ topic.title = 'My title'
+ expect(topic.title_or_name).to eq('My title')
+ end
+
+ it 'returns name if title not set' do
+ topic.title = nil
+ expect(topic.title_or_name).to eq('topic')
+ end
+ end
end
diff --git a/spec/models/protected_branch/push_access_level_spec.rb b/spec/models/protected_branch/push_access_level_spec.rb
index 13d33b95b16..008ae6275f0 100644
--- a/spec/models/protected_branch/push_access_level_spec.rb
+++ b/spec/models/protected_branch/push_access_level_spec.rb
@@ -30,7 +30,7 @@ RSpec.describe ProtectedBranch::PushAccessLevel do
it 'checks that a deploy key is enabled for the same project as the protected branch\'s' do
level = build(:protected_branch_push_access_level, deploy_key: create(:deploy_key))
- expect { level.save! }.to raise_error
+ expect { level.save! }.to raise_error(ActiveRecord::RecordInvalid)
expect(level.errors.full_messages).to contain_exactly('Deploy key is not enabled for this project')
end
end
diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb
index f7c723cd134..366de809bed 100644
--- a/spec/models/protected_branch_spec.rb
+++ b/spec/models/protected_branch_spec.rb
@@ -324,4 +324,10 @@ RSpec.describe ProtectedBranch do
.to match_array([branch_id])
end
end
+
+ describe '.downcase_humanized_name' do
+ it 'returns downcase humanized name' do
+ expect(described_class.downcase_humanized_name).to eq 'protected branch'
+ end
+ end
end
diff --git a/spec/models/raw_usage_data_spec.rb b/spec/models/raw_usage_data_spec.rb
index 6ff4c6eb19b..95b98279a27 100644
--- a/spec/models/raw_usage_data_spec.rb
+++ b/spec/models/raw_usage_data_spec.rb
@@ -3,6 +3,31 @@
require 'spec_helper'
RSpec.describe RawUsageData do
+ context 'scopes' do
+ describe '.for_current_reporting_cycle' do
+ subject(:recent_service_ping_reports) { described_class.for_current_reporting_cycle }
+
+ before_all do
+ create(:raw_usage_data, created_at: (described_class::REPORTING_CADENCE + 1.day).ago)
+ end
+
+ it 'returns nil where no records match filter criteria' do
+ expect(recent_service_ping_reports).to be_empty
+ end
+
+ context 'with records matching filtering criteria' do
+ let_it_be(:fresh_record) { create(:raw_usage_data) }
+ let_it_be(:record_at_edge_of_time_range) do
+ create(:raw_usage_data, created_at: described_class::REPORTING_CADENCE.ago)
+ end
+
+ it 'return records within reporting cycle time range ordered by creation time' do
+ expect(recent_service_ping_reports).to eq [fresh_record, record_at_edge_of_time_range]
+ end
+ end
+ end
+ end
+
describe 'validations' do
it { is_expected.to validate_presence_of(:payload) }
it { is_expected.to validate_presence_of(:recorded_at) }
diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb
index 125fec61d72..4ae1927dcca 100644
--- a/spec/models/release_spec.rb
+++ b/spec/models/release_spec.rb
@@ -53,7 +53,10 @@ RSpec.describe Release do
context 'when a release is tied to a milestone for another project' do
it 'creates a validation error' do
milestone = build(:milestone, project: create(:project))
- expect { release.milestones << milestone }.to raise_error
+
+ expect { release.milestones << milestone }
+ .to raise_error(ActiveRecord::RecordInvalid,
+ 'Validation failed: Release does not have the same project as the milestone')
end
end
diff --git a/spec/models/shard_spec.rb b/spec/models/shard_spec.rb
index 38729fa1758..298441fb4c4 100644
--- a/spec/models/shard_spec.rb
+++ b/spec/models/shard_spec.rb
@@ -38,12 +38,12 @@ RSpec.describe Shard do
expect(described_class)
.to receive(:find_by)
- .with(name: 'new_shard')
+ .with({ name: 'new_shard' })
.and_return(nil, shard_created_by_others)
expect(described_class)
.to receive(:create)
- .with(name: 'new_shard')
+ .with({ name: 'new_shard' })
.and_raise(ActiveRecord::RecordNotUnique, 'fail')
.once
diff --git a/spec/models/system_note_metadata_spec.rb b/spec/models/system_note_metadata_spec.rb
index 144c65d2f62..36bcb3499b3 100644
--- a/spec/models/system_note_metadata_spec.rb
+++ b/spec/models/system_note_metadata_spec.rb
@@ -19,12 +19,14 @@ RSpec.describe SystemNoteMetadata do
it { is_expected.to be_invalid }
end
- context 'when action type is valid' do
- subject do
- build(:system_note_metadata, note: build(:note), action: 'merge')
- end
+ %i[merge timeline_event].each do |action|
+ context 'when action type is valid' do
+ subject do
+ build(:system_note_metadata, note: build(:note), action: action)
+ end
- it { is_expected.to be_valid }
+ it { is_expected.to be_valid }
+ end
end
context 'when importing' do
diff --git a/spec/models/user_custom_attribute_spec.rb b/spec/models/user_custom_attribute_spec.rb
index 1a51ad662b0..67c144d7caa 100644
--- a/spec/models/user_custom_attribute_spec.rb
+++ b/spec/models/user_custom_attribute_spec.rb
@@ -15,4 +15,61 @@ RSpec.describe UserCustomAttribute do
it { is_expected.to validate_presence_of(:value) }
it { is_expected.to validate_uniqueness_of(:key).scoped_to(:user_id) }
end
+
+ describe 'scopes' do
+ let(:user) { create(:user) }
+ let(:blocked_at) { DateTime.now }
+ let(:custom_attribute) { create(:user_custom_attribute, key: 'blocked_at', value: blocked_at, user_id: user.id) }
+
+ describe '.by_user_id' do
+ subject { UserCustomAttribute.by_user_id(user.id) }
+
+ it { is_expected.to match_array([custom_attribute]) }
+ end
+
+ describe '.by_updated_at' do
+ subject { UserCustomAttribute.by_updated_at(Date.today.all_day) }
+
+ it { is_expected.to match_array([custom_attribute]) }
+ end
+
+ describe '.by_key' do
+ subject { UserCustomAttribute.by_key('blocked_at') }
+
+ it { is_expected.to match_array([custom_attribute]) }
+ end
+ end
+
+ describe '#upsert_custom_attributes' do
+ subject { UserCustomAttribute.upsert_custom_attributes(custom_attributes) }
+
+ let_it_be_with_reload(:user) { create(:user) }
+
+ let(:arkose_session) { '22612c147bb418c8.2570749403' }
+ let(:risk_band) { 'Low' }
+ let(:global_score) { '0' }
+ let(:custom_score) { '0' }
+
+ let(:custom_attributes) do
+ custom_attributes = []
+ custom_attributes.push({ key: 'arkose_session', value: arkose_session })
+ custom_attributes.push({ key: 'arkose_risk_band', value: risk_band })
+ custom_attributes.push({ key: 'arkose_global_score', value: global_score })
+ custom_attributes.push({ key: 'arkose_custom_score', value: custom_score })
+
+ custom_attributes.map! { |custom_attribute| custom_attribute.merge({ user_id: user.id }) }
+ custom_attributes
+ end
+
+ it 'adds arkose data to custom attributes' do
+ subject
+
+ expect(user.custom_attributes.count).to eq(4)
+
+ expect(user.custom_attributes.find_by(key: 'arkose_session').value).to eq(arkose_session)
+ expect(user.custom_attributes.find_by(key: 'arkose_risk_band').value).to eq(risk_band)
+ expect(user.custom_attributes.find_by(key: 'arkose_global_score').value).to eq(global_score)
+ expect(user.custom_attributes.find_by(key: 'arkose_custom_score').value).to eq(custom_score)
+ end
+ end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index bc425b15c6e..71171f98492 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -1048,8 +1048,8 @@ RSpec.describe User do
context 'SSH key expiration scopes' do
let_it_be(:user1) { create(:user) }
let_it_be(:user2) { create(:user) }
- let_it_be(:expired_today_not_notified) { create(:key, expires_at: Time.current, user: user1) }
- let_it_be(:expired_today_already_notified) { create(:key, expires_at: Time.current, user: user2, expiry_notification_delivered_at: Time.current) }
+ let_it_be(:expired_today_not_notified) { create(:key, :expired_today, user: user1) }
+ let_it_be(:expired_today_already_notified) { create(:key, :expired_today, user: user2, expiry_notification_delivered_at: Time.current) }
let_it_be(:expiring_soon_not_notified) { create(:key, expires_at: 2.days.from_now, user: user2) }
let_it_be(:expiring_soon_notified) { create(:key, expires_at: 2.days.from_now, user: user1, before_expiry_notification_delivered_at: Time.current) }
@@ -5006,9 +5006,13 @@ RSpec.describe User do
let(:archived_project) { create(:project, :public, :archived) }
before do
- create(:merge_request, source_project: project, author: user, reviewers: [user])
- create(:merge_request, :closed, source_project: project, author: user, reviewers: [user])
- create(:merge_request, source_project: archived_project, author: user, reviewers: [user])
+ mr1 = create(:merge_request, source_project: project, author: user, reviewers: [user])
+ mr2 = create(:merge_request, :closed, source_project: project, author: user, reviewers: [user])
+ mr3 = create(:merge_request, source_project: archived_project, author: user, reviewers: [user])
+
+ mr1.find_reviewer(user).update!(state: :attention_requested)
+ mr2.find_reviewer(user).update!(state: :attention_requested)
+ mr3.find_reviewer(user).update!(state: :attention_requested)
end
it 'returns number of open merge requests from non-archived projects' do
@@ -5335,7 +5339,7 @@ RSpec.describe User do
let(:deleted_by) { create(:user) }
it 'blocks the user then schedules them for deletion if a hard delete is specified' do
- expect(DeleteUserWorker).to receive(:perform_async).with(deleted_by.id, user.id, hard_delete: true)
+ expect(DeleteUserWorker).to receive(:perform_async).with(deleted_by.id, user.id, { hard_delete: true })
user.delete_async(deleted_by: deleted_by, params: { hard_delete: true })
@@ -6817,4 +6821,23 @@ RSpec.describe User do
it_behaves_like 'it has loose foreign keys' do
let(:factory_name) { :user }
end
+
+ describe 'mr_attention_requests_enabled?' do
+ let(:user) { create(:user) }
+
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it { expect(user.mr_attention_requests_enabled?).to be(false) }
+
+ it 'feature flag is enabled for user' do
+ stub_feature_flags(mr_attention_requests: user)
+
+ another_user = create(:user)
+
+ expect(user.mr_attention_requests_enabled?).to be(true)
+ expect(another_user.mr_attention_requests_enabled?).to be(false)
+ end
+ end
end
diff --git a/spec/models/users/in_product_marketing_email_spec.rb b/spec/models/users/in_product_marketing_email_spec.rb
index ca03c3e645d..7796b54babc 100644
--- a/spec/models/users/in_product_marketing_email_spec.rb
+++ b/spec/models/users/in_product_marketing_email_spec.rb
@@ -14,9 +14,35 @@ RSpec.describe Users::InProductMarketingEmail, type: :model do
subject { build(:in_product_marketing_email) }
it { is_expected.to validate_presence_of(:user) }
- it { is_expected.to validate_presence_of(:track) }
- it { is_expected.to validate_presence_of(:series) }
- it { is_expected.to validate_uniqueness_of(:user_id).scoped_to([:track, :series]).with_message('has already been sent') }
+
+ context 'for a track+series email' do
+ it { is_expected.to validate_presence_of(:track) }
+ it { is_expected.to validate_presence_of(:series) }
+ it {
+ is_expected.to validate_uniqueness_of(:user_id)
+ .scoped_to([:track, :series]).with_message('track series email has already been sent')
+ }
+ end
+
+ context 'for a campaign email' do
+ subject { build(:in_product_marketing_email, :campaign) }
+
+ it { is_expected.to validate_presence_of(:campaign) }
+ it { is_expected.not_to validate_presence_of(:track) }
+ it { is_expected.not_to validate_presence_of(:series) }
+ it {
+ is_expected.to validate_uniqueness_of(:user_id)
+ .scoped_to(:campaign).with_message('campaign email has already been sent')
+ }
+ it { is_expected.to validate_inclusion_of(:campaign).in_array(described_class::CAMPAIGNS) }
+ end
+
+ context 'when mixing campaign and track+series' do
+ it 'is not valid' do
+ expect(build(:in_product_marketing_email, :campaign, track: :create)).not_to be_valid
+ expect(build(:in_product_marketing_email, :campaign, series: 0)).not_to be_valid
+ end
+ end
end
describe '.without_track_and_series' do
@@ -58,6 +84,27 @@ RSpec.describe Users::InProductMarketingEmail, type: :model do
end
end
+ describe '.without_campaign' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:other_user) { create(:user) }
+
+ let(:campaign) { Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE }
+
+ subject(:without_campaign) { User.merge(described_class.without_campaign(campaign)) }
+
+ context 'when record for campaign already exists' do
+ before do
+ create(:in_product_marketing_email, :campaign, campaign: campaign, user: user)
+ end
+
+ it { is_expected.to match_array [other_user] }
+ end
+
+ context 'when record for campaign does not exist' do
+ it { is_expected.to match_array [user, other_user] }
+ end
+ end
+
describe '.for_user_with_track_and_series' do
let_it_be(:user) { create(:user) }
let_it_be(:in_product_marketing_email) { create(:in_product_marketing_email, series: 0, track: 0, user: user) }
diff --git a/spec/models/users/merge_request_interaction_spec.rb b/spec/models/users/merge_request_interaction_spec.rb
index 12c7fa43a60..a499a7c68e8 100644
--- a/spec/models/users/merge_request_interaction_spec.rb
+++ b/spec/models/users/merge_request_interaction_spec.rb
@@ -59,6 +59,7 @@ RSpec.describe ::Users::MergeRequestInteraction do
context 'when the user has been asked to review the MR' do
before do
merge_request.reviewers << user
+ merge_request.find_reviewer(user).update!(state: :attention_requested)
end
it { is_expected.to eq(Types::MergeRequestReviewStateEnum.values['ATTENTION_REQUESTED'].value) }
diff --git a/spec/policies/container_expiration_policy_policy_spec.rb b/spec/policies/container_expiration_policy_policy_spec.rb
new file mode 100644
index 00000000000..4b39dd8dace
--- /dev/null
+++ b/spec/policies/container_expiration_policy_policy_spec.rb
@@ -0,0 +1,33 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ContainerExpirationPolicyPolicy do
+ using RSpec::Parameterized::TableSyntax
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project, reload: true) { create(:project) }
+
+ subject { described_class.new(user, project.container_expiration_policy) }
+
+ where(:user_type, :allowed_to_destroy_container_image) do
+ :anonymous | false
+ :guest | false
+ :developer | false
+ :maintainer | true
+ end
+
+ with_them do
+ context "for user type #{params[:user_type]}" do
+ before do
+ project.public_send("add_#{user_type}", user) unless user_type == :anonymous
+ end
+
+ if params[:allowed_to_destroy_container_image]
+ it { is_expected.to be_allowed(:admin_container_image) }
+ else
+ it { is_expected.not_to be_allowed(:admin_container_image) }
+ end
+ end
+ end
+end
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index ff59a2e04a7..05bba167bd3 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -242,6 +242,24 @@ RSpec.describe GroupPolicy do
end
end
+ context 'migration bot' do
+ let_it_be(:migration_bot) { User.migration_bot }
+ let_it_be(:current_user) { migration_bot }
+
+ it :aggregate_failures do
+ expect_allowed(:read_resource_access_tokens, :destroy_resource_access_tokens)
+ expect_disallowed(*guest_permissions)
+ expect_disallowed(*reporter_permissions)
+ expect_disallowed(*developer_permissions)
+ expect_disallowed(*maintainer_permissions)
+ expect_disallowed(*owner_permissions)
+ end
+
+ it_behaves_like 'deploy token does not get confused with user' do
+ let(:user_id) { migration_bot.id }
+ end
+ end
+
describe 'private nested group use the highest access level from the group and inherited permissions' do
let_it_be(:nested_group) do
create(:group, :private, :owner_subgroup_creation_only, :crm_enabled, parent: group)
@@ -914,12 +932,21 @@ RSpec.describe GroupPolicy do
context 'reporter' do
let(:current_user) { reporter }
+ it { is_expected.to be_allowed(:read_dependency_proxy) }
it { is_expected.to be_disallowed(:admin_dependency_proxy) }
end
context 'developer' do
let(:current_user) { developer }
+ it { is_expected.to be_allowed(:read_dependency_proxy) }
+ it { is_expected.to be_disallowed(:admin_dependency_proxy) }
+ end
+
+ context 'maintainer' do
+ let(:current_user) { maintainer }
+
+ it { is_expected.to be_allowed(:read_dependency_proxy) }
it { is_expected.to be_allowed(:admin_dependency_proxy) }
end
end
@@ -1171,6 +1198,24 @@ RSpec.describe GroupPolicy do
end
end
+ describe 'change_prevent_sharing_groups_outside_hierarchy' do
+ context 'with owner' do
+ let(:current_user) { owner }
+
+ it { is_expected.to be_allowed(:change_prevent_sharing_groups_outside_hierarchy) }
+ end
+
+ context 'with non-owner roles' do
+ where(role: %w[admin maintainer reporter developer guest])
+
+ with_them do
+ let(:current_user) { public_send role }
+
+ it { is_expected.to be_disallowed(:change_prevent_sharing_groups_outside_hierarchy) }
+ end
+ end
+ end
+
context 'with customer relations feature flag disabled' do
let(:current_user) { owner }
diff --git a/spec/policies/issuable_policy_spec.rb b/spec/policies/issuable_policy_spec.rb
index eeb298e853e..5e2a307e959 100644
--- a/spec/policies/issuable_policy_spec.rb
+++ b/spec/policies/issuable_policy_spec.rb
@@ -3,11 +3,25 @@
require 'spec_helper'
RSpec.describe IssuablePolicy, models: true do
- let(:user) { create(:user) }
- let(:project) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+
let(:issue) { create(:issue, project: project) }
let(:policies) { described_class.new(user, issue) }
+ before do
+ project.add_developer(developer)
+ project.add_guest(guest)
+ project.add_reporter(reporter)
+ end
+
+ def permissions(user, issue)
+ described_class.new(user, issue)
+ end
+
describe '#rules' do
context 'when user is author of issuable' do
let(:merge_request) { create(:merge_request, source_project: project, author: user) }
@@ -23,6 +37,20 @@ RSpec.describe IssuablePolicy, models: true do
end
end
+ context 'Timeline events' do
+ it 'allows non-members to read time line events' do
+ expect(permissions(guest, issue)).to be_allowed(:read_incident_management_timeline_event)
+ end
+
+ it 'disallows reporters from managing timeline events' do
+ expect(permissions(reporter, issue)).to be_disallowed(:admin_incident_management_timeline_event)
+ end
+
+ it 'allows developers to manage timeline events' do
+ expect(permissions(developer, issue)).to be_allowed(:admin_incident_management_timeline_event)
+ end
+ end
+
context 'when project is private' do
let(:project) { create(:project, :private) }
@@ -37,6 +65,24 @@ RSpec.describe IssuablePolicy, models: true do
it 'disallows user from reading and updating issuables from that project' do
expect(policies).to be_disallowed(:read_issue, :update_issue, :reopen_issue, :read_merge_request, :update_merge_request, :reopen_merge_request)
end
+
+ context 'Timeline events' do
+ it 'disallows non-members from reading timeline events' do
+ expect(permissions(user, issue)).to be_disallowed(:read_incident_management_timeline_event)
+ end
+
+ it 'allows guests to read time line events' do
+ expect(permissions(guest, issue)).to be_allowed(:read_incident_management_timeline_event)
+ end
+
+ it 'disallows reporters from managing timeline events' do
+ expect(permissions(reporter, issue)).to be_disallowed(:admin_incident_management_timeline_event)
+ end
+
+ it 'allows developers to manage timeline events' do
+ expect(permissions(developer, issue)).to be_allowed(:admin_incident_management_timeline_event)
+ end
+ end
end
end
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 1fe9e430011..557bda985af 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -397,7 +397,7 @@ RSpec.describe IssuePolicy do
end
end
- describe 'set_issue_crm_contacts' do
+ describe 'crm permissions' do
let(:user) { create(:user) }
let(:subgroup) { create(:group, :crm_enabled, parent: create(:group, :crm_enabled)) }
let(:project) { create(:project, group: subgroup) }
@@ -408,6 +408,7 @@ RSpec.describe IssuePolicy do
it 'is disallowed' do
project.add_reporter(user)
+ expect(policies).to be_disallowed(:read_crm_contacts)
expect(policies).to be_disallowed(:set_issue_crm_contacts)
end
end
@@ -416,6 +417,7 @@ RSpec.describe IssuePolicy do
it 'is allowed' do
subgroup.add_reporter(user)
+ expect(policies).to be_disallowed(:read_crm_contacts)
expect(policies).to be_disallowed(:set_issue_crm_contacts)
end
end
@@ -424,8 +426,31 @@ RSpec.describe IssuePolicy do
it 'is allowed' do
subgroup.parent.add_reporter(user)
+ expect(policies).to be_allowed(:read_crm_contacts)
expect(policies).to be_allowed(:set_issue_crm_contacts)
end
end
+
+ context 'when crm disabled on subgroup' do
+ let(:subgroup) { create(:group, parent: create(:group, :crm_enabled)) }
+
+ it 'is disallowed' do
+ subgroup.parent.add_reporter(user)
+
+ expect(policies).to be_disallowed(:read_crm_contacts)
+ expect(policies).to be_disallowed(:set_issue_crm_contacts)
+ end
+ end
+
+ context 'when peronsal namespace' do
+ let(:project) { create(:project) }
+
+ it 'is disallowed' do
+ project.add_reporter(user)
+
+ expect(policies).to be_disallowed(:read_crm_contacts)
+ expect(policies).to be_disallowed(:set_issue_crm_contacts)
+ end
+ end
end
end
diff --git a/spec/policies/namespaces/project_namespace_policy_spec.rb b/spec/policies/namespaces/project_namespace_policy_spec.rb
index f1022747fab..5ceea9dfb9d 100644
--- a/spec/policies/namespaces/project_namespace_policy_spec.rb
+++ b/spec/policies/namespaces/project_namespace_policy_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe Namespaces::ProjectNamespacePolicy do
let(:permissions) do
[:owner_access, :create_projects, :admin_namespace, :read_namespace,
- :read_statistics, :transfer_projects, :create_package_settings,
- :read_package_settings, :create_jira_connect_subscription]
+ :read_statistics, :transfer_projects, :admin_package,
+ :create_jira_connect_subscription]
end
subject { described_class.new(current_user, namespace) }
diff --git a/spec/policies/namespaces/user_namespace_policy_spec.rb b/spec/policies/namespaces/user_namespace_policy_spec.rb
index 06db2f6e243..22c3f6a6d67 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, :create_package_settings, :read_package_settings] }
+ let(:owner_permissions) { [:owner_access, :create_projects, :admin_namespace, :read_namespace, :read_statistics, :transfer_projects, :admin_package] }
subject { described_class.new(current_user, namespace) }
diff --git a/spec/policies/timelog_policy_spec.rb b/spec/policies/timelog_policy_spec.rb
new file mode 100644
index 00000000000..97e61cfe5ce
--- /dev/null
+++ b/spec/policies/timelog_policy_spec.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe TimelogPolicy, models: true do
+ let_it_be(:author) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)}
+
+ let(:user) { nil }
+ let(:policy) { described_class.new(user, timelog) }
+
+ describe '#rules' do
+ context 'when user is anonymus' do
+ it 'prevents adimistration of timelog' do
+ expect(policy).to be_disallowed(:admin_timelog)
+ end
+ end
+
+ context 'when user is the author of the timelog' do
+ let(:user) { author }
+
+ it 'allows adimistration of timelog' do
+ expect(policy).to be_allowed(:admin_timelog)
+ end
+ end
+
+ context 'when user is not the author of the timelog but maintainer of the project' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ it 'allows adimistration of timelog' do
+ expect(policy).to be_allowed(:admin_timelog)
+ end
+ end
+
+ context 'when user is not the timelog\'s author, not a maintainer but an administrator', :enable_admin_mode do
+ let(:user) { create(:user, :admin) }
+
+ it 'allows adimistration of timelog' do
+ expect(policy).to be_allowed(:admin_timelog)
+ end
+ end
+
+ context 'when user is not the author of the timelog nor a maintainer of the project nor an administrator' do
+ let(:user) { create(:user) }
+
+ it 'prevents adimistration of timelog' do
+ expect(policy).to be_disallowed(:admin_timelog)
+ end
+ end
+ end
+end
diff --git a/spec/policies/work_item_policy_spec.rb b/spec/policies/work_item_policy_spec.rb
index 08a22a95540..b19f7d2557d 100644
--- a/spec/policies/work_item_policy_spec.rb
+++ b/spec/policies/work_item_policy_spec.rb
@@ -3,11 +3,13 @@
require 'spec_helper'
RSpec.describe WorkItemPolicy do
- let_it_be(:project) { create(:project) }
- let_it_be(:public_project) { create(:project, :public) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, group: group) }
+ let_it_be(:public_project) { create(:project, :public, group: group) }
let_it_be(:guest) { create(:user).tap { |user| project.add_guest(user) } }
let_it_be(:guest_author) { create(:user).tap { |user| project.add_guest(user) } }
let_it_be(:reporter) { create(:user).tap { |user| project.add_reporter(user) } }
+ let_it_be(:group_reporter) { create(:user).tap { |user| group.add_reporter(user) } }
let_it_be(:non_member_user) { create(:user) }
let_it_be(:work_item) { create(:work_item, project: project) }
let_it_be(:authored_work_item) { create(:work_item, project: project, author: guest_author) }
@@ -81,7 +83,9 @@ RSpec.describe WorkItemPolicy do
let(:work_item_subject) { work_item }
let(:current_user) { reporter }
- it { is_expected.to be_disallowed(:delete_work_item) }
+ context 'when the user is not the author of the work item' do
+ it { is_expected.to be_disallowed(:delete_work_item) }
+ end
context 'when guest authored the work item' do
let(:work_item_subject) { authored_work_item }
@@ -90,5 +94,35 @@ RSpec.describe WorkItemPolicy do
it { is_expected.to be_allowed(:delete_work_item) }
end
end
+
+ context 'when user is member of the project\'s group' do
+ let(:current_user) { group_reporter }
+
+ context 'when the user is not the author of the work item' do
+ it { is_expected.to be_disallowed(:delete_work_item) }
+ end
+
+ context 'when user authored the work item' do
+ let(:work_item_subject) { create(:work_item, project: project, author: current_user) }
+
+ it { is_expected.to be_allowed(:delete_work_item) }
+ end
+ end
+
+ context 'when user is not a member of the project' do
+ let(:current_user) { non_member_user }
+
+ context 'when the user authored the work item' do
+ let(:work_item_subject) { create(:work_item, project: public_project, author: current_user) }
+
+ it { is_expected.to be_disallowed(:delete_work_item) }
+ end
+
+ context 'when the user is not the author of the work item' do
+ let(:work_item_subject) { public_work_item }
+
+ it { is_expected.to be_disallowed(:delete_work_item) }
+ end
+ end
end
end
diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb
index 49126ed8e5f..6570ab56ed0 100644
--- a/spec/presenters/clusters/cluster_presenter_spec.rb
+++ b/spec/presenters/clusters/cluster_presenter_spec.rb
@@ -121,7 +121,7 @@ RSpec.describe Clusters::ClusterPresenter do
it do
is_expected.to include('clusters-path': clusterable_presenter.index_path,
'dashboard-endpoint': clusterable_presenter.metrics_dashboard_path(cluster),
- 'documentation-path': help_page_path('user/project/clusters/index', anchor: 'monitoring-your-kubernetes-cluster'),
+ 'documentation-path': help_page_path('user/infrastructure/clusters/manage/clusters_health'),
'add-dashboard-documentation-path': help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'),
'empty-getting-started-svg-path': match_asset_path('/assets/illustrations/monitoring/getting_started.svg'),
'empty-loading-svg-path': match_asset_path('/assets/illustrations/monitoring/loading.svg'),
diff --git a/spec/presenters/group_clusterable_presenter_spec.rb b/spec/presenters/group_clusterable_presenter_spec.rb
index f6389ba723e..0b8a7cb5003 100644
--- a/spec/presenters/group_clusterable_presenter_spec.rb
+++ b/spec/presenters/group_clusterable_presenter_spec.rb
@@ -37,36 +37,18 @@ RSpec.describe GroupClusterablePresenter do
it { is_expected.to eq(group_clusters_path(group)) }
end
- describe '#new_path' do
- subject { presenter.new_path }
-
- it { is_expected.to eq(new_group_cluster_path(group)) }
- end
-
describe '#connect_path' do
subject { presenter.connect_path }
it { is_expected.to eq(connect_group_clusters_path(group)) }
end
- describe '#authorize_aws_role_path' do
- subject { presenter.authorize_aws_role_path }
-
- it { is_expected.to eq(authorize_aws_role_group_clusters_path(group)) }
- end
-
describe '#create_user_clusters_path' do
subject { presenter.create_user_clusters_path }
it { is_expected.to eq(create_user_group_clusters_path(group)) }
end
- describe '#create_gcp_clusters_path' do
- subject { presenter.create_gcp_clusters_path }
-
- it { is_expected.to eq(create_gcp_group_clusters_path(group)) }
- end
-
describe '#cluster_status_cluster_path' do
subject { presenter.cluster_status_cluster_path(cluster) }
diff --git a/spec/presenters/instance_clusterable_presenter_spec.rb b/spec/presenters/instance_clusterable_presenter_spec.rb
index 3e871bf7ba5..52379091b4e 100644
--- a/spec/presenters/instance_clusterable_presenter_spec.rb
+++ b/spec/presenters/instance_clusterable_presenter_spec.rb
@@ -9,24 +9,12 @@ RSpec.describe InstanceClusterablePresenter do
let(:cluster) { create(:cluster, :provided_by_gcp, :instance) }
let(:instance) { cluster.instance }
- describe '#create_aws_clusters_path' do
- subject { described_class.new(instance).create_aws_clusters_path }
-
- it { is_expected.to eq(create_aws_admin_clusters_path) }
- end
-
describe '#connect_path' do
subject { described_class.new(instance).connect_path }
it { is_expected.to eq(connect_admin_clusters_path) }
end
- describe '#authorize_aws_role_path' do
- subject { described_class.new(instance).authorize_aws_role_path }
-
- it { is_expected.to eq(authorize_aws_role_admin_clusters_path) }
- end
-
describe '#clear_cluster_cache_path' do
subject { presenter.clear_cluster_cache_path(cluster) }
diff --git a/spec/presenters/project_clusterable_presenter_spec.rb b/spec/presenters/project_clusterable_presenter_spec.rb
index bd4319c9411..dfe4a191ae5 100644
--- a/spec/presenters/project_clusterable_presenter_spec.rb
+++ b/spec/presenters/project_clusterable_presenter_spec.rb
@@ -37,12 +37,6 @@ RSpec.describe ProjectClusterablePresenter do
it { is_expected.to eq(project_clusters_path(project)) }
end
- describe '#new_path' do
- subject { presenter.new_path }
-
- it { is_expected.to eq(new_project_cluster_path(project)) }
- end
-
describe '#connect_path' do
subject { presenter.connect_path }
@@ -55,24 +49,12 @@ RSpec.describe ProjectClusterablePresenter do
it { is_expected.to eq(new_cluster_docs_project_clusters_path(project)) }
end
- describe '#authorize_aws_role_path' do
- subject { presenter.authorize_aws_role_path }
-
- it { is_expected.to eq(authorize_aws_role_project_clusters_path(project)) }
- end
-
describe '#create_user_clusters_path' do
subject { presenter.create_user_clusters_path }
it { is_expected.to eq(create_user_project_clusters_path(project)) }
end
- describe '#create_gcp_clusters_path' do
- subject { presenter.create_gcp_clusters_path }
-
- it { is_expected.to eq(create_gcp_project_clusters_path(project)) }
- end
-
describe '#cluster_status_cluster_path' do
subject { presenter.cluster_status_cluster_path(cluster) }
diff --git a/spec/presenters/projects/security/configuration_presenter_spec.rb b/spec/presenters/projects/security/configuration_presenter_spec.rb
index 779d6b88fd5..05e5a9d4f1d 100644
--- a/spec/presenters/projects/security/configuration_presenter_spec.rb
+++ b/spec/presenters/projects/security/configuration_presenter_spec.rb
@@ -263,7 +263,7 @@ RSpec.describe Projects::Security::ConfigurationPresenter do
end
it 'includes a link to CI pipeline docs' do
- expect(html_data[:latest_pipeline_path]).to eq(help_page_path('ci/pipelines'))
+ expect(html_data[:latest_pipeline_path]).to eq(help_page_path('ci/pipelines/index'))
end
context 'when gathering feature data' do
diff --git a/spec/requests/admin/background_migrations_controller_spec.rb b/spec/requests/admin/background_migrations_controller_spec.rb
index 9933008502f..0fd2ba26cb8 100644
--- a/spec/requests/admin/background_migrations_controller_spec.rb
+++ b/spec/requests/admin/background_migrations_controller_spec.rb
@@ -9,6 +9,90 @@ RSpec.describe Admin::BackgroundMigrationsController, :enable_admin_mode do
sign_in(admin)
end
+ describe 'GET #show' do
+ context 'when the migration is valid' do
+ let(:migration) { create(:batched_background_migration) }
+ let!(:failed_job) { create(:batched_background_migration_job, :failed, batched_migration: migration) }
+
+ it 'fetches the migration' do
+ get admin_background_migration_path(migration)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'returns failed jobs' do
+ get admin_background_migration_path(migration)
+
+ expect(assigns(:failed_jobs)).to match_array([failed_job])
+ end
+ end
+
+ context 'when the migration does not exist' do
+ let(:invalid_migration) { non_existing_record_id }
+
+ it 'returns not found' do
+ get admin_background_migration_path(invalid_migration)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'GET #index' do
+ let(:default_model) { ActiveRecord::Base }
+
+ before do
+ allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ end
+
+ let!(:main_database_migration) { create(:batched_background_migration, :active) }
+
+ context 'when no database is provided' do
+ let(:base_models) { { 'fake_db' => default_model } }
+
+ before do
+ stub_const('Gitlab::Database::MAIN_DATABASE_NAME', 'fake_db')
+ end
+
+ it 'uses the default connection' do
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(default_model.connection).and_yield
+
+ get admin_background_migrations_path
+ end
+
+ it 'returns default database records' do
+ get admin_background_migrations_path
+
+ expect(assigns(:migrations)).to match_array([main_database_migration])
+ end
+ end
+
+ context 'when multiple database is enabled', :add_ci_connection do
+ let(:base_models) { { 'fake_db' => default_model, 'ci' => ci_model } }
+ let(:ci_model) { Ci::ApplicationRecord }
+
+ context 'when CI database is provided' do
+ it "uses CI database connection" do
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(ci_model.connection).and_yield
+
+ get admin_background_migrations_path, params: { database: 'ci' }
+ end
+
+ it 'returns CI database records' do
+ # If we only have one DB we'll see both migrations
+ skip_if_multiple_databases_not_setup
+
+ ci_database_migration = Gitlab::Database::SharedModel.using_connection(ci_model.connection) { create(:batched_background_migration, :active) }
+
+ get admin_background_migrations_path, params: { database: 'ci' }
+
+ expect(assigns(:migrations)).to match_array([ci_database_migration])
+ expect(assigns(:migrations)).not_to include(main_database_migration)
+ end
+ end
+ end
+ end
+
describe 'POST #retry' do
let(:migration) { create(:batched_background_migration, :failed) }
diff --git a/spec/requests/admin/batched_jobs_controller_spec.rb b/spec/requests/admin/batched_jobs_controller_spec.rb
new file mode 100644
index 00000000000..9a0654c64b4
--- /dev/null
+++ b/spec/requests/admin/batched_jobs_controller_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Admin::BatchedJobsController, :enable_admin_mode do
+ let(:admin) { create(:admin) }
+
+ before do
+ sign_in(admin)
+ end
+
+ describe 'GET #show' do
+ let(:main_database_job) { create(:batched_background_migration_job) }
+ let(:default_model) { ActiveRecord::Base }
+
+ it 'fetches the job' do
+ get admin_background_migration_batched_job_path(main_database_job.batched_migration, main_database_job)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ it 'uses the default connection' do
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(default_model.connection).and_yield
+
+ get admin_background_migration_batched_job_path(main_database_job.batched_migration, main_database_job)
+ end
+
+ it 'returns a default database record' do
+ get admin_background_migration_batched_job_path(main_database_job.batched_migration, main_database_job)
+
+ expect(assigns(:job)).to eql(main_database_job)
+ end
+
+ context 'when the job does not exist' do
+ let(:invalid_job) { non_existing_record_id }
+
+ it 'returns not found' do
+ get admin_background_migration_batched_job_path(main_database_job.batched_migration, invalid_job)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when multiple database is enabled', :add_ci_connection do
+ let(:base_models) { { 'fake_db' => default_model, 'ci' => ci_model } }
+ let(:ci_model) { Ci::ApplicationRecord }
+
+ before do
+ allow(Gitlab::Database).to receive(:database_base_models).and_return(base_models)
+ end
+
+ context 'when CI database is provided' do
+ it "uses CI database connection" do
+ expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(ci_model.connection).and_yield
+
+ get admin_background_migration_batched_job_path(main_database_job.batched_migration, main_database_job,
+ database: 'ci')
+ end
+
+ it 'returns a CI database record' do
+ ci_database_job = Gitlab::Database::SharedModel.using_connection(ci_model.connection) do
+ create(:batched_background_migration_job, :failed)
+ end
+
+ get admin_background_migration_batched_job_path(ci_database_job.batched_migration,
+ ci_database_job, database: 'ci')
+
+ expect(assigns(:job)).to eql(ci_database_job)
+ expect(assigns(:job)).not_to eql(main_database_job)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/admin/plan_limits_spec.rb b/spec/requests/api/admin/plan_limits_spec.rb
index 03642ad617e..74ea3b0973f 100644
--- a/spec/requests/api/admin/plan_limits_spec.rb
+++ b/spec/requests/api/admin/plan_limits_spec.rb
@@ -23,6 +23,14 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Hash
+ expect(json_response['ci_pipeline_size']).to eq(Plan.default.actual_limits.ci_pipeline_size)
+ expect(json_response['ci_active_jobs']).to eq(Plan.default.actual_limits.ci_active_jobs)
+ expect(json_response['ci_active_pipelines']).to eq(Plan.default.actual_limits.ci_active_pipelines)
+ expect(json_response['ci_project_subscriptions']).to eq(Plan.default.actual_limits.ci_project_subscriptions)
+ expect(json_response['ci_pipeline_schedules']).to eq(Plan.default.actual_limits.ci_pipeline_schedules)
+ expect(json_response['ci_needs_size_limit']).to eq(Plan.default.actual_limits.ci_needs_size_limit)
+ expect(json_response['ci_registered_group_runners']).to eq(Plan.default.actual_limits.ci_registered_group_runners)
+ expect(json_response['ci_registered_project_runners']).to eq(Plan.default.actual_limits.ci_registered_project_runners)
expect(json_response['conan_max_file_size']).to eq(Plan.default.actual_limits.conan_max_file_size)
expect(json_response['generic_packages_max_file_size']).to eq(Plan.default.actual_limits.generic_packages_max_file_size)
expect(json_response['helm_max_file_size']).to eq(Plan.default.actual_limits.helm_max_file_size)
@@ -31,6 +39,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
expect(json_response['terraform_module_max_file_size']).to eq(Plan.default.actual_limits.terraform_module_max_file_size)
+ expect(json_response['storage_size_limit']).to eq(Plan.default.actual_limits.storage_size_limit)
end
end
@@ -44,6 +53,14 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Hash
+ expect(json_response['ci_pipeline_size']).to eq(Plan.default.actual_limits.ci_pipeline_size)
+ expect(json_response['ci_active_jobs']).to eq(Plan.default.actual_limits.ci_active_jobs)
+ expect(json_response['ci_active_pipelines']).to eq(Plan.default.actual_limits.ci_active_pipelines)
+ expect(json_response['ci_project_subscriptions']).to eq(Plan.default.actual_limits.ci_project_subscriptions)
+ expect(json_response['ci_pipeline_schedules']).to eq(Plan.default.actual_limits.ci_pipeline_schedules)
+ expect(json_response['ci_needs_size_limit']).to eq(Plan.default.actual_limits.ci_needs_size_limit)
+ expect(json_response['ci_registered_group_runners']).to eq(Plan.default.actual_limits.ci_registered_group_runners)
+ expect(json_response['ci_registered_project_runners']).to eq(Plan.default.actual_limits.ci_registered_project_runners)
expect(json_response['conan_max_file_size']).to eq(Plan.default.actual_limits.conan_max_file_size)
expect(json_response['generic_packages_max_file_size']).to eq(Plan.default.actual_limits.generic_packages_max_file_size)
expect(json_response['helm_max_file_size']).to eq(Plan.default.actual_limits.helm_max_file_size)
@@ -52,6 +69,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['nuget_max_file_size']).to eq(Plan.default.actual_limits.nuget_max_file_size)
expect(json_response['pypi_max_file_size']).to eq(Plan.default.actual_limits.pypi_max_file_size)
expect(json_response['terraform_module_max_file_size']).to eq(Plan.default.actual_limits.terraform_module_max_file_size)
+ expect(json_response['storage_size_limit']).to eq(Plan.default.actual_limits.storage_size_limit)
end
end
@@ -84,6 +102,14 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
it 'updates multiple plan limits' do
put api('/application/plan_limits', admin), params: {
'plan_name': 'default',
+ 'ci_pipeline_size': 101,
+ 'ci_active_jobs': 102,
+ 'ci_active_pipelines': 103,
+ 'ci_project_subscriptions': 104,
+ 'ci_pipeline_schedules': 105,
+ 'ci_needs_size_limit': 106,
+ 'ci_registered_group_runners': 107,
+ 'ci_registered_project_runners': 108,
'conan_max_file_size': 10,
'generic_packages_max_file_size': 20,
'helm_max_file_size': 25,
@@ -91,11 +117,20 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'npm_max_file_size': 40,
'nuget_max_file_size': 50,
'pypi_max_file_size': 60,
- 'terraform_module_max_file_size': 70
+ 'terraform_module_max_file_size': 70,
+ 'storage_size_limit': 80
}
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Hash
+ expect(json_response['ci_pipeline_size']).to eq(101)
+ expect(json_response['ci_active_jobs']).to eq(102)
+ expect(json_response['ci_active_pipelines']).to eq(103)
+ expect(json_response['ci_project_subscriptions']).to eq(104)
+ expect(json_response['ci_pipeline_schedules']).to eq(105)
+ expect(json_response['ci_needs_size_limit']).to eq(106)
+ expect(json_response['ci_registered_group_runners']).to eq(107)
+ expect(json_response['ci_registered_project_runners']).to eq(108)
expect(json_response['conan_max_file_size']).to eq(10)
expect(json_response['generic_packages_max_file_size']).to eq(20)
expect(json_response['helm_max_file_size']).to eq(25)
@@ -104,6 +139,7 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
expect(json_response['nuget_max_file_size']).to eq(50)
expect(json_response['pypi_max_file_size']).to eq(60)
expect(json_response['terraform_module_max_file_size']).to eq(70)
+ expect(json_response['storage_size_limit']).to eq(80)
end
it 'updates single plan limits' do
@@ -131,6 +167,14 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
it 'fails to update plan limits' do
put api('/application/plan_limits', admin), params: {
'plan_name': 'default',
+ 'ci_pipeline_size': 'z',
+ 'ci_active_jobs': 'y',
+ 'ci_active_pipelines': 'x',
+ 'ci_project_subscriptions': 'w',
+ 'ci_pipeline_schedules': 'v',
+ 'ci_needs_size_limit': 'u',
+ 'ci_registered_group_runners': 't',
+ 'ci_registered_project_runners': 's',
'conan_max_file_size': 'a',
'generic_packages_max_file_size': 'b',
'helm_max_file_size': 'h',
@@ -138,11 +182,20 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'npm_max_file_size': 'd',
'nuget_max_file_size': 'e',
'pypi_max_file_size': 'f',
- 'terraform_module_max_file_size': 'g'
+ 'terraform_module_max_file_size': 'g',
+ 'storage_size_limit': 'j'
}
expect(response).to have_gitlab_http_status(:bad_request)
expect(json_response['error']).to include(
+ 'ci_pipeline_size is invalid',
+ 'ci_active_jobs is invalid',
+ 'ci_active_pipelines is invalid',
+ 'ci_project_subscriptions is invalid',
+ 'ci_pipeline_schedules is invalid',
+ 'ci_needs_size_limit is invalid',
+ 'ci_registered_group_runners is invalid',
+ 'ci_registered_project_runners is invalid',
'conan_max_file_size is invalid',
'generic_packages_max_file_size is invalid',
'helm_max_file_size is invalid',
@@ -150,7 +203,8 @@ RSpec.describe API::Admin::PlanLimits, 'PlanLimits' do
'npm_max_file_size is invalid',
'nuget_max_file_size is invalid',
'pypi_max_file_size is invalid',
- 'terraform_module_max_file_size is invalid'
+ 'terraform_module_max_file_size is invalid',
+ 'storage_size_limit is invalid'
)
end
end
diff --git a/spec/requests/api/ci/job_artifacts_spec.rb b/spec/requests/api/ci/job_artifacts_spec.rb
index 68b44bb89e0..1dd1ca4e115 100644
--- a/spec/requests/api/ci/job_artifacts_spec.rb
+++ b/spec/requests/api/ci/job_artifacts_spec.rb
@@ -263,6 +263,9 @@ RSpec.describe API::Ci::JobArtifacts do
'Content-Disposition' => %q(attachment; filename="ci_build_artifacts.zip"; filename*=UTF-8''ci_build_artifacts.zip) }
end
+ let(:expected_params) { { artifact_size: job.artifacts_file.size } }
+ let(:subject_proc) { proc { subject } }
+
it 'returns specific job artifacts' do
subject
@@ -270,6 +273,9 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response.headers.to_h).to include(download_headers)
expect(response.body).to match_file(job.artifacts_file.file.file)
end
+
+ it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'not executing any extra queries for the application context'
end
context 'normal authentication' do
@@ -558,7 +564,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
end
end
@@ -628,7 +635,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
expect(response.parsed_body).to be_empty
end
end
@@ -646,7 +654,8 @@ RSpec.describe API::Ci::JobArtifacts do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h)
.to include('Content-Type' => 'application/json',
- 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/)
+ 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/,
+ 'Gitlab-Workhorse-Detect-Content-Type' => 'true')
end
end
diff --git a/spec/requests/api/ci/jobs_spec.rb b/spec/requests/api/ci/jobs_spec.rb
index d3820e4948e..4bd9f81fd1d 100644
--- a/spec/requests/api/ci/jobs_spec.rb
+++ b/spec/requests/api/ci/jobs_spec.rb
@@ -471,7 +471,7 @@ RSpec.describe API::Ci::Jobs do
end
context 'authorized user' do
- context 'when trace is in ObjectStorage' do
+ context 'when log is in ObjectStorage' do
let!(:job) { create(:ci_build, :trace_artifact, pipeline: pipeline) }
let(:url) { 'http://object-storage/trace' }
let(:file_path) { expand_fixture_path('trace/sample_trace') }
@@ -485,49 +485,49 @@ RSpec.describe API::Ci::Jobs do
end
end
- it 'returns specific job trace' do
+ it 'returns specific job logs' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to eq(job.trace.raw)
end
end
- context 'when trace is artifact' do
+ context 'when log is artifact' do
let(:job) { create(:ci_build, :trace_artifact, pipeline: pipeline) }
- it 'returns specific job trace' do
+ it 'returns specific job log' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to eq(job.trace.raw)
end
end
- context 'when live trace and uploadless trace artifact' do
+ context 'when incremental logging and uploadless log artifact' do
let(:job) { create(:ci_build, :trace_live, :unarchived_trace_artifact, pipeline: pipeline) }
- it 'returns specific job trace' do
+ it 'returns specific job log' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to eq(job.trace.raw)
end
end
- context 'when trace is live' do
+ context 'when log is incremental' do
let(:job) { create(:ci_build, :trace_live, pipeline: pipeline) }
- it 'returns specific job trace' do
+ it 'returns specific job log' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to eq(job.trace.raw)
end
end
- context 'when no trace' do
+ context 'when no log' do
let(:job) { create(:ci_build, pipeline: pipeline) }
- it 'returns empty trace' do
+ it 'returns empty log' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.body).to be_empty
end
end
- context 'when trace artifact record exists with no stored file' do
+ context 'when log artifact record exists with no stored file' do
let(:job) { create(:ci_build, pipeline: pipeline) }
before do
@@ -544,7 +544,7 @@ RSpec.describe API::Ci::Jobs do
context 'unauthorized user' do
let(:api_user) { nil }
- it 'does not return specific job trace' do
+ it 'does not return specific job log' do
expect(response).to have_gitlab_http_status(:unauthorized)
end
end
diff --git a/spec/requests/api/ci/resource_groups_spec.rb b/spec/requests/api/ci/resource_groups_spec.rb
index f5b68557a0d..864c363e6d3 100644
--- a/spec/requests/api/ci/resource_groups_spec.rb
+++ b/spec/requests/api/ci/resource_groups_spec.rb
@@ -9,6 +9,36 @@ RSpec.describe API::Ci::ResourceGroups do
let(:user) { developer }
+ describe 'GET /projects/:id/resource_groups' do
+ subject { get api("/projects/#{project.id}/resource_groups", user) }
+
+ let!(:resource_groups) { create_list(:ci_resource_group, 3, project: project) }
+
+ it 'returns all resource groups for this project', :aggregate_failures do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ resource_groups.each_index do |i|
+ expect(json_response[i]['id']).to eq(resource_groups[i].id)
+ expect(json_response[i]['key']).to eq(resource_groups[i].key)
+ expect(json_response[i]['process_mode']).to eq(resource_groups[i].process_mode)
+ expect(Time.parse(json_response[i]['created_at'])).to be_like_time(resource_groups[i].created_at)
+ expect(Time.parse(json_response[i]['updated_at'])).to be_like_time(resource_groups[i].updated_at)
+ end
+ end
+
+ context 'when user is reporter' do
+ let(:user) { reporter }
+
+ it 'returns forbidden' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
describe 'GET /projects/:id/resource_groups/:key' do
subject { get api("/projects/#{project.id}/resource_groups/#{key}", user) }
diff --git a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
index f627f207d98..5767fa4326e 100644
--- a/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_artifacts_spec.rb
@@ -7,8 +7,20 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
include RedisHelpers
include WorkhorseHelpers
+ let_it_be_with_reload(:parent_group) { create(:group) }
+ let_it_be_with_reload(:group) { create(:group, parent: parent_group) }
+ let_it_be_with_reload(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
+
+ let_it_be(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
+ let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) }
+ let_it_be(:user) { create(:user) }
+
let(:registration_token) { 'abcdefg123456' }
+ before_all do
+ project.add_developer(user)
+ end
+
before do
stub_feature_flags(ci_enable_live_trace: true)
stub_gitlab_calls
@@ -17,12 +29,6 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
describe '/api/v4/jobs' do
- let(:parent_group) { create(:group) }
- let(:group) { create(:group, parent: parent_group) }
- let(:project) { create(:project, namespace: group, shared_runners_enabled: false) }
- let(:pipeline) { create(:ci_pipeline, project: project, ref: 'master') }
- let(:runner) { create(:ci_runner, :project, projects: [project]) }
- let(:user) { create(:user) }
let(:job) do
create(:ci_build, :artifacts, :extended_options,
pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0)
@@ -571,14 +577,21 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
context 'when artifact_type is archive' do
context 'when artifact_format is zip' do
+ subject(:request) { upload_artifacts(file_upload, headers_with_token, params) }
+
let(:params) { { artifact_type: :archive, artifact_format: :zip } }
+ let(:expected_params) { { artifact_size: job.reload.artifacts_size } }
+ let(:subject_proc) { proc { subject } }
it 'stores junit test report' do
- upload_artifacts(file_upload, headers_with_token, params)
+ subject
expect(response).to have_gitlab_http_status(:created)
expect(job.reload.job_artifacts_archive).not_to be_nil
end
+
+ it_behaves_like 'storing arguments in the application context'
+ it_behaves_like 'not executing any extra queries for the application context'
end
context 'when artifact_format is gzip' do
@@ -817,25 +830,23 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
context 'when job has artifacts' do
- let(:job) { create(:ci_build) }
+ let(:job) { create(:ci_build, pipeline: pipeline, user: user) }
let(:store) { JobArtifactUploader::Store::LOCAL }
before do
create(:ci_job_artifact, :archive, file_store: store, job: job)
end
- context 'when using job token' do
+ shared_examples 'successful artifact download' do
context 'when artifacts are stored locally' do
let(:download_headers) do
{ 'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' => %q(attachment; filename="ci_build_artifacts.zip"; filename*=UTF-8''ci_build_artifacts.zip) }
end
- before do
+ it 'downloads artifacts' do
download_artifact
- end
- it 'download artifacts' do
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers.to_h).to include download_headers
end
@@ -843,26 +854,20 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
context 'when artifacts are stored remotely' do
let(:store) { JobArtifactUploader::Store::REMOTE }
- let!(:job) { create(:ci_build) }
context 'when proxy download is being used' do
- before do
+ it 'uses workhorse send-url' do
download_artifact(direct_download: false)
- end
- it 'uses workhorse send-url' do
expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers.to_h).to include(
- 'Gitlab-Workhorse-Send-Data' => /send-url:/)
+ expect(response.headers.to_h).to include('Gitlab-Workhorse-Send-Data' => /send-url:/)
end
end
context 'when direct download is being used' do
- before do
+ it 'receives redirect for downloading artifacts' do
download_artifact(direct_download: true)
- end
- it 'receive redirect for downloading artifacts' do
expect(response).to have_gitlab_http_status(:found)
expect(response.headers).to include('Location')
end
@@ -870,16 +875,119 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
end
end
- context 'when using runnners token' do
- let(:token) { job.project.runners_token }
+ shared_examples 'forbidden request' do
+ it 'responds with forbidden' do
+ download_artifact
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when using job token' do
+ let(:token) { job.token }
+
+ it_behaves_like 'successful artifact download'
+
+ context 'when the job is no longer running' do
+ before do
+ job.success!
+ end
+
+ it_behaves_like 'successful artifact download'
+ end
+ end
+
+ context 'when using token belonging to the dependent job' do
+ let!(:dependent_job) { create(:ci_build, :running, :dependent, user: user, pipeline: pipeline) }
+ let!(:job) { dependent_job.all_dependencies.first }
+
+ let(:token) { dependent_job.token }
+
+ it_behaves_like 'successful artifact download'
+
+ context 'when the dependent job is no longer running' do
+ before do
+ dependent_job.success!
+ end
+
+ it_behaves_like 'forbidden request'
+ end
+ end
+
+ context 'when using token belonging to another job created by another project member' do
+ let!(:ci_build) { create(:ci_build, :running, :dependent, user: user, pipeline: pipeline) }
+ let!(:job) { ci_build.all_dependencies.first }
+
+ let!(:another_dev) { create(:user) }
+
+ let(:token) { ci_build.token }
before do
- download_artifact
+ project.add_developer(another_dev)
+ ci_build.update!(user: another_dev)
end
- it 'responds with forbidden' do
- expect(response).to have_gitlab_http_status(:forbidden)
+ it_behaves_like 'successful artifact download'
+ end
+
+ context 'when using token belonging to a pending dependent job' do
+ let!(:ci_build) { create(:ci_build, :pending, :dependent, user: user, project: project, pipeline: pipeline) }
+ let!(:job) { ci_build.all_dependencies.first }
+
+ let(:token) { ci_build.token }
+
+ it_behaves_like 'forbidden request'
+ end
+
+ context 'when using a token from a cross pipeline build' do
+ let!(:ci_build) { create(:ci_build, :pending, :dependent, user: user, project: project, pipeline: pipeline) }
+ let!(:job) { ci_build.all_dependencies.first }
+
+ let!(:options) do
+ {
+ cross_dependencies: [
+ {
+ pipeline: pipeline.id,
+ job: job.name,
+ artifacts: true
+ }
+ ]
+
+ }
end
+
+ let!(:cross_pipeline) { create(:ci_pipeline, project: project, child_of: pipeline) }
+ let!(:cross_pipeline_build) { create(:ci_build, :running, project: project, user: user, options: options, pipeline: cross_pipeline) }
+
+ let(:token) { cross_pipeline_build.token }
+
+ before do
+ job.success!
+ end
+
+ it_behaves_like 'successful artifact download'
+ end
+
+ context 'when using a token from an unrelated project' do
+ let!(:ci_build) { create(:ci_build, :running, :dependent, user: user, project: project, pipeline: pipeline) }
+ let!(:job) { ci_build.all_dependencies.first }
+
+ let!(:unrelated_ci_build) { create(:ci_build, :running, user: create(:user)) }
+ let(:token) { unrelated_ci_build.token }
+
+ it_behaves_like 'forbidden request'
+ end
+
+ context 'when using runnners token' do
+ let(:token) { job.project.runners_token }
+
+ it_behaves_like 'forbidden request'
+ end
+
+ context 'when using an invalid token' do
+ let(:token) { 'invalid-token' }
+
+ it_behaves_like 'forbidden request'
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 a662c77e5a2..dbc5f0e74e2 100644
--- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb
@@ -496,15 +496,15 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
job2.success
end
- it 'returns dependent jobs' do
+ it 'returns dependent jobs with the token of the test job' do
request_job
expect(response).to have_gitlab_http_status(:created)
expect(json_response['id']).to eq(test_job.id)
expect(json_response['dependencies'].count).to eq(2)
expect(json_response['dependencies']).to include(
- { 'id' => job.id, 'name' => job.name, 'token' => job.token },
- { 'id' => job2.id, 'name' => job2.name, 'token' => job2.token })
+ { 'id' => job.id, 'name' => job.name, 'token' => test_job.token },
+ { 'id' => job2.id, 'name' => job2.name, 'token' => test_job.token })
end
describe 'preloading job_artifacts_archive' do
@@ -526,14 +526,14 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
job.success
end
- it 'returns dependent jobs' do
+ it 'returns dependent jobs with the token of the test job' do
request_job
expect(response).to have_gitlab_http_status(:created)
expect(json_response['id']).to eq(test_job.id)
expect(json_response['dependencies'].count).to eq(1)
expect(json_response['dependencies']).to include(
- { 'id' => job.id, 'name' => job.name, 'token' => job.token,
+ { 'id' => job.id, 'name' => job.name, 'token' => test_job.token,
'artifacts_file' => { 'filename' => 'ci_build_artifacts.zip', 'size' => 107464 } })
end
end
@@ -552,13 +552,13 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do
job2.success
end
- it 'returns dependent jobs' do
+ it 'returns dependent jobs with the token of the test job' do
request_job
expect(response).to have_gitlab_http_status(:created)
expect(json_response['id']).to eq(test_job.id)
expect(json_response['dependencies'].count).to eq(1)
- expect(json_response['dependencies'][0]).to include('id' => job2.id, 'name' => job2.name, 'token' => job2.token)
+ expect(json_response['dependencies'][0]).to include('id' => job2.id, 'name' => job2.name, 'token' => test_job.token)
end
end
diff --git a/spec/requests/api/ci/runner/jobs_trace_spec.rb b/spec/requests/api/ci/runner/jobs_trace_spec.rb
index d6928969beb..c3c074d80d9 100644
--- a/spec/requests/api/ci/runner/jobs_trace_spec.rb
+++ b/spec/requests/api/ci/runner/jobs_trace_spec.rb
@@ -272,7 +272,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do
it { expect(response).to have_gitlab_http_status(:forbidden) }
end
- context 'when the job trace is too big' do
+ context 'when the job log is too big' do
before do
project.actual_limits.update!(ci_jobs_trace_size_limit: 1)
end
diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb
index d6ebc197ab0..3000bdc2ce7 100644
--- a/spec/requests/api/ci/runners_spec.rb
+++ b/spec/requests/api/ci/runners_spec.rb
@@ -274,7 +274,7 @@ RSpec.describe API::Ci::Runners do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['description']).to eq(shared_runner.description)
expect(json_response['maximum_timeout']).to be_nil
- expect(json_response['status']).to eq("not_connected")
+ expect(json_response['status']).to eq('never_contacted')
expect(json_response['active']).to eq(true)
expect(json_response['paused']).to eq(false)
end
@@ -1216,15 +1216,6 @@ RSpec.describe API::Ci::Runners do
end
end
end
-
- it 'enables a instance type runner' do
- expect do
- post api("/projects/#{project.id}/runners", admin), params: { runner_id: shared_runner.id }
- end.to change { project.runners.count }.by(1)
-
- expect(shared_runner.reload).not_to be_instance_type
- expect(response).to have_gitlab_http_status(:created)
- end
end
it 'raises an error when no runner_id param is provided' do
diff --git a/spec/requests/api/ci/secure_files_spec.rb b/spec/requests/api/ci/secure_files_spec.rb
index 6de6d1ef222..6f16fe5460b 100644
--- a/spec/requests/api/ci/secure_files_spec.rb
+++ b/spec/requests/api/ci/secure_files_spec.rb
@@ -143,7 +143,6 @@ RSpec.describe API::Ci::SecureFiles do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq(secure_file.name)
- expect(json_response['permissions']).to eq(secure_file.permissions)
end
it 'responds with 404 Not Found if requesting non-existing secure file' do
@@ -159,7 +158,6 @@ RSpec.describe API::Ci::SecureFiles do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['name']).to eq(secure_file.name)
- expect(json_response['permissions']).to eq(secure_file.permissions)
end
end
@@ -250,12 +248,11 @@ RSpec.describe API::Ci::SecureFiles do
context 'authenticated user with admin permissions' do
it 'creates a secure file' do
expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: file_params.merge(permissions: 'execute')
+ post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
end.to change {project.secure_files.count}.by(1)
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq('upload-keystore.jks')
- expect(json_response['permissions']).to eq('execute')
expect(json_response['checksum']).to eq(secure_file.checksum)
expect(json_response['checksum_algorithm']).to eq('sha256')
@@ -267,14 +264,6 @@ RSpec.describe API::Ci::SecureFiles do
expect(Time.parse(json_response['created_at'])).to be_like_time(secure_file.created_at)
end
- it 'creates a secure file with read_only permissions by default' do
- expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
- end.to change {project.secure_files.count}.by(1)
-
- expect(json_response['permissions']).to eq('read_only')
- end
-
it 'uploads and downloads a secure file' do
post api("/projects/#{project.id}/secure_files", maintainer), params: file_params
@@ -327,15 +316,6 @@ RSpec.describe API::Ci::SecureFiles do
expect(json_response['message']['name']).to include('has already been taken')
end
- it 'returns an error when an unexpected permission is supplied' do
- expect do
- post api("/projects/#{project.id}/secure_files", maintainer), params: file_params.merge(permissions: 'foo')
- end.not_to change { project.secure_files.count }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('permissions does not have a valid value')
- end
-
it 'returns an error when an unexpected validation failure happens' do
allow_next_instance_of(Ci::SecureFile) do |instance|
allow(instance).to receive(:valid?).and_return(false)
diff --git a/spec/requests/api/clusters/agent_tokens_spec.rb b/spec/requests/api/clusters/agent_tokens_spec.rb
new file mode 100644
index 00000000000..ba26faa45a3
--- /dev/null
+++ b/spec/requests/api/clusters/agent_tokens_spec.rb
@@ -0,0 +1,179 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Clusters::AgentTokens do
+ let_it_be(:agent) { create(:cluster_agent) }
+ let_it_be(:agent_token_one) { create(:cluster_agent_token, agent: agent) }
+ let_it_be(:agent_token_two) { create(:cluster_agent_token, agent: agent) }
+ let_it_be(:project) { agent.project }
+ let_it_be(:user) { agent.created_by_user }
+ let_it_be(:unauthorized_user) { create(:user) }
+
+ before_all do
+ project.add_maintainer(user)
+ project.add_guest(unauthorized_user)
+ end
+
+ describe 'GET /projects/:id/cluster_agents/:agent_id/tokens' do
+ context 'with authorized user' do
+ it 'returns tokens' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(response).to match_response_schema('public_api/v4/agent_tokens')
+ expect(json_response.count).to eq(2)
+ expect(json_response.first['name']).to eq(agent_token_one.name)
+ expect(json_response.first['agent_id']).to eq(agent.id)
+ expect(json_response.second['name']).to eq(agent_token_two.name)
+ expect(json_response.second['agent_id']).to eq(agent.id)
+ end
+ end
+ end
+
+ context 'with unauthorized user' do
+ it 'cannot access agent tokens' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ it 'avoids N+1 queries', :request_store do
+ # Establish baseline
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user)
+
+ control = ActiveRecord::QueryRecorder.new do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user)
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+
+ # Now create a second record and ensure that the API does not execute
+ # any more queries than before
+ create(:cluster_agent_token, agent: agent)
+
+ expect do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user)
+ end.not_to exceed_query_limit(control)
+ end
+ end
+
+ describe 'GET /projects/:id/cluster_agents/:agent_id/tokens/:token_id' do
+ context 'with authorized user' do
+ it 'returns an agent token' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{agent_token_one.id}", user)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/agent_token')
+ expect(json_response['id']).to eq(agent_token_one.id)
+ expect(json_response['name']).to eq(agent_token_one.name)
+ expect(json_response['agent_id']).to eq(agent.id)
+ end
+ end
+
+ it 'returns a 404 error if agent token id is not available' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{non_existing_record_id}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'with unauthorized user' do
+ it 'cannot access single agent token' do
+ get api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{agent_token_one.id}", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+
+ it 'cannot access token from agent of another project' do
+ another_project = create(:project, namespace: unauthorized_user.namespace)
+ another_agent = create(:cluster_agent, project: another_project, created_by_user: unauthorized_user)
+
+ get api("/projects/#{another_project.id}/cluster_agents/#{another_agent.id}/tokens/#{agent_token_one.id}",
+ unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+ end
+
+ describe 'POST /projects/:id/cluster_agents/:agent_id/tokens' do
+ it 'creates a new agent token' do
+ params = {
+ name: 'test-token',
+ description: 'Test description'
+ }
+ post(api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user), params: params)
+
+ aggregate_failures "testing response" do
+ expect(response).to have_gitlab_http_status(:created)
+ expect(response).to match_response_schema('public_api/v4/agent_token_with_token')
+ expect(json_response['name']).to eq(params[:name])
+ expect(json_response['description']).to eq(params[:description])
+ expect(json_response['agent_id']).to eq(agent.id)
+ end
+ end
+
+ it 'returns a 400 error if name not given' do
+ post api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ end
+
+ it 'returns 404 error if project does not exist' do
+ post api("/projects/#{non_existing_record_id}/cluster_agents/tokens", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns 404 error if agent does not exist' do
+ post api("/projects/#{project.id}/cluster_agents/#{non_existing_record_id}/tokens", user),
+ params: { name: "some" }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ context 'with unauthorized user' do
+ it 'prevents to create agent token' do
+ post api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens", unauthorized_user),
+ params: { name: "some" }
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+ end
+
+ describe 'DELETE /projects/:id/cluster_agents/:agent_id/tokens/:token_id' do
+ it 'revokes agent token' do
+ delete api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{agent_token_one.id}", user)
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ expect(agent_token_one.reload).to be_revoked
+ end
+
+ it 'returns a 404 error when revoking non existent agent token' do
+ delete api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{non_existing_record_id}", user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ it 'returns a 404 if the user is unauthorized to revoke' do
+ delete api("/projects/#{project.id}/cluster_agents/#{agent.id}/tokens/#{agent_token_one.id}", unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+
+ it 'cannot revoke token from agent of another project' do
+ another_project = create(:project, namespace: unauthorized_user.namespace)
+ another_agent = create(:cluster_agent, project: another_project, created_by_user: unauthorized_user)
+
+ delete api("/projects/#{another_project.id}/cluster_agents/#{another_agent.id}/tokens/#{agent_token_one.id}",
+ unauthorized_user)
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+end
diff --git a/spec/requests/api/container_registry_event_spec.rb b/spec/requests/api/container_registry_event_spec.rb
index 4d38ddddffd..767e6e0b2ff 100644
--- a/spec/requests/api/container_registry_event_spec.rb
+++ b/spec/requests/api/container_registry_event_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe API::ContainerRegistryEvent do
allow(Gitlab.config.registry).to receive(:notification_secret) { secret_token }
end
- subject do
+ subject(:post_events) do
post api('/container_registry_event/events'),
params: { events: events }.to_json,
headers: registry_headers.merge('Authorization' => secret_token)
@@ -23,7 +23,7 @@ RSpec.describe API::ContainerRegistryEvent do
allow(::ContainerRegistry::Event).to receive(:new).and_return(event)
expect(event).to receive(:supported?).and_return(true)
- subject
+ post_events
expect(event).to have_received(:handle!).once
expect(event).to have_received(:track!).once
@@ -37,5 +37,37 @@ RSpec.describe API::ContainerRegistryEvent do
expect(response).to have_gitlab_http_status(:unauthorized)
end
+
+ context 'when the event should update project statistics' do
+ let_it_be(:project) { create(:project) }
+
+ let(:events) do
+ [
+ {
+ action: 'push',
+ target: {
+ tag: 'latest',
+ repository: project.full_path
+ }
+ },
+ {
+ action: 'delete',
+ target: {
+ tag: 'latest',
+ repository: project.full_path
+ }
+ }
+ ]
+ end
+
+ it 'enqueues a project statistics update twice' do
+ expect(ProjectCacheWorker)
+ .to receive(:perform_async)
+ .with(project.id, [], [:container_registry_size])
+ .twice.and_call_original
+
+ expect { post_events }.to change { ProjectCacheWorker.jobs.size }.from(0).to(1)
+ end
+ end
end
end
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb
index 5fb24dc91a4..8328b454122 100644
--- a/spec/requests/api/environments_spec.rb
+++ b/spec/requests/api/environments_spec.rb
@@ -23,6 +23,7 @@ RSpec.describe API::Environments do
expect(json_response).to be_an Array
expect(json_response.size).to eq(1)
expect(json_response.first['name']).to eq(environment.name)
+ 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)
@@ -150,6 +151,13 @@ RSpec.describe API::Environments do
expect(json_response).to be_an Array
expect(json_response.size).to eq(0)
end
+
+ it 'returns a 400 status code with invalid states' do
+ get api("/projects/#{project.id}/environments?states=test", user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to include('Requested states are invalid')
+ end
end
end
@@ -165,12 +173,13 @@ RSpec.describe API::Environments do
describe 'POST /projects/:id/environments' do
context 'as a member' do
it 'creates a environment with valid params' do
- post api("/projects/#{project.id}/environments", user), params: { name: "mepmep" }
+ post api("/projects/#{project.id}/environments", user), params: { name: "mepmep", tier: 'staging' }
expect(response).to have_gitlab_http_status(:created)
expect(response).to match_response_schema('public_api/v4/environment')
expect(json_response['name']).to eq('mepmep')
expect(json_response['slug']).to eq('mepmep')
+ expect(json_response['tier']).to eq('staging')
expect(json_response['external']).to be nil
end
@@ -219,6 +228,15 @@ RSpec.describe API::Environments do
expect(json_response['external_url']).to eq(url)
end
+ it 'returns a 200 if tier is changed' do
+ put api("/projects/#{project.id}/environments/#{environment.id}", user),
+ params: { tier: 'production' }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('public_api/v4/environment')
+ expect(json_response['tier']).to eq('production')
+ end
+
it "won't allow slug to be changed" do
slug = environment.slug
api_url = api("/projects/#{project.id}/environments/#{environment.id}", user)
diff --git a/spec/requests/api/error_tracking/client_keys_spec.rb b/spec/requests/api/error_tracking/client_keys_spec.rb
index 00c1e8799e6..ba4d713dff2 100644
--- a/spec/requests/api/error_tracking/client_keys_spec.rb
+++ b/spec/requests/api/error_tracking/client_keys_spec.rb
@@ -81,6 +81,10 @@ RSpec.describe API::ErrorTracking::ClientKeys do
it 'returns a correct status' do
expect(response).to have_gitlab_http_status(:ok)
end
+
+ it 'returns specific fields using the entity' do
+ expect(json_response.keys).to match_array(%w[id active public_key sentry_dsn])
+ end
end
end
end
diff --git a/spec/requests/api/error_tracking/collector_spec.rb b/spec/requests/api/error_tracking/collector_spec.rb
index fa0b238dcad..c0d7eb5460f 100644
--- a/spec/requests/api/error_tracking/collector_spec.rb
+++ b/spec/requests/api/error_tracking/collector_spec.rb
@@ -152,7 +152,17 @@ RSpec.describe API::ErrorTracking::Collector do
context 'collector fails with validation error' do
before do
allow(::ErrorTracking::CollectErrorService)
- .to receive(:new).and_raise(ActiveRecord::RecordInvalid)
+ .to receive(:new).and_raise(Gitlab::ErrorTracking::ErrorRepository::DatabaseError)
+ end
+
+ it_behaves_like 'bad request'
+ end
+
+ context 'with platform field too long' do
+ let(:params) do
+ event = Gitlab::Json.parse(raw_event)
+ event['platform'] = 'a' * 256
+ Gitlab::Json.dump(event)
end
it_behaves_like 'bad request'
diff --git a/spec/requests/api/features_spec.rb b/spec/requests/api/features_spec.rb
index a265f67115a..4e75b0510d0 100644
--- a/spec/requests/api/features_spec.rb
+++ b/spec/requests/api/features_spec.rb
@@ -26,6 +26,7 @@ RSpec.describe API::Features, stub_feature_flags: false do
end
skip_feature_flags_yaml_validation
+ skip_default_enabled_yaml_check
end
describe 'GET /features' do
@@ -309,6 +310,55 @@ RSpec.describe API::Features, stub_feature_flags: false do
'definition' => known_feature_flag_definition_hash
)
end
+
+ describe 'mutually exclusive parameters' do
+ shared_examples 'fails to set the feature flag' do
+ it 'returns an error' do
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to match(/key, \w+ are mutually exclusive/)
+ end
+ end
+
+ context 'when key and feature_group are provided' do
+ before do
+ post api("/features/#{feature_name}", admin), params: { value: '0.01', key: 'percentage_of_actors', feature_group: 'some-value' }
+ end
+
+ it_behaves_like 'fails to set the feature flag'
+ end
+
+ context 'when key and user are provided' do
+ before do
+ post api("/features/#{feature_name}", admin), params: { value: '0.01', key: 'percentage_of_actors', user: 'some-user' }
+ end
+
+ it_behaves_like 'fails to set the feature flag'
+ end
+
+ context 'when key and group are provided' do
+ before do
+ post api("/features/#{feature_name}", admin), params: { value: '0.01', key: 'percentage_of_actors', group: 'somepath' }
+ end
+
+ it_behaves_like 'fails to set the feature flag'
+ end
+
+ context 'when key and namespace are provided' do
+ before do
+ post api("/features/#{feature_name}", admin), params: { value: '0.01', key: 'percentage_of_actors', namespace: 'somepath' }
+ end
+
+ it_behaves_like 'fails to set the feature flag'
+ end
+
+ context 'when key and project are provided' do
+ before do
+ post api("/features/#{feature_name}", admin), params: { value: '0.01', key: 'percentage_of_actors', project: 'somepath' }
+ end
+
+ it_behaves_like 'fails to set the feature flag'
+ end
+ end
end
context 'when the feature exists' do
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index cb0b5f6bfc3..06d22e7e218 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -462,6 +462,66 @@ RSpec.describe API::Files do
expect(range['commit']['committer_email']).to eq('dmitriy.zaporozhets@gmail.com')
end
+ context 'with a range parameter' do
+ let(:params) { super().merge(range: { start: 2, end: 4 }) }
+
+ it 'returns file blame attributes as json for the range' do
+ get api(route(file_path) + '/blame', current_user), params: params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.size).to eq(2)
+
+ lines = json_response.map { |x| x['lines'] }
+
+ expect(lines.map(&:size)).to eq(expected_blame_range_sizes[1..2])
+ expect(lines.flatten).to eq(["require 'open3'", '', 'module Popen'])
+ end
+
+ context 'when start > end' do
+ let(:params) { super().merge(range: { start: 4, end: 2 }) }
+
+ it 'returns 400 error' do
+ get api(route(file_path) + '/blame', current_user), params: params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq('range[start] must be less than or equal to range[end]')
+ end
+ end
+
+ context 'when range is incomplete' do
+ let(:params) { super().merge(range: { start: 1 }) }
+
+ it 'returns 400 error' do
+ get api(route(file_path) + '/blame', current_user), params: params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('range[end] is missing, range[end] is empty')
+ end
+ end
+
+ context 'when range contains negative integers' do
+ let(:params) { super().merge(range: { start: -2, end: -5 }) }
+
+ it 'returns 400 error' do
+ get api(route(file_path) + '/blame', current_user), params: params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('range[start] does not have a valid value, range[end] does not have a valid value')
+ end
+ end
+
+ context 'when range is missing' do
+ let(:params) { super().merge(range: { start: '', end: '' }) }
+
+ it 'returns 400 error' do
+ get api(route(file_path) + '/blame', current_user), params: params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eq('range[start] is empty, range[end] is empty')
+ end
+ end
+ end
+
it 'returns blame file info for files with dots' do
url = route('.gitignore') + '/blame'
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 e8fb9daa43b..eb206465bce 100644
--- a/spec/requests/api/graphql/boards/board_lists_query_spec.rb
+++ b/spec/requests/api/graphql/boards/board_lists_query_spec.rb
@@ -69,6 +69,10 @@ RSpec.describe 'get board lists' do
let(:data_path) { [board_parent_type, :boards, :nodes, 0, :lists] }
+ def pagination_results_data(lists)
+ lists
+ end
+
def pagination_query(params)
graphql_query_for(
board_parent_type,
@@ -94,7 +98,7 @@ RSpec.describe 'get board lists' do
it_behaves_like 'sorted paginated query' do
let(:sort_param) { }
let(:first_param) { 2 }
- let(:all_records) { lists.map { |list| global_id_of(list) } }
+ let(:all_records) { lists.map { |list| a_graphql_entity_for(list) } }
end
end
end
diff --git a/spec/requests/api/graphql/ci/config_spec.rb b/spec/requests/api/graphql/ci/config_spec.rb
index 62b15a8396c..5f8a895b16e 100644
--- a/spec/requests/api/graphql/ci/config_spec.rb
+++ b/spec/requests/api/graphql/ci/config_spec.rb
@@ -4,6 +4,7 @@ require 'spec_helper'
RSpec.describe 'Query.ciConfig' do
include GraphqlHelpers
+ include StubRequests
subject(:post_graphql_query) { post_graphql(query, current_user: user) }
@@ -57,6 +58,16 @@ RSpec.describe 'Query.ciConfig' do
}
}
}
+ mergedYaml
+ includes {
+ type
+ location
+ blob
+ raw
+ extra
+ contextProject
+ contextSha
+ }
}
}
)
@@ -71,10 +82,12 @@ RSpec.describe 'Query.ciConfig' do
it 'returns the correct structure' do
post_graphql_query
- expect(graphql_data['ciConfig']).to eq(
+ expect(graphql_data['ciConfig']).to include(
"status" => "VALID",
"errors" => [],
"warnings" => [],
+ "includes" => [],
+ "mergedYaml" => a_kind_of(String),
"stages" =>
{
"nodes" =>
@@ -222,24 +235,6 @@ RSpec.describe 'Query.ciConfig' do
)
end
- context 'when using deprecated keywords' do
- let_it_be(:content) do
- YAML.dump(
- rspec: { script: 'ls', type: 'test' },
- types: ['test']
- )
- end
-
- it 'returns a warning' do
- post_graphql_query
-
- expect(graphql_data['ciConfig']['warnings']).to include(
- 'root `types` is deprecated in 9.0 and will be removed in 15.0.',
- 'jobs:rspec `type` is deprecated in 9.0 and will be removed in 15.0.'
- )
- end
- end
-
context 'when the config file includes other files' do
let_it_be(:content) do
YAML.dump(
@@ -271,6 +266,18 @@ RSpec.describe 'Query.ciConfig' do
"status" => "VALID",
"errors" => [],
"warnings" => [],
+ "includes" => [
+ {
+ "type" => "local",
+ "location" => "other_file.yml",
+ "blob" => "http://localhost/#{project.full_path}/-/blob/#{project.commit.sha}/other_file.yml",
+ "raw" => "http://localhost/#{project.full_path}/-/raw/#{project.commit.sha}/other_file.yml",
+ "extra" => {},
+ "contextProject" => project.full_path,
+ "contextSha" => project.commit.sha
+ }
+ ],
+ "mergedYaml" => "---\nbuild:\n script: build\nrspec:\n script: rspec\n",
"stages" =>
{
"nodes" =>
@@ -302,7 +309,7 @@ RSpec.describe 'Query.ciConfig' do
"when" => "on_success",
"tags" => [],
"needs" => { "nodes" => [] }
-}
+ }
]
}
},
@@ -337,4 +344,101 @@ RSpec.describe 'Query.ciConfig' do
)
end
end
+
+ context 'when the config file has multiple includes' do
+ let_it_be(:other_project) { create(:project, :repository, creator: user, namespace: user.namespace) }
+
+ let_it_be(:content) do
+ YAML.dump(
+ include: [
+ { local: 'other_file.yml' },
+ { remote: 'https://gitlab.com/gitlab-org/gitlab/raw/1234/.hello.yml' },
+ { file: 'other_project_file.yml', project: other_project.full_path },
+ { template: 'Jobs/Build.gitlab-ci.yml' }
+ ],
+ rspec: {
+ script: 'rspec'
+ }
+ )
+ end
+
+ let(:remote_file_content) do
+ YAML.dump(
+ remote_file_test: {
+ script: 'remote_file_test'
+ }
+ )
+ end
+
+ before do
+ allow_next_instance_of(Repository) do |repository|
+ allow(repository).to receive(:blob_data_at).with(an_instance_of(String), 'other_file.yml') do
+ YAML.dump(
+ build: {
+ script: 'build'
+ }
+ )
+ end
+
+ allow(repository).to receive(:blob_data_at).with(an_instance_of(String), 'other_project_file.yml') do
+ YAML.dump(
+ other_project_test: {
+ script: 'other_project_test'
+ }
+ )
+ end
+ end
+
+ stub_full_request('https://gitlab.com/gitlab-org/gitlab/raw/1234/.hello.yml').to_return(body: remote_file_content)
+
+ post_graphql_query
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ # rubocop:disable Layout/LineLength
+ it 'returns correct includes' do
+ expect(graphql_data['ciConfig']["includes"]).to eq(
+ [
+ {
+ "type" => "local",
+ "location" => "other_file.yml",
+ "blob" => "http://localhost/#{project.full_path}/-/blob/#{project.commit.sha}/other_file.yml",
+ "raw" => "http://localhost/#{project.full_path}/-/raw/#{project.commit.sha}/other_file.yml",
+ "extra" => {},
+ "contextProject" => project.full_path,
+ "contextSha" => project.commit.sha
+ },
+ {
+ "type" => "remote",
+ "location" => "https://gitlab.com/gitlab-org/gitlab/raw/1234/.hello.yml",
+ "blob" => nil,
+ "raw" => "https://gitlab.com/gitlab-org/gitlab/raw/1234/.hello.yml",
+ "extra" => {},
+ "contextProject" => project.full_path,
+ "contextSha" => project.commit.sha
+ },
+ {
+ "type" => "file",
+ "location" => "other_project_file.yml",
+ "blob" => "http://localhost/#{other_project.full_path}/-/blob/#{other_project.commit.sha}/other_project_file.yml",
+ "raw" => "http://localhost/#{other_project.full_path}/-/raw/#{other_project.commit.sha}/other_project_file.yml",
+ "extra" => { "project" => other_project.full_path, "ref" => "HEAD" },
+ "contextProject" => project.full_path,
+ "contextSha" => project.commit.sha
+ },
+ {
+ "type" => "template",
+ "location" => "Jobs/Build.gitlab-ci.yml",
+ "blob" => nil,
+ "raw" => "https://gitlab.com/gitlab-org/gitlab/-/raw/master/lib/gitlab/ci/templates/Jobs/Build.gitlab-ci.yml",
+ "extra" => {},
+ "contextProject" => project.full_path,
+ "contextSha" => project.commit.sha
+ }
+ ]
+ )
+ end
+ # rubocop:enable Layout/LineLength
+ end
end
diff --git a/spec/requests/api/graphql/ci/job_spec.rb b/spec/requests/api/graphql/ci/job_spec.rb
index ddb2664d353..2fb90dcd92b 100644
--- a/spec/requests/api/graphql/ci/job_spec.rb
+++ b/spec/requests/api/graphql/ci/job_spec.rb
@@ -47,10 +47,8 @@ RSpec.describe 'Query.project(fullPath).pipelines.job(id)' do
)
post_graphql(query, current_user: user)
- expect(graphql_data_at(*path)).to match a_hash_including(
- 'id' => global_id_of(job_2),
- 'name' => job_2.name,
- 'allowFailure' => job_2.allow_failure,
+ expect(graphql_data_at(*path)).to match a_graphql_entity_for(
+ job_2, :name, :allow_failure,
'duration' => 25,
'kind' => 'BUILD',
'queuedDuration' => 2.0,
@@ -66,10 +64,7 @@ RSpec.describe 'Query.project(fullPath).pipelines.job(id)' do
it 'retrieves scalar fields' do
post_graphql(query, current_user: user)
- expect(graphql_data_at(*path)).to match a_hash_including(
- 'id' => global_id_of(job_2),
- 'name' => job_2.name
- )
+ expect(graphql_data_at(*path)).to match a_graphql_entity_for(job_2, :name)
end
end
end
@@ -102,8 +97,8 @@ RSpec.describe 'Query.project(fullPath).pipelines.job(id)' do
'name' => test_stage.name,
'jobs' => a_hash_including(
'nodes' => contain_exactly(
- a_hash_including('id' => global_id_of(job_2)),
- a_hash_including('id' => global_id_of(job_3))
+ a_graphql_entity_for(job_2),
+ a_graphql_entity_for(job_3)
)
)
)
diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb
index 39f0f696b08..6fa455cbfca 100644
--- a/spec/requests/api/graphql/ci/runner_spec.rb
+++ b/spec/requests/api/graphql/ci/runner_spec.rb
@@ -11,7 +11,8 @@ RSpec.describe 'Query.runner(id)' do
let_it_be(:active_instance_runner) do
create(:ci_runner, :instance, description: 'Runner 1', contacted_at: 2.hours.ago,
active: true, version: 'adfe156', revision: 'a', locked: true, ip_address: '127.0.0.1', maximum_timeout: 600,
- access_level: 0, tag_list: %w[tag1 tag2], run_untagged: true, executor_type: :custom)
+ access_level: 0, tag_list: %w[tag1 tag2], run_untagged: true, executor_type: :custom,
+ maintenance_note: 'Test maintenance note')
end
let_it_be(:inactive_instance_runner) do
@@ -27,10 +28,6 @@ RSpec.describe 'Query.runner(id)' do
let_it_be(:active_project_runner) { create(:ci_runner, :project) }
- before do
- allow(Gitlab::Ci::RunnerUpgradeCheck.instance).to receive(:check_runner_upgrade_status)
- end
-
shared_examples 'runner details fetch' do
let(:query) do
wrap_fields(query_graphql_path(query_path, all_graphql_fields_for('CiRunner')))
@@ -66,6 +63,9 @@ RSpec.describe 'Query.runner(id)' do
'ipAddress' => runner.ip_address,
'runnerType' => runner.instance_type? ? 'INSTANCE_TYPE' : 'PROJECT_TYPE',
'executorName' => runner.executor_type&.dasherize,
+ 'architectureName' => runner.architecture,
+ 'platformName' => runner.platform,
+ 'maintenanceNote' => runner.maintenance_note,
'jobCount' => 0,
'jobs' => a_hash_including("count" => 0, "nodes" => [], "pageInfo" => anything),
'projectCount' => nil,
@@ -239,8 +239,8 @@ RSpec.describe 'Query.runner(id)' do
stale_runner_data = graphql_data_at(:stale_runner)
expect(stale_runner_data).to match a_hash_including(
- 'status' => 'NOT_CONNECTED',
- 'legacyStatusWithExplicitVersion' => 'NOT_CONNECTED',
+ 'status' => 'STALE',
+ 'legacyStatusWithExplicitVersion' => 'STALE',
'newStatus' => 'STALE'
)
@@ -253,8 +253,8 @@ RSpec.describe 'Query.runner(id)' do
never_contacted_instance_runner_data = graphql_data_at(:never_contacted_instance_runner)
expect(never_contacted_instance_runner_data).to match a_hash_including(
- 'status' => 'NOT_CONNECTED',
- 'legacyStatusWithExplicitVersion' => 'NOT_CONNECTED',
+ 'status' => 'NEVER_CONTACTED',
+ 'legacyStatusWithExplicitVersion' => 'NEVER_CONTACTED',
'newStatus' => 'NEVER_CONTACTED'
)
end
diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb
index 6b88c82b025..d3e94671724 100644
--- a/spec/requests/api/graphql/ci/runners_spec.rb
+++ b/spec/requests/api/graphql/ci/runners_spec.rb
@@ -56,9 +56,9 @@ RSpec.describe 'Query.runners' do
it_behaves_like 'a working graphql query returning expected runner'
end
- context 'runner_type is PROJECT_TYPE and status is NOT_CONNECTED' do
+ context 'runner_type is PROJECT_TYPE and status is NEVER_CONTACTED' do
let(:runner_type) { 'PROJECT_TYPE' }
- let(:status) { 'NOT_CONNECTED' }
+ let(:status) { 'NEVER_CONTACTED' }
let!(:expected_runner) { project_runner }
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 922a9ab277e..847fa72522e 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
@@ -127,7 +127,7 @@ RSpec.describe 'container repository details' do
let(:query) do
<<~GQL
- query($id: ID!, $n: Int) {
+ query($id: ContainerRepositoryID!, $n: Int) {
containerRepository(id: $id) {
tags(first: $n) {
edges {
@@ -157,7 +157,7 @@ RSpec.describe 'container repository details' do
let(:query) do
<<~GQL
- query($id: ID!, $n: ContainerRepositoryTagSort) {
+ query($id: ContainerRepositoryID!, $n: ContainerRepositoryTagSort) {
containerRepository(id: $id) {
tags(sort: $n) {
edges {
@@ -194,7 +194,7 @@ RSpec.describe 'container repository details' do
let(:query) do
<<~GQL
- query($id: ID!, $n: String) {
+ query($id: ContainerRepositoryID!, $n: String) {
containerRepository(id: $id) {
tags(name: $n) {
edges {
@@ -232,7 +232,7 @@ RSpec.describe 'container repository details' do
let(:query) do
<<~GQL
- query($id: ID!) {
+ query($id: ContainerRepositoryID!) {
containerRepository(id: $id) {
size
}
diff --git a/spec/requests/api/graphql/current_user_todos_spec.rb b/spec/requests/api/graphql/current_user_todos_spec.rb
index 7f37abba74a..da1c893ec2b 100644
--- a/spec/requests/api/graphql/current_user_todos_spec.rb
+++ b/spec/requests/api/graphql/current_user_todos_spec.rb
@@ -37,8 +37,8 @@ RSpec.describe 'A Todoable that implements the CurrentUserTodos interface' do
post_graphql(query, current_user: current_user)
expect(todoable_response).to contain_exactly(
- a_hash_including('id' => global_id_of(done_todo)),
- a_hash_including('id' => global_id_of(pending_todo))
+ a_graphql_entity_for(done_todo),
+ a_graphql_entity_for(pending_todo)
)
end
@@ -63,7 +63,7 @@ RSpec.describe 'A Todoable that implements the CurrentUserTodos interface' do
post_graphql(query, current_user: current_user)
expect(todoable_response).to contain_exactly(
- a_hash_including('id' => global_id_of(pending_todo))
+ a_graphql_entity_for(pending_todo)
)
end
end
@@ -75,7 +75,7 @@ RSpec.describe 'A Todoable that implements the CurrentUserTodos interface' do
post_graphql(query, current_user: current_user)
expect(todoable_response).to contain_exactly(
- a_hash_including('id' => global_id_of(done_todo))
+ a_graphql_entity_for(done_todo)
)
end
end
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 de3dbc5c324..d21c3046c1a 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
@@ -47,14 +47,14 @@ RSpec.describe 'getting dependency proxy settings for a group' do
context 'with different permissions' do
where(:group_visibility, :role, :access_granted) do
:private | :maintainer | true
- :private | :developer | true
- :private | :reporter | true
- :private | :guest | true
+ :private | :developer | false
+ :private | :reporter | false
+ :private | :guest | false
:private | :anonymous | false
:public | :maintainer | true
- :public | :developer | true
- :public | :reporter | true
- :public | :guest | true
+ :public | :developer | false
+ :public | :reporter | false
+ :public | :guest | false
:public | :anonymous | false
end
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 c8797d84906..40f4b082072 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
@@ -46,14 +46,14 @@ RSpec.describe 'getting dependency proxy image ttl policy for a group' do
context 'with different permissions' do
where(:group_visibility, :role, :access_granted) do
:private | :maintainer | true
- :private | :developer | true
- :private | :reporter | true
- :private | :guest | true
+ :private | :developer | false
+ :private | :reporter | false
+ :private | :guest | false
:private | :anonymous | false
:public | :maintainer | true
- :public | :developer | true
- :public | :reporter | true
- :public | :guest | true
+ :public | :developer | false
+ :public | :reporter | false
+ :public | :guest | false
:public | :anonymous | false
end
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 3527c8183f6..c7149c100b2 100644
--- a/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb
+++ b/spec/requests/api/graphql/group/dependency_proxy_manifests_spec.rb
@@ -122,12 +122,12 @@ RSpec.describe 'getting dependency proxy manifests in a group' do
let(:current_user) { owner }
context 'with default sorting' do
- let_it_be(:descending_manifests) { manifests.reverse.map { |manifest| global_id_of(manifest)} }
+ let_it_be(:descending_manifests) { manifests.reverse.map { |manifest| global_id_of(manifest) } }
it_behaves_like 'sorted paginated query' do
let(:sort_param) { '' }
let(:first_param) { 2 }
- let(:all_records) { descending_manifests }
+ let(:all_records) { descending_manifests.map(&:to_s) }
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 78852622835..fec866486ae 100644
--- a/spec/requests/api/graphql/group/group_members_spec.rb
+++ b/spec/requests/api/graphql/group/group_members_spec.rb
@@ -24,8 +24,8 @@ RSpec.describe 'getting group members information' do
expect(graphql_errors).to be_nil
expect(graphql_data_at(:group, :group_members, :edges, :node)).to contain_exactly(
- { 'user' => { 'id' => global_id_of(user_1) } },
- { 'user' => { 'id' => global_id_of(user_2) } },
+ { 'user' => a_graphql_entity_for(user_1) },
+ { 'user' => a_graphql_entity_for(user_2) },
'user' => nil
)
end
@@ -77,6 +77,48 @@ RSpec.describe 'getting group members information' do
end
end
+ context 'by access levels' do
+ before do
+ parent_group.add_owner(user_1)
+ parent_group.add_maintainer(user_2)
+ end
+
+ subject(:by_access_levels) { fetch_members(group: parent_group, args: { access_levels: access_levels }) }
+
+ context 'by owner' do
+ let(:access_levels) { :OWNER }
+
+ it 'returns owner' do
+ by_access_levels
+
+ expect(graphql_errors).to be_nil
+ expect_array_response(user_1)
+ end
+ end
+
+ context 'by maintainer' do
+ let(:access_levels) { :MAINTAINER }
+
+ it 'returns maintainer' do
+ by_access_levels
+
+ expect(graphql_errors).to be_nil
+ expect_array_response(user_2)
+ end
+ end
+
+ context 'by owner and maintainer' do
+ let(:access_levels) { [:OWNER, :MAINTAINER] }
+
+ it 'returns owner and maintainer' do
+ by_access_levels
+
+ expect(graphql_errors).to be_nil
+ expect_array_response(user_1, user_2)
+ end
+ end
+ end
+
context 'member relations' do
let_it_be(:child_group) { create(:group, :public, parent: parent_group) }
let_it_be(:grandchild_group) { create(:group, :public, parent: child_group) }
@@ -182,8 +224,8 @@ RSpec.describe 'getting group members information' do
def expect_array_response(*items)
expect(response).to have_gitlab_http_status(:success)
- member_gids = graphql_data_at(:group, :group_members, :edges, :node, :user, :id)
+ members = graphql_data_at(:group, :group_members, :edges, :node, :user)
- expect(member_gids).to match_array(items.map { |u| global_id_of(u) })
+ expect(members).to match_array(items.map { |u| a_graphql_entity_for(u) })
end
end
diff --git a/spec/requests/api/graphql/group/merge_requests_spec.rb b/spec/requests/api/graphql/group/merge_requests_spec.rb
index c0faff11c8d..434b0d16569 100644
--- a/spec/requests/api/graphql/group/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/group/merge_requests_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Query.group.mergeRequests' do
end
def expected_mrs(mrs)
- mrs.map { |mr| a_hash_including('id' => global_id_of(mr)) }
+ mrs.map { |mr| a_graphql_entity_for(mr) }
end
describe 'not passing any arguments' do
diff --git a/spec/requests/api/graphql/group/milestones_spec.rb b/spec/requests/api/graphql/group/milestones_spec.rb
index 2b80b5239c8..7c51409f907 100644
--- a/spec/requests/api/graphql/group/milestones_spec.rb
+++ b/spec/requests/api/graphql/group/milestones_spec.rb
@@ -170,10 +170,8 @@ RSpec.describe 'Milestones through GroupQuery' do
end
it 'returns correct values for scalar fields' do
- expect(post_query).to eq({
- 'id' => global_id_of(milestone),
- 'title' => milestone.title,
- 'description' => milestone.description,
+ expect(post_query).to match a_graphql_entity_for(
+ milestone, :title, :description,
'state' => 'active',
'webPath' => milestone_path(milestone),
'dueDate' => milestone.due_date.iso8601,
@@ -183,7 +181,7 @@ RSpec.describe 'Milestones through GroupQuery' do
'projectMilestone' => false,
'groupMilestone' => true,
'subgroupMilestone' => false
- })
+ )
end
context 'milestone statistics' do
diff --git a/spec/requests/api/graphql/issue/issue_spec.rb b/spec/requests/api/graphql/issue/issue_spec.rb
index 42ca3348384..05fd6bf3022 100644
--- a/spec/requests/api/graphql/issue/issue_spec.rb
+++ b/spec/requests/api/graphql/issue/issue_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe 'Query.issue(id)' do
let_it_be(:project) { create(:project) }
let_it_be(:issue) { create(:issue, project: project) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:issue_params) { { 'id' => issue.to_global_id.to_s } }
+ let(:issue_params) { { 'id' => global_id_of(issue) } }
let(:issue_data) { graphql_data['issue'] }
let(:issue_fields) { all_graphql_fields_for('Issue'.classify) }
@@ -100,7 +100,8 @@ RSpec.describe 'Query.issue(id)' do
let_it_be(:issue_fields) { ['moved', 'movedTo { title }'] }
let_it_be(:new_issue) { create(:issue) }
let_it_be(:issue) { create(:issue, project: project, moved_to: new_issue) }
- let_it_be(:issue_params) { { 'id' => issue.to_global_id.to_s } }
+
+ let(:issue_params) { { 'id' => global_id_of(issue) } }
before_all do
new_issue.project.add_developer(current_user)
diff --git a/spec/requests/api/graphql/merge_request/merge_request_spec.rb b/spec/requests/api/graphql/merge_request/merge_request_spec.rb
index 75dd01a0763..d89f381753e 100644
--- a/spec/requests/api/graphql/merge_request/merge_request_spec.rb
+++ b/spec/requests/api/graphql/merge_request/merge_request_spec.rb
@@ -8,8 +8,8 @@ RSpec.describe 'Query.merge_request(id)' do
let_it_be(:project) { create(:project, :empty_repo) }
let_it_be(:merge_request) { create(:merge_request, source_project: project) }
let_it_be(:current_user) { create(:user) }
- let_it_be(:merge_request_params) { { 'id' => merge_request.to_global_id.to_s } }
+ let(:merge_request_params) { { 'id' => global_id_of(merge_request) } }
let(:merge_request_data) { graphql_data['mergeRequest'] }
let(:merge_request_fields) { all_graphql_fields_for('MergeRequest'.classify) }
diff --git a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb b/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
deleted file mode 100644
index 30e7f196542..00000000000
--- a/spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'CiCdSettingsUpdate' do
- include GraphqlHelpers
-
- let_it_be(:project) do
- create(:project, keep_latest_artifact: true, ci_job_token_scope_enabled: true)
- .tap(&:save!)
- end
-
- let(:variables) do
- {
- full_path: project.full_path,
- keep_latest_artifact: false,
- job_token_scope_enabled: false
- }
- end
-
- let(:mutation) { graphql_mutation(:ci_cd_settings_update, variables) }
-
- context 'when unauthorized' do
- let(:user) { create(:user) }
-
- shared_examples 'unauthorized' do
- it 'returns an error' do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(graphql_errors).not_to be_empty
- end
- end
-
- context 'when not a project member' do
- it_behaves_like 'unauthorized'
- end
-
- context 'when a non-admin project member' do
- before do
- project.add_developer(user)
- end
-
- it_behaves_like 'unauthorized'
- end
- end
-
- context 'when authorized' do
- let_it_be(:user) { project.first_owner }
-
- it 'updates ci cd settings' do
- post_graphql_mutation(mutation, current_user: user)
-
- project.reload
-
- expect(response).to have_gitlab_http_status(:success)
- expect(project.keep_latest_artifact).to eq(false)
- end
-
- it 'updates job_token_scope_enabled' do
- post_graphql_mutation(mutation, current_user: user)
-
- project.reload
-
- expect(response).to have_gitlab_http_status(:success)
- expect(project.ci_job_token_scope_enabled).to eq(false)
- end
-
- it 'does not update job_token_scope_enabled if not specified' do
- variables.except!(:job_token_scope_enabled)
-
- post_graphql_mutation(mutation, current_user: user)
-
- project.reload
-
- expect(response).to have_gitlab_http_status(:success)
- expect(project.ci_job_token_scope_enabled).to eq(true)
- end
-
- context 'when bad arguments are provided' do
- let(:variables) { { full_path: '', keep_latest_artifact: false } }
-
- it 'returns the errors' do
- post_graphql_mutation(mutation, current_user: user)
-
- expect(graphql_errors).not_to be_empty
- end
- end
- end
-end
diff --git a/spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb b/spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb
new file mode 100644
index 00000000000..394d9ff53d1
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/ci/project_ci_cd_settings_update_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'ProjectCiCdSettingsUpdate' do
+ include GraphqlHelpers
+
+ let_it_be(:project) do
+ create(:project, keep_latest_artifact: true, ci_job_token_scope_enabled: true)
+ .tap(&:save!)
+ end
+
+ let(:variables) do
+ {
+ full_path: project.full_path,
+ keep_latest_artifact: false,
+ job_token_scope_enabled: false
+ }
+ end
+
+ let(:mutation) { graphql_mutation(:ci_cd_settings_update, variables) }
+
+ context 'when unauthorized' do
+ let(:user) { create(:user) }
+
+ shared_examples 'unauthorized' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+
+ context 'when not a project member' do
+ it_behaves_like 'unauthorized'
+ end
+
+ context 'when a non-admin project member' do
+ before do
+ project.add_developer(user)
+ end
+
+ it_behaves_like 'unauthorized'
+ end
+ end
+
+ context 'when authorized' do
+ let_it_be(:user) { project.first_owner }
+
+ it 'updates ci cd settings' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ project.reload
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(project.keep_latest_artifact).to eq(false)
+ end
+
+ it 'updates job_token_scope_enabled' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ project.reload
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(project.ci_job_token_scope_enabled).to eq(false)
+ end
+
+ it 'does not update job_token_scope_enabled if not specified' do
+ variables.except!(:job_token_scope_enabled)
+
+ post_graphql_mutation(mutation, current_user: user)
+
+ project.reload
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(project.ci_job_token_scope_enabled).to eq(true)
+ end
+
+ context 'when bad arguments are provided' do
+ let(:variables) { { full_path: '', keep_latest_artifact: false } }
+
+ it 'returns the errors' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
index 12368e7e9c5..6818ba33e74 100644
--- a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
+++ b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb
@@ -64,11 +64,10 @@ RSpec.describe 'RunnersRegistrationTokenReset' do
context 'applied to project' do
let_it_be(:project) { create_default(:project) }
+ let(:target) { project }
let(:input) { { type: 'PROJECT_TYPE', id: project.to_global_id.to_s } }
- include_context 'when unauthorized', 'project' do
- let(:target) { project }
- end
+ include_context('when unauthorized', 'project')
include_context 'when authorized', 'project' do
let_it_be(:user) { project.first_owner }
@@ -82,11 +81,10 @@ RSpec.describe 'RunnersRegistrationTokenReset' do
context 'applied to group' do
let_it_be(:group) { create_default(:group) }
+ let(:target) { group }
let(:input) { { type: 'GROUP_TYPE', id: group.to_global_id.to_s } }
- include_context 'when unauthorized', 'group' do
- let(:target) { group }
- end
+ include_context('when unauthorized', 'group')
include_context 'when authorized', 'group' do
let_it_be(:user) { create_default(:group_member, :owner, user: create(:user), group: group ).user }
@@ -99,10 +97,12 @@ RSpec.describe 'RunnersRegistrationTokenReset' do
context 'applied to instance' do
before do
- ApplicationSetting.create_from_defaults
+ target
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
end
+ let_it_be(:target) { ApplicationSetting.create_from_defaults }
+
let(:input) { { type: 'INSTANCE_TYPE' } }
context 'when unauthorized' do
diff --git a/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb b/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb
index 5f6822223ca..4891e64aab8 100644
--- a/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb
+++ b/spec/requests/api/graphql/mutations/clusters/agents/delete_spec.rb
@@ -26,7 +26,7 @@ RSpec.describe 'Delete a cluster agent' do
'or you don\'t have permission to perform this action']
it 'does not delete cluster agent' do
- expect { cluster_agent.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ expect { cluster_agent.reload }.not_to raise_error
end
end
diff --git a/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb b/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
index 0156142dc6f..ca7c1b2ce5f 100644
--- a/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
@@ -135,7 +135,7 @@ RSpec.describe 'Updating the container expiration policy' do
context 'with existing container expiration policy' do
where(:user_role, :shared_examples_name) do
:maintainer | 'accepting the mutation request updating the container expiration policy'
- :developer | 'accepting the mutation request updating the container expiration policy'
+ :developer | 'denying the mutation request'
:reporter | 'denying the mutation request'
:guest | 'denying the mutation request'
:anonymous | 'denying the mutation request'
@@ -155,7 +155,7 @@ RSpec.describe 'Updating the container expiration policy' do
where(:user_role, :shared_examples_name) do
:maintainer | 'accepting the mutation request creating the container expiration policy'
- :developer | 'accepting the mutation request creating the container expiration policy'
+ :developer | 'denying the mutation request'
:reporter | 'denying the mutation request'
:guest | 'denying the mutation request'
:anonymous | 'denying the mutation request'
diff --git a/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb b/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
index f05bf23ad27..9eb13e534ac 100644
--- a/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/dependency_proxy/group_settings/update_spec.rb
@@ -50,7 +50,7 @@ RSpec.describe 'Updating the dependency proxy group settings' do
context 'with permission' do
before do
- group.add_developer(user)
+ group.add_maintainer(user)
end
it 'returns the updated dependency proxy settings', :aggregate_failures do
diff --git a/spec/requests/api/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb b/spec/requests/api/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
index c9e9a22ee0b..31ba7ecdf0e 100644
--- a/spec/requests/api/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/dependency_proxy/image_ttl_group_policy/update_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe 'Updating the dependency proxy image ttl policy' do
context 'with permission' do
before do
- group.add_developer(user)
+ group.add_maintainer(user)
end
it 'returns the updated dependency proxy image ttl policy', :aggregate_failures do
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb
new file mode 100644
index 00000000000..3ea8b38e20f
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/create_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Creating an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:event_occurred_at) { Time.current }
+ let_it_be(:note) { 'demo note' }
+
+ let(:input) { { incident_id: incident.to_global_id.to_s, note: note, occurred_at: event_occurred_at } }
+ let(:mutation) do
+ graphql_mutation(:timeline_event_create, input) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ incident { id title }
+ note
+ editable
+ action
+ occurredAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_create) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'creates incident timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => note,
+ 'action' => 'comment',
+ 'editable' => false,
+ 'occurredAt' => event_occurred_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
new file mode 100644
index 00000000000..faff3bfe23a
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/destroy_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Removing an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:timeline_event) { create(:incident_management_timeline_event, incident: incident, project: project) }
+
+ let(:variables) { { id: timeline_event.to_global_id.to_s } }
+
+ let(:mutation) do
+ graphql_mutation(:timeline_event_destroy, variables) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ incident { id title }
+ note
+ noteHtml
+ editable
+ action
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_destroy) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'removes incident timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => timeline_event.note,
+ 'noteHtml' => timeline_event.note_html,
+ 'editable' => false,
+ 'action' => timeline_event.action,
+ 'occurredAt' => timeline_event.occurred_at.iso8601,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ expect { timeline_event.reload }.to raise_error ActiveRecord::RecordNotFound
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
new file mode 100644
index 00000000000..b92f6af1d3d
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/promote_from_note_spec.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Promote an incident timeline event from a comment' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:comment) { create(:note, project: project, noteable: incident) }
+
+ let(:input) { { note_id: comment.to_global_id.to_s } }
+ let(:mutation) do
+ graphql_mutation(:timeline_event_promote_from_note, input) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ author { id username }
+ incident { id title }
+ promotedFromNote { id }
+ note
+ action
+ editable
+ occurredAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_promote_from_note) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'creates incident timeline event from the note', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'author' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'promotedFromNote' => {
+ 'id' => comment.to_global_id.to_s
+ },
+ 'note' => comment.note,
+ 'action' => 'comment',
+ 'editable' => false,
+ 'occurredAt' => comment.created_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb b/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb
new file mode 100644
index 00000000000..1c4439cec6f
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/incident_management/timeline_event/update_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Updating an incident timeline event' do
+ include GraphqlHelpers
+
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be_with_reload(:timeline_event) do
+ create(:incident_management_timeline_event, incident: incident, project: project)
+ end
+
+ let(:occurred_at) { 1.minute.ago.iso8601 }
+
+ let(:variables) do
+ {
+ id: timeline_event.to_global_id.to_s,
+ note: 'Updated note',
+ occurred_at: occurred_at
+ }
+ end
+
+ let(:mutation) do
+ graphql_mutation(:timeline_event_update, variables) do
+ <<~QL
+ clientMutationId
+ errors
+ timelineEvent {
+ id
+ author { id username }
+ updatedByUser { id username }
+ incident { id title }
+ note
+ noteHtml
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QL
+ end
+ end
+
+ let(:mutation_response) { graphql_mutation_response(:timeline_event_update) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ it 'updates the timeline event', :aggregate_failures do
+ post_graphql_mutation(mutation, current_user: user)
+
+ timeline_event_response = mutation_response['timelineEvent']
+
+ timeline_event.reload
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(timeline_event_response).to include(
+ 'id' => timeline_event.to_global_id.to_s,
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'updatedByUser' => {
+ 'id' => user.to_global_id.to_s,
+ 'username' => user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => 'Updated note',
+ 'noteHtml' => timeline_event.note_html,
+ 'occurredAt' => occurred_at,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb b/spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb
index 02b79dac489..715507c3cc5 100644
--- a/spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb
+++ b/spec/requests/api/graphql/mutations/issues/set_crm_contacts_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe 'Setting issues crm contacts' do
let(:operation_mode) { Types::MutationOperationModeEnum.default_mode }
let(:initial_contacts) { contacts[0..1] }
let(:mutation_contacts) { contacts[1..2] }
- let(:contact_ids) { contact_global_ids(mutation_contacts) }
+ let(:contact_ids) { mutation_contacts.map { global_id_of(_1) } }
let(:does_not_exist_or_no_permission) { "The resource that you are attempting to access does not exist or you don't have permission to perform this action" }
let(:mutation) do
@@ -45,8 +45,8 @@ RSpec.describe 'Setting issues crm contacts' do
graphql_mutation_response(:issue_set_crm_contacts)
end
- def contact_global_ids(contacts)
- contacts.map { |contact| global_id_of(contact) }
+ def expected_contacts(contacts)
+ contacts.map { |contact| a_graphql_entity_for(contact) }
end
before do
@@ -58,8 +58,8 @@ RSpec.describe 'Setting issues crm contacts' do
it 'updates the issue with correct contacts' do
post_graphql_mutation(mutation, current_user: user)
- expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes, :id))
- .to match_array(contact_global_ids(mutation_contacts))
+ expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes))
+ .to match_array(expected_contacts(mutation_contacts))
end
end
@@ -70,8 +70,8 @@ RSpec.describe 'Setting issues crm contacts' do
it 'updates the issue with correct contacts' do
post_graphql_mutation(mutation, current_user: user)
- expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes, :id))
- .to match_array(contact_global_ids(initial_contacts + mutation_contacts))
+ expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes))
+ .to match_array(expected_contacts(initial_contacts + mutation_contacts))
end
end
@@ -82,8 +82,8 @@ RSpec.describe 'Setting issues crm contacts' do
it 'updates the issue with correct contacts' do
post_graphql_mutation(mutation, current_user: user)
- expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes, :id))
- .to match_array(contact_global_ids(initial_contacts - mutation_contacts))
+ expect(graphql_data_at(:issue_set_crm_contacts, :issue, :customer_relations_contacts, :nodes))
+ .to match_array(expected_contacts(initial_contacts - mutation_contacts))
end
end
end
@@ -117,7 +117,7 @@ RSpec.describe 'Setting issues crm contacts' do
it_behaves_like 'successful mutation'
context 'when the contact does not exist' do
- let(:contact_ids) { ["gid://gitlab/CustomerRelations::Contact/#{non_existing_record_id}"] }
+ let(:contact_ids) { [global_id_of(model_name: 'CustomerRelations::Contact', id: non_existing_record_id)] }
it 'returns expected error' do
post_graphql_mutation(mutation, current_user: user)
@@ -159,7 +159,7 @@ RSpec.describe 'Setting issues crm contacts' do
context 'when trying to remove non-existent contact' do
let(:operation_mode) { Types::MutationOperationModeEnum.enum[:remove] }
- let(:contact_ids) { ["gid://gitlab/CustomerRelations::Contact/#{non_existing_record_id}"] }
+ let(:contact_ids) { [global_id_of(model_name: 'CustomerRelations::Contact', id: non_existing_record_id)] }
it 'raises expected error' do
post_graphql_mutation(mutation, current_user: user)
diff --git a/spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb
new file mode 100644
index 00000000000..9c751913827
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/merge_requests/request_attention_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Request attention' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user]) }
+ let_it_be(:project) { merge_request.project }
+
+ let(:input) { { user_id: global_id_of(user) } }
+
+ let(:mutation) do
+ variables = {
+ project_path: project.full_path,
+ iid: merge_request.iid.to_s
+ }
+ graphql_mutation(:merge_request_request_attention, variables.merge(input),
+ <<-QL.strip_heredoc
+ clientMutationId
+ errors
+ QL
+ )
+ end
+
+ def mutation_response
+ graphql_mutation_response(:merge_request_request_attention)
+ end
+
+ def mutation_errors
+ mutation_response['errors']
+ end
+
+ before_all do
+ project.add_developer(current_user)
+ project.add_developer(user)
+ end
+
+ it 'is successful' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_errors).to be_empty
+ end
+
+ context 'when current user is not allowed to update the merge request' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+
+ context 'when user is not a reviewer' do
+ let(:input) { { user_id: global_id_of(create(:user)) } }
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_errors).not_to be_empty
+ end
+ end
+
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(graphql_errors[0]["message"]).to eq "Feature disabled"
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb b/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
index d335642d321..194e42bf59d 100644
--- a/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
@@ -109,7 +109,7 @@ RSpec.describe 'Updating the package settings' do
where(:user_role, :shared_examples_name) do
:maintainer | 'accepting the mutation request updating the package settings'
- :developer | 'accepting the mutation request updating the package settings'
+ :developer | 'denying the mutation request'
:reporter | 'denying the mutation request'
:guest | 'denying the mutation request'
:anonymous | 'denying the mutation request'
@@ -131,7 +131,7 @@ RSpec.describe 'Updating the package settings' do
where(:user_role, :shared_examples_name) do
:maintainer | 'accepting the mutation request creating the package settings'
- :developer | 'accepting the mutation request creating the package settings'
+ :developer | 'denying the mutation request'
:reporter | 'denying the mutation request'
:guest | 'denying the mutation request'
:anonymous | 'denying the mutation request'
diff --git a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
index 63b94dccca0..22b5f2d5112 100644
--- a/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
@@ -64,7 +64,7 @@ RSpec.describe 'Adding a Note' do
it 'creates a Note in a discussion' do
post_graphql_mutation(mutation, current_user: current_user)
- expect(mutation_response['note']['discussion']['id']).to eq(discussion.to_global_id.to_s)
+ expect(mutation_response['note']['discussion']).to match a_graphql_entity_for(discussion)
end
context 'when the discussion_id is not for a Discussion' do
@@ -109,7 +109,7 @@ RSpec.describe 'Adding a Note' do
post_graphql_mutation(mutation, current_user: current_user)
expect(mutation_response).to include(
- 'errors' => [/Merged this merge request/],
+ 'errors' => include(/Merged this merge request/),
'note' => nil
)
end
diff --git a/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb b/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
index 89e3a71280f..0f7ccac3179 100644
--- a/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
+++ b/spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe 'Repositioning an ImageDiffNote' do
post_graphql_mutation(mutation, current_user: current_user)
end.to change { note.reset.position.x }.to(10)
- expect(mutation_response['note']).to eq('id' => global_id_of(note))
+ expect(mutation_response['note']).to match a_graphql_entity_for(note)
expect(mutation_response['errors']).to be_empty
end
@@ -59,7 +59,7 @@ RSpec.describe 'Repositioning an ImageDiffNote' do
post_graphql_mutation(mutation, current_user: current_user)
end.not_to change { note.reset.position.x }
- expect(mutation_response['note']).to eq('id' => global_id_of(note))
+ expect(mutation_response['note']).to match a_graphql_entity_for(note)
expect(mutation_response['errors']).to be_empty
end
end
diff --git a/spec/requests/api/graphql/mutations/remove_attention_request_spec.rb b/spec/requests/api/graphql/mutations/remove_attention_request_spec.rb
new file mode 100644
index 00000000000..053559b039d
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/remove_attention_request_spec.rb
@@ -0,0 +1,79 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Remove attention request' do
+ include GraphqlHelpers
+
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user]) }
+ let_it_be(:project) { merge_request.project }
+
+ let(:input) { { user_id: global_id_of(user) } }
+
+ let(:mutation) do
+ variables = {
+ project_path: project.full_path,
+ iid: merge_request.iid.to_s
+ }
+ graphql_mutation(:merge_request_remove_attention_request, variables.merge(input),
+ <<-QL.strip_heredoc
+ clientMutationId
+ errors
+ QL
+ )
+ end
+
+ def mutation_response
+ graphql_mutation_response(:merge_request_remove_attention_request)
+ end
+
+ def mutation_errors
+ mutation_response['errors']
+ end
+
+ before_all do
+ project.add_developer(current_user)
+ project.add_developer(user)
+ end
+
+ it 'is successful' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_errors).to be_empty
+ end
+
+ context 'when current user is not allowed to update the merge request' do
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ end
+ end
+
+ context 'when user is not a reviewer' do
+ let(:input) { { user_id: global_id_of(create(:user)) } }
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_errors).not_to be_empty
+ end
+ end
+
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it 'returns an error' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(graphql_errors[0]["message"]).to eq "Feature disabled"
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb b/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb
new file mode 100644
index 00000000000..b674e77f093
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/timelogs/delete_spec.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'Delete a timelog' do
+ include GraphqlHelpers
+ let_it_be(:author) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)}
+
+ let(:current_user) { nil }
+ let(:mutation) { graphql_mutation(:timelogDelete, { 'id' => timelog.to_global_id.to_s }) }
+ let(:mutation_response) { graphql_mutation_response(:timelog_delete) }
+
+ context 'when the user is not allowed to delete a timelog' do
+ let(:current_user) { create(:user) }
+
+ before do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user has permissions to delete a timelog' do
+ let(:current_user) { author }
+
+ it 'deletes the timelog' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to change(Timelog, :count).by(-1)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['timelog']).to include('id' => timelog.to_global_id.to_s)
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb b/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
index c5c34e16717..dc20fde8e3c 100644
--- a/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
+++ b/spec/requests/api/graphql/mutations/todos/mark_all_done_spec.rb
@@ -46,8 +46,8 @@ RSpec.describe 'Marking all todos done' do
expect(todo3.reload.state).to eq('done')
expect(other_user_todo.reload.state).to eq('pending')
- updated_todo_ids = mutation_response['todos'].map { |todo| todo['id'] }
- expect(updated_todo_ids).to contain_exactly(global_id_of(todo1), global_id_of(todo3))
+ updated_todos = mutation_response['todos']
+ expect(updated_todos).to contain_exactly(a_graphql_entity_for(todo1), a_graphql_entity_for(todo3))
end
context 'when target_id is given', :aggregate_failures do
@@ -66,8 +66,8 @@ RSpec.describe 'Marking all todos done' do
expect(todo1.reload.state).to eq('pending')
expect(todo3.reload.state).to eq('pending')
- updated_todo_ids = mutation_response['todos'].map { |todo| todo['id'] }
- expect(updated_todo_ids).to contain_exactly(global_id_of(target_todo1), global_id_of(target_todo2))
+ updated_todos = mutation_response['todos']
+ expect(updated_todos).to contain_exactly(a_graphql_entity_for(target_todo1), a_graphql_entity_for(target_todo2))
end
context 'when target does not exist' do
diff --git a/spec/requests/api/graphql/mutations/todos/restore_many_spec.rb b/spec/requests/api/graphql/mutations/todos/restore_many_spec.rb
index 70e3cc7f5cd..4316bd060c1 100644
--- a/spec/requests/api/graphql/mutations/todos/restore_many_spec.rb
+++ b/spec/requests/api/graphql/mutations/todos/restore_many_spec.rb
@@ -11,8 +11,8 @@ RSpec.describe 'Restoring many Todos' do
let_it_be(:author) { create(:user) }
let_it_be(:other_user) { create(:user) }
- let_it_be(:todo1) { create(:todo, user: current_user, author: author, state: :done, target: issue) }
- let_it_be(:todo2) { create(:todo, user: current_user, author: author, state: :done, target: issue) }
+ let_it_be_with_reload(:todo1) { create(:todo, user: current_user, author: author, state: :done, target: issue) }
+ let_it_be_with_reload(:todo2) { create(:todo, user: current_user, author: author, state: :done, target: issue) }
let_it_be(:other_user_todo) { create(:todo, user: other_user, author: author, state: :done) }
@@ -50,8 +50,8 @@ RSpec.describe 'Restoring many Todos' do
expect(mutation_response).to include(
'errors' => be_empty,
'todos' => contain_exactly(
- { 'id' => global_id_of(todo1), 'state' => 'pending' },
- { 'id' => global_id_of(todo2), 'state' => 'pending' }
+ a_graphql_entity_for(todo1, 'state' => 'pending'),
+ a_graphql_entity_for(todo2, 'state' => 'pending')
)
)
end
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
new file mode 100644
index 00000000000..05d3587d342
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb
@@ -0,0 +1,93 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe "Delete a task in a work item's description" do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user).tap { |user| project.add_developer(user) } }
+ let_it_be(:task) { create(:work_item, :task, project: project, author: developer) }
+ let_it_be(:work_item, refind: true) do
+ create(:work_item, project: project, description: "- [ ] #{task.to_reference}+", lock_version: 3)
+ end
+
+ before_all do
+ create(:issue_link, source_id: work_item.id, target_id: task.id)
+ end
+
+ let(:lock_version) { work_item.lock_version }
+ let(:input) do
+ {
+ 'id' => work_item.to_global_id.to_s,
+ 'lockVersion' => lock_version,
+ 'taskData' => {
+ 'id' => task.to_global_id.to_s,
+ 'lineNumberStart' => 1,
+ 'lineNumberEnd' => 1
+ }
+ }
+ end
+
+ let(:mutation) { graphql_mutation(:workItemDeleteTask, input) }
+ let(:mutation_response) { graphql_mutation_response(:work_item_delete_task) }
+
+ context 'the user is not allowed to update a work item' do
+ let(:current_user) { create(:user) }
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user can update the description but not delete the task' do
+ let(:current_user) { create(:user).tap { |u| project.add_developer(u) } }
+
+ it_behaves_like 'a mutation that returns a top-level access error'
+ end
+
+ context 'when user has permissions to remove a task' do
+ let(:current_user) { developer }
+
+ it 'removes the task from the work item' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to change(WorkItem, :count).by(-1).and(
+ change(IssueLink, :count).by(-1)
+ ).and(
+ change(work_item, :description).from("- [ ] #{task.to_reference}+").to('')
+ )
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['workItem']).to include('id' => work_item.to_global_id.to_s)
+ end
+
+ context 'when removing the task fails' do
+ let(:lock_version) { 2 }
+
+ it 'makes no changes to the DB and returns an error message' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ work_item.reload
+ end.to not_change(WorkItem, :count).and(
+ not_change(work_item, :description)
+ )
+
+ expect(mutation_response['errors']).to contain_exactly('Stale work item. Check lock version')
+ end
+ end
+
+ context 'when the work_items feature flag is disabled' do
+ before do
+ stub_feature_flags(work_items: false)
+ end
+
+ it 'does nothing and returns and error' do
+ expect do
+ post_graphql_mutation(mutation, current_user: current_user)
+ end.to not_change(WorkItem, :count)
+
+ expect(mutation_response['errors']).to contain_exactly('`work_items` feature flag disabled for this project')
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/packages/conan_spec.rb b/spec/requests/api/graphql/packages/conan_spec.rb
index 84c5af33e5d..1f3732980d9 100644
--- a/spec/requests/api/graphql/packages/conan_spec.rb
+++ b/spec/requests/api/graphql/packages/conan_spec.rb
@@ -37,22 +37,19 @@ RSpec.describe 'conan package details' do
it_behaves_like 'a package with files'
it 'has the correct metadata' do
- expect(metadata_response).to include(
- 'id' => global_id_of(package.conan_metadatum),
- 'recipe' => package.conan_metadatum.recipe,
- 'packageChannel' => package.conan_metadatum.package_channel,
- 'packageUsername' => package.conan_metadatum.package_username,
- 'recipePath' => package.conan_metadatum.recipe_path
+ expect(metadata_response).to match(
+ a_graphql_entity_for(package.conan_metadatum,
+ :recipe, :package_channel, :package_username, :recipe_path)
)
end
it 'has the correct file metadata' do
- expect(first_file_response_metadata).to include(
- 'id' => global_id_of(first_file.conan_file_metadatum),
- 'packageRevision' => first_file.conan_file_metadatum.package_revision,
- 'conanPackageReference' => first_file.conan_file_metadatum.conan_package_reference,
- 'recipeRevision' => first_file.conan_file_metadatum.recipe_revision,
- 'conanFileType' => first_file.conan_file_metadatum.conan_file_type.upcase
+ expect(first_file_response_metadata).to match(
+ a_graphql_entity_for(
+ first_file.conan_file_metadatum,
+ :package_revision, :conan_package_reference, :recipe_revision,
+ conan_file_type: first_file.conan_file_metadatum.conan_file_type.upcase
+ )
)
end
end
diff --git a/spec/requests/api/graphql/packages/maven_spec.rb b/spec/requests/api/graphql/packages/maven_spec.rb
index d28d32b0df5..9d59a922660 100644
--- a/spec/requests/api/graphql/packages/maven_spec.rb
+++ b/spec/requests/api/graphql/packages/maven_spec.rb
@@ -11,12 +11,8 @@ RSpec.describe 'maven package details' do
shared_examples 'correct maven metadata' do
it 'has the correct metadata' do
- expect(metadata_response).to include(
- 'id' => global_id_of(package.maven_metadatum),
- 'path' => package.maven_metadatum.path,
- 'appGroup' => package.maven_metadatum.app_group,
- 'appVersion' => package.maven_metadatum.app_version,
- 'appName' => package.maven_metadatum.app_name
+ expect(metadata_response).to match a_graphql_entity_for(
+ package.maven_metadatum, :path, :app_group, :app_version, :app_name
)
end
end
diff --git a/spec/requests/api/graphql/packages/nuget_spec.rb b/spec/requests/api/graphql/packages/nuget_spec.rb
index ba8d2ca42d2..87cffc67ce5 100644
--- a/spec/requests/api/graphql/packages/nuget_spec.rb
+++ b/spec/requests/api/graphql/packages/nuget_spec.rb
@@ -22,24 +22,19 @@ RSpec.describe 'nuget package details' do
it_behaves_like 'a package with files'
it 'has the correct metadata' do
- expect(metadata_response).to include(
- 'id' => global_id_of(package.nuget_metadatum),
- 'licenseUrl' => package.nuget_metadatum.license_url,
- 'projectUrl' => package.nuget_metadatum.project_url,
- 'iconUrl' => package.nuget_metadatum.icon_url
+ expect(metadata_response).to match a_graphql_entity_for(
+ package.nuget_metadatum, :license_url, :project_url, :icon_url
)
end
it 'has dependency links' do
- expect(dependency_link_response).to include(
- 'id' => global_id_of(dependency_link),
+ expect(dependency_link_response).to match a_graphql_entity_for(
+ dependency_link,
'dependencyType' => dependency_link.dependency_type.upcase
)
- expect(dependency_response).to include(
- 'id' => global_id_of(dependency_link.dependency),
- 'name' => dependency_link.dependency.name,
- 'versionPattern' => dependency_link.dependency.version_pattern
+ expect(dependency_response).to match a_graphql_entity_for(
+ dependency_link.dependency, :name, :version_pattern
)
end
diff --git a/spec/requests/api/graphql/packages/package_spec.rb b/spec/requests/api/graphql/packages/package_spec.rb
index 365efc514d4..0335c1085b4 100644
--- a/spec/requests/api/graphql/packages/package_spec.rb
+++ b/spec/requests/api/graphql/packages/package_spec.rb
@@ -65,32 +65,6 @@ RSpec.describe 'package details' do
end
end
- context 'there are other versions of this package' do
- let(:depth) { 3 }
- let(:excluded) { %w[metadata project tags pipelines] } # to limit the query complexity
-
- let_it_be(:siblings) { create_list(:composer_package, 2, project: project, name: composer_package.name) }
-
- it 'includes the sibling versions' do
- subject
-
- expect(graphql_data_at(:package, :versions, :nodes)).to match_array(
- siblings.map { |p| a_hash_including('id' => global_id_of(p)) }
- )
- end
-
- context 'going deeper' do
- let(:depth) { 6 }
-
- it 'does not create a cycle of versions' do
- subject
-
- expect(graphql_data_at(:package, :versions, :nodes, :version)).to be_present
- expect(graphql_data_at(:package, :versions, :nodes, :versions, :nodes)).to match_array [nil, nil]
- end
- end
- end
-
context 'with package files pending destruction' do
let_it_be(:package_file) { create(:package_file, package: composer_package) }
let_it_be(:package_file_pending_destruction) { create(:package_file, :pending_destruction, package: composer_package) }
diff --git a/spec/requests/api/graphql/packages/pypi_spec.rb b/spec/requests/api/graphql/packages/pypi_spec.rb
index 64fe7d29a7a..0cc5bd2e3b2 100644
--- a/spec/requests/api/graphql/packages/pypi_spec.rb
+++ b/spec/requests/api/graphql/packages/pypi_spec.rb
@@ -19,9 +19,8 @@ RSpec.describe 'pypi package details' do
it_behaves_like 'a package with files'
it 'has the correct metadata' do
- expect(metadata_response).to include(
- 'id' => global_id_of(package.pypi_metadatum),
- 'requiredPython' => package.pypi_metadatum.required_python
+ expect(metadata_response).to match a_graphql_entity_for(
+ package.pypi_metadatum, :required_python
)
end
end
diff --git a/spec/requests/api/graphql/project/alert_management/integrations_spec.rb b/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
index 1793d4961eb..773922c1864 100644
--- a/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
+++ b/spec/requests/api/graphql/project/alert_management/integrations_spec.rb
@@ -53,33 +53,24 @@ RSpec.describe 'getting Alert Management Integrations' do
end
context 'when no extra params given' do
- let(:http_integration_response) { integrations.first }
- let(:prometheus_integration_response) { integrations.second }
-
it_behaves_like 'a working graphql query'
- it { expect(integrations.size).to eq(2) }
-
it 'returns the correct properties of the integrations' do
- expect(http_integration_response).to include(
- 'id' => global_id_of(active_http_integration),
- 'type' => 'HTTP',
- 'name' => active_http_integration.name,
- 'active' => active_http_integration.active,
- 'token' => active_http_integration.token,
- 'url' => active_http_integration.url,
- 'apiUrl' => nil
- )
-
- expect(prometheus_integration_response).to include(
- 'id' => global_id_of(prometheus_integration),
- 'type' => 'PROMETHEUS',
- 'name' => 'Prometheus',
- 'active' => prometheus_integration.manual_configuration?,
- 'token' => project_alerting_setting.token,
- 'url' => "http://localhost/#{project.full_path}/prometheus/alerts/notify.json",
- 'apiUrl' => prometheus_integration.api_url
- )
+ expect(integrations).to match [
+ a_graphql_entity_for(
+ active_http_integration,
+ :name, :active, :token, :url, type: 'HTTP', api_url: nil
+ ),
+ a_graphql_entity_for(
+ prometheus_integration,
+ 'type' => 'PROMETHEUS',
+ 'name' => 'Prometheus',
+ 'active' => prometheus_integration.manual_configuration?,
+ 'token' => project_alerting_setting.token,
+ 'url' => "http://localhost/#{project.full_path}/prometheus/alerts/notify.json",
+ 'apiUrl' => prometheus_integration.api_url
+ )
+ ]
end
end
@@ -88,17 +79,9 @@ RSpec.describe 'getting Alert Management Integrations' do
it_behaves_like 'a working graphql query'
- it { expect(integrations).to be_one }
-
it 'returns the correct properties of the HTTP integration' do
- expect(integrations.first).to include(
- 'id' => global_id_of(active_http_integration),
- 'type' => 'HTTP',
- 'name' => active_http_integration.name,
- 'active' => active_http_integration.active,
- 'token' => active_http_integration.token,
- 'url' => active_http_integration.url,
- 'apiUrl' => nil
+ expect(integrations).to contain_exactly a_graphql_entity_for(
+ active_http_integration, :name, :active, :token, :url, type: 'HTTP', api_url: nil
)
end
end
@@ -108,11 +91,9 @@ RSpec.describe 'getting Alert Management Integrations' do
it_behaves_like 'a working graphql query'
- it { expect(integrations).to be_one }
-
it 'returns the correct properties of the Prometheus Integration' do
- expect(integrations.first).to include(
- 'id' => global_id_of(prometheus_integration),
+ expect(integrations).to contain_exactly a_graphql_entity_for(
+ prometheus_integration,
'type' => 'PROMETHEUS',
'name' => 'Prometheus',
'active' => prometheus_integration.manual_configuration?,
diff --git a/spec/requests/api/graphql/project/cluster_agents_spec.rb b/spec/requests/api/graphql/project/cluster_agents_spec.rb
index c9900fea277..a34df0ee6f4 100644
--- a/spec/requests/api/graphql/project/cluster_agents_spec.rb
+++ b/spec/requests/api/graphql/project/cluster_agents_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe 'Project.cluster_agents' do
post_graphql(query, current_user: current_user)
expect(graphql_data_at(:project, :cluster_agents, :nodes)).to match_array(
- agents.map { |agent| a_hash_including('id' => global_id_of(agent)) }
+ agents.map { |agent| a_graphql_entity_for(agent) }
)
end
@@ -62,9 +62,9 @@ RSpec.describe 'Project.cluster_agents' do
tokens = graphql_data_at(:project, :cluster_agents, :nodes, :tokens, :nodes)
expect(tokens).to match([
- a_hash_including('id' => global_id_of(token_3)),
- a_hash_including('id' => global_id_of(token_2)),
- a_hash_including('id' => global_id_of(token_1))
+ a_graphql_entity_for(token_3),
+ a_graphql_entity_for(token_2),
+ a_graphql_entity_for(token_1)
])
end
diff --git a/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb b/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
new file mode 100644
index 00000000000..708fa96986c
--- /dev/null
+++ b/spec/requests/api/graphql/project/incident_management/timeline_events_spec.rb
@@ -0,0 +1,127 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'getting incident timeline events' do
+ include GraphqlHelpers
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:updated_by_user) { create(:user) }
+ let_it_be(:incident) { create(:incident, project: project) }
+ let_it_be(:another_incident) { create(:incident, project: project) }
+ let_it_be(:promoted_from_note) { create(:note, project: project, noteable: incident) }
+
+ let_it_be(:timeline_event) do
+ create(
+ :incident_management_timeline_event,
+ incident: incident,
+ project: project,
+ updated_by_user: updated_by_user,
+ promoted_from_note: promoted_from_note
+ )
+ end
+
+ let_it_be(:second_timeline_event) do
+ create(:incident_management_timeline_event, incident: incident, project: project)
+ end
+
+ let_it_be(:another_timeline_event) do
+ create(:incident_management_timeline_event, incident: another_incident, project: project)
+ end
+
+ let(:params) { { incident_id: incident.to_global_id.to_s } }
+
+ let(:timeline_event_fields) do
+ <<~QUERY
+ nodes {
+ id
+ author { id username }
+ updatedByUser { id username }
+ incident { id title }
+ note
+ noteHtml
+ promotedFromNote { id body }
+ editable
+ action
+ occurredAt
+ createdAt
+ updatedAt
+ }
+ QUERY
+ end
+
+ let(:query) do
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field('incidentManagementTimelineEvents', params, timeline_event_fields)
+ )
+ end
+
+ let(:timeline_events) do
+ graphql_data.dig('project', 'incidentManagementTimelineEvents', 'nodes')
+ end
+
+ before do
+ project.add_guest(current_user)
+ post_graphql(query, current_user: current_user)
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns the correct number of timeline events' do
+ expect(timeline_events.count).to eq(2)
+ end
+
+ it 'returns the correct properties of the incident timeline events' do
+ expect(timeline_events.first).to include(
+ 'author' => {
+ 'id' => timeline_event.author.to_global_id.to_s,
+ 'username' => timeline_event.author.username
+ },
+ 'updatedByUser' => {
+ 'id' => updated_by_user.to_global_id.to_s,
+ 'username' => updated_by_user.username
+ },
+ 'incident' => {
+ 'id' => incident.to_global_id.to_s,
+ 'title' => incident.title
+ },
+ 'note' => timeline_event.note,
+ 'noteHtml' => timeline_event.note_html,
+ 'promotedFromNote' => {
+ 'id' => promoted_from_note.to_global_id.to_s,
+ 'body' => promoted_from_note.note
+ },
+ 'editable' => false,
+ 'action' => timeline_event.action,
+ 'occurredAt' => timeline_event.occurred_at.iso8601,
+ 'createdAt' => timeline_event.created_at.iso8601,
+ 'updatedAt' => timeline_event.updated_at.iso8601
+ )
+ end
+
+ context 'when filtering by id' do
+ let(:params) { { incident_id: incident.to_global_id.to_s, id: timeline_event.to_global_id.to_s } }
+
+ let(:query) do
+ graphql_query_for(
+ 'project',
+ { 'fullPath' => project.full_path },
+ query_graphql_field('incidentManagementTimelineEvent', params, 'id occurredAt')
+ )
+ end
+
+ it_behaves_like 'a working graphql query'
+
+ it 'returns a single timeline event', :aggregate_failures do
+ single_timeline_event = graphql_data.dig('project', 'incidentManagementTimelineEvent')
+
+ expect(single_timeline_event).to include(
+ 'id' => timeline_event.to_global_id.to_s,
+ 'occurredAt' => timeline_event.occurred_at.iso8601
+ )
+ end
+ end
+end
diff --git a/spec/requests/api/graphql/project/issue/design_collection/version_spec.rb b/spec/requests/api/graphql/project/issue/design_collection/version_spec.rb
index f544d78ecbb..8cda61f0628 100644
--- a/spec/requests/api/graphql/project/issue/design_collection/version_spec.rb
+++ b/spec/requests/api/graphql/project/issue/design_collection/version_spec.rb
@@ -71,11 +71,7 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
it 'finds all the designs as of the given version' do
post_query
- expect(data).to match(
- a_hash_including(
- 'id' => global_id_of(design_at_version),
- 'filename' => design.filename
- ))
+ expect(data).to match a_graphql_entity_for(design_at_version, filename: design.filename)
end
context 'when the current_user is not authorized' do
@@ -119,7 +115,8 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
let(:results) do
issue.designs.visible_at_version(version).map do |d|
dav = build(:design_at_version, design: d, version: version)
- { 'id' => global_id_of(dav), 'filename' => d.filename }
+
+ a_graphql_entity_for(dav, filename: d.filename)
end
end
@@ -132,8 +129,8 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
describe 'filtering' do
let(:designs) { issue.designs.sample(3) }
let(:filenames) { designs.map(&:filename) }
- let(:ids) do
- designs.map { |d| global_id_of(build(:design_at_version, design: d, version: version)) }
+ let(:expected_designs) do
+ designs.map { |d| a_graphql_entity_for(build(:design_at_version, design: d, version: version)) }
end
before do
@@ -144,7 +141,7 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
let(:dav_params) { { filenames: filenames } }
it 'finds the designs by filename' do
- expect(data.map { |e| e.dig('node', 'id') }).to match_array(ids)
+ expect(data.map { |e| e['node'] }).to match_array expected_designs
end
end
@@ -160,9 +157,9 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
describe 'pagination' do
let(:end_cursor) { graphql_data_at(*path_prefix, :designs_at_version, :page_info, :end_cursor) }
- let(:ids) do
+ let(:entities) do
::DesignManagement::Design.visible_at_version(version).order(:id).map do |d|
- global_id_of(build(:design_at_version, design: d, version: version))
+ a_graphql_entity_for(build(:design_at_version, design: d, version: version))
end
end
@@ -178,19 +175,19 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
let(:fields) { ['pageInfo { endCursor }', 'edges { node { id } }'] }
def response_values(data = graphql_data)
- data.dig(*path).map { |e| e.dig('node', 'id') }
+ data.dig(*path).map { |e| e['node'] }
end
it 'sorts designs for reliable pagination' do
post_graphql(query, current_user: current_user)
- expect(response_values).to match_array(ids.take(2))
+ expect(response_values).to match_array(entities.take(2))
post_graphql(cursored_query, current_user: current_user)
new_data = Gitlab::Json.parse(response.body).fetch('data')
- expect(response_values(new_data)).to match_array(ids.drop(2))
+ expect(response_values(new_data)).to match_array(entities.drop(2))
end
end
end
@@ -202,9 +199,7 @@ RSpec.describe 'Query.project(fullPath).issue(iid).designCollection.version(sha)
end
let(:results) do
- version.designs.map do |design|
- { 'id' => global_id_of(design), 'filename' => design.filename }
- end
+ version.designs.map { |design| a_graphql_entity_for(design, :filename) }
end
it 'finds all the designs as of the given version' do
diff --git a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
index f0205319983..02bc9457c07 100644
--- a/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
+++ b/spec/requests/api/graphql/project/issue/designs/designs_spec.rb
@@ -58,8 +58,8 @@ RSpec.describe 'Getting designs related to an issue' do
post_graphql(query, current_user: current_user)
- expect(design_response).to eq(
- 'id' => design.to_global_id.to_s,
+ expect(design_response).to match a_graphql_entity_for(
+ design,
'event' => 'CREATION',
'fullPath' => design.full_path,
'filename' => design.filename,
@@ -93,7 +93,7 @@ RSpec.describe 'Getting designs related to an issue' do
let(:end_cursor) { design_collection.dig('designs', 'pageInfo', 'endCursor') }
- let(:ids) { issue.designs.order(:id).map { |d| global_id_of(d) } }
+ let(:expected_designs) { issue.designs.order(:id).map { |d| a_graphql_entity_for(d) } }
let(:query) { make_query(designs_fragment(first: 2)) }
@@ -107,19 +107,19 @@ RSpec.describe 'Getting designs related to an issue' do
query_graphql_field(:designs, params, design_query_fields)
end
- def response_ids(data = graphql_data)
+ def response_designs(data = graphql_data)
path = %w[project issue designCollection designs edges]
- data.dig(*path).map { |e| e.dig('node', 'id') }
+ data.dig(*path).map { |e| e['node'] }
end
it 'sorts designs for reliable pagination' do
- expect(response_ids).to match_array(ids.take(2))
+ expect(response_designs).to match_array(expected_designs.take(2))
post_graphql(cursored_query, current_user: current_user)
new_data = Gitlab::Json.parse(response.body).fetch('data')
- expect(response_ids(new_data)).to match_array(ids.drop(2))
+ expect(response_designs(new_data)).to match_array(expected_designs.drop(2))
end
end
@@ -273,8 +273,10 @@ RSpec.describe 'Getting designs related to an issue' do
end
it 'returns the correct v432x230-sized design images' do
+ v0 = design.actions.most_recent.first.version
+
expect(design_nodes).to contain_exactly(
- a_hash_including('imageV432x230' => design_image_url(design, ref: version.sha, size: :v432x230)),
+ a_hash_including('imageV432x230' => design_image_url(design, ref: v0.sha, size: :v432x230)),
a_hash_including('imageV432x230' => design_image_url(second_design, ref: version.sha, size: :v432x230))
)
end
@@ -323,8 +325,10 @@ RSpec.describe 'Getting designs related to an issue' do
end
it 'returns the correct v432x230-sized design images' do
+ v0 = design.actions.most_recent.first.version
+
expect(design_nodes).to contain_exactly(
- a_hash_including('imageV432x230' => design_image_url(design, ref: version.sha, size: :v432x230)),
+ a_hash_including('imageV432x230' => design_image_url(design, ref: v0.sha, size: :v432x230)),
a_hash_including('imageV432x230' => design_image_url(second_design, ref: version.sha, size: :v432x230))
)
end
diff --git a/spec/requests/api/graphql/project/issue/designs/notes_spec.rb b/spec/requests/api/graphql/project/issue/designs/notes_spec.rb
index de2ace95757..3b1eb0b4b02 100644
--- a/spec/requests/api/graphql/project/issue/designs/notes_spec.rb
+++ b/spec/requests/api/graphql/project/issue/designs/notes_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe 'Getting designs related to an issue' do
design_data = designs_data['nodes'].first
note_data = design_data['notes']['nodes'].first
- expect(note_data['id']).to eq(note.to_global_id.to_s)
+ expect(note_data).to match(a_graphql_entity_for(note))
end
def query(note_fields = all_graphql_fields_for(Note, max_depth: 1))
diff --git a/spec/requests/api/graphql/project/issue_spec.rb b/spec/requests/api/graphql/project/issue_spec.rb
index ddf63a8f2c9..2415e9ef60f 100644
--- a/spec/requests/api/graphql/project/issue_spec.rb
+++ b/spec/requests/api/graphql/project/issue_spec.rb
@@ -144,10 +144,7 @@ RSpec.describe 'Query.project(fullPath).issue(iid)' do
data = graphql_data.dig(*path)
- expect(data).to match(
- a_hash_including('id' => global_id_of(version),
- 'sha' => version.sha)
- )
+ expect(data).to match a_graphql_entity_for(version, :sha)
end
end
@@ -184,6 +181,6 @@ RSpec.describe 'Query.project(fullPath).issue(iid)' do
end
def id_hash(object)
- a_hash_including('id' => global_id_of(object))
+ a_graphql_entity_for(object)
end
end
diff --git a/spec/requests/api/graphql/project/merge_request_spec.rb b/spec/requests/api/graphql/project/merge_request_spec.rb
index cefe88aafc8..d2f34080be3 100644
--- a/spec/requests/api/graphql/project/merge_request_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request_spec.rb
@@ -66,7 +66,7 @@ RSpec.describe 'getting merge request information nested in a project' do
it 'includes reviewers' do
expected = merge_request.reviewers.map do |r|
- a_hash_including('id' => global_id_of(r), 'username' => r.username)
+ a_graphql_entity_for(r, :username)
end
post_graphql(query, current_user: current_user)
@@ -425,7 +425,7 @@ RSpec.describe 'getting merge request information nested in a project' do
other_users.each do |user|
assign_user(user)
- merge_request.merge_request_reviewers.find_or_create_by!(reviewer: user)
+ merge_request.merge_request_reviewers.find_or_create_by!(reviewer: user, state: :attention_requested)
end
expect { post_graphql(query) }.not_to exceed_query_limit(baseline)
@@ -466,7 +466,7 @@ RSpec.describe 'getting merge request information nested in a project' do
let(:can_update) { false }
def assign_user(user)
- merge_request.merge_request_reviewers.create!(reviewer: user)
+ merge_request.merge_request_reviewers.create!(reviewer: user, state: :attention_requested)
end
end
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index 303748bc70e..5daec5543c0 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
let_it_be(:current_user) { create(:user) }
let_it_be(:label) { create(:label, project: project) }
- let_it_be(:merge_request_a) do
+ let_it_be_with_reload(:merge_request_a) do
create(:labeled_merge_request, :unique_branches, source_project: project, labels: [label])
end
@@ -96,7 +96,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
where(:field, :subfield, :is_connection) do
nested_fields_of('MergeRequest').flat_map do |name, field|
type = field_type(field)
- is_connection = type.name.ends_with?('Connection')
+ is_connection = type.graphql_name.ends_with?('Connection')
type = field_type(type.fields['nodes']) if is_connection
type.fields
@@ -412,6 +412,10 @@ RSpec.describe 'getting merge request listings nested in a project' do
describe 'sorting and pagination' do
let(:data_path) { [:project, :mergeRequests] }
+ def pagination_results_data(nodes)
+ nodes
+ end
+
def pagination_query(params)
graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
mergeRequests(#{params}) {
@@ -429,7 +433,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
merge_request_c,
merge_request_e,
merge_request_a
- ].map { |mr| global_id_of(mr) }
+ ].map { |mr| a_graphql_entity_for(mr) }
end
before do
@@ -455,7 +459,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
query = pagination_query(params)
post_graphql(query, current_user: current_user)
- expect(results.map { |item| item["id"] }).to eq(all_records.last(2))
+ expect(results).to match(all_records.last(2))
end
end
end
@@ -469,7 +473,7 @@ RSpec.describe 'getting merge request listings nested in a project' do
merge_request_c,
merge_request_e,
merge_request_a
- ].map { |mr| global_id_of(mr) }
+ ].map { |mr| a_graphql_entity_for(mr) }
end
before do
@@ -495,17 +499,19 @@ RSpec.describe 'getting merge request listings nested in a project' do
query = pagination_query(params)
post_graphql(query, current_user: current_user)
- expect(results.map { |item| item["id"] }).to eq(all_records.last(2))
+ expect(results).to match(all_records.last(2))
end
end
end
end
context 'when only the count is requested' do
+ let_it_be(:merged_at) { Time.new(2020, 1, 3) }
+
context 'when merged at filter is present' do
let_it_be(:merge_request) do
create(:merge_request, :unique_branches, source_project: project).tap do |mr|
- mr.metrics.update!(merged_at: Time.new(2020, 1, 3))
+ mr.metrics.update!(merged_at: merged_at, created_at: merged_at - 2.days)
end
end
@@ -522,12 +528,18 @@ RSpec.describe 'getting merge request listings nested in a project' do
it 'does not query the merge requests table for the count' do
query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
- queries = query_recorder.data.each_value.first[:occurrences]
+ queries = query_recorder.log
expect(queries).not_to include(match(/SELECT COUNT\(\*\) FROM "merge_requests"/))
expect(queries).to include(match(/SELECT COUNT\(\*\) FROM "merge_request_metrics"/))
end
context 'when total_time_to_merge and count is queried' do
+ let_it_be(:merge_request_2) do
+ create(:merge_request, :unique_branches, source_project: project).tap do |mr|
+ mr.metrics.update!(merged_at: merged_at, created_at: merged_at - 1.day)
+ end
+ end
+
let(:query) do
graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0) {
@@ -537,11 +549,18 @@ RSpec.describe 'getting merge request listings nested in a project' do
QUERY
end
- it 'does not query the merge requests table for the total_time_to_merge' do
+ it 'uses the merge_request_metrics table for total_time_to_merge' do
query_recorder = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: current_user) }
- queries = query_recorder.data.each_value.first[:occurrences]
- expect(queries).to include(match(/SELECT.+SUM.+FROM "merge_request_metrics" WHERE/))
+ expect(query_recorder.log).to include(match(/SELECT.+SUM.+FROM "merge_request_metrics" WHERE/))
+ end
+
+ it 'returns the correct total time to merge' do
+ post_graphql(query, current_user: current_user)
+
+ sum = graphql_data_at(:project, :merge_requests, :total_time_to_merge)
+
+ expect(sum).to eq(3.days.to_f)
end
end
diff --git a/spec/requests/api/graphql/project/milestones_spec.rb b/spec/requests/api/graphql/project/milestones_spec.rb
index 2fede4c7285..3e8948d83b1 100644
--- a/spec/requests/api/graphql/project/milestones_spec.rb
+++ b/spec/requests/api/graphql/project/milestones_spec.rb
@@ -33,7 +33,7 @@ RSpec.describe 'getting milestone listings nested in a project' do
def result_list(expected)
expected.map do |milestone|
- a_hash_including('id' => global_id_of(milestone))
+ a_graphql_entity_for(milestone)
end
end
diff --git a/spec/requests/api/graphql/project/pipeline_spec.rb b/spec/requests/api/graphql/project/pipeline_spec.rb
index 73e02e2a4b1..ccf97918021 100644
--- a/spec/requests/api/graphql/project/pipeline_spec.rb
+++ b/spec/requests/api/graphql/project/pipeline_spec.rb
@@ -89,17 +89,16 @@ RSpec.describe 'getting pipeline information nested in a project' do
post_graphql(query, current_user: current_user)
expect(graphql_data_at(*path, :jobs, :nodes)).to contain_exactly(
- a_hash_including(
- 'name' => build_job.name,
- 'status' => build_job.status.upcase,
- 'duration' => build_job.duration
+ a_graphql_entity_for(
+ build_job, :name, :duration,
+ 'status' => build_job.status.upcase
),
- a_hash_including(
- 'id' => global_id_of(failed_build),
+ a_graphql_entity_for(
+ failed_build,
'status' => failed_build.status.upcase
),
- a_hash_including(
- 'id' => global_id_of(bridge),
+ a_graphql_entity_for(
+ bridge,
'status' => bridge.status.upcase
)
)
@@ -135,7 +134,7 @@ RSpec.describe 'getting pipeline information nested in a project' do
post_graphql(query, current_user: current_user, variables: variables)
expect(graphql_data_at(*path, :jobs, :nodes))
- .to contain_exactly(a_hash_including('id' => global_id_of(failed_build)))
+ .to contain_exactly(a_graphql_entity_for(failed_build))
end
end
@@ -166,7 +165,7 @@ RSpec.describe 'getting pipeline information nested in a project' do
end
let(:the_job) do
- a_hash_including('name' => build_job.name, 'id' => global_id_of(build_job))
+ a_graphql_entity_for(build_job, :name)
end
it 'can request a build by name' do
diff --git a/spec/requests/api/graphql/project/project_members_spec.rb b/spec/requests/api/graphql/project/project_members_spec.rb
index 315d44884ff..c3281b44954 100644
--- a/spec/requests/api/graphql/project/project_members_spec.rb
+++ b/spec/requests/api/graphql/project/project_members_spec.rb
@@ -60,7 +60,10 @@ RSpec.describe 'getting project members information' do
fetch_members(project: parent_project, args: { relations: [:DIRECT] })
expect(graphql_errors).to be_nil
- expect(graphql_data_at(:project, :project_members, :edges, :node)).to contain_exactly({ 'user' => { 'id' => global_id_of(user) } }, 'user' => nil)
+ expect(graphql_data_at(:project, :project_members, :edges, :node)).to contain_exactly(
+ a_graphql_entity_for(user: a_graphql_entity_for(user)),
+ { 'user' => nil }
+ )
end
end
@@ -238,7 +241,7 @@ RSpec.describe 'getting project members information' do
def expect_array_response(*items)
expect(response).to have_gitlab_http_status(:success)
- member_gids = graphql_data_at(:project, :project_members, :edges, :node, :user, :id)
- expect(member_gids).to match_array(items.map { |u| global_id_of(u) })
+ members = graphql_data_at(:project, :project_members, :edges, :node, :user)
+ expect(members).to match_array(items.map { |u| a_graphql_entity_for(u) })
end
end
diff --git a/spec/requests/api/graphql/project/release_spec.rb b/spec/requests/api/graphql/project/release_spec.rb
index 77abac4ef04..c4899dbb71e 100644
--- a/spec/requests/api/graphql/project/release_spec.rb
+++ b/spec/requests/api/graphql/project/release_spec.rb
@@ -77,10 +77,10 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
post_query
expected = release.milestones.order_by_dates_and_title.map do |milestone|
- { 'id' => global_id_of(milestone), 'title' => milestone.title }
+ a_graphql_entity_for(milestone, :title)
end
- expect(data).to eq(expected)
+ expect(data).to match(expected)
end
end
@@ -94,10 +94,7 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
it 'finds the author of the release' do
post_query
- expect(data).to eq(
- 'id' => global_id_of(release.author),
- 'username' => release.author.username
- )
+ expect(data).to match a_graphql_entity_for(release.author, :username)
end
end
@@ -142,13 +139,11 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
post_query
expected = release.links.map do |link|
- {
- 'id' => global_id_of(link),
- 'name' => link.name,
- 'url' => link.url,
+ a_graphql_entity_for(
+ link, :name, :url,
'external' => link.external?,
'directAssetUrl' => link.filepath ? Gitlab::Routing.url_helpers.project_release_url(project, release) << "/downloads#{link.filepath}" : link.url
- }
+ )
end
expect(data).to match_array(expected)
@@ -218,10 +213,8 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
evidence = release.evidences.first.present
- expect(data["nodes"].first).to eq(
- 'id' => global_id_of(evidence),
- 'sha' => evidence.sha,
- 'filepath' => evidence.filepath,
+ expect(data["nodes"].first).to match a_graphql_entity_for(
+ evidence, :sha, :filepath,
'collectedAt' => evidence.collected_at.utc.iso8601
)
end
@@ -274,10 +267,10 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
post_query
expected = release.milestones.order_by_dates_and_title.map do |milestone|
- { 'id' => global_id_of(milestone), 'title' => milestone.title }
+ a_graphql_entity_for(milestone, :title)
end
- expect(data).to eq(expected)
+ expect(data).to match(expected)
end
end
@@ -291,10 +284,7 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
it 'finds the author of the release' do
post_query
- expect(data).to eq(
- 'id' => global_id_of(release.author),
- 'username' => release.author.username
- )
+ expect(data).to match a_graphql_entity_for(release.author, :username)
end
end
@@ -339,13 +329,11 @@ RSpec.describe 'Query.project(fullPath).release(tagName)' do
post_query
expected = release.links.map do |link|
- {
- 'id' => global_id_of(link),
- 'name' => link.name,
- 'url' => link.url,
+ a_graphql_entity_for(
+ link, :name, :url,
'external' => true,
'directAssetUrl' => link.filepath ? Gitlab::Routing.url_helpers.project_release_url(project, release) << "/downloads#{link.filepath}" : link.url
- }
+ )
end
expect(data).to match_array(expected)
diff --git a/spec/requests/api/graphql/project/terraform/state_spec.rb b/spec/requests/api/graphql/project/terraform/state_spec.rb
index 9f1d9ab204a..8f2d2cffef2 100644
--- a/spec/requests/api/graphql/project/terraform/state_spec.rb
+++ b/spec/requests/api/graphql/project/terraform/state_spec.rb
@@ -57,22 +57,22 @@ RSpec.describe 'query a single terraform state' do
it_behaves_like 'a working graphql query'
it 'returns terraform state data' do
- expect(data).to match(a_hash_including({
- 'id' => global_id_of(terraform_state),
- 'name' => terraform_state.name,
+ expect(data).to match a_graphql_entity_for(
+ terraform_state,
+ :name,
'lockedAt' => terraform_state.locked_at.iso8601,
'createdAt' => terraform_state.created_at.iso8601,
'updatedAt' => terraform_state.updated_at.iso8601,
- 'lockedByUser' => { 'id' => global_id_of(terraform_state.locked_by_user) },
- 'latestVersion' => {
- 'id' => eq(global_id_of(latest_version)),
+ 'lockedByUser' => a_graphql_entity_for(terraform_state.locked_by_user),
+ 'latestVersion' => a_graphql_entity_for(
+ latest_version,
'serial' => eq(latest_version.version),
'createdAt' => eq(latest_version.created_at.iso8601),
'updatedAt' => eq(latest_version.updated_at.iso8601),
- 'createdByUser' => { 'id' => eq(global_id_of(latest_version.created_by_user)) },
+ 'createdByUser' => a_graphql_entity_for(latest_version.created_by_user),
'job' => { 'name' => eq(latest_version.build.name) }
- }
- }))
+ )
+ )
end
context 'unauthorized users' do
diff --git a/spec/requests/api/graphql/project/terraform/states_spec.rb b/spec/requests/api/graphql/project/terraform/states_spec.rb
index 2879530acc5..a7ec6f69776 100644
--- a/spec/requests/api/graphql/project/terraform/states_spec.rb
+++ b/spec/requests/api/graphql/project/terraform/states_spec.rb
@@ -62,23 +62,22 @@ RSpec.describe 'query terraform states' do
)
)
- expect(data['nodes']).to contain_exactly({
- 'id' => global_id_of(terraform_state),
- 'name' => terraform_state.name,
+ expect(data['nodes']).to contain_exactly a_graphql_entity_for(
+ terraform_state, :name,
'lockedAt' => terraform_state.locked_at.iso8601,
'createdAt' => terraform_state.created_at.iso8601,
'updatedAt' => terraform_state.updated_at.iso8601,
- 'lockedByUser' => { 'id' => global_id_of(terraform_state.locked_by_user) },
- 'latestVersion' => {
- 'id' => eq(global_id_of(latest_version)),
+ 'lockedByUser' => a_graphql_entity_for(terraform_state.locked_by_user),
+ 'latestVersion' => a_graphql_entity_for(
+ latest_version,
'serial' => eq(latest_version.version),
'downloadPath' => eq(download_path),
'createdAt' => eq(latest_version.created_at.iso8601),
'updatedAt' => eq(latest_version.updated_at.iso8601),
- 'createdByUser' => { 'id' => eq(global_id_of(latest_version.created_by_user)) },
+ 'createdByUser' => a_graphql_entity_for(latest_version.created_by_user),
'job' => { 'name' => eq(latest_version.build.name) }
- }
- })
+ )
+ )
end
it 'returns count of terraform states' do
diff --git a/spec/requests/api/graphql/query_spec.rb b/spec/requests/api/graphql/query_spec.rb
index d650acc8354..4aa9c4b8254 100644
--- a/spec/requests/api/graphql/query_spec.rb
+++ b/spec/requests/api/graphql/query_spec.rb
@@ -76,10 +76,8 @@ RSpec.describe 'Query' do
it_behaves_like 'a working graphql query'
it_behaves_like 'a query that needs authorization'
- context 'the current user is able to read designs' do
- it 'fetches the expected data' do
- expect(query_result).to eq('id' => global_id_of(version), 'sha' => version.sha)
- end
+ it 'fetches the expected data' do
+ expect(query_result).to match a_graphql_entity_for(version, :sha)
end
end
@@ -106,13 +104,13 @@ RSpec.describe 'Query' do
context 'the current user is able to read designs' do
it 'fetches the expected data, including the correct associations' do
- expect(query_result).to eq(
- 'id' => global_id_of(design_at_version),
+ expect(query_result).to match a_graphql_entity_for(
+ design_at_version,
'filename' => design_at_version.design.filename,
- 'version' => { 'id' => global_id_of(version), 'sha' => version.sha },
- 'design' => { 'id' => global_id_of(design) },
+ 'version' => a_graphql_entity_for(version, :sha),
+ 'design' => a_graphql_entity_for(design),
'issue' => { 'title' => issue.title, 'iid' => issue.iid.to_s },
- 'project' => { 'id' => global_id_of(project), 'fullPath' => project.full_path }
+ 'project' => a_graphql_entity_for(project, :full_path)
)
end
end
diff --git a/spec/requests/api/graphql/user/starred_projects_query_spec.rb b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
index a8c087d1fbf..37a85b98e5f 100644
--- a/spec/requests/api/graphql/user/starred_projects_query_spec.rb
+++ b/spec/requests/api/graphql/user/starred_projects_query_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe 'Getting starredProjects of the user' do
it 'found only public project' do
expect(starred_projects).to contain_exactly(
- a_hash_including('id' => global_id_of(project_a))
+ a_graphql_entity_for(project_a)
)
end
@@ -51,9 +51,9 @@ RSpec.describe 'Getting starredProjects of the user' do
it 'found all projects' do
expect(starred_projects).to contain_exactly(
- a_hash_including('id' => global_id_of(project_a)),
- a_hash_including('id' => global_id_of(project_b)),
- a_hash_including('id' => global_id_of(project_c))
+ a_graphql_entity_for(project_a),
+ a_graphql_entity_for(project_b),
+ a_graphql_entity_for(project_c)
)
end
end
@@ -69,8 +69,8 @@ RSpec.describe 'Getting starredProjects of the user' do
it 'finds public and member projects' do
expect(starred_projects).to contain_exactly(
- a_hash_including('id' => global_id_of(project_a)),
- a_hash_including('id' => global_id_of(project_b))
+ a_graphql_entity_for(project_a),
+ a_graphql_entity_for(project_b)
)
end
end
@@ -93,9 +93,9 @@ RSpec.describe 'Getting starredProjects of the user' do
it 'finds all projects starred by the user, which the current user has access to' do
expect(starred_projects).to contain_exactly(
- a_hash_including('id' => global_id_of(project_a)),
- a_hash_including('id' => global_id_of(project_b)),
- a_hash_including('id' => global_id_of(project_c))
+ a_graphql_entity_for(project_a),
+ a_graphql_entity_for(project_b),
+ a_graphql_entity_for(project_c)
)
end
end
diff --git a/spec/requests/api/graphql/user_query_spec.rb b/spec/requests/api/graphql/user_query_spec.rb
index 1cba3674d25..8f286180617 100644
--- a/spec/requests/api/graphql/user_query_spec.rb
+++ b/spec/requests/api/graphql/user_query_spec.rb
@@ -91,11 +91,11 @@ RSpec.describe 'getting user information' do
presenter = UserPresenter.new(user)
expect(graphql_data['user']).to match(
- a_hash_including(
- 'id' => global_id_of(user),
+ a_graphql_entity_for(
+ user,
+ :username,
'state' => presenter.state,
'name' => presenter.name,
- 'username' => presenter.username,
'webUrl' => presenter.web_url,
'avatarUrl' => presenter.avatar_url,
'email' => presenter.public_email,
@@ -121,9 +121,9 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr)),
- a_hash_including('id' => global_id_of(assigned_mr_b)),
- a_hash_including('id' => global_id_of(assigned_mr_c))
+ a_graphql_entity_for(assigned_mr),
+ a_graphql_entity_for(assigned_mr_b),
+ a_graphql_entity_for(assigned_mr_c)
)
end
@@ -145,7 +145,7 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr_b))
+ a_graphql_entity_for(assigned_mr_b)
)
end
end
@@ -157,8 +157,8 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr_b)),
- a_hash_including('id' => global_id_of(assigned_mr_c))
+ a_graphql_entity_for(assigned_mr_b),
+ a_graphql_entity_for(assigned_mr_c)
)
end
end
@@ -169,7 +169,7 @@ RSpec.describe 'getting user information' do
it 'finds the authored mrs' do
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr_b))
+ a_graphql_entity_for(assigned_mr_b)
)
end
end
@@ -185,8 +185,8 @@ RSpec.describe 'getting user information' do
post_graphql(query, current_user: current_user)
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr_b)),
- a_hash_including('id' => global_id_of(assigned_mr_c))
+ a_graphql_entity_for(assigned_mr_b),
+ a_graphql_entity_for(assigned_mr_c)
)
end
end
@@ -212,9 +212,9 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(reviewed_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(reviewed_mr)),
- a_hash_including('id' => global_id_of(reviewed_mr_b)),
- a_hash_including('id' => global_id_of(reviewed_mr_c))
+ a_graphql_entity_for(reviewed_mr),
+ a_graphql_entity_for(reviewed_mr_b),
+ a_graphql_entity_for(reviewed_mr_c)
)
end
@@ -236,7 +236,7 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(reviewed_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(reviewed_mr_b))
+ a_graphql_entity_for(reviewed_mr_b)
)
end
end
@@ -248,8 +248,8 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(reviewed_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(reviewed_mr_b)),
- a_hash_including('id' => global_id_of(reviewed_mr_c))
+ a_graphql_entity_for(reviewed_mr_b),
+ a_graphql_entity_for(reviewed_mr_c)
)
end
end
@@ -260,7 +260,7 @@ RSpec.describe 'getting user information' do
it 'finds the authored mrs' do
expect(reviewed_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(reviewed_mr_b))
+ a_graphql_entity_for(reviewed_mr_b)
)
end
end
@@ -275,7 +275,7 @@ RSpec.describe 'getting user information' do
post_graphql(query, current_user: current_user)
expect(reviewed_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(reviewed_mr_c))
+ a_graphql_entity_for(reviewed_mr_c)
)
end
end
@@ -301,9 +301,9 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(authored_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(authored_mr)),
- a_hash_including('id' => global_id_of(authored_mr_b)),
- a_hash_including('id' => global_id_of(authored_mr_c))
+ a_graphql_entity_for(authored_mr),
+ a_graphql_entity_for(authored_mr_b),
+ a_graphql_entity_for(authored_mr_c)
)
end
@@ -329,8 +329,8 @@ RSpec.describe 'getting user information' do
post_graphql(query, current_user: current_user)
expect(authored_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(authored_mr)),
- a_hash_including('id' => global_id_of(authored_mr_c))
+ a_graphql_entity_for(authored_mr),
+ a_graphql_entity_for(authored_mr_c)
)
end
end
@@ -346,8 +346,8 @@ RSpec.describe 'getting user information' do
post_graphql(query, current_user: current_user)
expect(authored_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(authored_mr_b)),
- a_hash_including('id' => global_id_of(authored_mr_c))
+ a_graphql_entity_for(authored_mr_b),
+ a_graphql_entity_for(authored_mr_c)
)
end
end
@@ -359,7 +359,7 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(authored_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(authored_mr_b))
+ a_graphql_entity_for(authored_mr_b)
)
end
end
@@ -371,8 +371,8 @@ RSpec.describe 'getting user information' do
it 'selects the correct MRs' do
expect(authored_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(authored_mr_b)),
- a_hash_including('id' => global_id_of(authored_mr_c))
+ a_graphql_entity_for(authored_mr_b),
+ a_graphql_entity_for(authored_mr_c)
)
end
end
@@ -417,7 +417,7 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(group_memberships).to include(
- a_hash_including('id' => global_id_of(membership_a))
+ a_graphql_entity_for(membership_a)
)
end
end
@@ -440,7 +440,7 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(project_memberships).to include(
- a_hash_including('id' => global_id_of(membership_a))
+ a_graphql_entity_for(membership_a)
)
end
end
@@ -460,7 +460,7 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(authored_mrs).to include(
- a_hash_including('id' => global_id_of(authored_mr))
+ a_graphql_entity_for(authored_mr)
)
end
end
@@ -480,9 +480,9 @@ RSpec.describe 'getting user information' do
it 'can be found' do
expect(assigned_mrs).to contain_exactly(
- a_hash_including('id' => global_id_of(assigned_mr)),
- a_hash_including('id' => global_id_of(assigned_mr_b)),
- a_hash_including('id' => global_id_of(assigned_mr_c))
+ a_graphql_entity_for(assigned_mr),
+ a_graphql_entity_for(assigned_mr_b),
+ a_graphql_entity_for(assigned_mr_c)
)
end
end
diff --git a/spec/requests/api/graphql/users_spec.rb b/spec/requests/api/graphql/users_spec.rb
index fe824834a2c..79ee3c2cb57 100644
--- a/spec/requests/api/graphql/users_spec.rb
+++ b/spec/requests/api/graphql/users_spec.rb
@@ -72,12 +72,12 @@ RSpec.describe 'Users' do
post_query
expect(graphql_data.dig('users', 'nodes')).to include(
- { "id" => user0.to_global_id.to_s },
- { "id" => user1.to_global_id.to_s },
- { "id" => user2.to_global_id.to_s },
- { "id" => user3.to_global_id.to_s },
- { "id" => admin.to_global_id.to_s },
- { "id" => another_admin.to_global_id.to_s }
+ a_graphql_entity_for(user0),
+ a_graphql_entity_for(user1),
+ a_graphql_entity_for(user2),
+ a_graphql_entity_for(user3),
+ a_graphql_entity_for(admin),
+ a_graphql_entity_for(another_admin)
)
end
end
@@ -91,15 +91,15 @@ RSpec.describe 'Users' do
post_graphql(query, current_user: current_user)
expect(graphql_data.dig('users', 'nodes')).to include(
- { "id" => another_admin.to_global_id.to_s },
- { "id" => admin.to_global_id.to_s }
+ a_graphql_entity_for(another_admin),
+ a_graphql_entity_for(admin)
)
expect(graphql_data.dig('users', 'nodes')).not_to include(
- { "id" => user0.to_global_id.to_s },
- { "id" => user1.to_global_id.to_s },
- { "id" => user2.to_global_id.to_s },
- { "id" => user3.to_global_id.to_s }
+ a_graphql_entity_for(user0),
+ a_graphql_entity_for(user1),
+ a_graphql_entity_for(user2),
+ a_graphql_entity_for(user3)
)
end
end
@@ -114,7 +114,7 @@ RSpec.describe 'Users' do
end
context 'when sorting by created_at' do
- let_it_be(:ascending_users) { [user3, user2, user1, user0].map { |u| global_id_of(u) } }
+ let_it_be(:ascending_users) { [user3, user2, user1, user0].map { |u| global_id_of(u).to_s } }
context 'when ascending' do
it_behaves_like 'sorted paginated query' do
diff --git a/spec/requests/api/graphql/work_item_spec.rb b/spec/requests/api/graphql/work_item_spec.rb
index bc5a8b3e006..5b34c21989a 100644
--- a/spec/requests/api/graphql/work_item_spec.rb
+++ b/spec/requests/api/graphql/work_item_spec.rb
@@ -33,7 +33,8 @@ RSpec.describe 'Query.work_item(id)' do
'lockVersion' => work_item.lock_version,
'state' => "OPEN",
'title' => work_item.title,
- 'workItemType' => hash_including('id' => work_item.work_item_type.to_gid.to_s)
+ 'workItemType' => hash_including('id' => work_item.work_item_type.to_gid.to_s),
+ 'userPermissions' => { 'readWorkItem' => true, 'updateWorkItem' => true, 'deleteWorkItem' => false }
)
end
diff --git a/spec/requests/api/group_container_repositories_spec.rb b/spec/requests/api/group_container_repositories_spec.rb
index bf29bd91414..413c37eaed9 100644
--- a/spec/requests/api/group_container_repositories_spec.rb
+++ b/spec/requests/api/group_container_repositories_spec.rb
@@ -37,13 +37,10 @@ RSpec.describe API::GroupContainerRepositories do
let(:url) { "/groups/#{group.id}/registry/repositories" }
let(:snowplow_gitlab_standard_context) { { user: api_user, namespace: group } }
- subject { get api(url, api_user), params: params }
+ subject { get api(url, api_user) }
it_behaves_like 'rejected container repository access', :guest, :forbidden
it_behaves_like 'rejected container repository access', :anonymous, :not_found
- it_behaves_like 'handling network errors with the container registry' do
- let(:params) { { tags: true } }
- end
it_behaves_like 'returns repositories for allowed users', :reporter, 'group' do
let(:object) { group }
diff --git a/spec/requests/api/group_milestones_spec.rb b/spec/requests/api/group_milestones_spec.rb
index 2312d35c815..da84e98b905 100644
--- a/spec/requests/api/group_milestones_spec.rb
+++ b/spec/requests/api/group_milestones_spec.rb
@@ -85,7 +85,7 @@ RSpec.describe API::GroupMilestones do
def setup_for_group
context_group.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
- context_group.add_developer(user)
+ context_group.add_reporter(user)
public_project.update!(namespace: context_group)
context_group.reload
end
diff --git a/spec/requests/api/import_bitbucket_server_spec.rb b/spec/requests/api/import_bitbucket_server_spec.rb
index 970416c7444..8ab41f49549 100644
--- a/spec/requests/api/import_bitbucket_server_spec.rb
+++ b/spec/requests/api/import_bitbucket_server_spec.rb
@@ -9,7 +9,15 @@ RSpec.describe API::ImportBitbucketServer do
let(:secret) { "sekrettt" }
let(:project_key) { 'TES' }
let(:repo_slug) { 'vim' }
- let(:repo) { { name: 'vim' } }
+ let(:repo) do
+ double('repo',
+ name: repo_slug,
+ browse_url: "#{base_uri}/projects/#{project_key}/repos/#{repo_slug}/browse",
+ clone_url: "#{base_uri}/scm/#{project_key}/#{repo_slug}.git",
+ description: 'provider',
+ visibility_level: Gitlab::VisibilityLevel::PUBLIC
+ )
+ end
describe "POST /import/bitbucket_server" do
context 'with no optional parameters' do
@@ -20,7 +28,7 @@ RSpec.describe API::ImportBitbucketServer do
before do
Grape::Endpoint.before_each do |endpoint|
allow(endpoint).to receive(:client).and_return(client.as_null_object)
- allow(client).to receive(:repo).with(project_key, repo_slug).and_return(double(name: repo_slug))
+ allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo)
end
end
diff --git a/spec/requests/api/import_github_spec.rb b/spec/requests/api/import_github_spec.rb
index f0c4fcc4f29..7de72de3940 100644
--- a/spec/requests/api/import_github_spec.rb
+++ b/spec/requests/api/import_github_spec.rb
@@ -16,7 +16,11 @@ RSpec.describe API::ImportGithub do
double('provider',
name: 'vim',
full_name: "#{provider_username}/vim",
- owner: double('provider', login: provider_username)
+ owner: double('provider', login: provider_username),
+ description: 'provider',
+ private: false,
+ clone_url: 'https://fake.url/vim.git',
+ has_wiki?: true
)
end
diff --git a/spec/requests/api/integrations/jira_connect/subscriptions_spec.rb b/spec/requests/api/integrations/jira_connect/subscriptions_spec.rb
new file mode 100644
index 00000000000..86f8992a624
--- /dev/null
+++ b/spec/requests/api/integrations/jira_connect/subscriptions_spec.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe API::Integrations::JiraConnect::Subscriptions do
+ describe 'POST /integrations/jira_connect/subscriptions' do
+ subject(:post_subscriptions) { post api('/integrations/jira_connect/subscriptions') }
+
+ it 'returns 401' do
+ post_subscriptions
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ context 'with user token' do
+ let(:group) { create(:group) }
+ let(:user) { create(:user) }
+
+ subject(:post_subscriptions) do
+ post api('/integrations/jira_connect/subscriptions', user), params: { jwt: jwt, namespace_path: group.path }
+ end
+
+ context 'with feature flag disabled' do
+ before do
+ stub_feature_flags(jira_connect_oauth: false)
+ end
+
+ let(:jwt) { '123' }
+
+ it 'returns 404' do
+ post_subscriptions
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'with invalid JWT' do
+ let(:jwt) { '123' }
+
+ it 'returns 401' do
+ post_subscriptions
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+
+ context 'with valid JWT' do
+ let_it_be(:installation) { create(:jira_connect_installation) }
+ let_it_be(:user) { create(:user) }
+
+ let(:claims) { { iss: installation.client_key, qsh: 'context-qsh', sub: 1234 } }
+ let(:jwt) { Atlassian::Jwt.encode(claims, installation.shared_secret) }
+ let(:jira_user) { { 'groups' => { 'items' => [{ 'name' => jira_group_name }] } } }
+ let(:jira_group_name) { 'site-admins' }
+
+ before do
+ WebMock
+ .stub_request(:get, "#{installation.base_url}/rest/api/3/user?accountId=1234&expand=groups")
+ .to_return(body: jira_user.to_json, status: 200, headers: { 'Content-Type' => 'application/json' })
+ end
+
+ it 'returns 401 if the user does not have access to the group' do
+ post_subscriptions
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+
+ context 'user has access to the group' do
+ before do
+ group.add_maintainer(user)
+ end
+
+ it 'creates a subscription' do
+ expect { post_subscriptions }.to change { installation.subscriptions.count }.from(0).to(1)
+ end
+
+ it 'returns 201' do
+ post_subscriptions
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 2b7963eadab..acfe476a864 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -612,30 +612,6 @@ RSpec.describe API::Internal::Base do
expect(json_response["gitaly"]["features"]).to eq('gitaly-feature-mep-mep' => 'false')
end
end
-
- context "with a sidechannels enabled for a project" do
- before do
- stub_feature_flags(gitlab_shell_upload_pack_sidechannel: project)
- end
-
- it "has the use_sidechannel field set to true for that project" do
- pull(key, project)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response["gl_repository"]).to eq("project-#{project.id}")
- expect(json_response["gitaly"]["use_sidechannel"]).to eq(true)
- end
-
- it "has the use_sidechannel field set to false for other projects" do
- other_project = create(:project, :public, :repository)
-
- pull(key, other_project)
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response["gl_repository"]).to eq("project-#{other_project.id}")
- expect(json_response["gitaly"]["use_sidechannel"]).to eq(false)
- end
- end
end
context "git push" do
@@ -826,13 +802,13 @@ RSpec.describe API::Internal::Base do
context 'git pull' do
context 'with a key that has expired' do
- let(:key) { create(:key, user: user, expires_at: 2.days.ago) }
+ let(:key) { create(:key, :expired, user: user) }
- it 'includes the `key expired` message in the response' do
+ it 'includes the `key expired` message in the response and fails' do
pull(key, project)
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['gl_console_messages']).to eq(['INFO: Your SSH key has expired. Please generate a new key.'])
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ expect(json_response['message']).to eq('Your SSH key has expired.')
end
end
@@ -1490,6 +1466,89 @@ RSpec.describe API::Internal::Base do
subject
expect(json_response['success']).to be_falsey
+ expect(json_response['message']).to eq 'Feature is not available'
+ end
+ end
+
+ describe 'POST /internal/two_factor_manual_otp_check' do
+ let(:key_id) { key.id }
+ let(:otp) { '123456'}
+
+ subject do
+ post api('/internal/two_factor_manual_otp_check'),
+ params: {
+ secret_token: secret_token,
+ key_id: key_id,
+ otp_attempt: otp
+ }
+ end
+
+ it 'is not available' do
+ subject
+
+ expect(json_response['success']).to be_falsey
+ expect(json_response['message']).to eq 'Feature is not available'
+ end
+ end
+
+ describe 'POST /internal/two_factor_push_otp_check' do
+ let(:key_id) { key.id }
+ let(:otp) { '123456'}
+
+ subject do
+ post api('/internal/two_factor_push_otp_check'),
+ params: {
+ secret_token: secret_token,
+ key_id: key_id,
+ otp_attempt: otp
+ }
+ end
+
+ it 'is not available' do
+ subject
+
+ expect(json_response['success']).to be_falsey
+ expect(json_response['message']).to eq 'Feature is not available'
+ end
+ end
+
+ describe 'POST /internal/two_factor_manual_otp_check' do
+ let(:key_id) { key.id }
+ let(:otp) { '123456'}
+
+ subject do
+ post api('/internal/two_factor_manual_otp_check'),
+ params: {
+ secret_token: secret_token,
+ key_id: key_id,
+ otp_attempt: otp
+ }
+ end
+
+ it 'is not available' do
+ subject
+
+ expect(json_response['success']).to be_falsey
+ end
+ end
+
+ describe 'POST /internal/two_factor_push_otp_check' do
+ let(:key_id) { key.id }
+ let(:otp) { '123456'}
+
+ subject do
+ post api('/internal/two_factor_push_otp_check'),
+ params: {
+ secret_token: secret_token,
+ key_id: key_id,
+ otp_attempt: otp
+ }
+ end
+
+ it 'is not available' do
+ subject
+
+ expect(json_response['success']).to be_falsey
end
end
diff --git a/spec/requests/api/internal/container_registry/migration_spec.rb b/spec/requests/api/internal/container_registry/migration_spec.rb
index 35113c66f11..db2918e65f1 100644
--- a/spec/requests/api/internal/container_registry/migration_spec.rb
+++ b/spec/requests/api/internal/container_registry/migration_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe API::Internal::ContainerRegistry::Migration do
+RSpec.describe API::Internal::ContainerRegistry::Migration, :aggregate_failures do
let_it_be_with_reload(:repository) { create(:container_repository) }
let(:secret_token) { 'secret_token' }
@@ -127,6 +127,12 @@ RSpec.describe API::Internal::ContainerRegistry::Migration do
it_behaves_like 'updating the repository migration status', from: 'pre_importing', to: 'import_aborted'
end
+
+ context 'with repository in unabortable migration state' do
+ let(:repository) { create(:container_repository, :import_skipped) }
+
+ it_behaves_like 'returning an error', with_message: 'Wrong migration state (import_skipped)'
+ end
end
end
@@ -147,6 +153,17 @@ RSpec.describe API::Internal::ContainerRegistry::Migration do
it_behaves_like 'returning an error', returning_status: :not_found
end
+
+ context 'query read location' do
+ it 'reads from the primary' do
+ expect(ContainerRepository).to receive(:find_by_path!).and_wrap_original do |m, *args|
+ expect(::Gitlab::Database::LoadBalancing::Session.current.use_primary?).to eq(true)
+ m.call(*args)
+ end
+
+ subject
+ end
+ end
end
context 'with an invalid sent token' do
diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb
index ef7f5ee87dc..5d8ed3dd0f5 100644
--- a/spec/requests/api/lint_spec.rb
+++ b/spec/requests/api/lint_spec.rb
@@ -123,6 +123,7 @@ RSpec.describe API::Lint do
expect(json_response['status']).to eq('valid')
expect(json_response['warnings']).to match_array([])
expect(json_response['errors']).to match_array([])
+ expect(json_response['includes']).to eq([])
end
it 'outputs expanded yaml content' do
@@ -153,19 +154,6 @@ RSpec.describe API::Lint do
end
end
- context 'with valid .gitlab-ci.yml using deprecated keywords' do
- let(:yaml_content) { { job: { script: 'ls', type: 'test' }, types: ['test'] }.to_yaml }
-
- it 'passes validation but returns warnings' do
- post api('/ci/lint', api_user), params: { content: yaml_content }
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['status']).to eq('valid')
- expect(json_response['warnings']).not_to be_empty
- expect(json_response['errors']).to match_array([])
- end
- end
-
context 'with an invalid .gitlab-ci.yml' do
context 'with invalid syntax' do
let(:yaml_content) { 'invalid content' }
@@ -177,6 +165,7 @@ RSpec.describe API::Lint do
expect(json_response['status']).to eq('invalid')
expect(json_response['warnings']).to eq([])
expect(json_response['errors']).to eq(['Invalid configuration format'])
+ expect(json_response['includes']).to eq(nil)
end
it 'outputs expanded yaml content' do
@@ -204,6 +193,7 @@ RSpec.describe API::Lint do
expect(json_response['status']).to eq('invalid')
expect(json_response['warnings']).to eq([])
expect(json_response['errors']).to eq(['jobs config should contain at least one visible job'])
+ expect(json_response['includes']).to eq([])
end
it 'outputs expanded yaml content' do
@@ -262,6 +252,17 @@ RSpec.describe API::Lint do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Hash
expect(json_response['merged_yaml']).to eq(expected_yaml)
+ expect(json_response['includes']).to contain_exactly(
+ {
+ 'type' => 'local',
+ 'location' => 'another-gitlab-ci.yml',
+ 'blob' => "http://localhost/#{project.full_path}/-/blob/#{project.commit.sha}/another-gitlab-ci.yml",
+ 'raw' => "http://localhost/#{project.full_path}/-/raw/#{project.commit.sha}/another-gitlab-ci.yml",
+ 'extra' => {},
+ 'context_project' => project.full_path,
+ 'context_sha' => project.commit.sha
+ }
+ )
expect(json_response['valid']).to eq(true)
expect(json_response['warnings']).to eq([])
expect(json_response['errors']).to eq([])
@@ -274,6 +275,7 @@ RSpec.describe API::Lint do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['merged_yaml']).to eq(yaml_content)
+ expect(json_response['includes']).to eq([])
expect(json_response['valid']).to eq(false)
expect(json_response['warnings']).to eq([])
expect(json_response['errors']).to eq(['jobs config should contain at least one visible job'])
@@ -327,6 +329,7 @@ RSpec.describe API::Lint do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['merged_yaml']).to eq(nil)
+ expect(json_response['includes']).to eq(nil)
expect(json_response['valid']).to eq(false)
expect(json_response['warnings']).to eq([])
expect(json_response['errors']).to eq(['Insufficient permissions to create a new pipeline'])
@@ -539,6 +542,17 @@ RSpec.describe API::Lint do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Hash
expect(json_response['merged_yaml']).to eq(expected_yaml)
+ expect(json_response['includes']).to contain_exactly(
+ {
+ 'type' => 'local',
+ 'location' => 'another-gitlab-ci.yml',
+ 'blob' => "http://localhost/#{project.full_path}/-/blob/#{project.commit.sha}/another-gitlab-ci.yml",
+ 'raw' => "http://localhost/#{project.full_path}/-/raw/#{project.commit.sha}/another-gitlab-ci.yml",
+ 'extra' => {},
+ 'context_project' => project.full_path,
+ 'context_sha' => project.commit.sha
+ }
+ )
expect(json_response['valid']).to eq(true)
expect(json_response['errors']).to eq([])
end
@@ -550,6 +564,7 @@ RSpec.describe API::Lint do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response['merged_yaml']).to eq(yaml_content)
+ expect(json_response['includes']).to eq([])
expect(json_response['valid']).to eq(false)
expect(json_response['errors']).to eq(['jobs config should contain at least one visible job'])
end
diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb
index 6bacb3a59b2..0db42e7439c 100644
--- a/spec/requests/api/members_spec.rb
+++ b/spec/requests/api/members_spec.rb
@@ -543,7 +543,7 @@ RSpec.describe API::Members do
end
it 'returns 409 if member does not exist' do
- put api("/#{source_type.pluralize}/#{source.id}/members/123", maintainer),
+ put api("/#{source_type.pluralize}/#{source.id}/members/#{non_existing_record_id}", maintainer),
params: { access_level: Member::MAINTAINER }
expect(response).to have_gitlab_http_status(:not_found)
@@ -618,7 +618,7 @@ RSpec.describe API::Members do
end
it 'returns 404 if member does not exist' do
- delete api("/#{source_type.pluralize}/#{source.id}/members/123", maintainer)
+ delete api("/#{source_type.pluralize}/#{source.id}/members/#{non_existing_record_id}", maintainer)
expect(response).to have_gitlab_http_status(:not_found)
end
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index b1183bb10fa..a7ede7f4150 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -27,10 +27,10 @@ RSpec.describe API::MergeRequests do
shared_context 'with merge requests' do
let_it_be(:milestone1) { create(:milestone, title: '0.9', project: project) }
- let_it_be(:merge_request) { create(:merge_request, :simple, milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, source_branch: 'markdown', title: "Test", created_at: base_time) }
- let_it_be(:merge_request_closed) { create(:merge_request, state: "closed", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.second) }
- let_it_be(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, merge_commit_sha: '9999999999999999999999999999999999999999') }
- let_it_be(:merge_request_locked) { create(:merge_request, state: "locked", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Locked test", created_at: base_time + 1.second) }
+ let_it_be(:merge_request) { create(:merge_request, :simple, milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, source_branch: 'markdown', title: "Test", created_at: base_time, updated_at: base_time + 3.hours) }
+ let_it_be(:merge_request_closed) { create(:merge_request, state: "closed", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.second, updated_at: base_time) }
+ let_it_be(:merge_request_locked) { create(:merge_request, state: "locked", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Locked test", created_at: base_time + 1.second, updated_at: base_time + 2.hours) }
+ let_it_be(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, updated_at: base_time + 1.hour, merge_commit_sha: '9999999999999999999999999999999999999999') }
let_it_be(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
let_it_be(:note2) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "another comment on a MR") }
end
@@ -348,19 +348,14 @@ RSpec.describe API::MergeRequests do
end
context 'with ordering' do
- before do
- @mr_later = mr_with_later_created_and_updated_at_time
- @mr_earlier = mr_with_earlier_created_and_updated_at_time
- end
-
it 'returns an array of merge_requests in ascending order' do
path = endpoint_path + '?sort=asc'
get api(path, user)
expect_paginated_array_response([
- merge_request_closed.id, merge_request_locked.id,
- merge_request_merged.id, merge_request.id
+ merge_request.id, merge_request_closed.id,
+ merge_request_locked.id, merge_request_merged.id
])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort)
@@ -372,42 +367,28 @@ RSpec.describe API::MergeRequests do
get api(path, user)
expect_paginated_array_response([
- merge_request.id, merge_request_merged.id,
- merge_request_locked.id, merge_request_closed.id
+ merge_request_merged.id, merge_request_locked.id,
+ merge_request_closed.id, merge_request.id
])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort.reverse)
end
context '2 merge requests with equal created_at' do
- let!(:closed_mr2) do
- create :merge_request,
- state: 'closed',
- milestone: milestone1,
- author: user,
- assignees: [user],
- source_project: project,
- target_project: project,
- title: "Test",
- created_at: @mr_earlier.created_at
- end
-
it 'page breaks first page correctly' do
- get api("#{endpoint_path}?sort=desc&per_page=4", user)
+ get api("#{endpoint_path}?sort=desc&per_page=2", user)
response_ids = json_response.map { |merge_request| merge_request['id'] }
- expect(response_ids).to include(closed_mr2.id)
- expect(response_ids).not_to include(@mr_earlier.id)
+ expect(response_ids).to contain_exactly(merge_request_merged.id, merge_request_locked.id)
end
it 'page breaks second page correctly' do
- get api("#{endpoint_path}?sort=desc&per_page=4&page=2", user)
+ get api("#{endpoint_path}?sort=desc&per_page=2&page=2", user)
response_ids = json_response.map { |merge_request| merge_request['id'] }
- expect(response_ids).not_to include(closed_mr2.id)
- expect(response_ids).to include(@mr_earlier.id)
+ expect(response_ids).to contain_exactly(merge_request_closed.id, merge_request.id)
end
end
@@ -430,8 +411,8 @@ RSpec.describe API::MergeRequests do
get api(path, user)
expect_paginated_array_response([
- merge_request_closed.id, merge_request_locked.id,
- merge_request_merged.id, merge_request.id
+ merge_request.id, merge_request_closed.id,
+ merge_request_locked.id, merge_request_merged.id
])
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
expect(response_dates).to eq(response_dates.sort)
@@ -3379,20 +3360,4 @@ RSpec.describe API::MergeRequests do
include_examples 'time tracking endpoints', 'merge_request'
end
-
- def mr_with_later_created_and_updated_at_time
- merge_request
- merge_request.created_at += 1.hour
- merge_request.updated_at += 30.minutes
- merge_request.save!
- merge_request
- end
-
- def mr_with_earlier_created_and_updated_at_time
- merge_request_closed
- merge_request_closed.created_at -= 1.hour
- merge_request_closed.updated_at -= 30.minutes
- merge_request_closed.save!
- merge_request_closed
- end
end
diff --git a/spec/requests/api/personal_access_tokens_spec.rb b/spec/requests/api/personal_access_tokens_spec.rb
index 0ff2c46e693..01f69f0aae2 100644
--- a/spec/requests/api/personal_access_tokens_spec.rb
+++ b/spec/requests/api/personal_access_tokens_spec.rb
@@ -73,6 +73,54 @@ RSpec.describe API::PersonalAccessTokens do
end
end
+ describe 'DELETE /personal_access_tokens/self' do
+ let(:path) { '/personal_access_tokens/self' }
+ let(:token) { create(:personal_access_token, user: current_user) }
+
+ subject { delete api(path, current_user, personal_access_token: token) }
+
+ shared_examples 'revoking token succeeds' do
+ it 'revokes token' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ expect(token.reload).to be_revoked
+ end
+ end
+
+ shared_examples 'revoking token denied' do |status|
+ it 'cannot revoke token' do
+ subject
+
+ expect(response).to have_gitlab_http_status(status)
+ end
+ end
+
+ context 'when current_user is an administrator', :enable_admin_mode do
+ let(:current_user) { create(:admin) }
+
+ it_behaves_like 'revoking token succeeds'
+ end
+
+ context 'when current_user is not an administrator' do
+ let(:current_user) { create(:user) }
+
+ it_behaves_like 'revoking token succeeds'
+
+ context 'with impersonated token' do
+ let(:token) { create(:personal_access_token, :impersonation, user: current_user) }
+
+ it_behaves_like 'revoking token denied', :bad_request
+ end
+
+ context 'with already revoked token' do
+ let(:token) { create(:personal_access_token, :revoked, user: current_user) }
+
+ it_behaves_like 'revoking token denied', :unauthorized
+ end
+ end
+ end
+
describe 'DELETE /personal_access_tokens/:id' do
let(:path) { "/personal_access_tokens/#{token1.id}" }
diff --git a/spec/requests/api/project_attributes.yml b/spec/requests/api/project_attributes.yml
index fbcaa404edb..eb6f81c2810 100644
--- a/spec/requests/api/project_attributes.yml
+++ b/spec/requests/api/project_attributes.yml
@@ -99,6 +99,7 @@ ci_cd_settings:
default_git_depth: ci_default_git_depth
forward_deployment_enabled: ci_forward_deployment_enabled
job_token_scope_enabled: ci_job_token_scope_enabled
+ separated_caches: ci_separated_caches
build_import_state: # import_state
unexposed_attributes:
diff --git a/spec/requests/api/project_container_repositories_spec.rb b/spec/requests/api/project_container_repositories_spec.rb
index 196b0395ec0..506e60d19a6 100644
--- a/spec/requests/api/project_container_repositories_spec.rb
+++ b/spec/requests/api/project_container_repositories_spec.rb
@@ -113,6 +113,10 @@ RSpec.describe API::ProjectContainerRepositories do
it_behaves_like 'returns repositories for allowed users', :reporter, 'project' do
let(:object) { project }
end
+
+ it_behaves_like 'returns tags for allowed users', :reporter, 'project' do
+ let(:object) { project }
+ end
end
end
@@ -246,8 +250,7 @@ RSpec.describe API::ProjectContainerRepositories do
name_regex_delete: 'v10.*',
name_regex_keep: 'v10.1.*',
keep_n: 100,
- older_than: '1 day',
- container_expiration_policy: false }
+ older_than: '1 day' }
end
let(:lease_key) { "container_repository:cleanup_tags:#{root_repository.id}" }
@@ -293,8 +296,7 @@ RSpec.describe API::ProjectContainerRepositories do
name_regex_delete: nil,
name_regex_keep: 'v10.1.*',
keep_n: 100,
- older_than: '1 day',
- container_expiration_policy: false }
+ older_than: '1 day' }
end
it 'schedules cleanup of tags repository' do
diff --git a/spec/requests/api/project_export_spec.rb b/spec/requests/api/project_export_spec.rb
index 07efd56fef4..8a8cd8512f8 100644
--- a/spec/requests/api/project_export_spec.rb
+++ b/spec/requests/api/project_export_spec.rb
@@ -410,6 +410,27 @@ RSpec.describe API::ProjectExport, :clean_gitlab_redis_cache do
it_behaves_like 'post project export start'
+ context 'with project export size limit' do
+ before do
+ stub_application_setting(max_export_size: 1)
+ end
+
+ it 'starts if limit not exceeded' do
+ post api(path, user)
+
+ expect(response).to have_gitlab_http_status(:accepted)
+ end
+
+ it '400 response if limit exceeded' do
+ project.statistics.update!(lfs_objects_size: 2.megabytes, repository_size: 2.megabytes)
+
+ post api(path, user)
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response["message"]).to include('The project size exceeds the export limit.')
+ end
+ end
+
context 'when rate limit is exceeded across projects' do
before do
allow(Gitlab::ApplicationRateLimiter)
diff --git a/spec/requests/api/project_milestones_spec.rb b/spec/requests/api/project_milestones_spec.rb
index 8c9a93cf9fa..b23fb86a9de 100644
--- a/spec/requests/api/project_milestones_spec.rb
+++ b/spec/requests/api/project_milestones_spec.rb
@@ -9,8 +9,8 @@ RSpec.describe API::ProjectMilestones do
let_it_be(:milestone) { create(:milestone, project: project, title: 'version2', description: 'open milestone') }
let_it_be(:route) { "/projects/#{project.id}/milestones" }
- before do
- project.add_developer(user)
+ before_all do
+ project.add_reporter(user)
end
it_behaves_like 'group and project milestones', "/projects/:id/milestones"
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 011300a038f..d2189ab02ea 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -739,6 +739,32 @@ RSpec.describe API::Projects do
end
end
+ context 'with default created_at desc order' do
+ let_it_be(:group_with_projects) { create(:group) }
+ let_it_be(:project_1) { create(:project, name: 'Project 1', created_at: 3.days.ago, path: 'project1', group: group_with_projects) }
+ let_it_be(:project_2) { create(:project, name: 'Project 2', created_at: 2.days.ago, path: 'project2', group: group_with_projects) }
+ let_it_be(:project_3) { create(:project, name: 'Project 3', created_at: 1.day.ago, path: 'project3', group: group_with_projects) }
+
+ let(:current_user) { user }
+ let(:params) { {} }
+
+ subject { get api('/projects', current_user), params: params }
+
+ before do
+ group_with_projects.add_owner(current_user) if current_user
+ end
+
+ it 'orders by id desc instead' do
+ projects_ordered_by_id_desc = /SELECT "projects".+ORDER BY "projects"."id" DESC/i
+ expect { subject }.to make_queries_matching projects_ordered_by_id_desc
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.first['id']).to eq(project_3.id)
+ end
+ end
+
context 'sorting' do
context 'by project statistics' do
%w(repository_size storage_size wiki_size packages_size).each do |order_by|
@@ -1180,9 +1206,15 @@ RSpec.describe API::Projects do
end
it 'disallows creating a project with an import_url when git import source is disabled' do
+ url = 'http://example.com'
stub_application_setting(import_sources: nil)
- project_params = { import_url: 'http://example.com', path: 'path-project-Foo', name: 'Foo Project' }
+ endpoint_url = "#{url}/info/refs?service=git-upload-pack"
+ stub_full_request(endpoint_url, method: :get).to_return({ status: 200,
+ body: '001e# service=git-upload-pack',
+ headers: { 'Content-Type': 'application/x-git-upload-pack-advertisement' } })
+
+ project_params = { import_url: url, path: 'path-project-Foo', name: 'Foo Project' }
expect { post api('/projects', user), params: project_params }
.not_to change { Project.count }
@@ -2522,6 +2554,7 @@ RSpec.describe API::Projects do
expect(links['labels']).to end_with("/api/v4/projects/#{project.id}/labels")
expect(links['events']).to end_with("/api/v4/projects/#{project.id}/events")
expect(links['members']).to end_with("/api/v4/projects/#{project.id}/members")
+ expect(links['cluster_agents']).to end_with("/api/v4/projects/#{project.id}/cluster_agents")
end
it 'filters related URIs when their feature is not enabled' do
@@ -3556,6 +3589,20 @@ RSpec.describe API::Projects do
expect(json_response['topics']).to eq(%w[topic2])
end
+ it 'updates enforce_auth_checks_on_uploads' do
+ project3.update!(enforce_auth_checks_on_uploads: false)
+
+ project_param = { enforce_auth_checks_on_uploads: true }
+
+ expect { put api("/projects/#{project3.id}", user), params: project_param }
+ .to change { project3.reload.enforce_auth_checks_on_uploads }
+ .from(false)
+ .to(true)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['enforce_auth_checks_on_uploads']).to eq(true)
+ end
+
it 'updates squash_option' do
project3.update!(squash_option: 'always')
@@ -4463,6 +4510,43 @@ RSpec.describe API::Projects do
end
end
+ describe 'POST /projects/:id/repository_size' do
+ let(:update_statistics_service) { Projects::UpdateStatisticsService.new(project, nil, statistics: [:repository_size, :lfs_objects_size]) }
+
+ before do
+ allow(Projects::UpdateStatisticsService).to receive(:new).with(project, nil, statistics: [:repository_size, :lfs_objects_size]).and_return(update_statistics_service)
+ end
+
+ context 'when authenticated as owner' do
+ it 'starts the housekeeping process' do
+ expect(update_statistics_service).to receive(:execute).once
+
+ post api("/projects/#{project.id}/repository_size", user)
+
+ expect(response).to have_gitlab_http_status(:created)
+ end
+ end
+
+ context 'when authenticated as developer' do
+ before do
+ project_member
+ end
+
+ it 'returns forbidden error' do
+ post api("/projects/#{project.id}/repository_size", user3)
+
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
+ end
+
+ context 'when unauthenticated' do
+ it 'returns authentication error' do
+ post api("/projects/#{project.id}/repository_size")
+
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
+ end
+ end
describe 'PUT /projects/:id/transfer' do
context 'when authenticated as owner' do
let(:group) { create :group }
diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb
index c6bf72176a8..3c0f3a75f10 100644
--- a/spec/requests/api/releases_spec.rb
+++ b/spec/requests/api/releases_spec.rb
@@ -1399,14 +1399,6 @@ RSpec.describe API::Releases do
expect(response).to have_gitlab_http_status(:not_found)
end
-
- it 'returns not found unless :group_releases_finder_inoperator feature flag enabled' do
- stub_feature_flags(group_releases_finder_inoperator: false)
-
- get api("/groups/#{group1.id}/releases", admin)
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
end
context 'when authenticated as guest' do
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index c724c69045e..cfda06da8f3 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -54,6 +54,8 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['runner_token_expiration_interval']).to be_nil
expect(json_response['group_runner_token_expiration_interval']).to be_nil
expect(json_response['project_runner_token_expiration_interval']).to be_nil
+ expect(json_response['max_export_size']).to eq(0)
+ expect(json_response['pipeline_limit_per_project_user_sha']).to eq(0)
end
end
@@ -138,6 +140,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
spam_check_api_key: 'SPAM_CHECK_API_KEY',
mailgun_events_enabled: true,
mailgun_signing_key: 'MAILGUN_SIGNING_KEY',
+ max_export_size: 6,
disabled_oauth_sign_in_sources: 'unknown',
import_sources: 'github,bitbucket',
wiki_page_max_content_bytes: 12345,
@@ -193,6 +196,7 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
expect(json_response['spam_check_api_key']).to eq('SPAM_CHECK_API_KEY')
expect(json_response['mailgun_events_enabled']).to be(true)
expect(json_response['mailgun_signing_key']).to eq('MAILGUN_SIGNING_KEY')
+ expect(json_response['max_export_size']).to eq(6)
expect(json_response['disabled_oauth_sign_in_sources']).to eq([])
expect(json_response['import_sources']).to match_array(%w(github bitbucket))
expect(json_response['wiki_page_max_content_bytes']).to eq(12345)
@@ -736,5 +740,39 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
)
end
end
+
+ context 'with pipeline_limit_per_project_user_sha' do
+ it 'updates the settings' do
+ put api("/application/settings", admin), params: {
+ pipeline_limit_per_project_user_sha: 25
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ 'pipeline_limit_per_project_user_sha' => 25
+ )
+ end
+
+ it 'updates the settings with zero value' do
+ put api("/application/settings", admin), params: {
+ pipeline_limit_per_project_user_sha: 0
+ }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to include(
+ 'pipeline_limit_per_project_user_sha' => 0
+ )
+ end
+
+ it 'does not allow null values' do
+ put api("/application/settings", admin), params: {
+ pipeline_limit_per_project_user_sha: nil
+ }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']['pipeline_limit_per_project_user_sha'])
+ .to include(a_string_matching('is not a number'))
+ end
+ end
end
end
diff --git a/spec/requests/api/sidekiq_metrics_spec.rb b/spec/requests/api/sidekiq_metrics_spec.rb
index 23ac2ea5c0b..302d824e650 100644
--- a/spec/requests/api/sidekiq_metrics_spec.rb
+++ b/spec/requests/api/sidekiq_metrics_spec.rb
@@ -10,7 +10,18 @@ RSpec.describe API::SidekiqMetrics do
get api('/sidekiq/queue_metrics', admin)
expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to be_a Hash
+ expect(json_response).to match a_hash_including(
+ 'queues' => a_hash_including(
+ 'default' => {
+ 'backlog' => be_a(Integer),
+ 'latency' => be_a(Integer)
+ },
+ 'mailers' => {
+ 'backlog' => be_a(Integer),
+ 'latency' => be_a(Integer)
+ }
+ )
+ )
end
it 'defines the `process_metrics` endpoint' do
diff --git a/spec/requests/api/topics_spec.rb b/spec/requests/api/topics_spec.rb
index 5c17ca9581e..e711414a895 100644
--- a/spec/requests/api/topics_spec.rb
+++ b/spec/requests/api/topics_spec.rb
@@ -117,7 +117,7 @@ RSpec.describe API::Topics do
describe 'POST /topics', :aggregate_failures do
context 'as administrator' do
it 'creates a topic' do
- post api('/topics/', admin), params: { name: 'my-topic' }
+ post api('/topics/', admin), params: { name: 'my-topic', title: 'My Topic' }
expect(response).to have_gitlab_http_status(:created)
expect(json_response['name']).to eq('my-topic')
@@ -128,7 +128,7 @@ RSpec.describe API::Topics do
workhorse_form_with_file(
api('/topics/', admin),
file_key: :avatar,
- params: { name: 'my-topic', description: 'my description...', avatar: file }
+ params: { name: 'my-topic', title: 'My Topic', description: 'my description...', avatar: file }
)
expect(response).to have_gitlab_http_status(:created)
@@ -137,23 +137,30 @@ RSpec.describe API::Topics do
end
it 'returns 400 if name is missing' do
- post api('/topics/', admin)
+ post api('/topics/', admin), params: { title: 'My Topic' }
expect(response).to have_gitlab_http_status(:bad_request)
expect(json_response['error']).to eql('name is missing')
end
it 'returns 400 if name is not unique (case insensitive)' do
- post api('/topics/', admin), params: { name: topic_1.name.downcase }
+ post api('/topics/', admin), params: { name: topic_1.name.downcase, title: 'My Topic' }
expect(response).to have_gitlab_http_status(:bad_request)
expect(json_response['message']['name']).to eq(['has already been taken'])
end
+
+ it 'returns 400 if title is missing' do
+ post api('/topics/', admin), params: { name: 'my-topic' }
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error']).to eql('title is missing')
+ end
end
context 'as normal user' do
it 'returns 403 Forbidden' do
- post api('/topics/', user), params: { name: 'my-topic' }
+ post api('/topics/', user), params: { name: 'my-topic', title: 'My Topic' }
expect(response).to have_gitlab_http_status(:forbidden)
end
@@ -161,7 +168,7 @@ RSpec.describe API::Topics do
context 'as anonymous' do
it 'returns 401 Unauthorized' do
- post api('/topics/'), params: { name: 'my-topic' }
+ post api('/topics/'), params: { name: 'my-topic', title: 'My Topic' }
expect(response).to have_gitlab_http_status(:unauthorized)
end
diff --git a/spec/requests/api/usage_data_spec.rb b/spec/requests/api/usage_data_spec.rb
index aefccc4fbf7..ea50c404d92 100644
--- a/spec/requests/api/usage_data_spec.rb
+++ b/spec/requests/api/usage_data_spec.rb
@@ -7,9 +7,7 @@ RSpec.describe API::UsageData do
describe 'POST /usage_data/increment_counter' do
let(:endpoint) { '/usage_data/increment_counter' }
- let(:known_event) { "#{known_event_prefix}_#{known_event_postfix}" }
- let(:known_event_prefix) { "static_site_editor" }
- let(:known_event_postfix) { 'commits' }
+ let(:known_event) { "diff_searches" }
let(:unknown_event) { 'unknown' }
context 'without CSRF token' do
@@ -44,7 +42,6 @@ RSpec.describe API::UsageData do
context 'with authentication' do
before do
stub_feature_flags(usage_data_api: true)
- stub_feature_flags("usage_data_#{known_event}" => true)
stub_application_setting(usage_ping_enabled: true)
allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true)
end
@@ -58,28 +55,18 @@ RSpec.describe API::UsageData do
end
context 'with correct params' do
- using RSpec::Parameterized::TableSyntax
-
- where(:prefix, :event) do
- 'static_site_editor' | 'merge_requests'
- 'static_site_editor' | 'commits'
- end
-
before do
stub_application_setting(usage_ping_enabled: true)
stub_feature_flags(usage_data_api: true)
allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true)
- stub_feature_flags("usage_data_#{prefix}_#{event}" => true)
end
- with_them do
- it 'returns status :ok' do
- expect(Gitlab::UsageDataCounters::BaseCounter).to receive(:count).with(event)
+ it 'returns status :ok' do
+ expect(Gitlab::UsageDataCounters::BaseCounter).to receive(:count).with("searches")
- post api(endpoint, user), params: { event: "#{prefix}_#{event}" }
+ post api(endpoint, user), params: { event: known_event }
- expect(response).to have_gitlab_http_status(:ok)
- end
+ expect(response).to have_gitlab_http_status(:ok)
end
end
@@ -137,7 +124,6 @@ RSpec.describe API::UsageData do
context 'with authentication' do
before do
stub_feature_flags(usage_data_api: true)
- stub_feature_flags("usage_data_#{known_event}" => true)
stub_application_setting(usage_ping_enabled: true)
allow(Gitlab::RequestForgeryProtection).to receive(:verified?).and_return(true)
end
diff --git a/spec/requests/api/user_counts_spec.rb b/spec/requests/api/user_counts_spec.rb
index 27ebf02dd81..2d4705920cf 100644
--- a/spec/requests/api/user_counts_spec.rb
+++ b/spec/requests/api/user_counts_spec.rb
@@ -43,7 +43,7 @@ RSpec.describe API::UserCounts do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_a Hash
expect(json_response['merge_requests']).to eq(2)
- expect(json_response['attention_requests']).to eq(2)
+ expect(json_response['attention_requests']).to eq(0)
end
describe 'mr_attention_requests is disabled' do
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index c554463df76..040ac4f74a7 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -1679,13 +1679,13 @@ RSpec.describe API::Users do
end
it 'creates SSH key with `expires_at` attribute' do
- optional_attributes = { expires_at: '2016-01-21T00:00:00.000Z' }
+ optional_attributes = { expires_at: 3.weeks.from_now }
attributes = attributes_for(:key).merge(optional_attributes)
post api("/users/#{user.id}/keys", admin), params: attributes
expect(response).to have_gitlab_http_status(:created)
- expect(json_response['expires_at']).to eq(optional_attributes[:expires_at])
+ expect(json_response['expires_at'].to_date).to eq(optional_attributes[:expires_at].to_date)
end
it "returns 400 for invalid ID" do
@@ -2373,13 +2373,13 @@ RSpec.describe API::Users do
end
it 'creates SSH key with `expires_at` attribute' do
- optional_attributes = { expires_at: '2016-01-21T00:00:00.000Z' }
+ optional_attributes = { expires_at: 3.weeks.from_now }
attributes = attributes_for(:key).merge(optional_attributes)
post api("/user/keys", user), params: attributes
expect(response).to have_gitlab_http_status(:created)
- expect(json_response['expires_at']).to eq(optional_attributes[:expires_at])
+ expect(json_response['expires_at'].to_date).to eq(optional_attributes[:expires_at].to_date)
end
it "returns a 401 error if unauthorized" do
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index 4b2f11da77e..acf83916f82 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -2,9 +2,12 @@
require 'spec_helper'
RSpec.describe 'Git LFS API and storage' do
+ using RSpec::Parameterized::TableSyntax
+
include LfsHttpHelpers
include ProjectForksHelper
include WorkhorseHelpers
+ include WorkhorseLfsHelpers
let_it_be(:project, reload: true) { create(:project, :empty_repo) }
let_it_be(:user) { create(:user) }
@@ -814,7 +817,23 @@ RSpec.describe 'Git LFS API and storage' do
context 'and request to finalize the upload is not sent by gitlab-workhorse' do
it 'fails with a JWT decode error' do
- expect { put_finalize(lfs_tmp_file, verified: false) }.to raise_error(JWT::DecodeError)
+ expect { put_finalize(verified: false) }.to raise_error(JWT::DecodeError)
+ end
+ end
+
+ context 'and the uploaded file is invalid' do
+ where(:size, :sha256, :status) do
+ nil | nil | :ok # Test setup sanity check
+ 0 | nil | :bad_request
+ nil | 'a' * 64 | :bad_request
+ end
+
+ with_them do
+ it 'validates the upload size and SHA256' do
+ put_finalize(size: size, sha256: sha256)
+
+ expect(response).to have_gitlab_http_status(status)
+ end
end
end
@@ -840,7 +859,7 @@ RSpec.describe 'Git LFS API and storage' do
let(:tmp_object) do
fog_connection.directories.new(key: 'lfs-objects').files.create( # rubocop: disable Rails/SaveBang
key: 'tmp/uploads/12312300',
- body: 'content'
+ body: 'x' * sample_size
)
end
@@ -1106,13 +1125,7 @@ RSpec.describe 'Git LFS API and storage' do
context 'when pushing the same LFS object to the second project' do
before do
- finalize_headers = headers
- .merge('X-Gitlab-Lfs-Tmp' => lfs_tmp_file)
- .merge(workhorse_internal_api_request_header)
-
- put objects_url(second_project, sample_oid, sample_size),
- params: {},
- headers: finalize_headers
+ put_finalize(with_tempfile: true, to_project: second_project)
end
it_behaves_like 'LFS http 200 response'
@@ -1130,38 +1143,6 @@ RSpec.describe 'Git LFS API and storage' do
put authorize_url(project, sample_oid, sample_size), params: {}, headers: authorize_headers
end
-
- def put_finalize(lfs_tmp = lfs_tmp_file, with_tempfile: false, verified: true, remote_object: nil, args: {})
- uploaded_file = nil
-
- if with_tempfile
- upload_path = LfsObjectUploader.workhorse_local_upload_path
- file_path = upload_path + '/' + lfs_tmp if lfs_tmp
-
- FileUtils.mkdir_p(upload_path)
- FileUtils.touch(file_path)
-
- uploaded_file = UploadedFile.new(file_path, filename: File.basename(file_path))
- elsif remote_object
- uploaded_file = fog_to_uploaded_file(remote_object)
- end
-
- finalize_headers = headers
- finalize_headers.merge!(workhorse_internal_api_request_header) if verified
-
- workhorse_finalize(
- objects_url(project, sample_oid, sample_size),
- method: :put,
- file_key: :file,
- params: args.merge(file: uploaded_file),
- headers: finalize_headers,
- send_rewritten_field: include_workhorse_jwt_header
- )
- end
-
- def lfs_tmp_file
- "#{sample_oid}012345678"
- end
end
end
end
diff --git a/spec/requests/oauth_tokens_spec.rb b/spec/requests/oauth_tokens_spec.rb
index fdcc76f42cc..30659a5b896 100644
--- a/spec/requests/oauth_tokens_spec.rb
+++ b/spec/requests/oauth_tokens_spec.rb
@@ -54,30 +54,7 @@ RSpec.describe 'OAuth Tokens requests' do
end.to change { Doorkeeper::AccessToken.count }.by(1)
expect(json_response['access_token']).not_to be_nil
- end
-
- context 'when the application is configured to use expiring tokens' do
- before do
- application.update!(expire_access_tokens: true)
- end
-
- it 'generates an access token with an expiration' do
- request_access_token(user)
-
- expect(json_response['expires_in']).not_to be_nil
- end
- end
-
- context 'when the application is configured not to use expiring tokens' do
- before do
- application.update!(expire_access_tokens: false)
- end
-
- it 'generates an access token without an expiration' do
- request_access_token(user)
-
- expect(json_response.key?('expires_in')).to eq(false)
- end
+ expect(json_response['expires_in']).not_to be_nil
end
end
end
diff --git a/spec/requests/projects/issue_links_controller_spec.rb b/spec/requests/projects/issue_links_controller_spec.rb
index d22955718f8..3447ff83ed8 100644
--- a/spec/requests/projects/issue_links_controller_spec.rb
+++ b/spec/requests/projects/issue_links_controller_spec.rb
@@ -24,6 +24,17 @@ RSpec.describe Projects::IssueLinksController do
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(list_service_response.as_json)
end
+
+ context 'when linked issue is a task' do
+ let(:issue_b) { create :issue, :task, project: project }
+
+ it 'returns a work item path for the linked task' do
+ get namespace_project_issue_links_path(issue_links_params)
+
+ expect(json_response.count).to eq(1)
+ expect(json_response.first).to include('path' => project_work_items_path(issue_b.project, issue_b.id))
+ end
+ end
end
describe 'POST /*namespace_id/:project_id/issues/:issue_id/links' do
diff --git a/spec/requests/pwa_controller_spec.rb b/spec/requests/pwa_controller_spec.rb
new file mode 100644
index 00000000000..f74f37ea9d0
--- /dev/null
+++ b/spec/requests/pwa_controller_spec.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe PwaController do
+ describe 'GET #offline' do
+ it 'responds with static HTML page' do
+ get offline_path
+
+ expect(response.body).to include('You are currently offline')
+ expect(response).to have_gitlab_http_status(:success)
+ end
+ end
+end
diff --git a/spec/requests/request_profiler_spec.rb b/spec/requests/request_profiler_spec.rb
deleted file mode 100644
index 72689595480..00000000000
--- a/spec/requests/request_profiler_spec.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'Request Profiler' do
- let(:user) { create(:user) }
-
- shared_examples 'profiling a request' do |profile_type, extension|
- before do
- allow(Rails).to receive(:cache).and_return(ActiveSupport::Cache::MemoryStore.new)
- allow(RubyProf::Profile).to receive(:profile) do |&blk|
- blk.call
- RubyProf::Profile.new
- end
- allow(MemoryProfiler).to receive(:report) do |&blk|
- blk.call
- MemoryProfiler.start
- MemoryProfiler.stop
- end
- end
-
- it 'creates a profile of the request' do
- project = create(:project, namespace: user.namespace)
- time = Time.now
- path = "/#{project.full_path}"
-
- travel_to(time) do
- get path, params: {}, headers: { 'X-Profile-Token' => Gitlab::RequestProfiler.profile_token, 'X-Profile-Mode' => profile_type }
- end
-
- profile_type = 'execution' if profile_type.nil?
- profile_path = "#{Gitlab.config.shared.path}/tmp/requests_profiles/#{path.tr('/', '|')}_#{time.to_i}_#{profile_type}.#{extension}"
- expect(File.exist?(profile_path)).to be true
- end
-
- after do
- Gitlab::RequestProfiler.remove_all_profiles
- end
- end
-
- context "when user is logged-in" do
- before do
- login_as(user)
- end
-
- include_examples 'profiling a request', 'execution', 'html'
- include_examples 'profiling a request', nil, 'html'
- include_examples 'profiling a request', 'memory', 'txt'
- end
-
- context "when user is not logged-in" do
- include_examples 'profiling a request', 'execution', 'html'
- include_examples 'profiling a request', nil, 'html'
- include_examples 'profiling a request', 'memory', 'txt'
- end
-end
diff --git a/spec/rubocop/cop/database/multiple_databases_spec.rb b/spec/rubocop/cop/database/multiple_databases_spec.rb
index 8bcd4710305..6ee1e7b13ca 100644
--- a/spec/rubocop/cop/database/multiple_databases_spec.rb
+++ b/spec/rubocop/cop/database/multiple_databases_spec.rb
@@ -13,6 +13,13 @@ RSpec.describe RuboCop::Cop::Database::MultipleDatabases do
SOURCE
end
+ it 'flags the use of ::ActiveRecord::Base.connection' do
+ expect_offense(<<~SOURCE)
+ ::ActiveRecord::Base.connection.inspect
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use methods from ActiveRecord::Base, [...]
+ SOURCE
+ end
+
described_class::ALLOWED_METHODS.each do |method_name|
it "does not flag use of ActiveRecord::Base.#{method_name}" do
expect_no_offenses(<<~SOURCE)
diff --git a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
index 6b5b07fb357..2ec3ae7aada 100644
--- a/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
+++ b/spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb
@@ -13,7 +13,6 @@ RSpec.describe RuboCop::Cop::Gitlab::MarkUsedFeatureFlags do
subject(:cop) { described_class.new }
before do
- stub_const("#{described_class}::DYNAMIC_FEATURE_FLAGS", [])
allow(cop).to receive(:defined_feature_flags).and_return(defined_feature_flags)
allow(cop).to receive(:usage_data_counters_known_event_feature_flags).and_return([])
described_class.feature_flags_already_tracked = false
diff --git a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
index 824a1b8cef5..d9209a8672c 100644
--- a/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
+++ b/spec/rubocop/cop/gitlab/namespaced_class_spec.rb
@@ -1,72 +1,125 @@
# frozen_string_literal: true
require 'fast_spec_helper'
-require 'rubocop/rspec/support'
require_relative '../../../../rubocop/cop/gitlab/namespaced_class'
RSpec.describe RuboCop::Cop::Gitlab::NamespacedClass do
subject(:cop) { described_class.new }
- it 'flags a class definition without namespace' do
- expect_offense(<<~SOURCE)
- class MyClass
- ^^^^^^^^^^^^^ #{described_class::MSG}
- end
- SOURCE
- end
+ shared_examples 'enforces namespaced classes' do
+ def namespaced(code)
+ return code unless namespace
- it 'flags a class definition with inheritance without namespace' do
- expect_offense(<<~SOURCE)
- class MyClass < ApplicationRecord
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
- def some_method
- true
+ <<~SOURCE
+ module #{namespace}
+ #{code}
end
- end
- SOURCE
- end
+ SOURCE
+ end
+
+ it 'flags a class definition without additional namespace' do
+ expect_offense(namespaced(<<~SOURCE))
+ class MyClass
+ ^^^^^^^^^^^^^ #{described_class::MSG}
+ end
+ SOURCE
+ end
- it 'does not flag the class definition with namespace in separate lines' do
- expect_no_offenses(<<~SOURCE)
- module MyModule
+ it 'flags a compact class definition without additional namespace' do
+ expect_offense(<<~SOURCE, namespace: namespace)
+ class %{namespace}::MyClass
+ ^{namespace}^^^^^^^^^^^^^^^ #{described_class::MSG}
+ end
+ SOURCE
+ end
+
+ it 'flags a class definition with inheritance without additional namespace' do
+ expect_offense(namespaced(<<~SOURCE))
class MyClass < ApplicationRecord
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ def some_method
+ true
+ end
end
+ SOURCE
+ end
- class MyOtherClass
- def other_method
- 1 + 1
+ it 'does not flag the class definition with namespace in separate lines' do
+ expect_no_offenses(namespaced(<<~SOURCE))
+ module MyModule
+ class MyClass < ApplicationRecord
+ end
+
+ class MyOtherClass
+ def other_method
+ 1 + 1
+ end
end
end
- end
- SOURCE
- end
+ SOURCE
+ end
- it 'does not flag the class definition with nested namespace in separate lines' do
- expect_no_offenses(<<~SOURCE)
- module TopLevelModule
- module NestedModule
- class MyClass
+ it 'does not flag the class definition with nested namespace in separate lines' do
+ expect_no_offenses(namespaced(<<~SOURCE))
+ module TopLevelModule
+ module NestedModule
+ class MyClass
+ end
end
end
- end
- SOURCE
- end
+ SOURCE
+ end
+
+ it 'does not flag the class definition nested inside namespaced class' do
+ expect_no_offenses(namespaced(<<~SOURCE))
+ module TopLevelModule
+ class TopLevelClass
+ class MyClass
+ end
+ end
+ end
+ SOURCE
+ end
- it 'does not flag the class definition nested inside namespaced class' do
- expect_no_offenses(<<~SOURCE)
- module TopLevelModule
- class TopLevelClass
+ it 'does not flag the class definition nested inside compact namespace' do
+ expect_no_offenses(<<~SOURCE)
+ module #{namespace}::TopLevelModule
class MyClass
end
end
- end
- SOURCE
+ SOURCE
+ end
+
+ it 'does not flag a compact namespaced class definition' do
+ expect_no_offenses(namespaced(<<~SOURCE))
+ class MyModule::MyClass < ApplicationRecord
+ end
+ SOURCE
+ end
+
+ it 'does not flag a truly compact namespaced class definition' do
+ expect_no_offenses(<<~SOURCE, namespace: namespace)
+ class %{namespace}::MyModule::MyClass < ApplicationRecord
+ end
+ SOURCE
+ end
end
- it 'does not flag a compact namespaced class definition' do
- expect_no_offenses(<<~SOURCE)
- class MyModule::MyClass < ApplicationRecord
- end
- SOURCE
+ context 'without top-level namespace' do
+ let(:namespace) { nil }
+
+ it_behaves_like 'enforces namespaced classes'
+ end
+
+ context 'with Gitlab namespace' do
+ let(:namespace) { 'Gitlab' }
+
+ it_behaves_like 'enforces namespaced classes'
+ end
+
+ context 'with ::Gitlab namespace' do
+ let(:namespace) { '::Gitlab' }
+
+ it_behaves_like 'enforces namespaced classes'
end
end
diff --git a/spec/rubocop/cop/migration/background_migration_base_class_spec.rb b/spec/rubocop/cop/migration/background_migration_base_class_spec.rb
new file mode 100644
index 00000000000..0a110418139
--- /dev/null
+++ b/spec/rubocop/cop/migration/background_migration_base_class_spec.rb
@@ -0,0 +1,104 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/migration/background_migration_base_class'
+
+RSpec.describe RuboCop::Cop::Migration::BackgroundMigrationBaseClass do
+ subject(:cop) { described_class.new }
+
+ context 'when the migration class inherits from BatchedMigrationJob' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < BatchedMigrationJob
+ def perform
+ connection.execute("select 1")
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when the migration class inherits from the namespaced BatchedMigrationJob' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform
+ connection.execute("select 1")
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when the migration class inherits from the top-level namespaced BatchedMigrationJob' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < ::Gitlab::BackgroundMigration::BatchedMigrationJob
+ def perform
+ connection.execute("select 1")
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when a nested class is used inside the job class' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < BatchedMigrationJob
+ class Project < ApplicationRecord
+ self.table_name = 'projects'
+ end
+
+ def perform
+ Project.update!(name: 'hi')
+ end
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when the migration class inherits from another class' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob < SomeOtherClass
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{described_class::MSG}
+ end
+ end
+ end
+ RUBY
+ end
+ end
+
+ context 'when the migration class does not inherit from anything' do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ module Gitlab
+ module BackgroundMigration
+ class MyJob
+ ^^^^^^^^^^^ #{described_class::MSG}
+ end
+ end
+ end
+ RUBY
+ end
+ end
+end
diff --git a/spec/rubocop/cop/migration/background_migration_record_spec.rb b/spec/rubocop/cop/migration/background_migration_record_spec.rb
new file mode 100644
index 00000000000..b5724ef1efd
--- /dev/null
+++ b/spec/rubocop/cop/migration/background_migration_record_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/migration/background_migration_record'
+
+RSpec.describe RuboCop::Cop::Migration::BackgroundMigrationRecord do
+ subject(:cop) { described_class.new }
+
+ context 'outside of a migration' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~SOURCE)
+ class MigrateProjectRecords
+ class Project < ActiveRecord::Base
+ end
+ end
+ SOURCE
+ end
+ end
+
+ context 'in migration' do
+ before do
+ allow(cop).to receive(:in_background_migration?).and_return(true)
+ end
+
+ it 'adds an offense if inheriting from ActiveRecord::Base' do
+ expect_offense(<<~RUBY)
+ class MigrateProjectRecords
+ class Project < ActiveRecord::Base
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't use or inherit from ActiveRecord::Base.[...]
+ end
+ end
+ RUBY
+ end
+
+ it 'adds an offense if create dynamic model from ActiveRecord::Base' do
+ expect_offense(<<~RUBY)
+ class MigrateProjectRecords
+ def define_model(table_name)
+ Class.new(ActiveRecord::Base) do
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't use or inherit from ActiveRecord::Base.[...]
+ self.table_name = table_name
+ self.inheritance_column = :_type_disabled
+ end
+ end
+ end
+ RUBY
+ end
+
+ it 'adds an offense if inheriting from ::ActiveRecord::Base' do
+ expect_offense(<<~RUBY)
+ class MigrateProjectRecords
+ class Project < ::ActiveRecord::Base
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't use or inherit from ActiveRecord::Base.[...]
+ end
+ end
+ RUBY
+ end
+ end
+end
diff --git a/spec/rubocop/cop/migration/hash_index_spec.rb b/spec/rubocop/cop/migration/hash_index_spec.rb
deleted file mode 100644
index 6da27af39b6..00000000000
--- a/spec/rubocop/cop/migration/hash_index_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'fast_spec_helper'
-require_relative '../../../../rubocop/cop/migration/hash_index'
-
-RSpec.describe RuboCop::Cop::Migration::HashIndex do
- subject(:cop) { described_class.new }
-
- context 'when in migration' do
- before do
- allow(cop).to receive(:in_migration?).and_return(true)
- end
-
- it 'registers an offense when creating a hash index' do
- expect_offense(<<~RUBY)
- def change
- add_index :table, :column, using: :hash
- ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
- end
- RUBY
- end
-
- it 'registers an offense when creating a concurrent hash index' do
- expect_offense(<<~RUBY)
- def change
- add_concurrent_index :table, :column, using: :hash
- ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
- end
- RUBY
- end
-
- it 'registers an offense when creating a hash index using t.index' do
- expect_offense(<<~RUBY)
- def change
- t.index :table, :column, using: :hash
- ^^^^^^^^^^^^ hash indexes should be avoided at all costs[...]
- end
- RUBY
- end
- end
-
- context 'when outside of migration' do
- it 'registers no offense' do
- expect_no_offenses('def change; index :table, :column, using: :hash; end')
- end
- end
-end
diff --git a/spec/rubocop/cop/migration/migration_record_spec.rb b/spec/rubocop/cop/migration/migration_record_spec.rb
new file mode 100644
index 00000000000..bab0ca469df
--- /dev/null
+++ b/spec/rubocop/cop/migration/migration_record_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require_relative '../../../../rubocop/cop/migration/migration_record'
+
+RSpec.describe RuboCop::Cop::Migration::MigrationRecord do
+ subject(:cop) { described_class.new }
+
+ shared_examples 'a disabled cop' do
+ it 'does not register any offenses' do
+ expect_no_offenses(<<~SOURCE)
+ class MyMigration < Gitlab::Database::Migration[2.0]
+ class Project < ActiveRecord::Base
+ end
+ end
+ SOURCE
+ end
+ end
+
+ context 'outside of a migration' do
+ it_behaves_like 'a disabled cop'
+ end
+
+ context 'in migration' do
+ before do
+ allow(cop).to receive(:in_migration?).and_return(true)
+ end
+
+ context 'in an old migration' do
+ before do
+ allow(cop).to receive(:version).and_return(described_class::ENFORCED_SINCE - 5)
+ end
+
+ it_behaves_like 'a disabled cop'
+ end
+
+ context 'that is recent' do
+ before do
+ allow(cop).to receive(:version).and_return(described_class::ENFORCED_SINCE)
+ end
+
+ it 'adds an offense if inheriting from ActiveRecord::Base' do
+ expect_offense(<<~RUBY)
+ class Project < ActiveRecord::Base
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't inherit from ActiveRecord::Base but use MigrationRecord instead.[...]
+ end
+ RUBY
+ end
+
+ it 'adds an offense if inheriting from ::ActiveRecord::Base' do
+ expect_offense(<<~RUBY)
+ class Project < ::ActiveRecord::Base
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't inherit from ActiveRecord::Base but use MigrationRecord instead.[...]
+ end
+ RUBY
+ end
+ end
+ end
+end
diff --git a/spec/scripts/changed-feature-flags_spec.rb b/spec/scripts/changed-feature-flags_spec.rb
index 5c858588c0c..bbae49a90e4 100644
--- a/spec/scripts/changed-feature-flags_spec.rb
+++ b/spec/scripts/changed-feature-flags_spec.rb
@@ -6,8 +6,8 @@ load File.expand_path('../../scripts/changed-feature-flags', __dir__)
RSpec.describe 'scripts/changed-feature-flags' do
describe GetFeatureFlagsFromFiles do
- let(:feature_flag_definition1) do
- file = Tempfile.new('foo.yml', ff_dir)
+ let!(:feature_flag_definition1) do
+ file = File.open(File.join(ff_dir, "#{file_name1}.yml"), 'w+')
file.write(<<~YAML)
---
name: foo_flag
@@ -17,8 +17,8 @@ RSpec.describe 'scripts/changed-feature-flags' do
file
end
- let(:feature_flag_definition2) do
- file = Tempfile.new('bar.yml', ff_dir)
+ let!(:feature_flag_definition2) do
+ file = File.open(File.join(ff_dir, "#{file_name2}.yml"), 'w+')
file.write(<<~YAML)
---
name: bar_flag
@@ -28,48 +28,136 @@ RSpec.describe 'scripts/changed-feature-flags' do
file
end
+ let!(:feature_flag_diff1) do
+ FileUtils.mkdir_p(File.join(diffs_dir, ff_sub_dir))
+ file = File.open(File.join(diffs_dir, ff_sub_dir, "#{file_name1}.yml.diff"), 'w+')
+ file.write(<<~YAML)
+ @@ -5,4 +5,4 @@
+ name: foo_flag
+ -default_enabled: false
+ +default_enabled: true
+ YAML
+ file.rewind
+ file
+ end
+
+ let!(:feature_flag_diff2) do
+ FileUtils.mkdir_p(File.join(diffs_dir, ff_sub_dir))
+ file = File.open(File.join(diffs_dir, ff_sub_dir, "#{file_name2}.yml.diff"), 'w+')
+ file.write(<<~YAML)
+ @@ -0,0 +0,0 @@
+ name: bar_flag
+ -default_enabled: true
+ +default_enabled: false
+ YAML
+ file.rewind
+ file
+ end
+
+ let!(:deleted_feature_flag_diff) do
+ FileUtils.mkdir_p(File.join(diffs_dir, ff_sub_dir))
+ file = File.open(File.join(diffs_dir, ff_sub_dir, "foobar_ff_#{SecureRandom.hex(8)}.yml.deleted.diff"), 'w+')
+ file.write(<<~YAML)
+ @@ -0,0 +0,0 @@
+ -name: foobar_flag
+ -default_enabled: true
+ YAML
+ file.rewind
+ file
+ end
+
+ before do
+ allow(Dir).to receive(:pwd).and_return(Dir.tmpdir)
+ end
+
after do
- FileUtils.remove_entry(ff_dir, true)
+ feature_flag_definition1.close
+ feature_flag_definition2.close
+ feature_flag_diff1.close
+ feature_flag_diff2.close
+ deleted_feature_flag_diff.close
+ FileUtils.rm_r(ff_dir)
+ FileUtils.rm_r(diffs_dir)
end
describe '.extracted_flags' do
+ let(:file_name1) { "foo_ff_#{SecureRandom.hex(8)}"}
+ let(:file_name2) { "bar_ff_#{SecureRandom.hex(8)}"}
+ let(:ff_dir) { FileUtils.mkdir_p(File.join(Dir.tmpdir, ff_sub_dir)) }
+ let(:diffs_dir) { FileUtils.mkdir_p(File.join(Dir.tmpdir, 'diffs')).first }
+
shared_examples 'extract feature flags' do
it 'returns feature flags on their own' do
- subject = described_class.new({ files: [feature_flag_definition1.path, feature_flag_definition2.path] })
+ subject = described_class.new({ files: diffs_dir })
- expect(subject.extracted_flags).to eq('foo_flag,bar_flag')
+ expect(subject.extracted_flags.split(',')).to include('foo_flag', 'bar_flag')
end
it 'returns feature flags and their state as enabled' do
- subject = described_class.new({ files: [feature_flag_definition1.path, feature_flag_definition2.path], state: 'enabled' })
+ subject = described_class.new({ files: diffs_dir, state: 'enabled' })
- expect(subject.extracted_flags).to eq('foo_flag=enabled,bar_flag=enabled')
+ expect(subject.extracted_flags.split(',')).to include('foo_flag=enabled', 'bar_flag=enabled')
end
it 'returns feature flags and their state as disabled' do
- subject = described_class.new({ files: [feature_flag_definition1.path, feature_flag_definition2.path], state: 'disabled' })
+ subject = described_class.new({ files: diffs_dir, state: 'disabled' })
+
+ expect(subject.extracted_flags.split(',')).to include('foo_flag=disabled', 'bar_flag=disabled')
+ end
+
+ it 'does not return feature flags when there are mixed deleted and non-deleted definition files' do
+ subject = described_class.new({ files: diffs_dir, state: 'deleted' })
- expect(subject.extracted_flags).to eq('foo_flag=disabled,bar_flag=disabled')
+ expect(subject.extracted_flags).to eq('')
end
end
context 'with definition files in the development directory' do
- let(:ff_dir) { FileUtils.mkdir_p(File.join(Dir.tmpdir, 'feature_flags', 'development')) }
+ let(:ff_sub_dir) { %w[feature_flags development] }
it_behaves_like 'extract feature flags'
end
context 'with definition files in the ops directory' do
- let(:ff_dir) { FileUtils.mkdir_p(File.join(Dir.tmpdir, 'feature_flags', 'ops')) }
+ let(:ff_sub_dir) { %w[feature_flags ops] }
it_behaves_like 'extract feature flags'
end
context 'with definition files in the experiment directory' do
- let(:ff_dir) { FileUtils.mkdir_p(File.join(Dir.tmpdir, 'feature_flags', 'experiment')) }
+ let(:ff_sub_dir) { %w[feature_flags experiment] }
it 'ignores the files' do
- subject = described_class.new({ files: [feature_flag_definition1.path, feature_flag_definition2.path] })
+ subject = described_class.new({ files: diffs_dir })
+
+ expect(subject.extracted_flags).to eq('')
+ end
+ end
+
+ context 'with only deleted definition files' do
+ let(:ff_sub_dir) { %w[feature_flags development] }
+
+ before do
+ feature_flag_diff1.close
+ feature_flag_diff2.close
+ FileUtils.rm_r(feature_flag_diff1)
+ FileUtils.rm_r(feature_flag_diff2)
+ end
+
+ it 'returns feature flags and their state as deleted' do
+ subject = described_class.new({ files: diffs_dir, state: 'deleted' })
+
+ expect(subject.extracted_flags).to eq('foobar_flag=deleted')
+ end
+
+ it 'does not return feature flags when the desired state is enabled' do
+ subject = described_class.new({ files: diffs_dir, state: 'enabled' })
+
+ expect(subject.extracted_flags).to eq('')
+ end
+
+ it 'does not return feature flags when the desired state is disabled' do
+ subject = described_class.new({ files: diffs_dir, state: 'disabled' })
expect(subject.extracted_flags).to eq('')
end
diff --git a/spec/scripts/lib/glfm/shared_spec.rb b/spec/scripts/lib/glfm/shared_spec.rb
new file mode 100644
index 00000000000..f6792b93718
--- /dev/null
+++ b/spec/scripts/lib/glfm/shared_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+require 'fast_spec_helper'
+require_relative '../../../../scripts/lib/glfm/shared'
+
+RSpec.describe Glfm::Shared do
+ let(:instance) do
+ Class.new do
+ include Glfm::Shared
+ end.new
+ end
+
+ describe '#run_external_cmd' do
+ it 'works' do
+ expect(instance.run_external_cmd('echo "hello"')).to eq("hello\n")
+ end
+
+ context 'when command fails' do
+ it 'raises error' do
+ invalid_cmd = 'ls nonexistent_file'
+ expect(instance).to receive(:warn).with(/Error running command `#{invalid_cmd}`/)
+ expect(instance).to receive(:warn).with(/nonexistent_file.*no such file/i)
+ expect { instance.run_external_cmd(invalid_cmd) }.to raise_error(RuntimeError)
+ end
+ end
+ end
+
+ describe '#output' do
+ # NOTE: The #output method is normally always mocked, to prevent output while the specs are
+ # running. However, in order to provide code coverage for the method, we have to invoke
+ # it at least once.
+ it 'has code coverage' do
+ allow(instance).to receive(:puts)
+ instance.output('')
+ 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
new file mode 100644
index 00000000000..169f5d1c5a6
--- /dev/null
+++ b/spec/scripts/lib/glfm/update_example_snapshots_spec.rb
@@ -0,0 +1,316 @@
+# frozen_string_literal: true
+require 'fast_spec_helper'
+require_relative '../../../../scripts/lib/glfm/update_example_snapshots'
+
+RSpec.describe Glfm::UpdateExampleSnapshots, '#process' do
+ subject { described_class.new }
+
+ # GLFM input files
+ let(:glfm_spec_txt_path) { described_class::GLFM_SPEC_TXT_PATH }
+ let(:glfm_spec_txt_local_io) { StringIO.new(glfm_spec_txt_contents) }
+ let(:glfm_example_status_yml_path) { described_class::GLFM_EXAMPLE_STATUS_YML_PATH }
+ let(:glfm_example_status_yml_io) { StringIO.new(glfm_example_status_yml_contents) }
+
+ # Example Snapshot (ES) output files
+ let(:es_examples_index_yml_path) { described_class::ES_EXAMPLES_INDEX_YML_PATH }
+ let(:es_examples_index_yml_io) { StringIO.new }
+ let(:es_markdown_yml_path) { described_class::ES_MARKDOWN_YML_PATH }
+ let(:es_markdown_yml_io) { StringIO.new }
+ let(:es_html_yml_path) { described_class::ES_HTML_YML_PATH }
+ let(:es_html_yml_io) { StringIO.new }
+ let(:es_prosemirror_json_yml_path) { described_class::ES_PROSEMIRROR_JSON_YML_PATH }
+ let(:es_prosemirror_json_yml_io) { StringIO.new }
+
+ # Internal tempfiles
+ let(:static_html_tempfile_path) { Tempfile.new.path }
+
+ let(:glfm_spec_txt_contents) do
+ <<~GLFM_SPEC_TXT_CONTENTS
+ ---
+ title: GitLab Flavored Markdown Spec
+ ...
+
+ # Introduction
+
+ GLFM intro text...
+
+ # Inlines
+
+ ## Strong
+
+ ```````````````````````````````` example
+ __bold__
+ .
+ <p><strong>bold</strong></p>
+ ````````````````````````````````
+
+ ```````````````````````````````` example strikethrough
+ __bold with more text__
+ .
+ <p><strong>bold with more text</strong></p>
+ ````````````````````````````````
+
+ <div class="extension">
+
+ ## Strikethrough (extension)
+
+ GFM enables the `strikethrough` extension.
+
+ ```````````````````````````````` example strikethrough
+ ~~Hi~~ Hello, world!
+ .
+ <p><del>Hi</del> Hello, world!</p>
+ ````````````````````````````````
+
+ </div>
+
+ End of last GitHub examples section.
+
+ # First GitLab-Specific Section with Examples
+
+ ## Strong but with two asterisks
+
+ ```````````````````````````````` example gitlab strong
+ **bold**
+ .
+ <p><strong>bold</strong></p>
+ ````````````````````````````````
+
+ # Second GitLab-Specific Section with Examples
+
+ ## Strong but with HTML
+
+ ```````````````````````````````` example gitlab strong
+ <strong>
+ bold
+ </strong>
+ .
+ <p><strong>
+ bold
+ </strong></p>
+ ````````````````````````````````
+
+ <!-- END TESTS -->
+
+ # Appendix
+
+ Appendix text.
+ GLFM_SPEC_TXT_CONTENTS
+ end
+
+ let(:glfm_example_status_yml_contents) do
+ <<~GLFM_EXAMPLE_STATUS_YML_CONTENTS
+ ---
+ - 07_01_first_gitlab_specific_section_with_examples_strong_but_with_two_asterisks:
+ skip_update_example_snapshots: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: false
+ - 07_02_first_gitlab_specific_section_with_examples_strong_but_with_html:
+ skip_update_example_snapshots: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: false
+ GLFM_EXAMPLE_STATUS_YML_CONTENTS
+ end
+
+ before do
+ # We mock out the URI and local file IO objects with real StringIO, instead of just mock
+ # objects. This gives better and more realistic coverage, while still avoiding
+ # actual network and filesystem I/O during the spec run.
+
+ # input files
+ allow(File).to receive(:open).with(glfm_spec_txt_path) { glfm_spec_txt_local_io }
+ allow(File).to receive(:open).with(glfm_example_status_yml_path) { glfm_example_status_yml_io }
+
+ # output files
+ allow(File).to receive(:open).with(es_examples_index_yml_path, 'w') { es_examples_index_yml_io }
+ allow(File).to receive(:open).with(es_html_yml_path, 'w') { es_html_yml_io }
+ allow(File).to receive(:open).with(es_prosemirror_json_yml_path, 'w') { es_prosemirror_json_yml_io }
+
+ # output files which are also input files
+ allow(File).to receive(:open).with(es_markdown_yml_path, 'w') { es_markdown_yml_io }
+ allow(File).to receive(:open).with(es_markdown_yml_path) { es_markdown_yml_io }
+
+ # Allow normal opening of Tempfile files created during script execution.
+ tempfile_basenames = [
+ described_class::MARKDOWN_TEMPFILE_BASENAME[0],
+ described_class::STATIC_HTML_TEMPFILE_BASENAME[0],
+ described_class::WYSIWYG_HTML_AND_JSON_TEMPFILE_BASENAME[0]
+ ].join('|')
+ # NOTE: This approach with a single regex seems to be the only way this can work. If you
+ # attempt to have multiple `allow...and_call_original` with `any_args`, the mocked
+ # parameter matching will fail to match the second one.
+ tempfiles_regex = /(#{tempfile_basenames})/
+ allow(File).to receive(:open).with(tempfiles_regex, any_args).and_call_original
+
+ # Prevent console output when running tests
+ allow(subject).to receive(:output)
+ end
+
+ describe 'writing examples_index.yml' do
+ let(:es_examples_index_yml_contents) { reread_io(es_examples_index_yml_io) }
+
+ it 'writes the correct content' do
+ subject.process(skip_static_and_wysiwyg: true)
+
+ expected =
+ <<~ES_EXAMPLES_INDEX_YML_CONTENTS
+ ---
+ 02_01__inlines__strong__01:
+ spec_txt_example_position: 1
+ source_specification: commonmark
+ 02_01__inlines__strong__02:
+ spec_txt_example_position: 2
+ source_specification: github
+ 02_02__inlines__strikethrough_extension__01:
+ spec_txt_example_position: 3
+ source_specification: github
+ 03_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01:
+ spec_txt_example_position: 4
+ source_specification: gitlab
+ 04_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01:
+ spec_txt_example_position: 5
+ source_specification: gitlab
+ ES_EXAMPLES_INDEX_YML_CONTENTS
+ expect(es_examples_index_yml_contents).to eq(expected)
+ end
+ end
+
+ describe 'writing markdown.yml' do
+ let(:es_markdown_yml_contents) { reread_io(es_markdown_yml_io) }
+
+ it 'writes the correct content' do
+ subject.process(skip_static_and_wysiwyg: true)
+
+ expected =
+ <<~ES_MARKDOWN_YML_CONTENTS
+ ---
+ 02_01__inlines__strong__01: |
+ __bold__
+ 02_01__inlines__strong__02: |
+ __bold with more text__
+ 02_02__inlines__strikethrough_extension__01: |
+ ~~Hi~~ Hello, world!
+ 03_01__first_gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01: |
+ **bold**
+ 04_01__second_gitlab_specific_section_with_examples__strong_but_with_html__01: |
+ <strong>
+ bold
+ </strong>
+ ES_MARKDOWN_YML_CONTENTS
+
+ expect(es_markdown_yml_contents).to eq(expected)
+ end
+ end
+
+ describe 'writing html.yml and prosemirror_json.yml' do
+ let(:es_html_yml_contents) { reread_io(es_html_yml_io) }
+ let(:es_prosemirror_json_yml_contents) { reread_io(es_prosemirror_json_yml_io) }
+
+ let(:glfm_example_status_yml_contents) do
+ <<~GLFM_EXAMPLE_STATUS_YML_CONTENTS
+ ---
+ - 02_01_gitlab_specific_section_with_examples_strong_but_with_two_asterisks:
+ skip_update_example_snapshots: false
+ skip_running_snapshot_static_html_tests: false
+ skip_running_snapshot_wysiwyg_html_tests: false
+ skip_running_snapshot_prosemirror_json_tests: false
+ skip_running_conformance_static_tests: false
+ skip_running_conformance_wysiwyg_tests: false
+ GLFM_EXAMPLE_STATUS_YML_CONTENTS
+ end
+
+ let(:glfm_spec_txt_contents) do
+ <<~GLFM_SPEC_TXT_CONTENTS
+ ---
+ title: GitLab Flavored Markdown Spec
+ ...
+
+ # Introduction
+
+ # GitLab-Specific Section with Examples
+
+ ## Strong but with two asterisks
+
+ ```````````````````````````````` example gitlab strong
+ **bold**
+ .
+ <p><strong>bold</strong></p>
+ ````````````````````````````````
+ <!-- END TESTS -->
+
+ # Appendix
+
+ Appendix text.
+ GLFM_SPEC_TXT_CONTENTS
+ end
+
+ before do
+ # NOTE: This is a necessary to avoid an `error Couldn't find an integrity file` error
+ # when invoking `yarn jest ...` on CI from within an RSpec job. It could be solved by
+ # adding `.yarn-install` to be included in the RSpec CI job, but that would be a performance
+ # hit to all RSpec jobs. We could also make a dedicate job just for this spec. However,
+ # since this is just a single script, those options may not be justified.
+ described_class.new.run_external_cmd('yarn install') if ENV['CI']
+ end
+
+ # NOTE: Both `html.yml` and `prosemirror_json.yml` generation are tested in a single example, to
+ # avoid slower tests, because generating the static HTML is slow due to the need to invoke
+ # the rails environment. We could have separate sections, but this would require an extra flag
+ # to the `process` method to independently skip static vs. WYSIWYG, which is not worth the effort.
+ it 'writes the correct content' do
+ subject.process
+
+ expected_html =
+ <<~ES_HTML_YML_CONTENTS
+ ---
+ 02_01__gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01:
+ canonical: |
+ <p><strong>bold</strong></p>
+ static: |-
+ <p data-sourcepos="1:1-1:8" dir="auto"><strong>bold</strong></p>
+ wysiwyg: |-
+ <p><strong>bold</strong></p>
+ ES_HTML_YML_CONTENTS
+
+ expected_prosemirror_json =
+ <<~ES_PROSEMIRROR_JSON_YML_CONTENTS
+ ---
+ 02_01__gitlab_specific_section_with_examples__strong_but_with_two_asterisks__01: |-
+ {
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "bold"
+ }
+ ],
+ "text": "bold"
+ }
+ ]
+ }
+ ]
+ }
+ ES_PROSEMIRROR_JSON_YML_CONTENTS
+
+ expect(es_html_yml_contents).to eq(expected_html)
+ expect(es_prosemirror_json_yml_contents).to eq(expected_prosemirror_json)
+ end
+ end
+
+ def reread_io(io)
+ # Reset the io StringIO to the beginning position of the buffer
+ io.seek(0)
+ io.read
+ end
+end
diff --git a/spec/scripts/lib/glfm/update_specification_spec.rb b/spec/scripts/lib/glfm/update_specification_spec.rb
new file mode 100644
index 00000000000..e8d34b13efa
--- /dev/null
+++ b/spec/scripts/lib/glfm/update_specification_spec.rb
@@ -0,0 +1,196 @@
+# frozen_string_literal: true
+require 'fast_spec_helper'
+require_relative '../../../../scripts/lib/glfm/update_specification'
+
+RSpec.describe Glfm::UpdateSpecification, '#process' do
+ subject { described_class.new }
+
+ let(:ghfm_spec_txt_uri) { described_class::GHFM_SPEC_TXT_URI }
+ let(:ghfm_spec_txt_uri_io) { StringIO.new(ghfm_spec_txt_contents) }
+ let(:ghfm_spec_txt_path) { described_class::GHFM_SPEC_TXT_PATH }
+ let(:ghfm_spec_txt_local_io) { StringIO.new(ghfm_spec_txt_contents) }
+
+ let(:glfm_intro_txt_path) { described_class::GLFM_INTRO_TXT_PATH }
+ let(:glfm_intro_txt_io) { StringIO.new(glfm_intro_txt_contents) }
+ let(:glfm_examples_txt_path) { described_class::GLFM_EXAMPLES_TXT_PATH }
+ let(:glfm_examples_txt_io) { StringIO.new(glfm_examples_txt_contents) }
+ let(:glfm_spec_txt_path) { described_class::GLFM_SPEC_TXT_PATH }
+ let(:glfm_spec_txt_io) { StringIO.new }
+
+ let(:ghfm_spec_txt_contents) do
+ <<~GHFM_SPEC_TXT_CONTENTS
+ ---
+ title: GitHub Flavored Markdown Spec
+ version: 0.29
+ date: '2019-04-06'
+ license: '[CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)'
+ ...
+
+ # Introduction
+
+ ## What is GitHub Flavored Markdown?
+
+ It's like GLFM, but with an H.
+
+ # Section with Examples
+
+ ## Strong
+
+ ```````````````````````````````` example
+ __bold__
+ .
+ <p><strong>bold</strong></p>
+ ````````````````````````````````
+
+ End of last GitHub examples section.
+
+ <!-- END TESTS -->
+
+ # Appendix
+
+ Appendix text.
+ GHFM_SPEC_TXT_CONTENTS
+ end
+
+ let(:glfm_intro_txt_contents) do
+ <<~GLFM_INTRO_TXT_CONTENTS
+ # Introduction
+
+ ## What is GitLab Flavored Markdown?
+
+ Intro text about GitLab Flavored Markdown.
+ GLFM_INTRO_TXT_CONTENTS
+ end
+
+ let(:glfm_examples_txt_contents) do
+ <<~GLFM_EXAMPLES_TXT_CONTENTS
+ # GitLab-Specific Section with Examples
+
+ Some examples.
+ GLFM_EXAMPLES_TXT_CONTENTS
+ end
+
+ before do
+ # Mock default ENV var values
+ allow(ENV).to receive(:[]).with('UPDATE_GHFM_SPEC_TXT').and_return(nil)
+ allow(ENV).to receive(:[]).and_call_original
+
+ # We mock out the URI and local file IO objects with real StringIO, instead of just mock
+ # objects. This gives better and more realistic coverage, while still avoiding
+ # actual network and filesystem I/O during the spec run.
+ allow(URI).to receive(:open).with(ghfm_spec_txt_uri) { ghfm_spec_txt_uri_io }
+ allow(File).to receive(:open).with(ghfm_spec_txt_path) { ghfm_spec_txt_local_io }
+ allow(File).to receive(:open).with(glfm_intro_txt_path) { glfm_intro_txt_io }
+ allow(File).to receive(:open).with(glfm_examples_txt_path) { glfm_examples_txt_io }
+ allow(File).to receive(:open).with(glfm_spec_txt_path, 'w') { glfm_spec_txt_io }
+
+ # Prevent console output when running tests
+ allow(subject).to receive(:output)
+ end
+
+ describe 'retrieving latest GHFM spec.txt' do
+ context 'when UPDATE_GHFM_SPEC_TXT is not true (default)' do
+ it 'does not download' do
+ expect(URI).not_to receive(:open).with(ghfm_spec_txt_uri)
+
+ subject.process
+
+ expect(reread_io(ghfm_spec_txt_local_io)).to eq(ghfm_spec_txt_contents)
+ end
+ end
+
+ context 'when UPDATE_GHFM_SPEC_TXT is true' do
+ let(:ghfm_spec_txt_local_io) { StringIO.new }
+
+ before do
+ allow(ENV).to receive(:[]).with('UPDATE_GHFM_SPEC_TXT').and_return('true')
+ allow(File).to receive(:open).with(ghfm_spec_txt_path, 'w') { ghfm_spec_txt_local_io }
+ end
+
+ context 'with success' do
+ it 'downloads and saves' do
+ subject.process
+
+ expect(reread_io(ghfm_spec_txt_local_io)).to eq(ghfm_spec_txt_contents)
+ end
+ end
+
+ context 'with error handling' do
+ context 'with a version mismatch' do
+ let(:ghfm_spec_txt_contents) do
+ <<~GHFM_SPEC_TXT_CONTENTS
+ ---
+ title: GitHub Flavored Markdown Spec
+ version: 0.30
+ ...
+ GHFM_SPEC_TXT_CONTENTS
+ end
+
+ it 'raises an error' do
+ expect { subject.process }.to raise_error /version mismatch.*expected.*29.*got.*30/i
+ end
+ end
+
+ context 'with a failed read of file lines' do
+ let(:ghfm_spec_txt_contents) { '' }
+
+ it 'raises an error if lines cannot be read' do
+ expect { subject.process }.to raise_error /unable to read lines/i
+ end
+ end
+
+ context 'with a failed re-read of file string' do
+ before do
+ allow(ghfm_spec_txt_uri_io).to receive(:read).and_return(nil)
+ end
+
+ it 'raises an error if file is blank' do
+ expect { subject.process }.to raise_error /unable to read string/i
+ end
+ end
+ end
+ end
+ end
+
+ describe 'writing GLFM spec.txt' do
+ let(:glfm_contents) { reread_io(glfm_spec_txt_io) }
+
+ before do
+ subject.process
+ end
+
+ it 'replaces the header text with the GitLab version' do
+ expect(glfm_contents).not_to match(/GitHub Flavored Markdown Spec/m)
+ expect(glfm_contents).not_to match(/^version: \d\.\d/m)
+ expect(glfm_contents).not_to match(/^date: /m)
+ expect(glfm_contents).not_to match(/^license: /m)
+ expect(glfm_contents).to match(/#{Regexp.escape(described_class::GLFM_SPEC_TXT_HEADER)}\n/mo)
+ end
+
+ it 'replaces the intro section with the GitLab version' do
+ expect(glfm_contents).not_to match(/What is GitHub Flavored Markdown/m)
+ expect(glfm_contents).to match(/#{Regexp.escape(glfm_intro_txt_contents)}/m)
+ end
+
+ it 'inserts the GitLab examples sections before the appendix section' do
+ expected = <<~GHFM_SPEC_TXT_CONTENTS
+ End of last GitHub examples section.
+
+ # GitLab-Specific Section with Examples
+
+ Some examples.
+
+ <!-- END TESTS -->
+
+ # Appendix
+ GHFM_SPEC_TXT_CONTENTS
+ expect(glfm_contents).to match(/#{Regexp.escape(expected)}/m)
+ end
+ end
+
+ def reread_io(io)
+ # Reset the io StringIO to the beginning position of the buffer
+ io.seek(0)
+ io.read
+ end
+end
diff --git a/spec/scripts/trigger-build_spec.rb b/spec/scripts/trigger-build_spec.rb
new file mode 100644
index 00000000000..76a3cdbeaa2
--- /dev/null
+++ b/spec/scripts/trigger-build_spec.rb
@@ -0,0 +1,970 @@
+# frozen_string_literal: true
+# rubocop:disable RSpec/VerifiedDoubles
+
+require 'fast_spec_helper'
+require 'rspec-parameterized'
+
+require_relative '../../scripts/trigger-build'
+
+RSpec.describe Trigger do
+ let(:env) do
+ {
+ 'CI_JOB_URL' => 'ci_job_url',
+ 'CI_PROJECT_PATH' => 'ci_project_path',
+ 'CI_COMMIT_REF_NAME' => 'ci_commit_ref_name',
+ 'CI_COMMIT_REF_SLUG' => 'ci_commit_ref_slug',
+ 'CI_COMMIT_SHA' => 'ci_commit_sha',
+ 'CI_MERGE_REQUEST_PROJECT_ID' => 'ci_merge_request_project_id',
+ 'CI_MERGE_REQUEST_IID' => 'ci_merge_request_iid',
+ 'GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN' => 'bot-token',
+ 'CI_JOB_TOKEN' => 'job-token',
+ 'GITLAB_USER_NAME' => 'gitlab_user_name',
+ 'GITLAB_USER_LOGIN' => 'gitlab_user_login',
+ 'QA_IMAGE' => 'qa_image',
+ 'OMNIBUS_GITLAB_CACHE_UPDATE' => 'omnibus_gitlab_cache_update',
+ 'OMNIBUS_GITLAB_PROJECT_ACCESS_TOKEN' => nil,
+ 'DOCS_PROJECT_API_TOKEN' => nil
+ }
+ end
+
+ let(:com_api_endpoint) { 'https://gitlab.com/api/v4' }
+ let(:com_api_token) { env['GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN'] }
+ let(:com_gitlab_client) { double('com_gitlab_client') }
+
+ let(:downstream_gitlab_client_endpoint) { com_api_endpoint }
+ let(:downstream_gitlab_client_token) { com_api_token }
+ let(:downstream_gitlab_client) { com_gitlab_client }
+
+ let(:stubbed_pipeline) { Struct.new(:id, :web_url).new(42, 'pipeline_url') }
+ let(:trigger_token) { env['CI_JOB_TOKEN'] }
+
+ before do
+ stub_env(env)
+ allow(subject).to receive(:puts)
+ allow(Gitlab).to receive(:client)
+ .with(
+ endpoint: downstream_gitlab_client_endpoint,
+ private_token: downstream_gitlab_client_token
+ )
+ .and_return(downstream_gitlab_client)
+ end
+
+ def expect_run_trigger_with_params(variables = {})
+ expect(downstream_gitlab_client).to receive(:run_trigger)
+ .with(
+ downstream_project_path,
+ trigger_token,
+ ref,
+ hash_including(variables)
+ )
+ .and_return(stubbed_pipeline)
+ end
+
+ describe Trigger::Base do
+ let(:ref) { 'main' }
+
+ describe '#invoke!' do
+ context "when required methods aren't defined" do
+ it 'raises a NotImplementedError' do
+ expect { described_class.new.invoke! }.to raise_error(NotImplementedError)
+ end
+ end
+
+ context "when required methods are defined" do
+ let(:downstream_project_path) { 'foo/bar' }
+ let(:subclass) do
+ Class.new(Trigger::Base) do
+ def downstream_project_path
+ 'foo/bar'
+ end
+
+ # Must be overridden
+ def ref_param_name
+ 'FOO_BAR_BRANCH'
+ end
+ end
+ end
+
+ subject { subclass.new }
+
+ context 'when env variable `FOO_BAR_BRANCH` does not exist' do
+ it 'triggers the pipeline on the correct project and branch' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+
+ context 'when env variable `FOO_BAR_BRANCH` exists' do
+ let(:ref) { 'foo_bar_branch' }
+
+ before do
+ stub_env('FOO_BAR_BRANCH', ref)
+ end
+
+ it 'triggers the pipeline on the correct project and branch' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+
+ it 'waits for downstream pipeline' do
+ expect_run_trigger_with_params
+ expect(Trigger::Pipeline).to receive(:new)
+ .with(downstream_project_path, stubbed_pipeline.id, downstream_gitlab_client)
+
+ subject.invoke!
+ end
+
+ context 'with downstream_job_name: "foo"' do
+ let(:downstream_job) { Struct.new(:id, :name).new(42, 'foo') }
+ let(:paginated_resources) { Struct.new(:auto_paginate).new([downstream_job]) }
+
+ before do
+ stub_env('CI_COMMIT_REF_NAME', "#{ref}-ee")
+ end
+
+ it 'fetches the downstream job' do
+ expect_run_trigger_with_params
+ expect(downstream_gitlab_client).to receive(:pipeline_jobs)
+ .with(downstream_project_path, stubbed_pipeline.id).and_return(paginated_resources)
+ expect(Trigger::Job).to receive(:new)
+ .with(downstream_project_path, downstream_job.id, downstream_gitlab_client)
+
+ subject.invoke!(downstream_job_name: 'foo')
+ end
+ end
+ end
+ end
+
+ describe '#variables' do
+ let(:simple_forwarded_variables) do
+ {
+ 'TRIGGER_SOURCE' => env['CI_JOB_URL'],
+ 'TOP_UPSTREAM_SOURCE_PROJECT' => env['CI_PROJECT_PATH'],
+ 'TOP_UPSTREAM_SOURCE_REF' => env['CI_COMMIT_REF_NAME'],
+ 'TOP_UPSTREAM_SOURCE_JOB' => env['CI_JOB_URL'],
+ 'TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID' => env['CI_MERGE_REQUEST_PROJECT_ID'],
+ 'TOP_UPSTREAM_MERGE_REQUEST_IID' => env['CI_MERGE_REQUEST_IID']
+ }
+ end
+
+ it 'includes simple forwarded variables' do
+ expect(subject.variables).to include(simple_forwarded_variables)
+ end
+
+ describe "#base_variables" do
+ context 'when CI_COMMIT_TAG is set' do
+ before do
+ stub_env('CI_COMMIT_TAG', 'v1.0')
+ end
+
+ it 'sets GITLAB_REF_SLUG to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['GITLAB_REF_SLUG']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+
+ context 'when CI_COMMIT_TAG is nil' do
+ before do
+ stub_env('CI_COMMIT_TAG', nil)
+ end
+
+ it 'sets GITLAB_REF_SLUG to CI_COMMIT_REF_SLUG' do
+ expect(subject.variables['GITLAB_REF_SLUG']).to eq(env['CI_COMMIT_REF_SLUG'])
+ end
+ end
+
+ context 'when TRIGGERED_USER is set' do
+ before do
+ stub_env('TRIGGERED_USER', 'triggered_user')
+ end
+
+ it 'sets TRIGGERED_USER to triggered_user' do
+ expect(subject.variables['TRIGGERED_USER']).to eq('triggered_user')
+ end
+ end
+
+ context 'when TRIGGERED_USER is not set' do
+ before do
+ stub_env('TRIGGERED_USER', nil)
+ end
+
+ it 'sets TRIGGERED_USER to GITLAB_USER_NAME' do
+ expect(subject.variables['TRIGGERED_USER']).to eq(env['GITLAB_USER_NAME'])
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', 'ci_merge_request_source_branch_sha')
+ end
+
+ it 'sets TOP_UPSTREAM_SOURCE_SHA to ci_merge_request_source_branch_sha' do
+ expect(subject.variables['TOP_UPSTREAM_SOURCE_SHA']).to eq('ci_merge_request_source_branch_sha')
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set as empty' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', '')
+ end
+
+ it 'sets TOP_UPSTREAM_SOURCE_SHA to CI_COMMIT_SHA' do
+ expect(subject.variables['TOP_UPSTREAM_SOURCE_SHA']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is not set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', nil)
+ end
+
+ it 'sets TOP_UPSTREAM_SOURCE_SHA to CI_COMMIT_SHA' do
+ expect(subject.variables['TOP_UPSTREAM_SOURCE_SHA']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+ end
+
+ describe "#version_file_variables" do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:version_file, :version) do
+ 'GITALY_SERVER_VERSION' | "1"
+ 'GITLAB_ELASTICSEARCH_INDEXER_VERSION' | "2"
+ 'GITLAB_KAS_VERSION' | "3"
+ 'GITLAB_PAGES_VERSION' | "4"
+ 'GITLAB_SHELL_VERSION' | "5"
+ 'GITLAB_WORKHORSE_VERSION' | "6"
+ end
+
+ with_them do
+ context "when set in ENV" do
+ before do
+ stub_env(version_file, version)
+ end
+
+ it 'includes the version from ENV' do
+ expect(subject.variables[version_file]).to eq(version)
+ end
+ end
+
+ context "when set in a file" do
+ before do
+ allow(File).to receive(:read).and_call_original
+ end
+
+ it 'includes the version from the file' do
+ expect(File).to receive(:read).with(version_file).and_return(version)
+ expect(subject.variables[version_file]).to eq(version)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ describe Trigger::Omnibus do
+ describe '#variables' do
+ it 'invokes the trigger with expected variables' do
+ expect(subject.variables).to include(
+ 'QA_IMAGE' => env['QA_IMAGE'],
+ 'SKIP_QA_DOCKER' => 'true',
+ 'ALTERNATIVE_SOURCES' => 'true',
+ 'CACHE_UPDATE' => env['OMNIBUS_GITLAB_CACHE_UPDATE'],
+ 'GITLAB_QA_OPTIONS' => env['GITLAB_QA_OPTIONS'],
+ 'QA_TESTS' => env['QA_TESTS'],
+ 'ALLURE_JOB_NAME' => env['ALLURE_JOB_NAME']
+ )
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', 'ci_merge_request_source_branch_sha')
+ end
+
+ it 'sets GITLAB_VERSION & IMAGE_TAG to ci_merge_request_source_branch_sha' do
+ expect(subject.variables).to include(
+ 'GITLAB_VERSION' => 'ci_merge_request_source_branch_sha',
+ 'IMAGE_TAG' => 'ci_merge_request_source_branch_sha'
+ )
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set as empty' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', '')
+ end
+
+ it 'sets GITLAB_VERSION & IMAGE_TAG to CI_COMMIT_SHA' do
+ expect(subject.variables).to include(
+ 'GITLAB_VERSION' => env['CI_COMMIT_SHA'],
+ 'IMAGE_TAG' => env['CI_COMMIT_SHA']
+ )
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is not set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', nil)
+ end
+
+ it 'sets GITLAB_VERSION & IMAGE_TAG to CI_COMMIT_SHA' do
+ expect(subject.variables).to include(
+ 'GITLAB_VERSION' => env['CI_COMMIT_SHA'],
+ 'IMAGE_TAG' => env['CI_COMMIT_SHA']
+ )
+ end
+ end
+
+ context 'when Trigger.security? is true' do
+ before do
+ allow(Trigger).to receive(:security?).and_return(true)
+ end
+
+ it 'sets SECURITY_SOURCES to true' do
+ expect(subject.variables['SECURITY_SOURCES']).to eq('true')
+ end
+ end
+
+ context 'when Trigger.security? is false' do
+ before do
+ allow(Trigger).to receive(:security?).and_return(false)
+ end
+
+ it 'sets SECURITY_SOURCES to false' do
+ expect(subject.variables['SECURITY_SOURCES']).to eq('false')
+ end
+ end
+
+ context 'when Trigger.ee? is true' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(true)
+ end
+
+ it 'sets ee to true' do
+ expect(subject.variables['ee']).to eq('true')
+ end
+ end
+
+ context 'when Trigger.ee? is false' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(false)
+ end
+
+ it 'sets ee to false' do
+ expect(subject.variables['ee']).to eq('false')
+ end
+ end
+
+ context 'when QA_BRANCH is set' do
+ before do
+ stub_env('QA_BRANCH', 'qa_branch')
+ end
+
+ it 'sets QA_BRANCH to qa_branch' do
+ expect(subject.variables['QA_BRANCH']).to eq('qa_branch')
+ end
+ end
+ end
+
+ describe '.access_token' do
+ context 'when OMNIBUS_GITLAB_PROJECT_ACCESS_TOKEN is set' do
+ let(:omnibus_gitlab_project_access_token) { 'omnibus_gitlab_project_access_token' }
+
+ before do
+ stub_env('OMNIBUS_GITLAB_PROJECT_ACCESS_TOKEN', omnibus_gitlab_project_access_token)
+ end
+
+ it 'returns the omnibus-specific access token' do
+ expect(described_class.access_token).to eq(omnibus_gitlab_project_access_token)
+ end
+ end
+
+ context 'when OMNIBUS_GITLAB_PROJECT_ACCESS_TOKEN is not set' do
+ before do
+ stub_env('OMNIBUS_GITLAB_PROJECT_ACCESS_TOKEN', nil)
+ end
+
+ it 'returns the default access token' do
+ expect(described_class.access_token).to eq(Trigger::Base.access_token)
+ end
+ end
+ end
+
+ describe '#invoke!' do
+ let(:downstream_project_path) { 'gitlab-org/build/omnibus-gitlab-mirror' }
+ let(:ref) { 'master' }
+
+ let(:env) do
+ super().merge(
+ 'QA_IMAGE' => 'qa_image',
+ 'GITLAB_QA_OPTIONS' => 'gitlab_qa_options',
+ 'QA_TESTS' => 'qa_tests',
+ 'ALLURE_JOB_NAME' => 'allure_job_name'
+ )
+ end
+
+ describe '#downstream_project_path' do
+ context 'when OMNIBUS_PROJECT_PATH is set' do
+ let(:downstream_project_path) { 'omnibus_project_path' }
+
+ before do
+ stub_env('OMNIBUS_PROJECT_PATH', downstream_project_path)
+ end
+
+ it 'triggers the pipeline on the correct project' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+
+ describe '#ref' do
+ context 'when OMNIBUS_BRANCH is set' do
+ let(:ref) { 'omnibus_branch' }
+
+ before do
+ stub_env('OMNIBUS_BRANCH', ref)
+ end
+
+ it 'triggers the pipeline on the correct ref' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+
+ context 'when CI_COMMIT_REF_NAME is a stable branch' do
+ let(:ref) { '14-10-stable' }
+
+ before do
+ stub_env('CI_COMMIT_REF_NAME', "#{ref}-ee")
+ end
+
+ it 'triggers the pipeline on the correct ref' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+ end
+
+ describe Trigger::CNG do
+ describe '#variables' do
+ it 'does not include redundant variables' do
+ expect(subject.variables).not_to include('TRIGGER_SOURCE', 'TRIGGERED_USER')
+ end
+
+ it 'invokes the trigger with expected variables' do
+ expect(subject.variables).to include('FORCE_RAILS_IMAGE_BUILDS' => 'true')
+ end
+
+ describe "TRIGGER_BRANCH" do
+ context 'when CNG_BRANCH is not set' do
+ it 'sets TRIGGER_BRANCH to master' do
+ expect(subject.variables['TRIGGER_BRANCH']).to eq('master')
+ end
+ end
+
+ context 'when CNG_BRANCH is set' do
+ let(:ref) { 'cng_branch' }
+
+ before do
+ stub_env('CNG_BRANCH', ref)
+ end
+
+ it 'sets TRIGGER_BRANCH to cng_branch' do
+ expect(subject.variables['TRIGGER_BRANCH']).to eq(ref)
+ end
+ end
+
+ context 'when CI_COMMIT_REF_NAME is a stable branch' do
+ let(:ref) { '14-10-stable' }
+
+ before do
+ stub_env('CI_COMMIT_REF_NAME', "#{ref}-ee")
+ end
+
+ it 'sets TRIGGER_BRANCH to the corresponding stable branch' do
+ expect(subject.variables['TRIGGER_BRANCH']).to eq(ref)
+ end
+ end
+ end
+
+ describe "GITLAB_VERSION" do
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', 'ci_merge_request_source_branch_sha')
+ end
+
+ it 'sets GITLAB_VERSION to CI_MERGE_REQUEST_SOURCE_BRANCH_SHA' do
+ expect(subject.variables['GITLAB_VERSION']).to eq('ci_merge_request_source_branch_sha')
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set as empty' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', '')
+ end
+
+ it 'sets GITLAB_VERSION to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_VERSION']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is not set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', nil)
+ end
+
+ it 'sets GITLAB_VERSION to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_VERSION']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+ end
+
+ describe "GITLAB_TAG" do
+ context 'when CI_COMMIT_TAG is set' do
+ before do
+ stub_env('CI_COMMIT_TAG', 'v1.0')
+ end
+
+ it 'sets GITLAB_TAG to true' do
+ expect(subject.variables['GITLAB_TAG']).to eq('v1.0')
+ end
+ end
+
+ context 'when CI_COMMIT_TAG is nil' do
+ before do
+ stub_env('CI_COMMIT_TAG', nil)
+ end
+
+ it 'sets GITLAB_TAG to nil' do
+ expect(subject.variables['GITLAB_TAG']).to eq(nil)
+ end
+ end
+ end
+
+ describe "GITLAB_ASSETS_TAG" do
+ context 'when CI_COMMIT_TAG is set' do
+ before do
+ stub_env('CI_COMMIT_TAG', 'v1.0')
+ end
+
+ it 'sets GITLAB_ASSETS_TAG to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['GITLAB_ASSETS_TAG']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+
+ context 'when CI_COMMIT_TAG and CI_MERGE_REQUEST_SOURCE_BRANCH_SHA are nil' do
+ before do
+ stub_env('CI_COMMIT_TAG', nil)
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', nil)
+ end
+
+ it 'sets GITLAB_ASSETS_TAG to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_ASSETS_TAG']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+ end
+
+ describe "CE_PIPELINE" do
+ context 'when Trigger.ee? is true' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(true)
+ end
+
+ it 'sets CE_PIPELINE to nil' do
+ expect(subject.variables['CE_PIPELINE']).to eq(nil)
+ end
+ end
+
+ context 'when Trigger.ee? is false' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(false)
+ end
+
+ it 'sets CE_PIPELINE to true' do
+ expect(subject.variables['CE_PIPELINE']).to eq('true')
+ end
+ end
+ end
+
+ describe "EE_PIPELINE" do
+ context 'when Trigger.ee? is true' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(true)
+ end
+
+ it 'sets EE_PIPELINE to true' do
+ expect(subject.variables['EE_PIPELINE']).to eq('true')
+ end
+ end
+
+ context 'when Trigger.ee? is false' do
+ before do
+ allow(Trigger).to receive(:ee?).and_return(false)
+ end
+
+ it 'sets EE_PIPELINE to nil' do
+ expect(subject.variables['EE_PIPELINE']).to eq(nil)
+ end
+ end
+ end
+
+ describe "#version_param_value" do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:version_file) { 'GITALY_SERVER_VERSION' }
+
+ where(:raw_version, :expected_version) do
+ "1.2.3" | "v1.2.3"
+ "1.2.3-rc1" | "v1.2.3-rc1"
+ "1.2.3-ee" | "v1.2.3-ee"
+ "1.2.3-rc1-ee" | "v1.2.3-rc1-ee"
+ end
+
+ with_them do
+ context "when set in ENV" do
+ before do
+ stub_env(version_file, raw_version)
+ end
+
+ it 'includes the version from ENV' do
+ expect(subject.variables[version_file]).to eq(expected_version)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ describe Trigger::Docs do
+ let(:downstream_project_path) { 'gitlab-org/gitlab-docs' }
+
+ describe '#variables' do
+ describe "BRANCH_CE" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/gitlab-foss')
+ end
+
+ context 'when CI_PROJECT_PATH is gitlab-org/gitlab-foss' do
+ it 'sets BRANCH_CE to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['BRANCH_CE']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+ end
+
+ describe "BRANCH_EE" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/gitlab')
+ end
+
+ context 'when CI_PROJECT_PATH is gitlab-org/gitlab' do
+ it 'sets BRANCH_EE to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['BRANCH_EE']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+ end
+
+ describe "BRANCH_RUNNER" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/gitlab-runner')
+ end
+
+ context 'when CI_PROJECT_PATH is gitlab-org/gitlab-runner' do
+ it 'sets BRANCH_RUNNER to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['BRANCH_RUNNER']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+ end
+
+ describe "BRANCH_OMNIBUS" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/omnibus-gitlab')
+ end
+
+ context 'when CI_PROJECT_PATH is gitlab-org/omnibus-gitlab' do
+ it 'sets BRANCH_OMNIBUS to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['BRANCH_OMNIBUS']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+ end
+
+ describe "BRANCH_CHARTS" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/charts/gitlab')
+ end
+
+ context 'when CI_PROJECT_PATH is gitlab-org/charts/gitlab' do
+ it 'sets BRANCH_CHARTS to CI_COMMIT_REF_NAME' do
+ expect(subject.variables['BRANCH_CHARTS']).to eq(env['CI_COMMIT_REF_NAME'])
+ end
+ end
+ end
+
+ describe "REVIEW_SLUG" do
+ before do
+ stub_env('CI_PROJECT_PATH', 'gitlab-org/gitlab-foss')
+ end
+
+ context 'when CI_MERGE_REQUEST_IID is set' do
+ it 'sets REVIEW_SLUG' do
+ expect(subject.variables['REVIEW_SLUG']).to eq("-ce-#{env['CI_MERGE_REQUEST_IID']}")
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_IID is not set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_IID', nil)
+ end
+
+ it 'sets REVIEW_SLUG' do
+ expect(subject.variables['REVIEW_SLUG']).to eq("-ce-#{env['CI_COMMIT_REF_SLUG']}")
+ end
+ end
+ end
+ end
+
+ describe '.access_token' do
+ context 'when DOCS_PROJECT_API_TOKEN is set' do
+ let(:docs_project_api_token) { 'docs_project_api_token' }
+
+ before do
+ stub_env('DOCS_PROJECT_API_TOKEN', docs_project_api_token)
+ end
+
+ it 'returns the docs-specific access token' do
+ expect(described_class.access_token).to eq(docs_project_api_token)
+ end
+ end
+
+ context 'when DOCS_PROJECT_API_TOKEN is not set' do
+ before do
+ stub_env('DOCS_PROJECT_API_TOKEN', nil)
+ end
+
+ it 'returns the default access token' do
+ expect(described_class.access_token).to eq(Trigger::Base.access_token)
+ end
+ end
+ end
+
+ describe '#invoke!' do
+ let(:trigger_token) { 'docs_trigger_token' }
+ let(:ref) { 'main' }
+
+ let(:env) do
+ super().merge(
+ 'CI_PROJECT_PATH' => 'gitlab-org/gitlab-foss',
+ 'DOCS_TRIGGER_TOKEN' => trigger_token
+ )
+ end
+
+ describe '#downstream_project_path' do
+ context 'when DOCS_PROJECT_PATH is set' do
+ let(:downstream_project_path) { 'docs_project_path' }
+
+ before do
+ stub_env('DOCS_PROJECT_PATH', downstream_project_path)
+ end
+
+ it 'triggers the pipeline on the correct project' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+
+ describe '#ref' do
+ context 'when DOCS_BRANCH is set' do
+ let(:ref) { 'docs_branch' }
+
+ before do
+ stub_env('DOCS_BRANCH', ref)
+ end
+
+ it 'triggers the pipeline on the correct ref' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+ end
+
+ describe '#cleanup!' do
+ let(:downstream_environment_response) { double('downstream_environment', id: 42) }
+ let(:downstream_environments_response) { [downstream_environment_response] }
+
+ before do
+ expect(com_gitlab_client).to receive(:environments)
+ .with(downstream_project_path, name: subject.__send__(:downstream_environment))
+ .and_return(downstream_environments_response)
+ expect(com_gitlab_client).to receive(:stop_environment)
+ .with(downstream_project_path, downstream_environment_response.id)
+ .and_return(downstream_environment_stopping_response)
+ end
+
+ context "when stopping the environment succeeds" do
+ let(:downstream_environment_stopping_response) { double('downstream_environment', state: 'stopped') }
+
+ it 'displays a success message' do
+ expect(subject).to receive(:puts)
+ .with("=> Downstream environment '#{subject.__send__(:downstream_environment)}' stopped.")
+
+ subject.cleanup!
+ end
+ end
+
+ context "when stopping the environment fails" do
+ let(:downstream_environment_stopping_response) { double('downstream_environment', state: 'running') }
+
+ it 'displays a failure message' do
+ expect(subject).to receive(:puts)
+ .with("=> Downstream environment '#{subject.__send__(:downstream_environment)}' failed to stop.")
+
+ subject.cleanup!
+ end
+ end
+ end
+ end
+
+ describe Trigger::DatabaseTesting do
+ describe '#variables' do
+ it 'invokes the trigger with expected variables' do
+ expect(subject.variables).to include('TRIGGERED_USER_LOGIN' => env['GITLAB_USER_LOGIN'])
+ end
+
+ describe "GITLAB_COMMIT_SHA" do
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', 'ci_merge_request_source_branch_sha')
+ end
+
+ it 'sets GITLAB_COMMIT_SHA to ci_merge_request_source_branch_sha' do
+ expect(subject.variables['GITLAB_COMMIT_SHA']).to eq('ci_merge_request_source_branch_sha')
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is set as empty' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', '')
+ end
+
+ it 'sets GITLAB_COMMIT_SHA to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_COMMIT_SHA']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+
+ context 'when CI_MERGE_REQUEST_SOURCE_BRANCH_SHA is not set' do
+ before do
+ stub_env('CI_MERGE_REQUEST_SOURCE_BRANCH_SHA', nil)
+ end
+
+ it 'sets GITLAB_COMMIT_SHA to CI_COMMIT_SHA' do
+ expect(subject.variables['GITLAB_COMMIT_SHA']).to eq(env['CI_COMMIT_SHA'])
+ end
+ end
+ end
+ end
+
+ describe '#invoke!' do
+ let(:downstream_project_path) { 'gitlab-com/database-team/gitlab-com-database-testing' }
+ let(:trigger_token) { 'gitlabcom_database_testing_access_token' }
+ let(:ops_api_endpoint) { 'https://ops.gitlab.net/api/v4' }
+ let(:ops_api_token) { 'gitlabcom_database_testing_access_token' }
+ let(:ops_gitlab_client) { double('ops_gitlab_client') }
+
+ let(:downstream_gitlab_client_endpoint) { ops_api_endpoint }
+ let(:downstream_gitlab_client_token) { ops_api_token }
+ let(:downstream_gitlab_client) { ops_gitlab_client }
+
+ let(:ref) { 'master' }
+ let(:mr_notes) { [double(body: described_class::IDENTIFIABLE_NOTE_TAG)] }
+
+ let(:env) do
+ super().merge(
+ 'GITLABCOM_DATABASE_TESTING_ACCESS_TOKEN' => ops_api_token,
+ 'GITLABCOM_DATABASE_TESTING_TRIGGER_TOKEN' => trigger_token
+ )
+ end
+
+ before do
+ allow(Gitlab).to receive(:client)
+ .with(
+ endpoint: com_api_endpoint,
+ private_token: com_api_token
+ )
+ .and_return(com_gitlab_client)
+ allow(com_gitlab_client).to receive(:merge_request_notes)
+ .with(
+ env['CI_PROJECT_PATH'],
+ env['CI_MERGE_REQUEST_IID']
+ )
+ .and_return(double(auto_paginate: mr_notes))
+ end
+
+ it 'invokes the trigger with expected variables' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+
+ describe '#downstream_project_path' do
+ context 'when GITLABCOM_DATABASE_TESTING_PROJECT_PATH is set' do
+ let(:downstream_project_path) { 'gitlabcom_database_testing_project_path' }
+
+ before do
+ stub_env('GITLABCOM_DATABASE_TESTING_PROJECT_PATH', downstream_project_path)
+ end
+
+ it 'triggers the pipeline on the correct project' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+
+ describe '#ref' do
+ context 'when GITLABCOM_DATABASE_TESTING_TRIGGER_REF is set' do
+ let(:ref) { 'gitlabcom_database_testing_trigger_ref' }
+
+ before do
+ stub_env('GITLABCOM_DATABASE_TESTING_TRIGGER_REF', ref)
+ end
+
+ it 'triggers the pipeline on the correct ref' do
+ expect_run_trigger_with_params
+
+ subject.invoke!
+ end
+ end
+ end
+
+ context 'when no MR notes with the identifier exist yet' do
+ let(:mr_notes) { [double(body: 'hello world')] }
+
+ it 'posts a new note' do
+ expect_run_trigger_with_params
+ expect(com_gitlab_client).to receive(:create_merge_request_note)
+ .with(
+ env['CI_PROJECT_PATH'],
+ env['CI_MERGE_REQUEST_IID'],
+ instance_of(String)
+ )
+ .and_return(double(id: 42))
+
+ subject.invoke!
+ end
+ end
+ end
+ end
+end
+# rubocop:enable RSpec/VerifiedDoubles
diff --git a/spec/serializers/build_details_entity_spec.rb b/spec/serializers/build_details_entity_spec.rb
index da2734feb51..dd8238456aa 100644
--- a/spec/serializers/build_details_entity_spec.rb
+++ b/spec/serializers/build_details_entity_spec.rb
@@ -127,21 +127,48 @@ RSpec.describe BuildDetailsEntity do
end
context 'when the build has failed due to a missing dependency' do
- let!(:test1) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test1', stage_idx: 0) }
- let!(:test2) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test2', stage_idx: 1) }
- let!(:build) { create(:ci_build, :pending, pipeline: pipeline, stage_idx: 2, options: { dependencies: %w(test1 test2) }) }
let(:message) { subject[:callout_message] }
- before do
- build.pipeline.unlocked!
- build.drop!(:missing_dependency_failure)
+ context 'when the dependency is in the same pipeline' do
+ let!(:test1) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test1', stage_idx: 0) }
+ let!(:test2) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test2', stage_idx: 1) }
+ let!(:build) { create(:ci_build, :pending, pipeline: pipeline, stage_idx: 2, options: { dependencies: %w(test1 test2) }) }
+
+ before do
+ build.pipeline.unlocked!
+ build.drop!(:missing_dependency_failure)
+ end
+
+ it { is_expected.to include(failure_reason: 'missing_dependency_failure') }
+
+ it 'includes the failing dependencies in the callout message' do
+ expect(message).to include('test1')
+ expect(message).to include('test2')
+ end
+
+ it 'includes message for list of invalid dependencies' do
+ expect(message).to include('could not retrieve the needed artifacts:')
+ end
end
- it { is_expected.to include(failure_reason: 'missing_dependency_failure') }
+ context 'when dependency is not found' do
+ let!(:build) { create(:ci_build, :pending, pipeline: pipeline, stage_idx: 2, options: { dependencies: %w(test1 test2) }) }
+
+ before do
+ build.pipeline.unlocked!
+ build.drop!(:missing_dependency_failure)
+ end
- it 'includes the failing dependencies in the callout message' do
- expect(message).to include('test1')
- expect(message).to include('test2')
+ it { is_expected.to include(failure_reason: 'missing_dependency_failure') }
+
+ it 'excludes the failing dependencies in the callout message' do
+ expect(message).not_to include('test1')
+ expect(message).not_to include('test2')
+ end
+
+ it 'includes the correct punctuation in the message' do
+ expect(message).to include('could not retrieve the needed artifacts.')
+ end
end
end
diff --git a/spec/serializers/ci/job_entity_spec.rb b/spec/serializers/ci/job_entity_spec.rb
index ba68b9a6c16..05b9e38444c 100644
--- a/spec/serializers/ci/job_entity_spec.rb
+++ b/spec/serializers/ci/job_entity_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe Ci::JobEntity do
let(:user) { create(:user) }
- let(:job) { create(:ci_build) }
+ let(:job) { create(:ci_build, :running) }
let(:project) { job.project }
let(:request) { double('request') }
@@ -21,6 +21,11 @@ RSpec.describe Ci::JobEntity do
subject { entity.as_json }
+ it 'contains started' do
+ expect(subject).to include(:started)
+ expect(subject[:started]).to eq(true)
+ end
+
it 'contains complete to indicate if a pipeline is completed' do
expect(subject).to include(:complete)
end
@@ -128,6 +133,15 @@ RSpec.describe Ci::JobEntity do
end
end
+ context 'when job is running' do
+ let_it_be(:job) { create(:ci_build, :running) }
+
+ it 'contains started_at' do
+ expect(subject[:started]).to be_truthy
+ expect(subject[:started_at]).to eq(job.started_at)
+ end
+ end
+
context 'when job is generic commit status' do
let(:job) { create(:generic_commit_status, target_url: 'http://google.com') }
diff --git a/spec/serializers/cluster_entity_spec.rb b/spec/serializers/cluster_entity_spec.rb
index ee1388024ea..514828e3c69 100644
--- a/spec/serializers/cluster_entity_spec.rb
+++ b/spec/serializers/cluster_entity_spec.rb
@@ -77,6 +77,14 @@ RSpec.describe ClusterEntity do
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
@@ -98,6 +106,14 @@ RSpec.describe ClusterEntity do
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/discussion_entity_spec.rb b/spec/serializers/discussion_entity_spec.rb
index 0645d19da5b..0fe10ed2c6d 100644
--- a/spec/serializers/discussion_entity_spec.rb
+++ b/spec/serializers/discussion_entity_spec.rb
@@ -5,8 +5,11 @@ require 'spec_helper'
RSpec.describe DiscussionEntity do
include RepoHelpers
- let(:user) { create(:user) }
- let(:note) { create(:discussion_note_on_merge_request) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, namespace: group) }
+
+ let(:note) { create(:discussion_note_on_merge_request, project: project) }
let(:discussion) { note.discussion }
let(:request) { double('request', note_entity: ProjectNoteEntity) }
let(:controller) { double('controller') }
@@ -50,10 +53,15 @@ RSpec.describe DiscussionEntity do
.to match_schema('entities/note_user_entity')
end
+ it 'exposes the url for custom award emoji' do
+ custom_emoji = create(:custom_emoji, group: group)
+ create(:award_emoji, awardable: note, name: custom_emoji.name)
+
+ expect(subject[:notes].last[:award_emoji].first.keys).to include(:url)
+ end
+
context 'when is LegacyDiffDiscussion' do
- let(:project) { create(:project) }
- let(:merge_request) { create(:merge_request, source_project: project) }
- let(:discussion) { create(:legacy_diff_note_on_merge_request, noteable: merge_request, project: project).to_discussion }
+ let(:discussion) { create(:legacy_diff_note_on_merge_request, noteable: note.noteable, project: project).to_discussion }
it 'exposes correct attributes' do
expect(subject.keys.sort).to include(
diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb
index a59107ad309..9b6a293da16 100644
--- a/spec/serializers/environment_entity_spec.rb
+++ b/spec/serializers/environment_entity_spec.rb
@@ -166,6 +166,18 @@ RSpec.describe EnvironmentEntity do
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
diff --git a/spec/serializers/issue_board_entity_spec.rb b/spec/serializers/issue_board_entity_spec.rb
index 30423ceba6d..b8e2bfeaa3d 100644
--- a/spec/serializers/issue_board_entity_spec.rb
+++ b/spec/serializers/issue_board_entity_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe IssueBoardEntity do
+ include Gitlab::Routing.url_helpers
+
let_it_be(:project) { create(:project) }
let_it_be(:resource) { create(:issue, project: project) }
let_it_be(:user) { create(:user) }
@@ -40,4 +42,18 @@ RSpec.describe IssueBoardEntity do
expect(subject).to include(labels: array_including(hash_including(:id, :title, :color, :description, :text_color, :priority)))
end
+
+ describe 'real_path' do
+ it 'has an issue path' do
+ expect(subject[:real_path]).to eq(project_issue_path(project, resource.iid))
+ end
+
+ context 'when issue is of type task' do
+ let(:resource) { create(:issue, :task, project: project) }
+
+ it 'has a work item path' do
+ expect(subject[:real_path]).to eq(project_work_items_path(project, resource.id))
+ end
+ end
+ end
end
diff --git a/spec/serializers/issue_entity_spec.rb b/spec/serializers/issue_entity_spec.rb
index 76f8cf644c6..6ccb3dbc657 100644
--- a/spec/serializers/issue_entity_spec.rb
+++ b/spec/serializers/issue_entity_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe IssueEntity do
+ include Gitlab::Routing.url_helpers
+
let(:project) { create(:project) }
let(:resource) { create(:issue, project: project) }
let(:user) { create(:user) }
@@ -11,6 +13,17 @@ RSpec.describe IssueEntity do
subject { described_class.new(resource, request: request).as_json }
+ describe 'web_url' do
+ context 'when issue is of type task' do
+ let(:resource) { create(:issue, :task, project: project) }
+
+ # This was already a path and not a url when the work items change was introduced
+ it 'has a work item path' do
+ expect(subject[:web_url]).to eq(project_work_items_path(project, resource.id))
+ end
+ end
+ end
+
it 'has Issuable attributes' do
expect(subject).to include(:id, :iid, :author_id, :description, :lock_version, :milestone_id,
:title, :updated_by_id, :created_at, :updated_at, :milestone, :labels)
diff --git a/spec/serializers/issue_sidebar_basic_entity_spec.rb b/spec/serializers/issue_sidebar_basic_entity_spec.rb
index 716c97f72af..564ffb1aea9 100644
--- a/spec/serializers/issue_sidebar_basic_entity_spec.rb
+++ b/spec/serializers/issue_sidebar_basic_entity_spec.rb
@@ -94,5 +94,37 @@ RSpec.describe IssueSidebarBasicEntity do
expect(entity[:show_crm_contacts]).to be(expected)
end
end
+
+ context 'in subgroup' do
+ let(:subgroup_project) { create(:project, :repository, group: subgroup) }
+ let(:subgroup_issue) { create(:issue, project: subgroup_project) }
+ let(:serializer) { IssueSerializer.new(current_user: user, project: subgroup_project) }
+
+ subject(:entity) { serializer.represent(subgroup_issue, serializer: 'sidebar') }
+
+ before do
+ subgroup_project.root_ancestor.add_reporter(user)
+ end
+
+ context 'with crm enabled' do
+ let(:subgroup) { create(:group, :crm_enabled, parent: group) }
+
+ it 'is true' do
+ allow(CustomerRelations::Contact).to receive(:exists_for_group?).with(group).and_return(true)
+
+ expect(entity[:show_crm_contacts]).to be_truthy
+ end
+ end
+
+ context 'with crm disabled' do
+ let(:subgroup) { create(:group, parent: group) }
+
+ it 'is false' do
+ allow(CustomerRelations::Contact).to receive(:exists_for_group?).with(group).and_return(true)
+
+ expect(entity[:show_crm_contacts]).to be_falsy
+ end
+ end
+ end
end
end
diff --git a/spec/serializers/linked_project_issue_entity_spec.rb b/spec/serializers/linked_project_issue_entity_spec.rb
index 864b5c45599..b28b00bd8e1 100644
--- a/spec/serializers/linked_project_issue_entity_spec.rb
+++ b/spec/serializers/linked_project_issue_entity_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe LinkedProjectIssueEntity do
+ include Gitlab::Routing.url_helpers
+
let_it_be(:user) { create(:user) }
let_it_be(:project) { create(:project) }
let_it_be(:issue_link) { create(:issue_link) }
@@ -17,7 +19,25 @@ RSpec.describe LinkedProjectIssueEntity do
issue_link.target.project.add_developer(user)
end
+ subject(:serialized_entity) { entity.as_json }
+
describe 'issue_link_type' do
- it { expect(entity.as_json).to include(link_type: 'relates_to') }
+ it { is_expected.to include(link_type: 'relates_to') }
+ end
+
+ describe 'path' do
+ it 'returns an issue path' do
+ expect(serialized_entity).to include(path: project_issue_path(related_issue.project, related_issue.iid))
+ end
+
+ context 'when related issue is a task' do
+ before do
+ related_issue.update!(issue_type: :task, work_item_type: WorkItems::Type.default_by_type(:task))
+ end
+
+ it 'returns a work items path' do
+ expect(serialized_entity).to include(path: project_work_items_path(related_issue.project, related_issue.id))
+ end
+ end
end
end
diff --git a/spec/serializers/merge_request_user_entity_spec.rb b/spec/serializers/merge_request_user_entity_spec.rb
index 72d1b0c0dd2..7877356ff0f 100644
--- a/spec/serializers/merge_request_user_entity_spec.rb
+++ b/spec/serializers/merge_request_user_entity_spec.rb
@@ -58,6 +58,10 @@ RSpec.describe MergeRequestUserEntity do
end
context 'attention_requested' do
+ before do
+ merge_request.find_assignee(user).update!(state: :attention_requested)
+ end
+
it { is_expected.to include(attention_requested: true ) }
end
diff --git a/spec/serializers/release_serializer_spec.rb b/spec/serializers/release_serializer_spec.rb
index 518d281f370..b31172c3a50 100644
--- a/spec/serializers/release_serializer_spec.rb
+++ b/spec/serializers/release_serializer_spec.rb
@@ -19,6 +19,10 @@ RSpec.describe ReleaseSerializer do
it 'serializes the label object' do
expect(subject[:tag]).to eq resource.tag
end
+
+ it 'does not expose git-sha as sensitive information' do
+ expect(subject[:sha]).to be_nil
+ end
end
context 'when multiple objects are being serialized' do
diff --git a/spec/services/alert_management/alerts/update_service_spec.rb b/spec/services/alert_management/alerts/update_service_spec.rb
index 882543fd701..f02607b8174 100644
--- a/spec/services/alert_management/alerts/update_service_spec.rb
+++ b/spec/services/alert_management/alerts/update_service_spec.rb
@@ -88,7 +88,7 @@ RSpec.describe AlertManagement::Alerts::UpdateService do
it_behaves_like 'title update'
end
- context 'when alert is resolved and another existing open alert' do
+ context 'when alert is resolved and another existing unresolved alert' do
let!(:alert) { create(:alert_management_alert, :resolved, project: project) }
let!(:existing_alert) { create(:alert_management_alert, :triggered, project: project) }
@@ -193,27 +193,38 @@ RSpec.describe AlertManagement::Alerts::UpdateService do
end
end
- context 'with an opening status and existing open alert' do
- let_it_be(:alert) { create(:alert_management_alert, :resolved, :with_fingerprint, project: project) }
- let_it_be(:existing_alert) { create(:alert_management_alert, :triggered, fingerprint: alert.fingerprint, project: project) }
- let_it_be(:url) { Gitlab::Routing.url_helpers.details_project_alert_management_path(project, existing_alert) }
- let_it_be(:link) { ActionController::Base.helpers.link_to(_('alert'), url) }
+ context 'with existing unresolved alert' do
+ context 'with fingerprints' do
+ let_it_be(:existing_alert) { create(:alert_management_alert, :triggered, fingerprint: alert.fingerprint, project: project) }
- let(:message) do
- "An #{link} with the same fingerprint is already open. " \
- 'To change the status of this alert, resolve the linked alert.'
- end
+ it 'does not query for existing alerts' do
+ expect(::AlertManagement::Alert).not_to receive(:find_unresolved_alert)
- it_behaves_like 'does not add a todo'
- it_behaves_like 'does not add a system note'
+ response
+ end
- it 'has an informative message' do
- expect(response).to be_error
- expect(response.message).to eq(message)
+ context 'when status was resolved' do
+ let_it_be(:alert) { create(:alert_management_alert, :resolved, :with_fingerprint, project: project) }
+ let_it_be(:existing_alert) { create(:alert_management_alert, :triggered, fingerprint: alert.fingerprint, project: project) }
+
+ let(:url) { Gitlab::Routing.url_helpers.details_project_alert_management_path(project, existing_alert) }
+ let(:link) { ActionController::Base.helpers.link_to(_('alert'), url) }
+ let(:message) do
+ "An #{link} with the same fingerprint is already open. " \
+ 'To change the status of this alert, resolve the linked alert.'
+ end
+
+ it_behaves_like 'does not add a todo'
+ it_behaves_like 'does not add a system note'
+
+ it 'has an informative message' do
+ expect(response).to be_error
+ expect(response.message).to eq(message)
+ end
+ end
end
- context 'fingerprints are blank' do
- let_it_be(:alert) { create(:alert_management_alert, :resolved, project: project, fingerprint: nil) }
+ context 'without fingerprints' do
let_it_be(:existing_alert) { create(:alert_management_alert, :triggered, fingerprint: alert.fingerprint, project: project) }
it 'successfully changes the status' do
diff --git a/spec/services/audit_event_service_spec.rb b/spec/services/audit_event_service_spec.rb
index 6963515ba5c..063d250f22b 100644
--- a/spec/services/audit_event_service_spec.rb
+++ b/spec/services/audit_event_service_spec.rb
@@ -76,11 +76,13 @@ RSpec.describe AuditEventService do
it 'creates an authentication event' do
expect(AuthenticationEvent).to receive(:new).with(
- user: user,
- user_name: user.name,
- ip_address: user.current_sign_in_ip,
- result: AuthenticationEvent.results[:success],
- provider: 'standard'
+ {
+ user: user,
+ user_name: user.name,
+ ip_address: user.current_sign_in_ip,
+ result: AuthenticationEvent.results[:success],
+ provider: 'standard'
+ }
).and_call_original
audit_service.for_authentication.security_event
diff --git a/spec/services/authorized_project_update/project_create_service_spec.rb b/spec/services/authorized_project_update/project_create_service_spec.rb
deleted file mode 100644
index a9d0b82acfb..00000000000
--- a/spec/services/authorized_project_update/project_create_service_spec.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe AuthorizedProjectUpdate::ProjectCreateService do
- let_it_be(:group_parent) { create(:group, :private) }
- let_it_be(:group) { create(:group, :private, parent: group_parent) }
- let_it_be(:group_child) { create(:group, :private, parent: group) }
-
- let_it_be(:group_project) { create(:project, group: group) }
-
- let_it_be(:parent_group_user) { create(:user) }
- let_it_be(:group_user) { create(:user) }
- let_it_be(:child_group_user) { create(:user) }
-
- let(:access_level) { Gitlab::Access::MAINTAINER }
-
- subject(:service) { described_class.new(group_project) }
-
- describe '#perform' do
- context 'direct group members' do
- before do
- create(:group_member, access_level: access_level, group: group, user: group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: group_user.id,
- access_level: access_level)
-
- expect(project_authorization).to exist
- end
- end
-
- context 'inherited group members' do
- before do
- create(:group_member, access_level: access_level, group: group_parent, user: parent_group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: parent_group_user.id,
- access_level: access_level)
- expect(project_authorization).to exist
- end
- end
-
- context 'membership overrides' do
- context 'group hierarchy' do
- before do
- create(:group_member, access_level: Gitlab::Access::REPORTER, group: group_parent, user: group_user)
- create(:group_member, access_level: Gitlab::Access::DEVELOPER, group: group, user: group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: group_user.id,
- access_level: Gitlab::Access::DEVELOPER)
- expect(project_authorization).to exist
- end
- end
-
- context 'group sharing' do
- let!(:shared_with_group) { create(:group) }
-
- before do
- create(:group_member, access_level: Gitlab::Access::REPORTER, group: group, user: group_user)
- create(:group_member, access_level: Gitlab::Access::MAINTAINER, group: shared_with_group, user: group_user)
- create(:group_member, :minimal_access, source: shared_with_group, user: create(:user))
-
- create(:group_group_link, shared_group: group, shared_with_group: shared_with_group, group_access: Gitlab::Access::DEVELOPER)
-
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: group_user.id,
- access_level: Gitlab::Access::DEVELOPER)
- expect(project_authorization).to exist
- end
-
- it 'does not create project authorization for user with minimal access' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
- end
- end
- end
-
- context 'no group member' do
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'unapproved access requests' do
- before do
- create(:group_member, :guest, :access_request, user: group_user, group: group)
- end
-
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'member with minimal access' do
- before do
- create(:group_member, :minimal_access, user: group_user, source: group)
- end
-
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'project has more user than BATCH_SIZE' do
- let(:batch_size) { 2 }
- let(:users) { create_list(:user, batch_size + 1 ) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", batch_size)
-
- users.each do |user|
- create(:group_member, access_level: access_level, group: group_parent, user: user)
- end
-
- ProjectAuthorization.delete_all
- end
-
- it 'bulk creates project authorizations in batches' do
- users.each_slice(batch_size) do |batch|
- attributes = batch.map do |user|
- { user_id: user.id, project_id: group_project.id, access_level: access_level }
- end
-
- expect(ProjectAuthorization).to(
- receive(:insert_all).with(array_including(attributes)).and_call_original)
- end
-
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(batch_size + 1))
- end
- end
-
- context 'ignores existing project authorizations' do
- before do
- # ProjectAuthorizations is also created because of an after_commit
- # callback on Member model
- create(:group_member, access_level: access_level, group: group, user: group_user)
- end
-
- it 'does not create project authorization' do
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: group_user.id,
- access_level: access_level)
-
- expect { service.execute }.not_to(
- change { project_authorization.reload.exists? }.from(true))
- end
- end
- end
-end
diff --git a/spec/services/authorized_project_update/project_group_link_create_service_spec.rb b/spec/services/authorized_project_update/project_group_link_create_service_spec.rb
deleted file mode 100644
index 1fd47f78c24..00000000000
--- a/spec/services/authorized_project_update/project_group_link_create_service_spec.rb
+++ /dev/null
@@ -1,222 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe AuthorizedProjectUpdate::ProjectGroupLinkCreateService do
- let_it_be(:group_parent) { create(:group, :private) }
- let_it_be(:group) { create(:group, :private, parent: group_parent) }
- let_it_be(:group_child) { create(:group, :private, parent: group) }
-
- let_it_be(:parent_group_user) { create(:user) }
- let_it_be(:group_user) { create(:user) }
-
- let_it_be(:project) { create(:project, :private, group: create(:group, :private)) }
-
- let(:access_level) { Gitlab::Access::MAINTAINER }
- let(:group_access) { nil }
-
- subject(:service) { described_class.new(project, group, group_access) }
-
- describe '#perform' do
- context 'direct group members' do
- before do
- create(:group_member, access_level: access_level, group: group, user: group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: access_level)
-
- expect(project_authorization).to exist
- end
- end
-
- context 'inherited group members' do
- before do
- create(:group_member, access_level: access_level, group: group_parent, user: parent_group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: parent_group_user.id,
- access_level: access_level)
- expect(project_authorization).to exist
- end
- end
-
- context 'with group_access' do
- let(:group_access) { Gitlab::Access::REPORTER }
-
- before do
- create(:group_member, access_level: access_level, group: group_parent, user: parent_group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: parent_group_user.id,
- access_level: group_access)
- expect(project_authorization).to exist
- end
- end
-
- context 'membership overrides' do
- before do
- create(:group_member, access_level: Gitlab::Access::REPORTER, group: group_parent, user: group_user)
- create(:group_member, access_level: Gitlab::Access::DEVELOPER, group: group, user: group_user)
- ProjectAuthorization.delete_all
- end
-
- it 'creates project authorization' do
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(1))
-
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: Gitlab::Access::DEVELOPER)
- expect(project_authorization).to exist
- end
- end
-
- context 'no group member' do
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'unapproved access requests' do
- before do
- create(:group_member, :guest, :access_request, user: group_user, group: group)
- end
-
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'minimal access member' do
- before do
- create(:group_member, :minimal_access, user: group_user, source: group)
- end
-
- it 'does not create project authorization' do
- expect { service.execute }.not_to(
- change { ProjectAuthorization.count }.from(0))
- end
- end
-
- context 'project has more users than BATCH_SIZE' do
- let(:batch_size) { 2 }
- let(:users) { create_list(:user, batch_size + 1 ) }
-
- before do
- stub_const("#{described_class.name}::BATCH_SIZE", batch_size)
-
- users.each do |user|
- create(:group_member, access_level: access_level, group: group_parent, user: user)
- end
-
- ProjectAuthorization.delete_all
- end
-
- it 'bulk creates project authorizations in batches' do
- users.each_slice(batch_size) do |batch|
- attributes = batch.map do |user|
- { user_id: user.id, project_id: project.id, access_level: access_level }
- end
-
- expect(ProjectAuthorization).to(
- receive(:insert_all).with(array_including(attributes)).and_call_original)
- end
-
- expect { service.execute }.to(
- change { ProjectAuthorization.count }.from(0).to(batch_size + 1))
- end
- end
-
- context 'users have existing project authorizations' do
- before do
- create(:group_member, access_level: access_level, group: group, user: group_user)
- ProjectAuthorization.delete_all
-
- create(:project_authorization, user_id: group_user.id,
- project_id: project.id,
- access_level: existing_access_level)
- end
-
- context 'when access level is the same' do
- let(:existing_access_level) { access_level }
-
- it 'does not create project authorization' do
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: existing_access_level)
-
- expect(ProjectAuthorization).not_to receive(:insert_all)
-
- expect { service.execute }.not_to(
- change { project_authorization.reload.exists? }.from(true))
- end
- end
-
- context 'when existing access level is lower' do
- let(:existing_access_level) { Gitlab::Access::DEVELOPER }
-
- it 'creates new project authorization' do
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: access_level)
-
- expect { service.execute }.to(
- change { project_authorization.reload.exists? }.from(false).to(true))
- end
-
- it 'deletes previous project authorization' do
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: existing_access_level)
-
- expect { service.execute }.to(
- change { project_authorization.reload.exists? }.from(true).to(false))
- end
- end
-
- context 'when existing access level is higher' do
- let(:existing_access_level) { Gitlab::Access::OWNER }
-
- it 'does not create project authorization' do
- project_authorization = ProjectAuthorization.where(
- project_id: project.id,
- user_id: group_user.id,
- access_level: existing_access_level)
-
- expect(ProjectAuthorization).not_to receive(:insert_all)
-
- expect { service.execute }.not_to(
- change { project_authorization.reload.exists? }.from(true))
- end
- end
- end
- end
-end
diff --git a/spec/services/ci/create_downstream_pipeline_service_spec.rb b/spec/services/ci/create_downstream_pipeline_service_spec.rb
index 6142704b00e..11fb564b843 100644
--- a/spec/services/ci/create_downstream_pipeline_service_spec.rb
+++ b/spec/services/ci/create_downstream_pipeline_service_spec.rb
@@ -35,18 +35,20 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
upstream_project.add_developer(user)
end
+ subject { service.execute(bridge) }
+
context 'when downstream project has not been found' do
let(:trigger) do
{ trigger: { project: 'unknown/project' } }
end
it 'does not create a pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'changes pipeline bridge job status to failed' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason)
@@ -56,12 +58,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
context 'when user can not access downstream project' do
it 'does not create a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'changes status of the bridge build' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason)
@@ -75,12 +77,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not create a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'changes status of the bridge build' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq 'insufficient_bridge_permissions'
@@ -96,12 +98,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates only one new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }.by(1)
end
it 'creates a new pipeline in a downstream project' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.user).to eq bridge.user
expect(pipeline.project).to eq downstream_project
@@ -111,8 +113,14 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
expect(pipeline.source_bridge).to be_a ::Ci::Bridge
end
+ it_behaves_like 'logs downstream pipeline creation' do
+ let(:expected_root_pipeline) { upstream_pipeline }
+ let(:expected_hierarchy_size) { 2 }
+ let(:expected_downstream_relationship) { :multi_project }
+ end
+
it 'updates bridge status when downstream pipeline gets processed' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.reload).to be_created
expect(bridge.reload).to be_success
@@ -136,7 +144,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
bridge_id: bridge.id, project_id: bridge.project.id)
.and_call_original
expect(Ci::CreatePipelineService).not_to receive(:new)
- expect(service.execute(bridge)).to eq({ message: "Already has a downstream pipeline", status: :error })
+ expect(subject).to eq({ message: "Already has a downstream pipeline", status: :error })
end
end
@@ -146,7 +154,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'is using default branch name' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.ref).to eq 'master'
end
@@ -158,12 +166,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates only one new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }.by(1)
end
it 'creates a new pipeline in a downstream project' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.user).to eq bridge.user
expect(pipeline.project).to eq downstream_project
@@ -174,7 +182,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'updates the bridge status when downstream pipeline gets processed' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.reload).to be_failed
expect(bridge.reload).to be_failed
@@ -188,12 +196,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
context 'detects a circular dependency' do
it 'does not create a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'changes status of the bridge build' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq 'invalid_bridge_trigger'
@@ -209,12 +217,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
shared_examples 'creates a child pipeline' do
it 'creates only one new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }.by(1)
end
it 'creates a child pipeline in the same project' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.reload
expect(pipeline.builds.map(&:name)).to match_array(%w[rspec echo])
@@ -227,14 +235,14 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'updates bridge status when downstream pipeline gets processed' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.reload).to be_created
expect(bridge.reload).to be_success
end
it 'propagates parent pipeline settings to the child pipeline' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.reload
expect(pipeline.ref).to eq(upstream_pipeline.ref)
@@ -264,8 +272,14 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
it_behaves_like 'creates a child pipeline'
+ it_behaves_like 'logs downstream pipeline creation' do
+ let(:expected_root_pipeline) { upstream_pipeline }
+ let(:expected_hierarchy_size) { 2 }
+ let(:expected_downstream_relationship) { :parent_child }
+ end
+
it 'updates the bridge job to success' do
- expect { service.execute(bridge) }.to change { bridge.status }.to 'success'
+ expect { subject }.to change { bridge.status }.to 'success'
end
context 'when bridge uses "depend" strategy' do
@@ -276,7 +290,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not update the bridge job status' do
- expect { service.execute(bridge) }.not_to change { bridge.status }
+ expect { subject }.not_to change { bridge.status }
end
end
@@ -306,7 +320,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
it_behaves_like 'creates a child pipeline'
it 'propagates the merge request to the child pipeline' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.merge_request).to eq(merge_request)
expect(pipeline).to be_merge_request
@@ -322,11 +336,17 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates the pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }.by(1)
expect(bridge.reload).to be_success
end
+
+ it_behaves_like 'logs downstream pipeline creation' do
+ let(:expected_root_pipeline) { upstream_pipeline.parent_pipeline }
+ let(:expected_hierarchy_size) { 3 }
+ let(:expected_downstream_relationship) { :parent_child }
+ end
end
context 'when upstream pipeline has a parent pipeline, which has a parent pipeline' do
@@ -345,7 +365,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not create a second descendant pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
expect(bridge.reload).to be_failed
@@ -370,7 +390,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'create the pipeline' do
- expect { service.execute(bridge) }.to change { Ci::Pipeline.count }.by(1)
+ expect { subject }.to change { Ci::Pipeline.count }.by(1)
end
end
@@ -382,11 +402,11 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates a new pipeline allowing variables to be passed downstream' do
- expect { service.execute(bridge) }.to change { Ci::Pipeline.count }.by(1)
+ expect { subject }.to change { Ci::Pipeline.count }.by(1)
end
it 'passes variables downstream from the bridge' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.variables.map(&:key).tap do |variables|
expect(variables).to include 'BRIDGE'
@@ -444,12 +464,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
describe 'cyclical dependency detection' do
shared_examples 'detects cyclical pipelines' do
it 'does not create a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'changes status of the bridge build' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq 'pipeline_loop_detected'
@@ -458,12 +478,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
shared_examples 'passes cyclical pipeline precondition' do
it 'creates a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }
end
it 'expect bridge build not to be failed' do
- service.execute(bridge)
+ subject
expect(bridge.reload).not_to be_failed
end
@@ -537,19 +557,19 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates only one new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change { Ci::Pipeline.count }.by(1)
end
it 'creates a new pipeline in the downstream project' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.user).to eq bridge.user
expect(pipeline.project).to eq downstream_project
end
it 'drops the bridge' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.reload).to be_failed
expect(bridge.reload).to be_failed
@@ -573,7 +593,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
bridge_id: bridge.id,
downstream_pipeline_id: kind_of(Numeric))
- service.execute(bridge)
+ subject
end
end
@@ -583,7 +603,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'passes bridge variables to downstream pipeline' do
- pipeline = service.execute(bridge)
+ pipeline = subject
expect(pipeline.variables.first)
.to have_attributes(key: 'BRIDGE', value: 'var')
@@ -596,7 +616,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not pass pipeline variables directly downstream' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.variables.map(&:key).tap do |variables|
expect(variables).not_to include 'PIPELINE_VARIABLE'
@@ -609,7 +629,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'makes it possible to pass pipeline variable downstream' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.variables.find_by(key: 'BRIDGE').tap do |variable|
expect(variable.value).to eq 'my-value-var'
@@ -622,12 +642,12 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not create a new pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.not_to change { Ci::Pipeline.count }
end
it 'ignores variables passed downstream from the bridge' do
- pipeline = service.execute(bridge)
+ pipeline = subject
pipeline.variables.map(&:key).tap do |variables|
expect(variables).not_to include 'BRIDGE'
@@ -635,7 +655,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'sets errors', :aggregate_failures do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq('downstream_pipeline_creation_failed')
@@ -679,7 +699,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
context 'that include the bridge job' do
it 'creates the downstream pipeline' do
- expect { service.execute(bridge) }
+ expect { subject }
.to change(downstream_project.ci_pipelines, :count).by(1)
end
end
@@ -692,7 +712,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'changes status of the bridge build' do
- service.execute(bridge)
+ subject
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq 'insufficient_bridge_permissions'
@@ -710,7 +730,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not create a pipeline and drops the bridge' do
- expect { service.execute(bridge) }.not_to change(downstream_project.ci_pipelines, :count)
+ expect { subject }.not_to change(downstream_project.ci_pipelines, :count)
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq('downstream_pipeline_creation_failed')
@@ -733,7 +753,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'does not create a pipeline and drops the bridge' do
- expect { service.execute(bridge) }.not_to change(downstream_project.ci_pipelines, :count)
+ expect { subject }.not_to change(downstream_project.ci_pipelines, :count)
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq('downstream_pipeline_creation_failed')
@@ -755,7 +775,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates the pipeline but drops the bridge' do
- expect { service.execute(bridge) }.to change(downstream_project.ci_pipelines, :count).by(1)
+ expect { subject }.to change(downstream_project.ci_pipelines, :count).by(1)
expect(bridge.reload).to be_failed
expect(bridge.failure_reason).to eq('downstream_pipeline_creation_failed')
@@ -787,7 +807,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
end
it 'creates the pipeline' do
- expect { service.execute(bridge) }.to change(downstream_project.ci_pipelines, :count).by(1)
+ expect { subject }.to change(downstream_project.ci_pipelines, :count).by(1)
expect(bridge.reload).to be_success
end
@@ -795,7 +815,7 @@ RSpec.describe Ci::CreateDownstreamPipelineService, '#execute' do
context 'when not passing the required variable' do
it 'does not create the pipeline' do
- expect { service.execute(bridge) }.not_to change(downstream_project.ci_pipelines, :count)
+ expect { subject }.not_to change(downstream_project.ci_pipelines, :count)
end
end
end
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 943d70ba142..c39a76ad2fc 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -466,7 +466,7 @@ RSpec.describe Ci::CreatePipelineService do
it 'pull it from Auto-DevOps' do
pipeline = execute_service.payload
expect(pipeline).to be_auto_devops_source
- expect(pipeline.builds.map(&:name)).to match_array(%w[brakeman-sast build code_quality eslint-sast secret_detection semgrep-sast test])
+ expect(pipeline.builds.map(&:name)).to match_array(%w[brakeman-sast build code_quality container_scanning eslint-sast secret_detection semgrep-sast test])
end
end
diff --git a/spec/services/ci/generate_kubeconfig_service_spec.rb b/spec/services/ci/generate_kubeconfig_service_spec.rb
index b0673d16158..e3088ca6ea7 100644
--- a/spec/services/ci/generate_kubeconfig_service_spec.rb
+++ b/spec/services/ci/generate_kubeconfig_service_spec.rb
@@ -6,16 +6,17 @@ RSpec.describe Ci::GenerateKubeconfigService do
describe '#execute' do
let(:project) { create(:project) }
let(:build) { create(:ci_build, project: project) }
+ let(:pipeline) { build.pipeline }
let(:agent1) { create(:cluster_agent, project: project) }
let(:agent2) { create(:cluster_agent) }
let(:template) { instance_double(Gitlab::Kubernetes::Kubeconfig::Template) }
- subject { described_class.new(build).execute }
+ subject { described_class.new(pipeline, token: build.token).execute }
before do
expect(Gitlab::Kubernetes::Kubeconfig::Template).to receive(:new).and_return(template)
- expect(build.pipeline).to receive(:authorized_cluster_agents).and_return([agent1, agent2])
+ expect(pipeline).to receive(:authorized_cluster_agents).and_return([agent1, agent2])
end
it 'adds a cluster, and a user and context for each available agent' do
diff --git a/spec/services/ci/job_artifacts/create_service_spec.rb b/spec/services/ci/job_artifacts/create_service_spec.rb
index b8487e438a9..01f240805f5 100644
--- a/spec/services/ci/job_artifacts/create_service_spec.rb
+++ b/spec/services/ci/job_artifacts/create_service_spec.rb
@@ -42,6 +42,13 @@ RSpec.describe Ci::JobArtifacts::CreateService do
subject { service.execute(artifacts_file, params, metadata_file: metadata_file) }
context 'when artifacts file is uploaded' do
+ it 'returns artifact in the response' do
+ response = subject
+ new_artifact = job.job_artifacts.last
+
+ expect(response[:artifact]).to eq(new_artifact)
+ end
+
it 'saves artifact for the given type' do
expect { subject }.to change { Ci::JobArtifact.count }.by(1)
@@ -84,7 +91,7 @@ RSpec.describe Ci::JobArtifacts::CreateService do
it 'sets expiration date according to application settings' do
expected_expire_at = 1.day.from_now
- expect(subject).to match(a_hash_including(status: :success))
+ expect(subject).to match(a_hash_including(status: :success, artifact: anything))
archive_artifact, metadata_artifact = job.job_artifacts.last(2)
expect(job.artifacts_expire_at).to be_within(1.minute).of(expected_expire_at)
@@ -100,7 +107,7 @@ RSpec.describe Ci::JobArtifacts::CreateService do
it 'sets expiration date according to the parameter' do
expected_expire_at = 2.hours.from_now
- expect(subject).to match(a_hash_including(status: :success))
+ expect(subject).to match(a_hash_including(status: :success, artifact: anything))
archive_artifact, metadata_artifact = job.job_artifacts.last(2)
expect(job.artifacts_expire_at).to be_within(1.minute).of(expected_expire_at)
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 b48ea70aa4c..98b01e2b303 100644
--- a/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
+++ b/spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe ::Ci::PipelineArtifacts::CoverageReportService do
context 'when pipeline artifact has already been created' do
it 'do not raise an error and do not persist the same artifact twice' do
- expect { 2.times { described_class.new.execute(pipeline) } }.not_to raise_error(ActiveRecord::RecordNotUnique)
+ expect { 2.times { described_class.new.execute(pipeline) } }.not_to raise_error
expect(Ci::PipelineArtifact.count).to eq(1)
end
diff --git a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
index 2aa810e8ea1..ab4ba20e716 100644
--- a/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
+++ b/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb
@@ -16,5 +16,11 @@ RSpec.describe Ci::PipelineCreation::StartPipelineService do
service.execute
end
+
+ it 'creates pipeline ref' do
+ expect(pipeline.persistent_ref).to receive(:create).once
+
+ service.execute
+ end
end
end
diff --git a/spec/services/ci/pipeline_trigger_service_spec.rb b/spec/services/ci/pipeline_trigger_service_spec.rb
index 29d12b0dd0e..a794dedc658 100644
--- a/spec/services/ci/pipeline_trigger_service_spec.rb
+++ b/spec/services/ci/pipeline_trigger_service_spec.rb
@@ -187,6 +187,14 @@ RSpec.describe Ci::PipelineTriggerService do
expect(result[:status]).to eq(:success)
end
+ it_behaves_like 'logs downstream pipeline creation' do
+ subject { result[:pipeline] }
+
+ let(:expected_root_pipeline) { pipeline }
+ let(:expected_hierarchy_size) { 2 }
+ let(:expected_downstream_relationship) { :multi_project }
+ end
+
context 'when commit message has [ci skip]' do
before do
allow_next_instance_of(Ci::Pipeline) do |instance|
diff --git a/spec/services/ci/retry_job_service_spec.rb b/spec/services/ci/retry_job_service_spec.rb
index 25aab73ab01..acc7a99637b 100644
--- a/spec/services/ci/retry_job_service_spec.rb
+++ b/spec/services/ci/retry_job_service_spec.rb
@@ -17,396 +17,276 @@ RSpec.describe Ci::RetryJobService do
name: 'test')
end
- let_it_be_with_refind(:build) { create(:ci_build, :success, pipeline: pipeline, stage_id: stage.id) }
-
let(:user) { developer }
- let(:service) do
- described_class.new(project, user)
- end
+ let(:service) { described_class.new(project, user) }
before_all do
project.add_developer(developer)
project.add_reporter(reporter)
end
- clone_accessors = ::Ci::Build.clone_accessors.without(::Ci::Build.extra_accessors)
-
- reject_accessors =
- %i[id status user token 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
- job_artifacts_metadata job_artifacts_trace job_artifacts_junit
- job_artifacts_sast job_artifacts_secret_detection job_artifacts_dependency_scanning
- job_artifacts_container_scanning job_artifacts_cluster_image_scanning job_artifacts_dast
- job_artifacts_license_scanning
- job_artifacts_performance job_artifacts_browser_performance job_artifacts_load_performance
- job_artifacts_lsif job_artifacts_terraform job_artifacts_cluster_applications
- job_artifacts_codequality job_artifacts_metrics scheduled_at
- job_variables waiting_for_resource_at job_artifacts_metrics_referee
- job_artifacts_network_referee job_artifacts_dotenv
- job_artifacts_cobertura needs job_artifacts_accessibility
- job_artifacts_requirements job_artifacts_coverage_fuzzing
- job_artifacts_api_fuzzing terraform_state_versions].freeze
-
- ignore_accessors =
- %i[type lock_version target_url base_tags trace_sections
- commit_id deployment erased_by_id project_id
- runner_id tag_taggings taggings tags trigger_request_id
- user_id auto_canceled_by_id retried failure_reason
- sourced_pipelines artifacts_file_store artifacts_metadata_store
- metadata runner_session trace_chunks upstream_pipeline_id
- artifacts_file artifacts_metadata artifacts_size commands
- resource resource_group_id processed security_scans author
- pipeline_id report_results pending_state pages_deployments
- queuing_entry runtime_metadata trace_metadata
- dast_site_profile dast_scanner_profile].freeze
-
- shared_examples 'build duplication' do
- let_it_be(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
+ shared_context 'retryable bridge' do
+ let_it_be(:downstream_project) { create(:project, :repository) }
- let_it_be(:build) do
- create(:ci_build, :failed, :picked, :expired, :erased, :queued, :coverage, :tags,
- :allowed_to_fail, :on_tag, :triggered, :teardown_environment, :resource_group,
- description: 'my-job', stage: 'test', stage_id: stage.id,
- pipeline: pipeline, auto_canceled_by: another_pipeline,
- scheduled_at: 10.seconds.since)
+ let_it_be_with_refind(:job) do
+ create(
+ :ci_bridge, :success, pipeline: pipeline, downstream: downstream_project,
+ description: 'a trigger job', stage_id: stage.id
+ )
end
- let_it_be(:internal_job_variable) { create(:ci_job_variable, job: build) }
+ let_it_be(:job_to_clone) { job }
- before_all do
- # Make sure that build has both `stage_id` and `stage` because FactoryBot
- # can reset one of the fields when assigning another. We plan to deprecate
- # and remove legacy `stage` column in the future.
- build.update!(stage: 'test', stage_id: stage.id)
-
- # Make sure we have one instance for every possible job_artifact_X
- # associations to check they are correctly rejected on build duplication.
- Ci::JobArtifact::TYPE_AND_FORMAT_PAIRS.each do |file_type, file_format|
- create(:ci_job_artifact, file_format,
- file_type: file_type, job: build, expire_at: build.artifacts_expire_at)
- end
+ before do
+ job.update!(retried: false)
+ end
+ end
+
+ shared_context 'retryable build' do
+ let_it_be_with_refind(:job) { create(:ci_build, :success, pipeline: pipeline, stage_id: stage.id) }
+ let_it_be(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
- create(:ci_job_variable, :dotenv_source, job: build)
- create(:ci_build_need, build: build)
- create(:terraform_state_version, build: build)
+ let_it_be(:job_to_clone) do
+ create(:ci_build, :failed, :picked, :expired, :erased, :queued, :coverage, :tags,
+ :allowed_to_fail, :on_tag, :triggered, :teardown_environment, :resource_group,
+ description: 'my-job', stage: 'test', stage_id: stage.id,
+ pipeline: pipeline, auto_canceled_by: another_pipeline,
+ scheduled_at: 10.seconds.since)
end
before do
- build.update!(retried: false, status: :success)
+ job.update!(retried: false, status: :success)
+ job_to_clone.update!(retried: false, status: :success)
end
+ end
- describe 'clone accessors' do
- let(:forbidden_associations) do
- Ci::Build.reflect_on_all_associations.each_with_object(Set.new) do |assoc, memo|
- memo << assoc.name unless assoc.macro == :belongs_to
- end
- end
+ shared_examples_for 'clones the job' do
+ let(:job) { job_to_clone }
- clone_accessors.each do |attribute|
- it "clones #{attribute} build attribute", :aggregate_failures do
- expect(attribute).not_to be_in(forbidden_associations), "association #{attribute} must be `belongs_to`"
- expect(build.send(attribute)).not_to be_nil
- expect(new_build.send(attribute)).not_to be_nil
- expect(new_build.send(attribute)).to eq build.send(attribute)
- end
+ before_all do
+ # Make sure that job has both `stage_id` and `stage`
+ job_to_clone.update!(stage: 'test', stage_id: stage.id)
+
+ create(:ci_build_need, build: job_to_clone)
+ end
+
+ context 'when the user has ability to execute job' do
+ before do
+ stub_not_protect_default_branch
end
- context 'when job has nullified protected' do
- before do
- build.update_attribute(:protected, nil)
- end
+ context 'when there is a failed job ToDo for the MR' do
+ let!(:merge_request) { create(:merge_request, source_project: project, author: user, head_pipeline: pipeline) }
+ let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: user, target: merge_request) }
- it "clones protected build attribute" do
- expect(new_build.protected).to be_nil
- expect(new_build.protected).to eq build.protected
+ it 'resolves the ToDo for the failed job' do
+ expect do
+ service.execute(job)
+ end.to change { todo.reload.state }.from('pending').to('done')
end
end
- it 'clones only the needs attributes' do
- expect(new_build.needs.exists?).to be_truthy
- expect(build.needs.exists?).to be_truthy
+ context 'when the job has needs' do
+ before do
+ create(:ci_build_need, build: job, name: 'build1')
+ create(:ci_build_need, build: job, name: 'build2')
+ end
- expect(new_build.needs_attributes).to match(build.needs_attributes)
- expect(new_build.needs).not_to match(build.needs)
- end
+ it 'bulk inserts all the needs' do
+ expect(Ci::BuildNeed).to receive(:bulk_insert!).and_call_original
- it 'clones only internal job variables' do
- expect(new_build.job_variables.count).to eq(1)
- expect(new_build.job_variables).to contain_exactly(having_attributes(key: internal_job_variable.key, value: internal_job_variable.value))
+ new_job
+ end
end
- end
- describe 'reject accessors' do
- reject_accessors.each do |attribute|
- it "does not clone #{attribute} build attribute" do
- expect(new_build.send(attribute)).not_to eq build.send(attribute)
- end
+ it 'marks the old job as retried' do
+ expect(new_job).to be_latest
+ expect(job).to be_retried
+ expect(job).to be_processed
end
end
- it 'has correct number of known attributes', :aggregate_failures do
- processed_accessors = clone_accessors + reject_accessors
- known_accessors = processed_accessors + ignore_accessors
-
- # :tag_list is a special case, this accessor does not exist
- # in reflected associations, comes from `act_as_taggable` and
- # we use it to copy tags, instead of reusing tags.
- #
- current_accessors =
- Ci::Build.attribute_names.map(&:to_sym) +
- Ci::Build.attribute_aliases.keys.map(&:to_sym) +
- Ci::Build.reflect_on_all_associations.map(&:name) +
- [:tag_list, :needs_attributes, :job_variables_attributes] -
- # ee-specific accessors should be tested in ee/spec/services/ci/retry_job_service_spec.rb instead
- Ci::Build.extra_accessors -
- [:dast_site_profiles_build, :dast_scanner_profiles_build] # join tables
-
- current_accessors.uniq!
-
- expect(current_accessors).to include(*processed_accessors)
- expect(known_accessors).to include(*current_accessors)
- end
- end
+ context 'when the user does not have permission to execute the job' do
+ let(:user) { reporter }
- describe '#execute' do
- let(:new_build) do
- travel_to(1.second.from_now) do
- service.execute(build)[:job]
+ it 'raises an error' do
+ expect { service.execute(job) }
+ .to raise_error Gitlab::Access::AccessDeniedError
end
end
+ end
- context 'when user has ability to execute build' do
- before do
- stub_not_protect_default_branch
- end
-
- it_behaves_like 'build duplication'
+ shared_examples_for 'retries the job' do
+ it_behaves_like 'clones the job'
- it 'creates a new build that represents the old one' do
- expect(new_build.name).to eq build.name
- end
+ it 'enqueues the new job' do
+ expect(new_job).to be_pending
+ end
- it 'enqueues the new build' do
- expect(new_build).to be_pending
+ context 'when there are subsequent processables that are skipped' do
+ let!(:subsequent_build) do
+ create(:ci_build, :skipped, stage_idx: 2,
+ pipeline: pipeline,
+ stage: 'deploy')
end
- context 'when there are subsequent processables that are skipped' do
- let!(:subsequent_build) do
- create(:ci_build, :skipped, stage_idx: 2,
+ let!(:subsequent_bridge) do
+ create(:ci_bridge, :skipped, stage_idx: 2,
pipeline: pipeline,
stage: 'deploy')
- end
-
- let!(:subsequent_bridge) do
- create(:ci_bridge, :skipped, stage_idx: 2,
- pipeline: pipeline,
- stage: 'deploy')
- end
-
- it 'resumes pipeline processing in the subsequent stage' do
- service.execute(build)
-
- expect(subsequent_build.reload).to be_created
- expect(subsequent_bridge.reload).to be_created
- end
-
- it 'updates ownership for subsequent builds' do
- expect { service.execute(build) }.to change { subsequent_build.reload.user }.to(user)
- end
-
- it 'updates ownership for subsequent bridges' do
- expect { service.execute(build) }.to change { subsequent_bridge.reload.user }.to(user)
- end
-
- it 'does not cause n+1 when updaing build ownership' do
- control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { service.execute(build) }.count
+ end
- create_list(:ci_build, 2, :skipped, stage_idx: build.stage_idx + 1, pipeline: pipeline, stage: 'deploy')
+ it 'resumes pipeline processing in the subsequent stage' do
+ service.execute(job)
- expect { service.execute(build) }.not_to exceed_all_query_limit(control_count)
- end
+ expect(subsequent_build.reload).to be_created
+ expect(subsequent_bridge.reload).to be_created
end
- context 'when pipeline has other builds' do
- let!(:stage2) { create(:ci_stage_entity, 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) }
-
- context 'when build has nil scheduling_type' do
- before do
- build.pipeline.processables.update_all(scheduling_type: nil)
- build.reload
- end
-
- it 'populates scheduling_type of processables' do
- expect(new_build.scheduling_type).to eq('stage')
- expect(build.reload.scheduling_type).to eq('stage')
- expect(build2.reload.scheduling_type).to eq('stage')
- expect(deploy.reload.scheduling_type).to eq('dag')
- end
- end
-
- context 'when build has scheduling_type' do
- it 'does not call populate_scheduling_type!' do
- expect_any_instance_of(Ci::Pipeline).not_to receive(:ensure_scheduling_type!) # rubocop: disable RSpec/AnyInstanceOf
+ it 'updates ownership for subsequent builds' do
+ expect { service.execute(job) }.to change { subsequent_build.reload.user }.to(user)
+ end
- expect(new_build.scheduling_type).to eq('stage')
- end
- end
+ it 'updates ownership for subsequent bridges' do
+ expect { service.execute(job) }.to change { subsequent_bridge.reload.user }.to(user)
end
+ end
- context 'when the pipeline is a child pipeline and the bridge is depended' do
- let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
- let!(:bridge) { create(:ci_bridge, :strategy_depend, pipeline: parent_pipeline, status: 'success') }
- let!(:source_pipeline) { create(:ci_sources_pipeline, pipeline: pipeline, source_job: bridge) }
+ context 'when the pipeline has other jobs' do
+ let!(:stage2) { create(:ci_stage_entity, 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) }
- it 'marks source bridge as pending' do
- service.execute(build)
+ context 'when job has a nil scheduling_type' do
+ before do
+ job.pipeline.processables.update_all(scheduling_type: nil)
+ job.reload
+ end
- expect(bridge.reload).to be_pending
+ it 'populates scheduling_type of processables' do
+ expect(new_job.scheduling_type).to eq('stage')
+ expect(job.reload.scheduling_type).to eq('stage')
+ expect(build2.reload.scheduling_type).to eq('stage')
+ expect(deploy.reload.scheduling_type).to eq('dag')
end
end
- context 'when there is a failed job todo for the MR' do
- let!(:merge_request) { create(:merge_request, source_project: project, author: user, head_pipeline: pipeline) }
- let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: user, target: merge_request) }
+ context 'when job has scheduling_type' do
+ it 'does not call populate_scheduling_type!' do
+ expect(job.pipeline).not_to receive(:ensure_scheduling_type!)
- it 'resolves the todo for the old failed build' do
- expect do
- service.execute(build)
- end.to change { todo.reload.state }.from('pending').to('done')
+ expect(new_job.scheduling_type).to eq('stage')
end
end
end
- context 'when user does not have ability to execute build' do
- let(:user) { reporter }
+ context 'when the pipeline is a child pipeline and the bridge uses strategy:depend' do
+ let!(:parent_pipeline) { create(:ci_pipeline, project: project) }
+ let!(:bridge) { create(:ci_bridge, :strategy_depend, pipeline: parent_pipeline, status: 'success') }
+ let!(:source_pipeline) { create(:ci_sources_pipeline, pipeline: pipeline, source_job: bridge) }
- it 'raises an error' do
- expect { service.execute(build) }
- .to raise_error Gitlab::Access::AccessDeniedError
- end
-
- context 'when the job is not retryable' do
- let(:build) { create(:ci_build, :created, pipeline: pipeline) }
+ it 'marks the source bridge as pending' do
+ service.execute(job)
- it 'returns a ServiceResponse error' do
- response = service.execute(build)
-
- expect(response).to be_a(ServiceResponse)
- expect(response).to be_error
- expect(response.message).to eq("Job cannot be retried")
- end
+ expect(bridge.reload).to be_pending
end
end
end
describe '#clone!' do
- let(:new_build) do
- travel_to(1.second.from_now) do
- service.clone!(build)
- end
- end
+ let(:new_job) { service.clone!(job) }
it 'raises an error when an unexpected class is passed' do
expect { service.clone!(create(:ci_build).present) }.to raise_error(TypeError)
end
- context 'when user has ability to execute build' do
- before do
- stub_not_protect_default_branch
- end
+ context 'when the job to be cloned is a bridge' do
+ include_context 'retryable bridge'
- it_behaves_like 'build duplication'
+ it_behaves_like 'clones the job'
+ end
- it 'creates a new build that represents the old one' do
- expect(new_build.name).to eq build.name
- end
+ context 'when the job to be cloned is a build' do
+ include_context 'retryable build'
- it 'does not enqueue the new build' do
- expect(new_build).to be_created
- expect(new_build).not_to be_processed
- end
+ let(:job) { job_to_clone }
- it 'does mark old build as retried' do
- expect(new_build).to be_latest
- expect(build).to be_retried
- expect(build).to be_processed
- end
+ it_behaves_like 'clones the job'
- shared_examples_for 'when build with deployment is retried' do
- let!(:build) do
+ context 'when a build with a deployment is retried' do
+ let!(:job) do
create(:ci_build, :with_deployment, :deploy_to_production,
- pipeline: pipeline, stage_id: stage.id, project: project)
+ pipeline: pipeline, stage_id: stage.id, project: project)
end
it 'creates a new deployment' do
- expect { new_build }.to change { Deployment.count }.by(1)
- end
-
- it 'persists expanded environment name' do
- expect(new_build.metadata.expanded_environment_name).to eq('production')
+ expect { new_job }.to change { Deployment.count }.by(1)
end
it 'does not create a new environment' do
- expect { new_build }.not_to change { Environment.count }
+ expect { new_job }.not_to change { Environment.count }
end
end
- shared_examples_for 'when build with dynamic environment is retried' do
+ context 'when a build with a dynamic environment is retried' do
let_it_be(:other_developer) { create(:user).tap { |u| project.add_developer(u) } }
let(:environment_name) { 'review/$CI_COMMIT_REF_SLUG-$GITLAB_USER_ID' }
- let!(:build) do
+ let!(:job) do
create(:ci_build, :with_deployment, environment: environment_name,
options: { environment: { name: environment_name } },
pipeline: pipeline, stage_id: stage.id, project: project,
user: other_developer)
end
- it 're-uses the previous persisted environment' do
- expect(build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
-
- expect(new_build.persisted_environment.name).to eq("review/#{build.ref}-#{other_developer.id}")
- end
-
it 'creates a new deployment' do
- expect { new_build }.to change { Deployment.count }.by(1)
+ expect { new_job }.to change { Deployment.count }.by(1)
end
it 'does not create a new environment' do
- expect { new_build }.not_to change { Environment.count }
+ expect { new_job }.not_to change { Environment.count }
end
end
+ end
+ end
+
+ describe '#execute' do
+ let(:new_job) { service.execute(job)[:job] }
- it_behaves_like 'when build with deployment is retried'
- it_behaves_like 'when build with dynamic environment is retried'
+ context 'when the job to be retried is a bridge' do
+ include_context 'retryable bridge'
- context 'when build has needs' do
- before do
- create(:ci_build_need, build: build, name: 'build1')
- create(:ci_build_need, build: build, name: 'build2')
- end
+ it_behaves_like 'retries the job'
+ end
- it 'bulk inserts all needs' do
- expect(Ci::BuildNeed).to receive(:bulk_insert!).and_call_original
+ context 'when the job to be retried is a build' do
+ include_context 'retryable build'
+
+ it_behaves_like 'retries the job'
- new_build
+ context 'when there are subsequent jobs that are skipped' do
+ let!(:subsequent_build) do
+ create(:ci_build, :skipped, stage_idx: 2,
+ pipeline: pipeline,
+ stage: 'deploy')
end
- end
- end
- context 'when user does not have ability to execute build' do
- let(:user) { reporter }
+ let!(:subsequent_bridge) do
+ create(:ci_bridge, :skipped, stage_idx: 2,
+ pipeline: pipeline,
+ stage: 'deploy')
+ end
- it 'raises an error' do
- expect { service.clone!(build) }
- .to raise_error Gitlab::Access::AccessDeniedError
+ it 'does not cause an N+1 when updating the job ownership' do
+ control_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { service.execute(job) }.count
+
+ create_list(:ci_build, 2, :skipped, stage_idx: job.stage_idx + 1, pipeline: pipeline, stage: 'deploy')
+
+ expect { service.execute(job) }.not_to exceed_all_query_limit(control_count)
+ end
end
end
end
diff --git a/spec/services/clusters/agents/delete_service_spec.rb b/spec/services/clusters/agents/delete_service_spec.rb
index 1d6bc9618dd..abe1bdaab27 100644
--- a/spec/services/clusters/agents/delete_service_spec.rb
+++ b/spec/services/clusters/agents/delete_service_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe Clusters::Agents::DeleteService do
expect(response.status).to eq(:error)
expect(response.message).to eq('You have insufficient permissions to delete this cluster agent')
- expect { cluster_agent.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ expect { cluster_agent.reload }.not_to raise_error
end
end
diff --git a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
index 98963f57341..90956e7b4ea 100644
--- a/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb
@@ -39,8 +39,6 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateNamespaceService, '#execute'
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
- stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
- stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_get_secret(
api_url,
diff --git a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
index 11045dfe950..a4f018aec0c 100644
--- a/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
+++ b/spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb
@@ -147,8 +147,6 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_KNATIVE_SERVING_ROLE_BINDING_NAME, namespace: namespace)
stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_NAME, namespace: namespace)
stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CROSSPLANE_DATABASE_ROLE_BINDING_NAME, namespace: namespace)
- stub_kubeclient_put_role(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME, namespace: namespace)
- stub_kubeclient_put_role_binding(api_url, Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME, namespace: namespace)
end
it 'creates a namespace object' do
@@ -245,47 +243,6 @@ RSpec.describe Clusters::Kubernetes::CreateOrUpdateServiceAccountService do
)
)
end
-
- it 'creates a role granting cilium permissions to the service account' do
- subject
-
- expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/roles/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME}").with(
- body: hash_including(
- metadata: {
- name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME,
- namespace: namespace
- },
- rules: [{
- apiGroups: %w(cilium.io),
- resources: %w(ciliumnetworkpolicies),
- verbs: %w(get list create update patch)
- }]
- )
- )
- end
-
- it 'creates a role binding granting cilium permissions to the service account' do
- subject
-
- expect(WebMock).to have_requested(:put, api_url + "/apis/rbac.authorization.k8s.io/v1/namespaces/#{namespace}/rolebindings/#{Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME}").with(
- body: hash_including(
- metadata: {
- name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_BINDING_NAME,
- namespace: namespace
- },
- roleRef: {
- apiGroup: 'rbac.authorization.k8s.io',
- kind: 'Role',
- name: Clusters::Kubernetes::GITLAB_CILIUM_ROLE_NAME
- },
- subjects: [{
- kind: 'ServiceAccount',
- name: service_account_name,
- namespace: namespace
- }]
- )
- )
- end
end
end
end
diff --git a/spec/services/container_expiration_policies/cleanup_service_spec.rb b/spec/services/container_expiration_policies/cleanup_service_spec.rb
index a1f76e5e5dd..c265ce74d14 100644
--- a/spec/services/container_expiration_policies/cleanup_service_spec.rb
+++ b/spec/services/container_expiration_policies/cleanup_service_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
it 'completely clean up the repository' do
expect(Projects::ContainerRepository::CleanupTagsService)
.to receive(:new).with(repository, nil, cleanup_tags_service_params).and_return(cleanup_tags_service)
- expect(cleanup_tags_service).to receive(:execute).and_return(status: :success)
+ expect(cleanup_tags_service).to receive(:execute).and_return(status: :success, deleted_size: 1)
response = subject
@@ -36,6 +36,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
expect(repository.reload.cleanup_unscheduled?).to be_truthy
expect(repository.expiration_policy_completed_at).not_to eq(nil)
expect(repository.expiration_policy_started_at).not_to eq(nil)
+ expect(repository.last_cleanup_deleted_tags_count).to eq(1)
end
end
end
@@ -58,6 +59,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
expect(repository.reload.cleanup_unfinished?).to be_truthy
expect(repository.expiration_policy_started_at).not_to eq(nil)
expect(repository.expiration_policy_completed_at).to eq(nil)
+ expect(repository.last_cleanup_deleted_tags_count).to eq(nil)
end
end
@@ -94,6 +96,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
expect(repository.reload.cleanup_unfinished?).to be_truthy
expect(repository.expiration_policy_started_at).not_to eq(nil)
expect(repository.expiration_policy_completed_at).to eq(nil)
+ expect(repository.last_cleanup_deleted_tags_count).to eq(nil)
end
end
end
@@ -138,6 +141,7 @@ RSpec.describe ContainerExpirationPolicies::CleanupService do
expect(repository.reload.cleanup_unfinished?).to be_truthy
expect(repository.expiration_policy_started_at).not_to eq(nil)
expect(repository.expiration_policy_completed_at).to eq(nil)
+ expect(repository.last_cleanup_deleted_tags_count).to eq(nil)
end
end
diff --git a/spec/services/container_expiration_policies/update_service_spec.rb b/spec/services/container_expiration_policies/update_service_spec.rb
index d4b6715ae86..7d949b77de7 100644
--- a/spec/services/container_expiration_policies/update_service_spec.rb
+++ b/spec/services/container_expiration_policies/update_service_spec.rb
@@ -63,7 +63,7 @@ RSpec.describe ContainerExpirationPolicies::UpdateService do
context 'with existing container expiration policy' do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the container expiration policy'
- :developer | 'updating the container expiration policy'
+ :developer | 'denying access to container expiration policy'
:reporter | 'denying access to container expiration policy'
:guest | 'denying access to container expiration policy'
:anonymous | 'denying access to container expiration policy'
@@ -83,7 +83,7 @@ RSpec.describe ContainerExpirationPolicies::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the container expiration policy'
- :developer | 'creating the container expiration policy'
+ :developer | 'denying access to container expiration policy'
:reporter | 'denying access to container expiration policy'
:guest | 'denying access to container expiration policy'
:anonymous | 'denying access to container expiration policy'
diff --git a/spec/services/container_expiration_policy_service_spec.rb b/spec/services/container_expiration_policy_service_spec.rb
deleted file mode 100644
index 41dd890dd35..00000000000
--- a/spec/services/container_expiration_policy_service_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ContainerExpirationPolicyService do
- let_it_be(:user) { create(:user) }
- let_it_be(:container_expiration_policy) { create(:container_expiration_policy, :runnable) }
-
- let(:project) { container_expiration_policy.project }
- let(:container_repository) { create(:container_repository, project: project) }
-
- before do
- project.add_maintainer(user)
- end
-
- describe '#execute' do
- subject { described_class.new(project, user).execute(container_expiration_policy) }
-
- it 'kicks off a cleanup worker for the container repository' do
- expect(CleanupContainerRepositoryWorker).to receive(:perform_async)
- .with(nil, container_repository.id, hash_including(container_expiration_policy: true))
-
- subject
- end
-
- it 'sets next_run_at on the container_expiration_policy' do
- subject
-
- expect(container_expiration_policy.next_run_at).to be > Time.zone.now
- end
- end
-end
diff --git a/spec/services/customer_relations/contacts/create_service_spec.rb b/spec/services/customer_relations/contacts/create_service_spec.rb
index 567e1c91e78..db6cce799fe 100644
--- a/spec/services/customer_relations/contacts/create_service_spec.rb
+++ b/spec/services/customer_relations/contacts/create_service_spec.rb
@@ -20,7 +20,7 @@ RSpec.describe CustomerRelations::Contacts::CreateService do
it 'returns an error' do
expect(response).to be_error
- expect(response.message).to match_array(['You have insufficient permissions to create a contact for this group'])
+ expect(response.message).to match_array(['You have insufficient permissions to manage contacts for this group'])
end
end
diff --git a/spec/services/customer_relations/contacts/update_service_spec.rb b/spec/services/customer_relations/contacts/update_service_spec.rb
index 253bbc23226..729fdc2058b 100644
--- a/spec/services/customer_relations/contacts/update_service_spec.rb
+++ b/spec/services/customer_relations/contacts/update_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe CustomerRelations::Contacts::UpdateService do
let_it_be(:user) { create(:user) }
- let(:contact) { create(:contact, first_name: 'Mark', group: group) }
+ let(:contact) { create(:contact, first_name: 'Mark', group: group, state: 'active') }
subject(:update) { described_class.new(group: group, current_user: user, params: params).execute(contact) }
@@ -19,7 +19,7 @@ RSpec.describe CustomerRelations::Contacts::UpdateService do
response = update
expect(response).to be_error
- expect(response.message).to match_array(['You have insufficient permissions to update a contact for this group'])
+ expect(response.message).to match_array(['You have insufficient permissions to manage contacts for this group'])
end
end
@@ -41,6 +41,29 @@ RSpec.describe CustomerRelations::Contacts::UpdateService do
end
end
+ context 'when activating' do
+ let(:contact) { create(:contact, state: 'inactive') }
+ let(:params) { { active: true } }
+
+ it 'updates the contact' do
+ response = update
+
+ expect(response).to be_success
+ expect(response.payload.active?).to be_truthy
+ end
+ end
+
+ context 'when deactivating' do
+ let(:params) { { active: false } }
+
+ it 'updates the contact' do
+ response = update
+
+ expect(response).to be_success
+ expect(response.payload.active?).to be_falsy
+ end
+ end
+
context 'when the contact is invalid' do
let(:params) { { first_name: nil } }
diff --git a/spec/services/customer_relations/organizations/update_service_spec.rb b/spec/services/customer_relations/organizations/update_service_spec.rb
index 8461c98ef0e..4764ba85551 100644
--- a/spec/services/customer_relations/organizations/update_service_spec.rb
+++ b/spec/services/customer_relations/organizations/update_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe CustomerRelations::Organizations::UpdateService do
let_it_be(:user) { create(:user) }
- let(:organization) { create(:organization, name: 'Test', group: group) }
+ let(:organization) { create(:organization, name: 'Test', group: group, state: 'active') }
subject(:update) { described_class.new(group: group, current_user: user, params: params).execute(organization) }
@@ -41,6 +41,29 @@ RSpec.describe CustomerRelations::Organizations::UpdateService do
end
end
+ context 'when activating' do
+ let(:organization) { create(:organization, state: 'inactive') }
+ let(:params) { { active: true } }
+
+ it 'updates the contact' do
+ response = update
+
+ expect(response).to be_success
+ expect(response.payload.active?).to be_truthy
+ end
+ end
+
+ context 'when deactivating' do
+ let(:params) { { active: false } }
+
+ it 'updates the organization' do
+ response = update
+
+ expect(response).to be_success
+ expect(response.payload.active?).to be_falsy
+ end
+ end
+
context 'when the organization is invalid' do
let(:params) { { name: nil } }
diff --git a/spec/services/database/consistency_fix_service_spec.rb b/spec/services/database/consistency_fix_service_spec.rb
new file mode 100644
index 00000000000..9a0fac2191c
--- /dev/null
+++ b/spec/services/database/consistency_fix_service_spec.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Database::ConsistencyFixService do
+ describe '#execute' do
+ context 'fixing namespaces inconsistencies' do
+ subject(:consistency_fix_service) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ sync_event_class: Namespaces::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :namespace_id
+ )
+ end
+
+ let(:table) { 'public.namespaces' }
+ let!(:namespace) { create(:namespace) }
+ let!(:namespace_mirror) { Ci::NamespaceMirror.find_by(namespace_id: namespace.id) }
+
+ context 'when both objects exist' do
+ it 'creates a Namespaces::SyncEvent to modify the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [namespace.id])
+ end.to change {
+ Namespaces::SyncEvent.where(namespace_id: namespace.id).count
+ }.by(1)
+ end
+
+ it 'enqueues the worker to process the Namespaces::SyncEvents' do
+ expect(::Namespaces::ProcessSyncEventsWorker).to receive(:perform_async)
+ consistency_fix_service.execute(ids: [namespace.id])
+ end
+ end
+
+ context 'when the source object has been deleted, but not the target' do
+ before do
+ namespace.delete
+ end
+
+ it 'deletes the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [namespace.id])
+ end.to change { Ci::NamespaceMirror.where(namespace_id: namespace.id).count }.by(-1)
+ end
+ end
+ end
+
+ context 'fixing projects inconsistencies' do
+ subject(:consistency_fix_service) do
+ described_class.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ let(:table) { 'public.projects' }
+ let!(:project) { create(:project) }
+ let!(:project_mirror) { Ci::ProjectMirror.find_by(project_id: project.id) }
+
+ context 'when both objects exist' do
+ it 'creates a Projects::SyncEvent to modify the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [project.id])
+ end.to change {
+ Projects::SyncEvent.where(project_id: project.id).count
+ }.by(1)
+ end
+
+ it 'enqueues the worker to process the Projects::SyncEvents' do
+ expect(::Projects::ProcessSyncEventsWorker).to receive(:perform_async)
+ consistency_fix_service.execute(ids: [project.id])
+ end
+ end
+
+ context 'when the source object has been deleted, but not the target' do
+ before do
+ project.delete
+ end
+
+ it 'deletes the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [project.id])
+ end.to change { Ci::ProjectMirror.where(project_id: project.id).count }.by(-1)
+ end
+ end
+ end
+ end
+
+ describe '#create_sync_event_for' do
+ context 'when the source model is Namespace' do
+ let(:namespace) { create(:namespace) }
+
+ let(:service) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ sync_event_class: Namespaces::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :namespace_id
+ )
+ end
+
+ it 'creates a Namespaces::SyncEvent object' do
+ expect do
+ service.send(:create_sync_event_for, namespace.id)
+ end.to change { Namespaces::SyncEvent.where(namespace_id: namespace.id).count }.by(1)
+ end
+ end
+
+ context 'when the source model is Project' do
+ let(:project) { create(:project) }
+
+ let(:service) do
+ described_class.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ it 'creates a Projects::SyncEvent object' do
+ expect do
+ service.send(:create_sync_event_for, project.id)
+ end.to change { Projects::SyncEvent.where(project_id: project.id).count }.by(1)
+ end
+ end
+ end
+
+ context 'when the source model is User' do
+ let(:service) do
+ described_class.new(
+ source_model: User,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ it 'raises an error' do
+ expect do
+ service.send(:create_sync_event_for, 1)
+ end.to raise_error("Unknown Source Model User")
+ end
+ end
+end
diff --git a/spec/services/dependency_proxy/group_settings/update_service_spec.rb b/spec/services/dependency_proxy/group_settings/update_service_spec.rb
index 6f8c55daa8d..4954d9ec267 100644
--- a/spec/services/dependency_proxy/group_settings/update_service_spec.rb
+++ b/spec/services/dependency_proxy/group_settings/update_service_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe ::DependencyProxy::GroupSettings::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the dependency proxy group settings'
- :developer | 'updating the dependency proxy group settings'
+ :developer | 'denying access to dependency proxy group settings'
:reporter | 'denying access to dependency proxy group settings'
:guest | 'denying access to dependency proxy group settings'
:anonymous | 'denying access to dependency proxy group settings'
diff --git a/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb b/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb
index ceac8985c8e..3a6ba2cca71 100644
--- a/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb
+++ b/spec/services/dependency_proxy/image_ttl_group_policies/update_service_spec.rb
@@ -72,7 +72,7 @@ RSpec.describe ::DependencyProxy::ImageTtlGroupPolicies::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the dependency proxy image ttl policy'
- :developer | 'updating the dependency proxy image ttl policy'
+ :developer | 'denying access to dependency proxy image ttl policy'
:reporter | 'denying access to dependency proxy image ttl policy'
:guest | 'denying access to dependency proxy image ttl policy'
:anonymous | 'denying access to dependency proxy image ttl policy'
@@ -92,7 +92,7 @@ RSpec.describe ::DependencyProxy::ImageTtlGroupPolicies::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the dependency proxy image ttl policy'
- :developer | 'creating the dependency proxy image ttl policy'
+ :developer | 'denying access to dependency proxy image ttl policy'
:reporter | 'denying access to dependency proxy image ttl policy'
:guest | 'denying access to dependency proxy image ttl policy'
:anonymous | 'denying access to dependency proxy image ttl policy'
@@ -108,7 +108,7 @@ RSpec.describe ::DependencyProxy::ImageTtlGroupPolicies::UpdateService do
context 'when the policy is not found' do
before do
- group.add_developer(user)
+ group.add_maintainer(user)
expect(group).to receive(:dependency_proxy_image_ttl_policy).and_return nil
end
diff --git a/spec/services/environments/stop_service_spec.rb b/spec/services/environments/stop_service_spec.rb
index 9e9ef127c67..afbc0ba70f9 100644
--- a/spec/services/environments/stop_service_spec.rb
+++ b/spec/services/environments/stop_service_spec.rb
@@ -161,8 +161,8 @@ RSpec.describe Environments::StopService do
end
end
- describe '#execute_for_merge_request' do
- subject { service.execute_for_merge_request(merge_request) }
+ describe '#execute_for_merge_request_pipeline' do
+ subject { service.execute_for_merge_request_pipeline(merge_request) }
let(:merge_request) { create(:merge_request, source_branch: 'feature', target_branch: 'master') }
let(:project) { merge_request.project }
@@ -199,6 +199,19 @@ RSpec.describe Environments::StopService do
expect(pipeline.environments_in_self_and_descendants.first).to be_stopped
end
+ context 'when pipeline is a branch pipeline for merge request' do
+ let(:pipeline) do
+ create(:ci_pipeline, source: :push, project: project, sha: merge_request.diff_head_sha,
+ merge_requests_as_head_pipeline: [merge_request])
+ end
+
+ it 'does not stop the active environment' do
+ subject
+
+ expect(pipeline.environments_in_self_and_descendants.first).to be_available
+ end
+ end
+
context 'with environment related jobs ' do
let!(:environment) { create(:environment, :available, name: 'staging', project: project) }
let!(:prepare_staging_job) { create(:ci_build, :prepare_staging, pipeline: pipeline, project: project) }
@@ -210,18 +223,6 @@ RSpec.describe Environments::StopService do
expect(prepare_staging_job.persisted_environment.state).to eq('available')
end
-
- context 'when fix_related_environments_for_merge_requests feature flag is disabled' do
- before do
- stub_feature_flags(fix_related_environments_for_merge_requests: false)
- end
-
- it 'stops unrelated environments too' do
- subject
-
- expect(prepare_staging_job.persisted_environment.state).to eq('stopped')
- end
- end
end
end
diff --git a/spec/services/error_tracking/base_service_spec.rb b/spec/services/error_tracking/base_service_spec.rb
index 2f2052f0189..de3523cb847 100644
--- a/spec/services/error_tracking/base_service_spec.rb
+++ b/spec/services/error_tracking/base_service_spec.rb
@@ -4,8 +4,8 @@ require 'spec_helper'
RSpec.describe ErrorTracking::BaseService do
describe '#compose_response' do
- let(:project) { double('project') }
- let(:user) { double('user', id: non_existing_record_id) }
+ let(:project) { build_stubbed(:project) }
+ let(:user) { build_stubbed(:user, id: non_existing_record_id) }
let(:service) { described_class.new(project, user) }
it 'returns bad_request error when response has an error key' do
@@ -19,7 +19,10 @@ RSpec.describe ErrorTracking::BaseService do
end
it 'returns server error when response has missing key error_type' do
- data = { error: 'Unexpected Error', error_type: ErrorTracking::ProjectErrorTrackingSetting::SENTRY_API_ERROR_TYPE_MISSING_KEYS }
+ data = {
+ error: 'Unexpected Error',
+ error_type: ErrorTracking::ProjectErrorTrackingSetting::SENTRY_API_ERROR_TYPE_MISSING_KEYS
+ }
result = service.send(:compose_response, data)
@@ -48,7 +51,7 @@ RSpec.describe ErrorTracking::BaseService do
context 'when parse_response is implemented' do
before do
- expect(service).to receive(:parse_response) do |response|
+ allow(service).to receive(:parse_response) do |response|
{ animal: response[:thing] }
end
end
diff --git a/spec/services/error_tracking/collect_error_service_spec.rb b/spec/services/error_tracking/collect_error_service_spec.rb
index faca3c12a48..159c070c683 100644
--- a/spec/services/error_tracking/collect_error_service_spec.rb
+++ b/spec/services/error_tracking/collect_error_service_spec.rb
@@ -52,12 +52,13 @@ RSpec.describe ErrorTracking::CollectErrorService do
end
context 'with unusual payload' do
- let(:modified_event) { parsed_event }
- let(:event) { described_class.new(project, nil, event: modified_event).execute }
+ let(:event) { ErrorTracking::ErrorEvent.last! }
context 'when transaction is missing' do
it 'builds actor from stacktrace' do
- modified_event.delete('transaction')
+ parsed_event.delete('transaction')
+
+ subject.execute
expect(event.error.actor).to eq 'find()'
end
@@ -65,7 +66,9 @@ RSpec.describe ErrorTracking::CollectErrorService do
context 'when transaction is an empty string' do \
it 'builds actor from stacktrace' do
- modified_event['transaction'] = ''
+ parsed_event['transaction'] = ''
+
+ subject.execute
expect(event.error.actor).to eq 'find()'
end
@@ -73,7 +76,9 @@ RSpec.describe ErrorTracking::CollectErrorService do
context 'when timestamp is numeric' do
it 'parses timestamp' do
- modified_event['timestamp'] = '1631015580.50'
+ parsed_event['timestamp'] = '1631015580.50'
+
+ subject.execute
expect(event.occurred_at).to eq '2021-09-07T11:53:00.5'
end
diff --git a/spec/services/error_tracking/issue_details_service_spec.rb b/spec/services/error_tracking/issue_details_service_spec.rb
index 8cc2688d198..29f8154a27c 100644
--- a/spec/services/error_tracking/issue_details_service_spec.rb
+++ b/spec/services/error_tracking/issue_details_service_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe ErrorTracking::IssueDetailsService do
let(:params) { { issue_id: detailed_error.id } }
before do
- expect(error_tracking_setting)
+ allow(error_tracking_setting)
.to receive(:issue_details).and_return(issue: detailed_error)
end
@@ -40,7 +40,7 @@ RSpec.describe ErrorTracking::IssueDetailsService do
include_examples 'error tracking service sentry error handling', :issue_details
include_examples 'error tracking service http status handling', :issue_details
- context 'integrated error tracking' do
+ context 'with integrated error tracking' do
let_it_be(:error) { create(:error_tracking_error, project: project) }
let(:params) { { issue_id: error.id } }
@@ -53,6 +53,18 @@ RSpec.describe ErrorTracking::IssueDetailsService do
expect(result[:status]).to eq(:success)
expect(result[:issue].to_json).to eq(error.to_sentry_detailed_error.to_json)
end
+
+ context 'when error does not exist' do
+ let(:params) { { issue_id: non_existing_record_id } }
+
+ it 'returns the error in detailed format' do
+ expect(result).to match(
+ status: :error,
+ message: /Couldn't find ErrorTracking::Error/,
+ http_status: :bad_request
+ )
+ end
+ end
end
end
diff --git a/spec/services/error_tracking/issue_latest_event_service_spec.rb b/spec/services/error_tracking/issue_latest_event_service_spec.rb
index e914cb1241e..aa2430ddffb 100644
--- a/spec/services/error_tracking/issue_latest_event_service_spec.rb
+++ b/spec/services/error_tracking/issue_latest_event_service_spec.rb
@@ -15,7 +15,7 @@ RSpec.describe ErrorTracking::IssueLatestEventService do
let(:error_event) { build(:error_tracking_sentry_error_event) }
before do
- expect(error_tracking_setting)
+ allow(error_tracking_setting)
.to receive(:issue_latest_event).and_return(latest_event: error_event)
end
@@ -28,7 +28,7 @@ RSpec.describe ErrorTracking::IssueLatestEventService do
include_examples 'error tracking service sentry error handling', :issue_latest_event
include_examples 'error tracking service http status handling', :issue_latest_event
- context 'integrated error tracking' do
+ context 'with integrated error tracking' do
let_it_be(:error) { create(:error_tracking_error, project: project) }
let_it_be(:event) { create(:error_tracking_error_event, error: error) }
@@ -42,6 +42,18 @@ RSpec.describe ErrorTracking::IssueLatestEventService do
expect(result[:status]).to eq(:success)
expect(result[:latest_event].to_json).to eq(event.to_sentry_error_event.to_json)
end
+
+ context 'when error does not exist' do
+ let(:params) { { issue_id: non_existing_record_id } }
+
+ it 'returns the error in detailed format' do
+ expect(result).to match(
+ status: :error,
+ message: /Couldn't find ErrorTracking::Error/,
+ http_status: :bad_request
+ )
+ end
+ end
end
end
diff --git a/spec/services/error_tracking/issue_update_service_spec.rb b/spec/services/error_tracking/issue_update_service_spec.rb
index 31a66654100..a06c3588264 100644
--- a/spec/services/error_tracking/issue_update_service_spec.rb
+++ b/spec/services/error_tracking/issue_update_service_spec.rb
@@ -13,8 +13,7 @@ RSpec.describe ErrorTracking::IssueUpdateService do
it 'does not call the close issue service' do
update_service.execute
- expect(issue_close_service)
- .not_to have_received(:execute)
+ expect(issue_close_service).not_to have_received(:execute)
end
it 'does not create system note' do
@@ -29,8 +28,7 @@ RSpec.describe ErrorTracking::IssueUpdateService do
let(:update_issue_response) { { updated: true } }
before do
- expect(error_tracking_setting)
- .to receive(:update_issue).and_return(update_issue_response)
+ allow(error_tracking_setting).to receive(:update_issue).and_return(update_issue_response)
end
it 'returns the response' do
@@ -49,12 +47,11 @@ RSpec.describe ErrorTracking::IssueUpdateService do
result
end
- context 'related issue and resolving' do
+ context 'with related issue and resolving' do
let(:issue) { create(:issue, project: project) }
let(:sentry_issue) { create(:sentry_issue, issue: issue) }
let(:arguments) { { issue_id: sentry_issue.sentry_issue_identifier, status: 'resolved' } }
-
- let(:issue_close_service) { spy(:issue_close_service) }
+ let(:issue_close_service) { instance_double('Issues::CloseService') }
before do
allow_next_instance_of(SentryIssueFinder) do |finder|
@@ -78,11 +75,11 @@ RSpec.describe ErrorTracking::IssueUpdateService do
.with(issue, system_note: false)
end
- context 'issues gets closed' do
+ context 'when issue gets closed' do
let(:closed_issue) { create(:issue, :closed, project: project) }
before do
- expect(issue_close_service)
+ allow(issue_close_service)
.to receive(:execute)
.with(issue, system_note: false)
.and_return(closed_issue)
@@ -99,13 +96,13 @@ RSpec.describe ErrorTracking::IssueUpdateService do
end
end
- context 'issue is already closed' do
+ context 'when issue is already closed' do
let(:issue) { create(:issue, :closed, project: project) }
include_examples 'does not perform close issue flow'
end
- context 'status is not resolving' do
+ context 'when status is not resolving' do
let(:arguments) { { issue_id: sentry_issue.sentry_issue_identifier, status: 'ignored' } }
include_examples 'does not perform close issue flow'
@@ -115,7 +112,7 @@ RSpec.describe ErrorTracking::IssueUpdateService do
include_examples 'error tracking service sentry error handling', :update_issue
- context 'integrated error tracking' do
+ context 'with integrated error tracking' do
let(:error) { create(:error_tracking_error, project: project) }
let(:arguments) { { issue_id: error.id, status: 'resolved' } }
let(:update_issue_response) { { updated: true, status: :success, closed_issue_iid: nil } }
diff --git a/spec/services/groups/group_links/create_service_spec.rb b/spec/services/groups/group_links/create_service_spec.rb
index 03dac14be54..bfbaedbd06f 100644
--- a/spec/services/groups/group_links/create_service_spec.rb
+++ b/spec/services/groups/group_links/create_service_spec.rb
@@ -3,23 +3,13 @@
require 'spec_helper'
RSpec.describe Groups::GroupLinks::CreateService, '#execute' do
- let(:parent_group_user) { create(:user) }
- let(:group_user) { create(:user) }
- let(:child_group_user) { create(:user) }
- let(:prevent_sharing) { false }
+ let_it_be(:shared_with_group_parent) { create(:group, :private) }
+ let_it_be(:shared_with_group) { create(:group, :private, parent: shared_with_group_parent) }
+ let_it_be(:shared_with_group_child) { create(:group, :private, parent: shared_with_group) }
let_it_be(:group_parent) { create(:group, :private) }
- let_it_be(:group) { create(:group, :private, parent: group_parent) }
- let_it_be(:group_child) { create(:group, :private, parent: group) }
- let(:ns_for_parent) { create(:namespace_settings, prevent_sharing_groups_outside_hierarchy: prevent_sharing) }
- let(:shared_group_parent) { create(:group, :private, namespace_settings: ns_for_parent) }
- let(:shared_group) { create(:group, :private, parent: shared_group_parent) }
- let(:shared_group_child) { create(:group, :private, parent: shared_group) }
-
- let(:project_parent) { create(:project, group: shared_group_parent) }
- let(:project) { create(:project, group: shared_group) }
- let(:project_child) { create(:project, group: shared_group_child) }
+ let(:group) { create(:group, :private, parent: group_parent) }
let(:opts) do
{
@@ -28,127 +18,161 @@ RSpec.describe Groups::GroupLinks::CreateService, '#execute' do
}
end
- let(:user) { group_user }
+ subject { described_class.new(group, shared_with_group, user, opts) }
- subject { described_class.new(shared_group, group, user, opts) }
+ shared_examples_for 'not shareable' do
+ it 'does not share and returns an error' do
+ expect do
+ result = subject.execute
- before do
- group.add_guest(group_user)
- shared_group.add_owner(group_user)
+ expect(result[:status]).to eq(:error)
+ expect(result[:http_status]).to eq(404)
+ end.not_to change { group.shared_with_group_links.count }
+ end
end
- it 'adds group to another group' do
- expect { subject.execute }.to change { group.shared_group_links.count }.from(0).to(1)
- end
+ shared_examples_for 'shareable' do
+ it 'adds group to another group' do
+ expect do
+ result = subject.execute
- it 'returns false if shared group is blank' do
- expect { described_class.new(nil, group, user, opts) }.not_to change { group.shared_group_links.count }
+ expect(result[:status]).to eq(:success)
+ end.to change { group.shared_with_group_links.count }.from(0).to(1)
+ end
end
- context 'user does not have access to group' do
- let(:user) { create(:user) }
-
- before do
- shared_group.add_owner(user)
- end
+ context 'when user has proper membership to share a group' do
+ let_it_be(:group_user) { create(:user) }
- it 'returns error' do
- result = subject.execute
+ let(:user) { group_user }
- expect(result[:status]).to eq(:error)
- expect(result[:http_status]).to eq(404)
+ before do
+ shared_with_group.add_guest(group_user)
+ group.add_owner(group_user)
end
- end
- context 'user does not have admin access to shared group' do
- let(:user) { create(:user) }
+ it_behaves_like 'shareable'
- before do
- group.add_guest(user)
- shared_group.add_developer(user)
- end
+ context 'when sharing outside the hierarchy is disabled' do
+ let_it_be(:group_parent) do
+ create(:group,
+ namespace_settings: create(:namespace_settings, prevent_sharing_groups_outside_hierarchy: true))
+ end
- it 'returns error' do
- result = subject.execute
+ it_behaves_like 'not shareable'
- expect(result[:status]).to eq(:error)
- expect(result[:http_status]).to eq(404)
- end
- end
+ context 'when group is inside hierarchy' do
+ let(:shared_with_group) { create(:group, :private, parent: group_parent) }
- context 'project authorizations based on group hierarchies' do
- before do
- group_parent.add_owner(parent_group_user)
- group.add_owner(group_user)
- group_child.add_owner(child_group_user)
+ it_behaves_like 'shareable'
+ end
end
- context 'project authorizations refresh' do
- it 'is executed only for the direct members of the group' do
- expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id)).and_call_original
+ context 'project authorizations based on group hierarchies' do
+ let_it_be(:child_group_user) { create(:user) }
+ let_it_be(:parent_group_user) { create(:user) }
- subject.execute
+ before do
+ shared_with_group_parent.add_owner(parent_group_user)
+ shared_with_group.add_owner(group_user)
+ shared_with_group_child.add_owner(child_group_user)
end
- end
- context 'project authorizations' do
- context 'group user' do
- let(:user) { group_user }
+ context 'project authorizations refresh' do
+ it 'is executed only for the direct members of the group' do
+ expect(UserProjectAccessChangedService).to receive(:new).with(contain_exactly(group_user.id))
+ .and_call_original
- it 'create proper authorizations' do
subject.execute
-
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_truthy
- expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
end
end
- context 'parent group user' do
- let(:user) { parent_group_user }
+ context 'project authorizations' do
+ let(:group_child) { create(:group, :private, parent: group) }
+ let(:project_parent) { create(:project, group: group_parent) }
+ let(:project) { create(:project, group: group) }
+ let(:project_child) { create(:project, group: group_child) }
- it 'create proper authorizations' do
- subject.execute
+ context 'group user' do
+ let(:user) { group_user }
+
+ it 'create proper authorizations' do
+ subject.execute
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_truthy
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_truthy
+ end
end
- end
- context 'child group user' do
- let(:user) { child_group_user }
+ context 'parent group user' do
+ let(:user) { parent_group_user }
- it 'create proper authorizations' do
- subject.execute
+ it 'create proper authorizations' do
+ subject.execute
+
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
+ end
- expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project)).to be_falsey
- expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ context 'child group user' do
+ let(:user) { child_group_user }
+
+ it 'create proper authorizations' do
+ subject.execute
+
+ expect(Ability.allowed?(user, :read_project, project_parent)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project)).to be_falsey
+ expect(Ability.allowed?(user, :read_project, project_child)).to be_falsey
+ end
end
end
end
end
- context 'sharing outside the hierarchy is disabled' do
- let(:prevent_sharing) { true }
+ context 'user does not have access to group' do
+ let(:user) { create(:user) }
- it 'prevents sharing with a group outside the hierarchy' do
- result = subject.execute
+ before do
+ group.add_owner(user)
+ end
- expect(group.reload.shared_group_links.count).to eq(0)
- expect(result[:status]).to eq(:error)
- expect(result[:http_status]).to eq(404)
+ it_behaves_like 'not shareable'
+ end
+
+ context 'user does not have admin access to shared group' do
+ let(:user) { create(:user) }
+
+ before do
+ shared_with_group.add_guest(user)
+ group.add_developer(user)
end
- it 'allows sharing with a group within the hierarchy' do
- sibling_group = create(:group, :private, parent: shared_group_parent)
- sibling_group.add_guest(group_user)
+ it_behaves_like 'not shareable'
+ end
+
+ context 'when group is blank' do
+ let(:group_user) { create(:user) }
+ let(:user) { group_user }
+ let(:group) { nil }
- result = described_class.new(shared_group, sibling_group, user, opts).execute
+ it 'does not share and returns an error' do
+ expect do
+ result = subject.execute
- expect(sibling_group.reload.shared_group_links.count).to eq(1)
- expect(result[:status]).to eq(:success)
+ expect(result[:status]).to eq(:error)
+ expect(result[:http_status]).to eq(404)
+ end.not_to change { shared_with_group.shared_group_links.count }
end
end
+
+ context 'when shared_with_group is blank' do
+ let(:group_user) { create(:user) }
+ let(:user) { group_user }
+ let(:shared_with_group) { nil }
+
+ it_behaves_like 'not shareable'
+ end
end
diff --git a/spec/services/groups/group_links/destroy_service_spec.rb b/spec/services/groups/group_links/destroy_service_spec.rb
index e63adc07313..6aaf5f45069 100644
--- a/spec/services/groups/group_links/destroy_service_spec.rb
+++ b/spec/services/groups/group_links/destroy_service_spec.rb
@@ -3,54 +3,77 @@
require 'spec_helper'
RSpec.describe Groups::GroupLinks::DestroyService, '#execute' do
- let(:user) { create(:user) }
-
+ let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, :private) }
let_it_be(:shared_group) { create(:group, :private) }
let_it_be(:project) { create(:project, group: shared_group) }
let_it_be(:owner) { create(:user) }
- before do
- group.add_developer(owner)
- shared_group.add_owner(owner)
- end
-
subject { described_class.new(shared_group, owner) }
- context 'single link' do
- let!(:link) { create(:group_group_link, shared_group: shared_group, shared_with_group: group) }
+ context 'when authorizing by user' do
+ before do
+ group.add_developer(owner)
+ shared_group.add_owner(owner)
+ end
+
+ context 'single link' do
+ let!(:link) { create(:group_group_link, shared_group: shared_group, shared_with_group: group) }
- it 'destroys link' do
- expect { subject.execute(link) }.to change { shared_group.shared_with_group_links.count }.from(1).to(0)
+ it 'destroys the link' 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)
+
+ expect { subject.execute(link) }.to(
+ change { Ability.allowed?(user, :read_project, project) }.from(true).to(false))
+ end
end
- it 'revokes project authorization', :sidekiq_inline do
- group.add_developer(user)
+ context 'multiple links' do
+ let_it_be(:another_group) { create(:group, :private) }
+ let_it_be(:another_shared_group) { create(:group, :private) }
+
+ let!(:links) do
+ [
+ create(:group_group_link, shared_group: shared_group, shared_with_group: group),
+ create(:group_group_link, shared_group: shared_group, shared_with_group: another_group),
+ create(:group_group_link, shared_group: another_shared_group, shared_with_group: group),
+ create(:group_group_link, shared_group: another_shared_group, shared_with_group: another_group)
+ ]
+ end
- expect { subject.execute(link) }.to(
- change { Ability.allowed?(user, :read_project, project) }.from(true).to(false))
+ 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
end
- context 'multiple links' do
- let_it_be(:another_group) { create(:group, :private) }
- let_it_be(:another_shared_group) { create(:group, :private) }
-
- let!(:links) do
- [
- create(:group_group_link, shared_group: shared_group, shared_with_group: group),
- create(:group_group_link, shared_group: shared_group, shared_with_group: another_group),
- create(:group_group_link, shared_group: another_shared_group, shared_with_group: group),
- create(:group_group_link, shared_group: another_shared_group, shared_with_group: another_group)
- ]
+ context 'when skipping authorization' do
+ let!(:link) { create(:group_group_link, shared_group: shared_group, shared_with_group: group) }
+
+ context 'with provided group and owner' do
+ it 'destroys the link' do
+ expect do
+ subject.execute(link, skip_authorization: true)
+ end.to change { shared_group.shared_with_group_links.count }.from(1).to(0)
+ end
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 'without providing group or owner' do
+ subject { described_class.new(nil, nil) }
- subject.execute(links)
+ it 'destroys the link' do
+ expect do
+ subject.execute(link, skip_authorization: true)
+ end.to change { shared_group.shared_with_group_links.count }.from(1).to(0)
+ end
end
end
end
diff --git a/spec/services/groups/open_issues_count_service_spec.rb b/spec/services/groups/open_issues_count_service_spec.rb
index 7dd8c2a59a0..fca09bfdebe 100644
--- a/spec/services/groups/open_issues_count_service_spec.rb
+++ b/spec/services/groups/open_issues_count_service_spec.rb
@@ -3,18 +3,12 @@
require 'spec_helper'
RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_caching do
- let_it_be(:group) { create(:group, :public) }
+ let_it_be(:group) { create(:group, :public)}
let_it_be(:project) { create(:project, :public, namespace: group) }
- let_it_be(:admin) { create(:user, :admin) }
let_it_be(:user) { create(:user) }
- let_it_be(:banned_user) { create(:user, :banned) }
-
- before do
- create(:issue, :opened, project: project)
- create(:issue, :opened, confidential: true, project: project)
- create(:issue, :opened, author: banned_user, project: project)
- create(:issue, :closed, project: project)
- end
+ let_it_be(:issue) { create(:issue, :opened, project: project) }
+ let_it_be(:confidential) { create(:issue, :opened, confidential: true, project: project) }
+ let_it_be(:closed) { create(:issue, :closed, project: project) }
subject { described_class.new(group, user) }
@@ -26,27 +20,17 @@ RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_cac
it 'uses the IssuesFinder to scope issues' do
expect(IssuesFinder)
.to receive(:new)
- .with(user, group_id: group.id, state: 'opened', non_archived: true, include_subgroups: true, public_only: true, include_hidden: false)
+ .with(user, group_id: group.id, state: 'opened', non_archived: true, include_subgroups: true, public_only: true)
subject.count
end
end
describe '#count' do
- shared_examples 'counts public issues, does not count hidden or confidential' do
- it 'counts only public issues' do
- expect(subject.count).to eq(1)
- end
-
- it 'uses PUBLIC_COUNT_WITHOUT_HIDDEN_KEY cache key' do
- expect(subject.cache_key).to include('group_open_public_issues_without_hidden_count')
- end
- end
-
context 'when user is nil' do
- let(:user) { nil }
-
- it_behaves_like 'counts public issues, does not count hidden or confidential'
+ it 'does not include confidential issues in the issue count' do
+ expect(described_class.new(group).count).to eq(1)
+ end
end
context 'when user is provided' do
@@ -55,13 +39,9 @@ RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_cac
group.add_reporter(user)
end
- it 'includes confidential issues and does not include hidden issues in count' do
+ it 'returns the right count with confidential issues' do
expect(subject.count).to eq(2)
end
-
- it 'uses TOTAL_COUNT_WITHOUT_HIDDEN_KEY cache key' do
- expect(subject.cache_key).to include('group_open_issues_without_hidden_count')
- end
end
context 'when user cannot read confidential issues' do
@@ -69,24 +49,8 @@ RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_cac
group.add_guest(user)
end
- it_behaves_like 'counts public issues, does not count hidden or confidential'
- end
-
- context 'when user is an admin' do
- let(:user) { admin }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it 'includes confidential and hidden issues in count' do
- expect(subject.count).to eq(3)
- end
-
- it 'uses TOTAL_COUNT_KEY cache key' do
- expect(subject.cache_key).to include('group_open_issues_including_hidden_count')
- end
- end
-
- context 'when admin mode is disabled' do
- it_behaves_like 'counts public issues, does not count hidden or confidential'
+ it 'does not include confidential issues' do
+ expect(subject.count).to eq(1)
end
end
@@ -97,13 +61,11 @@ RSpec.describe Groups::OpenIssuesCountService, :use_clean_rails_memory_store_cac
describe '#clear_all_cache_keys' do
it 'calls `Rails.cache.delete` with the correct keys' do
expect(Rails.cache).to receive(:delete)
- .with(['groups', 'open_issues_count_service', 1, group.id, described_class::PUBLIC_COUNT_WITHOUT_HIDDEN_KEY])
+ .with(['groups', 'open_issues_count_service', 1, group.id, described_class::PUBLIC_COUNT_KEY])
expect(Rails.cache).to receive(:delete)
.with(['groups', 'open_issues_count_service', 1, group.id, described_class::TOTAL_COUNT_KEY])
- expect(Rails.cache).to receive(:delete)
- .with(['groups', 'open_issues_count_service', 1, group.id, described_class::TOTAL_COUNT_WITHOUT_HIDDEN_KEY])
- described_class.new(group).clear_all_cache_keys
+ subject.clear_all_cache_keys
end
end
end
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index 1c4b7aac87e..20ea8b2bf1b 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -574,7 +574,7 @@ RSpec.describe Groups::TransferService, :sidekiq_inline do
context 'resets project authorizations' do
let_it_be(:old_parent_group) { create(:group) }
- let_it_be_with_reload(:group) { create(:group, :private, parent: old_parent_group) }
+ let_it_be_with_refind(:group) { create(:group, :private, parent: old_parent_group) }
let_it_be(:new_group_member) { create(:user) }
let_it_be(:old_group_member) { create(:user) }
let_it_be(:unique_subgroup_member) { create(:user) }
diff --git a/spec/services/import/bitbucket_server_service_spec.rb b/spec/services/import/bitbucket_server_service_spec.rb
index 56d93625b91..0b9fe10e95a 100644
--- a/spec/services/import/bitbucket_server_service_spec.rb
+++ b/spec/services/import/bitbucket_server_service_spec.rb
@@ -48,6 +48,23 @@ RSpec.describe Import::BitbucketServerService do
end
end
+ context 'when import source is disabled' do
+ before do
+ stub_application_setting(import_sources: nil)
+ allow(subject).to receive(:authorized?).and_return(true)
+ allow(client).to receive(:repo).with(project_key, repo_slug).and_return(double(repo))
+ end
+
+ it 'returns forbidden' do
+ result = subject.execute(credentials)
+
+ expect(result).to include(
+ status: :error,
+ http_status: :forbidden
+ )
+ end
+ end
+
context 'when user is unauthorized' do
before do
allow(subject).to receive(:authorized?).and_return(false)
diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb
index 58afae1e647..1c26677cfa5 100644
--- a/spec/services/import/github_service_spec.rb
+++ b/spec/services/import/github_service_spec.rb
@@ -111,6 +111,33 @@ RSpec.describe Import::GithubService do
end
end
+ context 'when import source is disabled' do
+ let(:repository_double) do
+ double({
+ name: 'vim',
+ description: 'test',
+ full_name: 'test/vim',
+ clone_url: 'http://repo.com/repo/repo.git',
+ private: false,
+ has_wiki?: false
+ })
+ end
+
+ before do
+ stub_application_setting(import_sources: nil)
+ allow(client).to receive(:repository).and_return(repository_double)
+ end
+
+ it 'returns forbidden' do
+ result = subject.execute(access_params, :github)
+
+ expect(result).to include(
+ status: :error,
+ http_status: :forbidden
+ )
+ end
+ end
+
context 'when a blocked/local URL is used as github_hostname' do
let(:message) { 'Error while attempting to import from GitHub' }
let(:error) { "Invalid URL: #{url}" }
diff --git a/spec/services/incident_management/timeline_events/create_service_spec.rb b/spec/services/incident_management/timeline_events/create_service_spec.rb
new file mode 100644
index 00000000000..38ce15e74f1
--- /dev/null
+++ b/spec/services/incident_management/timeline_events/create_service_spec.rb
@@ -0,0 +1,117 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEvents::CreateService do
+ let_it_be(:user_with_permissions) { create(:user) }
+ let_it_be(:user_without_permissions) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_refind(:incident) { create(:incident, project: project) }
+ let_it_be(:comment) { create(:note, project: project, noteable: incident) }
+
+ let(:args) do
+ {
+ note: 'note',
+ occurred_at: Time.current,
+ action: 'new comment',
+ promoted_from_note: comment
+ }
+ end
+
+ let(:current_user) { user_with_permissions }
+ let(:service) { described_class.new(incident, current_user, args) }
+
+ before_all do
+ project.add_developer(user_with_permissions)
+ project.add_reporter(user_without_permissions)
+ end
+
+ describe '#execute' do
+ shared_examples 'error response' do |message|
+ it 'has an informative message' do
+ expect(execute).to be_error
+ expect(execute.message).to eq(message)
+ end
+ end
+
+ shared_examples 'success response' do
+ it 'has 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(args[:note])
+ expect(result.promoted_from_note).to eq(comment)
+ end
+ end
+
+ subject(:execute) { service.execute }
+
+ context 'when current user is blank' do
+ let(:current_user) { nil }
+
+ it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ end
+
+ context 'when user does not have permissions to create timeline events' do
+ let(:current_user) { user_without_permissions }
+
+ it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ end
+
+ context 'when error occurs during creation' do
+ let(:args) { {} }
+
+ it_behaves_like 'error response', "Occurred at can't be blank, Note can't be blank, and Note html can't be blank"
+ end
+
+ context 'with default action' do
+ let(:args) { { note: 'note', occurred_at: Time.current, promoted_from_note: comment } }
+
+ it_behaves_like 'success response'
+
+ it 'matches the default action', :aggregate_failures do
+ result = execute.payload[:timeline_event]
+
+ expect(result.action).to eq(IncidentManagement::TimelineEvents::DEFAULT_ACTION)
+ end
+ end
+
+ context 'with non_default action' do
+ it_behaves_like 'success response'
+
+ it 'matches the action from arguments', :aggregate_failures do
+ result = execute.payload[:timeline_event]
+
+ expect(result.action).to eq(args[:action])
+ end
+ end
+
+ it 'successfully creates a database record', :aggregate_failures do
+ expect { execute }.to change { ::IncidentManagement::TimelineEvent.count }.by(1)
+ end
+
+ context 'when incident_timeline feature flag is enabled' do
+ before do
+ stub_feature_flags(incident_timeline: project)
+ end
+
+ it 'creates a system note' do
+ expect { execute }.to change { incident.notes.reload.count }.by(1)
+ end
+ end
+
+ context 'when incident_timeline feature flag is disabled' do
+ before do
+ stub_feature_flags(incident_timeline: false)
+ end
+
+ it 'does not create a system note' do
+ expect { execute }.not_to change { incident.notes.reload.count }
+ end
+ end
+ end
+end
diff --git a/spec/services/incident_management/timeline_events/destroy_service_spec.rb b/spec/services/incident_management/timeline_events/destroy_service_spec.rb
new file mode 100644
index 00000000000..01daee2b749
--- /dev/null
+++ b/spec/services/incident_management/timeline_events/destroy_service_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEvents::DestroyService do
+ let_it_be(:user_with_permissions) { create(:user) }
+ let_it_be(:user_without_permissions) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be_with_refind(:incident) { create(:incident, project: project) }
+
+ let!(:timeline_event) { create(:incident_management_timeline_event, incident: incident, project: project) }
+ let(:current_user) { user_with_permissions }
+ let(:params) { {} }
+ let(:service) { described_class.new(timeline_event, current_user) }
+
+ before_all do
+ project.add_developer(user_with_permissions)
+ project.add_reporter(user_without_permissions)
+ end
+
+ describe '#execute' do
+ shared_examples 'error response' do |message|
+ it 'has an informative message' do
+ expect(execute).to be_error
+ expect(execute.message).to eq(message)
+ end
+ end
+
+ subject(:execute) { service.execute }
+
+ context 'when current user is anonymous' do
+ let(:current_user) { nil }
+
+ it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ end
+
+ context 'when user does not have permissions to remove timeline events' do
+ let(:current_user) { user_without_permissions }
+
+ it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ end
+
+ context 'when an error occurs during removal' do
+ before do
+ allow(timeline_event).to receive(:destroy).and_return(false)
+ timeline_event.errors.add(:note, 'cannot be removed')
+ end
+
+ it_behaves_like 'error response', 'Note cannot be removed'
+ end
+
+ it 'successfully returns the timeline event', :aggregate_failures do
+ expect(execute).to be_success
+
+ result = execute.payload[:timeline_event]
+ expect(result).to be_a(::IncidentManagement::TimelineEvent)
+ expect(result.id).to eq(timeline_event.id)
+ end
+
+ context 'when incident_timeline feature flag is enabled' do
+ before do
+ stub_feature_flags(incident_timeline: project)
+ end
+
+ it 'creates a system note' do
+ expect { execute }.to change { incident.notes.reload.count }.by(1)
+ end
+ end
+
+ context 'when incident_timeline feature flag is disabled' do
+ before do
+ stub_feature_flags(incident_timeline: false)
+ end
+
+ it 'does not create a system note' do
+ expect { execute }.not_to change { incident.notes.reload.count }
+ end
+ 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
new file mode 100644
index 00000000000..8bc0e5ce0ed
--- /dev/null
+++ b/spec/services/incident_management/timeline_events/update_service_spec.rb
@@ -0,0 +1,148 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe IncidentManagement::TimelineEvents::UpdateService do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:incident) { create(:incident, project: project) }
+
+ let!(:timeline_event) { create(:incident_management_timeline_event, project: project, incident: incident) }
+ let(:occurred_at) { 1.minute.ago }
+ let(:params) { { note: 'Updated note', occurred_at: occurred_at } }
+
+ before do
+ stub_feature_flags(incident_timeline: project)
+ end
+
+ describe '#execute' do
+ shared_examples 'successful response' do
+ it 'responds with success', :aggregate_failures do
+ expect(execute).to be_success
+ expect(execute.payload).to eq(timeline_event: timeline_event.reload)
+ end
+ end
+
+ shared_examples 'error response' do |message|
+ it 'has an informative message' do
+ expect(execute).to be_error
+ expect(execute.message).to eq(message)
+ end
+ end
+
+ shared_examples 'passing the correct was_changed value' do |was_changed|
+ it 'passes the correct was_changed value into SysteNoteService.edit_timeline_event' do
+ expect(SystemNoteService)
+ .to receive(:edit_timeline_event)
+ .with(timeline_event, user, was_changed: was_changed)
+ .and_call_original
+
+ execute
+ end
+ end
+
+ subject(:execute) { described_class.new(timeline_event, user, params).execute }
+
+ context 'when user has permissions' do
+ before do
+ project.add_developer(user)
+ end
+
+ it_behaves_like 'successful response'
+
+ it 'updates attributes' do
+ expect { execute }.to change { timeline_event.note }.to(params[:note])
+ .and change { timeline_event.occurred_at }.to(params[:occurred_at])
+ end
+
+ it 'creates a system note' do
+ expect { execute }.to change { incident.notes.reload.count }.by(1)
+ end
+
+ it_behaves_like 'passing the correct was_changed value', :occurred_at_and_note
+
+ context 'when incident_timeline feature flag is disabled' do
+ before do
+ stub_feature_flags(incident_timeline: false)
+ end
+
+ it 'does not add a system note' do
+ expect { execute }.not_to change { incident.notes }
+ end
+ end
+
+ context 'when note is nil' do
+ let(:params) { { occurred_at: occurred_at } }
+
+ it_behaves_like 'successful response'
+ it_behaves_like 'passing the correct was_changed value', :occurred_at
+
+ it 'does not update the note' do
+ expect { execute }.not_to change { timeline_event.reload.note }
+ end
+
+ it 'updates occurred_at' do
+ expect { execute }.to change { timeline_event.occurred_at }.to(params[:occurred_at])
+ end
+ end
+
+ context 'when note is blank' do
+ let(:params) { { note: '', occurred_at: occurred_at } }
+
+ it_behaves_like 'successful response'
+ it_behaves_like 'passing the correct was_changed value', :occurred_at
+
+ it 'does not update the note' do
+ expect { execute }.not_to change { timeline_event.reload.note }
+ end
+
+ it 'updates occurred_at' do
+ expect { execute }.to change { timeline_event.occurred_at }.to(params[:occurred_at])
+ end
+ end
+
+ context 'when occurred_at is nil' do
+ let(:params) { { note: 'Updated note' } }
+
+ it_behaves_like 'successful response'
+ it_behaves_like 'passing the correct was_changed value', :note
+
+ it 'updates the note' do
+ expect { execute }.to change { timeline_event.note }.to(params[:note])
+ end
+
+ it 'does not update occurred_at' do
+ expect { execute }.not_to change { timeline_event.reload.occurred_at }
+ end
+ end
+
+ context 'when both occurred_at and note is nil' do
+ let(:params) { {} }
+
+ it_behaves_like 'successful response'
+
+ it 'does not update the note' do
+ expect { execute }.not_to change { timeline_event.note }
+ end
+
+ it 'does not update occurred_at' do
+ expect { execute }.not_to change { timeline_event.reload.occurred_at }
+ end
+
+ it 'does not call SysteNoteService.edit_timeline_event' do
+ expect(SystemNoteService).not_to receive(:edit_timeline_event)
+
+ execute
+ end
+ end
+ end
+
+ context 'when user does not have permissions' do
+ before do
+ project.add_reporter(user)
+ end
+
+ it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
+ end
+ end
+end
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 1f6118e9fcc..344da5a6582 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -279,7 +279,7 @@ RSpec.describe Issues::CloseService do
it 'verifies the number of queries' do
recorded = ActiveRecord::QueryRecorder.new { close_issue }
- expected_queries = 32
+ expected_queries = 30
expect(recorded.count).to be <= expected_queries
expect(recorded.cached_count).to eq(0)
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 6b7b72d83fc..3934ca04a00 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -47,6 +47,14 @@ RSpec.describe Issues::CreateService do
due_date: Date.tomorrow }
end
+ it 'works if base work item types were not created yet' do
+ WorkItems::Type.delete_all
+
+ expect do
+ issue
+ end.to change(Issue, :count).by(1)
+ end
+
it 'creates the issue with the given params' do
expect(Issuable::CommonSystemNotesService).to receive_message_chain(:new, :execute)
diff --git a/spec/services/issues/set_crm_contacts_service_spec.rb b/spec/services/issues/set_crm_contacts_service_spec.rb
index b0befb9f77c..5613cc49cc5 100644
--- a/spec/services/issues/set_crm_contacts_service_spec.rb
+++ b/spec/services/issues/set_crm_contacts_service_spec.rb
@@ -5,7 +5,7 @@ require 'spec_helper'
RSpec.describe Issues::SetCrmContactsService do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group, :crm_enabled) }
- let_it_be(:project) { create(:project, group: create(:group, parent: group)) }
+ let_it_be(:project) { create(:project, group: create(:group, :crm_enabled, parent: group)) }
let_it_be(:contacts) { create_list(:contact, 4, group: group) }
let_it_be(:issue, reload: true) { create(:issue, project: project) }
let_it_be(:issue_contact_1) do
@@ -58,6 +58,20 @@ RSpec.describe Issues::SetCrmContactsService do
group.add_reporter(user)
end
+ context 'but the crm setting is disabled' do
+ let(:params) { { replace_ids: [contacts[1].id, contacts[2].id] } }
+ let(:subgroup_with_crm_disabled) { create(:group, parent: group) }
+ let(:project_with_crm_disabled) { create(:project, group: subgroup_with_crm_disabled) }
+ let(:issue_with_crm_disabled) { create(:issue, project: project_with_crm_disabled) }
+
+ it 'returns expected error response' do
+ response = described_class.new(project: project_with_crm_disabled, current_user: user, params: params).execute(issue_with_crm_disabled)
+
+ expect(response).to be_error
+ expect(response.message).to eq('You have insufficient permissions to set customer relations contacts for this issue')
+ end
+ end
+
context 'when the contact does not exist' do
let(:params) { { replace_ids: [non_existing_record_id] } }
diff --git a/spec/services/jira_connect/sync_service_spec.rb b/spec/services/jira_connect/sync_service_spec.rb
index c20aecaaef0..7242b1f41f9 100644
--- a/spec/services/jira_connect/sync_service_spec.rb
+++ b/spec/services/jira_connect/sync_service_spec.rb
@@ -24,13 +24,15 @@ RSpec.describe JiraConnect::SyncService do
end
def expect_log(type, message)
- expect(Gitlab::ProjectServiceLogger)
+ expect(Gitlab::IntegrationsLogger)
.to receive(type).with(
- message: 'response from jira dev_info api',
- integration: 'JiraConnect',
- project_id: project.id,
- project_path: project.full_path,
- jira_response: message&.to_json
+ {
+ message: 'response from jira dev_info api',
+ integration: 'JiraConnect',
+ project_id: project.id,
+ project_path: project.full_path,
+ jira_response: message&.to_json
+ }
)
end
diff --git a/spec/services/keys/expiry_notification_service_spec.rb b/spec/services/keys/expiry_notification_service_spec.rb
index 1d1da179cf7..7cb6cbce311 100644
--- a/spec/services/keys/expiry_notification_service_spec.rb
+++ b/spec/services/keys/expiry_notification_service_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe Keys::ExpiryNotificationService do
end
context 'with key expiring today', :mailer do
- let_it_be_with_reload(:key) { create(:key, expires_at: Time.current, user: user) }
+ let_it_be_with_reload(:key) { create(:key, expires_at: 10.minutes.from_now, user: user) }
let(:expiring_soon) { false }
diff --git a/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb b/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb
index 538d9638879..735f090d926 100644
--- a/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb
+++ b/spec/services/loose_foreign_keys/batch_cleaner_service_spec.rb
@@ -181,16 +181,6 @@ RSpec.describe LooseForeignKeys::BatchCleanerService do
end
end
end
-
- context 'when the lfk_fair_queueing FF is off' do
- before do
- stub_feature_flags(lfk_fair_queueing: false)
- end
-
- it 'does nothing' do
- expect { cleaner.execute }.not_to change { deleted_record.reload.cleanup_attempts }
- end
- end
end
end
end
diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb
index 25437be1e78..730175af0bb 100644
--- a/spec/services/members/create_service_spec.rb
+++ b/spec/services/members/create_service_spec.rb
@@ -7,11 +7,11 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
let_it_be(:user) { create(:user) }
let_it_be(:member) { create(:user) }
let_it_be(:user_invited_by_id) { create(:user) }
- let_it_be(:user_ids) { member.id.to_s }
+ let_it_be(:user_id) { member.id.to_s }
let_it_be(:access_level) { Gitlab::Access::GUEST }
let(:additional_params) { { invite_source: '_invite_source_' } }
- let(:params) { { user_ids: user_ids, access_level: access_level }.merge(additional_params) }
+ let(:params) { { user_id: user_id, access_level: access_level }.merge(additional_params) }
let(:current_user) { user }
subject(:execute_service) { described_class.new(current_user, params.merge({ source: source })).execute }
@@ -51,7 +51,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when user_id is passed as an integer' do
- let(:user_ids) { member.id }
+ let(:user_id) { member.id }
it 'successfully creates member' do
expect(execute_service[:status]).to eq(:success)
@@ -60,8 +60,8 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids as an array of integers' do
- let(:user_ids) { [member.id, user_invited_by_id.id] }
+ context 'with user_id as an array of integers' do
+ let(:user_id) { [member.id, user_invited_by_id.id] }
it 'successfully creates members' do
expect(execute_service[:status]).to eq(:success)
@@ -70,8 +70,8 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids as an array of strings' do
- let(:user_ids) { [member.id.to_s, user_invited_by_id.id.to_s] }
+ context 'with user_id as an array of strings' do
+ let(:user_id) { [member.id.to_s, user_invited_by_id.id.to_s] }
it 'successfully creates members' do
expect(execute_service[:status]).to eq(:success)
@@ -101,7 +101,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when passing no user ids' do
- let(:user_ids) { '' }
+ let(:user_id) { '' }
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
@@ -112,7 +112,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when passing many user ids' do
- let(:user_ids) { 1.upto(101).to_a.join(',') }
+ let(:user_id) { 1.upto(101).to_a.join(',') }
it 'limits the number of users to 100' do
expect(execute_service[:status]).to eq(:error)
@@ -134,7 +134,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when passing an existing invite user id' do
- let(:user_ids) { create(:project_member, :invited, project: source).invite_email }
+ let(:user_id) { create(:project_member, :invited, project: source).invite_email }
it 'does not add a member' do
expect(execute_service[:status]).to eq(:error)
@@ -146,7 +146,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
context 'when adding a project_bot' do
let_it_be(:project_bot) { create(:user, :project_bot) }
- let(:user_ids) { project_bot.id }
+ let(:user_id) { project_bot.id }
context 'when project_bot is already a member' do
before do
@@ -213,7 +213,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when it is a net_new_user' do
- let(:additional_params) { { invite_source: '_invite_source_', user_ids: 'email@example.org' } }
+ let(:additional_params) { { invite_source: '_invite_source_', user_id: 'email@example.org' } }
it 'tracks the invite source from params' do
execute_service
@@ -248,8 +248,8 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
)
end
- context 'when it is an invite by email passed to user_ids' do
- let(:user_ids) { 'email@example.org' }
+ context 'when it is an invite by email passed to user_id' do
+ let(:user_id) { 'email@example.org' }
it 'does not create task issues' do
expect(TasksToBeDone::CreateWorker).not_to receive(:perform_async)
@@ -263,7 +263,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
let(:another_user) { create(:user) }
- let(:user_ids) { [member.id, another_user.id].join(',') }
+ let(:user_id) { [member.id, another_user.id].join(',') }
it 'still creates 2 task issues', :aggregate_failures do
expect(TasksToBeDone::CreateWorker)
@@ -326,7 +326,7 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when a member was already invited' do
- let(:user_ids) { create(:project_member, :invited, project: source).invite_email }
+ let(:user_id) { create(:project_member, :invited, project: source).invite_email }
let(:additional_params) do
{ invite_source: '_invite_source_', tasks_project_id: source.id, tasks_to_be_done: %w(ci code) }
end
diff --git a/spec/services/members/groups/creator_service_spec.rb b/spec/services/members/groups/creator_service_spec.rb
index 4427c4e7d9f..c3ba7c0374d 100644
--- a/spec/services/members/groups/creator_service_spec.rb
+++ b/spec/services/members/groups/creator_service_spec.rb
@@ -3,14 +3,28 @@
require 'spec_helper'
RSpec.describe Members::Groups::CreatorService do
- it_behaves_like 'member creation' do
- let_it_be(:source, reload: true) { create(:group, :public) }
- let_it_be(:member_type) { GroupMember }
- end
-
describe '.access_levels' do
it 'returns Gitlab::Access.options_with_owner' do
expect(described_class.access_levels).to eq(Gitlab::Access.sym_options_with_owner)
end
end
+
+ describe '#execute' do
+ let_it_be(:source, reload: true) { create(:group, :public) }
+ let_it_be(:user) { create(:user) }
+
+ it_behaves_like 'member creation' do
+ let_it_be(:member_type) { GroupMember }
+ end
+
+ context 'authorized projects update' do
+ it 'schedules a single project authorization update job when called multiple times' do
+ expect(AuthorizedProjectsWorker).to receive(:bulk_perform_and_wait).once
+
+ 1.upto(3) do
+ described_class.new(source, user, :maintainer).execute
+ end
+ end
+ end
+ end
end
diff --git a/spec/services/members/invite_service_spec.rb b/spec/services/members/invite_service_spec.rb
index ab740138a8b..8213e8baae0 100644
--- a/spec/services/members/invite_service_spec.rb
+++ b/spec/services/members/invite_service_spec.rb
@@ -52,8 +52,8 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids as integers' do
- let(:params) { { user_ids: [project_user.id, user_invited_by_id.id] } }
+ context 'with user_id as integers' do
+ let(:params) { { user_id: [project_user.id, user_invited_by_id.id] } }
it 'successfully creates members' do
expect_to_create_members(count: 2)
@@ -61,8 +61,8 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids as strings' do
- let(:params) { { user_ids: [project_user.id.to_s, user_invited_by_id.id.to_s] } }
+ context 'with user_id as strings' do
+ let(:params) { { user_id: [project_user.id.to_s, user_invited_by_id.id.to_s] } }
it 'successfully creates members' do
expect_to_create_members(count: 2)
@@ -70,9 +70,9 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with a mixture of emails and user_ids' do
+ context 'with a mixture of emails and user_id' do
let(:params) do
- { user_ids: [project_user.id, user_invited_by_id.id], email: %w[email@example.org email2@example.org] }
+ { user_id: [project_user.id, user_invited_by_id.id], email: %w[email@example.org email2@example.org] }
end
it 'successfully creates members' do
@@ -92,8 +92,8 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids' do
- let(:params) { { user_ids: "#{project_user.id},#{user_invited_by_id.id}" } }
+ context 'with user_id' do
+ let(:params) { { user_id: "#{project_user.id},#{user_invited_by_id.id}" } }
it 'successfully creates members' do
expect_to_create_members(count: 2)
@@ -101,9 +101,9 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with a mixture of emails and user_ids' do
+ context 'with a mixture of emails and user_id' do
let(:params) do
- { user_ids: "#{project_user.id},#{user_invited_by_id.id}", email: 'email@example.org,email2@example.org' }
+ { user_id: "#{project_user.id},#{user_invited_by_id.id}", email: 'email@example.org,email2@example.org' }
end
it 'successfully creates members' do
@@ -114,9 +114,9 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when invites formats are mixed' do
- context 'when user_ids is an array and emails is a string' do
+ context 'when user_id is an array and emails is a string' do
let(:params) do
- { user_ids: [project_user.id, user_invited_by_id.id], email: 'email@example.org,email2@example.org' }
+ { user_id: [project_user.id, user_invited_by_id.id], email: 'email@example.org,email2@example.org' }
end
it 'successfully creates members' do
@@ -125,9 +125,9 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'when user_ids is a string and emails is an array' do
+ context 'when user_id is a string and emails is an array' do
let(:params) do
- { user_ids: "#{project_user.id},#{user_invited_by_id.id}", email: %w[email@example.org email2@example.org] }
+ { user_id: "#{project_user.id},#{user_invited_by_id.id}", email: %w[email@example.org email2@example.org] }
end
it 'successfully creates members' do
@@ -147,8 +147,8 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'when user_ids are passed as an empty string' do
- let(:params) { { user_ids: '' } }
+ context 'when user_id are passed as an empty string' do
+ let(:params) { { user_id: '' } }
it 'returns an error' do
expect_not_to_create_members
@@ -156,8 +156,8 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'when user_ids and emails are both passed as empty strings' do
- let(:params) { { user_ids: '', email: '' } }
+ context 'when user_id and emails are both passed as empty strings' do
+ let(:params) { { user_id: '', email: '' } }
it 'returns an error' do
expect_not_to_create_members
@@ -166,7 +166,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when user_id is passed as an integer' do
- let(:params) { { user_ids: project_user.id } }
+ let(:params) { { user_id: project_user.id } }
it 'successfully creates member' do
expect_to_create_members(count: 1)
@@ -196,7 +196,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with user_id and singular invalid email' do
- let(:params) { { user_ids: project_user.id, email: '_bogus_' } }
+ let(:params) { { user_id: project_user.id, email: '_bogus_' } }
it 'has partial success' do
expect_to_create_members(count: 1)
@@ -219,7 +219,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with duplicate user ids' do
- let(:params) { { user_ids: "#{project_user.id},#{project_user.id}" } }
+ let(:params) { { user_id: "#{project_user.id},#{project_user.id}" } }
it 'only creates one member per unique invite' do
expect_to_create_members(count: 1)
@@ -228,7 +228,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with duplicate member by adding as user id and email' do
- let(:params) { { user_ids: project_user.id, email: project_user.email } }
+ let(:params) { { user_id: project_user.id, email: project_user.email } }
it 'only creates one member per unique invite' do
expect_to_create_members(count: 1)
@@ -269,9 +269,9 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
end
- context 'with user_ids' do
- let(:user_ids) { 1.upto(101).to_a.join(',') }
- let(:params) { { user_ids: user_ids } }
+ context 'with user_id' do
+ let(:user_id) { 1.upto(101).to_a.join(',') }
+ let(:params) { { user_id: user_id } }
it 'limits the number of users to 100' do
expect_not_to_create_members
@@ -292,7 +292,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with user_id' do
- let(:params) { { user_ids: project_user.id } }
+ let(:params) { { user_id: project_user.id } }
it_behaves_like 'records an onboarding progress action', :user_added
@@ -304,7 +304,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
context 'when assigning tasks to be done' do
let(:params) do
- { user_ids: project_user.id, tasks_to_be_done: %w(ci code), tasks_project_id: project.id }
+ { user_id: project_user.id, tasks_to_be_done: %w(ci code), tasks_project_id: project.id }
end
it 'creates 2 task issues', :aggregate_failures do
@@ -332,7 +332,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with user_id' do
- let(:params) { { user_ids: user_invited_by_id.id, access_level: -1 } }
+ let(:params) { { user_id: user_invited_by_id.id, access_level: -1 } }
it 'returns an error' do
expect_not_to_create_members
@@ -341,7 +341,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'with a mix of user_id and email' do
- let(:params) { { user_ids: user_invited_by_id.id, email: project_user.email, access_level: -1 } }
+ let(:params) { { user_id: user_invited_by_id.id, email: project_user.email, access_level: -1 } }
it 'returns errors' do
expect_not_to_create_members
@@ -387,7 +387,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
context 'with user_id that already exists' do
let!(:existing_member) { create(:project_member, project: project, user: project_user) }
- let(:params) { { user_ids: existing_member.user_id } }
+ let(:params) { { user_id: existing_member.user_id } }
it 'does not add the member again and is successful' do
expect_to_create_members(count: 0)
@@ -397,7 +397,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
context 'with user_id that already exists with a lower access_level' do
let!(:existing_member) { create(:project_member, :developer, project: project, user: project_user) }
- let(:params) { { user_ids: existing_member.user_id, access_level: ProjectMember::MAINTAINER } }
+ let(:params) { { user_id: existing_member.user_id, access_level: ProjectMember::MAINTAINER } }
it 'does not add the member again and updates the access_level' do
expect_to_create_members(count: 0)
@@ -408,7 +408,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
context 'with user_id that already exists with a higher access_level' do
let!(:existing_member) { create(:project_member, :developer, project: project, user: project_user) }
- let(:params) { { user_ids: existing_member.user_id, access_level: ProjectMember::GUEST } }
+ let(:params) { { user_id: existing_member.user_id, access_level: ProjectMember::GUEST } }
it 'does not add the member again and updates the access_level' do
expect_to_create_members(count: 0)
@@ -428,7 +428,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when access_level is lower than inheriting member' do
- let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::GUEST }}
+ let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::GUEST }}
it 'does not add the member and returns an error' do
msg = "Access level should be greater than or equal " \
@@ -440,7 +440,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when access_level is the same as the inheriting member' do
- let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::DEVELOPER }}
+ let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::DEVELOPER }}
it 'adds the member with correct access_level' do
expect_to_create_members(count: 1)
@@ -450,7 +450,7 @@ RSpec.describe Members::InviteService, :aggregate_failures, :clean_gitlab_redis_
end
context 'when access_level is greater than the inheriting member' do
- let(:params) { { user_ids: group_member.user_id, access_level: ProjectMember::MAINTAINER }}
+ let(:params) { { user_id: group_member.user_id, access_level: ProjectMember::MAINTAINER }}
it 'adds the member with correct access_level' do
expect_to_create_members(count: 1)
diff --git a/spec/services/members/projects/creator_service_spec.rb b/spec/services/members/projects/creator_service_spec.rb
index 7ba183759bc..7605238c3c5 100644
--- a/spec/services/members/projects/creator_service_spec.rb
+++ b/spec/services/members/projects/creator_service_spec.rb
@@ -3,14 +3,28 @@
require 'spec_helper'
RSpec.describe Members::Projects::CreatorService do
- it_behaves_like 'member creation' do
- let_it_be(:source, reload: true) { create(:project, :public) }
- let_it_be(:member_type) { ProjectMember }
- end
-
describe '.access_levels' do
it 'returns Gitlab::Access.sym_options_with_owner' do
expect(described_class.access_levels).to eq(Gitlab::Access.sym_options_with_owner)
end
end
+
+ describe '#execute' do
+ let_it_be(:source, reload: true) { create(:project, :public) }
+ let_it_be(:user) { create(:user) }
+
+ it_behaves_like 'member creation' do
+ let_it_be(:member_type) { ProjectMember }
+ end
+
+ context 'authorized projects update' do
+ it 'schedules a single project authorization update job when called multiple times' do
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to receive(:bulk_perform_in).once
+
+ 1.upto(3) do
+ described_class.new(source, user, :maintainer).execute
+ end
+ end
+ end
+ end
end
diff --git a/spec/services/merge_requests/approval_service_spec.rb b/spec/services/merge_requests/approval_service_spec.rb
index 9b064da44b8..e500102a00c 100644
--- a/spec/services/merge_requests/approval_service_spec.rb
+++ b/spec/services/merge_requests/approval_service_spec.rb
@@ -41,6 +41,12 @@ RSpec.describe MergeRequests::ApprovalService do
end
context 'with valid approval' do
+ let(:notification_service) { NotificationService.new }
+
+ before do
+ allow(service).to receive(:notification_service).and_return(notification_service)
+ end
+
it 'creates an approval note and marks pending todos as done' do
expect(SystemNoteService).to receive(:approve_mr).with(merge_request, user)
expect(merge_request.approvals).to receive(:reset)
@@ -59,9 +65,16 @@ RSpec.describe MergeRequests::ApprovalService do
service.execute(merge_request)
end
+ it 'sends a notification when approving' do
+ expect(notification_service).to receive_message_chain(:async, :approve_mr)
+ .with(merge_request, user)
+
+ service.execute(merge_request)
+ end
+
it 'removes attention requested state' do
expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
- .with(project: project, current_user: user, merge_request: merge_request)
+ .with(project: project, current_user: user, merge_request: merge_request, user: user)
.and_call_original
service.execute(merge_request)
diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb
index d36a2f75cfe..cd1c362a19f 100644
--- a/spec/services/merge_requests/close_service_spec.rb
+++ b/spec/services/merge_requests/close_service_spec.rb
@@ -97,7 +97,7 @@ RSpec.describe MergeRequests::CloseService do
it 'clean up environments for the merge request' do
expect_next_instance_of(::Environments::StopService) do |service|
- expect(service).to receive(:execute_for_merge_request).with(merge_request)
+ expect(service).to receive(:execute_for_merge_request_pipeline).with(merge_request)
end
described_class.new(project: project, current_user: user).execute(merge_request)
diff --git a/spec/services/merge_requests/handle_assignees_change_service_spec.rb b/spec/services/merge_requests/handle_assignees_change_service_spec.rb
index 26f53f55b0f..fa3b1614e21 100644
--- a/spec/services/merge_requests/handle_assignees_change_service_spec.rb
+++ b/spec/services/merge_requests/handle_assignees_change_service_spec.rb
@@ -89,18 +89,12 @@ RSpec.describe MergeRequests::HandleAssigneesChangeService do
it 'removes attention requested state' do
expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
- .with(project: project, current_user: user, merge_request: merge_request)
+ .with(project: project, current_user: user, merge_request: merge_request, user: user)
.and_call_original
execute
end
- it 'updates attention requested by of assignee' do
- execute
-
- expect(merge_request.find_assignee(assignee).updated_state_by).to eq(user)
- end
-
it 'tracks users assigned event' do
expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter)
.to receive(:track_users_assigned_to_mr).once.with(users: [assignee])
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index ecb856bd1a4..78deab64b1c 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -149,7 +149,7 @@ RSpec.describe MergeRequests::MergeService do
allow(project).to receive(:default_branch).and_return(merge_request.target_branch)
end
- it 'closes GitLab issue tracker issues' do
+ it 'closes GitLab issue tracker issues', :sidekiq_inline do
issue = create :issue, project: project
commit = double('commit', safe_message: "Fixes #{issue.to_reference}", date: Time.current, authored_date: Time.current)
allow(merge_request).to receive(:commits).and_return([commit])
diff --git a/spec/services/merge_requests/post_merge_service_spec.rb b/spec/services/merge_requests/post_merge_service_spec.rb
index 8d9a32c3e9e..f0885365f96 100644
--- a/spec/services/merge_requests/post_merge_service_spec.rb
+++ b/spec/services/merge_requests/post_merge_service_spec.rb
@@ -59,24 +59,9 @@ RSpec.describe MergeRequests::PostMergeService do
expect(diff_removal_service).to have_received(:execute)
end
- it 'marks MR as merged regardless of errors when closing issues' do
- merge_request.update!(target_branch: 'foo')
- allow(project).to receive(:default_branch).and_return('foo')
-
- issue = create(:issue, project: project)
- allow(merge_request).to receive(:visible_closing_issues_for).and_return([issue])
- expect_next_instance_of(Issues::CloseService) do |close_service|
- allow(close_service).to receive(:execute).with(issue, commit: merge_request).and_raise(RuntimeError)
- end
-
- expect { subject }.to raise_error(RuntimeError)
-
- expect(merge_request.reload).to be_merged
- end
-
it 'clean up environments for the merge request' do
expect_next_instance_of(::Environments::StopService) do |stop_environment_service|
- expect(stop_environment_service).to receive(:execute_for_merge_request).with(merge_request)
+ expect(stop_environment_service).to receive(:execute_for_merge_request_pipeline).with(merge_request)
end
subject
@@ -88,6 +73,67 @@ RSpec.describe MergeRequests::PostMergeService do
subject
end
+ context 'when there are issues to be closed' do
+ let_it_be(:issue) { create(:issue, project: project) }
+
+ before do
+ merge_request.update!(target_branch: 'foo')
+
+ allow(project).to receive(:default_branch).and_return('foo')
+ allow(merge_request).to receive(:visible_closing_issues_for).and_return([issue])
+ end
+
+ it 'performs MergeRequests::CloseIssueWorker asynchronously' do
+ expect(MergeRequests::CloseIssueWorker)
+ .to receive(:perform_async)
+ .with(project.id, user.id, issue.id, merge_request.id)
+
+ subject
+
+ expect(merge_request.reload).to be_merged
+ end
+
+ context 'when issue is an external issue' do
+ let_it_be(:issue) { ExternalIssue.new('JIRA-123', project) }
+
+ it 'executes Issues::CloseService' do
+ expect_next_instance_of(Issues::CloseService) do |close_service|
+ expect(close_service).to receive(:execute).with(issue, commit: merge_request)
+ end
+
+ subject
+
+ expect(merge_request.reload).to be_merged
+ end
+ end
+
+ context 'when async_mr_close_issue feature flag is disabled' do
+ before do
+ stub_feature_flags(async_mr_close_issue: false)
+ end
+
+ it 'executes Issues::CloseService' do
+ expect_next_instance_of(Issues::CloseService) do |close_service|
+ expect(close_service).to receive(:execute).with(issue, commit: merge_request)
+ end
+
+ subject
+
+ expect(merge_request.reload).to be_merged
+ end
+
+ it 'marks MR as merged regardless of errors when closing issues' do
+ expect_next_instance_of(Issues::CloseService) do |close_service|
+ allow(close_service).to receive(:execute).with(issue, commit: merge_request).and_raise(RuntimeError)
+ end
+
+ expect { subject }.to raise_error(RuntimeError)
+
+ expect(merge_request.reload).to be_merged
+ end
+ end
+ end
+
context 'when the merge request has review apps' do
it 'cancels all review app deployments' do
pipeline = create(:ci_pipeline,
diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb
index 348ea9ad7d4..338057f23d5 100644
--- a/spec/services/merge_requests/push_options_handler_service_spec.rb
+++ b/spec/services/merge_requests/push_options_handler_service_spec.rb
@@ -20,7 +20,17 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
let(:source_branch) { 'fix' }
let(:target_branch) { 'feature' }
let(:title) { 'my title' }
+ let(:draft_title) { 'Draft: my title' }
+ let(:draft) { true }
let(:description) { 'my description' }
+ let(:multiline_description) do
+ <<~MD.chomp
+ Line 1
+ Line 2
+ Line 3
+ MD
+ end
+
let(:label1) { 'mylabel1' }
let(:label2) { 'mylabel2' }
let(:label3) { 'mylabel3' }
@@ -64,6 +74,26 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
end
end
+ shared_examples_for 'a service that can set the multiline description of a merge request' do
+ subject(:last_mr) { MergeRequest.last }
+
+ it 'sets the multiline description' do
+ service.execute
+
+ expect(last_mr.description).to eq(multiline_description)
+ end
+ end
+
+ shared_examples_for 'a service that can set the draft of a merge request' do
+ subject(:last_mr) { MergeRequest.last }
+
+ it 'sets the draft' do
+ service.execute
+
+ expect(last_mr.draft).to eq(draft)
+ end
+ end
+
shared_examples_for 'a service that can set the milestone of a merge request' do
subject(:last_mr) { MergeRequest.last }
@@ -417,6 +447,74 @@ RSpec.describe MergeRequests::PushOptionsHandlerService do
it_behaves_like 'a service that does not create a merge request'
it_behaves_like 'a service that can set the description of a merge request'
+
+ context 'with a multiline description' do
+ let(:push_options) { { description: "Line 1\\nLine 2\\nLine 3" } }
+
+ it_behaves_like 'a service that does not create a merge request'
+ it_behaves_like 'a service that can set the multiline description of a merge request'
+ end
+ end
+
+ it_behaves_like 'with a deleted branch'
+ it_behaves_like 'with the project default branch'
+ end
+
+ describe '`draft` push option' do
+ let(:push_options) { { draft: draft } }
+
+ context 'with a new branch' do
+ let(:changes) { new_branch_changes }
+
+ it_behaves_like 'a service that does not create a merge request'
+
+ it 'adds an error to the service' do
+ service.execute
+
+ expect(service.errors).to include(error_mr_required)
+ end
+
+ context 'when coupled with the `create` push option' do
+ let(:push_options) { { create: true, draft: draft } }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the draft of a merge request'
+ end
+ end
+
+ context 'with an existing branch but no open MR' do
+ let(:changes) { existing_branch_changes }
+
+ it_behaves_like 'a service that does not create a merge request'
+
+ it 'adds an error to the service' do
+ service.execute
+
+ expect(service.errors).to include(error_mr_required)
+ end
+
+ context 'when coupled with the `create` push option' do
+ let(:push_options) { { create: true, draft: draft } }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the draft of a merge request'
+ end
+ end
+
+ context 'with an existing branch that has a merge request open' do
+ let(:changes) { existing_branch_changes }
+ let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
+
+ it_behaves_like 'a service that does not create a merge request'
+ it_behaves_like 'a service that can set the draft of a merge request'
+ end
+
+ context 'draft title provided while `draft` push option is set to false' do
+ let(:push_options) { { create: true, draft: false, title: draft_title } }
+ let(:changes) { new_branch_changes }
+
+ it_behaves_like 'a service that can create a merge request'
+ it_behaves_like 'a service that can set the draft of a merge request'
end
it_behaves_like 'with a deleted branch'
diff --git a/spec/services/merge_requests/rebase_service_spec.rb b/spec/services/merge_requests/rebase_service_spec.rb
index a47e626666b..e7aa6e74246 100644
--- a/spec/services/merge_requests/rebase_service_spec.rb
+++ b/spec/services/merge_requests/rebase_service_spec.rb
@@ -70,11 +70,13 @@ RSpec.describe MergeRequests::RebaseService do
it 'logs the error' do
expect(service).to receive(:log_error).with(exception: exception, message: described_class::REBASE_ERROR, save_message_on_model: true).and_call_original
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception,
- class: described_class.to_s,
- merge_request: merge_request_ref,
- merge_request_id: merge_request.id,
- message: described_class::REBASE_ERROR,
- save_message_on_model: true).and_call_original
+ {
+ class: described_class.to_s,
+ merge_request: merge_request_ref,
+ merge_request_id: merge_request.id,
+ message: described_class::REBASE_ERROR,
+ save_message_on_model: true
+ }).and_call_original
service.execute(merge_request)
end
diff --git a/spec/services/merge_requests/remove_approval_service_spec.rb b/spec/services/merge_requests/remove_approval_service_spec.rb
index ef6a0ec69bd..5a319e90a68 100644
--- a/spec/services/merge_requests/remove_approval_service_spec.rb
+++ b/spec/services/merge_requests/remove_approval_service_spec.rb
@@ -21,14 +21,20 @@ RSpec.describe MergeRequests::RemoveApprovalService do
context 'with a user who has approved' do
let!(:approval) { create(:approval, user: user, merge_request: merge_request) }
+ let(:notification_service) { NotificationService.new }
+
+ before do
+ allow(service).to receive(:notification_service).and_return(notification_service)
+ end
it 'removes the approval' do
expect { execute! }.to change { merge_request.approvals.size }.from(2).to(1)
end
- it 'creates an unapproval note and triggers web hook' do
+ it 'creates an unapproval note, triggers a web hook, and sends a notification' do
expect(service).to receive(:execute_hooks).with(merge_request, 'unapproved')
expect(SystemNoteService).to receive(:unapprove_mr)
+ expect(notification_service).to receive_message_chain(:async, :unapprove_mr).with(merge_request, user)
execute!
end
diff --git a/spec/services/merge_requests/remove_attention_requested_service_spec.rb b/spec/services/merge_requests/remove_attention_requested_service_spec.rb
index 450204ebfdd..576049b9f1b 100644
--- a/spec/services/merge_requests/remove_attention_requested_service_spec.rb
+++ b/spec/services/merge_requests/remove_attention_requested_service_spec.rb
@@ -3,64 +3,112 @@
require 'spec_helper'
RSpec.describe MergeRequests::RemoveAttentionRequestedService do
- let(:current_user) { create(:user) }
- let(:merge_request) { create(:merge_request, reviewers: [current_user], assignees: [current_user]) }
- let(:reviewer) { merge_request.find_reviewer(current_user) }
- let(:assignee) { merge_request.find_assignee(current_user) }
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:assignee_user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user], assignees: [assignee_user]) }
+
+ let(:reviewer) { merge_request.find_reviewer(user) }
+ let(:assignee) { merge_request.find_assignee(assignee_user) }
let(:project) { merge_request.project }
- let(:service) { described_class.new(project: project, current_user: current_user, merge_request: merge_request) }
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ )
+ end
+
let(:result) { service.execute }
before do
+ allow(SystemNoteService).to receive(:remove_attention_request)
+
project.add_developer(current_user)
+ project.add_developer(user)
end
describe '#execute' do
- context 'invalid permissions' do
- let(:service) { described_class.new(project: project, current_user: create(:user), merge_request: merge_request) }
+ context 'when current user cannot update merge request' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: create(:user),
+ merge_request: merge_request,
+ user: user
+ )
+ end
it 'returns an error' do
expect(result[:status]).to eq :error
end
end
- context 'reviewer does not exist' do
- let(:service) { described_class.new(project: project, current_user: create(:user), merge_request: merge_request) }
+ context 'when user is not a reviewer nor assignee' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: create(:user)
+ )
+ end
it 'returns an error' do
expect(result[:status]).to eq :error
end
end
- context 'reviewer exists' do
+ context 'when user is a reviewer' do
+ before do
+ reviewer.update!(state: :attention_requested)
+ end
+
it 'returns success' do
expect(result[:status]).to eq :success
end
- it 'updates reviewers state' do
+ it 'updates reviewer state' do
service.execute
reviewer.reload
expect(reviewer.state).to eq 'reviewed'
end
+ it 'creates a remove attention request system note' do
+ expect(SystemNoteService)
+ .to receive(:remove_attention_request)
+ .with(merge_request, merge_request.project, current_user, user)
+
+ service.execute
+ end
+
it_behaves_like 'invalidates attention request cache' do
- let(:users) { [current_user] }
+ let(:users) { [user] }
end
end
- context 'assignee exists' do
- let(:service) { described_class.new(project: project, current_user: current_user, merge_request: merge_request) }
+ context 'when user is an assignee' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: assignee_user
+ )
+ end
before do
- assignee.update!(state: :reviewed)
+ assignee.update!(state: :attention_requested)
end
it 'returns success' do
expect(result[:status]).to eq :success
end
- it 'updates assignees state' do
+ it 'updates assignee state' do
service.execute
assignee.reload
@@ -68,14 +116,40 @@ RSpec.describe MergeRequests::RemoveAttentionRequestedService do
end
it_behaves_like 'invalidates attention request cache' do
- let(:users) { [current_user] }
+ let(:users) { [assignee_user] }
+ end
+
+ it 'creates a remove attention request system note' do
+ expect(SystemNoteService)
+ .to receive(:remove_attention_request)
+ .with(merge_request, merge_request.project, current_user, assignee_user)
+
+ service.execute
end
end
- context 'assignee is the same as reviewer' do
- let(:merge_request) { create(:merge_request, reviewers: [current_user], assignees: [current_user]) }
- let(:service) { described_class.new(project: project, current_user: current_user, merge_request: merge_request) }
- let(:assignee) { merge_request.find_assignee(current_user) }
+ context 'when user is an assignee and reviewer at the same time' do
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user], assignees: [user]) }
+
+ let(:assignee) { merge_request.find_assignee(user) }
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ )
+ end
+
+ before do
+ reviewer.update!(state: :attention_requested)
+ assignee.update!(state: :attention_requested)
+ end
+
+ it 'returns success' do
+ expect(result[:status]).to eq :success
+ end
it 'updates reviewers and assignees state' do
service.execute
@@ -86,5 +160,24 @@ RSpec.describe MergeRequests::RemoveAttentionRequestedService do
expect(assignee.state).to eq 'reviewed'
end
end
+
+ context 'when state is already not attention_requested' do
+ before do
+ reviewer.update!(state: :reviewed)
+ end
+
+ it 'does not change state' do
+ service.execute
+ reviewer.reload
+
+ expect(reviewer.state).to eq 'reviewed'
+ end
+
+ it 'does not create a remove attention request system note' do
+ expect(SystemNoteService).not_to receive(:remove_attention_request)
+
+ service.execute
+ end
+ end
end
end
diff --git a/spec/services/merge_requests/request_attention_service_spec.rb b/spec/services/merge_requests/request_attention_service_spec.rb
new file mode 100644
index 00000000000..813a8150625
--- /dev/null
+++ b/spec/services/merge_requests/request_attention_service_spec.rb
@@ -0,0 +1,220 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::RequestAttentionService do
+ let_it_be(:current_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:assignee_user) { create(:user) }
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user], assignees: [assignee_user]) }
+
+ let(:reviewer) { merge_request.find_reviewer(user) }
+ let(:assignee) { merge_request.find_assignee(assignee_user) }
+ let(:project) { merge_request.project }
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ )
+ end
+
+ let(:result) { service.execute }
+ let(:todo_svc) { instance_double('TodoService') }
+ let(:notification_svc) { instance_double('NotificationService') }
+
+ before do
+ allow(service).to receive(:todo_service).and_return(todo_svc)
+ allow(service).to receive(:notification_service).and_return(notification_svc)
+ allow(todo_svc).to receive(:create_attention_requested_todo)
+ allow(notification_svc).to receive_message_chain(:async, :attention_requested_of_merge_request)
+ allow(SystemNoteService).to receive(:request_attention)
+
+ project.add_developer(current_user)
+ project.add_developer(user)
+ end
+
+ describe '#execute' do
+ context 'when current user cannot update merge request' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: create(:user),
+ merge_request: merge_request,
+ user: user
+ )
+ end
+
+ it 'returns an error' do
+ expect(result[:status]).to eq :error
+ end
+ end
+
+ context 'when user is not a reviewer nor assignee' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: create(:user)
+ )
+ end
+
+ it 'returns an error' do
+ expect(result[:status]).to eq :error
+ end
+ end
+
+ context 'when user is a reviewer' do
+ before do
+ reviewer.update!(state: :reviewed)
+ end
+
+ it 'returns success' do
+ expect(result[:status]).to eq :success
+ end
+
+ it 'updates reviewers state' do
+ service.execute
+ reviewer.reload
+
+ expect(reviewer.state).to eq 'attention_requested'
+ end
+
+ it 'adds who toggled attention' do
+ service.execute
+ reviewer.reload
+
+ expect(reviewer.updated_state_by).to eq current_user
+ end
+
+ it 'creates a new todo for the reviewer' do
+ expect(todo_svc).to receive(:create_attention_requested_todo).with(merge_request, current_user, user)
+
+ service.execute
+ end
+
+ it 'sends email to reviewer' do
+ expect(notification_svc)
+ .to receive_message_chain(:async, :attention_requested_of_merge_request)
+ .with(merge_request, current_user, user)
+
+ service.execute
+ end
+
+ it 'removes attention requested state' do
+ expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
+ .with(project: project, current_user: current_user, merge_request: merge_request, user: current_user)
+ .and_call_original
+
+ service.execute
+ end
+
+ it_behaves_like 'invalidates attention request cache' do
+ let(:users) { [user] }
+ end
+ end
+
+ context 'when user is an assignee' do
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: assignee_user
+ )
+ end
+
+ before do
+ assignee.update!(state: :reviewed)
+ end
+
+ it 'returns success' do
+ expect(result[:status]).to eq :success
+ end
+
+ it 'updates assignees state' do
+ service.execute
+ assignee.reload
+
+ expect(assignee.state).to eq 'attention_requested'
+ end
+
+ it 'creates a new todo for the reviewer' do
+ expect(todo_svc).to receive(:create_attention_requested_todo).with(merge_request, current_user, assignee_user)
+
+ service.execute
+ end
+
+ it 'creates a request attention system note' do
+ expect(SystemNoteService)
+ .to receive(:request_attention)
+ .with(merge_request, merge_request.project, current_user, assignee_user)
+
+ service.execute
+ end
+
+ it 'removes attention requested state' do
+ expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
+ .with(project: project, current_user: current_user, merge_request: merge_request, user: current_user)
+ .and_call_original
+
+ service.execute
+ end
+
+ it_behaves_like 'invalidates attention request cache' do
+ let(:users) { [assignee_user] }
+ end
+ end
+
+ context 'when user is an assignee and reviewer at the same time' do
+ let_it_be(:merge_request) { create(:merge_request, reviewers: [user], assignees: [user]) }
+
+ let(:assignee) { merge_request.find_assignee(user) }
+
+ let(:service) do
+ described_class.new(
+ project: project,
+ current_user: current_user,
+ merge_request: merge_request,
+ user: user
+ )
+ end
+
+ before do
+ reviewer.update!(state: :reviewed)
+ assignee.update!(state: :reviewed)
+ end
+
+ it 'updates reviewers and assignees state' do
+ service.execute
+ reviewer.reload
+ assignee.reload
+
+ expect(reviewer.state).to eq 'attention_requested'
+ expect(assignee.state).to eq 'attention_requested'
+ end
+ end
+
+ context 'when state is attention_requested' do
+ before do
+ reviewer.update!(state: :attention_requested)
+ end
+
+ it 'does not change state' do
+ service.execute
+ reviewer.reload
+
+ expect(reviewer.state).to eq 'attention_requested'
+ end
+
+ it 'does not create a new todo for the reviewer' do
+ expect(todo_svc).not_to receive(:create_attention_requested_todo).with(merge_request, current_user, user)
+
+ service.execute
+ end
+ end
+ end
+end
diff --git a/spec/services/merge_requests/squash_service_spec.rb b/spec/services/merge_requests/squash_service_spec.rb
index 387be8471b5..9210242a11e 100644
--- a/spec/services/merge_requests/squash_service_spec.rb
+++ b/spec/services/merge_requests/squash_service_spec.rb
@@ -222,11 +222,13 @@ RSpec.describe MergeRequests::SquashService do
it 'logs the error' do
expect(service).to receive(:log_error).with(exception: exception, message: 'Failed to squash merge request').and_call_original
expect(Gitlab::ErrorTracking).to receive(:track_exception).with(exception,
- class: described_class.to_s,
- merge_request: merge_request_ref,
- merge_request_id: merge_request.id,
- message: 'Failed to squash merge request',
- save_message_on_model: false).and_call_original
+ {
+ class: described_class.to_s,
+ merge_request: merge_request_ref,
+ merge_request_id: merge_request.id,
+ message: 'Failed to squash merge request',
+ save_message_on_model: false
+ }).and_call_original
service.execute
end
diff --git a/spec/services/merge_requests/toggle_attention_requested_service_spec.rb b/spec/services/merge_requests/toggle_attention_requested_service_spec.rb
index dcaac5d2699..20bc536b21e 100644
--- a/spec/services/merge_requests/toggle_attention_requested_service_spec.rb
+++ b/spec/services/merge_requests/toggle_attention_requested_service_spec.rb
@@ -80,7 +80,7 @@ RSpec.describe MergeRequests::ToggleAttentionRequestedService do
it 'removes attention requested state' do
expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
- .with(project: project, current_user: current_user, merge_request: merge_request)
+ .with(project: project, current_user: current_user, merge_request: merge_request, user: current_user)
.and_call_original
service.execute
@@ -129,7 +129,7 @@ RSpec.describe MergeRequests::ToggleAttentionRequestedService do
it 'removes attention requested state' do
expect(MergeRequests::RemoveAttentionRequestedService).to receive(:new)
- .with(project: project, current_user: current_user, merge_request: merge_request)
+ .with(project: project, current_user: current_user, merge_request: merge_request, user: current_user)
.and_call_original
service.execute
diff --git a/spec/services/merge_requests/update_assignees_service_spec.rb b/spec/services/merge_requests/update_assignees_service_spec.rb
index 3a0b17c2768..f5f6f0ca301 100644
--- a/spec/services/merge_requests/update_assignees_service_spec.rb
+++ b/spec/services/merge_requests/update_assignees_service_spec.rb
@@ -113,6 +113,49 @@ RSpec.describe MergeRequests::UpdateAssigneesService do
expect { service.execute(merge_request) }
.to issue_fewer_queries_than { update_service.execute(other_mr) }
end
+
+ context 'setting state of assignees' do
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it 'does not set state as attention_requested if feature flag is disabled' do
+ update_merge_request
+
+ expect(merge_request.merge_request_assignees[0].state).not_to eq('attention_requested')
+ end
+
+ context 'feature flag is enabled for current_user' do
+ before do
+ stub_feature_flags(mr_attention_requests: user)
+ end
+
+ it 'sets state as attention_requested' do
+ update_merge_request
+
+ expect(merge_request.merge_request_assignees[0].state).to eq('attention_requested')
+ expect(merge_request.merge_request_assignees[0].updated_state_by).to eq(user)
+ end
+
+ it 'uses reviewers state if it is same user as new assignee' do
+ merge_request.reviewers << user2
+
+ update_merge_request
+
+ expect(merge_request.merge_request_assignees[0].state).to eq('unreviewed')
+ end
+
+ context 'when assignee_ids matches existing assignee' do
+ let(:opts) { { assignee_ids: [user3.id] } }
+
+ it 'keeps original assignees state' do
+ update_merge_request
+
+ expect(merge_request.find_assignee(user3).state).to eq('unreviewed')
+ end
+ end
+ end
+ end
end
end
end
diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb
index 30095ebeb50..7164ba8fac0 100644
--- a/spec/services/merge_requests/update_service_spec.rb
+++ b/spec/services/merge_requests/update_service_spec.rb
@@ -328,6 +328,49 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
update_merge_request(reviewer_ids: [user.id])
end
+
+ context 'setting state of reviewers' do
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it 'does not set state as attention_requested if feature flag is disabled' do
+ update_merge_request(reviewer_ids: [user.id])
+
+ expect(merge_request.merge_request_reviewers[0].state).not_to eq('attention_requested')
+ end
+
+ context 'feature flag is enabled for current_user' do
+ before do
+ stub_feature_flags(mr_attention_requests: user)
+ end
+
+ it 'sets state as attention_requested' do
+ update_merge_request(reviewer_ids: [user2.id])
+
+ expect(merge_request.merge_request_reviewers[0].state).to eq('attention_requested')
+ expect(merge_request.merge_request_reviewers[0].updated_state_by).to eq(user)
+ end
+
+ it 'keeps original reviewers state' do
+ merge_request.find_reviewer(user2).update!(state: :unreviewed)
+
+ update_merge_request({
+ reviewer_ids: [user2.id]
+ })
+
+ expect(merge_request.find_reviewer(user2).state).to eq('unreviewed')
+ end
+
+ it 'uses reviewers state if it is same user as new assignee' do
+ merge_request.assignees << user
+
+ update_merge_request(reviewer_ids: [user.id])
+
+ expect(merge_request.merge_request_reviewers[0].state).to eq('unreviewed')
+ end
+ end
+ end
end
it 'creates a resource label event' do
@@ -1066,6 +1109,53 @@ RSpec.describe MergeRequests::UpdateService, :mailer do
end
end
end
+
+ context 'setting state of assignees' do
+ before do
+ stub_feature_flags(mr_attention_requests: false)
+ end
+
+ it 'does not set state as attention_requested if feature flag is disabled' do
+ update_merge_request({
+ assignee_ids: [user2.id]
+ })
+
+ expect(merge_request.merge_request_assignees[0].state).not_to eq('attention_requested')
+ end
+
+ context 'feature flag is enabled for current_user' do
+ before do
+ stub_feature_flags(mr_attention_requests: user)
+ end
+
+ it 'sets state as attention_requested' do
+ update_merge_request({
+ assignee_ids: [user2.id]
+ })
+
+ expect(merge_request.merge_request_assignees[0].state).to eq('attention_requested')
+ expect(merge_request.merge_request_assignees[0].updated_state_by).to eq(user)
+ end
+
+ it 'keeps original assignees state' do
+ update_merge_request({
+ assignee_ids: [user3.id]
+ })
+
+ expect(merge_request.find_assignee(user3).state).to eq('unreviewed')
+ end
+
+ it 'uses reviewers state if it is same user as new assignee' do
+ merge_request.reviewers << user2
+
+ update_merge_request({
+ assignee_ids: [user2.id]
+ })
+
+ expect(merge_request.merge_request_assignees[0].state).to eq('unreviewed')
+ end
+ end
+ end
end
context 'when adding time spent' do
diff --git a/spec/services/namespaces/in_product_marketing_email_records_spec.rb b/spec/services/namespaces/in_product_marketing_email_records_spec.rb
deleted file mode 100644
index d80e20135d5..00000000000
--- a/spec/services/namespaces/in_product_marketing_email_records_spec.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Namespaces::InProductMarketingEmailRecords do
- let_it_be(:user) { create :user }
-
- subject(:records) { described_class.new }
-
- it 'initializes records' do
- expect(subject.records).to match_array []
- end
-
- describe '#save!' do
- before do
- allow(Users::InProductMarketingEmail).to receive(:bulk_insert!)
-
- records.add(user, :team_short, 0)
- records.add(user, :create, 1)
- end
-
- it 'bulk inserts added records' do
- expect(Users::InProductMarketingEmail).to receive(:bulk_insert!).with(records.records)
- records.save!
- end
-
- it 'resets its records' do
- records.save!
- expect(records.records).to match_array []
- end
- end
-
- describe '#add' do
- it 'adds a Users::InProductMarketingEmail record to its records' do
- freeze_time do
- records.add(user, :team_short, 0)
- records.add(user, :create, 1)
-
- first, second = records.records
-
- expect(first).to be_a Users::InProductMarketingEmail
- expect(first.track.to_sym).to eq :team_short
- expect(first.series).to eq 0
- expect(first.created_at).to eq Time.zone.now
- expect(first.updated_at).to eq Time.zone.now
-
- expect(second).to be_a Users::InProductMarketingEmail
- expect(second.track.to_sym).to eq :create
- expect(second.series).to eq 1
- expect(second.created_at).to eq Time.zone.now
- expect(second.updated_at).to eq Time.zone.now
- end
- end
- end
-end
diff --git a/spec/services/namespaces/package_settings/update_service_spec.rb b/spec/services/namespaces/package_settings/update_service_spec.rb
index 030bc03038e..ed385f1cd7f 100644
--- a/spec/services/namespaces/package_settings/update_service_spec.rb
+++ b/spec/services/namespaces/package_settings/update_service_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe ::Namespaces::PackageSettings::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'updating the namespace package setting'
- :developer | 'updating the namespace package setting'
+ :developer | 'denying access to namespace package setting'
:reporter | 'denying access to namespace package setting'
:guest | 'denying access to namespace package setting'
:anonymous | 'denying access to namespace package setting'
@@ -91,7 +91,7 @@ RSpec.describe ::Namespaces::PackageSettings::UpdateService do
where(:user_role, :shared_examples_name) do
:maintainer | 'creating the namespace package setting'
- :developer | 'creating the namespace package setting'
+ :developer | 'denying access to namespace package setting'
:reporter | 'denying access to namespace package setting'
:guest | 'denying access to namespace package setting'
:anonymous | 'denying access to namespace package setting'
diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb
index b0410123630..c72a9465f20 100644
--- a/spec/services/notes/create_service_spec.rb
+++ b/spec/services/notes/create_service_spec.rb
@@ -168,7 +168,6 @@ RSpec.describe Notes::CreateService do
before do
project_with_repo.add_maintainer(user)
end
-
context 'when eligible to have a note diff file' do
let(:new_opts) do
opts.merge(in_reply_to_discussion_id: nil,
@@ -196,6 +195,39 @@ RSpec.describe Notes::CreateService do
described_class.new(project_with_repo, user, new_opts).execute(skip_capture_diff_note_position: true)
end
end
+
+ it 'does not track ipynb note usage data' do
+ expect(::Gitlab::UsageDataCounters::IpynbDiffActivityCounter).not_to receive(:note_created)
+
+ described_class.new(project_with_repo, user, new_opts).execute
+ end
+
+ context 'is ipynb file' do
+ before do
+ allow_any_instance_of(::Gitlab::Diff::File).to receive(:ipynb?).and_return(true)
+ stub_feature_flags(ipynbdiff_notes_tracker: false)
+ end
+
+ context ':ipynbdiff_notes_tracker is off' do
+ it 'does not track ipynb note usage data' do
+ expect(::Gitlab::UsageDataCounters::IpynbDiffActivityCounter).not_to receive(:note_created)
+
+ described_class.new(project_with_repo, user, new_opts).execute
+ end
+ end
+
+ context ':ipynbdiff_notes_tracker is on' do
+ before do
+ stub_feature_flags(ipynbdiff_notes_tracker: true)
+ end
+
+ it 'tracks ipynb diff note creation' do
+ expect(::Gitlab::UsageDataCounters::IpynbDiffActivityCounter).to receive(:note_created)
+
+ described_class.new(project_with_repo, user, new_opts).execute
+ end
+ end
+ end
end
context 'when DiffNote is a reply' do
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index d2d55c5ab79..743a04eabe6 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -1869,6 +1869,61 @@ RSpec.describe NotificationService, :mailer do
let(:notification_trigger) { notification.new_merge_request(merge_request, @u_disabled) }
end
+ describe 'Approvals' do
+ let(:notification_target) { merge_request }
+ let(:maintainer) { create(:user) }
+
+ describe '#approve_mr' do
+ it 'will notify the author, subscribers, and assigned users' do
+ notification.approve_mr(merge_request, maintainer)
+
+ merge_request.assignees.each { |assignee| should_email(assignee) }
+ should_email(merge_request.author)
+ should_email(@u_watcher)
+ should_email(@u_participant_mentioned)
+ should_email(@subscribed_participant)
+ should_email(@subscriber)
+ should_email(@watcher_and_subscriber)
+ should_email(@u_guest_watcher)
+
+ should_not_email(@unsubscriber)
+ should_not_email(@u_participating)
+ should_not_email(@u_disabled)
+ should_not_email(@u_lazy_participant)
+
+ expect(email_recipients.size).to eq(8)
+ # assignee, author, @u_watcher,
+ # @u_participant_mentioned, @subscribed_participant,
+ # @subscriber, @watcher_and_subscriber, @u_guest_watcher
+ end
+ end
+
+ describe '#unapprove_mr' do
+ it 'will notify the author, subscribers, and assigned users' do
+ notification.unapprove_mr(merge_request, maintainer)
+
+ merge_request.assignees.each { |assignee| should_email(assignee) }
+ should_email(merge_request.author)
+ should_email(@u_watcher)
+ should_email(@u_participant_mentioned)
+ should_email(@subscribed_participant)
+ should_email(@subscriber)
+ should_email(@watcher_and_subscriber)
+ should_email(@u_guest_watcher)
+
+ should_not_email(@unsubscriber)
+ should_not_email(@u_participating)
+ should_not_email(@u_disabled)
+ should_not_email(@u_lazy_participant)
+
+ expect(email_recipients.size).to eq(8)
+ # assignee, author, @u_watcher,
+ # @u_participant_mentioned, @subscribed_participant,
+ # @subscriber, @watcher_and_subscriber, @u_guest_watcher
+ end
+ end
+ end
+
context 'participating' do
it_behaves_like 'participating by assignee notification' do
let(:participant) { create(:user, username: 'user-participant')}
@@ -3653,6 +3708,26 @@ RSpec.describe NotificationService, :mailer do
end
end
+ describe '#inactive_project_deletion_warning' do
+ let_it_be(:deletion_date) { Date.current }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:maintainer) { create(:user) }
+ let_it_be(:developer) { create(:user) }
+
+ before do
+ project.add_maintainer(maintainer)
+ end
+
+ subject { notification.inactive_project_deletion_warning(project, deletion_date) }
+
+ it "sends email to project owners and maintainers" do
+ expect { subject }.to have_enqueued_email(project, maintainer, deletion_date,
+ mail: "inactive_project_deletion_warning_email")
+ expect { subject }.not_to have_enqueued_email(project, developer, deletion_date,
+ mail: "inactive_project_deletion_warning_email")
+ end
+ end
+
def build_team(project)
@u_watcher = create_global_setting_for(create(:user), :watch)
@u_participating = create_global_setting_for(create(:user), :participating)
diff --git a/spec/services/projects/after_import_service_spec.rb b/spec/services/projects/after_import_service_spec.rb
deleted file mode 100644
index a16aec891a9..00000000000
--- a/spec/services/projects/after_import_service_spec.rb
+++ /dev/null
@@ -1,131 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::AfterImportService do
- include GitHelpers
-
- subject { described_class.new(project) }
-
- let(:project) { create(:project, :repository) }
- let(:repository) { project.repository }
- let(:sha) { project.commit.sha }
- let(:housekeeping_service) { double(:housekeeping_service) }
-
- describe '#execute' do
- before do
- allow(Repositories::HousekeepingService)
- .to receive(:new).with(project).and_return(housekeeping_service)
-
- allow(housekeeping_service)
- .to receive(:execute).and_yield
-
- allow(housekeeping_service).to receive(:increment!)
- end
-
- it 'performs housekeeping' do
- subject.execute
-
- expect(housekeeping_service).to have_received(:execute)
- end
-
- context 'with some refs in refs/pull/**/*' do
- before do
- repository.write_ref('refs/pull/1/head', sha)
- repository.write_ref('refs/pull/1/merge', sha)
-
- subject.execute
- end
-
- it 'removes refs/pull/**/*' do
- expect(rugged.references.map(&:name))
- .not_to include(%r{\Arefs/pull/})
- end
- end
-
- Repository::RESERVED_REFS_NAMES.each do |name|
- context "with a ref in refs/#{name}/tmp" do
- before do
- repository.write_ref("refs/#{name}/tmp", sha)
-
- subject.execute
- end
-
- it "does not remove refs/#{name}/tmp" do
- expect(rugged.references.map(&:name))
- .to include("refs/#{name}/tmp")
- end
- end
- end
-
- context 'when after import action throw non-retriable exception' do
- let(:exception) { StandardError.new('after import error') }
-
- before do
- allow(repository)
- .to receive(:delete_all_refs_except)
- .and_raise(exception)
- end
-
- it 'throws after import error' do
- expect { subject.execute }.to raise_exception('after import error')
- end
- end
-
- context 'when housekeeping service lease is taken' do
- let(:exception) { Repositories::HousekeepingService::LeaseTaken.new }
-
- it 'logs the error message' do
- allow_next_instance_of(Repositories::HousekeepingService) do |instance|
- expect(instance).to receive(:execute).and_raise(exception)
- end
-
- expect(Gitlab::Import::Logger).to receive(:info).with(
- {
- message: 'Project housekeeping failed',
- project_full_path: project.full_path,
- project_id: project.id,
- 'error.message' => exception.to_s
- }).and_call_original
-
- subject.execute
- end
- end
-
- context 'when after import action throw retriable exception one time' do
- let(:exception) { GRPC::DeadlineExceeded.new }
-
- before do
- expect(repository)
- .to receive(:delete_all_refs_except)
- .and_raise(exception)
- expect(repository)
- .to receive(:delete_all_refs_except)
- .and_call_original
-
- subject.execute
- end
-
- it 'removes refs/pull/**/*' do
- expect(rugged.references.map(&:name))
- .not_to include(%r{\Arefs/pull/})
- end
-
- it 'records the failures in the database', :aggregate_failures do
- import_failure = ImportFailure.last
-
- expect(import_failure.source).to eq('delete_all_refs')
- expect(import_failure.project_id).to eq(project.id)
- expect(import_failure.relation_key).to be_nil
- expect(import_failure.relation_index).to be_nil
- expect(import_failure.exception_class).to eq('GRPC::DeadlineExceeded')
- expect(import_failure.exception_message).to be_present
- expect(import_failure.correlation_id_value).not_to be_empty
- end
- end
-
- def rugged
- rugged_repo(repository)
- end
- end
-end
diff --git a/spec/services/projects/android_target_platform_detector_service_spec.rb b/spec/services/projects/android_target_platform_detector_service_spec.rb
new file mode 100644
index 00000000000..74fd320bb48
--- /dev/null
+++ b/spec/services/projects/android_target_platform_detector_service_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::AndroidTargetPlatformDetectorService do
+ let_it_be(:project) { build(:project) }
+
+ subject { described_class.new(project).execute }
+
+ before do
+ allow(Gitlab::FileFinder).to receive(:new) { finder }
+ end
+
+ context 'when project is not an Android project' do
+ let(:finder) { instance_double(Gitlab::FileFinder, find: []) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when project is an Android project' do
+ let(:finder) { instance_double(Gitlab::FileFinder) }
+
+ before do
+ query = described_class::MANIFEST_FILE_SEARCH_QUERY
+ allow(finder).to receive(:find).with(query) { [instance_double(Gitlab::Search::FoundBlob)] }
+ end
+
+ it { is_expected.to eq :android }
+ end
+end
diff --git a/spec/services/projects/batch_open_issues_count_service_spec.rb b/spec/services/projects/batch_open_issues_count_service_spec.rb
index 17bd5f7a37b..89a4abbf9c9 100644
--- a/spec/services/projects/batch_open_issues_count_service_spec.rb
+++ b/spec/services/projects/batch_open_issues_count_service_spec.rb
@@ -5,7 +5,6 @@ require 'spec_helper'
RSpec.describe Projects::BatchOpenIssuesCountService do
let!(:project_1) { create(:project) }
let!(:project_2) { create(:project) }
- let!(:banned_user) { create(:user, :banned) }
let(:subject) { described_class.new([project_1, project_2]) }
@@ -13,41 +12,32 @@ RSpec.describe Projects::BatchOpenIssuesCountService do
before do
create(:issue, project: project_1)
create(:issue, project: project_1, confidential: true)
- create(:issue, project: project_1, author: banned_user)
+
create(:issue, project: project_2)
create(:issue, project: project_2, confidential: true)
- create(:issue, project: project_2, author: banned_user)
end
- context 'when cache is clean', :aggregate_failures do
+ context 'when cache is clean' do
it 'refreshes cache keys correctly' do
- expect(get_cache_key(project_1)).to eq(nil)
- expect(get_cache_key(project_2)).to eq(nil)
-
- subject.count_service.new(project_1).refresh_cache
- subject.count_service.new(project_2).refresh_cache
-
- expect(get_cache_key(project_1)).to eq(1)
- expect(get_cache_key(project_2)).to eq(1)
+ subject.refresh_cache_and_retrieve_data
- expect(get_cache_key(project_1, true)).to eq(2)
- expect(get_cache_key(project_2, true)).to eq(2)
+ # It does not update total issues cache
+ expect(Rails.cache.read(get_cache_key(subject, project_1))).to eq(nil)
+ expect(Rails.cache.read(get_cache_key(subject, project_2))).to eq(nil)
- expect(get_cache_key(project_1, true, true)).to eq(3)
- expect(get_cache_key(project_2, true, true)).to eq(3)
+ expect(Rails.cache.read(get_cache_key(subject, project_1, true))).to eq(1)
+ expect(Rails.cache.read(get_cache_key(subject, project_1, true))).to eq(1)
end
end
end
- def get_cache_key(project, with_confidential = false, with_hidden = false)
+ def get_cache_key(subject, project, public_key = false)
service = subject.count_service.new(project)
- if with_confidential && with_hidden
- Rails.cache.read(service.cache_key(service.class::TOTAL_COUNT_KEY))
- elsif with_confidential
- Rails.cache.read(service.cache_key(service.class::TOTAL_COUNT_WITHOUT_HIDDEN_KEY))
+ if public_key
+ service.cache_key(service.class::PUBLIC_COUNT_KEY)
else
- Rails.cache.read(service.cache_key(service.class::PUBLIC_COUNT_WITHOUT_HIDDEN_KEY))
+ service.cache_key(service.class::TOTAL_COUNT_KEY)
end
end
end
diff --git a/spec/services/projects/blame_service_spec.rb b/spec/services/projects/blame_service_spec.rb
new file mode 100644
index 00000000000..40b2bc869dc
--- /dev/null
+++ b/spec/services/projects/blame_service_spec.rb
@@ -0,0 +1,129 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::BlameService, :aggregate_failures do
+ subject(:service) { described_class.new(blob, commit, params) }
+
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:commit) { project.repository.commit }
+ let_it_be(:blob) { project.repository.blob_at('HEAD', 'README.md') }
+
+ let(:params) { { page: page } }
+ let(:page) { nil }
+
+ before do
+ stub_const("#{described_class.name}::PER_PAGE", 2)
+ end
+
+ describe '#blame' do
+ subject { service.blame }
+
+ it 'returns a correct Gitlab::Blame object' do
+ is_expected.to be_kind_of(Gitlab::Blame)
+
+ expect(subject.blob).to eq(blob)
+ expect(subject.commit).to eq(commit)
+ expect(subject.range).to eq(1..2)
+ end
+
+ describe 'Pagination range calculation' do
+ subject { service.blame.range }
+
+ context 'with page = 1' do
+ let(:page) { 1 }
+
+ it { is_expected.to eq(1..2) }
+ end
+
+ context 'with page = 2' do
+ let(:page) { 2 }
+
+ it { is_expected.to eq(3..4) }
+ end
+
+ context 'with page = 3 (overlimit)' do
+ let(:page) { 3 }
+
+ it { is_expected.to eq(1..2) }
+ end
+
+ context 'with page = 0 (incorrect)' do
+ let(:page) { 0 }
+
+ it { is_expected.to eq(1..2) }
+ end
+
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(blame_page_pagination: false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+ end
+ end
+
+ describe '#pagination' do
+ subject { service.pagination }
+
+ it 'returns a pagination object' do
+ is_expected.to be_kind_of(Kaminari::PaginatableArray)
+
+ expect(subject.current_page).to eq(1)
+ expect(subject.total_pages).to eq(2)
+ expect(subject.total_count).to eq(4)
+ end
+
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(blame_page_pagination: false)
+ end
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when per_page is above the global max per page limit' do
+ before do
+ stub_const("#{described_class.name}::PER_PAGE", 1000)
+ allow(blob).to receive_message_chain(:data, :lines, :count) { 500 }
+ end
+
+ it 'returns a correct pagination object' do
+ is_expected.to be_kind_of(Kaminari::PaginatableArray)
+
+ expect(subject.current_page).to eq(1)
+ expect(subject.total_pages).to eq(1)
+ expect(subject.total_count).to eq(500)
+ 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) }
+ 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) }
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
index 86c0ba4222c..79904e2bf72 100644
--- a/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/cleanup_tags_service_spec.rb
@@ -34,8 +34,6 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService, :clean_gitlab_
stub_digest_config('sha256:configB', 5.days.ago)
stub_digest_config('sha256:configC', 1.month.ago)
stub_digest_config('sha256:configD', nil)
-
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
end
describe '#execute' do
@@ -334,24 +332,17 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService, :clean_gitlab_
end
end
- where(:feature_flag_enabled, :max_list_size, :delete_tags_service_status, :expected_status, :expected_truncated) do
- false | 10 | :success | :success | false
- false | 10 | :error | :error | false
- false | 3 | :success | :success | false
- false | 3 | :error | :error | false
- false | 0 | :success | :success | false
- false | 0 | :error | :error | false
- true | 10 | :success | :success | false
- true | 10 | :error | :error | false
- true | 3 | :success | :error | true
- true | 3 | :error | :error | true
- true | 0 | :success | :success | false
- true | 0 | :error | :error | false
+ where(:max_list_size, :delete_tags_service_status, :expected_status, :expected_truncated) do
+ 10 | :success | :success | false
+ 10 | :error | :error | false
+ 3 | :success | :error | true
+ 3 | :error | :error | true
+ 0 | :success | :success | false
+ 0 | :error | :error | false
end
with_them do
before do
- stub_feature_flags(container_registry_expiration_policies_throttling: feature_flag_enabled)
stub_application_setting(container_registry_cleanup_tags_service_max_list_size: max_list_size)
allow_next_instance_of(Projects::ContainerRepository::DeleteTagsService) do |service|
expect(service).to receive(:execute).and_return(status: delete_tags_service_status)
@@ -429,10 +420,10 @@ RSpec.describe Projects::ContainerRepository::CleanupTagsService, :clean_gitlab_
end
# We will ping the container registry for all tags *except* for C because it's cached
- expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configA").and_call_original
- expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configB").twice.and_call_original
- expect(ContainerRegistry::Blob).not_to receive(:new).with(repository, "digest" => "sha256:configC")
- expect(ContainerRegistry::Blob).to receive(:new).with(repository, "digest" => "sha256:configD").and_call_original
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, { "digest" => "sha256:configA" }).and_call_original
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, { "digest" => "sha256:configB" }).twice.and_call_original
+ expect(ContainerRegistry::Blob).not_to receive(:new).with(repository, { "digest" => "sha256:configC" })
+ expect(ContainerRegistry::Blob).to receive(:new).with(repository, { "digest" => "sha256:configD" }).and_call_original
expect(subject).to include(cached_tags_count: 1)
end
diff --git a/spec/services/projects/container_repository/delete_tags_service_spec.rb b/spec/services/projects/container_repository/delete_tags_service_spec.rb
index 246ca301cfa..9e6849aa514 100644
--- a/spec/services/projects/container_repository/delete_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/delete_tags_service_spec.rb
@@ -3,6 +3,7 @@
require 'spec_helper'
RSpec.describe Projects::ContainerRepository::DeleteTagsService do
+ using RSpec::Parameterized::TableSyntax
include_context 'container repository delete tags service shared context'
let(:service) { described_class.new(project, user, params) }
@@ -17,11 +18,13 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
shared_examples 'logging a success response' do
it 'logs an info message' do
expect(service).to receive(:log_info).with(
- service_class: 'Projects::ContainerRepository::DeleteTagsService',
- message: 'deleted tags',
- container_repository_id: repository.id,
- project_id: repository.project_id,
- deleted_tags_count: tags.size
+ {
+ service_class: 'Projects::ContainerRepository::DeleteTagsService',
+ message: 'deleted tags',
+ container_repository_id: repository.id,
+ project_id: repository.project_id,
+ deleted_tags_count: tags.size
+ }
)
subject
@@ -131,10 +134,6 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
subject { service.execute(repository) }
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
- end
-
context 'without permissions' do
it { is_expected.to include(status: :error) }
end
@@ -157,11 +156,39 @@ RSpec.describe Projects::ContainerRepository::DeleteTagsService do
end
context 'when the repository is importing' do
- before do
- repository.update_columns(migration_state: 'importing', migration_import_started_at: Time.zone.now)
+ where(:migration_state, :called_by_policy, :error_expected) do
+ 'default' | false | false
+ 'default' | true | false
+ 'pre_importing' | false | false
+ 'pre_importing' | true | true
+ 'pre_import_done' | false | false
+ 'pre_import_done' | true | true
+ 'importing' | false | true
+ 'importing' | true | true
+ 'import_done' | false | false
+ 'import_done' | true | false
+ 'import_aborted' | false | false
+ 'import_aborted' | true | false
+ 'import_skipped' | false | false
+ 'import_skipped' | true | false
end
- it { is_expected.to include(status: :error, message: 'repository importing') }
+ with_them do
+ let(:params) { { tags: tags, container_expiration_policy: called_by_policy ? true : nil } }
+
+ before do
+ repository.update_columns(migration_state: migration_state, migration_import_started_at: Time.zone.now, migration_pre_import_started_at: Time.zone.now, migration_pre_import_done_at: Time.zone.now)
+ end
+
+ it 'returns an error response if expected' do
+ if error_expected
+ expect(subject).to include(status: :error, message: 'repository importing')
+ else
+ expect(service).to receive(:delete_tags).and_return(status: :success)
+ expect(subject).not_to include(status: :error)
+ end
+ end
+ end
end
end
diff --git a/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb b/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb
index 74f782538c5..8d8907119f0 100644
--- a/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb
+++ b/spec/services/projects/container_repository/gitlab/delete_tags_service_spec.rb
@@ -12,10 +12,6 @@ RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do
subject { service.execute }
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
- end
-
RSpec.shared_examples 'deleting tags' do
it 'deletes the tags by name' do
stub_delete_reference_requests(tags)
@@ -26,6 +22,8 @@ RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do
end
context 'with tags to delete' do
+ let(:timeout) { 10 }
+
it_behaves_like 'deleting tags'
it 'succeeds when tag delete returns 404' do
@@ -50,59 +48,52 @@ RSpec.describe Projects::ContainerRepository::Gitlab::DeleteTagsService do
end
end
- context 'with throttling enabled' do
- let(:timeout) { 10 }
-
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: true)
- stub_application_setting(container_registry_delete_tags_service_timeout: timeout)
- end
-
- it_behaves_like 'deleting tags'
+ before do
+ stub_application_setting(container_registry_delete_tags_service_timeout: timeout)
+ end
- context 'with timeout' do
- context 'set to a valid value' do
- before do
- allow(Time.zone).to receive(:now).and_return(10, 15, 25) # third call to Time.zone.now will be triggering the timeout
- stub_delete_reference_requests('A' => 200)
- end
+ context 'with timeout' do
+ context 'set to a valid value' do
+ before do
+ allow(Time.zone).to receive(:now).and_return(10, 15, 25) # third call to Time.zone.now will be triggering the timeout
+ stub_delete_reference_requests('A' => 200)
+ end
- it { is_expected.to eq(status: :error, message: 'error while deleting tags', deleted: ['A'], exception_class_name: Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError.name) }
+ it { is_expected.to eq(status: :error, message: 'error while deleting tags', deleted: ['A'], exception_class_name: Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError.name) }
- it 'tracks the exception' do
- expect(::Gitlab::ErrorTracking)
- .to receive(:track_exception).with(::Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError, tags_count: tags.size, container_repository_id: repository.id)
+ it 'tracks the exception' do
+ expect(::Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(::Projects::ContainerRepository::Gitlab::DeleteTagsService::TimeoutError, tags_count: tags.size, container_repository_id: repository.id)
- subject
- end
+ subject
end
+ end
- context 'set to 0' do
- let(:timeout) { 0 }
+ context 'set to 0' do
+ let(:timeout) { 0 }
- it_behaves_like 'deleting tags'
- end
+ it_behaves_like 'deleting tags'
+ end
- context 'set to nil' do
- let(:timeout) { nil }
+ context 'set to nil' do
+ let(:timeout) { nil }
- it_behaves_like 'deleting tags'
- end
+ it_behaves_like 'deleting tags'
end
+ end
- context 'with a network error' do
- before do
- expect(service).to receive(:delete_tags).and_raise(::Faraday::TimeoutError)
- end
+ context 'with a network error' do
+ before do
+ expect(service).to receive(:delete_tags).and_raise(::Faraday::TimeoutError)
+ end
- it { is_expected.to eq(status: :error, message: 'error while deleting tags', deleted: [], exception_class_name: ::Faraday::TimeoutError.name) }
+ it { is_expected.to eq(status: :error, message: 'error while deleting tags', deleted: [], exception_class_name: ::Faraday::TimeoutError.name) }
- it 'tracks the exception' do
- expect(::Gitlab::ErrorTracking)
- .to receive(:track_exception).with(::Faraday::TimeoutError, tags_count: tags.size, container_repository_id: repository.id)
+ it 'tracks the exception' do
+ expect(::Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(::Faraday::TimeoutError, tags_count: tags.size, container_repository_id: repository.id)
- subject
- end
+ subject
end
end
end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index c5c5af3cb01..cd1e629e1d2 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -141,18 +141,6 @@ RSpec.describe Projects::CreateService, '#execute' do
expect(project.project_setting).to be_persisted
end
- context 'create_project_settings feature flag is disabled' do
- before do
- stub_feature_flags(create_project_settings: false)
- end
-
- it 'builds associated project settings' do
- project = create_project(user, opts)
-
- expect(project.project_setting).to be_new_record
- end
- end
-
it_behaves_like 'storing arguments in the application context' do
let(:expected_params) { { project: subject.full_path } }
@@ -780,6 +768,45 @@ RSpec.describe Projects::CreateService, '#execute' do
create_project(user, opts)
end
+ context 'when import source is enabled' do
+ before do
+ stub_application_setting(import_sources: ['github'])
+ end
+
+ it 'does not raise an error when import_source is string' do
+ opts[:import_type] = 'github'
+
+ project = create_project(user, opts)
+
+ expect(project).to be_persisted
+ expect(project.errors).to be_blank
+ end
+
+ it 'does not raise an error when import_source is symbol' do
+ opts[:import_type] = :github
+
+ project = create_project(user, opts)
+
+ expect(project).to be_persisted
+ expect(project.errors).to be_blank
+ end
+ end
+
+ context 'when import source is disabled' do
+ before do
+ stub_application_setting(import_sources: [])
+ opts[:import_type] = 'git'
+ end
+
+ it 'raises an error' do
+ project = create_project(user, opts)
+
+ expect(project).to respond_to(:errors)
+ expect(project.errors).to have_key(:import_source_disabled)
+ expect(project.saved?).to be_falsey
+ end
+ end
+
context 'with external authorization enabled' do
before do
enable_external_authorization_service_check
@@ -797,7 +824,7 @@ RSpec.describe Projects::CreateService, '#execute' do
it 'saves the project when the user has access to the label' do
expect(::Gitlab::ExternalAuthorization)
- .to receive(:access_allowed?).with(user, 'new-label', any_args) { true }
+ .to receive(:access_allowed?).with(user, 'new-label', any_args) { true }.at_least(1).time
project = create_project(user, opts.merge({ external_authorization_classification_label: 'new-label' }))
diff --git a/spec/services/projects/group_links/create_service_spec.rb b/spec/services/projects/group_links/create_service_spec.rb
index 4ea5f2b3a53..65d3085a850 100644
--- a/spec/services/projects/group_links/create_service_spec.rb
+++ b/spec/services/projects/group_links/create_service_spec.rb
@@ -5,65 +5,104 @@ require 'spec_helper'
RSpec.describe Projects::GroupLinks::CreateService, '#execute' do
let_it_be(:user) { create :user }
let_it_be(:group) { create :group }
- let_it_be(:project) { create :project }
+ let_it_be(:project) { create(:project, namespace: create(:namespace, :with_namespace_settings)) }
- let(:group_access) { Gitlab::Access::DEVELOPER }
let(:opts) do
{
- link_group_access: group_access,
+ link_group_access: Gitlab::Access::DEVELOPER,
expires_at: nil
}
end
- subject { described_class.new(project, user, opts) }
+ subject { described_class.new(project, group, user, opts) }
- before do
- group.add_developer(user)
- end
+ shared_examples_for 'not shareable' do
+ it 'does not share and returns an error' do
+ expect do
+ result = subject.execute
- it 'adds group to project' do
- expect { subject.execute(group) }.to change { project.project_group_links.count }.from(0).to(1)
+ expect(result[:status]).to eq(:error)
+ expect(result[:http_status]).to eq(404)
+ end.not_to change { project.project_group_links.count }
+ end
end
- it 'updates authorization', :sidekiq_inline do
- expect { subject.execute(group) }.to(
- change { Ability.allowed?(user, :read_project, project) }
- .from(false).to(true))
- end
+ shared_examples_for 'shareable' do
+ it 'adds group to project' do
+ expect do
+ result = subject.execute
- it 'returns false if group is blank' do
- expect { subject.execute(nil) }.not_to change { project.project_group_links.count }
+ expect(result[:status]).to eq(:success)
+ end.to change { project.project_group_links.count }.from(0).to(1)
+ end
end
- it 'returns error if user is not allowed to share with a group' do
- expect { subject.execute(create(:group)) }.not_to change { project.project_group_links.count }
- end
+ context 'when user has proper membership to share a group' do
+ before do
+ group.add_guest(user)
+ end
- context 'with specialized project_authorization workers' do
- let_it_be(:other_user) { create(:user) }
+ it_behaves_like 'shareable'
- before do
- group.add_developer(other_user)
+ it 'updates authorization', :sidekiq_inline do
+ expect { subject.execute }.to(
+ change { Ability.allowed?(user, :read_project, project) }
+ .from(false).to(true))
+ end
+
+ context 'with specialized project_authorization workers' do
+ let_it_be(:other_user) { create(:user) }
+
+ before do
+ group.add_developer(other_user)
+ end
+
+ it 'schedules authorization update for users with access to group' do
+ expect(AuthorizedProjectsWorker).not_to(
+ receive(:bulk_perform_async)
+ )
+ expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to(
+ receive(:perform_async)
+ .with(project.id)
+ .and_call_original
+ )
+ expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
+ receive(:bulk_perform_in)
+ .with(1.hour,
+ array_including([user.id], [other_user.id]),
+ batch_delay: 30.seconds, batch_size: 100)
+ .and_call_original
+ )
+
+ subject.execute
+ end
end
- it 'schedules authorization update for users with access to group' do
- expect(AuthorizedProjectsWorker).not_to(
- receive(:bulk_perform_async)
- )
- expect(AuthorizedProjectUpdate::ProjectRecalculateWorker).to(
- receive(:perform_async)
- .with(project.id)
- .and_call_original
- )
- expect(AuthorizedProjectUpdate::UserRefreshFromReplicaWorker).to(
- receive(:bulk_perform_in)
- .with(1.hour,
- array_including([user.id], [other_user.id]),
- batch_delay: 30.seconds, batch_size: 100)
- .and_call_original
- )
-
- subject.execute(group)
+ context 'when sharing outside the hierarchy is disabled' do
+ let_it_be(:shared_group_parent) do
+ create(:group,
+ namespace_settings: create(:namespace_settings, prevent_sharing_groups_outside_hierarchy: true))
+ end
+
+ let_it_be(:project, reload: true) { create(:project, group: shared_group_parent) }
+
+ it_behaves_like 'not shareable'
+
+ context 'when group is inside hierarchy' do
+ let(:group) { create(:group, :private, parent: shared_group_parent) }
+
+ it_behaves_like 'shareable'
+ end
end
end
+
+ context 'when user does not have permissions for the group' do
+ it_behaves_like 'not shareable'
+ end
+
+ context 'when group is blank' do
+ let(:group) { nil }
+
+ it_behaves_like 'not shareable'
+ end
end
diff --git a/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb b/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb
new file mode 100644
index 00000000000..4c51c8a4ac8
--- /dev/null
+++ b/spec/services/projects/in_product_marketing_campaign_emails_service_spec.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::InProductMarketingCampaignEmailsService do
+ describe '#execute' do
+ let(:user) { create(:user, email_opted_in: true) }
+ let(:project) { create(:project) }
+ let(:campaign) { Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE }
+
+ subject(:execute) do
+ described_class.new(project, campaign).execute
+ end
+
+ context 'users can receive marketing emails' do
+ let(:owner) { create(:user, email_opted_in: true) }
+ let(:maintainer) { create(:user, email_opted_in: true) }
+ let(:developer) { create(:user, email_opted_in: true) }
+
+ before do
+ project.add_owner(owner)
+ project.add_developer(developer)
+ project.add_maintainer(maintainer)
+ end
+
+ it 'sends the email to all project members with access_level >= Developer', :aggregate_failures do
+ double = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
+
+ [owner, maintainer, developer].each do |user|
+ email = user.notification_email_or_default
+
+ expect(Notify).to receive(:build_ios_app_guide_email).with(email) { double }
+ expect(double).to receive(:deliver_later)
+ end
+
+ execute
+ end
+
+ it 'records sent emails', :aggregate_failures do
+ expect { execute }.to change { Users::InProductMarketingEmail.count }.from(0).to(3)
+
+ [owner, maintainer, developer].each do |user|
+ expect(
+ Users::InProductMarketingEmail.where(
+ user: user,
+ campaign: campaign
+ )
+ ).to exist
+ end
+ end
+
+ it 'tracks experiment :email_sent event', :experiment do
+ expect(experiment(:build_ios_app_guide_email)).to track(:email_sent)
+ .on_next_instance
+ .with_context(project: project)
+
+ execute
+ end
+ end
+
+ shared_examples 'does nothing' do
+ it 'does not send the email' do
+ email = user.notification_email_or_default
+ expect(Notify).not_to receive(:build_ios_app_guide_email).with(email)
+ execute
+ end
+
+ it 'does not create a record of the sent email' do
+ expect { execute }.not_to change { Users::InProductMarketingEmail.count }
+ end
+ end
+
+ context "when user can't receive marketing emails" do
+ before do
+ project.add_developer(user)
+ end
+
+ context 'when user.can?(:receive_notifications) is false' do
+ it 'does not send the email' do
+ allow_next_found_instance_of(User) do |user|
+ allow(user).to receive(:can?).with(:receive_notifications) { false }
+
+ email = user.notification_email_or_default
+ expect(Notify).not_to receive(:build_ios_app_guide_email).with(email)
+
+ expect(
+ Users::InProductMarketingEmail.where(
+ user: user,
+ campaign: campaign
+ )
+ ).not_to exist
+ end
+
+ execute
+ end
+ end
+
+ context 'when user is not opted in to receive marketing emails' do
+ let(:user) { create(:user, email_opted_in: false) }
+
+ it_behaves_like 'does nothing'
+ end
+ end
+
+ context 'when campaign email has already been sent to the user' do
+ before do
+ project.add_developer(user)
+ create(:in_product_marketing_email, :campaign, user: user, campaign: campaign)
+ end
+
+ it_behaves_like 'does nothing'
+ end
+
+ context "when user is a reporter" do
+ before do
+ project.add_reporter(user)
+ end
+
+ it_behaves_like 'does nothing'
+ end
+
+ context "when user is a guest" do
+ before do
+ project.add_guest(user)
+ end
+
+ it_behaves_like 'does nothing'
+ end
+ end
+end
diff --git a/spec/services/projects/open_issues_count_service_spec.rb b/spec/services/projects/open_issues_count_service_spec.rb
index 8710d0c0267..c739fea5ecf 100644
--- a/spec/services/projects/open_issues_count_service_spec.rb
+++ b/spec/services/projects/open_issues_count_service_spec.rb
@@ -4,102 +4,89 @@ require 'spec_helper'
RSpec.describe Projects::OpenIssuesCountService, :use_clean_rails_memory_store_caching do
let(:project) { create(:project) }
- let(:user) { create(:user) }
- let(:banned_user) { create(:user, :banned) }
- subject { described_class.new(project, user) }
+ subject { described_class.new(project) }
it_behaves_like 'a counter caching service'
- before do
- create(:issue, :opened, project: project)
- create(:issue, :opened, confidential: true, project: project)
- create(:issue, :opened, author: banned_user, project: project)
- create(:issue, :closed, project: project)
-
- described_class.new(project).refresh_cache
- end
-
describe '#count' do
- shared_examples 'counts public issues, does not count hidden or confidential' do
- it 'counts only public issues' do
- expect(subject.count).to eq(1)
- end
-
- it 'uses PUBLIC_COUNT_WITHOUT_HIDDEN_KEY cache key' do
- expect(subject.cache_key).to include('project_open_public_issues_without_hidden_count')
- end
- end
-
context 'when user is nil' do
- let(:user) { nil }
+ it 'does not include confidential issues in the issue count' do
+ create(:issue, :opened, project: project)
+ create(:issue, :opened, confidential: true, project: project)
- it_behaves_like 'counts public issues, does not count hidden or confidential'
+ expect(described_class.new(project).count).to eq(1)
+ end
end
context 'when user is provided' do
+ let(:user) { create(:user) }
+
context 'when user can read confidential issues' do
before do
project.add_reporter(user)
end
- it 'includes confidential issues and does not include hidden issues in count' do
- expect(subject.count).to eq(2)
+ it 'returns the right count with confidential issues' do
+ create(:issue, :opened, project: project)
+ create(:issue, :opened, confidential: true, project: project)
+
+ expect(described_class.new(project, user).count).to eq(2)
end
- it 'uses TOTAL_COUNT_WITHOUT_HIDDEN_KEY cache key' do
- expect(subject.cache_key).to include('project_open_issues_without_hidden_count')
+ it 'uses total_open_issues_count cache key' do
+ expect(described_class.new(project, user).cache_key_name).to eq('total_open_issues_count')
end
end
- context 'when user cannot read confidential or hidden issues' do
+ context 'when user cannot read confidential issues' do
before do
project.add_guest(user)
end
- it_behaves_like 'counts public issues, does not count hidden or confidential'
- end
-
- context 'when user is an admin' do
- let_it_be(:user) { create(:user, :admin) }
-
- context 'when admin mode is enabled', :enable_admin_mode do
- it 'includes confidential and hidden issues in count' do
- expect(subject.count).to eq(3)
- end
+ it 'does not include confidential issues' do
+ create(:issue, :opened, project: project)
+ create(:issue, :opened, confidential: true, project: project)
- it 'uses TOTAL_COUNT_KEY cache key' do
- expect(subject.cache_key).to include('project_open_issues_including_hidden_count')
- end
+ expect(described_class.new(project, user).count).to eq(1)
end
- context 'when admin mode is disabled' do
- it_behaves_like 'counts public issues, does not count hidden or confidential'
+ it 'uses public_open_issues_count cache key' do
+ expect(described_class.new(project, user).cache_key_name).to eq('public_open_issues_count')
end
end
end
- end
-
- describe '#refresh_cache', :aggregate_failures do
- context 'when cache is empty' do
- it 'refreshes cache keys correctly' do
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::PUBLIC_COUNT_WITHOUT_HIDDEN_KEY))).to eq(1)
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::TOTAL_COUNT_WITHOUT_HIDDEN_KEY))).to eq(2)
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::TOTAL_COUNT_KEY))).to eq(3)
- end
- end
- context 'when cache is outdated' do
- it 'refreshes cache keys correctly' do
+ describe '#refresh_cache' do
+ before do
+ create(:issue, :opened, project: project)
create(:issue, :opened, project: project)
create(:issue, :opened, confidential: true, project: project)
- create(:issue, :opened, author: banned_user, project: project)
+ end
- described_class.new(project).refresh_cache
+ context 'when cache is empty' do
+ it 'refreshes cache keys correctly' do
+ subject.refresh_cache
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::PUBLIC_COUNT_WITHOUT_HIDDEN_KEY))).to eq(2)
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::TOTAL_COUNT_WITHOUT_HIDDEN_KEY))).to eq(4)
- expect(Rails.cache.read(described_class.new(project).cache_key(described_class::TOTAL_COUNT_KEY))).to eq(6)
+ expect(Rails.cache.read(subject.cache_key(described_class::PUBLIC_COUNT_KEY))).to eq(2)
+ expect(Rails.cache.read(subject.cache_key(described_class::TOTAL_COUNT_KEY))).to eq(3)
+ end
+ end
+
+ context 'when cache is outdated' do
+ before do
+ subject.refresh_cache
+ end
+
+ it 'refreshes cache keys correctly' do
+ create(:issue, :opened, project: project)
+ create(:issue, :opened, confidential: true, project: project)
+
+ subject.refresh_cache
+
+ expect(Rails.cache.read(subject.cache_key(described_class::PUBLIC_COUNT_KEY))).to eq(3)
+ expect(Rails.cache.read(subject.cache_key(described_class::TOTAL_COUNT_KEY))).to eq(5)
+ end
end
end
end
diff --git a/spec/services/projects/prometheus/alerts/create_service_spec.rb b/spec/services/projects/prometheus/alerts/create_service_spec.rb
deleted file mode 100644
index 6b9d43e4e81..00000000000
--- a/spec/services/projects/prometheus/alerts/create_service_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Prometheus::Alerts::CreateService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
-
- let(:service) { described_class.new(project: project, current_user: user, params: params) }
-
- subject { service.execute }
-
- describe '#execute' do
- context 'with params' do
- let_it_be(:environment) { create(:environment, project: project) }
-
- let_it_be(:metric) do
- create(:prometheus_metric, project: project)
- end
-
- let(:params) do
- {
- environment_id: environment.id,
- prometheus_metric_id: metric.id,
- operator: '<',
- threshold: 1.0
- }
- end
-
- it 'creates an alert' do
- expect(subject).to be_persisted
-
- expect(subject).to have_attributes(
- project: project,
- environment: environment,
- prometheus_metric: metric,
- operator: 'lt',
- threshold: 1.0
- )
- end
- end
-
- context 'without params' do
- let(:params) { {} }
-
- it 'fails to create' do
- expect(subject).to be_new_record
- expect(subject).to be_invalid
- end
- end
- end
-end
diff --git a/spec/services/projects/prometheus/alerts/destroy_service_spec.rb b/spec/services/projects/prometheus/alerts/destroy_service_spec.rb
deleted file mode 100644
index a3e9c3516c2..00000000000
--- a/spec/services/projects/prometheus/alerts/destroy_service_spec.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Prometheus::Alerts::DestroyService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:alert) { create(:prometheus_alert, project: project) }
-
- let(:service) { described_class.new(project: project, current_user: user, params: nil) }
-
- describe '#execute' do
- subject { service.execute(alert) }
-
- it 'deletes the alert' do
- expect(subject).to be_truthy
-
- expect(alert).to be_destroyed
- end
- end
-end
diff --git a/spec/services/projects/prometheus/alerts/update_service_spec.rb b/spec/services/projects/prometheus/alerts/update_service_spec.rb
deleted file mode 100644
index ec6766221f6..00000000000
--- a/spec/services/projects/prometheus/alerts/update_service_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Prometheus::Alerts::UpdateService do
- let_it_be(:project) { create(:project) }
- let_it_be(:user) { create(:user) }
- let_it_be(:environment) { create(:environment, project: project) }
-
- let_it_be(:alert) do
- create(:prometheus_alert, project: project, environment: environment)
- end
-
- let(:service) { described_class.new(project: project, current_user: user, params: params) }
-
- let(:params) do
- {
- environment_id: alert.environment_id,
- prometheus_metric_id: alert.prometheus_metric_id,
- operator: '==',
- threshold: 2.0
- }
- end
-
- describe '#execute' do
- subject { service.execute(alert) }
-
- context 'with valid params' do
- it 'updates the alert' do
- expect(subject).to be_truthy
-
- expect(alert.reload).to have_attributes(
- operator: 'eq',
- threshold: 2.0
- )
- end
- end
-
- context 'with invalid params' do
- let(:other_environment) { create(:environment) }
-
- before do
- params[:environment_id] = other_environment.id
- end
-
- it 'fails to update' do
- expect(subject).to be_falsey
-
- expect(alert).to be_invalid
- end
- end
- end
-end
diff --git a/spec/services/projects/prometheus/metrics/destroy_service_spec.rb b/spec/services/projects/prometheus/metrics/destroy_service_spec.rb
index 17cc88b27b6..b4af81f2c87 100644
--- a/spec/services/projects/prometheus/metrics/destroy_service_spec.rb
+++ b/spec/services/projects/prometheus/metrics/destroy_service_spec.rb
@@ -12,17 +12,4 @@ RSpec.describe Projects::Prometheus::Metrics::DestroyService do
expect(PrometheusMetric.find_by(id: metric.id)).to be_nil
end
-
- context 'when metric has a prometheus alert associated' do
- it 'schedules a prometheus alert update' do
- create(:prometheus_alert, project: metric.project, prometheus_metric: metric)
-
- schedule_update_service = spy
- allow(::Clusters::Applications::ScheduleUpdateService).to receive(:new).and_return(schedule_update_service)
-
- subject.execute
-
- expect(schedule_update_service).to have_received(:execute)
- end
- end
end
diff --git a/spec/services/projects/prometheus/metrics/update_service_spec.rb b/spec/services/projects/prometheus/metrics/update_service_spec.rb
deleted file mode 100644
index bf87093150c..00000000000
--- a/spec/services/projects/prometheus/metrics/update_service_spec.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::Prometheus::Metrics::UpdateService do
- let(:metric) { create(:prometheus_metric) }
-
- it 'updates the prometheus metric' do
- expect do
- described_class.new(metric, { title: "bar" }).execute
- end.to change { metric.reload.title }.to("bar")
- end
-
- context 'when metric has a prometheus alert associated' do
- let(:schedule_update_service) { spy }
-
- before do
- create(:prometheus_alert, project: metric.project, prometheus_metric: metric)
- allow(::Clusters::Applications::ScheduleUpdateService).to receive(:new).and_return(schedule_update_service)
- end
-
- context 'when updating title' do
- it 'schedules a prometheus alert update' do
- described_class.new(metric, { title: "bar" }).execute
-
- expect(schedule_update_service).to have_received(:execute)
- end
- end
-
- context 'when updating query' do
- it 'schedules a prometheus alert update' do
- described_class.new(metric, { query: "sum(bar)" }).execute
-
- expect(schedule_update_service).to have_received(:execute)
- end
- end
-
- it 'does not schedule a prometheus alert update without title nor query being changed' do
- described_class.new(metric, { y_label: "bar" }).execute
-
- expect(schedule_update_service).not_to have_received(:execute)
- end
- end
-end
diff --git a/spec/services/projects/record_target_platforms_service_spec.rb b/spec/services/projects/record_target_platforms_service_spec.rb
index 85311f36428..22ff325a62e 100644
--- a/spec/services/projects/record_target_platforms_service_spec.rb
+++ b/spec/services/projects/record_target_platforms_service_spec.rb
@@ -5,21 +5,38 @@ require 'spec_helper'
RSpec.describe Projects::RecordTargetPlatformsService, '#execute' do
let_it_be(:project) { create(:project) }
- subject(:execute) { described_class.new(project).execute }
+ let(:detector_service) { Projects::AppleTargetPlatformDetectorService }
+
+ subject(:execute) { described_class.new(project, detector_service).execute }
+
+ context 'when detector returns target platform values' do
+ let(:detector_result) { [:ios, :osx] }
+ let(:service_result) { detector_result.map(&:to_s) }
- context 'when project is an XCode project' do
before do
- double = instance_double(Projects::AppleTargetPlatformDetectorService, execute: [:ios, :osx])
- allow(Projects::AppleTargetPlatformDetectorService).to receive(:new) { double }
+ double = instance_double(detector_service, execute: detector_result)
+ allow(detector_service).to receive(:new) { double }
end
- it 'creates a new setting record for the project', :aggregate_failures do
- expect { execute }.to change { ProjectSetting.count }.from(0).to(1)
- expect(ProjectSetting.last.target_platforms).to match_array(%w(ios osx))
+ shared_examples 'saves and returns detected target platforms' do
+ it 'creates a new setting record for the project', :aggregate_failures do
+ expect { execute }.to change { ProjectSetting.count }.from(0).to(1)
+ expect(ProjectSetting.last.target_platforms).to match_array(service_result)
+ end
+
+ it 'returns the array of stored target platforms' do
+ expect(execute).to match_array service_result
+ end
end
- it 'returns array of detected target platforms' do
- expect(execute).to match_array %w(ios osx)
+ it_behaves_like 'saves and returns detected target platforms'
+
+ context 'when detector returns a non-array value' do
+ let(:detector_service) { Projects::AndroidTargetPlatformDetectorService }
+ let(:detector_result) { :android }
+ let(:service_result) { [detector_result.to_s] }
+
+ it_behaves_like 'saves and returns detected target platforms'
end
context 'when a project has an existing setting record' do
@@ -49,9 +66,76 @@ RSpec.describe Projects::RecordTargetPlatformsService, '#execute' do
end
end
end
+
+ describe 'Build iOS guide email experiment' do
+ shared_examples 'tracks experiment assignment event' do
+ it 'tracks the assignment event', :experiment do
+ expect(experiment(:build_ios_app_guide_email))
+ .to track(:assignment)
+ .with_context(project: project)
+ .on_next_instance
+
+ execute
+ end
+ end
+
+ context 'experiment candidate' do
+ before do
+ stub_experiments(build_ios_app_guide_email: :candidate)
+ end
+
+ it 'executes a Projects::InProductMarketingCampaignEmailsService' do
+ service_double = instance_double(Projects::InProductMarketingCampaignEmailsService, execute: true)
+
+ expect(Projects::InProductMarketingCampaignEmailsService)
+ .to receive(:new).with(project, Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE)
+ .and_return service_double
+ expect(service_double).to receive(:execute)
+
+ execute
+ end
+
+ it_behaves_like 'tracks experiment assignment event'
+ end
+
+ shared_examples 'does not send email' do
+ it 'does not execute a Projects::InProductMarketingCampaignEmailsService' do
+ expect(Projects::InProductMarketingCampaignEmailsService).not_to receive(:new)
+
+ execute
+ end
+ end
+
+ context 'experiment control' do
+ before do
+ stub_experiments(build_ios_app_guide_email: :control)
+ end
+
+ it_behaves_like 'does not send email'
+ it_behaves_like 'tracks experiment assignment event'
+ end
+
+ context 'when project is not an iOS project' do
+ let(:detector_service) { Projects::AppleTargetPlatformDetectorService }
+ let(:detector_result) { :android }
+
+ before do
+ stub_experiments(build_ios_app_guide_email: :candidate)
+ end
+
+ it_behaves_like 'does not send email'
+
+ it 'does not track experiment assignment event', :experiment do
+ expect(experiment(:build_ios_app_guide_email))
+ .not_to track(:assignment)
+
+ execute
+ end
+ end
+ end
end
- context 'when project is not an XCode project' do
+ context 'when detector does not return any target platform values' do
before do
double = instance_double(Projects::AppleTargetPlatformDetectorService, execute: [])
allow(Projects::AppleTargetPlatformDetectorService).to receive(:new).with(project) { double }
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index 6407b8d3940..777162b6196 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -13,6 +13,7 @@ RSpec.describe Projects::UpdatePagesService do
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) }
@@ -91,6 +92,17 @@ RSpec.describe Projects::UpdatePagesService do
end
end
+ context 'when archive does not have pages directory' do
+ let(:file) { empty_file }
+ let(:metadata_filename) { empty_metadata_filename }
+
+ it 'returns an error' do
+ expect(execute).not_to eq(:success)
+
+ expect(GenericCommitStatus.last.description).to eq("Error: The `public/` folder is missing, or not declared in `.gitlab-ci.yml`.")
+ end
+ end
+
it 'limits pages size' do
stub_application_setting(max_pages_size: 1)
expect(execute).not_to eq(:success)
diff --git a/spec/services/prometheus/create_default_alerts_service_spec.rb b/spec/services/prometheus/create_default_alerts_service_spec.rb
deleted file mode 100644
index 0880799b589..00000000000
--- a/spec/services/prometheus/create_default_alerts_service_spec.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Prometheus::CreateDefaultAlertsService do
- let_it_be(:project) { create(:project, :repository) }
-
- let(:instance) { described_class.new(project: project) }
- let(:expected_alerts) { described_class::DEFAULT_ALERTS }
-
- describe '#execute' do
- subject(:execute) { instance.execute }
-
- shared_examples 'no alerts created' do
- it 'does not create alerts' do
- expect { execute }.not_to change { project.reload.prometheus_alerts.count }
- end
- end
-
- context 'no environment' do
- it_behaves_like 'no alerts created'
- end
-
- context 'environment exists' do
- let_it_be(:environment) { create(:environment, project: project) }
-
- context 'no found metric' do
- it_behaves_like 'no alerts created'
- end
-
- context 'metric exists' do
- before do
- create_expected_metrics!
- end
-
- context 'alert exists already' do
- before do
- create_pre_existing_alerts!(environment)
- end
-
- it_behaves_like 'no alerts created'
- end
-
- it 'creates alerts' do
- expect { execute }.to change { project.reload.prometheus_alerts.count }
- .by(expected_alerts.size)
- end
-
- it 'does not schedule an update to prometheus' do
- expect(::Clusters::Applications::ScheduleUpdateService).not_to receive(:new)
- execute
- end
-
- context 'cluster with prometheus exists' do
- let!(:cluster) { create(:cluster, :with_installed_prometheus, :provided_by_user, projects: [project]) }
-
- it 'schedules an update to prometheus' do
- expect_next_instance_of(::Clusters::Applications::ScheduleUpdateService) do |instance|
- expect(instance).to receive(:execute)
- end
-
- execute
- end
- end
-
- context 'multiple environments' do
- let!(:production) { create(:environment, project: project, name: 'production') }
-
- it 'uses the production environment' do
- expect { execute }.to change { production.reload.prometheus_alerts.count }
- .by(expected_alerts.size)
- end
- end
- end
- end
- end
-
- private
-
- def create_expected_metrics!
- expected_alerts.each do |alert_hash|
- create(:prometheus_metric, :common, identifier: alert_hash.fetch(:identifier))
- end
- end
-
- def create_pre_existing_alerts!(environment)
- expected_alerts.each do |alert_hash|
- metric = PrometheusMetric.for_identifier(alert_hash[:identifier]).first!
- create(:prometheus_alert, prometheus_metric: metric, project: project, environment: environment)
- end
- end
-end
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb
index 85dbc39edcf..f7a22b1b92f 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/spec/services/quick_actions/interpret_service_spec.rb
@@ -696,6 +696,21 @@ RSpec.describe QuickActions::InterpretService do
expect(message).to eq("Assigned #{developer.to_reference}.")
end
+ context 'when the reference does not match the exact case' do
+ let(:user) { create(:user) }
+ let(:content) { "/assign #{user.to_reference.upcase}" }
+
+ it 'assigns to the user' do
+ issuable.project.add_developer(user)
+
+ _, updates, message = service.execute(content, issuable)
+
+ expect(content).not_to include(user.to_reference)
+ expect(updates).to eq(assignee_ids: [user.id])
+ expect(message).to eq("Assigned #{user.to_reference}.")
+ end
+ end
+
context 'when the user has a private profile' do
let(:user) { create(:user, :private_profile) }
let(:content) { "/assign #{user.to_reference}" }
diff --git a/spec/services/service_ping/build_payload_service_spec.rb b/spec/services/service_ping/build_payload_service_spec.rb
deleted file mode 100644
index cd2685069c9..00000000000
--- a/spec/services/service_ping/build_payload_service_spec.rb
+++ /dev/null
@@ -1,47 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ServicePing::BuildPayloadService do
- describe '#execute', :without_license do
- subject(:service_ping_payload) { described_class.new.execute }
-
- include_context 'stubbed service ping metrics definitions' do
- let(:subscription_metrics) do
- [
- metric_attributes('active_user_count', "Subscription")
- ]
- end
- end
-
- context 'when usage_ping_enabled setting is false' do
- before do
- # Gitlab::CurrentSettings.usage_ping_enabled? == false
- stub_config_setting(usage_ping_enabled: false)
- end
-
- it 'returns empty service ping payload' do
- expect(service_ping_payload).to eq({})
- end
- end
-
- context 'when usage_ping_enabled setting is true' do
- before do
- # Gitlab::CurrentSettings.usage_ping_enabled? == true
- stub_config_setting(usage_ping_enabled: true)
- end
-
- it_behaves_like 'complete service ping payload'
-
- context 'with require stats consent enabled' do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
- end
-
- it 'returns empty service ping payload' do
- expect(service_ping_payload).to eq({})
- end
- end
- end
- end
-end
diff --git a/spec/services/service_ping/permit_data_categories_service_spec.rb b/spec/services/service_ping/permit_data_categories_service_spec.rb
deleted file mode 100644
index 550c0ea5e13..00000000000
--- a/spec/services/service_ping/permit_data_categories_service_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ServicePing::PermitDataCategoriesService do
- describe '#execute', :without_license do
- subject(:permitted_categories) { described_class.new.execute }
-
- context 'when usage ping setting is set to true' do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: false))
- stub_config_setting(usage_ping_enabled: true)
- end
-
- it 'returns all categories' do
- expect(permitted_categories).to match_array(%w[standard subscription operational optional])
- end
- end
-
- context 'when usage ping setting is set to false' do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: false))
- stub_config_setting(usage_ping_enabled: false)
- end
-
- it 'returns no categories' do
- expect(permitted_categories).to match_array([])
- end
- end
-
- context 'when User.single_user&.requires_usage_stats_consent? is required' do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
- stub_config_setting(usage_ping_enabled: true)
- end
-
- it 'returns no categories' do
- expect(permitted_categories).to match_array([])
- end
- end
- end
-end
diff --git a/spec/services/service_ping/service_ping_settings_spec.rb b/spec/services/service_ping/service_ping_settings_spec.rb
deleted file mode 100644
index 90a5c6b30eb..00000000000
--- a/spec/services/service_ping/service_ping_settings_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ServicePing::ServicePingSettings do
- using RSpec::Parameterized::TableSyntax
-
- describe '#product_intelligence_enabled?' do
- where(:usage_ping_enabled, :requires_usage_stats_consent, :expected_product_intelligence_enabled) do
- # Usage ping enabled
- true | false | true
- true | true | false
-
- # Usage ping disabled
- false | false | false
- false | true | false
- end
-
- with_them do
- before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: requires_usage_stats_consent))
- stub_config_setting(usage_ping_enabled: usage_ping_enabled)
- end
-
- it 'has the correct product_intelligence_enabled?' do
- expect(described_class.product_intelligence_enabled?).to eq(expected_product_intelligence_enabled)
- end
- end
- end
-
- describe '#enabled?' do
- describe 'has the correct enabled' do
- it 'when false' do
- stub_config_setting(usage_ping_enabled: false)
-
- expect(described_class.enabled?).to eq(false)
- end
-
- it 'when true' do
- stub_config_setting(usage_ping_enabled: true)
-
- expect(described_class.enabled?).to eq(true)
- end
- end
- end
-end
diff --git a/spec/services/service_ping/submit_service_ping_service_spec.rb b/spec/services/service_ping/submit_service_ping_service_spec.rb
index 73be8f000a9..7a8bd1910fe 100644
--- a/spec/services/service_ping/submit_service_ping_service_spec.rb
+++ b/spec/services/service_ping/submit_service_ping_service_spec.rb
@@ -51,6 +51,9 @@ RSpec.describe ServicePing::SubmitService do
let(:with_dev_ops_score_params) { { dev_ops_score: score_params[:score] } }
let(:with_conv_index_params) { { conv_index: score_params[:score] } }
let(:with_usage_data_id_params) { { conv_index: { usage_data_id: usage_data_id } } }
+ let(:service_ping_payload_url) { File.join(described_class::STAGING_BASE_URL, described_class::USAGE_DATA_PATH) }
+ let(:service_ping_errors_url) { File.join(described_class::STAGING_BASE_URL, described_class::ERROR_PATH) }
+ let(:service_ping_metadata_url) { File.join(described_class::STAGING_BASE_URL, described_class::METADATA_PATH) }
shared_examples 'does not run' do
it do
@@ -63,7 +66,7 @@ RSpec.describe ServicePing::SubmitService do
shared_examples 'does not send a blank usage ping payload' do
it do
- expect(Gitlab::HTTP).not_to receive(:post).with(subject.url, any_args)
+ expect(Gitlab::HTTP).not_to receive(:post).with(service_ping_payload_url, any_args)
expect { subject.execute }.to raise_error(described_class::SubmissionError) do |error|
expect(error.message).to include('Usage data is blank')
@@ -117,6 +120,7 @@ RSpec.describe ServicePing::SubmitService do
it 'generates service ping' do
stub_response(body: with_dev_ops_score_params)
+ stub_response(body: nil, url: service_ping_metadata_url, status: 201)
expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_call_original
@@ -129,18 +133,21 @@ RSpec.describe ServicePing::SubmitService do
stub_usage_data_connections
stub_database_flavor_check
stub_application_setting(usage_ping_enabled: true)
- stub_response(body: nil, url: subject.error_url, status: 201)
+ stub_response(body: nil, url: service_ping_errors_url, status: 201)
+ stub_response(body: nil, url: service_ping_metadata_url, status: 201)
end
context 'and user requires usage stats consent' do
before do
- allow(User).to receive(:single_user).and_return(double(:user, requires_usage_stats_consent?: true))
+ allow(User).to receive(:single_user)
+ .and_return(instance_double(User, :user, requires_usage_stats_consent?: true))
end
it_behaves_like 'does not run'
end
it 'sends a POST request' do
+ stub_response(body: nil, url: service_ping_metadata_url, status: 201)
response = stub_response(body: with_dev_ops_score_params)
subject.execute
@@ -167,7 +174,8 @@ RSpec.describe ServicePing::SubmitService do
recorded_at = Time.current
usage_data = { uuid: 'uuid', recorded_at: recorded_at }
- expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(usage_data)
+ expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values)
+ .and_return(usage_data)
subject.execute
@@ -190,7 +198,8 @@ RSpec.describe ServicePing::SubmitService do
recorded_at = Time.current
usage_data = { uuid: 'uuid', recorded_at: recorded_at }
- expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(usage_data)
+ expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values)
+ .and_return(usage_data)
subject.execute
@@ -235,7 +244,8 @@ RSpec.describe ServicePing::SubmitService do
recorded_at = Time.current
usage_data = { uuid: 'uuid', recorded_at: recorded_at }
- expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(usage_data)
+ expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values)
+ .and_return(usage_data)
subject.execute
@@ -268,7 +278,7 @@ RSpec.describe ServicePing::SubmitService do
context 'and usage data is nil' do
before do
- allow(ServicePing::BuildPayloadService).to receive(:execute).and_return(nil)
+ allow(ServicePing::BuildPayload).to receive(:execute).and_return(nil)
allow(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(nil)
end
@@ -278,29 +288,33 @@ RSpec.describe ServicePing::SubmitService do
context 'if payload service fails' do
before do
stub_response(body: with_dev_ops_score_params)
- allow(ServicePing::BuildPayloadService).to receive_message_chain(:new, :execute)
+
+ allow(ServicePing::BuildPayload).to receive_message_chain(:new, :execute)
.and_raise(described_class::SubmissionError, 'SubmissionError')
end
it 'calls Gitlab::Usage::ServicePingReport .for method' do
usage_data = build_usage_data
- expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(usage_data)
+ expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values)
+ .and_return(usage_data)
subject.execute
end
it 'submits error' do
- expect(Gitlab::HTTP).to receive(:post).with(subject.url, any_args)
+ expect(Gitlab::HTTP).to receive(:post).with(URI.join(service_ping_payload_url), any_args)
+ .and_call_original
+ expect(Gitlab::HTTP).to receive(:post).with(URI.join(service_ping_errors_url), any_args)
.and_call_original
- expect(Gitlab::HTTP).to receive(:post).with(subject.error_url, any_args)
+ expect(Gitlab::HTTP).to receive(:post).with(URI.join(service_ping_metadata_url), any_args)
.and_call_original
subject.execute
end
end
- context 'calls BuildPayloadService first' do
+ context 'calls BuildPayload first' do
before do
stub_response(body: with_dev_ops_score_params)
end
@@ -308,7 +322,7 @@ RSpec.describe ServicePing::SubmitService do
it 'returns usage data' do
usage_data = build_usage_data
- expect_next_instance_of(ServicePing::BuildPayloadService) do |service|
+ expect_next_instance_of(ServicePing::BuildPayload) do |service|
expect(service).to receive(:execute).and_return(usage_data)
end
@@ -321,7 +335,7 @@ RSpec.describe ServicePing::SubmitService do
stub_response(body: with_dev_ops_score_params, status: 404)
usage_data = build_usage_data
- allow_next_instance_of(ServicePing::BuildPayloadService) do |service|
+ allow_next_instance_of(ServicePing::BuildPayload) do |service|
allow(service).to receive(:execute).and_return(usage_data)
end
end
@@ -329,7 +343,8 @@ RSpec.describe ServicePing::SubmitService do
it 'calls Gitlab::Usage::ServicePingReport .for method' do
usage_data = build_usage_data
- expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values).and_return(usage_data)
+ expect(Gitlab::Usage::ServicePingReport).to receive(:for).with(output: :all_metrics_values)
+ .and_return(usage_data)
# SubmissionError is raised as a result of 404 in response from HTTP Request
expect { subject.execute }.to raise_error(described_class::SubmissionError)
@@ -349,38 +364,79 @@ RSpec.describe ServicePing::SubmitService do
end
it 'does not call DevOpsReport service' do
- expect(ServicePing::DevopsReportService).not_to receive(:new)
+ expect(ServicePing::DevopsReport).not_to receive(:new)
subject.execute
end
end
end
- describe '#url' do
- let(:url) { subject.url.to_s }
+ context 'metadata reporting' do
+ before do
+ stub_usage_data_connections
+ stub_database_flavor_check
+ stub_application_setting(usage_ping_enabled: true)
+ stub_response(body: with_conv_index_params)
+ 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
+ {
+ metric_a: metric_double,
+ metric_group: {
+ metric_b: metric_double
+ },
+ metric_without_timing: "value",
+ recorded_at: Time.current
+ }
+ end
+
+ let(:metadata_payload) do
+ {
+ metadata: {
+ metrics: [
+ { name: 'metric_a', time_elapsed: 123 },
+ { name: 'metric_group.metric_b', time_elapsed: 123 }
+ ]
+ }
+ }
+ end
- context 'when Rails.env is production' do
before do
- stub_rails_env('production')
+ 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 'points to the production Version app' do
- expect(url).to eq("#{described_class::PRODUCTION_BASE_URL}/#{described_class::USAGE_DATA_PATH}")
+ 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 'when Rails.env is not production' do
+ context 'with feature flag measure_service_ping_metric_collection turned off' do
before do
- stub_rails_env('development')
+ stub_feature_flags(measure_service_ping_metric_collection: false)
end
- it 'points to the staging Version app' do
- expect(url).to eq("#{described_class::STAGING_BASE_URL}/#{described_class::USAGE_DATA_PATH}")
+ it 'does NOT submit metadata' do
+ response = stub_full_request(service_ping_metadata_url, method: :post)
+
+ subject.execute
+
+ expect(response).not_to have_been_requested
end
end
end
- def stub_response(url: subject.url, body:, status: 201)
+ def stub_response(url: service_ping_payload_url, body:, status: 201)
stub_full_request(url, method: :post)
.to_return(
headers: { 'Content-Type' => 'application/json' },
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index c322ec35e86..741d136b9a0 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -431,6 +431,19 @@ RSpec.describe SystemNoteService do
end
end
+ describe '.remove_timelog' do
+ let(:issue) { create(:issue, project: project) }
+ let(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)}
+
+ it 'calls TimeTrackingService' do
+ expect_next_instance_of(::SystemNotes::TimeTrackingService) do |service|
+ expect(service).to receive(:remove_timelog)
+ end
+
+ described_class.remove_timelog(noteable, project, author, timelog)
+ end
+ end
+
describe '.handle_merge_request_draft' do
it 'calls MergeRequestsService' do
expect_next_instance_of(::SystemNotes::MergeRequestsService) do |service|
@@ -695,4 +708,38 @@ RSpec.describe SystemNoteService do
described_class.change_issue_type(incident, author)
end
end
+
+ describe '.add_timeline_event' do
+ let(:timeline_event) { instance_double('IncidentManagement::TimelineEvent', incident: noteable, project: project) }
+
+ it 'calls IncidentsService' do
+ expect_next_instance_of(::SystemNotes::IncidentsService) do |service|
+ expect(service).to receive(:add_timeline_event).with(timeline_event)
+ end
+
+ described_class.add_timeline_event(timeline_event)
+ end
+ end
+
+ describe '.edit_timeline_event' do
+ let(:timeline_event) { instance_double('IncidentManagement::TimelineEvent', incident: noteable, project: project) }
+
+ it 'calls IncidentsService' do
+ expect_next_instance_of(::SystemNotes::IncidentsService) do |service|
+ expect(service).to receive(:edit_timeline_event).with(timeline_event, author, was_changed: :occurred_at)
+ end
+
+ described_class.edit_timeline_event(timeline_event, author, was_changed: :occurred_at)
+ end
+ end
+
+ describe '.delete_timeline_event' do
+ it 'calls IncidentsService' do
+ expect_next_instance_of(::SystemNotes::IncidentsService) do |service|
+ expect(service).to receive(:delete_timeline_event).with(author)
+ end
+
+ described_class.delete_timeline_event(noteable, author)
+ end
+ end
end
diff --git a/spec/services/system_notes/incidents_service_spec.rb b/spec/services/system_notes/incidents_service_spec.rb
new file mode 100644
index 00000000000..d1b831e9c4c
--- /dev/null
+++ b/spec/services/system_notes/incidents_service_spec.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+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) }
+ let_it_be(:incident) { create(:incident, project: project, author: user) }
+ let_it_be(:timeline_event) do
+ create(:incident_management_timeline_event, project: project, incident: incident, author: author)
+ end
+
+ describe '#add_timeline_event' do
+ subject { described_class.new(noteable: incident).add_timeline_event(timeline_event) }
+
+ it_behaves_like 'a system note' do
+ let(:noteable) { incident }
+ let(:action) { 'timeline_event' }
+ 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})")
+ 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)
+ end
+
+ it_behaves_like 'a system note' do
+ let(:noteable) { incident }
+ let(:action) { 'timeline_event' }
+ end
+
+ context "when only timeline event's occurred_at was changed" 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})")
+ end
+ end
+
+ context "when only timeline event's note was changed" 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})")
+ end
+ end
+
+ context "when both timeline events occurred_at and note was changed" 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})")
+ end
+ end
+
+ context "when was changed reason is unknown" 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})")
+ end
+ end
+ end
+
+ describe '#delete_timeline_event' do
+ subject { described_class.new(noteable: incident).delete_timeline_event(author) }
+
+ it_behaves_like 'a system note' do
+ let(:noteable) { incident }
+ let(:action) { 'timeline_event' }
+ end
+
+ it 'posts the correct text to the system note' do
+ expect(subject.note).to match('deleted an incident timeline event')
+ end
+ end
+end
diff --git a/spec/services/system_notes/time_tracking_service_spec.rb b/spec/services/system_notes/time_tracking_service_spec.rb
index ec126cb5447..fdf18f4f29a 100644
--- a/spec/services/system_notes/time_tracking_service_spec.rb
+++ b/spec/services/system_notes/time_tracking_service_spec.rb
@@ -106,6 +106,30 @@ RSpec.describe ::SystemNotes::TimeTrackingService do
end
end
+ describe '#remove_timelog' do
+ subject { described_class.new(noteable: noteable, project: project, author: author).remove_timelog(timelog) }
+
+ context 'when the timelog has a positive time spent value' do
+ let_it_be(:noteable, reload: true) { create(:issue, project: project) }
+
+ let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: 1800, spent_at: '2022-03-30T00:00:00.000Z')}
+
+ it 'sets the note text' do
+ expect(subject.note).to eq "deleted 30m of spent time from 2022-03-30"
+ end
+ end
+
+ context 'when the timelog has a negative time spent value' do
+ let_it_be(:noteable, reload: true) { create(:issue, project: project) }
+
+ let(:timelog) { create(:timelog, user: author, issue: noteable, time_spent: -1800, spent_at: '2022-03-30T00:00:00.000Z')}
+
+ it 'sets the note text' do
+ expect(subject.note).to eq "deleted -30m of spent time from 2022-03-30"
+ end
+ end
+ end
+
describe '#change_time_spent' do
subject { described_class.new(noteable: noteable, project: project, author: author).change_time_spent }
diff --git a/spec/services/timelogs/delete_service_spec.rb b/spec/services/timelogs/delete_service_spec.rb
new file mode 100644
index 00000000000..c52cebdc5bf
--- /dev/null
+++ b/spec/services/timelogs/delete_service_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Timelogs::DeleteService do
+ let_it_be(:author) { create(:user) }
+ let_it_be(:project) { create(:project, :public) }
+ let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)}
+
+ let(:service) { described_class.new(timelog, user) }
+
+ describe '#execute' do
+ subject { service.execute }
+
+ context 'when the timelog exists' do
+ let(:user) { author }
+
+ it 'removes the timelog' do
+ expect { subject }.to change { Timelog.count }.by(-1)
+ end
+
+ it 'returns the removed timelog' do
+ expect(subject).to be_success
+ expect(subject.payload).to eq(timelog)
+ end
+ end
+
+ context 'when the timelog does not exist' do
+ let(:user) { create(:user) }
+ let!(:timelog) { nil }
+
+ it 'returns an error' do
+ expect(subject).to be_error
+ expect(subject.message).to eq('Timelog doesn\'t exist or you don\'t have permission to delete it')
+ expect(subject.http_status).to eq(404)
+ end
+ end
+
+ context 'when the user does not have permission' do
+ let(:user) { create(:user) }
+
+ it 'returns an error' do
+ expect(subject).to be_error
+ expect(subject.message).to eq('Timelog doesn\'t exist or you don\'t have permission to delete it')
+ expect(subject.http_status).to eq(404)
+ end
+ end
+
+ context 'when the timelog deletion fails' do
+ let(:user) { author }
+ let!(:timelog) { create(:timelog, user: author, issue: issue, time_spent: 1800)}
+
+ before do
+ allow(timelog).to receive(:destroy).and_return(false)
+ end
+
+ it 'returns an error' do
+ expect(subject).to be_error
+ expect(subject.message).to eq('Failed to remove timelog')
+ expect(subject.http_status).to eq(400)
+ end
+ end
+ end
+end
diff --git a/spec/services/users/destroy_service_spec.rb b/spec/services/users/destroy_service_spec.rb
index 80a506bb1d6..45dbe83b496 100644
--- a/spec/services/users/destroy_service_spec.rb
+++ b/spec/services/users/destroy_service_spec.rb
@@ -73,10 +73,10 @@ RSpec.describe Users::DestroyService do
allow(user).to receive(:personal_projects).and_return([])
expect_next_instance_of(Snippets::BulkDestroyService) do |bulk_destroy_service|
- expect(bulk_destroy_service).to receive(:execute).with(hard_delete: true).and_call_original
+ expect(bulk_destroy_service).to receive(:execute).with({ hard_delete: true }).and_call_original
end
- service.execute(user, hard_delete: true)
+ service.execute(user, { hard_delete: true })
end
it 'does not delete project snippets that the user is the author of' do
@@ -336,35 +336,24 @@ RSpec.describe Users::DestroyService do
context 'batched nullify' do
let(:other_user) { create(:user) }
- context 'when :nullify_in_batches_on_user_deletion feature flag is enabled' do
- it 'nullifies related associations in batches' do
- expect(other_user).to receive(:nullify_dependent_associations_in_batches).and_call_original
+ it 'nullifies related associations in batches' do
+ expect(other_user).to receive(:nullify_dependent_associations_in_batches).and_call_original
- described_class.new(user).execute(other_user, skip_authorization: true)
- end
-
- it 'nullifies last_updated_issues and closed_issues' do
- issue = create(:issue, closed_by: other_user, updated_by: other_user)
-
- described_class.new(user).execute(other_user, skip_authorization: true)
-
- issue.reload
-
- expect(issue.closed_by).to be_nil
- expect(issue.updated_by).to be_nil
- end
+ described_class.new(user).execute(other_user, skip_authorization: true)
end
- context 'when :nullify_in_batches_on_user_deletion feature flag is disabled' do
- before do
- stub_feature_flags(nullify_in_batches_on_user_deletion: false)
- end
+ it 'nullifies last_updated_issues, closed_issues, resource_label_events' do
+ issue = create(:issue, closed_by: other_user, updated_by: other_user)
+ resource_label_event = create(:resource_label_event, user: other_user)
- it 'does not use batching' do
- expect(other_user).not_to receive(:nullify_dependent_associations_in_batches)
+ described_class.new(user).execute(other_user, skip_authorization: true)
- described_class.new(user).execute(other_user, skip_authorization: true)
- end
+ issue.reload
+ resource_label_event.reload
+
+ expect(issue.closed_by).to be_nil
+ expect(issue.updated_by).to be_nil
+ expect(resource_label_event.user).to be_nil
end
end
end
diff --git a/spec/services/users/in_product_marketing_email_records_spec.rb b/spec/services/users/in_product_marketing_email_records_spec.rb
new file mode 100644
index 00000000000..0b9400dcd12
--- /dev/null
+++ b/spec/services/users/in_product_marketing_email_records_spec.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::InProductMarketingEmailRecords do
+ let_it_be(:user) { create :user }
+
+ subject(:records) { described_class.new }
+
+ it 'initializes records' do
+ expect(subject.records).to match_array []
+ end
+
+ describe '#save!' do
+ before do
+ allow(Users::InProductMarketingEmail).to receive(:bulk_insert!)
+
+ records.add(user, track: :team_short, series: 0)
+ records.add(user, track: :create, series: 1)
+ records.add(user, campaign: Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE)
+ end
+
+ it 'bulk inserts added records' do
+ expect(Users::InProductMarketingEmail).to receive(:bulk_insert!).with(records.records)
+ records.save!
+ end
+
+ it 'resets its records' do
+ records.save!
+ expect(records.records).to match_array []
+ end
+ end
+
+ describe '#add' do
+ it 'adds a Users::InProductMarketingEmail record to its records', :aggregate_failures do
+ freeze_time do
+ records.add(user, track: :team_short, series: 0)
+ records.add(user, track: :create, series: 1)
+ records.add(user, campaign: Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE)
+
+ first, second, third = records.records
+
+ expect(first).to be_a Users::InProductMarketingEmail
+ expect(first.campaign).to be_nil
+ expect(first.track.to_sym).to eq :team_short
+ expect(first.series).to eq 0
+ expect(first.created_at).to eq Time.zone.now
+ expect(first.updated_at).to eq Time.zone.now
+
+ expect(second).to be_a Users::InProductMarketingEmail
+ expect(second.campaign).to be_nil
+ expect(second.track.to_sym).to eq :create
+ expect(second.series).to eq 1
+ expect(second.created_at).to eq Time.zone.now
+ expect(second.updated_at).to eq Time.zone.now
+
+ expect(third).to be_a Users::InProductMarketingEmail
+ expect(third.campaign).to eq Users::InProductMarketingEmail::BUILD_IOS_APP_GUIDE
+ expect(third.track).to be_nil
+ expect(third.series).to be_nil
+ expect(third.created_at).to eq Time.zone.now
+ expect(third.updated_at).to eq Time.zone.now
+ end
+ end
+ end
+end
diff --git a/spec/services/users/validate_manual_otp_service_spec.rb b/spec/services/users/validate_manual_otp_service_spec.rb
new file mode 100644
index 00000000000..d71735814f2
--- /dev/null
+++ b/spec/services/users/validate_manual_otp_service_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::ValidateManualOtpService do
+ let_it_be(:user) { create(:user) }
+
+ let(:otp_code) { 42 }
+
+ subject(:validate) { described_class.new(user).execute(otp_code) }
+
+ context 'Devise' do
+ it 'calls Devise strategy' do
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::Devise) do |strategy|
+ expect(strategy).to receive(:validate).with(otp_code).once
+ end
+
+ validate
+ end
+ end
+
+ context 'FortiAuthenticator' do
+ before do
+ stub_feature_flags(forti_authenticator: user)
+ allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true)
+ end
+
+ it 'calls ManualOtp strategy' do
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp) do |strategy|
+ expect(strategy).to receive(:validate).with(otp_code).once
+ end
+
+ validate
+ end
+ end
+
+ context 'FortiTokenCloud' do
+ before do
+ stub_feature_flags(forti_token_cloud: user)
+ allow(::Gitlab.config.forti_token_cloud).to receive(:enabled).and_return(true)
+ end
+
+ it 'calls FortiTokenCloud strategy' do
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiTokenCloud) do |strategy|
+ expect(strategy).to receive(:validate).with(otp_code).once
+ end
+
+ validate
+ end
+ end
+
+ context 'unexpected error' do
+ before do
+ stub_feature_flags(forti_authenticator: user)
+ allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true)
+ end
+
+ it 'returns error' do
+ error_message = "boom!"
+
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::ManualOtp) do |strategy|
+ expect(strategy).to receive(:validate).with(otp_code).once.and_raise(StandardError, error_message)
+ end
+ expect(Gitlab::ErrorTracking).to receive(:log_exception)
+
+ result = validate
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq(error_message)
+ end
+ end
+end
diff --git a/spec/services/users/validate_otp_service_spec.rb b/spec/services/users/validate_otp_service_spec.rb
deleted file mode 100644
index 46b80b2149f..00000000000
--- a/spec/services/users/validate_otp_service_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Users::ValidateOtpService do
- let_it_be(:user) { create(:user) }
-
- let(:otp_code) { 42 }
-
- subject(:validate) { described_class.new(user).execute(otp_code) }
-
- context 'Devise' do
- it 'calls Devise strategy' do
- expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::Devise) do |strategy|
- expect(strategy).to receive(:validate).with(otp_code).once
- end
-
- validate
- end
- end
-
- context 'FortiAuthenticator' do
- before do
- stub_feature_flags(forti_authenticator: user)
- allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true)
- end
-
- it 'calls FortiAuthenticator strategy' do
- expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator) do |strategy|
- expect(strategy).to receive(:validate).with(otp_code).once
- end
-
- validate
- end
- end
-
- context 'FortiTokenCloud' do
- before do
- stub_feature_flags(forti_token_cloud: user)
- allow(::Gitlab.config.forti_token_cloud).to receive(:enabled).and_return(true)
- end
-
- it 'calls FortiTokenCloud strategy' do
- expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiTokenCloud) do |strategy|
- expect(strategy).to receive(:validate).with(otp_code).once
- end
-
- validate
- end
- end
-end
diff --git a/spec/services/users/validate_push_otp_service_spec.rb b/spec/services/users/validate_push_otp_service_spec.rb
new file mode 100644
index 00000000000..960b6bcd3bb
--- /dev/null
+++ b/spec/services/users/validate_push_otp_service_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Users::ValidatePushOtpService do
+ let_it_be(:user) { create(:user) }
+
+ subject(:validate) { described_class.new(user).execute }
+
+ context 'FortiAuthenticator' do
+ before do
+ stub_feature_flags(forti_authenticator: user)
+ allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true)
+ end
+
+ it 'calls PushOtp strategy' do
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::PushOtp) do |strategy|
+ expect(strategy).to receive(:validate).once
+ end
+
+ validate
+ end
+ end
+
+ context 'unexpected error' do
+ before do
+ stub_feature_flags(forti_authenticator: user)
+ allow(::Gitlab.config.forti_authenticator).to receive(:enabled).and_return(true)
+ end
+
+ it 'returns error' do
+ error_message = "boom!"
+
+ expect_next_instance_of(::Gitlab::Auth::Otp::Strategies::FortiAuthenticator::PushOtp) do |strategy|
+ expect(strategy).to receive(:validate).once.and_raise(StandardError, error_message)
+ end
+ expect(Gitlab::ErrorTracking).to receive(:log_exception)
+
+ result = validate
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq(error_message)
+ 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
new file mode 100644
index 00000000000..04944645c9b
--- /dev/null
+++ b/spec/services/work_items/delete_task_service_spec.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::DeleteTaskService do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
+ let_it_be_with_refind(:task) { create(:work_item, project: project, author: developer) }
+ let_it_be_with_refind(:list_work_item) do
+ create(:work_item, project: project, description: "- [ ] #{task.to_reference}+")
+ end
+
+ let(:current_user) { developer }
+ let(:line_number_start) { 1 }
+ let(:params) do
+ {
+ line_number_start: line_number_start,
+ line_number_end: 1,
+ task: task
+ }
+ end
+
+ before_all do
+ create(:issue_link, source_id: list_work_item.id, target_id: task.id)
+ end
+
+ shared_examples 'failing WorkItems::DeleteTaskService' do |error_message|
+ it { is_expected.to be_error }
+
+ it 'does not remove work item or issue links' do
+ expect do
+ service_result
+ list_work_item.reload
+ end.to not_change(WorkItem, :count).and(
+ not_change(IssueLink, :count)
+ ).and(
+ not_change(list_work_item, :description)
+ )
+ end
+
+ it 'returns an error message' do
+ expect(service_result.errors).to contain_exactly(error_message)
+ end
+ end
+
+ describe '#execute' do
+ subject(:service_result) do
+ described_class.new(
+ work_item: list_work_item,
+ current_user: current_user,
+ lock_version: list_work_item.lock_version,
+ task_params: params
+ ).execute
+ end
+
+ context 'when work item params are valid' do
+ it { is_expected.to be_success }
+
+ it 'deletes the work item and the related issue link' do
+ expect do
+ service_result
+ end.to change(WorkItem, :count).by(-1).and(
+ change(IssueLink, :count).by(-1)
+ )
+ end
+
+ 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
+ end
+
+ context 'when first operation fails' do
+ let(:line_number_start) { -1 }
+
+ it_behaves_like 'failing WorkItems::DeleteTaskService', 'line_number_start must be greater than 0'
+ end
+
+ context 'when last operation fails' do
+ let_it_be(:non_member_user) { create(:user) }
+
+ let(:current_user) { non_member_user }
+
+ it_behaves_like 'failing WorkItems::DeleteTaskService', 'User not authorized to delete work item'
+ 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
new file mode 100644
index 00000000000..bca72da0efa
--- /dev/null
+++ b/spec/services/work_items/task_list_reference_removal_service_spec.rb
@@ -0,0 +1,151 @@
+# frozen_string_literal: true
+
+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(:single_line_work_item, refind: true) do
+ create(:work_item, project: project, description: "- [ ] #{task.to_reference}+ single line")
+ end
+
+ let_it_be(:multiple_line_work_item, refind: true) do
+ create(
+ :work_item,
+ project: project,
+ description: <<~MARKDOWN
+ Any text
+
+ * [ ] Item to be converted
+ #{task.to_reference}+ second line
+ third line
+ * [x] task
+
+ More text
+ MARKDOWN
+ )
+ end
+
+ let(:line_number_start) { 3 }
+ let(:line_number_end) { 5 }
+ let(:work_item) { multiple_line_work_item }
+ let(:lock_version) { work_item.lock_version }
+
+ shared_examples 'successful work item task reference removal service' do |expected_description|
+ it { is_expected.to be_success }
+
+ it 'removes the task list item containing the task reference' do
+ expect do
+ result
+ end.to change(work_item, :description).from(work_item.description).to(expected_description)
+ end
+
+ it 'creates system notes' do
+ expect do
+ result
+ end.to change(Note, :count).by(1)
+
+ expect(Note.last.note).to include('changed the description')
+ end
+ end
+
+ shared_examples 'failing work item task reference removal service' do |error_message|
+ it { is_expected.to be_error }
+
+ it 'does not change the work item description' do
+ expect do
+ result
+ work_item.reload
+ end.to not_change(work_item, :description)
+ end
+
+ it 'returns an error message' do
+ expect(result.errors).to contain_exactly(error_message)
+ end
+ end
+
+ describe '#execute' do
+ subject(:result) do
+ described_class.new(
+ work_item: work_item,
+ task: task,
+ line_number_start: line_number_start,
+ line_number_end: line_number_end,
+ lock_version: lock_version,
+ current_user: developer
+ ).execute
+ end
+
+ context 'when task mardown spans a single line' do
+ let(:line_number_start) { 1 }
+ let(:line_number_end) { 1 }
+ let(:work_item) { single_line_work_item }
+
+ it_behaves_like 'successful work item task reference removal service', ''
+
+ 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') }
+
+ let(:work_item) { no_matching_work_item }
+
+ it_behaves_like 'failing work item task reference removal service', 'Unable to detect a task on lines 1-1'
+ end
+
+ context 'when description reference does not exactly match the task reference' do
+ before do
+ work_item.update!(description: work_item.description.gsub(task.to_reference, "#{task.to_reference}200"))
+ end
+
+ it_behaves_like 'failing work item task reference removal service', 'Unable to detect a task on lines 1-1'
+ end
+ 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"
+ end
+
+ context 'when updating the work item fails' do
+ before do
+ work_item.title = nil
+ end
+
+ it_behaves_like 'failing work item task reference removal service', "Title can't be blank"
+ end
+
+ context 'when description is empty' do
+ let_it_be(:empty_work_item) { create(:work_item, project: project, description: '') }
+
+ let(:work_item) { empty_work_item }
+
+ it_behaves_like 'failing work item task reference removal service', "Work item description can't be blank"
+ end
+
+ context 'when line_number_start is lower than 1' do
+ let(:line_number_start) { 0 }
+
+ it_behaves_like 'failing work item task reference removal service', 'line_number_start must be greater than 0'
+ end
+
+ context 'when line_number_end is lower than line_number_start' do
+ let(:line_number_end) { line_number_start - 1 }
+
+ it_behaves_like 'failing work item task reference removal service',
+ 'line_number_end must be greater or equal to line_number_start'
+ end
+
+ context 'when lock_version is older than current' do
+ let(:lock_version) { work_item.lock_version - 1 }
+
+ it_behaves_like 'failing work item task reference removal service', 'Stale work item. Check lock version'
+ end
+
+ context 'when work item is stale before updating' do
+ it_behaves_like 'failing work item task reference removal service', 'Stale work item. Check lock version' do
+ before do
+ ::WorkItem.where(id: work_item.id).update_all(lock_version: lock_version + 1)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 88f10cc2a01..e49e82f6ab6 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -199,6 +199,7 @@ RSpec.configure do |config|
config.include SidekiqMiddleware
config.include StubActionCableConnection, type: :channel
config.include StubSpamServices
+ config.include RenderedHelpers
config.include RSpec::Benchmark::Matchers, type: :benchmark
include StubFeatureFlags
@@ -292,9 +293,6 @@ RSpec.configure do |config|
# tests, until we introduce it in user settings
stub_feature_flags(forti_token_cloud: false)
- # Disable for now whilst we add more states
- stub_feature_flags(restructured_mr_widget: false)
-
# These feature flag are by default disabled and used in disaster recovery mode
stub_feature_flags(ci_queueing_disaster_recovery_disable_fair_scheduling: false)
stub_feature_flags(ci_queueing_disaster_recovery_disable_quota: false)
diff --git a/spec/support/database/query_analyzer.rb b/spec/support/database/query_analyzer.rb
index 6d6627d54b9..aaa1b3516a3 100644
--- a/spec/support/database/query_analyzer.rb
+++ b/spec/support/database/query_analyzer.rb
@@ -6,13 +6,17 @@
RSpec.configure do |config|
config.before do |example|
if example.metadata.fetch(:query_analyzers, true)
- ::Gitlab::Database::QueryAnalyzer.instance.begin!
+ ::Gitlab::Database::QueryAnalyzer.instance.begin!(
+ ::Gitlab::Database::QueryAnalyzer.instance.all_analyzers
+ )
end
end
config.after do |example|
if example.metadata.fetch(:query_analyzers, true)
- ::Gitlab::Database::QueryAnalyzer.instance.end!
+ ::Gitlab::Database::QueryAnalyzer.instance.end!(
+ ::Gitlab::Database::QueryAnalyzer.instance.all_analyzers
+ )
end
end
end
diff --git a/spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb b/spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb
index 4624a8ac82a..e02bf66507a 100644
--- a/spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb
+++ b/spec/support/gitlab/usage/metrics_instrumentation_shared_examples.rb
@@ -5,6 +5,10 @@ RSpec.shared_examples 'a correct instrumented metric value' do |params|
let(:options) { params[:options] }
let(:metric) { described_class.new(time_frame: time_frame, options: options) }
+ around do |example|
+ freeze_time { example.run }
+ end
+
before do
if described_class.respond_to?(:relation) && described_class.relation.respond_to?(:connection)
allow(described_class.relation.connection).to receive(:transaction_open?).and_return(false)
diff --git a/spec/support/graphql/arguments.rb b/spec/support/graphql/arguments.rb
index 20e940030f8..a5bb01c31a3 100644
--- a/spec/support/graphql/arguments.rb
+++ b/spec/support/graphql/arguments.rb
@@ -40,7 +40,7 @@ module Graphql
when Array then "[#{value.map { |v| as_graphql_literal(v) }.join(',')}]"
when Hash then "{#{new(value)}}"
when Integer, Float, Symbol then value.to_s
- when String then "\"#{value.gsub(/"/, '\\"')}\""
+ when String, GlobalID then "\"#{value.to_s.gsub(/"/, '\\"')}\""
when Time, Date then "\"#{value.iso8601}\""
when nil then 'null'
when true then 'true'
@@ -49,7 +49,7 @@ module Graphql
value.to_graphql_value
end
rescue NoMethodError
- raise ArgumentError, "Cannot represent #{value} as GraphQL literal"
+ raise ArgumentError, "Cannot represent #{value} (instance of #{value.class}) as GraphQL literal"
end
def merge(other)
diff --git a/spec/support/helpers/database/migration_testing_helpers.rb b/spec/support/helpers/database/migration_testing_helpers.rb
new file mode 100644
index 00000000000..916446e66b7
--- /dev/null
+++ b/spec/support/helpers/database/migration_testing_helpers.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Database
+ module MigrationTestingHelpers
+ def define_background_migration(name)
+ klass = Class.new do
+ # Can't simply def perform here as we won't have access to the block,
+ # similarly can't define_method(:perform, &block) here as it would change the block receiver
+ define_method(:perform) { |*args| yield(*args) }
+ end
+ stub_const("Gitlab::BackgroundMigration::#{name}", klass)
+ klass
+ end
+
+ def expect_migration_call_counts(migrations_to_calls)
+ migrations_to_calls.each do |migration, calls|
+ expect_next_instances_of(migration, calls) do |m|
+ expect(m).to receive(:perform).and_call_original
+ end
+ end
+ end
+
+ def expect_recorded_migration_runs(migrations_to_runs)
+ migrations_to_runs.each do |migration, runs|
+ path = File.join(result_dir, migration.name.demodulize)
+ if runs.zero?
+ expect(Pathname(path)).not_to be_exist
+ else
+ num_subdirs = Pathname(path).children.count(&:directory?)
+ expect(num_subdirs).to eq(runs)
+ end
+ end
+ end
+
+ def expect_migration_runs(migrations_to_run_counts)
+ expect_migration_call_counts(migrations_to_run_counts)
+
+ yield
+
+ expect_recorded_migration_runs(migrations_to_run_counts)
+ end
+ end
+end
diff --git a/spec/support/helpers/features/snippet_helpers.rb b/spec/support/helpers/features/snippet_helpers.rb
index dc718b1b212..3e32b0e4c67 100644
--- a/spec/support/helpers/features/snippet_helpers.rb
+++ b/spec/support/helpers/features/snippet_helpers.rb
@@ -67,14 +67,19 @@ module Spec
end
def snippet_fill_in_form(title: nil, content: nil, file_name: nil, description: nil, visibility: nil)
+ if content
+ snippet_fill_in_content(content)
+ # It takes some time after sending keys for the vue component to
+ # update so let Capybara wait for the content before proceeding
+ expect(page).to have_content(content)
+ end
+
snippet_fill_in_title(title) if title
snippet_fill_in_description(description) if description
snippet_fill_in_file_name(file_name) if file_name
- snippet_fill_in_content(content) if content
-
snippet_fill_in_visibility(visibility) if visibility
end
end
diff --git a/spec/support/helpers/features/sorting_helpers.rb b/spec/support/helpers/features/sorting_helpers.rb
index a6428bf8573..50b8083ebb3 100644
--- a/spec/support/helpers/features/sorting_helpers.rb
+++ b/spec/support/helpers/features/sorting_helpers.rb
@@ -21,6 +21,14 @@ module Spec
click_link(value)
end
end
+
+ # pajamas_sort_by is used to sort new pajamas dropdowns. When
+ # all of the dropdowns are converted, pajamas_sort_by can be renamed to sort_by
+ # https://gitlab.com/groups/gitlab-org/-/epics/7551
+ def pajamas_sort_by(value)
+ find('.filter-dropdown-container .dropdown').click
+ find('.dropdown-item', text: value).click
+ end
end
end
end
diff --git a/spec/support/helpers/filtered_search_helpers.rb b/spec/support/helpers/filtered_search_helpers.rb
index b6cf78b9046..93122ca3d0c 100644
--- a/spec/support/helpers/filtered_search_helpers.rb
+++ b/spec/support/helpers/filtered_search_helpers.rb
@@ -187,4 +187,116 @@ module FilteredSearchHelpers
toggle.click if toggle.visible?
end
end
+
+ ##
+ # For use with gl-filtered-search
+ def select_tokens(*args, submit: false)
+ within '[data-testid="filtered-search-input"]' do
+ find_field('Search').click
+
+ args.each do |token|
+ # Move mouse away to prevent invoking tooltips on usernames, which blocks the search input
+ find_button('Search').hover
+
+ if token == '='
+ click_on '= is'
+ else
+ click_on token
+ end
+
+ wait_for_requests
+ end
+ end
+
+ if submit
+ send_keys :enter
+ end
+ end
+
+ def get_suggestion_count
+ all('.gl-filtered-search-suggestion').size
+ end
+
+ def submit_search_term(value)
+ click_filtered_search_bar
+ send_keys(value, :enter)
+ end
+
+ def click_filtered_search_bar
+ find('.gl-filtered-search-last-item').click
+ end
+
+ def click_token_segment(value)
+ find('.gl-filtered-search-token-segment', text: value).click
+ end
+
+ def expect_visible_suggestions_list
+ expect(page).to have_css('.gl-filtered-search-suggestion-list')
+ end
+
+ def expect_hidden_suggestions_list
+ expect(page).not_to have_css('.gl-filtered-search-suggestion-list')
+ end
+
+ def expect_suggestion(value)
+ expect(page).to have_css('.gl-filtered-search-suggestion', text: value)
+ end
+
+ def expect_no_suggestion(value)
+ expect(page).not_to have_css('.gl-filtered-search-suggestion', text: value)
+ end
+
+ def expect_suggestion_count(count)
+ expect(page).to have_css('.gl-filtered-search-suggestion', count: count)
+ end
+
+ def expect_assignee_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Assignee = #{value}"
+ end
+
+ def expect_author_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Author = #{value}"
+ end
+
+ def expect_label_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Label = ~#{value}"
+ end
+
+ def expect_negated_label_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Label != ~#{value}"
+ end
+
+ def expect_milestone_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Milestone = %#{value}"
+ end
+
+ def expect_negated_milestone_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Milestone != %#{value}"
+ end
+
+ def expect_epic_token(value)
+ expect(page).to have_css '.gl-filtered-search-token', text: "Epic = #{value}"
+ end
+
+ def expect_search_term(value)
+ value.split(' ').each do |term|
+ expect(page).to have_css '.gl-filtered-search-term', text: term
+ end
+ end
+
+ def expect_empty_search_term
+ expect(page).to have_css '.gl-filtered-search-term', text: ''
+ end
+
+ def expect_token_segment(value)
+ expect(page).to have_css '.gl-filtered-search-token-segment', text: value
+ end
+
+ def expect_recent_searches_history_item(value)
+ expect(page).to have_css '.gl-search-box-by-click-history-item', text: value
+ end
+
+ def expect_recent_searches_history_item_count(count)
+ expect(page).to have_css '.gl-search-box-by-click-history-item', count: count
+ end
end
diff --git a/spec/support/helpers/gitaly_setup.rb b/spec/support/helpers/gitaly_setup.rb
index 0ad83bdeeb2..264281ef94a 100644
--- a/spec/support/helpers/gitaly_setup.rb
+++ b/spec/support/helpers/gitaly_setup.rb
@@ -31,6 +31,10 @@ module GitalySetup
expand_path('tmp/tests/gitaly')
end
+ def runtime_dir
+ expand_path('tmp/run')
+ end
+
def tmp_tests_gitaly_bin_dir
File.join(tmp_tests_gitaly_dir, '_build', 'bin')
end
@@ -102,12 +106,14 @@ module GitalySetup
Gitlab.config.repositories.storages[REPOS_STORAGE].legacy_disk_path
end
- def service_binary(service)
+ def service_cmd(service, toml = nil)
+ toml ||= config_path(service)
+
case service
when :gitaly, :gitaly2
- 'gitaly'
+ [File.join(tmp_tests_gitaly_bin_dir, 'gitaly'), toml]
when :praefect
- 'praefect'
+ [File.join(tmp_tests_gitaly_bin_dir, 'praefect'), '-config', toml]
end
end
@@ -132,14 +138,18 @@ module GitalySetup
end
def start_praefect
- start(:praefect)
+ if ENV['GITALY_PRAEFECT_WITH_DB']
+ LOGGER.debug 'Starting Praefect with database election strategy'
+ start(:praefect, File.join(tmp_tests_gitaly_dir, 'praefect-db.config.toml'))
+ else
+ LOGGER.debug 'Starting Praefect with in-memory election strategy'
+ start(:praefect)
+ end
end
def start(service, toml = nil)
toml ||= config_path(service)
- args = ["#{tmp_tests_gitaly_bin_dir}/#{service_binary(service)}"]
- args.push("-config") if service == :praefect
- args.push(toml)
+ args = service_cmd(service, toml)
# Ensure user configuration does not affect Git
# Context: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/58776#note_547613780
@@ -259,6 +269,7 @@ module GitalySetup
{ 'default' => repos_path },
force: true,
options: {
+ runtime_dir: runtime_dir,
prometheus_listen_addr: 'localhost:9236'
}
)
@@ -267,12 +278,47 @@ module GitalySetup
{ 'default' => repos_path },
force: true,
options: {
- runtime_dir: File.join(gitaly_dir, "run2"),
+ runtime_dir: runtime_dir,
gitaly_socket: "gitaly2.socket",
config_filename: "gitaly2.config.toml"
}
)
- Gitlab::SetupHelper::Praefect.create_configuration(gitaly_dir, { 'praefect' => repos_path }, force: true)
+
+ # In CI we need to pre-generate both config files.
+ # For local testing we'll create the correct file on-demand.
+ if ENV['CI'] || ENV['GITALY_PRAEFECT_WITH_DB'].nil?
+ Gitlab::SetupHelper::Praefect.create_configuration(
+ gitaly_dir,
+ { 'praefect' => repos_path },
+ force: true
+ )
+ end
+
+ if ENV['CI'] || ENV['GITALY_PRAEFECT_WITH_DB']
+ Gitlab::SetupHelper::Praefect.create_configuration(
+ gitaly_dir,
+ { 'praefect' => repos_path },
+ force: true,
+ options: {
+ per_repository: true,
+ config_filename: 'praefect-db.config.toml',
+ pghost: ENV['CI'] ? 'postgres' : ENV.fetch('PGHOST'),
+ pgport: ENV['CI'] ? 5432 : ENV.fetch('PGPORT').to_i,
+ pguser: ENV['CI'] ? 'postgres' : ENV.fetch('USER')
+ }
+ )
+ end
+
+ # In CI no database is running when Gitaly is set up
+ # so scripts/gitaly-test-spawn will take care of it instead.
+ setup_praefect unless ENV['CI']
+ end
+
+ def setup_praefect
+ return unless ENV['GITALY_PRAEFECT_WITH_DB']
+
+ migrate_cmd = service_cmd(:praefect, File.join(tmp_tests_gitaly_dir, 'praefect-db.config.toml')) + ['sql-migrate']
+ system(env, *migrate_cmd, [:out, :err] => 'log/praefect-test.log')
end
def socket_path(service)
@@ -325,7 +371,7 @@ module GitalySetup
message += "- The `praefect` binary does not exist: #{praefect_binary}\n" unless File.exist?(praefect_binary)
message += "- The `git` binary does not exist: #{git_binary}\n" unless File.exist?(git_binary)
- message += "\nCheck log/gitaly-test.log for errors.\n"
+ message += "\nCheck log/gitaly-test.log & log/praefect-test.log for errors.\n"
unless ENV['CI']
message += "\nIf binaries are missing, try running `make -C tmp/tests/gitaly all WITH_BUNDLED_GIT=YesPlease`.\n"
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index ff8908e531a..db8d45f61ea 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -244,15 +244,16 @@ module GraphqlHelpers
def graphql_mutation(name, input, fields = nil, &block)
raise ArgumentError, 'Please pass either `fields` parameter or a block to `#graphql_mutation`, but not both.' if fields.present? && block_given?
+ name = name.graphql_name if name.respond_to?(:graphql_name)
mutation_name = GraphqlHelpers.fieldnamerize(name)
input_variable_name = "$#{input_variable_name_for_mutation(name)}"
mutation_field = GitlabSchema.mutation.fields[mutation_name]
fields = yield if block_given?
- fields ||= all_graphql_fields_for(mutation_field.type.to_graphql)
+ fields ||= all_graphql_fields_for(mutation_field.type.to_type_signature)
query = <<~MUTATION
- mutation(#{input_variable_name}: #{mutation_field.arguments['input'].type.to_graphql}) {
+ mutation(#{input_variable_name}: #{mutation_field.arguments['input'].type.to_type_signature}) {
#{mutation_name}(input: #{input_variable_name}) {
#{fields}
}
@@ -264,7 +265,7 @@ module GraphqlHelpers
end
def variables_for_mutation(name, input)
- graphql_input = prepare_input_for_mutation(input)
+ graphql_input = prepare_variables(input)
{ input_variable_name_for_mutation(name) => graphql_input }
end
@@ -273,25 +274,35 @@ module GraphqlHelpers
return unless variables
return variables if variables.is_a?(String)
- ::Gitlab::Utils::MergeHash.merge(Array.wrap(variables).map(&:to_h)).to_json
+ # Combine variables into a single hash.
+ hash = ::Gitlab::Utils::MergeHash.merge(Array.wrap(variables).map(&:to_h))
+
+ prepare_variables(hash).to_json
end
- # Recursively convert a Hash with Ruby-style keys to GraphQL fieldname-style keys
+ # Recursively convert any ruby object we can pass as a variable value
+ # to an object we can serialize with JSON, using fieldname-style keys
#
- # prepare_input_for_mutation({ 'my_key' => 1 })
- # => { 'myKey' => 1}
- def prepare_input_for_mutation(input)
- input.to_h do |name, value|
- value = prepare_input_for_mutation(value) if value.is_a?(Hash)
+ # prepare_variables({ 'my_key' => 1 })
+ # => { 'myKey' => 1 }
+ # prepare_variables({ enums: [:FOO, :BAR], user_id: global_id_of(user) })
+ # => { 'enums' => ['FOO', 'BAR'], 'userId' => "gid://User/123" }
+ # prepare_variables({ nested: { hash_values: { are_supported: true } } })
+ # => { 'nested' => { 'hashValues' => { 'areSupported' => true } } }
+ def prepare_variables(input)
+ return input.map { prepare_variables(_1) } if input.is_a?(Array)
+ return input.to_s if input.is_a?(GlobalID) || input.is_a?(Symbol)
+ return input unless input.is_a?(Hash)
- [GraphqlHelpers.fieldnamerize(name), value]
+ input.to_h do |name, value|
+ [GraphqlHelpers.fieldnamerize(name), prepare_variables(value)]
end
end
def input_variable_name_for_mutation(mutation_name)
mutation_name = GraphqlHelpers.fieldnamerize(mutation_name)
mutation_field = GitlabSchema.mutation.fields[mutation_name]
- input_type = field_type(mutation_field.arguments['input'])
+ input_type = mutation_field.arguments['input'].type.unwrap.to_type_signature
GraphqlHelpers.fieldnamerize(input_type)
end
@@ -346,6 +357,10 @@ module GraphqlHelpers
end
end
+ def query_double(schema:)
+ double('query', schema: schema)
+ end
+
def wrap_fields(fields)
fields = Array.wrap(fields).map do |field|
case field
@@ -646,11 +661,11 @@ module GraphqlHelpers
end
end
- def global_id_of(model, id: nil, model_name: nil)
+ def global_id_of(model = nil, id: nil, model_name: nil)
if id || model_name
- ::Gitlab::GlobalId.build(model, id: id, model_name: model_name).to_s
+ ::Gitlab::GlobalId.as_global_id(id || model.id, model_name: model_name || model.class.name)
else
- model.to_global_id.to_s
+ model.to_global_id
end
end
@@ -683,26 +698,94 @@ module GraphqlHelpers
end
end
- # assumes query_string to be let-bound in the current context
- def execute_query(query_type, schema: empty_schema, graphql: query_string)
+ # assumes query_string and user to be let-bound in the current context
+ def execute_query(query_type, schema: empty_schema, graphql: query_string, raise_on_error: false)
schema.query(query_type)
- schema.execute(
+ r = schema.execute(
graphql,
context: { current_user: user },
variables: {}
)
+
+ if raise_on_error && r.to_h['errors'].present?
+ raise NoData, r.to_h['errors']
+ end
+
+ r
end
def empty_schema
Class.new(GraphQL::Schema) do
use GraphQL::Pagination::Connections
use Gitlab::Graphql::Pagination::Connections
+ use BatchLoader::GraphQL
lazy_resolve ::Gitlab::Graphql::Lazy, :force
end
end
+ # Wrapper around a_hash_including that supports unpacking with **
+ class UnpackableMatcher < SimpleDelegator
+ include RSpec::Matchers
+
+ attr_reader :to_hash
+
+ def initialize(hash)
+ @to_hash = hash
+ super(a_hash_including(hash))
+ end
+
+ def to_json(_opts = {})
+ to_hash.to_json
+ end
+
+ def as_json(opts = {})
+ to_hash.as_json(opts)
+ end
+ end
+
+ # Construct a matcher for GraphQL entity response objects, of the form
+ # `{ "id" => "some-gid" }`.
+ #
+ # Usage:
+ #
+ # ```ruby
+ # expect(graphql_data_at(:path, :to, :entity)).to match a_graphql_entity_for(user)
+ # ```
+ #
+ # This can be called as:
+ #
+ # ```ruby
+ # a_graphql_entity_for(project, :full_path) # also checks that `entity['fullPath'] == project.full_path
+ # a_graphql_entity_for(project, full_path: 'some/path') # same as above, with explicit values
+ # a_graphql_entity_for(user, :username, foo: 'bar') # combinations of the above
+ # a_graphql_entity_for(foo: 'bar') # if properties are defined, the model is not necessary
+ # ```
+ #
+ # Note that the model instance must not be nil, unless some properties are
+ # explicitly passed in. The following are rejected with `ArgumentError`:
+ #
+ # ```
+ # a_graphql_entity_for(nil, :username)
+ # a_graphql_entity_for(:username)
+ # a_graphql_entity_for
+ # ```
+ #
+ def a_graphql_entity_for(model = nil, *fields, **attrs)
+ raise ArgumentError, 'model is nil' if model.nil? && fields.any?
+
+ attrs.transform_keys! { GraphqlHelpers.fieldnamerize(_1) }
+ attrs['id'] = global_id_of(model).to_s if model
+ fields.each do |name|
+ attrs[GraphqlHelpers.fieldnamerize(name)] = model.public_send(name)
+ end
+
+ raise ArgumentError, 'no attributes' if attrs.empty?
+
+ UnpackableMatcher.new(attrs)
+ end
+
# A lookahead that selects everything
def positive_lookahead
double(selects?: true).tap do |selection|
diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb
index afa7ee84bda..60097e301c4 100644
--- a/spec/support/helpers/migrations_helpers.rb
+++ b/spec/support/helpers/migrations_helpers.rb
@@ -1,12 +1,18 @@
# frozen_string_literal: true
module MigrationsHelpers
- def active_record_base
- Gitlab::Database.database_base_models.fetch(self.class.metadata[:database] || :main)
+ def active_record_base(database: nil)
+ database_name = database || self.class.metadata[:database] || :main
+
+ unless Gitlab::Database::DATABASE_NAMES.include?(database_name.to_s)
+ raise ArgumentError, "#{database_name} is not a valid argument"
+ end
+
+ Gitlab::Database.database_base_models[database_name] || Gitlab::Database.database_base_models[:main]
end
- def table(name)
- Class.new(active_record_base) do
+ def table(name, database: nil)
+ Class.new(active_record_base(database: database)) do
self.table_name = name
self.inheritance_column = :_type_disabled
@@ -150,6 +156,13 @@ module MigrationsHelpers
end
def migrate!
+ open_transactions = ActiveRecord::Base.connection.open_transactions
+ allow_next_instance_of(described_class) do |migration|
+ allow(migration).to receive(:transaction_open?) do
+ ActiveRecord::Base.connection.open_transactions > open_transactions
+ end
+ end
+
migration_context.up do |migration|
migration.name == described_class.name
end
diff --git a/spec/support/helpers/namespaces_test_helper.rb b/spec/support/helpers/namespaces_test_helper.rb
new file mode 100644
index 00000000000..9762c38a9bb
--- /dev/null
+++ b/spec/support/helpers/namespaces_test_helper.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module NamespacesTestHelper
+ def get_buy_minutes_path(namespace)
+ buy_minutes_subscriptions_path(selected_group: namespace.id)
+ end
+
+ def get_buy_storage_path(namespace)
+ buy_storage_subscriptions_path(selected_group: namespace.id)
+ end
+end
+
+NamespacesTestHelper.prepend_mod
diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb
index 315303401cc..e11548d0b75 100644
--- a/spec/support/helpers/navbar_structure_helper.rb
+++ b/spec/support/helpers/navbar_structure_helper.rb
@@ -93,7 +93,7 @@ module NavbarStructureHelper
)
end
- def analytics_sub_nav_item
+ def project_analytics_sub_nav_item
[
_('Value stream'),
_('CI/CD'),
@@ -102,6 +102,12 @@ module NavbarStructureHelper
_('Repository')
]
end
+
+ def group_analytics_sub_nav_item
+ [
+ _('Contribution')
+ ]
+ end
end
NavbarStructureHelper.prepend_mod
diff --git a/spec/support/helpers/next_instance_of.rb b/spec/support/helpers/next_instance_of.rb
index 95d8936588c..461d411a5ce 100644
--- a/spec/support/helpers/next_instance_of.rb
+++ b/spec/support/helpers/next_instance_of.rb
@@ -22,9 +22,15 @@ module NextInstanceOf
def stub_new(target, number, ordered = false, *new_args, &blk)
receive_new = receive(:new)
receive_new.ordered if ordered
- receive_new.exactly(number).times if number
receive_new.with(*new_args) if new_args.any?
+ if number.is_a?(Range)
+ receive_new.at_least(number.begin).times if number.begin
+ receive_new.at_most(number.end).times if number.end
+ elsif number
+ receive_new.exactly(number).times
+ end
+
target.to receive_new.and_wrap_original do |method, *original_args|
method.call(*original_args).tap(&blk)
end
diff --git a/spec/support/helpers/project_helpers.rb b/spec/support/helpers/project_helpers.rb
index 89f0163b4b6..2ea6405e48c 100644
--- a/spec/support/helpers/project_helpers.rb
+++ b/spec/support/helpers/project_helpers.rb
@@ -24,4 +24,20 @@ module ProjectHelpers
project.update!(params)
end
+
+ def create_project_with_statistics(namespace = nil, with_data: false, size_multiplier: 1)
+ project = namespace.present? ? create(:project, namespace: namespace) : create(:project)
+ project.tap do |p|
+ create(:project_statistics, project: p, with_data: with_data, size_multiplier: size_multiplier)
+ end
+ end
+
+ def grace_months_after_deletion_notification
+ (::Gitlab::CurrentSettings.inactive_projects_delete_after_months -
+ ::Gitlab::CurrentSettings.inactive_projects_send_warning_email_after_months).months
+ end
+
+ def deletion_date
+ Date.parse(grace_months_after_deletion_notification.from_now.to_s).to_s
+ end
end
diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb
index d18a1d23584..01839a74e65 100644
--- a/spec/support/helpers/query_recorder.rb
+++ b/spec/support/helpers/query_recorder.rb
@@ -80,7 +80,8 @@ module ActiveRecord
if values[:cached] && skip_cached
@cached << values[:sql]
- elsif !skip_schema_queries || !values[:name]&.include?("SCHEMA")
+ elsif !ignorable?(values)
+
backtrace = @query_recorder_debug ? show_backtrace(values, duration) : nil
@log << values[:sql]
store_sql_by_source(values: values, duration: duration, backtrace: backtrace)
@@ -102,5 +103,12 @@ module ActiveRecord
def occurrences
@occurrences ||= @log.group_by(&:to_s).transform_values(&:count)
end
+
+ def ignorable?(values)
+ return true if skip_schema_queries && values[:name]&.include?("SCHEMA")
+ return true if values[:name]&.match(/License Load/)
+
+ false
+ end
end
end
diff --git a/spec/support/helpers/rendered_helpers.rb b/spec/support/helpers/rendered_helpers.rb
new file mode 100644
index 00000000000..137b7d5f708
--- /dev/null
+++ b/spec/support/helpers/rendered_helpers.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+module RenderedHelpers
+ # Wraps the `rendered` in `expect` to make it the target of an expectation.
+ # Designed to read nicely for one-liners.
+ # rubocop:disable RSpec/VoidExpect
+ def expect_rendered
+ render
+ expect(rendered)
+ end
+ # rubocop:enable RSpec/VoidExpect
+end
diff --git a/spec/support/helpers/saas_test_helper.rb b/spec/support/helpers/saas_test_helper.rb
new file mode 100644
index 00000000000..a8162603cd9
--- /dev/null
+++ b/spec/support/helpers/saas_test_helper.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module SaasTestHelper
+ def get_next_url
+ "https://next.gitlab.com"
+ end
+end
+
+SaasTestHelper.prepend_mod
diff --git a/spec/support/helpers/stub_feature_flags.rb b/spec/support/helpers/stub_feature_flags.rb
index 77f31169ecb..f1654e55b7e 100644
--- a/spec/support/helpers/stub_feature_flags.rb
+++ b/spec/support/helpers/stub_feature_flags.rb
@@ -70,4 +70,18 @@ module StubFeatureFlags
def skip_default_enabled_yaml_check
allow(Feature::Definition).to receive(:default_enabled?).and_return(false)
end
+
+ def stub_feature_flag_definition(name, opts = {})
+ opts = opts.with_defaults(
+ name: name,
+ type: 'development',
+ default_enabled: false
+ )
+
+ Feature::Definition.new("#{opts[:type]}/#{name}.yml", opts).tap do |definition|
+ all_definitions = Feature::Definition.definitions
+ all_definitions[definition.key] = definition
+ allow(Feature::Definition).to receive(:definitions).and_return(all_definitions)
+ end
+ end
end
diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb
index d49a14f7f5b..024f06cae1b 100644
--- a/spec/support/helpers/stub_object_storage.rb
+++ b/spec/support/helpers/stub_object_storage.rb
@@ -7,11 +7,6 @@ module StubObjectStorage
**params)
end
- def stub_object_storage_pseudonymizer
- stub_object_storage(connection_params: Pseudonymizer::Uploader.object_store_credentials,
- remote_directory: Pseudonymizer::Uploader.remote_directory)
- end
-
def stub_object_storage_uploader(
config:,
uploader:,
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index d81d0d436a1..11f469c1d27 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -374,7 +374,7 @@ module TestEnv
end
def seed_db
- Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.import
+ Gitlab::DatabaseImporters::WorkItems::BaseTypeImporter.upsert_types
end
private
diff --git a/spec/support/helpers/trial_status_widget_test_helper.rb b/spec/support/helpers/trial_status_widget_test_helper.rb
new file mode 100644
index 00000000000..d75620d17ee
--- /dev/null
+++ b/spec/support/helpers/trial_status_widget_test_helper.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+module TrialStatusWidgetTestHelper
+ def purchase_href(group)
+ new_subscriptions_path(namespace_id: group.id, plan_id: 'ultimate-plan-id')
+ end
+end
+
+TrialStatusWidgetTestHelper.prepend_mod
diff --git a/spec/support/helpers/workhorse_helpers.rb b/spec/support/helpers/workhorse_helpers.rb
index 83bda6e03b1..6f22df9ae0f 100644
--- a/spec/support/helpers/workhorse_helpers.rb
+++ b/spec/support/helpers/workhorse_helpers.rb
@@ -114,16 +114,18 @@ module WorkhorseHelpers
end
params["#{key}.remote_id"] = file.remote_id if file.respond_to?(:remote_id) && file.remote_id.present?
+ params["#{key}.sha256"] = file.sha256 if file.respond_to?(:sha256) && file.sha256.present?
end
end
- def fog_to_uploaded_file(file)
+ def fog_to_uploaded_file(file, sha256: nil)
filename = File.basename(file.key)
UploadedFile.new(nil,
filename: filename,
remote_id: filename,
- size: file.content_length
+ size: file.content_length,
+ sha256: sha256
)
end
end
diff --git a/spec/support/helpers/workhorse_lfs_helpers.rb b/spec/support/helpers/workhorse_lfs_helpers.rb
new file mode 100644
index 00000000000..c9644826317
--- /dev/null
+++ b/spec/support/helpers/workhorse_lfs_helpers.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module WorkhorseLfsHelpers
+ extend self
+
+ def put_finalize(
+ lfs_tmp = nil, with_tempfile: false, verified: true, remote_object: nil,
+ args: {}, to_project: nil, size: nil, sha256: nil)
+
+ lfs_tmp ||= "#{sample_oid}012345678"
+ to_project ||= project
+ uploaded_file =
+ if with_tempfile
+ upload_path = LfsObjectUploader.workhorse_local_upload_path
+ file_path = upload_path + '/' + lfs_tmp
+
+ FileUtils.mkdir_p(upload_path)
+ FileUtils.touch(file_path)
+ File.truncate(file_path, sample_size)
+
+ UploadedFile.new(file_path, filename: File.basename(file_path), sha256: sample_oid)
+ elsif remote_object
+ fog_to_uploaded_file(remote_object, sha256: sample_oid)
+ else
+ UploadedFile.new(
+ nil,
+ size: size || sample_size,
+ sha256: sha256 || sample_oid,
+ remote_id: 'remote id'
+ )
+ end
+
+ finalize_headers = headers
+ finalize_headers.merge!(workhorse_internal_api_request_header) if verified
+
+ workhorse_finalize(
+ objects_url(to_project, sample_oid, sample_size),
+ method: :put,
+ file_key: :file,
+ params: args.merge(file: uploaded_file),
+ headers: finalize_headers,
+ send_rewritten_field: include_workhorse_jwt_header
+ )
+ end
+end
diff --git a/spec/support/import_export/common_util.rb b/spec/support/import_export/common_util.rb
index 1aa20dab6f8..9da151895a7 100644
--- a/spec/support/import_export/common_util.rb
+++ b/spec/support/import_export/common_util.rb
@@ -19,7 +19,7 @@ module ImportExport
end
def setup_reader(reader)
- if reader == :ndjson_reader && Feature.enabled?(:project_import_ndjson, default_enabled: true)
+ if reader == :ndjson_reader && Feature.enabled?(:project_import_ndjson)
allow_any_instance_of(Gitlab::ImportExport::Json::LegacyReader::File).to receive(:exist?).and_return(false)
allow_any_instance_of(Gitlab::ImportExport::Json::NdjsonReader).to receive(:exist?).and_return(true)
else
diff --git a/spec/support/matchers/background_migrations_matchers.rb b/spec/support/matchers/background_migrations_matchers.rb
index 1057639beec..b471323dd72 100644
--- a/spec/support/matchers/background_migrations_matchers.rb
+++ b/spec/support/matchers/background_migrations_matchers.rb
@@ -67,17 +67,6 @@ end
RSpec::Matchers.define :have_scheduled_batched_migration do |table_name: nil, column_name: nil, job_arguments: [], **attributes|
define_method :matches? do |migration|
- # Default arguments passed by BatchedMigrationWrapper (values don't matter here)
- expect(migration).to be_background_migration_with_arguments([
- _start_id = 1,
- _stop_id = 2,
- table_name,
- column_name,
- _sub_batch_size = 10,
- _pause_ms = 100,
- *job_arguments
- ])
-
batched_migrations =
Gitlab::Database::BackgroundMigration::BatchedMigration
.for_configuration(migration, table_name, column_name, job_arguments)
@@ -94,3 +83,11 @@ RSpec::Matchers.define :have_scheduled_batched_migration do |table_name: nil, co
expect(batched_migrations.count).to be(0)
end
end
+
+RSpec::Matchers.define :be_finalize_background_migration_of do |migration|
+ define_method :matches? do |klass|
+ expect_next_instance_of(klass) do |instance|
+ expect(instance).to receive(:finalize_background_migration).with(migration)
+ end
+ end
+end
diff --git a/spec/support/matchers/graphql_matchers.rb b/spec/support/matchers/graphql_matchers.rb
index 3ba88c3ae71..e6d820104be 100644
--- a/spec/support/matchers/graphql_matchers.rb
+++ b/spec/support/matchers/graphql_matchers.rb
@@ -211,18 +211,13 @@ end
RSpec::Matchers.define :have_graphql_resolver do |expected|
match do |field|
- case expected
- when Method
- expect(field.type_class.resolve_proc).to eq(expected)
- else
- expect(field.type_class.resolver).to eq(expected)
- end
+ expect(field.resolver).to eq(expected)
end
end
RSpec::Matchers.define :have_graphql_extension do |expected|
match do |field|
- expect(field.type_class.extensions).to include(expected)
+ expect(field.extensions).to include(expected)
end
end
diff --git a/spec/support/matchers/make_queries.rb b/spec/support/matchers/make_queries.rb
new file mode 100644
index 00000000000..19c69240a40
--- /dev/null
+++ b/spec/support/matchers/make_queries.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :make_queries do |expected_count = nil|
+ supports_block_expectations
+
+ match do |block|
+ @recorder = ActiveRecord::QueryRecorder.new(&block)
+ @counter = @recorder.count
+ if expected_count
+ @counter == expected_count
+ else
+ @counter > 0
+ end
+ end
+
+ failure_message do |_|
+ if expected_count
+ "expected to make #{expected_count} queries but made #{@counter} queries"
+ else
+ "expected to make queries but did not make any"
+ end
+ end
+
+ failure_message_when_negated do |_|
+ if expected_count
+ "expected not to make #{expected_count} queries but received #{@counter} queries"
+ else
+ "expected not to make queries but received #{@counter} queries"
+ end
+ end
+end
diff --git a/spec/support/rspec.rb b/spec/support/rspec.rb
index b4a25fd121d..30e48b3baf1 100644
--- a/spec/support/rspec.rb
+++ b/spec/support/rspec.rb
@@ -14,6 +14,8 @@ require_relative "helpers/fast_rails_root"
require 'rubocop'
require 'rubocop/rspec/support'
+RSpec::Expectations.configuration.on_potential_false_positives = :raise
+
RSpec.configure do |config|
config.mock_with :rspec do |mocks|
mocks.verify_doubled_constant_names = true
diff --git a/spec/support/shared_contexts/email_shared_context.rb b/spec/support/shared_contexts/email_shared_context.rb
index 0dc66eeb2ee..086cdf50e9d 100644
--- a/spec/support/shared_contexts/email_shared_context.rb
+++ b/spec/support/shared_contexts/email_shared_context.rb
@@ -148,7 +148,7 @@ RSpec.shared_examples :note_handler_shared_examples do |forwardable|
end
it 'allows email to only have quoted text', if: forwardable do
- expect { receiver.execute }.not_to raise_error(Gitlab::Email::EmptyEmailError)
+ expect { receiver.execute }.not_to raise_error
end
end
diff --git a/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb b/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
index 13e7ecf2669..b29a231f3a6 100644
--- a/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
+++ b/spec/support/shared_contexts/graphql/requests/packages_shared_context.rb
@@ -14,7 +14,7 @@ RSpec.shared_context 'package details setup' do
let(:user) { project.first_owner }
let(:package_details) { graphql_data_at(:package) }
let(:metadata_response) { graphql_data_at(:package, :metadata) }
- let(:first_file) { package.package_files.find { |f| global_id_of(f) == first_file_response['id'] } }
+ let(:first_file) { package.package_files.find { |f| a_graphql_entity_for(f).matches?(first_file_response) } }
let(:package_files_response) { graphql_data_at(:package, :package_files, :nodes) }
let(:first_file_response) { graphql_data_at(:package, :package_files, :nodes, 0)}
let(:first_file_response_metadata) { graphql_data_at(:package, :package_files, :nodes, 0, :file_metadata)}
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 b7966e25b38..7d51c90522a 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
@@ -57,7 +57,8 @@ RSpec.shared_context 'structured_logger' do
'job_status' => 'done',
'duration_s' => 0.0,
'completed_at' => timestamp.to_f,
- 'cpu_s' => 1.111112
+ 'cpu_s' => 1.111112,
+ 'rate_limiting_gates' => []
)
end
diff --git a/spec/support/shared_contexts/models/concerns/integrations/enable_ssl_verification_shared_context.rb b/spec/support/shared_contexts/models/concerns/integrations/enable_ssl_verification_shared_context.rb
index c698e06c2a2..fbec6f98e76 100644
--- a/spec/support/shared_contexts/models/concerns/integrations/enable_ssl_verification_shared_context.rb
+++ b/spec/support/shared_contexts/models/concerns/integrations/enable_ssl_verification_shared_context.rb
@@ -43,5 +43,9 @@ RSpec.shared_context Integrations::EnableSslVerification do
expect(names.index('enable_ssl_verification')).to eq insert_index
end
+
+ it 'does not insert the field repeatedly' do
+ expect(integration.fields.pluck(:name)).to eq(integration.fields.pluck(:name))
+ end
end
end
diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb
index 65c7f63cf6e..ef6ff7be840 100644
--- a/spec/support/shared_contexts/navbar_structure_context.rb
+++ b/spec/support/shared_contexts/navbar_structure_context.rb
@@ -46,8 +46,7 @@ RSpec.shared_context 'project navbar structure' do
_('List'),
_('Boards'),
_('Service Desk'),
- _('Milestones'),
- (_('Iterations') if Gitlab.ee?)
+ _('Milestones')
]
},
{
@@ -74,6 +73,13 @@ RSpec.shared_context 'project navbar structure' do
]
},
{
+ nav_item: _('Infrastructure'),
+ nav_sub_items: [
+ _('Kubernetes clusters'),
+ _('Terraform')
+ ]
+ },
+ {
nav_item: _('Monitor'),
nav_sub_items: [
_('Metrics'),
@@ -86,16 +92,8 @@ RSpec.shared_context 'project navbar structure' do
]
},
{
- nav_item: _('Infrastructure'),
- nav_sub_items: [
- _('Kubernetes clusters'),
- _('Serverless platform'),
- _('Terraform')
- ]
- },
- {
nav_item: _('Analytics'),
- nav_sub_items: analytics_sub_nav_item
+ nav_sub_items: project_analytics_sub_nav_item
},
{
nav_item: _('Wiki'),
@@ -126,9 +124,7 @@ RSpec.shared_context 'group navbar structure' do
let(:analytics_nav_item) do
{
nav_item: _('Analytics'),
- nav_sub_items: [
- _('Contribution')
- ]
+ nav_sub_items: group_analytics_sub_nav_item
}
end
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 76db2bd82f1..483bca07ba6 100644
--- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
@@ -28,11 +28,11 @@ RSpec.shared_context 'GroupPolicy context' do
let(:reporter_permissions) do
%i[
admin_label
+ admin_milestone
admin_issue_board
read_container_image
read_metrics_dashboard_annotation
read_prometheus
- read_package_settings
read_crm_contact
read_crm_organization
]
@@ -40,13 +40,11 @@ RSpec.shared_context 'GroupPolicy context' do
let(:developer_permissions) do
%i[
- admin_milestone
create_metrics_dashboard_annotation
delete_metrics_dashboard_annotation
update_metrics_dashboard_annotation
create_custom_emoji
create_package
- create_package_settings
read_cluster
]
end
@@ -54,6 +52,7 @@ RSpec.shared_context 'GroupPolicy context' do
let(:maintainer_permissions) do
%i[
destroy_package
+ admin_package
create_projects
create_cluster update_cluster admin_cluster add_cluster
]
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 a78953e8199..e50083a10e7 100644
--- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb
@@ -25,7 +25,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:base_reporter_permissions) do
%i[
- admin_issue admin_issue_link admin_label admin_issue_board_list
+ admin_issue admin_issue_link admin_label admin_milestone admin_issue_board_list
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
@@ -41,7 +41,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:developer_permissions) do
%i[
- admin_merge_request admin_milestone admin_tag create_build
+ admin_merge_request admin_tag create_build
create_commit_status create_container_image create_deployment
create_environment create_merge_request_from
create_metrics_dashboard_annotation create_pipeline create_release
diff --git a/spec/support/shared_contexts/sentry_error_tracking_shared_context.rb b/spec/support/shared_contexts/sentry_error_tracking_shared_context.rb
index 3453f954c9d..e8ccb12e6b7 100644
--- a/spec/support/shared_contexts/sentry_error_tracking_shared_context.rb
+++ b/spec/support/shared_contexts/sentry_error_tracking_shared_context.rb
@@ -14,7 +14,7 @@ RSpec.shared_context 'sentry error tracking context' do
end
before do
- expect(project).to receive(:error_tracking_setting).at_least(:once).and_return(error_tracking_setting)
+ allow(project).to receive(:error_tracking_setting).at_least(:once).and_return(error_tracking_setting)
project.add_reporter(user)
end
diff --git a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
index 37d410a35bf..9746d287440 100644
--- a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
+++ b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
@@ -43,12 +43,12 @@ RSpec.shared_context 'stubbed service ping metrics definitions' do
Gitlab::Usage::MetricDefinition.instance_variable_set(:@all, nil)
end
- def metric_attributes(key_path, category, value_type = 'string', instrumentation_class = '')
+ def metric_attributes(key_path, category, value_type = 'string', instrumentation_class = '', status = 'active')
{
'key_path' => key_path,
'data_category' => category,
'value_type' => value_type,
- 'status' => 'active',
+ 'status' => status,
'instrumentation_class' => instrumentation_class,
'time_frame' => 'all'
}
diff --git a/spec/support/shared_examples/ci/log_downstream_pipeline_shared_examples.rb b/spec/support/shared_examples/ci/log_downstream_pipeline_shared_examples.rb
new file mode 100644
index 00000000000..db724dcfe99
--- /dev/null
+++ b/spec/support/shared_examples/ci/log_downstream_pipeline_shared_examples.rb
@@ -0,0 +1,34 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'logs downstream pipeline creation' do
+ def record_downstream_pipeline_logs
+ logs = []
+ allow(::Gitlab::AppLogger).to receive(:info) do |args|
+ logs << args
+ end
+
+ yield
+
+ logs.find { |log| log[:message] == "downstream pipeline created" }
+ end
+
+ it 'logs details' do
+ pipeline = nil
+
+ log_entry = record_downstream_pipeline_logs do
+ pipeline = subject
+ end
+
+ expect(log_entry).to be_present
+ expect(log_entry).to eq(
+ message: "downstream pipeline created",
+ class: described_class.name,
+ root_pipeline_id: expected_root_pipeline.id,
+ downstream_pipeline_id: pipeline.id,
+ downstream_pipeline_relationship: expected_downstream_relationship,
+ hierarchy_size: expected_hierarchy_size,
+ root_pipeline_plan: expected_root_pipeline.project.actual_plan_name,
+ root_pipeline_namespace_path: expected_root_pipeline.project.namespace.full_path,
+ root_pipeline_project_path: expected_root_pipeline.project.full_path)
+ end
+end
diff --git a/spec/support/shared_examples/controllers/environments_controller_shared_examples.rb b/spec/support/shared_examples/controllers/environments_controller_shared_examples.rb
index c6e880635aa..a79b94209f3 100644
--- a/spec/support/shared_examples/controllers/environments_controller_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/environments_controller_shared_examples.rb
@@ -65,3 +65,20 @@ RSpec.shared_examples 'failed response for #cancel_auto_stop' do
end
end
end
+
+RSpec.shared_examples 'avoids N+1 queries on environment detail page' do
+ render_views
+
+ before do
+ create_deployment_with_associations(sequence: 0)
+ end
+
+ it 'avoids N+1 queries' do
+ control = ActiveRecord::QueryRecorder.new { get :show, params: environment_params }
+
+ create_deployment_with_associations(sequence: 1)
+ create_deployment_with_associations(sequence: 2)
+
+ expect { get :show, params: environment_params }.not_to exceed_query_limit(control.count).with_threshold(34)
+ end
+end
diff --git a/spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb b/spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb
index fadf428125a..9cf35325202 100644
--- a/spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb
@@ -44,8 +44,10 @@ RSpec.shared_examples 'a controller that can serve LFS files' do |options = {}|
expect(controller).to receive(:send_file)
.with(
File.join(lfs_uploader.root, lfs_uploader.store_dir, lfs_uploader.filename),
- filename: filename,
- disposition: 'attachment')
+ {
+ filename: filename,
+ disposition: 'attachment'
+ })
subject
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 5c44cb7f04b..c93d8e3d511 100644
--- a/spec/support/shared_examples/features/content_editor_shared_examples.rb
+++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb
@@ -23,6 +23,8 @@ RSpec.shared_examples 'edits content using the content editor' do
describe 'code block bubble menu' do
it 'shows a code block bubble menu for a code block' do
+ find(content_editor_testid).send_keys [:enter, :enter]
+
find(content_editor_testid).send_keys '```js ' # trigger input rule
find(content_editor_testid).send_keys 'var a = 0'
find(content_editor_testid).send_keys [:shift, :left]
@@ -32,6 +34,8 @@ RSpec.shared_examples 'edits content using the content editor' do
end
it 'sets code block type to "javascript" for `js`' do
+ find(content_editor_testid).send_keys [:enter, :enter]
+
find(content_editor_testid).send_keys '```js '
find(content_editor_testid).send_keys 'var a = 0'
@@ -39,6 +43,8 @@ RSpec.shared_examples 'edits content using the content editor' do
end
it 'sets code block type to "Custom (nomnoml)" for `nomnoml`' do
+ find(content_editor_testid).send_keys [:enter, :enter]
+
find(content_editor_testid).send_keys '```nomnoml '
find(content_editor_testid).send_keys 'test'
diff --git a/spec/support/shared_examples/features/dependency_proxy_shared_examples.rb b/spec/support/shared_examples/features/dependency_proxy_shared_examples.rb
index 5d1488502d2..6fd844f0e5f 100644
--- a/spec/support/shared_examples/features/dependency_proxy_shared_examples.rb
+++ b/spec/support/shared_examples/features/dependency_proxy_shared_examples.rb
@@ -17,7 +17,7 @@ end
RSpec.shared_examples 'a successful manifest pull' do
it 'sends a file' do
- expect(controller).to receive(:send_file).with(manifest.file.path, type: manifest.content_type)
+ expect(controller).to receive(:send_file).with(manifest.file.path, { type: manifest.content_type })
subject
end
diff --git a/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb b/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
index ccd063faac4..2fff4137934 100644
--- a/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
+++ b/spec/support/shared_examples/features/editable_merge_request_shared_examples.rb
@@ -48,7 +48,7 @@ RSpec.shared_examples 'an editable merge request' do
end
page.within '.reviewer' do
- expect(page).to have_content user.username
+ expect(page).to have_content user.name
end
page.within '.milestone' do
diff --git a/spec/support/shared_examples/features/inviting_groups_shared_examples.rb b/spec/support/shared_examples/features/inviting_groups_shared_examples.rb
new file mode 100644
index 00000000000..4921676a065
--- /dev/null
+++ b/spec/support/shared_examples/features/inviting_groups_shared_examples.rb
@@ -0,0 +1,144 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'inviting groups search results' do
+ context 'with instance admin considerations' do
+ let_it_be(:group_to_invite) { create(:group) }
+
+ context 'when user is an admin' do
+ let_it_be(:admin) { create(:admin) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ it 'shows groups where the admin has no direct membership' do
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_invite)
+ expect_not_to_have_group(group)
+ end
+ end
+
+ it 'shows groups where the admin has at least guest level membership' do
+ group_to_invite.add_guest(admin)
+
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_invite)
+ expect_not_to_have_group(group)
+ end
+ end
+ end
+
+ context 'when user is not an admin' do
+ before do
+ group.add_owner(user)
+ sign_in(user)
+ end
+
+ it 'does not show groups where the user has no direct membership' do
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_not_to_have_group(group_to_invite)
+ expect_not_to_have_group(group)
+ end
+ end
+
+ it 'shows groups where the user has at least guest level membership' do
+ group_to_invite.add_guest(user)
+
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_invite)
+ expect_not_to_have_group(group)
+ end
+ end
+ end
+ end
+
+ context 'when user is not an admin and there are hierarchy considerations' do
+ let_it_be(:group_outside_hierarchy) { create(:group) }
+
+ before_all do
+ group.add_owner(user)
+ group_within_hierarchy.add_owner(user)
+ group_outside_hierarchy.add_owner(user)
+ end
+
+ before do
+ sign_in(user)
+ end
+
+ it 'does not show self or ancestors', :aggregate_failures do
+ group_sibling = create(:group, parent: group)
+ group_sibling.add_owner(user)
+
+ visit members_page_path_within_hierarchy
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_outside_hierarchy)
+ expect_to_have_group(group_sibling)
+ expect_not_to_have_group(group)
+ expect_not_to_have_group(group_within_hierarchy)
+ end
+ end
+
+ context 'when sharing with groups outside the hierarchy is enabled' do
+ it 'shows groups within and outside the hierarchy in search results' do
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_within_hierarchy)
+ expect_to_have_group(group_outside_hierarchy)
+ end
+ end
+ end
+
+ context 'when sharing with groups outside the hierarchy is disabled' do
+ before do
+ group.update!(prevent_sharing_groups_outside_hierarchy: true)
+ end
+
+ it 'shows only groups within the hierarchy in search results' do
+ visit members_page_path
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_within_hierarchy)
+ expect_not_to_have_group(group_outside_hierarchy)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/features/manage_applications_shared_examples.rb b/spec/support/shared_examples/features/manage_applications_shared_examples.rb
index 3a8267b21da..442264e7ae4 100644
--- a/spec/support/shared_examples/features/manage_applications_shared_examples.rb
+++ b/spec/support/shared_examples/features/manage_applications_shared_examples.rb
@@ -9,11 +9,9 @@ RSpec.shared_examples 'manage applications' do
visit new_application_path
expect(page).to have_content 'Add new application'
- expect(find('#doorkeeper_application_expire_access_tokens')).to be_checked
fill_in :doorkeeper_application_name, with: application_name
fill_in :doorkeeper_application_redirect_uri, with: application_redirect_uri
- uncheck :doorkeeper_application_expire_access_tokens
check :doorkeeper_application_scopes_read_user
click_on 'Save application'
@@ -25,8 +23,6 @@ RSpec.shared_examples 'manage applications' do
click_on 'Edit'
- expect(find('#doorkeeper_application_expire_access_tokens')).not_to be_checked
-
application_name_changed = "#{application_name} changed"
fill_in :doorkeeper_application_name, with: application_name_changed
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 9d023d9514a..4565108b5e4 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
+ click_link user.name unless action == 'creates'
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 bbde448a1a1..a44a699c878 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
+ click_link user.name unless action == 'creates'
click_link user2.name
end
diff --git a/spec/support/shared_examples/features/multiple_reviewers_mr_shared_examples.rb b/spec/support/shared_examples/features/multiple_reviewers_mr_shared_examples.rb
index ad6ca3e1900..48cde90bd9b 100644
--- a/spec/support/shared_examples/features/multiple_reviewers_mr_shared_examples.rb
+++ b/spec/support/shared_examples/features/multiple_reviewers_mr_shared_examples.rb
@@ -40,7 +40,7 @@ RSpec.shared_examples 'multiple reviewers merge request' do |action, save_button
# Closing dropdown to persist
click_link 'Edit'
- expect(page).to have_content user2.username
+ expect(page).to have_content user2.name
end
end
end
diff --git a/spec/support/shared_examples/features/packages_shared_examples.rb b/spec/support/shared_examples/features/packages_shared_examples.rb
index ded30f32314..323bd4f5171 100644
--- a/spec/support/shared_examples/features/packages_shared_examples.rb
+++ b/spec/support/shared_examples/features/packages_shared_examples.rb
@@ -97,9 +97,9 @@ def click_sort_option(option, ascending)
wait_for_requests
end
- find('button.gl-dropdown-toggle').click
+ find('[data-testid="registry-sort-dropdown"]').click
- page.within('.dropdown-menu') do
+ page.within('[data-testid="registry-sort-dropdown"] .dropdown-menu') do
click_button option
end
diff --git a/spec/support/shared_examples/features/sidebar_shared_examples.rb b/spec/support/shared_examples/features/sidebar_shared_examples.rb
index 11d216ff4b6..af3ea0600a2 100644
--- a/spec/support/shared_examples/features/sidebar_shared_examples.rb
+++ b/spec/support/shared_examples/features/sidebar_shared_examples.rb
@@ -108,7 +108,11 @@ RSpec.shared_examples 'issue boards sidebar' do
wait_for_requests
- expect(page).to have_content('This issue is confidential')
+ expect(page).to have_content(
+ _('Only project members with at least' \
+ ' Reporter role can view or be' \
+ ' notified about this issue.')
+ )
end
end
end
diff --git a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
index 41b1964cff0..8081c51577a 100644
--- a/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
+++ b/spec/support/shared_examples/features/wiki/user_creates_wiki_page_shared_examples.rb
@@ -233,6 +233,23 @@ RSpec.shared_examples 'User creates wiki page' do
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
+
+ context 'when a server side validation error is returned' do
+ it "still displays edit form", :js do
+ click_link("New page")
+
+ page.within(".wiki-form") do
+ fill_in(:wiki_title, with: "home")
+ fill_in(:wiki_content, with: "My awesome home page!")
+ end
+
+ # Submits page with a name already in use to trigger a validation error
+ click_button("Create page")
+
+ expect(page).to have_field(:wiki_title)
+ expect(page).to have_field(:wiki_content)
+ end
+ end
end
it "shows the emoji autocompletion dropdown", :js do
diff --git a/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb b/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb
new file mode 100644
index 00000000000..b989dbc6524
--- /dev/null
+++ b/spec/support/shared_examples/graphql/mutations/incident_management_timeline_events_shared_examples.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+# Requres:
+# * subject with a 'resolve' name
+# * Defined expected timeline event via `let(:expected_timeline_event) { instance_double(...) }`
+RSpec.shared_examples 'creating an incident timeline event' do
+ it 'creates a timeline event' do
+ expect { resolve }.to change(IncidentManagement::TimelineEvent, :count).by(1)
+ end
+
+ it 'responds with a timeline event', :aggregate_failures do
+ response = resolve
+ timeline_event = IncidentManagement::TimelineEvent.last!
+
+ expect(response).to match(timeline_event: timeline_event, errors: be_empty)
+
+ expect(timeline_event.promoted_from_note).to eq(expected_timeline_event.promoted_from_note)
+ expect(timeline_event.note).to eq(expected_timeline_event.note)
+ expect(timeline_event.occurred_at.to_s).to eq(expected_timeline_event.occurred_at)
+ expect(timeline_event.incident).to eq(expected_timeline_event.incident)
+ expect(timeline_event.author).to eq(expected_timeline_event.author)
+ end
+end
+
+# Requres
+# * subject with a 'resolve' name
+# * a user factory with a 'current_user' name
+RSpec.shared_examples 'failing to create an incident timeline event' do
+ context 'when a user has no permissions to create timeline event' do
+ before do
+ project.add_guest(current_user)
+ end
+
+ it 'raises an error' do
+ expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+end
+
+# Requres:
+# * subject with a 'resolve' name
+RSpec.shared_examples 'responding with an incident timeline errors' do |errors:|
+ it 'returns errors' do
+ expect(resolve).to eq(timeline_event: nil, errors: errors)
+ end
+end
diff --git a/spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb b/spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb
index 3d6fec85490..da8562161e7 100644
--- a/spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/resolvers/packages_resolvers_shared_examples.rb
@@ -4,7 +4,11 @@ RSpec.shared_examples 'group and projects packages resolver' do
context 'without sort' do
let_it_be(:npm_package) { create(:package, project: project) }
- it { is_expected.to contain_exactly(npm_package) }
+ it 'returns the proper packages' do
+ expect(::Packages::Package).not_to receive(:preload_pipelines)
+
+ expect(subject).to contain_exactly(npm_package)
+ end
end
context 'with sorting and filtering' do
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 37a805902a9..6d6e7b761f6 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
@@ -101,7 +101,7 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
context 'when sorting' do
it 'sorts correctly' do
- expect(results).to eq all_records
+ expect(results).to match all_records
end
context 'when paginating' do
@@ -110,17 +110,17 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
let(:rest) { all_records.drop(first_param) }
it 'paginates correctly' do
- expect(results).to eq first_page
+ expect(results).to match first_page
fwds = pagination_query(sort_argument.merge(after: end_cursor))
post_graphql(fwds, current_user: current_user)
- expect(results).to eq rest
+ expect(results).to match rest
bwds = pagination_query(sort_argument.merge(before: start_cursor))
post_graphql(bwds, current_user: current_user)
- expect(results).to eq first_page
+ expect(results).to match first_page
end
end
@@ -130,7 +130,7 @@ RSpec.shared_examples 'sorted paginated query' do |conditions = {}|
it 'fetches last elements without error' do
post_graphql(pagination_query(params), current_user: current_user)
- expect(results.first).to eq(all_records.last)
+ expect(results.first).to match all_records.last
end
end
end
diff --git a/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb b/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
index 3caf153c2fa..cf9c36fafe8 100644
--- a/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
+++ b/spec/support/shared_examples/graphql/types/gitlab_style_deprecations_shared_examples.rb
@@ -6,7 +6,7 @@ RSpec.shared_examples 'Gitlab-style deprecations' do
expect { subject(deprecation_reason: 'foo') }.to raise_error(
ArgumentError,
'Use `deprecated` property instead of `deprecation_reason`. ' \
- 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-fields-arguments-and-enum-values'
+ 'See https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#deprecating-schema-items'
)
end
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 a3c67210a4a..e886ec65b02 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
@@ -796,8 +796,8 @@ RSpec.shared_examples 'trace with enabled live trace feature' do
end
end
- describe '#archived_trace_exist?' do
- subject { trace.archived_trace_exist? }
+ describe '#archived?' do
+ subject { trace.archived? }
context 'when trace does not exist' do
it { is_expected.to be_falsy }
diff --git a/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb b/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb
index bea7cca2744..beec072e474 100644
--- a/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb
+++ b/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb
@@ -62,8 +62,8 @@ shared_examples 'deployment metrics examples' do
describe '#deployment_frequency' do
subject { stage_summary.fourth[:value] }
- it 'includes the unit: `per day`' do
- expect(stage_summary.fourth[:unit]).to eq _('per day')
+ it 'includes the unit: `/day`' do
+ expect(stage_summary.fourth[:unit]).to eq _('/day')
end
before do
diff --git a/spec/support/shared_examples/lib/gitlab/database/reestablished_connection_stack_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/database/reestablished_connection_stack_shared_examples.rb
new file mode 100644
index 00000000000..67d739b79ab
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/database/reestablished_connection_stack_shared_examples.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+RSpec.shared_context 'reconfigures connection stack' do |db_config_name|
+ before do
+ skip_if_multiple_databases_not_setup
+
+ # Due to lib/gitlab/database/load_balancing/configuration.rb:92 requiring RequestStore
+ # we cannot use stub_feature_flags(force_no_sharing_primary_model: true)
+ Gitlab::Database.database_base_models.each do |_, model_class|
+ allow(model_class.load_balancer.configuration).to receive(:use_dedicated_connection?).and_return(true)
+ end
+
+ ActiveRecord::Base.establish_connection(db_config_name.to_sym) # rubocop:disable Database/EstablishConnection
+
+ expect(Gitlab::Database.db_config_name(ActiveRecord::Base.connection)) # rubocop:disable Database/MultipleDatabases
+ .to eq(db_config_name)
+ end
+
+ around do |example|
+ with_reestablished_active_record_base do
+ example.run
+ end
+ end
+
+ def validate_connections!
+ model_connections = Gitlab::Database.database_base_models.to_h do |db_config_name, model_class|
+ [model_class, Gitlab::Database.db_config_name(model_class.connection)]
+ end
+
+ expect(model_connections).to eq(Gitlab::Database.database_base_models.invert)
+ end
+end
diff --git a/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb
deleted file mode 100644
index 2633a89eeee..00000000000
--- a/spec/support/shared_examples/lib/gitlab/kubernetes/network_policy_common_shared_examples.rb
+++ /dev/null
@@ -1,162 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'network policy common specs' do
- let(:name) { 'example-name' }
- let(:namespace) { 'example-namespace' }
- let(:labels) { nil }
-
- describe '#generate' do
- subject { policy.generate }
-
- it { is_expected.to eq(Kubeclient::Resource.new(policy.resource)) }
- end
-
- describe 'as_json' do
- let(:json_policy) do
- {
- name: name,
- namespace: namespace,
- creation_timestamp: nil,
- manifest: YAML.dump(policy.resource.deep_stringify_keys),
- is_autodevops: false,
- is_enabled: true,
- environment_ids: []
- }
- end
-
- subject { policy.as_json }
-
- it { is_expected.to eq(json_policy) }
- end
-
- describe 'autodevops?' do
- subject { policy.autodevops? }
-
- let(:labels) { { chart: chart } }
- let(:chart) { nil }
-
- it { is_expected.to be false }
-
- context 'with non-autodevops chart' do
- let(:chart) { 'foo' }
-
- it { is_expected.to be false }
- end
-
- context 'with autodevops chart' do
- let(:chart) { 'auto-deploy-app-0.6.0' }
-
- it { is_expected.to be true }
- end
- end
-
- describe 'enabled?' do
- subject { policy.enabled? }
-
- let(:selector) { nil }
-
- it { is_expected.to be true }
-
- context 'with empty selector' do
- let(:selector) { {} }
-
- it { is_expected.to be true }
- end
-
- context 'with nil matchLabels in selector' do
- let(:selector) { { matchLabels: nil } }
-
- it { is_expected.to be true }
- end
-
- context 'with empty matchLabels in selector' do
- let(:selector) { { matchLabels: {} } }
-
- it { is_expected.to be true }
- end
-
- context 'with disabled_by label in matchLabels in selector' do
- let(:selector) do
- { matchLabels: { Gitlab::Kubernetes::NetworkPolicyCommon::DISABLED_BY_LABEL => 'gitlab' } }
- end
-
- it { is_expected.to be false }
- end
- end
-
- describe 'enable' do
- subject { policy.enabled? }
-
- let(:selector) { nil }
-
- before do
- policy.enable
- end
-
- it { is_expected.to be true }
-
- context 'with empty selector' do
- let(:selector) { {} }
-
- it { is_expected.to be true }
- end
-
- context 'with nil matchLabels in selector' do
- let(:selector) { { matchLabels: nil } }
-
- it { is_expected.to be true }
- end
-
- context 'with empty matchLabels in selector' do
- let(:selector) { { matchLabels: {} } }
-
- it { is_expected.to be true }
- end
-
- context 'with disabled_by label in matchLabels in selector' do
- let(:selector) do
- { matchLabels: { Gitlab::Kubernetes::NetworkPolicyCommon::DISABLED_BY_LABEL => 'gitlab' } }
- end
-
- it { is_expected.to be true }
- end
- end
-
- describe 'disable' do
- subject { policy.enabled? }
-
- let(:selector) { nil }
-
- before do
- policy.disable
- end
-
- it { is_expected.to be false }
-
- context 'with empty selector' do
- let(:selector) { {} }
-
- it { is_expected.to be false }
- end
-
- context 'with nil matchLabels in selector' do
- let(:selector) { { matchLabels: nil } }
-
- it { is_expected.to be false }
- end
-
- context 'with empty matchLabels in selector' do
- let(:selector) { { matchLabels: {} } }
-
- it { is_expected.to be false }
- end
-
- context 'with disabled_by label in matchLabels in selector' do
- let(:selector) do
- { matchLabels: { Gitlab::Kubernetes::NetworkPolicyCommon::DISABLED_BY_LABEL => 'gitlab' } }
- end
-
- it { is_expected.to be false }
- 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
new file mode 100644
index 00000000000..d4986975f03
--- /dev/null
+++ b/spec/support/shared_examples/merge_request_author_auto_assign_shared_examples.rb
@@ -0,0 +1,8 @@
+# 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 e6b270c6188..fa10b03fa90 100644
--- a/spec/support/shared_examples/models/chat_integration_shared_examples.rb
+++ b/spec/support/shared_examples/models/chat_integration_shared_examples.rb
@@ -199,7 +199,7 @@ RSpec.shared_examples "chat integration" do |integration_name|
{
title: "Awesome wiki_page",
content: "Some text describing some thing or another",
- format: "md",
+ format: :markdown,
message: "user created page: Awesome wiki_page"
}
end
diff --git a/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb
new file mode 100644
index 00000000000..873f858e432
--- /dev/null
+++ b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples Integrations::ResetSecretFields do
+ describe '#exposing_secrets_fields' do
+ it 'returns an array of strings' do
+ expect(integration.exposing_secrets_fields).to be_a(Array)
+ expect(integration.exposing_secrets_fields).to all(be_a(String))
+ end
+ end
+
+ describe '#reset_secret_fields?' do
+ let(:exposing_fields) { integration.exposing_secrets_fields }
+
+ it 'returns false if no exposing field has changed' do
+ exposing_fields.each do |field|
+ allow(integration).to receive("#{field}_changed?").and_return(false)
+ end
+
+ expect(integration.send(:reset_secret_fields?)).to be(false)
+ end
+
+ it 'returns true if any exposing field has changed' do
+ exposing_fields.each do |field|
+ allow(integration).to receive("#{field}_changed?").and_return(true)
+
+ other_exposing_fields = exposing_fields.without(field)
+ other_exposing_fields.each do |other_field|
+ allow(integration).to receive("#{other_field}_changed?").and_return(false)
+ end
+
+ expect(integration.send(:reset_secret_fields?)).to be(true)
+ end
+ end
+ end
+
+ describe 'validation callback' do
+ before do
+ # Store a value in each password field
+ integration.secret_fields.each do |field|
+ integration.public_send("#{field}=", 'old value')
+ end
+
+ # Treat values as persisted
+ integration.reset_updated_properties
+ integration.instance_variable_set('@old_data_fields', nil) if integration.supports_data_fields?
+ end
+
+ context 'when an exposing field has changed' do
+ let(:exposing_field) { integration.exposing_secrets_fields.first }
+
+ before do
+ integration.public_send("#{exposing_field}=", 'new value')
+ end
+
+ it 'clears all secret fields' do
+ integration.valid?
+
+ integration.secret_fields.each do |field|
+ expect(integration.public_send(field)).to be_nil
+ expect(integration.properties[field]).to be_nil if integration.properties.present?
+ expect(integration.data_fields[field]).to be_nil if integration.supports_data_fields?
+ end
+ end
+
+ context 'when a secret field has been updated' do
+ let(:secret_field) { integration.secret_fields.first }
+ let(:other_secret_fields) { integration.secret_fields.without(secret_field) }
+ let(:new_value) { 'new value' }
+
+ before do
+ integration.public_send("#{secret_field}=", new_value)
+ end
+
+ it 'does not clear this secret field' do
+ integration.valid?
+
+ expect(integration.public_send(secret_field)).to eq('new value')
+
+ other_secret_fields.each do |field|
+ expect(integration.public_send(field)).to be_nil
+ end
+ end
+
+ context 'when a secret field has been updated with the same value' do
+ let(:new_value) { 'old value' }
+
+ it 'does not clear this secret field' do
+ integration.valid?
+
+ expect(integration.public_send(secret_field)).to eq('old value')
+
+ other_secret_fields.each do |field|
+ expect(integration.public_send(field)).to be_nil
+ end
+ end
+ end
+ end
+ end
+
+ context 'when no exposing field has changed' do
+ it 'does not clear any secret fields' do
+ integration.valid?
+
+ integration.secret_fields.each do |field|
+ expect(integration.public_send(field)).to eq('old value')
+ 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 da5c35c970a..2e062cda4e9 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
@@ -45,9 +45,33 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |integration_name
end
it "notifies about #{event_type} events" do
+ expect(chat_integration).not_to receive(:log_error)
+
chat_integration.execute(data)
+
expect(WebMock).to have_requested(:post, stubbed_resolved_hostname)
end
+
+ context 'when the response is not successful' do
+ let!(:stubbed_resolved_hostname) do
+ stub_full_request(webhook_url, method: :post)
+ .to_return(status: 409, body: 'error message')
+ .request_pattern.uri_pattern.to_s
+ end
+
+ it 'logs an error' do
+ expect(chat_integration).to receive(:log_error).with(
+ 'SlackMattermostNotifier HTTP error response',
+ request_host: 'example.gitlab.com',
+ response_code: 409,
+ response_body: 'error message'
+ )
+
+ chat_integration.execute(data)
+
+ expect(WebMock).to have_requested(:post, stubbed_resolved_hostname)
+ end
+ end
end
shared_examples "untriggered #{integration_name} integration" do |event_type: nil, branches_to_be_notified: nil|
@@ -59,8 +83,9 @@ RSpec.shared_examples Integrations::SlackMattermostNotifier do |integration_name
stub_full_request(webhook_url, method: :post).request_pattern.uri_pattern.to_s
end
- it "notifies about #{event_type} events" do
+ it "does not notify about #{event_type} events" do
chat_integration.execute(data)
+
expect(WebMock).not_to have_requested(:post, stubbed_resolved_hostname)
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 a329a6dca91..e293d10964b 100644
--- a/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/spec/support/shared_examples/models/member_shared_examples.rb
@@ -77,312 +77,309 @@ RSpec.shared_examples '#valid_level_roles' do |entity_name|
end
RSpec.shared_examples_for "member creation" do
- let_it_be(:user) { create(:user) }
let_it_be(:admin) { create(:admin) }
- describe '#execute' do
- it 'returns a Member object', :aggregate_failures do
- member = described_class.new(source, user, :maintainer).execute
-
- expect(member).to be_a member_type
- expect(member).to be_persisted
- end
+ it 'returns a Member object', :aggregate_failures do
+ member = described_class.new(source, user, :maintainer).execute
- context 'when adding a project_bot' do
- let_it_be(:project_bot) { create(:user, :project_bot) }
-
- before_all do
- source.add_owner(user)
- end
+ expect(member).to be_a member_type
+ expect(member).to be_persisted
+ end
- context 'when project_bot is already a member' do
- before do
- source.add_developer(project_bot)
- end
+ context 'when adding a project_bot' do
+ let_it_be(:project_bot) { create(:user, :project_bot) }
- it 'does not update the member' do
- member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
+ before_all do
+ source.add_owner(user)
+ end
- expect(source.users.reload).to include(project_bot)
- expect(member).to be_persisted
- expect(member.access_level).to eq(Gitlab::Access::DEVELOPER)
- expect(member.errors.full_messages).to include(/not authorized to update member/)
- end
+ context 'when project_bot is already a member' do
+ before do
+ source.add_developer(project_bot)
end
- context 'when project_bot is not already a member' do
- it 'adds the member' do
- member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
+ it 'does not update the member' do
+ member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
- expect(source.users.reload).to include(project_bot)
- expect(member).to be_persisted
- end
+ expect(source.users.reload).to include(project_bot)
+ expect(member).to be_persisted
+ expect(member.access_level).to eq(Gitlab::Access::DEVELOPER)
+ expect(member.errors.full_messages).to include(/not authorized to update member/)
end
end
- 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.new(source, user, :maintainer, current_user: admin).execute
+ context 'when project_bot is not already a member' do
+ it 'adds the member' do
+ member = described_class.new(source, project_bot, :maintainer, current_user: user).execute
+ expect(source.users.reload).to include(project_bot)
expect(member).to be_persisted
- expect(source.users.reload).to include(user)
- expect(member.created_by).to eq(admin)
end
end
+ end
- 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.new(source, user, :maintainer, current_user: admin).execute
+ 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.new(source, user, :maintainer, current_user: admin).execute
- expect(member).not_to be_persisted
- expect(source.users.reload).not_to include(user)
- expect(member.errors.full_messages).to include(/not authorized to create member/)
- end
+ expect(member).to be_persisted
+ expect(source.users.reload).to include(user)
+ expect(member.created_by).to eq(admin)
end
+ end
- it 'sets members.expires_at to the given expires_at' do
- member = described_class.new(source, user, :maintainer, expires_at: Date.new(2016, 9, 22)).execute
+ 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.new(source, user, :maintainer, current_user: admin).execute
- expect(member.expires_at).to eq(Date.new(2016, 9, 22))
+ expect(member).not_to be_persisted
+ expect(source.users.reload).not_to include(user)
+ expect(member.errors.full_messages).to include(/not authorized to create member/)
end
+ end
- described_class.access_levels.each do |sym_key, int_access_level|
- it "accepts the :#{sym_key} symbol as access level", :aggregate_failures do
- expect(source.users).not_to include(user)
+ it 'sets members.expires_at to the given expires_at' do
+ member = described_class.new(source, user, :maintainer, expires_at: Date.new(2016, 9, 22)).execute
- member = described_class.new(source, user.id, sym_key).execute
+ expect(member.expires_at).to eq(Date.new(2016, 9, 22))
+ end
- expect(member.access_level).to eq(int_access_level)
- expect(source.users.reload).to include(user)
- end
+ described_class.access_levels.each do |sym_key, int_access_level|
+ it "accepts the :#{sym_key} symbol as access level", :aggregate_failures do
+ expect(source.users).not_to include(user)
+
+ member = described_class.new(source, user.id, sym_key).execute
- it "accepts the #{int_access_level} integer as access level", :aggregate_failures do
+ expect(member.access_level).to eq(int_access_level)
+ expect(source.users.reload).to include(user)
+ end
+
+ it "accepts the #{int_access_level} integer as access level", :aggregate_failures do
+ expect(source.users).not_to include(user)
+
+ member = described_class.new(source, user.id, int_access_level).execute
+
+ expect(member.access_level).to eq(int_access_level)
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'with no current_user' do
+ context 'when called with a known user id' do
+ it 'adds the user as a member' do
expect(source.users).not_to include(user)
- member = described_class.new(source, user.id, int_access_level).execute
+ described_class.new(source, user.id, :maintainer).execute
- expect(member.access_level).to eq(int_access_level)
expect(source.users.reload).to include(user)
end
end
- context 'with no current_user' do
- context 'when called with a known user id' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
+ context 'when called with an unknown user id' do
+ it 'does not add the user as a member' do
+ expect(source.users).not_to include(user)
- described_class.new(source, user.id, :maintainer).execute
+ described_class.new(source, non_existing_record_id, :maintainer).execute
- expect(source.users.reload).to include(user)
- end
+ expect(source.users.reload).not_to include(user)
end
+ end
- context 'when called with an unknown user id' do
- it 'does not add the user as a member' do
- expect(source.users).not_to include(user)
+ context 'when called with a user object' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
- described_class.new(source, non_existing_record_id, :maintainer).execute
+ described_class.new(source, user, :maintainer).execute
- expect(source.users.reload).not_to include(user)
- end
+ expect(source.users.reload).to include(user)
+ end
+ end
+
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
end
- context 'when called with a user object' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
+ it 'adds the requester as a member', :aggregate_failures do
+ expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
+ expect do
described_class.new(source, user, :maintainer).execute
+ end.to raise_error(Gitlab::Access::AccessDeniedError)
- expect(source.users.reload).to include(user)
- end
+ expect(source.users.reload).not_to include(user)
+ expect(source.requesters.reload.exists?(user_id: user)).to be_truthy
end
+ end
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
-
- it 'adds the requester as a member', :aggregate_failures do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
+ context 'when called with a known user email' do
+ it 'adds the user as a member' do
+ expect(source.users).not_to include(user)
- expect do
- described_class.new(source, user, :maintainer).execute
- end.to raise_error(Gitlab::Access::AccessDeniedError)
+ described_class.new(source, user.email, :maintainer).execute
- expect(source.users.reload).not_to include(user)
- expect(source.requesters.reload.exists?(user_id: user)).to be_truthy
- end
+ expect(source.users.reload).to include(user)
end
+ end
- context 'when called with a known user email' do
- it 'adds the user as a member' do
- expect(source.users).not_to include(user)
+ context 'when called with an unknown user email' do
+ it 'creates an invited member' do
+ expect(source.users).not_to include(user)
- described_class.new(source, user.email, :maintainer).execute
+ described_class.new(source, 'user@example.com', :maintainer).execute
- expect(source.users.reload).to include(user)
- end
+ expect(source.members.invite.pluck(:invite_email)).to include('user@example.com')
end
+ end
- context 'when called with an unknown user email' do
- it 'creates an invited member' do
- expect(source.users).not_to include(user)
+ context 'when called with an unknown user email starting with a number' do
+ it 'creates an invited member', :aggregate_failures do
+ email_starting_with_number = "#{user.id}_email@example.com"
- described_class.new(source, 'user@example.com', :maintainer).execute
+ described_class.new(source, email_starting_with_number, :maintainer).execute
- expect(source.members.invite.pluck(:invite_email)).to include('user@example.com')
- end
+ expect(source.members.invite.pluck(:invite_email)).to include(email_starting_with_number)
+ expect(source.users.reload).not_to include(user)
end
+ end
+ end
- context 'when called with an unknown user email starting with a number' do
- it 'creates an invited member', :aggregate_failures do
- email_starting_with_number = "#{user.id}_email@example.com"
+ context 'when current_user can update member', :enable_admin_mode do
+ it 'creates the member' do
+ expect(source.users).not_to include(user)
- described_class.new(source, email_starting_with_number, :maintainer).execute
+ described_class.new(source, user, :maintainer, current_user: admin).execute
- expect(source.members.invite.pluck(:invite_email)).to include(email_starting_with_number)
- expect(source.users.reload).not_to include(user)
- end
- end
+ expect(source.users.reload).to include(user)
end
- context 'when current_user can update member', :enable_admin_mode do
- it 'creates the member' do
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
+ end
+
+ it 'adds the requester as a member', :aggregate_failures do
expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
described_class.new(source, user, :maintainer, current_user: admin).execute
expect(source.users.reload).to include(user)
+ expect(source.requesters.reload.exists?(user_id: user)).to be_falsy
end
+ end
+ end
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
+ context 'when current_user cannot update member' do
+ it 'does not create the member', :aggregate_failures do
+ expect(source.users).not_to include(user)
- it 'adds the requester as a member', :aggregate_failures do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
+ member = described_class.new(source, user, :maintainer, current_user: user).execute
- described_class.new(source, user, :maintainer, current_user: admin).execute
+ expect(source.users.reload).not_to include(user)
+ expect(member).not_to be_persisted
+ end
- expect(source.users.reload).to include(user)
- expect(source.requesters.reload.exists?(user_id: user)).to be_falsy
- end
+ context 'when called with a requester user object' do
+ before do
+ source.request_access(user)
end
- end
- context 'when current_user cannot update member' do
- it 'does not create the member', :aggregate_failures do
+ it 'does not destroy the requester', :aggregate_failures do
expect(source.users).not_to include(user)
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
- member = described_class.new(source, user, :maintainer, current_user: user).execute
+ described_class.new(source, user, :maintainer, current_user: user).execute
expect(source.users.reload).not_to include(user)
- expect(member).not_to be_persisted
+ expect(source.requesters.exists?(user_id: user)).to be_truthy
end
+ end
+ end
- context 'when called with a requester user object' do
- before do
- source.request_access(user)
- end
+ context 'when member already exists' do
+ before do
+ source.add_user(user, :developer)
+ end
- it 'does not destroy the requester', :aggregate_failures do
- expect(source.users).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
+ context 'with no current_user' do
+ it 'updates the member' do
+ expect(source.users).to include(user)
- described_class.new(source, user, :maintainer, current_user: user).execute
+ described_class.new(source, user, :maintainer).execute
- expect(source.users.reload).not_to include(user)
- expect(source.requesters.exists?(user_id: user)).to be_truthy
- end
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
end
end
- context 'when member already exists' do
- before do
- source.add_user(user, :developer)
- end
-
- context 'with no current_user' do
- it 'updates the member' do
- expect(source.users).to include(user)
+ context 'when current_user can update member', :enable_admin_mode do
+ it 'updates the member' do
+ expect(source.users).to include(user)
- described_class.new(source, user, :maintainer).execute
+ described_class.new(source, user, :maintainer, current_user: admin).execute
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
- end
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
end
+ end
- context 'when current_user can update member', :enable_admin_mode do
- it 'updates the member' do
- expect(source.users).to include(user)
+ context 'when current_user cannot update member' do
+ it 'does not update the member' do
+ expect(source.users).to include(user)
- described_class.new(source, user, :maintainer, current_user: admin).execute
+ described_class.new(source, user, :maintainer, current_user: user).execute
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::MAINTAINER)
- end
+ expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
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 `tasks_to_be_done` and `tasks_project_id` are passed' do
+ let(:task_project) { source.is_a?(Group) ? create(:project, group: source) : source }
- described_class.new(source, user, :maintainer, current_user: user).execute
+ it 'creates a member_task with the correct attributes', :aggregate_failures do
+ described_class.new(source, user, :developer, tasks_to_be_done: %w(ci code), tasks_project_id: task_project.id).execute
- expect(source.members.find_by(user_id: user).access_level).to eq(Gitlab::Access::DEVELOPER)
- end
- end
- end
+ member = source.members.last
- context 'when `tasks_to_be_done` and `tasks_project_id` are passed' do
- let(:task_project) { source.is_a?(Group) ? create(:project, group: source) : source }
+ expect(member.tasks_to_be_done).to match_array([:ci, :code])
+ expect(member.member_task.project).to eq(task_project)
+ end
- it 'creates a member_task with the correct attributes', :aggregate_failures do
- described_class.new(source, user, :developer, tasks_to_be_done: %w(ci code), tasks_project_id: task_project.id).execute
+ context 'with an already existing member' do
+ before do
+ source.add_user(user, :developer)
+ end
- member = source.members.last
+ it 'does not update tasks to be done if tasks already exist', :aggregate_failures do
+ member = source.members.find_by(user_id: user.id)
+ create(:member_task, member: member, project: task_project, tasks_to_be_done: %w(code ci))
- expect(member.tasks_to_be_done).to match_array([:ci, :code])
+ expect do
+ described_class.new(source,
+ user,
+ :developer,
+ tasks_to_be_done: %w(issues),
+ tasks_project_id: task_project.id).execute
+ end.not_to change(MemberTask, :count)
+
+ member.reset
+ expect(member.tasks_to_be_done).to match_array([:code, :ci])
expect(member.member_task.project).to eq(task_project)
end
- context 'with an already existing member' do
- before do
- source.add_user(user, :developer)
- end
-
- it 'does not update tasks to be done if tasks already exist', :aggregate_failures do
- member = source.members.find_by(user_id: user.id)
- create(:member_task, member: member, project: task_project, tasks_to_be_done: %w(code ci))
-
- expect do
- described_class.new(source,
- user,
- :developer,
- tasks_to_be_done: %w(issues),
- tasks_project_id: task_project.id).execute
- end.not_to change(MemberTask, :count)
-
- member.reset
- expect(member.tasks_to_be_done).to match_array([:code, :ci])
- expect(member.member_task.project).to eq(task_project)
- end
-
- it 'adds tasks to be done if they do not exist', :aggregate_failures do
- expect do
- described_class.new(source,
- user,
- :developer,
- tasks_to_be_done: %w(issues),
- tasks_project_id: task_project.id).execute
- end.to change(MemberTask, :count).by(1)
-
- member = source.members.find_by(user_id: user.id)
- expect(member.tasks_to_be_done).to match_array([:issues])
- expect(member.member_task.project).to eq(task_project)
- end
+ it 'adds tasks to be done if they do not exist', :aggregate_failures do
+ expect do
+ described_class.new(source,
+ user,
+ :developer,
+ tasks_to_be_done: %w(issues),
+ tasks_project_id: task_project.id).execute
+ end.to change(MemberTask, :count).by(1)
+
+ member = source.members.find_by(user_id: user.id)
+ expect(member.tasks_to_be_done).to match_array([:issues])
+ expect(member.member_task.project).to eq(task_project)
end
end
end
diff --git a/spec/support/shared_examples/models/reviewer_state_shared_examples.rb b/spec/support/shared_examples/models/reviewer_state_shared_examples.rb
deleted file mode 100644
index f1392768b06..00000000000
--- a/spec/support/shared_examples/models/reviewer_state_shared_examples.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-RSpec.shared_examples 'having reviewer state' do
- describe 'mr_attention_requests feature flag is disabled' do
- before do
- stub_feature_flags(mr_attention_requests: false)
- end
-
- it { is_expected.to have_attributes(state: 'unreviewed') }
- end
-
- describe 'mr_attention_requests feature flag is enabled' do
- it { is_expected.to have_attributes(state: 'attention_requested') }
- end
-end
diff --git a/spec/support/shared_examples/models/wiki_shared_examples.rb b/spec/support/shared_examples/models/wiki_shared_examples.rb
index 03e9dd65e33..6f17231a040 100644
--- a/spec/support/shared_examples/models/wiki_shared_examples.rb
+++ b/spec/support/shared_examples/models/wiki_shared_examples.rb
@@ -392,41 +392,161 @@ RSpec.shared_examples 'wiki model' do
end
describe '#create_page' do
- it 'creates a new wiki page' do
- expect(subject.create_page('test page', 'this is content')).not_to eq(false)
- expect(subject.list_pages.count).to eq(1)
- end
+ shared_examples 'create_page tests' do
+ it 'creates a new wiki page' do
+ expect(subject.create_page('test page', 'this is content')).not_to eq(false)
+ expect(subject.list_pages.count).to eq(1)
+ end
- it 'returns false when a duplicate page exists' do
- subject.create_page('test page', 'content')
+ it 'returns false when a duplicate page exists' do
+ subject.create_page('test page', 'content')
- expect(subject.create_page('test page', 'content')).to eq(false)
- end
+ expect(subject.create_page('test page', 'content')).to eq(false)
+ end
- it 'stores an error message when a duplicate page exists' do
- 2.times { subject.create_page('test page', 'content') }
+ it 'stores an error message when a duplicate page exists' do
+ 2.times { subject.create_page('test page', 'content') }
- expect(subject.error_message).to match(/Duplicate page:/)
- end
+ expect(subject.error_message).to match(/Duplicate page:/)
+ end
+
+ it 'sets the correct commit message' do
+ subject.create_page('test page', 'some content', :markdown, 'commit message')
+
+ expect(subject.list_pages.first.page.version.message).to eq('commit message')
+ end
+
+ it 'sets the correct commit email' do
+ subject.create_page('test page', 'content')
+
+ expect(user.commit_email).not_to eq(user.email)
+ expect(commit.author_email).to eq(user.commit_email)
+ expect(commit.committer_email).to eq(user.commit_email)
+ end
+
+ it 'runs after_wiki_activity callbacks' do
+ expect(subject).to receive(:after_wiki_activity)
- it 'sets the correct commit message' do
- subject.create_page('test page', 'some content', :markdown, 'commit message')
+ subject.create_page('Test Page', 'This is content')
+ end
+
+ it 'cannot create two pages with the same title but different format' do
+ subject.create_page('test page', 'content', :markdown)
+ subject.create_page('test page', 'content', :rdoc)
+
+ expect(subject.error_message).to match(/Duplicate page:/)
+ end
+
+ it 'cannot create two pages with the same title but different capitalization' do
+ subject.create_page('test page', 'content')
+ subject.create_page('Test page', 'content')
+
+ expect(subject.error_message).to match(/Duplicate page:/)
+ end
- expect(subject.list_pages.first.page.version.message).to eq('commit message')
+ it 'cannot create two pages with the same title, different capitalization, and different format' do
+ subject.create_page('test page', 'content')
+ subject.create_page('Test page', 'content', :rdoc)
+
+ expect(subject.error_message).to match(/Duplicate page:/)
+ end
end
- it 'sets the correct commit email' do
- subject.create_page('test page', 'content')
+ it_behaves_like 'create_page tests' do
+ it 'returns false if a page exists already in the repository', :aggregate_failures do
+ subject.create_page('test page', 'content')
- expect(user.commit_email).not_to eq(user.email)
- expect(commit.author_email).to eq(user.commit_email)
- expect(commit.committer_email).to eq(user.commit_email)
+ allow(subject).to receive(:file_exists_by_regex?).and_return(false)
+
+ expect(subject.create_page('test page', 'content')).to eq false
+ expect(subject.error_message).to match(/Duplicate page:/)
+ end
+
+ it 'returns false if it has an invalid format', :aggregate_failures do
+ expect(subject.create_page('test page', 'content', :foobar)).to eq false
+ expect(subject.error_message).to match(/Invalid format selected/)
+ end
+
+ using RSpec::Parameterized::TableSyntax
+
+ where(:new_file, :format, :existing_repo_files, :success) do
+ 'foo' | :markdown | [] | true
+ 'foo' | :rdoc | [] | true
+ 'foo' | :asciidoc | [] | true
+ 'foo' | :org | [] | true
+ 'foo' | :textile | [] | false
+ 'foo' | :creole | [] | false
+ 'foo' | :rest | [] | false
+ 'foo' | :mediawiki | [] | false
+ 'foo' | :pod | [] | false
+ 'foo' | :plaintext | [] | false
+ 'foo' | :markdown | ['foo.md'] | false
+ 'foo' | :markdown | ['foO.md'] | false
+ 'foO' | :markdown | ['foo.md'] | false
+ 'foo' | :markdown | ['foo.mdfoo'] | true
+ 'foo' | :markdown | ['foo.markdown'] | false
+ 'foo' | :markdown | ['foo.mkd'] | false
+ 'foo' | :markdown | ['foo.mkdn'] | false
+ 'foo' | :markdown | ['foo.mdown'] | false
+ 'foo' | :markdown | ['foo.adoc'] | false
+ 'foo' | :markdown | ['foo.asciidoc'] | false
+ 'foo' | :markdown | ['foo.org'] | false
+ 'foo' | :markdown | ['foo.rdoc'] | false
+ 'foo' | :markdown | ['foo.textile'] | false
+ 'foo' | :markdown | ['foo.creole'] | false
+ 'foo' | :markdown | ['foo.rest'] | false
+ 'foo' | :markdown | ['foo.rest.txt'] | false
+ 'foo' | :markdown | ['foo.rst'] | false
+ 'foo' | :markdown | ['foo.rst.txt'] | false
+ 'foo' | :markdown | ['foo.rst.txtfoo'] | true
+ 'foo' | :markdown | ['foo.mediawiki'] | false
+ 'foo' | :markdown | ['foo.wiki'] | false
+ 'foo' | :markdown | ['foo.pod'] | false
+ 'foo' | :markdown | ['foo.txt'] | false
+ 'foo' | :markdown | ['foo.Md'] | false
+ 'foo' | :markdown | ['foo.jpg'] | true
+ 'foo' | :rdoc | ['foo.md'] | false
+ 'foo' | :rdoc | ['foO.md'] | false
+ 'foO' | :rdoc | ['foo.md'] | false
+ 'foo' | :asciidoc | ['foo.md'] | false
+ 'foo' | :org | ['foo.md'] | false
+ 'foo' | :markdown | ['dir/foo.md'] | true
+ '/foo' | :markdown | ['foo.md'] | false
+ './foo' | :markdown | ['foo.md'] | false
+ '../foo' | :markdown | ['foo.md'] | false
+ '../../foo' | :markdown | ['foo.md'] | false
+ '../../foo' | :markdown | ['dir/foo.md'] | true
+ 'dir/foo' | :markdown | ['foo.md'] | true
+ 'dir/foo' | :markdown | ['dir/foo.md'] | false
+ 'dir/foo' | :markdown | ['dir/foo.rdoc'] | false
+ '/dir/foo' | :markdown | ['dir/foo.rdoc'] | false
+ './dir/foo' | :markdown | ['dir/foo.rdoc'] | false
+ '../dir/foo' | :markdown | ['dir/foo.rdoc'] | false
+ '../dir/../foo' | :markdown | ['dir/foo.rdoc'] | true
+ '../dir/../foo' | :markdown | ['foo.rdoc'] | false
+ '../dir/../dir/foo' | :markdown | ['dir/foo.rdoc'] | false
+ '../dir/../another/foo' | :markdown | ['dir/foo.rdoc'] | true
+ 'another/dir/foo' | :markdown | ['dir/foo.md'] | true
+ 'foo bar' | :markdown | ['foo-bar.md'] | false
+ 'foo bar' | :markdown | ['foo-bar.md'] | true
+ 'föö'.encode('ISO-8859-1') | :markdown | ['f��.md'] | false
+ end
+
+ with_them do
+ specify do
+ allow(subject.repository).to receive(:ls_files).and_return(existing_repo_files)
+
+ expect(subject.create_page(new_file, 'content', format)).to eq success
+ end
+ end
end
- it 'runs after_wiki_activity callbacks' do
- expect(subject).to receive(:after_wiki_activity)
+ context 'when feature flag :gitaly_replace_wiki_create_page is disabled' do
+ before do
+ stub_feature_flags(gitaly_replace_wiki_create_page: false)
+ end
- subject.create_page('Test Page', 'This is content')
+ it_behaves_like 'create_page tests'
end
end
@@ -452,7 +572,7 @@ RSpec.shared_examples 'wiki model' do
expect(subject).to receive(:after_wiki_activity)
expect(update_page).to eq true
- page = subject.find_page(updated_title.presence || original_title)
+ page = subject.find_page(expected_title)
expect(page.raw_content).to eq(updated_content)
expect(page.path).to eq(expected_path)
@@ -467,23 +587,25 @@ RSpec.shared_examples 'wiki model' do
shared_context 'common examples' do
using RSpec::Parameterized::TableSyntax
- where(:original_title, :original_format, :updated_title, :updated_format, :expected_path) do
- 'test page' | :markdown | 'new test page' | :markdown | 'new-test-page.md'
- 'test page' | :markdown | 'test page' | :markdown | 'test-page.md'
- 'test page' | :markdown | 'test page' | :asciidoc | 'test-page.asciidoc'
+ where(:original_title, :original_format, :updated_title, :updated_format, :expected_title, :expected_path) do
+ 'test page' | :markdown | 'new test page' | :markdown | 'new test page' | 'new-test-page.md'
+ 'test page' | :markdown | 'test page' | :markdown | 'test page' | 'test-page.md'
+ 'test page' | :markdown | 'test page' | :asciidoc | 'test page' | 'test-page.asciidoc'
+
+ 'test page' | :markdown | 'new dir/new test page' | :markdown | 'new dir/new test page' | 'new-dir/new-test-page.md'
+ 'test page' | :markdown | 'new dir/test page' | :markdown | 'new dir/test page' | 'new-dir/test-page.md'
- 'test page' | :markdown | 'new dir/new test page' | :markdown | 'new-dir/new-test-page.md'
- 'test page' | :markdown | 'new dir/test page' | :markdown | 'new-dir/test-page.md'
+ 'test dir/test page' | :markdown | 'new dir/new test page' | :markdown | 'new dir/new test page' | 'new-dir/new-test-page.md'
+ 'test dir/test page' | :markdown | 'test dir/test page' | :markdown | 'test dir/test page' | 'test-dir/test-page.md'
+ 'test dir/test page' | :markdown | 'test dir/test page' | :asciidoc | 'test dir/test page' | 'test-dir/test-page.asciidoc'
- 'test dir/test page' | :markdown | 'new dir/new test page' | :markdown | 'new-dir/new-test-page.md'
- 'test dir/test page' | :markdown | 'test dir/test page' | :markdown | 'test-dir/test-page.md'
- 'test dir/test page' | :markdown | 'test dir/test page' | :asciidoc | 'test-dir/test-page.asciidoc'
+ 'test dir/test page' | :markdown | 'new test page' | :markdown | 'new test page' | 'new-test-page.md'
+ 'test dir/test page' | :markdown | 'test page' | :markdown | 'test page' | 'test-page.md'
- 'test dir/test page' | :markdown | 'new test page' | :markdown | 'new-test-page.md'
- 'test dir/test page' | :markdown | 'test page' | :markdown | 'test-page.md'
+ 'test page' | :markdown | nil | :markdown | 'test page' | 'test-page.md'
+ 'test.page' | :markdown | nil | :markdown | 'test.page' | 'test.page.md'
- 'test page' | :markdown | nil | :markdown | 'test-page.md'
- 'test.page' | :markdown | nil | :markdown | 'test.page.md'
+ 'testpage' | :markdown | './testpage' | :markdown | 'testpage' | 'testpage.md'
end
end
@@ -497,16 +619,23 @@ RSpec.shared_examples 'wiki model' do
shared_context 'extended examples' do
using RSpec::Parameterized::TableSyntax
- where(:original_title, :original_format, :updated_title, :updated_format, :expected_path) do
- 'test page' | :markdown | 'new test page' | :asciidoc | 'new-test-page.asciidoc'
- 'test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new-dir/new-test-page.asciidoc'
- 'test dir/test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new-dir/new-test-page.asciidoc'
- 'test dir/test page' | :markdown | 'new test page' | :asciidoc | 'new-test-page.asciidoc'
- 'test page' | :markdown | nil | :asciidoc | 'test-page.asciidoc'
- 'test dir/test page' | :markdown | nil | :asciidoc | 'test-dir/test-page.asciidoc'
- 'test dir/test page' | :markdown | nil | :markdown | 'test-dir/test-page.md'
- 'test page' | :markdown | '' | :markdown | 'test-page.md'
- 'test.page' | :markdown | '' | :markdown | 'test.page.md'
+ where(:original_title, :original_format, :updated_title, :updated_format, :expected_title, :expected_path) do
+ 'test page' | :markdown | 'new test page' | :asciidoc | 'new test page' | 'new-test-page.asciidoc'
+ 'test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new dir/new test page' | 'new-dir/new-test-page.asciidoc'
+ 'test dir/test page' | :markdown | 'new dir/new test page' | :asciidoc | 'new dir/new test page' | 'new-dir/new-test-page.asciidoc'
+ 'test dir/test page' | :markdown | 'new test page' | :asciidoc | 'new test page' | 'new-test-page.asciidoc'
+ 'test page' | :markdown | nil | :asciidoc | 'test page' | 'test-page.asciidoc'
+ 'test dir/test page' | :markdown | nil | :asciidoc | 'test dir/test page' | 'test-dir/test-page.asciidoc'
+ 'test dir/test page' | :markdown | nil | :markdown | 'test dir/test page' | 'test-dir/test-page.md'
+ 'test page' | :markdown | '' | :markdown | 'test page' | 'test-page.md'
+ 'test.page' | :markdown | '' | :markdown | 'test.page' | 'test.page.md'
+ 'testpage' | :markdown | '../testpage' | :markdown | 'testpage' | 'testpage.md'
+ 'dir/testpage' | :markdown | 'dir/../testpage' | :markdown | 'testpage' | 'testpage.md'
+ 'dir/testpage' | :markdown | './dir/testpage' | :markdown | 'dir/testpage' | 'dir/testpage.md'
+ 'dir/testpage' | :markdown | '../dir/testpage' | :markdown | 'dir/testpage' | 'dir/testpage.md'
+ 'dir/testpage' | :markdown | '../dir/../testpage' | :markdown | 'testpage' | 'testpage.md'
+ 'dir/testpage' | :markdown | '../dir/../dir/testpage' | :markdown | 'dir/testpage' | 'dir/testpage.md'
+ 'dir/testpage' | :markdown | '../dir/../another/testpage' | :markdown | 'another/testpage' | 'another/testpage.md'
end
end
@@ -547,16 +676,6 @@ RSpec.shared_examples 'wiki model' do
end
end
end
-
- context 'when feature flag :gitaly_replace_wiki_update_page is disabled' do
- before do
- stub_feature_flags(gitaly_replace_wiki_update_page: false)
- end
-
- it_behaves_like 'update_page tests' do
- include_context 'common examples'
- end
- end
end
describe '#delete_page' do
diff --git a/spec/support/shared_examples/nav_sidebar_shared_examples.rb b/spec/support/shared_examples/nav_sidebar_shared_examples.rb
index 3e500683712..4b815988bc5 100644
--- a/spec/support/shared_examples/nav_sidebar_shared_examples.rb
+++ b/spec/support/shared_examples/nav_sidebar_shared_examples.rb
@@ -27,7 +27,7 @@ end
RSpec.shared_examples 'sidebar includes snowplow attributes' do |track_action, track_label, track_property|
specify do
- allow(view).to receive(:tracking_enabled?).and_return(true)
+ stub_application_setting(snowplow_enabled: true)
render
diff --git a/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb b/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
index c1eccafa987..f5c41416763 100644
--- a/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/container_repositories_shared_examples.rb
@@ -21,6 +21,7 @@ RSpec.shared_examples 'returns repositories for allowed users' do |user_type, sc
expect(json_response.map { |repository| repository['id'] }).to contain_exactly(
root_repository.id, test_repository.id)
expect(response.body).not_to include('tags')
+ expect(response.body).not_to include('tags_count')
end
it 'returns a matching schema' do
@@ -29,7 +30,11 @@ RSpec.shared_examples 'returns repositories for allowed users' do |user_type, sc
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('registry/repositories')
end
+ end
+end
+RSpec.shared_examples 'returns tags for allowed users' do |user_type, scope|
+ context "for #{user_type}" do
context 'with tags param' do
let(:url) { "/#{scope}s/#{object.id}/registry/repositories?tags=true" }
@@ -169,10 +174,12 @@ RSpec.shared_examples 'reconciling migration_state' do
end
end
- context 'import_failed response' do
- let(:status) { 'import_failed' }
+ %w[import_canceled import_failed].each do |status|
+ context "#{status} response" do
+ let(:status) { status }
- it_behaves_like 'retrying the import'
+ it_behaves_like 'retrying the import'
+ end
end
context 'pre_import_in_progress response' do
@@ -192,17 +199,11 @@ RSpec.shared_examples 'reconciling migration_state' do
end
end
- context 'pre_import_failed response' do
- let(:status) { 'pre_import_failed' }
-
- it_behaves_like 'retrying the pre_import'
- end
-
- %w[pre_import_canceled import_canceled].each do |canceled_status|
- context "#{canceled_status} response" do
- let(:status) { canceled_status }
+ %w[pre_import_canceled pre_import_failed].each do |status|
+ context "#{status} response" do
+ let(:status) { status }
- it_behaves_like 'enforcing states coherence to', 'import_skipped'
+ it_behaves_like 'retrying the pre_import'
end
end
end
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 da9d254039b..e534a02e562 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
@@ -67,11 +67,15 @@ RSpec.shared_examples 'group and project boards query' do
let(:sort_param) { }
let(:first_param) { 2 }
+ def pagination_results_data(nodes)
+ nodes
+ end
+
let(:all_records) do
if board_parent.multiple_issue_boards_available?
- boards.map { |board| global_id_of(board) }
+ boards.map { |board| a_graphql_entity_for(board) }
else
- [global_id_of(boards.first)]
+ [a_graphql_entity_for(boards.first)]
end
end
end
diff --git a/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
index 7e1f4500779..9033a8b4d3a 100644
--- a/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/noteable_shared_examples.rb
@@ -12,9 +12,9 @@ RSpec.shared_examples 'a noteable graphql type we can query' do
def expected
noteable.discussions.map do |discussion|
- include(
- 'id' => global_id_of(discussion),
- 'replyId' => global_id_of(discussion, id: discussion.reply_id),
+ a_graphql_entity_for(
+ discussion,
+ 'replyId' => global_id_of(discussion, id: discussion.reply_id).to_s,
'createdAt' => discussion.created_at.iso8601,
'notes' => include(
'nodes' => have_attributes(size: discussion.notes.size)
@@ -50,8 +50,8 @@ RSpec.shared_examples 'a noteable graphql type we can query' do
post_graphql(query(fields), current_user: current_user)
- data = graphql_data_at(*path_to_noteable, :discussions, :nodes, :noteable, :id)
- expect(data[0]).to eq(global_id_of(noteable))
+ entities = graphql_data_at(*path_to_noteable, :discussions, :nodes, :noteable)
+ expect(entities).to all(match(a_graphql_entity_for(noteable)))
end
end
@@ -62,10 +62,10 @@ RSpec.shared_examples 'a noteable graphql type we can query' do
def expected
noteable.notes.map do |note|
- include(
- 'id' => global_id_of(note),
- 'project' => include('id' => global_id_of(project)),
- 'author' => include('id' => global_id_of(note.author)),
+ a_graphql_entity_for(
+ note,
+ 'project' => a_graphql_entity_for(project),
+ 'author' => a_graphql_entity_for(note.author),
'createdAt' => note.created_at.iso8601,
'body' => eq(note.note)
)
diff --git a/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
index 127b1a6d4c4..9f7ec6e90e9 100644
--- a/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb
@@ -104,7 +104,7 @@ RSpec.shared_examples 'group and project packages query' do
}
end
- let(:expected_packages) { sorted_packages.map { |package| global_id_of(package) } }
+ let(:expected_packages) { sorted_packages.map { |package| global_id_of(package).to_s } }
let(:data_path) { [resource_type, :packages] }
@@ -191,4 +191,91 @@ RSpec.shared_examples 'group and project packages query' do
it { is_expected.to include({ "name" => versionless_package.name }) }
end
end
+
+ context 'when reading pipelines' do
+ let(:npm_pipelines) { create_list(:ci_pipeline, 6, project: project1) }
+ let(:npm_pipeline_gids) { npm_pipelines.sort_by(&:id).map(&:to_gid).map(&:to_s).reverse }
+ let(:composer_pipelines) { create_list(:ci_pipeline, 6, project: project2) }
+ let(:composer_pipeline_gids) { composer_pipelines.sort_by(&:id).map(&:to_gid).map(&:to_s).reverse }
+ let(:npm_end_cursor) { graphql_data_npm_package.dig('pipelines', 'pageInfo', 'endCursor') }
+ let(:npm_start_cursor) { graphql_data_npm_package.dig('pipelines', 'pageInfo', 'startCursor') }
+ let(:pipelines_nodes) do
+ <<~QUERY
+ nodes {
+ id
+ }
+ pageInfo {
+ startCursor
+ endCursor
+ }
+ QUERY
+ end
+
+ before do
+ resource.add_maintainer(current_user)
+
+ npm_pipelines.each do |pipeline|
+ create(:package_build_info, package: npm_package, pipeline: pipeline)
+ end
+
+ composer_pipelines.each do |pipeline|
+ create(:package_build_info, package: composer_package, pipeline: pipeline)
+ end
+ end
+
+ it 'loads the second page with pagination first correctly' do
+ run_query(first: 2)
+ expect(npm_pipeline_ids).to eq(npm_pipeline_gids[0..1])
+ expect(composer_pipeline_ids).to eq(composer_pipeline_gids[0..1])
+
+ run_query(first: 2, after: npm_end_cursor)
+ expect(npm_pipeline_ids).to eq(npm_pipeline_gids[2..3])
+ expect(composer_pipeline_ids).to be_empty
+ end
+
+ it 'loads the second page with pagination last correctly' do
+ run_query(last: 2)
+ expect(npm_pipeline_ids).to eq(npm_pipeline_gids[4..5])
+ expect(composer_pipeline_ids).to eq(composer_pipeline_gids[4..5])
+
+ run_query(last: 2, before: npm_start_cursor)
+ expect(npm_pipeline_ids).to eq(npm_pipeline_gids[2..3])
+ expect(composer_pipeline_ids).to eq(composer_pipeline_gids[4..5])
+ end
+
+ def run_query(args)
+ pipelines_field = query_graphql_field('pipelines', args, pipelines_nodes)
+
+ packages_nodes = <<~QUERY
+ nodes {
+ id
+ #{pipelines_field}
+ }
+ QUERY
+
+ query = graphql_query_for(
+ resource_type,
+ { 'fullPath' => resource.full_path },
+ query_graphql_field('packages', {}, packages_nodes)
+ )
+
+ post_graphql(query, current_user: current_user)
+ end
+
+ def npm_pipeline_ids
+ graphql_data_npm_package.dig('pipelines', 'nodes').map { |pipeline| pipeline['id'] }
+ end
+
+ def composer_pipeline_ids
+ graphql_data_composer_package.dig('pipelines', 'nodes').map { |pipeline| pipeline['id'] }
+ end
+
+ def graphql_data_npm_package
+ graphql_data_at(resource_type, :packages, :nodes).find { |pkg| pkg['id'] == npm_package.to_gid.to_s }
+ end
+
+ def graphql_data_composer_package
+ graphql_data_at(resource_type, :packages, :nodes).find { |pkg| pkg['id'] == composer_package.to_gid.to_s }
+ end
+ end
end
diff --git a/spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb
index ab93f54111b..b4019d7c232 100644
--- a/spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/packages/package_details_shared_examples.rb
@@ -28,14 +28,10 @@ RSpec.shared_examples 'a package with files' do
end
it 'has the basic package files data' do
- expect(first_file_response).to include(
- 'id' => global_id_of(first_file),
- 'fileName' => first_file.file_name,
- 'size' => first_file.size.to_s,
- 'downloadPath' => first_file.download_path,
- 'fileSha1' => first_file.file_sha1,
- 'fileMd5' => first_file.file_md5,
- 'fileSha256' => first_file.file_sha256
+ expect(first_file_response).to match a_graphql_entity_for(
+ first_file,
+ :file_name, :download_path, :file_sha1, :file_md5, :file_sha256,
+ 'size' => first_file.size.to_s
)
end
diff --git a/spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb
index c134f7d1839..3c5f25baaa1 100644
--- a/spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/graphql/projects/alert_management/integrations_shared_examples.rb
@@ -30,14 +30,12 @@ RSpec.shared_examples 'GraphQL query with several integrations requested' do |gr
it 'returns the correct properties of the integrations', :aggregate_failures do
post_graphql(multi_selection_query, current_user: current_user)
- expect(graphql_data.dig('project', 'ai', 'nodes')).to include(
- 'id' => global_id_of(active_http_integration),
- 'name' => active_http_integration.name
+ expect(graphql_data.dig('project', 'ai', 'nodes')).to match a_graphql_entity_for(
+ active_http_integration, :name
)
- expect(graphql_data.dig('project', 'ii', 'nodes')).to include(
- 'id' => global_id_of(inactive_http_integration),
- 'name' => inactive_http_integration.name
+ expect(graphql_data.dig('project', 'ii', 'nodes')).to match a_graphql_entity_for(
+ inactive_http_integration, :name
)
end
diff --git a/spec/support/shared_examples/requests/api/milestones_shared_examples.rb b/spec/support/shared_examples/requests/api/milestones_shared_examples.rb
index 249a7b7cdac..1ea11ba3d7c 100644
--- a/spec/support/shared_examples/requests/api/milestones_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/milestones_shared_examples.rb
@@ -203,16 +203,16 @@ RSpec.shared_examples 'group and project milestones' do |route_definition|
end
describe "DELETE #{route_definition}/:milestone_id" do
- it "rejects a member with reporter access from deleting a milestone" do
- reporter = create(:user)
- milestone.resource_parent.add_reporter(reporter)
+ it "rejects a member with guest access from deleting a milestone" do
+ guest = create(:user)
+ milestone.resource_parent.add_guest(guest)
- delete api(resource_route, reporter)
+ delete api(resource_route, guest)
expect(response).to have_gitlab_http_status(:forbidden)
end
- it 'deletes the milestone when the user has developer access to the project' do
+ it 'deletes the milestone when the user has reporter access to the project' do
delete api(resource_route, user)
expect(project.milestones.find_by_id(milestone.id)).to be_nil
diff --git a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
index 68cb91d7414..d4417b23a5f 100644
--- a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
+++ b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
@@ -149,6 +149,7 @@ RSpec.shared_examples 'rate-limited token requests' do
arguments = a_hash_including({
message: 'Rack_Attack',
+ status: 429,
env: :throttle,
remote_ip: '127.0.0.1',
request_method: request_method,
@@ -314,6 +315,7 @@ RSpec.shared_examples 'rate-limited web authenticated requests' do
arguments = a_hash_including({
message: 'Rack_Attack',
+ status: 429,
env: :throttle,
remote_ip: '127.0.0.1',
request_method: request_method,
@@ -391,14 +393,16 @@ RSpec.shared_examples 'tracking when dry-run mode is set' do
end
it 'logs RackAttack info into structured logs' do
- arguments = a_hash_including({
- message: 'Rack_Attack',
- env: :track,
- remote_ip: '127.0.0.1',
- matched: throttle_name
- })
+ expect(Gitlab::AuthLogger).to receive(:error) do |arguments|
+ expect(arguments).to include(
+ message: 'Rack_Attack',
+ env: :track,
+ remote_ip: '127.0.0.1',
+ matched: throttle_name
+ )
- expect(Gitlab::AuthLogger).to receive(:error).with(arguments)
+ expect(arguments).not_to have_key(:status)
+ end
(1 + requests_per_period).times do
do_request
@@ -576,6 +580,7 @@ RSpec.shared_examples 'rate-limited unauthenticated requests' do
arguments = a_hash_including({
message: 'Rack_Attack',
+ status: 429,
env: :throttle,
remote_ip: '127.0.0.1',
request_method: 'GET',
diff --git a/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb b/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
index fcd52cdf7fa..e1baa594f3c 100644
--- a/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
+++ b/spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
-RSpec.shared_examples 'avoid N+1 on environments serialization' do |ee: false|
+RSpec.shared_examples 'avoid N+1 on environments serialization' do
it 'avoids N+1 database queries with grouping', :request_store do
create_environment_with_associations(project)
diff --git a/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb b/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb
index e776c098fa0..31571b1ffb9 100644
--- a/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb
@@ -1,21 +1,33 @@
# frozen_string_literal: true
-shared_examples_for 'service deleting todos' do
+shared_examples_for 'service scheduling async deletes' do
it 'destroys associated todos asynchronously' do
- expect(TodosDestroyer::DestroyedIssuableWorker)
+ expect(worker_class)
.to receive(:perform_async)
.with(issuable.id, issuable.class.name)
subject.execute(issuable)
end
-end
-shared_examples_for 'service deleting label links' do
- it 'destroys associated label links asynchronously' do
- expect(Issuable::LabelLinksDestroyWorker)
+ it 'works inside a transaction' do
+ expect(worker_class)
.to receive(:perform_async)
.with(issuable.id, issuable.class.name)
- subject.execute(issuable)
+ ApplicationRecord.transaction do
+ subject.execute(issuable)
+ end
+ end
+end
+
+shared_examples_for 'service deleting todos' do
+ it_behaves_like 'service scheduling async deletes' do
+ let(:worker_class) { TodosDestroyer::DestroyedIssuableWorker }
+ end
+end
+
+shared_examples_for 'service deleting label links' do
+ it_behaves_like 'service scheduling async deletes' do
+ let(:worker_class) { Issuable::LabelLinksDestroyWorker }
end
end
diff --git a/spec/support/shared_examples/services/jira/requests/base_shared_examples.rb b/spec/support/shared_examples/services/jira/requests/base_shared_examples.rb
index c4f6273b46c..5e49bdd706c 100644
--- a/spec/support/shared_examples/services/jira/requests/base_shared_examples.rb
+++ b/spec/support/shared_examples/services/jira/requests/base_shared_examples.rb
@@ -66,18 +66,12 @@ RSpec.shared_examples 'a service that handles Jira API errors' do
it 'logs the error' do
stub_client_and_raise(Timeout::Error, 'foo')
- expect(Gitlab::ProjectServiceLogger).to receive(:error).with(
- hash_including(
- client_url: be_present,
- message: 'Error sending message',
- service_class: described_class.name,
- error: hash_including(
- exception_class: Timeout::Error.name,
- exception_message: 'foo',
- exception_backtrace: be_present
- )
- )
+ expect(jira_integration).to receive(:log_exception).with(
+ kind_of(Timeout::Error),
+ message: 'Error sending message',
+ client_url: jira_integration.url
)
+
expect(subject).to be_error
end
diff --git a/spec/support/shared_examples/work_item_base_types_importer.rb b/spec/support/shared_examples/work_item_base_types_importer.rb
index 68e37171ea2..593670ac4b8 100644
--- a/spec/support/shared_examples/work_item_base_types_importer.rb
+++ b/spec/support/shared_examples/work_item_base_types_importer.rb
@@ -1,10 +1,48 @@
# frozen_string_literal: true
RSpec.shared_examples 'work item base types importer' do
- it 'creates all base work item types' do
- # Fixtures need to run on a pristine DB, but the test suite preloads the base types before(:suite)
+ it "creates all base work item types if they don't exist" do
WorkItems::Type.delete_all
expect { subject }.to change(WorkItems::Type, :count).from(0).to(WorkItems::Type::BASE_TYPES.count)
+
+ types_in_db = WorkItems::Type.all.map { |type| type.slice(:base_type, :icon_name, :name).symbolize_keys }
+ expected_types = WorkItems::Type::BASE_TYPES.map do |type, attributes|
+ attributes.slice(:icon_name, :name).merge(base_type: type.to_s)
+ end
+
+ expect(types_in_db).to match_array(expected_types)
+ expect(WorkItems::Type.all).to all(be_valid)
+ end
+
+ it 'upserts base work item types if they already exist' do
+ first_type = WorkItems::Type.first
+ original_name = first_type.name
+
+ first_type.update!(name: original_name.upcase)
+
+ expect do
+ subject
+ first_type.reload
+ end.to not_change(WorkItems::Type, :count).and(
+ change(first_type, :name).from(original_name.upcase).to(original_name)
+ )
+ end
+
+ it 'executes a single INSERT query' do
+ expect { subject }.to make_queries_matching(/INSERT/, 1)
+ end
+
+ context 'when some base types exist' do
+ before do
+ WorkItems::Type.limit(1).delete_all
+ end
+
+ it 'inserts all types and does nothing if some already existed' do
+ expect { subject }.to make_queries_matching(/INSERT/, 1).and(
+ change(WorkItems::Type, :count).by(1)
+ )
+ expect(WorkItems::Type.count).to eq(WorkItems::Type::BASE_TYPES.count)
+ end
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 26731f34ed6..3d4e840fe2d 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
@@ -205,4 +205,123 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d
end
end
end
+
+ describe 'executing an entire migration', :freeze_time, if: Gitlab::Database.has_config?(tracking_database) do
+ include Gitlab::Database::DynamicModelHelpers
+
+ let(:migration_class) do
+ Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) do
+ def perform(matching_status)
+ each_sub_batch(
+ operation_name: :update_all,
+ batching_scope: -> (relation) { relation.where(status: matching_status) }
+ ) do |sub_batch|
+ sub_batch.update_all(some_column: 0)
+ end
+ end
+ end
+ end
+
+ let!(:migration) do
+ create(
+ :batched_background_migration,
+ :active,
+ table_name: table_name,
+ column_name: :id,
+ max_value: migration_records,
+ batch_size: batch_size,
+ sub_batch_size: sub_batch_size,
+ job_class_name: 'ExampleDataMigration',
+ job_arguments: [1]
+ )
+ end
+
+ let(:table_name) { 'example_data' }
+ let(:batch_size) { 5 }
+ let(:sub_batch_size) { 2 }
+ let(:number_of_batches) { 10 }
+ let(:migration_records) { batch_size * number_of_batches }
+
+ let(:connection) { Gitlab::Database.database_base_models[tracking_database].connection }
+ let(:example_data) { define_batchable_model(table_name, connection: connection) }
+
+ around do |example|
+ Gitlab::Database::SharedModel.using_connection(connection) do
+ example.run
+ end
+ end
+
+ before do
+ # Create example table populated with test data to migrate.
+ #
+ # Test data should have two records that won't be updated:
+ # - one record beyond the migration's range
+ # - one record that doesn't match the migration job's batch condition
+ connection.execute(<<~SQL)
+ CREATE TABLE #{table_name} (
+ id integer primary key,
+ some_column integer,
+ status smallint);
+
+ INSERT INTO #{table_name} (id, some_column, status)
+ SELECT generate_series, generate_series, 1
+ FROM generate_series(1, #{migration_records + 1});
+
+ UPDATE #{table_name}
+ SET status = 0
+ WHERE some_column = #{migration_records - 5};
+ SQL
+
+ stub_feature_flags(execute_batched_migrations_on_schedule: true)
+
+ stub_const('Gitlab::BackgroundMigration::ExampleDataMigration', migration_class)
+ end
+
+ subject(:full_migration_run) do
+ # process all batches, then do an extra execution to mark the job as finished
+ (number_of_batches + 1).times do
+ described_class.new.perform
+
+ travel_to((migration.interval + described_class::INTERVAL_VARIANCE).seconds.from_now)
+ end
+ end
+
+ it 'marks the migration record as finished' do
+ expect { full_migration_run }.to change { migration.reload.status }.from(1).to(3) # active -> finished
+ end
+
+ it 'creates job records for each processed batch', :aggregate_failures do
+ expect { full_migration_run }.to change { migration.reload.batched_jobs.count }.from(0)
+
+ final_min_value = migration.batched_jobs.reduce(1) do |next_min_value, batched_job|
+ expect(batched_job.min_value).to eq(next_min_value)
+
+ batched_job.max_value + 1
+ end
+
+ final_max_value = final_min_value - 1
+ expect(final_max_value).to eq(migration_records)
+ end
+
+ it 'marks all job records as succeeded', :aggregate_failures do
+ expect { full_migration_run }.to change { migration.reload.batched_jobs.count }.from(0)
+
+ expect(migration.batched_jobs).to all(be_succeeded)
+ end
+
+ it 'updates matching records in the range', :aggregate_failures do
+ expect { full_migration_run }
+ .to change { example_data.where('status = 1 AND some_column <> 0').count }
+ .from(migration_records).to(1)
+
+ record_outside_range = example_data.last
+
+ expect(record_outside_range.status).to eq(1)
+ expect(record_outside_range.some_column).not_to eq(0)
+ end
+
+ 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
+ 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 4751d91efde..77c4a3431e2 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
@@ -202,6 +202,8 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true|
before do
expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid)
+
+ statistics_keys.delete(:repository_size)
end
it_behaves_like 'it calls Gitaly'
diff --git a/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb b/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
index d9105981b4b..2741b2a9de7 100644
--- a/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
+++ b/spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
@@ -19,7 +19,13 @@ RSpec.shared_examples 'reenqueuer' do
describe '#perform' do
it 'tries to obtain a lease' do
- expect_to_obtain_exclusive_lease(subject.lease_key)
+ lease_key = if subject.respond_to?(:set_custom_lease_key)
+ subject.set_custom_lease_key(*job_args)
+ else
+ subject.lease_key
+ end
+
+ expect_to_obtain_exclusive_lease(lease_key)
subject_perform
end
diff --git a/spec/support_specs/helpers/active_record/query_recorder_spec.rb b/spec/support_specs/helpers/active_record/query_recorder_spec.rb
index f1af9ceffb9..d6c52b22449 100644
--- a/spec/support_specs/helpers/active_record/query_recorder_spec.rb
+++ b/spec/support_specs/helpers/active_record/query_recorder_spec.rb
@@ -78,12 +78,14 @@ RSpec.describe ActiveRecord::QueryRecorder do
end
describe 'detecting the right number of calls and their origin' do
- it 'detects two separate queries' do
- control = ActiveRecord::QueryRecorder.new query_recorder_debug: true do
+ let(:control) do
+ ActiveRecord::QueryRecorder.new query_recorder_debug: true do
2.times { TestQueries.count }
TestQueries.first
end
+ end
+ it 'detects two separate queries' do
# Check #find_query
expect(control.find_query(/.*/, 0).size)
.to eq(control.data.keys.size)
@@ -98,8 +100,8 @@ RSpec.describe ActiveRecord::QueryRecorder do
expect(control.log.size).to eq(3)
# Ensure memoization value match the raw value above
expect(control.count).to eq(control.log.size)
- # Ensure we have only two sources of queries
- expect(control.data.keys.size).to eq(1)
+ # Ensure we have two sources of queries
+ expect(control.data.keys.size).to eq(2)
end
end
end
diff --git a/spec/support_specs/helpers/graphql_helpers_spec.rb b/spec/support_specs/helpers/graphql_helpers_spec.rb
index fae29ec32f5..f567097af6f 100644
--- a/spec/support_specs/helpers/graphql_helpers_spec.rb
+++ b/spec/support_specs/helpers/graphql_helpers_spec.rb
@@ -10,6 +10,81 @@ RSpec.describe GraphqlHelpers do
query.tr("\n", ' ').gsub(/\s+/, ' ').strip
end
+ describe 'a_graphql_entity_for' do
+ context 'when no arguments are passed' do
+ it 'raises an error' do
+ expect { a_graphql_entity_for }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when the model is nil, with no properties' do
+ it 'raises an error' do
+ expect { a_graphql_entity_for(nil) }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when the model is nil, any fields are passed' do
+ it 'raises an error' do
+ expect { a_graphql_entity_for(nil, :username) }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'with no model' do
+ it 'behaves like hash-inclusion with camel-casing' do
+ response = { 'foo' => 1, 'bar' => 2, 'camelCased' => 3 }
+
+ expect(response).to match a_graphql_entity_for(foo: 1, camel_cased: 3)
+ expect(response).not_to match a_graphql_entity_for(missing: 5)
+ end
+ end
+
+ context 'with just a model' do
+ it 'only considers the ID' do
+ user = build_stubbed(:user)
+ response = { 'username' => 'foo', 'id' => global_id_of(user).to_s }
+
+ expect(response).to match a_graphql_entity_for(user)
+ end
+ end
+
+ context 'with a model and some method names' do
+ it 'also considers the method names' do
+ user = build_stubbed(:user)
+ response = { 'username' => user.username, 'id' => global_id_of(user).to_s }
+
+ expect(response).to match a_graphql_entity_for(user, :username)
+ expect(response).not_to match a_graphql_entity_for(user, :name)
+ end
+ end
+
+ context 'with a model and some other properties' do
+ it 'behaves like the superset' do
+ user = build_stubbed(:user)
+ response = { 'username' => 'foo', 'id' => global_id_of(user).to_s }
+
+ expect(response).to match a_graphql_entity_for(user, username: 'foo')
+ expect(response).not_to match a_graphql_entity_for(user, name: 'foo')
+ end
+ end
+
+ context 'with a model, method names, and some other properties' do
+ it 'behaves like the superset' do
+ user = build_stubbed(:user)
+ response = {
+ 'username' => user.username,
+ 'name' => user.name,
+ 'foo' => 'bar',
+ 'baz' => 'fop',
+ 'id' => global_id_of(user).to_s
+ }
+
+ expect(response).to match a_graphql_entity_for(user, :username, :name, foo: 'bar')
+ expect(response).to match a_graphql_entity_for(user, :name, foo: 'bar')
+ expect(response).not_to match a_graphql_entity_for(user, :name, bar: 'foo')
+ end
+ end
+ end
+
describe 'graphql_dig_at' do
it 'transforms symbol keys to graphql field names' do
data = { 'camelCased' => 'names' }
diff --git a/spec/support_specs/helpers/migrations_helpers_spec.rb b/spec/support_specs/helpers/migrations_helpers_spec.rb
new file mode 100644
index 00000000000..b82eddad9bc
--- /dev/null
+++ b/spec/support_specs/helpers/migrations_helpers_spec.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MigrationsHelpers do
+ let(:helper_class) do
+ Class.new.tap do |klass|
+ klass.include described_class
+ allow(klass).to receive(:metadata).and_return(metadata)
+ end
+ end
+
+ let(:metadata) { {} }
+ let(:helper) { helper_class.new }
+
+ describe '#active_record_base' do
+ it 'returns the main base model' do
+ expect(helper.active_record_base).to eq(ActiveRecord::Base)
+ end
+
+ context 'ci database configured' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'returns the CI base model' do
+ expect(helper.active_record_base(database: :ci)).to eq(Ci::ApplicationRecord)
+ end
+ end
+
+ context 'ci database not configured' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
+ it 'returns the main base model' do
+ expect(helper.active_record_base(database: :ci)).to eq(ActiveRecord::Base)
+ end
+ end
+
+ it 'raises ArgumentError for bad database argument' do
+ expect { helper.active_record_base(database: :non_existent) }.to raise_error(ArgumentError)
+ end
+ end
+
+ describe '#table' do
+ it 'creates a class based on main base model' do
+ klass = helper.table(:projects)
+ expect(klass.connection_specification_name).to eq('ActiveRecord::Base')
+ end
+
+ context 'ci database configured' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'create a class based on the CI base model' do
+ klass = helper.table(:ci_builds, database: :ci)
+ expect(klass.connection_specification_name).to eq('Ci::ApplicationRecord')
+ end
+ end
+
+ context 'ci database not configured' do
+ before do
+ skip_if_multiple_databases_are_setup
+ end
+
+ it 'creates a class based on main base model' do
+ klass = helper.table(:ci_builds, database: :ci)
+ expect(klass.connection_specification_name).to eq('ActiveRecord::Base')
+ end
+ end
+ end
+end
diff --git a/spec/support_specs/helpers/stub_feature_flags_spec.rb b/spec/support_specs/helpers/stub_feature_flags_spec.rb
index 9b35fe35259..a59d8a20a40 100644
--- a/spec/support_specs/helpers/stub_feature_flags_spec.rb
+++ b/spec/support_specs/helpers/stub_feature_flags_spec.rb
@@ -47,13 +47,13 @@ RSpec.describe StubFeatureFlags do
it { expect(Feature.enabled?(feature_name)).to eq(expected_result) }
it { expect(Feature.disabled?(feature_name)).not_to eq(expected_result) }
- context 'default_enabled does not impact feature state' do
+ context 'default_enabled_if_undefined does not impact feature state' do
before do
allow(dummy_definition).to receive(:default_enabled).and_return(true)
end
- it { expect(Feature.enabled?(feature_name, default_enabled: true)).to eq(expected_result) }
- it { expect(Feature.disabled?(feature_name, default_enabled: true)).not_to eq(expected_result) }
+ it { expect(Feature.enabled?(feature_name, default_enabled_if_undefined: true)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name, default_enabled_if_undefined: true)).not_to eq(expected_result) }
end
end
end
@@ -83,13 +83,13 @@ RSpec.describe StubFeatureFlags do
it { expect(Feature.enabled?(feature_name, actor(tested_actor))).to eq(expected_result) }
it { expect(Feature.disabled?(feature_name, actor(tested_actor))).not_to eq(expected_result) }
- context 'default_enabled does not impact feature state' do
+ context 'default_enabled_if_undefined does not impact feature state' do
before do
allow(dummy_definition).to receive(:default_enabled).and_return(true)
end
- it { expect(Feature.enabled?(feature_name, actor(tested_actor), default_enabled: true)).to eq(expected_result) }
- it { expect(Feature.disabled?(feature_name, actor(tested_actor), default_enabled: true)).not_to eq(expected_result) }
+ it { expect(Feature.enabled?(feature_name, actor(tested_actor), default_enabled_if_undefined: true)).to eq(expected_result) }
+ it { expect(Feature.disabled?(feature_name, actor(tested_actor), default_enabled_if_undefined: true)).not_to eq(expected_result) }
end
end
end
diff --git a/spec/tasks/dev_rake_spec.rb b/spec/tasks/dev_rake_spec.rb
index 73b1604aa10..fa093db414f 100644
--- a/spec/tasks/dev_rake_spec.rb
+++ b/spec/tasks/dev_rake_spec.rb
@@ -116,7 +116,7 @@ RSpec.describe 'dev rake tasks' do
allow(configurations).to receive(:configs_for).with(env_name: Rails.env, name: 'ci').and_return(ci_configuration)
end
- subject(:load_task) { run_rake_task('dev:setup_ci_db') }
+ subject(:load_task) { run_rake_task('dev:copy_db:ci') }
let(:ci_configuration) { instance_double(ActiveRecord::DatabaseConfigurations::HashConfig, name: 'ci', database: '__test_db_ci') }
@@ -128,14 +128,14 @@ RSpec.describe 'dev rake tasks' do
expect(Rake::Task['dev:terminate_all_connections']).to receive(:invoke)
- run_rake_task('dev:copy_db:ci')
+ load_task
end
context 'when the database already exists' do
it 'prints out a warning' do
expect(ApplicationRecord.connection).to receive(:create_database).and_raise(ActiveRecord::DatabaseAlreadyExists)
- expect { run_rake_task('dev:copy_db:ci') }.to output(/Database '#{ci_configuration.database}' already exists/).to_stderr
+ expect { load_task }.to output(/Database '#{ci_configuration.database}' already exists/).to_stderr
end
end
end
diff --git a/spec/tasks/gitlab/artifacts/migrate_rake_spec.rb b/spec/tasks/gitlab/artifacts/migrate_rake_spec.rb
index 25a3723fbaa..1c8a1c6a171 100644
--- a/spec/tasks/gitlab/artifacts/migrate_rake_spec.rb
+++ b/spec/tasks/gitlab/artifacts/migrate_rake_spec.rb
@@ -17,7 +17,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject { run_rake_task('gitlab:artifacts:migrate') }
let!(:artifact) { create(:ci_job_artifact, :archive, file_store: store) }
- let!(:job_trace) { create(:ci_job_artifact, :trace, file_store: store) }
+ let!(:job_log) { create(:ci_job_artifact, :trace, file_store: store) }
context 'when local storage is used' do
let(:store) { ObjectStorage::Store::LOCAL }
@@ -29,7 +29,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject
expect(artifact.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
- expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
+ expect(job_log.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
end
end
@@ -38,7 +38,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject
expect(artifact.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
- expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
+ expect(job_log.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
end
end
end
@@ -51,7 +51,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject
expect(artifact.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
- expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
+ expect(job_log.reload.file_store).to eq(ObjectStorage::Store::REMOTE)
end
end
end
@@ -62,7 +62,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject { run_rake_task('gitlab:artifacts:migrate_to_local') }
let!(:artifact) { create(:ci_job_artifact, :archive, file_store: store) }
- let!(:job_trace) { create(:ci_job_artifact, :trace, file_store: store) }
+ let!(:job_log) { create(:ci_job_artifact, :trace, file_store: store) }
context 'when remote storage is used' do
let(:store) { ObjectStorage::Store::REMOTE }
@@ -72,7 +72,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject
expect(artifact.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
- expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
+ expect(job_log.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
end
end
end
@@ -84,7 +84,7 @@ RSpec.describe 'gitlab:artifacts namespace rake task', :silence_stdout do
subject
expect(artifact.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
- expect(job_trace.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
+ expect(job_log.reload.file_store).to eq(ObjectStorage::Store::LOCAL)
end
end
end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 6080948403d..52a0a9a7385 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -377,21 +377,6 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
expect(tar_lines).to include(a_string_matching(repo_name))
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 'no concurrency' do
@@ -405,6 +390,66 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
it_behaves_like 'includes repositories in all repository storages'
end
+
+ context 'REPOSITORIES_STORAGES set' do
+ before do
+ stub_env('REPOSITORIES_STORAGES', default_storage_name)
+ end
+
+ it 'includes repositories in default repository storage', :aggregate_failures 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)
+ 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(
+ %W{tar -tvf #{backup_tar} repositories}
+ )
+
+ tar_lines = tar_contents.lines.grep(/\.bundle/)
+
+ expect(exit_status).to eq(0)
+
+ [
+ "#{project_a.disk_path}/.+/001.bundle",
+ "#{project_a.disk_path}.wiki/.+/001.bundle",
+ "#{project_a.disk_path}.design/.+/001.bundle",
+ "#{project_snippet_a.disk_path}/.+/001.bundle"
+ ].each do |repo_name|
+ expect(tar_lines).to include(a_string_matching(repo_name))
+ end
+
+ [
+ "#{project_b.disk_path}/.+/001.bundle",
+ "#{project_snippet_b.disk_path}/.+/001.bundle"
+ ].each do |repo_name|
+ expect(tar_lines).not_to include(a_string_matching(repo_name))
+ 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
@@ -420,7 +465,7 @@ RSpec.describe 'gitlab:app namespace rake task', :delete do
stub_env('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 2)
expect(::Backup::Repositories).to receive(:new)
- .with(anything, strategy: anything)
+ .with(anything, strategy: anything, storages: [])
.and_call_original
expect(::Backup::GitalyBackup).to receive(:new).with(anything, max_parallelism: 5, storage_parallelism: 2, incremental: false).and_call_original
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 73f3b55e12e..e340d568269 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -697,6 +697,34 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout do
run_rake_task('gitlab:db:migration_testing:sample_background_migrations', '[100]')
end
end
+
+ describe '#sample_batched_background_migrations' do
+ let(:batched_runner) { instance_double(::Gitlab::Database::Migrations::TestBatchedBackgroundRunner) }
+
+ it 'delegates to the migration runner for the main database with a default sample duration' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive(:batched_background_migrations)
+ .with(for_database: 'main').and_return(batched_runner)
+ expect(batched_runner).to receive(:run_jobs).with(for_duration: 30.minutes)
+
+ run_rake_task('gitlab:db:migration_testing:sample_batched_background_migrations')
+ end
+
+ it 'delegates to the migration runner for a specified database with a default sample duration' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive(:batched_background_migrations)
+ .with(for_database: 'ci').and_return(batched_runner)
+ expect(batched_runner).to receive(:run_jobs).with(for_duration: 30.minutes)
+
+ run_rake_task('gitlab:db:migration_testing:sample_batched_background_migrations', '[ci]')
+ end
+
+ it 'delegates to the migration runner for a specified database and sample duration' do
+ expect(::Gitlab::Database::Migrations::Runner).to receive(:batched_background_migrations)
+ .with(for_database: 'ci').and_return(batched_runner)
+ expect(batched_runner).to receive(:run_jobs).with(for_duration: 100.seconds)
+
+ run_rake_task('gitlab:db:migration_testing:sample_batched_background_migrations', '[ci, 100]')
+ end
+ end
end
describe '#execute_batched_migrations' do
diff --git a/spec/tooling/danger/project_helper_spec.rb b/spec/tooling/danger/project_helper_spec.rb
index b3fb592c2e3..78e9c8e9c62 100644
--- a/spec/tooling/danger/project_helper_spec.rb
+++ b/spec/tooling/danger/project_helper_spec.rb
@@ -101,6 +101,15 @@ RSpec.describe Tooling::Danger::ProjectHelper do
'Rakefile' | [:backend]
'FOO_VERSION' | [:backend]
+ 'lib/scripts/bar.rb' | [:backend, :tooling]
+ 'lib/scripts/bar.js' | [:frontend, :tooling]
+ 'scripts/bar.rb' | [:backend, :tooling]
+ 'scripts/bar.js' | [:frontend, :tooling]
+ 'lib/scripts/subdir/bar.rb' | [:backend, :tooling]
+ 'lib/scripts/subdir/bar.js' | [:frontend, :tooling]
+ 'scripts/subdir/bar.rb' | [:backend, :tooling]
+ 'scripts/subdir/bar.js' | [:frontend, :tooling]
+
'Dangerfile' | [:tooling]
'danger/bundle_size/Dangerfile' | [:tooling]
'ee/danger/bundle_size/Dangerfile' | [:tooling]
diff --git a/spec/tooling/danger/specs_spec.rb b/spec/tooling/danger/specs_spec.rb
index b2454960a7b..6c1fbbb903d 100644
--- a/spec/tooling/danger/specs_spec.rb
+++ b/spec/tooling/danger/specs_spec.rb
@@ -118,7 +118,8 @@ RSpec.describe Tooling::Danger::Specs do
"- expect(foo).to match(['bar'])",
"- expect(foo).to match ['bar']",
"- expect(foo).to eq(['bar'])",
- "- expect(foo).to eq ['bar']"
+ "- expect(foo).to eq ['bar']",
+ "+ expect(foo).to eq([])"
] + matching_lines
end
@@ -126,7 +127,7 @@ RSpec.describe Tooling::Danger::Specs do
allow(specs.helper).to receive(:changed_lines).with(filename).and_return(changed_lines)
end
- it 'returns added, modified, and renamed_after files by default' do
+ it 'returns all lines using an array equality matcher' do
expect(specs.added_line_matching_match_with_array(filename)).to match_array(matching_lines)
end
end
diff --git a/app/assets/javascripts/create_cluster/store/cluster_dropdown/getters.js b/spec/tooling/fixtures/find_codeowners/dir0/dir1/dir2/file2
index e69de29bb2d..e69de29bb2d 100644
--- a/app/assets/javascripts/create_cluster/store/cluster_dropdown/getters.js
+++ b/spec/tooling/fixtures/find_codeowners/dir0/dir1/dir2/file2
diff --git a/spec/tooling/fixtures/find_codeowners/dir0/dir1/file1 b/spec/tooling/fixtures/find_codeowners/dir0/dir1/file1
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/spec/tooling/fixtures/find_codeowners/dir0/dir1/file1
diff --git a/spec/tooling/fixtures/find_codeowners/dir0/file0 b/spec/tooling/fixtures/find_codeowners/dir0/file0
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/spec/tooling/fixtures/find_codeowners/dir0/file0
diff --git a/spec/tooling/fixtures/find_codeowners/file b/spec/tooling/fixtures/find_codeowners/file
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/spec/tooling/fixtures/find_codeowners/file
diff --git a/spec/tooling/lib/tooling/find_codeowners_spec.rb b/spec/tooling/lib/tooling/find_codeowners_spec.rb
new file mode 100644
index 00000000000..b29c5f35ec9
--- /dev/null
+++ b/spec/tooling/lib/tooling/find_codeowners_spec.rb
@@ -0,0 +1,199 @@
+# frozen_string_literal: true
+
+require_relative '../../../../tooling/lib/tooling/find_codeowners'
+
+RSpec.describe Tooling::FindCodeowners do
+ let(:subject) { described_class.new }
+ let(:root) { File.expand_path('../../fixtures/find_codeowners', __dir__) }
+
+ describe '#execute' do
+ before do
+ allow(subject).to receive(:load_config).and_return(
+ '[Section name]': {
+ '@group': {
+ allow: {
+ keywords: %w[dir0 file],
+ patterns: ['/%{keyword}/**/*', '/%{keyword}']
+ },
+ deny: {
+ keywords: %w[file0],
+ patterns: ['**/%{keyword}']
+ }
+ }
+ }
+ )
+ end
+
+ it 'prints CODEOWNERS as configured' do
+ expect do
+ Dir.chdir(root) do
+ subject.execute
+ end
+ end.to output(<<~CODEOWNERS).to_stdout
+ [Section name]
+ /dir0/dir1 @group
+ /file @group
+ CODEOWNERS
+ end
+ end
+
+ describe '#load_definitions' do
+ it 'expands the allow and deny list with keywords and patterns' do
+ subject.load_definitions.each do |section, group_defintions|
+ group_defintions.each do |group, definitions|
+ expect(definitions[:allow]).to be_an(Array)
+ expect(definitions[:deny]).to be_an(Array)
+ end
+ end
+ end
+
+ it 'expands the auth group' do
+ auth = subject.load_definitions.dig(
+ :'[Authentication and Authorization]',
+ :'@gitlab-org/manage/authentication-and-authorization')
+
+ expect(auth).to eq(
+ allow: %w[
+ /{,ee/}app/**/*password*{/**/*,}
+ /{,ee/}config/**/*password*{/**/*,}
+ /{,ee/}lib/**/*password*{/**/*,}
+ /{,ee/}app/**/*auth*{/**/*,}
+ /{,ee/}config/**/*auth*{/**/*,}
+ /{,ee/}lib/**/*auth*{/**/*,}
+ /{,ee/}app/**/*token*{/**/*,}
+ /{,ee/}config/**/*token*{/**/*,}
+ /{,ee/}lib/**/*token*{/**/*,}
+ ],
+ deny: %w[
+ **/*author.*{/**/*,}
+ **/*author_*{/**/*,}
+ **/*authored*{/**/*,}
+ **/*authoring*{/**/*,}
+ **/*.png*{/**/*,}
+ **/*.svg*{/**/*,}
+ **/*deploy_token*{/**/*,}
+ **/*runner{,s}_token*{/**/*,}
+ **/*job_token*{/**/*,}
+ **/*autocomplete_tokens*{/**/*,}
+ **/*dast_site_token*{/**/*,}
+ **/*reset_prometheus_token*{/**/*,}
+ **/*reset_registration_token*{/**/*,}
+ **/*runners_registration_token*{/**/*,}
+ **/*terraform_registry_token*{/**/*,}
+ **/*tokenizer*{/**/*,}
+ **/*filtered_search*{/**/*,}
+ **/*/alert_management/*{/**/*,}
+ **/*/analytics/*{/**/*,}
+ **/*/bitbucket/*{/**/*,}
+ **/*/clusters/*{/**/*,}
+ **/*/clusters_list/*{/**/*,}
+ **/*/dast/*{/**/*,}
+ **/*/dast_profiles/*{/**/*,}
+ **/*/dast_site_tokens/*{/**/*,}
+ **/*/dast_site_validation/*{/**/*,}
+ **/*/dependency_proxy/*{/**/*,}
+ **/*/error_tracking/*{/**/*,}
+ **/*/google_api/*{/**/*,}
+ **/*/google_cloud/*{/**/*,}
+ **/*/jira_connect/*{/**/*,}
+ **/*/kubernetes/*{/**/*,}
+ **/*/protected_environments/*{/**/*,}
+ **/*/config/feature_flags/development/jira_connect_*{/**/*,}
+ **/*/config/metrics/*{/**/*,}
+ **/*/app/controllers/groups/dependency_proxy_auth_controller.rb*{/**/*,}
+ **/*/app/finders/ci/auth_job_finder.rb*{/**/*,}
+ **/*/ee/config/metrics/*{/**/*,}
+ **/*/lib/gitlab/conan_token.rb*{/**/*,}
+ ]
+ )
+ end
+ end
+
+ describe '#load_config' do
+ it 'loads the config with symbolized keys' do
+ config = subject.load_config
+
+ expect_hash_keys_to_be_symbols(config)
+ end
+
+ context 'when YAML has safe_load_file' do
+ before do
+ allow(YAML).to receive(:respond_to?).with(:safe_load_file).and_return(true)
+ end
+
+ it 'calls safe_load_file' do
+ expect(YAML).to receive(:safe_load_file)
+
+ subject.load_config
+ end
+ end
+
+ context 'when YAML does not have safe_load_file' do
+ before do
+ allow(YAML).to receive(:respond_to?).with(:safe_load_file).and_return(false)
+ end
+
+ it 'calls load_file' do
+ expect(YAML).to receive(:safe_load)
+
+ subject.load_config
+ end
+ end
+
+ def expect_hash_keys_to_be_symbols(object)
+ if object.is_a?(Hash)
+ object.each do |key, value|
+ expect(key).to be_a(Symbol)
+
+ expect_hash_keys_to_be_symbols(value)
+ end
+ end
+ end
+ end
+
+ describe '#path_matches?' do
+ let(:pattern) { 'pattern' }
+ let(:path) { 'path' }
+
+ it 'passes flags we are expecting to File.fnmatch?' do
+ expected_flags =
+ ::File::FNM_DOTMATCH | ::File::FNM_PATHNAME | ::File::FNM_EXTGLOB
+
+ expect(File).to receive(:fnmatch?).with(pattern, path, expected_flags)
+
+ subject.path_matches?(pattern, path)
+ end
+ end
+
+ describe '#consolidate_paths' do
+ before do
+ allow(subject).to receive(:find_dir_maxdepth_1).and_return(<<~LINES)
+ dir
+ dir/0
+ dir/2
+ dir/3
+ dir/1
+ LINES
+ end
+
+ context 'when the directory has the same number of entries' do
+ let(:input_paths) { %W[dir/0\n dir/1\n dir/2\n dir/3\n] }
+
+ it 'consolidates into the directory' do
+ paths = subject.consolidate_paths(input_paths)
+
+ expect(paths).to eq(["dir\n"])
+ end
+ end
+
+ context 'when the directory has different number of entries' do
+ let(:input_paths) { %W[dir/0\n dir/1\n dir/2\n] }
+
+ it 'returns the original paths' do
+ paths = subject.consolidate_paths(input_paths)
+
+ expect(paths).to eq(input_paths)
+ end
+ end
+ end
+end
diff --git a/spec/tooling/quality/test_level_spec.rb b/spec/tooling/quality/test_level_spec.rb
index c72e90dc713..98034eb4b0a 100644
--- a/spec/tooling/quality/test_level_spec.rb
+++ b/spec/tooling/quality/test_level_spec.rb
@@ -11,13 +11,6 @@ RSpec.describe Quality::TestLevel do
end
end
- context 'when level is geo' do
- it 'returns a pattern' do
- expect(subject.pattern(:geo))
- .to eq("spec/**{,/**/}*_spec.rb")
- end
- end
-
context 'when level is frontend_fixture' do
it 'returns a pattern' do
expect(subject.pattern(:frontend_fixture))
@@ -93,13 +86,6 @@ RSpec.describe Quality::TestLevel do
end
end
- context 'when level is geo' do
- it 'returns a regexp' do
- expect(subject.regexp(:geo))
- .to eq(%r{spec/})
- end
- end
-
context 'when level is frontend_fixture' do
it 'returns a regexp' do
expect(subject.regexp(:frontend_fixture))
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 7d28175d134..503e41eabc9 100644
--- a/spec/views/admin/application_settings/general.html.haml_spec.rb
+++ b/spec/views/admin/application_settings/general.html.haml_spec.rb
@@ -6,13 +6,16 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
let(:app_settings) { build(:application_setting) }
let(:user) { create(:admin) }
+ before do
+ assign(:application_setting, app_settings)
+ allow(view).to receive(:current_user).and_return(user)
+ end
+
describe 'sourcegraph integration' do
let(:sourcegraph_flag) { true }
before do
- assign(:application_setting, app_settings)
allow(Gitlab::Sourcegraph).to receive(:feature_available?).and_return(sourcegraph_flag)
- allow(view).to receive(:current_user).and_return(user)
end
context 'when sourcegraph feature is enabled' do
@@ -35,11 +38,6 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
end
describe 'prompt user about registration features' do
- before do
- assign(:application_setting, app_settings)
- allow(view).to receive(:current_user).and_return(user)
- end
-
context 'when service ping is enabled' do
before do
stub_application_setting(usage_ping_enabled: true)
@@ -60,4 +58,14 @@ RSpec.describe 'admin/application_settings/general.html.haml' do
it_behaves_like 'renders registration features prompt', :application_setting_disabled_repository_size_limit
end
end
+
+ describe 'add license' do
+ before do
+ render
+ end
+
+ it 'does not show the Add License section' do
+ expect(rendered).not_to have_css('#js-add-license-toggle')
+ end
+ end
end
diff --git a/spec/views/devise/shared/_signin_box.html.haml_spec.rb b/spec/views/devise/shared/_signin_box.html.haml_spec.rb
index 8b1af1866dc..e2aa0bb9870 100644
--- a/spec/views/devise/shared/_signin_box.html.haml_spec.rb
+++ b/spec/views/devise/shared/_signin_box.html.haml_spec.rb
@@ -28,6 +28,20 @@ RSpec.describe 'devise/shared/_signin_box' do
end
end
+ describe 'Base form' do
+ before do
+ stub_devise
+ allow(view).to receive(:captcha_enabled?).and_return(false)
+ allow(view).to receive(:captcha_on_login_required?).and_return(false)
+ end
+
+ it 'renders user_login label' do
+ render
+
+ expect(rendered).to have_content(_('Username or email'))
+ end
+ end
+
def stub_devise
allow(view).to receive(:devise_mapping).and_return(Devise.mappings[:user])
allow(view).to receive(:resource).and_return(spy)
diff --git a/spec/views/devise/shared/_signup_box.html.haml_spec.rb b/spec/views/devise/shared/_signup_box.html.haml_spec.rb
index 1f0cd213f7b..b0730e6fc54 100644
--- a/spec/views/devise/shared/_signup_box.html.haml_spec.rb
+++ b/spec/views/devise/shared/_signup_box.html.haml_spec.rb
@@ -3,28 +3,41 @@
require 'spec_helper'
RSpec.describe 'devise/shared/_signup_box' do
+ let(:button_text) { '_button_text_' }
+ let(:terms_path) { '_terms_path_' }
+
+ let(:translation_com) do
+ s_("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}")
+ end
+
+ let(:translation_non_com) do
+ s_("SignUp|By clicking %{button_text}, I agree that I have read and accepted "\
+ "the %{link_start}Terms of Use and Privacy Policy%{link_end}")
+ end
+
before do
stub_devise
allow(view).to receive(:show_omniauth_providers).and_return(false)
allow(view).to receive(:url).and_return('_url_')
- allow(view).to receive(:terms_path).and_return('_terms_path_')
- allow(view).to receive(:button_text).and_return('_button_text_')
+ allow(view).to receive(:terms_path).and_return(terms_path)
+ allow(view).to receive(:button_text).and_return(button_text)
allow(view).to receive(:signup_username_data_attributes).and_return({})
stub_template 'devise/shared/_error_messages.html.haml' => ''
end
+ def text(translation)
+ format(translation,
+ button_text: button_text,
+ link_start: "<a href='#{terms_path}' target='_blank' rel='noreferrer noopener'>",
+ link_end: '</a>')
+ end
+
context 'when terms are enforced' do
before do
allow(Gitlab::CurrentSettings.current_application_settings).to receive(:enforce_terms?).and_return(true)
end
- it 'shows expected text with placeholders' do
- render
-
- expect(rendered).to have_content('By clicking _button_text_')
- expect(rendered).to have_link('Terms of Use and Privacy Policy')
- end
-
context 'when on .com' do
before do
allow(Gitlab).to receive(:com?).and_return(true)
@@ -33,7 +46,7 @@ RSpec.describe 'devise/shared/_signup_box' do
it 'shows expected GitLab text' do
render
- expect(rendered).to have_content('I have read and accepted the GitLab Terms')
+ expect(rendered).to include(text(translation_com))
end
end
@@ -45,7 +58,7 @@ RSpec.describe 'devise/shared/_signup_box' do
it 'shows expected text without GitLab' do
render
- expect(rendered).to have_content('I have read and accepted the Terms')
+ expect(rendered).to include(text(translation_non_com))
end
end
end
@@ -59,7 +72,7 @@ RSpec.describe 'devise/shared/_signup_box' do
it 'shows expected text with placeholders' do
render
- expect(rendered).not_to have_content('By clicking')
+ expect(rendered).not_to include(text(translation_com))
end
end
diff --git a/spec/views/groups/runners/_group_runners.html.haml_spec.rb b/spec/views/groups/runners/_group_runners.html.haml_spec.rb
deleted file mode 100644
index 3a8686ab046..00000000000
--- a/spec/views/groups/runners/_group_runners.html.haml_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'groups/runners/group_runners.html.haml' do
- describe 'render' do
- let_it_be(:user) { create(:user) }
- let_it_be(:group) { create(:group) }
-
- before do
- @group = group
- allow(view).to receive(:current_user).and_return(user)
- allow(view).to receive(:reset_registration_token_group_settings_ci_cd_path).and_return('banana_url')
- end
-
- context 'when group runner registration is allowed' do
- before do
- allow(view).to receive(:can?).with(user, :register_group_runners, group).and_return(true)
- end
-
- it 'enables the Remove group button for a group' do
- render 'groups/runners/group_runners', group: group
-
- expect(rendered).to have_selector '#js-install-runner'
- expect(rendered).not_to have_content 'Please contact an admin to register runners.'
- end
- end
-
- context 'when group runner registration is not allowed' do
- before do
- allow(view).to receive(:can?).with(user, :register_group_runners, group).and_return(false)
- end
-
- it 'does not enable the the Remove group button for a group' do
- render 'groups/runners/group_runners', group: group
-
- expect(rendered).to have_content 'Please contact an admin to register runners.'
- expect(rendered).not_to have_selector '#js-install-runner'
- end
- end
- end
-end
diff --git a/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb b/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb
deleted file mode 100644
index 5438fea85ee..00000000000
--- a/spec/views/groups/runners/_sort_dropdown.html.haml_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'groups/runners/sort_dropdown.html.haml' do
- describe 'render' do
- describe 'when a sort option is not selected' do
- it 'renders a default sort option' do
- render 'groups/runners/sort_dropdown'
-
- expect(rendered).to have_content _('Created date')
- end
- end
-
- describe 'when a sort option is selected' do
- before do
- assign(:sort, 'contacted_asc')
- render 'groups/runners/sort_dropdown'
- end
-
- it 'renders the selected sort option' do
- expect(rendered).to have_content _('Last Contact')
- end
- end
- end
-end
diff --git a/spec/views/help/instance_configuration.html.haml_spec.rb b/spec/views/help/instance_configuration.html.haml_spec.rb
index c4542046a9d..fbf84a5d272 100644
--- a/spec/views/help/instance_configuration.html.haml_spec.rb
+++ b/spec/views/help/instance_configuration.html.haml_spec.rb
@@ -21,6 +21,7 @@ RSpec.describe 'help/instance_configuration' do
expect(rendered).to have_link(nil, href: '#size-limits')
expect(rendered).to have_link(nil, href: '#package-registry')
expect(rendered).to have_link(nil, href: '#rate-limits')
+ expect(rendered).to have_link(nil, href: '#ci-cd-limits')
end
it 'has several sections' do
@@ -31,6 +32,7 @@ RSpec.describe 'help/instance_configuration' do
expect(rendered).to have_css('h2#size-limits')
expect(rendered).to have_css('h2#package-registry')
expect(rendered).to have_css('h2#rate-limits')
+ expect(rendered).to have_css('h2#ci-cd-limits')
end
end
end
diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
index 8c9d1b32671..428e9cc8490 100644
--- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb
@@ -101,7 +101,7 @@ RSpec.describe 'layouts/nav/sidebar/_group' do
end
end
- describe 'Kubernetes menu' do
+ describe 'Kubernetes menu', :request_store do
it 'has a link to the group cluster list path' do
render
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 22e925e22ae..3943355bffd 100644
--- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
+++ b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
@@ -537,24 +537,6 @@ RSpec.describe 'layouts/nav/sidebar/_project' do
end
describe 'Infrastructure' do
- describe 'Serverless platform' do
- it 'has a link to the serverless page' do
- render
-
- expect(rendered).to have_link('Serverless platform', href: project_serverless_functions_path(project))
- end
-
- describe 'when the user does not have access' do
- let(:user) { nil }
-
- it 'does not have a link to the serverless page' do
- render
-
- expect(rendered).not_to have_link('Serverless platform')
- end
- end
- end
-
describe 'Terraform' do
it 'has a link to the terraform page' do
render
diff --git a/spec/views/profiles/keys/_form.html.haml_spec.rb b/spec/views/profiles/keys/_form.html.haml_spec.rb
index ba8394178d9..c807512a11a 100644
--- a/spec/views/profiles/keys/_form.html.haml_spec.rb
+++ b/spec/views/profiles/keys/_form.html.haml_spec.rb
@@ -15,8 +15,6 @@ RSpec.describe 'profiles/keys/_form.html.haml' do
context 'when the form partial is used' do
before do
- allow(view).to receive(:ssh_key_expires_field_description).and_return('Key can still be used after expiration.')
-
render
end
@@ -37,7 +35,7 @@ RSpec.describe 'profiles/keys/_form.html.haml' do
it 'has the expires at field', :aggregate_failures do
expect(rendered).to have_field('Expiration date', type: 'date')
expect(page.find_field('Expiration date')['min']).to eq(l(1.day.from_now, format: "%Y-%m-%d"))
- expect(rendered).to have_text('Key can still be used after expiration.')
+ expect(rendered).to have_text('Key becomes invalid on this date')
end
it 'has the validation warning', :aggregate_failures do
diff --git a/spec/views/profiles/keys/_key.html.haml_spec.rb b/spec/views/profiles/keys/_key.html.haml_spec.rb
index ed8026d2453..1040541332d 100644
--- a/spec/views/profiles/keys/_key.html.haml_spec.rb
+++ b/spec/views/profiles/keys/_key.html.haml_spec.rb
@@ -59,11 +59,7 @@ RSpec.describe 'profiles/keys/_key.html.haml' do
end
context 'when the key has expired' do
- let_it_be(:key) do
- create(:personal_key,
- user: user,
- expires_at: 2.days.ago)
- end
+ let_it_be(:key) { create(:personal_key, :expired, user: user) }
it 'renders "Expired:" as the expiration date label' do
render
@@ -91,8 +87,6 @@ RSpec.describe 'profiles/keys/_key.html.haml' do
where(:valid, :expiry, :result) do
false | 2.days.from_now | 'Key type is forbidden. Must be DSA, ECDSA, ED25519, ECDSA_SK, or ED25519_SK'
- false | 2.days.ago | 'Key type is forbidden. Must be DSA, ECDSA, ED25519, ECDSA_SK, or ED25519_SK'
- true | 2.days.ago | 'Key usable beyond expiration date.'
true | 2.days.from_now | ''
end
diff --git a/spec/views/projects/clusters/clusters/gcp/_form.html.haml_spec.rb b/spec/views/projects/clusters/clusters/gcp/_form.html.haml_spec.rb
deleted file mode 100644
index 5120998ded6..00000000000
--- a/spec/views/projects/clusters/clusters/gcp/_form.html.haml_spec.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe 'clusters/clusters/gcp/_form' do
- let(:admin) { create(:admin) }
- let(:environment) { create(:environment) }
- let(:gcp_cluster) { create(:cluster, :provided_by_gcp) }
- let(:clusterable) { ClusterablePresenter.fabricate(environment.project, current_user: admin) }
-
- before do
- assign(:environment, environment)
- assign(:gcp_cluster, gcp_cluster)
- allow(view).to receive(:clusterable).and_return(clusterable)
- allow(view).to receive(:url_for).and_return('#')
- allow(view).to receive(:token_in_session).and_return('')
- end
-
- context 'with all feature flags enabled' do
- it 'has a cloud run checkbox' do
- render
-
- expect(rendered).to have_selector("input[id='cluster_provider_gcp_attributes_cloud_run']")
- end
- end
-end
diff --git a/spec/views/projects/issues/show.html.haml_spec.rb b/spec/views/projects/issues/show.html.haml_spec.rb
index b2d208f038a..3f1496a24ce 100644
--- a/spec/views/projects/issues/show.html.haml_spec.rb
+++ b/spec/views/projects/issues/show.html.haml_spec.rb
@@ -26,14 +26,14 @@ RSpec.describe 'projects/issues/show' do
it 'shows "Closed (moved)" if an issue has been moved and closed' do
render
- expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed (moved)')
+ expect(rendered).to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed (moved)')
end
it 'shows "Closed (moved)" if an issue has been moved and discussion is locked' do
allow(issue).to receive(:discussion_locked).and_return(true)
render
- expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed (moved)')
+ expect(rendered).to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed (moved)')
end
it 'links "moved" to the new issue the original issue was moved to' do
@@ -47,7 +47,7 @@ RSpec.describe 'projects/issues/show' do
render
- expect(rendered).not_to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed (moved)')
+ expect(rendered).not_to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed (moved)')
end
end
@@ -75,7 +75,7 @@ RSpec.describe 'projects/issues/show' do
it 'shows "Closed (duplicated)" if an issue has been duplicated' do
render
- expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed (duplicated)')
+ expect(rendered).to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed (duplicated)')
end
it 'links "duplicated" to the new issue the original issue was duplicated to' do
@@ -97,14 +97,14 @@ RSpec.describe 'projects/issues/show' do
it 'shows "Closed" if an issue has not been moved or duplicated' do
render
- expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed')
+ expect(rendered).to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed')
end
it 'shows "Closed" if discussion is locked' do
allow(issue).to receive(:discussion_locked).and_return(true)
render
- expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed')
+ expect(rendered).to have_selector('.issuable-status-badge-closed:not(.hidden)', text: 'Closed')
end
end
@@ -117,14 +117,14 @@ RSpec.describe 'projects/issues/show' do
it 'shows "Open" if an issue has been moved' do
render
- expect(rendered).to have_selector('.status-box-open:not(.hidden)', text: 'Open')
+ expect(rendered).to have_selector('.issuable-status-badge-open:not(.hidden)', text: 'Open')
end
it 'shows "Open" if discussion is locked' do
allow(issue).to receive(:discussion_locked).and_return(true)
render
- expect(rendered).to have_selector('.status-box-open:not(.hidden)', text: 'Open')
+ expect(rendered).to have_selector('.issuable-status-badge-open:not(.hidden)', text: 'Open')
end
end
diff --git a/spec/views/projects/merge_requests/show.html.haml_spec.rb b/spec/views/projects/merge_requests/show.html.haml_spec.rb
index 6ffd0936003..86a4b25f746 100644
--- a/spec/views/projects/merge_requests/show.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/show.html.haml_spec.rb
@@ -16,7 +16,6 @@ RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do
render
expect(rendered).to have_css('a', visible: true, text: 'Mark as draft')
- expect(rendered).to have_css('a', visible: false, text: 'Reopen')
expect(rendered).to have_css('a', visible: true, text: 'Close')
end
end
@@ -31,7 +30,6 @@ RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do
expect(rendered).not_to have_css('a', visible: true, text: 'Mark as draft')
expect(rendered).to have_css('a', visible: true, text: 'Reopen')
- expect(rendered).to have_css('a', visible: false, text: 'Close')
end
context 'when source project does not exist' do
@@ -40,8 +38,7 @@ RSpec.describe 'projects/merge_requests/show.html.haml', :aggregate_failures do
render
- expect(rendered).to have_css('a', visible: false, text: 'Reopen')
- expect(rendered).to have_css('a', visible: false, text: 'Close')
+ expect(rendered).not_to have_css('a', visible: false, text: 'Reopen')
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 7186a5f1766..0446e1a7fc8 100644
--- a/spec/views/projects/project_members/index.html.haml_spec.rb
+++ b/spec/views/projects/project_members/index.html.haml_spec.rb
@@ -4,8 +4,7 @@ require 'spec_helper'
RSpec.describe 'projects/project_members/index', :aggregate_failures do
let_it_be(:user) { create(:user) }
- let_it_be(:source) { create(:project, :empty_repo) }
- let_it_be(:project) { ProjectPresenter.new(source, current_user: user) }
+ let_it_be(:project) { create(:project, :empty_repo, :with_namespace_settings).present(current_user: user) }
before do
allow(view).to receive(:project_members_app_data_json).and_return({})
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 c0ec86a41a7..8853b34074a 100644
--- a/spec/views/projects/settings/operations/show.html.haml_spec.rb
+++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb
@@ -52,30 +52,6 @@ RSpec.describe 'projects/settings/operations/show' do
end
end
- describe 'Operations > Prometheus' do
- context 'when settings_operations_prometheus_service flag is enabled' do
- it 'renders the Operations Settings page' do
- render
-
- expect(rendered).to have_content _('Prometheus')
- expect(rendered).to have_content _('Link Prometheus monitoring to GitLab.')
- expect(rendered).to have_content _('To use a Prometheus installed on a cluster, deactivate the manual configuration.')
- end
- end
-
- context 'when settings_operations_prometheus_service is disabled' do
- before do
- stub_feature_flags(settings_operations_prometheus_service: false)
- end
-
- it 'renders the Operations Settings page' do
- render
-
- expect(rendered).not_to have_content _('Auto configuration settings are used unless you override their values here.')
- end
- end
- end
-
describe 'Operations > Tracing' do
context 'Settings page ' do
it 'renders the Tracing Settings page' do
diff --git a/spec/views/shared/access_tokens/_table.html.haml_spec.rb b/spec/views/shared/access_tokens/_table.html.haml_spec.rb
index fca2fc3183c..74de9e12d04 100644
--- a/spec/views/shared/access_tokens/_table.html.haml_spec.rb
+++ b/spec/views/shared/access_tokens/_table.html.haml_spec.rb
@@ -6,7 +6,6 @@ RSpec.describe 'shared/access_tokens/_table.html.haml' do
let(:type) { 'token' }
let(:type_plural) { 'tokens' }
let(:empty_message) { nil }
- let(:token_expiry_enforced?) { false }
let(:impersonation) { false }
let_it_be(:user) { create(:user) }
@@ -14,12 +13,6 @@ RSpec.describe 'shared/access_tokens/_table.html.haml' do
let_it_be(:resource) { false }
before do
- stub_licensed_features(enforce_personal_access_token_expiration: true)
- allow(Gitlab::CurrentSettings).to receive(:enforce_pat_expiration?).and_return(false)
-
- allow(view).to receive(:personal_access_token_expiration_enforced?).and_return(token_expiry_enforced?)
- allow(view).to receive(:show_profile_token_expiry_notification?).and_return(true)
-
if resource
resource.add_maintainer(user)
end
@@ -51,22 +44,6 @@ RSpec.describe 'shared/access_tokens/_table.html.haml' do
expect(rendered).not_to have_content 'To see all the user\'s personal access tokens you must impersonate them first.'
expect(rendered).not_to have_selector 'th', text: 'Role'
end
-
- context 'if token expiration is enforced' do
- let(:token_expiry_enforced?) { true }
-
- it 'does not show the subtext' do
- expect(rendered).not_to have_content 'Personal access tokens are not revoked upon expiration.'
- end
- end
-
- context 'if token expiration is not enforced' do
- let(:token_expiry_enforced?) { false }
-
- it 'does show the subtext' do
- expect(rendered).to have_content 'Personal access tokens are not revoked upon expiration.'
- end
- end
end
context 'if impersonation' do
@@ -124,16 +101,16 @@ RSpec.describe 'shared/access_tokens/_table.html.haml' do
context 'with tokens' do
let_it_be(:tokens) do
[
- create(:personal_access_token, user: user, name: 'Access token', last_used_at: 1.day.ago, expires_at: nil),
- create(:personal_access_token, user: user, expires_at: 5.days.ago),
- create(:personal_access_token, user: user, expires_at: Time.now),
- create(:personal_access_token, user: user, expires_at: 5.days.from_now, scopes: [:read_api, :read_user])
+ create(:personal_access_token, user: user, name: 'Access token', last_used_at: 4.days.from_now, expires_at: nil, scopes: [:read_api, :read_user]),
+ create(:personal_access_token, user: user, expires_at: 1.day.from_now, scopes: [:read_api, :read_user])
]
end
+ let_it_be(:expired_token) { build(:personal_access_token, name: "Expired token", expires_at: 2.days.ago).tap { |t| t.save!(validate: false) } }
+
it 'has the correct content', :aggregate_failures do
# Heading content
- expect(rendered).to have_content 'Active tokens (4)'
+ expect(rendered).to have_content 'Active tokens (2)'
# Table headers
expect(rendered).to have_selector 'th', text: 'Token name'
@@ -144,17 +121,15 @@ RSpec.describe 'shared/access_tokens/_table.html.haml' do
# Table contents
expect(rendered).to have_content 'Access token'
+ expect(rendered).not_to have_content 'Expired token'
expect(rendered).to have_content 'read_api, read_user'
expect(rendered).to have_content 'no scopes selected'
expect(rendered).to have_content Time.now.to_date.to_s(:medium)
- expect(rendered).to have_content l(1.day.ago, format: "%b %d, %Y")
-
- # Expiry
- expect(rendered).to have_content 'Expired', count: 2
+ expect(rendered).to have_content l(4.days.from_now, format: "%b %d, %Y")
# Revoke buttons
expect(rendered).to have_link 'Revoke', href: 'path/', class: 'btn-danger-secondary', count: 1
- expect(rendered).to have_link 'Revoke', href: 'path/', count: 4
+ expect(rendered).to have_link 'Revoke', href: 'path/', count: 2
end
context 'without the last used time' do
diff --git a/spec/views/shared/notes/_form.html.haml_spec.rb b/spec/views/shared/notes/_form.html.haml_spec.rb
index b7bad4c5d78..ccf1e08b7e7 100644
--- a/spec/views/shared/notes/_form.html.haml_spec.rb
+++ b/spec/views/shared/notes/_form.html.haml_spec.rb
@@ -23,7 +23,7 @@ RSpec.describe 'shared/notes/_form' do
let(:note) { build(:"note_on_#{noteable}", project: project) }
it 'says that markdown and quick actions are supported' do
- expect(rendered).to have_content('Markdown and quick actions are supported')
+ expect(rendered).to have_content('Supports Markdown. For quick actions, type /.')
end
end
end
diff --git a/spec/workers/authorized_project_update/project_create_worker_spec.rb b/spec/workers/authorized_project_update/project_create_worker_spec.rb
deleted file mode 100644
index 5226ab30de7..00000000000
--- a/spec/workers/authorized_project_update/project_create_worker_spec.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe AuthorizedProjectUpdate::ProjectCreateWorker do
- let_it_be(:group) { create(:group, :private) }
- let_it_be(:group_project) { create(:project, group: group) }
- let_it_be(:group_user) { create(:user) }
-
- let(:access_level) { Gitlab::Access::MAINTAINER }
-
- subject(:worker) { described_class.new }
-
- it 'calls AuthorizedProjectUpdate::ProjectCreateService' do
- expect_next_instance_of(AuthorizedProjectUpdate::ProjectCreateService) do |service|
- expect(service).to(receive(:execute))
- end
-
- worker.perform(group_project.id)
- end
-
- it 'returns ServiceResponse.success' do
- result = worker.perform(group_project.id)
-
- expect(result.success?).to be_truthy
- end
-
- context 'idempotence' do
- before do
- create(:group_member, access_level: access_level, group: group, user: group_user)
- ProjectAuthorization.delete_all
- end
-
- include_examples 'an idempotent worker' do
- let(:job_args) { group_project.id }
-
- it 'creates project authorization' do
- subject
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: group_user.id,
- access_level: access_level)
-
- expect(project_authorization).to exist
- expect(ProjectAuthorization.count).to eq(1)
- end
- end
- end
-end
diff --git a/spec/workers/authorized_project_update/project_group_link_create_worker_spec.rb b/spec/workers/authorized_project_update/project_group_link_create_worker_spec.rb
deleted file mode 100644
index 7c4ad4ce641..00000000000
--- a/spec/workers/authorized_project_update/project_group_link_create_worker_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe AuthorizedProjectUpdate::ProjectGroupLinkCreateWorker do
- let_it_be(:group) { create(:group, :private) }
- let_it_be(:group_project) { create(:project, group: group) }
- let_it_be(:shared_with_group) { create(:group, :private) }
- let_it_be(:user) { create(:user) }
-
- let(:access_level) { Gitlab::Access::MAINTAINER }
-
- subject(:worker) { described_class.new }
-
- it 'calls AuthorizedProjectUpdate::ProjectCreateService' do
- expect_next_instance_of(AuthorizedProjectUpdate::ProjectGroupLinkCreateService) do |service|
- expect(service).to(receive(:execute))
- end
-
- worker.perform(group_project.id, shared_with_group.id)
- end
-
- it 'returns ServiceResponse.success' do
- result = worker.perform(group_project.id, shared_with_group.id)
-
- expect(result.success?).to be_truthy
- end
-
- context 'idempotence' do
- before do
- create(:group_member, group: shared_with_group, user: user, access_level: access_level)
- create(:project_group_link, project: group_project, group: shared_with_group)
- ProjectAuthorization.delete_all
- end
-
- include_examples 'an idempotent worker' do
- let(:job_args) { [group_project.id, shared_with_group.id] }
-
- it 'creates project authorization' do
- subject
-
- project_authorization = ProjectAuthorization.where(
- project_id: group_project.id,
- user_id: user.id,
- access_level: access_level)
-
- expect(project_authorization).to exist
- expect(ProjectAuthorization.count).to eq(1)
- end
- end
- end
-end
diff --git a/spec/workers/build_finished_worker_spec.rb b/spec/workers/build_finished_worker_spec.rb
index 2ca7837066b..b4b986662d2 100644
--- a/spec/workers/build_finished_worker_spec.rb
+++ b/spec/workers/build_finished_worker_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe BuildFinishedWorker do
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)
+ expect(Ci::Build).to receive(:find_by).with({ id: build.id }).and_return(build)
end
it 'calculates coverage and calls hooks', :aggregate_failures do
diff --git a/spec/workers/bulk_imports/pipeline_worker_spec.rb b/spec/workers/bulk_imports/pipeline_worker_spec.rb
index 3578fec5bc0..209ae8862b6 100644
--- a/spec/workers/bulk_imports/pipeline_worker_spec.rb
+++ b/spec/workers/bulk_imports/pipeline_worker_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe BulkImports::PipelineWorker do
def run; end
- def self.ndjson_pipeline?
+ def self.file_extraction_pipeline?
false
end
end
@@ -222,14 +222,14 @@ RSpec.describe BulkImports::PipelineWorker do
end
end
- context 'when ndjson pipeline' do
- let(:ndjson_pipeline) do
+ context 'when file extraction pipeline' do
+ let(:file_extraction_pipeline) do
Class.new do
def initialize(_); end
def run; end
- def self.ndjson_pipeline?
+ def self.file_extraction_pipeline?
true
end
@@ -249,11 +249,11 @@ RSpec.describe BulkImports::PipelineWorker do
end
before do
- stub_const('NdjsonPipeline', ndjson_pipeline)
+ stub_const('NdjsonPipeline', file_extraction_pipeline)
allow_next_instance_of(BulkImports::Groups::Stage) do |instance|
allow(instance).to receive(:pipelines)
- .and_return([[0, ndjson_pipeline]])
+ .and_return([[0, file_extraction_pipeline]])
end
end
@@ -278,7 +278,7 @@ RSpec.describe BulkImports::PipelineWorker do
expect(described_class)
.to receive(:perform_in)
.with(
- described_class::NDJSON_PIPELINE_PERFORM_DELAY,
+ described_class::FILE_EXTRACTION_PIPELINE_PERFORM_DELAY,
pipeline_tracker.id,
pipeline_tracker.stage,
entity.id
diff --git a/spec/workers/ci/build_finished_worker_spec.rb b/spec/workers/ci/build_finished_worker_spec.rb
index 839723ac2fc..e9e7a057f98 100644
--- a/spec/workers/ci/build_finished_worker_spec.rb
+++ b/spec/workers/ci/build_finished_worker_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe Ci::BuildFinishedWorker do
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)
+ expect(Ci::Build).to receive(:find_by).with({ id: build.id }).and_return(build)
end
it 'calculates coverage and calls hooks', :aggregate_failures do
diff --git a/spec/workers/cleanup_container_repository_worker_spec.rb b/spec/workers/cleanup_container_repository_worker_spec.rb
index 6723ea2049d..edb815f426d 100644
--- a/spec/workers/cleanup_container_repository_worker_spec.rb
+++ b/spec/workers/cleanup_container_repository_worker_spec.rb
@@ -13,11 +13,11 @@ RSpec.describe CleanupContainerRepositoryWorker, :clean_gitlab_redis_shared_stat
let(:service) { instance_double(Projects::ContainerRepository::CleanupTagsService) }
context 'bulk delete api' do
- let(:params) { { key: 'value', 'container_expiration_policy' => false } }
+ let(:params) { { key: 'value' } }
it 'executes the destroy service' do
expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(repository, user, params.merge('container_expiration_policy' => false))
+ .with(repository, user, params)
.and_return(service)
expect(service).to receive(:execute)
@@ -36,40 +36,5 @@ RSpec.describe CleanupContainerRepositoryWorker, :clean_gitlab_redis_shared_stat
end.not_to raise_error
end
end
-
- context 'container expiration policy' do
- let(:params) { { key: 'value', 'container_expiration_policy' => true } }
-
- before do
- allow(ContainerRepository)
- .to receive(:find_by_id).with(repository.id).and_return(repository)
- end
-
- it 'executes the destroy service' do
- expect(repository).to receive(:start_expiration_policy!).and_call_original
- expect(repository).to receive(:reset_expiration_policy_started_at!).and_call_original
- expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(repository, nil, params.merge('container_expiration_policy' => true))
- .and_return(service)
-
- expect(service).to receive(:execute).and_return(status: :success)
-
- subject.perform(nil, repository.id, params)
- expect(repository.reload.expiration_policy_started_at).to be_nil
- end
-
- it "doesn't reset the expiration policy started at if the destroy service returns an error" do
- expect(repository).to receive(:start_expiration_policy!).and_call_original
- expect(repository).not_to receive(:reset_expiration_policy_started_at!)
- expect(Projects::ContainerRepository::CleanupTagsService).to receive(:new)
- .with(repository, nil, params.merge('container_expiration_policy' => true))
- .and_return(service)
-
- expect(service).to receive(:execute).and_return(status: :error, message: 'timeout while deleting tags')
-
- subject.perform(nil, repository.id, params)
- expect(repository.reload.expiration_policy_started_at).not_to be_nil
- end
- end
end
end
diff --git a/spec/workers/clusters/applications/activate_service_worker_spec.rb b/spec/workers/clusters/applications/activate_service_worker_spec.rb
index 019bfe7a750..d13ff76613c 100644
--- a/spec/workers/clusters/applications/activate_service_worker_spec.rb
+++ b/spec/workers/clusters/applications/activate_service_worker_spec.rb
@@ -46,7 +46,7 @@ RSpec.describe Clusters::Applications::ActivateServiceWorker, '#perform' do
context 'cluster does not exist' do
it 'does not raise Record Not Found error' do
- expect { described_class.new.perform(0, 'ignored in this context') }.not_to raise_error(ActiveRecord::RecordNotFound)
+ expect { described_class.new.perform(0, 'ignored in this context') }.not_to raise_error
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 b5252294b27..3cd82b8bf4d 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -83,19 +83,23 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter, :aggregate_failures do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_identifiers: github_identifiers,
- message: 'starting importer',
- project_id: project.id,
- importer: 'klass_name'
+ {
+ github_identifiers: github_identifiers,
+ message: 'starting importer',
+ project_id: project.id,
+ importer: 'klass_name'
+ }
)
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_identifiers: github_identifiers,
- message: 'importer finished',
- project_id: project.id,
- importer: 'klass_name'
+ {
+ github_identifiers: github_identifiers,
+ message: 'importer finished',
+ project_id: project.id,
+ importer: 'klass_name'
+ }
)
worker.import(project, client, { 'number' => 10, 'github_id' => 1 })
@@ -120,10 +124,12 @@ RSpec.describe Gitlab::GithubImport::ObjectImporter, :aggregate_failures do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- github_identifiers: github_identifiers,
- message: 'starting importer',
- project_id: project.id,
- importer: 'klass_name'
+ {
+ github_identifiers: github_identifiers,
+ message: 'starting importer',
+ project_id: project.id,
+ importer: 'klass_name'
+ }
)
expect(Gitlab::Import::ImportFailureService)
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 aeb86f5aa8c..1e088929f66 100644
--- a/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
@@ -38,17 +38,21 @@ RSpec.describe Gitlab::GithubImport::StageMethods do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting stage',
- project_id: project.id,
- import_stage: 'DummyStage'
+ {
+ message: 'starting stage',
+ project_id: project.id,
+ import_stage: 'DummyStage'
+ }
)
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'stage finished',
- project_id: project.id,
- import_stage: 'DummyStage'
+ {
+ message: 'stage finished',
+ project_id: project.id,
+ import_stage: 'DummyStage'
+ }
)
worker.perform(project.id)
@@ -70,18 +74,22 @@ RSpec.describe Gitlab::GithubImport::StageMethods do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting stage',
- project_id: project.id,
- import_stage: 'DummyStage'
+ {
+ message: 'starting stage',
+ project_id: project.id,
+ import_stage: 'DummyStage'
+ }
)
expect(Gitlab::Import::ImportFailureService)
.to receive(:track)
.with(
- project_id: project.id,
- exception: exception,
- error_source: 'DummyStage',
- fail_import: false
+ {
+ project_id: project.id,
+ exception: exception,
+ error_source: 'DummyStage',
+ fail_import: false
+ }
).and_call_original
expect { worker.perform(project.id) }
@@ -125,9 +133,11 @@ RSpec.describe Gitlab::GithubImport::StageMethods do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'starting stage',
- project_id: project.id,
- import_stage: 'DummyStage'
+ {
+ message: 'starting stage',
+ project_id: project.id,
+ import_stage: 'DummyStage'
+ }
)
expect(Gitlab::Import::ImportFailureService)
diff --git a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
index cbffb8f3870..3cb83a7a5d7 100644
--- a/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
+++ b/spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb
@@ -524,13 +524,5 @@ RSpec.describe ContainerExpirationPolicies::CleanupContainerRepositoryWorker do
end
it { is_expected.to eq(capacity) }
-
- context 'with feature flag disabled' do
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
- end
-
- it { is_expected.to eq(0) }
- end
end
end
diff --git a/spec/workers/container_expiration_policy_worker_spec.rb b/spec/workers/container_expiration_policy_worker_spec.rb
index 2cfb613865d..ef6266aeba3 100644
--- a/spec/workers/container_expiration_policy_worker_spec.rb
+++ b/spec/workers/container_expiration_policy_worker_spec.rb
@@ -11,15 +11,13 @@ RSpec.describe ContainerExpirationPolicyWorker do
describe '#perform' do
subject { worker.perform }
- shared_examples 'not executing any policy' do
- it 'does not run any policy' do
- expect(ContainerExpirationPolicyService).not_to receive(:new)
+ context 'process cleanups' do
+ it 'calls the limited capacity worker' do
+ expect(ContainerExpirationPolicies::CleanupContainerRepositoryWorker).to receive(:perform_with_capacity)
subject
end
- end
- shared_examples 'handling a taken exclusive lease' do
context 'with exclusive lease taken' do
before do
stub_exclusive_lease_taken(worker.lease_key, timeout: 5.hours)
@@ -34,82 +32,6 @@ RSpec.describe ContainerExpirationPolicyWorker do
end
end
- context 'with throttling enabled' do
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: true)
- end
-
- it 'calls the limited capacity worker' do
- expect(ContainerExpirationPolicies::CleanupContainerRepositoryWorker).to receive(:perform_with_capacity)
-
- subject
- end
-
- it_behaves_like 'handling a taken exclusive lease'
- end
-
- context 'with throttling disabled' do
- before do
- stub_feature_flags(container_registry_expiration_policies_throttling: false)
- end
-
- context 'with no container expiration policies' do
- it_behaves_like 'not executing any policy'
- end
-
- context 'with container expiration policies' do
- let_it_be(:container_expiration_policy, reload: true) { create(:container_expiration_policy, :runnable) }
- let_it_be(:container_repository) { create(:container_repository, project: container_expiration_policy.project) }
-
- context 'a valid policy' do
- it 'runs the policy' do
- expect(ContainerExpirationPolicyService)
- .to receive(:new).with(container_expiration_policy.project, nil).and_call_original
- expect(CleanupContainerRepositoryWorker).to receive(:perform_async).once.and_call_original
-
- expect { subject }.not_to raise_error
- end
- end
-
- context 'a disabled policy' do
- before do
- container_expiration_policy.disable!
- end
-
- it_behaves_like 'not executing any policy'
- end
-
- context 'a policy that is not due for a run' do
- before do
- container_expiration_policy.update_column(:next_run_at, 2.minutes.from_now)
- end
-
- it_behaves_like 'not executing any policy'
- end
-
- context 'a policy linked to no container repository' do
- before do
- container_expiration_policy.container_repositories.delete_all
- end
-
- it_behaves_like 'not executing any policy'
- end
-
- context 'an invalid policy' do
- before do
- container_expiration_policy.update_column(:name_regex, '*production')
- end
-
- it 'disables the policy and tracks an error' do
- expect(ContainerExpirationPolicyService).not_to receive(:new).with(container_expiration_policy, nil)
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(instance_of(described_class::InvalidPolicyError), container_expiration_policy_id: container_expiration_policy.id)
-
- expect { subject }.to change { container_expiration_policy.reload.enabled }.from(true).to(false)
- end
- end
- end
- end
-
context 'process stale ongoing cleanups' do
let_it_be(:stuck_cleanup) { create(:container_repository, :cleanup_ongoing, expiration_policy_started_at: 1.day.ago) }
let_it_be(:container_repository1) { create(:container_repository, :cleanup_scheduled) }
diff --git a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
index 81fa28dc603..a57a9e3b2e8 100644
--- a/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
+++ b/spec/workers/container_registry/migration/enqueuer_worker_spec.rb
@@ -23,273 +23,669 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
shared_examples 'no action' do
it 'does not queue or change any repositories' do
+ expect(worker).not_to receive(:handle_next_migration)
+ expect(worker).not_to receive(:handle_aborted_migration)
+
subject
expect(container_repository.reload).to be_default
end
end
- shared_examples 're-enqueuing based on capacity' do |capacity_limit: 4|
- context 'below capacity' do
+ context 'with container_registry_migration_phase2_enqueuer_loop disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_enqueuer_loop: false)
+ end
+
+ shared_examples 're-enqueuing based on capacity' do |capacity_limit: 4|
+ context 'below capacity' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:capacity).and_return(capacity_limit)
+ end
+
+ it 're-enqueues the worker' do
+ expect(described_class).to receive(:perform_async)
+ expect(described_class).to receive(:perform_in).with(7.seconds)
+
+ subject
+ end
+
+ context 'enqueue_twice feature flag disabled' do
+ before do
+ stub_feature_flags(container_registry_migration_phase2_enqueue_twice: false)
+ end
+
+ it 'only enqueues the worker once' do
+ expect(described_class).to receive(:perform_async)
+ expect(described_class).not_to receive(:perform_in)
+
+ subject
+ end
+ end
+ end
+
+ context 'above capacity' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:capacity).and_return(-1)
+ end
+
+ it 'does not re-enqueue the worker' do
+ expect(described_class).not_to receive(:perform_async)
+ expect(described_class).not_to receive(:perform_in).with(7.seconds)
+
+ subject
+ end
+ end
+ end
+
+ context 'with qualified repository' do
before do
- allow(ContainerRegistry::Migration).to receive(:capacity).and_return(capacity_limit)
+ allow_worker(on: :next_repository) do |repository|
+ allow(repository).to receive(:migration_pre_import).and_return(:ok)
+ end
end
- it 're-enqueues the worker' do
- expect(described_class).to receive(:perform_async)
+ shared_examples 'starting the next import' do
+ it 'starts the pre-import for the next qualified repository' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'pre_importing'
+ )
- subject
+ expect { subject }.to make_queries_matching(/LIMIT 2/)
+
+ expect(container_repository.reload).to be_pre_importing
+ end
+ end
+
+ it_behaves_like 'starting the next import'
+
+ context 'when the new pre-import maxes out the capacity' do
+ before do
+ # set capacity to 10
+ stub_feature_flags(
+ container_registry_migration_phase2_capacity_25: false
+ )
+
+ # Plus 2 created above gives 9 importing repositories
+ create_list(:container_repository, 7, :importing)
+ end
+
+ it 'does not re-enqueue the worker' do
+ expect(described_class).not_to receive(:perform_async)
+ expect(described_class).not_to receive(:perform_in)
+
+ subject
+ end
+ end
+
+ it_behaves_like 're-enqueuing based on capacity'
+
+ context 'max tag count is 0' do
+ before do
+ stub_application_setting(container_registry_import_max_tags_count: 0)
+ # Add 8 tags to the next repository
+ stub_container_registry_tags(
+ repository: container_repository.path, tags: %w(a b c d e f g h), with_manifest: true
+ )
+ end
+
+ it_behaves_like 'starting the next import'
+ end
+ end
+
+ context 'migrations are disabled' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enabled?).and_return(false)
+ end
+
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(migration_enabled: false)
+ end
end
end
context 'above capacity' do
before do
- allow(ContainerRegistry::Migration).to receive(:capacity).and_return(-1)
+ create(:container_repository, :importing)
+ create(:container_repository, :importing)
+ allow(ContainerRegistry::Migration).to receive(:capacity).and_return(1)
+ end
+
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(below_capacity: false, max_capacity_setting: 1)
+ end
end
it 'does not re-enqueue the worker' do
- expect(described_class).not_to receive(:perform_async)
+ expect(ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_async)
+ expect(ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_in)
subject
end
end
- end
- context 'with qualified repository' do
- before do
- method = worker.method(:next_repository)
- allow(worker).to receive(:next_repository) do
- next_qualified_repository = method.call
- allow(next_qualified_repository).to receive(:migration_pre_import).and_return(:ok)
- next_qualified_repository
+ context 'too soon before previous completed import step' do
+ where(:state, :timestamp) do
+ :import_done | :migration_import_done_at
+ :pre_import_done | :migration_pre_import_done_at
+ :import_aborted | :migration_aborted_at
+ :import_skipped | :migration_skipped_at
end
- end
- it 'starts the pre-import for the next qualified repository' do
- expect_log_extra_metadata(
- import_type: 'next',
- container_repository_id: container_repository.id,
- container_repository_path: container_repository.path,
- container_repository_migration_state: 'pre_importing'
- )
+ with_them do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, state, timestamp => 1.minute.ago)
+ end
- subject
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(waiting_time_passed: false, current_waiting_time_setting: 45.minutes)
+ end
+ end
+ end
- expect(container_repository.reload).to be_pre_importing
+ context 'when last completed repository has nil timestamps' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, migration_state: 'import_done')
+ end
+
+ it 'continues to try the next import' do
+ expect { subject }.to change { container_repository.reload.migration_state }
+ end
+ end
end
- context 'when the new pre-import maxes out the capacity' do
- before do
- # set capacity to 10
- stub_feature_flags(
- container_registry_migration_phase2_capacity_25: false
- )
+ context 'when an aborted import is available' do
+ let_it_be(:aborted_repository) { create(:container_repository, :import_aborted) }
- # Plus 2 created above gives 9 importing repositories
- create_list(:container_repository, 7, :importing)
+ context 'with a successful registry request' do
+ before do
+ allow_worker(on: :next_aborted_repository) do |repository|
+ allow(repository).to receive(:migration_import).and_return(:ok)
+ allow(repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
+ end
+ end
+
+ it 'retries the import for the aborted repository' do
+ expect_log_extra_metadata(
+ import_type: 'retry',
+ container_repository_id: aborted_repository.id,
+ container_repository_path: aborted_repository.path,
+ container_repository_migration_state: 'importing'
+ )
+
+ subject
+
+ expect(aborted_repository.reload).to be_importing
+ expect(container_repository.reload).to be_default
+ end
+
+ it_behaves_like 're-enqueuing based on capacity'
end
- it 'does not re-enqueue the worker' do
- expect(described_class).not_to receive(:perform_async)
+ context 'when an error occurs' do
+ it 'does not abort that migration' do
+ allow_worker(on: :next_aborted_repository) do |repository|
+ allow(repository).to receive(:retry_aborted_migration).and_raise(StandardError)
+ end
- subject
+ expect_log_extra_metadata(
+ import_type: 'retry',
+ container_repository_id: aborted_repository.id,
+ container_repository_path: aborted_repository.path,
+ container_repository_migration_state: 'import_aborted'
+ )
+
+ subject
+
+ expect(aborted_repository.reload).to be_import_aborted
+ expect(container_repository.reload).to be_default
+ end
end
end
- it_behaves_like 're-enqueuing based on capacity'
- end
+ context 'when no repository qualifies' do
+ include_examples 'an idempotent worker' do
+ before do
+ allow(ContainerRepository).to receive(:ready_for_import).and_return(ContainerRepository.none)
+ end
- context 'migrations are disabled' do
- before do
- allow(ContainerRegistry::Migration).to receive(:enabled?).and_return(false)
+ it_behaves_like 'no action'
+ end
end
- it_behaves_like 'no action' do
+ context 'over max tag count' do
before do
- expect_log_extra_metadata(migration_enabled: false)
+ stub_application_setting(container_registry_import_max_tags_count: 2)
end
- end
- end
- context 'above capacity' do
- before do
- create(:container_repository, :importing)
- create(:container_repository, :importing)
- allow(ContainerRegistry::Migration).to receive(:capacity).and_return(1)
+ it 'skips the repository' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_skipped',
+ tags_count_too_high: true,
+ max_tags_count_setting: 2
+ )
+
+ subject
+
+ expect(container_repository.reload).to be_import_skipped
+ expect(container_repository.migration_skipped_reason).to eq('too_many_tags')
+ expect(container_repository.migration_skipped_at).not_to be_nil
+ end
+
+ context 're-enqueuing' do
+ before do
+ # skipping will also re-enqueue, so we isolate the capacity behavior here
+ allow_worker(on: :next_repository) do |repository|
+ allow(repository).to receive(:skip_import).and_return(true)
+ end
+ end
+
+ it_behaves_like 're-enqueuing based on capacity', capacity_limit: 3
+ end
end
- it_behaves_like 'no action' do
+ context 'when an error occurs' do
before do
- expect_log_extra_metadata(below_capacity: false, max_capacity_setting: 1)
+ allow(ContainerRegistry::Migration).to receive(:max_tags_count).and_raise(StandardError)
end
- end
- it 'does not re-enqueue the worker' do
- expect(ContainerRegistry::Migration::EnqueuerWorker).not_to receive(:perform_async)
+ it 'aborts the import' do
+ expect_log_extra_metadata(
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_aborted'
+ )
+
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ instance_of(StandardError),
+ next_repository_id: container_repository.id
+ )
- subject
+ subject
+
+ expect(container_repository.reload).to be_import_aborted
+ end
end
- end
- context 'too soon before previous completed import step' do
- where(:state, :timestamp) do
- :import_done | :migration_import_done_at
- :pre_import_done | :migration_pre_import_done_at
- :import_aborted | :migration_aborted_at
- :import_skipped | :migration_skipped_at
+ context 'with the exclusive lease taken' do
+ let(:lease_key) { worker.send(:lease_key) }
+
+ before do
+ stub_exclusive_lease_taken(lease_key, timeout: 30.minutes)
+ end
+
+ it 'does not perform' do
+ expect(worker).not_to receive(:runnable?)
+ expect(worker).not_to receive(:re_enqueue_if_capacity)
+
+ subject
+ end
end
+ end
- with_them do
+ context 'with container_registry_migration_phase2_enqueuer_loop enabled' do
+ context 'migrations are disabled' do
before do
- allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
- create(:container_repository, state, timestamp => 1.minute.ago)
+ allow(ContainerRegistry::Migration).to receive(:enabled?).and_return(false)
end
it_behaves_like 'no action' do
before do
- expect_log_extra_metadata(waiting_time_passed: false, current_waiting_time_setting: 45.minutes)
+ expect_log_extra_metadata(migration_enabled: false)
end
end
end
- context 'when last completed repository has nil timestamps' do
+ context 'with no repository qualifies' do
+ include_examples 'an idempotent worker' do
+ before do
+ allow(ContainerRepository).to receive(:ready_for_import).and_return(ContainerRepository.none)
+ end
+
+ it_behaves_like 'no action'
+ end
+ end
+
+ context 'when multiple aborted imports are available' do
+ let_it_be(:aborted_repository1) { create(:container_repository, :import_aborted) }
+ let_it_be(:aborted_repository2) { create(:container_repository, :import_aborted) }
+
before do
- allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
- create(:container_repository, migration_state: 'import_done')
+ container_repository.update!(created_at: 30.seconds.ago)
end
- it 'continues to try the next import' do
- expect { subject }.to change { container_repository.reload.migration_state }
+ context 'with successful registry requests' do
+ before do
+ allow_worker(on: :next_aborted_repository) do |repository|
+ allow(repository).to receive(:migration_import).and_return(:ok)
+ allow(repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
+ end
+ end
+
+ it 'retries the import for the aborted repository' do
+ expect_log_info(
+ [
+ {
+ import_type: 'retry',
+ container_repository_id: aborted_repository1.id,
+ container_repository_path: aborted_repository1.path,
+ container_repository_migration_state: 'importing'
+ },
+ {
+ import_type: 'retry',
+ container_repository_id: aborted_repository2.id,
+ container_repository_path: aborted_repository2.path,
+ container_repository_migration_state: 'importing'
+ }
+ ]
+ )
+
+ expect(worker).to receive(:handle_next_migration).and_call_original
+
+ subject
+
+ expect(aborted_repository1.reload).to be_importing
+ expect(aborted_repository2.reload).to be_importing
+ end
+ end
+
+ context 'when an error occurs' do
+ it 'does abort that migration' do
+ allow_worker(on: :next_aborted_repository) do |repository|
+ allow(repository).to receive(:retry_aborted_migration).and_raise(StandardError)
+ end
+
+ expect_log_info(
+ [
+ {
+ import_type: 'retry',
+ container_repository_id: aborted_repository1.id,
+ container_repository_path: aborted_repository1.path,
+ container_repository_migration_state: 'import_aborted'
+ }
+ ]
+ )
+
+ subject
+
+ expect(aborted_repository1.reload).to be_import_aborted
+ expect(aborted_repository2.reload).to be_import_aborted
+ end
end
end
- end
- context 'when an aborted import is available' do
- let_it_be(:aborted_repository) { create(:container_repository, :import_aborted) }
+ context 'when multiple qualified repositories are available' do
+ let_it_be(:container_repository2) { create(:container_repository, created_at: 2.days.ago) }
- context 'with a successful registry request' do
before do
- method = worker.method(:next_aborted_repository)
- allow(worker).to receive(:next_aborted_repository) do
- next_aborted_repository = method.call
- allow(next_aborted_repository).to receive(:migration_import).and_return(:ok)
- allow(next_aborted_repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
- next_aborted_repository
+ allow_worker(on: :next_repository) do |repository|
+ allow(repository).to receive(:migration_pre_import).and_return(:ok)
end
- end
- it 'retries the import for the aborted repository' do
- expect_log_extra_metadata(
- import_type: 'retry',
- container_repository_id: aborted_repository.id,
- container_repository_path: aborted_repository.path,
- container_repository_migration_state: 'importing'
+ stub_container_registry_tags(
+ repository: container_repository2.path,
+ tags: %w(tag4 tag5 tag6),
+ with_manifest: true
)
+ end
- subject
+ shared_examples 'starting all the next imports' do
+ it 'starts the pre-import for the next qualified repositories' do
+ expect_log_info(
+ [
+ {
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'pre_importing'
+ },
+ {
+ import_type: 'next',
+ container_repository_id: container_repository2.id,
+ container_repository_path: container_repository2.path,
+ container_repository_migration_state: 'pre_importing'
+ }
+ ]
+ )
+
+ expect(worker).to receive(:handle_next_migration).exactly(3).times.and_call_original
+
+ expect { subject }.to make_queries_matching(/LIMIT 2/)
+
+ expect(container_repository.reload).to be_pre_importing
+ expect(container_repository2.reload).to be_pre_importing
+ end
+ end
- expect(aborted_repository.reload).to be_importing
- expect(container_repository.reload).to be_default
+ it_behaves_like 'starting all the next imports'
+
+ context 'when the new pre-import maxes out the capacity' do
+ before do
+ # set capacity to 10
+ stub_feature_flags(
+ container_registry_migration_phase2_capacity_25: false
+ )
+
+ # Plus 2 created above gives 9 importing repositories
+ create_list(:container_repository, 7, :importing)
+ end
+
+ it 'starts the pre-import only for one qualified repository' do
+ expect_log_info(
+ [
+ {
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'pre_importing'
+ }
+ ]
+ )
+
+ subject
+
+ expect(container_repository.reload).to be_pre_importing
+ expect(container_repository2.reload).to be_default
+ end
end
- it_behaves_like 're-enqueuing based on capacity'
+ context 'max tag count is 0' do
+ before do
+ stub_application_setting(container_registry_import_max_tags_count: 0)
+ # Add 8 tags to the next repository
+ stub_container_registry_tags(
+ repository: container_repository.path, tags: %w(a b c d e f g h), with_manifest: true
+ )
+ end
+
+ it_behaves_like 'starting all the next imports'
+ end
+
+ context 'when the deadline is hit' do
+ it 'does not handle the second qualified repository' do
+ expect(worker).to receive(:loop_deadline).and_return(5.seconds.from_now, 2.seconds.ago)
+ expect(worker).to receive(:handle_next_migration).once.and_call_original
+
+ subject
+
+ expect(container_repository.reload).to be_pre_importing
+ expect(container_repository2.reload).to be_default
+ end
+ end
end
- context 'when an error occurs' do
- it 'does not abort that migration' do
- method = worker.method(:next_aborted_repository)
- allow(worker).to receive(:next_aborted_repository) do
- next_aborted_repository = method.call
- allow(next_aborted_repository).to receive(:retry_aborted_migration).and_raise(StandardError)
- next_aborted_repository
+ context 'when a mix of aborted imports and qualified repositories are available' do
+ let_it_be(:aborted_repository) { create(:container_repository, :import_aborted) }
+
+ before do
+ allow_worker(on: :next_aborted_repository) do |repository|
+ allow(repository).to receive(:migration_import).and_return(:ok)
+ allow(repository.gitlab_api_client).to receive(:import_status).and_return('import_failed')
end
- expect_log_extra_metadata(
- import_type: 'retry',
- container_repository_id: aborted_repository.id,
- container_repository_path: aborted_repository.path,
- container_repository_migration_state: 'import_aborted'
+ allow_worker(on: :next_repository) do |repository|
+ allow(repository).to receive(:migration_pre_import).and_return(:ok)
+ end
+ end
+
+ it 'retries the aborted repository and start the migration on the qualified repository' do
+ expect_log_info(
+ [
+ {
+ import_type: 'retry',
+ container_repository_id: aborted_repository.id,
+ container_repository_path: aborted_repository.path,
+ container_repository_migration_state: 'importing'
+ },
+ {
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'pre_importing'
+ }
+ ]
)
subject
- expect(aborted_repository.reload).to be_import_aborted
- expect(container_repository.reload).to be_default
+ expect(aborted_repository.reload).to be_importing
+ expect(container_repository.reload).to be_pre_importing
end
end
- end
- context 'when no repository qualifies' do
- include_examples 'an idempotent worker' do
+ context 'above capacity' do
before do
- allow(ContainerRepository).to receive(:ready_for_import).and_return(ContainerRepository.none)
+ create(:container_repository, :importing)
+ create(:container_repository, :importing)
+ allow(ContainerRegistry::Migration).to receive(:capacity).and_return(1)
end
- it_behaves_like 'no action'
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(below_capacity: false, max_capacity_setting: 1)
+ end
+ end
end
- end
- context 'over max tag count' do
- before do
- stub_application_setting(container_registry_import_max_tags_count: 2)
- end
+ context 'too soon before previous completed import step' do
+ where(:state, :timestamp) do
+ :import_done | :migration_import_done_at
+ :pre_import_done | :migration_pre_import_done_at
+ :import_aborted | :migration_aborted_at
+ :import_skipped | :migration_skipped_at
+ end
- it 'skips the repository' do
- expect_log_extra_metadata(
- import_type: 'next',
- container_repository_id: container_repository.id,
- container_repository_path: container_repository.path,
- container_repository_migration_state: 'import_skipped',
- tags_count_too_high: true,
- max_tags_count_setting: 2
- )
+ with_them do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, state, timestamp => 1.minute.ago)
+ end
- subject
+ it_behaves_like 'no action' do
+ before do
+ expect_log_extra_metadata(waiting_time_passed: false, current_waiting_time_setting: 45.minutes)
+ end
+ end
+ end
- expect(container_repository.reload).to be_import_skipped
- expect(container_repository.migration_skipped_reason).to eq('too_many_tags')
- expect(container_repository.migration_skipped_at).not_to be_nil
+ context 'when last completed repository has nil timestamps' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:enqueue_waiting_time).and_return(45.minutes)
+ create(:container_repository, migration_state: 'import_done')
+ end
+
+ it 'continues to try the next import' do
+ expect { subject }.to change { container_repository.reload.migration_state }
+ end
+ end
end
- it_behaves_like 're-enqueuing based on capacity', capacity_limit: 3
- end
+ context 'over max tag count' do
+ before do
+ stub_application_setting(container_registry_import_max_tags_count: 2)
+ end
- context 'when an error occurs' do
- before do
- allow(ContainerRegistry::Migration).to receive(:max_tags_count).and_raise(StandardError)
+ it 'skips the repository' do
+ expect_log_info(
+ [
+ {
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_skipped',
+ container_repository_migration_skipped_reason: 'too_many_tags'
+ }
+ ]
+ )
+
+ expect(worker).to receive(:handle_next_migration).twice.and_call_original
+ # skipping the migration will re_enqueue the job
+ expect(described_class).to receive(:enqueue_a_job)
+
+ subject
+
+ expect(container_repository.reload).to be_import_skipped
+ expect(container_repository.migration_skipped_reason).to eq('too_many_tags')
+ expect(container_repository.migration_skipped_at).not_to be_nil
+ end
end
- it 'aborts the import' do
- expect_log_extra_metadata(
- import_type: 'next',
- container_repository_id: container_repository.id,
- container_repository_path: container_repository.path,
- container_repository_migration_state: 'import_aborted'
- )
+ context 'when an error occurs' do
+ before do
+ allow(ContainerRegistry::Migration).to receive(:max_tags_count).and_raise(StandardError)
+ end
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
- instance_of(StandardError),
- next_repository_id: container_repository.id
- )
+ it 'aborts the import' do
+ expect_log_info(
+ [
+ {
+ import_type: 'next',
+ container_repository_id: container_repository.id,
+ container_repository_path: container_repository.path,
+ container_repository_migration_state: 'import_aborted'
+ }
+ ]
+ )
- subject
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(
+ instance_of(StandardError),
+ next_repository_id: container_repository.id
+ )
- expect(container_repository.reload).to be_import_aborted
- end
- end
+ # aborting the migration will re_enqueue the job
+ expect(described_class).to receive(:enqueue_a_job)
- context 'with the exclusive lease taken' do
- let(:lease_key) { worker.send(:lease_key) }
+ subject
- before do
- stub_exclusive_lease_taken(lease_key, timeout: 30.minutes)
+ expect(container_repository.reload).to be_import_aborted
+ end
end
- it 'does not perform' do
- expect(worker).not_to receive(:runnable?)
- expect(worker).not_to receive(:re_enqueue_if_capacity)
+ context 'with the exclusive lease taken' do
+ let(:lease_key) { worker.send(:lease_key) }
- subject
+ before do
+ stub_exclusive_lease_taken(lease_key, timeout: 30.minutes)
+ end
+
+ it 'does not perform' do
+ expect(worker).not_to receive(:handle_aborted_migration)
+ expect(worker).not_to receive(:handle_next_migration)
+
+ subject
+ end
end
end
@@ -298,5 +694,29 @@ RSpec.describe ContainerRegistry::Migration::EnqueuerWorker, :aggregate_failures
expect(worker).to receive(:log_extra_metadata_on_done).with(key, value)
end
end
+
+ def expect_log_info(expected_multiple_arguments)
+ expected_multiple_arguments.each do |extras|
+ expect(worker.logger).to receive(:info).with(worker.structured_payload(extras))
+ end
+ end
+
+ def allow_worker(on:)
+ method_repository = worker.method(on)
+ allow(worker).to receive(on) do
+ repository = method_repository.call
+
+ yield repository if repository
+
+ repository
+ end
+ end
+ end
+
+ describe 'worker attributes' do
+ it 'has deduplication set' do
+ expect(described_class.get_deduplicate_strategy).to eq(:until_executing)
+ expect(described_class.get_deduplication_options).to include(ttl: 30.minutes)
+ end
end
end
diff --git a/spec/workers/container_registry/migration/guard_worker_spec.rb b/spec/workers/container_registry/migration/guard_worker_spec.rb
index 299d1204af3..c52a3fc5d54 100644
--- a/spec/workers/container_registry/migration/guard_worker_spec.rb
+++ b/spec/workers/container_registry/migration/guard_worker_spec.rb
@@ -25,57 +25,94 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
allow(::Gitlab).to receive(:com?).and_return(true)
end
- shared_examples 'handling long running migrations' do
+ shared_examples 'handling long running migrations' do |timeout:|
before do
allow_next_found_instance_of(ContainerRepository) do |repository|
allow(repository).to receive(:migration_cancel).and_return(migration_cancel_response)
end
end
- context 'migration is canceled' do
- let(:migration_cancel_response) { { status: :ok } }
-
- it 'will not abort the migration' do
+ shared_examples 'aborting the migration' do
+ it 'will abort the migration' do
expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+ expect(ContainerRegistry::Migration).to receive(timeout).and_call_original
expect { subject }
- .to change(import_skipped_migrations, :count)
+ .to change(import_aborted_migrations, :count).by(1)
+ .and change { stale_migration.reload.migration_state }.to('import_aborted')
+ .and not_change { ongoing_migration.migration_state }
+ end
+
+ context 'registry_migration_guard_thresholds feature flag disabled' do
+ before do
+ stub_feature_flags(registry_migration_guard_thresholds: false)
+ end
+
+ it 'falls back on the hardcoded value' do
+ expect(ContainerRegistry::Migration).not_to receive(:pre_import_timeout)
- expect(stale_migration.reload.migration_state).to eq('import_skipped')
- expect(stale_migration.reload.migration_skipped_reason).to eq('migration_canceled')
+ expect { subject }
+ .to change { stale_migration.reload.migration_state }.to('import_aborted')
+ end
end
end
- context 'migration cancelation fails with an error' do
- let(:migration_cancel_response) { { status: :error } }
+ context 'migration is canceled' do
+ let(:migration_cancel_response) { { status: :ok } }
- it 'will abort the migration' do
- expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+ before do
+ stub_application_setting(container_registry_import_max_retries: 3)
+ end
- expect { subject }
- .to change(import_aborted_migrations, :count).by(1)
- .and change { stale_migration.reload.migration_state }.to('import_aborted')
- .and not_change { ongoing_migration.migration_state }
+ context 'when the retry limit has been reached' do
+ before do
+ stale_migration.update_column(:migration_retries_count, 2)
+ end
+
+ it 'will not abort the migration' do
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
+ expect(ContainerRegistry::Migration).to receive(timeout).and_call_original
+
+ expect { subject }
+ .to change(import_skipped_migrations, :count)
+
+ expect(stale_migration.reload.migration_state).to eq('import_skipped')
+ expect(stale_migration.reload.migration_skipped_reason).to eq('migration_canceled')
+ end
+
+ context 'registry_migration_guard_thresholds feature flag disabled' do
+ before do
+ stub_feature_flags(registry_migration_guard_thresholds: false)
+ end
+
+ it 'falls back on the hardcoded value' do
+ expect(ContainerRegistry::Migration).not_to receive(timeout)
+
+ expect { subject }
+ .to change { stale_migration.reload.migration_state }.to('import_skipped')
+ end
+ end
+ end
+
+ context 'when the retry limit has not been reached' do
+ it_behaves_like 'aborting the migration'
end
end
+ context 'migration cancelation fails with an error' do
+ let(:migration_cancel_response) { { status: :error } }
+
+ it_behaves_like 'aborting the migration'
+ end
+
context 'migration receives bad request with a new status' do
let(:migration_cancel_response) { { status: :bad_request, migration_state: :import_done } }
- it 'will abort the migration' do
- expect(worker).to receive(:log_extra_metadata_on_done).with(:stale_migrations_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_stale_migrations_count, 1)
- expect(worker).to receive(:log_extra_metadata_on_done).with(:aborted_long_running_migration_ids, [stale_migration.id])
-
- expect { subject }
- .to change(import_aborted_migrations, :count).by(1)
- .and change { stale_migration.reload.migration_state }.to('import_aborted')
- .and not_change { ongoing_migration.migration_state }
- end
+ it_behaves_like 'aborting the migration'
end
end
@@ -96,13 +133,15 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'with pre_importing stale migrations' do
let(:ongoing_migration) { create(:container_repository, :pre_importing) }
- let(:stale_migration) { create(:container_repository, :pre_importing, migration_pre_import_started_at: 35.minutes.ago) }
+ let(:stale_migration) { create(:container_repository, :pre_importing, migration_pre_import_started_at: 11.minutes.ago) }
let(:import_status) { 'test' }
before do
allow_next_instance_of(ContainerRegistry::GitlabApiClient) do |client|
allow(client).to receive(:import_status).and_return(import_status)
end
+
+ stub_application_setting(container_registry_pre_import_timeout: 10.minutes.to_i)
end
it 'will abort the migration' do
@@ -122,13 +161,13 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'the client returns pre_import_in_progress' do
let(:import_status) { 'pre_import_in_progress' }
- it_behaves_like 'handling long running migrations'
+ it_behaves_like 'handling long running migrations', timeout: :pre_import_timeout
end
end
context 'with pre_import_done stale migrations' do
let(:ongoing_migration) { create(:container_repository, :pre_import_done) }
- let(:stale_migration) { create(:container_repository, :pre_import_done, migration_pre_import_done_at: 35.minutes.ago) }
+ let(:stale_migration) { create(:container_repository, :pre_import_done, migration_pre_import_done_at: 11.minutes.ago) }
before do
allow(::ContainerRegistry::Migration).to receive(:max_step_duration).and_return(5.minutes)
@@ -151,13 +190,15 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'with importing stale migrations' do
let(:ongoing_migration) { create(:container_repository, :importing) }
- let(:stale_migration) { create(:container_repository, :importing, migration_import_started_at: 35.minutes.ago) }
+ let(:stale_migration) { create(:container_repository, :importing, migration_import_started_at: 11.minutes.ago) }
let(:import_status) { 'test' }
before do
allow_next_instance_of(ContainerRegistry::GitlabApiClient) do |client|
allow(client).to receive(:import_status).and_return(import_status)
end
+
+ stub_application_setting(container_registry_import_timeout: 10.minutes.to_i)
end
it 'will abort the migration' do
@@ -177,7 +218,7 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
context 'the client returns import_in_progress' do
let(:import_status) { 'import_in_progress' }
- it_behaves_like 'handling long running migrations'
+ it_behaves_like 'handling long running migrations', timeout: :import_timeout
end
end
end
@@ -195,4 +236,11 @@ RSpec.describe ContainerRegistry::Migration::GuardWorker, :aggregate_failures do
end
end
end
+
+ describe 'worker attributes' do
+ it 'has deduplication set' do
+ expect(described_class.get_deduplicate_strategy).to eq(:until_executed)
+ expect(described_class.get_deduplication_options).to include(ttl: 5.minutes)
+ end
+ end
end
diff --git a/spec/workers/create_commit_signature_worker_spec.rb b/spec/workers/create_commit_signature_worker_spec.rb
index 0e31faf47af..9d3c63efc8a 100644
--- a/spec/workers/create_commit_signature_worker_spec.rb
+++ b/spec/workers/create_commit_signature_worker_spec.rb
@@ -10,8 +10,8 @@ RSpec.describe CreateCommitSignatureWorker do
let(:x509_commit) { instance_double(Gitlab::X509::Commit) }
before do
- allow(Project).to receive(:find_by).with(id: project.id).and_return(project)
- allow(project).to receive(:commits_by).with(oids: commit_shas).and_return(commits)
+ allow(Project).to receive(:find_by).with({ id: project.id }).and_return(project)
+ allow(project).to receive(:commits_by).with({ oids: commit_shas }).and_return(commits)
end
subject { described_class.new.perform(commit_shas, project.id) }
diff --git a/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb b/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb
index 116026ea8f7..e5024c568cb 100644
--- a/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb
+++ b/spec/workers/database/ci_namespace_mirrors_consistency_check_worker_spec.rb
@@ -62,6 +62,15 @@ RSpec.describe Database::CiNamespaceMirrorsConsistencyCheckWorker do
expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
worker.perform
end
+
+ it 'calls the consistency_fix_service to fix the inconsistencies' do
+ allow_next_instance_of(Database::ConsistencyFixService) do |instance|
+ expect(instance).to receive(:execute).with(
+ ids: [missing_namespace.id]
+ ).and_call_original
+ end
+ worker.perform
+ end
end
end
end
diff --git a/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb b/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb
index b6bd825ffcd..f8e950d8917 100644
--- a/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb
+++ b/spec/workers/database/ci_project_mirrors_consistency_check_worker_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Database::CiProjectMirrorsConsistencyCheckWorker do
before do
redis_shared_state_cleanup!
stub_feature_flags(ci_project_mirrors_consistency_check: true)
- create_list(:project, 10) # This will also create Ci::NameSpaceMirror objects
+ create_list(:project, 10) # This will also create Ci::ProjectMirror objects
missing_project.delete
allow_next_instance_of(Database::ConsistencyCheckService) do |instance|
@@ -62,6 +62,15 @@ RSpec.describe Database::CiProjectMirrorsConsistencyCheckWorker do
expect(worker).to receive(:log_extra_metadata_on_done).with(:results, expected_result)
worker.perform
end
+
+ it 'calls the consistency_fix_service to fix the inconsistencies' do
+ expect_next_instance_of(Database::ConsistencyFixService) do |instance|
+ expect(instance).to receive(:execute).with(
+ ids: [missing_project.id]
+ ).and_call_original
+ end
+ worker.perform
+ end
end
end
end
diff --git a/spec/workers/delete_diff_files_worker_spec.rb b/spec/workers/delete_diff_files_worker_spec.rb
index cf26dbabb97..c124847ca45 100644
--- a/spec/workers/delete_diff_files_worker_spec.rb
+++ b/spec/workers/delete_diff_files_worker_spec.rb
@@ -34,11 +34,13 @@ RSpec.describe DeleteDiffFilesWorker do
end
it 'rollsback if something goes wrong' do
+ error = RuntimeError.new('something went wrong')
+
expect(MergeRequestDiffFile).to receive_message_chain(:where, :delete_all)
- .and_raise
+ .and_raise(error)
expect { described_class.new.perform(merge_request_diff.id) }
- .to raise_error
+ .to raise_error(error)
merge_request_diff.reload
diff --git a/spec/workers/delete_user_worker_spec.rb b/spec/workers/delete_user_worker_spec.rb
index 52f2c692b8c..4046b670640 100644
--- a/spec/workers/delete_user_worker_spec.rb
+++ b/spec/workers/delete_user_worker_spec.rb
@@ -16,9 +16,9 @@ RSpec.describe DeleteUserWorker do
it "uses symbolized keys" do
expect_next_instance_of(Users::DestroyService) do |service|
- expect(service).to receive(:execute).with(user, test: "test")
+ expect(service).to receive(:execute).with(user, { test: "test" })
end
- described_class.new.perform(current_user.id, user.id, "test" => "test")
+ described_class.new.perform(current_user.id, user.id, { "test" => "test" })
end
end
diff --git a/spec/workers/deployments/hooks_worker_spec.rb b/spec/workers/deployments/hooks_worker_spec.rb
index 29b3e8d3ee4..a9240b45360 100644
--- a/spec/workers/deployments/hooks_worker_spec.rb
+++ b/spec/workers/deployments/hooks_worker_spec.rb
@@ -10,6 +10,16 @@ RSpec.describe Deployments::HooksWorker do
allow(ProjectServiceWorker).to receive(:perform_async)
end
+ it 'logs deployment and project IDs as metadata' do
+ deployment = create(:deployment, :running)
+ project = deployment.project
+
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:deployment_project_id, project.id)
+ expect(worker).to receive(:log_extra_metadata_on_done).with(:deployment_id, deployment.id)
+
+ worker.perform(deployment_id: deployment.id, status_changed_at: Time.current)
+ end
+
it 'executes project services for deployment_hooks' do
deployment = create(:deployment, :running)
project = deployment.project
diff --git a/spec/workers/every_sidekiq_worker_spec.rb b/spec/workers/every_sidekiq_worker_spec.rb
index 0351b500747..0c83a692ca8 100644
--- a/spec/workers/every_sidekiq_worker_spec.rb
+++ b/spec/workers/every_sidekiq_worker_spec.rb
@@ -126,8 +126,6 @@ RSpec.describe 'Every Sidekiq worker' do
'ApproveBlockedPendingApprovalUsersWorker' => 3,
'ArchiveTraceWorker' => 3,
'AuthorizedKeysWorker' => 3,
- 'AuthorizedProjectUpdate::ProjectCreateWorker' => 3,
- 'AuthorizedProjectUpdate::ProjectGroupLinkCreateWorker' => 3,
'AuthorizedProjectUpdate::UserRefreshOverUserRangeWorker' => 3,
'AuthorizedProjectUpdate::UserRefreshWithLowUrgencyWorker' => 3,
'AuthorizedProjectUpdate::UserRefreshFromReplicaWorker' => 3,
@@ -229,7 +227,6 @@ RSpec.describe 'Every Sidekiq worker' do
'Epics::UpdateEpicsDatesWorker' => 3,
'ErrorTrackingIssueLinkWorker' => 3,
'Experiments::RecordConversionEventWorker' => 3,
- 'ExpireBuildInstanceArtifactsWorker' => 3,
'ExpireJobCacheWorker' => 3,
'ExpirePipelineCacheWorker' => 3,
'ExportCsvWorker' => 3,
@@ -243,7 +240,6 @@ RSpec.describe 'Every Sidekiq worker' do
'Geo::DesignRepositorySyncWorker' => 1,
'Geo::DestroyWorker' => 3,
'Geo::EventWorker' => 3,
- 'Geo::FileDownloadWorker' => 3,
'Geo::FileRegistryRemovalWorker' => 3,
'Geo::FileRemovalWorker' => 3,
'Geo::ProjectSyncWorker' => 1,
@@ -352,7 +348,6 @@ RSpec.describe 'Every Sidekiq worker' do
'Namespaces::RefreshRootStatisticsWorker' => 3,
'Namespaces::RootStatisticsWorker' => 3,
'Namespaces::ScheduleAggregationWorker' => 3,
- 'NetworkPolicyMetricsWorker' => 3,
'NewEpicWorker' => 3,
'NewIssueWorker' => 3,
'NewMergeRequestWorker' => 3,
@@ -386,12 +381,13 @@ RSpec.describe 'Every Sidekiq worker' do
'ProjectDailyStatisticsWorker' => 3,
'ProjectDestroyWorker' => 3,
'ProjectExportWorker' => false,
- 'ProjectImportScheduleWorker' => false,
+ 'ProjectImportScheduleWorker' => 1,
'ProjectScheduleBulkRepositoryShardMovesWorker' => 3,
'ProjectServiceWorker' => 3,
'ProjectTemplateExportWorker' => false,
'ProjectUpdateRepositoryStorageWorker' => 3,
'Projects::GitGarbageCollectWorker' => false,
+ 'Projects::InactiveProjectsDeletionNotificationWorker' => 3,
'Projects::PostCreationWorker' => 3,
'Projects::ScheduleBulkRepositoryShardMovesWorker' => 3,
'Projects::UpdateRepositoryStorageWorker' => 3,
@@ -414,9 +410,9 @@ RSpec.describe 'Every Sidekiq worker' do
'RepositoryCleanupWorker' => 3,
'RepositoryForkWorker' => 5,
'RepositoryImportWorker' => false,
- 'RepositoryPushAuditEventWorker' => 3,
'RepositoryRemoveRemoteWorker' => 3,
'RepositoryUpdateMirrorWorker' => false,
+ 'RepositoryPushAuditEventWorker' => 3,
'RepositoryUpdateRemoteMirrorWorker' => 3,
'RequirementsManagement::ImportRequirementsCsvWorker' => 3,
'RequirementsManagement::ProcessRequirementsReportsWorker' => 3,
diff --git a/spec/workers/expire_build_instance_artifacts_worker_spec.rb b/spec/workers/expire_build_instance_artifacts_worker_spec.rb
deleted file mode 100644
index 38318447b5f..00000000000
--- a/spec/workers/expire_build_instance_artifacts_worker_spec.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe ExpireBuildInstanceArtifactsWorker do
- include RepoHelpers
-
- let(:worker) { described_class.new }
-
- describe '#perform' do
- before do
- worker.perform(build.id)
- end
-
- context 'with expired artifacts' do
- context 'when associated project is valid' do
- let(:build) { create(:ci_build, :artifacts, :expired) }
-
- it 'does expire' do
- expect(build.reload.artifacts_expired?).to be_truthy
- end
-
- it 'does remove files' do
- expect(build.reload.artifacts_file.present?).to be_falsey
- end
-
- it 'does remove the job artifact record' do
- expect(build.reload.job_artifacts_archive).to be_nil
- end
- end
- end
-
- context 'with not yet expired artifacts' do
- let_it_be(:build) do
- create(:ci_build, :artifacts, artifacts_expire_at: Time.current + 7.days)
- end
-
- it 'does not expire' do
- expect(build.reload.artifacts_expired?).to be_falsey
- end
-
- it 'does not remove files' do
- expect(build.reload.artifacts_file.present?).to be_truthy
- end
-
- it 'does not remove the job artifact record' do
- expect(build.reload.job_artifacts_archive).not_to be_nil
- end
- end
-
- context 'without expire date' do
- let(:build) { create(:ci_build, :artifacts) }
-
- it 'does not expire' do
- expect(build.reload.artifacts_expired?).to be_falsey
- end
-
- it 'does not remove files' do
- expect(build.reload.artifacts_file.present?).to be_truthy
- end
-
- it 'does not remove the job artifact record' do
- expect(build.reload.job_artifacts_archive).not_to be_nil
- end
- end
-
- context 'for expired artifacts' do
- let(:build) { create(:ci_build, :expired) }
-
- it 'is still expired' do
- expect(build.reload.artifacts_expired?).to be_truthy
- end
- end
- end
-end
diff --git a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
index dd976eef28b..5f60dfc8ca1 100644
--- a/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb
@@ -17,14 +17,16 @@ RSpec.describe Gitlab::GithubImport::Stage::FinishImportWorker do
expect(Gitlab::GithubImport::Logger)
.to receive(:info)
.with(
- message: 'GitHub project import finished',
- import_stage: 'Gitlab::GithubImport::Stage::FinishImportWorker',
- object_counts: {
- 'fetched' => {},
- 'imported' => {}
- },
- project_id: project.id,
- duration_s: 3.01
+ {
+ message: 'GitHub project import finished',
+ import_stage: 'Gitlab::GithubImport::Stage::FinishImportWorker',
+ object_counts: {
+ 'fetched' => {},
+ 'imported' => {}
+ },
+ project_id: project.id,
+ duration_s: 3.01
+ }
)
worker.import(double(:client), project)
diff --git a/spec/workers/merge_requests/close_issue_worker_spec.rb b/spec/workers/merge_requests/close_issue_worker_spec.rb
new file mode 100644
index 00000000000..5e6bdc2a43e
--- /dev/null
+++ b/spec/workers/merge_requests/close_issue_worker_spec.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe MergeRequests::CloseIssueWorker do
+ subject(:worker) { described_class.new }
+
+ describe '#perform' do
+ let!(:user) { create(:user) }
+ let!(:project) { create(:project) }
+ let!(:issue) { create(:issue, project: project) }
+ let!(:merge_request) { create(:merge_request, source_project: project) }
+
+ 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, commit: merge_request)
+ end
+
+ subject.perform(project.id, user.id, issue.id, merge_request.id)
+ end
+
+ shared_examples 'when object does not exist' do
+ it 'does not call the close issue service' do
+ expect(Issues::CloseService).not_to receive(:new)
+
+ expect { subject.perform(project.id, user.id, issue.id, merge_request.id) }
+ .not_to raise_exception
+ end
+ end
+
+ context 'when the project does not exist' do
+ before do
+ project.destroy!
+ end
+
+ it_behaves_like 'when object does not exist'
+ end
+
+ context 'when the user does not exist' do
+ before do
+ user.destroy!
+ end
+
+ it_behaves_like 'when object does not exist'
+ end
+
+ context 'when the issue does not exist' do
+ before do
+ issue.destroy!
+ end
+
+ it_behaves_like 'when object does not exist'
+ end
+
+ context 'when the merge request does not exist' do
+ before do
+ merge_request.destroy!
+ end
+
+ it_behaves_like 'when object does not exist'
+ end
+ end
+end
diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb
index 9b33e559c71..3951c20c048 100644
--- a/spec/workers/post_receive_spec.rb
+++ b/spec/workers/post_receive_spec.rb
@@ -354,7 +354,7 @@ RSpec.describe PostReceive do
context 'webhook' do
it 'fetches the correct project' do
- expect(Project).to receive(:find_by).with(id: project.id)
+ expect(Project).to receive(:find_by).with({ id: project.id })
perform
end
diff --git a/spec/workers/project_service_worker_spec.rb b/spec/workers/project_service_worker_spec.rb
index 7813d011274..55ec07ff79c 100644
--- a/spec/workers/project_service_worker_spec.rb
+++ b/spec/workers/project_service_worker_spec.rb
@@ -2,26 +2,38 @@
require 'spec_helper'
RSpec.describe ProjectServiceWorker, '#perform' do
- let(:worker) { described_class.new }
- let(:integration) { Integrations::Jira.new }
+ let_it_be(:integration) { create(:jira_integration) }
- before do
- allow(Integration).to receive(:find).and_return(integration)
- end
+ let(:worker) { described_class.new }
it 'executes integration with given data' do
data = { test: 'test' }
- expect(integration).to receive(:execute).with(data)
- worker.perform(1, data)
+ expect_next_found_instance_of(integration.class) do |integration|
+ expect(integration).to receive(:execute).with(data)
+ end
+
+ worker.perform(integration.id, data)
end
it 'logs error messages' do
error = StandardError.new('invalid URL')
- allow(integration).to receive(:execute).and_raise(error)
- expect(Gitlab::ErrorTracking).to receive(:log_exception).with(error, integration_class: 'Integrations::Jira')
+ expect_next_found_instance_of(integration.class) do |integration|
+ expect(integration).to receive(:execute).and_raise(error)
+ expect(integration).to receive(:log_exception).with(error)
+ end
+
+ worker.perform(integration.id, {})
+ end
+
+ context 'when integration cannot be found' do
+ it 'completes silently and does not log an error' do
+ expect(Gitlab::IntegrationsLogger).not_to receive(:error)
- worker.perform(1, {})
+ expect do
+ worker.perform(non_existing_record_id, {})
+ end.not_to raise_error
+ end
end
end
diff --git a/spec/workers/projects/after_import_worker_spec.rb b/spec/workers/projects/after_import_worker_spec.rb
new file mode 100644
index 00000000000..332b547bb66
--- /dev/null
+++ b/spec/workers/projects/after_import_worker_spec.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::AfterImportWorker do
+ include GitHelpers
+
+ subject { worker.perform(project.id) }
+
+ let(:worker) { described_class.new }
+ let(:project) { create(:project, :repository) }
+ let(:repository) { project.repository }
+ let(:sha) { project.commit.sha }
+ let(:housekeeping_service) { double(:housekeeping_service) }
+
+ describe '#execute' do
+ before do
+ allow(Repositories::HousekeepingService)
+ .to receive(:new).with(project).and_return(housekeeping_service)
+
+ allow(housekeeping_service)
+ .to receive(:execute).and_yield
+
+ allow(housekeeping_service).to receive(:increment!)
+ end
+
+ it 'performs housekeeping' do
+ subject
+
+ expect(housekeeping_service).to have_received(:execute)
+ end
+
+ context 'with some refs in refs/pull/**/*' do
+ before do
+ repository.write_ref('refs/pull/1/head', sha)
+ repository.write_ref('refs/pull/1/merge', sha)
+
+ subject
+ end
+
+ it 'removes refs/pull/**/*' do
+ expect(rugged.references.map(&:name))
+ .not_to include(%r{\Arefs/pull/})
+ end
+ end
+
+ Repository::RESERVED_REFS_NAMES.each do |name|
+ context "with a ref in refs/#{name}/tmp" do
+ before do
+ repository.write_ref("refs/#{name}/tmp", sha)
+
+ subject
+ end
+
+ it "does not remove refs/#{name}/tmp" do
+ expect(rugged.references.map(&:name))
+ .to include("refs/#{name}/tmp")
+ end
+ end
+ end
+
+ context 'when after import action throw non-retriable exception' do
+ let(:exception) { StandardError.new('after import error') }
+
+ before do
+ allow_next_instance_of(Repository) do |repository|
+ allow(repository).to receive(:delete_all_refs_except)
+ .and_raise(exception)
+ end
+ end
+
+ it 'throws after import error' do
+ expect { subject }.to raise_exception('after import error')
+ end
+ end
+
+ context 'when housekeeping service lease is taken' do
+ let(:exception) { Repositories::HousekeepingService::LeaseTaken.new }
+
+ it 'logs the error message' do
+ allow_next_instance_of(Repositories::HousekeepingService) do |instance|
+ expect(instance).to receive(:execute).and_raise(exception)
+ end
+
+ expect(Gitlab::Import::Logger).to receive(:info).with(
+ {
+ message: 'Project housekeeping failed',
+ project_full_path: project.full_path,
+ project_id: project.id,
+ 'error.message' => exception.to_s
+ }).and_call_original
+
+ subject
+ end
+ end
+
+ context 'when after import action throw retriable exception one time' do
+ let(:exception) { GRPC::DeadlineExceeded.new }
+
+ it 'removes refs/pull/**/*' do
+ subject
+
+ expect(rugged.references.map(&:name))
+ .not_to include(%r{\Arefs/pull/})
+ end
+
+ it 'records the failures in the database', :aggregate_failures do
+ expect_next_instance_of(Repository) do |repository|
+ expect(repository).to receive(:delete_all_refs_except).and_raise(exception)
+ expect(repository).to receive(:delete_all_refs_except).and_call_original
+ end
+
+ subject
+
+ import_failure = ImportFailure.last
+
+ expect(import_failure.source).to eq('delete_all_refs')
+ expect(import_failure.project_id).to eq(project.id)
+ expect(import_failure.relation_key).to be_nil
+ expect(import_failure.relation_index).to be_nil
+ expect(import_failure.exception_class).to eq('GRPC::DeadlineExceeded')
+ expect(import_failure.exception_message).to be_present
+ 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/inactive_projects_deletion_cron_worker_spec.rb b/spec/workers/projects/inactive_projects_deletion_cron_worker_spec.rb
new file mode 100644
index 00000000000..0e7b4ea504c
--- /dev/null
+++ b/spec/workers/projects/inactive_projects_deletion_cron_worker_spec.rb
@@ -0,0 +1,139 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::InactiveProjectsDeletionCronWorker do
+ include ProjectHelpers
+
+ describe "#perform" do
+ subject(:worker) { described_class.new }
+
+ let_it_be(:admin_user) { create(:user, :admin) }
+ let_it_be(:non_admin_user) { create(:user) }
+ let_it_be(:new_blank_project) do
+ create_project_with_statistics.tap do |project|
+ project.update!(last_activity_at: Time.current)
+ end
+ end
+
+ let_it_be(:inactive_blank_project) do
+ create_project_with_statistics.tap do |project|
+ project.update!(last_activity_at: 13.months.ago)
+ end
+ end
+
+ let_it_be(:inactive_large_project) do
+ create_project_with_statistics(with_data: true, size_multiplier: 2.gigabytes)
+ .tap { |project| project.update!(last_activity_at: 2.years.ago) }
+ end
+
+ let_it_be(:active_large_project) do
+ create_project_with_statistics(with_data: true, size_multiplier: 2.gigabytes)
+ .tap { |project| project.update!(last_activity_at: 1.month.ago) }
+ end
+
+ before do
+ stub_application_setting(inactive_projects_min_size_mb: 5)
+ stub_application_setting(inactive_projects_send_warning_email_after_months: 12)
+ stub_application_setting(inactive_projects_delete_after_months: 14)
+ end
+
+ context 'when delete inactive projects feature is disabled' do
+ before do
+ stub_application_setting(delete_inactive_projects: false)
+ end
+
+ it 'does not invoke Projects::InactiveProjectsDeletionNotificationWorker' do
+ expect(::Projects::InactiveProjectsDeletionNotificationWorker).not_to receive(:perform_in)
+ expect(::Projects::DestroyService).not_to receive(:new)
+
+ worker.perform
+ end
+
+ it 'does not delete the inactive projects' do
+ worker.perform
+
+ expect(inactive_large_project.reload.pending_delete).to eq(false)
+ end
+ end
+
+ context 'when delete inactive projects feature is enabled' do
+ before do
+ stub_application_setting(delete_inactive_projects: true)
+ end
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(inactive_projects_deletion: false)
+ end
+
+ it 'does not invoke Projects::InactiveProjectsDeletionNotificationWorker' do
+ expect(::Projects::InactiveProjectsDeletionNotificationWorker).not_to receive(:perform_in)
+ expect(::Projects::DestroyService).not_to receive(:new)
+
+ worker.perform
+ end
+
+ it 'does not delete the inactive projects' do
+ worker.perform
+
+ expect(inactive_large_project.reload.pending_delete).to eq(false)
+ end
+ end
+
+ context 'when feature flag is enabled', :clean_gitlab_redis_shared_state, :sidekiq_inline do
+ let_it_be(:delay) { anything }
+
+ before do
+ stub_feature_flags(inactive_projects_deletion: true)
+ end
+
+ it 'invokes Projects::InactiveProjectsDeletionNotificationWorker for inactive projects' do
+ Gitlab::Redis::SharedState.with do |redis|
+ expect(redis).to receive(:hset).with('inactive_projects_deletion_warning_email_notified',
+ "project:#{inactive_large_project.id}", Date.current)
+ end
+ expect(::Projects::InactiveProjectsDeletionNotificationWorker).to receive(:perform_in).with(
+ delay, inactive_large_project.id, deletion_date).and_call_original
+ expect(::Projects::DestroyService).not_to receive(:new)
+
+ worker.perform
+ end
+
+ it 'does not invoke InactiveProjectsDeletionNotificationWorker for already notified inactive projects' do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hset('inactive_projects_deletion_warning_email_notified', "project:#{inactive_large_project.id}",
+ Date.current.to_s)
+ end
+
+ expect(::Projects::InactiveProjectsDeletionNotificationWorker).not_to receive(:perform_in)
+ expect(::Projects::DestroyService).not_to receive(:new)
+
+ worker.perform
+ end
+
+ it 'invokes Projects::DestroyService for projects that are inactive even after being notified' do
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.hset('inactive_projects_deletion_warning_email_notified', "project:#{inactive_large_project.id}",
+ 15.months.ago.to_date.to_s)
+ end
+
+ expect(::Projects::InactiveProjectsDeletionNotificationWorker).not_to receive(:perform_in)
+ expect(::Projects::DestroyService).to receive(:new).with(inactive_large_project, admin_user, {})
+ .at_least(:once).and_call_original
+
+ worker.perform
+
+ expect(inactive_large_project.reload.pending_delete).to eq(true)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ expect(redis.hget('inactive_projects_deletion_warning_email_notified',
+ "project:#{inactive_large_project.id}")).to be_nil
+ end
+ end
+ end
+
+ it_behaves_like 'an idempotent worker'
+ end
+ end
+end
diff --git a/spec/workers/projects/inactive_projects_deletion_notification_worker_spec.rb b/spec/workers/projects/inactive_projects_deletion_notification_worker_spec.rb
new file mode 100644
index 00000000000..3ddfec0d346
--- /dev/null
+++ b/spec/workers/projects/inactive_projects_deletion_notification_worker_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::InactiveProjectsDeletionNotificationWorker do
+ describe "#perform" do
+ subject(:worker) { described_class.new }
+
+ let_it_be(:deletion_date) { Date.current }
+ let_it_be(:non_existing_project_id) { non_existing_record_id }
+ let_it_be(:project) { create(:project) }
+
+ it 'invokes NotificationService and calls inactive_project_deletion_warning' do
+ expect_next_instance_of(NotificationService) do |notification|
+ expect(notification).to receive(:inactive_project_deletion_warning).with(project, deletion_date)
+ end
+
+ worker.perform(project.id, deletion_date)
+ end
+
+ it 'adds the project_id to redis key that tracks the deletion warning emails' do
+ worker.perform(project.id, deletion_date)
+
+ Gitlab::Redis::SharedState.with do |redis|
+ expect(redis.hget('inactive_projects_deletion_warning_email_notified',
+ "project:#{project.id}")).to eq(Date.current.to_s)
+ end
+ end
+
+ it 'rescues and logs the exception if project does not exist' do
+ expect(Gitlab::ErrorTracking).to receive(:log_exception).with(instance_of(ActiveRecord::RecordNotFound),
+ { project_id: non_existing_project_id })
+
+ worker.perform(non_existing_project_id, deletion_date)
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:job_args) { [project.id, deletion_date] }
+ end
+ end
+end
diff --git a/spec/workers/projects/record_target_platforms_worker_spec.rb b/spec/workers/projects/record_target_platforms_worker_spec.rb
index eb53e3f8608..01852f252b7 100644
--- a/spec/workers/projects/record_target_platforms_worker_spec.rb
+++ b/spec/workers/projects/record_target_platforms_worker_spec.rb
@@ -7,11 +7,11 @@ RSpec.describe Projects::RecordTargetPlatformsWorker do
let_it_be(:swift) { create(:programming_language, name: 'Swift') }
let_it_be(:objective_c) { create(:programming_language, name: 'Objective-C') }
+ let_it_be(:java) { create(:programming_language, name: 'Java') }
+ let_it_be(:kotlin) { create(:programming_language, name: 'Kotlin') }
let_it_be(:project) { create(:project, :repository, detected_repository_languages: true) }
let(:worker) { described_class.new }
- let(:service_result) { %w(ios osx watchos) }
- let(:service_double) { instance_double(Projects::RecordTargetPlatformsService, execute: service_result) }
let(:lease_key) { "#{described_class.name.underscore}:#{project.id}" }
let(:lease_timeout) { described_class::LEASE_TIMEOUT }
@@ -21,16 +21,20 @@ RSpec.describe Projects::RecordTargetPlatformsWorker do
stub_exclusive_lease(lease_key, timeout: lease_timeout)
end
- shared_examples 'performs detection' do
- it 'creates and executes a Projects::RecordTargetPlatformService instance for the project', :aggregate_failures do
- expect(Projects::RecordTargetPlatformsService).to receive(:new).with(project) { service_double }
+ shared_examples 'performs detection' do |detector_service_class|
+ let(:service_double) { instance_double(detector_service_class, execute: service_result) }
+
+ it "creates and executes a #{detector_service_class} instance for the project", :aggregate_failures do
+ expect(Projects::RecordTargetPlatformsService).to receive(:new)
+ .with(project, detector_service_class) { service_double }
expect(service_double).to receive(:execute)
perform
end
it 'logs extra metadata on done', :aggregate_failures do
- expect(Projects::RecordTargetPlatformsService).to receive(:new).with(project) { service_double }
+ expect(Projects::RecordTargetPlatformsService).to receive(:new)
+ .with(project, detector_service_class) { service_double }
expect(worker).to receive(:log_extra_metadata_on_done).with(:target_platforms, service_result)
perform
@@ -45,19 +49,68 @@ RSpec.describe Projects::RecordTargetPlatformsWorker do
end
end
- context 'when project uses Swift programming language' do
- let!(:repository_language) { create(:repository_language, project: project, programming_language: swift) }
+ def create_language(language)
+ create(:repository_language, project: project, programming_language: language)
+ end
+
+ context 'when project uses programming language for Apple platform' do
+ let(:service_result) { %w(ios osx watchos) }
+
+ context 'when project uses Swift programming language' do
+ before do
+ create_language(swift)
+ end
+
+ it_behaves_like 'performs detection', Projects::AppleTargetPlatformDetectorService
+ end
+
+ context 'when project uses Objective-C programming language' do
+ before do
+ create_language(objective_c)
+ end
- include_examples 'performs detection'
+ it_behaves_like 'performs detection', Projects::AppleTargetPlatformDetectorService
+ end
end
- context 'when project uses Objective-C programming language' do
- let!(:repository_language) { create(:repository_language, project: project, programming_language: objective_c) }
+ context 'when project uses programming language for Android platform' do
+ let(:feature_enabled) { true }
+ let(:service_result) { %w(android) }
+
+ before do
+ stub_feature_flags(detect_android_projects: feature_enabled)
+ end
+
+ context 'when project uses Java' do
+ before do
+ create_language(java)
+ end
+
+ it_behaves_like 'performs detection', Projects::AndroidTargetPlatformDetectorService
+
+ context 'when feature flag is disabled' do
+ let(:feature_enabled) { false }
+
+ it_behaves_like 'does nothing'
+ end
+ end
+
+ context 'when project uses Kotlin' do
+ before do
+ create_language(kotlin)
+ end
+
+ it_behaves_like 'performs detection', Projects::AndroidTargetPlatformDetectorService
- include_examples 'performs detection'
+ context 'when feature flag is disabled' do
+ let(:feature_enabled) { false }
+
+ it_behaves_like 'does nothing'
+ end
+ end
end
- context 'when the project does not contain programming languages for Apple platforms' do
+ context 'when the project does not use programming languages for Apple or Android platforms' do
it_behaves_like 'does nothing'
end
diff --git a/spec/workers/prometheus/create_default_alerts_worker_spec.rb b/spec/workers/prometheus/create_default_alerts_worker_spec.rb
index 887d677c95f..d935bb20a29 100644
--- a/spec/workers/prometheus/create_default_alerts_worker_spec.rb
+++ b/spec/workers/prometheus/create_default_alerts_worker_spec.rb
@@ -5,63 +5,9 @@ require 'spec_helper'
RSpec.describe Prometheus::CreateDefaultAlertsWorker do
let_it_be(:project) { create(:project) }
- let(:worker) { described_class.new }
- let(:logger) { worker.send(:logger) }
- let(:service) { instance_double(Prometheus::CreateDefaultAlertsService) }
- let(:service_result) { ServiceResponse.success }
-
subject { described_class.new.perform(project.id) }
- before do
- allow(Prometheus::CreateDefaultAlertsService)
- .to receive(:new).with(project: project)
- .and_return(service)
- allow(service).to receive(:execute)
- .and_return(service_result)
- end
-
- it_behaves_like 'an idempotent worker' do
- let(:job_args) { [project.id] }
-
- it 'calls the service' do
- expect(service).to receive(:execute)
-
- subject
- end
-
- context 'project is nil' do
- let(:job_args) { [nil] }
-
- it 'does not call the service' do
- expect(service).not_to receive(:execute)
-
- subject
- end
- end
-
- context 'when service returns an error' do
- let(:error_message) { 'some message' }
- let(:service_result) { ServiceResponse.error(message: error_message) }
-
- it 'succeeds and logs the error' do
- expect(logger)
- .to receive(:info)
- .with(a_hash_including('message' => error_message))
- .exactly(worker_exec_times).times
-
- subject
- end
- end
- end
-
- context 'when service raises an exception' do
- let(:error_message) { 'some exception' }
- let(:exception) { StandardError.new(error_message) }
-
- it 're-raises exception' do
- allow(service).to receive(:execute).and_raise(exception)
-
- expect { subject }.to raise_error(exception)
- end
+ it 'does nothing' do
+ expect { subject }.not_to change { PrometheusAlert.count }
end
end
diff --git a/spec/workers/ssh_keys/expired_notification_worker_spec.rb b/spec/workers/ssh_keys/expired_notification_worker_spec.rb
index be38391ff8c..26d9460d73e 100644
--- a/spec/workers/ssh_keys/expired_notification_worker_spec.rb
+++ b/spec/workers/ssh_keys/expired_notification_worker_spec.rb
@@ -16,12 +16,12 @@ RSpec.describe SshKeys::ExpiredNotificationWorker, type: :worker do
let_it_be(:user) { create(:user) }
context 'with a large batch' do
+ let_it_be_with_reload(:keys) { create_list(:key, 20, :expired_today, user: user) }
+
before do
stub_const("SshKeys::ExpiredNotificationWorker::BATCH_SIZE", 5)
end
- let_it_be_with_reload(:keys) { create_list(:key, 20, expires_at: Time.current, user: user) }
-
it 'updates all keys regardless of batch size' do
worker.perform
@@ -30,7 +30,7 @@ RSpec.describe SshKeys::ExpiredNotificationWorker, type: :worker do
end
context 'with expiring key today' do
- let_it_be_with_reload(:expired_today) { create(:key, expires_at: Time.current, user: user) }
+ let_it_be_with_reload(:expired_today) { create(:key, :expired_today, user: user) }
it 'invoke the notification service' do
expect_next_instance_of(Keys::ExpiryNotificationService) do |expiry_service|
@@ -52,7 +52,7 @@ RSpec.describe SshKeys::ExpiredNotificationWorker, type: :worker do
end
context 'when key has expired in the past' do
- let_it_be(:expired_past) { create(:key, expires_at: 1.day.ago, user: user) }
+ let_it_be(:expired_past) { create(:key, :expired, user: user) }
it 'does not update notified column' do
expect { worker.perform }.not_to change { expired_past.reload.expiry_notification_delivered_at }
@@ -60,7 +60,7 @@ RSpec.describe SshKeys::ExpiredNotificationWorker, type: :worker do
context 'when key has already been notified of expiration' do
before do
- expired_past.update!(expiry_notification_delivered_at: 1.day.ago)
+ expired_past.update_attribute(:expiry_notification_delivered_at, 1.day.ago)
end
it 'does not update notified column' do
diff --git a/spec/workers/ssh_keys/expiring_soon_notification_worker_spec.rb b/spec/workers/ssh_keys/expiring_soon_notification_worker_spec.rb
index 0a1d4a14ad0..e907d035020 100644
--- a/spec/workers/ssh_keys/expiring_soon_notification_worker_spec.rb
+++ b/spec/workers/ssh_keys/expiring_soon_notification_worker_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe SshKeys::ExpiringSoonNotificationWorker, type: :worker do
end
context 'when key has expired in the past' do
- let_it_be(:expired_past) { create(:key, expires_at: 1.day.ago, user: user) }
+ let_it_be(:expired_past) { create(:key, :expired, user: user) }
it 'does not update notified column' do
expect { worker.perform }.not_to change { expired_past.reload.before_expiry_notification_delivered_at }
diff --git a/tooling/bin/find_change_diffs b/tooling/bin/find_change_diffs
index 7857945ea74..b28b20df0f4 100755
--- a/tooling/bin/find_change_diffs
+++ b/tooling/bin/find_change_diffs
@@ -33,6 +33,8 @@ end
Gitlab.merge_request_changes(mr_project_path, mr_iid).changes.each do |change|
next if change['diff'].empty?
- output_diffs_dir.join(File.dirname(change['new_path'])).mkpath
- output_diffs_dir.join("#{change['new_path']}.diff").write(change['diff'])
+ ext = change['deleted_file'] ? ".deleted.diff" : ".diff"
+ new_path = output_diffs_dir.join("#{change['new_path']}#{ext}")
+ new_path.dirname.mkpath
+ new_path.write(change['diff'])
end
diff --git a/tooling/bin/find_codeowners b/tooling/bin/find_codeowners
new file mode 100755
index 00000000000..2c028b3162e
--- /dev/null
+++ b/tooling/bin/find_codeowners
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# frozen_string_literal: true
+
+require_relative '../lib/tooling/find_codeowners'
+
+Tooling::FindCodeowners.new.execute
diff --git a/tooling/config/CODEOWNERS.yml b/tooling/config/CODEOWNERS.yml
new file mode 100644
index 00000000000..d867c8c22fc
--- /dev/null
+++ b/tooling/config/CODEOWNERS.yml
@@ -0,0 +1,58 @@
+# This is supposed to be used with:
+# tooling/bin/find_codeowners tooling/config/CODEOWNERS.yml
+# And paste the contents into .gitlab/CODEOWNERS
+
+'[Authentication and Authorization]':
+ '@gitlab-org/manage/authentication-and-authorization':
+ allow:
+ keywords:
+ - password
+ - auth
+ - token
+ patterns:
+ - '/{,ee/}app/**/*%{keyword}*{/**/*,}'
+ - '/{,ee/}config/**/*%{keyword}*{/**/*,}'
+ - '/{,ee/}lib/**/*%{keyword}*{/**/*,}'
+ deny:
+ keywords:
+ - author.
+ - author_
+ - authored
+ - authoring
+ - .png
+ - .svg
+ - deploy_token
+ - runner{,s}_token
+ - job_token
+ - autocomplete_tokens
+ - dast_site_token
+ - reset_prometheus_token
+ - reset_registration_token
+ - runners_registration_token
+ - terraform_registry_token
+ - tokenizer
+ - filtered_search
+ - /alert_management/
+ - /analytics/
+ - /bitbucket/
+ - /clusters/
+ - /clusters_list/
+ - /dast/
+ - /dast_profiles/
+ - /dast_site_tokens/
+ - /dast_site_validation/
+ - /dependency_proxy/
+ - /error_tracking/
+ - /google_api/
+ - /google_cloud/
+ - /jira_connect/
+ - /kubernetes/
+ - /protected_environments/
+ - /config/feature_flags/development/jira_connect_
+ - /config/metrics/
+ - /app/controllers/groups/dependency_proxy_auth_controller.rb
+ - /app/finders/ci/auth_job_finder.rb
+ - /ee/config/metrics/
+ - /lib/gitlab/conan_token.rb
+ patterns:
+ - '**/*%{keyword}*{/**/*,}'
diff --git a/tooling/danger/project_helper.rb b/tooling/danger/project_helper.rb
index fc87498f5d0..c0afd9b7319 100644
--- a/tooling/danger/project_helper.rb
+++ b/tooling/danger/project_helper.rb
@@ -26,6 +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{\Adata/deprecations/} => :none,
%r{\Adata/removals/} => :none,
@@ -100,6 +101,8 @@ module Tooling
%r{\A\.editorconfig\z} => :tooling,
%r{Dangerfile\z} => :tooling,
%r{\A((ee|jh)/)?(danger/|tooling/danger/)} => :tooling,
+ %r{\A((ee|jh)/)?(lib/)?scripts/.*\.rb} => [:backend, :tooling],
+ %r{\A((ee|jh)/)?(lib/)?scripts/.*\.js} => [:frontend, :tooling],
%r{\A((ee|jh)/)?scripts/} => :tooling,
%r{\Atooling/} => :tooling,
%r{(CODEOWNERS)} => :tooling,
diff --git a/tooling/danger/specs.rb b/tooling/danger/specs.rb
index 466230bb86b..36ec83dd7d2 100644
--- a/tooling/danger/specs.rb
+++ b/tooling/danger/specs.rb
@@ -5,7 +5,7 @@ module Tooling
module Specs
SPEC_FILES_REGEX = 'spec/'
EE_PREFIX = 'ee/'
- MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[)/.freeze
+ MATCH_WITH_ARRAY_REGEX = /(?<to>to\(?\s*)(?<matcher>match|eq)(?<expectation>[( ]?\[[^\]]+)/.freeze
SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
```suggestion
%<suggested_line>s
diff --git a/tooling/lib/tooling/find_codeowners.rb b/tooling/lib/tooling/find_codeowners.rb
new file mode 100644
index 00000000000..35d8a9d7461
--- /dev/null
+++ b/tooling/lib/tooling/find_codeowners.rb
@@ -0,0 +1,103 @@
+# frozen_string_literal: true
+
+require 'yaml'
+
+module Tooling
+ class FindCodeowners
+ def execute
+ load_definitions.each do |section, group_defintions|
+ puts section
+
+ group_defintions.each do |group, list|
+ matched_files = git_ls_files.each_line.select do |line|
+ list[:allow].find do |pattern|
+ path = "/#{line.chomp}"
+
+ path_matches?(pattern, path) &&
+ list[:deny].none? { |pattern| path_matches?(pattern, path) }
+ end
+ end
+
+ consolidated = consolidate_paths(matched_files)
+ consolidated_again = consolidate_paths(consolidated)
+
+ # Consider the directory structure is a tree structure:
+ # https://en.wikipedia.org/wiki/Tree_(data_structure)
+ # After we consolidated the leaf entries, it could be possible that
+ # we can consolidate further for the new leaves. Repeat this
+ # process until we see no improvements.
+ while consolidated_again.size < consolidated.size
+ consolidated = consolidated_again
+ consolidated_again = consolidate_paths(consolidated)
+ end
+
+ consolidated.each do |file|
+ puts "/#{file.chomp} #{group}"
+ end
+ end
+ end
+ end
+
+ def load_definitions
+ result = load_config
+
+ result.each do |section, group_defintions|
+ group_defintions.each do |group, definitions|
+ definitions.transform_values! do |rules|
+ rules[:keywords].flat_map do |keyword|
+ rules[:patterns].map do |pattern|
+ pattern % { keyword: keyword }
+ end
+ end
+ end
+ end
+ end
+
+ result
+ end
+
+ def load_config
+ config_path = "#{__dir__}/../../config/CODEOWNERS.yml"
+
+ if YAML.respond_to?(:safe_load_file) # Ruby 3.0+
+ YAML.safe_load_file(config_path, symbolize_names: true)
+ else
+ YAML.safe_load(File.read(config_path), symbolize_names: true)
+ end
+ end
+
+ # Copied and modified from ee/lib/gitlab/code_owners/file.rb
+ def path_matches?(pattern, path)
+ # `FNM_DOTMATCH` makes sure we also match files starting with a `.`
+ # `FNM_PATHNAME` makes sure ** matches path separators
+ flags = ::File::FNM_DOTMATCH | ::File::FNM_PATHNAME
+
+ # BEGIN extension
+ flags |= ::File::FNM_EXTGLOB
+ # END extension
+
+ ::File.fnmatch?(pattern, path, flags)
+ end
+
+ def consolidate_paths(matched_files)
+ matched_files.group_by(&File.method(:dirname)).flat_map do |dir, files|
+ # First line is the dir itself
+ if find_dir_maxdepth_1(dir).lines.drop(1).sort == files.sort
+ "#{dir}\n"
+ else
+ files
+ end
+ end.sort
+ end
+
+ private
+
+ def find_dir_maxdepth_1(dir)
+ `find #{dir} -maxdepth 1`
+ end
+
+ def git_ls_files
+ @git_ls_files ||= `git ls-files`
+ end
+ end
+end
diff --git a/tooling/quality/test_level.rb b/tooling/quality/test_level.rb
index fd86708bb7d..6e58241bccb 100644
--- a/tooling/quality/test_level.rb
+++ b/tooling/quality/test_level.rb
@@ -139,8 +139,7 @@ module Quality
case level
when :migration
"{#{migration_and_background_migration_folders.join(',')}}"
- # Geo specs aren't in a specific folder, but they all have the :geo tag, so we must search for them globally
- when :all, :geo
+ when :all
'**'
else
"{#{TEST_LEVEL_FOLDERS.fetch(level).join(',')}}"
@@ -151,8 +150,7 @@ module Quality
case level
when :migration
"(#{migration_and_background_migration_folders.join('|')})"
- # Geo specs aren't in a specific folder, but they all have the :geo tag, so we must search for them globally
- when :all, :geo
+ when :all
''
else
"(#{TEST_LEVEL_FOLDERS.fetch(level).join('|')})"
diff --git a/vendor/project_templates/cluster_management.tar.gz b/vendor/project_templates/cluster_management.tar.gz
index 843a8a355f1..428d217a447 100644
--- a/vendor/project_templates/cluster_management.tar.gz
+++ b/vendor/project_templates/cluster_management.tar.gz
Binary files differ
diff --git a/workhorse/.tool-versions b/workhorse/.tool-versions
index 108bdd0f6a5..c90984122a3 100644
--- a/workhorse/.tool-versions
+++ b/workhorse/.tool-versions
@@ -1 +1 @@
-golang 1.17.7
+golang 1.17.9
diff --git a/workhorse/Makefile b/workhorse/Makefile
index 44b3e2b8248..fe9bf639753 100644
--- a/workhorse/Makefile
+++ b/workhorse/Makefile
@@ -1,4 +1,6 @@
PREFIX=/usr/local
+
+FIPS_MODE ?= 0
PKG := gitlab.com/gitlab-org/gitlab/workhorse
BUILD_DIR ?= $(CURDIR)
TARGET_DIR ?= $(BUILD_DIR)/_build
@@ -19,6 +21,14 @@ EXE_ALL := gitlab-resize-image gitlab-zip-cat gitlab-zip-metadata gitlab-workhor
INSTALL := install
BUILD_TAGS := tracer_static tracer_static_jaeger continuous_profiler_stackdriver
+ifeq (${FIPS_MODE}, 1)
+ # boringcrypto tag is added automatically by golang-fips compiler
+ BUILD_TAGS += fips
+ # If the golang-fips compiler is built with CGO_ENABLED=0, this needs to be
+ # explicitly switched on.
+ export CGO_ENABLED=1
+endif
+
MINIMUM_SUPPORTED_GO_VERSION := 1.11
export GOBIN := $(TARGET_DIR)/bin
diff --git a/workhorse/config.toml.example b/workhorse/config.toml.example
index 27dc29ee078..1457e20ed88 100644
--- a/workhorse/config.toml.example
+++ b/workhorse/config.toml.example
@@ -20,3 +20,13 @@ URL = "unix:/home/git/gitlab/redis/redis.socket"
[image_resizer]
max_scaler_procs = 4 # Recommendation: CPUs / 2
max_filesize = 250000
+
+[[listeners]]
+ network = "tcp"
+ addr = "127.0.0.1:3443"
+
+[listeners.tls]
+ certificate = "/path/to/certificate"
+ key = "/path/to/private/key"
+ min_version = "tls1.2"
+ max_version = "tls1.3"
diff --git a/workhorse/config_test.go b/workhorse/config_test.go
index 658a352a333..0c0072322ac 100644
--- a/workhorse/config_test.go
+++ b/workhorse/config_test.go
@@ -39,6 +39,14 @@ password = "redis password"
provider = "test provider"
[image_resizer]
max_scaler_procs = 123
+[[listeners]]
+network = "tcp"
+addr = "localhost:3443"
+[listeners.tls]
+certificate = "/path/to/certificate"
+key = "/path/to/private/key"
+min_version = "tls1.1"
+max_version = "tls1.2"
`
_, err = io.WriteString(f, data)
require.NoError(t, err)
@@ -57,6 +65,15 @@ max_scaler_procs = 123
require.Equal(t, []string{"127.0.0.1/8", "192.168.0.1/8"}, cfg.TrustedCIDRsForXForwardedFor)
require.Equal(t, []string{"10.0.0.1/8"}, cfg.TrustedCIDRsForPropagation)
require.Equal(t, 60*time.Second, cfg.ShutdownTimeout.Duration)
+
+ require.Len(t, cfg.Listeners, 1)
+ listener := cfg.Listeners[0]
+ require.Equal(t, "/path/to/certificate", listener.Tls.Certificate)
+ require.Equal(t, "/path/to/private/key", listener.Tls.Key)
+ require.Equal(t, "tls1.1", listener.Tls.MinVersion)
+ require.Equal(t, "tls1.2", listener.Tls.MaxVersion)
+ require.Equal(t, "tcp", listener.Network)
+ require.Equal(t, "localhost:3443", listener.Addr)
}
func TestConfigErrorHelp(t *testing.T) {
diff --git a/workhorse/gitaly_integration_test.go b/workhorse/gitaly_integration_test.go
index 95e0a03ab6b..b6842808480 100644
--- a/workhorse/gitaly_integration_test.go
+++ b/workhorse/gitaly_integration_test.go
@@ -16,7 +16,6 @@ import (
"strings"
"testing"
- "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
@@ -54,12 +53,13 @@ func realGitalyOkBody(t *testing.T) *api.Response {
return realGitalyAuthResponse(gitOkBody(t))
}
-func realGitalyOkBodyWithSidechannel(t *testing.T) *api.Response {
- return realGitalyAuthResponse(gitOkBodyWithSidechannel(t))
-}
-
func ensureGitalyRepository(t *testing.T, apiResponse *api.Response) error {
- ctx, namespace, err := gitaly.NewNamespaceClient(context.Background(), apiResponse.GitalyServer)
+ ctx, namespace, err := gitaly.NewNamespaceClient(
+ context.Background(),
+ apiResponse.GitalyServer,
+ gitaly.WithFeatures(apiResponse.GitalyServer.Features),
+ )
+
if err != nil {
return err
}
@@ -88,18 +88,10 @@ func ensureGitalyRepository(t *testing.T, apiResponse *api.Response) error {
}
func TestAllowedClone(t *testing.T) {
- testAllowedClone(t, realGitalyOkBody(t))
-}
-
-func TestAllowedCloneWithSidechannel(t *testing.T) {
- gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
- testAllowedClone(t, realGitalyOkBodyWithSidechannel(t))
-}
-
-func testAllowedClone(t *testing.T, apiResponse *api.Response) {
skipUnlessRealGitaly(t)
// Create the repository in the Gitaly server
+ apiResponse := realGitalyOkBody(t)
require.NoError(t, ensureGitalyRepository(t, apiResponse))
// Prepare test server and backend
@@ -120,18 +112,10 @@ func testAllowedClone(t *testing.T, apiResponse *api.Response) {
}
func TestAllowedShallowClone(t *testing.T) {
- testAllowedShallowClone(t, realGitalyOkBody(t))
-}
-
-func TestAllowedShallowCloneWithSidechannel(t *testing.T) {
- gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
- testAllowedShallowClone(t, realGitalyOkBodyWithSidechannel(t))
-}
-
-func testAllowedShallowClone(t *testing.T, apiResponse *api.Response) {
skipUnlessRealGitaly(t)
// Create the repository in the Gitaly server
+ apiResponse := realGitalyOkBody(t)
require.NoError(t, ensureGitalyRepository(t, apiResponse))
// Prepare test server and backend
diff --git a/workhorse/gitaly_test.go b/workhorse/gitaly_test.go
index 4ace925001a..38e807f45cc 100644
--- a/workhorse/gitaly_test.go
+++ b/workhorse/gitaly_test.go
@@ -5,7 +5,6 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
- "io"
"io/ioutil"
"math/rand"
"net"
@@ -21,19 +20,14 @@ import (
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
- "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
- "google.golang.org/grpc/credentials/insecure"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
- gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
-
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/git"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
)
@@ -45,7 +39,7 @@ func TestFailedCloneNoGitaly(t *testing.T) {
GL_ID: "user-123",
GL_USERNAME: "username",
// This will create a failure to connect to Gitaly
- GitalyServer: gitaly.Server{Address: "unix:/nonexistent"},
+ GitalyServer: api.GitalyServer{Address: "unix:/nonexistent"},
}
// Prepare test server and backend
@@ -380,24 +374,14 @@ func TestPostReceivePackRouting(t *testing.T) {
}
}
-type gitalyServerStarter func(*testing.T, codes.Code) (*combinedServer, string)
-
// ReaderFunc is an adapter to turn a conforming function into an io.Reader.
type ReaderFunc func(b []byte) (int, error)
func (r ReaderFunc) Read(b []byte) (int, error) { return r(b) }
func TestPostUploadPackProxiedToGitalySuccessfully(t *testing.T) {
- testPostUploadPackProxiedToGitalySuccessfully(t, startGitalyServer, gitOkBody(t))
-}
-
-func TestPostUploadPackWithSidechannelProxiedToGitalySuccessfully(t *testing.T) {
- testPostUploadPackProxiedToGitalySuccessfully(
- t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), gitOkBodyWithSidechannel(t),
- )
-}
+ apiResponse := gitOkBody(t)
-func testPostUploadPackProxiedToGitalySuccessfully(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
for i, tc := range []struct {
showAllRefs bool
code codes.Code
@@ -410,7 +394,7 @@ func testPostUploadPackProxiedToGitalySuccessfully(t *testing.T, startGitaly git
t.Run(fmt.Sprintf("Case %d", i), func(t *testing.T) {
apiResponse.ShowAllRefs = tc.showAllRefs
- gitalyServer, socketPath := startGitaly(t, tc.code)
+ gitalyServer, socketPath := startGitalyServer(t, tc.code)
defer gitalyServer.GracefulStop()
apiResponse.GitalyServer.Address = "unix:" + socketPath
@@ -476,16 +460,8 @@ func testPostUploadPackProxiedToGitalySuccessfully(t *testing.T, startGitaly git
func TestPostUploadPackProxiedToGitalyInterrupted(t *testing.T) {
apiResponse := gitOkBody(t)
- testPostUploadPackProxiedToGitalyInterrupted(t, startGitalyServer, apiResponse)
-}
-
-func TestPostUploadPackWithSidechannelProxiedToGitalyInterrupted(t *testing.T) {
- apiResponse := gitOkBodyWithSidechannel(t)
- testPostUploadPackProxiedToGitalyInterrupted(t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), apiResponse)
-}
-func testPostUploadPackProxiedToGitalyInterrupted(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
- gitalyServer, socketPath := startGitaly(t, codes.OK)
+ gitalyServer, socketPath := startGitalyServer(t, codes.OK)
defer gitalyServer.GracefulStop()
apiResponse.GitalyServer.Address = "unix:" + socketPath
@@ -518,16 +494,7 @@ func testPostUploadPackProxiedToGitalyInterrupted(t *testing.T, startGitaly gita
func TestPostUploadPackRouting(t *testing.T) {
apiResponse := gitOkBody(t)
- testPostUploadPackRouting(t, startGitalyServer, apiResponse)
-}
-
-func TestPostUploadPackWithSidechannelRouting(t *testing.T) {
- apiResponse := gitOkBodyWithSidechannel(t)
- testPostUploadPackRouting(t, startGitalyServerWithSideChannel(testhelper.PostUploadPackWithSidechannel), apiResponse)
-}
-
-func testPostUploadPackRouting(t *testing.T, startGitaly gitalyServerStarter, apiResponse *api.Response) {
- gitalyServer, socketPath := startGitaly(t, codes.OK)
+ gitalyServer, socketPath := startGitalyServer(t, codes.OK)
defer gitalyServer.GracefulStop()
apiResponse.GitalyServer.Address = "unix:" + socketPath
@@ -888,7 +855,7 @@ func startGitalyServer(t *testing.T, finalMessageCode codes.Code) (*combinedServ
if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
t.Fatal(err)
}
- server := grpc.NewServer()
+ server := grpc.NewServer(testhelper.WithSidechannel())
listener, err := net.Listen("unix", socketPath)
require.NoError(t, err)
@@ -902,21 +869,3 @@ func startGitalyServer(t *testing.T, finalMessageCode codes.Code) (*combinedServ
return &combinedServer{Server: server, GitalyTestServer: gitalyServer}, socketPath
}
-
-func startGitalyServerWithSideChannel(handler func(interface{}, grpc.ServerStream, io.ReadWriteCloser) error) gitalyServerStarter {
- return func(t *testing.T, finalMessageCode codes.Code) (*combinedServer, string) {
- socketPath := path.Join(scratchDir, fmt.Sprintf("gitaly-%d.sock", rand.Int()))
- if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
- t.Fatal(err)
- }
- server := grpc.NewServer(gitalyclient.TestSidechannelServer(logrus.NewEntry(logrus.StandardLogger()), insecure.NewCredentials(), handler)...)
- listener, err := net.Listen("unix", socketPath)
- require.NoError(t, err)
-
- gitalyServer := testhelper.NewGitalyServer(finalMessageCode)
-
- go server.Serve(listener)
-
- return &combinedServer{Server: server, GitalyTestServer: gitalyServer}, socketPath
- }
-}
diff --git a/workhorse/go.mod b/workhorse/go.mod
index 83bdcd0b5bb..01dc6e468bc 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -8,7 +8,6 @@ require (
github.com/FZambia/sentinel v1.0.0
github.com/alecthomas/chroma v0.7.3
github.com/aws/aws-sdk-go v1.38.35
- github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 // indirect
github.com/disintegration/imaging v1.6.2
github.com/getsentry/raven-go v0.2.0
github.com/golang-jwt/jwt/v4 v4.0.0
@@ -21,22 +20,22 @@ require (
github.com/johannesboyne/gofakes3 v0.0.0-20200510090907-02d71f533bec
github.com/jpillora/backoff v1.0.0
github.com/mitchellh/copystructure v1.0.0
- github.com/prometheus/client_golang v1.10.0
+ github.com/prometheus/client_golang v1.12.1
github.com/rafaeljusto/redigomock v0.0.0-20190202135759-257e089e14a1
github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 // indirect
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.9.0-rc5.0.20220329111719-51da8bc17059
+ gitlab.com/gitlab-org/gitaly/v14 v14.10.0-rc1.0.20220426135705-ccfab390f7c3
gitlab.com/gitlab-org/golang-archive-zip v0.1.1
- gitlab.com/gitlab-org/labkit v1.6.0
+ gitlab.com/gitlab-org/labkit v1.14.0
gocloud.dev v0.23.0
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8
- golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5
- golang.org/x/net v0.0.0-20210505214959-0714010a04ed
- golang.org/x/tools v0.1.0
- google.golang.org/grpc v1.38.0
- gopkg.in/DataDog/dd-trace-go.v1 v1.31.0 // indirect
+ golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
+ golang.org/x/net v0.0.0-20211008194852-3b03d305991f
+ golang.org/x/tools v0.1.5
+ google.golang.org/grpc v1.40.0
+ google.golang.org/protobuf v1.27.1
honnef.co/go/tools v0.1.3
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index 1cb7418d3c1..ed959f44889 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -21,8 +21,13 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
+cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
+cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
+cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
+cloud.google.com/go v0.92.2 h1:podK44+0gcW5rWGMjJiPH0+rzkCTQx/zT0qF5CLqVkM=
+cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@@ -32,6 +37,8 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo=
+cloud.google.com/go/profiler v0.1.0 h1:MG/rxKC1MztRfEWMGYKFISxyZak5hNh29f0A/z2tvWk=
+cloud.google.com/go/profiler v0.1.0/go.mod h1:D7S7LV/zKbRWkOzYL1b5xytpqt8Ikd/v/yvf1/Tx2pQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -44,6 +51,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.15.0 h1:Ljj+ZXVEhCr/1+4ZhvtteN1ND7UUsNTlduGclLh8GO0=
cloud.google.com/go/storage v1.15.0/go.mod h1:mjjQMoxxyGH7Jr8K5qrx6N2O0AHsczI61sMNn03GIZI=
+cloud.google.com/go/trace v0.1.0 h1:nUGUK79FOkN0UGUXhBmVBkbu1PYsHe0YyFSPLOD9Npg=
+cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g=
contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc=
contrib.go.opencensus.io/exporter/stackdriver v0.13.8 h1:lIFYmQsqejvlq+GobFUbC5F0prD5gvhP6r0gWLZRDq4=
@@ -100,19 +109,24 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd
github.com/DataDog/datadog-go v4.4.0+incompatible h1:R7WqXWP4fIOAqWJtUKmSfuc7eDsBT58k9AY5WSHVosk=
github.com/DataDog/datadog-go v4.4.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
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/GoogleCloudPlatform/cloudsql-proxy v1.22.0/go.mod h1:mAm5O/zik2RFmcpigNjg6nMotDL8ZXJaxKzgGVcSMFA=
-github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I=
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
+github.com/HdrHistogram/hdrhistogram-go v1.1.1 h1:cJXY5VLMHgejurPjZH6Fo9rIwRGLefBGdiaENZALqrg=
+github.com/HdrHistogram/hdrhistogram-go v1.1.1/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM=
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/Microsoft/go-winio v0.4.19 h1:ZMZG0O5M8bhD0lgCURV8yu3hQ7TGvQ4L1ZW8+J0j9iE=
github.com/Microsoft/go-winio v0.4.19/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
+github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU=
+github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
@@ -139,6 +153,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
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/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=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -172,10 +187,13 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/certifi/gocertifi v0.0.0-20180905225744-ee1a9a0726d2/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4=
-github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
-github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
-github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s=
+github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
+github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
+github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -190,6 +208,7 @@ github.com/cloudflare/tableflip v1.2.2/go.mod h1:P4gRehmV6Z2bY5ao5ml9Pd8u6kuEnlB
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
@@ -248,6 +267,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
@@ -271,11 +291,13 @@ github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49P
github.com/getsentry/sentry-go v0.5.1/go.mod h1:B8H7x8TYDPkeWPRzGpIiFO97LZP6rL8A3hEt8lUItMw=
github.com/getsentry/sentry-go v0.7.0/go.mod h1:pLFpD2Y5RHIKF9Bw3KH6/68DeN2K/XBJd8awjdPnUwg=
github.com/getsentry/sentry-go v0.10.0/go.mod h1:kELm/9iCblqUYh+ZRML7PNdCvEuw24wBvJPYyi86cws=
+github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M=
+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/gitobj/v2 v2.0.1/go.mod h1:q6aqxl6Uu3gWsip5GEKpw+7459F97er8COmU45ncAxw=
github.com/git-lfs/go-netrc v0.0.0-20180525200031-e0e9ca483a18/go.mod h1:70O4NAtvWn1jW8V8V+OKrJJYcxDLTmIozfi2fmSz5SI=
@@ -309,6 +331,7 @@ github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvSc
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
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=
@@ -331,6 +354,8 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+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 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
@@ -352,8 +377,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -389,19 +415,23 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/go-replayers/grpcreplay v1.0.0 h1:B5kVOzJ1hBgnevTgIWhSTatQ3608yu/2NnU0Ta1d0kY=
github.com/google/go-replayers/grpcreplay v1.0.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE=
github.com/google/go-replayers/httpreplay v0.1.2 h1:HCfx+dQzwN9XbGTHF8qJ+67WN8glL9FTWV5rraCJ/jU=
github.com/google/go-replayers/httpreplay v0.1.2/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE=
github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
@@ -414,8 +444,12 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210125172800-10e9aeb4a998/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5 h1:zIaiqGYDQwa4HVx5wGRTXbx38Pqxjemn4BP98wpzpXo=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210804190019-f964ff605595 h1:uNrRgpnKjTfxu4qHaZAAs3eKTYV1EzGF3dAykpnxgDE=
+github.com/google/pprof v0.0.0-20210804190019-f964ff605595/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
@@ -446,6 +480,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -548,8 +583,9 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jteeuwen/go-bindata v3.0.8-0.20180305030458-6025e8de665b+incompatible/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
@@ -596,6 +632,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
+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/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -613,14 +650,17 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a8dfcb80d3a7/go.mod h1:Spd59icnvRxSKuyijbbwe5AemzvcyXAUBgApa7VybMw=
github.com/lightstep/lightstep-tracer-go v0.15.6/go.mod h1:6AMpwZpsyCFwSovxzM78e+AsYxE8sGwiM6C3TytaWeI=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
-github.com/lightstep/lightstep-tracer-go v0.24.0 h1:qGUbkzHP64NA9r+uIbCvf303IzHPr0M4JlkaDMxXqqk=
github.com/lightstep/lightstep-tracer-go v0.24.0/go.mod h1:RnONwHKg89zYPmF+Uig5PpHMUcYCFgml8+r4SS53y7A=
+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.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.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=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI=
github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
@@ -629,8 +669,9 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
-github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
+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-shellwords v0.0.0-20190425161501-2444a32a19f4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
@@ -664,6 +705,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
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=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
@@ -720,8 +762,9 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
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=
-github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
+github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ=
+github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
@@ -740,8 +783,10 @@ github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.10.0 h1:/o0BDeWzLWXNZ+4q5gXltUvaMpJqckTa+jTNoB+z4cg=
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_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=
@@ -753,19 +798,23 @@ github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.18.0 h1:WCVKW7aL6LEe1uryfI9dnEc2ZqNB1Fn0ok930v0iL1Y=
github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
+github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
-github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
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/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=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
@@ -796,6 +845,8 @@ github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 h1:WnNuhiq+F
github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500/go.mod h1:+njLrG5wSeoG4Ds61rFgEzKvenR2UHbjMoDHsczxly0=
github.com/shirou/gopsutil v2.20.1+incompatible h1:oIq9Cq4i84Hk8uQAUOG3eNdI/29hBawGrD5YRl6JRDY=
github.com/shirou/gopsutil v2.20.1+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/gopsutil/v3 v3.21.2 h1:fIOk3hyqV1oGKogfGNjUZa0lUbtlkx3+ZT0IoJth2uM=
+github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw=
github.com/shogo82148/go-shuffle v0.0.0-20170808115208-59829097ff3b/go.mod h1:2htx6lmL0NGLHlO8ZCf+lQBGBHIbEujyywxJArf+2Yc=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
@@ -815,6 +866,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
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 v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -845,11 +897,16 @@ github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDW
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
+github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M=
+github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek=
+github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc=
+github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
-github.com/uber/jaeger-client-go v2.27.0+incompatible h1:6WVONolFJiB8Vx9bq4z9ddyV/SXSpfvvtb7Yl/TGHiE=
github.com/uber/jaeger-client-go v2.27.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
+github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4=
+github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
@@ -864,6 +921,7 @@ github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKn
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
+github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
@@ -881,13 +939,14 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
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/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.9.0-rc5.0.20220329111719-51da8bc17059 h1:X7+3GQIxUpScXpIMCU5+sfpYvZyBIQ3GMlEosP7Jssw=
-gitlab.com/gitlab-org/gitaly/v14 v14.9.0-rc5.0.20220329111719-51da8bc17059/go.mod h1:uX1qhFKBDuPqATlpMcFL2dKDiX8D/tbUg7CYWx7OXt4=
+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/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=
@@ -897,8 +956,8 @@ gitlab.com/gitlab-org/labkit v0.0.0-20200908084045-45895e129029/go.mod h1:SNfxkf
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.6.0 h1:Qgk+W+N0cujGBmZSjMqvM+4qIEjl7VgIK4nxlQO0RlA=
-gitlab.com/gitlab-org/labkit v1.6.0/go.mod h1:1ZuVZpjSpCKUgjLx8P6jzkkQFxJI1thUKr6yKV3p0vY=
+gitlab.com/gitlab-org/labkit v1.14.0 h1:LSrvHgybidPyH8fHnsy1GBghrLR4kFObFrtZwUfCgAI=
+gitlab.com/gitlab-org/labkit v1.14.0/go.mod h1:bcxc4ZpAC+WyACgyKl7FcvT2XXAbl8CrzN6UY+w8cMc=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
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=
@@ -913,6 +972,7 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -957,8 +1017,9 @@ golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
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=
@@ -989,8 +1050,9 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
@@ -1054,10 +1116,13 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210420210106-798c2154c571/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210505214959-0714010a04ed h1:V9kAVxLvz1lkufatrpHuUVyJ/5tR3Ms7rk951P4mI98=
golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211008194852-3b03d305991f h1:1scJEYZBaF48BaG6tYbtxmLcXqwYGSfGcMoStTqkkIw=
+golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
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=
@@ -1071,8 +1136,11 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c h1:SgVl/sCtkicsS7psKkje4H9YtjdEl3xsYh7N+5TDHqY=
golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a h1:4Kd8OPUx1xgUwrHDaviWZO8MsgoZTZYC3g+8m16RBww=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
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=
@@ -1148,6 +1216,7 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1155,15 +1224,27 @@ golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211102192858-4dd72447c267 h1:7zYaz3tjChtpayGDzu6H0hDAUM5zIGA2XW7kRNgQ0jc=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/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-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
+golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1173,14 +1254,17 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
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-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=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
+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-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs=
+golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/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=
@@ -1248,8 +1332,13 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+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/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=
@@ -1288,8 +1377,13 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA=
-google.golang.org/api v0.46.0 h1:jkDWHOBIoNSD0OQpq4rtBVu+Rh325MPjXG1rakAp8JU=
google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I=
+google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
+google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
+google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
+google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
+google.golang.org/api v0.54.0 h1:ECJUVngj71QI6XEm7b1sAf8BljU5inEhMbKPR8Lxhhk=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -1327,6 +1421,7 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
@@ -1349,8 +1444,18 @@ google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQ
google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/genproto v0.0.0-20210423144448-3a41ef94ed2b/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
-google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2 h1:pl8qT5D+48655f14yDURpIZwSPvMWuuekfAP+gxtjvk=
google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
+google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c h1:iLQakcwWG3k/++1q/46apVb1sUQ3IqIdn9yUE6eh/xA=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
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=
@@ -1371,14 +1476,20 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
+google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -1390,12 +1501,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/DataDog/dd-trace-go.v1 v1.7.0/go.mod h1:DVp8HmDh8PuTu2Z0fVVlBsyWaC++fzwVCaGWylTe3tg=
gopkg.in/DataDog/dd-trace-go.v1 v1.30.0/go.mod h1:SnKViq44dv/0gjl9RpkP0Y2G3BJSRkp6eYdCSu39iI8=
-gopkg.in/DataDog/dd-trace-go.v1 v1.31.0 h1:ouY+DNlRTckk63TNh468tPWBC21qBZPniVQXQs0iq10=
-gopkg.in/DataDog/dd-trace-go.v1 v1.31.0/go.mod h1:SnKViq44dv/0gjl9RpkP0Y2G3BJSRkp6eYdCSu39iI8=
+gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 h1:DkD0plWEVUB8v/Ru6kRBW30Hy/fRNBC8hPdcExuBZMc=
+gopkg.in/DataDog/dd-trace-go.v1 v1.32.0/go.mod h1:wRKMf/tRASHwH/UOfPQ3IQmVFhTz2/1a1/mpXoIjF54=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1427,6 +1539,7 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/workhorse/internal/api/api.go b/workhorse/internal/api/api.go
index 896f59a322a..8954923ad75 100644
--- a/workhorse/internal/api/api.go
+++ b/workhorse/internal/api/api.go
@@ -17,7 +17,6 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -150,7 +149,7 @@ type Response struct {
// Used to communicate channel session details
Channel *ChannelSettings
// GitalyServer specifies an address and authentication token for a gitaly server we should connect to.
- GitalyServer gitaly.Server
+ GitalyServer GitalyServer
// Repository object for making gRPC requests to Gitaly.
Repository gitalypb.Repository
// For git-http, does the requestor have the right to view all refs?
@@ -163,6 +162,12 @@ type Response struct {
MaximumSize int64
}
+type GitalyServer struct {
+ Address string `json:"address"`
+ Token string `json:"token"`
+ Features map[string]string `json:"features"`
+}
+
// singleJoiningSlash is taken from reverseproxy.go:singleJoiningSlash
func singleJoiningSlash(a, b string) string {
aslash := strings.HasSuffix(a, "/")
diff --git a/workhorse/internal/config/config.go b/workhorse/internal/config/config.go
index 60cfd567f5d..e83f55f43bf 100644
--- a/workhorse/internal/config/config.go
+++ b/workhorse/internal/config/config.go
@@ -84,6 +84,19 @@ type ImageResizerConfig struct {
MaxFilesize uint64 `toml:"max_filesize"`
}
+type TlsConfig struct {
+ Certificate string `toml:"certificate"`
+ Key string `toml:"key"`
+ MinVersion string `toml:"min_version"`
+ MaxVersion string `toml:"max_version"`
+}
+
+type ListenerConfig struct {
+ Network string `toml:"network"`
+ Addr string `toml:"addr"`
+ Tls *TlsConfig `toml:"tls"`
+}
+
type Config struct {
Redis *RedisConfig `toml:"redis"`
Backend *url.URL `toml:"-"`
@@ -106,6 +119,7 @@ type Config struct {
ShutdownTimeout TomlDuration `toml:"shutdown_timeout"`
TrustedCIDRsForXForwardedFor []string `toml:"trusted_cidrs_for_x_forwarded_for"`
TrustedCIDRsForPropagation []string `toml:"trusted_cidrs_for_propagation"`
+ Listeners []ListenerConfig `toml:"listeners"`
}
var DefaultImageResizerConfig = ImageResizerConfig{
diff --git a/workhorse/internal/git/archive.go b/workhorse/internal/git/archive.go
index fc12094cc14..e1d03828b63 100644
--- a/workhorse/internal/git/archive.go
+++ b/workhorse/internal/git/archive.go
@@ -22,6 +22,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -33,7 +34,7 @@ type archiveParams struct {
ArchivePath string
ArchivePrefix string
CommitId string
- GitalyServer gitaly.Server
+ GitalyServer api.GitalyServer
GitalyRepository gitalypb.Repository
DisableCache bool
GetArchiveRequest []byte
@@ -132,7 +133,12 @@ func (a *archive) Inject(w http.ResponseWriter, r *http.Request, sendData string
func handleArchiveWithGitaly(r *http.Request, params *archiveParams, format gitalypb.GetArchiveRequest_Format) (io.Reader, error) {
var request *gitalypb.GetArchiveRequest
- ctx, c, err := gitaly.NewRepositoryClient(r.Context(), params.GitalyServer)
+ ctx, c, err := gitaly.NewRepositoryClient(
+ r.Context(),
+ params.GitalyServer,
+ gitaly.WithFeatures(params.GitalyServer.Features),
+ )
+
if err != nil {
return nil, err
}
diff --git a/workhorse/internal/git/blob.go b/workhorse/internal/git/blob.go
index 3ea065766d0..192978e6c75 100644
--- a/workhorse/internal/git/blob.go
+++ b/workhorse/internal/git/blob.go
@@ -6,6 +6,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/senddata"
@@ -13,7 +14,7 @@ import (
type blob struct{ senddata.Prefix }
type blobParams struct {
- GitalyServer gitaly.Server
+ GitalyServer api.GitalyServer
GetBlobRequest gitalypb.GetBlobRequest
}
@@ -26,7 +27,12 @@ func (b *blob) Inject(w http.ResponseWriter, r *http.Request, sendData string) {
return
}
- ctx, blobClient, err := gitaly.NewBlobClient(r.Context(), params.GitalyServer)
+ ctx, blobClient, err := gitaly.NewBlobClient(
+ r.Context(),
+ params.GitalyServer,
+ gitaly.WithFeatures(params.GitalyServer.Features),
+ )
+
if err != nil {
helper.Fail500(w, r, fmt.Errorf("blob.GetBlob: %v", err))
return
diff --git a/workhorse/internal/git/diff.go b/workhorse/internal/git/diff.go
index 4877eea045a..252db6f150b 100644
--- a/workhorse/internal/git/diff.go
+++ b/workhorse/internal/git/diff.go
@@ -6,6 +6,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -14,7 +15,7 @@ import (
type diff struct{ senddata.Prefix }
type diffParams struct {
- GitalyServer gitaly.Server
+ GitalyServer api.GitalyServer
RawDiffRequest string
}
@@ -33,7 +34,11 @@ func (d *diff) Inject(w http.ResponseWriter, r *http.Request, sendData string) {
return
}
- ctx, diffClient, err := gitaly.NewDiffClient(r.Context(), params.GitalyServer)
+ ctx, diffClient, err := gitaly.NewDiffClient(
+ r.Context(),
+ params.GitalyServer,
+ gitaly.WithFeatures(params.GitalyServer.Features),
+ )
if err != nil {
helper.Fail500(w, r, fmt.Errorf("diff.RawDiff: %v", err))
return
diff --git a/workhorse/internal/git/error.go b/workhorse/internal/git/error.go
index 2b7cad6bb64..86a2ba44767 100644
--- a/workhorse/internal/git/error.go
+++ b/workhorse/internal/git/error.go
@@ -1,4 +1,100 @@
package git
+import (
+ "errors"
+ "fmt"
+ "io"
+
+ "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "google.golang.org/grpc/status"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
+)
+
+// For unwrapping google.golang.org/grpc/internal/status.Error
+type grpcErr interface {
+ GRPCStatus() *status.Status
+ Error() string
+}
+
// For cosmetic purposes in Sentry
type copyError struct{ error }
+
+// handleLimitErr handles errors that come back from Gitaly that may be a
+// LimitError. A LimitError is returned by Gitaly when it is at its limit in
+// handling requests. Since this is a known error, we should print a sensible
+// error message to the end user.
+func handleLimitErr(err error, w io.Writer, f func(w io.Writer) error) {
+ var statusErr grpcErr
+ if !errors.As(err, &statusErr) {
+ return
+ }
+
+ if st, ok := status.FromError(statusErr); ok {
+ details := st.Details()
+ for _, detail := range details {
+ switch detail.(type) {
+ case *gitalypb.LimitError:
+ if err := f(w); err != nil {
+ log.WithError(fmt.Errorf("handling limit error: %w", err))
+ }
+ }
+ }
+ }
+}
+
+// writeReceivePackError writes a "server is busy" error message to the
+// git-recieve-pack-result.
+//
+// 0023\x01001aunpack server is busy
+// 00000044\x2GitLab is currently unable to handle this request due to load.
+// 0000
+//
+// We write a line reporting that unpack failed, and then provide some progress
+// information through the side-band 2 channel.
+// See https://gitlab.com/gitlab-org/gitaly/-/tree/jc-return-structured-error-limits
+// for more details.
+func writeReceivePackError(w io.Writer) error {
+ if _, err := fmt.Fprintf(w, "%04x", 35); err != nil {
+ return err
+ }
+
+ if _, err := w.Write([]byte{0x01}); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, "%04xunpack server is busy\n", 26); err != nil {
+ return err
+ }
+
+ if _, err := w.Write([]byte("0000")); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprintf(w, "%04x", 68); err != nil {
+ return err
+ }
+
+ if _, err := w.Write([]byte{0x2}); err != nil {
+ return err
+ }
+
+ if _, err := fmt.Fprint(w, "GitLab is currently unable to handle this request due to load.\n"); err != nil {
+ return err
+ }
+
+ if _, err := w.Write([]byte("0000")); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// writeUploadPackError writes a "server is busy" error message that git
+// understands and prints to stdout. UploadPack expects to receive pack data in
+// PKT-LINE format. An error-line can be passed that begins with ERR.
+// See https://git-scm.com/docs/pack-protocol/2.29.0#_pkt_line_format.
+func writeUploadPackError(w io.Writer) error {
+ _, err := fmt.Fprintf(w, "%04xERR GitLab is currently unable to handle this request due to load.\n", 71)
+ return err
+}
diff --git a/workhorse/internal/git/error_test.go b/workhorse/internal/git/error_test.go
new file mode 100644
index 00000000000..d87c81fc83c
--- /dev/null
+++ b/workhorse/internal/git/error_test.go
@@ -0,0 +1,80 @@
+package git
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/types/known/anypb"
+ "google.golang.org/protobuf/types/known/durationpb"
+)
+
+func TestHandleLimitErr(t *testing.T) {
+ testCases := []struct {
+ desc string
+ errWriter func(io.Writer) error
+ expectedBytes []byte
+ }{
+ {
+ desc: "upload pack",
+ errWriter: writeUploadPackError,
+ expectedBytes: bytes.Join([][]byte{
+ []byte{'0', '0', '4', '7'},
+ []byte("ERR GitLab is currently unable to handle this request due to load.\n"),
+ }, []byte{}),
+ },
+ {
+ desc: "recieve pack",
+ errWriter: writeReceivePackError,
+ expectedBytes: bytes.Join([][]byte{
+ {'0', '0', '2', '3', 1, '0', '0', '1', 'a'},
+ []byte("unpack server is busy\n"),
+ {'0', '0', '0', '0', '0', '0', '4', '4', 2},
+ []byte("GitLab is currently unable to handle this request due to load.\n"),
+ {'0', '0', '0', '0'},
+ }, []byte{}),
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ var body bytes.Buffer
+ err := errWithDetail(t, &gitalypb.LimitError{
+ ErrorMessage: "concurrency queue wait time reached",
+ RetryAfter: durationpb.New(0)})
+
+ handleLimitErr(fmt.Errorf("wrapped error: %w", err), &body, tc.errWriter)
+ require.Equal(t, tc.expectedBytes, body.Bytes())
+ })
+ }
+
+ t.Run("non LimitError", func(t *testing.T) {
+ var body bytes.Buffer
+ err := status.Error(codes.Internal, "some internal error")
+ handleLimitErr(fmt.Errorf("wrapped error: %w", err), &body, writeUploadPackError)
+ require.Equal(t, []byte(nil), body.Bytes())
+
+ handleLimitErr(fmt.Errorf("wrapped error: %w", err), &body, writeReceivePackError)
+ require.Equal(t, []byte(nil), body.Bytes())
+
+ })
+}
+
+// errWithDetail adds the given details to the error if it is a gRPC status whose code is not OK.
+func errWithDetail(t *testing.T, detail proto.Message) error {
+ st := status.New(codes.Unavailable, "too busy")
+
+ proto := st.Proto()
+ marshaled, err := anypb.New(detail)
+ require.NoError(t, err)
+
+ proto.Details = append(proto.Details, marshaled)
+
+ return status.ErrorProto(proto)
+}
diff --git a/workhorse/internal/git/format-patch.go b/workhorse/internal/git/format-patch.go
index 2e52fdf6c33..d52c4ef7dee 100644
--- a/workhorse/internal/git/format-patch.go
+++ b/workhorse/internal/git/format-patch.go
@@ -6,6 +6,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -14,7 +15,7 @@ import (
type patch struct{ senddata.Prefix }
type patchParams struct {
- GitalyServer gitaly.Server
+ GitalyServer api.GitalyServer
RawPatchRequest string
}
@@ -33,7 +34,12 @@ func (p *patch) Inject(w http.ResponseWriter, r *http.Request, sendData string)
return
}
- ctx, diffClient, err := gitaly.NewDiffClient(r.Context(), params.GitalyServer)
+ ctx, diffClient, err := gitaly.NewDiffClient(
+ r.Context(),
+ params.GitalyServer,
+ gitaly.WithFeatures(params.GitalyServer.Features),
+ )
+
if err != nil {
helper.Fail500(w, r, fmt.Errorf("diff.RawPatch: %v", err))
return
diff --git a/workhorse/internal/git/git-http.go b/workhorse/internal/git/git-http.go
index 7f5c1b6c584..86007e16064 100644
--- a/workhorse/internal/git/git-http.go
+++ b/workhorse/internal/git/git-http.go
@@ -22,11 +22,11 @@ const (
)
func ReceivePack(a *api.API) http.Handler {
- return postRPCHandler(a, "handleReceivePack", handleReceivePack)
+ return postRPCHandler(a, "handleReceivePack", handleReceivePack, writeReceivePackError)
}
func UploadPack(a *api.API) http.Handler {
- return postRPCHandler(a, "handleUploadPack", handleUploadPack)
+ return postRPCHandler(a, "handleUploadPack", handleUploadPack, writeUploadPackError)
}
func gitConfigOptions(a *api.Response) []string {
@@ -39,7 +39,12 @@ func gitConfigOptions(a *api.Response) []string {
return out
}
-func postRPCHandler(a *api.API, name string, handler func(*HttpResponseWriter, *http.Request, *api.Response) error) http.Handler {
+func postRPCHandler(
+ a *api.API,
+ name string,
+ handler func(*HttpResponseWriter, *http.Request, *api.Response) error,
+ errWriter func(io.Writer) error,
+) http.Handler {
return repoPreAuthorizeHandler(a, func(rw http.ResponseWriter, r *http.Request, ar *api.Response) {
cr := &countReadCloser{ReadCloser: r.Body}
r.Body = cr
@@ -50,7 +55,8 @@ func postRPCHandler(a *api.API, name string, handler func(*HttpResponseWriter, *
}()
if err := handler(w, r, ar); err != nil {
- // If the handler already wrote a response this WriteHeader call is a
+ handleLimitErr(err, w, errWriter)
+ // If the handler, or handleLimitErr already wrote a response this WriteHeader call is a
// no-op. It never reaches net/http because GitHttpResponseWriter calls
// WriteHeader on its underlying ResponseWriter at most once.
w.WriteHeader(500)
diff --git a/workhorse/internal/git/info-refs.go b/workhorse/internal/git/info-refs.go
index b7f825839f8..2eaed388f60 100644
--- a/workhorse/internal/git/info-refs.go
+++ b/workhorse/internal/git/info-refs.go
@@ -55,7 +55,13 @@ func handleGetInfoRefs(rw http.ResponseWriter, r *http.Request, a *api.Response)
}
func handleGetInfoRefsWithGitaly(ctx context.Context, responseWriter *HttpResponseWriter, a *api.Response, rpc, gitProtocol, encoding string) error {
- ctx, smarthttp, err := gitaly.NewSmartHTTPClient(ctx, a.GitalyServer)
+ ctx, smarthttp, err := gitaly.NewSmartHTTPClient(
+ ctx,
+ a.GitalyServer,
+ gitaly.WithFeatures(a.GitalyServer.Features),
+ gitaly.WithUserID(a.GL_ID),
+ gitaly.WithUsername(a.GL_USERNAME),
+ )
if err != nil {
return err
}
diff --git a/workhorse/internal/git/info-refs_test.go b/workhorse/internal/git/info-refs_test.go
index 4f23d1ac174..0df74abe81d 100644
--- a/workhorse/internal/git/info-refs_test.go
+++ b/workhorse/internal/git/info-refs_test.go
@@ -11,7 +11,6 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
)
type smartHTTPServiceServerWithInfoRefs struct {
@@ -32,7 +31,7 @@ func TestGetInfoRefsHandler(t *testing.T) {
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/?service=git-upload-pack", nil)
- a := &api.Response{GitalyServer: gitaly.Server{Address: addr}}
+ a := &api.Response{GitalyServer: api.GitalyServer{Address: addr}}
handleGetInfoRefs(NewHttpResponseWriter(w), r, a)
require.Equal(t, 503, w.Code)
diff --git a/workhorse/internal/git/receive-pack.go b/workhorse/internal/git/receive-pack.go
index ccde9331b83..a85f0edccac 100644
--- a/workhorse/internal/git/receive-pack.go
+++ b/workhorse/internal/git/receive-pack.go
@@ -20,13 +20,19 @@ func handleReceivePack(w *HttpResponseWriter, r *http.Request, a *api.Response)
gitProtocol := r.Header.Get("Git-Protocol")
- ctx, smarthttp, err := gitaly.NewSmartHTTPClient(r.Context(), a.GitalyServer)
+ ctx, smarthttp, err := gitaly.NewSmartHTTPClient(
+ r.Context(),
+ a.GitalyServer,
+ gitaly.WithFeatures(a.GitalyServer.Features),
+ gitaly.WithUserID(a.GL_ID),
+ gitaly.WithUsername(a.GL_USERNAME),
+ )
if err != nil {
return fmt.Errorf("smarthttp.ReceivePack: %v", err)
}
if err := smarthttp.ReceivePack(ctx, &a.Repository, a.GL_ID, a.GL_USERNAME, a.GL_REPOSITORY, a.GitConfigOptions, cr, cw, gitProtocol); err != nil {
- return fmt.Errorf("smarthttp.ReceivePack: %v", err)
+ return fmt.Errorf("smarthttp.ReceivePack: %w", err)
}
return nil
diff --git a/workhorse/internal/git/snapshot.go b/workhorse/internal/git/snapshot.go
index 152b2fc2b93..77b32f8a05d 100644
--- a/workhorse/internal/git/snapshot.go
+++ b/workhorse/internal/git/snapshot.go
@@ -7,6 +7,7 @@ import (
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/helper"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/log"
@@ -18,7 +19,7 @@ type snapshot struct {
}
type snapshotParams struct {
- GitalyServer gitaly.Server
+ GitalyServer api.GitalyServer
GetSnapshotRequest string
}
@@ -40,7 +41,12 @@ func (s *snapshot) Inject(w http.ResponseWriter, r *http.Request, sendData strin
return
}
- ctx, c, err := gitaly.NewRepositoryClient(r.Context(), params.GitalyServer)
+ ctx, c, err := gitaly.NewRepositoryClient(
+ r.Context(),
+ params.GitalyServer,
+ gitaly.WithFeatures(params.GitalyServer.Features),
+ )
+
if err != nil {
helper.Fail500(w, r, fmt.Errorf("SendSnapshot: gitaly.NewRepositoryClient: %v", err))
return
diff --git a/workhorse/internal/git/testhelper_test.go b/workhorse/internal/git/testhelper_test.go
new file mode 100644
index 00000000000..8261dcd125f
--- /dev/null
+++ b/workhorse/internal/git/testhelper_test.go
@@ -0,0 +1,15 @@
+package git
+
+import (
+ "os"
+ "testing"
+
+ "github.com/sirupsen/logrus"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
+)
+
+func TestMain(m *testing.M) {
+ gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
+ os.Exit(m.Run())
+}
diff --git a/workhorse/internal/git/upload-pack.go b/workhorse/internal/git/upload-pack.go
index acf03284343..bbed5224b2d 100644
--- a/workhorse/internal/git/upload-pack.go
+++ b/workhorse/internal/git/upload-pack.go
@@ -44,13 +44,19 @@ func handleUploadPack(w *HttpResponseWriter, r *http.Request, a *api.Response) e
}
func handleUploadPackWithGitaly(ctx context.Context, a *api.Response, clientRequest io.Reader, clientResponse io.Writer, gitProtocol string) error {
- ctx, smarthttp, err := gitaly.NewSmartHTTPClient(ctx, a.GitalyServer)
+ ctx, smarthttp, err := gitaly.NewSmartHTTPClient(
+ ctx,
+ a.GitalyServer,
+ gitaly.WithFeatures(a.GitalyServer.Features),
+ gitaly.WithUserID(a.GL_ID),
+ gitaly.WithUsername(a.GL_USERNAME),
+ )
if err != nil {
- return fmt.Errorf("smarthttp.UploadPack: %v", err)
+ return fmt.Errorf("get gitaly client: %w", err)
}
if err := smarthttp.UploadPack(ctx, &a.Repository, clientRequest, clientResponse, gitConfigOptions(a), gitProtocol); err != nil {
- return fmt.Errorf("smarthttp.UploadPack: %v", err)
+ return fmt.Errorf("do gitaly call: %w", err)
}
return nil
diff --git a/workhorse/internal/git/upload-pack_test.go b/workhorse/internal/git/upload-pack_test.go
index 211f68a2608..9ffc7117790 100644
--- a/workhorse/internal/git/upload-pack_test.go
+++ b/workhorse/internal/git/upload-pack_test.go
@@ -1,7 +1,10 @@
package git
import (
+ "context"
+ "errors"
"fmt"
+ "io"
"io/ioutil"
"net"
"net/http/httptest"
@@ -13,32 +16,33 @@ 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/gitlab/workhorse/internal/api"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/gitaly"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
)
var (
originalUploadPackTimeout = uploadPackTimeout
)
-type fakeReader struct {
- n int
- err error
+type waitReader struct {
+ t time.Duration
}
-func (f *fakeReader) Read(b []byte) (int, error) {
- return f.n, f.err
+func (f *waitReader) Read(b []byte) (int, error) {
+ time.Sleep(f.t)
+ return 0, io.EOF
}
type smartHTTPServiceServer struct {
gitalypb.UnimplementedSmartHTTPServiceServer
- PostUploadPackFunc func(gitalypb.SmartHTTPService_PostUploadPackServer) error
+ handler func(context.Context, *gitalypb.PostUploadPackWithSidechannelRequest) (*gitalypb.PostUploadPackWithSidechannelResponse, error)
}
-func (srv *smartHTTPServiceServer) PostUploadPack(s gitalypb.SmartHTTPService_PostUploadPackServer) error {
- return srv.PostUploadPackFunc(s)
+func (srv *smartHTTPServiceServer) PostUploadPackWithSidechannel(ctx context.Context, req *gitalypb.PostUploadPackWithSidechannelRequest) (*gitalypb.PostUploadPackWithSidechannelResponse, error) {
+ return srv.handler(ctx, req)
}
func TestUploadPackTimesOut(t *testing.T) {
@@ -46,21 +50,26 @@ func TestUploadPackTimesOut(t *testing.T) {
defer func() { uploadPackTimeout = originalUploadPackTimeout }()
addr := startSmartHTTPServer(t, &smartHTTPServiceServer{
- PostUploadPackFunc: func(stream gitalypb.SmartHTTPService_PostUploadPackServer) error {
- _, err := stream.Recv() // trigger a read on the client request body
- require.NoError(t, err)
- return nil
+ handler: func(ctx context.Context, req *gitalypb.PostUploadPackWithSidechannelRequest) (*gitalypb.PostUploadPackWithSidechannelResponse, error) {
+ conn, err := client.OpenServerSidechannel(ctx)
+ if err != nil {
+ return nil, err
+ }
+ defer conn.Close()
+
+ _, _ = io.Copy(ioutil.Discard, conn)
+ return &gitalypb.PostUploadPackWithSidechannelResponse{}, nil
},
})
- body := &fakeReader{n: 0, err: nil}
+ body := &waitReader{t: 10 * time.Millisecond}
w := httptest.NewRecorder()
r := httptest.NewRequest("GET", "/", body)
- a := &api.Response{GitalyServer: gitaly.Server{Address: addr}}
+ a := &api.Response{GitalyServer: api.GitalyServer{Address: addr}}
err := handleUploadPack(NewHttpResponseWriter(w), r, a)
- require.EqualError(t, err, "smarthttp.UploadPack: busyReader: context deadline exceeded")
+ require.True(t, errors.Is(err, context.DeadlineExceeded))
}
func startSmartHTTPServer(t testing.TB, s gitalypb.SmartHTTPServiceServer) string {
@@ -73,7 +82,7 @@ func startSmartHTTPServer(t testing.TB, s gitalypb.SmartHTTPServiceServer) strin
ln, err := net.Listen("unix", socket)
require.NoError(t, err)
- srv := grpc.NewServer()
+ srv := grpc.NewServer(testhelper.WithSidechannel())
gitalypb.RegisterSmartHTTPServiceServer(srv, s)
go func() {
require.NoError(t, srv.Serve(ln))
diff --git a/workhorse/internal/gitaly/gitaly.go b/workhorse/internal/gitaly/gitaly.go
index 362f380dc4d..db1fd3f8abb 100644
--- a/workhorse/internal/gitaly/gitaly.go
+++ b/workhorse/internal/gitaly/gitaly.go
@@ -19,24 +19,18 @@ import (
gitalyclient "gitlab.com/gitlab-org/gitaly/v14/client"
"gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
+
grpccorrelation "gitlab.com/gitlab-org/labkit/correlation/grpc"
grpctracing "gitlab.com/gitlab-org/labkit/tracing/grpc"
)
-type Server struct {
- Address string `json:"address"`
- Token string `json:"token"`
- Features map[string]string `json:"features"`
- Sidechannel bool `json:"sidechannel"`
-}
-
type cacheKey struct {
address, token string
- sidechannel bool
}
-func (server Server) cacheKey() cacheKey {
- return cacheKey{address: server.Address, token: server.Token, sidechannel: server.Sidechannel}
+func getCacheKey(server api.GitalyServer) cacheKey {
+ return cacheKey{address: server.Address, token: server.Token}
}
type connectionsCache struct {
@@ -73,19 +67,42 @@ func InitializeSidechannelRegistry(logger *logrus.Logger) {
}
}
-func withOutgoingMetadata(ctx context.Context, features map[string]string) context.Context {
- md := metadata.New(nil)
- for k, v := range features {
- if !strings.HasPrefix(k, "gitaly-feature-") {
- continue
+type MetadataFunc func(metadata.MD)
+
+func WithUserID(userID string) MetadataFunc {
+ return func(md metadata.MD) {
+ md.Append("user_id", userID)
+ }
+}
+
+func WithUsername(username string) MetadataFunc {
+ return func(md metadata.MD) {
+ md.Append("username", username)
+ }
+}
+
+func WithFeatures(features map[string]string) MetadataFunc {
+ return func(md metadata.MD) {
+ for k, v := range features {
+ if !strings.HasPrefix(k, "gitaly-feature-") {
+ continue
+ }
+ md.Append(k, v)
}
- md.Append(k, v)
+ }
+}
+
+func withOutgoingMetadata(ctx context.Context, addMetadataFuncs ...MetadataFunc) context.Context {
+ md := metadata.New(nil)
+
+ for _, f := range addMetadataFuncs {
+ f(md)
}
return metadata.NewOutgoingContext(ctx, md)
}
-func NewSmartHTTPClient(ctx context.Context, server Server) (context.Context, *SmartHTTPClient, error) {
+func NewSmartHTTPClient(ctx context.Context, server api.GitalyServer, metadataFuncs ...MetadataFunc) (context.Context, *SmartHTTPClient, error) {
conn, err := getOrCreateConnection(server)
if err != nil {
return nil, nil, err
@@ -94,50 +111,53 @@ func NewSmartHTTPClient(ctx context.Context, server Server) (context.Context, *S
smartHTTPClient := &SmartHTTPClient{
SmartHTTPServiceClient: grpcClient,
sidechannelRegistry: sidechannelRegistry,
- useSidechannel: server.Sidechannel,
}
- return withOutgoingMetadata(ctx, server.Features), smartHTTPClient, nil
+
+ return withOutgoingMetadata(
+ ctx,
+ metadataFuncs...,
+ ), smartHTTPClient, nil
}
-func NewBlobClient(ctx context.Context, server Server) (context.Context, *BlobClient, error) {
+func NewBlobClient(ctx context.Context, server api.GitalyServer, addMetadataFuncs ...MetadataFunc) (context.Context, *BlobClient, error) {
conn, err := getOrCreateConnection(server)
if err != nil {
return nil, nil, err
}
grpcClient := gitalypb.NewBlobServiceClient(conn)
- return withOutgoingMetadata(ctx, server.Features), &BlobClient{grpcClient}, nil
+ return withOutgoingMetadata(ctx, addMetadataFuncs...), &BlobClient{grpcClient}, nil
}
-func NewRepositoryClient(ctx context.Context, server Server) (context.Context, *RepositoryClient, error) {
+func NewRepositoryClient(ctx context.Context, server api.GitalyServer, addMetadataFuncs ...MetadataFunc) (context.Context, *RepositoryClient, error) {
conn, err := getOrCreateConnection(server)
if err != nil {
return nil, nil, err
}
grpcClient := gitalypb.NewRepositoryServiceClient(conn)
- return withOutgoingMetadata(ctx, server.Features), &RepositoryClient{grpcClient}, nil
+ return withOutgoingMetadata(ctx, addMetadataFuncs...), &RepositoryClient{grpcClient}, nil
}
// NewNamespaceClient is only used by the Gitaly integration tests at present
-func NewNamespaceClient(ctx context.Context, server Server) (context.Context, *NamespaceClient, error) {
+func NewNamespaceClient(ctx context.Context, server api.GitalyServer, addMetadataFuncs ...MetadataFunc) (context.Context, *NamespaceClient, error) {
conn, err := getOrCreateConnection(server)
if err != nil {
return nil, nil, err
}
grpcClient := gitalypb.NewNamespaceServiceClient(conn)
- return withOutgoingMetadata(ctx, server.Features), &NamespaceClient{grpcClient}, nil
+ return withOutgoingMetadata(ctx, addMetadataFuncs...), &NamespaceClient{grpcClient}, nil
}
-func NewDiffClient(ctx context.Context, server Server) (context.Context, *DiffClient, error) {
+func NewDiffClient(ctx context.Context, server api.GitalyServer, addMetadataFuncs ...MetadataFunc) (context.Context, *DiffClient, error) {
conn, err := getOrCreateConnection(server)
if err != nil {
return nil, nil, err
}
grpcClient := gitalypb.NewDiffServiceClient(conn)
- return withOutgoingMetadata(ctx, server.Features), &DiffClient{grpcClient}, nil
+ return withOutgoingMetadata(ctx, addMetadataFuncs...), &DiffClient{grpcClient}, nil
}
-func getOrCreateConnection(server Server) (*grpc.ClientConn, error) {
- key := server.cacheKey()
+func getOrCreateConnection(server api.GitalyServer) (*grpc.ClientConn, error) {
+ key := getCacheKey(server)
cache.RLock()
conn := cache.connections[key]
@@ -173,7 +193,7 @@ func CloseConnections() {
}
}
-func newConnection(server Server) (*grpc.ClientConn, error) {
+func newConnection(server api.GitalyServer) (*grpc.ClientConn, error) {
connOpts := append(gitalyclient.DefaultDialOpts,
grpc.WithPerRPCCredentials(gitalyauth.RPCCredentialsV2(server.Token)),
grpc.WithStreamInterceptor(
@@ -197,13 +217,7 @@ func newConnection(server Server) (*grpc.ClientConn, error) {
),
)
- var conn *grpc.ClientConn
- var connErr error
- if server.Sidechannel {
- conn, connErr = gitalyclient.DialSidechannel(context.Background(), server.Address, sidechannelRegistry, connOpts) // lint:allow context.Background
- } else {
- conn, connErr = gitalyclient.Dial(server.Address, connOpts)
- }
+ conn, connErr := gitalyclient.DialSidechannel(context.Background(), server.Address, sidechannelRegistry, connOpts) // lint:allow context.Background
label := "ok"
if connErr != nil {
diff --git a/workhorse/internal/gitaly/gitaly_test.go b/workhorse/internal/gitaly/gitaly_test.go
index 9c54caae8c6..f693f102447 100644
--- a/workhorse/internal/gitaly/gitaly_test.go
+++ b/workhorse/internal/gitaly/gitaly_test.go
@@ -2,56 +2,72 @@ package gitaly
import (
"context"
+ "os"
"testing"
"github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/metadata"
-)
-
-func TestNewSmartHTTPClient(t *testing.T) {
- ctx, client, err := NewSmartHTTPClient(context.Background(), serverFixture())
- require.NoError(t, err)
- testOutgoingMetadata(t, ctx)
- require.False(t, client.useSidechannel)
- require.Nil(t, client.sidechannelRegistry)
-}
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
+)
-func TestNewSmartHTTPClientWithSidechannel(t *testing.T) {
+func TestMain(m *testing.M) {
InitializeSidechannelRegistry(logrus.StandardLogger())
+ os.Exit(m.Run())
+}
- fixture := serverFixture()
- fixture.Sidechannel = true
-
- ctx, client, err := NewSmartHTTPClient(context.Background(), fixture)
+func TestNewSmartHTTPClient(t *testing.T) {
+ ctx, client, err := NewSmartHTTPClient(
+ context.Background(),
+ serverFixture(),
+ WithFeatures(features()),
+ WithUsername("gl_username"),
+ WithUserID("gl_id"),
+ )
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
-
- require.True(t, client.useSidechannel)
+ testOutgoingIDAndUsername(t, ctx)
require.NotNil(t, client.sidechannelRegistry)
}
func TestNewBlobClient(t *testing.T) {
- ctx, _, err := NewBlobClient(context.Background(), serverFixture())
+ ctx, _, err := NewBlobClient(
+ context.Background(),
+ serverFixture(),
+ WithFeatures(features()),
+ )
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
}
func TestNewRepositoryClient(t *testing.T) {
- ctx, _, err := NewRepositoryClient(context.Background(), serverFixture())
+ ctx, _, err := NewRepositoryClient(
+ context.Background(),
+ serverFixture(),
+ WithFeatures(features()),
+ )
+
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
}
func TestNewNamespaceClient(t *testing.T) {
- ctx, _, err := NewNamespaceClient(context.Background(), serverFixture())
+ ctx, _, err := NewNamespaceClient(
+ context.Background(),
+ serverFixture(),
+ WithFeatures(features()),
+ )
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
}
func TestNewDiffClient(t *testing.T) {
- ctx, _, err := NewDiffClient(context.Background(), serverFixture())
+ ctx, _, err := NewDiffClient(
+ context.Background(),
+ serverFixture(),
+ WithFeatures(features()),
+ )
require.NoError(t, err)
testOutgoingMetadata(t, ctx)
}
@@ -71,16 +87,29 @@ func testOutgoingMetadata(t *testing.T, ctx context.Context) {
}
}
-func serverFixture() Server {
+func testOutgoingIDAndUsername(t *testing.T, ctx context.Context) {
+ md, ok := metadata.FromOutgoingContext(ctx)
+ require.True(t, ok, "get metadata from context")
+
+ require.Equal(t, md["user_id"], []string{"gl_id"})
+ require.Equal(t, md["username"], []string{"gl_username"})
+}
+
+func features() map[string]string {
features := make(map[string]string)
for k, v := range allowedFeatures() {
features[k] = v
}
+
for k, v := range badFeatureMetadata() {
features[k] = v
}
- return Server{Address: "tcp://localhost:123", Features: features}
+ return features
+}
+
+func serverFixture() api.GitalyServer {
+ return api.GitalyServer{Address: "tcp://localhost:123"}
}
func allowedFeatures() map[string]string {
diff --git a/workhorse/internal/gitaly/smarthttp.go b/workhorse/internal/gitaly/smarthttp.go
index de6954efa60..12dffc3ccff 100644
--- a/workhorse/internal/gitaly/smarthttp.go
+++ b/workhorse/internal/gitaly/smarthttp.go
@@ -11,7 +11,6 @@ import (
)
type SmartHTTPClient struct {
- useSidechannel bool
sidechannelRegistry *gitalyclient.SidechannelRegistry
gitalypb.SmartHTTPServiceClient
}
@@ -96,71 +95,17 @@ func (client *SmartHTTPClient) ReceivePack(ctx context.Context, repo *gitalypb.R
}
func (client *SmartHTTPClient) UploadPack(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
- if client.useSidechannel {
- return client.runUploadPackWithSidechannel(ctx, repo, clientRequest, clientResponse, gitConfigOptions, gitProtocol)
- }
-
- return client.runUploadPack(ctx, repo, clientRequest, clientResponse, gitConfigOptions, gitProtocol)
-}
-
-func (client *SmartHTTPClient) runUploadPack(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
- stream, err := client.PostUploadPack(ctx)
- if err != nil {
- return err
- }
-
- rpcRequest := &gitalypb.PostUploadPackRequest{
- Repository: repo,
- GitConfigOptions: gitConfigOptions,
- GitProtocol: gitProtocol,
- }
-
- if err := stream.Send(rpcRequest); err != nil {
- return fmt.Errorf("initial request: %v", err)
- }
-
- numStreams := 2
- errC := make(chan error, numStreams)
-
- go func() {
- rr := streamio.NewReader(func() ([]byte, error) {
- response, err := stream.Recv()
- return response.GetData(), err
- })
- _, err := io.Copy(clientResponse, rr)
- errC <- err
- }()
-
- go func() {
- sw := streamio.NewWriter(func(data []byte) error {
- return stream.Send(&gitalypb.PostUploadPackRequest{Data: data})
- })
- _, err := io.Copy(sw, clientRequest)
- stream.CloseSend()
- errC <- err
- }()
-
- for i := 0; i < numStreams; i++ {
- if err := <-errC; err != nil {
- return err
- }
- }
-
- return nil
-}
-
-func (client *SmartHTTPClient) runUploadPackWithSidechannel(ctx context.Context, repo *gitalypb.Repository, clientRequest io.Reader, clientResponse io.Writer, gitConfigOptions []string, gitProtocol string) error {
ctx, waiter := client.sidechannelRegistry.Register(ctx, func(conn gitalyclient.SidechannelConn) error {
if _, err := io.Copy(conn, clientRequest); err != nil {
- return err
+ return fmt.Errorf("copy request body: %w", err)
}
if err := conn.CloseWrite(); err != nil {
- return fmt.Errorf("fail to signal sidechannel half-close: %w", err)
+ return fmt.Errorf("close request body: %w", err)
}
if _, err := io.Copy(clientResponse, conn); err != nil {
- return err
+ return fmt.Errorf("copy response body: %w", err)
}
return nil
@@ -174,11 +119,11 @@ func (client *SmartHTTPClient) runUploadPackWithSidechannel(ctx context.Context,
}
if _, err := client.PostUploadPackWithSidechannel(ctx, rpcRequest); err != nil {
- return err
+ return fmt.Errorf("PostUploadPackWithSidechannel: %w", err)
}
if err := waiter.Close(); err != nil {
- return fmt.Errorf("fail to close sidechannel connection: %w", err)
+ return fmt.Errorf("close sidechannel waiter: %w", err)
}
return nil
diff --git a/workhorse/internal/helper/writeafterreader.go b/workhorse/internal/helper/writeafterreader.go
index d583ae4a9b8..7df2279a86a 100644
--- a/workhorse/internal/helper/writeafterreader.go
+++ b/workhorse/internal/helper/writeafterreader.go
@@ -37,7 +37,7 @@ func (r *busyReader) Read(p []byte) (int, error) {
n, err := r.Reader.Read(p)
if err != nil {
if err != io.EOF {
- err = fmt.Errorf("busyReader: %v", err)
+ err = fmt.Errorf("busyReader: %w", err)
}
r.setError(err)
}
@@ -81,13 +81,13 @@ func (w *coupledWriter) Write(data []byte) (int, error) {
if w.busyReader.IsBusy() {
n, err := w.tempfileWrite(data)
if err != nil {
- w.writeError = fmt.Errorf("coupledWriter: %v", err)
+ w.writeError = fmt.Errorf("coupledWriter: %w", err)
}
return n, w.writeError
}
if err := w.Flush(); err != nil {
- w.writeError = fmt.Errorf("coupledWriter: %v", err)
+ w.writeError = fmt.Errorf("coupledWriter: %w", err)
return 0, w.writeError
}
diff --git a/workhorse/internal/redis/keywatcher.go b/workhorse/internal/redis/keywatcher.go
index 13e9fc3f051..82cb082f5f0 100644
--- a/workhorse/internal/redis/keywatcher.go
+++ b/workhorse/internal/redis/keywatcher.go
@@ -1,6 +1,7 @@
package redis
import (
+ "errors"
"fmt"
"strings"
"sync"
@@ -189,7 +190,9 @@ func WatchKey(key, value string, timeout time.Duration) (WatchKeyStatus, error)
defer delKeyChan(kw)
currentValue, err := GetString(key)
- if err != nil {
+ if errors.Is(err, redis.ErrNil) {
+ currentValue = ""
+ } else if err != nil {
return WatchKeyStatusNoChange, fmt.Errorf("keywatcher: redis GET: %v", err)
}
if currentValue != value {
diff --git a/workhorse/internal/redis/keywatcher_test.go b/workhorse/internal/redis/keywatcher_test.go
index 7ff5f8204c0..a2f2b73898f 100644
--- a/workhorse/internal/redis/keywatcher_test.go
+++ b/workhorse/internal/redis/keywatcher_test.go
@@ -1,10 +1,12 @@
package redis
import (
+ "errors"
"sync"
"testing"
"time"
+ "github.com/gomodule/redigo/redis"
"github.com/rafaeljusto/redigomock"
"github.com/stretchr/testify/require"
)
@@ -65,100 +67,191 @@ func processMessages(numWatchers int, value string) {
processInner(psc)
}
-func TestWatchKeySeenChange(t *testing.T) {
+type keyChangeTestCase struct {
+ desc string
+ returnValue string
+ isKeyMissing bool
+ watchValue string
+ processedValue string
+ expectedStatus WatchKeyStatus
+ timeout time.Duration
+}
+
+func TestKeyChangesBubblesUpError(t *testing.T) {
conn, td := setupMockPool()
defer td()
- conn.Command("GET", runnerKey).Expect("something")
-
- wg := &sync.WaitGroup{}
- wg.Add(1)
+ conn.Command("GET", runnerKey).ExpectError(errors.New("test error"))
- go func() {
- val, err := WatchKey(runnerKey, "something", time.Second)
- require.NoError(t, err, "Expected no error")
- require.Equal(t, WatchKeyStatusSeenChange, val, "Expected value to change")
- wg.Done()
- }()
+ _, err := WatchKey(runnerKey, "something", time.Second)
+ require.Error(t, err, "Expected error")
- processMessages(1, "somethingelse")
- wg.Wait()
+ deleteWatchers(runnerKey)
}
-func TestWatchKeyNoChange(t *testing.T) {
- conn, td := setupMockPool()
- defer td()
+func TestKeyChangesInstantReturn(t *testing.T) {
+ testCases := []keyChangeTestCase{
+ // WatchKeyStatusAlreadyChanged
+ {
+ desc: "sees change with key existing and changed",
+ returnValue: "somethingelse",
+ watchValue: "something",
+ expectedStatus: WatchKeyStatusAlreadyChanged,
+ timeout: time.Second,
+ },
+ {
+ desc: "sees change with key non-existing",
+ isKeyMissing: true,
+ watchValue: "something",
+ processedValue: "somethingelse",
+ expectedStatus: WatchKeyStatusAlreadyChanged,
+ timeout: time.Second,
+ },
+ // WatchKeyStatusTimeout
+ {
+ desc: "sees timeout with key existing and unchanged",
+ returnValue: "something",
+ watchValue: "something",
+ expectedStatus: WatchKeyStatusTimeout,
+ timeout: time.Millisecond,
+ },
+ {
+ desc: "sees timeout with key non-existing and unchanged",
+ isKeyMissing: true,
+ watchValue: "",
+ expectedStatus: WatchKeyStatusTimeout,
+ timeout: time.Millisecond,
+ },
+ }
- conn.Command("GET", runnerKey).Expect("something")
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ conn, td := setupMockPool()
+ defer td()
- wg := &sync.WaitGroup{}
- wg.Add(1)
+ if tc.isKeyMissing {
+ conn.Command("GET", runnerKey).ExpectError(redis.ErrNil)
+ } else {
+ conn.Command("GET", runnerKey).Expect(tc.returnValue)
+ }
- go func() {
- val, err := WatchKey(runnerKey, "something", time.Second)
- require.NoError(t, err, "Expected no error")
- require.Equal(t, WatchKeyStatusNoChange, val, "Expected notification without change to value")
- wg.Done()
- }()
+ val, err := WatchKey(runnerKey, tc.watchValue, tc.timeout)
- processMessages(1, "something")
- wg.Wait()
-}
+ require.NoError(t, err, "Expected no error")
+ require.Equal(t, tc.expectedStatus, val, "Expected value")
-func TestWatchKeyTimeout(t *testing.T) {
- conn, td := setupMockPool()
- defer td()
+ deleteWatchers(runnerKey)
+ })
+ }
+}
- conn.Command("GET", runnerKey).Expect("something")
+func TestKeyChangesWhenWatching(t *testing.T) {
+ testCases := []keyChangeTestCase{
+ // WatchKeyStatusSeenChange
+ {
+ desc: "sees change with key existing",
+ returnValue: "something",
+ watchValue: "something",
+ processedValue: "somethingelse",
+ expectedStatus: WatchKeyStatusSeenChange,
+ },
+ {
+ desc: "sees change with key non-existing, when watching empty value",
+ isKeyMissing: true,
+ watchValue: "",
+ processedValue: "something",
+ expectedStatus: WatchKeyStatusSeenChange,
+ },
+ // WatchKeyStatusNoChange
+ {
+ desc: "sees no change with key existing",
+ returnValue: "something",
+ watchValue: "something",
+ processedValue: "something",
+ expectedStatus: WatchKeyStatusNoChange,
+ },
+ }
- val, err := WatchKey(runnerKey, "something", time.Millisecond)
- require.NoError(t, err, "Expected no error")
- require.Equal(t, WatchKeyStatusTimeout, val, "Expected value to not change")
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ conn, td := setupMockPool()
+ defer td()
- // Clean up watchers since Process isn't doing that for us (not running)
- deleteWatchers(runnerKey)
-}
+ if tc.isKeyMissing {
+ conn.Command("GET", runnerKey).ExpectError(redis.ErrNil)
+ } else {
+ conn.Command("GET", runnerKey).Expect(tc.returnValue)
+ }
-func TestWatchKeyAlreadyChanged(t *testing.T) {
- conn, td := setupMockPool()
- defer td()
+ wg := &sync.WaitGroup{}
+ wg.Add(1)
- conn.Command("GET", runnerKey).Expect("somethingelse")
+ go func() {
+ defer wg.Done()
+ val, err := WatchKey(runnerKey, tc.watchValue, time.Second)
- val, err := WatchKey(runnerKey, "something", time.Second)
- require.NoError(t, err, "Expected no error")
- require.Equal(t, WatchKeyStatusAlreadyChanged, val, "Expected value to have already changed")
+ require.NoError(t, err, "Expected no error")
+ require.Equal(t, tc.expectedStatus, val, "Expected value")
+ }()
- // Clean up watchers since Process isn't doing that for us (not running)
- deleteWatchers(runnerKey)
+ processMessages(1, tc.processedValue)
+ wg.Wait()
+ })
+ }
}
-func TestWatchKeyMassivelyParallel(t *testing.T) {
- runTimes := 100 // 100 parallel watchers
+func TestKeyChangesParallel(t *testing.T) {
+ testCases := []keyChangeTestCase{
+ {
+ desc: "massively parallel, sees change with key existing",
+ returnValue: "something",
+ watchValue: "something",
+ processedValue: "somethingelse",
+ expectedStatus: WatchKeyStatusSeenChange,
+ },
+ {
+ desc: "massively parallel, sees change with key existing, watching missing keys",
+ isKeyMissing: true,
+ watchValue: "",
+ processedValue: "somethingelse",
+ expectedStatus: WatchKeyStatusSeenChange,
+ },
+ }
- conn, td := setupMockPool()
- defer td()
+ for _, tc := range testCases {
+ t.Run(tc.desc, func(t *testing.T) {
+ runTimes := 100
- wg := &sync.WaitGroup{}
- wg.Add(runTimes)
+ conn, td := setupMockPool()
+ defer td()
- getCmd := conn.Command("GET", runnerKey)
+ getCmd := conn.Command("GET", runnerKey)
- for i := 0; i < runTimes; i++ {
- getCmd = getCmd.Expect("something")
- }
+ for i := 0; i < runTimes; i++ {
+ if tc.isKeyMissing {
+ getCmd = getCmd.ExpectError(redis.ErrNil)
+ } else {
+ getCmd = getCmd.Expect(tc.returnValue)
+ }
+ }
- for i := 0; i < runTimes; i++ {
- go func() {
- val, err := WatchKey(runnerKey, "something", time.Second)
- require.NoError(t, err, "Expected no error")
- require.Equal(t, WatchKeyStatusSeenChange, val, "Expected value to change")
- wg.Done()
- }()
- }
+ wg := &sync.WaitGroup{}
+ wg.Add(runTimes)
- processMessages(runTimes, "somethingelse")
- wg.Wait()
+ for i := 0; i < runTimes; i++ {
+ go func() {
+ defer wg.Done()
+ val, err := WatchKey(runnerKey, tc.watchValue, time.Second)
+
+ require.NoError(t, err, "Expected no error")
+ require.Equal(t, tc.expectedStatus, val, "Expected value")
+ }()
+ }
+
+ processMessages(runTimes, tc.processedValue)
+ wg.Wait()
+ })
+ }
}
func TestShutdown(t *testing.T) {
diff --git a/workhorse/internal/testhelper/gitaly.go b/workhorse/internal/testhelper/gitaly.go
index da2fbf30785..747d5e6d078 100644
--- a/workhorse/internal/testhelper/gitaly.go
+++ b/workhorse/internal/testhelper/gitaly.go
@@ -11,12 +11,15 @@ import (
"github.com/golang/protobuf/jsonpb" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
"github.com/golang/protobuf/proto" //lint:ignore SA1019 https://gitlab.com/gitlab-org/gitlab/-/issues/324868
+ "github.com/sirupsen/logrus"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
+ "google.golang.org/grpc/credentials/insecure"
"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/labkit/log"
)
@@ -181,93 +184,34 @@ func (s *GitalyTestServer) PostReceivePack(stream gitalypb.SmartHTTPService_Post
return s.finalError()
}
-func (s *GitalyTestServer) PostUploadPack(stream gitalypb.SmartHTTPService_PostUploadPackServer) error {
+func (s *GitalyTestServer) PostUploadPackWithSidechannel(ctx context.Context, req *gitalypb.PostUploadPackWithSidechannelRequest) (*gitalypb.PostUploadPackWithSidechannelResponse, error) {
s.WaitGroup.Add(1)
defer s.WaitGroup.Done()
- req, err := stream.Recv()
- if err != nil {
- return err
- }
-
if err := validateRepository(req.GetRepository()); err != nil {
- return err
- }
-
- marshaler := &jsonpb.Marshaler{}
- jsonBytes := &bytes.Buffer{}
- if err := marshaler.Marshal(jsonBytes, req); err != nil {
- return err
- }
-
- if err := stream.Send(&gitalypb.PostUploadPackResponse{
- Data: append(jsonBytes.Bytes(), 0),
- }); err != nil {
- return err
- }
-
- nSends := 0
- // The body of the request starts in the second message. Gitaly streams PostUploadPack responses
- // as soon as possible without reading the request completely first. We stream messages here
- // directly back to the client to simulate the streaming of the actual implementation.
- for {
- req, err := stream.Recv()
- if err != nil {
- if err != io.EOF {
- return err
- }
- break
- }
-
- if err := stream.Send(&gitalypb.PostUploadPackResponse{Data: req.GetData()}); err != nil {
- return err
- }
-
- nSends++
- }
-
- if nSends <= 1 {
- panic("should have sent more than one message")
- }
-
- return s.finalError()
-}
-
-// PostUploadPackWithSidechannel should be a part of smarthttp server in real
-// server. In workhorse, setting up a real sidechannel server is troublesome.
-// Therefore, we bring up a sidechannel server with a mock server exported via
-// gitalyclient.TestSidechannelServer. This is the handler for that mock
-// server.
-func PostUploadPackWithSidechannel(srv interface{}, stream grpc.ServerStream, conn io.ReadWriteCloser) error {
- if method, ok := grpc.Method(stream.Context()); !ok || method != "/gitaly.SmartHTTPService/PostUploadPackWithSidechannel" {
- return fmt.Errorf("unexpected method: %s", method)
- }
-
- var req gitalypb.PostUploadPackWithSidechannelRequest
- if err := stream.RecvMsg(&req); err != nil {
- return err
+ return nil, err
}
- if err := validateRepository(req.GetRepository()); err != nil {
- return err
+ conn, err := client.OpenServerSidechannel(ctx)
+ if err != nil {
+ return nil, err
}
+ defer conn.Close()
marshaler := &jsonpb.Marshaler{}
jsonBytes := &bytes.Buffer{}
- if err := marshaler.Marshal(jsonBytes, &req); err != nil {
- return err
- }
-
- // Bounce back all data back to the client, plus flushing bytes
- if _, err := conn.Write(append(jsonBytes.Bytes(), 0)); err != nil {
- return err
+ if err := marshaler.Marshal(jsonBytes, req); err != nil {
+ return nil, err
}
- if _, err := io.Copy(conn, conn); err != nil {
- return err
+ if _, err := io.Copy(conn, io.MultiReader(
+ bytes.NewReader(append(jsonBytes.Bytes(), 0)),
+ conn,
+ )); err != nil {
+ return nil, err
}
- return stream.SendMsg(&gitalypb.PostUploadPackWithSidechannelResponse{})
+ return &gitalypb.PostUploadPackWithSidechannelResponse{}, s.finalError()
}
func (s *GitalyTestServer) CommitIsAncestor(ctx context.Context, in *gitalypb.CommitIsAncestorRequest) (*gitalypb.CommitIsAncestorResponse, error) {
@@ -424,3 +368,7 @@ func validateRepository(repo *gitalypb.Repository) error {
}
return nil
}
+
+func WithSidechannel() grpc.ServerOption {
+ return client.SidechannelServer(logrus.NewEntry(logrus.StandardLogger()), insecure.NewCredentials())
+}
diff --git a/workhorse/internal/upload/artifacts_uploader.go b/workhorse/internal/upload/artifacts_uploader.go
index 2a91a05fe3d..c1c49638e21 100644
--- a/workhorse/internal/upload/artifacts_uploader.go
+++ b/workhorse/internal/upload/artifacts_uploader.go
@@ -35,7 +35,6 @@ var zipSubcommandsErrorsCounter = promauto.NewCounterVec(
}, []string{"error"})
type artifactsUploadProcessor struct {
- opts *destination.UploadOpts
format string
SavedFileTracker
@@ -44,7 +43,7 @@ type artifactsUploadProcessor struct {
// Artifacts is like a Multipart but specific for artifacts upload.
func Artifacts(myAPI *api.API, h http.Handler, p Preparer) http.Handler {
return myAPI.PreAuthorizeHandler(func(w http.ResponseWriter, r *http.Request, a *api.Response) {
- opts, _, err := p.Prepare(a)
+ opts, err := p.Prepare(a)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("UploadArtifacts: error preparing file storage options"))
return
@@ -52,7 +51,7 @@ func Artifacts(myAPI *api.API, h http.Handler, p Preparer) http.Handler {
format := r.URL.Query().Get(ArtifactFormatKey)
- mg := &artifactsUploadProcessor{opts: opts, format: format, SavedFileTracker: SavedFileTracker{Request: r}}
+ mg := &artifactsUploadProcessor{format: format, SavedFileTracker: SavedFileTracker{Request: r}}
interceptMultipartFiles(w, r, h, a, mg, opts)
}, "/authorize")
}
@@ -62,12 +61,9 @@ func (a *artifactsUploadProcessor) generateMetadataFromZip(ctx context.Context,
defer metaWriter.Close()
metaOpts := &destination.UploadOpts{
- LocalTempPath: a.opts.LocalTempPath,
+ LocalTempPath: os.TempDir(),
TempFilePrefix: "metadata.gz",
}
- if metaOpts.LocalTempPath == "" {
- metaOpts.LocalTempPath = os.TempDir()
- }
fileName := file.LocalPath
if fileName == "" {
diff --git a/workhorse/internal/upload/body_uploader.go b/workhorse/internal/upload/body_uploader.go
index d831f9f43a1..6fb201fe677 100644
--- a/workhorse/internal/upload/body_uploader.go
+++ b/workhorse/internal/upload/body_uploader.go
@@ -17,7 +17,7 @@ import (
// request to gitlab-rails without the original request body.
func RequestBody(rails PreAuthorizer, h http.Handler, p Preparer) http.Handler {
return rails.PreAuthorizeHandler(func(w http.ResponseWriter, r *http.Request, a *api.Response) {
- opts, verifier, err := p.Prepare(a)
+ opts, err := p.Prepare(a)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("RequestBody: preparation failed: %v", err))
return
@@ -29,13 +29,6 @@ func RequestBody(rails PreAuthorizer, h http.Handler, p Preparer) http.Handler {
return
}
- if verifier != nil {
- if err := verifier.Verify(fh); err != nil {
- helper.Fail500(w, r, fmt.Errorf("RequestBody: verification failed: %v", err))
- return
- }
- }
-
data := url.Values{}
fields, err := fh.GitLabFinalizeFields("file")
if err != nil {
diff --git a/workhorse/internal/upload/body_uploader_test.go b/workhorse/internal/upload/body_uploader_test.go
index 47490db8780..35772be5bc3 100644
--- a/workhorse/internal/upload/body_uploader_test.go
+++ b/workhorse/internal/upload/body_uploader_test.go
@@ -49,19 +49,6 @@ func TestRequestBodyCustomPreparer(t *testing.T) {
require.Equal(t, fileContent, string(uploadEcho))
}
-func TestRequestBodyCustomVerifier(t *testing.T) {
- body := strings.NewReader(fileContent)
- verifier := &mockVerifier{}
-
- resp := testUpload(&rails{}, &alwaysLocalPreparer{verifier: verifier}, echoProxy(t, fileLen), body)
- require.Equal(t, http.StatusOK, resp.StatusCode)
-
- uploadEcho, err := ioutil.ReadAll(resp.Body)
- require.NoError(t, err, "Can't read response body")
- require.Equal(t, fileContent, string(uploadEcho))
- require.True(t, verifier.invoked, "Verifier.Verify not invoked")
-}
-
func TestRequestBodyAuthorizationFailure(t *testing.T) {
testNoProxyInvocation(t, http.StatusUnauthorized, &rails{unauthorized: true}, &alwaysLocalPreparer{})
}
@@ -72,7 +59,6 @@ func TestRequestBodyErrors(t *testing.T) {
preparer *alwaysLocalPreparer
}{
{name: "Prepare failure", preparer: &alwaysLocalPreparer{prepareError: fmt.Errorf("")}},
- {name: "Verify failure", preparer: &alwaysLocalPreparer{verifier: &alwaysFailsVerifier{}}},
}
for _, test := range tests {
@@ -165,31 +151,14 @@ func (r *rails) PreAuthorizeHandler(next api.HandleFunc, _ string) http.Handler
}
type alwaysLocalPreparer struct {
- verifier Verifier
prepareError error
}
-func (a *alwaysLocalPreparer) Prepare(_ *api.Response) (*destination.UploadOpts, Verifier, error) {
+func (a *alwaysLocalPreparer) Prepare(_ *api.Response) (*destination.UploadOpts, error) {
opts, err := destination.GetOpts(&api.Response{TempPath: os.TempDir()})
if err != nil {
- return nil, nil, err
+ return nil, err
}
- return opts, a.verifier, a.prepareError
-}
-
-type alwaysFailsVerifier struct{}
-
-func (alwaysFailsVerifier) Verify(handler *destination.FileHandler) error {
- return fmt.Errorf("Verification failed")
-}
-
-type mockVerifier struct {
- invoked bool
-}
-
-func (m *mockVerifier) Verify(handler *destination.FileHandler) error {
- m.invoked = true
-
- return nil
+ return opts, a.prepareError
}
diff --git a/workhorse/internal/upload/lfs_preparer.go b/workhorse/internal/upload/lfs_preparer.go
deleted file mode 100644
index e7c5cf16a30..00000000000
--- a/workhorse/internal/upload/lfs_preparer.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package upload
-
-import (
- "fmt"
-
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
-)
-
-type object struct {
- size int64
- oid string
-}
-
-func (l *object) Verify(fh *destination.FileHandler) error {
- if fh.Size != l.size {
- return fmt.Errorf("LFSObject: expected size %d, wrote %d", l.size, fh.Size)
- }
-
- if fh.SHA256() != l.oid {
- return fmt.Errorf("LFSObject: expected sha256 %s, got %s", l.oid, fh.SHA256())
- }
-
- return nil
-}
-
-type uploadPreparer struct {
- objectPreparer Preparer
-}
-
-// NewLfs returns a new preparer instance which adds capability to a wrapped
-// preparer to set options required for a LFS upload.
-func NewLfsPreparer(c config.Config, objectPreparer Preparer) Preparer {
- return &uploadPreparer{objectPreparer: objectPreparer}
-}
-
-func (l *uploadPreparer) Prepare(a *api.Response) (*destination.UploadOpts, Verifier, error) {
- opts, _, err := l.objectPreparer.Prepare(a)
- if err != nil {
- return nil, nil, err
- }
-
- opts.TempFilePrefix = a.LfsOid
-
- return opts, &object{oid: a.LfsOid, size: a.LfsSize}, nil
-}
diff --git a/workhorse/internal/upload/lfs_preparer_test.go b/workhorse/internal/upload/lfs_preparer_test.go
deleted file mode 100644
index 6be4a7c2955..00000000000
--- a/workhorse/internal/upload/lfs_preparer_test.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package upload
-
-import (
- "testing"
-
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/api"
- "gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
-
- "github.com/stretchr/testify/require"
-)
-
-func TestLfsPreparerWithConfig(t *testing.T) {
- lfsOid := "abcd1234"
- creds := config.S3Credentials{
- AwsAccessKeyID: "test-key",
- AwsSecretAccessKey: "test-secret",
- }
-
- c := config.Config{
- ObjectStorageCredentials: config.ObjectStorageCredentials{
- Provider: "AWS",
- S3Credentials: creds,
- },
- }
-
- r := &api.Response{
- LfsOid: lfsOid,
- RemoteObject: api.RemoteObject{
- ID: "the upload ID",
- UseWorkhorseClient: true,
- ObjectStorage: &api.ObjectStorageParams{
- Provider: "AWS",
- },
- },
- }
-
- uploadPreparer := NewObjectStoragePreparer(c)
- lfsPreparer := NewLfsPreparer(c, uploadPreparer)
- opts, verifier, err := lfsPreparer.Prepare(r)
-
- require.NoError(t, err)
- require.Equal(t, lfsOid, opts.TempFilePrefix)
- require.True(t, opts.ObjectStorageConfig.IsAWS())
- require.True(t, opts.UseWorkhorseClient)
- require.Equal(t, creds, opts.ObjectStorageConfig.S3Credentials)
- require.NotNil(t, verifier)
-}
-
-func TestLfsPreparerWithNoConfig(t *testing.T) {
- c := config.Config{}
- r := &api.Response{RemoteObject: api.RemoteObject{ID: "the upload ID"}}
- uploadPreparer := NewObjectStoragePreparer(c)
- lfsPreparer := NewLfsPreparer(c, uploadPreparer)
- opts, verifier, err := lfsPreparer.Prepare(r)
-
- require.NoError(t, err)
- require.False(t, opts.UseWorkhorseClient)
- require.NotNil(t, verifier)
-}
diff --git a/workhorse/internal/upload/multipart_uploader.go b/workhorse/internal/upload/multipart_uploader.go
index d0097f9e153..34675d2aa14 100644
--- a/workhorse/internal/upload/multipart_uploader.go
+++ b/workhorse/internal/upload/multipart_uploader.go
@@ -17,7 +17,7 @@ func Multipart(rails PreAuthorizer, h http.Handler, p Preparer) http.Handler {
return rails.PreAuthorizeHandler(func(w http.ResponseWriter, r *http.Request, a *api.Response) {
s := &SavedFileTracker{Request: r}
- opts, _, err := p.Prepare(a)
+ opts, err := p.Prepare(a)
if err != nil {
helper.Fail500(w, r, fmt.Errorf("Multipart: error preparing file storage options"))
return
diff --git a/workhorse/internal/upload/object_storage_preparer.go b/workhorse/internal/upload/object_storage_preparer.go
index f28f598c895..d237a9ca6bc 100644
--- a/workhorse/internal/upload/object_storage_preparer.go
+++ b/workhorse/internal/upload/object_storage_preparer.go
@@ -18,14 +18,14 @@ func NewObjectStoragePreparer(c config.Config) Preparer {
return &ObjectStoragePreparer{credentials: c.ObjectStorageCredentials, config: c.ObjectStorageConfig}
}
-func (p *ObjectStoragePreparer) Prepare(a *api.Response) (*destination.UploadOpts, Verifier, error) {
+func (p *ObjectStoragePreparer) Prepare(a *api.Response) (*destination.UploadOpts, error) {
opts, err := destination.GetOpts(a)
if err != nil {
- return nil, nil, err
+ return nil, err
}
opts.ObjectStorageConfig.URLMux = p.config.URLMux
opts.ObjectStorageConfig.S3Credentials = p.credentials.S3Credentials
- return opts, nil, nil
+ return opts, nil
}
diff --git a/workhorse/internal/upload/object_storage_preparer_test.go b/workhorse/internal/upload/object_storage_preparer_test.go
index 5856a1bcc92..56de6bbf7d6 100644
--- a/workhorse/internal/upload/object_storage_preparer_test.go
+++ b/workhorse/internal/upload/object_storage_preparer_test.go
@@ -39,24 +39,22 @@ func TestPrepareWithS3Config(t *testing.T) {
}
p := upload.NewObjectStoragePreparer(c)
- opts, v, err := p.Prepare(r)
+ opts, err := p.Prepare(r)
require.NoError(t, err)
require.True(t, opts.ObjectStorageConfig.IsAWS())
require.True(t, opts.UseWorkhorseClient)
require.Equal(t, creds, opts.ObjectStorageConfig.S3Credentials)
require.NotNil(t, opts.ObjectStorageConfig.URLMux)
- require.Equal(t, nil, v)
}
func TestPrepareWithNoConfig(t *testing.T) {
c := config.Config{}
r := &api.Response{RemoteObject: api.RemoteObject{ID: "id"}}
p := upload.NewObjectStoragePreparer(c)
- opts, v, err := p.Prepare(r)
+ opts, err := p.Prepare(r)
require.NoError(t, err)
require.False(t, opts.UseWorkhorseClient)
- require.Nil(t, v)
require.Nil(t, opts.ObjectStorageConfig.URLMux)
}
diff --git a/workhorse/internal/upload/preparer.go b/workhorse/internal/upload/preparer.go
index 46a4cac01b5..4d6d8bd1189 100644
--- a/workhorse/internal/upload/preparer.go
+++ b/workhorse/internal/upload/preparer.go
@@ -5,29 +5,18 @@ import (
"gitlab.com/gitlab-org/gitlab/workhorse/internal/upload/destination"
)
-// Verifier is an optional pluggable behavior for upload paths. If
-// Verify() returns an error, Workhorse will return an error response to
-// the client instead of propagating the request to Rails. The motivating
-// use case is Git LFS, where Workhorse checks the size and SHA256
-// checksum of the uploaded file.
-type Verifier interface {
- // Verify can abort the upload by returning an error
- Verify(handler *destination.FileHandler) error
-}
-
// Preparer is a pluggable behavior that interprets a Rails API response
// and either tells Workhorse how to handle the upload, via the
-// UploadOpts and Verifier, or it rejects the request by returning a
-// non-nil error. Its intended use is to make sure the upload gets stored
-// in the right location: either a local directory, or one of several
-// supported object storage backends.
+// UploadOpts, or it rejects the request by returning a non-nil error.
+// Its intended use is to make sure the upload gets stored in the right
+// location: either a local directory, or one of several supported object
+// storage backends.
type Preparer interface {
- Prepare(a *api.Response) (*destination.UploadOpts, Verifier, error)
+ Prepare(a *api.Response) (*destination.UploadOpts, error)
}
type DefaultPreparer struct{}
-func (s *DefaultPreparer) Prepare(a *api.Response) (*destination.UploadOpts, Verifier, error) {
- opts, err := destination.GetOpts(a)
- return opts, nil, err
+func (s *DefaultPreparer) Prepare(a *api.Response) (*destination.UploadOpts, error) {
+ return destination.GetOpts(a)
}
diff --git a/workhorse/internal/upload/uploads_test.go b/workhorse/internal/upload/uploads_test.go
index 9d787b10d1c..a9c8834d4be 100644
--- a/workhorse/internal/upload/uploads_test.go
+++ b/workhorse/internal/upload/uploads_test.go
@@ -46,7 +46,7 @@ func (a *testFormProcessor) Finalize(ctx context.Context) error {
func TestUploadTempPathRequirement(t *testing.T) {
apiResponse := &api.Response{}
preparer := &DefaultPreparer{}
- _, _, err := preparer.Prepare(apiResponse)
+ _, err := preparer.Prepare(apiResponse)
require.Error(t, err)
}
@@ -75,7 +75,7 @@ func TestUploadHandlerForwardingRawData(t *testing.T) {
handler := newProxy(ts.URL)
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, handler, apiResponse, nil, opts)
@@ -146,7 +146,7 @@ func TestUploadHandlerRewritingMultiPartData(t *testing.T) {
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, handler, apiResponse, &testFormProcessor{}, opts)
@@ -215,7 +215,7 @@ func TestUploadHandlerDetectingInjectedMultiPartData(t *testing.T) {
handler := newProxy(ts.URL)
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, handler, apiResponse, &testFormProcessor{}, opts)
@@ -245,7 +245,7 @@ func TestUploadProcessingField(t *testing.T) {
response := httptest.NewRecorder()
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, nilHandler, apiResponse, &testFormProcessor{}, opts)
@@ -276,7 +276,7 @@ func TestUploadingMultipleFiles(t *testing.T) {
response := httptest.NewRecorder()
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, nilHandler, apiResponse, &testFormProcessor{}, opts)
@@ -332,7 +332,7 @@ func TestUploadProcessingFile(t *testing.T) {
response := httptest.NewRecorder()
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, nilHandler, apiResponse, &testFormProcessor{}, opts)
@@ -378,7 +378,7 @@ func TestInvalidFileNames(t *testing.T) {
response := httptest.NewRecorder()
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, nilHandler, apiResponse, &SavedFileTracker{Request: httpRequest}, opts)
@@ -444,7 +444,7 @@ func TestContentDispositionRewrite(t *testing.T) {
response := httptest.NewRecorder()
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, customHandler, apiResponse, &SavedFileTracker{Request: httpRequest}, opts)
@@ -567,7 +567,7 @@ func runUploadTest(t *testing.T, image []byte, filename string, httpCode int, ts
handler := newProxy(ts.URL)
apiResponse := &api.Response{TempPath: tempPath}
preparer := &DefaultPreparer{}
- opts, _, err := preparer.Prepare(apiResponse)
+ opts, err := preparer.Prepare(apiResponse)
require.NoError(t, err)
interceptMultipartFiles(response, httpRequest, handler, apiResponse, &testFormProcessor{}, opts)
diff --git a/workhorse/internal/upstream/routes.go b/workhorse/internal/upstream/routes.go
index b1d76dfc1bd..dd106053f8b 100644
--- a/workhorse/internal/upstream/routes.go
+++ b/workhorse/internal/upstream/routes.go
@@ -46,13 +46,6 @@ type routeOptions struct {
matchers []matcherFunc
}
-type uploadPreparers struct {
- artifacts upload.Preparer
- lfs upload.Preparer
- packages upload.Preparer
- uploads upload.Preparer
-}
-
const (
apiPattern = `^/api/`
ciAPIPattern = `^/ci/api/`
@@ -225,13 +218,16 @@ func configureRoutes(u *upstream) {
signingTripper := secret.NewRoundTripper(u.RoundTripper, u.Version)
signingProxy := buildProxy(u.Backend, u.Version, signingTripper, u.Config, dependencyProxyInjector)
- preparers := createUploadPreparers(u.Config)
+ preparer := upload.NewObjectStoragePreparer(u.Config)
+ requestBodyUploader := upload.RequestBody(api, signingProxy, preparer)
+ mimeMultipartUploader := upload.Multipart(api, signingProxy, preparer)
+
uploadPath := path.Join(u.DocumentRoot, "uploads/tmp")
- tempfileMultipartProxy := upload.Multipart(&upload.SkipRailsAuthorizer{TempPath: uploadPath}, proxy, preparers.uploads)
+ tempfileMultipartProxy := upload.Multipart(&upload.SkipRailsAuthorizer{TempPath: uploadPath}, proxy, preparer)
ciAPIProxyQueue := queueing.QueueRequests("ci_api_job_requests", tempfileMultipartProxy, u.APILimit, u.APIQueueLimit, u.APIQueueTimeout)
ciAPILongPolling := builds.RegisterHandler(ciAPIProxyQueue, redis.WatchKey, u.APICILongPollingDuration)
- dependencyProxyInjector.SetUploadHandler(upload.RequestBody(api, signingProxy, preparers.packages))
+ dependencyProxyInjector.SetUploadHandler(requestBodyUploader)
// Serve static files or forward the requests
defaultUpstream := static.ServeExisting(
@@ -247,11 +243,11 @@ func configureRoutes(u *upstream) {
u.route("GET", gitProjectPattern+`info/refs\z`, git.GetInfoRefsHandler(api)),
u.route("POST", gitProjectPattern+`git-upload-pack\z`, contentEncodingHandler(git.UploadPack(api)), withMatcher(isContentType("application/x-git-upload-pack-request"))),
u.route("POST", gitProjectPattern+`git-receive-pack\z`, contentEncodingHandler(git.ReceivePack(api)), withMatcher(isContentType("application/x-git-receive-pack-request"))),
- u.route("PUT", gitProjectPattern+`gitlab-lfs/objects/([0-9a-f]{64})/([0-9]+)\z`, upload.RequestBody(api, signingProxy, preparers.lfs), withMatcher(isContentType("application/octet-stream"))),
+ u.route("PUT", gitProjectPattern+`gitlab-lfs/objects/([0-9a-f]{64})/([0-9]+)\z`, requestBodyUploader, withMatcher(isContentType("application/octet-stream"))),
// CI Artifacts
- u.route("POST", apiPattern+`v4/jobs/[0-9]+/artifacts\z`, contentEncodingHandler(upload.Artifacts(api, signingProxy, preparers.artifacts))),
- u.route("POST", ciAPIPattern+`v1/builds/[0-9]+/artifacts\z`, contentEncodingHandler(upload.Artifacts(api, signingProxy, preparers.artifacts))),
+ u.route("POST", apiPattern+`v4/jobs/[0-9]+/artifacts\z`, contentEncodingHandler(upload.Artifacts(api, signingProxy, preparer))),
+ u.route("POST", ciAPIPattern+`v1/builds/[0-9]+/artifacts\z`, contentEncodingHandler(upload.Artifacts(api, signingProxy, preparer))),
// ActionCable websocket
u.wsRoute(`^/-/cable\z`, cableProxy),
@@ -275,32 +271,32 @@ func configureRoutes(u *upstream) {
// https://gitlab.com/gitlab-org/gitlab/-/merge_requests/56731.
// Maven Artifact Repository
- u.route("PUT", apiProjectPattern+`packages/maven/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiProjectPattern+`packages/maven/`, requestBodyUploader),
// Conan Artifact Repository
- u.route("PUT", apiPattern+`v4/packages/conan/`, upload.RequestBody(api, signingProxy, preparers.packages)),
- u.route("PUT", apiProjectPattern+`packages/conan/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiPattern+`v4/packages/conan/`, requestBodyUploader),
+ u.route("PUT", apiProjectPattern+`packages/conan/`, requestBodyUploader),
// Generic Packages Repository
- u.route("PUT", apiProjectPattern+`packages/generic/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiProjectPattern+`packages/generic/`, requestBodyUploader),
// NuGet Artifact Repository
- u.route("PUT", apiProjectPattern+`packages/nuget/`, upload.Multipart(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiProjectPattern+`packages/nuget/`, mimeMultipartUploader),
// PyPI Artifact Repository
- u.route("POST", apiProjectPattern+`packages/pypi`, upload.Multipart(api, signingProxy, preparers.packages)),
+ u.route("POST", apiProjectPattern+`packages/pypi`, mimeMultipartUploader),
// Debian Artifact Repository
- u.route("PUT", apiProjectPattern+`packages/debian/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiProjectPattern+`packages/debian/`, requestBodyUploader),
// Gem Artifact Repository
- u.route("POST", apiProjectPattern+`packages/rubygems/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("POST", apiProjectPattern+`packages/rubygems/`, requestBodyUploader),
// Terraform Module Package Repository
- u.route("PUT", apiProjectPattern+`packages/terraform/modules/`, upload.RequestBody(api, signingProxy, preparers.packages)),
+ u.route("PUT", apiProjectPattern+`packages/terraform/modules/`, requestBodyUploader),
// Helm Artifact Repository
- u.route("POST", apiProjectPattern+`packages/helm/api/[^/]+/charts\z`, upload.Multipart(api, signingProxy, preparers.packages)),
+ u.route("POST", apiProjectPattern+`packages/helm/api/[^/]+/charts\z`, mimeMultipartUploader),
// We are porting API to disk acceleration
// we need to declare each routes until we have fixed all the routes on the rails codebase.
@@ -309,25 +305,25 @@ func configureRoutes(u *upstream) {
u.route("POST", apiPattern+`graphql\z`, tempfileMultipartProxy),
u.route("POST", apiTopicPattern, tempfileMultipartProxy),
u.route("PUT", apiTopicPattern, tempfileMultipartProxy),
- u.route("POST", apiPattern+`v4/groups/import`, upload.Multipart(api, signingProxy, preparers.uploads)),
- u.route("POST", apiPattern+`v4/projects/import`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", apiPattern+`v4/groups/import`, mimeMultipartUploader),
+ u.route("POST", apiPattern+`v4/projects/import`, mimeMultipartUploader),
// Project Import via UI upload acceleration
- u.route("POST", importPattern+`gitlab_project`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", importPattern+`gitlab_project`, mimeMultipartUploader),
// Group Import via UI upload acceleration
- u.route("POST", importPattern+`gitlab_group`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", importPattern+`gitlab_group`, mimeMultipartUploader),
// Issuable Metric image upload
- u.route("POST", apiProjectPattern+`issues/[0-9]+/metric_images\z`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", apiProjectPattern+`issues/[0-9]+/metric_images\z`, mimeMultipartUploader),
// Alert Metric image upload
- u.route("POST", apiProjectPattern+`alert_management_alerts/[0-9]+/metric_images\z`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", apiProjectPattern+`alert_management_alerts/[0-9]+/metric_images\z`, mimeMultipartUploader),
// Requirements Import via UI upload acceleration
- u.route("POST", projectPattern+`requirements_management/requirements/import_csv`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", projectPattern+`requirements_management/requirements/import_csv`, mimeMultipartUploader),
// Uploads via API
- u.route("POST", apiProjectPattern+`uploads\z`, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", apiProjectPattern+`uploads\z`, mimeMultipartUploader),
// Explicitly proxy API requests
u.route("", apiPattern, proxy),
@@ -345,9 +341,9 @@ func configureRoutes(u *upstream) {
),
// Uploads
- u.route("POST", projectPattern+`uploads\z`, upload.Multipart(api, signingProxy, preparers.uploads)),
- u.route("POST", snippetUploadPattern, upload.Multipart(api, signingProxy, preparers.uploads)),
- u.route("POST", userUploadPattern, upload.Multipart(api, signingProxy, preparers.uploads)),
+ u.route("POST", projectPattern+`uploads\z`, mimeMultipartUploader),
+ u.route("POST", snippetUploadPattern, mimeMultipartUploader),
+ u.route("POST", userUploadPattern, mimeMultipartUploader),
// health checks don't intercept errors and go straight to rails
// TODO: We should probably not return a HTML deploy page?
@@ -411,17 +407,6 @@ func configureRoutes(u *upstream) {
}
}
-func createUploadPreparers(cfg config.Config) uploadPreparers {
- defaultPreparer := upload.NewObjectStoragePreparer(cfg)
-
- return uploadPreparers{
- artifacts: defaultPreparer,
- lfs: upload.NewLfsPreparer(cfg, defaultPreparer),
- packages: defaultPreparer,
- uploads: defaultPreparer,
- }
-}
-
func denyWebsocket(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if websocket.IsWebSocketUpgrade(r) {
diff --git a/workhorse/listener.go b/workhorse/listener.go
new file mode 100644
index 00000000000..5c8ca3a4064
--- /dev/null
+++ b/workhorse/listener.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+ "crypto/tls"
+ "net"
+
+ "gitlab.com/gitlab-org/labkit/log"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
+)
+
+var tlsVersions = map[string]uint16{
+ "": 0, // Default value in tls.Config
+ "tls1.0": tls.VersionTLS10,
+ "tls1.1": tls.VersionTLS11,
+ "tls1.2": tls.VersionTLS12,
+ "tls1.3": tls.VersionTLS13,
+}
+
+func newListener(name string, cfg config.ListenerConfig) (net.Listener, error) {
+ if cfg.Tls == nil {
+ log.WithFields(log.Fields{"address": cfg.Addr, "network": cfg.Network}).Infof("Running %v server", name)
+
+ return net.Listen(cfg.Network, cfg.Addr)
+ }
+
+ cert, err := tls.LoadX509KeyPair(cfg.Tls.Certificate, cfg.Tls.Key)
+ if err != nil {
+ return nil, err
+ }
+
+ log.WithFields(log.Fields{"address": cfg.Addr, "network": cfg.Network}).Infof("Running %v server with tls", name)
+
+ tlsConfig := &tls.Config{
+ MinVersion: tlsVersions[cfg.Tls.MinVersion],
+ MaxVersion: tlsVersions[cfg.Tls.MaxVersion],
+ Certificates: []tls.Certificate{cert},
+ }
+
+ return tls.Listen(cfg.Network, cfg.Addr, tlsConfig)
+}
diff --git a/workhorse/listener_test.go b/workhorse/listener_test.go
new file mode 100644
index 00000000000..26b5535af09
--- /dev/null
+++ b/workhorse/listener_test.go
@@ -0,0 +1,94 @@
+package main
+
+import (
+ "crypto/tls"
+ "crypto/x509"
+ "io"
+ "net"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "gitlab.com/gitlab-org/gitlab/workhorse/internal/config"
+)
+
+func TestNewListener(t *testing.T) {
+ const unixSocket = "testdata/sock"
+
+ require.NoError(t, os.RemoveAll(unixSocket))
+
+ testCases := []struct {
+ network, addr string
+ }{
+ {"tcp", "127.0.0.1:0"},
+ {"unix", unixSocket},
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.network+"+"+tc.addr, func(t *testing.T) {
+ l, err := newListener("test", config.ListenerConfig{
+ Addr: tc.addr,
+ Network: tc.network,
+ })
+ require.NoError(t, err)
+ defer l.Close()
+ go pingServer(l)
+
+ c, err := net.Dial(tc.network, l.Addr().String())
+ require.NoError(t, err)
+ defer c.Close()
+ pingClient(t, c)
+ })
+ }
+}
+
+func pingServer(l net.Listener) {
+ c, err := l.Accept()
+ if err != nil {
+ return
+ }
+ io.WriteString(c, "ping")
+ c.Close()
+}
+
+func pingClient(t *testing.T, c net.Conn) {
+ t.Helper()
+ buf, err := io.ReadAll(c)
+ require.NoError(t, err)
+ require.Equal(t, "ping", string(buf))
+}
+
+func TestNewListener_TLS(t *testing.T) {
+ const (
+ certFile = "testdata/localhost.crt"
+ keyFile = "testdata/localhost.key"
+ )
+
+ cfg := config.ListenerConfig{Addr: "127.0.0.1:0",
+ Network: "tcp",
+ Tls: &config.TlsConfig{
+ Certificate: certFile,
+ Key: keyFile,
+ },
+ }
+
+ l, err := newListener("test", cfg)
+ require.NoError(t, err)
+ defer l.Close()
+ go pingServer(l)
+
+ tlsCertificate, err := tls.LoadX509KeyPair(certFile, keyFile)
+ require.NoError(t, err)
+
+ certificate, err := x509.ParseCertificate(tlsCertificate.Certificate[0])
+ require.NoError(t, err)
+ certpool := x509.NewCertPool()
+ certpool.AddCert(certificate)
+
+ c, err := tls.Dial("tcp", l.Addr().String(), &tls.Config{RootCAs: certpool})
+ require.NoError(t, err)
+ defer c.Close()
+
+ pingClient(t, c)
+}
diff --git a/workhorse/main.go b/workhorse/main.go
index 123d21596e2..55c29b8abf5 100644
--- a/workhorse/main.go
+++ b/workhorse/main.go
@@ -13,6 +13,7 @@ import (
"syscall"
"time"
+ "gitlab.com/gitlab-org/labkit/fips"
"gitlab.com/gitlab-org/labkit/log"
"gitlab.com/gitlab-org/labkit/monitoring"
"gitlab.com/gitlab-org/labkit/tracing"
@@ -155,6 +156,7 @@ func buildConfig(arg0 string, args []string) (*bootConfig, *config.Config, error
cfg.ShutdownTimeout = cfgFromFile.ShutdownTimeout
cfg.TrustedCIDRsForXForwardedFor = cfgFromFile.TrustedCIDRsForXForwardedFor
cfg.TrustedCIDRsForPropagation = cfgFromFile.TrustedCIDRsForPropagation
+ cfg.Listeners = cfgFromFile.Listeners
return boot, cfg, nil
}
@@ -169,6 +171,7 @@ func run(boot bootConfig, cfg config.Config) error {
tracing.Initialize(tracing.WithServiceName("gitlab-workhorse"))
log.WithField("version", Version).WithField("build_time", BuildTime).Print("Starting")
+ fips.Check()
// Good housekeeping for Unix sockets: unlink before binding
if boot.listenNetwork == "unix" {
@@ -177,14 +180,6 @@ func run(boot bootConfig, cfg config.Config) error {
}
}
- // Change the umask only around net.Listen()
- oldUmask := syscall.Umask(boot.listenUmask)
- listener, err := net.Listen(boot.listenNetwork, boot.listenAddr)
- syscall.Umask(oldUmask)
- if err != nil {
- return fmt.Errorf("main listener: %v", err)
- }
-
finalErrors := make(chan error)
// The profiler will only be activated by HTTP requests. HTTP
@@ -241,8 +236,25 @@ func run(boot bootConfig, cfg config.Config) error {
done := make(chan os.Signal, 1)
signal.Notify(done, syscall.SIGINT, syscall.SIGTERM)
- server := http.Server{Handler: up}
- go func() { finalErrors <- server.Serve(listener) }()
+ listenerFromBootConfig := config.ListenerConfig{
+ Network: boot.listenNetwork,
+ Addr: boot.listenAddr,
+ }
+ var listeners []net.Listener
+ oldUmask := syscall.Umask(boot.listenUmask)
+ for _, cfg := range append(cfg.Listeners, listenerFromBootConfig) {
+ l, err := newListener("upstream", cfg)
+ if err != nil {
+ return err
+ }
+ listeners = append(listeners, l)
+ }
+ syscall.Umask(oldUmask)
+
+ srv := &http.Server{Handler: up}
+ for _, l := range listeners {
+ go func(l net.Listener) { finalErrors <- srv.Serve(l) }(l)
+ }
select {
case err := <-finalErrors:
@@ -254,6 +266,6 @@ func run(boot bootConfig, cfg config.Config) error {
defer cancel()
redis.Shutdown()
- return server.Shutdown(ctx)
+ return srv.Shutdown(ctx)
}
}
diff --git a/workhorse/main_test.go b/workhorse/main_test.go
index 88db9e0103b..59090cc1232 100644
--- a/workhorse/main_test.go
+++ b/workhorse/main_test.go
@@ -58,6 +58,7 @@ func TestMain(m *testing.M) {
}
defer gitaly.CloseConnections()
+ gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
os.Exit(m.Run())
}
@@ -800,9 +801,6 @@ func startWorkhorseServer(authBackend string) *httptest.Server {
func startWorkhorseServerWithConfig(cfg *config.Config) *httptest.Server {
testhelper.ConfigureSecret()
u := upstream.NewUpstream(*cfg, logrus.StandardLogger())
-
- gitaly.InitializeSidechannelRegistry(logrus.StandardLogger())
-
return httptest.NewServer(u)
}
@@ -823,20 +821,6 @@ func gitOkBody(t *testing.T) *api.Response {
}
}
-func gitOkBodyWithSidechannel(t *testing.T) *api.Response {
- return &api.Response{
- GL_ID: "user-123",
- GL_USERNAME: "username",
- Repository: gitalypb.Repository{
- StorageName: "default",
- RelativePath: "foo/bar.git",
- },
- GitalyServer: gitaly.Server{
- Sidechannel: true,
- },
- }
-}
-
func httpGet(t *testing.T, url string, headers map[string]string) (*http.Response, string) {
req, err := http.NewRequest("GET", url, nil)
require.NoError(t, err)
diff --git a/workhorse/testdata/localhost.crt b/workhorse/testdata/localhost.crt
new file mode 100644
index 00000000000..bee60e42e00
--- /dev/null
+++ b/workhorse/testdata/localhost.crt
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEjjCCAvagAwIBAgIQC2au+A/aGQ2Z21O0wVoEwjANBgkqhkiG9w0BAQsFADCB
+pTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMT0wOwYDVQQLDDRpZ29y
+ZHJvemRvdkBJZ29ycy1NYWNCb29rLVByby0yLmxvY2FsIChJZ29yIERyb3pkb3Yp
+MUQwQgYDVQQDDDtta2NlcnQgaWdvcmRyb3pkb3ZASWdvcnMtTWFjQm9vay1Qcm8t
+Mi5sb2NhbCAoSWdvciBEcm96ZG92KTAeFw0yMjAzMDcwNDMxMjRaFw0yNDA2MDcw
+NDMxMjRaMGgxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0
+ZTE9MDsGA1UECww0aWdvcmRyb3pkb3ZASWdvcnMtTWFjQm9vay1Qcm8tMi5sb2Nh
+bCAoSWdvciBEcm96ZG92KTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AMJ8ofGdcnenVRtNGViF4oxPv+CCFA6D2nfsjkJG8kmO6WW7VlbhJYxCMAuyFF1F
+b2UI2rrTFL8Aeq1KxeQzdrb3cpCquVH/UQ00G4ply28XVPRdbIyLQvOThMEeLL6v
+6gb4edL5oZmo/vWhdQxv0NGt282PAEt+bjnbdl28on8WVzmsw/m0nZ2BVWke+oUM
+krfsbyFaZj7aW8w0dNeK25ANy/Ldx55ENRDquphwYHDnpFOQpkHo5nPuoms5j2Sf
+GW3u3hgeFhRrFjqDstU3OKdA4AdHntDjl0gHm35w1m8PXiql/3EpkEMMx5ixQAqM
+cMZ7VVzy0HIjqsjdJZpzjx8CAwEAAaN2MHQwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud
+JQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFKTVZ2JsYLGJOP+UX0AwGO/81Kab
+MCwGA1UdEQQlMCOCCWxvY2FsaG9zdIcEfwAAAYcQAAAAAAAAAAAAAAAAAAAAATAN
+BgkqhkiG9w0BAQsFAAOCAYEAkGntoogSlhukGqTNbTXN9T/gXLtx9afWlgcBEafF
+MYQoJ1DOwXoYCQkMsxE0xWUyLDTpvjzfKkkyQwWzTwcYqRHOKafKYVSvENU5oaDY
+c2nk32SfkcF6bqJ50uBlFMEvKFExU1U+YSJhuEH/iqT9sSd52uwmnB0TJhSOc3J/
+1ZapKM2G71ezi8OyizwlwDJAwQ37CqrYS2slVO6Cy8zJ1l/ZsZ+kxRb+ME0LREI0
+J/rFTo9A6iyuXeBQ2jiRUrC6pmmbUQbVSjROx4RSmWoI/58/VnuZBY9P62OAOgUv
+pukfAbh3SUjN5++m4Py7WjP/y+L2ILPOFtxTY+CQPWQ5Hbff8iMB4NNfutdU1wSS
+CzXT1zWbU12kXod80wkMqWvNb3yU5spqXV6WYhOHiDIyqpPIqp5/i93Ck3Hd6/BQ
+DYlNOQsVHdSjWzNw9UubjpatiFqMK4hvJZE0haoLlmfDeZeqWk9oAuuCibLJGPg4
+TQri+lKgi0e76ynUr1zP1xUR
+-----END CERTIFICATE-----
diff --git a/workhorse/testdata/localhost.key b/workhorse/testdata/localhost.key
new file mode 100644
index 00000000000..b708582f02e
--- /dev/null
+++ b/workhorse/testdata/localhost.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCfKHxnXJ3p1Ub
+TRlYheKMT7/gghQOg9p37I5CRvJJjullu1ZW4SWMQjALshRdRW9lCNq60xS/AHqt
+SsXkM3a293KQqrlR/1ENNBuKZctvF1T0XWyMi0Lzk4TBHiy+r+oG+HnS+aGZqP71
+oXUMb9DRrdvNjwBLfm4523ZdvKJ/Flc5rMP5tJ2dgVVpHvqFDJK37G8hWmY+2lvM
+NHTXituQDcvy3ceeRDUQ6rqYcGBw56RTkKZB6OZz7qJrOY9knxlt7t4YHhYUaxY6
+g7LVNzinQOAHR57Q45dIB5t+cNZvD14qpf9xKZBDDMeYsUAKjHDGe1Vc8tByI6rI
+3SWac48fAgMBAAECggEALuZXNyi8vdYAVAEXp51BsIxavQ0hQQ7S1DCbbagmLU7l
+Qb8XZwQMRfKAG5HqD0P7ROYJuRvF2PmIm9l4Nzuh2SV63yAMaJWlOgXizlEV6cg6
+mGMfFhVPI+XjEZ7xM1rAmMW6uwGv0ppKQXmZ/FHKjYXbh4qAi7QFaLZfqOMgXHzf
+C4nxf0xMzPP7rBnaxAGBRJWC+/UWxd1MVoHRjink4V/Tdy4zu+cEJ+2wuGawp4nz
+dEWYITzXMcBUKmZQHiOm+r58HpWK3mgXpJQBg3WqjR2iNa+ElyoPoGC6zu5Jd8Xg
+mMG2jHPFu+2F4UvymgxbKZqKHqcNjO7WMZRtIRiJgQKBgQDZGXUme0S5Bh8/y1us
+ltEfy4INFYJAejVxPwv7mRLtySqZLkWAPQTaSGgIk/XMTBYS3Ia9XD6Jl3zwo1qF
+R+y3ZkusGmk73o35kBxjc6purDei7CqMzwulbFTsUglDiF9T4X24bv1yK3lP2n8A
+Y6kLsscEC1wIEuwV5HFyQ2S9zwKBgQDlVepMrQ84FxQxN474LakwWLSkwo+6jS37
+61VPUqDUQpE4fGM6+F3fG+9YDMgvOVDneZ0MvzoiDRynbzF7K3k3fIBrYYbTRz7J
+p23BbTninzhrYTE/xd3LuFCZibCXA7nRa0QmYdXG4nUM2jjsjdR5AG7c/qJQDNun
+SXTbfM49sQKBgQCM9Jl6hbiGBTKO4gNAmJ9o7GIhCqEKKg6+23d1QNroZp9w23km
+nPeknjRltWN25MPENUiKc/Tqst/dAcLJHHzWSuXA9Vj0FTjLG0VDURsMRmbNMlci
+G1/tZNvyoAUBwu5Z8OMGt5F46j8WmL+yygI85TOQLavwVhDQ2gTKcnVbQwKBgQC0
+2VCf0KU8xS5eNYLgARn3jyw89VTkduq5S3aFzBIZ8LiWQ7j4yt0z0NKoq8O9QcSk
+FUocwDv2mEJtYwkxKTI46ExY4Zqxx/Aik47AxwKrzIVwYD+3G7DxMtMUkPkZzY1e
+MOmYHvS3FuPZE8lp+dqA5S+HxKF44Pria9HkOAJnsQKBgE853d9sR0DlJtEj64yu
+FX1rCle/UUODClktPgrwuM+xYutxOiEu6HUWHJI2yvWNk4oNL8Xd0IkR9NlwdatU
+E3+WDua+yYAsI9yWYn3+iqp+owNATkEDjWGivt0Onmgttt5kLHzPFCViIcgl32vv
+7V/plCsmgrS98xZHRrriTLvz
+-----END PRIVATE KEY-----
diff --git a/yarn.lock b/yarn.lock
index 5b20e7536e9..236523c3625 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -34,14 +34,7 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
- integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==
- dependencies:
- "@babel/highlight" "^7.16.0"
-
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.16.7":
+"@babel/code-frame@7.16.7", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@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==
@@ -90,10 +83,10 @@
dependencies:
eslint-rule-composer "^0.3.0"
-"@babel/generator@^7.15.4", "@babel/generator@^7.17.3", "@babel/generator@^7.17.7":
- version "7.17.7"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad"
- integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==
+"@babel/generator@^7.17.7", "@babel/generator@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc"
+ integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==
dependencies:
"@babel/types" "^7.17.0"
jsesc "^2.5.1"
@@ -169,23 +162,22 @@
"@babel/traverse" "^7.10.1"
"@babel/types" "^7.10.1"
-"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.15.4", "@babel/helper-function-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f"
- integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==
+"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.15.4", "@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/helper-get-function-arity" "^7.16.7"
"@babel/template" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/types" "^7.17.0"
-"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.16.7":
+"@babel/helper-get-function-arity@^7.10.1":
version "7.16.7"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419"
integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==
dependencies:
"@babel/types" "^7.16.7"
-"@babel/helper-hoist-variables@^7.10.1", "@babel/helper-hoist-variables@^7.15.4", "@babel/helper-hoist-variables@^7.16.7":
+"@babel/helper-hoist-variables@^7.10.1", "@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==
@@ -281,7 +273,7 @@
dependencies:
"@babel/types" "^7.16.7"
-"@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7", "@babel/helper-validator-identifier@^7.16.7":
+"@babel/helper-validator-identifier@^7.15.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==
@@ -310,7 +302,7 @@
"@babel/traverse" "^7.17.3"
"@babel/types" "^7.17.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0", "@babel/highlight@^7.16.7":
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
version "7.16.10"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
@@ -319,15 +311,10 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@7.15.8":
- version "7.15.8"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016"
- integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==
-
-"@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.16.7", "@babel/parser@^7.17.3", "@babel/parser@^7.17.8":
- version "7.17.8"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.8.tgz#2817fb9d885dd8132ea0f8eb615a6388cca1c240"
- integrity sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.17.8", "@babel/parser@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
+ integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
"@babel/plugin-proposal-async-generator-functions@^7.10.1":
version "7.10.1"
@@ -858,11 +845,6 @@
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/standalone@^7.0.0":
- version "7.10.2"
- resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.10.2.tgz#49dbbadcbc4b199df064d7d8b3e21c915b84abdb"
- integrity sha512-PNQuj9oQH6BL/3l9iiL8hJLQwX14woA2/FHcPtNIZAc7IgFZYJdtMBMXiy4xcefADHTSvoBnmc2AybrHRW1IKQ==
-
"@babel/template@^7.10.1", "@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"
@@ -872,46 +854,23 @@
"@babel/parser" "^7.16.7"
"@babel/types" "^7.16.7"
-"@babel/traverse@7.15.4":
- version "7.15.4"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d"
- integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==
- dependencies:
- "@babel/code-frame" "^7.14.5"
- "@babel/generator" "^7.15.4"
- "@babel/helper-function-name" "^7.15.4"
- "@babel/helper-hoist-variables" "^7.15.4"
- "@babel/helper-split-export-declaration" "^7.15.4"
- "@babel/parser" "^7.15.4"
- "@babel/types" "^7.15.4"
- debug "^4.1.0"
- globals "^11.1.0"
-
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.4", "@babel/traverse@^7.17.3":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57"
- integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.15.4", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d"
+ integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==
dependencies:
"@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.3"
+ "@babel/generator" "^7.17.9"
"@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
+ "@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.17.3"
+ "@babel/parser" "^7.17.9"
"@babel/types" "^7.17.0"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@7.15.6":
- version "7.15.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f"
- integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==
- dependencies:
- "@babel/helper-validator-identifier" "^7.14.9"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.15.4", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.15.4", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
version "7.17.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
@@ -924,10 +883,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@braintree/sanitize-url@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz#8ff71d51053cd5ee4981e5a501d80a536244f7fd"
- integrity sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==
+"@braintree/sanitize-url@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f"
+ integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
@@ -972,10 +931,10 @@
resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e"
integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg==
-"@gitlab/eslint-plugin@12.0.1":
- version "12.0.1"
- resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-12.0.1.tgz#307486721e51cef223cf03dd2bae6d67d3286237"
- integrity sha512-YVa6Pegiklu22V7jN/cj77E10L2M0aEN3A4UTzbCH57yQOVwyJC+bG33/eqzq175YFYWwnbkCOB22lBMLDizYQ==
+"@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==
dependencies:
"@babel/core" "^7.17.0"
"@babel/eslint-parser" "^7.17.0"
@@ -987,9 +946,8 @@
eslint-plugin-jest "^23.8.2"
eslint-plugin-promise "^4.2.1"
eslint-plugin-unicorn "^40.1.0"
- eslint-plugin-vue "^7.5.0"
+ eslint-plugin-vue "^8.5.0"
lodash "^4.17.21"
- vue-eslint-parser "^7.0.0"
"@gitlab/favicon-overlay@2.0.0":
version "2.0.0"
@@ -1005,190 +963,188 @@
stylelint-declaration-strict-value "1.8.0"
stylelint-scss "4.1.0"
-"@gitlab/svgs@2.8.0":
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.8.0.tgz#b32f3672d9cffa2d59f5edb6828ae931a36d220f"
- integrity sha512-N1D6q5xKze3HwPMjLnsXMZOPQGX4CT+jEQgZYkB8akVx/rqT/YSZ9pZaxWoRdq1Tiwi9B2ArctopRgNiN8fqdw==
+"@gitlab/svgs@2.14.0":
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.14.0.tgz#92b36bc98ccbed49a4dbca310862146275091cb2"
+ integrity sha512-U9EYmEIiTMl7R3X5DmCrw6fz7gz8c1kjvQtaF6HfJ15xDtR7trRAyCNbn3z7YGk1QJ8Cv/Ifw2/T5SxXwYd7dw==
-"@gitlab/ui@38.8.1":
- version "38.8.1"
- resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-38.8.1.tgz#f4892ffd51c4cacf30cb94ffca31487afdac2b0c"
- integrity sha512-eTGt+LODmox1GZRkLfFH9/zl4dG9/6ewpYzXvIo1B4uzHz27lhEgVSM57nZRPXmk4o05LQMnm6eelHoBdMX13g==
+"@gitlab/ui@40.2.1":
+ version "40.2.1"
+ resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-40.2.1.tgz#510ea1cda0a62afbfb0bc6a74b56e1128ddef428"
+ integrity sha512-dDsyu8Zuf5MYZwx6A6m2TeIPJL+ytTP7J0x0M8649MOqJJB2/3pq8IfcowWSQAvpO57w5N+G/QlotNypZ3e31w==
dependencies:
- "@babel/standalone" "^7.0.0"
+ "@popperjs/core" "^2.11.2"
bootstrap-vue "2.20.1"
- copy-to-clipboard "^3.0.8"
- dompurify "^2.3.6"
+ dompurify "^2.3.7"
echarts "^5.2.1"
- highlight.js "^10.6.0"
iframe-resizer "^4.3.2"
- js-beautify "^1.8.8"
lodash "^4.17.20"
portal-vue "^2.1.6"
- url-search-params-polyfill "^5.0.0"
vue-runtime-helpers "^1.1.2"
-"@gitlab/visual-review-tools@1.6.1":
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/@gitlab/visual-review-tools/-/visual-review-tools-1.6.1.tgz#0d8f3ff9f51b05f7c80b9a107727703d48997e4e"
- integrity sha512-vY8K1igwZFoEOmU0h4E7XTLlilsQ4ylPr27O01UsSe6ZTKi6oEMREsRAEpNIUgRlxUARCsf+Opp4pgSFzFkFcw==
-
-"@graphql-eslint/eslint-plugin@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.0.0.tgz#d0f7d6e4f6f772312500abbf6c94c59d5cb52c12"
- integrity sha512-EfkMABrCbWhhArEGg4w2r/z8sEPp1fL0Ar3xFWBX9c11t5+T5XqGAGVxUi5vuEx9PrSqhYisPrxTibqNoxuEzQ==
- dependencies:
- "@babel/code-frame" "7.16.0"
- "@graphql-tools/code-file-loader" "7.2.2"
- "@graphql-tools/graphql-tag-pluck" "7.1.3"
- "@graphql-tools/import" "6.6.1"
- "@graphql-tools/utils" "8.5.3"
- graphql-config "4.1.0"
+"@gitlab/visual-review-tools@1.7.3":
+ version "1.7.3"
+ 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.2":
+ version "3.10.2"
+ resolved "https://registry.yarnpkg.com/@graphql-eslint/eslint-plugin/-/eslint-plugin-3.10.2.tgz#b8b271aef219623e6a0517cfababe6063072077f"
+ integrity sha512-UJwpeMC4q3/Ofeh3aOp9aJOtomJjQEz7zk8lqXeexqkDBXI0d9dedYlWWL5MqcFhKxtBxsU5xq0w4th0c+0aAQ==
+ dependencies:
+ "@babel/code-frame" "7.16.7"
+ "@graphql-tools/code-file-loader" "^7.2.8"
+ "@graphql-tools/graphql-tag-pluck" "^7.2.0"
+ "@graphql-tools/utils" "^8.6.5"
+ chalk "4.1.2"
+ debug "4.3.4"
+ fast-glob "3.2.11"
+ graphql-config "^4.3.0"
graphql-depth-limit "1.1.0"
lodash.lowercase "4.3.0"
-"@graphql-tools/batch-execute@^8.3.1":
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.3.1.tgz#0b74c54db5ac1c5b9a273baefc034c2343ebbb74"
- integrity sha512-63kHY8ZdoO5FoeDXYHnAak1R3ysMViMPwWC2XUblFckuVLMUPmB2ONje8rjr2CvzWBHAW8c1Zsex+U3xhKtGIA==
+"@graphql-tools/batch-execute@8.4.1":
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-8.4.1.tgz#bc5e96ad22c545676da523bae3c3dc94e57bdf3e"
+ integrity sha512-63+lNWrwXmofjZVa7ML+n9CBviClF3K+RP3Xx3hxGQ8BrhvB1pWS1yzaUZqrkiiKdTu1v3mJGVfmooHwzlyPwQ==
dependencies:
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/utils" "8.6.5"
dataloader "2.0.0"
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/code-file-loader@7.2.2":
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.2.2.tgz#79f8ce5723ee87ecb4d490d1497ac7e616340358"
- integrity sha512-AADyxqipGWLBl4N59CGPgv3i35UF1fQpJvbC5a6TXmcppnghD2olDLewOh1pIQrwxGAAh1S75XVIi28PTKYZhg==
+"@graphql-tools/code-file-loader@^7.2.8":
+ version "7.2.10"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.2.10.tgz#cdae206399061b198652964213b32309e5980af1"
+ integrity sha512-41QkLztHhoDXBp2EtbKwQNQHv4HEDzpEmbOD0y3OVOXf8TBVUnFUMlnGn77a6f4zVi3rHWxHgJJ79iyJ0MYQ5w==
dependencies:
- "@graphql-tools/graphql-tag-pluck" "^7.1.3"
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/graphql-tag-pluck" "7.2.2"
+ "@graphql-tools/utils" "8.6.5"
globby "^11.0.3"
tslib "~2.3.0"
unixify "^1.0.0"
-"@graphql-tools/delegate@^8.4.1", "@graphql-tools/delegate@^8.4.2":
- version "8.4.2"
- resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-8.4.2.tgz#a61d45719855720304e3656800342cfa17d82558"
- integrity sha512-CjggOhiL4WtyG2I3kux+1/p8lQxSFHBj0gwa0NxnQ6Vsnpw7Ig5VP1ovPnitFuBv2k4QdC37Nj2xv2n7DRn8fw==
+"@graphql-tools/delegate@8.7.1":
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-8.7.1.tgz#f30b9d035a76dc7a8e9292f31bb073fb4d6d9d83"
+ integrity sha512-e98/NRaOH5wQy624bRd5i5qUKz5tCs8u4xBmxW89d7t6V6CveXj7pvAgmnR9DbwOkO6IA3P799p/aa/YG/pWTA==
dependencies:
- "@graphql-tools/batch-execute" "^8.3.1"
- "@graphql-tools/schema" "^8.3.1"
- "@graphql-tools/utils" "^8.5.3"
+ "@graphql-tools/batch-execute" "8.4.1"
+ "@graphql-tools/schema" "8.3.6"
+ "@graphql-tools/utils" "8.6.5"
dataloader "2.0.0"
+ graphql-executor "0.0.22"
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/graphql-file-loader@^7.3.2":
- version "7.3.3"
- resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.3.tgz#7cee2f84f08dc13fa756820b510248b857583d36"
- integrity sha512-6kUJZiNpYKVhum9E5wfl5PyLLupEDYdH7c8l6oMrk6c7EPEVs6iSUyB7yQoWrtJccJLULBW2CRQ5IHp5JYK0mA==
+"@graphql-tools/graphql-file-loader@^7.3.7":
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.3.7.tgz#f5cb05b0e3cd462d74eae47c5b9c08ed6b989837"
+ integrity sha512-fwXLycYvabPhusGtYuFrOPbjeIvLWr6viGkQc9KmiBm2Z2kZrlNRNUlYkXXRzMoiqRkzqFJYhOgWDE7LsOnbjw==
dependencies:
- "@graphql-tools/import" "^6.5.7"
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/import" "6.6.9"
+ "@graphql-tools/utils" "8.6.5"
globby "^11.0.3"
tslib "~2.3.0"
unixify "^1.0.0"
-"@graphql-tools/graphql-tag-pluck@7.1.3", "@graphql-tools/graphql-tag-pluck@^7.1.3":
- version "7.1.3"
- resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.1.3.tgz#2c638aac84f279f95bf3da50b71f2b4b82641539"
- integrity sha512-zxVYLiAnNxFg6bnDZdNpLJNfjf6GHYLQsVHDcbYyQcWJzIaeWPylX/Q1gyvw8MFO4ICYExNPqgBA/is2kZBlHw==
+"@graphql-tools/graphql-tag-pluck@7.2.2", "@graphql-tools/graphql-tag-pluck@^7.2.0":
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-7.2.2.tgz#449bb0516a2aceb9c0251c321c8cde46c7b42b7d"
+ integrity sha512-5gYk6Cj35eU6N9+2WtV4tsCcJACVPK2F3+xci2WgoPrDZXYQshx6tyuIQIFszyhxWNa1KViwCZyxVy6U1UnqzA==
dependencies:
- "@babel/parser" "7.15.8"
- "@babel/traverse" "7.15.4"
- "@babel/types" "7.15.6"
- "@graphql-tools/utils" "^8.5.1"
+ "@babel/parser" "^7.16.8"
+ "@babel/traverse" "^7.16.8"
+ "@babel/types" "^7.16.8"
+ "@graphql-tools/utils" "8.6.5"
tslib "~2.3.0"
-"@graphql-tools/import@6.6.1", "@graphql-tools/import@^6.5.7":
- version "6.6.1"
- resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.6.1.tgz#2a7e1ceda10103ffeb8652a48ddc47150b035485"
- integrity sha512-i9WA6k+erJMci822o9w9DoX+uncVBK60LGGYW8mdbhX0l7wEubUpA000thJ1aarCusYh0u+ZT9qX0HyVPXu25Q==
+"@graphql-tools/import@6.6.9":
+ version "6.6.9"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.6.9.tgz#53e1517074c756b5191d23d4f1528246913d44ba"
+ integrity sha512-sKaLqvPmNLQlY4te+nnBhRrf5WBISoiyVkbriCLz0kHw805iHdJaU2KxUoHsRTR7WlYq0g9gzB0oVaRh99Q5aA==
dependencies:
- "@graphql-tools/utils" "8.5.3"
+ "@graphql-tools/utils" "8.6.5"
resolve-from "5.0.0"
tslib "~2.3.0"
-"@graphql-tools/json-file-loader@^7.3.2":
- version "7.3.3"
- resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.3.3.tgz#45cfde77b9dc4ab6c21575305ae537d2814d237f"
- integrity sha512-CN2Qk9rt+Gepa3rb3X/mpxYA5MIYLwZBPj2Njw6lbZ6AaxG+O1ArDCL5ACoiWiBimn1FCOM778uhRM9znd0b3Q==
+"@graphql-tools/json-file-loader@^7.3.7":
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-7.3.7.tgz#3ddae0b15d3c57d1980fa5203541c2e6cd6a5ff4"
+ integrity sha512-dm0LcfiWYin7cUR4RWC33C9bNppujvSU7hwTH+sHmSguNnat9Kn8dBntVSgrY3qCbKuGfz/PshQHIODXrRwAKg==
dependencies:
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/utils" "8.6.5"
globby "^11.0.3"
tslib "~2.3.0"
unixify "^1.0.0"
-"@graphql-tools/load@^7.4.1":
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.4.1.tgz#aa572fcef11d6028097b6ef39c13fa9d62e5a441"
- integrity sha512-UvBodW5hRHpgBUBVz5K5VIhJDOTFIbRRAGD6sQ2l9J5FDKBEs3u/6JjZDzbdL96br94D5cEd2Tk6auaHpTn7mQ==
+"@graphql-tools/load@^7.5.5":
+ version "7.5.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-7.5.6.tgz#d0ee8149ba4cbc799dbeae30e4843144773f8296"
+ integrity sha512-IocEP4METGdbDzV44VaeiXO387NOYSW4cTuBP8qybHZX0XlIp8bEv7c8GKS3m8DeRop/9SnOL7HyiAfNMA4Chg==
dependencies:
- "@graphql-tools/schema" "8.3.1"
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/schema" "8.3.6"
+ "@graphql-tools/utils" "8.6.5"
p-limit "3.1.0"
tslib "~2.3.0"
-"@graphql-tools/merge@^8.2.1":
- version "8.2.1"
- resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.2.1.tgz#bf83aa06a0cfc6a839e52a58057a84498d0d51ff"
- integrity sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==
+"@graphql-tools/merge@8.2.6", "@graphql-tools/merge@^8.2.6":
+ version "8.2.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.2.6.tgz#7fb615fa9c143c3151ff025e501d52bd48186d19"
+ integrity sha512-dkwTm4czMISi/Io47IVvq2Fl9q4TIGKpJ0VZjuXYdEFkECyH6A5uwxZfPVandZG+gQs8ocFFoa6RisiUJLZrJw==
dependencies:
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/utils" "8.6.5"
tslib "~2.3.0"
-"@graphql-tools/schema@8.3.1", "@graphql-tools/schema@^8.3.1":
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.1.tgz#1ee9da494d2da457643b3c93502b94c3c4b68c74"
- integrity sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==
+"@graphql-tools/schema@8.3.6":
+ version "8.3.6"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.3.6.tgz#80cfe3eba53eb6390a60a30078d7efbdaa5cc0b7"
+ integrity sha512-7tWYRQ8hB/rv2zAtv2LtnQl4UybyJPtRz/VLKRmgi7+F5t8iYBahmmsxMDAYMWMmWMqEDiKk54TvAes+J069rQ==
dependencies:
- "@graphql-tools/merge" "^8.2.1"
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/merge" "8.2.6"
+ "@graphql-tools/utils" "8.6.5"
tslib "~2.3.0"
value-or-promise "1.0.11"
-"@graphql-tools/url-loader@^7.4.2":
- version "7.5.2"
- resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.5.2.tgz#fb3737fd1269ab61b195b63052179b6049d90ce1"
- integrity sha512-EilHqbhUY/qg55SSEdklDhPXgSz9+9a63SX3mcD8J2qwZHJD/wOLcyKs8m6BXfuGwUiuB0j3fmDSEVmva2onBg==
+"@graphql-tools/url-loader@^7.9.7":
+ version "7.9.8"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-7.9.8.tgz#8e50ca05fb670bf91b98abdcb5d8d9cb116003f3"
+ integrity sha512-nRMXwwoIDLt7ohBWvKKjEEH61YS1nnWs6BVgGStePfmRGrhxECpLWmfAmKLNXPqDJN7Nu6ykFJYjt65j5l6qsw==
dependencies:
- "@graphql-tools/delegate" "^8.4.1"
- "@graphql-tools/utils" "^8.5.1"
- "@graphql-tools/wrap" "^8.3.1"
- "@n1ru4l/graphql-live-query" "0.9.0"
- "@types/websocket" "1.0.4"
+ "@graphql-tools/delegate" "8.7.1"
+ "@graphql-tools/utils" "8.6.5"
+ "@graphql-tools/wrap" "8.4.10"
+ "@n1ru4l/graphql-live-query" "^0.9.0"
+ "@types/websocket" "^1.0.4"
"@types/ws" "^8.0.0"
- cross-undici-fetch "^0.0.20"
+ cross-undici-fetch "^0.1.19"
dset "^3.1.0"
- extract-files "11.0.0"
+ extract-files "^11.0.0"
graphql-sse "^1.0.1"
graphql-ws "^5.4.1"
- isomorphic-ws "4.0.1"
- meros "1.1.4"
+ isomorphic-ws "^4.0.1"
+ meros "^1.1.4"
subscriptions-transport-ws "^0.11.0"
- sync-fetch "0.3.1"
- tslib "~2.3.0"
- valid-url "1.0.9"
- value-or-promise "1.0.11"
- ws "8.2.3"
+ sync-fetch "^0.3.1"
+ tslib "^2.3.0"
+ value-or-promise "^1.0.11"
+ ws "^8.3.0"
-"@graphql-tools/utils@8.5.3", "@graphql-tools/utils@^8.5.1", "@graphql-tools/utils@^8.5.3":
- version "8.5.3"
- resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.5.3.tgz#404062e62cae9453501197039687749c4885356e"
- integrity sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==
+"@graphql-tools/utils@8.6.5", "@graphql-tools/utils@^8.6.5":
+ version "8.6.5"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.6.5.tgz#ac04571b03f854c7a938b2ab700516a6c6d32335"
+ integrity sha512-mjOtaWiS2WIqRz/cq5gaeM3sVrllcu2xbtHROw1su1v3xWa3D3dKgn8Lrl7+tvWs5WUVySsBss/VZ3WdoPkCrA==
dependencies:
tslib "~2.3.0"
-"@graphql-tools/wrap@^8.3.1":
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-8.3.2.tgz#d3bcecb7529d071e4ecc4dfc75b9566e3da79d4f"
- integrity sha512-7DcOBFB+Dd84x9dxSm7qS4iJONMyfLnCJb8A19vGPffpu4SMJ3sFcgwibKFu5l6mMUiigKgXna2RRgWI+02bKQ==
+"@graphql-tools/wrap@8.4.10":
+ version "8.4.10"
+ resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-8.4.10.tgz#010be7d4bafa5d79cd1917c65d09f2682bcb9d54"
+ integrity sha512-1/pcKRDTGIUspUl6uhlfQ0u1l4j15TVGkOkijI+gX25Q9sfAJclT0bovKBksP39G6v4hZnolpOU2txJ47MxxEg==
dependencies:
- "@graphql-tools/delegate" "^8.4.2"
- "@graphql-tools/schema" "^8.3.1"
- "@graphql-tools/utils" "^8.5.3"
+ "@graphql-tools/delegate" "8.7.1"
+ "@graphql-tools/schema" "8.3.6"
+ "@graphql-tools/utils" "8.6.5"
tslib "~2.3.0"
value-or-promise "1.0.11"
@@ -1431,7 +1387,7 @@
resolved "https://registry.yarnpkg.com/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz#d26b6b7483fb70cd62189d05c95d2f67153e43f2"
integrity sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==
-"@n1ru4l/graphql-live-query@0.9.0":
+"@n1ru4l/graphql-live-query@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@n1ru4l/graphql-live-query/-/graphql-live-query-0.9.0.tgz#defaebdd31f625bee49e6745934f36312532b2bc"
integrity sha512-BTpWy1e+FxN82RnLz4x1+JcEewVdfmUhV1C6/XYD5AjS7PQp9QFF7K8bCD6gzPTr2l+prvqOyVueQhFJxB1vfg==
@@ -1478,10 +1434,10 @@
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.12.tgz#431ec342a7195622f86688bbda82e3166ce8cb28"
integrity sha512-6RglhutqrGFMO1MNUXp95RBuYIuc8wTnMAV5MUhLmjTOy78ncwOw7RgeQ/HeymkKXRhZd0s2DNrM1rL7unk3MQ==
-"@popperjs/core@^2.9.0":
- version "2.10.2"
- resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590"
- integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==
+"@popperjs/core@^2.11.2", "@popperjs/core@^2.9.0":
+ version "2.11.5"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
+ integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
"@rails/actioncable@6.1.4-7":
version "6.1.4-7"
@@ -1589,10 +1545,10 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.0.0-beta.174":
- version "2.0.0-beta.174"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.174.tgz#cfdf16b7d7401e4b255dc69147d784f5f537b942"
- integrity sha512-APQDto40PdvagG1HTwkKlieQS4Vp6GXNe7qgV1Qo2QCgJCLyxc/fXCTghtrOx0CQb+9JT7fjSLZxbSyUFXjx7Q==
+"@tiptap/core@^2.0.0-beta.175":
+ version "2.0.0-beta.175"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.175.tgz#d23f6e60308cde192451121e21df83c256bdcd92"
+ integrity sha512-dDf+2GtifskNLysn49kaCIz0o5hf6VDZ8J7jSQAfoPDEkEkfw9OKhWrR7NzWW6J34CSJreFDRiWkGt8Qz283Vg==
dependencies:
"@types/prosemirror-commands" "^1.0.4"
"@types/prosemirror-keymap" "^1.0.4"
@@ -1619,10 +1575,10 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.26.tgz#aa1c7850df28cec8e0614fde437183bd4ae3e66b"
integrity sha512-pnO0I5sEQM3pmowjMGQ74adLzvc6HqGyLyqMizaGMicPu9uTYlSdId+qckYEEgPwPMaEShtv2Vg+ZHs7KVqfcg==
-"@tiptap/extension-bubble-menu@^2.0.0-beta.55":
- version "2.0.0-beta.55"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.55.tgz#a26ad892cea6af9eeada22235701b06d0921af48"
- integrity sha512-v32/QnwwRbepdbrho8mTYru1/XNW/rJi3Mjrgo3rrIs67R86aEPmhmdzD3QEQUJhAJkduuwdw8zElmVWqIJQ9w==
+"@tiptap/extension-bubble-menu@^2.0.0-beta.56":
+ version "2.0.0-beta.56"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.56.tgz#d99cb673610a3af7e12444f4538463c7c58bfa04"
+ integrity sha512-nZozwauICdaNPmDPrSn1JFd/9/2rLtK8i2vBOcqxWHObVROvu8ZlJspnrJv23vS6P7/ZO3e/QLVHpnn+1yVq3g==
dependencies:
prosemirror-state "^1.3.4"
prosemirror-view "^1.23.6"
@@ -1670,10 +1626,10 @@
"@types/prosemirror-dropcursor" "^1.0.3"
prosemirror-dropcursor "^1.4.0"
-"@tiptap/extension-floating-menu@^2.0.0-beta.50":
- version "2.0.0-beta.50"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.50.tgz#e8785d5f051a848ae053ce139581dce96b951a35"
- integrity sha512-aQu1HtthMIYEPylr6kzioLxMiObLbcgwx9xZzF03KwNnkjQLbjZOeJX2RwSYVpiVgtfPBGOm3N/br6NSYec4yQ==
+"@tiptap/extension-floating-menu@^2.0.0-beta.51":
+ version "2.0.0-beta.51"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.51.tgz#a1e53fd1c1d2ac00025d7f094d2b62eb08e81902"
+ integrity sha512-rEe7jADK9xr2n2LJsrGEN3Dz7sEGC1JT/7AdTdaZBxQRQvwxTjomqYGrt+LnX+v0MYggh6swMzj7upJosnKbBg==
dependencies:
prosemirror-state "^1.3.4"
prosemirror-view "^1.23.6"
@@ -1722,10 +1678,10 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.26.tgz#b00c9e32b81b1bd94eaed24bb2a22e44d5dc54a3"
integrity sha512-vejGe2ra4K5ipFOn1U9viqF9X9nPTX8WSJpSOux+9UbKjHpANy7bz69tp66OIi/Wh5L/MMDc+luH/04qfVnpZw==
-"@tiptap/extension-link@^2.0.0-beta.36":
- version "2.0.0-beta.36"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.36.tgz#184bac20f3226b8945e400ebfdce2feabb4f5a3c"
- integrity sha512-jV0EBM/QPfR4e5FG5OPHZARnYS+CL8yhCzHO4J1Nb1i/+vRY9QpPVBruZABBwt+J+PMdq6t/6vvIXejCR3wyAg==
+"@tiptap/extension-link@^2.0.0-beta.37":
+ version "2.0.0-beta.37"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.37.tgz#8d569284b82860e6a9aac42b85ed9c0911e50599"
+ integrity sha512-G5sM1a8Kjm1ZMro+BGsk+yApIDMl7RF/u1PY929HHld7JPsjgB+DZbbQ1U7e9Kxiu/9aDwgOa+w+SLqLiajedw==
dependencies:
linkifyjs "^3.0.5"
prosemirror-model "^1.16.1"
@@ -1784,10 +1740,10 @@
prosemirror-tables "^1.1.1"
prosemirror-view "^1.23.6"
-"@tiptap/extension-task-item@^2.0.0-beta.31":
- version "2.0.0-beta.31"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.0.0-beta.31.tgz#e73f2f1e264d64ac5902ddd13ad3b63cb043b2c9"
- integrity sha512-9MCInLAf/l/wDD1N3GgOImemloFARi1l9AJ5acfo+sDjN52yfvaLb//lvLJ6IGz4xGepeAyCME8Qns8UGqG4RQ==
+"@tiptap/extension-task-item@^2.0.0-beta.32":
+ version "2.0.0-beta.32"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.0.0-beta.32.tgz#590efcf36143cf0afd0bbd7bc1d55bfb91025bf4"
+ integrity sha512-ogeZHDUBNZtlcV6on+I6zenlvsXHzjFcgQIVedK+o4h8icnURFf5m4D3m1hMuM8UGj1pIu4atFDDvAAVi7RLew==
"@tiptap/extension-task-list@^2.0.0-beta.26":
version "2.0.0-beta.26"
@@ -1799,13 +1755,13 @@
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.0.0-beta.15.tgz#f08cff1b78f1c6996464dfba1fef8ec1e107617f"
integrity sha512-S3j2+HyV2gsXZP8Wg/HA+YVXQsZ3nrXgBM9HmGAxB0ESOO50l7LWfip0f3qcw1oRlh5H3iLPkA6/f7clD2/TFA==
-"@tiptap/vue-2@^2.0.0-beta.77":
- version "2.0.0-beta.77"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.77.tgz#d5e7b414bba45d0892e39513dc50387d629b95ca"
- integrity sha512-/wMi7fkqLqfWGhOpcztiGgVyqiCmOPq7TZ2LFx+cokoMJ1HpM8T7vG12u6ezOubB5Ie7/kL6WBcLJ8hONTdX0Q==
+"@tiptap/vue-2@^2.0.0-beta.78":
+ version "2.0.0-beta.78"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.78.tgz#34c5aea2be46914026d8d58638761f1a46b3dc88"
+ integrity sha512-YTgKk7qCTu+odAwEzAseAdE1apYZL4OU3dRvtZ/WAXrs0NpV4H33cjSNx/MqNxdclQEbCPwMj/cRybDuYu0atQ==
dependencies:
- "@tiptap/extension-bubble-menu" "^2.0.0-beta.55"
- "@tiptap/extension-floating-menu" "^2.0.0-beta.50"
+ "@tiptap/extension-bubble-menu" "^2.0.0-beta.56"
+ "@tiptap/extension-floating-menu" "^2.0.0-beta.51"
prosemirror-view "^1.23.6"
"@toast-ui/editor@^2.5.2":
@@ -2210,10 +2166,10 @@
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
-"@types/websocket@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8"
- integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==
+"@types/websocket@^1.0.4":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c"
+ integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==
dependencies:
"@types/node" "*"
@@ -2514,7 +2470,7 @@ acorn-globals@^6.0.0:
acorn "^7.1.1"
acorn-walk "^7.1.1"
-acorn-jsx@^5.2.0, acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
@@ -2539,10 +2495,10 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.0.4:
- version "8.6.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895"
- integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==
+acorn@^8.0.4, acorn@^8.7.0:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
agent-base@4, agent-base@^4.3.0:
version "4.3.0"
@@ -2812,13 +2768,6 @@ astral-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-async@^2.6.2:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
- dependencies:
- lodash "^4.17.14"
-
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -2887,10 +2836,10 @@ babel-jest@^26.5.2:
graceful-fs "^4.2.4"
slash "^3.0.0"
-babel-loader@^8.2.4:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.4.tgz#95f5023c791b2e9e2ca6f67b0984f39c82ff384b"
- integrity sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==
+babel-loader@^8.2.5:
+ version "8.2.5"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
+ integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==
dependencies:
find-cache-dir "^3.3.1"
loader-utils "^2.0.0"
@@ -3416,6 +3365,14 @@ catharsis@~0.8.9:
dependencies:
underscore-contrib "~0.3.0"
+chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.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"
+
chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -3433,14 +3390,6 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^4.0.0, chalk@^4.1.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"
@@ -3679,7 +3628,7 @@ colorette@^2.0.10, colorette@^2.0.14:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
-combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -3706,7 +3655,12 @@ commander@^6.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
-commander@^9.0.0, commander@~9.0.0:
+commander@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9"
+ integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==
+
+commander@~9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-9.0.0.tgz#86d58f24ee98126568936bd1d3574e0308a99a40"
integrity sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==
@@ -3881,13 +3835,6 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-copy-to-clipboard@^3.0.8:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz#d2724a3ccbfed89706fac8a894872c979ac74467"
- integrity sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w==
- dependencies:
- toggle-selection "^1.0.6"
-
copy-webpack-plugin@^6.4.1:
version "6.4.1"
resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e"
@@ -3918,10 +3865,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.22.0:
- version "3.22.0"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.0.tgz#b52007870c5e091517352e833b77f0b2d2b259f3"
- integrity sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==
+core-js@^3.22.5:
+ version "3.22.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.5.tgz#a5f5a58e663d5c0ebb4e680cd7be37536fb2a9cf"
+ integrity sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA==
core-js@~2.3.0:
version "2.3.0"
@@ -4023,15 +3970,17 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
-cross-undici-fetch@^0.0.20:
- version "0.0.20"
- resolved "https://registry.yarnpkg.com/cross-undici-fetch/-/cross-undici-fetch-0.0.20.tgz#6b7c5ac82a3601edd439f37275ac0319d77a120a"
- integrity sha512-5d3WBC4VRHpFndECK9bx4TngXrw0OUXdhX561Ty1ZoqMASz9uf55BblhTC1CO6GhMWnvk9SOqYEXQliq6D2P4A==
+cross-undici-fetch@^0.1.19:
+ version "0.1.28"
+ resolved "https://registry.yarnpkg.com/cross-undici-fetch/-/cross-undici-fetch-0.1.28.tgz#40b7071b9ab2d1d6aff889836205e1972092e8d1"
+ integrity sha512-/nLMyVE5IC9PQdBtmgjpGZfK0wo8UupomAPx+7HlbEgVDkZOa9xCiZP9goo5aLYofP0gHXgovjXdXrE2obANag==
dependencies:
abort-controller "^3.0.0"
- form-data "^4.0.0"
- node-fetch "^2.6.5"
- undici "^4.9.3"
+ form-data-encoder "^1.7.1"
+ formdata-node "^4.3.1"
+ node-fetch "^2.6.7"
+ undici "^5.0.0"
+ web-streams-polyfill "^3.2.0"
crypt@~0.0.1:
version "0.0.2"
@@ -4732,20 +4681,20 @@ debug@3.1.0:
dependencies:
ms "2.0.0"
-debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
- dependencies:
- ms "^2.1.1"
-
-debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, 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.3:
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.1.0, debug@^3.2.6, debug@^3.2.7:
+ 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"
+
decamelize-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
@@ -5030,16 +4979,16 @@ domhandler@^4.0.0, domhandler@^4.2.0:
dependencies:
domelementtype "^2.2.0"
-dompurify@2.3.4:
- version "2.3.4"
- resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6"
- integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ==
-
-dompurify@^2.3.6:
+dompurify@2.3.6:
version "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.7, 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==
+
domutils@^2.5.2, domutils@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.6.0.tgz#2e15c04185d43fb16ae7057cb76433c6edb938b7"
@@ -5439,15 +5388,17 @@ eslint-plugin-unicorn@^40.1.0:
semver "^7.3.5"
strip-indent "^3.0.0"
-eslint-plugin-vue@^7.5.0:
- version "7.5.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.5.0.tgz#cc6d983eb22781fa2440a7573cf39af439bb5725"
- integrity sha512-QnMMTcyV8PLxBz7QQNAwISSEs6LYk2LJvGlxalXvpCtfKnqo7qcY0aZTIxPe8QOnHd7WCwiMZLOJzg6A03T0Gw==
+eslint-plugin-vue@^8.5.0:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz#f13c53547a0c9d64588a675cc5ecc6ccaf63703f"
+ integrity sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==
dependencies:
- eslint-utils "^2.1.0"
+ eslint-utils "^3.0.0"
natural-compare "^1.4.0"
- semver "^7.3.2"
- vue-eslint-parser "^7.4.1"
+ nth-check "^2.0.1"
+ postcss-selector-parser "^6.0.9"
+ semver "^7.3.5"
+ vue-eslint-parser "^8.0.1"
eslint-rule-composer@^0.3.0:
version "0.3.0"
@@ -5470,6 +5421,14 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
+eslint-scope@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
eslint-utils@^2.0.0, eslint-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
@@ -5494,6 +5453,11 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
eslint@7.32.0:
version "7.32.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
@@ -5540,15 +5504,6 @@ eslint@7.32.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
- integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
- dependencies:
- acorn "^7.1.1"
- acorn-jsx "^5.2.0"
- eslint-visitor-keys "^1.1.0"
-
espree@^7.3.0, espree@^7.3.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
@@ -5558,12 +5513,21 @@ espree@^7.3.0, espree@^7.3.1:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^1.3.0"
+espree@^9.0.0:
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
+ integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
+ dependencies:
+ acorn "^8.7.0"
+ acorn-jsx "^5.3.1"
+ eslint-visitor-keys "^3.3.0"
+
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==
-esquery@^1.0.1, esquery@^1.4.0:
+esquery@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
@@ -5790,16 +5754,16 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
-extract-files@11.0.0:
- version "11.0.0"
- resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a"
- integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==
-
extract-files@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-10.0.0.tgz#228b1da1d910971cf8d7f1ed259653c6001ba5ad"
integrity sha512-4KXYOSf8SlMlQCj94Ygy89xIZU2GTs0HU2Nz9mG2/F5TKsHyq/3sDWGjHgHmfw9RhXF3hO+pBKyC6JfIHD52bw==
+extract-files@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a"
+ integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==
+
extract-from-css@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92"
@@ -5822,7 +5786,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.9:
+fast-glob@3.2.11, fast-glob@^3.2.11, fast-glob@^3.2.4, fast-glob@^3.2.9:
version "3.2.11"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
@@ -6019,14 +5983,10 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
+form-data-encoder@^1.7.1:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040"
+ integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==
form-data@~2.3.2:
version "2.3.3"
@@ -6042,6 +6002,14 @@ format@^0.2.0:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+formdata-node@^4.3.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.3.2.tgz#0262e94931e36db7239c2b08bdb6aaf18ec47d21"
+ integrity sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg==
+ dependencies:
+ node-domexception "1.0.0"
+ web-streams-polyfill "4.0.0-beta.1"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -6308,9 +6276,9 @@ got@^9.6.0:
url-parse-lax "^3.0.0"
graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4, graceful-fs@^4.2.6:
- version "4.2.9"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
- integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
graphlib@^2.1.8:
version "2.1.8"
@@ -6319,21 +6287,21 @@ graphlib@^2.1.8:
dependencies:
lodash "^4.17.15"
-graphql-config@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.1.0.tgz#a3b28d3fb537952ebeb69c75e4430605a10695e3"
- integrity sha512-Myqay6pmdcmX3KqoH+bMbeKZ1cTODpHS2CxF1ZzNnfTE+YUpGTcp01bOw6LpzamRb0T/WTYtGFbZeXGo9Hab2Q==
+graphql-config@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-4.3.0.tgz#b9bb7bf9c892a90e66ea937e8d7ed170eb1fd5e2"
+ integrity sha512-Uiu3X7+s5c056WyrvdZVz2vG1fhAipMlYmtiCU/4Z2mX79OXDr1SqIon2MprC/pExIWJfAQZCcjYDY76fPBUQg==
dependencies:
"@endemolshinegroup/cosmiconfig-typescript-loader" "3.0.2"
- "@graphql-tools/graphql-file-loader" "^7.3.2"
- "@graphql-tools/json-file-loader" "^7.3.2"
- "@graphql-tools/load" "^7.4.1"
- "@graphql-tools/merge" "^8.2.1"
- "@graphql-tools/url-loader" "^7.4.2"
- "@graphql-tools/utils" "^8.5.1"
+ "@graphql-tools/graphql-file-loader" "^7.3.7"
+ "@graphql-tools/json-file-loader" "^7.3.7"
+ "@graphql-tools/load" "^7.5.5"
+ "@graphql-tools/merge" "^8.2.6"
+ "@graphql-tools/url-loader" "^7.9.7"
+ "@graphql-tools/utils" "^8.6.5"
cosmiconfig "7.0.1"
cosmiconfig-toml-loader "1.0.0"
- minimatch "3.0.4"
+ minimatch "4.2.1"
string-env-interpolation "1.0.1"
graphql-depth-limit@1.1.0:
@@ -6343,6 +6311,11 @@ graphql-depth-limit@1.1.0:
dependencies:
arrify "^1.0.1"
+graphql-executor@0.0.22:
+ version "0.0.22"
+ resolved "https://registry.yarnpkg.com/graphql-executor/-/graphql-executor-0.0.22.tgz#14bc466bb27ab38346998e0b375cba55685eed94"
+ integrity sha512-WbKSnSHFn6REKKH4T6UAwDM3mLUnYMQlQLNG0Fw+Lkb3ilCnL3m5lkJ7411LAI9sF7BvPbthovVZhsEUh9Xfag==
+
graphql-sse@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/graphql-sse/-/graphql-sse-1.0.4.tgz#051598b0e06c225327aac659f19fcc18bcaa0191"
@@ -6556,6 +6529,13 @@ 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"
@@ -6572,16 +6552,16 @@ 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@^10.6.0, highlight.js@~10.7.0:
- version "10.7.2"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
- integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
-
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@~10.7.0:
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
+ integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
+
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -7244,7 +7224,7 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
-isomorphic-ws@4.0.1:
+isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
@@ -7743,7 +7723,7 @@ jquery.caret@^0.3.1:
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
-js-beautify@^1.6.12, js-beautify@^1.8.8:
+js-beautify@^1.6.12:
version "1.11.0"
resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.11.0.tgz#afb873dc47d58986360093dcb69951e8bcd5ded2"
integrity sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==
@@ -7754,10 +7734,10 @@ js-beautify@^1.6.12, js-beautify@^1.8.8:
mkdirp "~1.0.3"
nopt "^4.0.3"
-js-cookie@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
- integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
+js-cookie@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
+ integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
@@ -7960,10 +7940,10 @@ keyv@^3.0.0:
dependencies:
json-buffer "3.0.0"
-khroma@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/khroma/-/khroma-1.4.1.tgz#ad6a5b6a972befc5112ce5129887a1a83af2c003"
- integrity sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==
+khroma@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b"
+ integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
@@ -8261,7 +8241,7 @@ lodash.values@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
-lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
+lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -8573,25 +8553,25 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-mermaid@^8.13.10:
- version "8.13.10"
- resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-8.13.10.tgz#b9d733b178bbf7416b9b46e39d566c7c28b75688"
- integrity sha512-2ANep359uML87+wiYaWSu83eg9Qc0xCLnNJdCh100m4v0orS3fp8SScsZLcDSElRGHi+1zuVJsEEVEWH05+COQ==
+mermaid@^9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.1.tgz#5d3d330ca4adf7f3c8ca51095f8bb2f0fb1a93bb"
+ integrity sha512-2RVD+WkzZ4VDyO9gQvQAuQ/ux2gLigJtKDTlbwjYqOR/NwsVzTSfGm/kx648/qWJsg6Sv04tE9BWCO8s6a+pFA==
dependencies:
- "@braintree/sanitize-url" "^3.1.0"
+ "@braintree/sanitize-url" "^6.0.0"
d3 "^7.0.0"
dagre "^0.8.5"
dagre-d3 "^0.6.4"
- dompurify "2.3.4"
+ dompurify "2.3.6"
graphlib "^2.1.8"
- khroma "^1.4.1"
+ khroma "^2.0.0"
moment-mini "^2.24.0"
stylis "^4.0.10"
-meros@1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/meros/-/meros-1.1.4.tgz#c17994d3133db8b23807f62bec7f0cb276cfd948"
- integrity sha512-E9ZXfK9iQfG9s73ars9qvvvbSIkJZF5yOo9j4tcwM5tN8mUKfj/EKN5PzOr3ZH0y5wL7dLAHw3RVEfpQV9Q7VQ==
+meros@^1.1.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/meros/-/meros-1.2.0.tgz#096cdede2eb0b1610b219b1031b935260de1ad08"
+ integrity sha512-3QRZIS707pZQnijHdhbttXRWwrHhZJ/gzolneoxKVz9N/xmsvY/7Ls8lpnI9gxbgxjcHsAVEW3mgwiZCo6kkJQ==
methods@~1.1.2:
version "1.1.2"
@@ -8882,7 +8862,14 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.4:
+minimatch@4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4"
+ integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.4, 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==
@@ -8995,7 +8982,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
-mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
+mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
@@ -9123,15 +9110,20 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+node-domexception@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
+
node-ensure@^0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=
-node-fetch@^2.6.1, node-fetch@^2.6.5:
- version "2.6.6"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
- integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
+node-fetch@^2.6.1, node-fetch@^2.6.7:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
dependencies:
whatwg-url "^5.0.0"
@@ -9283,10 +9275,10 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
dependencies:
path-key "^3.0.0"
-nth-check@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125"
- integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==
+nth-check@^2.0.0, nth-check@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
+ integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
dependencies:
boolbase "^1.0.0"
@@ -9807,15 +9799,6 @@ portal-vue@^2.1.6, portal-vue@^2.1.7:
resolved "https://registry.yarnpkg.com/portal-vue/-/portal-vue-2.1.7.tgz#ea08069b25b640ca08a5b86f67c612f15f4e4ad4"
integrity sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==
-portfinder@^1.0.28:
- version "1.0.28"
- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
- integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==
- dependencies:
- async "^2.6.2"
- debug "^3.1.1"
- mkdirp "^0.5.5"
-
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@@ -10127,10 +10110,10 @@ prosemirror-tables@^1.1.1:
prosemirror-transform "^1.2.1"
prosemirror-view "^1.13.3"
-prosemirror-test-builder@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/prosemirror-test-builder/-/prosemirror-test-builder-1.0.5.tgz#d05e8f77484aef192d705c46fe648d0319d69000"
- integrity sha512-mymXkqJlhcB4JtQpM5buHvfn7SawJ2vRwYzuIUMkky00ILBOPUnwUCAbjA7L8o4hsaQeyHljRCNdpjXKK8KsOw==
+prosemirror-test-builder@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/prosemirror-test-builder/-/prosemirror-test-builder-1.0.6.tgz#5b3df044beee6050791e96abc80fb48e66be30ea"
+ integrity sha512-71pbSJqaqUJfbLwGett1yhMRQ/TV7QcOPfHvj6X9U/u/nQeZQNnsHsaVBpUeLgICADtusQSVPvyeGC0LGknwgA==
dependencies:
prosemirror-model "^1.0.0"
prosemirror-schema-basic "^1.0.0"
@@ -10143,10 +10126,10 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor
dependencies:
prosemirror-model "^1.0.0"
-prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.23.10, prosemirror-view@^1.23.6:
- version "1.23.10"
- resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.23.10.tgz#a3fb6a7c780c8cd84488fdd451c23becab9dbefb"
- integrity sha512-/p8Orb1VeJEbf7Z/BltU9GMWADZRqKlna6TlQGK1snJ6fTdLRC4f4yF2MgNK4OMQjmAwJISUtEp5+Vu5CSbR1w==
+prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.23.13, prosemirror-view@^1.23.6:
+ version "1.23.13"
+ resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.23.13.tgz#d423c601d33ad3adfd1ab73fb72270acc9de9adf"
+ integrity sha512-X/NcwZv8pgcEWfs3n++Wz4nDgqDIeDvJ9kfCk6DCoC9XUlDekqJLFt9wCcCUBXedb8hs/dmd+JmcaLgbr67XZw==
dependencies:
prosemirror-model "^1.16.0"
prosemirror-state "^1.0.0"
@@ -10704,9 +10687,9 @@ reusify@^1.0.4:
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
rimraf@^2.5.4, rimraf@^2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ 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"
@@ -11652,7 +11635,7 @@ symbol-tree@^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==
-sync-fetch@0.3.1:
+sync-fetch@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/sync-fetch/-/sync-fetch-0.3.1.tgz#62aa82c4b4d43afd6906bfd7b5f92056458509f0"
integrity sha512-xj5qiCDap/03kpci5a+qc5wSJjc8ZSixgG2EUmH1B8Ea2sfWclQA7eH40hiHPCtkCn6MCk4Wb+dqcXdCy2PP3g==
@@ -11873,11 +11856,6 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
-toggle-selection@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
- integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
-
toidentifier@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
@@ -11973,6 +11951,11 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+tslib@^2.3.1:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -12100,10 +12083,10 @@ underscore@~1.8.3:
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
-undici@^4.9.3:
- version "4.10.2"
- resolved "https://registry.yarnpkg.com/undici/-/undici-4.10.2.tgz#27e360f2d4202ef98dfc1c8e13dcd329660a6d7c"
- integrity sha512-QoQH4PpV3dqJwr4h1HazggbB4f5CBknvYANjI9hxXCml+AAzLoh4HBkce0Jc0wW/pmVbrus8Gfeo8QounE+/9g==
+undici@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-5.0.0.tgz#3c1e08c7f0df90c485d5d8dbb0517e11e34f2090"
+ integrity sha512-VhUpiZ3No1DOPPQVQnsDZyfcbTTcHdcgWej1PdFnSvOeJmOVDgiOHkunJmBLfmjt4CqgPQddPVjSWW0dsTs5Yg==
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
@@ -12211,7 +12194,7 @@ unist-util-visit-parents@^4.0.0:
"@types/unist" "^2.0.0"
unist-util-is "^5.0.0"
-unist-util-visit-parents@^5.0.0:
+unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521"
integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==
@@ -12304,11 +12287,6 @@ url-parse-lax@^3.0.0:
dependencies:
prepend-http "^2.0.0"
-url-search-params-polyfill@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-5.1.0.tgz#f0405dcc2e921bf7f5fdf8c4e616f1e8088ef31b"
- integrity sha512-yjFY7uw2xRf9e8Mg4ZVkZwtp8dMCC4cbBkEIZiTDpuSY2WJ9+Quw0wRhxncv32qaMQwmBQT+P847rO8PrFhhDA==
-
url@0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
@@ -12398,11 +12376,6 @@ v8-to-istanbul@^5.0.1:
convert-source-map "^1.6.0"
source-map "^0.7.3"
-valid-url@1.0.9:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
- integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=
-
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -12411,7 +12384,7 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-value-or-promise@1.0.11:
+value-or-promise@1.0.11, value-or-promise@^1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140"
integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==
@@ -12547,17 +12520,18 @@ vue-apollo@^3.0.7:
serialize-javascript "^4.0.0"
throttle-debounce "^2.1.0"
-vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.4.1:
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.4.1.tgz#e4adcf7876a7379758d9056a72235af18a587f92"
- integrity sha512-AFvhdxpFvliYq1xt/biNBslTHE/zbEvSnr1qfHA/KxRIpErmEDrQZlQnvEexednRHmLfDNOMuDYwZL5xkLzIXQ==
+vue-eslint-parser@^8.0.1:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"
+ integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==
dependencies:
- debug "^4.1.1"
- eslint-scope "^5.0.0"
- eslint-visitor-keys "^1.1.0"
- espree "^6.2.1"
- esquery "^1.0.1"
- lodash "^4.17.15"
+ debug "^4.3.2"
+ eslint-scope "^7.0.0"
+ eslint-visitor-keys "^3.1.0"
+ espree "^9.0.0"
+ esquery "^1.4.0"
+ lodash "^4.17.21"
+ semver "^7.3.5"
vue-functional-data-merge@^3.1.0:
version "3.1.0"
@@ -12712,6 +12686,16 @@ web-namespaces@^2.0.0:
resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
+web-streams-polyfill@4.0.0-beta.1:
+ version "4.0.0-beta.1"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95"
+ integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==
+
+web-streams-polyfill@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965"
+ integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==
+
web-vitals@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511"
@@ -12776,10 +12760,10 @@ webpack-dev-middleware@^5.3.1:
range-parser "^1.2.1"
schema-utils "^4.0.0"
-webpack-dev-server@4.8.1:
- version "4.8.1"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.8.1.tgz#58f9d797710d6e25fa17d6afab8708f958c11a29"
- integrity sha512-dwld70gkgNJa33czmcj/PlKY/nOy/BimbrgZRaR9vDATBQAYgLzggR0nxDtPLJiLrMgZwbE6RRfJ5vnBBasTyg==
+webpack-dev-server@4.9.0:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz#737dbf44335bb8bde68f8f39127fc401c97a1557"
+ integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw==
dependencies:
"@types/bonjour" "^3.5.9"
"@types/connect-history-api-fallback" "^1.3.5"
@@ -12801,7 +12785,6 @@ webpack-dev-server@4.8.1:
ipaddr.js "^2.0.1"
open "^8.0.9"
p-retry "^4.5.0"
- portfinder "^1.0.28"
rimraf "^3.0.2"
schema-utils "^4.0.0"
selfsigned "^2.0.1"
@@ -12989,17 +12972,12 @@ write-file-atomic@^4.0.0:
signal-exit "^3.0.2"
typedarray-to-buffer "^4.0.0"
-ws@8.2.3:
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
- integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
-
"ws@^5.2.0 || ^6.0.0 || ^7.0.0", ws@^7.2.3, ws@^7.3.1:
version "7.5.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
-ws@^8.4.2:
+ws@^8.3.0, ws@^8.4.2:
version "8.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
@@ -13149,14 +13127,15 @@ yarn-check-webpack-plugin@^1.2.0:
dependencies:
chalk "^2.4.2"
-yarn-deduplicate@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-4.0.0.tgz#0fcd11a83c2629ee41bc38a97d78fbd810c5825f"
- integrity sha512-1sI617aM8WNplWA7O58peEq3gC14Ah/Ld55CF1aB2v4pTaxDpOgb+mTaWhIKzOCqJjwnaSqmYVrfgABUlc9bNA==
+yarn-deduplicate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-5.0.0.tgz#8977b9a4b1a2fd905568c3a23507b1021fa381eb"
+ integrity sha512-sYA5tqBSY3m+DtEcwfMYP1G2zWq1UtWSNg2goESqiu/JXBoBF/Qh+FuTJGGjsrisxL+5yOgq/ez1Rd+KSPwzvA==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
- commander "^9.0.0"
+ commander "^9.2.0"
semver "^7.3.2"
+ tslib "^2.3.1"
yn@3.1.1:
version "3.1.1"